专栏名称: 王路在隐身
发布文章。
目录
相关文章推荐
顾扯淡  ·  笑死//@他们叫我冰箱:哈哈哈哈艹//@社会 ... ·  5 小时前  
顾扯淡  ·  厚贞现在好高级啊…… ... ·  昨天  
纯银V  ·  脱单投稿保底 6 ... ·  昨天  
来去之间  ·  转发微博-20250606193249 ·  2 天前  
来去之间  ·  转发微博-20250606211727 ·  2 天前  
51好读  ›  专栏  ›  王路在隐身

手搓阿毗达磨AI失败后,我嫌弃AI太不智能

王路在隐身  · 公众号  · 热门自媒体  · 2025-03-30 14:10

正文

请到「今天看啥」查看全文



想想也觉得搞笑,你把高频的和超低频的字词都放进了词汇表,次高频的却不能不排除在外。就像一个企业,可能要给那些大力鼓吹自己的记者和媒体钱,还要给黑自己的记者和媒体钱,但你不可能所有记者和媒体都给钱,那你就要破产了。


这样,第二次扩充词汇表就超出了嵌入层本来的维度[152064, 5120],它的留白不够你用,你要重塑一下嵌入层的形状。但是不要忘了,输出层的形状也得重塑。另外,QWQ32B的嵌入层和输出层的权重不是共享的。你扩展词汇表后,可能需要分别得到它们的初始向量值,这个待会儿再说。


我第二次扩充词汇表,是为了解决UNK的问题。但当我把模型从7B换成32B后,我发现,其实,你可以不做这件事。QWQ32B有64个隐藏层,它的参数量增加带来的能力有望自行减少UNK的问题。也就是说,如果你用3B和7B的话,这一步不得不做,但如果换成32B,省略这一步没啥大问题。


打比方说,一个记者如果靠爆黑料赚钱,他敢去小私企碰瓷,他敢去碰有背景有势力的企业的瓷吗?说不定就把他送进去了。不过,我是先沿用了7B的思维,在32B模型上扩充了词汇表,加了很多生僻字。后来做对照组实现,才发现这一步其实是可以省略的。甚至,我第一步的扩充,也就是那些专业术语的添加,其实省略掉效果也差别不大。就是,你花了那么大精力搞的事情,最后,改进有限。其实,改进有限就已经很难得了,因为,你“改进”之后功能不退化就烧高香了。说“花了大精力”不是扩展词汇表,而是新增词汇ID向量的初始化。


2、新增ID的向量初始化


你往字典里添一个字,不是说放进去就完了,你肯定要标上它的读音,说明它的含义。ID的向量值,就是这个作用。我记得在一开始做这件事情的时候,就有读者在评论区问:你怎么解决新增词汇向量初始化的问题?我当时告诉他,我用的AI介绍的方法,取对应简体词汇的向量,或者加权平均。


你无论是问Claude还是Grok,它们都会优先推荐这种方法,所以我也就首先尝试了这种方法。效果很差。其实,如果你去问QWQ32B这个问题: 中间的单词是什么?它会不知道你在问什么。它并不知道 是个什么东西,所以你问: 是什么意思?也得不到理想的回答。如果你去问Deepseek R1: 中间的单词是什么?它会有点小懵,它会思考:中间的单词是什么?什么中间?但R1毕竟是大模型,参数量大了20倍,它的确知道 是什么东西。但QWQ32B不知道。


你如果问这种问题:“楚”的下半部分加上“虫”是个什么字?我们小学生都知道是“蛋”,R1不会每一次都知道,你问3次,它可能就有1次搞不清楚。更别说QWQ32B了。这和strawberry里有几个r是类似的问题。大模型不是像人类一样通过视觉看见了 和“蛋”。参数量大的模型,是通过更多的权重把 和组成它的每一部分关联起来,但参数量小的模型,没有能力或者开发者没有特意去赋予它这种关联,它也就没有这个“知识”。


这就是为什么我一开始要关注新增词汇向量初始化的问题。假设“現在”不是已有的词汇,那很好办,“现在”是,你把“现在”的向量直接复制给“現在”就好了,这会有一些小偏差:它不知道二者是简体和繁体的区别,但这无伤大雅。因为我们的目的是让它理解《婆沙》的上下文而已。所以,如果一个词汇的简体版已经是独立的ID,这就是最容易解决的。你只需要加载模型的第一个分片就行了(嵌入层在第一个分片,输出层在第14个),找出对应ID,复制覆盖,万事大吉。


问题在于,这种只是极小一部分。有些字,你用OpenCC简繁转换,转了之后它纹丝不动,比如“鈔”,非常简单的一个字,钞票的钞嘛,但是,QWQ32B不认识,OpenCC也不处理。你当然可以手动把“钞”的向量复制给“鈔”,问题是这样的字不是一个两个,而是数百个,不说别的,阿毗达磨的“毘”,模型就不认识。你去《婆沙》里,是找不到“毗”这个字的,只有“毘”。但是OpenCC不能识别“毘”就是“毗”的异体字。


其实,解决这种问题有个最简单的办法,就是直接训练完事。只要模型够大,数据够多,算力够足,一切都不是问题。所谓“大力出奇迹”。你随便给它一个什么初始值,然后让它跑去吧。——但我在一开始,并没有那样,一方面是,4卡的机器没有那么好租,必须吃早饭前就抢,我想一共就那么909个ID,总想在单卡上解决32B模型嵌入层新增向量的问题,这个约束让我耗费了不少精力;另一方面,我总想试试,如果我给大部分新增ID一个更好的初始值,它后续训练优化的结果会不会也更好呢?就这一件事,让我折腾了一个多星期。


接着说,类似“鈔”这种ID,你怎么给它赋初始值呢?如果只是解决这一类,也简单。问题是,新增ID是“词上一百,形形色色shai”,除了训练,“靜慮”的赋值不能和“鈔”用同样的方式解决。所以我肯定先想的是通过单卡训练。QWQ32B是62G,16位精度,单卡4090是24G,8位量化你都加载不了,4位量化推理是没问题的,但是训练,就不行了。——就在这上面,Claude给我挖了很多大坑。







请到「今天看啥」查看全文