【机器学习13】生成对抗网络

1 GANs的基本思想和训练过程

在这里插入图片描述

生成器用于合成“假”样本, 判别器用于判断输入的样本是真实的还是合成的。 生成器从先验分布中采得随机信号,经过神经网络的变换, 得到模拟样本; 判别器既接收来自生成器的模拟样本, 也接收来自实际数据集的真实样本。

GANs采用对抗策略进行模型训练, 一方面, 生成器通过调节自身参数, 使得其生成的样本尽量难以被判别器识别出是真实样本还是模拟样本; 另一方面, 判别器通过调节自身参数, 使得其能尽可能准确地判别出输入样本的来源。

(1) 在训练判别器时, 先固定生成器G(·); 然后利用生成器随机模拟产生样本G(z)作为负样本(z是一个随机向量) , 并从真实数据集中采样获得正样本X; 将这些正负样本输入到判别器D(·)中, 根据判别器的输出(即D(X)或D(G(z))) 和样本标签来计算误差; 最后利用误差反向传播算法来更新判别器D(·)的参数

在这里插入图片描述

(2) 在训练生成器时, 先固定判别器D(·); 然后利用当前生成器G(·)随机模拟产生样本G(z), 并输入到判别器D(·)中; 根据判别器的输出D(G(z))和样本标签来计算误差, 最后利用误差反向传播算法来更新生成器G(·)的参数

在这里插入图片描述

2 GANs的值函数

2.1 均衡点时的解(G*,D*)和值函数

因为判别器D试图识别实际数据为真实样本, 识别生成器生成的数据为模拟样本, 所以这是一个二分类问题, 损失函数写成:

在这里插入图片描述

其中D(x)表示判别器预测x为真实样本的概率, p(data|x)和p(g|x)表示x分属真实数据集和生成器这两类的概率。 样本x的来源一半是实际数据集, 一半是生成器。

在这里插入图片描述

在此基础上得到值函数:
在这里插入图片描述

2.2 在未达到均衡点时, 将生成器G固定, 寻找当下最优的判别器DG*, 请给出DG*和此时的值函数

要了解 Jensen-Shannon 散度(JSD)的定义。给定两个概率分布 P 和 Q,JSD 定义如下:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

此时,

在这里插入图片描述

由此看出, 优化生成器G实际是在最小化生成样本分布与真实样本分布的JS距离。

2.3 固定D而将G优化到底, 解GD*和此时的值函数

在这里插入图片描述

在这里插入图片描述

3 WGAN

3.1 原GANS存在的问题

坍缩模式:拿图片举例, 反复生成一些相近或相同的图片,多样性太差。 生成器似乎将图片记下, 没有泛化, 更没有造新图的能力。
考虑生成器分布与真实数据分布的JS距离, 即两个KL距离的平均:

在这里插入图片描述

第一个KL距离:

在这里插入图片描述

高维空间绝大部分地方见不到真实数据, pr(x)处处为零, 对KL距离的贡献为零;即使在真实数据蜷缩的低维空间, 高维空间会忽略低维空间的体积, 概率上讲测度为零。 KL距离就成了:
在这里插入图片描述

再看第二个KL距离:

在这里插入图片描述

同理也是log2。
因此无论生成器怎么训练,JS距离都是一个常数,对生成器的梯度为0.

3.2 Wasserstein距离(推土机距离)

在这里插入图片描述

不管真实分布藏在哪个低维子空间里, 生成器都能感知它在哪, 因为生成器只要将自身分布稍做变化, 就会改变它到真实分布的推土机距离; 而JS距离是不敏感的, 无论生成器怎么变化, JS距离都是一个常数。 因此, 使用推土机距离, 能有效锁定低维子空间中的真实数据分布。

3.3 WGAN

Wasserstein距离的对偶式:
在这里插入图片描述

这里的f与D不同, 前者要满足|| f ||L≤1, 即1-Lipschitz函数,后者是一个Sigmoid函数作输出层的神经网络。 Sigmoid函数的值有天然的界, 而1-Lipschitz不是限制函数值的界, 而是限制函数导数的界, 使得函数在每点上的变化率不能无限大。 神经网络里如何体现1-Lipschitz或K-Lipschitz呢? WGAN的思路很巧妙, 在一个前向神经网络里, 输入经过多次线性变换和非线性激活函数得到输出, 输出对输入的梯度, 绝大部分都是由线性操作所乘的权重矩阵贡献的, 因此约束每个权重矩阵的大小, 可以约束网络输出对输入的梯度大小。

判别器在这里换了一个名字, 叫评分器(Critic) , 目标函数由“区分样本来源”变成“为样本打分”: 越像真实样本分数越高, 否则越低。

在这里插入图片描述

4 DCGAN

4.1 在生成器和判别器中应该怎样设计深层卷积结构?

4.1.1 生成器

生成器生成图片, 可以看成图片分类的一个逆过程。 图片分类器的输入是一张图片, 输出是一个类别; 图片生成器的输出是一张图片,输入通常有一个随机向量。
用随机向量的每维刻画不同的细节, 然后生成一张图片。 随机向量不含像素级别的位置信息, 但是对于图片, 每个像素都有它的位置, 点构成了线, 线组成了面, 进而描绘出物体的形状。 如果这些位置信息不是从随机向量中产生, 那么就应出自生成器的特殊网络结构。因此, 从随机向量造出图片, 要在造的过程中产生位置信息。 这个生成过程需符合以下两点原则。
(1) 保证信息在逐层计算中逐渐增多。
(2) 不损失位置信息, 并不断产生更细节的位置信息。

具体做法:

(1) 去掉一切会丢掉位置信息的结构, 如池化层。
(2)使用分数步进卷积层。
计算是升采样的过程, 逐步提供更多细节。将100维随机向量经过一层, 变换成一个4×4×1024的张量, 宽度和高度都为4, 虽然大小有限, 但是暗示了位置的存在, 接着经过层层变换, 高度和宽度不断扩大, 深度不断减小, 直至输出一个有宽度、 高度及RGB三通道的64×64×3图片。

在这里插入图片描述

( 3) 去掉最后的全连接层
越靠近图片输出端, 越要精心呵护宽高二维平面上的位置信息,反而在输入端可以增加一个全连接层。

( 4) 批量归一化和ReLU激活函数
生成模型越深, 越需要Batchnorm层, 否则训练不充分, 极易出现模型坍塌问题, 总生成相同的图片样本。 另外, 为了避免梯度饱和,让学习更稳定, 内部使用ReLU激活函数, 只在图片输出层用Tanh激活函数。

4.1.2 判别器

判别器鉴别生成图片和实际图片。 这是一个典型的图片分类任务, 但是又不同于一般的图片分类。 真品和赝品的区别, 往往是细节上的差异, 而不是宏观层面的语义差异。 判别器的多层卷积网络, 依然抛弃池化层, 将它替换为步长大于1的卷积层, 虽然也是一个降采样的过程, 但是没有池化层那样粗放。 判别器的最后一层不接全连接层, 扁平化处理后直接送给Sigmoid输出层, 最大限度地留住位置细节。 另外, 判别器的内部激活函数使用LReLU, 也是要最大限度地留住前层信息。 判别器也用到Batchnorm层。

5ALI

在这里插入图片描述

任何一个观察数据x, 背后都有一个隐空间表示z。从概率的角度看, 编码是一个推断过程, 先从真实数据集采样一个样本x, 再由x推断z,有给定x下z的条件概率q(z|x); 解码是一个生成过程, 先从一个固定分布(如: 高斯分布N(0,I)) 出发, 采样一个随机信号 , 经过简单变换成为z, 再由z经过一系列复杂非线性变换生成x, 有给定z下x的条件概率p(x|z)。 将观察数据和其隐空间表示一起考虑, (x,z), 写出联合概率分布。 从推断的角度看, 联合概率q(x,z)=q(x)q(z|x), 其中q(x)为真实数据集上的经验数据分布, 可认为已知, 条件概率q(z|x)则要通过推断网络来表达; 从生成的角度看, p(x,z)=p(z)p(x|z), 其中p(z)是事先给定的, 如z~N(0,I), 条件概率p(x|z)则通过生成网络来表达。 让这两个联合概率分布q(x,z)和p(x,z)相互拟合。 当二者趋于一致时, 可以确定对应的边缘概率都相等, q(x)=p(x), q(z)=p(z), 对应的条件概率也都相等q(z|x)=p(z|x), q(x|z)=p(x|z)。

还有一个判别网络。 它的目标是区分来自生成网络和来自推断网络 ,

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/195211.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SPASS-曲线估计

基本概念 曲线估计(曲线拟合、曲线回归)则是研究两变量间非线性关系的一种方法,选定一种用方程表达的曲线,使得实际数据与理论数据之间的差异尽可能地小。如果曲线选择得好,那么可以揭示因变量与自变量的内在关系&…

【最新Tomcat】IntelliJ IDEA通用配置Tomcat教程(超详细)

前言 IntelliJ IDEA是一个强大的集成开发环境,能够大大简化Java应用程序的开发和部署过程。而Tomcat作为一个流行的Java Web服务器,其与IntelliJ IDEA的整合能够提供便捷的开发环境,让开发人员更专注于代码的创作与优化。 在配置IntelliJ IDE…

【心得】基于flask的SSTI个人笔记

目录 计算PIN码 例题1 SSTI的引用链 例题2 SSTI利用条件: 渲染字符串可控,也就说模板的内容可控 我们通过模板 语法 {{ xxx }}相当于变相的执行了服务器上的python代码 利用render_template_string函数参数可控,或者部分可控 render_…

日志维护库:loguru

在复杂的项目中,了解程序的运行状态变得至关重要。在这个过程中,日志记录(logging)成为我们追踪、调试和了解代码执行的不可或缺的工具。在python语言中常用logging日志库,但是logging日志库使用相对繁琐,在…

创新案例|云服务平台HashiCorp是如何构建开源社区实现B2B增长飞轮

社区文化是HashiCorp企业文化的重要组成部分。虽然众多公司声称自己是社区驱动,但实际付诸行动的很少。与众不同的是,HashiCorp从一开始就将社区视为战略方针的核心,这也影响和塑造了公司今天的发展方向。社区不仅是执行策略之一,…

Java多线程(3)

Java多线程(3) 深入剖析Java线程的生命周期,探秘JVM的线程状态! 线程的生命周期 Java 线程的生命周期主要包括五个阶段:新建、就绪、运行、阻塞和销毁。 **新建(New):**线程对象通过 new 关键字创建&…

SPASS-聚类和判别分析

聚类与判别分析概述 基本概念 聚类分析 聚类分析的基本思想是找出一些能够度量样本或指标之间相似程度的统计量,以这些统计量为划分类型的依据,把一些相似程度较大的样本(或指标)聚合为一类,把另外一些彼此之间相似程度较大的样本又聚合为一类。根据分类对象的不同,聚类…

Jenkins测完通知到人很麻烦?一个设置配置钉钉消息提醒!

Jenkins 作为最流行的开源持续集成平台,其强大的拓展功能一直备受测试人员及开发人员的青睐。大家都知道我们可以在 Jenkins 中安装 Email 插件支持构建之后通过邮件将结果及时通知到相关人员。但其实 Jenkins 还可以支持钉钉消息通知,其主要通过 DingTa…

高效管理文件:如何通过文件数量归类提高工作效率

在日常生活和工作中,需要处理大量的文件和资料。然而,如果这些文件没有得到妥善的管理,就会使得我们花费大量的时间和精力去寻找和整理它们。对于大量文件,按照数量归类可以使得文件管理更加有序和规范。根据文件的数量建立相应的…

算法设计与分析复习--贪心(二)

文章目录 上一篇哈夫曼编码单源最短路最小生成树Kruskal算法Prim算法 多机调度问题下一篇 上一篇 算法设计与分析复习–贪心&#xff08;一&#xff09; 哈夫曼编码 产生这种前缀码的方式称为哈夫曼树 哈夫曼树相关习题AcWing 148. 合并果子 #include <iostream> #inc…

三层交换机实现不同VLAN间通讯

默认时&#xff0c;同一个VLAN中的主机才能彼此通信&#xff0c;那么交换机上的VLAN用户之间如何通信&#xff1f; 要实现VLAN之间用户的通信&#xff0c;就必须借助路由器或三层交换机来完成。 下面以三层交换机为例子说明&#xff1a; 注意&#xff1a; 1.交换机与三层交换…

CnosDB有主复制演进历程

分布式存储系统的复杂性涉及数据容灾备份、一致性、高并发请求和大容量存储等问题。本文结合CnosDB在分布式环境下的演化历程&#xff0c;分享如何将分布式理论应用于实际生产&#xff0c;以及不同实现方式的优缺点和应用场景。 分布式系统架构模式 分布式存储系统下按照数据复…