最近在上模式识别的课,期末的作业是对MNIST库进行两种手段的识别并且比较两者之间的差异,这个是我最终的论文,放到CSDN上供大家学习参考使用。当然有很多话是比较客套的,想要直接使用的同学可以删掉。
源码以及排版好的报告已经放到了我的CSDN下载链接:
BP网络识别MNIST三种优化器
markdown报告文档
当中。
Back Propagation神经网络
和Logistic Regression
在各类模式识别以及算法当中应用十分广泛,同时这两种识别算法需要一定的优化器来使得算法能够更加逼近最优解并且还能够加快收敛速度;同时手写数字识别由于书写较为随意,所以有一定的识别难度,尤其是在以追求完全正确识别率为目标的识别中各种优化算法有着很高的价值。
优化器是智能识别中重要组成部分,由于算法本身收敛速度和对全局最优解的搜索能力有较大差异,所以需要优化器来加快算法本身的收敛并且脱离局部最优解以缩短算法所需要的时间并且提高准确率。
常见的优化器如下:
更新梯度的规则:对整个训练集的数据计算 cost function 对参数的梯度:
θ = θ − η ⋅ ∇ θ J ( θ ) \theta=\theta-\eta \cdot \nabla_{\theta} J(\theta) θ=θ−η⋅∇θJ(θ)
由于这种方法仅仅在一次更新里,就要对整个数据集计算梯度,所以计算时间很长,当遇到大量的数据集时会非常棘手,并且这种优化器不能让新数据实时 更新模型。
更新梯度的规则:每一次仅仅利用一小批的样本,即 n 个样本进行计算,每一次循环作用于该批次的样本数据:
θ = θ − η ⋅ ∇ θ J ( θ ; x ( i : i + n ) ; y ( i : i + n ) ) \theta=\theta-\eta \cdot \nabla_{\theta} J\left(\theta ; x^{(i : i+n)} ; y^{(i : i+n)}\right) θ=θ−η⋅∇θJ(θ;x(i:i+n);y(i:i+n))
Momentum通过对梯度mean的估计,使得梯度在纵向上的正负步长逐步抵消,横向上的步长逐步累积,从而减少了震荡,加快了学习速率。
更新梯度的规则:引入参数 γ v t − 1 \gamma v_{t-1} γvt−1
v t = γ v t − 1 + η ∇ θ J ( θ ) θ = θ − v t \begin{array}{l}{v_{t}=\gamma v_{t-1}+\eta \nabla_{\theta} J(\theta)} \\ {\theta=\theta-v_{t}}\end{array} vt=γvt−1+η∇θJ(θ)θ=θ−vt
Adadelta优化算法会对低频的参数做的更新会比较大,同时对高频的做的更新会比较小,所以对于稀疏的数据Adadelta优化器的表现很好,能够比较好地提高 SGD 的鲁棒性。
梯度更新规则:
θ t + 1 , i = θ t , i − η Δ θ t + ϵ ⋅ g t , i \theta_{t+1, i}=\theta_{t, i}-\frac{\eta}{\sqrt{\Delta \theta_{t}+\epsilon}} \cdot g_{t, i} θt+1,i=θt,i−Δθt+ϵη⋅gt,i
其中 g t , i g_{t, i} gt,i 为t 时刻参数 θ i θ_i θi 的梯度, Δ θ t \Delta \theta_{t} Δθt为指数衰减平均值
Δ θ t = − η E [ g 2 ] t + ϵ g t \Delta \theta_{t}=-\frac{\eta}{\sqrt{E\left[g^{2}\right]_{t}+\epsilon}} g_{t} Δθt=−E[g2]t+ϵηgt
其中 E 的计算公式如下,t 时刻的依赖于前一时刻的平均和当前的梯度:
E [ g 2 ] t = γ E [ g 2 ] t − 1 + ( 1 − γ ) g t 2 E\left[g^{2}\right]_{t}=\gamma E\left[g^{2}\right]_{t-1}+(1-\gamma) g_{t}^{2} E[g2]t=γE[g2]t−1+(1−γ)gt2
这个算法是另一种计算每个参数的自适应学习率的方法。相当于 RMSprop + Momentum,除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方$ v_t$ 的指数衰减平均值 ,也像 Momentum 一样保持了过去梯度 m t m_t mt 的指数衰减平均值,如果 m t m_t mt 和$ v_t$ 被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正,通过计算偏差校正后的 m ^ t \hat{m}_{t} m^t和 v ^ t \hat{v}_{t} v^t来抵消这些偏差:
m t = β 1 m t − 1 + ( 1 − β 1 ) g t v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 \begin{array}{l}{m_{t}=\beta_{1} m_{t-1}+\left(1-\beta_{1}\right) g_{t}} \\ {v_{t}=\beta_{2} v_{t-1}+\left(1-\beta_{2}\right) g_{t}^{2}}\end{array} mt=β1mt−1+(1−β1)gtvt=β2vt−1+(1−β2)gt2
m ^ t = m t 1 − β 1 t v ^ t = v t 1 − β 2 t \begin{array}{l}{\hat{m}_{t}=\frac{m_{t}}{1-\beta_{1}^{t}}} \\ {\hat{v}_{t}=\frac{v_{t}}{1- \beta_{2}^{t}}}\end{array} m^t=1−β1tmtv^t=1−β2tvt
梯度更新的规则:
θ t + 1 = θ t − η v ^ t + ϵ m ^ t \theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{\hat{v}_{t}}+\epsilon} \hat{m}_{t} θt+1=θt−v^t+ϵηm^t
可以把 m ^ t / v ^ t \hat{m}_{t}/{\hat{v}_{t}} m^t/v^t看做是对梯度“信噪比” ( S N R ) (SNR) (SNR)的估计,其中 m m m是信号量,而 v v v是噪音量。当信噪比低时,步长小;信噪比高时,步长大。这正是我们需要的特性,从而使得Adam能够处理噪音样本,并且,在接近最优点的时候,噪音通常会变得很大,或者说真正的信号变得很微弱,信噪比通常会逼近0,这样步长就会变得较小,从而能够起到退火的效果。
基于BP神经网络并且搭配了不同的优化器,基本设置如下:
引入了TensorFLow框架
设置BP神经网络:
输入层有 28 × 28 = 784 28\times28=784 28×28=784个神经元、隐藏层300个神经元、输出层10个神经元。初始化各级权重 w 1 w_1 w1、 w 2 w_2 w2;
各级偏置值 b 1 b_1 b1、 b 2 b_2 b2——都是采用随机数列生成的方式;
定义隐藏层的激活函数为ReLU函数: y = { 0 ( x ≤ 0 ) x ( x > 0 ) y=\left\{\begin{array}{ll}{0} & {(x \leq 0)} \\ {x} & {(x>0)}\end{array}\right. y={0x(x≤0)(x>0)
输出层的激活函数为SoftMax函数: S i = e i ∑ j e j S_{i}=\frac{e^{i}}{\sum_{j} e^{j}} Si=∑jejei ,隐藏层和输出层计算方式都为matul;
选定二次代价函数为取均值的reduce_mean;
优化器分别为最简单的学习率恒定的GradientDescent,通过窗口限定学习率的Adadelta ,主流的自适应Adam三种:
分别设定学习率为0.1-0.9,发现当设置每个批次的大小batch_size = 500,进行10次迭代时候的数据如下,在使用学习率为0.9时能够较快收敛于上限,但是GradientDescent模型并不能自动调节学习率并且一直使用较高的学习率并不合理,很有可能在更多次迭代的过程中使得梯度下降时 J ( θ ) J(\theta) J(θ)不断冲过最小值来回震荡,得到更加糟糕的结果。
Epoch | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
Accuracy | 0.8296 | 0.8771 | 0.8922 | 0.9033 | 0.9062 | 0.9107 | 0.9163 | 0.9189 | 0.922 | 0.9239 |
于是采用learning_rate=0.9,decay_steps=1000, decay_rate=0.98,batch_size = 100的GradientDescent进行100次的学习率衰减迭代(92.35%),结果显示要比相同条件下无衰减定值迭代(91.17%)高1.18%,加入衰减因子之后加快了识别率的收敛也轻微地优化了识别率,同时降低学习率也有助于防止在更高次的迭代过程中 J ( θ ) J(\theta) J(θ)的震荡变大。
与GradientDescent相比,AdaDelta最开始的识别率比较高,并且收敛比较快,但是最终的识别率并没有很大提升,我认为这是因为在进入局部最小值区之后, AdaDelta就会反复在局部最小值附近抖动,脱离不了局部最小值吸引盆,所以和GradientDescent一样只是在局部最优解周围浮动,并且在提高迭代次数到200 次的时候,识别率仍然只能够收敛于92.4%左右,无法再进一步提高。
Adam优化器结合了AdaGrad 和 RMSProp 算法的优点,对于处理MNIST库这样非平稳的数据有着更高的效率,这使得该优化器远优于上述两种优化器的优化果。
在使用 α = 0.001 \alpha=0.001 α=0.001, β 1 = 0.9 , β 2 = 0.999 , ϵ = 1 0 − 8 \beta_1=0.9,\beta_2=0.999,\epsilon=10^{-8} β1=0.9,β2=0.999,ϵ=10−8的条件下优化迭代20次,最终识别率收敛于 97.77 % 97.77\% 97.77%左右,不改变其他参数,在使用 α = 0.002 \alpha=0.002 α=0.002时识别率最终收敛于 98.00 % 98.00\% 98.00% 并且相比之前提到的两种优化器,Adam优化器仅仅在第一次迭代过程中就展现出了良好的特性。
Epoch | 1 | 2 | 3 | 4 | 5 | … | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Accuracy | 0.9177 | 0.9306 | 0.9435 | 0.952 | 0.9582 | … | 0.9727 | 0.9733 | 0.9748 | 0.9761 | 0.9766 | 0.9768 | 0.9766 | 0.9787 | 0.9777 | 0.9771 |
Epoch | 1 | 2 | 3 | 4 | 5 | … | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Accuracy | 0.9261 | 0.9473 | 0.958 | 0.9644 | 0.9673 | … | 0.9791 | 0.9786 | 0.978 | 0.9801 | 0.9791 | 0.9793 | 0.9799 | 0.9797 | 0.9805 | 0.9806 |
引入TensorFlow框架
模型配置:将输入的 28 × 18 = 784 28\times18=784 28×18=784维的特征向量转化为10个特征值;将10个特征值输入SoftMax函数;损失函数选用reduce_mean。
使用GradientDescent
优化器在各个学习率之下进行预测,最终在学习率 α = 0.4 \alpha=0.4 α=0.4的10次迭代中得到了评价最高的准确率:
Options | epoch1 | ephch2 | epoch3 | ephch4 | epoch5 | ephch6 | epoch7 | ephch8 | epoch9 | ephch10 |
---|---|---|---|---|---|---|---|---|---|---|
Accuracy | 0.8643 | 0.887 | 0.8953 | 0.898 | 0.9008 | 0.9033 | 0.9068 | 0.9063 | 0.9062 | 0.9086 |
使用GradientDescent优化器的准确率最高只能达到91%左右。
使用Adadelta
优化器,分别设定学习率 α \alpha α在0.1-0.9得到了不同的准确率。
![image-20190608143353485](/Users/YinXiaojie/Library/Application Support/typora-user-images/image-20190608143353485.png)
其中学习率为0.9时的表现最好,但是最高的识别率仍然只能达到90%左右
使用Adam
优化器,当设定学习率为0.001的时候得到了最优的识别率,但与上述两种优化器的差别不大。
Options | epoch1 | ephch2 | epoch3 | ephch4 | epoch5 | ephch6 | epoch7 | ephch8 | epoch9 | ephch10 |
---|---|---|---|---|---|---|---|---|---|---|
Accuracy | 0.8191 | 0.8536 | 0.8794 | 0.8841 | 0.8903 | 0.8915 | 0.8991 | 0.8977 | 0.9033 | 0.9044 |
LR(Logistic Regression)是一个单层感知器或者说单层神经网络,只能对线性可分的数据进行分类,图片特征值本身并不是一个线性可分的,所以在对于图片的处理上LR并不能达到很好地效果,最终的识别率也只能在90%左右。
BP(Back Propagation Network)是多层感知器,可以学到任意复杂的函数,相比LR来讲适应性更广,所以在相同的条件下,BP识别率的上限要比LR要高。
在使用不同的优化器时,BP表现差异明显,LR差异并不明显,这是因为学习率的动态变化对于LR来讲加速收敛的作用不能够突破LR算法本身的局限性;但是对于BP来讲,本身的识别率上限够高,只要能够脱离局部最小值吸引盆,那么在迭代过程中就能够逼近全局最优解,而AdamOptimizer提供了比较好的解决方案,所以BP最终的识别率要比LR好很多,相比之下其他两种优化器没有提供很好地脱离最小吸引盆的作用使得最终的识别率没有显著的提高。
所以在使用GradientDescent和Adadelta优化器的时候,BP分类器的优势并不明显,但是在使用Adam优化器的时候,BP分类器的优势很大,能够逼近全局最优解但是LR则因为算法本身的局限性而达不到95%以上的识别率。
收敛速度上来看,在提供相同优化器的基础上,BP的收敛速度要优于LR,但是LR开始就比较接近算法本身的最优解。