多头注意力(Multi-Head Attention)输出前的最后一次的线性变换是为了什么(超清晰举例)

以下内容详细解释最后一次线性变换的目的,并通过一个具体的数据例子来说明。

详细解释

目的

  1. 整合信息:通过多头注意力机制,我们可以并行地计算多个注意力头,每个头可能关注输入的不同部分。最后的线性变换将这些不同头的输出整合为一个统一的表示。
  2. 降低维度:拼接后得到的高维向量需要变回原始的输出维度,以便后续处理和计算的稳定性。
  3. 引入非线性变换:线性变换可以帮助引入一定的非线性变化,提高模型的表达能力。

举例说明

假设我们有一个简单的模型,输入数据的维度是4(为了简单起见),我们采用2个注意力头,每个注意力头的输出维度是2。

输入数据
Q = [[1, 0, 1, 0], 
     [0, 2, 0, 2]]  # 查询向量 (2, 4)

K = [[1, 1, 1, 1], 
     [1, 0, 1, 0]]  # 键向量 (2, 4)

V = [[1, 2, 1, 2], 
     [2, 1, 2, 1]]  # 值向量 (2, 4)
多头注意力
  1. 线性变换
    对Q、K、V进行线性变换,得到不同头的查询、键和值向量。假设线性变换矩阵如下(随机生成,为简单起见):
W_Q1 = [[0.5, 0], [0, 0.5], [0.5, 0], [0, 0.5]]  # (4, 2)
W_K1 = [[0.5, 0], [0, 0.5], [0.5, 0], [0, 0.5]]  # (4, 2)
W_V1 = [[0.5, 0], [0, 0.5], [0.5, 0], [0, 0.5]]  # (4, 2)

W_Q2 = [[0.5, 0.5], [0.5, 0.5], [0.5, 0.5], [0.5, 0.5]]  # (4, 2)
W_K2 = [[0.5, 0.5], [0.5, 0.5], [0.5, 0.5], [0.5, 0.5]]  # (4, 2)
W_V2 = [[0.5, 0.5], [0.5, 0.5], [0.5, 0.5], [0.5, 0.5]]  # (4, 2)
  1. 计算头的输出
    对Q、K、V进行变换,得到每个头的查询、键和值向量:
Q1 = Q @ W_Q1  # (2, 4) @ (4, 2) -> (2, 2)
K1 = K @ W_K1  # (2, 4) @ (4, 2) -> (2, 2)
V1 = V @ W_V1  # (2, 4) @ (4, 2) -> (2, 2)

Q2 = Q @ W_Q2  # (2, 4) @ (4, 2) -> (2, 2)
K2 = K @ W_K2  # (2, 4) @ (4, 2) -> (2, 2)
V2 = V @ W_V2  # (2, 4) @ (4, 2) -> (2, 2)
  1. 计算注意力权重和应用注意力
# 注意力权重和应用注意力的计算略过,只考虑输出结果:
Output1 = Attention(Q1, K1, V1)  # (2, 2)
Output2 = Attention(Q2, K2, V2)  # (2, 2)
  1. 拼接头的输出
    将两个头的输出拼接在一起:
ConcatOutput = [Output1, Output2]  # (2, 4)
最后的线性变换

假设最后的线性变换矩阵为:

W_O = [[1, 0], [0, 1], [1, 0], [0, 1]]  # (4, 2)

将拼接后的输出进行线性变换:

FinalOutput = ConcatOutput @ W_O  # (2, 4) @ (4, 2) -> (2, 2)

通过这个过程,最终输出维度与输入维度一致(均为2)。通过这个例子,可以看到最后的线性变换不仅整合了多头的输出,还将高维拼接后的结果降低回原始维度,为后续的层提供合适的输入。

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值