事实上,输出向量不是使用任何数学运算从输入中计算出来的。相反,每个输入整数都用作索引来访问包含所有可能向量的表。这就是为什么您需要将词汇表的大小指定为第一个参数的原因(以便可以初始化表)。
该层最常见的应用是文本处理。让我们看一个简单的例子。我们的训练集仅包含两个短语:
希望很快能见到你
很高兴再次见到你
因此,我们可以通过为每个单词分配一个唯一的整数来对这些短语进行编码(例如,按照在我们的训练数据集中出现的顺序)。那么我们的短语可以改写为:
[0, 1, 2, 3, 4]
[5, 1, 2, 3, 6]
现在假设我们想要训练一个第一层是嵌入层的网络。在这种情况下,我们应该如下初始化它:
Embedding(7, 2, input_length=5)
第一个参数 (7) 是训练集中不同单词的数量。第二个参数 (2) 表示嵌入向量的大小。input_length参数当然决定了每个输入序列的大小。
一旦网络经过训练,我们就可以得到嵌入层的权重,在这种情况下,它的大小为 (7, 2),可以被认为是用于将整数映射到嵌入向量的表:
+------------+------------+
| index | Embedding |
+------------+------------+
| 0 | [1.2, 3.1] |
| 1 | [0.1, 4.2] |
| 2 | [1.0, 3.1] |
| 3 | [0.3, 2.1] |
| 4 | [2.2, 1.4] |
| 5 | [0.7, 1.7] |
| 6 | [4.1, 2.0] |
+------------+------------+
所以根据这些嵌入,我们的第二个训练短语将表示为:
[[0.7, 1.7], [0.1, 4.2], [1.0, 3.1], [0.3, 2.1], [4.1, 2.0]]
一开始可能看起来有悖常理,但底层的自动微分引擎(例如,Tensorflow 或 Theano)设法优化与每个输入整数相关的这些向量,就像模型的任何其他参数一样。
对于如何将此表查找实现为可由自动微分引擎处理的数学运算的直觉,将示例中的嵌入表视为(7, 2)矩阵。然后,对于给定的单词,您可以根据其索引创建一个 one-hot 向量并将其乘以嵌入矩阵,从而有效地复制查找。例如,对于单词“ soon ”,索引是 4,one-hot 向量是[0, 0, 0, 0, 1, 0, 0]
。如果将此(1, 7)矩阵乘以(7, 2)嵌入矩阵,您将得到所需的二维嵌入,在本例中为[2.2, 1.4]
。
使用不同领域的其他方法/人学习的嵌入也很有趣(参见https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html)在 [1] 中完成。
[1] López-Sánchez, D., Herrero, JR, Arrieta, AG 和 Corchado, JM 混合度量学习和基于案例的推理以进行适应性点击诱饵检测。应用智能,1-16。