本期此项目手册:https://linklearner.com/activity/16/15/59
Task 2 内容:
1. 《深度学习详解》- 3.3&4&5 自适应学习率.pdf
2. 《深度学习详解》- 3.6 分类.pdf
3. 实践任务 HW3(CNN)卷积神经网络-图像分类任务
一.自适应学习率 相关笔记
自适应学习率算法是一种动态调整学习率的方法,旨在优化训练过程中的性能。传统的固定学习率方法在整个训练过程中使用单一的学习率,这可能导致训练初期的学习速率过高或后期的学习速率过低。自适应学习率算法通过在训练过程中根据梯度的变化自动调整学习率,从而提高模型的收敛速度和最终性能。
1.动机
自适应学习率算法的动机在于解决固定学习率带来的问题,主要包括:
- 梯度消失或爆炸:固定学习率可能导致在训练初期梯度过大,造成梯度爆炸;而在训练后期梯度过小,导致梯度消失。
- 学习效率低下:固定学习率可能不适合所有训练阶段,导致训练过程中的某些阶段学习效率低下。
- 超参数调整困难:手动调整学习率需要大量的实验和经验,耗时且不一定能达到最优效果。
2. 自适应学习率算法的原理
自适应学习率算法的主要原理是在训练过程中根据梯度的变化动态调整学习率。以下是几种常见的自适应学习率算法:
-
AdaGrad:AdaGrad根据每个参数的历史梯度平方和的累加来调整学习率,使得学习率逐渐减小。这有助于处理稀疏梯度问题,但学习率会单调递减,可能过早停止学习。
-
RMSprop:RMSprop改进了AdaGrad,通过使用滑动平均而不是历史梯度的累加来计算学习率的调整,解决了AdaGrad学习率过早下降的问题。
-
Adam(Adaptive Moment Estimation):Adam结合了AdaGrad和RMSprop的优点,同时使用了梯度的一阶矩估计(动量)和二阶矩估计(未经中心化的方差)。Adam在实践中表现出色,适用于多种任务。
-
Adadelta:Adadelta不使用固定的学习率,而是通过梯度的滑动平均来动态调整学习率,减少了对学习率超参数的依赖。
3. 自适应学习率算法的应用
自适应学习率算法在深度学习中有着广泛的应用,特别是在以下方面:
- 加速收敛:自适应学习率算法能够更快地找到损失函数的最小值,缩短训练时间。
- 提高鲁棒性:自适应学习率算法能够更好地处理非凸优化问题,提高模型的鲁棒性。
- 简化超参数调优:使用自适应学习率算法可以减少对学习率等超参数的手动调整,简化模型训练流程。
4. 实践中的注意事项
尽管自适应学习率算法带来了诸多好处,但在实际应用中也需要注意以下几点:
- 可能过拟合:自适应学习率算法可能会导致模型过拟合,尤其是在数据量较少的情况下。
- 学习率衰减:某些自适应学习率算法(如AdaGrad)会导致学习率随训练进行而逐渐减小,可能需要额外的调整。
- 超参数选择:尽管自适应学习率算法减少了对手动调整学习率的需求,但仍然存在其他超参数需要调优,如Adam中的β1和β2。
二. 分类相关笔记
损失函数
在分类任务中,常用的损失函数包括:
- 交叉熵损失(Cross-Entropy Loss):适用于多分类任务,衡量模型预测概率分布与真实标签分布之间的差异。
- 二元交叉熵损失(Binary Cross-Entropy Loss):适用于二分类任务,特别适用于不平衡数据集。
模型评估指标
评估分类模型的性能通常使用的指标包括:
- 准确率(Accuracy):预测正确的样本数占总样本数的比例。
- 精确率(Precision):预测为正类的样本中真正为正类的比例。
- 召回率(Recall):实际为正类的样本中被正确预测为正类的比例。
- F1分数(F1 Score):精确率和召回率的调和平均值,适用于不平衡数据集。
多分类与单标签 vs. 多标签分类
- 单标签分类:每个样本仅属于一个类别,例如图像分类中的猫和狗分类任务。
- 多标签分类:每个样本可以属于多个类别,例如新闻分类中一篇文章可能同时属于多个主题类别。
模型选择与优化
- 预训练模型:使用在大规模数据集上预训练的模型作为基础,然后针对具体任务进行微调。
- 数据增强:通过对训练数据进行随机变换来增加模型的泛化能力。
- 正则化技术:如Dropout、L1/L2正则化等,防止模型过拟合。
- 超参数调整:通过网格搜索、随机搜索等方式寻找最佳的超参数组合。
思考问题:做分类任务时,选择损失函数为什么用交叉熵而不是平方误差损失?
全文参考这篇文章https://www.cnblogs.com/shine-lee/p/12032066.html
https://zhuanlan.zhihu.com/p/70804197
在分类问题中,类别之间的相关性,缺乏先验
摘自一个同学的回答,感觉跟这个回答很像:做分类任务时用交叉熵而非平方误差损失,主要是因为交叉熵更契合分类任务,衡量的是概率分布差异,对错误分类惩罚大,且在类别不平衡时鲁棒性更好。而平方误差损失主要用于回归问题,在分类中效果不佳。
也就是我们一般难以描述类别之间的相关性,用损失函数来表征模型预测值与标签的差来反映预测效果如何。自然是越小越好,在模型输出预测结果后,为了更好地表示数据,会经过softmax,转化为0-1间的概率,再输入到损失函数中。
交叉熵只与label类别有关,y^p 越趋近于1越好,而均分误差不仅与y^p有关,还与其他项有关,它希望其余项越平均越好
类别间复杂的相似度矩阵是很难去量化的,交叉熵只关注样本所属的类别,显然更合理
从梯度下降角度
当MSE作为损失函数,参数梯度更新会带上sigmoid导数,而该导数当x很大时会趋近于0,从而导致有可能参数更新缓慢。而交叉熵没有。
实践任务 HW3(CNN)卷积神经网络-图像分类任务
卷积神经网络是深度学习中的一个非常重要的分支,本作业提供了进行图像分类任务的基本范式。
- 准备数据
- 训练模型
- 应用模型
要完成一个深度神经网络训练模型的代码,大概需要完成下面的内容:
- 导入所需要的库/工具包
- 数据准备与预处理
- 定义模型
- 定义损失函数和优化器等其他配置
- 训练模型
- 评估模型
- 进行预测
此范式不仅适用于图像分类任务,对于广泛的深度学习任务也是适用的。
代码部分,文档给的已经非常详细了,这里就不过多介绍,仅展示一下最终运行结果