こんにちは、ニューラルネット老人こと糟谷勇児です。
私はドラクエウォークという位置情報を使ったゲームをしています。
ウォークという名前ですが今回のウイルスの件で完全在宅ゲームになって歩く必要がなくなりました。
ドラクエといえば、ストーリーの序盤で圧倒的な力で主人公たちを打ち砕く強大な敵を、中盤で成長した主人公が打ち倒す展開が熱いですよね。
代表的な敵としてはムドーとかゲマとか。
ディープラーニング界のムドーはやはりAlexNetですかね。
ブログ第二回で紹介してから、多層化、ReLU、コンボリューション、マックスプーリングと積み上げてきましたが、それも大詰め、今回はソフトマックス層について学んでいきます。
ソフトマックスはドラクエで言うとチャモロといったところでしょうか。
最終層をSigmoid関数にする際の課題
これまで、中間層はReLU、最終層はSigmoid関数を活性化関数に用いていました。
これまでやってきた、船と飛行機を見分ける問題だと、最終層に二つのニューロンを用意し、一つ目の出力が二つ目の出力より大きければ船、そうでなければ飛行機というように推論を行います。
つまり、大事なのは一つ目のニューロンと二つ目のニューロンの値の差ということになります。
理想的には、船の画像を入れたら、一つ目のニューロンの出力が1でもう片方が0、飛行機の画像を入れたらその逆ということになります。
そのため、船の画像を入れたら(1,0)、飛行機の画像を入れたら(0,1)を正解として学習させていました。
しかし、一つ目と二つ目のニューロンの差が重要ということなら厳密にいえば、(1,0)と(0,1)に近づけることに合理的でない場面も出てきます。
例えば、ある船の画像を入れたら、(0.9, 0.6)という値が出たとします。
二つのニューロンの値の差が0.3あるのである程度分離できていそうです。
では、(0.55, 0.40)という値だったらどうでしょう。
差は0.15で先ほどの半分なので、もう少し差がつくように学習したいですよね。
しかし、(1,0)からの二乗誤差はそれぞれ0.37, 0.36なのでどちらかというと(0.9, 0.6)のほうが誤差が大きい状態になります。
つまり、ニューラルネットから見ると、どちらかというと(0.9, 0.6)を(1,0)に近づける方が優先度が高いわけです。
※正しくは、誤差と優先度が比例するわけではないですがわかりやすさのため。
続きを読む