Các Keras
Embedding
lớp không thực hiện bất kỳ phép nhân ma trận nhưng chỉ có nó:
1. tạo một ma trận trọng số của ( kích thước từ vựng) x ( kích thước_hấp_phí)
2. lập chỉ mục cho ma trận trọng số này
Luôn hữu ích khi xem mã nguồn để hiểu những gì một lớp làm. Trong trường hợp này, chúng ta sẽ xem xét phần class
Nhúng kế thừa từ lớp cơ sở class
được gọi là Lớp .
(1) - Tạo ma trận trọng số của các thứ nguyên (từ vựng_size) x (embedding_dimension) :
Điều này đang xảy ra ở build
chức năng Nhúng :
def build(self, input_shape):
self.embeddings = self.add_weight(
shape=(self.input_dim, self.output_dim),
initializer=self.embeddings_initializer,
name='embeddings',
regularizer=self.embeddings_regularizer,
constraint=self.embeddings_constraint,
dtype=self.dtype)
self.built = True
Nếu bạn nhìn vào Layer lớp cơ sở, bạn sẽ thấy rằng hàm add_weight
trên chỉ đơn giản tạo ra một ma trận các trọng số có thể đào tạo (trong trường hợp này là (từ vựng_ kích thước) x (nhúng_dimension) kích thước):
def add_weight(self,
name,
shape,
dtype=None,
initializer=None,
regularizer=None,
trainable=True,
constraint=None):
"""Adds a weight variable to the layer.
# Arguments
name: String, the name for the weight variable.
shape: The shape tuple of the weight.
dtype: The dtype of the weight.
initializer: An Initializer instance (callable).
regularizer: An optional Regularizer instance.
trainable: A boolean, whether the weight should
be trained via backprop or not (assuming
that the layer itself is also trainable).
constraint: An optional Constraint instance.
# Returns
The created weight variable.
"""
initializer = initializers.get(initializer)
if dtype is None:
dtype = K.floatx()
weight = K.variable(initializer(shape),
dtype=dtype,
name=name,
constraint=constraint)
if regularizer is not None:
with K.name_scope('weight_regularizer'):
self.add_loss(regularizer(weight))
if trainable:
self._trainable_weights.append(weight)
else:
self._non_trainable_weights.append(weight)
return weight
(2) - Lập chỉ mục ma trận trọng số này
Điều này đang xảy ra ở call
chức năng Nhúng :
def call(self, inputs):
if K.dtype(inputs) != 'int32':
inputs = K.cast(inputs, 'int32')
out = K.gather(self.embeddings, inputs)
return out
Hàm này trả về kết quả đầu ra của Embedding
lớp K.gather(self.embeddings, inputs)
. Những gì tf.keras.backend.gather làm chính xác là lập chỉ mục ma trận trọng số self.embeddings
(xem build
hàm ở trên) theo inputs
đó sẽ là danh sách các số nguyên dương.
Các danh sách này có thể được truy xuất, ví dụ: nếu bạn chuyển đầu vào văn bản / từ của mình vào hàm one_hot của Keras mã hóa văn bản thành danh sách chỉ mục từ có kích thước n (đây KHÔNG phải là một mã hóa nóng - hãy xem thêm ví dụ này để biết thêm thông tin: https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/ ).
Do đó, chỉ có vậy thôi. Không có phép nhân ma trận.
Ngược lại, các Keras
Embedding
lớp chỉ hữu ích bởi vì chính xác nó tránh thực hiện một phép nhân ma trận và do đó nó economizes trên một số tài nguyên tính toán.
Nếu không, bạn chỉ có thể sử dụng lớp Keras
Dense (sau khi bạn đã mã hóa dữ liệu đầu vào của mình) để nhận ma trận các trọng số có thể huấn luyện (của (từ vựng_size) x (embedding_dimension) ) và sau đó chỉ cần thực hiện phép nhân để nhận được kết quả chính xác tương tự với đầu ra của Embedding
lớp.