逆伝播の実装
逆伝播の実装について、以前、加算ノードと乗算ノードについて書きました。 https://engineernoi.hatenablog.com/entry/2023/06/17/131707
今回はソフトマックス関数とクロスエントロピー誤差関数の実装です。
ソフトマックス関数とクロスエントロピー誤差関数
ソフトマックス関数とクロスエントロピー誤差関数はセットで使われることが多いので、まとめて考えます。 クロスエントロピー関数から逆伝搬の方向には矢印がありますが、式は書いていません。この部分を計算すると非常に厄介になってしまい、ソフトマックス関数とクロスエントロピー誤差関数をまとめて考えると、中間の計算を省略できるのでシンプルに実装ができます。
class SoftmaxLoss: def __init__(self): self.loss = None self.y = None self.t = None def forward(self, x, t): self.t = t self.y = softmax(x) self.loss = cross_entropy_error(self.y, self.t) return self.loss def backward(self, dout=1): batch_size = self.t.shape[0] dx = (self.y - self.t) / batch_size return dx
バッチサイズの取り扱い
ここで注意が必要なのはバッチサイズで割ることです。計算ノードではバッチサイズ分だけ腕が増えることになります。そのため、バッチサイズで割る必要があります。