РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
364 of 769 menu

Класс TransformerDecoder

Класс TransformerDecoder реализует стек слоёв декодера, который используется в архитектуре Transformer. Он принимает на вход скрытые представления от энкодера и генерирует выходную последовательность. Конструктор класса первым параметром принимает экземпляр слоя TransformerDecoderLayer, вторым параметром - количество таких слоёв num_layers. Также можно передать параметр norm для нормализации выходных данных.

Синтаксис

torch.nn.TransformerDecoder( decoder_layer: TransformerDecoderLayer, num_layers: int, norm: Optional[Module] = None )

Пример

Создадим простой декодер с одним слоем и применим его к входным данным:

import torch import torch.nn as nn # Создаём один слой декодера с размерностью модели 512 и 8 головами внимания decoder_layer = nn.TransformerDecoderLayer( d_model=512, nhead=8, batch_first=True ) # Создаём декодер из двух таких слоёв decoder = nn.TransformerDecoder( decoder_layer, num_layers=2 ) # Генерируем случайные входные данные tgt = torch.rand(10, 32, 512) # (seq_len, batch, d_model) memory = torch.rand(20, 32, 512) # (seq_len, batch, d_model) # Прямой проход через декодер output = decoder(tgt, memory) print(output.shape)

Результат выполнения кода:

torch.Size([10, 32, 512])

Пример

При работе с декодером важно использовать маски, чтобы скрыть будущие токены в целевой последовательности. Рассмотрим создание маски и передачу её в метод forward:

import torch import torch.nn as nn torch.manual_seed(0) decoder_layer = nn.TransformerDecoderLayer( d_model=512, nhead=8, batch_first=True ) decoder = nn.TransformerDecoder( decoder_layer, num_layers=1 ) tgt = torch.rand(2, 5, 512) # (batch, seq_len, d_model) memory = torch.rand(2, 7, 512) # (batch, seq_len, d_model) # Создаём маску для целевой последовательности (причинная маска) tgt_mask = torch.triu( torch.ones(5, 5) * float('-inf'), diagonal=1 ) output = decoder( tgt, memory, tgt_mask=tgt_mask ) print(output.shape)

Результат выполнения кода:

torch.Size([2, 5, 512])

Пример

Декодер поддерживает передачу ключевых и сто́имостных проекций отдельно от памяти энкодера. Это полезно в задачах, где требуется дополнительная информация, например, в моделях с кэшированием состояний:

import torch import torch.nn as nn torch.manual_seed(0) decoder_layer = nn.TransformerDecoderLayer( d_model=512, nhead=8, batch_first=True ) decoder = nn.TransformerDecoder( decoder_layer, num_layers=2 ) tgt = torch.rand(3, 4, 512) # (batch, seq_len, d_model) memory = torch.rand(3, 6, 512) # (batch, seq_len, d_model) # Отдельные проекции для ключей и значений memory_key = torch.rand(3, 6, 512) memory_value = torch.rand(3, 6, 512) output = decoder( tgt, memory, memory_key=memory_key, memory_value=memory_value ) print(output.shape)

Результат выполнения кода:

torch.Size([3, 4, 512])

Смотрите также

  • класс Transformer,
    который объединяет энкодер и декодер в одной модели
  • класс TransformerEncoder,
    который реализует стек слоёв энкодера
  • класс TransformerEncoderLayer,
    который представляет один слой энкодера
  • класс TransformerDecoderLayer,
    который представляет один слой декодера
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить