Обоснование без предупреждения с одинарной точностью? - PullRequest
0 голосов
/ 22 апреля 2020

Использование tensor.pinverse в pytorch может дать очень плохое поведение при работе с слишком низкой точностью. Он работает путем вычисления SVD и использования только ненулевых сингулярных значений для инверсии. Чтобы решить, что такое «ноль», метод использует обрезание rcond и использует только единичные значения, которые больше этого. Установки по умолчанию приводят к неожиданному поведению.

Рассмотрим приведенный ниже код.

import torch

a = torch.tensor([[2.,2.],[1.,1.]]) # default tensor dtype has absolute precision ~ 1e-8
a_inv_auto = a.pinverse()           # default rcond is 1e-15
a_inv_manual= a.pinverse(rcond=1e-8)

print("Wrong result:")
print(a @ a_inv_auto @ a - a)
print(a_inv_auto @ a @ a_inv_auto - a_inv_auto)

print("\nGood result:")
print(a @ a_inv_manual @ a - a)
print(a_inv_manual @ a @ a_inv_manual - a_inv_manual)

Мы ожидаем, что напечатанные матрицы будут равны нулю, поскольку это является частью определения псевдообратного. Фактический результат:

Wrong result:
tensor([[-2., -2.],
        [-1., -1.]])
tensor([[ 16311703., -32623406.],
        [-16311704.,  32623408.]])
Good result:
tensor([[2.3842e-07, 2.3842e-07],
        [1.1921e-07, 1.1921e-07]])
tensor([[2.9802e-08, 7.4506e-09],
        [1.4901e-08, 0.0000e+00]])

Мы видим, что если rcond меньше, чем числовая точность, мы получаем неверные ответы. Это также настройка по умолчанию. Это для меня неожиданное поведение. Для меня будет иметь смысл, если rcond будет установлено в зависимости от dtype или, по крайней мере, torch.pinverse вызовет предупреждение.

Что за этим стоит? Есть какие-то логи c, которые мне не хватает?

...