00:01:49.339
image.png

00:02:18.624
image.png
注意这里时对损失进行求导,而不是对 y^
00:02:33.467
image.png

00:03:04.905

image.png

第一层00:03:49.205
image.png

隐层h1第一层,是6维的
x是5维的
隐层h2 7维

写解析式太麻烦了

面对这样的复杂网络
把网络看成图
再图上进行传播梯度
基于链式法则
00:05:33.953
image.png

两层神经网络
00:06:52.853
image.png

这个转置符号无所谓
x的维数为N
00:07:26.884
image.png
00:08:01.980
image.png

00:08:29.528
image.png

h1的维数为m

b1是m维
00:08:58.784
image.png

00:09:27.210
image.png

全链接神经网络的第一层

下面是第二层
00:09:52.605
image.png

00:11:58.074
image.png

把两层变成1层,不管多少层,线性变换,都可以变成1层。

为了提高模型的复杂程度
00:12:34.502
image.png

添加一个非线性的函数,用于提高复杂程度
nonliner
00:13:14.804
image.png

00:13:55.471
image.png

链式求导法则

00:15:48.046
00:15:54.984
image.png

首先进行前馈操作00:16:07.295

image.png

也就是x->z

输出的结果z与实际值要求值之间的差值,对于z求导,这样得到偏导00:17:32.366
image.png
在一步一步进行反向传播。
最主要目的还是获得L对w的梯度,实现权重更新
"//"是分数的快捷键
对于 x,其实只有两层神经网络,是用不到的,但是对与超过两层的神经网络来说,就很有必要,因为这里的x会需要继续反向传播回上一层,用于上一层接着计算梯度

{trigger: “par”, replacement: "\frac{ \partial ${0:y} }{ \partial ${1:x} } 2", options: "m"},这个没有A的意识是需要按 `tab` 来手动触发转换 \frac{ \partial z }{ \partial w }$

00:18:23.604
image.png

00:19:04.844
image.png

00:19:37.833
image.png

00:20:19.348
image.png

然后可可以进行权重更新

00:20:44.567
image.png

00:22:02.539
image.png

00:22:22.842
image.png

00:22:58.010
image.png

00:23:30.739
image.png

00:24:14.240
image.png

在前馈过程中,还计算了梯度

开始进行反向传播
00:24:59.293
image.png
00:26:04.911
image.png
image.png

作业:
00:27:26.419
image.png

00:28:07.541
image.png
00:28:47.574
image.png

前馈然后反馈

pytorch中进行前馈反馈计算

tensor 保存所有的数值
这个类00:30:35.519
image.png

使用pytorch构建神经网络其实就是在构建一个这样的计算图

00:28:47.574
image.png

只有需要计算梯度的时候才设置requires_grad
00:32:28.943
image.png

00:32:47.347
image.png

这里w是tensor
所以这里x进行自动的类型转换

00:33:43.245
image.png

00:34:03.338
image.png

因为w需要梯度计算
所以计算结果也需要梯度计算

00:34:52.617
image.png

每调用loss函数就是在构建计算图

训练过程:
00:35:41.707
image.png

直接调用backward
就可以进行反向传播
把这个这个计算链路中所有需要梯度计算的值都求出来
00:36:19.110
image.png

然后自动把梯度放到变量中
w对应的梯度直接放到w这个类的生成的对象中
调用一次backward之后loss生成的计算图就使用完了,就被释放掉了
image.png

下一个epoc进行loss计算就会重新创建一个新的计算图

00:38:10.895
image.png

image.png

必须要取到data,因为grad也是一个tensor对象
如果不写,就是在建立计算图

grad.item 用于输出一个标量,来输出梯度

00:40:32.239
image.png

使用sum来计算所有的损失00:41:17.290
image.png

因为tensor对象在加法运算中会构建计算图
所以在for循环中重复加法会导致这个计算图特别的长,导致内存爆掉
00:42:08.001
image.png

w中数据梯度清零
00:42:46.441
image.png

因为w是一个全局变量
而不清零会导致下一轮中加上上一轮的梯度

流程图
00:45:12.777
image.png

00:45:28.530
image.png

注意这里需要使用data。而不是直接使用tensor对象来进行更新,因为tensor对象会导致计算图的构建

作业:
00:45:38.919
image.png