RNN 中为什么要采用 tanh,而不是 ReLU 作为激活函数?

您所在的位置:网站首页 为什么卷积要翻转 RNN 中为什么要采用 tanh,而不是 ReLU 作为激活函数?

RNN 中为什么要采用 tanh,而不是 ReLU 作为激活函数?

2023-03-24 17:31| 来源: 网络整理| 查看: 265

来尝试回答下。其实题主的问题可以拆分成下面两个部分:

为什么在CNN等结构中将原先的sigmoid、tanh换成ReLU可以取得比较好的效果?为什么在RNN中,将tanh换成ReLU不能取得类似的效果?

先来简单讨论下第一个问题。设输入数据为 x ,对 x 的卷积操作就可以看做是 Wx+b (如果不理解为什么,可以参考这个答案的前半部分:如何理解深度学习中的deconvolution networks?)。我们设第一层卷积的参数为 W_1, b_1 ,第二层卷积的参数是 W_2, b_2,依次类推。又设激活函数为 f ,每一层卷积在经过激活函数前的值为 a_i ,经过激活函数后的值为 f_i 。

按照上面的表示,在CNN中,输入 x ,第一层的输出就是 f_1=f[W_1x+b_1] ,第二层的输出就是 f_2= f[W_2f[W_1x+b_1]+b_2] ,第三层的输出就是 f_3= f[W_3f[W_2f[W_1x+b_1]+b_2]+b_3] 。设最终损失为 L ,我们来尝试从第三层开始,用BP算法推导一下损失对参数 W_1 的偏导数,看看会发生什么。

为了简洁起见,略过求导过程,最后的结果为 \frac{\partial{L}}{\partial{W_1}}=\frac{\partial{L}}{\partial{f_3}}\frac{\partial{f_3}}{\partial{a_3}}W_3\frac{\partial{f_2}}{\partial{a_2}}W_2\frac{\partial{f_1}}{\partial{a_1}}\frac{\partial{a_1}}{\partial{W_1}} 。我们常常说原始神经网络的梯度消失问题,这里的 \frac{\partial{f_3}}{\partial{a_3}} 、 \frac{\partial{f_2}}{\partial{a_2}} 就是梯度消失的“罪魁祸首”。例如sigmoid的函数,它的导数的取值范围是(0, 0.25],也就是说对于导数中的每一个元素,我们都有 0

也就是说在RNN中直接把激活函数换成ReLU会导致非常大的输出值。为了讲清楚这一点,我们先用同上面相似的符号把原始的RNN表示出来:

a_i=Wf_{i-1}+Ux_{i}+b_i,

f_i=f[a_i]

在这个表示中,RNN每个阶段的输入是 x_i ,和CNN每一层使用独立的参数 W_i 不同,原始的RNN在每个阶段都共享一个参数 W 。如果我们假设从某一层开始输入 x_i 和偏置 b_i 都为0,那么最后得到的输出就是 f[W...[Wf[Wf[Wf_i]]]] ,这在某种程度上相当于对参数矩阵 W 作连乘,很显然,只要 W 有一个大于1的特征值,在经过若干次连乘后都会导致结果是一个数值非常庞大的矩阵。

另外一方面,将激活函数换成ReLU也不能解决梯度在长程上传递的问题。同样考虑 f_3 对 W 的导数。在CNN中,每一层的参数 W_1,W_2,W_3...... 是互相独立的,然而RNN中 W 参与了每个时间段的运算,因此 f_3 对 W 导数更复杂,写出来是 \frac{\partial{f_3}}{\partial{W_1}}=\frac{\partial{f_3}}{\partial{a_3}}f_2+\frac{\partial{f_3}}{\partial{a_3}}W\frac{\partial{f_2}}{\partial{a_2}}f_1+\frac{\partial{f_3}}{\partial{a_3}}W\frac{\partial{f_2}}{\partial{a_2}}W\frac{\partial{f_1}}{\partial{a_1}}\frac{\partial{a_1}}{\partial{W_1}} 。我们可以看下最后 \frac{\partial{f_3}}{\partial{a_3}}W\frac{\partial{f_2}}{\partial{a_2}}W\frac{\partial{f_1}}{\partial{a_1}}\frac{\partial{a_1}}{\partial{W_1}} 这部分,使用ReLU后,当梯度可以传递时,有 \frac{\partial{f_3}}{\partial{a_3}}=\frac{\partial{f_2}}{\partial{a_2}}=\frac{\partial{f_3}}{\partial{a_1}}=1 ,但这个式子中还是会有两个 W 的连乘。在更长程上,就会有更多 W 的连乘。对于CNN来说,这个部分是 W_1,W_2,W_3..... 进行连乘,一方面它们都是稀疏矩阵,另一方面 W_1,W_2,W_3.... 互不相同,很大程度上都能抵消掉梯度爆炸的影响。

最后,IRNN在RNN上使用了ReLU,取得了比较好的结果,其中的原因在于,它对 W 和 b_i 取了比较特殊的初值: W=I , b_i=0 。这样在梯度的式子 \frac{\partial{f_3}}{\partial{a_3}}W\frac{\partial{f_2}}{\partial{a_2}}W\frac{\partial{f_1}}{\partial{a_1}}\frac{\partial{a_1}}{\partial{W_1}} 中W尽管会连乘,但是会类似于单位矩阵 I 的连乘,不会引起太明显的梯度数值变化。另外一方面,也不会引起非常大的输出值(这点可以自行带入表达式验证)。

以上,如果有哪里说的不对的,还烦请各位大佬批评指正。

--------------------------------------

PS:有人知道为什么知乎的latex一打圆括号()就无法显示么。。。没办法只好把所有f()写成f[]了。。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3