LSTM该不该使用RELU?

来源:互联网 发布:网络主播招聘是真的吗 编辑:程序博客网 时间:2024/06/10 11:34

首先看下现在常用的激活函数

最常见的就是σ函数
σ(x)=11+ex
其用在早期的神经网络中,但是多层神经网络存在梯度消失的问题。
tanh函数如下:
tanh(x)=exexex+ex
tanh函数也和σ函数类似,存在梯度消失的问题。
近些年来,在卷机神经网络中使用了Relu函数,发现解决了深度神经网络梯度消失的问题,Relu的表达式如下:
Relu(x)=max(0,x)
Relu函数在神经元的值大于零的时候,Relu的梯度恒定为1,梯度在大于零的时候可以一直被传递。而且ReLU 得到的SGD的收敛速度会比 σ、tanh 快很多。
ReLU函数在训练的时候,一不小心有可能导致梯度为零。由于ReLU在x<0时梯度为0,这样就导致负的梯度在这个ReLU被置零,这个神经元有可能再也不会被任何数据激活,这个ReLU神经元坏死了,不再对任何数据有所响应。实际操作中,如果设置的learning rate 比较大,那么很有可能网络中的大量的神经元都坏死了。如果开始设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。
还有一些其他对Relu函数的变种:
Leaky ReLU。Leaky ReLU是用来解决ReLU神经元坏死的问题。
LeakyReLU(x)=max{αx,x}
这里可以看出,当x小于0的时候,Relu函数不在是输出0,而是一个带有很小斜率的线形函数αx,这里的α很小,一般为0.2、0.1、0.01等等之类,很小的斜率。这样,既修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。但是具体的效果,对于不同的神经网络,提升并不是统一的,需要根据自己的需要决定采用那种。
一些激活函数如下表所示:
这里写图片描述
话题回到开始讨论的问题。
LSTM到底该不该使用Relu函数作为其激活函数?在默认的情况下,LSTM使用tanh函数作为其激活函数。从一个帖子的讨论得出一些眉目:https://www.reddit.com/r/MachineLearning/comments/2t1rsp/lstm_question/
看到当LSTM组成的神经网络层数比较少的时候,才用其默认饿tanh函数作为激活函数比Relu要好很多。随着LSTM组成的网络加深,再继续使用tanh函数,就存在了梯度消失的的风险,导致一直徘徊在一个点无法搜索最优解,这种情况下,可以采用Relu函数进行调整,注意学习率需要变地更小一点防止进入死神经元。
在使用tensorflow时候,使用库函数构造rnn时候,可以通过activation参数来指定激活函数类型。

原创粉丝点击