Tensorflow 嵌入层内部的网络结构是什么?

问题描述

Tensoflow 嵌入层(https://www.tensorflow.org/api_docs/python/tf/keras/layers/Embedding)易于使用, 并且有大量的文章在谈论 “如何使用”嵌入(https://machinelearningmastery.com/what-are-word-embeddings/https://www.sciencedirect.com/topics/computer-science/embedding-method) . 但是,我想知道 Tensorflow 或 Pytorch 中非常“嵌入层”的实现。 它是一个 word2vec 吗? 是Cbow吗? 是特殊的密集层吗?

解决方法

结构方面,Dense 层和 Embedding 层都是隐藏层,其中包含神经元。不同之处在于它们对给定输入和权重矩阵的操作方式。

Dense 层对给定的权重矩阵执行运算,方法是将输入相乘,为其添加偏差并对其应用激活函数。而 Embedding 层使用权重矩阵作为查找字典。

嵌入层最好理解为将整数索引(代表特定单词)映射到密集向量的字典。它接受整数作为输入,在内部字典中查找这些整数,并返回相关的向量。它实际上是一个字典查找。

from keras.layers import Embedding

embedding_layer = Embedding(1000,64)

这里 1000 表示字典中的单词数,64 表示这些单词的维度。直观地说,嵌入层就像任何其他层一样,会尝试为任何单词找到 64 维 [ n1,n2,...,n64] 的向量(实数)。该向量将表示该特定单词的语义。它将在使用反向传播进行训练时学习这个向量,就像任何其他层一样。

当你实例化一个嵌入层时,它的权重(它的内部标记向量字典)最初是随机的,就像任何其他层一样。在训练期间,这些词向量通过反向传播逐渐调整,将空间构造成下游模型可以利用的东西。一旦经过充分训练,嵌入空间将显示出很多结构——一种专门针对您训练模型所针对的特定问题的结构。

-- Deep Learning with Python by F. Chollet


编辑 - 如何使用“反向传播”来训练 Embedding Layer 的查找矩阵?

Embedding 层类似于没有任何激活函数的线性层。理论上,Embedding 层也执行矩阵乘法,但不会通过使用任何类型的激活函数为其添加任何非线性。因此,Embedding 层中的反向传播类似于任何线性层。但实际上,我们不会在嵌入层中进行任何矩阵乘法,因为输入通常是单热编码的,而权重矩阵与单热编码向量的乘法就像查找一样简单。