赞
踩
梯度下降法是一种常用的迭代方法,其目的是让输入向量找到一个合适的迭代方向,使得输出值能达到局部最小值。在拟合线性回归方程时,我们把损失函数视为以参数向量为输入的函数,找到其梯度下降的方向并进行迭代,就能找到最优的参数值。
我们看下面这个二维平面:
也就是说我们要运用梯度下降法顺利且快速的找到全局最优解,也就是最低的地方,我们运用的公式如下:
这时候我们就会考虑如何才能够避免局部最优点的困扰:
方法1.不同的初始权值进行训练,选择最好的结果。假定误差曲面是个坑坑洼洼的曲面,我们尝试第一次降落到随机的起点,然后再开始摸索前进,也许会有运气好的一次,能够不落在某个小坑附近,多次尝试权重,可能会找到好的全局点。
方法2.使用随机梯度下降代替真正的梯度下降。可以这样理解,每次针对单个数据样例进行摸索前进时,本质上是在一个样例形成的误差曲面上摸索前进,而每个样例的曲面大体类似,又不尽相同,当你掉入一个坑里时,往往能被别的曲面拽出来。
方法3.模拟退火法(允许在当前点的一定范围内寻找其他点,选择最优的)
所谓的线性回归,也就是y和x的关系是线性的,就像我们平常见到的y=ax+b
在神经网络中表示的是y=wx+b,如果是多特征,我们的y就可以表示为:y=b+w1x1+w2x2+w3x3…+wnxn,其中n代表特征的个数。
搞懂这个代码对于计算loss和理解梯度下降帮助很大的,请仔细欣赏。
import numpy as np """ 主要为3步, 1.计算loss,通过定义了一个计算总损失的函数、 2.计算和更新梯度,定义了一个用于更新w和b的函数, 3.循环迭代,还有一个用于进行迭代的函数,这个迭代的函数会不断去执行更新w和b的函数, 然后把得到的w和b传入到总损失的函数去计算,最终得到一个最适宜的损失,损失函数的求解方法就是通过wx+b-y得到, 也就是说下一层的输入值减去上一层的输出值得到的差值就叫做loss。 """ # 计算总loss def compute_loss(w_start,b_start,points): w = w_start b = b_start n = float(len(points)) totleloss = 0 for i in range(len(points)): x = points[i,0] y = points[i,1] totleloss += ((w*x+b)-y)**2 return totleloss/n # 通过梯度下降法去更新w和b def gradient_descent_step(w_start,b_start,points,lr): n = len(points) for i in range(n): x = points[i,0] y = points[i,1] w_gradient = (2/n)*((w_start*x+b_start)-y)*x b_gradient = (2/n)*((w_start*x+b_start)-y) w_new = w_start - lr * w_gradient b_new = b_start - lr * b_gradient return w_new,b_new # 迭代训练,更新 def gradient_runner(w_start,b_start,points,lr,num): w = w_start b = b_start points = np.array(points) # print(points) for i in range(num): w,b = gradient_descent_step(w,b,points,lr) return w,b def run(): initial_w = 0 initial_b = 0 num = 1000 lr = 0.0001 points = np.genfromtxt('data.csv',delimiter=',') print('Start gradient descent at w = {0},b = {1},loss = {2}'.format(initial_w,initial_b,compute_loss(initial_w,initial_b,points))) print('running................') w,b=gradient_runner(initial_w,initial_b,points,lr,num) print('after {0} iterations :w = {1},b = {2},loss = {3}'.format(num,w,b,compute_loss(w,b,points))) if __name__ == '__main__': run()
运行结果:
在迭代次数为1000和学习率为0.0001的时候loss能达到一个最小值,相比以前的loss好了太多了,w和b也找到了最优值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。