若 x = [ x 1 ⋯ x i ⋯ x n ] x = \left[ \begin{matrix} x_1 \\ \cdots \\ x_i \\ \cdots \\x_n \end{matrix} \right] x=⎣⎢⎢⎢⎢⎡x1⋯xi⋯xn⎦⎥⎥⎥⎥⎤,
那么 S o f t m a x ( x ) = [ e x 1 ∑ k e x k ⋯ e x i ∑ k e x k ⋯ e x n ∑ k e x k ] Softmax(x) = \left[ \begin{matrix} \frac{e^{x_1}}{\sum_k e^{x_k}} \\ \cdots \\ \frac{e^{x_i}}{\sum_k e^{x_k}} \\ \cdots \\\frac{e^{x_n}}{\sum_k e^{x_k}} \end{matrix} \right] Softmax(x)=⎣⎢⎢⎢⎢⎢⎡∑kexkex1⋯∑kexkexi⋯∑kexkexn⎦⎥⎥⎥⎥⎥⎤
若 y = S o f t m a x ( x ) y = Softmax(x) y=Softmax(x), 那么对于任意 y i y_i yi 有以下特点:
相同的问题:
由于 Softmax 函数具有保序性,在推理时,去掉 Softmax 也总能找到最大概率的类别,去掉与否有什么差别?
在推理阶段 为 样本 X X X 分配最优的类别 Y Y Y 实际上有三类模型,对应三种层次的需求。
{ 生 成 模 型 判 别 模 型 判 别 函 数 \begin{cases} 生成模型\\ 判别模型 \\ 判别函数 \end{cases} ⎩⎪⎨⎪⎧生成模型判别模型判别函数
生成模型
判别模型
判别函数
解答:
S o f t m a x Softmax Softmax 函数一般对应判别函数
将 S o f t m a x Softmax Softmax 作为 L o s s Loss Loss 的一部分,可以认为你得到一个判别模型。
如果不关心模型决策的条件概率分布,那么去掉 S o f t m a x Softmax Softmax 没有什么差别。
本质上,KL散度度量的是两者之间的信息损失,而不是两者之间的距离。
定义:
给定两个概率分布 p , q p,q p,q ,其交叉熵为:
H ( p , q ) = − ∑ i = 1 n p ( x i ) ⏟ 信 息 传 递 方 式 l o g q ( x i ) ⏟ 传 递 的 信 息 H(p,q) = -\sum_{i=1}^n \underbrace{p(x_i)}_{信息传递方式} \ \ \underbrace{log \ q(x_i)}_{传递的信息} H(p,q)=−i=1∑n信息传递方式 p(xi) 传递的信息 log q(xi)
其 中 p ( x ) 表 示 正 确 分 布 , q ( x ) 表 示 预 测 分 布 。 其中 p(x) 表示正确分布,q(x) 表示预测分布。 其中p(x)表示正确分布,q(x)表示预测分布。
作用:
K L ( p ∣ ∣ q ) = H ( p , q ) ⏟ 交 叉 熵 + ( − H ( p ) ) ⏟ 常 量 KL(p||q)= \underbrace{H(p,q)}_{交叉熵} + \underbrace{(-H(p))}_{常量} KL(p∣∣q)=交叉熵 H(p,q)+常量 (−H(p))
D K L ( p ∣ ∣ q ) = − H ( p ) + H ( p , q ) = ∑ i = 1 n p ( x i ) l o g p ( x i ) − ∑ i = 1 n p ( x i ) l o g q ( x i ) = − H ( p ( x ) ) + [ − ∑ i = 1 n p ( x i ) l o g q ( x i ) ] = − H ( p ) + H ( p , q ) \begin{aligned}D_{KL}(p||q) &= -H(p) + H(p,q) \\ &=\sum_{i=1}^n p(x_i) \ log \ p(x_i) - \sum_{i=1}^n p(x_i) \ log \ q(x_i) \\ &= -H(p(x)) + [- \sum_{i=1}^n p(x_i) \ log \ q(x_i)] \\ &= -H(p) + H(p,q)\end{aligned} DKL(p∣∣q)=−H(p)+H(p,q)=i=1∑np(xi) log p(xi)−i=1∑np(xi) log q(xi)=−H(p(x))+[−i=1∑np(xi) log q(xi)]=−H(p)+H(p,q)
L o s s = − ∑ i y i l o g y i ^ Loss = - \sum_i y_i log \hat{y_i} Loss=−i∑yilogyi^
L o s s = − ∑ i y i l o g y i ^ = − [ y 0 l o g y 0 ^ + y 1 l o g y 1 ^ ] 令 y 1 = 1 − y 0 , y 1 ^ = 1 − y 0 ^ 所 以 = − [ y 0 l o g y 0 ^ + ( 1 − y 0 ) l o g ( 1 − y 0 ^ ) ] \begin{aligned}Loss &= - \sum_i y_i log \hat{y_i} \\ & = -[y_0 log\hat{y_0} + y_1 log\hat{y_1}]\\ & 令 y_1 = 1 - y_0, \hat{y_1} = 1 - \hat{y_0} \\ 所以 & = -[y_0 log\hat{y_0} + (1 - y_0) log(1 - \hat{y_0})] \end{aligned} Loss所以=−i∑yilogyi^=−[y0logy0^+y1logy1^]令y1=1−y0,y1^=1−y0^=−[y0logy0^+(1−y0)log(1−y0^)]
符号 | 符号说明 | 维度 |
---|---|---|
N | 输出层神经元的数量 | 标量 |
z | Softmax 的输入 | N × 1 N × 1 N×1 |
a a a | Softmax 的输出;预测值 | N × 1 N × 1 N×1 |
Y | L a b e l Label Label;是一个One-hot 向量 | N × 1 N × 1 N×1 |
数学公式表示
L o s s = − ∑ i N y i l o g a Loss = - \sum_i^N y_i log a Loss=−i∑Nyiloga
a = S o f t m a x ( z ) 其 中 , a = { a 1 , a 2 , . . . , a N } a = Softmax(z) \\ 其中,a = \{{a_1}, {a_2},..., {a_N} \} a=Softmax(z)其中,a={a1,a2,...,aN}
遵循从单个到整体的求梯度原则,我们只需要计算 ∂ L o s s ∂ z i \frac{\partial Loss}{\partial z_i} ∂zi∂Loss
根据链式求导法则: ∂ L o s s ∂ z i = ∑ j N ∂ L o s s ∂ a j ∂ a j ∂ z i \frac{\partial Loss}{\partial z_i} = \sum_j^N \frac{\partial Loss}{\partial {a_j}} \frac{\partial {a_j}}{\partial z_i} ∂zi∂Loss=∑jN∂aj∂Loss∂zi∂aj
∂ a j ∂ z i = ∂ e z j ∑ k N e z k ∂ z i = ∂ e z j ∂ z i ∑ k N e z k − e z j ∂ ∑ k N e z k ∂ z i ( ∑ k N e z k ) 2 \begin{aligned} \frac{\partial {a_j}}{\partial z_i} &= \frac{\partial \frac{e^{z_j}}{\sum_k^N e^{z_k}}}{\partial z_i}\\ &= \frac{ \frac{\partial e^{z_j}}{\partial z_i} \sum_k^N e^{z_k} - e^{z_j} \frac{\partial \sum_k^N e^{z_k}}{\partial z_i} }{ (\sum_k^N e^{z_k})^2 } \end{aligned} ∂zi∂aj=∂zi∂∑kNezkezj=(∑kNezk)2∂zi∂ezj∑kNezk−ezj∂zi∂∑kNezk
上 式 = e z j ∑ k N e z k − e z j e z i ( ∑ k N e z k ) 2 = e z j ∑ k N e z k − e z j ∑ k N e z k e z i ∑ k N e z k = a j − a j a i \begin{aligned} 上式&= \frac{ e^{z_j} \sum_k^N e^{z_k} - e^{z_j} e^{z_i} }{ (\sum_k^N e^{z_k})^2 } \\ & = \frac{e^{z_j}}{\sum_k^N e^{z_k}} - \frac{e^{z_j}}{\sum_k^N e^{z_k}} \frac{e^{z_i}}{\sum_k^N e^{z_k}} \\ & = a_j - a_j a_i \end{aligned} 上式=(∑kNezk)2ezj∑kNezk−ezjezi=∑kNezkezj−∑kNezkezj∑kNezkezi=aj−ajai
上 式 = 0 ∗ ∑ k N e z k − e z j e z i ( ∑ k N e z k ) 2 = 0 − e z j ∑ k N e z k e z i ∑ k N e z k = − a j a i \begin{aligned} 上式&= \frac{ 0* \sum_k^N e^{z_k} - e^{z_j} e^{z_i} }{ (\sum_k^N e^{z_k})^2 } \\ &= 0 - \frac{e^{z_j}}{\sum_k^N e^{z_k}} \frac{e^{z_i}}{\sum_k^N e^{z_k}} \\ &= - a_j a_i \end{aligned} 上式=(∑kNezk)20∗∑kNezk−ezjezi=0−∑kNezkezj∑kNezkezi=−ajai
总结: ∂ a j ∂ z i = { − a j a i ( j ≠ i ) a j − a j a i ( j = i ) \begin{aligned} \frac{\partial a_j}{\partial {z_i}} &= \begin{cases} -a_j a_i \qquad (j \neq i) \\ a_j - a_j a_i \qquad (j = i) \end{cases} \end{aligned} ∂zi∂aj={−ajai(j=i)aj−ajai(j=i)
∂ L o s s ∂ z i = ∑ j = 1 N ∂ L o s s ∂ a j ∂ a j ∂ z i = ∑ j = 1 N − y j a j ( a j 1 i = j − a j a i ) = − y j a j ( a j − a j a i ) ⏞ i = j 的 情 况 + ∑ j = 1 ; i ≠ j N y j a j a j a i = − y i + y i a i + ∑ j = 1 ; i ≠ j N y j a i = − y i + a i ( y i + ∑ j = 1 ; i ≠ j N y j ) = − y i + a i \begin{aligned} \frac{\partial Loss}{\partial z_i} &= \sum_{j=1}^N \frac{\partial Loss}{\partial {a_j}} \frac{\partial {a_j}}{\partial z_i} \\ &=\sum_{j=1}^N - \frac{y_j}{a_j} (a_j \mathbf{1}_{i=j} - a_j a_i) \\ &= \overbrace{- \frac{y_j}{a_j}(a_j - a_j a_i)}^{i=j的情况} + \sum_{j=1; i\neq j}^N \frac{y_j}{a_j} a_j a_i \\ &=-y_i + y_i a_i + \sum_{j=1; i\neq j}^N y_j a_i \\ &= - y_i + a_i(y_i + \sum_{j=1; i\neq j}^N y_j) \\ &= -y_i + a_i \end{aligned} ∂zi∂Loss=j=1∑N∂aj∂Loss∂zi∂aj=j=1∑N−ajyj(aj1i=j−ajai)=−ajyj(aj−ajai) i=j的情况+j=1;i=j∑Najyjajai=−yi+yiai+j=1;i=j∑Nyjai=−yi+ai(yi+j=1;i=j∑Nyj)=−yi+ai
import torch
import torch.nn as nn
import numpy as np
''' 1、输入变量'''
input = torch.tensor(tensor([
[-1.0606, 1.5613, 1.2007, -0.2481],
[-1.9652, -0.4367, -0.0645, -0.5104],
[ 0.1011, -0.5904, 0.0243, 0.1002]
]))
''' 2、label 标签,表示真实分布 p(x)'''
label=torch.tensor([0,2,1])
''' 3、Softmax 函数,得到预测分布 q(x)
注意:当 dim=1 时,注意转置操作。
np.sum(np.exp(x),axis=1 得到的维度是 1 × 3
'''
def softmax(x, dim = 0):
if dim == 0:
return np.exp(x)/np.sum(np.exp(x),axis=0)
else:
return np.exp(x).T /np.sum(np.exp(x),axis=1)
''' 4、计算交叉熵损失'''
loss =-np.sum(label*np.log(softmax(x)))
print(loss)
import torch
import torch.nn as nn
input = torch.tensor(tensor([
[-1.0606, 1.5613, 1.2007, -0.2481],
[-1.9652, -0.4367, -0.0645, -0.5104],
[ 0.1011, -0.5904, 0.0243, 0.1002]
]))
target = torch.tensor([0,2,1])
Softmax_dim1 = nn.Softmax(dim=1)
Nll_loss = nn.NLLLoss()
print(Nll_loss(torch.log(Softmax_dim1(input)), target))
'''
tensor(2.0374)
'''
import torch
import torch.nn as nn
input = torch.tensor(tensor([
[-1.0606, 1.5613, 1.2007, -0.2481],
[-1.9652, -0.4367, -0.0645, -0.5104],
[ 0.1011, -0.5904, 0.0243, 0.1002]
]))
target = torch.tensor([0,2,1])
Cross_loss = nn.CrossEntropyLoss()
print(Cross_loss(input, target))
'''
tensor(2.0374)
'''
# *******************************************#
torch.nn.CrossEntropyLoss(weight=None,ignore_index=-100, reduction='mean')
'''
weight (Tensor, optional)
– 自定义的每个类别的权重. 必须是一个长度为 C 的 Tensor
ignore_index (int, optional)
– 设置一个目标值, 该目标值会被忽略, 从而不会影响到 输入的梯度。
reduction-三个值,
none: 不使用约简;
mean:返回loss和的平均值;
sum:返回loss的和。
默认:mean。
'''
1、几个常用的计算两个概率分布之间距离的方法以及python实现
2、信息熵及其相关概念