Как мы все знаем, хотя модель Transformer, основанная на механизме Attention, имеет хорошую параллельную производительность, ее пространственная и временная сложность невелики.уровень,длина последовательности, поэтому, когдаКогда он относительно велик, вычислительная нагрузка модели Transformer невыносима. В последнее время много работы было посвящено уменьшению вычислительной нагрузки модели Transformer, например, сокращению модели, квантованию, дистилляции и другим методам оптимизации, или модификации структуры Attention, чтобы ее сложность можно было уменьшить дочетное
бумага«Трансформаторы - это RNN: быстрые авторегрессионные преобразователи с линейным вниманием»В нем упоминался метод линеаризации внимания (Linear Attention), который вызвал у меня интерес, а затем я прочитал несколько связанных блогов и дал хорошие результаты, и, наконец, обобщил свое понимание линеаризованного внимания в этой статье.
Attention
Наиболее популярным механизмом внимания являетсяScaled-Dot Attention,Сейчас
здесь, для простоты я не показывал коэффициент масштабирования Внимания. В этой статье нас в основном интересует сцена «Самовнимание», поэтому для удобства введения мы установили
Удалить Софтмакс
Читатели могут не подумать, что ключевым фактором, ограничивающим производительность Attention, на самом деле является Softmax в определении! На самом деле, простой вывод приводит к такому выводу.На этом шаге мы получаемМатрица, тогда нам нужно сделать Softmax
к одномуSoftmax вектор-строка , временная сложность, но дляСделайте Softmax для каждой строки матрицы, и временная сложность
Если нет Софтмакса, то формула Внимания становится произведением трех матриц, а умножение матриц удовлетворяет ассоциативной скорости, поэтому мы можем сначала вычислить, получитьматрица (временная сложность этого шага), затем используйтеУмножьте его налево (временная сложность этого шага),так как, поэтому приблизительная временная сложность равна
Для базы BERT,вместо 768, почему? Поскольку 768 на самом деле получается путем сращивания нескольких головок, и каждая головка
То есть удаление сложности «Внимание» из Softmax может быть сведено к самому идеальному линейному уровню.! Очевидно, это наша конечная цель: линейное внимание.
общее определение
Вопрос в том, можно ли считать удаление Softmax Внимание? Может ли он по-прежнему иметь стандартный эффект внимания? Чтобы ответить на этот вопрос, мы сначала перепишем определение Scaled-Dot Attention эквивалентным образом (все векторы в этой статье являются векторами-столбцами)
Вот небольшое объяснение, прежде всего мы знаем,сделать, согласно правилу умножения матриц,Первая строкаУмножьте первую строкуВсе столбцы полученного
представляет первую из окончательной выходной матрицыРяд
выражатьпервая из матрицыстрока (вектор-строка)
выражатьпервая из матрицыстолбец (вектор-столбец)
выражатьпервая из матрицыстолбец (вектор-столбец)
Таким образом, Scaled-Dot Attention на самом деле основано надля весовой парыСделайте средневзвешенное значение. Таким образом, мы можем предложить обобщенное определение внимания.
то есть поставитьзаменитьобщая функция, чтобы сохранить аналогичные характеристики распределения внимания, мы требуемХэн установил. То есть, если мы хотим определить новое внимание, мы должны сохранить форму уравнения (3) и удовлетворить
Эта общая форма внимания также известна как нелокальная сеть в CV из статьи«Нелокальные нейронные сети»
несколько примеров
Если вы напрямую удалите Softmax, то это, проблема в том, что внутренний продукт не гарантирует неотрицательность, так что это пока не разумный выбор. Ниже мы приводим несколько возможных вариантов
Стоит отметить, что первые два вида линейного внимания, представленные ниже, относятся к полю CV, а третий — кСу ЦзяньлиньБольшой парень задумал (помимо следующего введения, есть ещеEMANetУлучшения внимания в области резюме и т. д.)
Форма функции ядра
Естественная мысль: еслиКаждый элемент неотрицательный, поэтому скалярный продукт, естественно, неотрицательный. Для этого мы можем датьДобавьте функцию активации к каждому,Сейчас
вявляется функцией активации с неотрицательным диапазоном. Документы, упомянутые в начале статьиТрансформеры - это RNNвыбрано,в
Общийценность
Если вам нужно рассказать историю, уравнение (4) можно связать с «ядерным методом», особенночас,эквивалентна функции ядра, иЭто внутренний продукт, определяемый функцией ядра. Думая об этом, можно обратиться к статье«Рассечение трансформатора: единое понимание внимания трансформатора через призму ядра», не распространяйтесь слишком много здесь
Волшебное использование Softmax
Еще одна более ранняя статья«Эффективное внимание: внимание с линейными сложностями»дает более интересный вариант. он замечаетсередина,,если"существуетчто одно измерение нормализовано, исуществуетчто одно измерение нормализовано", тозаключается в автоматическом удовлетворении нормализации, поэтому выбор, который она дает,
в,соответственно в первом, второе измерениеВыполните операцию Softmax. То есть в это время каждый из нас даетДобавить Softmax, а не закончитьЗатем добавьте Софтмакс
Фактически можно доказать, что эта форма также является частным случаем формулы (4), которая соответствует, читатель может сделать вывод
идея Сушена
Здесь Су Шэнь подал идею. Отправной точкой этой идеи является уже не уравнение (4), а расширение Тейлора исходного определения (2). В расширенном по Тейлору мы имеем
если, то можно гарантировать неотрицательность правой части, так что. Читатели, возможно, уже подумали об этом здесь и хотят гарантировать, необходимо толькоДелатьНормализованный. Поэтому окончательный план, предложенный Су Шэнем, таков:
как,но
Это отличается от уравнения (4), но теоретически оно ближе к исходному масштабируемому точечному вниманию.
выполнить
Это в основном для реализации метода, предложенного Су Шеном, но из-за ограниченного уровня автора, в финальном реализованном коде на самом деле есть некоторые проблемы, в основном:
- По результатам тестов улучшенная скорость расчета не улучшилась
- Не могу суммировать до 1
Реализация кода предназначена в основном дляPyTorch реализация BERTКод этой статьи, точнее, фактически только измененScaledDotProductAttention
Это функция, поэтому ниже выложена только эта часть кода
class ScaledDotProductAttention(nn.Module):
def __init__(self):
super(ScaledDotProductAttention, self).__init__()
def forward(self, Q, K, V, attn_mask):
Q = F.normalize(Q, dim=3)
K = F.normalize(K, dim=3)
M = (torch.ones(Q.shape[0], Q.shape[1], Q.shape[2], K.shape[2]) + torch.matmul(Q, K.transpose(-1, -2))) # scores : [batch_size, n_heads, seq_len, seq_len]
M_sum = torch.sum(M, dim=3)
M = M / M_sum.unsqueeze(3).repeat(1, 1, 1, M.shape[3])
attn = M.masked_fill(attn_mask, 0) # Fills elements of self tensor with value where mask is one.
context = torch.matmul(attn, V)
return context
Если у вас есть лучший метод реализации, пожалуйста, дайте мне знать