ココロミにきみ

本と体とプログラミング

手書き数字認識の機械学習を通じて学んだこと

仕事で自動採点用に、手書き数字の機械学習(AI)の構築にトライしている。その過程で人間の”認識プロセス”に対する理解が深まった。

 

一桁の数をAIに認識させようと、実際に人間が書いた手書きの数字を読み込ませると、90%の精度でしか認識することが出来なかった。実験レベルなら99%認識できるので問題はAIの構造ではなく。

実は AI が仕事をするのに一番大変で大切なのは、 AI が理解しやすい形にデータを(人間が)加工してあげることだった。教本にはそう書いてあって読んだときは本当かいな?AIの仕組みを作るほうが大変ちゃうの?と思ってたけど、いやいやデータの加工に95%くらい時間を取られる。

 

作るAIのレベルにもよるのだけど、AIは基本的に訓練のときに使われた「データ群の癖」に囚われてしまう。

簡単な例でいうと、解答欄に大きく描かれた[7]という形を、数字の ” 7 ” として学習したAIは、同じ解答欄に小さく書かれた判別したい[7]を全く別物として捉えてしまう。

そのズレ感をイメージ化する。

  数字のパートを"1"、背景を"0"で表現すると以下のような形で画像になっている。

f:id:molingit:20170814075033j:plain

AIが認識してる形にそれぞれ直すと、

f:id:molingit:20170814075041j:plain

となり、上の画像の形なら似てるじゃん!と思うけど、一行の形だとたしかに同じものとは言うのは無理があるかなーと。まぁ本来ならそれでも似てるパターンを探し出して、認識するのがAIの役目だとは思うんだけど。

 

文句を言ってもしょうがないのでBの判別したい[7]を加工(余白削除)する

f:id:molingit:20170814075038j:plain

 

こうすると、判別したいB’の余白削除後の[7]の数字並びの比率が、Aの学習した「7」と似てくるせいか(上と下で約2:1のサイズ比)、

 f:id:molingit:20170814075046j:plain

AIはやっと加工後の[7]を" 7"として認識するようになる(本当になにで認識してるのかは分からない)。

このように、「余白の割合を同一の比率にしたり、数字の斜め書きを縦に戻したり、筆圧の低い人の字を適度な濃さにしたり、、、という想定されるあらゆるデータのズレを補正する作業」を(現段階では)人間がしている。そうやってAIが食べやすい形にデータを直して与えることで初めて、AIは仕事をすることができる。

 

・・・このことから思いつくのは、人間が紙に書かれた[7]を認識しているときも、たんに概念としての"7"を認識しているだけじゃなくて、

紙に書かれた[7]の、「サイズの調整、色の濃さの調整、回転の調整、移動の調整、枠線と数字の区別、、、などなどが全て自動で脳のなかで加工」されて、最後に『算数や数学の概念認識のプロセス』が動いて、ついに数字の ” 7 ” として認識されているんだと。

逆にいうと、なんらかの事情で脳のなかの画像加工機能のほんの一部が動かなくなるだけで、数字の概念は使えるのに紙に書かれた[7]の認識すら、出来なくなるんだろうなぁと。これはディスレクシアの原因になるのかもしれない。

というわけで、AIを構築する作業というのは『概念認識』のような高度な部分はわずかで、その前のデータを食べやすい形にする単調作業がほとんどの仕事だった。

で、リアルな問題としてその単調作業を繰り返して、認識率を最低99%にあげないと仕事にならん・・・。

 

(追記)

8/16 …94%あと二歩。

8/19 …99%!完成!

↓ こんな感じで数字認識結果が出る。

f:id:molingit:20170819212341p:plain

結局、AIを訓練するためのデータに色んな種類のノイズを加える方法を新たに追加したことが、残り9%を上げるポイントだった。

つまり数字が斜めになってたり、枠からはみ出てたり、読みにくかったりする数字でAIを訓練させたら、実践対応能力が上がったと。これって人間でも使える訓練方法だったりしないのかな。。。