鱼书学习笔记:损失函数

神经网络的学习中所用的指标称为损失函数(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

 

posted @ 2021-03-26 13:44  剑伟  阅读(172)  评论(0编辑  收藏  举报