小时候总是听到“光阴似箭”,却总是觉得时间过得飞快,尤其是放假的时间迟迟不来。而现在,随着年龄的增长,我却发现,想要留住时间,如同抽刀断水一般,无济于事。尤其是美好的时刻,稍瞬即逝。大学,上学、军训的情况依然清晰在目,犹如发生在昨天,而现在已经是寒假了。有时我会怀疑是不是我的记忆力增强了,却发现没有这回事。原来,真相只有一个:光阴似箭!
我不喜欢仔细地规划自己的人生,因为未来太多未知了,也许你今天发现这方面很有趣,明天又会发现另一方面很有趣,所以我只知道我尽力做好当前喜欢做的事情就行。因此,在上大学之前,我也没有对大学想太多。想象中的大学是一个静静自修的教室加上一个丰富的图书馆而已。来到华师,确实有点意外,也有点遗憾,但是,仅此而已。虽然以前努力过要奔向更优秀的大学,但是这已经成为我宝贵的经验。以后在和朋友聊天时,我又多了一个话题。这不得不说是一件很美妙的事情!
阿达马不等式
设有n阶实矩阵\boldsymbol{A}=(a_{ij})_{n\times n},那么它的行列式满足阿达马(Hadamard)不等式
\begin{equation}
\left(\det \boldsymbol{A}\right)^2 \leq \prod\limits_{i=1}^{n}\left(a_{1i}^2+a_{2i}^2+\dots+a_{ni}^2\right)
\end{equation}
这是阿达马在1893年首先发表的。根据体积就是行列式的说法,上述不等式具有相当明显的几何意义。当n=2时,它就是说平行四边形的面积不大于两边长的乘积;当n=3时,它就是说平行六面体的体积不大于三条棱长的乘积;高维可以类比。这些结论在几何中几乎都是“显然成立”的东西。因此很难理解为什么这个不等式在1893年才被发现。当然,代数不会接受如此笼统的说法,它需要严格的证明。
视频演示:费曼的茶杯
By 苏剑林 | 2014-02-07 | 20573位读者 | 引用为了形象地展示为什么有些系统需要旋转720度而不是360度才能恢复原状,费曼想到了一个“茶杯法”。看了“茶杯法”的步骤之后,我突然想起了电影《太极1》的梁小龙的一个端药镜头,正好对应着费曼的“茶杯法”,遂把镜头剪了出来,供大家欣赏。
请仔细观察梁小龙的手转了多少圈?
从费马大定理谈起(十二):再谈谈切线法
By 苏剑林 | 2014-10-25 | 27493位读者 | 引用首先谈点题外话,关于本系列以及本博客的写作。其实本博客的写作内容,代表了笔者在这段时间附近的研究成果。也就是说,我此时在写这篇文章,其实表明我这段时间正在研究这个问题。而接下来的研究是否有结果,有怎样的结果,则是完全不知道的。所以,我在写这篇文章的时候,并不确定下一篇文章会写些什么。有些类似的话题,我会放在同一个系列去写。但不管怎样,这些文章可能并不遵循常规的教学或者学习思路,有些内容还可能与主流的思想方法有相当出入,请读者见谅,望大家继续支持!
上一篇我们谈到了切线法来求二次和三次曲线的有理点。切线法在寻找不高于三次的曲线上的有理点是很成功的,可是对于更高次的曲线有没有类似的方法呢?换句话说,有没有推广的可能性。我们从纯代数的角度来回复一下切线法生效的原因。切线法,更一般的是割线法,能够起作用,主要是因为如果有理系数的三次方程有两个有理数的根,那么第三个根肯定是有理数。如果只有一个已知的有理根,那么就可以让两个根重合为已知的那个根,从而割线变成了切线。
进驻中山大学南校区,折腾校园网
By 苏剑林 | 2016-09-05 | 86994位读者 | 引用开始研究僧之旅,希望有一天能企及扫地僧的境界。
进入中山大学后,各种郁闷的事情就来了。首先最郁闷的就是开学时间特早,8月26日开学,感觉至少比一般学校早了一星期,开学这么早有意思么~~接着就是感觉中大的管理制度各种混乱,比我本科的华师差多了。好吧,这些琐事先不吐槽,接下来弄校园网,这是作死的开始。
我们是在南校区的,校园网是通过锐捷客户端来认证的,而我是用macbook的,不过中大这边还很人性化地提供了Mac版的锐捷,体积就1M左右,挺好的。但众所周知,macbook并没有有线网卡,每次我上网都得插着个USB网卡然后连着网线,这该有多郁闷。于是想办法通过路由器拨号。我也不算没经验的了,对openwrt这个系统有过一定研究,以前在本科的时候也是锐捷,可以用mentohust替代拨号,很简单。于是我在这里重复这样的过程,发现一直认证失败,按照网上提示的各种方法,都无法解决。
经过研究,我发现在Windows下,这里就只能用官方提供了锐捷4.90版本,从其他地方下载的更高级或者更低级的锐捷,都无法通过验证。估计就是因为这个机制,导致了mentohust难以通过验证。而且网上流行的mentohust都是基于V2协议的,但4.90是基于V4的。后来我又去下载了V4版本的进行交叉编译,测试发现还不成功。几近绝望的时候,我发现了mentohust-proxy,一个mentohust的改进版,让我找到了希望。(怎么找到它?我是直接到github搜索了,因为实在没辙了~~)
原理很简单,如果直接通过mentohust无法完成认证,那么就通过代理模式,由电脑来完成认证,而mentohust只需要负责发送心跳包维持联网就行。这是个很折中的方案,但应该说是一个很通用的方案,因为它的成功与否,基本就取决于自己电脑的锐捷客户端而已。看到这个方案,我就知道有戏了,于是赶紧补习了一下交叉编译的知识,最后成功编译好了,并且在路由上成功地完成了认证。
Python的多进程编程技巧
By 苏剑林 | 2017-02-19 | 40705位读者 | 引用过程
在Python中,如果要多进程运算,一般是通过multiprocessing来实现的,常用的是multiprocessing中的进程池,比如:
from multiprocessing import Pool
import time
def f(x):
time.sleep(1)
print x+1
return x+1
a = range(10)
pool = Pool(4)
b = pool.map(f, a)
pool.close()
pool.join()
print b
这样写简明清晰,确实方便,有趣的是,只需要将multiprocessing换成multiprocessing.dummy,就可以将程序从多进程改为多线程了。
用Numpy实现高效的Apriori算法
By 苏剑林 | 2018-05-10 | 105068位读者 | 引用节省显存的重计算技巧也有了Keras版了
By 苏剑林 | 2020-04-29 | 54726位读者 | 引用不少读者最近可能留意到了公众号文章《BERT重计算:用22.5%的训练时间节省5倍的显存开销(附代码)》,里边介绍了一个叫做“重计算”的技巧,简单来说就是用来省显存的方法,让平均训练速度慢一点,但batch_size可以增大好几倍。该技巧首先发布于论文《Training Deep Nets with Sublinear Memory Cost》,其实在2016年就已经提出了,只不过似乎还没有特别流行起来。
探索
公众号文章提到该技巧在pytorch和paddlepaddle都有原生实现了,但tensorflow还没有。但事实上从tensorflow 1.8开始,tensorflow就已经自带了该功能了,当时被列入了tf.contrib
这个子库中,而从tensorflow 1.15开始,它就被内置为tensorflow的主函数之一,那就是tf.recompute_grad
。
找到tf.recompute_grad
之后,笔者就琢磨了一下它的用法,经过一番折腾,最终居然真的成功地用起来了,居然成功地让batch_size
从48增加到了144!然而,在继续整理测试的过程中,发现这玩意居然在tensorflow 2.x是失效的...于是再折腾了两天,查找了各种资料并反复调试,最终算是成功地补充了这一缺陷。
最后是笔者自己的开源实现:
该实现已经内置在bert4keras中,使用bert4keras的读者可以升级到最新版本(0.7.5+)来测试该功能。
最近评论