独家 :教你用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

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言