- 损失函数的作用: 主要用于深度学习中predict与True label “距离”度量或者“相似度度量”,并通过反向传播求梯度,进而通过梯度下降算法更新网络参数,周而复始,通过损失值和评估值反映模型的好坏。
- 损失函数的分类: 主要分为回归损失函数和分类损失函数。
- 回归损失函数: reg_loss(回归预测一个具体的数值,真实的一个具体值),比如我要预测一个矩形框的宽高,一般来说可以使任意值。一般的回归会将预测的值设计到一个较小的范围比如0~1范围内,这样可以加速模型收敛,要不然模型前期预测的数值“乱跳”,出现波动的情况。一般有L1 Loss、L2 Loss、Smooth L1 Loss,以及在一些任务如目标检测中根据场景设置的loss如,IOU Loss、GIOU Loss、DIOU Loss、CIOU Loss。
- 分类损失函数: reg_loss(回归预测一个具体的数值,真实的一个具体值),比如我要预测一个矩形框的宽高,一般来说可以使任意值。一般的回归会将预测的值设计到一个较小的范围比如0~1范围内,这样可以加速模型收敛,要不然模型前期预测的数值“乱跳”,出现波动的情况。一般有CrossEntropy Loss、NLL Loss、KLDiv Loss、BCE Loss、BCE With Logits Loss、Margin Ranking Loss、Hinge Embedding Loss、Huber Loss等。
需要注意的:
pytorch损失函数中一般有size_average、size_average、reduction这三个参数。
这三个参数决定损失函数是1.只求是loss; 2. 对loss求和;3. 对loss求平均。
(deprecated表示此方法已废弃、暂时可用,但以后该方法不会再更新,建议后来人不要调用此方法。)
size_average 和reduce 是deprecated,两个之间是有关系的。目前使用的reduction。
回归问题就是预测出具体的数值,比如我要预测电池电压的具体值,具体值不是固定的,分类问题就是我要预测电池电压值处于故障状态类别还是正常状态类别,类别数目是固定的。
1. L1 Loss(绝对值损失) 介绍L1 Loss即平均绝对误差(Mean Absolute Error, MAE),公式为:
l
(
x
,
y
)
=
1
N
∑
i
=
1
N
∣
x
i
−
y
i
∣
l(x,y) = frac{1}{N}sum_{i=1}^{N}|x_i-y_i|
l(x,y)=N1i=1∑N∣xi−yi∣
就是求预测值和真实值误差的绝对值。
torch.nn.L1Loss(size_average=None, reduce=None, reduction='mean')
from torch import nn loss = nn.L1Loss() # 这里的default值是‘mean’即求平均的,因为反向传播、梯度计算损失值要求是标量值 input = torch.randn(3, 5, requires_grad=True) target = torch.randn(3, 5) output = loss(input, target) output.backward() # 如果损失值是一个向量,则此处会报错
2. L2 Loss (MSE Loss)(平方损失) 介绍:
L2 Loss即均方差(Mean Squred Error, MSE),公式为:
l
(
x
,
y
)
=
1
N
∑
i
=
1
N
(
x
i
−
y
i
)
2
l(x,y) = frac{1}{N}sum_{i=1}^{N}(x_i-y_i)^2
l(x,y)=N1i=1∑N(xi−yi)2
就是求预测值和真实值误差的绝对值。
torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')
from torch import nn loss = nn.MSELoss() # 这里的default值是‘mean’即求平均的,因为反向传播、梯度计算损失值要求是标量值 input = torch.randn(3, 5, requires_grad=True) target = torch.randn(3, 5) output = loss(input, target) output.backward() # 如果损失值是一个向量,则此处会报错
小结: 1. L1 Loss:0处导数不连续,收敛速度慢。 对异常值不敏感,因为是求平均,会忽略掉异常值的作用,一般可用于有少许数据错误的值,这样就可以忽略掉这些错误的离群值。
2. 1. L2 Loss:收敛速度快,对异常值敏感,如果是需要进行异常检测,就不能忽略掉离群值。
假如数据集多数为1000,少数为10,那么L1会偏向1000(因为更偏向于平均),L2则会偏向于10,因为对离群值更敏感,所以实际中这两种都不太可取,所以Smooth L1 Loss可以同时利用两者的优点。
3. Smooth L1 Loss 介绍:
平滑的L1损失(Smooth L1 Loss, SLL),在Faster RCNN中被提出来,公式为: torch.nn.SmoothL1Loss(size_average=None, reduce=None, reduction='mean', beta=1.0)
H
u
b
e
r
L
1
L
o
s
s
=
b
e
t
a
∗
S
m
o
o
t
h
L
1
L
o
s
s
Huber L1 Loss = beta*SmoothL1Loss
HuberL1Loss=beta∗SmoothL1Loss,公式为: torch.nn.HuberLoss(reduction='mean', delta=1.0) 在之前的目标检测中,回归损失都是回归矩形框的四个变量,这样做就默认将四个变量认为是相互独立的,这样“粗暴”的直接回归效果往往不会太好,引入交并比损失(IOU Loss)则可以把四个变量关联起来。 平均绝对误差(Mean Absolute Error, MAE),公式为: 平均绝对误差(Mean Absolute Error, MAE),公式为: 平均绝对误差(Mean Absolute Error, MAE),公式为: 欢迎分享,转载请注明来源:内存溢出
l
(
x
,
y
)
=
{
0.5
(
x
i
−
y
i
)
2
b
e
t
a
,
i
f
∣
x
i
−
y
i
∣
<
b
e
t
a
∣
x
i
−
y
i
∣
−
0.5
∗
b
e
t
a
,
o
t
h
e
r
w
i
s
e
l(x,y)=left{ begin{aligned} frac{0.5(x_i - y_i)^2}{beta}, if |x_i - y_i| < beta \ |x_i-y_i|-0.5*beta, otherwise end{aligned} right.
l(x,y)=⎩⎨⎧beta0.5(xi−yi)2,if∣xi−yi∣
beta的作用:控制什么范围的误差使用MSE,什么范围内的误差内使用MAE。
Smooth L1 Loss的优点:
4. Huber L1 Loss
介绍:
l
(
x
,
y
)
=
{
0.5
(
x
i
−
y
i
)
2
,
i
f
∣
x
i
−
y
i
∣
<
b
e
t
a
b
e
t
a
∗
(
∣
x
i
−
y
i
∣
−
0.5
∗
b
e
t
a
)
,
o
t
h
e
r
w
i
s
e
l(x,y)=left{ begin{aligned} {0.5(x_i - y_i)^2}, if |x_i - y_i| < beta \ beta*(|x_i-y_i|-0.5*beta), otherwise end{aligned} right.
l(x,y)={0.5(xi−yi)2,if∣xi−yi∣
SmoothL1Loss和HuberLoss区别:
4. IOU Loss
介绍:
公式:
L
(
i
o
u
)
=
−
l
n
(
i
o
u
)
L(iou) = -ln(iou)
L(iou)=−ln(iou)
5. GIOU Loss
介绍
l
(
x
,
y
)
=
1
N
∑
i
=
1
N
∣
x
i
−
y
i
∣
l(x,y) = frac{1}{N}sum_{i=1}^{N}|x_i-y_i|
l(x,y)=N1i=1∑N∣xi−yi∣就是求预测值和真实值误差的绝对值。
参数解析:
6. DIOU Loss
介绍
l
(
x
,
y
)
=
1
N
∑
i
=
1
N
∣
x
i
−
y
i
∣
l(x,y) = frac{1}{N}sum_{i=1}^{N}|x_i-y_i|
l(x,y)=N1i=1∑N∣xi−yi∣就是求预测值和真实值误差的绝对值。
参数解析:
7. CIOU Loss
介绍
l
(
x
,
y
)
=
1
N
∑
i
=
1
N
∣
x
i
−
y
i
∣
l(x,y) = frac{1}{N}sum_{i=1}^{N}|x_i-y_i|
l(x,y)=N1i=1∑N∣xi−yi∣就是求预测值和真实值误差的绝对值。
参数解析:
评论列表(0条)