【初心者向け】本当にわかりやすいAI入門:第2章 脳はすごい

# はじめに

この記事は全7章に分かれた「本当にわかりやすいAI入門」の第2章です。以前の記事を読まれていない方は、先にこちらをご参照ください。

|章|内容|
|:-----:|-----|
|第1章|[AIはなぜ人間みたいなことができるのか?](https://qiita.com/segavvy/items/9e7e4ab4b253599ac58a)|
|第2章|脳はすごい（この記事）|
|第3章|[伝わりやすさと境界の決め方](https://qiita.com/segavvy/items/6459c5de2bb973442919)|
|第4章|[細胞増やすだけではダメだった](https://qiita.com/segavvy/items/5702a4620c43bfb0c87e)|
|第5章|[時間も手間もお金もかかる](https://qiita.com/segavvy/items/903e60bb7579f9d45273)|
|第6章|[文章生成の大規模化による進化](https://qiita.com/segavvy/items/2f2b46acb36d53a0eded)|
|第7章|[AIのこれから](https://qiita.com/segavvy/items/b20fb22c612702ec9178)|

:::note info
この記事は個人で作成したものであり、内容や意見は所属企業・部門見解を代表するものではありません。
:::

# 第2章 脳はすごい

突然ですが、今回は脳の仕組みのお話です。

## 脳はすごい

脳はすごいです。

- 計算できる
- 読める・書ける
- しゃべれる
- 絵だって描ける
- 知識や経験で判断できる
- 将来の予想もできる
- 経験や訓練で効率が上がる
- できることが勉強で増やせる

当たり前のように思われるかもしれませんが、コンピューターではこうはいきません。できることを増やすにはプログラムの追加や修正が必要です。

脳は産まれた時にできた1つの仕組みで、経験や訓練をすれば性能が上がり、勉強すればできることが増やせます。これはすごいことなのです。

## 脳の仕組み

脳は、神経細胞と呼ばれる特殊な細胞がつながりあってできています。下の図の黄色い部分が1つの細胞です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139624/4d355fb3-502f-a73c-0f07-899990177464.png)

細胞は他の複数の細胞から信号を受け取ります。この図では、他の5つの細胞から緑の矢印の方向で信号を受け取っています。信号を受け取った細胞は、その強さの合計がある境界を越えると、次の細胞へ信号を伝えます。青い矢印がそれを示しています。

細胞間の信号の伝わりやすさや、次の細胞へ信号を伝えるかどうかの判断の境界は、細胞によってまちまちです。

## 細胞をコンピューターでマネしたら？

1943年に神経生理学者・外科医のマカロックさんと論理学者・数学者のピッツさんがタッグを組み、脳の神経細胞をコンピューターでマネした仕組みを考えました。脳の仕組みを調べてコンピューターでマネすれば、ヒトと同じように思考できるAIが完成するはず！そんな奇想天外なアプローチです[^1]。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139624/a8071f81-698d-71a2-51a2-5dff7e2aae8f.png)

## 考案された仕組み

ここで考案された仕組みは、細胞をマネた非常にシンプルなものです。

1. 前の細胞の出力（`0`か`1`）を入力として受け取ります。
1. それぞれの伝わりやすさを掛け算します。
1. その合計が境界以上なら`1`を出力します。

下の図の中央の青の丸が1つの細胞です。左側の2つの細胞から入力を受けますが、途中の緑の線で伝わりやすさの影響を受けて、伝わる信号の強さが変化します。それらを受け取った青の細胞は、受け取った値の合計が境界を越えたら次の細胞に出力し、越えない場合は何もしません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139624/6fcd42db-2a3b-5f44-1876-792f9007e776.png)

たとえば前の細胞Aから`1`の入力が伝えられ、細胞Bからは`0`の入力（つまり入力は伝えられなかった）とします。この時、上の図では細胞Aからの伝わりやすさは`0.6`なので、実際に伝わる入力は`1×0.6`で`0.6`です。細胞Bからは入力がないので計算不要ですが、もし計算するのであれば`0×0.2`で`0`の入力が伝わった形です。

青い細胞は細胞Aから`0.6`、細胞Bから`0`の入力を受け取るので、合計は`0.6`です。これは青い細胞の境界である`0.4`以上なので、次の細胞に`1`を出力します。もし境界より小さい場合は次の細胞へは信号を伝えません[^2]。

## 細胞1つでAND・OR・NANDができた！

この脳をマネしたこの細胞は、かなりいろいろなことができます。
たとえば、伝わりやすさと境界をうまく調整すると、「論理演算」と呼ばれる計算のうちのANDとORとNANDが細胞1つで実現できてしまいます。

専門用語を使わないと言いつつ「論理演算」という言葉を使ってしまいましたが、これはある事柄がOKなのかNGなのかを判断するルールのことで、次のような種類があります。

|論理演算の種類|読み方|判断のルール|
|:---:|:---:|:---|
|AND|アンド|両方OKならOK!<br>それ以外はNGです。|
|OR|オア|どちらかOKならOK!<br>両方OKでもOKです。|
|NAND|ナンド|両方OKの場合だけはNG!　それ以外はすべてOK!<br>ANDの反対（not AND）です。|
|XOR|エクスオア<br>エックスオア|どちらか片方「だけ」がOKならOK!<br>両方OKの場合や両方NGの場合はNGです。|

たとえばANDの場合は伝わりやすさをどちらも`0.5`に、境界の値は`0.7`にして、OKを`1`、NGを`0`として計算します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139624/8ecd5929-b56c-b400-d524-0b8954c933ec.png)

たとえば入力AとBがどちらも「OK」の場合、青い細胞は`1 × 0.5　+　1　×　0.5`で合計`1`の入力を受け取り、境界の`0.7`以上なので`1`を出力し「OK!」と判定するわけです。もし細胞Bが`0`の場合は`1 × 0.5 + 0 ×　0.5`で合計が`0.5`となり境界に届かないので出力は`0`で「NG!」 です。ANDのルールが実現できていることがわかるかと思います。

ORの場合は、次のように境界の値を`0.2`にすると実現できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139624/72697895-95df-237c-99d0-a16df86c091e.png)

NANDはちょっと変わっていて、伝わりやすさを`-0.5`、境界を`-0.7`にします。伝わりやすがマイナスというのはちょっと違和感がありますが、まぁ、細かいことは気にしないで進みましょう。いくつか計算してみると、NANDがのルールが実現できていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139624/4446acca-b78a-bcd0-ab91-ac75ac2e5589.png)

ここで重要なのは、伝わりやすさと境界の値を変えるだけで、仕組み自体は変えずに3種類の機能が実現できることです。これまで、コンピューターでできることを増やすにはプログラムの追加や修正が必要だったのですが、プログラムの修正は必要ありません[^3]。

## 細胞が3つあればXORもできる！

論理演算の表の最後にあったXORは、細胞1つでは計算できないのですが、細胞が3つあると計算できます。

|論理演算の種類|読み方|判断のルール|
|:---:|:---:|:---|
|XOR|エクスオア<br>エックスオア|どちらか片方「だけ」がOKならOK!<br>両方OKの場合や両方NGの場合はNGです。|

以下がその図です。入力AやBから2つの緑の矢印が出ていますが、これはその先の細胞両方に値を伝えることを示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139624/059d8759-fe7d-1e3a-6a0d-89edfb3821ac.png)

実際に入力AとBに値を指定して計算してみると、XORが実現できていることがわかります。

## 細胞が160個あれば手書き数字も認識できる！！

細胞を160個使って次のように組み合わせると、なんと手書きの数字が認識できます[^4]。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139624/38d7419d-7b5d-7431-f749-17b0fc38d34f.png)

入力は784個のデータで、縦横それぞれ28個の点からなる画像です。これを入力として、50個の細胞（細胞1〜50）の出力を計算します。次にこの50個の出力を入力として、次の100個（細胞51〜150）の出力を計算します。最後にこの100 個の出力を入力として、最後の10個（細胞151〜160）の出力を計算します。

最後の10個の細胞は数字の0から9に対応しており、入力で渡した画像に対応する数字の細胞の出力が強くなる仕組みになっています。これにより、手書き数字の画像がどの数字なのかを認識できるようになっています。

# 第2章のまとめ

- 脳をマネした仕組みでは、細胞間の伝わりやすさと境界値を変えるだけでできることが変えられます。
- 細胞の数を増やせば、手書き数字の認識のような複雑なこともできます。

ただし、細胞間の伝わりやすさと境界値が正しい値になっていないと正しく処理できません。この値はどうやって決めればいいのでしょうか。AND・OR・NANDくらいなら自分で考えることもできそうですが、手書き数字の認識では細胞や線が大量にあるので、ちょっと考えるのは無理そうです。次回はこの値の決め方について考えていきます。

:::note info
[「第3章 伝わりやすさと境界の決め方」](https://qiita.com/segavvy/items/6459c5de2bb973442919)へ続きます。
:::

[^1]: 当時、ここで考案された仕組みには呼称がなく、その後「[形式ニューロン](https://ja.wikipedia.org/wiki/%E5%BD%A2%E5%BC%8F%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%AD%E3%83%B3)」などの名前で呼ばれるようになりました。
[^2]: ここでの説明は境界と同値の場合も1を出力するとご説明していますが、厳密にはここでご紹介した形式ニューロンは「[ヘヴィサイドの階段関数](https://ja.wikipedia.org/wiki/%E3%83%98%E3%83%B4%E3%82%A3%E3%82%B5%E3%82%A4%E3%83%89%E3%81%AE%E9%9A%8E%E6%AE%B5%E9%96%A2%E6%95%B0)」を使うので境界と同値の場合の定義がありません。
[^3]: 伝わりやすさや境界の値を変えるためにはプログラムの修正が必要では？と思われる方もいらっしゃるかも知れませんが、伝わりやすさや境界の値はプログラムの中に組み込むのではなく、実際に計算する時に与える形で開発するのが一般的です。このような計算時に与える値を、プログラムの世界では「[パラメーター](https://ja.wikipedia.org/wiki/%E5%AA%92%E4%BB%8B%E5%A4%89%E6%95%B0)」や「[引数](https://ja.wikipedia.org/wiki/%E5%BC%95%E6%95%B0)」と呼んだりします。
[^4]: この例は書籍「[ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装](https://amzn.to/483zwUc)」で紹介されているもので、このような脳をマネした仕組みを「[ニューラルネットワーク](https://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF)」（neural network）と呼びます。なお、この図の仕組みのままでも手書き数字画像セットの「[MNISTデータベース](https://ja.wikipedia.org/wiki/MNIST%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9)」で90%を越える精度で認識できますが、入力784ピクセルのデータを細胞1から50へ「[全結合](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%95%E3%82%A3%E3%83%B3%E7%B5%90%E5%90%88)」（affine combination）しているためピクセル間の上下左右の位置関係が失われてしまい、精度を上げにくい構造になっています。そのため実際の画像認識では、ピクセルの近いもの同士だけを次の細胞につなげる「[畳み込みニューラルネットワーク](https://ja.wikipedia.org/wiki/%E7%95%B3%E3%81%BF%E8%BE%BC%E3%81%BF%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF)」（convolutional neural network）や、最終の出力と入力寄りの細胞との関連を覚えるように細胞のつなぎ方を工夫した「[アテンション](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3_(%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92))」（注意機構：attention）などが使われます。ちょっと脱線しますが、アテンションは自然言語処理の流れで学ばれる方が多いでしょう。でも、概要だけなら画像処理から入った方が理解しやすいです。ソニーさんが公開されている動画「[Deep Learning入門：Attention（注意）](https://youtu.be/g5DSLeJozdw?feature=shared)」がものすごくわかりやすいので、（私のように）アテンションでつまずいてしまった方はぜひ！