前言

深度学习最基础的网络类型的之一,全连接神经网络(Full Connect Neural Network)是大多数入门深度学习领域的初学者必学的内容,充分体现深度学习方法相比于传统机器学习算法的特点,即大数据驱动、去公式推导、自我迭代更新、黑匣子训练等。

本文介绍单层神经网络、浅层神经网络和深层神经网络,循序渐进地加深对于深度学习基本概念的理解。需要注意的是所有代码基于飞桨PaddlePaddle架构实现。


一、单层神经网络

Logistic回归模型是最简单的单层网络,常被用来处理二分类问题,它使一种用于分析各种影响因素 ( x 1 , x 2 , … , x n ) (x_1,x_2,…,x_n) (x1,x2,,xn)与分类结果 y y y之间的有监督学习方法。

1.1 正向传播

此计算过程等同于线性回归计算,即给每一个输入向量x分配权值,计算出一个结果向量z。同时,为了使神经网络具有非线性特点,引入激活函数来处理线性变换得到的数值。

  • 线性变换(加权和偏置): z = w T x + b z=w^Tx+b z=wTx+b
  • 非线性变换(激活函数): δ ( x ) = 1 1 + e − z \delta (x) = \frac{1}{{1 + {e^{ - z}}}} δ(x)=1+ez1

上式中 w w w为权值, b b b为偏置, x x x为输入值, z z z为线性输出值, δ \delta δ为非线性输出值。

1.2 损失函数

模型需要定义损失函数来对参数 w w w b b b进行优化,损失函数的选择需要具体问题具体分析,以下为两种常见损失函数计算公式。

  • 平方损失函数: L ( y ^ , y ) = 1 2 ( y ^ − y ) 2 L(\hat y,y) = \frac{1}{2}{(\hat y - y)^2} L(y^,y)=21(y^y)2
  • 对数似然损失函数: L ( y ^ , y ) = − [ y log ⁡ y ^ + ( 1 − y ) log ⁡ ( 1 − y ^ ) ] L(\hat y,y) = - [y\log \hat y + (1 - y)\log (1 - \hat y)] L(y^,y)=[ylogy^+(1y)log(1y^)]

上式中 y ^ \hat y y^为计算结果, y y y为实际结果

1.3 梯度下降

梯度下降是一种前反馈计算方法,反映的是一种“以误差来修正误差”的思想,亦是神经网络进行迭代更新的核心过程。

  • 迭代更新: ω = ω − α d L ( ω ) d ω \omega = \omega - \alpha \frac{{dL(\omega )}}{{d\omega }} ω=ωαdωdL(ω)
  • 链式法则: d L ( a , y ) d ω = d L ( a , y ) d a ⋅ d a d z ⋅ d z d ω \frac{{dL(a,y)}}{{d\omega }} = \frac{{dL(a,y)}}{{da}} \cdot \frac{{da}}{{dz}} \cdot \frac{{dz}}{{d\omega }} dωdL(a,y)=dadL(a,y)dzdadωdz

单层网络的代码(Numpy实现和飞桨实现)

二、浅层神经网络

浅层神经网络相比单层网络的差别在于隐藏层有多个神经节点,这就使得其可以处理“多输入多输出”的复杂问题。每一层的每一个节点都与上下层节点全部连接,这种神经网络称作全连接网络。

2.1 正向传播

z [ 1 ] = ( z 1 [ 1 ] z 2 [ 1 ] z 3 [ 1 ] ) = ( w 1 ( 1 ] T ⋅ x + b 1 ( 1 ) w 2 [ 1 ] T ⋅ x + b 2 [ 1 ] w 3 [ 1 ] T ⋅ x + b 3 [ 1 ] ) = ( w 1 [ 1 ] T ⋅ x w 2 [ 1 ] T ⋅ x w 3 ( 1 ] T ⋅ x ) + b [ 1 ] = W [ 1 ] x + b [ 1 ] a [ 1 ] = ( a 1 [ 1 ] a 2 [ 1 ] a 3 [ 1 ] ) = ( t ( z 1 ( 1 ] ) t ( z 2 ( 1 ] ) t ( z 3 [ 1 ] ) ) = t ( z 1 [ 1 ] z 2 [ 1 ] z 3 [ 1 ] ) = t ( z [ 1 ] ) \begin{array}{c} z^{[1]}=\left(\begin{array}{c} z_{1}^{[1]} \\ z_{2}^{[1]} \\ z_{3}^{[1]} \end{array}\right)=\left(\begin{array}{l} w_{1}^{(1] T} \cdot x+b_{1}^{(1)} \\ w_{2}^{[1] T} \cdot x+b_{2}^{[1]} \\ w_{3}^{[1] T} \cdot x+b_{3}^{[1]} \end{array}\right)=\left(\begin{array}{l} w_{1}^{[1] T} \cdot x \\ w_{2}^{[1] T} \cdot x \\ w_{3}^{(1] T} \cdot x \end{array}\right)+b^{[1]}=W^{[1]} x+b^{[1]} \\ a^{[1]}=\left(\begin{array}{l} a_{1}^{[1]} \\ a_{2}^{[1]} \\ a_{3}^{[1]} \end{array}\right)=\left(\begin{array}{c} t\left(z_{1}^{(1]}\right) \\ t\left(z_{2}^{(1]}\right) \\ t\left(z_{3}^{[1]}\right) \end{array}\right)=t\left(\begin{array}{c} z_{1}^{[1]} \\ z_{2}^{[1]} \\ z_{3}^{[1]} \end{array}\right)=t\left(z^{[1]}\right) \end{array} z[1]=z1[1]z2[1]z3[1]=w1(1]Tx+b1(1)w2[1]Tx+b2[1]w3[1]Tx+b3[1]=w1[1]Txw2[1]Txw3(1]Tx+b[1]=W[1]x+b[1]a[1]=a1[1]a2[1]a3[1]=t(z1(1])t(z2(1])t(z3[1])=tz1[1]z2[1]z3[1]=t(z[1])

  • 上角标中括号用于区分不同层
  • 下角标数字表示神经元节点的映射关系
  • 一个神经元节点包含上一层节点数 ω x ω_x ωx b x b_x bx和下一层节点数 z y z_y zy

2.2 反向传播

  • 梯度下降法
    W = W − α ∂ L ∂ W b = b − α ∂ L ∂ b \begin{aligned} \boldsymbol{W} &=\boldsymbol{W}-\alpha \frac{\partial L}{\partial \boldsymbol{W}} \\ b &=b-\alpha \frac{\partial L}{\partial b} \end{aligned} Wb=WαWL=bαbL
  • 向量表达式
    W [ 1 ] = ( w 1 [ 1 ] , w 2 [ 1 ] , w 3 [ 1 ] ) T = [ w 1 [ 1 ] T w 2 [ 1 ] T w 3 [ 1 ]   T ] = [ w 11 [ 1 ] , w 12 [ 1 ] w 21 [ 1 ] , w 22 [ 1 ] w 31 [ 1 ] , w 32 [ 1 ] ] b [ 1 ] = [ b 1 [ 1 ] b 2 [ 1 ] b 3 [ 1 ] ] \boldsymbol{W}^{[1]}=\left(\boldsymbol{w}_{1}^{[1]}, \boldsymbol{w}_{2}^{[1]}, \boldsymbol{w}_{3}^{[1]}\right)^{\mathrm{T}}=\left[\begin{array}{l} \boldsymbol{w}_{1}^{[1]^{\mathrm{T}}} \\ \boldsymbol{w}_{2}^{[1] \mathrm{T}} \\ \boldsymbol{w}_{3}^{[1] \mathrm{~T}} \end{array}\right]=\left[\begin{array}{c} w_{11}^{[1]}, w_{12}^{[1]} \\ w_{21}^{[1]}, w_{22}^{[1]} \\ w_{31}^{[1]}, w_{32}^{[1]} \end{array}\right] \quad b^{[1]}=\left[\begin{array}{l} b_{1}^{[1]} \\ b_{2}^{[1]} \\ b_{3}^{[1]} \end{array}\right] W[1]=(w1[1],w2[1],w3[1])T=w1[1]Tw2[1]Tw3[1] T=w11[1],w12[1]w21[1],w22[1]w31[1],w32[1]b[1]=b1[1]b2[1]b3[1]

浅层网络的代码(Numpy实现和飞桨实现)

三、深层神经网络

随着网络的层数增加,每一层对于前一层次的抽象表示更深入。在神经网络中,每一层神经元学习到的是前一层神经元值的更抽象的表示。例如第一个隐藏层学习到的是"边缘”的特征,第二个隐藏层学习到的是由‘边缘"组成的"形状”的特征,第三个隐藏层学习到的是由"形状"组成的“图案”的特征,最后的隐藏层学习到的是由“图案"组成的"目标"的特征。通过抽取更抽象的特征来对事物进行区分,从而获得更好的区分与分类能力。

3.1 ImageNet发展史

针对ImageNet数据集的图像分类任务,人们提出了许多重要的网络模型,生动形象地向我们展示了深层网络的巨大优势,回顾整个发展史能够发现,深度学习的网络层数从8层到152层逐步增加,网络分类的能力也越来越强。

年份算法错误率主要贡献
1994LeNet5-卷积、池化和全连接,标志CNN的诞生
2012Alex15.3%ReLU、Dropout、归一化
2014GoogLeNet6.66%没有最深只有更深、Inception模块
2015ResNet3.57%152层,深度残差网络
2016、2017Soushen、Momenta2.99%、2.251%SE模块嵌入残差网络

3.2 网络参数

  • 参数:指算法运行迭代、修正最终稳定的值。权重W和偏置b。
  • 超参:开发者人为设定的值。学习率、迭代次数、隐藏层层数、单元节点数、激活函数等

深层网络的代码(Numpy实现和飞桨实现)

总结及展望

全连接神经网络可以用来解决回归任务、预测任务和分类任务,在不考虑计算机性能的条件下,无脑设置更深层次的网络模型往往可以取得更好的效果。本质上它是一种线性神经网络,无法避免地要面临处理非线性数据集精度差的问题。优化主要集中在以下几个方面。
  • 非线性因素:围绕激活函数展开来说,提高计算速率就要使激活函数去积分化、去微分化、易求偏导,解决梯度消失和梯度爆炸的问题。
  • 迭代更新策略:围绕反向传播更新权值和偏置,如损失函数选择、优化器选择、学习率衰减策略等等,在一定程度上可以提高精度。这类问题本质上仍是一种寻优算法的探索,可以引入遗传算法、差分进化、多目标优化等寻找pareto最优解,
  • 骨干网络:网络应该设置多少层,每一层应该有多少个节点,从来没有一套标准的设计模板,毫无方向的在不断测试中摸索前进。
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐