Memory Bank
了解深度学习中的内存库 (Memory Bank)。探索内存库如何为对比学习、目标跟踪和视频理解存储嵌入。
内存库是一种用于机器学习算法的数据结构,用于存储和引用过去迭代或已处理样本的信息,从而有效地将模型的内存容量与其当前的计算约束解耦。在 深度学习 (DL) 的背景下,内存库通常充当 嵌入 (embeddings) 或特征向量的存储库。这允许模型将当前的输入与大量的历史输入进行比较,而无需同时重新处理或将所有这些数据保留在活动的随机存取存储器 (RAM) 中。通过维护一个表示缓冲区,模型可以从更广泛的上下文中学习,从而在需要长期一致性或与大型数据集进行比较的任务中提高性能。
Link to this section内存库的机制#
内存库的主要功能是将可用信息扩展到当前 批大小 (batch size) 之外。在训练过程中,随着数据流经神经网络,产生的特征表示会被存入库中。如果库达到其最大容量,最旧的特征通常会被移除以腾出空间给新的特征,这个过程称为先进先出 (FIFO) 队列。
这种机制之所以特别重要,是因为 GPU 内存是有限的。如果没有内存库,将一张图像与一百万张其他图像进行比较,将需要一个无法在标准硬件上运行的批大小。有了内存库,模型可以存储这百万张图像的轻量级向量,并使用 相似度搜索 技术(如点积或余弦相似度)高效地引用它们。
Link to this section实际应用#
内存库已成为几种高级 计算机视觉 (CV) 和自然语言工作流程的基石:
- 对比学习(自监督学习): 最著名的应用之一是在 对比学习 中,特别是在诸如动量对比 (MoCo) 等算法中。在这里,目标是教会模型将特定的图像与许多“负面”样本(不同的图像)区分开来。内存库存储了数千个负面样本的表示,允许模型在不需要标记 训练数据 的情况下学习稳健的特征。对于深层的技术细节,研究人员通常会参考推广了这种方法的 MoCo 论文。
- 长期目标跟踪: 在视频分析中,物体(如汽车或人)可能会被障碍物暂时遮挡。标准跟踪器可能会在此遮挡期间丢失物体的身份 (ID)。高级跟踪器使用内存库来存储过去检测到的物体的视觉特征。当物体再次出现时,系统会查询内存库以重新建立正确的 ID。利用 Ultralytics YOLO26 进行 目标跟踪 的用户可以受益于在帧之间保持身份一致性的类似内部逻辑。
- 视频理解: 为了识别跨越几秒或几分钟的动作,模型需要时间上下文。内存库充当过去帧或片段的缓冲区,使网络能够在处理视频结尾时“记住”视频开始时发生了什么。这对于准确的 动作识别 至关重要。
Link to this section区分相关概念#
将内存库与词汇表中发现的其他存储和处理概念区分开来是有帮助的:
- 内存库 vs. 向量数据库: 两者都存储用于检索的嵌入。然而,内存库通常是一个瞬时的、内存内的结构,在单个模型会话的 训练 或 主动推理 期间动态使用。向量数据库(如 RAG 中使用的数据库)是一种持久、可扩展的存储解决方案,旨在长期存在并服务于多种应用。
- 内存库 vs. 上下文窗口: 上下文窗口(在 Transformer 中很常见)定义了模型一次处理的最大输入序列长度(例如 32k 个 token)。内存库是一个外部缓冲区,它存储活动处理窗口 之外 的压缩表示,从理论上讲,这允许实现无限的内存深度,正如 Transformer-XL 等架构中所见。
- 内存库 vs. 批大小: 批大小决定了为了梯度更新并行处理多少个样本。内存库增加了模型为了比较目的可以“看到”的有效样本数量,而不会增加前向和后向传递的计算成本。
Link to this section代码示例:模拟特征库#
以下 Python 代码片段展示了使用 torch 实现先进先出 (FIFO) 内存库的概念。这种结构通常用于在自定义训练循环或复杂的推理任务期间维护特征向量的滚动历史记录。
import torch
# Initialize a memory bank (Capacity: 100 features, Vector Dim: 128)
# In a real scenario, these would be embeddings from a model like YOLO26
memory_bank = torch.randn(100, 128)
# Simulate receiving a new batch of features (e.g., from the current image batch)
new_features = torch.randn(10, 128)
# Update the bank: Enqueue new features, Dequeue the oldest ones
# This maintains a fixed size while keeping the memory 'fresh'
memory_bank = torch.cat([memory_bank[10:], new_features], dim=0)
print(f"Updated Memory Bank Shape: {memory_bank.shape}")
# Output: Updated Memory Bank Shape: torch.Size([100, 128])Link to this section挑战与注意事项#
虽然内存库功能强大,但它带来了“表示漂移”的挑战。由于编码器网络在每一步训练中都会发生微小变化,因此 100 步前存储在库中的特征可能已“过时”或与当前模型状态不一致。使用动量编码器(模型的缓慢更新平均值)等技术有助于缓解这个问题。
对于希望管理利用这些高级技术的数据集版本和模型工件的团队,Ultralytics Platform 提供了一个集中的中心来高效组织数据、跟踪实验并部署模型。管理特征存储和检索的复杂性对于从实验性的 人工智能 (AI) 过渡到稳健的生产系统至关重要。






