目录
LSTM 的核心:门控单元(Gating Mechanism)
CNN
什么是CNN?
卷积神经网络(CNN,Convolutional Neural Network)是一种深度学习模型,在处理图像、视频等网格状数据方面表现出色。它模仿了人类视觉皮层的感知机制,能够自动从数据中学习并提取特征。
CNN的核心思想
CNN 的核心思想是局部感知和权值共享。
局部感知
- 传统神经网络在处理图像时,会将图像展平为一维向量,导致丢失像素之间的空间关系。CNN 则通过“局部感受野”来解决这个问题。每个神经元只关注输入数据的一个小区域(例如,图像的一小块像素),而不是整个输入。这使得网络能够捕捉到图像中的局部特征,如边缘、纹理等。
图源:卷积神经网络(CNN)详细介绍及其原理详解-CSDN博客
权值共享
- 在局部感知的基础上,CNN 进一步引入了权值共享。这意味着同一个卷积核(或滤波器)会在输入数据的不同区域上滑动,并使用相同的权重和偏置进行计算。这样做的好处是大大减少了模型的参数数量,降低了过拟合的风险,并使得模型能够识别图像中无论出现在何处的相同特征。
CNN的主要组成部分
卷积层(Convolutional Layer)
- 作用:这是 CNN 的核心,负责从输入数据中提取特征。
- 工作原理:卷积层使用卷积核(Kernel)(也称为滤波器,Filter)对输入数据进行卷积操作。卷积核是一个小的矩阵,它在输入数据上滑动,并与输入数据的局部区域进行点积运算,生成一个特征图(Feature Map)。每个特征图都代表了输入数据中学习到的一个特定特征。
- 特点:通过调整卷积核的大小、步长(Stride)和填充(Padding),可以控制特征提取的粒度和范围。
从左到右分别表示卷积的过程、Padding为1时的卷积过程、Padding为2时的卷积过程。
- 整个卷积过程就是一个降维的过程,通过卷积核的不停移动计算,可以提取图像中最有用的特征。我们通常将卷积核计算得到的新的二维矩阵称为特征图。
- 如果每次计算的时候,边缘只被计算一次,而中间被多次计算,那么得到的特征图也会丢失边缘特征,最终会导致特征提取不准确,那为了解决这个问题,我们可以在原始的输入图像的二维矩阵周围再拓展一圈或者几圈,即Padding。Padding的作用主要是为了获取并卷积图像边缘部分的内容。
那如果情况再复杂一些呢?如果我们使用两个卷积核去提取一张彩色图片呢?彩色图片都是三个通道,也就是说一个彩色图片会有三个二维矩阵,以下仅以第一个通道的输出为示例,此时我们使用两组卷积核,每组卷积核都用来提取自己通道的二维矩阵的特征,那么这个过程可见下图:
激活函数(Activation Function)
作用:在卷积操作之后,通常会应用一个非线性激活函数(如 ReLU,Rectified Linear Unit)。
工作原理:激活函数引入了非线性,使得网络能够学习更复杂的模式,否则多层线性变换的组合仍然是线性的。
池化层(Pooling Layer)
- 作用:池化层通常跟在卷积层之后,用于降低特征图的维度(下采样),减少计算量,并提高模型的鲁棒性(对位置变化的容忍度)。
- 工作原理:最常见的池化操作是最大池化(Max Pooling)和平均池化(Average Pooling)。最大池化选择池化窗口内的最大值作为输出,平均池化则计算窗口内的平均值。
从以上可以看出卷积操作是有几个卷积核就有多少个特征图,现实中情况肯定更为复杂,也就会有更多的卷积核,那么就会有更多的特征图,当特征图非常多的时候,意味着我们得到的特征也非常多,但是这么多特征都是我们所需要的么?显然不是,其实有很多特征我们是不需要的,而这些多余的特征通常会给我们带来如下两个问题: 1. 过拟合 2.维度过高
当我们进行卷积操作后,再将得到的特征图进行特征提取,将其中最具有代表性的特征提取出来,可以起到减小过拟合和降低维度的作用,这个过程如下所示:
最大池化
- 最大池化就是每次取正方形中所有值的最大值,这个最大值也就相当于当前位置最具有代表性的特征。如上述这张图片就是最大池化
参数说明:
- ① kernel_size = 2:池化过程使用的正方形尺寸是2×2,如果是在卷积的过程中就说明卷积核的大小是2×2
- ② stride = 2:每次正方形移动两个位置(从左到右,从上到下),这个过程其实和卷积的操作过程一样
- ③ padding = 0:这个之前介绍过,如果此值为0,说明没有进行拓展
平均池化
- 平均池化就是取此正方形区域中所有值的平均值另外,需要注意计算平均池化时采用向上取整。如上述这张图片最上角的平均池化输出为( 1 + 0 + 4 + 6 )/ 4 = 2.75,向上取整,因此该方块平均池化后的输出为3。
- 特点:池化操作有助于提取最重要的特征,并使模型对输入的小幅平移保持不变性。
- 池化层的好处很多,将其优点总结如下: 1、在减少参数量的同时,还保留了原图像的原始特征 2、有效防止过拟合 3、为卷积神经网络带来平移不变性。
什么是平移不变性:以CV为例,无论你图片内的实际有用内容(实际有用内容不变的前提下,且背景先不考虑是有效的)怎么平移,我最终卷积出来的效果会是一致的,其特征模型能捕捉到。这样的话可以让模型去捕捉到这个特征的真正有用信息,而不是让模型去记住这个特征应该位于哪个位置。如下图所示:
可以看到,两张原始图片的位置有所不同,一个是正常的,另一个是人的脑袋稍稍左移了一些,经过卷积操作后,得到各自对应的特征图,这两张特征图也和原始图片的位置相对应,一个眼睛特征的位置是正常的,另一个眼睛特征的位置稍稍左移了一些,虽然人可以分辨,但是经过神经网络计算后,就可能带来误差,因为应该出现眼睛的位置并没有出现眼睛,那应该怎么办呢?此时使用池化层进行池化操作,可以发现,虽然池化之前两幅图片的眼睛特征不在一个位置,但是经过池化之后,眼睛特征的位置都是相同的,这就为后续神经网络的计算带来了方便,此性质就是池化的平移不变性。
全连接层(Fully Connected Layer)
- 作用:在经过多个卷积层和池化层提取高级特征后,这些特征会被展平(Flatten)并输入到全连接层。全连接层类似于传统神经网络的层,每个神经元都与前一层的所有神经元相连。
- 工作原理:全连接层负责将前面提取到的特征进行整合,并用于最终的分类或回归任务。
还是以上述这个卷积例子进行说明,现在我们已经通过卷积和池化提取到了这个人的眼睛、鼻子和嘴的特征,如果我想利用这些特征来识别这个图片是否是人的脑袋该怎么办呢?此时我们只需要将提取到的所有特征图进行“展平”,将其维度变为 ,这个过程就是全连接的过程,也就是说,此步我们将所有的特征都展开并进行运算,最后会得到一个概率值,这个概率值就是输入图片是否是人的概率,这个过程如下所示:
输出层(Output Layer)
- 作用:根据具体的任务(分类、回归等),输出层会使用相应的激活函数(如 softmax 用于多类别分类,sigmoid 用于二分类)来生成最终的预测结果
RNN
什么是RNN?
循环神经网络(RNN,Recurrent Neural Network)是一种专门设计用于处理序列数据的神经网络。与传统神经网络不同,RNN 具有“记忆”能力,能够捕捉序列中时间上的依赖关系,使其在处理文本、语音、视频等序列数据方面表现出色。
RNN的核心思想
RNN 的核心思想是循环连接和共享权重。
循环连接
- RNN 内部存在循环连接,允许信息从当前时间步传递到下一个时间步。这意味着网络对之前的输入有一个“记忆”,这个记忆以隐藏状态(Hidden State)的形式存在。在处理序列中的每个元素时,RNN 不仅考虑当前输入,还会结合之前时间步的隐藏状态。
共享权重
- 与卷积神经网络(CNN)中的权重共享类似,RNN 在不同时间步使用相同的权重和偏置。这大大减少了模型的参数数量,使得网络能够学习序列中模式的通用性,无论这些模式出现在序列的哪个位置。
RNN 的工作原理
想象一个传统的神经网络,它在处理完一个输入后就完成了计算。但对于序列数据,比如一句话,每个词的含义都可能受到前面词的影响。
RNN 通过以下方式解决这个问题:
1. 处理序列元素:RNN 会按顺序处理序列中的每个元素。
2. 更新隐藏状态:在处理每个元素时,RNN 会根据当前输入和上一个时间步的隐藏状态来计算新的隐藏状态。这个隐藏状态可以看作是网络对当前为止序列信息的“总结”或“记忆”。
3. 生成输出:新的隐藏状态可以用于生成当前时间步的输出,或者仅仅作为信息传递到下一个时间步。
RNN的结构图:
如上图所示,左边是CNN的工作动图,右边是RNN的工作动图。我们可以看到CNN和RNN的最大不同,就是在时间序列上“上一个时刻”的输出是否会作为当前输入的一部分,如果是就是RNN,如果不是就是CNN。
RNN 的主要挑战与改进
虽然 RNN 能够处理序列数据,但它存在一些局限性:
- 梯度消失与梯度爆炸(Vanishing/Exploding Gradients): 当序列很长时,在反向传播过程中,梯度可能会变得非常小(消失),导致网络无法学习到长期依赖关系;或者变得非常大(爆炸),导致训练不稳定。
- 长期依赖(Long-TermDependencies)问题:RNN的关键点之一就是他们可以用来连接先前的信息到当前的任务上,例如使用过去的视频段来推测对当前段的理解。如果RNN可以做到这个,他们就变得非常有用。但是真的可以么?答案是,还有很多依赖因素。
有时候,我们仅仅需要知道先前的信息来执行当前的任务。例如,我们有一个语言模型用来基于先前的词来预测下一个词。如果我们试着预测这句话中“the clouds are in the sky”最后的这个词“sky”,我们并不再需要其他的信息,因为很显然下一个词应该是sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN可以学会使用先前的信息。
但是同样会有一些更加复杂的场景。比如我们试着去预测“I grew up in France...I speak fluent French”最后的词“French”。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的“France”的上下文。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。不幸的是,在这个间隔不断增大时,RNN会丧失学习到连接如此远的信息的能力。
简而言之,就是从左向右的这个传递是可行的,但传递的这个过程会逐渐衰减,当你文本序列较长时,衰减越严重,而当你当前要输出的token与最前面的token密切关联时,此时就不能捕捉到信息,因为这种信息在长序列的传递过程中丢失了。换句话说, RNN 会受到短时记忆的影响。如果一条序列足够长,那它们将很难将信息从较早的时间步传送到后面的时间步。
因此,如果你正在尝试处理一段文本进行预测,RNN 可能从一开始就会遗漏重要信息。在反向传播期间(反向传播是一个很重要的核心议题,本质是通过不断缩小误差去更新权值,从而不断去修正拟合的函数),RNN 会面临梯度消失的问题。 因为梯度是用于更新神经网络的权重值(新的权值 = 旧权值 - 学习率*梯度),梯度会随着时间的推移不断下降减少,而当梯度值变得非常小时,就不会继续学习。即一开始没捕捉到重要特征,导致反向传播时未能告知模型学习方向的准确性,导致模型自以为自己现在捕捉到特征很好,但实际上这些特征并不是重要特征,因此在推理阶段会存在正确率低的问题。这就是梯度消失。
换言之,在递归神经网络中,获得小梯度更新的层会停止学习—— 那些通常是较早的层。 由于这些层不学习,RNN会忘记它在较长序列中以前看到的内容,因此RNN只具有短时记忆。
而梯度爆炸则是因为计算的难度越来越复杂导致。即你给的信息太有限了,要模型做出正确的回答,模型说我做不到啊,因此计算难度太大了,就发生了梯度爆炸。即你只给了模型螺丝刀和螺丝钉,但又要模型去造火箭,那就是梯度爆炸。那为什么RNN会出现这个问题,就比如说你现在给了一个空投包,这个空投包在逐渐向右传递的过程中已经被人拿完了,那这样的话最终的网络输出拿到的东西就非常有限,因此就出现了梯度爆炸。
LSTM
什么是LSTM?
长短期记忆网络(LSTM,Long Short-Term Memory)是一种特殊的循环神经网络(RNN),它旨在解决标准 RNN 在处理长序列数据时遇到的梯度消失和梯度爆炸问题,从而更好地捕捉和学习序列中的长期依赖关系。
为什么需要LSTM?
传统的 RNN 在处理较短的序列时表现良好,但当序列变得很长时,由于信息在时间步中传播的路径很长,反向传播的梯度会趋于消失(变得非常小)或爆炸(变得非常大)。梯度消失使得网络难以学习到距离较远的输入对当前输出的影响,即无法捕捉“长期记忆”。
LSTM 通过引入一个精巧的“门控”机制,有效地解决了这个问题,使其能够选择性地记住或遗忘信息,从而在长序列中保持关键信息。
LSTM 的核心:门控单元(Gating Mechanism)
LSTM 的核心在于其特殊的记忆单元(Cell State)和三个门(Gates)(输入门、遗忘门、输出门),这些门控单元负责控制信息流入、流出以及存储在记忆单元中的方式。
是细胞状态(记忆状态),
是输入的信息,
是隐藏状态(基于
得到的)
- 遗忘门(Forget Gate):
作用:决定从记忆单元中丢弃哪些信息。
工作原理:它接收上一个时间步的隐藏状态和当前时间步的输入,通过一个 Sigmoid 激活函数输出一个介于 0 到 1 之间的数值。0 表示完全遗忘,1 表示完全保留。
- 输入门:
作用:决定哪些新信息将存储到记忆单元中。
工作原理: 它也通过一个 Sigmoid 激活函数决定哪些信息需要更新。 同时,一个 Tanh 激活函数会创建一个新的候选记忆单元值,代表可能添加到记忆单元的新信息。这两部分结合起来,控制要添加到记忆单元的信息。
- 记忆单元(Cell State)& 更新记忆单元(Update Cell State):
记忆单元是 LSTM 的“传送带”,它贯穿整个链条,允许信息在整个序列中几乎不受干扰地传递。它携带了长期记忆,并且是唯一直接在整个网络中传递的组件。
门控单元通过加法和乘法操作,向记忆单元添加或移除信息,从而实现信息的选择性更新。
更新记忆单元(Update Cell State):
作用:根据遗忘门和输入门的决定,更新记忆单元(记忆单元上的 x 和 + 操作)。
工作原理:首先,将旧的记忆单元与遗忘门的输出相乘,丢弃掉不重要的信息。然后,将输入门的输出与新的候选记忆单元值相乘,并将结果加到旧的记忆单元上,从而添加新的信息。
- 输出门
作用:决定输出什么信息。
工作原理:它通过一个 Sigmoid 激活函数决定记忆单元的哪些部分将作为当前时间步的隐藏状态和输出。然后,将记忆单元通过 Tanh 激活函数,并与输出门的输出相乘,得到最终的隐藏状态。
LSTM 的优势
- 捕捉长期依赖:这是 LSTM 最主要的优势,它能够有效地学习和保留序列中远距离的信息,一定程度上解决了传统 RNN 的梯度消失问题。
- 缓解梯度消失:通过记忆单元和门控机制,信息可以直接在序列中传递,避免了梯度在反向传播过程中逐渐衰减。
总结:捋一下从左到右的过程,首先遗忘门会先根据当前输入和上一时刻的隐藏状态,来判断当前输入哪些是需要进行遗忘的并进行遗忘,随后基于上一时刻的记忆单元对当前保存的内容进行传递。而在输入门上会根据当前输入和上一时刻的隐藏状态,来判断当前有哪些内容我是新获得的并进行保存,随后是进行更新,将遗忘后保存的内容跟现在新添加的内容进行相加,并将结果作为下一时刻的细胞状态,来让下一刻的细胞知道目前已有什么内容。而在输出门上,会根据当前已进行遗忘和更新保留的内容和输入的信息来进行激活,来判断最终是输出什么信息。
细胞单元 是告知模型上一时刻我保留了什么内容,隐藏状态
是告知模型上一时刻我认为什么东西是有用的。保留的内容 != 输出的内容。