【读论文】深度学习重要论文精读(图像领域)

个人从硕士入学开始接触深度学习,聚焦于自动驾驶感知已有三年,由于硕士论文以4D Radar Detection为课题,因此接触了2D检测、3D检测,如今进入工作,虽然工作更偏向于业务代码,但仍然身处这个行业,深知AI、智驾行业日新月异,也对技术有一定的追求,同时有一点点创作的欲望,因此花一些时间,在这里总结或者整理一些人工智能、智驾、机器人相关的知识、应用以及个人的一些理解。

今天第一篇,想从头回望一下深度学习尤其是图像领域一些至今仍然绕不开的论文,结合李沐老师的解读以及自己以前的一些笔记,看看有没有新的想法和感悟,顺便把一些以前忽视的点重新梳理一遍。大概的思路是自己再读一遍论文,然后给出自己的总结,再结合李沐老师的解读去看一些没有意识到的东西以及问题的解释。


0. 总结

  1. 通过对一系列论文的回顾与重读,即使泛泛而读,也深知近些年来视觉领域变化之快,而很多三四年前的工作,我至今才开始精度理解,属实惭愧;
  2. 尝试在阅读过程中闭目思考,结合如今的认知,很多东西的发展也并非一蹴而就,都是普通人有迹可循的,但如何讲好故事,做好实验,让别人理解,其中有大学问;
  3. 泛读了行业内近些年的主流论文,下面会结合具体的任务或者更进一步的方向做进一步探索,希望能渐渐赶上发展的方向,做到胸中自有丘壑;

1. AlexNet

  • AlexNet是深度学习(深度卷积神经网络)的奠基之作

在此之前,机器学习更倾向于使用海量数据无监督学习训练一个超大的模型,但很长一段时间的发展都停留在有监督学习

  • 早期由于硬件的发展,训练大模型不可能,但如今大模型的兴起,无监督预训练又扮演了相当重要的角色

2. ResNet

2.1 Motivation

  • 一方面,深度神经网络的深度增加可以带来很好的效果,但另一方面,深度的增加带来了一些问题
    • 梯度消失/梯度爆炸——归一化可以解决
      • 梯度指的是损失函数相对于模型参数的偏导数。梯度指向了损失函数增长最快的方向。在训练神经网络时目标是最小化损失函数,因此需要计算梯度来指导参数的更新
      • 归一化是通过将数据/特征变为均值为0,方差为1的正态分布的操作,以防止数据分布过大导致的梯度问题
    • 深度网络会导致退化(精度下降,并非过拟合(过拟合是训练误差降低、测试误差升高))

2.2 Methods

在这里插入图片描述

  • 论文分析深层网络退化的实验是:假设有一个浅层网络和一个深层网络,而深层网络对于添加的层理应都可以学到恒等变换( f ( x ) = x f(x)=x f(x)=x),按理说训练误差不会增大,但实际上并非如此
  • 以文中举例的两层残差结构为例,原本我们期待网络学到一个映射为 H ( x ) H(x) H(x),因此残差可以表示为 H ( x ) − x H(x)-x H(x)x,此时我们引入一个残差映射 F ( x ) = H ( x ) − x F(x)=H(x)-x F(x)=H(x)x,因此现在我们期望学到的映射为 H ( x ) = F ( x ) + x H(x)=F(x)+x H(x)=F(x)+x而这种形式可以用shorcut这种形式来表示,不会增加任何参数
  • ResNet无论是网络结构、残差的概念、shortcut的方式均不是原创,甚至深度学习近些年出现的idea在90年代第一次神经网络热潮的时候已经被提出,但将其组合解决一个业界关心的问题,也是一种成功

  • 对于更深层的resnet,为了防止计算量陡增,使用了bottleneck的方式,将输入的通道数先通过1x1卷积降维,在低维做卷积,最后再升维(resnet34和resnet50计算复杂度近似)

2.3 Thinking

根据自己读下来以及李沐老师的讲解,残差的表示的作用或者理解的角度有两点:

  • 原本的梯度由于网络层数的增加,链式法则求取梯度的时候必然会越来越小,最终的结果是梯度消失,但是加入残差后,由于补充了一个较大的梯度,使得梯度不那么容易消失;
  • 残差的结构由于加入了x,也许使得网络内部的复杂度有所降低,即可以去学到一个更简单的模型拟合当前的数据

3. Transformer

3.1 Motivation

  • 在此之前,RNN被认为是处理长文本最佳的方法,也确实在很多数据集上达到了SOTA,很多工作也在此基础上进行推进。但RNN依赖于顺序的输入,存在较为明显的缺点:
    • 当前的输入依赖于前一个结果,并行度很低
    • 较长的序列由于内存的限制而上限较低
    • 过长的文本也会导致梯度爆炸或者梯度消失
  • Transformer完全依赖于自注意力机制self-attention

3.2 Methods

  • Encoder-Decode架构:
    • 在此之前,很多序列模型都遵循编解码结构,transformer也遵循编解码结构,主要是通过堆叠(多头)自注意力机制和前馈网络来组成
    • 编码器Encoder:输入特征进行embedding和位置编码后,进入6层连续的多头注意力和前馈网络(MLP+RuLU),并使用残差结构对多头注意力输出和原向量进行相加和归一化
    • 解码器Decoder:解码器加入了额外的一层,会将编码器的输出执行self-attention(cross-attention)
    • 解码器在预测时是没有输入的,是将此前的输出作为这一时刻的输入(逐个右移)
  • (TODO)LayerNorm与BatchNorm的区别:
  • 注意力机制:

An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors.

在这里插入图片描述
- 内积实则为余弦相似度,衡量两个向量的相似程度,如果为0则表示垂直,完全无关
- 除以 d k \sqrt{d_k} dk 的目的:两个向量点乘可能很大或者很小,取softmax可能导致单个值非常接近0或者为 1,从而梯度很小,整体的算法不再优化

  • Masked Multi-Head Attention
    • 为什么要做mask?——解码器为自回归,输入为之前的输出,假设此时刻为t,则预测时只应该看到t-1及之前的输出,但注意力机制是全局的,因此训练时要将t时刻之后的输出屏蔽
  • (TODO)多头注意力机制:

Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions.

  • 多头注意力机制将Q、K、V的矩阵维度降为原本的1/h,并对每个分组的维度分别进行注意力计算,以学习不同的表示空间的特征(是不是可以类比于多尺度的信息?)
  • 位置编码:
    • 由于Transformer的自注意力机制本身并不具备处理序列顺序的能力,需要引入位置编码来确定每个token的位置
    • 位置编码分为绝对位置编码和相对位置编码
    • Transformer使用sin和cos函数进行位置编码

4. BERT

4.1 Motivation

  • 基于前向的重要工作ELMo(芝麻街角色名,BERT也是,ELMo使用的是RNN结构)和GPT(单向模型,使用左侧上下文预测右侧)
  • 预训练对于NLP任务至关重要,目前的预训练微调有两种方式,引入特定任务的特征作为输入的附加特征(ELMo)以及微调所有参数(GPT),均使用单向语言模型(语言模型本身就是单向的,即通过已有的表示预测下一句/词是什么)学习一般的语言表示;
  • 本文提出的是双向语言模型,使用类似于“完形填空”的mask language model对原始句子进行掩码预测学习特征,这样的数据可以让模型同时学到上下文的表示;
  • 预训练学什么?——学词嵌入表示(如何将语言编码)
  • 何为单向?何为双向?为何作者认为双向这么重要?

4.2 Methods

  • 包括预训练和微调两部分,在不同任务无标签预训练后,对所有参数使用预训练参数初始化,然后进行有监督微调
  • 使用两个任务无监督地预训练BERT
    • 完形填空Masked LM
      • 将屏蔽的单词设置为[MASK] token,然后预测,微调时不适用mask token
    • 预测下一个句子NSP
      • 分类的token获得的隐藏输出C用于下一个句子的预测
  • BERT双向的含义:transformer的天然特性会关注整个句子,而mask这样的任务会自动去学习上下文的信息,这就是双向

4.3 Thinking

  • BERT没有使用GPT那样的编解码器的结构,导致其更适用于分类、理解型任务,但对翻译类任务就不那么优秀(有利有弊)
  • BERT与GPT是同期的工作,但BERT的影响力是GPT的10倍,他们的目标都是使用更大的模型在更大的数据集上进行训练,然后再特定任务进行微调,只是所注重的点不太一样
  • 由于没有阅读GPT或者其他从左到右生成的所谓单向的语言模型,第一遍阅读一头雾水

4.4 Question

引自李沐老师视频下面评论区的网友,可作为自我测验

  1. BERT分为哪两种任务,各自的作用是什么;
  2. 在计算MLM预训练任务的损失函数的时候,参与计算的Tokens有哪些?是全部的15%的词汇还是15%词汇中真正被Mask的那些tokens?
  3. 在实现损失函数的时候,怎么确保没有被 Mask 的函数不参与到损失计算中去;
  4. BERT的三个Embedding为什么直接相加
  5. BERT的优缺点分别是什么?
  6. 你知道有哪些针对BERT的缺点做优化的模型?
  7. BERT怎么用在生成模型中?

5. ViT

5.1 Motivation

  • Transformer在NLP任务中取得了很多SOTA,但是在CV领域没有太多有效的工作
  • 受NLP的启发,经典transformer应用在图像上应该是对每个像素计算自注意力,但是计算量太大了(transformer的计算复杂度与序列长度直接相关,平方复杂度),现有的工作使用稀疏自注意力或者局部自注意力(使用resnet深层的特征图14x14),但无法使用硬件加速(操作 不够优雅)
  • ViT证实了使用原始Transformer结构配合大规模的预训练可以达到CNN的SOTA结果

5.2 Methods

  • ViT的原始版本输入为原始图像(H,W,3),将其转化为一维向量( N , ( P 2 ∗ C ) N, (P^2*C) N,P2C),其中P为patch的边长(正方形),N为 H ∗ W / P 2 H*W/P^2 HW/P2,C为通道数(3)
  • Transformer全局使用的特征大小为D,因此将C变换为D,称为patch embedding,同时嵌入1D位置编码,另外会额外加入一个分类token,然后输入Transformer encoder,即多头注意力机制+LayerNorm+ReLU+MLP
  • 也可以将原始图像的输入换成经过CNN提取特征后的特征层(这可以保留一些归纳偏置?因为Transformer无法获取一些图像的先验,因为所有都是独立的
  • "decoder"部分只是对cls token简单使用了一个MLP进行分类(这部分对于分类任务当然可以,但是对于更高级别的CV任务,确实需要根据Transformer设计head)
    Q:传统的如resnet最终输出的特征图(14x14)会对其做average pooling得到一个特征向量用于分类,为何transformer不能对其self-attention的结果直接做average pooling?
    A:消融实验证明,这也是可以的,但是为了与NLP保持一致,增加了cls token
  • 听了李沐老师频道的ViT讲解,觉得这篇论文的实验结果展示真的是全方面无死角:
    • 图1证明了不做预训练由于缺乏归纳偏置的原因,vit的效果不如CNN
    • 图2证明了在同等计算复杂度下,vit的效果好,从而证明了vit对计算资源的需求没有那么高
    • 图3证明了线性编码层(第一层)已经学到了一些特征,同时位置编码已经学到了位置信息
      图1图2图3

5.3 Thinking

  • transformer应用于图片任务缺乏归纳偏执inductive biases(先验),而传统的卷积天然存在局部相似性和平移不变性两种先验,因此transformer需要更大数据的预训练
  • 其他视觉任务如何应用?——DETR
  • 只有先进行大规模预训练效果才较好,而大规模自监督预训练效果较差

6. DETR

6.1 Motivation

  • 传统的目标检测架构存在大量的手工设计的步骤,如NMS和anchor的生成,这使得整体网络无法端到端训练;
  • transformer还没有在目标检测领域出现结构优雅的方案,作者尽可能使用transformer的架构;
  • 使用集合预测和二分匹配损失来你直接预测目标,而不是使用anchor间接预测(作者认为transformer的token的交互方式很适合集合预测这种形式)

6.2 Methods

在这里插入图片描述

  • 集合预测的二部匹配损失
  • DETR架构
    • CNN backbone:下采样32倍,通道数设置为C=2048
    • encoder-decoder transformer
      • encoder
        • 首先1x1卷积降维C->d
        • 直接将d通道的特征图进行向量化(不使用ViT的patch形式了吗?)得到dxHW
        • 使用标准的transformer encoder,多头注意力+FPN
      • decoder
        • 使用N个object queries
        • 每个object query经过解码器输出经过一个前馈网络输出一个预测框
    • 前馈网络(检测头?)
      • 预测中心坐标、高宽、softmax预测类别

6.3 Thinking

  • DETR之所以使用二部图匹配损失,直接预测固定数量N的结果,应该是从decoder的输出形式出发,固定的输出token自然会联想到每一个去预测一个检测框;
  • 传统的检测方法由于anchor的存在,不可避免的存在NMS这种操作,DETR的预测形式确实实现了端到端,但这个N如何设置呢?如果一张图目标相当多,N不够用怎么办?

欢迎讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值