1,750 次浏览

激活函数-bias shift

开始

开始接触神经网络/深度学习了,在各种平台刷到这个mystery,各个领域也在使用它。机器学习学了这么久,没有太多的进展,只是一个个算法的慢慢啃。看着其他同学使用神经网络都是迅猛的搞着自己的东西,着实让我酸意满满。

当然这篇博文不是来吐槽的。问题是来自于自己选的入门书(Reference: 4)中:激活函数若不是零中心化的,上层的输出会使下一层的神经元的输入发生偏置偏移(bias shift),并进一步使得梯度下降的收敛速度变慢。

激活函数sigmoid/tanh

sigmoid: \(\)\(\sigma (x) = \frac{1}{1+e^{-x}}\)\(\),其导数为:\(\)\(\sigma'(x) = \frac{\sigma(x)}{1-\sigma(x)}\)\(\)

tanh: \(\)\(tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}\)\(\),其导数为:\(\)\(tanh'(x)=1-tanh(x)^2\)\(\)

偏置偏移

偏置(bias):考虑简单的线性可分的问题中,我们使用直线将问题划分时,所得到的直线,偏置就等于直线与纵轴的相交的坐标。如果没有偏置,我们的直线就过原点了,就会有许多问题我们根本就没法解决了。偏置其实也是我们在解决问题所用到的先验知识。
当然这个也就像线性代数中解决\(\)Ax = b\(\)这个线性方程组的问题,\(\)Ax=0\(\)只是线性方程组\(\)Ax = b\(\)的特例。

激活过程:\(\)\(f(x)=w^T x + b\)\(\),\(\)\(\sigma (f(x)) = \frac{1}{1+e^{-f(x)}}\)\(\)

偏置偏移:也被称为均值偏移(mean shift),假设我们的数据符合标准高斯分布,或通过标准化得到(Reference 1)。通过输入层sigmoid激活函数的计算,所得到的隐藏层的输入则全都大于零,我们的在隐藏层获得的输入就不再符合标准高斯分布了,发生了偏移。

收敛速度变慢

收敛速度变慢,其实就是当我们的\(\)\(f(x)=w^T x+b\)\(\)的值趋向正负无穷的方向时,整个sigmoid函数的一阶导数会下降,最终会出想梯度为0的情况,也即会梯度消失。趋向正负无穷的平缓区域被称为饱和区域

所以当出现偏置偏移时,\(\)\(f(x)=w^T x+b\)\(\)的会取饱和区域的值,则会导致收敛速度变慢。

此外,在我们训练神经网络时,假设选了MSE作为损失函数,进行backprop计算

损失函数:\(\)\(L= \sum (y_{true}-y_{pred})^2\)\(\)

激活函数:\(\)\(\sigma = f(w^T x + b)\)\(\)

取网络中一层进行计算

\(\)\(\frac{\partial L}{\partial y_{pred}} = -2(y_{true}-y_{pred})\)\(\)

\(\)\( \frac{\partial y_{pred}}{\partial w} = x f'(w^x+b)\)\(\)

此时发现,当上一层的数据不是均值为0的分布,由sigmoid激活得到大于0的输入时,我们在backprop求导得到的将会是大于0的导数。

所以当我们的数据全是大于0,或小于0时,计算梯度将不会沿着下降最快的方向,而会呈现zigzag的状态。

Reference
1. https://victorzhou.com/blog/intro-to-neural-networks/#loss
2. https://blog.csdn.net/weixin_38286298/article/details/90319134
3. https://www.zhihu.com/question/50396271
4. 邱锡鹏《神经网络与深度学习》2019
5. FAST AND ACCURATE DEEP NETWORK LEARNING BY EXPONENTIAL LINEAR UNITS (ELUS) 2016
6. https://blog.csdn.net/Uwr44UOuQcNsUQb60zk2/article/details/81074408
7. https://blog.csdn.net/qq_29831163/article/details/89380235
8. standford cs231n