实现非常简单,为什么用这种形式?
- 减少方差,还是保持变差不变
if kl_penalty == "low_var_kl":
kl = ref_logprob - logprob
ratio = torch.exp(kl)
kld = (ratio - kl - 1).contiguous()
return torch.clamp(kld, min=-10, max=10)
KL散度和F散度之间的关系
- f是凸函数
- 期望Eq[r]=1E_q[r]=1Eq[r]=1
- f散度是非负的!KL散度也就是非负的!

关于KL和RKL在f散度下的不同表达
这也是为啥对于KL(p||q)对应xf(x)的原因:
KL(p∣∣q)=Df(p∣∣q)=∑xq(x)p(x)q(x)logp(x)q(x)=Ex∼q(rlogr)
KL(p||q)=D_f(p||q)=\sum_{x}q(x)\frac{p(x)}{q(x)}log\frac{p(x)}{q(x)}=E_{x \sim q}(rlogr)
KL(p∣∣q)=Df(p∣∣q)=x∑q(x)q(x)p(x)logq(x)p(x)=Ex∼q(rlogr)

关于Bregman散度
Bregman散度实际上是曲线和它的垂直切面距离:

不管是KL(p||q)还是KL(q||p)都是通过转换成Bregman散度来减少方差!
详细解释来自http://joschu.net/blog/kl-approx.html

KL散度与Bregman散度的关系
155

被折叠的 条评论
为什么被折叠?



