コンテンツにスキップ

レイヤー・損失・最適化

Layer インターフェース

すべてのレイヤーは同じインターフェースを実装します:

type Layer interface {
    Init(inputCols int, rng *rand.Rand) (outputCols int, err error)
    Forward(input *Matrix) (*Matrix, error)
    Backward(gradOutput *Matrix) (*Matrix, error)
    Grads() (*Matrix, []Float)
    Params() (*Matrix, []Float)
    SetParams(weights *Matrix, bias []Float) error
}

InitSequential.Compile が呼び、列数をスタックに通していきます — NewDense(8) が出力幅しか指定しないのはこのためです。レイヤーは順伝播/逆伝播のスクラッチバッファを学習ステップをまたいで再利用するので、GC は学習ループに入り込みません (MLP の 1 ステップは約 29 アロケーション)。Predict は常に新しくアロケートした結果を返します。

レイヤー一覧

レイヤー コンストラクタ 備考
Dense layer.NewDense(outCols) 全結合。Glorot/He スタイルの初期化
Embedding layer.NewEmbedding(vocabSize, dim) 入力行は Float に格納された整数トークン ID。引いたベクトルは行方向に連結
Conv2D layer.NewConv2D(outC, kernel, stride, pad) im2col + Dot カーネル。入力形状は CompileImage から
MaxPool2D layer.NewMaxPool2D(size) 入力形状は CompileImage から
BatchNorm layer.NewBatchNorm() 移動統計量はモデルと一緒に保存されます
LayerNorm layer.NewLayerNorm() 行ごとの正規化
Dropout layer.NewDropout(rate) 学習時のみ有効

Conv2DMaxPool2D は各行をチャンネル優先の画像として扱います: index = (channel*height + y)*width + xDropoutBatchNormFit/FitStep 内では学習時の挙動、Predict 内では推論時の挙動へ自動的に切り替わります。

Embedding は行列のみの API を保っています。各入力行はトークン ID の列で (tensai.NewMatrixFromInts を使うと各 ID が float32 変換で正確に保たれることを検証しながら安全に作れます)、レイヤーは引いた埋め込みベクトルを列方向に連結します。たとえば Compile(4, ...)NewEmbedding(vocab, 8) の組み合わせは、Mx4 のトークン ID 行列を LayerNorm, GELU, Dense に食わせられる Mx32 の密な特徴行列に変えます。

活性化関数

活性化関数もレイヤーです — 他と同じように Add します:

活性化 使い方
ReLU &layer.ReLU{}
LeakyReLU layer.NewLeakyReLU(0.01)
GELU &layer.GELU{} (SIMD ビルドではベクトル化 erf)
Sigmoid &layer.Sigmoid{}
Tanh &layer.Tanh{}
Softmax &layer.Softmax{} (通常は SoftmaxCrossEntropy の方を使います)

損失関数

損失 用途 ターゲット
loss.MeanSquaredError{} 回帰 予測と同じ形状
loss.SoftmaxCrossEntropy{} 多クラス分類 クラス番号の Mx1 行列
loss.BinaryCrossEntropy{} 二値ターゲット 予測と同じ形状

softmax は SoftmaxCrossEntropy内部で適用されます (数値安定性のため行の最大値を引いてから)。モデルの最後は素の Dense で終わり、Predict は生のロジットを返すので、クラスは argmax で取ってください。

オプティマイザ

オプティマイザ コンストラクタ
モーメンタム SGD optim.NewSGD(lr, momentum)
Adam optim.NewAdam(lr)
AdamW optim.NewAdamW(lr, weightDecay) — decoupled weight decay

Optimizer は更新則の設定そのものです。モデルはパラメータ対ごとに optim.Updater を 1 つ受け取り、Updater がその対の状態 (モーメンタムバッファ、Adam のモーメント、ステップ数) を持ちます。カスタムオプティマイザは New() Updater と Updater の Step の 2 つを実装するだけです。Adam/AdamW と SGD の更新は SIMD ビルドで AVX2 ベクトル化されます。

k-NN ベースライン

knn.New(k) は学習不要のベースライン分類器です — Fit はデータを保持するだけで、Predict が距離行列を同じ SIMD matmul カーネルで組み立てます。MNIST の 5000 サンプルサブセットで約 91% (MLP は約 92%、CNN は約 95%) — ネットワークの隣に置く健全性チェックの床として便利です。