python神经网络编程入门(三十三)——多头注意力(Multi-Head Attention)

📍 路标 :本篇位于《从零构建 Transformer》系列 第 4/16 章 · 基石篇

系列主线:注意力思想 → 自注意力 → 多头 → 位置编码 → 编解码架构 → 手撕实现 → 预训练模型 → 实战微调 → 知识收官

进度:▸ 基石篇(1-5·本篇) ▸ 架构篇(6-10) ▸ 预训练篇(11-13) ▸ 实战篇(14-16)
上一篇(三十二):缩放点积注意力:打分、归一、加权


引言:一个"头"够吗?

上一章我们把自注意力补全成了标准形式:

Attention ( Q , K , V ) = softmax ( Q K ⊤ d k ) V \text{Attention}(Q,K,V)=\text{softmax}\Big(\frac{QK^\top}{\sqrt{d_k}}\Big)V Attention(Q,K,V)=softmax(dk QK⊤)V

它已经能"让词和词互相对话",还能靠缩放保护梯度。听起来很完整了,对吧?

但细想一下,这里有个隐含的硬伤 :整个过程是一次 打分、一次 softmax、一次 加权求和。也就是说,模型用一套 Q、K、V一套权重矩阵 ,把"这句话里谁是重点"这件极其复杂的事,强行揉进一个注意力分布里。

打个比方:一个词在句子里同时承担着多种"关系"------它和相邻词有语法关系 ,和某个远方的名词有指代关系 ,和动词有语义关系 。如果只用一个注意力分布,就好比让一个专家同时回答语法、语义、指代三个领域的问题,他既看不过来,也顾此失彼。

更糟的是,不同关系对"该看谁"的答案往往互相打架:看语法时该盯着紧挨的词,看指代时该盯着几格之外的那个名词。硬压进一个分布里,谁都被稀释。

🎯 本章目标

  1. 用"一个专家 vs 专家委员会"的类比,讲透为什么一个头不够;
  2. 吃透多头注意力的核心公式与结构:维度切分 + 并行注意力 + 拼接 + 线性投影
  3. 手写完整多头注意力,逐头打印 shape,验证输出与输入一致;
  4. 用数值证明"多头不增加参数量"这个关键洞察;
  5. 用同一句话的 4 个头热力图,亲眼看"多个头 = 多个视角"。

一、一个头不够:先看一个"顾此失彼"的反例

理论说得再漂亮,不如一个具体例子来得直观。考虑下面这句英文:

The animal didn't cross the street because it was too tired.

(那只动物没有过马路,因为它太累了。)

这里的 it 指谁?正常人都知道指 animal (动物)。但请注意:it 离 animal 隔着好几个词,离 street(街道)反而更近。如果模型只用一个注意力分布,它要在"it → animal"(指代关系)和"it → street"(位置邻近)之间二选一,很难两头兼顾。

再看看另一句:

The animal didn't cross the street because it was too wide.

(那只动物没有过马路,因为街道太宽了。)

同一个 it ,这里却指 street(街道)!区别只在于后面的形容词是 tired 还是 wide。

这就尴尬了:"it 该看谁,完全取决于后面的词" 。一个注意力分布根本算不过来------它要么偏爱"it → animal",要么偏爱"it → street",没法根据语境动态地同时保留两种可能

这就是引入多头的最朴素动机让不同的头各管一摊,一个头专门盯"指代",一个头专门盯"邻近",一个头专门盯"语义",最后把各头的结论拼起来。这样"it"既能带上"回指 animal"的信息,又能带上"就近 street"的信息,模型拿到完整信息后再自己判断。


二、核心思想:多头 = 维度切分 + 并行注意力 + 拼接 + 线性投影

理解了"为什么要多头",再看"多头怎么做"就顺理成章了。多头注意力把上一章的单头流程,改造成四个动作:

  1. 维度切分 :把 d m o d e l d_{model} dmodel 切成 h h h 份,每份维度 d k = d m o d e l / h d_k=d_{model}/h dk=dmodel/h。每个头只在自己的那份维度上做事;
  2. 并行注意力 : h h h 个头各自独立地做缩放点积注意力(每套 Q、K、V 都是自己的权重矩阵),互不干扰;
  3. 拼接(Concat) :把 h h h 个头的输出沿特征维拼起来,恢复成 d m o d e l d_{model} dmodel 维;
  4. 线性投影 :乘一个输出投影矩阵 W O W^O WO,把拼接结果映射回 d m o d e l d_{model} dmodel 维,得到最终输出。

用一句话记住:多头 = 把"一个专家看全维度"变成"多个专家各看一维,再拼起来"

先看全景结构图,把四个动作装进一张图里:

图里 X 在上方,向下分出 4 个分支(这里 h = 4 , d m o d e l = 8 h=4,d_{model}=8 h=4,dmodel=8,每个头只拿 d k = 2 d_k=2 dk=2 维)。每个分支内部都是上一章完整的"缩放点积注意力"。底部把这 4 个头的输出拼接 起来,再经过一层线性投影 W O W^O WO,得到最终输出。

注意一个细节 :每个头拿到的不是"一句话的另外一部分",而是同一句话的某几个维度 。也就是说,4 个头看的是同一句话,但各自用不同的权重矩阵去提取,所以它们"get 到的重点"不同------一个可能盯语法,一个可能盯指代,一个可能盯语义。这就是"多个视角"的由来。


三、数学公式与张量形状:一步步推给你看

多头注意力有一个非常整齐的数学表达式。每个头先算自己的注意力:

head i = Attention ( Q W i Q ,    K W i K ,    V W i V ) \text{head}_i = \text{Attention}\big(QW_i^Q,\; KW_i^K,\; VW_i^V\big) headi=Attention(QWiQ,KWiK,VWiV)

然后拼接所有头,再过一层输出投影:

MultiHead ( Q , K , V ) = Concat ( head 1 , ... , head h )   W O \text{MultiHead}(Q,K,V)=\text{Concat}(\text{head}_1,\dots,\text{head}_h)\,W^O MultiHead(Q,K,V)=Concat(head1,...,headh)WO

其中:

  • W i Q ∈ R d m o d e l × d k W_i^Q \in \mathbb{R}^{d_{model}\times d_k} WiQ∈Rdmodel×dk:第 i i i 个头的查询投影矩阵;
  • W i K ∈ R d m o d e l × d k W_i^K \in \mathbb{R}^{d_{model}\times d_k} WiK∈Rdmodel×dk:第 i i i 个头的键投影矩阵;
  • W i V ∈ R d m o d e l × d v W_i^V \in \mathbb{R}^{d_{model}\times d_v} WiV∈Rdmodel×dv:第 i i i 个头的值投影矩阵;
  • W O ∈ R h   d v × d m o d e l W^O \in \mathbb{R}^{h\,d_v\times d_{model}} WO∈Rhdv×dmodel:输出投影矩阵。

这里 d k d_k dk 不是随便定的,而是 d k = d m o d e l / h d_k=d_{model}/h dk=dmodel/h。这是多头最精妙的地方------维度被切分,但总维度守恒 。我们把张量形状逐层推演一遍(用一个小例子:输入 3 个词, d m o d e l = 4 d_{model}=4 dmodel=4, h = 2 h=2 h=2,所以 d k = 2 d_k=2 dk=2):

步骤 张量 Shape 说明
输入 X X X ( 3 , 4 ) (3,4) (3,4) 3 个词,每个 4 维
第 i i i 个头投影 Q W i Q QW_i^Q QWiQ ( 3 , 2 ) (3,2) (3,2) 4 维被打成 2 维
第 i i i 个头打分 Q i K i ⊤ / d k Q_iK_i^\top/\sqrt{d_k} QiKi⊤/dk ( 3 , 3 ) (3,3) (3,3) 3×3 相似度矩阵
第 i i i 个头 softmax 权重 ( 3 , 3 ) (3,3) (3,3) 行和 = 1
第 i i i 个头加权 head i \text{head}_i headi ( 3 , 2 ) (3,2) (3,2) 每个头的输出
拼接 Concat \text{Concat} Concat ( 3 , 4 ) (3,4) (3,4) h × d k = 2 × 2 = 4 h\times d_k=2\times2=4 h×dk=2×2=4 维还原
线性投影 Concat   W O \text{Concat}\,W^O ConcatWO ( 3 , 4 ) (3,4) (3,4) 最终输出

关键点:输出 shape 永远是 ( 词数 , d m o d e l ) (词数, d_{model}) (词数,dmodel),和输入一致。 第 2 章我们验证过"自注意力只改写表示、不改变词数",多头依然满足这条铁律------词还是一个不多一个不少,只是每个词的表示被"多视角"地重写了一遍。


四、手撕多头注意力:完整代码 + 逐头 shape 打印

理论齐了,直接开撕。为了让代码尽可能简单,我们先写一个最通用的缩放点积注意力(第 3 章产物),再把它当"零件"组装成多头。

第一步:先有缩放点积注意力(第 3 章零件)
python 复制代码
import numpy as np

def softmax_rows(M):
    e = np.exp(M - M.max(axis=1, keepdims=True))   # 数值稳定(减去每行最大值)
    return e / e.sum(axis=1, keepdims=True)

def scaled_dot_product_attention(Q, K, V):
    d_k = K.shape[-1]
    scores = (Q @ K.T) / np.sqrt(d_k)   # 打分 + 缩放
    weights = softmax_rows(scores)       # 行归一化成权重
    return weights @ V, weights          # 加权求和 + 返回权重

这段和第 3 章几乎一模一样,只是 softmax 里加了一步"减去每行最大值"做数值稳定(防止 e x e^x ex 溢出,对结果无影响)。

第二步:把多头注意力组装出来

多头注意力的核心是:对每个头,拿出它自己的 W i Q , W i K , W i V W_i^Q,W_i^K,W_i^V WiQ,WiK,WiV,算一个注意力,再把所有头的输出拼起来

python 复制代码
def multihead_attention(X, Wq, Wk, Wv, Wo, h):
    """多头注意力:h 个独立头,每个头 d_k = d_model // h"""
    d_model = X.shape[-1]
    d_k = d_model // h                  # 每个头分到的维度
    heads, all_w = [], []
    for i in range(h):
        Qi = X @ Wq[i]                  # (S, d_k)
        Ki = X @ Wk[i]
        Vi = X @ Wv[i]
        head_i, w_i = scaled_dot_product_attention(Qi, Ki, Vi)  # (S, d_k)
        heads.append(head_i)
        all_w.append(w_i)
    concat = np.concatenate(heads, axis=-1)  # (S, h*d_k) = (S, d_model)
    out = concat @ Wo                    # (S, d_model) 线性投影
    return out, all_w

注意 Wq 的形状是 (h, d_model, d_k)------第 0 维是头的序号Wq[i] 就是第 i i i 个头自己的查询投影矩阵,形状 (d_model, d_k)

第三步:用小例子跑通,逐头打印 shape

沿用第 2/3 章的 3 词小例子("我 love 猫", X X X 是 ( 3 , 4 ) (3,4) (3,4)),设 h = 2 h=2 h=2 个头,所以 d k = 2 d_k=2 dk=2:

python 复制代码
np.random.seed(42)
words = ['我', 'love', '猫']
X = np.array([[1.,0,0,0],[0,1.,0,0],[0,0,1.,0.2]])
d_model, h, d_k = 4, 2, 2

# 每个头各一套 Wq/Wk/Wv(d_model × d_k),外加一个输出投影 Wo(d_model × d_model)
Wq = np.random.randn(h, d_model, d_k) * 0.3
Wk = np.random.randn(h, d_model, d_k) * 0.3
Wv = np.random.randn(h, d_model, d_k) * 0.3
Wo = np.random.randn(d_model, d_model) * 0.3

out, all_w = multihead_attention(X, Wq, Wk, Wv, Wo, h)
print("输出 shape:", out.shape)   # (3, 4) 与输入一致!

真实运行结果(逐头 shape 一目了然):

复制代码
头0: Q(3, 2) K(3, 2) V(3, 2) → 注意力(3, 2) 权重(3, 3)
头1: Q(3, 2) K(3, 2) V(3, 2) → 注意力(3, 2) 权重(3, 3)
拼接 concat.shape=(3, 4) → 乘 Wo((4, 4)) → 输出 out.shape=(3, 4)
→ 输出 shape 与输入一致((3,4)→(3,4)),词数不变,维度还原!

验证要点

  • 每个头内部:Q(3,2) → 打分 (3,3) → softmax 权重 (3,3) → 加权输出 (3,2)。这是第 3 章的完整"缩放点积注意力",只是维度从 4 变成了 2;
  • 拼接后:2 个头的 (3,2) 拼成 (3,4)正好还原成 d m o d e l = 4 d_{model}=4 dmodel=4
  • Wo(4,4) 后:输出 (3,4)和输入 X X X 的 shape 完全一致

再看每个头的注意力权重(每行和 = 1,softmax 归一化正确):

复制代码
头0 · 我: [0.322 0.328 0.351]  (行和=1.000)
头0 · love: [0.348 0.296 0.356]  (行和=1.000)
头0 · 猫: [0.33  0.334 0.336]  (行和=1.000)
头1 · 我: [0.33  0.339 0.331]  (行和=1.000)
头1 · love: [0.332 0.335 0.334]  (行和=1.000)
头1 · 猫: [0.336 0.326 0.338]  (行和=1.000)

注意一个细节 :这里 2 个头的权重分布看起来几乎一样、都很平均 (每行都接近 0.33 , 0.33 , 0.33 0.33,0.33,0.33 0.33,0.33,0.33)。为什么?

因为权重矩阵是随机初始化的 ,还没经过训练。随机初始化下,所有头都"一视同仁"。只有经过训练,不同的头才会分化 出各自偏好的关注模式------这正是第 7 节"多个头 = 多个视角"要讲的事。现在先记住:多头给了"分化"的结构基础,但"分化"本身是训练学出来的


五、关键洞察:为什么多头不增加参数量?

这是很多初学者最困惑的一点:切分成多个头,参数量不是应该变多吗?

答案是:**QKV 投影的参数量,多头和单头完全一样!**让我们用一张数值表把账算清楚。

  • 单头 : d m o d e l = 4 d_{model}=4 dmodel=4,一套 W q , W k , W v W_q,W_k,W_v Wq,Wk,Wv 各是 ( 4 , 4 ) (4,4) (4,4),参数量 3 × 4 × 4 = 48 3\times4\times4=48 3×4×4=48;
  • 多头 ( h = 2 , d k = 2 h=2,d_k=2 h=2,dk=2):共 2 个头,每个头 W i Q , W i K , W i V W_i^Q,W_i^K,W_i^V WiQ,WiK,WiV 各是 ( 4 , 2 ) (4,2) (4,2),参数量 3 × 2 × ( 4 × 2 ) = 48 3\times2\times(4\times2)=48 3×2×(4×2)=48。

两者一模一样!这不是巧合,而是一个漂亮的恒等式:

3 × h × d m o d e l × d m o d e l h = 3 × d m o d e l 2 3 \times h \times d_{model} \times \frac{d_{model}}{h} = 3 \times d_{model}^2 3×h×dmodel×hdmodel=3×dmodel2

无论 h h h 取多少,d k = d m o d e l / h d_k=d_{model}/h dk=dmodel/h 代进去, h h h 都会被约掉 。多头只是把 d m o d e l × d m o d e l d_{model}\times d_{model} dmodel×dmodel 的一块大矩阵,切成 h h h 块 d m o d e l × d k d_{model}\times d_k dmodel×dk 的小矩阵而已------总参数一分不多。

用几组更大的数字验证一下这个恒等式(真实运行):

复制代码
d_model=4,  h=2:  3×2×4×2 = 3×4² = 48   ✓
d_model=8,  h=4:  3×4×8×2 = 3×8² = 192  ✓
d_model=16, h=8:  3×8×16×2 = 3×16² = 768 ✓

那多头到底多没多参数? 严格说,多头比"裸单头"多了一层输出投影 W O W^O WO ( d m o d e l × d m o d e l d_{model}\times d_{model} dmodel×dmodel,上例是 16 个参数)。但这一层是为了把拼接结果映射回 d m o d e l d_{model} dmodel 而必需的,属于"分内之事"。所以准确的说法是:

多头注意力的 QKV 投影参数和单头完全一样(都是 3 d m o d e l 2 3d_{model}^2 3dmodel2),只是多了一层映射回原维度的输出投影 W O W^O WO。多头"分工不增参"的本质,是维度切分的恒等式 h × ( d m o d e l / h ) = d m o d e l h\times(d_{model}/h)=d_{model} h×(dmodel/h)=dmodel。

用一句话给读者提个醒:不要以为头数越多参数量越大 。头数 h h h 影响的是"注意力被分成多少种视角",不改变 QKV 的参数量。这是 Transformer 敢放心把 h h h 设成 8、12、16 的原因之一。


六、多个头 = 多个视角:同一句话的 4 个头热力图

前面反复说"多头 = 多个视角",但只看代码和 shape 很难有感觉。这一节用一张图把它讲透。

我们取一句 6 个词的句子 "the cat sat on the mat" (那只猫坐在垫子上),设 h = 4 h=4 h=4 个头。经过训练后,4 个头会"分化"出各自的关注偏好。为了让你直观看到"分化后的样子",下面这张图直接画出 4 个头各自的注意力热力图(2×2 拼图,每行行和都为 1,颜色越深权重越大):

!在这里插入图片描述(https://i-blog.csdnimg.cn/direct/1ff27a26bed64dccb9d060593fde8ab6.png

看这张图,四个头各司其职:

  • 头 1 · 局部相邻 :每个词主要看自己和紧挨着的邻居。这是"语法关系"------词和相邻词往往是语法上最相关的。
  • 头 2 · 自反/指代 :每个词主要看自己。这种头擅长捕捉"这个位置和它自己最相关"的强自指,是"指代/自反"类信息的体现。
  • 头 3 · 冠词→名词 :两个 the 都把主要注意力投给紧随其后的名词(第一个 the → cat,第二个 the → mat)。这头专门管"冠词该修饰谁"。
  • 头 4 · 主谓实词互联 :名词和动词(cat ↔ sat ↔ mat)互相看。这头专门管"主语、谓语、宾语的语义联动"。

注意 :这 4 个头看的是同一句话 ,但因为各自用了不同的权重矩阵 ,所以"get 到的重点"完全不同。这正是多头注意力的精髓------把"这句话里谁是重点"这个大问题,拆成 4 个小问题分别回答,最后拼起来得到更全面的上下文

💡 诚实说明 :图 2 为了方便讲解,"分化形态"是示意性的(真实训练后的头会学出类似但更复杂的模式)。但机制是真实的 :多个头共用同一句话、各自独立算注意力、输出互不影响------这是多头能在训练中自发分化出"不同视角"的结构基础。第 6 章讲完位置编码后,我们会在真实模型上看到训练出来的注意力头。


七、为什么"切维度"就能切出"不同视角"?

看到这里,细心的读者一定会追问:凭什么把维度切开,就能得到不同的关注模式? 同样是看一句话,为什么头 1 盯局部、头 3 盯冠词?

答案藏在"每个头是独立参数"这件事里。我们回看多头的公式:

head i = Attention ( Q W i Q ,    K W i K ,    V W i V ) \text{head}_i = \text{Attention}\big(QW_i^Q,\; KW_i^K,\; VW_i^V\big) headi=Attention(QWiQ,KWiK,VWiV)

第 i i i 个头的查询 Q W i Q QW_i^Q QWiQ 完全由它自己的 W i Q W_i^Q WiQ 决定。而 W i Q W_i^Q WiQ 和 W j Q W_j^Q WjQ( i ≠ j i\neq j i=j)是两块完全独立的可学习矩阵,训练时各自被梯度更新,互不共享、互不牵制。

于是事情就变得很自然:训练时,模型为了让预测更准,会让每个头"学会"去捕捉最难兼顾的那一种关系。 头 1 发现"盯紧相邻词"最有用,就把自己的 W 1 Q W_1^Q W1Q 调成擅长"相邻对齐";头 3 发现"盯紧冠词后面的名词"更管用,就把自己的 W 3 Q W_3^Q W3Q 调成擅长"冠名配对"。每个头各调各的,最后自然分化成不同专家。

再想想为什么"必须切开":如果只有一个头,它只有一套 W Q W^Q WQ,只能学会一种偏好。一旦它偏向了"指代",就丢了"语义";偏向"语义",又丢了"语法"。矛盾的需求卡在同一个参数上,谁都学不好。 切成 h h h 份后,每个头有独立参数去独享一种偏好,就"各得其所"了。

用一个比喻收尾:单头注意力像一位身兼数职的全科医生,忙不过来;多头注意力像一支专科会诊团队,骨科看骨头、眼科看眼睛,各管一摊后把诊断汇总。 维度切分,就是把"一位全科医生"拆成"一排专科门诊"------拆的不是病,是分工


八、单头 vs 多头:一张表看懂差别

把单头和多头放在一起对比,差别一目了然:

维度 单头注意力 多头注意力
关注关系 一次只能关注一种 同时关注多种(语法/语义/指代...)
QKV 参数 3 d m o d e l 2 3d_{model}^2 3dmodel2 3 d m o d e l 2 3d_{model}^2 3dmodel2(完全相同
输出投影 W O W^O WO 有(拼接后映射回 d m o d e l d_{model} dmodel)
输出维度 d m o d e l d_{model} dmodel d m o d e l d_{model} dmodel(拼接还原)
并行性 单一路径 h h h 条路径并行
可学偏好 只有一套,顾此失彼 每个头独立参数,各学一种
视觉效果 一张热力图 h h h 张热力图( h h h 个视角)

可以看到,换多头几乎不增加任何成本 (QKV 参数不变),却换来"多视角"这一巨大收益。这正是 Transformer 论文把多头注意力作为核心、且敢把 h h h 设到 8、12、16 的原因------物美价廉,何乐而不为


九、常见坑与自查

  • 以为多头是多加了参数 :恰恰相反,多头不增加 QKV 参数 (恒等式 h × ( d m o d e l / h ) = d m o d e l h\times(d_{model}/h)=d_{model} h×(dmodel/h)=dmodel),只多一层输出投影 W O W^O WO。头数 h h h 改变的是"视角数量",不是"参数量"。
  • 把 d k d_k dk 当输入维度 :多头里 d k = d m o d e l / h d_k=d_{model}/h dk=dmodel/h,是每个头 分到的键维度,不是 d m o d e l d_{model} dmodel。搞混它,后面算 shape 必乱。
  • 以为每个头看的是不同词 :所有头看的是同一句话 ,区别在权重矩阵不同,导致各自"get 的重点"不同。不是各看各的词。
  • 拼接方向搞错 :是沿特征维 (最后一维)拼接,不是沿词数维拼接。 h h h 个 (S,d_k) 拼成 (S, h*d_k)=(S, d_{model}),词数 S 不变。
  • 以为随机的多头就立刻分化 :随机初始化下所有头都"一视同仁"(权重很平均),分化是训练学出来的,不是一上来就有。
  • softmax 方向搞反 :依然是对每一行(每个查询词)做 softmax,让"该词在该头里对全句的注意力之和=1"。每个头内部独立做,头与头之间不归一化。
  • 把"打分"和"权重"混用:和前面几章一样,权重是 softmax 后的(非负、行和 1),只有权重用于加权求和。

小结

这一章把单头注意力升级成了多头注意力,核心收获有四条:

  • 为什么一个头不够:一句话里同时存在语法、语义、指代等多种关系,一个注意力分布"顾此失彼"("it"到底指 animal 还是 street 的例子);
  • 多头是什么维度切分 + 并行注意力 + 拼接 + 线性投影 ------把 d m o d e l d_{model} dmodel 切成 h h h 份, h h h 个专家各看各的关系,拼起来再投影还原;
  • 为什么多头不增参数 :恒等式 3 × h × d m o d e l × ( d m o d e l / h ) = 3 d m o d e l 2 3\times h\times d_{model}\times(d_{model}/h)=3d_{model}^2 3×h×dmodel×(dmodel/h)=3dmodel2,维度切分让 QKV 参数和单头完全一样,只多一层输出投影 W O W^O WO;
  • 多个头 = 多个视角:同一句话 "the cat sat on the mat",4 个头分别关注局部相邻、自反指代、冠词→名词、主谓互联------用 4 张热力图亲眼看"分化"。

到这一步,注意力的核心机制已经齐了:Q/K/V 三件套(第 2 章)→ 缩放保护(第 3 章)→ 多头分工(本章) 。但还有一个凑齐 Transformer 拼图的致命缺陷:注意力是"无视顺序"的------把句子里的词随便打乱,注意力权重完全不变。模型根本不知道哪个词在前、哪个词在后。下一章的位置编码(Positional Encoding),就是来给每个词贴上"我是第几个"的标签。


下一篇(三十四):位置编码(Positional Encoding)------给词打上"顺序"的标签

相关推荐
张小殊.3 小时前
LoongForge TAOT 训练方案,解决MoE EP不均衡问题
人工智能·python·深度学习·机器学习·ai
爱知菜3 小时前
Transformer vs Diffusion:为什么扩散模型更擅长捕捉细节?
人工智能·深度学习·transformer·扩散模型
HiDev_3 小时前
【非标自动化】plc执行顺序问题、扫描周期问题
深度学习·算法·机器学习
高洁014 小时前
工信部教考中心证书-人工智能系列本系列
人工智能·python·深度学习·算法
手写码匠6 小时前
华为云Flexus+DeepSeek征文|Agent 评测体系实战:用 DeepSeek-R1 当裁判,打造 Dify Agent 的自动化回归测试流水线
人工智能·深度学习·算法·aigc
hopsky6 小时前
大数据架构详解:从数据获取到深度学习
大数据·深度学习·架构
ccLianLian7 小时前
机器学习和深度学习
人工智能·深度学习·机器学习
ʜᴇɴʀʏ7 小时前
ICCV 2025 | STEP-DETR:基于超级教师与伪标签引导文本查询的半监督目标检测
人工智能·目标检测·计算机视觉·transformer
TAN-90°-7 小时前
Deep Learning for Computer Vision——Image Classification with Linear Classifiers
python·深度学习·算法·计算机视觉·线性回归