たれぱんのびぼーろく

わたしの備忘録、生物学とプログラミングが多いかも

softmaxをはじめとする確率化関数

何かの出力を確率として扱いたい。さてどうするべきか

前提: 確率に求められるもの

  • 事象の確率の総和が1
  • 各事象の確率は0~1

方法: いろいろある

事象が2つだけ

ON/OFFを判定したいとき。

0 <= f(x) <= 1 として、f(x)を事象Aの確率、1-f(x)を事象Aの確率とすればいい。
xをRとしたい場合、出力が0~1になっていればいい。
fの候補は

  • sigmoid
  • 0/1-ramp (直線3本で0領域/直線増加領域/1領域を作る)

など。

事象が2つ以上の有限個

Aの確率、Bの確率、Cの確率、みたいなとき。

Σ Pr(x) = 1 が大前提。
単純だがおもしろいことに、
(x_a + x_b + x_c)/Σx_i== 1
が成り立つ。(考えると本当に単純)
xにどんなfを通そうがこれはかわらない。
注意点は分母(総和)が0にならないようにすること。

もう1つの条件は0<=f(x)<=1
"0 <= f(any) かつ f(any)=0でない" が成り立つようにfを設定した場合、Σf(x_i)は0になりえず、かつf(x_k)/Σf(x_i) は上の総和1の定理からかならず1以下になる。
すなわち
0<=f(any) (not 0=f(any)), g(x=k, f) = f(k)/Σf(x)
としたとき、0<=g(x)<=1となって、g(x)は確率としてみなせる。

あとはxの定義域をどこにとりたいか次第。
R全域にとりたい場合、expするのが1つの手 (expは>0)。0ramp(==ReLU)でもいい。

softmax関数はg(x:R, exp)のこと。

わざわざ確率化をする (確率がわかっていれば確率値をそのまま入れて固定してしまえばいい) ということは、学習したい、みたいなことが多い。
最初はでたらめなxを出力してsoftmaxがでたらめな確率を出しているけど、学習してsoftmaxが真の確率分布と一致する、みたいな。
その際は学習方法に合った(特性を持つ)fを選ぶのも重要。
微分値の特性とか、そもそも微分可能かとか。