项目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)=−yi​log(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)=−yi​log(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​​⎦⎥⎥⎤​=⎣⎢⎢⎢⎡​θ0​x0(1)​θ0​x0(2)​⋯θ0​x0(m)​​θ1​x1(1)​θ1​x1(2)​⋯θ1​x1(m)​​⋯⋯⋯⋯​θn​xn(1)​θn​xn(2)​⋯θn​xn(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θ表示每一维特征的权重,所以它是n
1的矩阵。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回归详解(三):梯度下降训练方法相关推荐

  1. 机器学习--详解基于梯度下降的Logistic回归算法原理

    先给出Logistic回归的sigmod函数数学表达式: 很简单的表达式,再看看它的性质,当时,,因此 当时,,因此 Logistic回归之所以称为Logistic是因为只有两个状态即0和1,这也是数 ...

  2. 【西瓜书笔记】补充1:logistic回归及其损失函数,梯度下降推导

    Logistic回归理论知识补充 建模流程 假设我们建立一个二分类模型.假设有两个人A.B在争论如何对一个新样本 x x x进行0-1二分类,他们两个分别对新样本进行打分,如果A的分数大于B的分数,则 ...

  3. 最优化算法数学详解之——梯度下降法和牛顿迭代法

    目录 应用情景 为何不直接求解析解? 梯度下降法 牛顿迭代法 两种算法比较 应用情景 当我们有了一堆数据,需要用这堆数据构建模型时,首先需要确定模型中的变量,其次确定模型形式,最后需要确定模型中的参数 ...

  4. 线性回归及logistic回归详解

    机器学习 线性回归 logistic回归 (主要参考 吴恩达机器学习) 线性回归 线性回归是机器学习中比较基本的一个算法.其基本思想大致可以理解为给定一个数据集,通过线性回归得到一条曲线,尽可能地去拟 ...

  5. logistic回归详解一:为什么要使用logistic函数

    项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步 从线性分类器谈起 给定一些数据集合,他 ...

  6. Logistic Regression逻辑回归的损失函数与梯度下降训练

    有一篇博文提到logistic regression的简单理解(Logistic Regression逻辑回归的简单解释).逻辑回归实际上是odds取对数后的反函数,其函数形式也称为sigmoid f ...

  7. DID会固定年份吗_倍分法DID详解 (三):多时点 DID (渐进DID) 的进一步分析

    作者:王昆仑 (天津大学) E-mail: shawn0513@163.com 连享会专题课程:DSGE 模型及应用 连享会 DSGE 专题课程 这是连享会「倍分法(DID)专题推文」系列的第三篇文章 ...

  8. 套索回归详解 从零开始 从理论到实践

    套索回归详解 从零开始 从理论到实践 一.套索回归的理解 二.sklearn的使用 2.1.方法.参数与属性 2.2.简单案例 一.套索回归的理解 套索回归与岭回归相似,只不过收缩惩罚项变成了可调超参 ...

  9. 岭回归详解 从零开始 从理论到实践

    岭回归详解 从零开始 从理论到实践 一.岭回归的理解 1.1.LinearRegression的回顾 1.2.岭回归 - Ridge Regression 二.sklearn的使用 2.1.方法.参数 ...

  10. Android init.rc文件解析过程详解(三)

    Android init.rc文件解析过程详解(三) 三.相关结构体 1.listnode listnode结构体用于建立双向链表,这种结构广泛用于kernel代码中, android源代码中定义了l ...

最新文章

  1. IBM全面拥抱Linux,为“认知商业”提供POWER
  2. 一步一步 Mac OS X 与 Windows 7 双系统共存 的“黑苹果” 电脑 安装 入门
  3. 剑指Offer:合并两个排序的链表【25】
  4. POJ - 2987 Firing(最大权闭合图)
  5. SharpZipLib使用示例
  6. 使用友盟进行apk的自动更新
  7. 参数调优为什么要采样_3年Java外包,内推阿里过关斩将,最后却倒在调优经验上! - Java架构师追风...
  8. My Ruby Blog
  9. java抽象类代码_java – 抽象类和通用代码
  10. Impala与Hive的关系
  11. 让FineUI数据绑定支持dynamic对象
  12. swift——富文本文字的简单使用
  13. 2021-08-31Flink 中的核心概念和基础考察
  14. 从零开始pytorch手写字母识别
  15. 【单片机】之MCS-51系列单片机硬件结构
  16. 你眼里的废品也许就是别人眼里的宝贝(生意)
  17. vue中使用语音提示
  18. hadoop2提交到Yarn: Mapreduce执行过程分析1
  19. ng-alain php,基于阿里出得ng-Alain搭建后台管理系统
  20. Android HAL原理实现 GPS HAL实现

热门文章

  1. centos7下mongoDB安装和配置
  2. 了解和熟悉数据库相关知识
  3. 【内购篇】5 分钟教你成为会赚钱的独立开发者
  4. 理顺8个版本vue的区别
  5. 23.3. DELETE
  6. webpack编译流程漫谈
  7. inux系统磁盘管理基础知识及总结
  8. 您知道数据中心的最佳温度是多少吗?
  9. C++ primer第一章 C++概述 纪要
  10. java 对excel指定单元格的数据修改后并输出到指定文件夹