7 Mar

Tiger:一个“抠”到极致的优化器

这段时间笔者一直在实验《Google新搜出的优化器Lion:效率与效果兼得的“训练狮”》所介绍的Lion优化器。之所以对Lion饶有兴致,是因为它跟笔者之前的关于理想优化器的一些想法不谋而合,但当时笔者没有调出好的效果,而Lion则做好了。

相比标准的Lion,笔者更感兴趣的是它在$\beta_1=\beta_2$时的特殊例子,这里称之为“Tiger”。Tiger只用到了动量来构建更新量,根据《隐藏在动量中的梯度累积:少更新几步,效果反而更好?》的结论,此时我们不新增一组参数来“无感”地实现梯度累积!这也意味着在我们有梯度累积需求时,Tiger已经达到了显存占用的最优解,这也是“Tiger”这个名字的来源(Tight-fisted Optimizer,抠门的优化器,不舍得多花一点显存)。

此外,Tiger还加入了我们的一些超参数调节经验,以及提出了一个防止模型出现NaN(尤其是混合精度训练下)的简单策略。我们的初步实验显示,Tiger的这些改动,能够更加友好地完成模型(尤其是大模型)的训练。

点击阅读全文...

7 Sep

BytePiece:更纯粹、更高压缩率的Tokenizer

目前在LLM中最流行的Tokenizer(分词器)应该是Google的SentencePiece了,因为它符合Tokenizer的一些理想特性,比如语言无关、数据驱动等,并且由于它是C++写的,所以Tokenize(分词)的速度很快,非常适合追求效率的场景。然而,它也有一些明显的缺点,比如训练速度慢(BPE算法)、占用内存大等,同时也正因为它是C++写的,对于多数用户来说它就是黑箱,也不方便研究和二次开发。

事实上,Tokenizer的训练就相当于以往的“新词发现”,而笔者之前也写过中文分词最小熵系列文章,对新词发现也有一定的积累,所以很早之前就有自己写一版Tokenizer的想法。这几天总算腾出了时间初步完成了这件事情,东施效颦SentencePiece,命名为“BytePiece”。

点击阅读全文...

14 Jan

旁门左道之如何让Python的重试代码更加优雅

这篇文章我们讨论一个编程题:如何更优雅地在Python中实现重试。

在文章《新年快乐!记录一下 Cool Papers 的开发体验》中,笔者分享了开发Cool Papers的一些经验,其中就提到了Cool Papers所需要的一些网络通信步骤。但凡涉及到网络通信,就有失败的风险(谁也无法保证网络不会间歇性抽风),所以重试是网络通信的基本操作。此外,当涉及到多进程、数据库、硬件交互等操作时,通常也需要引入重试机制。

在Python中,实现重试并不难,但如何更加简单而又不失可读性地实现重试,还是有一定技巧的。接下来笔者分享一下自己的尝试。

循环重试

完整的重试流程大致上包含循环重试、异常处理、延时等待、后续操作等部分,其标准写法就是用for循环,用“try ... except ...”来捕捉异常,一个参考代码是:

点击阅读全文...

27 Feb

配置不同的学习率,LoRA还能再涨一点?

LoRA(Low-Rank Adaptation)是当前LLM的参数高效微调手段之一,此前我们在《梯度视角下的LoRA:简介、分析、猜测及推广》也有过简单讨论。这篇文章我们来学习LoRA的一个新结论:

给LoRA的两个矩阵分配不同的学习率,LoRA的效果还能进一步提升。

该结论出自最近的论文《LoRA+: Efficient Low Rank Adaptation of Large Models》(下称“LoRA+”)。咋看之下,该结论似乎没有什么特别的,因为配置不同的学习率相当于引入了新的超参数,通常来说只要引入并精调超参数都会有提升。“LoRA+”的特别之处在于,它从理论角度肯定了这个必要性,并且断定最优解必然是右矩阵的学习率大于左矩阵的学习率。简而言之,“LoRA+”称得上是理论指导训练并且在实践中确实有效的经典例子,值得仔细学习一番。

结论简析

假设预训练参数为$W_0 \in \mathbb{R}^{n\times m}$,如果使用全量参数微调,那么增量也是一个$n\times m$矩阵。为了降低参数量,LoRA将更新量约束为低秩矩阵,即设$W=W_0 + AB$,其中$A\in\mathbb{R}^{n\times r},B\in\mathbb{R}^{r\times m}$以及有$r\ll \min(n,m)$,用新的$W$替换模型原有参数,然后固定$W_0$不变,训练的时候只更新$A,B$,如下图所示:
$$\style{display: inline-block; width: 24ex; padding: 10ex 0; border: 1px solid #6C8EBF; background-color: #DAE8FC}{W_0\in\mathbb{R}^{n\times m}} \quad + \quad \style{display: inline-block; width: 8ex; padding: 10ex 0; border: 1px solid #D79B00; background-color: #FFE6CC}{A\in\mathbb{R}^{n\times r}}\quad\times\quad \style{display: inline-block; width: 24ex; padding: 3ex 0; border: 1px solid #D79B00; background-color: #FFE6CC}{B\in\mathbb{R}^{r\times m}}$$

点击阅读全文...

9 Jul

植物拯救了地球,阻止寒冷灭绝之灾!

笔者语录:现在温室效应愈演愈烈。不过,在千万年前,情况正好相反,二氧化碳含量的急剧下降,使地球越来越冷。而一个“救星”的出现挽救了地球!这个伟大的“救星”,就是我们随处可见的植物。现在,就让我们随着《新科学家》的脚步,去看看那远古的“救星”!

图片说明:原始森林。来自搜索引擎,图片有可能经过PS。

图片说明:原始森林。来自搜索引擎,图片有可能经过PS。

点击阅读全文...

28 Jul

洋葱也能用来发电!

图片说明:植物界—被子植物门—单子叶植物纲—天门冬目—葱科—葱属—洋葱

图片说明:植物界—被子植物门—单子叶植物纲—天门冬目—葱科—葱属—洋葱

洋葱,学名Allium cepa.L,在生活中又被称为球葱、圆葱、玉葱、葱头等等,属百合科葱属。洋葱是一个让人又爱又恨的小子:当你去切它的时候,它会猛然反抗,让你泪流满脸,落败而逃!但是当你品尝它的时候,却会被它的味道所吸引。而且它还有一定的药用价值。现在,它又有了令人惊奇的功效,那就是——绿色发电!

点击阅读全文...

29 Jul

科学空间:2009年8月重要天象

日食之后的八月,精彩天象仍将不断上演。英仙座流星雨将在本月出现极大,这同时也拉开了下半年流星雨季的大幕。木星和海王星冲日以及水星东大距等天象,将使行星观测再次成为热点。

观测关注:

太阳由巨蟹座运行到狮子座
01日 月掩心宿二
06日 南宝瓶座ι流星雨极大(ZHR=2)
07日 木星合月
11日 土星环消失(从太阳的方向看倾角为0)

12日 北宝瓶座δ流星雨极大(ZHR=5-10)
13日 英仙座流星雨极大(01:30-04:00, ZHR=100)
15日 木星冲日
16日 火星合月
17日 天鹅座κ流星雨极大(ZHR=3)
18日 金星合月;海王星冲日
20日 北宝瓶座ι流星雨极大
25日 水星东大距
28日 月掩心宿二

点击阅读全文...

30 Jul

冥王星呀,你究竟是什么?

Stephen Battersby 文 Shea 编译

太阳系中有多少颗行星?官方的回答是八颗——除非你碰巧住在美国伊利诺斯州。2009年初,“目中无人”的伊利诺斯州政府宣布,为”行星”制定标准的国际天文学联合会(IAU)其实是不公正地剥夺了冥王星的”行星”头衔。

三年前,IAU决定为“行星”一词起草首个科学上的定义。

在捷克首都布拉格召开的IAU大会上经过数天的激烈争论,与会代表投票通过了一个行星的定义。根据这个定义,冥王星被排除在了行星的行列之外,降级为“矮行星”。

[图片说明]:冥王星系统的想象画。

[图片说明]:冥王星系统的想象画。

点击阅读全文...