1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-start.com/dl2017/
3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai
3.7 为什么需要非线性激活函数?Why do you need non linear activation functions?
事实证明,要让你的NN能够计算出有趣的函数,你必须使用非线性激活函数,这点对于NN来说非常关键。否则就只能是把输入线性组合再输出。
我们已经说明过,双层NN网络正向传播的计算公式如下, A [ 0 ] A^{[0]} A[0]就是输入特征x
Z
[
1
]
=
W
[
1
]
A
[
0
]
+
b
[
1
]
Z^{[1]}=W^{[1]}A^{[0]}+b^{[1]}
Z[1]=W[1]A[0]+b[1]
A
[
1
]
=
g
[
1
]
(
Z
[
1
]
)
A^{[1]}=g^{[1]}(Z^{[1]})
A[1]=g[1](Z[1])
Z
[
2
]
=
W
[
2
]
A
[
1
]
+
b
[
2
]
Z^{[2]}=W^{[2]}A^{[1]}+b^{[2]}
Z[2]=W[2]A[1]+b[2]
A
[
2
]
=
g
[
2
]
(
Z
[
2
]
)
A^{[2]}=g^{[2]}(Z^{[2]})
A[2]=g[2](Z[2])
其中 g [ 1 ] g^{[1]} g[1]选用tanh函数, g [ 2 ] g^{[2]} g[2]选用 σ \sigma σ函数。tanh函数和 σ \sigma σ函数都是非线性函数。
如果我们去掉g函数,即 A [ 2 ] = Z [ 2 ] A^{[2]}=Z^{[2]} A[2]=Z[2],或者令 g ( z ) = z g(z)=z g(z)=z,这个被称为线性激活函数(更学术点的名字是恒等激活函数,因为它把输入值直接输出了)。此时,预测值 y ^ \hat y y^是输入特征x的线性组合。
证明如下,因为
A
[
1
]
=
Z
[
1
]
=
W
[
1
]
A
[
0
]
+
b
[
1
]
A^{[1]}=Z^{[1]}=W^{[1]}A^{[0]}+b^{[1]}
A[1]=Z[1]=W[1]A[0]+b[1]
A
[
2
]
=
Z
[
2
]
=
W
[
2
]
A
[
1
]
+
b
[
2
]
A^{[2]}=Z^{[2]}=W^{[2]}A^{[1]}+b^{[2]}
A[2]=Z[2]=W[2]A[1]+b[2]
所以
A [ 2 ] = W [ 2 ] ( W [ 1 ] A [ 0 ] + b [ 1 ] ) + b [ 2 ] = ( W [ 2 ] W [ 1 ] ) A [ 0 ] + ( W [ 2 ] b [ 1 ] + b [ 2 ] ) A^{[2]}=W^{[2]}(W^{[1]}A^{[0]}+b^{[1]})+b^{[2]}=(W^{[2]}W^{[1]})A^{[0]}+(W^{[2]}b^{[1]}+b^{[2]}) A[2]=W[2](W[1]A[0]+b[1])+b[2]=(W[2]W[1])A[0]+(W[2]b[1]+b[2])
令 W ′ = ( W [ 2 ] W [ 1 ] ) W'=(W^{[2]}W^{[1]}) W′=(W[2]W[1]), b ′ = ( W [ 2 ] b [ 1 ] + b [ 2 ] ) b'=(W^{[2]}b^{[1]}+b^{[2]}) b′=(W[2]b[1]+b[2]),那么可以得到
A [ 2 ] = W ′ A [ 0 ] + b ′ A^{[2]}=W'A^{[0]}+b' A[2]=W′A[0]+b′
现在可以发现:如果你是用线性激活函数或者叫恒等激励函数,那么神经网络只是把输入线性组合再输出。
这里是以只含一个隐藏层的双层NN为例。如果你在隐藏层用线性激活函数,在输出层用sigmoid函数,那么这个模型的复杂度和没有任何隐藏层的标准逻辑回归是一样的。
对于深度网络,有很多层的NN,会包含很多隐藏层。事实证明,如果你使用线性激活函数或者没有使用激活函数,那么无论你的NN有多少层,一直在做的只是计算线性函数,所以不如直接去掉全部隐藏层。
总结:
线性隐藏层一点用也没有,因为NN节点分2步计算,z已经是线性函数,如果a依然使用线性函数计算,那么这两个线性函数的组合本身就是线性函数。所以除非你引入非线性,否则你无法计算更有趣的函数,即使你的网络层数再多也不行。
只有一个地方可以使用线性激活函数 g ( z ) = z g(z)=z g(z)=z,就是你在做机器学习中的回归问题。
例如,y是一个实数,
y
∈
R
y \in R
y∈R,如果要预测房地产价格,这是一个可以从0到非常大的数。此时在隐藏层可以使用ReLU,或者tanh,或者leaky ReLU,或者其他的非线性激活函数,而在输出层使用的是线性激活函数。
因为房价都是非负数,所以我们也可以在输出层使用ReLU函数,这样你的预测值
y
^
\hat y
y^都大于等于0。
在隐藏层使用线性激活函数非常少见。
在隐藏层使用线性激活函数的,也就是可能是与压缩有关的一些非常特殊的情况。