数据如何变成数字
模型做的是算术,所以任何输入——文本、图像、类别——都得先变成一串数字。这篇讲这个转换怎么做,以及它为什么重要。
先动手,再深入阅读
把类别表示成数字 · 5 分钟机器学习模型只做一类事:对数字做算术。它做乘法、做加法、做比较。它没有「星期二」「cat 这个词」或者「一个红色像素」的概念。所以在学习开始之前,每个输入都得先变成一串数字——一个向量。这一步叫特征工程或编码,它一旦做错,后面所有环节的天花板就被定死了。
目标:一串数字
模型希望每个样本都是固定长度的一行数字。一栋房子可能变成 [1450, 3, 2, 1998]——面积、卧室数、卫生间数、建成年份。每个位置是一个特征,整个列表是一个特征向量。
固定长度很重要。每栋房子都得映射到同样多的格子、同样的顺序,模型才能学到「第 0 格那个数往往会把价格推高」。如果一栋房子是四个数、下一栋是六个数,算术就对不上了。
本来就是数字的最省事。有意思的是剩下的所有东西:类别、文本、图像。
编码类别
假设某个特征是颜色:红、绿、蓝。很容易顺手写成 red=1, green=2, blue=3。这通常是错的。它等于告诉模型蓝色(3)「大于」红色(1),绿色正好在两者中间。这个顺序是虚构的,而模型会拿它当真的学。
解法是独热编码:给每个类别一个自己的格子,出现就填 1,否则填 0。红色变成 [1, 0, 0],绿色 [0, 1, 0],蓝色 [0, 0, 1]。没有假顺序,也没有假距离。代价是宽度——一个有上千种类别的特征会变成上千个格子,而且几乎全是 0。
如果类别本身确实有序——小、中、大——那用一个尊重顺序的数字(1、2、3)就很好,而且紧凑得多。规则是:编码真实存在的结构,别多编。
编码文本
文本是难的那一类,怎么处理它,划出了这个领域的几个时代。
最老的办法是数词。词袋给词表里每个词一个格子,填上它出现的次数。简单,代价是丢掉了全部词序——「狗咬人」和「人咬狗」拿到的是同一个向量。
现代的做法性质上就不一样。文本先被切成 token,每个 token 映射到一个学出来的稠密向量,也就是 embedding——几百个数,摆放的位置让意思相近的东西彼此靠近。这些数没有人手工指定,是模型学出来的,学到「king」和「queen」落在一起。这就是从这一层通向 LLM 实际怎么读文本的那座桥,更深的机制在 word2vec 和 embedding 空间几何 里。
编码图像
凑近看,图像本来就是数字。一个灰度像素是一个数,亮度从 0 到 255。一个彩色像素是三个数——红、绿、蓝的强度。一张照片就是这些数字的网格,把网格压成一长串,就是一个向量。
一张不大的 200x200 彩色图就是 200 x 200 x 3 = 120,000 个数。这很多,而且把每个像素当成独立特征,等于无视了相邻像素彼此相关这件事。如何高效处理这种空间结构是整整一个架构话题,但出发点是简单的:像素是数字,图像是数字的网格。
尺度为什么重要:归一化
回到那栋房子:[1450, 3, 2, 1998]。面积是四位数,卧室数是一位数。对做原始算术的模型来说,大的数在喊,小的数在耳语——面积之所以占主导,纯粹因为它的尺度,跟它重不重要没关系。
归一化把每个特征缩放到可比的范围内,通常大致是 -1 到 1,或者均值归 0。归一化之后,每个特征站在同一起跑线上,哪个重要由数据说了算,而不是由单位凑巧造成的。跳过这一步是模型训练得慢或者训练不出来的最常见原因之一,它直接关系到:当各特征的尺度天差地别时,梯度下降为什么就这么难走。
垃圾进,垃圾出
编码就是模型看到的东西。如果你的编码把信号藏起来了——假顺序、丢掉的词序、没缩放的量纲——再聪明的架构也找不回来。真实的机器学习工作里,很大一部分不是调模型,而是决定怎么把乱糟糟的现实变成诚实的数字。
要点回顾
- 模型做算术,所以学习开始之前,每个输入都要变成固定长度的一串数字。
- 只编码真实存在的结构:无序类别用独热编码,有序类别用一个带顺序的数字。
- 文本从数词(词袋)走到学出来的稠密 embedding;图像是像素数字的网格。
- 归一化特征到可比的尺度,否则数值大的特征会毫无道理地占主导。
- 编码决定天花板——特征不行,换更好的模型也救不回来。
下一篇: 什么是神经网络?——机器怎么把这些数字变成一个预测。