第19话
1956年夏天,在新罕布什尔州的达特茅斯学院,举办了一次为期两个月的研讨会。会议由约翰·麦卡锡、马文·明斯基、纳撒尼尔·罗切斯特和克劳德·香农共同发起。在这次会议上,约翰·麦卡锡首次提出了“人工智能”这一术语。同年,麦卡锡教授设计了LISP编程语言,LISP作为高级编程语言,具有强大的符号计算能力、递归支持和灵活的函数式编程特性。不久后,麦卡锡离开达特茅斯学院,移居麻省理工学院担任研究员。
1958年4月,与麦卡锡教授合作日趋密切的马文·明斯基加入麻省理工学院,二人开始着手创立一个专注于人工智能研究的实验室。
克劳德·香农教授要求我们软件组都必须掌握LISP语言,虽然我们正在使用的AN/FSQ-7计算机不能直接执行LISP的解释器和程序。香农教授说计算机语言也可以看作一种自然语言,我们通过学习语言,来了解语言背后的文化、性格。而LISP语言背后的则是一种思想——深刻的抽象能力,一种将复杂问题分解为简单、可递归的模块的哲学。
我在林肯实验室的会议室里,听着约翰·麦卡锡教授正在讲LISP编程语言。突然有个人敲门,这人胡子和鬓角都连了起来,厚嘴唇,皮肤黑的特健壮。我激动得说:道哥!
麦卡锡教授说:这位是道格拉斯·皮尔斯,负责LISP解释器的开发工作,后续道格拉斯会协助SAGE项目优化程序的工作。会议室的同事都鼓掌表示欢迎,我更是拍手拍的手都红了。
开完会,我跟道格拉斯打招呼:道哥,好久不见啊。道格拉斯说:小马,你现在负责哪块呢?我说:SAGE项目数据传输组,道哥你现在跟着麦卡锡教授做编程语言呢?道哥说:也不全是,最主要还是研究人工智能,LISP语言就是为了开发人工智能系统准备的。我说:道哥真是厉害,做这么高端的东西,我都听不懂。道哥说:LISP语言听不懂吗?我说:是啊,好多概念我都没听过。道哥说:那找个时间,我给你详细讲讲。我说:要不就今天晚上,正好请你吃个饭,顺便指导指导我。道哥说:我看看晚上有没有事,一会答复你吧。我说:行,你先忙。
下午5点40,道哥来我工位说:小马,晚上我还约了香农教授,威廉·贝内特吃饭。你也一块来吧。我说:没问题,道哥竟然能请的动香农教授。道哥说:你原来约过教授,教授拒绝你了?我说:我哪敢约香农教授吃饭呀。道哥说:所以你只要主动,就会发现很多人都在等着别人邀请呢。我说:道哥还是这么有高度。
晚上我们几个人来到食堂,香农教授说:我这饭票每个月都用不完,今天正好大家来帮我用一下。我看向教授,教授手里攥着一沓饭票,感觉教授是个隐藏的富豪。
我们各自选好了饭菜,找了个4人桌坐下来边吃边聊。香农教授拿了一盘希腊沙拉和希腊烤羊肉串。我看这希腊沙拉跟普通沙拉的区别就是调味料不一样,希腊沙拉没有放千岛酱或者沙拉酱什么的,而是放的羊奶酪和红酒醋,蔬菜都是番茄、黄瓜、橄榄,也许香农教授口味比较清淡一些吧。
香农教授问道格拉斯:人工智能领域现在处于什么情况了?道哥说:我们现在研究重点是符号推理、模式识别、学习算法。根据马文·明斯基教授提出的“大脑结构模型”,试图通过模拟神经网络来复制人类的学习和思维方式。威廉·贝内特问:这个神经网络我听过很多次了,还是理解不了什么意思。道哥放下手里的餐具,拿了一块纸巾擦了擦嘴,说道:大脑学习的过程实际上就是建立新的神经连接。当你学到一个新的技能或知识时,相关的神经元会通过突触可塑性机制进行调整,这样你在下次遇到类似情况时就能更快速地反应。贝内特说:这个我大概理解,但我们怎么模拟神经网络呢?道哥说:我们将神经网络抽象成4个部分,第一是神经元,作用是接收输入信号,并通过一定的计算生成输出信号。
第二是神经网络的结构,也就是分层。神经网络由多个层次组成,包括接收外部数据的输入层、进行计算处理的计算层和生成最终的预测或结果输出层。每层包含若干神经元,它们通过连接进行信息传递。
第三是权重,可以理解为神经元之间连接的强度。连接神经元之间的权重决定了输入信号对输出的影响程度。学习过程就是调整这些权重,使得网络输出更加准确。
第四就是激活函数,它决定了输入信号后激活哪些神经元。
贝内特说:我差不多理解了,我说一下看对不对啊。输入层接收数据,如图像、声音或文本信息。数据经过多层神经元的处理,每个神经元根据输入信号和权重进行计算并传递到下一层。最终的输出层给出网络的预测结果,如分类标签、预测值等。
道哥说:没错,就是这个意思。贝内特继续说:那我们现在可以模拟出来神经元和连接权重了吗?道哥说:需要解决的问题还很多,比如,缺乏有效的学习算法。对于多层神经网络,需要根据输出和期望输出之间的误差来调整权重。
香农教授说:我补充一下,还需要解决神经元和权重的存储问题,人的大脑中有860亿个神经元,1.5万亿个权重。如果想要通过图灵测试,最少需要10亿的神经元和100亿的权重连接。要用现在的计算机,肯定是不能存储这么多的。
我想这确实有点离谱了,看来我这辈子是用不上智能管家了。还有图灵测试是什么来着,怎么也想不起来。现在问道哥,但是香农教授在,也不好意思问。这时候贝内特说:香农教授,图灵测试是什么来着?我向贝内特投去感激的目光。香农教授说:就是让人类与机器对话,如果人类感觉不出来是机器,就说明通过了图灵测试。我说:图灵是真聪明。香农教授说:哎,他是个特别有天赋的天才,不过可惜了。我问:怎么可惜了?香农教授似乎愣神了。道格拉斯对我解释说:图灵在英国遭到迫害,最后因食用浸过氰化物溶液的苹果死了。我说:真是遗憾。
香农教授问我:小马最近学LISP语言了吗?感觉怎么样?我说:总体感觉就是不用写机器代码了,可以直接把数学符号写成程序,通过解释器翻译成机器代码。这样可以帮助我们编写复杂的程序,也提升了程序开发的效率。道哥说:你研究解释器了吗?我说:还没,刚学会了怎么使用。道哥说:最有意思的还是在解释器里面。麦卡锡教授设计了4个核心功能:
第一基于列表的语法,这也是 LISP名字的由来List Processing,程序中的符号和数据都被看做是一个列表,这种设计简化了代码的执行过程。你知道解释器执行一个LISP程序分几步吗?
我说:三步?道哥说:对,就是三步,看来你说没看过解释器,原来是谦虚啦。这时香农教授也看着我露出满意的微笑。我其实是说顺口了,只要问步骤,我一般都说三步。还好道哥继续说道:LISP的执行过程是:读-求值-打印循环。这三步都是基于列表结构,依次完成“读取表达式”、“求值表达式”和“输出结果”。例如,加法操作(+ 2 3)是一个列表,其中第一个元素是符号+,后面的元素是操作数 2和 3。
道哥问我:你还知道解释器什么特点呢?我说就知道解释器的执行过程。道哥说:那看来还得多学,第二个特点就是LISP是元编程语言。LISP程序可以动态地创建、修改和执行代码,这意味着 LISP可以进行代码生成和自我修改。我说这个好,我想学这个。以后是不是就可以写个程序,让程序自己再生成程序就行了。道哥说:没错,这个特性就是神经网络程序开发的关键,也是调节权重连接的关键。
我一边听着道哥讲LISP,一边看向我面前的空碗,我吃了一大碗的奶酪饺子,小三角形的饺子,里面塞满了肉和奶酪,奶酪能吃出来是新鲜的农家奶酪,因为有一点点酸味,奶香味也不是特别浓烈。肉也是混合了牛肉和鸡肝,既有牛肉浓郁的香味也有鸡肝细腻的口感。馅儿里还加了糖,香草和柠檬皮,吃不出来鸡肝的苦,入口咸鲜,回味是甜和奶香。听着他们聊天感觉又饿了。
道哥还在认真且专注的讲着:你知道函数式编程是什么意思嘛?我的视线从碗上离开,脆弱的望向道哥说:不知道。香农教授在旁边也附和说:这概念是你们新总结的吧?道哥说:麦卡锡教授就一直在说,我也是觉得形容的挺准确,就用上了。香农教授说:那请指导指导我们吧。道哥说:不不,不是指导,这不是聊天呢。香农教授说:那请开始你的聊天吧。道哥说:麦卡锡教授非常喜欢阿隆佐·邱奇的拉姆达演算的概念,并将其直接融入了LISP的设计中。在LISP中定义匿名函数,即没有名称的函数,它表示将一个变量绑定到一个函数上,从而创建一个新的函数。允许将函数作为参数传递给其他函数,或将函数作为返回值返回。
我惊奇道哥在认真的时候口条这么流利。香农教授说:哎呦,你分开说这些我都懂,放在一起就不懂了。我说:是,放在一起就跟闹狗令一样。额,绕口令一样。贝内特看向我说:你可能也说不成绕口令了。道哥说:这个拉姆达表达式其实就是一个语法,用起来还是挺简单的。香农教授说:那最后再说说垃圾回收机制吧,时间也不早了。道哥说:那好,我们都知道计算机内存资源有限,程序运行过程中会产生不再使用的“垃圾”数据。垃圾回收机制会自动识别并回收这些垃圾数据,释放内存空间,提高内存利用率。这使得我们可以专注于高层逻辑,而不必担心手动管理内存分配和释放。贝内特说:这个机制太好了,减少了我们控制计算机的难度。
食堂打饭窗口已经都关闭了,但还是有不少人在这里聊天。香农教授问我:你知道我为什么让大家都学LISP语言吗?我说能提高我们工作效率吧。香农教授回道:这么说,感觉我有点像资本家了。学习LISP不仅仅是为了解决工作中的问题,而是为了培养一种面对复杂问题时的思维方式——一种能够抽象、简化并精确建模问题的思维方式。人最可贵的,不仅是智力的高低,而是思维的深度和灵活性。能够创新、抽象、简化并解决复杂问题,这正是科学家们所看重的思维方式。这些特质让科学家能够不断突破认知的界限,推动知识的前沿,最终影响着人类的技术进步和文明发展。
回宿舍的路上,我问道哥:其实我也在其他地方听到过人工智能,但是他们讲的我都听不懂,还是道哥学问深,讲的够透彻。道哥说:你听不懂,那说明讲的人就没打算让你懂,而是让你觉得他很懂。我说那我就放心了,不是我笨就行。从兜里掏出来两块薄荷润喉糖,递给道哥。道哥说:说了一晚上,嗓子确实有点难受,谢了。我说甭客气。
