pytorch loss function.
Cross Entropy
简单来说,交叉熵是用来衡量在给定的真实分布 (p_k) 下,使用非真实分布 (q_k) 所指定的策略 f(x) 消除系统的不确定性所需要付出的努力的大小。交叉熵的越低说明这个策略越好,我们总是 minimize 交叉熵,因为交叉熵越小,就证明算法所产生的策略越接近最优策略,也就间接证明我们的算法所计算出的非真实分布越接近真实分布。交叉熵损失函数从信息论的角度来说,其实来自于 KL 散度,只不过最后推导的新式等价于交叉熵的计算公式:
从信息论的视角来理解: 信息量/信息熵(熵)/交叉熵/条件熵
信息量: 一个事件的信息量就是这个时间发生的概率的负对数,概率越大,所带来的信息就越少嘛。至于为什么是负对数,就要问香农了。。起码要满足(P(X)=1)时信息量为0,且始终大于0 [-log P(X)]
信息熵, 也就是熵,是随机变量不确定性的度量,依赖于事件X的概率分布。即信息熵是信息量的期望。即求离散分布列的期望~~ [H(p) = -sum_{i=1}^np_ilog p_i]
交叉熵: 回归到分类问题来,我们通过score function得到一个结果(10,1),通过softmax函数压缩成0到1的概率分布,我们称为 (q_i=dfrac{e^{f_{y_i}}}{sum_je^{f_j}}) 吧, [H(p,q) = -sum_{i=1}^np_ilog q_i] 这就是我们所说的交叉熵,通过 Gibbs' inequality 知道:(H(p,q)>=H(p)) 恒成立,当且仅当 (q_i) 分布和 (p_i) 相同时,两者相等。
相对熵: 跟交叉熵是同样的概念,(D(p||q)=H(p,q)-H(p)=-sum_{i=1}^np(i)log {dfrac{q(i)}{p(i)}}),又称为KL散度,表征两个函数或概率分布的差异性,差异越大则相对熵越大.
最大似然估计、Negative Log Liklihood(NLL)、KL散度与Cross Entropy其实是等价的,都可以进行互相推导,当然MSE也可以用Cross Entropy进行推导出(详见Deep Learning Book P132)。
BCELoss
Creates a criterion that measures the Binary Cross Entropy between the target and the output
用于二分类的损失函数,也就是 logistic 回归的损失函数。
对于二分类,我们只需要预测出正分类的概率 p,对应的 (1-p) 则是负分类的概率。其中 p 可使用 sigmoid 函数得到。
[sigmoid(x) = dfrac{1}{1+e^{(-x)}}]
对应的损失函数可通过极大似然估计推导得到:
假设有 n 个独立的训练样本 ({(x_1,y_1), ...,(x_n, y_n)})
y 是真实标签,(yin {0,1}), 那么对于每一个样本的概率为: [P(x_i, y_i)=P(y_i=1|x_i)^{y_i}P(y_i=0|x_i)^{1-y_i}] [=P(y_i=1|x_i)^{y_i}(1-P(y_i=1|x_i))^{1-y_i}]
取负对数即可得: [-y_iP(y_i=1|x_i)-(1-y_i)(1-P(y_i=1|x_i))]
不难看出