技术介绍:
1. LLMs: Large Language Models
Large Language Models (LLMs) 是基于深度学习的模型,能够生成和理解自然语言。它们通常通过在大规模文本数据上训练数以亿计甚至数百亿个参数来捕获语言中的语法、语义和上下文信息。这些模型能够完成从文本生成、翻译到对话生成等多种自然语言处理任务。知名的LLMs包括OpenAI的GPT系列、Google的BERT和T5等。
2. Transformer
Transformer 是一种用于处理序列数据的深度学习模型,最初由Vaswani等人在2017年提出。与传统的RNN和LSTM不同,Transformer完全依赖于注意力机制来捕捉序列中的依赖关系,而不需要顺序处理数据。这使得Transformer在处理长距离依赖关系时非常高效。Transformer包含两个主要部分:编码器和解码器,编码器将输入序列转化为内部表示,解码器将这些表示转化为目标输出序列。
3. Embedding
Embedding 是一种将离散数据(如单词、字符)转换为连续向量空间表示的方法。通过Embedding层,模型可以将高维稀疏的输入数据映射到低维稠密的向量,这些向量在语义空间中更容易处理。Word2Vec、GloVe和BERT的词嵌入都是常见的Embedding方法。Embedding不仅能捕捉单词之间的语义关系,还能显著减少计算复杂度。
4. Positional Encoding
Positional Encoding 是Transformer模型中用于引入序列位置信息的一种方法。由于Transformer不具备处理序列数据的内在顺序结构(不像RNN),需要通过Positional Encoding将位置信息编码到输入向量中。常见的Positional Encoding方法是通过正弦和余弦函数生成一组固定的位置编码,然后将其加到输入的词嵌入向量中。这些编码帮助模型识别序列中单词的位置及其相对关系。
5. Self-Attention
Self-Attention(自注意力)机制是Transformer的核心组件,它允许每个输入元素根据其他元素的相关性来重新表示自己。通过计算输入序列中每个元素与其他所有元素之间的注意力权重,Self-Attention机制能够捕捉序列中远程依赖关系。具体而言,Self-Attention计算三个向量:Query、Key和Value,然后通过这些向量计算注意力得分和加权和。这一过程可以并行处理,从而提高计算效率。
6. Multi-Head Attention
Multi-Head Attention 是对Self-Attention机制的扩展,通过并行地使用多个注意力头(attention heads)来捕捉输入序列中不同的子空间特征。每个注意力头独立计算其自己的Self-Attention,然后将所有头的输出连接起来并进行线性变换。这种方法允许模型在不同表示子空间上进行注意力计算,从而提高模型的表达能力和鲁棒性。
7. Full Fine-Tuning
Full Fine-Tuning 是对预训练语言模型进行微调的方法之一。它通过在特定任务的数据集上训练整个模型的所有参数来适应该任务。这种方法虽然能达到较好的任务特定性能,但由于需要调整所有参数,训练过程通常耗时且需要大量计算资源。此外,当模型规模很大时,Full Fine-Tuning的存储和计算成本会非常高。
8. PEFT: Parameter-Efficient Fine-Tuning
Parameter-Efficient Fine-Tuning (PEFT) 是一种改进的微调方法,旨在通过调整较少数量的参数来适应特定任务,从而减少计算和存储成本。PEFT的方法包括冻结大部分预训练模型的参数,仅调整特定层或模块,或者通过添加小的适应模块来进行微调。这些技术能够在保持较高性能的同时显著降低微调成本。
9. LoRA: Low-Rank Adaptation of LLMs
LoRA (Low-Rank Adaptation) 是一种PEFT技术,通过将适应矩阵分解为低秩矩阵来减少模型参数的微调开销。在微调过程中,LoRA固定预训练模型的权重,仅对分解出的低秩适应矩阵进行调整。这种方法不仅降低了计算和存储需求,还能保持较高的模型性能和灵活性。
10. Fine-tune with PEFT
使用PEFT进行微调的步骤包括:
1. 冻结预训练模型的大部分参数,只微调一小部分参数或添加适应模块。
2. 选择合适的PEFT方法,如Adapter、LoRA等,根据任务需求调整模型结构。
3. 在特定任务的数据集上训练微调的模型参数,确保在新任务上的良好表现。
4. 评估微调模型的性能,调整超参数以优化结果。
11. RLHF: Prepare Labeled Human Feedback
RLHF (Reinforcement Learning from Human Feedback) 是一种结合人类反馈进行强化学习的方法。其步骤包括:
1. 收集人类标注的数据,这些数据反映了模型在特定任务上的表现和改进方向。
2. 使用这些标注数据训练一个奖励模型,该模型可以评估模型输出的质量。
3. 将奖励模型融入强化学习过程中,通过优化策略模型来最大化奖励。
4. 不断迭代和更新模型,结合新的反馈数据以持续改进性能。
12. Popular LLM Benchmarks
流行的LLM评测基准包括:
- GLUE (General Language Understanding Evaluation):涵盖自然语言推理、语义相似度、情感分析等多种任务。
- SuperGLUE:GLUE的增强版,包含更多复杂的理解任务。
- SQuAD (Stanford Question Answering Dataset):评估模型在阅读理解和问答任务上的表现。
- XTREME (Cross-lingual Transfer Evaluation of Multilingual Encoders):多语言模型的评测基准。
- WMT (Workshop on Machine Translation):机器翻译任务的标准评测基准。
这些评测基准通过多样的任务和数据集对模型进行全面评估,以衡量其在不同自然语言处理任务中的性能和泛化能力。
实验过程及结果:
1.下载中文大模型,智谱AI:
2.下载embedding模型:
- 配置和构建一个使用 Intel Extension for Transformers (IEXT) 的聊天机器人,具体使用了 Retrieval 插件进行信息检索,并对模型进行了优化,具体来说就是配置和启用检索插件,指定嵌入模型和输入数据路径并设置聊天机器人模型和优化参数(包括数据类型优化),最后构建并实例化一个优化后的聊天机器人。
详细解释如下:
- PipelineConfig 用于配置聊天机器人的管道;build_chatbot 用于构建聊天机器人实例;plugins 包含各种插件,比如信息检索插件;RtnConfig 用于配置模型的优化参数。
- plugins.retrieval.enable = True 启用了检索插件;plugins.retrieval.args['embedding_model'] 指定了用于检索的嵌入模型路径,这里是 ./bge-base-zh-v1.5;plugins.retrieval.args["input_path"] 指定了输入文件的路径,这里是 ./sample.jsonl,包含了需要检索的数据。
(3)model_name_or_path 指定了聊天机器人使用的模型路径,这里是 ./chatglm3-6b。
plugins 包含了前面配置的检索插件。optimization_config 使用 RtnConfig 进行优化配置:compute_dtype="int8" 设置计算数据类型为 int8。weight_dtype="int4_fullrange" 设置权重数据类型为 int4_fullrange,这有助于降低计算复杂度和内存占用。
4.通过禁用检索插件后,直接使用预配置好的聊天机器人模型在不使用任何检索到的外部信息的情况下来回答指定的问题“cnvrg.io 网站是由谁创建的?”。然后将生成的回答输出到控制台。
详细解释如下:
- plugins.retrieval.enable = False这行代码将检索插件禁用。即使之前配置了检索插件和相关参数,但在这里通过将 enable 设置为 False,表示不使用该插件进行信息检索。
- response = chatbot.predict(query="cnvrg.io 网站是由谁创建的?")这行代码使用已经配置好的聊天机器人 chatbot 生成一个回答。chatbot.predict 方法接收一个问题(在这个例子中是“cnvrg.io 网站是由谁创建的?”),并返回模型生成的答案,存储在 response 变量中。
5.启用检索插件,然后讲聊天机器人对相同问题的回答输出到控制台:
个人心得:
实验的核心在于比较启用和禁用检索插件对聊天机器人回答的影响。
当检索插件被禁用时,聊天机器人仅依赖其内置的语言模型来生成回答。这种情况下,回答的质量完全取决于模型的预训练数据和内置知识库。如果模型没有在预训练过程中见过相关问题或答案,回答可能会不准确或缺乏细节。在这种模式下,回答可能是模糊的或泛泛而谈的,具体取决于模型的预训练范围。
启用检索插件后,聊天机器人可以从指定的嵌入模型和输入数据中检索相关信息。这使得回答更加准确和详细,因为模型不仅依赖自身的知识,还参考了外部数据。在这种模式下,回答通常更加具体和可靠。例如,回答可能会包含关于 cnvrg.io 网站创始人的具体信息,因为这些信息可以从检索插件提供的数据中获取。
通过这次实验,我总结了以下几点:
1. 检索插件的重要性:启用检索插件可以显著提高聊天机器人的回答质量,尤其是当问题涉及具体事实或需要详细解释时。检索插件通过从外部数据中获取相关信息,补充了模型内置知识的不足。
2. 配置灵活性:IEXT 提供了灵活的配置选项,使用户能够根据具体需求调整模型和插件设置。这种灵活性对于开发高效、定制化的聊天机器人至关重要。
3. 优化参数的影响:通过设置 `compute_dtype` 和 `weight_dtype` 等优化参数,可以有效降低计算复杂度和内存占用。这对于在资源受限的环境中部署模型尤为重要。
实验过程中,我不仅加深了对 IEXT 框架的理解,也体验到了通过配置和调整插件来提升模型性能的过程。这让我认识到,在开发 AI 应用时,除了选择合适的模型外,合理配置和优化同样重要。此外,通过对比启用和禁用检索插件的效果,我体会到了信息检索在生成准确和有用答案方面的关键作用。
总之,这次实验不仅增强了我的技术技能,也提升了我对聊天机器人构建和优化的认识,为今后在相关领域的工作打下了坚实的基础。