AI共生指南:技术探索与人文思考

978-7-115-57567-8
作者: 林亦
译者:
编辑: 郭泳泽

图书目录:

详情

AI 的发展已经跨越多个重要阶段,且应用形态仍在不断演变。本书综合了作者及其团队近年来围绕 AI 实现的项目,展开关于人工智能与人的关系的探讨。从自然语言处理、计算机视觉、强化学习等基础技术入手,讲述其原理、应用及未来展望;接着呈现 AI 在数学竞赛、股市、游戏等多个领域的实践案例及面临的问题;还深入思考了 AI 与人类发展、航天的关系,以及游戏产业、苹果智能生态等内容;最后通过 AI 竞技场与大赛相关情况,探讨在技术与人性交汇处人类如何更好地与 AI 共存。 本书适合对人工智能技术感兴趣的技术爱好者,以及其他关注未来科技发展的读者阅读。

图书摘要

版权信息

书名:AI共生指南:技术探索与人文思考

ISBN:978-7-115-57567-8

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


版  权

著    林 亦

责任编辑 郭泳泽

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

内 容 提 要

AI的发展已经跨越多个重要阶段,且应用形态仍在不断演变。本书综合了作者及其团队近年来围绕AI实现的项目,展开关于人工智能与人的关系的探讨。从自然语言处理、计算机视觉、强化学习等基础技术入手,讲述其原理、应用及未来展望;接着呈现AI在数学竞赛、股市、游戏等多个领域的实践案例及面临的问题;还深入思考了AI与人类发展、航天的关系,以及游戏产业、苹果智能生态等内容;最后通过AI竞技场与大赛相关情况,探讨在技术与人性交汇处人类如何更好地与AI共存。

本书适合对人工智能技术感兴趣的技术爱好者,以及其他关注未来科技发展的读者阅读。

当我第一次在镜头前介绍人工智能技术时,从未想过这会成为一段漫长而精彩的旅程。从最初几个解读视频的发布,到如今这本汇集了我与同事和朋友们思考与实践的书出版上市,这几年间,人工智能(artificial intelligence, AI)技术的发展速度远超我们的想象,而我们也有幸成为这场技术革命的见证者与参与者。

这本书源于我近几年来在视频平台上的创作,而我们在创作视频背后所做的技术探索恰好跨越了 AI 发展的多个重要阶段。从计算机视觉技术识别游戏中的人物关节,到强化学习算法使AI自主通关格斗游戏,再到大语言模型带来的交互革命——我们的实践不仅记录了技术的迭代,更见证了AI应用形态的演变。无论是在ChatGPT爆火前构建的项目,还是在大模型时代的新尝试,都以具体实践展示了AI能力的边界与可能性。

本书并非严格意义上的技术教程,而是一次关于人工智能与人类关系的对话。我试图通过10章的篇幅,从不同角度展现AI技术的魅力与挑战。从基础的自然语言处理和计算机视觉,到前沿的大语言模型应用;从对苹果智能生态的分析,到对“有效加速主义”的思考;从 AI 在游戏中的运用,到人工智能对数学竞赛的挑战……希望这些有趣的内容,能为读者打开一扇了解 AI 世界的窗口。

我们致力于让这本书可以穿越技术的演进周期。当DeepSeek引发轰动时,我们能看到它正是接续着强化学习的技术脉络;当新一代大语言模型出现时,我们已有的评估与应用AI的方法论基础也依然有效。这种跨越特定技术产品的视角和思考不会随着AI产品的更替而失去参考价值。同时,本书不仅讲述技术本身,更关注技术背后的人文思考。当我让 AI 在格斗游戏中挑战高难度对手时,思考的是机器学习如何从失败中成长;当我与几千名观众共同操控游戏中的一辆车时,探索的是群体智慧如何在混沌中涌现;当我与 GPT-4合作编写代码时,感受的是人机协作带来的创造力爆发。这些项目不仅是技术实验,更是对未来人机关系的一次次预演。

本书并不会渲染 AI 的“可怕”或神秘。相反,我希望通过亲身实践和通俗介绍,让读者看到 AI 既有惊人能力,也有明确边界。它可能在某些领域超越人类,但在许多方面仍需人类引导。了解了这些特性,我们才能更好地与 AI 共存,并充分发挥它的潜力。

人工智能领域的知识更新极快,今天的前沿消息,明天可能就会成为常识。因此,本书并不追求面面俱到,而是着重呈现思考与解决问题的方法和思路。技术细节会随时间推移而变化,但思考方式和实践态度却能长久陪伴我们。无论未来涌现出何种新技术,这些基础认知和方法论都将帮助我们更好地理解和应用它们。

特别要感谢所有支持我视频创作的观众,正是各位的鼓励和反馈让这本书成为可能。感谢在各个项目中给予帮助的同事和朋友,从个人耕耘到团队化发展,我们一起做出了越来越有趣、越来越复杂的精彩项目。感谢编辑团队对书稿的精心打磨,让我的思路能够更加清晰地呈现。

最后,我相信 AI 技术的发展将为我们带来前所未有的机遇和挑战。在这个变革的时代,保持好奇心与实践精神尤为重要。希望本书能激发您对 AI 的兴趣。无论您是技术爱好者,还是对未来科技发展感兴趣的技术小白,我们都希望您能在阅读本书后,对 AI 有更深入的理解,并找到属于自己的思考角度。

技术在飞速发展,而我们共同的人性价值却始终如一。让我们怀着敬畏之心探索未知,以创造之力塑造未来!

林 亦

2025年3月

人 物 介 绍

林亦,本书作者。

晓白,林亦的朋友。

AI是从大量语料中学会与人对话的。

一台冰冷的计算机能够用自然流畅的语言与你对话,不仅能回答你的问题,还能理解你的情感、参与你的讨论,甚至创作诗歌或撰写文章——这听起来像是科幻小说中的场景,但如今,这样的技术已经逐渐走入我们的生活。这一切的背后,来源于AI在自然语言处理领域取得的巨大突破。

然而,让机器学会“说话”并不是一件容易的事。人类的语言复杂而多变,充满了模糊性和文化背景的影响。为了让计算机能够理解、生成并灵活运用语言,科学家们需要从最基础的数学和算法出发,逐步构建起一套复杂的系统。这一过程涉及机器学习、神经网络、自然语言处理等前沿技术,同时也伴随着无数挑战与创新。

相比于本书其他章,本章篇幅更长,涉及的术语也更多。如果阅读起来觉得吃力,也可以先跳过本章。不过,我会尽量将问题讲得简单些,先带领读者从机器学习的基础概念出发,探索神经网络如何模拟人脑的工作机制;接着深入自然语言处理的世界,了解文本分词、编码和向量化等关键技术;最后,我们将揭示大模型是如何学会生成自然语言的。

机器学习:一切的开始

其实,机器学习是个非常庞杂的概念,很多事都可以算到这个领域里来,像预测电影票房、识别人脸、让计算机去自动打游戏,这都属于机器学习。本章之所以专注在语言这个任务上,为的是让大家更深入地了解大语言模型这些横空出世的人工智能技术。因此,介绍各种技术概念的时候,我都会往语言这个方面去靠。

监督学习和非监督学习

在语言分析和语言生成这个视角下,机器学习是什么呢?首先,咱们回过头想想当年学英语时背单词的过程。对于不认识单词的我们来说,单词表左边是意义不明的字母组合,右边是看懂的中文解释。我们要做的就是记住这些字母组合和它们的含义,通过将陌生词汇与它们的含义对照,我们就逐步把对新语言的认知建立起来了。这个过程就可以称为监督学习。监督学习的主要特征是用到了大量标记数据,也就是说,需要学习的内容都通过学习者能够理解的方式做了标记。于是学习者才能够把未知信息与已知信息一一对应起来,建立它们的关系,然后再往陌生的、更复杂的情况去推导。比如我们知道time是时间,fly是飞行,那当我们看到time flies very fast这种高级的、没见过的用法时,就可以推广,分析出它的含义是“时光荏苒”。这是一个尝试用有限的知识解决无限的问题的过程。

除了这种监督学习,还有另一种情况:我们可能得不到单词表那样的明确指导。就像刚出生的时候我们连中文都不会,或者是上世纪很多人也没怎么学外语就闯出去挣外汇,这两种情况最后大家往往都能适应下来。那这两种情况下的人是怎么学习语言的呢?只能通过阅读、听或者观察语言在日常生活中的使用来学习。在这种情况下,我们可能会开始识别模式,比如某些词汇总是在类似的情境下出现,或者某些词似乎具有相似的结构或音韵特征。比如哪些词的发音有力量感,哪些词经常在跟人打招呼的时候用,等等。这样,我们就会逐渐摸索出来一套潜在的规则和分类,比如自然而然地把词汇分成动词、名词和形容词等,即使没人明确告诉我们这些分类。这就叫无监督学习。

监督学习和无监督学习构成了机器学习领域的两个基本类型。由此衍生的,还有一系列诸如半监督学习、自监督学习这些混合学习模式。但归根结底,这些方法都是为了让机器能够像人一样学习,随着时间和练习不断积累知识和技能,通过算法自行找出数据之间的关系和模式,而不需要人类去编写具体的程序。这一概念,正是机器学习与传统编程的根本区别所在。

数据和模型

机器学习的深远意义在于,只要找到一套能有效学习的算法,它就可以广泛适用于不同任务。比如,我们搞了一套算法,喂给它人脸照片,它就能学会定位人脸。同样的算法,也可以用来定位人手,只需给它看大量包含和不包含手部的照片即可(如图1-1所示)。它自己就能学,而不是像传统编程那样,需要重新从头写一套规则告诉它人手长什么样。

图1-1 AI正在学习人手的照片

然而,当我们真正沿着这个思路走时,许多具体问题就出现了,主要是围绕数据和模型。机器学习本质上是构建一套神经网络模型,让模型从大量数据中学习。如何获取足够多且高质量的数据,如何构建一个能力强、学习效率高的模型,成为影响学习效果的关键。整个机器学习的研究史,基本上就是围绕这两点展开的。

在学术界,模型通常被用来表示对现实世界现象的简化和抽象。而在机器学习领域,咱们就可以把模型看作一个函数,再直白点就是一个有输入、有输出的黑盒子。模型训练的过程,就是调整这个盒子里密密麻麻的小开关。训练完了,每一个小开关的开闭状态就被锁死了。这个黑盒子的内部结构可能无比复杂,但咱们不用管,咱们只关心它能不能针对输入给出正确的输出。比如你输入一张狗的照片,它的输出就应该是“狗”,而不能是“林亦”。它要是看着狗的照片说“这是林亦”,那它的训练过程就是有问题的。

神经元和感知机

如今流行的语言模型,基于一种叫做神经网络的技术。顾名思义,它模仿的是我们大脑神经系统的结构,如图1-2所示。真实的神经系统基本单位是神经元,神经元是大脑中一种能够以简单方式相互交流的细胞。神经元细胞有很多个突起,通常来说可以理解为它有很多条“腿”。大部分“腿”都比较短(称为树突),用来接收刺激,然后其中一条“腿”特别长(称为轴突),一直连到另一个神经元上,负责向下传递刺激。这样一个结构,就可以让神经元根据多个输入作出一些简单判断。

图1-2 神经网络和真实神经系统的基本单位(感知机和神经元)

举个简化些的例子,我们在学一门陈旧且枯燥的课程时,体内的神经元的几条短“腿”接收到的就是褪色的教材封面、枯燥的文字、晦涩的公式,汇总到一起,它那条长“腿”可能就会无动于衷。如果换个场景,比如打开了手机游戏,那这几条短“腿”收到的就是鲜艳的画面、精致的人物、优雅的角色服装。这些刺激一过来,这个神经元最长的那根末梢就会兴奋起来,输出信号狠狠地刺激下一个神经元。当成千上万个这样的神经元组合到一起之后,这些刺激就会汇总成一个更高层级的输出,比如远处的另一个神经元发出了“生活费到账”的刺激信号,我们可能就会冲动地为游戏充值。

机器学习中的神经网络模型借鉴了这个生物学结构,它的基本单元称为感知机单元,结构和神经元很类似,也有多个输入和一个输出。感知机单元的运行过程就像投票评分,每个输入都是一个分数,而每个分数又对应着不同的权重,就好比等级不同、话语权不同的评委。假如说有三位评委分别给出了0.1、0.1、0.4的分数,而他们的评分权重又分别是0.5、0.1、0.4,那最终的得分就是这三对数字乘起来再求和,也就是0.22。整个过程如图1-3所示。

图1-3 感知机正在“感知分数”

感知机特别的地方在于,它有个分数线,比如0.5。过了这个线,它就输出1,表示激活;没过的话,就输出0,表示未激活。这样就模拟了生物神经元的工作过程。

但这个设计如果真正落实到数学计算上,又会出现一个问题,就是没法往回追溯。还是回到手机游戏的例子,感知机如果输出了1,可是我怎么知道哪个因素是最关键的呢?是画面、人物,还是服装?

一个自然的想法是分别在这三个方向上加大力度,依次让画面更鲜艳、人物更精致、服装更优雅,看看输出有什么变化。可是按照当前的策略,这么干之后,输出还是1,什么也分析不出来。所以这里要做一个修改:不再粗暴地让感知机对于所有过线的情况都输出1,而是在过线之后,把实际分数作为输出。这样,从这三个角度分别加大力度后,就可以从输出分数的变化往回追溯,从而知道哪个因素对感知机的影响最大了。这样调整后的输出策略在深度学习中十分常见,称为ReLU(rectified linear unit,修正线性单元)。在神经网络中,它扮演的角色称作“激活函数”。

神经网络和反向传播

现在我们已经知道一个感知机单元是怎么运作的了,把它们连成多层网络结构,它们就也会像神经元组成大脑那样,展现出强大的信息归纳能力。一个简单的多层神经网络模型包含很多层神经元,每一层都有自己的名字,比如我们可以描述一个神经网络的结构是“一个输入层、两个隐藏层、一个输出层”,如图1-4所示。前面说过,模型本质上就是个能读取输入,然后尝试输出准确答案的黑盒子。这个答案可能是“猫”“狗”“林亦”这样的分类标签,也可能是预测出来的数值,比如三天之后的股票价格。这些都需要在输入和正确的输出答案之间建立起特定的映射关系。

图1-4 包含“一个输入层、两个隐藏层、一个输出层”的神经网络

在神经网络模型里,每个单元之间的连接都是一个权重数值,这些数值可以在输入和输出之间建立起无数种映射关系。可是怎么才能确定这大量的权重数值分别应该是多少呢?这就要靠反向传播算法了。

在我们深入探讨反向传播之前,先来回顾一下函数和导数的基本概念。

导数

简单来说,函数就是一种固定的对应关系。比如,y=2x就描述了一种“乘以2”的关系,那么它就会针对我们的输入产生对应的输出:输入2就输出4,输入3就输出6……

导数则是用来衡量输出相对于输入变化速度的工具。比如,当输入从2变为2.1,增加了0.1时,函数y=2x的输出增加了0.2,这是因为它在此处的导数是2。如果函数是y=3x,那么导数就是3,意味着变化速度更快。

神经网络的复杂程度远超于此,因为它的输入变量不止一个。比如,一张200像素× 200像素的图片就有4万个像素,这就需要去求偏导数。这个过程就像是在分析一个游戏时,对场景、人物、服装等元素分别求导数,从而计算出哪个元素对玩家兴奋度影响最大。它帮助我们找出不同输入变量对应的权重。

在计算机中训练神经网络的过程是这样的:首先,训练程序会为每个输入变量随机分配一个0到1之间的权重值。假设场景的权重是0.5,人物是0.1,服装是0.4,并且这些因素都是可以量化的。例如,在某个游戏时刻,场景的精美度是0.1,人物的美观度是0.1,服装的优雅度是0.4。经过第一轮随机权重计算,得到的分数是0.22,这就是一轮前向传播的结果。然而,这个结果并不理想,因为实际情况可能是我对0.4分的服装已经兴奋到0.6了。

损失函数和梯度下降

那么,这种偏差该如何衡量呢?这就需要用到损失函数。损失函数通常是基于统计学的数学模型,常见的有均方误差、交叉熵损失、绝对误差等。损失函数的结果永远是非负数,用来衡量模型预测与实际情况的偏差程度。比如,使用绝对误差,模型输出(0.22)与实际兴奋值(0.6)的偏差是0.38。为了缩小这个偏差,让模型能够准确预测我的兴奋度,我们需要调整权重。

模型的输入输出关系完全由权重决定,对于同样的输入,权重不同,输出就会不同。我们可以将偏差视为关于权重的函数,即损失函数。我们希望找到损失函数变化最快的方向,这就需要用到梯度。梯度可以看作反映了函数在特定点上的斜率,总是指向函数增长最快的方向。想象你站在山顶,梯度告诉你哪个方向能最快上山,原地转180度,就是下山最快的方向。沿着这个方向调整权重,损失函数的值就会越来越小,这个过程称为梯度下降。

回到图1-3中的例子,假设三个输入分别是x1=0.1、x2=0.1、x3=0.4,对应的权重是w1w2w3,模型的映射关系是y=w1x1+w2x2 +w3x3。反过来看,y是关于权重w的线性函数,对这三个权重求偏导,结果分别是x1x2x3。为了减小偏差,需要将y从0.22拉向0.6,也就是沿着(1, 1, 4)的方向调整权重w

不过,这只是三个变量的情况。在实际的神经网络中,变量和权重可能有上千万甚至数十亿个,并且是层层传导的。为了解决这个问题,我们需要借助链式法则。

链式法则是一种计算复合函数导数的方法,当一个函数由多个函数嵌套而成时,它的导数等于外部函数的导数乘以内部函数的导数。

模型的收敛

在神经网络的世界里,训练模型就像剥洋葱,一层层地剥开外部函数,直到找到每个权重值的偏导数,最终汇集成一个超高维度的梯度。这个过程又像重温一部电影,从结尾回溯到开头,理解每个事件和线索如何影响整个故事的走向。完成这一流程后,我们先计算输出,再反向找出权重的梯度,最后让所有权重沿着这个梯度的方向前进一点点,完成一步更新,让模型更接近准确的方向。起初,所有权重都是随机生成的,因此模型的修正速度较快,但随着准确率的提高,这个速度会逐渐减慢,这就是所谓的模型收敛。

收敛的过程就像钓鱼时的鱼漂,刚扔下去时剧烈抖动,随后逐渐平稳,但并未完全稳定。稍微有点刺激,比如遇到一阵微风或水底的小暗流,鱼漂又会抖动起来。许多年轻人可能会忍不住提竿,结果一无所获,而成熟的钓鱼者则会耐心等待——心如止水,才是真正的收敛。不过,并不是所有模型都能在训练中收敛,模型本身、训练数据或超参数设置的问题都可能导致模型无法收敛。

超参数是模型训练中的重要因素,包括批量大小、迭代步数、激活函数和优化器选择等。它们不改变模型结构,但控制训练过程。其中最重要的超参数是学习率,它决定了模型参数的更新幅度。梯度指出偏差减小最快的方向,但如果步子迈得太大,可能会跳到更高的地方,反而找不到最低点;步子太小,移动速度慢,还可能陷入小坑,无法到达更低的谷底(如图1-5所示)。因此,学习率需要反复测试和调整,直到与模型最为匹配,这就是属于该模型的“心如止水”的状态。

图1-5 学习率(绿色箭头方向的力)过大,模型会跳过收敛位置所在的“谷底”;学习率过小,模型不能走出当前的“小坑”——在这两种情况下,模型无法到达收敛位置

调整超参数并不是最麻烦的。真正决定训练成败的是模型的结构。深度学习曾一度停滞不前,因为层数增加到一定程度后,模型无法学习。反向传播调整每层权重,但在层数多的模型中,导数值接连相乘,可能导致梯度爆炸或消失。直到残差网络的出现,才解决了这个问题。残差网络通过在计算网络层输出时,从前面挑一层加到一起,增强了梯度变化的稳定性,使构建深层神经网络成为可能。

残差网络的出现,使得神经网络的深度从几层到几十层,发展到上百乃至上千层,具备了解决复杂问题的能力。它的主要开发者何恺明因此获得了2016年计算机视觉与模式识别会议(Conference on Computer Vision and Pattern Recognition,CVPR)的最佳论文奖。如今,残差网络几乎成为神经网络的必备结构,广泛应用于大模型中。

然而,调整好超参数和模型深度,并不意味着模型一定能学明白。数据质量同样重要。若只学数学却考英语,结果可想而知。虽然机器学习领域的学者不会犯这种低级错误,但数据过于复杂可能导致欠拟合,即模型准确率无法提升。相反,过拟合则是模型能力过强,记住了数据中的干扰因素,而非普遍规律。真正优秀的模型应具备泛化能力,能适应陌生数据环境,而不仅仅在训练数据上表现出色。

为了评估模型的泛化能力,我们会将数据划分为训练集、验证集和测试集。训练集用于识别模式和规律,验证集用于阶段性评估模型表现,测试集则是最终的考验,评估模型在真实世界中的性能。

随着大模型时代的到来,超级大模型的泛化能力受到质疑。它们可能只是机械地背下了数据,而非真正理解人类知识。但无论如何,从小型专用模型到大型通用模型的转变,标志着深度学习进入了一个重要的发展阶段。

自然语言处理的基本概念

神经网络模型既能识别手写数字,又能帮你在游戏中征战四方。然而,无论这些AI程序多么强大,它们总让人觉得缺少点人情味。真正让人感受到智能的,还是那些能和我们对话的AI。

事实上,自从人工智能这个概念出现,研究人员就一直想让计算机模拟人类思考、理解和学习的能力,并且把语言视为这些能力的重要载体。著名的思想实验图灵测试,就是通过让人与计算机用自然语言交流,来评估机器是否具备智能。于是,一个关注如何使计算机理解、解释和生成人类语言的研究领域就诞生了,那就是自然语言处理(natural language processing,NLP)。

自然语言处理中的“自然”是什么意思呢?咱们平时和别人聊天的语言,包括本书使用的语言,都算是自然语言。自然语言是随着文化演化自然而然形成的语言,有历史和文化积淀,而不是我们自己定义和创造的编程语言。正因如此,自然语言的成分往往相当复杂。像“V我50”这种网络用语,也可以算作自然语言。而且就算是同一个词,随着时间推移,它的含义也会发生改变。

不过,虽然这玩意儿很复杂,但咱们人类偏偏就有这天赋。四个月大的婴儿就已经能听明白父母在叫自己了,也会开始理解不同声音的含义。长大之后,那就更是学得飞快。比如说咱们看到一句话:“《原神》是由米哈游研发的一款全新开放世界冒险游戏。”你即使完全不知道“《原神》”和“米哈游”是什么,至少也能马上听明白“《原神》”是游戏的名称,然后又能推理得出结论:“米哈游”是一家游戏公司。就是这看似无意间完成的过程,实际上已经蕴含了许多处理语言的步骤。

我们首先将句子拆分,比如开头的“原神是……”(这里先不考虑标点符号的影响),其中“原神”是个有意义的词,而“神是”就不是个词。接着,我们判断词语性质,分辨出“原神”和“米哈游”是名词,而“研发”是动词。然后,我们提炼出“A是B”这个句式,知道“原神”是个游戏,剩下的名词“米哈游”是“研发”这个词的主语,所以我们知道它是个企业或机构。这短短一瞬间,我们的大脑就完成了一系列精密复杂的解读工作,使我们理解了语言中包含的信息,而这个过程时时刻刻都在每个人脑子里发生着。

编码和二进制

那么,机器是如何理解语言的呢?我们先想象一个没有语言的世界。在这样一个世界里,每个人都能看到白天有“太阳”,晚上有“星星”,但还没有词语去描述。如果想表示这两个东西,有的人可能用手画圈,有的人可能会拿石头在地上摆(如图1-6所示),但效率都非常低。直到语言出现,它们有了名字,也就是“太阳”和“星星”,人们才能清晰、准确地表达这些信息。

图1-6 没有语言的世界中的居民正在努力传达一些天文知识

这种将信息转换成特定形式的过程就是编码(encoding)。编码就像给电影寻找译名,对于“The Matrix”这个电影名,可以译为《黑客帝国》,可以译为《骇客任务》,也可以译为《二十二世纪杀人网络》。无论翻译成什么,代表的都是同一部电影,但这些名字带给人的感觉完全不同。类似地,编码的方式并不是唯一的,同一种信息其实有很多种可能的编码方式。一种有效的编码,应该能在转换之后尽可能保留原信息的核心特征,从而避免信息在传递过程中减损和失真。

我们需要编码,是因为信息的接收者多种多样,而不同接收者能够理解的信息形式是不一样的。就像我们看到大街上两条狗在狂吠,如果不是精通动物交流的专家,大概无法理解狗叫声中蕴含的丰富信息,但如果有过养狗的经历,能够根据不同叫声的频率、音调、起伏变化,将其转换成人能够理解的状态,就能在一定程度上解读狗叫声中的信息。

对于计算机而言也是如此。计算机无法直接理解人类语言,它能直接理解的只有两种输入:0和1。这是因为计算机的基础构件是晶体管,它是一种微小的电子开关,可以在断电和通电两个状态之间切换。因此,这两个状态可以很自然地映射为0(断电)和1(通电),也就是二进制表示。

这种小开关的组合可以执行一些简单的逻辑判断,比如两个开关都打开就输出1,其他情况都只输出0,这就是与门(AND)的逻辑。再比如,只要至少有一个开关打开就输出1,只有两个都关着才输出0,这就是或门(OR)的逻辑。将这些逻辑模块组合起来,电路就能实现像加减乘除这样的基础运算,或是执行一些简单的条件判断。如今我们的电脑芯片中,有数十亿甚至数千亿个这样的晶体管,这些晶体管构成了极其复杂的电路,因此能实现高密度的信息处理,进行像深度学习这样的复杂计算。

但无论构造多么复杂,当代计算机的核心依然是基于0和1的二进制系统。也就是说,不管是什么形式的信息,视频、图像或是文字,想要让计算机对它们进行处理,都得先以某种方式将它们变成数字表示,再进一步编码成计算机能够理解的二进制格式。通过编码把人类的语言符号转化为机器能够计算的数字,就成了让计算机理解自然语言的必需步骤。

如今的计算机其实已经有了成熟的字符编码系统,我们现在在屏幕上看到的文字就是靠它们显示出来的。这其中广为人知的两种称为美国信息交换标准代码(American Standard Code for Information Interchange,ASCII)和Unicode(统一码)。这些编码方案通过一一对应的方式,定义了一组字符与相应数字之间的映射关系。比如在ASCII中,大写字母A的编码就是65。通过这种映射方式,各种字符都可以被转换为数字,从而能被计算机系统存储和处理。

然而,这种字符编码和我们接下来要讲的编码还不太一样。深度学习所需要的数据往往不是一个单一的值,而是一种特定的形式——向量。向量是一种数学表达方式,它表示具有大小和方向的量。可以将向量想象为一个箭头,箭头的长度表示它的大小,箭头的朝向则是它的方向。向量这一概念的核心在于,它表示了一个量的空间状态,这使得它能很好地承载高维度的信息。在计算机科学中,向量通常是一列数字,这列数字反映了数据样本的一系列属性。它就像是某个数据对象的用户画像,用户的性别、年龄、地理位置、消费习惯等特征,都被编码成了这列数字的一部分。而这些属性各自代表了数据的一个维度。于是,我们可以通过向量以高维的方式表示数据,从而让深度学习模型学到深层次的语义和结构,比如理解词汇间的复杂关系,或是找到多组数据之间的相似和不同之处。

词向量

在开始探讨如何将语言符号转化为向量之前,先要了解文本表示的基本概念。文本表示的第一步,就是确定表示对象的基本单元。为了创造一个能够自然对话的AI,我们的目标是尽可能全面地将所有文本向量化,让模型有充沛的学习资料,从而更好地掌握语言表达的基本规律。于是,我们设想构造一个词典,让词典中的内容能够自由组合成所有可能的文本。这样,模型只需要记住词典中每个基本单元的含义,就能通过建立这些单元之间的联系,学会自然语言了。就像我们刚开始学习识字的时候,总是先掌握单个汉字,然后才能一步步遣词造句,落笔成文。

分词和token

文本数据的范围可以大到一篇文章,小到一个字符,中间还能划分为段落、句子、短语等不同层级。在选择词典的构成时,如果将高层级的对象作为编码的基本单元,比如将句子作为表示文本的最小单位,那么最终能够表示所有文本的词典将会无比庞大。因为几乎每个句子都有着不同的词汇组合和语法结构,这使得句子的形态几乎是无限的。如果使用句子作为基本单位,就要为所有独特的句子单独存储一个编码表示,这将使得数据集的规模急剧膨胀。

当句子成为基本单位时,句子中蕴含的语法结构、指代方式、语序关系等信息也将不复存在。就像是一张有着复杂图案的拼图,如果站得太远,就只能看到整体的轮廓和色彩,每一块小拼图的细节都被淹没在其中。然而,对NLP中的很多任务而言,这些细节有着非常重要的作用。例如,文本分类对语序关系比较敏感,词性标注对语法结构比较敏感,等等。当这些细节消失时,模型就很难从中挖掘出有价值的信息。

因此,我们需要将文本字符串拆分成更小的、有意义的单元,作为编码的基本单位,这就是分词。而分词完成后的基本单位,有一个专门的术语,我们在大模型产品的收费页面经常见到,那就是token。

在所有分词方式中,最直观也最容易理解的就是按词划分了。所谓按词划分,就是每个词都作为一个token,这称为词粒度。在词粒度下,比如“《原神》是由米哈游自主研发的一款全新开放世界冒险游戏”这串文字,就会被拆成“原神”“是”“由”“米哈游”等词。这种分词方式和我们阅读时的停顿习惯一致,词语中的语义信息也被很好地保留了下来。看起来这种分词方式挺不错的,但它也有两个问题。

一方面,以词粒度构造的词表仍然太过庞大了。仅以现实生活中的词典为例,《汉语大词典》有着超过30万个词条,而《朗文当代高级英语辞典》包含约23万个词条。庞大的词典规模导致它的维护成本就很高,查找和更新极其依赖高效的数据结构和算法,这就大大影响了模型的学习效率。

另一方面,词粒度很难适应不断出现的新词和衍生出来的词,比如每年网络上出现的流行语,以及英文里面“smart”“smarter”“smartest”这样含义相似但形态不同的词。由于无法分辨词语的内部结构,词粒度唯一能做的,就是在词表中开辟一块新的空间来存储它们,这就会导致词典的规模持续膨胀,进一步增加计算的开销和负担。

为了解决这个问题,还有另一种将文本拆得更碎的分词方式,叫做字粒度,即把一句话拆成一个一个字和标点符号,将每个字或标点符号当作一个token。但这个办法也有问题,单个字母或者中文字符实际上是没有太多意义的,将文本分得太细,反而会导致词汇的语义信息丢失,而且模型输入的计算开销也会变得更大。像“I love you”在词粒度下只有三个词,但在字粒度下就要变成八个字母(此外还有空格),计算量就大了很多。

那么,理想的分词方式应该是什么样的呢?在理想的情况下,我们希望在词表规模、词表覆盖率和词表基本单元的含义之间找到一个平衡。它应该既能保留每个基本单元的语义,又能依靠基本单元的组合覆盖绝大多数不常用的表达,还能将整个词表的规模控制在可接受的范围内。而这,就是如今大语言模型采用的分词方式——子词(subword)粒度

子词粒度遵循的原则是,常用的词尽量不分解,不常用的词再往下分解为子词,每个子词作为一个token。比如“smarter”就会被拆分成“smart”和“er”这两个token,通过学习基础词“smart”的意义和这个后缀“er”,模型就能理解整个词的原意,还有它的比较级含义。而像“gelivable”(来自网络词汇“给力”)这样新造的生词呢,就可能会被拆成前面的“geli”和后面的“vable”这两个token,这样即使这个新词不在训练数据里,模型还是可以通过识别其中的“vable”后缀,来把握一些基本的语义信息,从而对这个全新的词的含义做出一定的推测。

因此,今天大模型产品往往依照子词粒度处理用户的信息。例如,大模型常用的“按token收费”策略,往往就是按用户与大模型之间交互的子词数量收费。此外,这也很好地解释了大模型里面一些怪现象,比如它很难数明白一段话里到底有多少个字,这就是因为模型能理解的只是子词的数量,而不是真正字符的数量。另一个例子是,让大模型把一些较长的单词倒过来写时,也会出问题,比如让ChatGPT把“lollipop”(棒棒糖)这个单词倒过来拼写,它如果不写一个代码脚本而是直接输出的话,答案就很可能是错的。这同样也是因为AI看到的是“lol”“li”“pop”这些子词,并不是单独的字母。颠倒子词的顺序,就会得到“poplilol”而不是字粒度下的“popillol”。但这些都是小问题,子词粒度已经能非常好地平衡词表规模和语义信息了。

向量化

在明确了这个文本编码的基本单元之后,我们就要把这些拆分好的文本变成计算机能够理解的数字,这个过程就是向量化。

独热编码

有一种简单的向量化方法,称为独热(one-hot)编码。这种编码的思路是,先统计一段文字一共可以拆分为多少种不同的token,把这个种类数作为向量的长度,然后为每种token分配一个向量,每个向量都只能由0和1组成,且1只有一个。

独热编码方式有两个重大缺陷。第一,一整门语言可以拆分出的token数量非常大,如果按这种方式,每个token都得表示成一个长度为几千甚至几万的向量,而每个向量里面又只有一个1,剩下的全是0,计算量大的同时,信息密度又非常低,非常浪费资源。第二,独热编码下看不出不同token的语义关联,每两个不同的向量都是垂直的(因为它们的数量积为0)。所以,我们需要更好的编码方式。

词袋编码

为了缓解独热编码信息密度低的问题,学界提出了词袋(bag of words)编码。词袋编码不会再把每个token都转化成向量,而是会计算每个token在文档中出现的次数。

例如,对于“我喜欢吃苹果,不喜欢吃香蕉”这句话,我们假设它可以拆分成6个token:我、喜欢、吃、苹果、不、香蕉。如果用独热编码来表示这句话,它就需要8个长度为6的向量,如图1-7所示。

图1-7 用独热编码拆分句子

但换成词袋编码之后,这一整句话就只需要一个长度为6的向量,比如(1, 2, 2, 1, 1, 1),最终得到的结果是,“喜欢”“吃”这两个token出现了两次,其余的token各出现了一次。用一个向量就全记录了下来。

可以看到,词袋模型大大减少了数据维度,同时保留了部分语义信息。然而,这种方法仍然存在一个问题:它忽略了词语的顺序。对于词袋模型来说,“我喜欢吃苹果”和“苹果喜欢吃我”是完全相同的,因为它们包含的词语及其频率都一样。但实际上,这两句话的语义并不一致,这种问题在句子涉及主谓宾结构时十分常见。

n-gram编码

为了应对词语顺序对语义的影响,n-gram编码应运而生。n-gram指的是长度为n的小词组,这些小词组的生成可以想象成拿一个长度为n的小窗口沿着句子向后滑,框出来的就是一个个长度为n的小词组。例如,设定n = 2,对于“我喜欢吃苹果”的例子,使用2-gram编码后,切分的词组就是“我喜欢”“喜欢吃”“吃苹果”。而“苹果喜欢吃我”切分后的词组则是“苹果喜欢”“喜欢吃”“吃我”。这样,就区分开了两句话。

到这儿,我们就成功地把句子转化成数字向量了,而且不同含义的句子对应的向量也不一样,能区分开。而再进一步,我们还可以通过比较向量在空间中的状态,比如距离、角度等,来计算两个向量之间的相似度。最终去找到一套更精准的编码,让句子的含义也能体现出来。比如“我喜欢吃苹果”和“apple这种fruit我觉得很good”,这两句话无论是字数还是用词都不一样,甚至都跨语言了,但在合适的编码下,它们对应的数字向量就会离得很近,这样它们在语义上的相似性就在数学上被表达了出来。

利用这种方法,我们已经可以构建出一套原始的人工智能系统。首先,我们手动准备一系列问题和回答,比如对于“你是谁”这个问题,回答“我是林亦”。然后,将这些问题编码成向量,当用户提问时,我们也将其转化为向量,并与预设问题进行匹配。比如用户问“你叫什么名字”,它可能会匹配到“你是谁”这个问题上,然后回答“我是林亦”。这种模糊匹配搜索就是最早期的人工智能。

从这种无情的搜索机器到今天能聊天、能陪伴、能吟诗作对的大模型AI,中间经历了哪些技术进步呢?除了编码方式有了突破,能够更高效地捕捉更丰富的信息,深度学习领域的发展进一步赋予了AI更强大的“大脑”。

大模型如何“说人话”?

人类学习语言的过程,简单来说,就是从“蹦词”开始。小时候,我们看到一个红红的、圆圆的东西,大人告诉我们:“这是苹果。”看到一个黄黄的、弯弯的东西,他们又说:“这是香蕉。”通过这种反复的观察和对应,我们逐渐学会了用语言描述世界。而大模型的语言学习过程,虽然没有用到眼睛和耳朵,却也有异曲同工之妙。它通过海量的文本数据,搭建了一座庞大的“词汇图书馆”。

图书馆中,各种书籍按类别整齐排列。比如,讲编程的书和讲计算机结构的书可能挨得很近,而爱情小说则可能被排在另一层楼。大模型的“词汇图书馆”也是如此,只不过它的规模大得惊人——每本“书”上只写一个词,而这些“书”是根据词语的共现频率排列的。比如,“苹果”这本书周围可能是“好吃”“水果”“营养”“健康”,而这些词的周围又是与它们相关的词汇。通过这种方式,大模型为每个词建立了一个精确的位置。

更厉害的是,这座图书馆是从互联网上几乎所有的人类文本中整理出来的。各种可能的表达方式都被统计了进来,每个词都被周围几十甚至几百个词锁定在了一个精确的位置。这样一来,一个词在这座巨大的图书馆里的位置,比如第几组、第几排、第几行、第几列,就对应了一个非常具体的含义。哪怕大模型没见过现实世界的“苹果”,但它知道“苹果”这个词的位置在“好吃”“水果”“营养”“健康”这些词附近,这就已经是一个非常全面、准确的理解了。而这个位置坐标,也就是我们刚刚提到的“词向量”。

不过,到这为止,词汇还是一个个分离开的。一旦词语连起来成了句子,难度就又上了一个台阶。比如,“苹果”这个词,在“我想吃苹果”和“我买了个苹果手机”这两句话里,意思并不相同。如果混为一谈,就会把句子的意思理解偏。

注意力机制

为了应对这种变化,大模型引入了“注意力机制”。它会根据词语的上下文动态调整词义。看到“吃”,它会把“苹果”往“食物”的方向拉;看到“买”和“手机”,它又会把“苹果”往“数码”的方向推。这种动态调整的能力,正是大模型生成连贯语义的关键。

那么,大模型是怎么学会这种动态调整的呢?方法其实很简单,就是拿着互联网中几乎无穷无尽的文本数据,不断地让大模型做“填空”。一开始没训练的时候,大模型也糊涂,比如“我买了个苹果手机”这句话,把“买”字抠掉留个空,它可能会填个“吃”,但这就和原文不一样了。训练算法就会给它扣分,让它知道自己错了。下次看到“苹果”和“手机”在一块儿,它就会少往“吃”这个方向靠,多往“买”那个方向走(如图1-8所示)。通过这样的反复训练,大模型逐渐学会了如何根据上下文调整词义。

图1-8 大模型正在努力区分“苹果”一词的不同含义

经过无数次的填空练习,大模型不仅成了“完形填空大师”,还学会了持续生成文本。只要你给它一个开头,它就能根据上下文不断往后填,生成连贯且符合语义的句子。这就是今天的智能助手和聊天机器人能流畅表达的原因——本质上,它们就是高级的填字机器。

为什么大模型有时“不说人话”?

搞明白了这个原理,咱们也就能理解大模型身上的很多奇怪现象了。比如,它们好像懂点数学,但又好像完全不懂。一个经典案例是,以往的大模型在比较“9.11”和“9.9”哪个更大时常常会犯错,这就是因为它们对数字的理解也是基于文字本身,而不是真正意义上的逻辑推导。对一些物理、化学现象的理解也是一样。所以,大模型其实有个非常明确的天花板,就是人类语言的描述极限。

现实世界里依然存在一些现象和概念,是人类文字尚未触及的,有些可能还涉及很底层的原理,比如基本粒子的行为规律、细胞的生物化学机制。大模型算法再出神入化,把人类有史以来写过的每一个字都存进了自己的大图书馆,也依然理解不了这些无人探索过的领域。

这就是为什么今天越来越多的大模型厂商开始把精力放在训练以外的部分,比如提升大模型的多步推理能力,让它们真正学会像人类一样多步推理。不过,即便这一步做到了,大模型的能力天花板依然受限于我们的现实世界。就像最顶尖的科学家也得做实验,不能只靠空想就取得研究成果。所以,大模型技术并没有那么无所不能,搞明白了它的原理,也就自然能理解它的问题所在了。

自然语言处理的未来展望

在本章中,我们一同探索了人工智能语言技术的发展脉络与核心技术。从机器学习的基本原理出发,我们了解了神经网络如何通过模仿人脑结构,逐步学会处理复杂的数据;接着,我们深入自然语言处理领域,探讨了文本分词、编码和向量化等关键技术,这些方法为计算机理解人类语言奠定了基础;最后,我们聚焦于大模型,揭示了它们如何通过大规模训练生成流畅的自然语言,并分析了其局限性及未来发展方向。

我们不仅看到了自然语言处理的复杂性和精妙之处,也看到了它在实际应用中的巨大潜力。无论是智能助手的日常对话,还是内容创作领域的创新突破,这些成果都离不开背后深厚的技术积累。然而,正如我们所讨论的,当前的大模型仍受限于人类语言的描述极限,对于未触及的领域或深层次逻辑推理,它们仍有很长的路要走。

展望未来,自然语言处理技术将继续演进,可能通过更高效的多步推理、更强的跨模态学习能力,以及对未知领域的探索,进一步缩小与人类的差距。但无论如何,这项技术的核心始终在于服务人类社会,帮助我们更高效地沟通、学习和创造。

相关图书

大模型应用开发 动手做AI Agent
大模型应用开发 动手做AI Agent
生成式人工智能(基于PyTorch实现)
生成式人工智能(基于PyTorch实现)
Cursor与Copilot开发实战让烦琐编程智能化
Cursor与Copilot开发实战让烦琐编程智能化
AI原生应用开发:提示工程原理与实战
AI原生应用开发:提示工程原理与实战
AI辅助编程实战
AI辅助编程实战
大语言模型工程师手册:从概念到生产实践
大语言模型工程师手册:从概念到生产实践

相关文章

相关课程