“天作之合”softmax与CrossEntropy

本文从 max \text{max} max logsumexp ⁡ \operatorname{logsumexp} logsumexp,再到 softmax \text{softmax} softmax进行了一个简单推导,最后说明了 softmax \text{softmax} softmax与CrossEntropy的关系。希望帮助大家理解多分类损失函数CrossEntropy。

max

首先,给出 max \text{max} max 函数的表达式
max ⁡ ( x 1 , x 2 , … , x n ) = lim ⁡ K → + ∞ 1 K log ⁡ ( ∑ i = 1 n e K x i ) \max \left(x_{1}, x_{2}, \ldots, x_{n}\right)=\lim _{K \rightarrow+\infty} \frac{1}{K} \log \left(\sum_{i=1}^{n} e^{K x_{i}}\right) max(x1,x2,,xn)=K+limK1log(i=1neKxi)

这个式子怎么来的,详见:链接

然后,选定常数 K K K,就有近似
max ⁡ ( x 1 , x 2 , … , x n ) ≈ 1 K log ⁡ ( ∑ i = 1 n e K x i ) \max \left(x_{1}, x_{2}, \ldots, x_{n}\right) \approx \frac{1}{K} \log \left(\sum_{i=1}^{n} e^{K x_{i}}\right) max(x1,x2,,xn)K1log(i=1neKxi)

在模型中,很多时候可以设 K = 1 K=1 K=1 ,这等价于把 K K K 融合到模型自身之中,所以最简单地有 max \text{max} max的光滑近似:
max ⁡ ( x 1 , x 2 , … , x n ) ≈ log ⁡ ( ∑ i = 1 n e x i ) ≜ logsumexp ⁡ ( x 1 , x 2 , … , x n ) \begin{aligned} \max \left(x_{1}, x_{2}, \ldots, x_{n}\right) & \approx \log \left(\sum_{i=1}^{n} e^{x_{i}}\right) \\ & \triangleq \operatorname{logsumexp}\left(x_{1}, x_{2}, \ldots, x_{n}\right) \end{aligned} max(x1,x2,,xn)log(i=1nexi)logsumexp(x1,x2,,xn)

很多时候 x x x 也是学习而来的,直接设 K = 1 K=1 K=1 ,相当于让模型自己决定 K K K 的大小

softmax

softmax \text{softmax} softmax不是 max \text{max} max的光滑近似,而是 onehot ⁡ ( arg ⁡ max ⁡ ( x ) ) \operatorname{onehot}(\arg \max (\boldsymbol{x})) onehot(argmax(x))的光滑近似

onehot ⁡ ( arg ⁡ max ⁡ ( x ) ) \operatorname{onehot}(\arg \max (\boldsymbol{x})) onehot(argmax(x)):先求出最大值所在的位置,然后生成一个等长的向量,最大值那一位置1,其它位置都置0。例如:
[ 2 , 1 , 4 , 5 , 3 ] → [ 0 , 0 , 0 , 1 , 0 ] [2,1,4,5,3] \quad \rightarrow \quad[0,0,0,1,0] [2,1,4,5,3][0,0,0,1,0]

简单推导 logsumexp=>softmax  \text { logsumexp=>softmax }  logsumexp=>softmax 

给出向量 x = [ x 1 , x 2 , … , x n ] \boldsymbol{x}=\left[x_{1}, x_{2}, \ldots, x_{n}\right] x=[x1,x2,,xn],然后每一位都减去整体的最大值,得到 x ′ = [ x 1 , x 2 , … , x n ] − max ⁡ ( x 1 , x 2 , … , x n ) \boldsymbol{x}^{\prime}=\left[x_{1}, x_{2}, \ldots, x_{n}\right]-\max \left(x_{1}, x_{2}, \ldots, x_{n}\right) x=[x1,x2,,xn]max(x1,x2,,xn),这样新向量 x ′ \boldsymbol{x}^{\prime} x与原向量 x \boldsymbol{x} x最大值所在位置是一样的,即 onehot ( arg ⁡ max ⁡ ( x ) ) = onehot ⁡ ( arg ⁡ max ⁡ ( x ′ ) ) \text{onehot}(\arg \max (\boldsymbol{x}))=\operatorname{onehot}\left(\arg \max \left(\boldsymbol{x}^{\prime}\right)\right) onehot(argmax(x))=onehot(argmax(x))

不失一般性,假设 x 1 , x 2 , … , x n x_{1}, x_{2}, \ldots, x_{n} x1,x2,,xn两两不相等,那么新向量 x ′ \boldsymbol{x}^{\prime} x的最大值显然为0,并且除去最大值外,其余各位都是负数。

那么,考虑对新向量 x ′ \boldsymbol{x}^{\prime} x取指数得到
e x ′ = [ e x 1 − max ⁡ ( x 1 , x 2 , … , x n ) , e x 2 − max ⁡ ( x 1 , x 2 , … , x n ) , … , e x n − max ⁡ ( x 1 , x 2 , … , x n ) ] e^{\boldsymbol{x}^{\prime}}=\left[e^{x_{1}-\max \left(x_{1}, x_{2}, \ldots, x_{n}\right)}, e^{x_{2}-\max \left(x_{1}, x_{2}, \ldots, x_{n}\right)}, \ldots, e^{x_{n}-\max \left(x_{1}, x_{2}, \ldots, x_{n}\right)}\right] ex=[ex1max(x1,x2,,xn),ex2max(x1,x2,,xn),,exnmax(x1,x2,,xn)]

作为 onehot ( arg ⁡ max ⁡ ( x ′ ) ) \text{onehot}\left(\arg \max \left(\boldsymbol{x}^{\prime}\right)\right) onehot(argmax(x)) 的近似,因为最大值为0,所以对应的位置是 e 0 = 1 e^{0}=1 e0=1 ,而其余为负,取指数后会比较接近于 0。

此时,将 max ⁡ ( x 1 , x 2 , … , x n ) ≈ log ⁡ ( ∑ i = 1 n e x i ) \max \left(x_{1}, x_{2}, \ldots, x_{n}\right) \approx \log \left(\sum_{i=1}^{n} e^{x_{i}}\right) max(x1,x2,,xn)log(i=1nexi)带入上式得到
onehot ⁡ ( arg ⁡ max ⁡ ( x ) ) = onehot ⁡ ( arg ⁡ max ⁡ ( x ′ ) ) ≈ ( e x 1 ∑ i = 1 n e x i , e x 2 ∑ i = 1 n e x i , … , e x n ∑ i = 1 n e x i ) ≜ softmax ⁡ ( x 1 , x 2 , … , x n ) \begin{aligned} \operatorname{onehot}(\arg \max (\boldsymbol{x})) &=\operatorname{onehot}\left(\arg \max \left(\boldsymbol{x}^{\prime}\right)\right) \\ & \approx\left(\frac{e^{x_{1}}}{\sum_{i=1}^{n} e^{x_{i}}}, \frac{e^{x_{2}}}{\sum_{i=1}^{n} e^{x_{i}}}, \ldots, \frac{e^{x_{n}}}{\sum_{i=1}^{n} e^{x_{i}}}\right) \\ & \triangleq \operatorname{softmax}\left(x_{1}, x_{2}, \ldots, x_{n}\right) \end{aligned} onehot(argmax(x))=onehot(argmax(x))(i=1nexiex1,i=1nexiex2,,i=1nexiexn)softmax(x1,x2,,xn)

softmax的作用


softmax \text{softmax} softmax的作用是把一个序列,变成概率。
P ( x ) : [ x 1 x 2 ⋯ x n ] → [ P 1 P 2 ⋯ P n ] P(\mathbf{x}):\left[\begin{array}{c} x_{1} \\ x_{2} \\ \cdots \\ x_{n} \end{array}\right] \rightarrow\left[\begin{array}{c} P_{1} \\ P_{2} \\ \cdots \\ P_{n} \end{array}\right] P(x): x1x2xn P1P2Pn
P j = e x j ∑ i = 1 n e x i ∀ j ∈ 1 ⋯ N P_{j}=\frac{e^{x_{j}}}{\sum_{i=1}^{n} e^{x_{i}}} \quad \forall j \in 1 \cdots N Pj=i=1nexiexjj1N
从概率的角度解释 softmax \text{softmax} softmax 的话,就是
P j = P ( y = j ∣ x ) P_{j}=\boldsymbol{P}(y=j \mid x) Pj=P(y=jx)

softmax的实现以及数值稳定性

代码实现:

def softmax(x):"""Compute the softmax of vector x."""exps = np.exp(x)return exps / np.sum(exps)

但是这种方法非常的不稳定。因为这种方法要算指数,只要你的输入稍微大一点,比如:
[ 10000 , 20000 , 30000 ] [10000,20000,30000] [10000,20000,30000]
分母上就是
e 10000 + e 20000 + e 30000 e^{10000}+e^{20000}+e^{30000} e10000+e20000+e30000
很明显,在计算上一定会溢出。

解决办法:在分子分母上都乘上一个系数,减小数值大小,同时保证整体还是对的
P j = e x j ∑ i = 1 n e x i = C e x j ∑ i = 1 n C e x i P_{j}=\frac{e^{x_{j}}}{\sum_{i=1}^{n} e^{x_{i}}}=\frac{C e^{x_{j}}}{\sum_{i=1}^{n} C e^{x_{i}}} Pj=i=1nexiexj=i=1nCexiCexj
常数 C C C吸收进指数里面
P j = e x j + log ⁡ ( C ) ∑ i = 1 n e x i + log ⁡ ( C ) P j = e x j + D ∑ i = 1 n e x i + D \begin{aligned} P_{j} &=\frac{e^{x_{j}+\log (C)}}{\sum_{i=1}^{n} e^{x_{i }+\log (C)}} \\ P_{j} &=\frac{e^{x_{j}+D}}{\sum_{i=1}^{n} e^{x_{i}+D}} \end{aligned} PjPj=i=1nexi+log(C)exj+log(C)=i=1nexi+Dexj+D
这里的 D D D一般取 D = − max ⁡ ( x 1 , x 2 , ⋯ , x n ) D=-\max \left(x_{1}, x_{2}, \cdots, x_{n}\right) D=max(x1,x2,,xn)

代码实现:

def stablesoftmax(x):"""Compute the softmax of vector x in a numerically stable way."""shiftx = x - np.max(x)exps = np.exp(shiftx)return exps / np.sum(exps)

输入差别过大时,还是会有数值稳定性问题。
Softmax_Cross_Entropy的实现方式如下
log ⁡ ( P j ) = log ⁡ ( e x j ∑ i = 1 i e x i ) = log ⁡ ( e x j ) − log ⁡ ( ∑ i = 1 n e x i ) = x j − log ⁡ ( ∑ i = 1 n e x i ) \begin{gathered} \log \left(P_{j}\right)=\log \left(\frac{e^{x_{j}}}{\sum_{i=1}^{i} e^{x_{i}}}\right) \\ =\log \left(e^{x_{j}}\right)-\log \left(\sum_{i=1}^{n} e^{x_{i}}\right) \\ =x_{j}-\log \left(\sum_{i=1}^{n} e^{x_{i}}\right) \end{gathered} log(Pj)=log(i=1iexiexj)=log(exj)log(i=1nexi)=xjlog(i=1nexi)
LogSoftmax省了一个指数计算,省了一个除法,数值上相对稳定一些。

softmax与CrossEntropy

softmax \text{softmax} softmax本身没有太大关系,只是把这两个放在一起计算,算起来更快,数值稳定性也更好一些。

CrossEntropy


交叉熵本质是衡量两个概率分布的距离的,而softmax能把一切转换成概率分布,那么这两者就是“天作之合”。

交叉熵举例说明:

假设一个动物照片的数据集中有5种动物,且每张照片中只有一只动物,每张照片的标签都是one-hot编码。
Animal  Dog  Fox  Horse  Eagle  Squirrel  Label  [ 1 , 0 , 0 , 0 , 0 ] [ 0 , 1 , 0 , 0 , 0 ] [ 0 , 0 , 1 , 0 , 0 ] [ 0 , 0 , 0 , 1 , 0 ] [ 0 , 0 , 0 , 0 , 1 ] \begin{array}{|l|l|l|l|l|l|} \hline \text { Animal } & \text { Dog } & \text { Fox } & \text { Horse } & \text { Eagle } & \text { Squirrel } \\ \hline \text { Label } & {[1,0,0,0,0]} & {[0,1,0,0,0]} & {[0,0,1,0,0]} & {[0,0,0,1,0]} & {[0,0,0,0,1]} \\ \hline \end{array}  Animal  Label  Dog [1,0,0,0,0] Fox [0,1,0,0,0] Horse [0,0,1,0,0] Eagle [0,0,0,1,0] Squirrel [0,0,0,0,1]
第一张照片是狗的概率为100%,是其他的动物的概率是0;第二张照片是狐狸的概率是100%,是其他动物的概率是0,其余照片同理;因此可以计算下,每张照片的熵都为0。换句话说,以one-hot编码作为标签的每张照片都有100%的确定度,不像别的描述概率的方式:狗的概率为90%,猫的概率为10%。

假设有两个机器学习模型对第一张照片分别作出了预测:Q1和Q2,而第一张照片的真实标签为[1,0,0,0,0]。

Model  Prediction  Q1  [ 0.4 , 0.3 , 0.05 , 0.05 , 0.2 ] Q2  [ 0.98 , 0.01 , 0 , 0 , 0.01 ] \begin{array}{|l|l|} \hline \text { Model } & \text { Prediction } \\ \hline \text { Q1 } & {[0.4,0.3,0.05,0.05,0.2]} \\ \hline \text { Q2 } & {[0.98,0.01,0,0,0.01]} \\ \hline \end{array}  Model  Q1  Q2  Prediction [0.4,0.3,0.05,0.05,0.2][0.98,0.01,0,0,0.01]

两个模型预测效果如何呢,可以分别计算下交叉熵:
H ( P 1 , Q 1 ) = − ∑ i P 1 ( i ) log ⁡ 2 Q 1 ( i ) = − ( 1 log ⁡ 0.4 + 0 log ⁡ 0.3 + 0 log ⁡ 0.05 + 0 log ⁡ 0.05 + 0 log ⁡ 0.2 ) ≈ 0.916 H ( P 1 , Q 2 ) = − ∑ i P 1 ( i ) log ⁡ 2 Q 2 ( i ) = − ( 1 log ⁡ 0.98 + 0 log ⁡ 0.01 + 0 log ⁡ 0 + 0 log ⁡ 0 + 0 log ⁡ 0.01 ) ≈ 0.02 \begin{gathered} H\left(P_{1}, Q_{1}\right)=-\sum_{i} P_{1}(i) \log _{2} Q_{1}(i) \\ =-(1 \log 0.4+0 \log 0.3+0 \log 0.05+0 \log 0.05+0 \log 0.2) \approx 0.916 \\ H\left(P_{1}, Q_{2}\right)=-\sum_{i} P_{1}(i) \log _{2} Q_{2}(i) \\ =-(1 \log 0.98+0 \log 0.01+0 \log 0+0 \log 0+0 \log 0.01) \approx 0.02 \end{gathered} H(P1,Q1)=iP1(i)log2Q1(i)=(1log0.4+0log0.3+0log0.05+0log0.05+0log0.2)0.916H(P1,Q2)=iP1(i)log2Q2(i)=(1log0.98+0log0.01+0log0+0log0+0log0.01)0.02

交叉熵公式:
H ( L , P ) = − ∑ j n L j log ⁡ 2 P j \begin{gathered} H\left(L, P\right)=-\sum_{j}^{n} L_j \log _{2} P_j \end{gathered} H(L,P)=jnLjlog2Pj

其中 P P P就是预测概率分布,而 L L L是真实标签分布。

参考博客

  • https://zhuanlan.zhihu.com/p/149186719
  • https://spaces.ac.cn/archives/6620
  • https://www.zhihu.com/question/294679135/answer/885285177

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/209478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派学习:学习opencv+用opencv获取树莓派mjpg摄像头视频流

目录 前提步骤 打开树莓派摄像头 查看是否有图像,登录游览器打开树莓派IP地址的8080端口 获取mjpg的视频流url 代码 先设定好mjpg的视频流的url 利用opencv库中的v2.VideoCapture类读取mjpg视频流 cv2.VideoCapture() 检查摄像头是否成功打开,…

scikit-learn实现线性回归

要学习scikit-learn,我们必须要到scikit-clearn的官网中去查看公式和原理 scikit-learn 官网 scikit-learn 中文社区 进入官网一以后我们找到回归,然后再有监督学习中找到线性模型 scikit-learn实现简单的线性回归 公式: L2范数是指向量中每个元素的平…

Java+Swing: 主界面的窗体 整理8

主界面的写法跟之前登录界面的窗体写法大致相同,在主界面中主要是窗体的大小的设置 package com.student_view;import com.utils.DimensionUtil; import sun.applet.Main;import javax.swing.*; import java.awt.*; import java.net.URL;/*** Author:xie…

C# --线程的进化史

1.C# 线程的进化史可以追溯到 .NET Framework 的早期版本和 C# 语言的发展过程 Thread 类(.NET Framework 1.0):最初,C# 中使用 Thread 类来创建和管理线程。通过实例化 Thread 类并调用其 Start 方法,可以在应用程序…

全面覆盖,无所不包:C++ 编程必备指南 | 开源日报 No.99

fffaraz/awesome-cpp Stars: 51.0k License: MIT 这个项目是一个精心策划的 C(或者 C) 框架、库、资源和其他有趣东西的列表。它收集了各种标准库,如 STL 容器和算法;不同领域的框架,比如人工智能、异步事件循环等;以及一系列功…

【人工智能Ⅰ】实验7:K-means聚类实验

实验7 K-means聚类实验 一、实验目的 学习K-means算法基本原理,实现Iris数据聚类。 二、实验内容 应用K-means算法对iris数据集进行聚类。 三、实验结果及分析 0:输出数据集的基本信息 参考代码在main函数中首先打印了数据、特征名字、目标值、目标…

【上海大学数字逻辑实验报告】四、组合电路(三)

一、 实验目的 掌握多路选择器74LS151的原理。掌握译码器74LS138的原理。学会在Quartus II上使用多路选择74LS151设计电路。学会在Quartus II上使用译码器74LS138设计电路。 二、 实验原理 多路选择器又称数据选择器或多路开关,它是一种多路输入单路输出的组合逻…

HHDESK右键管理简介

在HHDESK管理文件,除了基本的打开、删除、复制、粘贴、重命名外,还有多种便捷编辑方式。 可以分别以下列模式打开文档: 文本模式即是以文本编辑器打开文档。 1 二进制模式 可进行二进制编辑。 2 JSON模式 可对JSON文件进行直观的解析…

机器学习中的特征工程

1 特征工程概述 特征工程是机器学习中的一个关键步骤,在机器学习领域中占有非常重要的地位,是机器学习中不可或缺的一部分,下图展示了一个常规的机器学习流程: 特征工程涉及从原始数据中提取、选择和转换特征,以改善模…

Lombok 处理异常@SneakyThrows 注解

文章目录 注解的介绍具体示例 注解的介绍 SneakyThrows 是 Lombok 框架提供的一个注解,它可以用于在方法中抛出受检异常时,不用显式地对异常进行处理,而是将异常包装成 RuntimeException 抛出 使用 SneakyThrows 注解后,编译器会…

“轻松管理文件,一键导出表格,让您的归档工作井井有条“

在忙碌的工作中,我们经常会被大量的文件和数据所困扰。如何有效地管理和整理这些资料,成为了一个让人头疼的问题。今天,我们向您介绍一款强大的文件管理工具——一键导出表格,帮助您轻松解决这个问题。 第一步,首先我们…

区块链实验室(30) - 区块链期刊:Distributed Ledger Technologies: Research and Practice

区块链涉及多学科及技术,众多期刊接收区块链文章。Distributed Ledger Technologies: Research and Practice是ACM出版集团的一本期刊。 Distributed Ledger Technologies: Research and Practice创刊历史很短,始于2022年,出版期数也不多。 载…

力扣面试150题 | 多数元素

力扣面试150题 | 多数元素 题目描述解题思路代码实现 题目描述 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示…

Leetcode 剑指 Offer II 056. 两数之和 IV - 输入二叉搜索树

题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个二叉搜索树的 根节点 root 和一个整数 k , 请判断该二叉…

Java 使用oshi获取当前服务器状态cpu、内存、存储等核心信息

文章目录 简介相关资料maven依赖oshi-官方示例获取CUP信息代码获取内存信息获取磁盘信息 简介 OSHI 是基于 JNA 的(本地)操作系统和硬件信息库。它不需要安装任何其他额外的本地库,旨在提供一种跨平台的实现来检索系统信息,例如操…

[ROS2] --- action

1 action介绍 ROS通信机制也会被常常用到——那就是动作。从这个名字上就可以很好理解这个概念的含义,这种通信机制的目的就是便于对机器人某一完整行为的流程进行管理。 1.1 客户端/服务器模型 动作和服务类似,使用的也是客户端和服务器模型&#xf…

数据结构中处理散列冲突的四种方法

1 开放定址法 1.1 定义 开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址 1.2 要求 只要散列表足够大 空的散列地址总能找到,并将记录存入 1.3 线性探测法 使用该公式用于解决冲突的开放定址法称为线性探测法 对于线性探测法&#xff0c…

【异常】SpringBoot3.2.0 Description: Failed to configure a DataSource: ‘url‘ att

mybatisPlus 多数据源导致 异常 Description:Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be configured.Reason: Failed to determine a suitable driver classAction:Consider the following:If you want an embed…

通过kubeadm方式安装k8s

虚拟机最少是 2 core,master内存最小3G,node内存最小2G. 要求的Docker版本是18.03,如果不是安装的docker ce,版本是过旧的,可以选择删除后重新安装; 也可以重新创建一个虚拟机执行以下命令。 简单方法&am…

线性代数基础【1】行列式

第一节 行列式的基本概念和性质 一、基本概念 ①逆序 1,2和2,1是一对逆序 ②逆序数 1,2,3,5,4的逆序数为1;1,3,2,5,4逆序数为4; ③行列式 ④余子数和代数余子数 行列式挖掉一个数(例如aij),将原行列式去掉i行j列的行列式M,则M为余子数,代数余子数记为Aij,如果(ij)为偶数…