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