我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解基于Transformer实现电影评论星级分类任务

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解基于Transformer实现电影评论星级分类任务

Transformer模型概述

Transformer是一种用于序列到序列学习的神经网络架构,专门用于处理输入和输出序列之间的依赖关系。该模型被广泛应用于机器翻译、音频转录、语言生成等多个自然语言处理领域。

Transformer基于attention机制来实现序列到序列的学习。 在RNN(循环神经网络)中,网络必须按顺序遍历每个单词,并在每个时间步计算隐层表示。 这样,在长段文本中,信息可能会从网络的起点传递到终点,这导致了难以捕捉远距离依赖关系的问题。而attention机制可以根据输入序列中的词与其它所有词的相关性分配不同的权重,从而突破了序列到序列中的局限。

具体来说,一个Transformer模型由编码器(encoder)和解码器(decoder)两部分组成。编码器用于接收输入序列,解码器用于生成输出序列。每个编码器和解码器均包含多头attention机制、前馈网络以及残差连接等组件。

在一个典型的Transformer模型中,首先将输入序列通过嵌入层进行向量化,然后将向量表示作为Transformer的第一层输入。处理完输入向量之后,下一层就是多头attention层,其中每个头(head)都可以计算出不同的注意力权重向量(也称为attention mask)。最后,利用残差连接和skip connection机制使transformer更易于训练。

数据集准备

在此任务中,我们将使用来自IMDB的电影评论数据集,该数据集包含50,000条有标签的电影评论,每个评论标记为正面或负面情感。 其中25,000个用于训练,另外25,000个用于测试。

由于Transformer是对token进行操作,所以我们需要对文本的每个单词进行编码。一种常用的方法是使用Bert Tokenizer。GPT-2等预训练模型会使用特定的tokenizer。选择最新版本的transformers包可以快速实现这些操作:

!pip install transformers

接着加载tokenizer:

from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

上述操作将下载并加载适用于bert的tokenizer。 下一步是读取IMDB数据集的内容。 在本文中,我们将使用此处的已处理好的CSV形式数据:drive.google.com/file/d/1b_b…

import pandas as pd
train_df = pd.read_csv('imdb_train.csv')
test_df = pd.read_csv('imdb_test.csv')

由于Transformer模型需要固定长度的输入序列,我们选择了max_length为100并对所有评论进行padding操作:

train_inputs = tokenizer(list(train_df['review']), padding=True, truncation=True, max_length=100)
test_inputs = tokenizer(list(test_df['review']), padding=True, truncation=True, max_length=100)

现在我们可以将输入和标签分别转换成torch Tensor类型:

import torch
train_labels = torch.tensor(list(train_df['sentiment'].replace({'pos': 1, 'neg':0})))
test_labels = torch.tensor(list(test_df['sentiment'].replace({'pos': 1, 'neg':0})))

train_encoded_dict = {
    'input_ids': torch.tensor(train_inputs['input_ids']),
    'token_type_ids': torch.tensor(train_inputs['token_type_ids']),
    'attention_mask': torch.tensor(train_inputs['attention_mask']),
    'labels': train_labels
}

test_encoded_dict = {
    'input_ids': torch.tensor(test_inputs['input_ids']),
    'token_type_ids': torch.tensor(test_inputs['token_type_ids']),
    'attention_mask': torch.tensor(test_inputs['attention_mask']),
    'labels': test_labels
}

模型训练

在此任务中,我们将使用PyTorch库实现Transformer模型。 PyTorch是一种基于Python的科学计算包,其灵活性和易用性使其成为深度学习领域最常用的库之一。

可以使用Hugging Face的Transformers实现预先训练好的BERT模型:

from transformers import BertForSequenceClassification, AdamW, BertConfig
model = BertForSequenceClassification.from_pretrained(
    "bert-base-uncased",
    num_labels = 2,
    output_attentions = False,
    output_hidden_states = False,
)

然后,我们需要定义优化器、损失函数和批大小等训练超参数:

optimizer = AdamW(model.parameters(), lr = 2e-5, eps = 1e-8)

from torch.utils.data import DataLoader, RandomSampler, SequentialSampler
batch_size = 32
train_dataloader = DataLoader(train_encoded_dict, sampler = RandomSampler(train_encoded_dict), batch_size = batch_size)
test_dataloader = DataLoader(test_encoded_dict, sampler = SequentialSampler(test_encoded_dict), batch_size = batch_size)

from transformers import get_linear_schedule_with_warmup
epochs = 4
total_steps = len(train_dataloader) * epochs
scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps = 0, num_training_steps = total_steps)
loss_fn = torch.nn.CrossEntropyLoss()

最后,我们可以定义模型的训练过程,并进行模型训练:

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
model.train()

total_train_loss = 0
for epoch_i in range(epochs):
    print(f"{'':^5}Epoch:{epoch_i + 1:^3}")
    for step, batch in enumerate(train_dataloader):
        b_input_ids = batch['input_ids'].to(device)
        b_token_type_ids = batch['token_type_ids'].to(device)
        b_attention_mask = batch['attention_mask'].to(device)
        b_labels = batch['labels'].to(device)

        model.zero_grad()

        outputs = model(b_input_ids,
                        token_type_ids=b_token_type_ids, 
                        attention_mask=b_attention_mask, 
                        labels=b_labels)
        
        loss = outputs.loss
        total_train_loss += loss.item()
    
        loss.backward()

        torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)

        optimizer.step()

        scheduler.step()

    avg_train_loss = total_train_loss / len(train_dataloader)            
    print("   Average training loss: {avg_train_loss:.2f}")

def evaluate(model, test_dataloader):
    model.eval()

    total_eval_accuracy = 0
    total_eval_loss = 0
    nb_eval_steps = 0

    for batch in test_dataloader:
        b_input_ids = batch['input_ids'].to(device)
        b_token_type_ids = batch['token_type_ids'].to(device)
        b_attention_mask = batch['attention_mask'].to(device)
        b_labels = batch['labels'].to(device)

        with torch.no_grad():       
            outputs = model(b_input_ids, 
                            token_type_ids=b_token_type_ids, 
                            attention_mask=b_attention_mask,
                            labels=b_labels)
        loss = outputs.loss
        logits = outputs.logits

        total_eval_loss += loss.item()
        logits = logits.detach().cpu().numpy()
        label_ids = b_labels.to('cpu').numpy()
        total_eval_accuracy += flat_accuracy(logits, label_ids)

    avg_val_accuracy = total_eval_accuracy / len(test_dataloader)
    avg_val_loss = total_eval_loss / len(test_dataloader)

    return avg_val_accuracy, avg_val_loss

accuracy, val_loss = evaluate(model, test_dataloader)
print(f'Accuracy: {accuracy:.2f}%')

训练结束后,我们可以使用测试集对模型进行评估。TensorFlow提供了非常好的评估函数可以在别人的工程稍微改下直接拿来用:

from sklearn.metrics import accuracy_score
def flat_accuracy(preds, labels):
    pred_flat = np.argmax(preds, axis=1).flatten()
    labels_flat = labels.flatten()
    return accuracy_score(labels_flat, pred_flat)

模型调整和优化

下面是一些可能有助于Transformer模型性能的调整和优化方法。

(1)最大输入序列长度: Transformer模型需要固定大小的输入序列。在IMDB任务中,我们将max_length设置为100。调整这个参数会影响到模型的性能,长时间耗时与显存限制等都会影响选择。

(2)学习率、批大小、迭代次数等训练超参数的调整: 常用策略包括指数衰减学习率、增加批次大小、增加迭代次数等。

(3)使用预训练模型:随着语言模型的发展,预训练语言模型在各种NLP任务中表现越来越好。因此,在这类任务中,可以通过使用预训练的模型来提高准确性。适合使用这个方法的数据集规模越大,效果越明显。

(4) 模型融合或集成: 许多竞赛中,采用模型平均等方式提高模型的完整性和稳健性。在结果更重要的大赛中尤为突出。

总结

首先简要介绍了Transformer的基本结构和工作原理,并解释了为什么它适合于序列到序列的学习问题。然后,我们演示了如何获取IMDB电影评论数据,对其进行标记化处理,并将数据转换为Tensor类型。最后,我们介绍了如何使用BertForSequenceClassification加载预处理的去停词csv数据,及PyTorch库定义优化器、损失函数和批大小等训练超参数来执行模型训练和评估。

以上就是详解基于Transformer实现电影评论星级分类任务的详细内容,更多关于Transformer电影评论星级分类的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解基于Transformer实现电影评论星级分类任务

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

详解基于Transformer实现电影评论星级分类任务

这篇文章主要为大家介绍了详解基于Transformer实现电影评论星级分类任务过程解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录