使用随机梯度下降
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

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

这里运用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维其实就是上上图的 1N

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. y^
  2. loss
  3. backward
  4. 更新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构造损失函数 1N(y^y) ,后面的是优化器(update)
  4. 然后是进行训练
    00:54:20.540
    image.png

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