4.7.1 循环神经网络基本模型

4.7.1.1 单向循环神经网络

模型描述:

  • 输入:\(X_t\)向量表示\(t\)时刻输入层的值。
  • 隐藏层:\(A_t\)向量表示\(t\)时刻隐藏层的值,隐藏层的节点数与向量\(A_t\)的维度相同。
  • 输入层到隐藏层权重矩阵:\(U\)向量表示输入层到隐藏层的权重矩阵。
  • 隐藏层到输出层的权重矩阵:\(V\)向量表示隐藏层到输出层的权重矩阵。
  • 上次输出权重矩阵:隐藏层的值\(At\)不仅仅取决于当前这次的输入\(X_t\),还取决于上一次隐藏层的值\(A{t-1}\)。权重矩阵 W就是隐藏层上一次的值作为这一次的输入的权重。
  • 输出层:\(o\)向量表示输出层的值。

单向循环神经网络模型

特点:

  1. 循环神经网络神经元的输出在下一个时间戳直接作用到自身,理论上神经元的输出可以受前面任意多个时刻输入的影响。而在前馈神经⽹络中,信息总是向前传播,从不反向回馈。
  2. 理论上循环神经网络可以处理任意长度的输入。
  3. 循环神经网络拥有记忆功能(中间状态也被保存下来),解决了无法对时间序列上的变化进行建模问题,利用历史的信息,可以一起用于预测输出序列,解决一些重要复杂的问题。
  4. 循环神经网络是一个在时间上传递的神经网络,随着时间深度的加长,也会出现“梯度消失”或“梯度爆炸”现象,即RNN 会丧失学习到连接很远的信息的能力。

4.7.1.2 双向循环神经网络

  • 正向计算和反向计算不共享权重。
  • 在序列信号分析中,同时利用历史和未来的信息,来解决某些复杂的问题。

双向循环神经网络模型

4.7.1.3 BPTT算法(沿时间反向传播)

沿时间反向传播算法—Backpropgattion Through Time

  1. 前向计算每个神经元的输出值。
  2. 反向计算每个神经元的误差项值,它是代价函数\(C\)对神经元j的加权输入的偏导数
  3. 计算每个权重的梯度。
  4. 最后再用随机梯度下降算法更新权重。

4.7.2 长短时间记忆循环神经网络

长短时间记忆循环神经网络可以解决在时间上梯度消失的问题,通过门的开关实现记住长期信息的功能,从而可以学习长期依赖信息。广泛应用于语音识别、图片描述、自然语言处理等领域中。

4.7.2.1 LSTM概述

  1. 信息被存放在循环网络正常信息流之外的门控单元中,通过门控制单元存储、写入或读取信息。通过门的开关判定存储哪些信息,以及何时允许读取、写入或清除信息。
  2. 门依据接收到的信号并用自有的权重集对信息进行筛选,根据其强度和导入内容决定是否允许信息通过。这些权重会通过循环网络的学习过程进行调整。
  3. 门是一种让信息选择式通过的方法,包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作,Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。

4.7.2.2 LSTM模型

基本模型:

  • 在RNN的隐藏层增加一个新的状态\(C\),让它来保存长期的状态,称为单元状态(cell state)。
  • 输入:当前时刻网络的输入值\(Xt\)、上一时刻LSTM的输出值\(h{t-1}\)、以及上一时刻的单元状态\(C_{t-1}\)。
  • 输出:当前时刻LSTM输出值\(h_t\)、和当前时刻的单元状态\(C_t\)。

LSTM模型

长期单元状态\(C\)的控制:

  • 开关1负责控制继续保存长期单元状态\(C_{t-1}\)。
  • 开关2负责控制把即时状态\(C_t’\)输入到长期单元状态\(C_t\)。
  • 开关3负责控制是否把长期单元状态\(C_t\)作为当前的输出\(h_t\)。

长期单元状态控制

LSTM模型参数:共有八组:

  1. 正向传播:遗忘门的权重矩阵\(w_f\)和偏置项\(b_f\);输入门的权重矩阵\(w_i\)和偏置项\(b_i\);输出门的权重矩阵\(w_o\)和偏置项\(b_o\);以及计算单元状态的权重矩阵\(w_C\)和偏置项\(b_C\)。
  2. 反向传播:遗忘门的权重矩阵\(w_f’\)和偏置项\(b_f’\);输入门的权重矩阵\(w_i’\)和偏置项\(b_i’\);输出门的权重矩阵\(w_o’\)和偏置项\(b_o’\);以及计算单元状态的权重矩阵\(w_C’\)和偏置项\(b_C’\)。

4.7.2.3 LSTM工作原理:

  1. 第一步:通过一个忘记门决定从上一个长期单元状态中丢弃什么信息。该门会读取 \(h{t-1}\)和\(x_t\),输出一个在 0 到 1之间的数值,给长期单元状态 \(C{t-1}\),1 表示“完全保留”,0 表示“完全舍弃”。
  2. 第二步:确定什么样的新信息被存放在当前的即刻长期单元状态中 sigmoid 层称 “输入门层” 决定将要更新什么值:\(it=σ(w_i [h{t-1},xt]+ b_i)\) tanh 层创建一个新的候选值向量\(C_t’\),会被加入到状态中:$$C_t’=tanh(w_C [h{t-1},x_t ]+ b_C)$$
  3. 第三步:更新长期单元状态信息。将\(C{t-1}\)更新为 \(C_t\),把旧状态\(C{t-1}\)与 \(ft \) 相乘,丢弃掉确定需要丢弃的信息,接着加上\(i_tC_t’\)这就是新的候选值,决定更新每个状态的程度进行变化。 $$C_t=f_tC{t-1}+i_t*C_t’$$
  4. 最后一步:基于长期单元状态信息确定输出值。首先运行 sigmoid 层确定单元状态的哪个部分将输出出去,接着把单元状态通过 tanh进行处理(得到一在-1到1之间的值)并将它和 sigmoid 门的输出相乘,最终仅仅会输出确定要输出的那部分。
存在的问题:只能记住10-20个时间状态。