在上一篇文章介绍了逻辑回归的模型,并详细讲了其推导过程。为了加深印象,在这篇文章中从对数几率的角度再次探索逻辑回归的推导过程,看看逻辑回归为什么要使用sigmoid函数作为假设。
逻辑回归损失函数的推导,也是面试时经常被问到的一个点,我们也从两个角度去学习其损失函数的推导过程。然后再计算损失函数的导数。
1.从对数几率看逻辑回归
1.1 推导过程
一句话总结逻辑回归:
逻辑回归假设数据服从伯努利分布,通过极大似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。
逻辑回归是一个非线性模型,但是是其背后是以线性回归为理论支撑的。
提出一个与线性模型$ y=\theta^{T} \cdot X_{b} 长 相 类 似 但 不 同 的 新 公 式 : 假 设 特 征 X 所 对 应 的 y 值 是 在 指 数 上 变 化 , 那 么 就 可 以 将 结 果 y 值 取 对 数 , 作 为 其 线 性 模 型 逼 近 的 目 标 。 也 就 是 所 谓 的 “ 对 数 线 性 回 归 ” : 长相类似但不同的新公式:假设特征X所对应的y值是在指数上变化,那么就可以将结果y值取对数,作为其线性模型逼近的目标。也就是所谓的“对数线性回归”: 长相类似但不同的新公式:假设特征X所对应的y值是在指数上变化,那么就可以将结果y值取对数,作为其线性模型逼近的目标。也就是所谓的“对数线性回归”: \ln (y)=\theta^{T} \cdot X_{b} $
在“对数线性回归”的公式中,可以改写为$ y=e{\theta{T} \cdot X_{b}} $。实际上是在求输入空间X到输出空间y的非线性函数映射。对数函数的作用是将线性回归模型的预测值与真实标记联系起来。
因此可以得到一个一般意义上的单调可微的“联系函数”:$ g(a)=\ln (a) $。其本质就是给原来线性变换加上一个非线性变换(或者说映射),使得模拟的函数有非线性的属性,但本质上调参还是线性的,主体是内部线性的调参。
那么对于解决分类问题的逻辑回归来说,我们需要找到一个“联系函数”,将线性回归模型的预测值与真实标记联系起来。
将“概率”转换为“分类”的工具是“阶梯函数”:
p
^
=
f
(
x
)
y
^
=
{
0
p
^
≤
0.5
1
p
^
>
0.5
\hat{p}=f(x) \quad \hat{y}=\left\{\begin{array}{ll} 0 & \hat{p} \leq 0.5 \\ 1 & \hat{p}>0.5 \end{array}\right.
p^=f(x)y^={01p^≤0.5p^>0.5
但是这个阶梯函数不连续,不能作为“联系函数”g,因此使用对数几率函数来在一定程度上近似阶梯函数,将线性回归模型的预测值转化为分类所对应的概率。
σ
(
t
)
=
1
1
+
e
−
t
\sigma(t)=\frac{1}{1+e^{-t}}
σ(t)=1+e−t1
如果另y为正例,1-y为负例,所谓的“几率”就是二者的比值
y
1
−
y
\frac{y}{1-y}
1−yy。几率反映了样本x为正例的相对可能性。
“对数几率”就是对几率取对数 ln y 1 − y \ln \frac{y}{1-y} ln1−yy,对数几率实际上就是之前提到的sigmoid函数,将线性模型转化为分类。
如果令 $ y=\frac{1}{1+e{-\theta{T} \cdot X_{b}}}, \quad 1-y=\frac{e{-\theta{T} \cdot X_{b}}}{1+e{-\theta{T} \cdot X_{b}}} 。 带 入 到 对 数 几 率 中 。带入到对数几率中 。带入到对数几率中 \ln \frac{y}{1-y}=\theta^{T} \cdot X_{b} $。
可以看出,sigmoid实际上就是用线性回归模型的预测结果取逼近真实值的对数几率,因此逻辑回归也被称为“对数几率回归”。
1.2 面试问题
在有上述的推导之后,再看一个面试问题:
为什么要使用sigmoid函数作为假设?
现在就可以回答了:
因为线性回归模型的预测值为实数,而样本的类标记为(0,1),我们需要将分类任务的真实标记y与线性回归模型的预测值联系起来,也就是找到广义线性模型中的联系函数。如果选择单位阶跃函数的话,它是不连续的不可微。而如果选择sigmoid函数,它是连续的,而且能够将z转化为一个接近0或1的值。
2. 逻辑回归的损失函数
2.1 损失函数推导过程
已经知道逻辑回归的模型:
p
^
=
σ
(
θ
T
⋅
x
b
)
=
1
1
+
e
−
θ
T
⋅
X
b
y
^
=
{
1
p
^
≥
0.5
0
p
^
≤
0.5
\hat{p}=\sigma\left(\theta^{T} \cdot x_{b}\right)=\frac{1}{1+e^{-\theta^{T} \cdot X_{b}}} \quad \hat{y}=\left\{\begin{array}{ll}1 & \hat{p} \geq 0.5 \\ 0 & \hat{p} \leq 0.5\end{array}\right.
p^=σ(θT⋅xb)=1+e−θT⋅Xb1y^={10p^≥0.5p^≤0.5
那么,如何求出未知参数 θ \theta θ呢?
首先回顾一下线性回归。在线性回归中,做法如下:
由于已知 θ T ⋅ x b \theta^{T} \cdot x_{b} θT⋅xb 是估计值,于是用估计值与真值的差来度量模型的好坏。使用MSE(差值的平方和再平均)作为损失函数。然后就可以通过导数求极值的方法,找到令损失函数最小的了。
那么在逻辑回归中,解决思路也大致类似。
逻辑回归和线性回归最大的区别就是:逻辑回归解决的是分类问题,得到的y要么是1,要么是0。而我们估计出来的p是概率,通过概率决定估计出来的p到底是1还是0。因此,也可以将损失函数分成两类:
如果给定样本的真实类别y=1,则估计出来的概率p越小,损失函数越大(估计错误)
如果给定样本的真实类别y=0,则估计出来的概率p越大,损失函数越大(估计错误)
那么将用什么样的函数表示这两种情况呢,可以使用如下函数:
J = { − log ( p ^ ) if y = 1 − log ( 1 − p ^ ) if y = 0 J=\left\{\begin{array}{ll}-\log (\hat{p}) & \text { if } \quad y=1 \\ -\log (1-\hat{p}) & \text { if } \quad y=0\end{array}\right. J={−log(p^)−log(1−p^) if y=1 if y=0
分析上面的公式:
当y=1时,损失函数为 − log ( p ^ ) -\log (\hat{p}) −log(p^)。特点是: p ^ \hat{p} p^越趋于0,损失(loss)越大;越趋于1,损失(loss)越小。
分析如下:
J
=
−
log
(
p
^
)
J=-\log (\hat{p})
J=−log(p^) 是一个单调递减函数,且概率p的值域只能是[0,1]之间,因此只有函数的上半部分。我们看到当概率p取0(即预估的分类结果y=0)时,loss值是趋近于正无穷的,表明我们分错了(实际分类结果是1)。
当y=0时,损失函数为
−
log
(
1
−
p
^
)
-\log (1-\hat{p})
−log(1−p^) 。特点是:
p
^
\hat{p}
p^越趋于1,损失(loss)越大;越趋于0,损失(loss)越小。
分析如下:
J
=
−
log
(
1
−
p
^
)
J=-\log (1-\hat{p})
J=−log(1−p^) 是一个单调递减函数,且概率p的值域只能是[0,1]之间,因此只有函数的上半部分。我们看到当概率p取1(即预估的分类结果y=1)时,loss值是趋近于正无穷的,表明我们分错了(实际分类结果是0)。
由于模型是个二分类问题,分类结果y非0即1,因此我们可以使用一个巧妙的方法,通过控制系数的方式,将上面的两个式子合并成一个:
J
(
p
^
,
y
)
=
−
log
(
p
^
)
y
−
log
(
1
−
p
^
)
1
−
y
J(\hat{p}, y)=-\log (\hat{p})^{y}-\log (1-\hat{p})^{1-y}
J(p^,y)=−log(p^)y−log(1−p^)1−y
以上是对于单个样本的误差值,那么求整个集合内的损失可以取平均值:
J
(
θ
)
=
−
1
m
∑
i
=
1
m
y
(
i
)
log
(
p
^
(
i
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
p
^
(
i
)
)
J(\theta)=-\frac{1}{m} \sum_{i=1}^{m} y^{(i)} \log \left(\hat{p}^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-\hat{p}^{(i)}\right)
J(θ)=−m1i=1∑my(i)log(p^(i))+(1−y(i))log(1−p^(i))
然后,我们将
p
^
\hat{p}
p^ 替换成sigmoid函数,得到逻辑回归的损失函数如下:
J
(
θ
)
=
−
1
m
∑
i
=
1
m
y
(
i
)
log
(
σ
(
θ
T
⋅
X
b
(
i
)
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
σ
(
θ
T
⋅
X
b
(
i
)
)
)
J(\theta)=-\frac{1}{m} \sum_{i=1}^{m} y^{(i)} \log \left(\sigma\left(\theta^{T} \cdot X_{b}^{(i)}\right)\right)+\left(1-y^{(i)}\right) \log \left(1-\sigma\left(\theta^{T} \cdot X_{b}^{(i)}\right)\right)
J(θ)=−m1i=1∑my(i)log(σ(θT⋅Xb(i)))+(1−y(i))log(1−σ(θT⋅Xb(i)))
2.2 另一种推导方式
我们已经知道了逻辑损失函数的推导过程,但是就像在数学课上老师在黑板中写下的解题过程一样,我们费解的是“这个思路究竟是怎么来的”?
逻辑回归的损失函数当然不是凭空出现的,而是根据逻辑回归本身式子中系数的最大似然估计推导而来的。
最大似然估计就是通过已知结果去反推最大概率导致该结果的参数。极大似然估计是概率论在统计学中的应用,它提供了一种给定观察数据来评估模型参数的方法,即 “模型已定,参数未知”,通过若干次试验,观察其结果,利用实验结果得到某个参数值能够使样本出现的概率为最大,则称为极大似然估计。
逻辑回归是一种监督式学习,是有训练标签的,就是有已知结果的,从这个已知结果入手,去推导能获得最大概率的结果参数,只要我们得出了这个参数,那我们的模型就自然可以很准确的预测未知的数据了。
令逻辑回归的模型为$ h_{0}(x ; \theta) $,则可以将其视为类1的后验概率,所以有:
p
(
y
=
1
∣
x
;
θ
)
=
ψ
(
t
)
=
1
1
+
e
−
θ
T
⋅
X
b
p
(
y
=
0
∣
x
;
θ
)
=
1
−
ψ
(
t
)
=
e
−
θ
T
⋅
X
b
1
+
e
−
θ
T
⋅
X
b
p(y=1 | x ; \theta)=\psi(t)=\frac{1}{1+e^{-\theta^{T} \cdot X_{b}}} p(y=0 | x ; \theta)=1-\psi(t)=\frac{e^{-\theta^{T} \cdot X_{b}}}{1+e^{-\theta^{T} \cdot X_{b}}}
p(y=1∣x;θ)=ψ(t)=1+e−θT⋅Xb1p(y=0∣x;θ)=1−ψ(t)=1+e−θT⋅Xbe−θT⋅Xb
以上两个式子,可以改写为一般形式:
p
(
y
∣
x
;
θ
)
=
h
0
(
x
;
θ
)
y
(
1
−
h
0
(
x
;
θ
)
)
1
−
y
p(y | x ; \theta)=h_{0}(x ; \theta)^{y}\left(1-h_{0}(x ; \theta)\right)^{1-y}
p(y∣x;θ)=h0(x;θ)y(1−h0(x;θ))1−y
因此根据最大似然估计,可以得到:
J
(
θ
)
=
∏
i
=
1
m
p
(
y
i
∣
x
i
;
θ
)
=
∏
i
=
1
m
h
0
(
x
i
;
θ
)
y
i
(
1
−
h
0
(
x
i
;
θ
)
)
(
1
−
y
)
i
J(\theta)=\prod_{i=1}^{m} p\left(y^{i} | x^{i} ; \theta\right)=\prod_{i=1}^{m} h_{0}\left(x^{i} ; \theta\right)^{y^{i}}\left(1-h_{0}\left(x^{i} ; \theta\right)\right)^{(1-y)^{i}}
J(θ)=i=1∏mp(yi∣xi;θ)=i=1∏mh0(xi;θ)yi(1−h0(xi;θ))(1−y)i
为了简化计算,取对数将得到:
log
(
J
(
θ
)
)
=
∑
i
=
1
m
y
(
i
)
log
(
p
^
(
i
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
p
^
(
i
)
)
\log (J(\theta))=\sum_{i=1}^{m} y^{(i)} \log \left(\hat{p}^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-\hat{p}^{(i)}\right)
log(J(θ))=i=1∑my(i)log(p^(i))+(1−y(i))log(1−p^(i))
我们希望极大似然越大越好,就是说,对于给定样本数量m,希望$ -\frac{1}{m} \log (J(\theta)) $越小越好,得到逻辑回归的损失函数如下:
$ J(\theta)=-\frac{1}{m} \sum_{i=1}^{m} y^{(i)} \log \left(\sigma\left(\theta^{T} \cdot X_{b}{(i)}\right)\right)+\left(1-y{(i)}\right) \log \left(1-\sigma\left(\theta^{T} \cdot X_{b}^{(i)}\right)\right) $
所以说逻辑回归的损失函数不是定义出来的,而是根据最大似然估计推导出来的。
下面的目标就是:找到一组参数 θ \theta θ,使得损失函数 J ( θ ) J(\theta) J(θ)达到最小值。
这个损失函数是没有标准方程解的,因此在实际的优化中,我们往往直接使用梯度下降法来不断逼近最优解。
3. 损失函数的梯度
对于损失函数:
L
(
θ
)
=
−
1
m
∑
i
=
1
m
y
(
i
)
log
(
σ
(
θ
T
⋅
X
b
(
i
)
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
σ
(
θ
T
⋅
X
b
(
i
)
)
)
L(\theta)=-\frac{1}{m} \sum_{i=1}^{m} y^{(i)} \log \left(\sigma\left(\theta^{T} \cdot X_{b}^{(i)}\right)\right)+\left(1-y^{(i)}\right) \log \left(1-\sigma\left(\theta^{T} \cdot X_{b}^{(i)}\right)\right)
L(θ)=−m1i=1∑my(i)log(σ(θT⋅Xb(i)))+(1−y(i))log(1−σ(θT⋅Xb(i)))
使用梯度下降法,就要求出梯度,对每一个向量
θ
\theta
θ中每一个参数,都求出对应的导数:
∇
f
=
(
∂
L
(
θ
)
∂
θ
0
,
∂
L
(
θ
)
∂
θ
1
,
∂
L
(
θ
)
∂
θ
2
,
…
,
∂
L
(
θ
)
∂
θ
n
)
T
\nabla f=\left(\frac{\partial L(\theta)}{\partial \theta_{0}}, \frac{\partial L(\theta)}{\partial \theta_{1}}, \frac{\partial L(\theta)}{\partial \theta_{2}}, \dots, \frac{\partial L(\theta)}{\partial \theta_{n}}\right)^{T}
∇f=(∂θ0∂L(θ),∂θ1∂L(θ),∂θ2∂L(θ),…,∂θn∂L(θ))T
对sigmoid函数进行求导(链式求导法则):
σ
(
t
)
=
1
1
+
e
−
t
=
(
1
+
e
−
t
)
−
1
σ
(
t
)
′
=
−
(
1
+
e
−
t
)
−
2
⋅
e
−
t
⋅
(
−
1
)
=
(
1
+
e
−
t
)
−
2
⋅
e
−
t
\sigma(t)=\frac{1}{1+e^{-t}}=\left(1+e^{-t}\right)^{-1} \sigma(t)^{\prime}=-\left(1+e^{-t}\right)^{-2} \cdot e^{-t} \cdot(-1)=\left(1+e^{-t}\right)^{-2} \cdot e^{-t}
σ(t)=1+e−t1=(1+e−t)−1σ(t)′=−(1+e−t)−2⋅e−t⋅(−1)=(1+e−t)−2⋅e−t
然后对外层的log函数进行求导:
(
log
σ
(
t
)
)
′
=
1
σ
(
t
)
⋅
σ
(
t
)
′
=
1
σ
(
t
)
⋅
(
1
+
e
−
t
)
−
2
⋅
e
−
t
=
1
(
1
+
e
−
t
)
−
1
⋅
(
1
+
e
−
t
)
−
2
⋅
e
−
t
=
(
1
+
e
−
t
)
−
1
⋅
e
−
t
\begin{aligned}(\log \sigma(t))^{\prime} &=\frac{1}{\sigma(t)} \cdot \sigma(t)^{\prime} \\ &=\frac{1}{\sigma(t)} \cdot\left(1+e^{-t}\right)^{-2} \cdot e^{-t} \\ &=\frac{1}{\left(1+e^{-t}\right)^{-1}} \cdot\left(1+e^{-t}\right)^{-2} \cdot e^{-t} \\ &=\left(1+e^{-t}\right)^{-1} \cdot e^{-t} \end{aligned}
(logσ(t))′=σ(t)1⋅σ(t)′=σ(t)1⋅(1+e−t)−2⋅e−t=(1+e−t)−11⋅(1+e−t)−2⋅e−t=(1+e−t)−1⋅e−t
然后进行整理:
(
log
σ
(
t
)
)
′
=
(
1
+
e
−
t
)
−
1
⋅
e
−
t
=
e
−
t
1
+
e
−
t
=
1
+
e
−
t
−
1
1
+
e
−
t
=
1
−
1
1
+
e
−
t
=
1
−
σ
(
t
)
\begin{aligned}(\log \sigma(t))^{\prime} &=\left(1+e^{-t}\right)^{-1} \cdot e^{-t}=\frac{e^{-t}}{1+e^{-t}} \\ &=\frac{1+e^{-t}-1}{1+e^{-t}}=1-\frac{1}{1+e^{-t}} \\ &=1-\sigma(t) \end{aligned}
(logσ(t))′=(1+e−t)−1⋅e−t=1+e−te−t=1+e−t1+e−t−1=1−1+e−t1=1−σ(t)
下面就可以对损失函数前半部分的表达式: $ y^{(i)} \log \left(\sigma\left(\theta^{T} \cdot X_{b}^{(i)}\right)\right)
对
对
对\theta$进行求导了。带入上面的结果,得到:
y
(
i
)
(
1
−
σ
(
θ
T
⋅
X
b
(
i
)
)
)
⋅
X
j
(
i
)
y^{(i)}\left(1-\sigma\left(\theta^{T} \cdot X_{b}^{(i)}\right)\right) \cdot X_{j}^{(i)}
y(i)(1−σ(θT⋅Xb(i)))⋅Xj(i)
同样地,可以对损失函数的后半部分做求导,跟上面类似。
最终求的损失函数
L
(
θ
)
L(\theta)
L(θ)对
θ
\theta
θ的导数如下,即逻辑回归的损失函数经过梯度下降法对一个参数进行求导,得到结果如下:
L
(
θ
)
θ
j
=
1
m
∑
i
=
1
m
(
σ
(
θ
T
⋅
X
b
(
i
)
)
−
y
(
i
)
)
X
j
(
i
)
\frac{L(\theta)}{\theta_{j}}=\frac{1}{m} \sum_{i=1}^{m}\left(\sigma\left(\theta^{T} \cdot X_{b}^{(i)}\right)-y^{(i)}\right) X_{j}^{(i)}
θjL(θ)=m1i=1∑m(σ(θT⋅Xb(i))−y(i))Xj(i)
其中$ \sigma\left(\theta^{T} \cdot X_{b}^{(i)}\right) $就是逻辑回归模型的预测值。
在求得对一个参数的导数之后,则可以对所有特征维度上对损失函数进行求导,得到向量化后的结果如下:
∇
J
(
θ
)
=
1
m
⋅
(
∑
i
=
1
m
(
y
^
(
i
)
−
y
(
i
)
)
∑
i
=
1
m
(
y
^
(
i
)
−
y
(
i
)
)
⋅
X
i
(
i
)
∑
i
=
1
m
(
y
^
(
i
)
−
y
(
i
)
)
⋅
X
2
(
i
)
⋯
∑
i
=
1
m
(
y
^
(
i
)
−
y
(
i
)
)
⋅
X
n
(
i
)
)
=
1
m
⋅
X
b
T
⋅
(
σ
(
X
b
θ
)
−
y
)
\nabla J(\theta)=\frac{1}{m} \cdot\left(\begin{array}{c}\sum_{i=1}^{m}\left(\hat{y}^{(i)}-y^{(i)}\right) \\ \sum_{i=1}^{m}\left(\hat{y}^{(i)}-y^{(i)}\right) \cdot X_{i}^{(i)} \\ \sum_{i=1}^{m}\left(\hat{y}^{(i)}-y^{(i)}\right) \cdot X_{2}^{(i)} \\ \cdots \\ \sum_{i=1}^{m}\left(\hat{y}^{(i)}-y^{(i)}\right) \cdot X_{n}^{(i)} \end{array}\right) =\frac{1}{m} \cdot X_{b}^{T} \cdot(\sigma(X_{b} \theta)-y)
∇J(θ)=m1⋅⎝⎜⎜⎜⎜⎜⎛∑i=1m(y^(i)−y(i))∑i=1m(y^(i)−y(i))⋅Xi(i)∑i=1m(y^(i)−y(i))⋅X2(i)⋯∑i=1m(y^(i)−y(i))⋅Xn(i)⎠⎟⎟⎟⎟⎟⎞=m1⋅XbT⋅(σ(Xbθ)−y)