00:01:49.339 image.png

00:02:18.624 image.png 注意这里时对损失进行求导,而不是对 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