语言模型

  • 简介
    • 语言模型就是计算一个句子(单词序列)的概率(P(w1,w2,...wm)P(w_1, w_2, ...w_m))的模型。用途广阔,如机器翻译中,判断译文序列中的某一种词序的自然程度高于另一种,从而得到合适的用词选择。
  • 传统语言模型
    • 句子的概率等于每个单词的概率的乘积,而每个单词的概率等于在这个单词前面所有单词出现的概率下当前单词出现的概率。
    • 为了简化问题,这里引入马尔可夫假设:句子的概率通常是通过待预测单词之前长度为n的窗口建立条件概率来预测:P(w1,,wm)=i=1i=mP(wiw1,,wi1)i=1i=mP(wiwin,,wi1) P\left(w_{1}, \ldots, w_{m}\right)=\prod_{i=1}^{i=m} P\left(w_{i} | w_{1}, \ldots, w_{i-1}\right) \approx \prod_{i=1}^{i=m} P\left(w_{i} | w_{i-n}, \ldots, w_{i-1}\right)
    • 为了估计这个条件概率,采用极大似然估计,比如对于BiGram和TriGram模型有:p(w2w1)=count(w1,w2)count(w1) p\left(w_{2} | w_{1}\right)=\frac{\operatorname{count}\left(w_{1}, w_{2}\right)}{\operatorname{count}\left(w_{1}\right)} p(w3w1,w2)=count(w1,w2,w3)count(w1,w2) p\left(w_{3} | w_{1}, w_{2}\right)=\frac{\operatorname{count}\left(w_{1}, w_{2}, w_{3}\right)}{\operatorname{count}\left(w_{1}, w_{2}\right)}
    • 在数据量足够的情况下,n-gram中的n越大,效果越好。但是,实际上,数据量总是不能尽如人意。这时候一些平滑方法则有用得多。
    • Bengio提出来第一个大规模深度学习自然语言处理模型,而原理只不过是用前n个单词的词向量来做同样的事情而已,网络结构如下:
      • NLP-语言模型
      • y^=softmax(W(2)tanh(W(1)x+b(1))+W(3)x+b(3)) \hat{y}=\operatorname{softmax}\left(W^{(2)} \tanh \left(W^{(1)} x+b^{(1)}\right)+W^{(3)} x+b^{(3)}\right)
      • 这里W(3)x+b(3)W^{(3)}x+b^{(3)}就是前nn个单词词向量的线性运算,虽然这种模型名字里有“Neural”,但是仍然属于传统语言模型。
  • 循环神经网络(Recurrent Neural Networks)
    • 这种新的语言模型是利用RNN对序列建模,复用不同时刻的线性非线性单元及权值,理论上之前所有的单词都会影响到预测单词。(这在曾今可以说改写了深度神经网络的规则。)
    • NLP-语言模型
    • 所需内存只与词表大小成正比,不取决于序列长度。
    • 给定一个词向量序列: x1,...,xt1,xt,xt+1,...xTx_1,...,x_{t−1},x_t,x_{t+1},...x_T,在每个时间点上都有隐藏层的特征表示:ht=σ(W(hh)ht1+W(hx)xt) h_{t}=\sigma\left(W^{(h h)} h_{t-1}+W^{(h x)} x_{t}\right)
      • 其中,xtRdx_{t} \in \mathbb{R}^{d}是时间tt时输入的单词的词向量。
      • WhxRDh×dW^{h x} \in \mathbb{R}^{D_{h} \times d}用来condition输入词向量xt的的权值矩阵。
      • WhhRDh×DhW^{h h} \in \mathbb{R}^{D_{h} \times D_{h}}用来condition前一个时间节点隐藏层特征表示ht−1的权值矩阵。
      • ht1RDhh_{t-1} \in \mathbb{R}^{D_{h}},前一个时间点t1t−1的非线性**函数的输出,h0RDhh_{0} \in \mathbb{R}^{D_{h}}是时间点t=0t=0时的隐藏层初始状态。
      • σ()\sigma( )非线性**函数(sigmoid)。
      • y^t=softmax(W(S)ht)\hat{y}_{t}=\operatorname{softmax}\left(W^{(S)} h_{t}\right)在时刻tt时输出的整个词表V|V|上的概率分布,y^t\hat{y}_{t}是给定上文ht1h_{t−1}和最近的单词x(t)$预测的下一个单词,其中 W(S)RV×DhW^{(S)} \in \mathbb{R}^{|V| \times D_{h}}y^RV\hat{y} \in \mathbb{R}^{|V|}
      • W(hh)ht1+W(hx)xtW^{(h h)} h_{t-1}+W^{(h x)} x_{t}与拼接两个向量乘以权值矩阵的拼接是一样的。
    • 损失函数
      • J(t)(θ)=j=1V]yt,j×log(y^t,j) J^{(t)}(\theta)=-\sum_{j=1}^{ | V ]} y_{t, j} \times \log \left(\hat{y}_{t, j}\right)
      • 在大小为T的整个语料上的交叉熵误差为J=1Tt=1TJ(t)(θ)=1Tt=1Tj=1Vyt,j×log(y^t,j) J=\frac{1}{T} \sum_{t=1}^{T} J^{(t)}(\theta)=-\frac{1}{T} \sum_{t=1}^{T} \sum_{j=1}^{|V|} y_{t, j} \times \log \left(\hat{y}_{t, j}\right)
      • 如果以2为底数会得到“perplexity困惑度”,代表模型下结论时的困惑程度,越小越好:Perplexity=2J Perplexity=2^{J}
    • RNN的训练很难
      • 梯度爆炸
        • 浮点运算越界(指数项运算溢出)
      • 梯度消失
        • 指数小于1运算
      • softmax过大
        • 词表大时运算很费力
    • 解决办法
      • 梯度爆炸
        • 设置上界阈值
      • 梯度消失
        • 初始化参数为单位矩阵
      • softmax过大
        • 先预测词语的分类(比如按词频分),然后在分类中预测词语。
        • 记录每个t的误差不要丢,反向传播的时候将其累加起来。

相关文章: