首页 > 其他分享 >神经网络基础部件-损失函数详解

神经网络基础部件-损失函数详解

时间:2023-01-16 16:33:54浏览次数:53  
标签:loss 函数 交叉 sum 部件 损失 神经网络 详解 log

本文总结分类和回归任务的常用损失函数,比如重点解析了交叉熵损失函数的由来,并给出详细计算公式和、案例分析、代码,同时也描述了 MAEMSE 损失函数,给出了详细的计算公式、曲线图及优缺点。

一,损失函数概述

大多数深度学习算法都会涉及某种形式的优化,所谓优化指的是改变 $x$ 以最小化或最大化某个函数 $f(x)$ 的任务,我们通常以最小化 $f(x)$ 指代大多数最优化问题。

在机器学习中,损失函数是代价函数的一部分,而代价函数是目标函数的一种类型。

  • 损失函数loss function): 用于定义单个训练样本预测值与真实值之间的误差
  • 代价函数cost function): 用于定义单个批次/整个训练集样本预测值与真实值之间的累计误差。
  • 目标函数objective function): 泛指任意可以被优化的函数。

损失函数定义:损失函数是深度学习模型训练过程中关键的一个组成部分,其通过前言的内容,我们知道深度学习算法优化的第一步首先是确定目标函数形式。

损失函数大致可分为两种:回归损失(针对连续型变量)和分类损失(针对离散型变量)。

常用的减少损失函数的优化算法是“梯度下降法”(Gradient Descent)。

二,交叉熵函数-分类损失

交叉熵损失(Cross-Entropy Loss) 又称为对数似然损失(Log-likelihood Loss)、对数损失,二分类时还可称之为逻辑斯谛回归损失(Logistic Loss)。

2.1,交叉熵(Cross-Entropy)的由来

交叉熵损失的由来参考文档 AI-EDU: 交叉熵损失函数

1,信息量

信息论中,信息量的表示方式:

《深度学习》(花书)中称为自信息(self-information) 。 在本文中,我们总是用 $\text{log}$ 来表示自然对数,其底数为 $e$。

$$ I(x_j) = -\log (p(x_j)) $$

  • $x_j$:表示一个事件
  • $p(x_j)$:表示事件 $x_j$ 发生的概率
  • $I(x_j)$:信息量,$x_j$ 越不可能发生时,它一旦发生后的信息量就越大

2,熵

信息量只处理单个的输出。我们可以用熵(也称香农熵 Shannon entropy)来对整个概率分布中的不确定性总量进行量化:

$$ H(p) = - \sum_j^n p(x_j) \log (p(x_j)) $$

则上面的问题的熵是:

$$ \begin{aligned} H(p)&=-[p(x_1) \ln p(x_1) + p(x_2) \ln p(x_2) + p(x_3) \ln p(x_3)] \\ &=0.7 \times 0.36 + 0.2 \times 1.61 + 0.1 \times 2.30 \\ &=0.804 \end{aligned} $$

3,相对熵(KL散度)

相对熵又称 KL 散度,如果对于同一个随机变量 $x$ 有两个单独的概率分布 $P(x)$ 和 $Q(x)$,则可以使用 KL 散度(Kullback-Leibler (KL) divergence)来衡量这两个分布的差异,这个相当于信息论范畴的均方差。

KL散度的计算公式:

$$ D_{KL}(p||q)=\sum_{j=1}^m p(x_j) \log {p(x_j) \over q(x_j)} $$

$m$ 为事件的所有可能性(分类任务中对应类别数目)。$D$ 的值越小,表示 $q$ 分布和 $p$ 分布越接近

4,交叉熵

把上述交叉熵公式变形:

$$ \begin{aligned} D_{KL}(p||q)&=\sum_{j=1}^m p(x_j) \log {p(x_j)} - \sum_{j=1}^m p(x_j) \log q(x_j) \\ &=- H(p(x)) + H(p,q) \end{aligned} $$

等式的前一部分恰巧就是 $p$ 的熵,等式的后一部分,就是交叉熵(机器学习中 $p$ 表示真实分布(目标分布),$q$ 表示预测分布):

$$ H(p,q) =- \sum_{j=1}^m p(x_j) \log q(x_j) $$

在机器学习中,我们需要评估标签值 $y$ 和预测值 $a$ 之间的差距熵(即两个概率分布之间的相似性),使用 KL 散度 $D_{KL}(y||a)$ 即可,但因为样本标签值的分布通常是固定的,即 $H(a)$ 不变。因此,为了计算方便,在优化过程中,只需要关注交叉熵就可以了。所以,在机器学习中一般直接用交叉熵做损失函数来评估模型

$$ loss = \sum_{j = 1}^{m}y_{j}\text{log}(a_{j}) $$

上式是单个样本的情况,$m$ 并不是样本个数,而是分类个数。所以,对于批量样本的交叉熵损失计算公式(很重要!)是:

$$ J = -\frac{1}{n}\sum_{i=1}^n \sum_{j=1}^{m} y_{ij} \log a_{ij} $$

其中,$n$ 是样本数,$m$ 是分类数。

公式参考文章-AI-EDU: 交叉熵损失函数,但是将样本数改为 $n$,类别数改为 $m$。

有一类特殊问题,就是事件只有两种情况发生的可能,比如“是狗”和“不是狗”,称为 $0/1$ 分类或二分类。对于这类问题,由于 $m=2,y_1=1-y_2,a_1=1-a_2$,所以二分类问题的单个样本的交叉熵可以简化为:

$$ loss =-[y \log a + (1-y) \log (1-a)] $$

二分类对于批量样本的交叉熵计算公式是:

$$ J= -\frac{1}{n} \sum_{i=1}^n [y_i \log a_i + (1-y_i) \log (1-a_i)] $$

为什么交叉熵的代价函数是求均值而不是求和? Cross entropy loss is defined as the “expectation” of the probability distribution of a random variable

标签:loss,函数,交叉,sum,部件,损失,神经网络,详解,log
From: https://blog.51cto.com/armcvai/6010524

相关文章

  • logging 模块详解
    日志记录函数以它们用来跟踪的事件的级别或严重性命名。下面描述了标准级别及其适用性(从高到低的顺序)日志等级(level)描述DEBUG 最详细的日志信息,典型应用场景是问......
  • HelloWorld详解
    1、新建一个文件夹名为Code用以存放代码,2、在文件夹中新建文件,后缀名为.java起名为Hello.java3、然后用Notepad++打开进行编写如下代码publicclassHello{ publics......
  • 1.【窗口组件】小部件-QWidgt
    一、前言QWidget翻译过来是小部件的意思,QWidgt类是所有用户界面对象的基类。窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制......
  • Java方法详解
    Java方法详解何为方法Java方法是语句的集合,它们在一个执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方......
  • 一文详解,数据仓库、数据库、数据中台、数据湖的区别
    数据时代,各行业的企业都已经开始通过数据库来沉淀数据,但是真的论起数据库、数据仓库、数据中台,还是新出现的数据湖,它们的概念和区别,可能知道的人就比较少了,今天我们详细来......
  • 基于EP4CE6E22C8N流水灯实验详解2
    测试文件:testbench这一个文件适用于测试前面写好的代码能否正确运行。在编写好执行的流水灯代码之后,要使用modelsim进行仿真时,需要编写一个testbench文件。这一个文件适用......
  • Kubernetes(k8s) YAML文件详解
    原文网址:https://www.cnblogs.com/liugp/p/16361487.html目录一、yaml文件简介1)yaml的语法规则:2)在Kubernetes中,只需要知道两种结构类型即可:二、yaml常见语法1......
  • 【转载】C# DataSet和DataTable详解
    1、创建DataSet对象:DataSetds=newDataSet("DataSetName");2、查看调用SqlDataAdapter.Fill创建的结构   da.Fill(ds,"Orders");   DataTabletbl=ds.Tab......
  • 基于EP4CE6E22C8N流水灯实验详解1
    器材准备:EP4CE6E22C8N板子,下载器。电路图:逻辑框架因为这是一个流水灯,所以需要有一个时序逻辑关系,也就需要一个时钟信号。所以需要给模块设计一个时钟输入信号。此外,如......
  • (转)Golang - new和make的使用和区别(示例详解)
    原文:https://www.cnblogs.com/beatleC/p/16081832.html前言:Go语言中new和make是内置函数,主要用来创建分配类型内存(相同点:堆上),其功能相似,却有本质区别。引入:变量的声明v......