SNGAN(频谱归一化GAN)笔记

SNGAN(频谱归一化GAN)

WGAN虽然性能优越,但是留下一个难以解决的1-Lipschitz问题,SNGAN便是解决该问题的一个优秀方案。

在GAN中,Wasserstein距离拥有更好的数学性质,它处处连续,几乎处处可导且导数不为0,所以我们更多的使用Wasserstein距离。

WGANcritic(判别器)的目标函数为:

在这里插入图片描述

SNGAN便是一种“严格”地解决了判别器1-Lipshcitz约束的方法。

1 最大特征值(奇异值)

我们从矩阵的特征值、奇异值开始说起。在线性代数中,Ax=b表示对向量x做矩阵A对应的线性变换,可以得到变换后的向量b。如果x为矩阵A对应的特征向量,则有:

在这里插入图片描述

即对特征向量x做矩阵A对应的线性变换的效果是:向量方向不变,仅长度伸缩λ 倍!比如,对

在这里插入图片描述

线性变换作用在特征向量的效果如下:

在这里插入图片描述

对于一般向量x,对其线性变换的中间运算过程可以分解为三步。例如对于计算Ax,其中x=[0,1],先将x分解到两个特征向量上:

在这里插入图片描述

在这里插入图片描述

然后在两个特征向量方向上分别进行伸缩变换,有:

在这里插入图片描述

最后再进行简单的向量合成,可有:

在这里插入图片描述

一般的,对于非奇异n阶方阵,有n个特征向量和与之对应的特征值,故n阶方阵A对应的线性变换操作其实可以分解成三步:将向量x先分解到n个特征向量对应的方向上(本质是求解x在以特征向量组成的基上的表示),分别进行伸缩变换(在特征向量组成的基上进行伸缩变换),最后进行向量合成(本质是求解得到的新向量在标准基上的表示)。这其实就是在描述熟悉的矩阵特征值分解:

在这里插入图片描述

特征值分解其实是对线性变换中旋转、缩放两种效应的归并,奇异值分解正是对线性变换的旋转、缩放和投影三种效应的一个析构(当V的维度大于U的维度时存在投影效应)。

对于任意单位向量x,Ax的最大值(这里使用向量的2范数度量值的大小)是多少?显然,x为特征向量v2时其值最大,因为这时的x全部“投影”到伸缩系数最大的特征向量上,而其他单位向量多多少少会在v1方向上分解出一部分,在v1方向上只有2倍的伸缩,不如在v2方向上4倍伸缩的值来的更大。这样可以得到一个非常重要的式子:

在这里插入图片描述

其中σ (A)表示A的最大特征值(奇异值),也称为A的谱范数。

2 Lipshcitz限制

所谓Lipshcitz限制,在最简单的一元函数中的形式即:

在这里插入图片描述

直观上看,它要求f(x)任意两点之间连线的“斜率”绝对值小于Lipshcitz常数k。在WGAN中要求k=1,1-Lipshcitz限制要求保证了输入的微小变化不会导致输出产生较大变化。常见函数比如分段线性函数|x|,连续函数sin(x)都显而易见的满足该限制:

在这里插入图片描述

显然,f(x)=Wx不满足1-Lipshcitz限制,利用第一部分的结论,考虑到

在这里插入图片描述

即可以得到:

在这里插入图片描述

可以看出,虽然线性函数f(x)=Wx不满足1-Lipshcitz限制,但是可使用谱范数将W的”缩放大小“限定为小于等于1,(有点类似于向量的归一化操作)这样处理后的f*(x)可以满足1-Lipshcitz限制。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
频谱归一化是一种用于改善生成对抗网络(GAN)性能的技术。它通过减少权重矩阵的分层频谱范数来提高网络的Lipschitzness,从而简化训练并提高鲁棒性。频谱归一化的一种常见方法是使用谱归一化(spectral normalization)。 谱归一化通过对权重矩阵的每一行进行归一化来实现。具体而言,它通过计算权重矩阵的奇异值分解(SVD),并将奇异值除以其最大值来归一化每一行的权重。这样可以确保权重矩阵的每一行都具有相同的范数,从而提高网络的稳定性和收敛性。 下面是一个使用谱归一化GAN网络的示例代码: ```python import torch import torch.nn as nn # 定义生成器网络 class Generator(nn.Module): def __init__(self): super(Generator, self).__init__() self.fc = nn.Linear(100, 256) self.relu = nn.ReLU() self.fc2 = nn.Linear(256, 784) self.tanh = nn.Tanh() def forward(self, x): x = self.fc(x) x = self.relu(x) x = self.fc2(x) x = self.tanh(x) return x # 定义判别器网络 class Discriminator(nn.Module): def __init__(self): super(Discriminator, self).__init__() self.fc = nn.Linear(784, 256) self.relu = nn.ReLU() self.fc2 = nn.Linear(256, 1) self.sigmoid = nn.Sigmoid() def forward(self, x): x = self.fc(x) x = self.relu(x) x = self.fc2(x) x = self.sigmoid(x) return x # 对生成器和判别器的权重进行谱归一化 generator = Generator() discriminator = Discriminator() generator = nn.utils.spectral_norm(generator) discriminator = nn.utils.spectral_norm(discriminator) # 训练GAN网络... ``` 这是一个简单的示例,展示了如何在生成器和判别器网络中使用谱归一化。通过对权重进行谱归一化,可以提高GAN网络的稳定性和生成样本的质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值