BERT是google开源的一种自然语言处理领域的经典模型,全称是Bidirectional Encoder Representations from Transformers 。它使用多头注意力和位置嵌入,来替换不易并行的循环神经网络。它的出现一举打破自然语言处理领域11个不同问题的记录,直接将自然语言处理推动到了一个新的时代。

本实验使用pytorch的相关神经网络库, 编写BERT 的语言模型, 并基于训练好的词向量,利用少量的训练数据,微调BERT 模型用于文本分类任务。实验使用的数据集是IMDB数据集。实验的主要内容包括:

实验准备:搭建基于GPU的pytorch实验环境。下载IMDB数据集。数据预处理:使用pytorch所提供的标准数据接口,将原始数据处理为方便模型训练脚本所使用的数据结构。语言模型:参考《动手学深度学习》,搭建BERT 模型并加载大语料库上预训练的模型参数。推荐的预训练参数来源为huggingface。情感分类:基于训练好的语言模型,编写一个情感分类模型,包含一个BERT 模型和一个分类器(MLP)。首先,将一个句子中的每个单词对应的词向量输入BERT,得到句子的向量表征。然后将句向量作为分类器的输入,输出二元分类预测,同样进行loss 计算和反向梯度传播训练,这里的loss是交叉熵loss。此次实验中不固定BERT 模型的参数,而须随分类器一同训练以达到微调的目的。超参数调试:通过调整学习率等超参数提高情感分类模型的准确率。测试性能:选择在上一步中最合适的一组超参数训练得到最终的模型,然后在测试集上测试性能,并于第二次实验中采用RNN模型的实验结果进行对比分析。

 相关的代码下载链接:从零开始在Pytorch实现Bert模型

                                     Pytorch下用Bert+MLP实现文本情感分类网络 

                                     bert情感分类中用tokenizer实现文本预处理

                                     pytorch实现具备预训练参数加载功能的bert模型

1.搭建实验环境

搭建GPU版Pytorch实验环境如下:

名称 版本 备注 Python 3.8 Pytorch 1.12.1 GPU RTX2060 安装对应版本的cuda

2.下载IMDB数据集

下载IMDB数据集(地址: https://ai.stanford.edu/~amaas/data/sentiment/ ),解压后得到包含正负样本的电影评论数据集,具体如下:

 3.数据预处理

对下载的数据集中的test和train分别进行预处理从而方便后续模型训练。预处理主要包括:txt文件读取、文本标签处理、特殊字符过滤、分词,使用了bert预训练模型的tokenizer将文本处理为bert所需输入形式,包括input_ids、token_type_ids和attention_mask以及每个文本的类别标签label。最后将处理后的数据,使用pickle 模块的 dump()方法进行序列化并存储,以方便后续调试。

读取IMDB数据

加载预训练的tokenizer并利用其对文本进行处理得到训练需要的输入数据集,其功能主要由ClsDataset()实现,核心代码如下。

数据集包括训练集、验证集和测试集,其中训练集和验证集由IMDB中的train文件夹中数据组成,总共25000个样本,随机分为训练集和验证集,大小分别为训练集20000样本,验证集5000样本,两个数据集不交叉。测试集由IMDB中的test文件夹中数据组成,用于最终的模型性能测试,大小为25000个样本。另外最终模型的训练在train文件夹的25000个样本上进行。

保存数据集

4.语言模型搭建和训练

4.1.搭建Bert模型

关于如何搭建Bert模型可以参考网上代码,或者参考本博客的相关文章和资源(

手动搭建Bert模型并实现与训练参数加载和微调)。

4.2.搭建情感分类模型

基于训练好的语言模型,编写一个情感分类模型,包含一个BERT 模型和一个分类器(MLP)。首先,将一个句子中的每个单词对应的词向量输入BERT,得到句子的向量表征。然后将句向量作为分类器的输入,输出二元分类预测,同样进行loss 计算和反向梯度传播训练,这里的loss是交叉熵loss。此次实验中不固定BERT 模型的参数,而须随分类器一同训练以达到微调的目的。

4.2.1.情感分类模型定义

情感分类模型,包含一个BERT 模型和一个分类器(MLP),两者间有一个dropout层,BERT模型实现了预训练参数加载功能。首先,将一个句子中的每个单词对应的词向量输入BERT,得到句子的向量表征。然后将句向量经过dropout层再输入分类器,最后输出二元分类预测。主要步骤及代码段如下:

4.2.2.训练情感分类模型

1)预训练模型和预处理数据集加载

加载预训练模型和预处理数据集,数据集为IMDB,预处理方法如3.3节所述,基于训练、验证、测试数据集构建了各自的迭代器train_loader、eval_loader、test_loader。

2)模型参数和训练参数定义

分别定义模型结构参数和训练的参数,其中由于GPU内存限制batch_size设置为4,但实际在训练时参数每8步更新一次,可以认为等效于每个batch_size为32.具体如下:

3)训练模型

实列化分类模型,并定义损失函数为CrossEntropyLoss(),优化器为Adam(),训练设备为GPU(cuda0),学习率等参数已在上一步说明,这些参数在训练中有调整。Bert模型的参数在实列化时加载了HuggingFace的bert_base_uncased预训练模型参数。

将模型设置为训练模式,加载输入样本和标签至GPU进行训练。

每个Epoch结束时,在验证集上测试模型的性能,包括分类准确度等指标,并保存当前表现最好的模型。

​​​​​​​4.3.超参数分析和调试

在前述情感分类模型基础上对相关超参数进行了不同的调整、比较并分析了情感分类模型在各个情况下的性能。由于GPU内存限制和时间周期限制,并未对不同batchsize大小、不同优化器、MLP结构对模型性能的影响进行分析,仅分析比较了不同dropout和学习率对模型性能的影响。batchsize大小、不同优化器、MLP结构等超参数参考了《动手学深度学习》和网络上的资料设定,batchsize大小为32,优化器选择为Adam,MLP使用了1层,hidden_size大小与Bert输出维度一致为768。

5.实验结果

修改数据集,将训练集和验证集合并为训练集,在该数据集使用上一节分析得到的最优参数,Bert模型采用HuggingFace的bert_base_uncased预训练模型的结构参数,总共包含了12层Transformer。模型的其他参数也参考了HuggingFace的bert_base_uncased预训练模型的结构参数。vocab_size为bert_base_uncased预训练模型的字典大小,hidden_size为768,attention_head_num为12,intermediate_size为3072,hidden_act与论文中保持一致使用gelu,Dropout为0.1,学习率为5e-6,epoch为5。重新训练模型,并在测试集上进行模型性能测试。

在测试集上测试模型性能,在IMDB的测试数据集上(test,包含25000个样本)测得的结果如下:

测试结果表明最后的模型在测试集上的准确度为94%。

6.结语

通过本次实验,熟悉了基于Pytorch和nvidiaGPU的深度学习开发环境搭建过程。掌握了自然语言处理中Bert模型的基本原理和实现方法,基于预训练模型的参数加载方法和基于Bert模型实现情感分析的模型架构、搭建和训练方法。通过对文本情感分类网络的调参分析和模型训练掌握了超参数调节方法、各种超参数对训练过程、模型性能的影响。

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: