本文へスキップ
ひもとくAI

まとめ・ミニプロジェクト:手書き数字を見分ける

レッスン 6/6

この章の振り返り

この章では、ディープラーニングの土台であるニューラルネットワークを、部品から組み立てて理解しました。

  1. ニューロン は「内積+バイアス → 活性化関数」の計算部品。シグモイド関数を使えばロジスティック回帰と同じ
  2. 層を重ねる と、1本の直線では分けられないデータ(XOR)も分けられる。ただし層の間に活性化関数が必要(一次関数を重ねても一次関数のまま)
  3. 順伝播 は「前の層の出力 @ 重み + バイアス → 活性化関数」の繰り返し
  4. 学習 は第4章と同じく、損失を勾配降下法で小さくすること。誤差逆伝播 は、変化の割合を後ろから掛け算でつなぎ、全部の重みの勾配を効率よく求める方法
  5. MLPClassifier で、いつもの fit → predict の流れでニューラルネットワークを使える

第1章で「AIとは、入力 xx から出力 yy を計算する ff をどう作るかという話」と説明しました。ニューラルネットワークは、たくさんのニューロンを層として重ねることで、非常に複雑な ff を表現し、その中身(重み)をデータから自動で見つける方法です。

振り返ると、この章で使った数学は、一次関数、内積、変化の割合、割合の掛け算と、どれもこのコースで一歩ずつ学んできたものでした。ディープラーニングは、決して手の届かない魔法ではありません。

ミニプロジェクト:手書きの数字を見分ける

最後に、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)

次の演習では、これまでの章で学んだ流れを組み合わせます。

  1. 前処理: 0〜16の値を16で割って、0〜1の範囲にそろえる(値の大きさをそろえると学習が安定する)
  2. 分割: 訓練データとテストデータに分ける
  3. 学習: MLPClassifier(隠れ層32個)を訓練データで学習させる
  4. 評価: テストデータで正解率を測る

この設定で学習させると、訓練データでの正解率は約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

演習

演習を読み込んでいます…