設置 | 登錄 | 註冊

作者共發了1篇帖子。

自己写了一遍GPT

1樓 悄悄打开魔盒 2024-7-22 23:45
难度还是不小的,有一些隐藏的坑


模型流程:


1. 文字序列首先被分成token,把token的序号输入模型, 输入张量的维数为(B,T), B是批次大小(也就是同时处理几段文字),T是文字的长度


2. 分别对token和位置进行编码,每个token序号都映射为维数为C的向量,每个位置(不超过某个最大值T_max)也映射为维数为C的向量,这样我们得到了两个维数为(B,T,C)的张量,再把两个张量相加,得到一个维数为(B,T,C)的张量用于后续处理


3. 把张量输入到顺次连接的Transformer块中。一个Transformer块有nH个Transformer头,每个头输出的维数为(B,T,C/nH),它们并起来维数仍然为(B,T,C), 计算后再经过LayerNorm正则化,再经过两层线性层和再一次正则化,得到的结果仍是维数为(B,T,C)的张量,这样的张量再次输入到下一个Transformer块。


3.1. 其中,注意力头内部的机制是Transformer最精妙的地方。同一组张量输入到三个尺寸相同的线性层中,分别得到Q,K,V三个张量,它们分别表示query,key,value,然后使用公式

softmax(M+QK^T/sqrt{N})V

得到输出结果。其中,M是casual mask,表示屏蔽了未来的token,只根据过去信息进行预测。


4. 使用一个线性层得到logits,它表示未归一化的token概率, 形状为(B, N_tokens), 其中N_tokens是不同token的总量


5. 在推理时,用softmax把logits转化为概率,并依照概率采样下一个token. 然后,把新token加到context的末尾再次运行1~5步骤,如此循环就可以生成文本。在训练时,使用交叉熵函数,计算logits和真实的下一个token之间的交叉熵损失并进行梯度反传,更新模型参数。

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。