2020年2月11日火曜日

記号処理とニューラルネット 後半 〈Python AI ニューラルネット その7〉

ニューラルネットに記号処理・記号学習を組み合わせたら、というお話の後半です(前半はこちら)。欲張って中間層を50セルにし、第二位と誤答データだけで学習させたネットの結果(記事はこちら)を記号学習させました。結果は98.5%となりました。

中間層50セルで誤答データのみで再学習、epoch 1-17 が1つ目のニューラルネット、それ以降が2つ目のもの


記号学習は記号列生成と重み付け(学習)の2つのステップがあるのですが、今回は単純なので生成は端折りました。

記号列です
正解|第一位|第二位|誤答学習による第一位
ニューラルネットの表現では入力層が 10 + 10 + 10 、 出力層 が 10 、 この組み合わせが 10,000  ( 10 * 10 * 10 * 10 ) あるイメージとなります。

学習アルゴリズム
各記号列の重み付けは 10 * 10 * 10 * 10 = 10,000 のカウンター配列で表現します。学習データの結果に該当する配列要素をカウントアップしていきます。

評価アルゴリズム
テストデータに対し評価を行います。第一位誤答時に、第一位、第二位、誤答学習ネットによる第一位の記号列に相当するカウンター配列から最もカウントの多かった正解* を選びます。numpy.argmaxで一発ですね!

以上です。何と単純なアルゴリズムでしょう。くどいことを言えばAICを参照して冗長なパラメータをまとめてもいいのですが、アルゴリズムの単純さをそのままにしました。

これでもダメなケースはアフィン変換で伸ばしたり、縮めたり、回したり、動かしたりなのですが、計算コストがかかります。なので、簡単なアルゴリズムである記号処理を先に適用して良いかと思います。また記号処理はバイアスをかけられる利点があります。* 最もカウントの多いものを選ぶ代わりに、答えの候補のカウント値や順位を参照します。

MNISTのデータだとコンテキストはないのでバイアスの実験にはなりません。面白そうなサンプルがあったらまたブログにしますね。
永島志津夫