softmax详解

      softmax又称归一化指数函数。它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类!假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个元素的softmax值就是

 下图展示了softmax的计算方法:

       指数函数的值域是(0,∞) 。与概率取值相似的地方是它们都是非负实数。这样就可以利用指数函数将多分类结果映射到零到正无穷。然后进行归一化处理,便得到近似的概率。

代码

import tensorflow as tf
 
value=tf.constant([1,1,2,4,6,8], dtype=tf.float32)
softmax0=tf.nn.softmax(value)
maxvalueindex = tf.argmax(softmax0)
with tf.Session() as sess:
    print("softmax0 value: ", sess.run(softmax0))
    print("max value index: ", sess.run(maxvalueindex))

softmax0 value:  [7.87494471e-04 7.87494471e-04 2.14063213e-03 1.58172492e-02
 1.16874546e-01 8.63592565e-01]
max value index:  5
  • 分子:通过指数函数,将实数输出映射到零到正无穷。
  • 分母:将所有分子结果相加,进行归一化。

 损失函数(loss function)

        神经网络模型优化的目标都是通过损失函数来定义的。无论是分类问题还是回归问题都会遇见损失函数。 但是在分类问题中,如何评价输出结果的准确性呢?常用的方法是使用交差熵(cross entropy),它的计算值表征两个概率分布之间的距离,它是分类问题中使用比较广的损失函数。

  上式中:y是样本的正确结果,y’是经过神经网络的预测的结果。 
  注意:交差熵定义的两个概率分布的距离,由于神经网络的输出却不是概率分布。因此需要将网络的输出结果转化为概率分布,故在神经网络输出层后加上一个softmax层,将神经网络的输出变成一个概率分布。

 softmax公式 

        损失函数一般都会配合softmax回归一起使用,而什么是softmax回归呢?此时就可以使用交差熵来评估输入数据经过神经网络处理后得到的输出结果y’与正确结果y的距离,距离越小,代表我们设计的神经网络效果越好。 
  例如有一个三分类问题,某个样本的正确答案为[1,0,0],某个模型经过softmax回归的预测结果为(0.5,0.4,0.1),那么它和正确结果的交差熵为: 

       但另外一个模型的输出结果为(0.8,0.1,0.1),则预测值与真实值的交差熵为: 

      从直观的结果可以看出,第二个预测结果要好于第一个预测结果,这和通过交差熵得到的结果是一致的。 

import tensorflow as tf      
#our NN's output      
logits=tf.constant([[1.0,2.0,3.0],[1.0,2.0,3.0],[1.0,2.0,3.0]])      
#step1:do softmax      
y=tf.nn.softmax(logits)     
#true label      
y_=tf.constant([[0.0,0.0,1.0],[0.0,0.0,1.0],[0.0,0.0,1.0]])      
#step2:do cross_entropy      
cross_entropy = -tf.reduce_sum(y_*tf.log(y))      
#do cross_entropy just one step      
cross_entropy2=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_))#dont forget tf.reduce_sum()!!      
with tf.Session() as sess:      
    softmax=sess.run(y)    
    c_e = sess.run(cross_entropy)      
    c_e2 = sess.run(cross_entropy2)      
    print("step1:softmax result=")      
    print(softmax)      
    print("step2:cross_entropy result=")      
    print(c_e)      
    print("Function(softmax_cross_entropy_with_logits) result=")      
    print(c_e2)


 step1:softmax result=    
[[ 0.09003057  0.24472848  0.66524094]    
 [ 0.09003057  0.24472848  0.66524094]    
 [ 0.09003057  0.24472848  0.66524094]]    
step2:cross_entropy result=    
1.22282    
Function(softmax_cross_entropy_with_logits) result=    
0.407606 

       batch的大小为3,经过softmax回归输出的结果是一个3×3的二维矩阵,根据交差熵的公式,应该将每行的结果相加得到3个输入样本的的交差熵,然后在对3行取平均得到这个batch的平均交差熵。但因为分类问题的类别是不变的,所以直接对整个矩阵做平均而不改变计算结果。这种做法可以是程序更加简洁。

MNIST手写数字识别

  为了得到一张给定图片属于某个特定数字类的证据【evidence】,对图片像素进行加权求和。如果这个像素具有很强的证据说明这张图片不属于该类,那么相应的权值为负值相反如果这个像素拥有有利的证据支持这张图片属于这个类,那么权值即为正数。

    

  如下图,红色代表负数值,蓝色代表正数值:

    

  这里的softmax可以看做一个激励【activation】函数或者链接【link】函数,把我们定义的线性函数的输出转化成我们想要的格式,也就是关于10个数字类别的概率分布。因此,给定一张图片,它对于每一个数字的吻合度可以被softmax函数转化成一个概率值。

展开等式右边的子式:

  softmax把输入值当成幂指数求值,再正则化这些结果值。这个幂运算表示,更大的证据对应更大的假设模型【hypothesis】里面的乘数权重值。反之拥有更少的证据意味着在假设模型里面拥有更小的乘数系数。假设模型里面的权值不可以是小于0的数值。Softmax会正则化这些权重值,使它们的总和等于1,以此构造一个有效的概率分布。

    

  如果把它写成一个等式:

       转化为矩阵乘和向量加:

       转化为公式:

参考: 

https://blog.csdn.net/u013230189/article/details/82835717

https://blog.csdn.net/lovelyaiq/article/details/78616736

https://www.cnblogs.com/imlvbu/p/7742930.html

https://blog.csdn.net/m0_37565948/article/details/81324115

https://blog.csdn.net/hearthougan/article/details/82706834

  • 71
    点赞
  • 474
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Softmax归一化是一种常用的数据归一化方法,特别在多分类问题中应用广泛。它将实数输出映射到零到正无穷之间,并将所有输出结果进行归一化。具体来说,Softmax归一化通过指数函数将每个实数输出转化为一个概率值,使得所有概率值相加等于1。这样可以方便地将输出结果解释为各个类别的概率分布。 在实际应用中,Softmax归一化可以通过对输出向量中的每个元素应用指数函数,然后将所有元素相加得到分母,再将每个元素除以分母来实现。这样可以将每个元素的值转化为一个表示该元素所对应类别概率的分数。最终,所有分数相加等于1,表示了各个类别之间的相对概率分布。 举例来说,假设有一个输出向量[1, 1, 2, 4, 6, 8],应用Softmax归一化后,将得到一个新的输出向量[7.87494471e-04, 7.87494471e-04, 2.14063213e-03, 1.58172492e-02, 1.16874546e-01, 8.63592565e-01]。这个新的输出向量表示了各个类别的概率分布,其中索引为5的元素具有最大的概率值,所以对应的类别最有可能是输出结果中的分类。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Softmax归一化【把数据压缩到[0,1],把量纲转为无量纲的过程,方便计算、比较等】](https://blog.csdn.net/weixin_43135178/article/details/116142558)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [softmax详解](https://blog.csdn.net/qq_30460949/article/details/97625216)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值