基础介绍
Softmax将任意实数值转换为概率,这在机器学习中通常很有用。其背后的数学非常简单:给定一些数字,
- 将它们作为 e) (一个数学常数) 的幂
- 加总所有以e为底的指数,结果作为分母
- 每个单独指数为分子
- 概率等于分子除以分母
更确切地说,Softmax对n个给定的$x_1 \ldots x_n$数字作以下转换 :
$$ s(x_i) = \frac{e^{x_i}}{\sum_{j=1}^n e^{x_j}} $$
输出始终在$[0, 1]$之间,并且加总为0.因此,它们形成一个概率分布。
例子
假设我们有数字-1、0、3和5。首先,我们计算分母:
$$ \begin{aligned} \text{分母} &= e^{-1} + e^0 + e^3 + e^5 \\ &= \boxed{169.87} \\ \end{aligned} $$
然后,我们可以计算分子和概率:
$x$ | 分子 ($e^x$) | 概率 ($\frac{e^x}{169.87}$) |
---|---|---|
-1 | 0.368 | 0.002 |
0 | 1 | 0.006 |
3 | 20.09 | 0.118 |
5 | 148.41 | 0.874 |
x越大,概率越高。另外请注意,所有概率加起来为1.
在Python中实现Softmax
使用 numpy 实现起来非常容易:
import numpy as np
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]
np.exp() 将xs作为幂,e作为低
为什么Softmax如此有用?
想象建立一个 神经网络 来回答这个问题: 这张照片是狗还是猫?
该神经网络的一种常见的设计是:它输出2个实数,一个表示小狗,另一个表示猫猫,并应用Softmax处理这些值。例如,假设网络输出 $[-1, 2]$:
动物 | $x$ | $e^x$ | Probability概率 |
---|---|---|---|
狗 | -1 | 0.368 | 0.047 |
猫 | 2 | 7.39 | 0.953 |
这意味着我们的网络有95.3%的置信度相信图片是猫。Softmax让我们用概率回答分类问题,比简单的答案(例如,二进制是/否)更有用。
版权属于:作者名称
本文链接:https://www.sitstars.com/archives/45/
转载时须注明出处及本声明