使用随机梯度下降 00:02:18.384 image.png

00:03:07.590 image.png 上节课的例子 因为梯度不会自动清零,为了使这次的梯度不影响下次的梯度,进行手工清零

线性回归就是恨简单的神经网络

00:06:32.614 image.png

训练步骤: 1. 前馈:算损失 2. 反馈:算梯度 3. 更新:使用梯度下降算法更新权重 00:06:33.097 image.png

00:06:50.802 image.png 要使用mini-batch

要一次性将求出来 所以需要使用矩阵运算

这里运用numpy的广播方式 00:09:36.616 image.png

就是矩阵扩充

00:10:14.863 image.png

00:11:06.105 image.png

w应该是3x3

00:12:01.227 image.png

00:12:13.883 image.png

实际上也就是向量化00:12:48.104 image.png

00:12:53.501 image.png

00:13:20.043 image.png

00:14:06.039 image.png

potrch中计算导数不再是重点因为00:13:52.605 image.png

有函数会自动计算导数

重点在于构造计算图00:14:28.914 image.png

00:14:57.107 image.png

这个被称为一个线性单元

00:16:57.956 image.png

线性模型00:19:45.155 image.png

00:21:21.908 image.png init构造函数:初始化 forward:前馈 反向传播被自动调用 Fuctions是一个类 设计module

下面是上节课的代码,而可用于对比 image.png

00:24:06.957 image.png

super就是父类,,第一个参数类的名称 第二个self 实际上就是调用父类的init 这步一定要有

self.linear是在构造对象,00:24:42.264 image.png 00:26:15.258 image.png

这个对象包含了w和b(也就是权重和偏置) linear也是继承于tensor,所以在使用的时候能构建计算图

00:27:35.538 image.png

这里表示输入样本的维数,输出样本的维数

这里输出、输入样本的维数一定要相等

这里的bias表示是否要b,false就仅为 y = Ax 00:29:38.524 image.png

00:29:53.786 image.png

00:30:02.146 image.png 00:30:16.379 image.png

注意上面这个两个的区别,实际上无所谓是哪一种计算方式,只要最后结果是预期的结果就行

00:30:49.289 image.png

00:31:37.482 image.png

塑料英语: 执行了call函数 这个函数让类的例子能够进行反向传播 一般的forward会被调用

00:33:37.229

image.png

对于前面没有明确注明x=3,y=5的变量,如果不确定输入变量要多少个的时候 出现下面情况 00:33:47.229

image.png 就需要让前面接收变量可变长 00:33:54.002 image.png

00:34:23.201 image.png

使用这个方法00:34:33.331 image.png

00:34:38.563 image.png

使用这个方式可以实现不管输入多少变量,都可以被存入args中

对于后面指定变量名称的方式 00:34:55.180 image.png

同样实现输入可变长 是以字典的形式来实现 00:35:15.288 00:35:15.288 image.png

通过上面的输出可已看出就是是字典的形式

00:36:10.357 image.png

z1image.png 在moduel的call中,就是放入了forward

00:36:42.417 image.png

这里实际上就是函数重载, override linearmodel有一个forward 这里重新定义一个forward

00:38:15.428 image.png

类实例化 model是可以直接被调用的 00:38:36.640 image.png

可以直接写model(x),就可直接调用forward

image.png 可以参考这个图

00:39:47.751 image.png 00:40:03.310 image.png 00:39:32.224 image.png 这个损失计算过程可以直接被mesLoss代替

00:40:15.500 image.png

size_avagrage是否求均值 reduce 是否求和,降维成1维其实就是上上图的$\frac{1}{N}$

00:42:17.358 image.png optim这个是优化器 sgd是个类,这里是在进行实例化

model.parameters 00:43:07.946 image.png

在model中没有定义权重,使用linear这样的成员 所以parameters就是告诉优化器,哪些tensor对象数需要被==优化==,这里的优化也就是需要实现update,比如进行w权重的更新(一般基于梯度下降)

model的成员函数parameters 会检查model中所有成员 如果成员里有权重,就会把这个权重加到参数集合上

他会基于计算图查找所有嵌套的成员是否有权重 00:45:11.955 image.png

00:45:30.286 image.png

lr是学习率 learning rate 00:45:58.809 image.png 可以对不同的部分使用不同的学习率

00:46:54.699 image.png

00:47:05.095 image.png

print函数 中的loss自动调用__str__(),不会生成计算图 00:48:00.459 image.png

把所有权重的梯度归零 然后进行反向传播 step函数进行权重更新 00:49:22.738 image.png

  1. loss
  2. backward
  3. 更新w 00:49:53.799 image.png

如果不加item,weight是一个矩阵

00:50:24.420 image.png

00:51:15.706

image.png

这里就是让x_test作为tensor对象,其中的数值是4 然后将tensor对象x_test传入model,使用y = wx + b 进行计算

输入输出的都是二倍的关系 由已知的结果分析,w应该是2,而b应该为0 y_pred应该维8 所以这次的结果并不理想 说明训练还没有收敛的很好

00:51:49.081 image.png

后面进行的1000次迭代,实现的结果

00:52:45.861 image.png

上面这个点是过拟合点 红色线是测试集 蓝色是训练集

如果训练次数过多,会有过拟合的风险

00:53:08.871 image.png

00:53:21.839 image.png

  1. 准备数据集
  2. 设计模型
  3. 中间的criterion构造损失函数$\frac{1}{N}(\hat{y}-y)$,后面的是优化器(update)
  4. 然后是进行训练 00:54:20.540 image.png

这里是不同的优化器 sgd优化器是基于随机梯度下降法,进行权重更新的优化器 image.png