告别硬接线!用Python+ModbusRTU纯软件控制台达ASDA-B2伺服电机(附完整代码)
2026/6/11 4:23:14
很多人以为:
“位置编码只是几个数字,怎么就让模型知道左边右边、上下?”
实际上理解这个问题,只需要搞清楚两件事:
本质很简单:
比如:
pos[1] = [0.1, 0.5, -0.3, ...] # 左上 pos[2] = [-0.2, 0.9, 0.1, ...] # 右上 pos[195] = [... ...] # 左下 pos[196] = [... ...] # 右下patch_feature[i] + pos[i]现在每个 patch 的 embedding 都不同了,不仅包含内容,还包含位置。
这一点非常关键:
Transformer 会把输入当作一个序列,每个 token 都是独一无二的。位置编码保证每个 patch 的“ID”不一样。
Transformer 的注意力更新公式:
Attention(Q, K, V) Q = Wq * (patch + pos) K = Wk * (patch + pos) V = Wv * (patch + pos)也就是说:
于是注意力权重:
softmax(Q_i · K_j)会自动包含:
举例:
→ 注意力更容易连通它们
→ 模型从注意力结构中学到“它们是邻居”
→ 注意力连接更弱
→ 模型学到“它们距离远”
注意力矩阵逐渐学到二维空间拓扑结构。
你可能会问:
“位置编码不是 1D 的序列吗?为什么能学出 2D 结构?”
原因是:
row 0: pos[1] pos[2] ... pos[14] row 1: pos[15] pos[16] ... pos[28] ... row 13: pos[183] ... pos[196]训练梯度会强烈驱动:
最终,pos 会自发组织成二维坐标嵌入。
这个现象已被大量论文可视化证实(PCA 会形成完美的 2D 网格)。
因为注意力机制是基于向量内积的:
Q_i · K_j = f(内容差异 + 位置差异)如果 Q 和 K 包含位置信息,那么:
所以加法并不是简单的数学加法,它的意义是:
把“位置 ID”注入到每个 patch,使 Transformer 可以根据位置差异计算注意力连通性,从而理解空间结构。
假设:
patch_content = [5, 5, 5, 5]内容都一样 => 模型无法分辨它们是谁。
加入位置向量:
pos[1] = [1, 0, 0, 0] # 左上 pos[2] = [0, 1, 0, 0] # 右上 pos[3] = [0, 0, 1, 0] # 左下 pos[4] = [0, 0, 0, 1] # 右下相加后:
token1 = [6,5,5,5] token2 = [5,6,5,5] token3 = [5,5,6,5] token4 = [5,5,5,6]Transformer 现在立刻能区分每个 patch。
注意力中:
Q1 与 K2 以内积很高(相邻) Q1 与 K4 以内积很低(最远)这就是“空间信息”。
因为:
一句话:
位置编码 = 给 Transformer 一个“坐标”,让它通过注意力学习图像的二维结构。