序列模型和注意力机制

server/2025/2/12 7:57:19/

序列模型和注意力机制

  1. Seq2Seq模型主要用于处理输入序列到输出序列的映射问题,常用于机器翻译、语音识别等。主要由**编码器(Encoder)解码器(Decoder)**构成。

    编码器输入序列后生成一个固定长度的向量表示隐藏状态,通常采用RNN结构。输入序列的每个单词 x < t > x^{<t>} x<t> 并更新隐藏状态,最终隐藏状态 h < T x > h^{<T_x>} h<Tx> 作为输入序列的语义表示,传递给解码器。

    h < t > = f ( W h ⋅ h < t − 1 > + W x ⋅ x < t > ) h^{<t>} = f(W_h \cdot h^{<t-1>} + W_x \cdot x^{<t>}) h<t>=f(Whh<t1>+Wxx<t>)

    解码器以编码器的输出作为输入,逐步生成输出序列,通常采用RNN结构。初始状态 s < 0 > s^{<0>} s<0> 由编码器的最终隐藏状态提供,逐步生成目标句子 y < t > y^{<t>} y<t> ,并将其作为输入传给下一步,直到生成句子结束标记(EOS),解码停止。

    s < 0 > = h < T x > s < t > = f ( W s ⋅ s < t − 1 > + W y ⋅ y < t − 1 > ) s^{<0>} = h^{<T_x>} \\ s^{<t>} = f(W_s \cdot s^{<t-1>} + W_y \cdot y^{<t-1>}) s<0>=h<Tx>s<t>=f(Wss<t1>+Wyy<t1>)

    **图像描述生成(Image to Sequence)**问题,即输入一张图片,输出对应的文本描述,也可以采用类似架构。在编码部分,采用CNN提取图像特征,获取高维向量,在解码部分,采用RNN生成文本,每次输出一个单词,直到生成完整描述。

  2. 机器翻译和语言模型在结构上类似,但是存在一些区别:

    语言模型机器翻译
    输入仅依赖前面的单词,逐步生成句子完整的输入句子为条件,生成目标语言句子
    输出生成概率最高的单个语言序列生成目标语言序列,其概率依赖于输入句子
    模型结构单个RNN,仅依赖前面生成的词编码器+解码器结构
    起始状态以零向量(或随机噪声)作为初始输入编码器生成的隐藏状态作为初始输入
    概率估计计算 P ( y 1 , y 2 , . . . , y T ) P(y_1, y_2, ..., y_T) P(y1,y2,...,yT)计算 P ( y 1 , y 2 , . . . , y T ∣ X ) P(y_1, y_2, ..., y_T | X) P(y1,y2,...,yTX)
    搜索策略直接采样或贪心搜索使用集束搜索来找到最佳翻译

    总的来说,机器翻译模型是条件语言模型,输出序列是基于输入序列的,而不是随机文本生成。

    要找到最优的 y y y 使得 P ( y 1 , … , y T ∣ X ) P(y_1,…,y_T|X) P(y1,,yTX) 概率最大,但是由于可能的 y y y 组合数过多,无法遍历所有情况,所以需要搜索算法来找到近似最优解

    一种方法是采用贪心搜索,每次只选择概率最高的单词,并逐步生成句子。但是局部最优可能导致错过全局最优解,导致翻译冗长、不准确(如 "Jane is going to be visiting Africa in September.”),并且由于前面的选择影响后续单词选择,错误会持续累积。

    时间步候选单词(概率)选择的单词
    y 1 y_1 y1“Jane” (0.8), “She” (0.2)"Jane”
    y 2 y_2 y2“is” (0.7), “was” (0.3)"is”
    y 3 y_3 y3“going” (0.6), “visiting” (0.4)"going”

    另一种方法是集束搜索在每个时间步保留 B B B 个最有可能的句子候选,而不是只选择一个单词。首先选择前 B B B 个最高概率的初始单词。对于每个初始单词,继续扩展,计算下一个时间步所有可能的 y 2 y_2 y2 ,然后与前面的选择的 y 1 y_1 y1 进行组合:

    P ( y 1 , y 2 ∣ X ) = P ( y 1 ∣ X ) × P ( y 2 ∣ y 1 , X ) P(y_1,y_2|X)=P(y_1|X) \times P(y_2|y_1,X) P(y1,y2X)=P(y1X)×P(y2y1,X)

    选择概率最高的 B B B 个候选序列。重复直到遇到结束标记(EOS)或达到最大句子长度,然后选择整体概率最高的翻译句子。以集束宽度等于3为例:

    时间步候选序列(按概率排序)
    t 1 t_1 t1“Jane” (0.8), “She” (0.6), “It” (0.4)
    t 2 t_2 t2“Jane is” (0.7), “Jane was” (0.5), “She is” (0.4)
    t 3 t_3 t3“Jane is visiting” (0.6), “Jane is going” (0.55), “She is visiting” (0.5)

    如果 B B B 取值过小,可能找不到最佳翻译,如果 B B B 取值过大,计算复杂度上升,翻译速度降低。在实际应用中,可以取 B = 10 B=10 B=10 ,但在学术研究中,可能使用 B = 1000 B = 1000 B=1000 B = 3000 B = 3000 B=3000 以获取最佳性能。

  3. 在集束搜索中,我们希望最大化:

    P ( y ∣ x ) = P ( y 1 , y 2 , . . . , y T ∣ x ) P(y | x) = P(y_1, y_2, ..., y_T | x) P(yx)=P(y1,y2,...,yTx)

    但直接最大化乘积存在数值下溢的问题,即由于概率值通常远小于 1,多个概率相乘会得到极小的数值,导致浮点数精度损失。为避免数值下溢,我们取对数概率

    log ⁡ P ( y ∣ x ) = ∑ t = 1 T log ⁡ P ( y t ∣ y 1 , . . . , y t − 1 , x ) \log P(y | x) = \sum_{t=1}^{T} \log P(y_t | y_1, ..., y_{t-1}, x) logP(yx)=t=1TlogP(yty1,...,yt1,x)

    由于对数函数是单调递增的,最大化 log ⁡ P ( y ∣ x ) \log P(y | x) logP(yx) 和最大化 P ( y ∣ x ) P(y | x) P(yx) 是等价的,这样可以确保计算稳定性,减少数值舍入误差

  4. 因为 P ( y ∣ x ) P(y | x) P(yx) 是多个概率相乘,句子越长,最终概率值越小。这导致短句更容易被选为最佳翻译,而忽略较长但合理的句子,即原始目标函数偏向于短句

    可以采用归一化方法,通过对数概率除以句子长度 T y T_y Ty降低对长句的惩罚,提升长句生成的可能性。

    1 T y ∑ t = 1 T y log ⁡ P ( y t ∣ y 1 , . . . , y t − 1 , x ) \frac{1}{T_y} \sum_{t=1}^{T_y} \log P(y_t | y_1, ..., y_{t-1}, x) Ty1t=1TylogP(yty1,...,yt1,x)

    在实际应用中,可以使用指数调整进行更柔和的归一化:

    1 T y a ∑ t = 1 T y log ⁡ P ( y t ∣ y 1 , . . . , y t − 1 , x ) \frac{1}{T_y^a} \sum_{t=1}^{T_y} \log P(y_t | y_1, ..., y_{t-1}, x) Tya1t=1TylogP(yty1,...,yt1,x)

    a = 1 a = 1 a=1 表示完全归一化, a = 0 a = 0 a=0 表示无归一化, a ∈ ( 0 , 1 ) a \in (0,1) a(0,1) 表示介于两者之间,最常用 a ≈ 0.7 a \approx 0.7 a0.7 。当然,超参数 a a a 需通过实验调整,以获得最优翻译质量。

  5. 在集束搜索过程中,可以保留多个不同长度的候选翻译。运行集束搜索 30 步,生成长度 1~30 的多个句子。计算每个句子的归一化对数似然值,选择得分最高的句子作为最终翻译。归一化的对数似然目标函数:

    1 T y a ∑ t = 1 T y log ⁡ P ( y t ∣ y 1 , . . . , y t − 1 , x ) \frac{1}{T_y^a} \sum_{t=1}^{T_y} \log P(y_t | y_1, ..., y_{t-1}, x) Tya1t=1TylogP(yty1,...,yt1,x)

  6. 集束搜索是一种近似搜索算法,并不保证能找到全局最优解。它可能会选择非最优的目标序列,那么就需要进行误差分析。需要判断误差是集束搜索算法造成的,还是Seq2Seq模型造成的,来帮助决定是否应该增大束宽,或者优化 RNN 模型。

    假设有一个法语句子 “Jane visite l’Afrique en septembre.” ,人工翻译结果为 “Jane visits Africa in September.” ,集束搜索翻译结果为 “Jane visited Africa last September.”。现在,需要计算正确翻译的概率 P ( y ∗ ∣ x ) P(y^* | x) P(yx)错误翻译的概率 P ( y ^ ∣ x ) P(\hat{y} | x) P(y^x) ,通过比较这两个概率的大小确定错误来源。

    如果 ∗ P ( y ∗ ∣ x ) > P ( y ^ ∣ x ) *P(y^ * | x) > P(\hat{y} | x) P(yx)>P(y^x) ,*说明 RNN 认为 y ∗ y^* y 是更好的翻译,但集束搜索算法没有找到它。集束搜索本应找到概率最高的句子,但它错误地选择了 y ^ \hat{y} y^ ,说明集束搜索算法没有有效地搜索到最优解。需要增大束宽 B B B ,或者调整集束搜索的目标函数(如使用更好的长度归一化)。

    如果 P ( y ∗ ∣ x ) < P ( y ^ ∣ x ) P(y^* | x) < P(\hat{y} | x) P(yx)<P(y^x) ,说明 RNN 认为 y ^ \hat{y} y^ 更有可能,即 RNN 计算的条件概率导致错误翻译,这表明 RNN 模型本身需要改进,而不是集束搜索的问题。可以考虑增加训练数据(尤其是高质量的标注数据)、使用更好的正则化、尝试不同的网络结构、调整超参数来改善。

  7. 在机器翻译任务中,一个输入句子可能有多个正确的翻译,不能简单用准确率进行评估。需要一个能够衡量机器翻译结果与人工翻译参考之间的相似性的指标。BLEU得分提供了一种自动化评估方法,能快速衡量机器翻译的质量。

    BLEU得分主要衡量机器翻译结果中的词(unigrams) 是否出现在参考翻译中,以及二元词组(bigrams)、三元词组(trigrams)、四元词组(4-grams) 是否出现在参考翻译中。同时惩罚过短的翻译,避免机器翻译输出过短的句子以获得高精确度。

    假定有两个人工翻译参考:

    The cat is on the mat
    There is a cat on the mat
    

    BLEU评分需要计算改良的精确度,统计机器翻译输出的单词在人工参考中出现的比例,但如果一个单词过度重复出现,则需要设置上限

    假设有机器翻译:

    The the the the the the the
    

    机器翻译输出了7个单词,每个the在人工翻译中都存在,那么错误的精确度为:

    P = 7 7 = 1.0 P = \frac{7}{7} = 1.0 P=77=1.0

    需要截取计数,即设定单词的出现次数上限。在人工翻译1中,”the” 出现2次,在人工翻译2中, ”the” 出现1次,取最大值2作为 ”the” 词数的上限,因此精确度为:

    P = 2 7 = 0.285 P = \frac{2}{7} = 0.285 P=72=0.285

    BLEU评分不仅计算单个单词,还需要计算更长的**词组匹配(n-gram)**情况:

    假设有机器翻译:

    The cat the cat on the mat
    

    可以抽取机器翻译输出中的二元词组:

    The cat, cat the, the cat, cat on, on the, the mat1        0        1        1      1        1
    

    在人工翻译参考中计算匹配情况,并计算最终二元词组的BLEU评分:

    P 2 = 4 6 = 0.667 P_2 = \frac{4}{6} = 0.667 P2=64=0.667

    最终的BLEU评分会结合多个n-gram精确度:

    B L E U = BP × exp ⁡ ( 1 4 ∑ n = 1 4 log ⁡ P n ) BLEU = \text{BP} \times \exp \left( \frac{1}{4} \sum\limits_{n=1}^{4} \log P_n \right) BLEU=BP×exp(41n=14logPn)

    其中, P n P_n Pn 是 n 元词组精确度,BP(Brevity Penalty,简短惩罚)避免机器翻译系统输出过短的句子(因为短句更容易与人工翻译匹配)。

    若机器翻译句子长度 T c T_c Tc 短于参考翻译 T r T_r Tr ,则:

    B P = e 1 − T r / T c BP = e^{1 - T_r / T_c} BP=e1Tr/Tc

    否则 B P = 1 BP = 1 BP=1(不做惩罚)。

    总的来说,BLEU评分提供了一种自动化评估方法,无需人工逐句打分。也提供了单一数值指标,方便比较不同的翻译模型。被广泛应用于机器翻译、图像字幕生成等任务。

    但是BLEU评分也相应的具有一定的局限性,比如不能衡量句子语法是否正确,仅仅统计 n-gram 词组的匹配情况。也不能衡量语义相似性,如 ****“The cat is on the mat.” 和 “A feline is resting on a rug.” 这两个句子语义完全一样,但 BLEU 评分会很低。也不能处理自由度较高的文本生成任务(如对话系统)。

  8. 传统的Seq2Seq模型采用编码器-解码器架构,容易遇到信息瓶颈。因为编码器需要将整个输入句子压缩成一个固定长度的上下文向量,这会导致长句子的信息严重损失。同时,随着句子长度持续增加,BLEU得分会迅速下降。

    而人类翻译时会逐步阅读并翻译,而不是一次性记住整个句子。因此,引入注意力机制,让RNN在每一步生成目标语言单词时,动态关注输入序列的不同部分

    例如,在翻译 “Jane visite l’Afrique en Septembre” 时,生成 “Jane” 时关注 “Jane”,生成 “visits” 时关注 “visite”。注意力机制可以避免信息瓶颈,不用强制将整个句子压缩为一个向量。并且长句翻译质量提高,因为可以动态调整关注区域。

    编码器(Encoder)解码器(Decoder)
    传统 Seq2Seq用 RNN(LSTM/GRU)处理输入序列,最终输出一个固定向量 C C C 作为整个句子的表示直接基于 C C C 生成整个目标序列
    注意力模型计算输入序列的每个时间步的隐藏状态 h ( t ) h^{(t)} h(t) ,保留所有时间步的信息在生成每个单词时,动态计算注意力权重,决定关注输入序列的哪些部分

    注意力机制的工作流程:

    1. 编码输入序列

      使用双向 RNN 计算输入句子的隐藏状态,其中 h ( t ) h^{(t)} h(t) 是输入序列中第 t t t 个单词的特征表示。

      h ( t ) = Bi-RNN ( x ( t ) , h ( t − 1 ) ) h^{(t)} = \text{Bi-RNN}(x^{(t)}, h^{(t-1)}) h(t)=Bi-RNN(x(t),h(t1))

    2. 计算注意力权重

      在解码器生成每个单词 y ( t ) y^{(t)} y(t) 时,计算对输入序列每个单词的关注度。注意力权重 a ( t , t ′ ) a^{(t,t')} a(t,t) 表示生成 y ( t ) y^{(t)} y(t) 时,应该关注 x ( t ′ ) x^{(t')} x(t) 的程度。

      e ( t , t ′ ) = score ( s ( t − 1 ) , h ( t ′ ) ) e^{(t,t')} = \text{score}(s^{(t-1)}, h^{(t')}) e(t,t)=score(s(t1),h(t))

      其中, s ( t − 1 ) s^{(t-1)} s(t1) 表示解码器上一步的隐藏状态, h ( t ′ ) h^{(t')} h(t) 表示输入句子中第 t ′ t' t 个单词的隐藏状态。然后进行 softmax 归一化,确保所有注意力权重之和为 1

      a ( t , t ′ ) = exp ⁡ ( e ( t , t ′ ) ) ∑ t ′ ′ exp ⁡ ( e ( t , t ′ ′ ) ) a^{(t,t')} = \frac{\exp(e^{(t,t')})}{\sum_{t''} \exp(e^{(t,t'')})} a(t,t)=t′′exp(e(t,t′′))exp(e(t,t))

      通过可视化注意力权重,可以查看模型在翻译每个单词时关注了哪些部分。

      https://cdn.acwing.com/media/article/image/2025/02/11/181746_df63aa0ae8-visualization.png

    3. 计算上下文向量

      通过注意力权重计算上下文向量 C ( t ) C^{(t)} C(t)

      C ( t ) = ∑ t ′ a ( t , t ′ ) h ( t ′ ) C^{(t)} = \sum_{t'} a^{(t,t')} h^{(t')} C(t)=ta(t,t)h(t)

      其中, C ( t ) C^{(t)} C(t) 是对输入序列的加权平均,表示当前解码器应该关注的内容。上下文向量本质上是输入句子中某些特征的加权和,权重由注意力机制确定。

    4. 解码生成目标单词

      解码器使用上下文向量 C ( t ) C^{(t)} C(t) 计算当前隐藏状态 s ( t ) s^{(t)} s(t)

      s ( t ) = RNN ( y ( t − 1 ) , s ( t − 1 ) , C ( t ) ) s^{(t)} = \text{RNN}(y^{(t-1)}, s^{(t-1)}, C^{(t)}) s(t)=RNN(y(t1),s(t1),C(t))

      其中 y ( t − 1 ) y^{(t-1)} y(t1) 是上一步生成的目标单词。最后计算输出概率,选择概率最高的单词作为输出:

      P ( y ( t ) ∣ y ( 1 ) , . . . , y ( t − 1 ) , x ) = softmax ( W o s ( t ) ) P(y^{(t)} | y^{(1)}, ..., y^{(t-1)}, x) = \text{softmax}(W_o s^{(t)}) P(y(t)y(1),...,y(t1),x)=softmax(Wos(t))

    注意力机制的计算复杂度为 O ( T x × T y ) O(T_x \times T_y) O(Tx×Ty) ,其中 T x T_x Tx 是输入序列的长度, T y T_y Ty 是输出序列的长度。由于每个输入与每个输出的每一对都会计算权重,因此计算量是三次方级别的。对于机器翻译任务,输入和输出句子的长度通常不会太长,所以这种复杂度是可以接受的。

  9. 传统的语音识别依赖于音位来分解音频。音位是构成语音的基本单元,如“the”包含“th”和“e”音,“quick"包含"k”、“w”、"i"等音。而基于Seq2Seq的语音识别不再依赖音位,而是直接通过输入音频序列端到端的生成对应的文本序列。

    首先需要对音频数据进行预处理。原始音频信号中音频片段表示为气压的变化,横轴是时间,纵轴是气压的变化。可以通过频率-时间分析,将音频信号转换为声谱图,其中横轴为时间,纵轴为频率,图中的颜色表示不同时间点和频率的能量大小。声谱图能够帮助模型更好地理解音频数据。然后进行音频特征提取,提取有意义的特征,如梅尔频率倒谱系数(MFCC)等用于后续的学习任务。

    构建语音识别系统时可以加入注意力模型。注意力机制可以帮助模型聚焦于音频序列的不同时间点,从而提高对语音内容的理解。通过对每个时间帧的音频应用注意力模型,输出对应的文本。

    语音识别中的输入音频通常比输出文本长很多。例如,10秒钟的音频可能只对应19个字符的文本,但由于时间步长较长,输入序列的长度要大于输出。可以引入CTC损失函数,允许网络生成更长的输出序列,以适应语音和文本之间的时间不对齐。

    CTC损失函数允许模型生成包含空白符重复字符的序列。空白符插入允许模型在不同时间步生成相同字符,同时减少输出长度。例如,输入音频 “the quick brown fox” 可以生成类似 h_eee_ _ _ qqq 的序列,通过折叠重复字符和空白符,得到最终的文本“the q”。这种方法大大简化了语音与文本的对齐问题。

  10. 触发词检测系统是一种语音识别技术,能够通过特定的触发词唤醒设备,如 “Hey Siri”。

    系统将音频片段转化为声谱图特征,提取特征向量,将其输入到RNN模型中进行序列建模。因此输入应当是音频的频谱特征。根据音频片段中的触发字出现的时刻,定义目标标签 y y y 。在触发词出现的时间点之前设置为0,触发字后设置为1。

    但是这种方法会导致训练集不平衡,因为绝大多数时间标签为0(没有触发字),而标签为1(触发字出现)的位置较少。为了改善训练的不平衡问题,可以在触发字检测到的时间点之后,延续一段时间继续输出1,这样可以提高训练集中1与0的比例,从而缓解样本不平衡问题。虽然这种方法听起来比较简单粗暴,但确实能帮助系统更容易训练并提高效果。


http://www.ppmy.cn/server/166999.html

相关文章

CSS 实现下拉菜单效果实例解析

1. 引言 在 Web 开发过程中&#xff0c;下拉菜单是一种常见且十分实用的交互组件。很多前端教程都提供过简单的下拉菜单示例&#xff0c;本文将以一个简洁的实例为出发点&#xff0c;从 HTML 结构、CSS 样式以及整体交互逻辑三个层面进行详细解析&#xff0c;帮助大家理解纯 C…

设计模式(一):设计原则、常用设计模式

1. 设计原则 SOLID原则-SRP单一职责原则:一个类或者模块只负责完成一个职责(或者功能)。 SOLID原则-OCP开闭原则:如果要添加一个新的功能,能够在已有代码基础上直接扩展代码,而不用修改已有代码就能实现,那么就符合“扩展开放、对修改关闭”原则。 SOLID原则-LSP里式…

xss闯关

BUU上的[第二章 web进阶]XSS闯关 第一关 第一关很简单&#xff0c;没有任何过滤&#xff0c;直接输入&#xff1a;<script>alert()</script>即可。 第二关 第二关可以输入xss和<script>alert()</script>分别查看页面源代码&#xff0c;看看哪里变了…

第二十一章:考研的艰难抉择与放弃入学的转折

深秋时节&#xff0c;校园宛如被大自然精心雕琢的艺术殿堂。金黄的银杏叶在阳光的轻抚下&#xff0c;闪烁着细碎的光芒&#xff0c;微风拂过&#xff0c;叶片相互摩挲&#xff0c;发出沙沙的轻响&#xff0c;仿佛在低声诉说着岁月的故事。一片片银杏叶悠悠然飘落&#xff0c;宛…

python--sqlite

1. 连接到数据库 使用 sqlite3.connect() 方法可以创建一个到SQLite数据库的连接。如果指定的数据库文件不存在&#xff0c;它会自动创建一个新的数据库文件。 import sqlite3# 连接到数据库&#xff0c;如果数据库文件不存在则会创建一个新的 conn sqlite3.connect(example…

动态词表设计:从小说创作到超大规模语言模型的启示

在自然语言处理(NLP)领域,随着深度学习技术的发展,构建能够理解和生成人类语言的大规模语言模型成为了研究热点。然而,随着词汇量的增长,传统的固定大小词表方法面临着计算资源和效率的巨大挑战。本文将探讨一种创新的动态词表设计思路,并通过类比小说创作过程来论证这种…

25考研材料复试面试常见核心问题真题汇总,材料考研复试面试有哪些经典问题?材料考研复试过程最看重什么内容?

材料复试面试难&#xff01;千万不要死磕&#xff01;复试是有技巧的&#xff01; 是不是刷了三天三夜经验贴&#xff0c;还是不知道材料复试会问啥&#xff1f;去年我复试时被导师连环追问"非晶合金的原子扩散机制"&#xff0c;差点当场宕机...今天学姐掏心窝总结&…

自动化xpath定位元素(附几款浏览器xpath插件)

在 Web 自动化测试、数据采集、前端调试中&#xff0c;XPath 仍然是不可或缺的技能。虽然 CSS 选择器越来越强大&#xff0c;但面对复杂 DOM 结构时&#xff0c;XPath 仍然更具灵活性。因此&#xff0c;掌握 XPath&#xff0c;不仅能提高自动化测试的稳定性&#xff0c;还能在爬…