深度学习 16. 反向传递算法最简单的理解与提高,BP算法,Backpropagation, 自己的心得。

版权声明:本文为博主原创文章,转载必须注明是转载文章和原文超链接以及作者信息。 https://blog.csdn.net/qq_20259459/article/details/71080702

本文为原创文章转载必须注明本文出处以及附上 本文地址超链接  以及 博主博客地址http://blog.csdn.NET/qq_20259459  和 作者邮箱[email protected] )。

(如果喜欢本文,欢迎大家关注我的博客或者动手点个赞,对文章有建议和想法的欢迎邮件联系我,如有问题需要帮助欢迎留下评论我会及时给出答复)



在开始本文之前我想先介绍几个易混淆的定义:

监督学习:在Objective function中如果存在监督的信号,则该学习为监督学习。

梯度下降:利用Objective function作为期望值从而得到error,再寻找最优结果。

反向传递:基于梯度下降的一种优化算法


在BP中我们可能用到监督学习也有可能不是监督学习,并且BP算法并不是等价于梯度下降算法,BP基于GD算法但是同时具备多种优化算法。

BP算法是目前机器学习最最基础和重要的算法。



BP算法分为几个步骤:

首先我们拥有一个数据集:{X,Y}这里可以是,X是data,Y是label。也可以是X是数值,Y是目标函数。也是可以是加上noise的数据和目标值。

1. 选择一个X。

2. Forward Pass: X将经过整个训练网络(激活),得到input,hidden,output。

3. Error Computation: 我们将最终值(output)与Y相减得到error值。

4. Compute Weight Change: 通过已有error可以计算出整个网络的权值更变,得到input',hidden',output'。这一步我们将缩小全局错误值。

5. Update Network: 更新整个网络数值,得到新的input。

6. Repeat 2-5: 重复上面步骤,当error小于我们设定的阀值时将停止,并选择新的X重复步骤1-6。



---------------------------------------分割线-------------------------------------------------------


对于BP的推导,很多人都会觉得很难理解和运用,其实就我而言BP并没有那么的复杂,其思路是很简单的。

下面我将用最简单的方法介绍BP的推导过程(自己以前学习时的笔记,如有不清晰见谅):


1. 首先是forward pass的部分,我们不需要一个一个node的去看,也不用去看整个网络,这需要看一个node,仅仅一个就能说明所有:


这里我们可以看到对于一个forward pass的算法我们计算过程如图所示,这个应该所有人都理解吧。Y是output,Y计算也是非常简单的,而这里的Y是可以对应于任何的forward pass的output的,比如hidden layer output, output layer output。因此我们只要记住这一个公式就好了。



2. Error计算

我们在推导BP算法的时候用E = D - Y来计算error。 这里D是预期值(目标函数),Y是你的网络的训练结果(output)。



3. Backward pass的部分,如同forward pass的部分一样我们并不需要每一个都去记忆,只需要记住一个node的计算即可:


这里我们可以看清楚我们往回更新的一直都是为了为每个node更新它的错误(error)值。这里包括了input的两个node也要更新。



4. Weight Update: 这里我们根据每个node求得的error值来算出新的weight,新的weight'=weight+delta weight。


这里我们可以看清楚 delta weight的等价式子有两个,这里其实数学如果很好且有神经网络基础的人是很容易看明白他们之间的等价关系的。我在这里先解释下第一个式子这个是通过学习率和求导来计算delta的大小的,这个也是学习的最本质的内容,就是计算错误。

其次再说明一下第二个式子,第二个式子是个等式,因为我们化简之后就会得到一样的结果。而我们在学习BP算法 的时候肯定也必须要了解第二个式子是如何化解的,那么我们为什么需要第二个式子,因为第二个式子中就是梯度下降法。



5. 梯度下降的推导(重点):

1. 接下来的推导就是BP算法大家最容易混淆的地方,我们的举例仍然是针对数据集:{X,Y}来说的。

X是我们现有数据,那么网络的input signal就是:

这样我们就得到了实际网络训练时的input——Z. 同时我们将hidden signal命名为H。


2. 在学习BP算法推导的时候,我们通常分别用hidden to input(H-I)和output to hidden(O-H)两个部分去推导上面那个GD的式子在不同阶段的结果。但是并不需要记那么多,下面就是GD的推导式:


这里的input指的是在针对O-H和H-I两个步骤都是用原来网络中前一层值来计算,这里也就是下面这两个式子:


hj表示O-H,ih表示H-I,W是权值,Z是input signal,H是hidden signal。

写出这个式子的目的是为了可以进行简化操作以获得结果。



针对上面式子中每一个部分是这样的:

1. 首先是delta error的计算,利用MSE function来计算:



2. 然后就是每一部分的化简:


这里H和Z的求法我上面已经写出了,请仔细查看。


3. 这样我们就可以得到式子1和式子2的化简结果:


可以看出这个是非常简单的结果式子。


4. 虽然上图所示的结果已经是理论上的delta weight了,但是我们知道在使用MSE来获得最小值的时候会有local minima MSE的问题出现,为了解决这个问题,BP算法中加入了动量这一个方法:


说简单点就是给学习一个动量,让学习过程不会再区域最低值那里停下来,从而获得全局最小值(Global minima MSE).



---------------------------------------分割线-------------------------------------------------------


自此BP的理论介绍已经完全结束了,接下来一段简单的根据理论编写的代码(BP算法在MLP中的运用),大家可以任意修改里面的参数进行训练。通过对代码的理解也会对BP的理论知识的理解有很好的帮助,下面就是示例代码:

% BACKPROPAGATION ALGORITHM: ONLY FOR SINGLE HIDDEN LAYER
%% 
% 定义pattern 这里的pattern在自己操作的时候是在cross-space中的对应的点
pattern=[0.1 0.1 0.1 
0.1 .95  .95 
.95  0.1 .95
.95  .95 0.1]; 

%% 初始化参数
eta = 0.1;				% Learning rate
alpha = 0.8;			% Momentum
tol = 0.001;			% Error tolerance
Q = 4;       			% Total no. of the patterns to be input
n = 2; q = 2; p = 1;	% Architecture 网络结构 n-q-p

%% 定义weight相关函数
Wih = 2 * rand(n+1,q) - 1;	% Input-hidden weight matrix
Whj = 2 * rand(q+1,p) - 1;	% Hidden-output weight matrix
DeltaWih = zeros(n+1,q);	% Weight change matrices
DeltaWhj = zeros(q+1,p);
DeltaWihOld = zeros(n+1,q);
DeltaWhjOld = zeros(q+1,p);

%% 网络参数
Si = [ones(Q,1) pattern(:,1:2)];	% Input signals
D = pattern(:,3);						% Desired values

Sh = [1 zeros(1,q)];		% Hidden neuron signals 
Sy = zeros(1,p);			% Output neuron signals
deltaO = zeros(1,p);		% Error-slope product at output
deltaH = zeros(1,q+1);	% Error-slope product at hidden
sumerror = 2*tol;			% To get in to the loop

%% weight updata (BP algorithm)
while (sumerror > tol)	% Iterate
   for k = 1:Q
      Zh = Si(k,:) * Wih;				% Hidden activations
      Sh = [1 1./(1 + exp(-Zh))];       % Hidden signals
      Yj = Sh * Whj;					% Output activations
      Sy = 1./(1 + exp(-Yj));			% Output signals
      Ek = D(k) - Sy;					% Error vector
      deltaO = Ek .* Sy .* (1 - Sy);    % Delta output求导过程,激活函数是sigmoid
      for h = 1:q+1                     
         DeltaWhj(h,:) = deltaO * Sh(h);% Delta W: hidden-output
      end
      for h = 2:q+1							 % Delta hidden
         deltaH(h) = (deltaO * Whj(h,:)') * Sh(h) * (1 - Sh(h));
      end 
      for i = 1:n+1							 % Delta W: input-hidden
         DeltaWih(i,:) = deltaH(2:q+1) * Si(k,i);
      end
      Wih = Wih + eta * DeltaWih + alpha * DeltaWihOld;
      Whj = Whj + eta * DeltaWhj + alpha * DeltaWhjOld;      
      DeltaWihOld = DeltaWih;				 % Store changes
      DeltaWhjOld = DeltaWhj;
      sumerror = sumerror + sum(Ek.^2); % Compute error
   end    
   sumerror	% Print epoch error
end  


这里可以改得参数有很多,也可以自己添加,比如添加epoch,BN也可以根据这个简单的代码来实现自己的自编码的程序(AE),大家随心改动即可。


同时我们知道BP算法可以实现function approximation和classification两个功能。这里是实现这两个功能的要求:


根据这个大家同样可以通过修改上面代码的output activation function从现有的sigmoid变成linear function来实现函数趋近的功能。



通过代码和理论相互结果相信大家就会非常扎实的掌握BP算法所有的知识,且对调参也会有好的帮助。



本文为原创文章转载必须注明本文出处以及附上 本文地址超链接  以及 博主博客地址http://blog.csdn.NET/qq_20259459  和 作者邮箱[email protected] )。

(如果喜欢本文,欢迎大家关注我的博客或者动手点个赞,对文章有建议和想法的欢迎邮件联系我,如有问题需要帮助欢迎留下评论我会及时给出答复)

猜你喜欢

转载自blog.csdn.net/qq_20259459/article/details/71080702
今日推荐