使用开放大型语言模型从模型卡中提取见解
模型卡是文档化机器学习模型的重要工具。模型卡存储在 Hugging Face Hub 的
README.md
文件中。
Hugging Face Hub 上目前公开共享着超过 400,000 个模型。我们如何更好地了解这些模型卡中共享的信息?
我们将看到从模型卡 README 中出现的一些概念
人们在他们的模型 README.md 中谈论什么?
各种组织、团体和个人在 Hugging Face Hub 上开发模型;它们涵盖了广泛的任务,并考虑了各种各样的受众。因此,模型的 README 也多种多样。一些 README 将遵循模型卡模板,而另一些则将使用非常不同的格式,并侧重于描述模型的非常不同的属性。我们如何更好地了解人们在模型卡中讨论的内容?
我们可以从模型 README 中提取元数据吗?
我想更好地了解人们在 README 中谈论了哪些信息。他们主要谈论训练吗?他们多久提及一次数据集?他们详细讨论评估吗?部分原因是我纯粹出于好奇,但我也对了解模型卡中是否经常出现可以潜在地提取到更结构化的模型元数据中的功能感兴趣。
作为此类工作的一个例子,最近,Hub 添加了一个用于 base_model
的元数据字段。此元数据使得更容易了解用作微调新模型起点的模型。例如,您可以使用此筛选器找到从 mistralai/Mistral-7B-v0.1 微调的模型 https://huggingface.co/models?other=base_model:mistralai/Mistral-7B-v0.1。但是,为了实现这一点,base_model
字段必须存储为元数据。在通过 Librarian-Bots 将此 base_model
筛选功能添加到 Hub 的过程中,我使用模型 README.md
中可用的信息进行了一系列自动化拉取请求,添加了此元数据。
添加元数据到模型的拉取请求示例
潜在地,其他此类数据也可以从模型卡中提取出来,并以更结构化的方式呈现,从而使得在 Hub 上筛选和搜索模型更容易。
用大型语言模型进行标注?
作为 Hugging Face 机器学习图书管理员工作的一部分,我创建了一个来自 Hugging Face Hub 的模型卡数据集。该数据集每天更新。该数据集目前有超过 400,000 行。这使得手动分析这些数据变得困难。
NuMind 最近发表的博客文章讨论了他们创建命名实体识别基础模型的方法。作为这项工作的一部分,他们使用 LLM 在一个来自 Pile 的大型数据集中标注概念(他们用于实体的术语),从而创建了一个大型数据集。他们通过开放式提示模型进行标注,即不是提示模型标注特定类型的实体;他们提示模型标注“输入文本中尽可能多的实体、概念和想法”。
虽然我们有时希望 LLM 帮助标注特定类型的实体,但这种开放式方法允许我们使用 LLM 帮助我们探索数据集。
在 NuMind 的工作中,他们使用了 GPT-4。我希望改用一个开放的 LLM。经过一番探索,我选择了 teknium/OpenHermes-2.5-Mistral-7B
OpenHermes 2.5 Mistral 7B 是一款最先进的 Mistral 微调模型,是 OpenHermes 2 模型的延续,在额外的代码数据集上进行了训练。
我发现该模型对 NuMind 使用的原始提示的改编版本响应良好,并且由于该模型是一个 70 亿参数模型,与其他可用于此任务的更大模型相比,其运行成本在财务和环境影响方面都略高。
我将模型托管在 Inference Endpoints 上,并使用 huggingface_hub
Python 库运行推理。获取标注的代码大致如下:
def get_annotations(input):
message = f"""
The goal is to create a dataset for entity recognition.
Label as many entities, concepts, and ideas as possible in the input text.
Invent new entity types that may not exist in traditional NER Tasks such as more abstract concepts and ideas.
Make sure the entity concept is not part of speech but something more meaningful.
Avoid finding meaningless entities.
Output format (separate entities with new lines, everything, including description, and entity concept is written in English): entity from the text -|- entity concept -|- description of entity group/concept.
Example:
Input: "Fine-tuned XLSR-53 large model for speech recognition in English"
Output:
XLSR-53 -|- model -|- a large pre-trained language model specifically designed for speech recognition in English.
English -|- language -|- the language of the text and the model's target language.
Fine-tuned -|- model modification -|- the process of adapting the pre-trained model to a specific task, in this case, speech recognition.
Input: "{input}"
Output:"""
messages = [
{
"role": "system",
"content": "You are Hermes 2. A system designed to annotate textual data",
},
{"role": "user", "content": message},
]
gen_input = tokenizer.apply_chat_template(messages, tokenize=False)
return client.text_generation(
gen_input,
max_new_tokens=450,
do_sample=True,
temperature=0.7,
top_k=50,
top_p=0.95,
)
以下是我得到的一些输出示例:
Input: Fine-tuned XLSR-53 large model for speech recognition in English
Output:
XLSR-53 -|- model -|- a large pre-trained language model specifically designed for speech recognition in English.
English -|- language -|- the language of the text and the model's target language.
Fine-tuned -|- model modification -|- the process of adapting the pre-trained model to a specific task, in this case, speech recognition.
如您所见,该模型在标记概念方面做得相当不错。让我们深入研究一下结果。
我们在模型卡中发现了哪些概念?
我们通过这种方法生成的数据集包含原始实体/概念的标注,即模型标注的词语,一个“类别”,即该概念的类型(由模型标注),以及由 LLM 生成的关于该类别的描述。
首先,这里有一些关于我们数据集的高级信息
- 总共 146,800 个标注,即概念
- 46,240 个独特主题
- 16,581 个独特类别
我们可以看到独特主题甚至独特主题和类别的数量。虽然如果我们有一个固定的标签集要标注,这可能不理想,但对于这种更开放的探索,这问题不大,更多的是我们如何最好地理解这些数据所面临的挑战!
最常出现的主题
首先,我们来看看模型卡中出现频率最高的 20 个主题
主题 | 比例 (%) |
---|---|
训练 | 1.00272 |
条目 | 0.807221 |
更多 | 0.651226 |
模型 | 0.612398 |
模型 | 0.54564 |
信息 | 0.504087 |
需要 | 0.501362 |
局限性 | 0.472071 |
需要更多信息 | 0.433243 |
学习率 | 0.398501 |
微调 | 0.387602 |
变换器 | 0.378747 |
分词器 | 0.376703 |
预期用途 | 0.370572 |
超参数 | 0.361717 |
评估 | 0.360354 |
训练过程 | 0.358992 |
版本 | 0.352861 |
Adam | 0.34673 |
超参数 | 0.343324 |
我们可能会看到一些词语,如“更多”、“信息”、“需要”,这些是模型卡模板中占位符文本的产物。令人欣慰的是,“评估”和“预期用途”出现频率如此之高。由于“主题”种类繁多,我们再来看看 20 个最常见的类别
类别 | 比例 |
---|---|
模型 | 3.97752 |
模型修改 | 2.29837 |
数值 | 2.01226 |
操作 | 1.68869 |
数据集 | 1.53951 |
指标 | 1.25409 |
过程 | 1.23229 |
软件 | 1.22684 |
实体 | 1.15736 |
软件版本 | 1.14237 |
概念 | 1.09741 |
数据 | 0.936649 |
数据类型 | 0.867166 |
人物 | 0.787466 |
数量 | 0.773842 |
组织 | 0.730926 |
语言 | 0.729564 |
库 | 0.647139 |
数值 | 0.626022 |
版本 | 0.613079 |
我们期望看到许多这些类别,即“模型”和“模型修改”、“数值”。其中一些类别稍微抽象一些,即“操作”。我们来看看其中一些的description
字段
['the process of adding new software to a system.',
'the action of preserving or retaining something.',
'an invitation to interact with the content, usually by clicking on a link or button.',
'the action of visiting or viewing the webpage.',
'the interaction between the user and the software.']
以及实际应用这些的“主题”
['install', 'Kept', 'click', 'accessed', 'experience']
我们可以提取什么?
回到这项工作的初衷,尝试在模型卡中找到可以作为元数据提取的“概念”,我们可能会考虑提取什么有趣的信息?从类别中可以看出,数据集经常出现。虽然我已经做了一些提取这些数据的工作,但从模型卡中提取所有数据集提及还有更多工作要做。
尽管可能更具挑战性,但我们可以看到“度量”类别经常出现。让我们将数据集筛选为类别标记为“度量”的示例,并选取前 30 个最常见的示例。
主题 | 比例 |
---|---|
验证损失 | 11.6212 |
训练损失 | 7.63271 |
准确率 | 6.97274 |
损失 | 6.74319 |
F1 | 5.39455 |
准确率 | 3.18508 |
结果 | 2.38164 |
召回率 | 2.066 |
召回率 | 2.066 |
精度 | 1.95122 |
验证准确率 | 1.66428 |
结果 | 1.5495 |
“F1” | 1.46341 |
“精确率” | 1.43472 |
“召回率” | 1.43472 |
训练损失 | 1.34864 |
训练精确率 | 1.34864 |
精度 | 1.29125 |
Rouge1 | 0.774749 |
“准确率” | 0.774749 |
验证 | 0.659971 |
性能 | 0.631277 |
Rouge2 | 0.573888 |
训练准确率 | 0.573888 |
F1 | 0.516499 |
Bleu | 0.487805 |
IoU | 0.45911 |
迭代次数 | 0.45911 |
微 F1 分数 | 0.373027 |
马修斯相关系数 | 0.344333 |
尽管这里的结果有点嘈杂,但经过一番努力,我们有望开始思考如何从模型卡中提取指标提及,并合并以不同方式表达的重复指标。这类数据可以开始为我们提供关于人们如何评估模型的非常有趣的“实地”见解。
结论
如果您想亲自体验这些结果,可以在这里找到完整的数据集:librarian-bots/model-card-sentences-annotated。
您可能还想查看模型卡指南
如果您有关于处理此类数据的其他想法,我很乐意听取您的意见!您可以在 Hub 上关注我(您也应该关注 Librarian bot!)。