WalzoneInterview Prep
📞 Interviewing soon? Practice with a realistic AI mock phone interview — it calls you, then scores you. First 15 min FREE →

PyTorch · Advanced · question 48 of 100

Explain the Transformer architecture and how it can be implemented using PyTorch’s nn.Transformer module.?

📕 Buy this interview preparation book: 100 PyTorch questions & answers — PDF + EPUB for $5

The Transformer architecture is a widely used neural network architecture that is commonly used in natural language processing (NLP) tasks. It was originally introduced in the paper "Attention is All You Need" by Vaswani et al. in 2017. The Transformer architecture is based on the concept of self-attention, which allows the network to focus on different parts of the input sequence at different times. This is particularly useful in NLP tasks, where the meaning of a given word depends on the context in which it appears.

The Transformer architecture consists of an encoder and a decoder, with each component containing a series of self-attention layers, as well as feedforward layers. The encoder takes in the input sequence and processes it using a series of self-attention and feedforward layers, producing a sequence of hidden states. The decoder then takes the encoder output and uses it to generate the output sequence, one token at a time. At each decoding step, the decoder output is fed back into the self-attention and feedforward layers of the decoder.

PyTorch’s nn.Transformer module provides an easy-to-use implementation of the Transformer architecture. To implement a Transformer model, one first needs to define the number of layers, the number of heads in each self-attention layer, the size of the input and output embeddings, as well as the size of the feedforward layers.

import torch.nn as nn
import torch.nn.functional as F

class TransformerModel(nn.Module):

    def __init__(self, input_size, output_size, d_model, nhead, num_layers, dim_feedforward):
        
        super().__init__()
        
        self.embedding = nn.Embedding(input_size, d_model)
        self.pos_encoder = PositionalEncoding(d_model)
        
        # Define the Transformer encoder and decoder layers
        encoder_layer = nn.TransformerEncoderLayer(d_model=d_model, nhead=nhead, 
                                                    dim_feedforward=dim_feedforward)
        decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead, 
                                                    dim_feedforward=dim_feedforward)
        
        self.transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers)
        self.transformer_decoder = nn.TransformerDecoder(decoder_layer, num_layers)
        
        self.fc = nn.Linear(d_model, output_size)
        
    def forward(self, src, tgt):
        
        # Embed the input sequence and apply positional encoding
        src = self.embedding(src)
        src = self.pos_encoder(src)
        
        # Get the mask for the input sequence
        src_mask = self._generate_square_subsequent_mask(src.size(0)).to(src.device)
        
        # Apply the Transformer encoder to the input sequence
        memory = self.transformer_encoder(src, src_mask)
        
        # Embed the target sequence and apply positional encoding
        tgt = self.embedding(tgt)
        tgt = self.pos_encoder(tgt)
        
        # Get the mask for the target sequence
        tgt_mask = self._generate_square_subsequent_mask(tgt.size(0)).to(tgt.device)
        
        # Get the mask for the encoder-decoder attention
        memory_mask = None
        
        # Apply the Transformer decoder to the target sequence
        output = self.transformer_decoder(tgt, memory, tgt_mask, memory_mask)
        
        output = self.fc(output)
        
        return output

In this example, we define a simple Transformer model with an embedding layer, a positional encoding layer, a Transformer encoder, a Transformer decoder, and a fully connected layer for the output. The ‘input_size‘ and ‘output_size‘ variables correspond to the size of the input and output vocabularies, respectively. The ‘d_model‘ variables corresponds to the size of the hidden layers and embeddings, while ‘nhead‘ refers to the number of heads in each self-attention layer. ‘num_layers‘ refers to the number of self-attention and feedforward layers in the Transformer encoder and decoder, and ‘dim_feedforward‘ refers to the size of the feedforward layers.

During the forward pass of the model, we first apply an embedding layer to the input and target sequences and apply a positional encoding layer to account for the order of the tokens. We then apply the Transformer encoder to the input sequence to obtain the encoded input, ‘memory‘. We then apply the Transformer decoder to the target sequence, using ‘memory‘ as context, to obtain the output sequence, ‘output‘. Finally, we apply a fully connected layer to map the output sequence to the desired output dimension.

Reading is step one. Saying it out loud is the interview. Our AI interviewer calls your phone and runs a realistic PyTorch interview — then scores it.
📞 Practice PyTorch — free 15 min
📕 Buy this interview preparation book: 100 PyTorch questions & answers — PDF + EPUB for $5

All 100 PyTorch questions · All topics