如何正确使用 Keras 的嵌入层?

数据挖掘 深度学习 张量流 喀拉斯 词嵌入
2021-10-14 15:36:53

我有点困惑在 Keras 中正确使用嵌入层以实现 seq2seq 目的(我想在 Keras 中重建TensorFlow se2seq 机器翻译教程)。我的问题如下:

我知道嵌入层将句子中的单词值转换为固定维度的长表示。但我观察到嵌入层的两种不同用法:一方面(如Keras 博客上的本教程)通过参数利用外部预训练的 word2vec 向量weights

from keras.layers import Embedding

embedding_layer = Embedding(len(word_index) + 1,
  EMBEDDING_DIM,
  weights=[embedding_matrix],
  input_length=MAX_SEQUENCE_LENGTH,
  trainable=False)`

而在其他情况下,没有这样的外部输出,但用户只需留给嵌入层来决定表示向量。我不明白这些方法之间关于预期结果的真正区别是什么?也许内部解决方案不是语义表示?将嵌入层应用于行已经具有固定长度的外部矩阵有什么意义?

trainable此外,嵌入层参数的目的/作用是什么?我是否正确猜测此设置为 True 让嵌入层微调导入的 word2vec 权重以考虑实际训练示例?

此外,如何指示嵌入层正确编码“元字符”?mask_zero参数设置为 True 它可以包含填充零,但是 UNK(未知)、EOS(句末)呢?(顺便说一句,我不明白在基于句子的输入中显式签署句末的意义是什么......)

最后:模型如何预测训练集中未表示的单词的翻译?它是否试图用词汇表中“最接近”的词来近似它?

1个回答

你提出了一些非常好的观点。让我们来看看所有这些:

词嵌入是一个词的数学表示。 这是必需的,因为我们不能将文本作为纯输入。

为了得到这些词嵌入,有不同的方法、方法和设置来计算它们。cbow、skip-gram 等等。

那里有不同的预训练词嵌入,例如

这只是其中最知名的部分的摘录。如您所见,他们使用了不同的数据集——因此分别使用了不同的词表和词嵌入。

我不明白这些方法之间关于预期结果的真正区别是什么?也许内部解决方案不是语义表示?将嵌入层应用于行已经具有固定长度的外部矩阵有什么意义?

Keras 是一个很棒的工具箱,嵌入层是一个很好的可能性,可以快速启动和运行。将文本转换为 one-hot/count 矩阵,将其用作词嵌入层的输入,然后您就设置好了。

另一方面,如果您使用预训练的词向量,那么您将每个词转换为向量并将其用作神经网络的输入。当涉及到特征工程时,这种方法会给你更多的灵活性。

如上所述,预训练的词向量大多是通用文本数据集。您可能会遇到一些特殊类型的数据(例如推文),在这些数据中人们的写作或行为会有所不同。因此,您可能会考虑在自己的数据集上训练自己的嵌入 - 归根结底,这取决于您的任务/问题以及您正在调整的指标。

此外,嵌入层的可训练参数的目的/效果是什么?

正如您所说的正确,它是使用您使用的数据集重新训练嵌入的权重。

我无法理解在基于句子的输入中显式签署句尾的意义何在

NLP 中最重要的事情之一是特征工程。这就像你坐在学校学习一门语言一样,需要考虑什么,词汇,语法和规则。使您作为人类更容易理解语言的事物。这里也同样适用。您可以将其视为特征工程的一部分,所有这些都可以概括为更大的图景。

最后:模型如何预测训练集中未表示的单词的翻译?

要么将找不到的单词转换为<UNK>表示其组的标记(未知单词)。但是,它需要<UNK>在经过训练的词嵌入中包含令牌。或者您可以使用 fasttext 二进制文件,它可以动态计算未知单词的单词向量。