pytorch-梯度下降

梯度下降

y = x 2 ∗ s i n ( x ) y ′ = 2 x s i n x + x 2 c o s x x 1 = x − Δ y ′ ( x ) 其中 Δ 表示学习率, y ′ ( x ) 代表 y 在 x 点处关于 x 的梯度。 y = x^2 * sin(x) \\ y' = 2xsinx+x^2cosx \\ x_1 = x - \Delta y'(x) \\ 其中 \Delta 表示学习率, y'(x)代表y在x点处关于x的梯度。 y=x2∗sin(x)y′=2xsinx+x2cosxx1=x−Δy′(x)其中Δ表示学习率,y′(x)代表y在x点处关于x的梯度。

注意:

在单变量中,梯度就等于导数。

在多变量中,梯度方向表示函数值增加最快的方向。

1、学习率过大会使算法难以收敛,且波动很大

2、学习率过低可能导致算法收敛过慢

具体代码:

csharp 复制代码
import numpy as np

# y = wx+b
# loss = (wx+b-y)^2

# 计算损失
def compute_loss(w,b,points):
    totalError = 0
    for i in range(0, len(points)):
        x = points[i, 0]
        y = points[i, 1]
        totalError += (y - (w * x + b)) ** 2
    return totalError / float(len(points))

# 梯度下降
# w' = w - lr * dloss/dw
# dl/dw = 2(wx+b-y)x
# dl/db = 2(wx+b-y)
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)):
        x = points[i, 0]
        y = points[i, 1]
        b_gradient += (2/N) * (((w_current * x + b_current )) - y) * x
        w_gradient += (2/N) * (w_current * x + b_current - y)
    new_b = b_current - (learningRate * b_gradient)
    new_w = w_current - (learningRate * w_gradient)
    return [new_b, new_w]
def gradient_descent_runner(points, starting_b, starting_w, learning_rate, num_iterations):
    b = starting_b
    w = starting_w
    for i in range(num_iterations):
        b , w = step_gradient(b, w, np.array(points), learning_rate)
    return [b, w]

def generate_data(num_points):
    np.random.seed(42)
    x = 2 * np.random.rand(num_points,1)
    y = 4 + 3 * x + np.random.randn(num_points, 1)
    points = np.hstack((x,y))
    return points

def run():
    # points = np.genfromtxt("data.csv", delimiter=',')
    points = generate_data(100)
    learning_rate = 0.0001
    initial_b = 0
    initial_w = 0
    num_iterations = 100
    print("Starting gradient descent at b = {0}, m = {1}, error = {2}".format(initial_b,initial_w,compute_loss(initial_b,initial_w,points)))
    print("Runing....")
    [b , w] = gradient_descent_runner(points, initial_b, initial_w, learning_rate, num_iterations)
    print("After {0} iterations b = {1}, m = {2}, loss = {3}".format(num_iterations, b, w, compute_loss(b,w,points)))

if __name__ == '__main__':
    run()
相关推荐
小鸡吃米…4 小时前
机器学习 - K - 中心聚类
人工智能·机器学习·聚类
好奇龙猫4 小时前
【AI学习-comfyUI学习-第三十节-第三十一节-FLUX-SD放大工作流+FLUX图生图工作流-各个部分学习】
人工智能·学习
沈浩(种子思维作者)5 小时前
真的能精准医疗吗?癌症能提前发现吗?
人工智能·python·网络安全·健康医疗·量子计算
minhuan5 小时前
大模型应用:大模型越大越好?模型参数量与效果的边际效益分析.51
人工智能·大模型参数评估·边际效益分析·大模型参数选择
Cherry的跨界思维5 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
MM_MS5 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
ASF1231415sd5 小时前
【基于YOLOv10n-CSP-PTB的大豆花朵检测与识别系统详解】
人工智能·yolo·目标跟踪
njsgcs5 小时前
ue python二次开发启动教程+ 导入fbx到指定文件夹
开发语言·python·unreal engine·ue
io_T_T5 小时前
迭代器 iteration、iter 与 多线程 concurrent 交叉实践(详细)
python
水如烟6 小时前
孤能子视角:“意识“的阶段性回顾,“感质“假说
人工智能