【基础回顾】在回归任务中常见的损失函数比较(mse、mae、huber)

663 阅读2分钟

前言

  在机器学习中的回归任务算法模型中我们常常会碰到求解目标的最大值或最小值,在最小化的场景下,目标函数又称为损失函数。在实操中我们在选择损失函数往往会考虑该函数是否能够完美适配当前的任务,比如是否会出现异常值等。本文在这里为大家带来的是回归任务中具有代表性的3个损失函数

函数简介

1. L1 loss

L1 loss:为平均绝对误差。是指预测值和真实值之间的距离的平均值。

优点: 对异常值具有较好的鲁棒性
缺点: 对于很小的损失,梯度也会很大,不利于模型的收敛

2. L2 loss

L2 loss:为均方根误差。是指模型预测值与真实样本之间的差值平方

优点: 计算方便,衡量误差较为准确;梯度随着误差的增大而减小,收敛效果好。
缺点: 对离群的点比较敏感,受影响较大。

3.HUBER loss

HUBER loss : 整合了MAE&MSE各自的优点,同时避免了其缺点

优点: 对异常值的检测更具鲁棒性;在最优点附近由于调整为MSE,有助于函数收敛
缺点: 需要额外的引入超参,需要调试;临界点delta处不可导

函数实操

  模拟数据的输入与输出,输入采用生成随机数的方式生成,输出为输入的0.8到1.2之间随机数的乘积;损失函数我们选择torch.nn自带的损失函数模块。这样我们便完成了输入、输出和损失函数。

结果图像

1. MSE

MSE.png

2. MAE

MAE.png

3. HUBER

HUBER.png

附录源码

import random
import matplotlib.pyplot as p
import torch

# 选择损失函数MSE

loss_mse = torch.nn.MSELoss()
loss_mae = torch.nn.L1Loss()
loss_huber = torch.nn.SmoothL1Loss()


def MakeDatas():
    targets_list = []
    inputs_list = []
    x = []
    for i in range(100):
        inputs = random.uniform(1, 100)
        targets = inputs * random.uniform(0.8, 1.2)
        inputs, targets = torch.tensor(inputs), torch.tensor(targets)

        x.append(i)
        inputs_list.append(inputs)
        targets_list.append(targets)
    return x, inputs_list, targets_list


if __name__ == "__main__":
    x, inputs_list, targets_list = MakeDatas()
    mseList = []
    maeList = []
    huberList = []

    for j in range(100):
        mse = loss_mse(inputs_list[j], targets_list[j])
        mae = loss_mae(inputs_list[j], targets_list[j])
        huber = loss_huber(inputs_list[j], targets_list[j])

        mseList.append(mse)
        maeList.append(mae)
        huberList.append(huber)

    p.figure(1)
    p.plot(x, inputs_list, label="inputs", color='red')
    p.plot(x, targets_list, label="targets", color='green')
    p.plot(x, mseList, label="loss", color='blue')
    p.title('mse')
    p.legend()
    p.show()

    p.figure(2)
    p.plot(x, inputs_list, label="inputs", color='red')
    p.plot(x, targets_list, label="targets", color='green')
    p.plot(x, maeList, label="loss", color='blue')
    p.title('mae')
    p.legend()
    p.show()

    p.figure(3)
    p.plot(x, inputs_list, label="inputs", color='red')
    p.plot(x, targets_list, label="targets", color='green')
    p.plot(x, huberList, label="loss", color='blue')
    p.title('huber')
    p.legend()
    p.show()

结尾

  本次实验较为草率,如有不到之处,还望大佬们批评指正