神经网络基本结构

Posted on 2022-07-04 15:15  Charlie_ODD  阅读(1164)  评论(0编辑  收藏  举报

前言

本文介绍的逻辑分为两条

  • 按照基本且典型的神经网络模型进行介绍:MLP/DNN 、CNN、RNN
  • 按照研究领域的典型模型进行介绍:
    • 计算机视觉:GAN、Transformer、Object Detection
    • 自然语言处理:LSTM、GAN
    • 图神经网络:GNN
    • 推荐系统:Deep&wide双塔模型

 

前馈(Feed-Forward)网络 ≈ 全连接神经网络 Full Connect Neural Network

前馈网络是感知器的集合,其中有三种基本类型的层: 输入层、隐藏层和输出层。 在每个连接过程中,来自前一层的信号被乘以一个权重,增加一个偏置,然后通过一个激活函数。 前馈网络使用反向传播迭代更新参数,直到达到理想的性能。

 

残差网络(Residual Networks/ResNet)

综述

深层前馈神经网络的一个问题是所谓的梯度消失,即当网络太深时,有用的信息无法在整个网络中反向传播。 当更新参数的信号通过网络传播时,它会逐渐减少,直到网络前面部分的权重不再改变或者根本不再使用。
解决这个问题的其中一个方法,可以使用残差网络使用跳过连接实现信号跨层传播。 通过使用这种不易受到影响的连接来减少梯度消失问题。 随着时间的推移,通过学习特征空间,网络学会了重建跳过的层,但训练更有效,因为它的梯度不容易消失和需要探索更少的特征空间。

ResNet的贡献之一,就是残差结构

  • 前向传播:

  • 反向传播:

深层的梯度可以直接传回浅层

Idea初衷

让我们来回想深度学习的起源,与传统的机器学习相比,深度学习的关键特征在于网络层数更深、非线性转换(激活)、自动的特征提取和特征转换,其中,非线性转换是关键目标,它将数据映射到高纬空间以便于更好的完成“数据分类”。随着网络深度的不断增大,所引入的激活函数也越来越多,数据被映射到更加离散的空间,此时已经难以让数据回到原点(恒等变换)。或者说,神经网络将这些数据映射回原点所需要的计算量,已经远远超过我们所能承受的。在设计深度神经网络的时候,或许应该刻意增强深度神经网络剔除冗余信息的能力。

退化现象让我们对非线性转换进行反思,非线性转换极大的提高了数据分类能力,但是,随着网络的深度不断的加大,我们在非线性转换方面已经走的太远,竟然无法实现线性转换。显然,在神经网络中增加线性转换分支成为很好的选择,于是,ResNet团队在ResNet模块中增加了快捷连接分支,在线性转换和非线性转换之间寻求一个平衡。

举个例子——深度残差收缩网络的基本模块

如下图所示,深度残差收缩网络在基本模块中引入了一个子网络,来学习得到一组阈值,然后对残差路径进行软阈值化(即“收缩”)。这个过程可以看成一种非常灵活的、删除冗余信息的方式。

(1)软阈值化的优势

  • 灵活地删除冗余信息。软阈值化能够将位于[-τ, τ]区间的特征置为零,将其他特征也朝着零的方向进行收缩。如果和前一个卷积层的偏置b放在一起看的话,置为零的区间其实就是[-τ+b, τ+b]。在这里,τ和b都是可训练的参数。在这里,软阈值化其实可以将任意区间的特征置为零,也就是删除掉,是一种非常灵活的、删除冗余信息的方式。
  • 梯度要么为零,要么为一。这个特点是和ReLU激活函数一样的,有利于减小梯度消失和梯度爆照的风险。

(2)子网络与软阈值化的结合

软阈值化中的阈值设置是一个难题。在深度残差收缩网络中,阈值是通过一个子网络自动获得的,不需要人工设置,避免了这个难题,而且还带来了以下优点:

  • 每个样本可以有自己独特的阈值。一个数据集中,可能有的样本冗余信息较多,有些样本冗余信息较少,那么它们的阈值应该是有所不同的。深度残差收缩网络借助这个子网络,能够给各个样本赋予不同的阈值。
  • 阈值为正数,且不会太大。在软阈值化中,阈值需要是正数,而且不能太大,否则输出会全部为零。深度残差收缩网络的基本模块经过专门的设计,能够满足这一条件。

循环神经网络 (Recurrent Neural Network/RNN)

概述

循环神经网络是一种特殊类型的网络,它包含环和自重复,因此被称为“循环”。 由于允许信息存储在网络中,RNNs 使用以前训练中的推理来对即将到来的事件做出更好、更明智的决定。 为了做到这一点,它使用以前的预测作为“上下文信号”。 由于其性质,RNNs 通常用于处理顺序任务,如逐字生成文本或预测时间序列数据(例如股票价格)。 它们还可以处理任意大小的输入

一个典型的RNN网络包含一个输入x,一个输出h和一个神经网络单元A。和普通的神经网络不同的是,RNN网络的神经网络单元A不仅仅与输入和输出存在联系,其与自身也存在一个回路。

网络单元

这种网络结构就揭示了RNN的实质:上一个时刻的网络状态信息将会作用于下一个时刻的网络状态。如果上图的网络结构仍不够清晰,RNN网络还能够以时间序列展开成如下形式:


等号右边是RNN的展开形式。由于RNN一般用来处理序列信息,因此下文说明时都以时间序列来举例,解释。等号右边的等价RNN网络中最初始的输入是x0,输出是h0,这代表着0时刻RNN网络的输入为x0,输出为h0,网络神经元在0时刻的状态保存在A中。当下一个时刻1到来时,此时网络神经元的状态不仅仅由1时刻的输入x1决定,也由0时刻的神经元状态决定。以后的情况都以此类推,直到时间序列的末尾t时刻。

  • RNN的正向传播(forward propagation)

上图依然是一个RNN神经网络的时序展开模型,中间t时刻的网络模型揭示了RNN的结构。可以看到,原始的RNN网络的内部结构非常简单。神经元A在t时刻的状态仅仅是t-1时刻神经元状态与t时刻网络输入的双曲正切函数的值,这个值不仅仅作为该时刻网络的输出,也作为该时刻网络的状态被传入到下一个时刻的网络状态中,这个过程叫做RNN的正向传播(forward propagation)。

前向传播

现在看上去就比较清楚了,这个网络在t时刻接收到输入 之后,隐藏层的值是 ,输出值是 。关键一点是, 的值不仅仅取决于 ,还取决于 。我们可以用下面的公式来表示循环神经网络的计算方法:

用公式表示如下:

的值不仅仅取决于,还取决于

  • RNN具有很多变形的结构:

不同的RNN结构:多对多、多对一、一对多、多对多

RNN的反向传播算法 ——BPTT(Backward Propogation Through Time)

todo

存在的问题

    • 长期依赖问题

在深度学习领域中(尤其是RNN),“长期依赖” 问题是普遍存在的。长期依赖产生的原因是当神经网络的节点经过许多阶段的计算后,之前比较长的时间片的特征已经被覆盖,例如下面例子

我们想预测'full'之前系动词的单复数情况,显然full是取决于第二个单词’cat‘的单复数情况,而非其前面的单词food。根据图1展示的RNN的结构,随着数据时间片的增加,RNN丧失了学习连接如此远的信息的能力。

    • 梯度消失/爆炸

梯度消失和梯度爆炸是困扰RNN模型训练的关键原因之一,产生梯度消失和梯度爆炸是由于RNN的权值矩阵循环相乘导致的,相同函数的多次组合会导致极端的非线性行为。梯度消失和梯度爆炸主要存在RNN中,因为RNN中每个时间片使用相同的权值矩阵。

对于一个DNN,虽然也涉及多个矩阵的相乘,但是通过精心设计权值的比例可以避免梯度消失和梯度爆炸的问题。

处理梯度爆炸可以采用梯度截断的方法。所谓梯度截断是指将梯度值超过阈值 的梯度手动降到 。虽然梯度截断会一定程度上改变梯度的方向,但梯度截断的方向依旧是朝向损失函数减小的方向。

对比梯度爆炸,梯度消失不能简单的通过类似梯度截断的阈值式方法来解决,因为长期依赖的现象也会产生很小的梯度。在上面例子中,我们希望 时刻能够读到 时刻的特征,在这期间内我们自然不希望隐层节点状态发生很大的变化,所以 时刻的梯度要尽可能的小才能保证梯度变化小。很明显,如果我们刻意提高小梯度的值将会使模型失去捕捉长期依赖的能力。

长短时记忆网络LSTM(Long Short-Term Memory

概述

具有记忆长短期信息的能力的神经网络,LSTM之所以能够解决RNN的长期依赖问题,是因为LSTM引入了门(gate)机制用于控制特征的流通和损失。

对于上面的例子,LSTM可以做到在t9时刻将t2时刻的特征传过来,这样就可以非常有效的判断 时刻使用单数还是复数了。LSTM是由一系列LSTM单元(LSTM Unit)组成,其 链式结构(单元)如下图:

 

符号说明

每个黄色方框表示一个神经网络层,由权值,偏置以及激活函数组成;每个粉色圆圈表示元素级别操作;箭头表示向量流向;相交的箭头表示向量的拼接;分叉的箭头表示向量的复制。

  • 输入有三个:
    • 细胞状态
    • 隐层状态
    • 时刻输入向量
  • 输出有两个:
    • 细胞状态
    • 隐层状态
  • 处理核心逻辑:
    • 细胞状态的信息,一直在上面那条线上传递,时刻的输入与隐层状态会对影响
    • 会参与时刻输出的计算
    • 隐层状态的信息,通过LSTM的“门”结构,对细胞状态进行修改,并且参与输出的计算

结构及门详解

结构拆分

图例

公式&说明

理解&说明

LSTM的单元状态

 

LSTM的遗忘门

  • 其中 叫做遗忘门,表示 的哪些特征被用于计算 是一个向量,向量的每个元素均位于 范围内。
  • 其中 是LSTM最重要的门机制,表示 之间的单位乘的关系。
  • 通常我们使用 作为激活函数, 的输出是一个介于 区间内的值,但是当你观察一个训练好的LSTM时,你会发现门的值绝大多数都非常接近0或者1,其余的值少之又少。

将上一时刻(t-1时刻)的 隐藏状态的信息与 t 时刻的数据共同输入Sigmod函数,输出值介于0~1之间,代表该不该忘记,越接近0表示越应该忘记,最后得到的这个值会与前一时刻的记忆做乘积运算来限制前面的记忆对后面的影响。

 

所以,我们可以形象地将称为: 过去记忆重要程度的衡量因子【截断和筛选过去记忆】 例如:如果sigmoid 函数输出的结果是:0,就代表当前的上一时刻的隐藏层和这一时刻的输入组成的综合结果是没有任何价值的,那么这个 0 与相乘,就会导致前面的信息被遗忘。

LSTM的输入门 和单元状态更新值的计算方式

(或称更新门)

  • 表示单元状态更新值,由输入数据 和隐节点 经由一个神经网络层得到,单元状态更新值的激活函数通常使用 叫做输入门,同 一样也是一个元素介于 区间内的向量,同样由 经由 激活函数计算而成。

这个“输入门”有两条线路组成:【扩展记忆的总容量】

  • 左边的那条:经过sigmoid,函数,美其名曰叫做,但是不知道细心的你是否发现了他与 “遗忘门” 的结构几乎是一样的,那么你想这是为什么呢? 因为它同样只需要产生一个 0~1 的结果就好了,因为后面要与作乘积,做个假设,假如sigmoid结果出来是0, 那无论是什么,都没有输进的必要了,所以用乘积的方式来代表输入当前数据的重要程度是很聪明的一种做法。所以我们把左边这条线称作为【输入的重要性因子】
  • 右边的那条:和左边那条线输入的数据都是一样的,包括“遗忘门”输入的数据都是一样的,都是。不同的是,右边这条线经过的激活函数不是 sigmoid(输出层用法) 而是tanh(隐藏层用法)

注:sigmoid函数的分布范围在 0~1,而 tanh 的分布范围是-1~1,tanh 起的作用是压缩输入tanh函数的数值,使其分布在 -1~1以调节网络,有类似于数据中心化的效果,使得其收敛速度要比sigmoid快;所以一般在隐藏层使用 tanh 而在输出层使用 sigmoid ;

LSTM的输出门 的使用方法

  • 用于控制 的哪些特征用于更新 ,使用方式和 相同

遗忘门【截断和筛选过去记忆】输出

+

输入门【扩展记忆的总容量】输出

=

当前的“重要”的记忆

LSTM的输出门

  • 由输出门 和单元状态 得到,其中 的计算方式和 以及 相同。

图中红色的圆圈部分其实已经形成了“新的记忆” 不做任何处理,直接输出到下一个单元作为下一个单元的“记忆”。但是,可以很明显的看到,不同,其要输出到下一个LSTM神经细胞单元需要再进行两个步骤:

  • 经过tanh 函数进行调整
  • 与上一个时刻的隐藏状态与本时刻输入的综合数据做乘积运算

计算流程

优缺点

  • 优点:
    • 改善了RNN中存在的长期依赖问题;
    • LSTM的表现通常比时间递归神经网络及隐马尔科夫模型(HMM)更好;作为非线性模型,LSTM可作为复杂的非线性单元用于构造更大型深度神经网络。
    • 在序列建模问题上有一定优势,具有长时记忆功能。实现起来简单。
    • 解决了长序列训练过程中存在的梯度消失和梯度爆炸的问题。
  • 缺点:
    • 并行处理上存在劣势。与一些最新的网络相对效果一般
    • RNN的梯度问题在LSTM及其变种里面得到了一定程度的解决,但还是不够。它可以处理100个量级的序列,而对于1000个量级,或者更长的序列则依然会显得很棘手;另一个缺点是每一个LSTM的cell里面都意味着有4个全连接层(MLP),如果LSTM的时间跨度很大,并且网络又很深,这个计算量会很大,很耗时。

卷积神经网络(Convolutional Neural Networks, CNN)