- input_dim:是要嵌入的词汇的大小
- output_dim:是嵌入向量的长度
- input_length:是输入(句子)的最大长度
如Explain with example: how embedding layers in keras works 所示,您可以将句子转换为整数列表(向量或张量)。带有 input_length 的向量示例(句子的最大长度为 6,以防您的句子较长,剩余的单词被修剪)
'This is a text' --> [0 0 1 2 3 4]
'This is a very long text, my friends' --> [1 2 3 5 6 4]
然后使用 keras 的嵌入层,您可以将这些向量转换为 output_dim 深度的嵌入向量。例如 output_dim = 3:
[0 0 1 2 3 4] -->
array([[ 0.00251105, 0.00724941, -0.01146401],
[ 0.00251105, 0.00724941, -0.01146401],
[ 0.03071865, 0.00953215, -0.01349484],
[ 0.02962008, 0.04860269, -0.04597988],
[-0.01875228, 0.03349927, -0.03210936],
[-0.02512982, 0.04811014, 0.03172458]], dtype=float32)
最后一个参数 input_dim 是映射到嵌入向量的词汇的大小。运行就可以看到了
model.layers[0].get_weights()
因为嵌入层通常是模型的第一层。如果是 10,嵌入层包含 10 个大小为 output_dim 的向量。请注意,第一个元素对应于输入向量中 0 的映射 (0 --> [0.00251105, 0.00724941, -0.01146401]),第二个是 1 等等。
[array([[ 0.00251105, 0.00724941, -0.01146401],
[ 0.03071865, 0.00953215, -0.01349484],
[ 0.02962008, 0.04860269, -0.04597988],
[-0.01875228, 0.03349927, -0.03210936],
[-0.02512982, 0.04811014, 0.03172458],
[-0.00569617, -0.02348857, -0.00098624],
[ 0.01327456, 0.02390958, 0.00754261],
[-0.04041355, 0.03457253, -0.02879228],
[-0.02695872, 0.02807242, 0.03338097],
[-0.02057508, 0.00174383, 0.00792078]], dtype=float32)]
增加 input_dim 允许你映射更大的词汇,但也增加了嵌入层的参数数量。参数个数为 input_dim x output_dim。
据我了解,这些向量是随机启动的,并使用优化器算法像任何其他层一样进行训练。但是,您可以使用不同的算法,例如 word2vec 或预训练的向量,例如 glove (https://nlp.stanford.edu/projects/glove/)。想法是每个单词将代表空间中的一个唯一位置(由它的向量描述),您可以在单词的语义(含义)上应用一些向量数学。例如。 W('cheesburger') - W('cheese') = W('hamburger') 或 W('prince') - W('man') + W('woman') = W('princess') 查看更多例如在https://www.oreilly.com/learning/capturing-semantic-meanings-using-deep-learning