您的位置:首页 > 理论基础 > 计算机网络

几篇神经网络训练语言模型文章的阅读

2017-03-29 17:09 721 查看
本文主要对这几周读的几篇关于使用神经网络构建语言模型的论文进行总结。

[1] Bengio Y, Ducharme R, Vincent
P, et al. A neural probabilistic language model[J]. Journal of machine learning research, 2003, 3(Feb): 1137-1155.
在[1]中Bengio提出了使用神经网络来训练语言模型方法,该语言模型是一个N-gram模型,即通过输入的n-1个单词,来预测第n个单词的概率分布。
Bengio使用了一个简单的三层神经网络:



输入层:通过一个映射矩阵C(矩阵的规模为|V|*m,其中|V|是词表大小,m是词向量的维度),将前n-1个离散的单词映射成n-1个m维向量,也就是通过查表的方式将单词变成词向量。然后将这n-1个m维向量首尾相接形成一个m(n-1)的向量,该向量就是神经网络的输入向量x。
隐藏层:隐藏层的节点个数为h,为了将输入层输出的m(n-1)维向量x转化为隐藏层(维度为h)的输入,在输入层和隐藏层之间需要一个参数矩阵H(H的规模为h*m(n-1)),同时需要一个偏置d,该变化可以表示为f(x)=Hx
+ d,这是一个线性变换。隐藏层的输出需要将经过线性变换的向量在做一次非线性变换,在这里选择的函数为tanh(双曲正切),也就是激活函数。那么我们可以知道隐藏层的输出就是tanh(Hx
+ d)。
输出层:从隐藏层到输出层的传递同样需要一个线性变换和一个非线性变化,即首先通过线性变换将隐藏层的输出向量的维数转化为和输出层的节点数一致(其实此时已经可以将这个这个值作为输出),但是为了将输出表示成概率分布的形式(每个维度上的值之和为1),我们还需要对输出层的输入(也就是隐藏层的输出)进行一个非线性变换,激活函数为softmax,才能达到我们想要的效果。由于我们希望网络的输出可以对第n个单词的分布做出概率预测,所以输出层的维度为|V|,即整个词表的大小,那么从隐藏层到输出层的参数矩阵U的规模就是|V|*h,
i>如果输入层和输出层之间没有直连边,那么输出层的输入就是y=b+Utanh(Hx
+ d);
ii>如果输入层和输出层之间有直连边,该变换同样需要一个参数矩阵W(W的规模为|V|*m(n-1)),和一个偏置b,那么输出层的输入就是y=b
+ Wx + Utanh(d + Hx).
最终输出层的输出就是经过softmax函数激活后的概率:



其中,分子就是词w(t)对应的输出,例如单词w(t)在词表的位置是第100个,那么分子就是输出向量的第100维上的值。

该神经网络的参数θ=(b, d, W, U, H, C),而训练模型的方法是和随机梯度下降(SGD)类似的随机梯度上升(SGA)。
训练模型的过程就是调整参数θ是的目标函数最大化的过程,该模型使用的目标函数为:



由于模型输入为(x,
y)其中x= w(t-n+1),w(t-n+2),..,w(t-1),y=w(t),我们希望在训练中使得每次输入n-1个单词后,网络输出的概率中对w(t)的概率是最大的,于是得到了该目标函数。
其中T是指将训练样本中的总单词数(在此处训练的时候将训练语料转化为了一个长为T的超长词序列),然后使用一个长度为n的窗口进行滑动,作为模型的输入。

当模型训练好后,我们比较关注的词向量就保存在映射矩阵C中,同时我们也得到了语言模型。
后续打算使用TensorFlow对该神经网络进行实现,以加深理解。

[2] Collobert
R, Weston J, Bottou L, et al. Natural language processing (almost) from scratch[J]. Journal of Machine Learning Research, 2011, 12(Aug): 2493-2537.
这篇文章的内容较多,只对其中的模型进行简单的介绍。
在C&W的这篇论文中,他们对自己提出的自然语言处理的框架进行详细的解释,其实也是一个神经网络,和[1]中的网络存在类似之处。
主要有两种方法:
(1) 基于窗口的方法,所谓基于窗口就是说网络的输入是固定长度的。



这个方法和[1]的神经网络极其类似,在输入层同样是通过查表的方式进行单词到向量的转换,将单词转化为可以计算的词向量之后,通过一系列线性变化(层之间的维数转化或者说是特征提取)和非线性变化,将输入转化为输出。只是该网络在隐藏层使用的激活函数和[1]有所不同,使用了HardTanh函数:



主要目的是加快训练。
C%W通过该框架构建语言模型时,和[1]还有一点不同,那就是在输出层没有|V|那么多节点,只有一个节点,得到一个数值,用该数值就输入进行打分。
在对模型进行优化时,使用的目标函数为:



θ是神经网络的参数,x是网络的输入(固定长度的单词序列),x(w)表示用w替换原来词序列最中间那个词后的序列,可以简单理解为变成了一句不正常的话,f就是网络的输出,也就是对输入的打分。作为一个初学者,感觉这样的构建目标函数的想法真是很有意思。
对网络进行优化之后,就能得到我们想要的词向量。

(2) 基于句子的方法,所谓基于句子,就是说网络的输入不再是一个固定长度的单词序列,它的长度是可以变化的。



在这种情况下就需要在原有框架中间加入一个新的层来解决输入长度不一致的问题,C&W加入了一个卷积层。
网络的第一层还是通过查表的方法将单词转化为此词向量,作为输入;
然后通过一个卷积层,在该层通过一个固定大小为t的窗口,每次对输入句子中连续的t个单词进行一次卷积,也就是一次线性变化。窗口从句子开头一直滑动到句子末尾。
假设进行了6次卷积,那么可以理解为在下一层中就每个节点上会接收到6个值,然后通常的做法是将这6个值取平均或者取最大值,在这里CW选择了取最大值。
这之后网络的结构就和窗口方法基本一致了。
网络的输出可以根据具体问题进行具体的设计,没有细看。

感觉在这篇文章中,目标函数的设计很有意思。

[3] Huang
E H, Socher R, Manning C D, et al. Improving word representations via global context and multiple word prototypes[C]//Proceedings of the 50th Annual Meeting of the Association for Computational Linguistics: Long Papers-Volume 1. Association for Computational
Linguistics, 2012: 873-882.
Huang的工作主要是在[2]的基础之上的做的改进。他在[2]工作的基础上,加入了他所认为的全局上下文信息。
Huang提出的语言模型框架如图:



在local
context这侧,Huang使用的方法基本上和[2]中基于窗口的方法一样,就是在目标函数设计时将替换的词的位置从最中间改成了末尾;



在global
context这侧,Huang将词序列s所在文档的每个单词的idf值的加权平均值作为全局上下文信息,和输入词序列s的最后一个单词拼接在一起作为该侧网络的输入,网络结构和[2]还是类似;



将两侧得到的输出相加就得到了模型的输出。
Huang的目标函数设计如下:



网络的输入是(s,
d),s是词序列,d为词序列s出现的文档。sw的意思和[2]中一致,只是替换位置发生了变化(在末尾)。

Huang还就一词多义问题提出了自己的设计,有兴趣可以直接去阅读文献。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息