1.简介
直入主题,这次来介绍L2loss的原理以及pytorch代码用法。
2.L2loss
L2loss也相当好理解,也叫MSE损失,其实就是计算每个样本的差的平方,公式为:
3.思考
不知道大家会不会一开始有跟我一样的疑问,L1和L2之间不就是平方的关系吗?用它们做损失函数真的会有区别吗?
从结果计算上来说,它们可以说是单纯的平方关系;但是从loss计算来说,由于反向传播时需要对损失函数进行求导,而两者求导函数是不一样的,这时它们的差异性就体现出来了。
可以从下图中看出,L2loss的梯度是处处可导的,所以不会存在着像L1loss那样梯度消失的情况,同时梯度会随着输入绝对值的变大而变大,便于快速收敛。
但是当输入数据较大,预测值和真值的差值也较大时,这是就会可能出现梯度爆炸的情况。所以L2loss也一般适用于回归任务,且数据特征值不大的情况。
4.pytorch代码
以下代码为pytorch官方L1loss代码,可以看到里面有几个参数,我们大多数情况下使用默认参数设置就好。
torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')
其中:
- size_average表示是否将样本的loss进行平均之后输出,默认为true。
- reduce表示是否将输出进行压缩,默认为true。当它为false的时候就会无视size_average。
- reduction表示用怎么的方法进行reduce。可以设置为'none','mean','sum'。
可以看出来和L1loss的用法完全相同,用同样的例子来说明:
import torch
import torch.nn as nn
a = torch.randn((3, 5)) # [m, n]
b = torch.randn((3, 5)) # [m, n]
criterion = nn.MSELoss()
c = criterion(a, b) # [1]
criterion = nn.MSELoss(reduce=False)
c = criterion(a, b) # [m, n]
业务合作/学习交流+v:lizhiTechnology
如果想要了解更多损失函数相关知识,可以参考我的专栏和其他相关文章:
【损失函数】(一) L1Loss原理 & pytorch代码解析_l1 loss-CSDN博客
【损失函数】(二) L2Loss原理 & pytorch代码解析_l2 loss-CSDN博客
【损失函数】(三) NLLLoss原理 & pytorch代码解析_nll_loss-CSDN博客
【损失函数】(四) CrossEntropyLoss原理 & pytorch代码解析_crossentropyloss 权重-CSDN博客
【损失函数】(五) BCELoss原理 & pytorch代码解析_bce损失函数源码解析-CSDN博客
如果想要了解更多深度学习相关知识,可以参考我的其他文章: