21 Jan

怎么会这么巧!背后的隐藏信息

假设我是一名中学数学老师,在给学生兴致勃勃地讲“素数”,讲完素数的定义和相关性质后,正当我接着往下讲时,有个捣蛋的学生提问,“老师,你能不能举一个三位数的素数?”。可是我手头上没有1000以内的素数表,我也没记住超过100的素数,那怎么办呢?我只好在黑板上写出几个三位数,比如173、211、463,然后跟学生说“让我们来检验这些数是不是素数”。最终的结果是:它们都是素数!然后会有学生疑问:怎么会这么巧?

素数的概率

首先的问题是,任意写一个三位数,它是素数的概率是多少?三位数的素数共有143个,三位数共有900个,于是概率应该是143/900,大约是六分之一。看起来挺低的,要“蒙中”似乎不容易。

点击阅读全文...

17 Oct

两百万素数之和与“电脑病”

原则上来讲,同样的算法,如果分别在Python和C++上实现,那么Python的速度肯定比不上C++的。但是Python还被称为“胶水语言”,它允许我们把主要计算的部分用C或C++等高效的语言编写好,然后它作为“粘合剂”把两者粘合在一起。正因为如此,Python才有了各种各样的扩展库,这些库中有不少是用C语言编写的。因此,我们在编写Python程序的时候,如果可以用这些现成的库,速度会快很多。本文就是用Numpy来改进之前的《两百万前素数之和与前两百万素数之和》的计算。

算法本身是没有变的,只是用了Numpy来处理数组计算,代码如下:

点击阅读全文...

6 May

变分自编码器(五):VAE + BN = 更好的VAE

本文我们继续之前的变分自编码器系列,分析一下如何防止NLP中的VAE模型出现“KL散度消失(KL Vanishing)”现象。本文受到参考文献是ACL 2020的论文《A Batch Normalized Inference Network Keeps the KL Vanishing Away》的启发,并自行做了进一步的完善。

值得一提的是,本文最后得到的方案还是颇为简洁的——只需往编码输出加入BN(Batch Normalization),然后加个简单的scale——但确实很有效,因此值得正在研究相关问题的读者一试。同时,相关结论也适用于一般的VAE模型(包括CV的),如果按照笔者的看法,它甚至可以作为VAE模型的“标配”。

最后,要提醒读者这算是一篇VAE的进阶论文,所以请读者对VAE有一定了解后再来阅读本文。

VAE简单回顾

这里我们简单回顾一下VAE模型,并且讨论一下VAE在NLP中所遇到的困难。关于VAE的更详细介绍,请读者参考笔者的旧作《变分自编码器(一):原来是这么一回事》《变分自编码器(二):从贝叶斯观点出发》等。

VAE的训练流程

VAE的训练流程大概可以图示为

VAE训练流程图示

VAE训练流程图示

点击阅读全文...

28 Oct

在Python中使用GMP(gmpy2)

之前笔者曾写过《初试在Python中使用PARI/GP》,简单介绍了一下在Python中调用PARI/GP的方法。PARI/GP是一个比较强大的数论库,“针对数论中的快速计算(大数分解,代数数论,椭圆曲线...)而设计”,它既可以被C/C++或Python之类的编程语言调用,而且它本身又是一种自成一体的脚本语言。而如果仅仅需要高精度的大数运算功能,那么GMP似乎更满足我们的需求。

了解C/C++的读者都会知道GMP(全称是GNU Multiple Precision Arithmetic Library,即GNU高精度算术运算库),它是一个开源的高精度运算库,其中不但有普通的整数、实数、浮点数的高精度运算,还有随机数生成,尤其是提供了非常完备的数论中的运算接口,比如Miller-Rabin素数测试算法、大素数生成、欧几里德算法、求域中元素的逆、Jacobi符号、legendre符号等[来源]。虽然在C/C++中调用GMP并不算复杂,但是如果能在以高开发效率著称的Python中使用GMP,那么无疑是一件快事。这正是本文要说的gmpy2

点击阅读全文...

30 Oct

只有两个四阶群和六阶群

我们上近世代数课的时候,老师谈到在同构意义之下只有两个不同的四阶群,六阶群也是只有两个,还说到这是代数的研究生入学考试题目。说到这样了,我就饶有兴致地研究了一下,发现只有两个互不同构的四阶群这几乎是显然的,感觉这题用来做研究生考试题太水了吧?接着分析了一下六阶的情况,发现复杂了不少(元素增加)。而今天在实变函数课的时候,想到了一个简化的技巧,遂也证明了只有两个互不同构的六阶群。把结果和研究过程贴在这里,与大家分享。

两个四阶群

不管是四阶群还是六阶群,它们都是有限群。有限群的一个特点就是,可以把它们的乘法表写出来(只要不怕麻烦~~)。既然要研究四阶群的数目,我们只需要列出四阶群的乘法表就行了。设四阶群为$G_4=\{e, a, b, c\}$,其中$e$是单位元,根据这些信息,我们至少可以写出乘法表的一部分:
$$\begin{array}{c|cccc}
\cdot & e & a & b & c \\
\hline
e & e &a &b &c \\
a & a & & & \\
b & b & & & \\
c & c & & & \end{array}$$

点击阅读全文...

12 Nov

实数域上有限维可除代数只有四种

今天上近世代数课,老师谈到除环,举了一个非交换的除环的粒子,也就是四元数环,然后谈到“实数域上有限维可除代数只有4种”,也就是实数本身、复数、四元数和八元数(这里的可除代数就是除环)。这句话我听起来有点熟悉,又好像不大对劲。我记得在某本书上看过,定义为实数上的超复数系,如果满足模的积性,那么就只有以上四种。但是老师的那句话表明即使去掉模的积性,也只有四种。我自然以为老师记错了,跟老师辩论了一翻,然后回到宿舍又找资料,最终确定:实数域上有限维可除代数真的只有四种!下面简单谈谈我对这个问题的认识。

当然,这里不可能给出这个命题的证明,因为这个证明相当不简单,笔者目前也没有弄懂,但是粗略感觉一下为什么,还是有可能的。看到这个命题,我们一下子的感觉可能是:怎么会这么少!我们这里通过例子简单说明一下,确实不会多!

我们已经对复数系很熟悉了,也就是定义在实数上的向量空间,基为$\{1,i\}$,并且给定乘法为
$$1\times i=i \times 1=i,\quad 1^2=1,\quad i^2=-1$$

点击阅读全文...

13 Feb

Designing GANs:又一个GAN生产车间

在2018年的文章里《f-GAN简介:GAN模型的生产车间》笔者介绍了f-GAN,并评价其为GAN模型的“生产车间”,顾名思义,这是指它能按照固定的流程构造出很多不同形式的GAN模型来。前几天在arxiv上看到了新出的一篇论文《Designing GANs: A Likelihood Ratio Approach》(后面简称Designing GANs或原论文),发现它在做跟f-GAN同样的事情,但走的是一条截然不同的路(不过最后其实是殊途同归),整篇论文颇有意思,遂在此分享一番。

f-GAN回顾

《f-GAN简介:GAN模型的生产车间》中我们可以知道,f-GAN的首要步骤是找到满足如下条件的函数$f$:

1、$f$是非负实数到实数的映射($\mathbb{R}^* \to \mathbb{R}$);

2、$f(1)=0$;

3、$f$是凸函数。

点击阅读全文...

17 Nov

[转载] 做数学一定要是天才吗?

(译自 陶哲轩 博客, 译者 liuxiaochuang)
(英文原文:Does one have to be a genius to do maths?)

这个问题的回答是一个大写的:不!为了达到对数学有一个良好的,有意义的贡献的目的,人们必须要刻苦努力;学好自己的领域,掌握一些其他领域的知识和工具;多问问题;多与其他数学工作者交流;要对数学有个宏观的把握。当然,一定水平的才智,耐心的要求,以及心智上的成熟性是必须的。但是,数学工作者绝不需要什么神奇的“天才”的基因,什么天生的洞察能力;不需要什么超自然的能力使自己总有灵感去出人意料的解决难题。

大众对数学家的形象有一个错误的认识:这些人似乎都使孤单离群的(甚至有一点疯癫)天才。他们不去关注其他同行的工作,不按常规的方式思考。他们总是能够获得无法解释的灵感(或者经过痛苦的挣扎之后突然获得),然后在所有的专家都一筹莫展的时候,在某个重大的问题上取得了突破的进展。这样浪漫的形象真够吸引人的,可是至少在现代数学学科中,这样的人或事是基本没有的。在数学中,我们的确有很多惊人的结论,深刻的定理,但是那都是经过几年,几十年,甚至几个世纪的积累,在很多优秀的或者伟大的数学家的努力之下一点一点得到的。每次从一个层次到另一个层次的理解加深的确都很不平凡,有些甚至是非常的出人意料。但尽管如此,这些成就也无不例外的建立在前人工作的基础之上,并不是全新的。(例如, Wiles 解决费马最后定理的工作,或者Perelman 解决庞加莱猜想的工作。)

点击阅读全文...