高校数学ではじめる機械学習 #7: ニューラルネットワーク: 万能?のブラックボックス

[目次はこちら](https://qiita.com/tomo_t/items/25035a9487bd5014754b)
##はじめに
今回は__ニューラルネットワーク(NN)__についてお話ししたいと思います。
(そういえば、機械学習でNNというと、ニューラルネットワークのことを指すときと、最近傍法のことを指すときがありますね。)
__ディープラーニング(深層学習; DL)__という言葉に聞き覚えがある方もいらっしゃるかもしれませんが、これは基本的にはニューラルネットワークと同じものです。もしかすると、大規模なニューラルネットワークをディープラーニングと呼ぶ傾向があるかもしれません。本稿ではまとめてニューラルネットワークと呼ぶことにします。

ニューラルネットワークは、複雑な計算のネットワークを適切に作れば、どんな関数でも近似できるのではないか、というアイデアに基づいています。また、よくあるアナロジーとして、ヒトの脳細胞を真似しているともよく言われます。これは活性化関数の項で説明します。

##ニューラルネットワーク
###ニューラルネットワークの全体像
ニューラルネットワークは、関数を以下の図のように書くことを目指します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528459/734833eb-38cc-1d1a-0c98-64042b37e384.png)
(画像はhttps://qiita.com/43x2/items/50b55623c890564f1893 から拝借)

「層」と「ノード」という概念をまず説明します。ニューラルネットワークは複数の「ノード」からなる「層」が重なってできています。計算は、独立変数にあたる入力層から、目的変数にあたる出力層にむかって行われます。大学受験の予測の例でいうと、入力層が各科目の模試の点数、出力層に対応するのが合否の予測です。

各層のノードは、一つ前のノードの線形結合の関数になっています。つまり、i層目のj番目のノードの数値$l_{i,j}$は、

```math
l_{i,j} = \phi(\alpha_{i, j} + \sum \beta_{i-1, k, j}l_{i-1,k})
```
と書かれます。数式だけだと難しく感じられるかもしれませんが、以下のように理解すると簡単です。あるノードの値を計算するには、

1. 一つ前の層のノードの値それぞれになんらかの係数$\beta_{i-1, k, j}$をかけて足し合わせる。係数は上の層の矢印ごとに異なる
2. それにノードごとに異なる定数(バイアスとも呼びます)$\alpha_{i, j}$を足す
3. こうして得た値を何らかの関数に突っ込む

という手順を踏みます。

ニューラルネットワークを学習させるというのは、ここに出てきた係数$\beta$や定数$\alpha$を調整することを指します。
逆に言うと、層やノードの数、各ノードの「何らかの関数」の種類は、初めに固定してしまいます。もちろん、、層やノードが多いほど複雑な関数を表現可能ですが、副作用として計算が大変になります。

###活性化関数
専門用語では、この「何らかの関数」を__活性化関数__と呼びます。
活性化関数$\phi(x)$には、$x$が小さいときは(ほぼ)0や-1で、$x$が大きくなると1に近づく/$x$に比例して大きくなるような関数がよく選ばれます。
たとえば、ReLU関数というのがよくつかわれ、

```math
ReLU(x)=\max(x,0)
```
です。名前は難しそうですが、ReLU関数というのはxが正ならそのままxを返し、負なら0を返すというだけの関数です。
他の活性化関数は[Wikipedia: 活性化関数](https://ja.wikipedia.org/wiki/%E6%B4%BB%E6%80%A7%E5%8C%96%E9%96%A2%E6%95%B0)をご覧ください。

これは、「ヒトの脳細胞は得られる刺激がある閾値を超えるとニューロンが発火し、次の細胞に刺激を加える」という現象のアナロジーです。

###誤差逆伝播法
[誤差逆伝播法をはじめからていねいに](https://qiita.com/43x2/items/50b55623c890564f1893)という素晴らしい記事がありますので、詳しくはそちらをお読みください。ここでは、すごくざっくりと説明します。

__誤差逆伝播法__というのは、係数$\beta$と定数$\alpha$を調整する方法です。
まず、$\alpha, \beta$はランダムに仮定します。
あるデータがあると、入力層のノードの値(各テストの点数)と出力層のあるべき値(合格かどうか)がわかります。
また、現在仮定している$\alpha, \beta$をもとにして計算した出力層の暫定的な値も得ることができ、あるべき値と暫定値の差(誤差)が計算できます。
ではどのように$\alpha, \beta$を変えればあるべき値と暫定値を近づけることができるのでしょう。
実は、各ノードの値がどうなるかを出力層から逆順に、それぞれのノードに対応する$\alpha, \beta$たちで微分していくことで、それぞれの$\alpha, \beta$が出力層での誤差にどれだけ影響を与えるかを知ることができます。
この微分係数をもとに、パラメーターを少しづつ調整していくことを繰り返していくのが、誤差逆伝播法です。

これは数値的な解法ですので、必ずしも本当に最適なパラメーターを得られるとは聞ぎらないことに注意してください。

###強化学習における適用
前回紹介した強化学習にもニューラルネットワークは登場します。
たとえば、将棋の盤面と各盤面での合法手は天文学的な数があり、それぞれの評価値を記憶しておくことは不可能です。
ですので、評価値を盤面/候補手をインプットとしたニューラルネットワークで表現することを考えます。
この方法であれば、記憶するべきは各ノードの係数と定数のみなので、コンピューター内に記憶可能です。
前回説明した、各候補手に対する評価値の更新の代わりに、ニューラルネットワークのパラメーターを更新していくことで、この方法は実現されます。

##ニューラルネットワークの利点と欠点
ニューラルネットワークは層の数とノードの数を増やすことで、非常に複雑な問題に対処できます。たとえば、画像の分類問題などは、SVMやロジスティック回帰のような線形分離を仮定する古典的な方法では難しいでしょう。

しかし、ニューラルネットワークには、__人間が解釈できない__という非常に大きな欠点があります。ニューラルネットワークで作ったモデルが、どのような変数をどう解釈してアウトプットを出したのかを、人間がパラメーターの値を見て理解することは不可能です。

この性質は時に、モデルの評価に対してすら誤りをおこします。[Notes on AI Bias](https://www.ben-evans.com/benedictevans/2019/4/15/notes-on-ai-bias)が非常に興味深い事例を紹介しています。
皮膚がんとほくろを見分ける画像診断ニューラルネットワークは、一見非常に高い精度を発揮していました。しかし、実はこのモデルは皮膚がんとほくろを見分けてはいませんでした。医師は皮膚がんを記録するときに、大きさを示すために定規を写真に写りこませる癖がありました。なんとこのモデルは、「定規が写っているかどうか」を判別していたのです。

また、[別の例](https://www.reuters.com/article/us-amazon-com-jobs-automation-insight/amazon-scraps-secret-ai-recruiting-tool-that-showed-bias-against-women-idUSKCN1MK08G)では、アマゾンが履歴書の選別AIを作りました。
しかしこのモデルは、学習に使ったデータの中にあった「女性が不利な扱いを受ける」というバイアスを学習してしまい、「性別」が直接のインプットに入っていないにもかかわらず、女性であることを想起させる経歴(女子大出身など)がある候補者を却下するようになってしまいました。結果Amazonはこのモデルの開発・使用を中止しました。

また、ビジネスにおいては「なぜ」そうなのかを説明することが人(会社の幹部かもしれませんし、現場の営業マンかもしれません)を動かすことにつながることもあるでしょう。
例えば、営業を掛けるべき見込み顧客を発見するモデルを作ったとしましょう。営業マンに「この顧客を狙ってください」と言っても営業マンもなぜその顧客なのかを知りたくなることは想像に難くありません。
こういったとき、ニューラルネットワークでは「コンピューターがそういっています」以上のことが言えません。一方、例えばロジスティック回帰や決定木なら、「XXという変数の影響です」と言えます。

このように、ニューラルネットワークのモデルは思わぬ挙動をしてしまうことがあり、さらに悪いことにそれに人間が気づけないこともあります。また、解釈可能なモデルがうれしいシチュエーションもあるでしょう。
ニューラルネットワークは大変便利で複雑な問題にも適用可能ですが、いついかなる時も古典的手法より優れているわけではない、ということを理解いただけると幸いです。