TOC
KINA

KINA-0

Start having fun with KINA right now!

深度学习基础(6):循环神经网络 RNN

《动手学深度学习》笔记——循环神经网络 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})

统计模型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)

统计工具2

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})

统计模型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 基本网络模型

循环神经网络的输出取决于当下输入和前一时间的隐变量。

应用到语言模型中时,循环神经网络根据当前词预测下一次时刻词。

RNN

更新隐藏状态:

\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的应用

RNNs

后续见【Zotero】D2L笔记

发表评论