LSTM 与 GRU

弄完这块, 感觉对于 RNN (递归神经网络) 基本就接近尾声了. 相对于 之前的卷积神经网络, 我感觉 RNN 还是相对有意思一些, 也可能是在前面手推 CNN 公式时弄翻车的原因, 以及实在对图像处理那块没啥兴趣, 就搁置了. RNN 的应用, 越发现越广泛, 打算这阶段把理论大致理解后, 代码走一波. 搞搞什么对话机器人, 机器翻译这样的东西来玩一玩.

回顾LSTM

之前在处理关于 RNN 在梯度消失方面, 引入的 LSTM 这样的变体, 它的核心在于, 构造有 3个 所谓 "门" gate 的向量, 具体细节我也没仔细看过, 但中心思想是, 保留早期状态的信息 而不是向咱之前的直接进行覆盖.

在众多的RNN变体中, 应用最为广泛的, 除了 LSTM 还有这里要谈的 GRU.

GRU

Proposed by Cho et al. in 2014 as a simpler alternative to the LSTM.

On the each timestep t, we have input \(x^{(t)}\) and hidden state \(h^{(t)}\) no cell state.

\(u^{(t)} = \sigma(W_u h^{(t-1)} + U_u x^{(t)} + b_u)\) --> update gate

\(r^{(t)} = \sigma(W_r h^{(t-1)} + U_r x^{(t)} + b_r)\) --> reset gate

这有点那种 EM 算法的感觉, 计算, 更新, 计算, 更新....

\(\hat h^{(t)} = tanh(W_h (r^{(t) } * h^{(t-1)}) + U_h x^{(t)} + b_h )\)

\(h^{(t)} = (1-u^{(t)}) * h^{(t-1)} + u^{(t)} * \hat h^{(t)}\)

可以看出, GRU 的出发点跟 LSTM 是一样的, 也是希望能够记住更长的信息. 只不过可以看到, 这里的 GRU 起码在公式上, 是要比 LSTM 要简洁一些的, 同时这也意味着, 其所要维护的参数也相对少的呀.

LSTM 与 GRU

Researches have proposed many gated RNN variants, but LSTM and GRU are the most widely-used. (应用最为广泛的两种RNN变体)

The biggest difference is that **GRU is quicker to compute ** and has fewer parameters. (计算快且需要的参数较少, 就与 LSTM 对比, 它的 gate 只有2个呀)

There is no conclusive evidence (决定性的证据) that one consistently performs better than the other.

LSTM is a good default choice (especially if you data has particularly long dependencies, or you have lots of training data).

Rule or thumb start with LSTM, (一般来说, 可先尝试用 LSTM) , but switch to GRU if you want something more efficient. (等训练的结构基本稳定下来了, 可再换为GRU, 这样模型也会跑得更快哦)

Vanishing / Exploding Grandient

关于这个梯度消失, 梯度爆炸的问题, 其实不仅仅是只有 RNN 特有的. It can be a problem for all neural architectures (including **feed-forward, convolutional) especially **deep ones. 就咱传统的 F-B (前向, 后向) 人工神经网络, 多层的卷积神经网络, 都是会从存在的, 尤其在深度学习中更加常见.

从网络结构, 从数学上看, 对于梯度消失, 表明节点间没有什么**"关联性" **了. (导数的物理意义, "变化率"); 而对于梯度爆炸, 则参数很难去更新. (梯度下降法) . 导致模型都训练不了啦.

如果要论本质原因, 即现在的网络训练都是基于 BP 算法的呀.

  • BP 算法的原理, 就是多元函数求偏导, 这个过程应用到, 求导的 链式法则
  • Thus lower layers are learnt very slowly (hard to train)

solve

从总体的解决方案上来看呢, 在 BP 训练中, 有大致这么几种方式来处理.

  • Skip - connections : 让误差向后传播的时候呢, 给跳跃式的传递, 而不必一层层地传
  • Dence connections aka "DenceNet" 后一层直接跟前面的所有层都产生联系, 让误差就一步传递过去这样子.
  • HightWay connections aka "HightWayNet". 思路也差不多, 只不过在连接的时候, 多了些 gate. 现在也不咋用

总之, 结论是: Though vanishing / exploding gradients are a general problem, RNN are particularly unstable due to the repeat multiplication by the same weight matrix . 还是 RNN 这种权值矩阵复用所带来的让人又爱又恨的问题呀.

小结

从最初的 RNN 认识其核心的特点, "权值矩阵复用, 和上一个的输出作为, 下一个状态的输入" 来认识这种新的神经网络, 然后到, 权值矩阵复用, 会带来, 梯度消失 和 梯度爆炸的问题, 这两个极端的会让训练出来的网络是错误的或者根本训练不了网络结构. 因而引出了一些 RNN 的变体, 重点瞧了一波 LSTM 和 GRU. 通过这种很多的 "gate" 的向量, 来保存 RNN 更早期的状态信息, 来试图解决梯度消失的问题. 而GRU 跟 LSTM 类似, 也是通过这种 gate 的思路 update, reset .. 但GRU 的效率会更高( 毕竟门少了, 参数也少了嘛).

就到这, 后面如果有兴趣, 再去看一些更多的变体, 如 双向的 RNN 和 多层的 RNN . 我其实有瞟过一眼, 感觉有点难..暂时就不搞了..等稍微理解了再补上来吧.

posted @ 2020-03-21 18:21  致于数据科学家的小陈  阅读(629)  评论(0编辑  收藏  举报