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

相关文章

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

Pytorch介绍与安装过程

《Pytorch介绍与安装过程》PyTorch因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究和开发的主流工具之一,本文给大家介绍Pyto... 目录1、Pytorch介绍1.1、核心理念1.2、核心组件与功能1.3、适用场景与优势总结1.4、优

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

PyTorch中cdist和sum函数使用示例详解

《PyTorch中cdist和sum函数使用示例详解》torch.cdist是PyTorch中用于计算**两个张量之间的成对距离(pairwisedistance)**的函数,常用于点云处理、图神经网... 目录基本语法输出示例1. 简单的 2D 欧几里得距离2. 批量形式(3D Tensor)3. 使用不

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据