本节我们将介绍如果向量化多个训练样本并计算出结果,以及详细解释其中的细节。
一、向量化实现
逻辑回归是将各个训练样本组合成矩阵,对矩阵的各列进行计算。神经网络是通过对逻辑回归中的等式简单的变形,让神经网络计算出输出值。这种计算是所有的样本同时进行的,以下是它具体的步骤:
伪代码实现如下:
for i = 1 to m:
z[1](i) = w[1]x(i) + b(1)
a[1](i) = sigma(z[1](i))
z[2](i) = w[2]a[1](i) + b[2]
a[2](i) = sigma(z[2](i))
对于所有训练样本,我们需要让
i
i
i从
1
1
1到
m
m
m实现上图中四个等式。如果我们想计算
m
m
m个训练样本上的所有输出,就应该向量化整个计算。接下来我们讲讲如何向量化加速我们的算法:
z
[
1
]
(
i
)
=
W
[
1
]
(
i
)
x
(
i
)
+
b
[
1
]
α
[
1
]
(
i
)
=
σ
(
z
[
1
]
(
i
)
)
z
[
2
]
(
i
)
=
W
[
2
]
(
i
)
α
[
1
]
(
i
)
+
b
[
2
]
α
[
2
]
(
i
)
=
σ
(
z
[
2
]
(
i
)
)
}
⇒
{
A
[
1
]
=
σ
(
z
[
1
]
)
z
[
2
]
=
W
[
2
]
A
[
1
]
+
b
[
2
]
A
[
2
]
=
σ
(
z
[
2
]
)
\left.\begin{array}{r} z^{[1](i)}=W^{[1](i)} x^{(i)}+b^{[1]} \\ \alpha^{[1](i)}=\sigma\left(z^{[1](i)}\right) \\ z^{[2](i)}=W^{[2](i)} \alpha^{[1](i)}+b^{[2]} \\ \alpha^{[2](i)}=\sigma\left(z^{[2](i)}\right) \end{array}\right\} \Rightarrow\left\{\begin{array}{l} A^{[1]}=\sigma\left(z^{[1]}\right) \\ z^{[2]}=W^{[2]} A^{[1]}+b^{[2]} \\ A^{[2]}=\sigma\left(z^{[2]}\right) \end{array}\right.
z[1](i)=W[1](i)x(i)+b[1]α[1](i)=σ(z[1](i))z[2](i)=W[2](i)α[1](i)+b[2]α[2](i)=σ(z[2](i))⎭⎪⎪⎬⎪⎪⎫⇒⎩⎨⎧A[1]=σ(z[1])z[2]=W[2]A[1]+b[2]A[2]=σ(z[2])
其中,
x
=
[
⋮
⋮
⋮
⋮
x
(
1
)
x
(
2
)
⋯
x
(
m
)
⋮
⋮
⋮
⋮
]
x=\left[\begin{array}{clll} \vdots & \vdots & \vdots & \vdots \\ x^{(1)} & x^{(2)} & \cdots & x^{(m)} \\ \vdots & \vdots & \vdots & \vdots \end{array}\right]
x=⎣⎢⎢⎡⋮x(1)⋮⋮x(2)⋮⋮⋯⋮⋮x(m)⋮⎦⎥⎥⎤,
Z
[
1
]
=
[
⋮
⋮
⋮
⋮
z
[
1
]
(
1
)
z
[
1
]
(
2
)
⋯
z
[
1
]
(
m
)
⋮
⋮
⋮
⋮
]
Z^{[1]}=\left[\begin{array}{clll} \vdots & \vdots & \vdots & \vdots \\ z^{[1](1)} & z^{[1](2)} & \cdots & z^{[1](m)} \\ \vdots & \vdots & \vdots & \vdots \end{array}\right]
Z[1]=⎣⎢⎢⎡⋮z[1](1)⋮⋮z[1](2)⋮⋮⋯⋮⋮z[1](m)⋮⎦⎥⎥⎤,
A [ 1 ] = [ ⋮ ⋮ ⋮ ⋮ α [ 1 ] ( 1 ) α [ 1 ] ( 2 ) ⋯ α [ 1 ] ( m ) ⋮ ⋮ ⋮ ⋮ ] A^{[1]}=\left[\begin{array}{clll} \vdots & \vdots & \vdots & \vdots \\ \alpha^{[1](1)} & \alpha^{[1](2)} & \cdots & \alpha^{[1](m)} \\ \vdots & \vdots & \vdots & \vdots \end{array}\right] A[1]=⎣⎢⎢⎡⋮α[1](1)⋮⋮α[1](2)⋮⋮⋯⋮⋮α[1](m)⋮⎦⎥⎥⎤
从水平上看,矩阵 A A A代表了各个训练样本;从竖直上看,矩阵 A A A的不同索引对应于不同的隐藏单元。
对于矩阵 X X X情况也类似,水平方向上对应不同的训练样本;竖直方向上,对应不同的输入特征。
二、向量化实现的解释
对于向量化表达的方式,本质上是运用了线性代数的知识。我们先手动对几个样本计算一下前向传播,看看有什么规律:
z
[
1
]
(
1
)
=
W
[
1
]
x
(
1
)
+
b
[
1
]
z
[
1
]
(
2
)
=
W
[
1
]
x
(
2
)
+
b
[
1
]
z
[
1
]
(
3
)
=
W
[
1
]
x
(
3
)
+
b
[
1
]
z^{[1](1)} = W^{[1]}x^{(1)} + b^{[1]} \\ z^{[1](2)} = W^{[1]}x^{(2)} + b^{[1]} \\ z^{[1](3)} = W^{[1]}x^{(3)} + b^{[1]}
z[1](1)=W[1]x(1)+b[1]z[1](2)=W[1]x(2)+b[1]z[1](3)=W[1]x(3)+b[1]
这里便于描述,我们先忽略掉
b
[
1
]
b^{[1]}
b[1],因为利用Python的广播机制,我们很容易将其加入矩阵中。现在
W
[
1
]
W^{[1]}
W[1]是一个矩阵,
x
(
1
)
,
x
(
2
)
,
x
(
3
)
x^{(1)},x^{(2)},x^{(3)}
x(1),x(2),x(3)都是列向量,矩阵乘以列向量得到列向量,如下所示
W
[
1
]
x
=
[
⋯
⋯
⋯
]
[
⋮
⋮
⋮
⋮
x
(
1
)
x
(
2
)
x
(
3
)
⋮
⋮
⋮
⋮
⋮
]
=
[
⋮
⋮
⋮
⋮
w
(
1
)
x
(
1
)
w
(
1
)
x
(
2
)
w
(
1
)
x
(
3
)
⋮
⋮
⋮
⋮
⋮
]
=
[
⋮
⋮
⋮
⋮
z
[
1
]
(
1
)
z
[
1
]
(
2
)
z
[
1
]
(
3
)
⋮
⋮
⋮
⋮
⋮
]
=
Z
[
1
]
\begin{aligned} &W^{[1]} x=\left[\begin{array}{l} \cdots \\ \cdots \\ \cdots \end{array}\right]\left[\begin{array}{cccc} \vdots & \vdots & \vdots & \vdots \\ x^{(1)} & x^{(2)} & x^{(3)} & \vdots \\ \vdots & \vdots & \vdots & \vdots \end{array}\right]=\left[\begin{array}{cccc} \vdots & \vdots & \vdots & \vdots \\ w^{(1)} x^{(1)} & w^{(1)} x^{(2)} & w^{(1)} x^{(3)} & \vdots \\ \vdots & \vdots & \vdots & \vdots \end{array}\right]\\ & =\left[\begin{array}{cccc} \vdots & \vdots & \vdots & \vdots \\ z^{[1](1)} & z^{[1](2)} & z^{[1](3)} & \vdots \\ \vdots & \vdots & \vdots & \vdots \end{array}\right]=Z^{[1]} \end{aligned}
W[1]x=⎣⎡⋯⋯⋯⎦⎤⎣⎢⎢⎢⎡⋮x(1)⋮⋮x(2)⋮⋮x(3)⋮⋮⋮⋮⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡⋮w(1)x(1)⋮⋮w(1)x(2)⋮⋮w(1)x(3)⋮⋮⋮⋮⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡⋮z[1](1)⋮⋮z[1](2)⋮⋮z[1](3)⋮⋮⋮⋮⎦⎥⎥⎥⎤=Z[1]
以上就是对神经网络向量化实现的正确性解释,到目前为止,我们仅使用sigmoid函数作为激活函数,事实上这并非最好的选择,接下来我们将会讨论使用更多不同种类的激活函数。