基于深度学习的自然语言处理 第八章

从文本特征到输入

8.1 编码分类特征

处理自然语言时用到的大部分特征是离散的、分类的特征,比如单词、字母和词性。我们将讨论独热编码和稠密向量两种方案,以及两种方案的权衡和关系。

8.1.1 独特编码

在形如f(x)=xW+b的线性模型和对数线性模型中,很容易想到指示函数,每个可能的特征都用单独一维表示。举例来说,当用词袋模型表示包含40000项的词表时,x将会是一个40000维的向量,其中第23227维对应单词dog,第12425维对应单词cat。一篇包含20个词的文档将由非常稀疏的40000维向量表示,其中至多20维包含非零值。相应的矩阵W有40000行,每行对应词表中的一个单词。如果核心特征为包含位置信息的大小为5的窗口(目标词为中心,左右各两个单词)和一个包含40000的词表,x将会是一个只包含5个非零值的200000维向量,其中19234维对应word-2=dog,143167维对应word0=safa,这种方法即为one-hot编码,因为每一维对应一个单独特征,可以把结果想象成高维指示向量(其中只有一维维1,其余维为0)的组合。

8.1.2 稠密编码(特征嵌入)

从稀疏输入的线性模型到深度非线性模型的最大概念跨度可能就是不在以独热中的一维来表示各个特征,转而使用稠密向量表示,也就是每个核心特征都被嵌入到d维空间中,并用空间中的一个向量表示。通常空间维度d都远小于特征数目,嵌入向量作为网络的参数与函数f中的其他参数一起被训练。
基于前馈神经网络的NLP分类系统的一般结构如:
1.抽取一组和预测输出类别相关的核心语言学特征f1,…fk
2.对于每一个感兴趣的特征fi,检索出想要的向量v(fi)
3.将特征向量组合(拼接、相加或者两者组合)成输入向量x
4.将x输入到非线性分类器中(前馈神经网络)

8.1.3 稠密向量与独热表示

我们考虑下面两种表示方法:
独热表示,每个特征有单独一维
独热向量维度与不同特征数目相同
特征间完全独立
稠密表示,每个特征为一个d维向量
模型训练会导致相似特征对应相似向量,相似特征间的信息是共享的。
使用稠密低维度向量的一个好处是可计算:大部分神经网络工具包不能很好的处理稀疏向量。
稠密表示的主要好处是具有很强的泛化能力:如果我们假设某些特征可能提供相似的线索,那么提供一种能够捕捉这些相似性的表示方法是值得的。比如我们在训练中观察到词dog很多次,但只观察到词cat可数次,如果每个词都对应自己单独一维,dog的出现并不会告诉我们任何关于cat的信息,然而稠密向量表示中,学到的dog的向量可能和学到的cat的向量很相似,允许模型共享两个事件间的统计强度,这个观点假设我们看到单词cat出现足够很多次以至于它的向量和dog的向量很相似,或者相反地这种好向量表示是已知的。这种好向量,也被称为预训练嵌入能够通过基于分布假设的算法在大规模文本预料上得到。
在缺乏同一类别下区分度大的特征并且不同特征间没有相互关系的情况下,我们可以使用独热表示。但是如果同一组的不同特征间有相互关系,那么让网络弄清相互关系并且通过共享参数获得一些统计强度是值得的。

8.2 组合稠密向量

每个特征对应一个稠密向量,需要用某种方式将不同的向量组合起来,主要有拼接、相加和同时使用拼接和相加。

8.2.1 基于窗口的特征

考虑以位置i为中心词,两边各包含k个单词的窗口,设窗口大小k=2,我们要编码在位置i-2,i-1,i+1,i+2上的词,窗口内的词为a,b,c,d,对应的词向量为a,b,c,d。如果我们不关心窗口内词的相对位置,可以通过求和的方式对窗口编码:a+b+c+d.如果我们关心相对位置,可以使用拼接的方式[a;b;c;d],尽管同一个词不管在窗口中的什么位置都会用相同的向量表示,但词的位置信息可以在拼接位置中反映出来。
我们有时不太关心词的顺序,但相比于离中心词较远的词,我们更加注重距中心词较近的词,这时可以使用加权求和的方式进行编码,比如1/2a+b+c+1/2d。
同时也可以组合多种不同的编码方式,假如我们关心特征是出现在中心词前还是中心词后,但不关心窗口内的词距中心词的距离,这时可以采用拼接和相加组合的编码方式[(a+b),(c+d)]

8.2.2 可变特征数目:连续词袋

前馈神经网络使用固定维度的输入,这样能够很容易地抽取固定数目特征抽取函数相适应,每个特征用一个向量表示,通过拼接组合向量,这种方法中输入向量的每个区域对应一个不同特征。但有时不能预先确定特征的数目,因此我们需要使用固定大小的向量表示任意数量的特征。一种方案是使用连续词袋的方法。CBOW不考虑顺序信息,通过相加或者平均的方法组合特征的嵌入向量。
CBOW(f[1],f[2],f[3],f[k])=1/kΣv(f[i])

8.3 独热和稠密向量的关系

使用稠密向量表示特征是神经网络框架的必要部分,使用稀疏和稠密特征表示的区别也是必然比之前更加微妙。事实上,在训练神经网络时,使用稀疏独热向量作为输入,意味着使网络的第一层从训练数据中学习特征的稠密嵌入向量。
使用稠密向量时,每个分类特征值f[i]被映射为稠密的d维向量v(f[i]),通过嵌入层或查找层来进行映射。对于包含|v|个词的词表,每个词用d维向量嵌入,所有词的向量集合可以看作一个|V|*d的嵌入矩阵E,矩阵的每一行对应一个嵌入的特征。f[i]为特征f[i]的|V|维独热表示向量,除一维对于第i个特征的值,其余维均为0,乘法操作f[i]E会选择E的对应行,因此,v(f[i])通过E和f[i]来定义:
v(f[i])=f[i]E
相似的,CBOW(f[1],…f[k])=Σ(f[i]E)=Σ(f[i])E
那么网络的输入可以看作独热向量的集合。
考虑一个接收传统稀疏表示作为输入向量的网络,并且不包含嵌入层,假设可获得的特征集合为V,我们由k个特征f[1]…f[k],
x=Σf[i]
网络的第一层为
xW+b=(Σf[i])W+b
该层从W选择输入x中的特征对应的行并求和,然后加上一个偏置项,这和输出特征的CBOW表示的嵌入层非常相似,矩阵W作为嵌入矩阵,区别在于该层引入偏置项,并且嵌入层一般不经过非激活函数,而是直接传递到第一层。另一个区别是这种情境下,每个特征必须接受一个单独的向量W中的行,而嵌入层则更加灵活,允许如前一个词是dog,和后一个词是dog的特征来共享相同的向量。不过这些区别都很小。

8.4 杂项

8.4.1 距离与位置特征

一个句子中两个词的线性距离可能作为一个提供信息的特征,比如事件抽取中,给定一个触发词和一个候选元素词,需要预测元素词是否为该触发词所代表的事件的一个元素。相似的,在共指消解中,可能会给定一组代词和候选词,预测他们是否为共指关系,触发词和元素之间的距离对于这类预测任务是一个非常强的信号。在传统NLP中,通常将距离分配到若干组(1,2,3,4,5-10,10+)中,并且为每一组赋予一个One-hot向量,在神经网络中,输入不是由二值特征组成,看上去为距离特征分配一个单独入口很自然,入口的数值即为距离值,然而,实际上并没有采用这种方法,而是将距离特征采用与其他特征相似的方法编码,每一组关联到一个d维向量,这些距离嵌入向量作为网络参数进行训练。

8.4.2 补齐、未登录词和词丢弃

补齐
有时你的特征抽取器会寻找一些不存在的东西,比如从句法树中抽取特征时,可能需要找到一个词的最左依存结点,但可能有的词左侧没有任何依存结点。或者你可能抽取当前词右侧的一些词,但当前词却在序列的末端,距当前词右侧两个位置已经越出。这种情况下,当使用词袋特征方法时,可以直接忽略,当使用拼接方法时,可以采用零向量进行填充。这两种方法从技术角度看是没有问题的,但对于某些问题来说是次优解,也许知道左侧没有修饰成分是有益的。推荐的做法是添加一个特殊符号(补齐符号)到嵌入表中,并且在上述情况中使用相应的补齐向量。根据问题的不同,不同情况下使用不同的补齐向量,比如左侧修饰成分缺失向量与右侧缺失向量不同。这样的补齐对预测的准确性是很重要的。
未登录词
另外一种特征向量缺失的情况是词表外的条目,在抽取左侧词时,观测到的词是变化的,但是这个词不是训练集中的一部分,所以没有对应的嵌入向量。这与补齐不同,因为条目是存在的,但是无法进行映射。解决方法是保留一个特殊符号UNK表示未知词。同样对于不同的词表可能会使用不同的未知符号。
词签名
处理未登录词的另一种技术是将词的形式回退到词签名。使用UNK符号表示未登录词是将所有未登录词回退到相同的签名,但是根据要解决的问题不同,可能需要更细粒度的策略。不如用ing符号代替以ing结尾的未登录词,以ed符号代替以ed结尾的未登录词。映射列表是手工构建的,以反映回退模式。
词丢弃
对未登录词保留一个特殊的嵌入向量是不够的,如果训练集中的所有特征都有对应的嵌入向量,未登录词在训练中便不会出现:未登录词向量就不会被更新,模型就不会学习到如何处理遇到未登录词的情况,这与在测试时随机向量表示未登录词是等效的,模型需要在训练时学会处理未登录词。一种方法是用未登录词替换训练集中所有或部分低频特征,比如在预处理时用unknown替换频率低于一定阈值的词。这是一种可行的方案。但缺点是会丢失一些训练数据,被替换的低频词不会接收任何反馈信号。更好的方法是使用词丢弃:在训练集中抽取特征时,用未登录符号随机替换单词。这种替换应基于词频:低频词相较高频词更可能被未登录符号代替,随机替换应在运行时决定,曾经被丢弃的词在下次出现时不一定会再次被丢弃。
使用词丢弃进行正则化
除了更好的适应未登录词之外,词丢弃可能也会有助于避免过拟合和通过让模型不过分依赖任何当前词来提高鲁棒性。当采用这种方式时,词丢弃应同样频率的应用于高频词。

8.4.3 特征组合

对于神经网络来说,特征抽取阶段只抽取核心特征。对照传统的基于线性模型的NLP系统,特征设计者不仅需要人工指定感兴趣的核心特征,同时要指定特征间的交互。组合特征在线性模型中非常关键,因为会引入更多的维度到输入中,将输入转换到更加线性可分的空间中,另一方面,可能的组合空间非常大,特征设计者必须花费很多时间来设计出一组有效的特征组合。非线性神经网络模型的一个优势是人们只需要定义核心特征,由神经网络结构定义的非线性分类器被期望去寻找具有指示性的特征组合,减轻对特征组合工程的需求。

8.4.4 向量共享

假如你有若干共享相同词表的特征,如进行词性标注时,我们可能有一组建模前一词的特征集合和建模后一词的特征集合,当构建分类器的输入时,我们会将前一词的向量表示和后一词的向量表示进行拼接,然后分类器便能够区分两个不同的指示器并进行区别对待。但是两个特征应该共享相同的变量吗?dog作为前一词时的向量应该与dog后一词的向量相同吗?或者我们应该赋予它们两个不同的向量?这个还是一个经验问题,如果你认为同一词出现在不同位置时具有不同的含义,那么使用两个不同的词表并且为每个特征类型赋予一组不同的向量会更好一些。但是如果你觉得单词在两个位置时的含义很接近,那么对于不同的特征类型使用共享的词表也许会带来额外的收益。

8.4.5 维度

我们应该为每个特征分配多少维?遗憾的是,没有理论界限甚至确定的最佳事件来回答这个问题。但维度显然应随类别的数量增加而增长,但是多少维才足够呢?在目前的研究中,词嵌入向量的维度可以在50到几百之间,既然向量的维度直接影响内存需求和处理时间,经验方法是对几个不同大小的维度进行实验,然后在速度和任务准确性之间取得一个良好的平衡。

8.4.6 嵌入的词表

对每一个词赋予一个嵌入矩阵是什么意思呢?我们显然不能为所有词建立关联,需要限制在一个确定的词表范围内,这个词表通常是基于训练集的,或者是使用用于训练预训练嵌入的训练集的词表,建议在词表中加入一个选定的UNK符号,为不在词表中的所有词赋予一个特殊的向量。

8.4.7 网络的输出

对于具有k个类别的多分类问题,网络的输出是一个k维向量,每一维表示一个输出类别的强度。与传统的线性模型一样,输出仍然为离散集合的标量打分。一个d*k维矩阵被关联到输出层,这个矩阵的列可以被当作输出类别的d维嵌入,k个类别的向量表示之间的相似性指示了模型学到的输出类别间的相似性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值