预设未来

我喜欢给自己预设未来。想象一下未来的我在做什么,我怎么才能做这件事,我需要准备好什么。

通常认为,现在能影响未来,而未来不能影响现在。
ML PA的研究经历让我发现,未来可以影响现在。不但可以,通过未来影响现在的技巧还在被很多人使用,甚至有数学模型来表达这种影响。

PA具有记忆效应,即过去的输入会影响现在的输出。但数据表明,未来的输入也会影响现在的输出。把未来的数据加入训练模型中,能增加对当前输出预测的准确度。这种结果乍听之下有些奇怪,细想之后又觉得很有道理。未来的点虽然还没有输出,但是PA会预知未来的点。PA为了能够在未来输出指定的信号,而提前调整它自己当前的状态。而这种调整影响了当前的输出,同时也影响了未来的输出。这种对未来的影响不是来自现在的输出。

因此,并非未来直接影响现在,而是对未来的预期会影响当前的某些状态,当前的某些状态又影响了当前的表现,也会影响未来的表现。也就是说,在当前状态的联系下,现在的表现与未来的表现发生了相互作用。类似马尔可夫的数学模型能表达这一系列逻辑。当前的某些状态就是模型中的潜变量。当前的表现与未来的表现是显变量。

这里的关键是对未来的预期,如果没有对未来的预期,当前的状态和未来的表现就没有了联系。未来也就无法影响现在。就好比,如果PA不知道能提前预知未来的点,也就不会对当前的状态作调整,因此也不会影响当前的输出。

以PA为例子会有一些歧义。因为PA可以预知未来的点,所以PA的未来输出会对当前输出有影响。但人无法预知未来,所以对人来说,未来对现在没有影响。我不知道这么认为。所谓的PA提前预知未来的点,并不是真的预知未来。因为这些点还没有输出,只是人为给它加上的对未来输出的期望。PA会照着这个期望去调整。也许下一个点是一个非常极端的信号,PA调整之后仍无法输出所预期的点。因为“PA提前预知的未来的点”不是真实的未来,而是预期的未来。但因为有了这个预期,现在的输出改变了,未来的输出改变了。

通过未来影响现在的技巧。电影《摔跤吧,爸爸》中有个片段。阿米尔汗在买鸡,与老板砍价。他说他的女儿未来会成为世界冠军,但她需要吃肉。后来他的女儿真的成了世界冠军。此刻她不是,但老板仍然把鸡卖给了他。

我喜欢给自己预设未来。为了实现这个未来,我必须从现在开始努力。家人和朋友看到我的努力,会来支持我。未来也因为我的努力而变得可能。

-- more --

遇到瓶颈的时候,真的要咬牙坚持吗?

昨天晚上芒果爸爸教小芒果认字。小芒果的状态很不好,认了半个小时多,有几个字就是记不住,爸爸已经开始烦躁,芒果也装死耍无赖。我赶紧出来圆场,建议今天就学到这里。芒果爸爸很生气:“今天晚上如果不把几个字学完,就别想睡觉”。芒果很无奈的打着哈欠。
这种状态又僵持了10分钟,毫无进展。
芒果爸爸突然改了策略,挑出那张难认的字,换上同样数量的简单字。又改变游戏规则,变被动学字为主动认字。
10分钟过去了,芒果不但把字学完,还很开心地向我展示了学习成果。

遇到瓶颈的时候,通常我们被教育要坚持,坚持到底就会胜利。
于是,我们就陷入跟自己较劲、跟问题死磕的境地。
这不是必须的。
也许,这个瓶颈不是必经之地。

-- more --

升维 --- Learn from 线代 Chapter 1

线代Chapter 1讲的是向量和矩阵的基本概念,都是已知内容,给我留下印象最深的是它的升维思想。

我想说的升维,不是指(1) -> (1,1) -> (1,1,1)这种空间上的升维。而是指标量1 -> 向量(1) -> 矩阵[[1]] -> 张量[[[1]]]这种数据组织方式的升维。

一组标量数据,升维之后变成了一个向量。一组向量,升维之后变成了一个矩阵。
原本零散的数据,变成了一个整体。两组有内在关联的数据之间的计算,简化成了两个更高维度数据之间的计算。这是对数据的抽象。

再进一步扩展,聚在一起的数据也可以有不同的数据类型,只要是相关的数据,就可以聚到一起。这就形成了C语言里面的struct,或者python里面的tuple。那么定义在高维数据上的操作,例如向量相加,就类似于定义在struct上的算法。

而C++的class比C的struct在抽象方面做得更彻底。它不但把数据聚到一起,还它当成一种新的类型,并赋予它独特的行为。此时,一个完整的class实例才有意义,因为完整了class实例才有独立行为的能力。如果要在线代中类比这种做法的话,可以是SVD分解等类似的操作。此时的操作对象就是整个矩阵了。单独提取低维数据(一个class的内部数据、一个矩阵中的某个元素),对于高维数据(class实例、矩阵)的独特行为(类的行为、矩阵的SVD)来说,是没有意义的。

此时我想到了蚂蚁,通常认为一只蚂蚁是一个生命个体。单个蚂蚁虽然拥有完成的身体组件和独立的思想,但它一旦离开了蚁群,蚁生变得毫无意义,这不只是能不能存活的问题。因此,整个蚁群才是一个意义的生命的基本单位。

-- more --

我为什么要做ML PA

第6章 深度前馈网络,这是花书深度学习相关内容的第一篇,原以为只是普通的介绍,没有读出任何感觉。直到我做了一年的ML PA,今日整理笔记时再次通读了这一篇,一文惊醒梦中人。

这一篇从“线性模型”开始,引入到了DL历史的深层逻辑。先回顾一下它的主要内容。

  1. 介绍线性模型的优点和缺点:
    优点:能通过闭解形式或凸优化形式高效且可靠地拟合。
    缺点:只能表达线性关系,无法理解任何两个输入变量间的相互作用。
  2. 介绍针对缺点的解决方法,引入kernal $\phi$
  3. 选择$\phi$的三种手段:(1)使用一个通用的$\phi$(2)手动设计$\phi$(3)让机器自己学习$\phi$

通信领域的DPD算法与机器学习是八竿子打不着的关系,但这一段内容却是对DPD算法的现状和我想做的事情做了精准的概括。

传统的DPD算法本质上是一个线性模型,我们能够方便地使用LS求解DPD参数,正是沾了线性模型的光。因为线性模型的优点就是“能通过闭解形式或凸优化形式高效且可靠地拟合。”

由于PA的非线性,单纯的线性模型肯定是解决不了问题的。解决方案就是kernel。而各种DPD算法的改进,实际上就是设计各种不同的kernel。

设计kernel的方法有很多,文中第一条是使用一个通用的kernel。并且指出,只要kernel的维度足够高,就可以拟合任何训练数据。虽然我没有见谁在DPD算法中使用文中所提的RBF kernel,但是在DPD算法历史中,确实存在这样一种通用的kernel,我们把它称为Generic Memory Polynomial(GMP)算法。

GMP算法是传统DPD算法的基础。几乎所有的DPD算法都是基于GMP算法的改进。这些改进主要是依据(1)根据业务原理设计更合适的kernel(2)用更少的资源实现更高的维度。这些改进需要透彻理解数据、数学和硬件的特点,有时需要根据特殊的场景做专门的调整。正如文中所说:“手动地设计kernel这种方法,需要人们数十年的努力、从业者擅长特定领域,并且不同领域之间很难迁移”。同时也说明,这一方法“在深度学习出现以前是主流”,但现在不一样,我们该试试新的方法了。

用深度学习的方法去学习kernel,这正是我想做的事,也是我正在努力去做的事。虽然我现在在做的是ML PA,不是ML DPD,但熟悉这一领域的人都知道,DPD算法与PA行为模型是相通的。做ML PA正是为以后做ML DPD做准备。

-- more --

吾生也有涯,而知也无涯

吾生也有涯,而知也无涯。以有涯随无涯,殆己. — 庄子

人的生命有限,但知识却无限,用有限的生命去追求无限的知识,很危险。

怎么办?我看到的大多数回答是:把时间和精力用在重要的事上,不要试图理解一切,要敬畏复杂性。

阅读古文典籍,我看到另一种回答 : 生。

《易经》说:易有太极,始生两仪。两仪生四象,四象生八卦。
《道德经》说:道生一,一生二,二生三,三生万物。
《论语》说:一以贯之。

这三句话反应一个共同的思想,就是“用一种道理贯穿于万事万物”,万千道理都是由一个道理推演而出。
知虽然无涯,但它的核心(道、本质)是有涯的。我们不需要以有涯随无涯,我们需要以有涯的生命去理解事物的本质(道),掌握推演的方法(生),就可以得到无涯的“知”。

-- more --