【机器学习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)。

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法之路(二)

🖊作者 : D. Star. 📘专栏 : 算法小能手 😆今日分享 : 你知道北极熊的皮肤是什么颜色的吗?(文章结尾有答案哦!) 文章目录 力扣的209题✔解题思路✔代码:✔总结: 力扣的3题✔解题思路&#xff1a…

Linux线程编程

Linux线程编程初步 一些历史背景 Linux间接起源于Unix,而Linux诞生时并不存在 "线程"的概念。在20世纪90年代线程才流行起来,POSIX Thread标准于 1995年确立。Unix中引入 Thread 之后,大量函数被重写,信号机制也变得复…

AI实践与学习1_Milvus向量数据库实践与原理分析

前言 随着NLP预训练模型(大模型)以及多模态研究领域的发展,向量数据库被使用的越来越多。 在XOP亿级题库业务背景下,对于试题召回搜索单单靠着ES集群已经出现性能瓶颈,因此需要预研其他技术方案提高试题搜索召回率。…

AVL树和红黑树

AVL树和红黑树 一、AVL树1. 概念2. 原理AVL树节点的定义插入不违反AVL树性质违反AVL树性质左单旋右单旋左右双旋右左双旋总结 删除 3. 验证代码4. AVL树完整实现代码 二、红黑树1. 概念2. 性质3. 原理红黑树节点的定义默认约定插入情况一 (u存在且为红)情…

MySQL InnoDB 引擎底层解析(一)

6. InnoDB 引擎底层解析 MySQL 对于我们来说还是一个黑盒,我们只负责使用客户端发送请求并等待服务器返回结果,表中的数据到底存到了哪里?以什么格式存放的?MySQL 是以什么方式来访问的这些数据?这些问题我们统统不知…

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

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

约数个数定理

首先在讲这个定理前,首先科普一下前置知识 约数: 何为约数,只要能整除n的整数就是n的约数,举个例子,3的约束是1和3因为1和3能整除3 质数: 除了这个数字本身和1以外没有其他因子的数字就叫质数&#xff…

pythorch的numel()函数计算模型大小与现存占用

本文解释简单给一个模型列子记录如何计算该模型参数量与模型显存占用情况,该文直接调用torchvision库的模型文件构建模型model,在使用parameters()函数遍历,并在遍历情况下使用numel()函数记录模型参数量与显存占用。 代码如下: …

日志维护库:loguru

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

Linux远程工具专家推荐(二)

8. Apache Guacamole Apache Guacamole 是一款免费开源的无客户端远程桌面网关,支持 VNC、RDP 和 SSH 等标准协议。无需插件或客户端软件;只需使用 HTML5 Web 应用程序(例如 Web 浏览器)即可。 这意味着您的计算机的使用不受任何一…

ElasticSearch学习篇6_ES实践与Lucene对比及原理分析技术分享小记

前言 QBM、MFS的试题检索、试题查重、公式转换映射等业务场景以及XOP题库广泛使用搜索中间件,业务场景有着数据量大、对内容搜索性能要求高等特点,其中XOP题库数据量更是接近1亿,对检索性能以及召回率要求高。目前QBM、MFS使用的搜索中间件是…

LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄

接着前两节的Langchain,继续实现Langchain中的Agent LangChain 实现给动物取名字,LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字 代码实现 # 从langchain库中导入模块 from langchain.llms import OpenAI # 从langchain.l…

软件测试: 测试用例

一. 软件测试四要素 测试环境,操作步骤,测试数据,预期结果 二. 基于需求进行测试用例的设计 基于需求设计测试用例是测试设计和开发测试用例的基础,第一步就要分析测试需求,验证需求是否正确,完整,无二义性,并且逻辑自洽.在需求正确的基础上细化测试需求,从测试需求提炼出一…

最全的接口自动化测试思路和实战:【推荐】混合测试自动化框架(关键字+数据驱动)

混合测试自动化框架(关键字数据驱动) 关键字驱动或表驱动的测试框架 这个框架需要开发数据表和关键字。这些数据表和关键字独立于执行它们的测试自动化工具,并可以用来“驱动"待测应用程序和数据的测试脚本代码,关键字驱动测试看上去与手工测…

三天吃透Redis面试八股文

目录: Redis是什么?Redis优缺点?Redis为什么这么快?讲讲Redis的线程模型?Redis应用场景有哪些?Memcached和Redis的区别?为什么要用 Redis 而不用 map/guava 做缓存?Redis 数据类型有哪些&…

DrugMAP: molecular atlas and pharma-information of all drugs学习

DrugMAP:所有药物的分子图谱和制药信息 - PMC (nih.gov) DrugMAP: the molecular atlas and pharma-information of drugs (idrblab.net) 构建了一个描述药物分子图谱和药物信息的新数据库(DrugMAP)。它提供了>30 000种药物/候选药物的相…

前端调取摄像头并实现拍照功能

前言 最近接到的一个需求十分有意思,设计整体实现了前端仿 微信扫一扫 的功能。整理了一下思路,做一个分享。 tips: 如果想要实现完整扫一扫的功能,你需要掌握一些前置知识,这次我们先讲如何实现拍照并且保存的功能。 一. wind…

Mybatis-Plus《学习笔记 22版尚硅谷 》——感谢【尚硅谷】官方文档

Mybatis-Plus《学习笔记 22版尚硅谷 》 一、MyBatis-Plus1.简介2.特性3.支持数据库4.框架结构5.官方地址 二、入门案例1.开发环境2.建库建表3.创建工程4.配置编码5.测试查询 三、增删改查1.BaseMapper<T>2.调用Mapper层实现CRUD2.1 插入2.2 删除a、根据ID删除数据b、根据…

深入理解栈与队列:从基本概念到高级实现

&#x1f493; 博客主页&#xff1a;江池俊的博客⏩ 收录专栏&#xff1a;数据结构探索&#x1f449;专栏推荐&#xff1a;✅cpolar ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f525;编译环境&#xff1a;Visual Studio 2022&#x1f389;欢迎大…

【Dubbo】Dubbo负载均衡实现解析

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…