1.输入模型的是一定维度的特征值
    2.构建模型就是构建计算图。计算图的作用就是反向传播梯度,这样就可以原子化计算过程,那么Loss对于计算图中各个权重的导数也就易得了。
    3.前馈的过程,可以计算出预测值y_hat,以及Loss,而Loss.backward()会将Loss关于此模型中各个权重的导数求出来。
    4.权重们,有了导数的话,就可以对自己进行更新。(优化权重的算法就是随机梯度下降)

    1. Back Propagation:反向传播;这是在神经网络里面非常重要的算法,它是可以在图上面来进行梯度的传播。
    2. 因为我们的深度学习训练就是,对每一个权重,依据loss对权重的导数(即梯度),来优化权重。
    3. w = w - α * (lossw的导数)
    4. 而我们直接求解loss对权重的解析式是很困难的,于是就有人提出使用计算图来原子化计算,通过链式法则
    5. 来反向(传播)求解loss对权重的导数。
    6. 构建模型 == 构建计算图
    Pytorch里面最基本的数据类型,数据的成员,它的类型叫做Tensor,这个Tensor是用来存数据的,
    前面我们图里的所有数值都需要囤在 Tensor里面,那么Tensor它可以存一个标量,可以是向量,可以是矩阵,
    可以是高纬度的Tensor,三维,四维都可以。我们所有的数值肯定都要保存在Tensor里的。
    
    Tensor实际上是一个类,它里面有两个比较重要的成员,一个是Data,另外一个grad,分别保存权重本身的
    值,损失函数对权重的导数。
    
    输入值有包含权重信息的,那么输出值也需要梯度。
    
    层与层之间计算的偏导,就是局部梯度。
    
    当你看到了forward,你就要意识到这是在构建计算图。
    前馈的过程,你只需要计算loss就行了
    

    image.png

    反馈的过程,注意这个loss是你最后算出来的张量,这个张量呢可以调用它的成员函数backward(),然后它
    就会自动的把这条计算链路上,所有的需要梯度 的地方,把梯度 都求出来,然后求完之后,它就把会梯度都
    存到你的变量里面,比如我们这里涉及的变量就是w;
    我们需要知道w是一个Tensor
    所以它会把梯度存到w里面,实际上这个计算图就被释放了,只要一做backward,存完梯度,计算图就被释放
    了,所以下一次再进行loss计算的时候,它就 会创建一个 新的计算图。
    
    因为最后得出来的Loss是Tensor,那么其中就可以调用它的成员函数backward(),然后它就会自动的把
    这条梯度计算链路,所有的需要用到梯度的地方,把梯度求解出来,然后把梯度存到w里面。
    当前链路上,还会有其它需要的梯度地方,不止是w这个Tensor。
    w是关于特征(即输入x)的权重。
    w也是一个Tensor,里面有Data(即w本身数值)和grad(w对应的Loss关于其的导数)。
    
    实际上就是先算损失,(必定y_hat要先算出来)
    第二步,backward,做反向传播,然后你这个算法就跑完了,(反向传播,将梯度传播到每一个权重中的
    grad中)  权重是Tensor类型的,grad也是Tensor类型的。
    跑完之后,你对应的Tensor权重中有了梯度,你就可以用梯度下降做更新。