Fork me on GitHub

详解 GAN 的谱归一化(Spectral Normalization)

作者丨尹相楠
学校丨里昂中央理工博士在读
研究方向丨人脸识别、对抗生成网络

本文主要介绍谱归一化这项技术,详细论文参考 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


本文地址:https://www.6aiq.com/article/1550073944905
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出