鱼书学习笔记:损失函数
神经网络的学习中所用的指标称为损失函数(loss function)这个损失函数可以使用任意函数,但一般使用均方误差和交叉熵误差等。
损失函数是表示神经网络性能的“恶劣程度”的指标,即当前神经网络对监督数据在多大程度上不拟合,在多大程度上不一致。
均方误差
公式:E=1/2Σ(yk-tk)2
这里,yk表示神经网络的输出,tk表示监督数据,k表示数据的维度。
代码
def mean_squared_error(y, t): return 0.5 * np.sum((y-t)**2)
交叉熵误差
公式:E=-Σktklogyk
这里,log表示以e为底数的自然对数(loge)。yk是神经网络的输出,tk是正确解标签
代码
def cross_entropy_error(y, t): delta = 1e-7 return -np.sum(t * np.log(y + delta))
函数内部在计算np.log时,加上了个微小值delta。这是因为,当出现np.log(0)时,np.log(0)会变为负无限大的-inf,这样一来就会导致后续计算无法进行。作为保护性对策,添加一个微小值可以防止负无限大的发生。
mini-batch交叉熵误差
通常情况下,如果以全部数据为对象求损失函数的和,则计算过程需要花费较长的时间。因此,我们选择从全部数据中选出一部分,作为全部数据的“近似”。神经网络的学习也是从训练数据中选出一批数据(称为mini-batch,小批量),然后对每个mini-batch进行学习。这种学习方式称为mini-batch学习
公式:E=-1/NΣnΣktnklogynk
这里,假设数据有N个,tnk表示第n个数据的第k个元素的值(ynk是神经网络的输出,tnk是监督数据)。通过除以N,可以求单个数据的“平均损失函数”
代码
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 + 1e-7)) / batch_size
当监督数据是标签形式(非one-hot表示,而是像“2”“7”这样的标签)时,交叉熵误差可通过如下代码实现:
def cross_entropy_error: if y.ndim == 1: t = t.reshape(1, t.size) y = y.reshape(1, t.size) batch_size = y.shape[0] return -np.sum(np.log(y[np.arrange(batch_size), t] + 1e-7)) / batch_size