语言模型的发展大致经历了以下四个阶段
语言模型发展历程" />
统计语言模型(SLM)
主要建立在统计学习的理论框架下,尝试解决的是如下问题
p ( x t ∣ x 1 , x 2 , … x t − 1 ) (1) p(x_{t}|x_{1},x_{2},\dots x_{t-1})\tag{1} p(xt∣x1,x2,…xt−1)(1)
根据之前的历史信息预测接下来的token
因为保留过去所有信息用于预测可能过于困难,有时候会只保留前 τ \tau τ个历史信息,此时表示为
p ( x t ∣ x t − τ , … x t − 1 ) (2) p(x_{t}|x_{t-\tau},\dots x_{t-1})\tag{2} p(xt∣xt−τ,…xt−1)(2)
那么想要计算这个,我们需要首先对句子的概率进行建模,这有多种方式
P ( x 1 , x 2 , x 3 , x 4 ) = P ( x 1 ) P ( x 2 ) P ( x 3 ) P ( x 4 ) P ( x 1 , x 2 , x 3 , x 4 ) = P ( x 1 ) P ( x 2 ∣ x 1 ) P ( x 3 ∣ x 2 ) P ( x 4 ∣ x 3 ) P ( x 1 , x 2 , x 3 , x 4 ) = P ( x 1 ) P ( x 2 ∣ x 1 ) P ( x 3 ∣ x 1 , x 2 ) P ( x 4 ∣ x 1 , x 2 , x 3 ) (3) P(x_{1},x_{2},x_{3},x_{4}) = P(x_{1})P(x_{2})P(x_{3})P(x_{4})\\ P(x_{1},x_{2},x_{3},x_{4}) = P(x_{1})P(x_{2}|x_{1})P(x_{3}|x_{2})P(x_{4}|x_{3})\\ P(x_{1},x_{2},x_{3},x_{4}) = P(x_{1})P(x_{2}|x_{1})P(x_{3}|x_{1},x_{2})P(x_{4}|x_{1},x_{2},x_{3})\tag{3} P(x1,x2,x3,x4)=P(x1)P(x2)P(x3)P(x4)P(x1,x2,x3,x4)=P(x1)P(x2∣x1)P(x3∣x2)P(x4∣x3)P(x1,x2,x3,x4)=P(x1)P(x2∣x1)P(x3∣x1,x2)P(x4∣x1,x2,x3)(3)
不难注意到每一个token的依赖序列是不同的,这可以记为阶数,k阶依赖称为 k + 1 k+1 k+1阶语法
对于语法中不同的条件概率的概率的计算,可以通过贝叶斯公式来实现,即
P ( x ∣ x ′ ) = P ( x ′ , x ) P ( x ′ ) = n ( x ′ , x ) n ( x ′ ) (4) P(x|x') = \frac{P(x',x)}{P(x')} = \frac{n(x',x)}{n(x')}\tag{4} P(x∣x′)=P(x′)P(x′,x)=n(x′)n(x′,x)(4)
其中 n ( x ) n(x) n(x)表示 x x x的出现次数。但是这种计算方式对于稀疏数据是存在问题的,如下所示
平滑
只需要对 ( 4 ) (4) (4)式添加极小项即可,变为
P ( x ∣ x ′ ) = n ( x ′ , x ) + 1 n ( x ′ ) + V (5) P(x|x') = \frac{n(x',x)+1}{n(x')+V}\tag{5} P(x∣x′)=n(x′)+Vn(x′,x)+1(5)
其中 V V V是词典大小。这样操作依然可以保持概率分布的相关性质
回退
分母词组可能出现次数过少,可以将其退化
P ( x i ∣ x i − 1 , x i − 2 ) → P ( x i ∣ x i − 1 ) (6) P(x_{i}|x_{i-1},x_{i-2})\rightarrow P(x_{i}|x_{i-1})\tag{6} P(xi∣xi−1,xi−2)→P(xi∣xi−1)(6)
总结
总之,可以通过序列建模加上极大似然优化来实现一定的next token预测的任务,但是因为历史信息长度被限制为 τ \tau τ,无法实现长距离依赖,以及参数量有限,表达能力有限,后面提出了更好的模型
神经语言模型(NLM)
使用神经网络来进行序列生成
对于之前使用的问题定义
p ( x t ∣ x 1 , x 2 , … x t − 1 ) (7) p(x_{t}|x_{1},x_{2},\dots x_{t-1})\tag{7} p(xt∣x1,x2,…xt−1)(7)
其实也有另外一种表示手段
p ( x t ∣ w t − 1 ) , w r t . w t − 1 = f ( x 1 , x 2 , … x t − 1 ) (8) p(x_{t}|w_{t-1}), wrt.\ w_{t-1} = f(x_{1},x_{2},\dots x_{t-1})\tag{8} p(xt∣wt−1),wrt. wt−1=f(x1,x2,…xt−1)(8)
相当于通过一个中间变量将之前信息统一寄存了,这样的好处是避免了对之前每一个时刻的信息显式建模,这同时也在一定程度上解决了数据稀疏的问题:哪怕文本没有实际出现过,它在这里依然有可能出现,而只要它出现过,影响就会反映在参数的改变上。
并且这里开始使用向量形式来表示单词,相比原本添加了更多参数,提高了表达能力。
这里的模型有RNN,GRU,LSTM,word2vec等等。
预训练模型(PLM)
与早期的词嵌入模型相 比,预训练语言模型在训练架构与训练数据两个方面进行了改进与创新
典型模型有GPT-1,BERT,ELMo等,主要确立了预训练-微调
的训练步骤。预训练阶段旨在通过大规模无标注文本建立模型的基础能力,而微调阶段则使用有标注数据对于模型进行特定任务的适配,从而
更好地解决下游的自然语言处理任务
其中GPT系列作为自回归语言模型,只使用了Decoder架构
其Loss设计依然为
m i n θ log ( P θ ( X ) ) = − l o g ∏ t = 1 T p θ ( x t ∣ X < t ) (9) min_{\theta}\log(P_{\theta}(X)) = -log \prod_{t=1}^{T}p_{\theta}(x_{t}|X_{<t})\tag{9} minθlog(Pθ(X))=−logt=1∏Tpθ(xt∣X<t)(9)
BERT等自编码模型,则是只采用了Encoder架构
其Loss设计为
m i n θ log ( P θ ( X ∣ X ^ ) ) ≈ − l o g ∏ t = 1 T m t p θ ( x t ∣ X ^ ) w r t . m t = { 1 当前位置被遮掩 0 当前位置未被遮掩 (10) min_{\theta}\log(P_{\theta}(X|\hat{X})) \approx -log \prod_{t=1}^{T}m_{t}p_{\theta}(x_{t}|\hat{X})\tag{10}\\ wrt. m_{t} = \left\{\begin{matrix} 1& \text{当前位置被遮掩}\\ 0& \text{当前位置未被遮掩} \end{matrix}\right. minθlog(Pθ(X∣X^))≈−logt=1∏Tmtpθ(xt∣X^)wrt.mt={10当前位置被遮掩当前位置未被遮掩(10)
一般来说,Encoder架构被认为更适合去解决自然语 言理解任务(如完形填空等),而Decoder架构更适合解决自然语言生成任务(如文 本摘要等)
大语言模型(LLM)
相比之前的模型,llm在模型参数量,训练数据量上面都有了很大的跨越,并且需要更加精细的训练手段来实现更好的性能与泛化性,这是由scaling law指导的。
最终在任务求解上能力有了显著提升,能够不再依靠下游任务数据的微调进行通用任务的求解