DPO, PPO, GRPO
在小米实习的第二个任务,是对VLM进行R1类似路线的复现,查看其能否实现VLM的推理能力增强。因此,在此记录一下我在尝试理解RL、DPO、PPO、GRPO的路径
RLHF参考强化学习小白入门与概念辨析PPO源码理解PPO中GAE的推导RLHF的流程与公式代码参考公式难以理解的话,看看代码还挺有用的,感觉代码对我来说更好理解一点
dpo局限性样本全面性假设参考该分析文章评论中的一段话:
1论文附录第一个证明里面reward用policy表达有个暗含的前提是对y求期望也就是要把y的样本采集全了,然后配分和赋予reward才是有效的*
这个直接影响了数学公式转换中等价条件的成立, 因而尤其重要但实际情况下,这个假设成立比较困难,又回到了数据收集的困难上来。当然,数据不太全面,有时候问题也不大,只是会导致训练效果差一点。(这就是黑箱模型训练的玄学吗,全凭实践!)
此外,与PPO算法相比:
1如果两个方法的训练数据都是足够多的,那么他们能训练到的最优的模型是一样的。但是从 rl 的角度,dpo 是离线方法,ppo 是在线方法,在线方法类似于生产了更多的数据。
RL方法中的并行策略与显存分配 ...
Mi老鼠:小米实习期间摸鱼看其他知识
大模型基本功ybq说的挺好的
神中神代码gpt-fast面面俱到,我只能说写的太好了!甚至包含tensor parallel但需要注意的是,transformer部分写法似乎只支持推理,因为强制生成kv_cache的占位空间才能正常运行,在训练中这是不必要的。但改起来似乎也很方便,理论上把这行注释掉就行?
采样解析(greedy, beamsearch, topK, topP, temperature, 联合策略)https://hengsblog.top/2023/11/01/decoder/温度只控制图像的陡峭程度,不改变值的相对大小(当然由于精度问题,一些值被截断后可能会和其他值相等)温度会使得绝对大小的差值改变。那么,在最后输出的备选词A B C中选择一个,由于温度改变了原有的概率绝对大小,在备选词进行概率重新归一化然后选择这一步,选择token的概率完全改变了因为最后选择的代码大概是这么个思想:
1234567891011probs = { 'A': 0.5, 'B': 0.4, ...
LLM中的并行策略————如何理解与理解路径记录
在小米实习接到的第一个工作,是对MiLM进行长文本SFT。具体而言,部门内部的SFT代码之前并没有适配TP(tensor parallelism), 13B、30B模型训练单卡最多防线22K个token,长文本训练使用PoSE来增强,实际上还是不完全的阉割版。在我来的时候,TP的框架已经被前一个实习生适配的差不多了,因而我基于此开始进行后续的训练,以及代码理解、代码调整与PR等TP的概念图还比较容易理解,但是具体代码,影响到方方面面,需要在多处进行修改,我还是花了很大的功夫去进行理解,在此记录自己的路径与一些思考
TP与SP是什么,如何实现?张量并行与序列并行细节分析
TP+SP流程:参考:Xtuner
32k数据——序列并行环境初始化(GPU分组,哪些GPU共同处理一个32k)——seq_len切分——embedding层——修改本来的mask、position id, label, input id——切分后的数据输入到attn中——q,k,v proj——all to all算子,使得qkv从seq切分转化为head切分——attn weight(qk)、softma ...
Mi孝子:实习期间“偷”到的一些小知识
近期获得/加深的一些知识理解GPT结构、训练与推理分析图解GPT理解prefill阶段是生成kv cache以及用最后一个token对之前的kv进行计算得到一个概率,后续token同理。vllm就是对各个模型进行推理上的重构,而本身的modeling_qwen2.py这类其实是训练用的文件。推理阶段还需要重写。实际上公司内部模型部署vllm就是转化成qwen格式然后调用vllm的qwen接口……
bash脚本文件语法写sh脚本的时候,’=’前后不能有空格,与本人python编程习惯背道而驰…..
python小知识点——import使用
12import sys sys.path.insert(0, sys.path[0] + "/../")
进行导入的时候,需要注意的是,这个添加的路径是当前工作目录的相对路径,而不是这个文件的相对路径。也就是说,如果一个处于该文件父目录的文件调用了该文件,那么该文件的这个代码就会被解释成“将父目录的父目录加入path”,与预期的“将父目录加入path”不符合导入模块应该采用以下写法,即获取当前文件的父目录,然 ...
adamW优化器:思想、算法公式与代码
首先分析一下adam的思想:
获取梯度/导数/一阶动量的滑动平均——m1/滑动平均后的梯度g
获取二阶导数/二阶动量的滑动平均——m2
其中,β1和β2就是控制一阶动量和二阶动量滑动平均的参数。通过滑动平均,可以使得m1和m2都变成前面所有时间步结果的一个调和平均之后:
根据β1和β2,以及当前的时间步t,计算一个系数,调整学习率,得到L_t
梯度下降,公式变成了: 参数 = 参数 - L_t * m1 / (sqrt(m2) + eps)
最后梯度下降的公式,实际上,看着花里胡哨的,但最终,m1之外的其他部分都可以看成是对学习率的调整,本质上只是让学习率更好而已。
而在原始论文及其最初的衍生实现中,还将L2正则加入到了这个优化器中,具体表现为,在每一步t开始计算优化前,将当前时间步t梯度g_t变成:
1g_t = g_t + weight_decay * L2项
然后后面就使用g_t进行m1、m2等的计算。但是,这样的问题是,L2正则直接加在梯度g_t上面,后面的一阶动量和二阶动量都使用了g_t,最后又有 ...
长文本增强的便捷技术:YaRN与PoSE代码解析
首先放上苏神的两个博客:
Transformer升级之路:2、博采众长的旋转式位置编码
Transformer升级之路:16、“复盘”长度外推技术
本人在进行代码解析之前,首先尽量去理解了这个理论基础,之后在解析代码的时候和论文、博客相互映照,才最终得到一个比较好的理解。其中,第二个是重中之重,需要从头到尾地理解透彻。第一个是阐述了RoPE的数学思路、设计原理。单看这个可能不太能理解RoPE,可以参照其他一些讲解RoPE的博客去理解,使用Google或者bing可以搜到一些程序员自己搭建的博客页面,而非csdn之类的,这些感觉质量都还不错。此外,一定要理解RoPE的原生代码总的来说,笔者在上面这些准备工作花不少时间,之后在理解yarn的代码上又花费了大概一天的时间,才终于产出了这篇解析源代码的博客。所获得的收获是很大的,不单单是理解了一种方法,更是对位置编码有了更深的理解。当然,这些都还是一些浅显的东西,位置编码及其本质的探讨,苏神后来也有一些博客,有兴趣的可以去看一看。
12345678910111213141516171819202122232425262728293031 ...
补习HMM,对其的一些理解与思考
为什么要去研究HMM?首先,HMM这个概率模型,在NLP领域算是一个比较基础的,但很有价值的模型。它的主要思想是:概率分布及其能导向什么结果。关于HMM的理解,在具体的数据场景下是比较容易的,网上也有不少介绍的blog、视频,因而这里不再赘述了。
之前,记得在自然语言处理的课程上,是有提到过HMM模型的,依稀记得是用在句法分析还是词性标注上面。但是由于老师死气沉沉讲的不好,我们院系设置的又不是必选,因而听的也不甚上心,最后也果然没考到,HMM自此埋下伏笔,成为了我的一个知识盲区。后来,应用场景大多是生成文本、或是对文本的内容进行分析,已经没有用到HMM的必要了,像是jieba使用HMM模型作为它的分词器,我只需要懒人使用即可,重点还是后面的内容理解与分析上,因而再也没有接触过这个东西。
实际上,最近,由于准备秋招,深感自身基础不足,在看牛客上的面经,会需要手撕一些基础的分类、聚类、transformer等一些算法。说实话我在这方面是没有准备过、相当薄弱的,因而需要将这些手撕都写一下,我也因此在GitHub上开了一个仓库专门做这个事情。
HMM,本来是不在我的计划范围之内的。 ...
秋招大失利,深夜破防记录
首先,梳理一下逃离北京之后,我大概做了什么
去LF那里躺了一周,之后一直躺家里。期间投、面了一些暑期实习,结果均以早早失败告终。究其原因,感觉在于八股、代码不熟悉,很菜。因而,这段时间主要又刷了leetcode的hot 100,大概2-3遍。由于在家有吃有喝没人逼迫,全凭自觉,因而刷的慢;到了八月,总算有了危机意识,开始着手准备八股了,却对于秋招的提前批也没有多投。是懒惰?抑或是自卑、畏惧?无论如何,是要开学回学校了,正式批,瞄准中、大的互联网厂,基本上都投了一遍;后面又投了几批。
那么,投递的结果怎么样呢?基本是全挂,笔试A的不够多,选择题之类的大概又都又一半是模模糊糊印象不深刻只能嗯猜,因而笔试最终结果肯定不是很好。但是让我去提升,一时半会也无法速成。像是各种排序算法的流程细节、每一轮的迭代结果;像是分类、聚类基本算法的一些八股;像是C++/C的老旧的、大学课程式的输出结果判断;像是机器学习各种方法的优缺点、适用场景等……————都是一些零零散散,但是不深入理解一下的话毫无作用的东西。然而相对于真正的重中之重:NLP和LLM方面的代码手撕与细节八股,重要程度却又 ...
DailyRecord-June
6.1-6.2周六,中午和叶阿姨和她的女儿一起在中关村附近一个饭店吃饭,看上去还挺高档的。吃了北京烤鸭、麻辣牛蛙、豆腐煲、宫保鸡丁……味道还可以。和叶阿姨、她女儿聊天,聊了很多。在我的朦朦胧胧的印象里(也许不是印象,而是我脑部的期许?毕竟那时候我才3、4岁),叶姐姐是一个温柔而活泼的大姐姐。时过境迁,到了现在,温柔仍然是温柔,已经不再活泼。从她的面庞中、眼神里,似乎感觉到她也有些感慨、或是悲伤,隐隐可见泪光。叶阿姨的女儿是高三,马上高考。但是她似乎有压力但不大?或许是我没能看出她笑容下面隐藏了什么吧。总之,是一个活泼可爱的小姑娘,穿搭、皮肤质量之类的与我们当时完全不同。记得当时整个高中生涯似乎都是瘦巴巴、苦哈哈的,哈哈!从姑娘的身上,我隐隐也看见了过去自己的影子:无需考虑生活,有着许多不切实际而有趣的理想、兴趣,也许会实现、也许不会实现。例如深山老林生存式隐居、周游世界……当然,北京小姑娘的条件肯定比我小镇做题家好很多,也许都能实现也说不定?更加感叹人与人的不同,小姑娘目前为止已经去过不少地方了,去年好像还独自去旅游过……吃完饭,小姑娘带着我们去打桌游,一个叫什么法师的桌游。玩了大概一 ...
DailyRecord-May
5.1 —— 5.55.1 五一假期的第一天。再说一遍:我恨调休!我恨调休!昨天晚上21:46的火车,早上6:35火车到站。只有站票,我和LT带了马扎上去,结果发现能放马扎的地方也很少。在4月中旬的时候,我和LT说一起回家,聊到站票买马扎的事情,我说我买两个,他不用买直接过来就行,结果他忘了自己也买了一个。于是多出了个小马扎。我是14车,LT是15车,他在15车帮我占了个位置,结果发现是厕所门口,而这个厕所的门还坏了,乘务员过来修反而把门直接给搞下来了;中途,LT试图将多余的马扎以15R推销出去,结果失败了🤣🤣🤣🤣。每节车厢都带个厕所,因而站票大抵是都要在厕所附近窝着的我是不想当老八的,正好听闻说餐车那边有空位,因而我拎着我的两个小马扎过去找位子。到那儿发现餐车坐满了,估计都是站票过来买饭送座位的。餐车的尽头比较空旷,只有一个哥们儿在地上铺了个纸躺着。我在这儿蹲了下来,LT怕被赶走,让我看看情况,半小时没人赶就叫他。确实没人赶,然后他就过来了,过来一合计,吃点东西,然后去问有没有空位。乘务员腾了两个相邻的位子给我们,然后96r,没得选择,两人吃鱼香肉丝饭。我吃了一碗半,LT吃了 ...