この章の振り返り
この章では、ディープラーニングの土台であるニューラルネットワークを、部品から組み立てて理解しました。
- ニューロン は「内積+バイアス → 活性化関数」の計算部品。シグモイド関数を使えばロジスティック回帰と同じ
- 層を重ねる と、1本の直線では分けられないデータ(XOR)も分けられる。ただし層の間に活性化関数が必要(一次関数を重ねても一次関数のまま)
- 順伝播 は「前の層の出力
@ 重み + バイアス → 活性化関数」の繰り返し
- 学習 は第4章と同じく、損失を勾配降下法で小さくすること。誤差逆伝播 は、変化の割合を後ろから掛け算でつなぎ、全部の重みの勾配を効率よく求める方法
MLPClassifier で、いつもの fit → predict の流れでニューラルネットワークを使える
第1章で「AIとは、入力 x から出力 y を計算する f をどう作るかという話」と説明しました。ニューラルネットワークは、たくさんのニューロンを層として重ねることで、非常に複雑な f を表現し、その中身(重み)をデータから自動で見つける方法です。
振り返ると、この章で使った数学は、一次関数、内積、変化の割合、割合の掛け算と、どれもこのコースで一歩ずつ学んできたものでした。ディープラーニングは、決して手の届かない魔法ではありません。
ミニプロジェクト:手書きの数字を見分ける
最後に、scikit-learnに付属している手書き数字のデータで、ニューラルネットワークを学習させます。第5章の最初のレッスンで「手書き数字の認識は、0〜9の10クラスから1つを選ぶ分類」だと説明した、まさにその問題です。
このデータには、1797枚の手書き数字の画像が入っています。1枚の画像は8×8のマス目に区切られ、各マスの濃さが0〜16の数値で表されているので、1枚は 64個の数値の並び(ベクトル) になります。
from sklearn.datasets import load_digits
data = load_digits()
data.data.shape # → (1797, 64): 1797枚 × 64マス
data.target[:5] # → 正解の数字(0〜9)
次の演習では、これまでの章で学んだ流れを組み合わせます。
- 前処理: 0〜16の値を16で割って、0〜1の範囲にそろえる(値の大きさをそろえると学習が安定する)
- 分割: 訓練データとテストデータに分ける
- 学習:
MLPClassifier(隠れ層32個)を訓練データで学習させる
- 評価: テストデータで正解率を測る
この設定で学習させると、訓練データでの正解率は約0.98、テストデータでの正解率は約0.96になります。学習に一度も使っていない手書き数字の、約96%を正しく読み取れるということです。
このレッスンを終えると、教材のStage5(ニューラルネットワークの仕組み)が完了となります。お疲れ様でした。
出典: Alpaydin, E. & Kaynak, C. (1998). Optical Recognition of Handwritten Digits [Dataset]. UCI Machine Learning Repository. https://doi.org/10.24432/C50P49 ライセンス: CC BY 4.0