目录
Transformer中的自注意力机制(Q,K,V矩阵的作用)
多层前馈网络MLP的基本结构
1. 输入层
- 作用:接收外部的数据输入。
- 特点:不包含任何计算单元;它的“节点”数量取决于输入特征的数量。例如,如果我们的任务是基于图像分类,并且每张图片被表示为 784784 个像素值(28×2828×28 的灰度图),那么输入层将有 784784 个节点。
2. 隐藏层
- 作用:负责从输入数据中提取有用的特征并进行抽象表示。
- 特点:
- 每个隐藏层可以包含任意数量的神经元。
- 神经元通过加权和的方式处理来自上一层的信息,并应用激活函数来引入非线性。
- 可以有一个或多个隐藏层,具体取决于模型复杂度的需求。
3. 输出层
- 作用:生成最终的预测结果或分类标签。
- 特点:
- 对于二分类问题,通常只有一个输出节点,并使用如Sigmoid这样的激活函数来输出概率。
- 对于多分类问题,则会有与类别数相等的输出节点,并可能使用Softmax函数将这些节点的输出转换成一个概率分布。
连接权重与偏置
- 在MLP中,每个神经元都有两个重要的参数:权重(weights)和偏置(bias)。权重决定了前一层各个输入对当前神经元的影响程度;偏置则提供了额外的灵活性,使得即使所有输入都是零时,神经元也可以激活。
激活函数
- 为了使网络能够学习复杂的非线性关系,必须在每个神经元后面添加激活函数。常见的激活函数包括但不限于:
BP算法的基本原理
BP算法(Backpropagation Algorithm,误差逆传播算法)是训练人工神经网络最常用的算法之一。它通过反向传播误差来调整网络中的权重和偏置,从而最小化预测误差。BP算法的基本原理包括前向传播、损失计算、反向传播和参数更新四个主要步骤。下面我们将详细讲解这些步骤。
1. 前向传播
- 输入层:接收来自外部的数据输入。
- 隐藏层:每一层的每个神经元都会对从上一层接收到的信息进行加权求和,并加上偏置项后,再经过激活函数转换,产生该层的输出。
- 输出层:生成最终的结果或预测值。
假设我们有一个简单的多层感知机(MLP),其输入层有 d 个节点,隐层有 q个节点,输出层有 l 个节点。对于一个给定的样本 (xk,yk),其中 xk是输入特征向量,yk 是标签向量:
输入层到隐层:
其中 vih 是连接输入层第 i 个节点和隐层第 h 个节点的权重,γh 是隐层第 h 个节点的偏置,f 是激活函数。
隐层到输出层:
其中 whj 是连接隐层第 h 个节点和输出层第 j个节点的权重,θj是输出层第 j个节点的偏置。
2. 损失计算
使用损失函数衡量预测结果与实际标签之间的差异。常用的损失函数包括均方误差(MSE)、交叉熵等。例如,对于二分类问题,可以使用交叉熵损失函数:
3. 反向传播
根据链式法则计算损失相对于每个权重和偏置的梯度,然后沿着负梯度方向调整它们。具体来说,计算每个神经元的局部梯度(即误差项),用于后续的权重更新。
4. 参数更新
利用梯度下降法及其变体(如SGD, Adam等),根据损失函数相对于各参数的导数(即梯度)调整权重和偏置,目的是最小化损失函数。
- 更新公式为:
其中 η 是学习率,控制每次更新的步长。
总结
BP算法通过上述四个步骤实现了对神经网络的训练。在实际应用中,通常会重复执行这些步骤,直到模型收敛或达到预定的最大迭代次数。BP算法能够有效地训练深度神经网络,使得它们能够学习复杂的非线性映射关系,广泛应用于各种机器学习任务中,如图像识别、自然语言处理等。
局部极小值和全局极小值,如何跳出局部极小值
不同的初始参数
以多组不同参数值初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终参数.这相当于从多个不同的初始点开始搜索,这样就可能陷入不同的局部极小,从中进行选择有可能获得更接近全局最小的结果.
模拟退火
使用“模拟退火”(simulated annealing)技术[Aarts and Korst,1989]模拟退火在每一步都以一定的概率接受比当前解更差的结果,从而有助于“跳出”局部极小.在每步迭代过程中,接受“次优解”的概率要随着时间的推移而逐渐降低,从而保证算法稳定
随机扰动
使用随机梯度下降.与标准梯度下降法精确计算梯度不同,随机梯度下降法在计算梯度时加入了随机因素.于是,即便陷入局部极小点,它计算出的梯度仍可能不为零,这样就有机会跳出局部极小继续搜索
遗传算法
此外,遗传算法(genetic algorithms)[Goldberg,1989]也常用来训练神经网络以更好地逼近全局最小.需注意的是,上述用于跳出局部极小的技术大多是启发式,理论上尚缺乏保障
如何缓解过拟合
早停、正则化
卷积神经网络的基本概念
CNN其本质是一个多层感知机,成功的原因在于其所采用的局部连接和权值共享的方式:
- 一方面减少了权值的数量使得网络易于优化
- 另一方面降低了模型的复杂度,也就是减小了过拟合的风险。
- 特别适用于图像识别任务,能够自动提取图像特征,具有良好的鲁棒性和运算效率。
1. 局部连接
传统多层感知机:在标准的MLP中,每一层中的每个神经元都与前一层的所有神经元相连。对于图像数据,这意味着每一个像素点都会影响到下一层的每一个神经元,这不仅导致了巨大的参数量,也使得模型难以捕捉图像中的局部特征。
卷积神经网络:相比之下,CNN采用了局部连接的方式。每个神经元只与输入数据的一个局部区域(称为感受野,receptive field)相连。例如,在一个2D图像上,一个神经元可能只与3x3或5x5的小窗口内的像素相连。这种局部连接模拟了生物视觉系统的工作方式,即每个神经元只对视网膜上的一个小区域敏感。通过这种方式,CNN能够更有效地捕捉图像中的局部特征,如边缘、线条和纹理。
2. 权值共享
传统多层感知机:在MLP中,每一层的权重矩阵是独立的,这意味着即使处理相同类型的特征,不同位置的权重也会有所不同。这样的设计虽然灵活,但也容易导致过拟合,并且需要更多的训练数据来学习这些不同的权重。
卷积神经网络:CNN通过权值共享解决了这个问题。在同一个卷积层中,所有用于检测特定特征的滤波器(卷积核)在整个输入空间中共享相同的权重。例如,如果一个滤波器用于检测水平边缘,那么无论这个边缘出现在图像的哪个位置,CNN都将使用同一组权重进行检测。这样不仅减少了模型的参数数量,还使得模型能够以一种平移不变的方式识别特征,即无论特征出现在图像的哪个部分,CNN都能识别出来。
卷积和下采样的概念和方法
卷积(Convolution)
卷积是一种数学运算,用于提取输入数据的特征。在CNN中,卷积通过应用一个或多个滤波器(也称作卷积核或内核)来检测输入数据中的特定模式,如边缘、线条或纹理。每个滤波器都是一个小矩阵,其尺寸通常为3x3或5x5等,并且这些滤波器在整个输入上滑动(即进行卷积操作),以生成新的特征映射(Feature Map)。
方法:
滤波器(Kernel/Filter):
- 每个滤波器是一个小矩阵,它与输入数据的局部区域(感受野)进行点乘操作,然后将结果相加,得到一个新的值。
步长(Stride):
- 步长是指滤波器每次移动的像素数量。例如,步长为1意味着滤波器每次移动一个像素;步长为2则表示每次移动两个像素。较大的步长可以减少输出特征映射的尺寸。
填充(Padding):
- 填充是在输入数据的边界添加额外的零值(或其他值),以便保持输出特征映射的尺寸不变,或者控制其减小的程度。无填充(valid padding)会导致输出尺寸减小,而全填充(same padding)则保持输出尺寸不变。
激活函数:
- 在卷积操作后,通常会应用一个非线性激活函数(如ReLU),以引入非线性特性,使模型能够捕捉更复杂的模式。
多通道输入:
- 对于彩色图像,输入通常是三维的(宽度、高度、颜色通道)。在这种情况下,每个滤波器也有相应的深度维度,并对所有通道进行卷积操作,最后将结果相加以生成单个特征映射。
多滤波器:
- 为了捕捉多种类型的特征,通常会使用多个滤波器,每个滤波器生成一个特征映射。这些特征映射共同构成了该层的输出。
下采样(Pooling)
概念: 下采样,通常也被称为池化,是一种减少特征映射空间尺寸的技术。它通过聚合一组相邻元素(如最大值、平均值)来降低数据的分辨率,从而减少参数数量并防止过拟合。同时,下采样有助于保留最重要的信息,如物体的关键特征。
方法:
最大池化(Max Pooling):
- 最常用的方法之一,它选择每个窗口内的最大值作为代表。这有助于捕捉最显著的特征,如边缘或角点。
平均池化(Average Pooling):
- 计算每个窗口内元素的平均值。这种方法较为平滑,但可能会丢失一些细节信息。
步长(Stride):
- 类似于卷积中的步长,指池化窗口每次移动的像素数量。通常,池化窗口的尺寸等于步长,以避免重叠。
窗口大小(Window Size):
- 指定池化操作的范围,如2x2窗口。较小的窗口可以保留更多细节,而较大的窗口则提供更强的空间降维效果。
总结
- 卷积:用于提取输入数据的特征,通过滑动滤波器在输入上进行局部连接,产生特征映射,并通过激活函数引入非线性。
- 下采样(池化):用于减少特征映射的空间尺寸,通过聚合相邻元素来降低计算复杂度,并帮助模型专注于更重要的特征。
- 卷积操作允许模型从原始数据中提取有意义的信息,而下采样操作则确保了这些信息不会过于冗余,同时也增强了模型的泛化能力。
循环网络的基本结构
梯度消失和梯度爆炸产生的原因
梯度消失问题
梯度消失和梯度爆炸是深度学习训练过程中常见的问题,特别是在处理深层网络时。它们主要发生在反向传播算法(Backpropagation)中,影响了模型的学习效率和效果。以下是这两种现象产生的原因:
梯度消失 (Vanishing Gradient)
产生原因
激活函数的性质:
- 饱和区:某些激活函数(如Sigmoid、Tanh)在输入较大或较小时会进入饱和区,此时导数值接近于零。当这些激活函数用于深层网络时,梯度通过多层传递后会被不断缩小,最终变得非常小。
权重初始化不当:
- 如果初始权重值过大或过小,会导致前向传播中的激活值迅速增大或减小,进而使反向传播中的梯度也相应地变得极小。
长依赖关系:
- 在处理序列数据时,如果时间步之间的间隔很大,那么远距离的时间步之间的信息传递就会变得非常困难,导致梯度消失。
链式法则的影响:
- 反向传播本质上是链式法则的应用,对于深层网络来说,这意味着多个导数相乘。如果每个导数都小于1,那么多次相乘后的结果将趋向于零。
梯度爆炸 (Exploding Gradient)
产生原因
激活函数的性质:
- 非饱和区:虽然某些激活函数(如ReLU及其变体)不会导致梯度消失,但在特定情况下可能会导致梯度过大,特别是当输入值较大时。
权重初始化不当:
- 初始权重值过大可能导致前向传播中的激活值迅速增长,从而使反向传播中的梯度也变得非常大。
长依赖关系:
- 类似于梯度消失的问题,在处理长序列数据时,如果时间步之间的间隔很大,且没有适当的机制来控制梯度,那么梯度可能会累积得非常大。
链式法则的影响:
- 当使用链式法则进行反向传播时,如果每层的导数都大于1,那么多次相乘后的结果将迅速增大,导致梯度爆炸。
什么是RNN的梯度爆炸和梯度消失
由于RNN中的上下文参数矩阵是权重共享的,即当进行梯度更新时,对该矩阵求偏导数时需要加入时序影响,将导致存在基于时序数量的权重“连乘”。若某一阶段权重值过小,结合“连乘”将导致最终权重趋于“无穷小”(即等于0),此现象称为“梯度消失”。相反地,若权重值过大,经连乘后将导致权重值变得过大,称为“梯度爆炸”。
与普通NN的梯度消失及梯度爆炸不同,RNN的梯度爆炸(或消失)是根本原因是“连乘”,是在反向传播的某一阶段出现的,在此之前的反向传播不受影响。
理解:为什么说“在此之前的反向传播不受影响”
关键在于RNN中梯度消失或爆炸的根本原因是梯度连乘,而不是简单的逐层梯度衰减。在前馈神经网络中,梯度是逐层传递的,每一层的梯度只取决于直接相邻的上下层。但在RNN中,同一个权重矩阵被应用于所有时间步,所以梯度是在时间维度上连乘的。
这意味着,直到某个时间点t处开始出现梯度消失或爆炸现象之前,更近期的时间步(比如 t+1,t+2,...t+1,t+2,...)的梯度计算不会受到前面时间步的影响,因为它们的梯度尚未经历足够的连乘以显著变化。换句话说,只有当梯度经过足够多的时间步连乘后,才会明显表现出消失或爆炸的问题。
LSTM的结构,三个门的作用
遗忘门 (Forget Gate):
- 作用:决定哪些信息应该被丢弃。
- 公式:
- 解释:这里 ft是遗忘门的输出,σ 表示 Sigmoid 激活函数,Wf 和 bf 分别是权重矩阵和偏置项,ht−1,xt 表示前一时刻的隐藏状态和当前时刻的输入。Sigmoid 函数将输出压缩到 (0, 1) 之间,表示每个部分需要保留的信息比例。接近 0 的值意味着“忘记”该信息,而接近 1 的值则表示“记住”。
输入门 (Input Gate):
- 作用:确定哪些新信息应该被添加到记忆单元中。
- 公式:
- 解释:首先计算输入门 it,它决定了要更新的记忆内容;接着计算候选记忆值 ct,这是可能要加入记忆单元的新信息;最后,根据遗忘门和输入门的结果更新记忆单元 ct。
输出门 (Output Gate):
- 作用:确定记忆单元的状态有多少应该输出。
- 公式:
ot=σ(Wo⋅[ht−1,xt]+bo)ot=σ(Wo⋅[ht−1,xt]+bo)
ht=ot∗tanh(ct)ht=ot∗tanh(ct)
- 解释:输出门 ot 决定了要输出的记忆单元状态的部分。然后使用 tanh 函数对记忆单元的状态进行标准化,再与输出门相乘得到最终的隐藏状态 ht。
循环网络模型解决翻译问题的弊端
1. 翻译结果定长
- 问题:传统的RNN模型通常假设输出序列的长度是固定的。
- 影响:这可能导致生成的翻译结果在长度上不灵活,无法适应不同长度的输入或输出序列。
2. 要求词表一致
- 问题:RNN模型通常需要源语言和目标语言的词表保持一致。
- 影响:这限制了模型的灵活性,尤其是在处理不同语言之间的词汇差异时。例如,某些语言可能有更多的词汇或更复杂的语法结构。
3. 没充分使用全局语义信息
- 问题:RNN模型在处理长序列时,难以捕捉全局语义信息。
- 影响:
- 梯度消失/爆炸问题:在处理长序列时,梯度可能会消失或爆炸,导致模型难以学习长期依赖关系。
- 局部依赖性:RNN模型更多地依赖于局部上下文信息,而忽略了全局语义信息,这可能导致翻译结果不够准确或自然。
注意力机制的基本概念和方法
基本概念
- 选择性聚焦:注意力机制的核心在于为输入的不同部分分配不同的权重,从而使得模型可以“关注”那些对当前任务最为重要的部分。
- 上下文向量:
- 编码器输出:对于编码器-解码器架构,编码器会将输入序列转换成一个或多个上下文向量,这些向量包含了整个输入序列的信息。
- 解码器利用:解码器在生成输出时使用这些上下文向量来决定哪些输入部分应该被更多地考虑。
- 权重计算:
- 相似度得分:为了确定每个输入部分的重要性,模型会计算查询(Query)与键(Key)之间的相似度得分。这个过程通常涉及点积、缩放点积等操作。
- 概率分布:通过 Softmax 函数将相似度得分转换为概率分布,确保所有权重之和为1,并且每个权重都在 [0, 1] 区间内。
- 加权求和
- 最后,模型根据上述概率分布对值(Value)进行加权求和,得到最终的上下文向量,该向量用于指导解码器生成下一个输出词。
方法
单头注意力(Single-Head Attention)
- 基本形式:这是最简单的注意力机制版本,其中只有一个注意力头。查询、键和值经过线性变换后直接参与注意力计算。
多头注意力(Multi-Head Attention)
- 多视图捕捉:多头注意力扩展了单头的概念,通过将查询、键和值分别投影到多个子空间(头),每个头独立地计算注意力分布,然后将结果拼接起来并再次进行线性变换。
- 优势:这种方法可以同时捕捉输入和输出之间不同类型的关联模式,提高了模型的表现力。
自注意力(Self-Attention)
- 内部依赖建模:自注意力应用于同一序列内的所有位置,使每个位置都能参考其他位置的信息。这有助于捕捉长距离依赖关系,尤其适用于自然语言处理任务。
- Transformer 模型的基础:自注意力是 Transformer 架构的关键组件之一,它取代了传统的循环神经网络(RNN)和卷积神经网络(CNN),成为处理序列数据的新标准。
交叉注意力(Cross Attention)
- 跨序列依赖:交叉注意力用于连接编码器和解码器,在解码过程中让解码器能够参考编码器的所有输入。这对于序列到序列的任务非常重要,因为它确保了解码器可以根据完整的上下文信息进行预测。
Transformer中的自注意力机制(Q,K,V矩阵的作用)
在 Transformer 模型中,自注意力机制(Self-Attention Mechanism)是其核心组件之一,它允许模型在处理序列数据时能够关注输入序列中的不同部分。自注意力通过查询(Query, Q)、键(Key, K)和值(Value, V)三个矩阵来实现这一功能。下面详细讲解这三个矩阵的作用及其工作原理。
自注意力机制的工作流程
1. 输入表示
假设我们有一个输入序列 X={x1,x2,...,xn},每个 xi 是一个词向量或特征向量,代表输入序列中的一个元素(如单词)。在 Transformer 中,这些输入向量首先会被传递给一系列线性变换,以生成对应的查询、键和值矩阵。
2. 查询、键和值的计算
对于每个输入位置 i,我们分别计算它的查询 Qi、键 Ki 和值 Vi
- 查询(Q):用于表达当前元素想要寻找的信息类型。它就像是问:“我需要什么样的信息?”
- 键(K):用于表达每个元素可以提供什么信息。它回答了:“我能提供什么样的信息?”
- 值(V):实际包含的信息内容。如果某个元素被选中,那么就从它的值矩阵中提取出具体的信息。
3. 计算注意力分数
接下来,我们计算查询与所有键之间的相似度得分,这决定了每个元素之间的重要性程度。最常用的计算方法是点积注意力(Dot-Product Attention)
4. 应用 Softmax 函数
然后我们将上述得分通过 Softmax 函数转换为概率分布,这样做的目的是确保所有权重之和为1,并且每个权重都在 [0, 1] 区间内,反映了每个输入元素相对于当前查询的重要性。
5. 加权求和得到上下文向量
最后,我们将注意力权重应用于值矩阵,进行加权求和,从而得到最终的上下文向量(Context Vector)这个上下文向量综合了所有输入元素的信息,但更加强调那些对当前查询更重要的部分。
多头自注意力(Multi-Head Self-Attention)
为了捕捉输入序列中不同类型的关联模式,Transformer 使用了多头自注意力机制。这意味着查询、键和值会被投影到多个不同的子空间(头),每个头独立地执行上述的自注意力计算过程。之后,所有头的结果会被拼接在一起并通过另一个线性变换合并,形成最终的输出。
总结
在 Transformer 的自注意力机制中,查询、键和值矩阵分别扮演着不同的角色:查询定义了搜索的方向;键提供了可供匹配的信息;而值则包含了实际要提取的内容。通过这种方式,自注意力机制能够灵活地选择性聚焦于输入序列的不同部分,从而极大地提高了模型处理复杂任务的能力。
Transformer中编码器-解码器结构工作基本流程
- 编码端: 经过词向量层(Input Embedding)和位置编码层(Positional Encoding),得到最终输入,流经自注意力层(Multi-Head Attention)、残差和层归一化(Add&Norm)、前馈神经网络层(Feed Forward)、残差和层归一化(Add&Norm),得到编码端的输出(后续会和解码端进行交互)。
- 解码端: 经过词向量层(Output Embedding)和位置编码层 (Positional Encoding),得到最终输入,流经掩码自注意力层(Masked Multi-Head Attention,把当前词之后的词全部 mask掉)、残差和层归一化(Add&Norm)、交互注意力层 (Multi-Head Attention,把编码端的输出和解码端的信息进行交互,Q矩阵来自解码端,K、V矩阵来自编码端的输出)、残 差和层归一化(Add&Norm)、前馈神经网络层(Feed Forward)、残差和层归一化(Add&Norm),得到解码端的输出。
- 注:编码端和解码端的输入不一定相等
- 为什么需要在input Embedding加入位置编码?
Transformer使用的是自注意力机制来提取信息,一个句子中的每个字/词是并行计算,虽然处理每个字的时候考虑到了所有字对其的影响,但是并没有考虑到各个字相互之间的位置信息,也就是上下文。所以需要引入位置信息