循环神经网络 RNN

  • 序列建模

    • 传统思维:给定一组相关属性,来推断最终的结果,但是不会考虑时间的属性,比如给你小名的成绩单,你只考虑他的几次考试的成绩,但是不考虑考试时间,那么期末成绩预测就不一定准确
    • 包含时间变量:类似于输入一句话,每个单词都有其顺序,所以顺序不同的话其对应的重要性应该也不能相同。输出也可以按照时间序列展开输出,例如chat回答问题不是一下子一整段话
    • 公式 $S_t = f(W_i X + W_S S_{t-1} + b) $
    • 常见示意图:
      • 这里我们理解为通过一个 WhhW_{hh} 矩阵不断更新隐藏层的状态,使得其带有上一帧的属性,具有一定的记忆力
  • 反向传播

    • 基于时间关系的逆向传播 Backpropagation Through Time

    • 梯度爆炸问题:由于链式法则一路上乘了很多很大的矩阵,结果数据很大,很难看出要求的梯度

      • 通过梯度裁剪方法,缩放大梯度
    • 梯度消失问题:链式法则乘了很多很小的矩阵结果数据很小也难看出梯度

        1. 选择合适的激活函数
        • 例如 ReLUReLU 函数的导数为 1 可以让导数不要衰减
        1. 合理地初始化权重矩阵
        • 例如令最初的矩阵为单位矩阵,这样就不会出现权重变得很小的情况
        1. 对神网架构重新设计
        • 使用门控细胞 (Gated Cells)

          • 其中最有名的一类叫 LSTM (Long Short Term Memory), 能更好的维护长期依赖关系,也能反向传播很长距离而不出现梯度消失的问题

          • 如上图所示,信息通过激活函数和加乘的方式进入或者删除

            1. 遗忘门: 遗忘无关信息,取前一轮的状态通过sigmoid
            1. 记忆门:判断哪部分新信息是相关的,哪部分旧信息是无关的,将其存储到细胞结构之中
            1. 更新细胞状态:对于中间量 ctc_t 进行更新
            1. 输出层:输出并且传输给下一层
          • 好处:

              1. 输出保持一个独立的单元状态 ctc_t
              1. 反向传播的时候梯度流不会间断,直接一路从 cc 走下去,相比 RNN 的 hth_t 计算简便很多
    • 以上均称为长程传播问题

      • 远距离效果差
  • 实践