共计 6763 个字符,预计需要花费 17 分钟才能阅读完成。
本文全面探讨了卷积神经网络 CNN,深入分析了背景和重要性、定义与档次介绍、训练与优化,详细分析了其卷积层、激活函数、池化层、归一化层,最初列出其训练与优化的多项关键技术:训练集筹备与加强、损失函数、优化器、学习率调整、正则化技巧与模型评估调优。旨在为人工智能学者应用卷积神经网络 CNN 提供全面的领导。
作者 TechLead,领有 10+ 年互联网服务架构、AI 产品研发教训、团队治理教训,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收 AI 产品研发负责人
一、引言
卷积神经网络(Convolutional Neural Networks, CNN)的复杂性和灵活性使其成为深度学习畛域的外围钻研主题之一。在本引言局部中,咱们将深入探讨 CNN 的历史背景、基本原理、重要性以及其在迷信和工业畛域的影响。
1.1 背景和重要性
卷积神经网络的灵感源自人类视觉零碎,特地是视觉皮层中的神经元构造。自 Hubel 和 Wiesel 在 1962 年的开创性工作以来,这一理念曾经引发了一系列钻研和倒退。
- 晚期倒退: 由 Yann LeCun 等人在上世纪 80 年代末到 90 年代初开发的 LeNet- 5 被视为第一个胜利的卷积神经网络。LeNet- 5 在手写数字辨认方面获得了令人印象粗浅的后果。
- 古代崛起: 随着硬件的疾速停顿和大数据的涌现,CNN 在 21 世纪初开始从新崛起,并在各个领域实现了突破性停顿。
CNN 的重要性不仅体现在其精度和效率上,而且还体现在其实践洞见上。例如,卷积层通过共享权重缩小了参数数量,这有助于更无效地训练模型,还加强了模型对平移不变性的了解。
1.2 卷积神经网络概述
卷积神经网络是一种前馈神经网络,它的人工神经元能够响应四周单元的部分区域,从而可能辨认视觉空间的局部结构特征。以下是卷积神经网络的要害组成部分:
- 卷积层: 通过卷积操作检测图像的部分特色。
- 激活函数: 引入非线性,减少模型的表达能力。
- 池化层: 缩小特色维度,减少模型的鲁棒性。
- 全连贯层: 在解决空间特色后,全连贯层用于进行分类或回归。
卷积神经网络的这些组件协同工作,使得 CNN 可能从原始像素中主动学习有意义的特色层次结构。随着深度减少,这些特色从根本形态和纹理逐步形象为简单的对象和场景体现。
卷积神经网络的独特劣势在于其可能自动化许多传统机器学习中须要人工干预的特色工程局部。这一点不仅使其在许多工作中获得了优越性能,还激发了宽泛的学术和工业界的趣味。
二、卷积神经网络层介绍
卷积神经网络由多个层组成,每个层具备特定的目标和性能。这一部分将探讨卷积操作、激活函数、池化层、归一化层基本概念。
2.1 卷积操作
卷积操作是卷积神经网络的外围,波及多个简单的概念和细节。咱们将逐个介绍它们。
卷积核与特色映射
卷积核是一个小型的矩阵,通过在输出上滑动来生成特色映射。每个卷积核都能捕捉不同的特色,例如边缘、角点等。
卷积核大小
卷积核的大小影响了它能捕捉的特色的尺度。较小的卷积核能够捕捉更粗疏的特色,而较大的卷积核能够捕捉更宽泛的特色。
# 应用 3x3 的卷积核
conv_layer_small = nn.Conv2d(3, 64, 3)
# 应用 5x5 的卷积核
conv_layer_large = nn.Conv2d(3, 64, 5)
多通道卷积
在多通道输出下进行卷积,每个输出通道与一个卷积核进行卷积,而后所有的后果相加。这容许模型从不同的通道捕捉不同的特色。
步长与填充
步长和填充管制卷积操作的几何属性。
步长
步长定义了卷积核在输出上挪动的速度。较大的步长能够缩小输入的尺寸,而较小的步长则放弃尺寸不变。
# 应用步长 2
conv_layer_stride2 = nn.Conv2d(3, 64, 3, stride=2)
填充
填充通过在输出边缘增加零来管制输入的尺寸。这有助于管制信息在卷积操作中的失落。
# 应用填充 1,使得输入尺寸与输出尺寸雷同(假如步长为 1)conv_layer_padding1 = nn.Conv2d(3, 64, 3, padding=1)
空洞卷积(Dilated Convolution)
空洞卷积是一种扩大卷积核感触野的办法,它在卷积核的元素之间插入空白。这容许网络捕捉更宽泛的信息,而不减少卷积核的大小或计算量。
# 应用空洞率 2 的卷积核
conv_layer_dilated = nn.Conv2d(3, 64, 3, dilation=2)
分组卷积(Grouped Convolution)
分组卷积通过将输出通道分组并对每组应用不同的卷积核来扩大卷积操作。这减少了模型的容量,并使其可能学习更简单的示意。
# 应用 2 个分组
conv_layer_grouped = nn.Conv2d(3, 64, 3, groups=2)
2.2 激活函数
激活函数在神经网络中起到了至关重要的作用。它们减少了模型的非线性,从而使其可能学习和迫近简单的函数。
ReLU 激活函数
ReLU(Rectified Linear Unit)是古代深度学习中最风行的激活函数之一。它是非线性的,但计算十分高效。
劣势与劣势
ReLU 的次要长处是计算效率高和促成稠密激活。然而,它可能会导致 ” 死亡 ReLU” 景象,其中某些神经元永远不会被激活。
# 应用 PyTorch 定义 ReLU 激活函数
relu = nn.ReLU()
Leaky ReLU
Leaky ReLU 是 ReLU 的一种变体,容许负输出值的小正斜率。这有助于缓解 ” 死亡 ReLU” 问题。
# 应用 PyTorch 定义 Leaky ReLU 激活函数
leaky_relu = nn.LeakyReLU(0.01)
Sigmoid 激活函数
Sigmoid 激活函数能够将任何值压缩到 0 和 1 之间。
劣势与劣势
Sigmoid 用于输入层能够示意概率,但在暗藏层中可能会导致梯度隐没问题。
# 应用 PyTorch 定义 Sigmoid 激活函数
sigmoid = nn.Sigmoid()
Tanh 激活函数
Tanh 是另一个相似于 Sigmoid 的激活函数,但它将输入压缩到 - 1 和 1 之间。
劣势与劣势
Tanh 通常优于 Sigmoid,因为它的输入范畴更大,但仍可能导致梯度隐没。
# 应用 PyTorch 定义 Tanh 激活函数
tanh = nn.Tanh()
Swish 激活函数
Swish 是一种自适应激活函数,可能会主动调整其形态以适应特定问题。
# 应用 PyTorch 定义 Swish 激活函数
class Swish(nn.Module):
def forward(self, x):
return x * torch.sigmoid(x)
其余激活函数
还有许多其余激活函数,例如 Softmax、Mish、ELU 等,各有各的长处和实用场景。
激活函数的抉择
激活函数的抉择取决于许多因素,例如模型架构、数据类型和特定工作的需要。通过试验和调整,能够找到适宜特定问题的最佳激活函数。
2.3 池化层
池化层(Pooling Layer)在卷积神经网络中表演了重要角色,通常用于升高特色映射的维度,从而缩小计算需要,并减少特色检测器的感触野。
最大池化(Max Pooling)
最大池化是最罕用的池化技术之一。它通过抉择窗口中的最大值来升高特色映射的尺寸。
# 应用 PyTorch 定义 2x2 的最大池化层
max_pooling = nn.MaxPool2d(2)
劣势与劣势
最大池化的次要长处是它能保留窗口中的最显著特色。然而,它会失落一些细节信息。
均匀池化(Average Pooling)
与最大池化不同,均匀池化应用窗口中所有值的平均值。
# 应用 PyTorch 定义 2x2 的均匀池化层
average_pooling = nn.AvgPool2d(2)
劣势与劣势
均匀池化能够加重最大池化可能导致的过于突出某些特色的问题,但可能会淡化一些重要特色。
全局均匀池化(Global Average Pooling)
全局均匀池化是一种更简单的池化策略,它计算整个特色映射的平均值。这罕用于网络的最初一层,间接用于分类。
# 应用 PyTorch 定义全局均匀池化层
global_average_pooling = nn.AdaptiveAvgPool2d(1)
池化窗口大小和步长
池化窗口的大小和步长会间接影响输入的尺寸。较大的窗口和步长会更显著地升高尺寸。
池化的代替计划
池化层曾经有了一些古代代替计划,例如应用卷积层的步长大于 1,或应用空洞卷积。这些办法可能提供更好的特色保留。
池化层的抉择
抉择特定类型的池化层取决于工作需要和特定数据个性。深刻了解各种池化技术如何工作,能够帮忙深刻了解它们是如何影响模型性能的。
2.4 归一化层
归一化层在训练深度神经网络时表演了要害角色,次要用于改善训练的稳定性和速度。通过将输出数据缩放到适合的范畴,归一化层有助于缓解训练过程中的梯度隐没和梯度爆炸问题。
批量归一化(Batch Normalization)
批量归一化通过对每个特色通道的输出进行归一化,将输出缩放到零均值和单位方差。
# 应用 PyTorch 定义批量归一化层
batch_norm = nn.BatchNorm2d(num_features=64)
劣势与劣势
- 劣势:它容许更高的学习率,提供了一些正则化成果,通常导致更快的训练。
- 劣势:在小批量上的统计预计可能会导致训练和推理间的不统一。
层归一化(Layer Normalization)
层归一化是在单个样本上对所有特色进行归一化的变体。它在句子解决和循环神经网络中特地风行。
# 应用 PyTorch 定义层归一化
layer_norm = nn.LayerNorm(normalized_shape=64)
实例归一化(Instance Normalization)
实例归一化次要用于款式转换工作,归一化是在每个样本的每个通道上独立进行的。
# 应用 PyTorch 定义实例归一化
instance_norm = nn.InstanceNorm2d(num_features=64)
组归一化(Group Normalization)
组归一化是批量归一化和层归一化之间的一种折衷方案,将通道分为不同的组,并在每个组内进行归一化。
# 应用 PyTorch 定义组归一化
group_norm = nn.GroupNorm(num_groups=32, num_channels=64)
归一化层的抉择
归一化层的抉择应基于特定的工作和模型架构。例如,在视觉工作中,批量归一化可能是首选,而在 NLP 工作中,层归一化可能更有用。
三、训练与优化
卷积神经网络的训练和优化波及许多要害组件和技术,它们独特决定了模型的性能和可用性。上面具体介绍这些方面。
3.1 训练集筹备与加强
无效的训练数据是深度学习胜利的根底。为了使卷积神经网络无效学习,训练集的抉择和加强至关重要。
数据预处理
预处理是训练集筹备的关键步骤,包含:
- 标准化:将输出缩放到 0 - 1 范畴。
- 中心化:减去均值,使数据以 0 为核心。
- 数据荡涤:打消不统一和谬误的数据。
数据加强
数据加强是一种通过利用随机变换减少数据量的技术,从而减少模型的泛化能力。
常见加强技巧
- 图像旋转、缩放和剪裁
- 色彩抖动
- 随机噪声增加
# 应用 PyTorch 进行多种图像增强
from torchvision import transforms
transform = transforms.Compose([transforms.RandomRotation(10),
transforms.RandomResizedCrop(224),
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1)
])
训练集宰割
通常将数据分为训练集、验证集和测试集,以确保模型不会过拟合。
3.2 损失函数
损失函数掂量模型预测与实在指标之间的差距。抉择适当的损失函数是优化模型性能的关键步骤。
回归工作
对于间断值预测,通常应用:
- 均方误差(MSE):掂量预测值与实在值之间的平方差。
# 应用 PyTorch 定义 MSE 损失
mse_loss = nn.MSELoss()
- 平滑 L1 损失:缩小异样值的影响。
分类工作
对于类别预测,常见的损失函数包含:
- 穿插熵损失:掂量预测概率分布与实在散布之间的差别。
# 应用 PyTorch 定义穿插熵损失
cross_entropy_loss = nn.CrossEntropyLoss()
- 二元穿插熵损失:特地用于二分类工作。
- 多标签损失:实用于多标签分类。
优化损失函数
抉择适当的损失函数不仅取决于工作类型,还与模型架构、数据分布和特定的业务指标无关。有时,自定义损失函数可能是必要的,以便捕获特定问题的外围挑战。
3.3 优化器
优化器用于更新神经网络的权重,以便最小化损失函数。每种优化器都有其特定的数学原理和利用场景。
随机梯度降落(SGD)
SGD 是最根本的优化算法。
- 根本 SGD: 依照负梯度方向更新权重。
- 带动量的 SGD: 引入动量项,积攒之前的梯度,以便更安稳地收敛。
# 应用 PyTorch 定义带动量的 SGD 优化器
optimizer_sgd_momentum = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
自适应优化器
自适应优化器能主动调整学习率。
- Adam: 联合了 Momentum 和 RMSProp 的长处。
# 应用 PyTorch 定义 Adam 优化器
optimizer_adam = torch.optim.Adam(model.parameters(), lr=0.001)
- Adagrad、RMSprop 等: 针对不同参数有不同的学习率。
优化器抉择注意事项
- 工作相关性: 不同优化器在不同工作和数据上可能有不同的成果。
- 超参数调优: 如学习率、动量等可能须要调整。
3.4 学习率调整
学习率是优化器中的要害超参数,其调整对模型训练有深远影响。
固定学习率
最简略的办法是应用固定学习率。但可能不够灵便。
学习率调度
更简单的办法是在训练过程中动静调整学习率。
预约调整
- 步骤降落: 在固定步骤处升高学习率。
- 余弦退火: 周期性调整学习率。
# 应用 PyTorch 定义余弦退火调度器
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer_adam, T_max=50)
自适应调整
- ReduceLROnPlateau: 基于验证损失升高学习率。
学习率预热
训练初期逐步减少学习率。
- 线性预热: 初始阶段线性减少学习率。
3.5 正则化技巧
正则化是避免过拟合和进步模型泛化能力的关键技术。
L1 和 L2 正则化
- L1 正则化:偏向于产生稠密权重,有助于特征选择。
- L2 正则化:减小权重,使模型更平滑。
# 应用 PyTorch 增加 L1 和 L2 正则化
l1_lambda = 0.0005
l2_lambda = 0.0001
loss = loss + l1_lambda * torch.norm(weights, 1) + l2_lambda * torch.norm(weights, 2)
Dropout
随机敞开一部分神经元,使模型更鲁棒。
- 一般 Dropout:随机抛弃神经元。
- Spatial Dropout:在卷积层中随机抛弃整个特色图。
Batch Normalization
通过标准化层输出,减速训练并加重初始化的敏感性。
数据加强
如前所述,数据加强是一种重要的正则化伎俩。
3.6 模型评估与调优
模型评估是掂量模型性能的过程,调优则是改良性能。
穿插验证
应用穿插验证来预计模型的泛化能力。
- k- 折穿插验证:将数据分为 k 个局部,轮流应用其中一个作为验证集。
调参技巧
- 网格搜寻:尝试不同超参数组合。
- 随机搜寻:随机抉择超参数,更高效。
早停技巧
如果验证损失不再降落,则进行训练,以避免过拟合。
模型集成
通过联合多个模型来进步性能。
- Bagging:训练多个模型并均匀预测。
- Boosting:在先前模型的谬误上训练新模型。
- Stacking:应用新模型组合其余模型的预测。
4. 总结
本文全面探讨了卷积神经网络 CNN,深入分析了背景和重要性、定义与档次介绍、训练与优化,详细分析了其卷积层、激活函数、池化层、归一化层,最初列出其训练与优化的多项关键技术:训练集筹备与加强、损失函数、优化器、学习率调整、正则化技巧与模型评估调优。旨在为人工智能学者应用卷积神经网络 CNN 提供全面的领导。
作者 TechLead,领有 10+ 年互联网服务架构、AI 产品研发教训、团队治理教训,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收 AI 产品研发负责人
如有帮忙,请多关注
集体微信公众号:【TechLead】分享 AI 与云服务研发的全维度常识,谈谈我作为 TechLead 对技术的独特洞察。
TeahLead KrisChang,10+ 年的互联网和人工智能从业教训,10 年 + 技术和业务团队治理教训,同济软件工程本科,复旦工程治理硕士,阿里云认证云服务资深架构师,上亿营收 AI 产品业务负责人。