ディープラーニング超概要　なぜ黒魔術と言われるのか？

AIの話題になると必ず出てくるディープラーニング、言葉は知っていても具体的にどういう仕組みなのか、なかなかイメージがつかみにくいのではないでしょうか。

そこで今日は、前提知識が無くてもざっくり把握できる形でディープラーニングについて記してみたいと思います。概要を説明した後「ディープラーニングが黒魔術と呼ばれる理由」について筆者の見解を述べてみます。

今回がQiitaデビューとなります、どうぞよろしくお願いいたします。

#**ディープラーニングって何？**

ディープラーニングは機械学習と呼ばれる手法のひとつです。

近年画像認識など様々な分野で、従来の手法では実現できなかった高い精度を実現して注目をあびています。囲碁名人に勝利したコンピューターにもこの手法が使われていたり、機械翻訳でも従来の手法では実現できなかった高い精度を達成したりと、今の人工知能ブームの中心にいます。

今日はこのディープラーニングの仕組みを、代表的な活用分野である画像認識を例に説明します。

##**ちょっと待って！画像認識って何？**

コンピューターを使って画像を仕分けする技術を画像認識といいます。

多くの写真の中から特定の人が写っている写真を見つける、手書きの文字を判別する、など色々な活用分野があります。

今日は画像認識の簡単な例として、オセロ盤に黒石で書いた数字をコンピューターに認識させるシナリオを使います。

![スライド1.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/723d6810-da69-09d1-833a-04d401432ebd.gif)

上の図では３人の人に数字の1,2,3を書いてもらってます、同じ数字でも三者三様の書き方になってますね。

私たちはすぐに何が描いてあるか判別できますが、コンピューターに判別させるにはどうしたらいいでしょう？

いろんなやり方がありますが、今画像認識の分野でもっとも高い精度を実現しているのがこれからご紹介するディープラーニングです。

##**ディープラーニングへの入力情報**

オセロ盤をコンピューターの前に持って行って「判別せよ！」と言っても当然ですが何も起こりません。

まずは、オセロ盤に書いた数字情報をディープラーニングがで処理できる形式（言い換えるとコンピューターに入力できる形式) にする必要があります。

###**画像情報の入力**

画像情報をコンピューターに処理できる数値情報に変換します。

![スライド2.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/0a7b861b-17d0-87af-bc09-0811bb99b391.gif)


オセロの64マスの盤面に番地をつけ、黒石が置いてある番地には"1"、置いてない番地には"0"を置いていきます。

この結果を横一列に並べると図の上にあるような64個の数字の並びができます、これがコンピューターへの入力になります。

64個の数字が並んでいるので数学的な言い方でこれを64次元のベクトルといいます。

###**教師情報の入力**

今回は教師あり学習という方法をとるので、書いた数字が0~9のどれか？正解情報もコンピューターに入力する必要があります。

![スライド3.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/74f607e7-877c-568a-f9a9-8ddaf954cd87.gif)


ここでもベクトルを使っています、10次元のベクトルを使って「0が正解なら一番最初の数字を1に、その他は0に」と1の場所で数字を表現します。

ここで紹介した方法はコンピューターで画像を扱う際の一般的な手法で、ディープラーニング特有のものではありません。


##**ディープラーニングの基本構成要素**

ディープラーニングはノードという部品で構成されています。まずはこのノードがどんなことをするか見てみましょう。

![スライド4.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/c515f658-b394-c274-ba77-f5dbdff87d60.gif)

ノードがやっている処理はとても簡単です

1. 画像情報をベクトル化した64次元の"入力"情報それぞれに
2. ひとつづつ用意された"重み"を掛けて
3. 掛けた結果を"合計"して
4. 関数で"変換"して
5. その結果を次のノードにわたしています。

###**関数**

変換に使う関数のバリエーションは少なく、数種類の定番が決まっています。関数というと難しそうですが、やってることはそんなに難しくありません。以下に代表的な２つの関数の概要を記します。

- シグモイド関数 : 入力がどんな数字でも出力は0~1の範囲に収まる関数
- ReLU : 入力が0以下の場合は0、0より大きい場合は入力値をそのまま出力する関数

###**シェフに例えると**

シェフは64個の素材それぞれに用意したレシピに従い分量を決めます、分量が決まったら64個の素材をまぜて、非線形の味付けをした料理をして次のシェフに渡します。

##**ディープラーニングの構造**

ディープラーニングは複数のノードが接続されたネットワーク構造になっています。今回は代表的な順伝播型ネットワークを例にその構造を説明します。

![スライド5.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/2402210b-09d9-745f-354f-c4afd4505b3d.gif)


ネットワークは多層構造になっていて、入力情報が第一層→第二層→第三層と順に送られます、多層=層が深いのでディープという名前がついています。
ネットワークを構成する複数のノードが流れ作業をするイメージです。各ノードが行う処理は先ほど説明したシンプルなものです。

###**シェフに例えると**

厨房で複数のシェフが働いているイメージです。料理は複数のステップに分かれており、第一厨房のシェフは調理したものを第二厨房へ、第二厨房のシェフは再三厨房へと流れ作業で料理をしていきます。シェフはそれぞれ独自のレシピを持っていますが、調理方法自体はみんなほぼ同じで、そこにシェフの独自性はありません。

##**これで何ができるの？**

ここまでの説明で「簡単な処理をするノードをつなげてネットワーク作ってるだけでしょ、そんなので何かできるの？」という印象を持たれた方いらっしゃると思いますが、基本的な仕組みはこれだけです。

このネットワークの "重みを適切に設定する"と 数字の仕分けができるようになります。具体的には第三層の各ノードが特定の数字である確率を出力するようになります、ちょっとびっくりですよね。

逆に言うと、重みを適切に設定していなければ何の役にも立ちません。さてどうやって"重みを適切に設定する"のでしょう？

##**機械学習　"重みを適切に設定する方法"**

重みの調整はデータを使って行います。今回の例では入力イメージが１の場合は１の確率が上がるように、2の場合は2の確率があがるように、重みを少しずつ調整していきます。
この方法でたくさんのデータを使って少しずつ重みを調整していくと最終的に精度の高い分類ができるようになります。この動きがデータを使って重みを学習していくようにみえるので機械学習と呼ばれています。
重みの調整は出力結果をもとにまず第三層を、第三層の結果をもとに第二層をという具合にデータを入力する時とは逆方向に処理していきます、この仕組みは "誤差逆伝播" とよばれています。

![スライド6.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/d76069f1-4485-992d-6f5e-0c20934ada9d.gif)

###**シェフに例えると**

この厨房では何度も何度も調理をして、求める味に近づけていきます。調理するたびに求める味との違いをチェックし、レシピを変更していくのです。求める味との違いをもとに、まず第三厨房のシェフがレシピを変更します、その情報が第二厨房に伝わり、第二厨房のシェフがレシピを変更、さらに第一厨房へ、と料理を作った時とは逆の方向でレシピの調整が行われます。一度に大幅なレシピの変更は行いません、毎回微調整を重ね、それを繰り返すことで最終的に求める味を得るのです。

#**ディープラーニングが黒魔術と言われる理由**

最近ディープラーニングは黒魔術と言われることがありますが、ここまでの説明には黒魔術っぽいところは無かったですね。

ではどうして黒魔術と呼ばれるのか？以下筆者の考えるディープラーニングが黒魔術と呼ばれている理由を述べます。

##**ノウハウはあるが論理がない**

ディープラーニングが黒魔術と呼ばれている最大の理由は、最適な解を得るためのノウハウはあるが理論がないからです。

「やってみて初めて効果あるかないかわかる、効果のあった理由が論理的に説明できない」これが黒魔術といわれる理由です。

###**ネットワーク構造**

今回は説明のため簡単なネットワーク構造を使いましたが、実際の活用場面ではもっと多くの層と多くのノードを使った大規模なネットワークが使われます。

しかし、そもそも多層にするとどうして性能が上がるのか？どんなタスクにどんな構造のネットワークが適しているのか？十分な理解はすすんでいるとはいえず試行錯誤の状態です[^1]

[^1]: [深層学習 (機械学習プロフェッショナルシリーズ)](https://goo.gl/nEMTmk)

###**重み調整**

先ほどは少しずつ重みを調整すると曖昧な言い方をしましたが、どのくらいの更新量で調整していくかは性能に大きく関係しています、しかしこれも明確な理論はなく試行錯誤して決める必要があります。

###**その他もろもろ**

初期値を適切なものに設定するちょっとトリッキーな方法（自己符号化による事前学習）、学習の際にノードを一部取り除くことで汎用精度を上げる方法（ドロップアウト）などなど、ここでは紹介しきれないほどさまざまなノウハウがあるのですが、明確な理論があるものは少なく、作業は試行錯誤の状態です。

##**こんなものできたのか？　〜数理脳科学〜**

理論が無くノウハウに頼るような仕組みがどうしてできたのか？ちょっと不思議ですよね。

実はこの仕組みは脳の研究から生まれました、脳の仕組みを簡単なモデルで作ってみる"神経回路モデル"がディープラーニングのルーツです。

現在ディープラーニングで使われている技術は、この分野ではすでに３０年近く前から存在します。

下記２つの本はおよそ３０年前に書かれたものですが現在ディープラーニングで使われている仕組みをほぼ網羅しています。

[神経回路網モデルとコネクショニズム (コレクション認知科学)　甘利俊一](https://goo.gl/qXPg2H)
[ニューラルコンピュータ―脳と神経に学ぶ　合原一幸](https://goo.gl/axVDpN)

この本を書いた二人の著者の最新書籍も必見です

[脳・心・人工知能 数理で脳を解き明かす　甘利俊一](https://goo.gl/LmW9aV)
[人工知能はこうして創られる　合原一幸](https://goo.gl/Rq5Cee)

この分野の研究が、ディープラーニングの黒魔術を数理で解き明かす可能性があると筆者は期待しています。

##**ディープラーニングを理解するために　〜複雑系〜　**

そもそもディープラーニングでとても不思議なのは、ひとつひとつのノードがやっていることはとても簡単なのに、それが複数繋がったネットワーク構造になると高い認識能力を発揮するところです、これって特別なものなんでしょうか？

実はあなたの身の回りにも同じ特性を持った現象がたくさんあります。例えば、アリの巣、経済、免疫系などがそうです。

これらは総して複雑系とよばれています。

###複雑系って何？

数多くのコンポーネントから構成されながらも、単純な運用規則を持つのみで中央制御機構を持たない大規模ネットワークから、集合体としての複雑な振る舞い、複雑な情報処理や、学習、進化による適応が生じるシステム

- 集合体としての振る舞いの複雑さ
- シグナルと情報処理　　　　　　　
- 適応　　　　　　　　　　　　　

ディープラーニングはまさにこの定義にあてはまります。個々のノードの仕組みはとても単純ですがそれが集まって高い認識能力を発揮します、精度を上げるために入力データから学習を行い、予測精度をあげています。

蟻の巣もこれにあてはまります。個々の蟻の動きは単純ですが、それが集団になるとまるで誰かが命令しているような立派なアリの巣を作ります。

ディープラーニングの仕組みを解明していくためには従来の科学の主なアプローチ方法である還元主義だけではなく、複雑系のアプローチも必要になってくると筆者は考えます。

複雑系に興味が湧いてきたかたはこちらの本を是非読んでみてください。

[ガイドツアー　複雑系の世界: サンタフェ研究所講義ノートから](https://goo.gl/2HXu2e)

---

*Qiitaの入力練習を兼ね、筆者が「オルタナティブ・ブログ  越境するコンピューター」に投稿したものを加筆・修正して作成しました。*

---
参考文献