参考自:https://mp.weixin.qq.com/s/2oUNYUwkrVUN1fV4zDER7Q
在分类问题模型中,如逻辑回归、神经网络等,在这些模型的最后通常会经过一个sigmoid函数(softmax函数),输出一个概率值(一组概率值),这个概率值反映了预测为正类的可能性(一组概率值反应了所有分类的可能性)。而对于预测的概率分布和真实的概率分布之间,使用交叉熵来计算他们之间的差距。
二分类交叉熵损失公式:
L = 1 N ∑ i L i = 1 N ∑ i − [ y i ⋅ log ( p i ) + ( 1 − y i ) ⋅ log ( 1 − p i ) ] L=\frac{1}{N} \sum_{i} L_{i}=\frac{1}{N} \sum_{i}-\left[y_{i} \cdot \log \left(p_{i}\right)+\left(1-y_{i}\right) \cdot \log \left(1-p_{i}\right)\right] L=N1∑iLi=N1∑i−[yi⋅log(pi)+(1−yi)⋅log(1−pi)]
y i y_i yi 表示样本标签,正类为,负类为0, p i p_i pi 表示样本 i i i预测为正的概率
多分类下的交叉熵损失公式:
L = 1 N ∑ i L i = 1 N ∑ i − ∑ c = 1 M y i c log ( p i c ) L=\frac{1}{N} \sum_{i} L_{i}=\frac{1}{N} \sum_{i}-\sum_{c=1}^{M} y_{i c} \log \left(p_{i c}\right) L=N1∑iLi=N1∑i−∑c=1Myiclog(pic)
M M M 表示类别的数量
y i c y_{ic} yic 表示变量(0或1),如果该类别和样本 i的类别相同就是1,否则是0
p i c p_{ic} pic 表示对于观测样本 i i i 属于类别 c c c 的预测概率。
BCELoss 是CrossEntropyLoss的一个特例,只用于二分类问题
BCELoss前面需要加上Sigmoid函数
torch.nn.BCELoss(weight: Optional[torch.Tensor] = None, size_average=None, reduce=None, reduction: str = 'mean')
参数:
weight:每个分类的缩放权重,传入的大小必须和类别数量一至
size_average:bool类型,为True时,返回的loss为平均值,为False时,返回的各样本的loss之和
reduce:bool类型,返回值是否为标量,默认为True
reduction:string类型,‘none’ | ‘mean’ | 'sum’三种参数值
参数中的weight决定单个样本所占权值,默认为1.0。
Loss_function = torch.nn.BCELoss()
loss = Loss_function(output, target)
在BCELoss的基础上融合了Sigmoid
torch.nn.BCEWithLogitsLoss(weight: Optional[torch.Tensor] = None, size_average=None, reduce=None, reduction: str = 'mean', pos_weight: Optional[torch.Tensor] = None)
参数:
weight:每个分类的缩放权重,传入的大小必须和类别数量一至
size_average:bool类型,为True时,返回的loss为平均值,为False时,返回的各样本的loss之和
reduce:bool类型,返回值是否为标量,默认为True
reduction:string类型,‘none’ | ‘mean’ | 'sum’三种参数值
pos_weight:正样本的权重, 当p>1,提高召回率,当p<1,提高精确度。可达到权衡召回率(Recall)和精确度(Precision)的作用。
多分类的交叉熵函数,在使用前需要对input进行log_softmax处理
torch.nn.NLLLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')
相当于整合了log_softmax和NLLLoss()
torch.nn.CrossEntropyLoss(weight: Optional[torch.Tensor]= None, size_average=None, ignore_index: int = -100, reduce=None, reduction: str = 'mean')
参数:
weight:每个分类的缩放权重,传入的大小必须和类别数量一至
size_average:bool类型,为True时,返回的loss为平均值,为False时,返回的各样本的loss之和
ignore_index:忽略某一类别,不计算其loss,其loss会为0,并且,在采用size_average时,不会计算那一类的loss,除的时候的分母也不会统计那一类的样本
reduce:bool类型,返回值是否为标量,默认为True
reduction:string类型,‘none’ | ‘mean’ | 'sum’三种参数值
KL散度(相对熵)是用来衡量两个概率分布之间的差异。
D ( P ∥ Q ) = ∑ P ( x ) log P ( x ) Q ( x ) \mathrm{D}(\mathrm{P} \| \mathrm{Q})=\sum P(x) \log \frac{P(x)}{Q(x)} D(P∥Q)=∑P(x)logQ(x)P(x)
KL散度可以化简为信息熵和交叉熵
torch.nn.KLDivLoss(size_average=None, reduce=None, reduction: str = 'mean', log_target: bool = False)
参数:
- size_average:bool类型,为True时,返回的loss为平均值,为False时,返回的各样本的loss之和
- reduce:bool类型,返回值是否为标量,默认为True
- reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean
- log_target:默认False,指定是否在日志空间中传递目标
L1范数损失函数,也被称为最小绝对值偏差(LAD),最小绝对值误差(LAE)。总的说来,它是把目标值 Y i Y_i Yi与估计值 f ( x i ) f(x_i) f(xi) 的绝对差值的总和 S S S 最小化:
S = ∑ i = 1 n ∣ Y i − f ( x i ) ∣ S=\sum_{i=1}^{n}\left|Y_{i}-f\left(x_{i}\right)\right| S=∑i=1n∣Yi−f(xi)∣
缺点:
优点:
torch.nn.L1Loss(size_average=None, reduce=None, reduction: str = 'mean')
参数:
- size_average:bool类型,为True时,返回的loss为平均值,为False时,返回的各样本的loss之和
- reduce:bool类型,返回值是否为标量,默认为True
- reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean
torch.nn.functional.l1_loss(input, target, size_average=None, reduce=None, reduction='mean')
L1范数损失函数,也被称为最小平方误(LSE)。总的说来,它是把目标值 Y i Y_i Yi与估计值 f ( x i ) f(x_i) f(xi) 的差值的平方和 S S S 最小化:
S = ∑ i = 1 n ( Y i − f ( x i ) ) 2 S=\sum_{i=1}^{n}\left(Y_{i}-f\left(x_{i}\right)\right)^{2} S=∑i=1n(Yi−f(xi))2
缺点:
优点:
torch.nn.MSELoss(size_average=None, reduce=None, reduction: str = 'mean')
参数:
size_average:bool类型,为True时,返回的loss为平均值,为False时,返回的各样本的loss之和
reduce:bool类型,返回值是否为标量,默认为True
reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean
torch.nn.functional.mse_loss(input, target, size_average=None, reduce=None, reduction='mean')
有人把hinge loss称为铰链损失函数,它可用于“最大间隔(max-margin)”分类,其最著名的应用是作为SVM的损失函数。
L i = ∑ j ≠ y i max ( 0 , s j − s y i + Δ ) L_{i}=\sum_{j \neq y_{i}} \max \left(0, s_{j}-s_{y_{i}}+\Delta\right) Li=∑j=yimax(0,sj−syi+Δ)
torch.nn.HingeEmbeddingLoss(margin: float = 1.0, size_average=None, reduce=None, reduction: str = 'mean')
参数:
- margin:float类型,默认为1.
- size_average:bool类型,为True时,返回的loss为平均值,为False时,返回的各样本的loss之和
- reduce:bool类型,返回值是否为标量,默认为True
- reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean
余弦相似度是机器学习中的一个重要概念,在Mahout等MLlib中有几种常用的相似度计算方法,如欧氏相似度,皮尔逊相似度,余弦相似度,Tanimoto相似度等。其中,余弦相似度是其中重要的一种。余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。
余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦相似度对绝对数值不敏感),公式如下:
sim ( X , Y ) = cos θ = x ⃗ ⋅ y ⃗ ∥ x ∥ ⋅ ∥ y ∥ \operatorname{sim}(X, Y)=\cos \theta=\frac{\vec{x} \cdot \vec{y}}{\|x\| \cdot\|y\|} sim(X,Y)=cosθ=∥x∥⋅∥y∥x⋅y
torch.nn.CosineEmbeddingLoss(margin: float = 0.0, size_average=None, reduce=None, reduction: str = 'mean')
参数:
- margin:float类型,应为-1到1之间的数字,建议为0到0.5,默认值为0
- size_average:bool类型,为True时,返回的loss为平均值,为False时,返回的各样本的loss之和
- reduce:bool类型,返回值是否为标量,默认为True
- reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean