Lecture 6(2019斯坦福)
Language Models and RNNs
一、传统的语言模型
1.什么是语言模型?
语言模型是做预测下一个单词会是什么这样的任务的系统。
更正式一点,给定x(1)到x(t)的单词序列,语言模型就是计算下一个单词的概率分布(P(x( t +1)))。
也可以将语言模型想成一个将概率分配给一段文本的一个系统。
实际上你每天都在使用语言模型。
- 如何学习语言模型? ————学习 n-garm 语言模型
2.n-gram语言模型
- n-gram:一系列的n个连续单词:
- unigram: “the” 、“student”、“opened”、“their”…
- bigram: “the student”、“student opened”、“opened their”…
- trigram:“the student opened”、“student opened their”…
- 4-gram:“the student opened their”…
n-gram语言模型的核心思想:
关于不同n-gram的频率,收集一系列统计数据,用于预测下一个单词。
- 首先,假设 x( t +1) 仅仅取决于最后n-1个单词。
- 在一些大型文本中获取 n-gram 以及 (n-1)-gram 的概率(仅通过计算他们出现在训练语料库中的次数)。
n-gram 的问题:
1.稀疏性问题![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a0ea5e5ee03a44e7b10aacbb2a3252b2.png)
-
稀疏问题:
对于某些从未出现在数据库里(分子为0),可能不常见但确实可能发生的词可能就会出现被分配到的概率为0的情况: -
可以对于词汇表中的每个单词在计数时增加一个小的数字delta,使得每个有可能的单词至少有一些小概率。(smothing)
-
当分母为0时怎么办?
-
back-off:如果出现这种情况可以返回去将n-1个单词词组调整为n-2个单词再做预测
-
如果扔掉太多的背景,那么预测的结果可能就不是很尽如人意。,然而如果你想要增加背景从而增大N,会使得稀疏性问题更加严重。所以在实践中,通常不会取大于5的N。
2.储存问题 ![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ac8eba462722815327cca6734513528c.png)
需要存储在语料库中看到的所有n-gram的计数。随着n的增加(或者语料库大小的增加),模型的大小也随之增加。
使用n-gram语言模型预测出来的文本,往往语义不是很连贯,因为它只能想到每个单词的前n个单词,但是如果增大n,稀疏问题和储存问题就会更加严重。
3.基于窗口的神经语言模型![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5736b437ddcda28462815914f014f19c.png)
假设固定窗口大小为4:
- 首先用one-hot向量表示这些单词
- 通过嵌入矩阵得到单词的嵌入向量
- 通过线性层和非线性函数f得到某种隐藏层
- 通过另一个线性层和softmax函数,输出概率分布
优点(与n-gram语言相比)
- 没有稀疏性问题
- 不需要储存所有观察到的n-gram(只需要储存词汇表中所有单词的单词向量)
问题
-
窗口设定太小
不管窗口设定多大,都会失去一些可能有用的上下文
如果试图放大窗口,就会增大矩阵W -
输入的处理方式不对称(每个单词向量与W的不同部分相乘)
我们需要某种可以处理任何长度输入的神经架构
二、循环神经网络(RNN)
1. 初识RNN![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e190a734ee424be3aaf1c944693d3b4c.png)
- 输入任意长度的序列
- 有一系列隐藏状态,每个隐藏状态都是基于上一个隐藏状态以及输入进行计算的
- 每一个时间步上应用相同的权重矩阵W
一些具体细节: - 首先用ohe-hot向量表示输入的单词
- 通过嵌入矩阵计算嵌入向量
- 根据先前的隐藏状态和当前输入计算第一个隐藏阶段H1(当前输入:E1,调用初始隐藏状态:H(0))
- 从而可以根据新的隐藏状态计算下一个隐藏状态…
- 得到最终的隐藏状态并通过一个线性层,并通过softmax函数,得到输出分布
优点
- 可以处理任何长度的输入
- 理论上,对于第t层的计算会用到来自许多步骤的信息,而不仅仅是一个窗口
- 模型的大小固定,并不会因为输入的大小而改变
- 每个时间步都应有相同的权重,对每个输入应有完全相同的变换
缺点
- 计算很慢(无法并行隐藏阶段)
- 在实践中,存在梯度消失和爆炸问题,因此很难从许多步骤中获取信息
2.如何训练RNN语言模型![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0b98705608ee8d2d82fbd2b0347e9a1b.png)
-
首先需要一个大的文本语料库 x(1),x(2),… ,x(T)
-
将这些单词序列输入到RNN模型中,计算每一步(step t)的输出分布( y ^ \hat{y} y^(t))
-
定义损失函数,一般采用分类问题中常见的交叉熵损失函数:
-
取平均值,得到整个训练集的总损失
计算整个语料库的损失和梯度需要花费大量时间。 在实践中,可以采用随机梯度下降法批量计算损失和梯度然后进行更新。
3.RNN的反向传播
Question: RNN语言模型反复应用相同的权重矩阵Wh,损失函数的导数是什么?
Answer: 权重矩阵的梯度是所有出现的梯度的总和。
- 为什么? 多变量链条规则
Question: 如何计算?
Answer: 反向传播(累积计算而不是分别计算)。
4.RNN语言模型的文本生成
基本原理:
- 可以选择一种风格的文本训练RNN模型,从而让它生成那种风格的文本。
- 使用RNN生成的文本确实获得了一些进展,但仍然离人类水平很远。
三、评估语言模型
语言模型的标准评价指标是“perplexity”:
“perplexity”被定义为:根据语言模型的语料库的逆概率。
等于交叉商损失J(
θ
\theta
θ)的指数。
- 因为“perplexity”是语料库的反向概率,所以越小越好。
近年来,RNN在perplexity方面取得了相当大的成功,上图是最近的一个结果表。
四、为什么要关心语言建模?
两个重要原因:
- 语言建模是帮助我们衡量我们理解语言的进度的一项基准任务。(可以将语言建模理解为一个非常通用的语言理解任务)
- 语言建模是许多NLP任务的一个子部分,尤其是涉及生成文本或估计文本概率的任务。(例如:语音识别,手写识别,作者识别等)
回顾:
- 语言模型:预测下一个单词的系统
- RNN模型:
1.顺序输入任意长度
2.每一步都应有相同的权重
3.可以在每一步选择性输出 - 递归神经网络(RNN) ≠ \not= = 语言模型
- RNN是构建语言模型的好办法,在其他地方也很有用。可以用RNN生成文本,或者进行标记任务(例如词性标注、命名实体识别),句子分类(例如情绪分类),还可以作为一个编码器模块。