深度学习反向传播的理解

我认为反向传播可以大致理解为用多个线性函数复合一个非线性函数去拟合一类问题的过程,根据这一类问题中一个样本的正向传播计算得到的结果,再根据预测的结果与实际结果的差异反向传播得到预测的结果对这个函数的影响,从而提高下一次结果预测的准确率。这个过程的原理有些类似先验概率的求法。

而关于反向传播的算法,我觉得最重要的一点就是链式求导的实现,导数的求法并不是最重要的,关键在于实现程序的过程能不能把“链式”给实现出来。很多时候会容易出错,想借此机会梳理一下 此次反向传播的实现过程。

反向传播要注意层数的划分,必须明确输入层、隐藏层、输出层,还要主义输入层和隐藏层要“秘密”地在每一层新增一个神经元,用来调节bias,如果输入值的个数是1,那么就要两个输入层神经元,其中①号的神经元的值为这个输入值,②号神经元的值为1,②号神经元与下一层的每个神经元之间的weight就相当于下一层每个神经元的bias,bias = weight2,i*1,这样就可以通过bias[i]+= deltas[i]*learn来调整bias了,同样的,对每个隐藏层都新增一个神经元也是这样的目的。

跟我的程序写的差不多,我觉得反向传播过程大致可以分为:

  1. 初始化神经网络(设置输入层、隐藏层、输出层个数和初始值);
  2. 向前传播得到预测结果,Output[h]=fit_function((Σi=0输入层神经元个数weight[i][h]*input[i])+bias[h])

    3. 得到deltas:

①输出层到最后一层隐藏层:self.output_deltas = Error/(output_w)

output_deltas[o]=fit_function(output_cell[o])*(label[o]-output_cells[o])

②隐藏层之间的deltas:self.hidden_deltases = Error/(weight) weight是指隐藏层weight中的元素。

hidden_deltases[k][o]=fit_function_deriv(hidden_result[k][o])*(deltas[i]*weight[o][i]

   4. 更新weight :Weight[i][o] += deltas[o]*input[i]*learn

   5. 更新bias : bias[i]+= deltas[i]*learn 

以上基本上就是我理解的bp神经网络的过程和对它的一些看法。

猜你喜欢

转载自blog.csdn.net/dulingmo/article/details/83862271