Создание позиционных кодировок
Векторное представление токенов — хорошее начало, однако эмбеддинги пока не содержат информации о позиции каждого токена в последовательности. Чтобы исправить это, архитектура трансформера использует позиционные кодировки, которые добавляют сведения о позиции каждого токена в его эмбеддинг.
Вам предстоит создать класс PositionalEncoding со следующими параметрами:
d_model— размерность входных эмбеддингов;max_seq_length— максимальная длина последовательности (или длина последовательности, если все последовательности имеют одинаковую длину).
Это упражнение является частью курса
Трансформерные модели с PyTorch
Инструкции к упражнению
- Создайте матрицу нулей размером
max_seq_lengthнаd_model. - Выполните вычисления синуса и косинуса для
position * div_term, чтобы получить чётные и нечётные значения позиционного эмбеддинга. - Убедитесь, что
peне является обучаемым параметром в процессе обучения. - Прибавьте преобразованные позиционные эмбеддинги к входным эмбеддингам токенов
x.
Интерактивное практическое упражнение
Попробуйте выполнить это упражнение, дополнив этот пример кода.
class PositionalEncoding(nn.Module):
def __init__(self, d_model, max_seq_length):
super().__init__()
# Create a matrix of zeros of dimensions max_seq_length by d_model
pe = ____
position = torch.arange(0, max_seq_length, dtype=torch.float).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2).float() * -(math.log(10000.0) / d_model))
# Perform the sine and cosine calculations
pe[:, 0::2] = torch.____(position * div_term)
pe[:, 1::2] = torch.____(position * div_term)
# Ensure pe isn't a learnable parameter during training
self.____('____', pe.unsqueeze(0))
def forward(self, x):
# Add the positional embeddings to the token embeddings
return ____ + ____[:, :x.size(1)]
pos_encoding_layer = PositionalEncoding(d_model=512, max_seq_length=4)
output = pos_encoding_layer(token_embeddings)
print(output.shape)
print(output[0][0][:10])