Comments 18
Отличная статья! Трансформер собрали, а обучить?
Чем Ваша статья отличается от этой от 2023 года:
https://uproger.com/sozdajte-transformera-s-nulya-s-pomoshhyu-pytorch/
Может быть более подробным изложением? Или хотя бы программным кодом? Отличий здесь явно много. В данной статье есть математические пояснения и доработка изображений классического трансформера, которое где угодно сейчас можно уже найти. В приведённой Вами статье нет и этого. Просто "сухой гайд" с кодом и небольшими комментариями к нему.
Полагаю будет хорошим тоном, если дать ссылку на указанный пост и Ваши пояснения в начале статьи.
Не думаю, что это хорошая идея. В этом был бы смысл, если бы я так называемую "рецензию" к этой статье написал в виде комментария или хотя бы более подробно указал на различия (или дополнил статью). Я просто на самых внешних различиях акцентировал внимание, не более.
Я не понял, кто статью писал. Ты или автор.
Конечно же не я. Какие тут могут быть вообще сомнения? Достаточно посмотреть на шапку профиля, чтобы понять кто статью писал.
Статья интересная и классная, потому я решил, просто как читатель, написать свой комментарий к комментарию выше с целью ответа на вопрос "в чём же отличие этой статьи от другой", хоть и прошёлся по верхам.
Ты просто от первого лица писал, будто бы ты автор. Ну мало ли, может зашел молодой человек этой дамы, помогавший писать статью
Я вообще не понимаю, как это всё связано. Я не писал от лица автора ни в коем случае, я всегда пишу конкретно от себя. Выражаю своё мнение, не более.
По-моему, так почти все комментарии пишут, разве нет? Ну, т.е. тебя заинтересовал какой-то вопрос в комментах, а ты решил на него ответить. От себя самого, а не автора.
а на сколько быстро происходят эти вычисления?), какая нагрузка?
Спасибо за статью, было очень интересно и понятно читать, много нового узнал! на канал подписался, там тоже очень интересно)
балдеж! круто, очень редко вижу кто указывает названия входов QKV которые у енкодера и декодера разные, что в начале точно сбивает столку
Спасибо за статью!
Небольшой вопрос: в этой части все правильно?
relevance = q @ k_T / math.sqrt(self.head_size)
# batch_size, num_heads, query_emb_len, emb_len
if self.masked:
mask = self.make_mask(key)
relevance = relevance.masked_fill(~mask, -torch.inf)Насколько я понимаю, предполагаются разные значения для query_emb_len и emb_len. То есть, в relevance не квадратная матрица, в общем случае.
А функция self.make_mask() создает квадратную матрицу по key_emb_len.
Есть некоторые сомнения, что код будет работать для разных shape у Q и K.
Вот здесь явно опечатка. Т.к. не используется out_encoder_block.
class DecoderBlock(nn.Module):
...
def forward(self, decoder_emb, encoder_output):
...
out_norm_1 = self.norm_1(out_add_1)
...
# переиспользуем часть Encoder-а
out_encoder_block = self.encoder_block(
query=out_norm_1,
key=encoder_output,
value=encoder_output
)
# batch_size, seq_len, out_size
return out_norm_1
Пишем свой Transformer