前言
该文章用来记录本人在学习 《动手学深度学习》这本书的 4.1多层感知机一节的笔记。
多层感知机是在单层神经网络的基础上引入一个或多个隐藏层,使神经网络有多个网络层,并通过激活函数转换隐藏层的输出。如果多层感知机没有激活函数转换隐藏层的输出,那么多层感知机将退化成线性模型。为此,为了发挥多层架构的潜力,我们在仿射变换之后对每个隐藏单元应用非线性的激活函数。此外,为了构建更通过的多层感知机,我们可以叠加多个隐藏层,从而产生更有表达能力的模型。
多层感知机
什么是多层感知机?
多层感知机(MLP,Multilayer Perceptron)也叫人工神经网络(ANN,Artificial Neural Network):在单层神经网络的基础上引入一个或多个隐藏层,使神经网络有多个网络层,并通过激活函数转换隐藏层的输出,因而称为多层感知机。
这个多层感知机有4个输入,3个输出,其隐藏层包含5个隐藏单元。输入层不涉及任何计算,因此使用此网络产生输出只需要实现隐藏层和输出层的计算。因此,这个多层感知机中的层数为2。
注意,这两个层都是全连接的。每个输入都会影响隐藏层中的每个神经元,而隐藏层中的每个神经元又会影响输出层中的每个神经元。
从线性到非线性
引例
假设矩阵
X
∈
R
n
×
d
\mathbf{X}\in\mathbb{R}^{n\times d}
X∈Rn×d 来表示
n
n
n个样本的小批量,其中每个样本具有
d
d
d个输入特征。
对于具有
h
h
h个隐藏单元的单隐藏层多层感知机,用
H
∈
R
n
×
h
\mathbf{H}\in\mathbb{R}^{n\times h}
H∈Rn×h表示隐藏层的输出,
H
H
H称为隐藏表示(也称为隐藏层变量或隐藏变量)。
因为隐藏层和输出层都是全连接的,所以我们有隐藏层权重
W
(
1
)
∈
R
d
×
h
\mathbf{W}^{(1)}\in\mathbb{R}^{d\times h}
W(1)∈Rd×h和隐藏层偏置
b
(
1
)
∈
R
1
×
h
\mathbf{b}^{(1)}\in\mathbb{R}^{1\times h}
b(1)∈R1×h以及输出层权重
W
(
2
)
∈
R
h
×
q
\mathbf{W}^{(2)}\in\mathbb{R}^{h\times q}
W(2)∈Rh×q和输出层偏置
b
(
2
)
∈
R
1
×
q
\mathbf{b}^{(2)}\in\mathbb{R}^{1\times q}
b(2)∈R1×q。
形式上,我们按如下方式计算单隐藏层多层感知机的输出
O
∈
R
n
×
q
\mathbf{O}\in\mathbb{R}^{n\times q}
O∈Rn×q:
H
=
X
W
(
1
)
+
b
(
1
)
O
=
H
W
(
2
)
+
b
(
2
)
\begin{aligned}\mathbf{H}&=\mathbf{X}\mathbf{W}^{(1)}+\mathbf{b}^{(1)}\\\mathbf{O}&=\mathbf{H}\mathbf{W}^{(2)}+\mathbf{b}^{(2)}\end{aligned}
HO=XW(1)+b(1)=HW(2)+b(2)
令
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),则
0
=
(
X
W
(
1
)
+
b
(
1
)
)
W
(
2
)
+
b
(
2
)
=
X
W
(
1
)
W
(
2
)
+
b
(
1
)
W
(
2
)
+
b
(
2
)
=
X
W
+
b
\mathbf{0}=(\mathbf{X}\mathbf{W}^{(1)}+\mathbf{b}^{(1)})\mathbf{W}^{(2)}+\mathbf{b}^{(2)}=\mathbf{X}\mathbf{W}^{(1)}\mathbf{W}^{(2)}+\mathbf{b}^{(1)}\mathbf{W}^{(2)}+\mathbf{b}^{(2)}=\mathbf{X}\mathbf{W}+\mathbf{b}
0=(XW(1)+b(1))W(2)+b(2)=XW(1)W(2)+b(1)W(2)+b(2)=XW+b
无激活函数的情况
从引例可以看出,若多层感知机没有激活函数转换隐藏层的输出(即 H = X W ( 1 ) + b ( 1 ) \mathbf{H}=\mathbf{X}\mathbf{W}^{(1)}+\mathbf{b}^{(1)} H=XW(1)+b(1)),多层感知机退化成线性模型。
有激活函数的情况
为了发挥多层架构的潜力,我们还需要一个额外的关键要素:在仿射变换之后对每个隐藏单元应用非线性的
激活函数(activationfunction)
σ
σ
σ。
激活函数的输出(例如, σ ( ⋅ ) σ(·) σ(⋅))被称为活性值(activations)。
一般来说,有了激活函数,就不可能再将我们的多层感知机退化成线性模型:
H
=
σ
(
X
W
(
1
)
+
b
(
1
)
)
O
=
H
W
(
2
)
+
b
(
2
)
\begin{aligned}\mathbf{H}&=\sigma(\mathbf{X}\mathbf{W}^{(1)}+\mathbf{b}^{(1)})\\\mathbf{O}&=\mathbf{H}\mathbf{W}^{(2)}+\mathbf{b}^{(2)}\end{aligned}
HO=σ(XW(1)+b(1))=HW(2)+b(2)
延伸
为了构建更通用的多层感知机,我们可以继续堆叠这样的隐藏层,例如 H ( 1 ) = σ 1 ( X W ( 1 ) + b ( 1 ) ) \mathsf{H}^{(1)}=\sigma_{1}(\mathbf{XW}^{(1)}+\mathbf{b}^{(1)}) H(1)=σ1(XW(1)+b(1))和 H ( 2 ) = σ 2 ( H ( 1 ) W ( 2 ) + b ( 2 ) ) \mathsf{H}^{(2)}=\sigma_2(\mathbf{H}^{(1)}\mathbf{W}^{(2)}+\mathbf{b}^{(2)}) H(2)=σ2(H(1)W(2)+b(2)),一层叠一层,从而产生更有表达能力的模型。