目录
5.0 前言
逻辑回归用于发现特征与输出结果之间的联系,在社科与自然研究方面都是最重要的分析工具之一,用于有监督的机器学习算法中的分类问题,并与神经网络有密切的关系,可以将神经网络看作是多个逻辑回归分类器的堆叠。
逻辑回归可以用于二分类问题和多分类问题。(以下逐步开讲其数学原理)
生成式分类器 和 判别式分类器(Generative and Discriminative Classifiers):逻辑回归是判别式分类器,朴素贝叶斯是生成式分类器。这两种框架在构建机器学习模型上有很大区别。
例如:区分猫狗图片。
- 生成式模型:建立两个模型,目标是理解猫的特点、狗的特点,模型训练完后,将测试图片分别放入俩模型进行拟合,用较好拟合的模型给图片打上标签。例如朴素贝叶斯进行文本分类,计算*P(c|d)是通过计算P(d|c)和P©*等特征推出文本类别。
- 判别式模型:学习区分两个类的方法,通过区别性特征直接判断类别。不一定能学习到猫狗的本质性区别特征。比如学习到戴领结的是狗,不带领结的是猫。文本分类问题中,是相当于直接计算P(c|d)。
概率机器学习分类器的组件:逻辑回归 是一个概率分类器,需要一个大小为M,输入/输出为(x(i), y(i))的训练语料库。用于分类的机器学习系统有4个组件:
- 输入内容的特征表示:一个观察x(i)的特征向量为[x1, x2, …,xn],或者用xi(j)。
- 用于计算 y ^ \hat y y^(估计的类别)的分类函数:比如sigmoid或者softmax。
- 目标函数:比如交叉熵损失函数(cross-entropy loss function)。
- 优化目标函数的算法:比如随机梯度下降算法。
逻辑回归有两个阶段:训练、测试。
- 训练:使用随机梯度下降和交叉熵损失训练系统参数的权重w和偏置b。
- 测试:给定测试样本x,计算p(y|x),返回概率较高的标签。
5.1 分类:sigmoid
二分类问题常用sigmoid分类,例如情感分类,通过输入的观察特征x,计算P(y=1|x)和P(y=0|x)这俩概率。 逻辑回归通过训练集学习权重(weighs)和偏置(bias)。每个wi与一个特征xi相乘,代表这个特征的重要性;偏置也就是截距。
测试时,输入新的x,可以计算得到z。
z
=
(
∑
i
=
1
n
w
i
x
i
)
+
b
z=\left(\sum_{i=1}^nw_ix_i\right)+b
z=(i=1∑nwixi)+b
也可以用点积的形式写:
z = w ⋅ x + b z = w · x + b z=w⋅x+b
然而,z的值域为(-∞,∞),并不是概率的值域[0,1]。所以为了产生概率,我们将z传入到sigmoid函数,σ(z)。sigmoid函数(得名于其曲线类似S)也被称为逻辑函数,逻辑回归也因此得名。sigmoid的公式和曲线如下:
y
=
σ
(
z
)
=
1
1
+
e
−
z
y=\sigma(z)=\frac1{1+e^{-z}}
y=σ(z)=1+e−z1 (5.4)
sigmoid可以把实数域映射到[0,1],便于获取概率;在0附近曲线接近直线并且斜率较大,两侧较远处逼近0,1;可微。
因为
p
(
y
=
1
)
+
p
(
y
=
0
)
=
1
p(y=1) + p(y=0) =1
p(y=1)+p(y=0)=1,所以有:
P
(
y
=
1
)
=
σ
(
w
⋅
x
+
b
)
=
1
1
+
e
−
(
w
⋅
x
+
b
)
P(y = 1) = σ(w· x+b)=\frac1{1+e^{-(w\cdot x+b)}}
P(y=1)=σ(w⋅x+b)=1+e−(w⋅x+b)1
P
(
y
=
0
)
=
1
−
σ
(
w
⋅
x
+
b
)
=
1
−
1
1
+
e
−
(
w
⋅
x
+
b
)
=
e
−
(
w
⋅
x
+
b
)
1
+
e
−
(
w
⋅
x
+
b
)
P(y = 0) = 1−σ(w· x+b)=1-\frac1{1+e^{-(w\cdot x+b)}}=\frac{e^{-(w\cdot x+b)}}{1+e^{-(w\cdot x+b)}}
P(y=0)=1−σ(w⋅x+b)=1−1+e−(w⋅x+b)1=1+e−(w⋅x+b)e−(w⋅x+b)
算法准备好了,那么给定一个测试x,如何预测呢?我们把0.5作为决策边界,
P
(
y
=
1
∣
x
)
P(y = 1|x)
P(y=1∣x)大于0.5,预测为1。
y
^
=
{
1
  
i
f
  
p
(
y
=
1
∣
x
)
>
0.5
0
  
i
f
  
o
t
h
e
r
w
i
s
e
\widehat y=\left\{\begin{array}{l}1\;if\;p(y=1\vert x)>0.5\\0\;if\;otherwise\end{array}\right.
y
={1ifp(y=1∣x)>0.50ifotherwise
5.1.1例子:情感分类
使用文本doc,正面情感 +, 负面情感 - ,使用6个输入特征
x
1
.
.
.
x
6
x_1...x_6
x1...x6 。一组特征如下:
假设我们已经训练出了模型的各个参数,其中
w
=
[
2.5
,
−
5.0
,
−
1.2
,
0.5
,
2.0
,
0.7
]
,
b
=
0.1
w=[2.5,-5.0,-1.2,0.5,2.0,0.7], b=0.1
w=[2.5,−5.0,−1.2,0.5,2.0,0.7],b=0.1,那么:
p
(
+
∣
x
)
=
σ
(
w
⋅
x
+
b
)
=
σ
(
1.805
)
=
0.86
p(+|x)=σ(w· x+b)=σ(1.805)=0.86
p(+∣x)=σ(w⋅x+b)=σ(1.805)=0.86
p
(
−
∣
x
)
=
1
−
σ
(
w
⋅
x
+
b
)
=
0.14
p(-|x)=1-σ(w· x+b)=0.14
p(−∣x)=1−σ(w⋅x+b)=0.14
逻辑回归几乎可以用于所有的NLP任务等,比如判断句号是不是句子结尾等。
设计特征(Designing features):特征的设计常常是基于语言学知识或直觉,需要对训练集和开发集进行细致的错误分析。将原始特征进行组合建立复杂特征对于某些特定任务非常有用,只不过大多需要人工设计。为了减少人工设计特征,表示学习受到了越来越多的关注。
选择分类器(Choosing a classifier):逻辑回归比朴素贝叶斯有更多优势。朴素贝叶斯的条件独立假设过于strong;逻辑回归更加鲁棒,会考虑特征之间的相关性。所以 逻辑回归在大文本或大数据集上表现较好,并常作为首选分类器。朴素贝叶斯优势是在小数据集上表现相当好,易于实施、无需优化、训练迅速,所以在某些情况下仍然被选用。
5.2逻辑回归的学习
逻辑回归模型里的参数w
和b
是怎么学习到的呢?
逻辑回归作为有监督学习,对于每一条数据x
,都有一个准确标签y
。系统的目标是 产生 一个y
的近似值
y
^
\hat y
y^,通过使
y
^
\hat y
y^逐步趋向y
,学习到模型的参数w
和b
。
为了学习到参数,还需要两个组件。一个是测量y
与
y
^
\hat y
y^距离的函数,称之为损失函数或者代价函数,比如交叉熵损失函数;一个是通过迭代来更新参数减少代价的优化算法,比如随机梯度下降算法。
5.3交叉熵损失函数
损失函数可以定义如下:
L
(
y
^
,
y
)
=
H
o
w
  
m
u
c
h
  
y
^
  
d
i
f
f
e
r
s
  
f
r
o
m
  
t
h
e
  
t
r
u
e
  
y
L(\hat y,y)=How\;much\; \hat y \;differs\; from \;the\; true\; y
L(y^,y)=Howmuchy^differsfromthetruey可以设想使用均方误差来测量,但是均方误差在概率分类问题上non-convex,难以优化。于是采用条件最大似然估计(conditioanl maximum likelihood estimation):对于一个观察x
,通过最大化其标签y
的对数概率来优化参数w
和b
,损失函数就变成了负对数似然损失函数(negative log likelihood loss),也叫交叉熵损失函数。下面对损失函数进行推导,假设我们只有一条数据。
系统的输出为伯努利分布(两点分布),目标是最大化
p
(
y
∣
x
)
p(y|x)
p(y∣x)来习得参数,可以用如下公式表示我们的目的(如果y=1,公式右侧为
y
^
\hat y
y^;如果y=0,公式右侧为1-
y
^
\hat y
y^):
p
(
y
∣
x
)
=
y
^
y
(
1
−
y
^
)
1
−
y
p(y|x)=\hat y^y(1-\hat y)^{1-y}
p(y∣x)=y^y(1−y^)1−y然后两侧取对数,因为概率的最大化的同时也是概率对数的最大化:
l
o
g
p
(
y
∣
x
)
=
l
o
g
[
y
^
y
(
1
−
y
^
)
1
−
y
]
=
y
l
o
g
y
^
+
(
1
−
y
)
l
o
g
(
1
−
y
^
)
              
(
5.9
)
logp(y|x)=log[\hat y^y(1-\hat y)^{1-y}]=ylog\hat y+(1-y)log(1-\hat y)\;\;\;\;\;\;\;(5.9)
logp(y∣x)=log[y^y(1−y^)1−y]=ylogy^+(1−y)log(1−y^)(5.9)再将目标函数的最大化问题转化为损失函数的最小化问题,方法是直接在上面公式前加负号,结果就变成了交叉熵损失函数:
L
C
E
(
y
^
,
y
)
=
−
l
o
g
p
(
y
∣
x
)
=
−
[
y
l
o
g
y
^
+
(
1
−
y
)
l
o
g
(
1
−
y
^
)
]
              
(
5.10
)
L_{CE}(\hat y, y)=-logp(y|x)=-[ylog\hat y+(1-y)log(1-\hat y)]\;\;\;\;\;\;\;(5.10)
LCE(y^,y)=−logp(y∣x)=−[ylogy^+(1−y)log(1−y^)](5.10)最后,将
y
^
\hat y
y^的表达式代入上面公式:
L
C
E
(
w
,
b
)
=
−
[
y
l
o
g
σ
(
w
⋅
x
+
b
)
+
(
1
−
y
)
l
o
g
(
1
−
σ
(
w
⋅
x
+
b
)
)
]
L_{CE}(w,b)=-[ylogσ(w· x+b) +(1-y)log(1-σ(w· x+b) )]
LCE(w,b)=−[ylogσ(w⋅x+b)+(1−y)log(1−σ(w⋅x+b))]
之所以叫交叉熵损失函数是因为(5.9)就是交叉熵公式。上面函数的值域为零到正无穷,能使损失为零的参数就是我们最需要的参数。
现在将(5.10)扩展到整个训练集:
l
o
g
p
(
t
r
a
i
n
i
n
g
  
l
a
b
e
l
s
)
=
log
∏
i
=
1
m
p
(
y
(
i
)
∣
x
(
i
)
)
=
∑
i
=
1
m
log
p
(
y
(
i
)
∣
x
(
i
)
)
=
−
∑
i
=
1
m
L
C
E
(
y
^
(
i
)
,
y
(
i
)
)
logp(training \;labels)=\log\prod_{i=1}^m\overset{}{\underset{}{p(y^{(i)}\vert x^{(i)})}}=\sum_{i=1}^m\log\overset{}{\underset{}{p(y^{(i)}\vert x^{(i)})}}=-\sum_{i=1}^mL_{CE}(\hat y^{(i)},y^{(i)})
logp(traininglabels)=logi=1∏mp(y(i)∣x(i))=i=1∑mlogp(y(i)∣x(i))=−i=1∑mLCE(y^(i),y(i))我们将整个训练集上的损失函数定义为每条数据的平均损失,通过最小化这个平均损失来获取参数:
C
o
s
t
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
C
E
(
y
^
(
i
)
,
y
(
i
)
)
=
−
1
m
∑
i
=
1
m
y
(
i
)
log
σ
(
w
⋅
  
x
(
i
)
+
b
)
  
+
(
1
−
y
(
i
)
)
log
(
1
−
σ
(
w
⋅
  
x
(
i
)
+
b
)
  
)
]
Cost(w,b)=\frac1m\sum_{i=1}^mL_{CE}(\hat y^{(i)},y^{(i)})=-\frac1m\sum_{i=1}^my^{(i)}\log\sigma(w\cdot\;x^{(i)}+b)\;+(1-y^{(i)})\log(1-\sigma(w\cdot\;x^{(i)}+b)\;)\rbrack
Cost(w,b)=m1i=1∑mLCE(y^(i),y(i))=−m1i=1∑my(i)logσ(w⋅x(i)+b)+(1−y(i))log(1−σ(w⋅x(i)+b))]
5.4梯度下降
使用梯度下降法最小化损失函数来找到最优参数(
θ
=
w
,
b
\theta=w,b
θ=w,b)。
θ
^
=
a
r
g
m
i
n
θ
1
m
∑
i
=
1
m
L
C
E
(
y
(
i
)
,
x
(
i
)
)
\hat\theta=\underset\theta{argmin}\frac1m\sum_{i=1}^mL_{CE}(y^{(i)},x^{(i)})
θ^=θargminm1i=1∑mLCE(y(i),x(i))
梯度下降的直觉上是在函数曲线上选择一个点,然后从这个点开始沿着梯度的反方向向下找到最低点,这个时候梯度为零。在逻辑回归中,损失函数是凹函数,只有一个最小值,没有局部最小值,所以从任何点开始下降都能保证收敛到最小值。
下图:假设只有一个参数w,先随机初始化w的值为w1,计算得到w1处的梯度为负,于是看到w1的变化方向为增大,于是w1右移取w2的值,如此继续,直到梯度为零,得到w的最终值Wmin。
至于每次参数w的变化量,使用学习率 η来限定。公式如下,
d
d
w
f
(
x
;
w
)
\frac d{dw}f(x;w)
dwdf(x;w)为梯度:
w
t
+
1
=
w
t
−
η
d
d
w
f
(
x
;
w
)
w^{t+1}=w^t-\eta\frac d{dw}f(x;w)
wt+1=wt−ηdwdf(x;w)
实际的逻辑回归有多个参数,我们用损失函数求每个参数的偏导来表示梯度。于是逻辑回归的梯度可以用向量来表示(5.18),并得到参数更新的方法(5.19)。
5.4.1逻辑回归的梯度
逻辑回归的损失函数为:
L
C
E
(
w
,
b
)
=
−
[
y
l
o
g
σ
(
w
⋅
x
+
b
)
+
(
1
−
y
)
l
o
g
(
1
−
σ
(
w
⋅
x
+
b
)
)
]
L_{CE}(w,b)=-[ylogσ(w· x+b) +(1-y)log(1-σ(w· x+b) )]
LCE(w,b)=−[ylogσ(w⋅x+b)+(1−y)log(1−σ(w⋅x+b))]代入一个观察样本x,得到参数的偏导为
可以看到,wj的偏导就是预测值与标签的差乘以相应的输入特征值xj。
整个数据集的损失就是m个样本损失的平均值;而wj的梯度的值就是计算每个样本得到梯度然后加和。
5.4.2随机梯度下降算法
随机梯度下降是在每个样本训练后都进行参数调整。算法如下:
之所以叫做随机梯度下降,是因为它每次随机选择一个样本计算各参数梯度,然后立即更新参数,这样导致参数的变化极不稳定。所以常用小批量(minibatch)梯度下降法,每次使用多个样本训练而不是一个。
关于学习率
η
\eta
η的设置:如果太大,参数容易越过最优值;如果太小,训练时间太长。所以可以在训练初期设置大学习率,通过函数随着迭代逐渐降低学习率,例如
η
k
\eta_k
ηk表示第k次迭代使用的学习率。
5.4.3实例
选择一个样本X,特征为x1=3, x2=2;
初始化模型的参数,w1 = w2 = b = 0,η = 0.1;
通过公式计算每个参数梯度,得到 [-1.5, -1.0, -0.5];
根据梯度更新参数,得到[0, 0, 0] - 0.1 * [-1.5, -1.0, -0.5] = [0.15, 0.1 0.05];
5.5正则化(Regularization)
模型对训练集拟合得太好容易发生过拟合问题,过拟合的模型泛化能力差,所以在测试集上表现会很差。为避免过拟合,可以在目标函数上加一个正则化项:
w
^
=
a
r
g
m
a
x
w
∑
i
=
1
m
log
p
(
y
(
i
)
∣
x
(
i
)
)
−
α
R
(
w
)
\hat w = \underset w{argmax}\sum_{i=1}^m\log p(y^{(i)}\vert x^{(i)})-\alpha R(w)
w^=wargmaxi=1∑mlogp(y(i)∣x(i))−αR(w)
R(w)被称为正则化项,用来惩罚
过大的权重参数,也就是对过大的参数进行限制。我们不去用较大的参数使模型完美地拟合训练数据,而是用较小的参数使模型拟合得稍微差一点。
常用的正则化项有L2正则化,使用L2范数,
R
(
w
)
=
∑
j
=
1
n
w
j
2
R(w)=\sum_{j=1}^nw_j^2
R(w)=∑j=1nwj2或者说欧氏距离:
w
^
=
a
r
g
m
a
x
w
[
∑
i
=
1
m
log
p
(
y
(
i
)
∣
x
(
i
)
)
]
−
α
∑
j
=
1
n
w
j
2
\hat w = \underset w{argmax}\left[\sum_{i=1}^m\log p(y^{(i)}\vert x^{(i)})\right]-\alpha\sum_{j=1}^nw_j^2
w^=wargmax[i=1∑mlogp(y(i)∣x(i))]−αj=1∑nwj2还有L1正则化,使用L1范数
R
(
w
)
=
∑
j
=
1
n
∣
w
j
∣
R(w)=\sum_{j=1}^n|w_j|
R(w)=∑j=1n∣wj∣或者说曼哈顿距离:
w
^
=
a
r
g
m
a
x
w
[
∑
i
=
1
m
log
p
(
y
(
i
)
∣
x
(
i
)
)
]
−
α
∑
j
=
1
n
∣
w
j
∣
\hat w = \underset w{argmax}\left[\sum_{i=1}^m\log p(y^{(i)}\vert x^{(i)})\right]-\alpha\sum_{j=1}^n|w_j|
w^=wargmax[i=1∑mlogp(y(i)∣x(i))]−αj=1∑n∣wj∣这两种正则化来自于统计学,L1正则化被称为套索回归,L2正则化被称为岭回归。L2正则化求导简单,易于优化,使参数的值较小;L1正则化后某些参数大,某些参数为0,所以使参数向量稀疏,也就是有利于减少特征数量。L1正则化可以被看做Laplace prior;L2正则化可以看作在权重上乘以gaussian prior,然后取对数。
参考这篇文章理解正则化。
5.6多项式(多分类)逻辑回归
当分类多余两项的时候,比如词性标注、语义关系标注,我们使用多项式逻辑回归,也叫softmax regression。softmax函数是sigmoid函数的一般化,它是一个指数函数,将一个向量z=[z1, z2, …, zk]映射为概率分布,每个值都处在(0, 1]内,而且所有值的和为1。
对于一个k维的向量z,Softmax的计算如下(5.32),输入向量z,输出向量softmax(z):
就像sigmoid一样,softmax的输入仍然是权重和样本特征的点积,区别是这里的权重向量是每个类别各自的权重向量:
p
(
y
=
c
∣
x
)
=
e
w
c
⋅
x
+
b
c
∑
j
=
1
k
e
w
j
⋅
x
+
b
j
p(y=c\vert x)=\frac{e^{w_c\cdot x+b_c}}{\displaystyle\sum_{j=1}^ke^{w_j\cdot x+b_j}}
p(y=c∣x)=j=1∑kewj⋅x+bjewc⋅x+bc
5.6.1多项式逻辑回归的输入特征
f i ( c , x ) f_i(c,x) fi(c,x)表示对于类c,x的特征i。对于每一类,x的特征i将训练出不同的权重,这个权重表示多大程度上支持或者不支持样本成为此类。
5.6.2多项式逻辑回归的学习
因为用的是softmax来分类,多项式逻辑回归的损失函数与二分类逻辑回归不同,对于一个样本x,它的损失函数是K个输出类别的对数之和。
这里使用了1{}
这种函数,表示如果花括号内的条件成立就取值为1,不成立则为0。下面是求给一个样本x时,参数的梯度:
省略推导过程,其实结果还是标签与预测值之差,乘以特征Xk。
5.7模型的解释
我们不只希望模型能准确分类,我们还希望知道模型为什么能进行准确的分类,也就是希望模型具有可解释性。因为逻辑回归的输入特征多为人工设计,所以理解分类器的决策过程的一个方法是了解每个特征在决策中的作用。逻辑回归可以与某些统计检验结合(比如似然比检验等),来检验某个特征是否具有显著性,以解释分类器的决策依据。
进一步看,除了作为分类器,逻辑回归还能用做检验假设的分析工具,用来观察那些可解释变量(特征)的作用(比如在做文本分类时,否定词是否与负面情感联系更紧密),当然这个过程中需要控制好其他影响因素(比如文本的类型等)。
5.8高级:梯度公式的推导
逻辑回归交叉熵损失函数LCE的推导,从复习微积分开始。
首先,ln(x)的导数是:
d
d
x
ln
(
x
)
=
1
x
\frac{\operatorname d{}}{\operatorname dx}\ln(x)=\frac1{\displaystyle x}
dxdln(x)=x1然后,sigmoid的导数是:
d
σ
(
z
)
d
x
=
σ
(
z
)
(
1
−
σ
(
z
)
)
\frac{\operatorname d\sigma(z)}{\operatorname dx}=\sigma(z)(1-\sigma(z))
dxdσ(z)=σ(z)(1−σ(z))最后,根据导数的链式法则:复合函数
f
(
x
)
=
u
(
v
(
x
)
)
f(x)=u(v(x))
f(x)=u(v(x)),
f
(
x
)
f(x)
f(x)的导数是
u
(
x
)
u(x)
u(x)关于
v
(
x
)
v(x)
v(x)的导数,乘以
v
(
x
)
v(x)
v(x)关于
x
x
x的导数:
d
f
d
x
=
d
u
d
v
⋅
d
v
d
x
\frac {df}{dx}=\frac {du}{dv}·\frac {dv}{dx}
dxdf=dvdu⋅dxdv首先,我们要求损失函数关于单个权重
w
j
w_j
wj的导数:
然后,使用链式法则,应用对数导数公式,再整理:
最后,将sigmoid函数的导数代入公式中,接着再用一次链式法则,最终得到求偏导公式:
5.9总结
这一章介绍了用于分类的逻辑回归模型。
- 逻辑回归是一个有监督的机器学习分类器,输入实数值特征,每个特征乘以一个权重,再求和,把结果传到sigmoid函数中生成一个概率。设定一个阈值来做决策。
- 逻辑回归可以用于二分类或者多分类。
- 多分类逻辑回归使用softmax函数来计算概率。
- 权重和偏置使用带标签的训练集习得,方法是通过最小化损失函数,比如交叉熵损失函数。
- 最小化损失函数是一个凹函数优化问题,利用度下降等迭代算法来找到最优权值。
- 正则化用来避免过拟合。
- 逻辑回归还是最有用的分析工具之一,因为它能够清楚地发现每个特征的重要性。
5.10历史
逻辑回归来自于统计学,1960年代被用来做二元数据分析,尤其在医药领域应用普遍。到了70年代后期开始广泛用于语言学。