Stanford机器学习---第五讲. 神经网络的学习 Neural Networks learning
原文 http://blog.csdn.net/abcjennifer/article/details/7758797
本栏目(Machine learning)包括单参数的线性回归、多参数的线性回归、Octave Tutorial、Logistic Regression、Regularization、神经网络、机器学习系统设计、SVM(Support Vector Machines 支持向量机)、聚类、降维、异常检测、大规模机器学习等章节。所有内容均来自Standford公开课machine learning中Andrew老师的讲解。(https://class.coursera.org/ml/class/index)
第五讲——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 在神经网络上的各层输出值:
我们定义神经网络的总误差为:
希望通过调整权重参数W(也就是theta)来最小化E。由于
所以每一层按如下方式进行更新:
根据backpropagation算法进行梯度的计算,这里引入了error变量δ,该残差表明了该节点对最终输出值的残差产生了多少影响。对于最后一层,我们可以直接算出网络产生的输出与实际值之间的差距,我们将这个差距定义为
。对于隐藏单元我们如何处理呢?我们将通过计算各层节点残差的加权平均值计算hidden layer的残差。读者可以自己验证下,其实
就是E对b求导的结果。
在最后一层中,
对于前面的每一层,都有
由此得到第l层第i个节点的残差计算方法:
由于我们的真实目的是计算,且
所以我们可以得到神经网络中权重的update方程:不断迭代直到落入local optima,就是backpropagation的算法过程。
============================================================Example of logistical cost:
下面我们针对logistical cost给出计算的例子:而对于每一层,其误差可以定义为:
由此得来\theta_{k}的update方程:
如果将误差对激励函数(activation function)的导数记做δ,则有:
对于前面一层 ,更新同理,,只是上一层\Theta梯度的第一个分量E对a_k求导有所变化,
但是始终是不变的。
下图就是上面推导得出的结果:
由上图我们得到了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的方法,比如:
this means all of your hidden units are computing all of the exact same function of the input. So this is a highly redundant representation. 因为一层内的所有计算都可以归结为1个,而这使得一些interesting的东西被ignore了。
所以我们应该打破这种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,供大家参考。
Stanford机器学习---第五讲. 神经网络的学习 Neural Networks learning的更多相关文章
- Ng第九课:神经网络的学习(Neural Networks: Learning)
9.1 代价函数 9.2 反向传播算法 9.3 反向传播算法的直观理解 9.4 实现注意:展开参数 9.5 梯度检验 9.6 随机初始化 9.7 综合起来 9.8 自主驾驶 9.1 ...
- 神经网络的学习 Neural Networks learing
1.一些基本符号 2.COST函数 ================Backpropagation Algorithm============= 1.要计算的东西 2.向前传递向量图,但为了计算上图的 ...
- 循环神经网络(RNN, Recurrent Neural Networks)介绍(转载)
循环神经网络(RNN, Recurrent Neural Networks)介绍 这篇文章很多内容是参考:http://www.wildml.com/2015/09/recurrent-neur ...
- 第十四章——循环神经网络(Recurrent Neural Networks)(第二部分)
本章共两部分,这是第二部分: 第十四章--循环神经网络(Recurrent Neural Networks)(第一部分) 第十四章--循环神经网络(Recurrent Neural Networks) ...
- (原创)Stanford Machine Learning (by Andrew NG) --- (week 5) Neural Networks Learning
本栏目内容来自Andrew NG老师的公开课:https://class.coursera.org/ml/class/index 一般而言, 人工神经网络与经典计算方法相比并非优越, 只有当常规方法解 ...
- 循环神经网络(RNN, Recurrent Neural Networks)介绍
原文地址: http://blog.csdn.net/heyongluoyao8/article/details/48636251# 循环神经网络(RNN, Recurrent Neural Netw ...
- 第十四章——循环神经网络(Recurrent Neural Networks)(第一部分)
由于本章过长,分为两个部分,这是第一部分. 这几年提到RNN,一般指Recurrent Neural Networks,至于翻译成循环神经网络还是递归神经网络都可以.wiki上面把Recurrent ...
- Machine Learning - 第5周(Neural Networks: Learning)
The Neural Network is one of the most powerful learning algorithms (when a linear classifier doesn't ...
- Stanford机器学习笔记-4. 神经网络Neural Networks (part one)
4. Neural Networks (part one) Content: 4. Neural Networks (part one) 4.1 Non-linear Classification. ...
随机推荐
- jdbc基础 (五) 连接池与数据源 DBCP以及C3P0的使用
一.连接池的概念和使用 在实际应用开发中,特别是在WEB应用系统中,如果JSP.Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接.打开数据库.存取数 ...
- AngularJS开发指南13:AngularJS的过滤器详解
AngularJS过滤器是用来格式化输出数据的.除了格式化数据,过滤器还能修改DOM.这使得过滤器通常用来做些如“适时的给输出加入CSS样式”等工作. 比如,你可能有些数据在输出之前需要根据进行本地化 ...
- android学习——error opening trace file: No such file or directory (2)
1.疑惑: 程序运行起来的时候日志总是显示下面这个错误,但是不影响程序的正常进行,我是用真机来测试的,android4.4.4(API17). 02-11 14:55:03.629 15525-155 ...
- xcode7 __weak 导致报错 is unavailable
Build Settings Apple LLVM7.1 Laguage-Object-c Weak References in Manual Retain Release 选 Yes;
- XCode7继续用http协议解决办法
昨天被苹果放鸽子也没升级iOS9,今天升级了Xcode7,同时手机升级了iOS9,发现项目报错,查了查才知道是iOS9不支持不安全的http传输协议,让用https协议,这根本就不x现实,,服务端根本 ...
- BZOJ1202 狡猾的商人
HNOI2005 Day1 T4 Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1, ...
- make xconfig时,出现“Unable to find any QT installation"错误
在make menuconfig的时候,提示是找不到libncurses,最后其实是找不到libncurses-dev,又因为debian系统装的是libncurses5,所以装了libncurses ...
- Erlang练习-UDP
贴一下代码,例子是从别人那里直接抄来的: -module(myudp). -export([start/0, client/1]). %% Server start() -> spawn(fun ...
- Exceptionless 本地部署
免费开源分布式系统日志收集框架 Exceptionless 前两天看到了这篇文章,亲身体会了下,确实不错,按照官方的文档试了试本地部署,折腾一番后终于成功,记下心得在此,不敢独享. 本地部署官方wik ...
- Longest Common Subsequence (LCS)
最长公共子序列(LCS)是经典的DP问题,求序列a[1...n], b[1..m]的LCS. 状态是DP[i][j],表示a[1..i],b[1..j]的LCS. DP转移方程是 DP[i][j]= ...