目前共有2篇帖子。 字体大小:较小 - 100% (默认)▼  内容转换:不转换▼
 
点击 回复
387 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)
 

本帖信息

点击数:387 回复数:1
评论数: ?
作者:悄悄打开魔盒
最后回复:啊啊是谁都对
最后回复时间:2024-7-23 07:39
 
©2010-2025 Purasbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。