Efficient Streaming Language Models with Attention Sinks
как оказывается, есть интересны phenomenon в механизме внимания - предположим, у нас есть некоторое количество баланса/бюджета/энергии, которое в аттеншне распределяется по токенам (и после софтмакса этот бюджет суммируется в 1).
и в идеальном мире мы представляем, что у нас все распределяется адекватно, иначе можно перефразировать Священное Писание и выразиться так:
каждому токену воздастся за релевантный контекст его 🤔
но на практике наблюдаем немного другое - на более глубоких слоях тот “фиксированный бюджет” оказывается избыточным, а его надо куда-то сливать в системе, ну и в нейронке это сливается в первые токены (в основном в первый)
и вот авторы предлагают стабилизировать ситуацию:
- не меняя первый токен из всей длиннющей последовательности, по которой мы привыкли пробегаться трансформером при помощи скользящего окна
- менять первый токен в инпуте, который мы скармливаем модели, вообще на что угодно (например на \n)
- сделать обучаемый фиктивный токен, который будет принимать в себя всю вот эту избыточную энергию аттеншна и ставить его всегда на первое место (в обратном случае работает хуже)
все пункты выше можно назвать attention sinks ⇒ стабилизирует инференс, да и в скорости нехилый прирост дает на стриминговом сетапе
есть только момент, который я не могу понять в папире -
на последней картинке параграф, где идет пояснение про поз энкодинг в кв кэше. там подаются в общем относительные позиции внутри кеша.
оттого и встает вопрос - а есть ли смысл в принципе создавать вот эти якоря для аттеншна, если можно сразу вот так нативно исправить позицию в позиционной кодировке для кв кеша?
по идее тогда свойства сохранятся, ведь, как сами показали авторы, в аттеншн синке больше влияет позиция, чем сам токен (оттого и вместо этого токена можно вставить что угодно). могу быть не прав, но хз-хз
👀LINK