edo1z blog

プログラミングなどに関するブログです

python - 損失関数

ディープラーニングで使う損失関数の、二乗和誤差と交差エントロピー誤差。

二乗和誤差

二乗和誤差は、差の二乗を全部足して2で割る。

def nijowagosa(y, t):
    return 0.5 * np.sum((y - t)**2)

y = np.array([0.2, 0.03, 0.8])
t = np.array([0, 0, 1])

print(nijowagosa(y, t))

交差エントロピー誤差

[mathjax] $$E = -\displaystyle \sum_{k}t_k \log y_k$$

logは底がeの自然対数を表すそうです。np.logでできます。ディープラーニングで使うときは、yが出力で、tが正解ラベルです。正解ラベルは正解を1とし、間違いを0とすると、正解ラベル以外のものは全部0になるので無視できて、-log yになります。間違いのやつ無視していいのかなと思いましたが、間違いのやつを高確率と判断した場合、ソフトマックス関数では正解の確立が低くなるので問題ないのかなと思いました。

def cross_error(y, t):
    delta = 1e-7
    return -np.sum(t * np.log(y + delta))

y = np.array([0.2, 0.03, 0.8])
t = np.array([0, 0, 1])
print(cross_error(y, t))

deltaは、np.log(0)が-infを出すことに対する対策です。超小さい数を加えています。