Потеря каждого слоя нейронной сети за линейное время? - PullRequest
0 голосов
/ 20 декабря 2018

Допустим, у меня есть нейронная сеть с n входами и n слоями (да, эта модель очень глубокая), каждый из которых имеет n нейронов.Каждый слой имеет одинаковое количество нейронов, и он редко связан.На последнем слое активации каждого нейрона объединяются до конечной скалярной потери.

Предположим теперь, что я хотел бы не только объединить последний слой, но и объединить промежуточные слои и вычислитьпромежуточные потери.Я мог, конечно, запустить n backprops через мою нейронную сеть.Однако, если стоимость одного backprop составляет, скажем, O(n) время, то это приводит к алгоритму O(n²) - не очень хорошо, когда n велико.Тем не менее, многие промежуточные производные вычисляются снова и снова в этом сценарии, предполагая, что, возможно, существует более эффективный метод.

Наивно я думал, что более эффективным методом является прямое накопление - на каждом слое - один вектор- Матричный продукт может затем излучать потери, используя накопленную матрицу Якоби.Однако в этом алгоритме накапливаются потенциально плотные матрицы промежуточных производных, что также может привести к дорогостоящему алгоритму O(n²) (или хуже).

Есть ли способ получить лучшее из обоих миров?Есть ли способ получить потери на каждом слое этой потенциально глубокой нейронной сети в чем-то ближе к линейному времени?

...