あなたが書いた数字を、人工知能は正しく認識できるか? – 第4回(全4回)

前回の結果から浮かび上がってきた、人工知能の特性に関する私見です。

人工知能の特性1: ヒトが見逃がす特徴を捉えられる

「大きさを揃える」という前処理が最も効果的でした。私は、「向きを揃える」や「細線化」のほうが、踏み込んだ処理をしている分いい結果になると予想していたのですが、意外でした。

前処理を設計した私の目論見が間違っていたと考えられます。例えば、字の傾きは、0-9の数字を見分けるのに有用な情報だったのかもしれません。「向きを揃える」ことでその手がかりを捨ててしまっていたのであれば、認識精度が下がるのも当然と言えます。

「もっと人工知能を信じて、持っている情報を全て渡しなさい!」と言われた気分です。できる部下と、その部下を過小評価しているダメ上司の関係ですね。

人工知能の特性2:新人にもベテランにもなる

前回の検証で、データセットの量が認識精度に大きな影響を与えていることが分かりました。これは、本質的に新人とベテランの違いです。

例えば、60,000組(ベテラン)と100組(新人)の人工知能について考えます。あるデモで両者が同じ認識結果を出した場合、両者の違いは分かりません。しかし、何度もデモを繰り返すと、60,000組は常に安定した認識率を維持できるのに対して、100組の方は認識率に浮き沈みが出てきます。いわゆる経験の差です。

人工知能の分野では、GoogleやFacebookなどの「データホルダー」企業が、人工知能の活用に有利と言われています。大量データを使って、人工知能をベテランに育てられるからです。

人工知能の特性3:機転が利かない

十分な量のデータセットを与えた人工知能は、頼れるベテランとして活躍してくれます。しかし、人間と違ってイレギュラーな状況で「機転」を利かせてはくれません。人工知能にデータセットのどれとも似ていない入力が与えられると、急に新人並みに頼りなくなってしまいます。

前回の、前処理を比較した結果は「前処理なし:43%」に対して「大きさを揃える:95%」と、認識率に倍以上の開きがありました。これは、mnistデータセットと似ていないデモ入力が多い程、認識率が下がることを示しています。

mnistデータセットは、どの画像もキャンバスの中央に文字が書かれています。それに対して、デモ画面はキャンバスの中央に数字を書くことを強制していません。中央から外れた場所に書かれた数字は、mnistデータセットのどれとも似ていないため、人工知能からするとイレギュラーで、認識できません。「大きさを揃える」という前処理は、このイレギュラーを予防する効果があります。

 

 人工知能の開発手法は、従来と真逆

本記事で、「~と思います」「~と考えられます」「~かもしれません」など、あいまいな言い方を多用していることに気づかれたでしょうか?

従来のソフトウェア開発では、エンジニアがプログラムの仕様を説明するときにあいまいな言い方をする事はありません。入力をどう変換して何を出力するのか、その全てがエンジニアの意図通りにコントロールできているからです。

一方、人工知能の開発において、変換処理はブラックボックスです。その変換処理の妥当性は、実際に動かして出力(認識結果)を見るまでわかりません。

従来のソフトウェア開発で、新人プログラマーが「実装しましたが、どう動くか分かりません」と言ったら、きっと先輩に叱られます。(誰も叱ってくれないなら職場を変える事を勧めます(笑))しかし、人工知能の開発においては、”本当に” どう動くかわからないのです。

Preferred Networksの丸山さんは、これを、「演繹的システム開発」と「帰納的システム開発」の違いと説明しています。

プログラムをY=f(X)と表現します。Xが入力、fが変換処理、Yが出力です。従来のソフトウェア開発は演繹的システム開発です。fをプログラマーがせっせと実装し、Xとfを与えるとYが得られます。

一方、人工知能の開発は帰納的システム開発です。本連載で”データセット”と呼んでいたXとYを与えると、fが得られます。従来は手作業で作成していたfが、人手を介さずに自動生成されます。

本連載で述べている通り、自動生成されたfの本質は「統計」です。

 

まとめ

「人工知能」は大袈裟に捉えられがちですが、実際にやっていることは統計データの作成と活用です。統計の価値は収集データの量と精度で決まります。それと同様に、人工知能を実用レベルに押し上げる為には、データセットの量と質がとても大切です。

そして、「動かしてみないとわからない」危うさを持っているものの、コンピューターの活躍の場を大いに広げてくれる、社会に役立つ技術です。

今の人工知能の盛り上がりは、一過性のブームで終わることなく、将来のプログラマーにとって当たり前の必修スキルになっていくと思います。

本連載を通じて、人工知能のカラクリについて理解を深めていただければ幸いです。

あなたが書いた数字を、人工知能は正しく認識できるか? – 第3回(全4回)

 

前回までは人工知能の一般論が中心でした。今回は、人工知能の認識精度を上げる為に、デモの開発中に試したことを説明します。

デモの内部構造について

デモの内部構造は、以下のようになっています。

デモの内部構造

 

左下のmnistデータセットは、様々な人が書いた手書き数字(28×28ピクセルの白黒画像)を約6万枚集めた、一般公開されているデータ集です。それぞれの画像に、正解(0〜9のいずれか)がタグ付けされているところがポイントです。

それ以外の要素については、前回説明ずみなので説明を省きます。

 

検証1:前処理を工夫して、認識精度を上げる

いろいろな前処理を試して、精度向上の効果を検証しました。以下は、その結果と前処理の概要です。

検証結果

mnist_3_4_filter前処理なし

前処理なし

mnistデータセットをそのまま使用します。他の方法と比較するためのベースラインです。

大きさを揃える

大きさ・位置を揃える

数字を認識するうえで、文字の大きさは関係ありません。ということは、大きさは認識に不要な情報と考えら
れるので、全ての手書き数字を同じ大きさに揃えて、統計に反映されないようにします。

向きを揃える

向きを揃える

数字を認識するうえで、文字の傾き具合は関係ありません。字の向きを揃えて、統計に反映されないようにします。

細線化

細線化

数字を認識するうえで、線の幅は関係ありません。幅を一定(1ピクセル幅)に揃えて、統計に反映されないようにします。

 

検証2:最適なデータ量を求める

mnistデータセットには6万の手書き数字がありますが、認識精度を上げるために、そんなに沢山のデータが必要なのでしょうか?この素朴な疑問を検証しました。

検証結果

mnist_3_4_volume

100組

mnistデータセットから、0-9の数字それぞれにつき10組を無作為抽出しました。

100組×10

[100組]のデータセットを元に、それぞれの画像をランダムに歪めながら、10倍に水増ししました。

水増しイメージ

60,000組

mnistデータセットをそのまま使用します。

60,000組×10

[60,000組]のデータセットを元に、それぞれの画像をランダムに歪めながら、10倍に水増ししました。

 

検証3:デモと同じ環境を使ってデータセットを用意する

mnistデータセットの手書き数字は、ペン(もしくは鉛筆)で書かれたように見えます。一方、デモ画面ではマウス(スマホであれば指)を使って書きます。この違いが認識精度に影響するか検証しました。

検証結果

mnist_3_4_content

ペン書き

mnistデータセットから、0-9の数字それぞれにつき10組を無作為抽出しました。

マウス書き

デモ画面を使ってひたすらカキカキした画像を、0-9の数字それぞれにつき10枚集めました。

ペン書き×10

[ペン書き]のデータセットを元に、それぞれの画像をランダムに歪めながら、10倍に水増ししました。

マウス書き×10

[マウス書き]のデータセットを元に、それぞれの画像をランダムに歪めながら、10倍に水増ししました。

 

検証して分かったこと

検証1〜3のいずれについても、認識精度に影響を与える結果となりました。特に、データセット量の違いによるインパクトがとても大きいです。

個人的には、「向きを揃える」や「細線化」の前処理で精度が上がらなかったのが予想外でした。

次回(最終回)は、この結果を分析しつつ、人工知能の開発の特殊性にも触れて、本連載を締めたいと思います。