首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

GAN性能不稳?这九大技术可“镇住”四类缺陷

  • 24-03-05 03:21
  • 3181
  • 7505
blog.csdn.net

640?wx_fmt=jpeg


作者 | Bharath Raj

译者 | ang010ela

编辑 | 一一

出品 | AI科技大本营


尽管 GAN 领域的进步令人印象深刻,但其在应用过程中仍然存在一些困难。本文梳理了 GAN 在应用过程中存在的一些难题,并提出了最新的解决方法。


使用 GAN 的缺陷


众所周知,GAN 是由 Generator 生成网络和 Discriminator 判别网络组成的。


1. Mode collapse(模型奔溃)


注:Mode collapse 是指 GAN 生成的样本单一,其认为满足某一分布的结果为 true,其他为 False,导致以上结果。


自然数据分布是非常复杂,且是多峰值的(multimodal)。也就是说数据分布有很多的峰值(peak)或众数(mode)。每个 mode 都表示相似数据样本的聚集,但与其他 mode 是不同的。


在 mode collapse 过程中,生成网络 G 会生成属于有限集 mode 的样本。当 G 认为可以在单个 mode 上欺骗判别网络 D 时,G 就会生成该 mode 外的样本。     


640?wx_fmt=png

上图表示 GAN 的输出没有 mode collapse. 下图则出现了 mode collapse。


判别网络最后会判别来自该 mode 的样本是假的。最后,生成网络 G 会简单地锁定到另一个 mode。该循环会无限进行,就会限制生成样本的多样性。


2. Convergence(收敛)


GAN 训练过程中遇到的一个问题是什么时候停止训练?因为判别网络 D 损失降级会改善生成网络 G 的损失(反之亦然),因此无法根据损失函数的值来判断收敛,如下图所示:


640?wx_fmt=png

典型的GAN损失函数图。注意该如何从这个图中解释收敛性。


3. Quality(质量)


与前面提到的收敛问题一样,很难量化地判断生成网络 G 什么时候会生成高质量的样本。另外,在损失函数中加入感知正则化则在一定程度上可缓解该问题。


4. Metrics(度量)


GAN 的目标函数解释了生成网络 G 或 判别网络 D 如何根据组件来执行,但它却不表示输出的质量和多样性。因此,需要许多不同的度量指标来进行衡量。


改善性能的技术


下面总结了一些可以使 GAN 更加稳定使用的技术。


1. Alternative Loss Functions (替代损失函数)


修复 GAN 缺陷的最流行的补丁是  Wasserstein GAN (https://arxiv.org/pdf/1701.07875.pdf)。该 GAN 用 Earth Mover distance ( Wasserstein-1 distance 或 EM distance) 来替换传统 GAN 的 Jensen Shannon divergence ( J-S 散度) 。EM 距离的原始形式很难理解,因此使用了双重形式。这需要判别网络是 1-Lipschitz,通过修改判别网络的权重来维护。


使用 Earth Mover distance 的优势在于即使真实的生成数据分布是不相交的,它也是连续的。同时,在生成的图像质量和损失值之间存在一定关系。使用 Earth Mover distance 的劣势在于对于每个生成模型 G  都要执行许多判别网络 D 的更新。而且,研究人员认为权重修改是确保 1-Lipschitz 限制的极端方式。


640?wx_fmt=png

左图中 earth mover distance 是连续的, 即便其分布并不连续, 这不同于优图中的 the Jensen Shannon divergence。


另一个解决方案是使用均方损失( mean squared loss )替代对数损失( log loss )。LSGAN (https://arxiv.org/abs/1611.04076)的作者认为传统 GAN 损失函数并不会使收集的数据分布接近于真实数据分布。


原来 GAN  损失函数中的对数损失并不影响生成数据与决策边界(decision boundary)的距离。另一方面,LSGAN 也会对距离决策边界较远的样本进行惩罚,使生成的数据分布与真实数据分布更加靠近,这是通过将均方损失替换为对数损失来完成的。


2. Two Timescale Update Rule (TTUR)


在 TTUR 方法中,研究人员对判别网络 D 和生成网络 G 使用不同的学习速度。低速更新规则用于生成网络 G ,判别网络 D使用 高速更新规则。使用 TTUR 方法,研究人员可以让生成网络 G 和判别网络 D 以 1:1 的速度更新。 SAGAN (https://arxiv.org/abs/1805.08318) 就使用了 TTUR 方法。


3. Gradient Penalty (梯度惩罚)


论文Improved Training of WGANs(https://arxiv.org/abs/1704.00028)中,作者称权重修改会导致优化问题。权重修改会迫使神经网络学习学习更简单的相似(simpler approximations)达到最优数据分布,导致结果质量不高。同时如果 WGAN 超参数设置不合理,权重修改可能会出现梯度消失或梯度爆炸的问题,论文作者在损失函数中加入了一个简单的梯度惩罚机制以缓解该问题。


640?wx_fmt=png

加入 Gradient Penalty 作为正则化器


DRAGAN (https://arxiv.org/abs/1705.07215)的作者称,当 GAN 的博弈达到一个局部平衡态(local equilibrium state),就会出现 mode collapse 的问题。而且判别网络 D 在这种状态下产生的梯度是非常陡(sharp)的。一般来说,使用梯度惩罚机制可以帮助避免这种状态的产生,极大增强 GAN 的稳定性,尽可能减少 mode collapse 问题的产生。


4. Spectral Normalization(谱归一化)


Spectral normalization 是用在判别网络 D 来增强训练过程的权重正态化技术 (weight normalization technique),可以确保判别网络 D 是 K-Lipschitz 连续的。 SAGAN (https://arxiv.org/abs/1805.08318)这样的实现也在判别网络 D 上使用了谱正则化。而且该方法在计算上要比梯度惩罚方法更加高效。


5. Unrolling and Packing (展开和打包)


文章 Mode collapse in GANs(http://aiden.nibali.org/blog/2017-01-18-mode-collapse-gans/)中提到一种预防 mode hopping 的方法就是在更新参数时进行预期对抗(anticipate counterplay)。展开的 GAN ( Unrolled GANs )可以使用生成网络 G 欺骗判别网络 D,然后判别网络 D 就有机会进行响应。


另一种预防 mode collapse 的方式就是把多个属于同一类的样本进行打包,然后传递给判别网络 D 。PacGAN (https://arxiv.org/abs/1712.04086)就融入了该方法,并证明可以减少 mode collapse 的发生。


6. 多个 GAN


一个 GAN 可能不足以有效地处理任务,因此研究人员提出使用多个连续的 GAN ,每个 GAN 解决任务中的一些简单问题。比如,FashionGAN(https://www.cs.toronto.edu/~urtasun/publications/zhu_etal_iccv17.pdf)就使用 2 个 GAN 来执行图像定位翻译。

640?wx_fmt=png

FashionGAN 使用两个 GANs 进行图像定位翻译。


因此,可以让 GAN 慢慢地解决更难的问题。比如 Progressive GANs (ProGANs,https://arxiv.org/abs/1710.10196) 就可以生成分辨率极高的高质量图像。


7. Relativistic GANs(相对生成对抗网络)


传统的 GAN 会测量生成数据为真的可能性。Relativistic GANs 则会测量生成数据“逼真”的可能性。研究人员可以使用相对距离测量方法(appropriate distance measure)来测量相对真实性(relative realism),相关论文链接:https://arxiv.org/abs/1807.00734。

640?wx_fmt=png

图 A 表示 JS 散度的最优解,图 B 表示使用标准 GAN 损失时判别网络 D 的输出,图 C 表示输出曲线的实际图。


在论文中,作者提到判别网络 D 达到最优状态时,D 的输出应该聚集到 0.5。但传统的 GAN 训练算法会让判别网络 D 对图像输出“真实”(real,1)的可能性,这会限制判别网络 D 达到最优性能。不过这种方法可以很好地解决这个问题,并得到不错的结果。

640?wx_fmt=png

经过 5000 次迭代后,标准 GAN (左)和相对 GAN (右)的输出。


8. Self Attention Mechanism(自注意力机制)


Self Attention GANs(https://arxiv.org/abs/1805.08318)作者称用于生成图像的卷积会关注本地传播的信息。也就是说,由于限制性接收域这会错过广泛传播关系。


640?wx_fmt=png

将 attention map (在黄色框中计算)添加到标准卷积操作中。


Self-Attention Generative Adversarial Network 允许图像生成任务中使用注意力驱动的、长距依赖的模型。自注意力机制是对正常卷积操作的补充,全局信息(长距依赖)会用于生成更高质量的图像,而用来忽略注意力机制的神经网络会考虑注意力机制和正常的卷积。(相关论文链接:https://arxiv.org/pdf/1805.08318.pdf)。


640?wx_fmt=png

使用红点标记的可视化 attention map。


9. 其他技术


其他可以用来改善 GAN 训练过程的技术包括:

  • 特征匹配

  • Mini Batch Discrimination(小批量判别)

  • 历史平均值

  • One-sided Label Smoothing(单侧标签平滑)

  • Virtual Batch Normalization(虚拟批量正态化)


更多相关技术见:

https://github.com/soumith/ganhacks。


原文链接:

https://medium.com/beyondminds/advances-in-generative-adversarial-networks-7bad57028032


(本文为 AI科技大本营编译文章,转载请微信联系 1092722531)

精彩推荐

640?wx_fmt=jpeg

640?wx_fmt=jpeg

推荐阅读:

  • 31页PPT概述:图神经网络表达能力有多强?

  • NLP输出文本评估:使用BLEU需要承担哪些风险?

  • 如何用Python抠图?试试scikit-image

  • 《流浪地球》逆袭《新喜剧之王》的真正原因

  • 那些简历造假拿 Offer 的程序员,后来都怎么样了?

  • 郑州没有互联网 | 畅言

  • K8S安全军规101:对CNCF最佳实践的扩充

  • 为什么说稳定币才是诺奖得主哈耶克想要的非国家货币?

  • 月入5万,程序员夫人们过上"贵妇"生活了吗?

                         640?wx_fmt=png

点击“阅读原文”,查看历史精彩文章。

在使用Flex布局时,开发者经常遇到子元素无法正确实现"超出滚动"(overflow scrolling)的问题。本文档总结了常见原因和解决方案,帮助您在Flex布局中正确实现溢出滚动效果。

常见原因

1. 缺少明确的高度或宽度定义

Flex子元素在没有明确尺寸约束时会尝试适应内容大小。如果没有设置height/width或min-height/min-width,就无法确定何时应该"超出"。

css
代码解读
复制代码
/* 问题 */ .container { display: flex; flex-direction: column; /* 没有设置高度 */ } .content { overflow: auto; /* 这个属性无效,因为容器会扩展以适应内容 */ }

2. Flex布局自动伸缩特性

Flex布局默认会尝试调整子元素大小以适应容器。如果未设置flex-shrink: 0或类似属性,元素会优先缩小而不是产生滚动。

css
代码解读
复制代码
/* 问题 */ .container { display: flex; height: 300px; } .sidebar { /* 没有防止收缩的属性 */ overflow: auto; /* 可能不会触发滚动,而是优先缩小 */ }

3. 嵌套Flex容器的传播问题

在嵌套的Flex布局中,内部容器可能会继承外部容器的弹性行为,导致内部容器无法确定其自身的固定大小,从而无法正确处理溢出。

css
代码解读
复制代码
/* 问题 */ .outer { display: flex; flex-direction: column; height: 500px; } .inner { display: flex; flex-direction: column; flex: 1; /* 内部元素可能会继承伸缩行为 */ } .content { overflow: auto; /* 可能无法正确工作 */ }

4. overflow属性丢失或位置错误

在某些情况下,overflow: auto或overflow: scroll需要应用在特定的层级,如果应用在错误的元素上,滚动效果会失效。

css
代码解读
复制代码
/* 问题 */ .container { display: flex; flex-direction: column; height: 300px; /* overflow应该在这里设置 */ } .wrong-level { overflow: auto; /* 在错误的层级设置overflow */ }

解决方案

1. 设置明确的尺寸约束

始终为Flex容器设置明确的高度或宽度,确保浏览器知道何时内容超出。

css
代码解读
复制代码
/* 解决方案 */ .container { display: flex; flex-direction: column; height: 500px; /* 明确的高度 */ } .content { overflow: auto; /* 现在可以正确工作 */ }

2. 使用min-height: 0或min-width: 0

这是解决很多Flex溢出问题的关键属性,它允许Flex子项在需要时可以小于其内容大小。

css
代码解读
复制代码
/* 解决方案 */ .container { display: flex; flex-direction: column; height: 500px; } .content { flex: 1; min-height: 0; /* 关键属性! */ overflow: auto; /* 现在可以正确工作 */ }

3. 正确设置flex-shrink值

对于不希望收缩的内容,设置flex-shrink: 0;对于可滚动区域,确保允许收缩。

css
代码解读
复制代码
/* 解决方案 */ .container { display: flex; height: 300px; } .sidebar { width: 200px; flex-shrink: 0; /* 防止收缩 */ overflow: auto; /* 内容超出时显示滚动条 */ } .main { flex: 1; min-width: 0; /* 允许小于内容宽度 */ overflow: auto; }

4. 在嵌套Flex布局中正确处理层级

在嵌套的Flex布局中,每一级容器都需要有明确的尺寸约束,并在正确的层级设置overflow属性。

css
代码解读
复制代码
/* 解决方案 */ .outer { display: flex; flex-direction: column; height: 500px; } .inner { display: flex; flex-direction: column; flex: 1; min-height: 0; /* 关键属性 */ overflow: hidden; /* 控制这一级的溢出 */ } .content { flex: 1; min-height: 0; /* 再次设置,确保可以滚动 */ overflow: auto; /* 内容溢出时滚动 */ }

实际应用示例

在AntD Table中的应用

当使用Ant Design Table组件在Flex布局中实现滚动时:

jsx
代码解读
复制代码
// React组件 const FlexTableExample = () => { return ( <div className="flex-container"> <h2 className="header">表格标题h2> <div className="table-container"> <Table columns={columns} dataSource={data} scroll={{ x: 'max-content', y: '100%' }} /> div> div> ); }; // 对应的CSS .flex-container { display: flex; flex-direction: column; height: 100vh; overflow: hidden; } .header { flex-shrink: 0; /* 防止标题被压缩 */ } .table-container { flex: 1; min-height: 0; /* 关键属性! */ overflow: hidden; } /* 确保表格内部滚动正常工作 */ .table-container .ant-table-body { overflow: auto !important; }

常见问题排查清单

当面对Flex布局中的溢出滚动问题时,可以按照以下步骤进行排查:

  1. ✅ 检查容器是否有明确的高度或宽度
  2. ✅ 添加min-height: 0或min-width: 0到可滚动的Flex子项
  3. ✅ 检查flex-shrink值是否正确设置
  4. ✅ 在嵌套Flex布局中确保每一级容器都有正确的尺寸约束
  5. ✅ 验证overflow属性是否设置在正确的层级
  6. ✅ 考虑使用开发者工具检查实际渲染的元素尺寸

最佳实践

  1. 总是为Flex容器设置明确的尺寸
  2. 在可滚动的Flex子项上使用min-height: 0和min-width: 0
  3. 了解Flex布局的伸缩机制,合理设置flex-grow、flex-shrink和flex-basis
  4. 在复杂布局中绘制容器层级图,明确每个容器的职责
  5. 使用浏览器开发者工具调试Flex布局问题,观察实际渲染尺寸

通过理解和应用这些原则,您可以有效解决Flex布局中的溢出滚动问题,创建出既灵活又能正确处理内容溢出的用户界面。

注:本文转载自blog.csdn.net的AI科技大本营的文章"https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/87871048"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top