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関数とクロスエントロピー誤差の合成関数の導関数は表現が簡単なので、逆誤伝播法に使えます。

関連情報