Продолжение про ACT, часть 3-я.



#2: ResNet & SACT



Интересная работа про применение ACT к свёрточным сетям, конкретно к ResNet’ам. Главный автор -- Миша Фигурнов, который теперь тоже работает в DeepMind.



Пользуясь случаем передаю Мише привет :)



Spatially Adaptive Computation Time for Residual Networks

Michael Figurnov, Maxwell D. Collins, Yukun Zhu, Li Zhang, Jonathan Huang, Dmitry Vetrov, Ruslan Salakhutdinov

Статья: https://arxiv.org/abs/1612.02297

Код: https://github.com/mfigurnov/sact



Идея работы в том, что для разных участков изображения можно было бы регулировать количество вычислений, следуя интуиции, что одни участки изображения важнее других и “сложность” у них тоже разная. Для простых и менее важных регионов могло бы хватить одного-двух слоёв в residual блоке, для более важных и сложных требуется больше.



Эта вариация ACT называется Spatially Adaptive Computation Time (SACT).



Идейно внутри всё похоже на предыдущие варианты, только теперь применено не в рекуррентных сетях, а в (почти) обычных feed-forward -- ResNet’ах. Это своего рода встраивание механизма внимания в ResNet’ы. Мы прекращаем обрабатывать конкретную позицию изображения, как только её фичи стали “достаточно хорошими”.



ResNet’ы состят из блоков (block), каждый из которых содержит пачку слоёв (units). К выходу каждого юнита добавляется ветка, считающая halting score. Как только накопленная сумма halting scores для конкретной позиции достигла единицы (в реальности здесь тоже фигурирует небольшой epsilon как в оригинальной работе), все последующие юниты этого блока пропускаются. Все halting scores превращаются в распределение (усечением веса для последнего сработавшего юнита и занулением весов всех последующих, так чтобы сумма весов была равна единице). И наконец выход блока считается взвешенной суммой выходов юнитов этого блока с весами полученными описанным выше способом.



Визуализация SACT даёт карты, похожие на карты, продуцируемые механизмами внимания, что можно использовать для интерпретации результата и получения некой интуиции про работу сети.



В отличие от рекуррентных сетей здесь есть новые тонкости, например, можно получить мёртвые юниты (последние юниты в блоке), которые не получают достаточно сигнала для обучения. В случает RNN такой проблемы не было благодаря шарингу весов. В работе эта проблема решается.



SACT даёт лучшее качество и производительность по сравнению с обычным ACT или бейзлайновыми резнетами.



Поскольку механизм полносвёрточный, то всё это применимо и к разным разрешениям, и к разным задачам (классификация, детекция, …)



По-прежнему надо тюнить гиперпараметр про вклад ACT в функцию потерь.



(продолжение следует)