联结主义和符号主义
很久以来人们都注重于从符号主义,也就是最基本的数理逻辑开始模拟人工智能。这其实很好理解,就像现如今计算机程序已经可以执行近乎所有命令,可以覆盖现实中的方方面面,而计算机程序正是基于数理逻辑的一步步推演得来。所以以前的人们猜测,使用符号的堆砌,逻辑的整理,就可以让计算机拥有近乎全能和自成长的能力,从而实现真正意义上的强人工智能。
不过在实践中大家很快就认识到这是一个几乎不可能完成的任务。符号主义最大的问题在于框架的定义,即便预先定义了自成长逻辑,其不可能脱离框架成长,而设计一个可以应对一切的框架,还要能自成长,是相当困难的事情。我并不否认这种可能性,但这看起来不仅是个体力活,更是一个需要天才的发想的领域。说白了就是大家的聪明才智还不到能够完美地设计出一个完美的逻辑框架来包揽一切,哪怕仅仅在一个较小的领域。当然实际操作中在特定领域,比如语言学习之类的领域,这种框架似乎已经趋近于完美,但是细化还是太过费工了。
联结主义则是更为彻底的实用主义,不在乎其内部逻辑,而更在乎最终的输入和输出。在深度学习发展起来和硬件水平提升之后,这一流派自然就水涨船高。但是说到底所谓的神经网络,不管其连接方式如何,内部连接再怎么调整,也离不开类似马尔科夫链的结构,说到底就是一个超大的概率表。他做的事情无非就是用庞大的自由度,根据过往的经验,来拟合这个输入匹配的输出。而我们都知道,在统计上,拟合的结果虽然能在趋势上反应实际数据的趋势,但其几乎无法代表任何一组数据,在数学和统计层面上来说这并不是问题,但把这个问题复杂化到各种人类能理解的内容上看,这个问题就尤为严重。简单点说就是单纯的神经网络能够能够根据过往的经验找出规律,推测出与输入匹配的输出,但这个输出极大概率不会和过往的任何内容匹配,虽然看着很像。对于“创造性”来说这当然是好事,但对于“可靠性”来说,这就是彻底的灾难。具体一点的例子就是LLM中常有的“幻觉”现象,在没有任何提示的情况下,LLM内部的参数其实是会学习到一些资料内容的,但是你让他回答的话,极大概率是会出现偏差的。这种问题解决方法有很多,但大部分解决方式更像是拆东墙补西墙,比如引入数据库,学习复述数据库信息,以至于各类混合专家系统,但都是治标不治本,其没有从根源上解决神经网络内部缺少真正意义上的逻辑的毛病,以及真正意义上对记忆的整理能力。
从历史和现状上来说,这两派都还没真正意义上诞生出“智能”,虽然联结主义和神经网络确实让大家看到了人工智能的雏形,甚至已经有将它们当作真正智能对待的人出现,但目前为止的进展都还远远不够。特别是神经网络让大家开始迷信堆砌参数的方式,浪费算力也浪费时间,这种不求甚解地一味堆砌内容的做法就如同旧时代不了解科学的人不理解自然现象而设计一大堆仪式动作来企图和自然沟通一般愚昧。
我心目中的强人工智能
创造强人工智能是一种浪漫。人类一直都在试图创造比自己更强的东西,这是人类独有的理性的结晶。生物的本能会让我们畏惧他们,但是理性的狂热会让我们追求他们。
强人工智能自然也分几类,但主要还是关注在拟人和非拟人层面,非拟人应用比较广泛,我也不太了解,还是就聊聊拟人的人工智能吧。
那么问题来了,要拟人首先得了解人,而遗憾的是人类到现在都不怎么了解自己。宽泛一点谈,拟人应该拟什么方面?从过往的学习经验,我们不难看出人类的认知系统里面突出的两个特征,强化认知和遗忘。不管是记忆也好,逻辑也好,在刚接触的时候容易产生暧昧的印象,也就是似是而非,容易回答错,容易与脑海中印象更深的内容混杂。而当同样的内容接触多几次后,印象被强化,脑海能准确地记忆并复现接触到的内容。但随着时间的流逝,印象又会逐步模糊,但不会完全丢失,直到再次接触相同或者相似内容又能唤醒。听起来确实很像现在的神经网络,但我认为这只是表象。人类的记忆功能和逻辑功能,从根源上似乎就并不是同一块内容,而大部分神经网络都试图将他们混合在一起训练。
这里说的逻辑功能并不是说单纯的数理逻辑,而是基于各方面的信息,包括身体各项传感器,还有记忆,推理出应当输出的信息的内容,比如如何控制身体,如何说话等。举个简单的例子,一个人未必记得自己骑过自行车,但是如果会骑的话,接触到自行车后就能快速地掌握平衡并控制身体。这个就是一个基本的逻辑过程,或者也有人叫它为程序性记忆。这项功能毫无疑问是独立运作的,与单纯记忆信息的记忆功能是完全不同的回路,而且互不干扰。
所以如果是我心目中的强人工智能,至少在拟人的强人工智能方面,这两步程序是必须分开的。两者互相协作,但又可以独立运作。
实现的方法论
我并不了解具体的技术细节,只能从大体上的方法论来构思其可能性。
一般的神经网络的实现思路是
graph LR
A[输入] --> B["黑箱<br/>神经网络"] --> C[输出]
D[参数调整] -.-> B
如果是想套用符号主义,设计其思维逻辑,实现智能,可能大部分思路都是
graph LR
A[输入] --> B["嵌入编码器<br/>神经网络"] --> C["语义表示<br/>矩阵"] --> D["逻辑推理<br/>模块<br/>固定规则"] --> E["输出表示<br/>矩阵"] --> F["生成解码器<br/>神经网络"] --> G[输出]
H["参数调整<br/>编码器"] -.-> B
I["参数调整<br/>解码器"] -.-> F
再结合自我学习的话,大概会是这样的
graph LR
A[输入] --> B["嵌入编码器<br/>神经网络"] --> C["语义表示<br/>矩阵"] --> D["逻辑推理<br/>模块<br/>固定规则"] --> E["输出表示<br/>矩阵"] --> F["生成解码器<br/>神经网络"] --> G[输出]
H["参数调整<br/>编码器"] -.-> B
I["参数调整<br/>解码器"] -.-> F
J["反向传播"] -.-> H
K["反向传播"] -.-> I
不过,如果把逻辑本身也用机器学习替代,将认知细分成更多模块,利用神经网络将他们连接,则可能可以更好地提供可控且拟人的智能
graph TB
A[输入] --> B["编码器<br/>神经网络"]
B --> C["语义表示<br/>矩阵"]
C --> D1["记忆查询<br/>神经网络"]
C --> D2["逻辑推理<br/>神经网络"]
D1 --> E1["记忆表示<br/>矩阵"]
D2 --> E2["推理表示<br/>矩阵"]
E1 --> F["融合层<br/>神经网络"]
E2 --> F
F --> G["输出表示<br/>矩阵"]
G --> H["解码器<br/>神经网络"]
H --> I[输出]
style D1 fill:#c8e6c9
style D2 fill:#ffccbc
style E1 fill:#f3e5f5
style E2 fill:#f3e5f5
style F fill:#fff9c4
虽然看上去内部没什么符号主义的存在,但是由于我们人工把切面做出来了,我们可以理解切面到底发生了什么,并且在训练集中手动地调整这些切面应该有的样貌,来调整其逻辑。这样做当然比直接中间完全黑箱训练要困难地多,准备这种抽象的训练集是需要费很大功夫的,即便已经有LLM了,如何定义矩阵,如何制作高质量的训练集,都是很考验设计者的功夫的。
如果还要搭配自学习的话,大概就是
graph TB
A[输入] --> B["编码器<br/>神经网络"]
B --> C["语义表示<br/>矩阵"]
C --> D1["记忆查询<br/>神经网络"]
C --> D2["逻辑推理<br/>神经网络"]
D1 --> E1["记忆表示<br/>矩阵"]
D2 --> E2["推理表示<br/>矩阵"]
E1 --> F["融合层<br/>神经网络"]
E2 --> F
F --> G["输出表示<br/>矩阵"]
G --> H["解码器<br/>神经网络"]
H --> I[输出]
I --> J["损失函数"]
J -.-> K1["反向传播<br/>编码器"]
J -.-> K2["反向传播<br/>记忆模块"]
J -.-> K3["反向传播<br/>推理模块"]
J -.-> K4["反向传播<br/>融合层"]
J -.-> K5["反向传播<br/>解码器"]
K1 -.-> B
K2 -.-> D1
K3 -.-> D2
K4 -.-> F
K5 -.-> H
style D1 fill:#c8e6c9
style D2 fill:#ffccbc
style E1 fill:#f3e5f5
style E2 fill:#f3e5f5
style F fill:#fff9c4
style J fill:#fff3e0
在使用中积累数据,并重新用反向传播修改参数。
实际实现中,切面做得越多,越精细,其可控性和准确性都会得到大幅提高,但也更加考验设计。这个方案可能是为数不多的能结合两种优点的简单可行的方案。
碎碎念
说到底我也只是一个门外汉,AI从业者也不缺乏天才,肯定已经有了更多更成熟的方案。不过我相信我的这个方案应该也是可行的,估计也已经有系统性的工程了。不知道什么时候能看到生成图像和视频都不再是在像素空间找可能存在的有意义的位置,而是切实地基于基本原理,基本模型,构图来完成。