Fork me on GitHub

十三. 神经网络

1. 神经网络

神经网络与深度学习

在过去的10年,AI不仅在学术界同时也在工业界取得了飞速的发展,背后离不开深度学习的贡献。就是因为深度学习的崛起,人工智能逐步进入了人们的视野,也有了今天各种AI的落地场景。特别是,

ImageNet竞赛和AlphaGo事件正好也起到了催化剂的作用,迅速引起了全球对AI的风波,促使人人谈论AI,也让很多公司开始对AI重视了起来。

 

 

实际上,基于神经网络的深度学习在90年代已经被人提出来了,但那个年代很少人关注深度学习,而且只有以hinton为代表的少部分人一直坚持了下来。

深度学习实际上并不新鲜, 包括反向传播算法在90年代已经被提出来了。但那个时候深度学习并没有受到关注, 主要因为它并没有带来很好的效果。归其原因:

  • 第一、那时候我们并不知道如何更好地训练模型,预训练等概念2000年后才被提了出来; 
  • 第二、那时候数据量也很少, 而且我们知道深度学习的优势在于处理大量的数据。数据量较少时, 传统的方法也能取得较好的效果;
  • 第三、训练深度学习需要大量的算力, 那时候显然不像今天, 有着很强的计算工具。

总结起来,对于深度学习的发展跟以下几点是离不开的

  • 大量的数据(大数据)
  • 计算资源(如GPU)
  • 训练方法(如预训练) 

很多时候,我们也可以认为真正让深度学习爆发起来的是数据和算力,这并不是没道理的。

深度学习加速推进了AI的发展以及工业界中的落地,然而深度学习模型的基础是神经网络,所以理解神经网络具有巨大意义。

神经网络中所涉及到的前向传播、反向传播等技术以及梯度消失等现象都会出现在其他深度学习模型如深度神经网络、卷积神经网络、RNN、LSTM中。先学好神经网络再去接触深度学习相关的技术,这

样会事半功倍。 

神经网络与大脑 

对于监督学习来讲,核心是要学出特征x到标签y之间的关系,具体的学习过程可通过机器学习模型。每一种机器学习模型实际上是对函数f 的假设,比如线性回归或者逻辑回归模型 假设 f为线性,

所以它只能学出x到y的线性映射关系。如果x,y之间并不是线性关系,则效果会大打折扣。

神经网络实际上也跟逻辑回归等模型一样,本质是要学出x到y之间的关系,但不同于其他的模型,我们希望神经网络可以模拟出人类在处理信息时的情形。

神经网络中的神经(neural)实际上跟大脑中的神经元(neuron)有着紧密的关系。 

神经网络的提出是为了模拟大脑, 你觉得目前的神经网络或者深度学习能够真正模拟出大脑的机理吗?

目前我们对大脑的认知是非常有限的, 真正能够打开大脑里的秘密可能需要未来很长时间, 但这也不是说, 我们对大脑完全不了解。从这个角度, 我们可以很容易判断出神经网络或者深度学习只能算是在我

们有限的认知下尽量模仿大脑。

学习的本质

 

 神经网络试着模拟大脑中的信号传递

 从映射的角度考虑

神经网络中的神经元

我们都知道神经网络模型的提出是为了模拟人的大脑的,而且人的大脑由非常多的神经元组成,每个神经元是接受信号和输出信号的最小单位。当我们人类接收外界信号时,这个信号会层层通过大脑里

的神经元进行传递,最终这些会使得人类对外界做出一些反应。类似的,神经网络本身也是由大量的神经元(neuron)构成。那接下来先了解一下神经网络中每一个神经元是如何工作的。

神经网络

  • 神经元是神经网络的最小组成部分;
  • 激活函数的作用是让x到y的映射关系更为复杂;(激活函数的目的就是让映射变得更复杂, 这样训练出来的模型可以学出 x到 y的更复杂的映射关系, 所以比较适合复杂一点的数据。)
  • 神经元的作用实际上是接受数据,处理好之后再去输出;

2. 不同类型的激活函数

线性激活函数

线性激活函数实际上是没作用的,即便加了也等于什么都没加,因为它对信号不会做任何的处理。这有点类似于管道,来了信号之后原封不动地输出出去。之所以提出线性激活函数,其主要目的是为了

完整性。那什么会用到线性激活函数呢?通常在,深度模型中的最后一层会用到。另外,如果我们没有叠加任何的激活函数到神经元,默认可以认为是加了线性激活函数。

非线性激活函数

激活函数 Sigmoid 

 

 二分类问题

通过神经元构建二分类问题,输入:x1、x2、x3...xd,1是偏移量;每个输入是跟神经元相连接的,相连接时都有一个参数w1、w2、w3...wd,b;

神经元是分两部分的,一个叫pre - activation ,另外一个叫post - activation;

逻辑回归是神经网络的特例;

 

 激活函数 "tanh"

分母为指数,分母肯定是大于0的,分子是减法可能是小于0,分子和分母分别乘以exp(a) 得到简化如下 

tanh(a) 定义域是负无穷到正无穷,值域是 (-1,1) ;它有如下特点:

  • ① 可以把负无穷到正无穷 映射到 (-1,1)直接;
  • ② 有边界的
  • ③ 严格递增的,而且是一对一对应的;

3. 多层神经网络的向前传播

 多层神经网络的前向传播,也就是给定一个输入之后,计算最终的输出。

神经网络是由神经元构成的,同时也是一层一层叠加而成的。那为什么要叠加呢? 之后会了解到。先看如何做前向传播(forward propagation),也就是给定一个输入之后,如何通过一层层的网络结构最后

得到输出,这一点对理解神经网络来讲格外重要。只有理解了这一点,才能清楚理解反向传播算法(back propagation),也是深度学习训练中最为核心的技术。

对于多层神经网络, 假如针对于每个神经元我们都选择线性激活函数,如果都是线性函数,多层是没有意义的, 如果都是线性函数, 最终得出的x和y之间的关系就是线性的;

如果每一个激活函数都是线性的, 那最终得出来的x, y映射关系也是线性的。假设我们对样本x 依次做了线性转换T1, T2, T3, 则最终的输出为T3 * ( T2* ( T1x)) , 利用矩阵的乘法性质,可以改写成 (T3 T2 *

T1 ) * x,  多个矩阵的乘积仍然是矩阵,也就是线性转换。这就意味着,即便我们做了多层的转换, 最终的出来的仍然是线性关系, 所以它并不增加模型的复杂度。

拥有一层隐含层的神经网络

这一层的每个神经元的输入是来自所有的输入x1、x2...xd、1,然后通过pre activation 再输出到post activation,每个输入跟这个神经元有个参数矩阵 w(1) b(1)  ,上标(1) 代表第一层的参数即这个参数是

跟第一层的隐含层相连接的;通过w(1) b(1)  处理完信号之后,最终会得到第一层的输出即红色的部分,

然后再传递给下一层的神经元,这一层的参数用向量 w(2) b(2) 来表示,这里的(2)代表第二层的参数;

绿色部分表示pre activation 即激活函数之前,红色部分表示post activation,绿色部分的神经元起名依次叫 a(x)1...a(x)i ...a(x)d ,红色部分的神经元起名依次叫 h(x)1...h(x)i ...h(x)d ,

每条线即输入到每个神经元的都是有参数的依次叫 w (1)11 ,w (1)i1 ,下标第一个i 表示目的地,第二个参1 表示输入;

如果是分类下面的激活函数(输出神经元)就是softmax函数; 

 

 多输出 - 分类 & 损失函数

假设只有一层隐含层,有三个输出(三分类问题)

 h(2)(x)1、h(2)(x)i 、h(2)(x)d ,  输出应该之和应该是1

所有分子之后等于分母;loss损失函数无非就是计算它俩之后的距离,独热编码和 概率,它俩之后的距离通过cross-entropy 计算;

多层神经网络

当我们增加额外的隐含层时就可以得到多层神经网络。至于隐含层的个数是没有限制的,我们可以随意搭建很多层的神经网络。为什么要增加隐含层呢? 道理很简单,增加隐含层可直接导致模型的复杂度

变高,随之带来的就是可以学出到 y的更复杂的映射关系。

不管是卷积神经网络,还是RNN、STM,或是最新的模型像transform、bert,核心就是个反向传播算法;

bp(反方传播)算法如何在多层神经网络里运作的; 深度学习的学习,使用的优化方法叫反向传播算法;

下面L层是隐含层 是超参数,a(k)(x) = b(k) + w(k). h(k-1)(x) ,b(k) 偏移量,h(k-1)(x) 上一层的输出;

一层层的传递最终得到输出,可以跟真实标签做一个比较,比较完之后就知道它的loss,有了loss之后就可以通过梯度下降法去求出这个参数,这个过程叫做反向传播算法;

对于神经网络来讲,网络的层数、每一个隐含层所包含的神经元个数,这些都是模型的超参数。那这些超参数如何选择呢? 最经典的方法仍然是交叉验证,每种组合都实验一遍,并找出其中最好的参数组

合。然而,对于很多层的神经网络,我们具有非常多的超参数,仅仅做交叉验证就需要大量的计算资源。幸运的是,交叉验证本身可以并行化,每一组参数的尝试互不影响。

训练神经网络或者深度学习,实际上最大的挑战在于设计网络结构。那问题就来了,有没有更好地方式来设计网络结构呢?是否真的必要人工去一个个尝试呢?为了解决这些问题,AutoML概念被提了出

来,也就是让机器自动去寻找最好的网络结构。这个领域目前发展很迅速,在不久的将来我们应该都可以用上AutoML工具。

4. 学习模型的参数-反向传播算法

 如何对深度神经网络做反向传播,从而去学习模型的参数。是整个深度学习领域的核心,贯穿任所有度学习模型。

任何模型训练的第一步是明确损失函数。模型训练过程无非就是在优化损失函数,从而找到让损失函数最小的模型的参数。主要以深度神经网络为例来讲解反向传播算法,自然而然的,第一步就是

要定义出损失函数。在这里先假定任务是分类任务,所以损失部分需要使用交叉熵损失(cross-entropy loss)。

神经网络的损失

任何模型训练的第一步是明确损失函数。模型训练过程无非就是在优化损失函数,从而找到让损失函数最小的模型的参数。以深度神经网络为例来讲解反向传播算法,自然而然的,第一步就是要定义出

损失函数。在这里先假定任务是分类任务,所以损失部分需要使用交叉熵损失(cross-entropy loss)。

 

 样本集数据D,argθ min 目为标函数 其实就是损失函数 + 正则项,θ可以认为是整个网络结构的参数集合,预测值与真实值之间的差异;

L是损失函数,如果是分类问题定义为交叉熵损失(cross-entropy loss),为了防止过拟合,添加正则项;

通过梯度下降法求解θ;

 

反向传播算法

有了目标函数之后,就可以通过优化算法去学习参数了。在优化技术中,最经典的仍然是梯度下降法。如何把梯度下降法应用在深度神经网络中呢? 优化过程跟之前讲过的逻辑回归等模型有些区别,主要

在于计算梯度时要做一层一层的反向传播。详细剖析一下反向传播中具体会发生什么。

核心是要计算loss对参数的梯度,分别做一个梯度下降法,因为每层都有依赖关系,所以是从上往下去进行梯度计算,神经元的梯度、参数的梯度,一直到第一层参数的梯度;

梯度计算主要分为五个模块:

① 对输出端output  f(x) 单独计算;

② 输出层的pre activatio 

③ 中间这一带,loss对每个h(k)(x) 的梯度;

④ loss对每个 a(k)(x) 的计算;

⑤ loss对真正参数的梯度,w(k) 和 b(k)  

    ①②是对输出层, ③④ 对隐含层

 

目标是求loss对整个f(x)的梯度; f(x)为向量,I 为Indicator function函数,I (y=c) 满足条件时为true时这个值为1,否则为0;

loss对整个向量的梯度,e(y) 为独热编码 样本的标签是可以提前知道的;

标量对向量、矩阵的梯度时,求出来的结果应该是跟向量或矩阵的大小是一样的;

 

 loss对输出神经元 pre precation 的梯度 

 

 

 loss对整个的梯度 

 

 loss对 post-activation 的梯度

chain rule,现在想要计算loss 对h(k)(x)c 的梯度但是它受到其他节点的影响,这是反向传播算法最核心的思想,

 

loss 对 pre-activation的梯度

 

 loss对参数梯度的计算

 

BP算法的整个过程

对于给定数据x,对任何数据(x, y) ;

A: 在给定模型参数下,首先做一个前向传递,可以把相关参数值包括loss全部计算出来;

B: 反向传递过程,

  • 计算output输出层梯度,
  • (K=L+1 to 1)
    • 对w的gradientloss对参数的梯度... 对参数的计算一层层的传递下去;
    • 对隐含层的梯度计算;

 

总体来讲,对于网络的优化分为两步:

第一步叫作前向传播,也就是把特征向量放到模型里,然后通过一层一层得到预测值,再把预测值和实际真实值对比一下就可以得到针对于当前样本的损失。

第二步就是反向传播的过程了,核心是计算对于参数的梯度,同时在梯度计算过程中也依赖于正向传播中所计算的中间结果。

看到这里,很多人可能意识到了反向传播的复杂性,稍微不注意可能就会犯错,从而让整个的训练面临失败。另外,在实现过程中也会遇到一些棘手的问题比如数据的溢出等等。总而言之,真的想完全

正确实现一个反向传播算法是非常具有挑战的,可以想象一下,对于几十层、甚至几百层的网络结构如何准确地计算出参数的梯度?这个太难了!

深度学习框架的诞生

为了解决这个问题,很早之前人们就开始研究如何为用户封装反向传播的部分,让我们只专注于设计网络结构,不再去关注具体反向传播的细节。TensorFlow,Pytorch等框架就是为了这个目的而诞生

的。这些框架的核心价值就是帮助我们完成反向传播部分,不再需要我们纠结如何实现。

一旦网络结构设计好,这些框架就可以帮助计算梯度,随后就可以做梯度更新了。比如在Pytorch里,我们只需要在forward函数中完成前向传播的过程即可。这大大加速了模型的构建过程,同时也降低了

应用深度学习的门槛。所以,现在即便很多人没有具备很强的理论基础,仍可以使用这些框架来完成深度学习模型的搭建。今后,这种工具化的趋势会越来越明显,让每个人的工作变得更加高效,促使

我们把最主要的经历花在创新形的工作上。

5. 关于深度神经网络

从浅层到深度模型

浅层模型和深度模型之间的区别。深度模型的核心在于“深”,比如一个深度神经网络可能拥有几个隐含层,甚至更多。有点像搭积木,把一个模块一层一层地搭上去。 那为什么我们倾向于搭建一个多层

的结构呢? 而不是浅层的结构? 具体潜在的逻辑在哪儿呢?搭建多层的结构有很多好处。

深度神经网络的好处

深度学习网络更节省参数,更容易防止过拟合现象; 可以表示层次关系;用更少的参数把更复杂的映射关系表示出来;用更少的参数表示更复杂的模型;

 

其他常见的深度网络结构

RNN和LSTM模型主要用来解决时序(time series)的问题,比如预测天气、预测股价、或者预测一个句子的情感等等,RNN会存在梯度的问题,很难去描述一个非常长的序列,LSTM可以解决梯度消息梯

度爆炸的现象。另外,机器翻译、文本生成、对话系统等很多任务可以基于LSTM模型来搭建的。

CNN卷积神经网络主要用来解决图像方面的任务,比如图像分类、交通信号识别、目标检测、行人检测等。 以上都属于深度学习领域,只要把机器学习部分学好了,深度学习的学习会变得很轻松。

 

posted @   kris12  阅读(737)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
levels of contents
点击右上角即可分享
微信分享提示