假设我们建立一个二分类模型。假设有两个人A、B在争论如何对一个新样本 x x x进行0-1二分类,他们两个分别对新样本进行打分,如果A的分数大于B的分数,则样本被预测为1,反之则被预测为0。
假设两人的打分分数可以通过线性回归进行预测建模
y 1 = θ 1 x + ϵ 1 , ϵ 1 ∼ N 1 ( 0 , δ ) y 2 = θ 2 x + ϵ 2 , ϵ 2 ∼ N 2 ( 0 , δ ) \begin{aligned} &y_{1}=\theta_{1} x+\epsilon_{1}, \epsilon_{1} \sim N_{1}(0, \delta) \\ &y_{2}=\theta_{2} x+\epsilon_{2}, \epsilon_{2} \sim N_{2}(0, \delta) \end{aligned} y1=θ1x+ϵ1,ϵ1∼N1(0,δ)y2=θ2x+ϵ2,ϵ2∼N2(0,δ)
这里两个模型的残差都服从高斯分布。
现在我们研究 y 1 y_1 y1和 y 2 y_2 y2的大小关系
y 1 − y 2 = ( θ 1 − θ 2 ) x + ( ϵ 1 − ϵ 2 ) y_{1}-y_{2}=\left(\theta_{1}-\theta_{2}\right) x+\left(\epsilon_{1}-\epsilon_{2}\right) y1−y2=(θ1−θ2)x+(ϵ1−ϵ2)
于是有
y ′ = θ ′ x + ϵ ′ , ϵ ′ ∼ N ( 0 , δ ) y^{\prime}=\theta^{\prime} x+\epsilon^{\prime}, \epsilon^{\prime} \sim N(0, \delta) y′=θ′x+ϵ′,ϵ′∼N(0,δ)
进一步,根据我们的假设,A的分数大于B的分数,则样本被预测为1,也就是 y ′ > 0 y^{\prime}>0 y′>0的情况
P ( y = 1 ) = P ′ ( θ ′ x + ϵ ′ > = 0 ) = 1 − P ′ ( ϵ ′ < − θ ′ x ) P(y=1)=P^{\prime}\left(\theta^{\prime} x+\epsilon^{\prime}>=0\right)=1-P^{\prime}\left(\epsilon^{\prime}<-\theta^{\prime} x\right) P(y=1)=P′(θ′x+ϵ′>=0)=1−P′(ϵ′<−θ′x)
所以问题就转化为了求 P ′ ( ϵ ′ < − θ ′ x ) P^{\prime}\left(\epsilon^{\prime}<-\theta^{\prime} x\right) P′(ϵ′<−θ′x),也就是高斯分布的累积分布函数。这种建模方式叫做prohit回归。
但是高斯分布的累积分布不可解析求出,用概率密度函数表示为 F ( x ; μ , σ ) = 1 σ 2 π ∫ − ∞ x exp ( − ( t − μ ) 2 2 σ 2 ) d t F(x ; \mu, \sigma)=\dfrac{1}{\sigma \sqrt{2 \pi}} \int_{-\infty}^{x} \exp \left(-\dfrac{(t-\mu)^{2}}{2 \sigma^{2}}\right) d t F(x;μ,σ)=σ2π1∫−∞xexp(−2σ2(t−μ)2)dt,我们只能大致看出高斯分布的累积分布函数长啥样
(source: https://www.wikiwand.com/zh-sg/%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83)
可见其形状与sigmoid函数非常类似,我们就直接用sigmoid函数近似表示它
P ( y = 1 ) = P ′ ( θ ′ x + ϵ ′ > = 0 ) = 1 − P ′ ( ϵ ′ < − θ ′ x ) = 1 − 1 1 + exp ( − z ) = 1 + exp ( − z ) − 1 1 + exp ( − z ) = 1 1 + exp z = 1 1 + exp ( − θ ′ x ) P(y=1)=P^{\prime}\left(\theta^{\prime} x+\epsilon^{\prime}>=0\right)=1-P^{\prime}\left(\epsilon^{\prime}<-\theta^{\prime} x\right)\\ =1-\dfrac{1}{1+\exp(-z)}=\dfrac{1+\exp(-z)-1}{1+\exp(-z)}\\ =\dfrac{1}{1+\exp{z}}=\dfrac{1}{1+\exp(-\theta^{\prime} x)} P(y=1)=P′(θ′x+ϵ′>=0)=1−P′(ϵ′<−θ′x)=1−1+exp(−z)1=1+exp(−z)1+exp(−z)−1=1+expz1=1+exp(−θ′x)1
这正是Logistic二分类表达式。
Logistic回归的损失函数是通过最大似然估计(存在即合理)得到的。这个损失函数叫做交叉熵。其实对于他的损失函数的推导,并不一定需要假设模型符合logistic回归。
假设 l l l表示(0, 1)标签, y y y表示样本预测的概率。则该样本存在的概率可表示为:
y l ( 1 − y ) 1 − l y^{l}(1-y)^{1-l} yl(1−y)1−l
也就是满足伯努利分布。
由最大似然估计,可得我们需要最小化如下函数
− ( l log y + ( 1 − l ) log ( 1 − y ) ) -(l \log y+(1-l) \log (1-y)) −(llogy+(1−l)log(1−y))
当标签 l = 1 l=1 l=1时, ( 1 − l ) log ( 1 − y ) ) = 0 (1-l) \log (1-y))=0 (1−l)log(1−y))=0,最小化公式等价于最小化 − log y -\log y −logy,即让 y → 1 y\rightarrow1 y→1.
当标签 l = 0 l=0 l=0时, l log y = 0 l \log y=0 llogy=0,最小化公式等价于最小化 − ( 1 − l ) log ( 1 − y ) -(1-l) \log (1-y) −(1−l)log(1−y),即让 y → 0 y\rightarrow0 y→0.
【注意最大似然估计时,我们其实是把所有样本的概率相加,也就是 ∑ i = 1 N y l ( 1 − y ) 1 − l \sum_{i=1}^{N}y^{l}(1-y)^{1-l} ∑i=1Nyl(1−y)1−l,然后取对数】
现在我们思考一个问题,如果我们选择下面这个损失函数,是否也满足上面的这种直觉性结论呢?
L o s s = − ( l − y ) 2 Loss = -(l-y)^{2} Loss=−(l−y)2
即 l = 1 l=1 l=1时, y → 1 y\rightarrow1 y→1, l = 0 l=0 l=0时, y → 0 y\rightarrow0 y→0。
当建立好模型后,最终需要对损失函数进行优化。这种对待优化的参数没有限制的优化问题叫做无约束优化问题。
min f ( x ) \min f(x) minf(x)
其中 x x x为待求参数
如果要理解梯度下降法,我们要从泰勒展开开始理解。针对 f ( x ) f(x) f(x)做一阶泰勒展开,有
f ( x ) = f ( x k ) + ∇ f ( x k ) T ( x − x k ) + o ( ∥ x − x k ∥ ) f(x)=f\left(x_{k}\right)+\nabla f\left(x_{k}\right)^{T}\left(x-x_{k}\right)+o\left(\left\|x-x_{k}\right\|\right) f(x)=f(xk)+∇f(xk)T(x−xk)+o(∥x−xk∥)
其中高阶量 o o o是在 ( x − x k ) (x-x_k) (x−xk)的前提下才趋向于0,如果 ( x − x k ) (x-x_k) (x−xk)太大,高阶量就会影响等式右边前两项。
如果我们把 x x x看做空间中的向量,那么 ( x − x k ) (x-x_k) (x−xk)也是向量,梯度 f ′ ( x k ) f^{\prime}(x_k) f′(xk)也是向量。我们可以把上式写为
f ( x ) ≈ f ( x k ) + λ ∗ d ∗ f ′ ( x k ) f\left(x\right) \approx f\left(x_{k}\right)+\lambda * \boldsymbol{d} * f^{\prime}\left(x_{k}\right) f(x)≈f(xk)+λ∗d∗f′(xk)
这里 d \boldsymbol{d} d表示沿着 x x x方向的单位向量, λ \lambda λ表示单位向量长度。根据向量乘积规则,我们有
f ( x ) ≈ f ( x k ) + λ ∗ ∣ d ∣ ∗ ∣ f ′ ( x k ) ∣ ∗ cos ( θ ) f\left(x\right) \approx f\left(x_{k}\right)+\lambda * |\boldsymbol{d}| *\left|f^{\prime}\left(x_{k}\right)\right| * \cos (\theta) f(x)≈f(xk)+λ∗∣d∣∗∣f′(xk)∣∗cos(θ)
这里 θ \theta θ表示梯度向量和 ( x − x k ) (x-x_k) (x−xk)这个向量的夹角。因为我们企图最小化 f ( x ) f(x) f(x),而 f ( x k ) = f ( x 0 ) f(x_k)=f(x_0) f(xk)=f(x0)随机初始化后模型的输出,这就意味着它与 λ , d \lambda, d λ,d一样也是个常量,如果要是整个式子最小,显然要让 θ = π , cos ( θ ) = − 1 \theta=\pi, \cos(\theta)=-1 θ=π,cos(θ)=−1,也就是 x k x_k xk无限靠近 x x x时,两个向量方向相反的时刻。此时我们有
d = − f ′ ( x k ) ∥ f ′ ( x k ) ∥ d=\frac{-f^{\prime}\left(x_{k}\right)}{\left\|f^{\prime}\left(x_{k}\right)\right\|} d=∥f′(xk)∥−f′(xk)
于是我们有
x − x k = λ ∗ d = λ ∗ − f ′ ( x k ) ∥ f ′ ( x k ) ∥ ⇒ x = x k − λ ∗ f ′ ( x k ) ∥ f ′ ( x k ) ∥ x-x_{k}=\lambda * d = \lambda * \frac{-f^{\prime}\left(x_{k}\right)}{\left\|f^{\prime}\left(x_{k}\right)\right\|}\\ \Rightarrow x=x_{k}-\lambda *\frac{f^{\prime}\left(x_{k}\right)}{\left\|f^{\prime}\left(x_{k}\right)\right\|} x−xk=λ∗d=λ∗∥f′(xk)∥−f′(xk)⇒x=xk−λ∗∥f′(xk)∥f′(xk)
又因为 ∥ f ′ ( x k ) ∥ = ∥ f ′ ( x 0 ) ∥ \left\|f^{\prime}\left(x_{k}\right)\right\|=\left\|f^{\prime}\left(x_{0}\right)\right\| ∥f′(xk)∥=∥f′(x0)∥是个常数,因为 x 0 x_{0} x0如果是随机初始化确定下来的,那么其梯度也肯定是常数。(比如线性回归使用梯度下降法的时候,第一轮我们随机初始化权重参数,此时这些参数是固定的),那么我们就可以把 λ \lambda λ与 ∥ f ′ ( x k ) ∥ = ∥ f ′ ( x 0 ) ∥ \left\|f^{\prime}\left(x_{k}\right)\right\|=\left\|f^{\prime}\left(x_{0}\right)\right\| ∥f′(xk)∥=∥f′(x0)∥合并为一个常数,也即是学习率。于是最后公式转化为
x = x k + 1 = x k − λ ∗ f ′ ( x k ) ∥ f ′ ( x k ) ∥ = x k − η ∗ f ′ ( x k ) = x k − η ∇ f ( x k ) T x=x_{k+1}=x_{k}-\lambda *\frac{f^{\prime}\left(x_{k}\right)}{\left\|f^{\prime}\left(x_{k}\right)\right\|}=x_{k}-\eta* f^{\prime}(x_{k})=x_{k}-\eta \nabla f\left(x_{k}\right)^{T} x=xk+1=xk−λ∗∥f′(xk)∥f′(xk)=xk−η∗f′(xk)=xk−η∇f(xk)T
这里 η \eta η的作用就是控制每一步移动的步长,因为我们说过,只有 x − x k x-x_{k} x−xk足够小,也就是当前一步和上一步的距离足够小,一阶泰勒展开的高阶量才会很小,不影响头两项。
对于梯度下降法要注意
【《机器学习实战》。sklearn代码分为三种封装方式,纯python写,C++写加python封装,fortran写加python(pyc)封装。】