自然语言处理(二 RNN语言模型)

RNN语言模型

语言模型

语言模型就是指语言产生的规律,一般用来预测所使用语言语序的概率,或者是当前上下文使用某个词语的概率。换句话说,就是用来表示语言产生顺序的建模,用某个词是否恰当,这样的语序构造句子是否妥当这样的。于是,训练出一个语言模型就需要相当大的样本数据。语言模型可以分为:文法型的语言模型(就是定义相关的文法结构,例如主语+谓语+宾语构成陈述句这样的),统计模型,神经网络语言模型。

其中统计类的语言模型包括N-gram,N-pos,隐马尔科夫链模型、最大熵模型等。就是给出前边的词,判断后面出现词的概率。 p(w3|w1w2) 表示 w3 在词语 w1w2 之后出现的概率。具体计算公式为 p(w3|w1w2)=p(w1w2w3)p(w1w2)=Count(w1w2w3)Count(w1w2) , Count(x)表示x在语料库中出现的频率。这种模型能给出后面单词发生的概率。但是会出现Count(x)=0的情况,为避免这种问题出现了很多平滑技术,例如Laplace平滑等。

但是这种统计模型的计算非常消耗内存。

RNN语言模型

RNN语言模型就是利用RNN神经网络对语言建模,用于描述语言序列的产生过程。RNN神经网络就是循环神经网络,能很好地拟合序列数据。
RNN
假设当前你有大量文本语料库C,根据这个预料你构建了词典V,然后你做分句,把每句话通过扩展变成等长的句子。句子开始以START标志,结束以EOS结束,使用PAD来进行短句子的填充。现在得到长度为L的sequence序列。每个词使用vector进行表示(1-of-N model)序列为 x1,x2,...,xL ,假设 x1 是词典V中的第一个词,V的大小为N,则 x1=[1,0,0,...,0] .对于RNN输出数据对应的True Value这里选择使用 x2,x3,...,xL1,EOS , 使用符号表示为 y1,y2,...,yL 对于RNN预测数据表示为 y1,y2,...,yL

ht=f(whhht1+wxhxt)

yt=g(ht)

yt 是一个N维(词典的大小)向量,表示一个概率分布,即下一个词语出现的概率在词典中的概率分布。 yt(n) 表示下一个词是词典中第n个词的概率大小。
损失函数定义维:
Loss=1Lt=1Lj=1Nyt(j)log(yt(j))

求导根据BackPropogation+SGD进行训练。最小化损失函数。

模型扩展

一般对于RNN的训练采用BPTT的算法。
当L较大时,模型的训练会出现梯度消失和梯度爆炸的问题。
对于梯度爆炸可以采取Clipping的方法解决,具体就是设置门限,超过这个门限时,进行该梯度方向上的归一化。
对于梯度消失,可以采用LSTM或GRU来替代SRNN;或者使用ReLU来替代Sigmoid激励函数。

猜你喜欢

转载自blog.csdn.net/u011195431/article/details/78638286