この度DeepLearningの勉強を始めました。
記念すべき1冊目は『ゼロから作るDeepLearning』という名著中の名著を選んだのですが、それでも初学者の私にはすぐに理解できない点が多くあったのでメモとして残しておこうと思います。
筆者のプロフィール
社会的属性:文系大学生4年
プログラミング経験:Java(Spring boot)2年, Flutter(1年)
WebアプリとNativeアプリ双方の制作経験あり
機械学習経験は初めて
4.2.4 【バッチ対応版】交差エントロピー誤差の実装
疑問点:教師データがラベルとして与えられた時の交差エントロピー誤差の中身なんかおかしくない?
one-hotの場合
def cross_entropy_error(y, t):
if y.dim == 1:
t = t.reshape(1, t.size)
y = y.reshape(1, y.size)
batch_size = y.shape[0]
return -np.sum(t * np.log(y + 1e-7)) / batch_size
not one-hotの場合(問題の関数)
def cross_entropy_error(y, t):
if y.dim == 1:
t = t.reshape(1, t.size)
y = y.reshape(1, y.size)
batch_size = y.shape[0]
return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7) / batch_size
これを見た時、「?????」となりました。
one-hot形式の関数(以下「oh関数」)とnot one-hot形式の関数(以下「noh関数」)は出力が違うと思ったのです。
というのも、oh関数の場合はsoftmax関数の出力であるyのlogにtをかけています。
一方でnoh関数の場合は、単にlogyを足しているに過ぎないため、「t倍されてないじゃん!!!」と思ったからです。
結論から言うと、tは0または1のみなので、t倍した結果は0かyの値そのままなんですね。
t倍する意味は正解を選ぶ確率y[i](iは正解のインデックス)を抽出するためなので、noh関数の場合はt倍する必要がなかったんですね。
その代わりnoh関数では、正解を選ぶ確率を抽出するために[(), t]としているんですね。
全部本に書かれているのですが、理解力のない私は理解するのに時間がかかりました。
4.2.5 なぜ損失関数を設定するのか?
疑問点:できるだけ小さな損失関数の場所を探すなら最小値を計算して求めれば良くない?
この疑問はナンセンスすぎますね。
DeepLearning以前の問題で、高校数学で高次元関数の最小値問題をきちんと解いておけばこんなこと思わないわけです。
でも筆者は疑問に感じてしまいました。
なぜ最小値を計算して出さないのか、それは出せない(出すのが難しい)からですね。
そこで、できるだけ最小の値を探す手がかりとして登場するのが勾配なわけです。
大変恥ずかしいことではありますが、これを理解するのに時間がかかりました。
##さいごに
ここまで読んでいただきありがとうございました。
今では筆者が完全に理解しているような書きぶりですが、いまだに1割も理解できていないと思います。
誤っている点等あれば是非教えていただければと思います。
また、理解が難しい点が見つかり次第追記していきたいと思います。
それでは、Good DeepLearning!