谱归一化(Spectral Normalization)的理解

《Spectral Normalization for Generative Adversarial Networks》【1】是Takeru Miyato在2018年2月发表的一篇将谱理论应用于Gan上的文章,在2017年,本文的第3作者Yuichi Yoshida就发表了一篇著名的谱范数正则(Spectral Norm Regularization)的文章【2】,如有兴趣也可参看我的上一篇Blog:https://blog.youkuaiyun.com/StreamRock/article/details/83539937
【1】、【2】两篇文章从不同的角度讨论了:参数矩阵的谱范数对多层神经网络的泛化的影响,并分别给出了两个不同的应对方法:前者对Discriminator矩阵参数进行归一化处理,后者可以加入任意多层网络(在更新梯度时加入了谱范数正则项)。本文将在【1】的阅读理解基础上,探讨其实现的方法。

一、Gan的Lipschitz稳定性约束

Gan好是好,但训练难,主要体现在:1)模式坍塌,即最后生成的对象就只有少数几个模式;2)不收敛,在训练过程中,Discriminator很早就进入了理想状态,总能perfectly分辨出真假,因此无法给Generator提供梯度信息,而导致训练无法进行下去。Martin Arjovsky在《Towards principled methods for training generative adversarial networks》【4】、《Wasserstein GAN》【5】文章中,对Gan难训练的原因做了详细的讨论,并给出一种新的Loss定义,即Wasserstein Distance:
W ( P r , P g ) = inf ⁡ γ ∈ ∏ ( P r , P g ) E ( x , y ) ∼ γ [ ∥ x − y ∥ ] ( 1 ) W(P_r,P_g)=\inf_{\gamma\in\prod(P_r,P_g)}E_{(x,y)\sim \gamma}[\Vert x-y\Vert]\qquad(1) W(Pr,Pg)=γ(Pr,Pg)infE(x,y)γ[xy](1)
实际Wasserstein Distance的计算是通过它的变形来完成的:
W ( P r , P g ) = sup ⁡ ∥ f ∥ L i p E x ∼ P r [ f ( x ) ] − E x ∼ P g [ f ( x ) ] ( 2 ) W(P_r,P_g)=\sup_{\Vert f \Vert_{Lip}}E_{x∼P_r}[f(x)]−E_{x∼P_g}[f(x)]\qquad(2) W(Pr,Pg)=fLipsupExPr[f(x)]ExPg[f(x)](2)
(2)式只要求 f ( ⋅ ) f(\cdot) f() 满足Lipschitz约束即可,在Gan中,判别器的映射函数可充当(2)式中的 f ( ⋅ ) f(\cdot) f() ,于是加入此一约束的Gan网络有了一个新的名称:WGan。
引入Wasserstein Distance,将传统Gan转变为WGan是有许多好处的,因为Wasserstein Distance具有如下优点:
1、 W ( P r , P g ) ≥ 0 W(P_r,P_g)\ge0 W(Pr,Pg)0, 等号在 P r , P g P_r,P_g Pr,Pg分布完全重合时成立;
2、 W ( P r , P g ) W(P_r,P_g) W(Pr,Pg)是对称的,较常用的 KL Divergence 的不对称,有优势;
3、即使两个分布 P r , P g P_r,P_g Pr,Pg 的支撑不相交,亦可以作为衡量差异的距离,并在满足一定条件下可微,具备了后向传输的能力。
当 WGan 的 Discriminator 采用了这种距离来训练后,可以消除传统Gan训练时出现的收敛问题,使训练过程变得稳定。另外,要实施此策略也很简单,只需在传统Gan的Discriminator的参数矩阵上加上Lipschitz约束即可,其它的几乎不用改。


Lipschitz约束简单而言就是:要求在整个 f ( ⋅ ) f(\cdot) f() 的定义域内有
∥ f ( x ) − f ( x ′ ) ∥ 2 ∥ x − x ′ ∥ 2 ≤ M ( 3 ) \frac{\Vert f(x)-f(x') \Vert_2}{\Vert x-x' \Vert_2} \le M \qquad(3)

### 谱归一化策略概述 谱归一化Spectral Normalization, SN)是一种用于深度学习模型的正则化技术,主要应用于生成对抗网络(GANs)中以稳定训练过程并提高生成图像的质量。其核心思想是对权重矩阵的最大奇异值进行约束,从而控制模型的 Lipschitz 师范数[^4]。 #### 实现方法 谱归一化的实现基于奇异值分解理论。对于任意权重矩阵 \( W \),可以通过迭代幂法近似计算其最大奇异值,并将其规范化为单位长度。具体步骤如下: 1. **初始化向量**:随机初始化一个向量 \( u_0 \)。 2. **幂迭代**:通过多次迭代更新向量 \( v_k = \frac{W^\top u_{k-1}}{\|W^\top u_{k-1}\|} \) 和 \( u_k = \frac{Wv_k}{\|Wv_k\|} \)[^5]。 3. **估计奇异值**:利用最终得到的 \( u_k \) 计算最大奇异值 \( \sigma(W) = \|Wu_k\| \)。 4. **归一化操作**:将权重矩阵除以其最大奇异值,即 \( W' = \frac{W}{\sigma(W)} \)[^6]。 以下是 Python 中使用 PyTorch 的谱归一化实现示例: ```python import torch from torch.nn.utils import spectral_norm class SpectralNormalizedConv(torch.nn.Module): def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0): super(SpectralNormalizedConv, self).__init__() self.conv = spectral_norm(torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=stride, padding=padding)) def forward(self, x): return self.conv(x) # 使用示例 model = SpectralNormalizedConv(3, 64, 3, stride=1, padding=1) input_tensor = torch.randn(1, 3, 32, 32) output_tensor = model(input_tensor) print(output_tensor.shape) ``` #### 应用场景 谱归一化的主要应用场景集中在 GANs 及其他需要控制模型复杂性和稳定性的问题上。以下是一些典型的应用领域: 1. **生成对抗网络 (GAN)**:在 GAN 的判别器部分应用谱归一化能够显著提升训练稳定性,减少模式崩溃现象的发生[^7]。 2. **强化学习 (RL)**:通过对策略函数或价值函数引入谱归一化,可增强算法鲁棒性并改善收敛性能[^8]。 3. **时间序列预测**:在处理高维时间序列数据时,采用谱归一化有助于抑制过拟合风险,保持长期依赖关系的学习能力[^9]。 ### 注意事项 尽管谱归一化具有诸多优势,但在实际部署过程中仍需注意以下几点: - 幂迭代次数的选择会影响效率与精度之间的权衡; - 对于非常深或者宽泛的网络结构,可能会增加额外计算开销。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值