ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

字节技术总监30讲AI课:2现代大模型原理与系统工程 带你吃透ai算法

字节技术总监30讲AI课:2现代大模型原理与系统工程 带你吃透ai算法 \AI为什么偏爱矩阵从一组数字到神经网络真正搞懂Wx b、QKᵀ、Embedding《现代 AI 原理与系统工程》· 第02讲这一讲解决一个非常基础、但会贯穿整个 AI 工程的问题模型到底在计算什么如果把第01讲的“模型如何从预测下一个 Token 走向复杂能力”继续往下拆会发现几乎所有现代 AI 模型都要不断处理三类东西向量、矩阵、张量。真正理解它们以后Wxb、Embedding、Attention、GPU 矩阵计算就不会再是一堆孤立公式。1. 为什么学 AI总绕不开矩阵看到神经网络常见的是y Wx b看到 AttentionQ XWq K XWk V XWv Attention(Q,K,V) softmax(QKᵀ / √dk)V看到 GPU又会出现MatMul GEMM Tensor Core这些东西看起来分属不同领域。实际上它们共享一个非常朴素的底层结构数据 ↓ 数值表示 ↓ 向量 ↓ 矩阵变换 ↓ 新的向量表示 ↓ 不断重复所以第二讲不急着背 Transformer。先把它最底下的“数学机械结构”拆开。2. 向量到底是什么最简单的向量x [2, 4, 6]从 C 的角度它非常像floatx[3]{2,4,6};但 AI 里更重要的一层理解是这几个数字通常共同描述一个对象、样本或状态。例如x [temperature, pressure, vibration]这是一个 3 维传感器状态。一个 Token 的隐藏状态可能是h [0.21, -0.83, 1.42, ...]这里的几百、几千个数字共同构成模型内部的一种表示。所以数组视角 一组数字 AI 视角 一个对象在某个表示空间里的坐标3. 先学会内积两个向量a [1, 2, 3] b [4, 5, 6]内积a · b 1×4 2×5 3×6 32它在代码里就是一段非常朴素的乘加defdot(a,b):iflen(a)!len(b):raiseValueError(dimension mismatch)total0.0foriinrange(len(a)):totala[i]*b[i]returntotalprint(dot([1,2,3],[4,5,6]))输出32先记住一句内积 逐元素相乘后全部累加。这件事看起来普通却会在 AI 里反复出现。4. 为什么内积可以用来判断“相似”向量还有一个重要关系a · b ||a|| ||b|| cosθ所以cosθ (a · b) / (||a|| ||b||)这就是余弦相似度。它经常用于Embedding 向量检索 文本匹配 RAG 推荐但这里有一个容易忽略的细节内积本身不仅看方向也受向量长度影响。如果重点是“方向是否接近”常常会进一步做归一化。这就是为什么以后看到cosine similarity dot product L2 norm normalization时它们经常一起出现。5. 矩阵不只是“二维数组”先看一个最简单的矩阵A [2 0 0 3]输入x [1 2]计算Ax [2 0 0 3] [1 2] [2 6]最重要的理解不是“把两个表格乘了一遍。”而是矩阵把一个向量变成了另一个向量。这里[1,2]被变换成[2,6]所以矩阵可以看成一个“变换器”。6. 为什么矩阵乘法其实就是很多次内积看A [2 0 0 3] x [1 2]第一行[2,0] · [1,2] 2第二行[0,3] · [1,2] 6所以Ax其实就是矩阵的每一行 ↓ 分别与 x 做一次内积 ↓ 得到输出向量这条关系非常重要。因为它把两个看似不同的概念连起来了向量内积 ↓ 矩阵乘向量7. 再往前一步矩阵乘矩阵例如A 2×3 B 3×2那么AB 2×2核心规则是(m×n)(n×p) ↑ 中间维度必须匹配一个非常实用的例子A [1 2 3 4 5 6] B [7 8 9 10 11 12]结果AB [58 64 139 154]其中58 1×7 2×9 3×11所以矩阵乘法的一个元素本质上还是一行和一列做内积。8. 这件事为什么对 AI 这么重要因为神经网络里经常有y Wx b把它拆开就是x ↓ W 与 x 做大量内积 ↓ 得到 y ↓ 加上 b所以所谓的“线性层”底层就是大量非常规则的乘加计算。真实训练里又不会只输入一个样本。假设Batch 32 Input 128 Output 64把 32 个输入放在一起X 32×128权重W 128×64那么XW (32×128)(128×64) 32×64一次矩阵运算就可以同时处理 32 个样本。这就是 Batch 计算。9.Wxb为什么是神经网络的基本骨架最简单的模型y Wx b其中W → 对输入进行线性组合 b → 提供额外偏移但这里有一个非常重要的地方。如果只有h1 W1x b1 h2 W2h1 b2把它展开h2 W2(W1xb1)b2 W2W1x W2b1 b2最后仍然可以写成h2 Wxb也就是说很多层纯线性变换叠在一起仍然只是一个线性变换。所以神经网络还需要ReLU GELU Sigmoid Tanh这样的非线性。于是模型才可以逐层构建更复杂的函数。10. “矩阵 线性变换”到底是什么意思假设A [2 0 0 3]它会把x 方向放大 2 倍 y 方向放大 3 倍再换一个矩阵R [cosθ -sinθ sinθ cosθ]它可以实现二维旋转。所以矩阵不是一张死表。更准确地说一个矩阵可以表示“输入空间如何被重新映射”。这就是线性变换。11. 这和 AI 的“表示学习”有什么关系第01讲已经讲过表示学习。现在可以把它写得更具体x ↓ W1xb1 ↓ h1 ↓ W2h1b2 ↓ h2 ↓ ...每一层都在做某种参数化变换。因此可以把深度网络先粗略理解成模型不断改变数据的表示方式让后面的计算更容易完成目标任务。这就是为什么Embedding Hidden State Representation Projection这些概念最后都和向量、矩阵有关。12. Embedding 为什么也是一个向量问题假设词表里有10000 个 Token每个 Token 表示成768 维向量那么 Embedding 矩阵可以理解为10000 × 768输入一个 Token ID527模型就可以取E[527]得到对应的 768 维向量。从工程角度看这一步首先很像embeddingtable[token_id];也就是说Embedding Lookup 很大程度上是“根据索引取一行向量”。这也解释了为什么 Embedding 的性能不能简单地只看 FLOPs。13. Attention 为什么又回到了矩阵这就是第二讲与后面 Transformer 的第一条真正连接。对于输入矩阵X模型先计算Q XWq K XWk V XWv然后QKᵀ再经过softmax最后AttentionWeights × V于是整个结构可以压缩成X ↓ Q / K / V 投影 ↓ QKᵀ ↓ Softmax ↓ × V ↓ 输出现在再看QKᵀ已经不会觉得它是一串神秘符号了。假设Q T×D K T×D那么Kᵀ D×T所以QKᵀ (T×D)(D×T) T×T最后得到的是一个Token × Token的分数矩阵。第10讲会把这件事情彻底展开。14. GPU为什么喜欢这种东西矩阵乘法的核心是C[i][j] Σ A[i][k] × B[k][j]你会发现i j k虽然组合很多但计算结构高度规则。于是可以把大量类似的计算并行起来。这正是 GPU 很擅长的工作类型之一。因此可以先建立这条链向量 / 矩阵 ↓ 大量乘加 ↓ 规则、可并行 ↓ GPU 很擅长后面的CUDA GEMM Tensor Core HBM都是在这条基础上继续往下走。15. 但别把“AI 矩阵乘法”当成最终答案这是一个很有用的初学者近似但它不是完整的 AI 系统。真实模型还需要Tokenization Embedding Lookup Normalization Activation Softmax Sampling Memory Access Communication Scheduling真实系统还要面对显存容量 内存带宽 缓存 多 GPU 通信所以更准确的理解是矩阵和张量计算是现代 AI 最重要的数值计算骨架之一但完整 AI 系统远不止矩阵乘法。16. 用纯 Python 把这些东西跑一遍不使用 NumPy直接把底层计算写出来importmathdefdot(a,b):iflen(a)!len(b):raiseValueError(dimension mismatch)returnsum(x*yforx,yinzip(a,b))defmatvec(A,x):ifnotAorlen(A[0])!len(x):raiseValueError(shape mismatch)return[dot(row,x)forrowinA]defmatmul(A,B):ifnotAornotB:raiseValueError(empty matrix)mlen(A)klen(A[0])iflen(B)!k:raiseValueError(shape mismatch)nlen(B[0])C[[0.0]*nfor_inrange(m)]foriinrange(m):forjinrange(n):fortinrange(k):C[i][j]A[i][t]*B[t][j]returnCdefnorm(x):returnmath.sqrt(sum(v*vforvinx))defcosine_similarity(a,b):nanorm(a)nbnorm(b)ifna0ornb0:raiseValueError(zero vector)returndot(a,b)/(na*nb)A[[2.0,0.0],[0.0,3.0],]x[1.0,2.0]print(A x ,matvec(A,x))print(||x|| ,norm(x))B[[1.0,2.0,3.0],[4.0,5.0,6.0],]C[[7.0,8.0],[9.0,10.0],[11.0,12.0],]print(B C )forrowinmatmul(B,C):print(row)print(cosine ,cosine_similarity([1.0,2.0],[2.0,0.0]))最重要的不是这段代码“能跑”。而是看到C[i][j]A[i][t]*B[t][j]就能马上翻译成数学 C AB 程序 三层循环 硬件 大量乘加 数据搬运这三层能对上才算真正开始进入 AI 系统工程的思维方式。17. shape 是写 AI 代码最常用的“第一检查项”很多时候程序报错甚至不是算法错了。只是shape 错了。例如X 32×128 W 128×64所以XW 32×64可以写成[batch × input] × [input × output] [batch × output]再看 AttentionX T×D Wq D×dk Wk D×dk Wv D×dv因此Q T×dk K T×dk V T×dv QKᵀ T×T以后读论文第一件事之一就是看每个张量到底是什么 shape。18. 为什么转置Kᵀ不是“为了形式漂亮”看Q T×D K T×D直接QK维度不匹配。但Kᵀ D×T于是QKᵀ (T×D)(D×T) T×T这样每个位置都表示某个 Query 某个 Key之间的内积得分。所以Kᵀ的意义非常工程化既满足矩阵乘法的 shape 规则也把“每个 Query 与每个 Key 的比较”一次性批量算出来。19. 从矩阵乘法到高性能计算中间还隔着很多层最朴素的 C 版本for(i)for(j)for(k)C[i][j]A[i][k]*B[k][j];数学上没问题。但要做到高性能还要考虑Cache SIMD Threading Blocking / Tiling Register Reuse Memory Bandwidth GPU Kernel Shared Memory Tensor Core这也是为什么“会写矩阵乘法”和“能把矩阵乘法跑得很快”是两个完全不同的工程问题。第17讲会专门解决后一个问题。20. 最容易出现的几个误区误区 1矩阵就是二维数组程序存储层面如此。数学层面更重要的是矩阵可以代表一个线性变换。误区 2矩阵乘法就是对应位置相乘不是。标准乘法是行 × 列误区 3内积就是相似度不完全是。内积还受到向量长度影响。误区 4多个 Linear 就足够构成强大的神经网络不够。纯线性层叠仍然是线性函数。误区 5Embedding 就是一堆手工设计的特征不是。现代模型中的 Embedding 通常是训练得到的向量表示。误区 6GPU 就是“更多 CPU 核心”这太粗了。CPU 与 GPU 在计算组织、并行方式和内存层次上存在明显差异。21. 一张图理解整件事可以把第二讲压缩成下面这张“底层路线图”对象 / 数据 ↓ 数值化 ↓ 向量 ↓ 内积 ↓ 矩阵 ↓ 线性变换 ↓ Wx b ↓ 非线性 ↓ 神经网络 ↓ Embedding / Hidden State ↓ Q / K / V ↓ Attention ↓ Transformer ↓ 大规模矩阵 / 张量计算 ↓ GPU所以很多现代 AI 的高层能力最后都必须落到最底层的数字计算。22. 真正应该记住的 8 句话1. 向量是一组有顺序的数通常共同表示一个对象或状态。 2. 内积就是“乘完再加”但它同时携带方向和长度信息。 3. 矩阵不只是二维数组还可以看成一种线性变换。 4. 矩阵乘向量本质是很多次内积。 5. 矩阵乘矩阵本质仍然是“行 × 列”的批量内积。 6. 神经网络最基本的计算骨架之一就是 Wx b。 7. Attention 里的 Q、K、V 和 QKᵀ底层仍然是向量与矩阵运算。 8. 学 AI 数学最好一直保持三层视角数学 → 代码 → 硬件。23. 一个值得做的小练习不要直接打开 PyTorch。先自己完成1. dot(a,b) 2. matmul(A,B) 3. linear(x,W,b) 4. cosine_similarity(a,b)然后回答为什么 (32×128)(128×64) 32×64再回答为什么 QKᵀ 的结果是 T×T如果这两个问题已经可以不查资料直接解释第02讲的核心已经掌握。24. 最后回到最初的问题为什么 AI 一直离不开向量 矩阵 张量因为模型必须把现实世界的信息转换成可以计算的数值表示。而一旦进入数值空间很多模型操作最终都会变成加法 乘法 内积 矩阵乘法 非线性变换其中矩阵又提供了一个非常重要的能力用一套参数把一个输入空间系统地映射到另一个表示空间。这就是线性变换再把大量这样的变换与非线性组合起来就有了神经网络 ↓ Attention ↓ Transformer ↓ LLM而在更底层这些数值操作 ↓ CPU / GPU ↓ 内存与缓存 ↓ 分布式通信所以学习 AI如果只从“这个模型叫什么”开始很容易变成背名词。从“它到底拿什么数据算什么”开始很多复杂结构反而会逐渐变得统一。下一讲第03讲概率、信息论与损失函数模型到底在预测什么下一讲会继续回答模型为什么输出“概率” Cross-Entropy 到底在惩罚什么 为什么 Language Model 最常用的目标是最大化真实 Token 的概率理解了这一讲才真正能把Prediction → Probability → Loss → Training接起来。
返回列表