Falcon:我们是靠洗数据洗败 LLaMA 的!
深度学习自然语言处理 分享
知乎:何枝
Falcon 是由 The Technology Innovation Institute (TII) 于2023年6月发布的大语言模型,包含 1B、7B、40B 三种规模。
该模型曾因其在 40B 上的性能超越 65B LLaMA 而被人们广泛关注。
尽管近期有文章指出,排行榜对 LLaMA 的计算可能存在一些问题,Falcon 并不一定真正击败 LLaMA,不过这并不影响人们对这一开源且参数更小的强大模型的给与极高的关注度。
进NLP群—>加入NLP交流群
链接:https://zhuanlan.zhihu.com/p/637996787
在这一篇文章中,我们将快速预览一下 Falcon Paper[1] 中的一些关键信息。
1. 数据集构建:我们有必要「精心挑选」数据集吗?
Falcon 论文中主张的思想是:仅使用「互联网语料」(不需要额外数据源)就可以训练一个不错的大模型。
在 Falcon 的开篇贴出了一个效果比对图:
我们只看中间 3 个比较知名的数据集 [GPT-3]、[The Pile] 和 [PaLM],这 3 个数据集中都使用了一部分「互联网(Web)数据集」,并加入一些额外的数据集进行辅助。
GPT-3 中使用占比最大(60%),The Pile 中的使用占比最少(18%)。
这里的「互联网数据集」指的都是 [common crawl] 数据集,这是一个从 2008 年开始搜集的互联网文本数据集,可以简单理解为一个巨大的互联网信息库,包含了各种各样的海量互联网信息。
那么我们不禁好奇:除了这些互联网信息,剩下的信息都是些什么信息呢?
从上图可以看到,除了 CC 数据集(图中黄色方框)之外,两边都还加入了一些额外的数据集,比如:维基百科、书籍、Github、ARXiv 论文等,借此来让 LLM 直接学会一些技能(写代码、读论文等)。
在 Falcon 的 Paper 中,这些非互联网数据都被统一称为:人工精选数据集(curated corpora),尽管这类数据集质量较高,但却不那么容易扩展。
例如,GPT-3 和 The Pile 中都包含了「书籍」类的数据集,如果我们想训练一个中文模型,相较于易于获取的英文书籍数据集,中文的开源数据集获取则没有那么容易;此外,对于维基百科而言,英文词条的数目也远胜于中文词条量级。
可见,要想扩大这些「精心构造」的数据集的量级,对于人们而言绝非易事。
而 Falcon 提到:只要对数据进行严格的数据清洗,即便是只使用「互联网语料」也能够让 LLM 学会各种技能。
我认为这基于一种高可能性的假设:所有的信息都能够在互联网信息中被找到,只是信息密度相比「人工精选数据集」要更低。
例如「明星信息」、「如何写代码」这些信息都能在新闻网站、或是问答网站中找到,只不过「维基百科」或是「Github」则是将这些信息给「高密度」且「结构化」地进行了存储。
这使得我们在使用维基百科作为训练语料的时候,模型能够更快的学习到这些高密度信息(人物的经历、年龄、性别、职业等等),而这些内容在互联网信息(如新闻)中的信息密度则较低,即很少会有一条新闻完整的介绍一个艺人的过往经历。
只要我们对互联网信息进行严格的处理(去除冗余信息,提高有用信息的密度),就能够加快模型的学习速度。
2.「互联网数据」如何清洗?
通常来讲,处理互联网数据集都包含以下几步:
语言识别:判断文章的语言类型,在 [LLaMA] 的数据预处理中过滤掉了 Common Crawl 中所有的非英文语料。 规则过滤:用规则过滤掉那些低质内容,例如:同一句话中出现过多标点符号、或包含一些违禁词等。 基于打分模型的内容过滤:通过训练一个轻量的机器学习模型,用于判断一篇文章是否足够优质。 文章去重:去掉一些相似内容的文章,通常分为:确定性去重(命中一些明确的公共子串或模板) 和 模糊性去重([MinHash] 或 [SimHash])。
而在 Falcon 中,整个数据清洗流程如下所示:
2.1 URL 过滤
在这一步中,作者通过制定 URL 的黑白名单来决定保留、丢弃某些文章内容,
例如,保留 Arxiv、WikiPedia 前缀网站的内容(这其实就和前面的 The Pile 这种「人工精选」的方式类似了)。
2.2 内容抽取
在获得过滤后的 URL 集合后,我们需要获取到这些 URL 中的「文本信息」,
需要过滤并丢弃「目录」、「标题」、「广告」等无关的内容,
作者使用 [trafilatura] 库来进行内容抓取,trafilatura 的使用方法也比较简单:
# load necessary components
>>> from trafilatura import fetch_url, extract
# download a web page
>>> url = 'https://github.blog/2019-03-29-leader-spotlight-erin-spiceland/'
>>> downloaded = fetch_url(url)
>>> downloaded is None # assuming the download was successful
False
# extract information from HTML
>>> result = extract(downloaded)
>>> print(result)
# newlines preserved, TXT output ...
可以通过指定特定的 HTML 元素来过滤掉不需要的内容(如表格、图片等):
# load necessary components
>>> from trafilatura import fetch_url, extract
# download a web page
>>> url = 'https://github.blog/2019-03-29-leader-spotlight-erin-spiceland/'
>>> downloaded = fetch_url(url)
>>> downloaded is None # assuming the download was successful
False
# extract information from HTML
>>> result = extract(downloaded)
>>> print(result)
# newlines preserved, TXT output ...
2.3 语言识别(过滤掉非英语的语料)
作者使用 [fastText] 训练了一个语言识别模型,去掉那些英语得分低于 0.65 的文章,
这类低质文章主要包括:非英语文章、以及那些不是由自然语言构成的网页(比如一些纯图像的博客和广告)。
2.4 低质过滤
【篇章级别过滤】
首先,去除一些文章内一直重复同一段内容的文章,以及一些包含错误信息的文章(例如:抓取超时等);
其次,对每一篇文章,通过判断文章整体长度、标点符号占文章长度的比例等,来过滤掉那些不正规的文章;
【句子级别过滤】
过滤掉文章中的一些无用的句子,比如:求关注、求转发、喜欢本文请一键三连 ❤️~
这种句子通常没有具体含义,但话术繁多,又难以穷举。
因此,作者通过设定以下策略来过滤掉这些语句(某些规则只适用于英语):
1. 句子中主要由大写字符组成(丢弃)
2. 句子由纯数字组成(丢弃)
3. 命中特定关键词,如['关注', '转发', '点赞'](丢弃)
4. 如果句子长度小于 10,且命中以下模版:
* 句子以(登录、注册)开头。
* 句子以(展开、更多)结尾。
可以看到,数据处理真的是一个非常精细的工作。论文里也有提到:尽管通过训练模型可以加快速度,但考虑到模型训练会出现输出偏好,所以作者依旧保持使用规则来清理数据。
2.5 文章去重
最后,作者对剩下的内容进行去重。
首先,通过 MinHash 的方法对剩余文章进行 MinHash 值计算,每篇文章使用 9000 个 Hash 值(用 20 个桶,每个桶 450 个值);
作者发现,如果使用过少的桶(如:The Pile 中使用的 10 个桶),会导致去重比例过低。
其次,使用确定性去重的方法,删掉那些重复片段超过 50 个 token 的文章。
最后,根据 URL 进一步去除了一部分重复的文章。
3. 实验结论
论文中通过实验结论指出:「精心构造数据集」并不一定是预训练语言模型的最优解,
通过严格且恰当的规则去清洗数据,即使是在最容易获得的互联网文本上,模型也能表现的最好。
总的来说,Falcon 是一篇更侧重于「数据清洗」的论文,其实从 Falcon 最后发布的模型结构来看,也是传统的 Rotary + Flash Attention 的 Decoder 结构,但从 Falcon 最后优异的效果来看,似乎是在向我们证明:不管是 Pretrain 还是 Finetune,「数据质量」都比「模型结构」要更加重要。
出于篇幅原因,论文中还有很多附录的细节没有写进来,有时间的小伙伴建议移步观看原文,相信可以学到不少新的小技巧。
好啦,这就是这篇文章的全部内容啦,感谢观看~
进NLP群—>加入NLP交流群
参考资料
Falcon: https://arxiv.org/pdf/2306.01116.pdf
微信扫码关注该文公众号作者