导语
PaddlePaddle提供了丰富的运算单元,帮助大家以模块化的方式构建起千变万化的深度学习模型来解决不同的应用问题。这里,我们针对常见的机器学习任务,提供了不同的神经网络模型供大家学习和使用。本周推文目录如下:
周三:【词向量】Hsigmoid加速词向量训练
周四:【词向量】 噪声对比估计加速词向量训练
周五:【RNN】使用RNN语言模型生成文本
词向量用一个实向量表示词语,向量的每个维都表示文本的某种潜在语法或语义特征,是深度学习应用于自然语言处理领域最成功的概念和成果之一。广义的,词向量也可以应用于普通离散特征。词向量的学习通常都是一个无监督的学习过程,因此,可以充分利用海量的无标记数据以捕获特征之间的关系,也可以有效地解决特征稀疏、标签数据缺失、数据噪声等问题。然而,在常见词向量学习方法中,模型最后一层往往会遇到一个超大规模的分类问题,是计算性能的瓶颈。
在词向量任务中,我们向大家展示如何使用Hierarchical-Sigmoid 和噪声对比估计(Noise Contrastive Estimation,NCE)来加速词向量的学习。
02
语言模型是许多自然语言处理任务的基础,也是获得词向量表示的一种有效方法。神经概率语言模型(Neural Probabilistic Language Model, NPLM)刻画了词语序列 ω1,...,ωT 属于某个固定语言的概率 P(ωT1) :
给定词语序列的向量表示 h ,称之为上下文(context),模型预测下一个目标词语 ω 的概率。
在n-gram 语言模型中,上下文取固定的 n−1 个词,RNN 语言模型可以处理任意长度的上下文。
给定上下文 h,NPLM 学习一个分值函数(scoring function)sθ(ω,h),s 刻画了上下文 h 向量和所有可能的下一个词的向量表示 ω′ 之间的相似度,再通过在全词表空间对打分函数 s 的取值进行归一化(除以归一化因子 Z),得到目标词 ω 的概率分布,其中:θ 是可学习参数,这一过程用式(2)表示,也就是 Softmax 函数的计算过程。
上一篇介绍了使用Hsigmoid加速词向量训练 ,这里我们介绍另一种基于采样的提高语言模型训练速度的方法:使用噪声对比估计(Noise-contrastive estimation, NCE)[1]
|2. 什么是噪声对比估计
噪声对比估计是一种基于采样思想的概率密度估计准则,用于估计/拟合:概率函数由非归一化的分值函数和归一化因子两部分构成,这样一类特殊的概率函数[1] 。噪声对比估计通过构造下面这样一个辅助问题避免在全词典空间计算归一化因子 Z ,从而降低计算代价:
给定上下文 h 和任意已知的噪声分布 Pn ,学习一个二类分类器来拟合:目标 ω 来自真实分布 Pθ (D=1) 还是噪声分布 Pn(D=0)的概率。假设来自噪声分布的负类样本的数量 k 倍于目标样本,于是有:
使用NCE准确训练时,最后一层的计算代价只与负采样数目线性相关,当负采样数目逐渐增大时,NCE 估计准则会收敛到极大似然估计。因此,在使用NCE准则训练时,可以通过控制负采样数目来控制对归一化的概率分布近似的质量。
|3.实验数据
本例采用 Penn Treebank (PTB) 数据集(Tomas Mikolov预处理版本)来训练一个 5-gram 语言模型。PaddlePaddle 提供了 paddle.dataset.imikolov 接口来方便地使用PTB数据。当没有找到下载好的数据时,脚本会自动下载并验证文件的完整性。语料语种为英文,共有42068句训练数据,3761句测试数据。
|4. 网络结构
在 5-gram 神经概率语言模型详细网络结构见图1:
模型主要分为如下几个部分构成:
|5. 训练
在命令行窗口运行命令python train.py可以直接开启训练任务。
在模型文件network_conf.py中 NCE 调用代码如下:
return paddle.layer.nce(
input=hidden_layer,
label=next_word,
num_classes=dict_size,
param_attr=paddle.attr.Param(name="nce_w"),
bias_attr=paddle.attr.Param(name="nce_b"),
num_neg_samples=25,
neg_distribution=None)
NCE 层的一些重要参数解释如下:
(1)在命令行运行 :
python infer.py \
--model_path "models/XX" \
--batch_size 1 \
--use_gpu false \
--trainer_count 1
参数含义如下:
model_path:指定训练好的模型所在的路径。必选。
batch_size:一次预测并行的样本数目。可选,默认值为 1。
use_gpu:是否使用 GPU 进行预测。可选,默认值为 False。
trainer_count : 预测使用的线程数目。可选,默认为 1。注意:预测使用的线程数目必选大于一次预测并行的样本数目。
(2)需要注意的是:预测和训练的计算逻辑不同。预测使用全连接矩阵乘法后接softmax激活,输出基于各类别的概率分布,需要替换训练中使用的paddle.train.nce层。在PaddlePaddle中,NCE层将可学习参数存储为一个 [类别数目 × 上一层输出向量宽度] 大小的矩阵,预测时,全连接运算在加载NCE层学习到参数时,需要进行转置,代码如下:
return paddle.layer.mixed(
size=dict_size,
input=paddle.layer.trans_full_matrix_projection(
hidden_layer, param_attr=paddle.attr.Param(name="nce_w")),
act=paddle.activation.Softmax(),
bias_attr=paddle.attr.Param(name="nce_b"))
上述代码片段中的 paddle.layer.mixed 必须以 PaddlePaddle 中 paddle.layer.×_projection 为输入。paddle.layer.mixed 将多个 projection (输入可以是多个)计算结果求和作为输出。paddle.layer.trans_full_matrix_projection 在计算矩阵乘法时会对参数W进行转置。
(3)预测的输出格式如下:
0.6734 their may want to move
每一行是一条预测结果,内部以“t”分隔,共计3列: - 第一列:下一个词的概率。 - 第二列:模型预测的下一个词。 - 第三列:输入的 n 个词语,内部以空格分隔。
【参考文献】
本文分享自 PaddlePaddle 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!