基础篇

F02|一排数、一张表和一叠表:读懂张量与形状

基础篇约 2.1 千字1 组分步图解

从具体对象与小例子开始,理解计算过程与适用条件。

本节会用到
本章目录
动态图解 · F02

新增一个轴,究竟多了什么

[2,3]为什么变成[2,3,4]?

把每个Token位置想成有一张“数值卡”。原来卡上只有词表编号;查表后卡上有四个数字。句子数没有增加,位置数没有增加,只增加了“在这张卡上选第几个数字”这一种选择。

轴选择数据的一层地址:哪句话、哪个位置、第几个特征。
形状每层地址有多少种选择,如[2,3,4]。
特征参与后续计算的数值分量;不保证每格都能命名成一种语义。

输入与适用条件:继续使用正文的两句话、6项词表和4维Embedding表。PAD只占位置;屏蔽它的机制见F12。

1 / 4 · 先数一排编号

第1步,共4步

窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。

新增一个轴,究竟多了什么:先数一排编号我编号 1爱编号 2学习编号 3一条输入 × 三个位置;每个格子还是一个整数。“形状[3]”描述格子怎样摆,不是里面三个数的值。

[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解释,不能混读。

运行示例 · F02

像查座位一样定位三维数组里的一个数

输入与条件。有两句话,每句话安排三个位置,每个位置暂用两个数字表示。把结果写成 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]。示例输入和场景由本书明确设定。

课后自检

自检 1

形状[2,5,3]含多少个数?每个位置用几个数?

查看参考答案收起参考答案
共有2×5×3=30个数,每个位置用3个数。2是输入条数,5是位置数。
自检 2

H形状[2,128,4096],H[0,10]是什么?

查看参考答案收起参考答案
第一条输入第11个位置的一排4096个数,形状[4096],不是单个Token编号。

机制依据:[F-TENSOR][F-LINALG]。本节数值与情景除另注外均为原创教学示例;来源不代替中文讲解。

记录保存在本机浏览器。

输入关键词即可检索。

↑ ↓ 选择 Enter 打开Esc 关闭 · 仅本地搜索

阅读设置

阅读设置仅保存在本机浏览器,不上传任何数据。