昇思25天学习打卡营第16天|基于MindSpore通过GPT实现情感分类

文章目录

昇思MindSpore应用实践

本系列文章主要用于记录昇思25天学习打卡营的学习心得。

1、基于MindSpore通过GPT实现情感分类
GPT 模型(Generative Pre-Training)简介

GPT-1模型是一种基于神经网络的自回归(AR)语言模型。该模型使用了"Transformer"的编解码架构,一种新型的序列到序列(Seq2Seq)模型,能够在处理长序列数据时避免传统的循环神经网络(Recurrent Neural Network,RNN)中存在的梯度消失问题。

Transformer架构中的关键组件包括多头自注意力机制和残差连接等,GPT使用了Transformer的解码器部分。

预训练技术:GPT-1使用了一种称为"生成式预训练"(Generative Pre-Training,GPT)的技术。

预训练分为两个阶段:预训练和微调(fine-tuning)。

在预训练阶段,GPT-1使用了大量的无标注文本数据集,例如维基百科和网页文本等。通过最大化预训练数据集上的log-likelihood来训练模型参数。

微调 阶段,GPT-1将预训练模型的参数用于特定的自然语言处理任务,如文本分类和问答系统等。

多层模型:GPT-1模型由多个堆叠的Transformer编码器组成,每个编码器包含多个注意力头和前向神经网络。这使得模型可以从多个抽象层次对文本进行建模,从而更好地捕捉文本的语义信息。

通过使用上述预训练任务,研究团队成功地训练出了一个大规模的语言模型GPT。该模型在多项语言理解任务上取得了显著的成果,包括阅读理解、情感分类和自然语言推理等任务。

imdb影评数据集情感分类
python 复制代码
import os

import mindspore
from mindspore.dataset import text, GeneratorDataset, transforms
from mindspore import nn

from mindnlp.dataset import load_dataset

from mindnlp._legacy.engine import Trainer, Evaluator
from mindnlp._legacy.engine.callbacks import CheckpointCallback, BestModelCallback
from mindnlp._legacy.metrics import Accuracy

imdb_ds = load_dataset('imdb', split=['train', 'test'])
imdb_train = imdb_ds['train']
imdb_test = imdb_ds['test']

imdb_train.get_dataset_size()

import numpy as np

def process_dataset(dataset, tokenizer, max_seq_len=512, batch_size=4, shuffle=False):
    is_ascend = mindspore.get_context('device_target') == 'Ascend'
    def tokenize(text):
        if is_ascend:
            tokenized = tokenizer(text, padding='max_length', truncation=True, max_length=max_seq_len)
        else:
            tokenized = tokenizer(text, truncation=True, max_length=max_seq_len)
        return tokenized['input_ids'], tokenized['attention_mask']

    if shuffle:
        dataset = dataset.shuffle(batch_size)

    # map dataset
    dataset = dataset.map(operations=[tokenize], input_columns="text", output_columns=['input_ids', 'attention_mask'])
    dataset = dataset.map(operations=transforms.TypeCast(mindspore.int32), input_columns="label", output_columns="labels")
    # batch dataset
    if is_ascend:
        dataset = dataset.batch(batch_size)
    else:
        dataset = dataset.padded_batch(batch_size, pad_info={'input_ids': (None, tokenizer.pad_token_id),
                                                             'attention_mask': (None, 0)})

    return dataset
2、Tokenizer导入预训练好的GPT
python 复制代码
from mindnlp.transformers import GPTTokenizer
# tokenizer
gpt_tokenizer = GPTTokenizer.from_pretrained('openai-gpt')

# add sepcial token: <PAD>
special_tokens_dict = {
    "bos_token": "<bos>",
    "eos_token": "<eos>",
    "pad_token": "<pad>",
}
num_added_toks = gpt_tokenizer.add_special_tokens(special_tokens_dict)

# split train dataset into train and valid datasets,训练集和验证集分割
imdb_train, imdb_val = imdb_train.split([0.7, 0.3])

dataset_train = process_dataset(imdb_train, gpt_tokenizer, shuffle=True)
dataset_val = process_dataset(imdb_val, gpt_tokenizer)
dataset_test = process_dataset(imdb_test, gpt_tokenizer)

next(dataset_train.create_tuple_iterator())

[Tensor(shape=[4, 512], dtype=Int64, value=
 [[11295,   246,   244 ... 40480, 40480, 40480],
  [  616,   509,   246 ... 40480, 40480, 40480],
  [  616,  4894,   498 ... 40480, 40480, 40480],
  [  589,   500,   589 ... 40480, 40480, 40480]]),
 Tensor(shape=[4, 512], dtype=Int64, value=
 [[1, 1, 1 ... 0, 0, 0],
  [1, 1, 1 ... 0, 0, 0],
  [1, 1, 1 ... 0, 0, 0],
  [1, 1, 1 ... 0, 0, 0]]),
 Tensor(shape=[4], dtype=Int32, value= [0, 0, 0, 1])]
3、基于预训练的GPT微调实现情感分类
python 复制代码
from mindnlp.transformers import GPTForSequenceClassification
from mindspore.experimental.optim import Adam

# set bert config and define parameters for training
model = GPTForSequenceClassification.from_pretrained('openai-gpt', num_labels=2)
model.config.pad_token_id = gpt_tokenizer.pad_token_id
model.resize_token_embeddings(model.config.vocab_size + 3)

optimizer = nn.Adam(model.trainable_params(), learning_rate=2e-5)

metric = Accuracy()

# define callbacks to save checkpoints
ckpoint_cb = CheckpointCallback(save_path='checkpoint', ckpt_name='gpt_imdb_finetune', epochs=1, keep_checkpoint_max=2)
best_model_cb = BestModelCallback(save_path='checkpoint', ckpt_name='gpt_imdb_finetune_best', auto_load=True)

trainer = Trainer(network=model, train_dataset=dataset_train,
                  eval_dataset=dataset_train, metrics=metric,
                  epochs=1, optimizer=optimizer, callbacks=[ckpoint_cb, best_model_cb],
                  jit=False)

trainer.run(tgt_columns="labels")

Reference

1\] [北方的郎-从GPT-1到GPT-4,GPT系列模型详解](https://zhuanlan.zhihu.com/p/627901828) \[2\] [昇思大模型平台](https://xihe.mindspore.cn/projects) \[3\] [昇思官方文档-基于MindSpore通过GPT实现情感分类](https://cloud-3347ffc3-601b-44a2-9fcb-0024729a991a.xihe.mindspore.cn/lab/tree/%E5%BA%94%E7%94%A8%E5%AE%9E%E8%B7%B5/LLM%E5%8E%9F%E7%90%86%E5%92%8C%E5%AE%9E%E8%B7%B5/%E5%9F%BA%E4%BA%8EMindSpore%E9%80%9A%E8%BF%87GPT%E5%AE%9E%E7%8E%B0%E6%83%85%E6%84%9F%E5%88%86%E7%B1%BB.ipynb)

相关推荐
今天你AiPy了吗10 分钟前
OpenClaw平替来了!AiPy让AI办公更简单
人工智能·gpt·aigc·ai编程
scott19851218 分钟前
扩散模型之(二十)Stable Diffusion的运作原理
深度学习·stable diffusion·扩散模型·生成式
YuanDaima204826 分钟前
解决Conda环境下RTX 50系列显卡PyTorch+Transformers+PEFT微调报错
人工智能·pytorch·笔记·python·深度学习·机器学习·conda
适应规律1 小时前
深度学习第四版
人工智能·深度学习
八角Z1 小时前
从行为惯性到正向认同:留守问题青年在数字社群中的风险机制与干预策略研究
科技·深度学习·创业创新
枫叶林FYL1 小时前
MCP 实现深度技术报告
人工智能·深度学习
iiiiii111 小时前
【LLM学习笔记】Batch Normalization vs Layer Normalization,为什么 NLP 中使用 LN 而非 BN
笔记·深度学习·学习·语言模型·大模型·llm·transformer
Elastic 中国社区官方博客1 小时前
从判断列表到训练好的 Learning to Rank( LTR )模型
大数据·数据库·人工智能·深度学习·elasticsearch·搜索引擎·全文检索
卡梅德生物科技小能手1 小时前
深度解析先天免疫核心受体:TLR2(CD282)的分子机制、信号通路与药物研发技术路径
经验分享·深度学习·生活
HyperAI超神经1 小时前
在线教程丨华中科大与小红书 hi lab开源dots.mocr,SOTA级OCR模型完美还原文档结构,图形也能转 SVG
人工智能·深度学习·学习·机器学习·gpu·orc·vllm