zoukankan      html  css  js  c++  java
  • 1. DNN神经网络的前向传播(FeedForward)

    1. DNN神经网络的前向传播(FeedForward)

    2. DNN神经网络的反向更新(BP)

    3. DNN神经网络的正则化

    1. 前言

    神经网络技术起源于上世纪五、六十年代,当时叫感知机(perceptron),拥有输入层、输出层和一个隐含层。输入的特征向量通过隐含层变换达到输出层,在输出层得到分类结果。但是,Rosenblatt的单层感知机有一个严重得不能再严重的问题,即它对稍复杂一些的函数都无能为力。

    随着数学的发展,这个缺点直到上世纪八十年代才被Rumelhart、Williams、Hinton、LeCun等人(反正就是一票大牛)发明的多层感知机(multilayer perceptron)克服。多层感知机,顾名思义,就是有多个隐含层的感知机。

    2. 感知机原理

    我之前博文的感知机原理已经详细的介绍了感知机,现在我们进行一个简单的回顾。

    先看下人工神经元的结构:

    image

    输出是线性的

    [z=sumlimits_{i=1}^mw_ix_i + b ]

    因为感知机是二分类算法,所以会套一个函数:

    [sign(z)= egin{cases} -1& {z<0}\ 1& {zgeq 0} end{cases} ]

    在神经网络中,套在线性变换外面的这个函数称作激活函数,激活函数可以是线性的(f(x) = x),或者是非线性的,例如(sigmoid,tanh,relu)等常用的。

    3. 神经网络原理

    神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。现代神经网络是一种非线性统计性数据建模工具。典型的神经网络具有以下三个部分:

    1. 结构 (Architecture)
      结构指定了网络中的变量和它们的拓扑关系。例如,神经网络中的变量可以是神经元连接的权重(weights)和神经元的激励值(activities of the neurons)。
    2. 激励函数(Activity Rule) 大部分神经网络模型具有一个短时间尺度的动力学规则,来定义神经元如何根据其他神经元的活动来改变自己的激励值。一般激励函数依赖于网络中的权重(即该网络的参数)。
    3. 学习规则(Learning Rule)学习规则指定了网络中的权重如何随着时间推进而调整。这一般被看做是一种长时间尺度的动力学规则。一般情况下,学习规则依赖于神经元的激励值。它也可能依赖于监督者提供的目标值和当前权重的值。

    神经网络则在感知机的模型上做了扩展,总结下主要有三点:

    • 加入了隐藏层,隐藏层可以有多层,增强模型的表达能力,如下图实例,当然增加了这么多隐藏层模型的复杂度也增加了好多。

    image

    • 输出层的神经元也可以不止一个输出,可以有多个输出,这样模型可以灵活的应用于分类回归,以及其他的机器学习领域比如降维和聚类等。多个神经元输出的输出层对应的一个实例如下图,输出层现在有4个神经元了。

    image

    • 激活函数做扩展,感知机的激活函数是(sign(z)),虽然简单但是处理能力有限,因此神经网络中一般使用的其他的激活函数,比如我们在逻辑回归里面使用过的(Sigmoid)函数,即:

    image

    4. DNN的网络结构

    DNN我们可以理解为多隐层的神经网络,此外,它有时也叫多层感知机(Multi-Layer perceptron,MLP),它内部的神经网络层分为三类,输入层,隐藏层和输出层。

    image

    层与层之间是全连接的,也就是说,第(i)层的任意一个神经元一定与第(i+1)层的任意一个神经元相连。虽然DNN看起来很复杂,但是从小的局部模型来说,还是和感知机一样,即一个线性关系(z=sum{w_ix_i}+b)加上一个激活函数(a=sigma(z))

    5. DNN前向传播过程

    DNN的前向传播算法不算太难。所谓的DNN的前向传播算法也就是利用我们的若干个权重系数矩阵(W),偏倚向量(b)来和输入值向量(x)进行一系列线性运算和激活运算,从输入层开始,一层层的向后计算,一直到运算到输出层,得到输出结果为值。

    输入: 总层数(L),当前层是(l),当前层隐藏层和输出层对应的矩阵(W^l),偏倚向量(b^l),输入值向量(a^{l-1}),神经元个数(dim^l)

    输出:输出层的输出(a^L)

    1. 初始化(a^0=input)
    2. (for;;l=1;;to;;L-1), 计算:

    [a^l=sigma(z^l)=sigma(W^la^{l-1}+b^l) ]

    其中每个变量的维度是(W^l=[dim^l,dim^{l-1}])(a^{l-1}=[dim^{l-1}, batch\_size])(b^l=[dim^l,1])(z^l=[dim^l,batch\_size])(a^l=[dim^l,batch\_size])

    1. 最后的结果即为输出(a^L)

    6. 总结

    我们现在了解了DNN的前向传播的过程,但是我们会有疑问,DNN中如何更新这么多的(W,b)呢,当然还是运用神奇的梯度下降法来更新。在神经网络中运用梯度下降法的过程就是反向更新

  • 相关阅读:
    Android见招拆招五:XML匹配问题、XML资源引用的必要性
    Android见招拆招四:Manifest.xml内容神秘还原
    Android学习笔记三:Intent实现页面跳转
    Android学习笔记二:(布局)Linear Layout、Layout weight测试
    Android见招拆招三:Eclipse软件误报
    Android学习笔记一:(布局)fill_parent、wrap_content、match_parent实例测试
    文件读写(笔记)
    常用的异常
    面向过程、函数式、面向对象
    time&datetime&random模块
  • 原文地址:https://www.cnblogs.com/huangyc/p/9999855.html
Copyright © 2011-2022 走看看