掘金 人工智能 06月18日 14:34
🔥 Transformers实战:Text分类×SQuAD问答×CoNLL实体识别(含超参调优方案)
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文通过代码实战,详细介绍了如何使用Hugging Face Transformers库,快速掌握NLP领域的三大核心任务:文本分类(情感分析)、问答系统和命名实体识别。文章提供了从环境准备到模型训练、推理预测的完整流程,并总结了关键技巧,帮助读者快速构建工业级AI应用。

💻 文本分类实战:使用IMDB数据集进行情感分析,流程包括数据加载与预处理、模型训练和推理预测。具体操作是,首先使用`load_dataset`加载数据集,然后通过`AutoTokenizer`进行分词,接着使用`AutoModelForSequenceClassification`加载模型并进行训练,最后使用`pipeline`进行推理预测。

🤔 问答系统实战:基于SQuAD数据集构建问答系统,步骤包括加载问答数据集、训练问答模型和执行问答。流程是,加载`squad`数据集,使用`AutoTokenizer`进行分词,定义`preprocess_function`进行预处理,然后使用`AutoModelForQuestionAnswering`加载模型并进行训练,最后使用`pipeline`进行问答。

🏷️ 命名实体识别实战:使用CoNLL-2003数据集进行命名实体识别,涵盖数据预处理、训练NER模型和实体识别推理。首先加载`conll2003`数据集,使用`AutoTokenizer`进行分词,并定义`tokenize_and_align_labels`函数进行数据预处理,然后使用`AutoModelForTokenClassification`加载模型并训练,最后使用`pipeline`进行实体识别。

💡 核心技巧总结:文章总结了迁移学习优势、动态填充、混合精度训练、学习率调度和早停机制等关键技巧。例如,使用预训练模型可节省90%训练时间,采用线性衰减策略可使模型更稳定收敛,监控验证集损失可防止过拟合。

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院

本文将通过代码实战带你快速掌握NLP三大核心任务,使用Hugging Face Transformers库实现工业级AI应用开发。

一、环境准备

pip install transformers datasets torch tensorboard

二、文本分类实战(情感分析)

1. 数据加载与预处理

from datasets import load_datasetfrom transformers import AutoTokenizerdataset = load_dataset("imdb")tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")def tokenize_function(examples):    return tokenizer(examples["text"]padding="max_length", truncation=True)tokenized_datasets = dataset.map(tokenize_function, batched=True)

2. 模型训练

from transformers import AutoModelForSequenceClassification, TrainingArguments, Trainermodel = AutoModelForSequenceClassification.from_pretrained(    "distilbert-base-uncased", num_labels=2)training_args = TrainingArguments(    output_dir="./results",    evaluation_strategy="epoch",    learning_rate=2e-5,    per_device_train_batch_size=16,    num_train_epochs=3,)trainer = Trainer(    model=model,    args=training_args,    train_dataset=tokenized_datasets["train"],    eval_dataset=tokenized_datasets["test"],)trainer.train()

3. 推理预测

from transformers import pipelineclassifier = pipeline("text-classification", model=model, tokenizer=tokenizer)result = classifier("This movie was absolutely fantastic!")print(result)  # [{'label''POSITIVE''score': 0.999}]

三、问答系统实战(SQuAD数据集)

1. 加载问答数据集

dataset = load_dataset("squad")tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")def preprocess_function(examples):    questions = [q.strip() for q in examples["question"]]    inputs = tokenizer(        questions,        examples["context"],        max_length=384,        truncation="only_second",        return_offsets_mapping=True,        padding="max_length",    )    return inputstokenized_squad = dataset.map(preprocess_function, batched=True)

2. 训练问答模型

from transformers import AutoModelForQuestionAnsweringmodel = AutoModelForQuestionAnswering.from_pretrained("distilbert-base-uncased")training_args = TrainingArguments(    output_dir="./qa_results",    evaluation_strategy="epoch",    learning_rate=3e-5,    per_device_train_batch_size=12,    num_train_epochs=2,)trainer = Trainer(    model=model,    args=training_args,    train_dataset=tokenized_squad["train"],    eval_dataset=tokenized_squad["validation"],)trainer.train()

3. 执行问答

question = "What does NLP stand for?"context = "Natural Language Processing (NLP) is a subfield of artificial intelligence."qa_pipeline = pipeline("question-answering", model=model, tokenizer=tokenizer)result = qa_pipeline(question=question, context=context)print(result)# {'score': 0.982, 'start': 0, 'end': 24, 'answer': 'Natural Language Processing'}

四、命名实体识别实战(CoNLL-2003)

1. 数据预处理

dataset = load_dataset("conll2003")tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")label_list = dataset["train"].features["ner_tags"].feature.namesdef tokenize_and_align_labels(examples):    tokenized_inputs = tokenizer(        examples["tokens"],         truncation=True,        is_split_into_words=True    )        labels = []    for i, label in enumerate(examples["ner_tags"]):        word_ids = tokenized_inputs.word_ids(batch_index=i)        previous_word_idx = None        label_ids = []        for word_idx in word_ids:            if word_idx is None:                label_ids.append(-100)            elif word_idx != previous_word_idx:                label_ids.append(label[word_idx])            else:                label_ids.append(-100)            previous_word_idx = word_idx        labels.append(label_ids)        tokenized_inputs["labels"] = labels    return tokenized_inputstokenized_dataset = dataset.map(tokenize_and_align_labels, batched=True)

2. 训练NER模型

from transformers import AutoModelForTokenClassificationmodel = AutoModelForTokenClassification.from_pretrained(    "bert-base-cased",     num_labels=len(label_list)    training_args = TrainingArguments(    output_dir="./ner_results",    evaluation_strategy="epoch",    learning_rate=2e-5,    per_device_train_batch_size=16,    num_train_epochs=3,)trainer = Trainer(    model=model,    args=training_args,    train_dataset=tokenized_dataset["train"],    eval_dataset=tokenized_dataset["validation"],)trainer.train()

3. 实体识别推理

from transformers import pipelinener_pipeline = pipeline("ner", model=model, tokenizer=tokenizer)sample_text = "Apple was founded by Steve Jobs in Cupertino, California."entities = ner_pipeline(sample_text)for entity in entities:    print(f"{entity['word']} -> {label_list[entity['entity'][-1]]}")    # Apple -> B-ORG# Steve Jobs -> B-PER# Cupertino -> B-LOC# California -> B-LOC

五、核心技巧总结

迁移学习优势:使用预训练模型可节省90%训练时间

动态填充:使用DataCollator提升训练效率

混合精度训练:添加fp16=True参数加速训练

学习率调度:采用线性衰减策略更稳定收敛

早停机制:监控验证集损失防止过拟合

六、进阶学习方向

关键提示:实践时注意调整超参数(batch size、学习率)以适应你的硬件配置,小显存设备建议使用distilbert等轻量模型。更多AI大模型应用开发学习视频内容和资料,尽在聚客AI学院

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

NLP Hugging Face 文本分类 问答系统 命名实体识别
相关文章