Механизм инференса обученной модели при генерации последовательности. Часть 1

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

Механизм  инференса обученной модели

Обзор архитектуры модели

Рассмотрим механизм вывода обученной модели на примере следующей строки _он_знает_это. Архитектура модели, для наглядности, будет примерно такой же, как в рассмотренном примере механизма процесса обучения:

  • vocab: 26
  • num_units: 6
  • num_layers: 1
  • num_heads: 2
  • ffn_inner_dim: 12
  • maximum_relative_position: 8

Представление токена и обработка кодировщиком

Для каждого токена векторное представление токена извлекается из исходной матрицы встраивания обученной модели и подается на вход кодировщика. В кодировщике происходят абсолютно все те же преобразования, что и при обучении модели. Отличие в том, что к матрицам не применяется механизм дропаута. После преобразований в кодировщике мы получаем encoder_outputsmatrix. (Изображение 1 - Матрица encoder_outputs)

Механизм  инференса обученной модели

Параметры и инициализация вывода

Далее рассмотрим пример вывода со следующими параметрами. В нашем случае были использованы следующие параметры вывода:

  • beam_size = 2
  • length_penalty = 0.2
  • coverage_penalty = 0.2
  • sampling_topk = 5
  • sampling_temperature = 0.5

Затем применение функции tfa.seq2seq.tile_batch(encoder_outputs, beam_size) позволяет дублировать матрицу значений, полученную после кодировщика, на величину beam_size. Выход представляет собой матрицу значений * размер луча, в нашем случае два. (Изображение 2 — Выходы кодировщика * размер луча)

Механизм  инференса обученной модели

Вторым шагом является инициализация переменных:

1) размер пакета для перевода, в нашем примере batch_size = 1;

2) матрица start_ids, содержащая индексы токенов начала последовательности <s> по размерности beam_size → start_ids = tfa.seq2seq.tile_batch (start_ids, beam_size) = [1 1];

3) матрица finished, заполненная нулями, с типом данных boolean и размерностью batch_size * beam_sizetf.zeros ([batch_size * beam_size], dtype=tf.bool)] = [0 0];

4) матрица initial_log_probstf.tile ([0.0] + [-float(“inf”)] * (beam_size - 1), [batch_size]) = [0 -inf];

5) инициализируется словарь с дополнительными переменными extra_vars, который содержит следующие переменные:

Затем в цикле повторяем до тех пор, пока не достигнем максимального значения (максимальное значение по умолчанию — maximum_decoding_length = 250) или до конца последовательности токен сгенерирован.

Шаг 0

По матрице start_ids из целевой матрицы эмбеддингов обученной модели извлекаются векторные представления токенов и вместе с дублированной на число beam_size матрицей encoder_outputs подаются на вход декодера. В декодере происходят абсолютно все те же преобразования, что и при обучении модели. Разница в том, что не формируется тензор future_mask, а также не применяется механизм dropout. (Изображение 3 - процесс декодера)

Механизм  инференса обученной модели

Переменные batch_size = 1 и vocab_size = 26 формируются по размерности матрицы логитов, полученной от декодера. Далее с помощью функции tf.one_hot(tf.fill([batch_size], end_id), vocab_size, on_value=logits.dtype.max формируется матрица eos_max_prob, где:

  • tf.fill([batch_size], end_id); end_id — индекс токена конца последовательности </s> → [2 2];
  • logits.dtype.max — максимальное значение типа данных tf.float32, которое равно 3.4028235e+38 или 340282350000000000000000000000000000000000;
  • logits.dtype.min — это максимальное значение типа данных tf.float32, которое равно -3,4028235e+38 или -34028235000000000000000000000000000000000.

Таким образом, на выходе получается матрица eos_max_prob размером 2 x 26, где элементы с индексом 2 будут заполнены максимальным значением, а все остальные элементы будут заполнены минимальным значением. (Изображение 4 — матрица eos_max_prob)

Механизм  инференса обученной модели

Используя функцию tf.where (tf.broadcast_to (tf.expand_dims (finished, -1), tf.shape(logits)), x=eos_max_prob, y=logits), где матрица finished меняет размерность: tf.expand_dims([0, 0], -1)[ [0][0]], получаем массив значений по размерности матрицы logits: tf.shape(logits) → [2 26] и увеличиваем размерность: tf.broadcast_to ([[0], [0]], [2, 26]) → [[0 0 0 0 ... 0 0 0 0], [0 0 0 0 ... 0 0 0]].

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

Матрица log_probs вычисляется из матрицы logits с помощью функции tf.nn.log_softmax(logits). (Изображение 5 — Матрица log_probs)

Механизм  инференса обученной модели

Если coverage_penalty != 0, дополнительно выполняются следующие действия:

  • матрица finished модифицируется и преобразуется с помощью функции tf.math.logical_not([0, 0]) для формирования матрицы not_finished → [1 1];
  • результирующая матрица размерно модифицируется tf.expand_dims (tf.cast( not_finished, awareness.dtype), 1) → [[1], [1]] ;
  • полученная матрица умножается на матрицу внимания; (Изображение 6 - матрица внимания)
Механизм  инференса обученной модели
  • формируется переменная collected_attention. (Изображение 7 - переменная collected_attention )
Механизм  инференса обученной модели

Затем матрица total_probs формируется путем сложения матрицы log_probs и инвертированной матрицы cum_log_probs → log_probs + tf.expand_dims (cum_log_probs, 1). (Изображение 8 - матрица total_probs)

Механизм  инференса обученной модели

По матрицам total_probs, sequence_lengths, finished и collected_attention рассчитываются scores. Расчет баллов включает следующие шаги:

1) Исходная матрица scores → scores = total_probs инициализируется матрицей total_probs (Изображение 9 - матрицы total_probs и scores);

Механизм  инференса обученной модели

2) Если length_penalty != 0, выполнить следующие действия:

  • формируется матрица expand_sequence_lengths - матрица sequence_lengths размерно изменяется tf. expand_dims ( sequence_lengths, 1) → [[0], [0]] ;
  • к матрице expand_sequence_lengths добавляется единица и матрица приводится к типу значений log_probs - tf.cast( expand_sequence_lengths + 1, log_probs.dtype) → [[0], [0]] + 1 = [[1], [1]] ;
  • формируется матрица sized_expand_sequence_lengths - к полученной выше матрице прибавляется константа 5 и делится на константу 6: (5.0 + expand_sequence_lengths ) / 6.0 → (5 + [1]) / 6 = [[1], [1]].
  • формируется матрица sized_sequence_lengths - матрица sized_expand_sequence_lengths возводится в степень, указанную в параметре length_penalty: tf.pow(sized_expand_sequence_lengths, length_penalty) → [[1]**0.2, [1]**0.2] = [[1], [1]] ;
  • значения матрицы корректируются путем целочисленного деления на матрицу penalized_sequence_lengthsбаллы /= penalized_sequence_lengths. (Изображение 10 - баллы)
Механизм  инференса обученной модели

3) Если coverage_penalty != 0, то выполняем следующие действия:

  • матрица equal формируется матрицей collected_attention с помощью функции tf.equal(accumulated_attention, 0.0) tf.expand_dims (sequence_lengths, 1), т.е. проверяем элементы матрицы на равенство нулю; (Изображение 11 - матрица equal)
Механизм  инференса обученной модели
Механизм  инференса обученной модели
  • с помощью функции where">tf.where(equal, x=ones_like, y=accumulated_attention) переопределяется матрица collected_attention, где значения будут браться из x, если элемент из equal равен единице, в противном случае из y. Так как все элементы матрицы equal равны нулю, то все значения будут браться из y; (Изображение 13 - матрица collected_attention)
Механизм  инференса обученной модели
  • формируется матрица coverage_penalty - из матрицы collected_attention берется минимальное значение и unit и вычисляется логарифм, после чего элементы суммируются tf.reduce_sum (tf.math.log(tf.minimum( accumulated_attention , 1.0)), axis=1) ; (Изображение 14 - матрица coverage_penalty )
Механизм  инференса обученной модели
  • полученная на предыдущем шаге матрица coverage_penalty умножается на матрицу finished coverage_penalty *= finished ; (Изображение 15 - coverage_penalty )
Механизм  инференса обученной модели
  • Матрица scores корректируется на указанное значение coverage_penalty из параметров и вычисленной матрицы coverage_penalty - scores += self. coverage_penalty * tf.expand_dims(coverage_penalty, 1). (Изображение 16 - матрица scores)
Механизм  инференса обученной модели

Следующий шаг включает работу с матрицами scores и total_probs. Матрица scores преобразуется с помощью tf.reshape (scores, [-1, beam_size * vocab_size]). (Изображение 17 - матрица scores)

Механизм  инференса обученной модели

Матрица total_probs преобразуется с помощью tf.reshape (scores, [-1, beam_size * vocab_size]). (Изображение 18 - матрица total_probs)

Механизм  инференса обученной модели

Следующий шаг — вычисление идентификаторов целевых токенов sample_ids и оценок для этих токенов sample_scores:

  • с помощью функции tf.nn.top_k находим максимальные значения и их индексы top_scores, top_ids = tf.nn.top_k(scores, k=sampling_topk) (если параметр sampling_topk не указан, то k будет равен beam_size); (Изображение 19 — матрица top_scores и top_ids)
Механизм  инференса обученной модели
  • матрица top_scores делится на значение параметра sampling_temperature ; (Изображение 20 — параметр sampling_temperature )
Механизм  инференса обученной модели
  • из скорректированной матрицы top_scores с помощью функции tf.random.categorical извлекаются индексы элементов в ряду beam_size ; (Изображение 21 — sample_ids)
Механизм  инференса обученной модели
  • по индексам элементов с помощью функции tf.gather извлекаются индексы токенов из матрицы top_ids; (Изображение 22 - индексы токенов)
Механизм  инференса обученной модели
  • по индексам элементов оценки для этих токенов извлекаются из матрицы оценок с помощью функции tf.gather. (Изображение 23 - матрица sample_scores)
Механизм  инференса обученной модели

Затем формируется матрица cum_log_probs из полученных значений sample_ids из матрицы total_probs. (Изображение 24 - Матрица cum_log_probs) Матрица word_ids формируется путем деления остатка на значение vocab_sizeword_ids = sample_ids % vocab_size = [9 12] % 26 = [9 12].

Механизм  инференса обученной модели

Целочисленным делением на значение vocab_size формируется матрица beam_ids → beam_ids = sample_ids // vocab_size = [9 12] // 26 = [0 0 0] из полученных значений sample_ids, целочисленным делением на значение vocab_size.

Используя полученные матрицы word_ids и beam_ids и значение beam_size, формируется матрица beam_indices → beam_indices = (tf.range (tf.shape(word_ids)[0]) // beam_size) * beam_size + beam_ids = ([0 1] // 2) * 2 + [0 0 0] = [ 0 0].

Дальнейший шаг включает перераспределение матриц sequence_lengths, finished и sequence_lengths следующим образом:

  • матрица sequence_lengths → sequence_lengths = tf.where(finished, x= sequence_lengths, y= sequence_lengths + 1); (Изображение 25 - матрица sequence_lengths )
Механизм  инференса обученной модели

После этого работа со словарем extra_vars будет осуществляться следующим образом:

  • матрица finished → finished = tf.gather(finished, beam_indices ) → tf.gather([0 0], [0 0]) = [0 0] ;
  • матрица sequence_lengths → finished = tf.gather ( sequence_lengths, beam_indices ) → tf.gather([1 1 1], [0 0]) = [1 1].
  • матрица sequence_lengths сохраняется в словаре extra_vars по ключу sequence_lengths → extra_vars = {“ sequence_lengths ”: sequence_lengths };
  • beam_ids и текущие значения шагов записываются в словарь extra_vars по ключу parent_ids → extra_vars = {“parent_ids”: parent_ids.write(step, beam_ids)};
  • матрица collected_attention сохраняется в словаре extra_vars по ключу collected_attention → tf.gather( accumulated_attention, beam_indices); (Изображение 26 - матрица collected_attention )
Механизм  инференса обученной модели

Это завершает шаг 0, матрицы word_ids, cum_log_probs, finished и словарь extra_vars передаются в начало цикла и всего процесса, описанного выше. (Изображение 27 - матрицы word_ids, cum_log_probs,finished и словарь extra_vars)

Механизм  инференса обученной модели

Заключение

В этой статье мы тщательно изучили механизм вывода обученной модели, используя пример строки «он знает это». Мы начали с описания архитектуры модели и основных параметров, которые определяют ее структуру, таких как размер словаря, количество единиц и слоев. Процесс представления токенов и обработки кодировщика был подробно описан, подчеркивая преобразование входных токенов через кодировщик без применения дропаута, тем самым обеспечивая согласованность с этапом обучения. Мы обсудили инициализацию параметров вывода и циклическую структуру, которая управляет итеративным процессом декодирования, выделив различные задействованные матрицы, включая log_probs, total_probs и управление штрафами.

Во второй части этой статьи мы рассмотрим шаг 1, шаг 2 и шаг 3 соответственно, где также будут раскрыты детали механизма вывода.


Вас ждет еще больше увлекательного чтения

Машинный перевод

Машинный перевод

November 10, 2025

Сравнение качества систем распознавания речи

Сравнение качества систем распознавания речи

April 30, 2025

Машинный перевод в военной сфере

Машинный перевод в военной сфере

April 16, 2025

×