机器学习之神经网络算法
来源:互联网 发布:邪恶漫画软件大全 编辑:程序博客网 时间:2024/06/05 17:18
机器学习之神经网络算法
在机器学习和认知科学领域,人工神经网络(英文:artificial neural network,缩写ANN),简称神经网络(英文:neural network,缩写NN)或类神经网络,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。[来源请求]现代神经网络是一种非线性统计性数据建模工具。
神经网络(Neural Network)概述
神经网络算法能够提供一种复杂且非线性的假设模型
为了描述神经网络,我们先从最简单的神经网络讲起,这个神经网络仅由一个“神经元”构成,以下即是这个“神经元”的图示:
这个“神经元”是一个以
可以看出,这个单一“神经元”的输入-输出映射关系其实就是一个逻辑回归(logistic regression)。
虽然本系列教程采用sigmoid函数,但你也可以选择双曲正切函数(tanh):
以下分别是sigmoid及tanh的函数图像
注意,与其它地方不同的是,这里我们不再令
最后要说明的是,有一个等式我们以后会经常用到:如果选择
神经网络模型
所谓神经网络就是将许多个单一“神经元”联结在一起,这样,一个“神经元”的输出就可以是另一个“神经元”的输入。例如,下图就是一个简单的神经网络:
我们使用圆圈来表示神经网络的输入,标上“
我们用
我们用
我们用
这样我们就可以得到一种更简洁的表示法。这里我们将激活函数
我们将上面的计算步骤叫作前向传播。回想一下,之前我们用
将参数矩阵化,使用矩阵-向量运算方式,我们就可以利用线性代数的优势对神经网络进行快速求解。
目前为止,我们讨论了一种神经网络,我们也可以构建另一种结构的神经网络(这里结构指的是神经元之间的联接模式),也就是包含多个隐藏层的神经网络。最常见的一个例子是
神经网络也可以有多个输出单元。比如,下面的神经网络有两层隐藏层:
要求解这样的神经网络,需要样本集
Backpropagation算法
假设我们有一个固定样本集
这是一个(二分之一的)方差代价函数。给定一个包含
以上关于
我们的目标是针对参数
梯度下降法中每一次迭代都按照如下公式对参数
其中
我们首先来讲一下如何使用反向传播算法来计算
反向传播算法的思路如下:给定一个样例
进行前馈传导计算,利用前向传导公式,得到
对于第
[译者注:
对
{译者注:
将上式中的
以上逐次从后向前求导的过程即为“反向传导”的本意所在。
计算我们需要的偏导数,计算方法如下:
最后,我们用矩阵-向量表示法重写以上算法。我们使用“
那么,反向传播算法可表示为以下几个步骤:
进行前馈传导计算,利用前向传导公式,得到
对输出层(第
对于
计算最终需要的偏导数值:
实现中应注意:在以上的第2步和第3步中,我们需要为每一个
最后,我们将对梯度下降算法做个全面总结。在下面的伪代码中,
对于所有
l ,令ΔW(l):=0,Δb(l):=0 (设置为全零矩阵或全零向量)对于
i=1 到m ,a. 使用反向传播算法计算
∇W(l)J(W,b;x,y) 和∇b(l)J(W,b;x,y) 。b. 计算
ΔW(l):=ΔW(l)+∇W(l)J(W,b;x,y) 。c. 计算
Δb(l):=Δb(l)+∇b(l)J(W,b;x,y) 。更新权重参数:
W(l)b(l)=W(l)−α[(1mΔW(l))]=b(l)−α[1mΔb(l)]
现在,我们可以重复梯度下降法的迭代步骤来减小代价函数J(W,b) 的值,进而求解我们的神经网络。
神经网络优化
柔性最大值(softmax)
另外一种解决学习缓慢问题的方法。
柔性最大值的想法其实就是为神经网络定义一种新式的输出层。
基本原理
(1). 首先计算带权输入
ZLj=∑kwLjkaL−1k+bLj (2). 不在带权输入z上使用S型函数来获得输出,而是使用softmax函数来获得输出。
aLj=ezLj∑kezLk⋯⋯(1) 其中,分母中的求和是在所有的输出神经元上进行的。另外一个特性:根据定义,输出的激活值加起来正好为1。
∑jaLj=∑jezLj∑kezLk⋯⋯(2) 由公式(1)(2),我们看到柔性最大值层的输出是一些相加为1正数的集合。换言之,柔性最大值层的输出可以被看做是一个概率分布。在很多问题中,使用softmax是很方便的。比如在MNIST分类问题中,我们可以将输出层第j个神经元的激活值解释成网络估计正确数字分类为j的概率。
softmax如何解决学习缓慢的问题?
先定义一个对数似然(log-likelihood)代价函数。对数似然函数满足我们期待的代价函数的条件。对数似然代价函数关于权重和偏置的偏导数分别是:这些方程其实和之前的交叉熵得到的类似。只是之前的是平均值。正如前面的分析,这些表达式确保我们不会遇到学习缓慢的问题。事实上,把一个具有对数似然代价的柔性最大值输出层,看作与一个具有交叉熵代价的S型输出层非常相似,这是很有用的。应该使用一个具有交叉熵代价的S 型输出层,还是一个具有对数似然代价的柔性最大值输出层呢?
实际上,在很多应用场景中,这两种方式的效果都不错。
柔性最大值加上对数似然的组合更加适用于那些需要将输出激活值解释为概率的场景。
交叉熵代价函数(The cross-entropy cost function
在采用softmax为神经网络定义了输出层后,其对应的代价函数为交叉熵代价函数也称为对数似然代价函数(The log-likelihood cost function)。令
对于一个包含
将交叉熵看作代价函数,是基于它的以下两个特性:
(1). 它是非负的。
(2). 如果对于所有的训练输入
相比于二次代价函数,交叉熵还有一个特性可以避免学习速度下降的问题。
为什么交叉熵代价函数代价函数可以解决学习慢的问题?
因为交叉熵函数关于权重和偏置的偏导数的表达式中不存在
σ'(z) 这样的项,从而避免了学习缓慢。具体分析如下:
二次函数关于权重和偏置的偏导数分别是:∂J(W,b)∂w∂J(W,b)∂b=(a−y)σ′(z)x=(a−y)σ′(z)
而σ 函数(sigmoid函数)的图像在神经元的输出接近1 的时候,曲线变得相当平,所以σ'(z) 就很小了。上述公式也告诉我们∂J(W,b)/∂w 和∂J(W,b)/∂b 值会非常小。这其实就是学习缓慢的原因所在。交叉熵函数关于权重和偏置的偏导数分别是:
∂J(W,b)∂wj∂J(W,b)∂b=1m∑i=1mxj(σ(z)−y)=1m∑i=1m(σ(z)−y)
上述公式表明权重学习的速度受到σ(z)−y ,也就是输出中的误差的控制。同时交叉熵函数还避免了像在二次代价函数中类似σ′(z) 导致的学习缓慢。学习率的选择
不同的代价函数应该搭配不同的学习率。
在什么时候用交叉熵来替换二次代价函数?
如果在输出神经元是S 型神经元时,交叉熵一般都是更好的选择。
如果输出神经元是线性的那么二次代价函数不再会导致学习速度下降的问题。在此情形下,二次代价函数就是一种合适的选择。
过度拟合(Overfitting)
检测过度拟合
我们在每个迭代期的最后都计算在validation_data 上的分类准确率。一旦分类准确率已经饱和,就停止训练。这个策略被称为提前停止。
降低过度拟合
(1). 一般来说,最好的降低过度拟合的方式之一就是增加训练样本的量。有了足够的训练数据,就算是一个规模非常大的网络也不大容易过度拟合。不幸的是,训练数据其实是很难或者很昂贵的资源,所以这不是一种太切实际的选择。
(2). 降低网络规模。但是更深层更大的网络潜在有更强的学习能力。
(3). 规范化。即使对于固定的神经网络和固定的训练集, 仍然可以减少overfitting。
正则化/规范化(regularization)
基本原理
规范化有很多技术,这里给出一种最为常用的规范化手段—— 有时候被称为权重衰减(weight decay)或者L2 规范化。
L2 规范化的想法是增加一个额外的项到代价函数上,这个项叫做规范化项。J(W,b)=[1m∑i=1m(12∥∥hW,b(x(i))−y(i)∥∥2)]+λ2∑l=1nl−1∑i=1sl∑j=1sl+1(W(l)ji)2 以上关于
J(W,b) 定义中的第一项是一个均方差项。第二项是一个规则化项(也叫权重衰减项),其目的是减小权重的幅度,防止过度拟合。[注:通常权重衰减的计算并不使用偏置项
b(l)i ,比如我们在J(W,b) 的定义中就没有使用。一般来说,将偏置项包含在权重衰减项中只会对最终的神经网络产生很小的影响。如果你在斯坦福选修过CS229(机器学习)课程,或者在YouTube上看过课程视频,你会发现这个权重衰减实际上是课上提到的贝叶斯规则化方法的变种。在贝叶斯规则化方法中,我们将高斯先验概率引入到参数中计算MAP(极大后验)估计(而不是极大似然估计)。]权重衰减参数
λ 用于控制公式中两项的相对重要性。在此重申一下这两个复杂函数的含义:J(W,b;x,y) 是针对单个样例计算得到的方差代价函数;J(W,b) 是整体样本代价函数,它包含权重衰减项。含有权重衰减项的出整体代价函数
J(W,b) 的偏导数:∂∂W(l)ijJ(W,b)∂∂b(l)iJ(W,b)=⎡⎣1m∑i=1m∂∂W(l)ijJ(W,b;x(i),y(i))⎤⎦+λW(l)ij=1m∑i=1m∂∂b(l)iJ(W,b;x(i),y(i))
以上两行公式稍有不同,第一行比第二行多出一项,是因为权重衰减是作用于W 而不是b 。含有权重衰减项的权重参数更新:
W(l)b(l)=W(l)−α[(1mΔW(l))+λW(l)]=b(l)−α[1mΔb(l)]
规范化的效果是让网络倾向于学习小一点的权重。
规范化可以当做一种寻找小的权重和最小化原始的代价函数之间的折中。由λ 的取值决定,λ 越小,就偏向于最小化原始代价函数,反之,倾向于小的权重。好处
(1)减轻过度拟合和提高分类准确率。
(2)规范化的网络能够提供更容易复制的结果。无规范化的网络会偶然被限制住,不同的运行会给出相差很大的结果。
为何规范化可以帮助减轻过度拟合?
规范化的神经网络常常能够比非规范化的泛化能力更强,这只是一种实验事实(empirical fact)。目前还没有一整套具有说服力的理论解释。仅仅是一些不完备的启发式规则或者经验。
正则化的其他技术
(1)L1 规范化:是在未规范化的代价函数上加上一个权重绝对值的和。
(2)弃权(Dropout):从随机(临时)地删除网络中的一半的隐藏神经元开始,同时让输入层和输出层的神经元保持不变。
(3)人为增加训练样本
权重初始化(Weight initialization)
理解这部分需要先弄明白正态分布(高斯分布)、均值、标准差、方差的意义。
结论:假设我们有一个有
原因:若这样初始化的话,那么大部分带权输入
参考资料
UFLDL教程-神经网络
UFLDL教程-反向传导算法
Improving the way neural networks learn
神经网络与深度学习(4):改进神经网络的学习方法
- 机器学习之神经网络算法
- 机器学习之神经网络算法
- 机器学习之六-神经网络算法
- 机器学习之神经网络bp算法推导
- 机器学习之深度神经网络算法全套
- 机器学习算法之卷积神经网络CNN
- 机器学习之神经网络
- 机器学习之神经网络
- 机器学习之神经网络
- 机器学习之神经网络
- 机器学习之神经网络
- 机器学习之神经网络
- 机器学习之神经网络
- 机器学习之神经网络
- 机器学习经典算法-人工神经网络之反向传播算法
- 机器学习--神经网络算法系列--卷积神经网络
- 机器学习之从logistic到神经网络算法
- 机器学习算法原理之人工神经元和单层神经网络
- numpy关于文件中数据为混合类型的时候的读取
- hdu 4436 str2int (SAM)(待补)
- 使用一句 sql 实现将一张表中的某一列的值复制到另一列中。
- scala中:: , +:, :+, :::, +++的区别
- 安卓中使用Fresco
- 机器学习之神经网络算法
- myeclipse查找文件,覆盖之前打开的文件的解决方法
- 织梦DedeCMS首页调用单页文档内容的方法
- react的一些使用感悟
- 数组A,有一千万个数,数组B同样也有千万多个数,然后从A和B当中随意找一个数字A1和B1,A1-B的绝对值是C,保证C最小。求A1和B1
- 读《美国纽约摄影学院摄影教材》上册
- 【转】MIME类型
- 涨跌停尔虞我诈
- WebSocket心跳机制和代码