Datawhale X 李宏毅苹果书 向李宏毅学深度学习(进阶) 是 Datawhale 2024 年 AI 夏令营第五期的学习活动(“深度学习 进阶”方向)
往期task1链接:深度学习进阶-Task1
往期task2链接:深度学习进阶-Task2
我做的task1的笔记博客:传送门
我做的task2的笔记博客:传送门
Datawhale官方的task3链接:Task3
Github-《深度学习详解》开源地址:传送门
《深度学习详解》主要内容源于《机器学习》(2021年春),选取了《机器学习》(2017年春) 的部分内容,在这些基础上进行了一定的原创,补充了不少除这门公开课之外的深度学习相关知识。为了尽可能地降低阅读门槛,笔者对这门公开课的精华内容进行选取并优化,对所涉及的公式都给出详细的推导过程,对较难理解的知识点进行了重点讲解和强化,以方便读者较为轻松地入门。
在理论严谨的基础上,本书保留了公开课中大量生动有趣的例子,帮助读者从生活化的角度理解深度学习的概念、建模过程和核心算法细节,包括——
-
卷积神经网络、Transformer、生成模型、自监督学习(包括 BERT 和 GPT)等深度学习常见算法,
-
对抗攻击、领域自适应、强化学习、元学习、终身学习、网络压缩等深度学习相关进阶算法。
目录
批量归一化
特征归一化
标准差
考虑深度学习
测试时的批量归一化
内部协变量偏移
批量归一化的作用
批量归一化的局限性
卷积神经网络
卷积神经网络的核心思想
卷积神经网络的结构
卷积神经网络的应用
个人思考与实践
实践代码
批量归一化
批量归一化(Batch Normalization, BN)是一种常用的深度学习技术,它可以加速神经网络的训练过程,并提高模型的稳定性。下面将详细介绍 BN 的原理和作用。
特征归一化
特征归一化是将特征值缩放到一个固定的范围,例如将特征的均值变为 0,方差变为 1。这样做可以加速神经网络的训练过程,并提高模型的稳定性。下图是Z值归一化:
标准差
标准差是衡量一组数据离散程度的指标。标准差越大,说明数据越分散;标准差越小,说明数据越集中。
考虑深度学习
在深度学习中,每层神经网络的输出可以看作是下一层的输入。因此,需要对每层神经网络的输出进行特征归一化,以确保特征的分布是稳定的。批量归一化也可以理解成为网络的一部分
测试时的批量归一化
在测试时,由于没有批量数据,无法进行批量归一化。因此,需要使用训练时计算出的移动平均值来代替批量均值和标准差。
内部协变量偏移
内部协变量偏移是指神经网络内部的特征分布会随着训练过程而发生变化。这种变化会使得梯度下降算法难以收敛,并导致训练过程不稳定。
批量归一化的作用
批量归一化可以有效地解决内部协变量偏移问题,并具有以下作用:
- 加速训练过程:批量归一化可以加速神经网络的训练过程,并减少训练时间。
- 提高模型稳定性:批量归一化可以提高神经网络的稳定性,并减少模型对超参数的敏感性。
- 提高模型性能:批量归一化可以提高神经网络的性能,并提高模型的准确率。
批量归一化的局限性
批量归一化也存在一些局限性:
- 对小型数据集不友好:批量归一化需要足够大的批量数据才能有效地进行归一化。对于小型数据集,批量归一化的效果可能不佳。
- 无法处理在线学习:批量归一化无法处理在线学习,即无法在每一步迭代中使用新的数据进行训练
卷积神经网络
卷积神经网络的核心思想
CNN 的核心思想在于利用图像的局部特征和模式重复性,通过以下三个观察进行简化:
观察 1:检测模式不需要整张图像
- 图像识别任务中,识别物体通常不需要关注整张图像,而是关注图像中包含关键特征的局部区域。
- 这启发我们使用感受野的概念,即每个神经元只关注图像的一小部分区域,而不是整张图像。
Q:感受野一定要相连吗?
A:感受野通常是相连的。这是因为卷积操作的局部性质使得每个神经元的输出是基于输入数据的一个连续区域,但不一定要相连。例如,在处理一些特定任务时,可能会设计一些非局部网络结构(如Non-local Neural Networks),其中的感受野可以跨越不连续的区域,这样的设计有助于捕捉长距离依赖关系。
观察 2:同样的模式可能会出现在图像的不同区域
- 图像中相同的模式可能会出现在不同的位置,例如猫的耳朵可能在图像的任何地方出现。
- 这启发我们使用参数共享的概念,即多个神经元共享相同的参数,用于检测相同模式的重复出现。
观察 3:下采样不影响模式检测
- 对图像进行下采样(例如缩小图像)把图像偶数的列都拿掉,奇数的行都拿掉,图像变成为原来的 1/4,但是不会影响里面是什么 东西,不会改变图像中的关键模式,例如缩小后的图像仍然可以识别出是一只鸟。
- 这启发我们使用池化(Pooling)层,通过下采样减少特征图的空间维度,从而减少计算量。
卷积神经网络的结构
CNN 通常由以下几层组成:
- 卷积层(Convolutional Layer):包含多个卷积核,每个卷积核对输入特征图进行卷积操作,提取局部特征,并生成新的特征图。
- 汇聚层(Pooling Layer):对卷积层生成的特征图进行下采样,减少特征图的空间维度,从而减少计算量。
- 全连接层(Fully Connected Layer):将特征图中的所有特征连接成一个向量,并进行分类或回归操作。
卷积神经网络的应用
CNN 广泛应用于图像识别、目标检测、语义分割、视频分析等任务。例如:
- 图像识别:识别图像中的物体类别,例如猫、狗、汽车等。
- 目标检测:识别图像中的物体位置和类别,例如在图像中找到所有的人和汽车。
- 语义分割:将图像中的每个像素都分配到一个类别,例如将图像分割成天空、道路、树木等区域。
- 视频分析:分析视频中的运动和事件,例如识别视频中的动作和场景。
个人思考与实践
- 感受野的设计:感受野的大小和步幅会影响特征提取的效果。例如,较小的感受野可以提取更精细的特征,但可能无法检测更大的模式。
- 参数共享的优势:参数共享可以减少模型参数的数量,从而减少过拟合的风险,并加快训练速度。
- 汇聚层的选择:最大汇聚和平均汇聚是两种常见的汇聚方式,选择哪种方式取决于具体任务的需求。
- 深度可分离卷积:深度可分离卷积是一种更高效的卷积方式,可以减少参数数量并提高计算效率。
- 残差网络:残差网络可以训练更深的网络,并提高模型的性能。
- 注意力机制:注意力机制可以帮助模型关注图像中的重要区域,从而提高模型的性能。
实践代码
import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
# 定义一个简单的 CNN 模型
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)
self.fc1 = nn.Linear(16 * 12 * 12, 10)
def forward(self, x):
x = self.pool(torch.relu(self.conv1(x)))
x = x.view(-1, 16 * 12 * 12)
x = self.fc1(x)
return x
# 定义数据转换
transform = transforms.Compose([
transforms.Resize((32, 32)),
transforms.ToTensor()
])
# 加载训练数据
train_data = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_data, batch_size=100, shuffle=True, num_workers=2)
# 创建模型和损失函数
model = SimpleCNN()
criterion = nn.CrossEntropyLoss()
# 训练模型
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
for epoch in range(10):
for images, labels in train_loader:
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
print(f'Epoch {epoch + 1}, Loss: {loss.item()}')