少し前、数字認識の実験をやっていました。数字認識を含む画像認識に興味があって勉強中です。画像認識とは………数字や文字をパソコンに見せて読ませたり、写真を見せて「写っているのは犬だ」などと判断させたりする技術です。画像認識はコンピュータには難しいのです。「これは犬」とか人間は簡単に判断しますが、人間はなぜそう判断したか、自分で理解していません。何かのロジックがあって「××だから犬なのだ」みたいに考えているわけではなく、何となく分かるだけなんですね。だから人間はコンピュータに判断の基準を教えることができず、「画像認識はコンピュータには難しい」となるのです。単純そうに見える数字の認識でも、人によって書き方はいろいろ(図を参照。MNISTというデータです)で難しい。
しかし最近ではニューラルネットワークという技術を用いてかなりうまく認識できるようになっています。雰囲気だけ説明しましょう。前に概要は書きましたが、それより少しだけ詳しく。
例えば数字をパソコン(ニューラルネットワーク)に見せます。ネットワークはいくつもの層からできており、入力層には「5」とかが映されていると思ってください。ネットワークは入力層の各点の明るさをもとに、次の層の各点の明るさを計算します。計算のルールはとりあえず決まっています。「入力層の点Aの明るさ×0.2+点Bの明るさ×1.3=次の層の点Cの明るさ」みたいな感じです。こうして、いくつかの層を経て最終的に0~9のどれなのかネットワークが結論を出します(最後、出力層では「5」に対応する点が明るく光る、とでも考えてください)。しかし、こんな方法では見せた画像と結論が食い違うことだってあるでしょう。ズレていたら計算のルールを少しだけ変更します(さっきの1.3倍を1.28倍にするとか)。さっきよりは正解との食い違いが減る方向に変えるのです。これを繰り返して精度よく読み取るネットワークが完成します。ネットワークはいくつもの層と、層の各点から次の層の各点へ情報を何倍にして伝えるのかというたくさんの倍率(重みと呼ばれる)から成ります。ネットワークはたくさんのデータから、各所の膨大な個数の倍率をこうして正しく調整します(学習する)。以降、数字を見て正しく判断できるようになるのです。
だいぶ省略しておおざっぱに書きました。実際にはこんなに単純なものではないですし、また倍率の調整には勾配降下法など数学の知識を用います。今は数字の読み取りより難しいことを試してみたいと考えています。ネットで見たら「アニメのキャラクタの認識」みたいなのもありました。楽しそう……。
ぼくは上の記事に書いた理論書を見ながら、言語はC#を使いフルスクラッチで一からプログラミングしました。今はTensorFlowなど有名なディープラーニングのライブラリがあり、これらを使えば数字認識などすぐです。それはそれでいいのですが、それではいったい何がどうなって数字認識できているのか、なかなか理解できないと思います。プロは仕方ないのでしょうが、理屈を勉強したいぼくのような人間はやはり完全にコントロールされた小規模の実験を繰り返すのが一番だと思います。