softmax関数
softmax関数は、出力を合計が100%の確率分布に変換してくれる関数です。
use strict; use warnings; # softmax関数 sub softmax { my ($nums) = @_; my $exp_total = 0; for (my $i = 0; $i < @$nums; $i++) { $exp_total += exp($nums->[$i]); } my $nums_out = []; for (my $i = 0; $i < @$nums; $i++) { $nums_out->[$i] = exp($nums->[$i]) / $exp_total; } return $nums_out; } my $outputs = [0.07, 0.14, 0.24]; my $softmax_outputs = softmax($outputs); # 0.306954386271124 0.329211090547647 0.363834523181229 print "@$softmax_outputs\n";
もし出力に0が含まれていた場合でも、softmax関数の出力は、計算可能です。
my $outputs = [0, 0.14, 0.24]; my $softmax_outputs = softmax($outputs); # 0.292267512114761 0.336187661442797 0.371544826442441 print "@$softmax_outputs\n";
損失関数であるクロスエントロピー誤差は、引数の値に0を含んでいる場合に、log(0)となるので、計算不能になりますが、softmax関数を出力層の活性化関数として使うと回避できます。
softmax関数の導関数
softmax関数の導関数は表現が難しいです。
ただし、softmax関数とクロスエントロピー誤差の合成関数の導関数は表現が簡単なので、逆誤伝播法に使えます。