ニューラルネットワークのゼロからの実装
個人的な学習として、NumPyでニューラルネットワークの主要な部品をゼロから実装したリポジトリです。高水準の深層学習ライブラリから使うことではなく、各部品の内部の計算を自分で書いて理解することが目的です。斎藤康毅『ゼロから作るDeep Learning ― Pythonで学ぶディープラーニングの理論と実装』第1巻の学習テーマを参考にしていますが、書籍と公式リポジトリのコードは使っていません。
数値計算の土台にはNumPyを使い、配列の保持、行列積、要素ごとの演算、集約、reshape、乱数などを任せています。層、損失関数、最適化、学習ループは自前です。PyTorchなどのフレームワークは、ネットワーク本体の実装と学習には使っていません。
層
Linear、ReLU、Sigmoid、Flatten、Conv2D、MaxPooling2D、Dropout、BatchNormalization、Sequentialを実装しました。各層は順伝播と逆伝播を持ちます。Conv2Dはstrideとpaddingを含む二次元畳み込みです。MaxPooling2Dは窓の中の最大値と、それに対応する逆伝播です。Sequentialで層をつなぎ、MLPとCNNを組み立てます。
損失と最適化
損失はMeanSquaredError、CrossEntropy、BCEWithLogitsです。forwardで損失を計算し、backwardで入力への勾配を計算します。数値的に不安定になりやすい箇所は、可能な範囲で安定する形にしています。
最適化はSGD、Momentum、AdaGrad、Adamです。Adamはfirst moment、second moment、bias correctionを含む更新です。DataLoaderでミニバッチを作り、Trainerでモデル、損失、最適化、DataLoaderをつないだ学習ループを、ネットワーク本体から分けています。
テスト
正しさは、データセット上の精度だけでは見ていません。既知の入力について順伝播が期待値と一致すること、逆伝播の勾配(入力、重み、バイアス)が期待値と一致すること、forwardとbackwardでshapeが保たれることをテストしています。畳み込みとプーリングでは、矩形のカーネル、異なるstrideとpadding、重なる領域、多チャンネル入力も見ています。単純な入力は手計算か、独立した参照計算と比べます。PyTorchなどは、自作の数値を照合する参照としてだけ使っています。
テストケースの設計とレビューには、検証のためにAIを使いました。ネットワーク本体は、アルゴリズムを理解したうえで実装しています。
学習できることの確認
最適化手法の比較や大規模な学習は対象にしていません。小さなデータで、容量を十分にしたMLPとCNNが訓練データに過学習できることを確認し、データの読み込みから損失、逆伝播、パラメータ更新までが一連で動くことを見ました。部品の実装、テスト、この二つの確認、自動テストの成功まで終えています。
実装とテストは GitHub にあります。
技術スタック
- 言語: Python
- 数値計算: NumPy
- 環境: uv