激活函数
这次看看激活函数及其相关。
先来看看一个简单神经元的结构吧!
在胞体之前是有一个WX的计算,再加上一个bias,从而求算出新的数值,这时候激活函数出场了,它的目的就是对刚刚的数值进行一个转换,使得转换后的数值更加易于后期的处理。激活函数家族中大家比较熟悉的就是我们在反向传播的时候引例中的Sigmoid函数。那么我们就看看Sigmoid函数的特性。
Sigmoid 函数
首先一个比较显然的就是它会把输入值转化为一个(0,1)内的数值,其实在计算机中写成[0,1]也差不多啦。在人工智能还不是很蓬勃发展的时候,人们比较认可这个函数的存在,因为在生物学角度上它很像神经元的饱和放电率(firing rate)的图像。但在它的背后有几个比较坑人而又不适用的缺陷。
- 首先,饱和神经元会导致梯度消失。假设我的输入值是10,那么不难看出它的梯度基本是0,那么还会导致梯度的显著而有效的变化吗?显然不会!又假设我的输入值是0,那梯度基本是可以算出来的,很赞!那如果变成-10呢?又不行了QAQ……
- 回忆反向传播的内容,也就是说数值的绝对值过大导致Sigmoid门处的神经元的饱和从而让本地梯度变为0,从而导致在反向传播的时候它下游的中间变量变化值也为0,那自变量就会基本不变了。
- 其次,该函数并不是零中心函数。假设我们输入的X全是正的,这就会使得每次变化的时候,梯度值总会保留上游梯度的符号,从而每一个权值的变化都是相同的符号,都朝一个方向变化,这样会发生什么问题呢?看看下面这张图吧!
- 上图是以两个权值为例的,蓝线是我们期望的梯度方向,红线是探索的过程,“zig-zag、zig-zag,是魔鬼的步伐”,是不是看着就觉得替红线捏一把汗呀?
所以Sigmoid函数还是比较鬼畜的。
tanh 函数
接下来简单介绍一下另一个函数——tanh。这个比较好的性质是满足零中心原则,但是饱和时仍然会发生梯度消失的现象。
ReLU / 修正线性单元 / 线性整流函数
ReLU(Rectified Linear Unit),中文名一般是修正线性单元。
函数形式较为简单:ReLU=max(0,x),这样的运算至少要比幂运算要快得多。因而它的运算要比tanh和Sigmoid快,快到6倍左右,而且在生物玄学角度上,它更符合生物学规律(WTF?)。来看看它的特征:
- 在正半轴部分,这个函数永远不会饱和,假设我的输入值是10,那么不难看出它的梯度是1;又假设我的输入值是0,那梯度可以规定为0;那如果变成-10呢?出现了梯度消失。这个被称为dead ReLU,这种情况出现的原因是初始权值设置不恰当。
其它线性单元
接下来简要展示一些其它不错的线性单元(LU)
此外,还有Maxout等可供了解。