谱归一化(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.csdn.net/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

谱归一化和实例归一化是两种不同的数据归一化方法,它们可以同时使用。谱归一化是将数据按照特征进行归一化,即对每个特征进行归一化处理,使得每个特征的取值范围都在一定的范围内。而实例归一化是将数据按照样本进行归一化,即对每个样本进行归一化处理,使得每个样本的取值范围在一定的范围内。 同时使用谱归一化和实例归一化可以更全面地对数据进行归一化处理,从而更好地留数据的特征和结构。谱归一化可以处理特征之间的差异,而实例归一化可以处理样本之间的差异。因此,同时使用谱归一化和实例归一化可以更好地处理数据中的特征和样本之间的差异,提高数据的可解释性和模型的性能。 下面是一个使用谱归一化和实例归一化的示例代码: ```python import numpy as np from sklearn.preprocessing import StandardScaler, MinMaxScaler # 谱归一化 def spectral_normalization(data): scaler = StandardScaler() normalized_data = scaler.fit_transform(data) return normalized_data # 实例归一化 def instance_normalization(data): scaler = MinMaxScaler() normalized_data = scaler.fit_transform(data) return normalized_data # 同时使用谱归一化和实例归一化 def combined_normalization(data): spectral_normalized_data = spectral_normalization(data) combined_normalized_data = instance_normalization(spectral_normalized_data) return combined_normalized_data # 示例数据 data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 谱归一化 spectral_normalized_data = spectral_normalization(data) print("谱归一化结果:") print(spectral_normalized_data) # 实例归一化 instance_normalized_data = instance_normalization(data) print("实例归一化结果:") print(instance_normalized_data) # 同时使用谱归一化和实例归一化 combined_normalized_data = combined_normalization(data) print("同时使用谱归一化和实例归一化结果:") print(combined_normalized_data) ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值