看了一下最近有趣的新闻:
文班亚马打太阳得38分10分2盖帽, 暴雪在嘉年华上宣布以后AI会陪玩家一起组队打副本,泰森和霍利菲尔德时隔27年后,以60多岁的年龄宣布三番战,高通和苹果逐一发布新的芯片都蹭AI热度,但是我今天写的和这些新闻都没关系,因为是很早就准备写的,属于处理队列里积压的信息...
深度学习有三个瓶颈
- 算力:前几篇文章或多或少提了些,也比较容易理解,后续会写更细
- 算法:在深度学习从入门到不想放弃的专栏里会一直写
- 数据: 今天写点
前几天DeepMind发表了一篇文章,发现如果把CNN给做成和Trasformer一样大的结构,那得到的训练结果实际上差不太多,其实很早就有论点说深度学习里面会认为数据和算力才配是决定性因素,我对这个观点不置可否(至少LSTM因为串行化,再怎么弄也很难做的和transfomer,CNN一样有效率),但是如果换个角度说算法决定神经网络限,算力和数据决定神经网络上限(有些场景反而得倒过来说),那我是双手赞成的。
先看一篇论文:
Training_language_models_to_follow_instructions_with_human_feedback.pdf (openai.com)
这篇论文是Openai阐述其RLHF的整个流程,相信论文里的图大家可能或多或少在一些PPT里都看过一点,比如下图:
但是这文章如果细看你会发现很多有用的东西,包括彩蛋,建议有条件的详细读一下全文,其实RLHF这东西最早是Openai联合Deepmind在2017年就提出来了,想法很有用也很朴实,就是人类去标注再重新强化学习,但是为什么从2017年到2023年这6年里,只有Openai在ChatGPT上做出来了,难道别人不理解这论文吗?
不是的,我们来看一下论文里提到的非常意思的一段:
To produce our demonstration and comparison data, and to conduct our main evaluations, we hired a team of about 40 contractors on Upwork and through ScaleAI. Compared to earlier work that collects human preference data on the task of summarization (Ziegler et al., 2019; Stiennon et al., 2020; Wu et al., 2021), our inputs span a much broader range of tasks, and can occasionally include controversial and sensitive topics. Our aim was to select a group of labelers who were sensitive to the preferences of different demographic groups, and who were good at identifying outputs that were potentially harmful. Thus, we conducted a screening test designed to measure labeler performance on these axes. We selected labelers who performed well on this test; for more information about our selection procedure and labeler demographics, see Appendix B.1.
是的,大家没看错,OpenAI为了做RLHF和PPO,光雇佣Contractors公司来做数据标注和alignment就雇佣了40个公司来做,想象一下那是多少人来一起完成的数据集的创建...
事实上RLHF真正难点不是技术,而是钱,毕竟人力成本才是最贵的!
那我没有钱,雇佣不起那么多公司和人,我可以训练大模型吗,可以获得数据集吗?当然可以,有以下几种思路吧:
- HF上开源的数据集:做PLM的时候可以用,因为PLM主要看语义与模型的权重分布的适应,这个只要数量够,字多,词广就行,但是做SFT啥的,可能差点意思,另外绝大多数还是英文语料为主。
- 企业内部的语料:做SFT可以用,但是基本是特定的下游任务,无法满足通用性需求,如果处理不好也有毒性和权重坍塌等风险。
- 爬虫:你看人家以后还让不让你爬就是了
- 偷:不是,写错了,是借,是借...
既然是借,就涉及几个问题:
- 第一,去哪借,肯定要找数据质量好点的借
- 第二,我怎么借?
第一个问题就找好点的LLM去借呗,比如Openai的,比如Claude的,那至少我借出来的东西,得相对准确度高点吧,不然不是坑自己吗?
第二个问题,分两个阶段吧,今天先做个简单的,自有数据标注,篇幅关系,关于"借",我分两篇写比较适合
今天引入的项目叫AutoLabel,是我最近比较看好的一个项目:
refuel-ai/autolabel: Label, clean and enrich text datasets with LLMs. (github.com)
说一下原理,AutoLabel就是用Langchain Agent来使用LLM的能力对现有数据进行标准,分析,生成QA等下游任务,官方的支持能力:
- Classification Task
- Multilabel Classification Task
- Entity Matching Task
- Named Entity Recognition Task
- Question Answering Task
- Attribute Extraction
下图可以看到在不同的模型和下游任务dataset上面的效果对比,可以看到GPT-4在绝大多数领域已经远远好于人类的标注水平!
道理很简单,但是它省钱啊(我连GPT-4都不用,我用3.5更省钱)!
下面举两个例子来说明这个项目的能力
第一个:分类任务(我分享的代码,配置文件和脚本为了match AOAI是改过的,大家看自己的LLM来决定),以一个银行的客服电话记录分类为案例
1-首先安装对应的LLM适配
2-下载seed文件和测试文件
这两个文件格式是一样的,seed主要是少量的人工标准案例,一般例子里的不超过200条,目的是让LLM做few_shot的时候来学习我们想进行的下游任务模式和定义;test文件是经过LLM或者传统机器学习标注的(我的test就是人肉乱标注的),但是标注的准确度无法保证,我们的项目让AutoLabel+LLM,给测试集的标注打分,并计算精确率,召回率,F1等Score
seed文件的格式
test文件的格式,我没用它的test,我随便自己写了5条中文语料用来做测试标注的数据(成本,成本
),然后随便乱给了几个Label,所有的label都写成一样的了
3- 读取json配置
配置文件大概长这样
太长了,我截出来一些
可以看到就是一些常用的配置,定义任务,定义prompt,定义few_shot的模版,定义语义相似性规则(这个project也需要ada002)
4- 按照config文件来create Agent
5- 预生成prompt,预计算可能的费用
每个生成的prompt长长的一段,其实还是很占token的,没办法,这个基于你的下游任务和few_shot的效率来决定的,我也只截了一部分
6- 看一下现在的数据状态
在这个时刻还没有对test数据进行操作
7- 正式开始label
这个报错是sklearn对于采样太少的错误,无所谓,不影响,你们实际做业务的时候不会只取5个,也不会爆这个错误
下图也给了解释,好多precision recall f1都是0,就没法计算了
8- 处理的结果
解释一下这个结果,第一个准确率是指之前的label只有25%是正确的,但是因为处理率只做到了百分之80,所以其实只有1个label是对的,我们看一下处理完的结果数据
第三项的数据,我一开始以为,LLM没有正确理解到context里的语义意图,然后我回去看了一眼标签,发现config里的76个label真的居然没有一个描述第三项的合适的label,看来老外的银行和我们的银行面临的callcenter电话对话内容不太一样
第四项也是唯一一个原始标注就是对的标签,所以这里也没什么好解释的,百分之25准确性指的就是它
第二个: Q&A任务,QA任务一般会比其他任务复杂一点,属于偏重生成的下游任务,篇幅关系,我在这里就不再重复配置了,只挑值得说的来讲一下
1- 我在config 的json文件里,直接引入了COT(这个以后讲),因为QA相对比分类复杂,所以引入COT,有效的拆解任务,但是由于多轮对话,也意味着成本上升,和completion的速度会受影响
2-案例中的QA任务的逻辑是这样的,首先把任务数据分为以下的逻辑层级
{
"context": "Beyoncé Giselle Knowles-Carter (/bi??j?nse?/ bee-YON-say) (born September 4, 1981) is an American singer, songwriter, record producer and actress. Born and raised in Houston, Texas, she performed in various singing and dancing competitions as a child, and rose to fame in the late 1990s as lead singer of R&B girl-group Destiny's Child. Managed by her father, Mathew Knowles, the group became one of the world's best-selling girl groups of all time. Their hiatus saw the release of Beyoncé's debut album, Dangerously in Love (2003), which established her as a solo artist worldwide, earned five Grammy Awards and featured the Billboard Hot 100 number-one singles 'Crazy in Love' and 'Baby Boy'.",
"question": "When did Beyonce start becoming popular?",
"answer": "in the late 1990s"
}
这个好坏我不予置评,你可以完全为了适应你自己的下游任务来设计你的数据结构和prompt格式,这点倒不是很大的问题
3- 生成前的数据
4- 正式生成后的数据
可以看到它把之前没有回答的问题2也给回答了,但是问题5,我去阅读了一下原文,确实qustion里的提的问题,context里提供的信息是无法回答的,所以这个也是合理的
这两个任务就演示完了,剩下的是拿着LLM给你标准好的数据,做去重,过滤,反正就是走一遍预处理(要求不高就直接拿来用了),就可以进行训练了
每次都是弄5个确实看起来很小气,是吧,那弄100个会咋样?
就是这样
,免费玩家的苦恼
那么今天借数据的第一篇就结束了,严格来说,这篇不算特别"借",非常迂回的"借",那么下一篇,我们就一起动手去兜里"借"了
本文暂时没有评论,来添加一个吧(●'◡'●)