深度学习:算法到实战学习笔记03

本次的主题为循环神经网络
笔记内容来源:视频

绪论

循环神经网络的应用

  • 语音问答
  • 机器翻译
  • 股票预测
  • 作诗
  • 模仿写论文

循环神经网络 vs 卷积神经网络

  • 循环神经网络可以处理上下文关系。
  • 其发展方向是:处理更多的上下文的关系。

与卷积网络的不同:

  • 传统神经网络,卷积神经网络,输入与输出之间是相互独立的。
  • RNN 可以更好的处理具有时序关系的任务
  • RNN 通过其循环结构引入“记忆”的概念
    • 输出不仅依赖于输入,还依赖于"记忆"
    • 将同一个结构循环利用

RNN 的基本结构

特点:

  • 隐层的数据被存入到一个“记忆”单元中
  • 存在“记忆”中的数据会被作为另外一个输入与原始输入一起输入到神经网络中

基本结构:

  • 两种输入:正常的输入+记忆单元中的值
  • 两种输出:正常的输入+要存储到记忆单元中的值
  • 一种函数

  • f 被不断重复利用
  • 模型所需要学习的参数是固定的
  • 无论输入的长度是多少,都只需要一个函数 f

深度 RNN

普通的 RNN 是在横向上延伸,深度 RNN 可以在纵向上延伸。

即:RNN 层下面又是一个 RNN 层

双向 RNN

两个传递方向相反的 RNN 网络,然后由一个函数 f,将对应的值整合输出。

小结

  • 隐层状态 h 可以被看作是“记忆”,因为它包含了之前时间点上的相关信息。
  • 输出 y 不仅由当前的输入所决定,还会考虑到之前的“记忆”。由两者共同决定。
  • RNN 在不同时刻共享同一组参数(U,W,V),极大的减少了需要训练和预估的参数量。

BPTT 算法

BPTT 算法与 BP 算法的过程基本一致,但是,由于在 RNN 中,当前的输入会依赖于上一次的输出,因此,需要对求导公式做进一步的拆分。

以 E=3 为例:

![[Pasted image 20240526140748.png]]

循环神经网络的变种

传统 RNN 的问题

  • 当循环神经网络在时间维度上非常深的时候,会导致梯度消失(大多数时候)或者梯度爆炸的问题(很少,但是一般出现就训练失败)。
    • 其 BPTT 公式导致的

梯度爆炸

  • 梯度爆炸导致的问题:模型训练不稳定,梯度会变为 Nan(无效), Inf
  • 优化梯度爆炸的方式:
    • 权重衰减:L 2 权重衰减
    • 梯度截断:检查误差梯度的值是否超过了阈值,如果超过了,那么就截断梯度,将梯度设置为阈值。

梯度消失

  • 梯度消失导致的问题:长时依赖问题
    • 随着时间间隔不断增大,RNN 会丧失学习到连接如此远的消息的能力。
  • 改进:
    • 改进模型
    • LSTM,GRU

LSTM

  • LSTM 有三个门(遗忘门,输入门,输出门),来保护和控制细胞状态
  • 遗忘门:决定丢弃信息
    • ft=σ(Wf[ft1,xt]+bf)f_{t}=\sigma(W_{f}*[f_{t-1},x_{t}]+b_{f})
    • σ\sigmasigmoid 函数
    • sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过,0 代表"不允许任何量通过",1 指"允许任意量通过"
      • 可以以一定的比例来遗忘存放在 memory 中的信息
  • 输入门:确定需要更新的信息
    • it=σ(Wi[ht1,xt])i_{t}=\sigma(W_{i}*[h_{t-1},x_{t}])Ct~=tanh(WC[ht1,xt]+bC)\tilde{C_{t}} = tanh(W_{C}*[h_{t-1},x_{t}]+b_{C})
    • 首先经过 sigmoid 层决定什么信息需要更新,然后通过 tanh 层输出备选的需要更新的内容,然后加入新的状态中。
    • 0 代表“不更新”,1 代表“完全更新”
    • 新的 CtC_{t}Ct=ftCt1+itCt~C_{t}=f_{t}*C_{t-1}+i_{t}*\tilde{C_{t}}
    • Ct1C_{t-1}CtC_{t} 是线性交互,因此其变化较慢。
  • 输出门:输出信息
    • ot=σ(Wo[ht1,xt]+bo)o_{t}=\sigma(W_{o}[h_{t-1},x_{t}]+b_{o})ht=ottanh(Ct)h_{t}=o_{t}*tanh(C_{t})
    • 首先,通过 sigmoid 来确定细胞状态的哪个部分将输出出去。然后,将细胞状态通过 tanh 进行处理并将它和 sigmoid 门的输出相乘,最终仅仅会输出我们确定输出的那部分。
    • 0 代表不输出,1 代表完全输出

RNN 与 LSTM

  • RNN 和 LSTM 对记忆的处理方式不同
  • RNN 的“记忆”在每个时间点都会被新的输入覆盖,但 LSTM 中“记忆”是与新的输入相加。
  • LSTM:如果前边的输入对 ctc_{t} 产生了影响,那这个影响会一直存在,除非遗忘门的权重为 0。
  • 小技巧:LSTM 中 learning rate 可以被尽量的设置小(LSTM无法解决梯度爆炸的问题);遗忘门的权重可以设置的大一些

小结

  • LSTM 有三个门计算,即遗忘门,输入门,输出门。
  • LSTM 的一个初始化技巧就是将输出门的 bias 置为正数(比如 1 或 5),这样模型刚开始训练时 forget gate 的值接近于 1,不会发生梯度消失。
  • 可以使用 GRU 解决 LSTM 的复杂的运算。

GRU

差异:

  • GRU 只有两个门,分别为重置门与更新门
  • 混合了细胞状态和隐藏状态
  • 重置门:控制忽略前一时刻的状态信息的程度,重置门越小说明忽略的越多。
  • 更新门:控制前一时刻的状态信息被带入到当前状态中的程度,更新门值越大表示前一时刻的状态信息带入越多
    相似:
  • 从 t-1 到 t 时刻的记忆的更新都引入加法
  • 可以防止梯度消失

扩展

解决 RNN 梯度消息的其他方法

  • clockwise RNN:普通 RNN 都是隐层从前一时间步连接到消瘦时间步。而其把隐层分成很多组,每组有不同的循环周期,有的周期是 1,有的周期更长(例如从前两个时间步连接到当前时间步,不同周期的 cell 之间也有一些连接)这样一来,距离较远的某个依赖关系就可以通过周期较长的 cell 少数几次循环访问到,从而网络层数不太深,更容易学习。

基于 attention 的 RNN

attention:是受到人类注意力机制的启发。人们在进行观察图像的时候,大多是根据需求将注意力集中到图像的特定部分。而且人类会根据之前观察的图像学习到未来要观察图像注意力应该集中的位置。

处理的过程如下: