生成模型基础概念-JS散度和Wasserstein散度

JS散度(Jensen-Shannon Divergence)

JS散度度量了两个概率分布的相似度,基于KL散度的变体,解决了KL散度非对称的问题。一般地,JS散度是对称的,其取值是0到1之间。定义如下:
J S ( P 1 ∣ ∣ P 2 ) = 1 2 K L ( P 1 ∣ ∣ P 1 + P 2 2 ) + 1 2 K L ( P 2 ∣ ∣ P 1 + P 2 2 ) JS(P_1||P_2)=\frac{1}{2}KL(P_1||\frac{P_1+P_2}{2})+\frac{1}{2}KL(P_2||\frac{P_1+P_2}{2}) JS(P1∣∣P2)=21KL(P1∣∣2P1+P2)+21KL(P2∣∣2P1+P2)
存在两个分布,不存在重叠,KL散度值会变得无意义,而JS散度值是一个常数,会导致梯度消失。

Wasserstein散度/距离(Wasserstein Distance)

Wasserstein距离度量两个概率分布之间的距离,对于两个分布 q 1 q_1 q1, q 2 q_2 q2, P t h − W a s s e r s t e i n P^{th}-Wasserstein PthWasserstein距离定义为:

在这里插入图片描述
其中Γ(𝑞1, 𝑞2)是边际分布为𝑞1 和𝑞2 的所有可能的联合分布集合,𝑑(𝑥, 𝑦)为𝑥和𝑦的距离,比如ℓ𝑝 距离等。
如果将两个分布看作是两个土堆,联合分布 𝛾(𝑥, 𝑦) 看作是从土堆 𝑞1 的位置𝑥到土堆𝑞2 的位置𝑦的搬运土的数量,并有
在这里插入图片描述
𝑞1 和𝑞2 为𝛾(𝑥, 𝑦)的两个边际分布。
E ( x , y ) ∼ γ ( x , y ) [ d ( x , y ) p ] E_{(x,y)\sim \gamma(x,y)}[d(x,y)^p] E(x,y)γ(x,y)[d(x,y)p]可以理解为在联合分布𝛾(𝑥, 𝑦)下把形状为𝑞1 的土堆搬运到形状为𝑞2 的土堆所需的工作量,
E ( x , y ) ∼ γ ( x , y ) [ d ( x , y ) p ] = ∑ ( x , y ) γ ( x , y ) d ( x , y ) p E_{(x,y)\sim \gamma(x,y)}[d(x,y)^p]=\sum_{(x,y)}{\gamma(x,y)d(x,y)^p} E(x,y)γ(x,y)[d(x,y)p]=(x,y)γ(x,y)d(x,y)p
其中从土堆 q 1 q_1 q1中的点 x x x到土堆 q 2 q_2 q2中的 y y y的移动土的数量和距离分别为 γ ( x , y ) \gamma(x,y) γ(x,y) d ( x , y ) p d(x,y)^p d(x,y)p。 因此,Wasserstein 距离可以理解为搬运土堆的最小工作量,也称为推土机距离(Earth-Mover’s Distance,EMD)。
在这里插入图片描述
注:图片来自于《神经网络与深度学习》邱锡鹏
Wasserstein距离相比 KL 散度和 JS 散度的优势在于:即使两个分布没有重叠或者重叠非常少,Wasserstein距离仍然能反映两个分布的远近。

import scipy.stats
import numpy as np

u_values, v_values = np.array([1,2,1]), np.array([1,2,1])
u_weights, v_weights=[0,1,2], [3,4,5]
D1=scipy.stats.wasserstein_distance(u_values, v_values, u_weights, v_weights) 
# u_values, v_values:在(经验)分布中观察到的值; 
# u_weights, v_weights: 每个值的权重。如果未指定,则为每个值分配相同的权重,可选。 u_weights (resp. v_weights) 必须与 u_values (resp. v_values) 具有相同的长度。如果权重总和不为 1,则它仍然必须是正数和有限的,以便权重可以归一化为总和为 1。
# return两个分布之间的计算距离
print(D1)

关注+点赞+收藏

生成模型基本概念:信息熵、交叉熵和相对熵(KL散度)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在一维降噪自编码器中,我们可以使用Wasserstein距离来代替KL散度作为损失函数。Wasserstein距离可以更好地处理样本分布之间的差异,因此在训练自编码器时可以更好地保留数据的特征。 以下是使用Wasserstein距离作为损失函数的代码示例: ```python from keras.layers import Input, Dense from keras.models import Model from keras.regularizers import l2 from keras.optimizers import RMSprop import keras.backend as K # 定义Wasserstein距离损失函数 def wasserstein_loss(y_true, y_pred): return K.mean(y_true * y_pred) # 构建自编码器模型 input_data = Input(shape=(input_dim,)) encoded = Dense(encoding_dim, activation='relu', kernel_regularizer=l2(0.001))(input_data) decoded = Dense(input_dim, activation='sigmoid')(encoded) autoencoder = Model(input_data, decoded) # 编译模型 optimizer = RMSprop(lr=0.001) autoencoder.compile(optimizer=optimizer, loss=wasserstein_loss) # 训练模型 autoencoder.fit(x_train, x_train, epochs=100, batch_size=32) ``` 在这个示例中,我们定义了一个名为`wasserstein_loss`的函数来计算Wasserstein距离。我们通过将这个函数传递给模型的`compile`方法来将其作为损失函数使用。 需要注意的是,Wasserstein距离需要一个合适的距离度量,因此模型的输出需要是实数而不是概率。在这个示例中,我们将自编码器的输出层激活函数设置为sigmoid,并且使用MSE损失函数来训练模型。这样做可以保证输出在[0, 1]的范围内,同时也是一个实数。 另外,Wasserstein距离需要使用Wasserstein判别器(也称为critic)来计算梯度。因此,在GAN中,我们通常需要分别训练判别器和生成器,并在每个epoch之后更新判别器的权重。但在自编码器中,我们不需要使用判别器,因为只有一个模型需要训练。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值