Серия «Введение в модель BERT» (3): подробное объяснение самоконтроля

искусственный интеллект Нейронные сети

После появления модели BERT в 2018 году различные производные модели BERT ALBERT, SpanBERT, DistilBERT, SesameBERT, SembERT, SciBERT, BioBERT, MobileBERT, TinyBERT и CamemBERT выросли как грибы после дождя. Есть ли что-то общее у этих различных моделей bert? немного!

Ответ — внимание к себе. Что такое внимание к себе? Какая математическая логика стоит за этим? Это то, что мы собираемся обсудить сегодня. Основная цель этой статьи — пройтись по математическим расчетам, связанным с моделью само-внимания в целом.

1. Что такое модель внимания к себе?Зачем вам нужна модель внимания к себе?

Я представил модель внимания раньше, и я понимаю модель внимания.Если вы думаете о типах внимания и внимания к себе, то поздравляю с вашим ответом.Концептуально и некоторые математические операции, эти две модели имеют много схожих концепций.

Наш человеческий язык представляет собой векторную последовательность переменной длины. Когда мы выполняем машинный перевод, мы обычно используем рекуррентную нейронную сеть (RNN) для контекстного кодирования. RNN представляет собой модель нейронной сети, которая передает информацию о словах линейным образом (т. Слова должны обрабатываться ввод за вводом). Этот линейный подход к RNN приносит две проблемы:

**1.Скорость обучения ограничена.**Из-за естественной последовательной структуры RNN она обрабатывается линейным образом во время обучения и не может быть распараллелена, поэтому скорость обучения будет ограничена.

**2. Способность обрабатывать длинные тексты слабая. Когда RNN обрабатывает слова, текущее состояние обработки информации о слове будет передано следующему слову, и информация о слове будет ослабевать по мере увеличения расстояния. особенно длинные слова в передней части и слова в задней части не имеют допустимого переноса состояния. Но в некоторых длинных текстах вам нужно знать контекст, чтобы знать значение слова, например, «я прибыл на берег после перехода через реку», вот берег или берег реки, что требует контекста, когда вы увидеть реку, вы должны Зная, что берег здесь, скорее всего, означает берег реки. В RNN все слова от берега до реки необходимо обрабатывать шаг за шагом по порядку, и эффект RNN часто плохой, когда они находятся далеко друг от друга.

Чтобы решить эти две проблемы, нам нужно использовать модель само-внимания.

2. Каков процесс вычисления собственного внимания?

В процессе вычисления собственного внимания каждое слово будет проходить Embedding, чтобы получить вектор слова.[公式], для каждого входа[公式], сначала путем линейного отображения в три разных пространства получаются три матрицы[公式],[公式],[公式]. в,[公式]да[公式]Линейно отображает на[公式]матрица параметров.[公式]Это параметры, полученные в процессе обучения.Сначала у нас есть концепция, а потом мы увидим, как эти матрицы параметров берутся из кода.

Основные параметры внутреннего внимания Источник изображения:Джиангала Wrangler.GitHub.IO/иллюстрировано…

Давайте сначала посмотрим на процесс расчета модели само-внимания.

Процесс расчета собственного внимания

Предположим, что входная последовательность[公式]Выходная последовательность[公式], то расчет собственного внимания можно разделить на три шага

1. Вычислить Q (вектор запроса Quey), K (ключевой вектор), Value (вектор значения)

[公式]

[公式]

[公式]

2. Рассчитайте вес внимания, где скалярное произведение используется в качестве функции оценки внимания.

[公式]

Можно сократить как:

[公式]

в,[公式]Представляет вектор запроса[公式]или ключевой вектор[公式]измерение

3. Рассчитайте выходную векторную последовательность

[公式]

в,[公式]- позиции выходных и входных векторных последовательностей,[公式]Представляет вес j-го входа для n-го выхода.

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

В нашем случае мы инициализируем[公式]является следующим значением:

Инициализация параметра:

[公式]матрица параметров

[[0, 0, 1],
 [1, 1, 0],
 [0, 1, 0],
 [1, 1, 0]]

[公式]матрица параметров

[[1, 0, 1],
 [1, 0, 0],
 [0, 0, 1],
 [0, 1, 1]]

[公式]матрица параметров

[[0, 2, 0],
 [0, 3, 0],
 [1, 0, 3],
 [1, 1, 0]]

Примечание:[公式]Обычно используйте инициализацию случайного распределения _Gaussian, Xavier_ и _Kaiming_. Эти инициализации выполняются до начала обучения. Tensor2tensor — это платформа Google с открытым исходным кодом, которая реализует такие модели, как внимание, само-внимание и bert, но эта модель устарела. Google разработал trax в качестве замены tensor2tensor. Давайте посмотрим на trax в модели само-внимания. Как обрабатываются Q, K и V?

Для простоты понимания часть кода была удалена, остался только ствол.

# trax/layers/attention.py
def AttentionQKV(d_feature, n_heads=1, dropout=0.0, mode='train',
                 cache_KV_in_predict=False, q_sparsity=None,
                 result_sparsity=None):

  # 构造q、k、v处理层,是一个d_feature个神经元的全连接层
  k_processor = core.Dense(d_feature)
  v_processor = core.Dense(d_feature)

  if q_sparsity is None:
    q_processor = core.Dense(d_feature)

  return cb.Serial(
      cb.Parallel(
          q_processor,
          k_processor,
          v_processor,
      ),
      PureAttention(  # pylint: disable=no-value-for-parameter
          n_heads=n_heads, dropout=dropout, mode=mode),
      result_processor
  )

Среди них core.Dense создает полносвязный слой, а полносвязный слой вызывает функцию init_weights_and_state для инициализации весов.

Инициализировать веса скрытых слоев

# trax/layers/core.py 
 def init_weights_and_state(self, input_signature):
    shape_w = (input_signature.shape[-1], self._n_units)
    shape_b = (self._n_units,)
    # 随机初始化隐藏层的权重
    rng_w, rng_b = fastmath.random.split(self.rng, 2)
    w = self._kernel_initializer(shape_w, rng_w)
    if self._use_bfloat16:
      w = w.astype(jnp.bfloat16)

    if self._use_bias:
      b = self._bias_initializer(shape_b, rng_b)
      if self._use_bfloat16:
        b = b.astype(jnp.bfloat16)
      self.weights = (w, b)
    else:
      self.weights = w

Введите Х:

X1=[1,0,1,0]
x2=[0,2,0,2]
x3=[1,1,1,1]

Шаг 1: Рассчитать

#计算Q
                [1, 0, 1]
[1, 0, 1, 0]    [1, 0, 0]     [1, 0, 2]
[0, 2, 0, 2]  x [0, 0, 1] =   [2, 2, 2]
[1, 1, 1, 1]    [0, 1, 1]     [2, 1, 3]

#计算K              
                [0, 0, 1]
[1, 0, 1, 0]    [1, 1, 0]     [0, 1, 1]
[0, 2, 0, 2]  x [0, 1, 0] =   [4, 4, 0]
[1, 1, 1, 1]    [1, 1, 0]     [2, 3, 1]
               
#计算V
                [0, 2, 0]
[1, 0, 1, 0]    [0, 3, 0]     [1, 2, 3]
[0, 2, 0, 2]  x [1, 0, 3] =   [2, 8, 0]
[1, 1, 1, 1]    [1, 1, 0]     [2, 6, 3]

запрос, ключ, вычисление значения

Шаг 2. Рассчитайте вес внимания

Мы рассчитываем вес внимания по скалярному произведению, и формула для расчета веса внимания выглядит следующим образом:

Сначала рассчитайте вес внимания, рассчитавТранспонировать матрицу KСкалярный продукт с Q получается.

[1, 0, 2]    [0, 4, 2]   [2, 4, 4]
[2, 2, 2] x  [1, 4, 3] = [4, 16, 12]
[2, 1, 3]    [1, 0, 1]   [4, 12, 10]

в,[公式]Представляет вектор запроса[公式]или ключевой вектор[公式]измерение, здесь,[公式]= 3, для удобства расчета берем только один знак после запятой, тогда √_3_=1,7.

Итак, согласно[公式]Расчет можно получить:

[1.2, 2.4, 2.4]
[2.4, 9.4, 7.1]
[2.4, 7.1, 5.9]

Наконец, мы вычисляем[公式], получить матрицу веса внимания

# 注意力权重矩阵
[0.1, 0.4, 0.4]
[0.0, 0.9, 0.0]
[0.0, 0.7, 0.2]

Расчет веса внимания

Для запроса Q разные значения ключей K имеют разные веса внимания, например: для ввода[公式], ключевое значение[公式], а соответствующие веса внимания равны 0,1, 0,4 и 0,4 соответственно.

Шаг 3: Рассчитайте последовательность выходных векторов

Формула для вычисления последовательности выходных векторов выглядит следующим образом:

[公式]

в,[公式]- позиции выходных и входных векторных последовательностей,[公式]Представляет вес j-го входа для n-го выхода.

[公式]

h1 = [1, 2, 3] * 0.1 + [2, 8, 0] * 0.4 + [2, 6, 3] * 0.4
   = [1.7, 5.8, 1.5]

[公式]

h2 = [1, 2, 3] * 0.0 + [2, 8, 0] * 0.9 + [2, 6, 3] * 0.0
   = [1.8, 7.2, 0]

[公式]

h3 = [1, 2, 3] * 0.0 + [2, 8, 0] * 0.7 + [2, 6, 3] * 0.2
   = [1.8, 6.8, 0.6] 

Процесс расчета собственного внимания

3. Многоголовочный механизм внимания:

Модель само-внимания можно рассматривать как установление интерактивных отношений между различными векторами на входе X в пространстве линейной проекции. Чтобы извлечь больше интерактивной информации, мы можем использовать мульти-головное само-внимание, во множестве Различная интерактивная информация снятые в разных проекционных пространствах.

Механизм многоголового внимания является расширением само-внимания.Для входа x используется многоголовое внимание.Если количество используемых головок равно n, то входной вектор x будет разделен на n независимых векторов, и каждый вектор использует само-внимание Вычисляет веса внимания и объединяется после завершения.

Модель трансформатора, которую мы объясним в следующей статье, использует механизм внимания с несколькими головками.

Модель внутреннего внимания вычисляет веса[公式]зависеть только от[公式]и[公式]Корреляция входной информации игнорируется, поэтому, когда она используется отдельно, обычно необходимо добавлять информацию о кодировании положения для исправления.

Ссылаться на:

zhuanlan.zhihu.com/p/47282410

Джиангала Wrangler.GitHub.IO/иллюстрировано…

АР Вест V.org/ABS/1706.03…

в сторону data science.com/illustrated…

google/trax

«Нейронные сети и глубокое обучение»

«Понимание машинного чтения: алгоритмы и практика»