独家 :教你用Pytorch建立你的第一个文本分类模型!

2024-04-28 12:32

本文主要是介绍独家 :教你用Pytorch建立你的第一个文本分类模型!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:Aravind Pai  翻译:王威力   校对:张一豪

本文约3400字,建议阅读10+分钟

本文介绍了利用Pytorch框架实现文本分类的关键知识点,包括使用如何处理Out of Vocabulary words,如何解决变长序列的训练问题,举出了具体实例。

标签:自然语言处理

总览

  • 学习如何使用PyTorch实现文本分类

  • 理解文本分类中的关键点

  • 学习使用压缩填充方法

介绍

在我的编程历程中,我总是求助于最先进的架构。现在得益于深度学习框架,比如说PyTorch,Keras和 TensorFlow,实现先进的架构已经变得更简单了。这些深度学习框架提供了一种实现复杂模型架构和算法的简单方式,不需要你掌握大量的专业知识和编程技能。总结来说,这是数据科学的金矿。

 

在本文中,我们将使用PyTorch框架,它以其快速的计算能力而闻名。因此,在本文中,我们将介绍解决文本分类问题的关键点。然后我们将在PyTorch框架实现我们的第一个文本分类器!

提示:在继续浏览前,我推荐先阅读这篇文章:

A Beginner-Friendly Guide to PyTorch and How it Works from Scratch:

https://www.analyticsvidhya.com/blog/2019/09/introduction-to-pytorch-from-scratch/?utm_source=blog&utm_medium=building-image-classification-models-cnn-pytorch

 

大纲

一、为什么用PyTorch来解决文本分类问题

    1. 解决Out of Vocabulary words

    2. 解决变长序列

    3. 包装器和预训练模型

二、了解问题的场景

三、实现文本分类

 

一、为什么用PyTorch来解决文本分类问题?

在我们深入专业概念前,我们先快速熟悉一下PyTorch这个框架。PyTorch的基本数据单元是Tensor,类似于python中的numpy数列。使用PyTorch的最重要的两个优点是:

  • 动态的网络——训练过程中网络结构可以变化

  • 多GPU分布式训练

我肯定你在想-为什么我们要用PyTorch处理文本数据?接下来我们讨论一下PyTorch的一些令人难以置信的特性,这些特性使它不同于其他框架,特别是在处理文本数据时。

 

1. 处理Out of Vocabulary words问题

文本分类模型是在固定数据大小的文本数据集上进行训练的。但是对于推理问题,可能会遇到有些词并不涵盖在词汇集内,这些词叫做Out of Vocabulary words。忽略Out of Vocabulary words可能会导致信息丢失,因此这是一个重要的问题。

 

为了解决这个问题,PyTorch支持把训练数据集中的稀有词替换为unknown token,帮助我们处理Out of Vocabulary words问题。

 

另外,PyTorch还提供了处理变长序列的方法。

 

2. 处理变长文本序列

是否听过,循环神经网络用来解决变长序列的问题,有没有疑惑它是怎么实现的?PyTorch带来了很有用的'Packed Padding sequence',来实现动态循环神经网络。

 

Padding(填充)是在句子的开头或者结尾填充额外的token的过程。由于每个句子的词的数量不同,我们把长度不同的句子输入,增加padding tokens,扩充以使得句子等长。

 

由于大部分的框架支持的是静态网络,也就是说在模型训练过程中,模型框架是不变的,因此padding是必要的。尽管padding解决了变长序列的问题,但也带来了新的问题——padding token是增加了新的信息/数据,下面我用一个简单的图来做解释。

 

下边这个图中,最后一个单词表示的是一个padding token,但它也在产生输出的过程里发生了作用。这个问题可以交给pytorch中的Packed Padding sequence(压缩填充序列)来处理。

压缩填充会忽略掉padding token的部分。这些值,永远不会出现在循环神经网络的训练过程中,可以帮助我们建立动态的循环神经网络。

3. 包装和预训练的模型

Pytorch正在推出先进的框架。Hugging Face 公司的Transformers库提供了超过32个先进的框架用于自然语言理解和自然语言生成。

 

除此之外,pytorch还提供了一些预训练的模型,可以用很少的代码去解决文本到语言、目标检测等问题。

 

是不是感觉到难以置信?这些是PyTorch的一些非常有用的特性。现在让我们使用PyTorch解决文本分类问题。

 

二、了解问题的场景

作为本文的一部分,我们将研究一个非常有趣的问题。

 

Quora希望在他们的平台上跟踪“不真诚”的问题,以便让用户在分享知识的同时感到安全。在这种情况下,一个不真诚的问题被定义为一个旨在陈述而不是寻求有用答案的问题。为了进一步分解这一点,这里有一些特征可以表明某个特定问题是不真诚的:

  • 具有非中性音调;

  • 贬低或煽动;    

  • 不是基于现实;

  • 利用性(乱伦、兽交、恋童癖)来获得震惊的价值,而不是寻求真正的答案。

训练集包括以上被问的问题,以及一个标志它是否是不真诚的标签(target=1表示不真诚)。基本事实中存在噪声,也就是说,训练集并不是完美的。我们的任务是识别一个给定的问题是否是“不真诚的”。

数据下载链接为:

https://drive.google.com/open?id=1fcip8PgsrX7m4AFgvUPLaac5pZ79mpwX

 

现在是时候用PyTorch编写我们自己的文本分类模型了。

 

三、实现文本分类

首先导入所有建模需要的包。这里有一个简单的关于我们要用到的包的概览:

  • Torch包是用来定义tensor和tensor上的数学运算;

  • TorchText包是PyTorch中NLP的库,包含一些预处理的脚本和常见的NLP数据集。

为了使结果可复现,我指定了种子值。由于深度学习模型的随机性,在执行时可能会产生不同的结果,因此指定种子值非常重要。

 

  • 数据预处理:

现在我们来看,如何用field(域)来做文本的预处理。这里有两种域对象——Field和LabelField。我们来快速理解一下它们的区别:

  • Field:data模块的Field对象,用于描述数据集中每一列的预处理步骤;

  • LabelField:LabelField是Field对象只用于分类任务的特例。只用于设置unk_token和sequential,默认都为None。

在使用Field之前,看一下它的不同参数和用途:

  • Tokenize:定义分词方法,这里我们用spacy tokenizer,因为它用了新的分词算法;

  • Lower:把文本转化成小写;

  • Batch_first:输入和输出的第一个维度一般都是batch size。

然后,创建元组构成的列表,每个元组都包含一个列名,第二个值是field对象。另外,按照csv文件中列的顺序,来排列元组,当我们忽略一列的时候,用(None,None)表示。

 

读入必要的列——问题和标签。

 

fields = [(None, None), ('text',TEXT),('label', LABEL)]

这个代码块中,我通过定义field对象加载了自定义数据集。              

 

现在让我们将数据集分成训练和验证数据

 

  • 准备输入和输出序列:

下一步是建立文本的vocabulary并把它们转化为整数序列。Vocabulary包含整个文本中的所有的独立的词,每一个词都分配一个索引。下面是参数:

  • min_freq:当vocabulary中的词的频率低于这个参数值的时候把这个词映射为unknown token;

  • 两个特殊的token,一个unknown tokenpadding token加到vocabulary中:Unknown token是用于处理Out Of Vocabulary words;Padding token是把输入序列变为等长的。

 

我们建立起vocabulary,用预训练好的词嵌入来初始化单词成向量。如果你想随机初始化词嵌入,可以忽略向量的参数。

 

接下来,准备训练模型的batch。BucketIterator以需要最小填充量的方式形成批次。

 

  • 模型架构

现在需要定义模型的架构来解决这个二分类问题。Torch中的nn模块,是一个所有模型的基础模型。也就是说,每个模型都必须是nn模块的子类。

我定义了两个函数,init和forward。我来解释一下这两个函数的应用场景。

  • init:初始化类的实例时,init函数自动被调用。因此,它也叫做构造函数。类的参数需要在构造函数中初始化,我们需要定义模型需要用到的层;

  • forward:forward函数定义了inputs前向传播的计算步骤。

最后,我们理解一下各层的细节问题和参数。

 

嵌入层:对于任何NLP相关的任务,词嵌入都很重要,因为它可以应用数字形式表示一个单词。嵌入层得到一个查询表,其中每一行代表一个词嵌入。嵌入层可以把表示文本的整数序列转化为稠密向量矩阵。嵌入层的两个重要的参数:

  • num_embeddings:查询表中,单词的的个数;

  • embedding_dim:表示一个单词的向量维度。

LSTM:LSTM是RNN的一个变体,可以学习长的依赖关系。下面列举了LSTM的一些你应该了解的重要参数:

  • input_size:输入向量的维度;

  • hidden_size:隐藏层节点的个数;

  • num_layers:网络中的层数;

  • batch_first:如果等于True,输入输出的tensor的形式都是(batch, seq, feature);

  • dropout:默认值是0,如果设为非0,每个LSTM层输出结果都会进到dropout层,以dropout参数值的概率删掉对应比例的神经元;

  • bidirection:如果为True, LSTM是双向的。

Linear Layer:线性层指的是稠密层,有两个重要参数:

  • in_features:输入特征的个数;

  • out_features:隐藏层节点个数。

压缩填充:上文已经讨论过,压缩填充用于动态循环神经网络。如果不采用压缩填充的话,填充后的输入,rnn也会处理padding输入,并返回padded元素的hidden state。但压缩填充是一个很棒的包装,它不显示填充的输入。它直接忽略填充部分并返回非填充元素部分的hidden state。

 

现在我们已经对这个架构中的所有板块都有了了解,现在可以去看代码了!

 

下一步是定义超参、初始化模型。

 

让我们看看模型摘要,并使用预训练的词嵌入初始化嵌入层。

 

在这里,我定义了模型的优化器、损失和度量:

 

建模的两个阶段:

  • 训练阶段:model.train() 设置了模型进入训练,并激活dropout层;

  • 预测阶段:model.eval() 开始模型的评估阶段并关闭dropout层。

接下来是定义用于训练模型的函数的代码块。

所以我们有一个函数来训练模型,但是我们也需要一个函数来评估模型。我们来吧 !

  

最后,我们将对模型进行一定数量的训练,并保存每个时期的最佳模型。

 

让我们加载最佳模型并定义一个推理函数,它接受用户定义的输入并进行预测太神了!让我们用这个模型来预测几个问题。

 

小结

我们已经看到了如何在PyTorch中构建自己的文本分类模型,并了解了压缩填充的重要性。您可以随意使用长短期模型的超参数,如隐藏节点数、隐藏层数等,以进一步提高性能。

原文链接:

https://www.analyticsvidhya.com/blog/2020/01/first-text-classification-in-pytorch/

原文标题:

Build Your First Text Classification model using PyTorch

译者简介:王威力,养老医疗行业BI从业者。保持学习。

转自:数据派THU ;

版权声明:本号内容部分来自互联网,转载请注明原文链接和作者,如有侵权或出处有误请和我们联系。

更多相关知识请回复:“ 月光宝盒 ”;

数据分析(ID : ecshujufenxi )互联网科技与数据圈自己的微信,也是WeMedia自媒体联盟成员之一,WeMedia联盟覆盖5000万人群。

这篇关于独家 :教你用Pytorch建立你的第一个文本分类模型!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943267

相关文章

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

雨量传感器的分类和选型建议

物理原理分类 机械降雨量计(雨量桶):最早使用的降雨量传感器,通过漏斗收集雨水并记录。主要用于长期降雨统计,故障率较低。电容式降雨量传感器:基于两个电极之间的电容变化来计算降雨量。当降雨时,水滴堵住电极空间,改变电容值,从而计算降雨量。超声波式降雨量传感器:利用超声波的反射来计算降雨量。适用于大降雨量的场合。激光雷达式降雨量传感器:利用激光技术测量雨滴的速度、大小和形状等参数,并计算降雨量。主

人工和AI大语言模型成本对比 ai语音模型

这里既有AI,又有生活大道理,无数渺小的思考填满了一生。 上一专题搭建了一套GMM-HMM系统,来识别连续0123456789的英文语音。 但若不是仅针对数字,而是所有普通词汇,可能达到十几万个词,解码过程将非常复杂,识别结果组合太多,识别结果不会理想。因此只有声学模型是完全不够的,需要引入语言模型来约束识别结果。让“今天天气很好”的概率高于“今天天汽很好”的概率,得到声学模型概率高,又符合表达

智能客服到个人助理,国内AI大模型如何改变我们的生活?

引言 随着人工智能(AI)技术的高速发展,AI大模型越来越多地出现在我们的日常生活和工作中。国内的AI大模型在过去几年里取得了显著的进展,不少独创的技术点和实际应用令人瞩目。 那么,国内的AI大模型有哪些独创的技术点?它们在实际应用中又有哪些出色表现呢?此外,普通人又该如何利用这些大模型提升工作和生活的质量和效率呢?本文将为你一一解析。 一、国内AI大模型的独创技术点 多模态学习 多

基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别

转发来源:https://swift.ctolib.com/ooooverflow-chinese-ocr.html chinese-ocr 基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别 环境部署 sh setup.sh 使用环境: python 3.6 + tensorflow 1.10 +pytorch 0.4.1 注:CPU环境

OpenCompass:大模型测评工具

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径:AI代理工作流大模型应用开发实用开源项目汇总大模型问答项目问答性能评估方法大模型数据侧总结大模型token等基本概念及参数和内存的关系大模型应用开发-华为大模型生态规划从零开始的LLaMA-Factor

模型压缩综述

https://www.cnblogs.com/shixiangwan/p/9015010.html

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述。以下是从不同角度对气象站的种类和应用范围的介绍: 一、气象站的种类 根据用途和安装环境分类: 农业气象站:专为农业生产服务,监测土壤温度、湿度等参数,为农业生产提供科学依据。交通气象站:用于公路、铁路、机场等交通场所的气象监测,提供实时气象数据以支持交通运营和调度。林业气象站:监测林区风速、湿度、温度等气象要素,为林区保护和