hinshiba.net

Numpyのみを依存に持つニューラルネットワークの実装

Numpyのみを依存に持つニューラルネットワークの実装

Mnist分類可能で,Protocolによる抽象化とリストによる直感的な構成を可能にしました

技術スタック

概要

NumPyだけで実装したミニマルなニューラルネットワークのライブラリです. 深層学習フレームワークを使わずに順伝播と誤差逆伝播法を一から実装しました.全結合層,ReLUとSoftmaxの活性化関数,交差エントロピー損失,確率的勾配降下法を提供しています.

設計の中心はLayerというProtocolです. 各層はprepare,forward,backward,learnの4つのメソッドを持ち,ネットワークはこれを実装したインスタンスのリストとして定義します.

network: list[Layer] = [
    FullConn(784), Relu(),
    FullConn(400), Relu(),
    FullConn(10), Softmax(),
]
prepare(network, (batch_size, 28 * 28))

推論はリストを先頭から順にforwardし,勾配計算は逆順にbackwardするだけです. 重みの更新も各層のlearnにオプティマイザを渡す形にしており,オプティマイザや損失関数もProtocolで抽象化しているため差し替えが容易です. またprepareでダミーデータを一度流すことで各層の入力次元を確定させる便利機能を有しています.

MNISTの学習では交差エントロピー誤差が約2.45から約0.80まで減少し,学習が機能していることを確認しました. 結果の表示でも依存をNumPyのみに保つため,推論結果の画像は # と . の文字に変換してターミナルに表示しています.

外部リンク