Hi there 👋

欢迎关注同名公众号【多头注意力】

小模型 Phi 的发展之路

今天微软发布了 Phi3 模型,3.8B 的小体量做到了 Mixtral-8x7B 一样的效果,在社区引起了不小的轰动。 fuyao 老师直呼不能李姐 我前段时间曾经试过finetune Phi2 模型,效果说实话并不是很理想,默认 context 只有 2k 更是让他难以胜任很多生成式的任务。 今天发布的 Phi3 context 做到了 4k,还有长上下文的 128k 版本,至少在这块已经补上了短板。 其实 Phi 家族一直是 LLM 领域蛮有个性的一套模型,今天也趁机梳理了一下他们的发展脉络。 我们倒过去看,先总结一下今天发的最新版 Phi3。Phi-3 Technical Report: A Highly Capable Language Model Locally on Your Phone的几个重点如下: 模型尺寸有3.8B,7B,14B,3.8B 性能已经不错,量化后 1.8G 在 iPhone16 上一秒可以出 20 个 token 3.3T token 训练,更大的模型用了4.5T。这个比 llama3 的 15T 少的多 训练分两阶段。第一阶段用高质量网络数据,第二阶段用更强力过滤后的一阶段子集加 GPT 合成数据。第一阶段学语言能力和常识,第二阶段主要学逻辑推理能力。 除了语言模型还发不了 SFT+DPO 的版本 Phi3 的性能确实能打 Phi2 是23 年 12 月发布,只有一个 2.7B 的版本,没有对应的技术报告。从 Model Card 上可以看到主要是按 Phi1....

April 23, 2024 · 2 min · Yuanhao

生成式模型的奇葩应用:生成式检索

最近在学习一个奇特的技术,叫做生成式检索。生成式检索是一种利用生成式语言模型的全新信息检索方法。不同于依赖外部索引的传统方法,生成式检索利用单个强大的模型来处理查询和文档语料库。在这个注重推理能力,讲agent的年代,生成式检索却走到了让模型“死记硬背”的另一个极端。 生成式检索用简单的话来说,就是对于输入查询(query),让模型直接生成出语料库里相关文章的id,是的,你没有看错,是直接生成id!当然,这就会涉及到一个很重要的问题——id长啥样?当前的主流做法有几种: 原子id(atomic id),即每篇文章用一个独立的token来表示。这实际上是挂羊头卖狗肉,说是生成式,但因为每个文章都有独立token,所以等价于一个分类问题。 朴素id(naive id),即id是一个字符串,这个字符串没什么特别的,就是id常用的形式,可能是12345这样的数字串,也可能是apdkcr这样的hash串。然后模型在推理阶段是用自己的词表生成出这个id字符串。因为id没有明确含义,这种做法着实是挺难为模型的,相当于问一个人“为人民服务”出现在毛选的第几卷第几本第几页第几行第几个字。 语义id(semantic id)。和2一样,这里的id还是一个字符串,不同的是这个id是要包含语义信息的。这个大类有很多细分的做法,我列两种比较有代表性的。 直接生成URL。是论文Large Language Models are Built-in Autoregressive Search Engines里的做法。他们讨论的语料是维基百科,页面的url包含非常明确的页面主题信息。这种做法是比较符合大家对生成式模型的直觉的,生成目标也不局限在URL,tag、category都可以使用。 层次聚类。该领域经典论文Transformer Memory as a Differentiable Search Index的做法。是将大的语料库用embedding进行层次聚类,直到簇的大小符合要求。这样就把语料库转换成了一棵检索树,文章的id就是从根到叶子的一条路径。虽然还是数字id,但相比于一个自增或者随机的数已经结构化了很多。 层次聚类示意图 说完了id的问题,另一个重要问题是怎么让模型记住这么多id?方法也很土很暴力,就是搞一堆(query, docid) pair 让模型学就完了。如果这种数据不够,那有一些方法合成,比较典型的有: DAQ(Document as query):通常是在文章里取一截内容做query。 D2Q(Document to query):再搞一个模型根据内容生成一些可以回答的问题。 显然D2Q搞出来的数据更有可能接近使用场景的真实数据,所以效果好很多。D2Q其实不是什么新方法,四五年前就有人在IR任务里拿来增强模型。这两种方法都可以产生大量的训练数据,让模型充分死记硬背。 Doc2Query不是什么新鲜玩意儿 最后看下这种方法的效果和问题。 根据这篇论文的数据,在语料库不大(100k左右)的情况下这个方法还是表现不错的,可以超过bm25和经典的dual encoder+ann。但不得不说,这个成本可不低,100k文档的训练数据可能是4-5M条,要跑一会。 Corpus小的时候generative retrieval表现还不错 但当检索范围变大,这种方法的效果下降非常明显。这个结论也不意外,背几首古诗和背新华字典的难度肯定不同。很快就差于经典的召回方法了。 Corpus变大模型性能迅速下降 另一个明显的问题是死记硬背导致的新文档更新问题。当语料库里增加新的文档之后,模型要重新训练,速度慢不说,效果还可能有各种问题。也有不少文章专门也就这个问题。 以上就是对近期学习的一个简单总结。总的来说这个东西学术味道浓了一些,实用价值在现阶段应该还不大。但确实难说后面会不会有跟LLM结合的点。更多相关内容可以看这个Github Repo。

April 20, 2024 · 1 min · Yuanhao

OpenAI 公布声音克隆新技术,仅需 15 秒音频样本即可模仿任何说话者,将带来哪些影响?

很多答主都提到了,从技术角度来看,声音克隆技术并不新,别的不说,去年大火一阵的 AI 孙燕姿应该大家都还有印象。 「AI 孙燕姿」火遍全网,随着技术的发展,未来 AI 歌手会成为主流吗?这一技术还可能应用到哪些场景? 用孙燕姿的声音唱各种不同的歌曲就是声音克隆,而且难度还更好,因为要考虑音乐的节奏、音调、音色等因素。去年的效果已经很不错了,否则也不会出圈。更值得注意的是,AI 孙燕姿并不是某个大厂搞出来的,而是好多爱好者自己 DIY 出来的。可见,这个东西在技术上真的没有什么大的突破。 如果大家自己想玩玩 tts,我很推荐这个库,各种功能都有,自然也包括声音克隆。但开源的音色跟闭源确实没法比。 https://github.com/coqui-ai/TTS 但 OpenAI 做这个我觉得对他们自己还是很有意义的。毫无疑问,OpenAI 是要把自己打造成 AI 能力的首选,现在靠着 GPT 和 DALLE系列,和还未上线但已爆火的 Sora已经大概给自己树立这个形象了。但前面都是文本和视觉领域,Sora 的视频也是没有声音的。音频这块一直还没有起来,他家的 tts 功能我是用过的,我感觉体验很不错,虽然还没有老牌厂商例如微软那么精细的控制功能,但真的很简单易用,效果也好。这波声音克隆自然是比单纯 tts 更有可玩性,是更容易吸引用户的功能点。 以后,OpenAI 的 API key 应该是一个像样的应用开发者的必备之物了。

March 30, 2024 · 1 min · Yuanhao

来自社区的Gemma微调踩坑记录

越来越多人发现Gemma 难以 finetuned的现象了。今天在 Twitter 逛就看到好几个相关帖子。 下面这个老哥是 Dolphin 和 Samantha作者,应该算有经验的开发者,直接搞了一个 200 多的 loss 出来。 add new token引发的惨剧 后面他们发现可能是新加 token 导致的问题。finetune 时如果新加 token 必须训练 embedding,对于 lora微调来说默认是不训练这组参数的。老哥把新 token 去掉之后正常了。如果是像我一样的全参微调压根不会碰到这个问题,Lora 看起来还是在社区里占据了更主流的位置。 Teknium 也是 finetune 达人,上来loss 也很高,但后面慢慢降下去了,原因也是他加了新 token。 另一个add new token引发的惨剧 回帖里有个老哥(之前是 OpenAI 员工哦)说可能是 pretrain 数据里有 Instruct 数据,顺带提了一下 Phi-2 和 Qwen 1.5。当然这都只是猜测,语料里有啥已经是大模型界最深的秘密。不过这种做法确实让人讨厌,基座就好好做通用语料训练,别搞指令数据。这么一搞下游训练容易遇到麻烦。我之前试过 Qwen 和 Baichuan,虽然他们的 benchmark 成绩都很好,但finetuned 的表现确实不如 llama2 好。Qwen 1.5最近倒是看到有不错的微调版本在 leaderboard 上排名不错。 这老哥还提供了一组超参数说值得一试。max_grad_norm 在 HF trainer 里默认就是 1,adam beta2 默认是 0.999,降低到 0.95 会让梯度的变化更敏锐一些。至于 epsilon,我一直感觉没什么可调的,1e-8 和这里的 1e-5 应该差别不大。...

February 25, 2024 · 1 min · Yuanhao

地表最强7b模型?我的Gemma体验报告

昨天,也就是2024年2月22号,一早上起来就看到国内的AI公众号就热闹非凡,Google发布了他们的开源大语言模型Gemma,上Twitter也看到Jeff Dean卖力地再宣传自家的新产品:几条推文展现了好多令人兴奋的技术指标。 在上班前我先简单翻了翻技术报告,让我比较感兴趣的是256k的词表大小和6T的预训练语料。这俩改动加起来我估计应该性能确实会有一些提升。 最近Andrej Karpathy在YouTube上搞了个很火的讲Tokenizer的课程,应该也从侧面体现tokenizer和词表对现在的LLM性能之重要。我用Tokenizer Playground测试了一下LLama2和Gemma对同样文本的tokenize结果,可以发现Gemma的token数少了大概10%。当然,我测试的文本非常基础,全是ASCII字符,差距应该不那么明显,到了代码或数学场景(Gemma是做了digit分词的,数学应该强),差距应该就会显现出来。 LLama tokenizer 的结果 Gemma tokenizer结果 我最近喜欢在面试的时候问别人vocab大小对于LLM性能的影响,从序列长度讲当然是词表越大越好,因为token序列会短,不仅生成时的步数会少,每一步O(N^2)的self attention也会有不少的提速。但output layer和embedding table都会变大,所以最终的速度变化不太好说。 这个Gemma模型说是2B和7B,但其实参数量是偏大许多的,7B版本的参数加起来已经8B多了,谷歌这次为了“挽尊”特意把表格分成了embedding parameter和non-embedding parameter,确实略显诡异。 Gemma的参数量 结构的设计也比较奇怪,intermediate hidden size特别的大,和”同参数量“llama比起来层数有所降低。我特意整理了下表,大家可以更清楚地看出两者的变化。我这个表是从huggingface权重repo的config.json来的,feedforward dim竟然和tech report不一样。这次Gemma还在每一层放了两个normalization,激活函数也和llama不一样,用了GELU。 Gemma-7b Llama2-7b vocab size 256000 32000 hidden size 3072 4096 embedding params 786M 131M layers 28 32 attention heads 16 32 head dim 256 128 intermediate size 24576 11008 activation func GELU SwiGLU 技术报告里列了一大堆让人眼前一亮的指标,基本意思就是7b可以干llama-13b。但现在我感觉这些指标和实际好不好用关系并不是那么大,看看就好。当然此时的我预期Gemma7b应该还是要好过llama2 7b的。 Gemma的指标很亮眼 到了办公室赶紧就开始在我们的数据上finetune了一下。选的7b版本,huggingface已经贴心地把它整合进各种库里,transformers升级到4.38以上就行。我先试了下llama2-13b一样的超参,发现eval loss差了不少,而且新版transformers会计算grad norm,这个值在训练初期有很大的波动,一度达到上百的量级,感觉训练不是特别成功。后面我又换用了一组比较小的学习率,比之前有所提升,但eval loss还是和llama13b有差距。 我的几组实验,bf是全参微调,bl是lora 不过不同模型特别是词表量级相差如此巨大的模型间eval loss不太好比较(直观感觉是词表大的loss水平应该要高一些),只好用一些业务指标来比。我用一些测例推理了一下模型,发现学习或者推理过程应该是出了些问题。虽然eval loss在合理范围,但生成的文本基本不可用。 而且,Gemma7b的训练显存消耗比llama2-13b还大,同样的deepspeed配置我只能跑原来一半大小的batch。Gemma虽说参数约为8b,但肯定比13b小不少,出现这种情况我也比较费解,欢迎大佬点拨。 歌手大佬也发现了一些开源版的实现问题 总体感觉目前的Gemma版本有一些问题,看看过几天社区会不会发现并修复它。也希望真的能有个能超过llama2-13b的7b模型可以用。当然,我最希望的还是llama3赶紧出来吧😂

February 23, 2024 · 1 min · Yuanhao

接近参数化的世界

每个人的世界无非是ta看到的,听到的,闻到的,尝到的,摸到的加上想到的。 今天Sora的问世让我感觉到离计算机能够模拟这个感官世界已经不远了。虽然不是精确的,但肯定可以是精彩的,令人满意的。在享受面前,谁又会在意精不精确呢。 2022年ChatGPT出来的时候有模糊的感觉:预测下一个token的任务竟然能在效果上模拟推理、逻辑、甚至扮演角色,这不就说明文字世界的一切其实是被一个概率刻画的规律主宰的吗。放在玄学语境里,就是所谓的因果,它真的存在。 这次OpenAI更近一步,“世界模型”的概念已经再清楚不过地表达他们已经接近找到用概率模型刻画世界的方法了。 Sora is able to generate complex scenes with multiple characters, specific types of motion, and accurate details of the subject and background. The model understands not only what the user has asked for in the prompt, but also how those things exist in the physical world. 时至今日,文本、图像、音频、视频都已经可以被基于概率的AI以不错的质量产生出来。这些模型几十上百GB的权重里就是一个参数化的世界。 当一切都打磨地更加完善,那下一步就可以做一个造物主,用概率的方法造一个跟现实世界很像的世界。元宇宙可能处在大爆炸前夜?

February 16, 2024 · 1 min · Yuanhao

填志愿真难

这两天各省的高考成绩陆续发布,考生和家长马上该为怎么填志愿伤脑筋了。 今年小舅子高考,考得不错,虽然清北上不了,但其他学校应该都有机会。作为一名负责任的好姐夫,自然也发动身边资源给小舅子出谋划策。 不搞不知道,现在填志愿还真是不容易。 首先是现在的大学都很会蹭热点、造概念。人工智能相关的各种学院、实验班就有好几个,比如浙大的图领班,人大的高瓴学院,复旦的计算机科学拔尖班。 还有些近年来火热的产业比如新能源,也有像上交的博渊未来学院这种新兴院系。 近年来各种软硬件的热点确实多,AI、半导体、新能源都火过一把,给了这些院系或者项目很好的土壤。 家长和考生也很吃这套,愿意为此买单。 遥想十几年前我填志愿那会其实也有热门专业,当时的显学是金融、建筑、土木,现在好像也都比较冷清了。 所以大家填志愿的时候也不要过分追逐当下的热点。 第二个现象是所谓大类招生,或者更实际的说法是各种“实验班”很多。这种实验班往往是相关专业搭在一起,但里面的专业强弱是有差别的。 例如复旦的“技术科学实验班”里面包含的专业有信息类也有航空航天。这种大类专业往往进去之后还要按成绩分流。 上海交大这方面就比较离谱,分流时80%看的是高考的成绩。感觉有点给考生画大饼的意思,用大类招生里的好专业把你吸(哄)引(骗)进来,入学后可能会和期望有偏差。 不管怎么样,我认为大类招生的本意应该是好的,但是对于这种大类招生,考生和家长们务必要调查清楚,做好预期管理。 今天看到一个我关注的大V写现在专业之间的差别没有学校之间差别大了,我感觉是有道理的。随着社会和国家对硬科技的关注越来越多,原来的一些天坑专业比如生化环材也开始支棱起来了。 计算机类虽然在收入上目前还有一定的优势,但优势也在衰减。在这种情况下,他建议大家可以多考虑下自己的兴趣和特长,我也比较认同。 不过遗憾的是,像我们这种在小县城长大的小孩可能很难有机会在上大学之前就搞清楚自己的兴趣到底是啥,很多东西可能都没有机会接触到。 作为一个过来人,我本来是想写点东西来给大家科普一下,但也一直没时间。这里把我的一些想法分享出来,大家可以用这个框架自行查阅资料。 其实很简单,想了解一个专业,可以问这几个问题: 这个专业在大学四年的培养计划是什么样的?会学一些什么课程?对比几个专业的培养计划就能看出区别来。如果培养计划没啥差别,那后面研究生阶段转换就会比较容易。 这个专业有哪些著名的公司?他们的产品是什么?他们的股价或者市值这几年是怎么变化的 这个专业有哪些著名的人物?可以分别找找学术界和工业界的,看下他们在研究什么。他们中有没有你想成为的人? 大家有什么关于填志愿的好方法也欢迎在评论区留言。

June 25, 2023 · 1 min · Yuanhao

令人吃惊的M2芯片

最近拿到了一台14寸的MacBook Pro,搭载了M2 Pro芯片,内存为16GB。昨天心血来潮,在上面尝试训练了一个神经网络,感触挺深的。 我训练的是一个BERT-base模型,当年也算是个”大模型“,但在现在看起来就是个小不点。训练数据不多,大概一万多条文本,平均长度应该接近模型的最大输入长度。 这个任务在我的A6000显卡上跑得飞快,不到十分钟就可以跑完三个epoch的训练。我一开始移植代码到MacBook上的时候没有注意到Huggingface Trainer有个控制是否使用M系芯片神经处理的开关,所以用的是CPU,进度条显示训练完要15个小时。 后来查阅文档,打开开关后,跑完训练的时间大幅下降到了1小时左右,提速了十几倍!(测试不严谨,但提速非常大是肯定的) 别人M1 Ultra的测试结果也有明显提速 不过遗憾的是,目前pytorch并不支持在M系列芯片上使用半精度数据类型,导致训练的显存消耗略大,batchsize上不去。但GitHub上有个帖子说M2其实只支持bf16的,估计不久的将来会有PR来支持这一特性,那又可以有一个速度的大提升。 前几天苹果发布了缝合版处理器M2 Ultra,碰巧知乎上有个付费问题,我就去了解了一下相关知识。目前苹果的统一内存架构是在CPU和GPU之间共享内存,而且内存带宽极大。4090的内存带宽是1T/s,而M2 Ultra达到了800GB/s。M2 pro的带宽也有200GB/s,而M2 max是400GB/s。 统一内存架构在大模型时代感觉有极大的优势,我查阅了一下目前NV主流的移动显卡,显存大多只有8GB,而M2 pro笔记本的起跳内存就有16GB,32GB版本再花3000块就能买到。 即使在不支持半精度的情况下,32GB的统一内存也足够塞下7B的模型,已经有很多东西可以玩了。京东上一个24GB的4090显卡也要一万多,加上七七八八配个台式机估计两万块也是要的。但是一个32GB版本的MacBook Pro也只要19000,简直太划算了! 高考刚刚结束,有不少同学或者家长估计都在挑选新的电脑、手机等设备。在不差钱的情况下,我强烈建议搞一个MacBook,教育优惠可以打八五折,你可以尝试很多普通笔记本电脑没法带给你的东西。

June 11, 2023 · 1 min · Yuanhao

Vicuna初体验

今天深入体验了下Vicuna,以下是我的takeaways: 指令跟随的能力跟ChatGPT有点差距。最典型的就是下面的身份设定任务都经常失败(如下图)。模型会非常倔强地回复你他是Vicuna,是LMSYS训练的模型。 针对上面的问题我看了下代码,发现他们专门搞了好几个问身份的语料来训练模型图片,真的是把身份感刻在了骨子里。 fastchat迭代挺快的,今天试了下他们新加的API功能。整个使用体验几乎和openai的client一模一样,学习成本很低。但目前文档没怎么跟上,有时需要看看代码。例如我在异步环境里用chatCompletion.create失败,看代码才知道要用acreate。 试了下Vicuna-7b的embedding,能力非常一般,而且维度4096太大了,那算相似度可真费劲,而且在检索任务上被768维的Instructor Embedding秒杀了。 看了下lmsys的成员,好家伙,几乎全是中国人,感觉人才这块可能对于中文大模型不会是短板。 使用下来总体还可以,下面这个例子和GPT的能力确实差不多。最后一个图是我提供些knowledge给它后的回答,措辞稍微不达预期。

May 7, 2023 · 1 min · Yuanhao

OpenAI官方出品的ChatGPT调校指南你读了吗

作为一名Prompt Engineer,每天都在跟GPT打交道,时常被他惊艳,也看过很多模型失效的案例。在不精调的情况下,prompt基本上是影响效果的唯一因素了,虽然网上有很多Prompt编写指南,但我认为OpenAI出品的这份,你一定要看一下。 这篇文章就给大家划一下重点。 ChatGPT基操 主要包含在How to work with large language models这个文档里,同时适合网页和API用户。首先,介绍了向ChatGPT提问的三种主要范式,一种是直接给指令,例如 Extract the name of the author from the quotation below. “Some humans theorize that intelligent species go extinct before they can expand into outer space. If they're correct, then the hush of the night sky is the silence of the graveyard.” ― Ted Chiang, Exhalation 模型将会输出 Ted Chiang 另一种是将指令转化为一个补全(completion)问题,例如上面那个指令改为 “Some humans theorize that intelligent species go extinct before they can expand into outer space....

May 4, 2023 · 3 min · Yuanhao