期待される出力を確率で表現する

ディープラーニングの期待される出力を確率で表現しましょう。確率で表現するとディープラーニングの精度が上がるようです。

手書き文字認識の場合は「0」~「9」の10個の数字が正解として期待されます。

これを確率で表現します。配列の中の「1」は「100%」、0は「0%」のことだと考えてください。

# 確率による表現
0 -> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
1 -> [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
2 -> [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
3 -> [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
4 -> [0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
5 -> [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
6 -> [0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
7 -> [0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
8 -> [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
9 -> [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

配列の要素の値は、期待される値になる確率を表現しています。たとえば、4の場合ですと、配列の添え字の4番目の値が100%で、それ以外が0%というのが、確率で表現された期待される出力です。

一般的には、この操作は、ベクトル化と呼ばれますが、意味を簡潔に書くと、期待される出力を確率として表現するということです。

一般のパターン認識の場合は「犬」「猫」「ネズミ」を「0」「1」「2」に割り当てると、同じようにできます。

期待される出力を確率で表現する

期待される出力を確率に変換するプログラムを書いてみましょう。

use strict;
use warnings;

sub probabilize_output {
  my ($outputs_length, $desired_value) = @_;
  
  my $probabilized_outputs = [];
  for (my $i = 0; $i < $outputs_length; $i++) {
    $probabilized_outputs->[$i] = $desired_value == $i ? 1 : 0;
  }
  
  return $probabilized_outputs;
}

my $outputs_length = 10;
my $desired_value = 4;

my $probabilized_outputs = probabilize_output($outputs_length, $desired_value);

# 0 0 0 0 1 0 0 0 0 0
print "@$probabilized_outputs\n";

関連情報