Residual connections, или остаточные связи, представляют собой архитектурное решение, позволяющее облегчить обучение глубоких нейронных сетей. Идея заключается в том, чтобы не заставлять каждый блок сети изучать полностью новую функцию отображения, а вместо этого позволять сети моделировать смещение относительно входа. В терминах ConvNetJS это реализуется через комбинацию обычных слоев с операцией суммирования входного тензора и выходного результата блока.
Пусть (x) — входной тензор блока, а (F(x)) — функция, которую блок должен выучить. В обычной сети выход блока (y) равен просто (F(x)). В residual-блоке вводится связь, пропускающая (x) напрямую:
[ y = F(x) + x]
Здесь (x) называется skip connection или пропускающей связью. Преимущество этого подхода:
В ConvNetJS слои создаются с помощью объектов типа
Layer. Для создания residual-блока необходимо:
Пример кода residual-блока на ConvNetJS:
// Создание входного слоя
var layer_defs = [];
layer_defs.push({type:'input', out_sx:32, out_sy:32, out_depth:3});
// Первый свёрточный слой внутри residual-блока
layer_defs.push({type:'conv', sx:3, filters:16, stride:1, pad:1, activation:'relu'});
// Второй свёрточный слой блока
layer_defs.push({type:'conv', sx:3, filters:16, stride:1, pad:1, activation:'none'});
// Суммирование входа и выхода блока
layer_defs.push({type:'elemwise', op:'sum', inputs:[0,1]});
// Активация после суммирования
layer_defs.push({type:'relu'});
// Создание сети
var net = new convnetjs.Net();
net.makeLayers(layer_defs);
Пояснения по коду:
elemwise с операцией 'sum' позволяет
суммировать два тензора поэлементно. В inputs указываются
индексы слоев, которые будут суммированы.'relu' применяется после суммирования для
добавления нелинейности.Если размеры тензоров на входе и после блока различаются (например, при изменении числа фильтров или размерности), residual connection нельзя просто суммировать. Для решения используется 1x1 свертка, выравнивающая размерность:
layer_defs.push({type:'conv', sx:1, filters:32, stride:1, pad:0, activation:'none', layer_index:0});
После этого суммирование возможно без ошибок размерностей.
Residual connections повышают стабильность обучения глубоких сетей. В ConvNetJS можно наблюдать несколько ключевых эффектов:
Residual connections в ConvNetJS дают возможность строить глубокие и эффективные сверточные сети, значительно облегчая процесс обучения и увеличивая производительность модели.