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

常见的五种神经网络(1)-前馈神经网络转载请注明出处 http blog csdn net gamer gyt 博主微博 http weibo com Github https github com thinkgamer 公众号 数据与算法联盟给定一组神经元 我们可以以神经元为节点来构建一个网络 不同的神经网络模型有着不同网络连接的拓扑结构 一种比较直接的拓扑结构是前馈网络 前馈神经网络 Feed

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


该系列的其他文章:

  • 常见的五种神经网络(1)-前馈神经网络
  • 常见的五种神经网络(2)-卷积神经网络
  • 常见的五种神经网络(3)-循环神经网络(上)篇
  • 常见的五种神经网络(3)-循环神经网络(中)篇
  • 常见的五种神经网络(3)-循环神经网络(下)篇
  • 常见的五种神经网络(4)-深度信念网络(上)篇
  • 常见的五种神经网络(4)-深度信念网络(下)篇
  • 常见的五种神经网络(5)-生成对抗网络

给定一组神经元,我们可以以神经元为节点来构建一个网络。不同的神经网络模型有着不同网络连接的拓扑结构。一种比较直接的拓扑结构是前馈网络。前馈神经网络(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层的神经元输出(活性值)

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表示网络中所有层的连接权重和偏置。

参数学习

给定训练集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

自动梯度计算

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

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

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

数值微分

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

符号微分

符号微分(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..com/s/PtX9ukKRBmazAWARprGIAg



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


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


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206414.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午3:45
下一篇 2026年3月19日 下午3:45


相关推荐

  • jQuery数据类型总结建议收藏

    jQuery除了包含原生JS中的内置数据类型(built-indatatype),还包括一些扩展的数据类型(virtualtypes),如Selectors、Events等。1.StringS

    2021年12月21日
    38
  • unity3d场景制作

    unity3d场景制作这是最后的成果以上图片资源均为资源商店免费获取制作地形的方法1创建相邻地形(主要用于地形的扩大)2绘制地形(主要用于地貌的设置)3绘制树(用于树木的绘制)4绘制细节(用于小草或小花的设置)5地形设置(用于整体设置)绘制的主要方面为2、3、4点第2点:不同地形是有不同纹理形成,在编辑地形层中选择自己喜欢的地形。注意:法线贴图是地形纹理的进一步深化,可以加强地形的真实感第3点绘制树与绘制地形基本相同第4点绘制细节与前两者不同的是,除了细节纹理外,还有细节网格对与地形的

    2022年4月30日
    60
  • 怎么卸载pip重新安装_pip重新安装显示超时

    怎么卸载pip重新安装_pip重新安装显示超时今天不小心把pip给删除了,然后就搜怎么安装。弄了半天才弄好,这边记录一下:首先这个网站给出了安装的方法https://packaging.python.org/tutorials/installing-packages/#use-pip-for-installing全英文,看不懂?那就按照下面的办法。下载一个文件,连接给出了:https://download.csdn.net/do…

    2022年10月18日
    4
  • Oracle PL/SQL编程之四: 把游标说透「建议收藏」

    Oracle PL/SQL编程之四: 把游标说透「建议收藏」Oracle PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)本篇主要内容如下:4.1 游标概念4.1.1 处理显式游标4.1.2 处理隐式游标4.1.3 关于 NO_DATA_FOUND 和 %NOTFOUND的区别4.1.4  使用游标更新和删除数据4.2 游标变量4.2.1  声明游标变

    2022年6月17日
    27
  • 读书篇:《细说PHP》三、PHP的语言结构

    读书篇:《细说PHP》三、PHP的语言结构今天我们继续读 细说 PHP 第六章 本章主要讲两个部分 流程控制语句 函数 先来分析流程控制 书中如此描述 流程控制对于任何一门编程语言都至关重要 它提供了控制程序步骤的基本手段 是程序的核心部分 在任何一门程序设计语言中 都需要支持满足程序结构化所需的三种基本结构 顺序结构 主要是程序自上而下顺序执行 分支结构 可以叫条件结构 会在程序执行中按条件判断来改变程序执行的顺序 循环结构 重复执行程序的操作 我们一个一个来分析 顺序结构的语句主要就是赋值 输入 输出等就不多做介绍啦

    2025年12月3日
    6
  • vuejs中执行npm run dev出现页面cannot GET/问题

    vuejs中执行npm run dev出现页面cannot GET/问题

    2021年10月11日
    54

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号