0%

循环神经网络

RNN

循环层:

\[ \mathbf{H}_t = \phi(\mathbf{X}_t \mathbf{W}_{xh} + \mathbf{H}_{t-1} \mathbf{W}_{hh} + \mathbf{b}_h). \]

隐状态循环神经网络

困惑度损失函数:

一个更好的语言模型应该能让我们更准确地预测下一个词元。 因此,它应该允许我们在压缩序列时花费更少的比特。 所以我们可以通过一个序列中所有的 n 个词元的交叉熵损失的平均值来衡量:

\[ \frac{1}{n} \sum_{t=1}^n -\log P(x_t \mid x_{t-1}, \ldots, x_1) \]

困惑度即更流行的指数形式交叉熵(历史原因):

\[ \exp\left(-\frac{1}{n} \sum_{t=1}^n \log P(x_t \mid x_{t-1}, \ldots, x_1)\right). \]

  • 在最好的情况下,模型总是完美地估计标签词元的概率为1。 在这种情况下,模型的困惑度为1。
  • 在最坏的情况下,模型总是预测标签词元的概率为0。 在这种情况下,困惑度是正无穷大。
  • Baseline:该模型的预测是词表的所有可用词元上的均匀分布? 在这种情况下,困惑度等于词表中唯一词元的数量。 事实上,如果我们在没有任何压缩的情况下存储序列, 这将是我们能做的最好的编码方式。 因此,这种方式提供了一个重要的上限, 而任何实际模型都必须超越这个上限。

初始化状态

使用onehot编码来代替直接输入索引值

预热期:更新隐状态信息但不计算预测

初始化隐状态

  • 顺序分区:下一个minibatch和当前minibatch取得的时间步相邻。因此当前minibatch的隐状态可以用于初始化下一个minibatch。 为了降低计算量,在处理任何一个minibatch数据之前, 我们先分离梯度,使得隐状态的梯度计算总是限制在一个minibatch数据的时间步中。
  • 随机分区:每个minibatch需要重新初始化隐状态。

时间步反向传播BBTT:

对于每个时间步计算隐状态和输出,有:\(h_t = f(x_t, h_{t-1}, w_h),o_t = g(h_t, w_o)\)。在反向传播时,\(L\)依赖于所有的\(o_t\),即\(L(x_1, \ldots, x_T, y_1, \ldots, y_T, w_h, w_o) = \frac{1}{T}\sum_{t=1}^T l(y_t, o_t).\)。因此在\(L\)\(W_h\)求梯度时,有:

\[ \frac{\partial L}{\partial w_h} = \frac{1}{T}\sum_{t=1}^T \frac{\partial l(y_t, o_t)}{\partial o_t} \frac{\partial g(h_t, w_o)}{\partial h_t} \frac{\partial h_t}{\partial w_h} \]

其中 \(h_t\) 递归依赖于 \(h_{t-1}\)\(h_{t-1}\)同样依赖于\(w_h\),造成递归依赖,因此计算链式法则会很长,化简结果为:

\[ \frac{\partial h_t}{\partial w_h}=\frac{\partial f(x_{t},h_{t-1},w_h)}{\partial w_h}+\sum_{i=1}^{t-1}\left(\prod_{j=i+1}^{t} \frac{\partial f(x_{j},h_{j-1},w_h)}{\partial h_{j-1}} \right) \frac{\partial f(x_{i},h_{i-1},w_h)}{\partial w_h}. \]

截断反向传播

显然完全计算整条时间链是非常昂贵的,而且容易梯度爆炸蝴蝶效应。

常规截断时间步:即常用的detach state。把state链限定在相同长度的时间碎片内。

随机截断时间步:使用一个随机变量替换\(\partial h_t/\partial w_h\)。 这个随机变量是通过使用序列 \(ξ_t\) 来实现的。 \(ξ_t\) 定义:对于$ 0≤π_t≤1 $, 其中 \(P(ξ_t=0)=1−π_t\) 且 $P(ξ_t=π^{−1}_t)=π_t $, 因此 \(E[ξ_t]=1\)。,将\(ξ_t\)放在\(\frac{\partial h_t}{\partial w_h}\)中,得到:

\[ X_t= \frac{\partial f(x_{t},h_{t-1},w_h)}{\partial w_h} +\xi_t \frac{\partial f(x_{t},h_{t-1},w_h)}{\partial h_{t-1}} \frac{\partial h_{t-1}}{\partial w_h}. \]

\(ξ_t=0\)时即会截断递归。通过\(E[ξ_t]=1\),得到\(E[X_t] = \partial h_t/\partial w_h\)。即不改变期望值,但是截断反向传播。

梯度裁剪

使用给定半径 \(θ\) 的球来裁剪梯度 \(g\)\(g < θ\) 则不变,$ g > θ $ 则裁剪到 \(θ\) , 并且更新后的梯度完全与 \(g\) 的原始方向对齐。 它还有一个值得拥有的副作用, 即限制任何给定的小批量数据(以及其中任何给定的样本)对参数向量的影响, 这赋予了模型一定程度的稳定性。 如下式:

\[ \mathbf{g} \leftarrow \min\left(1, \frac{\theta}{\|\mathbf{g}\|}\right) \mathbf{g}. \]

语言模型处理

文本计数问题

拉普拉斯平滑 具体方法是在所有计数中添加一个小常量。 用 n 表示训练集中的单词总数,用 m 表示唯一单词的数量

\[\begin{split}\begin{aligned} \hat{P}(x) & = \frac{n(x) + \epsilon_1/m}{n + \epsilon_1}, \\ \hat{P}(x' \mid x) & = \frac{n(x, x') + \epsilon_2 \hat{P}(x')}{n(x) + \epsilon_2}, \\ \hat{P}(x'' \mid x,x') & = \frac{n(x, x',x'') + \epsilon_3 \hat{P}(x'')}{n(x, x') + \epsilon_3}. \end{aligned}\end{split}\]

注意词频以一种明确的方式迅速衰减。齐普夫定律(Zipf’s law), 即第 i 个最常用单词的频率 \(n_i\) 为:\(n_i \propto \frac{1}{i^\alpha}\),等价于\(\log n_i = -\alpha \log i + c\)

因此对不常用单词进行计数统计和平滑建模是不可行的。

深度学习模型读取长数据

从随机偏移量开始划分序列, 以同时获得覆盖性(coverage)和随机性(randomness)

随机分区顺序分区

编码器-解码器

训练模式和预测模式

训练模式中,解码器的输入可以就是真实label,而无需逐时间步计算出新的output,再给到下一个时间步进行计算。

预测模式中,由于不知道解码器真实label,因此必须要按照正常的RNN计算方式,逐时间步计算output和state,并且把output和state再给到下一个时间步进行计算。