卷积神经网络前向传播,卷积层如何反向传播

如何对CNN网络的卷积层进行反向传播

在多分类中,CNN的输出层一般都是Softmax。RBF在我的接触中如果没有特殊情况的话应该是“径向基函数”(RadialBasisFunction)。

在DNN兴起之前,RBF由于出色的局部近似能力,被广泛应用在SVM的核函数中,当然也有我们熟悉的RBF神经网络(也就是以RBF函数为激活函数的单隐含层神经网络)。

如果说把RBF作为卷积神经网络的输出,我觉得如果不是有特殊的应用背景的话,它并不是一个很好的选择。至少从概率角度上讲,RBF没有Softmax那样拥有良好的概率特性。

如果题主是在什么地方看到它的源代码并且感到困惑的话,可以贴上源链接一起讨论一下。

的定义和计算公式参考:/link?url=7LE6KImv5IveCM90JcnctlgVY7OgCd7E_G0Yv0vyTfV3P8S3Q_rZU3CM6f0udS-b6ux2w-hejkOrGMkmj8Nqba。

谷歌人工智能写作项目:小发猫

卷积神经网络是如何反向调整参数的?

如何理解神经网络里面的反向传播算法

反向传播算法(Backpropagation)是目前用来训练人工神经网络(ArtificialNeuralNetwork,ANN)的最常用且最有效的算法。

其主要思想是:(1)将训练集数据输入到ANN的输入层,经过隐藏层,最后达到输出层并输出结果,这是ANN的前向传播过程;(2)由于ANN的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层;(3)在反向传播的过程中,根据误差调整各种参数的值;不断迭代上述过程,直至收敛。

反向传播算法的思想比较容易理解,但具体的公式则要一步步推导,因此本文着重介绍公式的推导过程。1.变量定义上图是一个三层人工神经网络,layer1至layer3分别是输入层、隐藏层和输出层。

如图,先定义一些变量:表示第层的第个神经元连接到第层的第个神经元的权重;表示第层的第个神经元的偏置;表示第层的第个神经元的输入,即:表示第层的第个神经元的输出,即:其中表示激活函数。

2.代价函数代价函数被用来计算ANN输出值与实际值之间的误差。

常用的代价函数是二次代价函数(Quadraticcostfunction):其中,表示输入的样本,表示实际的分类,表示预测的输出,表示神经网络的最大层数。

3.公式及其推导本节将介绍反向传播算法用到的4个公式,并进行推导。如果不想了解公式推导过程,请直接看第4节的算法步骤。

首先,将第层第个神经元中产生的错误(即实际值与预测值之间的误差)定义为:本文将以一个输入样本为例进行说明,此时代价函数表示为:公式1(计算最后一层神经网络产生的错误):其中,表示Hadamard乘积,用于矩阵或向量之间点对点的乘法运算。

公式1的推导过程如下:公式2(由后往前,计算每一层神经网络产生的错误):推导过程:公式3(计算权重的梯度):推导过程:公式4(计算偏置的梯度):推导过程:4.反向传播算法伪代码输入训练集对于训练集中的每个样本x,设置输入层(Inputlayer)对应的激活值:前向传播:,计算输出层产生的错误:反向传播错误:

caffe里面的误差的反向传播怎么实现来的

首先概括回答一下这个问题,分类的CNN是有监督的,就是在最后一层计算分类结果的loss,然后利用这个loss对整个网络进行更新,更新的关键就是计算梯度和偏置的导数dW和db,而BackPropagation主要就是为了解决前面的层的dW不容易计算的问题,具体是将loss通过一个残差delta一层一层往前传,因此无论是全连接层还是卷积层,全部是有监督的。

至于实现BP的理论和推导,cjwdeq同学已经讲的非常清楚了。既然答题组的大大们总说要发扬“左手代码,右手公式”的精神,我就结合caffe的源码讲讲具体反向传播是怎么实现的。

先从简单的全连接层入手:打开,里面的Backward_cpu函数实现了反向传播的过程。

(如果使用的是GPU,则会调用文件里的Backward_gpu函数,实现过程是类似的)先通过LayerSetUp函数明确几个变量:N_=num_output;K_=bottom[0]->count(axis);M_=bottom[0]->count(0,axis);N_表示输出的特征维数,即输出的神经元的个数K_表示输入的样本的特征维数,即输入的神经元的个数M_表示样本个数因此全连接层的W维数就是N_×K_,b维数就是N_×1weight_shape[0]=N_;weight_shape[1]=K_;vectorbias_shape(1,N_);this->blobs_[1].reset(newBlob(bias_shape));下面一行一行看Backward_cpu函数的代码,整个更新过程大概可以分成三步:(顺便盗几个cjwdeq同学贴的公式,哈哈)1.caffe_cpu_gemm(CblasTrans,CblasNoTrans,N_,K_,M_,(Dtype)1.,top_diff,bottom_data,(Dtype)0.,this->blobs_[0]->mutable_cpu_diff());这一句是为了计算dW,对应公式就是1.jpg其中的bottom_data对应的是a,即输入的神经元激活值,维数为K_×N_,top_diff对应的是delta,维数是M_×N_,而caffe_cpu_gemm函数是对blas中的函数进行封装,实现了一个N_×M_的矩阵与一个M_×K_的矩阵相乘(注意此处乘之前对top_diff进行了转置)。

相乘得到的结果保存于blobs_[0]->mutable_cpu_diff(),对应dW。

2.caffe_cpu_gemv(CblasTrans,M_,N_,(Dtype)1.,top_diff,bias_multiplier_.cpu_data(),(Dtype)0.,this->blobs_[1]->mutable_cpu_diff());这一句是为了计算db,对应公式为2.jpgcaffe_cpu_gemv函数实现了一个M_×N_的矩阵与N_×1的向量进行乘积,其实主要实现的是对delta进行了一下转置,就得到了db的值,保存于blobs_[1]->mutable_cpu_diff()中。

此处的与bias_multiplier_.cpu_data()相乘是实现对M_个样本求和,bias_multiplier_.cpu_data()是全1向量,从公式上看应该是取平均的,但是从loss传过来时已经取过平均了,此处直接求和即可。

(感谢@孙琳钧和@辛淼同学的提醒)3.caffe_cpu_gemm(CblasNoTrans,CblasNoTrans,M_,K_,N_,(Dtype)1.,top_diff,this->blobs_[0]->cpu_data(),(Dtype)0.,bottom[0]->mutable_cpu_diff());这一句是为了利用后面层传过来的delta_l+1计算本层的delta_l,对应公式为3.jpg主要Inner_product层里面并没有激活函数,因此没有乘f’,与f’的相乘写在ReLU层的Backward函数里了,因此这一句里只有W和delta_l+1相乘。

blobs_[0]->cpu_data()对应W,维度是N_×K_,bottom[0]->mutable_cpu_diff()是本层的delta_l,维度是M_×K_。

写了这么多,Backward_cpu函数终于结束了。但是更新其实没结束,我最初看源码时就觉得奇怪,因为Backward_cpu函数里只计算了dW,db,delta,并没有对W和b进行更新呀?

后来才发现,其实caffe里的反向传播过程只是计算每层的梯度的导,把所有层都计算完之后,在里面统一对整个网络进行了更新。

具体是在step函数里先通过ComputeUpdateValue把learningrate、momentum、weight_decay什么的都算好,然后调用了的update函数逐层更新,对应公式就是:4.jpg。

正向传播反向传播是什么?

题主问的应该是神经网络中的问题。正向传播是指数据从X传入到神经网络,经过各个隐藏层得到最终损失的过程。

反向传播主要是针对神经网络优化的过程中进行,在L端计算总的损失函数,然后根据梯度递减公式,逐层的向前反馈,形成反向传播机制,可以优化参数。

如何理解CNN神经网络里的反向传播backpropagation,bp算法

类比来说类似于几个人站成一排第一个人看一幅画(输入数据),描述给第二个人(隐层)……依此类推,到最后一个人(输出)的时候,画出来的画肯定不能看了(误差较大)。

反向传播就是,把画拿给最后一个人看(求取误差),然后最后一个人就会告诉前面的人下次描述时需要注意哪里(权值修正)。

深度神经网络是如何训练的?

Coursera的Ng机器学习,UFLDL都看过。没记错的话Ng的机器学习里是直接给出公式了,虽然你可能知道如何求解,但是即使不知道完成作业也不是问题,只要照着公式写就行。

反正我当时看的时候心里并没能比较清楚的明白。我觉得想了解深度学习UFLDL教程-Ufldl是不错的。有习题,做完的话确实会对深度学习有更加深刻的理解,但是总还不是很清晰。

后来看了LiFeiFei的StanfordUniversityCS231n:ConvolutionalNeuralNetworksforVisualRecognition,我的感觉是对CNN的理解有了很大的提升。

沉下心来推推公式,多思考,明白了反向传播本质上是链式法则(虽然之前也知道,但是当时还是理解的迷迷糊糊的)。所有的梯度其实都是对最终的loss进行求导得到的,也就是标量对矩阵or向量的求导。

当然同时也学到了许多其他的关于cnn的。并且建议你不仅要完成练习,最好能自己也写一个cnn,这个过程可能会让你学习到许多更加细节和可能忽略的东西。

这样的网络可以使用中间层构建出多层的抽象,正如我们在布尔线路中做的那样。

例如,如果我们在进行视觉模式识别,那么在第一层的神经元可能学会识别边,在第二层的神经元可以在边的基础上学会识别出更加复杂的形状,例如三角形或者矩形。第三层将能够识别更加复杂的形状。依此类推。

这些多层的抽象看起来能够赋予深度网络一种学习解决复杂模式识别问题的能力。然后,正如线路的示例中看到的那样,存在着理论上的研究结果告诉我们深度网络在本质上比浅层网络更加强大。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值