深度学习——全连接层(Fully connected dence layers)原理解析
一、简介
- 全连接层有多个神经元,是一个列向量(单个样本)。在计算机视觉领域正常用于深度神经网络的后面几层,用于图像分类任务。
- 全连接层算法包括两部分:前向传播(Forward)和反向传播(Backward)
二、 算法解析
前向传播(Forward)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190203114555894.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ptdTIwMTUyMTEyMTAyMQ==,size_16,color_FFFFFF,t_70)
- 上图主要有5个变量,
x
,
a
,
W
,
b
,
σ
x, a,W,b,\sigma
x,a,W,b,σ,上图是单层的全连接层,只有一个神经元。
-
x
x
x: 代表一个样本输入的特征的向量,上图
x
x
x是第
L
[
0
]
L^{[0]}
L[0]层输入,维度为(12287,1)
-
w
w
w: 代表第1层全连接层的权重,维度为(12287,1)
-
b
b
b: 代表偏置,维度为(1,1)
-
z
z
z: 代表神经元的线性计算
z
=
W
T
x
+
b
z = W^{T}x + b
z=WTx+b,维度(1,1)
-
σ
\sigma
σ:
a
=
σ
(
z
)
a =\sigma(z)
a=σ(z) 激活函数
-
L
L
L: 交叉熵
-
J
J
J: 损失函数
图中公式(1)(2)(3)(4)就是前向传播过程,Loss Function 为交叉熵。
反向传播
- 这里也讲解单层的全连接层的反传。反向传播算法是上世纪Hinton发表在nature上一对深度学习影响巨大的算法。读者需要具备点微积分的知识,主要用到链式法则(chain rule)。
- 假设输入数据有m个样本,激活函数为
s
i
g
m
o
i
d
σ
(
x
)
=
1
1
+
e
−
x
,
σ
(
x
)
′
=
σ
(
x
)
(
1
−
σ
(
x
)
)
sigmoid \quad \sigma(x)= \frac{1}{1+e^{-x}}, \sigma(x)' = \sigma(x)(1-\sigma(x))
sigmoidσ(x)=1+e−x1,σ(x)′=σ(x)(1−σ(x)),算法流程
——————————————————————————————————
J
=
0
,
d
W
=
0
,
d
b
=
0
,
d
z
=
0
J = 0, dW = 0,db =0,dz = 0
J=0,dW=0,db=0,dz=0
f
o
r
i
i
n
m
:
for \quad i \quad in \quad m:
foriinm:
\quad
// Forward coumpute
z
i
=
W
T
x
i
+
b
\quad z_i = W^{T}x^{i} + b
zi=WTxi+b
a
i
=
σ
(
z
i
)
\quad a_i= \sigma(z_i)
ai=σ(zi)
J
+
=
−
(
y
i
l
o
g
(
a
i
)
+
(
1
−
y
i
)
l
o
g
(
1
−
a
i
)
)
\quad J += -(y_ilog(a_i) + (1-y_i)log(1-a_i))
J+=−(yilog(ai)+(1−yi)log(1−ai))
\quad
// Backward
d
A
=
y
i
a
i
−
1
−
y
i
1
−
a
i
\quad dA = \frac{y_i}{a_i} - \frac{1-y_i}{1-a_i}
dA=aiyi−1−ai1−yi
d
Z
=
d
A
∗
σ
(
z
)
′
=
a
i
−
y
i
\quad dZ = dA*\sigma(z)'=a _i- y_i
dZ=dA∗σ(z)′=ai−yi
d
W
+
=
x
i
d
Z
\quad dW += x_idZ
dW+=xidZ
d
b
+
=
d
Z
\quad db += dZ
db+=dZ
J
=
−
1
m
J
,
d
W
=
1
m
d
W
,
d
b
=
1
m
d
b
J = \frac{-1}{m}J,dW = \frac{1}{m}dW, db=\frac{1}{m}db
J=m−1J,dW=m1dW,db=m1db
——————————————————————————————————
-
d
A
=
∂
J
∂
a
i
dA = \frac{\partial{J}}{\partial{a_i}}
dA=∂ai∂J
-
d
Z
=
∂
J
∂
a
i
∂
a
i
∂
z
i
dZ = \frac{\partial{J}}{\partial{a_i}} \frac{\partial{a_i}}{\partial{z_i}}
dZ=∂ai∂J∂zi∂ai
-
d
W
=
∂
J
∂
z
i
∂
z
i
∂
W
dW =\frac{\partial{J}}{\partial{z_i}} \frac{\partial{z_i}}{\partial{W}}
dW=∂zi∂J∂W∂zi
-
d
b
=
∂
J
∂
a
i
∂
a
i
∂
b
db = \frac{\partial{J}}{\partial{a_i}} \frac{\partial{a_i}}{\partial{b}}
db=∂ai∂J∂b∂ai
在实际编程中需要注意变量的维度。
- 可以看得出上面算法有个for循环,所以可以用矩阵把它优化,变为下面公式
-
d
Z
=
∂
J
∂
A
∂
A
∂
z
=
A
−
Y
dZ = \frac{\partial{J}}{\partial{A}} \frac{\partial{A}}{\partial{z}} =A-Y
dZ=∂A∂J∂z∂A=A−Y
-
d
W
=
∂
J
∂
z
∂
z
∂
W
=
1
m
d
Z
X
T
dW =\frac{\partial{J}}{\partial{z}} \frac{\partial{z}}{\partial{W}}=\frac{1}{m}dZX^{T}
dW=∂z∂J∂W∂z=m1dZXT
-
d
b
=
∂
J
∂
a
∂
a
∂
b
=
1
m
n
p
.
s
u
m
(
d
Z
,
a
x
i
s
=
1
,
k
e
e
p
d
i
m
s
=
T
r
u
e
)
db = \frac{\partial{J}}{\partial{a}} \frac{\partial{a}}{\partial{b}}=\frac{1}{m}np.sum(dZ,axis=1,keepdims=True)
db=∂a∂J∂b∂a=m1np.sum(dZ,axis=1,keepdims=True)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)