1.看了浅层神经网络和深层神经网络,两种一块整理了一下。
2.正向传播和反向传播的具体计算过程看了一篇博客
3.吴恩达深度学习的第二周课后作业做了一半。
首先,从整体上来说,神经网络只是比逻辑回归多了一层中间的隐藏层,与逻辑回归计算一致,只是重复了两次。
第一层:从输入层到隐藏层:
z [ 1 ] = W [ 1 ] x + b [ 1 ] z^{[1]} = W^{[1]}x+b^{[1]} z[1]=W[1]x+b[1]
a [ 1 ] = σ ( z [ 1 ] ) a^{[1]}=σ(z^{[1]}) a[1]=σ(z[1])
第二层:从隐藏层到输出层
z [ 2 ] = a [ 1 ] x + b [ 2 ] z^{[2]} = a^{[1]}x+b^{[2]} z[2]=a[1]x+b[2]
a [ 2 ] = σ ( z [ 2 ] ) a^{[2]} = σ(z^{[2]}) a[2]=σ(z[2])
方括号上标[i]表示当前所处的层数,圆括号上标(i)表示第i个样本
通常输入层记为第0层,所以单隐层神经网络也记为两层神经网络
关于隐藏层对应的权重和常数项b:
第i层的w的行为该层神经元个数,列为上层神经元个数
第i层的b的行为该层神经元个数,列始终为1
接下来开始详细推导神经网络计算过程:
首先是单个样本:
z
[
1
]
=
W
[
1
]
x
+
b
[
1
]
z^{[1]}=W^{[1]}x+b^{[1]}
z[1]=W[1]x+b[1]
a [ 1 ] = σ ( z [ 1 ] ) a^{[1]}=σ(z^{[1]}) a[1]=σ(z[1])
z [ 2 ] = W [ 2 ] a [ 1 ] + b [ 2 ] z^{[2]}=W^{[2]}a^{[1]}+b^{[2]} z[2]=W[2]a[1]+b[2]
a
[
2
]
=
σ
(
z
[
2
]
)
a^{[2]}=σ(z^{[2]})
a[2]=σ(z[2])
其中
W
[
1
]
W^{[1]}
W[1]为:
W
[
1
]
=
[
W
1
[
1
]
T
W
2
[
1
]
T
W
3
[
1
]
T
W
4
[
1
]
T
]
W^{[1]}=\begin{bmatrix} {W^{[1]T}_1}\\ {W^{[1]T}_2}\\ {W^{[1]T}_3}\\ {W^{[1]T}_4}\\ \end{bmatrix}
W[1]=⎣⎢⎢⎢⎡W1[1]TW2[1]TW3[1]TW4[1]T⎦⎥⎥⎥⎤
a
[
1
]
a^{[1]}
a[1]为:
a
[
1
]
=
[
a
1
[
1
]
a
2
[
1
]
a
3
[
1
]
a
4
[
1
]
]
a^{[1]}=\begin{bmatrix} {a^{[1]}_1}\\ {a^{[1]}_2}\\ {a^{[1]}_3}\\ {a^{[1]}_4}\\ \end{bmatrix}
a[1]=⎣⎢⎢⎢⎡a1[1]a2[1]a3[1]a4[1]⎦⎥⎥⎥⎤
如果是m个样本:
使用for循环求解正向输出:
for i = 1 to m:
z
[
1
]
(
i
)
=
W
[
1
]
x
(
i
)
+
b
[
1
]
z^{[1](i)}=W^{[1]}x^{(i)}+b^{[1]}
z[1](i)=W[1]x(i)+b[1]
a
[
1
]
(
i
)
=
σ
(
z
[
1
]
(
i
)
)
a^{[1](i)}=σ(z^{[1](i)})
a[1](i)=σ(z[1](i))
z
[
2
]
(
i
)
=
W
[
2
]
x
(
i
)
+
b
[
2
z^{[2](i)}=W^{[2]}x^{(i)}+b^{[2}
z[2](i)=W[2]x(i)+b[2
a
[
2
]
(
i
)
=
σ
(
z
[
2
]
(
i
)
)
a^{[2](i)}=σ(z^{[2](i)})
a[2](i)=σ(z[2](i))
使用矩阵的话:
Z
[
1
]
=
W
[
1
]
X
+
b
[
1
]
Z^{[1]}=W^{[1]}X+b^{[1]}
Z[1]=W[1]X+b[1]
A [ 1 ] = σ ( Z [ 1 ] ) A^{[1]}=σ(Z^{[1]}) A[1]=σ(Z[1])
Z [ 2 ] = W [ 2 ] A [ 1 ] + b [ 2 ] Z^{[2]}=W^{[2]}A^{[1]}+b^{[2]} Z[2]=W[2]A[1]+b[2]
A [ 2 ] = σ ( Z [ 2 ] ) A^{[2]}=σ(Z^{[2]}) A[2]=σ(Z[2])
X的维度为(n,m),
Z
[
1
]
Z^{[1]}
Z[1]的维度为(4,m),4为隐藏神经元个数。
A
[
1
]
A^{[1]}
A[1]的维度与
Z
[
1
]
Z^{[1]}
Z[1]相同;
Z
[
2
]
Z^{[2]}
Z[2]和
A
[
2
]
A^{[2]}
A[2]的维度均为(1,m)。对上面这四个矩阵来说,均可以这样来理解:行表示神经元个数,列表示样本数目m。
激活函数:
sigmoid函数和tanh函数比较:
对于隐藏层的激活函数,一般来说,tanh函数要比sigmoid函数表现更好一些。因为tanh函数的取值范围在[-1,+1]之间,隐藏层的输出被限定在[-1,+1]之间,可以看成是在0值附近分布,均值为0。这样从隐藏层到输出层,数据起到了归一化(均值为0)的效果。
因此,隐藏层的激活函数,tanh比sigmoid更好一些。而对于输出层的激活函数,因为二分类问题的输出取值为{0,+1},所以一般会选择sigmoid作为激活函数。
缺点:当x很大时,梯度会很小,梯度下降算法效率很低。
解决:出现了ReLu函数:Z大于0时梯度始终为1,缺点是小于0时梯度为0,但实际中影响不是都很大。
总结:一般会使用ReLu函数作为激活函数
为什么需要非线性的激活函数:
如果采用线性激活函数,事实上神经网络与直接使用线性模型并无差别。即便是包含多层隐藏层的神经网络,最终的输出仍然是输入x的线性模型。这样的话神经网络就没有任何作用了。
如果隐藏层使用线性激活函数,而输出层使用非线性激活函数,那么将与逻辑回归模型一样,失去了多层神经网络的意义。
随机初始化
神经元的权重w不可以全部初始化为0,因为这样会使每个神经元都会有相同的结果,设置多个隐藏层将毫无意义。
应该随机初始化为很小的数。
之所以初始化为很小的数是因为在使用sigmoid函数或tanh激活函数时梯度较大,可以更快达到全局最优解。
反向传播计算过程参考博客:
https://blog.csdn.net/ft_sunshine/article/details/90221691