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

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

时间:2023-01-13 21:44:07浏览次数:49  
标签:loss 函数 交叉 sum 部件 损失 神经网络 详解 log

一,损失函数概述

大多数深度学习算法都会涉及某种形式的优化,所谓优化指的是改变 \(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://www.cnblogs.com/armcvai/p/17050740.html

相关文章

  • Java 正则表达式详解_正则表达式
    Java正则表达式详解_正则表达式如果你不熟悉这个术语,那么“正则表达式”(RegularExpression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式。​​正则表达式3......
  • Dockerfile文件详解和nginx镜像制作示例
    Dockerfile文件中各个常用的基本命令,共18个指令FROMMAINTAINERRUNCMDLABELEXPOSEENVADDCOPYENTRYPOINTVOLUMEUSERSHELLWORKDIRONBUILDSTOPSIGNALHEALTHCH......
  • 详解Python列表和元组
    (详解Python的列表和元组)1序列序列是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号(称为索引)访问它们。Python序列结构主要有列表、......
  • js中的Class类详解
    什么是类?class类是一种抽象的体现,用来表示具有相同特性的一类事物,是面向对象编程(oop)不可缺少的工具。定义一个简单的类定义一个类为Person,每个Person都会跑,都有名字c......
  • Proxy-Reflect详解
    1.监听对象属性的操作(Es5)constobj={name:"why",age:18,height:1.88}//需求:监听对象属性的所有操作//监听属性的操作......
  • Docker网络详解
    Docker网络模式Docker默认提供了3种网络模式,生成容器时不指定网络模式下默认使用bridge桥接模式。使用命令查看当前Docker所有的网络模式。[root@hahadocker_web]#d......
  • 一文详解 Linux Crontab 调度任务
    最近接到这样一个任务:定期(每天、每月)向“特定服务器”传输“软件服务”的运营数据,因此这里涉及到一个定时任务,计划使用Python语言添加Crontab依赖写一个定时任务的脚本,......
  • 深度学习基本部件-激活函数详解
    本文分析了激活函数对于神经网络的必要性,同时讲解了几种常见的激活函数的原理,并给出相关公式、代码和示例图。激活函数概述前言人工神经元(ArtificialNeuron),简称神经......
  • 使用遗传算法+神经网络解决贪食蛇游戏
    在网上无意看到的一个项目,感觉还是蛮有意思的:https://github.com/greerviau/SnakeAI    ==========================================  代码不知道是用什......
  • 块状链表详解
    引入块状链表,顾名思义,就是把分块和链表结合起来的神奇数据结构。分块区间操作复杂度优秀,但是不能支持插入/删除操作。链表单点插入删除复杂度优秀,但是不能支持大......