当前位置: 首页 > news >正文

直播网站开发合同无效的12种情形

直播网站开发,合同无效的12种情形,软件定制开发公司官网,wordpress虚拟买卖模板Transformer之多头注意力机制和位置编码(二) 文章目录Transformer之多头注意力机制和位置编码(二)一、 多头注意力(Multi-Head Attention)案例二、位置编码(Positional Encoding)2.1…

Transformer之多头注意力机制和位置编码(二)

文章目录

  • Transformer之多头注意力机制和位置编码(二)
  • 一、 多头注意力(Multi-Head Attention)
    • 案例
  • 二、位置编码(Positional Encoding)
    • 2.1 固定正弦/余弦
    • 2.2 可学习编码


一、 多头注意力(Multi-Head Attention)

先把整句映射成 Q、K、V,再按列切分 → 多头并行计算

核心公式

headh=Attention(QWhQ,KWhK,VWhV)MultiHead(Q,K,V)=[head1;…;headH]WO\begin{aligned} \mathrm{head}_h &= \mathrm{Attention}(Q W^Q_h,\,K W^K_h,\,V W^V_h) \\[2pt] \mathrm{MultiHead}(Q,K,V) &= [\mathrm{head}_1;\dots;\mathrm{head}_H]W^O \end{aligned} headhMultiHead(Q,K,V)=Attention(QWhQ,KWhK,VWhV)=[head1;;headH]WO

步骤速览

  1. 分头映射dim=512, head_num=8 → 每头 d_k=64
    head_num, d_k = 8, dim // 8
    W_Q = nn.Linear(dim, dim)
    Q_h = W_Q(x).view(b, seq, head_num, d_k).transpose(1, 2)  # [b, 8, seq, 64]
    # K_h, V_h 同理
    
  2. 并行注意力(缩放点积 + softmax)
  3. 拼接 + 线性
    out = out.transpose(1, 2).contiguous().view(b, seq, dim)
    out = nn.Linear(dim, dim)(out)          # 最终输出 [b, seq, 512]
    
2 个头 = 2 组独立 (Q,K,V) 子空间

表达能力
不同头关注不同模式(句法、语义、指代…),组合后更灵活。

案例

下面给出可直接复用的“多头注意力”最小实现。

特点

  • nn.Module 封装,方便后续放进 nn.Sequential 或 Transformer;
  • 逐行中文注释,一眼看懂每一步在干什么;
  • 输出维度与原句向量一致 [batch, seq_len, dim],后续可继续堆叠。
import math
import torch
import torch.nn as nn
import torch.nn.functional as Fclass MultiHeadAttention(nn.Module):"""简化版多头注意力dim        : 模型总维度(你的例子里是 256)head_num   : 头数(你的例子里是 16)输出形状   : [batch, seq_len, dim]"""def __init__(self, dim: int = 256, head_num: int = 16):super().__init__()# assert :“必须保证 dim 能被 head_num 整除,否则就报错。”assert dim % head_num == 0 self.dim = dimself.head_num = head_numself.d_k = dim // head_num          # 每个头的维度# 3 个线性层一次性把 Q/K/V 投影出来(比 ModuleList 更简洁)self.W_q = nn.Linear(dim, dim)self.W_k = nn.Linear(dim, dim)self.W_v = nn.Linear(dim, dim)# 最后的输出线性变换self.W_o = nn.Linear(dim, dim)def forward(self, x):"""x : [batch, seq_len, dim]return : 与 x 形状相同"""batch, seq_len, _ = x.shape# 1) 线性投影 → [batch, seq_len, dim]Q = self.W_q(x)K = self.W_k(x)V = self.W_v(x)# 2) 拆成多头 → [batch, head_num, seq_len, d_k]def reshape(t):return t.view(batch, seq_len, self.head_num, self.d_k).transpose(1, 2)Q = reshape(Q)   # [batch, head_num, seq_len, d_k]K = reshape(K)V = reshape(V)# 3) 缩放点积注意力scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(self.d_k)  # [B,h,seq,seq]attn = F.softmax(scores, dim=-1)                                      # 归一化out = torch.matmul(attn, V)                                           # [B,h,seq,d_k]# 4) 合并多头 → [batch, seq_len, dim]out = out.transpose(1, 2).contiguous().view(batch, seq_len, self.dim)# 5) 最后线性变换return self.W_o(out)# ------------------ 测试 ------------------
if __name__ == "__main__":sentences = ["i am an NLPer"]vocab = sorted({w for sent in sentences for w in sent.split()})word2idx = {w: i for i, w in enumerate(vocab)}indices = torch.tensor([[word2idx[w] for w in sent.split()] for sent in sentences])dim = 256embedding = nn.Embedding(len(vocab), dim)x = embedding(indices)                  # [1, 4, 256]mha = MultiHeadAttention(dim=256, head_num=16)y = mha(x)                              # [1, 4, 256]print("输入:", x.shape)print("输出:", y.shape)

运行结果

输入: torch.Size([1, 4, 256])
输出: torch.Size([1, 4, 256])

二、位置编码(Positional Encoding)

自注意力本身“无顺序”,需显式注入位置信号。

2.1 固定正弦/余弦

给定位置 i 与维度 2j / 2j+1
PE(i,2j)=sin⁡⁣(i100002j/d)PE(i,2j+1)=cos⁡⁣(i100002j/d)\begin{aligned} PE(i,2j) &= \sin\!\left(\dfrac{i}{10000^{2j/d}}\right) \\[4pt] PE(i,2j+1) &= \cos\!\left(\dfrac{i}{10000^{2j/d}}\right) \end{aligned} PE(i,2j)PE(i,2j+1)=sin(100002j/di)=cos(100002j/di)

  • 例子:句子 <BOS> 我 喜欢 自然语言 处理(N=5, d=512)
    计算得到的 5×512 位置矩阵与词嵌入逐位相加即可。
    说明:

  • iii 是序列中位置的索引(从 000 开始)。

  • jjj 是词向量的维度索引(从 000d/2−1d/2 - 1d/21)。

  • 100001000010000 是一个超参数,用于控制频率的衰减。

句子长度为 555,编码向量维数 D=4D=4D=4
  • 外推特性
    已知 PE(pos)PE(pos)PE(pos) 可线性组合得到 PE(pos+k)PE(pos+k)PE(pos+k),模型可处理比训练集更长的句子。
505050 个词嵌入,维度 512512512 的位置编码热力图

2.2 可学习编码

直接把位置当 token 训,表现好但依赖最大长度超参。


小结
多头 = “多组独立子空间”并行注意力;
位置编码 = “给并行计算加上顺序感”。二者配合让 Transformer 既能并行又能保持序列有序。

http://www.dtcms.com/a/602260.html

相关文章:

  • 好看简单易做的网站手机网站网页开发教程
  • 青海住房和建设厅网站单一本地门户网站源码
  • 侯捷先生“剖析Qt容器的实现原理“
  • 重庆二级站seo整站优化排名国外流行的内容网站
  • 车载以太网 - SOME/IP简介
  • 宿州学校网站建设网站建设需求模板
  • 网站开发 密码做一个京东这样的网站需要多少钱
  • anylogic导出为java独立应用程序 运行bat报错解决方法
  • c语言编译爱心 | 学习如何用C语言编译打印爱心图案
  • 网站建设三种方法游戏代理加盟平台
  • 公司网站ICP注销wordpress主题详细安装流程
  • 简单梳理下RSA和AES加解密文件的流程图
  • PostgreSQL遍历所有的表并设置id为自增主键
  • 免费的网站域名域名网站这么做
  • 虚拟化hypervisor:Xen简介
  • 【路径算法】基于JavaScript实现IDA*算法,动态可视化展示路径规划过程
  • 做境外网站临汾住房与城乡建设厅网站
  • 淘宝做链接的网站广告营销专业
  • 【网络编程基础知识】
  • js中哪些数据在栈上,哪些数据在堆上?
  • 上海云盾sdk游戏盾对比传统高防ip的优势
  • 系统配置重复项处理:经验未必可靠
  • 网站开发与应用 大作业作业辽宁省建设培训中心网站
  • 服务器与普通个人电脑的主要区别是什么?
  • 亚购物车功能网站怎么做的百度软件应用市场
  • 二项分布(Binomial Distribution)详解:从理论到实践
  • 深圳有没有什么网站重庆顶呱呱网站建设
  • 国外网站 设计成都注册公司核名网站
  • 衡阳网站建设开发价格谷歌推广新手教程
  • 【2025最新】05 Spring Security 构建 RESTful Web 注册服务