AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理
AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理
目录
AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理
一、简单介绍
二、零样本学习 (Zero-shot Learning) 和少样本学习 (Few-shot Learning)
1、零样本学习 (Zero-shot Learning)
2、少样本学习 (Few-shot Learning)
三、利用无标注数据
1、语言模型的微调
2、分类器的微调
3、高级方法
附录
一、当前案例环境 package 的 版本如下
一、简单介绍
AGI,即通用人工智能(Artificial General Intelligence),是一种具备人类智能水平的人工智能系统。它不仅能够执行特定的任务,而且能够理解、学习和应用知识于广泛的问题解决中,具有较高的自主性和适应性。AGI的能力包括但不限于自我学习、自我改进、自我调整,并能在没有人为干预的情况下解决各种复杂问题。
- AGI能做的事情非常广泛:
跨领域任务执行:AGI能够处理多领域的任务,不受限于特定应用场景。
自主学习与适应:AGI能够从经验中学习,并适应新环境和新情境。
创造性思考:AGI能够进行创新思维,提出新的解决方案。
社会交互:AGI能够与人类进行复杂的社会交互,理解情感和社会信号。
- 关于AGI的未来发展前景,它被认为是人工智能研究的最终目标之一,具有巨大的变革潜力:
技术创新:随着机器学习、神经网络等技术的进步,AGI的实现可能会越来越接近。
跨学科整合:实现AGI需要整合计算机科学、神经科学、心理学等多个学科的知识。
伦理和社会考量:AGI的发展需要考虑隐私、安全和就业等伦理和社会问题。
增强学习和自适应能力:未来的AGI系统可能利用先进的算法,从环境中学习并优化行为。
多模态交互:AGI将具备多种感知和交互方式,与人类和其他系统交互。
Hugging Face作为当前全球最受欢迎的开源机器学习社区和平台之一,在AGI时代扮演着重要角色。它提供了丰富的预训练模型和数据集资源,推动了机器学习领域的发展。Hugging Face的特点在于易用性和开放性,通过其Transformers库,为用户提供了方便的模型处理文本的方式。随着AI技术的发展,Hugging Face社区将继续发挥重要作用,推动AI技术的发展和应用,尤其是在多模态AI技术发展方面,Hugging Face社区将扩展其模型和数据集的多样性,包括图像、音频和视频等多模态数据。
- 在AGI时代,Hugging Face可能会通过以下方式发挥作用:
模型共享:作为模型共享的平台,Hugging Face将继续促进先进的AGI模型的共享和协作。
开源生态:Hugging Face的开源生态将有助于加速AGI技术的发展和创新。
工具和服务:提供丰富的工具和服务,支持开发者和研究者在AGI领域的研究和应用。
伦理和社会责任:Hugging Face注重AI伦理,将推动负责任的AGI模型开发和应用,确保技术进步同时符合伦理标准。
AGI作为未来人工智能的高级形态,具有广泛的应用前景,而Hugging Face作为开源社区,将在推动AGI的发展和应用中扮演关键角色。
(注意:以下代码运行,可能需要科学上网)
二、零样本学习 (Zero-shot Learning) 和少样本学习 (Few-shot Learning)
1、零样本学习 (Zero-shot Learning)
定义: 零样本学习是一种让模型能够在没有见过目标类别数据的情况下进行预测的技术。它主要依赖于预训练的语言模型和自然语言描述,利用模型在预训练期间学到的广泛知识来理解和推断新的任务。
实现方式:
- 基于语言模型的零样本分类: 使用预训练的语言模型,如 BERT、GPT-3,通过自然语言提示 (prompt) 进行分类。Hugging Face 提供了
zero-shot-classification
pipeline,使这一过程非常简单。from transformers import pipeline# 加载零样本分类 pipeline zero_shot_classifier = pipeline("zero-shot-classification")# 定义待分类的文本 text = "Hugging Face's library is so easy to use!"# 定义候选标签 labels = ["education", "politics", "technology"]# 进行零样本分类 result = zero_shot_classifier(text, candidate_labels=labels) print(result)
- 利用嵌入向量和距离度量: 通过计算文本嵌入向量之间的相似度来实现零样本分类。模型在预训练期间学到的嵌入空间使得相似类别的文本在向量空间中更接近。
- 自然语言推理 (NLI): 使用 NLI 模型,如 RoBERTa,对于每个候选标签,模型判断该标签是否是输入文本的合理推断。Hugging Face 提供了类似的模型,可以通过 NLI 的方式实现零样本学习。
from transformers import pipeline# 加载 NLI 模型 nli_model = pipeline("zero-shot-classification", model="facebook/bart-large-mnli")# 定义待分类的文本 text = "Hugging Face's library is so easy to use!"# 定义候选标签 labels = ["education", "politics", "technology"]# 进行零样本分类 result = nli_model(text, candidate_labels=labels) print(result)
2、少样本学习 (Few-shot Learning)
定义: 少样本学习是一种让模型能够在只见过少量目标类别数据的情况下进行有效预测的技术。它通过对预训练模型进行微调,利用少量标注数据来学习新的任务。
实现方式:
- 基于预训练模型的微调: 使用预训练的 Transformer 模型(如 BERT、GPT-3),通过少量标注数据进行微调。Hugging Face 提供了
Trainer
API,可以方便地进行微调。from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments from datasets import Dataset# 示例少样本数据 data = {"text": ["I love using Hugging Face!", "The library is very intuitive."],"label": [1, 1] }# 创建 Dataset 对象 dataset = Dataset.from_dict(data)# 加载预训练模型和分词器 model_name = "bert-base-uncased" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)# 数据预处理 def preprocess_data(examples):return tokenizer(examples["text"], truncation=True, padding=True)tokenized_dataset = dataset.map(preprocess_data, batched=True)# 设置训练参数 training_args = TrainingArguments(output_dir="./results",num_train_epochs=3,per_device_train_batch_size=2,logging_dir="./logs", )# 创建 Trainer 实例 trainer = Trainer(model=model,args=training_args,train_dataset=tokenized_dataset )# 开始训练 trainer.train()
- Prompt-based 学习: 通过设计好的提示语(prompts)进行少样本学习,将少量数据转化为对模型的提示。这个方法在 GPT-3 等模型上表现出色。
- 元学习 (Meta-learning): 利用元学习算法,如 MAML (Model-Agnostic Meta-Learning),训练模型在少量新数据上快速适应。虽然 Hugging Face 目前没有直接的元学习 API,但可以结合 PyTorch 等库实现。
零样本学习和少样本学习是解决数据有限情况下进行有效机器学习的重要方法。通过使用 Hugging Face 提供的预训练模型和工具,可以轻松实现这两种技术:
- 零样本学习: 依赖于预训练语言模型,通过自然语言提示或嵌入向量实现分类和推理。
- 少样本学习: 通过微调预训练模型或使用提示语进行学习,以适应新的任务和数据。
三、利用无标注数据
尽管训练分类器的最佳方式是依靠大量的标注数据,但是这并不意味着无标注数据就是毫无价值的。回想一下我们知道的大多数模型的预训练:即使它们几乎是基于互联网的不相关数据来训练的,我们也可以利用预训练权重来用在其他各种文本任务,这就是NLP领域中迁移学习的核心思想。自然地,如果下游任务的文本结构与预训练的文本相似,那么迁移的效果会更好。所以如果我们能使预训练任务更接近下游任务,就有可能提高模型迁移的整体效果。
本节我们将借助具体的案例来思考这个问题:BERT已在BookCorpus和English Wikipedia上进行了预训练,而包含代码的GitHub issue文本只是一个小众数据集。如果从头开始预训练BERT,则可以在抓取GitHub的所有issue时就开始进行。但是,这种方法是昂贵的,而且BERT学到的关于语言的特征针对GitHub issue有效。那么在重新训练模型和使用现成的模型之间有没有一个折中方案呢?答案是有的,这种方案叫作领域自适应(我们在第7章中的问答领域介绍过)。与其从头开始重新训练语言模型,不如基于其领域数据继续训练它。我们使用本章之前介绍过的预测掩码词元的语言模型,这也就意味着不需要任何标注数据。之后,我们可以将适应后的模型加载为分类器,并对其微调,以此来利用未标注的数据。
与使用标注数据相比,领域自适应的好处是即使使用未标注数据,其也是大量可用的。此外,适应过后的模型也可以在其他用例中重复使用。试想一下,你想构建一个电子邮件分类器,并对你的所有历史邮件使用领域自适应,之后就可以将此模型用于NER或另一个分类任务,比如情感分析,因为该方法对于下游任务是不可知的。
下面我们将微调一个预训练的语言模型。
1、语言模型的微调
在本节中,我们将在数据集的未标注部分用掩码语言建模来微调经过预训练的BERT模型。为了做到这一点,我们需要了解两个新概念:在对数据进行词元化时的一个额外步骤;一个特殊的数据整理器。下面我们从词元化开始讲解。
除了文本中的普通词元外,词元分析器还将特殊词元添加到序列中,比如用于分类和下句预测的[CLS]词元和[SEP]词元。当我们进行掩码语言建模时,需要确保训练的模型不会用来预测这些词元。出于这个原因,我们需要将它们从损失函数中掩码掉,通过设置return_special_tokens_mask=True即可。下面用这个参数对文本进行重新词元化:
# 定义一个函数来对数据集中的批次进行分词处理
def tokenize(batch):return tokenizer(batch["text"], truncation=True,max_length=128, return_special_tokens_mask=True)# 对数据集执行批量分词处理
ds_mlm = ds.map(tokenize, batched=True)# 移除数据集中的标签、文本和标签ID列,保留仅嵌入和特殊标记掩码
ds_mlm = ds_mlm.remove_columns(["labels", "text", "label_ids"])
运行结果:
在进行掩码语言建模的时候,缺的是掩码输入序列中的词元并在输出中包含目标词元的机制。我们可以采取的一种方法是,引入一个可以掩码随机词元的函数,并为序列创建标注。但这会使数据集的大小增加一倍,因为我们需要在数据集中存储目标序列,所以这也意味着我们将在每轮(epoch)都使用相同的序列掩码。
有一个比较优雅的解决方案,即使用数据整理器。需要记住,数据整理器是在数据集和模型调用之间建立桥梁的函数。从数据集中采样一个批量的数据,数据整理器准备批量中的元素以将其提供给模型。在我们遇到的最简单的例子中,它只是将每个元素的张量拼接成单个张量。在本节的案例中,我们可以使用它来动态地进行掩码和标注生成。这样我们就不需要存储标注,而且每次采样都会得到新的掩码。这个任务的数据整理器叫作DataCollatorForLanguageModeling,我们可以使用模型的词元分析器和通过mlm_probability参数掩码的词元来初始化它。下面我们将使用这个整理器来掩码15%的词元,这与BERT论文中描述的一致:
# 导入DataCollatorForLanguageModeling和set_seed函数
from transformers import DataCollatorForLanguageModeling, set_seed# 创建一个用于语言建模的数据收集器,使用给定的分词器和MLM概率
data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer,mlm_probability=0.15)
我们快速看一下数据整理器的运行情况,看看它到底做了什么操作。为了在DataFrame中快速显示出结果,我们将词元分析器和数据整理器的返回格式切换为NumPy:
# 设置随机种子为3,以确保结果的可重复性
set_seed(3)# 设置数据收集器的返回张量类型为NumPy数组
data_collator.return_tensors = "np"# 使用分词器对文本进行编码,并通过数据收集器处理
inputs = tokenizer("Transformers are awesome!", return_tensors="np")
outputs = data_collator([{"input_ids": inputs["input_ids"][0]}])# 提取原始和掩码后的输入标记ID
original_input_ids = inputs["input_ids"][0]
masked_input_ids = outputs["input_ids"][0]# 创建包含各列数据的DataFrame,便于展示
pd.DataFrame({"Original tokens": tokenizer.convert_ids_to_tokens(original_input_ids),"Masked tokens": tokenizer.convert_ids_to_tokens(masked_input_ids),"Original input_ids": original_input_ids,"Masked input_ids": masked_input_ids,"Labels": outputs["labels"][0]}).T
运行结果:
0 | 1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|---|
Original tokens | [CLS] | transformers | are | awesome | ! | [SEP] |
Masked tokens | [CLS] | transformers | are | awesome | [MASK] | [SEP] |
Original input_ids | 101 | 19081 | 2024 | 12476 | 999 | 102 |
Masked input_ids | 101 | 19081 | 2024 | 12476 | 103 | 102 |
Labels | -100 | -100 | -100 | -100 | 999 | -100 |
从结果可以看到,对应于感叹号的词元已经被替换成了一个掩码词元。另外,数据整理器返回了一个标注数组,其中原始词元为-100,被掩码的词元则为词元的ID。我们还可以明显看出,在计算损失时,包含-100的条目则被忽略掉。下面我们把数据整理器的格式换回PyTorch:
# 设置数据收集器返回张量类型为PyTorch张量
data_collator.return_tensors = "pt"
有了词元分析器和数据整理器,我们就可以对掩码语言模型进行微调了。我们照常设置TrainingArguments和Trainer:
# 导入AutoModelForMaskedLM类
from transformers import AutoModelForMaskedLM# 定义训练参数
training_args = TrainingArguments(output_dir=f"{model_ckpt}-issues-128", # 指定训练结果输出目录per_device_train_batch_size=32, # 每个设备的训练批次大小logging_strategy="epoch", # 日志记录频率设为每轮evaluation_strategy="epoch", # 模型评估频率设为每轮save_strategy="no", # 不保存模型中间结果num_train_epochs=16, # 训练的总轮数push_to_hub=False, # 是否将模型推送到 Hugging Face Hublog_level="error", # 设置日志级别为错误级别report_to="none" # 不向任何地方报告训练进度
)# 创建Trainer对象进行训练
trainer = Trainer(model=AutoModelForMaskedLM.from_pretrained("bert-base-uncased"), # 加载预训练的BERT模型用于Masked Language Modelingtokenizer=tokenizer, # 使用的分词器args=training_args, # 使用定义好的训练参数data_collator=data_collator, # 数据收集器,用于批处理数据train_dataset=ds_mlm["unsup"], # 训练数据集为未标记的数据集eval_dataset=ds_mlm["train"] # 评估数据集为训练集,用于评估模型训练进度
)# 开始训练
trainer.train()# 推送到远端 Hugging Face Hub
trainer.push_to_hub("Training complete!")
运行结果:
{'loss': 2.0996, 'learning_rate': 4.6875e-05, 'epoch': 1.0} {'eval_loss': 1.7033042907714844, 'eval_runtime': 0.8827, 'eval_samples_per_second': 252.641, 'eval_steps_per_second': 31.722, 'epoch': 1.0} {'loss': 1.6382, 'learning_rate': 4.375e-05, 'epoch': 2.0} {'eval_loss': 1.4360285997390747, 'eval_runtime': 0.8686, 'eval_samples_per_second': 256.729, 'eval_steps_per_second': 32.235, 'epoch': 2.0} {'loss': 1.485, 'learning_rate': 4.0625000000000005e-05, 'epoch': 3.0} {'eval_loss': 1.391833782196045, 'eval_runtime': 0.8654, 'eval_samples_per_second': 257.682, 'eval_steps_per_second': 32.355, 'epoch': 3.0} {'loss': 1.3983, 'learning_rate': 3.7500000000000003e-05, 'epoch': 4.0} {'eval_loss': 1.3651131391525269, 'eval_runtime': 0.9359, 'eval_samples_per_second': 238.271, 'eval_steps_per_second': 29.917, 'epoch': 4.0} {'loss': 1.341, 'learning_rate': 3.4375e-05, 'epoch': 5.0} {'eval_loss': 1.1853851079940796, 'eval_runtime': 0.8649, 'eval_samples_per_second': 257.843, 'eval_steps_per_second': 32.375, 'epoch': 5.0} {'loss': 1.2824, 'learning_rate': 3.125e-05, 'epoch': 6.0} {'eval_loss': 1.2844164371490479, 'eval_runtime': 0.8905, 'eval_samples_per_second': 250.428, 'eval_steps_per_second': 31.444, 'epoch': 6.0} {'loss': 1.2403, 'learning_rate': 2.8125000000000003e-05, 'epoch': 7.0} {'eval_loss': 1.2549198865890503, 'eval_runtime': 0.9004, 'eval_samples_per_second': 247.655, 'eval_steps_per_second': 31.096, 'epoch': 7.0} {'loss': 1.2, 'learning_rate': 2.5e-05, 'epoch': 8.0} {'eval_loss': 1.216525673866272, 'eval_runtime': 0.8883, 'eval_samples_per_second': 251.037, 'eval_steps_per_second': 31.52, 'epoch': 8.0} {'loss': 1.1661, 'learning_rate': 2.1875e-05, 'epoch': 9.0} {'eval_loss': 1.1880288124084473, 'eval_runtime': 0.878, 'eval_samples_per_second': 253.985, 'eval_steps_per_second': 31.89, 'epoch': 9.0} {'loss': 1.141, 'learning_rate': 1.8750000000000002e-05, 'epoch': 10.0} {'eval_loss': 1.2314234972000122, 'eval_runtime': 0.9038, 'eval_samples_per_second': 246.726, 'eval_steps_per_second': 30.979, 'epoch': 10.0} {'loss': 1.1276, 'learning_rate': 1.5625e-05, 'epoch': 11.0} {'eval_loss': 1.2082805633544922, 'eval_runtime': 0.9053, 'eval_samples_per_second': 246.317, 'eval_steps_per_second': 30.928, 'epoch': 11.0} {'loss': 1.1037, 'learning_rate': 1.25e-05, 'epoch': 12.0} {'eval_loss': 1.1679879426956177, 'eval_runtime': 0.9104, 'eval_samples_per_second': 244.959, 'eval_steps_per_second': 30.757, 'epoch': 12.0} {'loss': 1.0786, 'learning_rate': 9.375000000000001e-06, 'epoch': 13.0} {'eval_loss': 1.245760440826416, 'eval_runtime': 0.96, 'eval_samples_per_second': 232.291, 'eval_steps_per_second': 29.167, 'epoch': 13.0} {'loss': 1.0799, 'learning_rate': 6.25e-06, 'epoch': 14.0} {'eval_loss': 1.1623947620391846, 'eval_runtime': 1.1769, 'eval_samples_per_second': 189.486, 'eval_steps_per_second': 23.792, 'epoch': 14.0} {'loss': 1.0636, 'learning_rate': 3.125e-06, 'epoch': 15.0} {'eval_loss': 1.1255277395248413, 'eval_runtime': 1.2458, 'eval_samples_per_second': 178.995, 'eval_steps_per_second': 22.475, 'epoch': 15.0} {'loss': 1.0639, 'learning_rate': 0.0, 'epoch': 16.0} {'eval_loss': 1.251034140586853, 'eval_runtime': 0.8711, 'eval_samples_per_second': 256.007, 'eval_steps_per_second': 32.144, 'epoch': 16.0} {'train_runtime': 3370.5456, 'train_samples_per_second': 44.161, 'train_steps_per_second': 1.381, 'train_loss': 1.2818299978459413, 'epoch': 16.0}
TrainOutput(global_step=4656, training_loss=1.2818299978459413, metrics={'train_runtime': 3370.5456, 'train_samples_per_second': 44.161, 'train_steps_per_second': 1.381, 'train_loss': 1.2818299978459413, 'epoch': 16.0})
我们可以访问trainer的日志记录,来查看模型的训练集损失和验证集损失。所有日志都存储在trainer.state.log_history中,它是一个字典表,可以很容易被加载到Pandas DataFrame中。由于训练集损失和验证集损失是在不同的步骤中被记录的,所以在DataFrame中存在缺失值。出于这个原因,我们在绘制指标之前,先把缺失的值删除:
import pandas as pd
import matplotlib.pyplot as plt# 从 Trainer 的状态日志中创建 DataFrame
df_log = pd.DataFrame(trainer.state.log_history)# 绘制验证集损失
df_log.dropna(subset=["eval_loss"]).reset_index()["eval_loss"].plot(label="Validation")# 绘制训练集损失
df_log.dropna(subset=["loss"]).reset_index()["loss"].plot(label="Train")# 设置图表标签和图例
plt.xlabel("Epochs")
plt.ylabel("Loss")
plt.legend(loc="upper right")# 保存图表为文件,并设置自适应大小
plt.savefig('images/eval_loss.png', bbox_inches='tight')# 显示图表
plt.show()
运行结果:
从结果看来,训练集损失和验证集损失都大大降低了。所以我们来检验一下,当基于这个模型对分类器进行微调时,能否获得效果提升。
2、分类器的微调
现在我们来重复微调操作,但有些许不同的是,我们将加载自定义的checkpoint:
# 更新模型检查点路径
model_ckpt = f'{model_ckpt}-issues-128'# 从模型检查点加载配置,并设置适用于多标签分类的参数
config = AutoConfig.from_pretrained(model_ckpt)
config.num_labels = len(all_labels)
config.problem_type = "multi_label_classification"# 遍历训练集切片进行微调
for train_slice in train_slices:# 从预训练模型加载序列分类模型model = AutoModelForSequenceClassification.from_pretrained(model_ckpt,config=config)# 创建 Trainer 对象用于训练trainer = Trainer(model=model,tokenizer=tokenizer,args=training_args_fine_tune,compute_metrics=compute_metrics,train_dataset=ds_enc["train"].select(train_slice),eval_dataset=ds_enc["valid"],)# 执行训练过程trainer.train()# 在测试集上进行预测并计算评估指标pred = trainer.predict(ds_enc['test'])metrics = compute_metrics(pred)# 将微调后的宏 F1 和微 F1 分数添加到相应列表中,标记为领域适应 Fine-tune (DA)macro_scores['Fine-tune (DA)'].append(metrics['macro f1'])micro_scores['Fine-tune (DA)'].append(metrics['micro f1'])
对比基于vanilla BERT模型的微调结果,我们可以看出这里具备了一个优势,特别是在低数据域。在有更多标注数据的情况下,F1分数获得了几个百分点的提升:
# 绘制微调后的模型在不同训练样本大小下的评估指标图表
plot_metrics(micro_scores, macro_scores, train_samples, "Fine-tune (DA)", "images/Fine_tune.png")
运行结果:
结果突出表明了领域自适应可以通过未标注数据和少量的操作为模型带来一些性能提升。自然地,未标注的数据越多,标记的数据越少,使用此方法的带来影响就越大。
3、高级方法
在调整分类头之前对语言模型进行微调是一个简单而可靠的方法,可以显著提高性能。其实,还有一些巧妙而复杂的方法可以进一步利用未标注的数据。我们在此总结了其中一些方法,可以帮助你的模型发挥出极致的性能,具体请看下文。
3.1 无监督数据增强
无监督数据增强的核心思想是:一个模型对于无标注数据和失真数据的预测结果应该是一致的。这种失真是通过标准的数据增强策略引入的,例如词元替换或者回译,通过最小化原始数据和失真数据的预测结果之间的KL离散度来加强一致性。此过程如下图所示,一致性要求是通过增加交叉熵损失函数和未标注数据的附加项来实现的。这就意味着我们使用标准监督方法在标注数据上训练出一个模型,再限制该模型对无标注数据做出一致的预测。
种方法表现出的性能令人印象深刻:基于少量有标注数据,使用UDA方法训练出的BERT模型和使用大量数据训练出的模型性能十分接近。但缺点是,我们需要构建一个数据增强pipeline,而且需要更多的训练时间,因为需要多个前向传递来生成对未标注数据和增强数据的概率分布。
3.2 不确定性感知自训练
另一种有前景的利用无标注数据的方法是不确定性感知自训练(Uncertainty-aware Self-Training,UST)。该方法的思想是在有标注的数据上训练出一个教师模型,然后用这个模型在未标注数据上创建伪标注,再在新的伪标注数据上训练一个学生模型,这个学生模型又作为下一次迭代训练的教师模型。
这种方法有趣的一点是生成伪标注的方法:为了获得模型预测结果的不确定性度量,在开启蒙特卡罗dropout的情况下,将相同的输入内容多次传给模型。然后,预测的方差代表了特定样本上模型的确定性。有了这个不确定性的度量,伪标注就可以用一种叫作“基于分歧的贝叶斯主动学习”(Bayesian Active Learning by Disagreement,BALD)方法进行采样。下图展示了整个流程。
通过不断迭代,教师模型在创建伪标注方面不断变得更好,从而带来整个模型性能的提升。最终,这种方法在模型中并不会用得太多,它在多个数据集上的效果完胜UDA。
最后:
- 即使没有标注数据或是只有少量的标注数据,我们也可以完成一些任务。我们可以使用在其他数据集上预训练过的模型,比如使用在Python代码上预训练的BERT语言模型或GPT-2,来完成GitHub issue的分类任务。此外,我们还可以使用领域自适应,即使使用普通分类头也能获得额外的性能提升。
- 介绍的方法中哪种在实战当中效果最好,取决于多个方面:标注数据的量、数据包含的噪声、数据与预训练语料的接近程度等。为了找出效果最好的方法,构建一个用于评估的pipeline并进行迭代是一个不错的途径。Hugging Face Transformer具备非常灵活的API,它让我们可以快速加载几个模型来进行比较,并且这个过程并不需要修改任何代码。在Hugging Face Hub上有超过10 000个模型,可能已经有人做过你想做的事,我们要善于发现并利用它们。
- 还介绍了一些超出本书范围的内容,例如研究UDA或UST这种前沿的复杂方法,以及花时间去获得更多的数据。我们要想评估模型,就免不了要准备测试集和验证集。标注几百条数据需要几小时或几天的时间,我们可以借助一些工具来辅助标注。有时候我们花一些时间来创建一个小型的、高质量的数据集,胜过用这些时间来研究一个更加复杂的解决方案。本章所述内容也是为了确保你能够合理利用标注数据。
附录
一、当前案例环境 package 的 版本如下
Package Version
------------------------- --------------
aiohttp 3.9.5
aiosignal 1.3.1
alembic 1.13.2
anyio 4.4.0
argon2-cffi 23.1.0
argon2-cffi-bindings 21.2.0
arrow 1.3.0
asttokens 2.4.1
async-lru 2.0.4
attrs 23.2.0
Babel 2.15.0
beautifulsoup4 4.12.3
bleach 6.1.0
certifi 2024.7.4
cffi 1.16.0
charset-normalizer 3.3.2
colorama 0.4.6
coloredlogs 15.0.1
colorlog 6.8.2
comm 0.2.2
contourpy 1.2.1
cycler 0.12.1
datasets 2.20.0
debugpy 1.8.2
decorator 5.1.1
defusedxml 0.7.1
dill 0.3.8
executing 2.0.1
faiss-cpu 1.8.0.post1
fastjsonschema 2.20.0
filelock 3.15.4
flatbuffers 24.3.25
fonttools 4.53.1
fqdn 1.5.1
frozenlist 1.4.1
fsspec 2024.5.0
gdown 5.2.0
greenlet 3.0.3
h11 0.14.0
httpcore 1.0.5
httpx 0.27.0
huggingface-hub 0.23.4
humanfriendly 10.0
idna 3.7
intel-openmp 2021.4.0
ipykernel 6.29.5
ipython 8.26.0
ipywidgets 8.1.3
isoduration 20.11.0
jedi 0.19.1
Jinja2 3.1.4
joblib 1.4.2
json5 0.9.25
jsonpointer 3.0.0
jsonschema 4.23.0
jsonschema-specifications 2023.12.1
jupyter 1.0.0
jupyter_client 8.6.2
jupyter-console 6.6.3
jupyter_core 5.7.2
jupyter-events 0.10.0
jupyter-lsp 2.2.5
jupyter_server 2.14.2
jupyter_server_terminals 0.5.3
jupyterlab 4.2.3
jupyterlab_pygments 0.3.0
jupyterlab_server 2.27.2
jupyterlab_widgets 3.0.11
kiwisolver 1.4.5
Mako 1.3.5
MarkupSafe 2.1.5
matplotlib 3.9.1
matplotlib-inline 0.1.7
mistune 3.0.2
mkl 2021.4.0
mpmath 1.3.0
multidict 6.0.5
multiprocess 0.70.16
nbclient 0.10.0
nbconvert 7.16.4
nbformat 5.10.4
nest-asyncio 1.6.0
networkx 3.3
nlpaug 1.1.11
notebook 7.2.1
notebook_shim 0.2.4
numpy 1.26.4
onnx 1.16.1
onnxruntime 1.18.1
optuna 3.6.1
overrides 7.7.0
packaging 24.1
pandas 2.2.2
pandocfilters 1.5.1
parso 0.8.4
pillow 10.4.0
pip 24.1.2
platformdirs 4.2.2
prometheus_client 0.20.0
prompt_toolkit 3.0.47
protobuf 5.27.2
psutil 6.0.0
pure-eval 0.2.2
pyarrow 16.1.0
pyarrow-hotfix 0.6
pycparser 2.22
Pygments 2.18.0
pyparsing 3.1.2
pyreadline3 3.4.1
PySocks 1.7.1
python-dateutil 2.9.0.post0
python-json-logger 2.0.7
pytz 2024.1
pywin32 306
pywinpty 2.0.13
PyYAML 6.0.1
pyzmq 26.0.3
qtconsole 5.5.2
QtPy 2.4.1
referencing 0.35.1
regex 2024.5.15
requests 2.32.3
rfc3339-validator 0.1.4
rfc3986-validator 0.1.1
rpds-py 0.19.0
scikit-learn 1.5.1
scikit-multilearn 0.2.0
scipy 1.14.0
Send2Trash 1.8.3
sentencepiece 0.2.0
setuptools 70.0.0
six 1.16.0
sniffio 1.3.1
soupsieve 2.5
SQLAlchemy 2.0.31
stack-data 0.6.3
sympy 1.13.0
tbb 2021.13.0
terminado 0.18.1
threadpoolctl 3.5.0
tinycss2 1.3.0
tokenizers 0.13.3
torch 2.3.1+cu121
torchaudio 2.3.1+cu121
torchvision 0.18.1+cu121
tornado 6.4.1
tqdm 4.66.4
traitlets 5.14.3
transformers 4.24.0
types-python-dateutil 2.9.0.20240316
typing_extensions 4.12.2
tzdata 2024.1
uri-template 1.3.0
urllib3 2.2.2
wcwidth 0.2.13
webcolors 24.6.0
webencodings 0.5.1
websocket-client 1.8.0
wheel 0.43.0
widgetsnbextension 4.0.11
xxhash 3.4.1
yarl 1.9.4
相关文章:
AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理
AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 目录 AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 一、简单介绍 二、零样本学习 (Zero-shot Learning) 和少样本学习 (Few-shot Learning) 1、零样本学…...
Docker 和 k8s 之间是什么关系?
Docker 简介 Docker 功能: Docker 是一款可以将程序和环境打包并运行的工具软件。通过 Docker,可以将程序及其依赖环境打包,确保在不同操作系统上一致的运行效果。 环境一致性问题: 程序依赖于特定的环境,不同操作系统…...
敲详细的springframework-amqp-rabbit源码解析
看源码时将RabbitMQ的springframework-amqp-rabbit和spring-rabbit的一套区分开,springboot是基于RabbitMQ的Java客户端建立了简便易用的框架。 springboot的框架下相对更多地使用消费者Consumer和监听器Listener的概念,这两个概念不注意区分容易混淆。…...
Telegram Bot、小程序开发(三)Mini Apps小程序
文章目录 一、Telegram Mini Apps小程序二、小程序启动方式三、小程序开发小程序调试模式初始化小程序Keyboard Button Mini Apps 键盘按钮小程序【依赖具体用户信息场景,推荐】**Inline Button Mini Apps内联按钮小程序**initData 的自动传递使用内联菜单时候哪些参数会默认传…...
Django F()函数
F()函数的作用 F()函数在Django中是一个非常强大的工具,主要用于在查询表达式中引用模型的字段。它允许你在数据库层面执行各种操作,而无需将数据加载到Python内存中。这不仅提高了性能,还允许你利用数据库的优化功能。 字段引用 在查询表达…...
GraphRAG的实践
好久没有体验新技术了,今天来玩一下GraphRAG 顾名思义,一种检索增强的方法,利用图谱来实现RAG 1.配置环境 conda create -n GraphRAG python3.11 conda activate GraphRAG pip install graphrag 2.构建GraphRAG mkdir -p ./ragtest/i…...
自动驾驶三维车道线检测系列—LATR: 3D Lane Detection from Monocular Images with Transformer
文章目录 1. 概述2. 背景介绍3. 方法3.1 整体结构3.2 车道感知查询生成器3.3 动态3D地面位置嵌入3.4 预测头和损失 4. 实验评测4.1 数据集和评估指标4.2 实验设置4.3 主要结果 5. 讨论和总结 1. 概述 3D 车道线检测是自动驾驶中的一个基础但具有挑战性的任务。最近的进展主要依…...
守护动物乐园:视频AI智能监管方案助力动物园安全与秩序管理
一、背景分析 近日,某大熊猫参观基地通报了4位游客在参观时,向大熊猫室外活动场内吐口水的不文明行为。这几位游客的行为违反了入园参观规定并可能对大熊猫造成严重危害,已经被该熊猫基地终身禁止再次进入参观。而在此前,另一熊猫…...
FairGuard游戏加固入选《嘶吼2024网络安全产业图谱》
2024年7月16日,国内网络安全专业媒体——嘶吼安全产业研究院正式发布《嘶吼2024网络安全产业图谱》(以下简称“产业图谱”)。 本次发布的产业图谱,共涉及七大类别,127个细分领域。全面展现了网络安全产业的构成和重要组成部分,探…...
数据仓库事实表
数据仓库中的三种常见事实表类型:事务事实表、周期快照事实表和累积快照事实表 事务事实表: 事务事实表是记录事务级别数据的事实表。它记录了每个事务发生的具体度量指标,如销售金额、数量等。事务事实表的优势在于能够提供详细的事务级别…...
LeetCode题练习与总结:两数之和Ⅱ-输入有序数组--167
一、题目描述 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 < index1 < index…...
在 Java 中,怎样设计一个可扩展且易于维护的微服务架构?
在Java中设计一个可扩展且易于维护的微服务架构,可以考虑以下几个方面: 模块化设计:将应用拆分为多个小的、独立的模块,每个模块负责处理特定的业务逻辑。每个模块可以独立开发、测试和部署,增加或替换模块时不会影响其…...
零基础入门鸿蒙开发 HarmonyOS NEXT星河版开发学习
今天开始带大家零基础入门鸿蒙开发,也就是你没有任何编程基础的情况下就可以跟着石头哥零基础学习鸿蒙开发。 目录 一,为什么要学习鸿蒙 1-1,鸿蒙介绍 1-2,为什么要学习鸿蒙 1-3,鸿蒙各个版本介绍 1-4࿰…...
Chromium CI/CD 之Jenkins实用指南2024-在Windows节点上创建任务(九)
1. 引言 在现代软件开发流程中,持续集成(CI)和持续交付(CD)已成为确保代码质量和加速发布周期的关键实践。Jenkins作为一款广泛应用的开源自动化服务器,通过其强大的插件生态系统和灵活的配置选项…...
ceph进程网卡绑定逻辑
main() //如osd进程,是ceph_osd.cc文件的main函数;mon进程,是ceph_mon.cc文件的main函数 -->pick_addresses() // 会读取"cluster_network_interface"和"public_network_interface"这两个配置项来过滤ip ---->fill…...
学习opencv
初步学习可以参考: OpenCV学习之路(附加资料分享)_opencv资料-CSDN博客 【OpenCV】OpenCV常用函数合集【持续更新】_opencv函数手册-CSDN博客 整体框架可以参考: OpenCV学习指南:从零基础到全面掌握(零…...
利用双端队列 实现二叉树的非递归的中序遍历
双端队列:双向队列:支持插入删除元素的线性集合。 java官方文档推荐用deque实现栈(stack)。 pop(): 弹出栈中元素,也就是返回并移除队头元素,等价于removeFirst(),如果队列无元素,则…...
昇思25天学习打卡营第18天 | 基于MindSpore的GPT2文本摘要
昇思25天学习打卡营第18天 | 基于MindSpore的GPT2文本摘要 文章目录 昇思25天学习打卡营第18天 | 基于MindSpore的GPT2文本摘要数据集创建数据集数据预处理Tokenizer 模型构建构建GPT2ForSummarization模型动态学习率 模型训练模型推理总结打卡 数据集 实验使用nlpcc2017摘要数…...
科研绘图系列:R语言circos图(circos plot)
介绍 Circos图是一种数据可视化工具,它以圆形布局展示数据,通常用于显示数据之间的关系和模式。这种图表特别适合于展示分层数据或网络关系。Circos图的一些关键特点包括: 圆形布局:数据被组织在一个或多个同心圆中,每个圆可以代表不同的数据维度或层次。扇区:每个圆被划…...
追踪Conda包的踪迹:深入探索依赖关系与管理
追踪Conda包的踪迹:深入探索依赖关系与管理 Conda作为Python和其他科学计算语言的包管理器,不仅提供了安装、更新和卸载包的功能,还有一个强大的包跟踪功能,帮助用户理解包之间的依赖关系和管理环境。本文将详细解释如何在Conda中…...
苹果电脑pdf合并软件 苹果电脑合并pdf 苹果电脑pdf怎么合并
在数字化办公日益普及的今天,pdf文件因其跨平台兼容性强、格式稳定等特点,已经成为工作、学习和生活中不可或缺的文件格式。然而,我们常常面临一个问题:如何将多个pdf文件合并为一个?这不仅有助于文件的整理和管理&…...
axios(ajax请求库)
json-server(搭建http服务) json-server用来快速搭建模拟的REST API的工具包 使用json-server 下载:npm install -g json-server创建数据库json文件:db.json开启服务:json-srver --watch db.json axios的基本使用 <!doctype html>…...
Ideal窗口中左右侧栏消失了
不知道大家在工作过程中有没有遇到过此类问题,不论是Maven项目还是Gradle项目,突然发现Ideal窗口右侧图标丢失了,同事今天突然说大象图标不见了,不知道怎样刷新gradle。 不要慌张,下面提供一些解决思路: 1…...
麦芒30全新绽放,中国电信勾勒出AI手机的新方向
高通总裁兼CEO克里斯蒂亚诺阿蒙曾在媒体采访时表示:2024年将成为全球AI手机元年,生成式AI正在“非常快”的进入手机。 把大模型装进手机,由此成了智能终端演进的新方向。三星、华为、OPPO、小米等品牌动作频频,纷纷抢滩AI手机市场…...
数据结构之初始二叉树(3)
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 二叉树的基本操作 通过上篇文章的学习,我们简单的了解了二叉树的相关操作。接下来就是有…...
egret 白鹭的编译太慢了 自己写了一个
用的swc 他会检测git的改变 const simpleGit require(simple-git); const fs require(fs); const path require(path); // 初始化 simple-git const swc require(swc/core); const baseDir D:\\project; const gameDir game\\module\\abcdefg; const gitDir D:\\projec…...
<数据集>pcb板缺陷检测数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:693张 标注数量(xml文件个数):693 标注数量(txt文件个数):693 标注类别数:6 标注类别名称:[missing_hole, mouse_bite, open_circuit, short, spurious_copper, spur…...
实验四:图像的锐化处理
目录 一、实验目的 二、实验原理 1. 拉普拉斯算子 2. Sobel算子 3. 模板大小对滤波的影响 三、实验内容 四、源程序和结果 (1) 主程序(matlab) (2) 函数GrayscaleFilter (3) 函数MatrixAbs 五、结果分析 1. 拉普拉斯滤波 2. Sobel滤波 3. 不同大小模板的滤波…...
【Linux】权限的管理和Linux上的一些工具
文章目录 权限管理chgrpchownumaskfile指令sudo指令 目录权限粘滞位Linux中的工具1.软件包管理器yum2.rzsz Linux开发工具vim 总结 权限管理 chgrp 功能:修改文件或目录的所属组 格式:chgrp [参数] 用户组名 文件名 常用选项:-R 递归修改文…...
ES6 字符串的新增方法(二十)
1. String.prototype.startsWith(searchString, position) 特性:判断字符串是否以指定的子字符串开始。 用法:检查字符串的开始部分。 const str "Hello World"; console.log(str.startsWith("Hello")); // 输出:true…...
建设美食网站的意义/友情链接站长平台
链接:https://www.nowcoder.com/questionTerminal/fe298c55694f4ed39e256170ff2c205f?toCommentId12726161&ran685 来源:牛客网 某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还&am…...
设计制作个人网站/国内网络销售平台有哪些
学习内容简单查询汇总分析复杂查询多表查询如何提高SQL查询效率简单查询创建学校数据库的表查找学生查询姓‘猴’的学生名单查询姓名中最后一个字是‘猴’的学生名单查询姓名中带‘猴’的学生名单select * from student where 姓名 like 猴%;select * from student where 姓名 …...
本地旅游网站模版/苏州百度推广公司地址
我知道我迟早是要踏上了后台测试之路的,只是没想到来的这么突然。新接手了一个项目,在第一版发出后,产品需要做运营活动拉量,因为我担心突然的流量涌入是否会对后台造成压力呢?因此决定做一下压测: 下面就一…...
企业管理系统网站开发标书/青岛网站排名推广
前言: Servlet的作用: Servlet 是接口,是 JavaEE 规范之一。接口起到了规范的作用。Servlet 是 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。Servlet 是运行在服务器上的一个 java 小程序,它可以接…...
wordpress 斜杠/百度趋势搜索
自带的底部导航 在 app.json 中添加 , 所有小程序的页面都会显示出来 {"tabBar": {"list": [{"pagePath": "pages/index/index","iconPath":"","text": "首页"},{"pagePat…...
做自媒体需要用的网站/网络搜索优化
SELECT CONVERT(varchar(100), CAST(testFloat AS decimal(38,2)))SELECT STR(testFloat, 38, 2)从Excel中导入到sql2000,有一列“联系方式”变成了float类型,我想转换成nvarchar类型,用下面的语句select convert(nvarchar(30),convert(int,联…...