GPT的实现细节
关于GPT的代码细节,这里梳理了一下:
数据集构造
根据Transformer Decoder-Only特点,直接将多轮对话拼成一条session样本,过一次前向传播,得到多条回复的loss:
而以往的方法是将多轮对话拆成多条样本,存在大量重复计算问题,效率低下。且该方法对于靠前轮次对话影响权重更大,不符合对话常识,靠后轮次应该权重更大,证明见:大模型微调样本构造trick
生成
在karpathy/minGPT项目中,是直接粗暴地生成固定长度的文本。这样做的问题就是生成的文本无法判断何处截断。
在构造模型输入的时候,我们就加入了 <EOS>
token,来标记文本的结束。那么在推理阶段,如果碰到该token,则结束生成:1
2if token == "<EOS>":
break