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.3 计算神经网络的输出 Computing a Neural Network’s Output
本节将会介绍NN的输出究竟是如何计算出来的。
以上节输入单个特征向量X(包含x1,x2,x3三个元素)的双层NN为例。
最终只需要4行代码就可以完成计算输出。
观察下图
图中的圆圈代表了我们介绍过的,逻辑回归计算的2个步骤。
- 第一步计算出z
- 第二步就算出激活函数a
而NN只不过重复计算这些步骤很多次。
我们先来观察NN隐藏层的一个节点。
上面的图在上节已经出过,我们暂时只保留隐藏层的一个节点,把其他节点隐去。
这个节点的计算和逻辑回归类似。我们把它分成2个步
- 第一步,节点的左边计算 z 1 [ 1 ] = w 1 [ 1 ] T x + b 1 [ 1 ] z^{[1]}_1=w_1^{[1]T}x+b_1^{[1]} z1[1]=w1[1]Tx+b1[1]
- 第二步,节点的右边计算 a 1 [ 1 ] = σ ( z 1 [ 1 ] ) a_1^{[1]}=\sigma(z_1^{[1]}) a1[1]=σ(z1[1])
符合约定
上面公式中z,w,b,a的上标表示它们所在层(layer),[1]表示隐藏层;下标表示所在层中的第几个节点(node in layer)。
然后再看NN隐藏层中的第二个节点
类似的,也是分成2步计算
- 第一步,节点的左边计算 z 2 [ 1 ] = w 2 [ 1 ] T x + b 2 [ 1 ] z^{[1]}_2=w_2^{[1]T}x+b_2^{[1]} z2[1]=w2[1]Tx+b2[1]
- 第二步,节点的右边计算 a 2 [ 1 ] = σ ( z 2 [ 1 ] ) a_2^{[1]}=\sigma(z_2^{[1]}) a2[1]=σ(z2[1])
注意:上标和第一个节点一致,也是[1],表示隐藏层;但是下标变成了2,表示是隐藏层的第二个节点。
同样的,隐藏层的第三和第四个节点(单元)的计算步骤也是一样的。
如果执行NN的程序,用for循环来做上面这些计算,那会很低效,所以下面就要实现向量化计算。
向量化的过程是将神经网络中的一层神经元参数纵向堆积起来,例如隐藏层中参数w的纵向堆积起来变成一个4x3的矩阵,用符号W[1]表示。
另一个方法是,隐藏层有四个逻辑回归单元,且每一个逻辑回归单元都有相对应的参数w向量,把这四个向量堆积在一起,就会得出这4x3的矩阵。
然后把W矩阵乘以输入特征x1,x2,x3,也就是W乘以X矩阵转置。
最后再加上b。
最终得到了上图中的公式,它和上面4个节点的等式是完全相等的。最终计算得到了 z 1 [ 1 ] z^{[1]}_1 z1[1], z 2 [ 1 ] z^{[1]}_2 z2[1], z 3 [ 1 ] z^{[1]}_3 z3[1], z 4 [ 1 ] z^{[1]}_4 z4[1]。
向量化时候有一条经验法则:当在NN一层中有不同的节点,就把它们纵向堆叠起来。所以在这里我们把隐藏层的4个节点
z
1
[
1
]
z^{[1]}_1
z1[1],
z
2
[
1
]
z^{[1]}_2
z2[1],
z
3
[
1
]
z^{[1]}_3
z3[1],
z
4
[
1
]
z^{[1]}_4
z4[1]堆叠起来构成一个列向量
Z
[
1
]
Z^{[1]}
Z[1]。类似的,还可以得到矩阵W[1]和b[1]。
最终概括如下
Z
[
1
]
=
W
[
1
]
X
+
b
[
1
]
Z^{[1]}=W^{[1]}X+b^{[1]}
Z[1]=W[1]X+b[1]
同样,概括a如下
a
[
1
]
=
[
a
1
[
1
]
a
2
[
1
]
a
3
[
1
]
a
4
[
1
]
]
=
σ
(
z
[
1
]
)
a^{[1]}=\left[ \begin{array}{c}a^{[1]}_{1}\\ a^{[1]}_{2}\\ a^{[1]}_{3}\\ a^{[1]}_{4} \end{array} \right] = \sigma(z^{[1]})
a[1]=⎣⎢⎢⎢⎡a1[1]a2[1]a3[1]a4[1]⎦⎥⎥⎥⎤=σ(z[1])
我们把本例中NN向量化公式汇总如下
对于神经网络的第一层(隐藏层),给予一个输入X,得到a[1],a[0]可以作为输入特征向量X的别名。通过相似的推导你会发现,下一层的表示同样可以写成类似的形式,得到a[2],即NN的预测结果 y ^ = a [ 2 ] \hat y=a^{[2]} y^=a[2]。
总结:
为了计算输出或者说预测
y
^
\hat y
y^,当你有一个单隐层(浅层)NN,你需要在代码中实现的就是计算上图右边的4个等式,这是一个向量化的计算过程。其中前2个等式是用来计算隐藏层的逻辑回归,而后2个等式是用来计算输出层的逻辑回归。
本节介绍了输入单个特征向量(单样本)如何通过4个公式计算得到双层NN预测结果。
3.4 多样本向量化 Vectorizing across multiple examples
本节将介绍如何将不同训练样本向量化并计算出预测结果。该过程与你在逻辑回归中所做类似。
上图是上一节的4个公式。对于单个训练样本,你可以用它们生成一个预测结果 a [ 2 ] = y ^ a^{[2]}=\hat y a[2]=y^。
如果你有m个训练样本,你需要重复这个过程。
用第一个训练样本x(1)来计算得到
y
^
(
1
)
\hat y^{(1)}
y^(1)。这是对第一个样本的预测。
用第二个训练样本x(2)来计算得到
y
^
(
2
)
\hat y^{(2)}
y^(2)。这是对第二个样本的预测。
依次类推
用第m个训练样本x(m)来计算得到
y
^
(
m
)
\hat y^{(m)}
y^(m)。这是对第m个样本的预测。
用激活函数表示法,把它们写成
a
[
2
]
(
1
)
=
y
^
(
1
)
a^{[2](1)}=\hat y^{(1)}
a[2](1)=y^(1)
a
[
2
]
(
2
)
=
y
^
(
2
)
a^{[2](2)}=\hat y^{(2)}
a[2](2)=y^(2)
依次类推
a
[
2
]
(
m
)
=
y
^
(
m
)
a^{[2](m)}=\hat y^{(m)}
a[2](m)=y^(m)
符号约定
所以,
a
[
2
]
(
i
)
a^{[2](i)}
a[2](i)圆括号中的i表示第i个样本,方括号[2]表示第二层。
如果用for循环遍历m个训练样本,那么方法如上图。
下面将介绍用向量化方法计算。
定义矩阵X,把训练样本横向堆到各列。这是 n x m 维的矩阵。
X
=
[
⋮
⋮
⋮
⋮
x
(
1
)
x
(
2
)
⋯
x
(
m
)
⋮
⋮
⋮
⋮
]
X=\left[ \begin{array}{c} \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]向量以列向量横向堆叠起来。
Z
[
1
]
=
[
⋮
⋮
⋮
⋮
z
[
1
]
(
1
)
z
[
1
]
(
2
)
⋯
z
[
1
]
(
m
)
⋮
⋮
⋮
⋮
]
Z^{[1]}=\left[ \begin{array}{c} \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],同样也是把所有a[1]向量以列向量横向堆叠起来。
A
[
1
]
=
[
⋮
⋮
⋮
⋮
a
[
1
]
(
1
)
a
[
1
]
(
2
)
⋯
a
[
1
]
(
m
)
⋮
⋮
⋮
⋮
]
A^{[1]}=\left[ \begin{array}{c} \vdots & \vdots & \vdots & \vdots\\ a^{[1](1)} & a^{[1](2)} & \cdots & a^{[1](m)}\\ \vdots & \vdots & \vdots & \vdots\\ \end{array} \right]
A[1]=⎣⎢⎢⎡⋮a[1](1)⋮⋮a[1](2)⋮⋮⋯⋮⋮a[1](m)⋮⎦⎥⎥⎤
类似的,还可以定义矩阵Z[2]和A[2]。
现在我们可以得到神经网络多样本情况向量化的计算公式如下
矩阵Z[1],A[1],Z[2]和A[2]中的元素
- 横向表示不同训练样本,从左向右扫描,可以遍历整个训练集。
- 竖向表示NN中每一层的不同节点
例如,矩阵的最左上角元素,它是位于第一个训练样本上的第一个隐藏单元。它的下方的元素(第一列,第二行)对应于第一个训练样本上的第二个隐藏单元。