自然语言处理入门与实战——基于Transformer的文本分类
文章目录
-
前言:从词袋模型到上下文感知
-
第一章:文本预处理核心技术
-
2.1. 文本清洗:去除噪声与标准化
-
2.2. 分词与子词分词
-
2.3. 停用词去除与词干/词形还原
-
-
第二章:文本表示与词向量
-
3.1. 独热表示与TF-IDF
-
3.2. Word2Vec与GloVe原理简介
-
3.3. 使用预训练词向量
-
-
第三章:序列模型基础:RNN与LSTM
-
4.1. RNN的结构与梯度消失问题
-
4.2. LSTM的门控机制
-
4.3. 使用LSTM进行文本分类
-
-
第四章:Transformer架构详解
-
5.1. 自注意力机制的核心思想
-
5.2. 编码器-解码器结构
-
5.3. 位置编码
-
-
第五章:使用Hugging Face Transformers库进行实战
-
6.1. Hugging Face生态系统介绍
-
6.2. 加载预训练的BERT模型与分词器
-
6.3. 微调BERT用于文本分类任务
-
-
第六章:模型评估与错误分析
-
总结与展望
-
参考文献
前言:从词袋模型到上下文感知
自然语言处理旨在让计算机理解和处理人类语言。早期的方法基于词袋模型和TF-IDF,它们忽略了词的顺序和上下文信息。Word2Vec等词向量模型虽然引入了语义,但仍是静态表示。Transformer架构的提出,特别是基于其的BERT、GPT等模型,彻底改变了NLP的格局。它们通过自注意力机制实现了真正的上下文感知,在几乎所有NLP任务上都取得了state-of-the-art的结果。本篇教程将从传统的文本处理技术讲起,过渡到RNN/LSTM,并最终聚焦于Transformer和Hugging Face库的使用,带领读者微调一个BERT模型来完成电影评论情感分类任务。

由于篇幅,咱们节选重要的部分来阐释——
核心内容节选(第五章:使用Hugging Face Transformers库进行实战)
Hugging Face的transformers库极大地降低了使用SOTA模型的门槛。我们以情感分析任务为例,展示如何微调BERT。
6.2 加载预训练的BERT模型与分词器
BERT有特定的分词方式,我们需要使用与其预训练时一致的分词器。
python代码
from transformers import AutoTokenizer, AutoModelForSequenceClassification, TrainingArguments, Trainer
from datasets import load_dataset
import numpy as np
from sklearn.metrics import accuracy_score
# 指定模型名称
model_name = "bert-base-uncased"
# 加载分词器和模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 指定分类标签数,对于情感分析(正面/负面)是2
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)
# 加载数据集(以IMDB电影评论数据集为例)
dataset = load_dataset("imdb")
6.3 微调BERT用于文本分类任务
我们需要对数据进行预处理,将其转换为BERT需要的格式。
python代码
# 定义分词函数
def tokenize_function(examples):
# 对文本进行分词、截断和填充
return tokenizer(examples["text"], padding="max_length", truncation=True, max_length=256)
# 应用分词函数到整个数据集
tokenized_datasets = dataset.map(tokenize_function, batched=True)
# 为了保持格式兼容,重命名标签列
tokenized_datasets = tokenized_datasets.rename_column("label", "labels")
# 设置数据格式为PyTorch张量
tokenized_datasets.set_format("torch", columns=["input_ids", "attention_mask", "labels"])
# 定义计算评估指标的函数
def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
return {"accuracy": accuracy_score(labels, predictions)}
# 定义训练参数
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=3,
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
warmup_steps=500,
weight_decay=0.01,
logging_dir="./logs",
evaluation_strategy="epoch", # 每个epoch后在验证集上评估
save_strategy="epoch",
)
# 初始化Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"].shuffle(seed=42).select(range(1000)), # 为演示,只取1000个样本
eval_dataset=tokenized_datasets["test"].shuffle(seed=42).select(range(200)),
tokenizer=tokenizer,
compute_metrics=compute_metrics,
)
# 开始训练
trainer.train()
# 保存微调后的模型
trainer.save_model("./my_finetuned_bert")
通过上述代码,我们成功地利用一个在大量文本上预训练过的BERT模型,通过在其顶部添加一个分类头,并在特定的情感分析数据上进行微调,使其适应了新的任务。这个过程通常只需要相对较少的数据和几个epoch的训练就能达到极高的性能。
参考文献
-
Vaswani, A., et al. (2017). Attention is All You Need. Advances in Neural Information Processing Systems.
-
Devlin, J., Chang, M. W., Lee, K., & Toutanova, K. (2019). BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. Proceedings of the 2019 Conference of the North American Chapter of the Association for Computational Linguistics.
-
Wolf, T., et al. (2020). Transformers: State-of-the-Art Natural Language Processing. Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing.
-
Jurafsky, D., & Martin, J. H. (2020). Speech and Language Processing. Pearson.
更多推荐
所有评论(0)