玩命加载中...
# 自己动手用python写梯度下降
五个小节,预计用时**30分钟**。
不用sklearn,只用numpy和pandas,从全批量梯度下降法出发,一步步教你随机梯度下降(SGD)和小批量梯度下降(mini-batch SGD)。
请打开您的电脑,按照步骤一步步完成。
本教程基于**Python 2.7**。
原创者:**染盘**
|
编辑校对:SofaSofa TeamC
|
谢绝转载,违者侵权。
----
## 零、预备知识
### 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}}$。如果$\|\nabla f\_{\textbf{x}^{i+1}}\|\_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)$。所以说,模型的训练过程也就是寻找最优解的过程。