精华内容
下载资源
问答
  • 此函数参考原始信号计算信号的 MAE(平均绝对误差)。 可以为 1-D/2-D/3-D 信号计算 MAE
  • MAE、MSE、R-Square、MAPE和RMSE 以上是对于预测问题的评价指标。 1.平均绝对误差(Mean Absolute Error, MAE) 误差越大,该值越大。 2.均方误差(Mean Squared Error, MSE) 误差越大,该值越大。 SSE(和方差)与...
  • matlab程序,用于MAE平均绝对误差,可直接在程序中以函数名的形式调用,用来检测模型的预测值与真实值之间的偏差,值越大表示预测效果越差
  • 今天小编就为大家分享一篇python之MSE、MAE、RMSE的使用,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • MAE103-源码

    2021-03-30 05:09:11
    MAE103 该存储库是为UCLA的MAE 103基础流体力学设计的。 建置状态 要开始使用jupyter,请执行以下操作: 从Julia下载到您的计算机上 启动Julia会话。 输入]进入Julia包裹管理系统。 在此提示符下,键入add ...
  • 实现对显着性对象检测的一键式快速评估,包括MAE、Max F-measure、S-measure、E-measure 。 代码是从 matlab 版本重新实现的,这些版本可以从 使用 pytorch 实现 GPU,可以更轻松地嵌入到 eval 代码中。 一键评测 ...
  • 3) 较为好解释的评价指标:平均绝对误差(MAE)     指标解释:所有样本的样本误差的绝对值的均值     指标解读:平均绝对误差的单位与因变量单位一致,越接近0,模型越准确 4)平均绝对误差的衍生指标:平均...
  • 同样计算借款数目。
  • 该函数在评估去噪算法的性能时很有用,例如心电图、脑电图、音频(语音)等。我附上了一个演示脚本,您可以使用它来运行以了解其用途。 如果您对使用此代码有疑问,请与我联系
  • 操作说明: 1、解压下载的CollaborativeFilteringBasedItem压缩文件 2、操作系统中需装java jdk1.7或者以上版本 3、点击start.bat,在运行过程中,输出推荐结果和mae
  • MAE468项目1 2021 MAE468项目1代码存储库 我们也可以将其用于报告。我认为Word文档不是很好,所以我可能会为此推动团队合作。
  • buildConfigField MAE_KEY buildConfigField MAE_SECRET 这些是访问我们的API所必需的,但是您无法获得它。 因此,您实际上将无法查看应用程序内的数据。 开源的目的仅仅是发布我们的源代码以供参考。 ...
  • 校直机MAE标定后常见屏显错误和消除方法
  • MAE108-源码

    2021-02-13 07:25:23
    MAE108 此存储库包含在2020年秋季季度作为MAE108的一部分编写的所有脚本和软件。 由Sam Hince创建11/14/2020
  • mae.garciamagdalen-源码

    2021-03-15 00:56:24
    梅加西亚·马格达伦(mae.garciamagdalen)
  • MAE 423传热规范(2019-20秋季)。 最终项目 团队成员:Morgan Baker,Jens Clausen和Sam Dale 程式语言:MATLAB 数值模拟任意几何体的二维非稳态热对流。 使用Streamfunction-Vorticity(ψ-ω)方法以相对较低的...
  • 使用了 movielens.org 的数据集,并用基线预测填充缺失值。 然后使用 SVD 近似低秩。 这给出了比朴素方法更低的 MAE
  • matlab代码 自带图像测试!
  • 1、解压下载的CollaborativeFilteringBasedUserKmeans压缩文件 2、操作系统中需装java jdk1.7或者以上版本 ...3、点击start.bat,在运行过程中,会输出聚类结果,然后输出用户id进行推荐,和mae
  • PR-F-措施-MAE 显着性指标值原始码改一下路径以及注意自己的图片尺寸
  • 点击上方“计算机视觉工坊”,选择“星标”干货第一时间送达作者丨科技猛兽编辑丨极市平台导读本文对何恺明的新作MAE进行了深度的解析,他提出一种用于计算机视觉的可扩展自监督学习方案Maske...

    点击上方“计算机视觉工坊”,选择“星标”

    干货第一时间送达

    e74ceb815658e0f49c62127663d8f6b2.png

    作者丨科技猛兽

    编辑丨极市平台

    导读

     

    本文对何恺明的新作MAE进行了深度的解析,他提出一种用于计算机视觉的可扩展自监督学习方案Masked AutoEncoders。

    本文目录

    1 MAE
    1.1 Self-supervised Learning
    1.2 Masked AutoEncoder (MAE) 方法概述
    1.3 MAE Encoder
    1.4 MAE Decoder
    1.5 自监督学习目标函数 Reconstruction Target
    1.6 具体实现方法
    1.7 ImageNet 实验结果
    1.8 masking ratio 对性能的影响
    1.9 观察到的一些实验现象
    1.10 训练策略
    1.11 结果对比
    1.12 Partial Fine-tuning

    Self-Supervised Learning超详细解读 (目录):

    https://zhuanlan.zhihu.com/p/381354026

    Self-Supervised Learning,又称为自监督学习,我们知道一般机器学习分为有监督学习,无监督学习和强化学习。而 Self-Supervised Learning 是无监督学习里面的一种,主要是希望能够学习到一种通用的特征表达用于下游任务 (Downstream Tasks)。其主要的方式就是通过自己监督自己。作为代表作的 kaiming 的 MoCo 引发一波热议, Yann Lecun也在 AAAI 上讲 Self-Supervised Learning 是未来的大势所趋。所以在这个系列中,我会系统地解读 Self-Supervised Learning 的经典工作。

    1 MAE

    论文名称:Masked Autoencoders Are Scalable Vision Learners

    论文地址:

    https://arxiv.org/abs/2111.06377

    计算机视觉领域的 GPT-3 要有了?Kaiming 在这篇论文中告诉我们:强大的 AI 技术 idea 应该非常简单,实现起来也很快捷。我们首先对 Self-supervised Learning 做个简单的回顾:

    1.1 Self-supervised Learning

    在预训练阶段我们使用无标签的数据集 (unlabeled data),因为有标签的数据集很贵,打标签得要多少人工劳力去标注,那成本是相当高的,太贵。相反,无标签的数据集网上随便到处爬,它便宜。在训练模型参数的时候,我们不追求把这个参数用带标签数据从初始化的一张白纸给一步训练到位,原因就是数据集太贵。于是 Self-Supervised Learning 就想先把参数从一张白纸训练到初步成型,再从初步成型训练到完全成型。注意这是2个阶段。这个训练到初步成型的东西,我们把它叫做 Visual Representation。预训练模型的时候,就是模型参数从一张白纸初步成型的这个过程,还是用无标签数据集。等我把模型参数训练个八九不离十,这时候再根据你下游任务 (Downstream Tasks) 的不同去用带标签的数据集把参数训练到完全成型,那这时用的数据集量就不用太多了,因为参数经过了第1阶段就已经训练得差不多了。

    第一个阶段不涉及任何下游任务,就是拿着一堆无标签的数据去预训练,没有特定的任务,这个话用官方语言表达叫做:in a task-agnostic way。第二个阶段涉及下游任务,就是拿着一堆带标签的数据去在下游任务上 Fine-tune,这个话用官方语言表达叫做:in a task-specific way

    以上这些话就是 Self-Supervised Learning 的核心思想,如下图1所示,后面还会再次提到它。

    0649e9c42c75e271f0688e968d217c98.png
    图1:Self-Supervised Learning 的核心思想

    Self-Supervised Learning 不仅是在NLP领域,在CV, 语音领域也有很多经典的工作,如下图2所示。它可以分成3类:Data Centric, Prediction (也叫 Generative) 和 Contrastive

    8b2d7c4b8d89b2348e79074fa4ad5b47.png
    图2:各个领域的 Self-Supervised Learning

    其中的主流就是基于 Generative 的方法和基于 Contrative 的方法。如下图 3 所示这里简单介绍下。基于 Generative 的方法主要关注的重建误差,比如对于 NLP 任务而言,一个句子中间盖住一个 token,让模型去预测,令得到的预测结果与真实的 token 之间的误差作为损失。基于 Contrastive 的方法不要求模型能够重建原始输入,而是希望模型能够在特征空间上对不同的输入进行分辨。

    639aa1611943e711dde25a030cf263b1.png
    图3:基于 generative 的方法和基于 contrastive 的方法的总结图片

    1.2 Masked AutoEncoders (MAE) 方法概述

    这篇论文使用掩码自编码器 (masked autoencoders (MAE)) 进行自监督学习。根据1.1节的介绍,它属于 Generative (Predictive) pre-training 的类型。这种类型自监督学习的另一个著名的例子就是 BERT。

    对于 BERT 模型而言,一个 sentence 中间盖住一些 tokens,让模型去预测,令得到的预测结果与真实的 tokens 之间的误差作为损失。它告诉了我们直接 reconstruct sentence 也可以做到很 work。

    对于 MAE 模型而言,一个 image 中间盖住一些 patches,让模型去预测,令得到的预测结果与真实的 image patches 之间的误差作为损失。它告诉了我们直接 reconstruct image 原图也可以做到很 work。

    上面的对比看上去很容易,但是问题在于:

    为什么 BERT (2018) 提出这么久以后,直到 BEIT (2021.6) 和 MAE (2021.11) 之前,一直在 CV 领域都没有一个很类似的 CV BERT 出现?

    这里 Kaiming 提出了3条看法:

    1. CV 和 NLP 主流架构不同: 直到 ViT (2020.12) 出现之前,CV 的主流架构一直是以卷积网络为主,NLP 的主流架构一直是以 Transformer 为主。卷积核作用在一个个的 grid 上面,直观来讲没法产生像 Transformer 一样的 token 的概念,也就是说如果我们只使用卷积网络,那么 image token 概念的建立就不那么直观。所以,像 Transformer 那样在 token 的基础上进行自监督学习就不太适用,这是第一个难点

    2. 语言和图片 (视频) 的信息密度不同: 语言是人类造就的信号,它 highly semantic , information-dense。而图片 (视频) 是自然产生的信号,它 heavy spatial redundancy。即挡住图片的一部分 patches,可以很容易地通过看它周围的 patches 而想象出它的样子来。所以,语言和图像,一个信息密度高,一个信息密度低,这是第二个难点。解决的办法是什么呢?作者提出了一个简单的策略:即挡住图片的 patches 的比例高一些。比如之前你挡住一张图片的 30% 的 patches,能够轻松通过周围的 patches 预测出来;那现在如果挡住图片的 90% 的 patches,还能够轻松通过周围的 patches 预测出来吗?

    3. AutoEncoder 里面的 Decoder 部分 (就是将映射得到的中间特征重建为 input 的模块) 在 CV 和 NLP 中充当的角色不同: 在 CV 领域,Decoder 的作用是重建 image pixels,所以 Decoder 的输出语义级别很低。在 NLP 领域,Decoder 的作用是重建 sentence words ,所以 Decoder 的输出语义级别很丰富。

    这3条看法非常准确地展示了:为什么在 CV 领域搞出一个像 BERT 一样类似的 CV BERT 这件事比较难。

    基于以上分析,作者提出了 MAE 方法,如下图4所示就是 MAE 的架构。MAE 的方法很简单:Mask 掉输入图像的随机的 patches 并重建它们。它基于两个核心理念:研究人员开发了一个非对称编码器 - 解码器架构,其中一个编码器只对可见的 patch 子集进行操作 (即没有被 mask 掉的 token),另一个简单解码器可以从潜在表征和被 masked 掉的 token 重建原始图像。Decoder 的架构可以是十分轻量化的模型,且具体的架构对模型性能影响很大。研究人员进一步发现,Mask 掉大部分输入图像 (例如 75%) 会产生重要且有意义的自监督任务。结合这两种设计,我们就能高效地训练大型模型:提升训练速度至 3 倍或更多,并提高准确性。

    f1181f8746196bfd3240994360ffed91.png
    图4:MAE 自监督学习架构

    MAE 方法严格来讲属于一种去噪自编码器 (Denoising Auto-Encoders (DAE)),去噪自动编码器是一类自动编码器,它破坏输入信号,并学会重构原始的、未被破坏的信号。MAE 的 Encoder 和 Decoder 结构不同,是非对称式的。Encoder 将输入编码为 latent representation,而 Decoder 将从 latent representation 重建原始信号。

    MAE 和 ViT 的做法一致,将图像划分成规则的,不重叠的 patches。然后按照均匀分布不重复地选择一些 patches 并且 mask 掉剩余的 patches。作者采用的 mask ratio 足够高,因此大大减小了 patches 的冗余信息,使得在这种情况下重建 images 不那么容易。

    1.3 MAE Encoder:

    MAE Encoder 采用 ViT 架构,但只会作用于 unmasked images。和 ViT 思路一样,MAE Encoder 会先通过 Linear Projection 编码图片,再加上位置编码,随后送入一堆连续的 Transformer Block 里面。但是编码器只对整个图片 patches 集合的一个小子集 (例如25%)进行操作,而删除 masked patches。这里和 BERT 做法不一样,BERT 使用对于 mask 掉的部分使用特殊字符,而 MAE 不使用掩码标记。

    1.4 MAE Decoder:

    MAE Decoder 采用 Transformer 架构,输入整个图片 patches 集合,不光是 unmasked tokens (图4中蓝色色块),还有被 mask 掉的部分 (图4中灰色色块)。每个 mask tokens 都是一个共享的、学习的向量,它指示了这里有一个待预测的 tokens。作者还将位置嵌入添加到这个完整 image patch 集合中的所有 tokens 中,位置编码表示每个 patches 在图像中的位置的信息。

    MAE Decoder 仅用于预训练期间执行图像重建任务。因为自监督学习的特点就是只用最后预训练好的 Encoder 完成分类任务。因此,可以灵活设计与编码器设计无关的解码器结构。作者用比编码器更窄更浅的很小的解码器做实验。在这种非对称的设计下,tokens 就可以由轻量级解码器处理,这大大缩短了预训练的时间。

    1.5 自监督学习目标函数 Reconstruction Target:

    Decoder 的最后一层是一个 Linear Projection 层,其输出的 channel 数等于图像的像素 (pixel) 数。所以 Decoder 的输出会进一步 reshape 成图像的形状。损失函数就是 MSE Loss,即直接让 reconstructed image 和 input image 的距离越接近越好。

    作者还尝试了另外一种损失函数,就是先计算出每个 patch 的像素值的 mean 和 deviation,并使用它们去归一化这个 patch 的每个像素值。最后再使用归一化的像素值进行 MSE Loss 计算。但是发现这样做的效果比直接 MSE Loss 好。

    1.6 具体实现方法:

    MAE 的具体实现方法是:

    1. 首先通过 Linear Projection 和位置编码得到 image tokens。

    2. 随机 shuffle 这些 tokens,按照 masking ratio 扔掉最后的一部分。

    3. 把 unmasked patches 输出到 Encoder 中,得到这些 tokens 的表征。

    4. 把 Encoder 的输出,结合 masked tokens (可学习的向量),执行 unshuffle操作恢复顺序,再一起输入到 Decoder 中。

    5. shuffle 和 unshuffle 操作的时间开销可忽略不计。

    1.7 ImageNet 实验结果:

    第1个实验使用 ViT-Large (ViT-L/16) 作为 Encoder 的 Backbone,作者首先对比了3个结果,如下图5所示:

    a6def7a5ffcf96b7cf937c162730af95.png
    图5:ImageNet 实验结果
    • 76.5 是 ViT 论文 report 的 ViT-Large 使用 ImageNet 训练的结果。

    • 82.5 是作者自己实现的,ViT-Large 使用 ImageNet 训练的结果,这里不得不佩服 Kaiming 强大的实验能力啊,单训 ViT 就能比原作者高出6个点来,作者认为要使用较大的 weight decay = 0.3。82.5的实验设置如下图6所示。

    • 84.9 是作者自己实现的,ViT-Large 使用 MAE pretrain 之后,再在 ImageNet 上做完整 Fine-tuning 的结果,可以看到优于有监督的 82.5。

    f2aafe40833ba45f4ac3aaf614576024.png
    图6:82.5的实验设置

    1.8 masking ratio 对性能的影响:

    如下图7所示代表了 masking ratio 对结果的影响。最优的 masking ratio 竟然出乎意料地高,且当 masking ratio=75% 时,linear probing 和 fine-tuning 的性能依旧很高。这种行为与 BERT 相反,BERT 的典型mask ratio 只有15%。从这个结果可以得出结论:MAE 自监督训练好的模型可以推断出缺失的补丁。作者假设这种类似推理的行为,与学习有用的表征有关。

    图7还显示了linear probing 和 fine-tuning 的结果随着的不同的变化趋势。对于 fine-tuning,结果是40-80%的 masking ratio 都能 work well。

    b011162ee14a97c731f94b76ec88dd7e.png
    图7:masking ratio对结果的影响

    1.9 观察到的一些实验现象:

    如下图8所示,作者做了一些不同实验设置下的对比实验。

    a69ae2afc52f6f021fd7388214a4a1fe.png
    图8:观察到的一些实验现象

    图8 (a): 足够深的 Decoder 对于 linear probing 很重要。原因:pixel reconstruction task 和 recognition task 本质不同,AutoEncoder 的末尾几层对于重建 pixel 更重要。而且有趣的是,只有1层 Block 的 Decoder 在 fine-tuning 之后就能达到84.8%的 accuracy。默认配置是8层。

    图8 (b): 更窄的 Decoder 也能够在 fine-tuning 时获得较好的性能。默认配置是 Embedding dimension=512。

    计算量只有 ViT-L 的9%。

    图8 (c): 研究有没有必要在输入 Encoder 的时候一并输入 masked patches。结果发现,如果也一起给 Encoder 输入了 mask tokens,效果其实是变差的:Linear Probing 性能降低了14%。作者认为,这可能是因为:在这种情况下,在预训练和部署之间存在差距。 即:编码器在预训练的输入中有很大一部分是 mask tokens,这在未损坏的图像中是不存在的。这个 gap 可能会降低部署的准确性。

    而且,通过跳过编码器中的 mask token,大大减少了训练计算量 (约3.3倍)。此外,GPU memory 大大减少,这可以使训练更大的模型或加快 large-batch training。时间和 GPU memory 效率使我们更适合训练大型模型。

    图8 (d): 不同损失函数的影响。除了 MSE Loss 以外,作者还尝试了另外一种损失函数,就是先计算出每个 patch 的像素值的 mean 和 deviation,并使用它们去归一化这个 patch 的每个像素值。最后再使用归一化的像素值进行 MSE Loss 计算。但是发现这样做的效果比直接 MSE Loss 好。

    图8 (e): 不同数据增强策略的影响。MAE 只使用 cropping-only 就比较好,而进一步添加 color jittering 会影响性能。即使没有使用数据增强 (only center-crop, no flipping) ,MAE 模型仍然能够表现得体。作者也给出了原因,即:在 MAE 中,数据增强的角色其实是由 random masking 来扮演的。每个 iteration 的 mask 都不同,所以就相当于是产生了新的训练样本。

    图8 (9),图9: 不同 mask 采样策略的影响。block-wise masking 在 mask 50%时的效果还行,但是当 mask ratio 达到75%时性能就大幅下降了。grid-wise sampling 使得任务变得更简单,但相应的,图像重建质量也下降了。简单的随机抽样最适合 MAE 模型。

    4dd0cbc5f2af5b6aabe174e4b20b571d.png
    图9:不同 mask 采样策略的影响

    1.10 训练策略:

    下图10展示了不同 training epochs 的影响。在 training epochs=1600 时 MAE 还没有达到饱和。

    91e53b82623f251df2cd5ca0457e5971.png
    图10:不同 training epochs 的影响

    1.11 结果对比:

    如下图11所示为不同自监督方法性能对比,对于 ViT-B 模型,所有的方法性能相似,但是对于更大的 ViT-L 模型,性能差距就拉开了,证明了 MAE 对于大模型的泛化性能。

    3336b7bbbf5952f75db928a9e2da8386.png
    图11:不同自监督方法性能对比

    使用 ViT-H 结构的 Encoder,经过 448 fine-tuning 之后可以得到 87.8% 的 Accuracy,而整个过程只使用了 ImageNet 数据集。

    与 BEiT 相比,MAE 更快,训练方式更简单,MAE 重建 pixel,而 BEiT 重建 tokens。图11中的模型是为了更高的精度预先训练的 1600 epochs 的模型。即便如此,如果他们在同样的硬件环境下训练,我们总的训练前时间比其他任何方法都短。例如,对于 ViT-L,MAE 的训练时间是1600个 epochs,31小时。moco v3的训练时间是300个 epochs,36小时,使用相同的128个 TPU-v3 核心。

    1.12 Partial Fine-tuning

    最后,作者提出了一种 Partial Fine-tuning 的新套路,它不同于之前人们常用的 Linear Probing (只训练最后一层线性分类器的参数) 和 Fine-tuning (训练所有层的参数)

    Partial Fine-tuning 是指 只训练最后模型的若干层的参数。如下图12所示,值得注意的是,Fine-tuning 1个 Transformer Block 可以把 Accuracy 从73.0%提升至81.0%。此外,如果我们只Fine-tuning 1个 Transformer Block 的 MLP block,我们可以得到79.1% ,比 Linear Proing 要好得多。

    4c26ac4000371cd6e775837ea2b4f76a.png
    图12:Partial Fine-tuning

    总结

    用 MAE 做 pre-training 只需 ImageNet-1k 就能达到 87.8% 的 Top-1 准确度,超过了所有在 ImageNet-21k pre-training 的 ViT 变体模型。而从方法上看,MAE 选择直接重建原图的元素,而且证明了其可行性,改变了人们的认知,又几乎可以覆盖 CV 里所有的识别类任务,看起来像是开启了一个新的方向。直接重建原图的元素是非常重要的,因为通过这个形式,作者就用最最直观的方式完成了 MIM 任务,使得 MIM的潜力逐步被证实。从 MLM 到 MIM 的过渡已被证明,由此观之比肩 GPT3 的 CV 预训练大模型已不远矣。

    本文仅做学术分享,如有侵权,请联系删文。

    重磅!计算机视觉工坊-学习交流群已成立

    扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

    同时也可申请加入我们的细分方向交流群,目前主要有ORB-SLAM系列源码学习、3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、深度估计、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

    cdc762279f778555317b110a13bb764a.png

    ▲长按加微信群或投稿

    3c3d421097ef93077ed02a6a55a0fef0.png

    ▲长按关注公众号

    3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列三维点云系列结构光系列手眼标定相机标定、激光/视觉SLAM、自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:

    学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

    ba132effbb63ad9f7b6650911b250241.png

     圈里有高质量教程资料、可答疑解惑、助你高效解决问题

    觉得有用,麻烦给个赞和在看~

    展开全文
  • MSE与MAE对机器学习性能优化的作用比较.pdf
  • MAE - MetaTrader 5脚本.zip

    2019-09-13 13:42:16
    MAE(移动平均轨道线百分比)指标显示价格所处轨道线通道的百分比。
  • MAE:可扩展的视觉学习器
AbstractSection I IntroductionSection II Related WorkSection III MethodSection IV ImageNet ExperimentsPart 1Main PrepertiesPart 2 Comparison ResultsSection V Transfer ...


    From Fackbook AI Research
    Author:Kaiming He, Xinlei Chen,Saining Xie, Yanghao Li, Piotr Dollar, Ross Girshick

    Paper

    Abstract

    本文证明了masked autoencoder(MAE)可用于计算机视觉的可扩展自监督学习器。
    MAE想法很简单:首先会随机对输入图像的patch施加掩膜,然后重建丢失的像素。MAE基于两个核心设计:
首先本文提出了一个非对称的编码-解码结构,encoder只对未掩盖的patch部分的子集进行操作;然后通过一个轻量级的decoder从隐空间和mask token对图像进行重建。
    
其次,本文会掩盖大部分输入图像(高达75%),依旧能获得有意义的自监督结果。
    

结合以上两大设计可以高效训练大型网络,将训练速度提升3x并且提升精度。本文这种可扩展的方法可以学习泛化性良好的高性能模型,仅使用ImageNet-1K数据集训练的ViT-Huge模型就可达到87.8%的精度,并且迁移到下游任务的性能也超过有监督的预训练模型,展现出惊人的可扩展能力。

    Section I Introduction

    深度学习领域涌现一大批性能、容量不断增长的网络框架,如ResNet,Transformer;得益于硬件算力的提升,如今的网络模型可以轻易消化一百万张图像,甚至需要成百上千万的图像,并向数以亿计的带标签图像进发。
在NLP领域对海量数据的需求可以通过自监督预训练解决,比如GPT和BERT中的masked autoencoding,这些概念实现起来很简单:通过删除部分数据并且学习预测被删除的部分。这样可以用于训练超过千亿参数的泛化NLP模型。
    



Autoencoding是一种通用的去噪自编码器,也适用于计算机视觉。自从BERT大获成功,人们对其应用于视觉领域也产生了极大的兴趣,但是autoencoding在视觉领域的应用还是落后于NLP。我们不仅有这样一个疑问:是什么造成了这种差距?
    



在这里插入图片描述在这里插入图片描述

    本文尝试从以下角度回答这一问题:

    



(1)网络结构的差异
    



在计算机视觉领域CNN是主流框架,卷积操作通常在一系列grid上进行,要想将,asked token或者positional embedding集成到CNN并不容易。但是随着ViT的提出,这方面的应用不再存在那么多阻碍。

    



(2)语言任务和视觉任务中信息密度差异。
    




    



语言是人类产生的语义高度集中的交流信号,当训练语言模型预测语句中缺失的单词,需要复杂的语言理解机制。但是图像是自然信号,空间信息高度冗余,当某个patch缺失可以通过相邻的patch进行重建而不需要对其他部分、场景进行理解。
    



为了克服这种信息密度上差异,鼓励有用特征的学习,本文进行的实验是随机掩盖很大一部分的patch,这种策略很大程度上减少了冗余,变成一个极具挑战的自监督任务,需要对图像形成超越低层信息的全局性理解。可以参考Fig2-4体会一下。

    



(3)Autoencoder的decoder在语言和视觉任务中的角色是不同的。
    



在视觉任务中decoder负责将输入的隐空间表示复原回像素级别,其输出的语义水平比一般的识别任务更低;而在语言任务中,decoder需要预测缺失的单词,这是包含丰富语义信息的。虽然BERT中decoder并不十分重要,仅通过一层MLP得到最终输出,但是在数据额任务中decoder至关重要,它决定了能表示的语义水平的高低。
    




基于以上分析,本文提出一种加单、高效的可扩展的掩膜自编码器(Masked AutoEncoder,MAE)来学习视觉表征。MAE会对输入图像进行随机掩膜,然后重建像素空间中缺失的部分。
    




MAE是一个非对称的编码器-解码器结构,encoder只对未掩盖的patch进行操作,decoder则负责从隐空间中结合mask token对图像进行重建,参见Fig 1.

    




在这里插入图片描述Fig 1是MAE的网络框架,预训练时会随机掩盖很大一部分patch(比如75%);然后encoder对未掩盖的patch进行处理;decoder输入的是所有未掩盖的patch和mask token,用于重建输入图像。预训练后,decoder被丢弃然后仅使用encoder对未处理的图像进行处理,学习到的视觉表征用于识别任务。

    这种设计掩盖了很高比例的原始图像,这样做是一种双赢:encoder每次只处理一小部分patch,可以将整体预训练时间提升3倍,减少内存需求,同时又可以提升精度,可以将MAE扩展到其他大型模型。
    
MAE学习到的模型具有很好的泛化性,m模型容量也很大,在预训练阶段可以在ImageNet-1k上训练一些需要大量数据的模型,比如ViT-Large/Huge用于提升泛化性能。比如原始的ViT-Huge微调后的精度可达87.8%,超过了之前所有仅使用ImageNet-1K的模型。
    

本文还迁移到了目标检测、实例分割和语义分割任务中,本文的MAE均超过了对应的监督预训练结果;更重要的是本文还观察到通过扩展模型可以进一步提升MAE的性能,这些是呀结果与NLP中自监督预训练观察到的结果是一致的。

    Section II Related Work

    Masked language modeling
    

BERT,GPT都是NLP领域用于掩码语言建模非常成功的预训练模型,它们会掩盖输入语句很大一部分来训练模型对缺失部分进行预测并且具有很好的可扩展性,大量实验证明这些预训练模型学习到的特征表达可以很好的适用于下游任务。
    


Autoencoding
    


自编码是学习特征表达非常经典的一类方法,通过一个编码器将输入映射到隐空间然后通过解码器重建输入,比如PCA,K-MEANS都是自编码器;DAE则是另一类自编码器,输入的是破坏后的输入信号,用于重建未损坏的原始输入。掩膜像素、移除颜色通道都可以看做是DAE的一种,本文的MAE也是DAE的一种形式,但是在许多方面与经典的DAE又存在不同。
    



Maked image encoding
    



主要通过掩膜学习图像特征表达,将,masking也看做是DAE噪声的一种,Context Encoder则借助CNN来学习缺失的区域;受Transformer在NLP中的应用,ViT开始自监督学习masked patch,BEit则提出预测离散的token等。

    



Self-supervised learning
    



自监督学习在计算机领域中十分重要,主要通过预训练学习不同任务中的pretext,最近对比学习十分受关注,主要从建模图像相似性和不相似性方面进行建模,但是这种方法强烈依赖于数据增强;autoencoding追求的则是概念方向上的不同。

    Section III Method

    本文的方法遵循基本的自编码器结构,包含encoder和decoder,encoder负责将输入信号映射到隐空间,decoder负责将隐空间的信号重建会原始信号。但是与经典自编码器不同的地方在于本文采用一种非对称的设计,encoder只对未掩盖的patch进行操作,然后使用一个轻量级的decoder根据隐空间的表示和掩码标记重建原始信号。
    Masking
    
本文遵循ViT的流程,首先将图像划分为不重叠patch,然后对path进行随机采样对剩余的部分施加掩膜,采样策略十分简单:基于均匀分布进行随机采样。由于mask的比例很高因此随机采样就很大程度上消除了冗余,这样也无法借助临近patch通过外推进行重建;而均匀分布的随机采样也可以避免出现中心偏置,即图像中间有更多的mask;最后这种高度稀疏的输入有助于设计高效的自编码器。
    

MAE Encoder
    

本文encoder使用ViT,仅对未掩膜的patch进行操作。具体设计遵循原始的ViT,将patch经过linear projection并进行位置嵌入;送入Transformer block进行处理。
    

注意输入的patch是所有patch的子集(25%左右),mask patch会被移除,也不使用mask token。这样仅使用一小部分算力和内存就可以训练较大的encoder。
    


MAE Decoder
    



Decoder的输入则是所有token的全集,即已编码的可见patch+mask token。每一个mask token是一个共享的可学习的向量,用来表征该位置是否需要预测一个缺失的patch.
    



本文给所有token都添加了位置嵌入,不然mask token将不包含它们在图像中的位置信息。Decoder依旧包含一系列Transformer blocks.
注意MAE Decoder只在预训练时期使用,Encoder最后用于产生识别任务的特征表述,因此可以以更加灵活的方式来设计decoder的结构,比如本文尝试了非常小的decoder以及更浅、更窄的decoder结构。比如本文默认decoder每个token的计算量仅为encoder的1/10;这种非对称设计显著减少了预训练时间。
    




Reconstruction target
    




重建目标通过预测每一个mask patch的像素值来重建输入,decoder的每一个输出是代表一个patch的一组像素vector,decoder的最后一层是一层线性映射,输出通道数等于patch中的像素数量,因此decoder的输出可以重建回一个patch.
损失函数计算的是重建图像与原始图像的MAE损失,并且仅计算mask patch上的损失,这一点类似BERT。
    





本文还研究了使用归一化图像像素的效果,可以提高重建效果。

    





Simple Implementation
    






MAE预训练十分便捷无需特殊的稀疏操作。
    







第一步就是对每一个patch经过线性映射+位置嵌入转换成token;

    







第二步就是随机shuffle并移除最后一部分token,移除比例根据实验设定;
    








第三步将tokens送入encoder获得编码后的encoded patches;

    








第四步将encoded patched还原回对应位置,并在缺失部分补上mask patches;
    









第五步将对齐后的token送入decoder,decoder输出每一个patch对应的像素集合;
    










第六步计算预测的图像与原始图像之间的MSE loss;
    











第七步是取训练好的encoder部分作为下游任务的basemodel,在下游任务中进行微调。

    Section IV ImageNet Experiments

    在ImageNet-1K上预训练,然后在下游任务进行微调。backbone是ViT-Large,比ResNet-50还大因此容易过拟合。需要从头训练+正则化训练效果比较好,微调的话精度很大程度取决于预训练的效果。

    在这里插入图片描述

    Part 1Main Preperties

    Table 1展示了消融实验的结果。
    

Masking ratio
    

Fig 5展示的是使用线性探测和微调两种不同掩膜率的性能对比,,使用线性探测性能会一直上升,使用微调则在较大的范围内均保持较好的精度(掩膜率40%-80%),但是所有微调的性能都由于线性探测。可以看到无论是线性探测还是微调,掩膜率高达75%时效果最好;这一点与BERT不太一样,BERT最佳的掩膜率是15%;本文也比其他相近视觉任务有区别,它们一般在20%-15%。
    


从Fig 4可以看出在比较高的掩膜率(75%)会产生不同的但依旧合理的重建输出表示模型有很好的泛化能力,重建的图像不能仅仅通过简单的扩展线条或纹理来获得,本文认为这种是学习到有用的特征表述后的一种类似推理的行为。
    


在这里插入图片描述
    Decoder Design
    Decoder depth
编码器深度的影响,主要就是Transformer block的数量,decoder深度对线性探测的影响比较大,因为decoder越深,图像重建使用的特征越抽象,与重建越相关,与识别任务可能越不相关。通过加大深度获得更抽象的特征表述可以在线性探测上获得8%的性能提升;但是因为微调还会在识别任务上进行重新学习,因此decoder 深度的影响没有那么大。
    
很有趣的一点是即使使用single-block在微调上的性能也很优秀,这可以进一步加速预训练。
    

Decoder width
    

通道的数目影响的是Decoder width,默认使用512-d,在线性探测和微调上性能都比较出色。
最终decoder包含8个block,通道数是512,比ViT-L每个token的计算量小得多,非常节约算力和内存。

    Mask token
    

本文还探究了encoder是否需要使用mask token.如果encoder使用mask token性能会更差,线性探测中性能会下降14%。主要是因为预训练和最终实时时输入的差异太大,预训练输入的是mask后的结果,应用的时候使用的是原始未mask的结果,二者存在很大的差异。
    

不使用mask token可以确保encoder看到的都是真实的patch,这样有助于提升精度。
不使用mask token还可以进一步减少计算量,节省下来的算力和内存可以用来训练更大的模型。
    Reconstruction target
    
本文还对比了不同的重建目标的效果,分别是:直接对像素进行重建;对patch内像素归一化后进行重建;对patch像素PCA后取主成分进行重建。效果最好的是直接对像素重建和对patch内归一化后进行重建,表示使用高频分量最有效。
本文还是用了dVAE对token进行预测,效果也不是很好。

    Data augmentation
    
MAE在仅使用cropping的数据增强效果也很好,如果再加入color-jitter范围会下降。令人惊奇的一点是即使不使用数据增强MAE效果也很好,这与对比学习截然相反。
    

主要是因为在MAE中mask随机施加掩膜的操作就是一种数据增强的操作了,因为每次迭代的掩膜都是不同的,都会生成新的训练样本,这就是很好的数据增强了。
    


Mask sampling strategy
    



Fig 6展示的是不同掩膜采样方式的对比结果。有block-wise masking,grid-wise sampling,ramdom sampling。结果显示随机采样效果最好。

    



在这里插入图片描述在这里插入图片描述

    Training schedule
    



Fig 7展示的是训练时长对性能的影响,可以看到随着训练时间的正常准确性稳步提升。实际是1600epochs本文也没有看到精度饱和;这不像对比学习,在300epoch就开始饱和;并且MAE每次只能看到25%的原始patch,而对比学习每次看到的是200%甚至更多的原始patch。

    Part 2 Comparison Results

    Comparisons with self-supervised method
    Table 3展示的是预训练自监督的对比结果。实验结果显示MAE既有很好的可扩展性,模型越大性能稳步提升;并且backbone是原始的ViT,我们认为更先进的网络性能会进一步提升。
MAE即使预训练1600epochs耗费的时间也比其他模型要少。
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

    Comparisons with supervised pre-training
    
Table 1中表明线性探测与微调之间没有什么关联,线性探测早期比较流行,但是它忽略了非线性特征的作用;本文还探索了部分微调的策略即只微调后面几层,前面层冻住。
    

Fig 9展示了对比结果,可以看到只微调一个Transformer block就能将精度从73.5%提升至81.0%;如果只微调一个block的一半也能获得79.1%的精度。比线性探测好得多。
    

在这里插入图片描述

    Section V Transfer Learning

    本文还前移到了目标检测和语义分割任务,使用的是Table 3中预训练的模型。
    
目标检测结果参见Table 4。
backbone依旧是ViT但结合了FPN进去用于目标检测,可以看到MAE取得了最优的AP指标,比其他监督预训练的结果都要好;在ViT-L上优于监督预训练4个点,而MAE 更简单更快速。
    

语义分割的结果展示在Table5,可以看到ViT-L的结果比对应的监督学习模型提升了3.7%。
    

在这里插入图片描述

    Pixels vs Tokens
    




Table 6展示的是重建目标选择pixel还是token更有效。尽管使用dVAE编码后的token比使用未归一化的像素效果更好,但是与归一化后的额像素性能相当,因此本文认为MAE使用tokenization用处不大。

    Section VI Discussion and Conclusion

    扩展性良好的简洁算法是深度算法的核心内容,NLP中一些简单的自监督学习方法可以指数级别的缩放模型;在CV领域预训练主要基于监督学习。本文采取类似NLP中自监督学习的方式在ImageNet上和迁移学习中应用Antuencoder可以灵活的进行扩展,CV中的自监督学习也许能采取和NLP中类似的探索方式。

    另一方面,本文注意到图像和语言两种信号的不同,这种差异必须谨慎处理。图像仅仅记录了光信息没有分解成语义部分,而本文的随机移除也尽可能不形成图像中的语义段;而MAE复原的对象也是像素,并不是具有语义的实体。
但实验结果显示MAE依旧能推断出一些复杂的、整体的结构,这也说明了它学习到了视觉概念。我们认为这是通过MAE中丰富的隐层表示学到的,希望这一发现能为未来的工作提供思路。

    Broader impacts
    
本文提出的方法会基于学习到的训练集统计数据来进行预测,因此会包含数据中的偏差、具有副作用的样本等;本文的模型可能会生成不存在的内容,因此当基于本工作生成图像时,上述这些问题有待进一步的探索和考虑。

    展开全文
  • MAE150A-源码

    2021-04-01 06:14:27
    MAE150A 该存储库是为UCLA的MAE 150A中级流体力学设计的。 建置状态 要开始使用jupyter,请执行以下操作: 从Julia下载到您的计算机上 启动Julia会话。 输入]进入Julia包裹管理系统。 在此提示符下,键入add ...
  • 复现代码: https://github.com/pengzhiliang/MAE-pytorch(后台回复“MAE”,获取完整项目压缩包) 何恺明大佬新作一发出来,知乎上就有众多大佬在讨论 具体链接:https://www.zhihu.com/question/498364155 除了...

    点上方计算机视觉联盟获取更多干货

    仅作学术分享,不代表本公众号立场,侵权联系删除

    转载于:AI算法与图像处理

    985人工智能博士笔记推荐

    周志华《机器学习》手推笔记正式开源!附pdf下载链接,Github2500星!

    复现代码:

    https://github.com/pengzhiliang/MAE-pytorch(后台回复“MAE”,获取完整项目压缩包)

    何恺明大佬新作一发出来,知乎上就有众多大佬在讨论

    具体链接:https://www.zhihu.com/question/498364155

    除了大家对何恺明大佬的工作的肯定外(当然部分认为novelty不足),也引发对未来CV工作的思考,是否会引领类似去年 transformer那样子的热潮?亦或是证明ViT的各种改变可能都是没有意义的。

    这次何恺明大佬又把握了技术发展的趋势,NLP和CV互相融合的工作看来会是大势所趋。

    5bc036b7228289c9dad5122c47e556eb.png

    论文链接:https://arxiv.org/pdf/2111.06377.pdf

    44a9d314deb4a3217695a86aa6fc73c6.png

    复现代码:

    https://github.com/pengzhiliang/MAE-pytorch

    项目结构:

    5dc929714824440c52e4d2bc908171ee.png

    详情:

    ae71a03da671fdd0cb719d95faff9154.png

    (后台回复“MAE”,获取完整项目压缩包)

    -------------------

    END

    --------------------

    我是王博Kings,985AI博士,华为云专家、CSDN博客专家(人工智能领域优质作者)。单个AI开源项目现在已经获得了2100+标星。现在在做AI相关内容,欢迎一起交流学习、生活各方面的问题,一起加油进步!

    我们微信交流群涵盖以下方向(但并不局限于以下内容):人工智能,计算机视觉,自然语言处理,目标检测,语义分割,自动驾驶,GAN,强化学习,SLAM,人脸检测,最新算法,最新论文,OpenCV,TensorFlow,PyTorch,开源框架,学习方法...

    这是我的私人微信,位置有限,一起进步!

    78b57d60296e4579385a4c80539b30fb.png

    王博的公众号,欢迎关注,干货多多

    手推笔记:

    思维导图  |  “模型评估与选择”  |  “线性模型”  |  “决策树”  |  “神经网络”  |  支持向量机(上)  |  支持向量机(下)  |  贝叶斯分类(上)  |  贝叶斯分类(下)  |  集成学习(上)  |  集成学习(下)  |  聚类  |  降维与度量学习  |  稀疏学习  |  计算学习理论  |  半监督学习  |  概率图模型  |  规则学习

    增长见识:

    博士毕业去高校难度大吗?  |  研读论文有哪些经验之谈?  |  聊聊跳槽这件事儿  |  聊聊互联网工资收入的组成  |  机器学习硕士、博士如何自救?  |  聊聊Top2计算机博士2021年就业选择  |  非科班出身怎么转行计算机?  |  有哪些相见恨晚的科研经验?  |  经验 | 计算机专业科班出身如何提高自己编程能力?  |  博士如何高效率阅读文献  |  有哪些越早知道越好的人生经验?  |  

    其他学习笔记:

    PyTorch张量Tensor  |  卷积神经网络CNN的架构  |  深度学习语义分割  |  深入理解Transformer  |  Scaled-YOLOv4!  |  PyTorch安装及入门  |  PyTorch神经网络箱  |  Numpy基础  |  10篇图像分类  |  CVPR 2020目标检测  |  神经网络的可视化解释  |  YOLOv4全文解读与翻译总结  | 

    e134c4449beb3b4a155156f573c51fb8.gif

    点分享

    4db8ade385f69a36ec4aaa0882c547d9.gif

    点收藏

    a1de701a140526e49e1803cc6e8f873a.gif

    点点赞

    c5c614e920f15eab0b7956206ec76e3d.gif

    点在看

    展开全文
  • 【损失函数】MSE, MAE, Huber loss详解

    千次阅读 多人点赞 2020-12-15 19:51:59
    另外,我们把这三种损失函数对应的 Loss 随着迭代次数变化的趋势绘制出来: MSE: MAE: Huber Loss: 对比发现,MSE 的 Loss 下降得最快,MAE 的 Loss 下降得最慢,Huber Loss 下降速度介于 MSE 和 MAE 之间。...

    转载:https://mp.weixin.qq.com/s/Xbi5iOh3xoBIK5kVmqbKYA

               https://baijiahao.baidu.com/s?id=1611951775526158371&wfr=spider&for=pc

    无论在机器学习还是深度领域中,损失函数都是一个非常重要的知识点。损失函数(Loss Function)是用来估量模型的预测值 f(x) 与真实值 y 的不一致程度。我们的目标就是最小化损失函数,让 f(x) 与 y 尽量接近。通常可以使用梯度下降算法寻找函数最小值。

    关于梯度下降最直白的解释可以看我的这篇文章:

    简单的梯度下降算法,你真的懂了吗?

    损失函数有许多不同的类型,没有哪种损失函数适合所有的问题,需根据具体模型和问题进行选择。一般来说,损失函数大致可以分成两类:回归(Regression)和分类(Classification)。今天,红色石头将要总结回归问题中常用的 3 种损失函数,希望对你有所帮助。

    回归模型中的三种损失函数包括:均方误差(Mean Square Error)、平均绝对误差(Mean Absolute Error,MAE)、Huber Loss。

    1. 均方误差(Mean Square Error,MSE)

    均方误差指的就是模型预测值 f(x) 与样本真实值 y 之间距离平方的平均值。其公式如下所示:

                                                                                           

    其中,yi 和 f(xi) 分别表示第 i 个样本的真实值和预测值,m 为样本个数。

    为了简化讨论,忽略下标 i,m = 1,以 y-f(x) 为横坐标,MSE 为纵坐标,绘制其损失函数的图形:

                                                                            

    MSE 曲线的特点是光滑连续、可导,便于使用梯度下降算法,是比较常用的一种损失函数。而且,MSE 随着误差的减小,梯度也在减小,这有利于函数的收敛,即使固定学习因子,函数也能较快取得最小值。

    平方误差有个特性,就是当 yi 与 f(xi) 的差值大于 1 时,会增大其误差;当 yi 与 f(xi) 的差值小于 1 时,会减小其误差。这是由平方的特性决定的。也就是说, MSE 会对误差较大(>1)的情况给予更大的惩罚,对误差较小(<1)的情况给予更小的惩罚。从训练的角度来看,模型会更加偏向于惩罚较大的点,赋予其更大的权重。

    如果样本中存在离群点,MSE 会给离群点赋予更高的权重,但是却是以牺牲其他正常数据点的预测效果为代价,这最终会降低模型的整体性能。我们来看一下使用 MSE 解决含有离群点的回归模型。

    import numpy as np
    import matplotlib.pyplot as plt
    x = np.linspace(1, 20, 40)
    y = x + [np.random.choice(4) for _ in range(40)]
    y[-5:] -= 8
    X = np.vstack((np.ones_like(x),x))    # 引入常数项 1
    m = X.shape[1]
    # 参数初始化
    W = np.zeros((1,2))
    
    # 迭代训练 
    num_iter = 20
    lr = 0.01
    J = []
    for i in range(num_iter):
       y_pred = W.dot(X)
       loss = 1/(2*m) * np.sum((y-y_pred)**2)
       J.append(loss)
       W = W + lr * 1/m * (y-y_pred).dot(X.T)
    
    # 作图
    y1 = W[0,0] + W[0,1]*1
    y2 = W[0,0] + W[0,1]*20
    plt.scatter(x, y)
    plt.plot([1,20],[y1,y2])
    plt.show()

    拟合结果如下图所示:

                                                                                                                  

    可见,使用 MSE 损失函数,受离群点的影响较大,虽然样本中只有 5 个离群点,但是拟合的直线还是比较偏向于离群点。这往往是我们不希望看到的。

    2. 平均绝对误差(Mean Absolute Error,MAE)

    平均绝对误差指的就是模型预测值 f(x) 与样本真实值 y 之间距离的平均值。其公式如下所示:

                                                                                                      

    为了简化讨论,忽略下标 i,m = 1,以 y-f(x) 为横坐标,MAE 为纵坐标,绘制其损失函数的图形:

                                                                                                 

    直观上来看,MAE 的曲线呈 V 字型,连续但在 y-f(x)=0 处不可导,计算机求解导数比较困难。而且 MAE 大部分情况下梯度都是相等的,这意味着即使对于小的损失值,其梯度也是大的。这不利于函数的收敛和模型的学习。

    值得一提的是,MAE 相比 MSE 有个优点就是 MAE 对离群点不那么敏感,更有包容性。因为 MAE 计算的是误差 y-f(x) 的绝对值,无论是 y-f(x)>1 还是 y-f(x)<1,没有平方项的作用,惩罚力度都是一样的,所占权重一样。针对 MSE 中的例子,我们来使用 MAE 进行求解,看下拟合直线有什么不同。

    X = np.vstack((np.ones_like(x),x))    # 引入常数项 1
    m = X.shape[1]
    # 参数初始化
    W = np.zeros((1,2))
    
    # 迭代训练 
    num_iter = 20
    lr = 0.01
    J = []
    for i in range(num_iter):
       y_pred = W.dot(X)
       loss = 1/m * np.sum(np.abs(y-y_pred))
       J.append(loss)
       mask = (y-y_pred).copy()
       mask[y-y_pred > 0] = 1
       mask[mask <= 0] = -1
       W = W + lr * 1/m * mask.dot(X.T)
    
    # 作图
    y1 = W[0,0] + W[0,1]*1
    y2 = W[0,0] + W[0,1]*20
    plt.scatter(x, y)
    plt.plot([1,20],[y1,y2],'r--')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.title('MAE')
    plt.show()

    注意上述代码中对 MAE 计算梯度的部分。

    拟合结果如下图所示:

                                                                                                                       

    显然,使用 MAE 损失函数,受离群点的影响较小,拟合直线能够较好地表征正常数据的分布情况。这一点,MAE 要优于 MSE。二者的对比图如下:

                                          

    选择 MSE 还是 MAE 呢?

    实际应用中,我们应该选择 MSE 还是 MAE 呢?从计算机求解梯度的复杂度来说,MSE 要优于 MAE,而且梯度也是动态变化的,能较快准确达到收敛。但是从离群点角度来看,如果离群点是实际数据或重要数据,而且是应该被检测到的异常值,那么我们应该使用MSE。另一方面,离群点仅仅代表数据损坏或者错误采样,无须给予过多关注,那么我们应该选择MAE作为损失。

    3. Huber Loss

    既然 MSE 和 MAE 各有优点和缺点,那么有没有一种激活函数能同时消除二者的缺点,集合二者的优点呢?答案是有的。Huber Loss 就具备这样的优点,其公式如下:

                                                                             

    Huber Loss 是对二者的综合,包含了一个超参数 δ。δ 值的大小决定了 Huber Loss 对 MSE 和 MAE 的侧重性,当 |y−f(x)| ≤ δ 时,变为 MSE;当 |y−f(x)| > δ 时,则变成类似于 MAE,因此 Huber Loss 同时具备了 MSE 和 MAE 的优点,减小了对离群点的敏感度问题,实现了处处可导的功能。

    通常来说,超参数 δ 可以通过交叉验证选取最佳值。下面,分别取 δ = 0.1、δ = 10,绘制相应的 Huber Loss,如下图所示:

                                                                                 

    Huber Loss 在 |y−f(x)| > δ 时,梯度一直近似为 δ,能够保证模型以一个较快的速度更新参数。当 |y−f(x)| ≤ δ 时,梯度逐渐减小,能够保证模型更精确地得到全局最优值。因此,Huber Loss 同时具备了前两种损失函数的优点。

    下面,我们用 Huber Loss 来解决同样的例子。

    X = np.vstack((np.ones_like(x),x))    # 引入常数项 1
    m = X.shape[1]
    # 参数初始化
    W = np.zeros((1,2))
    
    # 迭代训练 
    num_iter = 20
    lr = 0.01
    delta = 2
    J = []
    for i in range(num_iter):
       y_pred = W.dot(X)
       loss = 1/m * np.sum(np.abs(y-y_pred))
       J.append(loss)
       mask = (y-y_pred).copy()
       mask[y-y_pred > delta] = delta
       mask[mask < -delta] = -delta
       W = W + lr * 1/m * mask.dot(X.T)
    
    # 作图
    y1 = W[0,0] + W[0,1]*1
    y2 = W[0,0] + W[0,1]*20
    plt.scatter(x, y)
    plt.plot([1,20],[y1,y2],'r--')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.title('MAE')
    plt.show()

    注意上述代码中对 Huber Loss 计算梯度的部分。

    拟合结果如下图所示:

                                                                                                  

    可见,使用 Huber Loss 作为激活函数,对离群点仍然有很好的抗干扰性,这一点比 MSE 强。另外,我们把这三种损失函数对应的 Loss 随着迭代次数变化的趋势绘制出来:

    MSE:                                                MAE:                                       Huber Loss: 

         

     

    对比发现,MSE 的 Loss 下降得最快,MAE 的 Loss 下降得最慢,Huber Loss 下降速度介于 MSE 和 MAE 之间。也就是说,Huber Loss 弥补了此例中 MAE 的 Loss 下降速度慢的问题,使得优化速度接近 MSE。

    最后,我们把以上介绍的回归问题中的三种损失函数全部绘制在一张图上。

                                                                                                 

    好了,以上就是红色石头对回归问题 3 种常用的损失函数包括:MSE、MAE、Huber Loss 的简单介绍和详细对比。这些简单的知识点你是否已经完全掌握了呢?

    除了MSE,MAE,huber loss,在回归任务中,我们还会使用log-cosh loss,它可以保证二阶导数的存在,有些优化算法会用到二阶导数,在xgboost中我们同样需要利用二阶导数;同时,我们还会用到分位数损失,希望能给不确定的度量。

    除了log和hinge,在分类任务中,我们还有对比损失(contrastive loss)、softmax cross-entropy loss、中心损失(center loss)等损失函数,它们一般用在神经网络中。

    4 focal loss

    转自:https://blog.csdn.net/zjucor/article/details/84259969

    比如batch为32 sample的,8个多标签输出,可以等价看成32*8个sample的二分类问题,自然这32*8个sample正负样本比很容易不均(如果每个sample只有1,2个标签的话)。这是focal loss就可以发挥很大的作用了

    For the multi-label classification, you can try tanh+hinge with {-1, 1} values in labels like (1, -1, -1, 1). Or sigmoid + hamming loss with {0, 1} values in labels like (1, 0, 0, 1). In my case, sigmoid + focal loss with {0, 1} values in labels like (1, 0, 0, 1) worked well. You can check this paper https://arxiv.org/abs/1708.02002.

    class FocalLoss(nn.Module):
        def __init__(self, gamma=2):
            super().__init__()
            self.gamma = gamma
            
        def forward(self, input, target):
            if not (target.size() == input.size()):
                raise ValueError("Target size ({}) must be the same as input size ({})"
                                 .format(target.size(), input.size()))
     
            max_val = (-input).clamp(min=0)
            loss = input - input * target + max_val + \
                ((-max_val).exp() + (-input - max_val).exp()).log()
     
            invprobs = F.logsigmoid(-input * (target * 2.0 - 1.0))
            loss = (invprobs * self.gamma).exp() * loss
            
            return loss.sum(dim=1).mean()
    

     

     

    展开全文
  • 这个新方法在十几类任务和数据集上刷新了 SOTA 结果,在一些指标上甚至超过了 MAE。前段时间,何恺明等人的一篇论文成为了计算机视觉圈的焦点。这篇论文仅用简单的 idea(即掩蔽自编码器...
  • 所提MAE极为简单:对输入图像进行块随机mask并对遗失像素进行重建。该方案使得所得高精度模型具有很好的泛化性能:仅需ImageNet-1K,ViT-Huge取得了87.8%的top1精度 。 Masked Autoencoders Are Scalable Vision ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,096
精华内容 6,038
关键字:

mae