常见的五种神经网络(1)-前馈神经网络

转载请注明出处:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer
公众号:搜索与推荐Wiki

个人网站:http://thinkgamer.github.io


该系列的其他文章:


给定一组神经元,我们可以以神经元为节点来构建一个网络。不同的神经网络模型有着不同网络连接的拓扑结构。一种比较直接的拓扑结构是前馈网络。前馈神经网络(Feedforward Neural Network,FNN)是最早发明的简单人工神经网络。

介绍

在前馈神经网络中,不同的神经元属于不同的层,每一层的神经元可以接受到前一层的神经元信号,并产生信号输出到下一层。第0层叫做输入层,最后一层叫做输出层,中间的叫做隐藏层,整个网络中无反馈,信号从输入层到输出层单向传播,可用一个有用无环图表示。

前馈神经网络也成为多层感知器(Mutlti-Layer Perceptron,MLP)。但是多层感知器的叫法并不准确,因为前馈神经网络其实是由多层Logistic回归模型(连续的非线性模型)组成,而不是有多层感知器模型(非连续的非线性模型)组成。

下图为简单的前馈神经网络图:

多层前馈神经网络

神经网络中涉及的多个概念:

  • L:表示神经网络的层数
  • m^l:表示第 l 层神经元个数
  • f_l(.):表示第 l 层神经元的激活函数
  • W^l:表示第 l-1 层到第 l 层的权重矩阵
  • b^l:表示第 l-1 层到第 l 层的偏置
  • z^l:表示第 l 层神经元的净输入(净活性值)
  • a^l:表示第l层的神经元输出(活性值)

神经网络的信息传播公式如下(公式1-1)
z l = W l ⋅ a l − 1 + b l a l = f l ( z l ) z^l = W^l \cdot a^{l-1} + b^l \\ a^l = f_l(z^l) zl=Wlal1+blal=fl(zl)

公式1-1也可以合并写为(公式1-2):
z l = W l ⋅ f l − 1 ( z l − 1 ) + b l z^l = W^l \cdot f_{l-1}(z^{l-1}) + b^l zl=Wlfl1(zl1)+bl
或者(公式1-3)
a l = f l ( W l ⋅ a l − 1 + b l ) a^l = f_l(W^l \cdot a^{l-1} + b^l) al=fl(Wlal1+bl)
这样神经网络可以通过逐层的信息传递,得到网络最后的输出a^L。整个网络可以看做一个符合函数
ϕ ( x ; W , b ) \phi (x; W,b) ϕ(x;W,b)
将向量x作为第一层的输入a^0,将第 l 层的输入a^0, 将第L层的输出a^L 作为整个函数的输出。

x = a 0 → z 1 → a 1 → z 2 . . . . → a L − 1 → z L → a L = ϕ ( x ; W , b ) x = a^0 \rightarrow z^1 \rightarrow a^1 \rightarrow z^2 .... \rightarrow a^{L-1} \rightarrow z^L \rightarrow a^L = \phi (x;W,b) x=a0z1a1z2....aL1zLaL=ϕ(x;W,b)

其中W, b表示网络中所有层的连接权重和偏置。

参数学习

如果采用交叉熵损失函数,对于样本(x,y),其损失函数为(公式1-4):
L ( y , y ^ ) = − y T l o g ( y ^ ) L(y,\hat{y}) = -y^T log (\hat{y}) L(y,y^)=yTlog(y^)
其中 y 属于{0,1}^T为标签y对应的one-hot向量。

给定训练集D={(xn,yn)}, N >= n >=0,将每个样本x^n 输入给前馈神经网络,得到网络输出为y^n,其在数据集D上的结构化风险函数为(公式1-5):
R ( W , b ) = 1 N ∑ n = 1 N L ( y n , y ^ n ) + 1 2 λ ∥ W ∥ F 2 R(W,b)=\frac{1}{N}\sum_{n=1}^{N} L(y^n,\hat{y}^n) + \frac{1}{2}\lambda \left \| W \right \|_F^2 R(W,b)=N1n=1NL(yn,y^n)+21λWF2
其中W和b分别表示网络中所有的权重矩阵和偏置向量, (||W||_F)^2 是正则化项,用来防止过拟合,lambda是为正数的超参数,lambda越大,W越接近于0。这里的(||W||_F)^2一般使用Frobenius范数:
∥ W ∥ F 2 = ∑ l = 1 L ∑ i = 1 m l ∑ j = 1 m l − 1 ( W i j l ) 2 \left \| W \right \|_F^2= \sum_{l=1}^{L} \sum_{i=1}^{m^l} \sum_{j=1}^{m^{l-1}} (W_{ij}^l)^2 WF2=l=1Li=1mlj=1ml1(Wijl)2
有了学习准则和训练样本,网络参数可以通过梯度下降法来进行学习。在梯度下降方法的每次迭代过程中,第l层的参数 W^l 和 b^l 参数更新方式为(公式1-6):
W l ← W l − α ∂ R ( W , b ) ∂ W l = W l − α ( 1 N ∑ n = 1 N ( ∂ L ( y n , y ^ n ) ∂ W l ) + λ W l ) b l ← b l − α ∂ R ( W , b ) ∂ b l = b l − α ( 1 N ∑ n = 1 N ( ∂ L ( y n , y ^ n ) ∂ b l ) ) W^l \leftarrow W^l - \alpha \frac{\partial R(W,b)}{\partial W^l} =W^l - \alpha ( \frac{1}{N} \sum_{n=1}^{N}(\frac{\partial L(y^n,\hat{y}^n)}{\partial W^l}) + \lambda W^l ) \\ b^l \leftarrow b^l - \alpha \frac{\partial R(W,b)}{\partial b^l} =b^l - \alpha ( \frac{1}{N} \sum_{n=1}^{N}(\frac{\partial L(y^n,\hat{y}^n)}{\partial b^l}) ) WlWlαWlR(W,b)=Wlα(N1n=1N(WlL(yn,y^n))+λWl)blblαblR(W,b)=blα(N1n=1N(blL(yn,y^n)))

其中alpha为学习参数。

梯度下降法需要计算损失函数对参数的偏导数,如果通过链式法则逐一对每个参数进行求偏导效率比较低。在神经网络的训练中经常使用反向传播算法来高效的计算梯度。

反向传播算法

基于误差的反向传播算法(backpropagation,BP)的前馈神经网络训练过程可以分为以下三步:

  • 前馈计算每一层的净输入z^l 和激活值 a^l,直到最后一层
  • 反向传播计算每一层的误差项
  • 计算每一层参数的偏导数,并更新参数

其具体训练过程如下:

image

自动梯度计算

神经网络中的参数主要是通过梯度下降来进行优化的。当确定了风险函数及网络结构后,我们就可以手动用链式法则来计算风险函数对每个参数的梯度,并用代码进行实现。

目前几乎所有的深度学习框架都包含了自动梯度计算的功能,在使用框架进行神经网络开发时,我们只需要考虑网络的结构并用代码实现,其梯度可以自动进行计算,无需人工干预,这样开发效率就大大提高了。

自动梯度计算方法分为以下三种:

数值微分

数值微分(Numerical Differentiation)是用数值方法计算函数f(x)的导数。函数f(x)的点x的导数定义为:
f ′ ( x ) = l i m Δ x → 0 f ( x + Δ x ) − f ( x ) Δ x f'(x) = \underset{\Delta x \rightarrow 0}{ lim } \frac{ f(x + \Delta x) -f(x) }{ \Delta x } f(x)=Δx0limΔxf(x+Δx)f(x)
要计算f(x)在点x的导数,可以对x加上一个很少的非零扰动,然后通过上述定义来直接计算函数f(x)的梯度。数值微分方法非常容易实现,但找到一个合适扰动非常难,如果扰动过小会引起数值计算问题,比如舍入误差;如果扰动过大,会增加截断误差,使得导数计算不准确,因此数值微分的实用性比较差,在实际应用中,常用以下公式来计算梯度可以减少截断误差。
f ′ ( x ) = l i m Δ x → 0 f ( x + Δ x ) − f ( x − Δ x ) 2 Δ x f'(x) = \underset{\Delta x \rightarrow 0}{ lim } \frac{ f(x + \Delta x) -f(x -\Delta x) }{2 \Delta x } f(x)=Δx0lim2Δxf(x+Δx)f(xΔx)

  • 舍入误差:是指数值计算中由于数字舍入造成的近似值和精确值之间的差异,比如用浮点数来表示实数。
  • 截断误差:数学模型的理论解与数值计算问题的精确解之间的误差

符号微分

符号微分(Symbolic Differentiation)是一种基于符号计算的自动求导方法。符号计算,也叫代数计算,是指用计算机来处理带有变量的数学表达式。

符号计算的输入和输出都是数学表达式的化简、因式分解、微分、积分、解代数方程、求解常微分方程等运算。

比如数学表达式的化简

  • 输入:3x-x+2x+1
  • 输出:4x+1

符号计算一般来讲是对输入的表达式,通过迭代或递归使用一些事先定义的规则进行转换。当转换结果不能再继续使用变换规则时,便停止计算。

自动微分

自动微分(Automatic Differentiation,AD)是一种可以对一个(程序)函数进行计算导数的方法。符号微分的处理对象是数学表达式,而自动微分的处理对象是一个函数或一段程序。而自动微分可以直接在原始程序代码进行微分。自动微分的基本原理是所有的数值计算可以分解为一些基本操作,包含+,−,×, / 和一些初等函数exp, log, sin, cos 等。

自动微分也是利用链式法则来自动计算一个复合函数的梯度。我们以一个神经网络中常见的复合函数的例子来说明自动微分的过程。为了简单起见,令复合函数f(x;w, b) 为

f ( x ; w , b ) = 1 e x p ( − ( w x + b ) ) + 1 f(x;w,b)=\frac{1}{ exp(-(wx+b))+1 } f(x;w,b)=exp((wx+b))+11
其中x 为输入标量,w和b 分别为权重和偏置参数。

复合函数f(x;w,b) 可以拆解为:

image

继而就可以通过链式求导法则进行复合函数求导。


【技术服务】,详情点击查看: https://mp.weixin.qq.com/s/PtX9ukKRBmazAWARprGIAg

扫一扫 关注微信公众号!号主 专注于搜索和推荐系统,尝试使用算法去更好的服务于用户,包括但不局限于机器学习,深度学习,强化学习,自然语言理解,知识图谱,还不定时分享技术,资料,思考等文章!


<think>嗯,用户想了解前馈神经网络的架构图。首先,我需要回忆一下前馈神经网络的基本结构。前馈神经网络通常包括输入层、隐藏层和输出层,数据单向流动,没有循环或反馈。接下来,我应该考虑如何用文字描述这个架构图,可能需要分步骤解释各层的组成部分,以及它们之间的连接方式。 用户可能希望了解每一层的作用,比如输入层负责接收数据,隐藏层进行特征提取,输出层给出预测结果。同时,激活函数的作用也很重要,比如Sigmoid、ReLU等,应该在架构中提及。另外,前馈的过程需要强调数据从输入到输出的单向传播,没有反向连接。 需要注意用户提到要使用LaTeX格式的数学公式,所以当涉及到数学表达式时,比如加权求和或激活函数,需要用$...$包裹。例如,神经元输出的计算式:$a_j = \sigma(\sum w_{ji} x_i + b_j)$,这里要确保语法正确。 用户可能需要一个清晰的步骤解释,所以结构上应该分点说明,比如层结构、连接方式、激活函数、前向传播过程等。同时,可能需要对比其他网络结构,如反馈神经网络,来突出前馈的特点。 还要考虑用户可能的背景,是否具备相关知识,是否需要简化某些概念。比如,解释隐藏层时,可能需要提到深度增加隐藏层数,但这里保持基础解释即可。另外,架构图的文字描述是否足够,或者是否需要建议用户查阅具体图示,但由于用户要求文字介绍,所以需要详细用文字描绘。 最后,检查是否符合所有系统级指令:正确使用LaTeX格式,结构清晰,分步骤说明,使用中文,没有使用Markdown格式。确保每个数学表达式都正确无误,比如积分例子中的公式是否正确,虽然用户例子中的积分可能只是示例,但自己提到的公式如激活函数计算需要正确。</think>前馈神经网络(Feedforward Neural Network)是一种基础且广泛应用的神经网络结构,其数据流向为单向传递(输入→输出),无循环或反馈。以下是其架构的关键组成部分和运作流程的逐步解析: --- ### 一、层结构 1. **输入层(Input Layer)** - 功能:接收原始数据(如特征向量)。 - 节点数:等于输入特征的维度,例如输入图像像素为 $28 \times 28$,则节点数为 $784$。 - 数学表示:输入向量 $\mathbf{x} = [x_1, x_2, \dots, x_n]^T$。 2. **隐藏层(Hidden Layers)** - 功能:通过非线性变换提取高阶特征。 - 层数与节点数:可自定义(如1-3个隐藏层,每层节点数通常递减)。 - 数学表示:第 $l$ 层输出 $\mathbf{a}^{(l)} = \sigma(\mathbf{W}^{(l)} \mathbf{a}^{(l-1)} + \mathbf{b}^{(l)})$,其中 $\sigma$ 为激活函数。 3. **输出层(Output Layer)** - 功能:生成最终预测结果(如分类概率、回归值)。 - 节点数:由任务决定(如二分类为1,多分类为类别数)。 - 数学表示:输出 $\mathbf{\hat{y}} = \text{softmax}(\mathbf{W}^{(L)} \mathbf{a}^{(L-1)} + \mathbf{b}^{(L)})$(分类任务为例)。 --- ### 二、连接方式 - **全连接(Fully Connected)** 相邻层的每个节点均与下一层所有节点相连,权重矩阵 $\mathbf{W}$ 记录连接强度。 **示例**:第 $l$ 层第 $j$ 个节点的输入为: $$ z_j^{(l)} = \sum_{i=1}^{n} w_{ji}^{(l)} a_i^{(l-1)} + b_j^{(l)} $$ --- ### 三、激活函数(关键非线性组件) - **常见函数**: - Sigmoid:$\sigma(z) = \frac{1}{1 + e^{-z}}$(输出范围 $(0,1)$) - ReLU:$\sigma(z) = \max(0, z)$(缓解梯度消失) - Softmax:$\sigma(z_i) = \frac{e^{z_i}}{\sum_{j=1}^k e^{z_j}}$(多分类归一化) --- ### 四、前向传播流程 1. 输入数据 $\mathbf{x}$ 传递至输入层。 2. 逐层计算隐藏层输出: $$ \mathbf{a}^{(l)} = \sigma(\mathbf{W}^{(l)} \mathbf{a}^{(l-1)} + \mathbf{b}^{(l)}) $$ 3. 输出层生成预测结果 $\mathbf{\hat{y}}$。 --- ### 五、架构示意图(文字描述) ``` 输入层 隐藏层1 隐藏层2 输出层 (3节点) (4节点) (4节点) (2节点) x₁ ●----------------------------● \ / \ / \ / x₂ ●----------------------------● / \ / \ / \ x₃ ●----------------------------● ``` --- ### 六、典型特点 - **无反馈**:信息单向流动,无循环结构(区别于RNN)。 - **通用近似性**:单隐藏层即可逼近任意连续函数(需足够宽度)。 - **参数规模**:权重矩阵维度为 $n_{\text{当前层}} \times n_{\text{前一层}}$。 如需进一步绘制具体架构图,建议使用工具如TensorBoard或绘图库(如Matplotlib),标注层名、节点数与激活函数。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值