简单总结一下我们之前学习的内容。
在之前的笔记中我总结了吴恩达老师课程的深度学习概论、逻辑回归算法、浅层神经网络。
学习了设立单隐层神经网络—>初始化参数—>正向传播计算预测值—>计算导数—>梯度下降算法—>反向传播修正参数
从这个笔记开始,我们正式进入深层神经网络deep neural network
一、什么是深层神经网络?
第一幅图是逻辑回归模型;第二幅图是双层NN,也是含一个隐藏层的NN;第三副图是三层NN,也是含两个隐藏层的NN;第四幅图是六层NN,也是含五个隐藏层的NN。
通常是计算网络层数时,不包含输入层X,或者认为输入层是第零层,而输出层是要包含进去的,除了输出层和输入层就是隐藏层,我们不知道隐藏层具体的运算结果。
二、深层神经网络的符号表示
- L L L表示神经网络层数(在表示数量时,可以用 #layers 表示,即layers_number)上图 L = 4 L=4 L=4,即从输入层开始标注:0,1,2,3,4 . L = 4 L=4 L=4是输出层。
- n [ l ] n^{[l]} n[l]表示第l层的神经元数量,如上图中 n [ 0 ] = n x , n [ 2 ] = 5. n^{[0]}=n_x, n^{[2]}=5. n[0]=nx,n[2]=5.
- a [ l ] a^{[l]} a[l]表示第l层计算的激活函数,如上图中 a [ 0 ] = x , y ^ = a [ L ] = a [ 4 ] . a [ l ] = g [ l ] ( z [ l ] ) a^{[0]}=x,\widehat{y}=a^{[L]}=a^{[4]}. a{[l]}=g^{[l]}(z^{[l]}) a[0]=x,y =a[L]=a[4].a[l]=g[l](z[l])
- w [ l ] w^{[l]} w[l]表示第l层是权重, b [ l ] b^{[l]} b[l]同理。
三、深层神经网络的前向传播
在前面的学习中,我们已经掌握了深层神经网络的结构和表示方法,还是用同样的网络,怎样实现前向传播?
道理其实完全可以类比逻辑回归和浅层神经网络,对之前的原理熟悉的话,很容易得到如下计算式:
z
[
l
]
=
w
[
l
]
a
[
l
−
1
]
+
b
[
l
]
z^{[l]}=w^{[l]}a^{[l-1]}+b^{[l]}
z[l]=w[l]a[l−1]+b[l]
a
[
l
]
=
g
[
l
]
(
z
[
l
]
)
a^{[l]}=g^{[l]}(z^{[l]})
a[l]=g[l](z[l])
其中
a
[
0
]
=
x
.
a^{[0]}=x.
a[0]=x.
向量化
如果是多个样本作为训练集,就需要将样本进行列堆积,比如对于第零层即输入层来说,向量化的输入如下:
X
=
[
.
.
.
.
.
.
.
.
.
.
.
.
x
(
1
)
x
(
2
)
.
.
.
x
(
m
)
.
.
.
.
.
.
.
.
.
.
.
.
]
.
X=\left[ \begin{matrix} ...&...&...&...\\x^{(1)}&x^{(2)}&...&x^{(m)}\\...&...&...&... \end{matrix} \right].
X=⎣⎡...x(1)......x(2)...............x(m)...⎦⎤.
从而得到向量化后的前向传播计算式:
Z
[
l
]
=
w
[
l
]
A
[
l
−
1
]
+
b
[
l
]
Z^{[l]}=w^{[l]}A^{[l-1]}+b^{[l]}
Z[l]=w[l]A[l−1]+b[l]
A
[
l
]
=
g
[
l
]
(
Z
[
l
]
)
A^{[l]}=g^{[l]}(Z^{[l]})
A[l]=g[l](Z[l])
其中
A
[
0
]
=
X
.
A^{[0]}=X.
A[0]=X.
进一步研究,这个网络的输出是怎样的?输出层对于我们来说,其实是网络的第4层,所以可以得到输出层的计算式:
Z
[
4
]
=
w
[
4
]
A
[
3
]
+
b
[
4
]
Z^{[4]}=w^{[4]}A^{[3]}+b^{[4]}
Z[4]=w[4]A[3]+b[4]
Y
^
=
A
[
4
]
=
g
[
4
]
(
Z
[
4
]
)
\widehat{Y}=A^{[4]}=g^{[4]}(Z^{[4]})
Y
=A[4]=g[4](Z[4])
如果要实现多个样本的运算,向量化当然是最好的选择!但是对于每一层的运算即
l
=
1
,
2
,
3
,
.
.
.
,
L
l=1,2,3,...,L
l=1,2,3,...,L的运算,显式for循环无疑是最棒的选择!!!
到这里就结束了深层神经网络基础的学习,是不是感觉很快?因为大多数的内容都可以类比逻辑回归算法和浅层神经网络(单隐层神经网络),不过是重复多次的过程。
如何降低程序出现bug的概率,这个问题是非常值得我们去思考的。在接下来的课程中,将介绍如何非常仔细和系统化地思考矩阵的维数。吴恩达老师在debug自己的代码时,同样会拿出草稿纸仔细核对矩阵的维数。