川獺の外部記憶

なんでも残しておく闇鍋みたいな備忘録

深層学習について - 単純パーセプトロン1

今回は単純パーセプトロンの仕組みについて。学習手法までは到達しません。どうやって予測できるかまで。

お約束ですがちょくちょく自信がないです。ツッコミお待ちしております。

今回考える例

最初は簡単な例から。

「りんご」と「なし」を見分けることを考えます*1 。簡単のために、「形」と「色」だけしか見ないことにします。

今回考えるパーセプトロンについて

今回は下図のようなパーセプトロンを考えます。

f:id:marineotter:20200126222424p:plain:w700

  • 一番左の特徴ベクトルは4次元の0か1かの要素でできたベクトルです。 例えば丸くて赤色の物体の場合は{1, 0, 1, 0}です。丸くて黄緑色の物体の場合、{1, 0, 0, 1}になります。

  • 一番右の出力ベクトルは2次元の0か1かの要素でできたベクトルです。 「りんご」だと思った場合は{1, 0}に、「なし」だと思った場合は{0, 1}になってほしいです。

  • 間の隠れ層と書いてるのは(概念的に)計算途中の結果を置いておく2次元*2のベクトルみたいなものです。今回はそのまま「出力ベクトル」になります。(×1って書いてるのがそこです。*3計算グラフ的には+の意味だと思ってください。

さて、一番重要なところです。図中の点線枠で囲っている部分が学習で獲得したい部分であり、この部分の構造が「人工ニューラルネットワーク」と呼ばれるものです。

この点線部は最初は何もありません。*4ここをどうつなぐかで学習器がどう振る舞うかが変わってきます。

点線部のつなぎ方 - 学習してほしい理想形

形状に関する情報のつなぎ方

まず、特徴ベクトルの[0][1](形状に関わるもの)がどう処理されるべきかを考えます。

f:id:marineotter:20200126223137p:plain:w700

今回、「りんご」と「なし」を区別するのに、丸いか丸くないかは全く意味がありません。なので、[0][1]はどちらも×0して伝搬させます。これで特徴ベクトルの最初2つの要素に何が入っていても以降の計算には影響しなくなります。

色に関する情報のつなぎ方

次に、特徴ベクトルの[2][3](色に関わるもの)について考えます。

f:id:marineotter:20200126223637p:plain:w700

まず上の方から。色が赤かったら今回は「りんご」確定です。なので、[2]は「りんご」の方に対してのみx1で伝搬させます。 下の方についても同様に、色が黄緑色だったら「なし」確定なので、[3]は「なし」の方に対してのみx1で伝搬させます。

理想的なつながり方

以上のつなぎ方で理想的に作られたパーセプトロンは下図のようになります。

f:id:marineotter:20200126224413p:plain:w700

このパーセプトロンは理想的に「りんご」と「なし」を見分けることができます。*5

例えば、形が丸くて赤色の物体{1, 0, 1, 0}が入力された時、出力は{1, 0}となりちゃんとりんごだと思ってくれます。

次書くこと

ここまでで力尽きました。

今回はパーセプトロンのつなぎ方を「こうあるべき」で理想的に決めてしまいました。

一方、本当の学習器では大量のデータを見て学習器が勝手に頑張ってつないでくれます。

次回はこの「勝手に頑張って」の部分がどう勝手に頑張られるのかを書こうと思います。

どうでもいいこと

自分なんも理解してねえな、と書いてて毎度思います。少し辛いです。

薄く広くでつまみ食いしてきたツケですかね…

*1:今回判別する「りんご」は理想的なりんごを、「なし」は理想的な和梨とします。熟してないやつとか形がちょっと歪んだやつとかは考えません。

*2:今回は2次元にしていますが普通はもっと多い。

*3:Softmaxかけて確率化するのが普通だろ、とか言うのはありますが簡単のために。あまり突っ込まないでください。

*4:乱数初期化されてたり色々ですが割愛。

*5:「りんご」と「なし」以外のものを入力する場合は考慮しません