社内でディープラーニングを教えた話

# 社内でディープラーニングを教えた話
数人の同僚に要望されたので、ディープラーニングを教えてみました。
教えた相手が文系であったため、数学やプログラムを極力使わず、喩え話や具体例にして教えました。
皆様がディープラーニングを同僚や社内で教えていく、広めていくヒント（または反面教師）として、参考にしてください。

## when, who, what
10月の1ヶ月間、週1時間ペースで教えました。

同僚のスペックはこんな感じです。
- 同僚A　20代、文系。
- 同僚B　30代、理系。
- 同僚C　30代、文系。
- 同僚D　40代、文系。
- 同僚E　50代、文系。
というわけで、ほとんどが文系の20代～50代です。
理系は多かれ少なかれ情報処理、コンピュータ・アーキテクチャ、数学を知っていますが、文系はその辺があやふやです。

以下のテーマで話しました。
社内の同僚相手なので、教えながら質疑応答したり、テーマ変えたり、臨機応変なスタイルにしました。
0. 機械学習
1. ニューラルネットワーク
2. 誤差逆伝播法
4. 畳込みニューラルネットワーク（CNN）
5. LSTM
8. 強化学習

## why, how
ディープラーニングを教えた動機は同僚からの依頼ですが、個人的には以下を目標としました。
1. 同僚がディープラーニングを「AI」のイメージだけで語らないようにする。
2. ディープラーニングの全体像を把握し、説明できるようにする。
AIブームの昨今、「AIが仕事を奪う」、「AIは怖い」、「AIは何でもできる」、「猫と犬くらい俺でも判別できる」云々という偏見が叫ばれていますが、そういった偏見を打破し、大まかに説明できるようになってもらうことを目標としました。
AIの期待が高まるのは良いのですが、AIをターミネーターや鉄腕アトムのように認識されているの打破したいと考えました。

教える相手はバックグラウンドや知識がまちまちだったので、可能な限り全員が理解できる内容にしました。
そのために気をつけたことは以下です。
1. 数式とプログラミングは可能な限り省く。
2. 抽象的なことはなにかに喩えるか、具体例にする。

ディープラーニングを数式抜き、プログラミング抜きで教えることの是非はあると思います。
しかし、微分や行列を勉強していない（または10年以上使っていない）のに確率的勾配降下法の連鎖率を数式で説明しても混乱するだけです。
細かい理論や実装方法は脇に置いといて、まずはディープラーニングは何ができて何ができないのか、具体例に置き換えて説明しました。

教えたことの全てを以下に書くことは無理ですが、重要なことを抜き出して共有します。

## ディープラーニングを教えるための喩え話

### その1　機械学習
機械学習はデータ分析の一種で、データから法則性を発見して、「予測」してくれるプログラムです。
たとえば東京の天気過去3年分のデータがあるとして、今年の10月下旬の天気を知りたいとします。10月の天気データは既に3年分あるので、そのデータをみればなんとなく、10月下旬の天気にどういう法則があるのか、わかると思います。
仮に3年分のデータがこうなっていたとしましょう（あくまで仮です。実データは[気象庁参照](http://www.data.jma.go.jp/obd/stats/etrn/index.php)）。
- 2014年10月：60％で晴れ、20％で曇り、20％で雨
- 2015年10月：80％で晴れ、15％で曇り、5％で雨
- 2016年10月：65％で晴れ、25％で曇り、10％で雨
これを見ると、10月は晴れ間が多いので、晴れと予測すれば正解しそうです。

![0.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/710cd8be-0df6-3dc6-f861-3fc62c67d335.png)


これがもしもっと大量のデータで正確に予測したいとなると、パッと見で正解を得ることはできなくなります。たとえば東京都の1時間ごとの気温予測とか、株価の値動きとか。
大量のデータから法則性を自動的にみつけて、「予測するモデル（＝プログラム）」を作ってくれるのが機械学習です。
機械学習を使えば、予測に使うデータ（入力データ）と予測の対象（ターゲット）を指定するだけで、データから予測してくれるモデルが作れます。

### その2　ディープラーニングとCNN
ディープラーニングは機械学習の一種のニューラルネットワークの発展型です。
ニューラルネットワークは人間の脳みその働きをコンピュータで模倣したものです。人間の脳みそはニューロンという、入力（＝見たもの、聞いた言葉等々）に反応する機能が備わっていますが、ニューラルネットワークではニューロンみたいなものをプログラムで作ります。つまり、特定の入力（＝りんごの画像とか）に反応するプログラムを作ります。人間がりんごを見たら赤い色、丸っこい形、拳より少し大きいという特徴を認識して「りんご」と判定するように、ニューラルネットワークはりんごの特徴的な形を認識して「りんご」と予測します。

画像認識にはConvolutional Neural Network（畳込みニューラルネットワーク）という手法が使われます。
畳込みニューラルネットワークでは、画像の特徴を捉えるのにフィルターというものを使います。
フィルターにはたくさんの種類があって、細い縦線を見つけるフィルターや、太い45度の斜め線を見つけるフィルターがあります。このフィルターに画像をとおすと、画像の中の特徴的なところが浮き彫りになる仕組みをしています。
フィルターは人間の目みたいなものです。

たとえば猫と犬の絵があります。
CNNでは絵の中から特徴を見つけ出すフィルターを使うことで、猫の特徴（丸っこい、髭、口の形等々）や犬の特徴（面長、鼻の形等々）を見つけ出し、猫、犬と判定します。
フィルターは誤差逆伝播法によって洗練させていきます。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/723bf0bf-9edf-30be-5901-93ecd1a0ff1f.png)


長くなりましたが、ここまで説明すれば、概ねディープラーニングの目的は理解されます。
あとはディープラーニングを実現する手法を喩え話にして説明していきます。


### その3　誤差逆伝播法
ディープラーニングでは誤差逆伝播法という手法を使って、猫を猫、犬を犬と判定できるようになります。
誤差逆伝播法は人間が新しい英単語や数式を覚えるときに反復学習するのと同じ手法です。
人間が新しい英単語を覚えるとき、繰り返し書いたり読んだりして覚えますが、ニューラルネットワークも同じように、繰り返し間違えて、間違いを修正して覚えていきます。

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/febd9ce2-da65-71ba-34df-d645124da30a.png)


ニューラルネットワークではたくさんの猫の画像を何回も見て、ほぼ毎回正確に猫と判定できるようになるまで、学習します。
人間が新しい英単語を覚えるために、何回も書いて覚えるのと同じです。


### その4　LSTM
ディープラーニングで言葉を扱う場合はLSTMという手法を使います。
（LSTMはそもそもRNNというものがあり・・・的なことは省略）
人間が文を理解するとき、前の言葉をつなげていって文全体で理解すると思います。
LSTMはそれをディープラーニングでやろうという手法です。
たとえば
「彼女へのクリスマスプレゼントにルビーのネックレスを買ったけど、彼女がいないことに気付いたので、クリスマスはラーメンを食べた」
という文があるとします。
人間がこの文をみれば、「悲惨だ」【悲しい」「(ﾟ∀ﾟ)人(ﾟ∀ﾟ)ﾅｶｰﾏ」、という感情を抱くでしょう（知らんけど）。

LSTMでは前に言われた言葉や文脈を覚えておく領域を用意しておきます。
「彼女への」→「クリスマス」→「プレゼント」→「ルビー」→「ネックレス」と、前の言葉が文脈を作って、後ろの言葉に意味合いを持たせています。
LSTMはこういう意味合いを理解するために、文脈に重要性をもたせ、重要な文脈は覚えておき、必要なくなったら忘れる、ということをします。
「彼女への」→「クリスマス」→「プレゼント」→「ルビー」→「ネックレス」→「買った」までは、前の文脈は覚えておきます。
しかし、「彼女」→「いない」→「気付いた」で文脈がリセットされ、以降の文では「彼女」も「ネックレス」も「買った」も重要ではありません。
かわりに、新たに「彼女がいない」文脈が発生します。
LSTMでは文脈が必要なくなったら忘れ、新たな文略を作ります。以前の文脈の重要性を０にして、次の語句にいきます。
「彼女」→「いない」→「気付いた」→「クリスマス」→「ラーメン」→「食べた」
これで、この文は「クリスマスは孤独だった、悲惨だった」ということを書いている文だ、と理解できます。

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/aca79131-dbbf-aa49-4250-56c9c1f96a31.png)


### その5　強化学習
強化学習は人間がゲームやスポーツに打ち込んでいるうちに上手くなるのと同じ原理で、コンピュータがゲームや作業を上手くなっていく手法です。
強化学習ではコンピュータがゲームのプレイヤーとなって何回もゲームをプレイします。
最初のうちはゲーム初心者で高得点を取れませんが、何度も練習しているうちに上手になっていきます。
この「何度も練習しているうちに上手になる」筋道をプログラムで作るのが強化学習です。

強化学習でやっていることは、野球を始める子供にキャッチボールを教えるのと同じです。
子供は相手の投げたボールをキャッチできればOK、という取れなければNGということを、反復練習して上手くなっていきます。
反復する中で、上手なボールの取り方、確実な取り方を経験的に身につけていきます。
強化学習でも同様に、ゲームを練習して、少しずつ高得点の取れるプレイを探っていきます。

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/79f1b370-9606-5431-f7a1-f11ceb518626.png)


## 教えてみてわかったこと
数式やプログラミングを使わずにディープラーニングを大体おおまかに説明しました。
もちろんディープラーニングを正しく理解し、有効に使うためには、理論と実装（数学とプログラミング）が必要になります。
しかし、目標としていたAIに対する偏見を打破する、くらいの理解は得られたと思います。

理論を説明しだしたら数式とプログラムまみれになる機械学習やディープラーニングについて、喩え話にして説明しました。
今回は8割がた文系相手だったので、喩え話や具体例で教える方針を取りました。
相手の知らないことを教えるとき、先生側は自分の理解を伝えようとしがちです。
相手が自分と同じ知識レベル、理解の仕方をするのであればそれで良いのですが、数式を読めば理解する人（理系に多いと思う）と、ものの喩えや具体例で理解する人（文系に多いと思う）に同じ教え方をするのは難しいです。
他方で、理解して知識として定着させられれば、文系でも機械学習やディープラーニングでなにができるのか把握し、他人に説明できるようになります。

あとは同僚たちが自分でプログラミングしてディープラーニングで遊び始めると嬉しいです。

注：物事を理解するのは個人差があります。文系理系も、絶対的に正しい分け方ではありませんので、ご注意ください。