ラベル データモデリング の投稿を表示しています。 すべての投稿を表示
ラベル データモデリング の投稿を表示しています。 すべての投稿を表示

2020年2月7日金曜日

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

ニューラルネットに記号処理・記号学習を組み合わせたら、というお話です。前回、“多層化が認識の本筋ではない” ことに触れました システムの費用対効果 〈Python AI ニューラルネット - MNIST その5 その続きになります。


まず、テスト結果を見てみましょう。

中間層50セルのテストデータ評価

出力 0 1 2 3 4 5 6 7 8 9 合計
誤答 54 25 59 70 62 39 57 46 61 64 537
正答 962 1,114 967 953 932 808 919 961 912 935 9,463
合計  1,016 1,139 1,026 1,023 994 847 976 1,007 973 999 10,000

出力の3や9の誤答率が高いですね。どのように間違えているか見てみましょう。

同、出力別正解対応表

 出力
正解
0 1 2 3 4 5 6 7 8 9 合計 
0

2 2
4 7 2 1
18
1

2 2
1 5 2 9
21
2 11 1
7 10
9 9 16 2 65
3 1 1 16

14 1 11 10 3 57
4 1 2 4


10 2 3 28 50
5 11 1 3 25 3
14 5 15 7 84
6 11 3 3
10 6
1 5
39
7 3 7 25 7 5



20 67
8 5 3 3 16 6 8 11 6
4 62
9 11 7 1 11 28 6
8 2
74
合計  54 25 59 70 62 39 57 46 61 64 537

これを見ると、誤答パターンがあるのに気付きますね。

出力 = 3では誤答70例中、正解 =  5, 8 で41例と過半数を占めます。“3のような5”、“3のような8” の悪筆が比較的多かったとも言えます。出力 = 3で間違えたら 5 と再回答すれば 25 / 70 ≒ 36% の確率で正解します。

出力層第二位の結果に注目して詳細を見てみましょう。出力層第二位の結果を含めると正解率は向上します。
システムの費用対効果 〈Python AI ニューラルネット - MNIST の続き〉

二位出力別正解対応表(一位出力=3で誤答)
  二位出力
正解
2 4 5 6 7 8 9 合計
0

1

1
2
1

1
1

2
2
1 2
1 3
7
5

25



25
7



3 2 2 7
8 1
1 1
13
16
9

1

3 7 11
合計 1 1 31 1 5 22 9 70

二位出力=正解のケースは誤答総数70例中、48例( 25 + 3 + 13 + 7) です。なので二位出力を再回答すれば 48 / 70 ≒ 69% の確率で正解します。では全てのケースで二位出力を再回答すればよいのかというとそうでもありません。

二位出力別正解対応表(一位出力=9で誤答)
  二位出力
正解
2 4 5 6 7 8 合計
2




2 2
3

1
1 1 3
4
1 2 1 10 14 28
5
1 2
1 3 7
7 1 5 6
3 5 20
8
1

1 2 4
合計 1 8 11 1 16 27 64

最も多い正解は 4 で 28例です。4と再回答すると 28 / 64 ≒ 44% の確率で正解します。ところが二位出力=正解のケースは 8例しかありません。 正解確率は 8 / 64 ≒ 13% とかえって悪くなります。 “9のような4” 、 “9のような7” は単純なニューラルネットには難し過ぎるようです。
そこで二位出力が2,4,5の時は7と答え、6,7,8の時は4と答えると 37例が正解になります。正解確率は 37 / 64 ≒ 58% です。

このような再回答ロジックにより正解率97.4%(誤り率2.6%)に改善できます(元の正解率94.6%(誤り率5.4%))。なお、 第二位再回答では正解率96.9%(誤り率3.1%)です。

実はここまでが前置きになります。今回のお題は記号処理とニューラルネットです。このような再回答ロジックを “人間が” プログラムで組むことは簡単ですが、果たしてニューラルネットで表現したり、学習することはできるのでしょうか?

長くなったので2回に分けます。次回に続く。
永島志津夫


2020年1月2日木曜日

システムの費用対効果 〈 データモデリング 〉

データの横持ち、縦持ちという言葉、ピンと来るでしょうか?


例えば在庫テーブルで、商品単位の数量、金額を以下のように1レコードで表現していれば横持ちです。

|決算期|商品コード|期首数量|期首金額|受入数量|受入金額|払出数量|払出金額|期末数量|期末金額|

一方、受払区分に期首、受入、払出、期末を入れて、複数レコード(4レコード)で表現することもできます。正規化の原則に則っていますが、抽象度が上がるし大袈裟かもしれません。ダンプした時、データが見づらくなるので、ユーザーのウケがよくなかったりします。

|決算期|商品コード|受払区分|数量|金額|

どちらでも、同じことを表しているのですが、処理性能や将来の要件拡張に大きな違いがでます。拡張性は、縦持ちが有利なのはわかりやすいですね。区分を追加するだけですから。処理性能は、いっぺんにデータを取得できる横持ちのほうが良いかというと、そうとも限りません。通常データベースはアップデートのコストがインサートのコストよりもかかるので縦持ちのほうが性能が良かったりします(インデックスが張られている前提です)。
縦持ち、悪くありません。ところが、だいたいみなさん横持ちで設計するのですよ・・・。

付け足すと、異機種間結合で苦労するのも、この横持ち、縦持ちです。実際は上の例の受払区分にあたるところに、判断ロジックが組み込まれたりします。情報系ならまだしも業務系で横持ちと縦持ちが入り混じると収拾困難です。はっきり言えば ”動かないシステム” になります。これは避けなければいけないことです。
永島志津夫

全社のシステムを少ない人数で見ていれば時に見落としもあるかもしれません。
オフィスエヌ ショートレビュー5万円から
連絡先 office.nagasima#gmail.com (#を@に変えてメールをお願い致します)