输出的【0.9 0.2 0】 onehot 1 0 0 对应下标,然后label 0 参考https://blog.csdn.net/afgasdg/article/details/84346931
[5.0 0.0 0.0] // one_hot(0)
[0.0 0.0 5.0] // one_hot(2)
[0.0 0.0 0.0] // one_hot(-1)
[0.0 5.0 0.0] // one_hot(1)

Softmax函数详解与推导

一、softmax函数

softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类!

假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个元素的softmax值就是

更形象的如下图表示:

softmax直白来说就是将原来输出是3,1,-3通过softmax函数一作用,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标!

举一个我最近碰到利用softmax的例子:我现在要实现基于神经网络的句法分析器。用到是基于转移系统来做,那么神经网络的用途就是帮我预测我这一个状态将要进行的动作是什么?比如有10个输出神经元,那么就有10个动作,1动作,2动作,3动作...一直到10动作。(这里涉及到nlp的知识,大家不用管,只要知道我现在根据每个状态(输入),来预测动作(得到概率最大的输出),最终得到的一系列动作序列就可以完成我的任务即可)

原理图如下图所示:

那么比如在一次的输出过程中输出结点的值是如下:

[0.2,0.1,0.05,0.1,0.2,0.02,0.08,0.01,0.01,0.23]

那么我们就知道这次我选取的动作是动作10,因为0.23是这次概率最大的,那么怎么理解多分类呢?很容易,如果你想选取俩个动作,那么就找概率最大的俩个值即可~(这里只是简单的告诉大家softmax在实际问题中一般怎么应用)

二、softmax相关求导

当我们对分类的Loss进行改进的时候,我们要通过梯度下降,每次优化一个step大小的梯度,这个时候我们就要求Loss对每个权重矩阵的偏导,然后应用链式法则。那么这个过程的第一步,就是对softmax求导传回去,不用着急,我后面会举例子非常详细的说明。在这个过程中,你会发现用了softmax函数之后,梯度求导过程非常非常方便!

下面我们举出一个简单例子,原理一样,目的是为了帮助大家容易理解!

我们能得到下面公式:

z4 = w41*o1+w42*o2+w43*o3

z5 = w51*o1+w52*o2+w53*o3

z6 = w61*o1+w62*o2+w63*o3

z4,z5,z6分别代表结点4,5,6的输出,01,02,03代表是结点1,2,3往后传的输入.

那么我们可以经过softmax函数得到

好了,我们的重头戏来了,怎么根据求梯度,然后利用梯度下降方法更新梯度!

要使用梯度下降,肯定需要一个损失函数,这里我们使用交叉熵作为我们的损失函数,为什么使用交叉熵损失函数,不是这篇文章重点,后面有时间会单独写一下为什么要用到交叉熵函数(这里我们默认选取它作为损失函数)

交叉熵函数形式如下:

其中y代表我们的真实值,a代表我们softmax求出的值。i代表的是输出结点的标号!在上面例子,i就可以取值为4,5,6三个结点(当然我这里只是为了简单,真实应用中可能有很多结点)

现在看起来是不是感觉复杂了,居然还有累和,然后还要求导,每一个a都是softmax之后的形式!

但是实际上不是这样的,我们往往在真实中,如果只预测一个结果,那么在目标中只有一个结点的值为1,比如我认为在该状态下,我想要输出的是第四个动作(第四个结点),那么训练数据的输出就是a4 = 1,a5=0,a6=0,哎呀,这太好了,除了一个为1,其它都是0,那么所谓的求和符合,就是一个幌子,我可以去掉啦!

为了形式化说明,我这里认为训练数据的真实输出为第j个为1,其它均为0!

那么Loss就变成了,累和已经去掉了,太好了。现在我们要开始求导数了!

我们在整理一下上面公式,为了更加明白的看出相关变量的关系:

其中,那么形式变为

那么形式越来越简单了,求导分析如下:

参数的形式在该例子中,总共分为w41,w42,w43,w51,w52,w53,w61,w62,w63.这些,那么比如我要求出w41,w42,w43的偏导,就需要将Loss函数求偏导传到结点4,然后再利用链式法则继续求导即可,举个例子此时求w41的偏导为:

w51.....w63等参数的偏导同理可以求出,那么我们的关键就在于Loss函数对于结点4,5,6的偏导怎么求,如下:

这里分为俩种情况:

j=i对应例子里就是如下图所示:

比如我选定了j为4,那么就是说我现在求导传到4结点这!

那么由上面求导结果再乘以交叉熵损失函数求导

,它的导数为,与上面相乘为(形式非常简单,这说明我只要正向求一次得出结果,然后反向传梯度的时候,只需要将它结果减1即可,后面还会举例子!)那么我们可以得到Loss对于4结点的偏导就求出了了(这里假定4是我们的预计输出)

第二种情况为:

这里对应我的例子图如下,我这时对的是j不等于i,往前传:

那么由上面求导结果再乘以交叉熵损失函数求导

,它的导数为,与上面相乘为(形式非常简单,这说明我只要正向求一次得出结果,然后反向传梯度的时候,只需要将它结果保存即可,后续例子会讲到)这里就求出了除4之外的其它所有结点的偏导,然后利用链式法则继续传递过去即可!我们的问题也就解决了!

三、下面我举个例子来说明为什么计算会比较方便,给大家一个直观的理解

举个例子,通过若干层的计算,最后得到的某个训练样本的向量的分数是[ 2, 3, 4 ],
那么经过softmax函数作用后概率分别就是=[] = [0.0903,0.2447,0.665],如果这个样本正确的分类是第二个的话,那么计算出来的偏导就是
 [0.0903,0.2447-1,0.665]=[0.0903,-0.7553,0.665],是不是非常简单!!然后再根据这个进行back propagation就可以了

到这里,这篇文章的内容就讲完了,我希望根据自己的理解,通过列出大量例子,直白的给大家讲解softmax的相关内容,让大家少走弯路,真心希望对大家的理解有帮助!欢迎交流指错!画图整理不易,觉得有帮助的给个赞呗,哈哈!

标签: softmax
好文要顶 关注我 收藏该文

理想几岁
关注 - 2
粉丝 - 10

+加关注

0
0

« 上一篇: 机器学习--降维算法:PCA主成分分析
» 下一篇: numpy.pad

 </div><div class="postDesc">posted @ <span id="post-date">2018-04-29 16:13</span> <a href="https://www.cnblogs.com/zongfa/">理想几岁</a> 阅读(<span id="post_view_count">1616</span>) 评论(<span id="post_comment_count">0</span>)  <a href="https://i.cnblogs.com/EditPosts.aspx?postid=8971213" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(8971213);return false;">收藏</a></div>
</div>
<script type="text/javascript">var allowComments=true,cb_blogId=376489,cb_entryId=8971213,cb_blogApp=currentBlogApp,cb_blogUserGuid='4e529b37-eb7a-4c3f-e3b2-08d49c352df2',cb_entryCreatedDate='2018/4/29 16:13:00';loadViewCount(cb_entryId);var cb_postType=1;</script>

</div><!--end: forFlow -->
</div><!--end: mainContent 主体内容容器--><div id="sideBar"><div id="sideBarMain">

公告

昵称: 理想几岁
园龄: 1年6个月
粉丝: 10
关注: 2

+加关注

      <div id="blog-calendar" style=""><table id="blogCalendar" class="Cal" title="Calendar" cellspacing="0" cellpadding="0">
<tbody><tr><td colspan="7"><table class="CalTitle" cellspacing="0"><tbody><tr><td class="CalNextPrev"><a href="javascript:void(0);" onclick="loadBlogCalendar('2018/11/01');return false;">&lt;</a></td><td align="center">2018年12月</td><td class="CalNextPrev" align="right"><a href="javascript:void(0);" onclick="loadBlogCalendar('2019/01/01');return false;">&gt;</a></td></tr>
</tbody></table></td></tr><tr><th class="CalDayHeader" abbr="日" scope="col" align="center">日</th><th class="CalDayHeader" abbr="一" scope="col" align="center">一</th><th class="CalDayHeader" abbr="二" scope="col" align="center">二</th><th class="CalDayHeader" abbr="三" scope="col" align="center">三</th><th class="CalDayHeader" abbr="四" scope="col" align="center">四</th><th class="CalDayHeader" abbr="五" scope="col" align="center">五</th><th class="CalDayHeader" abbr="六" scope="col" align="center">六</th></tr><tr><td class="CalOtherMonthDay" align="center">25</td><td class="CalOtherMonthDay" align="center">26</td><td class="CalOtherMonthDay" align="center">27</td><td class="CalOtherMonthDay" align="center">28</td><td class="CalOtherMonthDay" align="center">29</td><td class="CalOtherMonthDay" align="center">30</td><td class="CalWeekendDay" align="center">1</td></tr><tr><td class="CalWeekendDay" align="center">2</td><td align="center">3</td><td align="center"><a href="https://www.cnblogs.com/zongfa/archive/2018/12/04.html"><u>4</u></a></td><td align="center">5</td><td align="center">6</td><td align="center">7</td><td class="CalWeekendDay" align="center">8</td></tr><tr><td class="CalWeekendDay" align="center">9</td><td align="center">10</td><td align="center">11</td><td align="center">12</td><td align="center">13</td><td align="center">14</td><td class="CalWeekendDay" align="center">15</td></tr><tr><td class="CalWeekendDay" align="center">16</td><td align="center">17</td><td align="center">18</td><td align="center">19</td><td align="center"><a href="https://www.cnblogs.com/zongfa/archive/2018/12/20.html"><u>20</u></a></td><td class="CalTodayDay" align="center">21</td><td class="CalWeekendDay" align="center">22</td></tr><tr><td class="CalWeekendDay" align="center">23</td><td align="center">24</td><td align="center">25</td><td align="center">26</td><td align="center">27</td><td align="center">28</td><td class="CalWeekendDay" align="center">29</td></tr><tr><td class="CalWeekendDay" align="center">30</td><td align="center">31</td><td class="CalOtherMonthDay" align="center">1</td><td class="CalOtherMonthDay" align="center">2</td><td class="CalOtherMonthDay" align="center">3</td><td class="CalOtherMonthDay" align="center">4</td><td class="CalOtherMonthDay" align="center">5</td></tr>

     <div id="leftcontentcontainer"><div id="blog-sidecolumn"><div id="sidebar_search" class="sidebar-block">

搜索

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论
  • 我的标签

我的标签

  • 机器学习(21)
  • tensorflow(9)
  • Python(7)
  • R语言(7)
  • Django(6)
  • 自然语言处理(5)
  • 神经网络(4)
  • 深度学习(3)
  • MySQL(3)
  • LDA(2)
  • 更多

随笔档案

  • 2018年12月 (3)
  • 2018年10月 (5)
  • 2018年9月 (6)
  • 2018年8月 (15)
  • 2018年7月 (21)
  • 2018年6月 (5)
  • 2018年5月 (10)
  • 2018年4月 (8)
  • 2018年3月 (14)
  • 2018年1月 (5)
  • 2017年12月 (9)
  • 2017年11月 (4)
  • 2017年10月 (8)
  • 2017年9月 (2)
  • 2017年8月 (1)
  • 最新评论

    <div id="RecentCommentsBlock"><ul><li class="recent_comment_title"><a href="https://www.cnblogs.com/zongfa/p/7879509.html#4126115">1. Re:ubuntu下终端路径显示的修改</a></li><li class="recent_comment_body">ubuntu16.04PS1="\u:\[\e[37;1m]\W\[\e[m\] \$ "去掉加粗部分才可以...</li><li class="recent_comment_author">--晨洋A</li><li class="recent_comment_title"><a href="https://www.cnblogs.com/zongfa/p/7988968.html#4118600">2. Re:linux下创建virtualenv时指定python版本</a></li><li class="recent_comment_body">@泡泡吐肥皂o。。。。。。。我看懂了啊...</li><li class="recent_comment_author">--匡子语</li><li class="recent_comment_title"><a href="https://www.cnblogs.com/zongfa/p/7988968.html#4111940">3. Re:linux下创建virtualenv时指定python版本</a></li><li class="recent_comment_body">这种文章还发,也就自己能看懂了</li><li class="recent_comment_author">--泡泡吐肥皂o</li><li class="recent_comment_title"><a href="https://www.cnblogs.com/zongfa/p/7967935.html#3929271">4. Re:Linux下iptables 禁止端口和开放端口</a></li><li class="recent_comment_body">赞 ❥</li><li class="recent_comment_author">--Subfire</li>
    

    阅读排行榜

    • 1. Linux下iptables 禁止端口和开放端口(58727)
    • 2. Ubuntu16.04安装Redis(22587)
    • 3. linux下创建virtualenv时指定python版本(9600)
    • 4. linux 将一个服务器上的文件或者文件夹复制到另一台服务器上(6047)
    • 5. Python的Django框架中forms表单类的使用方法详解(5976)

    评论排行榜

    • 1. linux下创建virtualenv时指定python版本(2)
    • 2. Linux下iptables 禁止端口和开放端口(1)
    • 3. ubuntu下终端路径显示的修改(1)

    推荐排行榜

    • 1. Ubuntu16.04安装Redis(1)
    • 2. R语言之数据处理常用包(1)

     </div><!--end: sideBarMain -->
    </div><!--end: sideBar 侧边栏容器 -->
    <div class="clear"></div>
    </div>
    

sortmax输入到输出的图片化解读,以及变成label的过程相关推荐

  1. 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( 线性卷积起点定理推导过程 )

    文章目录 一.线性卷积起点定理推导过程 推导 [数字信号处理]线性时不变系统 LTI " 输入 " 与 " 输出 " 之间的关系 ( 线性卷积起点定理 | 左边 ...

  2. IO编程__字节流__输入、输出__图片移动

    一.代码如下 package www.tainiu.wenjian;import java.io.FileInputStream; import java.io.FileNotFoundExcepti ...

  3. C++输入和输出:控制台I/O(键盘和屏幕)及文件I/O详细笔记

    从控制台I/O(键盘和屏幕)到文件IO记录明白C++输入和输出) 输入和输出概述 1.CPP输入输出的管理: 2.流类库 3.流对象的建立和使用及输入输出的实现 4.Ostream对象cout及其部分 ...

  4. 《人工智能实践:Tensorflow笔记》听课笔记22_6.1输入手写数字图片输出识别结果

    附:课程链接 第六讲.全连接网络实践 6.1输入手写数字图片输出识别结果 由于个人使用Win7系统,并未完全按照课程所讲,以下记录的也基本是我的结合课程做的Windows系统+PyCharm操作.且本 ...

  5. 【2022年第一期 CANN训练营学习笔记】进阶班应用开发课 大作业1-开发DVPP应用,输入,输出都是JPEG图片,且分辨率不同

    1.大作业1题目如下:开发DVPP应用,输入,输出都是JPEG图片,且分辨率不同. 根据作业提示,转换的思路如下: 原始JPEG图片->JPEG解码->YUV Resize->JPE ...

  6. Python学习笔记:输入和输出

    本文来自:入门指南 开胃菜参考:开胃菜 使用Python解释器:使用Python解释器 本文对Python的简介:Python简介 Python流程介绍:深入Python流程 Python数据结构:P ...

  7. xml文件 卷积神经网络_理解卷积神经网络中的输入与输出形状(Keras实现)

    即使我们从理论上理解了卷积神经网络,在实际进行将数据拟合到网络时,很多人仍然对其网络的输入和输出形状(shape)感到困惑.本文章将帮助你理解卷积神经网络的输入和输出形状. 让我们看看一个例子.CNN ...

  8. TensorFlow神经网络(五)输入手写数字图片进行识别

    一.断点续训 为防止突然断电.参数白跑的情况发生,在backward中加入类似于之前test中加载ckpt的操作,给所有w和b赋保存在ckpt中的值: 1. 如果存储断点文件的目录文件夹中,包含有效断 ...

  9. web安全性测试用例(输入、输出、SQL注入、跨站请求伪造(CSRF)、跨站脚本攻击(XSS))实实在在的干货

    https://www.cnblogs.com/qmfsun/p/3724406.html 建立整体的威胁模型,测试溢出漏洞.信息泄漏.错误处理.SQL 注入.身份验证和授权错误. 1.   输入验证 ...

最新文章

  1. STL:list用法详解
  2. 【开通指南】 实时计算 Flink 全托管版本
  3. NetAdvangate Infragisticss 控件在工程移动到别的机器上,引用失效问题
  4. 【项目经理之修炼】 全文索引
  5. 【BZOJ 1951】 [Sdoi2010]古代猪文
  6. ios获取区域服务器信息,ios获取服务器数据
  7. 系统学习深度学习(十九)--GoogLeNetV1,V2,V3
  8. 初步认识图像的直方图
  9. 匈牙利算法求最大匹配
  10. netlogo-入门-学习记录
  11. python isin_python numpy isin用法及代码示例
  12. Tensorflow入门(一)----”搭建图像识别系统“教程整理
  13. 对excel的导出,使用jxt
  14. Android6.0风格图标,jQuery仿Android样式扁平风格图标插件
  15. windows自动卸载程序
  16. 《数学建模简明教程--基于python》学习笔记-第四章-微分方程-课后习题解答
  17. 关于Halcon::threshold 用时
  18. 骨头镇 BoneTown 破解+菜单汉化补丁
  19. 一种高效快速的高密度椒盐噪声消除算法(吕宗伟等)
  20. 专转本计算机模拟试卷,江苏专转本计算机模拟试卷

热门文章

  1. 程序员读老子,第一章
  2. 央视国际总经理汪文斌
  3. video.js 源码分析(JavaScript)
  4. 机器学习中的过拟合与解决办法
  5. [从零开始学DeepFaceLab-8]: 使用-命令行八大操作步骤-第5步:从源图片中提取所需图片
  6. codeforces-1131D Gourmet choice(拓扑排序)
  7. 2018年的几点建议
  8. nginx配置阿里云https的坑
  9. 【JavaSe】网络编程篇(一) 网络编程入门
  10. STM32F429使用touchGFX驱动外部flash存储资源