写在前面:
线性回归见: 线性回归与实现(三)
Softmax回归见: Softmax回归(四)
公式符号详见: 论文数学公式编辑
参考书:动手学深度学习
1 多层感知机MLP
前文线性回归与实现(三)和 Softmax回归(四)都是线性模型。然而多少问题能是线性的呢?线性是一个很强的假设。
1.1 线性模型的问题
1) 线性意味着单调性假设:任何特征的增大都会导致模型输出的持续增大(或持续减小)。
2)废话:不能很好地解决非线性问题,比如先增后减问题。
1.2 引入隐藏层成就多层感知机
对于先增后减问题我们能否用线性模型解决呢?
当然可以,我们可以分段考虑,前半段和后半段不都是线性吗。这需要怎么做呢?
为了克服线性模型的限制,最朴素的思想是多来几个线性层,这样我的模型复杂度不就提高了吗。
我们可以在网络中加入一个或多个隐藏层来克服线性模型的限制,使其能处理更普遍的函数关系类型。这种架构通常称为多层感知机(multilayer perceptron)通常缩写为MLP。 在中间的就叫隐藏层。
1.3 添加激活函数引入非线性
但是还有一个问题来了,假如人家是非线性先增后减呢? 这时候不能继续用线性模型分类讨论了(因为需要模型无限大)。
在Softmax回归(四)中我们已经得到多输出线性模型的表达式:
O
=
X
W
+
b
(1)
\mathbf{O}=\mathbf{X}\mathbf{W}+\mathbf{b} \tag{1}
O=XW+b(1)
现在我们用
H
\mathbf{H}
H表示隐藏层(单隐藏层)输出,那么现在的模型表达式为:
H
=
X
W
(
1
)
+
b
(
1
)
,
O
=
H
W
(
2
)
+
b
(
2
)
.
(2)
\begin{align}\mathbf{H}=\mathbf{X}\mathbf{W}^{(1)}+\mathbf{b}^{(1)},\\\mathbf{O}=\mathbf{HW}^{(2)}+\mathbf{b}^{(2)}.\end{align}\tag{2}
H=XW(1)+b(1),O=HW(2)+b(2).(2)
可见,虽然增加隐藏层可以使线性模型有更强的表达能力,然而线性意味着无法很好的表征非线性关系。而且多个线性模型的叠加最后还是被退化为线性模型。即:
O
=
(
X
W
(
1
)
+
b
(
1
)
)
W
(
2
)
+
b
(
2
)
=
X
W
(
1
)
W
(
2
)
+
b
(
1
)
W
(
2
)
+
b
(
2
)
=
X
W
+
b
.
(3)
\mathbf{O}=(\mathbf{XW}^{(1)}+\mathbf{b}^{(1)})\mathbf{W}^{(2)}+\mathbf{b}^{(2)}=\mathbf{XW}^{(1)}\mathbf{W}^{(2)}+\mathbf{b}^{(1)}\mathbf{W}^{(2)}+\mathbf{b}^{(2)}=\mathbf{XW}+\mathbf{b}. \tag{3}
O=(XW(1)+b(1))W(2)+b(2)=XW(1)W(2)+b(1)W(2)+b(2)=XW+b.(3)
其中
W
=
W
(
1
)
W
(
2
)
\mathbf{W}=\mathbf{W}^{(1)}\mathbf{W}^{(2)}
W=W(1)W(2) 且
b
=
b
(
1
)
W
(
2
)
+
b
(
2
)
\mathbf{b}=\mathbf{b}^{(1)}\mathbf{W}^{(2)}+\mathbf{b}^{(2)}
b=b(1)W(2)+b(2)
引入非线性思想同样朴素,对隐藏层的输出结果添加非线性函数映射。现假设有非线性的激活函数(activation function) σ ( ⋅ ) \sigma(\cdot) σ(⋅)。**我们对隐藏层添加激活函数就引入了非线性。**如此,模型就不会退化为线性模型:
H = σ ( X W ( 1 ) + b ( 1 ) ) , O = H W ( 2 ) + b ( 2 ) . (4) \begin{aligned}&\mathbf{H}=\sigma(\mathbf{X}\mathbf{W}^{(1)}+\mathbf{b}^{(1)}),\\&\mathbf{O}=\mathbf{HW}^{(2)}+\mathbf{b}^{(2)}.\end{aligned}\tag{4} H=σ(XW(1)+b(1)),O=HW(2)+b(2).(4)
假设每个隐藏层层都有激活函数,我们可以得到一个多层的非线性多层感知机:
PS:我们平时见到的模型都是默认添加激活函数的,也叫做激活层,但我们一般不会在图上特意标出。
1.4 3个常用激活函数
激活函数名字很fancy,其实就是个可求导的非线性函数。
- ReLU: rectified linear unit。最好算,最常用。(0处导数特判即可,我们只是为了引入非线性,不严格按照数学定义)
R e L U ( x ) = max ( x , 0 ) \mathrm{ReLU}(x)=\max(x,0) ReLU(x)=max(x,0)
- Sigmoid 激活函数,第二常用
s i g m o i d ( x ) = 1 1 + exp ( − x ) \mathrm{sigmoid}(x)=\frac{1}{1+\exp(-x)} sigmoid(x)=1+exp(−x)1
3. Tanh 激活函数
tanh
(
x
)
=
1
−
exp
(
−
2
x
)
1
+
exp
(
−
2
x
)
\tanh(x)=\frac{1-\exp(-2x)}{1+\exp(-2x)}
tanh(x)=1+exp(−2x)1−exp(−2x)