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)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

あずにゃん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值