神经网络

吴恩达教你入门神经网络

2018-11-12  本文已影响15人  今宵说

人工智能目前很火。
人工智能主要是机器学习。
机器学习主要是深度学习。
深度学习必然要接触人工神经网络。

人工神经网络是什么鬼?请看下图。


what the fxxk!
看3秒看不懂,本次学习结束。之后再碰到,就会说神经网络不是正常人类能学会的。

wait!
饭要一口一口的吃
神经网络要一点一点的学。先了解神经网络算法的基本思路,再用最简单的模型走一遍过程。才有可能学会。

机器学习通用思路:

1、算法原理
2、把问题转化为数学模型
3、构建模型
4、训练参数
(图片来源:吴恩达机器学习课程,素材来源,第61课-81课)

1、神经网络原理

从计算机图片识别说起。计算机看到一个图片实际上看到的是一堆像素点,每个像素点是一个数据矩阵或表示像素强度值的网络。

所以一个汽车的图片在计算机眼里就是一堆数据。通过每个像素的特征判断这个图片是否是汽车。一个50*50像素大小的图片,就有2500个变量,乘上参数就有300万个特征,线性算法效率不高。

怎么解决图片识别问题?
前人想到模拟大脑的运作方式。

大脑是什么运作方式?
一个学习算法假设:假如把大脑用来负责看的区域去掉,通过训练,大脑会把听觉区域用来“看”。
同样道理,也可以通过手的感觉来“看”。这个区域可以同时处理视觉、听觉、触觉。
这个实验叫神经重连实验。



盲人用舌头看的例子,用声音定位的例子。


大脑是通过神经元来运作,神经元的运作方式?

神经元构成:一是神经元的细胞体,二是神经元之间有很多通道。
运作原理:信息输入一个神经元,进行一定的处理,再通过轴突输出给下一个神经元。神经元之间通过微电流沟通。


扩展,ted关于神经科学的演讲
https://open.163.com/movie/2013/3/J/6/M92INA100_M92IOJ1J6.html:视频中间部分有三位的神经元演示
http://open.163.com/special/neurosciences/

2、数学模型

了解了大脑的学习模式,神经网络算法就是参照人脑的神经元构造的人工神经网络。
先构建一个神经元。输出h函数,h函数在神经网络里叫激活函数(activation function),指代非线性函数。
增加一个x0叫偏置单元。
参数theta在神经网络里也叫权重(weight)



一组神经单元组成一个神经网络。
最简单的三层神经网络。第一层输入层,第二层隐藏层,第三层输出层。



再看数学上每个神经元怎么计算
先定义a,上标是在第几层,下标是这一层的第几个神经元。
第二层第一个a的计算:上一层的4个输入变量。


向前传播:通过2层神经元的传递算出h。
一般倒数第二层是逻辑回顾模型。

其他神经网络结构,可以不是每层神经元数相同。


3、模型构建

在给出神经网络数学定义后,用神经网络模拟最简单的xor/xnor逻辑判断。
xnor:异非,两个变量相同是0,不同是1


先构造出and ,or ,not x
构造的基本思路参数越大,值越趋近于0,想取值为0,就放一个很大的负权重。
再把这三个简单的函数组合在一起,构造一个神经网络,算出xnor.

将三个简单的函数组合成一个神经网络。红色的是and,蓝色的是not x,
绿色的是or,最终的效果就是输出xnor。

如果想得到更多的分类,就增加神经网络输出结果,最后一层是4个逻辑回归分类器。

小结:通过以上例子,给出神经网络的直观理解,神经网络里面都是一个个简单的函数,通过一层计算输出一系列特征,再通过下一层计算出更复杂的特征,逻辑分类器是最后一层,得出分类。

4、实际训练步骤

这里和视频课程有点不一样。我们先说结论:如何训练一个神经网络?吴恩达总结了7个步骤。
之后再结合每个步骤展开说明具体算法。
0、选择一个神经网络结构
1、随机参数初始化
2、运用向前传播算法计算每个x的对应的输出值y。
3、运用代码计算出代价函数J(theta)
4、运用反向传播算法计算代价函数J(theta)关于theta的偏导数。
5、运用梯度检验把反向传播算法得到的偏导数与数据估计值进行比较。并注意在程序中停用梯度检验算法(因为会降低程序效率)。
6、运用优化算法(比如梯度下降)和反向传播算法结合,求出使代价函数J(theta)值最小的参数theta。

0、选择神经网络结构

选择神经网络结构主要考虑3方面:
输入单元的数量:几维向量
输出单元的数量:注意输出值用向量表示
隐藏层的结构:默认一层隐藏层。隐藏层的单元数量是第一层的2到3倍。



1、随机参数初始化

第一次训练时用什么参数?
所有参数都初始化为0的话,各单元值都相等,无法区分。


使用随机初始化的思想,把参数定义为接近0的随机数。


2、向前传播算法

从输入项,一层一层算出输出项。


3、代价函数

借鉴逻辑回顾算法的代价函数



4、反向传播算法

让代价函数最小化的方法:反向传播算法
我们的目标是计算如下代价函数的最小值。
为了求代价函数,我们需要计算J(theta)和J(theta)的偏导数。有了J(theta)和J(theta)的偏导数,我们就可以用梯度下降算法求出代价函数的最小值。
J(theta)直接带入公式。
所以J(theta)的偏导数怎么求是关键。这里就用到了反向传播算法

反向传播算法的直观认识:求出每一层每一个的节点的误差delta,从最后一层求误差,从最后一层向前一层求误差,误差反方向传播。最后可以通过数学公式,用误差项求出J(theta)的偏导数。


通过反向传播求出J(theta)的偏导数


反向传播算法具体步骤
最后一步给出了J(theta)的偏导数的公式,视频中没有给出数学证明。

反向传播算法的固定步骤:吴恩达用了一节视频,用最简单的4层2节点(不算偏置项)再次演示了反向算法怎么运算。

使用高级算法小技巧:把参数从矩阵展开为向量(相当于三体里的降维打击),一些高级算法(比如fminunc的initialtheta)的输入值为向量,而神经网络的参数为矩阵。要把参数带入高级算法的话要把参数的矩阵展开为向量,在使用高级算法后再把向量返回为矩阵。

具体的语法:展开是theat(:),返回矩阵是reshape


5、梯度检验

反向传播算法经常会产生一些微妙的bug,所以需要梯度检验,检验反向传播算法是否正确。
数值估计方法:
求一点的斜率可以用临近2点的值逼近求出。


octave的代码实现,验证gradapprox是否和反向算法算出的dvec近似相等。


使用梯度检验的注意事项:注意在检验之后关闭梯度检验。因为梯度检验计算很慢,影响算法效率。


上一篇下一篇

猜你喜欢

热点阅读