pytorch(1)梯度下降

一、系列文章目录

(1)梯度下降
(2)手写数字识别引入&Pytorch 数据类型
(3)创建Tensor
(4)Broadcasting
(5)Tensor
(6)Tensor统计
(7)Where和Gather
(8)函数的梯度
(9)loss函数;自动求导



二、梯度下降

1.什么是梯度下降

梯度gradient,是深度学习的核心精髓,许多专家称深度学习为gradient programming,deep learning其实就是求解一个巨复杂的函数,求解工具就是梯度下降算法。

2.梯度下降算法核心公式:

xn+1= xn - f`(x)* (learning rate)

其中learning rate通常取0.001,手写数据一般0.01。它的取值会影响下降的速度(步长),取值过大会出现大的抖动。
x不断更新,当x在最优解(极值点)附近时梯度会接近于0,x取值在一个小范围内抖动。
可以加不同的限制额外的优化,例如考虑上一次的前进方向与这一次的一致,得到不同的求解器。以提高精度和速度。

  • SGD: 传统随机梯度下降
  • Adam:一阶优化算法https://www.cnblogs.com/yifdu25/p/8183587.html

3.求解方法

传统方法通常求解精确解,例如,y= w·x+b ,x分别取值1和2,做差精确求解出w和b
但是真实问题中数据往往有噪声,因此求取近似解即可
y= w·x+b + e
e ~ N(0.01, 1)高斯噪声,均值0.01,方差为1
目标函数: loss=(w·x+b-y)2 求解w和b使loss取极小值

4.实例

y=1.477x+0.089+e
先根据这个模型生成100个数据,然后假装不知道模型的参数,根据这些数据求解出模型。

根据数据散点图分布的特点,假设一个线性模型 y= w·x+b + e
目标:Minimize loss=Σi(w·xi + b - yi)2 求解 w b

这个模型为数低,有全局极小值,是凸函数,相关问题称为凸优化。对于一个凹函数,则求解局部极小值。

linear regression:y值是连续的问题,股票指数等等。
logistic regression:在linear regression 上加一个激活函数,压缩到(0,1)上。手写数字、硬币二分类等等涉及到概率的问题。

5.实战

import numpy as np

def data():
    e = np.random.normal(0.01, 1, 1) #normal是正态分布 (均值,标准差,输出shape) shape默认为none,只输出一个值
    points = []
    for x in range(16):
        y = 1.477 * x + 0.089 + e
        points.append([]) #points 中添加一个空list
        points[x].append(x) #points第x位添加x
        points[x].append(y[0]) 
    return(points)

def loss(b, w, points):   # 计算loss函数
    totalError = 0
    for i in range(0,len(points)):
        x = points[i,0]     # 数组,在后面用np生成
        y = points[i,1]
        totalError += (y - (w * x + b)) ** 2  #平方和
    return totalError/float(len(points)) #取均值

def step_gradient(b_current, w_current, points, learningRate): #参数更新
    b_gradient = 0 #梯度初始值
    w_gradient = 0 #梯度初始值
    N = float(len(points)) #数据总数
    for i in range(0, len(points)):  # 计算b和w的梯度
        x = points[i, 0] #取出x
        y = points[i, 1] #取出y
        b_gradient += -(2/N) * (y - ((w_current * x) + b_current))# 均值 ;wx+b-y 变为 y-wx-b 添加负号
        w_gradient += -(2/N) * x * (y - ((w_current * x) + b_current))# w'= w-lr * (loss'w)  (loss'w)指loss对w的偏导
    new_b = b_current - (learningRate * b_gradient)   #梯度下降
    new_w = w_current - (learningRate * w_gradient)
    return [new_b,new_w] #更新参数

def gd_runner(points, initial_b, initial_w, learning_rate, num_iterations):
    b_current = initial_b #从初始值开始
    w_current = initial_w #从初始值开始
    for i in range(num_iterations): #更新num次
        b_current,w_current = step_gradient(b_current, w_current, np.array(points), learning_rate)
    return [b_current, w_current] #更新num次之后的参数

def run():
    #points = np.genfromtxt("data.csv", delimiter = ",") #Numpy.genfromtxt-读取csv文件数据  没用这句是因为我还不会生成文件哈哈哈哈哈哈
    points = np.array(data())
    learning_rate = 0.0001 #设置lr
    initial_b = 0 #初始值b
    initial_w = 0 #初始值w
    num_iterations = 100000 #学习次数
    print("Starting gradient decent at b ={0}, w = {1}, erroe = {2}".format(initial_b, initial_w, loss(initial_b,initial_w,points))) #初始误差
    print("running…………")
    [b, w] = gd_runner(points, initial_b, initial_w, learning_rate, num_iterations) #参数更新了1000次
    print("after {0} iterations b = {1}, w = {2}, error = {3}".format(num_iterations, b, w, loss(b, w, points)))

if __name__ == '__main__':
    run()

可以看到,结果不错
可以看到,拟合结果还是不错的,嘿

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值