博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1. DNN神经网络的前向传播(FeedForward)
阅读量:5084 次
发布时间:2019-06-13

本文共 2133 字,大约阅读时间需要 7 分钟。

1. 前言

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

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

2. 感知机原理

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

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

image

输出是线性的

\[ z=\sum\limits_{i=1}^mw_ix_i + b \]

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

\[ sign(z)= \begin{cases} -1& {z<0}\\ 1& {z\geq 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\)呢,当然还是运用神奇的梯度下降法来更新。在神经网络中运用梯度下降法的过程就是反向更新

转载于:https://www.cnblogs.com/huangyc/p/9999855.html

你可能感兴趣的文章
BZOJ4923 K小值查询(splay)
查看>>
被sleep开了个小玩笑
查看>>
centos安装memcache与telnet
查看>>
安卓ROOT后禁用/隐藏导航栏/虚拟按键
查看>>
day13 字典生成式
查看>>
将二维数组转为一维数组的2种方法
查看>>
使用1.7 Files,实现编码探测
查看>>
(二)快速搭建 ASP.net core Web 应用
查看>>
TopCoder-SRM635-DIV1-250pt-SimilarRatingGraph-枚举+边界处理
查看>>
轻松搞懂Python的属性和方法
查看>>
JVM内存状况查看方法和分析工具
查看>>
关于判断物体是否在视野范围内
查看>>
Android应用开发中模拟按HOME键效果
查看>>
Python:ModuleNotFoundError: No module named 'windows'
查看>>
Linq查询
查看>>
json_encode charset
查看>>
jquery api
查看>>
C#compiler
查看>>
machine%20learning
查看>>
JSON 简单例子
查看>>