Stanford机器学习---第五周.BP神经网络算法

第五周  BP神经网络算法Back propagation algorithm

关键词

            代价函数J(Θ)、反向传播、梯度检验、随机初始化、自动驾驶

重要的话

           反向传播神经网络算法的目的是优化神经网络层与层之间的传递参数Θ,本质就是梯度下降,沿着偏导数的方向下降直至代价函数最小,需要注意的几点就是代价函数J(Θ)、偏导数∂J(Θ)的表示、参数Θ的随机初始化以及运行过程中的梯度检验问题,最后以自动驾驶为例简单介绍BP神经网络的实际应用。

梯度下降算法的一般形式:


《Stanford机器学习---第五周.BP神经网络算法》

BP神经网络算法Back propagation algorithm

算法的大致流程总结如下:

step1:randomly initialized weights %随机初始化Θ
repeat until convergence{
    step2:利用初始化Θ,前向传播计算输出值hΘ(x)
    step3:利用初始化Θ,前向传播得到J(Θ)
    step4:计算误差δ,反向传播得到偏导数∂J(Θ)
    step5:梯度检验
    step6:递归下去直至收敛
}

《Stanford机器学习---第五周.BP神经网络算法》


好了,如果对此你有点感觉,那么请接着往下看~

==========================不怎么华丽的分割线========================

(一)代价函数J(Θ)

神经网络会有多个隐藏层,相当于在原来的二维矩阵运算上又增加了一个维度,所以代价函数J(Θ)的表达也显得很复杂,你可以理解为各层代价函数(误差函数)之和。从下图你也可以很好的发现,神经网络就是逻辑回归的推广,逻辑回归可看成没有隐藏层的神经网络。

《Stanford机器学习---第五周.BP神经网络算法》



★★★(二)反向传播算法Back propagation Algorithm

这里主要介绍如何通过反向传播得到偏导数∂J(Θ)

反向传播的方向:输出层—>隐藏层—>输入层

首先引入误差变量δδ可以理解为某层某个单元的激励值与实际值的偏差,对于最后一层输出层来说,δ(4) = a(4) – y ,以下图中四层神经网络为例,δ(4)δ(3)的传递要借助sigmoid函数的导数,见下图中的计算公式;

《Stanford机器学习---第五周.BP神经网络算法》

《Stanford机器学习---第五周.BP神经网络算法》

接着,引入Δ,它的计算公式见下一张图片,至于为什么引入Δ,你会发现它与最终结果∂J(Θ)直接相关。

《Stanford机器学习---第五周.BP神经网络算法》

以上只是介绍了如何进行反向传播得到偏导数∂J(Θ),如果读者对推导的过程和原理感兴趣,可以查阅相关书籍。


      综上,BP神经网络的两个最关键的参数已经会求解了,如果你对矩阵、上下标感到比较困惑,没有关系,文章最后会给出一个大致的matlab求解代码,可供参考、加深理解。


(三)梯度检验Gradient checking

为了检验梯度下降算法是否正常工作,引入梯度检验。

所谓的梯度检验,就是用数值计算的方法得到近似估计的偏导数,与反向传播的偏导数比较,如果误差足够的小就确保梯度下降正常工作。

如何得到近似估计的偏导数?数值计算的方法就是双侧的差分。

下图所示是单变量的估计情况,有点瞬时变化率与导数的关系:

《Stanford机器学习---第五周.BP神经网络算法》

对于多个参数Θ,把直接求导换成偏导数理解即可,如下图:

《Stanford机器学习---第五周.BP神经网络算法》

重要提醒

           梯度检验过程时间复杂度高、效率低下,换句话说,梯度检验要比反向传播慢很多,所以并不需要每次迭代后都要进行梯度检验。


(四)随机初始化Random initialization

     在逻辑回归、线性回归里,我们在使用梯度下降算法之前,传入的参数θ都是零向量,然而在神经网络里并不适用,因为通过一系列运算你会发现,如果所有层与层传递参数Θ初始化为0,计算结果是同一层每个单元向下层传递的参数都相同,造成高度冗余,这并不是我们最终想看到的结果,解决的办法就是random initialization.

[matlab里的random()函数]

《Stanford机器学习---第五周.BP神经网络算法》


★★★(五)综述Putting it together

(或者参考文章开始的Back propagation algorithm流程)

对于一个问题如果你想要使用神经网络,有如下步骤:

一.搭建网络框架

     通常选择一个隐藏层,隐藏层的单元数量稍大于输入层的特征数目即可;

     若有多个隐藏层,保证各隐藏层的单元数目相同;

     注意多类别分类问题,输出层不止一个输出单元,用0-1列向量表示即可.

《Stanford机器学习---第五周.BP神经网络算法》

二.训练神经网络

     step1.参数Θ随机初始化

    step2.利用初始化Θ,前向传播计算输出值hΘ(x)

     step3.利用初始化Θ,前向传播得到代价函数值J(Θ)

    step4.利用反向传播算法计算误差δ、Δ,得到J的偏导数∂J(Θ)

     step5.梯度检验(注意不需要时及时关闭)

     step6.利用梯度下降或者更高级的优化算法,最小化代价函数J(Θ)得到优化结果Θ


Matlab部分程序(仅具有参考价值,无法运行)

以三层神经网络为例
// ================ Part 1: Initializing Pameters ================
/*
   randInitialzeWeights  初始化函数;
   ini_Theta1 第一层到第二层的传递参数;
   ini_Theta2 第二层到第三层的传递参数;
   ini_Theta  两层参数合并到一起,便于矩阵运算;
   input_layer_size  输入层的单元数量;
   hidden_layer_size 隐藏层的单元数量;
   num_labels        输出层的单元数量;
*/
load('ex4data1.mat');// Load Training Data

ini_Theta1 = randInitializeWeights(input_layer_size, hidden_layer_size);
ini_Theta2 = randInitializeWeights(hidden_layer_size, num_labels);
ini_Theta = [init_Theta1(:) ; ini_Theta2(:)];// Unroll parameters

// =================== Part 2: Training NN ===================
/*
  fmincg          高级优化算法用来训练样本,内置函数;
  nnCostFunction  返回代价函数J(Θ)和∂J(Θ)
  X               输入样本集;
  y               输出集;
  Theta           神经网络优化后各层的传递参数Θ
*/
fprintf('\nTraining Neural Network... \n')

options = optimset('MaxIter', 50);
lambda = 1;
checkNNGradients(lambda);//梯度检验

costFunction = @(p) nnCostFunction(p, ...
                                   input_layer_size, ...
                                   hidden_layer_size, ...
                                   num_labels, X, y, lambda);
 
[Theta, cost] = fmincg(costFunction, ini_Theta, options);//算法核心

fprintf('Program ends.\n');
pause;

//=====nncostFuction求偏导数grad部分=======
/*
   a1、a2、a3  激励函数
   delta       误差函数δ
   Delta       Δ
   Theta_grad  ∂J(Θ)
*/
delta3 = zeros(num_labels,m);
delta2 = zeros(hidden_layer_size,m);
Delta2 = zeros(num_labels,hidden_layer_size+1);
Delta1 = zeros(hidden_layer_size,input_layer_size+1);

   a1 =  X;//step1
   a2 = sigmoid(Theta1*a1');
   a2 = [ones(1,m);a2];
   a3 = sigmoid(Theta2*a2);
   delta3 = a3 - temp';//step2
   delta2 = Theta2(:,2:end)'*delta3.*sigmoidGradient(Theta1*X');
                                                 //step3
   Delta2 = Delta2 + delta3*a2';
   Delta1 = Delta1 + delta2*a1;

Theta1_grad = Delta1/m; 
Theta2_grad = Delta2/m;

(六)BP神经网络的应用—自动驾驶

Andrew Ng播放了一个关于自动驾驶的视频,使用的算法就是BP神经网络。

Ⅰ.训练过程:

首先人工驾驶汽车,汽车上安装有传感器、驱动器和照相机,照相机每隔一段时间对前方的路面拍照,每张照片压缩成20X20的点阵,用一个400X1的行向量存储;假设拍了4000张照片,就有相当于4000个样本集,神经网络的输入变量x=matrix(4000,400);同时记录驾驶员对方向盘的操作,作为样本输出y(可看成多类别分类);

接着,利用BP神经网络算法对神经网络层与层之间的传递参数Θ进行优化,取优化结果最好网络用于接下来的预测;

Ⅱ.预测过程:

最后,汽车自动驾驶,对拍的照片压缩成的像素点阵作为输入,经过神经网络正向传播得到假设函数值hΘ(x),接下来就是驱动器操作方向盘了,视频让人目瞪口呆。神!

《Stanford机器学习---第五周.BP神经网络算法》


================================结语==============================

    本周主要讲述了神经网络的学习过程—BP神经网络算法,重点在于反向传播算法Back propagation Algorithm、梯度检验Gradient Decent的理解,希望对后来的学习者能起到些许帮助。

    原文作者:神经网络算法
    原文地址: https://blog.csdn.net/u012717411/article/details/50555249
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞