dead ReLU的发生原因和复活问题
先做一个假设:
假设有一个神经网络,其输入X服从某一个分布。我们看看某一个特定的ReLU激活单元R。
这个单元有一个已经固定的参数集,X的分布就关联着R的输入的分布。为了方便观察,我们假 R的输入服从一个低方差均值为+1的高斯分布。
在这个假设下:
-
大部分R的输入为正的。
-
大多数输入会导致ReLU函数激活。
-
大多数输入会使反向传播回来的梯度通过R。
-
R的输入大多数情况会通过随机梯度下降反向传播更新。
现在假设在一某一次反向传播中,有一个十分巨大的梯度通过反向传播传递到了R。因为R是激活的,所以他会借助这个巨大的梯度通过反向传播算法到R得输出。这个将会导致R的前一层的给R提供输入的函数发生巨大的变化。这就意味着R的输入的分布会发生变化—我们又假设R的输入现在服从一个地方插均值为-0.1的高斯分布。
现在这个函数的情况是这样的:
-
大多数R的输入是负值。
-
大多数输入会导致ReLU关闭。
-
大多数多数输入会大致梯度无法通过R反向往回传播。
-
R的输入很难再通过随机梯度下降反向传播更新了。
现在发生了什么?R的输出的分布发生一个相对比较小的改变(-0.2的一个均值改变)导致了R的行为生的巨大改变。我们跨过了零点,现在R已经几乎总是关闭的了。现在的问题是这个关闭的ReLU无法再更新他的输入参数w,所以死亡(总是关闭的)的ReLU会保持死亡。
数学上,这是因为ReLU函数长这样:
r(X) = MAX(X,0)
他的梯度长这样:
Δxr(X) = 1{X>0}
所以这个ReLU在当且仅当他在前向传播的时候没有被激活(死亡)的时候,他也会在反向传播的时候无法激活,导致其无法更新和传递梯度。这个死亡的ReLU大可能会保持死亡。
(补充:Liu Hu(不知道是哪位老师,不敢瞎翻译)提到过,是有一个办法让ReLU复活的。我们回忆一下,R的上游还有很多影响R的输入分布的参数仍然会通过网络中其他路径获得更新。例如,R的同层的其他ReLU还处于激活状态同时也还在通过反向传播正常传递梯度。这些对R的上游参数的更新可能会使R的输入分布发生重要改变,让其回到正向区间(positive regime)内。其中的细节稍微有点复杂:在一个映射层(affine layer),那些直接为R提供输入的行向量会完全不会更新知道其被激。所以一个完全死亡的ReLU只能通过前一层的线性转换层(nolinear transformation layer)来复活。但是,如果线性转换层是一个没有参数共享的特定映射,第一个隐藏层(hiden layer)的死亡ReLU是一定无法复活的。在很多情况下,这种问题需要一些实证研究)
我不确定ReLU在实际使用时死亡的频率有多高,但是显然他已经到了一个我们不得不注意他的程度了。希望你能够看见为什么相对较大的学习率最终会容易导致这个问题,从SGD步长获得的更新越大,就会有更大的风险R的输入分布会跨过零点到达负区间(negative regime)。)
最后 ,大多数情况下,ReLU死亡不会像我的例子这样清晰地分阶段完成,先是SGD步长导致一部分输入分布落入负区间,然后随后的SGD步长会把剩下的分布也打入负区间。通常情况下,你可以把R的输入分布变化看成是一种随机的事件。如果迈了一个相对大的步子,随后可能一部分ReLU会死到最后。
有一些避免非线性部分的方法可以避免这种情况(比如leaky ReLU),因为它没有导数为零的情况,但是我不完全确定我们是不是该用它。还有一种试图检测到这些死亡ReLU然后对他的输入参数进行随机的再初始化(reinitializing)–这可能会降低学习的效率但是可能会让参数的使用更有效率。