ソフトマックス関数の簡単な説明

ソフトマックスは、任意の実数値を確率に変換するもので、機械学習でよく使われるものです。 その背後にある数学は非常にシンプルです。いくつかの数字が与えられたら、

  1. e (数学的定数) をそれらの数字の各乗に上げます。 この結果が分母です。
  2. 各数値の指数を分子とします。
  3. 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

次に分子と確率を計算する:

<分子 (exe^xex) <6248>確率 (ex169.ex) (分母) (分子)

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)) # 
np.exp() 入力配列中の各要素のe乗を上げる。

注意: より高度なユーザーの場合、アンダーフローやオーバーフローの問題を避けるために LogSumExp トリックを使用してこれを実装したいと思うかもしれません。

このニューラルネットワークの一般的な設計は、2 つの実数を出力させ、一方は犬、もう一方は猫を表し、これらの値に対してソフトマックスを適用することです。 例えば、

0.2 0.2368

Animal xxx exe^x Probability
Dog -1 0.2 Dog -1 0.047
Cat 2 7.39 0.953

つまり我々のネットワークでは、この写真が猫だと95.3%の確率で判断できるのである。 ソフトマックスは、単純な答え(例えば、2値のはい/いいえ)よりも有用である確率で分類の質問に答えることができます。

コメントを残す

メールアドレスが公開されることはありません。