• 关键字: embedding作用
  • 问题描述:看了PaddlePaddle词向量相关的代码,大量使用了embedding_layer+fc_layer的结构,请问这里常用的paddle.layer.embedding()方法的具有有什么作用?在PaddlePaddle中是如何实现的?
  • 相关代码:
embed_first = fluid.layers.embedding(
        input=first_word,
        size=[dict_size,EMBED_SIZE],
        dtype='float32',
        is_sparse=is_sparse, #是否使用稀疏更新的标志。
        param_attr='shared_w' #该图层参数
    )
  • 问题讨论:
    问题描述中其实涉及了两个主要的问题,即paddlepaddle中embedding()方法的作用是什么?以及PaddlePaddle如何实现embedding方法?下面就这两个问题简单解答一下
  • 问题解答:
    关于 embedding 的作用:
  • 1.为了让计算机处理输入,首先需要对数据的规范化表示方法。one-hot,BOW,n-gram 等等,都是人类设计出的不同表示输入数据方法。
  • 2.embedding 是一种distributed representation,它的出现是相对于 one-hot 的表示法。
  • 在 one-hot 表示方法中,一个编码单元表示一个个体,除了某一个维度上的值是 1,其余维度都是 0。
  • distributed representation 用几个编码单元而不是一个编码单元来表示一个个体,是一类表示学习方法,用一个更低维度的实向量表示“一个概念”(可以理解为机器学习任务输入观察的输入特征),向量的每个维度在实数域 PaddleOCR Android demo编译报错 paddle embedding_词向量
  • 3.embedding 在自然语言处理任务中获得了很大的成功,所以也常被翻译为“词向量”。但是,作为一类表示学方法,我们可以为所有离散的输入学习对应的 embedding 表达,并不不局限于自然语言处理任务中的词语。
  • 4.简单而言,引入 embedding 的动机有:
  • 将高度稀疏的离散输入嵌入到一个新的实向量空间,对抗维数灾难,使用更少的维度,编码更丰富的信息。
  • 我们观测的不同离散变量都可以嵌入同一个实向量空间,得到统一的表达形式。定义于实向量空间上的各种数学运算,可以作为描述语义的数学工具。

embeding层可以理解为从一个矩阵中选择一行,一行对应着一个离散的新的特征表达,是一种取词操作

关于PaddlePaddle中embedding方法是如何实现的?可以参考 https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/trainer_config_helpers/layers.py#L938,PaddlePaddle的embedding是用table_projection实现的,关键代码片段为:

with mixed_layer(
        name=name,
        size=size,
        act=LinearActivation(),
        bias_attr=False,
        layer_attr=layer_attr) as mix:
    mix += table_projection(input=input, size=size, param_attr=param_attr)
return mix

table_projection的计算公式是out.row[i] += table.row[ids[i]],在上述代码连接中也可以找到

  • 问题拓展:
    embedding,即词向量,这个概念并不是PaddlePaddle独有的,在自然语言处理方面,embedding操作也是非常常见的,其主要目的将词转为相应的向量,这样一个词就可以映射到高维空间,一个常见的做法就是计算词与词之间的距离,因为词被表示成了向量,计算距离就是简单的计算两个向量间的距离,通过这种向量计算获得的值通常都可以看作是两个词之间的相似度。