本文正在参加「金石计划 . 瓜分6万现金大奖」

前言

在任何深度学习项目中,装备丢失函数都是保证模型以预期方法作业的最重要步骤之一。 丢失函数可认为神经网络供给许多有用的灵活性,它将界说网络输出与网络其余部分的衔接方法。

神经网络能够执行多种使命,从猜测接连值(如每月开销)到对离散类别(如猫和狗)进行分类。 每个不同的使命将需求不同的丢失类型,由于输出格局将不同。 具体使命将界说不同的丢失函数。

接下来博主会详尽解说常见的丢失函数,并结合代码使之更简略了解;

介绍

丢失函数(loss function)是用来估量你模型的猜测值 f(x)f(x) 与实在值 YY 的不一致程度,它是一个非负实值函数,一般运用 L(Y,f(x))L(Y, f(x)) 来表明,丢失函数越小,模型的鲁棒性就越好。丢失函数是经历危险函数的核心部分,也是结构危险函数重要组成部分。模型的结构危险函数包括了经历危险项和正则项,一般能够表明成如下式子:

【AI】浅谈损失函数

其间,前面的均值函数表明的是经历危险函数,LL 代表的是丢失函数,后边的 是正则化项(regularizer)或许叫惩罚项(penalty term),它能够是 L1L1,也能够是 L2L2,或许其他的正则函数。整个式子表明的意思是找到使方针函数最小时的 值。

从十分简化的视点来看,丢失函数(J)能够界说为具有两个参数的函数:

  1. 猜测输出;
  2. 实践输出。

【AI】浅谈损失函数

怎么运用丢失函数呢?具体步骤:

  1. 用随机值初始化前向核算公式的参数;
  2. 代入样本,核算输出的猜测值;
  3. 用丢失函数核算猜测值和标签值(实在值)的差错;
  4. 依据丢失函数的导数,沿梯度最小方向将差错回传,修正前向核算公式中的各个权重值;
  5. 进入第2步重复,直到丢失函数值到达一个满足的值就中止迭代。

分类丢失

当神经网络企图猜测离散值时,咱们能够将其视为分类模型。 这或许是网络企图猜测图像中存在哪种动物,或许电子邮件是否为垃圾邮件。 首要,让咱们看看分类神经网络的输出表明方法。

【AI】浅谈损失函数

输出层的节点数将取决于数据中存在的类数。 每个节点将代表一个类。 每个输出节点的值本质上表明该类别为正确类别的概率。

Pr(Class 1) = Probability of Class 1 being the correct class

一旦取得一切不同类别的概率,咱们就将具有最高概率的类别视为该实例的猜测类别。 首要,让咱们探讨怎么进行二进制分类。

二进制分类

在二进制分类中,即使咱们将在两个类之间进行猜测,在输出层中也将只要一个节点。 为了取得概率格局的输出,咱们需求运用一个激活函数。 由于概率要求取0到1之间的值,因而咱们将运用S型函数,该函数能够将任何实践值紧缩为0到1之间的值。

【AI】浅谈损失函数

Sigmoid(x)=11+e−x=ex1+exSigmoid(x) = \frac{1}{1+e^{-x}} = \frac{e^x}{1+e^x}

随着 SigmoidSigmoid 的输入变大并趋向于无穷大,SigmoidSigmoid 的输出趋向于1。随着 SigmoidSigmoid 的输入变小而趋向于负无穷大,输出将趋于0。现在咱们保证总会得到 一个介于0到1之间的值,这正是咱们需求的值,由于咱们需求概率。

依据公式编写 SigmoidSigmoid 函数:

def sigmoid(x):
    s = 1 / (1 + np.exp(-x))
    return s

咱们用于二进制分类的丢失函数称为二进制穿插熵(BCE)。 该功能有效地惩罚了用于二进制分类使命的神经网络。

【AI】浅谈损失函数

咱们能够在数学上将整个丢失函数表明为一个方程式,如下所示:

Loss=(Y)(−log⁡(Ypred))+(1−Y)(−log⁡(1−Ypred))Loss = (Y)(-\log(Y_{pred}))+(1-Y)(-\log(1-Y_{pred}))

此丢失函数也称为对数丢失。 这便是为二进制分类神经网络规划丢失函数的方法。 现在,让咱们继续来看怎么为多类别分类网络界说丢失。

多类别分类

当咱们需求咱们的模型每次猜测一个或许的类输出时,多类分类是适宜的。 现在,由于咱们仍在处理概率,因而仅将 sigmoidsigmoid 运用于一切输出节点或许有意义,以便咱们为一切输出取得介于0–1之间的值,但这是有问题的。 在考虑多个类别的概率时,咱们需求保证一切单个概率的总和等于1,由于这是界说概率的方法。 运用 SS 形不能保证总和一直等于1,因而咱们需求运用另一个激活函数。

【AI】浅谈损失函数

Softmax(yi)=eyi∑i=0neyiSoftmax(y_i) = \frac{e^{y_i}}{\sum^n_{i=0}e^{y_i}}

依据公式编写 SoftmaxSoftmax 函数:

import numpy as np
def softmax(x):
    # 核算每行的最大值
    row_max = np.max(x)
    # 每行元素都需求减去对应的最大值,否则求 exp(x) 会溢出,导致 inf 状况
    x = x - row_max
    # 核算 e 的指数次幂
    x_exp = np.exp(x)
    x_sum = np.sum(x_exp)
    s = x_exp / x_sum
    return s
softmax(np.array([[3, 0.8, 0.96]]))
# array([[0.80591096, 0.08929748, 0.10479156]])

如图所示,咱们仅仅将一切值传递给指数函数。 之后,要保证它们都在0–1的范围内,并保证一切输出值的总和等于1,咱们只需将每个指数除以一切指数的总和即可。

那么,为什么在归一化每个值之前有必要将它们传递给指数呢? 为什么咱们不能仅将值本身标准化? 这是由于 softmaxsoftmax 的方针是保证一个值十分高(挨近1),而一切其他值都十分低(挨近0)。 Softmax运用指数来保证发生这种状况。 然后咱们在归一化,由于咱们需求概率。

这种丢失称为分类穿插熵。 现在,让咱们进入一种称为多标签分类的特殊分类状况。

多标签分类

当模型需求猜测多个类别作为输出时,便完成了多标签分类。 例如,假定您正在训练神经网络,以猜测某些食物图片中的成分。 咱们需求猜测多种成分,因而 YY 中会有多个1。

为此,咱们不能运用 softmaxsoftmax,由于 softmaxsoftmax 一直只会迫使一个类别变为1,而其他类别变为0。因而,由于咱们企图猜测每个类别的个体概率,因而能够简略地在一切输出节点值上坚持 sigmoidsigmoid

至于丢失,咱们能够直接在每个节点上运用对数丢失进行求和,类似于在多类分类中所做的。

已然咱们已经介绍了分类,现在让咱们介绍回归丢失函数。

回归丢失

在回归中,咱们的模型正在尝试猜测接连值。 回归模型的一些示例是:

  • 房价猜测
  • 年纪猜测

在回归模型中,咱们的神经网络将为每个咱们企图猜测的接连值供给一个输出节点。 经过在输出值和实在值之间进行直接比较来核算回归丢失。

咱们用于回归模型的最流行的丢失函数是均方差错丢失函数。 在此,咱们仅核算 YYYpredY_{pred} 之差的平方,并对一切数据求平均值。 假定有 nn 个数据点:

Loss=1n∗∑i=0n(Yi−Ypredi)2Loss = \frac{1}{n}*\sum^n_{i=0}(Y_i-Y_{pred_i})^2

在这里,YiY_iYprediY_{pred_i} 指的是数据集中第 iiYY 值,以及来自神经网络的相同数据的相应 YpredY_{pred}

依据公式编写 MSEMSE 函数:

def mean_squared_error(y_true, y_pred):
    sq_error = (y_pred - y_true) ** 2
    sum_sq_error = np.sum(sq_error)
    mse = sum_sq_error / y_true.size
    return mse
y_true = [[0, 0, 1], [0, 1, 0], [1, 0, 0]] 
y_pred = [[0.3, 0.3, 0.4], [0.3, 0.4, 0.3], [0.1, 0.2, 0.7]] 
mean_squared_error(np.array(y_pred), np.array(y_true))
# 0.2688888888888889

实战

咱们期望依据图片动物的轮廓、颜色等特征,来猜测动物的类别,有三种可猜测类别:猫、狗、猪。假定咱们当时有两个模型(参数不同),这两个模型都是经过 sigmoidsigmoid / softmaxsoftmax 的方法得到关于每个猜测结果的概率值:

模型1

猜测 实在 是否正确
0.3 0.3 0.4 0 0 1 (猪) 正确
0.3 0.4 0.3 0 1 0 (狗) 正确
0.1 0.2 0.7 1 0 0 (猫) 过错

模型2

猜测 实在 是否正确
0.1 0.2 0.7 0 0 1 (猪) 正确
0.1 0.7 0.2 0 1 0 (狗) 正确
0.3 0.4 0.3 1 0 0 (猫) 过错
  • 模型1关于样本1和样本2以十分微弱的优势判别正确,关于样本3的判别则完全过错。
  • 模型2关于样本1和样本2判别十分精确,关于样本3判别过错,但是相对来说没有错得太离谱。

有了模型之后,咱们需求经过界说丢失函数来判别模型在样本上的体现:


分类丢失

模型1:

sample1Loss=−(0log⁡0.3+0log⁡0.3+1log⁡0.4)=0.91sample2Loss=−(0log⁡0.3+1log⁡0.4+0log⁡0.3)=0.91sample3Loss=−(1log⁡0.1+0log⁡0.2+0log⁡0.7)=2.30L=0.91+0.91+2.33=1.37sample1 \quad Loss = -(0\times\log0.3+0\times\log0.3+1\times\log0.4) = 0.91\\ sample2 \quad Loss = -(0\times\log0.3+1\times\log0.4+0\times\log0.3) = 0.91\\ sample3 \quad Loss = -(1\times\log0.1+0\times\log0.2+0\times\log0.7) = 2.30\\ \quad \\ L = \frac{0.91+0.91+2.3}{3}=1.37

模型2:

sample1Loss=−(0log⁡0.1+0log⁡0.2+1log⁡0.7)=0.35sample2Loss=−(0log⁡0.1+1log⁡0.7+0log⁡0.2)=0.35sample3Loss=−(1log⁡0.3+0log⁡0.4+0log⁡0.4)=1.20L=0.35+0.35+1.23=0.63sample1 \quad Loss = -(0\times\log0.1+0\times\log0.2+1\times\log0.7) = 0.35\\ sample2 \quad Loss = -(0\times\log0.1+1\times\log0.7+0\times\log0.2) = 0.35\\ sample3 \quad Loss = -(1\times\log0.3+0\times\log0.4+0\times\log0.4) = 1.20\\ \quad \\ L = \frac{0.35+0.35+1.2}{3}=0.63
from sklearn.metrics import log_loss
y_true = [[0, 0, 1], [0, 1, 0], [1, 0, 0]] 
y_pred_1 = [[0.3, 0.3, 0.4], [0.3, 0.4, 0.3], [0.1, 0.2, 0.7]] 
y_pred_2 = [[0.1, 0.2, 0.7], [0.1, 0.7, 0.2], [0.3, 0.4, 0.3]] 
print(log_loss(y_true, y_pred_1)) 
print(log_loss(y_true, y_pred_2)) 

【AI】浅谈损失函数


回归丢失

模型1:

sample1Loss=(0.3−0)2+(0.3−0)2+(0.4−1)23=0.18sample2Loss=(0.3−0)2+(0.4−1)2+(0.3−0)23=0.18sample3Loss=(0.1−1)2+(0.2−0)2+(0.7−0)23=0.45L=0.18+0.18+0.453=0.27sample1 \quad Loss = \frac{(0.3-0)^2 + (0.3-0)^2 + (0.4-1)^2}{3} = 0.18\\ sample2 \quad Loss = \frac{(0.3-0)^2 + (0.4-1)^2 + (0.3-0)^2}{3} = 0.18\\ sample3 \quad Loss = \frac{(0.1-1)^2 + (0.2-0)^2 + (0.7-0)^2}{3} = 0.45\\ \quad \\ L = \frac{0.18+0.18+0.45}{3}=0.27

模型2:

sample1Loss=(0.1−0)2+(0.2−0)2+(0.7−1)23=0.05sample2Loss=(0.1−0)2+(0.7−1)2+(0.2−0)23=0.05sample3Loss=(0.3−1)2+(0.4−0)2+(0.3−0)23=0.25L=0.05+0.05+0.253=0.11sample1 \quad Loss = \frac{(0.1-0)^2 + (0.2-0)^2 + (0.7-1)^2}{3} = 0.05\\ sample2 \quad Loss = \frac{(0.1-0)^2 + (0.7-1)^2 + (0.2-0)^2}{3} = 0.05\\ sample3 \quad Loss = \frac{(0.3-1)^2 + (0.4-0)^2 + (0.3-0)^2}{3} = 0.25\\ \quad \\ L = \frac{0.05+0.05+0.25}{3}=0.11
from sklearn.metrics import mean_squared_error
y_true = [[0, 0, 1], [0, 1, 0], [1, 0, 0]] 
y_pred_1 = [[0.3, 0.3, 0.4], [0.3, 0.4, 0.3], [0.1, 0.2, 0.7]] 
y_pred_2 = [[0.1, 0.2, 0.7], [0.1, 0.7, 0.2], [0.3, 0.4, 0.3]] 
print("模型1:", mean_squared_error(y_true, y_pred_1))
print("模型2:", mean_squared_error(y_true, y_pred_2))

【AI】浅谈损失函数


不难发现,不同的丢失函数对模型的体现反应是不同的,因而,在实践场景中,要依据实在需求挑选丢失函数!

后记

以上便是 浅谈丢失函数 的全部内容了,介绍了丢失函数的概念以及常用的丢失函数,经过图文与代码结合,详尽地讲述了丢失函数的关键,期望大家有所收获!

上篇精讲:【AI】浅析歹意文件静态检测及部分问题解决思路

我是,期待你的关注;

创造不易,请多多支持;

系列专栏:AI