PyTorch【6】-线性回归_SGD_动量梯度下降

本篇是一个练手项目,目的在于:

1. 熟悉 pytorch

2. 实现 SGD 与 动量梯度下降,并对比收敛性

手动实现线性回归模型,一个很简单的模型,不多介绍,直接上代码

import torch as t
import matplotlib.pylab as plt

### 制造数据
def make_data():
    # y = 2x+3
    x = t.rand(1, 10) * 20
    y = x * 2 + 3 + t.randn(1, 10)
    return x, y

### 初始化参数
t.manual_seed(10000)    ### 随机种子
w = t.rand(1, 1)
b = t.rand(1, 1)

### 动量梯度的初始值
w0 = 0
b0 = 0

lr = 0.001
loss_record = []
for i in range(10000):
    x_t, y_t = make_data()
    y_p = t.matmul(w, x_t) + b

    loss = t.pow(y_p - y_t, 2) * 0.5
    loss = t.mean(loss)         ### 可 sum 可 mean,一般和 下面的 grad_b 对应
    loss_record.append(loss)

    ### 手动求导,计算梯度
    ## 注意这里对 (yp-yt)^2 求导,是 (yp-yt)x,如果是对 (yt-yp)^2 求导,是 -(yt-yp)x
    grad_w = t.matmul(y_p - y_t, x_t.t())       ### t() 转置
    grad_b = t.mean(y_p - y_t)

    ### SGD 参数更新
    # w -= lr * grad_w
    # b -= lr * grad_b

    ### 动量梯度下降的参数更新,收敛效果比 SGD 好很多
    grad_w_new = 0.8 * w0 + grad_w
    w.sub_(lr * grad_w)
    w0 = grad_w     ### 记住本次梯度,作为下次的 w0,这里只是记了上次,可以自己设定计前几次,或者计之前全部
    grad_b_new = 0.8 * b0 + grad_b
    b.sub_(lr * grad_b_new)
    b0 = grad_b

print(w, b)
plt.plot(loss_record)
plt.show()

下面我把学习率变得很低,并且把 动量梯度下降中 的只记录上次 梯度改为 记录之前全部梯度

lr = 0.0000001

grad_w = 0.9 * w0 + grad_w
w.sub_(lr * grad_w)
w0 = grad_w     ### 计之前全部
grad_b = 0.9 * b0 + grad_b
b.sub_(lr * grad_b)
b0 = grad_b

其他不变,对比下 SGD 与动量梯度的收敛性

左边 SGD, 右边 动量梯度下降

原文地址:https://www.cnblogs.com/yanshw/p/12208296.html

时间: 2024-08-30 14:39:06

PyTorch【6】-线性回归_SGD_动量梯度下降的相关文章

【零基础】神经网络优化之动量梯度下降

一.序言 动量梯度下降也是一种神经网络的优化方法,我们知道在梯度下降的过程中,虽然损失的整体趋势是越来越接近0,但过程往往是非常曲折的,如下图所示: 特别是在使用mini-batch后,由于单次参与训练的图片少了,这种“曲折”被放大了好几倍.前面我们介绍过L2和dropout,它们要解决的也是“曲折”的问题,不过这种曲折指的是求得的W和b过于拟合训练数据,导致求解曲线很曲折.动量梯度下降所解决的曲折指的是求得的dw.db偏离正常值导致成本时高时低,求得最优W和b的过程变慢. 二.指数加权平均 动

多变量线性回归时使用梯度下降(Gradient Descent)求最小值的注意事项

梯度下降是回归问题中求cost function最小值的有效方法,对大数据量的训练集而言,其效果要 好于非迭代的normal equation方法. 在将其用于多变量回归时,有两个问题要注意,否则会导致收敛速度小,甚至无法收敛. 1. 特征均一化(Feature Scaling) 当特征量多时,需呀使用每个特征的均值.范围来使每个特征都均一化到[-0.5, 0.5]的范围 即: f_normed = (f - f_average) / (f_max - f_min) 这样能使得cost func

【Python】机器学习之单变量线性回归 利用批量梯度下降找到合适的参数值

本题目来自吴恩达机器学习视频. 题目: 你是一个餐厅的老板,你想在其他城市开分店,所以你得到了一些数据(数据在本文最下方),数据中包括不同的城市人口数和该城市带来的利润.第一列是城市的人口数,第二列是在这个城市开店所带来的利润数. 现在,假设一开始θ0和θ1都是0,利用梯度下降的方法,找到合适的θ值,其中学习速率α=0.01,迭代轮次为1000轮 上一个文章里,我们得出了CostFunction,即损失函数. 现在我们需要找到令损失函数最小的θ值,利用梯度下降函数 1.导包 import num

Stanford大学机器学习公开课(二):监督学习应用与梯度下降

本课内容: 1.线性回归 2.梯度下降 3.正规方程组 监督学习:告诉算法每个样本的正确答案,学习后的算法对新的输入也能输入正确的答案 1.线性回归 问题引入:假设有一房屋销售的数据如下: 引入通用符号: m =训练样本数 x =输入变量(特征) y =输出变量(目标变量) (x,y)—一个样本 ith—第i个训练样本=(x(i),y(i)) 本例中:m:数据个数,x:房屋大小,y:价格 监督学习过程: 1) 将训练样本提供给学习算法 2) 算法生成一个输出函数(一般用h表示,成为假设) 3)

机器学习-斯坦福:学习笔记2-监督学习应用与梯度下降

监督学习应用与梯度下降 本课内容: 1.  线性回归 2.  梯度下降 3.  正规方程组 (复习)监督学习:告诉算法每个样本的正确答案,学习后的算法对新的输入也能输入正确的答案 1. 线性回归 例:Alvin汽车,先让人开车,Alvin摄像头观看(训练),而后实现自动驾驶. 本质是一个回归问题,汽车尝试预测行驶方向. 例:上一节课的房屋大小与价格数据集 引入通用符号: m = 训练样本数 x = 输入变量(特征) y = 输出变量(目标变量) (x,y) – 一个样本  –第i个训练样本 =

最优化方法--梯度下降

梯度下降:实现梯度下降.线性回归中的梯度下降 随机梯度下降:相关代码即调用 本文参考:公众号<数据科学家联盟>文章 转自:https://www.cnblogs.com/huangyc/p/9801261.html#_label1_0 一.概念 梯度下降(Gradient Descent, GD)不是一个机器学习算法,而是一种基于搜索的最优化方法.梯度下降(Gradient Descent, GD)优化算法,其作用是用来对原始模型的损失函数进行优化,以便寻找到最优的参数,使得损失函数的值最小.

机器学习入门:线性回归及梯度下降

机器学习入门:线性回归及梯度下降 本文会讲到: (1)线性回归的定义 (2)单变量线性回归 (3)cost function:评价线性回归是否拟合训练集的方法 (4)梯度下降:解决线性回归的方法之一 (5)feature scaling:加快梯度下降执行速度的方法 (6)多变量线性回归   Linear Regression 注意一句话:多变量线性回归之前必须要Feature Scaling! 方法:线性回归属于监督学习,因此方法和监督学习应该是一样的,先给定一个训练集,根据这个训练集学习出一个

【机器学习详解】线性回归、梯度下降、最小二乘的几何和概率解释

线性回归 即线性拟合,给定N个样本数据(x1,y1),(x2,y2)....(xN,yN)其中xi为输入向量,yi表示目标值,即想要预测的值.采用曲线拟合方式,找到最佳的函数曲线来逼近原始数据.通过使得代价函数最小来决定函数参数值. 采用斯坦福大学公开课的例子:假如一套房子的价格只考虑由房屋面积(Living area)与卧室数目(bedrooms)两个因素决定,现在拿到手有m个样本,如下图所示.此例中,输入x=(x1,x2)为2维向量,分别对应房屋面积和卧室数目,y对应价格.现在想根据上述样本

线性回归、梯度下降 - Andrew Ng机器学习公开课笔记1.1

实例 首先举个样例.如果我们有一个二手房交易记录的数据集.已知房屋面积.卧室数量和房屋的交易价格,例如以下表: 假如有一个房子要卖,我们希望通过上表中的数据估算这个房子的价格. 这个问题就是典型的回归问题,这边文章主要讲回归中的线性回归问题. 线性回归(Linear Regression) 首先要明确什么是回归. 回归的目的是通过几个已知数据来预測还有一个数值型数据的目标值. 如果特征和结果满足线性关系,即满足一个计算公式h(x).这个公式的自变量就是已知的数据x,函数值h(x)就是要预測的目标