深度学习中对抗生成网络GAN背后的数学原理

引言

GAN的风暴席卷了整个深度学习圈子,任何任务似乎套上GAN的壳子,立马就变得高大上了起来。那么,GAN究竟是什么呢?

GAN的主要应用目标:

生成式任务(生成、重建、超分辨率、风格迁移、补全、上采样等)

GAN的核心思想:生成器G和判别器D的一代代博弈

生成器:生成网络,通过输入生成图像

判别器:二分类网络,将生成器生成图像作为负样本,真实图像作为正样本

learn 判别器D:

给定G,通过G生成图像产生负样本,并结合真实图像作为正样本来训练D

learn 生成器G:

给定D,以使得D对G生成图像的评分尽可能接近正样本作为目标来训练G

G和D的训练过程交替进行,这个对抗的过程使得G生成的图像越来越逼真,D“打假”的能力也越来越强。

觉得不是很好理解嘛?别着急,慢慢往下看!


1 从极大似然估计说起

补充:
分布的表示:P(x)
表示该分布中采样到样本x的概率,试想如果我们知道该分布中每个样本的采样概率,那么这个分布也就可以以这种形式表示出来了。
确定分布的表示:P(x;𝜃)
其中𝜃表示该分布的参数,该分布的具体形式确定了(比如 P(x;𝜃) 可以是高斯分布,𝜃就是高斯分布的均值 µ和方差𝜌

先来介绍一下极大似然估计

1.1 极大似然估计要解决的问题

  • 给定一个数据分布 P_{data}(x)

  • 给定一个由参数𝜃定义的数据分布 P_G(x;\theta )

  • 我们希望求得参数𝜃使得 P_G(x;\theta )尽可能接近P_{data}(x)

可以理解成:

P_G(x;\theta )是某一具体的分布(比如简单的高斯分布),而 P_{data}(x)

是未知的(或者及其复杂,我们很难找到一个方式表示它),我们希望通过极大似然估计的方法来确定𝜃 ,让 P_G(x;\theta )能够大体表达P_{data}(x) 。

1.2 极大似然估计的解决方案

  1. 从 P_{data}(x) 采样m个样本 \left \{ x^1,x^2,x^3,\cdot \cdot \cdot x^m \right \}

  2. 计算采样样本的似然函数 L = \displaystyle \prod \limits_{i=1}^{m} P_G(x^i;\theta )

  3. 计算使得似然函数 L 最大的参数𝜃 : 

    图片

 这里再啰嗦一下极大似然估计为什么要这么做:

 P_{data}(x)可以理解成是非常复杂的分布,不可能用某个数学表达精确表示,因此我们只能通过抽象,使用一个具体的分布模型 P_G(x;\theta ) 近似 P_{data}(x)

所以,求 P_G(x;\theta ) 的参数 𝜃的策略就变成了:
我们认为来自 P_{data}(x) 的样本 \left \{ x^1,x^2,x^3,\cdot \cdot \cdot x^m \right \} 在 P_G(x;\theta )  分布中出现的概率越高,也就是 L = \displaystyle \prod \limits_{i=1}^{m} P_G(x^i;\theta ) 越大, P_G(x;\theta )  和   P_{data}(x) 就越接近。
因此,我们期待的𝜃就是使得 L = \displaystyle \prod \limits_{i=1}^{m} P_G(x^i;\theta ) 最大的𝜃.
即: 

图片

咱们继续推导:

图片

关于最后一步:

因为我们求取的是𝜃 ,而式一 \int _x P_{data}(x)logP_{data}(x)dx与𝜃无关,因此加上这一项并不影响等式。

加上这一项是为了后面的推导,把极大似然函数的式子化简成KL散度的表达式

(公式推导接上)

图片

KL散度:
KL(P||Q) 衡量P,Q这两个概率分布差异的方式:

图片

1.3 极大似然估计的本质

找到𝜃 使得 P_G(x;\theta ) 与目标分布 P_{data}(x) 的KL散度尽可能低,也就是使得两者的分布尽可能接近,实现用确定的分布P_G(x;\theta ) 极大似然 P_{data}(x)

2 GAN的基本思想

2.1 生成器:有问题?试试神经网络!

GAN的主要应用是集中在生成

本质就是在做一个极大似然估计的事情,我们希望可以用某一种具体的分布形式 P_G(x;\theta ) 尽可能逼真地表达分布 P_{data}(x)  ,这样我们就相当于是得到了 P_{data}(x) ,并据此分布 P_G(x;\theta ) 采样(也就是做生成式的任务):

  1. 确定具体分布的形式 P_G(x;\theta ) 

  2. 极大似然估计求得𝜃.我们认为我们可以使用 P_G(x;\theta ) 近似表达 P_{data}(x)  

  3. 基于 P_G(x;\theta ) 采样做生成

那么最直接的想法:  P_G(x;\theta ) 直接用高斯分布模型,但是高斯分布的capacity太弱了,不能很有效地推广至去拟合各种差异很大地目标图像分布

想要得到更general的 P_G(x;\theta ) ,为什么不考虑使用具有强大拟合能力的神经网络来做呢???!!!

我们不妨设计一个神经网络G来得到更general的 P_G(x;\theta ) ,大概的结构图如下:

图片

解释一下:

整体pipeline:

  1. 我们先选取一个简单的先验分布 P_{prior},并从该先验分布中采样z作为输入,输入到神经网络G,得 G(z)= x 生成图像 x .我们通过这种方式构建了生成分布  P_G(x;\theta ) 。此时该分布主要由神经网络G决定,参数𝜃由网络参数定义.我们可以通过输入z来在该分布上采样 x .

  2. 我们的目标是 P_{data}(x),我们希望我们构建的 P_G(x;\theta ) 与它尽可能接近。我们无法获得 P_{data}(x)的具体表达形式,我们只能获得它的样本。

  3. 类似极大似然估计,我们通过比较两个分布样本的差异设计loss来调节优化神经网络G的参数𝜃,从而实现将分布 P_G 向 P_{data} 拉近,从而达到用 P_G 拟合表达 P_{data} 的效果。

P_{prior}表示一个先验分布,我们生成图像 x 需要输入的code z 就是服从这个先验分布的。这个先验分布比如可以是:高斯分布

图片

指示函数 I_{\left [ G(z;\theta ) == x \right ]} 表示当 [] 内的条件为真时取值为1,为假时取值为0

也就是说分布 P_G 采样 x 的概率是所有能够使得 G(z;\theta ) == x 成立的z出现的概率之和,而z在这里是符合先验分布 P_{prior}(z) 的。

显然, P_G(x;\theta ) 的计算是非常困难的。

然而, P_G(x;\theta ) 的计算又是非常必要的,因为我们需要验证  P_G(x;\theta ) 在不断靠近 P_{data}(x) .

现在这种情况使用极大似然估计根本无从下手啊!!!

那么现在,GAN来了!!!

2.2 判别器:有问题?GAN来了!

GAN由生成器G和判别器D组成。

其实上面我们已经基本介绍了生成器G的由来了,并且我们遇到了一个问题:  P_G(x;\theta ) 极其复杂的计算方式导致使用极大似然估计根本无从下手啊!!!

为了解决这个问题,我们引入了判别器D!

现在GAN的结构就完备了!!

对于生成器G:

  1. G 是一个函数,输入 z ~ P_{prior} ,输出(上面已经介绍了)x ~ P_G

  2. 先验分布 P_{prior},  P_{prior} 和G共同决定的分布 P_G对于判别器D:

  3. D是一个函数,输入 x ~ P_G ,输出一个scalar

  4. D用于评估 P_G(x;\theta ) 和  P_{data}(x) 之间的差异(解决上一小节提出的问题)

那么,GAN的最终目标-->用符号化语言表示就是:

图片

我们的目标是得到使得式子 max_D \,\,V(G,D) 最小的生成器 G^*.

关于V:

图片

给定G, max_D \,\,V(G,D)  衡量的就是分布 P_G 和 P_{data} 的差异。

因此,arg\,\, min_G \,\,max_D \,\,V(G,D) 也就是我们需要的使得差异最小的 G .

详细解释 V(G,D) :

对于 max_D \,\,V(G,D) ​​​​​​:

固定G ,最优 D^* 最大化:

图片

假设D(x) 可以表达任何函数

此时再固定 x ,则对于 P_{data}(x)logD(x)+P_G(x)log(1-D(x)),我们可将其看成是关于D的函数: f(D)=a \,logD+b \,log(1-D)

图片

解得

图片

即:

图片

则此时对于原式 V(G,D) (将 D^* 代入):

图片

JSD表示JS散度,它是KL散度的一种变形,也表示两个分布之间的差异: 

图片

与KL散度不同,JS散度是对称的。 

以上的公式推导,证明了  max_D \,\,V(G,D) 确实是衡量了 P_{data}(x) 和 P_G(x) 之间的差异。

图片

此时,最优的G:

图片

也就是使得 JSD(P_{data}(x) \left | \right | P_G(x)) 最小的G

图片

当 JSD(P_{data}(x) \left | \right | P_G(x)) = 0 时,表示两个分布完全相同。

对于 G^* = arg \,\, min_G \,\, max_D \,\, V(G,D) ,令 L(G)=max_D \,\, V(G,D)=V(G,D^*)

我们该如何优化从而获得 G^* 呢???

我们希望通过最小化损失函数L(G) ,找到最优的G。

这一步可以通过梯度下降实现:

图片

具体算法参考:

第一代:

  1. 给定 G_0 (随机初始化)

  • 确定 D^*_0 使得 V(G_0,D)  最大。此时 V(G_0,D^*_0) , 表示 P_{data}(x) 和 P_{G_0}(x) 的JS散度

  • 梯度下降:\theta _G \leftarrow \theta _G -\eta \frac{\partial V(G,D^*_0)}{\partial \theta _G} .得到 G_1

第二代:

2. 给定 G_1

  • 确定 D^*_1 使得 V(G_1,D) 最大。此时 V(G_1,D^*_1) , 表示 P_{data}(x) 和 P_{G_1}(x) 的JS散度

  • 梯度下降:\theta _G \leftarrow \theta _G -\eta \frac{\partial V(G,D^*_1)}{\partial \theta _G} .得到 G_2 

 。。。

后面的依此类推

以上算法有一个问题:如何确定 D^* 使得 V(D,G) 最大???

也就是:给定 G,如何计算 arg \,\, max_D \,\, V(G,D) 

回答:

从 P_{data}(x) 采样 \left \{ x^1,x^2,x^3,\cdot \cdot \cdot x^m \right \}

从 P_G(x) 采样 \left \{ \tilde{x^1}, \tilde{x^2},\cdot \cdot \cdot \tilde{x^m} \right \} 

因此我们可以将 max_D \,\, V(G,D) 从期望值计算改写为对样本计算(近似估计):

图片

这很自然地让我们想到二分类问题中常使用的交叉熵loss

因此,我们不妨联想:

D是一个二分类器,参数是 \theta _D 来自  P_{data}(x) 的采样 \left \{ x^1,x^2,x^3,\cdot \cdot \cdot x^m \right \} 作为正样本

来自 P_G(x) 的采样 \left \{ \tilde{x^1}, \tilde{x^2},\cdot \cdot \cdot \tilde{x^m} \right \} 作为负样本

那么此时,我们就将问题转化成了一个二分类问题:

交叉熵loss大 --> P_{data} 和 P_G JS散度小

交叉熵loss小 --> P_{data} 和 P_G JS散度大

此时,D就是可以使用一个神经网络作为二分类器,那么确定D,也就是可以使用梯度下降来优化获得D的最终参数。

GAN的最终算法流程:

初始化参数 \theta _D(for D)和 \theta _G(for G)

对于训练的每一轮:

第一部分 学习优化判别器D:

  • 从 P_{data}(x) 采样 \left \{ x^1,x^2,x^3,\cdot \cdot \cdot x^m \right \}

  • 从 P_{prior}(z) 采样 \left \{ z^1,z^2,z^3,\cdot \cdot \cdot z^m \right \} 

  • 通过生成器 \tilde{x^i}=G(z^i) 获得生成样本 \left \{ \tilde{x^1}, \tilde{x^2},\cdot \cdot \cdot \tilde{x^m} \right \} 

  • 梯度下降更新 \theta _D来最大化 : 

    图片

    :

    图片

注:以上第一部分可以重复多次:此过程本质上是在测量两分布之间的JS散度

第二部分 学习优化生成器G:

  • 再从 P_{prior}(z) 采样另一组 \left \{ z^1,z^2,z^3,\cdot \cdot \cdot z^m \right \}  

  • 梯度下降更新 \theta _G 来最小化 : 

    图片

    :

    图片

     .实际上 \tilde{V} 第一项与G无关,梯度下降只需最小化

    图片

    即可。

注:以上过程仅一次

最后的话:

其实在GAN之前,就已经有Auto-Encoder,VAE这样的方法来使用神经网络做生成式任务了。

GAN的最大的创新就是在于非常精妙地引入了判别器,从样本的维度解决了衡量两个分布差异的问题。

这种生成器和判别器对抗学习的模式,也必将在各种生成式任务中发挥其巨大的威力。

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

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

相关文章

英飞凌(Infineon)平台嵌入式开发基础

本篇文章介绍了基于英飞凌平台进行嵌入式开发的一些基础知识,首先介绍了涉及芯片的信息和常见的开发环境,把生硬的主体名称先分类并抛出来;然后着重介绍了英飞凌官网提供的开发资源,包括不限于开发环境,代码示例&#…

带你精通chrony服务器

华子目录 为什么会出现Chrony?Linux的两个时钟NTP介绍Chrony介绍安装与配置安装Chrony配置文件分析实验1实验2chronyc命令查看时间服务器chronyc sources输出分析其他命令 常见时区 为什么会出现Chrony? 由于IT系统中,准确的计时非常重要&am…

迭代新品 | 第四代可燃气体监测仪,守护燃气管网安全快人一步

城市地下市政基础设施是城市有序运行的生命线,事关城市安全、健康运行和高质量发展。近年来,我国燃气事故多发、频发。2020、2021、2022 年分别发生燃气事故668、1140 起、802 起,造成92、106、66 人死亡,560、763、487 人受伤。尤…

「C++」map和set的使用介绍

💻文章目录 📄前言前置知识关联式容器键值对map和set的底层结构 setset的构造函数set 的修改操作set的使用 mapmap的函数map的使用 multiset 和 multimap📓总结 📄前言 stl容器分为两类,分别是序列容器和关联式容器&am…

Java 高等院校分析与推荐系统

1)项目简介 随着我国高等教育的大众化,高校毕业生就业碰到了前所未有的压力,高校学生就业问题开始进入相关研究者们的视野。在高校学生供给忽然急剧增加的同时,我国高校大学生的就业机制也在发生着深刻的变化,作为就业…

操作系统:进程(一)

进程的基本概念 一般的解释是:进程是程序的一个执行实例,是正在执行的程序。我们写的程序编译后是一段二进制的文件。启动的时候加载到系统里面执行,就是以进程的形式执行。也就是说,我们编译后的可执行程序是一个静态的概念&…

C++ STL之string初始

我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

JSP基本表单和Request对象使用例子

表单的jsp&#xff1b; <%page contentType"text/html;charsetgbk" pageEncoding"UTF-8"%> <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><titl…

golang学习笔记——接口interfaces

文章目录 Go 语言接口例子空接口空接口的定义空接口的应用空接口作为函数的参数空接口作为map的值 类型断言接口值 类型断言例子001类型断言例子002 Go 语言接口 接口&#xff08;interface&#xff09;定义了一个对象的行为规范&#xff0c;只定义规范不实现&#xff0c;由具…

数据库大事记

数据库分类分类方法为&#xff1a;按数据模型分类、按业务类型分类、按部署方式分类、按存储介质分类。 按数据模型分类 按业务类型分类 按部署方式分类 按存储介质分类 喜欢点赞收藏&#xff0c;下期再见。

【Redux】Redux 基本使用

1. Redux 快速上手 Redux 是 React 最常用的集中状态管理工具&#xff0c;类似于Vue中的Pinia&#xff08;Vuex&#xff09;&#xff0c;可以独立于框架运行。 <button id"decrement">-</button> <span id"count">0</span> <…

多线程Thread(初阶一:认识线程)

目录 一、引用线程的原因 二、线程的概念 三、进程和线程的区别 四、多线程编程 一、引用线程的原因 多任务操作系统&#xff0c;希望系统能同时运行多个任务。所以会涉及到进程&#xff0c;需要对进程进行管理、调度等。 而单任务操作系统&#xff0c;就完全不涉及到进程…

YOLOv8-Seg改进策略:全新的聚焦式线性注意力模块Focused Linear Attention | ICCV2023

🚀🚀🚀本文改进:深入分析了现有线性注意力方法的缺陷,并提出了一个全新的聚焦的线性注意力模块(Focused Linear Attention),同时具有高效性和很强的模型表达能力。 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,…

深度学习系列53:mmdetection上手

1. 安装 使用openmim安装&#xff1a; pip install -U openmim mim install "mmengine>0.7.0" mim install "mmcv>2.0.0rc4"2. 测试案例 下载代码和模型&#xff1a; git clone https://github.com/open-mmlab/mmdetection.git mkdir ./checkpoi…

2023年【熔化焊接与热切割】考试试卷及熔化焊接与热切割试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割考试试卷考前必练&#xff01;安全生产模拟考试一点通每个月更新熔化焊接与热切割试题及解析题目及答案&#xff01;多做几遍&#xff0c;其实通过熔化焊接与热切割模拟考试很简单。 1、【单选题】 对…

React+后端实现导出Excle表格的功能

最近在做一个基于Reactantd前端框架的Excel导出功能&#xff0c;我主要在后端做了处理&#xff0c;这个功能完成后&#xff0c;便总结成一篇技术分享文章&#xff0c;感兴趣的小伙伴可以参考该分享来做导出excle表格功能&#xff0c;以下步骤同样适用于vue框架&#xff0c;或者…

“轻松实现文件夹批量重命名:使用顺序编号批量改名“

你是否曾经遇到过需要批量重命名文件夹&#xff0c;却因为繁琐的手动操作而感到困扰&#xff1f;现在&#xff0c;我们为你带来了一款全新的工具——轻松实现文件夹批量重命名&#xff0c;使用顺序编号批量改名。这款工具将帮助你轻松解决文件夹重命名的问题&#xff0c;提高工…

SpringSecurity5|12.实现RememberMe 及 实现原理分析

security/day08 这个功能大家还熟悉么&#xff1f;我们在登录网站的时候&#xff0c;除了让你输入用户名和密码&#xff0c;还会有个勾选框&#xff1a; 记住我&#xff01;&#xff01;&#xff01;不是让大家记住我哈。 值得一提的是&#xff0c;Spring Security 也提供了这个…

2023年汉字小达人市级比赛在线模拟题更新:40分钟150题完整对标

今天是2023年11月19日&#xff0c;距离11月30日的汉字小达人市级比赛还有11天。许多孩子正在利用难得的周末抓紧练习和备赛。 结合一些孩子的反馈和需求&#xff0c;我把150题的在线模拟题做了更新&#xff0c;增加了前面的个人信息填写的部分&#xff0c;并且把整个试卷的完成…

python自动化标注工具+自定义目标P图替换+深度学习大模型(代码+教程+告别手动标注)

省流建议 本文针对以下需求&#xff1a; 想自动化标注一些目标不再想使用yolo想在目标检测/语意分割有所建树计算机视觉项目想玩一玩大模型了解自动化工具了解最前沿模型自定义目标P图替换… 确定好需求&#xff0c;那么我们发车&#xff01; 实现功能与结果 该模型将首先…
最新文章