循环神经网络中的梯度消失或梯度爆炸问题产生原因分析

循环神经网络中,通过时间反向传播(backpropagation through time,BPTT)实际上是循环神经网络中反向传播技术的一个特定应用。

(1)它要求我们将循环神经网络的计算图以此展开一个时间步,以获得模型变量和参数之间的依赖关系

(2)然后,基于链式法则,应用反向传播来计算和存储梯度。

(3)由于序列可能相当长,因此依赖关系链也可能相当长。

        例如,某个1000个字符的序列,其第一个词元可能会对最后位置的词元产生重大影响。这在计算上是不可行的,它需要的时间和内存都太多了,并且还需要超过1000个矩阵的乘积才能得到非常难以捉摸的梯度。这个过程充满可计算与统计的不确定性。

循环神经网络的梯度分析

       分析一个简化的模型,此模型描述了循环神经网络工作原理,模型中忽略了隐状态及其更新方式的细节。

      在简化模型中,将时间步t的隐状态表示为h_{t},输入表示为x_{t},输出表示为o_{t}w_{h}w_{o}分别表示隐藏层和输出层的权重。fg分别表示隐藏层和输出层的变换。

h_{t} =f\left ( x_{t} ,h_{t-1},w_{h}\right )

o_{t}=g\left ( h_{t} ,w_{o}\right )

前向传播的计算:

L\left ( x_{1} ,...,x_{T}, y_{1} ,...,y_{T},w_{h} ,w_{o}\right )=\frac{1}{T}\sum_{t=1}^{T}l\left ( y_{t} ,o_{t}\right ).

反向传播的计算:

\frac{\partial L}{\partial w_{h}}=\frac{1}{T}\sum_{t=1}^{T}\frac{\partial l\left ( y_{t},o_{t} \right )}{\partial w_{h}}

                                                                  =\frac{1}{T}\sum_{t=1}^{T}\frac{\partial l\left ( y_{t},o_{t} \right )}{\partial o_{t}}\frac{\partial g\left ( h_{t} ,w_{o}\right )}{\partial h_{t}}\frac{\partial h_{t}}{\partial w_{h}}

上式中第一项和第二项很容易计算,第三项\frac{\partial h_{t}}{\partial w_{h}}是比较难计算的,我们需要循环的计算参数w_{h}h_{t}的影响。

经过推导(此处省略推导过程),得到:

\frac{\partial h_{t}}{\partial w_{h}}=\frac{\partial f\left ( x_{t},h_{t-1},w_{h} \right )}{\partial w_{h}}+\sum_{t-1}^{i}\left (\prod_{j=i+1}^{t} \frac{\partial f\left ( x_{j},h_{j-1},w_{h} \right )}{\partial h_{j-1}} \right )\frac{\partial f\left ( x_{i},h_{i-1},w_{h} \right )}{\partial w_{h}}

其中当t很大时,链就很长,其中\prod代表的乘积阶数就会很高。

       这样就会导致最终的梯度\frac{\partial L}{\partial w_{h}}会因为其中的幂指数变得很敏感,容易产生非常大的数(梯度爆炸)和非常小的数(梯度消失)。

你可能感兴趣的:(gru,lstm,人工智能)