MiniLM 是什么?
MiniLM 是微软研究院开发的一种轻量级的语言模型,旨在以较小的参数量和计算成本实现与大型语言模型(如 BERT)相当的性能。它是基于 Transformer 架构的预训练模型,通过深度自注意力蒸馏(Deep Self-Attention Distillation)等技术进行压缩和优化,使其能够在资源受限的环境下高效运行。
主要特点:
- 轻量级:MiniLM 显著减少了模型的参数量和计算成本,使其能够在移动设备、嵌入式系统等资源受限的环境下运行。
- 高性能:尽管参数量大幅减少,MiniLM 仍然保持了较高的性能,能够在多种自然语言处理(NLP)任务中取得优异的表现。
- 通用性:MiniLM 是一种通用的语言模型,适用于各种 NLP 任务,如文本分类、命名实体识别、问答系统、语言生成等。
- 灵活性:MiniLM 的学生模型(即压缩后的模型)无需与教师模型(即原始的大型模型)在层数或隐藏维度上严格匹配,实现了更高的灵活性。
all-MiniLM-L6-v2 是什么样的模型?
all-MiniLM-L6-v2 是一个小型语言模型,属于 MiniLM 系列,它通过知识蒸馏技术从更大的模型中压缩而来,旨在保持较高性能的同时减少计算资源需求。
all-MiniLM-L6-v2 是一个高效的轻量级语言模型,适合资源有限的环境,能够胜任多种 NLP 任务。
主要特点
- 模型结构:
- 层数:6 层 Transformer。
- 参数量:约 22M,属于轻量级模型。
- 训练方法:
- 知识蒸馏:从更大的模型(如 BERT 或 RoBERTa)中提取知识,保留大部分性能。
- 任务:支持多种 NLP 任务,如文本分类、语义相似度计算等。
- 性能:
- 在多个基准测试中表现良好,尤其在语义相似度和文本分类任务上接近大模型。
- 适合资源有限的环境。
- 应用场景:
- 语义搜索:用于计算文本相似度。
- 文本分类:如情感分析、垃圾邮件检测。
- 问答系统:用于理解问题和检索答案。
- 嵌入式系统:适合部署在计算资源有限的设备上。
优点
- 高效:计算速度快,适合实时应用。
- 轻量:参数量少,易于部署。
- 多功能:适用于多种 NLP 任务。
缺点
- 性能限制:在处理复杂任务时可能不如大模型。
- 知识局限:依赖蒸馏过程,可能丢失部分知识。
all-MiniLM-L6-v2 是基于微软研发的 MiniLM 架构进行微调或进一步开发的句子嵌入模型,而 sentence-transformers 是一个集成了多种预训练句子嵌入模型的库,包括 all-MiniLM-L6-v2。
sentence-transformers 是一个基于 PyTorch 的 Python 库,专门用于处理和生成句子嵌入(sentence embeddings)。它提供了多种预训练的句子嵌入模型,这些模型能够将句子或文本片段转换为固定长度的向量表示,从而方便地进行向量分析、处理和比较.
在 Hugging Face 或者 ModelScope 可以找到属于 sentence-transformers 的 all-MiniLM-L6-v2 模型。
使用示例
通过 Hugging Face 的 transformers
库可以加载和使用该模型:
from transformers import AutoModel, AutoTokenizer
model_name = "sentence-transformers/all-MiniLM-L6-v2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
inputs = tokenizer("Hello, world!", return_tensors="pt")
outputs = model(**inputs)
Xenova/all-MiniLM-L6-v2 模型又是什么?
Xenova/all-MiniLM-L6-v2 是基于 all-MiniLM-L6-v2 的一个变体,由 Xenova 团队优化和发布。它继承了原版的高效和轻量特性,并针对特定任务或场景进行了改进。
主要特点
- 优化点:
- 性能提升:在特定任务上表现更优。
- 兼容性:支持多种 NLP 任务,如文本分类、语义相似度计算等。
在 Hugging Face 或者 ModelScope 可以找到属于Xenova 的 all-MiniLM-L6-v2 模型。
使用示例
通过 Hugging Face 的 transformers
库可以轻松加载和使用该模型:
from transformers import AutoModel, AutoTokenizer
model_name = "Xenova/all-MiniLM-L6-v2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
inputs = tokenizer("Hello, world!", return_tensors="pt")
outputs = model(**inputs)
all-MiniLM-L6-v2 实战
不管是all-MiniLM-L6-v2 的那种变种,效果上大同小异。接下来实际的来调用这种模型。
上面有介绍Hugging Face的使用方式,但是Hugging Face可能无法访问,接下来使用国内的ModelScope(魔搭)来下载和使用模型。
关于 ModelScope的详细介绍,可以参考:
AI模型平台之——ModelScope(魔搭)
这里使用Python调用模型
具体步骤:
- 安装ModelScope
2. 配置环境变量: MODELSCOPE_CACHE
这里配置为: D:\ai\modelscope\cache
默认是下载到C盘个人账号路径的 C:\Users\Administrator.cache\modelscope
(这里考虑C盘的空间不够,将模型相关的文件下载到D盘)
- 使用ModelScope的库下载模型
from modelscope import AutoModel, AutoTokenizer
# 指定模型名称
model_name = "sentence-transformers/all-MiniLM-L6-v2"
# 加载分词器和模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
运行Python后就开始下载模型文件,过程如下图:
上面提到 all-MiniLM-L6-v2 有一个作用是可以比较文本的相似度, 这里给出一个完整的示例:
from modelscope import AutoModel, AutoTokenizer
import torch
import numpy as np
# 指定模型名称
model_name = "sentence-transformers/all-MiniLM-L6-v2"
# 加载分词器和模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
sentences = ["Hello, world!", "Hi there!"]
# 编码文本
inputs = tokenizer(sentences, padding=True, truncation=True, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
# 提取句嵌入(均值池化)
embeddings = outputs.last_hidden_state.mean(dim=1).numpy()
# 计算余弦相似度
similarity = np.dot(embeddings[0], embeddings[1]) / (
np.linalg.norm(embeddings[0]) * np.linalg.norm(embeddings[1])
)
print(f"相似度: {similarity:.4f}") # 示例输出: 相似度: 0.5033
在VS Code运行结果的画面如下:
单独下载模型: 也可以使用命令行单独下载模型文件, 比如下载 Xenova/all-MiniLM-L6-v2。
modelscope download --model Xenova/all-MiniLM-L6-v2
下载后的模型文件不大,整个目录 174M,和动则几个G乃至几十个G 的模型来说, 的确是轻量级。
模型及关系的总结
- MiniLM 是微软研发的一种轻量级的语言模型
- all-MiniLM-L6-v2 是基于 MiniLM 架构进行微调,是 sentence-transformers 的开发者或社区基于 MiniLM 架构进行微调或进一步开发的。
sentence-transformers/all-MiniLM-L6-v2 用于Python 语言。
- Xenova/all-MiniLM-L6-v2 是基于 all-MiniLM-L6-v2 的一个变体,由 Xenova 团队优化和发布。
Xenova/all-MiniLM-L6-v2 用于NodeJS语言。
本篇为什么要介绍all-MiniLM-L6-v2 呢?
最后,给出笔者这一篇介绍 all-MiniLM-L6-v2的目的: 因为知名的AI编码工具Continue(Copilot的平替版)就是用了 all-MiniLM-L6-v2 用来搜索。