本文正在参加「金石计划 . 瓜分6万现金大奖」
前言
在任何深度学习项目中,装备丢失函数都是保证模型以预期方法作业的最重要步骤之一。 丢失函数可认为神经网络供给许多有用的灵活性,它将界说网络输出与网络其余部分的衔接方法。
神经网络能够执行多种使命,从猜测接连值(如每月开销)到对离散类别(如猫和狗)进行分类。 每个不同的使命将需求不同的丢失类型,由于输出格局将不同。 具体使命将界说不同的丢失函数。
接下来博主会详尽解说常见的丢失函数,并结合代码使之更简略了解;
介绍
丢失函数(loss function)是用来估量你模型的猜测值 f(x)f(x) 与实在值 YY 的不一致程度,它是一个非负实值函数,一般运用 L(Y,f(x))L(Y, f(x)) 来表明,丢失函数越小,模型的鲁棒性就越好。丢失函数是经历危险函数的核心部分,也是结构危险函数重要组成部分。模型的结构危险函数包括了经历危险项和正则项,一般能够表明成如下式子:
其间,前面的均值函数表明的是经历危险函数,LL 代表的是丢失函数,后边的 是正则化项(regularizer)或许叫惩罚项(penalty term),它能够是 L1L1,也能够是 L2L2,或许其他的正则函数。整个式子表明的意思是找到使方针函数最小时的 值。
从十分简化的视点来看,丢失函数(J)能够界说为具有两个参数的函数:
- 猜测输出;
- 实践输出。
怎么运用丢失函数呢?具体步骤:
- 用随机值初始化前向核算公式的参数;
- 代入样本,核算输出的猜测值;
- 用丢失函数核算猜测值和标签值(实在值)的差错;
- 依据丢失函数的导数,沿梯度最小方向将差错回传,修正前向核算公式中的各个权重值;
- 进入第2步重复,直到丢失函数值到达一个满足的值就中止迭代。
分类丢失
当神经网络企图猜测离散值时,咱们能够将其视为分类模型。 这或许是网络企图猜测图像中存在哪种动物,或许电子邮件是否为垃圾邮件。 首要,让咱们看看分类神经网络的输出表明方法。
输出层的节点数将取决于数据中存在的类数。 每个节点将代表一个类。 每个输出节点的值本质上表明该类别为正确类别的概率。
Pr(Class 1) = Probability of Class 1 being the correct class
一旦取得一切不同类别的概率,咱们就将具有最高概率的类别视为该实例的猜测类别。 首要,让咱们探讨怎么进行二进制分类。
二进制分类
在二进制分类中,即使咱们将在两个类之间进行猜测,在输出层中也将只要一个节点。 为了取得概率格局的输出,咱们需求运用一个激活函数。 由于概率要求取0到1之间的值,因而咱们将运用S型函数,该函数能够将任何实践值紧缩为0到1之间的值。
随着 SigmoidSigmoid 的输入变大并趋向于无穷大,SigmoidSigmoid 的输出趋向于1。随着 SigmoidSigmoid 的输入变小而趋向于负无穷大,输出将趋于0。现在咱们保证总会得到 一个介于0到1之间的值,这正是咱们需求的值,由于咱们需求概率。
依据公式编写 SigmoidSigmoid 函数:
def sigmoid(x):
s = 1 / (1 + np.exp(-x))
return s
咱们用于二进制分类的丢失函数称为二进制穿插熵(BCE)。 该功能有效地惩罚了用于二进制分类使命的神经网络。
咱们能够在数学上将整个丢失函数表明为一个方程式,如下所示:
此丢失函数也称为对数丢失。 这便是为二进制分类神经网络规划丢失函数的方法。 现在,让咱们继续来看怎么为多类别分类网络界说丢失。
多类别分类
当咱们需求咱们的模型每次猜测一个或许的类输出时,多类分类是适宜的。 现在,由于咱们仍在处理概率,因而仅将 sigmoidsigmoid 运用于一切输出节点或许有意义,以便咱们为一切输出取得介于0–1之间的值,但这是有问题的。 在考虑多个类别的概率时,咱们需求保证一切单个概率的总和等于1,由于这是界说概率的方法。 运用 SS 形不能保证总和一直等于1,因而咱们需求运用另一个激活函数。
依据公式编写 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。
至于丢失,咱们能够直接在每个节点上运用对数丢失进行求和,类似于在多类分类中所做的。
已然咱们已经介绍了分类,现在让咱们介绍回归丢失函数。
回归丢失
在回归中,咱们的模型正在尝试猜测接连值。 回归模型的一些示例是:
- 房价猜测
- 年纪猜测
在回归模型中,咱们的神经网络将为每个咱们企图猜测的接连值供给一个输出节点。 经过在输出值和实在值之间进行直接比较来核算回归丢失。
咱们用于回归模型的最流行的丢失函数是均方差错丢失函数。 在此,咱们仅核算 YY 和 YpredY_{pred} 之差的平方,并对一切数据求平均值。 假定有 nn 个数据点:
在这里,YiY_i 和 YprediY_{pred_i} 指的是数据集中第 ii 个 YY 值,以及来自神经网络的相同数据的相应 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:
模型2:
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))
回归丢失
模型1:
模型2:
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