Я читал код языковой модели GPT2. Преобразование скрытых состояний в распределение вероятностей по словарному запасу было выполнено в следующей строке:
lm_logits = self.lm_head(hidden_states)
Здесь
self.lm_head = nn.Linear(config.n_embd, config.vocab_size, bias=False)
Однако в оригинальной статье они предложили умножить скрытые состояния на матрицу встраивания токенов, тогда как реализация huggingface использовала другую матрицу.
Есть ли в этом какое-то преимущество? Я что-то пропустил?