引言

    卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,是在经典神经网络的基础上增加了卷积层和混合层,阅读本文前,请先了解人工神经网络相关知识。

一、柔性最大值(softmax)

    柔性最⼤值的想法其实就是为神经⽹络定义⼀种新式的输出层。开始时和 S 型层⼀样的,⾸先计算带权输⼊zjL=kwjkLakL1+bjLz_j^L = \sum_kw_{jk}^La_k^{L-1} + b_j^L 。不过,这⾥我们不会使⽤ S 型函数来获得输出。⽽是,在这⼀层上应⽤⼀种叫做柔性最⼤值函数在 zjLz_j^L 上。根据这个函数,第 jj 个神经元的**值 ajLa_j^L 就是ajL=ezjLkezkL a_j^L = \frac{e^{z_j^L}}{\sum_ke^{z_k^L}} 其中,分⺟中的求和是在所有的输出神经元上进⾏的。
    根据定义,输出的**值加起来正好为 1jajL=jezjLkezkL=1 \sum_ja_j^L = \frac{\sum_je^{z_j^L}}{\sum_ke^{z_k^L}} = 1 我们看到柔性最⼤值层的输出是⼀些相加为 1 正数的集合。换⾔之,柔性最⼤值层的输出可以被看做是⼀个概率分布。



二、卷积神经网络的三个基本概念

1. 局部感受野(local receptive fields)

① 概念
    和通常⼀样,我们把输⼊像素连接到⼀个隐藏神经元层。但是我们不会把每个输⼊像素连接到每个隐藏神经元。相反,我们只是把输⼊图像进⾏⼩的、局部区域的连接,这个输入图像的区域就称为隐藏神经元的局部感受野。
    每个连接学习⼀个权重,⽽隐藏神经元同时也学习⼀个总的偏置。然后在整个输⼊图像上交叉移动局部感受野,如此重复,构建起第⼀个隐藏层。移动局部感受野的距离称为跨距。

② 实例
    举例说明,我们有⼀个 28 × 28 的输⼊图像,5 × 5 的局部感受野,跨距为[1,1](上下步长均为1),那么隐藏层中就会有 24 × 24 个神经元。具体如下图所示,左边橙色部分即为局部感受野。
机器学习(十三):卷积神经网络(CNN)

2. 共享权重和偏置(shared weights and bias)

① 概念
    前面说到每个连接学习⼀个权重,隐藏神经元同时学习⼀个总的偏置,没有提及的是我们打算对隐藏神经元中的每⼀个使⽤相同的权重和偏置。下面具体说明隐藏神经元是如何共享权重与偏置。
    仍然以上图为例,我们有⼀个 28 × 28 的输⼊图像,5 × 5 的局部感受野,跨距为1,则对第 j, k 个隐藏神经元,输出为:σ ( b+l=04m=04wl,maj+l,k+m ) σ\ (\ b + \sum_{l=0}^4\sum_{m=0}^4w_{l,m}a_{j+l,k+m}\ ) 其中 σσ 是神经元的**函数,b 是偏置的共享值,wl,mw_{l,m} 是⼀个共享权重的 5 × 5 数组,ax,ya_{x,y} 表⽰位置为 x,yx, y 的输⼊**值。

② 特征映射
    我们有时候把从输⼊层到隐藏层的映射称为⼀个特征映射。我们把定义特征映射的权重称为共享权重。我们把以这种⽅式定义特征映射的偏置称为共享偏置。共享权重和偏置经常被称为⼀个卷积核或者滤波器。这一隐藏层也称为卷积层。
    ⽬前我描述的⽹络结构只能检测⼀种局部特征的类型。为了完成图像识别我们需要超过⼀个的特征映射。所以⼀个完整的卷积层由⼏个不同的特征映射组成:
机器学习(十三):卷积神经网络(CNN)
在这个例⼦中,有 3 个特征映射。每个特征映射定义为⼀个 5 × 5 共享权重和单个共享偏置的集合。其结果是⽹络能够检测 3 种不同的特征,每个特征都在整个图像中可检测。然⽽,在实践中卷积⽹络可能使⽤很多的特征映射。

③ 优点
    共享权重和偏置的⼀个很⼤的优点是,它⼤⼤减少了参与的卷积⽹络的参数。对于每个特征映射我们需要 25 = 5 × 5 个共享权重,加上⼀个共享偏置。所以每个特征映射需要 26 个参数。如果我们有 20 个特征映射,那么总共有 20 × 26 = 520 个参数来定义卷积层。作为对⽐,假设我们有⼀个全连接的第⼀层,具有 784 = 28 × 28 个输⼊神经元,和⼀个相对适中的 30 个隐藏神经元,正如我们在本书之前的很多例⼦中使⽤的。总共有 784 × 30 个权重,加上额外的 30 个偏置,共有 23, 550 个参数。换句话说,这个全连接的层有多达 40 倍于卷基层的参数。

3. 混合层(pooling layers)

① 概念
    除了刚刚描述的卷积层,卷积神经⽹络也包含混合层(pooling layers)。混合层通常紧接着在卷积层之后使⽤,它要做的是简化从卷积层输出的信息。详细地说,⼀个混合层取得从卷积层输出的每⼀个特征映射并且从它们提取⼀个凝缩的特征映射。

② 最⼤值混合(max-pooling)
    最⼤值混合是⼀种常⻅的混合技术,⼀个混合单元简单地输出其特定输⼊区域的最⼤**值。如下图所示,选取尺寸为 2 × 2 ,跨距为[2,2]:
机器学习(十三):卷积神经网络(CNN)
我们将最⼤值混合分别应⽤于每⼀个特征映射。从卷积层有 24 × 24 个神经元输出,混合后我们得到 12 × 12 个神经元。如果有三个特征映射,那么组合在⼀起的卷积层和最⼤值混合层看起来像这样:
机器学习(十三):卷积神经网络(CNN)
③ L2混合(L2 pooling)
    另⼀种常⻅的混合技术为L2混合。在这里我们取 2×2 区域中**值的平⽅和的平⽅根,⽽不是最⼤**值。



三、卷积神经网络的架构

1. 概念

    卷积神经网络的架构一般为 输入层 - 卷积层 - 混合层 - (全连接层) - 输出层。
    举例说明,我们有⼀个 28 × 28 的输⼊图像,输出层为10个神经元。我们选择 5 × 5 局部感受野,跨距为 1,20 个特征映射。我们也会插⼊⼀个最⼤值混合层,它⽤⼀个 2 × 2 的混合窗⼝来合并特征,图示如下:
机器学习(十三):卷积神经网络(CNN)
为了简化,从混合层到输出层只用了一个箭头,⽽不是显⽰所有的连接。事实上,这里与经典神经网络一样,是将混合层的每⼀个神经元连接到每⼀个输出神经元,当然,你可以很容易想象到这些连接。

2. **函数、代价函数的选择

    在现代的图像分类⽹络中,对于**函数,更常见是选择是 ReLUReLU 函数(关于ReLUReLU 函数具体内容可参见人工神经网络),而最终层选择的是柔性最⼤值层。更常见的代价函数为对数似然函数(关于对数损失函数具体用法可参见线性模型)。



四、深度学习优化算法

    在人工神经网络一文已介绍梯度下降法,本文将进一步介绍优化梯度下降算法的相关算法。

1.随机梯度下降算法(Stochastic Gradient Descent, SGD)

    当训练输⼊的数量过⼤时,使用传统梯度下降算法会使计算花费很⻓时间,导致学习变得相当缓慢。而SGD能够加速学习。
    机器学习算法中的代价函数通常可以分解成每个样本的代价函数的总和,即 C=1nxCxC = \frac1{n}\sum_xC_x,其中 CC 为代价函数,CxC_x 为每个样本 xx 上的代价函数。SGD的思想是,通过随机选取⼩量训练样本来计算 Cx∇C_x,进⽽估算梯度 C∇C。通过计算少量样本的平均值我们可以快速得到⼀个对于实际梯度 C∇C 的很好的估算,这有助于加速梯度下降,进⽽加速学习过程。
    具体而言,在算法的每一步,我们从训练集中均匀抽出一小批量(minibatch)样本。小批量的数目通常是一个相对较小的数,从一到几百。重要的是,当训练集大小增长时,小批量数目通常是固定的。我们可能在拟合几十亿的样本时,每次更新计算只用到几百个样本。

算法1 随机梯度下降算法在第 k 个训练迭代的更新
Require: 学习率 ϵϵ
Require: 初始参数 θθ
while 停止准则未满足 do
    从训练集中采集 mm 个样本 {x(1),...,x(m)}\{x^{(1)},...,x^{(m)}\} 的小批量数据,其中 x(i)x^{(i)} 对应目标为 y(i)y^{(i)}
    计算梯度估计:g1mθiL(f(x(i);θ),y(i))g\leftarrow {\frac1{m}}∇_θ\sum_iL(f(x^{(i)};θ),y^{(i)})
    应用更新:θθϵgθ\leftarrowθ - ϵg

2.使用动量的随机梯度下降算法(Stochastic Gradient Descent - Momentum, SGD-M)

    虽然随机梯度下降仍然是非常受欢迎的优化方法,但其学习过程有时会很慢。动量方法旨在加速学习,特别是处理高曲率、小但一致的梯度,或是带噪声的梯度。动量算法积累了之前梯度指数级衰减的移动平均,并且继续沿该方向移动。
    从形式上看,动量算法引入了变量 v 充当速度角色——它代表参数在参数空间移动的方向和速率。SGD-M在原步长之上增加与上一时刻步长相关的变量,这意味着参数更新方向不仅由当前的梯度决定,也与此前累积的下降方向有关。这使得参数中那些梯度方向变化不大的维度可以加速更新,并减少梯度方向变化较大的维度上的更新幅度。由此产生了加速收敛和减小震荡的效果。

算法2 使用动量的随机梯度下降算法
Require: 学习率 ϵϵ,动能参数 αα
Require: 初始参数 θθ,初始速度 vv
while 停止准则未满足 do
    从训练集中采集 mm 个样本 {x(1),...,x(m)}\{x^{(1)},...,x^{(m)}\} 的小批量数据,其中 x(i)x^{(i)} 对应目标为 y(i)y^{(i)}
    计算梯度估计:g1mθiL(f(x(i);θ),y(i))g\leftarrow {\frac1{m}}∇_θ\sum_iL(f(x^{(i)};θ),y^{(i)})
    计算速度更新:vαvϵgv\leftarrowαv - ϵg
    应用更新:θθ+vθ\leftarrowθ + v

3.使用Nesterov动量的随机梯度下降算法(Nesterov Accelerated Gradient, NAG)

    受 Nesterov 加速梯度算法启发,Sutskever et al. 提出了动量算法的一个变种,即在计算梯度前应用临时更新。
    Nesterov 动量和标准动量之间的区别体现在梯度计算上。Nesterov 动量中,梯度计算在施加当前速度之后。因此,Nesterov 动量可以解释为往标准动量方法中添加了一个校正因子。

算法3 使用Nesterov动量的随机梯度下降算法
Require: 学习率 ϵϵ,动能参数 αα
Require: 初始参数 θθ,初始速度 vv
while 停止准则未满足 do
    从训练集中采集 mm 个样本 {x(1),...,x(m)}\{x^{(1)},...,x^{(m)}\} 的小批量数据,其中 x(i)x^{(i)} 对应目标为 y(i)y^{(i)}
    应用临时更新:θ~θ+αv\tildeθ\leftarrowθ + αv
    计算梯度(在临时点):KaTeX parse error: Got function '\tilde' with no arguments as subscript at position 25: …ow {\frac1{m}}∇_̲\tildeθ\sum_iL(…
    计算速度更新:vαvϵgv\leftarrowαv - ϵg
    应用更新:θθ+vθ\leftarrowθ + v

4.AdaGrad算法

    SGD、SGD-M 和 NAG 均是以相同的学习率去更新 θθ 的各个分量。而深度学习模型中往往涉及大量的参数,不同参数的更新频率往往有所区别,对于更新不频繁的参数,我们希望单次步长更大,多学习一些知识;对于更新频繁的参数,我们则希望步长较小,使得学习到的参数更稳定,不至于被单个样本影响太多。
    每个参数设置不同的学习率,在整个学习过程中自动适应这些学习率是有道理的。AdaGrad就是自适应模型参数的学习率的一种算法。
    在凸优化背景中,AdaGrad 算法具有一些令人满意的理论性质。然而,经验上已经发现,对于训练深度神经网络模型而言,从训练开始时积累梯度平方会导致有效学习率过早和过量的减小。AdaGrad 在某些深度学习模型上效果不错,但不是全部。

算法4 AdaGrad算法
Require: 全局学习率 ϵϵ
Require: 初始参数 θθ
Require: 小常数 δδ(防止除零操作),为了数值稳定大约设为 10710^{−7}
初始化梯度累积变量 r=0r = 0
while 停止准则未满足 do
    从训练集中采集 mm 个样本 {x(1),...,x(m)}\{x^{(1)},...,x^{(m)}\} 的小批量数据,其中 x(i)x^{(i)} 对应目标为 y(i)y^{(i)}
    计算梯度:g1mθiL(f(x(i);θ),y(i))g\leftarrow {\frac1{m}}∇_θ\sum_iL(f(x^{(i)};θ),y^{(i)})
    累积平方梯度:rr+ggr\leftarrow r + g⊙g
    计算更新:θϵδ+rg∆θ\leftarrow-{\fracϵ{δ + \sqrt r}}⊙g(逐元素地应用求除和平方根)
    应用更新:θθ+θθ\leftarrowθ + ∆θ
end while

5.RMSProp算法

    AdaGrad 根据平方梯度的整个历史收缩学习率,即 rr 是单调递增的,这可能使得学习率在达到最优解前就变得太小了。为了改进这一缺点,RMSProp算法使用指数衰减平均以丢弃遥远过去的历史。
    经验上,RMSProp 已被证明是一种有效且实用的深度神经网络优化算法。目前它是深度学习从业者经常采用的优化方法之一。

算法5 RMSProp算法
Require: 全局学习率 ϵϵ,衰减速率 ρρ
Require: 初始参数 θθ
Require: 小常数 δδ(防止除零操作),为了数值稳定大约设为 10610^{−6}
初始化梯度累积变量 r=0r = 0
while 停止准则未满足 do
    从训练集中采集 mm 个样本 {x(1),...,x(m)}\{x^{(1)},...,x^{(m)}\} 的小批量数据,其中 x(i)x^{(i)} 对应目标为 y(i)y^{(i)}
    计算梯度:g1mθiL(f(x(i);θ),y(i))g\leftarrow {\frac1{m}}∇_θ\sum_iL(f(x^{(i)};θ),y^{(i)})
    累积平方梯度:rρr+(1ρ)ggr\leftarrow ρr + (1-ρ)g⊙g
    计算更新:θ=ϵδ+rg∆θ=-{\fracϵ{\sqrt {δ + r}}}⊙g(逐元素地应用1δ+r{\frac1{\sqrt {δ + r}}}
    应用更新:θθ+θθ\leftarrowθ + ∆θ
end while

6.Adam算法

    Adam是另一种学习率自适应的优化算法。

算法6 Adam算法
Require: 学习率 ϵϵ(建议默认为:0.001)
Require: 矩估计的指数衰减速率,ρ1ρ_1ρ2ρ_2 在区间 [0,1)[0, 1) 内。(建议默认为:分别为 0.9 和 0.999)
Require: 初始参数 θθ
Require: 小常数 δδ(防止除零操作),为了数值稳定大约设为 10810^{−8}
初始化一阶和二阶矩变量 s=0,r=0s=0, r = 0
初始化时间步 t=0t=0
while 停止准则未满足 do
    从训练集中采集 mm 个样本 {x(1),...,x(m)}\{x^{(1)},...,x^{(m)}\} 的小批量数据,其中 x(i)x^{(i)} 对应目标为 y(i)y^{(i)}
    计算梯度:g1mθiL(f(x(i);θ),y(i))g\leftarrow {\frac1{m}}∇_θ\sum_iL(f(x^{(i)};θ),y^{(i)})
    tt+1t \leftarrow t + 1
    更新有偏一阶矩估计:sρ1s+(1ρ1)gs \leftarrow ρ_1s + (1-ρ_1)g
    更新有偏二阶矩估计:rρ2r+(1ρ2)ggr \leftarrow ρ_2r + (1-ρ_2)g⊙g
    修正一阶矩的偏差:s^s1ρ1t\hat s \leftarrow \frac{s}{1-ρ_1^t}
    修正二阶矩的偏差:r^r1ρ2t\hat r \leftarrow \frac{r}{1-ρ_2^t}
    计算更新:θ=ϵs^r^+δ∆θ=-ϵ{\frac{\hat s}{\sqrt {\hat r} + δ}}(逐元素应用操作)
    应用更新:θθ+θθ\leftarrowθ + ∆θ
end while









以上全部内容参考书籍如下:
Michael Nielsen《Neural Networks and Deep Learning》
《Deep Learning》

相关文章:

  • 2021-09-20
  • 2022-12-23
  • 2021-04-17
  • 2021-11-16
  • 2021-11-25
  • 2021-06-05
  • 2022-01-14
  • 2021-08-31
猜你喜欢
  • 2021-06-30
  • 2021-07-12
  • 2021-04-29
  • 2021-08-13
  • 2021-12-02
  • 2021-12-28
  • 2021-09-05
相关资源
相似解决方案