NumPy基础
# NumPy 基础:大模型中的张量操作
>
在大模型(LLMs)中,所有数据,包括词嵌入、模型权重、偏置等,都以多维数组(即 **张量**)的形式存在和处理。NumPy 是 Python 中处理这些数组的基础库。
---
##
1. `np.array()`
: 从 Python 列表创建数组
这是将原始数据(如文本转换后的ID序列对应的嵌入向量)加载到模型处理流程的起点。
-
**- 功能
**: 从 Python 列表或元组创建 NumPy 数组(张量)。
- **- 大模型应用
**: 加载词嵌入、输入序列等。
```python
import numpy as np
# 词嵌入向量 (单个词)
word_embedding = np.array([0.1, -0.5, 0.3, 0.9])
print(f"词嵌入: {word_embedding}")
# 一个批次的句子表示 (假设 batch_size=2, seq_len=3, embedding_dim=2)
batch_data = np.array([
[[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]], # 第一个句子
[[0.7, 0.8], [0.9, 1.0], [1.1, 1.2]] # 第二个句子
])
print(f"批次数据形状: {batch_data.shape}")
形状 (Shape) 解释: (2, 3, 2)
batch_size = 2
: 一个批次内有两个序列。
seq_len = 3
: 每个序列包含 3 个 Token。
embedding_dim = 2
: 每个 Token 使用一个长度为 2 的向量表示。
2. np.zeros()
: 创建全零数组
- 功能: 创建指定形状和数据类型的全零数组。
- 大模型应用: 初始化模型的偏置(bias),或创建注意力掩码 (Attention Mask)。
import numpy as np
# 创建一个形状为 (2, 2, 3) 的整数类型全零数组
zeros_array = np.zeros((2, 2, 3), dtype=int)
print(zeros_array)
输出:
[[[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]]]
3. np.ones()
: 创建全一数组
- 功能: 创建指定形状和数据类型的全一数组。
- 大模型应用: 类似于
np.zeros
,可用于创建特定类型的掩码或进行某些数学初始化。
4. np.arange()
: 创建等差序列
- 功能: 在给定间隔内生成均匀间隔的值(不包含
stop
值)。
- 大模型应用: 生成序列索引,常用于计算位置编码 (Positional Encoding)。
import numpy as np
# 生成从 0 开始,到 10 结束(不含10),步长为 2 的序列
position_indices = np.arange(0, 10, 2)
print(position_indices) # 输出: [0 2 4 6 8]
核心思想: 在 Transformer 中,最终输入向量 = 词嵌入向量 + 位置编码向量
。这个相加后的向量既包含了词的语义信息,也包含了词的位置信息。
5. np.linspace()
: 创建等间隔序列
- 功能: 在给定间隔内生成指定数量的均匀间隔值(默认包含
stop
值)。
import numpy as np
# 在 0 到 10 之间生成 5 个等间隔的点
data = np.linspace(0, 10, 5)
print(data) # 输出: [ 0. 2.5 5. 7.5 10. ]
6. np.random.rand()
: [0, 1) 均匀分布随机数
- 功能: 创建指定形状的、在
[0, 1)
区间内均匀分布的随机数数组。
- 大模型应用: 模型权重的随机初始化,这是启动神经网络训练的第一步,旨在打破对称性。
import numpy as np
# 创建一个 2x5 的随机权重矩阵
weights = np.random.rand(2, 5)
print(weights)
7. np.random.randn()
: 标准正态分布随机数
- 功能: 创建指定形状的、符合标准正态(高斯)分布的随机数数组(均值为0,方差为1)。
- 大模型应用: 更常用的权重初始化方法(如 Xavier/He 初始化)。
import numpy as np
# 创建一个 2x5 的符合标准正态分布的权重矩阵
weights = np.random.randn(2, 5)
print(weights)
8. 数组属性 (Array Attributes)
了解张量的基本属性是调试和构建模型的基础。
array.ndim
: 数组的维度数量。
array.shape
: 数组的形状(一个表示各维度大小的元组)。
array.size
: 数组中元素的总数。
array.dtype
: 数组元素的数据类型 (如 float32, int64)。
import numpy as np
# 假设一个批次数据: batch_size=2, seq_len=3, feature_dim=4
data = np.random.rand(2, 3, 4)
print(f"维度数量 (ndim): {data.ndim}")
print(f"形状 (shape): {data.shape}")
print(f"元素总数 (size): {data.size}")
print(f"数据类型 (dtype): {data.dtype}")
输出示例:
维度数量 (ndim): 3
形状 (shape): (2, 3, 4)
元素总数 (size): 24
数据类型 (dtype): float64
9. 数组索引与切片 (Indexing & Slicing)
从大张量中精确提取所需数据是模型中频繁进行的操作。
- 基本索引:
array[i]
, array[i, j]
, array[i, j, k]
- 切片:
array[start:stop:step]
import numpy as np
batch_data = np.arange(24).reshape((2, 3, 4))
print("--- 原始数据 ---")
print(batch_data)
# 获取第一个样本的所有数据 (batch_data[0])
first_sample = batch_data[0]
print("\n--- 第一个样本 ---")
print(first_sample)
# 获取第一个样本的、第二个时间步的向量 (batch_data[0, 1])
second_timestep = batch_data[0, 1]
print("\n--- 第一个样本的第二个时间步 ---")
print(second_timestep)
# 获取所有样本的、所有时间步的、最后一个特征 (batch_data[:, :, -1])
last_feature = batch_data[:, :, -1]
print("\n--- 所有样本的最后一个特征 ---")
print(last_feature)
10. 数组变形 (Reshaping)
array.reshape(new_shape)
: 改变数组形状而不改变数据。在不同层之间传递数据时,常用于匹配下一层的输入要求。
array.T
或 np.transpose(array)
: 转置数组。在进行矩阵乘法或注意力计算时是常用操作。
import numpy as np
# Reshape
data = np.arange(6)
reshaped_data = data.reshape((2, 3))
print("--- 重塑后数据 ---\n", reshaped_data)
# Transpose
matrix = np.array([[1, 2], [3, 4]])
print("\n--- 转置前 ---\n", matrix)
print("\n--- 转置后 ---\n", matrix.T)
11. 数学与聚合运算
- 元素级运算:
+
, -
, *
, /
, **
(幂), np.sqrt()
, np.exp()
, np.log()
- 线性代数:
np.dot(a, b)
或 a @ b
(矩阵乘法), np.linalg.norm()
(范数)
- 聚合函数:
np.sum()
, np.mean()
, np.max()
, np.argmax()
(最大值索引) 等。
import numpy as np
# 假设是两个样本在3个类别上的logits
scores = np.array([[0.1, 0.8, 0.1], [0.5, 0.2, 0.3]])
# 沿类别轴(axis=1)计算最大值,用于后续Softmax的数值稳定
max_scores = np.max(scores, axis=1, keepdims=True)
print(max_scores)
axis
参数解释:
axis
指定了函数操作的方向。当沿着某个 axis
操作时,该 axis
的维度会在结果中“消失”(除非 keepdims=True
)。
axis=0
: 沿第一个维度操作(对2D矩阵是“按列”操作)。
axis=1
: 沿第二个维度操作(对2D矩阵是“按行”操作)。
axis=None
(默认): 对所有元素进行操作。
12. 广播机制 (Broadcasting)
广播是 NumPy 最强大的特性之一,它允许对不同形状的数组进行算术运算,极大地简化了代码。
- 大模型应用: 将一个偏置(bias)向量加到一批次数据的所有样本上。
import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6]])
vector = np.array([10, 20, 30]) # 偏置向量
# vector 会被“广播”或“复制”以匹配 matrix 的每一行,然后相加
result = matrix + vector
print("--- 广播加法 ---\n", result)
结果:
[[11 22 33]
[14 25 36]]