AI知識ゼロからニューラルネットワークを段階的に少しずつ理解する

# はじめに
​
ChatGPTが出てまたAIが盛り上がっていますが、**流石にそろそろ仕組みを理解したいなと思っていませんか？**
​
別に仕組みを知らなくても使えるなら良いんですが、ある程度の仕組みを知らないと使う上での意思決定の精度が落ちる場面もあるかと思います。
​
「にゅーらるねっとわーく...？」なAI初心者が、ある程度（＝AIを使う上での種々の意思決定ができる程度）の範囲で知識をつけるために適したネット上の入門系資料と読む順番をまとめました。
​
**この記事はあくまでも文献の羅列であり、内容自体ではありません。**
ある程度がどの程度なのか人によるとは思いますが、この記事で紹介する文献を最初から当たっていって満足したところで止めると良いのかなと思います！
​
また文献のピックアップの主旨は、数式などの詳細の正確な理解よりもそれぞれの考え方が生まれた動機や経緯、またコミュニティの流れなどに重きを置いています。
​
ちなみに私は何者かというと、AIド初心者です。今回の学習で初めて分類器という言葉を知りました。データ分析なども今までほぼほぼ触れていません。
そんな自分から見て分かりやすい文献だけをピックアップしました。
​
# そもそも
​
現代において（非専門家で、AIを使って生産性を上げたい人が）注目するべき「AI」の実態は何かというと、基本的には機械学習です（その中でも主にニューラルネットワーク）。
なので **この記事の内容も機械学習（特にニューラルネットワーク）の理解の道筋になります。**
​
そして、機械学習の入門資料として超おすすめしたいのがこちらの **「真面目なプログラマのためのディープラーニング入門」** です。
説明の詳細度が本当に絶妙で、難しすぎずそれでいて曖昧すぎずにしっかり必要な要素を理解していける内容になっています。本当にありがとうございます。

https://euske.github.io/introdl/

このサイトを軸に、補足として有効な別のサイトを、それぞれ読む順番で紹介していきます。
​
# [1] 数分で理解する
​
まずこのサイトの「[超要約](https://euske.github.io/introdl/summary.html)」を読むと数分で本当にざっくりAIとは何かをなぞることができます。

https://euske.github.io/introdl/summary.html

​
# [2] 少し突っ込んだ内容に入ってみる
​
超要約でまだ足りないと思うなら、本編を読み始めましょう。
機械学習について、まずは「[第2回 機械が「学習する」とはどういうことか?](https://euske.github.io/introdl/lec2/index.html)」から。

https://euske.github.io/introdl/lec2/index.html

​
（この記事では、第5回までを対象とさせていただきます。第6回は実装の話がメインで、第7回、第8回はかなり詳細に踏み込んでいるためです。）
​
## ニューラルネットワークとは
​
さて、第3回でニューラルネットワークが出てきますが、第3回を読む前にこちらを読むと理解がかなり進みます。

https://cogmo.iact.co.jp/blog/introduction-ai

​
こちらの「第 2 章　脳」からがニューラルネットワークの説明になっています。
AIそのものの説明もとても分かりやすいのと同時に、ニューラルネットワークの説明が（自分がググった範囲では）一番分かりやすかったです。
​
これを読んだら「[第3回 なぜニューラルネットワークで学習できるのか?](https://euske.github.io/introdl/lec3/index.html)」へ。
​
### [もっと知りたい人向け]活性化関数について参考資料
​
簡単に歴史的経緯に触れながら全容を説明してくれてありがたい↓

https://atmarkit.itmedia.co.jp/ait/articles/2003/26/news012.html

​
図とアニメーションが綺麗で分かりやすい↓

https://zenn.dev/nekoallergy/articles/4e224b57a97af9

​
実際のグラフを描写しながらそれぞれの関数がどんなものなのか分かる↓
TensorFlowのコードサンプルもあるので実装のイメージが掴みやすい。

https://zero2one.jp/learningblog/deep-learning-activation-function/


​
## 第4回 ディープラーニングへの入り口: MNIST
​
[第4回 ディープラーニングへの入り口: MNIST](https://euske.github.io/introdl/lec4/index.html)はニューラルネットワークの最適化手法の中でも根幹となる確率的勾配降下法（SGD）の解説です。
​
この辺りから実装の話が入って少しややこしくなってくるのでポイントを要約します。
​
- ニューラルネットワークの学習の目的は、無数にある答えの中からより適した答えを見つけること。
- 現代のニューラルネットワークでは、その方法（＝最適化手法）として **「勾配降下法」** が使われている。
  - 勾配降下法は、全データに対して一度に処理を行うと非常に時間がかかってしまう。
- そこで実際には、訓練データを複数のミニバッチに分割し、ミニバッチごとに結果を更新していく **「確率的勾配降下法（SGD）」** （あるいはその派生）が使われる。
  - （確率的勾配降下法が使われる理由については下で追記）
  - ミニバッチを使って全訓練データを1周学習するプロセスのことを **「エポック」** と呼び、実際にはこれを複数回繰り返す。
- 基本的にはエポックを増やすとモデルはより正確になるが、ある回数を超えると徐々に用意した訓練データにだけ最適化されるようになり、本番でモデルが期待しない結果を返すことが増える。これを **「過学習」** と呼ぶ。
​
​
### [もっと知りたい人向け]最適化手法について参考資料
​
「真面目なプログラマーのための〜〜〜」でシンプルに解説されていた最適化手法について、より詳しくそれぞれの生まれた理由から解説されていて分かりやすい↓

https://qiita.com/omiita/items/1735c1d048fe5f611f80

​
個人的にはこちら↑の記事で「確率的勾配降下法がなぜ確率を取り入れているのか」という点について理解が深まり大変ありがたいです。
簡単にまとめると：
​
- **純粋な勾配降下法で処理していると「最初に見つかった、微分した値がゼロになるポイント」で（本当はもっと損失を下げられるのに）学習が終了してしまうことがある。**
  - つまり、損失関数のグラフ上で複数の谷がある場合に、深さが浅い方（＝損失が大きい方）の谷で学習が終わってしまう可能性がある。
- 仮にそうなってしまった場合、同じ訓練データを同じ順番で学習していくとこの最初の谷で必ず学習が終わり、それ以外のより深い谷を見つけることができない。
- そこで**直前に処理したデータとは全く関係のない（＝ランダムな）データをピックアップすることで、より深い谷（損失が低い点）を見つけられる可能性が高まる。**
​
という理解をしました。
​
​
SGDからADAMに至るまでの流れが簡潔に解説されていて分かりやすい↓
かつ参考文献として挙げられているページもコミュニティの方々の動きを垣間見る上で非常に参考になります。

https://qiita.com/Fumio-eisan/items/798351e4915e4ba396c2

​
## 第5回 画像処理に適したニューラルネットワークとは?
​
[第5回](https://euske.github.io/introdl/lec5/index.html)からは畳み込みニューラルネットワークの解説になります。
​
ここに関しては先に以下のサイトを読むと理解が進みやすいです。
​
↓どういう発想で畳み込みニューラルネットワークが考案されているかから仕組みまでが非常に分かりやすいです。

https://zero2one.jp/learningblog/cnn-for-beginners/

​
↓次にこちらのページの「視覚認識と畳み込み ネットワーク」の章を読むとさらにイメージが具体的になります。

https://www.imagazine.co.jp/%E7%95%B3%E3%81%BF%E8%BE%BC%E3%81%BF%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E3%80%8C%E5%9F%BA%E7%A4%8E%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%80%8D%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99/

​
## ニューラルネットワークの曖昧さについて
​
[おわりに - なぜ機械学習はうさん臭く感じられるのか?](https://euske.github.io/introdl/epilogue.html)では、ニューラルネットワークの曖昧さ、不確実さについて語られていてニューラルネットワークに対する認識をまた違った角度から深めることができます。
​
# [3] 前提知識から詳しく
​
ここまででかなり大筋は理解できたはずです。
とりあえず居酒屋で何も知らない人に説明して知ってる感を出せます（）
​
それでももっと詳細について学びたいのであれば...

https://tutorials.chainer.org/ja/

​
こちらのChainer（Pythonの機械学習のフレームワーク）のチュートリアルがかなり充実していて、学術的に解像度がさらに高まります。
最初からここを読むと挫折しそうな詳細度ですが、「真面目なプログラマのための~~~」を読んで概要を理解した状態であれば立ち向かえると思います。
​
同時に、 **機械学習を勉強する上で必要な数学とデータ分析の基礎を解説してくれている** ので、効率良く前提知識を強化し理解を深められます。
​
1〜7章が数学とデータ分析の基礎知識です。
8〜12は主にPythonの実装の話なのでスキップ。
​
ニューラルネットワークについては「[13. ニューラルネットワークの基礎](https://tutorials.chainer.org/ja/13_Basics_of_Neural_Networks.html)」へ。

https://tutorials.chainer.org/ja/13_Basics_of_Neural_Networks.html

​
14章以降はChainerの実装の話なのでここまでで良いかも。
​
​
# おしまい
​
という感じで、以上が自分が理解ゼロから読み進めていった素晴らしいネット上の文献でした。著者の皆様に改めてお礼申し上げます。ありがとうございます。

今まで全く理解していなかったニューラルネットワークの原理をかなり理解できました。
​
書籍としてはオラクル本の「ゼロから作るDeep Learning」がとっても良さそうなので、さらにしっかりと身につけたいタイミングで読んでみようと思いました。

https://www.amazon.co.jp//dp/4873117585

​
他にもこれを読むと良いよ！これも分かりやすいよ！みたいなのがあれば教えてください！
それでは〜