商务网站建设ppt模板,大型网站开发实例,自适应网站手机端,建站公司跑路了域名怎么办双向注意力是同时建模两个序列之间双向信息流动的注意力机制#xff0c;广泛应用于机器翻译、问答系统、多模态融合等任务。以下是深度解析#xff1a; 1. 核心概念与原理 什么是双向注意力#xff1f; 定义#xff1a;双向注意力同时计算两个方向的信息流动#xff1a; 方…双向注意力是同时建模两个序列之间双向信息流动的注意力机制广泛应用于机器翻译、问答系统、多模态融合等任务。以下是深度解析1. 核心概念与原理什么是双向注意力定义双向注意力同时计算两个方向的信息流动方向 1序列 A → 序列 BA 作为 QueryB 作为 Key/Value方向 2序列 B → 序列 AB 作为 QueryA 作为 Key/Value序列 A:[a1, a2, a3,..., aN]↓↑ ↓↑ ↓↑ 序列 B:[b1, b2, b3,..., bM]双向注意力Attention(A→B) Attention(B→A)2. 数学形式化标准注意力单向# A → B 的单向注意力Attention(QA,KB,VB)softmax(QK^T/√d)· V双向注意力双向# 双向注意力 两个单向注意力的组合BidirectionalAttention(A,B){# 方向 1: A → Battn_A_to_Bsoftmax(A · B^T/√d)· B# [N, D]# 方向 2: B → Aattn_B_to_Asoftmax(B · A^T/√d)· A# [M, D]# 合并输出可选outputconcat(attn_A_to_B,attn_B_to_A)# 或其他融合方式}3、双向注意力的类型3.1. 对称双向注意力Symmetric Bidirectional Attention特点两个方向使用相同的参数适用场景对称任务如语义相似度计算classSymmetricBidirectionalAttention(nn.Module):def__init__(self,embed_dim,num_heads):super().__init__()self.attnnn.MultiheadAttention(embed_dim,num_heads,batch_firstTrue)defforward(self,A,B):# A → Battn_A_to_B,_self.attn(A,B,B)# B → A使用相同的参数attn_B_to_A,_self.attn(B,A,A)returnattn_A_to_B,attn_B_to_A3.2. 非对称双向注意力Asymmetric Bidirectional Attention• 特点两个方向使用独立的参数• 适用场景非对称任务如机器翻译、问答classAsymmetricBidirectionalAttention(nn.Module):def__init__(self,embed_dim,num_heads):super().__init__()# 独立的注意力头self.attn_A_to_Bnn.MultiheadAttention(embed_dim,num_heads,batch_firstTrue)self.attn_B_to_Ann.MultiheadAttention(embed_dim,num_heads,batch_firstTrue)defforward(self,A,B):# A → Battn_A_to_B,_self.attn_A_to_B(A,B,B)# B → Aattn_B_to_A,_self.attn_B_to_A(B,A,A)returnattn_A_to_B,attn_B_to_A3.3. 交叉双向注意力Cross Bidirectional Attention特点在 Transformer 层中交替使用两个方向适用场景多模态融合如视觉-语言classCrossBidirectionalAttention(nn.Module):def__init__(self,embed_dim,num_heads):super().__init__()self.attn_A_to_Bnn.MultiheadAttention(embed_dim,num_heads,batch_firstTrue)self.attn_B_to_Ann.MultiheadAttention(embed_dim,num_heads,batch_firstTrue)self.norm1nn.LayerNorm(embed_dim)self.norm2nn.LayerNorm(embed_dim)defforward(self,A,B):# 第一层A → Battn_A_to_B,_self.attn_A_to_B(A,B,B)A_enhancedself.norm1(Aattn_A_to_B)# 第二层B → A使用增强后的 Aattn_B_to_A,_self.attn_B_to_A(B,A_enhanced,A_enhanced)B_enhancedself.norm2(Battn_B_to_A)returnA_enhanced,B_enhanced3. 与其他注意力机制对比4.完整实现示例基础双向注意力层importtorchimporttorch.nnasnnimporttorch.nn.functionalasFclassBidirectionalAttention(nn.Module): 双向注意力层同时建模 A→B 和 B→A 的信息流动 def__init__(self,embed_dim,num_heads8,dropout0.1):super().__init__()self.embed_dimembed_dim self.num_headsnum_heads# 独立的注意力头非对称self.attn_A_to_Bnn.MultiheadAttention(embed_dim,num_heads,dropoutdropout,batch_firstTrue)self.attn_B_to_Ann.MultiheadAttention(embed_dim,num_heads,dropoutdropout,batch_firstTrue)# LayerNorm 和 Dropoutself.norm_Ann.LayerNorm(embed_dim)self.norm_Bnn.LayerNorm(embed_dim)self.dropoutnn.Dropout(dropout)defforward(self,A,B,attn_mask_ANone,attn_mask_BNone): Args: A: (batch_size, seq_len_A, embed_dim) B: (batch_size, seq_len_B, embed_dim) attn_mask_A: (batch_size, seq_len_A) - 可选 attn_mask_B: (batch_size, seq_len_B) - 可选 Returns: A_enhanced: (batch_size, seq_len_A, embed_dim) B_enhanced: (batch_size, seq_len_B, embed_dim) # 方向 1: A → Battn_A_to_B,attn_weights_A_to_Bself.attn_A_to_B(queryA,keyB,valueB,key_padding_maskattn_mask_B)A_enhancedself.norm_A(Aself.dropout(attn_A_to_B))# 方向 2: B → Aattn_B_to_A,attn_weights_B_to_Aself.attn_B_to_A(queryB,keyA_enhanced,# 使用增强后的 AvalueA_enhanced,key_padding_maskattn_mask_A)B_enhancedself.norm_B(Bself.dropout(attn_B_to_A))returnA_enhanced,B_enhanced,attn_weights_A_to_B,attn_weights_B_to_A堆叠双向注意力Transformer 风格classBidirectionalAttentionEncoder(nn.Module): 堆叠多层双向注意力 def__init__(self,embed_dim,num_layers6,num_heads8,dropout0.1):super().__init__()self.layersnn.ModuleList([BidirectionalAttention(embed_dim,num_heads,dropout)for_inrange(num_layers)])self.norm_Ann.LayerNorm(embed_dim)self.norm_Bnn.LayerNorm(embed_dim)defforward(self,A,B,attn_mask_ANone,attn_mask_BNone): 逐层堆叠双向注意力 forlayerinself.layers:A,B,_,_layer(A,B,attn_mask_A,attn_mask_B)Aself.norm_A(A)Bself.norm_B(B)returnA,B完整的双向注意力模型classBidirectionalAttentionModel(nn.Module): 完整的双向注意力模型以问答为例 def__init__(self,vocab_size,embed_dim512,num_layers6,num_heads8):super().__init__()# Embedding 层self.embeddingnn.Embedding(vocab_size,embed_dim)# 双向注意力编码器self.encoderBidirectionalAttentionEncoder(embed_dimembed_dim,num_layersnum_layers,num_headsnum_heads)# 输出层self.output_projnn.Linear(embed_dim,vocab_size)defforward(self,question_ids,document_ids,question_maskNone,document_maskNone): Args: question_ids: (batch_size, seq_len_q) document_ids: (batch_size, seq_len_d) question_mask: (batch_size, seq_len_q) - padding mask document_mask: (batch_size, seq_len_d) - padding mask # Embeddingquestion_embedself.embedding(question_ids)# [B, Q, D]document_embedself.embedding(document_ids)# [B, D, D]# 双向注意力编码question_enhanced,document_enhancedself.encoder(question_embed,document_embed,question_mask,document_mask)# 输出以问题增强表示为例logitsself.output_proj(question_enhanced)# [B, Q, vocab_size]returnlogits,question_enhanced,document_enhanced