作者:无影随想 
时间:2016年1月。 
出处:https://zhaokv.com/machine_learning/2016/01/softmax-calculous-perspective.html
声明:版权所有,转载请注明出处

Softmax是机器学习中最常用的输出函数之一,网上有很多资料介绍它是什么以及它的用法,但却没有资料来介绍它背后的原理。本文首先简单地介绍一下Softmax,然后着重从数学分析的角度来分析一下它背后的原理。

分类问题是监督学习中最重要的问题之一,它试图根据输入$\bf{x}$来预测对应标签$y$的概率。Softmax便是计算标签概率的重要工具之一:

${\bf p}=\rm{softmax}({\bf a})\Leftrightarrow p_i=\frac{\exp({a_i})}{\sum_j\exp({a_j})}$

其中$a_i$是模型对于第$i$个分类的输出。接下来简单地证明一下:通过对数最大似然以及梯度下降方法可以使$p_i$逼近第$i$个分类的真实概率。对数最大似然中的损失函数为$L_{NLL}({\bf p},y)=-\log p_y$,对它关于${\bf a}$求导得:

$\frac{\partial}{\partial a_k}L_{NLL}({\bf p},y)=\frac{\partial}{\partial a_k}(-\log p_y)=\frac{\partial}{\partial a_k}(-a_y+\log\sum_j e^{a_j})$

$=-{\bf 1}_{y=k}+\frac{e^{a_k}}{\sum_j{e^{a_j}}}=p_k-{\bf 1}_{y=k}$

即$\frac{\partial}{\partial {\bf a}}L_{NLL}({\bf p},y)=({\bf p}-{\bf e}_y)$,其中${\bf e}_y=[0,\cdots,0,1,0,\cdots,0]$是一个向量,除了位置$y$为1之外全是0。相同${\bf x}$的样本对应相同的${\bf a}$,我们可以看到,随着越来越多样本参与梯度下降,$p_i$会逼近第$i$个分类的真实概率,即${\bf p}=\mathbb{E}[{\bf e}_{y}|{\bf x}]$,因为$\lim\limits_{N\to\infty}\frac{1}{N}\sum\limits_{i=1}^N({\bf p}-{\bf e}_y^{(i)})=0$,其中$\lim\limits_{N\to\infty}\frac{1}{N}\sum\limits_{i=1}^N{\bf e}_y^{(i)}$是真实概率。

从收敛速度方面,对数最大似然与梯度下降在Softmax身上简直是绝配。对于一个输入为${\bf x}$的样本,假设它的真实分类是$i$,对于模型的第$j(j\neq i)$个输出有$\frac{\partial}{\partial a_j}L_{NLL}({\bf p}, y)=p_j$,如果$p_j\approx 0$(即模型认为不太可能是分类$j$,预测结果与实际相符),梯度接近0,会进行很小的修正,如果$p_j\approx 1$(即模型非常有信心地预测是分类$j$,预测结果与实际相反),梯度接近1,会进行很大的修正。另外,对于模型的第$i$个输出有$\frac{\partial}{\partial a_i}L_{NLL}({\bf p}, y)=1-p_i$,如果$p_i\approx 0$(即模型认为不太可能是分类$i$,预测结果与实际相反),梯度接近1,会进行很大的修正,如果$p_i\approx 1$(即模型非常有信心地预测是分类$i$,预测结果与实际相符),梯度接近0,会进行很小的修正。综上,在Softmax上使用对数最大似然作为损失函数,梯度下降情况非常理想——预测错误时修正大,预测正确时修正小

当然也有人在Softmax上尝试其他损失函数,比如最有名的最小二乘。结果是两者并不搭,因为在最小二乘下模型如果预测完全错误时修正也会非常小。设${\bf y}={\bf e}_i$(注意这里的${\bf y}$是黑体),对最小二乘$L_2({\bf p}({\bf a}),{\bf y})=||{\bf p}({\bf a})-{\bf y}||^2$关于$a_i$(假设$i$是正确类别)求导得

$\frac{\partial}{\partial a_i}L_2({\bf p}({\bf a}),{\bf y})=\frac{\partial{L_2({\bf p}({\bf a}), {\bf y})}}{\partial {\bf p}({\bf a})}\frac{\partial {\bf p}({\bf a})}{\partial a_i}$

$=\sum_{j\neq i}2(p_j-{\bf y}_j)p_j(0-p_i)+2(p_i-{\bf y}_i)p_i(1-p_i)$

如果对于正确类别$i$模型的预测是$p_i\approx 0$(与实际强烈不符),显然有$\frac{\partial}{\partial a_i}L_2({\bf p}({\bf a}),{\bf y})\approx 0$,也就是说梯度下降对模型几乎不修正,可见Softmax搭配最小二乘的梯度下降情况并不好。

PS:Softmax还有一个重要性质是平移不变性,即${\rm softmax}({\bf a})={\rm softmax}({\bf a}+b)$,因为$\frac{\exp({a_j+b})}{\sum_k\exp({a_k+b})}=\frac{\exp({a_j})}{\sum_k\exp({a_k})}$。由于平移不变性的存在,模型只需要学到${\bf a}$中元素的相对大小,而不需要学到绝对大小。另外,我们还可以根据${\rm softmax}({\bf a})={\rm softmax}({\bf a}-\max_ia_i)$有效地减少计算误差。

综上所述,首先,Softmax的确可以表示概率,且随着样本的增多通过对数最大似然与梯度下降可以无限逼近真实概率值;其次,Softmax与对数最大似然这一组合在梯度下降中有很好的修正速度;最后,因为平移不变性,我们只需要关心模型不同类别输出间的相对大小,不需要关心绝对大小。

从数学分析的角度来看Softmax的更多相关文章

  1. 从jvm的角度来看单例模式

    最近在看jvm,发现随着自己对jvm底层的了解,现在对java代码可以说是有了全新的认识.今天就从jvm的角度来看一看以前自以为很了解的单例模式. 了解单例模式的人都知道,单例模式有两种:" ...

  2. 以代码爱好者角度来看AMD与CMD

    随着浏览器功能越来越完善,前端已经不仅仅是切图做网站,前端在某些方面已经媲美桌面应用.越来越庞大的前端项目,越来越复杂的代码,前端开发者们对于模块化的需求空前强烈.后来node出现了,跟随node出现 ...

  3. 以代码爱好者角度来看AMD与CMD(转)

    随着浏览器功能越来越完善,前端已经不仅仅是切图做网站,前端在某些方面已经媲美桌面应用.越来越庞大的前端项目,越来越复杂的代码,前端开发者们对于模块化的需求空前强烈.后来node出现了,跟随node出现 ...

  4. 从源码角度来看BeanFactory和ApplicationContext的关系

    大家好,我是小黑,这是年前的最后一篇推文,提前祝大家新年快乐~~ 这次我们从源码角度来聊聊BeanFactory和ApplicationContext的关系,讲一些网上文章不曾提到的点. 官方描述 先 ...

  5. 从IDEA角度来看懂UML图

    前言 我们目前已经学习了设计模式的7种设计原则.下面本该是直接进入具体的设计模式系列文章. 但是呢在我们学习设计模式之前我们还是有必要了解一下uml图.因为后续的设计模式文章不出意外应该会很多地方使用 ...

  6. 从CLR角度来看值类型与引用类型

    前言 本文中大部分示例代码来自于<CLR via C# Edition3>,并在此之上加以总结和简化,文中只是重点介绍几个比较有共性的问题,对一些细节不会做过深入的讲解. 前几天一直忙着翻 ...

  7. 从jvm的角度来看java的多线程

    最近在学习jvm,发现随着对虚拟机底层的了解,对java的多线程也有了全新的认识,原来一个小小的synchronized关键字里别有洞天.决定把自己关于java多线程的所学整理成一篇文章,从最基础的为 ...

  8. 从“思考”的角度来看如何成为一名优质的Java架构师

    导读: 架构师应不应该写代码 为什么别人的系统总是那么烂 成为架构师最困难的门槛是什么? 如何更高效的学习? 1.架构师应不应该写代码 合格的程序员对于明确分配的任务会完成的很好,但是大部分情况下&q ...

  9. (一)从设计的角度来看ADT(Java)

    <数据结构与抽象——Java语言描述>第一章学习笔记 感想:以前学数据结构关注于方法及实现,为了完成作业和手写代码,没有从设计层面考虑过,第一章设计一个bag ADT,借助于Java in ...

随机推荐

  1. thinkphp 使用外部php或html 原理

  2. Win10下安装MySQL总卡在write configuration的解决办法

    先说结论 删除  C:\ProgramData 下的MySQL文件夹!!! 折腾过程 反复安装卸载,安装版.绿色版,都不行,清理注册表,清理安装文件夹,还是不行!!! 最后找到并删除  C:\Prog ...

  3. MyBatis 是一款优秀的持久层框架

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...

  4. iScroll框架解析——Android 设备页面内 div(容器,非页面)overflow:scroll; 失效解决(转)

    移动平台的活,兼容问题超多,今儿又遇到一个.客户要求在弹出层容器内显示内容,但内容条数过多,容器显示滚动条.按说是So easy,容器设死宽.高,CSS加属性 overflow:scroll; -we ...

  5. how to use novaclient python api

    ref: http://docs.openstack.org/developer/python-novaclient/api.html

  6. USACO4.2.1 网络流最大流算法

    /* ID:hk945801 TASK:ditch LANG:C++ */ #include<iostream> #include<cstdio> #include<cs ...

  7. 漫游Kafka入门篇之简单介绍(1)

    介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢?   首先让我们看几个基本的消息系统术语: Kafka将消息以 ...

  8. hdu 2821(dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2821 思路:一开始的时候没注意到,必须从map[i][j]==0的位置开始,然后就是dfs了,回溯的时 ...

  9. ImageLoader must be init with configuration before using

    遇到上面的问题是没有全局初使化ImageLoader,我是在Application中配置了ImageLoaderConfiguration 解决的,当然还有官方的写法 public class MyA ...

  10. 用VS不同版本打开项目,报错:MS Build Error MSB4019: Microsoft.WebApplication.targets was not found

    本例是在用VS2008打开项目是报错 未找到C:\Program Files\MSBuild\Microsoft\VisualStudio\V10.0 In the last article Buil ...