损失函数是表示深究网络性能的“恶劣程度”的指标,即当前的神经网络对监督数据在多大程度上拟合,在多大程度上是不一致
均方差
E
=
1
/
2
∑
k
(
y
k
?
t
k
)
2
E = 1/2\sum_{k}(y_k - t_k)^2
E=1/2k∑?(yk??tk?)2 yk表示神经网络的输出,tk表示监督数据,k表示数据的维度
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,0]
数组元的索引从第一个开始依次对应的数字“0”,“1”,“2”,…。这里的y是神经网络的输出ysoftmax函数的输出。上述的列子可以表达“0”的概率是0.1,“1”的概率是0.05,“2”的概率是0.6。t是监督数据,将正确解的标签是1,其他的均为0 代码实现:
def mean_squared_error(y,t):
return 0.5 * np.sum(y-t)**2
交叉熵误差
E
=
?
∑
k
(
t
k
l
o
g
y
k
)
E = -\sum_{k}(t_k logy_k)
E=?k∑?(tk?logyk?) 这里的log表示以e为底的自然对数(loge) 代码实现:
def cross_entropy_error(y,t):
dalta = le-7
return -np.sum(t * np.log(y+delta))
这里加上一个微小值delta,是因为np.log(0)时,会出现np.log(0)为负无穷大-inf,导致后面的结果无法运行
mini-batch
神经网络的学习是通过从训练集中选出一批数据(称为mini-batch,小批量),然后在对每一个mini-batch进行学习。比如,从60000个训练数据中随机选择100笔,在对100笔数据进行学习。
mini-batch版交叉熵误差
改良一下之前实现对应单数据的交叉熵误差。
def cross_entropy_error(y,t):
if y.ndim == 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 + le-7)) / batch_size
此外当监督数据是标签形式(非one-hot表示,而是像“2”,“7”这样的标签时),使用下面代码实现
def cross_entropy_error(y,t):
if y.ndim == 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]+le-7) / batch_size
|