文章目录
2.9 逻辑回归
2.9.1 回归划分
广义线性模型家族里,依据因变量不同,可以有如下划分:
(1)如果是连续的,就是多重线性回归。
(2)如果是二项分布,就是逻辑回归。
(3)如果是泊松(Poisson)分布,就是泊松回归。
(4)如果是负二项分布,就是负二项回归。
(5)逻辑回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释。所以实际中最常用的就是二分类的逻辑回归。
2.9.2 逻辑回归适用性
逻辑回归可用于以下几个方面:
(1)用于概率预测。用于可能性预测时,得到的结果有可比性。比如根据模型进而预测在不同的自变量情况下,发生某病或某种情况的概率有多大。
(2)用于分类。实际上跟预测有些类似,也是根据模型,判断某人属于某病或属于某种情况的概率有多大,也就是看一下这个人有多大的可能性是属于某病。进行分类时,仅需要设定一个阈值即可,可能性高于阈值是一类,低于阈值是另一类。
(3)寻找危险因素。寻找某一疾病的危险因素等。
(4)仅能用于线性问题。只有当目标和特征是线性关系时,才能用逻辑回归。在应用逻辑回归时注意两点:一是当知道模型是非线性时,不适用逻辑回归;二是当使用逻辑回归时,应注意选择和目标为线性关系的特征。
(5)各特征之间不需要满足条件独立假设,但各个特征的贡献独立计算。
2.9.3 生成模型和判别模型的区别
生成模型:由数据学习联合概率密度分布P(X,Y),然后求出条件概率分布P(Y|X)作为预测的模型,即生成模型:P(Y|X)= P(X,Y)/ P(X)(贝叶斯概率)。基本思想是首先建立样本的联合概率概率密度模型P(X,Y),然后再得到后验概率P(Y|X),再利用它进行分类。典型的生成模型有朴素贝叶斯,隐马尔科夫模型等
判别模型:由数据直接学习决策函数Y=f(X)或者条件概率分布P(Y|X)作为预测的模型,即判别模型。基本思想是有限样本条件下建立判别函数,不考虑样本的产生模型,直接研究预测模型。典型的判别模型包括k近邻,感知级,决策树,支持向量机等。这些模型的特点都是输入属性X可以直接得到后验概率P(Y|X),输出条件概率最大的作为最终的类别(对于二分类任务来说,实际得到一个score,当score大于threshold时则为正类,否则为负类)。
举例:
判别式模型举例:要确定一个羊是山羊还是绵羊,用判别模型的方法是从历史数据中学习到模型,然后通过提取这只羊的特征来预测出这只羊是山羊的概率,是绵羊的概率。
生成式模型举例:利用生成模型是根据山羊的特征首先学习出一个山羊的模型,然后根据绵羊的特征学习出一个绵羊的模型,然后从这只羊中提取特征,放到山羊模型中看概率是多少,在放到绵羊模型中看概率是多少,哪个大就是哪个。
联系和区别:
生成方法的特点:上面说到,生成方法学习联合概率密度分布P(X,Y),所以就可以从统计的角度表示数据的分布情况,能够反映同类数据本身的相似度。但它不关心到底划分各类的那个分类边界在哪。生成方法可以还原出联合概率分布P(Y,X),而判别方法不能。生成方法的学习收敛速度更快,即当样本容量增加的时候,学到的模型可以更快的收敛于真实模型,当存在隐变量时,仍可以用生成方法学习。此时判别方法就不能用。
判别方法的特点:判别方法直接学习的是决策函数Y=f(X)或者条件概率分布P(Y|X)。不能反映训练数据本身的特性。但它寻找不同类别之间的最优分类面,反映的是异类数据之间的差异。直接面对预测,往往学习的准确率更高。由于直接学习P(Y|X)或P(X),可以对数据进行各种程度上的抽象、定义特征并使用特征,因此可以简化学习问题。
最后,由生成模型可以得到判别模型,但由判别模型得不到生成模型。
2.9.4 逻辑回归与朴素贝叶斯有什么区别
逻辑回归与朴素贝叶斯区别有以下几个方面:
(1)逻辑回归是判别模型, 朴素贝叶斯是生成模型,所以生成和判别的所有区别它们都有。
(2)朴素贝叶斯属于贝叶斯,逻辑回归是最大似然,两种概率哲学间的区别。
(3)朴素贝叶斯需要条件独立假设。
(4)逻辑回归需要求特征参数间是线性的。
2.9.5 线性回归与逻辑回归的区别
线性回归与逻辑回归的区别如下描述:
(1)线性回归的样本的输出,都是连续值, y ∈ ( − ∞ , + ∞ ) y\in (-\infty ,+\infty ) y∈(−∞,+∞),而逻辑回归中 y ∈ ( 0 , 1 ) y\in (0,1) y∈(0,1),只能取0和1。
(2)对于拟合函数也有本质上的差别:
线性回归: f ( x ) = θ T x = θ 1 x 1 + θ 2 x 2 + . . . + θ n x n f(x)=\theta ^{T}x=\theta _{1}x _{1}+\theta _{2}x _{2}+...+\theta _{n}x _{n} f(x)=θTx=θ1x1+θ2x2+...+θnxn
逻辑回归: f ( x ) = P ( y = 1 ∣ x ; θ ) = g ( θ T x ) f(x)=P(y=1|x;\theta )=g(\theta ^{T}x) f(x)=P(y=1∣x;θ)=g(θTx),其中, g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+e−z1
可以看出,线性回归的拟合函数,是对f(x)的输出变量y的拟合,而逻辑回归的拟合函数是对为1类样本的概率的拟合。
那么,为什么要以1类样本的概率进行拟合呢,为什么可以这样拟合呢?
θ T x = 0 \theta ^{T}x=0 θTx=0就相当于是1类和0类的决策边界:
当 θ T x > 0 \theta ^{T}x>0 θTx>0,则y>0.5;若 θ T x → + ∞ \theta ^{T}x\rightarrow +\infty θTx→+∞,则 y → 1 y \rightarrow 1 y→1,即y为1类;
当 θ T x < 0 \theta ^{T}x<0 θTx<0,则y<0.5;若 θ T x → − ∞ \theta ^{T}x\rightarrow -\infty θTx→−∞,则 y → 0 y \rightarrow 0 y→0,即y为0类;
这个时候就能看出区别,在线性回归中 θ T x \theta ^{T}x θTx为预测值的拟合函数;而在逻辑回归中 θ T x \theta ^{T}x θTx为决策边界。下表2-3为线性回归和逻辑回归的区别。
表2-3 线性回归和逻辑回归的区别
线性回归 | 逻辑回归 | |
---|---|---|
目的 | 预测 | 分类 |
y ( i ) y^{(i)} y(i) | 未知 | (0,1) |
函数 | 拟合函数 | 预测函数 |
参数计算方式 | 最小二乘法 | 极大似然估计 |
下面具体解释一下:
- 拟合函数和预测函数什么关系呢?简单来说就是将拟合函数做了一个逻辑函数的转换,转换后使得 y ( i ) ∈ ( 0 , 1 ) y^{(i)} \in (0,1) y(i)∈(0,1);
- 最小二乘和最大似然估计可以相互替代吗?回答当然是不行了。我们来看看两者依仗的原理:最大似然估计是计算使得数据出现的可能性最大的参数,依仗的自然是Probability。而最小二乘是计算误差损失。
2.10 代价函数
2.10.1 为什么需要代价函数
- 为了得到训练逻辑回归模型的参数,需要一个代价函数,通过训练代价函数来得到参数。
- 用于找到最优解的目的函数。
2.10.2 代价函数作用原理
在回归问题中,通过代价函数来求解最优解,常用的是平方误差代价函数。假设函数图像如图2-4所示,当参数发生变化时,假设函数状态也会随着变化。
图2-4 h ( x ) = A + B x h(x) = A + Bx h(x)=A+Bx函数示意图
想要拟合图中的离散点,我们需要尽可能找到最优的
A
A
A和
B
B
B来使这条直线更能代表所有数据。如何找到最优解呢,这就需要使用代价函数来求解,以平方误差代价函数为例,假设函数为
h
(
x
)
=
θ
0
x
h(x)=\theta_0x
h(x)=θ0x。
平方误差代价函数的主要思想就是将实际数据给出的值与拟合出的线的对应值做差,求出拟合出的直线与实际的差距。在实际应用中,为了避免因个别极端数据产生的影响,采用类似方差再取二分之一的方式来减小个别数据的影响。因此,引出代价函数:
J
(
θ
0
,
θ
1
)
=
1
m
∑
i
=
1
m
(
h
(
x
(
i
)
)
−
y
(
i
)
)
2
J(\theta_0, \theta_1) = \frac{1}{m}\sum_{i=1}^m(h(x^{(i)})-y^{(i)})^2
J(θ0,θ1)=m1i=1∑m(h(x(i))−y(i))2
最优解即为代价函数的最小值
min
J
(
θ
0
,
θ
1
)
\min J(\theta_0, \theta_1)
minJ(θ0,θ1)。如果是1个参数,代价函数一般通过二维曲线便可直观看出。如果是2个参数,代价函数通过三维图像可看出效果,参数越多,越复杂。
当参数为2个时,代价函数是三维图像,如下图2-5所示。
图2-5 代价函数三维图像
2.10.3 为什么代价函数要非负
目标函数存在一个下界,在优化过程当中,如果优化算法能够使目标函数不断减小,根据单调有界准则,这个优化算法就能证明是收敛有效的。
只要设计的目标函数有下界,基本上都可以,代价函数非负更为方便。
2.10.4 常见代价函数
(1)二次代价函数(quadratic cost):
J
=
1
2
n
∑
x
∥
y
(
x
)
−
a
L
(
x
)
∥
2
J = \frac{1}{2n}\sum_x\Vert y(x)-a^L(x)\Vert^2
J=2n1x∑∥y(x)−aL(x)∥2
其中,
J
J
J表示代价函数,
x
x
x表示样本,
y
y
y表示实际值,
a
a
a表示输出值,
n
n
n表示样本的总数。使用一个样本为例简单说明,此时二次代价函数为:
J
=
(
y
−
a
)
2
2
J = \frac{(y-a)^2}{2}
J=2(y−a)2
假如使用梯度下降法(Gradient descent)来调整权值参数的大小,权值
w
w
w和偏置
b
b
b的梯度推导如下:
∂
J
∂
w
=
(
y
−
a
)
σ
′
(
z
)
x
,
∂
J
∂
b
=
(
y
−
a
)
σ
′
(
z
)
\frac{\partial J}{\partial w}=(y-a)\sigma'(z)x\;, \frac{\partial J}{\partial b}=(y-a)\sigma'(z)
∂w∂J=(y−a)σ′(z)x,∂b∂J=(y−a)σ′(z)
其中,
z
z
z表示神经元的输入,
σ
\sigma
σ表示激活函数。权值
w
w
w和偏置
b
b
b的梯度跟激活函数的梯度成正比,激活函数的梯度越大,权值
w
w
w和偏置
b
b
b的大小调整得越快,训练收敛得就越快。
注:神经网络常用的激活函数为sigmoid函数,该函数的曲线如下图2-6所示:
图2-6 sigmoid函数曲线
如上图所示,对0.88和0.98两个点进行比较:
假设目标是收敛到1.0。0.88离目标1.0比较远,梯度比较大,权值调整比较大。0.98离目标1.0比较近,梯度比较小,权值调整比较小。调整方案合理。
假如目标是收敛到0。0.88离目标0比较近,梯度比较大,权值调整比较大。0.98离目标0比较远,梯度比较小,权值调整比较小。调整方案不合理。
原因:在使用sigmoid函数的情况下, 初始的代价(误差)越大,导致训练越慢。
(2)交叉熵代价函数(cross-entropy):
J
=
−
1
n
∑
x
[
y
ln
a
+
(
1
−
y
)
ln
(
1
−
a
)
]
J = -\frac{1}{n}\sum_x[y\ln a + (1-y)\ln{(1-a)}]
J=−n1x∑[ylna+(1−y)ln(1−a)]
其中,
J
J
J表示代价函数,
x
x
x表示样本,
y
y
y表示实际值,
a
a
a表示输出值,
n
n
n表示样本的总数。
权值
w
w
w和偏置
b
b
b的梯度推导如下:
∂
J
∂
w
j
=
1
n
∑
x
x
j
(
σ
(
z
)
−
y
)
,
∂
J
∂
b
=
1
n
∑
x
(
σ
(
z
)
−
y
)
\frac{\partial J}{\partial w_j}=\frac{1}{n}\sum_{x}x_j(\sigma{(z)}-y)\;, \frac{\partial J}{\partial b}=\frac{1}{n}\sum_{x}(\sigma{(z)}-y)
∂wj∂J=n1x∑xj(σ(z)−y),∂b∂J=n1x∑(σ(z)−y)
当误差越大时,梯度就越大,权值
w
w
w和偏置
b
b
b调整就越快,训练的速度也就越快。
二次代价函数适合输出神经元是线性的情况,交叉熵代价函数适合输出神经元是S型函数的情况。
(3)对数似然代价函数(log-likelihood cost):
对数似然函数常用来作为softmax回归的代价函数。深度学习中普遍的做法是将softmax作为最后一层,此时常用的代价函数是对数似然代价函数。
对数似然代价函数与softmax的组合和交叉熵与sigmoid函数的组合非常相似。对数似然代价函数在二分类时可以化简为交叉熵代价函数的形式。
在tensorflow中:
与sigmoid搭配使用的交叉熵函数:tf.nn.sigmoid_cross_entropy_with_logits()
。
与softmax搭配使用的交叉熵函数:tf.nn.softmax_cross_entropy_with_logits()
。
在pytorch中:
与sigmoid搭配使用的交叉熵函数:torch.nn.BCEWithLogitsLoss()
。
与softmax搭配使用的交叉熵函数:torch.nn.CrossEntropyLoss()
。
对数似然函数:
我们将似然函数作为机器学习模型的损失函数,并且用在分类问题中。这时似然函数是直接作用于模型的输出的(损失函数就是为了衡量当前参数下model的预测值predict距离真实值label的大小,所以似然函数用作损失函数时当然也是为了完成该任务),所以对于似然函数来说,这里的样本集就成了label集(而不是机器学习意义上的样本集X了),这里的参数也不是机器学习model 的参数,而是predict值。
其实作为损失函数的似然函数并不关心你当前的机器学习model的参数是怎样的,毕竟它此时所接收的输入只有两部分:1、predict。2、label 。3、分布模型(predict服从的分布)。
显然这里的label就是似然函数的观测值,即样本集。而它眼里的模型,当然就是predict这个随机变量所服从的概率分布模型。它的目的,就是衡量predict背后的模型对于当前观测值的解释程度。而每个样本的predict值,恰恰就是它所服从的分布模型的参数。
比如此时我们的机器学习任务是一个4个类别的分类任务,机器学习model的输出就是当前样本X下的每个类别的概率,如predict=[0.1, 0.1, 0.7, 0.1],而该样本的标签是类别3,表示成向量就是label=[0, 0, 1, 0]。那么label=[0, 0, 1, 0]就是似然函数眼里的样本,然后我们可以假设predict这个随机变量背后的模型是单次观测下的多项式分布,(因为softmax本身是基于多项式分布的)。
回顾:
伯努利分布,也叫做(0,1)分布,贝努利分布可以看成是将一枚硬币(只有正反两个面,代表两个类别)向上扔出,出现某个面(类别)的概率情况,因此其概率密度函数为:
f
(
x
)
=
p
x
(
1
−
p
)
1
−
x
=
{
p
,
x
=
1
q
,
x
=
0
f(x)=p^x(1-p)^{1-x}= \begin{cases} p,& x=1\\ q,& x=0 \end{cases}
f(x)=px(1−p)1−x={p,q,x=1x=0
这是理解似然函数做损失函数的关键!另外,贝努利分布的模型参数就是其中一个类别的发生概率。
而二项分布呢,就是将贝努利实验重复n次(各次实验之间是相互独立的)。
而多项式分布呢,就是将二项分布推广到多个面(类别)。
所以,单次观测下的多项式分布就是贝努利分布的多类推广!即:
f
m
u
l
i
t
(
x
;
p
)
=
∏
i
=
1
C
p
i
x
i
f_{mulit}(x;p)=\prod_{i=1}^C p_{i}^{xi}
fmulit(x;p)=i=1∏Cpixi
其中,C代表类别数。p代表向量形式的模型参数,即各个类别的发生概率,如p=[0.1, 0.1, 0.7, 0.1],则p1=0.1, p3=0.7等。即,多项式分布的模型参数就是各个类别的发生概率!x代表one-hot形式的观测值,如x=类别3,则x=[0, 0, 1, 0]。xi代表x的第i个元素,比如x=类别3时,x1=0,x2=0,x3=1,x4=0。
想一下,机器学习model对某个样本的输出,就代表各个类别发生的概率。但是,对于当前这一个样本而言,它肯定只能有一个类别,所以这一个样本就可以看成是一次实验(观察),而这次实验(观察)的结果要服从上述各个类别发生的概率,那不就是服从多项式分布嘛!而且是单次观察!各个类别发生的概率predict当然就是这个多项式分布的参数。
总结一下,对于多类分类问题,似然函数就是衡量当前这个以predict为参数的单次观测下的多项式分布模型与样本值label之间的似然度。
所以,根据似然函数的定义,单个样本的似然函数即:
L
=
f
m
u
l
i
t
(
l
a
b
e
l
;
p
r
e
d
i
c
t
)
L = f_{mulit}(label;predict)
L=fmulit(label;predict)
所以,整个样本集(或者一个batch)的似然函数即:
L
=
∏
X
f
m
u
l
t
i
(
l
a
b
e
l
;
p
r
e
d
i
c
t
)
=
∏
X
∏
i
=
1
C
p
r
e
d
i
c
t
(
i
)
l
a
b
e
l
(
i
)
L=\prod_{X}f_{multi}(label;predict)= \prod_{X}\prod_{i=1}^{C}predict(i)^{label(i)}
L=X∏fmulti(label;predict)=X∏i=1∏Cpredict(i)label(i)
所以在累乘号前面加上log函数后,就成了所谓的对数似然函数:
L
=
∑
X
∑
i
=
1
C
l
a
b
e
l
(
i
)
l
o
g
(
p
r
e
d
i
c
t
(
i
)
)
L=\sum_{X}\sum_{i=1}^{C}label(i)log(predict(i))
L=X∑i=1∑Clabel(i)log(predict(i))
而最大化对数似然函数就等效于最小化负对数似然函数,所以前面加个负号就和交叉熵的形式相同的了。
交叉熵定义:对于某种分布的随机变量X~p(x), 有一个模型q(x)用于近似p(x)的概率分布,则分布X与模型q之间的交叉熵即:
H
(
X
,
q
)
=
−
∑
x
p
(
x
)
l
o
g
q
(
x
)
H(X,q)=-\sum_{x}p(x)logq(x)
H(X,q)=−x∑p(x)logq(x)
这里X的分布模型即样本集label的真实分布模型,这里模型q(x)即想要模拟真实分布模型的机器学习模型。可以说交叉熵是直接衡量两个分布,或者说两个model之间的差异。而似然函数则是解释以model的输出为参数的某分布模型对样本集的解释程度。因此,可以说这两者是“同貌不同源”,但是“殊途同归”啦。
tips:
最大似然估计:
给定一堆数据,假如我们知道它是从某一种分布中随机取出来的,可是我们并不知道这个分布具体的参,即“模型已定,参数未知”。例如,我们知道这个分布是正态分布,但是不知道均值和方差;或者是二项分布,但是不知道均值。最大似然估计(MLE,Maximum Likelihood Estimation)就可以用来估计模型的参数。MLE的目标是找出一组参数,使得模型产生出观测数据的概率最大。
2.10.5 为什么用交叉熵代替二次代价函数
(1)为什么不用二次方代价函数
由上一节可知,权值
w
w
w和偏置
b
b
b的偏导数为
∂
J
∂
w
=
(
a
−
y
)
σ
′
(
z
)
x
\frac{\partial J}{\partial w}=(a-y)\sigma'(z)x
∂w∂J=(a−y)σ′(z)x,
∂
J
∂
b
=
(
a
−
y
)
σ
′
(
z
)
\frac{\partial J}{\partial b}=(a-y)\sigma'(z)
∂b∂J=(a−y)σ′(z), 偏导数受激活函数的导数影响,sigmoid函数导数在输出接近0和1时非常小,会导致一些实例在刚开始训练时学习得非常慢。
(2)为什么要用交叉熵
交叉熵函数权值
w
w
w和偏置
b
b
b的梯度推导为:
∂
J
∂
w
j
=
1
n
∑
x
x
j
(
σ
(
z
)
−
y
)
,
∂
J
∂
b
=
1
n
∑
x
(
σ
(
z
)
−
y
)
\frac{\partial J}{\partial w_j}=\frac{1}{n}\sum_{x}x_j(\sigma{(z)}-y)\;, \frac{\partial J}{\partial b}=\frac{1}{n}\sum_{x}(\sigma{(z)}-y)
∂wj∂J=n1x∑xj(σ(z)−y),∂b∂J=n1x∑(σ(z)−y)
由以上公式可知,权重学习的速度受到 σ ( z ) − y \sigma{(z)}-y σ(z)−y影响,更大的误差,就有更快的学习速度,避免了二次代价函数方程中因 σ ′ ( z ) \sigma'{(z)} σ′(z)导致的学习缓慢的情况。