Datawhale × 李宏毅苹果书 AI夏令营-深度学习进阶##AI夏令营Datawhale#夏令营第五期 Task2
该笔记分为三个部分:
一、自适应学习率
二、分类任务
三、HW3卷积神经网络-图像分类
一、自适应学习率
critical point可能不是网络训练过程中遇到的最大阻碍。如下图,网络经过四百次左右的迭代之后loss已经不再下降,但gradient并没有变得很小,反而还有时候会出现上升的情况。
出现上述中的情况可能是,梯度被卡在山谷的两个谷壁之间来回振荡(如误差表面图),这种时候loss不会继续下降,但也没有在临界点上,此时它的梯度仍然很大。最原始的梯度下降连简单的误差表面都做不好,因此需要更好的梯度下降的版本。在梯度下降里面,所有的参数都是设同样的学习率,这显然是不够的,应该要为每一个参数定制化学习率,即引入自适应学习率(adaptive learning rate)的方法,给每一个参数不同的学习率。
1、AdaGrad
AdaGrad(Adaptive Gradient)是典型的自适应学习率方法,其能够根据梯度大小自动调整学习率。AdaGrad 可以做到梯度比较大的时候,学习率就减小,梯度比较小的时候,学习率就放大。此时我们就把固定的学习率更改为了参数化的学习率。固定学习率更新某个参数的过程为:
←
− η
。当我们把学习率改为参数化定制的时候,就需要把原来的学习率η变成
,学习率就变得跟参数相关(parameter dependent),所以对某个
参数的更新过程就变为:
←
−
。其中
=
,
当作新学习率更新的参数。如下图,有两个坡度不一样的参数
和
,
坡度比较小,根据上述中新的参数更新过程可以算出
就比较小。
坡度比较大,根据上述中新的参数更新过程可以算出
就比较大。因此有了
这一项以后,就可以随着梯度的不同,每一个参数的梯度的不同,来自动调整学习率的大小。
2、RMSprop
同一个参数需要的学习率,也会随着时间而改变。例如,在下图中的误差表面中,如果考虑横轴方向,绿色箭头处坡度比较陡峭,需要较小的学习率,但是走到红色箭头处,坡度变得平坦了起来,需要较大的学习率。因此同一个参数的同个方向,学习率也是需要动态调整的,于是就有了一个新的方法———RMSprop(Root Mean Squared propagation)。
此时,我们就需要在AdaGrad的基础上更改参数化定制学习率,=
更改为
=
。其他步骤更AdaGrad一致,那么RMSProp 通过 α 可以决定。例如,下图中的案例,小球从 A 走到 B,AB 段的路很平坦,g 很小,更新参数的时候,我们会走比较大的步伐。走动BC 段后梯度变大了,AdaGrad 反应比较慢,而 RMSprop 会把 α 设小一点,让新的、刚看到的梯度的影响比较大,很快地让
的值变大,很快地让步伐变小,RMSprop 可以很快地“踩刹车”。如果走到 CD 段,CD 段是平坦的地方,可以调整 α,让其比较看重最近算出来的梯度,梯度一变小,
的值就变小了,走的步伐就变大了。
3、Adam
Adam(Adaptive moment estimation)是最常用的优化的策略或者优化器(optimizer)。Adam 可以看作 RMSprop 加上动量,其使用动量作为参数更新方向,并且能够自适应调整学习率。Python 里面的人工智能框架tensorflow和pytorch中都已经写好了 Adam 优化器,这个优化器里面有一些超参数需要人为决定,但是往往用 tensorflow和pytorch 预设的参数就足够好了。
二、分类任务
分类和回归是深度学习中最常见的两种问题。
1、分类与回归的关系
回归是,给定一个输入向量 x,模型的目标是预测一个输出值 y^,我们希望这个预测值 y^ 尽可能接近真实标签 y,其中 y 是我们要学习的目标变量。分类是,给定一个输入向量 x,模型的目标是预测一个输出类别 y^,我们希望这个预测类别 y^ 与真实的类别标签 y 匹配得越好越好,y 是要学习的目标类别。它们主要的区别在于目标变量的性质:回归的任务是预测一个连续值,而分类则是预测一个离散的类别标签。然而,在一些情况下,它们之间存在联系,比如可以通过回归模型预测的概率分布来进行分类决策,或者在某些问题中,通过设定阈值将回归问题转化为分类问题。
如果目标 y 是一个向量,比如 y 是有三个元素的向量,网络也要输出三个数字才行。如下图所示,输出三个数值就是把本来输出一个数值的方法,重复三次。把 a1、a2 和 a3 乘上三个不同的权重,加上偏置,得到 yˆ1;再把 a1、a2 和 a3 乘上另外三个权重,再加上另外一个偏置得到 yˆ2;把 a1、a2 和 a3 再乘上另外一组权重,再加上另外一个偏置得到 yˆ3。输入一个特征向量,产生 yˆ1、yˆ2、yˆ3,希望 yˆ1、yˆ2、yˆ3 跟目标越接近越好。
2、分类的损失函数softmax
按照上述的设定,分类实际过程是:输入 x,乘上 W,加上 b,通过激活函数 σ,乘上W′,再加上 b′ 得到向量 yˆ。但实际做分类的时候,往往会把 yˆ 通过 softmax 函数得到 y′,才去计算 y′ 跟 yˆ 之间的距离。
softmax 的计算先把所有的 y 取一个指数(负数取指数后也会变成正的),再对其做归一化(除掉所有 y 的指数值的和)得到 y′。下图是 softmax 的块(block),输入 y1、y2 和 y3,产生 y′1、y′2 和 y′3。比如 y1 = 3,y2 = 1,y3 = −3,取完指数的时候,exp(3) = 20、exp(1) = 2.7 和 exp(−3) = 0.05,做完归一化后,就变成 0.88、0.12 跟 0。−3取完指数,再做归一化以后,会变成趋近于 0 的值。所以 softmax 除了归一化,让 y′1、y′2 和y′3,变成 0 到 1 之间,和为 1 以外,它还会让大的值跟小的值的差距更大。
三、HW3卷积神经网络-图像分类
如果要完成下列的案例,首先在阿里云交互式建模(DSW)中创建一个实例,通过打开实例中的JupyterLab终端中输入git clone https://www.modelscope.cn/datasets/Datawhale/LeeDL-HW3-CNN.git获取。 阿里云控制台网页:PAI_DSW_人工智能_深度学习_算法开发_Notebook_可视建模_开发环境_阿里云 (aliyun.com)
1、数据准备与预处理
本作业通过利用10类食物的图片数据训练一个卷积神经网络模型,来对图像进行分类。
对图像进行了变换处理。
2、定义模型
构建一个卷积神经网络(Convolutional Neural Network, CNN),该网络包含五个卷积层(Convolutional Layers),每个卷积层后面紧跟一个批归一化层(Batch Normalization Layers)、一个激活函数(Activation Function)以及一个最大池化层(Max Pooling Layers)。在网络的末端,添加一个全连接层(Fully Connected Layer),用于最终的分类或回归任务。这样的架构设计旨在通过卷积层捕捉输入数据的空间特征,批归一化层稳定训练过程,激活函数引入非线性,最大池化层进行特征降维并增强模型的平移不变性,最后通过全连接层进行特征整合以完成最终的预测。
3、定义损失函数和优化器等其他配置
为了训练上述构建的卷积神经网络,我们将设置以下超参数:批量大小(batch size)被定义为64,这意味着每次前向传播和反向传播会处理64个样本;迭代次数(number of epochs)设为8次,即整个训练数据集将被遍历8轮;损失函数选用交叉熵损失(cross-entropy loss),适用于多分类问题;学习率(learning rate)初始化为0.0003,控制着权重更新的幅度;权重衰减(weight decay)设置为1e-5,这是L2正则化的系数,用于防止过拟合,通过在损失函数中加入权重平方的惩罚项来实现。这些设置共同决定了模型训练的过程和最终的性能表现。
4、训练模型和评估模型
在定义的迭代次数范围内,对模型进行训练和验证。每个epoch开始时,首先将模型设置为训练模式,并且对于每一个训练批次,执行前向传播以得到预测值,并计算交叉熵损失。之后,清除之前的梯度,反向传播计算当前梯度,并更新模型参数。同时,计算训练批次的准确率,并记录损失和准确率。每个epoch结束时,打印训练阶段的平均损失和准确率。接着,将模型切换到评估模式,对验证集进行类似的处理,但不进行梯度更新。同样记录每个验证批次的损失和准确率,并在epoch结束时计算平均值并打印出来。如果验证集上的准确率超过了之前的最佳准确率,则更新最佳准确率,并保存当前模型的状态。如果验证准确率没有提升,则增加一个计数器,当该计数器超过预设的耐心值时,触发提前停止机制,终止训练。
6、模型预测
为了对测试数据进行分类预测,首先实例化了一个分类器模型 model_best
并将其移动到指定的计算设备上。接着,加载了之前保存的最佳模型参数。将模型设置为评估模式后,开始处理测试数据集。在禁用梯度计算的情况下,遍历测试数据加载器中的每一个批次,将数据传递给模型以获取预测结果。对于每个批次的预测输出,选取具有最高分数的类别作为预测标签,并将这些标签收集到一个列表 prediction
中,以便后续使用。