最近在学习Semi-supervised Domain Adaptation via Minimax Entropy (ICCV 2019),里面使用到了条件熵,不怎么了解,看来还是有必要总结一下。
熵. Entropy
在这里我们一般说的是信息熵,并不是热力学的那个熵,是由香农提出来的这个。因为那个时候都是2bit为单位,所以一般底数为2. 定义信息量为
为什么前面有个负号?现在是为了不小于0,所以说熵不小于0一开始就是从这里定义的了。我们把信息量理解成信息的不确定性,一个信息的不确定性越大,那么他的熵(信息量)也就越大。
显然,上面定义的信息量只是一个“点”。我们需要扩展到整个随机变量
求和就是离散型随机变量,积分就是连续型随机变量咯。
相对熵,KL散度。
![1ddabfa76cc8c4d196739f2b46730133.png](https://i-blog.csdnimg.cn/blog_migrate/a3d1393a6119d42901ecbc7ef14c8af9.png)
我们简化一下这个式子:
再看到上面信息熵的定义,就可以发现:
等式左边第一项就是CrossEntropy,交叉熵了。
为什么我们是优化交叉熵而非优化KL散度?
因为很多时候我们默认信息熵是确定的,所以优化交叉熵就等同于优化KL散度。
(题外话:事实上,交叉熵假设数据分布服从Bernbulli distribution,而均方误差MSE假设数据服从Gaussian distribution)
好了终于复习完毕!接下来我们看条件熵。
我们很容易联想到条件概率,不过还是有点差别。条件熵
千万不要想成是这个形式:
条件熵也可以理解成是新的变量的每个值对原变量的分类,求期望。
这里初开始看可能会有疑问:
那么:H(Y|X=天气) = p(X =晴天)*H(Y|X=晴天)+p(X =阴天)*H(Y|X=阴天)
H(Y|X=晴天) = -(p(打机|晴天)*logp(打机|晴天) +p(不打机|晴天)*logp(不打机|晴天) ), 一定要注意期望!
结合实际训练的时候来讨论
假如说我们最大化条件熵,就是在给定的参数条件下,输入对输出的影响不会很大,从而使我们的模型学习到域不变的特征。如何最大化?直接不要负号就ok.
那如果是最小化条件熵呢?这就类似于普通的分类问题了。
代码示例:
事实上在神经网络中,默认当前的
def adentropy(F1, feat, lamda, eta=1.0):
# 不要负号就是最大化条件熵, 让输出每一个概率
out_t1 = F1(feat, reverse=True, eta=eta) #这里是正数,下面就不要负号。
out_t1 = F.softmax(out_t1, -1)
loss_adent = lamda * torch.mean(torch.sum(out_t1 *
(torch.log(out_t1 + 1e-5)), 1))
return loss_adent