Python深度学习基础(四)——损失函数

204 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

前言

在进行深度学习的过程中我们需要有一个评判标准来评价模型,损失函数就是通过比较预测值与真实值的来对模型当前的权值进行评价的

损失函数

均方误差(MSE)

均方误差也被称作最小二乘法,常用于解决回归问题 公式

这里原本的公式应该为 E=1nk(yktk)2E=\frac{1}{n} \sum_k(y_k-t_k)^2 由于n表示的是数据的数量,当数据集选定好了之后这个值就不会改变,所以可以看作一个常数,为了求导的值尽量简单,我们将n替换成了2,代码中将使用下面的公式 E=12k(yktk)2E=\frac{1}{2} \sum_k(y_k-t_k)^2 其中y_k是表示神经网络的输出,t_k表示监督数据,k表示数据的维数。 代码

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

L2范式与闵可夫斯基距离

在深度学习中我们记:x=x2=inxi2L2范式在深度学习中我们记:||x||=||x||_2= \sqrt {\sum_i^nx_i^2}为L2范式 闵可夫斯基距离:D(x,y)=(inxiyip)1p闵可夫斯基距离:D(x, y)=(\sum_i^n|x_i-y_i|^p)^{\frac{1}{p}} 一般可以使用闵可夫斯基距离作为损失函数,通常使用p为1或2的情况。其中当p=1时为曼哈顿距离,p=2时为欧氏距离

交叉熵误差(cross_entropy_error)

交叉熵是均方差损失函数与sigmoid激活函数组合,交叉熵函数可以替代均方差损失函数与sigmoid激活函数组合,从一定程度上降低了梯度下降的可能,常被用于解决互斥多分类问题。 公式

E=ktklogykE=-\sum_kt_klogy_k

其中log表示以e为底数的自然对数(loge)。y_k是神经网络的输出,t_k是正确解标签。

代码

def cross_entropy_error(y, t):
    if y.ndim == 1:
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)
        
    # 监督数据是one-hot-vector的情况下,转换为正确解标签的索引
    if t.size == y.size:
        t = t.argmax(axis=1)
             
    batch_size = y.shape[0]
    return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size

极大似然损失函数(LR)

极大似然损失常被用于多标签不互斥多分类问题 公式 E=k(tklogyk+(1tk)log(1yk))E=-\sum_k(t_klogy_k+(1-tk)log(1-yk)) 极大似然损失函数与交叉熵误差损失函数很相似 两种公式的使用情况

  • 交叉熵损失函数:所有标签满足同一分布,即所有标签取其一(互斥多分类),常在输出层为softmax函数的情况下使用。
  • 极大似然损失函数:每个标签都是一个二项分布,即每个标签都有是或不是两种选择(多标签不互斥多分类),常在输出层为sigmoid函数的情况下使用。

代码

def logistics_regression(y, t):
    if y.ndim == 1:
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)
    batch_size = y.shape[0]
    print(batch_size)
    return -np.sum(y * np.log(t) + (1 - y) * np.log(1 - t)) / batch_size

应用场景总结

交叉熵误差和极大似然损失函数一般用于分类问题,均方误差和闵可夫斯基距离一般用于回归问题,也可以用于分类问题,但效果要比交叉熵误差和极大似然损失差。