-Python- 2乗和誤差(mean squared error)と交差エントロピー誤差(cross entropy error)

損失関数*として用いられる関数にはいくつかありますが,最も有名なものは2乗和誤差(mean squared error)です.2乗和誤差は以下の数式で表されます.

f:id:HidehikoMURAO:20190102223951p:plain

深層学習では,ykニューラルネットワークの出力,tkは教師データを表し,kは次元数を表します.上記の式を実装すると以下のようになります(y と t はとりあえずの仮定です).

# Import Module
import numpy as np
 
# Definition of Function
def mean_squared_error(y, t): 
    return 0.5 * np.sum*1
 
# Display results
 
print(E)


実行結果は以下のようになります.

0.09750000000000003
 

2乗和誤差と別の損失関数として交差エントロピー誤差(cross entropy error)もよく用いられます.交差エントロピー誤差は下式で表されます.

f:id:HidehikoMURAO:20190102224039p:plain

上式で,log は底が e の自然対数を表します.ykとtkは,上記の例と同じです.
実装例は以下のようになります.

 
# Import Module
import numpy as np
 
# Definition of Function
def cross_entropy_error(y, t): 
    delta = 1e-7
    return -np.sum(t * np.log(y + delta))
 
# Data setting
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
 
# Solving problem
E = cross_entropy_error(np.array(y), np.array(t))
 
# Display results
 
print(E)
 

実装においては,np.logの計算時に微小な値であるdeltaを足して計算を行っています.これは,np.log(0)のような計算が発生した場合,np.log(0)はマイナス無限大を表すinf となりそうなると計算が進められなくなるので,その防止策として,微小な値を追加してマイナス無限大を発生させないようにしています.

実行結果は以下のようになります.

0.510825457099338
 


* 損失関数(loss function):ニューラルネットワークの学習において,性能の「悪さ」を示す指標.ニューラルネットワークが教師データに対してどれだけ適合していないのか,教師データに対してどれだけ一致していないかを表す.損失関数にマイナスを掛けた値は「どれだけ性能が良いか」という指標として解釈ができます.また,「性能の悪さを最小にすること」と「性能の良さを最大にすること」は同じなので,性能の「悪さ」と「良さ」を指標にしても本質的に行うことは同じになります.

*1:y - t)**2)

 
# Data setting
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
 
# Solving problem
E = mean_squared_error(np.array(y), np.array(t