0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么要有attention机制,Attention原理

电子工程师 来源:lp 2019-03-06 14:11 次阅读

1.1 attention model

为什么要有attention机制

原本的Seq2seq模型只有一个encoder和一个decoder,通常的做法是将一个输入的句子编码成一个固定大小的state,然后作为decoder的初始状态(当然也可以作为每一时刻的输入),但这样的一个状态对于decoder中的所有时刻都是一样的。

attention即为注意力,人脑在对于的不同部分的注意力是不同的。需要attention的原因是非常直观的,当我们看一张照片时,照片上有一个人,我们的注意力会集中在这个人身上,而它身边的花草蓝天,可能就不会得到太多的注意力。也就是说,普通的模型可以看成所有部分的attention都是一样的,而这里的attention-based model对于不同的部分,重要的程度则不同,decoder中每一个时刻的状态是不同的。

Attention-based Model是什么Attention-based Model其实就是一个相似性的度量,当前的输入与目标状态越相似,那么在当前的输入的权重就会越大,说明当前的输出越依赖于当前的输入。严格来说,Attention并算不上是一种新的model,而仅仅是在以往的模型中加入attention的思想,所以Attention-based Model或者Attention Mechanism是比较合理的叫法,而非Attention Model。

没有attention机制的encoder-decoder结构通常把encoder的最后一个状态作为decoder的输入(可能作为初始化,也可能作为每一时刻的输入),但是encoder的state毕竟是有限的,存储不了太多的信息,对于decoder过程,每一个步骤都和之前的输入都没有关系了,只与这个传入的state有关。attention机制的引入之后,decoder根据时刻的不同,让每一时刻的输入都有所不同。

Attention原理

1.2 Beam Search介绍

在sequence2sequence模型中,beam search的方法只用在测试的情况,因为在训练过程中,每一个decoder的输出是有正确答案的,也就不需要beam search去加大输出的准确率。

假设现在我们用机器翻译作为例子来说明,

我们需要翻译中文“我是中国人”--->英文“I am Chinese”

假设我们的词表大小只有三个单词就是I am Chinese。那么如果我们的beam size为2的话,我们现在来解释,如下图所示,我们在decoder的过程中,有了beam search方法后,在第一次的输出,我们选取概率最大的"I"和"am"两个单词,而不是只挑选一个概率最大的单词。

然后接下来我们要做的就是,把“I”单词作为下一个decoder的输入算一遍得到y2的输出概率分布,把“am”单词作为下一个decoder的输入算一遍也得到y2的输出概率分布。

比如将“I”单词作为下一个decoder的输入算一遍得到y2的输出概率分布如下:

比如将“am”单词作为下一个decoder的输入算一遍得到y2的输出概率分布如下:

那么此时我们由于我们的beam size为2,也就是我们只能保留概率最大的两个序列,此时我们可以计算所有的序列概率:

“I I” = 0.40.3 "I am" = 0.40.6 "I Chinese" = 0.4*0.1

"am I" = 0.50.3 "am am" = 0.50.3 "am Chinese" = 0.5*0.4

我们很容易得出俩个最大概率的序列为 “I am”和“am Chinese”,然后后面会不断重复这个过程,直到遇到结束符为止。

最终输出2个得分最高的序列。

这就是seq2seq中的beam search算法过程。

2.1 tf.app.flags

tf定义了tf.app.flags,用于支持接受命令行传递参数,相当于接受argv。看下面的例子:

importtensorflowastf#第一个是参数名称,第二个参数是默认值,第三个是参数描述tf.app.flags.DEFINE_string('str_name','def_v_1',"descrip1")tf.app.flags.DEFINE_integer('int_name',10,"descript2")tf.app.flags.DEFINE_boolean('bool_name',False,"descript3")FLAGS=tf.app.flags.FLAGS#必须带参数,否则:'TypeError:main()takesnoarguments(1given)';main的参数名随意定义,无要求defmain(_):print(FLAGS.str_name)print(FLAGS.int_name)print(FLAGS.bool_name)if__name__=='__main__':tf.app.run()#执行main函数

使用命令行运行得到的输出为:

[root@AliHPC-G41-211test]#pythontt.pydef_v_110False[root@AliHPC-G41-211test]#pythontt.py--str_nametest_str--int_name99--bool_nameTruetest_str99True

2.2 tf.clip_by_global_norm

Gradient Clipping的直观作用就是让权重的更新限制在一个合适的范围。tf.clip_by_global_norm函数的作用就是通过权重梯度的总和的比率来截取多个张量的值。使用方式如下:

tf.clip_by_global_norm(t_list,clip_norm,use_norm=None,name=None)

t_list 是梯度张量, clip_norm 是截取的比率, 这个函数返回截取过的梯度张量和一个所有张量的全局范数。

t_list[i] 的更新公式如下:

t_list[i]*clip_norm/max(global_norm,clip_norm)

其中global_norm = sqrt(sum([l2norm(t)**2 for t in t_list]))global_norm 是所有梯度的平方和,如果 clip_norm > global_norm ,就不进行截取。

2.3 tf中注意力机制的实现

注意力机制只在decoder中出现,在之前作对联的文章中,我们的decoder实现分三步走:定义decoder阶段要是用的Cell -》TrainingHelper+BasicDecoder的组合定义解码器-》调用dynamic_decode进行解码。

添加注意力机制主要是在第一步,对Cell进行包裹,tf中实现了两种主要的注意力机制,我们前文中所讲的注意力机制我们成为Bahdanau注意力机制,还有一种注意力机制称为Luong注意力机制,二者最主要的区别是前者为加法注意力机制,后者为乘法注意力机制。二者的更详细的介绍参考播客:http://blog.csdn.net/amds123/article/details/65938986

那么我们就来详细介绍一下 tf中注意力机制的实现:

定义cell

def_create_rnn_cell(self):defsingle_rnn_cell():#创建单个cell,这里需要注意的是一定要使用一个single_rnn_cell的函数,不然直接把cell放在MultiRNNCell#的列表中最终模型会发生错误single_cell=tf.contrib.rnn.LSTMCell(self.rnn_size)#添加dropoutcell=tf.contrib.rnn.DropoutWrapper(single_cell,output_keep_prob=self.keep_prob_placeholder)returncell#列表中每个元素都是调用single_rnn_cell函数cell=tf.contrib.rnn.MultiRNNCell([single_rnn_cell()for_inrange(self.num_layers)])returncelldecoder_cell=self._create_rnn_cell()

封装attention wrapper

attention_mechanism=tf.contrib.seq2seq.BahdanauAttention(num_units=self.rnn_size,memory=encoder_outputs,memory_sequence_length=encoder_inputs_length)#attention_mechanism=tf.contrib.seq2seq.LuongAttention(num_units=self.rnn_size,memory=encoder_outputs,memory_sequence_length=encoder_inputs_length)decoder_cell=tf.contrib.seq2seq.AttentionWrapper(cell=decoder_cell,attention_mechanism=attention_mechanism,attention_layer_size=self.rnn_size,name='Attention_Wrapper')

训练阶段,使用TrainingHelper+BasicDecoder的组合

training_helper=tf.contrib.seq2seq.TrainingHelper(inputs=decoder_inputs_embedded, sequence_length=self.decoder_targets_length,time_major=False,name='training_helper')training_decoder=tf.contrib.seq2seq.BasicDecoder(cell=decoder_cell,helper=training_helper,initial_state=decoder_initial_state,output_layer=output_layer)

调用dynamic_decode进行解码

decoder_outputs,_,_=tf.contrib.seq2seq.dynamic_decode(decoder=training_decoder,impute_finished=True,maximum_iterations=self.max_target_sequence_length)

decoder_outputs是一个namedtuple,里面包含两项(rnn_outputs, sample_id)rnn_output: [batch_size, decoder_targets_length, vocab_size],保存decode每个时刻每个单词的概率,可以用来计算loss sample_id: [batch_size], tf.int32,保存最终的编码结果。可以表示最后的答案。

代码目录如下图所示:

其中,data存放我们的数据,model存放我们保存的训练模型,data_loader是我们处理数据的代码,model是我们建立seq2seq模型的代码,train是我们训练模型的代码,predict是我们进行模型预测的部分。这里我们只介绍model部分,其它部分的代码大家可以参照github自己练习。

定义基本的输入输出

def__init__(self,rnn_size,num_layers,embedding_size,learning_rate,word_to_idx,mode,use_attention,beam_search,beam_size,max_gradient_norm=5.0):self.learing_rate=learning_rateself.embedding_size=embedding_sizeself.rnn_size=rnn_sizeself.num_layers=num_layersself.word_to_idx=word_to_idxself.vocab_size=len(self.word_to_idx)self.mode=modeself.use_attention=use_attentionself.beam_search=beam_searchself.beam_size=beam_sizeself.max_gradient_norm=max_gradient_norm#执行模型构建部分的代码self.build_model()

定义我们多层LSTM的网络结构这里,不论是encoder还是decoder,我们都定义一个两层的LSTMCell,同时每一个cell都添加上DropoutWrapper。

def_create_rnn_cell(self):defsingle_rnn_cell():#创建单个cell,这里需要注意的是一定要使用一个single_rnn_cell的函数,不然直接把cell放在MultiRNNCell#的列表中最终模型会发生错误single_cell=tf.contrib.rnn.LSTMCell(self.rnn_size)#添加dropoutcell=tf.contrib.rnn.DropoutWrapper(single_cell,output_keep_prob=self.keep_prob_placeholder)returncell#列表中每个元素都是调用single_rnn_cell函数cell=tf.contrib.rnn.MultiRNNCell([single_rnn_cell()for_inrange(self.num_layers)])returncell

定义模型的placeholder

self.encoder_inputs=tf.placeholder(tf.int32,[None,None],name='encoder_inputs')self.encoder_inputs_length=tf.placeholder(tf.int32,[None],name='encoder_inputs_length')self.batch_size=tf.placeholder(tf.int32,[],name='batch_size')self.keep_prob_placeholder=tf.placeholder(tf.float32,name='keep_prob_placeholder')self.decoder_targets=tf.placeholder(tf.int32,[None,None],name='decoder_targets')self.decoder_targets_length=tf.placeholder(tf.int32,[None],name='decoder_targets_length')self.max_target_sequence_length=tf.reduce_max(self.decoder_targets_length,name='max_target_len')self.mask=tf.sequence_mask(self.decoder_targets_length,self.max_target_sequence_length,dtype=tf.float32,name='masks')

定义encoder

withtf.variable_scope('encoder'):#创建LSTMCell,两层+dropoutencoder_cell=self._create_rnn_cell()#构建embedding矩阵,encoder和decoder公用该词向量矩阵embedding=tf.get_variable('embedding',[self.vocab_size,self.embedding_size])encoder_inputs_embedded=tf.nn.embedding_lookup(embedding,self.encoder_inputs)#使用dynamic_rnn构建LSTM模型,将输入编码成隐层向量。#encoder_outputs用于attention,batch_size*encoder_inputs_length*rnn_size,#encoder_state用于decoder的初始化状态,batch_size*rnn_szieencoder_outputs,encoder_state=tf.nn.dynamic_rnn(encoder_cell,encoder_inputs_embedded,sequence_length=self.encoder_inputs_length,dtype=tf.float32)

定义decoder在decoder阶段,我们仍然是定义了两种模式,一种是训练,一种是预测,在训练模式下,decoder的输入是真实的target序列,而在预测时,我们可以使用贪心策略或者是beam_search策略。

withtf.variable_scope('decoder'):encoder_inputs_length=self.encoder_inputs_length#ifself.beam_search:##如果使用beam_search,则需要将encoder的输出进行tile_batch,其实就是复制beam_size份。#print("usebeamsearchdecoding..")#encoder_outputs=tf.contrib.seq2seq.tile_batch(encoder_outputs,multiplier=self.beam_size)#encoder_state=nest.map_structure(lambdas:tf.contrib.seq2seq.tile_batch(s,self.beam_size),encoder_state)#encoder_inputs_length=tf.contrib.seq2seq.tile_batch(self.encoder_inputs_length,multiplier=self.beam_size)attention_mechanism=tf.contrib.seq2seq.BahdanauAttention(num_units=self.rnn_size,memory=encoder_outputs,memory_sequence_length=encoder_inputs_length)#attention_mechanism=tf.contrib.seq2seq.LuongAttention(num_units=self.rnn_size,memory=encoder_outputs,memory_sequence_length=encoder_inputs_length)#定义decoder阶段要是用的LSTMCell,然后为其封装attentionwrapperdecoder_cell=self._create_rnn_cell()decoder_cell=tf.contrib.seq2seq.AttentionWrapper(cell=decoder_cell,attention_mechanism=attention_mechanism,attention_layer_size=self.rnn_size,name='Attention_Wrapper')#如果使用beam_seach则batch_size=self.batch_size*self.beam_size。因为之前已经复制过一次#batch_size=self.batch_sizeifnotself.beam_searchelseself.batch_size*self.beam_sizebatch_size=self.batch_size#定义decoder阶段的初始化状态,直接使用encoder阶段的最后一个隐层状态进行赋值decoder_initial_state=decoder_cell.zero_state(batch_size=batch_size,dtype=tf.float32).clone(cell_state=encoder_state)output_layer=tf.layers.Dense(self.vocab_size,kernel_initializer=tf.truncated_normal_initializer(mean=0.0,stddev=0.1))ifself.mode=='train':#定义decoder阶段的输入,其实就是在decoder的target开始处添加一个,并删除结尾处的,并进行embedding。#decoder_inputs_embedded的shape为[batch_size,decoder_targets_length,embedding_size]ending=tf.strided_slice(self.decoder_targets,[0,0],[self.batch_size,-1],[1,1])decoder_input=tf.concat([tf.fill([self.batch_size,1],self.word_to_idx['']),ending],1)decoder_inputs_embedded=tf.nn.embedding_lookup(embedding,decoder_input)#训练阶段,使用TrainingHelper+BasicDecoder的组合,这一般是固定的,当然也可以自己定义Helper类,实现自己的功能training_helper=tf.contrib.seq2seq.TrainingHelper(inputs=decoder_inputs_embedded,sequence_length=self.decoder_targets_length,time_major=False,name='training_helper')training_decoder=tf.contrib.seq2seq.BasicDecoder(cell=decoder_cell,helper=training_helper,initial_state=decoder_initial_state,output_layer=output_layer)#调用dynamic_decode进行解码,decoder_outputs是一个namedtuple,里面包含两项(rnn_outputs,sample_id)#rnn_output:[batch_size,decoder_targets_length,vocab_size],保存decode每个时刻每个单词的概率,可以用来计算loss#sample_id:[batch_size],tf.int32,保存最终的编码结果。可以表示最后的答案decoder_outputs,_,_=tf.contrib.seq2seq.dynamic_decode(decoder=training_decoder,impute_finished=True,maximum_iterations=self.max_target_sequence_length)#根据输出计算loss和梯度,并定义进行更新的AdamOptimizer和train_opself.decoder_logits_train=tf.identity(decoder_outputs.rnn_output)self.decoder_predict_train=tf.argmax(self.decoder_logits_train,axis=-1,name='decoder_pred_train')#使用sequence_loss计算loss,这里需要传入之前定义的mask标志self.loss=tf.contrib.seq2seq.sequence_loss(logits=self.decoder_logits_train,targets=self.decoder_targets,weights=self.mask)#Trainingsummaryforthecurrentbatch_losstf.summary.scalar('loss',self.loss)self.summary_op=tf.summary.merge_all()optimizer=tf.train.AdamOptimizer(self.learing_rate)trainable_params=tf.trainable_variables()gradients=tf.gradients(self.loss,trainable_params)clip_gradients,_=tf.clip_by_global_norm(gradients,self.max_gradient_norm)self.train_op=optimizer.apply_gradients(zip(clip_gradients,trainable_params))elifself.mode=='decode':start_tokens=tf.ones([self.batch_size,],tf.int32)*self.word_to_idx['']end_token=self.word_to_idx['']#decoder阶段根据是否使用beam_search决定不同的组合,#如果使用则直接调用BeamSearchDecoder(里面已经实现了helper类)#如果不使用则调用GreedyEmbeddingHelper+BasicDecoder的组合进行贪婪式解码ifself.beam_search:inference_decoder=tf.contrib.seq2seq.BeamSearchDecoder(cell=decoder_cell,embedding=embedding,start_tokens=start_tokens,end_token=end_token,initial_state=decoder_initial_state,beam_width=self.beam_size,output_layer=output_layer)else:decoding_helper=tf.contrib.seq2seq.GreedyEmbeddingHelper(embedding=embedding,start_tokens=start_tokens,end_token=end_token)inference_decoder=tf.contrib.seq2seq.BasicDecoder(cell=decoder_cell,helper=decoding_helper,initial_state=decoder_initial_state,output_layer=output_layer)decoder_outputs,_,_=tf.contrib.seq2seq.dynamic_decode(decoder=inference_decoder,maximum_iterations=10)#调用dynamic_decode进行解码,decoder_outputs是一个namedtuple,#对于不使用beam_search的时候,它里面包含两项(rnn_outputs,sample_id)#rnn_output:[batch_size,decoder_targets_length,vocab_size]#sample_id:[batch_size,decoder_targets_length],tf.int32#对于使用beam_search的时候,它里面包含两项(predicted_ids,beam_search_decoder_output)#predicted_ids:[batch_size,decoder_targets_length,beam_size],保存输出结果#beam_search_decoder_output:BeamSearchDecoderOutputinstancenamedtuple(scores,predicted_ids,parent_ids)#所以对应只需要返回predicted_ids或者sample_id即可翻译成最终的结果ifself.beam_search:self.decoder_predict_decode=decoder_outputs.predicted_idselse:self.decoder_predict_decode=tf.expand_dims(decoder_outputs.sample_id,-1)

训练阶段对于训练阶段,需要执行self.train_op, self.loss, self.summary_op三个op,并传入相应的数据

deftrain(self,sess,batch):#对于训练阶段,需要执行self.train_op,self.loss,self.summary_op三个op,并传入相应的数据feed_dict={self.encoder_inputs:batch.encoder_inputs,self.encoder_inputs_length:batch.encoder_inputs_length,self.decoder_targets:batch.decoder_targets,self.decoder_targets_length:batch.decoder_targets_length,self.keep_prob_placeholder:0.5,self.batch_size:len(batch.encoder_inputs)}_,loss,summary=sess.run([self.train_op,self.loss,self.summary_op],feed_dict=feed_dict)returnloss,summary

评估阶段对于eval阶段,不需要反向传播,所以只执行self.loss, self.summary_op两个op,并传入相应的数据

defeval(self,sess,batch):#对于eval阶段,不需要反向传播,所以只执行self.loss,self.summary_op两个op,并传入相应的数据feed_dict={self.encoder_inputs:batch.encoder_inputs,self.encoder_inputs_length:batch.encoder_inputs_length,self.decoder_targets:batch.decoder_targets,self.decoder_targets_length:batch.decoder_targets_length,self.keep_prob_placeholder:1.0,self.batch_size:len(batch.encoder_inputs)}loss,summary=sess.run([self.loss,self.summary_op],feed_dict=feed_dict)returnloss,summary

预测阶段infer阶段只需要运行最后的结果,不需要计算loss,所以feed_dict只需要传入encoder_input相应的数据即可

definfer(self,sess,batch):#infer阶段只需要运行最后的结果,不需要计算loss,所以feed_dict只需要传入encoder_input相应的数据即可feed_dict={self.encoder_inputs:batch.encoder_inputs,self.encoder_inputs_length:batch.encoder_inputs_length,self.keep_prob_placeholder:1.0,self.batch_size:len(batch.encoder_inputs)}predict=sess.run([self.decoder_predict_decode],feed_dict=feed_dict)returnpredict

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Decoder
    +关注

    关注

    0

    文章

    25

    浏览量

    10655
  • 梯度
    +关注

    关注

    0

    文章

    30

    浏览量

    10259
  • 机器翻译
    +关注

    关注

    0

    文章

    138

    浏览量

    14794

原文标题:使用Seq2Seq+attention实现简单的Chatbot

文章出处:【微信号:atleadai,微信公众号:LeadAI OpenLab】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Attention的具体原理详解

    注意力机制Attention mechanism在序列学习任务上具有巨大的提升作用,在编解码器框架内,通过在编码段加入A模型,对源数据序列进行数据加权变换,或者在解码端引入A模型,对目标数据进行加权变化,可以有效提高序列对序列的自然方式下的系统表现。
    发表于 11-23 10:44 7761次阅读

    深度学习模型介绍,Attention机制和其它改进

    al. 于2016年提出了PCNNs+Attention(APCNNs)算法。相比之前的PCNNs模型,该算法在池化层之后,softmax层之前加入了一种基于句子级别的attention机制,算法的示意图如下:
    的头像 发表于 03-22 15:41 1.8w次阅读
    深度学习模型介绍,<b class='flag-5'>Attention</b><b class='flag-5'>机制</b>和其它改进

    一种通过引入硬注意力机制来引导学习视觉回答任务的研究

    此外,通过对特征向量的 L2 正则化处理来选择重要性特征,我们的视觉问答框架进一步采用硬注意力机制进行增强。我们将最初的版本成为硬注意力网络 HAN (Hard Attention Network
    的头像 发表于 10-04 09:23 5230次阅读

    究竟Self-Attention结构是怎样的?

    当我们处理Thinking这个词时,我们需要计算句子中所有词与它的Attention Score,这就像将当前词作为搜索的query,去和句子中所有词(包含该词本身)的key去匹配,看看相关度有多高。
    的头像 发表于 07-18 14:29 1.6w次阅读
    究竟Self-<b class='flag-5'>Attention</b>结构是怎样的?

    知识蒸馏是一种模型压缩常见方法

    Attention Transfer , 传递teacher网络的attention信息给student网络。首先,CNN的attention一般分为两种,spatial-attention
    的头像 发表于 07-27 07:08 1.5w次阅读
    知识蒸馏是一种模型压缩常见方法

    首个基于深度学习的端到端在线手写数学公式识别模型

    TAP 延续了会议文章 [1] 中的 Encoder 框架,在 Attention 机制上针对在线手写公式识别提出了 Spatial Attention, Temporal Attention
    的头像 发表于 09-20 15:35 8349次阅读
    首个基于深度学习的端到端在线手写数学公式识别模型

    一种自监督同变注意力机制,利用自监督方法来弥补监督信号差异

    本文提出了一种自监督同变注意力机制(self-supervised equivariant attention mechanism,简称SEAM),利用自监督方法来弥补监督信号差异。在强监督语义分割的数据增广阶段,像素层级标注和输入图像需经过相同的仿射变换
    的头像 发表于 05-12 10:16 7422次阅读
    一种自监督同变注意力<b class='flag-5'>机制</b>,利用自监督方法来弥补监督信号差异

    使用知识图谱作为输入的表征,研究一个端到端的graph-to-text生成系统

    graph-to-text的一个重要任务是从 Abstract Meaning Representation (AMR) graph生成内容,其中图的编码方法主要有graph
    的头像 发表于 08-28 10:28 3635次阅读
    使用知识图谱作为输入的表征,研究一个端到端的graph-to-text生成系统

    基于BERT+Bo-LSTM+Attention的病历短文分类模型

    病历文本的提取与自动分类的方法具有很大的临床价值。文中尝试提出一种基于BERT十 BI-LSTM+ Attention融合的病历短文本分类模型。使用BERT预处理获取短文本向量作为模型输入,对比BERT与 word2vec模型的预训练效果,对比Bⅰ-LSTM十 Atten
    发表于 04-26 14:30 13次下载
    基于BERT+Bo-LSTM+<b class='flag-5'>Attention</b>的病历短文分类模型

    一种Attention-CNN恶意代码检测模型

    。首先结合卷积神经网络(CNN)和注意力机制,构建了Δ ttention-CNN恶意代码检测模型;然后将恶意代码转化为灰度图像作为模型输入,通过对 Attention-CNN模型训练及测试得到恶意代码对应的注意力图以及检测果;最终将从恶意代码注意力图中提取的重要字节
    发表于 04-27 10:31 32次下载
    一种<b class='flag-5'>Attention</b>-CNN恶意代码检测模型

    简述深度学习中的Attention机制

    Attention机制在深度学习中得到了广泛的应用,本文通过公式及图片详细讲解attention机制的计算过程及意义,首先从最早引入attentio
    的头像 发表于 02-22 14:21 1058次阅读
    简述深度学习中的<b class='flag-5'>Attention</b><b class='flag-5'>机制</b>

    解析ChatGPT背后的技术演进

      Attention注意力机制与Transformer是大语言模型的基石。  1)Attention机制在并行计算(效率更高)以及解决长距离信息依赖的能力(效果更好)上优于过去的神经
    发表于 03-29 16:57 1次下载

    计算机视觉中的注意力机制

    计算机视觉中的注意力机制 卷积神经网络中常用的Attention 参考 注意力机制简介与分类 注意力机制Attention Mechan
    发表于 05-22 09:46 0次下载
    计算机视觉中的注意力<b class='flag-5'>机制</b>

    如何理解attention中的Q,K,V?

    设三种操作的输入都是同一个矩阵(暂且先别管为什么输入是同一个矩阵),这里暂且定为长度为L的句子,每个token的特征维度是768,那么输入就是(L,768),每一行就是一个字。
    的头像 发表于 12-04 09:40 361次阅读
    如何理解<b class='flag-5'>attention</b>中的Q,K,V?

    降低Transformer复杂度O(N^2)的方法汇总

    首先来详细说明为什么Transformer的计算复杂度是 。将Transformer中标准的Attention称为Softmax Attention。令 为长度为 的序列, 其维度为 , 。 可看作Softmax Attention
    的头像 发表于 12-04 15:31 498次阅读
    降低Transformer复杂度O(N^2)的方法汇总