logistic回归详解(三):梯度下降训练方法
项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步
在http://blog.csdn.net/bitcarmanlee/article/details/51165444中,我们已经对logistic回归的cost function做了完整的推导。如果是单个样本,其损失函数为:
cost(hθ(x),y)=−yilog(hθ(x))−(1−yi)log(1−hθ(x))cost(h_{\theta}(x),y) = -y_ilog(h_{\theta}(x)) - (1-y_i)log(1-h_{\theta}(x))cost(hθ(x),y)=−yilog(hθ(x))−(1−yi)log(1−hθ(x))
1.梯度下降的原理
现在问题就转化为一个无约束优化问题,即我们找出最小的θ\thetaθ,使得cost function达到最小。而在无约束优化问题中,最重要最基本的方法莫过于梯度下降(Gradient Descent)了。
描述梯度下降的资料很多,这里我选取wiki百科上的一部分内容:
梯度下降法,基于这样的观察:如果实值函数F(x)F(\mathbf{x})F(x)在点a\mathbf{a}a处可微且有定义,那么函数F(x)F(\mathbf{x})F(x)在a\mathbf{a}a点沿着梯度相反的方向$ -\nabla F(\mathbf{a})$ 下降最快。
因而,如果
b=a−γ∇F(a)\mathbf{b}=\mathbf{a}-\gamma\nabla F(\mathbf{a})b=a−γ∇F(a)
对于γ>0\gamma>0γ>0为一个够小数值时成立,那么F(a)≥F(b)F(\mathbf{a})\geq F(\mathbf{b})F(a)≥F(b)。
考虑到这一点,我们可以从函数F的局部极小值的初始估计x0\mathbf{x}_0x0出发,并考虑如下序列$ \mathbf{x}_0$, x1\mathbf{x}_1x1, x2\mathbf{x}_2x2, …\dots…使得
xn+1=xn−γn∇F(xn),n≥0\mathbf{x}_{n+1}=\mathbf{x}_n-\gamma_n \nabla F(\mathbf{x}_n),\ n \ge 0xn+1=xn−γn∇F(xn), n≥0。
因此可得到
F(x0)≥F(x1)≥F(x2)≥⋯F(\mathbf{x}_0)\ge F(\mathbf{x}_1)\ge F(\mathbf{x}_2)\ge \cdotsF(x0)≥F(x1)≥F(x2)≥⋯,
如果顺利的话序列(xn)(\mathbf{x}_n)(xn)收敛到期望的极值。注意每次迭代步长γ\gammaγ可以改变。
同样是来自wiki的一张示意图,清楚地描述了梯度下降的过程:
2.对损失函数求导并得出迭代公式
令单个样本的损失函数为:J(θ)=cost(hθ(x),y)=−yilog(hθ(x))−(1−yi)log(1−hθ(x))J(\theta)=cost(h_{\theta}(x),y) = -y_ilog(h_{\theta}(x)) - (1-y_i)log(1-h_{\theta}(x))J(θ)=cost(hθ(x),y)=−yilog(hθ(x))−(1−yi)log(1−hθ(x)),则:
∂∂θJ(θj)=−(y1g(θTx)−(1−y)11−g(θTx))∂∂θjg(θTx)=−(y1g(θTx)−(1−y)11−g(θTx))g(θTx)(1−g(θTx))∂∂θjθTx)=−(y(1−g(θTx))−(1−y)g(θTx))xj=(hθ(x)−y)xj\begin{aligned} \frac{\partial}{\partial\theta}J(\theta_j) & = -\left( y{\frac{1}{g(\theta^Tx)} - (1-y)\frac{1}{1-g(\theta^Tx)}} \right) \frac{\partial}{\partial\theta_j} g(\theta^Tx) \\ & = -\left( y{\frac{1}{g(\theta^Tx)} - (1-y)\frac{1}{1-g(\theta^Tx)}} \right) g(\theta^Tx) (1 - g(\theta^Tx)) \frac{\partial}{\partial\theta_j} \theta^Tx) \\ & = - \left( y(1-g(\theta^Tx)) - (1-y)g(\theta^Tx) \right) x_j \\ & = (h_\theta (x) - y)x_j \end{aligned} ∂θ∂J(θj)=−(yg(θTx)1−(1−y)1−g(θTx)1)∂θj∂g(θTx)=−(yg(θTx)1−(1−y)1−g(θTx)1)g(θTx)(1−g(θTx))∂θj∂θTx)=−(y(1−g(θTx))−(1−y)g(θTx))xj=(hθ(x)−y)xj
注意从第一步到第二步,用到了http://blog.csdn.net/bitcarmanlee/article/details/51165444里对logistic函数求导的结论。
如果对单个样本迭代,则表达式如下:
θj:=θj−α(hθ(xi)−yi)xji\theta_j:=\theta_j - \alpha(h_\theta(x^i) - y^i)x_j ^iθj:=θj−α(hθ(xi)−yi)xji
扩展到全体样本,表达式如下:
θj:=θj−∑imα(hθ(xi)−yi)xji\theta_j:=\theta_j - \sum_i ^m \alpha(h_\theta(x^i) - y^i)x_j ^iθj:=θj−i∑mα(hθ(xi)−yi)xji
3.迭代公式向量化(vectorization)
根据第二部分我们得到的最终θ\thetaθ相关的迭代公式为 :
θj:=θj−∑imα(hθ(xi)−yi)xji\theta_j:=\theta_j - \sum_i ^m \alpha(h_\theta(x^i) - y^i)x_j ^iθj:=θj−i∑mα(hθ(xi)−yi)xji 如果按照此公式操作的话,每计算一个θ\thetaθ需要 循环m次。为此,我们需要将迭代公式进行向量化。
首先我们将样本矩阵表示如下:
X=[x(1)x(2)⋯x(m)]=[x0(1)x1(1)⋯xn(1)x0(2)x1(2)⋯xn(2)⋯⋯⋯⋯x0(m)x1(m)⋯xn(m)]\mathbf{X} = \left [ \begin{matrix} x^{(1)} \\ x^{(2)} \\ \cdots \\ x^{(m)} \end{matrix} \right ] = \left [ \begin{matrix} x_0^{(1)} & x_1^{(1)} & \cdots & x_n^{(1)} \\ x_0^{(2)} & x_1^{(2)} & \cdots & x_n^{(2)} \\ \cdots & \cdots & \cdots & \cdots \\ x_0^{(m)} & x_1^{(m)} & \cdots & x_n^{(m)} \end{matrix} \right ] 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)⎦⎥⎥⎥⎤
y=[y(1)y(2)⋯y(m)]\mathbf{y} = \left [ \begin{matrix} y^{(1)} \\ y^{(2)} \\ \cdots \\ y^{(m)} \end{matrix} \right ] y=⎣⎢⎢⎡y(1)y(2)⋯y(m)⎦⎥⎥⎤
将要求的θ\thetaθ也表示成 矩阵的形式:
θ=[θ0θ1⋯θn]\mathbf{\theta} = \left [ \begin{matrix} \theta_0 \\ \theta_1 \\ \cdots \\ \theta_n \end{matrix} \right ] θ=⎣⎢⎢⎡θ0θ1⋯θn⎦⎥⎥⎤
将x⋅θx\cdot\thetax⋅θ的乘积记为A,有:
A=x⋅θ=[x0(1)x1(1)⋯xn(1)x0(2)x1(2)⋯xn(2)⋯⋯⋯⋯x0(m)x1(m)⋯xn(m)]⋅[θ0θ1⋯θm]=[θ0x0(1)θ1x1(1)⋯θnxn(1)θ0x0(2)θ1x1(2)⋯θnxn(2)⋯⋯⋯⋯θ0x0(m)θ1x1(m)⋯θnxn(m)]A = x\cdot\theta = \left [ \begin{matrix} x_0^{(1)} & x_1^{(1)} & \cdots & x_n^{(1)} \\ x_0^{(2)} & x_1^{(2)} & \cdots & x_n^{(2)} \\ \cdots & \cdots & \cdots & \cdots \\ x_0^{(m)} & x_1^{(m)} & \cdots & x_n^{(m)} \end{matrix} \right ] \cdot \left [ \begin{matrix} \theta_0 \\ \theta_1 \\ \cdots \\ \theta_m \end{matrix} \right ] = \left [ \begin{matrix} \theta_0x_0^{(1)} & \theta_1x_1^{(1)} & \cdots & \theta_nx_n^{(1)} \\ \theta_0x_0^{(2)} & \theta_1x_1^{(2)} & \cdots & \theta_nx_n^{(2)} \\ \cdots & \cdots & \cdots & \cdots \\ \theta_0x_0^{(m)} & \theta_1x_1^{(m)} & \cdots & \theta_nx_n^{(m)} \end{matrix} \right ] A=x⋅θ=⎣⎢⎢⎢⎡x0(1)x0(2)⋯x0(m)x1(1)x1(2)⋯x1(m)⋯⋯⋯⋯xn(1)xn(2)⋯xn(m)⎦⎥⎥⎥⎤⋅⎣⎢⎢⎡θ0θ1⋯θm⎦⎥⎥⎤=⎣⎢⎢⎢⎡θ0x0(1)θ0x0(2)⋯θ0x0(m)θ1x1(1)θ1x1(2)⋯θ1x1(m)⋯⋯⋯⋯θnxn(1)θnxn(2)⋯θnxn(m)⎦⎥⎥⎥⎤
将hθ(x)−yh_{\theta}(x)-yhθ(x)−y记为E:
E=hθ(x)−y=[g(A1)−y1g(A2)−y2⋯g(Am)−ym]=[e1e2⋯em]=g(A)−yE=h_{\theta}(x)-y= \left [ \begin{matrix} g(A^1) - y^1 \\ g(A^2) - y^2\\ \cdots \\ g(A^m) -y^m \end{matrix} \right ] = \left [ \begin{matrix} e^1 \\ e^2 \\ \cdots \\ e^m \end{matrix} \right ] = g(A) - y E=hθ(x)−y=⎣⎢⎢⎡g(A1)−y1g(A2)−y2⋯g(Am)−ym⎦⎥⎥⎤=⎣⎢⎢⎡e1e2⋯em⎦⎥⎥⎤=g(A)−y
由上面的式子可以看出,g(A)g(A)g(A)的参数是一个 m*1的矩阵,或者说是一个列向量。如果我们设计函数ggg的时候,支持传入一个列向量,并返回一个列向量,则hθ(x)−yh_{\theta}(x)-yhθ(x)−y可以一次计算得到结果。
回到我们的迭代公式,令j=0
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \theta_0: &=\t…
对于θj\theta_jθj,同理:
θj:=θj−α⋅(xj(1),xj(2),⋯,xj(n))⋅E\theta_j := \theta_j -\alpha \cdot(x_j^{(1)},x_j^{(2)},\cdots,x_j^{(n)})\cdot Eθj:=θj−α⋅(xj(1),xj(2),⋯,xj(n))⋅E
将其写成矩阵的表达式:
[θ0θ1⋯θm]:=[θ0θ1⋯θm]−α⋅[x0(1)x0(2)⋯x0(m)x1(1)x1(2)⋯x1(m)⋯⋯⋯⋯xn(1)xn(2)⋯xn(m)]⋅E=θ−α⋅xT⋅E\left [ \begin{matrix} \theta_0 \\ \theta_1 \\ \cdots \\ \theta_m \end{matrix} \right ] := \left [ \begin{matrix} \theta_0 \\ \theta_1 \\ \cdots \\ \theta_m \end{matrix} \right ] - \alpha \cdot \left [ \begin{matrix} x_0^{(1)} & x_0^{(2)} & \cdots & x_0^{(m)} \\ x_1^{(1)} & x_1^{(2)} & \cdots & x_1^{(m)} \\ \cdots & \cdots & \cdots & \cdots \\ x_n^{(1)} & x_n^{(2)} & \cdots & x_n^{(m)} \end{matrix} \right ] \cdot E = \theta-\alpha \cdot x^T \cdot E ⎣⎢⎢⎡θ0θ1⋯θm⎦⎥⎥⎤:=⎣⎢⎢⎡θ0θ1⋯θm⎦⎥⎥⎤−α⋅⎣⎢⎢⎢⎡x0(1)x1(1)⋯xn(1)x0(2)x1(2)⋯xn(2)⋯⋯⋯⋯x0(m)x1(m)⋯xn(m)⎦⎥⎥⎥⎤⋅E=θ−α⋅xT⋅E
所以最后的迭代公式为:θ=θ−α⋅xT⋅E\theta = \theta-\alpha \cdot x^T \cdot Eθ=θ−α⋅xT⋅E
4.几点需要注意的事项
1.x的矩阵表示方式里,上边的范围是m,表示样本的数量,下边的范围是n,表示每个样本变量的维度。整个样本矩阵的大小是mn。
2.如何快速理解θ\thetaθ的迭代公式?我自己总结的一个小技巧:
θ\thetaθ表示每一维特征的权重,所以它是n1的矩阵。xTx^TxT是nm,E是m1,这两个矩阵相乘,刚好得到一个n*1的矩阵,跟θ\thetaθ的大小是相吻合的!
5.批量梯度下降(Batch Gradient Descent)与随机梯度下降(Stochastic Gradient Descent SGD)
对于迭代公式θ=θ−α⋅xT⋅E\theta = \theta-\alpha \cdot x^T \cdot Eθ=θ−α⋅xT⋅E 最大的好处就是形式简单明了,直接将样本矩阵与残差矩阵带入迭代即可。而且这种方式是将所有的训练样本代入,最终所求得的解也是全局最优解,求解出来的参数将使损失函数最小。如果将所有样本矩阵带入进行计算,这就是所谓的批量梯度下降(BGD)。但在实际应用场景中,最大的问题就是样本矩阵可能非常大。比如大到放不进内存,比如大到进行一轮迭代需要的运算时间非常长,这个时候,批量梯度下降就不是那么好用了。这个时候,我们可以采用考虑随机梯度下降 (SGD)。
BGD是一次训练带入所有样本,SGD则是每来一次样本进行一次计算:
θj:=θj+α(yi−hθ(xi))xji\theta_j:=\theta_j + \alpha(y^i - h_\theta(x^i))x_j ^iθj:=θj+α(yi−hθ(xi))xji
i表示是第i个样本,j表示样本第j个维度。
SGD是通过每个样本来迭代更新。如果样本的数量很多,有可能才迭代了一小部分样本,就已经得到了θ\thetaθ的解。所以SGD的收敛速度可能比BGD要快,而且运算量小。但是SGD的问题是每次迭代并不是全局最优解的方向,尤其是遇到噪声数据,影响会比较大。有的时候SGD在最优解附近会存在比较明显的锯齿震荡现象,即损失函数的值会在最优解附近上下震荡一段时间才最终收敛。
logistic回归详解(三):梯度下降训练方法相关推荐
- 机器学习--详解基于梯度下降的Logistic回归算法原理
先给出Logistic回归的sigmod函数数学表达式: 很简单的表达式,再看看它的性质,当时,,因此 当时,,因此 Logistic回归之所以称为Logistic是因为只有两个状态即0和1,这也是数 ...
- 【西瓜书笔记】补充1:logistic回归及其损失函数,梯度下降推导
Logistic回归理论知识补充 建模流程 假设我们建立一个二分类模型.假设有两个人A.B在争论如何对一个新样本 x x x进行0-1二分类,他们两个分别对新样本进行打分,如果A的分数大于B的分数,则 ...
- 最优化算法数学详解之——梯度下降法和牛顿迭代法
目录 应用情景 为何不直接求解析解? 梯度下降法 牛顿迭代法 两种算法比较 应用情景 当我们有了一堆数据,需要用这堆数据构建模型时,首先需要确定模型中的变量,其次确定模型形式,最后需要确定模型中的参数 ...
- 线性回归及logistic回归详解
机器学习 线性回归 logistic回归 (主要参考 吴恩达机器学习) 线性回归 线性回归是机器学习中比较基本的一个算法.其基本思想大致可以理解为给定一个数据集,通过线性回归得到一条曲线,尽可能地去拟 ...
- logistic回归详解一:为什么要使用logistic函数
项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步 从线性分类器谈起 给定一些数据集合,他 ...
- Logistic Regression逻辑回归的损失函数与梯度下降训练
有一篇博文提到logistic regression的简单理解(Logistic Regression逻辑回归的简单解释).逻辑回归实际上是odds取对数后的反函数,其函数形式也称为sigmoid f ...
- DID会固定年份吗_倍分法DID详解 (三):多时点 DID (渐进DID) 的进一步分析
作者:王昆仑 (天津大学) E-mail: shawn0513@163.com 连享会专题课程:DSGE 模型及应用 连享会 DSGE 专题课程 这是连享会「倍分法(DID)专题推文」系列的第三篇文章 ...
- 套索回归详解 从零开始 从理论到实践
套索回归详解 从零开始 从理论到实践 一.套索回归的理解 二.sklearn的使用 2.1.方法.参数与属性 2.2.简单案例 一.套索回归的理解 套索回归与岭回归相似,只不过收缩惩罚项变成了可调超参 ...
- 岭回归详解 从零开始 从理论到实践
岭回归详解 从零开始 从理论到实践 一.岭回归的理解 1.1.LinearRegression的回顾 1.2.岭回归 - Ridge Regression 二.sklearn的使用 2.1.方法.参数 ...
- Android init.rc文件解析过程详解(三)
Android init.rc文件解析过程详解(三) 三.相关结构体 1.listnode listnode结构体用于建立双向链表,这种结构广泛用于kernel代码中, android源代码中定义了l ...
最新文章
- IBM全面拥抱Linux,为“认知商业”提供POWER
- 一步一步 Mac OS X 与 Windows 7 双系统共存 的“黑苹果” 电脑 安装 入门
- 剑指Offer:合并两个排序的链表【25】
- POJ - 2987 Firing(最大权闭合图)
- SharpZipLib使用示例
- 使用友盟进行apk的自动更新
- 参数调优为什么要采样_3年Java外包,内推阿里过关斩将,最后却倒在调优经验上! - Java架构师追风...
- My Ruby Blog
- java抽象类代码_java – 抽象类和通用代码
- Impala与Hive的关系
- 让FineUI数据绑定支持dynamic对象
- swift——富文本文字的简单使用
- 2021-08-31Flink 中的核心概念和基础考察
- 从零开始pytorch手写字母识别
- 【单片机】之MCS-51系列单片机硬件结构
- 你眼里的废品也许就是别人眼里的宝贝(生意)
- vue中使用语音提示
- hadoop2提交到Yarn: Mapreduce执行过程分析1
- ng-alain php,基于阿里出得ng-Alain搭建后台管理系统
- Android HAL原理实现 GPS HAL实现