-
关键字:
预加载
embedding
-
问题描述:现在需要将paddlepaddle框架里面的embedding层替换成我在网络上找到的word2vec字典,然后用这个字典来embedding, 这个embedding层怎么外接?
-
问题分析:
embedding层主要的作用是词嵌套,即将词转换为对应的向量,在PaddlePaddle中词嵌套的做法是类似的,简单而言,对于任意语料数据,在PaddlePaddle中都可以通过类似的操作将其embedding,这里可以参考词向量的文档 http://www.paddlepaddle.org/documentation/docs/zh/1.0/beginners_guide/basics/word2vec/index.html
其代码如下:
embed_first = fluid.layers.embedding(
input=first_word,
size=[dict_size,EMBED_SIZE],
dtype='float32',
is_sparse=is_sparse, #是否使用稀疏更新的标志。
param_attr='shared_w' #该图层参数
)
.
.
.
# 此函数沿着提到的轴连接输入并将其作为输出返回,即沿axis方向连接
# 将输入的词连接成一层
concat_embed = fluid.layers.concat(
input=[embed_first,
embed_second,
embed_third,
embed_fourth],axis=1)
问题中描述了word2vec字典,但没有指明是已经做完词嵌套的字典还是普通的字典,如果是普通的字典,处理方式就类似上面的代码,该代码使用N-gram做词嵌套,如果是已经做了词嵌套,那么问的真正的问题是怎么加载已经使用word2vec训练好的词向量模型,即怎么加载预训练好的embedding层,加载预训练的embedding层的代码为:
# 通过is_static=True设置embedding层的param_attr为固定
emb_para = paddle.attr.Param(name='emb', initial_std=0., is_static=True)
paddle.layer.embedding(size=word_dim, input=x, param_attr=emb_para)
# 创建parameters后将embedding层参数赋值为预训练的词向量
parameters = paddle.parameters.create(crf_cost)
parameters.set('emb', load_parameter(conll05.get_embedding(), 44068, 32))
预加载embedding的代码可以参考 语义角色标注的代码 https://github.com/PaddlePaddle/book/blob/develop/07.label_semantic_roles/train.py
-
问题拓展:
词嵌套技术其实是自然语言处理的基础,因为要进行自然语言处理,第一件事就是怎么让计算机明白我们的语言,这就需要使用词嵌套,词嵌套的方式有很多,但最本质的理论其实就是统计概率,简单而言,当前主流观点认为词的含义可以通过其周围的词来描述,无论是N-gram还是word2vec都是这个思想,背后就是统计学,一个词周围如果经常出现某些词,就可以通过这些词来描述这个词,通过这种方法就解决了使用向量表示词后,已经可以保留词中的内在信息。 -
问题研究:
PaddlePaddle做词嵌套训练的方式是类似的,都是通过固定的几个方法接受相应的传入数据,所以使用其他语料数据进行训练其实没有什么特别要操作的,需要的注意就是喂养语料数据相应的格式。