第3关:损失函数

任务描述

本关任务:通过对损失函数的学习,使用 Python 和 Numpy 编写指定损失函数。

相关知识

为了完成本关任务,你需要掌握:

  1. 损失函数概述;
  2. 平均绝对误差损失;
  3. 均方差损失;
  4. 交叉熵损失。

损失函数概述

机器学习中的监督学习本质上是给定一系列训练样本(xi​,yi​),尝试学习 xy 间的映射关系。损失函数(Loss Function)则是这个过程中关键的一个组成部分,用来衡量模型的输出 y^​ 与真实的y之间的差距,给模型的优化指明方向。

平均绝对误差损失

平均绝对误差损失(Mean Absolute Error Loss)是一种常见的损失函数,也称 L1 损失。其基本形式如下:

J_{MAE}=\frac{1}{N}\sum_{i=1}^{N}\left | y_{i}-\hat{y}_{i} \right |

其可视化图像如图1所示:

第3关:损失函数_第1张图片
图1 平均绝对误差损失函数图像

 

从图中可以看出MAE 损失的最小值为 0(当预测等于真实值时),最大值为无穷大。随着预测与真实值绝对误差 ∣y−y^​∣ 的增加,MAE 损失呈线性增长。

均方差损失

均方差损失(Mean Squared Rrror Loss)也是一种在机器学习以及深度学习回归任务中常用的一种损失函数,也成为L2 损失。其基本形式如下:

J_{MAE}=\frac{1}{N}\sum_{i=1}^{N} (y_{i}-\hat{y}_{i})^{2}

2是对于真实值 y=0 ,不同的预测值 [−1.5,1.5]的均方差损失的变化图:

第3关:损失函数_第2张图片


图2 均方差损失函数图像

从图可以看到随着预测值与真实值绝对误差∣y−y^​∣的增加,均方差呈二次方增增加。

交叉熵损失

前面介绍的两种损失函数都是适用于回归问题的,对于分类问题,常用的损失函数是交叉熵损失函数(Cross-entropy Loss)。

######二分类

在进行二分类时,我们通常使用Sigmoid函数将模型的输出压缩到 (0,1) 区间内 y^​i​∈(0,1) ,用来代表给定输入 xi​ ,模型判断为正类的概率。由于只有正负两类,因此同时也得到了负类的概率。基本函数形式如下:

p(y_{i}=1|x_{i})=\hat{y}_{i}

p(y_{i}=0|x_{i})=1-\hat{y}_{i}

将其合并后可得:

p(y_{i}|x_{i})=(\hat{y}_{i})^{y_{i}}(1-\hat{y}_{i})^{1-y_{i}}

假设数据点之间独立同分布,则似然可以表示为:

L(x,y)=\prod_{i=1}^{N}(\hat{y}_{i})(1-\hat{y_{i}})^{1-y_{i}}

对似然取对数,然后加负号变成最小化负对数似然,即为交叉熵损失函数的形式:

J_{CE}=-\sum_{i=1}^{N}y_{i}\log(\hat{y}_{i})+(1-y_{i})\log(1-\hat{y}_{i})

其可视化图像如图3所示:

第3关:损失函数_第3张图片


图3 二分类交叉熵损失函数图像

其中蓝线是目标值为 0时输出不同输出的损失,黄线是目标值为 1 时的损失。可以看到越接近目标值损失越小,随着误差变大,损失呈指数增长。

######多分类

在多分类的任务中,交叉熵损失函数的推导思路和二分类是一样的,变化的地方是真实值 yi​ 现在是一个 One-hot 向量,同时模型输出的压缩由原来的 Sigmoid 函数换成Softmax函数。Softmax 函数将每个维度的输出范围都限定在(0,1)之间,同时所有维度的输出和为1,用于表示一个概率分布。

p(y_{i}|x_{i})=\prod_{k=1}^{K}(\hat{y_{i}^{k}})^{y_{i}^{k}}

其中 k∈K 表示k个类别中的一类,同样的假设数据点之间独立同分布,可得到负对数似然为:

J_{CE}=-\sum_{i=1}^{N}\sum_{k=1}^{K}y_{i}^{k}\log(\hat{y_{i}^{k}})

由于 yi​ 是一个 one-hot 向量,除了目标类为 1 之外其他类别上的输出都为 0,因此上式也可以写为:

J_{CE}=-\sum_{i=1}^{N}y_{i}^{c_{i}}\log(\hat{y_{i}^{c_{i}}})

其中 ci​ 是样本 xi​ 的目标类。通常这个应用于多分类的交叉熵损失函数也被称为 Softmax Loss 或者 Categorical Cross Entropy Loss

####编程要求

根据提示,在右侧编辑器 Begin-End 区间补充代码,完成对应损失函数的编写。其中,交叉损失函数为二分类情况下的损失函数。只有当三个损失函数同时实现成功后,才可通过测试。

测试说明

平台会对你编写的代码进行测试:

测试输入:无

预期输出:

True

参考资料

【1】损失函数


开始你的任务吧,祝你成功!

import numpy as np

class Loss(object):

    def mean_absolute_loss(self,y_hat,y,n):
        """
        平均绝对误差损失
        :param y_hat: 预测结果
        :param y: 真实结果
        :param n: 样本数量
        :return: 损失函数计算结果
        """
        ########## Begin ##########
        loss = abs(y_hat - y)
        loss = np.sum(loss) / n
        ########## End ##########
        return loss

    def mean_squared_loss(self,y_hat,y,n):
        """
        均方差损失
        :param y_hat: 预测结果
        :param y: 真实结果
        :param n: 样本数量
        :return: 损失函数计算结果
        """
        ########## Begin ##########
        loss = (y_hat - y) ** 2
        loss = np.sum(loss) / n
        ########## End ##########
        return loss

    def cross_entropy_loss(self,y_hat,y,n):
        """
        交叉熵损失
        :param y_hat: 预测结果
        :param y: 真实结果
        :param n: 样本个数
        :return: 损失函数计算结果
        """
        ########## Begin ##########
        # loss = -np.sum(y*np.log(y_hat)) + (1-y)*np.log(1-y_hat)
        loss = y_hat * np.log2(y) + (1 - y) * np.log2(1 - y)
        loss = np.sum(loss)
        loss = loss / (-n)
        ########## End ##########
        return loss


你可能感兴趣的:(神经网络学习,python,人工智能)