机器学习(李宏毅)——GAN
一、前言
本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!!
不得不说GAN真是博大精深!
二、大纲
- GAN问世
- 基本思想
- 原理剖析
- Tips of GAN
- GAN的应用
- Cycle GAN
- Evaluation of GAN
三、GAN问世
2014年Goodfellow 等人在《Generative Adversarial Networks》论文中首次提出了 GAN,随后各种各样的GAN百花齐放和发展,整个GAN的大家族网站:https://github.com/hindupuravinash/the-gan-zoo。
四、基本思想
GAN由两部分组成:Generator + Discriminator,简称为G和D。
- Generator (生成器)
- Discriminator(判别器)
精髓:G要想办法骗过D,D则是尽量挑出G假的内容,拟人化说法就是“对抗”。
举个例子:
G是屌丝,D是白富美,D心里择偶是有一杆称就是找个高富帅G’,下面就是屌丝伪装成高富帅的故事了:
第一次约会:G搞了个发型去见D,D说你衣品真差,黄了;
第二次约会:G买了套名牌西装去见D,D说你的车怎么是个共享自行车,黄了;
第三次约会:G租了一辆保驰捷911去见D,当然还搞了发型、穿了名牌西装,并说其实我一直都是高富帅,只不过家里在考验我的继承能力而已,并送出A货包包,D信了,于是两个人就在一起了。
从上面的例子看出,D每次都基于G的表现冒出一个标准,而G每次都按照D的标准重新纠正自己,反复进行下去,如果一方停下来,这场约会(“对抗”)也进行不下去了。
回归到图像生成这件事情上来:
具体步骤如下:
- step1:固定G,得到输出的image(第一次都是噪点),输送给D,D根据看过的真实图片和G的假照片,训练出标准。D就像是分类器,要区分出来自G的data和real data。

- step2:有了标准D后,接着将其固定,反过来更新G,使得G输出的image送入D,D越难区分出来越好。

反复上述步骤1和2进行下去,以上就是GAN的基本思想和步骤,总体的流程图如下:

五、原理剖析
- Generator
Generator分为两种:
1、conditional (有额外条件的输入),有额外的x资讯。

2、unconditional(没有额外条件的输入),没有额外的x作为输入。

Generator原理剖析:
1、先看G的左边:有个Normal Distribution,是个简单的正态分布(当然也可以是其他易表达的distribution),G从这个分布中抽取样本向量。
其实Normal Distribution可以理解为就是一个初始化的简单空间,还可以输入额外的条件x进行限制。
2、再看G的右边:右边就是转换后复杂的distribution,要和real data的分布越接近越好。
那如何计算两个分布的距离呢?
常见的列举以下两种:
- JS divergence
- KL divergence
当然还有很多方法,我们姑且称之为divergence。
因此,我们G的目标就是要找到一组参数,使得divergence最小。
于是乎,目标函数写作:

那Divergence如何计算呢,实做中很难算,比较复杂,这也是GAN遇到的难题。
这里先怀揣的着这个问题先,继续往下看下Discriminator。
- Discriminator
Discriminator 判别器的工作原理很直觉,就是看到PG给低分,看到Pdata给高分,合起来的分数越高越好,这就是它的目标。

于是可以写作:

说明:V目标函数要最大化,其和两个参数有关,就是G和D。
V(D,G)长啥样呢?

这里直接给出公式,有兴趣的可查阅资料进行推导理解。
公式转换
巧了,发现JS divergence和max V(D,G)是相关的。
于是乎:

回答了Generator中Divergence怎么算的问题,就是统一换到V的表达方式,V的表达式又已经有了,就可以实做了。
小结:
至此,GAN的基本思想、操作过程、公式都说完了,比较难理解的应该就是公式部分,需要动手推一推。
六、Tips of GAN
JS divergence并非是合适的衡量指标,为啥呢?
因为,PG和Pdata的Distribution都是一个局部的分布,无法诠释真正的分布是长啥样,也有可能PG和Pdata重叠的部分只是冰山一角而已,而JS Divergence只要是不重叠得到的输出值就是log2,这并不合理。

从上图,显然两个分布已经是慢慢接近了,但只要不重叠就一直输出是log2。
所以,有人就提出了Wasserstein distance方法。
Wasserstein distance
Wasserstein distance 来自于WGAN,其精髓思想就是把P分布推到Q分布的距离算出来。

但是,推过去的方法有很多种,所以这里采用穷举并取最小的d作为Wasserstein Distance。

这样更好看出Distance的变化。

那如何计算Wasserstein Distance呢?这里直接给出公式:

足够平滑这件事情,实际上是定范围,让参数介于(-C,C)区间,超过就clip,还有一种Improve WGAN,提出Gradient Penalty,连接两个概率分布,算斜率,要接近于1。

比较好的方法是Spectrial Normal。
七、GAN的应用
Conditional Generation
-
文生图
输入:需要成对的文、图资料,还要有正样本和负样本效果才会比较好,正样本包括文、图匹配,负样本包括文不配、图清晰和文不配、图噪点情况。

-
图生图
输入:同样需要成对的图、图。
supervised + GAN 效果比较好,为什么呢?GAN富想象力,常生出意料外部分,supervised比较刻板,能把GAN拉回来。

-
音生图
声音生成图像同样可以运作,x的条件输入换成声音即可。

-
Talking Head Generation
输入一张图片,生成gif图,这也是很牛的技术。

八、Cycle GAN
GAN的变种,可用于图片风格的转换。
基本思想就是,当没有成对的训练资料时候,加上一个还原的过程,如下图将真实世界人脸转为卡通风格,并且期望通过另外一个G能够将卡通世界图片还原至真实世界人脸图,这样的做法目的是为了让卡通风格像输出真实世界人脸图。
D则是树立了卡通风格的标准。

同样,还可以应用在文字风格转换。
九、Evaluation of GAN
那如何评估GAN生成的图片的好坏呢?
一种办法是使用图片分类器进行评估,即输入一张图片,然后看这个图片分类器识别出多少个类别,如果类别越集中,那说明生成的图片的质量越好,如下图:

所以,整体上GAN生成的图片好不好,我们会从两方面进行衡量,即:
-
1、高质量(越像越好);
-
2、多样性
那怎么评估多样性呢?
就是看各个类别的和越平均,多样性越高。

实际过程可能会遇到: -
Mode Collapse
G产生的data老是集中在某一张,重复地出现,抓到D的盲点硬打一发。

-
Mode dropping
G产生的data多样性不够,老是集中在某一些,但是下次生成的也只是在此基础上稍加改变(比如颜色)

相关文章:
机器学习(李宏毅)——GAN
一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 不得不说GAN真是博大精深! 二、大纲 GAN问世基本思想原理剖析Tips of GANGAN的应用Cycle GANEva…...
QT无弹窗运行和只允许运行一个exe
最近做一个小功能,需要后台运行QT程序,无弹窗,并且只允许一个exe运行,不关闭程序,无法2次启动。 main.cpp #include "deleteshotcurveflie.h" #include <QApplication> #include <QSharedMemory&…...
C++ STL 容器
C 的 STL(Standard Template Library) 提供了多种容器,分为以下几类: 序列容器(Sequence Containers)关联容器(Associative Containers)无序关联容器(Unordered Associa…...
开源赋能,智造未来:Odoo+工业物联网,解锁智能工厂新范式——以真实案例解读制造业数字化转型的降本增效密码
工业物联网的机遇与挑战:为什么企业需要Odoo? 《中国智能制造发展研究报告2023》指出,85%的制造企业已启动数字化转型,但超60%面临“数据孤岛、系统割裂、成本高企”的痛点[1]。传统ERP系统难以实时对接产线设备,而定…...
CTF-WEB: 利用iframe标签利用xss,waf过滤后再转换漏洞-- N1ctf Junior display
核心逻辑 // 获取 URL 查询参数的值 function getQueryParam(param) { // 使用 URLSearchParams 从 URL 查询字符串中提取参数 const urlParams new URLSearchParams(window.location.search); // 返回查询参数的值 return urlParams.get(param); } // 使用 DOMPuri…...
K8s组件
一、Kubernetes 集群架构组件 K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责集群的调度、管理和运维,Slave 节点是集群中的运算工作负载节点。 主节点一般被称为 Master 节点,master节点上有 apis…...
python面试题
以下是一些Python面试题: 一、基础语法 Python中的列表(list)和元组(tuple)有什么区别? 答案: 可变性:列表是可变的,可以修改列表中的元素、添加或删除元素;元组是不可变的,一旦创建就不能修改。语法:列表使用方括号[]定义,元组使用圆括号()定义(单个元素的元组…...
AOS安装及操作演示
文章目录 一、安装node1.1 在 macOS 上管理 Node版本1.1.1 安装 nvm1.1.2 验证 nvm 是否安装成功1.1.3 使用 nvm 安装/切换 Node.js 版本1.1.4 卸载 Node.js 版本 1.2 在 windows 上管理 Node版本1.2.1 安装 nvm-windows1.2.2 安装 Node.js 版本1.2.3 切换 Node.js 版本1.2.4 卸…...
蓝桥杯单片机组第十三届初赛试题-程序题(第2批)
题目到官网看即可,有点久了有些细节记不清了,可能以前发的帖子解释详细一点。 这是我单片机初学的时候写的,像代码结构什么的肯定有可以提升的地方,多多包涵,将就看一下。 i2c文件使用官方的,pcf8591函数…...
企业级高可用 Kubernetes 实践:基于青云 LB 搭建容灾与负载均衡集群全攻略
一、前言 在企业生产环境,k8s高可用是一个必不可少的特性,其中最通用的场景就是如何在 k8s 集群宕机一个节点的情况下保障服务依旧可用。部署高可用k8s集群对于企业级云平台来说是一个根本性的原则,容错、服务可用和数据安全是高可用基础设施的关键。本文是在青云上利用青云…...
Python Pandas(11):Pandas 数据可视化
数据可视化是数据分析中的重要环节,它帮助我们更好地理解和解释数据的模式、趋势和关系。通过图形、图表等形式,数据可视化将复杂的数字和统计信息转化为易于理解的图像,从而便于做出决策。Pandas 提供了与 Matplotlib 和 Seaborn 等可视化库…...
【练习】图论
F. Friendly Group 图中选择一个点-1 边两端点都选择1 边一个端点选择-1 添加链接描述 #include<iostream> using namespace std; #include<vector> #include<cstring> const int N300010; int n,m; vector<int> G[N]; int temp1,temp2; bool vis[N…...
【RAG落地利器】Weaviate、Milvus、Qdrant 和 Chroma 向量数据库对比
什么是向量数据库? 向量数据库是一种将数据存储为高维向量的数据库,高维向量是特征或属性的数学表示。每个向量都有一定数量的维度,根据数据的复杂性和粒度,可以从数十到数千不等。 向量通常是通过对原始数据(如文本、图像、音频、视频等)…...
今日AI和商界事件(2025-02-14)
今日AI大事件主要包括以下几个方面: 一、苹果新品预告 事件概述:苹果CEO蒂姆库克在社交媒体发布7秒视频,配文“准备好迎接家庭的新成员”,并宣布2月19日将有新品发布。知名科技记者马克古尔曼称,新款低端iPhone SE将…...
【大语言模型】最新ChatGPT、DeepSeek等大语言模型助力高效办公、论文与项目撰写、数据分析、机器学习与深度学习建模等科研应用
ChatGPT、DeepSeek等大语言模型助力科研应用 随着人工智能技术的快速发展,大语言模型如ChatGPT和DeepSeek在科研领域的应用正在为科研人员提供强大的支持。这些模型通过深度学习和大规模语料库训练,能够帮助科研人员高效地筛选文献、生成论文内容、进行数…...
spring6(完结)
像是八大模式这种,放在后面八股文中再重点了解,对于源码部分也是后面会一起手敲。 个人觉得spring的重点在于注解开发,省去了很多耦合的问题,像是各种事务的管理,和bean类的管理都可以给spring容器管理,注入…...
Kubernetes (k8s) 常用指令速查表
以下是一份 Kubernetes (k8s) 常用指令速查表,涵盖集群管理、资源操作、故障排查等场景,适合日常运维和开发使用: 1. 集群与节点管理 命令说明kubectl cluster-info查看集群基本信息kubectl get nodes查看所有节点状态kubectl describe node…...
DeepSeek教unity------MessagePack-05
动态反序列化 当调用 MessagePackSerializer.Deserialize<object> 或 MessagePackSerializer.Deserialize<dynamic> 时,二进制数据中存在的任何值都将被转换为基本值,即 bool、char、sbyte、byte、short、int、long、ushort、uint、ulong、…...
Kotlin 优雅的接口实现
1. 日常遇到的冗余的接口方法实现 日常开发中,经常会要实现接口,但是很多场景中,只需要用到其中一两个方法,例如 ActivityLifecycleCallbacks,它有很多个接口需要实现,但是很多时候我们只需要用到其中的一…...
新的面试题CSS
解释CSS Hack 一般来说是针对不同的浏览器写不同的CSS,就是 CSS Hack。 IE浏览器Hack一般又分为三种,条件Hack、属性级Hack、选择符Hack(详细参考CSS文档:css文档)。例如: // 1、条件Hack <!--[if IE]> <sty…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...
Appium下载安装配置保姆教程(图文详解)
目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...
