3 May

从动力学角度看优化算法(四):GAN的第三个阶段

在对GAN的学习和思考过程中,我发现我不仅学习到了一种有效的生成模型,而且它全面地促进了我对各种模型各方面的理解,比如模型的优化和理解视角、正则项的意义、损失函数与概率分布的联系、概率推断等等。GAN不单单是一个“造假的玩具”,而是具有深刻意义的概率模型和推断方法。

作为事后的总结,我觉得对GAN的理解可以粗糙地分为三个阶段:

1、样本阶段:在这个阶段中,我们了解了GAN的“鉴别者-造假者”诠释,懂得从这个原理出发来写出基本的GAN公式(如原始GAN、LSGAN),比如判别器和生成器的loss,并且完成简单GAN的训练;同时,我们知道GAN有能力让图片更“真”,利用这个特性可以把GAN嵌入到一些综合模型中。

2、分布阶段:在这个阶段中,我们会从概率分布及其散度的视角来分析GAN,典型的例子是WGAN和f-GAN,同时能基本理解GAN的训练困难问题,比如梯度消失和mode collapse等,甚至能基本地了解变分推断,懂得自己写出一些概率散度,继而构造一些新的GAN形式。

3、动力学阶段:在这个阶段中,我们开始结合优化器来分析GAN的收敛过程,试图了解GAN是否能真的达到理论的均衡点,进而理解GAN的loss和正则项等因素如何影响的收敛过程,由此可以针对性地提出一些训练策略,引导GAN模型到达理论均衡点,从而提高GAN的效果。

点击阅读全文...

22 Dec

上周笔者写了《生成扩散模型漫谈(十四):构建ODE的一般步骤(上)》(当时还没有“上”这个后缀),本以为已经窥见了构建ODE扩散模型的一般规律,结果不久后评论区大神 @gaohuazuo 就给出了一个构建格林函数更高效、更直观的方案,让笔者自愧不如。再联想起之前大神之前在《生成扩散模型漫谈(十二):“硬刚”扩散ODE》同样也给出了一个关于扩散ODE的精彩描述(间接启发了上一篇博客的结果),大神的洞察力不得不让人叹服。

经过讨论和思考,笔者发现大神的思路本质上就是一阶偏微分方程的特征线法,通过构造特定的向量场保证初值条件,然后通过求解微分方程保证终值条件,同时保证了初值和终值条件,真的非常巧妙!最后,笔者将自己的收获总结成此文,作为上一篇的后续。

前情回顾

简单回顾一下上一篇文章的结果。假设随机变量$\boldsymbol{x}_0\in\mathbb{R}^d$连续地变换成$\boldsymbol{x}_T$,其变化规律服从ODE
\begin{equation}\frac{d\boldsymbol{x}_t}{dt}=\boldsymbol{f}_t(\boldsymbol{x}_t)\label{eq-ode}\end{equation}

点击阅读全文...

6 Nov

这个星期对微分方程的认识

这个星期研究了两道微分方程问题:“导弹跟踪”以及“太阳炉”问题。从中我加深了对微分方程的理解,也熟悉了微分方程的相关运算。仅此记录,权当抛砖引玉。

一、微分方程的本质

很多读者都知道,自从牛顿和莱布尼兹发明微积分之后,微积分就迅速地渗透到了几乎所有的学科,后来发展出许多出色的分支,如变分、微分方程等。众所周知,微分方程是解决很多重要问题的工具。不知道各位读者对微分及微分方程的认识如何?其实对于常微分方程而言,它的本质和我们已经学习过的代数方程一样,只不过相互之间的对应运算关系除了常规的加减乘除幂等之外,还多了两个相互关系:微分和积分。例如对于一阶微分方程$\dot{y}=f(x,y)$,也许大家都认为它是一个二元方程,其实不然,这是一个“四个未知数、三道方程”所组成的方程组,我们可以将它写成

$$dy=f(x,y)dx,y=\int dy,x=\int dx$$

点击阅读全文...

26 Nov

求解微分方程的李对称方法(二)

由于重装系统时的粗心大意,笔者把《求解微分方程的李对称方法》的Word文档弄丢了,更不幸的是存有该文档的U盘也弄丢了~没办法,只好重新把这篇文章录入了。幸好之前曾把它打印成纸质版,还有旧稿可以参考。现发布《求解微分方程的李对称方法(二)》,希望能够为对李对称方法有兴趣的朋友提供些许资源。

相比(一),(二)将所有内容重新用CTex录入了,果然,$\LaTeX$才是写数学论文软件中的佼佼者,虽然是纯代码编辑,但是这正符合我追求简洁清晰的风格。在内容上,(二)增加了一阶常微分方程组的内容,并对(一)的部分细节做了修改,本文完成后就初步相对完整地叙述了一阶常微分方程组的李对称积分的思路,内容增加到了13页。而在接下来的(三)中,将会提供李代数的内容;如果有(四)的话,就会谈到李对称方法的计算机实现。希望大家会喜欢这系列文章。更期待大家的读后感(包括挑错)^_^

点击阅读全文...

9 Aug

线性Transformer应该不是你要等的那个模型

在本博客中,我们已经多次讨论过线性Attention的相关内容。介绍线性Attention的逻辑大体上都是:标准Attention具有$\mathcal{O}(n^2)$的平方复杂度,是其主要的“硬伤”之一,于是我们$\mathcal{O}(n)$复杂度的改进模型,也就是线性Attention。有些读者看到线性Attention的介绍后,就一直很期待我们发布基于线性Attention的预训练模型,以缓解他们被BERT的算力消耗所折腾的“死去活来”之苦。

然而,本文要说的是:抱有这种念头的读者可能要失望了,标准Attention到线性Attention的转换应该远远达不到你的预期,而BERT那么慢的原因也并不是因为标准Attention的平方复杂度。

BERT之反思

按照直观理解,平方复杂度换成线性复杂度不应该要“突飞猛进”才对嘛?怎么反而“远远达不到预期”?出现这个疑惑的主要原因,是我们一直以来都没有仔细评估一下常规的Transformer模型(如BERT)的整体计算量。

点击阅读全文...

6 Aug

Transformer升级之路:5、作为无限维的线性Attention

《Performer:用随机投影将Attention的复杂度线性化》中我们了解到Google提出的Performer模型,它提出了一种随机投影方案,可以将标准Attention转化为线性Attention,并保持一定的近似。理论上来说,只要投影的维度足够大,那么可以足够近似标准Attention。换句话说,标准Attention可以视作一个无限维的线性Attention。

本文将介绍笔者构思的另外两种将标准Attention转换为无限维线性Attention的思路,不同于Performer的随机投影,笔者构思的这两种方案都是确定性的,并且能比较方便地感知近似程度。

简要介绍

关于标准Attention和线性Attention,这里就不多做介绍了,还不了解的读者可以参考笔者之前的文章《线性Attention的探索:Attention必须有个Softmax吗?》《Transformer升级之路:3、从Performer到线性Attention》。简单来说,标准Attention的计算方式为
\begin{equation}a_{i,j}=\frac{e^{\boldsymbol{q}_i\cdot \boldsymbol{k}_j}}{\sum\limits_j e^{\boldsymbol{q}_i\cdot \boldsymbol{k}_j}}\end{equation}

点击阅读全文...

9 Nov

VQ一下Key,Transformer的复杂度就变成线性了

Efficient Transformer,泛指一切致力于降低Transformer的二次复杂度的工作,开始特指针对Attention的改进,后来更一般的思路,如傅里叶变换、线性RNN等,也被归入这个范畴。不得不说,为了降低Transformer的二次复杂度,各路大牛可谓是“八仙过海,各显神通”,各种神奇的思路“百花齐放”,笔者也从中学习到了不少理论知识。然而,尽管Efficient Transformer在理论上是精彩的,但实际上该领域一直都是不愠不火的状态,并没有实际表现十分出色的模型,在LLM火爆的今天,甚至已经逐渐淡出了大家的视野,也淡出了笔者的兴趣范围。

不过,最近有一篇论文《Transformer-VQ: Linear-Time Transformers via Vector Quantization》,却让笔者为之拍案叫绝。作者非常高明地洞察到,只需要对标准Attention的Key做一下VQ(Vector Quantize),复杂度就会自动降低为线性!这种线性化思路保留了标准Attention的形式,是标准Attention到线性Attention的一个完美过渡,同时最大程度上保留了标准Attention的能力。

高效难题

说起来,本站也算是比较早关注Efficient Transformer相关工作了,最早可以追溯到2019年解读Sparse Transformer的一篇博客《为节约而生:从标准Attention到稀疏Attention》。此后,陆续写的关于Efficient Transformer的其他博文还有

点击阅读全文...

26 May

胡闹的胜利:将算子引入级数求和

在文章《有趣的求极限题:随心所欲的放缩》中,读者“最近倒了”提出了一个新颖的解法,然而这位读者写得并非特别清晰,更重要的是里边的某些技巧似乎是笔者以前没有见过的,于是自行分析了一番,给出了以下解释。

胡闹的结果

假如我们要求级数和
$$\sum_{k=0}^n \binom{n}{k}\frac{A_k}{n^k}$$
这里$A_0=1$。一般而言,我们用下标来标注不同的数,如上式的$A_k,\,k=0,1,2,\dots$,可是有的人偏不喜欢,他们更喜欢用上标来表示数列中的各项,他们把上面的级数写成
$$\sum_{k=0}^n \binom{n}{k}\frac{A^k}{n^k}$$
可能读者就会反对了:这不是胡闹吗,这不是让它跟分母的n的k次幂混淆了吗?可是那人干脆更胡闹一些,把级数写成
$$\sum_{k=0}^n \binom{n}{k}\frac{A^k}{n^k}=\left(1+\frac{A}{n}\right)^n$$
看清楚了吧?他干脆把$A$当作一个数来处理了!太胡闹了,$A$是个什么东西?估计这样的孩子要被老师赶出课堂的了。

可是换个角度想想,似乎未尝不可。

点击阅读全文...