深度学习奠基作 AlexNet 论文阅读笔记(2025.2.25)

devtools/2025/2/26 13:03:46/

文章目录

    • 训练数据集
    • 数据预处理
    • 神经网络模型
    • 模型训练
    • 正则化技术
    • 模型性能
    • 其他补充

训练数据集

  • 模型主要使用2010年和2012年的 ImageNet 大规模视觉识别挑战赛(ILSVRC)提供的 ImageNet 的子集进行训练,这些子集包含120万张图像。
  • 最终,模型还使用2009年秋天版本的完整 ImageNet 数据集进行了训练,该数据集包含8900万张图像,分属于10184个类别。数据集中一半的图像用于训练,另一半用于测试。

数据预处理

  • 图像裁剪:因为模型需要固定大小的图像输入,因此首先将数据集中的图像的短边缩放到 256 个像素,再从得到的图像中裁剪出中间的 256 × 256 的图像块。
  • 像素处理:从每张图像的像素中减去了所有图像中该像素的平均值。这样的处理即对像素数据进行了归一化,可以加速模型的训练并使得训练更加稳定。
  • 数据增强
    • CPU运行的数据增强AlexNet 使用了两种计算量都很低的数据增强方式,所以增强后的图像无需存储在计算机的硬盘中备用。数据增强过程使用 Python 进行编程,在CPU上运行。由于数据增强无需使用正在训练模型的GPU,因此作者们认为数据增强是“计算免费”的,即不会影响模型的训练过程。
    • 两种数据增强方式
      • 图像平移和水平翻转:从 256 × 256 的图像中提取正中央和四个角的 224 × 224 的图片块及其水平翻转得到的图片块(共十张),并最终平均网络的 Softmax 对十张新图片的分类结果得到最终的分类结果。作者们发现如果不这样做,模型就会产生严重的过拟合。
      • 改变图像中RGB通道的强度:对整个 ImageNet 训练集中的RGB像素值执行主成分分析(PCA),作者们发现这种方式可以降低模型的分类错误率。

备注:由于GPU技术的发展比CPU快多了,因此如果从现在的角度看,在CPU上做数据增强反而会成为模型效率的瓶颈。

神经网络模型

  • 模型主要特点:非常大且非常深,是截至当时最大的卷积神经网络。
  • 模型参数量6000万 参数和 65万 神经元。
  • 模型基本结构
    • 神经网络层构成:包含五个卷积层(一些卷积层带有最大池化层)、三个全连接层和一个最终的 1000-way 的 Softmax 层。
    • 卷积核情况:第一个卷积层的卷积核大小是 11 × 11 × 3,个数为96个,步长为5;第二个卷积层的卷积核大小为 5 × 5 × 48,个数为256个;第三个卷积层的卷积核大小为 3 × 3 × 256,个数为 384 个;第四卷积层有 384 个大小为 3 × 3 × 192 的核;第五个卷积层有 256个 3 × 3 × 192 的核。
    • 全连接层情况:每个全连接层都有4096个神经元。
  • 层叠池化方法:作者们发现层叠池化可以略微降低模型分类的错误率,但是也会使得模型会变得略微难以收敛。

备注

  • AlexNet 中包含的两个隐藏的全连接层是其性能的一大瓶颈,也是其设计的缺陷。现在的CNN不会使用那么大的全连接层,因此Dropout的使用减少了,反而是循环神经网络系列的模型使用 Dropout 更多。
  • 层叠池化方法在后续的卷积神经网络中已经基本上没有继续使用了。

模型训练

  • 激活函数:使用 ReLU 作为激活函数,文中称为一种非饱和神经元,用于加速训练过程。作者们认为相较于当时主流的激活函数 tanhReLU 激活函数可以大大加快模型的训练过程。在模型中,每一个卷积层和全连接层的输出都使用了 ReLU 激活函数进行处理。
  • 训练设备:使用GPU进行高效的卷积操作。具体而言,使用的是两个型号为 GTX 580 的GPU,两个GPU的显存都是 3GB
  • 分布式训练
    • 基本模式:受限于GPU的显存,作者们将模型分布在两个GPU上进行训练。作者们将模型的卷积核对半分到两个GPU上,且两个GPU只在模型中的某些层进行交互。作者们发现使用双GPU的网络训练时间比使用单GPU的网络更快一些。
    • 两个GPU训练结果的区别:作者们最后发现第一个GPU对颜色敏感,而第二个GPU对颜色不敏感,并且每一次训练模型都是这样,他们不清楚是什么原因。
  • 优化器
    • 优化器类型:使用随机梯度下降优化器(SGD)进行模型训练。
    • 优化器超参数设置:批次大小设置为 128,动量设置为 0.9,权重衰减设置为 0.0005。作者们发现少量的权重衰减非常重要,因为减少了模型的训练误差。所有的层采用相同的学习率,初始化为 0.01,当验证错误率随着学习率的提高而升高时,将学习率除以 10。现在设置模型的学习率时,往往从小到大,然后慢慢减小。
  • 模型初始化
    • 权重初始化:以标准差为 0.01 的零均值高斯分布来初始化模型每一层的权重。
    • 偏置初始化:用常数 1 来初始化第二、第四和第五卷积层以及全连接隐藏层中的神经元偏置,剩余层的偏置初始化为 0。作者们认为这样的偏置设置可以为 ReLU 提供积极的输入来加速早期的学习。
  • 迭代次数和训练时间:迭代了 90 次,总共花费了五到六天的时间进行模型训练。

备注

  • 现在看起来,使用 ReLU 作为激活函数并没有比其他的激活函数对模型训练有多强的加速效果,只是单纯因为它足够简单。
  • 在目前看来,将 AlexNet 拆分到两个GPU上进行训练,这个非常工程化的细节并不是特别重要。并且,实际上 在代码编写得好的情况下,使用一个 GTX 580 GPU也是可以训练模型的。
  • 当年SGD并不是主流的模型训练器,因为其调参过程相对而言比较困难。但是现在SGD已经是最主流的模型学习器。
  • 权重衰减实际上就是L2正则项,其不是加在模型上,而是优化算法上。
  • 现在设置模型优化器的学习率时,往往从小到大,然后慢慢再减小,类似于一个余弦曲线。

正则化技术

  • Dropout
    • 功能和原理:用于缓解全连接层的过拟合现象。对每一个隐藏神经元,有 0.5 的概率将其输出设置为 0,使得它们不参与前向传播和反向传播过程。在测试阶段,将所有神经元的输出都乘 0.5。作者们发现如果不使用 Dropout,模型就会存在严重的过拟合现象,但是 Dropout 也会使得模型需要的迭代次数翻倍。
    • 文中的观点:作者们认为,在处理模型的输入时,增加了 Dropout 之后相当于每一次都是不同的神经网络,这样迫使模型学习更加稳健的特征。
  • 局部响应归一化:一种正则化方法,作者们发现使用了该归一化方法也可以降低模型分类的错误率。局部响应归一化层在第一和第二卷积层之后。

备注

  • 目前的观点认为 Dropout 不是模型融合,而是在线性模型上等价于一个L2正则项。它产生一个正则的效果,但是无法构造出一个和它相同的正则方式。
  • 局部响应归一化也不是很重要,后面基本上没有人继续使用。

模型性能

  • 2010年 ImageNet 大规模图像识别挑战赛:top-1 和 top-5 的错误率分别为 37.5%17.0%,显著优于之前最先进的模型。
  • 2012年 ImageNet 大规模图像识别挑战赛:top-5 的错误率为 15.3%,远高于第二名的 26.2% 的水平。
  • 特征向量使用:如果两张图像通过模型后获得的特征向量之间的欧氏距离很小,则可以认为这两张图像是相似的。
  • 未来展望:作者们指出该模型的性能在出现了更快的GPU和更大的数据集时还可以继续提升。

其他补充

  • 训练模型的启示
    • 为了提升机器学习算法的性能,我们可以收集更大的数据集、训练更强大的模型和使用更好的技术来防止过拟合。
  • 数据集相关
    • 在 AlexNet 提出的时代,大部分有标注的图像数据集相对而言都比较小,只有数万张图片,例如 NORBCaltech-101/256CIFAR-10/100 等。
    • LabelMe 是一个包含有数十万张全分割的图像的数据集。
    • ImageNet 包含有1500万张有标注的高分辨率的图像,这些图像分属于超过2200个类别。
  • 模型相关
    • 卷积神经网络具有先验知识来弥补图像数据集不够大的问题,因为它们对图像的本质特征有假设。相较于相似规模的标准前馈神经网络,卷积神经网络的参数量和连接数都少得多,因此更加容易训练,它们的理论最优性能仅仅略低于前馈神经网络。
    • 作者们发现模型的深度(即神经网络中的层数)非常重要,移除任意一个卷积层都会导致模型性能的下降,尽管卷积层的参数数量非常少。现在看来,这个观点不太对,因为虽然神经网络的深度非常重要,但是移除一个神经网络层不一定会导致性能下降,通过优化超参数可以达到相同的性能。
    • ReLU 的一个理想特性是,它不需要对输入进行归一化来防止饱和。只需要一些训练样本向 ReLU 产生了正输入,那么学习就可以发生。
    • 卷积神经网络中的池化层用于汇总同一特征图中相邻神经元组的输出。
    • 最简单和最常用的降低过拟合的方式是使用保留标注的数据增强来人为地扩大数据集。
    • 结合多个不同模型的预测结果是一种降低测试错误率的好用的方法,但是往往代价高昂。
    • 无监督预训练可以帮助神经网络获取较为优秀的早期权重,本文中作者也提到,虽然他们出于简化没有这么做,但是他们认为这么做是有帮助的。
    • 神经网络的深度很重要,但是宽度也很重要,不能特别宽特别浅,也不能特别深但是特别窄。
    • 过拟合是深度学习的一个派别,现在研究者们又认为正则不是那么重要,最重要的是模型本身的结构。
  • 硬件相关
    • 2007年 NVIDIA 推出了 CUDA 库,使得用GPU训练模型变得普遍。当时的研究人员研究人员主要是使用 Matlab 进行编程。
    • GPU对2D卷积进行了高度优化,能够很好地促进大型卷积神经网络的训练过程。
    • 现代的GPU设计非常适合跨GPU并行,因为它们可以直接读写其他GPU的显存,而不需要以计算机的内存作为中介。
  • 论文阅读相关
    • 阅读机器学习和深度学习领域的论文,对于工程上的细节,如果不是需要复现,则可以暂时忽略掉。
    • 论文的实验部分,如果不是领域专家或者需要复现论文,一般不用太了解,这样可以节约时间。

http://www.ppmy.cn/devtools/162794.html

相关文章

网络安全之Web后端PHP

目录 一、PHP基础语法 1.PHP基础 (1)php的优点 (2)PhpStorm的优点 2.PHP基本语法 3.PHP变量 4.PHP运算符 二、PHP流控与数组 1.php流程控制语句以及循环 (1)if 语句 (2)if…

如何在java中用httpclient实现rpc get请求

如果你想用 Java 的 HttpClient 实现 RPC 的 GET 请求,过程会稍微不同,因为 GET 请求通常通过 URL 参数(查询字符串)传递数据,而不是像 POST 那样通过请求体。以下是详细的讲解和示例代码。 1. GET 请求与 RPC 的特点…

Docker run --add-host参数解析(在容器启动时向/etc/hosts文件中添加自定义的主机名与IP映射)(适用于临时调试或测试)

文章目录 Docker run --add-host 参数解析一、参数概述二、工作原理三、应用场景1. **开发与调试**2. **环境隔离**3. **跨网络访问** 四、使用示例示例 1:单个自定义映射示例 2:多个映射同时使用 五、注意事项六、总结 Docker run --add-host 参数解析 …

pandas 数据的查看与选择

数据的查看与选择 查看数据的函数: 对象变量.head(n) 查看 前 n 行的数据 如果不设置n的值 默认为 n 5 对象变量.tail(n) 查看 后 n 行的数据 如果不设置n的值 默认为 n 5例如: 查看数据的前两行 # 数据的查看 # 引用 pandas import pandas as pd # …

linux centos8 安装redis 卸载redis

准备环境 系统:linux CentOS8 安装步骤 一、下载redis 1.进入官网找到下载地址 https://redis.io/download 2.右键点击复制链接地址 3.进入到Xshell控制台(默认当前是root根目录),,输入wget 加你复制的地址 (示例 &#xff…

【uniapp】上传文件流图片

需求:从接口下载指定文件,把这个文件再上传到后端。 背景:文件的上传、下载接口都是现有的,原本在pc端下载使用的responseType为blob,在uniapp不支持。如果按照原本的方式请求接口,返回的值会是字符串&…

【洛谷】【CF1207F】Remainder Problem(分块数组)

传送门:Remainder Problem 分块数组 题目描述 给你一个长度为 500000 的序列,初值为 0 ,你要完成 q 次操作,操作有如下两种: 1 x y : 将下标为 x 的位置的值加上 y2 x y : 询问所有下标模 x 的结果为 y 的位置…

[021-22].Redis的线程模型原理分析

Java学习大纲 1.Redis自身出道就是优秀,基于内存操作、数据结构简单、多路复用和非阻塞 I/O、避免了不必要的线程上下文切换等特性,在单线程的环境下依然很快; 2.但对于大数据的 key 删除还是卡顿厉害,因此在 Redis 4.0 引入了多线…