#はじめに
この記事はゼロから作るディープラーニング 6章誤差逆伝播法を自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。
#出力層から損失関数までのレイヤ実装
ニューラルネットワークに逆伝播処理を実装するための最後のピースである出力層から損失関数までのレイヤ実装を行いたいと思います。
今回は分類に使うソフトマックス関数から交差エントロピー誤差までのレイヤ実装をしたいと思いますが、この部分は回帰に使う二乗和誤差の時もほとんど同じ実装になるのでこれを参考にすればできるかと思います。
class SoftmaxWithLoss: # ソフトマックス関数+交差エントロピー誤差のレイヤ
def __init__(self):
self.loss = None # 損失関数の値
self.y = None # softmax関数の結果
self.t = None # 教師データ
def forward(self, x, t):
if t.ndim == 1: # 正解データがone-hotじゃない場合は直す
new_t = []
for i in t:
oh = list(np.zeros(10)) # 分類ラベルの数
oh[i] = 1
new_t.append(oh)
t = np.array(new_t)
self.t = t
self.y = softmax_function(x)
self.loss = cross_entropy_errors(self.t, self.y)
return self.loss
def backward(self, dout=1):
batch_size = self.t.shape[0]
dx = (self.y - self.t) / batch_size # バッジに対応するために誤差をデータ数でわる
return dx
順伝播処理では、ソフトマックス関数ではone-hot法の正解データしか使えないので最初にone-hotじゃない正解データだったら、one-hotに直します。
そしてあとは、今まで作成してきたソフトマックス関数や交差エントロピー誤差のメソッドを呼び出して使用します。
逆伝播処理は簡単で、予測データから正解データを引いて誤差を出し、それを総和してそれから平均を出します。
実を言うと、ソフトマックス関数・交差エントロピー誤差と恒等関数・二乗和誤差のような組み合わせになる理由は、逆伝播処理を上のような単純な式で求められるよう調整され二つの関数が作られたからなのです。
そのため最初に言った通り、恒等関数と二乗和誤差の場合も逆伝播処理は上のように実装すれば良いです。