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