对概率的预测
前面我们讲了线性分类和线性回归,这里让我们来思考另外一类问题——求概率问题。
比如说,我们根据一个人的既往病历,生活习惯,年龄等来判断一个人是否会得心肌梗塞。我们想要的答案不仅仅是一个简单的是或否,实际上我们希望知道的是得心肌梗塞的风险有多大。医生会根据病人的情况以及自己的经验做出很高危,高危,中等风险,低风险等判断,实际上这可以看做是一个概率问题,我们可以划定当得心肌梗塞的概率高于某个概率值时,我们认为是很高危,当处在某一个概率区间则认为是高危,以此类推。
那么,机器学习是否可以习得处理这一类问题的能力吗? 是的,我们可以用逻辑回归算法来处理这一类问题。
数学模型
我们之前介绍过的线性回归模型如下:
S ( x ) = ∑ i = 0 d x i ∗ w i S(x)=\sum_{i=0}^dx_i*w_i S(x)=∑i=0dxi∗wi
我们希望得到的输出是一个概率值,因此我们可以对
S
(
x
)
S(x)
S(x)再做一次如下变换,使得最终的输出结果落在0-1之间。
θ
(
S
)
=
e
s
1
+
e
s
\theta(S)=\frac{e^s}{1+e^s}
θ(S)=1+eses
上面这个函数的图像如下所示,可以看到输入S在
−
∞
-\infty
−∞到
+
∞
+\infty
+∞区间内,而输出
θ
(
S
)
\theta(S)
θ(S)则始终落在0到1之间。
由此变换得到的输出值是一个概率,而非是或否这样一个简单的结论,这个概率值被称为软阈值(soft threshold)。
衡量错误
让我们再回头看一下,应该如何来学习样本数据。依旧以“心肌梗塞发生概率预测问题”为例,我们得到的样本数据,包括每个病人的各种相关信息、是否发生心肌梗塞的实际结果。我们令1表示发生了心肌梗塞,0表示未发生心肌梗塞。
机器学习的目标是使预测结果尽可能的接近实际情况,我们可以用一个条件概率来概括上述问题,即求在输入参数
x
x
x已发生的情况下
y
y
y亦发生的概率
P
(
y
∣
x
)
P(y|x)
P(y∣x)。我们令
P
(
y
∣
x
)
P(y|x)
P(y∣x)表示如下:
P
(
y
∣
x
)
=
{
1
−
θ
(
s
)
.
.
.
y
=
0
θ
(
s
)
.
.
.
y
=
1
.
.
.
P(y|x) = \biggl\{^{\theta(s)... y = 1}_{1-\theta(s) ... y = 0}...
P(y∣x)={1−θ(s)...y=0θ(s)...y=1...(1)
其中, θ ( s ) = e s 1 + e s , s ( x , w ) = ∑ i = 0 d x i ∗ w i \theta(s)=\frac{e^s}{1+e^s}, s(x,w) = \sum_{i=0}^dx_i*w_i θ(s)=1+eses,s(x,w)=∑i=0dxi∗wi
此处 θ ( s ) \theta(s) θ(s)是发生心肌梗塞的概率。若病人实际发生了心肌梗塞( y = 1 y=1 y=1)时,我们令 P ( y ∣ x ) P(y|x) P(y∣x)为预测的心肌梗塞发生概率 θ ( s ) \theta(s) θ(s),且该概率应尽可能大。若该病人未发生心肌梗塞( y = 0 y=0 y=0),我们令 P ( y ∣ x ) P(y|x) P(y∣x)为 1 − θ ( s ) 1-\theta(s) 1−θ(s),即该病人未发心肌梗塞的概率,1- θ ( s ) \theta(s) θ(s)应当尽可能大,相当于 θ ( s ) \theta(s) θ(s)尽可能小。
总之,我们的问题最终归结为对与所有的训练样本 ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) (x^1,y^1),(x^2,y^2),...,(x^N,y^N) (x1,y1),(x2,y2),...,(xN,yN),求出一组W使得 P ( y ∣ x ) P(y|x) P(y∣x)最大化。
这个问题似乎很难直接求解,我们转而寻找它的一系列等价命题如下:
- 等价一
对 1 N ∏ j = 1 N P ( y j ∣ x j ) . . . \frac1N\prod_{j=1}^NP(y^j|x^j)... N1∏j=1NP(yj∣xj)...(2) 求最大值, N为训练样本总数。 - 等价二
对(2)式求最大值,等价于对 − 1 N l n ( ∏ j = 1 N P ( y j ∣ x j ) ) -\frac1Nln(\prod_{j=1}^NP(y^j|x^j)) −N1ln(∏j=1NP(yj∣xj))求最小值
说明: 此处我们对 P ( y j ∣ x j ) P(y^j|x^j) P(yj∣xj)求乘积,主要也是考虑对数的乘积可以化为和的对数。
因为 P ( y ∣ x ) P(y|x) P(y∣x)是一个分段函数,我们对它进行分段讨论。
- 当 y = 1 y=1 y=1时
− 1 N l n ( ∏ j = 1 N P ( y j ∣ x j ) ) -\frac1Nln(\prod_{j=1}^NP(y^j|x^j)) −N1ln(∏j=1NP(yj∣xj))
= − 1 N ∑ j = 1 N y j ∗ l n ( θ ( s ) ) . . . =-\frac1N\sum_{j=1}^Ny^j*ln(\theta(s))... =−N1∑j=1Nyj∗ln(θ(s))...(3)
- 同理,当 y = 0 y=0 y=0时
− 1 N l n ( ∏ j = 1 N P ( y j ∣ x j ) ) -\frac1Nln(\prod_{j=1}^NP(y^j|x^j)) −N1ln(∏j=1NP(yj∣xj))
= − 1 N ∑ j = 1 N ( 1 − y j ) ∗ l n ( 1 − θ ( s ) ) . . . =-\frac1N\sum_{j=1}^N(1-y^j)*ln(1-\theta(s))... =−N1∑j=1N(1−yj)∗ln(1−θ(s))...(4)
在此我们对这个分段函数用一个数学小技巧将分段函数统一到一个数学函数表达式中。
L
o
s
s
(
θ
,
y
)
=
−
1
N
∑
j
=
1
N
(
y
j
∗
l
n
(
θ
(
s
)
)
+
(
1
−
y
j
)
∗
l
n
(
1
−
θ
(
s
)
)
)
.
.
.
Loss(\theta,y) = -\frac1N\sum_{j=1}^N(y^j*ln(\theta(s))+(1-y^j)*ln(1-\theta(s)))...
Loss(θ,y)=−N1∑j=1N(yj∗ln(θ(s))+(1−yj)∗ln(1−θ(s)))...(5)
(5)这个函数被称为交叉熵,在机器学习中它通常被用作逻辑回归的损失函数。为了求得它的最小值,我们会采用梯度下降法。
梯度下降求最小值
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。—— [百度百科]
直观理解梯度下降
直观的来理解梯度下降算法,有点像盲人下山,我们先试探性的摸索自己站立位置周围,寻找到一个最为陡峭的方向,迈出一小步。然后,重复这个动作,一步一步向谷底走去,一直到我们向四周摸索,再也找不到向下的方向,我们就认为我们已经找到了谷底。
梯度下降的迭代计算步骤如下:
- 求损失函数的梯度
- 令 W ( 1 ) = W ( 0 ) − λ ∇ L o s s W(1) = W(0) -\lambda\nabla Loss W(1)=W(0)−λ∇Loss 令 W ( 1 ) = W ( 0 ) − γ ∇ L o s s W(1) = W(0) -\gamma\nabla Loss W(1)=W(0)−γ∇Loss
- 如果 W ( 1 ) − W ( 0 ) > 0 W(1)-W(0)>0 W(1)−W(0)>0,则重复如果 W ( 1 ) − W ( 0 ) > 0 W(1)-W(0)>0 W(1)−W(0)>0,则重复步骤1。否则,认为已经到达底部,停止。
损失函数求导
接下来,我们看一下如何计算这个损失函数的导数,使用链式法制求导过程如下。
L o s s ( θ , y ) = − 1 N ∑ j = 1 N ( y j ∗ l n ( θ ( s ) ) + ( 1 − y j ) ∗ l n ( 1 − θ ( s ) ) ) . . . Loss(\theta,y) = -\frac1N\sum_{j=1}^N(y^j*ln(\theta(s))+(1-y^j)*ln(1-\theta(s)))... Loss(θ,y)=−N1∑j=1N(yj∗ln(θ(s))+(1−yj)∗ln(1−θ(s)))...(5)
∂ L o s s ∂ θ = − y θ + 1 − y 1 − θ \frac{\partial Loss}{\partial \theta}=-\frac y\theta+\frac{1-y}{1-\theta} ∂θ∂Loss=−θy+1−θ1−y
d θ d s = θ ( 1 − θ ) \frac{d\theta}{ds}=\theta(1-\theta) dsdθ=θ(1−θ) 这可以由 θ \theta θ函数的对称性推导出来
∂ L o s s ∂ s = ∂ L o s s ∂ θ d θ d s = ( − y θ + 1 − y 1 − θ ) ∗ ( θ ( 1 − θ ) ) = θ − y \frac{\partial Loss}{\partial s}=\frac{\partial Loss}{\partial \theta}\frac{d\theta}{ds}=(-\frac y\theta+\frac{1-y}{1-\theta})*(\theta(1-\theta))=\theta-y ∂s∂Loss=∂θ∂Lossdsdθ=(−θy+1−θ1−y)∗(θ(1−θ))=θ−y
d s d w = x \frac{ds}{dw}=x dwds=x
∂ L o s s ∂ w = ∂ L o s s ∂ θ d θ d s d s d w = ( θ − y ) ∗ x \frac{\partial Loss}{\partial w}=\frac{\partial Loss}{\partial \theta}\frac{d\theta}{ds}\frac{ds}{dw}=(\theta-y)*x ∂w∂Loss=∂θ∂Lossdsdθdwds=(θ−y)∗x
最后,令 W ′ = W − γ ∂ L ∂ w W' = W - \gamma\frac{\partial L}{\partial w} W′=W−γ∂w∂L
比较 W ′ W' W′与 W W W的值,若 W ′ W' W′小于 W W W则重复以上步骤直到 W ′ = W W'=W W′=W。
学习率的选择
梯度下降算法中的步长
γ
\gamma
γ被称为学习率(learning rate)。如果选择步长过小,则下降的速度太慢,如下图右图。如果选择步长过大,则很有可能会越过极值点,在极值点周围震荡。
我们期望的是,在下降的初期可以步伐大一些,而后期则步伐变小,以防错过了极值点。我们可以使用一个衰减的学习率,来获得这种效果。具体的方法,在后面介绍神经网络时会说到。
逻辑回归总结
- 初始化权重值W(0)
- 对于 t = 0 , 1 , 2 , . . . . t=0, 1, 2, .... t=0,1,2,....
- 计算损失函数的梯度 ∇ L o s s \nabla Loss ∇Loss
- 更新权重值 W ( t + 1 ) = W ( t ) − γ ∇ L o s s W(t+1)=W(t)-\gamma\nabla Loss W(t+1)=W(t)−γ∇Loss
- 比较 W ( t + 1 ) W(t+1) W(t+1)与 W ( t ) W(t) W(t)的值,若不等则继续重复3, 4步
- 返回 W W W值