模型流程:
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之间的交叉熵损失并进行梯度反传,更新模型参数。