深度学习——全连接层(Fully connected dence layers)原理解析
一、简介
- 全连接层有多个神经元,是一个列向量(单个样本)。在计算机视觉领域正常用于深度神经网络的后面几层,用于图像分类任务。

- 全连接层算法包括两部分:前向传播(Forward)和反向传播(Backward)
二、 算法解析
前向传播(Forward)

- 上图主要有5个变量,x , a , W , b , σ x, a,W,b,\sigmax,a,W,b,σ,上图是单层的全连接层,只有一个神经元。
- x xx: 代表一个样本输入的特征的向量,上图x xx是第L [ 0 ] L^{[0]}L[0]层输入,维度为(12287,1)
- w ww: 代表第1层全连接层的权重,维度为(12287,1)
- b bb: 代表偏置,维度为(1,1)
- z zz: 代表神经元的线性计算 z = W T x + b z = W^{T}x + bz=WTx+b,维度(1,1)
- σ \sigmaσ: a = σ ( z ) a =\sigma(z)a=σ(z) 激活函数
- L LL: 交叉熵
- J JJ: 损失函数
图中公式(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 = 0J=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} + bzi=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_idZ=dA∗σ(z)′=ai−yi
d W + = x i d Z \quad dW += x_idZdW+=xidZ
d b + = d Z \quad db += dZdb+=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}dbJ=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-YdZ=∂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)
版权声明:本文为jmu201521121021原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。