深入理解GAN网络

2024-09-06 03:04
文章标签 深入 理解 网络 gan

本文主要是介绍深入理解GAN网络,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Generative Adversarial Networks创造性地提出了对抗训练来代替人工指定的loss。之前的文章初步理解了一下,感觉还是不到位,在这里再稍微深入一点。

交叉熵cross entropy

鉴别器是GAN中重要的一部分,鉴别器和生成器交替训练的过程就是adversarial training的过程。而鉴别器的本质是一个二分类网络,所以要理解gan loss,就首先要熟悉二分类中经典的交叉熵。

交叉熵中的“交叉”指的是对数部分使用的概率分布和加权求和部分使用的概率分布不同。具体而言,对数部分使用的是预测的结果,而加权求和部分使用的是真实标签的分布。所以二分类的交叉熵为:

注意上面公式中的.表示乘积,并且等式右边应该整体取负数。

鉴别器discriminator 

当鉴别器输入为真实数据, 

预测结果标签交叉熵的负数
D(X)1

当鉴别器输入为生成器的输出,

预测结果标签交叉熵的负数
D(G(Z))0

这两个交叉熵取负的曲线如下所示:

因为上述曲线没有考虑负号,所以应该是取最大值时损失函数最小,结合横坐标取值范围是0~1,所以鉴别器的优化目标是上图中箭头所指的位置。对应公式为:

生成器Generator 

生成器和鉴别器做对抗,所以优化目标正好是上式最小:

但其实生成器只参与上式中的第二项。可以看到,为了使第二项最小,D(G(Z))要逼近1,这意味着生成器的目标是让鉴别器认为生成器的结果是真。

The Generator needs to fool the discriminator by generating images as real as possible.

需要说明的是,虽然生成器G的目标是log(1 − D(G(z)))和D(G(z))=1是一致的,但一开始生成器很弱,鉴别器可以轻松区分开来,所以在训练前期可以使用D(G(z))来获得更大的梯度。

进一步理解

交替训练

把生成器和鉴别器的优化目标合并在一起,可以写为:

这个公式优美地表示了生成器和鉴别器的优化方向是共线的,只不过方向正好相反。既然方向相反,那就不能同步训练,而是要交替进行:

The adversarial loss can be optimized by gradient descent. But while training a GAN we do not train the generator and discriminator simultaneously, while training the generator we freeze the discriminator and vice-versa!

不平衡

整体上看D和G是交替训练,但是比例却不同。D更新时有k step,G却只有1 step。这样只要G更新足够慢,D就可以一直保持在最优解附近。

这其实和受限玻尔兹曼机(Restricted Boltzmann Machine)有关。相关中文资料,英文资料。

受限玻尔兹曼机由多伦多大学的 Geoff Hinton 等人提出,是一种可通过输入数据集学习概率分布的随机生成神经网络。随机指的是如果神经元被激活时会产生随机行为;受限指的是同一层的不同节点之间是不进行通信的,而不同层之间会有信息双向流动,并且权值相同。

但是到这里仍然没有为什么D需要训练k step,有更懂的朋友可以解释一下。我的理解是D对于整个GAN网络的效果很关键,是需要维持在一个很高的水平。但一开始G很弱,D可以很轻松区分开来,没必要训练那么多次。所以一种可取的策略是先训练生成器k1次,然后再训练判别器k2次,然后再交替训练。

损失函数

我们知道有很多映射关系是无法准确写出表达式的,而CNN的本质是基于 Universal Approximation Theorem,可以实现对任意函数的拟合。为了去衡量CNN的好坏,还是需要Explicit loss function来指导CNN中的梯度更新。

Explicit loss function的问题是它需要人工指定,并且是和任务相关的,比如:

L1 loss (Absolute error)

Used for regression task

L2 loss (Squared error)

Similar to L1 but more sensitive to outliers.

Cross-entropy loss

Usually used in classification tasks.

Dice loss (IoU)

Used in segmentation tasks.

KL Divergence: 

For measuring the difference between two distributions.

当任务更加复杂时,比如对黑白图像上色,传统的loss 函数会遇到各种问题。如MSE倾向于求平均的特性,预测结果是几种可能性的加权结果,带来的问题就是要么图像变模糊,要么出现不切实际的结果(两个可能性是真实存在的,强行加权求和的结果是不存在的)。

既然loss 函数也是函数,那么和之前的思想一样,也可以再使用一个CNN来拟合。这其实就是GAN的思想。判别网络潜在学习到的损失函数隐藏在网络之中,不同的问题这个函数就不一样,所以说可以自动学习这个潜在的损失函数 learned loss function,而不用人为地根据任务去调整。

学习分布

GAN新加了一个CNN去拟合损失函数,而这个CNN是一个分类网络。分类网络的损失函数是交叉熵,衡量两个分布的差异,所以可以认为整个GAN其实就是在学习一个概率分布。

D的本质是比较两个分布的差异,所以G的输出本质也是一种分布,而G的输入可以是均匀分布的噪声,所以G的学习目标其实是学习分布的迁移。可以看到,G的输入是均匀分布的z,G的输出x的分布绿色曲线一点点在向真实正态分布靠近。

所以说GAN是在学习给定GT的分布。

https://www.slideshare.net/slideshow/improved-trainings-of-wasserstein-gans-wgangp/104146363#4

reference:

1. https://zhuanlan.zhihu.com/p/149186719

2.Understanding GANs — Deriving the Adversarial loss from scratch

3.https://openai.com/index/generative-models/

4.https://medium.com/vitalify-asia/gans-as-a-loss-function-72d994dde4fb

这篇关于深入理解GAN网络的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140821

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边