1.Multiheads-Self-Attentiona简介 多头自注意力机制可以分为以下几个主要步骤: 1.1查询、键和值的线性变换 1.2多头注意力权重的计算 1.3多头上下文向量的计算 1.4多头上下文的融合 多头自注意力机制的优势在于可以并行地学习多组不同的注意力权重,从而能够提取不同层次、不同类型的相关信息。通过引入多头机制,模型可以同时关注序列中的多个位置,并从不同的角度对序列进行编码,提高了模型的表达能力和泛化能力。 图中h就是代表头的数量,这个是transformer结构的一部分 2.代码实现Multi-heads-Self-Attentiona结构 import torch import torch.nn.functional as F # 一个形状为 (batch_size, seq_len, feature_dim) 的张量 x x = torch.randn(2, 3, 4) # 形状 (batch_size, seq_len, feature_dim) # 定义头数和每个头的维度 num_heads = 2 head_dim = 2 # feature_dim 必须是 num_heads * head_dim 的整数倍 assert x.size(-1) == num_heads * head_dim # 定义线性层用于将 x 转换为 Q, K, V 向量 linear_q = torch.nn.Linear(4, 4) linear_k = torch.nn.Linear(4, 4) linear_v = torch.nn.Linear(4, 4) # 通过线性层计算 Q, K, V Q = linear_q(x) # 形状 (batch_size, seq_len, feature_dim) K = linear_k(x) # 形状 (batch_size, seq_len, feature_dim) V = linear_v(x) # 形状 (batch_size, seq_len, feature_dim) # 将 Q, K, V 分割成 num_heads 个头 def split_heads(tensor, num_heads): batch_size, seq_len, feature_dim = tensor.size() head_dim = feature_dim // num_heads output = tensor.view(batch_size, seq_len, num_heads, head_dim).transpose(1, 2) return output # 形状 (batch_size, num_heads, seq_len, feature_dim) Q = split_heads(Q, num_heads) # 形状 (batch_size, num_heads, seq_len, head_dim) K = split_heads(K, num_heads) # 形状 (batch_size, num_heads, seq_len, head_dim) V = split_heads(V, num_heads) # 形状 (batch_size, num_heads, seq_len, head_dim) # 计算 Q 和 K 的点积,作为相似度分数 , 也就是自注意力原始权重 raw_weights = torch.matmul(Q, K.transpose(-2, -1)) # 形状 (batch_size, num_heads, seq_len, seq_len) # 对自注意力原始权重进行缩放 scale_factor = K.size(-1) ** 0.5 scaled_weights = raw_weights / scale_factor # 形状 (batch_size, num_heads, seq_len, seq_len) # 对缩放后的权重进行 softmax 归一化,得到注意力权重 attn_weights = F.softmax(scaled_weights, dim=-1) # 形状 (batch_size, num_heads, seq_len, seq_len) # 将注意力权重应用于 V 向量,计算加权和,得到加权信息 attn_outputs = torch.matmul(attn_weights, V) # 形状 (batch_size, num_heads, seq_len, head_dim) # 将所有头的结果拼接起来 def combine_heads(tensor, num_heads): batch_size, num_heads, seq_len, head_dim = tensor.size() feature_dim = num_heads * head_dim output = tensor.transpose(1, 2).contiguous().view(batch_size, seq_len, feature_dim) return output# 形状 : (batch_size, seq_len, feature_dim) attn_outputs = combine_heads(attn_outputs, num_heads) # 形状 (batch_size, seq_len, feature_dim) # 对拼接后的结果进行线性变换 linear_out = torch.nn.Linear(4, 4) attn_outputs = linear_out(attn_outputs) # 形状 (batch_size, seq_len, feature_dim) print(" 加权信息 :", attn_outputs) 在我的其它文章中详细介绍了transformer和gpt的结构,具体代码见此专栏的其他文章 3.总结 综上所述,多头自注意力机制通过引入多组注意力头,可以并行学习多个不同的注意力权重,从而能够提取不同层次、不同类型的相关信息,增强模型的表达能力和泛化能力。它是当前很多自然语言处理任务中常用的重要注意力机制之一。 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明vb.net教程C#教程python教程。 原文链接:https://blog.csdn.net/L_goodboy/article/details/135786201 |
|
来自: 昵称21609410 > 《python》