点击阅读原文
翻译: huangyongye
前言:本文在翻译过程中,为了便于理解,某些句子可能和原文有一定的出入。但是整体上没有太大的改动,由于本人水平有限,翻译或者理解不对的地方,欢迎指正,不胜感激。
Logistic 回归
本例子包括以下内容:
* logistic sigmoid 函数(以下称:logistic 函数)
* 交叉熵(Cross-entropy)损失函数
在分类问题中,我们希望神经网络最后输出每个类别的概率分布
t
。对于二分类问题,
首先导入相关的 Python 库函数。
# Python imports
import numpy as np # Matrix and vector computation package
import matplotlib.pyplot as plt # Plotting library
# Allow matplotlib to plot inside this notebook
%matplotlib inline
1. Logistic 函数
符号说明如下(此为译者添加):
-x 为输入样本原始特征
- z 为 logisitc 函数的输入(一般z=wT∗x )
- y 为 logisitc 函数的输出(预测类别 1 的概率)
-t 样本的真实类别( tϵ{0,1} )我们的目标是对于输入的 z ,准确预测该样本的类别
t 。 P(t=1|z) 表示输入 z 被分为类别t=1 的概率,用 logistic 函数的输出 y 来表示:y=σ(z) 。 其中 σ 为 logistic 函数,定义如下:
σ(z)=11+e−zlogistic sigmoid 函数,在 Python 中通过下面的
logistic(z)
函数来实现,输入 z ,输出一个介于0 和 1 之间的结果,如下图所示。给定输入
z , 我们可以按照下面的方式计算输出类别的概率:
P(t=1|z)P(t=0|z)=σ(z)=11+e−z=1−σ(z)=e−z1+e−z现在考虑logistic回归模型的特点,一个事件的几率(odds ratio)是指该事件发生的概率与该事件不发生的概率的比值。如果该事件发生的概率为 p , 那么该事件的几率为
p1−p 那么,logistic 的对数几率为:
logP(t=1|z)P(t=0|z)=log11+e−ze−z1+e−z=log1e−z=log(1)−log(e−z)=z这就是说,在logistic 回归模型中,输出类别 t=1 的对数几率 log(P(t=1|z)/P(t=0|z)) 是输入 z 的线性函数。而且如果是在神经网络中,
z=wT∗x ,那么对数几率随着 参数 w 和输出样本特征x 线性变化。
# Define the logistic function def logistic(z): return 1 / (1 + np.exp(-z))
# Plot the logistic function z = np.linspace(-6,6,100) plt.plot(z, logistic(z), 'b-') plt.xlabel('$z$', fontsize=15) plt.ylabel('$\sigma(z)$', fontsize=15) plt.title('logistic function') plt.grid() plt.show()
2. logistic 函数求导
在神经网络中,通常使用求梯度的方法来优化模型,比如梯度下降。所以,输出 y 对于输入
z 的梯度求解非常重要, ∂y/∂z 可以按照下面的方式计算:
∂y∂z=∂σ(z)∂z=∂11+e−z∂z=−1(1+e−z)2∗e−z∗−1=11+e−ze−z1+e−z由于 1−σ(z)=1−1/(1+e−z)=e−z/(1+e−z) ,所以上式可以写成下面形式:
∂y∂z=11+e−ze−z1+e−z=σ(z)∗(1−σ(z))=y(1−y)这个求导的过程通过下面的函数
logistic_derivative(z)
实现。
# Define the logistic function def logistic_derivative(z): return logistic(z) * (1 - logistic(z))
# Plot the derivative of the logistic function z = np.linspace(-6,6,100) plt.plot(z, logistic_derivative(z), 'r-') plt.xlabel('$z$', fontsize=15) plt.ylabel('$\\frac{\\partial \\sigma(z)}{\\partial z}$', fontsize=15) plt.title('derivative of the logistic function') plt.grid() plt.show()
3. logistic 函数的交叉熵(Cross-entropy)损失函数
在二分类问题中,我们可以把上述模型输出 y=σ(z) 理解为输入样本 z 属于类别
(t=1) 的概率;而 1−y 则表示 z 属于另外一个类别(t=0) 的概率。记作: P(t=1|z)=σ(z)=y .在神经网络模型中,对于给定参数集 θ ,我们通过最大化模型根据输入样本正确预测分类结果的似然函数(likelihood)的方法来优化模型。参数 θ 的作用是将原始输入样本 xi (译者注:原文这里是 i ) 变换成 logistic 函数的输入
zi 。最大化似然函数可以下成下面的形式:
argmaxθL(θ|t,z)=argmaxθ∏i=1nL(θ|ti,zi)根据似然函数的定义, L(θ|t,z) 可以写成联合概率 的形式,在给定参数 θ 时,模型产生 t 和
z 的概率: P(t,z|θ) . Since P(A,B)=P(A|B)∗P(B) ,这个又可以写成下面形式:
P(t,z|θ)=P(t|z,θ)P(z|θ)由于我们并不需要关心 z 的概率,所以上式可以简化为:
L(θ|t,z)=P(t|z,θ)=∏ni=1P(ti|zi,θ) .因为 ti 服从贝努利分布 (Bernoulli variable), 所以在给定 θ 条件下有 P(t|z)=y ,根据上式,有:
P(t|z)=∏i=1nP(ti=1|zi)ti∗(1−P(ti=1|zi))1−ti=∏i=1nytii∗(1−yi)1−ti我们知道,对数函数是单调递增的,所以可以通过优化对数似然函数 argmaxθlogL(θ|t,z) 来优化模型。这和直接优化似然函数是等价的。对数似然函数可以写成下面形式:
logL(θ|t,z)=log∏i=1nytii∗(1−yi)1−ti=∑i=1ntilog(yi)+(1−ti)log(1−yi)在优化问题中,我们更加喜欢求解最小值,所以可以对上式最大化问题通过取负转化为最小化问题。这样就得到了模型的损失函数 ξ(t,y) ,这就是我们通常说的交叉熵损失函数 或者叫做对数损失函数。
ξ(t,y)=−logL(θ|t,z)=−∑i=1n[tilog(yi)+(1−ti)log(1−yi)]=−∑i=1n[tilog(σ(z)+(1−ti)log(1−σ(z))]这个函数看起来貌似很复杂,除了之前的推导,这里边其实有些比较直观的理解能够告诉我们为什么是用它来作为 logistic 回归的损失函数。首先上式可以写成下面形式:
ξ(ti,yi)={−log(yi)−log(1−yi)if ti=1if ti=0对于样本的真实类别 ti=1 的样本:若输出为1的概率 yi=1 那么损失就是0 (−log(1)=0) ;同理,若输出 yi=0 ,那么损失将会趋于无穷大 (limy→0−log(y)=+∞) 。相反,对于真实类别为 ti=0 的样本:若输出为 yi=0 则损失为0, 若输出为 yi=1 则损失为无穷大。
可以发现,将 z 正确分类的损失函数
ξ(t,y) 等于取负的对数概率:−log(P(t=1|z))=−log(y) ,
−log(P(t=0|z))=−log(1−y) .通过最小化负的对数概率,等价于最大化正的对数概率。由于 t 取值只能是
0 或者 1 , 所以,ξ(t,y) 可以写成下面形式:
ξ(t,y)=−t∗log(y)−(1−t)∗log(1−y)若把 n 个样本的损失加起来,则有:
ξ(t,y)=−∑i=1n[tilog(yi)+(1−ti)log(1−yi)] 在logistic 回归中,我们使用交叉熵损失的另外一个原因是因为它是一个凸函数 , 这样我们就能够求解它的最小值(但是注意,并不是所有的损失函数都要满足凸函数的条件)。
4. logistic 函数的交叉熵(Cross-entropy)损失函数求导
交叉熵损失函数对输入进行求导 ∂ξ/∂y 如下:
∂ξ∂y=∂(−t∗log(y)−(1−t)∗log(1−y))∂y=∂(−t∗log(y))∂y+∂(−(1−t)∗log(1−y))∂y=−ty+1−t1−y=y−ty(1−y)在上文中,我们已经知道 ∂y/∂z=y(1−y) , 结合现在的推导,我们可以得到损失函数对输入 z 求导
∂ξ/∂z 的一个非常漂亮的公式:
∂ξ∂z=∂y∂z∂ξ∂y=y(1−y)y−ty(1−y)=y−tThis post at peterroelants.github.io is generated from an IPython notebook file. Link to the full IPython notebook file
5. 译者补充理解
5.1 似然函数
在统计学定义中,似然函数是一种关于统计模型参数的函数。给定样本输出 t,z 时,关于参数 θ 的似然函数 L(θ|t,z) (在数值上)等于给定参数 θ 后,模型产生样本输出 t,z 的概率:
L(θ|t,z)=P(t,z|θ)从直观上来理解,“极大化似然法”意味着通过调整参数(也就是修改模型),使得最后训练好的模型能够以最大的可能性生成我们喂给它的训练样本。令每一个样本属于其真实标记的概率越大越好。
5.2 交叉熵损失函数
(参考《西瓜书的 414 页》)
交叉熵是一种信息论的概念。首先从 KL 散度说起。KL 散度,又叫 KL 距离 或者 相对熵,可用于度量两个概率分布之间的差异。给定两个分布 P 和
Q (这里以离散分布为例,连续分布将求和改成积分即可), 二者之间的 KL 散度定义为:
KL(P||Q)=∑p(x)logp(x)q(x)
其中 p(x) 和 q(x) 分别为 P 和Q 的概率分布函数。将上述 KL 散度的定义展开,可得:
KL(P||Q)=∑p(x)logp(x)−∑p(x)logq(x)=−H(p)+H(p,q)
其中, H(p) 为熵, H(p,q) 为 P 和Q 的交叉熵。在信息论中, H(p) 表示对来自 P 的随机变量进行编码所需要的最小字节数,而交叉熵H(p,q) 则表示基于 Q 的编码对来自P 的变量进行编码所需要的字节数。因此, KL 散度可认为是使用基于 Q 的编码对来自P 的变量进行编码所需要的“额外的”字节数。显然,由于 KL 散度具有非负性,额外字节数必然非负,当且仅当 P=Q 时额外字节数为零。若我们把 H(p) 看作常数(实际上就是),那么交叉熵其实和 KL 散度是等价的。最小化交叉熵等价于最小化 KL 散度。
所以,从直观上来理解,最小化交叉熵函数,意味着通过调整参数(也就是修改模型),使得最后训练好的模型生成的数据分布和真实数据的分布越接近越好。
所以说,最大化似然函数和最小化交叉熵损失函数在物理意义上也是一致的,目的都是优化我们的模型,使它所产生的数据和真实数据尽可能的相似,也就是说,对于输入特征,模型输出的结果应该和真实标记尽可能相同。