蓟县网站建设,流媒体视频网站建设,教做幼儿菜谱菜的网站,信息技术教学网站开发#x1f34a;作者简介#xff1a;秃头小苏#xff0c;致力于用最通俗的语言描述问题 #x1f34a;专栏推荐#xff1a;深度学习网络原理与实战 #x1f34a;近期目标#xff1a;写好专栏的每一篇文章 #x1f34a;支持小苏#xff1a;点赞#x1f44d;#x1f3fc;、… 作者简介秃头小苏致力于用最通俗的语言描述问题 专栏推荐深度学习网络原理与实战 近期目标写好专栏的每一篇文章 支持小苏点赞、收藏⭐、留言 对抗生成网络GAN系列——Spectral Normalization原理详解及源码解析
写在前面 Hello大家好我是小苏 在前面的文章中我已经介绍过挺多种GAN网络了感兴趣的可以关注一下我的专栏深度学习网络原理与实战 。目前专栏主要更新了GAN系列文章、Transformer系列和语义分割系列文章都有理论详解和代码实战文中的讲解都比较通俗易懂如果你希望丰富这方面的知识建议你阅读试试相信你会有蛮不错的收获。
在阅读本篇教程之前你非常有必要阅读下面两篇文章
[1]对抗生成网络GAN系列——DCGAN简介及人脸图像生成案例[2]对抗生成网络GAN系列——WGAN原理及实战演练
其实啊我相信大家来看这篇文章的时候一定是对上文提到的文章有所了解了因此大家要是觉得自己对GAN和WGAN了解的已经足够透彻了那么完全没有必要再浪费时间阅读了。如果你还对它们有一些疑惑或者过了很久已经忘了希望回顾一下的话那么文章[1]和文章[2]获取对你有所帮助。
大家准备好了嘛我们这就开始准备学习Spectral Normalization啦 Spectral Normalization原理详解
首先让我们简单的回顾一下WGAN。由于原始GAN网络存在训练不稳定的现象究其本质是因为它的损失函数实际上是JS散度而JS散度不会随着两个分布的距离改变而改变这句不严谨细节参考WGAN中的描述这就会导致生成器的梯度会一直不变从而导致模型训练效果很差。WGAN为了解决原始GAN网络训练不稳定的现象引入了EM distance代替原有的JS散度这样的改变会使生成器梯度一直变化从而使模型得到充分训练。但是WGAN的提出伴随着一个难点即如何让判别器的参数矩阵满足Lipschitz连续条件。
如何解决上述所说的难点呢在WGAN中我们采用了一种简单粗暴的方式来满足这一条件即直接对判别器的权重参数进行剪裁强制将权重限制在[-c,c]范围内。大家可以动动我们的小脑瓜想想这种权重剪裁的方式有什么样的问题——滴揭晓答案如果权重剪裁的参数c很大那么任何权重可能都需要很长时间才能达到极限从而使训练判别器达到最优变得更加困难如果权重剪裁的参数c很小这又容易导致梯度消失。因此如何确定权重剪裁参数c是重要的同时这也是困难的。WGAN提出之后又提出了WGAN-GP来实现Lipschitz 连续条件其主要通过添加一个惩罚项来实现。【关于WGAN-GP我没有做相关教程如果不明白的可以评论区留言】那么本文提出了一种归一化的手段Spectral Normalization来实现Lipschitz连续条件这种归一化具体是怎么实现的呢下面听我慢慢道来。 我们还是来先回顾一下Lipschitz连续条件如下
∣f(x1)−f(x2)∣≤K∣x1−x2∣|f(x_1)-f(x_2)| \le K|x_1-x_2|∣f(x1)−f(x2)∣≤K∣x1−x2∣
这个式子限制了函数f(⋅){\rm{f}}( \cdot )f(⋅)的导数即其导数的绝对值小于K∣f(x1)−f(x2)∣∣x1−x2∣≤K\frac{|f(x_1)-f(x_2)|}{|x_1-x_2|} \le K∣x1−x2∣∣f(x1)−f(x2)∣≤K。 本文介绍的Spectral Normalization的K1让我们一起来看看怎么实现的吧 上文提到WGAN的难点是如何让判别器的参数矩阵满足Lipschitz连续条件。那么我们就从判别器入手和大家唠一唠。实际上判别器也是由多层卷积神经网络构成的我们用下式表示第n层网络输出和第n-1层输入的关系
Xnan(Wn⋅Xn−1bn)X_na_n(W_n \cdot X_{n-1}b_n)Xnan(Wn⋅Xn−1bn) 其中an(⋅)a_n(\cdot)an(⋅)表示激活函数WnW_nWn表示权重参数矩阵。为了方便起见我们不设置偏置项bnb_nbn即bn0b_n0bn0。那么上式变为
Xnan(Wn⋅Xn−1)X_na_n(W_n \cdot X_{n-1})Xnan(Wn⋅Xn−1) 再为了方便起见♂️♂️♂️我们设an(⋅)a_n(\cdot)an(⋅)即激活函数为Relu。Relu函数在大于0时为yx小于0时为y0函数图像如下图所示 这样的话式Xnan(Wn⋅Xn−1)X_na_n(W_n \cdot X_{n-1})Xnan(Wn⋅Xn−1)可以写成XnDn⋅Wn⋅Xn−1X_nD_n \cdot W_n \cdot X_{n-1}XnDn⋅Wn⋅Xn−1其中DnD_nDn为对角矩阵。【大家这里能否理解呢如果我们的输入为正数时通过Relu函数值是不变的那么此时DnD_nDn对应的对角元素应该为1如果我们的输入为负数时通过Relu函数值将变成0那么此时DnD_nDn对应的对角元素应该为0。也就是说我们将XnX_nXn改写成Dn⋅Wn⋅Xn−1D_n \cdot W_n \cdot X_{n-1}Dn⋅Wn⋅Xn−1形式是可行的。】
接着我们做一些简单的推理得到判别器第n层输出和原始输入的关系如下图所示 最后一层的输出XnX_nXn即为判别器的输出接下来我们用f(x)f(x)f(x)表示原始输入数据x0x_0x0我们接下来用xxx表示。则判别器最终输入输出的关系式如下
f(x)Dn⋅Wn⋅Dn−1⋅Wn−1⋯D3⋅W3⋅D2⋅W2⋅D1⋅W1⋅xf(x) {D_n} \cdot {W_n} \cdot {D_{n - 1}} \cdot {W_{n - 1}} \cdots {D_3} \cdot {W_3} \cdot {D_2} \cdot {W_2} \cdot {D_1} \cdot {W_1} \cdot xf(x)Dn⋅Wn⋅Dn−1⋅Wn−1⋯D3⋅W3⋅D2⋅W2⋅D1⋅W1⋅x 上文说到Lipschitz连续条件本质上就是限制函数f(⋅){\rm{f}}( \cdot )f(⋅)的导数变化范围其实就是对f(x)f(x)f(x)梯度提出限制如下
∣∣∇xf(x)∣∣2∣∣Dn⋅Wn⋅Dn−1⋅Wn−1⋯D3⋅W3⋅D2⋅W2⋅D1⋅W1∣∣2≤∣∣Dn∣∣2⋅∣∣Wn∣∣2⋅∣∣Dn−1∣∣2⋅∣∣Wn−1∣∣2⋯∣∣D1∣∣2⋅∣∣W1∣∣2||{\nabla _x}f(x)|{|_2} ||{D_n} \cdot {W_n} \cdot {D_{n - 1}} \cdot {W_{n - 1}} \cdots {D_3} \cdot {W_3} \cdot {D_2} \cdot {W_2} \cdot {D_1} \cdot {W_1}|{|_2} \le ||{D_n}|{|_2} \cdot ||{W_n}|{|_2} \cdot ||{D_{n - 1}}|{|_2} \cdot ||{W_{n - 1}}|{|_2} \cdots ||{D_1}|{|_2} \cdot ||{W_1}|{|_2}∣∣∇xf(x)∣∣2∣∣Dn⋅Wn⋅Dn−1⋅Wn−1⋯D3⋅W3⋅D2⋅W2⋅D1⋅W1∣∣2≤∣∣Dn∣∣2⋅∣∣Wn∣∣2⋅∣∣Dn−1∣∣2⋅∣∣Wn−1∣∣2⋯∣∣D1∣∣2⋅∣∣W1∣∣2 其中∣∣A∣∣2||A||_2∣∣A∣∣2表示矩阵A的2范数也叫谱范数它的值为λ1\sqrt {{\lambda _1}}λ1λ1{\lambda _1}λ1为 AHA{{\rm{A}}^H}{\rm{A}}AHA的最大特征值。λ1\sqrt {{\lambda _1}}λ1又称作矩阵A的奇异值【注奇异值是AHA{{\rm{A}}^H}{\rm{A}}AHA的特征值的开根号也就是说λ1\sqrt {{\lambda _1}}λ1为A的其中一个奇异值或谱范数是最大的奇异值这里我们将谱范数即最大的奇异值记作σ(A)λ1\sigma {(A)} \sqrt {{\lambda _1}}σ(A)λ1。由于D是对角矩阵且由0、1构成其奇异值总是小于等于1故有下式 即∇xf(x)∣∣2∣∣Dn∣∣2⋅∣∣Wn∣∣2⋯∣∣D1∣∣2⋅∣∣W1∣∣2≤Π1nσ(Wi){\nabla _x}f(x)|{|_2} ||{D_n}|{|_2}\cdot ||{W_n}|{|_2} \cdots ||{D_1}|{|_2} \cdot ||{W_1}|{|_2} \le \mathop \Pi \limits_1^{\rm{n}} \sigma ({W_i})∇xf(x)∣∣2∣∣Dn∣∣2⋅∣∣Wn∣∣2⋯∣∣D1∣∣2⋅∣∣W1∣∣2≤1Πnσ(Wi)。为满足Lipschitz连续条件我们应该让∣∣∇xf(x)∣∣2≤K||{\nabla _x}f(x)|{|_2} \le K∣∣∇xf(x)∣∣2≤K ,这里的K设置为1。那具体要怎么做呢其实就是对上式做一个归一化处理让每一层参数矩阵除以该层参数矩阵的谱范数如下
∣∣∇xf(x)∣∣2∣Dn∣∣2⋅∣∣Wn∣∣2σ(Wn)⋯∣∣D1∣∣2⋅∣∣W1∣∣2σ(W1)≤Π1nσ(Wi)σ(Wi)1||{\nabla _x}f(x)|{|_2} |{D_n}|{|_2} \cdot \frac{{||{W_n}|{|_2}}}{{\sigma ({W_n})}} \cdots ||{D_1}|{|_2} \cdot \frac{{||{W_1}|{|_2}}}{{\sigma ({W_1})}} \le \mathop \Pi \limits_1^{\rm{n}} \frac{{\sigma ({W_i})}}{{\sigma ({W_i})}} 1∣∣∇xf(x)∣∣2∣Dn∣∣2⋅σ(Wn)∣∣Wn∣∣2⋯∣∣D1∣∣2⋅σ(W1)∣∣W1∣∣2≤1Πnσ(Wi)σ(Wi)1 这样其实我们的Spectral Normalization原理就讲的差不多了最后我们要做的就是求得每层参数矩阵的谱范数然后再进行归一化操作。要想求矩阵的谱范数首先得求矩阵的奇异值具体求法我放在附录部分。 但是按照正常求奇异值的方法会消耗大量的计算资源因此论文中使用了一种近似求解谱范数的方法伪代码如下图所示 在代码的实战中我们就是按照上图的伪代码求解谱范数的届时我们会为大家介绍。 注大家阅读这部分有没有什么难度呢我觉得可能还是挺难的你需要一些矩阵分析的知识我已经尽可能把这个问题描述的简单了有的文章写的很好公式推导的也很详尽我会在参考链接中给出。但是会涉及到最优化的一些理论估计这就让大家更头疼了所以大家慢慢消化吧在最后的附录中我会给出本节内容相关的矩阵分析知识是我上课时的一些笔记笔记包含本节的知识点但针对性可能不是很强也就是说可能包含一些其它内容大家可以选择忽略当然了你也可以细细的研究研究每个知识点说不定后面就用到了呢 Spectral Normalization源码解析 源码下载地址Spectral Normalization 这个代码使用的是CIFAR10数据集实现的是一般生成对抗网络的图像生成任务。我不打算再对每一句代码进行详细的解释有不明白的可以先去看看我专栏中的其它GAN网络的文章都有源码解析弄明白后再看这篇你会发现非常简单。那么这篇文章我主要来介绍一下Spectral Normalization部分的内容其相关内容在spectral_normalization.py文件中我们理论部分提到Spectral Normalization关键的一步是求解每个参数矩阵的谱范数相关代码如下
def _update_u_v(self):u getattr(self.module, self.name _u)v getattr(self.module, self.name _v)w getattr(self.module, self.name _bar)height w.data.shape[0]for _ in range(self.power_iterations):u.data l2normalize(torch.mv(w.view(height, -1).data, v.data)) v.data l2normalize(torch.mv(torch.t(w.view(height,-1).data), u.data))sigma u.dot(w.view(height, -1).mv(v))setattr(self.module, self.name, w / sigma.expand_as(w))def l2normalize(v, eps1e-12):return v / (v.norm() eps)对上述代码做一定的解释678910行做的就是理论部分伪代码的工作最后会得到谱范数sigma。11行为使用参数矩阵除以谱范数sigma以此实现归一化的作用。【torch.mv实现的是矩阵乘法的操作里面可能还有些函数你没见过大家百度一下用法就知道了非常简单】 其实关键的代码就这些是不是发现特别简单呢每次介绍代码时我都会强调自己动手调试的重要性很多时候写文章介绍源码都觉得有些力不从心一些想表达的点总是很难表述总之大家要是有什么不明白的就尽情调试叭或者评论区留言我天天在线摸鱼滴喔。⭐⭐⭐后期我也打算出一些视频教学了这样的话就可以带着大家一起调试我想这样介绍源码彼此都会轻松很多。 小结 Spectral Normalization确实是有一定难度的我也有许多地方理解的也不是很清楚对于这种难啃的问题我是这样认为的。我们可以先对其有一个大致的了解知道整个过程知道代码怎么实现能使用代码跑通一些模型然后考虑能否将其用在自己可能需要使用的地方如果加入的效果不好我们就没必要深究原理了如果发现效果好这时候我们再回来慢慢细嚼原理也不迟。最后希望各位都能获取新知识能够学有所成叭 参考链接 GAN — Spectral Normalization Spectral Normalization for GAN 详解GAN的谱归一化Spectral Normalization 谱归一化Spectral Normalization的理解 附录 这部分是我学习矩阵分析这门课程时的笔记截取一些包含此部分的内容有需求的感兴趣的可以看一看。 如若文章对你有所帮助那就