机器学习公开课笔记(5):神经网络(Neural Network)——学习

这一章可能是Andrew Ng讲得最不清楚的一章,为什么这么说呢?这一章主要讲后向传播(Backpropagration, BP)算法,Ng花了一大半的时间在讲如何计算误差项$\delta$,如何计算$\Delta$的矩阵,以及如何用Matlab去实现后向传播,然而最关键的问题——为什么要这么计算?前面计算的这些量到底代表着什么,Ng基本没有讲解,也没有给出数学的推导的例子。所以这次内容我不打算照着公开课的内容去写,在查阅了许多资料后,我想先从一个简单的神经网络的梯度推导入手,理解后向传播算法的基本工作原理以及每个符号代表的实际意义,然后再按照课程的给出BP计算的具体步骤,这样更有助于理解。

简单神经网络的后向传播(Backpropagration, BP)算法

1. 回顾之前的前向传播(ForwardPropagration, FP)算法

FP算法还是很简单的,说白了就是根据前一层神经元的值,先加权然后取sigmoid函数得到后一层神经元的值,写成数学的形式就是:

$$a^{(1)}=X$$

$$z^{(2)}=\Theta^{(1)}a^{(1)}$$

$$a^{(2)}=g(z^{(2)})$$

$$z^{(3)}=\Theta^{(2)}a^{(2)}$$

$$a^{(3)}=g(z^{(3)})$$

$$z^{(4)}=\Theta^{(3)}a^{(3)}$$

$$a^{(4)}=g(z^{(4)})$$

2. 回顾神经网络的代价函数(不含regularization项)

$J(\Theta) = -\frac{1}{m}\left[\sum\limits_{i=1}^{m}\sum\limits_{k=1}^{K}y^{(i)}_{k}log(h_\theta(x^{(i)}))_k + (1-y^{(i)}_k)log(1-(h_\theta(x^{(i)}))_k)\right]$

3. 一个简单神经网络的BP推导过程

BP算法解决了什么问题?我们已经有了代价函数$J(\Theta)$,接下来我们需要利用梯度下降算法(或者其他高级优化算法)对$J(\Theta)$进行优化从而得到训练参数$\Theta$,然而关键问题是,优化算法需要传递两个重要的参数,一个代价函数$J(\Theta)$,另一个是代价函数的梯度$\frac{\partial J(\Theta)}{\partial \Theta}$,BP算法其实就是解决如何计算梯度的问题

下面我们从一个简单的例子入手考虑如何从数学上计算代价函数的梯度,考虑如下简单的神经网络(为方便起见,途中已经给出了前向传播(FP)的计算过程),该神经网络有三层神经元,对应的有两个权重矩阵$\Theta^{(1)}$和$\Theta^{(2)}$,为计算梯度我们只需要计算两个偏导数即可:$\frac{\partial J(\Theta)}{\partial\Theta^{(1)}}$和$\frac{\partial J(\Theta)}{\partial\Theta^{(2)}}$。

首先我们先计算第2个权重矩阵的偏导数,即$\frac{\partial}{\partial\Theta^{(2)}}J(\Theta)$。首先我们需要在$J(\Theta)$和$\Theta^{(2)}$之间建立联系,很容易可以看到$J(\Theta)$的值取决于$h_\theta(x)$,而$h_\theta(x)=a^{(3)}$, $a^{3}$又是由$z^{(3)}$取sigmoid得到,最后$z^{(3)}=\Theta^{(2)}\times a^{(2)}$,所以他们之间的联系可以如下表示:

按照求导的链式法则,我们可以先求$J(\Theta)$对$z^{(3)}$的导数,然后乘以$z^{(3)}$对$\Theta^{(2)}$的导数,即

$$\frac{\partial}{\partial\Theta^{(2)}}J(\Theta) = \frac{\partial}{\partial z^{(3)}}J(\Theta) \times \frac{\partial z^{(3)}}{\partial \Theta^{(2)}} $$

由$z^{(3)}=\Theta^{(2)}a^{(2)}$不难计算$\frac{\partial z^{(3)}}{\partial \Theta^{(2)}}=(a^{(2)})^T$,令$\frac{\partial}{\partial z^{(3)}}J(\Theta)=\delta^{(3)}$,上式可以重写为

$$\frac{\partial}{\partial\Theta^{(2)}}J(\Theta) =\delta^{(3)} (a^{(2)})^T$$

接下来仅需要计算$\delta^{(3)}$即可,由上一章的内容我们已经知道$g‘(z)=g(z)(1-g(z))$, $h_\theta(x)=a^{(3)}=g(z^{(3)})$,忽略前面的$1/m\sum\limits_{i=1}^{m}$(这里我们只对一个example推导,最后累加即可)

$$\begin{aligned}\delta^{(3)}&=\frac{\partial J(\Theta)}{z^{(3)}}\\&= (-y)\frac{1}{g(z^{(3)})}g^{‘}(z^{(3)})-(1-y)\frac{1}{1-g(z^{(3)})} [1-g(z^{(3)})]‘\\&=-y(1-g(z^{(3)}))+(1-y)g(z^{(3)})\\&=-y+g(z^{(3)})\\&=-y+a^{(3)}\end{aligned}$$

至此我们已经得到$J(\Theta)$对$\Theta^{(2)}$的偏导数,即

$$\frac{\partial J(\Theta)}{\partial\Theta^{(2)}}=(a^{(2)})^T\delta^{(3)}$$

$$\delta^{(3)}=a^{(3)}-y$$

接下来我们需要求$J(\Theta)$对$\Theta^{(1)}$的偏导数,$J(\Theta)$对$\Theta^{(1)}$的依赖关系如下:

根据链式求导法则有

$$\begin{aligned}\frac{\partial J(\Theta)}{\partial \Theta^{(1)}} &= \frac{\partial J(\Theta)}{\partial z^{(3)}} \frac{\partial z^{(3)}}{\partial a^{(2)}} \frac{\partial a^{(2)}}{\partial \Theta^{(1)}}  \end{aligned}$$

我们分别计算等式右边的三项可得:

$$ \frac{\partial J(\Theta)}{\partial z^{(3)}}=\delta^{(3)}$$

$$\frac{\partial z^{(3)}}{\partial a^{(2)}}=(\Theta^{(2)})^T$$

$$\frac{\partial a^{(2)}}{\partial \Theta^{(1)}}=\frac{\partial a^{(2)}}{\partial z^{(2)}} \frac{\partial z^{(2)}}{\partial \Theta^{(1)}}=g‘(z^{(2)}) a^{(1)}$$

带入后得

$$\frac{\partial J(\Theta)}{\partial \Theta^{(1)}}=(a^{(1)})^T \delta^{(3)} (\Theta^{(2)})^T g‘(z^{(2)})$$

令$\delta^{(2)}=\delta^{(3)} (\Theta^{(2)})^Tg‘(z^{(2)})$, 上式可以重写为

$$\frac{\partial J(\Theta)}{\partial \Theta^{(1)}}=(a^{(1)})^T \delta^{(2)}$$

$$\delta^{(2)}=\delta^{(3)} (\Theta^{(2)})^T g‘(z^{(2)})$$

把上面的结果放在一起,我们得到$J(\Theta)$对两个权重矩阵的偏导数为:

$$\delta^{(3)}=a^{(3)}-y$$

$$\frac{\partial J(\Theta)}{\partial\Theta^{(2)}}=(a^{(2)})^T\delta^{(3)}$$

$$\delta^{(2)}=\delta^{(3)} (\Theta^{(2)})^T g‘(z^{(2)})$$

$$\frac{\partial J(\Theta)}{\partial \Theta^{(1)}}=(a^{(1)})^T \delta^{(2)}$$

观察上面的四个等式,我们发现

  • 偏导数可以由当前层神经元向量$a^{(l)}$与下一层的误差向量$\delta^{(l+1)}$相乘得到
  • 当前层的误差向量$\delta^{(l)}$可以由下一层的误差向量$\delta^{(l+1)}$与权重矩阵$\Delta^{l}$的乘积得到

所以可以从后往前逐层计算误差向量(这就是后向传播的来源),然后通过简单的乘法运算得到代价函数对每一层权重矩阵的偏导数。到这里算是终于明白为什么要计算误差向量,以及为什么误差向量之间有递归关系了。尽管这里的神经网络十分简单,推导过程也不是十分严谨,但是通过这个简单的例子,基本能够理解后向传播算法的工作原理了。

严谨的后向传播算法(计算梯度)

假设我们有$m$个训练example,$L$层神经网络,并且此处考虑正则项,即

$J(\Theta) = -\frac{1}{m}\left[\sum\limits_{i=1}^{m}\sum\limits_{k=1}^{K}y^{(i)}_{k}log(h_\theta(x^{(i)}))_k + (1-y^{(i)}_k)log(1-(h_\theta(x^{(i)}))_k)\right] + \frac{\lambda}{2m}\sum\limits_{l=1}^{L-1}\sum\limits_{i=1}^{s_l}\sum\limits_{j=1}^{s_{l+1}}(\Theta_{ji}^{(l)})^2$

初始化:设置$\Delta^{(l)}_{ij}=0$ (理解为对第$l$层的权重矩阵的偏导累加值)

For i = 1 : m

  • 设置 $a^{(1)}=X$
  • 通过前向传播算法(FP)计算对各层的预测值$a^{(l)}$,其中$l=2,3,4,\ldots,L$
  • 计算最后一层的误差向量 $\delta^{(L)}=a^{(L)}-y$,利用后向传播算法(BP)从后至前逐层计算误差向量 $\delta^{(L-1)}, \delta^{(L-1)}, \ldots, \delta^{(2)}$, 计算公式为$\delta^{(l)}=(\Theta^{(l)})^T\delta^{(l+1)}.*g‘(z^{(l)})$
  • 更新$\Delta^{(l)}=\Delta^{(l)}+\delta^{(l+1)}(a^{(l)})^T$

end // for

计算梯度:

$$D_{ij}^{(l)}=\frac{1}{m}\Delta^{(l)}_{ij},   j=0$$

$$D_{ij}^{(l)}=\frac{1}{m}\Delta^{(l)}_{ij}+\lambda\Theta_{ij}^{(l)},  j\neq 0$$

$$\frac{\partial J(\Theta)}{\partial \Theta^{(l)}}=D^{(l)}$$

BP实际运用中的技巧

1. 将参数展开成向量

对于四层三个权重矩阵参数$\Theta^{(1)}, \Theta^{(2)}, \Theta^{(3)}$将其展开成一个参数向量,Matlab code如下:

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

2. 梯度检查

为了保证梯度计算的正确性,可以用数值解进行检查,根据导数的定义

$$\frac{dJ(\theta)}{d\theta} \approx \frac{J(\theta + \epsilon)-J(\theta-\epsilon)}{2\epsilon}$$

Matlab Code 如下

for i = 1 : n
    thetaPlus = theta;
    thetaPlus(i) = thetaPlus(i) + EPS;
    thetaMinus = theta;
    thetaMinus(i) = thetaMinus(i) - EPS;
    gradApprox(i) = (J(thetaPlus) - J(thetaMinus)) / (2 * EPS);
end

最后检查 gradApprox 是否约等于之前计算的梯度值即可。需要注意的是:因为近似的梯度计算代价很大,在梯度检查后记得关闭梯度检查的代码。

3. 随机初始化

初始权重矩阵的初始化应该打破对称性 (symmetry breaking),避免使用全零矩阵进行初始化。可以采用随机数进行初始化,即 $\Theta^{(l)}_{ij} \in [-\epsilon, +\epsilon]$

如何训练一个神经网络

  1. 随机初始化权重矩阵
  2. 利用前向传播算法(FP)计算模型预测值$h_\theta(x)$
  3. 计算代价函数$J(\Theta)$
  4. 利用后向传播算法(BP)计算代价函数的梯度 $\frac{\partial J(\Theta)}{\partial \Theta^{(l)}}$
  5. 利用数值算法进行梯度检查(gradient checking),确保正确后关闭梯度检查
  6. 利用梯度下降(或者其他优化算法)求得最优参数$\Theta$

附:一个简短的后向传播教学视频

参考文献

[1] Andrew Ng Coursera 公开课第五周

[2] Derivation of Backpropagation. http://web.cs.swarthmore.edu/~meeden/cs81/s10/BackPropDeriv.pdf

[3] Wikipedia: Backpropagation. https://en.wikipedia.org/wiki/Backpropagation

[4] How the backpropagation algorithm works. http://neuralnetworksanddeeplearning.com/chap2.html

[5] 神经网络和反向传播算法推导. http://www.mamicode.com/info-detail-671452.html

时间: 2024-10-16 22:39:24

机器学习公开课笔记(5):神经网络(Neural Network)——学习的相关文章

Andrew Ng机器学习公开课笔记 -- Mixtures of Gaussians and the EM algorithm

网易公开课,第12,13课 notes,7a, 7b,8 从这章开始,介绍无监督的算法 对于无监督,当然首先想到k means, 最典型也最简单,有需要直接看7a的讲义   Mixtures of Gaussians 如果要理解Mixtures of Gaussians,那先回去复习一下Gaussians Discriminant Analysis,高斯判别分析 首先高斯判别分析是生成算法, 所以不会直接拟合p(y|x), 而是拟合p(x|y)p(y), 即p(x,y) p(y)符合伯努力分布,

Andrew Ng机器学习公开课笔记–Reinforcement Learning and Control

网易公开课,第16课 notes,12 前面的supervised learning,对于一个指定的x可以明确告诉你,正确的y是什么 但某些sequential decision making问题,比如下棋或直升机自动驾驶 无法确切知道,下一步怎么样是正确的,因为这是一个连续和序列化的决策,比如直到最终直升机crash或下棋输了,你才知道之前的选择是不好的,但中间那么多步决策,到底是哪部分出了问题,可见这是个比较复杂的问题 强化学习,基本思路就是,既然不知道怎样是正确的,那就随便try,然后根据

Andrew Ng机器学习公开课笔记–Independent Components Analysis

网易公开课,第15课 notes,11 参考, PCA本质是旋转找到新的基(basis),即坐标轴,并且新的基的维数大大降低 ICA也是找到新的基,但是目的是完全不一样的,而且ICA是不会降维的 对于ICA,最经典的问题,"鸡尾酒会"问题 在鸡尾酒会,上很多人同时在说话,还有背景音乐,如果我们放若干个话筒进行声音采集 是否可以从采集到的数据中,分离出每个人独立的声音 假设有n个不同的人,m个时间采集点,一般会用和人数一样多的话筒,也是n个 is an n-dimensional vec

Andrew Ng机器学习公开课笔记–Principal Components Analysis (PCA)

网易公开课,第14课 notes,10 之前谈到的factor analysis,用EM算法找到潜在的因子变量,以达到降维的目的 这里介绍的是另外一种降维的方法,Principal Components Analysis (PCA), 比Factor Analysis更为直接,计算也简单些 主成分分析基于, 在现实中,对于高维的数据,其中有很多维都是扰动噪音,或有些维是冗余的,对描述数据特征没有作用 比如我们在描述汽车速度的时候,用不同的单位mph or kph作为两维,其实只需要其中一维即可

机器学习公开课笔记(4):神经网络(Neural Network)——表示

动机(Motivation) 对于非线性分类问题,如果用多元线性回归进行分类,需要构造许多高次项,导致特征特多学习参数过多,从而复杂度太高. 神经网络(Neural Network) 一个简单的神经网络如下图所示,每一个圆圈表示一个神经元,每个神经元接收上一层神经元的输出作为其输入,同时其输出信号到下一层,其中每一层的第一个神经元称为bias unit,它是额外加入的其值为1,通常用+1表示,下图用虚线画出. 符号说明: $a_i^{(j)}$表示第j层网络的第i个神经元,例如下图$a_1^{(

机器学习公开课笔记(6):应用机器学习的建议

应用机器学习的建议 1. 评估学习算法 在实际中应用学习算法时,如何评估一个学习算法的好坏?进一步地,如果学习的算法的效果不太好,如何改进学习算法?例如,对于一个简单的线性拟合模型,改进算法效果的策略包括: 采用更多的训练实例训练模型 采用更小的特征集合 增加额外的特征 尝试高次项拟合($x_1^2$, $x_2^2$, $x_3^3$, $\ldots$) 增加惩罚项系数$\lambda$ 减小惩罚项系数$\lambda$ 机器学习算法诊断(ML diagnostic)负责发现学习算法中存在的

机器学习公开课笔记(7):支持向量机

支持向量机(Support Vector Machine, SVM) 考虑logistic回归,对于$y=1$的数据,我们希望其$h_\theta(x) \approx 1$,相应的$\theta^Tx \gg 0$; 对于$y=0$的数据,我们希望$h_\theta(x) \approx 0$,相应的$\theta^Tx \ll 0$.每个数据点的代价为: $$-\left[y\log(h_\theta(x))+(1-y)\log(1-h\theta(x))\right]$$当$y=1$时其代

机器学习公开课笔记(8):k-means聚类和PCA降维

K-Means算法 非监督式学习对一组无标签的数据试图发现其内在的结构,主要用途包括: 市场划分(Market Segmentation) 社交网络分析(Social Network Analysis) 管理计算机集群(Organize Computer Clusters) 天文学数据分析(Astronomical Data Analysis) K-Means算法属于非监督式学习的一种,算法的输入是:训练数据集$\{x^{(1)},x^{(2)},\ldots, x^{(m)}\}$(其中$x^

Andrew Ng机器学习公开课笔记 -- 学习理论

网易公开课,第9课 notes,http://cs229.stanford.edu/notes/cs229-notes4.pdf 这章要讨论的问题是,如何去评价和选择学习算法 Bias/variance tradeoff 还是用这组图,学习算法追求的是generalization error(对未知数据的预测误差),而不是training error(只是对训练集) 最左边,underfit,我们说这种学习算法有较大的bias Informally, we define the bias of