目前共有2篇帖子。 字體大小:較小 - 100% (默認)▼  內容轉換:不轉換▼
 
點擊 回復
304 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之间的交叉熵损失并进行梯度反传,更新模型参数。

副總編 二十二級
2樓 發表于:2024-7-23 07:39
这应该是一个相对简明的GPT原理说明贴
 

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:304 回複數:1
評論數: ?
作者:悄悄打开魔盒
最後回復:啊啊是谁都对
最後回復時間:2024-7-23 07:39
 
©2010-2025 Purasbar Ver2.0
除非另有聲明,本站採用共享創意姓名標示-相同方式分享 3.0 Unported許可協議進行許可。