Не могу понять, как работает генератор текста при передаче в модель смещенного вектора во время обучения.Python

Программы на Python
Anonymous
Не могу понять, как работает генератор текста при передаче в модель смещенного вектора во время обучения.

Сообщение Anonymous »

Мне очень трудно понять, как генератор текста может вывести следующее слово (токен) по заданной текстовой последовательности. Поскольку я пытаюсь понять, как работают преобразователи в таких случаях, я был бы очень рад, если бы вы помогли мне понять «логику», стоящую за этим.
Весь код опубликован вот взято из блокнота 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()}")
Моя проблема состоит в том, чтобы понять, как input_ids, attention_mask и метки могут взаимодействовать друг с другом. для обучения модели.
Давайте возьмем один пакет данных из 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]
Input_ids — это исходное предложение, которое было размечено и дополнено до заданной длины: Хорошо.
attention_mask — это маскировка передавалась модели во время обучения. Теперь первый вопрос:
  • Почему вектор маскировки содержит все 1, если токен отличается от 0? Какова цель этой формы маскировки? Я ожидаю маскировки последнего слова в предложении (мы хотим обучить генератор текста), поэтому последнее слово должно быть замаскировано. Или я ошибаюсь?
    Затем у нас есть метка. Итак, второй вопрос:
  • Вектор метки — это, по сути, тот же вектор input_ids, но сдвинутый влево. Итак, давайте возьмем выходную модель, которая предсказывает токен после токена 6045 (индекс 6). В исходном предложении (input_ids) «правильный» токен равен 2232 (индекс 7). Но в векторе меток токен с индексом 7 равен 2275. Таким образом, при расчете потерь должно быть несоответствие. И причина этого несоответствия в смещении вектора меток, а не в других причинах.
    Так что оно вообще должно сходиться.
Оно ясно, что я упускаю из виду нечто очень фундаментальное и важное. Я был бы благодарен вам 10000, если бы вы указали мне правильное направление. Спасибо

Подробнее здесь: https://stackoverflow.com/questions/784 ... r-to-the-m

Вернуться в «Python»