• 五、神经网络


    1. 神经元模型

    神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。
    神经网络中最基本的成分是神经元 (neuron)模型,即上述定义中的"简单单元"在生物神经网络中,每个神经元与其他神经元相连,当它"兴奋"时,就会向相连的神经元发送化学物质,从而改变这些神经元 内的电位;如果某神经元的电位超过了 一个"阔值" (threshold) , 那么它就会被激活,即 "兴奋 "起来,向其他神经元发送化学物质。
    1943 年, [McCulloch and Pitts, 1943] 将上述情形抽象为图所示的简单模型,这就是一直沿用至今的 "M-P 神经元模型 " 在这个模型中,神经元接收到来自n个其他神经元传递过来的输入信号${ {x_1},{x_2},...,{x_i},...,{x_n}} $,这些输入信号通过带权重$omega$的连接( connection)进行传递,神经元接收到的总输入值$sum olimits_i {{omega _i}{x_i}}$将与神经元的阀值进行比较,然后通过"激活函数" (activation function)$f()$处理以产生神经元的输出。

     

    理想激活函数$f()$理想中的激活函数是下图左边所示的阶跃函数,它将输入值映射为输出值 "0" 或"1",显然 "1" 对应于神经元兴奋,"0" 对应于神经元抑制。然而,阶跃函数具有不连续 、不光滑等不太好的性质,因此实际常用 Sigmoid函数作为激活。函数典型的 Sigmoid函数如下图右边所示,它把可能在较大范围内变化的输入值挤压到 (0, 1) 输出值范围内,因此有时也称为 "挤压函数" (squashiing function).

     

    事实上,从计算机科学的角度看,我们可以先不考虑神经网络是否真的模拟了生物神经网络,只需将一个神经网络视为包含了许多参数的数学模型,这个模型是若干个函数,例如${y_j} = fleft( {sum olimits_i {{omega _i}{x_i}} - { heta _j}} ight)$相互(嵌套)代入而得。有效的神经网络学习算法大多以数学证明为支撑 。

    2. 感知机与多层网络

    感知机(Perceptron) 由两层神经元组成,如图所示,输入层接收外界输入信号后传递给输出层, 输出层是 M-P 神经元,亦称"阈值逻辑单元" (threshold logic unit)。

    更一般地,给定训练数据集,权重${omega _i}(i = 1,2,...,n)$以及阈值$ heta$。可通过学习得到。阈值可看作一个固定输入为-1. 0的"哑结点" (dummy node) 所对应的连接权重${omega _{n+1}}$,这样,权重和阈值的学习就可统一为权重的学习。

    在学习的过程中,如果感知机对训练样例的预测是对的,那么权重不更新,感知机不发生变化;若果预测错误,则按照一定的学习率更新权重,调整感知机。

    若两类模式是线性可分的,即存在一个线性超平面能将它们分开,则感知机的学习过程一定会收敛 (converge) 而求得适当的权向量${f{omega }} = ({omega _1};{omega _2};...;{omega _{n + 1}})$;否则感知机学习过程将会发生振荡(fluctuation) , ${f{omega }}$难以稳定下来,不能求得合适解。

    决非线性可分问题,需考虑使用多能神经元。输出层与输入居之层神经元,被称为隐居或隐含层 (hidden layer),隐含层输出层神经元都是拥有激活函数的功能神经元。

    更一般的,常见的神经网络是形如下图所示的层级结构,每层经元与下经元全互连,经元之间不存在同层连接, 也不存在跨层连接这样经网络结构通常称为" 层前馈神经网" (multi-layer feedforward neuranetworks) ,其中输入层神经元接收外界输入,隐层与输出层神经元对信弓进行加工,最终结果由输出层神经λ输出;换言之,输入层神经元仅是接受输入,不进行函数处理,隐居与输出层包含功能神经元。因此,通常被称为"两层网络"。为避免歧义,本书称其为"单隐层网络"。只需包含隐层,即可称为多层网络。神经网络的学习过程,就是根据训练数据来调整神经元之间的"连接权" (connection weight) 以及每个功能神经元的阑值;换言之,神经网络"学"到的东西,蕴涵在连接权与阙值中。

    3. 误差逆传播算法

    多层网络的学习能力比单层感知机强得多。欲训练多层网络,需要更强大的学习算法来更新权值,误差逆传播 (error BackPropagation,简称 BP)算法就是其中最杰出的代表。它是迄今最成功的神经网络学习算法。现实任务中使用神经网络时,大多是在使用 BP 算法进行训练。值得指出的是,BP 算法不仅可用于多层前馈神经网络,还可用于其他类型的神经网络。但通常说 "BP 网络"时,一般是指用 BP 算法训练的多层前馈神经网络。

    给定训练集需要拟合的数据集是$D = left{ {({X_1},{y_1}),({X_2},{y_2})...,({X_n},{y_n})} ight},{X_n} in {R^d},{y_n} in {R^l}$,即输入示例由$d$个属性描述,输出$l$实值向量。

    以下图网络为例,其中神经元都使用sigmoid函数,

    对与训练集D中的某一个训练样本$({X_k},{y_k})$,假定神经网络的输出为,$hat{y_k} = (hat{y_k^1},hat{y_k^2},...hat{y_k^l})$.

    则神经网络在$({X_k},{y_k})$的均方误差为,

    [E_k = frac{1}{2}sumlimits_{j = 1}^l {{{(hat{y_k^j} - y_k^j)}^2}} ]

    BP算法基于梯度下降策略,以目标的负梯度方向对每个参数进行逐步调整,任意参数v的更新估计式为,

    [v leftarrow v - alpha Delta v]

    对隐层到输出层的连接权来说,$omega _{h,j}$先影响到第 j 个输出层神经元的输入值$eta _j$,再影响到其输出值$hat{y_k^j}$,最后影响到$E_k$,

    [Delta {omega _{h,j}} =   frac{{partial {E_k}}}{{partial {omega _{h,j}}}} =   frac{{partial {E_k}}}{{partial hat{y_k^j}}}frac{{partial hat{y_k^j}}}{{partial {eta _j}}}frac{{partial {eta _j}}}{{partial {omega _{h,j}}}}]

     其中,

    [egin{array}{l}
    frac{{partial {eta _j}}}{{partial {omega _{h,j}}}} = {b_h}\
    frac{{partial hat{y_k^j}}}{{partial {eta _j}}} = f'({eta _j} - { heta _j})\
    frac{{partial {E_k}}}{{partial hat{y_k^j}}} = hat {y_k^j} - y_k^j
    end{array}]

    sigmoid函数f(x)有一个很好的性质$f'(x) = f(x)(1 - f(x))$,所以,

    [frac{{partial {E_k}}}{{partial hat{y_k^j}}}frac{{partial hat{y_k^j}}}{{partial {eta _j}}}frac{{partial {eta _j}}}{{partial {omega _{h,j}}}} = (hat {y_k^j} - y_k^j)hat {y_k^j}(1 - hat {y_k^j}){b_h}]

    类似可求得其他参数的更新梯度。

    学习率$alpha  in (0,1)$控制着算沾每一轮迭代中的更新步长,太大则容易振荡,太小则收敛速度又会过慢。有时为了做精细调节,可令各参数的学习率不一样。


    输入:训练集$D = left{ {({X_k},{y_k})} ight}_{k = 1}^m,{X_k} in {R^d},{y_k} in {R^l}$

       学习率$alpha$

    过程:初始化网络中的所有连接权和阈值

    repeat

    for all $({X_k},{y_k}) in D$ do

    根据当前网络参数计算当前样本的输出$hat{y_k}$

    根据公式更新各个参数

    end for

    until 达到终止条件

    输出:连接权和阈值确定的多层前馈神经网络


    需注意的是, BP 算法的目标是要最小化训练集 D 上的累积误差

    [E = frac{1}{m}sumlimits_{m = 1}^k {{E_k}} ]

    但我们上面介绍的"标准 BP 算法"每次仅针对一个训练样例更新连接权和阈值, 也就是说,标准BP算法的更新规则是基于单个的$E_k$推导而得。果类似地推导出基于累积误差最小化的更新规则,就得到了累积误差逆传播 (accumulated error backpropagation)算法累积 BP 算法与标准 BP 算法都很常用.一般来说,标准 BP 算法每次更新只针对单个样例,参数更新得非常频繁,而且对不同样例进行更新的效果可能出现"抵消"现象.因此,为了达到同样的累积误差极小点,标准 BP 算法往往需进行更多次数的法代.累积 BP 算法直接针对累积误差最小化,它在读取整个训练集D一遍后才对参数进行更新,其参数更新的频率低得多。但在很多任务中,累积误差下降到一定程度之后,进一步下降会非常缓慢,这时标准 BP 往往会更快获得较好的解,尤其是在训练集 D 非常大时更明显。

    [Hornik et al., 1989] 证明,只需二个包含足够多神经元的隐层,多层前馈网络就能以任意精度逼近任意复杂度的连续函数。然而,如何设置隐层神经元的个数仍是个未决问题,实际应用中通常靠"试错法" (trial-by-error)调整.

    正是由于其强大的表示能力, BP 神经网络经常遭遇过拟合,其训练误差持续降低,但测试误差却可能上升有两种策略常用来缓解BP网络的过拟合。第一种策略是"早停" (early stopping):将数据分成训练集和验证集,训练、集用来计算梯度、更新连接权和阔值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阑值。 第二种策略是"正则化" (regularization) ,其基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权与阈值的平方和。修改误差目标函数为,

    [E = lambda frac{1}{m}sumlimits_{m = 1}^k {{E_k}}  + (1 - lambda )sum olimits_i {omega _i^2} ]

    其中$lambda  in (0,1)$用于对经验误差与网络复杂度这两项进行折中,常通过交叉验证法来估计。 



    参考:

    机器学习 周志华

  • 相关阅读:
    kvm虚拟化介绍(1)
    linux进阶之yum管理
    python基础之面向对象(三))(实战:烤地瓜(SweetPotato))
    python基础之python牛逼的设计模式
    zabbix监控之邮件报警通知
    zabbix监控之概念和安装
    nosql数据库之Redis集群
    nosql数据库之Redis持久化、备份和主从配置
    nosql数据库之Redis概念及基本操作
    python基础之面向对象(二)(封装、继承、多态)
  • 原文地址:https://www.cnblogs.com/yijuncheng/p/10059262.html
Copyright © 2020-2023  润新知