今天讲述的内容是GAN与动力学,这是一个非常好玩、非常新鲜的视角。考虑到很多人微积分和线性代数等知识的涉猎不多,我将会对涉及的内容都做出基本说明,也并不会涉及过深入的东西,然后争取串成一个故事,扩展一下大家的视野。
作者&编辑 | 小米粥
最近这几期我们都一直在讲GAN的训练,最开始说明了实际训练GAN面临的几个理论和实践上的问题,然后接着从博弈论角度解释了GAN和纳什均衡,还说了几个帮助网络收敛的技巧。
这期将从动力学的视角看一下GAN,首先介绍基本概念常微分方程和欧拉法,然后介绍非常经典的梯度下降动力学系统,最后将GAN表示成动力学系统,并给出了一些比较好的结论。其实无论是什么视角,都是为了能更好的解决训练收敛的问题。
1 常微分方程与欧拉法
很多人平时接触的方程大部分是代数方程、超越方程等等,比如:
其解是一个或几个数值,例如上式的解为:
而微分方程是一种稍微“抽象”的方程,它是表示未知函数y(x)、未知函数的导数y`(x)以及自变量x关系的方程,比如:
其解(如果可解)应是一个函数或者函数族,例如上式的解析解为:
未知函数y(x)是一元函数的称为常微分方程,若是多元函数则称为偏微分方程。方便起见,将自变量x写成时间t,则可以用微分方程来表示某些随时间变化的规律或者动力学系统:
需要说明,对于常微分方程,只有某些特殊类型的方程能求得解析解,大部分是很难求得解析解的,所以实际中主要依靠数值法来近似计算求得数值解,以一个简单的具有初始值常微分方程为例:
其解析解为:
而数值解只能给出部分、离散的自变量、因变量近似数值对,例如
欧拉法便是一种非常经典的一阶数值方法。给定初始值和一系列固定间隔h的离散时间点,则可迭代计算:
得到微分方程的数值解。根据递推关系:
可以看出,欧拉法是先从初始点开始,在每一点做切线并沿当前切线推进至下一点,最后连接成一条折线,这种比较“粗糙”的方式精度是比较差的。上面的例子使用欧拉法得到的解如蓝线所示:
2 梯度下降法
在机器学习或者神经网络中,我们大量使用梯度下降法,其实它也可以看作是一个动力系统。给定关于训练集的某种损失函数:
一般情况下,对相当复杂的损失函数,不太可能一步到位直接求解参数的最优解,只能通过某些算法“慢慢地”去寻找最优解,比如使用经典的梯度下降算法,参数不断更新,在参数空间留下一条美妙的轨迹,其行为与动力系统十分相像。
考虑一个由常微分方程表示的动力系统:
使用欧拉法求解该动力系统,则有如下迭代关系:
如果把固定时间间隔h视为学习速度learning rate,则这就是大家非常熟悉的梯度下降算法的表达式,到此应该看得出,所谓梯度下降算法从动力学角度来看,就是使用欧拉法求解某个动力学系统。
当然,我们并不单单致力于能求解微分方程的数值解或者得到参数的轨迹,更重要的是,希望参数θ能够收敛到某个稳定点,动力系统达到某个稳定的状态,损失函数能够收敛。
3 GAN的动力学系统
在GAN中,我们设定生成器的优化目标为最大化f,而判别器的优化目标为最大化g,动力系统的参数由两部分组成:
那么动力学微分方程可写为:
整个动力学仍然采用梯度下降法进行迭代更新,若使用欧拉法求解GAN动力学系统,则可理解为使用同时梯度下降算法:
即在一个时间节点上,同时更新生成器和判别器的参数,其参数轨迹如下:
需要说明一下,通常在GAN中我们使用的是交替梯度下降,两者有一些区别(但是很多情况下并不影响最终的结论),即依次交替更新生成器和判别器的参数,其参数轨迹为:
上一期也说过,GAN并不是在寻找全局最优解,而是在寻找一个局部最优解。我们希望动力学系统的轨迹可以随着不断迭代而进入一个局部收敛点,也就是纳什均衡,定义纳什均衡点为:
容易证明对于零和博弈(f=-g),在纳什均衡点,其雅可比矩阵:
是负定的。反过来,可以通过检查雅可比矩阵的性质来判断是否达到了局部收敛,如果在某个点,其一阶导数为0
且其雅可比矩阵为负定矩阵,则该点为纳什均衡点。
我们知道半负定矩阵的特征值均小于等于0,则:如果在某一点的雅可比矩阵的特征值为均负实数,则在足够小的学习速率的前提下,训练过程收敛;如果特征值出现复数,则训练一般而言不会实现局部收敛;如果复数特征值的实部很小而虚部比较大,此时需要某种非常苛刻的学习速率才能达到收敛状态。
[1] Mescheder L , Nowozin S , Geiger A . The Numerics of GANs[J]. 2017.
[2] Nagarajan V, Kolter J Z, Nagarajan V, et al. Gradient descent GAN optimization is locally stable[J]. 2017.
总结
这篇文章首先介绍了常微分方程以及使用欧拉法得到常微分方程的数值解,然后从动力学的系统重新看梯度下降算法,最后从动力学视角重新表述了GAN,并且给出几个有用的结论。
原文发布于微信公众号 - 有三AI(yanyousan_ai)
原文发表时间:2019-08-27
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
发表于 2019-08-292019-08-29 13:30:35
分享
分享文章到朋友圈
分享文章到 QQ
分享文章到微博
复制文章链接到剪贴板
扫描二维码
扫码关注云+社区
领取腾讯云代金券
Original url: Access
Created at: 2019-10-07 12:51:52
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论