d2l自学笔记 – 8.循环神经网络

《动手学深度学习》 — 动手学深度学习 2.0.0-beta0 documentation (d2l.ai)

recurrent neural network, RNN

分类

  • 外推法(extrapolation):对超出已知观测范围进行预测
  • 内插法(interpolation):在现有观测值之间进行估计

序列回归模型

  • 自回归模型(autoregressive models):使用xt1,,xtτx_{t-1}, \ldots, x_{t-\tau}预测xtx_t
  • 隐变量自回归模型(latent autoregressive models):保留一些对过去观测的总结hth_t,并同时更新预测x^t\hat{x}_t和总结hth_{t}

一些概念

  • 动力学静止(stationary):序列本身的动力学不随时间改变
    P(x1,,xT)=t=1TP(xtxt1,,x1)P\left(x_{1}, \ldots, x_{T}\right)=\prod_{t=1}^{T} P\left(x_{t} \mid x_{t-1}, \ldots, x_{1}\right)

  • 马尔科夫条件(Markov condition):自回归模型的前提

  • k步预测(k-step-ahead-prediction)

语言模型和数据集

拉普拉斯平滑(Laplace smoothing)

当数据集很小,或单词非常罕见时使用,来将罕见单词组合指定为非零计数。

P^(x)=n(x)+ϵ1/mn+ϵ1P^(xx)=n(x,x)+ϵ2P^(x)n(x)+ϵ2P^(xx,x)=n(x,x,x)+ϵ3P˙(x)n(x,x)+ϵ3\begin{aligned} \hat{P}(x) &=\frac{n(x)+\epsilon_{1} / m}{n+\epsilon_{1}} \\ \hat{P}\left(x^{\prime} \mid x\right) &=\frac{n\left(x, x^{\prime}\right)+\epsilon_{2} \hat{P}\left(x^{\prime}\right)}{n(x)+\epsilon_{2}}\\ \hat{P}\left(x^{\prime \prime} \mid x, x^{\prime}\right) &=\frac{n\left(x, x^{\prime}, x^{\prime \prime}\right)+\epsilon_{3} \dot{P}\left(x^{\prime \prime}\right)}{n\left(x, x^{\prime}\right)+\epsilon_{3}} \end{aligned}

马尔科夫模型与n元语法

涉及一个、两个和三个变量的概率公式分别被称为“一元语法”(unigram)、“二元语法”(bigram)、“三元语法”(trigram)模型。

P(x1,x2,x3,x4)=P(x1)P(x2)P(x3)P(x4)P(x1,x2,x3,x4)=P(x1)P(x2x1)P(x3x2)P(x4x3)P(x1,x2,x3,x4)=P(x1)P(x2x1)P(x3x1,x2)P(x4x2,x3)\begin{aligned} &P\left(x_{1}, x_{2}, x_{3}, x_{4}\right)=P\left(x_{1}\right) P\left(x_{2}\right) P\left(x_{3}\right) P\left(x_{4}\right) \\ &P\left(x_{1}, x_{2}, x_{3}, x_{4}\right)=P\left(x_{1}\right) P\left(x_{2} \mid x_{1}\right) P\left(x_{3} \mid x_{2}\right) P\left(x_{4} \mid x_{3}\right) \\ &P\left(x_{1}, x_{2}, x_{3}, x_{4}\right)=P\left(x_{1}\right) P\left(x_{2} \mid x_{1}\right) P\left(x_{3} \mid x_{1}, x_{2}\right) P\left(x_{4} \mid x_{2}, x_{3}\right) \end{aligned}

齐普夫定律(Zipf's law)

ii个最常用单词的频率为
ni1iαlogni=αlogi+cn_i\propto\frac{1}{i^\alpha}\\ \log n_{i}=-\alpha \log i+c

这个分布不仅适用于一元语法,还适用于其他n元语法。

读取长序列数据

序列数据的不同采样方法将导致隐状态初始化的差异。

随机采样(random sampling)

在迭代过程中,来自两个相邻的、随机的、小批量中的子序列不一定在原始序列上相邻。

顺序分区(sequential partitioning)

两个相邻的小批量中的子序列在原始序列上也是相邻的。

循环神经网络

RNN是具有隐状态(hidden state) 的神经网络。

Ht=ϕ(XtWxh+Ht1Whh+bh)Ot=HtWhq+bq\mathbf{H}_{t}=\phi\left(\mathbf{X}_{t} \mathbf{W}_{x h}+\mathbf{H}_{t-1} \mathbf{W}_{h h}+\mathbf{b}_{h}\right) \\ \mathbf{O}_{t}=\mathbf{H}_{t} \boldsymbol{W}_{h q}+\mathbf{b}_{q}

困惑度(perplexity)

用于评价语言模型的质量

exp(1nt=1nlogP(xtxt1,,x1))\exp \left(-\frac{1}{n} \sum_{t=1}^{n} \log P\left(x_{t} \mid x_{t-1}, \ldots, x_{1}\right)\right)

其中PP由语言模型给出,xtx_{t}是在时间步tt从该序列中观测到的实际词元。

这样的度量确保了不同长度的序列具有可比性。

独热编码

将每个词元表示为更具表现力的特征向量。

使用了以下函数

F.one_hot

预测

预热(warm-up)期:循环遍历prefix中的字符,不断将隐状态传递到下一个时间步,但不生成任何输出。在此期间模型会自我更新(例如,更新隐状态),但不会进行预测。

预热期结束后,隐状态的值通常比初始值更适合预测。经预热后再进行预测。

预测时,将每步预测的输出字符作为下一步的输入字符。

梯度裁剪

对于长为TT的序列,在反向传播过程中会产生长为O(T)\mathcal{O}(T)的矩阵乘法链。TT较大时,会导致数值不稳定。可以使用梯度裁剪来稳定训练。

若目标函数ff满足Lipschitz连续,则通过ηg\eta\mathbf{g}更新参数向量时,有

f(x)f(xηg)Lηg|f(\mathbf{x})-f(\mathbf{x}-\eta \mathbf{g})| \leq L \eta\|\mathbf{g}\|

此时,通过控制梯度g\mathbf{g}的模长可以限制ff的变化。

gmin(1,θg)g\mathbf{g} \leftarrow \min \left(1, \frac{\theta}{\|\mathbf{g}\|}\right) \mathbf{g}

  • 梯度裁剪的坏处:限制了取得进展的进度
  • 梯度裁剪的好处:限制了事情变糟的程度

训练

核心代码:

rnn_layer = nn.RNN(len(vocab), num_hiddens)
Y, state_new = rnn_layer(X, state)
# rnn_layer的“输出”Y不涉及输出层的计算:
# 它是指每个时间步的隐状态,这些隐状态可用作后续输出层的输入
# rnn_layer只包括隐藏的循环层,还需创建一个单独的输出层

通过时间反向传播

Lwh=1Tt=1Tl(yt,ot)wh=1Tt=1T((yt,ot)otg(ht,wo)hthtwh\begin{aligned} \frac{\partial L}{\partial w_{h}} &=\frac{1}{T} \sum_{t=1}^{T} \frac{\partial l\left(y_{t}, o_{t}\right)}{\partial w_{h}} \\ &=\frac{1}{T} \sum_{t=1}^{T} \frac{\partial\left(\left(y_{t}, o_{t}\right)\right.}{\partial o_{t}} \frac{\partial g\left(h_{t}, w_{o}\right)}{\partial h_{t}} \frac{\partial h_{t}}{\partial w_{h}} \end{aligned}
htwh=f(xt,ht1,wh)wh+f(xt,ht1,wh)ht1ht1wh\frac{\partial h_{t}}{\partial w_{h}}=\frac{\partial f\left(x_{t}, h_{t-1}, w_{h}\right)}{\partial w_{h}}+\frac{\partial f\left(x_{t}, h_{t-1}, w_{h}\right)}{\partial h_{t-1}} \frac{\partial h_{t-1}}{\partial w_{h}}
htwh=f(xt,ht1,wh)wh+i=1t1(j=i+1tf(xj,hj1,wh)hj1)f(xi,,hi1,wh)wh\frac{\partial h_{t}}{\partial w_{h}}=\frac{\partial f\left(x_{t}, h_{t-1}, w_{h}\right)}{\partial w_{h}}+\sum_{i=1}^{t-1}\left(\prod_{j=i+1}^{t} \frac{\partial f\left(x_{j}, h_{j-1}, w_{h}\right)}{\partial h_{j-1}}\right) \frac{\partial f\left(x_{i,}, h_{i-1}, w_{h}\right)}{\partial w_{h}}

中间值会被缓存、重复使用,以避免重复计算。

矩阵高次幂可能导致神经网络特征值的发散或消失,将以梯度爆炸或梯度消失的形式表现。

截断是计算方便性和数值稳定性的需要,包括:

截断时间步

τ\tau步后截断式中的求和计算。

这样做导致该模型主要侧重于短期影响,而非长期影响。

随机截断

zt=f(xt,ht1,wh)wh+ξtf(xt,ht1,wh)ht1ht1whz_{t}=\frac{\partial f\left(x_{t}, h_{t-1}, w_{h}\right)}{\partial w_{h}}+\xi_{t} \frac{\partial f\left(x_{t}, h_{t-1}, w_{h}\right)}{\partial h_{t-1}} \frac{\partial h_{t-1}}{\partial w_{h}}
其中
P(ξt=0)=1πt 且 P(ξt=πt1)=πtE[zt]=ht/whP\left(\xi_{t}=0\right)=1-\pi_{t} \text { 且 } P\left(\xi_{t}=\pi_{t}^{-1}\right)=\pi_{t} \\ E\left[z_{t}\right]=\partial h_{t} / \partial w_{h}

在实践中并不比常规截断好!

发表评论

%d 博主赞过: