美文网首页
山重水复疑无路,最快下降问梯度

山重水复疑无路,最快下降问梯度

作者: 生信探索 | 来源:发表于2024-06-05 20:50 被阅读0次

标题来自张玉宏老师书的目录《深度学习之美》

之前的推文中使用最小二乘法求损失函数的最小值,但是在机器学习和深度学习中更通用的方法是使用梯度下降方法找到最优解。

名词解释

梯度下降:核心就是希望能够通过数学意义上的迭代运算,从一个随机点出发,一步步逼近最优解。

梯度:有大小和方向,用导数求得大小,目标函数变化最快的方向的反方向作为移动的方向

方向:往哪个方向走

步长:每一步走多远

学习率:在梯度下降过程中,学习率乘以梯度大小为步长。学习率如果过小,损失函数的变化速度很慢,会大大增加网络的收敛复杂度,并且很容易被困在局部最小值或者鞍点

迭代:数学上的迭代,第一步运算的结果带入到第二步的函数中,以此类推

用代数表示梯度下降迭代过程

目标方程(多元一次方程)

那么多元一次方程可以写为(矩阵形式表示)

令其损失函数为

其实是预测值减去真实值的平方除以2倍的样本数m(即0.5*MSE),多乘以0.5可以消除掉平方求导后的系数2

迭代过程

对任意一个有,即在某个具体的点上带入w值,对损失函数求导

计算步长

是学习率。步长 = 梯度 * 学习率

更新所有参数w

移动的方向从减号表示出来,减号表示梯度的反方向

简单的示例

x是特征,只有一个,y是真实标签

如果需要对建模的话,需要找到一个a和b,使得损失函数L最小

x y

1 2

2 4

3 6

所以特征矩阵X为(多出来的全为1的一列为截距b)

真实标签矩阵y为

那么参数矩阵w为

令损失函数为

一阶导数

函数实现

设步长, 初始点,迭代次数为10000

import torch

def g(X, y, alpha = torch.tensor(0.01, requires_grad = True), n = 10000):

    b=torch.ones(X.shape[0], requires_grad = True,dtype=torch.float32).reshape(-1,1)

    X = torch.cat([X,b],1)

    m, nc = X.shape

    w = torch.zeros(nc, 1, requires_grad = True)

    for _ in range(n):

        grad = torch.mm(X.t(), (torch.mm(X, w) - y))/m

        w = w - alpha * grad

    return w

因为函数g中,可以给X增加一列全为1所以输入的时候就不需要写了

X = torch.tensor([[1],[2],[3]], requires_grad = True,dtype=torch.float32)

X

# tensor([[1.],

#        [2.],

#        [3.]], requires_grad=True)

y = torch.tensor([2,4,6], requires_grad = True,dtype=torch.float32).reshape(-1,1)

y

# tensor([[2.],

#        [4.],

#        [6.]], grad_fn=<ReshapeAliasBackward0>)

计算结果,其实用最小二乘法令一阶导数为0即可求的a=2,b=0

g(X,y, n = 10000)

# tensor([[2.0000e+00],

#        [1.9127e-05]], grad_fn=<SubBackward0>)

计算此时的损失函数值,改写原来的g函数

def g(X, y, alpha = torch.tensor(0.01, requires_grad = True), n = 10000):

    b=torch.ones(X.shape[0], requires_grad = True,dtype=torch.float32).reshape(-1,1)

    X = torch.cat([X,b],1)

    m, nc = X.shape

    w = torch.zeros(nc, 1, requires_grad = True)

    for _ in range(n):

        grad = torch.mm(X.t(), (torch.mm(X, w) - y))/m

        w = w - alpha * grad

    loss = torch.mm((torch.mm(X,w)-y).t(), torch.mm(X,w)-y)/m*0.5

    return w,loss

此时的损失函数非常接近于0

w,loss=g(X,y)

loss

#  tensor([[2.9644e-11]], grad_fn=<MulBackward0>))

相关文章

  • 为什么梯度方向是函数值增大最快的方向

    Welcome To My Blog梯度下降中,梯度反方向是函数值下降最快的方向,说明梯度方向是函数值上升最快的方...

  • 常用最优化算法-Python实现

    梯度法 梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是...

  • 数学梯度下降—Apple的学习笔记

    一, 梯度下降算法摘要 步长就是a,也叫学习速率。偏导数就是梯度,下降最快的方向 合适的学习速率α应该是每一次迭...

  • 2019-01-29 随机梯度下降(stochastic gra

    随机梯度下降的思想也可以应用于线性回归、逻辑回归、神经网络或者其他依靠梯度下降来进行训练的算法中。 梯度下降法的问...

  • (三)线性回归--梯度下降

    一、梯度下降 二、代码的实现 (一.梯度下降) 导包 构建数据 梯度下降 使用梯度下降,可视化 (二。梯度下降矩阵...

  • 神经网络优化2

    梯度下降 梯度下降法 批梯度下降法(Batch Gradient Descent,BGD)是最常用的梯度下降形式,...

  • 深入浅出--梯度下降法及其实现

    梯度下降的场景假设梯度梯度下降算法的数学解释梯度下降算法的实例梯度下降算法的实现Further reading 本...

  • 机器学习-常用优化方法

    一阶方法:梯度下降、随机梯度下降、mini 随机梯度下降降法。 随机梯度下降不但速度上比原始梯度下降要快,局部最优...

  • ML-梯度下降代码-线性回归为例

    梯度下降代码线性回归为例 bgd 批量梯度下降 sbd 随机梯度下降 mbfd 小批量随机梯度下降

  • 2020-08-19--梯度下降法01

    梯度下降法简介 多元线性回归中的梯度下降法 随机梯度下降法 梯度下降法 的调试 1.梯度下降法简介 不是一个机器学...

网友评论

      本文标题:山重水复疑无路,最快下降问梯度

      本文链接:https://www.haomeiwen.com/subject/plzuqjtx.html