2026/4/17 0:42:21
网站建设
项目流程
网站建设及经营应解决好的问题,表白网站制作,漳浦建设银行网站,制作图片文字模板的软件注意力机制解决了传统RNN在处理长序列时的瓶颈问题。通过计算输入序列中各元素与当前解码状态的关联性#xff0c;生成注意力权重#xff0c;构建上下文向量。文章详细介绍了Attention的数学原理和三种实现方法#xff1a;点积、通用和连接注意力#xff0c;并提供了完整的…注意力机制解决了传统RNN在处理长序列时的瓶颈问题。通过计算输入序列中各元素与当前解码状态的关联性生成注意力权重构建上下文向量。文章详细介绍了Attention的数学原理和三种实现方法点积、通用和连接注意力并提供了完整的PyTorch代码示例。这种机制使模型能够关注输入序列中最相关的部分显著提升了序列到序列任务的性能。一、Attention的介绍在普通的RNN结构中Encoder需要把一个句子转化为一个向量然后在Decoder中使用这就要求Encoder把源句子中所有的信息都包含进去但是当句子长度过长的时候这个要求就很难达到或者说会产生瓶颈比如输入一篇文章等场长内容当然我们可以使用更深的RNN和大多的单元来解决这个问题但是这样的代价也很大。那么有没有什么方法能够优化现有的RNN结构呢为此Bahdanau等人在2015年提出了Attenion机制Attention翻译成为中文叫做注意力把这种模型称为Attention based model。就像我们自己看到一副画我们能够很快的说出画的主要内容而忽略画中的背景因为我们注意的更关注的往往是其中的主要内容。通过这种方式在我们的RNN中我们有通过LSTM或者是GRU得到的所有信息那么这些信息中只去关注重点而不需要在Decoder的每个time step使用全部的encoder的信息这样就可以解决第一段所说的问题了二、Attention的实现机制假设我们现在有一个文本翻译的需求即机器学习翻译为machine learning。那么这个过程通过前面所学习的Seq2Seq就可以实现上图的左边是Encoder能够得到hidden_state在右边使用Deocder中蓝色方框中的内容是为了提高模型的训练速度而使用teacher forcing手段否则的话会把前一次的输出作为下一次的输入但是在Attention模型中不再是这样了那么整个过程中如果使用Attention应该怎么做呢在之前我们把encoder的最后一个输出作为decoder的初始的隐藏状态现在我们不再这样做1、Attention的实现过程初始化一个Decoder的隐藏z_0z\_0z_0这个z_oz\_oz_o会和encoder第一个time step的output进行match操作或者是socre操作得到α_01\alpha\_0^1α_01这里的match可以使很多中操作比如z和h的余弦值是一个神经网络输入为z和h或者αhTWz\alpha h^T W zαhTWz等encoder中的每个output都和z_0z\_0z_0进行计算之后得到的结果进行softmax让他们的和为1(可以理解为权重)之后把所有的softmax之后的结果和原来encoder的输出h_ih\_ih_i进行相加求和得到c0c^0c0即c0∑α^i0hi得到c0c^0c0之后把它作为decoder的input同和传入初始化的z0z^0z0得到第一个time step的输出和hidden_stateZ1Z^1Z1把Z_1Z\_1Z_1再和所有的encoder的output进行match操作得到的结果进行softmax之后作为权重和encoder的每个timestep的结果相乘求和得到c1c^1c1再把c1c^1c1作为decoder的input和Z1Z^1Z1作为输入得到下一个输出如此循环,只到最终decoder的output为终止符整个过程写成数学公式如下先计算attention权重在计算上下文向量图中的cic^ici最后计算结果往往会把当前的output([batch_size,1,hidden_size])和上下文向量进行拼接然后使用2、不同Attention的介绍在上述过程中使用decoder的状态和encoder的状态的计算后的结果作为权重乘上encoder每个时间步的输出这需要我们去训练一个合适的match函数得到的结果就能够在不同的时间步上使用不同的encoder的相关信息从而达到只关注某一个局部的效果也就是注意力的效果Soft-Attention 和 Hard-Attention最开始Bahdanau等人提出的Attention机制通常被称为soft-attention,所谓的soft-attention指的是encoder中输入的每个词语都会计算得到一个注意力的概率。在进行图像捕捉的时候提出了一种hard-attenion的方法希望直接从input中找到一个和输出的某个词对应的那一个词。但是由于NLP中词语和词语之间往往存在联系不会只关注某一个词语所以都会使用soft-attention所以这里的就不多介绍hard-attentionGlobal-Attention 和Local AttentionBahdanau等人提出的Bahdanau Attention被称为local attention,后来Luong等人提出的Luong Attention是一种全局的attenion。所谓全局的attenion指的是使用的全部的encoder端的输入的attenion的权重local-attenion就是使用了部分的encoder端的输入的权重(当前时间步上的encoder的hidden state)这样可以减少计算量特别是当句子的长度比较长的时候。三、Attention的代码实现通过attention的代码需要实现计算的是attention weight通过前面的学习我们知道attention_weight f(hidden,encoder_outputs)主要就是实现Luong attention中的三种操作class Attention(nn.Module): def __init__(self,method,batch_size,hidden_size): super(Attention,self).__init__() self.method method self.hidden_size hidden_size assert self.method in [dot,general,concat],method 只能是 dot,general,concat,当前是{}.format(self.method) if self.method dot: pass elif self.method general: self.Wa nn.Linear(hidden_size,hidden_size,biasFalse) elif self.method concat: self.Wa nn.Linear(hidden_size*2,hidden_size,biasFalse) self.Va nn.Parameter(torch.FloatTensor(batch_size,hidden_size)) def forward(self, hidden,encoder_outputs): :param hidden:[1,batch_size,hidden_size] :param encoder_outputs: [batch_size,seq_len,hidden_size] :return: batch_size,seq_len,hidden_size encoder_outputs.size() hidden hidden.squeeze(0) #[batch_size,hidden_size] if self.method dot: return self.dot_score(hidden,encoder_outputs) elif self.method general: return self.general_score(hidden,encoder_outputs) elif self.method concat: return self.concat_score(hidden,encoder_outputs) def _score(self,batch_size,seq_len,hidden,encoder_outputs): # 速度太慢 # [batch_size,seql_len] attn_energies torch.zeros(batch_size,seq_len).to(config.device) for b in range(batch_size): for i in range(seq_len): #encoder_output : [batch_size,seq_len,hidden_size] #deocder_hidden :[batch_size,hidden_size] #torch.Size([256, 128]) torch.Size([128]) torch.Size([256, 24, 128]) torch.Size([128]) # print(attn size:,hidden.size(),hidden[b,:].size(),encoder_output.size(),encoder_output[b,i].size()) attn_energies[b,i] hidden[b,:].dot(encoder_outputs[b,i]) #dot score return F.softmax(attn_energies).unsqueeze(1) # [batch_size,1,seq_len] def dot_score(self,hidden,encoder_outputs): dot attention :param hidden:[batch_size,hidden_size] ---[batch_size,hidden_size,1] :param encoder_outputs: [batch_size,seq_len,hidden_size] :return: #hiiden :[hidden_size] --[hidden_size,1] encoder_output:[seq_len,hidden_size] hidden hidden.unsqueeze(-1) attn_energies torch.bmm(encoder_outputs, hidden) attn_energies attn_energies.squeeze(-1) #[batch_size,seq_len,1] [batch_size,seq_len] return F.softmax(attn_energies).unsqueeze(1) # [batch_size,1,seq_len] def general_score(self,hidden,encoder_outputs): general attenion :param batch_size:int :param hidden: [batch_size,hidden_size] :param encoder_outputs: [batch_size,seq_len,hidden_size] :return: x self.Wa(hidden) #[batch_size,hidden_size] x x.unsqueeze(-1) #[batch_size,hidden_size,1] attn_energies torch.bmm(encoder_outputs,x).squeeze(-1) #[batch_size,seq_len,1] return F.softmax(attn_energies,dim-1).unsqueeze(1) # [batch_size,1,seq_len] def concat_score(self,hidden,encoder_outputs): concat attention :param batch_size:int :param hidden: [batch_size,hidden_size] :param encoder_outputs: [batch_size,seq_len,hidden_size] :return: #需要先进行repeat操作变成和encoder_outputs相同的形状,让每个batch有seq_len个hidden_size x hidden.repeat(1,encoder_outputs.size(1),1) ##[batch_size,seq_len,hidden_size] x torch.tanh(self.Wa(torch.cat([x,encoder_outputs],dim-1))) #[batch_size,seq_len,hidden_size*2] -- [batch_size,seq_len,hidden_size] #va [batch_size,hidden_size] --- [batch_size,hidden_size,1] attn_energis torch.bmm(x,self.Va.unsqueeze(2)) #[batch_size,seq_len,1] attn_energis attn_energis.squeeze(-1) # print(concat attention:,attn_energis.size(),encoder_outputs.size()) return F.softmax(attn_energis,dim-1).unsqueeze(1) #[batch_size,1,seq_len]完成了attention weight的计算之后需要再对代码中forward_step的内容进行修改def forward_step(self,decoder_input,decoder_hidden,encoder_outputs): :param decoder_input:[batch_size,1] :param decoder_hidden: [1,batch_size,hidden_size] :param encoder_outputs: encoder中所有的输出[batch_size,seq_len,hidden_size] :return: out:[batch_size,vocab_size],decoder_hidden:[1,batch_size,didden_size] embeded self.embedding(decoder_input) #embeded: [batch_size,1 , embedding_dim] #TODO 可以把embeded的结果和前一次的context初始值为全0tensor concate之后作为结果 #rnn_input torch.cat((embeded, last_context.unsqueeze(0)), 2) # gru_out:[256,1, 128] decoder_hidden: [1, batch_size, hidden_size] gru_out,decoder_hidden self.gru(embeded,decoder_hidden) gru_out gru_out.squeeze(1) #TODO 注意如果是单层这里使用decoder_hidden没问题output和hidden相同 # 如果是多层可以使用GRU的output作为attention的输入 #开始使用attention attn_weights self.attn(decoder_hidden,encoder_outputs) # attn_weights [batch_size,1,seq_len] * [batch_size,seq_len,hidden_size] context attn_weights.bmm(encoder_outputs) #[batch_size,1,hidden_size] gru_out gru_out.squeeze(0) # [batch_size,hidden_size] context context.squeeze(1) # [batch_size,hidden_size] #把output和attention的结果合并到一起 concat_input torch.cat((gru_out, context), 1) #[batch_size,hidden_size*2] concat_output torch.tanh(self.concat(concat_input)) #[batch_size,hidden_size] output F.log_softmax(self.fc(concat_output),dim-1) #[batch_Size, vocab_size] # out out.squeeze(1) return output,decoder_hidden,attn_weightsattetnion的Bahdanau实现可以参考https://github.com/spro/practical-pytorch/blob/master/seq2seq-translation/seq2seq-translation.ipynb如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套AI 大模型突围资料包✅ 从零到一的 AI 学习路径图✅ 大模型调优实战手册附医疗/金融等大厂真实案例✅ 百度/阿里专家闭门录播课✅ 大模型当下最新行业报告✅ 真实大厂面试真题✅ 2025 最新岗位需求图谱所有资料 ⚡️ 朋友们如果有需要《AI大模型入门进阶学习资源包》下方扫码获取~① 全套AI大模型应用开发视频教程包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点② 大模型系统化学习路线作为学习AI大模型技术的新手方向至关重要。 正确的学习路线可以为你节省时间少走弯路方向不对努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划带你从零基础入门到精通③ 大模型学习书籍文档学习AI大模型离不开书籍文档我精选了一系列大模型技术的书籍和学习文档电子版它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。④ AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。⑤ 大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。⑥ 大模型大厂面试真题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我精心整理了一份大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。以上资料如何领取为什么大家都在学大模型最近科技巨头英特尔宣布裁员2万人传统岗位不断缩减但AI相关技术岗疯狂扩招有3-5年经验大厂薪资就能给到50K*20薪不出1年“有AI项目经验”将成为投递简历的门槛。风口之下与其像“温水煮青蛙”一样坐等被行业淘汰不如先人一步掌握AI大模型原理应用技术项目实操经验“顺风”翻盘这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。以上全套大模型资料如何领取