gpt4 book ai didi

numpy - Pytorch,在将一个向量的排列添加到矩阵的条目时摆脱 for 循环?

转载 作者:行者123 更新时间:2023-12-04 09:03:41 24 4
gpt4 key购买 nike

我正在尝试实现这篇论文,并坚持这个简单的步骤。尽管这与注意力有关,但我所坚持的只是如何在不使用 for 循环的情况下实现添加到矩阵的向量的排列。
注意分数添加了一个学习到的偏差向量,理论是它对分数表示的两个标记的相对位置 (j-i) 进行编码 enter image description here
所以 alpha 是一个 T x T 矩阵,T 取决于被转发的批次,而 B 是一个学习到的偏差向量,它的长度必须是固定的并且大到 2T。我认为我目前的实现符合论文的建议:

    def __init__(...):
...
self.bias = torch.nn.Parameter(torch.randn(config.n),requires_grad = True)
stdv = 1. / math.sqrt(self.bias.data.size(0))
self.bias.data.uniform_(-stdv, stdv)
def forward(..)
...
#n = 201 (2* max_seq_len + 1)

B_matrix = torch.zeros(self.T, self.T) # 60 x 60
for i in range(self.T):
B_matrix[i] = self.bias[torch.arange(start=n//2-i, end=n//2-i+T)])]

attention_scores = attention_scores + B_matrix.unsqueeze(0)
# 64 x 60 x 60
...
这是唯一相关的部分
B_matrix = torch.zeros(self.T, self.T) # 60 x 60
for i in range(self.T):
B_matrix[i] = self.bias[torch.arange(start=n//2-i, end=n//2-i+T)])]
基本上试图不使用 for 循环遍历每一行。
但我知道当这个模型非常大时,这一定是非常低效且成本高昂的。我正在对每一行进行显式 for 循环,以获得学习偏差向量的排列。
任何人都可以通过智能广播以更好的方式帮助我吗?
想了想,我不需要实例化一个零矩阵,但仍然无法摆脱for循环?并且不能使用聚集,因为 B_matrix 与平铺 b 向量的大小不同。
functor = lambda i : bias[torch.arange(start=n//2-i, end=n//2-i+T)]
B_matrix = torch.stack([functor(i) for i in torch.arange(T)])

最佳答案

我不知道是什么 n应该在您的代码中,但我认为以下示例使用 torch.meshgrid 提供您正在寻找的内容。
假如

n, m = 10, 20   # arbitrary
a = torch.randn(n, m)
b = torch.randn(n + m)
然后
for i in range(n):
for j in range(m):
a[i, j] = a[i, j] + b[n - i + j]
相当于
ii, jj = torch.meshgrid(torch.arange(n), torch.arange(m))
a = a + b[n - ii + jj]
虽然后者是不合时宜的操作,但通常是一件好事。如果您确实想要就地操作,请替换 a =a[...] = .
请注意,这是 integer array indexing 的示例我们索引的地方 b使用与 a 形状相同的张量.

关于numpy - Pytorch,在将一个向量的排列添加到矩阵的条目时摆脱 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63506321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com