3 线性神经网络

发表于 2023-03-23更新于 2023-03-23字数统计 1.7k阅读时长 10m阅读次数

3.1 线性回归

小结

  1. 由果到因,根据已经发生的观测结果去猜想真实参数,这个过程叫做估计;估计正确的可能性叫做似然性。求可能性最大的推测,这个过程就是极大似然估计。由因到果,根据真实参数(或已经发生的观测结果)去推测未来的观测结果,这个过程叫做预测;预测正确的可能性叫做概率
  2. 损失函数:能够量化目标的实际值与预测值之间的差距。
  3. 解析解:可以用一个公式简单地表达出来。
  4. 随机梯度下降:通常会在每次需要计算更新的时候随机抽取一小批样本, 这种变体叫做小批量随机梯度下降(minibatch stochastic gradient descent)
  5. 算法的步骤如下:(1)初始化模型参数的值,如随机初始化; (2)从数据集中随机抽取小批量样本且在负梯度的方向上更新参数,并不断迭代这一步骤。
  6. 超参数:可以调整但不在训练过程中更新的参数。调参:选择超参数的过程。
  7. 泛化(generalization):找到一组参数,这组参数能够在我们从未见过的数据上实现较低的损失。

练习

  1. 假设我们有一些数据$x_1, \ldots, x_n \in \mathbb{R}$。我们的目标是找到一个常数$b$,使得最小化$\sum_i (x_i - b)^2$。
    1. 找到最优值$b$的解析解。
    2. 这个问题及其解与正态分布有什么关系?

f220011d9f56d741001e058085bf3d7.jpg
4b4a7a7be951be654ca83a2fc8091c2.jpg

  1. 推导出使用平方误差的线性回归优化问题的解析解。为了简化问题,可以忽略偏置$b$(我们可以通过向$\mathbf X$添加所有值为1的一列来做到这一点)。
    1. 用矩阵和向量表示法写出优化问题(将所有数据视为单个矩阵,将所有目标值视为单个向量)。
    2. 计算损失对$w$的梯度。
    3. 通过将梯度设为0、求解矩阵方程来找到解析解。
    4. 什么时候可能比使用随机梯度下降更好?这种方法何时会失效?

20a3cd63e0e9b71742d6ea41a6c4ad2.jpg
d: 当模型简单的时候,通过求W的解析解是比随机梯度下降更好,但是当$X^{T}X$不可逆时,无法求出解析解。

  1. 假定控制附加噪声$\epsilon$的噪声模型是指数分布。也就是说,$p(\epsilon) = \frac{1}{2} \exp(-|\epsilon|)$
    1. 写出模型$-\log P(\mathbf y \mid \mathbf X)$下数据的负对数似然。
    2. 请试着写出解析解。
    3. 提出一种随机梯度下降算法来解决这个问题。哪里可能出错?(提示:当我们不断更新参数时,在驻点附近会发生什么情况)请尝试解决这个问题。

714017c91023bf8de42d41d88cdb4df.jpg
线性绝对值函数在极点处是没有导数的。
c: 所求得的损失函数其实是1范数的形式,在驻点处不可导。
梯度下降法可能碰到问题: 例如在驻点附近,参数剧烈波动难以收敛,所以可以当损失函数小于一定阈值后,就用2范数代替1范数,即避免了二范数在距离驻点较远时梯度太大训练不稳定,也避免了1范数在驻点附近参数剧烈波动难以收敛。

3.2 线性回归的从零开始实现

练习

  1. 如果我们将权重初始化为零,会发生什么。算法仍然有效吗?

在单层网络中,将权重初始化为零时可以的,但是网络层数加深后,在全连接的情况下,在反向传播的时候,由于权重的对称性会导致出现隐藏神经元的对称性,使得多个隐藏神经元的作用就如同1个神经元,算法还是有效的,但是效果不大好。(https://zhuanlan.zhihu.com/p/75879624

  1. 假设试图为电压和电流的关系建立一个模型。自动微分可以用来学习模型的参数吗?

可以,建立模型U=IW+b,建立模型U=IW+b

  1. 能基于普朗克定律使用光谱能量密度来确定物体的温度吗?

  2. 计算二阶导数时可能会遇到什么问题?这些问题可以如何解决?

一阶导数的正向计算图无法直接获得,可以通过保存一阶导数的计算图使得可以求二阶导数

  1. 为什么在squared_loss函数中需要使用reshape函数?

以防y^和y,一个是行向量、一个是列向量,使用reshape,可以确保shape一样。

  1. 尝试使用不同的学习率,观察损失函数值下降的快慢。

①学习率过大前期下降很快,但是后面不容易收敛;
②学习率过小损失函数下降会很慢。

  1. 如果样本个数不能被批量大小整除,data_iter函数的行为会有什么变化?

出错

3.3 线性回归的简洁实现

小结

  1. Sequential类将多个层串联在一起。当给定输入数据时,Sequential实例将数据传入到第一层, 然后将第一层的输出作为第二层的输入,以此类推。
  2. 通过net[0]选择网络中的第一个图层, 然后使用weight.data和bias.data方法访问参数。还可以使用替换方法normal_和fill_来重写参数值。
  3. 计算均方误差使用的是MSELoss类,也称为平方𝐿2范数]。 默认情况下,它返回所有样本损失的平均值。loss = nn.MSELoss()
  4. 实例化一个SGD实例)时,我们要指定优化的参数 (可通过net.parameters()从我们的模型中获得)以及优化算法所需的超参数字典。trainer = torch.optim.SGD(net.parameters(), lr=0.03)
  5. 对于每一个小批量,我们会进行以下步骤:
  • 通过调用net(X)生成预测并计算损失l(前向传播)。
  • 通过进行反向传播来计算梯度。
  • 通过调用优化器来更新模型参数。

练习

  1. 如果将小批量的总损失替换为小批量损失的平均值,需要如何更改学习率?

将学习率除以batchsize。

  1. 查看深度学习框架文档,它们提供了哪些损失函数和初始化方法?用Huber损失代替原损失,即$l(y,y’) = \begin{cases}|y-y’| -\frac{\sigma}{2} & \text{ if } |y-y’| > \sigma \ \frac{1}{2 \sigma} (y-y’)^2 & \text{ 其它情况}\end{cases}$
  1. 如何访问线性回归的梯度?
    1
    2
    net[0].weight.grad
    net[0].bias.grad