ソフトマックス関数の出力層実装(ディープラーニングStep VI)

 今回は、出力層にソフトマックス関数を実装します。  機械学習は 「回帰問題」と「分類問題」に大別でき、その解法手順は「学習」と「推計」の2つフェーズから成るということです。 そして「回帰問題」では恒等関数を出力層に適用し、「分類問題」ではソフトマックス関数を適用するということです。 このため、解法手順として、先に行うデータの推論・分類を行う「学習」フェーズでの活性関数は、「回帰問題」として恒等関数を適用し、「推計」フェーズでは「分類問題」としてソフトマックス関数を適用するということです。 今回はこのソフトマックス関数の実装となります。  

 まだ「回帰問題」と「分類問題」、「学習」と「推計」の違いを理解をしていない段階で、「推計」用のソフトマックス関数の実装ということになりますが、 全体感がまだ漠然としていて、混沌の理解の中で、とりえずソフトマックス関数の実装を目指してみます。

1. ソフトマックス関数

  これまでに学習した活性関数はステップ関数やシグモイド関数などで、1変数の入力で1結果の出力をする関数でした。 ソフトマックス関数は多変数入力の多変数結果の出力の活性関数となります。  式は(VI-1)になります。

 多入力で、入力と同数の出力を作ることが出来る。 フロー図では Fig.(VI-1)として示されます。  

プログラムでは関数として定義しています。  関数の引数はNumpy配列になります。

 このソフトマックス(Softmax)関数では、どんな変換が行われるのか。 事例で理解したいと思います。  以前にSin関数を例にして0~2πまでをプロットグラフにしました。今度は、このSin関数の結果を入力値としてSoftmax関数の確認をしてみることにしてみます。   ただ、Softmax関数 の特徴として、入力値の大きさ(マイナスの値が小さい数、1000程度が大きい数と云えそうです。) とデータ数 (数個が少ない数、数千個が大きい数 )が関係しているようです。 ここでは、 Sin関数の値が1以下となるので、入力値を100倍して ‐100≦100Sin(x)≦+100 とします。また、Softmax関数の出力も1以下なので、100倍して入力と出力のグラフを重ねるようにします。

 Softmax関数 が特徴的な最大部分のみを際立たせる関数ということが解ります。 次に、入力値の相対的な値を変えないで入力値の倍率だけを10倍と1000倍にします。 範囲は特徴が分る0~πまでにします。

一方、サンプリングする間隔を変えた場合は次のようになります。  同じ範囲と倍率(100倍)ですが、サンプリング数を少なくすると、ソフトマックス関数のピーク値は高くなり、サンプル数を増やすとピークは小さくなります。 サンプル数を増やすと、サンプリング間隔が小さくなり、最大値近くの値も増えるためとも考えられます。

以上から、ソフトマックス関数は、大きな数値を特徴部分として際立たせる関数であると言えます。 また、入力データの数も結果に影響するのがその特徴です。  

 一方で、ソフトマックス関数が指数関数を使用しているので、入力として大きな数値を扱った場合は、通常の浮動指数関数を使ったプログラムでも、オーバーフローにより精度が落ちる可能性が有ります。 そこで、指数関数の数学的な特徴を利用して、全ての入力値から最大値を引いた値(すなわちすべての入力値を0以下の数値)を使って、数式上は計算結果に変化がなく、プログラム的には、極めて小さい値の入力値が、指数部での負でのオーバーフローをしても、≒0としてもほとんど誤差を生じない様にします(小さいものは捨てても、結果に大差がないということです)。 

 なお、簡略化することを考えると ソフトマックス関数は1文で記載出来るので、関数定義はしなくてもいいと思われます。  入力を配列 y として、結果s配列を次式

 s = np.exp(y-y.max())/np.sum(np.exp(y-y.max()))

で得られます。  

  以上で、ソフトマックス関数の実装が終了します。

2. プログラム

 プログラムの紹介。まずは、FigVI-2のソフトマックス関数の描画プログラムです。 Nの値と、Rの値を変えることで FigVI-3からFigVI-6を描いています。 倍率やサンプリング数で値が変わることはここまでの活性化関数では無かった特徴で、ソフトマックス関数の特徴といえます。

3. MNIST の文字認識

 テキストにしている「ゼロからつくる。。。」(*1)では、この後で文字認識の実例紹介をしています。 MNIST と呼ばれるの認識用の文字データ取り込みと、3層の学習済みネットワークで文字認識の実例紹介となっています。 ただ、学習済みネットワークの利用実例ですので、ただ実行しても、あまり学習にはならないような気がします。  今回、MNIST のデータを得るために、GitHubからO’Rillyのファイルをダウンロードしました。ファイルには、テキストに記載されたプログラムも載っているので参考になります。(いままで、見てはいませんでしたけど。) GitHub上のファイルの検索とダウンロード、付いているMNISTプログラムの実行を画像記録しましたので、参考として見て下さい。

4. あとがき

 今回は短めの記事になりました。 ここまでで、「文字認識が出来るようになった!」とは、いい難いです。 MNIST データ扱うようになって、いよいよ佳境、? なのか、まだまだ序の口にいるのか、初学者の立場でなんとも判断がつかないし、まだ先も良く見えません。 少しづづでもすすめたいと思っています。 

   因みに、 Python とは MontyPython からのネーミングだそうですね。 知らなかった。 トリビアです。


5.参考文献 / 参考リンク 

*1) このブログは参考テキストとして、ゼロから作るDeep Learning Pythonで学ぶディープラーニングの理論と実装 [ 斎藤 康毅 ] 【出版社: オライリージャパン 発売日: 2016/9/24 】 (ISBN-10:4873117585 ISBN-13:978-4873117584) を使っています。

2) 線形代数での行列については各種の専門書が有ります。 基本的で分かり易い本として 高校数学でわかる線形代数 (ブルーバックス)  [ 竹内 淳 ]  などがあります。

3) Pythonでの描画はmatplotlibを使用します。matplotlib サイト のチュートリアルは機能を調べるのには便利でした。 例えば、Tutorials » Annotations(注釈)辺りから調べます。https://matplotlib.org/tutorials/text/annotations.html#sphx-glr-tutorials-text-annotations-py

4) GitHubのDeep Learning from Scratch から 「ゼロから作るDeep Learning Pythonで学ぶディープラーニングの理論と実装」のプログラムをダウンロードできます。 直接のURLは https://github.com/oreilly-japan/deep-learning-from-scratch  です。

  __ __ __~~~( ゜〈‶      __ __ __ ~~( ゜〈‶  🐭   "〉゜ )~~python __ __ __

* ) 独学ではなかなか進まない方は、やはり有料になりますが、専門セミナーを受けられることをお勧めします。

初心者がPythonでプログラミング入門。初歩からデープラーニングを体験的に学習する記録

プログラム初心者でも解るように説明をしながら、これからの時代に必要なPython(パイソン)を使って、プログラミング入門から初めてAIデープラーニングを体験的に学習するサイトです。主の教科書に「ゼロから作るDeep Learning 」(オライリージャパン)を使って、多くの情報サイトを使います。自主学習の記録として留めておきたいこと、これから学習する人が知りたいだろうことをブログ式にまとめています

0コメント

  • 1000 / 1000