之前一直不理解为什么要在神经网络中引入非线性的激活函数(虽然理解为什么只有线性不行,但不理解为什么有了非线性就行了,不知道有没有和我一样的小伙伴),最近重温“李宏毅”深度学习时,恍然大悟。
参考视频:【機器學習2021】預測本頻道觀看人數 (下) - 深度學習基本概念簡介:大约看前10分钟就可以明白
如果不方便看坐飞机的同学,可以看我下面的整理
为什么神经网络只有线性不行
众数周知:机器学习的过程为:先假设出一个函数 f f f,然后通过训练样本学习出函数 f f f 的参数。
假设我们现在要使用神经网络模拟如图所示的一个函数:
这个是一个分段函数:
y = { 0 if x < 0 2 x if 0 ≤ x < 2 − x + 6 if 2 ≤ x < 4 2 if x ≥ 4 y = \begin{cases} 0 &\text{if ~~} x <0 \\ 2x &\text{if ~~ } 0\le x <2 \\ -x + 6 &\text{if ~~ } 2\le x <4 \\ 2 &\text{if ~~ } x \ge4 \\ \end{cases} y=⎩⎪⎪⎪⎨⎪⎪⎪⎧02x−x+62if x<0if 0≤x<2if 2≤x<4if x≥4
假设要模拟上述函数,设计了如下神经网络:
假设该神经网络的隐层没有激活函数,那么这个神经网络的本质是什么呢?
首先,从输入层到隐层,实际是三条直线,假设为:
z 1 = w 1 x + b 1 z 2 = w 2 x + b 2 z 3 = w 3 x + b 3 z_1 = w_1x+b_1 \\ z_2 = w_2x + b_2 \\ z_3 = w_3x + b_3 z1=w1x+b1z2=w2x+b2z3=w3x+b3
而隐层到输出层呢?其实就是把上面的三条线加起来,即:
y = w 4 z 1 + w 5 z 2 + w 6 z 3 + b 4 y = w_4z_1+w_5z_2+w_6z_3 + b_4 y=w4z1+w5z2+w6z3+b4
那我们现在尝试绘制3条直线,看看加起来能不能模拟上述的分段函数:
这里我随便绘制了3条线,如果将这3条线加起来是什么样子呢?其实还是一条直线。这个从公式很容易看出:
y = w 4 z 1 + w 5 z 2 + w 6 z 3 + b 4 = ( w 1 w 4 + w 2 w 5 + w 3 w 6 ) x + ( b 1 w 4 + b 2 w 5 + b 3 w 6 + b 4 ) = a x + b \begin{aligned} y & = w_4z_1+w_5z_2+w_6z_3 + b_4 \\ &= (w_1w_4+w_2w_5+w_3w_6)x+ (b_1w_4+b_2w_5+b_3w_6+b_4)\\ & = ax+b \end{aligned} y=w4z1+w5z2+w6z3+b4=(w1w4+w2w5+w3w6)x+(b1w4+b2w5+b3w6+b4)=ax+b
所以,如果神经网络只有线性,那么不论有多少隐层,有多少神经元,最终还是线性的。
为了要让神经网络能模拟复杂的函数(非线性的),所以要让神经元引入非线性的激活函数。
为什么有了非线性就行了
为了回答这个问题,可以继续讨论上面的例子,假设要拟合上面的分段函数,可以使用如下函数对其进行相加:
如果神经网络能模拟出黄色线和橙色线,那么让其相加,就可以得出
f
f
f 函数。你看这两个线的长相有没有很熟悉。没错,就是sigmoid。
任何复杂的函数都可以由一个常量加一堆sigmoid函数模拟出来
下面,使用sigmoid来模拟一下该函数,即如图所示:
我们通过绿色的函数
h
(
x
)
h(x)
h(x) 和 红色的函数
p
(
x
)
p(x)
p(x) 就能大致模拟出函数
f
f
f,其中:
h ( x ) = 1 1 + e − ( 2.4 x − 2.4 ) 4 h(x) = \frac{1}{1+e^{-(2.4x-2.4)}}4 h(x)=1+e−(2.4x−2.4)14
p ( x ) = 1 1 + e − ( − 2.4 x + 7.4 ) 2 − 2 p(x) = \frac{1}{1+e^{-(-2.4x+7.4)}}2-2 p(x)=1+e−(−2.4x+7.4)12−2
那如果对应到神经网络中呢,每个线的权重如图所示:
这里只用一个隐层两个神经元,因为已经足够了,如果实战时隐层设置了3个神经元,也没关系,因为神经网络会将其中一个神经元的参数都学习成0,这样相当于第三个神经元有和没有一样
这次在隐藏层增加了非线性函数sigmoid,则整个神经网络的运算过程为:
z 1 = 2.4 x − 2.4 z 2 = − 2.4 x + 7.4 \begin{aligned} & z_1 = 2.4 x - 2.4 \\ & z_2 = -2.4x+7.4 \end{aligned} z1=2.4x−2.4z2=−2.4x+7.4
经过激活函数后为:
a 1 = σ ( z 1 ) = σ ( 2.4 x − 2.4 ) = 1 1 + e − ( 2.4 x − 2.4 ) a 2 = σ ( z 2 ) = σ ( − 2.4 x + 7.4 ) = 1 1 + e − ( − 2.4 x + 7.4 ) \begin{aligned} & a_1 = \sigma(z_1) = \sigma(2.4 x - 2.4) = \frac{1}{1+e^{-(2.4x-2.4)}} \\ & a_2 = \sigma(z_2) = \sigma(-2.4x+7.4) = \frac{1}{1+e^{-(-2.4x+7.4)}} \end{aligned} a1=σ(z1)=σ(2.4x−2.4)=1+e−(2.4x−2.4)1a2=σ(z2)=σ(−2.4x+7.4)=1+e−(−2.4x+7.4)1
然后是到最后一层输出层:
y = 4 a 1 + 2 a 2 − 2 = 1 1 + e − ( 2.4 x − 2.4 ) 4 + 1 1 + e − ( − 2.4 x + 7.4 ) 2 − 2 = h ( x ) + p ( x ) y = 4a_1 + 2a_2 - 2 = \frac{1}{1+e^{-(2.4x-2.4)}}4+\frac{1}{1+e^{-(-2.4x+7.4)}}2-2 = h(x) + p(x) y=4a1+2a2−2=1+e−(2.4x−2.4)14+1+e−(−2.4x+7.4)12−2=h(x)+p(x)
这不就是最终的结论嘛,通过神经网络,模拟出了两条非线性的sigmoid函数,然后将其合并(相加),最终模拟出函数 f f f。
如果是更复杂的函数呢?,比如下面这个:
那也没关系,只要在图上标记些点,然后按照这些点进行模拟:
如果对应到神经网络中,那就是多搞些隐层和神经元。
如果是Tanh呢?也无非是对Tanh进行各种变换,最后相加起来能得出要模拟的函数即可