本周主要介绍了神经网络中forward和backward的一般实现和向量实现。一般实现较为简单,向量实现中存在一些疑点
X
\boldsymbol{X}
X 是一个由训练集组成的矩阵,每一列代表一个数据,列数为数据的大小
ω
\boldsymbol{\omega}
ω 是训练参数,大小与
X
\boldsymbol{X}
X一列的大小一致
b
b
b 为偏差(bias),为一个标量
forward
Z
=
n
p
.
d
o
t
(
ω
.
T
,
  
X
)
+
b
\boldsymbol{Z} = np.dot(\boldsymbol{\omega}.T,\;\boldsymbol{X}) + b
Z=np.dot(ω.T,X)+b
A
=
σ
(
Z
)
\boldsymbol{A} = \sigma(\boldsymbol{Z})
A=σ(Z),其中
σ
(
x
)
=
1
1
−
e
−
x
\sigma(\boldsymbol{x}) = \frac{1}{1-e^{-\boldsymbol{x}}}
σ(x)=1−e−x1
通过编程实现为
1
/
(
1
−
n
p
.
e
x
p
(
−
X
)
)
1/(1-np.exp(-\boldsymbol{X}))
1/(1−np.exp(−X))
Cost Function(Loss Function)通过矩阵实现时应该注意Cost Function是将所有的预测误差相加取平均得到的,不可以直接用矩阵乘法使其变为标量
L
=
1
/
m
∗
n
p
.
s
u
m
(
(
−
Y
∗
n
p
.
l
o
g
(
A
)
+
(
1
−
Y
)
∗
n
p
.
l
o
g
(
1
−
A
)
)
)
L = 1/m*np.sum((-\boldsymbol{Y}*np.log(\boldsymbol{A})+(1-\boldsymbol{Y})*np.log(1-\boldsymbol{A})))
L=1/m∗np.sum((−Y∗np.log(A)+(1−Y)∗np.log(1−A))),其中m为样本的个数
backward
backward实际上是一个链式求导的过程,backward最根本的式子是通过梯度下降法来更新w和b
∂
L
∂
A
=
−
(
Y
A
−
1
−
Y
1
−
A
)
∂
A
∂
Z
=
A
(
1
−
A
)
∂
Z
∂
ω
=
X
\frac{\partial L}{\partial \boldsymbol{A}} = -(\frac{\boldsymbol{Y}}{\boldsymbol{A}}-\frac{1-\boldsymbol{Y}}{1-\boldsymbol{A}}) \frac{\partial \boldsymbol{A}}{\partial \boldsymbol{\boldsymbol{Z}}} = \boldsymbol{A}(1-\boldsymbol{A}) \frac{\partial \boldsymbol{Z}}{\partial \boldsymbol{\omega}} = \boldsymbol{X}
∂A∂L=−(AY−1−A1−Y)∂Z∂A=A(1−A)∂ω∂Z=X
所以,我们可以表示
d
ω
d\omega
dω 为
d
ω
=
n
p
.
d
o
t
(
X
,
  
(
A
−
Y
)
.
T
)
d\omega = np.dot(\boldsymbol{X},\;(\boldsymbol{A} - \boldsymbol{Y}).T)
dω=np.dot(X,(A−Y).T),这个求解出来为m个样本训练出w的变化总和,因此应该除以m,所以为
d
ω
=
1
/
m
∗
n
p
.
d
o
t
(
X
,
  
(
A
−
Y
)
.
T
)
d\omega =1/m* np.dot(\boldsymbol{X},\;(\boldsymbol{A} - \boldsymbol{Y}).T)
dω=1/m∗np.dot(X,(A−Y).T)。
同理可求
d
b
db
db,但是由于b为标量,因此需要对求出的m次训练的b求和,即
d
b
=
1
/
m
∗
n
p
.
s
u
m
(
A
−
Y
)
db = 1/m*np.sum(\boldsymbol{A}-\boldsymbol{Y})
db=1/m∗np.sum(A−Y)。根据这两个值即可以更新
ω
\omega
ω 和
b
b
b