⭐️ 最近参加了由Datawhale主办、联合科大讯飞、阿里云天池发起的 AI夏令营(第三期),我参与了深度学习实践-NLP(自然语言处理)方向 😄
⭐️ 作为NLP小白,我希望能通过本次夏令营的学习实践,对NLP有初步的了解,学习大模型,动手完成NLP项目内容,同时通过社区交流学习,提升调参优化等能力
⭐️ 今天是打卡的第六天! ✊✊✊
⭐️ 按照日程安排,8月19日-22日主要学习深度学习方法,完成任务二,同时尝试跑通大模型Topline。
⭐️ 这两天我主要学习大模型,尝试理解深度学习方法Topline的代码,并在此基础上进行调参优化。
🚩【NLP】Datawhale-AI夏令营Day1打卡:文本特征提取
第一天学习了Python 数据分析相关的库(pandas和sklearn),文本特征提取的方法(基于TF-IDF提取和基于BOW提取,以及停用词的用法),划分数据集的方法,以及机器学习的模型,并尝试跑通了机器学习方法baseline。
🚩【NLP】Datawhale-AI夏令营Day2打卡:数据分析
第二天学习了数据探索、数据清洗、特征工程、模型训练与验证部分。
🚩【NLP】Datawhale-AI夏令营Day3打卡:Bert模型
第三天学习了Bert模型(预训练+微调范式),并尝试跑通了深度学习方法baseline。
🚩【NLP】Datawhale-AI夏令营Day4打卡:预训练+微调范式
第四天再次学习了预训练+微调范式,Transformer 和 Attention,并跑通深度学习方法baseline。
🚩【NLP】Datawhale-AI夏令营Day5打卡:预训练模型
第五天继续尝试理解预训练模型相关知识,并跑通深度学习方法Topline。
1. 学习内容
AI夏令营第三期–基于论文摘要的文本分类与关键词抽取挑战赛教程
✅ 大模型的概念
语言本质上是一个错综复杂的人类表达系统,受到语法规则的约束。因此,开发能够理解和精通语言的强大 AI 算法面临着巨大挑战。过去二十年,语言建模方法被广泛用于语言理解和生成,包括统计语言模型和神经语言模型。
近些年,研究人员通过在大规模语料库上预训练 Transformer 模型产生了预训练语言模型(PLMs),并在解决各类 NLP 任务上展现出了强大的能力。并且研究人员发现模型缩放可以带来性能提升,因此他们通过将模型规模增大进一步研究缩放的效果。有趣的是,当参数规模超过一定水平时,这个更大的语言模型实现了显著的性能提升,并出现了小模型中不存在的能力,比如上下文学习。为了区别于 PLM,这类模型被称为大型语言模型(LLMs)。
从 2019 年的谷歌 T5 到 OpenAI GPT 系列,参数量爆炸的大模型不断涌现。可以说,LLMs 的研究在学界和业界都得到了很大的推进,尤其去年 11 月底对话大模型 ChatGPT 的出现更是引起了社会各界的广泛关注。LLMs 的技术进展对整个 AI 社区产生了重要影响,并将彻底改变人们开发和使用 AI 算法的方式。
通常,大型语言模型(LLM)是指包含数千亿(或更多)参数的语言模型,这些参数是在大量文本数据上训练的,例如模型 GPT-3、PaLM、Galactica 和 LLaMA。具体来说,LLM 建立在 Transformer 架构之上,其中多头注意力层堆叠在一个非常深的神经网络中。现有的 LLM 主要采用与小语言模型类似的模型架构(即 Transformer)和预训练目标(即语言建模)。
LLM 在很大程度上扩展了模型大小、预训练数据和总计算量(扩大倍数)。他们可以更好地理解自然语言,并根据给定的上下文(例如 prompt)生成高质量的文本。这种容量改进可以用标度律进行部分地描述,其中性能大致遵循模型大小的大幅增加而增加。然而根据标度律,某些能力(例如,上下文学习)是不可预测的,只有当模型大小超过某个水平时才能观察到。
像chatgpt、claude AI、文心一言、讯飞星火和通义千问一样的,这种模型通过对大量的文本数据进行学习,可以理解和生成人类的自然语言,甚至可以编程、写数学题。
✅ 大模型的原理
大语言模型的语言生成的原理叫做自回归模型,是统计上一种处理时间序列的方法。
例如现在有一个句子:“我早上去了星巴克”,将其拆分为“我”、“早上”、“去了”、“星巴克”这四个词(我们叫做 token)。大语言模型是这样去学习的:第一个单词是,输入到模型中。经过了一个Transformer模块后,它输出希望被训练成第一个字,也就是“我”。在第二个位置,它的输入是“我”,它的输出是“早上”,第三个位置输入是“早上”,输出是“去了”,这样不断地一轮一轮迭代,每个细胞能够根据我现在的这个单词,去预测下一个单词。最后这个模型就能够学到,“我早上去了星巴克”的下一句话应该是“星巴克里的咖啡很好喝”,它认为生成“星巴克里的咖啡很好喝”比“我明天要去乘飞机”这样一句话合理得多。
自回归模型的关键是根据你前面已经出现过的内容,来推测它的下一个字,下一句话应该是怎样生成的,在这样不断的迭代过程中,它就能学会如何去生成一句话、一个段落,以及一篇文章。
总的来说,LLM可以理解为大规模的语言模型。从历史的角度来看,前面说的BERT和GPT并没有达到足够大的规模。直到GPT-2、GPT-3出现了,它们才达到了较大的量级。大家发现语言模型爆炸式增长,从一个细胞长成一个脑子,这种程度上的增长才带来了LLMs。所以我们一般理解LLMs,语言模型规模大到了至少到GPT-1或2阶段,它的参数量能够突破1亿或者10亿阶段才能称之为大模型。
✅ 大模型的训练步骤
OpenAI 开发 ChatGPT 的三个主要步骤:大尺寸预训练+指令微调+RLHF
1️⃣ 大尺寸预训练: 在这个阶段,模型在大规模的文本数据集上进行预训练。这是一个非监督学习的过程,模型需要预测在给定的文本序列中下一个词是什么。预训练的目标是让模型学会理解和生成人类语言的基本模式。
2️⃣ 指令微调: 在预训练之后,模型会在一个更小但专门针对特定任务的数据集上进行微调。这个数据集通常由人工生成,包含了模型需要学会的任务的特定指令。例如,如果我们想要让模型学会如何进行数学计算,我们就需要提供一些包含数学问题和对应解答的数据。
3️⃣ RLHF(Reinforcement Learning from Human Feedback,人类反馈强化学习):这是一个强化学习过程,模型会根据人类提供的反馈进行学习和优化。首先,我们会收集一些模型的预测结果,并让人类评估这些结果的好坏。然后,我们会使用这些评估结果作为奖励,训练模型优化其预测性能。通过这种方式,模型可以学会生成更符合人类期望的结果。
通过这三个步骤,模型能够在理解和生成人类语言的基础上,更好地完成特定任务,更好地符合人类的期望。
✅ Prompt
Prompt顾名思义表示「提示」,比如在高中时代,英语考试中的完形填空,有 4 个提示选项,我们只需要在 4 个里面选择合适的一个作为答案即可。在大语言模型中,提示模型输出我们想要的答案,这里就需要Prompt。
✅ 大模型微调的概念
将预训练好的语言模型(LM)在下游任务上进行微调已成为处理 NLP 任务的一种范式。与使用开箱即用的预训练 LLM (例如:零样本推理) 相比,在下游数据集上微调这些预训练 LLM 会带来巨大的性能提升。
但是,随着模型变得越来越大,在消费级硬件上对模型进行全部参数的微调(full fine-tuning)变得不可行。此外,为每个下游任务独立存储和部署微调模型变得非常昂贵,因为微调模型(调整模型的所有参数)与原始预训练模型的大小相同。
因此,近年来研究者们提出了各种各样的参数高效迁移学习方法(Parameter-efficient Transfer Learning),即固定住Pretrain Language model(PLM)的大部分参数,仅调整模型的一小部分参数来达到与全部参数的微调接近的效果(调整的可以是模型自有的参数,也可以是额外加入的一些参数)。
目前所称的大语言模型,一般指指令微调大模型,即经过预训练——指令微调——人类反馈强化学习全过程训练的大模型,对人类指令具备较强的理解和执行能力,而不是进行简单的文本生成。例如,当你询问“中国的首都是什么?”时,你的指令即你的问题,通用模型将会简单地对你的问题进行最大概率预测地生成,例如回答“中国的首都是什么?这是一个人尽皆知的问题…”而指令微调大模型会理解你的指令,知道你想要模型对你的问题给出答案,从而回答“北京”。ChatGPT 与 GPT-3 就是鲜明的例子。GPT-3 是通用大模型,因此对你的输入只能进行最大概率预测地输出;而 ChatGPT 是指令微调大模型,可以理解并执行你的指令,例如帮助你写代码,帮助你判断问题等。
正如其名,指令微调大模型与通用大模型最大的区别在于进行了指令微调,即训练模型理解并执行指令的能力。指令微调一般会给模型特定的指令及执行指令后的输出,要求模型学习遵循指令的能力。这里的指令可以有很多种类型,包括回答问题、续写、创作等。具体而言,指令微调时通常有两个输入,一个是你要求模型执行的指令,另一个是执行该指令所必须的输入。例如,当你要求模型执行指令“续写我的话”,那么你还需要输入该指令中指代的话,例如“今天天气很好,我们去”。而指令微调的输出一般是模型执行该指令后的输出,例如对于上述示例,输出应该为“郊游吧”。
本任务中,我们所要对大模型进行的即是指令微调。通过训练模型在特定指令(在本任务中,即要求其判断文献是否医学领域文献)下的指令执行能力,来使用大模型完成本任务。我们也需要按照指令微调的格式进行数据集的建立。使用 LoRA 进行指令微调时,数据集一般有三个元素:instruction,input,output。instruction 即指令,即上文中我们所提到的第一个输入——要求模型执行的指令。input 即上文中我们提到的第二个输入——执行该指令所必须的输入。output 即指令微调的输出。
- instruction:指令,Please judge whether it is a medical field paper according to the given paper title and abstract, output 1 or 0, the following is the paper title and abstract -->
- “–>”:加上一个箭头就是让大模型明白,下次再遇到这种问题,就是我们想让大模型进行二分类任务。
- input:prompt。对于这个任务来说那就是 title+abstract+author 拼接成的字符串了。
- output:response,即大模型的回答,0 or 1。
如果是对于任务二的关键词生成,那么我们应该将指令修改为要求模型根据给定文献的标题、摘要生成关键词,输入不变,输出更改为文献的关键词: - instruction:指令,Please extract keywords from the given paper title and abstract in the text below, separated by commas -->
- “–>”:加上一个箭头就是让大模型明白,下次再遇到这种问题,就是我们想让大模型进行关键词抽取任务。
- input:prompt。对于这个任务来说那就是 title+abstract+author 拼接成的字符串了。
- output:response,即大模型的回答,具体抽取出的关键词。
2. 实践项目
同之前博客介绍的,仍然是任务一,文本分类任务。
【NLP】Datawhale-AI夏令营Day3打卡:Bert模型
3. 实践代码
完整Topline源码获取可以联系Datawhale官方或者群内助教 💭
4. 遇到的问题和解决方法
问题1:导入peft失败
直接conda安装peft时遇到报错:
Solving environment: unsuccessful initial attempt using frozen solve. Retrying with flexible solve.
PackagesNotFoundError: The following packages are not available from current channels:
-- peft
解决1:
从http://gitclone.com镜像安装peft
pip install git+https://gitclone.com/github.com/huggingface/peft.git -i https://pypi.mirrors.ustc.edu.cn/simple --trusted-host=pypi.mirrors.ustc.edu.cn
问题2:导入transformers_modules失败
ModuleNotFoundError: No module named 'transformers_modules'
后面发现是前面的微调出了问题。
5. 实践成绩
8.22 Roberta-base模型Topline返回分数:0.98619(损失函数为二元交叉熵(BCE))
8.20 Roberta-base模型Topline返回分数:1(损失函数为交叉熵(CE))
8.19凌晨 bert模型Baseline返回分数:0.89562(batch_size=1, epochs = 10)
8.19 bert模型Baselin返回分数:0.99452 (batch_size=8, epochs = 10)