- 线性模型 f ( x ) = w T x f(\bm{x}) = \bm{w}^T\bm{x} f(x)=wTx值域是 ( − ∞ , ∞ ) (-\infty,\infty) (−∞,∞)
- sigmoid函数表达式为: σ ( x ) = 1 1 + e − x \sigma(x) =\frac{1}{1+e^{-x}} σ(x)=1+e−x1
- 把线性回归模型的输出作为sigmoid函数的输入变成了逻辑回归模型:
y = σ ( f ( x ) ) = σ ( w T x ) = 1 1 + e − w T x y=\sigma(f(\bm{x})) = \sigma(\bm{w}^T\bm{x})=\frac{1}{1+e^{-\bm{w}^T\bm{x}}} y=σ(f(x))=σ(wTx)=1+e−wTx1 - Loss Function
衡量模型的输出与真实输出的差别
假设只有两个标签1和0, y n ∈ { 0 , 1 } y_n \in\{0, 1\} yn∈{0,1}。
把采集到的任何一组样本看做一个事件的话,这个事件发生的概率假设为p。
我们的模型y的值等于标签为1的概率也就是p。 P y = 1 = 1 1 + e − w T x = p P_{y=1}=\frac{1}{1+e^{-\bm{w}^T\bm{x}}} = p Py=1=1+e−wTx1=p
因为标签不是1就是0,因此标签为0的概率就是: P y = 0 = 1 − p P_{y=0} = 1-p Py=0=1−p。
我们把单个样本看做一个事件,那么这个事件发生的概率就是:
P ( y ∣ x ) = { p , y = 1 1 − p , y = 0 P(y|\bm{x})=\left\{ \begin{aligned} p, y=1 \\ 1-p,y=0 \end{aligned} \right. P(y∣x)={p,y=11−p,y=0
这个函数不方便计算,它等价于: P ( y i ∣ x i ) = p y i ( 1 − p ) 1 − y i P(y_i|\bm{x}_i) = p^{y_i}(1-p)^{1-{y_i}} P(yi∣xi)=pyi(1−p)1−yi
这个函数的含义,采集到了一个样本 ( x i , y i ) (\bm{x_i},y_i) (xi,yi)。对这个样本,它的标签是 y i y_i yi 的概率是 p y i ( 1 − p ) 1 − y i p^{y_i}(1-p)^{1-{y_i}} pyi(1−p)1−yi
(当y=1,结果是p;当y=0,结果是1-p)
如果我们采集到了一组数据一共N个,
{ ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) . . . ( x N , y N ) } \{(\bm{x}_1,y_1),(\bm{x}_2,y_2),(\bm{x}_3,y_3)...(\bm{x}_N,y_N)\} {(x1,y1),(x2,y2),(x3,y3)...(xN,yN)},
合成在一起的合事件发生的总概率就是将每一个样本发生的概率相乘,即采集到这组样本的概率:
P 总 = P ( y 1 ∣ x 1 ) P ( y 2 ∣ x 2 ) P ( y 3 ∣ x 3 ) . . . . P ( y N ∣ x N ) = ∏ n = 1 N p y n ( 1 − p ) 1 − y n \begin{aligned} P_{总} &= P(y_1|\bm{x}_1)P(y_2|\bm{x}_2)P(y_3|\bm{x}_3)....P(y_N|\bm{x}_N) \\ &= \prod_{n=1}^{N}p^{y_n}(1-p)^{1-y_n} \end{aligned} P总=P(y1∣x1)P(y2∣x2)P(y3∣x3)....P(yN∣xN)=n=1∏Npyn(1−p)1−yn
注意 P 总 P_{总 } P总是一个函数,并且未知的量只有 w \bm{w} w (在p里面)。
由于连乘很复杂,我们通过两边取对数来把连乘变成连加的形式,即:
F ( w ) = l n ( P 总 ) = l n ( ∏ n = 1 N p y n ( 1 − p ) 1 − y n ) = ∑ n = 1 N l n ( p y n ( 1 − p ) 1 − y n ) = ∑ n = 1 N ( y n l n ( p ) + ( 1 − y n ) l n ( 1 − p ) ) \begin{aligned} F(\bm{w})=ln(P_{总} ) &= ln(\prod_{n=1}^{N}p^{y_n}(1-p)^{1-y_n} ) \\ &= \sum_{n=1}^{N}ln (p^{y_n}(1-p)^{1-y_n}) \\ &= \sum_{n=1}^{N}(y_n ln (p) + (1-y_n)ln(1-p)) \end{aligned} F(w)=ln(P总)=ln(n=1∏Npyn(1−p)1−yn)=n=1∑Nln(pyn(1−p)1−yn)=n=1∑N(ynln(p)+(1−yn)ln(1−p))
其中, p = 1 1 + e − w T x p = \frac{1}{1+e^{-\bm{w}^T\bm{x}}} p=1+e−wTx1
这个函数 F ( w ) F(\bm{w}) F(w) 又叫做它的损失函数。
损失函数可以理解成衡量我们当前的模型的输出结果,跟实际的输出结果之间的差距的一种函数。这里的损失函数的值等于事件发生的总概率,我们希望它越大越好。但是跟损失的含义有点儿违背,因此也可以在前面取个负号。
- 最大似然估计MLE(Maximum Likelihood Estimation)
我们在真实世界中并不能直接看到概率是多少,我们只能观测到事件是否发生。也就是说,我们只能知道一个样本它实际的标签是1还是0。那么我们如何估计参数 w 跟b的值呢?
MLE就是一种估计参数 w 的方法。在这里如何使用MLE来估计 w 呢?
在上一节,我们知道损失函数F(w)是正比于总概率 P 总 P_{总} P总的,而 F ( w ) F(w) F(w)又只有一个变量 w 。即,通过改变 w的值,就能得到不同的总概率值 P 总 P_{总} P总。那么当我们选取的某个 w ∗ w^* w∗刚好使得总概率$ P_{总}$ 取得最大值的时候。我们就认为这个 w ∗ w^* w∗就是我们要求得的w的值,这就是最大似然估计的思想。
现在我们的问题变成了,找到一个 w ∗ w^* w∗ ,使得我们的总事件发生的概率,即损失函数 F ( w ) F(w) F(w)取得最大值,这句话用数学语言表达就是:
w ∗ = a r g max w F ( w ) = − a r g min w F ( w ) \bm{w^*} = arg\max_{w}F(\bm{w}) = -arg\min_{w}F(\bm{w}) w∗=argwmaxF(w)=−argwminF(w)
- 求F(w)的梯度 ∇ F ( w ) \nabla F(\bm{w}) ∇F(w)
梯度的定义
对于一个一维的标量x,它有导数 x’ 。
对一个多维的向量 x = ( x 1 , x 2 , x 3 , . . , x n ) \bm{x}=(x_1,x_2,x_3,..,x_n) x=(x1,x2,x3,..,xn)来说,它的导数叫做梯度,也就是分别对于它的每个分量求导数 x ′ = ( x 1 ′ , x 2 ′ , x 3 ′ , . . , x n ′ ) \bm{x}' = (x_1',x_2',x_3',..,x_n') x′=(x1′,x2′,x3′,..,xn′)
- 求梯度的推导过程
为了求出 F ( w ) F(\bm{w}) F(w)的梯度 ∇ F ( w ) \nabla F(\bm{w}) ∇F(w),
准备工作:
我们只要记住几个结论就行了:
对于一个矩阵 A \bm{A} A乘以一个向量的方程 A x \bm{A}\bm{x} Ax ,对向量 w \bm{w} w求导的结果是 A T \bm{A}^T AT 。
在这里我们把函数 A x \bm{A}\bm{x} Ax对 w \bm{w} w求梯度简单记作 ( A x ) ′ (\bm{A}\bm{x})' (Ax)′ 。因此 ( A x ) ′ = A T (\bm{A}\bm{x})' = \bm{A}^T (Ax)′=AT
, 推论是 ( x T A ) ′ = A (\bm{x}^T\bm{A})' = \bm{A} (xTA)′=A ,
我们把 x , w T \bm{x},\bm{w}^{T} x,wT代入,可以知道 ( w T x ) ′ = x (\bm{w}^T\bm{x})' = \bm{x} (wTx)′=x 。
然后求 1-p 的值:
1 − p = e − w T x 1 + e − w T x 1-p=\frac{e^{-\bm{w}^T\bm{x}} }{ 1+e^{-\bm{w}^T\bm{x}} } 1−p=1+e−wTxe−wTx
p是一个关于变量 w \bm{w} w的函数,我们对p求导,通过链式求导法则,慢慢展开可以得: p ′ = f ′ ( w ) = ( 1 1 + e − w T x ) ′ = − 1 ( 1 + e − w T x ) 2 ⋅ ( 1 + e − w T x ) ′ = − 1 ( 1 + e − w T x ) 2 ⋅ e − w T x ⋅ ( − w T x ) ′ = − 1 ( 1 + e − w T x ) 2 ⋅ e − w T x ⋅ ( − x ) = e − w T x ( 1 + e − w T x ) 2 ⋅ x = 1 1 + e − w T x ⋅ e − w T x 1 + e − w T x ⋅ x = p ( 1 − p ) x \begin{aligned}p' = f'(\bm{w})&= (\frac{1}{1+e^{-\bm{w}^T\bm{x}}} )' \\ &= -\frac{1}{ (1+e^{-\bm{w}^T\bm{x}} )^2} · ( 1+e^{-\bm{w}^T\bm{x}})' \\ &= -\frac{1}{ (1+e^{-\bm{w}^T\bm{x}} )^2} · e^{-\bm{w}^T\bm{x}} · (-\bm{w}^T\bm{x})' \\ &= -\frac{1}{ (1+e^{-\bm{w}^T\bm{x}} )^2} · e^{-\bm{w}^T\bm{x}} · (-\bm{x} ) \\ &= \frac{e^{-\bm{w}^T\bm{x}} }{ (1+e^{-\bm{w}^T\bm{x}} )^2} · \bm{x} \\ &= \frac{1}{ 1+e^{-\bm{w}^T\bm{x}} } · \frac{e^{-\bm{w}^T\bm{x}} }{ 1+e^{-\bm{w}^T\bm{x}} } · \bm{x} \\ &= p(1-p)\bm{x} \end{aligned} p′=f′(w)=(1+e−wTx1)′=−(1+e−wTx)21⋅(1+e−wTx)′=−(1+e−wTx)21⋅e−wTx⋅(−wTx)′=−(1+e−wTx)21⋅e−wTx⋅(−x)=(1+e−wTx)2e−wTx⋅x=1+e−wTx1⋅1+e−wTxe−wTx⋅x=p(1−p)x
上面都是我们做的准备工作,总之我们得记住: p ′ = p ( 1 − p ) x p' = p(1-p)\bm{x} p′=p(1−p)x, 并且可以知道 ( 1 − p ) ′ = − p ( 1 − p ) x (1-p)' = -p(1-p)\bm{x} (1−p)′=−p(1−p)x 。
下面我们正式开始对 F ( w ) F(\bm{w}) F(w)求导,
求导的时候请始终记住,我们的变量只有 w \bm{w} w,其他的什么 y n , x n y_n,\bm{x}_n yn,xn都是已知的,可以看做常数。
∇ F ( w ) = ∇ ( ∑ n = 1 N ( y n l n ( p ) + ( 1 − y n ) l n ( 1 − p ) ) ) = ∑ ( y n l n ′ ( p ) + ( 1 − y n ) l n ′ ( 1 − p ) ) = ∑ ( ( y n 1 p p ′ ) + ( 1 − y n ) 1 1 − p ( 1 − p ) ′ ) = ∑ ( y n ( 1 − p ) x n − ( 1 − y n ) p x n ) = ∑ n = 1 N ( y n − p ) x n \begin{aligned} \nabla F(\bm{w})& = \nabla ( \sum_{n=1}^{N}(y_n ln (p) + (1-y_n)ln(1-p)) )\\ &= \sum ( y_n ln'(p) + (1-y_n) ln'(1-p)) \\ &= \sum( (y_n \frac{1}{p}p')+(1-y_n)\frac{1}{1-p}(1-p)') \\ &= \sum(y_n(1-p)\bm{x}_n - (1-y_n)p\bm{x}_n) \\ &= \sum_{n=1}^{N}{(y_n-p)\bm{x}_n} \end{aligned} ∇F(w)=∇(n=1∑N(ynln(p)+(1−yn)ln(1−p)))=∑(ynln′(p)+(1−yn)ln′(1−p))=∑((ynp1p′)+(1−yn)1−p1(1−p)′)=∑(yn(1−p)xn−(1−yn)pxn)=n=1∑N(yn−p)xn
终于,我们求出了梯度 ∇ F ( w ) \nabla F(\bm{w}) ∇F(w)的表达式了,现在我们再来看看它长什么样子: ∇ F ( w ) = ∑ n = 1 N ( y n − p ) x n \begin{aligned} \nabla F(\bm{w})&= \sum_{n=1}^{N}{(y_n-p)\bm{x}_n} \end{aligned} ∇F(w)=n=1∑N(yn−p)xn
它是如此简洁优雅,这就是我们选取sigmoid函数的原因之一。当然我们也能够把p再展开,即: ∇ F ( w ) = ∑ n = 1 N ( y n − 1 1 + e − w T x n ) x n \begin{aligned} \nabla F(\bm{w})&= \sum_{n=1}^{N}{(y_n- \frac{1}{1+e^{-\bm{w}^T\bm{x}_n}} )\bm{x}_n} \end{aligned} ∇F(w)=n=1∑N(yn−1+e−wTxn1)xn
- 梯度下降法(GD)与随机梯度下降法(SGD)
现在我们已经解出了损失函数 F ( w ) F(\bm{w}) F(w)在任意 w \bm{w} w 处的梯度 ∇ F ( w ) \nabla F(\bm{w}) ∇F(w),可是我们怎么算出来 w ∗ \bm{w^*} w∗ 呢? 回到之前的问题,我们现在要求损失函数取最大值时候的 w ∗ \bm{w^*} w∗的值:
w ∗ = a r g max w F ( w ) \bm{w^*} = arg\max_{w}F(\bm{w}) w∗=argwmaxF(w)
梯度下降法(Gradient Descent),可以用来解决这个问题。核心思想就是先随便初始化一个 w 0 \bm{w}_0 w0 ,然后给定一个步长 η \eta η ,通过不断地修改 w t + 1 < − w t \bm{w}_{t+1} <- \bm{w}_{t} wt+1<−wt ,从而最后靠近到达取得最大值的点,即不断进行下面的迭代过程,直到达到指定次数,或者梯度等于0为止。 w t + 1 = w t + η ∇ F ( w ) \bm{w}_{t+1} = \bm{w}_t + \eta\nabla F(\bm{w}) wt+1=wt+η∇F(w)
随机梯度下降法(Stochastic Gradient Descent),如果我们能够在每次更新过程中,加入一点点噪声扰动,可能会更加快速地逼近最优值。在SGD中,我们不直接使用 ∇ F ( w ) \nabla F(\bm{w}) ∇F(w),而是采用另一个输出为随机变量的替代函数 G ( w ) G(\bm{w}) G(w) :
w t + 1 = w t + η G ( w ) \bm{w}_{t+1} = \bm{w}_t + \eta G(\bm{w}) wt+1=wt+ηG(w)
当然,这个替代函数 G ( w ) G(\bm{w}) G(w)需要满足它的期望值等于 ∇ F ( w ) \nabla F(\bm{w}) ∇F(w),相当于这个函数围绕着 ∇ F ( w ) \nabla F(\bm{w}) ∇F(w)的输出值随机波动。
在这里我先解释一个问题:为什么可以用梯度下降法?
因为逻辑回归的损失函数L是一个连续的凸函数(conveniently convex)。
这样的函数的特征是,它只会有一个全局最优的点,不存在局部最优。
对于GD跟SGD最大的潜在问题就是它们可能会陷入局部最优。然而这个问题在逻辑回归里面就不存在了,因为它的损失函数的良好特性,导致它并不会有好几个局部最优。当我们的GD跟SGD收敛以后,我们得到的极值点一定就是全局最优的点,因此我们可以放心地用GD跟SGD来求解。
好了,那我们要怎么实现学习算法呢?其实很简单,注意我们GD求导每次都耿直地用到了所有的样本点,从1一直到N都参与梯度计算。
∇ F ( w ) = ∑ n = 1 N ( y n − 1 1 + e − w T x n ) x n \begin{aligned} \nabla F(\bm{w})&= \sum_{n=1}^{N}{(y_n- \frac{1}{1+e^{-\bm{w}^T\bm{x}_n}} )\bm{x}_n} \end{aligned} ∇F(w)=n=1∑N(yn−1+e−wTxn1)xn
在SGD中,每次只要均匀地、随机选取其中一个样本 ( x i , y i ) (\bm{x_i},y_i) (xi,yi) ,用它代表整体样本,即把它的值乘以N,就相当于获得了梯度的无偏估计值,
即 E ( G ( w ) ) = ∇ F ( w ) E(G(\bm{w})) = \nabla F(\bm{w}) E(G(w))=∇F(w),因此SGD的更新公式为: w t + 1 = w t + η N ( y n − 1 1 + e − w T x n ) x n \bm{w}_{t+1} = \bm{w}_t + \eta N {(y_n- \frac{1}{1+e^{-\bm{w}^T\bm{x}_n}} )\bm{x}_n} wt+1=wt+ηN(yn−1+e−wTxn1)xn
这样我们前面的求和就没有了,同时 η N \eta N ηN 都是常数, N 的值刚好可以并入 η \eta η 当中,因此SGD的迭代更新公式为: w t + 1 = w t + η ( y n − 1 1 + e − w T x n ) x n \bm{w}_{t+1} = \bm{w}_t + \eta {(y_n- \frac{1}{1+e^{-\bm{w}^T\bm{x}_n}} )\bm{x}_n} wt+1=wt+η(yn−1+e−wTxn1)xn
其中 ( x i , y i ) (\bm{x_i},y_i) (xi,yi)是对所有样本随机抽样的一个结果。
- 逻辑回归的可解释性
逻辑回归最大的特点就是可解释性很强。
在模型训练完成之后,我们获得了一组n维的权重向量 w \bm{w} w 跟偏差 b。
对于权重向量 w \bm{w} w,它的每一个维度的值,代表了这个维度的特征对于最终分类结果的贡献大小。
假如这个维度是正,说明这个特征对于结果是有正向的贡献,那么它的值越大,说明这个特征对于分类为正起到的作用越重要。
对于偏差b (Bias),一定程度代表了正负两个类别的判定的容易程度。假如b是0,那么正负类别是均匀的。如果b大于0,说明它更容易被分为正类,反之亦然。
根据逻辑回归里的权重向量在每个特征上面的大小,就能够对于每个特征的重要程度有一个量化的清楚的认识,这就是为什么说逻辑回归模型有着很强的解释性的原因。
- 总结
逻辑回归模型: y = 1 1 + e − w T x y=\frac{1}{1+e^{-\bm{w}^T\bm{x}}} y=1+e−wTx1
其中我们不知道的量是 w \bm{w} w,
假设我们已经训练好了一个 w ∗ \bm{w}^* w∗, 我们用模型来判断 x i \bm{x}_i xi的标签呢?
很简单,直接将 x i \bm{x}_i xi代入y中,求出来的值就是 x i \bm{x}_i xi的标签是1的概率,如果概率大于0.5,那么我们认为它就是1类,否则就是0类。
那怎么得到 w ∗ \bm{w}^* w∗呢?
如果采用随机梯度下降法的话,我们首先随机产生一个 w \bm{w} w的初始值 w 0 \bm{w}_0 w0 ,然后通过公式不断迭代从而求得 w ∗ \bm{w}^* w∗的值:
w t + 1 = w t + η ( y n − 1 1 + e − w T x n ) x n \bm{w}_{t+1} = \bm{w}_t + \eta {(y_n- \frac{1}{1+e^{-\bm{w}^T\bm{x}_n}} )\bm{x}_n} wt+1=wt+η(yn−1+e−wTxn1)xn
每次迭代都从所有样本中随机抽取一个 ( x i , y i ) (\bm{x_i},y_i) (xi,yi) 来代入上述方程