在自然语言处理(NLP)领域,BERT(Bidirectional Encoder Representations from Transformers)已成为许多文本分类任务的基准模型。然而,随着新模型的出现和技术的不断进步,BERT在某些情况下可能不是最优选择,尤其是在计算资源有限的环境中。为了提高训练效率和模型精度,最近的研究和技术发展提供了像 Deepseek R1 这样的优化模型。
本文将展示如何利用 Deepseek R1 模型来优化和加速传统 BERT 模型在 NLP 任务中的表现,具体来说是文本分类任务。我们将基于 Hugging Face 提供的 transformers 库以及 datasets 库,展示如何进行模型的微调、训练和评估。
Deepseek R1 的优化优势
- 性能表现出色
媲美顶尖模型:在数学、代码和推理任务上可与 OpenAI o1 媲美 ,在世界大模型排名 arena 上,基准测试升至全类别大模型第三 ,在风格控制类模型分类中与 OpenAI o1 并列第一。
高效处理数据:能在短时间内完成大量数据的处理和分析,利用分布式计算架构和高效的索引机制,可实现毫秒级响应。
泛化能力强大:即使面对未知领域也能迅速适应和学习,对不同场景和类型的任务都有较好的适应性。
- 技术创新独特
强化学习驱动:后训练阶段大规模使用强化学习技术,仅需少量标注数据即可显著提升模型性能,且证明了直接强化学习在大模型训练中的可行性。
构建智能训练场:由动态题目生成系统、过程验证体系和协同工作机制构成,可自动生成更难的变体题,并实时验证解题过程逻辑是否自洽,能提升模型推理能力。
- 开源开放共享
采用 MIT 许可协议:允许任何人自由地使用、修改、分发和商业化该模型,包括模型权重和输出,为开发者提供了极大的便利和创作空间。
开源多个模型:除了开源 Deepseek-R1-zero 和 Deepseek-R1 两个 660b 模型外,还通过输出蒸馏了 6 个小模型开源给社区,其中 32b 和 70b 模型在多项能力上可对标 OpenAI o1-mini,降低了 AI 应用门槛,赋能开源社区发展。
- 应用成本较低
训练成本低:预训练费用只有 557.6 万美元,在 2048 块英伟达 H800 GPU 集群上运行 55 天完成,仅是 OpenAI GPT-4o 模型训练成本的不到十分之一。
API 定价低:Deepseek R1 服务对每百万输入 token 收取 0.55 美元,对每百万输出 token 收取 2.19 美元 / 百万,而 OpenAI 最新版 o1 模型的相应收费分别为 15 美元 / 百万和 60 美元 / 百万。
对于大家来说,性能和开源最为重要,没了性能,大家的工作效率大大降低;模型开源了,这样对于大众来讲可以做的工作范围就可以无限延伸了
如何更便捷的使用Deepseek R1?
这里我推荐一个平台蓝耘云智算 ,平台可以一键启动Deepseek应用,无需自己部署,是不是十分的便捷呢~
只需在应用市场找到对应模型,部署即可
当然我这里已经有了,我们选择开机
等待片刻,我们选择快速启动应用
案例演示
我在网上找了一个情感分析的NLP小案例
python
import torch
from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments
from datasets import load_dataset
from tqdm import tqdm # 导入 tqdm 库
# 1. 加载预训练模型和tokenizer
model_name = "bert-base-chinese"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name)
# 2. 加载数据集 (例如:IMDB情感分类数据集)
dataset = load_dataset("imdb")
# 3. 数据预处理:将文本转换为token
def tokenize_function(examples):
return tokenizer(examples['text'], padding='max_length', truncation=True)
# 应用tokenizer到训练和测试集
tokenized_datasets = dataset.map(tokenize_function, batched=True)
# 4. 准备训练和验证数据集
train_dataset = tokenized_datasets["train"]
test_dataset = tokenized_datasets["test"]
# 5. 设置训练参数
training_args = TrainingArguments(
output_dir="./results", # 输出目录
evaluation_strategy="epoch", # 每个epoch后评估
learning_rate=2e-5, # 学习率
per_device_train_batch_size=16, # 每个设备的训练批次大小
per_device_eval_batch_size=64, # 每个设备的评估批次大小
num_train_epochs=3, # 训练轮数
weight_decay=0.01, # 权重衰减
logging_dir='./logs', # 用于存储日志的目录
logging_steps=10, # 每10步记录一次日志
load_best_model_at_end=True, # 训练完后,加载最佳模型
metric_for_best_model='accuracy', # 根据准确率选择最佳模型
)
# 6. 初始化Trainer对象
trainer = Trainer(
model=model, # 预训练模型
args=training_args, # 训练参数
train_dataset=train_dataset, # 训练数据集
eval_dataset=test_dataset, # 验证数据集
)
# 7. 训练模型并添加进度条
# 使用 tqdm 包装训练过程
for epoch in range(training_args.num_train_epochs):
print(f"\nTraining Epoch {epoch + 1}/{training_args.num_train_epochs}...")
# 使用 tqdm 显示训练进度
progress_bar = tqdm(range(len(train_dataset)), desc="Training", unit="batch")
for batch in progress_bar:
trainer.training_step(batch)
progress_bar.update(1)
# 8. 在测试集上评估模型并显示进度条
print("\nEvaluating model...")
progress_bar = tqdm(range(len(test_dataset)), desc="Evaluating", unit="batch")
for batch in progress_bar:
trainer.evaluate(batch)
progress_bar.update(1)
# 9. 输出评估结果
results = trainer.evaluate()
print("\nEvaluation Results:", results)
接下来我们使用Deepseek进行优化
问:帮我修改优化上述代码,并给我生成修改后的代码
答:
python
import torch
from transformers import BertTokenizer, BertForSequenceClassification, TrainingArguments, Trainer
from datasets import load_dataset
from tqdm import tqdm
# 1. 加载预训练模型和tokenizer
model_name = "bert-base-chinese"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name)
# 2. 加载数据集 (例如:IMDB情感分类数据集)
_dataset = load_dataset("imdb")
# 3. 数据预处理:将文本转换为token
def tokenize_function(examples):
return tokenizer(
examples['text'],
max_length=128, # 设置固定最大长度(建议使用模型的常用长度,如128或256)
padding='max_length',
truncation=True,
return_tensors='pt'
)
# 应用tokenizer到训练和测试集
tokenized_datasets = _dataset.map(tokenize_function, batched=True)
# 4. 准备训练和验证数据集
train_dataset = tokenized_datasets["train"]
test_dataset = tokenized_datasets["test"]
# 5. 设置训练参数
training_args = TrainingArguments(
output_dir="./results", # 输出目录
evaluation_strategy="epoch", # 每个epoch后评估
learning_rate=2e-4, # 学习率(调整为更常见的值)
per_device_train_batch_size=32, # 训练批次大小(增加批量大小以加快训练)
per_device_eval_batch_size=64, # 评估批次大小
num_train_epochs=3, # 训练轮数
weight_decay=0.01, # 权重衰减
logging_dir='./logs', # 日志存储目录
logging_steps=10, # 每10步记录一次日志
load_best_model_at_end=True, # 训练完后加载最佳模型
metric_for_best_model='accuracy' # 根据准确率选择最佳模型
)
# 6. 初始化Trainer对象
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=test_dataset
)
# 7. 训练模型并添加进度条
# 使用 DataLoader 加载数据以提高效率
from torch.utils.data import DataLoader
train_loader = DataLoader(train_dataset, batch_size=training_args.per_device_train_batch_size)
test_loader = DataLoader(test_dataset, batch_size=training_args.per_device_eval_batch_size)
for epoch in range(training_args.num_train_epochs):
print(f"\nTraining Epoch {epoch + 1}/{training_args.num_train_epochs}...")
# 使用 tqdm 显示训练进度
progress_bar = tqdm(total=len(train_loader), desc="Training", unit="batch")
for batch in train_loader:
outputs = model(**batch['input_ids'])
loss = outputs.loss
trainer.training_step(batch, loss)
progress_bar.update(1)
# 8. 在测试集上评估模型并显示进度条
print("\nEvaluating model...")
progress_bar = tqdm(total=len(test_loader), desc="Evaluating", unit="batch")
for batch in test_loader:
outputs = model(**batch['input_ids'])
trainer.evaluate(batch)
progress_bar.update(1)
# 9. 输出评估结果
results = trainer.evaluate()
print("\nEvaluation Results:", results)
# 10.保存最佳模型(根据metric_for_best_model)
if training_args.load_best_model_at_end:
best_model = trainer.best_model
print(f"Best model saved with accuracy: {best_model.metrics['accuracy']: .4f}")
下面是模型为我们提供的几条主要优化点:
主要优化点:
- 数据预处理 :
设置了固定的 max_length,避免了句子过长或过短的问题。
使用 return_tensors='pt' 返回适合模型输入的张量形式。 - 训练参数调整 :
增加了 learning_rate 到 2e-4,使得学习过程更稳健。
提高了 per_device_train_batch_size 和 per_device_eval_batch_size 以加快数据处理速度。
优化了其他超参数,使其更符合一般的训练设置。 - 使用 DataLoader 加载数据 :
使用 DataLoader 来加载训练集和测试集,提升数据加载的效率和稳定性。 - 评估过程改进 :
在评估时保留了原始的 evaluate 方法,同时实现了自己的评估循环。
输出详细的评估结果,便于后续分析。 - 保存最佳模型 :
根据 metric_for_best_model 参数,自动选择准确率最高的模型进行保存。 - 日志记录优化 :
增加了对训练过程和测试过程的进度条显示,方便监控训练状态。
设置了合理的日志记录步骤和存储路径,确保重要信息不丢失。 - 代码结构清晰 :
将关键部分(如数据加载、训练循环、评估循环)分离,便于理解和维护。
如何使用Deepseek R1辅助我们进行AI模型优化的简单步骤如上,其实就是使用文字进行引导,让模型知道你想干啥就可以了,但是有时候难免会报错这时候就要见机行事了,上述代码可以因为数据集会报错,这时候我们最好的版本或许的升级库,或者是在网上下载好数据集,然后调用本地的数据,总的来说活学活用为上上策~
当然我们也可以问问模型,现如今主流的NLP模型是什么呀?它会帮我们罗列一些,但这并不一定的最好的,但是一定不会差,这对于我们初学者是十分友好的~
结语
本文通过实际案例演示了如何利用 Deepseek R1 模型来优化传统 BERT 模型在情感分析任务中的表现,这极大的提高了我们工作的效率,无需为优化模型苦恼,Deepseek R1可以帮你扩宽思路;最后我将蓝耘云智算的注册链接贴出来,不想麻烦的,或者只想体验一下模型的小伙伴可以试试~
注册链接:https://cloud.lanyun.net//#/registerPage?promoterCode=0131
