版权声明:本作品采用知识共享 署名-非商业性使用 3.0 中国大陆 许可协议进行许可。 https://blog.csdn.net/jinping_shi/article/details/87909567
有一篇博文提到logistic regression的简单理解(Logistic Regression逻辑回归的简单解释)。逻辑回归实际上是odds取对数后的反函数,其函数形式也成为sigmoid function,sigmoid的原义为『像S的形状』。文中最后给出了逻辑回归的表达式:
h(α)=1+e−α1
α可以用任意函数来代替,一般使用线性函数:
α(θ,x)=θ0x0+θ1x1+...+θnxn。
为了方便叙述,改写一下符号:
hθ(x)=g(θTx)=1+e−θTx1(1)
其中粗体
x是已知的数据(样本,输入),粗体
θT是参数。机器学习即通过已知样本
x和对应的label
y来求解(估计)参数
θT。
损失函数
逻辑回归使用对数损失函数:
L(Y,P(Y∣X))=−log(P(Y∣X))
对数损失函数直接看函数形式不是很直观,毕竟其它损失函数都可以直接从形式上看出『预测时与真实值之间的差异』这样的含义(绝对值损失,平方差损失等),对数损失函数第一眼难以看到这样的含义。
实际上对数损失函数来源于极大似然估计。
P(Y∣X)的意思是在样本已知(即
X)的情况下,分类正确(类别为
Y)的概率。
P(Y∣X)越大表示被正确分类的概率越大,取对数再取反那就是最小,符合损失函数的定义。通俗来讲,一堆参数在一堆数据下的似然值,就是每一条数据(每一条样本)在这一组参数下的条件概率之积,取个对数变成条件概率之和,再取个负号求反就得到了对数损失函数。
逻辑回归的损失函数形式也完全可以从极大似然估计的过程中得到,二者是等价的。
逻辑回归本身用于处理二分类问题。对数损失函数中的
h(Y∣X)就是sigmoid函数
hθ(x)。为了综合
Y=1和
Y=0两个类别的损失,基于对数损失函数,逻辑回归的损失函数可以写成如下形式:
L(hθ(x),y)={−log(hθ(x))−log(1−hθ(x))y=1y=0
为了方便,上式可以改写成一个式子:
L(hθ(x),y)=−ylog(hθ(x))−(1−y)log(1−hθ(x))(2)
(2)式就是逻辑回归的损失函数的形式。如果
y=1,loss会计算上式中的前半部分,如果
y=0,loss计算上式的后半部分。无论0或1,只要分类错误,loss都会变得很大。
下面推导逻辑回归的极大似然估计,最终可以看到,极大似然估计与(2)式是等价的。
前面提到,
P(Y∣X)=hθ(x)。逻辑回归的假设是伯努利分布,label有
y=0和
y=1两种情况。伯努利分布的概率密度函数
f(x)=px(1−p)(1−x),套用至逻辑回归,就得到逻辑回归的概率密度函数:
f(x)=P(y=1∣x)y(1−P(y=1∣x))(1−y)
其中
P(y=1∣x)=hθ(x)
那么似然函数可以写成连乘的形式:
L(θ)=i=1∏mP(y=1∣xi)yi(1−P(y=1∣xi))(1−yi)
两边取以e为底的对数,得到对数似然函数:
lnL(θ)=i=1∑myilnP(y=1∣xi)+(1−yi)ln(1−P(y=1∣xi))=i=1∑myilnhθ(xi)+(1−yi)ln(1−hθ(xi))(3)
(3)式的形式和(2)式是等价的,只不过对数上一个取log一个取ln。因此才会有逻辑回归的损失函数是从极大似然估计推导而来的说法。
梯度下降法训练
梯度下降法训练需要先将损失函数对参数求导,得到参数的迭代公式。
损失函数求导
逻辑回归的sigmoid函数有很多特点,这些特点在数学上给我们处理数据带来许多方便。下面给出sigmoid函数的求导过程,在对损失函数求导时会用到以下结论。
令
g(z)=1+e−z1,
g′(z)=∂z∂1+e−z1=−(1+e−z)21∂z∂e−z=(1+e−z)2e−z=(1−1+e−z1)1+e−z1=g(z)(1−g(z))(4)
(2)式的逻辑回归损失函数对参数
θ求导。求导时,我们先对单个样本的第
j个参数
θj求导(即第j维特征),并且将(2)式中的对数取以e为底的对数。
∂θj∂L(θ)=−yg(θTx)1∂θj∂g(θTx)+(1−y)1−g(θTx)1∂θj∂g(θTx)=[(1−y)1−g(θTx)1−yg(θTx)1]∂θj∂g(θTx)=[(1−y)1−g(θTx)1−yg(θTx)1]g(θTx)(1−g(θTx))∂θj∂θTx=[(1−y)1−g(θTx)1−yg(θTx)1]g(θTx)(1−g(θTx))xj=(g(θTx)−y)xj(5)
上式即为第j个参数的偏导数。求出所有n个参数的偏导写成向量形式便得到了梯度的表达式。
在更新第j个参数时,我们是沿梯度下降最快的方向,所以(5)式会添加负号,同时为了控制更新的幅度(步长),会在前面乘以一个系数
α,即学习率,此时得到单个样本的参数
θj的更新迭代表达式:
θj:=θj−α(g(θTx)−y)xj(6)
当使用所有样本时,如果样本数量为m,就将所有样本的更新求和,更新迭代表达式如下:
θj:=θj−αi=1∑m(g(θTx(i))−y(i))xj(i)(7)
参数迭代表达式的向量化表示
(7)式就是某个参数的迭代表达式,如果完全按照(7)式的形式写程序,更新一个参数需要循环m次,但是如果写成矩阵的形式,写程序时用矩阵的数据结构,计算就会方便很多。
先对样本空间矩阵化,假设有
m个样本,
n+1维特征,用大写的粗体
X来表示样本。上标表示第几个样本,下标表示第几维特征。
X=⎣⎢⎢⎢⎡x(1)x(2)⋮x(m)⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡x0(1)x0(2)⋮x0(m)x1(1)x1(2)x1(m)⋯⋯⋯xn(1)xn(2)xn(m)⎦⎥⎥⎥⎥⎤(8)
y=⎣⎢⎡y(1)⋮y(m)⎦⎥⎤(9)
参数
θ的矩阵化表示如下:
θT=⎣⎢⎡θ0⋮θn⎦⎥⎤(10)
令
A=θTX:
A=θTX=⎣⎢⎡θ0⋮θn⎦⎥⎤⋅⎣⎢⎢⎢⎢⎡x0(1)x0(2)⋮x0(m)x1(1)x1(2)x1(m)⋯⋯⋯xn(1)xn(2)xn(m)⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡θ0x0(1)θ0x0(2)⋮θ0x0(m)θ1x1(1)θ1x1(2)θ1x1(m)⋯⋯⋯θnxn(1)θnxn(2)θnxn(m)⎦⎥⎥⎥⎥⎤(11)
令
E=g(θTX)−y:
E=g(θTX)−y=⎣⎢⎢⎢⎡g(A(1))−y(1)g(A(2))−y(2)⋮g(A(m))−y(m)⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡e(1)e(2)⋮e(m)⎦⎥⎥⎥⎤(12)
将(11)~(12)式带入(7)式:
θj:=θj−αi=1∑m(g(θTx(i))−y(i))xj(i):=θj−αi=1∑me(i)xj(i):=θj−α(xj(0),xj(1),⋯,xj(m))⋅(e(0),e(1),⋯,e(m))T:=θj−α(xj(0),xj(1),⋯,xj(m))E
对所有参数
θ,按照上式的形式,结合(8)~(12)式,可以写成矩阵的形式:
θ:=θ−αXTE(13)
(13)式中,
XT是
n+1行
m列,
E是
m行1列,相乘得到的结果是
n+1行1列,与
θ的维度相同,perfect!
批量梯度下降(BGD,Batch Gradient Descent)
批量梯度下降指的是更新参数时,计算所有样本,步骤如下:
-
求出当前迭代位置参数的梯度
(5)式求的是第j个参数的偏导,参数的梯度就是:
(∂θ0∂J(θ),∂θ1∂J(θ),⋯,∂θn∂J(θ))
-
确定对所有的
θj,沿梯度下降的距离是否都小于预先确定的阈值
ϵ,如果小于
ϵ,算法停止,否则,进入第3步
-
根据(7)式,使用所有样本(
m个样本),更新所有参数,需循环m次。如果使用(13)式,就不需要循环,效率会高一点。所有参数更新完成后,返回第1步,开始下一轮迭代
伪代码如下:
epsilon = 0.001 // 新旧梯度的距离,迭代停止条件之一
max_iter = 1000 // 最大迭代次数,迭代停止条件之一
distance = 100
iter_idx = 0
alpha = 0.001 // 学习率
theta = zeros() // 初始化参数
theta_old = theta
m, n = init(X_train, y_train, theta_old) // 初始化各参数,并返回样本个数m和参数个数n
while distance > epsilon or iter_idx < max_iter:
'''
根据(7)式循环所有样本更新参数
'''
for i in range(m):
theta += update(theta_old)
distance = g_distance(theta, theta_old)
iter_idx += 1
theta_old = theta
随机梯度下降(SGD,Stochastic Gradient Descent)
上述BGD中,使用了所有样本计算更新参数。实际应用中,样本数量往往非常大,如点击率预测,样本可以达到千万数量级。这种情况下BGD有个明显问题就是计算速度比较慢。相对于BGD使用所有样本参与计算,SGD每次只用一个样本来计算。每次迭代使用一个样本,可能会出现样本还没有使用完就已经收敛的情况,因此速度会比较快。但因为并没有用到整个样本空间,这时候收敛是不是达到全局最优解了呢?不一定……
小批量梯度下降(MBGD,Mini-Batch Gradient Descent)
BGD存在效率问题,SGD存在全局最优解问题,因此有一个结合两种方法的训练方法MBGD。MBGD的训练步骤如下:
- 选择
k个训练样本(一共有
m个训练样本)
- 在这
k个样本中进行
k次迭代,每次迭代只使用一个样本(即SGD)
-
k次迭代得到
k个梯度,对这
k个梯度加权求和(比如取平均)的结果来更新参数
- 重复以上步骤,直到收敛
通常第1步是随机选取
k个样本,一般程序中会按顺序从训练数据中取batch,此时随机的过程需要在制作训练数据时保证,只要打乱训练数据的顺序就可以。
Reference
- 梯度下降小结
- logistic回归详解(三)
- Logistic Regression逻辑回归的简单解释
- 逻辑回归