通过训练,机器或能胜任一般性的编程任务,部分程序员会因此进化成为工具操作员。
机器智能的技术理想是,在智力上接近普通人。因为人的直觉和创造力难以模仿,所以需要经过反复的训练和调试才能够接近这个理想。
机器如何训练?
>>> 机器直接阅读学习源代码。
智能的关键在于学习和演算。因此,机器必需要进行某种形式的学习,并拥有一个演算的战场。下面几点在必要时都需要演算的支持。
- 模拟执行。 要求在执行中能判断变量可能的取值范围。
- 工具类的功能描述。如 List, Stack, Set, Map, Collection...方法传入什么样的数据?属性值的前后差异?返回什么样的数据?机器可尝试在模拟执行中总结这些功能。必要时人工撰写功能描述。
- 树的概念和使用。比如遍历、打印、查找叶结点、判断结点间的关系……让机器阅读这些代码,以至领会。同时我们也提供给机器能够生成类似功能的组件,并引导其对组件进行组装和自我验证,所生成的算法其初始价值为零,随着复用次数的增加,价值不断提升。
- 机器需要懂一点算术和方程知识。能发现在变化过程中不同属性间的,有规律的算术关系。
- 机器需要懂一点不等式和集合知识。……树、算术、不等式、集合这些都是智能所需的的基本概念。关于算术和不等式,可参照项目:http://mathy.xyz/ ;虽然求解复杂的方程和不等式并非智能的关键,但是对事物之间的数学或逻辑关系做出洞察是智能的必须。
- 代码块的功能描述。描述可以是递归的。传入什么数据?执行什么动作?已有变量发生了何种变化?生成了什么数据?必要时由人来撰写一些功能特征。……功能特征的描述近于主谓宾式的逻辑,必要时人工撰写各种类来表达相应的逻辑,并且要支持穷举。
- 演算的方法有:等价替换、关系替换、反事实分析、回避非预期的条件,等等。在代码块中,算法可尝试各种可能的动作,分析相应的功能特征。最终的特征数量要尽可能地少,尽可能属于因果性质的关键特征。当因果难以获取时,通过训练来积累经验是理所当然。
- 很多情况下,必须通过人工来引导机器的学习过程。主要表现为:在某种情况下应当重点关注哪些特征。
>>> 阅读理解了大量的源代码后,机器可以开始尝试撰写不太复杂的算法。
- 借助工具从海量的函数库中查找算法:find function from library by "in/out demo"。 举例:http://mathy.xyz/tool/findFun.htm
- 借助强大的findBug来发现代码中的潜在异常。举例 :http://mathy.xyz/tool/findBug.html
- 根据输入参数和功能验证函数,交由机器生成普通算法。但功能验证函数有时候是难以表达的。
- 正确的算法常常来自于对问题代码的,反复的拼接组合和修正。在这个过程中,机器必然需要去了解:什么样的代码是有问题的?这也因此促进了 findBug工具的实现。
- 逻辑优化。穷举10个布尔变量组成的【与或非逻辑式】对机器来说似乎不难,故能够优化之。更抽象的逻辑优化也是同理。或者借助于训练,以非数学的方式让机器学习逻辑优化的技巧。
- 只有人才能够优化算法。比如,机器学会了选择排序,但人却能够把它优化成快速排序。这是因为:优化常常要用到难以描述的抽象方法或直觉性很强的创造性思路,除非能够有效穷举各种方案或存在相应的套路。
- 只有人才能够创造新算法。这一点不必担心,因为多数公司对新算法没有什么需求。
- 小算法的复用率太低。99%的小算法在本质上业已存在。但因为复用率低,导致我们经常是“不断重复地再造”着算法。因此我们需要更好的算法查找技术,以及对相似算法的改造技术。如何判断相似性?如何进行改造?暂无思路。
- 复杂的大算法在使用上有难度。这是个难题。不议。
—— 2020-05, 上海