基于神经网络语言模型的动态层序Softmax训练算法
2020-03-24杨鹤标胡惊涛
杨鹤标, 胡惊涛, 刘 芳
(江苏大学 计算机科学与通信工程学院, 江苏 镇江 212013)
词向量作为单词的特征向量或表征,因其表现形式呈现矩阵化,故而能够充分发挥计算机的计算能力[1].因此如何高效训练词向量,成为解决自然语言处理(natural language process, NLP)任务的基础性问题.Y. BENGIO等[2]率先提出利用前馈神经网络训练词向量,通过对单词的分布式表达解决数据稀疏对统计建模的影响,受到广泛学者的青睐,但其缺点是深层网络训练带来的参数训练低效问题.为此,众多学者或研究人员针对该问题提出了不同训练方法,如E. H. HUANG等[3]在此基础上,提出了多任务训练的思路,即通过共享训练参数提高训练效率.J. PENNINGTON等[4]提出了Glove模型,利用对共现矩阵进行分解的方式获得词向量.L. VILNIS等[5]提出一种概率图模型,将每个单词映射为一个多维高斯分布,然后该分布的均值就是对应单词的词向量.然而这些模型都不能有效表示NLP任务中所涉及的多义词.为解决这个问题,提升词向量的表示质量,T. MIKOLOV等[6]提出Word2Vec模型,引入负采样和层序Softmax,建立全局上下文和单词的训练模型,将文本内容简化为K维向量空间中的向量运算,把单词的语义信息蕴含于数值中,获得更加紧凑的变现形式与泛化属性[7].Word2Vec虽然在一定程度上解决了多义词的表示问题,但是其训练过程中所使用的层序Softmax算法对增量样本的敏感度极低,导致无法满足实际对增量训练的要求.
针对层序Softmax算法对增量样本的敏感度极低的问题,文中提出动态层序Softmax算法,通过改进该算法依赖的编码树常规生成模式,采用结点置换方法使得增量样本所依赖的编码树是通过对旧编码树结点的调整所得,保证训练数据的加载与编码树的构建同步进行,从而满足增量训练要求,避免多次遍历数据样本.同时文中提出利用梯度的矩估计动态调整训练过程中参数的更新方向以及学习率,解决损失函数因样本量少而出现的震荡现象,有效提高训练效率.
1 相关工作
1.1 神经网络语言模型
神经网络语言模型(neural network language models, NNLM)的结构如图1所示,模型利用神经网络在非线性拟合方面的能力推导出词汇或者文本的分布式表示[8].
图1 NNLM结构示意图
NNLM模型由特征映射和条件概率分布计算两部分组成.特征映射是通过映射矩阵C∈R|V|×m将输入单词映射为特征向量,该过程将得到的{C(Wt-n+1),C(Wt-n),…,C(Wt-1)}合成为(n-1)m维词向量矩阵.条件概率分布计算则是通过概率函数G将词向量矩阵转为一个概率分布y∈R|V|,即
F(i,wt-1,wt-2,…,wt-n+1)=G[i,C(wt-1,wt-2,…,wt-n+1)],
(1)
最后的网络输出层采用Softmax函数,表示为
(2)
Word2Vec作为一款基于NNLM的NLP工具,将传统的NNLM改进为CBOW与Skip-gram两个模型.两种模型结构类似,但训练思路稍显不同.CBOW模型通过训练样本中的上下文来预测中心词的出现概率[9].而Skip-gram模型是根据中心词来预测上下文,即输入特定单词,输出该单词上下文的词向量.此外,Skip-gram模型在处理文本时采用跳过一些单词去取共现单词的方式,获取与当前单词非直接相连单词之间的关系[10].
1.2 训练优化算法
由于训练样本单词数量一般在百万级别以上,如果采用一般的分类回归算法,就意味着输出层需要通过Softmax函数来计算每个单词的输出概率,导致计算量与单词数量级大小直接相关.因此在训练过程中,采用层序Softmax、负采样两种算法来解决计算量问题.
层序Softmax算法采用了Huffman编码树代替隐藏层到输出Softmax层的映射[11].与Softmax相比,该算法将输入层中的单词组成特征向量,通过线性变换映射到隐藏层;根据单词出现的频率构建编码树,输出结点编码,避免计算所有单词的输出概率,解决计算量的问题.此时的计算复杂度为O(HlbK),其中K为类别数量,H为文本特征的维度数.
由于层序Softmax对生僻单词不敏感,T.MIKOLOV等[6]提出负采样(negative sampling,NEG)算法.NEG的本质是根据已知概率密度函数来估计未知的概率密度函数.输出层采用随机负采样来替代编码树,因此NEG不对目标词W路径的中间结点进行更新,而是随机选取部分中间结点对其权重进行更新,从而提高模型应对生僻单词的训练速度和词向量的质量.但在训练常用单词时,训练效率并没有层序Softmax算法显著[12].
2 词向量的增量训练
有研究[13]表明,层序Softmax算法是依赖对训练样本进行编码来完成词向量的训练,可见如何实现编码树的高效构建是提高训练效率的关键.由于该编码方式需要对原始数据进行两次扫描,势必会在编码过程中造成较大的时延;并且一旦编码完成,编码树结构将固化不变,导致层序Softmax算法无法满足增量训练的要求.针对上述问题,文中提出动态层序Softmax算法,通过编码树的动态构建来解决结构的固化问题,进而实现词向量的增量训练,并且提高训练效率.
2.1 构建动态编码树
fori←1 toNdo
ncurrent←findnode(wi,Tree)
ifncurrentnot inTreethen
whilencurrent≠Rootdo
swap(Tree.NYT,ncurrent.NYT)
Tree.NYT←Tree.NYT+1
wi.NYT←ncurrent
end while
end if
ifncurrent.Weight=max(bcurrent)then
ncurrent.Weigh←ncurrent.Weight+1
else
swap(max(bcurrent),ncurrent)
end if
swap(ncurrent.Parent,ncurrent)
end for
构建动态编码树步骤如下:
1) 定义结点属性.
定义1结点编号:按照层序遍历的方式,为编码树中的所有结点倒序编号,具体编号方式为
T={(node1:k),(node2:k-1), …,(nodek:1)},k=1,2,…,n.
(3)
定义2所属块:具有相同权重W的结点属于同一所属块B,即如果wnodei=wnodej,则有:
bn+={nodei,nodej}.
(4)
综上,结点的特征总结如下: ① 结点的权重越大编号越大. ② 父结点的编号总是大于子结点的编号.以上特征称作兄弟属性,在动态构建过程中必须时刻满足.
2) 编码树初始化.在初始化编码树时,由于无法预先得知训练样本中单词的出现频率,此时初始状态只能包含一个叶子结点(not yet transmitted,NYT)记作逸出结点,WeightNYT=0.此时,NYT有两种作用: ① 在编码时,当有未出现在树中的单词需要编码时,就会输出NYT编码;在解码时,如果读取编码的过程中出现NYT,就说明该部分暂时不属于编码. ② 插入新单词时,需要根据NYT的位置构建一颗包含NYT和新单词两个结点的新子树,旧NYT结点由该子树替代,并将原NYT和新单词结点权值取1.
3) 编码树更新.在更新过程中,为避免破坏兄弟属性,需对结点权重、编号同步更新.因此,在对结点进行权重更新时,首先判断该结点的编号是否是所在块中的最大编号,如图2所示.
在对单词W4进行增量训练时,由于此时W4对应结点编号已是所属块中的最大编号,直接更新权重;否则将该结点与所在块中最大结点编号的结点交换位置,再增加结点的权重值.此时该结点的结点编号置换为所在块中的最大值,因此权重增加后兄弟属性仍然满足.最后,由于结点的权重发生变化,因此结点的父结点也必须更新权重,直至根结点.更新完成后的编码树如图3所示.此时,由于仅需扫描一遍样本,因而动态构建编码树的时间复杂度就由原先的O(N2)降低为O(N).
图2 原始编码树
图3 更新后编码树
2.2 裁剪编码树
编码树的新增结点数增长与新增单词数量相关,导致树的结构变化较大,因此上述方法得到的编码树结构并不稳定.随着训练样本的不断增加,会产生越来越多的新结点,而受到影响的原有结点增长幅度却远不如新增结点的增加幅度.
由于编码树会根据单词的频率来分配权重,频率较低的单词结点由于离根结点较远,也就容易发生位置上的改变.为减少低频词对训练造成的影响,需要在编码树构建完成时,根据预设的裁剪权重,裁剪树中所有权重小于预设权重的结点,过滤出现频率低的单词结点.
最终,将Word2Vec模型中的静态编码树替换为文中的动态编码树,进而完成词向量的训练.调整后的模型结构图如图4所示.
图4 基于动态层序Softmax算法NNLM网络
2.3 网络训练
假设给定训练单词序列W,而w1,w2,…,wT为序列W中的单词,观察窗口大小为C.CBOW训练过程通过给定上下文来预测中心词的出现概率,因此,目标函数为
(5)
(6)
将其带入目标函数当中,将目标函数改写为
(7)
采用梯度训练对目标函数进行参数估计,利用梯度迭代过程缩小权值变化范围.
2.4 梯度方向优化
为最大化预测词的出现概率,因此采用随机梯度上升算法优化目标函数,即
(8)
每次选取的样本数量较小将导致损失呈现震荡方式上升的问题,故引入自适应动量估计算法,采用参数动量更新与自适应学习率相结合的方式优化梯度方向,即
(9)
(10)
此时所求得的Xw是中心词w的上下文词向量之和,故直接将Xw更新到词向量上,完成词向量的训练过程,即
(11)
3 试验结果与分析
3.1 试验数据和参数设置
试验数据来源于维基百科中文语料(约3.5 GB),借助Jieba分词工具对数据进行分词和过滤,得到84 766 832个句子以及441 670 563个独立单词.将其中约2 GB语料作为初始训练数据,其余数据为增量训练样本,分别以10 kB,100 kB,1 MB,10 MB,100 MB和1 GB依次添加到原初始训练数据中.试验分别记录两种算法在处理不同大小的增量训练样本时所需的训练时间以及词向量之间的相似度来对训练效率、效果进行衡量.
在对维基中文语料的训练过程中,主要涉及Size等超参数.在处理NLP任务时,当词向量大于150维之后训练效果的提升较小,维度越大,所需训练时间越长[14].鉴于维度较小的词向量不足以提取单词中的特征,试验将词向量的训练维度设置为128维,将观察窗口大小设置为8个单词.考虑到一个单词在语料数据集的中出现频率也从侧面体现了该单词的重要性,频率越低重要性越小,因此将最低出现频率设置为5个单词/语料数据集,对编码树进行结点裁剪.超参数设置如表1所示.
表1 主要训练超参数
3.2 训练效率分析
通过对比CBOW与Skip-gram模型在采用层序Softmax与动态层序Softmax作为训练算法时的训练时间、训练增速来评估两种算法的训练效率.训练时间如图5所示.
图5 训练时间对比图
从图5可见,当使用层序Softmax来处理增量数据时,CBOW与Skip-gram模型的训练时间在10 kB到100 MB之间较为平缓.而使用文中所提出的动态层序Softmax 算法进行训练时,训练时间明显下降.原因在于10 kB到100 MB的增加训练数据相较于初始训练数据集(2 GB)来说太小,而层序Softmax算法对少量数据的增加并不敏感,使得训练时间增长较为平缓.但是动态层序Softmax在设计上就能随着数据的增加而自适应调整,因而在训练小体积的增量数据时能够显著提高训练效率.此外,CBOW与Skip-gram模型在采用动态层序Softmax算法时的训练加速度情况如图6所示.
图6 训练增速对比图
Skip-gram模型具有通过中心词来预测观测词出现概率的特性,因此在训练少量增量数据时的训练增速要稍好于CBOW模型.譬如在增量数据在10 kB~1 MB时,Skip-gram模型的增速能达到3倍,CBOW 模型也获得近10倍的增速,可见无论是CBOW还是Skip-gram模型,在采用动态层序 Softmax算法来训练增量数据时,训练效率都有显著的提高.
3.3 训练质量分析
表2 训练质量对比
注:“层序”代表层序Softmax算法;“动态”代表动态层序Softmax算法.
从表2可见,在该数据集上无论是采用CBOW还是Skip-gram模型,层序Softmax算法计算得到的MMSE以及CCoS都与动态Softmax在不同维度计算结果均有提高.其中MMSE最为显著,分别提升0.19×10-3,0.15×10-3,0.24×10-3,0.39×10-3.试验表明,采用动态层序Softmax训练质量也处于很高的水准,能够满足实际训练的需要.
4 结 论
文中提出了动态层序Softmax训练算法,通过改进编码的构建流程进而实现对增量语料训练,得到训练效率的提高.试验结果表明,在处理增量语料时,文中所提出的训练算法相比层序Softmax,在词向量训练效率和训练质量上都有显著提升.
进一步的研究工作如下: ① 如何将该算法扩展到其他高级神经网络模型中; ② 基于语言线性平移特性训练词向量,实现实体识别、知识推理、知识图谱等其他应用中.