Skip to main content

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.Tnp.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]]