softmax应该算是机器学习的入门数学知识了。softmax函数,它并不十分复杂,但又不是十分简单,总之这个函数就是很难去背诵下来,以致于每次你要写softmax的时候,都得搜一下才行。而每次搜索softmax,都对你的信心是一次小规模打击——这么简单的数学公式我还不会?我这是要凉啊。。。
好了,废话少说。我想,我们一直难以把并不很复杂的softmax函数背下来的原因,可能并非因为我们懒,而是因为我们一直都没有摸透softmax的本质。这可能也和我们接触softmax的时间点有关——我们接触它的时候是初学者,亦步亦趋地追随课程进度或者博客的知识尚且费劲儿,对于这类公式,我们就当它“本来就该是这样”了。至少对我而言,我一直都想不通,softmax的公式为何这么奇怪。
我们来看看softmax的另一个名字就一目了然了———softmax函数,又称归一化指数函数。
所以很显然,softmax的意思呢,即是将一个k维向量z,映射到另一个k维空间中,这种映射函数就是softmax。那么我们为啥要softmax来映射一遍?因为softmax可以将向量z的每个维度的取值均压缩至(0,1)之间。这就是softmax的本质,也是softmax函数的初衷
因此,softmax函数的表达式就显而易见了:分母是所有k维向量z所有维度的自然底数e指数之和,分子是待求维度的自然底数e的指数,如下所示:
$$softmax(z)_j = \dfrac{e^{z_j}}{\sum_{k=1}^{K}e^{z_k}}$$
其中,\(softmax(z)_j\)指的是k维向量z经过softmax函数映射后的第j维的取值。
而softmax在机器学习或深度学习中,更多的是以“多项逻辑回归”而存在的,用来计算样本向量\(X^{(i)}\)属于某个类别的概率分布。其中,属于第j个类别的概率为:
$$P(y^{(i)}|x^{(i)};\Theta) = \dfrac{e^{\Theta^{T}X^{(i)}_j}}{\sum_{k=1}^{K} e^{\Theta^{T}X^{(i)}_k}}$$
如公式所示,我们同样将向量\(\Theta^{T} X^{(i)}\)进行归一化映射。
python实现(其实是numpy实现)
import numpy as np
z = np.array([1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0])
softmax_z = np.exp(z)/sum(np.exp(z))
最后,在谈一谈softmax名字的由来:
Softmax 不同于普通的 max 函数:max 函数只输出最大的那个值,而 Softmax 则确保较小的值也有较小的概率,不会被直接舍弃掉,是一个比较“Soft”的“max”,这个“soft”是对比合页损失的“hard”而来的。