字符串核函数的快速计算(一) 翻译

来源:互联网 发布:游戏视频制作软件 编辑:程序博客网 时间:2024/06/06 01:58

翻译:《通过字符串核函数进行文本分类》(一)

第一部分开始


原作者:

Huma Lodhi, Craig Saunders, John Shawa-Taylor, Nello Cristianini, Chris Watkins

Department of Computer Science, Royal Holloway, University of London

Editor: Bernhard Scholkopf

摘要

​ 我们找到了一种基于全新的核函数的文本分类方法。核函数是由特征空间中所有长度为 k 的子序列的内积生成得到的。子序列是指在文本中不一定连续的 k 个字符组成的有序序列。子序列们的权重被赋予为根据其在文本中的总长度按指数速度下降的值,借以凸显出那些较为连续的子序列。而如果直接计算字符串核函数所需要的计算量即使是相当小的 k 也能达到很恐怖的数字,因为特征空间的维数是随 k 指数上升的。这篇文章描述了即使在这样的情况下我们仍可以通过动态规划的技巧来有效的计算字符串核函数的值。

​ 在较小的数据集上进行的与标准词语特征空间核函数的对比中,这个核函数显示出了一定的优势。在子序列连续的情况下也与以不同方式降低权值的字符串核函数进行了对比。对于较大的数据集,这篇文章介绍了一种对于大数据表现良好的快速近似计算的方法。

1. 介绍

​ 标准的学习系统(如神经网络或者决策树之流)是在把输入样本转化为 m 维特征空间上的向量后进行处理的。在特征空间中,这些数据对应的点可以通过类似于超平面分割、聚类、插值 (interpolated?) 等方法进行分析。训练得到的模型再对测试数据集中的数据对应的特征空间上的点进行测试,来达到估测的目的。

​ 然而在很多时候,输入的样本数据集并不能轻松地转化 为一个明确的向量,比如 生物序列 (biosequence)、图片 (image)、图 (graph)、以及文本文档。对于这种数据集,找到实用的特征提取模型的难度可能和解决问题本身不相上下。特征提取的过程不仅需要广泛的特定领域知识,同样可能在提取过程中忽略掉一些关键的信息。这些提取后的特征的可靠性是整个学习系统有效的关键。

核方法 (Kernel methods) 是一种有效的提取特征的选择。核方法的基石是一种叫做核函数 (Kernel function) 的函数,例如一个返回两组数据在高维空间中对应的向量的内积的函数。于是学习过程便在这个特征空间中进行,而学习的算法不受样本数据集的限制可以随意更改,因为样本数据仅仅出现在需要计算的内积中。很多学习方法都能通过这种方法实现,如聚类、分类、回归。最著名的基于核函数的系统是支持向量机 (Support Vector Machine),而感知机 (Perceptron)、主成分分析 (Principal Component Analysis)、最近邻 (Nearest Neighbour)以及其它很多算法都有这个特性。核方法的特征空间维数无关性以及灵活性让其成为了很多分类问题尤其是文本分类中中极佳的选择。

​ 在这篇文章中,我们会利用核函数可以对于较为一般的集合定义出一个特征空间上的内积 的特性。对于这样的核函数,并不需要借助Mercer定理,因为它们能直接以内积的形式呈现出来。我们将在文本分类中的字符串匹配问题上检测核函数的有效性。通过定义文本文档之间的内积,谁都可以使用各种通用算法对其进行处理。所以文本也能被分类,聚类,排序等等。本文建立在 Lodhi et al.(2001) 的初步结论之上。

​ 一种标准的文本分类方法是把文档映射到高维特征向量、向量的每一维表示一个特征的存在与否的经典文本表示方法 (?Classical text representation technique)。这样做的话会丢失掉所有的词序的信息,而仅仅保留了词频。在这个过程中通常伴随着无实意单词的删除,从而失去了转折信息。如此形成的稀疏向量再通过各种学习方法的结合进行处理。这种简单的技术在某些监督学习问题上与支持向量机一同工作得很成功。

​ 在这篇文章里我们提出一种完全不同的方法——仅仅把文档考虑为符号组成的序列,并利用好一些具体的核函数。这种方法不需要用到任何特定的领域知识而能捕获到关键的信息,因为文档对其而言仅仅是一个长句子。特征空间是由文档中所有的长为 k 的子序列形成的(我们会在第三部分中讨论这一点)。如果两份文档中拥有的相似子序列越多,那么它们的相似程度越高(内积越大)。

​ 我们将以最近 Watkins 和 Haussler 对于在序列上的核函数研究进展为基础。该方法最显著的特征是他们通过序列对比的技巧把文档映射到特征向量而不需要实际表示出它们来。一种动态规划的实现让计算序列的核函数非常的高效(线性时间即可)。

​ 我们将通过一些实例来开展我们的实验,实验的数据来自于路透社的数据集。我们将这种方法与 传统文本表示技巧和 n 元语法表示技巧进行了比较,展示了这种方法在分类问题上、远超经典算法的、无与伦比的效果。

​ 对这种方法实验性的分析又同时揭示了这种方法在大型语料库上遇到的实际问题。这显示了这种方法需要找到一种适应与大数据的近似计算策略。此外,在大批量文本处理过程中还有着各种各样的问题,于是找到一种快速计算格拉姆矩阵的方法是非常关键的。

​ 减少计算时间一个关键的步骤就是找到一种方法计算核函数的近似值而不是其实际值。如果格拉姆矩阵的近似值没有显著的偏离用字符串核函数计算出的值,那么我们便可以在大型的基于文本的数据集。这篇文章中我们将展示如何应用字符串核函数生成出的特征的子集来估算格拉姆矩阵的值。我们会用最近证明的对应程度度量方法来检验估算值与格拉姆矩阵真实值的偏差。仅仅需要很少的特征我们便能估计整个矩阵的值,于是计算耗费的时间大幅度下降。为了证明它的效率,我们将在路透社的数据集上进行完整的字符串核函数的实验。

2. 核函数与支持向量机

​ 这一部分我们将回顾支持向量机以及核函数背后的主要的思想。支持向量机是一类结合学习理论的原则和核映射的想法的算法。它们被 Boser 在 1992 年提出。最开始的支持向量机是在线性可分的数据集中找出一个距离所有支持向量间隔最大的分割超平面。它有着很好的统计学性质,从而可以轻松的进行泛化和推广。其中最好的性质是它选取分割超平面是与特征空间维数无关的。所以它可以在很高的维数的空间下进行工作——如核函数映射到的空间,而不会产生过拟合。

​ 在处理分类的问题中,支持向量机们把输入数据映射到特征空间,在其中一个线性学习机可以找到最大间隔的分割超平面。而如果是在核函数定义下的空间,则分割超平面实际上成为了一个非线性的分割曲面。所以说在核函数参与的场合,分割超平面对应于一种把输入集一分为二的方法。

​ 我们现在简洁地介绍一下核方法。一个计算把两个样例映射到高维空间后得到的内积的函数叫做核函数,形式化地, 满足 ϕ:DF,K(di,dj)=ϕ(di),ϕ(dj)K 就是一个核函数。要注意的是,核函数把样本转化为高位向量的过程是隐式的。映射 ϕ 把一个 n 维的样本向量转化为一个 N 维的特征向量。

ϕ(d)=(ϕ1(d),,ϕn(d))=(ϕi(d))for i=1,2,,N

​ 一个在特征空间中提取较为清晰的特征通常需要很高的计算时间,但核函数解决了这个问题。这个函数的数学基础在 20 世纪的前 10 年就已经被 Mercer 提出来。一个核函数是一个对称函数:
K(di,dj)=K(dj,di)for i=1,2,,N

​ 每个元上的数据满足 Kij=K(di,dj)n×n 矩阵叫做核矩阵 (Kernel matrix) 。一个核矩阵是一个正定 (positive definite) 的对称矩阵。非常有意思的一点是,这个矩阵是核方法用来学习出分类器的主要信息来源。我们可以结合简单的核函数来形成更复杂的核函数。

​ 举个例子,对于一个核函数 K 和一个有 n 个向量的集合,一个多项式核函数可以如下构造:

Kpoly(di,dj)=(K(di,dj)+c)p

其中 p 是一个正整数, c 是一个非负常数。显然,我们增大了计算的开销来定义一个新的特征空间。一个与 p 阶多项式核函数相联系的特征空间包含了最多 p 个特征的组合。因此多项式核函数可以生成出以图像为样本的维数极高的特征空间。

​ 而高斯核函数定义的特征空间是希尔伯特空间,它的定义是:

Kgauss(di,dj)=exp(||didj||22σ2)

一个高斯核函数允许学习算法从线性分割到无穷维分割。

3. 一个作用于文本序列的核函数

​ 在这个部分我们将描述一个作用于两份文本的核函数。比较它们的思想是考虑它们所拥有的子序列。共同拥有的子序列越多,那么它们就越相似。子序列连续的程度越大,那么在计算时占据的权重就越大。

​ 例如,子序列 “car” 在单词 “card” 和单词 “custard” 中都出现了,但它们的权重不同。对每一个这样的子序列都有一个对应的特征空间,相应的坐标决定于子序列出现的频率和相似程度。为了处理不连续的子序列,引入一个衰减因数来描述子序列的存在形式是很有必要的。

例子: 考虑简单的文档中可能出现的单词- cat, car, bat, bar。如果我们只考虑 k=2 的情形,我们便有了一个 8 维的特征空间,每个单词对应的向量为:

ca ct at ba bt cr ar br ϕ(cat) λ2 λ3 λ2 0 0 0 0 ϕ(car) λ2 0 0 0 0 λ3 λ2 ϕ(bat) 0 0 λ2 λ2 λ3 0 0 ϕ(bar) 0 0 0 λ2 0 0 λ2

于是,单词 cat 与单词 car 非正规化的核的值为: K(cat,car)=λ4 ,而相应的 K(cat,cat)=K(car,car)=2λ4+λ6, 所以得到的正规化的核的值为: K(car,cat)=12+λ2 。需要注意的是,通常文章的长度会大于一个单词,而整篇文章是映射到一个特征空间上的,所以所有单词之间的联系以及空格都会被考虑为一个单独的序列。

​ 然而,对某些子序列的长度(比如 k>4)和常规大小的文档,直接计算这些相关的特征是不现实的 (即使文档的规模很小) 。但我们可以发现如果通过动态规划可以非常有效地定义和计算这些特征。我们从特征本身展开并计算它们的内积。在这种情况下我们并不需要考虑它是否满足 Mercer 的条件(对称和半正定),因为按照之前内积的定义这是显然的。这个叫做字符串子序列核(String Subsequence Kernel = SSK)的核方法主要由生物信息学相关的应用所驱动。它将字符串转化为所有长度为 k 的字符串组成的线性空间上的向量。下面是具体的定义:

定义1 :设 Σ 是有限字符集,一个字符串为一个由有限个 Σ 中的元素组成的有序序列 (包括空串)。对于字符串 s,t ,我们用 |s| 表示 s 的长度,串 st 表示将 st 首尾相连得到的新串。 s[i:j] 表示 s 的子串: sisi+1sj 。 设 us 的一个子序列,那么存在下标数列 i=i1,,i|u| 满足 1i1<i|u||s|sij=ujl(i)=i|u|i1+1 。我们用 Σn 表示所有的长度为 n 的字符串组成的集合,并且用 Σ 表示所有字符串的集合,即:

Σ=n=0Σn

我们再定义相应的特征空间: Fn=RΣn 。对于特定字符串 uΣn 的映射函数 ϕ 定义为 :
ϕn(s)=i:u=s[i]λl(i)

对于 λ1 ,这些特征衡量子串出现的次数并根据长度来进行估值。因此两个字符串 s,t 对应的特征向量的内积是它们所有出现的子串根据出现的频率和长度进行计算的。
Kn(s,t)=uΣnϕu(s)ϕu(t)=uΣni:u=s[i]λl(i)j:u=t[j]λl(j)=uΣni:u=s[i]j:u=t[j]λl(i)+l(j)

如果直接计算这些特征需要的时空复杂度是 O(|Σ|n) 。同样,对于大文件,大多数的维度都是由非零数组成的。为了得到一个有效的计算字符串核函数的方法,我们单独定义一个辅助函数来找到其中的递推关系。令:
Kk(s,t)k=uΣki:u=s[i]j:u=t[j]λl(i)+l(j)i1j1+2=1,,n1

这个表达式中我们把从子序列的开头一直算到整个字符串的结束而不仅仅是子序列的跨度来作为它的长度。我们可以通过找到 K 的递推关系从而求得 K

定义2:子序列核函数的递推计算(x 是单个字符)

K0(s,t)Ki(s,t)Ki(s,t)Ki(sx,t)Kn(sx,t)=1, for all s,t,=0, if min(|s|,|t|)<i,=0, if min(|s|,|t|)<i,=λKi(s,t)+j:tj=xKi1(s,t[1:j1])λ|t|j+2,=Kn(s,t)+j:tj=xKn1(s,t[1:j1])λ2.

注意到我们需要用辅助函数 K ,因为只有子序列的内部间隔是被损害 (penalised) 的。这个递推关系的正确性我们可以通过观察字符串是如何在增长的同时,对每个原来的子序列带来 λ 的变化。因此在 Ki(sx,t) 的公式中,第一项因为比原先要少了一个字符,所以提出来一个 λ 的因数,又因为第二项中每一个字符串对应的位置比之前要少 |t|j+2 ,所以乘上 λ|t|j+2 的系数。再看最后一个公式,我们可以把 t 中对应的 x 的提出来,再对前面的子序列进行匹配,所以最后需要乘上 λ2 。如果我们要计算一段区域内 n 对应的值,我们只需要算出 K1 开始一直到 n1 对应的值,从而得到对应于每一维的 K(s,t)

​ 我们得到了这样一个核函数,自然的可以考虑通过规范化来去除字符串长度所带来的偏移。我们需要规范化的是特征空间中对应的特征向量。于是,我们定义一个新的函数 ϕ^)(s)=ϕ(s)||ϕ(s)|| ,从而引出下面的核函数:

K^(s,t)=ϕ(s)||ϕ(s)||ϕ(t)||ϕ(t)||=1||ϕ(s)||||ϕ(t)||ϕ(s),ϕ(t)=K(s,t)K(s,s)K(t,t)

快速计算SSK

​SSK 度量了两份文档 st 的相似度,耗费的时间复杂度大概为 O(n|s||t|2) 。显然的,由 定义2 可以发现最外层的递推是跟序列长度有关,而对于 st 中的每一个字符都需要再算一遍 t 的值。所以我们可以优化 SSK 的计算,我们现在可以再找到一个 SSK 的递推表达式来 。首先计算:

K′′i=j:tj=xKi(s,t[1:j1])λ|t|j+2

然后发现我们可以在 O(|s||t|) 时间内计算出 Ki(s,t) 的值:
Ki(sx,t)=λKi(s,t)+K′′i(sx,t)

注意到 K′′i(sx,tu)=λ|u|K′′i(sx,t) ,对于给定的没在 u 中出现的 x ,有:
K′′i(sx,tx)=λ(K′′i(sx,t)+λKi1(s,t))

这给出了我们一种 O(|s||t|) 计算 K′′i(s,t) 的方法,于是我们可以在 O(n|s||t|) 时间内算出核函数的值


第一部分结束

0 0
原创粉丝点击