浅层神经网络
笔记前言:这一周的课程思路也和上周的课程思路一样,首先是讲单样本的神经网络,接着是多样本的神经网络,本周课程所讲的神经网络模型是单隐层的神经网络。此外课程还讲了关于激活函数和随机初始化的相关内容。
前向传播-单样本神经网络的输出
第一层的传播过程如下:
第二层的传播过程如下:
对其向量化:
x(3,1)
x
(
3
,
1
)
:3个特征,一个样本,为一个列向量。
W[1](4,3)
W
[
1
]
(
4
,
3
)
:根据输入的行维度确定
W
W
的列维度,本层神经元的个数确定行维度(任意层的维度都是以此方法确定)。
b[1](4,1)
b
[
1
]
(
4
,
1
)
:根据本层神经元个数的个数确定行维度,列维度始终为1(任意层
b
b
的维度都是以此方法确定)
的维度都为
(4,1)
(
4
,
1
)
W[2](1,4)
W
[
2
]
(
1
,
4
)
b[2](1,1)
b
[
2
]
(
1
,
1
)
a[2]
a
[
2
]
为一个标量,也可理解为
(1,1)
(
1
,
1
)
注:上面关于向量维度的说明是基于传播过程出发的,当然也可以从矩阵乘法去理解
前向传播-多样本神经网络的输出
假设输入样本有
m
m
个,多样本的向量化过程如下图所示 ,其过程是对单样本中的输入向量做了“列扩展”,即把每个样本作为一列放入输入矩阵中,由此我们很容易得到的维度都不变(这一点在上面关于维度的说明已有解释),第一层的输出(这里我们用
A[1]
A
[
1
]
表示)的维度变成了
(4,m)
(
4
,
m
)
,每一列即为每个样本产生的输出;第二层的输出(这里我们用
A[2]
A
[
2
]
表示)的维度变成了
(1,m)
(
1
,
m
)
,每一列即为每个样本产生的输出。
下面是关于
m
m
个样本前向传播的for循环形式和向量化形式。
反向传播-神经网络的梯度下降
注:此部分推导是个难点,查阅相关资料也讲得不多,之后。。。不知是什么原因自己把这块想清楚了,首先把最后推导结果放在下面:
参数说明:
特征向量维度:
隐层神经元个数:
n1
n
1
输出神经元个数:
n2=1
n
2
=
1
隐层激活函数用
g[1]
g
[
1
]
表示,输出层激活函数为
sigmoid
s
i
g
m
o
i
d
函数
以下运算过程中的矩阵维度均以用下标给出:
FP:
Z[1]n1×m=W[1]n1×n0⋅Xn0×m+b[1]n1×1−−−−−−(1.1)
Z
n
1
×
m
[
1
]
=
W
n
1
×
n
0
[
1
]
⋅
X
n
0
×
m
+
b
n
1
×
1
[
1
]
−
−
−
−
−
−
(
1.1
)
A[1]n1×m=g[1](Z[1])−−−−−−−−−−−−(1.2)
A
n
1
×
m
[
1
]
=
g
[
1
]
(
Z
[
1
]
)
−
−
−
−
−
−
−
−
−
−
−
−
(
1.2
)
Z[2]n2×m=W[2]n2×n1⋅An1×m+b[2]1×1−−−−−−(1.3)
Z
n
2
×
m
[
2
]
=
W
n
2
×
n
1
[
2
]
⋅
A
n
1
×
m
+
b
1
×
1
[
2
]
−
−
−
−
−
−
(
1.3
)
A[2]n2×m=sigmoid(Z[2])−−−−−−−−−−(1.4)
A
n
2
×
m
[
2
]
=
s
i
g
m
o
i
d
(
Z
[
2
]
)
−
−
−
−
−
−
−
−
−
−
(
1.4
)
BP:
dZ[2]=A[2]−Y
d
Z
[
2
]
=
A
[
2
]
−
Y
dW[2]=1mdZ[2]⋅(A[1])T
d
W
[
2
]
=
1
m
d
Z
[
2
]
⋅
(
A
[
1
]
)
T
db[2]=1mnp.sum(dZ[2])
d
b
[
2
]
=
1
m
n
p
.
s
u
m
(
d
Z
[
2
]
)
dZ[1]=(W[2])T×dZ[2]×g[1]′(Z[1])
d
Z
[
1
]
=
(
W
[
2
]
)
T
×
d
Z
[
2
]
×
g
[
1
]
′
(
Z
[
1
]
)
dW[1]=1mdZ[1]⋅XT
d
W
[
1
]
=
1
m
d
Z
[
1
]
⋅
X
T
db[1]=1mnp.sum(dZ[1])
d
b
[
1
]
=
1
m
n
p
.
s
u
m
(
d
Z
[
1
]
)
其中
dZ[2]、dW[2]、db[2]
d
Z
[
2
]
、
d
W
[
2
]
、
d
b
[
2
]
的推导同单层神经元的推导(只看后两层结构一模一样)
根据前向传播过程和链式求导法则,上面涉及的矩阵求导可参考维基百科,这里用到的公式:
dZ[1]=dZ[2]⋅dZ[2]dA[1]⋅g[1]′(Z[1])=(W[2])T×dZ[2]×g[1]′(Z[1])
d
Z
[
1
]
=
d
Z
[
2
]
⋅
d
Z
[
2
]
d
A
[
1
]
⋅
g
[
1
]
′
(
Z
[
1
]
)
=
(
W
[
2
]
)
T
×
d
Z
[
2
]
×
g
[
1
]
′
(
Z
[
1
]
)
根据公式
(1.3)(1.2)
(
1.3
)
(
1.2
)
dW[1]=dZ[1]⋅dZ[1]dW[T]=1mdZ[1]⋅XT
d
W
[
1
]
=
d
Z
[
1
]
⋅
d
Z
[
1
]
d
W
[
T
]
=
1
m
d
Z
[
1
]
⋅
X
T
根据公式(1.1 )
激活函数
几种常用的激活函数
sigmoid:a=11+e−z
s
i
g
m
o
i
d
:
a
=
1
1
+
e
−
z
导数
a′=a(1−a)
a
′
=
a
(
1
−
a
)
tanh=a=ez−e−zez+e−z
t
a
n
h
=
a
=
e
z
−
e
−
z
e
z
+
e
−
z
导数
a′=1−a2
a
′
=
1
−
a
2
ReLU(修正线性单元)
R
e
L
U
(
修
正
线
性
单
元
)
:
a=max(0,z)
a
=
max
(
0
,
z
)
LeakyReLU:a=max(0.01z,z)
L
e
a
k
y
R
e
L
U
:
a
=
max
(
0.01
z
,
z
)
激活函数的选择
sigmoid
s
i
g
m
o
i
d
函数:除了输出层是个二分类问题,几乎不使用。
tanh
t
a
n
h
函数:
tanh
t
a
n
h
函数适用非常优秀,几乎所有的场合。
ReLU(修正线性单元)
R
e
L
U
(
修
正
线
性
单
元
)
:最常用的默认激活函数