引言
在机器学习中,逻辑损失函数(Logistic Loss Function)是用于训练逻辑回归模型的一种损失函数。逻辑回归是一种广泛用于分类问题的模型,特别是用于二分类问题,它的目标是预测一个实例属于两个类别中的一个的概率
文章目录
- 引言
- 一、逻辑损失函数的定义
- 二、sigmoid函数定义
- 三、逻辑损失函数的解释
- 四、探索为什么平方误差损失函数不适用于逻辑回归以及探索逻辑损失函数
- 4.1 导入第三方库
- 4.2 平方误差是否适用于逻辑回归
- 4.3 逻辑损失函数
- 4.4 总结
一、逻辑损失函数的定义
loss
(
f
w
,
b
(
x
(
i
)
)
,
y
(
i
)
)
=
−
y
(
i
)
log
(
f
w
,
b
(
x
(
i
)
)
)
−
(
1
−
y
(
i
)
)
log
(
1
−
f
w
,
b
(
x
(
i
)
)
)
\text{loss}(f_{w,b}(x^{(i)}), y^{(i)}) = -y^{(i)} \log(f_{w,b}(x^{(i)})) - (1 - y^{(i)}) \log(1 - f_{w,b}(x^{(i)}))
loss(fw,b(x(i)),y(i))=−y(i)log(fw,b(x(i)))−(1−y(i))log(1−fw,b(x(i)))
其中:
-
f
w
,
b
(
x
(
i
)
)
f_{w,b}(x^{(i)})
fw,b(x(i))是模型对于第
i
i
i个样本的预测,通常是经过
sigmoid
函数转换后的输出,表示样本属于正类(通常标记为1)的概率 - y ( i ) y^{(i)} y(i)是第 i i i个样本的实际标签,取值为0或1
- log \log log是自然对数
二、sigmoid函数定义
f w , b ( x ( i ) ) = 1 1 + e − ( w ⋅ x ( i ) + b ) f_{w,b}(x^{(i)}) = \frac{1}{1 + e^{-(w \cdot x^{(i)} + b)}} fw,b(x(i))=1+e−(w⋅x(i)+b)1
三、逻辑损失函数的解释
- 当实际标签 y ( i ) = 1 y^{(i)} = 1 y(i)=1时,损失函数变为 − log ( f w , b ( x ( i ) ) ) -\log(f_{w,b}(x^{(i)})) −log(fw,b(x(i)))。如果模型预测的概率接近1,则损失接近0;如果模型预测的概率接近0,则损失非常大
- 当实际标签 y ( i ) = 0 y^{(i)} = 0 y(i)=0时,损失函数变为 − log ( 1 − f w , b ( x ( i ) ) ) -\log(1 - f_{w,b}(x^{(i)})) −log(1−fw,b(x(i)))。如果模型预测的概率接近0,则损失接近0;如果模型预测的概率接近1,则损失非常大
逻辑损失函数的特点是它对于预测错误的情况给予较大的惩罚,而在预测正确时则给予较小的损失
这使得逻辑回归非常适合于分类任务,因为它能够通过最小化损失函数来学习如何正确地分类样本
在训练过程中,我们通常不是只计算单个样本的损失,而是计算整个训练集上所有样本的平均损失,即成本函数(Cost Function):
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
loss
(
f
w
,
b
(
x
(
i
)
)
,
y
(
i
)
)
J(w, b) = \frac{1}{m} \sum_{i=1}^{m} \text{loss}(f_{w,b}(x^{(i)}), y^{(i)})
J(w,b)=m1i=1∑mloss(fw,b(x(i)),y(i))
其中 m m m是训练集中样本的数量。通过优化成本函数(例如,使用梯度下降算法),我们可以找到最佳的模型参数 w w w和 b b b
四、探索为什么平方误差损失函数不适用于逻辑回归以及探索逻辑损失函数
4.1 导入第三方库
import numpy as np
%matplotlib widget
import matplotlib.pyplot as plt
from plt_logistic_loss import plt_logistic_cost, plt_two_logistic_loss_curves, plt_simple_example
from plt_logistic_loss import soup_bowl, plt_logistic_squared_error
plt.style.use('./deeplearning.mplstyle')
4.2 平方误差是否适用于逻辑回归
回想在线性回归中,我们使用了平方误差成本函数:一个变量的平方误差成本方程是:
J
(
w
,
b
)
=
1
2
m
∑
i
=
0
m
−
1
(
f
w
,
b
(
x
(
i
)
)
−
y
(
i
)
)
2
J(w, b) = \frac{1}{2m} \sum_{i=0}^{m-1} (f_{w,b}(x^{(i)}) - y^{(i)})^2
J(w,b)=2m1i=0∑m−1(fw,b(x(i))−y(i))2
其中
f
w
,
b
(
x
(
i
)
)
=
w
x
(
i
)
+
b
f_{w,b}(x^{(i)}) = wx^{(i)} + b
fw,b(x(i))=wx(i)+b
回想一下,平方误差成本有一个很好的性质,那就是沿着成本的导数可以找到最小值。
soup_bowl()
输出结果:
这个成本函数对于线性回归很有效,自然也会考虑将其用于逻辑回归。然而,现在
f
w
,
b
(
x
)
f_{w,b}(x)
fw,b(x)有一个非线性组件,即sigmoid函数:
f
w
,
b
(
x
(
i
)
)
=
sigmoid
(
w
x
(
i
)
+
b
)
f_{w,b}(x^{(i)}) = \text{sigmoid}(wx^{(i)} + b)
fw,b(x(i))=sigmoid(wx(i)+b)让我们在之前的实验例子中使用平方误差成本,现在包括sigmoid函数
这是我们的训练数据:
x_train = np.array([0., 1, 2, 3, 4, 5], dtype=np.longdouble)
y_train = np.array([0, 0, 0, 1, 1, 1], dtype=np.longdouble)
plt_simple_example(x_train, y_train)
输出结果:
现在,让我们使用平方误差成本得到一个表面图的成本:
J
(
w
,
b
)
=
1
2
m
∑
i
=
0
m
−
1
(
f
w
,
b
(
x
(
i
)
)
−
y
(
i
)
)
2
J(w, b) = \frac{1}{2m} \sum_{i=0}^{m-1} (f_{w,b}(x^{(i)}) - y^{(i)})^2
J(w,b)=2m1i=0∑m−1(fw,b(x(i))−y(i))2
其中
f
w
,
b
(
x
(
i
)
)
=
sigmoid
(
w
x
(
i
)
+
b
)
f_{w,b}(x^{(i)}) = \text{sigmoid}(wx^{(i)} + b)
fw,b(x(i))=sigmoid(wx(i)+b)
plt.close('all')
plt_logistic_squared_error(x_train, y_train)
plt.show()
输出结果:
虽然这产生了一个非常有趣的图,但上面的表面图并不像线性回归的“汤碗”那样平滑!
逻辑回归需要一个更适合其非线性特性的成本函数。这从损失函数开始,如下所述。
4.3 逻辑损失函数
逻辑回归使用一个更适合于分类任务的损失函数,其中目标值为0或1,而不是任何数字。
- 定义说明:在本课程中,使用以下定义:
- 损失是单个示例与其目标值差异的度量,而
- 成本是训练集上损失的度量
定义如下:
loss
(
f
w
,
b
(
x
(
i
)
)
,
y
(
i
)
)
\text{loss}(f_{w,b}(x^{(i)}), y^{(i)})
loss(fw,b(x(i)),y(i))
是单个数据点的成本,即:
loss
(
f
w
,
b
(
x
(
i
)
)
,
y
(
i
)
)
=
{
−
log
(
f
w
,
b
(
x
(
i
)
)
)
if
y
(
i
)
=
1
log
(
1
−
f
w
,
b
(
x
(
i
)
)
)
if
y
(
i
)
=
0
\text{loss}(f_{w,b}(x^{(i)}), y^{(i)}) = \begin{cases} -\log(f_{w,b}(x^{(i)})) & \text{if } y^{(i)} = 1 \\ \log(1 - f_{w,b}(x^{(i)})) & \text{if } y^{(i)} = 0 \end{cases}
loss(fw,b(x(i)),y(i))={−log(fw,b(x(i)))log(1−fw,b(x(i)))if y(i)=1if y(i)=0
f
w
,
b
(
x
(
i
)
)
f_{w,b}(x^{(i)})
fw,b(x(i))是模型的预测,而
y
(
i
)
y^{(i)}
y(i)是目标值。
f
w
,
b
(
x
(
i
)
)
=
g
(
w
⋅
x
(
i
)
+
b
)
f_{w,b}(x^{(i)}) = g(w \cdot x^{(i)} + b)
fw,b(x(i))=g(w⋅x(i)+b)
其中函数 g g g 是
sigmoid
函数
这个损失函数的特点是它使用两个单独的曲线。一个用于目标为零的情况(
y
=
0
y=0
y=0),另一个用于目标为一的情况(
y
=
1
y=1
y=1)。结合起来,这些曲线提供了损失函数所需的行为,即在预测与目标匹配时为零,在预测与目标不同时迅速增加值。
考虑下面的曲线:
plt_two_logistic_loss_curves()
输出结果:
结合起来的曲线与平方误差损失的二次曲线相似
- x轴是
f
w
,
b
f_{w,b}
fw,b,这是
sigmoid
函数的输出 sigmoid
输出严格在0和1之间
上面的损失函数可以重写,使其更容易实现:
loss ( f w , b ( x ( i ) ) , y ( i ) ) = ( − y ( i ) log ( f w , b ( x ( i ) ) ) − ( 1 − y ( i ) ) log ( 1 − f w , b ( x ( i ) ) ) \text{loss}(f_{w,b}(x^{(i)}), y^{(i)}) = (-y^{(i)} \log(f_{w,b}(x^{(i)})) - (1 - y^{(i)}) \log(1 - f_{w,b}(x^{(i)})) loss(fw,b(x(i)),y(i))=(−y(i)log(fw,b(x(i)))−(1−y(i))log(1−fw,b(x(i)))
这个方程看起来相当复杂。但是当你考虑到
y
(
i
)
y^{(i)}
y(i) 只能有两个值,0和1时,它就不那么令人生畏了。然后我们可以将方程分为两部分:
当
y
(
i
)
=
0
y^{(i)}=0
y(i)=0 时,左边的项被消去:
loss
(
f
w
,
b
(
x
(
i
)
)
,
0
)
=
(
−
(
0
)
log
(
f
w
,
b
(
x
(
i
)
)
)
−
(
1
−
0
)
log
(
1
−
f
w
,
b
(
x
(
i
)
)
)
)
=
−
log
(
1
−
f
w
,
b
(
x
(
i
)
)
)
\text{loss}(f_{w,b}(x^{(i)}), 0) = (-(0) \log(f_{w,b}(x^{(i)})) - (1-0) \log(1 - f_{w,b}(x^{(i)}))) = -\log(1 - f_{w,b}(x^{(i)}))
loss(fw,b(x(i)),0)=(−(0)log(fw,b(x(i)))−(1−0)log(1−fw,b(x(i))))=−log(1−fw,b(x(i)))
当
y
(
i
)
=
1
y^{(i)}=1
y(i)=1时,右边的项被消去:
loss
(
f
w
,
b
(
x
(
i
)
)
,
1
)
=
(
−
(
1
)
log
(
f
w
,
b
(
x
(
i
)
)
)
−
(
1
−
1
)
log
(
1
−
f
w
,
b
(
x
(
i
)
)
)
)
=
−
log
(
f
w
,
b
(
x
(
i
)
)
)
\text{loss}(f_{w,b}(x^{(i)}), 1) = (-(1) \log(f_{w,b}(x^{(i)})) - (1-1) \log(1 - f_{w,b}(x^{(i)}))) = -\log(f_{w,b}(x^{(i)}))
loss(fw,b(x(i)),1)=(−(1)log(fw,b(x(i)))−(1−1)log(1−fw,b(x(i))))=−log(fw,b(x(i)))
有了这个新的逻辑损失函数,我们可以产生一个包含所有示例损失的成本函数。现在,让我们来看看上面考虑的简单示例的成本与参数曲线:
plt.close('all')
cst = plt_logistic_cost(x_train, y_train)
输出结果:
- 这条曲线非常适合梯度下降
- 它没有平台,局部最小值或间断
- 它不像平方误差那样是一个碗形
- 成本和成本的日志都被绘制出来,以阐明当成本很小时,曲线有斜率并且继续下降
4.4 总结
- 确定平方误差损失函数不适用于分类任务
- 开发并检查适用于分类任务的逻辑损失函数