Весь код опубликован вот взято из блокнота Jupyter, который прилагается к книге: Создание моделей трансформаторов с помощью PyTorch 2.0. Перейдя к их коду в репозитории, вы увидите объявление модели:
Код: Выделить всё
vocab_size = tokenizer.vocab_size
embedding_dim = 512
nhead = 8
num_layers = 6
num_classes = 2
# Create the model
model = TextClassifier(vocab_size, embedding_dim, nhead, num_layers, num_classes).to(device)
criterion = nn.BCELoss().to(device)
optimizer = optim.Adam(model.parameters(), lr=0.001)
Код: Выделить всё
num_epochs = 1
for epoch in range(num_epochs):
i=0
for batch_data, batch_attention_mask, batch_labels in train_dataloader:
optimizer.zero_grad()
# Convert attention_mask to boolean tensor
batch_attention_mask = (batch_attention_mask==0).to(device)
outputs = model(batch_data.to(device), key_padding_mask=batch_attention_mask)
loss = criterion(outputs, batch_labels.to(device))
if i%100==0:
print ("epoch ", epoch, "batch ", i, "loss ", loss)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 0.5)
optimizer.step()
i=i+1
print(f"Epoch: {epoch + 1}, Loss: {loss.item()}")
Давайте возьмем один пакет данных из train_dataloader (я взял 1 пакет, чтобы максимально упростить):
Код: Выделить всё
input_ids = [ 101, 10047, 2125, 1012, 2070, 2028, 6045, 2232, 2275, 2017, 2006, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
attention_mask = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
label = [10047, 2125, 1012, 2070, 2028, 6045, 2232, 2275, 2017, 2006, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
attention_mask — это маскировка передавалась модели во время обучения. Теперь первый вопрос:
- Почему вектор маскировки содержит все 1, если токен отличается от 0? Какова цель этой формы маскировки? Я ожидаю маскировки последнего слова в предложении (мы хотим обучить генератор текста), поэтому последнее слово должно быть замаскировано. Или я ошибаюсь?
Затем у нас есть метка. Итак, второй вопрос: - Вектор метки — это, по сути, тот же вектор input_ids, но сдвинутый влево. Итак, давайте возьмем выходную модель, которая предсказывает токен после токена 6045 (индекс 6). В исходном предложении (input_ids) «правильный» токен равен 2232 (индекс 7). Но в векторе меток токен с индексом 7 равен 2275. Таким образом, при расчете потерь должно быть несоответствие. И причина этого несоответствия в смещении вектора меток, а не в других причинах.
Так что оно вообще должно сходиться.
Подробнее здесь: https://stackoverflow.com/questions/784 ... r-to-the-m