GAN对抗生成网络(一)——基本原理及数学推导

1 背景

GAN(Generative Adversarial Networks)对抗生成网络是一个很巧妙的模型,它可以用于文字、图像或视频的生成。

例如,以下就是GAN所生成的人脸图像。

2 算法思想

假如你是《古董局中局》的文物造假者(Generator,生成器),希望生产出足以媲美王羲之真迹的假字画。GAN的思想是除了造假者再引入一位鉴宝者(Discriminator,判别器)。造假者的目标是“以假乱真”——精进手艺,从而骗过鉴宝者;鉴宝者的目标是“火眼金睛”——明察秋毫,区别出真字画和假字画。

造假者刚开始不掌握造假知识,只能天马行空地乱写一通,但收到鉴宝者的反馈,调整制作手段,逐步训练出了能够骗过鉴宝者的技艺。

鉴宝者刚开始不掌握鉴宝知识,但造假者的成果源源不断地输送过来,这也成为鉴宝者的学习材料,鉴宝者逐渐提高了鉴定能力。

GAN的全称是Generative Adversarial Networks。从名字也可以了解GAN的特性。

所谓Generative是指GAN是一种生成模型,即产生新的数据,并尽量与真实数据相似。生成模型是与判别模型相对的。

顾名思义,判别模型是为了做判断。训练好的判别模型在给定观测值后,预测标签。如果放到文物造假的例子,判别模型的做法就是找到一批真的文物和一批假的文物,提取出这些文物的特征(比如质地、颜色),学习这些特征如何导致了真或假的结果。这样给定新的文物,就可以根据特征判定文物是真还是假(比如质地为新则为假,质地为旧则为真)。

其实从上文描述可以看出,GAN中的discriminator就是判别模型,但GAN终极目的是为了生成新样本,所以才把GAN归为生成模型,其中的判别模型只是服务于生成模型,属于陪衬。

所谓Adversarial是指GAN是一种对抗模型,要训练出Generator和Discriminator二者相互对抗,你追我赶。

所谓Networks是指GAN是一种神经网络模型,无论是Generator还是Discriminator,他们都需要有足够复杂的表达式,才能实现图片甚至视频的生成,因此需要使用神经网络拟合复杂的运算。

3 数学推导

3.1 符号定义

符号含义文物例子中的对应概念
x样本,例如GAN的目标是生成图片,则此处泛指图像字画
P_{data}(x)真实数据概率分布真字画的技艺
GGenerator,本质是一个神经网络,输入概率分布中的随机噪声,输出为x造假者
G^{*}最优的Generator训练好的造假者
P_{G}(x)Generator对应的概率分布造假者的技艺
z概率分布中的噪音,例如高斯分布抽样出的样本造假者的输入,可理解为当时模具的状态、制作哪幅字画的决定。一般是一个向量,其中每个维度可能对应生成的结果某些特征
Div两个分布之间的距离真实制作工艺和造假制作工艺的区别
DDiscriminator,本质是一个神经网络,输入一个样本x,输出为1或0,代表x是真实的概率鉴宝者
D^{*}最优的Discriminator训练好的鉴宝者
V优化目标,越大越好真品和赝品的相似程度,或者赝品能卖出的价钱
\theta_GGenerator的参数P_{G}概率分布的参数
\theta_{D}Discriminator的参数鉴宝者鉴宝所遵从的规则参数,比如质地有“多旧”才会认为是真品
\eta误差反向传播时神经网络的学习率造假者或鉴宝者更新自己造假技艺和更新技艺时调整的幅度

3.2 解析

以上的例子中造假者的目标是学习出一套接近真实的技艺,但技艺太抽象了,需要用数学的语言表示,这里使用“概率分布”表示技艺。可能不好理解,解释如下。

第一,这里的一张字画可比作训练的样本,那么生产字画的技艺自然就可以比作产生样本的概率分布。

第二,无论是生成图片还是生成字画的过程,本质上就是从概率分布中抽样的过程。

例如我们要生成一个足球图片,每个像素点是否应该为空,应该呈现什么颜色,都是有概率的。我们应该学习到这么一种概率分布:在一个画布上,产生圆形的概率最高,这一点毋庸置疑;产生椭圆形的概率次高,可能有时存在镜头畸变现象,或者画面想表现出足球快速向前运动(参考下图中的热血足球);产生正方形的概率几乎为0。此外,颜色也是用概率分布产生的,黑色和白色概率最高,但不排除有其他颜色的情况。

可能会有读者问,在生成字画的例子中,不同文章的字完全不一样,怎么能用一种概率分布来表示呢?这里的概率分布可能是非常复杂的分布,例如分解成先用均匀分布选择画哪幅字,然后用条件概率再决定画布每个字颜色、落笔力度、方向等。

再举一个更简单的例子,比如给猴子一台有26个英文字母的打字机,它任意地敲击100个字符,那么概率分布空间就有100^{26}种,属于一维均匀分布。猴子每次敲击出的文章就是从这个概率分布中抽样一次。在这个例子中,打字机的规则十分清晰,即英文字母按顺序排列,因此比创作字画这种高维分布简单得多。

第三,只有引入概率分布才能生成大量样本。这也对应开篇所说的造假者目标,是学习一种技艺,而不是学习单一的某张字画。

如果理解了概率分布,那么也就明白了“符号定义”中的z。它代表了造假者的输入,例如要决定画哪幅字画,当时画笔的状态等等随机的因素。z一般是高斯分布,经过G的转换得到x_{1},服从更复杂的分布,这种分布就代表技艺。

3.3 推导

3.3.1 Discriminator

先说结论,推导后的最优解等价于JS散度最大。JS散度表示2个分布之间的距离,越大表示2个分布的差异越明显。这也符合Discriminator的目标,就是要让真品和赝品的区别最明显。

推导过程如下,不感兴趣的读者可略过。

对于D而言,优化目标是下式最大化。

V(G,D)=E_{x\sim P_{data}}[logD(x)]+E_{x\sim P_{G}}[log(1-D(x))]

左侧代表样本来自于真实数据时,D预测为真实的概率,此值越大越好;右侧表示当样本来自于假数据时,D预测为真实的概率,此值越小越好。取对数不影响单调性。

将此式的期望转换为积分的形式

V(G,D)=\int_{x}{P_{data}(x)\log{D(x)}dx}+\int_{x}{P_{G}(x)\log{(1-D(x))}dx}=\int_{x}{[P_{data}(x)\log{D(x)}+P_{G}(x)log{(1-D(x))}]dx}

现在引入一个强假设——D(x)可以是任意的函数。意思是对于每一个xD(x)足够复杂,可以想象成D(x)是一个分段函数,使得每个x上式中的积分项里的内容都最大。因此问题转化为积分项内的式子最大。因为D本质上是神经网络,足够复杂,所以是合理的。

为了方便说明,记a=P_{data}(x)b=P_{G}(x),D=D(x),V(G,D)中的每一个积分项都是f(D)。注意当优化D时,G是给定的,因此可看作常量。

上式转化为f(D)=a\log{(D)}+b\log{(1-D)}

为了求f的最大值,求上式微分等于0时的D(二阶微分小于0,因此可断定f为最大值而非最小值)

\frac{\mathrm{d} f(D) }{\mathrm{d} D}=\frac{a}{D}-\frac{b}{1-D}=0

可得D^*(x)=\frac{a}{a+b}=\frac{P_{data}(x)}{P_{data}(x)+P_{G}(x)}. 代入V(G,D),得

\max\limits_{D}V(G,D) =V(G,D^*)=\int_{x}{[P_{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)}}]dx}

在对数式分子和分母同时乘以1/2,并将分子的1/2提出来,得到

V(G,D^*)=-2\log{2}+\int_{x}{[P_{data}(x)\log{\frac{P_{data}(x)}{\left(P_{data}(x)+P_{G}(x)\right)/2}}+P_{G}(x)\log{\frac{P_{G}(x)}{\left( P_{data}(x)+P_{G}(x)\right)/2}}]dx}

将中括号内的求和拆成2项,每一项都是KL散度,合起来就是JS散度

V(G,D^*)=-2\log{2}+KL\left(P_{data}||\frac{P_{data}+P_{G}}{2}\right)+KL\left(P_{G}||\frac{P_{data}+P_{G}}{2}\right)=-2\log{2}+2JS(P_{data}||P_{G})

GAN神奇的地方在于,在我们不清楚真实分布P_{data}参数的情况下,D也能够用抽样的方式判断分布之间的距离,从而使得G趋近这个分布。

3.3.2 Generator

对于G而言,要找出最佳的G^{*},使得P_{G}P_{data}越接近越好,即

G^{*}=\arg\min\limits_{G}Div(P_{G},P_{data})

根据上文所述,这里Div(P_{G},P_{data})就是\max\limits_{D}V(G,D),即G^{*}=\arg\min\limits_{G}\max\limits_{D}V(G,D)。这就转化成G在知道D会选择让真实分布和生成分布距离最大时,应该做出什么样的决策,使得两个分布的距离最小。

这里借用李宏毅老师的例子并做了些修改:G只有2种选择,G_{1}G_{2},那么G应该选择哪一种呢?对应下图,左右分别是2种选择,横轴代表D的决策空间,纵轴代表真实分布和生成分布的距离。

如果选择第一种,D一定会选择让V最大的参数D_{1}^{*},此时V的值对应左图红点的纵坐标。同理,如果选择第二种,则V的值对应右图红点的纵坐标。由于左图的红点纵坐标比右图高,所以G选择第二个。

从另一个角度理解,仔细观察下图,左图的蓝色线整体比较低,只有一处尖峰位置较高;右图的蓝色线整体比较高。还是回到文物造假的例子,造假者有2种造假手段,第一种造出的赝品整体和真品差距不大,但是有一处非常容易露馅(比如整体的字都和王羲之的字很像,但只有某一个字的某一个笔画和王羲之相去甚远);第二种造出的赝品和真品的差距不大不小,没有明显的破绽。造假者和鉴宝者博弈,知道鉴宝者会揪住很小的破绽不放,因此选择了更稳妥的第二种造假手段。

下一篇笔者介绍GAN的具体算法和Python实现代码。

参考资料

李宏毅对抗生成网络2018

B站机器学习白板推导

《进阶详解KL散度》https://zhuanlan.zhihu.com/p/372835186

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

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

相关文章

基于Python的携程旅游景点数据分析与可视化

基于Python的携程旅游景点数据分析与可视化 爬取景点、价格、开放状态、评论、热度、优惠政策等信息。 功能列表 指定城市爬取支持登录支持筛选支持评论爬取支持数据存在数据库支持生成Excel支持可视化 部分效果演示 爬取的旅游景点信息 生成Excel 指定城市爬取 可视化 部门…

SQL-leetcode-197. 上升的温度

197. 上升的温度 表: Weather ---------------------- | Column Name | Type | ---------------------- | id | int | | recordDate | date | | temperature | int | ---------------------- id 是该表具有唯一值的列。 没有具有相同 recordDate 的不同行。 该表包…

等待事件 ‘latch: row cache objects‘ 说明及解决方法

早上刚来的时候,收到zabbix 数据库连接数增长的告警,同时应用负责人也说查询很慢、很卡 查看该时间段 最多的等待事件 SELECT event,COUNT(1) num FROM V$ACTIVE_SESSION_HISTORY A WHERE A.SAMPLE_TIME BETWEEN TO_DATE(2025-01-02 09:00:00, YYYY-M…

HAL 库------中断相关函数

HAL_SuspendTick();是对SysTick中CTRL寄存器中TICKINT位清0 HAL_ResumeTick(); 刚好与上面函数相反,对SysTick中CTRL寄存器中TICKINT位置1,恢复stick中断。

IDEA开发Java应用的初始化设置

一、插件安装 如下图所示: 1、Alibaba Java Coding Guidelines 2.1.1 阿里开发者规范,可以帮忙本地自动扫描出不符合开发者规范的代码,甚至是代码漏洞提示。 右击项目,选择《编码规约扫描》,可以进行本地代码规范扫…

QT-------------多线程

实现思路 QThread 类简介: QThread 是 Qt 中用于多线程编程的基础类。可以通过继承 QThread 并重写 run() 方法来创建自定义的线程逻辑。新线程的执行从 run() 开始,调用 start() 方法启动线程。 掷骰子的多线程应用程序: 创建一个 DiceThre…

在C语言基础上的C++(深入理解类和对象)

1:构造函数 1:为什么使用构造函数 由于类的封装性,一般来说,数据成员是不能被外界访问的,所以对象的数据成员的初始化工作就给共有函数来完成了。如果定义了构造函数,那么只要对象一建立,就可…

ESP32_H2-ESP32_H2(IDF)学习系列-安装官方组件

1、 在VS Code项目工程中添加IDF组件注册表中的组件十分便捷。您只需按下“CtrlShiftP”快捷键快速进入命令面板,或者通过菜单栏的“查看”选项,选择“命令面板”来打开它。随后,在命令面板中输入“ESP-IDF: Show Component Registry”即可展…

【UE5】UnrealEngine源码构建2:windows构建unreal engine 5.3.2

参考大神知乎的文章:UE5 小白也能看懂的源码编译指南 据说会耗费400G的空间。 代码本身并不大,可能是依赖特别多,毕竟看起来UE啥都能干,核心还是c++的, 【UE5】UnrealEngine源码构建1:tag为5.3.2源码clone 本着好奇+ 学习的态度,想着也许有机会能更为深入的熟悉UE的机制…

[Qt] 常用控件 | QWidget | “表白程序2.0”

目录 一、控件概述 控件体系的发展阶段: 二、QWidget 核心属性 核心属性概览: 1、enabled 2、Geometry 实例 1: 控制按钮的位置 实例 2: 表白 程序 i、Window Frame 的影响 ii、API 设计理念 iii、Geometry 和 FrameGeometry 的区别 &#xf…

laravel部署到云服务器上,除了首页之外,区域页面找不到路由

laravel部署到云服务器上,除了首页之外,区域页面找不到路由,都是报404错误 解决方法: (注:本人服务器使用宝塔面板) 打开宝塔面板,找到该站点->配置文件 在下方增加如下代码 …

git注意事项

提交代码的备注 feat : 开发 新增功能 fix: 修复 git相关 1. git安装及全局用户设置 Git安装 npm install git -ggit修改用户名邮箱密码 git config --global --replace-all user.name "要修改的用户名" git config --global --replace-all user.email"要修改…

Agent系列:AppAgent v2-屏幕智能Agent(详解版)

引言 简介 方法 Agent 框架 Agent 交互 探索阶段 部署阶段 文档生成 高级功能 实验结果 总结 局限性 未来工作 1. 引言 大语言模型(LLM)如 ChatGPT 和 GPT-4 显著提升了自然语言处理能力,并且推动了智能体在自主决策中的应用。…

flink cdc oceanbase

接上文:一文说清flink从编码到部署上线 环境:①操作系统:阿里龙蜥 7.9(平替CentOS7.9);②CPU:x86;③用户:root。 预研初衷:现在很多项目有国产化的要求&#…

Docker 安装与配置 Nginx

摘要 1、本文全面介绍了如何在 Docker 环境中安装和配置 Nginx 容器。 2、文中详细解释了如何设置 HTTPS 安全连接及配置 Nginx 以实现前后端分离的代理服务。 2、同时,探讨了通过 IP 和域名两种方式访问 Nginx 服务的具体配置方法 3、此外,文章还涵…

C语言格式输出

1.转换字符说明: 2.常用的打印格式: 在 C 语言中,格式输出主要依靠 printf 函数来实现。以下是一些 C 语言格式输出的代码举例及相关说明。 printf("%2d",123),因为输出的部分有三位数,但是要求…

yolov5核查数据标注漏报和误报

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、误报二、漏报三、源码总结 前言 本文主要用于记录数据标注和模型预测之间的漏报和误报思想及其源码 提示:以下是本篇文章正文内容,…

Word如何插入图片并移动到某个位置

Word如何插入图片并移动到某一个位置 新建word→插入→图片 选择合适的位置→选择图片→打开 点击图片→布局选项→选择文字环绕下的任意一个→固定在页面上 点击图片就可以将图片移动到任意位置

【prometheus】【blackbox_exporter】grafna导入blackbox_exporter看板配置

1、进入到grafana看板,选择合适的看板模版 地址:https://grafana.com/grafana/dashboards/ 在搜索框中输入 blackbox_exporter,找到合适的模版,如下图所示: 2、点击并下载对应看板JSON数据 3、在grafana的页面进行导入操作 3.1…

微服务面试题:分布式事务和服务监控

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…