大模型通识 / AI 理论基础
5. 模型怎样表示信息:从数字、向量到学到的特征
原文备份 · 第 6 / 14 篇 · 查看极客时间原知识库 ↗
本篇目录 · 7 节
来源:AI 理论基础
你的复习助手现在已经有了一批来源清楚、内容完整的笔记。接下来,你希望它在打开一篇笔记时,推荐几篇相关材料。
人看到“网页布局”和“CSS 排版”,容易判断它们可能相关;程序却需要一种可计算的比较方式。直接比较文件名不够,数相同的字也不一定有效。另一边,一张纸质笔记的照片又完全不是一串普通文字。
要处理这些信息,必须先解决“表示”的问题:用什么数字保存输入,又用什么计算把它变成适合任务的形式?
本篇从可以手算的小例子解释标量、向量、矩阵,以及模型学到的表示。读完后,你应该能看懂一组数字的形状,完成一次简单的相近程度比较,并解释为什么向量不等于语义、向量维数也不等于模型参数量。下面的数据全部是教学构造,没有调用真实嵌入模型,不需要安装软件。
一个数字,怎样变成一组数字
先暂时离开电子笔记,看看两本纸质笔记本。
假设你想按页数与价格寻找相近商品,可以约定:每本用两个数字记录,第一个是页数,第二个是以元计的价格。
笔记本甲:[80, 12]
笔记本乙:[100, 10]
约定顺序:[页数, 价格(元)]
单独的一个数,例如价格 12,可以称为标量,scalar。按照固定顺序排列的一组数,例如 [80, 12],可以用作一个向量,vector。这里向量包含两个分量,也就说它是二维向量。
在机器学习的这个语境里,可以先把向量理解为一条有固定位置含义的数字记录;矩阵则把数字按行和列组织起来。这些是后续模型计算常用的基本对象。《动手学深度学习》:线性代数基础
顺序不能随便变。[80, 12] 与 [12, 80] 包含相同的两个数,在刚才的约定下却描述不同商品。单位也不能混用:把 12 元记成 1200 分之后,比较方法就必须相应处理,不能直接拿它与按元记录的数据相减。
因此,“变成向量”并不是某种理解过程。我们还没有训练模型,只是规定了一种表示。它保留了页数和价格,却没有保留封面颜色、纸张手感和装订方式。如果推荐结果忽略了你最在意的纸张,可能是表示里根本没有相关信息。
给笔记做一个最简单的向量
回到电子笔记。我们先采用很粗糙的规则:只数正文中 CSS 和 SQL 两个字符串出现的次数,并固定顺序为 [CSS 次数, SQL 次数]。
假设三篇笔记得到以下计数:
| 笔记 | CSS 次数 | SQL 次数 | 向量 |
|---|---|---|---|
| A:以网页样式为主 | 8 | 1 | [8, 1] |
| B:以页面布局为主 | 7 | 2 | [7, 2] |
| C:以数据库查询为主 | 1 | 8 | [1, 8] |
这些次数为演示而设定,不是对本表标题进行实际统计。它们表示假想正文的计数。
如果把三条向量按行放在一起,会得到一个三行两列的矩阵,matrix:
CSS SQL
笔记 A 8 1
笔记 B 7 2
笔记 C 1 8
形状:3 × 2,即 3 个样本、每个样本 2 个特征。
这里的行与列承担不同职责。新增一篇笔记,会多一行;增加一个统计词,会多一列。三个样本不意味着“三维特征”,它们仍然各自用二维向量表示。
程序里的形状信息,也就是常见的 shape,就是在说明这些轴上各有多少元素。先读清每个轴代表什么,比背“模型输入是一个矩阵”更有用。
数字准备好了,怎样计算“更接近”
对这三个向量,我们选一种简单比较方式:同位置相减,把差平方,再加起来。
A 与 B 的差异值:
(8 − 7)² + (1 − 2)² = 1 + 1 = 2
A 与 C 的差异值:
(8 − 1)² + (1 − 8)² = 49 + 49 = 98
上标 2 表示这个数乘以自身,例如 (-1)²=1。这个差异值叫作欧氏距离的平方。真正的欧氏距离还要开平方,不过这里只比较大小,开平方不会改变排序,所以可以省掉这一步。
按照选定的表示与比较方式,B 比 C 更接近 A。于是,一个极简的推荐程序就可以把 B 排在 C 前面。
这一步说明,向量让某些比较变成了明确的计算。但它只证明两组关键词计数接近,没有证明文章一定讨论同一个问题。
例如,一篇只写“样式、排版、布局”的笔记可能一次也没出现 CSS,得到 [0,0];一篇介绍数据库但主要写“查询、索引、事务”的笔记,也可能得到 [0,0]。在这个表示中,它们的差异值为 0,尽管内容未必相近。
问题不是距离公式算错了,而是两个数字丢掉了太多信息。同样,把 A 全文复制一遍,就可能得到 [16,2]。主题没变,原始计数与距离却变了。用不用词频比例、怎样处理文章长度,都是表示设计的一部分。
前面的商品例子还有单位问题。直接比较“页数差”和“价格差”,实际上已经隐含了两种差异如何相互权衡;把元换成分会大幅改变价格项的数值。距离的意义依赖表示、尺度和任务,不能脱离这些条件理解。
图片也是数字,但数字排列有意义
文字可以先数词,图片又怎么办?
先看一张只有 2×2 个像素的灰度小图。约定每个像素用 0 到 255 之间的整数表示,0 是黑,255 是白:
视觉位置: 对应数值:
黑 白 0 255
白 黑 255 0
它可以表示为两行两列的矩阵。如果约定逐行读取,也可以展开成 [0,255,255,0]。只要保留读取顺序和原始形状,展开本身不必丢失像素信息;但后续计算是否有效利用上下、左右的关系,是另一件事。
彩色图片通常还要记录红、绿、蓝三个颜色通道。按“高、宽、通道”的约定,一张 2×2 的 RGB 图片可以组织为形状 2×2×3 的数组,共 12 个数。这里的“通道”,就是在同一像素位置分别存放不同颜色分量。
有更多轴的这类数组,在深度学习代码中通常统称为张量,tensor;向量与矩阵也可以看成它的简单情形。不同软件可能把通道放在不同轴,因此读代码时还要确认约定,不能只数出几个维度就直接使用。
这里容易混淆两种“维”:说一个向量是四维,指它有四个分量;说一个数组有三个轴,指需要三个位置索引来找到一个元素。2×2×3 有三个轴、十二个数,并不是一个只有三个分量的向量。
像素值仍然只是输入表示。它们没有直接写着“这是猫”或“这是课堂笔记”。同一张照片换个光照,许多像素都会改变;任务通常需要模型进一步提取比逐像素相等更有用的特征。
从人挑特征,走向学习怎样表示
刚才的关键词次数是人决定的:看哪两个词、怎样计数,都提前写在程序里。这种办法容易检查,但遇到同义表达、语序或上下文变化时,往往需要不断补规则。
另一条路线是把生成表示的过程也放进模型,让训练根据任务需要调整它。这个方向通常叫作表示学习,representation learning。相关研究关注的正是:怎样获得有助于后续任务的表示,而不完全依赖人为指定的一小组特征。表示学习研究综述
可以把两种路线放在一起看:
人工特征路线:
笔记 → 按预设规则统计 CSS/SQL → [8,1] → 比较或分类
学习表示路线:
笔记 → 可训练的编码过程 → 一组学到的特征值 → 比较或分类
↑ │
└──── 训练目标提供改进信号 ───┘
“编码过程”在这里就是把输入变成另一种表示的计算过程,不是指加密。
举一个训练目标的示意:如果希望找出表述不同但主题接近的笔记,可以准备相近与不相近的文本对,用目标函数鼓励适合匹配的文本表示更接近、不适合匹配的表示更容易区分。模型通过调整参数改变这种映射。实际方法有很多种,并不是所有表示学习都采用成对比较。
这与上一篇并不矛盾:训练目标和数据决定了模型受到什么信号,表示学习让模型有机会调整“利用哪些线索、怎样组合线索”。它并不能保证自动保留所有重要信息。
对图片也一样,学习的表示可以用于突出与识别任务有关的图案,减少某些无关变化的影响。但没有必要假定每一层必定对应一个人能准确命名的概念;更不能认为只要层数够多,就自然学到了我们想要的特征。神经网络怎样完成这些变换,第 07 篇再拆开讲。
Embedding:把对象放进可以比较的表示空间
接触大模型应用时,你会频繁看到 Embedding,嵌入。在这里,可以把它理解为把词、句子或其他对象映射为向量表示;常见的学习型嵌入希望通过向量之间的关系,表达对任务有用的联系。
比如,对一个适合语义匹配的模型,我们希望“怎样调整网页排版”和“CSS 布局方法”的向量比较接近,即使两句话几乎没有相同词。但能否做到、哪些表达容易出错,要用实际模型检查。本篇没有生成它们的真实向量,也不预设相似度分数。
词向量研究曾展示从文本学习连续向量表示的路线;Sentence-BERT 则研究了适合句子比较的嵌入。这提醒我们,词、句子和整篇材料可以有不同的表示方式,不能随便取一个模型的内部数字,就认为它天然适合检索。词向量原论文、Sentence-BERT 原论文
学习到的向量往往不像 [页数,价格] 那样,每个位置都有清楚的中文名字。不能看到一个三维演示,就推断真实嵌入的第一个数字是“前端程度”、第二个是“数据库程度”。它们的各个分量通常共同参与表达关系,单独一维未必能被简单解释;表示也会随任务而不同。Google:实际嵌入空间
这里还有三条直接影响开发的边界。
第一,维数相同,不代表可以混用。 两个不同模型都输出几百个数字,不说明它们采用相同的表示空间。就像两套商品记录都写两个数,一套是页数和价格,另一套是重量和厚度,直接逐项比较就失去了原来的意义。实际使用应采用彼此兼容、按模型要求生成的查询与资料表示。
第二,接近不等于事实相同。 “这个操作需要登录”和“这个操作不需要登录”讨论相同对象,关键结论却相反。即使某个模型把它们排得很近,也不能据此认定它们互相支持。相似度通常帮助找候选资料,最终还要阅读内容。
第三,生成一个向量不等于训练一次模型。 已训练的编码模型处理新笔记时,可以在参数不变的情况下输出新向量。把向量存进资料库,改变的是保存的数据,不等于模型参数发生变化。判断一个数组是不是参数,要看它在计算中的作用,不能只看它是不是一组数字。
至于欧氏距离、余弦相似度等比较方法怎么选择,以及嵌入如何参与检索,第二部分第 10 篇会结合应用讲。本篇先建立表示与计算之间的关系。
用几个小问题,检查自己有没有把数字看明白
仍然使用前面的三个向量:A=[8,1],B=[7,2],C=[1,8]。新笔记 Q 的计数为 [6,2]。
- 按“对应分量相减、平方、求和”的方法,Q 与哪篇最接近?
- 把 Q 加进三行两列的表,矩阵形状变成什么?每篇笔记变成三维了吗?
- 两篇内容完全不同的文章都没有出现 CSS 或 SQL,它们在这个表示下距离为 0,能说明内容相同吗?
- 一个模型输出 768 个数的笔记向量,能否据此说这个模型只有 768 个参数?
- 一张 2×2 的 RGB 图片按“高、宽、通道”保存,共有几个轴、几个数?
第 1 题: 与 B 最接近。计算如下:
Q 与 A:(6−8)² + (2−1)² = 5
Q 与 B:(6−7)² + (2−2)² = 1
Q 与 C:(6−1)² + (2−8)² = 61
这个答案只在当前计数表示和比较方法下成立,不能把它当作真实语义匹配结果。
第 2 题: 变成 4×2,四个样本、每个两个特征。增加样本与增加特征,是不同操作。
第 3 题: 不能。两个表示相同,可能只是这套表示没有保留区分它们的信息。
第 4 题: 不能。768 描述这次输出向量的维数;模型参数是决定如何计算的内部数值,其数量不能从输出长度直接推断。这个数字只是假定的输出长度,不指某款产品。
第 5 题: 三个轴,2×2×3=12 个数。若把它们按确定顺序展开,可以得到十二个分量的向量;要还原像素位置,仍须知道原来的形状和顺序。
现在,当你再看到“把资料转成向量”时,已经可以追问:哪些信息被保留了,形状与顺序是什么,表示是人工设计还是训练得到的,比较方法能支持什么结论?下一篇会继续解释训练过程的另一半:模型给出预测后,怎样用概率与损失衡量它需要改进多少。
上一篇:04|数据怎样决定模型能学到什么
下一篇:06|概率、预测与损失:模型怎样知道自己需要改进
返回:第一部分大纲