玩命加载中...
# 自己动手用python写梯度下降 五个小节,预计用时**30分钟**。 不用sklearn,只用numpy和pandas,从全批量梯度下降法出发,一步步教你随机梯度下降(SGD)和小批量梯度下降(mini-batch SGD)。 请打开您的电脑,按照步骤一步步完成。 本教程基于**Python 2.7**。 原创者:**<a href='http://sofasofa.io/user_profile.php?id=1001254'>染盘</a>** &nbsp;&nbsp;|&nbsp;&nbsp; 编辑校对:SofaSofa TeamC &nbsp;&nbsp;|&nbsp;&nbsp; 谢绝转载,违者侵权。 ---- ## 零、预备知识 ### 1. 什么是梯度(gradient) 简单地来说,多元函数的“导数”(derivative)就是梯度(gradient)。 比如说,一元函数$f(x)=(x-a)^2$的导数是 $$\frac{\partial f}{\partial x}=2(x-a).$$ 而$n$元函数$f(x_1,x_2,\cdots, x_n)$的梯度是一个长度为$n$的向量,向量中第$k$个元素为函数$f$对变量$x_k$的偏导数。 $$\nabla f(x_1, x_2,\cdots, x_n) = \left(\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2},\cdots, \frac{\partial f}{\partial x_n}\right)$$ 假设,我们有一个二元函数 $$f(x_1,x_2)=x_1^2+x_1x_2-3x_2$$ 那么$f$的梯度为 $$\nabla f = \left(\frac{\partial f}{\partial x\_1},\frac{\partial f}{\partial x\_2}\right)=\left(2x\_1+x\_2,x\_1-3\right)$$ 例如在点$(1,2)$,梯度$\nabla f$的取值为 $$\nabla f\_{(1,2)}=(2+2,1-3)=(4, -2)$$ ### 2. 什么是梯度下降法(Gradient Descent) 对于凸优化问题来说(不了解凸优化的同学可先移步[这里](http://sofasofa.io/forum_main_post.php?postid=1000369)),导数为0(梯度为0向量)的点,就是优化问题的解。 为了找到这个解,我们沿着梯度的反方向进行线性搜索,每次搜索的步长为某个特定的数值$\alpha$,直到梯度与0向量非常接近为止。上面描述的这个方法就是梯度下降法。迭代算法的步骤如下: * (1)当$i=0$,自己设置初始点$\textbf{x}^0=(x_1^0,x_2^0,\cdots, x_n^0)$,设置步长(也叫做学习率)$\alpha$,设置迭代终止的误差忍耐度$tol$。 * (2)计算目标函数$f$在点$\textbf{x}^i$上的梯度$\nabla f\_{\textbf{x}^i}$。 * (3)计算$\textbf{x}^{i+1}$,公式如下 $$\textbf{x}^{i+1} = \textbf{x}^{i} - \alpha \nabla f\_{\textbf{x}^i}$$ * (4)计算梯度$\nabla f\_{\textbf{x}^{i+1}}$。如果$&#92;|\nabla f\_{\textbf{x}^{i+1}}&#92;|\_2\leq tol$则迭代停止,最优解的取值为$\textbf{x}^{i+1}$;如果梯度的二范数大于$tol$,那么$i=i+1$,并返回第(3)步。 ### 3.梯度下降法在机器学习中的应用 在机器学习中,我们通常会有一个损失函数$L(\beta)$,其中向量$\beta=(\beta_0,\beta_1,\cdots,\beta_n)$是模型中的参数,我们需要找到最优的$\beta$来最小化损失函数$L(\beta)$。所以说,模型的训练过程也就是寻找最优解的过程。 <ul class="pagination"> <li class="active"><a href="#">第1页</a></li> <li><a href="2.php">第2页</a></li> <li><a href="3.php">第3页</a></li> <li><a href="4.php">第4页</a></li> <li><a href="5.php">第5页</a></li> <li><a href="6.php">第6页</a></li> </ul> <ul class="pager"> <!--<li class="previous"><a href="#"><b>&larr; 返回前一页</b></a></li>--> <li class="next"><a href="2.php"><b>进入下一页 &rarr;</b></a></li> </ul>