语言模型从0训练流程
1.Tokenizer
需要建立一个“词表”,负责把文本转换为词向量
如 “我喜欢你” ----> [我,喜欢,你] ----> [1, 5, 2]
词表形如:
我---1 你---2 水---3 火---4 喜欢---5
词表怎么构建呢?
目前的大语言模型基本采用 BPE 方法构建词表
总之,词表可以看成把文字映射为数字的哈希表,映射规则多种多样。
2.模型预训练(预训练任务)
该阶段不需要精心构建数据集,本质上是进行文本预测。经过该训练过程的LLM,会具备续写能力。
有几种预训练方法:自编码、自回归、编码解码
不同的预训练任务,会得到不同功能偏向的模型(NLG/NLU)
Bert 的预训练目标任务是:掩码预测(自编码),利于自然语言理解
T5 的预训练目标任务是:文本预测(自回归),利于自然语言生成
GLM 的预训练目标任务是:自回归空白填充(自回归+自编码),综合了NLG和NLU的优点
数据集格式:
ori = [我,爱,玩,原,神]
x=[我,爱,玩,原]
y=[爱,玩,原,神]
假设隐藏层维度128,词表大小1000
将x输入transformer,输出4x128的logits层矩阵,然后进行softmax,得到4x1000的矩阵。
第1行表示通过输入“我”,对下一个词的预测结果,改行的1000个元素对应了词表中1000个词的概率;然后与标签“爱”进行交叉熵,计算Loss。
显然,推理时从这1000个词里取概率最大的那个词作为结果。
3.指令微调
该阶段仍是进行文本预测。但输入的前半部分不计入loss。经过该训练过程的LLM,会具备问答能力。
数据集格式:
ori = [我,爱,玩,什,么,游,戏,原,神]
x = [我,爱,玩,什,么,游,戏,原]
y = [爱,玩,什,么,游,戏,原,神]
输出为8x128的logits矩阵,经过softmax得到8x1000矩阵
loss = (第7行的loss+第8行的loss)/2
前半部分[我,爱,玩,什,么,游,戏]不计入loss,这就是我们的问题
后半部分[原,神]计入loss,这是模型预测的答案