第四讲——Neural Networks 神经网络的表示
===============================
(一)、为什么引入神经网络?——Nonlinear hypothesis
(二)、神经元与大脑(Neurons and Brain)
(三)、神经网络的表示形式
(四)、怎样用神经网络实现逻辑表达式?
(五)、分类问题(Classification)
本章主要围绕神经网络的建模及其线性表示(即neural networks的representation)做以初步了解,在下一章中将会有更详细的神经网络如何学习方面的知识。
===============================
(一)、为什么引入神经网络?——Nonlinear hypothesis
之前我们讨论的ML问题中,主要针对Regression做了分析,其中采用梯度下降法进行参数更新。然而其可行性基于假设参数不多,如果参数多起来了怎么办呢?比如下图中这个例子:从100*100个pixels中选出所有XiXj作为logistic regression的一个参数,那么总共就有5*10^7个feature,即x有这么多维。
所以引入了Nonlinear hypothesis,应对高维数据和非线性的hypothesis(如下图所示):
===============================
(二)、神经元与大脑(neurons and brain)
神经元工作模式:
神经网络的逻辑单元:输入向量x(input layer),中间层a(2,i)(hidden layer), 输出层h(x)(output layer)。
其中,中间层的a(2,i)中的2表示第二个级别(第一个级别是输入层),i表示中间层的第几个元素。或者可以说,a(j,i) is the activation of unit i in layer j.
===============================
(三)、神经网络的表示形式
从图中可知,中间层a(2,j)是输入层线性组合的sigmod值,输出又是中间层线性组合的sigmod值。
下面我们进行神经网络参数计算的向量化:
令z(2)表示中间层,x表示输入层,则有
,
z(2)=Θ(1)x
a(2)=g(z(2))
或者可以将x表示成a(1),那么对于输入层a(1)有[x0~x3]4个元素,中间层a(2)有[a(2)0~a(2)3]4个元素(其中令a(2)0=1),则有
h(x)= a(3)=g(z(3))
z(3)=Θ(2)a(2)
通过以上这种神经元的传递方式(input->activation->output)来计算h(x), 叫做Forward propagation, 向前传递。
这里我们可以发现,其实神经网络就像是logistic regression,只不过我们把logistic regression中的输入向量[x1~x3]变成了中间层的[a(2)1~a(2)3], 即
h(x)=g(Θ(2)0 a(2)0+Θ(2)1 a(2)1+Θ(2)2 a(2)2+Θ(2)3 a(2)3)
而中间层又由真正的输入向量通过Θ(1)学习而来,这里呢,就解放了输入层,换言之输入层可以是original input data的任何线性组合甚至是多项式组合如set x1*x2 as original x1...另外呢,具体怎样利用中间层进行更新下面会更详细地讲;此外,还有一些其他模型,比如:
===============================
(四)、怎样用神经网络实现逻辑表达式?
神经网路中,单层神经元(无中间层)的计算可用来表示逻辑运算,比如逻辑AND、逻辑或OR
举例说明:逻辑与AND;下图中左半部分是神经网络的设计与output层表达式,右边上部分是sigmod函数,下半部分是真值表。
给定神经网络的权值就可以根据真值表判断该函数的作用。再给出一个逻辑或的例子,如下图所示:
以上两个例子只是单层传递,下面我们再给出一个更复杂的例子,用来实现逻辑表达< x1 XNOR x2 >, 即逻辑同或关系,它由前面几个例子共同实现:
将AND、NOT AND和 OR分别放在下图中输入层和输出层的位置,即可得到x1 XNOR x2,道理显而易见:
a21 = x1 && x2
a22 = (﹁x1)&&(﹁x2)
a31 =a21 ||a21 =(x1 && x2) || (﹁x1)&&(﹁x2) = x1 XNOR x2;
应用:手写识别系统
===============================
(五)、分类问题(Classification)
输入向量x有三个维度,两个中间层,输出层4个神经元分别用来表示4类,也就是每一个数据在输出层都会出现[a b c d]T,且a,b,c,d中仅有一个为1,表示当前类。
===============================
小结
本章引入了ML中神经网络的概念,主要讲述了如何利用神经网络的construction及如何进行逻辑表达function的构造,在下一章中我们将针对神经网络的学习过程进行更详细的讲述。
第五讲——Neural Networks 神经网络的表示
===============================
(一)、Cost function
(二)、Backpropagation algorithm
(三)、Backpropagation intuition
(四)、Implementation note: Unrolling parameters
(五)、Gradient checking
(六)、Random initialization
(七)、Putting it together
===============================
(一)、Cost function
假设神经网络的训练样本有m个,每个包含一组输入x和一组输出信号y,L表示神经网络层数,Sl表示每层的neuron个数(SL表示输出层神经元个数)。
将神经网络的分类定义为两种情况:二类分类和多类分类,
*二类分类:SL=1, y=0 or 1表示哪一类;
*K类分类:SL=K, yi = 1表示分到第i类;(K>2)
我们在前几章中已经知道,Logistic hypothesis的Cost Function如下定义:
其中,前半部分表示hypothesis与真实值之间的距离,后半部分为对参数进行regularization的bias项,神经网络的cost function同理:
hypothesis与真实值之间的距离为 每个样本-每个类输出 的加和,对参数进行regularization的bias项处理所有参数的平方和
===============================
(二)、Backpropagation algorithm
前面我们已经讲了cost function的形式,下面我们需要的就是最小化J(Θ)
想要根据gradient descent的方法进行参数optimization,首先需要得到cost function和一些参数的表示。根据forward propagation,我们首先进行training dataset 在神经网络上的各层输出值:
由上图我们得到了error变量δ的计算,下面我们来看backpropagation算法的伪代码:
ps:最后一步之所以写+=而非直接赋值是把Δ看做了一个矩阵,每次在相应位置上做修改。
从后向前此计算每层依的δ,用Δ表示全局误差,每一层都对应一个Δ(l)。再引入D作为cost function对参数的求导结果。下图左边j是否等于0影响的是是否有最后的bias regularization项。左边是定义,右边可证明(比较繁琐)。
===============================
(三)、Backpropagation intuition
上面讲了backpropagation算法的步骤以及一些公式,在这一小节中我们讲一下最简单的back-propagation模型是怎样learning的。首先根据forward propagation方法从前往后计算z(j),a(j) ;
然后将原cost function 进行简化,去掉下图中后面那项regularization项,
那么对于输入的第i个样本(xi,yi),有
Cost(i)=y(i)log(hθ(x(i)))+(1- y(i))log(1- hθ(x(i)))
由上文可知,
经过求导计算可得,对于上图有
换句话说, 对于每一层来说,δ分量都等于后面一层所有的δ加权和,其中权值就是参数Θ。
===============================
(四)、Implementation note: Unrolling parameters
这一节讲述matlab中如何实现unrolling parameter。
前几章中已经讲过在matlab中利用梯度下降方法进行更新的根本,两个方程:
与linear regression和logistic regression不同,在神经网络中,参数非常多,每一层j有一个参数向量Θj和Derivative向量Dj。那么我们首先将各层向量连起来,组成大vectorΘ和D,传入function,再在计算中进行下图中的reshape,分别取出进行计算。
计算时,方法如下:
===============================
(五)、Gradient checking
神经网络中计算起来数字千变万化难以掌握,那我们怎么知道它里头工作的对不对呢?不怕,我们有法宝,就是gradient checking,通过check梯度判断我们的code有没有问题,ok?怎么做呢,看下边:
对于下面这个【Θ-J(Θ)】图,取Θ点左右各一点(Θ+ε),(Θ-ε),则有点Θ的导数(梯度)近似等于(J(Θ+ε)-J(Θ-ε))/(2ε)。
对于每个参数的求导公式如下图所示:
由于在back-propagation算法中我们一直能得到J(Θ)的导数D(derivative),那么就可以将这个近似值与D进行比较,如果这两个结果相近就说明code正确,否则错误,如下图所示:
Summary: 有以下几点需要注意
-在back propagation中计算出J(θ)对θ的导数D,并组成vector(Dvec)
-用numerical gradient check方法计算大概的梯度gradApprox=(J(Θ+ε)-J(Θ-ε))/(2ε)
-看是否得到相同(or相近)的结果
-(这一点非常重要)停止check,只用back propagation 来进行神经网络学习(否则会非常慢,相当慢)
===============================
(六)、Random Initialization
对于参数θ的initialization问题,我们之前采用全部赋0的方法,比如:
所以我们应该打破这种symmetry,randomly选取每一个parameter,在[-ε,ε]范围内:
===============================
(七)、Putting it together
1. 选择神经网络结构
我们有很多choices of network :
那么怎么选择呢?
No. of input units: Dimension of features
No. output units: Number of classes
Reasonable default: 1 hidden layer, or if >1 hidden layer, have same no. of hidden units in every layer (usually the more the better)
2. 神经网络的训练
① Randomly initialize weights
② Implement forward propagation to get hθ(x(i)) for anyx(i)
③ Implement code to compute cost function J(θ)
④ Implement backprop to compute partial derivatives
⑤
⑥
test:
本章讲述了神经网络学习的过程,重点在于back-propagation算法,gradient-checking方法,希望能够有人用我之前这篇文章中的类似方法予以实现神经网络。
另外提供一篇作为Reference,供大家参考。