Вы должны абсолютно точно настроить матрицу встраивания слов. Дело в том, что когда вы инициализируете матрицу встраивания слов вложения слов GloVe, ваши вложения слов уже будут захватывать большинство семантических свойств данных. Однако вы хотите, чтобы ваши вложения в слова были адаптированы к задаче, которую вы решаете, т.е. к конкретной задаче (отметьте Yang ). Теперь, предполагая, что у вас недостаточно данных в наборе данных, вы не можете самостоятельно изучить матрицу встраивания слов (если вы инициализируете матрицу встраивания слов случайными векторами). Из-за этого вы хотите инициализировать его с помощью векторов, которые были обучены на огромных наборах данных и являются общими.
Одна очень важная вещь, которую следует иметь в виду → Поскольку остальная часть вашей модели будет инициализироваться случайным образом,когда вы начинаете тренироваться, ваша матрица встраивания слов может пострадать от катастрофического забвения (проверьте работу Говарда и Рудера и Киркпатрика и др. ), то есть градиенты будут огромными, потому что ваша модель будет резконедостаточно данных для первых нескольких партий, и вы потеряете начальные векторы полностью. Вы можете преодолеть это следующим образом:
Для первых нескольких эпох не нужно тонко настраивать матрицу встраивания слов, просто оставьте ее как есть: embeddings = nn.Embedding.from_pretrained(glove_vectors, freeze=True)
.
После того, как остальная часть модели научится соответствовать вашим тренировочным данным, уменьшите скорость обучения, разморозьте ваш модуль встраивания embeddings.weight.requires_grad = True
и продолжите обучение.
Следуя вышеупомянутым шагам, вы получите лучшее из обоих миров. Другими словами, ваши вложения слов будут по-прежнему фиксировать семантические свойства, в то же время адаптируясь к вашей последующей задаче. Наконец, есть работы (см., Например, Ye Zhang ), показывающие, что можно немедленно выполнить точную настройку, но я бы выбрал более безопасный вариант.