快速入门 LLM
date
Jan 7, 2024
slug
Quick Start Guide to LLM
status
Published
tags
Deep Learning
summary
快速入门LLM的历史、特点、结构,发展历程。
type
Post
LLM溯源
Large Language Models(LLMs)和生成式AI都是=深度学习的子集
生成式AI指的是一种可以创造出文本、语音、视频等内容的模型,LLM 可以用于生成式AI。
LLM是一种可以预训练(pre-trainer),并能够针对特定任务微调(fine-tune)的模型。
举一个例子,我们可以训练自己的狗趴下,转圈,站起来,但是为了特定的任务,例如搜救犬,猎犬,寻回犬,那么就需要专业的训练。前一种训练是预训练,它是用来解决通用问题的,例如文本翻译,总结文档,回答问题;后一种训练称为微调,可以解决专业的任务,例如训练一个娱乐,零售,金融领域的专家。
LLM的特点
Large有两层含义
- Large training dataset
LLM的训练数据集往往非常大,而且质量要求很高
- Large number of parameters
LLM的参数也非常多,现在开源的LLM最小的都是7B,意味着有 7 Billions 的参数。训练后的模型参数就像我们人类的记忆和知识一样,它存储了对应技能所需要的知识,简单来说,参数约等于技能,参数量越大,技能越精湛。
由于数据量和参数量都非常多,因此训练LLM的成本是非常高的。一个自然的想法就是先训练一个基本的LLM,用于解决一般性问题(General problems),然后在此基础上,针对特定的任务进行微调,上述过程对应的训练方式就是预训练和微调。
使用LLM的好处
其实LLM的背后思路是非常自然的,为什么对不同任务必须要训练不同模型呢?不能训练一个强大的模型,来解决一般性任务吗?
LLM就是在这种思想下诞生的,我们期望只训练一个通用模型就能解决不同任务。然后当我们得到这个基础的LLM后,我们可以做文本分类,问题回答,生成内容等任务。
当我们想要针对特定任务进行优化时,在LLM的基础上只需要少量的数据和裁剪工作(fine-tuned)就能完成优化,节省了非常多的成本。
另一个好处是,我们训练阶段的数据量和参数量越多,模型的能力也就越强大,我们在LLM的基础上进行裁剪,比我们针对特定的数据进行训练要好得多。
LLM的结构
LLM的技术依托于Transformer,在其基础上扩展了数据量和参数量,同时还堆叠了多个Transformer,每家公司又有自己的黑魔法来提升效果。
Transformer最早用来解决序列到序列(sequence to sequence)任务,常见的任务有机器翻译和文本摘要。
Transformer有最重要的组件是编码器(Encoder)和解码器(Decoder)。编码器用于将输入编码成信息,用于训练模型。编码器能够将文本、图片等输入转换成更高维度的向量,用于表示输入的信息。而解码器就是将信息解码成目标语言的内容。模型在编码器和解码器的共同作用下完成训练和任务。
例如用户输入了一句文本,在Encoder和Decoder的共同作用下,模型将其翻译成了英语:
在Transformer的基础上,每家公司有自己的侧重点,可以分为三种流派:
- Encoder-Only
- Decoder-Only
- Encoder-Decoder
GPT就是Decorder流派,Google新推出的Bard是Encoder-Decoder流派。
LLM的发展历程
传统编程可能需要这样定义一只猫:
随着深度学习的发展,我们可以给一个文本或者一张猫的照片,计算机就能判断出输入是否是猫。
然后LLM诞生后,我们只需要向它提问就能获得答案了,这是因为LLM在训练过程中已经学习到大量的知识,包括关于猫、猫科动物、生物等知识。所以LLM能给我们一个准确的回答。
Prompts
提到LLM,就不得不提到Prompt。我们都知道提问是有技巧的,提问的质量越高,提供的上下文越清晰,那么LLM回答的质量就越好,我们可以不断尝试修改我们的问题,同时提供上下文和要求来观察LLM的回答是否令人满意,整个过程就叫做Prompt Engineering。
比如我们想要让LLM帮我们写一个故事,我们可以这样说:
“我想让你扮演讲故事的角色。您将想出引人入胜、富有想象力和吸引观众的有趣故事。它可以是童话故事、教育故事或任何其他类型的故事,有可能吸引人们的注意力和想象力。根据目标受众,您可以为讲故事环节选择特定的主题或主题,例如,如果是儿童,则可以谈论动物;如果是成年人,那么基于历史的故事可能会更好地吸引他们等等。我的第一个要求是“我需要一个关于xx的有趣故事。”
上面这段文本就是prompt,它为LLM提供了上下文和规范,当我们想要进行故事领域的创作时,使用该Prompt会比直接提问得到的回答质量更高。
再比如说当我们想要从事英语到法语的翻译工作时,我们可以提示LLM它需要接受英语的输入然后输出翻译后的法语,这也是一种Prompt。
那么什么情况我们需要Prompt呢?大概是以下三种情况
- 使用解决一般性问题的LLM时,由于LLM没有针对特定的任务微调,因此它需要知道上下文来生成更高质量的答案
- 解决特殊任务时。当我们需要LLM解决特殊任务时,我们就需要Prompt,例如上面需要LLM写故事的场景
- 多轮对话。当我们的任务需要进行多轮对话时,也需要prompt来告诉LLM我们将进行长对话,过去的对话历史是重要的。
关于Prompt,有一个令人印象深刻的例子。如果你深入了解过搜索引擎,那么你一定了解过Google Hacking,所谓Hacking指的是你可以运用特殊的搜索限制来获取更精确的结果,例如:
· intitle:WORD =第一个关键词必须出现在标题里,第二个可以出现在任何位置.
· allintitle:WORD =所有关键词必须都出现在标题里.
· intext:Word=第一个关键词必须出现在文本中,第二个可以出现在任何位置。
显然,当我们是否使用hacking会很大程度上决定搜索结果的质量。当我们换一个视角来观察LLM的时候,你会发现Prompt恰好就是LLM Hacking,既然有Google Hacking,那么一定有LLM Hacking,Prompt就是一个很好的切入点。
Fine Tuning
我们之前一直在说微调可以用来优化LLM在具体任务上的表现。但具体如何做呢?LLM的参数数量远超传统DL模型,针对LLM,有一种叫做"Parameter-Efficient Tuning Methods"的方法,它是一种适应大型语言模型(LLM)的微调方法。
为了解决这个问题,研究者提出了各种"参数高效的微调方法",包括:
- Prompt Tuning: 在这种方法中,一个可学习的前缀(称为 "prompt")被添加到模型的输入上。只有这个前缀的参数是可学习的,而模型的其他部分保持不变。这大大减少了需要更新的参数数量。
- Adapter Tuning: 在这种方法中,原始模型的参数保持固定,但在模型的每一层中间添加了新的可学习的 "adapter" 层。这些adapter层的参数数量远远少于原始模型,从而使微调更加高效。
- Head Tuning: 在这种方法中,只有模型输出层(也称为 "head")的参数被更新,而模型的其他部分保持不变。