什么是自编码器(autoencoder,encoder-decodermodel)?通俗地说,用拍摄设备,录制视频,录制成了mp4文件,就是采集并且encode;你的手机视频播放器播放这个视频,就是decode视频并且播放。做encode-decode的模型,就是编码-解码模型。很明显,编码模型和解码模型是两个模型,但是,他们是配对使用的。你不能编码出一个.avi文件,然后用只支持.mp4的解码器去解码。
在深度学习领域里,下面这个就是最简单的编码-解码模型示意图。f函数是编码器,把输入x变成某个叫做h的东西,g是解码函数,把编码出来的东西,解码成输出r。
那么,最简单的编码器,就是什么都不干:f(x)=x,h=x,r=g(f(x))=h。输入‘TomchaseJerry’,输出就是‘TomchaseJerry’。显然,这样的字编码器不需要训练,并且,也没有任何用处。
如果,输入‘TomchaseJerry’,输出是‘汤姆追逐杰瑞’,那么这个自编码器就完成了机器翻译的任务。我们人类可以做翻译,实际流程上,也跟这个差不多。那么,我们人类是怎么做到的呢?我们并不是以‘做翻译’为唯一的目标去学习语言的,我们会学习‘单词’、‘语法’、‘语言所表达的常识’这些语言之下最基础的‘特征’的‘表示’。当我们学会了被表达的事物和它在不同语言中的表示之后,我们就能做翻译这件事情了。我们仔细审视一下这个过程,我们至少做了两件事情:
1)学会被各种语言所表示的‘东西’,这里我们称之为世界知识(worldknowledge),它包括事实性知识(factualknowledge)和常识(commonsense)。其中包括,学会至少两门语言里表达世界知识的单词和语法。
2)学会按别人的要求去执行翻译这个任务。
那么,这两件事情的第一件,就是GPT的第二个单词,Pre-train(预训练)。我们就是要去学到‘TomchaseJerry’这句话和其他无数句话在被拆解成世界性知识之后的‘表示’。
Transformer就是一个专门用于自然语言处理的编码-解码器架构。编码器-解码器可以有很多不同的架构细节,就能得到不同的自编码架构,Transformer是此刻看起来效果最好的,能很好地学到自然语言背后的特征,并且有足够大的模型容量。所谓模型容量,是指,有一些模型参数过多,就反而学不到特征,或者无法训练了,无法用于表示特别复杂的东西。
GPT全称GenerativePre-trainedTransformer,前面讲了编解码,算是讲了一点点Transformer,也讲了预训练、Pre-trained。那么,Generative从何讲起?
我接着说人话。前面讲到了,编码器-解码器是两个不同的模型,就像你看视频,你的手机上并不需要视频录制、编辑软件,只需要一个解码-播放器一样。训练两个模型太麻烦,我们希望就围绕一个模型做研究,做训练。我们能不能不做编码,就围绕解码模型来达到一些目的呢?答案当然是可以的。
打个不严谨的比方。我现在想找人帮我画一幅肖像画。其实我并不懂怎么画画。于是,我请人给我画。我并不能从画工技艺、艺术审美方面去评判他画得好不好。但是,我是有能力去判断我请的人画出来的画是不是令我满意的。此时,我就是一个decode-only的模型。你会说,“你这个decode-only的模型必须要有一个懂encode的画师才能工作啊“。是的,我不懂画画。确实需要一个画师。
但是,你记得吗,OpenAI训练GPT3的模型,就是给它海量的数据,让它去训练。那么,画师不教导我绘画技巧,只是不停的给我画肖像,并且,给我看肖像是否满意,我指出哪些地方不满意,他做出修改。这个事情干了一千万次,我是不是至少能学到‘当给我一幅没画好的我的肖像画,我知道应该怎么接着画下一笔‘?我不是从拆解好的理论体系里去学习的,我并不能叫出各种会画技法的名字,但是,我就是会做上面这件事情了。
相当于,我听到“GPT是一个预训练模”,我就知道下一个字一定是“型”字一样。而因为我只擅长接着前面做好的事情完成接下来的事情,所以,我会‘生成’这个工作方式,同时,我也只会‘生成’这个工作方式。这就是Generative的意思。
总结一下,Generative是被训练出来的模型的工作的方式,Transformer是这个模型的架构,Pre-trained是形容Transformer的,就是说训练这个模型,预训练是不可或缺的核心步骤。
有一个很重要的点,被训练完成的我,是如何知道没画完的肖像画的下一笔是应该怎么画的?就相当于你听到“今天天气很”之后,你是怎么知道下一个词是什么的?显然,你是靠猜测的。什么东西来支撑你的猜测?是你被训练了一百万次的经验。这些经验构成了什么?这些经验被你潜意识地总结成了一些规律。有一些规律确定性很高,有一些规律确定性很低。“今天天气很”后面接的字,确定性很低,“GPT是一个预训练模”后面接的字确定性很高。
那么,你实际上就是学到了一个概率模型,这个概率模型其实是无数个场景的概率分布组合而成的概率模型。预测“今天天气很”的下一个词,是一个概率分布。“GPT是一个预训练模”的下一个词是另一个概率分布。所以,从头学习机器学习、深度学习,就会知道,所有机器学习、深度学习模型都是概率模型,统计学是核心工具。
我们在对话聊天的时候,如果说了一些自己觉得是常识,对方却不懂的时候,是不是对话就较难进行下去了?所以,为什么我们的模型需要这么多参数?因为它需要‘什么都懂’。如果我说我用32M规模的数据就记住了这个世界的常识,你是不是会觉得‘这显然不可能’?
前面已经讲了Generative、Pre-trained、Transformer这些概念。我们接着讲ChatGPT。首先,GPT3不等于ChatGPT,GPT3这个预训练模型,是ChatGPT的基础。回顾我们最开始讲的‘人如何学会翻译’至少需要两个步骤,第一步就是训练一个GPT3的预训练模型。有了这个模型之后,我们还要接着做一些训练,才能完成ChatGPT。
我们首先来回顾一下GPT1、GPT2。
所以,又可以把猜下一个词分解为很多种猜词任务,数学计算就是其中一种。最后,证明了GPT2效果还不错。多说一句,上面这么搞,怎么就是自监督了呢?是否是‘有监督’学习,本身这个概念比较模糊,并不是一个科学的定义,只是大家习惯这么叫而已。我们约定俗成,把‘训练数据是经过精巧地设计,并且准备过程对人力成本较高’的训练,叫做有监督训练,否则就是无监督。我们只是把前人努力写的书做了一个调整给到模型,按照这个约定,应该属于无监督学习。但是,好像,我们又其实是在用人类努力的成果在训练它。所以,有人就开始称这种情况为‘自监督学习’。
接着,你就会想,深度学习是一门科学啊,怎么能对概念的定义搞得这么模糊不严谨?对,你说得没错,深度学习,在玩数学的人眼里,就是充满了不严谨,处在鄙视链的底端。但是,你挡不住深度学习应用的效果好呀。深度学习就是这么一系列‘不严谨’,充满了‘我不知道为什么,但是这么做效果就好’的方法。科学家们在努力地解释它为什么效果好,但是,这些研究远远追不上,找到‘效果更好,但是并不理解为什么效果好’的方法的步伐。对你自己的认知亦是如此,你有自我认知,那么,你的自我认知是怎么来的?“我是谁,我从哪里来,我要到哪里去?”
顾名思义,就是要通过一些‘问题-回答’对的训练数据,让模型能在收到“给我写一段简介”这样的指令性的输入的时候,真地去按照指令的要求去生成接下来的东西。OpenAI的标题里出现了一个词'Alignling(对齐)',你可以不管它。但是,理解了这个词,你才理解了‘制定对齐/指令微调’的核心技术。有兴趣,你可以接着看这个自然段,也可以不看,直接跳到下下一个自然段。
‘指令对齐’,就让掌握了知识的模型能按照我们想要的方式去生成更多的词了。达到这个效果的方法,讲起来,很硬核。为了说人话,我就打个比方。现在,我们有一个房间,里面有几百本书就像垃圾一样堆砌在一起。这就是预训练已经把隐藏特征学到了。我们应该怎么去整理这些书籍呢?这个问题,取决于,我们后续要如何使用这些书籍。我们可以按门类,去排列书籍,每一类书籍一个书架。也可以按照书名去排列书籍,所有书籍分别根据书名被放在按A-Z排列的的书架里。
所以,对齐,就是根据我们的目的,去整理模型学到了的知识。那么,为什么我们不用整理、重构之类的词,而用对齐呢?因为,我们知道模型学到了知识,但是,我们能看到这些表示,就是1750亿个参数,但是,人类看不懂它。就像,人类能看到自己的脑袋,但是脑袋里的神经元是如何联合在一起工作的,看不懂。
更具体的,‘1+1=2’这个知识,你知道它存储在你大脑里的具体哪个神经元上么?你当然不能。所以,我们没有细粒度的手段去整理书籍。有一个比较粗力度的手段,就是:按照我的需求,大概地把一些数据强行抓住首尾两本书,把它们压齐。你整理书籍,可以一本一本放。但是你没法去拿其中一本的时候,你当然可以从一对儿书的两端,用力压,被按照我们想要的方式挤压之后,书自己就变得更整齐了,对齐到了我们想要的结构。
我再打个比方,社会共识、常识,本身也是‘对齐’得来的。‘婚姻应该是自由恋爱的结果’,这个常识,不是从来如此的。是理性主义崛起之后,紧接着浪漫主义在1900年左右崛起,在20世纪才出现的。浪漫主义借由‘罗密欧与朱丽叶’之类的文艺作品广泛传播、得到认可,进而才把我们的常识‘对齐’成了这么一个结果。说得更远一点,习惯了中国文化的人在美国必然会被‘文化冲突’所困扰,也是因为,中国和美国其实都通过媒体把自己的常识对齐成了不同的‘形状’。‘对齐’无时无刻不在这个世界里发生。
实际上,模型每次只能生成一个词儿,那么,把问题和回答都当成字符串连接起来,结构是:输入[问题里所有的词][回答的前n个词儿],生成回答的第N+1个词儿。如果进行第二轮对话。输入就变成了:输入[第一个问题里所有的词][第一个回答的所有词][第二个问题的所有词][第二个问题的回答的前n个词],输出[第二个回答的第N+1个词]。至于模型如何知道哪一段是问题,哪一段是问题,这里不展开描述。
至此,你知道了GPT3是ChatGPT这个‘技惊四座’的模型的基础。
我们都知道,ChatGPT至少经历了预训练、指令对齐、你可以理解为,一个大学生上一门课,指令对齐就是老师在课堂上给我们上课。但是,我们学习不能总是耗着一个老师一直给我们讲啊,成本太高了。就是说,积累大量指令对齐的QA(问题-回答)训练数据,成本很高。后续更大量的学习,还得学生自己在脱离老师的强帮助,自行学习。一则效果更好,二则成本更低。
所以,我们用完成了指令对齐的模型,针对大量问题作出回答。并且,每个问题都给出10个回答。由人类去标注,所有回答里,哪些回答更好。用这个标注的QA对去接着‘对齐’模型,让模型把知识对齐到更符合我们的要求。这个时候,人类需要做的,就仅仅是提问题+标注,之前是要给出问题且给出答案。成本降低了一些,速度也变快了一些。这里,强化学习实际上是训练一个奖励模型(rewardmodel)作为新的老师,来对模型的回答进行‘批改’,让模型愈发把知识‘对齐’到我们想要的样子。
上面简单的强化学习讲解,其实有一个很严重的问题。如果对于同一个Q,老师一会儿说A1好,一会儿说A2好,就变成了学生的脑子在来回拉扯。所以,强化学习,在细节上,还有更多不同的细节。为了讲人话,我这里略过这些细节。
大模型太大,训练成本太高,人们总在寻找更低成本近似的方法。最近LoRA也是跟CV(计算机图像)领域的StableDiffusion一起大火。这里也用人话讲一下LoRAfine-tuning(不讲StableDiffusion)。为了讲清楚,会有一点点不讲人话的时候。
我们有一个3x4的矩阵如下:
[1,2,3,4]
[2,4,6,8]
[3,6,8,12]
显然,要存储它,我们需要用到12个数字。但是,这个我特别构造的矩阵是有一个特点的,第二行可以由[1,2,3,4]乘以2得到,第三行可以由[1,2,3,4]乘以3得到。那么,实际上,我就可以用[1,2,3,4]里的4个数字,加上1、2、3这3个系数,总共7个数字就可以表示这个矩阵。我需要的数字数量从12个降低到了7个。原始矩阵叫做W,分解之后变成了需要的数字更少的两个矩阵B和A,公式就是W=B乘以A,记为W=BA。
在我这个例子中,是无损失地进行了分解。数学上,有办法进行精度有损的分解,W可以转化为更少的数字构成B和A。这就是说人话版本的矩阵的秩分解。
这里,我们补充介绍一下深度网络里的参数是怎么组织的:
在这个图中,我们看到了一个网状结构。其中‘O单向箭头指向P’的意思就是‘O参与计算,得到P’。我们就看到了z1、z2、z3很多层,z1这一层是一个W1矩阵和B1这个偏置向量。z1、z2、z3,越往右,就越深,就是深度网络。所谓参数,就是这些密密麻麻、层层叠叠的计算网络里的数字。这个图只是一个示意,真实的网络结构,各有各的不同。以及,必须在每个网络节点上选择合适的激活函数,后面不会用到,这里不做展开。好了,我们接着讲LoRA。
理解了低秩分解,LoRA的paper的意思就是:
假设我们的模型深度为l(layer的首字母),每一层的参数为矩阵W。并且,我们之前就已经训练好了一个模型,这个模型的参数冻结住,永远不改变了,记为W0。那么,我们训练模型就是在不断改变下面这个公式的ΔW这个模型参数变更的增量。
这个增量可以通过低秩分解,分解为:
训练主要过程依然和其他所有fine-tuning一样,只是多了一个细节:把训练后的参数变更保存到了BA中,而不是直接更新到W0里去。
那么,我们可以得到以下几个结论:
1)模型训练好之后,做线上推理服务,计算量,并没有减少,反而可能有所微微增加。
2)低秩矩阵的大小是可以调整的,可以是非常小。低秩矩阵越小,丢失的精度越多。
3)训练过程,两个核心成本是显存使用和GPU运算量。LoRA方法下,低秩矩阵BA是可训练参数。显存的使用,等于1倍模型参数的体积加上10倍可训练参数的体积。GPU计算量可以根据可训练参数的数量决定,如果我们把BA设定得比较小,训练量可以比全参数模型训练降低成千上万倍。
4)微调后的模型和原始模型的参数不能相差过大,不然用一个低秩矩阵BA所替代的ΔW会丢失大量精度,推理效果特别差。
5)LoRA是一种模型训练的思想方法。它可以适配到很多类型的模型上。GPT模型,或者StableDiffusion的模型,都可以。训练时节省的显存量,要根据具体模型结构来计算。
回顾一下LoRA与GPT,我们可以说,LoRA方式的finetuning的对于GPT的价值,并不太大。只有在很小的场景,有LoRA的发挥空间。
现在,你应该能理解LoRA论文原文中的这种图了。注意,这里,LoRA是对原深度神经网络的每一层都设计了对应BA矩阵。
综上,如果我们手里已经有一个强大的模型,我们仅仅像微调它的表现,而不是想要教会它很多新的东西,使用LoRA方法,成本是很低的。比如,文生图的时候,我们不调整生成出来的图片的框架、构图,我们只想调整图片的风格(真实系、漫画风)。或者,我们让一个强大的模型去做一些简单的任务,把简单的任务做得特别好,也可以用LoRA。
计算机大二课程:
对截止2017年的理论研究最全面、深入的总结:
大概学懂前面的内容之后,看深度学习二号人物bengio写的书,大家亲切地叫它‘花书’。
PyTorch的API极度友好,可以通过下面这本书来数学。如果从这本书上手,你会不知道自己写的简短的代码在干什么。此书由亚马逊前首席科学家李沐所著,写得不错。这本书有很多个版本,最新的版本是2023年出的,才是以PyTorch为例子。
如果过程中有很多概念理解半天都理解不了,特别是统计学的概念,在碰到的时候,就可以去B站找解释得比较好的视频,我随便列举一下: