来自 | 知乎   作者 | LinT链接丨https://zhuanlan.zhihu.com/p/79585726编辑 | 深度学习这件小事公众号仅作学术交流,如有侵权,请联系删除

0. 引言

Softmax函数几乎是深度学习中的标配了,在人工神经网络中,几乎无处不可见softmax函数的身影。可以认为softmax是arg max操作的一种平滑近似。

我将softmax的用途总结为两种:

  • 分类:给定一系列类别,softmax可以给出某输入被划分到各个类别的概率分布。由于人工智能领域的许多问题都可以抽象成分类问题,所以softmax最广泛的应用当属分类;

  • 寻址:由于softmax的输出是一种概率分布的形式,可以用它来实现一种软性的寻址。近几年逐渐推广的(软性)注意力机制就可以认为是一种软性寻址的方式,根据各个键向量与查询向量的相似度从各个值向量中获取一定的“信息”。因此使用了softmax的注意力机制也可以用于外部记忆的访问。

不难发现,在分类问题中,我们也可以使用arg max来找到对应的类别;在寻址问题中,一个直观的方法也是使用arg max寻找最相似的向量/记忆。但是arg max操作并不具有良好的数学性质,其不可导的性质使其无法直接应用基于梯度的优化方法。因此在分类和寻址两种用途中,常常都使用softmax函数替代arg max。

基于这两种用途,softmax可以在人工神经网络中充当什么样的角色,就靠诸君的想象了。这篇文章中,我想简单、粗浅地探讨一下softmax的一些性质与变种。

1. 基本形式

给定一个  维向量,softmax函数将其映射为一个概率分布。标准的softmax函数  由下面的公式定义[1]

其中,分母是配分函数(Partition Function),一般简记为  ,表示所有状态/值的总和,作为归一化因子;分子是势能函数(Potential Function)。

直观上看,标准softmax函数用一个自然底数  先拉大了输入值之间的差异,然后使用一个配分将其归一化为一个概率分布。在分类问题中,我们希望模型分配给正确的类别的概率接近1,其他的概率接近0,如果使用线性的归一化方法,很难达到这种效果,而softmax有一个先拉开差异再归一化的“两步走”战略,因此在分类问题中优势显著。

事实上,在势能函数和配分函数中,可以采用的底数不仅仅是自然底数  ,也可以采用一些其他的底数。原则上,任意  都可以作为这里的底数,越大的底数越能起到“拉开差异”的作用。使用  作为底数时,将产生以下的非标准softmax函数[1]

其中  是一个实数,正的 常常在机器学习中使用,在信息检索的工作DSSM中, 就充当了一个平滑因子[2];负的 常常在热力学系统中使用,由于一些概率图模型也参考了热力学的原理,所以在概率图模型中也常常能见到这种形式,如玻尔兹曼机。

2. 导数与优化

标准softmax具有非常漂亮的导数形式:

这里导数的推导可以参考 @邱锡鹏 老师的《神经网络与深度学习》[3]附录B.2.4的推导。

在分类问题中,softmax函数常常和交叉熵损失函数一起使用,此时交叉熵损失函数  对  的导数,由下面的形式给出:

其中  是真实标签对应的one-hot编码向量。这样的导数在优化时非常方便,实现起来也非常简单。

由于softmax函数先拉大了输入向量元素之间的差异,然后才归一化为一个概率分布,在应用到分类问题时,它使得各个类别的概率差异比较显著,最大值产生的概率更接近1,这样输出分布的形式更接近真实分布。

但是当softmax函数被应用到寻址时,例如注意力机制中,softmax这个拉大元素间差异的过程可能会导致一定的问题。假设输入向量有唯一的最大值,如果将arg max操作定义为指示最大值的一个one-hot编码函数  ,在非标准softmax中有[1]

* 这里的证明参见下方的补充(A)。

如果将非标准softmax的 融入到输入中,则容易看出:当输入的方差/数量级较大时,softmax的输出会比较接近一个one-hot向量。根据式  ,其导数的两个项会比较接近,导致导数变成0矩阵。这也就导致了梯度弥散的问题,不利于优化,具体讨论可以参考我先前的一篇回答[4]。这也是为什么注意力机制中常常使用缩放点积形式的注意力。

插一句题外话,开篇提到softmax是arg max操作的一种平滑近似,而针对max操作的近似,其实有一个LogSumExp[5]操作(也叫作softmax),其导数形式就是softmax函数,是不是很有趣呢?

3. Softmax的解释

Softmax可以由三个不同的角度来解释。从不同角度来看softmax函数,可以对其应用场景有更深刻的理解。

3.1 是arg max的一种平滑近似[1]

前面提到过,softmax可以当作arg max的一种平滑近似,与arg max操作中暴力地选出一个最大值(产生一个one-hot向量)不同,softmax将这种输出作了一定的平滑,即将one-hot输出中最大值对应的1按输入元素值的大小分配给其他位置。如式  所示,当底数增大时,softmax逐渐收敛为arg max操作。

在机器学习应用中,我们往往不(直接)需要一个arg max的操作,这时候显然数学性质更好、更容易优化的softmax就是我们的第一选择。

3.2 归一化产生一个概率分布

Softmax函数的输出符合指数分布族的基本形式

其中  。

不难理解,softmax将输入向量归一化映射到一个类别概率分布,即  个类别上的概率分布(前文也有提到)。这也是为什么在深度学习中常常将softmax作为MLP的最后一层,并配合以交叉熵损失函数(对分布间差异的一种度量)。

3.3 产生概率无向图的联合概率

从概率图模型的角度来看,softmax的这种形式可以理解为一个概率无向图上的联合概率。因此你会发现,条件最大熵模型与softmax回归模型实际上是一致的,诸如这样的例子还有很多。由于概率图模型很大程度上借用了一些热力学系统的理论,因此也可以从物理系统的角度赋予softmax一定的内涵。

   4. Softmax的改进与变种

Softmax函数是一种简单优美的归一化方法,但是它也有其固有的缺陷。直观上看,当应用到实际问题时,其最大的问题就在于配分函数的计算:当类别的数量很多时,配分函数的计算就成为了推断和训练时的一个瓶颈。在自然语言处理中,类别常常对应词汇表中的所有词汇,这个数量之大可见一斑,如果直接采用softmax计算方法,计算效率会非常低。因此一般采用一些方法改进softmax函数,加速模型训练。这里列举几个自然语言处理中的经典改进/变种[3]

  • 层次化softmax:将扁平的  分类问题转化为层次化的分类问题。将词汇表中的词分组组织成(二叉)树形结构,这样一个  分类问题,可以转化为多层的二分类问题,从而将求和的次数由  降低到了树的深度级别。这里可以使用的一个方法是,按照词汇的频率求和编码Huffman树,从而进一步减少求和操作的计算次数。

  • 采样方法:使用梯度上升优化时,softmax的导数涉及到一次配分函数的计算和一次所有词汇上的softmax对词汇的梯度的期望,这两个计算都可以用采样方法来近似,比如重要性采样,这样计算次数由  减少为采样样本数  的级别。这种方法的性能很受采样策略的影响,以重要性采样方法为例,其效果就依赖于提议分布的选取;采样样本数  的选取也需要考虑精度和训练效率的折衷。

  • 噪声对比估计(NCE):将密度估计问题转换为两类分类问题(区分噪声与真实数据),从而降低计算复杂度。其中配分函数被替换为了一个可学习的参数,这样NCE方法能促使输入的未归一化向量自己适应为一个归一化的、接近真实分布的分布向量。由于不再需要计算配分函数,训练效率大大提升。这种对比学习思想在深度学习中也十分常见。

   5. 总结

前面简单讨论了softmax的性质、解释与变种,从现在来看,似乎softmax已经是神经网络中的一根老油条了。Softmax还有哪些可以挖掘的地方呢?作为一个菜鸟,只好先把这个问题抛给诸位了。

   A. 补充

突然觉得式  直接放进来有一点太唐突了,觉得还是要简单证明一下,算是完善一下之前的回答。

假设固定输入  不变,变化参数  ,假设输入  中有唯一的最大值  ,则有:

不妨设  ,可以分类讨论一下:

1. 当  ,则  ,此时

2. 当  ,则  ,此时结合  ,可以得到即,当  取无穷大时,非标准softmax的输出收敛到一个one-hot向量,其中最大输入对应的输出值是1,其他输出是0。当输入向量中有多个最大值,可以更宽泛地定义arg max操作,使其输出为一个  维向量,其中  个最大值下标对应的输出为  ,其它输出为0。这时类似上面的证明,很容易验证,当  时,softmax依然仍然收敛为arg max操作。

参考链接:

[1] Softmax function

https://en.wikipedia.org/wiki/Softmax_function

[2] Huang et al., Learning Deep Structured Semantic Models for Web Search using Clickthrough Data

https://posenhuang.github.io/papers/cikm2013_DSSM_fullversion.pdf

[3] 邱锡鹏,《神经网络与深度学习》

https://nndl.github.io

[4] transformer中的attention为什么scaled? - lintongmao的回答 - 知乎

https://www.zhihu.com/question/339723385/answer/782509914

[5] LogSumExp https://en.wikipedia.org/wiki/LogSumExp

为您推荐

人工智能领域最具影响力的十大女科学家

MIT最新深度学习入门课,安排起来!

有了这个神器,轻松用 Python 写个 App

「最全」实至名归,NumPy 官方早有中文教程

漫画版 Linux 内核的世界

softmax函数_干货 | 浅谈Softmax函数相关推荐

  1. softmax函数_干货 | 浅谈 Softmax 函数

    点击上方"视学算法",马上关注 来自 | 知乎 作者 | LinT链接丨https://zhuanlan.zhihu.com/p/79585726编辑 | 深度学习这件小事公众号仅 ...

  2. python股票网格交易法详解_干货 | 浅谈网格交易法

    原标题:干货 | 浅谈网格交易法 网格交易法的基本原理就是把行情的所有日间上下的波动全部囊括,它不会放过任何一次的行情上下波动. 不管市场价格如何上下波动,不外3种形态:上涨,盘整,下跌.由于不同的操 ...

  3. 干货 | 浅谈 Softmax 函数

    点击上方"视学算法",马上关注 真爱,请设置"星标"或点个"在看" 来自 | 知乎   作者 | LinT 链接丨https://zhuan ...

  4. 控制div的大小自适应_干货 | 浅谈模糊自适应PID控制

    认真  沉稳  进取 认真努力的人都会关注这个公众号 PID控制(比例-积分-微分控制)是一种我们比较常见的控制算法,由比例单元P,积分单元I和微分单元D组成,控制基础为比例控制,积分控制,微分控制. ...

  5. 浅谈云函数的代理IP利用面

    浅谈云函数的代理IP利用面 前言 本篇文章介绍如何通过 Serverless(云函数) 实现各种扫描器探测功能,以达到绕过态势感知.WAF等安全设备,增大蓝队研判人员溯源难度,实现封无可封,查无可查的 ...

  6. 浅谈async函数await用法

    async和await相信大家应该不陌生,让异步处理变得更友好. 其实这玩意儿就是个Generator的语法糖,想深入学习得去看看Generator,不然你可能只停留在会用的阶段. 用法很简单,看代码 ...

  7. 浅谈javascript函数劫持

    创建时间:2007-12-02 文章属性:原创 文章提交:hkluoluo (luoluonet_at_hotmail.com) by luoluo on 2007-11-30 luoluonet_a ...

  8. 浅谈Python3函数命名空间与作用域

    日期:2020年1月23日 作者:Commas 注释:前一章节讲述了命名空间和作用域的知识,现在我们来谈一谈Python3函数的命名空间吧. 如果您想了解更多有关Python的知识,那么请点<我 ...

  9. 浅谈python函数签名

    函数签名对象,表示调用函数的方式,即定义了函数的输入和输出. 在Python中,可以使用标准库inspect的一些方法或类,来操作或创建函数签名. 获取函数签名及参数 使用标准库的signature方 ...

  10. criteria函数_干货铺 | 二级MS office考试中一些常考函数(2)

    同步文章:二级MS office考试中一些常考函数(2) 1.AVERAGE(Number1,Number2,-)函数--计算平均值函数: 参数解释:Number1,number2,...是要计算平均 ...

最新文章

  1. MySQL ERROR 1878 解决办法
  2. HDU_oj_2021 发工资喽
  3. grads 相关系数_基于小波变换的多聚焦图像融合算法
  4. draconet 1.6-release-1 (1.6.3.0)
  5. linux机器的物理内存监控,Linux内存监控工具
  6. 通过this()调用有参构造方法
  7. USB闪存驱动器未显示在MacOS的Finder或磁盘工具上,是什么原因
  8. 接不住了,能撒手吗?
  9. HTC V版M7解锁刷机笔记
  10. MySQL Audit Plugin Mcafee安装详解
  11. 卡尔曼滤波与扩展卡尔曼滤波(EKF)
  12. mac的python换字体_Python -mac-画图及设置坐标中文字体
  13. 嵌入式OS的现状、智能的物联网与未来的机器人
  14. TwinCAT3 设置断电保持变量
  15. windows定时自动备份
  16. 使用python-docx将爬取结果保存到word
  17. Python运维开发(CMDB资产管理系统)——环境部署(下)
  18. 2021/12/14 nginx包下载安装步骤记录
  19. radmin显示不能连接到服务器,关于Radmin安装失败或无法显示远程桌面的处理方法...
  20. palm 680入手使用记录

热门文章

  1. java中的Math类
  2. 【Cocos2d-html5】运动中速度效果
  3. .net读取Lotus Domino文件数据库
  4. hdu1708(C++)
  5. 日常琐事的记录,每周六晚做一次总结整理
  6. Netty基于ip的黑名单过滤——RuleBasedIpFilter
  7. 单元测试框架TestableMock快速入门(一):快速Mock任意调用
  8. Oracle相同的一个SQL执行计划截然不同的解决方法
  9. 并发编程常见面试题总结五
  10. 并发编程学习之线程8锁