Почему свертки PyTorch реализованы как взаимные корреляции?

Свертки PyTorch на самом деле реализованы как взаимные корреляции. Это не должно вызывать проблем при обучении слоя свертки, так как один является просто перевернутой версией другого (и, следовательно, изученная функция будет столь же мощной), но делает докажите проблему, когда:

  1. пытаясь реализовать настоящую свертку с библиотекой functional
  2. попытка скопировать веса фактической свертки из другой библиотеки глубокого обучения

Авторы говорят следующее в Глубокое обучение с PyTorch :

Свертка, точнее, дискретная свертка1...

1. Существует тонкое различие между сверткой PyTorch и сверткой математики: знак одного аргумента переворачивается. Если бы мы были настроены педантично, мы могли бы назвать извилины PyTorch дискретными взаимными корреляциями.

Но они не объясняют, почему это реализовано именно так. Есть ли причина?

Может быть, что-то похожее на то, как реализация PyTorch CrossEntropyLoss на самом деле не кросс-энтропия, а аналогичная функция использование логитов в качестве входных данных вместо необработанных вероятностей (во избежание числовой нестабильности) ?


person iacob    schedule 15.03.2021    source источник
comment
discuss.pytorch. орг/т/   -  person iacob    schedule 17.03.2021


Ответы (1)


Думаю причина проще. Как вы сказали, свертка — это перевернутая версия кросс-корреляции, но это не проблема в контексте обучения CNN. Таким образом, мы можем просто избежать переворачивания, что упрощает код и сокращает время вычислений:

Преимущество взаимной корреляции состоит в том, что она позволяет избежать дополнительного шага переключения фильтров для выполнения сверток.

Переворот ядра никак не повлияет на математическую стабильность. Операции остаются прежними.

person Rémi Chauvenne    schedule 15.03.2021