Tensorflow LSTM选择Relu激活函数与权重初始化、梯度修剪解决梯度爆炸问题实践

1. 梯度爆炸问题

我最近研究多层LSTM在时序业务场景中的应用,如果基于Keras框架实现的时候,激活函数使用Relu,训练速度比较快而且效果也好,但是基于Tensorflow框架实现的时候,如果把激活函数由默认tanh换成Relu时,训练过程中出现了如下问题:
在这里插入图片描述
深度学习模型训练中途出现cost突然变大,或许几经周折降下来,不过大多数还是暴涨,出现了“nan”。

cost:  0.00532
......
cost:  1097.2125
cost:  nan
cost:  nan
复制代码

其中,激活函数设置如下:

        #更换默认tanh激活函数
        cell_list = tf.contrib.rnn.BasicLSTMCell(self.cell_size, 
                                                 forget_bias=1.0, 
                                                 state_is_tuple=True, 
                                                 activation=tf.nn.relu) 
复制代码

模型初始化权重:

    def _weight_variable(self, shape, name='weights'):
        initializer = tf.random_normal_initializer(mean=0., stddev=1.0,)
        return tf.get_variable(shape=shape, initializer=initializer, name=name)

    def _bias_variable(self, shape, name='biases'):
        initializer = tf.constant_initializer(0.1)
        return tf.get_variable(name=name, shape=shape, initializer=initializer)
复制代码

其实,出现这种问题是深度学习训练中常见的典型梯度爆炸问题。

2. 解决方案

2.1. 换回tanh激活函数?

本实践案例中,目标是采用的激活函数是Relu。

relu(x)=max(x,0)={x,x00x<0relu(x)=max(x,0)= \left\{\begin{matrix} x, & x\geqslant 0\\ 0 & x<0 \end{matrix}\right.

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享