MoE环游记:3、换个思路来分配
By 苏剑林 | 2025-03-05 | 9287位读者 | 引用这篇文章我们继续探讨MoE的负载均衡问题。在上一篇文章《MoE环游记:2、不患寡而患不均》中,我们主要讨论了通过Aux Loss来促进负载均衡的思路。Aux Loss固然简单直观,但它也有一个明显的缺点——权重不好调——调低了无法促进均衡,调高了容易损害LM Loss,所以业界一直有寻找替代方案的尝试。
本文要分享的是名为“Loss-Free”的方案,由DeepSeek在《Auxiliary-Loss-Free Load Balancing Strategy for Mixture-of-Experts》提出。和DeepSeek众多耀眼的开源作品相比,这篇论文也许不算起眼,但在笔者看来,它潜在的学术影响力可能远超其他工作,因为所提方法不仅简单有效,而且极具普适性,堪称经典。
方法大意
面对负载不均衡,Aux Loss的应对思路是通过额外的损失引导Router给出均衡的打分,而Loss-Free的想法则是换个新的分配思路,即不改变Router现有打分结果,而是改变\mathop{\text{argtop}}_k \boldsymbol{\rho}这个分配方式。
鬼斧神工:求n维球的体积
By 苏剑林 | 2014-12-23 | 116840位读者 | 引用今天早上同学问了我有关伽马函数和n维空间的球体积之间的关系,我记得我以前想要研究,但是并没有落实。既然她提问了,那么就完成这未完成的计划吧。
标准思路
简单来说,n维球体积就是如下n重积分
V_n(r)=\int_{x_1^2+x_2^2+\dots+x_n^2\leq r^2}dx_1 dx_2\dots dx_n
用更加几何的思路,我们通过一组平行面(n-1维的平行面)分割,使得n维球分解为一系列近似小柱体,因此,可以得到递推公式
V_n (r)=\int_{-r}^r V_{n-1} \left(\sqrt{r^2-t^2}\right)dt
设t=r\sin\theta_1,就有
V_n (r)=r\int_{-\frac{\pi}{2}}^{\frac{\pi}{2}} V_{n-1} \left(r\cos\theta_1\right)\cos\theta_1 d\theta_1
封闭曲线所围成的面积:一个新技巧
By 苏剑林 | 2015-08-30 | 67313位读者 | 引用本文主要做了一个尝试,尝试不通过Green公式而实现将封闭曲线的面积与线积分相互转换。这种转换的思路,因为仅仅利用了二重积分的积分变换,较为容易理解,而且易于推广。至于这种技巧是否真正具有实际价值,还请读者评论。
假设平面上一条简单封闭曲线由以下参数方程给出:
\begin{equation}\left\{\begin{aligned}x = f(t)\\y = g(t)\end{aligned}\right.\end{equation}
其中参数t位于某个区间[a,b]上,即f(a)=f(b),g(a)=g(b)。现在的问题是,求该封闭曲线围成的区域的面积。
RNN模型中输入的重要性的评估
By 苏剑林 | 2017-09-10 | 31536位读者 | 引用Saliency Maps for RNN
RNN是很多序列任务的不二法门,比如文本分类任务的常用方法就是“词向量+LSTM+全连接分类器”。如下图
假如这样的一个模型可以良好地工作,那么现在考虑一个任务是:如何衡量输入w_1,\dots,w_n对最终的分类结果的影响的重要程度(Saliency)呢?例如假设这是一个情感分类任务,那么怎么找出是哪些词对最终的分类有较为重要的影响呢?本文给出了一个较为直接的思路。
思路的原理很简单,因为我们是将RNN最后一步的状态向量(也就是绿色阴影所代表的向量)传递给后面的分类器进行分类的,因此最后一步的状态向量\boldsymbol{h}_n就是一个目标向量。而RNN是一个递推的过程,
你见过正方形轮子的自行车吗?一般认为,只有圆形的车轮才能使我们的车子平稳向前移动,但这只是针对平直道路而言的。谁规定路一定是平的?只要铺好一条适当的道路,正方形车轮的自行车照样可以平稳前行!本文就让我们为方轮自行车铺一条路。
其实,方轮自行车已经不是新鲜玩意了,它早已出现在不少科技馆中。从图片中可以看到,它的特殊轨道是有许多段弧组成的,每一段弧的长度等于正方形的边长。车轮前行时,正方形会保持与弧形相切(确保不会打滑)。这样的路的形状是什么曲线呢?很幸运,它并不十分复杂,而且让人意外的是,它就是我们之前已经研究过的“悬链线”!原来,要设计这样的一个曲线的轨道,不需要多么高深的设计师,只需要我们手拿一条铁链,让它自由垂下......
Openwrt自动扫描WiFi并连接中继
By 苏剑林 | 2016-03-06 | 57948位读者 | 引用玩转Keras之seq2seq自动生成标题
By 苏剑林 | 2018-09-01 | 382068位读者 | 引用话说自称搞了这么久的NLP,我都还没有真正跑过NLP与深度学习结合的经典之作——seq2seq。这两天兴致来了,决定学习并实践一番seq2seq,当然最后少不了Keras实现了。
seq2seq可以做的事情非常多,我这挑选的是比较简单的根据文章内容生成标题(中文),也可以理解为自动摘要的一种。选择这个任务主要是因为“文章-标题”这样的语料对比较好找,能快速实验一下。
seq2seq简介
所谓seq2seq,就是指一般的序列到序列的转换任务,比如机器翻译、自动文摘等等,这种任务的特点是输入序列和输出序列是不对齐的,如果对齐的话,那么我们称之为序列标注,这就比seq2seq简单很多了。所以尽管序列标注任务也可以理解为序列到序列的转换,但我们在谈到seq2seq时,一般不包含序列标注。
要自己实现seq2seq,关键是搞懂seq2seq的原理和架构,一旦弄清楚了,其实不管哪个框架实现起来都不复杂。早期有一个第三方实现的Keras的seq2seq库,现在作者也已经放弃更新了,也许就是觉得这么简单的事情没必要再建一个库了吧。可以参考的资料还有去年Keras官方博客中写的《A ten-minute introduction to sequence-to-sequence learning in Keras》。
“让Keras更酷一些!”:小众的自定义优化器
By 苏剑林 | 2018-09-08 | 92183位读者 | 引用沿着之前的《“让Keras更酷一些!”:精巧的层与花式的回调》写下去~
今天我们来看一个小众需求:自定义优化器。
细想之下,不管用什么框架,自定义优化器这个需求可谓真的是小众中的小众。一般而言,对于大多数任务我们都可以无脑地直接上Adam,而调参炼丹高手一般会用SGD来调出更好的效果,换言之不管是高手新手,都很少会有自定义优化器的需求。
那这篇文章还有什么价值呢?有些场景下会有一点点作用。比如通过学习Keras中的优化器写法,你可以对梯度下降等算法有进一步的认识,你还可以顺带看到Keras的源码是多么简洁优雅。此外,有时候我们可以通过自定义优化器来实现自己的一些功能,比如给一些简单的模型(例如Word2Vec)重写优化器(直接写死梯度,而不是用自动求导),可以使得算法更快;自定义优化器还可以实现诸如“软batch”的功能。
Keras优化器
我们首先来看Keras中自带优化器的代码,位于:
https://github.com/keras-team/keras/blob/master/keras/optimizers.py
最近评论