LM
LM,Language Model,语言模型,简单来说就是利用自然语言构建的模型。这个自然语言就是人常说的话,或者记录的文字等等,只要是人生产出来的文字,都可以看做语言。语言模型就是利用自然语言文本构建的,根据输入的文字,输出相应文字的模型。
- Token:实际中我们往往不叫一个词为「词」,而是「Token」,你可以将其理解为一小块,可以是一个字,也可以是两个字的词,或三个字的词,取决于你怎么Token化。
每次都只选择下个最大概率的词,你就是会得到同样的话。这种方法叫做Greedy Search(中文叫贪心搜索)
先看第一步,如果只选概率最大的那个词,那就变成「我想」了,但是别急,我们给「喜欢」一点机会,同时考虑它们两个好不好。再往下看一步,最大概率的都是你,我们也选两个,最后有这么几句(以及我们附上它们的概率):
- 「我喜欢你」概率:0.3×0.8=0.24
- 「我喜欢吃」概率:0.3×0.1=0.03
- 「我想你」概率:0.4×0.5=0.2
- 「我想去」概率:0.4×0.3=0.12
多看一步大不一样!看看概率最大的成谁了,久违了,再说一句「我喜欢你」。上面这种方法叫做Beam Search(中文叫集束搜索),简单来说就是一步多看几个词,看最终句子(比如生成到句号、感叹号或其他停止符号)的概率。刚刚我们的例子中,num_beams=2(只看了2个),看的越多,越不容易生成固定的文本。
好了,其实在最开始的语言模型中,大家基本就到这里,上面介绍这两种也叫解码策略。简单模型就是把一句话切成一个个词,然后统计概率,这类模型叫做Ngram语言模型
Ngram模型有个致命缺陷——它的表示是离散的,Embedding就是一种稠密表示方法,简单来说,一个Token是很多个小数(一般可以是任意多个,专业称呼为Embedding的维度,根据所用的模型和设定的参数来确定),一般数字越多,模型越大,表示能力越强。
对大概就是这样。
下面我们再来看RNN,Recurrent Neural Network,中文叫循环神经网络,RNN 模型与其他神经网络不同的地方在于,它的节点之间存在循环连接,这使得它能够记住之前的信息,并将它们应用于当前的输入。这种记忆能力使得 RNN 在处理时间序列数据时特别有用,例如预测未来的时间序列数据、自然语言处理等。通俗地说,RNN 就像一个具有记忆功能的人,可以根据之前的经验和知识对当前的情况做出反应,并预测未来的发展趋势。
Transformer
Transformer是一种Encoder-Decoder架构,简单来说就是先把输入映射到Encoder,这里大家可以把Encoder先想象成上面介绍的RNN,Decoder也可以想象成RNN。这样,左边负责编码,右边则负责解码。这里面不同的是,左边因为我们是知道数据的,所以建模时可以同时利用当前Token的历史Token和未来(前面的)Token;但解码时,因为是一个Token一个Token输出来的,所以只能根据历史Token以及Encoder的Token表示进行建模,而不能利用未来的Token。
前面这种关注Encoder中Token的信息的机制就是Attention(注意力机制)。直观点解释,当生成Knowledge时,「知识」两个字会被赋予更多权重,其他也是类似。
Transformer这个架构基于Seq2Seq,可以同时处理NLU和NLG任务,而且这种Self Attention机制的特征提取能力很强。这就使得NLP取得了阶段性的突破,深度学习开始进入了微调模型时代。大概的做法就是拿着一个开源的预训练模型,然后在自己的数据上微调一下,让它能够搞定特定的任务。
BERT就是用了Transformer的Encoder架构,有12个Block(看上面那个图,这每一个Block也可以叫一层),1亿多参数,它不预测下一个Token,而是随机把15%的Token盖住,然后利用其他没盖住的Token来预测盖住的Token。其实和根据上文预测下一个Token是类似的,不同的是可以利用下文信息。NLG领域的第一个工作是OpenAI的GPT,用的是Transformer的Decoder架构,参数和BERT差不多。它们都发表于2018年,然后分别走上了两条不同的路。
GPT
GPT,Generative Pre-trained Transformer,没错了,就是ChatGPT的那个GPT,中文叫「生成式预训练Transformer
针对不同的任务输入,都拼接成文本序列,然后丢给Transformer Decoder再通过一个Linear+SoftMax输出结果。Linear是一种最基础的网络结构,SoftMax我们前面介绍过,主要用来把输出映射到概率分布(和为1)。这种拼接输入的方法在当时那个大模型时代非常流行的。这样统一的处理方法能够减少不同任务对模型的改动。反正不管什么任务,都想方设法搞成一个序列就行。
现在,我们介绍一种基于采样的方法,简单点来说,就是基于已有的上下文随机选择下一个Token。不过随机也有问题,那就是可能生成不连贯的文本(很容易理解对吧)。这里有个Trick可以缓解这个问题——进一步增加高概率词的可能性,降低低概率词的可能性。这样就不太容易随机到很低概率(很可能不连贯)的生成。具体的做法是通过一个temperature
的参数调整输出的概率分布,这个参数值越大,分布就看起来越平滑,也就是高概率和低概率的差距拉小了(对输出不那么确定);当然越小的话,高概率和低概率的差距更明显了(对输出比较确定)。如果趋近于0,那就和Greedy Search一样了。
GPT-3是2020年7月发表的,因为它的参数量已经达到了其他任何模型在当时望尘莫及的量级:175B,有了175B的GPT-3。也就是说,各种任务来吧,我不调参数,顶多就要几个例子,我就能给你搞定它。这篇论文是具有里程碑意义的,因为它从根本上触动了原有的范式,而且是革命式地触动。
这张图可以提供几个信息:
- X-Shot在不同量级差别巨大,大模型就是有超能力。
- 大模型下,One-Shot效果明显大幅度提升;增加Prompt会进一步大幅度提升。
- Few-Shot的边际收益在递减。大概8-Shot以下时,Prompt作用明显,但从One-Shot到8-Shot,Prompt的作用也在递减。超过10-Shot时,Prompt基本没作用了。
总而言之,大模型具有In-Context能力,这种能力使得它不需要针对不同任务再进行适应性训练(微调),它用的就是它自己本身的理解力。这本来应该很让人震惊(甚至有一丢丢惊恐)。
RLHF
RLHF,Reinforcement Learning from Human Feedback,从人类反馈中学习,听起来怎么平平无奇。确实,它的思想非常朴素简单,但却有着不可忽视的效果。
如果用简单的语言来描述InstructGPT,其实就是用强化学习的算法微调一个根据人类反馈改进的语言模型。重要的是,它调出了效果——1.3B的InstructGPT堪比175B的GPT-3,InstructGPT使用了人类反馈直接作为「规则」,也就是把这种「规则」给隐式化,当做黑盒。我们只管结果好坏,至于中间有什么规则,有多少种规则,怎么起作用,统统不关心。首先,InstructGPT用了三个大的通用指标:有帮助、真实性和无害性,有点类似阿西莫夫的机器人三定律。也就是说,我不管你是什么任务,你都得朝着这三个方向靠。
现在看看这些是不是也觉得这一步没那么容易了,它们虽然看起来没那么「技术性」,但要很好地完成却需要优秀的设计能力、宏观把控能力和细节感知力。我更加相信这些细则是自底向上逐步构建起来的,而不是一开始就设想好的。它一定是在实践中不断遇到疑惑,然后经过仔细分析权衡后逐步加入一条条规则,最终逐步构建起来的一整套系统方案。个人觉得这一套东西可能是比数据还要珍贵的财产,它所产生的壁垒只能用时间不断实践来堆积。
InstructGPT/ChatGPT相比GPT-3有更强的Zero-Shot能力,Few-Shot很多时候已经不太用的着了,但是Prompt还是需要的,由此还催生了一个新的行当——Prompt工程。不过据OpenAI的CEO,过几年Prompt工程也不需要了(可能生成图片时还要一点点),我们要做的就是直接通过自然语言和AI进行交互。我们无法判断他说的会不会真的实现,但有一点可以肯定,AI的门槛必定会进一步降低,过几年可能一个初中生都能通过已有的一些服务创造出不错的AI应用。
结尾
我把我看得懂的都摘录了下来,说实话看起来还是挺有难度的,对于我这种层次不高,不是这个NLP专业领域的选手来说,说不难是假的,不过这正是学习,正是进步嘛,大家都这么牛,我也要跟上呀,UPUPUP!!!