self-attention为什么要除以根号d_k

self-attention的公式为
a t t e n t i o n ( Q , K , V ) = S o f t m a x ( Q K d k ) V attention(Q,K,V)=Softmax( \frac{QK}{\sqrt{d_{k}}})V attention(Q,K,V)=Softmax(dk QK)V

个人理解,除以 d k \sqrt{d_{k}} dk 的原因有两点:
d k d_{k} dk是词向量/隐藏层的维度
1、首先要除以一个数,防止输入softmax的值过大,导致偏导数趋近于0;
2、选择根号d_k是因为可以使得q*k的结果满足期望为0,方差为1的分布,类似于归一化

公式分析,首先假设q和k都是服从期望为0,方差为1的独立的随机变量。
Assume: X = q i X=q_{i} X=qi Y = k i Y=k_{i} Y=ki,那么:
1、 E ( X Y ) = E ( X ) E ( Y ) = 0 ∗ 0 = 0 E(XY)=E(X)E(Y)=0*0=0 E(XY)=E(X)E(Y)=00=0
2、 D ( X Y ) = E ( X 2 Y 2 ) − [ E ( X Y ) ] 2 D(XY)=E(X^{2}Y^{2})-[E(XY)]^{2} D(XY)=E(X2Y2)[E(XY)]2
       = E ( X 2 ) E ( Y 2 ) − [ E ( X ) E ( Y ) ] 2 =E(X^{2})E(Y^{2})-[E(X)E(Y)]^{2} =E(X2)E(Y2)[E(X)E(Y)]2
       = E ( X 2 − 0 2 ) E ( Y 2 − 0 2 ) − [ E ( X ) E ( Y ) ] 2 =E(X^{2}-0^{2})E(Y^{2}-0^{2})-[E(X)E(Y)]^{2} =E(X202)E(Y202)[E(X)E(Y)]2
       = E ( X 2 − [ E ( X ) ] 2 ) E ( Y 2 − [ E ( Y ) ] 2 ) − [ E ( X ) E ( Y ) ] 2 =E(X^{2}-[E(X)]^{2})E(Y^{2}-[E(Y)]^{2})-[E(X)E(Y)]^{2} =E(X2[E(X)]2)E(Y2[E(Y)]2)[E(X)E(Y)]2
       = [ E ( X 2 ) − [ E ( X ) ] 2 ] [ E ( Y 2 ) − [ E ( Y ) ] 2 ] − [ E ( X ) E ( Y ) ] 2 =[E(X^{2})-[E(X)]^{2}][E(Y^{2})-[E(Y)]^{2}]-[E(X)E(Y)]^{2} =[E(X2)[E(X)]2][E(Y2)[E(Y)]2][E(X)E(Y)]2
       = D ( X ) D ( Y ) − [ E ( X ) E ( Y ) ] 2 =D(X)D(Y)-[E(X)E(Y)]^{2} =D(X)D(Y)[E(X)E(Y)]2
       = 1 ∗ 1 − 0 ∗ 0 =1*1-0*0 =1100
       = 1 =1 =1
3、 D ( Q K d k ) = d k ( d k ) 2 = 1 D(\frac{QK}{\sqrt{d_{k}}})=\frac{d_{k}}{(\sqrt{d_{k}})^{2}}=1 D(dk QK)=(dk )2dk=1
需要注意的是, D ( Q K ) = D ( ∑ i = 0 d k q i k i ) = d k ∗ 1 = d k D(QK)=D(\sum_{i=0}^{d_{k}}q_{i}k_{i})=d_{k}*1=d_{k} D(QK)=D(i=0dkqiki)=dk1=dk

附:AI工具箱
链接:https://hxmbzkv9u5i.feishu.cn/docx/Mv4Dd8TEYoUmTAxfpLtcUoOKnZc?from=from_copylink

会员中心 消息历史创作中心创作self-attention为什么除以根号d_k想念@思恋已于 2023-10-26 20:55:40 修改阅读量2.3w 收藏 71点赞数 52分类专栏: python编程 文章标签: 概率论 深度学习 机器学习版权GitCode 开源社区文章已被社区收录加入社区python编程专栏收录该内容139 篇文章订阅专栏self-attention的公式为a t t e n t i o n ( Q , K , V ) = S o f t m a x ( Q K d k ) V attention(Q,K,V)=Softmax( \frac{QK}{\sqrt{d_{k}}})Vattention(Q,K,V)=Softmax( d k​ ​ QK​ )V个人理解,除以d k \sqrt{d_{k}} d k​ ​ 的原因有两点:d k d_{k}d k​ 是词向量/隐藏层的维度1、首先要除以一个数,防止输入softmax的值过大,导致偏导数趋近于0;2、选择根号d_k是因为可以使得q*k的结果满足期望为0,方差为1的分布,类似于归一化。公式分析,首先假设q和k都是服从期望为0,方差为1的独立的随机变量。Assume:X = q i X=q_{i}X=q i​ ,Y = k i Y=k_{i}Y=k i​ ,那么:1、E ( X Y ) = E ( X ) E ( Y ) = 0 ∗ 0 = 0 E(XY)=E(X)E(Y)=0*0=0E(XY)=E(X)E(Y)=0∗0=02、D ( X Y ) = E ( X 2 Y 2 ) − [ E ( X Y ) ] 2 D(XY)=E(X^{2}Y^{2})-[E(XY)]^{2}D(XY)=E(X 2 Y 2 )−[E(XY)] 2       = E ( X 2 ) E ( Y 2 ) − [ E ( X ) E ( Y ) ] 2 =E(X^{2})E(Y^{2})-[E(X)E(Y)]^{2}=E(X 2 )E(Y 2 )−[E(X)E(Y)] 2       = E ( X 2 − 0 2 ) E ( Y 2 − 0 2 ) − [ E ( X ) E ( Y ) ] 2 =E(X^{2}-0^{2})E(Y^{2}-0^{2})-[E(X)E(Y)]^{2}=E(X 2 −0 2 )E(Y 2 −0 2 )−[E(X)E(Y)] 2       = E ( X 2 − [ E ( X ) ] 2 ) E ( Y 2 − [ E ( Y ) ] 2 ) − [ E ( X ) E ( Y ) ] 2 =E(X^{2}-[E(X)]^{2})E(Y^{2}-[E(Y)]^{2})-[E(X)E(Y)]^{2}=E(X 2 −[E(X)] 2 )E(Y 2 −[E(Y)] 2 )−[E(X)E(Y)] 2       = [ E ( X 2 ) − [ E ( X ) ] 2 ] [ E ( Y 2 ) − [ E ( Y ) ] 2 ] − [ E ( X ) E ( Y ) ] 2 =[E(X^{2})-[E(X)]^{2}][E(Y^{2})-[E(Y)]^{2}]-[E(X)E(Y)]^{2}=[E(X 2 )−[E(X)] 2 ][E(Y 2 )−[E(Y)] 2 ]−[E(X)E(Y)] 2       = D ( X ) D ( Y ) − [ E ( X ) E ( Y ) ] 2 =D(X)D(Y)-[E(X)E(Y)]^{2}=D(X)D(Y)−[E(X)E(Y)] 2       = 1 ∗ 1 − 0 ∗ 0 =1*1-0*0=1∗1−0∗0      = 1 =1=1
最新发布
04-06
### 回答1: 多头注意力代码(Multi-Head Attention Code)是一种用于自然语言处理的机器学习技术,它可以帮助模型同时从多个表征空间中提取信息,从而提高模型的准确性。它的主要作用是通过使用多头的注意力机制,来计算输入的表征空间之间的相似性,从而使模型更加准确。 ### 回答2: multi-head attention是一种用于处理序列数据中的深度学习模型。它通过并行地学习多个注意力头,可以捕获不同远距离依赖关系和注意力机制在不同空间维度上的变换。下面是描述一个基本的multi-head attention的代码。 首先,我们需要引入所需的Python库,包括numpy和torch: ```python import numpy as np import torch import torch.nn as nn import torch.nn.functional as F ``` 接下来,我们定义一个MultiHeadAttention类,继承自nn.Module类,以便在PyTorch中构建模型: ```python class MultiHeadAttention(nn.Module): def __init__(self, d_model, num_heads): super(MultiHeadAttention, self).__init__() self.num_heads = num_heads self.d_model = d_model self.query_fc = nn.Linear(d_model, d_model) self.key_fc = nn.Linear(d_model, d_model) self.value_fc = nn.Linear(d_model, d_model) self.fc = nn.Linear(d_model, d_model) def forward(self, query, key, value): batch_size = query.size(0) # 通过线性变换获得query、key和value query = self.query_fc(query) key = self.key_fc(key) value = self.value_fc(value) # 将输入的query、key和value分割为不同的注意力头 query = query.view(batch_size * self.num_heads, -1, self.d_model // self.num_heads) key = key.view(batch_size * self.num_heads, -1, self.d_model // self.num_heads) value = value.view(batch_size * self.num_heads, -1, self.d_model // self.num_heads) # 计算注意力得分 scores = torch.bmm(query, key.transpose(1, 2)) scores = scores / np.sqrt(self.d_model // self.num_heads) attn_weights = F.softmax(scores, dim=-1) # 使用注意力得分加权计算value output = torch.bmm(attn_weights, value) # 将分割的注意力头拼接起来 output = output.view(batch_size, -1, self.d_model) # 通过线性变换得到最终的输出 output = self.fc(output) return output ``` 在上面的代码中,我们首先定义了MultiHeadAttention类的初始化方法,在这个方法中,我们传入注意力头的数量num_heads和输入维度d_model。然后,我们定义了query、key和value的线性变换层。在forward方法中,我们首先通过线性变换得到query、key和value,然后将它们分成不同的注意力头。接下来,我们计算注意力得分,并使用注意力得分加权计算value。最后,我们将分割的注意力头拼接起来,并通过线性变换得到最终的输出。 以上就是一个基本的multi-head attention的代码实现。在实际使用中,我们可以根据需求对其进行修改和扩展。 ### 回答3: multi-head attention是一种用于自然语言处理的注意力机制,用于对输入序列进行加权表示。在代码实现中,multi-head attention可以分为以下几个步骤: 1. 首先,需要定义输入序列x和相关的参数,如隐藏层大小和注意力头数。 2. 然后,将输入序列通过线性变换得到q、k和v矩阵,即对q、k、v分别乘以权重矩阵Wq、Wk和Wv。 3. 接下来,将q、k和v矩阵分别切分成多个头,即将q、k、v矩阵按行分成n个头。 4. 对于每个头,计算注意力权重。首先,计算q和k的点乘,然后除以一个可调节的缩放因子根号d,其中d为隐藏层大小。将结果通过softmax函数得到注意力权重。 5. 将注意力权重与v矩阵相乘,得到每个头的加权表示。 6. 将每个头的加权表示拼接起来,得到最终的加权表示。 7. 最后,通过线性变换将加权表示映射回原始的隐藏层大小。 以上就是multi-head attention的代码实现过程,通过这个过程可以对输入序列进行加权表示,从而提取关键信息。每个头的注意力权重计算可以独立进行,可以并行计算,提高了计算效率。multi-head attention在自然语言处理中应用广泛,如机器翻译、文本摘要等任务中都取得了很好的效果。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值