質問: 私は現在ディープラーニングについて、とりわけ動物の顔認識について調査しているものです。ご指導ご鞭撻いただけないでしょうか。 私の現在のターゲットはCNNで動物の顔を認識させることです。(おそらく2クラス分類を想定しており、ある動物かそれ以外のすべてかに分類します。)いまの状況はImageNetのデータベースからその動物の写真をひっぱってきて顔の部分のみを切り出したものを500枚集めました。期待結果は画像をCNNにかけたときにそれがその動物かそれ以外かに分けることです。 以下質問です。 * この場合に用いるべき活性化関数はソフトマックスとシグモイドでどちらが好ましいのでしょうか。 * その動物以外のクラスについては、データセットをどのように準備して学習を行えばよいでしょうか。 どうか上記質問にお答えいただけないでしょうか。
回答: 2クラス分類についてはソフトマックスよりもシグモイドを用いるべきです. この理由は,シグモイドはソフトマックスの2クラス時の場合に対応するからです. シグモイドの場合出力が二つでなく一つなのは2クラス分類において片方のクラスの確率さえ分かればもう片方の確率を自動的に決めることができるからです. 実際にシグモイドを式変形すると片方のクラスの入力に関係する重みが全て0(つまりソフトマックスに入力される片方のクラスの値が固定値,ソフトマックスの場合片方のクラスについて入力される値が0でももう片方のクラスの入力が負なら正規化の効果で出力は0にならないことに注意)の2クラス用ソフトマックスになります. これだけならソフトマックスを使うのでもかまわないという話になりますが(そして実際にはそれでも特に問題はないでしょうが)シグモイドは制約を元にソフトマックスのパラメータを削減していると見なせるので,ソフトマックスを用いるよりも過学習を避けられることが期待できます. 以上から2クラス分類についてはソフトマックスよりもシグモイドを用いるべきです. 豚以外のクラスについてどういった画像を集めるべきかは問題設定によります.例えば豚と犬が混じっている画像集合を豚の集合と犬の集合に分けるという問題設定ならば,豚の画像と犬の画像を用意して,入力が豚の画像なら1,犬の画像なら0を出力するようにNNを学習させるのが良いでしょう.もっと汎用的に,豚と豚以外の一般物体を判別するなら,豚以外の一般物体の画像を手当たりしだいに集めて負例として用いるの良いでしょう. 今回は豚について500枚しか画像がないということなので,一からNNを学習させて汎化させるのは困難であると思われます.過学習を避けるには少なくとも以下のどれかを行う必要があるでしょう. * 豚の画像を増やす * 豚の顔認識であるという制約を元にNNの構造を工夫する * ImageNetで一般物体分類を学習済みのNN(例えばVGG16など)を用意してファインチューニングする この中だととりあえず最後のファインチューニングが手軽でしょう.