d2l-2-线性回归的简单实现
在 神经网络 中,训练的本质实际上是优化参数,使得模型的预测值与真实值之间的误差尽可能小。通过定义损失函数的方式,我们可以知道 参数 与 结果 之间的关系,通过求导的方式, 我们可以知道如何调整参数使得损失函数最小。
假设损失函数为 \(L(\theta)\),那么我们的目标就是找到一个 \(\theta\) 使得 \(L(\theta)\) 最小。对于一个给定的 \(\theta\),我们可以通过计算 \(L(\theta)\) 得知其的损失,然后我们求导 \(L(\theta)\),得到其在 \(\theta\) 处的梯度 \(\nabla L(\theta)\),然后我们可以通过梯度下降的方式,即 \(\theta = \theta - \alpha \nabla L(\theta)\) 来更新 \(\theta\) 。其中 \(\alpha\) 是学习率,是一个超参数,用来控制每次更新的步长。
上述的方法即为梯度下降法,是一种常用的优化方法。从数学上可以证明,梯度下降最终一定能找到一个局部最优解。
在实际运用的时候,我们经常将多个样本的损失函数的平均值作为最终的损失函数,即 \(L(\theta) = \frac{1}{n} \sum_{i=1}^{n} L(\theta, x_i, y_i)\),其中 \(n\) 为样本的数量,\(x_i\) 为第 \(i\) 个样本的特征,\(y_i\) 为第 \(i\) 个样本的标签。但是这样又引出了另一个问题,即当样本数量很大的时候,我们需要计算所有样本的梯度,这样会导致计算量过大,因此我们通常会采用随机梯度下降法,即每次只计算随机选择的多个样本,然后更新参数,而不是全部样本。
下面,我们生成一个人工数据集,然后使用梯度下降法来拟合这个数据集。
1 | import torch |
接下来,我们定义模型和损失函数。
1 | # 定义模型,这里我们不使用 nn.Module,而是自己手搓 |