Keras“嵌入”层如何工作?

机器算法验证 文本挖掘 词嵌入 喀拉斯
2022-02-07 12:10:43

需要了解 Keras 库中“嵌入”层的工作原理。我在 Python 中执行以下代码

import numpy as np
from keras.models import Sequential
from keras.layers import Embedding

model = Sequential()
model.add(Embedding(5, 2, input_length=5))

input_array = np.random.randint(5, size=(1, 5))

model.compile('rmsprop', 'mse')
output_array = model.predict(input_array)

给出以下输出

input_array = [[4 1 3 3 3]]
output_array = 
[[[ 0.03126476  0.00527241]
  [-0.02369716 -0.02856163]
  [ 0.0055749   0.01492429]
  [ 0.0055749   0.01492429]
  [ 0.0055749   0.01492429]]]

我知道 input_array 中的每个值都映射到 output_array 中的 2 个元素向量,因此 1 X 4 向量给出 1 X 4 X 2 向量。但是如何计算映射值?

3个回答

事实上,输出向量不是使用任何数学运算从输入中计算出来的。相反,每个输入整数都用作索引来访问包含所有可能向量的表。这就是为什么您需要将词汇表的大小指定为第一个参数的原因(以便可以初始化表)。

该层最常见的应用是文本处理。让我们看一个简单的例子。我们的训练集仅包含两个短语:

希望很快能见到你

很高兴再次见到你

因此,我们可以通过为每个单词分配一个唯一的整数来对这些短语进行编码(例如,按照在我们的训练数据集中出现的顺序)。那么我们的短语可以改写为:

[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。

我也有同样的问题,在阅读了几篇文章和资料后,我想我明白了嵌入层的作用是什么。

我认为这篇文章也有助于理解,但是,我真的觉得丹尼尔的答案很容易消化。但我也主要通过理解嵌入词得到了它背后的想法。

我认为说嵌入层将单热编码输入减少到更少的输入是不准确的。毕竟 one-hot 向量是一维数据,在我们的例子中它确实变成了二维。不如说

嵌入层提出了另一个维度的输入关系

无论是二维还是更高。

我还发现词嵌入与主成分分析之间有一个非常有趣的相似性。尽管名称可能看起来很复杂,但概念很简单。PCA 所做的就是根据一些通用规则(所谓的主成分)定义一组数据。所以这就像有一个数据,你想描述它但只使用 2 个组件。从这个意义上说,这与词嵌入非常相似。他们都在不同的环境中做同样的工作。您可以在此处了解更多信息我希望也许理解 PCA 有助于通过类比理解嵌入层。

总结一下,帖子的原始问题“它如何计算价值? ”的答案是:

  • 基本上,我们的神经网络捕获输入(我们的句子)的底层结构,并通过优化将我们词汇表中单词之间的关系放入更高的维度(比如说 2)。
  • 更深入的理解会说每个单词与另一个单词出现的频率来自我们的词汇影响(在一个非常幼稚的方法中,我们可以手动计算它)
  • 上述频率可能是 NN 可以捕获的许多基础结构之一
  • 您可以在youtube 链接上找到解释词嵌入的直觉

如果您对“机制”更感兴趣,则嵌入层基本上是一个矩阵,可以将其视为离散且稀疏的 1-hot 向量到连续且密集的潜在空间的转换。只是为了节省计算,您实际上并不进行矩阵乘法,因为在 1-hot-vector 的情况下它是多余的。

所以,假设你有一个 5000 的词汇量,作为你的输入维度——并且你想找到它的 256 维输出表示——你将有一个 (5000,256) 形状矩阵,你“应该”乘以你的 1-热向量表示以获得潜在向量。只有在实践中,而不是乘以你只需要索引......

资料来源:吴恩达

(从理论上帮助我思考的一种方法是仅作为密集层而没有偏差或激活......)

这个矩阵的权重是通过训练来学习的——你可以把它训练成 Word2Vec、GloVe 等——或者你正在处理的特定任务。或者您可以加载预先训练的权重(例如 GloVe)并继续针对您的特定任务进行训练。