RNNLM,鉴于RNN天生的结构就存在有长期依赖,特别适合于序列的数据,解决了NNLM的不能获得长期依赖的问题(窗口固定导致),RNNLM还能通过BiRNN获得任意上下文的依赖。下面我们学习。本文仅仅学习理论知识,操作实践留给后面的博文。

一:RNNLM

是一个根据上下文,预测下一个词语概率的模型。
NLP《语言模型(三)-- 基于循环神经网络的RNNLM语言模型》

这个模型更加贴近于语言模型的定义,得到语言模型中每个因数参数的计算。
图示如下:
NLP《语言模型(三)-- 基于循环神经网络的RNNLM语言模型》

一般训练的时候,使用LSTM,GRU单元Cell的多层双向BiRNN。这里只是用最简单的单层单向的RNN做个模型演示。

模型解读:
1:整个词库的大小是V,且为了统一方便,我们增加了“BOF”,“EOF”,“UNK”三个词汇,分别代表句子开始词,句子结束词,未知的词。

2:图中的蓝色长框代表词嵌入层,word Embedding层,黄色长框代表最后输出的softmax层。

3:以句子S=“[BOF] My cat is cute”为例,输入顺序如图所示。
T=1的时候在输入“BOF”的one-hot向量,经过嵌入层得到嵌入向量,经过隐藏层计算,softmax输出后,得到词库每个词语的输出概率(P(w1),P(w2),…,P(wn))。预期是“My”

T=2的时候在输入“My”的one-hot向量,经过嵌入层得到嵌入向量,经过隐藏层计算,softmax输出后,得到词库每个词语的输出概率(P(w1),P(w2),…,P(wn)),注意此时的概率可以认为是条件概率了,因为是在给定具体输入词的情况下得到的输入O,所以可以理解成本时刻输出各个词汇概率是(P(w1|My),P(w2|My),…,P(wn|My))。预期是“Cat”

T=3的时候,输入是“cat”的one-hot向量,输出是各个词汇概率(P(w1|My cat),P(w2|My cat),…,P(wn|My cat))。

以此类推即可。

其实这个就是一个根据上下文,预测下一个词语概率的模型,所以以后想要预测某个句子S的概率,就可以按照模型计算多个时刻的P,相乘,即可得到句子的概率。很巧妙,不得不说RNN确实是NLP里面的是非优秀的模型啊,最贴近于语言模型的定义。

损失函数如下:
由于输出层输出的是softmax,最后对应于每个词语的概率,所以定义损失函数是交叉熵损失函数,如下:
NLP《语言模型(三)-- 基于循环神经网络的RNNLM语言模型》

至此:在预料库中将每个句子进行模型计算和训练,通过如上损失函数进行训练,即可得到RNNLM。

===============================================
二:模型序列采样
这里是个随机漫步的过程,如下图所示:
NLP《语言模型(三)-- 基于循环神经网络的RNNLM语言模型》

我们训练完了一个RNNLM后,我们如果想知道它训练出来是个什么样子的话,怎么做呢?
就按照图中所示的办法,给一个“BOF”作为启动,每一时刻的计算结果O,按照结果O的概率分布,直接输入到下一时刻的输入层,以此类推,这样一来,这个随机漫步过程就启动了,这个过程中我们将看到这个模型学会了哪些合理的句子。

甚至这个过程也可以当用来自动生成文本,自动写诗歌话剧,自动写散文新闻等,也是挺有意思的一件事儿了。根据各种类型预料库的学习,可以得到各类型的文章。

再比如,如果你拿唐诗宋词,各种文言文,论文,诗经去训练,说不定你就能写出媲美李杜的诗句哦。

===============================================
三:RNNLM的优缺点
优点:
1:天生的结构能处理任意长度的序列的依赖,可以不用人为限制模型输入长度
2:理论上能获得更长期的依赖,如果使用BiRNN模型,则能获取后面下文的依赖。

缺点:
1:计算和训练时间长。