优秀外文博文搬运 + 翻译
原作者:Victor Zhou
链接:A Simple Explanation of the Softmax Function @Victor Zhou
本文为转载翻译内容,文章内容著作权归原作者所有
本文翻译已获得原作者授权
以下为翻译内容(斜体加粗部分为博主补充内容,非原文内容):
什么是 Softmax?如何使用它?怎么用 Python 实现一个 Softmax?
Softmax 会将任意的实数转换成概率,经常用于机器学习。
Softmax 函数背后的数学原理很简单:
这里作者的描述有点点不是很能理解,直接上公式吧:
对于
n
n
n 个数字的输入,Softmax 将对每个数字做如下处理:
s
(
x
i
)
=
e
x
i
∑
j
=
1
n
e
x
j
s(x_i)=\frac{e^{x_i}}{\sum_{j=1}^ne^{x_j}}
s(xi)=∑j=1nexjexi
Softmax 转化输出后的结果永远是在 [0, 1] 的范围内,且所有结果之和等于 1,因此它们呈现出概率分布。
简单例子
假设我们有几个数字 -1,0,3,5。首先来计算一下它的分母(denominator):
D
e
n
o
m
i
n
a
t
o
r
=
e
−
1
+
e
0
+
e
3
+
e
5
=
169.87
Denominator = e^{-1}+e^0+e^3+e^5=\boxed{169.87}
Denominator=e−1+e0+e3+e5=169.87
然后我们分别计算分子(Numerator)和概率:
x x x | Numerator ( e x e^x ex) | 概率 ( e x 169.87 \frac{e^x}{169.87} 169.87ex) |
---|---|---|
-1 | 0.368 | 0.002 |
0 | 1 | 0.006 |
3 | 20.09 | 0.118 |
5 | 148.41 | 0.874 |
x x x 越大,概率值越高,并且所有概率值总和为 1。
用 Python 实现 Softmax
用 Numpy 模块实现很简单:
import numpy as np
# np.exp()会处理输入数组中的每个数字
def softmax(xs):
return np.exp(xs) / sum(np.exp(xs))
xs = np.array([-1, 0, 3, 5])
print(softmax(xs)) # [0.0021657, 0.00588697, 0.11824302, 0.87370431]
注:对于很多进阶的朋友来说,你可能会用 LogSumExp 来实现这个函数以避免 向下/向上 溢出问题。
为什么 Softmax 很有用?
想象一下我们需要建立一个神经网络来解决一个问题:图中的动物是猫还是狗?
对于这种神经网络最普遍的设计就是输出两个实数,一个代表狗,一个代表猫,然后把这两个数抛到 Softmax 里去。比如说,我们神经网络的输出是 [-1, 2]:
动物 | x x x | e x e^x ex | 概率 |
---|---|---|---|
狗 | -1 | 0.368 | 0.047 |
猫 | 2 | 7.39 | 0.953 |
这意味着我们的网络有 95.3% 的信心认定图里的动物是猫。
Softmax 允许我们用概率去回答分类问题,比简单的回答 yes 或 no 更有说服力。(实际上在非 binary classification ,即分类超过两种以上的问题中,我们经常用 softmax 来确定结果)