ソフトマックスは、任意の実数値を確率に変換するもので、機械学習でよく使われるものです。 その背後にある数学は非常にシンプルです。いくつかの数字が与えられたら、
- e (数学的定数) をそれらの数字の各乗に上げます。 この結果が分母です。
- 各数値の指数を分子とします。
- Probability=NumeratorDenominator} = \frac{text{Numerator}}{text{Denominator}}Probability=DenominatorNumerator.
より派手に書くと、Softmaxはnnn個の数x1…xnx_1に対して以下の変換を行う。
s(xi)=exi∑j=1nexjs(x_i) = \frac{e^{x_i}}{sum_{j=1}^n e^{x_j}}s(xi)=∑j=1nexjexi
Softmax 変換の結果は常に範囲内で足して 1 になるように出力されます。
簡単な例
例えば、-1、0、3、5という数字があるとする。 Denominator=e-1+e0+e3+e5=169.87 ◇begin{aligned}text{Denominator} &= e^{-1} + e^0 + e^3 + e^5 ◇boxed{169.87} \\\⑭分母=e-1+e0+e3+e5=169.87
次に分子と確率を計算する:
xxx | ||
---|---|---|
-1 | 0.368 | 0.002 |
0 | 1 | 0.006 |
3 | 20.09 | 0.118 |
5 | 148.41 | 0.874 |
xxxが大きくなるほどその確率は高くなる。
Pythonでのソフトマックスの実装
numpyを使うと超簡単です:
import numpy as npdef softmax(xs): return np.exp(xs) / sum(np.exp(xs))xs = np.array()print(softmax(xs)) #
注意: より高度なユーザーの場合、アンダーフローやオーバーフローの問題を避けるために LogSumExp トリックを使用してこれを実装したいと思うかもしれません。
このニューラルネットワークの一般的な設計は、2 つの実数を出力させ、一方は犬、もう一方は猫を表し、これらの値に対してソフトマックスを適用することです。 例えば、
Animal xxx exe^x Probability Dog -1 0.2 Dog -1 0.2 0.2368
0.047 Cat 2 7.39 0.953 つまり我々のネットワークでは、この写真が猫だと95.3%の確率で判断できるのである。 ソフトマックスは、単純な答え(例えば、2値のはい/いいえ)よりも有用である確率で分類の質問に答えることができます。