文章目录

  1. 前言:从词袋模型到上下文感知

  2. 第一章:文本预处理核心技术

    • 2.1. 文本清洗:去除噪声与标准化

    • 2.2. 分词与子词分词

    • 2.3. 停用词去除与词干/词形还原

  3. 第二章:文本表示与词向量

    • 3.1. 独热表示与TF-IDF

    • 3.2. Word2Vec与GloVe原理简介

    • 3.3. 使用预训练词向量

  4. 第三章:序列模型基础:RNN与LSTM

    • 4.1. RNN的结构与梯度消失问题

    • 4.2. LSTM的门控机制

    • 4.3. 使用LSTM进行文本分类

  5. 第四章:Transformer架构详解

    • 5.1. 自注意力机制的核心思想

    • 5.2. 编码器-解码器结构

    • 5.3. 位置编码

  6. 第五章:使用Hugging Face Transformers库进行实战

    • 6.1. Hugging Face生态系统介绍

    • 6.2. 加载预训练的BERT模型与分词器

    • 6.3. 微调BERT用于文本分类任务

  7. 第六章:模型评估与错误分析

  8. 总结与展望

  9. 参考文献

前言:从词袋模型到上下文感知

自然语言处理旨在让计算机理解和处理人类语言。早期的方法基于词袋模型和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的训练就能达到极高的性能。

参考文献

  1. Vaswani, A., et al. (2017). Attention is All You Need. Advances in Neural Information Processing Systems.

  2. 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.

  3. 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.

  4. Jurafsky, D., & Martin, J. H. (2020). Speech and Language Processing. Pearson.

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐