いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

ディープラーニングで数字認識

「2」という文字を(デジタルカメラで)写真に撮ってパソコンに見せ、パソコンに「この写真に写っているのは『2』という数字である」と判断させることを考えます。流行の「文字認識」(ここでは数字認識)というやつです。

写真を見てそこに「2」と書いてあると判断することがパソコンにとってどういう風に難しいのか、説明してみます。「2」という文字をデジタルカメラで写真に撮ると例えば下のようなデータになります。

f:id:Inuosann:20190707210625j:plain

各点の明るさに応じて数値が決まります。文字は黒で書かれ(暗い)、背景は明るいですから、「2」の形に小さな値が並びます。書き方、印刷や照明の具合などによって、「2」の部分もそれ以外の部分も明るさは大抵一定ではありません。パソコンはこれを見て「2」だと判断しなければならないのです。しかも特に手書きでは下(MNIST(エムニスト)という実験用データ)のように人によって書き方は様々です。

f:id:Inuosann:20190707210705j:plain

それでも不思議なことにぼくたちは「2」と読み取れます。これをパソコンにやらせようというのが数字認識です。さらに文字認識(ひらがな、漢字、アルファベット、……を読ませる)、顔認識(顔の写真を見せて誰か判断させる)など、あとにはもっと大変な技術が控えていますが、まずは単純な数字認識です。昔は「2はここがこうつながっていて、……」などとルールをパソコンに教えて読ませていたようですが、これはあまりうまくいきません。今ではディープラーニングという技術を使います。

雰囲気だけ説明してみましょう。まずさっきのMNISTのような例で学習させます「どれも2と読むんだよ」と教えるわけです。実際には数千個とか数万個くらいの学習用データを用います。読み取り方に変化を与えるため、数千個とか数万個、あるいは数十万個の読み方の調整用の変数を用意しておき、うまく読み取れるように変数の値を少しずつ変えながら、言わばチューニングします。その後、実践です。手書き文字(MNISTのテスト用データ)を見せ、読ませるのです。ぼくが実験してみた結果、この方法で99%以上の認識率が出ました(相当曖昧な数字以外はちゃんと読めるようになる。そういう曖昧な数字は人間が見ても「これ、人間にも読めないよ……」という感じです)。

このディープラーニング、欠点もあるのですが他にこれを超える方法は多分今のところありません。欠点を克服する方法も様々研究されており、顔認識もうまくいっているようです。ちなみに……うまく読み取れるシステムを作るのにさっきの「チューニング」が必要ですが、その際には数学の勾配降下法といった技術が必要です。「なぜ文字認識、顔認識に数学が必要?」と思うかも知れませんが、仕方ありません。……と言うよりそもそもこのディープラーニング自体、数学の塊です。

ディープラーニングがわかる数学入門』(涌井良幸,涌井貞美2017技術評論社)、『画像認識』(原田達也2017講談社機械学習プロフェッショナルシリーズ)が大変参考になりました。ぼくは主にこの2冊を参考に、言語はC#でプログラミングして実験してみました。

ディープラーニングがわかる数学入門

ディープラーニングがわかる数学入門

 
画像認識 (機械学習プロフェッショナルシリーズ)

画像認識 (機械学習プロフェッショナルシリーズ)

 

今時はいろいろなライブラリなどもあり、簡単に文字認識のアプリケーションを開発できるようですが、この2冊はフルスクラッチ、要するに全部自分でプログラミングするというのが前提で書かれています。特に2冊目は結構難しく、まだ理解できていないところも多いのですが、それでもとりあえず一から全部自分でソフトを書いてみて「ディープラーニングとはこういうもの」と分かった気します。プロの友人は「とにかく結果を出さなきゃならないから、そんな暇はない」と言います。ま、そうなんでしょう。でもどちらが正しい、ってことでもないと思います。ぼくは「ディープラーニングってどういうものなのか」知りたいと思っているので、そういうことなら自分でプログラミングするに限るでしょう。