当前位置:   article > 正文

【神经网络 基础知识整理】前向传播 && 反向传播_神经网络前向传播

神经网络前向传播

顾名思义,前向传播是从前往后传播的,从input层到output层的方向:前面一层的输出传入后一层作为输入,再对数据进行相应的处理,继续传下去,直到输出层;反向传播是从后往前传播的,从output层到input层的方向:目标函数(对应的损失函数)对某权重or某偏置(即神经网络中可训练的参数)求偏导,根据链式法则,从后往前计算偏导

前向传播

前向传播

我们以多层感知机(MLP)为例子,来看看前向传播的过程:神经网络分为3层(输入层、中间层=隐藏层、输出层),数据分别用X、A、Y表示,输入是1*3的向量,中间层有4个神经元节点,输出有2个神经元(比如二分类任务)。X输入然后经过线性变换+非线性变换(激活函数)得到A,A再经过线性变换+非线性变换得到Y,Y经过非线性变换得到最终的输出,整个过程就是前向传播的过程。
在这里插入图片描述
我们来看看a1、a2、a3、a4具体的计算式子,用W表示权重,B表示偏置,表示成矩阵运算即A=f(WX+B),其中A是1*4的向量,W是4*3的矩阵,4对应着输出节点数量,3对应着输入节点数量【权重矩阵W的维度表示成m*n的话,m对应着i+1层网络层的维度,n对应着i层网络层的维度】,f是激活函数:
在这里插入图片描述
最后输出Y的计算式子:
在这里插入图片描述

pytorch中的forward函数

首先说说python中的__call__()方法,这个方法使得一个类(假设是MyClass)的实例化对象(myclass)可以直接用myclass()调用__call__()方法,而不需要myclass.__call__()这样显示调用。以下代码的输出是调用了__call__函数, 其中age=23, name=Eliy,可见myclass()等于myclass.__call__():

class MyClass:
    def __call__(self, age, name) -> Any:
        print(f"调用了__call__函数, 其中age={age}, name={name}")

if __name__ == '__main__':
    mycalss = MyClass()
    # 观察是否会调用__call__()
    mycalss(age=23, name= 'Eliy')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

pytorch中自定义的网络结构都需要继承nn.Module类,这个类里面有self.forward()函数,自定义类需要重写这个函数,具体内容是实现前向传播。用resnet网络为例,forward函数内容如此:

    def forward(self, x):
    	# 忽略每一层的具体结构,观察输入x的流向
    	# 前向传播就是output = model(input)的数据处理过程
        out = F.relu(self.bn1(self.conv1(x)))
        out = self.layer1(out)
        out = self.layer2(out)
        out = self.layer3(out)
        out = self.layer4(out)
        out = F.avg_pool2d(out, 4)
        out = out.view(out.size(0), -1)
        out = self.fc(out)
        return out
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

需要注意的是,在nn.Module类中的__call__()方法里面,会去调用nn.Module的forward()方法,因此要得到自己model的输出,不必显式调用model.forward(input),直接model(input),此时会调用__call__(),进一步调用forward()。

反向传播

反向传播算法(back propagation),全称是误差反向传播算法,这里的误差实际就是目标函数/损失函数,即模型的输出y’与真实标签y之间的误差。反向传播算法通过使用链式法则,从网络的输出层开始,沿着网络的连接逐层向后计算梯度。这个过程实际上就是计算损失函数对于每个参数的偏导数,然后将这些偏导数整合成梯度。这些梯度随后可以被用于梯度下降等优化算法中,来更新网络参数以最小化损失函数。 反向传播算法与梯度下降算法结合使用,用于训练神经网络模型,具体来说是,反向传播算法计算梯度下降算法所需要的梯度。

因为模型中有很多可训练参数(假设用W表示),因此损失函数E是关于W的多元函数,高等数学学习了多元函数求偏导的方法,以及符合函数求导的链式法则,反向传播求梯度需要用到这些知识。 假设y=f(u(x)),求关于x的导数,如下:
在这里插入图片描述
我们按照第一张图片给出的三层神经网络,以MSE作为损失函数(假设这里是二分类用softmax作为激活函数的话,输出是(y1,y2)这样的向量,计算MSE就逐元素相减,再平方再相加),具体以反向传播计算w1_11的偏导为例:
在这里插入图片描述

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号