优达学城 Generative AI 课程1:GenAI Fundamentals

在这里插入图片描述

1 各编程练习内容的总结

1.1 Initial-Exercises部分

1. Exercise 1: Classification of Handwritten Digits Using an MLP

  • 目的:快速过一遍如何简单的调用 scikit-learn 库实现手写数字分类任务。
  • 概述:使用scikit-learn库各内置函数,流程包括:下载并加载数据集、创建模型、训练、计算模型精度、可视化训练效果。

2. Exercise 2: Generating One Token at a Time

  • 目的:快速过一遍如何简单的调用 HuggingFace 的相关库就能实现基于GPT2的文本生成任务。
  • 概述:使用 HuggingFacetransformers 库,调用GPT2预训练模型,实现文本生成任务(自己拟定一句话输入模型,然后GPT2模型基于这句话一个个预测下一个单词,相当于故事接龙)。

3. Exercise 3: PyTorch and Hugging Face Scavenger Hunt

  • 目的:了解 pytorchHuggingFace 的一些库。
  • 概述pytorch介绍了张量操作、网络模型类的构建、损失函数和优化器的调用、训练代码的编写。HuggingFace介绍了如何通过 transformers 库和 datasets 库来实现一个文本情感二分类任务的搭建,包括调用语言模型、下载语言模型的预训练权重、调用数据集、用内置函数tokenizer数据、推理数据。

4. Exercise 4: Transfer Learning Using MobileNetV3

  • 目的:了解使用pytorch库实现 分类任务的完整流程、迁移学习概念、新增网络结构、冻结部分网络参数。
  • 概述:使用pytorch调用内置的MobileNetV3网络结构和预训练权重,然后在该网络最后一层新增一个全连接层,输出维度变为10(因为数据集是10类),并且写个函数冻结该网络中除了最后新增的全连接层之外的所有参数,然后用Fashion-MNIST数据集对该网络进行10分类训练,并展示效果。

1.2 Foundation Models部分

1. Exercise 1: Use a Foundation Model to Build a Spam Email Classifier

  • 概述: (该文件中不知道是如何将数据发给模型的,应该是作者删除了上传代码,略过)大概是从datasets库中下载sms_spam垃圾邮件数据集,展示内容,重组格式,加上prompt前缀字符串,然后丢给模型,预测是否是垃圾邮件。(该文件中删除了将数据发送给模型API的部分,具体怎么发送给模型的不得而知,略过)

2. Exercise 2: Create a BERT Sentiment Classifier

  • 目的:基于Hugging FaceTransformers 库,调用 Distil-BERT 模型,实现IMDB电影评论数据集的情感分类的训练和评估。
  • 概述
    1. 加载数据:使用Hugging Facedatasets库加载IMDB电影评论数据集。
    2. 预处理:对数据集进行预处理,包括将文本转换为模型输入格式,通过tokenizer将评论文本转化为BERT模型可接受的输入。
    3. 加载模型+冻结参数:从transformers库加载distilbert-base-uncased模型,并冻结除分类层外的参数(方便后续快速微调训练)。
    4. 训练:调用transformers库中Trainer函数对模型进行训练。
    5. 评估:同样调用transformers库中trainer.evaluate()函数,对test集进行精度计算。
    6. 可视化:使用pandas库展示一些错误的预测结果。

3. Exercise 3: Full-fine Tuning BERT

  • 目的:跟Exercise 2很类似,只是用 Distil-BERT 模型进行垃圾邮件分类,训练时是解冻所有参数,进行全量微调。
  • 概述
    1. 加载数据集并切分:使用datasets库加载sms_spam垃圾邮件数据集(内置函数能够直接在加载数据集同时,通过相关参数进行traintest的按比例分割)。
    2. 可视化数据:浏览几个数据样本,了解dataset的组织结构。
    3. 预处理:从transformers库中加载模型的分词器,并对数据进行tokenizer,转成模型可接受格式。
    4. 加载模型+解冻所有参数
    5. 训练
    6. 评估
    7. 可视化

2 项目:Lightweight Fine-Tuning with LoRA

2.1 概述

项目源文件:https://github.com/ritvij-saxena/udacity-gen-ai-nanodegree/blob/main/LightweightFineTuning_completed.ipynb

个人总结:本大项目就是自己选个语言模型、选个数据集、选一种peft微调方法、然后对比一下预训练模型和经过peft微调后的模型在改数据集下的效果差距。

源文件中的方法选择

  1. peft方法:lora(调用peft库)
  2. 模型:GPT-2(调用transformers库)
  3. 评估方法:使用Huggingface Trainer:evaluate(调用transformers库)
  4. 数据集:烂番茄影评数据集(调用datasets库)

以上3个库,全部隶属于HuggingFace。

2.2 代码主要步骤

目的:基于 Hugging Face 的 transformers 库,使用 LoRA(Low-Rank Adaptation)技术对 GPT-2 模型进行参数高效微调,完成 Rotten Tomatoes 电影评论数据集的情感分类任务。

概述

  1. 加载数据:使用 Hugging Face 的 datasets 库加载 Rotten Tomatoes 电影评论数据集,并划分为训练集和测试集。数据包含评论文本和相应的情感标签。
  2. 预处理:对数据集进行预处理,步骤包括:
  • 加载 GPT-2 的 AutoTokenizer 分词器,将评论文本转换为 GPT-2 模型可接受的格式。
  • 设置填充 token(使用 GPT-2 的 eos_token 作为填充符号)。
  • 使用 tokenizer 将训练集和测试集中的文本进行分词、填充和截断,确保输入序列统一长度。
  1. 加载预训练模型+冻结参数
  • 使用 AutoModelForSequenceClassificationtransformers 库加载 GPT-2 模型,并将其用于序列分类任务(二分类:正面/负面情感)。
  • 冻结 GPT-2 模型的所有参数(后续该模型会和lora合并成新模型,新模型中只需要训练lora参数)。
  1. 定义评估函数
  • 编写 compute_metrics 函数,用于在评估过程中计算模型的预测准确率。
  1. 评估预训练模型
  • 使用 Hugging Face 的 Trainer 函数进行初步训练设置,包括模型、训练参数、数据集、评估指标等。
  • 对未进行微调的模型进行初步评估,计算并输出评估结果(如 eval_losseval_accuracy)。
  1. 设置 LoRA 配置
  • 使用 peft 库中的 LoraConfig,对 GPT-2 模型进行参数高效微调(PEFT)。LoraConfig 的设置包括:
    • 低秩矩阵的秩 r,LoRA 的缩放因子 lora_alpha,以及应用 LoRA 的特定 GPT-2 模块(c_attnc_proj)。
  • 调用 get_peft_model 内置函数,结合 GPT-2 模型和 LoRA 配置,创建 LoRA 模型。
  • 打印 LoRA 模型中的可训练参数(结果显示新增的lora参数仅占全网络参数的0.6%)。
  1. 重新定义数据集格式
  • 将数据集中的 label 列重命名为 labels,符合 Hugging Face 的 Trainer 格式要求。
  • 将数据集格式调整为适用于 PyTorch 的格式,包括 input_idsattention_masklabels 三个字段。
  1. 训练 LoRA 模型
  • 使用 Trainer 进行带有 LoRA 配置的 GPT-2 模型训练,具体步骤:
    • 设置训练参数,包括学习率、批次大小、训练轮次、权重衰减等。
    • 训练过程中采用 DataCollatorWithPadding 来自动填充批次数据,并使用 compute_metrics 函数计算训练和测试集上的准确率。
  1. 保存 LoRA 模型
  • 将训练完成的 LoRA 微调模型保存为可加载的预训练模型,便于后续任务中加载和使用。
  1. 加载保存的模型
  • 使用 AutoPeftModelForSequenceClassification 加载已经微调和保存的 LoRA 模型,并设置好模型的填充 token。
  1. LoRA 微调后的模型评估
  • 重新创建 Trainer,并再次对微调后的模型进行训练和评估,验证其性能。
  • 使用微调后的模型再次在验证集上进行评估,计算并打印模型的评估结果,包括准确率等关键指标。

2.3 预训练模型与 LoRA 微调后的模型效果对比

GPT-2(1.2亿参数版)预训练模型效果:

  • 评估结果
    • eval_loss: 4.8768
    • eval_accuracy: 0.4991
    • eval_runtime: 284.3872 秒
    • eval_samples_per_second: 3.748
    • eval_steps_per_second: 0.236

分析

  • 预训练模型在情感分类任务(烂番茄影评)上的表现较差,准确率接近随机猜测(约50%),损失值较高,表明模型尚未在特定任务上进行微调,未能充分捕捉情感分类的特征。
  • 运行时间较长,处理速度较慢,模型尚未针对特定任务进行优化。

LoRA 微调后效果:

  • 评估结果
    • eval_loss: 0.6225
    • eval_accuracy: 0.6998
    • eval_runtime: 253.769 秒
    • eval_samples_per_second: 4.201
    • eval_steps_per_second: 0.264

分析

  • LoRA 微调后的模型在情感分类任务上有了显著提升,准确率从 49.91% 提高到 69.98%,表现出较强的任务适应性。
  • 损失值显著下降,表明模型在训练过程中更好地捕捉到了情感分类任务的模式。
  • 微调后,模型运行时间缩短,处理速度有所提升(每秒处理的样本和步数增加),表明 LoRA 在降低计算开销的同时保持了模型的高效性。

结论:

  • 预训练模型 在未进行任务特定微调时效果较差,损失值高、准确率接近随机猜测,无法很好地完成情感分类任务。
  • LoRA 微调后的模型 通过引入低秩适应机制,显著提高了情感分类任务的准确率,并且在计算效率上也有所提升。LoRA 技术有效减少了微调时的参数数量,既保证了性能提升,又降低了训练开销,使得模型在特定任务上表现更加优异。

3 附录

3.1 HuggingFace 介绍

Hugging Face 是一个专注于自然语言处理(NLP)和机器学习领域的领先公司,以其开源库和工具链而闻名。它提供了一系列工具,帮助开发者轻松构建和使用深度学习模型,尤其是在NLP任务上。

Hugging Face 的核心库和平台:

1. Transformers

Hugging Face 的 Transformers 库是其最为著名的项目之一,它是一个开源的神经网络库,提供了大量预训练的模型和工具,用于处理广泛的NLP任务。这个库的核心优势在于:

  • 支持多种架构:如 BERT、GPT、T5、DistilBERT、RoBERTa 等。这些模型可以应用于任务如文本分类、翻译、文本生成、问答、情感分析等。
  • 无缝集成:Transformers 支持 PyTorch 和 TensorFlow,同时它还提供了简洁的API,便于用户快速加载预训练模型,并将其应用于特定任务。
  • 模型共享:通过 Hugging Face Model Hub,用户可以共享和下载来自世界各地开发者训练的模型。你可以直接使用 Hugging Face 提供的预训练模型,也可以基于自己的数据进行微调。

使用示例:

from transformers import pipeline

# 加载预训练的情感分析模型
classifier = pipeline("sentiment-analysis")
result = classifier("I love Hugging Face!")
print(result)
2. Datasets

Hugging Face Datasets 是另一个重要的库,专为处理大规模数据集而设计,特别适合 NLP 任务。它的特点包括:

  • 支持多种格式的数据集:如 CSV、JSON、Parquet等,用户可以方便地加载和处理各种格式的数据集。
  • 庞大的数据集仓库:与 Model Hub 类似,Datasets 提供了一个数据集库,用户可以轻松获取如 SQuAD、GLUE、IMDb 等常见的 NLP 数据集。
  • 高效处理大数据:Datasets 使用了 Apache Arrow,能够高效地处理大规模数据,并支持增量处理。

使用示例:

from datasets import load_dataset

# 加载 IMDb 影评数据集
dataset = load_dataset("imdb")
print(dataset)
3. Tokenizers

Tokenizers 库是一个高效的文本分词工具。分词是NLP模型中的关键步骤,Tokenizers 提供了一系列快速、灵活的分词工具,支持 BERT、GPT 等常见模型的分词方法。它主要特点如下:

  • 高效分词:基于 Rust 实现,具有极高的分词速度。
  • 支持多种分词算法:如 BPE(Byte Pair Encoding)、WordPiece、SentencePiece 等。
  • 处理大量文本:适合大规模语料的分词操作。

示例:

from transformers import AutoTokenizer

# 加载 BERT 分词器
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
tokens = tokenizer("Hugging Face is creating a new standard in NLP!")
print(tokens)
4. Hugging Face Model Hub

Model Hub 是 Hugging Face 提供的一个在线平台,用户可以共享、查找和下载各种预训练模型。无论是个人用户还是研究团队,都可以发布自己的模型,供社区使用。Model Hub 的核心功能包括:

  • 丰富的模型库:拥有数千个预训练模型,覆盖 NLP、计算机视觉等任务。
  • 模型管理与发布:开发者可以很方便地上传和管理自己的模型。
  • 版本控制:类似于 Git,支持对模型的版本进行管理。
5. Hugging Face Spaces

Hugging Face Spaces 是一个用于托管和展示机器学习应用的轻量级平台。开发者可以使用 Streamlit、Gradio 等框架,在 Spaces 上快速构建并展示他们的机器学习项目。它的优点包括:

  • 无缝集成:与 Hugging Face 生态系统无缝衔接,可以直接部署 Transformers 模型。
  • 互动界面:用户可以通过 Streamlit 或 Gradio 等简单构建用户交互界面,方便地展示自己的模型效果。
6. Gradio

Gradio 是一个轻量级的 Python 库,可以帮助开发者快速创建机器学习模型的 Web 界面。通过它,用户无需编写复杂的前端代码就可以轻松搭建一个在线的交互式工具,用来展示或测试自己的模型。

  • 快速搭建UI:几行代码就可以创建出图形用户界面,让非技术用户能够轻松体验模型。
  • 部署方便:集成到 Hugging Face 的 Spaces 平台后,用户可以快速发布自己的模型和界面。
7. Accelerate

Accelerate 是 Hugging Face 的一个工具库,旨在简化多GPU和分布式训练过程。它为用户提供了一种简单的API,使得他们能够快速利用多个GPU进行训练,而不必手动编写复杂的分布式训练代码。

Hugging Face 的优势

  • 开源与社区支持:Hugging Face 的库是完全开源的,用户可以自由使用、修改,并贡献自己的代码或模型。同时,Hugging Face 的社区活跃,支持丰富的教程、文档和讨论。
  • 跨领域支持:虽然 Hugging Face 起初专注于 NLP,但它现在也扩展到了其他领域,如计算机视觉(图像分类、生成模型)和语音处理(语音识别、语音合成)。
  • 易于微调与部署:无论是 NLP 任务中的迁移学习还是在自己的数据集上微调,Hugging Face 都提供了简洁的工具。此外,Model Hub 和 Spaces 让模型的部署变得极为简单。

总结

Hugging Face 已经成为机器学习和 NLP 领域的重要工具,凭借其开源的 Transformers 库、Datasets、Tokenizers 等工具,以及 Model Hub 等平台,它极大地简化了模型的使用、共享和部署流程。无论是研究人员、开发者,还是企业,Hugging Face 提供的生态系统都为他们在自然语言处理和深度学习中的需求提供了强有力的支持。

3.2 DistilBERT 模型介绍

DistilBERT 是由 Hugging Face 开发的一种轻量化版本的 BERT(Bidirectional Encoder Representations from Transformers)模型。它通过知识蒸馏(Knowledge Distillation)技术,在保持 BERT 性能的同时显著减少了模型的参数量和推理时间,从而大幅提升了模型的效率。

DistilBERT 的特点:

  1. 轻量化

    • DistilBERT 模型相比 BERT 体积减小了 40%,因此它的参数量更少,内存占用更小。
    • 虽然模型较小,但它在许多NLP任务上的表现仅比BERT稍微逊色,通常只损失了 不到3% 的精度。
  2. 训练速度更快

    • 由于参数减少,DistilBERT 的训练速度提高了 60%,推理过程也变得更快,非常适合在低资源环境或实时应用中使用。
  3. 保留BERT的双向特性

    • DistilBERT 保留了 BERT 模型的双向 Transformer 编码器,因此它依旧能够像 BERT 一样捕捉文本的双向上下文信息,这在 NLP 任务中是一个重要的优势。

DistilBERT 的核心技术:知识蒸馏

知识蒸馏是一种训练小模型的方法,核心思想是利用一个性能更好的大模型(在这个例子中是 BERT)作为“教师模型”,通过将教师模型的输出作为目标,训练出一个较小的“学生模型”(DistilBERT)。通过这种方式,DistilBERT 学习到了 BERT 模型的精华部分。

具体的训练步骤包括:

  1. 软目标学习:DistilBERT 学习 BERT 的软预测(soft predictions),而不是仅仅学习正确类别。这样,小模型能够更好地理解类别之间的相关性。
  2. 截断部分 Transformer 层:DistilBERT 使用了 BERT 模型中的一部分 Transformer 层,从12层减至6层,但依然保留了关键的上下文信息提取能力。
  3. 三重损失函数:为了增强性能,训练过程中引入了三种损失函数,包括:
    • 蒸馏损失:让 DistilBERT 的输出逼近 BERT 的输出。
    • 监督损失:传统的交叉熵损失,保证 DistilBERT 在下游任务中的表现。
    • Cosine loss:让 DistilBERT 和 BERT 的隐藏层输出保持一致。

DistilBERT 的应用场景:

由于其高效性和较小的模型体积,DistilBERT 适用于以下场景:

  • 边缘设备或移动设备:DistilBERT 更轻量,适合在计算资源有限的设备上运行。
  • 实时应用:由于其推理速度较快,DistilBERT 在实时 NLP 应用中表现出色,比如聊天机器人、实时情感分析等。
  • 低资源环境:如在有限内存或处理能力有限的服务器上,DistilBERT 可以作为高效的替代方案。

DistilBERT 的实际使用

在 Hugging Face 的 Transformers 库中,使用 DistilBERT 非常简单。例如,你可以通过以下代码加载和使用 DistilBERT 进行文本分类或其他任务:

from transformers import DistilBertTokenizer, DistilBertForSequenceClassification
from transformers import pipeline

# 加载预训练的DistilBERT模型和分词器
tokenizer = DistilBertTokenizer.from_pretrained('distilbert-base-uncased')
model = DistilBertForSequenceClassification.from_pretrained('distilbert-base-uncased')

# 使用pipeline进行情感分析
classifier = pipeline('sentiment-analysis', model=model, tokenizer=tokenizer)
result = classifier("Hugging Face's DistilBERT is great!")
print(result)

总结:

DistilBERT 是 BERT 的高效替代品,兼具较低的模型复杂度和较好的性能,非常适合资源有限的环境中应用。通过知识蒸馏,它在减少计算和内存开销的同时,依然保持了 BERT 模型的大部分效果,这使得它成为许多NLP任务中的首选模型之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值