探索大语言模型的偏见
当我前几年还在和广东厂家老板谈进货价格的时候,我绝没有想到,到了我五十多岁的年纪, 我会下定决心从零开始啃大语言模型的底层代码和数学推导。 大语言模型本质上是人类语言的统计学镜像;而所谓的偏见,我们可以理解为训练数据的 分布不均衡导致损失函数曲面陷入特定局部最优解,进而使某些注意力权重被过度放大。 确实,这个对偏见的定义过于数学术语化了,能力所限,我实在找不到其他的方式来尽量准 确地表达它。 缘起 最近几年来,人工智能成了全球最热门话题。我八十多岁的老母亲也知道遇事不决问 AI 。 我的贸易公司在3年前关门歇菜了。于是,我开始热衷于在人工智能(AI)的帮助下开发各 种全栈应用。主要动力是我发现以前个人开发者很难实现的全栈应用,有了 AI 加持,竟然 都可以比较轻松地独立完成了!我前后开发了大大小小七八个应用。不出意外地,我发现这 些点子,其实别人早都已实现了。同时,我也从手工写代码,慢慢进化到了自己做架构和计 划,基本由 AI 完成代码。(我的全栈工具是 .NET + Vue ) 在被现实的铁拳不断捶打中, 我猛然想到:在AI 可以把标准架构和代码实现的时代,去探究 AI 到底是如何“思考”的, 也许更有意义。 事实上,我不仅想学会如何从零开始构建一个大语言模型(LLM),更想理解模型的底层数学 原理和逻辑。 顿悟 在构建我的大语言模型过程中,由于自己的大学数学知识基本只剩下课程名字,我不得不问 ChatGPT 一个问题:“Attention 权重是 Query 向量与所有的 Key 向量做点积,计算权重, 最后加权 Value 得到上下文向量。那么,这个过程是一个线性变换吗?”我才得到了完整的 画面:如果注意力权重是常数,那么会是一个线性变换。但是,大模型要模拟现实复杂多变 的世界,必然要在逻辑上实现动态变化。因为 query 和 key 都来自同一输入,点积本质上 是输入 x 的二次函数 (x·x), 是非线性的;而Softmax 函数包含指数运算 (eˣ), 是 典型的非线性函数。 相信看到回答,我们大多数人都已经理解了这个注意力机制过程是非线性的。接着,ChatGPT 再强调:从数学和信息论的角度来说,这个前向计算过程(从输入向量到上下文向量)通常 是不可逆的,或者更准确地说,是“多对一”(Many-to-One)的映射,会导致信息丢失。最后 它再来一句,这种不可逆性的特性 (Feature) 体现了注意力机制作为“信息过滤器”和“特征 压缩器”的本质。而正是这些附加的回答内容,让我顿时领悟到AI为什么有幻觉和偏见的原因。 而工程师不得不要用大量和多样化的数据来训练一个大语言模型,除了让 AI 知道得更多, 还可以去“稀释”和“纠正”这些偏见。 作为一个50多岁从零开始学大模型的人,面对复杂的数学公式,我常常先用一些‘含糊’的生 活词汇去理解它。比如,当我看到注意力机制时,我脑子里冒出的词是‘偏见’。起初我觉得 这很不严谨,但随着深入了解,我发现这个‘含糊’的词,竟然能比较精准地戳中现代 AI 的 核心困境…… ...