学界 | Yann LeCun新作,中日韩文本分类到底要用哪种编码?

https://www.wxwenku.com/d/102093756

AI科技评论按:前几天,Yann LeCun与其学生 张翔在arXiv上发表了一篇新作「Which Encoding is the Best for Text Classification in Chinese, English, Japanese and Korean?」。这篇文章做了一个包含473种模型的大型对比实验,实验的目的是对文本分类任务中不同语言(英语、汉语、韩语和日语)不同的level(utf-8 、字符等)和不同的encoding(bag-of-words等)在不同模型(linear models、fastText、ConvNets等)中组合使用的效果进行测试,得到了一系列有参考价值的结论。本文中 AI 科技评论将对这篇论文进行详细分析。

文本分类是自然语言处理中最普遍的一个应用,例如文章自动分类、邮件自动分类、垃圾邮件识别、用户情感分类等等,在生活中有很多例子。但是由于不同语言之间差别很大(例如像汉语、韩语、日语这样的CJK语言与英语这样的字母语言在处理上有很大不同)。例如最近有人使用字符级编码的神经网络(ConvNets)来处理语言中的单词分割问题,但是很不幸的是,用字符来处理CJK语言并不很好,因为这时候字符的数量会变得非常巨大。所以能否找到一种在处理所有这些自然语言上都表现优良的模型呢?作者的方法就是,列出一系列模型(473个), 然后比较它们的表现。

一、数据集(data sets)

这篇文章考虑了4种语言,分别为汉语、英语、日语和韩语。作者分别从大众点评(汉语,餐饮)、京东(汉语,网店)、Rakuten(网店,日语)、11st(网店,韩语)、Amazon(英语,网店)、凤凰网(汉语,新闻)、中国日报(汉语,新闻)、NYnews(英语,新闻)等八个网站爬取了8个情感分类数据集。其中京东、Rakuten、11st和Amazon的数据集又分为全五星分类和双分法类(1、2星为负,3星舍弃,4、5星为正)。另外因为这四个网站都是网店类型,所以可以用它们来组合成两个joint数据集(全五星和双分法),这两个数据集由于是混合了四种语言,所以可以用来检测模型处理不同语言的能力。综上共有14个情感分类的数据集。

二、编码级别(encoding level)

所谓编码级别,简单说就是考虑文本分析时的最小单位。在文中提及的编码级别包括:字符(characters)、UTF-8(byte)、罗马化字符(romanized characters)、词(words)、罗马化词(romanized words)等。

 

三、编码机制(encoding Mechanism)

本文选择的深度学习模型为卷积网络模型(ConvNets),根据网络层数分为large Net(12层)和small Net(8层)。在卷积网络模型训练中,必须对文本进行编码机器才能识别。在这篇文章中包含三种编码机制,分别为:字符字形编码(Character Glyph)、独热编码(One-hot Encoding)、嵌入编码(Embedding)。

1、字符字形编码(Character Glyph)

所谓字形就是在读写中可以识别的一个符号,例如汉字中的笔画“丿”或英语中的“a”,都是一个可识别的字形。在这篇文章中作者将每一个字形转化成一个16*16的像素点阵。很明显这种编码机制对于CJK语言(字符较为丰富)非常合适。不过这种方式只能在字符级进行,所以只能构建出一种卷积网络模型,称之为GlyphNet。

2、独热编码(One-hot Encoding)

独热码, 直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。例如,有6个状态的独热码状态编码为:000001,000010,000100,001000,010000,100000。如果是英文字母的编码,那么就需要状态码长度为26了。独热码编码的最大优势在于状态比较时仅仅需要比较一个位,从而一定程度上简化了译码逻辑。但是,很显然,如果字符数量非常多(CJK语言)的情况下,独热码的码长就会非常大。不过在这篇文章中,作者考虑了两种方式来解决这个问题:第一种是将所有的文本(UTF-8)看成是一个字节序列,在字节层次进行编码,构建的卷积网络模型称之为byte-level OnehotNet;第二种是将文本罗马化,也即用英语字母来编码(值得注意的是,这种方式等价于用罗马化文本在字节层次进行编码),构建的卷积网络模型称之为Romanization OnehotNet。字节级处理的优势在于,它们可以应用到任何一种语言当中,无论这种语言在字符或者字体级别有多少实体,所以它们也可以很容易地应用到CJK语言当中。

3、嵌入编码(Embedding)

所谓嵌入码,即将每一个实体用一个固定长度的向量来表示。比如,对于“A B A C B F G”这样的一个序列,也许我们最后能得到:A对应的向量为[0.1 0.6 -0.5],B对应的向量为[-0.2 0.9 0.7]  (此处的数值只用于示意)。由于这种向量表示是随机的初始化的,它不像独热码那样严格,所以相比独热码它在内存中会更小。另外一个优点就是它可以应用到任何编码级别。所以在本文当中,作者使用嵌入编码从字节、字符、单词、罗马化字符、罗马化单词等不同的编码级别来分别编码比较,嵌入码向量长度都为256。

通过这种方式构建的卷积网络模型称之为EmbedNet。这种模型编码可以分别在characters、byte、romanized characters、words、romanized words五个级别进行,所以共有五种模型。

综上所述,共有(1+2+5)*2=16种卷积网络模型。

三、线形模型和fastText模型

除了卷积网络模型外,在这篇文章中作者还选取了线形模型(linear model)和fastText模型进行对比。

1、线形模型(linear model)

传统的文本分类方法的流程就是人工设计一些特征,从原始文档中提取特征,然后指定分类器如LR、SVM,训练模型对文本进行分类。比较经典的特征提取方法如频次法(文章中用plain表示)、TF-IDF等。所谓频次法顾名思义就是记录和统计每个文本中实体(例如character、word、romanized word)的次数分布,以此来分类。但是有些词如“的”“了”等虽然出现的次数比较多,但实际并没有意义。所以就提出了另一种线形模型TF-IDF。TF即term frequency,仍然表示项目在文本中出现的频次,但加入了IDF(inverse document frequency)的权重,在全部文档中出现频次越大,该term在样本中的IDF就越小。于是TF*IDF就可以作为一个项目的统计结果了,这要比简单的频率统计更为准确。

2、fastText模型

fastText模型是2016年Joulin等人提出的一个快速分类模型。该模型并入了分层softmax和特征散列等技巧,这种模型能够以ConvNets模型几个数量级的速度处理输入文本。本质上fastText模型就是一个没有非线性的2层全连接神经网络。

在以上这两个模型中,作者选择了character、word、romanized word三种编码级别,但是还有一个问题没有解决,即以多大的单位进行统计/判断?这就涉及到一个概念: n-gram。它的意思就是将给定文本转化为长度为n的项目(term)的序列。例如“你今天休假了吗”,它的2-gram依次是:“你今,今天,天休,休假,假了,了吗”。作者为线形模型选择了1-gram和5-gram两种,为fastText模型选择了1-gram、2-gram和5-gram。

综上所述,作者共构建了3*2*2=12种线形模型和3*3=9种fastText模型。

四、结果

针对以上四种语言,汉语、日语、韩语以及joint共11个数据集,每个数据集都有37个模型;英语的3个数据集,每个有22个模型。总计有473个模型参与到对比中。表格中的数据表示训练误差的百分比。

 

 

另外每一种模型所花费的时间也是不一样,其量级差别非常大。作者通过对joint 二分数据集的100万个样本进行训练得到下面这个对比数据。这个对比只是作为参考,具体情况会根据计算环境而变。

 

五、结论

通过比较以上表格中的误差率,作者得出以下结论:

1、fastText模型对中、日、韩文本(CJK语言文本)在character级编码的处理结果更好;而对英语文本则在word级编码的处理结果更好;

2、对于fastText和线性模型,CJK语言的word级编码在没有完美分割的情况下效果相当;

3、卷积网络的最佳编码机制是byte级独热编码(byte-level one-hot encoding)。 这表明卷积网络能够从低级别的表示中理解文本,并提供了一致的和统一的方式来处理多种语言。

4、fastText相比于卷积网络更倾向于过拟合,而相比于线形模型也并没有表现出更多的表示能力(representation capacity)。

当然,尽管作者在此列了473种模型进行对比,但仍不是全部。例如深度学习模型本文只用了卷积网络模型,但其实还有别的一些有意思的模型,例如周期性网络(recurrent networks)等。作者似乎计划在之后会对周期性网络进行研究,同时还会改进卷积网络模型,看会有什么样的效果。

AI 科技评论消息,据说论文中用到的源代码和数据集随后将全部公布。

论文下载:https://arxiv.org/pdf/1708.02657.pdf

posted @ 2017-08-31 16:59  Django's blog  阅读(1017)  评论(0编辑  收藏  举报