第四章 梯度下降

# 梯度下降

# 损失函数的意义是衡量预测值与真实值的差距,越小越好,这里的损失函数是平方误差。
# 梯度下降算法的基本思想是:
# 1. 随机初始化模型参数
# 2. 计算损失函数关于模型参数的导数
# 3. 根据导数更新模型参数,使得损失函数最小
# 4. 重复2、3步,直到模型参数收敛或达到最大迭代次数


# LOSS是模型预测值与真实值的差距,MSE loss是均方差损失函数。
# 均方差损失 MSE loss = (theta**2 - 2)**2

# prddict=x**2#预测值
# label=3#真实值
# loss=((prddict-label)**2)#均方差损失
# # loss的导数 loss的导数是4x * (x^2 - 3) = 4x^3 - 12x
# # 导数是微积分中的一个基本概念,主要用于描述一个函数在某一点处的变化率或斜率。导数为0时,函数在该点取极值。大于0,单调递增;小于0,单调递减。
# print(loss)

# # 目标:求sqrt(3)
# # x**2=3 x=?
# epoch=1000#迭代次数
# x=5#初始值
# label=3#真实值
# lr = 0.01  # 学习率:步长。步长的大小直接影响数值解的精度和稳定性。预训练模型学习率一般不超过0.001
# 注意:梯度下降算法的收敛速度取决于学习率lr的大小,如果学习率过大,则可能无法收敛到最优解;如果学习率过小,则可能需要较多的迭代次数才能收敛到最优解。
# # 迭代
# for e in range(epoch):
#     predict=x**2#预测值
#     loss=(predict-label)**2#均方差损失
#     # 计算导数
#     delta_x=2*(predict-3)*2*x  # 导数是4x * (x^2 - 3) = 4x^3 - 12x
#     # 更新参数
#     x=x-delta_x*lr
#     # 打印损失函数
#     print("epoch:",e,"loss:",loss,"x:",x)

# # 最终的x值即为sqrt(3)

# (x1-3)**2+(x2+4)**2=0
# x1=3,x2=-4
import numpy as np  # 导入numpy库

label = 0  # 真实值

x1 = 5  # 初始值
x2 = 5  # 初始值

epoch = 1000000  # 迭代次数
lr = 0.0001  # 学习率

# 迭代
for e in range(epoch):
    predict = (x1 - 3) ** 2 + (x2 + 4) ** 2  # 预测值
    loss = (predict - label) ** 2  # 均方差损失
    # 计算导数
    delta_x1 = 2 * (predict - label) * 2 * (x1 - 3)
    delta_x2 = 2 * (predict - label) * 2 * (x2 + 4)
    # 更新参数
    x1 = x1 - delta_x1 * lr
    x2 = x2 - delta_x2 * lr
    # 打印损失函数
    if e % 1000 == 0:
        print("epoch:", e, "loss:", loss, "x1:", x1, "x2:", x2)

# 最终的x1,x2值即为(-4,3),不过我没训练出来
# 报错OverflowError: (34, 'Result too large'),一般是因为学习率过大导致数值溢出。
posted @ 2025-08-20 20:26  李大嘟嘟  阅读(4)  评论(0)    收藏  举报