"""
演示 回归任务的 损失函数
MAE:
Mean Absolute Error, 平均绝对误差
误差绝对值的平均数
类似于L1正则化,理论上权重不可以降到0, 实际工程中会使用小阈值操作来让权重小于某个阈值时强制为0,由此造成权重的稀疏性(存在部分权重为精确0)
缺点:
在0点不平滑,可能错过最小值
MSE: Mean Squared Error, 均方误差
误差平方之和 / 样本总数
缺点:
如果差值过大,可能导致梯度爆炸,无法有效训练模型
Smooth L1:
结合了MAE和MSE, MSE:(-1,1), MAE:(-∞,1]U[1,+∞)
解决L1(MAE)在0点不平滑、以及L2(MSE)的梯度爆炸问题
如何选择回归任务的损失函数
MSE > Smooth L1 > MAE
涉及到的API:
nn.L1Loss()-MAE
nn.MSELoss()-MSE
nn.SmoothL1Loss()
需要掌握的:
nn.MSELoss()
"""
# 导包
import torch
import torch.nn as nn
# 1.定义函数,演示 MAE
def demo01():
# 1.创建 样本的真实值
# 4个样本
y_true = torch.tensor([20.0,21.0,22.0,23.0],dtype=torch.float32)
# 2.创建 模型的预测值
y_pred = torch.tensor([21.0,22.0,23.0,24.0],dtype=torch.float32,requires_grad=True)
# 3.定义损失函数对象
loss_fn = nn.L1Loss()
# 4.计算损失值
loss = loss_fn(y_pred,y_true)
# 5.打印损失值
print(f"损失值:{loss}") # 1
# 2.定义函数,演示 MSE
def demo02():
# 1.创建 样本的真实值
# 4个样本
y_true = torch.tensor([20.0,21.0,22.0,23.0],dtype=torch.float32)
# 2.创建 模型的预测值
y_pred = torch.tensor([21.0,22.0,23.0,24.0],dtype=torch.float32,requires_grad=True)
# 3.定义损失函数对象
loss_fn = nn.MSELoss()
# 4.计算损失值
loss = loss_fn(y_pred,y_true)
# 5.打印损失值
print(f"损失值:{loss}") # 1
# 3.定义函数,演示 Smooth L1 Loss
def demo03():
# 1.创建 样本的真实值
# 4个样本
y_true = torch.tensor([20.0,21.0,22.0,23.0],dtype=torch.float32)
# 2.创建 模型的预测值
y_pred = torch.tensor([21.0,22.0,23.0,24.0],dtype=torch.float32,requires_grad=True)
# 3.定义损失函数对象
loss_fn = nn.SmoothL1Loss()
# 4.计算损失值
loss = loss_fn(y_pred,y_true)
# 5.打印损失值
print(f"损失值:{loss}") # 1
# 测试
if __name__ == "__main__":
# demo01()
# demo02()
demo03()