概述
梯度降落算法在机器学习中非常宽泛。不论是在线性回归还是在逻辑回归中,它的次要目标是通过迭代来找到指标函数的最小值,以最小化损失函数。
梯度降落原理
山谷问题
梯度降落,简略的来说就是要找到最小的点,而所谓找到最小的点,就相似向山谷中走,每次都心愿找到那山谷中的最低点
,而后如何确定走到最低点的门路的问题。
当初假如,咱们并不能间接看到最低点
,只能看到本人四周的一小部分,要一步一步的找到最低点。
所以当初就以本人的地位为基准,找到最平缓
的方向(即切线方向),而后沿降落方向
走一步;再找到最平缓的方向
,再走一步。直到走到最低点。
梯度
梯度理论就是多变量微分的一般化:
梯度就是对每个变量进行微分,用<>
括起来,示意图梯度是个向量。
- 在
单变量
函数中,梯度就是该函数的微分,也就是切线的斜率。 - 在
多变量
函数中,梯度是一个向量,向量的方向示意梯度的方向
,即降落最快
的方向。
梯度降落
在损失函数中,个别状况下有两种参数:管制信号量的权重(w)
和调整函数与实在值之间的偏差(b)
。
而梯度降落
就是一直的调整权重w
和偏差b
的值,使得损失最小。
通过对梯度
的向量方向剖析,咱们晓得了降落的方向,然而每次要走多少
还不晓得。
这就须要定义一个新的概念:学习率()
其中i
示意权重的初始值,i+1
示意更新后的权重值。在梯度降落中,会反复这个式子屡次,而后直到损失函数收敛不变。
对于的抉择,不能太大,以防错过了最低点;也不能太小,使降落的速度迟缓。
梯度降落过程
1.循环所有样本数据
(1) 计算第i
个训练数据的权重
和偏差b
绝对于损失函数的梯度。于是咱们最终会失去每一个训练数据的权重和偏差的梯度值。
(2) 计算所有训练数据权重
的梯度的总和
。
(3) 计算所有训练数据偏差b
的梯度的总和
。
2.更新权重和偏差
(1) 应用下面第(2)、(3)
步所失去的后果,计算所有样本的权重
和偏差
的梯度的平均值
。
(2) 应用上面的式子,更新
每个样本的权重值
和偏差值
。
反复下面的过程,直到损失函数收敛
不变。
梯度降落demo
1.定义数据集
from numpy import *# 数据集大小 即20个数据点m = 20# x的坐标以及对应的矩阵X0 = ones((m, 1)) # 生成一个m行1列的向量,也就是x0,全是1X1 = arange(1, m+1).reshape(m, 1) # 生成一个m行1列的向量,也就是x1,从1到mX = hstack((X0, X1)) # 依照列重叠造成数组,其实就是样本数据# 对应的y坐标Y = array([ 3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12, 11, 13, 13, 16, 17, 18, 17, 19, 21]).reshape(m, 1)# 学习率alpha = 0.01
其中reshape()
函数将原数组
从新组织成一个m行1列
的二维数组
。
2.代价函数和梯度函数
# 定义代价函数def cost_function(theta, X, Y): diff = dot(X, theta) - Y # dot() 数组须要像矩阵那样相乘,就须要用到dot() return (1/(2*m)) * dot(diff.transpose(), diff) # 定义代价函数对应的梯度函数def gradient_function(theta, X, Y): diff = dot(X, theta) - Y return (1/m) * dot(X.transpose(), diff)
3.梯度降落计算
# 梯度降落迭代def gradient_descent(X, Y, alpha): theta = array([1, 1]).reshape(2, 1) gradient = gradient_function(theta, X, Y) while not all(abs(gradient) <= 1e-5): theta = theta - alpha * gradient gradient = gradient_function(theta, X, Y) return theta optimal = gradient_descent(X, Y, alpha)print('optimal:', optimal)print('cost function:', cost_function(optimal, X, Y)[0][0])
当梯度小于1e-5
时,示意这时候曾经达到谷底
。这时候迭代就不会获得比拟大的成果,所以退出循环,完结迭代。
4.画出图像
# 依据数据画出对应的图像def plot(X, Y, theta): import matplotlib.pyplot as plt ax = plt.subplot(111) # 绘制子图 ax.scatter(X, Y, s=30, c="red", marker="s") plt.xlabel("X") plt.ylabel("Y") x = arange(0, 21, 0.2) # x的范畴 y = theta[0] + theta[1]*x ax.plot(x, y) plt.show()plot(X1, Y, optimal)
5.效果图
失去一个样本数据的线性拟合。
参考:
https://zhuanlan.zhihu.com/p/68468520
https://blog.csdn.net/qq_41800366/article/details/86583789
https://www.w3cschool.cn/tensorflow_python/