2.2.初始化模型参数

在训练线性回归模型之前,我们需要初始化模型的参数,包括权重和偏置。初始化的目的是为模型提供初始的参数值,这些参数将通过训练过程逐步优化。

在本节中,我们通过从均值为0、标准差为0.01的正态分布中随机生成权重w,并将偏置b初始化为0。初始化的过程可以用以下代码表示:

import numpy as np

# 初始化权重w和偏置b
w = np.random.normal(0, 0.01, (2, 1))  # 2个输入特征,一个输出
b = np.zeros(1)  # 偏置初始化为0

# 为w和b设置梯度属性
w.attach_grad()  # 为w启用自动求导功能
b.attach_grad()  # 为b启用自动求导功能
代码解释:
  1. w = np.random.normal(0, 0.01, (2, 1)):这里使用np.random.normal()从均值为0,标准差为0.01的正态分布中生成一个形状为(2, 1)的随机权重矩阵。这个矩阵包含了两个输入特征的权重。
  2. b = np.zeros(1):偏置b初始化为0,表示初始时没有偏移量。
  3. w.attach_grad()b.attach_grad():这两行代码为wb启用自动微分,意味着在后续的反向传播过程中,框架会自动计算这些参数的梯度。

2.2.4 定义模型

接下来,我们需要定义一个线性回归模型。线性回归的核心是通过输入特征X和权重w的矩阵乘法,再加上偏置b来计算输出。根据线性回归的公式:

[y = Xw + b]

其中,X是特征矩阵,w是权重向量,b是偏置。

def linreg(X, w, b):  # 线性回归模型
    """线性回归模型"""
    return np.dot(X, w) + b
代码解释:
  • np.dot(X, w):计算特征矩阵X与权重向量w的矩阵乘法。
  • + b:将偏置b加到每个预测值上。根据广播机制,b会被加到Xw的每一行。

2.2.5 定义损失函数

在训练过程中,我们需要定义损失函数,以度量模型的预测值与真实值之间的差距。对于线性回归,通常使用均方误差(MSE)作为损失函数,公式为:

[\text{MSE}(y_{\hat}, y) = \frac{1}{2} \sum_{i=1}^{n} (y_{\hat_i} - y_i)^2]

其中,y_hat是模型的预测值,y是实际的目标值。

def squared_loss(y_hat, y):  # 均方损失函数
    """均方损失"""
    return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2  # 计算均方损失
代码解释:
  • y.reshape(y_hat.shape):将真实值y的形状调整为与预测值y_hat相同,以便进行逐元素的运算。
  • (y_hat - y.reshape(y_hat.shape)) ** 2 / 2:计算均方误差损失,其中每个样本的损失值是预测值与真实值之差的平方,除以2是为了简化求导过程。

2.2.6 定义优化算法

在训练模型时,我们需要使用优化算法来更新模型参数。这里我们使用**小批量随机梯度下降(SGD)**算法。SGD是深度学习中最常用的优化算法之一,它通过计算每个小批量的损失函数的梯度,然后根据梯度更新模型的参数。

小批量随机梯度下降(SGD)算法

在这里插入图片描述

实现代码如下:

def sgd(params, lr, batch_size):  # 小批量随机梯度下降
    """小批量随机梯度下降"""
    for param in params:  # 遍历每个参数(权重w和偏置b)
        param[:] = param - lr * param.grad / batch_size  # 更新参数
代码解释:
  • params:一个包含模型所有参数(即wb)的列表。
  • lr:学习率,控制每次更新的步长。
  • batch_size:小批量的大小,用于归一化梯度。
  • param[:]:表示直接修改参数的值。
  • param.grad:获取当前参数的梯度。
  • lr * param.grad / batch_size:根据梯度更新参数的值,乘以学习率并归一化。

总结

本节介绍了如何初始化模型参数、定义模型、定义损失函数和实现优化算法。通过这些步骤,我们可以构建一个线性回归模型,并使用小批量随机梯度下降(SGD)算法来训练模型。训练过程中,模型的参数会逐步更新,直到它们足够拟合训练数据。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐