什么是嵌入Keras?

89 keras

Keras文档不清楚这实际上是什么.据我所知,我们可以使用它将输入要素空间压缩为较小的一个.但是从神经设计的角度来看,这是怎么做到的?它是自动编码器,RBM吗?

Lor*_*rit 61

据我所知,嵌入层是一个简单的矩阵乘法,可将单词转换为相应的单词嵌入.

嵌入层的权重具有形状(vocabulary_size,embedding_dimension).对于每个训练样本,其输入是整数,表示某些单词.整数在词汇量大小的范围内.嵌入层将每个整数i变换为嵌入权重矩阵的第i行.

为了快速将其作为矩阵乘法,输入整数不会存储为整数列表,而是存储为单热矩阵.因此,输入形状是(nb_words,vocabulary_size),每行一个非零值.如果将此乘以嵌入权重,则可获得形状中的输出

(nb_words, vocab_size) x (vocab_size, embedding_dim) = (nb_words, embedding_dim)
Run Code Online (Sandbox Code Playgroud)

因此,通过简单的矩阵乘法,您可以将样本中的所有单词转换为相应的单词嵌入.

  • 嵌入层将优化其权重,以最大限度地减少损失.也许这意味着它将考虑语义相似性,也许它不会.你永远不会知道神经网络.如果您想确保嵌入遵循某个公式(例如w2v),请使用公式.如果您有足够的数据,则可能需要使用嵌入层并训练嵌入.试试看,看看你是否喜欢这个结果. (4认同)
  • 绝对是一种有效的方法(参见[半监督序列学习](https://papers.nips.cc/paper/5949-semi-supervised-sequence-learning.pdf)).您还可以使用自动编码器学习嵌入,然后将它们用作嵌入层的初始化,以降低神经网络的复杂性(我假设您在嵌入层之后执行其他操作). (3认同)
  • [here](http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/)是关于单词嵌入及其优点的好文章. (3认同)
  • 在我提出的情况下,每个训练输入是一组单词(可以是一个句子).每个单词表示为单热矢量并嵌入到密集矢量中.这种方法的缺点是,由于输入需要具有恒定的长度,因此所有句子都需要具有相同数量的单词.另一种选择是[段落向量](https://cs.stanford.edu/~quocle/paragraph_vector.pdf),它可以将句子,段落甚至文档嵌入到向量中. (3认同)
  • 我同意user36624(以下回答).它**不是一个简单的矩阵乘法. (2认同)

Poe*_*dit 16

Keras Embedding层不执行任何矩阵乘法,但它只是:

1.创建(vocabulary_size)x(embedding_dimension)维度的权重矩阵

2.索引此权重矩阵


查看源代码以了解类的功能总是很有用.在这种情况下,我们将看一下从名为Layer的基础层继承的class 嵌入.class

(1) - 创建(vocabulary_size)x(embedding_dimension)维度的权重矩阵:

这是在嵌入build功能中发生的:

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
Run Code Online (Sandbox Code Playgroud)

如果您查看基类Layer,您将看到add_weight上面的函数只是创建一个可训练权重矩阵(在这种情况下为(vocabulary_size)x(embedding_dimension)维度):

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
Run Code Online (Sandbox Code Playgroud)

(2) - 索引此权重矩阵

这是在嵌入call功能中发生的:

def call(self, inputs):
    if K.dtype(inputs) != 'int32':
        inputs = K.cast(inputs, 'int32')
    out = K.gather(self.embeddings, inputs)
    return out
Run Code Online (Sandbox Code Playgroud)

此函数返回Embedding图层的输出K.gather(self.embeddings, inputs).什么tf.keras.backend.gather究竟是指数权重矩阵self.embeddings(参见build根据上述功能),inputs这应该是正整数的列表.

例如,如果将文本/单词输入传递给Keras的one_hot函数,可以检索这些列表,该函数将文本编码为大小为n的单词索引列表(这不是一个热编码 - 请参阅此示例以获取更多信息:https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/).


因此,就是这样.没有矩阵乘法.

相反,Keras Embedding层仅有用,因为它确实避免了执行矩阵乘法,因此节省了一些计算资源.

否则,您可以使用Keras Dense图层(在编码输入数据之后)获得可训练权重矩阵((vocabulary_size)x(embedding_dimension)维度),然后简单地进行乘法以获得准确的输出与Embedding图层的输出相同.


And*_*aev 7

为了更好地理解任何函数,查看源代码是一个好习惯.这是嵌入 所以基本上它是一个可训练的查找表.