GAN的入门理解

这一篇主要是关于生成对抗网络的模型笔记,有一些简单的证明和原理,是根据李宏毅老师的课程整理的,下面有链接。本篇文章主要就是梳理基础的概念和训练过程,如果有什么问题的话也可以指出的。

李宏毅老师的课程链接

1.概述

GAN是Generative Adversarial Networks的缩写,也就是生成对抗网络,最核心在于训练两个网络分别是generator和discriminator,generator主要是输入一个向量,输出要生成的目标,discriminator接受一个输出的目标,然后输出为真的概率(来说就是打分)。

假设任务是生成一组图片,现在输入是一组图片数据集,一开始随便生成乱七八糟的数据,训练共有两个核心的步骤:

  1. 更新discriminator,将真实数据标记为1,生成的数据标记为0,然后进行训练,那么discrimator就可以辨别生成图片。
  2. 更新generator,更新生成网络的参数,让生成网络生成的图片能让discriminator输出尽可能大(打分尽可能高,也就是骗过discriminator)。
  3. 回到1,重复这个过程。

下面是最原始的论文提出的伪代码:

在这里插入图片描述

可以看到第一个阶段是在更新discriminator,D(x)表示对输入图像x的判别,损失函数是两项累加,前面的 x i x^i xi表示真实输入,这些应该输出1,后面的 x ~ i \widetilde{x}^i x i表示生成数据,这些应该给低分(接近0),两项的目标都是越大越好,所以 V ~ \widetilde{V} V 越大越好,因此 θ d \theta_d θd是梯度上升优化。

第二阶段在更新generator, G ( z i ) G(z^i) G(zi)就是对一个向量生成一个目标,然后进行打分,也是越大越好,因此梯度上升优化,这一部分的目标就是让生成的图片尽量得高分。

循环多次迭代就可以得到预期网络。

当然目前我还有一些疑问:

  1. generator输出的图片是如何保证风格和数据集类似的?

    应该是必须要像原风格一样的才能得到高分。

  2. 输入的向量是随机的,如何可控输入向量和输出特征的关系?如何解释每个输入的数字?(比如我想生成蓝色的头发,那么这个是可控的吗)
    这个可能要看了一些具体的代码才能理解。

2.原理简单分析

生成一个图片或者一个语音本质是映射到一个高维点的问题,比如32×32的黑白图片就是 2 32 × 32 2^{32\times 32} 232×32空间中的一个点。下面都以图片生成任务为例,假设真实分布是 P d a t a P_{data} Pdata,生成的分布是 P G P_{G} PG,只有生成的点(图片)到了真实的分布中,才有极大可能是看上去真实的,因此目标就是让生成的分布 P G P_G PG尽可能接近真实的分布 P d a t a P_{data} Pdata,方法就是KL散度或者JS散度,因此一个理想的生成器应该是这样的:
G ∗ = a r g min ⁡ G D i v ( P G , P d a t a ) G^*=arg\min_G Div(P_G,P_{data}) G=argGminDiv(PG,Pdata)其中Div衡量两个分布的差异,而 G ∗ G^* G就是所有生成器 G G G中有着最小差异的那个,也就是最优的。

然而,实际情况中,真实的分布和实际的分布都是未知的,一些传统的算法可能假设高斯分布,但是很多时候可能不正确。

虽然不能直接得到分布,但是可以进行采样(Sample),在GAN中,discriminator就扮演了计算两个分布差异的角色,给出下式:
V ( G , D ) = E x ∼ P d a t a l o g ( D ( x ) ) + E x ∼ P G l o g ( 1 − D ( x ) ) V(G,D)=E_{x\sim P_{data}}log(D(x))+E_{x\sim P_{G}}log(1-D(x)) V(G,D)=ExPdatalog(D(x))+ExPGlog(1D(x))其中 D ( x ) D(x) D(x)表示一个discriminator对一个generator生成的结果进行打分,介于 [ 0 , 1 ] [0,1] [0,1],下面证明这个式子本质上也是JS散度或者KL散度:


证明
max ⁡ E x ∼ P d a t a l o g ( D ( x ) ) + E x ∼ P G l o g ( 1 − D ( x ) ) = max ⁡ ∫ x p d a t a ( x ) l o g ( D ( x ) ) + ∫ x p G ( x ) l o g ( 1 − D ( x ) ) = max ⁡ ∫ x p d a t a ( x ) l o g ( D ( x ) ) + p G ( x ) l o g ( 1 − D ( x ) ) \max E_{x\sim P_{data}}log(D(x))+E_{x\sim P_{G}}log(1-D(x))\\ =\max \int_xp_{data}(x)log(D(x))+\int_xp_{G}(x)log(1-D(x))\\ =\max \int_xp_{data}(x)log(D(x))+p_{G}(x)log(1-D(x)) maxExPdatalog(D(x))+ExPGlog(1D(x))=maxxpdata(x)log(D(x))+xpG(x)log(1D(x))=maxxpdata(x)log(D(x))+pG(x)log(1D(x))
这里假设D(x)可以拟合任何函数,那么对于任意一个x取值 x ∗ x^* x D ( x ∗ ) D(x^*) D(x)都可以对应任何数值,这就意味着可以对每个x都计算最大值,然后求和得到最大值。

a = p d a t a ( x ) , b = p G ( x ) , D ( x ) = t a=p_{data}(x),b=p_G(x),D(x)=t a=pdata(x),b=pG(x),D(x)=t,那么可以得到下式:
f ( t ) = a l o g ( t ) + b l o g ( 1 − t ) f(t)=alog(t)+blog(1-t) f(t)=alog(t)+blog(1t)求导计算最小值对应的t:(直接假设e为底了)
f ′ ( t ) = a x − b 1 − x f'(t)=\frac{a}{x}-\frac{b}{1-x} f(t)=xa1xb
f ′ ( t ) = 0 f'(t)=0 f(t)=0,得到 t = a a + b t=\frac{a}{a+b} t=a+ba,代入 a , b , t a,b,t a,b,t,假设这个值为最优值 D ∗ ( x ) D^*(x) D(x)
D ∗ ( x ) = p d a t a ( x ) p d a t a ( x ) + p G ( x ) D^*(x)=\frac{p_{data}(x)}{p_{data}(x)+p_G(x)} D(x)=pdata(x)+pG(x)pdata(x)此时每个x都有对应的 D ∗ ( x ) D^*(x) D(x),代入得到:
max ⁡ ∫ x p d a t a ( x ) l o g ( D ( x ) ) + p G ( x ) l o g ( 1 − D ( x ) ) = ∫ x p d a t a ( x ) l o g ( D ∗ ( x ) ) + p G ( x ) l o g ( 1 − D ∗ ( x ) ) = ∫ x p d a t a ( x ) l o g ( p d a t a ( x ) p d a t a ( x ) + p G ( x ) ) + p G ( x ) l o g ( p G ( x ) p d a t a ( x ) + p G ( x ) ) = − 2 l o g 2 + ∫ x p d a t a ( x ) l o g ( p d a t a ( x ) ( p d a t a ( x ) + p G ( x ) ) / 2 ) + p G ( x ) l o g ( p G ( x ) ( p d a t a ( x ) + p G ( x ) ) / 2 ) = − 2 l o g 2 + K L ( P d a t a ∣ ∣ P d a t a + P G 2 ) + K L ( P G ∣ ∣ P d a t a + P G 2 ) = − 2 l o g 2 + J S D ( P d a t a ∣ ∣ P G ) \max\int_xp_{data}(x)log(D(x))+p_{G}(x)log(1-D(x))\\ =\int_xp_{data}(x)log(D^*(x))+p_{G}(x)log(1-D^*(x))\\ =\int_xp_{data}(x)log(\frac{p_{data}(x)}{p_{data}(x)+p_G(x)})+p_{G}(x)log(\frac{p_{G}(x)}{p_{data}(x)+p_G(x)})\\ =-2log2+\int_xp_{data}(x)log(\frac{p_{data}(x)}{(p_{data}(x)+p_G(x))/2})+p_{G}(x)log(\frac{p_{G}(x)}{(p_{data}(x)+p_G(x))/2})\\ =-2log2+KL(P_{data}||\frac{P_{data}+P_G}{2})+KL(P_{G}||\frac{P_{data}+P_G}{2})\\ =-2log2+JSD(P_{data}||P_G) maxxpdata(x)log(D(x))+pG(x)log(1D(x))=xpdata(x)log(D(x))+pG(x)log(1D(x))=xpdata(x)log(pdata(x)+pG(x)pdata(x))+pG(x)log(pdata(x)+pG(x)pG(x))=2log2+xpdata(x)log((pdata(x)+pG(x))/2pdata(x))+pG(x)log((pdata(x)+pG(x))/2pG(x))=2log2+KL(Pdata∣∣2Pdata+PG)+KL(PG∣∣2Pdata+PG)=2log2+JSD(Pdata∣∣PG)
后面的几步其实不是很理解,不过到第三步,跟交叉熵形式很像,所以都是类似的衡量两个分布的差异。


训练一个discriminator,实际上就是为了更好区分真实和生成的样本,那么自然要让这个差异越大越好,此时这个discriminator可以最大程度区分生成和真实。 D ∗ D^* D给的打分实际上可以看做生成分布和实际分布的差异
D ∗ = a r g max ⁡ D V ( G , D ) D^*=arg\max_D V(G,D) D=argDmaxV(G,D)而训练generator的过程就是为了让discriminator不容易区分真实和生成样本,因此要减少这个差异:
D ∗ = a r g min ⁡ G V ( G , D ∗ ) = a r g min ⁡ G max ⁡ D V ( G , D ) D^*=arg\min_G V(G,D^*) =arg\min_G \max_D V(G,D) D=argGminV(G,D)=argGminDmaxV(G,D)
也就是现在有一个最优的discriminator D ∗ D^* D,要优化generator使得 D ∗ D^* D打分尽量高,也就是:
θ g = θ g − η ∂ V ( G , D ∗ ) θ g \theta_g=\theta_g-\eta \frac{\partial V(G,D^*)}{\theta_g} θg=θgηθgV(G,D)这里实际上是对 θ G \theta_G θG也就是生成网络的参数求导,实际的网络架构是: v e c t o r → θ G → o u t → θ D → s c o r e vector\rightarrow \theta_G \rightarrow out \rightarrow \theta_D \rightarrow score vectorθGoutθDscore,这里更新的时候,不更新 θ D \theta_D θD,这也就是固定discriminator的思想。

注意点:每次更新的时候,对discriminator的更新要彻底,对generator的更新次数不能多,如下图:

比如现在训练了一个discriminator是 D 0 ∗ D^*_0 D0,现在要让G变得更强,也就是让 D 0 ∗ D^*_0 D0对G生成的图辨别能力降低,直观体现就是 V ( G , D ) V(G,D) V(G,D)变小,但是因为更新参数对生成分布的影响是全局的,那么就可能导致生成图片和实际分布差异变得更大,因为变小的只有 D 0 ∗ D^*_0 D0的得分,可能这时候 D 0 ∗ D^*_0 D0已经不是最好的discriminator,而更好的discriminator可以将生成的和实际的分的更开,就像图二的最大值必原来的还大,那么对应于更高的 D ∗ D^* D计算得到的差异比原来还大。(有点绕这里)

所以有一个简单的假设,就是generator更新后的图形基本和原来保持一致,那么此时优化最大值让最大值变小,那么就相当于生成分布和实际分布差异更小,要达到这样的目的,那么不能更新generator太多;而对于discriminator,因为要找到最大值,应该要更新彻底。

3.实际操作

上面都是理论上的分析,下面讲一讲在实际的操作中是怎么做的。

3.1.训练discriminator

一个discriminator其实就是一个二分分类器,输入一个生成的数据,给出为真的概率,所以训练的过程也是和训练分类器是一样的,上面提到了 V ( G , D ) V(G,D) V(G,D)优化目标,里面有期望,期望一般会被转化为求多个样本的均值来获得。对于一个确定的生成器G,假设抽样取得m个真实样本X,生成了m个生成样本X’,那么期望可以转化为:
V ( D ) = E x ∼ P d a t a l o g ( D ( x ) ) + E x ∼ P G l o g ( 1 − D ( x ) ) = > V ~ = 1 m ∑ i = 1 m l o g ( D ( x i ) ) + 1 m ∑ i = 1 m l o g ( 1 − D ( x i ′ ) ) V(D)=E_{x\sim P_{data}}log(D(x))+E_{x\sim P_{G}}log(1-D(x))\\ =>\widetilde{V}=\frac{1}{m}\sum_{i=1}^{m}log(D(x_i))+\frac{1}{m}\sum_{i=1}^{m}log(1-D(x'_i)) V(D)=ExPdatalog(D(x))+ExPGlog(1D(x))=>V =m1i=1mlog(D(xi))+m1i=1mlog(1D(xi))
一般会采用梯度上升法:(因为要求最大值)
θ d = θ d + η ▽ θ d V ~ ( θ d ) \theta_d=\theta_d+\eta ▽_{\theta_d}\widetilde{V}(\theta_d) θd=θd+ηθdV (θd)

3.2.训练generator

训练generator实际上是为了减少 V ( G , D ∗ ) V(G,D^*) V(G,D),也就是让目前最好的分类器分不清,还是抽样,生成n个样本X’,那么目标如下:
V ( D ) = 1 m ∑ i = 1 m l o g ( 1 − D ( G ( x i ′ ) ) ) V(D)=\frac{1}{m}\sum_{i=1}^{m}log(1-D(G(x'_i))) V(D)=m1i=1mlog(1D(G(xi)))此时在变的是gegenerator的参数 θ g \theta_g θg,要通过改变生成参数让最好的discriminator得分降低,一般是梯度下降:
θ g = θ g − η ▽ θ g V ~ ( θ g ) \theta_g=\theta_g-\eta ▽_{\theta_g}\widetilde{V}(\theta_g) θg=θgηθgV (θg)要注意,不能训练次数太多(一般一次就可以)。

具体的代码实现我还没有去看过,就不进一步展开了,这一篇主要还是记录一些简单的原理。

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

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

相关文章

Android14音频进阶之CarAudioManager::getOutputDeviceForUsage流程分析(七十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

项目启动|鑫泓佳电子牵手盘古信息,迈向数字化转型新征程

随着科技的迅猛发展和数智化浪潮的推进,电子行业正经历着一场前所未有的深刻变革。在这场变革中,深圳市鑫泓佳电子有限公司(以下简称“鑫泓佳电子”)凭借其敏锐的市场洞察力和前瞻性的战略规划,一直保持在行业的前列。…

46-4 等级保护 - 网络安全等级保护概述

一、网络安全等级保护概述 原文:没有网络安全就没有国家安全 二、网络安全法 - 安全立法 中华人民共和国主席令 第五十三号 《中华人民共和国网络安全法》已于2016年11月7日由中华人民共和国第十二届全国人民代表大会常务委员会第二十四次会议通过,并自2017年6月1日起正式…

MES系统助力制造业数字化转型

一、MES系统的定义和功能 MES(Manufacturing Execution System)即制造执行系统,是一种可层级化管理生产活动的软件系统。它可以实现对生产过程全面的监控、调度、控制和优化,提高生产的效率、质量和安全性。MES系统具有以下几个主…

图像生成新篇章:Stable Diffusion 3 Medium开源评析

摘要 在数字艺术与人工智能的交汇点上,Stable Diffusion 3(SD3)的开源无疑是一场技术革新的盛宴。就在3月份,我撰写了一篇博文,深入探讨了SD3的技术报告内容与介绍,文章发表在CSDN博客上,https:…

汽车EDI:BRP EDI项目案例

项目背景 BRP Inc.使用EDI(电子数据交换)来处理其与供应商、客户和合作伙伴之间的业务交流。通过EDI,BRP可以在各种业务流程中自动化数据交换,例如采购订单、发货通知、发票、付款和库存信息等,从而提高操作效率、降低…

【RAG】RAG性能提升之路-RAPTOR:一种构建递归文档树的增强检索方法

背景 检索增强型语言模型(RALMs)在处理需要不断更新的知识和大量信息的文档时确实展现出了优势。然而,现有的方法在处理长篇文档时存在局限性,主要是因为它们通常只能检索较短的文本片段,这限制了对整体文档上下文的全…

云原生应用开发培训,开启云计算时代的新征程

在云计算时代,云原生应用开发技术已经成为IT领域的热门话题。如果您想要转型至云原生领域,我们的云原生应用开发培训将帮助您开启新征程。 我们的课程内容涵盖了云原生技术的基础概念、容器技术、微服务架构、持续集成与持续发布(CI/CD&#…

22 CRT工具安装流程

22 CRT工具安装流程 SecureCRT 9.5 说明书 SecureCRT 9.5是一款由VanDyke Software开发的终端仿真程序。它为Windows、Mac和Linux操作系统提供了强大的SSH(Secure Shell)客户端功能。SecureCRT 9.5提供了对Telnet、RLogin、Serial和X.509等协议的支持&…

域内攻击 ----> DCSync

其实严格意义上来说DCSync这个技术,并不是一种横向得技术,而是更偏向于权限维持吧! 但是其实也是可以用来横向(配合NTLM Realy),如果不牵强说得话! 那么下面,我们就来看看这个DCSyn…

SAP Web IDE 安装使用

For training SAP Web IDE 是基于 Eclipse 内核的在线开发 IDE,可以使用在线的试用版本,但服务器在德国,访问的网速特别慢。也可以使用 Personal Edition,在本机启动和编写代码。 打开官网下载WEBIDE工具包,包含 Tri…

CP AUTOSAR标准中文文档链接索引(更新中)

AUTOSAR标准的核心组件包括通信、诊断、安全等,这些组件通过模块化结构进行组织。系统被划分为多个模块,每个模块负责特定的功能。模块之间通过接口进行通信,接口定义了模块之间的交互规则。AUTOSAR标准支持模块的配置,可以根据不…

html实现粘贴excel数据,在页面表格中复制

录入数据时&#xff0c;有时候需要把excel中的数据一条条粘贴到页面中&#xff0c;当数据量过多时&#xff0c;这种操作很令人崩溃。本篇文章实现了从excel复制好多行数据后,可在页面粘贴的功能 具体实现代码 <!DOCTYPE html> <html lang"en"> <head…

KEIL5.39 5.40 fromelf 不能生成HEX bug

使用AC6 编译,只要勾选了生成HEX。 结果报如下错误 暂时没有好的解决办法 1.替换法 2.在编译完后用命令生成HEX

怎么提高音频的播放速度?提高音频播放速度的四种方法

怎么提高音频的播放速度&#xff1f;提高音频的播放速度是在处理音频文件时经常需要面对的问题。音频播放速度的调整可以带来多种应用场景和效果&#xff0c;例如加快语音记录的回放速度以节省时间、提高听力理解和语速训练的效果等。然而&#xff0c;对于不同的音频播放工具和…

wms海外仓系统什么价格?中小海外仓怎么选到高性价比wms系统

随着海外仓业务复杂度的逐渐提升&#xff0c;现在中小海外仓对wms海外仓系统的需求也越来越强烈。但是对于预算有限的中小海外仓企业来说&#xff0c;怎么才能选到性价比比较高的wms海外仓系统呢&#xff1f; 今天我们就来聊一下这个问题&#xff0c;希望对有类似需求的海外仓…

ZnO电阻片在低电场区域的泄漏电流及其电阻的负温度系数

在低电场区域,流过ZnO非线性电阻的泄漏电流小于1mA.泄漏电流不仅与施加的电压幅值有关,而且与温度高低有关。图2.6表示温度对泄漏电流的影响,温度越高,电子在电场作用下定向的运动就越激烈,导致泄漏电流增大。因此温度升高将导致电阳值下降,即ZnO 电阻呈现负温度特性。 一般以…

二开版视频CMS完整运营源码/新版漂亮APP手机模板/集成员分销功能等

一个二开的影视CMS&#xff0c;直接上传源码至网站根目录&#xff0c;访问网站域名即可安装。 测试环境&#xff1a;Nginx 1.20.1—MySQL 5.6.50–PHP-7.2&#xff08;安装拓展/fileinfo&#xff09; 上传源码&#xff0c;访问域名直接安装 后台地址&#xff1a;域名/MDadmi…

DevExpress WPF中文教程:Grid - 如何完成列和编辑器配置(设计时)?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

2.nginx常用命令

使用nginx命令需要进入nginx目录里面执行。 /usr/local/nginx/sbin/ 查看nginx的版本号 启动nginx ./nginx 关闭nginx ./nginx -s stop 查看nginx的是否运行的命令 重新加载nginx 针对配置目录中配置文件nginx.cnf修改后需要重新加载 /usr/local/nginx/conf/nginx.cnf …