从0开始学pytorch【1】--线性函数的梯度下降
创始人
2024-06-01 18:45:29

从0开始学pytorch【1】--线性函数的梯度下降演示

  • 故事背景
  • 生成数据
  • 损失函数
  • 梯度更新1次
  • 迭代
  • 主函数
  • 执行

故事背景

  在正式学习pytorch深度框架之前,假设你已经掌握了机器学习、深度学习的梯度下降算法基础理论,但是编程技术还不够熟练,于是本文将使用python演示如何利用梯度下降法求解一元线性回归中的参数。对于复杂的目标函数,无法求出显式解以及高维目标函数无法可视化。在知道样本数据下,于是通过梯度下降算法求解最优解(可能是局部最优解)。

y=w∗x+by = w*x+by=w∗x+b

其中的www 和 bbb就是我们要求解的参数。

生成数据

  假设500个样本来源于:
y=5∗x+3y = 5*x+3y=5∗x+3
并且受到其他因素影响,这里设置标准高斯噪声,则生成样本数据:
y=5∗x+3+N(0,1)y = 5*x+3+N(0,1)y=5∗x+3+N(0,1)

import numpy as npdef function(b=3,size=500):x = np.random.uniform(1, 30, size)noise = np.random.normal(0, 1, size)y = 5 * x + b + noiselist_1 = []for i, j in zip(x, y):list_1.append([i, j])return list_1

损失函数

  设置损失函数为均方误差MSE:

MSE=1n∑i=1n(Yi−Y^i)2Yi^=w^∗xi+b^\mathrm{MSE}=\frac{1}{n} \sum_{i=1}^n\left(Y_i-\hat{Y}_i\right)^2 \\ \hat{Y_i} = \hat{w}*x_i+\hat{b} MSE=n1​i=1∑n​(Yi​−Y^i​)2Yi​^​=w^∗xi​+b^

梯度更新1次

  梯度更新方法,lr为学习率:
wi+1=wi−lr∗∂MSE∂ww_{i+1} = w_i - lr *\frac{\partial MSE}{\partial w} wi+1​=wi​−lr∗∂w∂MSE​

bi+1=bi−lr∗∂MSE∂bb_{i+1} = b_i - lr * \frac{\partial MSE}{\partial b} bi+1​=bi​−lr∗∂b∂MSE​

# 梯度更新1次
def grad_step(c_w, c_b, lr, points):total_w_g,  total_b_g = 0, 0N = len(points)for point in points:x, y  = point[0], point[1]total_w_g += 2 * (y- (c_w * x + c_b) ) * (-x) / Ntotal_b_g += 2 * (y- (c_w * x + c_b)) *(-1) / Nc_w = c_w - lr * total_w_gc_b = c_b - lr * total_b_greturn [c_w, c_b]

迭代

  在整个数据集上面循环time次,这里没有设置batch,即将整个样本理解为1个batch。

# 迭代
def diedai(i_w, i_b, lr, points,time):n_w, n_b = i_w, i_bfor i in range(time):n_w, n_b = grad_step(n_w, n_b, lr, points)print('参数:', n_w, n_b )return [n_w, n_b]

主函数

  可以对比看迭代前后的损失,设置初始参数,并输出迭代后的参数估计值。

# 主函数def main(i_w, i_b, lr, points, time):loss_i = copute_erro(i_w, i_b, points)print(f"初始状态损失:{loss_i}")ii_w, ii_b = diedai(i_w, i_b, lr, points, time)loss_e = copute_erro(ii_w, ii_b, points)print(f"结束状态损失:{loss_e}")

执行

  设置初始参数均为0,学习率为0.0001,迭代40000次,最后输出结果。

# 执行
if __name__ == "__main__":o_w = 0o_b = 0lr = 0.0001time = 40000points = function()main(o_w, o_b, lr, points, time)
'''
输出结果:
初始状态损失:8168.732799656018
参数: 5.0154640678882005 2.771481630325438
结束状态损失:1.0200946795304344
'''

  参数估计值www,bbb分别为5.015464和2.77148,这总体设置的5和3很接近。前提是我们并不知道参数真实值为5和3,于是就用参数估计值5.015464和2.77148去替代总体参数。

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...