大数据文摘授权转载自数据派THU
作者:Aravind Pai
编译:王威力、张一豪
在编程历程中,我们总是求助于最先进的架构。
现在得益于深度学习框架,比如说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来解决文本分类问题?
在我们深入专业概念前,我们先快速熟悉一下PyTorch这个框架。PyTorch的基本数据单元是Tensor,类似于python中的numpy数列。使用PyTorch的最重要的两个优点是:
动态的网络——训练过程中网络结构可以变化
多GPU分布式训练
我肯定你在想-为什么我们要用PyTorch处理文本数据?接下来我们讨论一下PyTorch的一些令人难以置信的特性,这些特性使它不同于其他框架,特别是在处理文本数据时。
处理Out of Vocabulary words问题
文本分类模型是在固定数据大小的文本数据集上进行训练的。但是对于推理问题,可能会遇到有些词并不涵盖在词汇集内,这些词叫做Out of Vocabulary words。
忽略Out of Vocabulary words可能会导致信息丢失,因此这是一个重要的问题。 为了解决这个问题,PyTorch支持把训练数据集中的稀有词替换为unknown token,帮助我们处理Out of Vocabulary words问题。
另外,PyTorch还提供了处理变长序列的方法。
处理变长文本序列
是否听过,循环神经网络用来解决变长序列的问题,有没有疑惑它是怎么实现的?PyTorch带来了很有用的'Packed Padding sequence',来实现动态循环神经网络。
Padding(填充)是在句子的开头或者结尾填充额外的token的过程。由于每个句子的词的数量不同,我们把长度不同的句子输入,增加padding tokens,扩充以使得句子等长。
由于大部分的框架支持的是静态网络,也就是说在模型训练过程中,模型框架是不变的,因此padding是必要的。尽管padding解决了变长序列的问题,但也带来了新的问题——padding token是增加了新的信息/数据,下面我用一个简单的图来做解释。
下边这个图中,最后一个单词表示的是一个padding token,但它也在产生输出的过程里发生了作用。这个问题可以交给pytorch中的Packed Padding sequence(压缩填充序列)来处理。
压缩填充会忽略掉padding token的部分。这些值,永远不会出现在循环神经网络的训练过程中,可以帮助我们建立动态的循环神经网络。
包装和预训练的模型
Pytorch正在推出先进的框架。Hugging Face 公司的Transformers库提供了超过32个先进的框架用于自然语言理解和自然语言生成。
除此之外,pytorch还提供了一些预训练的模型,可以用很少的代码去解决文本到语言、目标检测等问题。
是不是感觉到难以置信?这些是PyTorch的一些非常有用的特性。现在让我们使用PyTorch解决文本分类问题。
了解问题的场景
作为本文的一部分,我们将研究一个非常有趣的问题。
Quora希望在他们的平台上跟踪“不真诚”的问题,以便让用户在分享知识的同时感到安全。在这种情况下,一个不真诚的问题被定义为一个旨在陈述而不是寻求有用答案的问题。为了进一步分解这一点,这里有一些特征可以表明某个特定问题是不真诚的:
具有非中性音调;
贬低或煽动;
不是基于现实;
利用性(乱伦、兽交、恋童癖)来获得震惊的价值,而不是寻求真正的答案。
训练集包括以上被问的问题,以及一个标志它是否是不真诚的标签(target=1表示不真诚)。基本事实中存在噪声,也就是说,训练集并不是完美的。我们的任务是识别一个给定的问题是否是“不真诚的”。