個人的な研究で使用したいと思い,半年余りDeepLearningと呼ばれる技術について学習していました.
巷で見かける,「手書き文字認識」「画像の分類」なんかや,DQNといった強化学習の仕組みには一通り触れてまわってみたつもりです.
周りの友人にそれとなく自分がDeepLearningに興味があるという素振りを見せていると,よく相談されたり,度々議論になる事があったのでそれらについて自分なりの考察をまとめていきたいと思います.
§1. 結局のところ,ディープ・ラーニングとは何なのか
いきなり主題ですが,恐らくこちらを先に話した方が都合がいいので.
Frequency Asked Question
Alpha Go が囲碁世界王者に勝利したり,Googleが自動運転技術に乗り出したり,….
昨今のAIブーム(ひいてはDeep Learningブーム)の中で,世間では,にわかには信じがたいような驚くべき成果が次々と報告されています.
こうした華々しい成果で注目を浴びる一方,Deep Learningという技術に対しての正しい理解が進んでいるとは個人的にはあまり思えないところで,
「これ,ディープ・ラーニングとかで出来ないかな?」
「ほら,流行りのディープ・ラーニングとか使えば出来そうでしょ」
といった,なんとなく「Deep Learning使っとけば問題解決!」と信じている人は少なくないんじゃないかなと感じるところです(特に非エンジニアの方で).
こうした,Deep Learning万能論あるいはAI神話とも呼べるような空想を拗らせると,
「そのうち人間はAIに支配されるんじゃないか」
と(半ば冗談半分に)聞かれることがありますが,Deep Learningという技術単体では,そこまで力を持つには至らないのではないか,と個人的には考えております.
ここでは,Deep Learningが得体の知れないトンデモ技術なんかではなく,れっきとした人間が使える”道具”なのだということを頭の片隅に入れておいていただければ幸いです.
ディープ・ラーニングがやっていること
難しい話は専門書などにお譲りして(パーセプトロン,ニューラルネットワークなどの説明はここではしません),ディープ・ラーニングについてほとんど知らない人にも分かるよう概念的な話をしていきたいと思います.
高校数学程度の数式は出てくるのでご留意ください.
ある値を入力すると,その値の2乗を返してくれる数式を考えてみましょう.
$$
\begin{equation}
f(x) = x^2
\end{equation}
$$
x に 1 を代入すると,f(x) は 1 を返します.x に 2 を代入した場合は,f(x) は 4 を返します.
$$
\begin{eqnarray}
f(1) = 1^2 = 1 \\
f(2) = 2^2 = 4
\end{eqnarray}
$$
こうした,ある値を入力すると,その入力値に応じた一つの値を返してくれるモノのことを関数と言いました.
さて,ここに中身の分からない関数(ブラックボックス関数)があったとします.
$$
\begin{equation}
g(x) = ?
\end{equation}
$$
しかし関数である以上,値を代入してみることで何かの値が返ってくることは分かっています.
試しにここでは x = 1,x = 2 を代入してみることにしました.
$$
\begin{eqnarray}
g(1) = 1 \\
g(2) = 4
\end{eqnarray}
$$
なんだか見覚えがありますね.
中身はまだ分からないですが,入力した値と返ってきた結果から私達は直感的に
$$
\begin{equation}
g(x) = x^2
\end{equation}
$$
ではないか?と予想を立てることが出来ます.ここで立てた予想式( \(g(x) = x^2\) )をモデルと呼ぶことにしましょう.
このモデルが正しいと仮定して,x に x = 3 を代入するとどうなるでしょうか.
\( g(3) = 3^2 = 9 \) となるので,9 という答えが返ってくるはずだと予想するでしょう.
しかし,実際に値を代入してみたら以下のような結果が返ってきました.
$$
\begin{equation}
g(3) = 7
\end{equation}
$$
これで,モデルは間違っていたと分かります.
モデルと実際の関数との間の差は, \( |9 – 7| = 2 \) でしたね.この,モデルと実際の関数の乖離の値を損失と呼ぶことにしましょう.
モデルと実際の関数がピタリと一致した場合は,いかなる場合も損失が 0 になるはずです.
我々のいまの使命は,あらゆる x を代入しても損失が0となるようなモデルを発見することにあります.
例えばこんなモデルはどうでしょうか.
$$
\begin{equation}
g(x) = 3(x – 1) + 1
\end{equation}
$$
これは, \(x = 3\) のとき \(g(3) = 7\) となり, \(x = 1,2,3\) の場合,\(g(x)\) をよく説明していると言えますね.
実は,ディープ・ラーニングも同じことをやっているだけなのです
ディープ・ラーニングは人間の脳の神経回路を模したネットワーク(ディープ・ニューラル・ネットワーク:以下 ” DNN “)を構築します.
とあるブラックボックス関数が存在した時,ネットワークは様々な値を代入して損失を計算し,最も損失が小さくなるよう自身のモデルを少しずつ変更しながら学習を進めていきます.
つまり,このネットワークは,人間のような試行錯誤を無数に繰り返すことで最終的に,
ありとあらゆるブラックボックス関数を近似できる,「ユニバーサル関数近似器」
として働いていることが分かります.
ディープ・ラーニングは,このDNNというネットワークの特性を利用して様々な問題を解決していきます.
これが本章の結論です.
§2. ディープ・ラーニングで何が出来るのか
前章で,ディープ・ラーニングがDNNという,ありとあらゆる関数を近似できる万能関数近似器を使って様々な問題を解決しているということを説明しました.
逆に,ディープ・ラーニングの限界はこのDNNという仕組みから説明することが出来ます.
繰り返しになりますが,DNNはあくまで「ユニバーサル関数近似器」として働いているだけです.
関数という性質上,「ある入力からある出力を導く」という仕事は得意です.
しかしそれ以外の,例えば「出力が良い感じになるような入力を見つける」というような問題は苦手です.
例を挙げて考えていきましょう.
◎ 画像の分類
「手書き文字認識」のような画像の分類問題はディープ・ラーニングが最も得意とする分野の一つです.
なぜかと言えば,画像の分類は典型的な「ある入力からある出力を導く」という動作を行っている問題だからです.
以下に実際の「手書き文字認識」がどのように行われいるかの例を挙げておきます.
画像はいくつかの”画素(px)”の集まりで出来ています.
縦横10ずつの画素で構成された画像は,合計で \(10 \times 10 = 100 [px]\) の画素を持ちます.
この画素を入力として受け取り, 0 ~ 9 のいずれかの数字を出力する関数 f(x) を考えてみましょう.
$$
f(x_1, x_2, x_3, … , x_{100}) = \left\{
\begin{array}{lll}
0\\
1\\
2\\
3\\
4\\
5\\
6\\
7\\
8\\
9
\end{array}
\right.
$$
いま,あなたは,0 ~ 9 までの手書きの数字が書かれた何枚もの画像を持っていたとします.
それらの画像は,縦横10ずつの画素で構成されているので合計で100個の画素を持ち, 関数 f(x) への入力として使用することができます.
ディープ・ラーニングは,”0″ と書かれた画像が入力されたときは \( f(x) = 0,”1″ \) と書かれた画像が入力されたときは \(f(x) = 1,… \),となるようなモデルを考えます.
このとき,学習の為に,
- モデルの予想と実際の数字があっていた場合は 0
- モデルの予想と実際の数字が違っていた場合は 1
を損失として与えることにします.
持っている全ての画像を正しく分類することができる f(x) のモデルを発見できた場合は,損失の合計が 0 になります.
こうして,あなたは 100個の画素を持った,0 ~ 9までが書かれた画像を仕分けることの出来る関数を手に入れることが出来ました.
もちろん,入力する画素の数を増やしたり,出力を 0 ~ 9 以外のものに拡張することもできます.
ディープ・ラーニングを使えば,あらゆる画像に対して自由なクラス分けを行うことが出来るのです.
〇 文章を書く
最近,巷ではAIに描かせた文章を見かける機会も多くなってきました.
一見すると,作文という問題は非常に高度で,ディープ・ラーニングにはあまり向いていなさそうな問題に見えますが,”文章”というものの見方を変えればディープ・ラーニングでも解くことが出来る問題になるのです.
ここでは,文章を“ただの単語の羅列”と捉えることにします.
そして,“ある単語が出てきたときに,次の単語を予測する関数” をディープ・ラーニングに学習させます.
$$
\begin{equation}
f(string) = nextstring
\end{equation}
$$
例えば,” This ” という単語が出てきたら次は “is” が来るだろう.という具合です.
この学習を行う場合は,よく小説等の文献が使われます.
特定の誰かが作った文章を集めて学習させれば,モデルはその特定の誰かの文章の”癖”まで学習してしまうのは面白い特性です.
さて,一通り学習が終わったと仮定しましょう.
今度は,学習したモデルを使って,学習とは逆の動作――つまり文章の作成を行いたいと思います.
いま,手元には学習が終わったあとのモデル,
$$
\begin{equation}
f(string)
\end{equation}
$$
があるはずです.
これは,入力としてある単語を渡すと,次に出てくる単語を予測して返してくれる関数でした.
文章を作成するには,ここでノイズと呼ばれる入力を渡してあげます.ノイズとは何か適当な入力のことです.
例えば,” Hello ” という単語をノイズとして渡してあげることにしました.
$$
\begin{equation}
f(“Hello”) = “World!”
\end{equation}
$$
“World!” という文章が返ってきたので, “Hello World!” という文が出来ました.さらに”World!”(もしくは”Hello World!”)を入力として \(f(string)\) に渡してあげることで次々と文章を作成してくれることでしょう.
実際の文章は,文脈と呼ばれるように,前後に何らかの繋がりを持っている場合がほとんどです.
上述のモデルでは単に”ある単語”から”次の単語”を予想しているだけで,文脈を判断しきれていません.
これを解決するために,データに時系列の概念を持たせたRNNという手法が考え出されました.興味がある人は調べてみてください.
△ ゲームを攻略させる
△となっていることに疑問の声が聞こえてきそうです.実際,Atariのゲーム攻略やAlpha Goなんかがディープ・ラーニングを使って結果を出していますからね….
これがよくあるDeep Learning万能論の元凶になっている気がします.
説明しましょう.
Alpha Go などは Deep Q-Network に代表されるような強化学習と呼ばれる,また少し異なるシステムを使って動いています.
さて,
「ある状態:state のとき,最善の行動:action を選びたい」
という問題を考えていたとします.
例えば,それこそ囲碁なんかは非常に適した問題です.
盤面に白と黒の碁石が置かれた状態で,あなたが次の手番で最善の一手を指したいという状況です.
ここで,ある状態:state で ある行動:action を行ったとき,どれくらい勝てそうかという見込みの数値である 報酬:R を返してくれるような関数,
$$
\begin{equation}
Q(state, action) = R
\end{equation}
$$
を考えましょう.
あなたは,とり得る全ての行動:action を Q関数 に代入していき,報酬:R が最も大きくなるようなactionを選択して実行すれば良いのです.
あまり深入りはせずに,Q-Learning の説明はこれくらいにしておいて,
上で出てきた Q関数 ですが,これも何らかの関数である以上,ディープ・ラーニングの力によって近似できるはずです.
従って,Q関数を ディープニューラルネットワーク(DNN) で置き換えたモデルが考案されました.
これが冒頭で触れた Deep Q-Network の概要になります.
結論を述べると,ゲームを攻略するといった問題を扱う場合は,
「ディープ・ラーニングを使った,強化学習という別の枠組み」
について学習する必要が出てきます.
強化学習の手法には,上で述べたDeep Q-Network の他にも様々あり,手法によって得意・不得意が変わってきます.
ひとまずのところ,「ゲームを攻略する」という問題は先に挙げた「画像の分類」「文章を書く」とは別の仕組みで動いているということをご理解して頂ければ幸いです.
× 関数の最大値(最小値)を見つける
ありがちな駄目なやつです.
例えば,以下のような関数があったとします.
$$
\begin{equation}
f(x) = -x^2
\end{equation}
$$
これは,x = 0 のとき,最大値:\(f(0) = 0\) を返すような関数です.
これをディープ・ラーニングを使って探したいと考えます.
ディープ・ラーニングは万能関数近似器でしたが,今回の場合は既に関数の実態が分かってしまっていて近似の必要がありません.
仕方がないので,何か適当な入力: t から \(f(t) = -t^2\) を計算し,f(t) が大きくなるように学習をさせてみることにしましょう.
さて,この学習のとき,損失として何を与えてあげれば良いでしょうか?
最大値が 0 なので,\(f(t) = 0\) のときの損失が 0 となるように, \(| 0 – f(t) |\) の値を損失と使ってみるのはどうでしょうか.
……これはおかしいですね.
最大値を知りたかったはずなのに,損失の中に最大値の項がでてきてしまいました.まさにパラドックスです.
以上の様に,既に分かっている関数に対してどうこうしようとすると,ディープ・ラーニングが機能不全を起こすということは多いです.
強化学習ならばどうか
では先程,「ゲームを攻略させる」の項で出てきた強化学習の仕組みを使った場合はどうでしょうか.
\(x = t\) のときの \(f(t)\) を報酬として考えて,報酬がなるべく大きくなるように学習させれば良いのでは!!??
というのは,一見するともっともらしいように感じられます.
しかし,強化学習もれっきとした科学であり,数式で示された前提のもとに成り立つものです.
上で,Q関数は以下のように示されると書きました.
$$
\begin{equation}
Q(state, action) = R
\end{equation}
$$
今回の問題は,何を状態として,何を行動として設定すれば良いでしょうか.
もしかしたら,上手く強化学習の枠組みに落とし込めるのかもしれません.
しかし,私はいくら考えてもこの数式に上の問題を落とし込む(他の手法より優れた)良い術を見つけることは出来ませんでした.
(余談)では関数の最大値を見つけたい場合はどうすれば良いか
高度な技術を使う必要はありません.
こうした問題には,例えば,勾配効果法などが有効でしょう.
もう少し賢いやり方を取りたいのであれば,ベイズ最適化なんかもおすすめです.
単純な問題では意外とアナクロな手法が冴える場合も多いです.視野を広く持ちましょう.
§3. どういうときにディープ・ラーニングが輝くのか
まとめると以下のような状況でディープ・ラーニングが適用できることが分かります.
- ブラックボックスな関数があり,それが表現出来た場合に何かが解決できる場合
ここで,ディープ・ラーニングはブラックボックス関数を近似する役割を担います.
上で挙げた例のように,この関数というのは厳密な数式の形をとっている必要はまったくなく,まさにアイデア次第で何でも表現できるといったところです.
あなたが何らかの入力となるものを持っていて,そこから何らかの出力を得たいと考えた場合,もしかしたらディープラーニングが使えるかもしれません.
しかし,注意すべき点もあります.ディープ・ラーニングはあくまで近似を行うだけで,そのものになるわけではありません.当然,モデルは誤差を含んだものになります.
あなたのやりたいことが少しの誤差を許容するものならばディープ・ラーニングは良き道具と成り得ますが,誤差が一切許されない場合にディープ・ラーニングを使うのは適当ではないかもしれません.
また,学習の為には一般的に大量のデータを必要とします.
条件が整っていれば,ディープ・ラーニングは非常に強力なツールとしてあなたを助けてくれるはずです.
§4. 「AIが人間を支配する」かどうかへの答え
本記事をご覧いただいた方には,既にディープ・ラーニングが摩訶不思議なマジックアイテムではなく,「万能関数近似器」という人類が持っている便利な道具の中の一つに過ぎないというは理解してもらえたかと思います.
ディープ・ラーニングの仕組みの中に”知性”はなく,あくまでデータを機械的に処理し,学習して,モデルを構築するだけです.
つまり,「ディープ・ラーニング自身が何かを考え行動する」ということは今のところ起こり得ず,所謂狭義の人工知能(自ら思考し行動するAI,イメージとしては「鉄腕ア〇ム」や「ドラ〇もん」)には当たらないことが分かります.
「支配する」というのが曖昧な表現なのでなんとも言えないのですが,ターミ〇ーターのように人智を超えた存在が人間に対して干渉してくることをそう呼ぶなら,「そんなことは起こらない」というのが私なりの答えになります.
これでお仕舞いにしても良いのですが,なんとなく寂しいので,「AIが人間を支配する」事実についてもう少し考察という名の妄想を垂れ流してみます.
AIが知性を得る為には
ディープ・ラーニングは一つのある重要な示唆を与えてくれました.それは,
今まで”知性”が必要だと思われていたタスクが,ただの演算で近似できる
という可能性です.
例えば,私達が文章を作成する際は,「あんな書き出しはどうだろう」「こんな内容にしてみると面白いだろうか」などと思索を巡らせて書くことと思います.
また,写真に写ったものを判断する際は「これは人間だ」「これは車だ」といった認識が必要ですが,このような簡単な処理でさえ,「写っているものが”人間”だと学習した知識あるいは過去の経験」が必要となります.
こうした高度な人間の知性による働きを機械に模倣させることは難しいと考えられてきました.
ディープ・ラーニングの仕組みはまだ限定的ではありますが,非常に強力です.
- 体調
- 天気
- その日の気温
- 職場での人間関係
- 平日か休日
などの情報を入力として受け取り,
今日は元気があるぞ!
なんだか怠いな….
といったような出力を生み出す関数が出来た場合,それは立派な知性と言えるのではないでしょうか?
一方で人間は,非常に多くのことから学習し,また五感から常に膨大な量の情報を入力として受け取り脳で処理しています.
そして,今までになかったあらたな仕組みを創造することが可能です.
数字が 0 ~ 9 で足りなかった場合,人間はいとも簡単にその数を広げることが出来ます(0 ~ Fで表された16進数のように).
すなわち,人間は新たにネットワークそのものを生み出す創造性を備えているのです.
以上を踏まえ,今の人工知能が,人間に匹敵する”知性”を獲得するまでに必要な事を書いてみます.
- 人間の五感を模したような,外界の情報を受け取ることができる各種センサーの開発
- センサーから受け取った膨大な入力情報をリアルタイムに処理できるような超高性能な処理装置の開発
- “データから学習”を超えた,”新たな問題提起のための新しいネットワークを創造”するアルゴリズムの開発
一部の特化した状況において,機械は人間を超える性能をたたき出すことはありましたが,本質的に,人間が無意識に常時行っているような莫大な量の演算を機械が行えるほどにはまだ科学は進展していません.
それから,「問題を提起する」といった創造的な取り組みはやはりまだ人間だけが行うことが出来る領域だと言えそうです.
AIが人間を支配する為には,機械・電子・情報それぞれの分野でまだ幾つもの壁が残されていると感じ,同時に,近い将来それらの壁もブレイクスルーによって突破されていくのではないかと個人的には思っているところですが,それにはまだまだ技術の飛躍が必要で,ひとまずのところ「AIはまだ人間には及ばない」と考えて良いのではないかというのが私の意見になります.
§5. 後書き
間違っている箇所はご指摘いただければ幸いです.
日本ではまだ海外ほどこうしたAI技術についての認知・研究が盛んになっていないということでしたので,ありがちな誤解を解きつつ,差しあたっての問題を解決する際にディープ・ラーニングが適用可能かどうかを判断する基準を提供できればいいなと思い投稿いたしました.
コメント