Andrew Ng机器学习coursrea课程学习笔记(第5周)

一、神经网络 : 学习过程(Neural Networks : Learning)

1. 代价函数和反向传播算法(Cost Function and Backpropagation)

a. 代价函数

首先,定义几个变量

  • :为神经网络的层数
  • :为在神经网络第层的神经节点个数
  • :为神经网络输出单元个数

则为神经网络的第个输出,对于神经网络(用于分类问题),类似于逻辑回归的定义

代价函数第一部分为误差部分,第二部分为正则化部分,其中,偏置单元不进行正则化

b.反向传播算法(Backpropagation Algorithm)

反向传播算法是一种针对于神经网络,最小化代价函数的算法,类似于线性回归中的梯度下降算法。目标为,需要计算.

假设训练集为

参数说明:

:神经网络第层,第个节点的误差值

以下为求解的过程

step1:参数初始化

  • 令(对于所有l,i,j)

step2:前向传播

  • 令i=1,利用第一个样本计算下列步骤
  • 通过前向传播方式计算(对于所有的l=1,2,...,L)

例如,计算:

并添加

step3:计算输出误差值

计算最后一层误差值

step4:计算layer误差值

计算其它层的误差值

其中

:有

则可由上一层的误差值,推算出前一层的误差值

  • 具体证明可参考资料:Stanford机器学习---第五讲. 神经网络的学习 Neural Networks learning

step5:更新矩阵

计算
向量化,有:

重复step2-step5,使用所有样本,循环m次。

step6:计算

  • 如果D{(l)}_{i,j}=\frac{1}{m}\Delta{(l)}_{i,j}$

  • 如果,则

算法伪代码过程:

for i=1 to m:

    令

    通过前向传播方式计算(对于所有的l=1,2,...,L)

    利用,计算

    计算$\delta{(L-1)},\delta{(L-2)},\dots,\delta^{(2)}$$

    计算

;

;

;

c.反向传播算法理解(Backpropagation intuition)

为更好的理解反向传播,需要了解前向传播。构造如下神经网络
\begin{bmatrix} x_0\\ x_1\\ x_2\\ \dots\\ x_n\\ \end{bmatrix} \rightarrow \begin{bmatrix} a_0^{(2)}\\ a_1^{(2)}\\ a_2^{(2)}\\ \dots\\ \end{bmatrix} \rightarrow \begin{bmatrix} a_0^{(3)}\\ a_1^{(3)}\\ a_2^{(3)}\\ \dots\\ \end{bmatrix} \rightarrow \dots \rightarrow \begin{bmatrix} h_\Theta(x)_1\\ h_\Theta(x)_2\\ \dots\\ h_\Theta(x)_K\\ \end{bmatrix}
其中为偏置单元,等于1.

  • 给定神经网络参数 ,则对于输入层x数据,易计算第二层激励单元数据,以此类推,直到计算最后一层输出层数据,得到输出结果。这样的由输入层往输出层的计算过程,称为前向传播。
  • 在完成前向传播计算过程后,易计算该神经网络的总误差为 ,但不知道前面神经层的节点误差,然而,可以通过一层的误差值,以及激励值,计算前一层的误差值。这样,误差值的计算过程,由输出层往输入层方向逐步计算,故称为反向传播。

对问题进行简化,考虑二分类问题(即K=1),则其代价函数为:

直观上, 为神经网络节点的误差,形式上,它的值为代价函数的导数,即:

;

为了计算每一个,需要从输出层往输入层计算,可以认为,误差在传递的过程中,按权重传递,则反过来计算,有 (不考虑偏置单元的误差,即不考虑 )

2. 运用反向传播实现神经网络(Backpropagation in Practice)

a. 参数展开(Implementation Note:Unrolling Parameters)

在神经网络的学习过程中,其一般步骤如下:

神经网络学习算法伪代码:(matlab)

%%初始化参数Theta1,Theta2
%%将矩阵型参数Theta1,Theta2展开,并合并成一个长向量initialTheta
fminunc(@costFunction,initialTheta,option); %%使用内置最优化函数求解参数Theta

%%costFunction定义如下:
function(jval,gradientVec)=costFunction(thetaVec)
%%从thetaVec还原出矩阵型参数Theta1,Theta2。
%%使用反向传播算法计算Delta1,Delta2,从而得到梯度值,
%%展开合并Delta1,Delta2得到gradientVec
end

 在神经网络中,所采用的参数,如等,通常为矩阵形式,但在代码实现的过程中,通常,采用向量的形式,这就需要对矩阵进行展开成向量的形式。同时,也能从向量的形式还原成矩阵形式。

例如:(为1011的矩阵,为1011的矩阵,为111的矩阵)

展开过程:(matlab代码)

thetaVecter=[Theta1(:);Theta2(:);Theta3(:)];

还原过程

Theta1=reshape(thetaVecter(1:110),10,11);
Theta2=reshape(thetaVecter(111:220),10,11);
Theta3=reshape(thetaVecter(221:231),1,11);

b. 梯度计算检查(Gradient Checking)

对于反向传播计算来偏导数值,可以采用数值计算的方法去检验。

;

一般来说,计算结果比较接近真实值,如果通过数值计算出来的偏导数等于反向传播算法计算出来的偏导数,则可认为反向传播算法是正确的。这种验证,是耗时的,只需要验证一次,即对一个进行计算。

c. 随机初始参数(Random Initialization)

在我们的神经网络学习算法中,是需要初始化参数的,并不是所有的初始化参数都可以让神经网络正常工作,例如,对于初始化参数全0矩阵,是不可取的的。一般来说,随机初始化参数,会获得一个平均水平的学习过程,即不会太差。

例,在区间[]中,随机初始化参数,matlab代码:

INIT_EPSILON=2;
Theta1=rand(10,11)*(2*INIT_EPSILON)-INIT_EPSILON;

d. 总结(Put it Together)

- -选择神经网络模型(Pick a architecture)

对于神经网络问题,第一步是要选择一个神经网络模型。

  • 输入层的节点个数:代表输入特征的个数。
  • 输出层的节点个数:对于分类问题,类别的个数。
  • 隐藏层的节点个数:通常越多越好,需要考虑计算机的性能等条件。
  • 隐藏层的个数:默认1层,如果超过一层,其每层的节点个数建议相同

- -训练神经网络模型(Training)

  1. 随机初始权重值;
  2. 实现前向传播,从而对任意输入x,均可计算;
  3. 实现代价函数;
  4. 实现反向传播,计算出所有偏导数值
  5. 通过梯度数值计算验证反向传播算法的正确性,验证一次后,不需要再验证。
  6. 使用梯度下降算法,或内置优化算法函数,最下化代价函数,求得对于的值。

3. 神经网络的应用(Application of Neural Networks)

自动驾驶案例

  • 在该案例中,汽车通过摄像头,对马路进行识别,运用神经网络系统,将识别的照片作为神经网络的输入,方向盘的控制的方向作为输出,从而使得计算机自动驾驶汽车。
  • 在训练过程中,由人驾驶汽车,每隔2秒,生成一张照片,即为数据的x,记录司机方向盘的控制,即为数据y,将样本(x,y)作为训练数据,对神经网络进行训练。



全文参考 :coursera机器学习课程(Andrew Ng讲授)相关视频及讲义

你可能感兴趣的:(Andrew Ng机器学习coursrea课程学习笔记(第5周))