©PaperWeekly 原创 · 作者|苏剑林
单位|追一科技
研究方向|NLP、神经网络
尽管 Transformer 类的模型已经攻占了 NLP 的多数领域,但诸如 LSTM、GRU 之类的 RNN 模型依然在某些场景下有它的独特价值,所以 RNN 依然是值得我们好好学习的模型。而于 RNN 梯度的相关分析,则是一个从优化角度思考分析模型的优秀例子,值得大家仔细琢磨理解。君不见,诸如“LSTM 为什么能解决梯度消失/爆炸”等问题依然是目前流行的面试题之一。
▲经典的LSTM
关于此类问题,已有不少网友做出过回答,然而笔者查找了一些文章(包括知乎上的部分回答、专栏以及经典的英文博客),发现没有找到比较好的答案:有些推导记号本身就混乱不堪,有些论述过程没有突出重点,整体而言感觉不够清晰自洽。为此,笔者也尝试给出自己的理解,供大家参考。
RNN及其梯度
RNN 的统一定义为:
其中 是每一步的输出,它由当前输入 和前一时刻输出 共同决定,而 则是可训练参数。在做最基本的分析时,我们可以假设 都是一维的,这可以让我们获得最直观的理解,并且其结果对高维情形仍有参考价值。之所以要考虑梯度,是因为我们目前主流的优化器还是梯度下降及其变种,因此要求我们定义的模型有一个比较合理的梯度。我们可以求得:
可以看到,其实 RNN 的梯度也是一个 RNN,当前时刻梯度 是前一时刻梯度 与当前运算梯度 的函数。同时,从上式我们就可以看出,其实梯度消失或者梯度爆炸现象几乎是必然存在的:
当
时,意味着历史的梯度信息是衰减的,因此步数多了梯度必然消失(好比
所以步数多了,梯度消失或爆炸几乎都是不可避免的,我们只能对于有限的步数去缓解这个问题。
消失还是爆炸?
说到这里,我们还没说清楚一个问题:什么是 RNN 的梯度消失/爆炸?梯度爆炸好理解,就是梯度数值发散,甚至慢慢就 NaN 了;那梯度消失就是梯度变成零吗?并不是,我们刚刚说梯度消失是