Потеря каждого слоя нейронной сети за линейное время?

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

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

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

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

0 ответов

Другие вопросы по тегам