网站程序源代码,ps做电商网站尺寸是多少,怎样做境外网站上赚钱,qq刷赞网站如何做分站书接上回#xff0c;上回在这捏#xff1a; 
基于术语词典干预的机器翻译挑战赛笔记Task2 #Datawhale AI 夏令营-CSDN博客文章浏览阅读223次#xff0c;点赞10次#xff0c;收藏5次。基于术语词典干预的机器翻译挑战赛笔记Task2https://blog.csdn.net/qq_23311271/article/… 书接上回上回在这捏 
基于术语词典干预的机器翻译挑战赛笔记Task2 #Datawhale AI 夏令营-CSDN博客文章浏览阅读223次点赞10次收藏5次。基于术语词典干预的机器翻译挑战赛笔记Task2https://blog.csdn.net/qq_23311271/article/details/140502626 Task3基于 Transformer 解决机器翻译任务 Transformer  Transformer是一种用于深度学习的神经网络架构常用于自然语言处理和机器看图等任务。 Transformer架构最早由Google在2017年提出并广泛应用于机器翻译任务。与传统的循环神经网络RNN不同Transformer使用了自注意力机制self-attention来捕捉输入序列中不同位置之间的依赖关系从而提升了模型的并行计算能力。它通过多层的自注意力和前馈神经网络构成使得Transformer具备了对长序列的处理能力且训练速度较快。在自然语言处理领域Transformer的一种重要应用是BERTBidirectional Encoder Representations from Transformers是一种预训练的语言表示模型也成为了自然语言处理任务的基石之一。 Transformer 出现 
Transformer 在原论文中第一次提出就是将其应用到机器翻译领域它的出现使得机器翻译的性能和效率迈向了一个新的阶段。它摒弃了循环结构并完全通过注意力机制完成对源语言序列和目标语言序列全局依赖的建模。在抽取每个单词的上下文特征时Transformer 通过自注意力机制self-attention衡量上下文中每一个单词对当前单词的重要程度。 在这个过程当中没有任何的循环单元参与计算。这种高度可并行化的编码过程使得模型的运行变得十分高效。当前几乎大部分的大语言模型都是基于 Transformer 结构本节以应用于机器翻译的基于Transformer 的编码器和解码器介绍该模型。 
Transformer的主要组件包括编码器(Encoder)、解码器(Decoder)和注意力层。其核心是利用多头自注意力机制Multi-Head Self-Attention使每个位置的表示不仅依赖于当前位置还能够直接获取其他位置的表示。自从提出以来Transformer模型在机器翻译、文本生成等自然语言处理任务中均取得了突破性进展成为NLP领域新的主流模型。 Transformer 模型的基本架构: Transformer模型由编码器Encoder和解码器Decoder组成。编码器接收输入序列并将其转换为一系列的隐藏表示解码器则根据编码器的输出和之前的输出来生成目标序列。 
每个编码器和解码器均包含若干个相同的层每个层由两个子层组成即多头自注意力机制Multi-head Self-Attention和前馈神经网络Feed-Forward Neural Network。 在自注意力机制中每个输入位置都可以与其他位置进行交互通过计算注意力权重来捕捉不同位置之间的依赖关系。这使得模型能够同时考虑到输入序列中的所有位置从而提高了模型的表达能力。 多头自注意力机制是通过将自注意力机制应用于多个子空间中的不同表示而实现的每个子空间都通过独立的投影进行线性变换。 
前馈神经网络通过两个线性变换和一个激活函数来实现对每个位置的隐藏表示进行非线性变换。 
Transformer模型通过多层的编码器和解码器以及适当的模型参数来实现对输入序列的建模和生成目标序列的能力。 
宏观角度 
从宏观角度来看Transformer的编码器是由多个相同的层叠加而成的每个层都有两个子层子层表示为sublayer。第⼀个子层是多头自注意力multi-head self-attention汇聚第二个子层是基于位置的前馈网络positionwise feed-forward network。主要涉及到如下几个模块 
1. 嵌入表示层  
对于输入文本序列先通过一个输入嵌入层Input Embedding将每个单词转换为其相对应的向量表示。通常直接对每个单词创建一个向量表示。由于 Transfomer 模型不再使用基于循环的方式建模文本输入序列中不再有任何信息能够提示模型单词之间的相对位置关系。在送入编码器端建模其上下文语义之前一个非常重要的操作是在词嵌入中加入位置编码Positional Encoding这一特征。具体来说序列中每一个单词所在的位置都对应一个向量。这一向量会与单词表示对应相加并送入到后续模块中做进一步处理。在训练的过程当中模型会自动地学习到如何利用这部分位置信息。为了得到不同位置对应的编码Transformer 模型使用不同频率的正余弦函数如下所示 其中pos 表示单词所在的位置2i 和 2i1 表示位置编码向量中的对应维度d则对应位置编码的总维度。 
通过上面这种方式计算位置编码有这样几个好处 首先正余弦函数的范围是在 [-1,1]导出的位置编码与原词嵌入相加不会使得结果偏离过远而破坏原有单词的语义信息。  其次依据三角函数的基本性质可以得知第posk 个位置的编码是第 pos 个位置的编码的线性组合这就意味着位置编码中蕴含着单词之间的距离信息。  位置编码的维度和词嵌入向量的维度相同 均为 d_model模型通过将二者相加作为模型输入 2. 注意力层 
自注意力Self-Attention操作是基于 Transformer 的机器翻译模型的基本操作在源语言的编码和目标语言的生成中频繁地被使用以建模源语言、目标语言任意两个单词之间的依赖关系。给定由单词语义嵌入及其位置编码叠加得到的输入表示为了实现对上下文语义依赖的建模进一步引入在自注意力机制中涉及到的三个元素查询  键值 。在编码输入序列中每一个单词的表示的过程中这三个元素用于计算上下文单词所对应的权重得分。直观地说这些权重反映了在编码当前单词的表示时对于上下文不同部分所需要的关注程度。 为了得到编码单词 时所需要关注的上下文信息通过位置 i查询向量与其他位置的键向量做点积得到匹配分数。为了防止过大的匹配分数在后续 Softmax 计算过程中导致的梯度爆炸以及收敛效率差的问题这些得分会除放缩因子 以稳定优化。放缩后的得分经过 Softmax 归一化为概率之后与其他位置的值向量相乘来聚合希望关注的上下文信息并最小化不相关信息的干扰。上述计算过程可以被形式化地表述如下 其中 分别表示输入序列中的不同单词的 q,k,v 向量拼接组成的矩阵L 表示序列长度 表示自注意力操作的输出。 3. 前馈层 
前馈层接受自注意力子层的输出作为输入并通过一个带有 Relu 激活函数的两层全连接网络对输入进行更加复杂的非线性变换。实验证明这一非线性变换会对模型最终的性能产生十分重要的影响。 其中 表示前馈子层的参数。另外以往的训练发现增大前馈子层隐状态的维度有利于提升最终翻译结果的质量因此前馈子层隐状态的维度一般比自注意力子层要大。 4. 残差连接与层归一化 
由 Transformer 结构组成的网络结构通常都是非常庞大。编码器和解码器均由很多层基本的Transformer 块组成每一层当中都包含复杂的非线性映射这就导致模型的训练比较困难。因此研究者们在 Transformer 块中进一步引入了残差连接与层归一化技术以进一步提升训练的稳定性。具体来说残差连接主要是指使用一条直连通道直接将对应子层的输入连接到输出上去从而避免由于网络过深在优化过程中潜在的梯度消失问题 其中  表示第  层的输入表示一个映射函数。此外为了进一步使得每一层的输入输出范围稳定在一个合理的范围内层归一化技术被进一步引入每个 Transformer 块的当中 其中 和  分别表示均值和方差用于将数据平移缩放到均值为 0方差为 1 的标准分布 a 和 b 是可学习的参数。层归一化技术可以有效地缓解优化过程中潜在的不稳定、收敛速度慢等问题。 5. 编码器和解码器结构 
根据给出的网络架构编码器端可以较为容易实现。但相比于编码器端解码器端要更复杂一些。具体来说解码器的每个 Transformer 块的第一个自注意力子层额外增加了注意力掩码对应图中的掩码多头注意力Masked Multi-Head Attention部分。这主要是因为在翻译的过程中编码器端主要用于编码源语言序列的信息而这个序列是完全已知的因而编码器仅需要考虑如何融合上下文语义信息即可。而解码端则负责生成目标语言序列这一生成过程是自回归的即对于每一个单词的生成过程仅有当前单词之前的目标语言序列是可以被观测的因此这一额外增加的掩码是用来掩盖后续的文本信息以防模型在训练阶段直接看到后续的文本序列进而无法得到有效地训练。 
此外解码器端还额外增加了一个多头注意力Multi-Head Attention模块使用交叉注意力Cross-attention方法同时接收来自编码器端的输出以及当前 Transformer 块的前一个掩码注意力层的输出。查询是通过解码器前一层的输出进行投影的而键和值是使用编码器的输出进行投影的。它的作用是在翻译的过程当中为了生成合理的目标语言序列需要观测待翻译的源语言序列是什么。基于上述的编码器和解码器结构待翻译的源语言文本先经过编码器端的每个Transformer 块对其上下文语义的层层抽象然后输出每一个源语言单词上下文相关的表示。解码器端以自回归的方式生成目标语言文本即在每个时间步 t 根据编码器端输出的源语言文本表示以及前 t-1 个时刻生成的目标语言文本生成当前时刻的目标语言单词。 多头注意力Multi-Head Attention模块是一种注意力机制的变种用于在序列中获取不同位置的相关信息。 在多头注意力模块中输入包括三个部分查询query、键key和值value。通过计算查询和键之间的相似度来得到注意力权重然后使用注意力权重加权求和得到值的表示。 与传统的注意力机制不同的是多头注意力模块引入了多个注意力头每个头都有自己的查询、键和值。每个头计算出的注意力表示可以捕捉不同位置的相关信息从而增加了模型的表达能力。 交叉注意力Cross-attention方法是多头注意力模块的一种应用方式它将不同输入序列之间的注意力计算整合到一个模块中。 例如在机器翻译任务中源语言和目标语言之间可以使用交叉注意力模块来获取源语言和目标语言之间的相关信息。 多头注意力模块通过引入多个注意力头和交叉注意力方法提供了一种强大的机制来捕捉不同位置的相关信息。 代码实现 
PositionalEncoding 类 这个类用于为输入序列添加位置编码以保留序列中单词的位置信息。 TransformerModel 类 这个类定义了一个完整的Transformer模型包括编码器、解码器、嵌入层和输出层。 # 位置编码
class PositionalEncoding(nn.Module):def __init__(self, d_model, dropout0.1, max_len5000):super(PositionalEncoding, self).__init__()self.dropout  nn.Dropout(pdropout)pe  torch.zeros(max_len, d_model)position  torch.arange(0, max_len, dtypetorch.float).unsqueeze(1)div_term  torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model))pe[:, 0::2]  torch.sin(position * div_term)pe[:, 1::2]  torch.cos(position * div_term)pe  pe.unsqueeze(0).transpose(0, 1)self.register_buffer(pe, pe)def forward(self, x):x  x  self.pe[:x.size(0), :]return self.dropout(x)# Transformer
class TransformerModel(nn.Module):def __init__(self, src_vocab, tgt_vocab, d_model, nhead, num_encoder_layers, num_decoder_layers, dim_feedforward, dropout):super(TransformerModel, self).__init__()self.transformer  nn.Transformer(d_model, nhead, num_encoder_layers, num_decoder_layers, dim_feedforward, dropout)self.src_embedding  nn.Embedding(len(src_vocab), d_model)self.tgt_embedding  nn.Embedding(len(tgt_vocab), d_model)self.positional_encoding  PositionalEncoding(d_model, dropout)self.fc_out  nn.Linear(d_model, len(tgt_vocab))self.src_vocab  src_vocabself.tgt_vocab  tgt_vocabself.d_model  d_modeldef forward(self, src, tgt):# 调整src和tgt的维度src  src.transpose(0, 1)  # (seq_len, batch_size)tgt  tgt.transpose(0, 1)  # (seq_len, batch_size)src_mask  self.transformer.generate_square_subsequent_mask(src.size(0)).to(src.device)tgt_mask  self.transformer.generate_square_subsequent_mask(tgt.size(0)).to(tgt.device)src_padding_mask  (src  self.src_vocab[pad]).transpose(0, 1)tgt_padding_mask  (tgt  self.tgt_vocab[pad]).transpose(0, 1)src_embedded  self.positional_encoding(self.src_embedding(src) * math.sqrt(self.d_model))tgt_embedded  self.positional_encoding(self.tgt_embedding(tgt) * math.sqrt(self.d_model))output  self.transformer(src_embedded, tgt_embedded,src_mask, tgt_mask, None, src_padding_mask, tgt_padding_mask, src_padding_mask)return self.fc_out(output).transpose(0, 1) 
其他上分技巧  
增加训练轮次epochs  增加训练轮次可以使模型更充分地学习数据提高翻译质量。但需要注意避免过拟合。 使用全部训练集 使用全部训练集可以提供更多的训练样本帮助模型更好地学习数据的特征。 调整模型参数 调整模型的参数可以影响模型的表达能力和学习能力。可以尝试调整模型的头部head和层数layers等参数以提高模型的性能。 增加模型的深度或宽度 增加模型的深度或宽度可以增加模型的表达能力提高翻译质量。可以尝试增加模型的隐藏层的大小或深度。 术语词典 建立一个术语词典可以通过在模型生成的翻译中替换术语或在数据预处理流程中整合术语词典甚至在模型内部动态调整术语的嵌入以确保专业术语翻译的准确性。 数据清洗 清洗训练集中的脏数据可以避免对模型训练的负面影响。可以去除重复数据、错误标注的数据等。 数据扩增 可以通过回译、同义词替换、句法分析和语义解析技术重新表述句子以及将文本翻译成多种语言后再翻译回原语言等方法增加训练数据的多样性和数量。 学习率调度策略 采用更精细的学习率调度策略如Noam Scheduler、Step Decay或Cosine Annealing可以优化训练过程提高模型的性能。 Noam Scheduler是根据模型的当前训练步数来动态地调整学习率的学习率调度器。 
Noam Scheduler在训练开始时学习率会先以一个较小的值增加然后逐渐线性增加到一个较大的值。之后在训练过程中学习率会按照公式进行衰减。Noam Scheduler的优点是在训练初期能够有较小的学习率以及良好的收敛性能。 
Step Decay是一种根据预先定义的步数来调整学习率的调整方法。 
Step Decay通过将学习率按照预定的间隔进行衰减使得学习率在训练过程中逐渐减小。Step Decay的优点是简单易用但需要手动设置学习率衰减的间隔。 
Cosine Annealing是一种根据余弦函数的曲线来调整学习率的调整方法。 
Cosine Annealing在训练过程中按照余弦函数的曲线周期性地调整学习率使得学习率在每个周期内先减小然后再增加。Cosine Annealing的优点是能够在训练过程中有更好的学习率变化特性有助于模型在局部最优点附近进行更充分的搜索。 
预训练模型 可以训练一个小的预训练模型以适应特定的翻译任务。预训练模型可以提供更好的初始参数帮助模型更快地收敛。 Finetune 在开发集上对训练好的模型进行微调可以进一步提高模型在测试集上的表现。 Finetuning 是一种迁移学习的技术用于在一个预训练过的模型上进行微调以适应新的任务或数据集。通过微调预训练模型来适应新任务或数据集提高模型的性能和泛化能力。 迁移学习是指将从一个任务中学习到的知识应用到另一个任务上的过程。在实际应用中往往缺乏足够的数据来直接训练一个复杂的模型。这时可以使用已经在大规模数据上预训练的模型作为初始模型并在新的任务或数据集上进行微调。 Finetuning的过程通常分为两个步骤。 首先将预训练的模型加载到内存中然后在新的任务或数据集上进行微调。微调的过程包括两个阶段冻结和解冻。 在冻结阶段通常将预训练模型的大部分参数固定住只训练模型的最后几层或分类器层来适应新任务。这样做的目的是保留预训练模型在大规模数据上学到的通用特征避免过拟合。 
在解冻阶段逐渐解除参数的固定允许更多的参数参与训练。这样可以在新任务上进一步微调模型的参数以更好地适应新的数据。 
Finetuning的优点是可以利用预训练模型的知识在少量数据上实现较好的性能。它可以减少训练时间和计算资源的消耗并且可以有效地应对数据集变化、迭代更新的需求。 
语言模型打分 可以在开发集和测试集上训练语言模型用于给训练集中的句子打分筛选出高质量的数据提高训练数据的质量。 集成学习 训练多个不同初始化或架构的模型并使用集成方法来产生最终翻译可以提高翻译的稳定性和减少过拟合风险。可以尝试使用投票、平均等集成方法。