深度学习——全连接层(Fully connected dence layers)原理解析
深度学习——全连接层(Fullyconnected dence layers)原理解析一、简介全连接层有多个神经元,是一个列向量(单个样本)。在计算机视觉领域正常用于深度神经网络的后面几层,用于图像分类任务。全连接层算法包括两部分:前向传播(Forward)和反向传播(Backward)二、 算法解析前向传播(Forward)上图主要有5个变量,x,a,W,b,σx, a...
·
深度学习——全连接层(Fully connected dence layers)原理解析
一、简介
- 全连接层有多个神经元,是一个列向量(单个样本)。在计算机视觉领域正常用于深度神经网络的后面几层,用于图像分类任务。
- 全连接层算法包括两部分:前向传播(Forward)和反向传播(Backward)
二、 算法解析
前向传播(Forward)
- 上图主要有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)
更多推荐
已为社区贡献1条内容
所有评论(0)