12月23-24日
![](https://img-blog.csdnimg.cn/img_convert/f5287c9c534d4e53b6b1bd2f52657589.png;wxfrom=5&wx_lazy=1)
梯度下降法(Gradient Descent)是机器学习中最常用的优化方法之一,常用来求解目标函数的极值。
其基本原理非常简单:沿着目标函数梯度下降的方向搜索极小值(也可以沿着梯度上升的方向搜索极大值)。
但是如何调整搜索的步长(也叫学习率,Learning Rate)、如何加快收敛速度以及如何防止搜索时发生震荡却是一门值得深究的学问。接下来本文将分析第一个问题:学习率的大小对搜索过程的影响。全部源代码可在本人的GitHub:monitor1379(https://github.com/monitor1379/jianshu_blog/blob/master/scripts/gradient_descent_with_momentum_and_decay.py)中下载。
![](https://i-blog.csdnimg.cn/blog_migrate/0e79ae46f0e8462ba0e1935eec24c16b.png)
前言啰嗦完了,接下来直接上干货:如何编写梯度下降法。代码运行环境为Python 2.7.11 + NumPy 1.11.0 + Matplotlib 1.5.1。
首先先假设现在我们需要求解目标函数func(x) = x * x的极小值,由于func是一个凸函数,因此它唯一的极小值同时也是它的最小值,其一阶导函数 为dfunc(x) = 2 * x。
import numpy as np
import matplotlib.pyplot as plt
# 目标函数:y=x^2
def func(x): return np.square(x)
# 目标函数一阶导数:dy/dx=2*x
def dfunc(x): return 2 * x
接下来编写梯度下降法函数: