TL; DR
Под капотом используется функция с именем addmm
, которая имеет некоторые оптимизации и, вероятно, умножает векторы немного по-другому
Я только что понял в чем была проблема real , и я отредактировал ответ.
После попытки воспроизвести и отладить его на моей машине. Я обнаружил, что:
f(x)[0].detach().numpy()
>>>array([-0.5386441 , 0.4983463 , 0.07970242, 0.53507525, 0.71045876,
0.7791027 , 0.29027492, -0.07919329, -0.12045971, -0.9111403 ],
dtype=float32)
f(x[0]).detach().numpy()
>>>array([-0.5386441 , 0.49834624, 0.07970244, 0.53507525, 0.71045876,
0.7791027 , 0.29027495, -0.07919335, -0.12045971, -0.9111402 ],
dtype=float32)
f(x[0]).detach().numpy() == f(x)[0].detach().numpy()
>>>array([ True, False, False, True, True, True, False, False, True,
False])
Если вы внимательно посмотрите, вы обнаружите, что все индексы, которые являются ложными, есть небольшое изменение числа c в 5-й с плавающей запятой.
После некоторой дополнительной отладки я увидел в линейной функции, которая использует addmm
:
def linear(input, weight, bias=None):
if input.dim() == 2 and bias is not None:
# fused op is marginally faster
ret = torch.addmm(bias, input, weight.t())
else:
output = input.matmul(weight.t())
if bias is not None:
output += bias
ret = output
return ret
Когда addmm addmm
, реализует beta*mat + alpha*(mat1 @ mat2)
и предположительно быстрее (см. здесь например).
Кредит Шимону Маске