目录
引言
上周在实现房价预测模型案例的时候我们发现不同的学习率对最后结果的影响很大,在学习率为0.001时loss值随epoch的增加出现了先减小后增大的诡异现象。而当我们把学习率手动调整为0.0001之后loss值随epoch次数的变化又趋向于正常了。那么,如何找到一个合适的学习率是我们接下来迫切需要解决的问题。
摘要
学习率是梯度下降法的一个重要的参数,学习率的大小决定着模型训练的平滑程度和稳定性。本文介绍了自适应学习率,其根本原理是让学习率依赖梯度,使其随着梯度的改变而改变,当梯度较大时学习率应该变小,当梯度较小时学习率应该变大,从而让模型可以更高效地训练。为了实现自适应的学习率,我们学习了Adagrad算法和RMSProp算法。在采用了Adagrad算法后我们又发现了“梯度爆炸”的问题。为了解决该问题我们学习了Decay和Warm up方法,这两种方法令 η η η随着时间的改变而改变,从而可以避免 “梯度爆炸” 的现象。本文卷积神经网络基础进行学习,了解了卷积计算的方法以及卷积核、感受野、填充、步幅和池化等相关概念。
abstract
The learning rate is an important parameter of the gradient descent method, and the size of the learning rate determines the smoothness and stability of the model training.This article introduces adaptive learning rate, the fundamental principle of which is to make the learning rate dependent on the gradient, so that it changes with the change of the gradient. When the gradient is large, the learning rate should be smaller, and when the gradient is small, the learning rate should be larger, so that the model can be trained more efficiently.To achieve adaptive learning rates, we learned the Adagrad algorithm and RMSProp algorithm.After adopting the Adagrad algorithm, we discovered the problem of “gradient explosion”.To solve this problem, we learned the Decay and Warm up methods, which allow η η η to change over time, thus avoiding the phenomenon of “gradient explosion”.This article delves into the fundamentals of convolutional neural networks, providing an understanding of convolutional computation methods and related concepts such as convolution kernels, receptive fields, padding, strides, and pooling.
1.自适应学习率(Adaptive Learning Rate)
当loss不再下降的时候并不意味着梯度已经足够小,参数已经到了临界点。loss值逐渐下降到达平稳状态,有两种可能:一是梯度已经足够小,梯度的值接近0甚至等于0;二是学习率过大,导致梯度在最小值附近来回震荡,甚至可能无法收敛。学习率设置过小,梯度更新过程十分缓慢,可能要花很长的时间才会找到最小值;学习率设置过大,又会导致模型越过局部最优解,导致loss值上升。
考虑这样一个例子:右上图的黑点为初始点,而黄叉为最低点。当学习率 η = 1 0 − 2 η=10^{-2} η=10−2时,参数的更新在谷顶和谷底来回震荡,而当学习率 η = 1 0 − 7 η=10^{-7} η=10−7时,参数虽然可以顺利从谷顶下降到谷底,但因为学习率过小又无法接近最低点。所以我们希望学习率可以根据不同的情况自动设置大小来解决这个问题。
从大方向上看,当参数在一个比较平坦的方向下降时,我们需要一个较大的学习率,而当参数在一个比较陡峭的方向下降时,我们需要一个较小的学习率。
那么我们如何让学习率可以自适应呢?我们可以引入一个新的参数
σ
σ
σ,将原来的学习率
η
η
η改为
η
σ
η\over σ
ση,这样一来学习率就会根据
σ
σ
σ的变化而变化了,推导如下:
由于 σ σ σ是梯度的均方根,在坡度比较小的图像上 σ σ σ小,从而 η σ η\over σ ση就大,而在在坡度比较大的图像上 σ σ σ大,从而 η σ η\over σ ση就小,这就实现了学习率的自适应。
1.1 Adagrad 算法
Adagrad( Adaptive Gradient Algorithm)是一种用于机器学习和深度学习的优化算法,它是在2011年由Duchi, Hazan, and Singer提出的。Adagrad的主要特点是能够自适应地调整每个参数的学习率,这对于处理稀疏数据集和具有特征重要性差异较大的问题尤其有效。在传统的梯度下降算法中,所有参数通常共享一个全局的学习率,这可能不是最优的选择,因为不同的参数可能需要以不同的速度更新以达到更快的收敛或更好的性能。Adagrad通过为每个参数维护一个单独的累积梯度平方的和,来实现学习率的自适应调整。
Adagrad算法的步骤如下:
- 初始化累计梯度平方的初始值为零,记为r;
- 对于每个训练样本,计算参数的梯度;
- 将梯度的平方累加到r中,即r = r + 梯度²;
- 根据公式计算每个参数的学习率:学习率 =
η
σ
t
\frac{\eta}{\sigma^{t}}
σtη ,其中
σ
t
\sigma^{t}
σt;
是为了数值稳定性而加入的小值,随梯度的改变而改变; - 根据学习率和梯度更新参数的值:参数 = 参数 - 学习率 × 梯度。
Adagrad算法尽管有其显著的优点,但也存在一些缺陷,主要体现在以下几个方面:
- 学习率衰减过快:Adagrad通过累积过去的梯度平方来调整学习率,这导致随着训练的进行,学习率会逐渐减小,特别是对于频繁更新的参数。在训练的后期,由于累积的梯度平方项持续增加,很多参数的学习率会变得非常小,近乎于零,使得学习过程几乎停止,即使还有改进空间也无法继续优化模型。
- 梯度消失问题:虽然Adagrad主要是因学习率衰减过快而闻名,但累积的梯度平方项在数值上不断增长,对于那些在训练过程中梯度一直较小的参数,即使这些参数实际上可能还需要进一步优化,它们的学习率也会因为分母过大而变得极其微小,这在某种程度上类似于梯度消失问题,限制了这些参数的进一步学习。
- 需要对学习率进行额外的调参:虽然Adagrad减少了对全局学习率的依赖,但它仍然需要对算法中的某些参数(如初始学习率)进行仔细调优,以达到最佳性能。
- 内存消耗:由于Adagrad需要为模型中的每个参数维护一个累积梯度平方的向量或矩阵,这在参数数量非常多的情况下会显著增加内存需求,对于大规模模型或在资源有限的环境中可能成为一个问题。
为解决这些问题,后续发展出了一些Adagrad的变体,如RMSprop、Adadelta和Adam等,这些算法通过引入指数移动平均或其他策略来缓解学习率过快衰减的问题,同时保持了自适应学习率的优点。
1.2 RMSprop 算法
RMSProp(Root Mean Square Propagation)是一种机器学习中的优化算法,由Geoffrey Hinton在2012年提出,它是Adagrad算法的一个扩展,主要用于解决Adagrad中学习率随训练进行而迅速下降的问题。RMSProp通过使用指数加权移动平均(Exponential Moving Average, EMA)来替代Adagrad中的累积梯度平方和,从而实现了对历史梯度信息的更平滑的跟踪。与Adagrad算法不同,RMSProp算法引入了一个衰减系数α 来控制梯度平方累加项的贡献程度。
如上图所示,刚开始时蓝球处于比较平坦的位置,此时梯度小,从而 σ i t \sigma^t_i σit就小,学习率 η σ i t \eta\over\sigma^t_i σitη就大,因此参数更新就比较快。当蓝球下降到中间部分后,此时梯度突然增大,从而 σ i t \sigma^t_i σit就大,学习率 η σ i t \eta\over\sigma^t_i σitη就减小,因此参数更新就会减缓步伐。
RMSProp算法的步骤如下:
- 初始化累计梯度平方的初始值为零,记为 σ i t − 1 \sigma^{t-1}_{i} σit−1;
- 初始化衰减系数 α \alpha α为一个小的常数(如0.9);
- 对于每个训练样本,计算参数的梯度 g i t g^{t}_{i} git;
- 更新累计梯度平方: σ i t = α × σ i t − 1 + ( 1 − α ) × ( g i t ) 2 \sigma^{t}_{i}= \alpha×\sigma^{t-1}_{i}+ (1 - \alpha) ×(g^{t}_{i})^{2} σit=α×σit−1+(1−α)×(git)2;
- 根据公式计算每个参数的学习率:学习率
= η σ t \frac{\eta}{\sigma^{t}} σtη,其中 s i g m a t sigma^{t} sigmat是为了数值稳定性而加入的小值,随梯度的改变而改变; - 根据学习率和梯度更新参数的值:参数 = 参数 - 学习率 × 梯度。
在传统的Adagrad算法中, σ i t \sigma^{t}_{i} σit是将过去梯度之和取平均值开根号,因此时间会对 σ i t \sigma^{t}_{i} σit产生影响。当参数向上走到谷底并向右移动的时候,由于在纵轴的方向上随着时间累积了很多较小的 σ i t \sigma^{t}_{i} σit,当累计到一定量之后就会产生梯度爆炸现象,导致参数在纵轴方向上震荡。但是当参数移动到梯度比较大的地方时又会导致累积的 σ i t \sigma^{t}_{i} σit变大,从而学习率降低,参数更新的步伐又会变小,慢慢地又会回到正轨。
那么我们有没有办法消除这种导致“梯度爆炸”的现象呢?
1.3.Learning Rate Scheduling(学习率调度)
Learning Rate Scheduling(学习率调度)是在机器学习和深度学习中调整优化器的学习率的一种策略。在训练神经网络时,学习率决定了模型权重更新的幅度。一个合适的学习率对于模型收敛到全局最小值非常重要。如果学习率太高,模型可能无法收敛或者会在最小值周围震荡;如果学习率太低,模型可能会收敛得太慢。
1.3.1.Decay
Learning rate decay(学习率衰减)是机器学习和深度学习中一种常见的技术,用于在训练过程中逐渐减小学习率。初始阶段较高的学习率可以帮助模型快速收敛,但随着训练的进行,较小的学习率有助于模型更精细地调整权重,从而避免在损失函数的最小值附近振荡或错过局部最小值。随着时间的推移,我们会越来越接近最低点,从而我们只需要较小的学习率来逼近临界点,防止梯度爆炸现象的发生。
1.3.2.Warm Up
Warm up(预热)是机器学习和深度学习中的一种训练策略,尤其是在处理大规模数据集和复杂模型时经常使用。Warm up的基本思想是在训练开始时使用较低的学习率,然后逐渐增加到预定的学习率水平。这种策略可以帮助模型更平稳地进入训练过程,避免在训练初期因学习率过高而导致模型权重的剧烈波动。
参数
σ
i
t
\sigma^{t}_{i}
σit告诉我们梯度下降过程中某个方向的平滑度和陡峭度,但是在梯度下降初始阶段,由于迭代次数较少,
σ
i
t
\sigma^{t}_{i}
σit是不精准的,
σ
i
t
\sigma^{t}_{i}
σit并不能精准的体现梯度下降过程的平滑度和陡峭度,此时如果采用较大的学习率,很可能使得模型对于数据“过拟合(学偏),后续需要更多的轮次才能把参数“拉回来”。因此一开始我们不能让模型的参数更新过快,也就是不能让学习率过大。在初始阶段逐步增加学习率,进行一定的迭代次数后,使得
σ
i
t
\sigma^{t}_{i}
σit逐步精准后,模型对数据具有一定的先验知识,此时再使用较大的学习率模型就不容易学“偏”。较大的学习率能加速模型收敛,通过自动调整学习率,合理的提高和降低学习率,进行参数调优。
2.卷积神经网络基础
2.1.CNN的输入
神经网络只能接受向量的输入,要想把一张图片输入神经网络必须要把这张图片变成向量的形式。实际上一张100x100的图像就是一个三维的张量(tensor),这个张量的形状是(channel, height, width),其中channel分别是Red、Green和Blue三个颜色通道,而height和width分别是图像的高和宽。我们把这个张量按顺序“拉成”一个一维的向量,就可以输入我们的神经网络了。
假设我们中间层的神经元一共有1000个,如果采用全连接的方式,从输入层到中间层的权重参数就已经达到了 3 × 1 0 7 3\times10^7 3×107个。如此多的参数会使我们的模型变得极为复杂,增加过拟合的风险。
那么,我们是不是一定需要用全连接的方式来连接神经元呢?
2.2.感受野
实际上 ,由于图像识别的特殊性,我们并不需要将整张图片的信息都传递给一个神经元,也就说两个层之间的连接方式并不需要全连接 。每个神经元只需要识别图像中的局部特征,再将所有识别出来的特征综合起来判别图像类别。比如识别到鸟嘴、鸟爪、羽毛等特征,神经网络就会将图片识别为一只鸟。
在这个前提下,每个神经元只需要关系某个区域内的情况,这个区域称为感受野(Receptive field)。如图感受野内的信息被处理成了一个27维的向量输入神经元中。
同一个神经元的感受野可以重叠,位置也可以自行设置,不同神经元也可以用同一个位置的感受野,甚至感受野的形状、大小都可以自行设置。
通常在CNN网络里感受野会考虑图片的深度,因此只需要说明感受野的宽度和高度就可以描述感受野的大小。图中3x3称为卷积核大小,卷积核每次移动的距离称为步长。为了不遗漏图像的特征,前后两个移动的位置应该要高度重合,最后一个没有填满卷积核的位置应该要做补0处理(或者是补均值)。每个感受野由一组神经元(例如64个)负责观测。
2.3.卷积计算
卷积是数学分析中的一种积分变换的方法,在图像处理中采用的是卷积的离散形式。这里需要说明的是,在卷积神经网络中,卷积层的实现方式实际上是数学中定义的互相关(cross-correlation)运算,与数学分析中的卷积定义有所不同,这里跟其他框架和卷积神经网络的教程保持一致,都使用互相关运算作为卷积的定义,具体的计算过程如上图所示。
2.4.填充
Padding(填充)是卷积神经网络中的一个重要概念,它指的是在输入数据边缘添加额外的像素或值的过程。Padding 的主要目的是保持输出特征图的尺寸,使其与输入尺寸一致或接近一致,避免遗漏信息。
2.5.参数共享
假设两个神经元的任务都是识别鸟嘴,两张图片中鸟嘴的区域都处于不同的位置,那么对于这两个神经元来说,我们是否需要两组不一样的权重参数去完成这个任务呢?实际上我们可以让这两个神经元共享同一组参数,因为它们的任务都是识别鸟嘴,共享同一组参数可以降低模型的复杂度。
共享同一组参数后并不会产生同样的输出,因为它们输入的信息都是不一样的。
从另一个角度再来解释CNN:假设我们有一个个3x3xChannel大小的filter,也就是卷积核。每个卷积核可以从图片中抓取相应的特征,卷积核里的参数都是未知的,是要通过梯度下降法求得的。
例如有一张6x6x1的图像,卷积核是3x3x1,卷积核按步长为1进行卷积。
卷积实际上是将卷积核与原图像对应位置的数字进行相乘并求和,最后形成了一张4x4大小的矩阵。
矩阵最大的数字也揭示了原图片中蕴含的特征。例如卷积核主对角线上面的数字全为1,而剩下位置的数字全为-1,当卷积核在原图像中运动时,只有原图像感受野内主对角线为1的特征时才能使得卷积之后求得的矩阵出现最大的数字3。因此从矩阵中的数字3出现在矩阵的左上角和左下角可以判断原图像中主对角线全为1的特征也出现在图像的左上角和左下角。
每个卷积核都对图像进行一次卷积计算,把所有卷积核计算出来图像合成到一块之后被称为Feature Map(特征图)。
假如有64个卷积核,每个卷积核对原图像进行一次卷积计算,最后计算出来的结果可以看做一个含64个channel的图像,而在第二层卷积中由于传入的图像有64个channel,因此我们的filter的尺寸应为3x3x64(与输入图像的channel保持一致)。
考虑这样一个问题:卷积核大小仅设为3x3会不会让我们忽略掉其他比较大的pattern呢?实际上不会。如图上所示,在第二层卷积中卷积核大小仍然是3x3,但是对应到原图像上的感受野其实已经达到了5x5。随着我们卷积的深度加深,神经元的感受野会变得越来越大。
2.6.池化
将一张图片进行子采样,比如去掉偶数的column和奇数的row可以得到一张更小的图片,这样图片并不会影响对原图像的辨识。这种简化图片的操作在CNN中称之为池化。池化(Pooling)是卷积神经网络(CNN)中的一个重要组成部分,它主要用于减少特征图的尺寸,同时保持最重要的信息。池化层通常位于卷积层之后,用于降低数据的维度,减少计算量,并增强模型的平移不变性。
最大池化(Max Pooling)最常用的池化类型,它选择每个池化窗口内的最大值作为输出。例如,对于一个2x2的池化窗口,它会从每个2x2的区域内选出最大的值,然后将这些值组成一个新的特征图。
假如池化池大小是2x2的,原来4x4x64的图像经过了一次池化之后就会变为2x2x64,降低了计算复杂度和减少过拟合风险。
把图像经过多次卷积和池化处理,最后再进行flatten形成一个一维的向量,再将这向量传入全连接层后通过softmax函数就可以进行图像的识别了,这就是整个CNN的流程。
总结
通过这一周的学习,我学习到了如何设置自适应学习率,也了解到了Adagrad算法的优缺点。Adagrad算法的主要思想是根据每个参数的梯度历史信息来自适应地调整学习率,但是 Adagrad 算法只是针对不同参数而动态改变学习率,并且由于要考虑历史的梯度信息,这种算法会导致 “梯度爆炸” 现象。为了解决这个问题,我们可以采用decay或者warm up的方法让 η \eta η的值可以随时间变化。我们还学习了RMSProp算法,该算法引入了一个衰减系数α,用来控制梯度平方累加项的贡献程度,可以根据梯度的值来合理的增大和减少学习率,从而避免出现学习率过大,导致梯度来回震荡。在学习完自适应的学习率后,我又学习了卷积神经网络基础,了解了卷积计算的方法以及卷积核、感受野、填充、步幅和池化等相关概念,使得我对卷积神经网络的实现过程有了更加深刻的印象。