Есть вот такие теоретические изыскания:
1. Плотное (но узкое) перцептивное поле, назовём его
равномерным, так как каждый входной токен в пределах перцептивного поля равнозначен и участвует в "голосовании" наравне с другими:
Код:
self.cmp1 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=1)
self.cmp2 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=1)
self.cmp3 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=1)
self.cmp4 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=1)
2. Сильно разреженное в прошлом (но широкое) рецептивное -
экспоненциальное. Прошлые токены получают меньше внимания.
Код:
self.cmp1 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=1)
self.cmp2 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=2)
self.cmp3 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=4)
self.cmp4 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=8)
3. Промежуточный вариант - фибоначчиевый:
Код:
self.cmp1 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=1)
self.cmp2 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=2)
self.cmp3 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=3)
self.cmp4 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=5)
4. Глобальный вариант - трансформер. Тоже можно использовать.
5. Комбинированный вариант:
Код:
self.cmp1 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=1)
self.cmp2 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=1)
self.cmp3 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=1)
self.cmp4 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=2)
self.cmp5 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=3)
self.cmp6 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=4)
self.cmp7 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=8)
self.cmp8 = CausalGatedMaxPool(d_model=D_MODEL, window_size=2, dilation=16)
self.transformer1 = Transformer()
self.transformer2 = Transformer()
Все представленные варианты не имеют дыр в рецептивном поле. Самый разреженный вариант - экспоненциальный - имеет самое широкое рецептивное поле, но повышенную слепоту в прошлое.
Комбинируя слои GPT-нейросети, можно добиться наилучшего соответствия архитектуры и данных, и в итоге получить более лёгкие вычисления и одновременно более высокую сходимость.
GatedMaxPool изучает зависимости между соседними токенами, что соответствует слоговым знаниям, частям слова и далее более глубокие слои GatedMaxPool изучают устойчивые словосочетания, завершается всё трансформерами, которые способны находить логические связи в предложениях, абзацах, главах, разделах, включая начало и конец текста.