《动手学深度学习》笔记——循环神经网络 RNN
目录
1 序列模型
实际中很多数据是有时序结构的,常称之为序列数据
【例1】电影的评价随时间变化而变化
- 拿奖后评分上升,直到奖项被忘记
- 看了很多好电影后,人们的期望变高
- 季节性:贺岁片、暑期档
- 导演、演员的负面报道导致评分变低
【例2】音乐、语言、文本和视频等都是连续的
- 标题“狗咬人”远没有“人咬狗” 那么令人惊讶
- 大地震发生后,很可能会有几次较小的余震
- 人的互动是连续的,从网上吵架可以看出
- 预测明天的股价要比填补昨天遗失的服,更床
时序模型中,当前数据跟之前观察到的数据相关
1.1 统计工具
在时间t
上观察到x_t
,则可得T
个不独立的随机变量组成的时序序列
(x_1,\cdots,x_t) \sim p(\mathbf{x} )
根据条件概率公式
p(a,b)=p(a)p(b|a)=p(b)p(a|b)
可展开得以下两种统计序列模型
p(\mathbf{x})=p(x_1)p(x_2|x_1)p(x_3|x_1,x_2)\cdots p(x_T|x_1,\cdots,x_{T-1})
或反过来
p(\mathbf{x})=p(x_T)p(x_{T-1}|x_T)p(x_{T-2}|x_{T-1},x_T)\cdots p(x_1|x_2,\cdots,x_T)
1.2 建模方案
1.2.1 自回归模型
对见过的数据建模,称为自回归模型(autoregressive models)。自回归模型使用自身过去数据来预测未来。
对以下条件概率建模
p(\mathbf{x})=p(x_1)p(x_2|x_1)p(x_3|x_1,x_2)\cdots p(x_T|x_1,\cdots,x_{T-1})
可得
p(x_t|x_1,\cdots,x_{t-1})=p(x_t|f(x_1,\cdots,x_{t-1}))
1.2.2 马尔科夫模型
马尔科夫模型(Markov Model)假设当前仅跟最近少数数据相关,从而简化模型。
对于上述序列模型,假设当前数据只跟\tau
个过去数据点相关,即
p(x_t|x_1,\cdots,x_{t-1})=p(x_t|x_{t-\tau},\cdots,x_{t-1})=p(x_t|f(x_{t-\tau},\cdots,x_{t-1}))
由此使得模型变量个数始终不变,继而可以训练神经网络,例如在过去数据上训练一个MLP模型。
1.2.2 潜变量模型
潜变量模型引入了潜变量来概括过去信息(历史信息)
对于上述序列模型,潜变量可表示
h_t=f(x_1,\cdots,x_{t-1})
则有
x_t=p(x_t|h_t)
由上图易知,每一个h_{t}
取决去前一个h_{t-1}
和x_{t-1}
,而x_t
则取决于该h_t
和前一个x_{t-1}
。每一段输出只跟1或2个变量相关。
2 语言模型
2.1 基本概念
给定文本序列x_1,\cdots,x_T
,语言模型的目标是估计联合概率p(x_1,\cdots,x_T)
。
应用:
(1)做预训练模型(e.g. BERT、GPT)
(2)生成本文,给定前面几个词,不断地使用x_t\sim p(x_t|x_1,\cdots,x_{t-1})
来生成后续文本
(3)判断多个序列中哪个更常见(e.g. "to recognize a speech" 和 "to wreck a nice beach")
2.2 使用计数来建模
假设序列长度为2,预测
p(x,x')=p(x)p(x'|x)=\frac{n(x)}{n} \frac{n(x,x')}{n(x)}
其中n
为总词数,n(x),n(x,x')
为单个单词和连续单词对的出现次数。
很容易拓展到长为3的情况:
p(x,x',x'')=p(x)p(x'|x)p(x''|x,x')=\frac{n(x)}{n} \frac{n(x,x')}{n(x)}\frac{n(x,x',x'')}{n(x,x')}
2.3 N元语法
当序列很长时,由于文本量不够大,很可能n(x_1,\cdots,x_T)≤1
。可使用马尔科夫假设缓解这个问题。使用统计方法时常采用N元语法
一元语法(\tau=1
):
p(x_1,x_2,x_3,x_4)=p(x_1)p(x_2)p(x_3)p(x_4)=\frac{n(x_1)}{n}\frac{n(x_2)}{n}\frac{n(x_2)}{n}\frac{n(x_2)}{n}
二元语法(\tau=2
):
p(x_1,x_2,x_3,x_4)=p(x_1)p(x_2|x_1)p(x_3|x_2)p(x_4|x_3)=\frac{n(x_1)}{n}\frac{n(x_1,x_2)}{n(x_1)}\frac{n(x_2,x_3)}{n(x_2)}\frac{n(x_3,x_4)}{n(x_3)}
三元语法(\tau=3
):
p(x_1,x_2,x_3,x_4)=p(x_1)p(x_2|x_1)p(x_3|x_1,x_2)p(x_4|x_2,x_3)
3 循环神经网络(RNN)
3.1 基本网络模型
循环神经网络的输出取决于当下输入和前一时间的隐变量。
应用到语言模型中时,循环神经网络根据当前词预测下一次时刻词。
更新隐藏状态:
\mathbf{h}_t=\phi(\mathbf{W}_{hh}h_{t-1}+\mathbf{W}_{hx}\mathbf{x}_{t-1}+\mathbf{b}_h)
输出:
\mathbf{o}_t=\phi(\mathbf{W}_{ho}\mathbf{h}_t+\mathbf{b}_o)
可见,RNN是靠\mathbf{W}_{hh}
来存储时序信息,去掉其所在项即将RNN退化成MLP。
3.2 困惑度(Perplexity)
衡量一个语言模型的好坏可以使用平均交叉熵
\pi=\frac1n \sum\limits_{i=1}^n-\log p(x_t|x_{t-1},\cdots)
其中p
为语言模型的预测概率,x_t
为真实词。
由于历史原因,NLP使用困惑度\exp(\pi)
来衡量,表示平均每次可能选项(1表示完美,\infin
为最差情况)。
3.3 梯度剪裁
迭代中计算着T
个时间步上的梯度,在反向传播过程中产生长度为O(T)
的矩阵乘法链,导致数值不稳定。梯度剪裁能有效预防梯度爆炸。
如果梯度长度超过\theta
,则拖影回长度\theta
,即
\mathbf{g}\leftarrow \min(1,\frac{\theta}{\left \| \mathbf{g} \right \| })\mathbf{g}
3.4 各种RNN的应用
后续见【Zotero】D2L笔记