• 组会阅读材料2022620 @图像翻译@Kaggle技巧@自编码器@扩散模型


    2022-6-20 14:28:01

    近年图像翻译先进模型小结

    https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/106484848
    图像翻译学习笔记( Image-to-Image Translation)

    定义

    图像翻译技旨在通过设计端到端的模型将源域图像转换到目标域图像,通常源域提供图像的内容,目标域提供图像的“风格”(可以是图像属性或图像风格),在源域内容下实现目标域的“风格”化,从而实现源域图像到目标域图像的转换。
    paperwithcode上的定义:Image-to-image translation is the task of taking images from one domain and transforming them so they have the style (or characteristics) of images from another domain.

    通俗点图像翻译可以是标签图到场景图的转换、线条轮廓到色彩图像转换、图像的风格转换,春夏场景的变换,人脸的属性变换,也可以是白昼交替的转换。只要符合上述端到端转换的任务,都可以通过图像翻译实现。

    常用结构

    1. pix2pix:基于cGAN(conditional GAN),因为cGAN可以通过添加条件信息来指导图像生成,因此在图像翻译中就可以将输入图像作为条件,学习从输入图像到输出图像之间的映射,从而得到指定的输出图像。pix2pix对传统的GAN做了个小改动,它不再输入随机噪声,而是输入用户给的图片(比如猫的铅笔画线条轮廓)。生成器采用U-Net,判别器采用PatchGAN
    2. cycle-GAN:出现原因在于在实际的训练之中缺乏成对的训练数据,提出了“循环一致性”作为新的GAN网络的损失函数。基本思想是将图像从一个域变换到另一个域,再反变换回来,那么反变换后的图像应当与原有图像相同。
    3. starGAN
    4. styleGAN
    5. SinGAN:按照不同分辨率分阶段训练生成器和判别器,在串行的阶段训练上,当前生成器将前一个生成器生成的图像作为输入,在此基础上生成比当前还要高分辨率的图像。不同阶段的生成器都是单独训练的,这也意味着在训练当前生成器时,之前的生成器的权重都保持不变。
    6. ConSinGAN:设计了对生成器进行端到端的训练,每个生成器将前一个生成器生成的特征(而不是图像)作为输入。这种训练是对多个阶段下的生成器同时进行的,也称之为并行训练的方式。

    光子神经网络登上nature,图像识别速度降至1纳秒

    https://mp.weixin.qq.com/s/SSQToHh3JGRlRzsGVrE6jA
    美国研究者开发的一个光子神经网络(photonic deep neural network,PDNN),让图像识别仅需1纳秒
    在每个神经元中,线性计算是通过光学方式进行的,而非线性激活函数是通过光电子方式实现的,从而可使分类时间低于570ps(=0.57ns)。
    论文的通讯作者,电气工程师Firooz Aflatouni对这个PDNN的性能补充描述道:它每秒可以对近18亿张图像进行分类,而传统的视频帧率是每秒24至120帧。
    这里的PDNN芯片电路被集成在仅9.3 mm 的面积内,不需要时钟、传感器以及大型存储模块。
    该研究的宾大工程师们则表示,PDNN对光学数据的直接、无时钟处理消除了模拟-数字转换和对大型内存模块的要求,使下一代深度学习系统的神经网络更快、更节能。

    微软:我已把显存优化做到了极致,还有谁?

    https://mp.weixin.qq.com/s/VOgNPEcDhmhMuDdy_HL0BA

    ZeRO-Offload: Democratizing Billion-Scale Model Training

    大规模模型优化的本质就是加大并行度,分布式超大规模模型并行技术主要包括:

    • 数据并行 Data Parallelism:最通用的并行方式,例如,PyTorch官方提供了DDP(DistributedDataParallel)接口便于用户使用,为每张卡分配不同的数据,多张卡通过Ring Allreduce方法汇总梯度进而对参数进行更新。
    • 模型并行 Tensor Model Parallelism:对Tensor进行切分,每张卡都只是对Tensor的一部分进行操作,最后合并多张卡的结果即可。
    • 流水线并行 Pipeline Model Parallelism:按照模型Stage进行划分,将模型的不同层放到不同的计算设备上,降低单个设备的显存消耗,从而训练更大参数的模型。

    处理一个mini-batch的数据时候只有一台设备处于计算状态,这样设备利用率太差,进一步对mini-batch数据进行划分得到更小粒度的micro-batch,可以很大的提升流水线并行的并发度。
    每一个micro-batch都会产生前向传播的中间结果(activation)并占据了大量的显存,基于此,陈天奇在《Training Deep Nets with Sublinear Memory Cost》中提出了 Checkpointing(重计算) 和 CPU offload(CPU 卸载) 。

    Checkpointing选择用额外的计算开销换取显存,本质上很简单,即在前向网络中只保存标记的少量的Tensor(checkpointing的tensor),其余的会在反向传播的时候根据checkpoing的tensor临时重新计算一遍前向得到。
    CPU offload 选择用额外的通讯开销来换取显存, 对于前向传播的中间结果(activation),暂时用不到就先放到内存中(Host Memory),等计算需要的时候再放到显存中,用大量的I/O时间来换取显存。

    上述的各个方法解释简单,但是实现的时候对于非分布式训练专家的普通用户却根本无从下手,为了便于用户使用,各个公司都开源了自己的解决方案:

    • NVIDIA 发布了5300亿的威震天Megatron,同时发布了自己的并行化框架 Megatron-LM
    • 微软提出了ZeRO算法,并借用 Megatron-LM开发了分布式并行框架DeepSpeed
    • Google的MeshTensorFlow/Gpipe/Gshard
    • FaceBook的FSDP
    • 百度PaddlePaddle,华为Mindspore,一流科技的Oneflow ...

    模型的显存占用构成

    • 模型权重(Model weights)
    • 梯度(Gradients)
    • 优化器(Optimizer state)
    • 前向传播的Activation

    Adam优化器,以混合精度训练为例,对于10亿 (1 Billion)参数量的模型,其权重和梯度是以FP16(两字节)进行存储的,因此分别需要2GB的存储空间。为了在后向传播结束后高效的更新参数,要求Adam优化器需要保存FP32的参数和梯度副本、一阶矩样本均值和二阶矩样本方差,又分别需要4GB显存。这样对于10亿参数的模型,虽然模型参数仅2GB,但是模型训练的时候至少需要20GB的内存。且对于每一台机器都需要消耗固定相同的全量内存,出现了严重的内存冗余现象。

    ZeRO优化方案:让上述的内存平均分配到每块GPU上,每块GPU只承担模型的一部分即可。
    将深度学习的内存消耗主要分为三种:Optimizer(优化器状态)、Gradients(梯度)和Parameters(参数)。这三部分可以部分或者全部平均分配到各个GPU中,ZeRO提出了三种方式:

    • \(P_{os}\):只将优化器状态进行平均划分。
    • \(P_{os+g}\):将梯度和优化器状态进行平均划分。
    • \(P_{os+g+p}\):将优化器状态,梯度和参数都进行平均划分。

    数据前向传播和反向更新参数只需要让保存数据的GPU向其他GPU广播数据即可,通过通信成本来大幅度的节省显存开销。

    ZeRO-offload:ZeRO + CPU offload,进一步把CPU内存(Host memory或CPU memory)纳入了考量,把占大头的优化器状态数据放到CPU内存中。模型训练期间,模型参数(Parameters)不会进行分割并保存在GPU中;梯度(Gradients)和ZeRO的方式一致,按照GPU进行平均分割,每个GPU都只保存梯度的一份;对于优化器状态(optimizer states)同样会对其进行分割并始终存储在CPU内存中。

    B站李沐关于ZeRO论文精度:https://www.bilibili.com/video/BV1tY411g7ZT

    称霸Kaggle的十大深度学习技巧

    https://mp.weixin.qq.com/s/tLLbV54i9gqv0r2AtCVijQ

    1. 使用Fast.ai库
    2. 差分学习率(Differential Learning rates):冻结前面网络层并微调后面几层,取得效果后解冻前面的并以10倍差分学习率[0.1, 0.01, 0.001]调整整个模型
    3. 最优学习率:起始较低,每个批次中以指数形式增加,同时记录每个学习率对应loss值,画出loss-lr曲线,找出loss仍在下降的最大学习率作为最优学习率
    4. 余弦退火(Cosine annealing):在loss接近最小值时利用余弦函数来逐步降低学习率
    5. 带重启的SGD算法:通过突然提高学习率(lr下降到最低时,再次设为最高值,再次缓慢减小到最小值),来“跳出”局部最小值并找到通向全局最小值的路径。称为带重启的随机梯度下降方法(stochastic gradient descent with restarts, SGDR)
    6. 人格化你的激活函数(大概是便于记忆):Softmax只喜欢选择一样东西;Sigmoid想知道你在[-1, 1]区间上的位置,并不关心你超出这些值后的增加量;Relu是一名俱乐部保镖,要将负数拒之门外。
    7. 在NLP问题中使用迁移学习:就是利用预训练模型的某些层,如使用bert的tokenizer
    8. 利用PyTorch中embedding函数,将分类变量快速转换为嵌入矩阵:词嵌入?现在不都这样
    9. 其他设置:Dropout层: 缓解过拟合、尺寸设置: 先训练小尺寸图像,然后使用大尺寸图像再次训练模型、TTA: test time augmentation,为原始图像造出多个不同版本,包括不同区域裁剪和更改缩放程度等,以平均输出作为图像的最终输出分数
    10. 创新力很关键:大公司有大量GPU资源,但是普通人有创新啊?

    原文:https://blog.floydhub.com/ten-techniques-from-fast-ai/
    18年的,果然久远,看文章前应该先看清楚发布日期的

    2022-6-21 15:15:44

    【全】一文带你了解自编码器(AutoEncoder)

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

    定义

    自编码器可以理解为一个试图去还原其原始输入的系统。模型主要由编码器(Encoder)和解码器(Decoder)组成,其主要目的是将输入x转换成中间变量h,然后再将h转换成 \(\bar{x}\) ,然后对比输入x和输出 \(\bar{x}\) 使得他们两个无限接近。

    在深度学习中,自动编码器是一种无监督的神经网络模型,它可以学习到输入数据的隐含特征,这称为编码(coding),同时用学习到的新特征可以重构出原始输入数据,称之为解码(decoding)。

    组成

    • 编码器(Encoder):编码器由一系列逐步递减的的layers构成,最后输出一个低维的隐变量(Latent variable)。
    • 隐变量(Latent variable):压缩输入同时又最大化保留输入信息的低维向量。
    • 解码器(Decoder):解码器基本就是编码架构的镜像,每层layer的神经元个数逐步递增,最终输出形状和输入形状一样。

    作用

    从直观上来看,从 \(x \rightarrow h \rightarrow \bar{x}\) 的过程中,\(x \rightarrow h\)可以用于特征提取或特征降维,因为使用h就可以近似还原出x,说明h包含了x的主要信息

    特点

    1. 自动编码器是数据相关的(data-specific 或 data-dependent),它只能压缩那些与训练数据类似的数据。使用人脸训练出来的自动编码器在压缩树木时性能就很差
    2. 自动编码器是有损的,解压缩的输出与原来的输入相比是退化的
    3. 自动编码器是从数据样本中自动学习的(只需要x),很容易对指定类的输入训练出一种特定的编码器,不需要额外的标注或其他工作。

    AutoEncoder, VAE and AAE

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

    Denosing AutoEncoder

    样本x由操作q破坏为\(\bar{x}\),将\(\bar{x}\)编码为隐向量y,然后将y解码为z,z与x形状相同,使z逼近x
    相比AE,DAE能提取到更鲁棒性的编码向量

    Generative AutoEncoder

    AE和DAE的目标是编码,训练完成后只保留编码器,编码器将输入样本编码为低维空间中的向量。
    而GAE是生成式的模型,训练完成后只保留解码器,从先验分布 p(z) 中采样,然后生成为和训练样本相似的数据。
    这一类的自编码器包括AAE和VAE。
    AAE(Adversarial Autoencoders)的基础是GAN,也就是GAN和AutoEncoder二者的结合。它是将自动编码器转换为生成模型的通用方法,其训练有双重目标 —— 传统的重建误差标准和对抗训练标准。

    AE、VAE、CVAE解读

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

    AE解决了隐向量的编码,可以重构图片,但是无法生成新图片,因为无法凭空构造隐藏向量。
    VAE则在编码过程增加一些限制,迫使其编码器生成的隐含向量能够粗略地遵循一个标准正态分布。这样就可以从满足正态分布的噪声里采样,生成新的样本。
    CVAE,即Conditional VAE,对应于GAN中的CGAN,这是一类而非某个特定的模型名称,它希望能够控制某个变量来有目的地生成某一类图像。

    GAN 和 VAE 的本质区别是什么?为什么两者总是同时被提起?

    https://www.zhihu.com/question/317623081

    本质区别是loss的区别
    VAE是pointwise loss,一个典型的特征就是pointwise loss常常会脱离数据流形面,因此看起来生成的图片会模糊
    GAN是分布匹配的loss,更能贴近流行面,看起来就会清晰

    总之:似乎VAE生成的图像规则,但较模糊;而GAN生成的图像容易跑偏,但往往更为清晰。

    扩散模型在图像生成领域大火,风头超过GAN?

    https://mp.weixin.qq.com/s?__biz=MzIwNzc2NTk0NQ==&mid=2247527704&idx=2&sn=ee7a36e14ef82be0417a6e34dceab375&scene=21#wechat_redirect

    扩散模型是受非平衡热力学的启发。它们定义一个扩散步骤的马尔可夫链,逐渐向数据添加随机噪声,然后学习逆扩散过程,从噪声中构建所需的数据样本。(听起来像是对样本数据添加噪声后学习然后重复这一过程直到数据变为符合正态分布的噪声,此时模型就学会了如何从噪声构建模型)与VAE或流动模型不同,扩散模型是用固定的程序学习的,而且隐变量具有高维度。

    GAN 能更灵活处理不同任务,应用层面部署比较容易,需要的资源小,不过学术上竞争激烈,有时生成的样本质量比较一般。Diffusion model 相对不太灵活,缺少良好的 latent space 性质,资源消耗极大,但生成效率略高于auto-regressive model, 主要优点质量好,学术上容易出论文。

    • diffusion没有meaningful latent space, 因为reverse process每一步都加很多噪音,以至于同样的latent 会生成完全不同的东西
    • 目前diffusion model很难处理离散数据,这是因为连续模型用的Gaussian noise而离散模型只能用binomial noise, 效果差
    • Diffusion model 模型更大,一方面其使用大模型如 UNet, wavenet, PointNet 的时候训练稳定(而 GAN 和 VAE 都要训练两个网络,比较难平衡,因此有mode collapse 和 posterior collapse),所以可以上大模型
    • diffusion model只有一个网络,且用ELBO 训练,因此比较容易捕捉到数据的major variation,较好训练
    • diffusion model 对于计算资源要求比GAN还高,一般是大公司在玩,同时生成也比GAN慢得多
  • 相关阅读:
    软件开发过程中应当遵守的原则
    企业架构是什么?
    软件工程的精髓
    PHP获取自然周列表,周开始结束日期,月开始结束时间方法类
    JS替换textarea里的回车换行
    PHP连接PGSQL
    PT与PX的区别
    JQuery 翻页小记
    PHP中替换textarea时的回车换行
    HTML5 CanvasOreilly.Canvas.Pocket.Reference (4)
  • 原文地址:https://www.cnblogs.com/Stareven233/p/16393914.html
Copyright © 2020-2023  润新知