@(Aaron)[机器学习 | 循环神经网络]

主要内容包括:

  • 基于循环神经网络的语言模型,提供了从零开始的实现与简洁实现
  • 代码实践

循环神经网络的构造

  循环神经网络(Recurrent Neural Network)是一类用于处理序列数据的神经网络。序列数据的特点是后面的数据跟前面的数据有关系。基础的神经网络只在层与层之间建立了权连接,而循环神经网络在层内的神经元之间也建立的权连接。具体来说就是循环神经网络的每一个神经元除了当前的输入信息之外还包含之前网络的输出信息。这样做相当于赋予网络记忆,使得当前的输出依赖于当前的输入和记忆。基础的循环神经网络如图1所示有两种表示方法,每张图片左边是RNN的结构,右边是按时间轴展开后的情况。

序列问题预测回归——循环神经网络(Recurrent Neural Network)

  这是一个标准的RNN结构图,图中每个箭头代表做一次变换,也就是说箭头连接带有权值。损失L衡量每个 oo 与相应的训练目标yy 的距离。当使用softmaxsoftmax输出时,我们假设oo是未归一化的对数概率。损失L内部计算y^=softmax(o)hat{y} =softmax(o),并将其与目标 yy 比较。RNN输入到隐藏的连接由权重矩阵UU参数化,隐藏到隐藏的循环连接由权重矩阵WW参数化以及隐藏到输出的连接由权重矩阵 $V $参数化。式(1-4)定义了该模型中的前向传播。

a(t)=b+Wh(t1)+Ux(t)mathrm{a}^{(t)}=b+W h^{(t-1)}+U x^{(t)}

h(t)=tanh(a(t))mathrm{h}^{(t)}=tanh left(a^{(t)}right)

o(t)=c+Vh(t)mathrm{o}^{(t)}=c+V h^{(t)}
y^(t)=softmax(o(t))hat{y}^{(t)}=operatorname{softmax}left(o^{(t)}right)

  基础的循环神经网络一直受到长期依赖和短时记忆的困扰。当一条序列足够长时,由于结构的加深,使得网络很难学习到从较早时间步传递过来的信息。因此,如果你正在尝试处理一段文本的预测,循环神经网络很可能遗忘开始的重要信息。在反向传播期间,循环神经网络会面临梯度消失(大部分情况下)或梯度爆炸(很少,但对优化过程影响很大)的问题。梯度用于更新网络权重,当梯度随着网络的加深而变得非常小甚至接近于零时,网络就会停止学习,梯度爆炸的问题相反。为了解决这个问题,又出现了一些改进的循环神经网络LSTM和GRU是其中最具代表性并且应用最广泛的。

裁剪梯度

  循环神经网络中较容易出现梯度衰减或梯度爆炸,这会导致网络几乎无法训练。裁剪梯度(clip gradient)是一种应对梯度爆炸的方法。假设我们把所有模型参数的梯度拼接成一个向量 ,并设裁剪的阈值是。裁剪后的梯度

min(θy,1)gmin left(frac{theta}{|boldsymbol{y}|}, 1right) boldsymbol{g}

L2L_{2}范数不超过θtheta

代码实践

参考:https://github.com/Sandy1230/Dive-into-DL-PyTorch-master

  • 时间序列预测