Softmax & Sigmoid

Softmax & Sigmoid

Category
机器学习 ML
深度学习 DL
Author
Huilin Zhang
Date
Dec 3, 2023
notion image
notion image

二者的区别与联系

  • 如果模型输出为互斥类别,且只能选择一个类别,如单标签多分类问题,则采用Softmax函数计算该网络的原始输出值,然后接一个交叉熵损失函数。
  • 如果模型输出为非互斥类别(即没有包含关系),且可以同时选择多个类别,如多标签多分类问题,则采用Sigmoid函数计算该网络的原始输出值。
  • 对于某个分类场景,当Softmax函数能用时,Sigmoid函数一定可以用。
  • 对于二分类问题,二者在数学上是没有区别的(证明写一下数学公式就看出来了)。
  • 对于二分类问题,当用Sigmoid函数的时候,最后一层全连接层的神经元个数为1,而当用Softmax函数的时候,最后一层全连接层的神经元个数是2。因为Sigmoid函数只有是目标不是目标之分,实际上只存在一类目标类,另外一个是背景类。而Softmax函数将目标分类为了二类,所以有两个神经元。这也是导致两者存在差异的主要原因。如果错误的用Sigmoid对二维神经元进行计算,实际上做了两次独立的实验,两个值分别是“分到第一类的概率p”、“分到第二类的概率q”,得到的两个概率值之和不等于1。
💡
所以如果想用SE为左右两支路去生成权重的话,还是得用softmax限制两个权重和为1,这样利于网络的学习。

Softmax(归一化指数函数)

基础知识

  • softmax是个非常常用而且比较重要的函数,他把一些输入映射为0-1之间的实数,并且归一化(保证和为1),而多分类的概率之和也刚好为1,因此在多分类的场景中使用广泛。但前提是假设各个类别互斥,即一个样本只能属于一个类别。
  • Softmax函数的分母综合了原始输出值的所有因素,这意味着,Softmax函数得到的不同概率之间相互关联。
  • Softmax函数可以使得神经网络在反向传播过程中更容易执行梯度求导(导数公式见上),而且能够凸显原始向量中最大的值,并抑制远低于最大值的其他分量(只选一个的思想,这也是该函数被称作 Softmax 函数的原因(即平滑化的 argmax 函数
  • 由于Softmax函数先拉大了输入向量元素之间的差异(通过指数函数),然后才归一化为一个概率分布,在应用到分类问题时,它使得各个类别的概率差异比较显著,最大值产生的概率更接近1,这样输出分布的形式更接近真实分布。
  • 理解为什么叫 “soft” “max” ?softmax可以当作argmax的一种平滑近似,与argmax操作中暴力地选出一个最大值(产生一个one-hot向量)不同,softmax将这种输出作了一定的平滑,即将one-hot输出中最大值对应的1按输入元素值的大小分配给其他位置。
notion image

温度系数

  • 在原始的softmax基础上额外增加一个温度系数 ,但一般作者很少做相关的解释,并且任务不同,取值的范围也不同。温度系数主要是用来调整logits-softmax曲线的平滑程度,常用在知识蒸馏(通常)、对比学习(通常中。
  • 代码为:out = F.softmax(x/t, dim=1),如果想得到一个学习到的权重的话,一般写在forward函数里面。减小,softmax的输入变大,输出各类别之间的概率差距变大(结合softmax曲线看,陡峭的部分),如果后接一个交叉熵损失函数的话,loss变小;增大,softmax的输入变小,输出的各类别的概率差距变小(结合softmax曲线看,平滑的部分),如果后接一个交叉熵损失函数的话,loss变大。
  • 这篇文章里,,好大啊。我的SATNet中, 效果最好,但这篇文章建议使用一个固定的小于 1 的温度系数,利于模型收敛。

Sigmoid

  • 在特征相差比较复杂或是相差不是特别大时效果比较好。
  • 对于二分类的情况,Sigmoid函数针对两点分布提出。神经网络的输出经过它的转换,可以将数值压缩到(0,1)之间,得到的结果可以理解成分到目标类别的概率P,而不分到该类别的概率是(1 - P),这也是典型的两点分布的形式。而Softmax得到的是“分到正确类别的概率和分到错误类别的概率”,即分到各个类别的概率。

Reference

入门级都能看懂的softmax详解_bitcarmanlee的博客-CSDN博客_softmax
项目github地址: bitcarmanlee easy-algorithm-interview-and-practice 经常有同学私信或留言询问相关问题,V号bitcarmanlee。github上star的同学,在我能力与时间允许范围内,尽可能帮大家解答相关问题,一起进步。 在机器学习尤其是深度学习中,softmax是个非常常用而且比较重要的函数,尤其在多分类的场景中使用广泛。他把一些输入映射为0-1之间的实数,并且归一化保证和为1,因此多分类的概率之和也刚好为1。 首先我们简单来看看softmax是什么意思。顾名思义,softmax由两个单词组成,其中一个是max。对于max我们都很熟悉,比如有两个变量a,b。如果a>b,则max为a,反之为b。用伪码简单描述一下就是 if a > b return a; else b。 另外一个单词为soft。max存在的一个问题是什么呢?如果将max看成一个分类问题,就是非黑即白,最后的输出是一个确定的变量。更多的时候,我们希望输出的是取到某个分类的概率,或者说,我们希望分值大的那一项被经常取到,而分值较小的那一项也有一定的概率偶尔被取到,所以我们就应用到了soft的概念,即最后的输出是每个分类被取到的概率。 首先给一个图,这个图比较清晰地告诉大家softmax是怎么计算的。 (图片来自网络) 假设有一个数组V,表示V中的第i个元素,那么这个元素的softmax值为: 该元素的softmax值,就是该元素的指数与所有元素指数和的比值。 这个定义可以说很简单,也很直观。那为什么要定义成这个形式呢?原因主要如下。 1.softmax设计的初衷,是希望特征对概率的影响是乘性的。 2.多类分类问题的目标函数常常选为cross-entropy。即,其中目标类的为1,其余类的为0。 在神经网络模型中(最简单的logistic regression也可看成没有隐含层的神经网络),输出层第i个神经元的输入为。 神经网络是用error back-propagation训练的,这个过程中有一个关键的量是。后面我们会进行详细推导。 接下来开始求导 ∂ L o s s i ∂ i = − ∂ l n y i ∂ i = ∂ ( − l n
入门级都能看懂的softmax详解_bitcarmanlee的博客-CSDN博客_softmax
谈谈softmax中常出现的温度系数 T (τ)
2022-4-1 , 今天再回首来看这篇文章,发现自己写的非常局限,并且基本是在拾人牙慧,缺乏自己的思考与提炼。在阅读了更多文章和做实验进行一些思考之后,重写了这篇博客,主要从对比学习、知识蒸馏、分类训练来谈谈自己对于温度系数的理解。 许多计算机视觉任务中,我们都看到作者会在原始的softmax损失基础上额外增加一个温度系数 T ,但很少做相关的解释,并且任务不同,取值的范围也不同。这篇博客,浅谈一下我遇到过的应用温度系数T的情况与原理。 首先直接从softmax本身出发,温度系数T主要是用来调整 logits-softmax曲线的 平滑程度 。假设目前有一个3分类任务,网络输出的logits为[1,2,3],groundtruth为[0,0,1]也就是类别2。 ① 如果不使用τ,或者说τ=1,那么softmax的结果为: 那么此时计算出来的softmax概率为[0.0900, 0.2447, 0.6652],loss为 0.4076 (-log(0.6652))。 ② 而τ=0.5时: ③ τ=0.1: 观察:随着T的减小,softmax输出各类别之间的概率差距越大( 陡峭),从而导致loss变小;同样,当增大T,softmax输出的各类别概率差距会越来越小( 平滑 ),导致loss变大。 在不同任务场景中,温度系数往往起着不同的作用。 先谈谈 知识蒸馏,在进行知识蒸馏时,会对teacher网络的softmax输出除以一个T得到 soft target,然后student网络的softmax输出同样会除以一个T得到 logits ,计算交叉熵,而这个T的取值通常大于1。为什么需要除以一个温度系数T呢? 当然,这么做肯定是在实验上取得了更好的性能,但其背后的原因怎么理解呢?首先,蒸馏的本质是让学生网络去学习教师网络的泛化能力(通过 soft target传递),由于训练好的模型本身会出现 过度自信的问题(softmax输出的概率分布熵很小),所以除以一个大于1的T,让分布变得平滑,来 放大这种类别相似信息 。 具体可以参考这篇文章: https://zhuanlan.zhihu.com/p/102038521 接下来,我们再谈谈对比学习(用于自监督学习)中的温度系数,对比学习中最常用的一个loss莫过于NCE损失(跟softmax损失很像): 简单地理解,就是 s i , i s_{i,i} s i , i ​ 就是anchor与正样本之间的相似度, s i , k s_{i,k} s i , k ​ 就是anchor与负样本之间的相似度,优化目标就是让正样本之间的相似度越大越好,负样本之间的相似度越小越好(拉近正样本,推远负样本)。相似度最后都会除以一个温度系数T,这个T通常小于1。 为什么在这里T又要小于1呢?首先对比学习应用这种损失形式本身就可以 挖掘hard负样本,因为经过一个softmax操作后,会给距离更近的负样本更多的惩罚(可以从梯度分析)。而T可以控制对困难样本的惩罚程度,如下图所示:当T越小,softmax输出差异被放得越大,对困难负样本的惩罚更大(loss更大)。 但属于无监督学习的对比学习本身会遇到一种 Uniformity-Tolerance Dilemma均匀性-容忍性困境,我们既希望得到一个分布均匀的表征空间(有文献说明这是对比学习效果好的关键),这期望我们将困难负样本推离地更远一些(T变小);但这些困难样本本身又可能属于潜在的"正样本"(拥有同样的前景),过度推远会起到反作用(T不能太小)。 所以在对比学习中,需要折中地选择温度系数的取值,这是一个非常重要的超参数。 来自 Understanding the Behaviour of Contrastive Loss(CVPR21), 知乎解读: https://zhuanlan.zhihu.com/p/357071960 最后,我再谈谈我在实践过程中遇到的一些问题,比如我现在得到了一些伪标签或者一些噪声标签去进行一个分类任务。我对这批标签的信心不是很高,但又想通过它去学习一些知识 / 训练一个模型,这样也可以用到温度系数T。比如我把温度系数调低(T 1)。 但是这些情况都可以通过其他更显示的策略来完成,所以这里也是仅供参考。
谈谈softmax中常出现的温度系数 T (τ)
深度学习高温蒸馏:Softmax With Temperature
最近读到一篇模型蒸馏的文章 [1] ,其中在设计软标签的损失函数时使用了一种特殊的 softmax: 最左边是我们随机生成的分布来模拟模型的输出: 。中间五幅图是使用 softmax 得到的结果;其中温度系数 时相当于原始的 softmax;右侧对比了 argmax 得到的结果。可以看出,从左到右,这些输出结果逐渐从均匀分布向尖锐分布过渡,其中保留的除正确类别以外的信息越来越少。下图 [3] 对输出分布的影响。 不同的曲线代表不同类别上的概率输出,同样 时代表传统的 softmax,在 时,分布逐渐极端化,最终等价于 argmax,在 时,分布逐渐趋于均匀分布,10 个类别的概率都趋近于1/10。 这两幅画很好的说明了 softmax 的本质。相对于 argmax 这种直接取最大的「hardmax」,softmax 采用更温和的方式,将正确类别的概率一定程度地突显出来。而引入温度系数的本质目的,就是让 softmax 的 soft 程度变成可以调节的超参数。 较大时 loss 确实会较大,因为输出分布比较均匀,不能很好地凸显正类别上的概率优势。但在蒸馏时并非如此,Hinton 给出的 Loss 函数如下图 [5] 所示,分为两项: 第一项 是教师模型与学生模型的输出之间的交叉熵,第二项 是学生模型与真实标签之间的交叉熵。传统训练模型时只有 项,所以 可以看做是引入的正则项。文中指出这个正则项使得学生模型能够学到教师模型中的高度泛化的知识,从而需要更少的真实训练样本。 为什么 loss 大就可以避免陷入局部最优呢?我猜作者想表达的是 loss 很大,从而随机梯度下降的时候梯度很大,步长就会很大,从而更容易跳出局部最优。该文章的评论区也有同样的声音,但可惜这并不正确。我们还以硬标签 监督训练为例,使用交叉熵损失函数,设
深度学习高温蒸馏:Softmax With Temperature