F02|一排数、一张表和一叠表:读懂张量与形状
从具体对象与小例子开始,理解计算过程与适用条件。
本章目录
新增一个轴,究竟多了什么
[2,3]为什么变成[2,3,4]?
把每个Token位置想成有一张“数值卡”。原来卡上只有词表编号;查表后卡上有四个数字。句子数没有增加,位置数没有增加,只增加了“在这张卡上选第几个数字”这一种选择。
输入与适用条件:继续使用正文的两句话、6项词表和4维Embedding表。PAD只占位置;屏蔽它的机制见F12。
1 / 4 · 先数一排编号
窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。
[1,2,3]表示一句话里的三个位置。此时选定“位置1”,就取到一个整数2。
IDs = [1,2,3]默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。
为什么需要
把形状理解为地址,后面看矩阵乘法才知道沿哪个方向处理。
怎样实现
固定一句、再固定位置、最后取一个特征,逐层读下标。
可能的代价与误解
把隐藏宽度当作词表大小,会混淆Embedding表和输出概率表。
如何判断是否做对
核对[2,3,4]共24个数,且X[1,1]确实是“爱”的四维向量。
先不背“张量是多维数组”
单个数7可以叫标量。一排有顺序的数[7,2,9]叫向量。两排这样的数组成一张有行有列的表,叫矩阵:
A = [[7,2,9],
[4,8,1]]
这张表有2行、每行3个数,形状(shape)写作[2,3]。这里的[2,3]是在描述大小,不是表里真的只存2和3。区分“内容”和“形状”是第一道关口。
在机器学习程序里,张量(tensor)是存放规则排列数字的通用数据结构。标量、向量、矩阵都可以用张量表示。这里不需要数学和物理中更抽象的张量变换定义。
从两张表理解三个轴
假设两句话各有3个文本片段,每个片段用4个数描述。第一句话对应一张3行4列的表,第二句话也对应一张3行4列的表。把两张表放在一起,就是形状[2,3,4]的张量:
第0句话:[[0.2,-0.1,0.7,0.4], 第1句话:[[0.1,-0.5,0.9,0.3],
[-0.3,0.8,0.1,0.5], [-0.3,0.8,0.1,0.5],
[0.6,0.2,-0.4,0.9]] [0,0,0,0]]
每个决定“往哪个方向数”的位置叫一个轴(axis)。这三个轴依次是“第几句话”“第几个片段”“这个片段的第几个数”。最后一个轴不是把编号转换成4位二进制;它是因为每个文本片段从单个编号换成了4个数值特征。这些特征可以是小数、负数,不要求只有0与1。具体查表过程在F05完整展开。轴的意义由你怎样组织数据决定,不是张量自己知道中文句子是什么。
因此[2,3,4]含2×3×4=24个数。一般地,把形状中的各个长度相乘,得到规则密集张量的元素总数。
方括号中的数字不是同一种“维度”
“这是一个三维张量”通常说它有3个轴;“每个Token是4096维向量”说每排有4096个数。这两句话里的“维”指的不是同一个层次。
后面采用统一写法:B是本批有多少条输入,T是每条输入安排多少个位置,d是每个位置用多少个数描述。于是[B,T,d]就是“B张表,每张T行,每行d个数”。
当B=2,T=128,d=4096时,它仍然只有3个轴,并不是4096个轴;元素总数为1,048,576。4096是每个位置那一排数的宽度,不是有4096个汉字,也不是模型一共只有4096个参数。
怎么找到里面的一个数
本书代码使用从0开始的下标。A[0,1]指第0行、第1列,在上面的矩阵A中是2。方括号用在变量名后面时常表示索引;独立写“shape=[2,3]”时才是在说大小,要看上下文。
对H形状[2,3,4]:H[1]取第二句话,剩下一张[3,4]表;H[1,0]取第二句话第一个片段,剩一排4个数;H[1,0,2]再取第三个特征,得到单个数。用哪个下标取出数据,哪个轴就被选定了。
冒号表示“这一轴都要”。H[1,:,2]取第二句话每个片段的第三个数,得到长度3的一排数。H[:,:,0]取所有句子所有位置的第一个特征,得到[2,3]。
符号不认识时怎样读公式
x_i读“x的第i个数”;x²是x乘x;Σ表示“把后面规定的一组数加起来”;∈表示“属于”;R在公式中常表示实数。X∈R^(B×T×d)只是“X是一份形状B、T、d的实数数据”。这不是要求你当场解一个方程。
代码里的=常是“把右边结果保存到左边”;数学里的=常是“左右相等”。:=强调定义;≈表示近似相等。公式中大写T可能是序列长度,上标ᵀ却是转置符号,转置会在F07解释,不能混读。
像查座位一样定位三维数组里的一个数
输入与条件。有两句话,每句话安排三个位置,每个位置暂用两个数字表示。把结果写成 X=[[[1,2],[3,4],[5,6]], [[7,8],[9,10],[11,12]]]。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1选第一层 | X[1] 选第2句话 | 得到 [[7,8],[9,10],[11,12]],形状是 [3,2]。 |
| 2选第二层 | X[1][2] 选这句话第3个位置 | 得到 [11,12],形状是 [2]。 |
| 3选第三层 | X[1][2][0] 选该位置第1个特征 | 得到数值 11,不再是一排数。 |
| 4反向数大小 | 2句话×3位置×2特征 | 共12个数,形状 [2,3,2],每个轴回答不同问题。 |
把过程连起来。“三个轴”和“每个向量有两个分量”可以同时成立。轴是定位层级,轴的长度是可选择的数量。
边界与反例。下标从0开始只是本书和Python采用的约定,不是语义上的第0句话。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
课后自检
形状[2,5,3]含多少个数?每个位置用几个数?
查看参考答案收起参考答案
H形状[2,128,4096],H[0,10]是什么?
查看参考答案收起参考答案
机制依据:[F-TENSOR][F-LINALG]。本节数值与情景除另注外均为原创教学示例;来源不代替中文讲解。