softmax,看名字就知道,就是如果判断输入属于某个类的概率大于属于其它类的概率,那么这个类对应的值就逼近于1,其它类的值就逼近于0,该算法的主要应用就是多分类,而且是互斥的,即只能属于其中一个类,和sigmoid类的激活函数不同的是,一般的激活函数只能分两类,所以可以理解成softmax是sigmoid类的激活函数的扩展。它的算法如下:

它的图形化原理如下:

也就是把所有的值用e的指数函数表示出来,求和后算每个值占的比率,保证总和为1,一般就可以认为softmax得出的就是概率.

抽象层面的原理如下所示:

在网络层面,它可以表示为:

c语言实现:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <stdint.h>void softmax(const float *input, const uint32_t dim_vec, float *output)
{float sum = 0.0f;         for(int i = 0; i < dim_vec; i++){                         output[i] = expf(input[i]);sum = sum + output[i];}                         for(int i = 0; i < dim_vec; i++){                         output[i] = output[i] / sum;}
}int main(void)
{float input[10] = {1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1};float output[10]={0};softmax(input, 10, output);int i;for(i = 0; i < 10; i ++){printf("%f ", output[i]);}printf("\n");return 0;
}

编译:

gcc softmax.c -lm -o softmax

测试:

可以看到,最后输出的概率和值是成正相关的。

expf是libm.a中提供的库函数,实现的是指数函数,在musl libc中的实现如下:

图形化表示:

在实际的网络中,softmax通常和交叉熵误差(cross entropy error)联合在一起用,作为网络的最后一层,这一层没有训练参数,如下图所示.

变量之间的关系如下:

以上图为例,展开后:

进一步化简得:

由于是onehot标签,每组只有一个1,所以

所以:

所以:

过程虽然复杂,但是根据求导的链式法则,经过层层计算后,得到了非常具有美感的结果,实际上,这样漂亮的结果并非偶然,而是为了得到这样的结果,故意实际了交叉墒误差函数,神经网络中的误差函数很多都是人为设计的。

二维空间和三维空间中的交叉熵函数图示表达:

参考:


结束!

softmax与交叉墒层的实现原理以及梯度计算相关推荐

  1. matlab求梯度的原理,matlab 梯度计算原理

    转自 http://blog.csdn.net/xiaojidan2011/article/details/7658366 [plain] view plain copy clc; x=[8, 9,  ...

  2. 人脸识别-Loss-2010:Softmax Loss(Softmax激活函数 + “交叉熵损失函数”)【样本3真实标签为c_5,则样本3的损失:loss_3=-log(\hat{y}_5^3)】

    一般一个CNN网络主要包含卷积层,池化层(pooling),全连接层,损失层等. 全连接层:等号左边部分就是全连接层做的事, W W W 是全连接层的参数,我们也称为权值, X X X 是全连接层的输 ...

  3. pytoch人工神经网络基础:最简单的分类(softmax回归+交叉熵分类)

    softmax回归分类原理 对于回归问题,可以用模型预测值与真实值比较,用均方误差这样的损失函数表示误差,迭代使误差最小训练模型. 那么分类问题是否可以用线性回归模型预测呢.最简单的方法就是用soft ...

  4. 度量学习(Metric learning)—— 基于分类损失函数(softmax、交叉熵、cosface、arcface)

    概述 首先,我们把loss归为两类:一类是本篇讲述的基于softmax的,一类是基于pair对的(如对比损失.三元损失等). 基于pair对的,参考我的另一篇博客: https://blog.csdn ...

  5. 【机器学习基础】Softmax与交叉熵的数学意义(信息论与概率论视角)

    经过我长时间的观察,发现很多人对人工智能/机器学习的理解只停留在"这是个经典/最新棒槌,我拿这个棒槌敲钉子贼6--"这个level.当然,如果真的敲得很6,那也是一个很厉害的大佬了 ...

  6. 神经网络适用于分类问题的最后一层-Softmax和交叉熵损失介绍及梯度推导

    前言 传统机器学习中两大经典任务就是回归与分类.分类在深度学习中也很常见,令我印象最深的是图像分类.当然,在NLP中,分类也无处不在.从RNN与其变体,到Transformer.Bert等预训练模型, ...

  7. 神经网络学习中的SoftMax与交叉熵

    简 介: 对于在深度学习中的两个常见的函数SoftMax,交叉熵进行的探讨.在利用paddle平台中的反向求微分进行验证的过程中,发现结果 与数学定义有差别.具体原因还需要之后进行查找. 关键词: 交 ...

  8. 机器学习 Softmax classifier (无隐含层)

    程序实现 Softmax classifer, 没有隐含层, f=wx+b y=efi∑jefj %% Softmax classifierfunction Out=Softmax_Classifie ...

  9. DL之DNN:利用numpy自定义三层结构+softmax函数建立3层完整神经网络全部代码实现(探究BP神经网络的底层思想)

    DL之DNN:利用numpy自定义三层结构+softmax函数建立3层完整神经网络全部代码实现(探究BP神经网络的底层思想) 目录 输出结果 代码实现 输出结果 代码实现 #DL之NN:利用numpy ...

最新文章

  1. 网上几种常见校验码图片分析
  2. 前置机上如何地址转换_canvas原生层级较高,遮盖自定义tabbar,转换为图片解决...
  3. 查看python安装路径-Mac查看Python安装路径和版本
  4. ( function(){…} )()和( function (){…} () )是两种立即执行函数
  5. [渝粤教育] 广东-国家-开放大学 21秋期末考试建筑设备10327k1
  6. 浅析C语言中assert的用法(转)
  7. 阿里云视频点播解决方案使用教程
  8. .net core2 单元测试
  9. c语言 结构体 选择题,C语言结构体共用体选择题(新).doc
  10. RS信号制java程序,java – 如何部署一个JAX-RS应用程序?
  11. atitit.激活一个窗口总结 swing java .net php
  12. css grid 自动高度_前端面试题:关于CSS布局
  13. 标准模板库(STL)之 queue 列传
  14. python所有软件-太牛逼!一款软件几乎可以操作所有的数据库!
  15. Mock Server基本使用方法
  16. riot修改服务器,riot改地区教程
  17. 计算机组成与原理第三章答,计算机组成与原理第三章答案.doc
  18. iis下屏蔽php notice,apache、iis规则屏蔽拦截蜘蛛抓取
  19. java 四舍六入五成双_EXCEL实现四舍六入五成双修约规则的方法
  20. Java:外包Java项目有什么好处?

热门文章

  1. C 三个学生四门成绩,求成绩总和与平均值
  2. ShopWind 开源电商系统 V3.4.3 发布,uni-app 商城案例,PC+APP+H5 + 小程序
  3. MiniJavaVM——一个Java虚拟机的设计和实现
  4. coffeeScript demo
  5. 【效能工具】记录常用效能工具
  6. LoadRunner 12.02 进行录制脚本时提示无Internet访问
  7. 033 Rust死灵书之重构Vec
  8. 新松机器人袁_山东新松工业软件研究院创新发展战略务虚会“实力”召开!
  9. 中国无管道通风柜市场趋势报告、技术动态创新及市场预测
  10. luoguP4098「HEOI2013」ALO