【全栈实战】大模型自学:从入门到实战打怪升级,20W字总结(二)


😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本栏讲解【全栈实战】大模型自学:从入门到实战打怪升级。 🔔专栏持续更新,适合人群:本科生、研究生、大模型爱好者,期待与你一同探索、学习、进步,一起卷起来叭!

目录

科研(第一周)

入门

期刊与会议

💡学术论文、期刊、文献、会议的区别:

  • 学术论文:作者通过研究、实验、调查等方法所得出的独立观点或得出的研究结果,并将其以书面形式进行记录。论文主要通过投稿到期刊或会议来发表。
  • 期刊:由学术团体、学会或出版社定期出版的学术性刊物。它收录了大量的学术论文,旨在促进学术研究和知识交流,并对投稿的论文进行匿名同行评审。期刊是由学术团体、学会或出版社定期出版。
  • 文献:一切记录了知识和信息的载体都可以称为文献,包括图书、报纸、期刊、光盘、相像磁带等。
  • 会议:一般是由研究所或者协会举办的,用于学术交流的目的在会议之后,会出一本会议过程中的论文集proceedings,其中收录的就叫会议论文有的期刊的出版社或者协会也会为某个期刊开会议,这些会议论文也叫该期刊的增刊

💡论文(paper)分类:

  • Letter:快报形式,一般发表最新的研究成果,文章要求短小(4页),有即时性,理论推导要求不高
  • Journal/Transactions:期刊杂志,但两者面向的读者和表达方式上略有不同
    • Transactions:具体到一个相对较细的专业方向上
    • Journa:面向的读者群却更加广泛,所以jour需要对背景知识有更加全面的介绍
  • Magazine:属于杂志类,一般要求用文字和图表来表述些最新研究成果,不允许有过多的公式推导
  • Proceedings:记录, 会议录; 年[学]报; (科学文献)汇编,会议的文章发表为论文集,通常是这个类型

💡概念区分:

  • DOI(Digital Object Identifier):数字对象标识,文献的身份证号码,具有唯一性、永久性等特点
    • 组成:前缀和后缀,中间用"/"分割,所有DOI均以"10."开头,例如:10.1158/1541-7786.MCR-08-022710.1016/j.ccr.2008.05.005。前缀中的10.为DOI特定代码,前缀后4位数字表示出版机构代码,由DOI注册代理机构分配;后缀由出版机构提供,规则不限,只要在相同的前缀中具有唯一性即可
    • 判断DOI是否正确:🔍https://dx.doi.org
    • 查找DOI:🔍https://search.crossref.org
  • IF(Impact Factor):期刊影响因子,国际上通行的期刊评价指标,是E.加菲尔德于1972年提出的。由于它是一个相对统计量,所以可公平地评价和处理各类期刊。通常,期刊的影响因子越大,它的学术影响力和作用也越大。
    • IF=(某刊前2年发表论文在该年的被引用次数)/(该刊前2年发表论文总数
    • 三年平均影响因子:IF=(当年IF+去年IF+前年IF)/3,中科院分区表采用3年平均IF作为划分分区依据,以减少影响因子上下波动带来的影响
  • H指数(h-index/h-factor):一名科研人员至多有h篇论文分别被引用了至少h次
  • 刊号:
    • CN:中国境内注册、国内公开发行的刊物,刊号均标注有CN字母
    • ISSN:我国境地外注册,国内、外公开发行的刊物。ISSN由8位数字组成,分两个部分:序号和检验码。
  • 收录号/检索号(AcessionNumber):某篇论文被数据库收录的唯一标记
  • 查询期刊信息:
  • 🔍下论文
    1. 找不到英⽂论⽂,可以尝试sci-hub https://sci-hub.ru
    2. 某宝买包⽉包年的中英⽂数据库搜索

学术期刊(AcademicJournal)分类:

  • 核心期刊:
    • 国内:主要有7大,审核速度:1-3个⽉
      • 北⼤核⼼(北⼤中⽂核⼼):普及最⼴
      • 南⼤核⼼(中⽂社会科学引⽂索引(CSSCI)来源期刊):最权威
      • 科技核⼼(中国科技论⽂统计源期刊(CSTPCD)):医药机构
      • CSCD(中国科学引⽂数据库):理科的CSCD
      • ⼈⽂社科核⼼(中国⼈⽂社会科学核⼼期刊(CHSSCD))
      • 中国⼈⽂社会科学学报学会"中国⼈⽂
      • 万⽅数据股份有限公司的"中国核⼼期刊遴选数据库"
    • 国际:
      • SCI(科学引⽂索引):属于理⼯科,根据期刊影响因⼦来划分,涉及学科广泛,审稿速度:⼀⼆区为1-3个⽉,三区为2-5个月,四区为2个月-1年
        • 按JCR划分:Q1、Q2、Q3、Q4(平均4等分,各占25%)
        • 按中科院划分:Q1(5%)、Q2(6-20%)、Q3(21-50%)、Q4(51-100%)【一般按这个划分】
      • SSCI (社会科学引⽂索引):SCI的姊妹篇,属于社会科学
      • A&HCI(艺术⼈⽂引⽂索引):属于艺术类
      • EI(⼯程索引):供查阅工程技术领域文献的综合性情报检索刊物,EI没有自己的影响因子,能检索到的文章分为两种
        • JA检索:就是收录期刊的文章,EI源刊,理论性强
        • CA检索:就是收录会议的文章,EI会议,实践性强
  • 普通期刊:非核心期刊都是普通期刊
    • 国家级期刊:由党中央、国务院及所属各部门,或中国科学院、中国社会科学院、各民主党派和全国性人民团体主办的期刊及国家一级专业学会主办的会刊
    • 省级期刊:由各省、自治区、直辖市的各部门、委办、厅、局、所,省级社会团体和机构以及各高等院校主办,在新闻出版部门有登记备案,国内外公开发行的学术期刊
  • 顶刊:⼀般指SCI⼀区Top,是一个相对的概念,每个学校/机构都可以有不同范围定义

会议:

  • 会议核⼼:
    • 国际:世界各地不定期举办的学术研讨会,针对某个会议主题⾯向世界征⽂,会后以此次会议名称为刊名,以会议论⽂集的形式出版,并递交EI-CA或ISTP数据库检索。
      • CPCI/ISTP会议(科技会议录索引):知名度不⾼
      • EI会议(理⼯科类会议索引)
    • 国内:
  • 顶会:在某个领域内的顶级学术交流会议中宣读发表的的论文

CCF:中国计算机学会,不是出版社(那就不能发行期刊),也不是数据库,也不是某个会议的名字,只是计算机领域的权威⼈⼠排的评级,主要关注计算机领域。

人工智能领域常用:

A类国际学术期刊:

A类国际学术会议:

T1类国内期刊:

复盘所有的关系:

💡常见会议、期刊:

机器学习领域两大顶会:

  • ICML(International Conference on Machine Learning):国际机器学习大会,由国际机器学习学会(IMLS)主办,一年一次。与 NIPS 并列机器学习两大顶会。
  • NeurIPS/NIPS(Annual Conference on Neural Information Processing Systems):神经信息处理系统年会,交叉学科会议 ,是一个关于机器学习和计算神经科学的国际会议。但偏重于机器学习. 主要包括神经信息处理、统计方法、学习理论以及应用等,大会每年 12 月举行,会后一般会在第 2 年初版会议的论文集。

随着全球 #metoo 运动的不断发展,学术界爆出大量内部性别歧视、性骚扰的案例。NIPS 大会的名字由于带有情色意味,引起了众多社区成员的反对。 NIPS 网站地址从 https://nips.cc/变成了 https://neurips.cc/,NIPS也正式更名为NeurIPS。

深度学习领域顶会:

  • ICLR(International Conference on Learning Representations):国际表示学习会议 主要聚焦于深度学习。
  • IJCAI( International Joint Conference on Artificial Intelligence):国际人工智能联合会议,人工智能领域最顶尖的综合性会议。 历史悠久, 从1969年开始举办。人戏称"爱韭菜"。
  • AAAI(AAAI Conference on Artificial Intelligence):美国人工智能协会年会,人工智能领域的顶级会议, 每年二月份左右召开,地点一般在北美。

自然语言处理领域:

  • 顶级会议:ACL(代表)、NAACL、EMNLP
  • 顶级期刊:CL、TACL
  • 比较好的会议:AAAI、IJCAI、SIGKDD、SIGIR、WWW、EACL

计算机视觉领域:

  • 顶级会议: CVPR(代表)、ICCV、 ECCV、 NeurIPS、ICML、ICLR(CCF里暂时没有的顶会)
  • 比较好的会议:AAAI(A类)、IJCAI(A类)、ACM MM (A类)
  • 有一定认可度的会议:WACV、BMVC(C类)、ACCV(C类)

其他常见顶刊顶会:

💡如何确定自己的期刊:

  1. ⾕歌学术和知⽹搜索近3年领域所有的论⽂
  2. 通过引⽤信息获取每⼀篇论⽂的投稿期刊和会议,汇总到⼀个表格
  3. 把所有可投的期刊和会议按照对应级别分类(英⽂期刊可以通过letpub搜寻期刊级别,中⽂期刊可以通过知⽹搜寻期刊级别)例如按照SCI分区,即可得到SCI⼀区对应的所有可投期刊、SCI⼆区对应的所有可投期刊、SCI三区对应的所有可投期刊、SCI四区对应的所有可投期刊。

毕业目标

研究⽣三年下来,最重要的⼀件事:毕业。请务必先查看研究⽣培养计划。如果你刚读研毕业⽬标都没定好,犹如⼀只⽆头苍蝇⼀样乱⻜,会浪费很多的宝贵时间,最主要的是3年后你往回看,会后悔不已。

论文方向

💡选择>努力

  1. 通过知⽹和⾕歌学术,按照⽅向关键词,分别搜出这10个⽅向的近三年的所有论⽂;
  2. 选择1个论⽂数量最多的论⽂,且近两三年内有很多人在做的,适合水论文
  3. 选择冷门方向,第⼀个吃螃蟹的⼈,最好这个方向是老师很擅长的方向或者是有师兄师姐带的方向,然后冲顶刊顶会
  4. 看对应方向的英文综述性文章(讲该领域的发展历史) 2-3篇

小论文

必备三张图:

  • 摘要图:
  • 方法图:只考虑数据流的运转,⽽不要把模型的细节全部绘制出来
  • 总结图:
    • 通过⼀张表格和最近⼏年的模型对比,体现自己模型的优越性
    • 挑几个实例,然后通过⼀幅可视化的图来体现我们的模型的效果很好

大论文

Zotero 7

0.安装:

🔗参考链接:Zotero 7安装

1.注册账号密码:

🔗Zotero 7注册

2.设置文件同步方式为坚果云:

Zotero官方只免费提供300MB空间,估计100篇文献就满了。官方的云空间售价如下,并不便宜:

坚果云免费版没有储量上限,只有流量上限:上传流量1GB/月,下载流量3GB/月,对文献阅读来说,基本够用

🔗坚果云

登录->右上角账号名称->账户信息->安全选项->第三方应用管理->添加应用,配置完WebDav应用后,出现系统自动生成的密码信息。


验证服务器:

3.修改数据存储位置:

Zotero默认的文献存储路径为C:\Users\username\Zotero,我们需要把文献保存路径改到其它盘,防止C盘越用越大。修改完成后,需要手动把默认路径的文件夹内容复制一份到新的文件夹中,再重启Zotero,完成修改。

4.插件安装:

工具-插件:

安装插件市场后(zotero-addons.xpi):

重启应用:

插件推荐:

  • Zotero Bette Notes------强大的笔记功能,自动生成思维导图
  • Jasminum茉莉花插件------中文文献资源抓取、管理
  • Zotero PDF Rename------ PDF重命名.
  • Zotero Style ------标签分栏与阅读进度可视化管理
  • zotero IF------自动匹配文献影响因子和分区
  • PDF Figure------获取论文中的图表信息,便于读图
  • Translate for Zotero------简单粗暴的划词翻译
  • Zotero Connector------🔗配合浏览器插件进行下载文献
  • Scholaread------文献翻译手机阅读
  • Zotero Scihub------下载英文文献
  • zotcard------边阅读边记录卡片
  • gree frog------解决影响因子不显示问题
  • Reading list ------阅读状态管理
  • chartero------论文可视化管理
  • zotero-reference------一键抓取参考文献
  • scite Plugin for zotero------一键判断论文是否靠谱
  • Tag------自定义文献标签
  • Keep Zotero------后台常驻Zotero软件,避免抓取文献等问题
  • Notero------同步Zotero中的论文条目至Notion数据库中
  • Del Item with Attachment------删除时管理条目、附件和笔记
  • ZotFile------按照设定格式,自动重命名文件
  • Zotero connector------网页文献抓取,自动生成条目

5.文献阅读:

🔗论文示例:Attention Is All You Need

导入文献:

文献笔记(Better Notes):

添加注释笔记:

添加条目笔记:

添加独立笔记(主笔记):

基于Kimi总结文献:

🔗Kimi官网:https://kimi.moonshot.cn

如果忘了PDF的存储位置,可以右键-打开文件目录找到对应文献PDF:

提示词1:

请帮我总结这篇文献的研究背景,然后总结这篇文献采用了什么研究方法,最终得到了什么研究结论。

条目笔记:

研究背景:
传统的序列转换模型(如语言模型和机器翻译)主要基于复杂的循环神经网络(RNN)或卷积神经网络(CNN),并结合编码器-解码器架构和注意力机制。
这些模型在处理长序列时存在计算效率问题,因为它们需要按顺序逐步处理输入和输出序列,限制了训练过程中的并行化能力。
为了改善这一问题,研究者们提出了各种方法,例如通过分解技巧和条件计算来提高计算效率,但序列计算的基本限制仍然存在。

研究方法:
提出了一种新的网络架构------Transformer,它完全基于注意力机制,不使用递归和卷积。
Transformer 模型包括编码器和解码器,它们通过自注意力和点式全连接层堆叠而成。
引入了多头注意力机制(Multi-Head Attention),允许模型在不同位置的不同表示子空间中联合关注信息。
使用了位置编码(Positional Encoding),以便模型能够利用序列的顺序信息。
采用了残差连接(Residual Connection)和层归一化(Layer Normalization)来提高模型的训练稳定性和性能。

研究结论:
Transformer 模型在两个机器翻译任务(WMT 2014 英德和英法翻译任务)上表现出色,质量优于现有最佳模型,并且在训练时间上显著减少。
在英德翻译任务上,Transformer 模型达到了28.4 BLEU分数,超过了之前所有模型,包括集成模型。
在英法翻译任务上,模型在训练3.5天后,达到了41.8 BLEU分数的新单模型最佳成绩。
通过在英语成分句法分析任务上的应用,证明了Transformer模型能够很好地泛化到其他任务上。
研究表明,基于注意力的模型在未来具有广阔的应用前景,研究者计划将其应用于除文本之外的其他输入和输出模态的问题,并探索局部、受限的注意力机制,以有效处理大型输入和输出,如图像、音频和视频。

独立笔记与条目笔记链接:


实现效果:

双击主笔记:

提示词2:

请你阅读这篇文献并理解,请你回答我第一个问题,这篇文献中有没有讲到注意力机制是什么?

条目笔记:

是的,这篇文献中详细讨论了注意力机制。在文献的第2节"Background"和第3节"Model Architecture"中,作者解释了注意力机制的基本概念,并介绍了它们在Transformer模型中的应用。以下是一些关键点:

1. **注意力机制的定义**:注意力机制通常被描述为将查询(query)和一组键值对(key-value pairs)映射到输出的函数,其中查询、键、值和输出都是向量。输出是值的加权和,权重由查询与相应键的兼容性函数计算得出。

2. **自注意力(Self-attention)**:自注意力是一种特殊类型的注意力机制,它关联单个序列中不同位置的信息,以计算序列的表示。自注意力已成功应用于阅读理解、摘要、文本蕴含和学习任务独立的句子表示等多种任务。

3. **多头注意力(Multi-Head Attention)**:不是执行单个注意力函数,而是将查询、键和值通过不同的线性变换投影多次,然后在这些投影版本上并行执行多个注意力函数,然后将结果合并以产生最终输出。

4. **缩放点积注意力(Scaled Dot-Product Attention)**:这是Transformer中使用的一种特定类型的注意力,通过将查询与所有键的点积结果除以键维度的平方根,然后应用softmax函数来获得权重。

5. **位置编码(Positional Encoding)**:由于Transformer模型不包含递归或卷积,为了使模型能够利用序列的顺序信息,作者引入了位置编码,将其添加到编码器和解码器堆栈底部的输入嵌入中。

6. **注意力的应用**:Transformer模型在编码器-解码器注意力层、编码器自注意力层和解码器自注意力层中使用多头注意力,允许模型在不同位置关注不同信息。

文献中还进一步讨论了注意力机制相对于传统循环层和卷积层的优势,包括计算复杂性、并行化能力和学习长距离依赖的能力。

总结提示词:

请你总结这篇文章,具体要求为告诉我这篇文章的研究背景是什么,通过什么研究方法得到什么样的结论,本篇文章的创新点是什么?

深入学习某块内容提示词:

本篇文章中位置编码在文章的哪一部分,请给我定位,然后向我详细的介绍该方法,让我能够清晰的了解该方法。

关于划词翻译:

PDF Translate 免费插件最多1000字符

不如关闭翻译插件,直接打开有道词典划词翻译,不会读的单词还可以学习发音:

文献PPT

提示词:

# Role:
你是一个擅长从文档中提取并总结内容,然后生成PPT大纲以及PPT每一页内容的专家

##Skills
1.信息提取与分析:能够快速地从大量信息中提取关健点和核心概念,这对于创建有彤响力的演示文稿至关重要。
2.逻辑结构设计:善于构建清晰的逻辑框架,确保演示内容有条理且易于理解。这包括知道如何组织介绍、主体内容和结论,以及如何合理安排这些内容的顺序。
3.视觉呈现:具备良好的设计感,能够将文本和数据通过视觉元素《如图表、图像和布局)有效地呈现出来,提升信息的吸引力和易读性。
4.摘要和精炼能力:能够将复杂或冗长的信息精炼成简洁有力的点,这对于PPT这种需要简洁表达的格式尤为重要。
5.故事讲述:能够将数据和事实转化为引人入胜的故事,这有助于吸引听众的注意力和增强信息的传达效果。

##Goals:
从用户提供的文档中提取关链信息,并以总-分-总的形式重点归纳和提炼,制作成不少于5页的澳示PPT大纲。

##Constrains:
-直接按<Workflaw>执行。一开始不需要额外的解释
-在提炼和制作PPT时,确保每一页的内容既充实又具有深度,避免过于简化
-注意PPT的视觉设计,使用适当的图表、图片和布局来增强信息的表达和吸引力
-考虑到观众的多样性,确保PPT内容的通俗易懂,尽量避免使用过于专业或复杂的术语
-制作完成的PPT应清楚地展示了从PDF文档中提炼出的核心内容,每一页都应传达一个明确的观点。且整体呈现应符合总-分-总的结构
-以**markdown**形式输出

## Workflow:
###第一步:上传文档
请求用户上传文档
###第二步:分析和理解文档
对于用户上传的文档进行分析和理解。
1.确定文档的**主题"
2.浏览*"目录"",识别主要**章节**和相关的**内页**,以便理解文档结构。
###第三步:内容提炼
1.对于每个章节,提取至少3个关键点,每个关键点都需用序号标明。
2.为每个关键点编写简短的**详细观点描述**,以确保内容的清晰和准确性。
以上完成后,询问用户是否需要按以上内容进行PPT制作。
###第四步:PPT制作
-**每一页PPT**应围绕一个清晰的观点进行设计。
每一页的内容应包括:
1.章节**表明该观点来源于文档的哪个部分。
2.**详细观点描述**列出与该观点相关的至少3个细节。
3.**引发思考的内容**,鼓励观众深入思考所呈现的信息。
4.PPT的最后一页为总结页。应包括对全文核心观点的总结:-以序号形式分条列出主要观点,以帮助观众加深理解和记

##Initialization :
作为<Role>,严格遵守<Constrains>以<Workflow>的顺序和用户对话。

生成示例:

### 第二步:分析和理解文档

文档的主题是《Attention Is All You Need》,这是一篇关于Transformer模型的开创性论文,它提出了一种全新的基于注意力机制的神经网络架构,用于处理序列转换任务,特别是在机器翻译中的应用。

### 第三步:内容提炼

#### 章节与关键点提炼

1. **摘要(Abstract)**
   - 1.1 Transformer模型完全基于注意力机制,无需递归和卷积。
   - 1.2 在WMT 2014英德和英法翻译任务上取得新的最佳BLEU分数。
   - 1.3 证明了Transformer模型能够成功泛化到其他任务,如英语成分句法分析。

2. **引言(Introduction)**
   - 2.1 传统的RNN和LSTM在序列建模中的限制,尤其是在并行化方面。
   - 2.2 注意力机制允许模型不考虑输入或输出序列中的距离来建模依赖关系。

3. **背景(Background)**
   - 3.1 介绍了减少序列计算的目标,以及先前工作中的卷积神经网络基础模型。
   - 3.2 自注意力机制在不同任务中的成功应用。

4. **模型架构(Model Architecture)**
   - 4.1 编码器和解码器由多层自注意力和逐位置的全连接层堆叠而成。
   - 4.2 多头注意力允许模型在不同位置的不同表示子空间中并行关注信息。

5. **注意力机制(Attention)**
   - 5.1 缩放点积注意力和多头注意力的介绍。
   - 5.2 Transformer模型中注意力的三种不同应用方式。

6. **位置编码(Positional Encoding)**
   - 6.1 由于模型中没有递归或卷积,使用位置编码来注入序列顺序信息。

7. **为什么选择自注意力(Why Self-Attention)**
   - 7.1 自注意力与循环和卷积层相比,在计算复杂性、并行化能力和学习长距离依赖方面的优势。

8. **训练(Training)**
   - 8.1 描述了模型的训练数据、批处理、硬件配置和优化器设置。

9. **结果(Results)**
   - 9.1 在机器翻译任务上Transformer模型的性能和训练成本的比较。
   - 9.2 不同组件对Transformer性能的影响。

10. **结论(Conclusion)**
    - 10.1 Transformer模型在机器翻译任务上的成功和对未来应用的展望。

#### 用户确认

在进行PPT制作之前,请确认是否同意根据以上提炼的内容进行PPT设计。

### 第四步:PPT制作

#### PPT大纲

1. **封面页**
   - 标题:《Attention Is All You Need》
   - 副标题:Transformer模型及其在机器翻译中的应用

2. **摘要(Abstract)**
   - 章节:摘要
   - 详细观点描述:
     - Transformer模型摒弃了传统的循环和卷积操作。
     - 在英德和英法翻译任务上取得显著的性能提升。
     - 证明了模型在其他自然语言处理任务上的泛化能力。

3. **引言(Introduction)**
   - 章节:引言
   - 详细观点描述:
     - 传统RNN和LSTM在长序列处理中的局限性。
     - 注意力机制在序列建模中的重要性。

4. **模型架构(Model Architecture)**
   - 章节:模型架构
   - 详细观点描述:
     - 编码器和解码器的多层自注意力结构。
     - 多头注意力机制的优势。

5. **注意力机制(Attention)**
   - 章节:注意力机制
   - 详细观点描述:
     - 缩放点积注意力的计算方法。
     - 多头注意力如何使模型在不同位置关注不同信息。

6. **位置编码(Positional Encoding)**
   - 章节:位置编码
   - 详细观点描述:
     - 位置编码的必要性和实现方式。
     - 正弦余弦函数在位置编码中的应用。

7. **为什么选择自注意力(Why Self-Attention)**
   - 章节:为什么选择自注意力
   - 详细观点描述:
     - 自注意力在计算复杂性上的优势。
     - 自注意力如何促进长距离依赖的学习。

8. **训练(Training)**
   - 章节:训练
   - 详细观点描述:
     - 训练数据和批处理策略。
     - 硬件配置和优化器选择。

9. **结果(Results)**
   - 章节:结果
   - 详细观点描述:
     - Transformer模型在机器翻译任务上的性能对比。
     - 不同组件对模型性能的具体影响。

10. **结论(Conclusion)**
    - 章节:结论
    - 详细观点描述:
      - Transformer模型的总体优势和未来应用方向。
      - 对注意力机制的进一步研究和模型扩展的展望。

11. **致谢页**
    - 表达对合作者和评论者的感谢。

#### 视觉设计提示

- 使用清晰的图表和图像来展示模型架构和注意力机制。
- 使用比较图表来展示Transformer模型与其他模型的性能对比。
- 使用流程图来清晰地展示训练过程和数据批处理。
- 总结页使用列表形式明确列出主要观点。

请确认以上大纲是否满足您的需求,以便我开始PPT的具体制作。

接着回复

可以

PPT大纲生成示例:

# PPT大纲:《Attention Is All You Need》

## 封面页
- 标题:Transformer模型:开启注意力机制新篇章
- 副标题:在机器翻译与自然语言处理中的应用

## 目录页
- 摘要
- 引言
- 模型架构
- 注意力机制
- 位置编码
- 为什么选择自注意力
- 训练细节
- 实验结果
- 结论与展望
- 致谢

## 摘要页
### 摘要
- Transformer:一种全新的神经网络架构
- 无需递归和卷积,仅依赖注意力机制
- 在多任务上展现卓越的性能和泛化能力

## 引言页
### 引言:序列建模的挑战与机遇
- RNN和LSTM的限制:难以并行化处理长序列
- 注意力机制:不受序列距离限制的依赖关系建模

## 模型架构页
### 模型架构:编码器-解码器的新篇章
- 多层自注意力和逐位置全连接网络
- 多头注意力:并行处理不同位置的信息

## 注意力机制页
### 注意力机制:Transformer的内核
- 缩放点积注意力:高效的注意力计算方法
- 多头注意力:多角度并行关注信息

## 位置编码页
### 位置编码:赋予序列位置感
- 正弦余弦函数编码:解决非序列化处理的位置问题
- 位置编码与词嵌入的结合

## 为什么选择自注意力页
### 自注意力:性能与效率的平衡
- 计算复杂性:自注意力的优势
- 并行化能力:超越传统RNN的限制
- 长距离依赖学习:自注意力的天然优势

## 训练细节页
### 训练:打造高性能模型的基石
- 数据和批处理:构建有效的训练策略
- 硬件与优化器:训练效率与稳定性的保障

## 实验结果页
### 结果:Transformer的实力证明
- 机器翻译:性能与成本的双重优势
- 模型变体:探索不同配置下的最优性能

## 结论与展望页
### 结论:迎接注意力机制的未来
- Transformer模型:当前成就与未来潜力
- 扩展应用:探索文本之外的输入输出模态

## 致谢页
- 感谢合作者、评论者和支持者的贡献

---

**备注**:每一页PPT应设计有适当的图表、关键点突出、颜色和字体清晰,确保信息传达有效且吸引观众注意。总结页应简洁明了,便于观众回顾和记忆。

PPT-Ai生成:

🔗讯飞智文:https://zhiwen.xfyun.cn/

选择文本创建:

选择对应的模板配色:

生成效果:

不过这里还是推荐使用我的PPT组会模板,进行二次修改:

阅读

研究性文章:

  1. 摘要:对于引⾔、相关⼯作和⽅法的总结,⽤的都是⾮专业术语,⼤⽩话讲清楚你做了个啥玩意;
  2. 引⾔:对于相关⼯作和⽅法的更详细解释,有⼀个上下⽂的逻辑关系;
  3. 相关⼯作:领域内和你相关、相似的⼀些⼯作发展情况;
  4. ⽅法:你创新的内容和具体做法;
  5. 实验:你的⼯作的性能展示,⼀般就是对⽐试验、消融实验和案例分析;
  6. 总结:⽅法和实验部分的总结,⾔简意赅你做了什么,达到了什么程度。有些期刊还会要求⼀些⽆意义的未来展望。

文献阅读思维:


文献阅读框架通用总结提示词:

请认真阅读这篇文章,请返回以下内容:
- 论文作者:超出两位作者,仅显示两位,结尾加上, et al.
- 关键词和摘要总结
	- 关键词:
	- 摘要总结:一句话给出概要总结
- 研究设计和结论
	- 问题: 
	- 方法:
		- xx方面:xxxxx
	- 实验结果:
		- xx方面:xxxxx
- 论文贡献
	- 优点:
		- xx方面:xxxxx
	- 缺点:
		- xx方面:xxxxx

框架Markdown模板:

- 论文名称:s,2021
- 期刊:
- 影响因子:
- 论文地址:
- 论文代码:
- 论文作者:, et al.
- 关键词和摘要总结
	- 关键词:
	- 摘要总结:
- 研究设计和结论
	- 问题: 
	- 方法:
	- 实验结果:
- 论文贡献
	- 优点:
	- 缺点:

总结提示词:

请你总结这篇文章,具体要求为告诉我这篇文章的研究背景是什么,通过什么研究方法得到什么样的结论,本篇文章的创新点是什么?

深入学习某块内容提示词:

本篇文章中位置编码在文章的哪一部分,请给我定位,然后向我详细的介绍该方法,让我能够清晰的了解该方法。

写作

数据&&显卡(第二周)

数据

🔗论文:Datasets for Large Language Models: A Comprehensive Survey

预训练数据:提供通用性的能力。

  • 原因:大量的文本数据可以帮助模型更好地学习语言的语法、语义和上下文信息,从而实现对自然语言的普遍理解,此外其可增强泛化能力
  • 处理流程:
    • 数据收集:收集阶段的数据处理质量和分布直接影响模型后续的性能。
      1. 定义数据需求
      2. 选择数据源
      3. 制定收集策略
      4. 数据爬取和收集
      5. 数据提取和解析
      6. 语言检测
      7. 数据备份
    • 数据过滤:筛选和清理数据收集阶段获得的数据。
      • 目标:提高数据质量
      • 方法
        • 基于模型的方法:通过训练筛选模型来过滤低质量数据。
          • 正面样本:高质量的预训练语料库
          • 负面样本:需要过滤的污染文本
        • 基于启发式的方法:设置相应的启发式规则,有选择性地删除语料库中不需要保留的句子
          • 通过语义和标点过滤不完整的句子,评估句子的完整性
          • 移除涉及个人隐私的内容或用其他文本替换隐私信息
          • 删除与暴力、色情等有关的危害内容
          • 移除异常符号
          • 删除HTML、CSS、JavaScript等标识符。
          • 删除包含花括号的句子
          • 删除过短的句子
          • 移除冗余内容,如点赞按钮、导航栏和其他无关元素
          • 删除包含特定词语的文本
    • 数据去重:移除重复或高度相似的文本
      • 确定性去重:命中一些明确的公共子串或模板
      • 模糊去重:使用哈希算法计算文本相似性
        • MinHash:估计两个集合之间的相似性。文本通过随机哈希处理,获得一组最小哈希值。然后通过比较这些最小哈希值来估计相似性。这种方法在计算和空间上都是高效的。
        • simHash:用于计算文本相似性。文本特征向量被哈希生成固定长度的哈希码。通过比较文本哈希码之间的汉明距离来估计相似性,距离越小表示相似性越大。
    • 数据标准化:减少模型训练时的噪声,提高语言模型的准确性和效率
      • 句子分割:对提取的文本进行句子分割。
        • 中文文本使用简单的正则表达式进行分割。
        • 其他文本则使用NLTK工具包的句子标记化模块。
      • 简化中文:将所有繁体中文字符转换为简体中文。
      • 拼写校正:使用现成的训练模型来执行文本的拼写校正。
      • 移除停用词:移除通常缺乏实质性信息价值的高频词。此外,中文文本中的空格或者我和他等主观次没有意义。
  • 常见大模型的数据分布:

指令微调数据:指令微调数据集由一系列文本对组成,包括"指令输入"和"答案输出"。"指令输入"代表人类对模型提出的请求,包括分类、摘要、改述等多种类型。"答案输出"是模型遵循指令后生成的响应,符合人类的期望。

  • 类别:
    • 推理:从已知前提推导出新的判断涉及逻辑推理和做出推断性假设包括链式思考(CoT)、类比推理、归纳推理等过程。
    • 数学:指令包含数学计算或数学推理。可以根据难度级别进行分类
    • 头脑风暴:围绕特定主题产生新想法,提出创新方法。答案通常以项目符号格式提供。提供建议、给出推荐以及类似需求都属于头脑风暴
    • 封闭式问答:根据提供的提示和问题选择正确的选项,或者直接或间接地从提供的文字信息中获得答案。
    • 开放式问答:开放式问答指令的问题没有选项,并且答案不能直接在问题中找到。必须依靠自己的知识库来制定回答。这些问题可以包括有标准答案的常识查询或没有预定义解决方案的开放式询问。
    • 代码:涉及代码的问题,包括但不限于代码生成、代码修正和代码理解。
    • 提取:从给定内容中提取关键信息,包括命名实体识别(NER)、关系提取(RE)、事件提取等。
    • 生成:生成原始内容,如根据问题的要求创作广告文案或文章。获取答案涉及从头开始创造某物的过程。
    • 改写:根据要求处理文本,包括词语转换、风格转换、文本排序、文本简化和扩展、上下文改写、句子改写、文本校正等。
    • 摘要:概括和压缩文本内容,或将内容提炼成标题。在摘要时可以应用特定限制。
    • 分类:根据指定要求对信息进行分类或评级,如主题分类、质量评分等。
    • ·翻译:不同语言之间的翻译,包括各种民族语言之间的翻译,以及简体和繁体中文之间的翻译、方言翻译、文言文翻译等。
    • 角色扮演:让模型扮演某个角色以完成任务。它可以扮演传统的角色如专家、名人,或非传统角色,如疯子、动物、编译器等。
    • 社会规范:社会规范指令指的是道德和伦理问题、个人隐私、偏见歧视等。要求是提供符合安全规范并符合人类价值观的答案。
    • 其他:这个类别可以涉及指示模型使用搜索引擎进行实时信息检索或者提供不合逻辑的指令,如"向右转"或"重复我说的话"
  • 构建指令微调数据集:
    • 类别

      • 人工生成的数据集
        • 方式
          • 直接由公司员工、志愿者、注释平台人员等根据给定的要求和规则创建指令文本集
          • 从网页上收集人为生成的真实问答数据,并将其标准化为指令格式
        • 优点
          • 高质量:数据集经过专业注释者的处理和审查,结果质量更高,更纯净
          • 可解释性:经过人工处理后,数据集更易于解释,并且与人类理解很好地吻合。
          • 灵活控制:研究人员对训练样本有灵活的控制权,允许根据不同任务进行调整。
        • 缺点
          • 高成本和低效率:创建人为生成的数据集需要大量的人力和时间投入与模型构建的替代方案相比,效率较低。
          • 主观性:人类的主观判断可能会向数据集中引入偏见和不一致性。
      • 模型构建的数据集
        • 方式
          • 引导LLM输出符合预期的指令:通常,LLM被赋予某种身份 (例如,专家问题设置者) ,以及指令生成的要求和示例。这允许模型在回答问题或生成新的指令样本时遵循规则。
          • 使用人类和LLM之间的真实互动对话作为指令数据集。
          • 使用多个LLM代理进行对话以获得对话数据。
        • 优点
          • 数据丰富。LLMs能够生成大量的指令,特别是对于在现实世界场景中不常出现的内容。
          • 成本效益高且高效。它减少了人力成本和时间,能够在短时间内获得大量数据。
        • 缺点
          • 质量不一。生成内容的质量可能并不总是很高。模型可能产生幻觉导致指令不准确或不适当。同时,模型本身可能存在固有偏见,其输出可能不一定符合人类价值观。
      • 使用多种混合方法创建的数据集
        • 优点
          • 多样性和全面性:生成的数据集具有丰富的数据来源、多样化的任务类型和广泛的领域覆盖。
          • 大规模:选择的数据集越多,规模就越大
          • 节省时间:它减少了数据集构建所需的时间
        • 缺点
          • 质量和格式标准化:有必要全面考虑源数据集的质量并标准化数据的格式。
          • 数据集许可证:重要的是要注意不同源数据集的许可证,以避免隐私和法规问题。
      • 现有数据集的收集和改进
    • 领域微调数据集:医疗、代码、法律、数学、教育、其他(金融、地球科学、心理健康、生物学、信息技术、社会规范、交通)

    • 常见微调的数据集格式

      • ShareGPT格式
      • Alpaca格式
      • Vicuna格式

偏好数据:用于大型模型的对齐阶段,目的是帮助将模型的输出与人类的偏好和期望更加紧密地对齐。

  • 与人类偏好的对齐
    • 实用性:具备遵循指令的能力;
    • 诚实性:避免编造;
    • 安全性:避免生成非法或有害的信息
  • 偏好数据集中的反馈信息通常通过投票、排序、评分或其他形式的比较来体现
    • 投票(Voting):在这种方法中,一组人类评估者或模型对一系列选项进行投票,以确定最符合偏好的结果。这种方法简单直接,但可能受到群体动态的影响。
    • 排序(Sorting):评估者或模型需要对一系列结果进行排序,从最偏好到最不偏好。排序能够提供偏好的相对顺序,但可能难以处理具有相同偏好级别的多个选项。
    • 打分(Scoring):每个选项根据一个或多个标准被赋予一个数值分数打分方法可以提供量化的偏好度量,便于比较和分析。
    • 其他方法(Other):可能包括开放式反馈、定性分析、情景模拟等,这些方法可以提供更丰富的数据,但通常需要更复杂的数据处理和分析技术。

评估数据集:一组经过精心策划和注释的数据样本,用于评估LLM在各种任务上的表现。

  • 评估任务
  • 评估方法
    • 代码评估:涉及从大型语言模型(LLMs) 中提取响应,并使用代码来统计计算预定的评估指标。因此通过这些指标的数值来衡量LLMs的有效性。突出的评估指标包括准确率、F1分数、BLEU(Papineni等人,2002年)、ROUGE(Lin,2004年)、精确匹配60皮尔相关系数61等某些评估数据集不仅提供自定义计算方法,还提供相关代码,便于直接应用于LLMs性能的评估和分析。这种评估方法通常用于客观问题和具有预定义答案的简单主观问题,如基础知识查询和翻译练习。虽然其简单性是有益的,但对于评估开放式主观问题(如涉及生成和头脑风暴的问题)可能效果不佳
    • 人类评估:通常涉及由众包个体、训练有素的志愿者、具有相关专业知识的学生或专家小组评估LLM输出。评估方法包括质量评分、质量比较评估和类似技术。这种手动评估方法是多功能的,适用于各种问题类型,特别是开放式主观询问和缺乏标准答案的复杂问题。然而,其局限性在于成本高昂,需要大量的人力资源,并且可能存在主观偏见。
    • 模型评估:强调选择当前性能高的LLMs,并提供合适的评估指令。它的优势在于能够替代大量的人工努力,从而实现更快的评估过程。然而,局限性在于依赖于LLMs的性能,并且可能不总是与人类的价值观和判断相符。

🔗常用数据集搜集:https://paperswithcode.com/datasets

显卡

  • 介绍:显卡又称显示卡( Video card),承担输出显示图形的任务,它起到桥梁的作用,将CPU通过主板发送的显示信息转化成能够让显示器直接显示的信号,我们可以将其作用理解为帮助电脑"显示输出图形"的设备,他只负责图像处理。
  • 分类
    • 集成显卡:将显示芯片、显存及其相关电路都集成在主板上,与其融为一体的元件。
    • 独立显卡:将显示芯片、显存及其相关电路单独做在一块电路板上,自成一体而作为一块独立的板卡存在。
    • 核芯显卡:Intel产品新一代图形处理核心,和以往的显卡设计不同,Intel 凭借其在处理器制程上的先进工艺以及新的架构设计,将图形核心与处理核心整合在同一块基板上,构成一个完整的处理器。
  • 显卡公司:AMD(超威半导体)、Intel(因特尔)、Nvidia(英伟达)
    • AMD显卡:俗称A卡
      • 背景:最早A卡并不是AMD的而是ATI的,ATI在2006年被AMD以54亿美元的巨资收购了,成为了AMD的一部分,此后AMD宣布放弃ATI品牌,将旗下所以显卡都统一更名为AMD。
      • 分类
        • 前缀:RX(近几年)、R9(高端),R7(中端),R5、R3(低端)、HD(很早之前的)
          • 例如:RX580、RX5700、RX6900
        • 中间数字:RX580就表示第5代,这个数字越大越好。后面的数字也是越大越好;
          • 例如:RX580性能高于RX570,RX570性能高于RX550。
        • 后缀:X表示完整核心,X2表示双芯片,XT表示超级版,XT PRO表示加强版,D表示核心阉割
          • 例如: R9 295 X2
      • 评价:不如Nvidia对于AI生态的适应,追求性价比选A卡
    • Nvidia显卡:俗称N卡
      • 背景:英伟达(NVIDIA)是美国一家专业的计算机图形芯片制造商,英伟达显卡市场份额占据全球第一的位置,英伟达的显卡产品系列涵盖GeForce、Quadro、Tesla、NVS、GRID等,满足不同领域的应用需求。
      • 分类:
        • GeForce显卡:
          • 功能:用于高性价比的家庭娱乐,比如游戏、影音、图形设计等
          • 型号:GTX1050、GTX1050ti、GTX1060、GTX1070、GTX1080、GTX1080ti、RTX2060、RTX2070、RTX2080、RTX2080ti、RTX3080(90)、RTX4080(90)等。
        • Quadro显卡:
          • 功能:针对设计、建模、视觉分析等专业领域,其优势在于高计算性能、低功耗、低延迟等,无论是专业的设计师还是专业的游戏玩家都可以通过Quadro显卡体验更好的绘图流畅度。
          • 型号:Quadro K620、Quadro K1200、Quadro K2200、Quadro K4000、Quadro K4200、Quadro K5000、Quadro K5200、Quadro P400、Quadro P600、Quadro P1000、Quadro P2000、Quadro P4000、Quadro P5000、Quadro P6000等。
        • Tesla显卡:
          • 功能:用于超级计算机的深度学习,比如图像处理、语音识别、机器学习、物体检测等,相比GeForce显卡的性能更加强悍,可以支持更高的计算速度。
          • 型号:NVS 310、NVS 315、NVS 510、NVS 810、NVS 510M、NVS 810M等。
        • NVS显卡:
          • 功能:用于多显示器的驱动,比如工程设计、金融分析、智能展示等,可以支持多达8个显示器的显示,而且支持4K分辨率,支持三明治拼接等,可以满足多显示器的高端需求。
          • 型号:NVS 310、NVS 315、NVS 510、NVS 810、NVS 510M、NVS 810M等。
        • GRID显卡:
          • 功能:针对虚拟化技术而设计的,可以支持虚拟桌面、虚拟机器学习等,可以支持多个用户同时访问一台服务器,而且支持虚拟桌面可以支持多屏显示,可以满足大规模的虚拟化部署。
          • 型号:GRID K1、GRID K2、GRID M60-1Q、GRID M60-2Q等。
      • 评价:搞AI选N卡,性能好、稳定、有光追。
  • 🔗显卡天梯榜(实时更新):https://topic.expreview.com/GPU
  • 显卡牌子:华硕、微星、技嘉、七彩虹、影驰、索泰、蓝宝石(即采用了英伟达或者AMD显示芯片的显卡)
  • 结构:
    • 电容:电容是显卡中非常重要的组成部件,因为显示画质的优劣主要取决于电容的质量,而电容的好坏直接影响到显卡电路的质襞。
    • 显存:显存负责存储显示芯片需要处理的各种数据,其容量的大小,性能的高低,直接影响着电脑的显示效果。新显卡均采用DDR6/DDR5的显存, 主流显存容量一般为2GB ~ 4GB。
    • GPU及风扇:GPU即显卡芯片,它负责显卡绝大部分的计算工作,相当于CPU在电脑中的作用。GPU风扇的作用是给GPU散热。
    • 显卡接口:通常被叫做金手指,可分为PCI、 AGP和PCI Express三种,PCI和AGP显卡接口都基本被淘汰, 市面上主流显卡采用PCI Express的显卡。
    • 外设接口:显卡外设接口担负着显卡的输出任务,新显卡包括一个传统VGA模拟接口和一个或多个数字接口(DVI、HDMI和DP)。
    • 桥接接口:中高端显卡可支持多块同时工作,它们之间就是通过桥接器连接桥接口。
  • 性能指标
    • 显卡频率
      • 核心频率:显示核心的工作频率
      • 显存频率:显存的速度
    • 显示存储器(显存):暂时储存显示芯片处理过或即将提取的渲染数据,类似于主板的内存
      • 显存类型:显卡存储器采用的存储技术类型
      • 显存位宽:一次可以读入的数据量,即表示显存与显示芯片之间交换数据的速度
    • 流处理器单元:在DX10时代首次提出了"统一渲染架构",显卡取消了传统的"像素管线"和"顶点管线",统一改为流处理器单元,它既可以进行顶点运算也可以进行像素运算,这样在不同的场景中,显卡就可以动态地分配进行顶点运算和像素运算的流处理器数量,达到资源的充分利用。

语言模型(第三、四周)

基础概念

  • Baseline:比较算法好坏中作为"参照物"而存在,在比较中作为基线;目的是比较提出算法的性能或者用以彰显所提出的算法的优势;
    • Baseline Model(基准模型):在前人的模型基础上新增加了一些组件,别人也基本都是在这个模型上进行修改,那这个模型就叫做基准模型【因为基准模型是地基,必须越牢固越好,因此我们强调必须得通过近两年的顶刊顶会找,⽽且越新越好。】
  • Benchmark:评价算法好坏的一种规则和标准,即目前的模型能做到的比较好的效果;
  • SOTA(State-of-the-Art):业界顶尖水平,用于描述某领域中取得某个任务上当前最优效果的模型。
  • Checkpoint:模型训练过程中保存的模型状态。这些检查点通常包括模型的参数(权重和偏置)、优化器状态和其他相关的训练信息。通过保存检查点,您可以在训练过程中定期保存模型的当前状态,以便在需要时恢复训练或用于模型评估和推理。
  • 版本模型:
    • Base版本模型:是模型的标准版本,提供了模型的基本架构和参数配置。训练数据通常来自于大规模的文本语料库,例如互联网上的网页、书籍、新闻文章等。这些数据被用于训练模型,以学习语言的统计规律和语义表示。
    • Chat版本模型:是专门为对话和交互式任务优化的模型版本。训练数据可能会包括更多的对话文本,例如聊天记录、问答对、社交媒体上的对话等。此外,Chat版本模型的训练数据可能还会经过筛选和预处理,以确保数据的质量和相关性。
    • 4Bit版本模型:是通过模型量化技术实现的,其中模型的权重和激活函数的精度从通常的32位浮点数减少到4位。这种量化可以显著减少模型的大小和推理时的计算需求。4Bit版本模型的训练数据与Base版本模型类似,但在训练过程中可能会采用一些特殊的技术和算法,以适应量化带来的精度损失。
  • 消融实验(Ablation Study):用于确定一个条件或参数对结果的影响程度。当研究者提出了一个新的方案或方法时,消融实验通过逐一控制一个条件或参数,来观察结果的变化,以确定哪个条件或参数对结果的影响更大。
    • 针对可以去除的部分/模块/选项,可以采用去除的方式来设计实验;
    • 针对不可以去除的变量/超参数等,可以采用Grid Search等方法来展示参数对于系统的影响
      • Grid Search:一种调优方法,在参数列表中进行穷举搜索,对每种情况进行训练,找到最优的参数

Embedding

🚩问题:在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等。这些特征值并不是连续的,而是离散的,无序的。通常我们需要对其进行特征数字化

🚩特征数字化:将分类变量(或称为离散特征、无序特征)转换为一种适合机器学习算法处理的格式。

🚩独热(One-Hot)编码:又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。例如:猫的编码是 [1, 0, 0, 0],狗的编码是 [0, 1, 0, 0],乌龟的编码是 [0, 0, 1, 0],鱼的编码是 [0, 0, 0, 1]

One-Hot编码的优点:

  • 解决分类数据处理问题【特征数字化】:独热编码将离散分类特征转换为机器学习算法易于处理的二进制格式,提高了算法对离散特征的处理能力。
  • 避免引入数值偏误:通过将每个类别映射到独立的二进制向量,独热编码消除了类别间可能存在的错误数值关系,从而避免了算法基于这些关系做出不准确的预测。

One-Hot编码存在的问题:

  • 大量为 0 的稀疏矩阵;
  • 硬编码,特征没有语义信息;【任意两者向量的相似度结果都为 0,即任意二者都不相关,也就是说独热表示无法解决词之间的相似性问题】
  • 特征维度较高,且每个特征都彼此独立,训练所需要的数据量高,容易导致维度灾难;

🚩Embedding:用一个低维稠密向量来表示一个对象,使得这个向量能够表达相应对象的某些特征,同时向量之间的距离能反应对象之间的相似性。------王喆《深度学习推荐系统》【离散实例连续化的映射】

  • Image Embedding(图像嵌入)
    • 定义与目的:图像嵌入是将图像转换为低维向量,以简化处理并保留关键信息供机器学习使用。
    • 方法与技术:利用深度学习模型(如CNN)抽取图像特征,通过降维技术映射到低维空间,训练优化嵌入向量。
    • 应用与优势:图像嵌入广泛应用于图像分类、检索等任务,提升模型性能,降低计算需求,增强泛化能力。
  • Word Embedding(词嵌入):
    • 定义与目的:词嵌入是将单词映射为数值向量,以捕捉单词间的语义和句法关系,为自然语言处理任务提供有效的特征表示。
    • 方法与技术:词嵌入通过预测单词上下文(如Word2Vec)或全局词频统计(如GloVe)来学习,也可使用深度神经网络捕捉更复杂的语言特征。
    • 应用与优势:词嵌入广泛应用于文本分类、机器翻译等自然语言处理任务,有效提升模型性能,因其能捕捉语义信息和缓解词汇鸿沟问题。

Tokenilzer

  • 介绍:即分词器,是一种将文本拆分成一系列词汇单元(Token)的工具。
  • 原因:模型对语言结构一无所知,因此我们需要在将其输入模型之前将其分成块或标记。
  • 目标:在NLP中,Token可以是一个单词、一个字符或者一个子词。Tokenizer的作用就是将连续的文本切分成这些离散的Token,并为每个Token分配一个唯一的标识符(ID),以便于模型进行后续的处理。
  • 分词粒度
    • 单词级别
      • 例句:he is likely to be unfriendly to me
      • 分词:['he', 'is', 'likely', 'to', 'be', 'unfriendly', 'to', 'me']
    • 字符级别
      • 例如:he is likely to be unfriendly to me
      • 分词:['h', 'e', 'i', 's', 'l', 'i', 'k', 'e', 'l', 'y', 't', 'o', 'b', 'e', 'u', 'n', 'f', 'r', 'i', 'e', 'n', 'd', 'l', 'y', 't', 'o', 'm', 'e']
    • 子词级别:
      • 例句:he is likely to be unfriendly to me
      • 分词:['he', 'is', 'like', 'ly', 'to', 'be', 'un', 'friend', 'ly', 'to', 'me']
  • 算法
    • WordPiece
    • BPE(Byte-Pair Encoding)
    • BBPE(Byte-level BPE)
    • ULM(Unigram Language Model)
    • SentencePiece

RNN

  • 贡献:解决了短距离的时序依赖问题。与传统神经网络相比,每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练。即RNN前面所有的输入都会对未来的输出产生影响。
  • 存在问题:远距离的梯度消失,不适合长距离依赖;无法并行训练,导致训练成本较高;

LSTM

  • Forget Gate(遗忘门):
  • Input Gate(输入门):
  • Cell State(细胞状态):
  • OutPut Gate(输出门):

贡献:一定程度上解决梯度消失和梯度爆炸的问题

为什么采用tanh函数?

  • Sigmoid函数比Tanh函数收敛饱和速度慢、值域范围更窄
  • tanh的均值是0,Sigmoid均值在0.5左右,均值在0的数据显然更便于数据处理
  • tanh的函数变化敏感区间更大
  • 对两者求导,发现tanh对计算的压力更小,直接是1-原函数的平方,不需要指数操作

Attention

Attention

  • 大白话理解Attention(注意力):从关注全部到关注重点。从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,忽略不重要的信息。
  • 理解过程:
    • 1)计算比较 Q 和 K 的相似度
    • 2)将得到的相似度进行 softmax 操作,进行归一化
    • 3)针对计算出来的权重 α i {α_i} αi,对 V 中的所有 values 进行加权求和计算,得到 Attention 向量
  • 贡献:Attention机制可以更加好的解决序列长距离依赖问题,并且具有并行计算能力

Self-Attention

  • 大白话理解作用:假设有一句话:The animal didn't cross the street because it was too tired,Self Attention机制能够让模型把it和animal关联起来
  • 大白话理解过程:
    • 1)计算Query 向量,Key 向量,Value 向量
    • 2)计算Attention Score(注意力分数):例如"Thinking" 的 Attention Score,通过计算 "Thinking" 对应的 Query 向量其他位置的每个词的 Key 向量点积
    • 3)把每个分数除以 d k \sqrt{d_k} dk : d k {d_k} dk是Key向量的长度,保证在反向传播时,求取梯度更加稳定
    • 4)通过Softmax归一化,使得分数都是正数并且加起来等于1,这些分数决定了在编码当前位置的词所有位置的词分别有多少的注意力
    • 5)把上一步得到的向量全部相加
  • 理解矩阵运算:
    • 1)计算 Query,Key,Value 的矩阵:把所有词向量放到一个矩阵X,分别和3个权重矩阵 W Q W^Q WQ、 W K W^K WK、 W V W^V WV相乘,得到Q、K、V矩阵。矩阵 X 中的每一行,表示句子中的每一个词的词向量,长度是 512。Q,K,V 矩阵中的每一行表示 Query 向量,Key 向量,Value 向量,向量长度是 64。
    • 2)计算Self Attention:

Masked Self Attention:

  • 理解意思:mask就是沿着对角线把灰色的区域用0覆盖掉,不给模型看到未来的信息
  • 理解过程:
    • 1)通过将Query向量乘以Key矩阵来计算注意力分数:
    • 2)加上一个mask矩阵(上三角形矩阵)屏蔽掉当前还未输入的词,一般是将我们想要屏蔽的位置设置为−∞或一个非常大的负数
    • 3)对每一行进行softmax:

Transformer

🔗推荐教程:https://jalammar.github.io/illustrated-transformer

🔗Paper:Attention Is All You Need

Positional Encoding(位置编码):

  • 引入原因:Self Attention 的 Q、K、V 三个矩阵是由同一个输入 X 1 = ( x 1 , x 2 , . . . , x n ) {X_1=(x_1, x_2, ... , x_n)} X1=(x1,x2,...,xn)线性转换而来,也就是说对于这样的一个被打乱序列顺序的 X 2 = ( x 2 , x 1 , . . . , x n ) {X_2=(x_2, x_1, ... , x_n)} X2=(x2,x1,...,xn)而言,由于 Attention 值的计算最终会被加权求和,也就是说两者最终计算的 Attention 值都是一样的
  • 位置编码分类:
    • 绝对位置编码:给每个位置的位置信息建模。假如模型最大序列长度为 512,那么预测阶段输入超过 512 的序列就无法进行处理
    • 相对位置编码:没有完整建模每个输入的位置信息,而是在计算Attention的时候考虑当前位置与被Attention的位置的相对距离
    • 自定义位置编码:例如LLaMA的旋转位置编码,兼顾了绝对位置信息与相对位置信息
  • 公式: PE是Positional Encoding的缩写,其中pos表示位置,i表示维度, d m o d e l d_{model} dmodel表示位置向量的向量维度,2i、2i+1表示奇偶数
    • X的词向量为 X f i n a l e m b e d d i n g = E m b e d d i n g + P o s i t i o n a l E m b e d d i n g X_{final_embedding} = Embedding + PositionalEmbedding Xfinalembedding=Embedding+PositionalEmbedding
    • 某个单词的位置信息是其他单词位置信息的线性组合,这种线性组合就意味着位置向量中蕴含了相对位置信息。

Multi-head Attention(多头注意力机制):

  • 多头的理解:将线性变换之后的QKV切分为H份,然后对每一份进行后续的self-attention操作。即将高维向量拆分成了H个低维向量,在H个低维空间里求解各自的self-attention
    • 赋予 attention 层多个"子表示空间";
    • 扩展了模型关注不同位置的能力;

Add & Norm:

  • Add是一种残差连接,用于缓解梯度消失,这一概念在ResNet中被提出:
  • Add的结果经过LN进行层归一化:

概念区分Normalization

  • Batch-Normalization:每一层的输出归一化成均值为0,方差为1的分布。这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度
    • BN用于激活层之前
    • BN的目的:将数据规整到统一区间,减少数据的发散程度,降低网络的学习难度。BN的精髓在于归一化之后,使用可训练γ、β作为还原函数,在一定程度上保留原数据的分布,让模型在训练过程通过调整γ、β来决定保留原数据分布的程度。
  • Layer-Normalization:LN 针对单个训练样本进行,不依赖于其他数据,因此可以避免 BN 中受 mini-batch 数据分布影响的问题,可以用于小 mini-batch 场景、动态网络场景和 RNN,特别是自然语言处理领域。
    • LN 不需要保存 mini-batch 的均值和方差,节省了额外的存储空间。

Feed Forward:

  • Feed Forward 层是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数:
  • Feed Forward 结果再次经过Add&Norm后,就得到了Encoder的输出:

Decoder(解码器):

  • 在解码器里,Self Attention 层只允许关注到输出序列中早于当前位置之前的单词
  • Encoder-Decoder Attention层是使用前一层的输出来构造 Query 矩阵,而 Key 矩阵和 Value 矩阵来自于解码器最终的输出

最后的线性层和 Softmax 层:

  • Decoder最终的输出:一个向量,其中每个元素是浮点数。
  • 线性层:一个普通的全连接神经网络,可以把解码器输出的向量,映射到一个更长的向量,这个向量称为 logits 向量。例如有 10000 个英语单词, logits 向量就会有 10000 个数字,每个数表示一个单词的分数
  • Softmax 层:把这些分数转换为概率(把所有的分数转换为正数,并且加起来等于 1),选择最高概率的那个数字对应的词。

Bert

Bert

🔗Paper:Pre-training of Deep Bidirectional Transformers for Language Understanding

  • Pre-training:通过大量数据预训练得到通用模型,后续基于通用模型进行微调。
  • Deep:BERT-base采用12层Encoder,层数更深。
  • Bidirectional:通过MLM任务实现上下文理解。
  • Transformer:基于Transformer的Encoder。
  • Language Understanding:Bert 是一个语言模型,通过深层双向Encoder实现语义理解。
  • Self-supervised Learning:通过设计合理的训练任务,实现使用大量无监督数据进行训练。

BERT之预训练任务

  • MLM(Masked Language Model):语言掩码模型
    • 定义:在每一个训练序列中以15%的概率(在CBOW 模型中,每个词都会被预测一遍)随机地选中某个token进行MASK,当一个token被选中后,在对该位置的MASK进行预测。token有以下三种处理方式:
      • 80%的概率被[MASK]。如my dog is hairy--->my dog is [MASK]
      • 10%的概率修改为随机的其他token。如my dog is hairy--->my dog is apple【该做法是为了缓解训练文本和预测文本的偏差带来的性能损失】
      • 10%的概率不变。如my dog is hairy--->my dog is hairy【该做法是为了让 BERT 学会根据上下文信息自动纠错】
    • 好处:
      • 编码器不知道哪些词需要预测的,哪些词是错误的,因此被迫需要学习每一个 token 的表示向量
      • 双向编码器比单项编码器训练要慢,但MLM 训练方法可以让 BERT 获得超出同期所有预训练语言模型的语义理解能力,牺牲训练效率是值得的。
  • NSP(Next Sentence Prediction):下句预测
    • 定义:BERT 输入的语句将由两个句子构成,把训练样例输入到BERT模型中,用[CLS]对应的信息去进行二分类。其中 [SEP] 标签表示分隔符; [CLS] 表示标签用于类别预测,结果为 1,表示输入为连续句对;结果为 0,表示输入为随机句对
      • 50%的概率保持原有顺序(标注为IsNext),如:[CLS]今天天气很糟糕[SEP]下午的体育课取消了[SEP]
      • 50%的概率后面的句子被替换为文档的其他随机句B(标注为NotNext),如:[CLS]今天天气很糟糕[SEP]鱼快被烤焦啦[SEP]
    • 好处:可以捕捉句子之间的语义联系

经过上面两个任务的处理,训练数据如下所示:

Input1=[CLS] 我 今 天 要 [MASK] 课 [SEP] 上完 [MASK] 给 你 打 电 话 [SEP]
Label1=IsNext

Input2=[CLS] 大 模 型 [MASK] 术 发 展 很 快[SEP] 晚 [MASK] 吃 什 么 [SEP]
Label2=NotNext

Bert之输入

  • Token Embeddings:采用look up的方式,将每个token转换成768维的向量。
  • Segment Embeddings:BERT支持双句输入,Segment(0,1)用于区分a、b句。
  • Position Embeddings:采用训练式位置编码,通过look up获取位置编码。

BERT之Encoder

BERT-base:采用12层Transformer Encoder堆叠,上一层的输出作为下一层的输入。

  • layers=12
  • max_len=512
  • dim=768
  • Head=12
  • param=110M

Bert之Finetune(下游任务改造)

  • 句对分类任务:给定两个句子,判断它们的关系。如:两句是否相似,后者是否为前者的答案。
    • 句对用 [SEP] 分隔符拼接成文本序列,在句首加入标签 [CLS],将句首标签所对应的输出值作为分类标签,计算预测分类标签与真实分类标签的交叉熵,将其作为优化目标,在任务数据上进行微调训练。
      • 二分类任务:直接使用与 NSP 训练方法一样的输入和输出结构。
      • 多分类任务:需要在句首标签 [CLS] 的输出特征向量后接一个全连接层和 Softmax 层,保证输出维数与类别数目一致,最后通过 arg max 操作(取最大值时对应的索引序号)得到相对应的类别结果。
    • 示例:句对分相似性任务
      • 任务:判断句子 "我很喜欢你" 和句子 "我很中意你" 是否相似
      • 输入改写:"[CLS]我很喜欢你[SEP]我很中意你"
      • 取 "[CLS]" 标签对应输出:[0.02, 0.98]
      • 通过 arg max 操作得到相似类别为 1(类别索引从 0 开始),即两个句子相似
  • 单句分类任务:给定一个句子,判断该句子的类别。如:判断情感类别、判断是否语义连贯。
    • 在句首加入标签 [CLS],将句首标签所对应的输出值作为分类标签,计算预测分类标签与真实分类标签的交叉熵,将其作为优化目标,在任务数据上进行微调训练。
      • 二分类任务:直接使用与 NSP 训练方法一样的输入和输出结构。
      • 多分类任务:需要在句首标签 [CLS] 的输出特征向量后接一个全连接层和 Softmax 层,保证输出维数与类别数目一致,最后通过 arg max 操作(取最大值时对应的索引序号)得到相对应的类别结果。
    • 示例:语义连贯性判断任务
      • 任务:判断句子"海大球星饭茶吃" 是否为一句话
      • 输入改写:"[CLS]海大球星饭茶吃"
      • 取 "[CLS]" 标签对应输出:[0.99, 0.01]
      • 通过 arg max 操作得到相似类别为 0,即这个句子不是一个语义连贯的句子
  • QA任务(文本问答):给定一个问句和一个蕴含答案的句子,找出答案在后句中的位置,例如:给定一个问题(句子 A),在给定的段落(句子 B)中标注答案的起始位置和终止位置。
    • BERT引入了两个辅助向量 s(start,判断答案的起始位置) 和 e(end,判断答案的终止位置)。以判断句子 B 中答案位置为例:
      • 将句子 B 中的每一个词得到的最终特征向量 T i ′ T_{i}^{′} Ti′经过全连接层(利用全连接层将词的抽象语义特征转化为任务指向的特征)
      • 分别与向量 s 和 e 求内积,对所有内积分别进行 softmax 操作,即可得到词Tok m(m∈[1,M])作为答案其实位置和终止位置的概率。
      • 取概率最大的片段作为最终的答案。
    • 技巧:
      • 用全连接层把 BERT 提取后的深层特征向量转化为用于判断答案位置的特征向量
      • 引入辅助向量 s 和 e 作为答案其实位置和终止位置的基准向量,明确优化目标的方向和度量方法
    • 示例:文本问答任务
      • 任务:给定问句 "今天的最高温度是多少",在文本 "天气预报显示今天最高温度 37 摄氏度" 中标注答案的起始位置和终止位置
      • 输入改写:"[CLS]今天的最高温度是多少[SEP]天气预报显示今天最高温度 37 摄氏度"
      • Softmax 结果:
      • 对 Softmax 的结果取 arg max,得到答案的起始位置为 6,终止位置为 7,即答案为 "37 摄氏度"
  • 单句标注任务:给定一个句子,标注每个词的标签
    • 在每个词的最终语义特征向量之后添加全连接层,将语义特征转化为序列标注任务所需的特征,单句标注任务需要对每个词都做标注,因此不需要引入辅助向量,直接对经过全连接层后的结果做 Softmax 操作,即可得到各类标签的概率分布
    • 预测结果分为5 大类(IOBES),这是序列标注最常用的标注方法:
      • O(非人名地名机构名,O 表示 Other)
      • B-PER/LOC/ORG(人名/地名/机构名初始单词,B 表示 Begin)
      • I-PER/LOC/ORG(人名/地名/机构名中间单词,I 表示 Intermediate)
      • E-PER/LOC/ORG(人名/地名/机构名终止单词,E 表示 End)
      • S-PER/LOC/ORG(人名/地名/机构名独立单词,S 表示 Single)
    • 示例:命名实体识别(NER:Named Entity Recognition)任务
      • 任务:给定句子 "爱因斯坦在柏林发表演讲",根据 IOBES 标注 NER 结果
      • 输入改写:"[CLS]爱 因 斯坦 在 柏林 发表 演讲"
      • Softmax 结果:
      • 对 Softmax 的结果取 arg max,得到最终地 NER 标注结果为:"爱因斯坦" 是人名;"柏林" 是地名

RoBERTa

  • 论文名称:RoBERTa:A Robustly Optimized BERT Pretraining Approach(强力优化的BERT方法)
  • 论文地址:https://arxiv.org/abs/1907.11692
  • 论文代码:https://github.com/pytorch/fairseq
  • 作者:Yinhan Liu 、Myle Ott, et al.
  • 改进:
    • 模型规模、算力和数据:
      • 更大的模型参数量(模型使用 1024 块 V100 GPU 训练了 1 天的时间)
      • 更大的batch_size(batch_size 256 -> batch_size 8K)
      • 更多的训练数据(16GB -> 160GB)
        • 最初的BERT使用16GB BookCorpus数据集和英语维基百科进行训练
        • RoBERTa采用 160 G 训练文本
          • BOOKCORPUS 和英文维基百科:原始 BERT 的训练集,大小 16GB。
          • CC-NEWS:包含2016年9月到2019年2月爬取的6300万篇英文新闻,大小 76 GB(经过过滤之后)。
          • OPENWEBTEXT:从 Reddit 上共享的 URL (至少3个点赞)中提取的网页内容,大小 38 GB 。
          • STORIES:CommonCrawl 数据集的一个子集,包含 Winograd 模式的故事风格,大小 31GB 。
    • 训练方法:
      • 舍弃NSP任务,并使用更长的序列长度;
      • 采用动态掩码。在模型训练阶段实时计算掩码的位置和方法,能够最大限度的保证同一段文本在不同epoch下使用不同的掩码模式,提高了数据的复用效率。
        • 原本的BERT采用的是static mask的方式,就是在准备训练数据时,先对数据进行提前的mask
        • 为了避免在每个epoch中使用相同的mask数据,充分利用数据,RoBERTa定义了dupe_factor,这样可以将训练数据复制dupe_factor份,然后同一条数据可以有不同的mask。注意这些数据不是全部都喂给同一个epoch,是不同的epoch,例如dupe_factor=10, epoch=40,则每种mask的方式在训练中会被使用4次
      • 使用更大的词表(30K -> 50K):Byte-Pair Encoding(BPE)是字符级和词级别表征的混合,支持处理自然语言语料库中的众多常见词汇。
        • 原版的 BERT 实现使用字符级别的 BPE 词汇,大小为 30K,是在利用启发式分词规则对输入进行预处理之后学得的。
        • RoBERTa采用了更大的 byte 级别 BPE 词汇表来训练 ,这一词汇表包含 50K 的 subword 单元,且没有对输入作任何额外的预处理或分词。
  • 贡献:通过更长时间地训练模型,在更多数据上使用更大的批次,移除下一句预测目标,训练更长的序列, 并动态更改应用于训练数据的屏蔽模式可以显着提高性能

ALBERT

  • 论文名称:ALBERT:A Lite BERT for Self-supervised Learning of Language Representations
  • 论文地址:https://arxiv.org/abs/1909.11942
  • 论文代码:https://github.com/google-research/albert
  • 作者:Zhenzhong Lan, Mingda Chen, et al.
  • 改进
    • 词向量因式分解。BERT中 embedding 维度 E 与 Transformer 隐层维度 H一致,ALBERT 引入词向量因式分解方法解耦E和H,先将词向量编码到低维空间E,然后通过一个全连接层将E映射到H,计算复杂度从(VH)降低到(VE + EH);
    • Transformer 跨层参数共享。ALBERT中每一层Transformer的参数都是一样的,类似于一个循环结构,每次都经过相同的Transformer层;
    • 引入SOP(Sentence Order Prediction)任务代替NSP任务,避免了主题预测,侧重于句子间的建模连贯性
  • 贡献: 直接把同等量级的BERT缩小了10倍+,让普通用户有了运行GPT2、威震天的可能。
    • 实验使用的xlarge是24层,2048维度,xxlarge是12层,4096维度
      • 在相同的模型训练时间下,ALBERT得到的效果确实比BERT好
      • 在相同的模型推理时间下,ALBERT base和large的效果都是没有BERT好的,而且差了2-3个点

XLNet

SpanBERT

MT-DNN

T5

T5 (Transfer Text-to-Text Transformer):将所有 NLP 任务都转化成 Text-to-Text (文本到文本)任务

  • 论文名称:Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer,2020,JMLR
  • 论文地址:https://arxiv.org/abs/1910.10683
  • 论文代码:https://github.com/google-research/text-to-text-transfer-transformer
  • 论文作者:Raffel C, Shazeer N, Roberts A, et al.
  • T5的输入格式和输出格式:绿色部分表示翻译任务,红色和黄色部分分别表示CoLA任务和STS-B任务,蓝色部分表示摘要生成任务,左侧的框表示T5的输入样例,右侧的框则是对应的输出结果
  • Encoder-Decoder:Transformer 基本结构,分成 Encoder 和 Decoder 两部分,对于 Encoder 部分,是双向注意力,词与词之间互相可见,之后结果输给 Decoder,Decoder 部分当前时间步的词汇只能看到之前时间步的词汇。
  • Decoder-only:当前时间步词汇只能看到之前时间步词汇。GPT 全系列及目前主流大模型均为 Decoder-only 结构。
  • Prefix LM:通过巧妙的 Attention 设计实现双向注意力与单向注意力的结合,一部分如 Encoder 一样能看到全体信息,一部分如 Decoder 一样只能看到过去信息。

GPT

  • 介绍:Generative Pre-trained Transformer(GPT)系列是由OpenAI提出的非常强大的预训练语言模型,这一系列的模型可以在非常复杂的NLP任务中取得非常惊艳的效果,例如文章生成,代码生成,机器翻译,Q&A等,而完成这些任务并不需要有监督学习进行模型微调。对于一个新的任务,GPT仅仅需要非常少的数据便可以理解这个任务的需求并达到接近或者超过state-of-the-art的方法。

GPT-1

  • 论文名称:Improving Language Understanding by Generative Pre-Training,2018
  • 论文地址:https://www.mikecaptain.com/resources/pdf/GPT-1.pdf
  • 论文代码:https://github.com/huggingface/transformersGPT
  • 论文作者:Alec Radford, Karthik Narasimhan, et al.
  • 关键词和摘要总结:
    • 关键词:自回归,生成式,无监督预训练,有监督微调
    • 摘要总结:
  • 研究设计和结论
    • 问题: 如何去学习更为深层次的语义信息表达?所学习的语义信息能否有效的帮助目标任务?
    • 方法:先通过在无标签的数据上学习一个生成式的语言模型,然后再根据特定下游任务进行微调
      • 数据集:BooksCorpus数据集,这个数据集包含7000本没有发布的书籍。
        • 数据集拥有更长的上下文依赖关系,使得模型能学得更长期的依赖关系;
        • 这些书籍因为没有发布,所以很难在下游数据集上见到,更能验证模型的泛化能力。
      • 无监督与训练:给定一个无标签序列u = { u 1 , u 2 , . . . , u n u_1,u_2, ..., u_n u1,u2,...,un},采用标准的语言模型最大化下列目标。其中,k是滑动窗口大小,P是条件概率,Θ是模型参数,这些参数通过SGD进行优化。【希望模型生成的句子尽量靠近当前句子
      • 模型:使用了12个transformer的decoder block
        • U是上下文token,n是层数, W e W_e We是token embedding矩阵, W p W_p Wp是position embedding矩阵
      • 有监督微调:
        • 任务:
          • 分类(Classification):对本文进行分类。比如给定一段文字,判断表达了积极/消极情感。
          • 文本蕴含(Entailment):给定前提,判断这个前提是否支持一个假设。例如:premise为"我在周六早上被闹钟闹醒,然后打开了电脑",是否能够推出"一个打工人在周末起早来打工"?
          • 相似性(Similarity):给定两段文本,判断它们表示的意思是否相似。
          • 多选题(Multiple Choice):给定一段文本和若干个答案,判断正确答案。
        • 对于一个有标签的数据集C,每个实例有m个输入token,对于每个实例的标签y,首先将tokens输入到训练好的预训练模型中,得到最终的特征向量hlm,然后再通过一个全连接层得到预测结果y:
        • 需要最大化的目标为:
        • 作者发现将语言建模作为微调的辅助目标有利于提升模型的泛化性并加速学习。其中,λ用于控制两个任务的权值,λ的取值一般为0.5。当进行有监督微调的时候,只训练输出层的 W y W_y Wy和分隔符(delimiter)的embedding值(因为分隔符在无监督预训练过程中模型没有见过)。
    • 实验结果:
      • 在有监督学习的12个任务中,GPT-1在9个任务上的表现超过了原有SOTA模型
      • 在zero-shot任务中,GPT-1的模型要比基于LSTM的模型稳定,且随着训练次数的增加,GPT-1的性能也逐渐提升,表明GPT-1有非常强的泛化能力
      • 能够用到和有监督任务无关的其它NLP任务中。GPT-1证明了transformer对学习词向量的强大能力,在GPT-1得到的词向量基础上进行下游任务的学习,能够让下游任务取得更好的泛化能力。对于下游任务的训练,GPT-1往往只需要简单的微调便能取得非常好的效果。
      • GPT-1在未经微调的任务上虽然也有一定效果,但是其泛化能力远远低于经过微调的有监督任务,说明了GPT-1只是一个简单的领域专家,而非通用的语言学家。

GPT-2

  • 论文名称:Language Models are Unsupervised Multitask Learners,2019
  • 论文地址:https://insightcivic.s3.us-east-1.amazonaws.com/language-models.pdf
  • 论文代码:https://github.com/openai/gpt-2
  • 论文作者:Alec Radford, Jeffrey Wu, et al.
  • 期刊:OpenAI blog
  • 关键词和摘要总结:
    • 关键词:去除fine-tune聚焦zero-shot,通过提示完成下游任务
    • 摘要总结:在GPT-1的基础上进一步提升了模型的量级和分词方法,使得在完全没有fine-tune的情况下模型在多个下游任务表现良好。
  • 研究设计和结论
    • 问题: 在没有大量特定任务数据集的监督下,如何学习并执行多种任务
    • 方法:通过在数据集WebText上训练模型,研究其在零样本(zero-shot)设置下执行多种自然语言处理任务的能力。
      • WebText:GPT-2 的数据取自于 Reddit 上 at least 3 karma 的文章,命名为 WebText。数据集共有约800万个文本,累计体积约40G。为了避免和测试集的冲突,WebText 移除了涉及Wikipedia的文章。
      • 模型改进:
        • 将Layer Normalization移动到每个子块的输入处;
        • 在最后一个self-attention后增加Layer Normalization;
        • 残差层的参数初始化根据网络深度进行调节;
        • 扩展词汇表到50,257个词;
        • 增加上下文大小到1024个词;
        • 使用更大的批量大小为512。
    • 实验结果:
      • 在7个测试的8个语言建模数据集中,GPT-2在零样本设置下达到了最先进的结果,但仍然在WebText上存在欠拟合
      • 在阅读理解(CoQA数据集)、翻译(WMT-14 Fr-En)、摘要(CNN和Daily Mail)和问答(Natural Questions)等多个任务中,GPT-2表现出有竞争力甚至最先进的结果。
  • 论文贡献:
    • 优点:证明了增加模型容量可以显著提高在多种任务上的性能
    • 缺点:GPT-2在经过预处理的语料库上面测试效果并不理想,这很可能是由于byte-level BPE的关系。

GPT-3

  • 论文名称:Language Models are Few-Shot Learners,2020
  • 论文地址:https://arxiv.org/abs/2005.14165
  • 论文代码:https://github.com/openai/gpt-3
  • 论文作者:Tom B. Brown, Benjamin Mann, et al.
  • 关键词和摘要总结:
    • 关键词:庞然大物,in-context learning,zero-shot&one-shot&few-shot
    • 摘要总结:GPT-3模型参数达到175B,它从极致的zero-shot回到few-shot,是彼时最庞大以及最强大的NLP模型
  • 研究设计和结论
    • 问题: 如何让语言模型在没有大量任务特定微调数据集的情况下,通过少量示例或简单指令学习新的语言任务?
    • 方法:
      • 模型调整:
        • GPT-3的单词embedding大小从GPT-2的1600增加12888;
        • 上下文窗口大小从GPT-2的1024增加到GPT-3的2048;
        • Adam优化器,β_1=0.9,β_2=0.95,ε= 10^-8^;
        • 使用与Sparse Transformer类似的dense and locally banded sparse attention结构
          • dense attention:每个token之间两两计算attention,复杂度O(n²)。
          • sparse attention:每个token只与其他token的一个子集计算attention,复杂度O(n*logn)。
            • sparse attention除了相对距离不超过k以及相对距离为k,2k,3k,...的token,其他所有token的注意力都设为0。
            • sparse attention的优势:
              • 减少注意力层的计算复杂度,节约显存和耗时,从而能够处理更长的输入序列;
              • 具有"局部紧密相关和远程稀疏相关"的特性,对于距离较近的上下文关注更多,对于距离较远的上下文关注较少;
            • sparse attention存在的问题:自然语言的内容存在上下文关系,稀疏的attention形式会损失一定的上下文关系,也会导致对长文本建模的效果变差
    • 直接使用预训练模型进行预测,提出了三种下游任务形式:zero-shot,one-shot,few-shot
    • 实验结果:
      • 参数来对下游任务的影响:
      • 任务表现:
        • 翻译任务:在英法、法英、英德、德英、英罗、罗英等语言对的翻译任务中,GPT-3在少量样本学习设置下表现出色,尤其是在英法和德英翻译任务中。
        • 问答任务:在TriviaQA、Natural Questions和WebQuestions等问答数据集上,GPT-3在零样本、单样本和少量样本学习设置下均表现出色,尤其是在TriviaQA上达到了71.2%的准确率。
        • 阅读理解:在CoQA、DROP、QuAC、SQuAD 2.0和RACE等阅读理解数据集上,GPT-3在少量样本学习设置下表现出色,尤其是在CoQA上达到了85.0的F1分数。
        • Winograd Schema Challenge:在Winograd Schema Challenge和Winogrande数据集上,GPT-3在零样本、单样本和少量样本学习设置下均表现出色,尤其是在Winograd上达到了88.3%的准确率。
        • 常识推理:在PIQA、ARC和OpenBookQA等常识推理数据集上,GPT-3在少量样本学习设置下表现出色,尤其是在PIQA上达到了82.8%的准确率。
        • 文本合成:GPT-3能够生成人类评估者难以区分的新闻文章样本,这表明其在文本合成方面的能力
  • 论文贡献:
    • 优点:对GPT进行少样本微调要比零样本微调更可以发掘模型的涌现能力
    • 缺点:GPT-3存在"幻觉"问题,很多情况下不会按照用户的指令,语言模型的目标应该是预测下一个token,而不是"follow the user's instructions helpfullyand safely"。

Instruct-GPT

  • 论文名称:Training language models to follow instructions with human feedback,2022
  • 论文地址:https://arxiv.org/abs/2203.02155v1
  • 论文代码:
  • 论文作者:Long Ouyang, Jeff Wu, et al.
  • 关键词和摘要总结:
    • 关键词:Human Feedback、Supervised Learning、Reinforcement Learning
    • 摘要总结:
  • 研究设计和结论
    • 问题: 大多数LLM都存在"幻觉"问题,语言模型的目标是"misaligned",而不是"follow the user's instructions helpfully and safely"。
    • 方法:
      • 定义语言模型对齐三个目标:
        • helpful: they should help the user solve their task;
        • honest: they shouldn't fabricate information or mislead the user;
        • harmless: they should not cause physical, psychological, or social harm to people orthe environment;
      • 使用RLHF(reinforcement learning from human feedback):
        • 有监督微调:收集有监督数据,微调大语言模型(SFT:supervised fine-tuning)
        • 奖励模型训练:收集对比数据,训练reward model(RM)
        • 强化学习对齐:基于PPO算法通过reward model对齐大语言模型;
      • 早期的InstructGPT收集标注数据:
        • Plain:让标注人员随意发挥,提出任意任务类型,确保任务的多样性;
        • Few-shot:指定instruction,让标注人员给出多组qeury/response对;
        • User-based:根据OpenAI-API收集到的实际用户使用case,让标注者编写对应prompt;【OpenAI提供了Playground接口,让用户实际体验,收集用户的问题并进行筛选(脱敏,每个用户ID限制200条prompts,并基于用户ID划分训练集、验证集和测试集),用于后续模型的迭代更新】
    • 实验结果:
      • 相比于GPT3(175B):
        • instructGPT(1.3B)的输出更好(这里-ptx指的是在PPO训练中引入预训练数据的梯度更新,帮助模型在保持对人类反馈的敏感性的同时,减少在某些公共NLP任务上的性能损失,防止过拟合)
        • instructGPT的真实性(truthfulness)有所提高(TruthfulQA);
        • instructGPT在生成有毒文本方面(包含不适当、有害、偏见性或可能对用户造成心理、情感或社会伤害的文本内容)有小幅改善(RealToxicityPrompts),但没有解决偏见问题
      • RLHF的训练过程并没有使得模型在原有能力上有明显下降
  • 论文贡献:
    • 优点:
      • instructGPT能够满足(泛化到)没有生成任何训练数据的标注人员的偏好;
      • instructGPT模型在RLHF数据分布之外的指令上,也具有很好的泛化能力;
    • 缺点:
      • 简单错误:InstructGPT仍然会犯一些简单的错误,例如未能遵循指令、编造事实或在简单问题上给出过长的回答。
      • 公开的NLP benchmark不能真实反映出InstructGPT的优势(数据视角与人类视角的差异);

GPT-4

  • 论文名称:GPT-4 Technical Report,2023
  • 论文地址:https://arxiv.org/abs/2303.08774
  • 论文代码:
  • 论文作者:OpenAI, et al.
  • 关键词和摘要总结
    • 关键词:Large-scale、Multi-modal
    • 摘要总结:GPT-4是一个多模态的大模型,基础结构仍然是Transformer+预测下一个词的目标函数
  • 研究设计和结论
    • 问题: 如何增强理解生成文本的能力,尤其在复杂且存在细微差异的场景。
    • 方法:
    • 实验结果:
      • 模型损失与模型计算量满足幂律关系,论文对这一论点进行了论证,用和GPT-4相同的训练方法训练参数/计算量更小的模型,得到一组compute VS loss的数据对,再用这些数据拟合一个幂律模型,发现GPT-4恰好在该幂律模型上,说明GPT-4的loss是可以被精准预测的。
      • GPT-4很好的解决了Inverse scaling prize(大模型不擅长任务)中的hindsight neglect任务
      • GPT-4在多种考试和基准测试中表现出色
  • 论文贡献
    • 优点:多模态能力
    • 缺点:
      • 生成内容并不是绝对可靠,要在法律、金融、医疗等领域谨慎使用其生成内容;
      • 模型本身存在各种各样的偏见;
      • 由于训练周期的问题,GPT-4的知识体系截止到2021年9月;
      • 会犯非常简单的推理错误;
      • 容易受骗,容易被用户引导而犯错;
      • GPT-4非常自信,及时回答错误也非常自信;
      • 仍存在安全性的问题,例如生成有害内容;

BLOOM

🔗BLOOM:A 176B-Parameter Open-Access Multilingual Language Model

  • 研发项目发起人:Thomas Wolf (Hugging Face联合创始人兼CSO)
  • 模型介绍:在46种自然语言13种编程语言上训练的1760亿参数语言模型,其是由数百名研究人员合作开发和发布的。训练BLOOM的计算力是由来自于法国公共拨款的GENCI和IDRIS,利用了IDRIS的Jean Zay超级计算机。
  • 数据集:ROOTS语料库,一个由498个Hugging Face数据集组成的语料。该语聊共计1.61TB的文本,包含46种自然语言和13种编程语言。
    • 语言的选择:首先列出8个世界上使用人数最多的语言,在项目早期邀请这些语言的流利使用者加入项目。然后,根据语言社区的建议进行语言的拓展,例如,将初始语言中的斯瓦希里语拓展到尼日尔-刚果语系,将印地语和乌尔都语拓展到印度语。最终,研发团队提出若某个语言只要有多于3个流利语言使用者参与,就可以添加至支持列表
    • 源的选择:研发团队和研讨会参与者共同编写了"BigScience Catalogue",涵盖多种语言的已处理和未处理来源的大列表,采用hackathons形式进行组织。作为补充,其他参与者编写了特定语言的资源,例如以阿拉伯语为中心的Masader存储库。由此共确定了252个源,每种语言至少有21个源。对于西班牙语、中文、法语和英语,参与者确定了适合添加到语料中的本地网站信息,并通过pseudocrawl(从Common Crawl snapshot中获取这些网站)将其添加到语料中。
    • GitHub代码:通过Google's BigQuer上的GitHub数据集合来进一步补充该目录中的编程语言数据集,然后使用精准匹配进行去重。
    • OSCAR:为了不偏离使用网页作为预训练数据源的研究惯例,并且满足BLOOM预训练的数据需求,进一步使用版本为21.09的OSCAR作为数据源,对应于2021年2月的Common Crawl snapshot,约占最终语料的38%。【OSCAR 项目(Open Super-large Crawled Aggregated coRpus)是一个开源项目,旨在为机器学习 (ML) 和人工智能 (AI) 应用程序提供基于 Web 的多语言资源和数据集。】

数据预处理:

  1. 获取源数据
    从已经确定的数据源中获得文本数据,包括从各类NLP数据集中提取数据,从文本资源中抓取和处理大量PDF文件,从列表中指定的192个网站及各地区456个网站中提取和处理文本。网站数据的获取是用研发的工具从Common Crawl WARC文件中的HTML中抽取文本,该方法能够从539个网站的URL中提取可用信息。
  2. 质量过滤--- Text Produced by Humans for Humans
    在获得文本后,研究团队发现大多数源中包含了大量的非自然语言,例如预处理错误、SEO页面或者垃圾数据。对于每种语言,采用两种方法来进行过滤:
    • 通过流利使用该语言的人逐个为每种语言选定其参数,如阈值和支持术语列表;
    • 手动审核每个数据源,以确定最有可能识别非自然语言的指标。
  3. 去重和隐私编辑
    对文档进行去重,并对OSCAR语料进行个人信息脱敏。

Prompt数据集:

多任务提示微调(Instruction tuning)涉及到对预训练语言模型的微调,微调的数据集由通过自然语言提示构成的大量不同任务组成。

  • T0证明了在多任务混合的prompted数据集上微调的模型具有强大的zero-shot泛化能力。此外,T0优于那些数量级大但是没有经过这种微调的语言模型。受此启发,研发团队探索了使用现有自然语言数据集来进行多任务prompted微调的优化策略。
  • T0是在Public Pool of Prompt(P3)子集上进行训练的,其是一个各种现有的、开源的应用自然语言数据集的prompt集合。该prompt集合是通过BigScience合作者参与的一系列hackathons创建的,其中hackathons参与者为170+数据集编写了2000+ promptP3中的数据集覆盖了各种自然语言任务,包括情感分析、问答、自然语言推理,并且排除了有害的内容或者非自然语言内容。

对BLOOM预训练之后,应用相同的大规模多任务对其进行微调,使BLOOM具有多语言 zero-shot任务泛化能力,我们称得到的模型为BLOOMZ

  • 为了训练BLOOMZ,扩展了 P3 以包含英语以外语言的新数据集和新任务,例如翻译,这产生了xP3,它是83个数据集的提升集合,覆盖46种语言和16种任务,语言分布与BLOOM的ROOTS数据集高度一致。
  • xP3中包含跨语言和单语言任务,研发团队使用PromptSource(PromptSource,一个开源工具包(作为 BigScience 的一部分进行开发)促进了自然语言prompt的创建、共享和使用)来收集这些prompts,并为prompt添加额外的元数据,例如input和target Languages。
  • 为了研究多语言prompt的重要性,还将xP3中的英语提示用机器翻译为相应的数据集语言,来生成一个称为xP3mt的集合。

模型结构:

  • 背景:大多数现代语言模型都是基于Transformer架构,但是架构实现之间存在着显著的不同。原始的Transformer是基于encoder-decoder架构的,许多流行的模型仅选择encoder-only或者decoder-only方法。当时,所有超过100B参数的state-of-the-art模型都是decoder-only模型
  • 问题:在BLOOM的工作之前,现有文献缺乏不同架构和预训练目标的系统性评估zero-shot泛化能力
  • 方法:BLOOM研发团队在Wang et al.(2022a)等人的工作中探索了这个问题,其探索了encoder-decoder和decoder-only架构以及与causal、prefix和masked language modeling预训练目标之间的交互作用。BLOOM的结果显示,经过预训练之后,causal decoder-only模型的表现最好,验证了state-of-the-art LLM的选择。

模型细节-ALIBI:

  • 长度的外推性的引入:
    • 长度的外推性:在短序列上训练的模型,能否不用微调直接用到长序列上并依然保持不错的效果
    • 原因:允许我们以较低成本(在较短序列上)训练出一个长序列可用的模型

ALIBI是第一篇明确研究Transformer长度外推性的工作,它在Softmax之前,将Attention的计算做了修改

ALIBI使用与查询键距离成比例的惩罚,假设两个token距离越远那么相互贡献也就越低,让模型主要关注查询键附近的注意力值

λ是超参数,每个head设置不同的值,当head=n时,使用几何序列,以 2 − 8 n 2^{-\frac{8}{n}} 2−n8为起始值,并使用此值为比率,n=8时,λ= 1 2 1 , 1 2 2 , , , 1 2 8 {\frac{1}{2^1}},{\frac{1}{2^2}},,,{\frac{1}{2^8}} 211,221,,,281,n=16时,λ= 1 2 0.5 , 1 2 1 , , , 1 2 8 {\frac{1}{2^{0.5}}},{\frac{1}{2^1}},,,{\frac{1}{2^8}} 20.51,211,,,281

ALIBI的论文在长度为1024的输入序列上训练了一个13亿个参数的模型,并将其外推到长度为2048的输入序列,实现了与在长度为2048的输入上训练的正弦位置嵌入模型相同的困惑度,但训练速度提高了11%,并且减少了11%的内存。


模型细节-Embedding Layer Normalization:

  • 背景:BLOOM研发团队在训练104B参数模型的初步试验中,尝试在嵌入层后立即进行layer normalization,并发现这可以显著的改善训练稳定性。
  • 方法:尽管在一些研究中发现其对zero-shot泛化有惩罚,研发团队还是在BLOOM的第一个embedding层后添加了额外的layer normalization层来避免训练不稳定性
  • 参数:初步的104B实验中使用float16,而最终的训练上使用bfloat16。因为float16一直被认为是训练LLM时观察的许多不稳定的原因。bfloat16有可能缓解对embedding LayerNorm的需要

模型细节-Tokenization:

  • 背景:BLOOM研发团队针对训练数据的多样性,重新设计并训练了tokenizer以确保以无损的方式编码句子。
  • Tokenizer数据集:Tokenizer的训练集来自于ROOTS数据集,对每种语言使用与训练数据相同的比率进行采样,并对数据集进行去重,得到ROOTS数据集的非重复子集。
  • 词表尺寸:Tokenizer的词表尺寸决定了embedding矩阵的尺寸,为了GPU运算效率,embedding尺寸必须被128整除,为了使用张量并行必须被4整除。BLOOM最终使用了250680词表尺寸,具有200个为未来应用保留的token。
  • BPE算法(Byte Pair Encoding):tokenizer使用BPE算法进行训练。为了在tokenization的过程中不丢失信息,tokenizer从bytes开始创建合并,而不是以字符作为最小单位。这种方式,tokenization永远不会产生未知的tokens,因为所有256个字节都可以被包含在tokenizer的词表中。
    • 算法介绍:每一步都将最常见的一对相邻数据单位替换为该数据中没有出现过的一个新单位,反复迭代直到满足停止条件。
    • 算法实现:假设我们有需要编码(压缩)的数据aaabdaaabac
      • 1)相邻字节对(相邻数据单位在BPE中看作相邻字节对)aa最常出现,因此我们将用一个新字节Z替换它,得到ZabdZabac,其中Z = aa。
      • 2)下一个常见的字节对是ab,让我们用Y替换它,得到ZYdZYac,其中Z = aa,Y =ab。
      • 3)剩下的唯一字节对是ac,它只有一个,所以我们不对它进行编码
      • 4)我们可以递归地使用字节对编码将ZY编码为X,得到XdXac,其中X = ZY,Y = ab,Z = aa。因为没有出现多次的字节对,所以它不能被进一步压缩
  • 规范化:在BPE算法上游,为了尽可能地获得最通用的模型,没有对文本进行规范化。如果添加NFKC这样的unicode规范化,在使fertility轻微降低(不超过0.8%)的情况下导致模型通用性降低,例如,导致2^2^和22以相同方法被编码。
  • Pre-tokenizer:预分词是对文本进行第一次切分,从而给出tokenizer训练结束时token长度的上限。一个好的思路是,预分词器将把文本拆分成"单词",然后,最终tokens将是这些单词的一部分。 BLOOM的pre-tokenization使用的是的正则表达式:?[^(\S|[.,!?...。,、|_])]+
    • 通过正则表达式将单词分开,同时保留所有的字符,特别是对编程语言至关重要的空格和换行符。
    • BLOOM不使用在其他tokenizers中常见的以英文为中心的划分,也没有在数字上使用划分,否则将导致Arabic和code的编码问题。
  • 评估:使用 fertility对本文使用的tokenizer(Acs,2019)与现有的单语言tokenizer进行比较。使用目标语言的 Universal Dependencies 2.9 和 OSCAR 子集来衡量。
    • 比较结果:
    • fertility :每个单词或者每个数据集被 tokenizer 创造的 subword数量
    • 原因:在一个语言上有非常高的 fertility 时,意味着相比于单语言 tokenizer 在下游多语言上的性能下降。
    • 目标:多语言 tokenizer 与对应单语言 tokenizer 进行比较时,确保每种语言的 fertility 能力较低不超过10个百分点。

工程架构:

BLOOM模型在Jean Zay上训练,其是由法国政府资助的超级计算机,归属于GENCI所有,由法国国家科学研究中心(CNRS)的国家计算中心IDRIS运行。训练BLOOM花费了3.5个月才完成,并消耗了1082990计算小时。

  • GPU概况:384张NVIDIA A100 80GB GPU (48个节点) + 32张备用GPU
  • 节点配置:每个节点8张GPU,4条NVLink卡间互联,4条OmniPath链路
  • CPU:AMD EPYC 7543 32核处理器
  • CPU内存:每个节点512GB
  • GPU显存:每个节点640GB
  • 节点间连接:使用Omni-Path Architecture (OPA)网卡,网络拓扑为无阻塞网络
  • NCCL -通信网络:一个完全专用的子网
  • 磁盘IO网络:GPFS与其他节点和用户共享

BLOOM使用Megatron-DeepSpeed(一个用于大规模分布式训练的框架)训练

  • 组成:
    • Megatron-LM提供Transformer实现、张量并行和数据加载基本操作
    • DeepSpeed提供ZeRO优化器、模型流水线、通过分布式训练组件。
  • 训练并行策略:
    • 同时使用DP、PP、TP这三种并行方式(3D parallelism)
    • 使用DeepSpeed ZeRO stage 1,即仅对优化器参数进行分片。
    • 意义:将训练过程扩展至数百个GPU,并具有极高的GPU利用率,能够在A100 GPU的最快配置下实现156 TFLOPs,实现了理论峰值312 TFLOPs的一半。

模型评估:

SuperGLUE:

  • 分类任务评估套件的子集:Ax-b、Ax-g、BoolQ、CB、WiC、WSC和RTE任务

T0:模型是instruction-tuned,因此不能直接和BLOOM以及OPT进行比较

  • zero-shot效果:跨提示的平均表现总是徘徊在机会附近。
  • one-shot效果:没有显着改善

OPT 和 BLOOM模型系列都随着规模的扩大而略有改善,并且在所有任务中系列之间没有一致的差异。BLOOM-176B 在 Ax-b、CB 和 WiC 上领先于 OPT-175B

LLaMA

LLaMA-1

  • 介绍:LLaMA是一组基础语言模型,范围从7B到65B参数。它在数万亿tokens上训练,并表明完全可以使用开源的数据集训练最先进的模型,无需求助于专用或者非开源的数据集。
  • 比较:
    • LLaMA-13B在大多数基准测试中的表现都优于GPT-3(175B),并且LLaMA-65B的性能与性能优异的Chinchilla-70B和PaLM-540B相近。
    • LLaMA项目的重点是使用较小的模型,通过使用更多的tokens进行训练,在各种推理预算下实现最佳性能。
    • Alpaca,Vicuna、Baichuan-7B采用与LLaMA一致的模型结构

预训练数据:

  • 英语CommonCrawl [67%]
    • CommonCrawl是一个公开的网络文本数据集,它包含了从2008年开始收集的数千亿个网页的原始数据、元数据和文本提取内容。
    • LLaMA团队使用 CCNet pipeline 预处理了5个 CommonCrawl dumps,数据集时间跨度从2017年到2020年。此过程在行级别(line level)消除数据重复,使用 fastText 线性分类器进行语言识别以删除非英语页面,并使用 ngram 语言模型过滤低质量内容
    • 训练了一个线性模型对页面分类,判断是被Wikipedia引用,还是随机采样的页面,对于没有分类为被引用的页面,进行丢弃。
  • C4 [15%]
    • C4数据集是一个巨大的、清洗过的Common Crawl网络爬取语料库。
    • 原因:在探索性实验中,观察到使用不同的预处理 CommonCrawl 数据集可以提高性能。因此,将公开可用的 C4 数据集纳入了数据集。
    • C4 的预处理还包含重复数据消除语言识别步骤(language identification steps)。与 CCNet 的主要区别是它的质量过滤主要依赖于启发式,例如标点符号的存在或网页中的单词和句子的数量。
  • Github [4.5%]
    • 使用 Google BigQuery 上提供的公共GitHub数据集。只保留在 Apache、BSD 和 MIT许可证下的项目。此外,根据行长度或字母数字字符的比例,使用启发式方法过滤低质量文件,并使用正则表达式删除样板文件(boilerplate),如标题。最后,我们使用精确匹配(exact matches)在文件级别(file level)对生成的数据集进行重复数据消除
  • 维基百科 [4.5%]
    • 数据集添加了2022年6月至8月期间的维基百科 dumps,涵盖20种语言,它们使用拉丁语或西里尔语脚本:bg、ca、cs、da、de、en、es、fr、hr、hu、it、nl、pl、pt、ro、ru、sl、sr、sv、uk。删除超链接、注释和其他格式样板
  • Gutenberg和Books3 [4.5%]
    • 在训练数据集中包括两个图书语料库:Gutenberg Project,其中包含公共领域的图书,以及ThePile的Books3部分,这是一个用于训练大型语言模型的公开数据集。我们在书本级别执行重复数据消除,当两本书的内容重叠超过90%,就进行删除。
  • ArXiv [2.5%]
    • 对 arXiv Latex 文件进行处理,从而将科学数据添加到了数据集。删除了第一节之前的所有内容,以及参考文献,还删除了.tex文件中的注释,以及用户编写的 inline-expanded definitions 和宏,以提高论文之间的一致性。
  • Stack Exchange [2%]
    • 数据集涵盖了一个 Stack Exchange 网站的 dumps,这是一个包含高质量问题和答案的网站,涵盖从计算机科学到化学等多个领域。保留了28个最大网站的数据,删除了文本中的HTML标记,并按分数(从最高到最低)对答案进行排序。

Tokenizer:LLaMA使用BPE算法对数据进行tokenize,使用来自SentencePiece的实现。LLaMA将所有数字拆分为单个数字,对于未知的UTF-8字符,回退到byte对其进行拆解表示


模型架构

模型参数:

LLaMA的模型结构基于Transformer架构

模型架构细节------Pre-Normalization:

  • 为了提高训练稳定性,LLaMA对每个Transformer子层的输入进行归一化,而不是对输出进行归一化。LLaMA使用了RMSNorm归一化函数
  • 常用Normalization方式(LN在F前还是后):
    • Post-norm:
    • Pre-norm:
      • 从梯度传播的角度看,Pre-norm的梯度求解公式为:可以看到,由于对于当前层的梯度计算,有一个1的导数值,这样上一层反向传播下来的梯度会被保留,也就是本层梯度有一部分完全是上一层传递下来的,没有被本层的梯度削减,所以不容易造成梯度消失
    • Pre-norm与Post-norm的纷争:
      • Post Norm效果优于Pre Norm:
        • 《Understanding the Difficulty of Training Transformers》
        • 《RealFormer: Transformer Likes Residual Attention》
      • Pre-Norm效果优于PostNorm:
        • 《On Layer Normalization in the Transformer Architecture》:提出Post Norm对参数非常敏感

关于Pre-norm的一个质疑:一个L层的Pre Norm模型,其实际等效层数不如L层的Post Norm,即等效层数少导致效果变差

上式中的每一项都是同一量级的,即t + 1层与t层的差别就在于t + 1项相加与t项相加的区别,当t较大时,新增的一项对总数值影响较小

当t比较大时, x t x_t xt与 x t + 1 x_{t+1} xt+1相差较小,所以 F t + 1 ( N o r m ( x t + 1 ) ) F_{t+1}(Norm(x_{t+1})) Ft+1(Norm(xt+1))与 F t + 1 ( N o r m ( x t ) ) F_{t+1}(Norm(x_{t})) Ft+1(Norm(xt))近似

因此原本一个t层的模型与t + 1层之和,近似等效于一个更宽的t层,所以在Pre Norm中多层叠加的结果更多是增加了宽度,而非深度,层数越多,层数就越"虚"

  • RMS norm:RMS Norm是L2 Normalization的简单变体,在RMS Norm的论文中指出:RMS Norm比Layer Normalization更快(可以在各个模型上减少约7%∼64%的计算时间),效果也基本一致。
    • 相比与常规norm,RMS norm的主要区别在于去掉了减去均值的部分
      • 常规norm:
      • RMS norm:

模型架构细节------SwiGLU:

  • Swish 函数: 是一种自门控(Self-Gated)激活函数。[Ramachandran et al., 2017]
    • 自门控(self-gating):使用同样的值进行门控来简化门控机制。
    • 特性:
      • 参数不变情况下,将模型中ReLU替换为Swish,模型性能提升;
      • Swish无上界,不会出现梯度饱和;
      • Swish有下界,可以产生更强的正则化效果;
      • Swish处处连续可导
      • 性能不稳定,并非稳定强于ReLU;
    • 对比:Swish激活函数和各种主流激活函数在基线性能上的差别,这些对比结果是通过不同模型(Inception、MobileNet等)在不同数据集(MNIST、CIFAR或ImageNet等)上使用不同激活函数而实现的
  • GLU表达式:x的两个线性映射(linear projection)逐点相乘,其中一个通过sigmoid函数先进行非线性激活
    • 对比:
  • SwiGLU:

模型架构细节------RoPE:

LLaMA删除了绝对位置嵌入,引入了旋转位置嵌入(RoPE)

  • 复数:
    • 表示形式
      • 代数形式:
      • 向量形式:
      • 矩阵形式:
        • 推导:
          • 假设:
          • 转化成一个矩阵和一个向量相乘:
          • z 1 z_1 z1可以表示为:
          • 总结:复数可以表示为主对⻆线为实数值次对⻆线为虚数值及其负数的形式
      • 极坐标形式:
        • 推导:z=a+bi,z的向量形式可以进⾏如下转换:
      • 指数形式:
        • 欧拉公式:
    • 共轭复数:
    • 复数的模:
    • 2D旋转:
      • 如果我们跟⼀个复数相乘,那么所做的矩阵变换是:
      • 则这个矩阵代表了2D平⾯上的旋转:
      • 即:
      • 展开代入得:
      • 转化成矩阵形式:
      • 总结:将任何复数c与z相乘都是将c逆时针旋转θ度,并将其缩放。其中,
      • 假设 ||z|| = 1,那么复数可以⽤⼀个单位向量表⽰,同时这个乘法只做旋转变换。则平⾯上的旋转可以有矩阵形式:
      • 利⽤复数的代数形式:
      • 继续利⽤其指数形式:
  • RoPE(Rotary Position Embedding):旋转位置编码,是苏剑林老师提出的一种旋转位置编码方法,其思想是采用绝对位置编码的形式,实现相对位置编码

推导如下:

我们需要设计一个f,⾸先包含绝对位置信息,并且要求两个不同向量的f的内积包含两者的相对位置信息。

我们假设通过下述运算来给q, k添加绝对位置信息

即q,k经过f(·,m),f(·,n)后, q m , q k q_m,q_k qm,qk就带有了位置m, n的绝对位置信息

由于Attention 的核心运算是内积,所以我们希望内积的结果带有相对位置信息。因此存在恒等关系:

我们要求出该恒等式的⼀个(尽可能简单的)解。求解过程还需要一些初始条件,显然我们可以合理地设f(q, 0)=q,f(k, 0)=k,即没有任何位置信息 时,f(·, 0)等于原值

求解:

在复数中有:

其中,Re[]代表复数的实部,上式代表向量q与向量k的乘积,等于复数q与复数k的共轭复数k*相乘的实部

举个例子:

  • [3,5]对应的复数为3+5i
  • [1,6]对应的复数为1+6i,其共轭复数为1-6i
  • 则向量内积:[3,5]*[1,6]^T^=33
  • 复数与共轭复数相乘:(3+5i)(1-6i)=33-13i,且Re[33-13i]=33

我们将此式

带入复数表达式:

为了简单起见,我们直接假设存在复数g(q,k,m-n),使得:

我们⽤复数的指数形式对其进⾏表⽰,其中,R代表向量模⻓。:

那么代⼊⽅程后就得到⽅程组(共轭复数,所以虚部系数为负值):

如果我们根据⽅程组求出了 R f R_f Rf(q,m)和 θ f θ_f θf(q,m)的表达式,也就求解出了f(·,m)的表达式。


方程一推导:

对于第⼀个⽅程,代⼊m=n得到:

最后⼀个等号源于初始条件f(q,0)=q,f(k,0)=k。(因为m=0时,f(q,0)=q,⽽ R f R_f Rf为模⻓,因此就是q的模⻓)

现在我们可以很简单地设:

即它不依赖于m

结论⼀:R(q,m)=||q||


方程二推导:

对于第⼆个⽅程,同样带⼊m=n得到:

这⾥的Θ(q), Θ(k)是q, k本⾝的幅⻆,最后⼀个等号同样源于初始条件。根据上式得到:

所以q和k并没有影响 Θ f ( q , m ) − Θ ( q ) Θ_f(q, m) - Θ(q) Θf(q,m)−Θ(q)的值,所以上式应该是⼀个只与m相关,跟q⽆关的函数,记为 φ ( m ) \varphi(m) φ(m),即:

原始的⽅程⼆为:

带⼊n=m-1,得:

即{ φ ( m ) \varphi(m) φ(m)}是等差数列,设右端为θ,那么就解得 φ ( m ) \varphi(m) φ(m)=mθ。

结论二:Θ(q,m)=Θ(q)+ φ ( m ) \varphi(m) φ(m)=Θ(q)+mθ


编码形式:

综上,我们得到⼆维情况下⽤复数表⽰的RoPE:

最后一步推导:

根据复数乘法的⼏何意义,该变换实际上对应着向量的旋转,所以我们称之为"旋转式位置编码",它还可以写成矩阵形式:

相当于q通过乘以⼀个||z||=1的虚数,实现了向量旋转

由于内积满⾜线性叠加性,因此任意偶数维的RoPE,我们都可以表⽰为⼆维情形的拼接,即:

也就是说,给位置为m的向量q乘上矩阵 W m W_m Wm、位置为n的向量k乘上矩阵 W n W_n Wn,⽤变换后的Q,K序列做Attention,那么Attention就⾃动包含相对位置信息了,因为成⽴恒等式:

其中: W m W_m Wm是⼀个正交矩阵,它不会改变向量的模⻓,因此通常来说它不会改变原模型的稳

定性

由于 W m W_m Wm的稀疏性,所以直接⽤矩阵乘法来实现会很浪费算⼒,推荐通过下述⽅式来实现RoPE(结果完全⼀致,避免稀疏矩阵乘法):

其中⊗是逐位对应相乘,即计算框架中*的运算。从这个实现也可以看到,RoPE可以视为是乘性位置编码的变体。


远程衰减特性:

RoPE能够带来⼀定的远程衰减特性不同位置的position encoding点乘结果会随着相对位置的增加⽽递减):


RoPE效果:

苏剑林团队使⽤RoPE改造了WoBERT模型,得到RoFormer模型,它跟其他模型的结构对⽐如下:

在训练上,以WoBERT Plus为基础,采⽤了多个⻓度和batch size交替训练的⽅式,让模型能提前适应不同的训练场景:

从表格还可以看到,增⼤序列⻓度,预训练的准确率反⽽有所提升,这侧⾯体现了RoFormer⻓⽂本语义的处理效果,也体现了RoPE具有良好的外推能⼒。在短⽂本任务上,RoFormer与WoBERT的表现类似,RoFormer的主要特点是可以直接处理任意⻓的问题。下⾯是在CAIL2019-SCM任务上的实验结果:


结论:

  • 从理论上来看,RoPE与Sinusoidal位置编码有些相通之处,但RoPE不依赖于泰勒展开,更具严谨性与可解释性;
  • 从预训练模型RoFormer的结果来看,RoPE具有良好的外推性,应⽤到Transformer中体现出较好的处理⻓⽂本的能⼒。
  • 此外,RoPE还是⽬前唯⼀⼀种可⽤于线性Attention的相对位置编码

模型架构细节------AdamW:

  • Adam:Adam方法将惯性保持(动量)和自适应这两个优点集于一身。
    • Adam记录梯度的一阶矩(firstmoment),即过往梯度与当前梯度的平均,这体现了惯性保持
    • Adam还记录梯度的二阶矩(secondmoment),即过往梯度平方与当前梯度平方的平均,这类似AdaGrad方法,体现了自适应能力,为不同参数产生自适应的学习速率:
    • 一阶矩和二阶矩采用类似于滑动窗口内求平均的思想进行融合,即当前梯度和近一段时间内梯度的平均值,时间久远的梯度对当前平均值的贡献呈指数衰减
    • 其中,β1,β2为衰减系数,β1通常取值0.9,β2通常取值0.999,mt是一阶矩,vt是二阶矩。
    • 其中,mt^ 和 vt^ 是mt、vt偏差矫正之后的结果。
  • 正则化项
    • 机器学习中经常会在损失函数中添加一个正则化项,常用的额外项一般有两种,记作 L1-norm 和 L2-norm,即 L1 正则化项和 L2 正则化项,或 L1 范数,L2 范数
      • 大白话理解:L1正则化和L2正则化可以看做是损失函数的惩罚项对损失函数中的某些参数做一些限制
      • 原因:数据集中的噪声点往往需要比较大的w值来拟合,也就是说w越大,模型的曲线越"陡峭",因而网络模型能够更好得拟合噪声点,但也引起了过拟合
      • 方法:l1和l2正则化都是通过减小权值w,使某些神经元的作用变小甚至可以勿略,从而降低网络模型的复杂度来防止过拟合。这与dropout通过以一定的概率丢弃神经元的做法在效果上是相似的。

真正重要的模型参数可能并不多

  • 方法:
    • 保留尽可能少的重要的参数可以减弱非重要特征的波动带来的模型预测影响,防止过拟合,使模型的泛化效果更好。
    • 参数变少可以使整个模型获得更好的可解释性,而且还可以用做特征选择。

复杂的模型,其参数值会比较大

  • 原因:越复杂的模型,越是会尝试对所有的样本进行拟合,这就容易造成在较小的区间里预测值产生较大的波动,对于一些异常样本点波动就更大,这种较大的波动也反映了在这个区间里的导数很大,而只有较大的参数值才能产生较大的导数。相反地,参数小,则导数小,则对于样本特征的波动具有鲁棒性,那么模型能更好地防止过拟合,泛化效果会更好

  • AdamW:

    • AdamW 与 Adam 对比,主要是修改了权重衰减计算的方式
    • Adam:在损失函数中加入了 L2 正则化项,也就是把权重衰减放到了梯度里,由梯度间接缩小θ,但是这种方法并没有起到有效的正则化作用
    • Adam-W:AdamW 直接将权重衰减项放到权重计算中,可以在自适应地调整学习率的同时,对大的权重进行惩罚,起到了有效的正则化作用。

模型架构细节------LR-Scheduler:

  • LLaMA使用cosine模式的LR-Scheduler,使得最终学习速率等于最大学习速率的10%。
  • 使用了0.1的权重衰减和1.0的梯度裁剪
  • 使用2000个warmup步骤,并根据模型的大小改变学习速度和批量大小。

模型评估:

  • 常识推理:
    • LLaMA-65B在除BoolQ之外的所有报告基准上均优于Chinchilla-70B。类似地,除了BoolQ和WinoGrande之外,这款模型在任何地方都超过了PaLM540B。尽管LLaMA-13B模型比GPT-3小10倍,但在大多数基准测试中,LLaMA-13模型的性能也优于GPT-3
    • LLaMA-65B在zero-shot和few-shot设置中实现了最先进的性能。更重要的是,LLaMA-13B在这些基准测试中与GPT-3和Chinchilla相比也具有竞争力,尽管更小5-10倍。在推理过程中,该模型在单个V100 GPU上运行
  • 阅读理解:LLaMA-65B与PaLM-540B相比具有竞争力,并且LLaMA-13B比GPT-3好几个百分点。
  • 数学推理:在GSM8k上,我们观察到LLaMA65B优于Minerva-62B,尽管它还没有根据数学数据进行微调
  • 代码生成:对于相同数量的参数,LLaMA优于其他通用模型,如LaMDA和PaLM,这些模型没有专门针对代码进行训练或微调。具有13B参数的LLaMA在HumanEval和MBPP上均优于LaMDA 137B。即使训练时间更长,LLaMA 65B也优于PaLM 62B。
  • 大规模多任务语言理解:LLaMA-65B在大多数领域平均落后于Chinchilla70B和PaLM-540B几个百分点。一种可能的解释是,LLaMA在预训练的数据中使用了有限数量的书籍和学术论文。
    对instruction数据的短暂微调可以快速改进在MMLU上的表现。基于instruction数据训练的模型称为LLaMA-I:

Alpace

🔗官方链接:https://crfm.stanford.edu/2023/03/13/alpaca.html

🔗官方Git:tatsu-lab/stanford_alpaca

🔗官方模型:https://huggingface.co/tatsu-lab/alpaca-7b-wdiff

Alpaca是一个instruction-following language model,从Meta的LLaMA 7B模型中微调而来的。

训练过程:

Alpaca采用OpenAI的Text-davinci-003API配合self-instruct技术,使用175个self-instruct seed自动生成了52K条instruction-following的指示数据集,在LLaMa-7B上微调得到的模型,在8张80G的A100上训练了3小时

在self-instruct评估集上,Alpaca表现出许多接近于OpenAI的text-davinci-003的表现,但他非常小且易于(成本低)重现。


SELF-INSTRUCT:无需人工标注,自生成指令框架

  1. 指令生成:首先作者人工构建了175个种子指令,这些种子指令由1条指令和1个样本构成。每个Step作者会从中采样8个指令,其中6个来自以上种子,2个来自LLM生成的指令,当然step1全部都是种子指令。然后基于如下的prompt模板构建模型输入

    """
    Come up with a series of tasks:
    Task 1: {instruction for existing task 1}
    Task 2: {instruction for existing task 2}
    Task 3: {instruction for existing task 3}
    Task 4: {instruction for existing task 4}
    Task 5: {instruction for existing task 5}
    Task 6: {instruction for existing task 6}
    Task 7: {instruction for existing task 7}
    Task 8: {instruction for existing task 8}
    Task 9:
    """

  2. 分类任务识别:判断生成的指令是否是一个分类任务,将分类任务定义为output的标签是一个有限的小的标签集合的任务

是否是分类任务也是由模型来判断的,使用few-shot方式来实现:

  1. 实例生成
  • 对于非分类任务,采用Input-first Approach,也就是先让LLM对于指令先生成一个输入(input)再生成对应的输出(output)(如果任务不需要input,就直接生成结果)。对应的prompt模板如下(论文中的table 7):

    Come up with examples for the following tasks. Try to generate multiple examples when possible. If the task doesn't require additional input, you can generate the output directly.

    Task: Which exercises are best for reducing belly fat at home?
    Output:

    • Lying Leg Raises
    • Leg In And Out
    • Plank
    • Side Plank
    • Sit-ups

    Task: Extract all the country names in the paragraph, list them separated by commas.
    Example 1
    Paragraph: Dr. No is the sixth novel by the English author Ian Fleming to feature his British Secret Service agent James Bond. Written at Fleming's Goldeneye estate in Jamaica, it was first published in the United Kingdom by Jonathan Cape in 1958. In the novel Bond looks into the disappearance in Jamaica of two fellow MI6 operatives who had been investigating Doctor No. Bond travels to No's Caribbean island and meets Honeychile Rider, who is there to collect shells. They are captured and taken to a luxurious facility carved into a mountain. The character of Doctor No, the son of a German missionary and a Chinese woman, was influenced by Sax Rohmer's Fu Manchu stories. Dr. No was the first of Fleming's novels to face widespread negative reviews in Britain, but it was received more favourably in the United States.
    Output: English, British, Jamaica, the United Kingdom, German, Chinese, Britain, the United States.

    Task: Converting 85 F to Celsius.
    Output: 85°F = 29.44°C

    Task: Sort the given list ascendingly.
    Example 1
    List: [10, 92, 2, 5, -4, 92, 5, 101]
    Output: [-4, 2, 5, 5, 10, 92, 92, 101]
    Example 2
    Input 2 - List: [9.99, 10, -5, -1000, 5e6, 999]
    Output: [-1000, -5, 9.99, 10, 999, 5e6]

    Task: Suggest a better and more professional rephrasing of the following sentence.
    Example 1
    Sentence: This house is surprisingly not constructed very well, and you probably need more money to fix it after you buy it. If you ask me, I would suggest you to consider other candidates.
    Output: This house does not seem to be constructed well, so you may need to spend more money to fix it after you purchase it. I would suggest that you look at other properties.
    Example 2
    Sentence: Just so you know, we did an experiment last week and found really surprising results - language model can improve itself!
    Output: Our experiments last week demonstrated surprising results, proving that the language model can improve itself.

    Task: Read the following paragraph and answer a math question about the paragraph. You need to write out the calculation for getting the final answer.
    Example 1
    Paragraph: Gun violence in the United States results in tens of thousands of deaths and injuries annually, and was the leading cause of death for children 19 and younger in 2020. In 2018, the most recent year for which data are available as of 2021, the Centers for Disease Control and Prevention's (CDC) National Center for Health Statistics reports 38,390 deaths by firearm, of which 24,432 were by suicide. The rate of firearm deaths per 100,000 people rose from 10.3 per 100,000 in 1999 to 12 per 100,000 in 2017, with 109 people dying per day or about 14,542 homicides in total, being 11.9 per 100,000 in 2018. In 2010, there were 19,392 firearm-related suicides, and 11,078 firearm-related homicides in the U.S. In 2010, 358 murders were reported involving a rifle while 6,009 were reported involving a handgun; another 1,939 were reported with an unspecified type of firearm. In 2011, a total of 478,400 fatal and nonfatal violent crimes were committed with a firearm.
    Question: How many more firearm-related deaths were there in 2018 compared to 2010?
    Output:
    38390 - (19392 + 11078) = 38390 - 30470 = 7920.
    So, in 2018, there were 7920 more deaths by firearm than in 2010.

    Task: Write Python code to solve this leetcode problem.
    Example 1
    Problem: You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list. You may assume the two numbers do not contain any leading zero, except the number 0 itself.
    Output:
    class Solution(object):
    def addTwoNumbers(self, l1, l2):
    carry = 0
    root = n = ListNode(0)
    while l1 or l2 or carry:
    v1 = v2 = 0
    if l1:
    v1 = l1.val
    l1 = l1.next
    if l2:
    v2 = l2.val
    l2 = l2.next
    carry, val = divmod(v1+v2+carry, 10)
    n.next = ListNode(val)
    n = n.next
    return root.next

    Task: Solve the equation and find the value of X. Show your steps.
    Example 1
    Equation: 10X + 5 = 10
    Output: 10X = 5, X = 0.5
    Example 2
    Equation: X + Y + 120 = 100
    Output: X + Y = -20, X = -20 - Y

    Task: Write a program to compute the sum of integers from k to n.
    Output:
    def sum(k, n):
    sum = 0
    for i in range(k, n+1):
    sum += i
    return sum

    Task: Select the oldest person from the given list.
    Example 1
    List: George Washington, Confucius, Michael Jordan, Michelangelo
    Output: Confucious
    Example 2
    List: Alan Turing, Geoffrey Hinton, Yann LeCun, Yoshua Bengio
    Output: Alan Turing

    Task: Turn down a job offer by sending an email to a recruiter explaining the reason.
    Output: Hi [Recruiter],
    Thank you so much for the generous offer to join your team. As we discussed, I've admired the company for a number of years, and am a proud endorser of its products. However, after further consideration of where I currently am in my career, I've decided to accept an offer at another company.
    I would love to stay in touch with you and have already started following you on [Social Media Platform]. Again, thank you so much for your time and consideration.
    Thanks again,
    [Your Name]

    Task: {Instruction for the target task}

  • 对于分类任务,采用Output-first Approach,先生成一个可能的类别标签,再在类别标签的条件下生成input,prompt模板如下(Table 8):

    Given the classification task definition and the class labels, generate an input that corresponds to each of the class labels. If the task doesn't require input, just generate possible class labels.

    Task: Classify the sentiment of the sentence into positive, negative, or mixed.
    Class label: mixed
    Sentence: I enjoy the flavor of the restaurant but their service is too slow.
    Class label: Positive
    Sentence: I had a great day today. The weather was beautiful and I spent time with friends and family.
    Class label: Negative
    Sentence: I was really disappointed by the latest superhero movie. I would not recommend it to anyone.

    Task: Given a dialogue, classify whether the user is satisfied with the service. You should respond with "Satisfied" or "Unsatisfied".
    Class label: Satisfied
    Dialogue:

    • Agent: Thank you for your feedback. We will work to improve our service in the future.
    • Customer: I am happy with the service you provided. Thank you for your help.
      Class label: Unsatisfied
      Dialogue:
    • Agent: I am sorry we will cancel that order for you, and you will get a refund within 7 business days.
    • Customer: oh that takes too long. I want you to take quicker action on this.

    Task: Given some political opinions, classify whether the person belongs to Democrats or Republicans.
    Class label: Democrats
    Opinion: I believe that everyone should have access to quality healthcare regardless of their income level.
    Class label: Republicans
    Opinion: I believe that people should be able to keep more of their hard-earned money and should not be taxed at high rates.

    Task: Tell me if the following email is a promotion email or not.
    Class label: Promotion
    Email: Check out our amazing new sale! We've got discounts on all of your favorite products.
    Class label: Not Promotion
    Email: We hope you are doing well. Let us know if you need any help.

    Task: Detect if the Reddit thread contains hate speech.
    Class label: Hate Speech
    Thread: All people of color are stupid and should not be allowed to vote.
    Class label: Not Hate Speech
    Thread: The best way to cook a steak on the grill.

    Task: Does the information in the document supports the claim? You can answer "Support" or "Unsupport".
    Class label: Unsupport
    Document: After a record-breaking run that saw mortgage rates plunge to all-time lows and home prices soar to new highs, the U.S. housing market finally is slowing. While demand and price gains are cooling, any correction is likely to be a modest one, housing economists and analysts say. No one expects price drops on the scale of the declines experienced during the Great Recession.
    Claim: The US housing market is going to crash soon.
    Class label: Support
    Document: The U.S. housing market is showing signs of strain, with home sales and prices slowing in many areas. Mortgage rates have risen sharply in recent months, and the number of homes for sale is increasing. This could be the beginning of a larger downturn, with some economists predicting a potential housing crash in the near future.
    Claim: The US housing market is going to crash soon.

    Task: Answer the following multiple-choice question. Select A, B, C, or D for the final answer.
    Class label: C
    Question: What is the capital of Germany?
    A. London
    B. Paris
    C. Berlin
    D. Rome
    Class label: D
    Question: What is the largest planet in our solar system?
    A) Earth
    B) Saturn
    C) Mars
    D) Jupiter
    Class label: A
    Question: What is the process by which plants make their own food through photosynthesis?
    A) Respiration
    B) Fermentation
    C) Digestion
    D) Metabolism
    Class label: B
    Question: Who wrote the novel "The Great Gatsby"?
    A) Ernest Hemingway
    B) F. Scott Fitzgerald
    C) J.D. Salinger
    D) Mark Twain

    Task: You need to read a code and detect if there is a syntax error or not. Output true if there is an error, output false if there is not.
    Class label: true
    Code:
    def quick_sort(arr):
    if len(arr) < 2
    return arr
    Class label: False
    Code:
    def calculate_average(numbers):
    total = 0
    for number in numbers:
    total += number
    return total / len(numbers)

    Task: You are provided with a news article, and you need to identify all the categories that this article belongs to. Possible categories include Sports and Politics. Output its categories one by one, separated by a comma.
    Class label: Sports
    Article: The Golden State Warriors have won the NBA championship for the second year in a row.
    Class label: Politics
    Article: The United States has withdrawn from the Paris Climate Agreement.
    Class label: Politics, Sports
    Article: The government has proposed cutting funding for youth sports programs.

    Task: Given a credit card statement, the cardholder's spending habits, and the account balance, classify whether the cardholder is at risk of defaulting on their payments or not.
    Class label: At risk
    Credit card statement: Purchases at high-end clothing stores and luxury hotels.
    Cardholder's spending habits: Frequent purchases at luxury brands and high-end establishments.
    Account balance: Over the credit limit and multiple missed payments.
    Class label: Not at risk
    Credit card statement: Purchases at grocery stores and gas stations.
    Cardholder's spending habits: Regular purchases for necessary expenses and occasional dining out.
    Account balance: Slightly below the credit limit and no missed payments.

    Task: Given a social media post, the hashtags used, and a topic. classify whether the post is relevant to the topic or not.
    Class label: Relevant
    Post: I can't believe the government is still not taking action on climate change. It's time for us to take matters into our own hands.
    Hashtags: #climatechange #actnow
    Topic: Climate change
    Class label: Not relevant
    Post: I just bought the new iPhone and it is amazing!
    Hashtags: #apple #technology
    Topic: Travel

    Task: The answer will be 'yes' if the provided sentence contains an explicit mention that answers the given question. Otherwise, answer 'no'.
    Class label: Yes
    Sentence: Jack played basketball for an hour after school.
    Question: How long did Jack play basketball?
    Class label: No
    Sentence: The leaders of the Department of Homeland Security now appear before 88 committees and subcommittees of Congress.
    Question: How often are they required to appear?

    Task: Tell me what's the second largest city by population in Canada.
    Class label: Montreal

    Task: Classifying different types of mathematical equations, such as linear, and quadratic equations, based on the coefficients and terms in the equation.
    Class label: Linear equation
    Equation: y = 2x + 5
    Class label: Quadratic equation
    Equation: y = x^2 - 4x + 3

    Task: Tell me the first number of the given list.
    Class label: 1
    List: 1, 2, 3
    Class label: 2
    List: 2, 9, 10

    Task: Which of the following is not an input type? (a) number (b) date (c) phone number (d) email address (e) all of these are valid inputs.
    Class label: (e)

    Task: {Instruction for the target task}

  1. 过滤和后处理
    为了保证指令的多样性,一个指令只有与任务池中已有的指令的ROUGE-L小于0.7才会被考虑加入到任务池,同时过滤掉包含一些特殊词(如image/picture/graph等)的生成指令,因为这些指令LLM还不会处理。(注:虽然过滤是在论文中的第四个步骤,但是代码实现时,对于指令的过滤是在第一步生成指令的时候就过滤了不满足要求的指令,当任务池中的指令达到生成数量比如52k后就停止第一步的指令生成
python 复制代码
## 开源代码 https://github.com/yizhongw/self-instruct/blob/main/self_instruct/bootstrap_instructions.py#L41C1-L71C1
def post_process_gpt3_response(response):
    if response is None or response["choices"][0]["finish_reason"] == "length":
        return []
    raw_instructions = re.split(r"\n\d+\s?\. ", response["choices"][0]["text"])
    instructions = []
    for inst in raw_instructions:
        inst = re.sub(r"\s+", " ", inst).strip()
        inst = inst.strip().capitalize()
        if inst == "":
            continue
        # filter out too short or too long instructions
        if len(inst.split()) <= 3 or len(inst.split()) > 150:
            continue
        # filter based on keywords that are not suitable for language models.
        if any(find_word_in_string(word, inst) for word in ["image", "images", "graph", "graphs", "picture", "pictures", "file", "files", "map", "maps", "draw", "plot", "go to"]):
            continue
        # We found that the model tends to add "write a program" to some existing instructions, which lead to a lot of such instructions.
        # And it's a bit comfusing whether the model need to write a program or directly output the result. 
        # Here we filter them out.
        # Note this is not a comprehensive filtering for all programming instructions.
        if inst.startswith("Write a program"):
            continue
        # filter those starting with punctuation
        if inst[0] in string.punctuation:
            continue
        # filter those starting with non-english character
        if not inst[0].isascii():
            continue
        instructions.append(inst)
    return instructions

对于生成的实例,过滤掉重复的、过滤掉与相同input不同output的实例。并用启发式方法识别和过滤掉一些实例,比如是否太长、是否太短、输出是输入的重复等。

python 复制代码
## 论文开源代码 https://github.com/yizhongw/self-instruct/blob/main/self_instruct/prepare_for_finetuning.py#L110C1-L192C1
def filter_duplicate_instances(instances):
    # if the instances have same non-empty input, but different output, we will not use such instances
    same_input_diff_output = False
    for i in range(1, len(instances)):
        for j in range(0, i):
            if instances[i][1] == "":
                continue
            if instances[i][1] == instances[j][1] and instances[i][2] != instances[j][2]:
                same_input_diff_output = True
                break
    if same_input_diff_output:
        return []

    # remove duplicate instances
    instances = list(set(instances))
    return instances

def filter_invalid_instances(instances):
    filtered_instances = []
    for instance in instances:
        # if input and output are the same, we will not use such instances
        if instance[1] == instance[2]:
            continue
        # if output is empty, we will not use such instances
        if instance[2] == "":
            continue
        # if input or output ends with a colon, these are usually imcomplete generation. We will not use such instances
        if instance[1].strip().endswith(":") or instance[2].strip().endswith(":"):
            continue
        filtered_instances.append(instance)
    return filtered_instances

def parse_instances_for_generation_task(raw_text, instruction, response_metadata):
    instances = []
    raw_text = raw_text.strip()
    if re.findall("Example\s?\d*\.?", raw_text):
        instance_texts = re.split(r"Example\s?\d*\.?", raw_text)
        instance_texts = [it.strip() for it in instance_texts if it.strip() != ""]
        for instance_text in instance_texts:
            inst_input, inst_output = parse_input_output(instance_text)
            instances.append((instruction.strip(), inst_input.strip(), inst_output.strip()))
    elif re.findall(r"Output\s*\d*\s*:", raw_text):
        # we assume only one input/output pair in this case
        inst_input, inst_output = parse_input_output(raw_text)
        instances.append((instruction.strip(), inst_input.strip(), inst_output.strip()))
    else:
        return []
    # if the generation stops because of length, we remove the last instance
    if response_metadata["response"]["choices"][0]["finish_reason"] == "length":
        instances = instances[:-1]
    
    instances = filter_invalid_instances(instances)
    instances = filter_duplicate_instances(instances)
    return instances

def parse_instances_for_classification_task(raw_text, instruction, response_metadata):
    instances = []
    if not "Class label:" in raw_text:
        return []
    instance_texts = raw_text.split("Class label:")[1:]
    for instance_text in instance_texts:
        instance_text = instance_text.strip()
        fields = instance_text.split("\n", 1)
        if len(fields) == 2:
            # the first field split by \n is the class label
            class_label = fields[0].strip()
            # the rest is the input
            input_text = fields[1].strip()
        elif len(fields) == 1:
            # the first field split by \n is the input
            class_label = fields[0].strip()
            input_text = ""
        else:
            raise ValueError("Invalid instance text: {}".format(instance_text))
        instances.append((instruction.strip(), input_text.strip(), class_label.strip()))

    # if the generation stops because of length, we remove the last instance
    if response_metadata["response"]["choices"][0]["finish_reason"] == "length":
        instances = instances[:-1]
    instances = filter_invalid_instances(instances)
    instances = filter_duplicate_instances(instances)
    return instances

Vicuna

介绍:

  • Vicuna为LLaMA使用对话数据有监督微调后的一个ChatBot(7B & 13B)
  • Vicuna是由UC Berkeley大学主导开发的,精调过程中使用了大量用户分享的ShareGPT对话数据
  • Vicuna宣称自己拥有"ChatGPT 90%的能力"。

训练:

  • 研究人员从ShareGPT(一个供用户分享ChatGPT对话内容的网站)收集了约7万个对话,并增强了Alpaca提供的训练脚本,以更好地处理多轮对话和长序列;
  • 训练是在一天内通过8卡A100 GPU配合PyTorch FSDP进行的full fine-tune
  • 为了提供演示服务,Vicuna研究人员建立了一个轻量级的分布式服务系统
  • 创建了八个问题类别(如:角色扮演、编码/数学任务等)的80个不同问题,利用GPT-4来判断模型输出,借此对模型质量做初步评估。为了比较两个不同的模型,Vicuna研究人员将每个模型的输出组合成每个问题的单个提示。然后将提示发送到GPT-4,GPT-4评估哪个模型提供更好的响应。

总结:

模型 LLaMA Alpaca Vicuna
数据集 公开可用的数据集 (1T token) Self-instruct from davinci- 003 API (52K samples) 用户共享对话 (70K samples)
训练代码 未开源 开源 开源
评估指标 Academic benchmark self-instruct evaluation GPT-4
训练费用(7B) 82K GPU-hours $500 (data) + $100 (training) $140 (training)
训练费用(13B) 135K GPU-hours N/A $300 (training)

LLaMA-2

介绍:

  • Llama 2模型提供7B、13B和70B三个版本,使用2万亿个token训练,上下文长度是Llama 1的两倍。Llama-2-chat模型还接受了超过10万条SFT数据训练和100万个人类偏好数据训练
  • Llama 2训练语料相比LLaMA多出40%,上下文长度是由之前的2048升级到4096,可以理解和生成更长的文本。

训练:Llama 2使用公开数据集进行预训练,然后通过SFT进行有监督训练,最后使用RLHF进行迭代细化

训练语料:Llama 2的训练语料中中文占比0.13%,因此中文支持依然较差

损失函数:

不同数据集上的效果:

LLaMA-3

Baichuan

Baichuan-1

介绍:

  • baichuan-7B是由百川智能开发的一个开源的大规模预训练模型。基于Transformer结构,在大约1.2万亿tokens上训练的70亿参数模型,支持中英双语上下文窗口长度为4096。在标准的中文和英文权威benchmark(C-EVAL/MMLU)上均取得同尺寸最好的效果。
  • 不同于LLaMA完全禁止商业使用,baichuan-7B使用更宽松的开源协议,允许用于商业目的。

数据集:

原始数据包括开源的中英文数据和自行抓取的中文互联网数据,以及部分高质量知识性数据。

参考相关数据工作,频率质量是数据处理环节重点考虑的两个维度。我们基于启发式规则和质量模型打分,对原始数据集进行篇章和句子粒度的过滤在全量数据上,利用局部敏感哈希方法,对篇章和句子粒度做滤重

  • 经过不断的调整和多轮测试,最终确认了一个在下游任务上表现最好的中英文配比。
  • 使用了一个基于自动学习的数据权重策略,对不同类别的数据进行配比。

分词:

分词使用SentencePiece中的Byte-Pair Encoding (BPE)作为分词算法,并且进行了以下的优化:

  • 使用2000万条以中英为主的多语言语料训练分词模型,显著提升对于中文的压缩率。
  • 对于数学领域,参考了LLaMA和Galactica中的方案,对数字的每一位单独分开,避免出现数字不一致的问题,对于提升数学能力有重要帮助。
  • 对于罕见字词(如特殊符号等),支持UTF-8 characters的byte编码,因此做到未知字词的全覆盖。

模型结构:

  • rotary-embedding
  • 激活层采用SwiGLUFeedforward变化为8/3倍的隐含层大小,即11,008
  • 基于RMSNorm的Pre-Normalization

Baichuan在千卡A800显卡上达到了7B模型182 TFLOPS的吞吐,GPU峰值算力利用率高达58.3%。

Baichuan-2

介绍:

baichuan2基于2.6万亿tokens训练,上下文窗口长度为4096。提供7B和13B参数的Base和Chat版本,在多个权威的中文、英文和多语言的通用、领域benchmark上取得同尺寸最佳的效果。


数据源:

Baichuan2的数据来自多种来源,包括普通的互联网网页、书籍、研究论文、代码库等,以构建一个广泛的世界知识系统。


模型结构:

  • 位置编码
    • Baichuan2在其7B版本中采用了旋转位置嵌入(Rotary Positional Embedding, RoPE)
    • Baichuan2在其13B版本中,采用了ALiBi(由Press等人于2021年提出)。ALiBi是一个较新的位置编码技术,已经显示出了改进的外推性能
  • Baichuan2使用SwiGLU作为激活函数。
  • Baichuan2采用了由xFormers2实现的内存高效注意力。
  • Baichuan2使用了Layer Normalization,采用RMSNorm实现。

模型训练:

Baihuan2的超参数设置:

  • 训练时使用了AdamW优化器,其中β1设置为0.9,β2设置为0.95;
  • 使用了0.1的权重衰减,并将梯度范数裁剪到0.5
  • 模型的学习率首先经过2,000步的线性缩放预热到最大学习率,然后应用余弦衰减到最小学习率;
  • 整个模型使用BFloat16混合精度进行训练;

ChatGLM

ChatGLM-1

介绍:

ChatGLM模型是由清华大学开源的、支持中英双语问答的对话语言模型,并针对中文进行了优化。该模型基于General Language Model(GLM)架构,具有62亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署


模型:

  • GLM-130B在一个由96个NVIDIA DGX-A100(8 * 40G)GPU节点组成的集群上进行训练,每个节点有8张A100 GPU,每张GPU负责1.35亿个参数;
  • GLM-130B使用了ZeRO作为优化器,它可以有效地减少显存占用和通信开销,提高训练效率;
  • GLM-130B使用了混合精度训练(Mixed Precision Training)和梯度累积(GradientAccumulation)提高训练速度和稳定性;
  • GLM-130B的总参数量是1300亿,其中编码器占了60%,解码器占了40%;
  • GLM-130B使用了字节对编码(BPE)作为词表,共有50万个词,其中25万个是英语词,25万个是汉语词。

模型评估:

  • 英文:
  • 中文:
  • 准确性、鲁棒性、公平性:

GLM原理:

GLM要一统天下,只需要同时存在单向注意力和双向注意力即可。而在Transformer中,这两种注意力机制是通过修改attention mask实现的。

  • attention_mask是全1矩阵的时候,这时注意力是双向的(Encoder)
  • attention_mask是三角矩阵的时候(Deccoder中Masked Multi-head Attention),注意力就是单向

GLM uses a single Transformer with several modifications to the architecture: (1) werearrange the order of layer normalization and the residual connection, which has beenshown critical for large-scale language models to avoid numerical errors (Shoeybi et al.,2019); (2) we use a single linear layer for the output token prediction; (3) we replace ReLUactivation functions with GeLUs (Hendrycks and Gimpel, 2016).

GLM使用单个Transformer,并对架构进行了多项修改:

  • 修改了Layer-normalization和残差连接的顺序;
  • 使用单个线性层进行输出标记预测;
  • 用GeLU替换ReLU激活函数。

GLM提出一个Autoregressive Blank Infifilling任务,来兼容三种预训练目标。

自回归空格填充类似MLM任务,将输入的部分内容替换为[MASK]标记,然后预测[MASK]所对应的文本片段。与MLM不同的是,预测的过程是采用自回归的方式。


GLM预训练阶段:

预训练阶段,选择掩码较长的文本片段,以确保GLM的文本生成能力,并在微调阶段将自然语言理解任务也转化为生成任务

作者使用了两个预训练目标来优化GLM,两个目标交替进行:

  • 文档级别:从文档中随机采样一个文本片段进行掩码,片段的长度为文档长度的50%-100%。
  • 句子级别:从文档中随机掩码若干文本片段,每个文本片段必须为完整的句子,被掩码的词数量为整个文档长度的15%。

GLM微调:

为了适应预训练的目标,微调阶段的NLU任务转化为Prompt-Tuning形式,如下图所示:


GLM评估:

GLM消融实验:

ChatGLM-2

  • 介绍:ChatGLM2-6B是开源中英双语对话模型ChatGLM-6B的第二代版本
  • 特性:
    • 保留了初代模型对话流畅、部署门槛较低等众多优秀特性
    • ChatGLM2-6B使用了GLM的混合目标函数,经过了1.4T中英标识符的预训练与人类偏好对齐训练
  • 评测结果:相比于初代模型,ChatGLM2-6B在MMLU(+23%)、CEval(+33%)、GSM8K(+571%)、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺寸开源模型中具有较强的竞争力。
  • 改进:
    • 更长的上下文:基于FlashAttention技术,将基座模型的上下文长度(Context Length)由ChatGLM-6B的2K扩展到了32K,并在对话阶段使用8K的上下文长度训练,允许更多轮次的对话。但当前版本的ChatGLM2-6B对单轮超长文档的理解能力有限,会在后续迭代升级中着重进行优化。
    • 更高效的推理:基于Multi-Query Attention技术,ChatGLM2-6B有更高效的推理速度和更低的显存占用
      • 在官方的模型实现下,推理速度相比初代提升了42%,INT4量化下,6G显存支持的对话长度由1K提升到了8K。

ChatGLM-3

介绍:ChatGLM3-6B是ChatGLM系列最新一代的开源模型,在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上,ChatGLM3-6B引入了如下特性:

  • 更强大的基础模型:ChatGLM3-6B的基础模型ChatGLM3-6B-Base采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、数学、推理、代码、知识等不同角度的数据集上测评显示,ChatGLM3-6B-Base具有在10B以下的预训练模型中最强的性能。
  • 更完整的功能支持:ChatGLM3-6B采用了全新设计的Prompt格式,除正常的多轮对话外。同时原生支持工具调用(Function Call)、代码执行(Code Interpreter)和Agent任务等复杂场景。
  • 更全面的开源序列:除了对话模型ChatGLM3-6B外,还开源了基础模型ChatGLM-6B-Base、长文本对话模型ChatGLM3-6B-32K。以上所有权重对学术研究完全开放,在填写问卷进行登记后亦允许免费商业使用。

强化学习(第五周)

🔗三分钟快速入门:什么是强化学习(Reinforcement Learning)?

🔗深度学习:强化学习的数学原理

大模型(第六周)

大模型与人工智能

生命

著名学者马克斯·沃格特在《生命3.0》一书中,为我们描绘了未来智能时代的美好蓝图,并提出了实现这一蓝图的具体路径。

核心观点:

  • 生命1.0:基于DNA的生物生命,经历了数十亿年的发展,形成了丰富多样的生物圈。
  • 生命2.0:基于人类大脑的智能生命,在过去几千年里取得了巨大的进步,创造了灿烂的人类文明。
  • 生命3.0:基于人工智能的超智能生命,将超越人类智能,引领人类进入一个全新的时代。

沃格特认为,人工智能的出现,标志着生命进化的下一个阶段的到来。人工智能将拥有超越人类的强大能力,能够解决人类目前无法解决的难题,创造更加美好的未来。

人工智能

人工智能的三个子阶段:

  • AI-1.0
    • 特点:
      • 任务特定性:AI 1.0主要专注于处理特定任务,如图像识别、自然语言处理等。这些技术在各自领域内表现出色,并已成为我们日常生活的一部分。
      • 规则驱动:在这一阶段,AI系统通常依赖于人为编写的规则和算法来执行任务。例如,早期的机器翻译系统通过人为地编写翻译规则和配备词典来实现翻译功能。
    • 应用:微信扫一扫的图像识别、语音转文字功能等
  • AI-2.0
    • 特点:
      • 通用任务处理能力:AI 2.0开始展现出处理通用任务的能力。大语言模型(如ChatGPT、文心一言)能够回答各种问题,几乎无所不知。
      • 深度学习与自我学习:AI 2.0利用深度学习和大规模数据集,使AI系统能够自动学习并优化其性能,而无需过多的人工干预。
      • 内容生成能力:除了处理信息外,AI 2.0还擅长生成内容,如创作文学、绘画和音乐作品。
    • 应用:ChatGPT、文心一言、Kimi等
  • AI-3.0(未达成)
    • 特点:
      • 自主智能与自我进化:AI 3.0将实现更高的自主性和自我进化能力。AI系统将能够在复杂和多变的环境中自我学习和调整策略,以适应新的任务和挑战。
      • 群体智能与协同工作:人机协同将催生新型融合智能形态,AI系统将不再是孤立的个体,而是能够与其他智能体(包括人类)协同工作,形成群体智能。

通用人工智能(AGI, Artificial General Intelligence):具备与人类同等智能、或超越人类的人工智能,能表现正常人类所具有的所有智能行为。

大模型

大模型(Foundation Model )

  • 定义:The base models trained on large-scale data in a self-supervised or semi-supervised manner that can be adapted for several other downstream tasks.
  • 分类
    • 大语言模型(Large Language Model):用于大规模语料库上进行了训练,以学习自然语言的各种语法、语义和语境规则。例如:GPT 系列(OpenAI)、Bard(Google)、文心一言(百度)处理文本数据和理解自然语言。
    • 视觉大模型(Visual Foundation Model):用于在大规模图像数据上进行训练,可以实现各种视觉任务,如图像分类、目标检测、图像分割、姿态估计、人脸识别等。例如:VIT 系列(Google)、文心UFO、华为盘古 CV、INTERN(商汤)
    • 多模态大模型(Multimodal Models):这类模型结合了 NLP 和 CV 的能力,以实现对多模态信息的综合理解和分析,从而的数据。例如:DingoDB 多模向量能够更全面地理解和处理复杂数据库(九章云极 DataCanvas)、DALL-E(OpenAI)、悟空画画(华为)、midjourney
  • 缺陷
    • 知识局限性:缺少垂直领域/非公开知识
    • 知识实时性:训练周期长、成本高
    • 幻觉问题:模型生成的内容与现实世界事实或用户输入不一致

大语言模型发展史

  • 大语言模型时间线
    • 论文名称:Harnessing the Power of LLMs in Practice A Survey on ChatGPT and Beyond,2023
    • 论文作者:Jingfeng Yang, Hongye Jin, et al.
    • 分类
      • Bert派:取自Transformer的编码器,采用掩码语言模型(MLM)和下一句预测(NSP)等任务进行预训练,本质:高维数据压缩到低维空间
      • T5派:以解决seq2seq问题的编码器-解码器架构为基础的预训练模型,本质:一个 Transformer 的 Encoder-Decoder 模型
      • GPT派:GPT取自Tranformer的解码器,采用生成式预训练, 具有自回归特性。本质:学习词与词之间的造句关系,搜索空间相对较小
  • NLP发展的四大范式:
    • P1非神经网络时代的完全监督学习(Fully Supervised Learning, Non-Neural Network)
      • 特征工程(Feature Engineering):需要进行"繁琐且无聊"的特征模板定义
    • P2基于神经网络的完全监督学习(Fully Supervised Learning, Neural Network)
      • 结构工程(Architecture Engineering):神经网络虽然不再需要特征工程,但是是以需要人工去设计性能更优异的网络结构为代价的。
    • P3预训练,精调范式(Pre-train, Fine-tune)
      • 目标函数挖掘(Objective Engineering):这个过程研究者往往是通过引入额外的目标函数到预训练语言模型上,以便让其更适配下游任务。这个过程有时候也需要些网络结构的挖掘,但相比较而言,不是这个范式的主要任务。
      • Pre-trained Model + finetuning的缺陷:
        • 零样本/少样本学习能力差;
        • 模型专用性导致成本高昂的大规模预训练语言模型,无法通用到不同任务;
    • P4预训练,提示,预测范式(Pre-train, Prompt, Predict)
      • Prompt挖掘工程(Prompt Engineering):在这个过程往往不对预训练语言模型改动太多,针对下游任务构建合适的Prompt
  • 预训练语言模型的发展阶段
    • 第一阶段:Pre-training + Fine-tuning阶段,基于Transformer,通过自监督任务进行预训练,任务数据进行微调。典型代表是BERT、GPT、XLNet等;
    • 第二阶段:逐步扩大模型参数和训练语料规模,探索不同类型的架构。典型代表是BART、T5、GPT-3等;
    • 第三阶段:AIGC(Artificial Intelligent Generated Content)初期,模型参数规模步入千万亿级别,大模型走向对话式、生成式、多模态时代,更加注重与人类交互进行对齐,实现可靠、安全、无毒的模型。典型代表是InstructionGPT、ChatGPT、Bard、GPT-4等。
  • 主流开源大语言模型:BaiChuan、Meta、ChatGLM、Bloom、Alpaca

微调

  • 定义:通过特定领域数据对预训练模型进行针对性优化,以提升其在特定任务上的性能。
  • 步骤:在选定相关数据集和预训练模型的基础上,通过设置合适的超参数并对模型进行必要的调整,使用特定任务的数据对模型进行训练以优化其性能。
  • 分类
    • 全量微调(Full Fine-Tuning):全量微调利用特定任务数据调整预训练模型的所有参数,以充分适应新任务。它依赖大规模计算资源,但能有效利用预训练模型的通用特征
    • 参数高效微调(Parameter-Efficient Fine-Tuning, PEFT):通过最小化微调参数数量和计算复杂度,实现高效的迁移学习。它仅更新模型中的部分参数,显著降低训练时间和成本,适用于计算资源有限的情况。
      • Prefix Tuning
        • 方法:在输入前添加可学习的virtual tokens作为Prefix。
        • 特点:仅更新Prefix参数,Transformer其他部分固定。
        • 优点:减少需要更新的参数数量,提高训练效率。
      • Prompt Tuning
        • 方法:在输入层加入prompt tokens。
        • 特点:简化版的Prefix Tuning,无需MLP调整。
        • 优点:随着模型规模增大,效果接近full fine-tuning。
      • P-Tuning
        • 方法:将Prompt转换为可学习的Embedding层,并用MLP+LSTM处理。
        • 特点:解决Prompt构造对下游任务效果的影响。
        • 优点:提供更大的灵活性和更强的表示能力。
      • P-Tuning v2
        • 方法:在多层加入Prompt tokens。
        • 特点:增加可学习参数数量,对模型预测产生更直接影响。
        • 优点:在不同任务和模型规模上实现更好的性能。
      • Adapter Tuning
        • 方法:设计Adapter结构并嵌入Transformer中。
        • 特点:仅对新增的Adapter结构进行微调,原模型参数固定。
        • 优点:保持高效性的同时引入少量额外参数。
      • LoRA
        • 方法:在矩阵相乘模块中引入低秩矩阵来模拟full fine-tuning。
        • 特点:更新语言模型中的关键低秩维度。
        • 优点:实现高效的参数调整,降低计算复杂度。
  • 影响因素:
    • 数据质量对微调效果的影响
      • 数据质量对大模型微调效果影响很大,因此,在组织数据阶段,尽可能对数据进行过滤和人工校验,保证各个来源的数据尽可能干净,因此,收集高质量问题,使用ChatGPT接口生成数据会是一个不错的选择。
      • 重复数据对于大模型微调也有较大影响,数据集必须去重后再用于模型训练。
      • 大规模多任务数据集主要用于基座模型构建阶段,基座模型训练完成后,使用高质量垂域数据再对垂域模型进行训练。

Prompt-Tuning

Prompt :

  • 定义:Prompt是一种为了更好的使用预训练语言模型的知识,采用在输入段添加额外的文本的技术。(Prompt is the technique of making better use of the knowledge from the pre-trained modelby adding additional texts to the input.)
  • 目的:给预训练语言模型的一个线索/提示,帮助它可以更好的理解人类的问题。
  • Prompt的工作流:
    • Prompt模版(Template)的构造;
    • Prompt答案空间映射(Verbalizer)的构造;
    • 文本代入template,并且使用预训练语言模型进行预测
    • 将预测的结果映射回label
  • Prompt 设计:
    • Template的设计,对于Prompt的最终效果有着巨大的影响
      • Template分类:
        • 1.根据slot的位置区分:
          • ①Cloze:完形填空的模式,即未知的slot在template的中间等不定的位置。
          • ②Prefix:未知的slot在template的开头。
        • 2.根据制定方式区分:
          • ①Discrete Template:离散的模板构建,也称硬模板,旨在直接与原始文本拼接显式离散的字符,且在训练中始终保持不变,即这些离散字符的词向量在训练中保持固定,不引入额外参数。
          • ②Continuous Template:连续的模板构建,也成软模板,在让模型在训练过程中根据具体的上下文语义和任务目标对模板参数进行连续可调,引入少量额外参数。

Prompt设计:

  1. Prompt常规格式:定义角色+说明要求+罗列限制+ few shot +指定输出格式
  2. Prompt迭代策略:有的任务使用简单直接的Prompt就可以达到很好的效果,有的任务需要设计针对性的Prompt并且多次迭代后才能达到预期效果,因此建议先尝试简单Prompt效果,再进入Prompt设计迭代
  3. 借助GPT-4优化Prompt:可以让GPT-4进行Prompt的优化或者提供适合任务的Prompt示例
  4. Prompt优秀示例:https://github.com/yzfly/wonderful-prompts

Prompt Tuning(提示学习):

  • 大白话理解:你大妈已经不是你6年前的大妈了(下游任务数据组织形式),你大爷永远是你大爷(Pretrained Model)。------ 黑土
  • 本质:
    • 下游任务重构,与预训练任务高度一致
    • 以特定的模板,将下游任务的数据组装成自然语言形式,充分挖掘预训练模型本身的能力;

在Prompt-Tuning中,我们可以通过将下游任务构建成完形填空的形式来消除预训练任务与SFT任务之间的语义偏差,并可以基于强大的预训练模型实现zero-shot和few-shot。

对于自回归模型(LM),也可以进行下游任务的改造,不过由于语言模型是从左往右解码的,因此预测部分只能放在句末:

Instruction-Tuning

  • 论文名称:Finetuned Language Models Are Zero-shot Learners,2021
  • 论文地址:https://arxiv.org/pdf/2109.01652.pdf
  • 论文代码:https://github.com/google-research/flan
  • 论文作者:Jason Wei, Maarten Bosma, et al.
  • 关键词和摘要总结:
    • 关键词:Zero-Shot Learning、Instruction Tuning、FLAN
    • 摘要总结:提出了一种通过Instruction Tuning来提升语言模型零样本学习能力的方法
  • 研究设计和结论
    • 问题: 如何提升大型语言模型在零样本学习任务上的表现
    • 方法:
      • 指令调优:在超过60个通过自然语言指令模板描述的NLP数据集上进行微调
      • 模型选择:采用137B参数的预训练语言模型LaMDA-PT,微调得到FLAN模型(Finetuned Language Net)
      • 评估方法:将NLP数据集按任务类型分组,保留每个组进行评估,同时在所有其他组上进行指令调优
    • 实验结果:
      • 消融实验:通过三组消融实验表明,更多样化的NLP任务,足够体量的模型以及instruction tuning的使用,是FLAN取得良好效果的关键因素。
  • 论文贡献:
    • 优点:提高大规模语言模型执行zero-shot 任务的能力,在多个数据集上超越了现有的大型语言模型,如GPT-3。
    • 缺点:
      • 模型规模限制:微调效果在大型模型上更显著,小型模型可能无法从中受益
      • 任务类型限制: 对于某些任务(如基于语言建模的任务),微调可能不会带来显著提升。

总结:

  • Prompt-tuning:先选择某个通用的大规模预训练模型,然后为具体的任务生成一个prompt模板以适应大模型进行微调,如GPT-3;【激发语言模型的补全能力
  • Instruction-tuning:仍然在预训练语言模型的基础上,先在多个已知任务上进行微调(通过自然语言的形式),然后再推理某个新任务上进行zero-shot。【激发语言模型的理解能力

P-tuning

  • 介绍:P-tuning重新审视了关于模版的定义,放弃了"模版由自然语言构成"这一常规要求,从而将模版的构建转化为连续参数优化问题,虽然简单,但却有效。
  • 大白话理解:我们并不关心模版长什么样,我们只需要知道模版由哪些token组成,该插入到哪里插入后能不能完成我们的下游任务输出的候选空间是什么。模版是不是自然语言组成的,对我们根本没影响,"自然语言"的要求,只是为了更好地实现"一致性",但不是必须的。
  • 模板:这里的[u1]~[u6],代表BERT词表里边的[unused1]~[unused6],也就是用几个从未见过的token来构成模板,这里的token数目是一个超参数,放在前面还是后面也可以调整。接着,为了让"模版"发挥作用,我们用标注数据来求出这个模板。
  • 模型参数的优化:
    • 标注数据比较少:这种情况下,我们固定整个模型的权重,只优化[unused1]~[unused6]这几个token的Embedding,换句话说,其实我们就是要学6个新的Embedding,使得它起到了模版的作用。这样一来,因为模型权重几乎都被固定住了,训练起来很快,而且因为要学习的参数很少,因此哪怕标注样本很少,也能把模版学出来,不容易过拟合。
    • 标注数据很充足:这时候如果还按照第一种的方案来,就会出现欠拟合的情况,因为只有6个token的可优化参数实在是太少了。因此,可以放开所有权重微调,原论文在SuperGLUE上的实验就是这样做的。
      • 原因:在原论文中,P-tuning并不是随机初始化几个新token然后直接训练的,如果随机初始化virtual token,容易优化到局部最优值,而这些virtual token理论是应该有相关关联的(自然语言的相关性)。
      • 方法:论文中通过LSTM+MLP模型把这几个token的Embedding算出来,并且将这个LSTM模型设为可学习的,效果显示这样做模型收敛更快、效果更优。
      • 效果:
      • 当预训练模型足够大的时候,我们的设备可能无法finetune整个模型,而P-tuning可以选择只优化几个Token的参数,因为优化所需要的显存和算力都会大大减少,所以P-tuning实则上给了我们一种在有限算力下调用大型预训练模型的思路。

Adapter

  • 介绍:为了提高效率,该方法提出固定Transformer的全部参数,然后在Transformer的每一个Block里嵌入一些新初始化的Adapter Network
  • Adapter位于Feed-Forward Layer之后、残差连接之前。Adapter本质上就是两层MLP,分别负责将Transformer的表征降维和升维。
  • 效果:
    • 时间有效性:基于Adapter的方法,只需要添加不到5%的可训练参数,即可以几乎达到全参数训练的效果,在训练过程中大大节省了训练时间,做到时间有效性
    • 空间有效性:在真实场景应用时,不同的任务我们不需要重新对整个预训练模型进行微调,我们只需要保存Adapter即可,而预训练模型的其他参数都是原始预训练的,这样就做到了空间的有效性

LoRA

  • 介绍:Low-Rank Adaptation(LoRA),它冻结了预训练的模型权重,并将可训练的秩分解矩阵注入Transformer架构的每一层,从而大大减少了下游任务的可训练参数数量。
  • 原理:在训练期间, W 0 W_0 W0被冻结并且不接收梯度更新,而A和B包含可训练参数。注意, W 0 W_0 W0和ΔW=BA都与相同的输入相乘,并且它们各自的输出矢量在坐标方向上相加。
    对于ℎ= W 0 W_0 W0x,前向传递修改后,h为:
    其中A用随机高斯初始化,B用0值初始化,因此ΔW = BA在训练开始时为零。通过α / r对ΔW进行scale,其中α是r中的常数
  • 源码:
  • 效果:
    • 映射模块的选择:
    • r值的选择:
    • 实际大模型开发中,常规NLP任务,如摘要、文本分类、文本相似度评估等,LoRA是可以的,但是用LoRA训练一个Chat机器人还是差点意思。
  • 对比:
    • 与用Adam微调的GPT-3 175B相比,LoRA可以将可训练参数的数量减少10000倍,GPU内存需求减少3倍
    • LoRA在RoBERTa、DeBERTa、GPT-2和GPT-3上的模型质量方面表现相当或优于微调,尽管具有较少的可训练参数、较高的训练吞吐量,并且与Adapter不同,没有额外的推理延迟。
  • 优势:
    • 冻结预训练参数,不同任务训练不同的LoRA模块,切换方便:预训练的模型可以共享,并用于为不同的任务构建许多小型LoRA模块。通过替换图1中的矩阵A和B,可以冻结共享模型参数并高效地切换任务,从而显著降低存储需求和任务切换开销。
    • 降低硬件需求,只优化低秩矩阵:当使用自适应优化器时,LoRA使训练更有效,并将硬件门槛降低3倍,因为不需要计算梯度或维护大多数参数的优化器状态,相反,只优化小得多的低秩矩阵。
    • 没有推理延迟:简单的线性设计允许在部署时将可训练矩阵与冻结权重合并,与完全微调的模型相比,通过构造,不会引入推理延迟。
    • LoRA能够与许多现有方法结合使用,比如Prefix-Tuning。
  • 实际应用的关键点:
    • LoRA在降低微调参数的情况下,带来了怎样的损失?【对于复杂任务,如行为预测、对话机器人这种不太行】
    • LoRA参数在实际微调中应该如何设置?【任务越垂直,R设置越大】
    • LoRA微调是否需要基于基座模型?【针对复杂任务,一般分两个阶段:第一次用多任务、第二次用垂域
    • LoRA对于不同大小的模型在效果上是否有差异?【基座模型越大,LoRA与全参数微调差异越小】

QLoRA

介绍:通过4-bit量化的BaseModel在保持高性能的同时减少内存使用,使得模型微调的门槛大大降低。

  • 4bit NormalFloat(NF4):提出了一种对于以零为中心的正态分布数据在信息论上最优的数据类型,该数据类型对正态分布数据产生比4 bit int和4bit float更好的效果;
  • Double Quantization:对量化常数进行量化,减少存储空间;
  • 分页优化器:在GPU偶尔内存不足的情况下,自动在CPU和GPU之间进行页面到页面的传输,以避免GPU OOM。

4bit NormalFloat(NF4)

NF4:NF4是一种数据类型,它在量化过程中保留了零点,并使用所有2^k^位来表示k位数据类型。这种数据类型通过估计两个范围的分位数 q i q_i qi来创建一个非对称的数据类型,这两个范围分别是负数部分[-1,0]的2^k-1^和正数部分[0,1]的2^k-1^+1。然后,它统一了这两组分位数 q i q_i qi,并从两组中都出现的两个零中移除一个。

这种结果数据类型在每个量化bin中都有相等的期望值数量,因此被称为k-bit NormalFloat ( N F k NF_k NFk),这种数据类型对于以零为中心的正态分布数据在信息论上是最优的。

NF4通过以下公式计算分位数:

标准正态分布量化函数把[-1, 0]分成7份,然后生成[-1, ..., 0]共8个分位数,把[0, 1]分成8份,然后生成[0, ..., 1]共9个分位数,两个合起来去掉一个0就生成全部的16个分位数了

比对SimpleQuant-Int4(等分):

对比:

  • LoRA:
  • QLoRA:

过程:


Double Quantization:

在量化的过程中,为了降低异常值的影响,我们采用分块的方式进行量化

  • 每64个参数共享一个量化常数(Absmax, 32bit),这样的话相当于每一个参数的量化额外开销为32bit/64 = 0.5bit。
  • 为了进一步优化这个量化开销,我们对其进行二次量化Double Quantization,对量化常数进行进一步的量化。我们采用256的块大小对量化常数进行FP8量化,这样的话,我们可以把每个参数的量化额外开销降低到:

分页优化器:在GPU偶尔内存不足的情况下,自动在CPU和GPU之间进行页面到页面的传输,以避免GPU OOM

这个特性就像CPU RAM和磁盘之间的常规内存分页一样工作。我们使用这个特性为优化器状态分配分页内存,当GPU内存不足时,这些优化器状态会自动被驱逐到CPU RAM,当在优化器更新步骤中需要内存时,它们会被分页回GPU内存。

Deepspeed

介绍:

  • DeepSpeed是一个由微软开发的开源深度学习优化库,旨在提高大规模模型训练的效率和可扩展性
  • 它通过多种技术手段来加速训练,包括模型并行化、梯度累积、动态精度缩放、本地模式混合精度等。
  • DeepSpeed还提供了一些辅助工具,如分布式训练管理、内存优化和模型压缩等,以帮助开发者更好地管理和优化大规模深度学习训练任务。
  • Deepspeed基于pytorch构建,只需要简单修改即可迁移。
  • 目前,DeepSpeed已经在许多大规模深度学习项目中得到了应用,包括语言模型、图像分类、目标检测等等。

组成:

  • Apis:提供易用的api接口,训练模型、推理模型只需要简单调用几个接口即可。其中最重要的是initialize接口,用来初始化引擎,参数中配置训练参数及优化技术等。配置参数一般保存在config.json文件中。
  • runtime:运行时组件,是deepspeed管理、执行和性能优化的核心组件。如部署训练任务到分布式设备、数据分区、模型分区、系统优化、微调、故障检测、checkpoints保存和加载等。该组件使用python语言实现。
  • ops:用c++和cuda实现底层内核,优化计算和通信,例如ultrafast transformer kernels,fuse LAN kernels, customary deals等。

ZeRO:Zero Redundancy Optimizer,零冗余优化器。

  • ZeRO用于优化内存,极大地提高训练速度,同时增加可有效训练的模型大小
  • ZeRO消除了数据和模型并行训练中的内存冗余,同时保留了低通信量和高计算粒度,使我们能够根据设备数量按比例缩放模型大小,并保持持续的高效率
  • 通过对内存需求和通信量的分析表明:使用现今的硬件,ZeRO有潜力扩展到超过1万亿(1000B)参数。
  • 分类:
    • ZeRO-1:只对优化器存储进行切分,也就是12φ的fp32数据,有多少GPU就切分多少份,即12φ / N u m G P U Num_{GPU} NumGPU=。
    • ZeRO-2:除了对优化器存储进行切分,还对梯度存储数据进行切分,即2φ / N u m G P U Num_{GPU} NumGPU。
    • ZeRO-3:除了对优化器存储进行切分,还对梯度和参数w存储数据进行切分,又多了一个2φ / N u m G P U Num_{GPU} NumGPU。

ZeRO1和2没有带来额外通讯,而3是有额外的通讯的,增加了zero3之后,整个通讯录增加1.5倍,即增加50%,只要通讯时间小于计算时间就能够接受。

速度:

  • 从左到右,越来越慢:
    Stage 0 (DDP) > Stage 1 > Stage 2 > Stage 2 + offload > Stage 3 > Stage 3 + offloads
  • 从左到右,所需GPU显存越来越少:
    Stage 0 (DDP) < Stage 1 < Stage 2 < Stage 2 + offload < Stage 3 < Stage 3 + offloads

在实际训练阶段,应采用从左到右的方式逐一尝试,找到在当前硬件配置下,能够运行的最优方案。

Megatron

LangChain

介绍:

LangChain是一个基于语言模型的应用程序开发框架。它能够实现以下功能:

  • 上下文感知(Context-aware):将语言模型连接到上下文信息(prompt instructions, fewshot examples, content),并基于这些信息进行回复。
  • 推理(Reason):依赖语言模型进行推理(根据提供的上下文进行回复,明确要采取的action)。

框架组成:

  • LangChain Libraries: Python和JavaScript库。包含多种组件的接口和集成,将组件集成到Chain和Agent的实现,以及开箱即用的Chain和Agent。
  • LangChain Templates:一套易于部署的Reference架构集合,可用于各种任务。
  • LangServe:用于将LangChain链部署为REST API的库。
  • LangSmith:一个开发者平台,让开发者能够在任何LLM框架上调试、测试、评估和监控构建的Chain,并与LangChain实现无缝集成。

组件化:

  • 用于处理各种任务和功能的模块被组件化,这些组件用于处理语言模型的各种任务和功能。LangChain框架提供了一系列组件的实现,每个组件都针对特定的功能或任务而设计。这些组件可以包括数据预处理、文本生成、文本分类、命名实体识别等。每个组件都有特定的接口和方法,使开发者可以方便地在自己的应用程序中使用。
  • 使用LangChain框架,开发者可以按需挑选和组合这些组件,以构建适合自己需求的语言模型应用程序。这种组件化的设计使得开发过程更加灵活、易于扩展,并且能够加速应用程序的开发和部署过程。无论是否使用LangChain框架的其他功能,这些组件都可以独立使用,并且具有简单易用的特点。

开箱即用的Chains:

  • LangChain框架中提供的现成Chains,用于完成特定的高级任务。这些Chains是预先设计和组装好的组件序列,旨在为开发者提供一种快速构建应用程序的方式。
  • 每个Chains由多个组件组成,这些组件被精心选择和配置,以便实现特定任务的最佳效果。
  • 使用off-the-shelf Chains,开发者无需从头开始设计和搭建整个语言模型应用程序,而是可以直接使用这些预先构建好的Chains。这样可以节省时间和精力,并且确保应用程序具有良好的功能性和性能表现。
  • Chains也可以根据开发者的需求进行定制和调整,以满足特定的应用场景和要求。但基于现成Chains的起点,可以显著缩短开发周期,并为开发者提供一个快速上手的起点。

核心组件:

Model I/O:

任何语言模型应用程序的核心元素都是模型。LangChain提供了与任何语言模型交互的构建块:

  • Prompts:模板化、动态选择和管理模型输入,定义预设模板,将输入与模板组合后输入LLM
    • Prompt templates:指一种可复现地生成Prompt的方式。它包含一个预设文本,即Template,可以接受来自最终用户的一组参数并生成一个Prompt
      • 组成
        • 对语言模型的instruction
        • 一组few-shot示例,以帮助语言模型生成更好的回答;
        • 语言模型的问题
    • Example selectors:动态选择要包含在Prompt中的示例。
      • 用于构建Few-Shot类型的Prompt时,以不同方式从一个示例集合中帮助我们选择合适的示例,组成最终的Prompt
      • 使用场景:如果有大量示例,您可能需要选择要在提示中包含的示例(Few-Shot)
  • Language Models:通过通用接口调用语言模型,可选择OpenAI提供的LLM和ChatLLM;
    • LLM:采用文本字符串作为输入并返回文本字符串的模型。
      • LangChain中的LLM指的是纯文本补全模型,它们封装的API接受一个字符串提示作为输入,并输出一个字符串补全。OpenAI的GPT-3就是一个LLM的实现。
    • Chat Models:由语言模型支持但将聊天消息列表作为输入并返回聊天消息的模型。
      • Chat Models通常由LLM支持,但经过特别调整以用于对话。它不再只接受单个字符串,而是接受一个聊天消息列表作为输入。通常,这些消息会标记发言者(通常是"System"、"AI"和"Human"之一)。它们返回一个("AI")聊天消息作为输出。GPT-4和Anthropic的Claude都是以Chat Models的形式实现的。
  • Output Parsers:从模型输出中提取信息,对LLM的输出进行格式化;
    • 原因:语言模型输出的是文本,但很多时候,用户可能希望得到比纯文本更结构化的信息
    • 目的:帮助对语言模型的响应进行结构化的类(List/DateTime/Enum/Json/...)
    • 必须实现的方法:
      • Get format instructions:这是一个返回包含语言模型输出如何格式化的指令的方法。
      • Parse:这是一个接受字符串(假设为语言模型的响应)并将其解析为某种结构的方法。还有一个可选的方法:
      • Parse with prompt(可选):这是一个接受字符串(假设为语言模型的响应)和提示(假设为生成此响应的提示)并将其解析为某种结构的方法。在需要输出解析器重新尝试或修正输出以某种方式并且需要来自提示的信息时,通常会提供提示。

Data Connection:

许多LLM应用程序需要用户特定的数据,而这些数据并不是模型的训练集的一部分。LangChain通过以下功能提供了加载、转换、存储和查询数据的构建块

  • Document loaders:从各种不同的来源加载文档;
  • Document transformers:拆分文档、删除冗余文档等操作;
  • Text embedding models:将非结构化文本转换为向量;
  • Vector stores:存储和搜索embedded的数据;
  • Retrievers:查询embedded数据;

Faiss:

  • 介绍:Faiss是一个Facebook AI团队开源的库,全称为Facebook AI Similarity Search,该开源库针对高维空间中的海量数据(稠密向量),提供了高效且可靠的相似性聚类和检索方法,可支持十亿级别向量的搜索,是目前最为成熟的近似近邻搜索库
  • 功能:
    • 高效的相似性搜索:Faiss实现了若干高速的索引算法,这些算法能够快速地在大规模向量数据集中进行相似性搜索。
    • 多种索引结构:Faiss提供了多种索引结构,用户可以根据数据规模、内存限制、查询速度等要求选择最合适的索引结构。
    • 多种相似度度量方法:Faiss支持多种常用的相似度度量方法,如L2距离、内积相似度等。用户可以根据具体的问题选择适合的相似度度量方法。
    • 多语言支持:Faiss提供了C++、Python和MATLAB接口。
    • 易于集成和使用:Faiss提供了简洁的API,并且有详细的文档和示例来帮助用户快速上手。
    • 高度可定制化:Faiss具有很高的可定制性。用户可以根据自己的需求进行参数配置、索引结构选择和优化,以获得最佳的性能。
  • 步骤:
    • 准备数据集:首先,准备包含向量数据的数据集。向量可以表示为浮点数数组,每个向量代表一个数据样本。
    • 创建索引结构:使用Faiss提供的索引结构来创建一个空的索引对象。选择合适的索引结构取决于你的数据集大小、内存限制和查询需求。
    • 加载向量数据:将准备好的向量数据加载到索引中。你可以使用add方法逐个或批量添加向量数据。
    • 训练索引:现在,你的索引已经包含了向量数据。如果你想进一步优化索引以提高搜索效率,你可以调用特定的训练方法来训练索引。不同的索引结构有不同的训练方法。
    • 保存索引:如果你想将训练后的索引保存到磁盘以便以后使用,可以使用write_index方法将索引对象保存为文件。

Callback:

LangChain提供了一个回调系统,允许hook into LLM应用程序的各个阶段。

这对于日志记录、监控、流式处理和其他任务非常有用。可以通过使用API中可用的Callbacks参数来订阅这些事件。


Memory:

  • 原因:默认情况下,Chains和Agent是无状态的,这意味着它们将每个输入查询都独立对待(就像底层的LLM和聊天模型本身一样)。在某些应用程序中,比如聊天机器人,记住之前的交互非常重要,无论是短期还是长期,Memory类就起到了这个作用。
  • 以两种形式提供Memory组件:
    • LangChain提供了模块化的辅助工具,用于管理和操作先前的聊天消息
    • LangChain提供了将这些工具轻松纳入Chains中的方法
  • 返回类型:Memory可以返回多个信息(例如,最近的N条消息和所有先前消息的摘要)。返回的信息可以是一个字符串或一个消息列表。
  • 组件:
    • ChatMessageHistory:支撑大多数Memory模块的核心实用类之一是ChatMessageHistory类。这是一个非常轻量级的包装器,提供了保存人类消息、AI消息以及获取它们所有的便捷方法
    • ConversationBufferMemory:它只是一个对ChatMessageHistory的封装器,用于提取变量中的消息
    • Save:用于保存消息。这可以通过将消息首先转换为普通的Python字典,保存这些字典(例如作为JSON文件),然后再进行加载来轻松实现。
    • Memory提供了不同数据库(Mongodb/Cassandra/Redis/...)的组件,可以将历史信息方便的存入各类型数据库。

Chains:

  • 原因:在简单的应用中,单独使用LLM是可以的,但更复杂的应用需要将LLM进行链式调用,可以是与其他LLM组件进行链式调用,也可以是与其他组件进行链式调用。
  • 介绍:Chain是一个非常通用的组件调用序列,其中可以包含其他Chains。
  • 常用模型:
    • LLMChain:由PromptTemplate、模型(LLM或ChatModel)和OutputParser(输出解析器,可选)组成。
      • 原理:LLMChain接受多个输入变量,通过PromptTemplate将它们格式化为特定的Prompt,然后将其传递给LLM模型获取结果,最后,如果提供了OutputParser,则使用OutputParser将LLM的输出解析为用户期望的格式。

Agent:

  • 定义:Agent是一个模型的封装器,它通过接收用户的输入信息,返回一个相应的"action"和"action input"。
  • 原理:将模型(通常为LLM)进行封装,使得它可以通过用户的输入,理解用户的意图,然后返回一个特定的动作类型和参数。这样根据动作类型和参数可以调用相关的工具来满足用户的需求。
  • 类型:
    • Action agent:在每个时间步骤,使用所有先前动作的输出来决定下一步动作。
    • Plan-and-execute agent:事先决定完整的动作序列,然后执行这些动作,而无需更新计划。
  • 功能:
    • Agent接口提供了灵活的LLM和Chains调用。Agent可以访问一组Tools,并根据用户输入决定使用哪些Tools。Agent可以使用多个Tools,并将一个Tool的输出作为下一个Tool的输入。
    • Action agent适用于小任务,而plan-and-execute agent更适用于复杂或长时间运行的任务,这些任务需要保持长期目标和专注度。通常最好的方法是通过让plan-and-execute agent使用action agent来执行计划,将action agent的动态性与plan-and-execute agent的规划能力相结合。
  • 工作流程:
    1. 接收用户输入。
    2. 根据据需要决定是否使用工具以及选择工具输入。
    3. 调用工具并记录输出(也称为"观测")。
    4. 使用工具、工具输入和观测历史来决定下一步操作。
    5. 重复步骤3-4,直到判断可以直接回复给用户。
  • Agent Executor:Agent被包装在代理执行器Agent Executor中,Agent Executor负责调用代理Agent获取一个动作和动作输入,调用动作对应的Tool,获取Tool的输出,然后将所有这些信息传递回Agent,以获取接下来应该采取的下一个动作。

LlamaIndex


📜 参考资料 :

https://www.cnblogs.com/nickchen121/p/16470569.html
https://blog.csdn.net/mary19831/article/details/129570030
https://wmathor.com/index.php/archives/1542/
https://spaces.ac.cn/author/1/5/
https://www.bilibili.com/video/BV1UDTqeuERN
https://www.sohu.com/a/284717523_478183
https://blog.csdn.net/Decennie/article/details/120010025
https://cloud.tencent.com/developer/article/1745002

📌 [ 笔者 ]   文艺倾年
📃 [ 更新 ]   2024.7.28
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!
相关推荐
scan72411 分钟前
LILAC采样算法
人工智能·算法·机器学习
leaf_leaves_leaf14 分钟前
win11用一条命令给anaconda环境安装GPU版本pytorch,并检查是否为GPU版本
人工智能·pytorch·python
夜雨飘零119 分钟前
基于Pytorch实现的说话人日志(说话人分离)
人工智能·pytorch·python·声纹识别·说话人分离·说话人日志
爱喝热水的呀哈喽35 分钟前
《机器学习》支持向量机
人工智能·决策树·机器学习
minstbe38 分钟前
AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python
人工智能·python·支持向量机
月眠老师42 分钟前
AI在生活各处的利与弊
人工智能
落魄实习生1 小时前
AI应用-本地模型实现AI生成PPT(简易版)
python·ai·vue·ppt
四口鲸鱼爱吃盐1 小时前
Pytorch | 从零构建MobileNet对CIFAR10进行分类
人工智能·pytorch·分类
苏言の狗1 小时前
Pytorch中关于Tensor的操作
人工智能·pytorch·python·深度学习·机器学习
bastgia2 小时前
Tokenformer: 下一代Transformer架构
人工智能·机器学习·llm