欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Embedding词嵌入层的原理

程序员文章站 2022-06-13 15:51:53
...

Embedding词嵌入层的原理日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)


Embedding
    keras.layers.Embedding(input_dim, output_dim, embeddings_initializer='uniform', 
                            embeddings_regularizer=None, activity_regularizer=None, 
                            embeddings_constraint=None, mask_zero=False, input_length=None)
        1.将正整数(索引值)转换为固定尺寸的稠密向量。 例如: [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]
          该层只能用作模型中的第一层。
        2.Embedding层输入是一维[单个字符/单个单词],那么输出为二维[单个字符/单个单词, embedding_dim];
          Embedding层输入是二维[batch_size, 单个字符/单个单词],那么输出为三维[batch_size, 单个字符/单个单词, embedding_dim]。

    1.例子
        model = Sequential()
        model.add(Embedding(1000, 64, input_length=10))
        # 模型将输入一个大小为 (batch, input_length) 的整数矩阵。
        # 输入中最大的整数(即词索引)不应该大于 999 (词汇表大小)
        # 现在 model.output_shape == (None, 10, 64),其中 None 是 batch 的维度。
        # 输入input_array的shape为(batch_size, sequence_length) 的 2D 张量
        input_array = np.random.randint(1000, size=(32, 10))
        model.compile('rmsprop', 'mse')
        #输出output_array的shape为(batch_size, sequence_length, output_dim) 的 3D 张量
        output_array = model.predict(input_array)
        assert output_array.shape == (32, 10, 64)
    2.输入尺寸
        尺寸为 (batch_size, sequence_length) 的 2D 张量。
    3.输出尺寸
        尺寸为 (batch_size, sequence_length, output_dim) 的 3D 张量。
    4.参数
        input_dim: int > 0。词汇表大小, 即,最大整数 index + 1。
        output_dim: int >= 0。词向量的维度。
        embeddings_initializer: embeddings 矩阵的初始化方法 (详见 initializers)。
        embeddings_regularizer: embeddings matrix 的正则化方法 (详见 regularizer)。
        embeddings_constraint: embeddings matrix 的约束函数 (详见 constraints)。
        mask_zero: 
            是否把 0 看作为一个应该被遮蔽的特殊的 "padding" 值。这对于可变长的 循环神经网络层 十分有用。 
            如果设定为 True,那么接下来的所有层都必须支持 masking,否则就会抛出异常。 
            如果 mask_zero 为 True,作为结果,索引 0 就不能被用于词汇表中(input_dim 应该与 vocabulary + 1 大小相同)。
        input_length: 
                输入序列的长度,当它是固定的时。 如果你需要连接 Flatten 和 Dense 层,
                则这个参数是必须的 (没有它,dense 层的输出尺寸就无法计算)。
import torch.nn as nn
import torch

embedding = nn.Embedding(10, 3)
x = torch.tensor([[0,1],[8,9]])
result = embedding(x)
# print(result)
# tensor([[[ 0.8168, -0.9338, -0.3293],
#          [ 0.8791,  0.4560,  1.4109]],
#         [[ 0.3612,  0.9988, -0.5982],
#          [ 0.8584, -0.5055,  1.5467]]], grad_fn=<EmbeddingBackward>)

"""
设置padding_idx=某个单词对应的索引值
    传入Embedding的索引值某个单词对应的索引值在通过Embedding层之后,该索引值对应的输出权重值全为0.0000
"""
embedding = nn.Embedding(10, 3, padding_idx=5)
x = torch.tensor([[0,1],[5,9]])
result = embedding(x)
print(result)
# tensor([[[ 1.1561,  0.2048, -0.1670],
#          [-0.4186, -0.1274, -0.9189]],
#         [[ 0.0000,  0.0000,  0.0000],
#          [-1.3729, -0.5038, -0.5846]]], grad_fn=<EmbeddingBackward>)

"""
报错:RuntimeError: index out of range: Tried to access index 10 out of table with 9 rows.
报错意思可以翻译为:RuntimeError: index out of range: Tried to access index vocab词表大小 out of table with 单词索引值 rows.
分析:Embedding(词表大小, 词嵌入维度):
        1.词表大小代表所有不重复单词数的总数大小,词嵌入维度代表一个单词对应的词嵌入维度的向量。
          Embedding底层中会构建一个“词表大小*词嵌入维度”的二维权重矩阵,行数即为词表大小,列数即为词嵌入维度。
          每个不重复的词的索引值对应二维权重矩阵中的一行,那么一个单词通过Embedding层输出后为该单词的索引对应那行的词嵌入维度向量,
          也就是说把该单词的索引值对应的二维权重矩阵中的那一行的词嵌入维度向量取出来,作为该单词对应的权重值向量信息。
        2.<start>和<end>同样一开始也是要放到词表WordToIndex和IndexToWord的两个字典中,<start>对应索引值0,<end>对应索引值1。
        3.Embedding层要求传入的单词索引值必须在“0到词表大小减1”的这个范围之间,传入到Embedding层中的单词索引值大于或等于词表大小值的时候,
          就会报错表示单词索引值超出了词表大小范围。
"""
embedding = nn.Embedding(10, 3)
x = torch.tensor([[0,1],[5,10]])
result = embedding(x)
print(result)