模型简介
模型特点
模型能力
使用案例
🚀 lodestone-base-4096-v1
这是来自 Hum 的一款全新 sentence-transformers 模型,它能将长句子和段落映射到 768 维的密集向量空间,可用于聚类或语义搜索等任务,有助于提升人类知识的可访问性和互联性。
🚀 快速开始
若你已安装 sentence-transformers,使用此模型会相对简单。 在发布时,sentence-transformers 不支持该模型使用的 flash-attention 所需的远程代码。为方便使用,提供了一个允许远程代码执行的 sentence-transformers 仓库分支。可使用以下命令进行安装:
pip install git+https://github.com/Hum-Works/sentence-transformers.git
pip install einops
然后,你可以按照以下方式使用该模型:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('Hum-Works/lodestone-base-4096-v1', trust_remote_code=True, revision='v1.0.0')
sentences = ["This is an example sentence", "Each sentence is converted"]
embeddings = model.encode(sentences)
print(embeddings)
注意:如果已安装,模型将使用 openAI/Triton 实现的 FlashAttention。这比后备的 torch 实现性能更高。某些平台和 GPU 可能不受 Triton 支持,最新的兼容性信息可在 Triton 的 GitHub 页面 上找到。
✨ 主要特性
- 长序列处理:该模型能够处理长达 4096 个词块的输入序列,这得益于对 ALiBi 位置注意力外推的利用,可实现初始训练长度 2 倍的序列长度。
- 性能出色:结合了成熟的微调实践和变压器架构元素的新进展,在标准文本嵌入评估基准上能取得可比的性能指标。
- 尺寸适中:模型尺寸较小,可在 GPU 或 CPU 上运行。
📦 安装指南
pip install git+https://github.com/Hum-Works/sentence-transformers.git
pip install einops
💻 使用示例
基础用法
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('Hum-Works/lodestone-base-4096-v1', trust_remote_code=True, revision='v1.0.0')
sentences = ["This is an example sentence", "Each sentence is converted"]
embeddings = model.encode(sentences)
print(embeddings)
📚 详细文档
摘要
为了推进 Hum 提高人类知识可访问性和互联性的总体使命,该模型作为一个项目的一部分而开发。此项目旨在通过利用变压器模型设计中的最新架构进展,如融入 FlashAttention、线性偏置注意力(ALiBi)和门控线性单元(GLU),来增加句子嵌入模型的最大输入序列长度。这些修改和增强由 MosaicML 团队实现,他们设计并构建了预训练的 mosaic-bert-base-seqlen-2048
模型,更多关于其开发和测试规范的详细信息可在模型卡片上找到。
虽然此项目中遵循的微调过程与最初创建许多流行句子变压器模型(如 all-mpnet-base-v2、all-distilroberta-v1 和 all-MiniLM-L6-v2)的 Flax-sentence-embeddings 团队的过程大致相似,但我们的方法包括用于数据加载、批量采样和模型检查点的新颖技术,旨在提高内存分配和数据存储方面的训练效率。
通过将这些成熟且经过验证的微调实践与变压器架构元素的新进展相结合,我们的 lodestone-base-4096-v1
模型能够在标准文本嵌入评估基准上取得可比的性能指标,同时支持更长、更强大的 4096 输入序列长度,并且保持较小、更易于管理的尺寸,能够在 GPU 或 CPU 上运行。
背景
该项目旨在使用自监督对比学习目标,在非常大的句子级数据集上训练句子嵌入模型。我们使用了预训练的 mosaic-bert-base-seqlen-2048
模型,并在近 15 亿个句子对的数据集上对其进行了微调。我们采用对比学习目标:给定一对句子中的一个句子,模型应预测在一组随机采样的其他句子中,哪个实际上是与它在数据集中配对的句子。
预期用途
我们的模型旨在用作长句子和段落编码器。给定输入文本,它输出包含语义信息的向量。句子向量可用于信息检索、聚类或句子相似度任务。
训练过程
预训练
我们使用预训练的 mosaic-bert-base-seqlen-2048
。有关预训练过程的更多详细信息,请参考模型卡片。
微调
我们使用对比目标对模型进行微调。形式上,我们计算批次中每个可能的句子对的点积。然后通过与真实对进行比较来应用交叉熵损失。
超参数
我们在配备 1 个 NVIDIA A10G Tensor Core GPU 的 ml.g5.4xlarge EC2 实例上训练模型。我们使用 16 的批量大小,在 140 万步内训练模型。我们使用 500 的学习率预热。训练期间的序列长度限制为 2048 个标记。我们使用 AdamW 优化器,学习率为 2e-5,权重衰减为 0.01(即 SentenceTransformer.fit() 的默认参数值)。完整的训练脚本可在当前仓库中的 Training.py
文件中找到。
模型架构
通过融入 FlashAttention、线性偏置注意力(ALiBi) 和门控线性单元(GLU),该模型能够处理 4096 的输入序列,是大多数可比句子嵌入模型支持长度的 8 倍。 模型使用最大 2048 的序列长度进行训练,但最终模型的最大序列长度为 4096。这是通过利用 ALiBi 的位置注意力外推实现的,该方法已被证明可以允许达到初始训练长度 2 倍的序列长度。
完整模型架构
SentenceTransformer(
(0): Transformer({'max_seq_length': 4096, 'do_lower_case': False}) with Transformer model: BertModel
(1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False})
(2): Normalize()
)
训练数据
我们使用多个数据集的组合来微调模型。句子对的总数接近 15 亿个句子。我们根据每个数据集对整个数据集的相对贡献,按加权概率对其进行采样。
数据集的细分如下,整个数据集可通过位于此仓库中的 Dataloading.ipynb
公开访问和上传。
数据集 | 论文 | 训练元组数量 |
---|---|---|
Reddit comments (2015 - 2018) | paper | 726,484,430 |
S2ORC Citation pairs (Abstracts) | paper | 252,102,397 |
Reddit posts (Title, Body) pairs | - | 127,445,911 |
Amazon reviews (2018) (Title, Review) pairs | - | 87,877,725 |
WikiAnswers Duplicate question pairs | paper | 77,427,422 |
PAQ (Question, Answer) pairs | paper | 64,371,441 |
S2ORC Citation pairs (Titles) | paper | 52,603,982 |
S2ORC (Title, Abstract) | paper | 41,769,185 |
Stack Exchange (Title, Body) pairs | - | 25,368,423 |
MS MARCO triplets | paper | 9,144,553 |
Stack Exchange (Title, Most Upvoted Answer) pairs | - | 4,784,250 |
Stack Exchange (Title+Body, Most Upvoted Answer) pairs | - | 4,551,660 |
GOOAQ: Open Question Answering with Diverse Answer Types | paper | 3,012,496 |
Amazon QA | - | 2,507,114 |
Code Search | - | 1,375,067 |
Yahoo Answers (Title, Answer) | paper | 1,198,260 |
[AG News]((Title, Description) pairs of news articles from the AG News dataset) | - | 1,157,745 |
COCO Image captions | paper | 828,395 |
SPECTER citation triplets | paper | 684,100 |
Yahoo Answers (Question, Answer) | paper | 681,164 |
Yahoo Answers (Title, Question) | paper | 659,896 |
CC News (Title, article) pairs | - | 614,664 |
NPR (Title, Body) pairs | - | 594,384 |
SearchQA | paper | 582,261 |
MS Marco (Query, Answer Passage) pairs | paper | 532,751 |
Stack Exchange (Title, Body) pairs | - | 364,000 |
Eli5 | paper | 325,475 |
Flickr 30k | paper | 317,695 |
CNN & DailyMail (highlight sentences, article) pairs | - | 311,971 |
Stack Exchange Duplicate questions (titles) | - | 304,524 |
AllNLI (SNLI and MultiNLI | paper SNLI, paper MultiNLI | 277,230 |
Stack Exchange Duplicate questions (bodies) | - | 250,518 |
Stack Exchange Duplicate questions (titles+bodies) | - | 250,459 |
XSUM (Summary, News Article) pairs | - | 226,711 |
Stack Exchange (Title+Body, Most Upvoted Answer, Most Downvoted Answer) triplets | - | 216,454 |
Sentence Compression | paper | 180,000 |
FEVER training data | - | 139,051 |
Wikihow | paper | 128,542 |
SearchQA (Question, Top-Snippet) | paper | 117,384 |
Altlex | paper | 112,696 |
Quora Question Duplicates | - | 103,663 |
Quora Question Triplets | - | 103,663 |
Simple Wikipedia | paper | 102,225 |
Natural Questions (NQ) | paper | 100,231 |
SQuAD2.0 | paper | 87,599 |
TriviaQA | - | 73,346 |
Total | 1,492,453,113 |
复现
可以通过遵循此仓库中的 Replication.txt
文件中概述的步骤来复现此模型的整个微调过程。本文档解释了如何修改 sentence-transformers 库、配置预训练的 mosaic-bert-base-seqlen-2048
模型、加载所有训练数据并执行训练脚本。
局限性
由于技术限制(例如有限的 GPU 内存容量),此模型使用较小的批量大小 16 进行训练,这使得训练过程中的每一步所获得的信息不如在更高性能系统上充分。这种不理想的超参数值通常会使模型更有可能陷入局部最小值,并且参数配置需要更长时间才能收敛到最优值。为了抵消这种潜在风险,我们比许多同类模型训练了更多的步数,以确保有更大的机会实现良好的性能,但如果进行进一步的微调,这仍是一个可以改进的领域。
还值得注意的是,虽然此模型能够处理长达 4096 个词块的更长输入序列,但所使用的训练数据集由句子和段落对以及三元组组成,这些数据不一定能达到最大序列长度。由于数据并非专门针对这种较大的输入大小进行定制,可能需要进一步的微调来确保对这种长度的较长文本进行高度准确的嵌入。
最后,正如在 https://huggingface.co/datasets/sentence-transformers/reddit-title-body 上所述,关于 Reddit 帖子数据的额外提醒和警告是,人们应该“注意,此数据集未对偏见、仇恨言论、垃圾邮件、种族歧视等进行过滤。它如实描绘了在 Reddit 上发布的内容。”因此,虽然我们认为由于其在近 15 亿个句子对的整个数据集中的记录相对较少,并且此模型是为生成语义嵌入而不是生成文本输出而训练的,这不会在模型性能中引发任何病态行为,但始终重要的是要意识到偏见的潜在影响。
🔧 技术细节
模型架构改进
通过融入 FlashAttention、Attention with Linear Biases (ALiBi) 和 Gated Linear Units (GLU) 等先进技术,该模型能够处理长达 4096 的输入序列,是大多数可比句子嵌入模型支持长度的 8 倍。其中,ALiBi 的位置注意力外推技术使得模型在训练时使用最大 2048 的序列长度,最终却能支持 4096 的最大序列长度。
训练优化
在训练过程中,采用了自监督对比学习目标,并结合了新颖的数据加载、批量采样和模型检查点技术,提高了内存分配和数据存储方面的训练效率。
📄 许可证
本模型采用 Apache-2.0 许可证。







