#“Datawhale X 李宏毅苹果书 AI夏令营”
第 3 章 深度学习基础
3.3 自适应学习率
概念:
自适应学习率(adaptive learning rate):给每一个参数不同的学习率。如果在某一个方向上,梯度的值很小,非常平坦,我们会希望学习率调大一点;如果在某一个方向上非常陡峭,坡度很大,我们会希望学习率可以设得小一点。
【大白话,动态地 调整 学习率】
参考学习:
以下是常见的自适应学习率算法:
3.3.1 AdaGrad
AdaGrad(Adaptive Gradient) 是典型的自适应学习率方法,其能够根据梯度大小自动调整学习率。 AdaGrad 可以做到梯度比较大的时候,学习率就减小,梯度比较小的时候,学习率就放大。
对比学习:
AdaGrad优化器(理论、公式、代码实现)-CSDN博客https://blog.csdn.net/m0_48923489/article/details/136854257
3.3.2 RMSProp
RMSprop(Root Mean Squared propagation):同一个参数的同个方向,学习率也是需要动态调整。
RMSProp Explained | Papers With Codehttps://paperswithcode.com/method/rmsprop
RMSProp — PaddleEdu documentation (paddlepedia.readthedocs.io)https://paddlepedia.readthedocs.io/en/latest/tutorials/deep_learning/optimizers/rmsprop.htmlRMSProp:基于自适应学习率的优化算法-CSDN博客
https://blog.csdn.net/m0_70911440/article/details/134750757
3.3.3 Adam
最常用的优化的策略或者优化器(optimizer) 是Adam(Adaptive moment estimation) [7]。 Adam 可以看作 RMSprop 加上动量,其使用动量作为参数更新方向,并且能够自适应调整学习率。 PyTorch 里面已经写好了 Adam 优化器,这个优化器里面有一些超参数需要人为决定,但是往往用 PyTorch 预设的参数就足够好了。
Adam vs RMSprop:比较两种优化算法的表现与优缺点# 1.背景介绍 随着深度学习和机器学习技术的发展,优化算 - 掘金 (juejin.cn)
3.4 学习率调度
(1)问题阐述:
(2)概念:
学习率调度(Learning Rate Scheduling):是深度学习训练过程中一个重要的技术,用于动态调整学习率以优化模型的收敛速度和稳定性。
学习率衰减(learning rate decay):也称为学习率退火(learning rateannealing),是学习率调度中最常见的策略。具体操作是:随着参数的不断更新,让 η 越来越小,
如图 3.28 所示。图 3.22b 的情况,如果加上学习率下降,可以很平顺地走到终点,如图 3.29 所示。在图 3.22b 红圈的地方,虽然步伐很大,但 η 变得非常小,步伐乘上 η 就变小了,就可以慢慢地走到终点。
(3)常见的学习率调度策略包括:
(4)如何实现:
PyTorch中怎么实现学习率调度 - 小航博客 (csbsgyl.com)https://www.csbsgyl.com/14157.html
3.5 优化总结
3.6 分类
3.6.1 分类与回归的关系
回归任务
回归任务的目标是预测一个连续值的输出,给定一个输入向量 x,模型输出一个预测值 y^,目标是使 y^尽可能接近实际的标签值 y。
分类任务
分类任务的目标是预测一个离散的类别标签。然而,可以将分类任务视为回归的一种特殊情况,即输出是一个离散的数值,代表不同的类别。
分类作为回归的局限性
- 顺序关系假设:如果直接将类别编码为连续的整数(例如,类 1 编号为 1,类 2 编号为 2,类 3 编号为 3),那么这种方法会隐含地假设类别之间存在某种顺序关系。例如,在预测年级的例子中,一年级和二年级被赋予了相邻的数字,这暗示了一年级和二年级比一年级和三年级更相似。
- 类别间距离无关:如果类别之间不存在自然的顺序或距离关系,那么这种编码方式就会出现问题。例如,类别 1、2 和 3 没有特定的关系,直接用数字表示类别会导致模型误解类别间的相似性。
解决方案
- 独热编码:为了避免上述问题,通常使用独热编码(one-hot encoding)来表示类别。这意味着每个类别会被表示为一个向量,其中只有一个元素为 1,其余均为 0。例如,对于三个类别,它们分别被编码为 [1, 0, 0]、[0, 1, 0] 和 [0, 0, 1]。这样,模型就不会假设类别之间的任何特定关系。
总结
虽然分类任务可以被视为一种特殊的回归任务,但为了更好地处理类别之间的关系,通常采用独热编码来表示类别。这样做不仅可以避免错误地假设类别间的顺序关系,还可以使得模型能够更准确地学习类别之间的差异。
3.6.2 带有 softmax 的分类
-
分类过程概述:分类任务的基本流程包括输入数据 x,通过一系列变换(如矩阵乘法和偏置加法),然后通过激活函数 σ,最终得到一个向量 y^【输入 x,乘上 W,加上 b,通过激活函数 σ,乘上W ′,再加上 b′ 得到向量 yˆ。】
-
这个向量 y^ 通常包含各个类别的未归一化的得分。【实际做分类的时候,往往会把 yˆ 通过 softmax 函数得到 y′,才去计算 y′ 跟 yˆ 之间的距离】
-
Softmax 函数的作用:为了将 y^转换为概率分布,通常会应用 softmax 函数。softmax 函数首先对 y^中的每个元素取指数,这一步将所有值转换为正数。接着,将所有指数化的值相加得到总和,然后用每个指数化的值除以这个总和来进行归一化,使得最终的概率分布之和为 1。
-
Softmax 函数的特性:softmax 函数不仅能够将原始的输出转化为概率分布,还具有放大原始输出中最大值和最小值之间差距的效果。这意味着较大的值经过 softmax 函数后会变得更加突出,而较小的值则趋于接近 0。
Softmax 函数 的公式:
公式解析:
- 给定 y^=[3,1,−3],应用 softmax 函数后的结果是 [0.88,0.12,几乎 0]
- 这里,exp(3)=20、exp(1)=2.7 和 exp(−3)=0.05,归一化后分别变为约 0.88、0.12 和几乎为 0。
- 通过 softmax 函数,可以看到原本较大的值(3)在归一化后占据了更大的比例,而较小的值(-3)则趋近于 0。
结论
在分类任务中,softmax 函数是一种常用的工具,用于将模型的原始输出转换成概率分布。这不仅保证了输出的非负性和归一化性质,而且还能有效地突出最大值,使得模型能够清晰地区分不同类别。
3.6.3 分类损失
- 分类任务流程:【1】首先将输入 x ,【2】通过神经网络,【3】得到预测输出 y^,【4】然后通过 softmax 函数将 y^ 转换成概率分布 y′。【5】之后,需要计算 y′与真实标签 y之间的差异,这一差异可以用作损失函数的依据。
-
损失函数的选择:文中提到了两种常用的损失函数——均方误差和交叉熵。均方误差是计算预测概率分布与真实标签之间的平方差之和;而交叉熵则是计算预测概率分布与真实标签之间的对数差之和。
-
交叉熵的优势:文中指出,尽管均方误差和交叉熵在 y′与 y相同的情况下都能达到最小值,但是从优化的角度来看,交叉熵通常更为优越。这是因为,在预测概率与真实标签相差较大时,交叉熵的梯度更大,这意味着优化过程中的学习速率更快,更容易收敛。
-
优化过程:文中通过一个具体的例子说明了当预测概率 y1 和 y2 发生变化时,两种损失函数的表现差异。特别地,当使用交叉熵作为损失函数时,即使在预测概率与真实标签相差较大的情况下,也能获得较大的梯度,从而使模型更容易通过梯度下降等优化方法找到最优解。
-
结论:由于均方误差在预测概率与真实标签相差较大时梯度非常小,这可能导致优化过程停滞不前。相比之下,交叉熵在这些情况下能够提供更大的梯度,有助于优化过程更顺利地进行。
实验:
把我破电脑给累坏了
代码详解
卷积神经网络是深度学习中的一个非常重要的分支,本作业提供了进行图像分类任务的基本范式。
一、准备数据
二、训练模型
三、应用模型
要完成一个深度神经网络训练模型的代码,大概需要完成下面的内容:
导入所需要的库/工具包
数据准备与预处理
定义模型
定义损失函数和优化器等其他配置
训练模型
评估模型
进行预测
此范式不仅适用于图像分类任务,对于广泛的深度学习任务也是适用的。
导入所需要的库/工具包
# 导入必要的库
import numpy as np
import pandas as pd
import torch
import os
import torch.nn as nn
import torchvision.transforms as transforms
from PIL import Image
# “ConcatDataset” 和 “Subset” 在进行半监督学习时可能是有用的。
from torch.utils.data import ConcatDataset, DataLoader, Subset, Dataset
from torchvision.datasets import DatasetFolder, VisionDataset
# 这个是用来显示进度条的。
from tqdm.auto import tqdm
import random
为了确保实验的可重复性,设置随机种子,并对CUDA进行配置以确保确定性:
# 设置随机种子以确保实验结果的可重复性
myseed = 6666
# 确保在使用CUDA时,卷积运算具有确定性,以增强实验结果的可重复性
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
# 为numpy和pytorch设置随机种子
np.random.seed(myseed)
torch.manual_seed(myseed)
# 如果使用CUDA,为所有GPU设置随机种子
if torch.cuda.is_available():
torch.cuda.manual_seed_all(myseed)
数据准备与预处理
先下载个数据集。
LeeDL-HW3-CNN · 数据集 (modelscope.cn)
下载hw3_data.zip
定义模型
定义损失函数和优化器等其他配置
训练模型
评估模型
进行预测