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