作者丨尹相楠

学校丨里昂中央理工博士在读

研究方向丨人脸识别、对抗生成网络

本文主要介绍谱归一化这项技术,详细论文参考 Spectral Normalization for Generative Adversarial Networks

本文主要对论文中的基础知识和遗漏的细节做出补充,以便于更好地理解谱归一化。部分内容参考并整合了如下两篇博客。

http://kaiz.xyz/blog/posts/spectral-norm/

https://christiancosgrove.com/blog/2018/01/04/spectral-normalization-explained.html

Lipschitz Continuity

在 GAN 中,假设我们有一个判别器 D: I→R,其中 I 是图像空间。如果判别器是 K-Lipschitz continuous 的,那么对图像空间中的任意 x 和 y,有:

其中 || · || 为 L2 norm,如果 K 取到最小值,那么 K 被称为 Lipschitz constant。

直观地来说,Lipschitz 条件限制了函数变化的剧烈程度,即函数的梯度。在一维空间中,很容易看出 y=sin(x) 是 1-Lipschitz 的,它的最大斜率是 1。

那么,为什么要使判别器函数具有 Lipschitz continuity 呢?Wasserstein GAN 提出了用 wasserstein 距离取代之前的 KL 散度或者 JS 散度,作为 GAN 判别器的损失函数:

其中 Pr 和 Pg 分别为真实数据和生成数据的分布函数,Wasserstein 距离衡量了这两个分布函数的差异性。

直观地理解,就是根据这两个分布函数分别生成一堆数据 x1, x2, ... , xn 和另一堆数据 y1, y2, ... , yn,然后计算这两堆数据之间的距离。距离的算法是找到一种一一对应的配对方案 γ~∏(Pr, Pg),把 xi 移动到 yj,求总移动距离的最小值。

由于在 GAN 中, Pr 和 Pg 都没有显式的表达式,只能是从里面不停地采样,所以不可能找到这样的 γ,无法直接优化公式 (2) 。W-GAN 的做法是根据 Kantorovich-Rubinstein duality,将公式 (2) 转化成公式 (3),过程详见以下链接:

https://vincentherrmann.github.io/blog/wasserstein/

其中 f 即为判别器函数。只有当判别器函数满足 1-Lipschitz 约束时,(2) 才能转化为 (3)。除此之外,正如上文所说,Lipschitz continuous 的函数的梯度上界被限制,因此函数更平滑,在神经网络的优化过程中,参数变化也会更稳定,不容易出现梯度爆炸,因此 Lipschitz continuity 是一个很好的性质。

为了让判别器函数满足 1-Lipschitz continuity,W-GAN 和之后的 W-GAN GP 分别采用了 weight-clipping 和 gradient penalty 来约束判别器参数。这里的谱归一化,则是另一种让函数满足 1-Lipschitz continuity 的方式。

矩阵的Lipschitz Continuity

众所周知,矩阵的乘法是线性映射。对线性映射来说,如果它在零点处是 K-Lipschitz 的,那么它在整个定义域上都是 K-Lipschitz 的。

想象一条过零点的直线,它的斜率是固定的,只要它上面任何一点是 K-Lipschitz 的,那么它上面所有点都是 K-Lipschitz 的。因此,对矩阵来说,它满足 K-Lipschitz 的充要条件是:

对其做如下变换:

其中 <·> 表示两个向量的内积。由于矩阵是半正定矩阵,它的所有特征值均为非负。我们假设它的特征向量构成的基底为 v1, v2,..., vn,对应的特征值为 λ1, λ2,..., λn,令 x=x1·v1+x2·v2+ ... +xn·vn。那么,公式 (5) 的左半部分可以转化为:

要使公式 (6) 对任意 xi 恒成立,且 λi 非负,则必有。若 λ1 为最大的特征值,只需要满足,这里即为矩阵 A 的 spectral norm。

综上所述,映射满足 K-Lipschitz 连续,K 的最小值为。那么,要想让矩阵 A 满足 1-Lipschitz 连续,只需要在 A 的所有元素上同时除以即可(观察公式 (4) 左侧是线性映射)。

通过上面的讨论,我们得出了这样的结论:矩阵 A 除以它的 spectral norm(最大特征值的开根号)可以使其具有 1-Lipschitz continuity。

矩阵的奇异值分解

上文提到的矩阵的 spectral norm 的另一个称呼是矩阵的最大奇异值回顾矩阵的 SVD 分解:

矩阵存在这样的一种分解:

其中:

  • U 是一个 m × m 的单位正交基矩阵

  • Σ 是一个 m × n 的对角阵,对角线上的元素为奇异值,非对角线上的元素为 0

  • V 是一个 n × n 的单位正交基矩阵

 SVD分解

由于 U 和 V 都是单位正交基,因此可以把矩阵乘以向量分成三步:旋转,拉伸,旋转。一前一后的两步旋转不改变向量的模长,唯一改变向量模长的是中间的拉伸,即与 Σ 相乘的那一步。而矩阵的 Lipschitz continuity 关心的正是矩阵对向量模长的改变,不关心旋转。

因此,只需要研究中间的 Σ 即可。而 Σ 又是一个对角矩阵,因此,它对向量的模长拉长的最大值,就是对角线上的元素的最大值。也就是说,矩阵的最大奇异值即为它的 spectral norm。

根据公式 (7) ,以及 SVD 分解中 U 和 V 都是单位正交基,单位正交基的转置乘以它本身为单位矩阵,有:

因此,只需要求出的最大特征值,再开根号,就求出了矩阵的最大奇异值,也就是矩阵的 spectral norm,和上一小节的推导殊途同归。

神经网络的Spectral Norm

对于复合函数,我们有这样的定理:

而多层神经网络,正是多个复合函数嵌套的操作。最常见的嵌套是:一层卷积,一层激活函数,再一层卷积,再一层激活函数,这样层层包裹起来。

激活函数通常选取的 ReLU,Leaky ReLU 都是 1-Lipschitz 的,带入到 (9) 中相乘不影响总体的 Lipschitz constant,我们只需要保证卷积的部分是 1-Lipschitz continuous 的,就可以保证整个神经网络都是 1-Lipschitz continuous 的。

而在图像上每个位置的卷积操作,正好可以看成是一个矩阵乘法。因此,我们只需要约束各层卷积核的参数 W,使它是 1-Lipschitz continuous 的,就可以满足整个神经网络的 1-Lipschitz continuity。

我们已经知道,想让矩阵满足 1-Lipschitz continuous,只需要让它所有元素同时除以它的最大奇异值,或者说是它的 spectural norm。因此,下一步的问题是如何计算 W 的最大奇异值。

对大矩阵做 SVD 分解运算量很大,我们不希望在优化神经网络的过程中,每步都对卷积核矩阵做一次 SVD 分解。一个近似的解决方案是 power iteration 算法

Power Iteration

Power iteration 是用来近似计算矩阵最大的特征值(dominant eigenvalue 主特征值)和其对应的特征向量(主特征向量)的。

假设矩阵 A 是一个 n × n 的满秩的方阵,它的单位特征向量为 v1, v2,..., vn,对应的特征值为 λ1, λ2,..., λn。那么对任意向量 x=x1·v1+x2·v2+ ... +xn·vn,有:

我们经过 k 次迭代:

由于 λ1,λ2,...,λn(不考虑两个特征值相等的情况,因为太少见了)。可知,经过 k 次迭代后。因此:

也就是说,经过 k 次迭代后,我们将得到矩阵主特征向量的线性放缩,只要把这个向量归一化,就得到了该矩阵的单位主特征向量,进而可以解出矩阵的主特征值。

而我们在神经网络中,想求的是权重矩阵 W 的最大奇异值,根据上面几节的推导,知道这个奇异值正是最大特征值的开方。因此,我们可以采用 power iteration 的方式求解的单位主特征向量,进而求出最大特征值 λ1。论文中给出的算法是这样的:

如果单纯看分子,我们发现这两步合起来就是,反复迭代 (13) 中上下两个式子 ,即可得到矩阵的单位主特征向量。只不过 (13) 的每算“半”步都归一化一次。

其实这种归一化并不影响向量的方向收敛到主特征向量的方向,而只影响特征向量前面的系数。而每步归一化一次的好处是,每步都可以得到单位主特征向量的近似解。

那么,知道的单位主特征向量后,如何求出最大特征值 λ1呢?

而将公式 (13) 的第二个式子两边同时左乘:

最终,(15) 即为论文中提出的权重矩阵 W 的 spectral norm 公式。

而在具体的代码实现过程中,可以随机初始化一个噪声向量代入公式 (13) 。由于每次更新参数的 step size 很小,矩阵 W 的参数变化都很小,矩阵可以长时间维持不变。

因此,可以把参数更新的 step 和求矩阵最大奇异值的 step 融合在一起,即每更新一次权重 W ,更新一次,并将矩阵归一化一次(除以公式 (15) 近似算出来的 spectral norm)。

具体代码见:

https://github.com/christiancosgrove/pytorch-spectral-normalization-gan

点击以下标题查看更多往期内容:

  • Airbnb实时搜索排序中的Embedding技巧

  • 图神经网络综述:模型与应用

  • 近期值得读的10篇GAN进展论文

  • F-Principle:初探理解深度学习不能做什么

  • 自然语言处理中的语言模型预训练方法

  • 两行代码玩转Google BERT句向量词向量

  • AI Challenger 2018 机器翻译参赛总结

  • Google BERT应用之红楼梦对话人物提取

  • 深度长文:NLP的巨人肩膀(上)

  • NLP的巨人肩膀(下):从CoVe到BERT

#投 稿 通 道#

让你的论文被更多人看到

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢? 答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得技术干货。我们的目的只有一个,让知识真正流动起来。

来稿标准:

• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)

• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接

• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志

? 投稿邮箱:

• 投稿邮箱:hr@paperweekly.site

• 所有文章配图,请单独在附件中发送

• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通

?

现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧

关于PaperWeekly

PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。

▽ 点击 |阅读原文 | 获取最新论文推荐

详解GAN的谱归一化(Spectral Normalization)相关推荐

  1. 明晚8点公开课 | 用AI给旧时光上色!详解GAN在黑白照片上色中的应用

    在改革开放40周年之际,百度联合新华社推出了一个刷屏级的H5应用--用AI技术为黑白老照片上色,浓浓的怀旧风勾起了心底快被遗忘的时光. 想了解如何给老照片上色?本次公开课中,我们邀请到了百度高级研发工 ...

  2. python归一化处理_详解python实现数据归一化处理的方式:(0,1)标准化

    在机器学习过程中,对数据的处理过程中,常常需要对数据进行归一化处理,下面介绍(0, 1)标准化的方式,简单的说,其功能就是将预处理的数据的数值范围按一定关系"压缩"到(0,1)的范 ...

  3. 公开课 | 用AI给旧时光上色!详解GAN在黑白照片上色中的应用

    在改革开放40周年之际,百度联合新华社推出了一个刷屏级的H5应用--用AI技术为黑白老照片上色,浓浓的怀旧风勾起了心底快被遗忘的时光. 想了解如何给老照片上色?本次公开课中,我们邀请到了百度高级研发工 ...

  4. 【GAN优化】详解GAN中的一致优化问题

    GAN的训练是一个很难解决的问题,上期其实只介绍了一些基本的动力学概念以及与GAN的结合,并没有进行过多的深入.动力学是一门比较成熟的学科,有很多非常有用的结论,我们将尝试将其用在GAN上,来得到一些 ...

  5. 详解GAN代码之搭建并详解CGAN代码

    训练数据集:填充轮廓->建筑照片 下载链接:https://pan.baidu.com/s/1xUg8AC7NEXyKebSUNtRvdg 密码:2kw1 CGAN是Conditional Ge ...

  6. ICCV2017 | 一文详解GAN之父Ian Goodfellow 演讲《生成对抗网络的原理与应用》(附完整PPT)

    当地时间 10月 22 日到10月29日,两年一度的计算机视觉国际顶级会议 International Conference on Computer Vision(ICCV 2017)在意大利威尼斯开 ...

  7. python归一化后全部都是0咋办_详解python实现数据归一化处理的方式:(0,1)标准化...

    在机器学习过程中,对数据的处理过程中,常常需要对数据进行归一化处理,下面介绍(0, 1)标准化的方式,简单的说,其功能就是将预处理的数据的数值范围按一定关系"压缩"到(0,1)的范 ...

  8. python 归一化处理_详解python实现数据归一化处理的方式:(0,1)标准化

    在机器学习过程中,对数据的处理过程中,常常需要对数据进行归一化处理,下面介绍(0, 1)标准化的方式,简单的说,其功能就是将预处理的数据的数值范围按一定关系"压缩"到(0,1)的范 ...

  9. 批归一化(Batch Normalization)详解

    批归一化(Batch Normalization)详解 文章目录 批归一化(Batch Normalization)详解 前言 一.数据归一化 二.BN解决的问题:Internal Covariate ...

最新文章

  1. const修饰的指针常量和常量指针
  2. Pytorch中的5个非常有用的张量操作
  3. html canvas 与小丑 。
  4. 【蓝桥杯】子串分值---笔记
  5. QML和C++混合编程--(二)
  6. LeetCode Algorithm 559. N 叉树的最大深度
  7. 汇编-debug结果正确与执行结果错误
  8. Unity3D 人形血条制作小知识
  9. JAVA面试题(part2)--位运算符
  10. 计算机英语讲课笔记02
  11. weblogic集群部署与负载均衡_集群,负载均衡,分布式的讲解和多台服务器代码同步...
  12. 计算机科学与技术考研考西南交通大学,西南交大计算机科学与技术考研怎么样...
  13. mysql检查约束字母_SQL中用check约束一列的首字母为's'
  14. Linux虚拟文件系统之文件系统安装(sys_mount())
  15. excel切换sheet的快捷键
  16. 计算机显示应用程序错误窗口,电脑提示explorer.exe应用程序错误怎么办|电脑explorer.exe应用程序错误的解决方法...
  17. 目前计算机已经发展到哪个阶段,目前电子计算机处于哪个阶段?计算机发展的四个阶段...
  18. 三层交换机与路由器之间的区别
  19. 详解函数的三种传递方式
  20. Elasticsearch 如何自定义扩展词库?

热门文章

  1. python的文件式如何操作_Python文件操作
  2. 个人永久性免费-Excel催化剂功能第28波-工作薄瘦身,安全地减少非必要冗余
  3. Oracle_Rac_BackgroudProcess
  4. $.each 用break 好像不太灵啊
  5. Linux 下的dd命令使用详解(摘录)
  6. Appium查找元素
  7. js参数使用时常犯的一个低级错误
  8. android恶意扣费类程序,10款APP违法有害 主要危害涉及恶意扣费等5类
  9. 字符串原样输出程序python_Python格式化字符串(格式化输出)
  10. python保持登录状态_“保持登录状态”-最佳方法