词变向量,意思变几何。点积量意思之间的相似度!
电脑根本不会读字,只会做算术。你跟每个聊天机器人说的话,底下全是巨大到吓死人的乘法加法。这引出个正经问题:乘加运算怎么就能替你写邮件了?这篇东西拆给你看,符号公式一个不落,顺手把GPT的骨架也剖了。
万物先变数字
电脑处理“猫”这个词之前,必须有人先把“猫”变成数字。这就是全部游戏。你听过的所有AI突破,底下都是同一个问题的更好答案:该用哪些数字代表这个东西,以及怎么调这些数字?
现在通行的答案是向量,一串数字,当成空间里的一个点。我更喜欢把它想象成一根从原点指向那个点的箭头。“猫”可以是768个数字,具体几个看你设计,数字越多能装的细微差别就越多。“狗”也是768个。“直升机”也是。
数字怎么挑的呢?挑法就一个原则:意思相近的,箭头方向就挨得近。
“猫”跟“狗”指向几乎同一个方向,“直升机”指向别处。
意思变成了几何位置。
这些箭头叫嵌入向量,不是人手工编的。没人坐下来拍脑袋定“猫”的那768个数字。它们是学出来的,靠一个简单压力:在相似句子里出现的词,会被推向相似方向。给机器喂够互联网,“猫”和“狗”自己就会飘到一起,因为它们在成千上万个句子里都追东西、都撞翻桌上的玩意儿。
2013年谷歌搞了个叫word2vec的东西,演示效果挺有名。你甚至可以对意思做算术:国王减去男人加上女人约等于女王。拿“国王”的箭头减掉“男人”的箭头再加上“女人”的箭头,落点附近最近的词就是“女王”。从“男人”到“女人”这一步在空间里是个固定方向,你从哪儿出发都能这么走。没人编过这条规则,是数字自己长出来的。头一回亲眼见它跑出来,确实有点瘆人。
这玩意儿不是玩具,也不光能处理词。我之前搞过一个系统,得在同一栋楼里用一堆摄像头跟同一个人。角度不同、光线不同、大半时间只能看见背影。运作方式完全一样:每次看到一个人就变成一个向量,如果两次看到的箭头指向几乎同一个方向,那就是同一个人。系统从来不像你那样知道名字或脸长啥样。它比箭头。这个思路跑起来,输入是词、是脸还是声音都一样,所以我老说各种模态都从同一扇门进。
点积,一个运算管所有
意思是方向,那就得有个法子问:两根箭头多对齐?这个运算叫点积,值得花两分钟搞明白,因为它是全AI用得最多的运算。你听说GPU对AI重要,多半就是因为GPU在干这个,每秒干几十亿次。
两根向量a和b。点积公式:a · b = Σ aᵢ bᵢ = |a| |b| cos(θ)。左边先看。Σ就是“加起来”的指令。aᵢ是指a列表里的第i个数。所以Σ aᵢbᵢ就是:把两个列表按位置一对一对地相乘,全加一块。整个运算就这,乘完再加。
右边是我们为啥在乎它的原因。这个总数碰巧等于两根箭头的长度乘以cos(θ),这里的θ就是两根箭头之间的夹角。余弦就是个旋钮:两根箭头同向时读数是1,垂直时是0,反向时是-1。所以一次便宜的乘加运算,偷偷就量出了对齐程度:箭头对齐得越好正数越大,意思越接近;毫不相干接近零;对着干就是负数。
点积就是一个相似度分数。“猫”点“狗”很大,“猫”点“直升机”接近零。把这个记牢,因为下篇要讲的Transformer里面的“注意力”机制,大家当神秘魔法供着那个,其实就是把这个运算放大了很多倍来搞。
重塑空间的机器
词是箭头了。现在需要一台机器对它们做点事。这东西叫神经网络,我想老老实实把它搭出来,因为它是搭Transformer的乐高砖。搞懂这个,下篇就轻松了。
从一个神经元开始,是个小公式,不是脑细胞:
h = f(w · x + b)
四个符号,四个活儿。
x是输入,一个向量,比如一个词的嵌入向量。
w是权重,另一个向量,输入有几个数就有几个权重,编码了这个神经元对每个输入有多在乎。
注意w · x又是点积:这个神经元在给输入跟它调校的那个模式匹不匹配打分。
b是偏置,一个常数,把分数往上或往下平移,它定了神经元的阈值,多容易就被激活。
f是激活函数,最后加的一个小非线性扭曲,得专门给它开一节,因为用哪个扭曲的故事差点把深度学习给整没了。
一个神经元算一个分数。把一整排神经元摞起来,每个有自己的权重,把同一个输入同时喂给它们。
把整排一次性写出来就是:h = f(Wx + b)。
形式一样,但W现在是个矩阵,所有权重向量排成一张网格,h是所有分数组成的向量。
然后关键一步,把这个输出当作下一层的输入再喂进去,再下一层。这就是多层感知机,缩写MLP。
我想让你脑子里有这幅画:每一层拿整个可能的输入空间,重塑它,拉伸、旋转、折叠。原本在原始空间里绞成一团的东西,比如混杂在一起的讽刺评论和真诚评论,经过够多层折叠之后就能干净地分开了。层数多不是魔法,层数多就是折叠空间的次数更多。
一个函数选择怎么冻住了一个领域
该讲讲“f”的故事了。听起来像脚注,但它决定了深度学习差不多十年的命运。
首先,为啥非得有“f”?因为没有它,堆多少层都没意义。Wx + b是个线性运算,线性运算堆再多层也会塌缩成一个线性运算。一千层没扭曲,等于一层。我刚才说的那些折叠空间?扭曲是折叠能成立的关键。去掉它,每一层就只是在同一张平板上拉伸旋转。
那用哪种扭曲?跟我逛一圈博物馆。
Sigmoid是经典选择:σ(x) = 1 / (1 + e^(−x))。
读法:把任何数压到0到1之间,沿一条平滑的S形曲线。
非常负的输入落点接近0,非常正的接近1。
它平滑,处处可导,看起来还怪像神经元从关到开切换的。人人都用。
然后它悄悄把深层网络掐死了。
看S形曲线远离中心的地方:变平了。平意味着导数,也就是斜率,在那里几乎为零。
这为啥要紧?因为你马上会看到,学习是靠把斜率从后往前一层层传回去,一路乘过去。
十层Sigmoid串起来就是乘十个小数:信号还没传到前边几层就缩到快没了。网络的前端干脆不学了。这就是梯度消失问题,很大程度解释了为啥神经网络在90年代和00年代被当成死路一条。
2010年左右普及开来的修法,简单到侮辱智商:ReLU(x) = max(0, x)。
整个函数就这。负数输入,输出零。正数输入,原样放行。任何正输入斜率都精确是1,所以学习信号穿过一百层往回传都不会缩水。
算起来还几乎不要钱。
这一个替换就是深度学习在2010年代突然能用的真原因之一。我喜欢这故事因为道理能推广:有时候突破不是加聪明东西,是把悄悄搞死你的东西拿走。
博物馆有现代翼。现在的顶尖模型用ReLU的平滑亲戚:GPT类模型用GELU,是ReLU在零附近用软的概率弯折代替硬拐角;Llama类模型用SwiGLU,加了个学出来的门控决定多少信号能过。差异确实有,但都是增量改进,是在ReLU的核心洞见上修修补补,不是革命。博物馆的重点不是展品,而是你十分钟前听都没听过的一个函数,扛了整个领域的重量,而选它的驱动力就一个问题:斜率会怎样?
“错”是什么意思:损失函数
我们有了一台塞满可调数字的机器。启动时蠢得很:W和b是随机的,所以预测全是噪音。学习就是调它们。但往哪儿调?
机器能变好之前,得有人把“错”定义成一个数字。这个定义叫损失函数,语言模型的标准选择是交叉熵。公式在这,然后拆开看:L = − log P(正确的下一个词)。设定是:模型读了一段文字,给下一个可能出现的每个词都输出一个概率。这些候选词里有一个是训练文本里实际出现的下一个词。损失就是:拿模型给那个正确词的概率,取对数,把正负号反过来。
为啥要取对数?感受下它的形状。模型说正确词概率是1.0,绝对自信完全正确:log(1) = 0,损失为零,不罚。概率0.5:损失约0.69,轻微刺痛。概率0.01,模型迷之自信但错了:损失约4.6,重罚。概率趋近于零:损失炸向无穷大。对数把自信的错误变成灾难。老实打太极的模型挨轻拍,胸有成竹却错了的被重锤。每一步训练,这个压力都把概率往真相那边推。
再往下挖一层,这才开始真正漂亮。最小化这个损失不是随便定的菜谱。统计学家问了一个世纪:给定数据,你怎么挑最能解释这些数据的模型参数?他们的答案,最大似然估计,说:挑那些让观测数据出现概率最大的参数。动手算一下代数就会发现,最大化数据的概率跟最小化我们的交叉熵损失是一回事。同一套数学,两种说法。所以GPT训练的时候,做的是统计学里最经典的事:找出让真实互联网成为最可能出现的互联网的那些参数。模型不是在背句子,是在拟合语言上的概率分布。
这也是认识语言模型的诚实框架,下篇能解释很多东西,包括为啥模型错的时候听着跟对的时候一样自信,甚至更自信。错答案和正确答案来自同一个分布,穿着同样流利的伪装。
学习:往山下滚
A部分的终章了。我们有了一个数衡量错的程度。学习就是:让这个数变小。
想象一片地形。权重的每一种可能设置θ是一个位置。每个位置的海拔是损失。这片地形里某个地方海拔最低:能让错误最少、错误最轻的那些权重。训练就是找路过去。坑爹的是地形有几十亿个维度,你还站在雾里,看不见山谷在哪,只能感觉脚下的地面。
那就干最 obvious 的事。感觉哪边是下坡,往那边迈一步,重复。下坡方向有名字:梯度,写成∇L。它是损失相对于每一个权重的斜率集合,同时算出来,靠一个叫反向传播的算法,这名头挺大其实就是微积分里的链式法则配上滴水不漏的记账。完整的更新规则,这条全现代世界跑在它上面的公式是:θ ← θ − η ∇L(θ)。符号挨个来最后一次。
θ:所有权重和偏置,几十亿个数,你在地形里的位置。←:更新,把旧的权重替换成后面的东西。∇L(θ):最陡上坡方向,以及有多陡。−:计算机科学里最重要的负号。上坡让损失变差,所以走反方向。η:学习率,步子迈多大。太大冲过山谷弹来弹去,太小训练慢到地质时间。我在这个数字上损失过的周末比我想承认的多。再看一遍动画:地面越平步子越小,因为步长跟斜率大小成比例。球自己刹进谷底。
把那行代码在几万亿个词上跑几万亿次,随机权重就变成了GPT。这就是训练。幕后没有第二个机制藏着。
收尾前快速照个镜子,因为你还会遇到它。把负号翻成正号就是梯度上升:往上坡走,用在那个数衡量的是你想要更多的东西比如奖励,而不是错误的时候。下降最小化痛苦,上升最大化收益,同一台机器指向两个相反方向。记住这个翻转。下篇里它会把一个猜下一个词的机器变成有用的助手。
我们现在在哪,以及墙上的裂缝
看看你现在手里有什么,已经是机器的大部分了。词变向量,意思变几何。点积量意思之间的相似度。MLP用f(Wx + b)重塑空间,知识全部住在权重里。交叉熵定义错,它是最大似然的伪装。梯度下降把权重滚下山直到机器不犯错。
还有三样你这周就能用上的。
一,AI回答听着特自信的时候,记住它从哪来的。模型是个概率分布,正确答案和错误答案穿着同样流利的伪装。自信是种风格,不是信号。重要的事自己核实。
二,语义搜索就是点积。所有RAG系统和“跟文档聊天”的工具都是比嵌入箭头来检索。检索不准就是箭头没对齐,所以重新措辞你的问题,说出你的意思,而不是你记住的关键词。
三,嵌入向量便宜得很,你今天就能用。各大AI提供商都在卖,几分钱一次。“帮我找跟这个像的”跨你的笔记、工单、产品,就是一个点积的事,不用训练模型。
但地基里有条裂缝,这是悬念。以上所有东西都把每个词当成固定的一根箭头。想想:“我坐在河岸边”和“我从银行取现金”。同一个词,同一根箭头,意思完全不同。一个固定的嵌入向量在见到你的句子之前就替“bank”定好了意思。MLP把输入当一个固定整坨吃进去。它没有任何机制让一个词看看周围的邻居然后调整自己。
语言真正需要的是这样一台机器:代表“bank”的箭头能被上下文掰弯,在一个句子里被拉向河岸,在另一个句子里被拉向金库。一台每个词都能问其他每个词的机器:你跟我现在这个意思有没有关系?你已经知道给这种相关性打分的运算了,就是点积。2017年谷歌一个团队搞出了整套Transformer架构,到处、并行地问这个问题,把这机制叫注意力。