• 李沐动手学习深度学习——4.4练习


    1. 这个多项式回归问题可以准确地解出吗?提示:使用线性代数。

    可以准确的解出来,本质上就是矩阵相乘,第一个矩阵的参数w,第二个参数是x的多项式,和之前的一次的函数拟合一样的。
    在这里插入图片描述
    第一个矩阵w求解的是[5, 1.2, -3.4, 5.6],利用机器学习进行拟合,而第二个矩阵是[1, x, x^2, x^3]。同时原方程是是一个线性函数,所以可以通过机器学习的方式进行拟合。

    证明公式如下:
    l = ∣ ∣ X w − y ∣ ∣ 2 = ( X w − y ) T ( X w − y ) = w T X T X w − w T X T y − y T X w + y T y d l d w = 2 X T X w − X T w − 2 X T y d l d w = 2 X T X w − X T w − 2 X T y = 0 X T y = X T X w w = ( X T X ) − 1 X T y l=||Xwy||2=(Xwy)T(Xwy)=wTXTXwwTXTyyTXw+yTydldw=2XTXwXTw2XTydldw=2XTXwXTw2XTy=0XTy=XTXww=(XTX)1XTy

    ldwdldwdlXTyw=∣∣Xwy2=(Xwy)T(Xwy)=wTXTXwwTXTyyTXw+yTy=2XTXwXTw2XTy=2XTXwXTw2XTy=0=XTXw=(XTX)1XTy

    2. 考虑多项式的模型选择

    1. 绘制训练损失与模型复杂度(多项式的阶数)的关系图。观察到了什么?需要多少阶的多项式才能将训练损失减少到0?

    通过修改函数代码调整多项式阶数:
    在这里插入图片描述

    多项式次数为4的情况
    在这里插入图片描述
    多项式次数为6的情况
    在这里插入图片描述

    多项式次数为10的情况
    在这里插入图片描述
    多项式次数为15的情况
    在这里插入图片描述

    多项式次数为20的情况
    在这里插入图片描述多项式次数为100的情况
    在这里插入图片描述

    可以发现村咋子过拟合情况,因为阶数变多,函数复杂度也上升了。而对于train训练损失来说,其实只需要4阶以上,就可以将训练损失函数降到0附近,因为噪声原因,损失函数可能需要无穷阶数才能够将训练损失减少到0.

    2. 在这种情况下绘制测试的损失图。

    如上

    3. 生成同样的图,作为数据量的函数。

    调整训练函数如下:

    def train(train_features, test_features, train_labels, test_labels, num_epochs=400):
      loss = nn.MSELoss(reduction='none')
      input_shape = train_features.shape[-1]
      # 不设置偏置,因为我们已经在多项式中实现了它
      net = nn.Sequential(nn.Linear(input_shape, 1, bias=False))
      batch_size = min(10, train_labels.shape[0])
      train_iter = d2l.load_array((train_features, train_labels.reshape(-1,1)), batch_size)
      test_iter = d2l.load_array((test_features, test_labels.reshape(-1,1)), batch_size, is_train=False)
      trainer = torch.optim.SGD(net.parameters(), lr=0.01)
      # animator = d2l.Animator(xlabel='epoch', ylabel='loss', yscale='log', xlim=[1, num_epochs], ylim=[1e-3, 1e2], legend=['train', 'test'])
      for epoch in range(num_epochs):
        train_epoch_ch3(net, train_iter, loss, trainer)
        # if epoch == 0 or (epoch + 1) % 20 == 0:
        #   animator.add(epoch + 1, (evaluate_loss(net, train_iter, loss), evaluate_loss(net, test_iter, loss)))
      print('weight:', net[0].weight.data.numpy())
      return evaluate_loss(net, train_iter, loss), evaluate_loss(net, test_iter, loss)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    # 从多项式特征中选择前4个维度,即1,x,x^2/2!,x^3/3!
    animator = d2l.Animator(xlabel='degree', ylabel='loss', yscale='log', xlim=[2, max_degree], ylim=[1e-3, 1e2], legend=['train', 'test'])
    for i in range(2, max_degree):
      train_loss, test_loss = train(poly_features[:n_train, :i], poly_features[n_train:, :i], labels[:n_train], labels[n_train:])
      animator.add(i, (train_loss, test_loss))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    得到如下的图像:
    在这里插入图片描述

    3. 如果不对多项式特征xi进行标准化(1/i!),会发生什么事情?能用其他方法解决这个问题吗?

    当x很大的时候,不进行标准化,导致的就是训练的出参数w权重会很小,可能会接近于0,导致下溢。除了使用标准化的操作的话,还有就是处理数据,将数据进行标准化,降低数据的值,但是这样的话可能就不是线性拟合,而是非线性拟合的过程。

    4. 泛化误差可能为零吗?

    统计学角度出发,不可能存在0,始终有存在没有考虑到的特殊情况,导致误差。

  • 相关阅读:
    十八、【模糊工具组】
    Windows安装部署启动Celery,python
    OpenAI开发者大会大模型圈开卷AI Agent? 实在智能布局前瞻已下“先手棋”
    MyBioSource Cyclin E1 多克隆抗体相关研究
    gin-基础笔记
    Rust实战系列-基本语法
    三、计算机体系结构——中央处理器
    二分查找的经典样例
    计算机网络 交换机的基本配置
    day-06 多进程服务器端 -- 进程间通信
  • 原文地址:https://blog.csdn.net/weixin_45496725/article/details/136445995