针对结构映射的SVM算法:核心思路解读

最近准备做一个NER和指代消解相关的课题,在和同学们读相关文章。今天有个同学找到了个挺有意思的文章,用SVM做NER的。我感觉这想法挺奇特的,SVM怎么处理文本和序列?于是我去看了一下,他找的那篇文章是个套壳文章,核心算法引用了一篇很多年之前发表的,讲如何将SVM用于结构化数据映射的文章,即

Tsochantaridis I ,  Joachims T ,  Hofmann T , et al. Large Margin Methods for Structured and Interdependent Output Variables[J]. Journal of Machine Learning Research, 2006, 6(2):1453-1484.

这篇文章三千多引用,按说应该挺有名的,但我没听说过(捂脸)。于是刚才花一些时间读了一下,文章比较长,公式也比较多,我提炼了我们关注的核心问题,与大家分享。

如何针对SVM处理文本序列输入

一开始听同学说用SVM,我还以为是word2vec然后扔SVM一把梭的直白文章。后来读了才知道这文章主要是理论分析。原文以seq2seq问题举例,是一步一步分析的:

对于序列\{x_1,x_2,......\},最朴素的方法是直接拿单个元素预测(不用编码),但这显然是垃圾方法。其次当然是理所应当的提取窗口特征,即相当于对x_i附近的一系列元素编码。至于怎么编码根据不同问题而定(因为它这个算法针对的是一类问题,所以要讲宏观解法。4.5节之后专门针对自然语言parse问题分析了一下具体怎么做)

如何用SVM推断序列

我们平时用的SVM都是没有内部状态的,所以没有办法做传统的seq2seq。这篇文章先孤立的考虑:SVM先就负责对x_i(指x_i位置滑动窗口计算形成的编码)计算y_i。既然前面已经对x_i编码,转变为普通的空间映射问题,那用传统的SVM就能解决。不过因为序列的每个位置都是多样的,比如词性标注,词性是有很多种的;对于重组输入元素(比如序列结构转树结构)之类的问题,每个位置的元素种类就更多了,类数量太多,传统的SVM有可能没办法收敛。这篇文章的主要贡献在于这里,提出了一种割平面法:

 该方法基于四种不同损失的SVM进行优化:

该算法基于在核函数\psi空间上迭代优化的不同进程(由H(y)度量)添加不同的约束。由于类数量多,因此会产生大量约束,割平面法用于在约束数量很大的情况下求解。简单来说,当没法直接构造满足所有约束的解时,先构造一堆满足部分约束的解,然后基于这些解的位置迭代,找到一个满足所有约束的解。

注:这一部分我有一个不太确定的地方。在前面的问题分析中,作者举例“序列的每个位置有n种情况,会导致类数量指数扩大,该算法可以解决类数量庞大的问题”,这暗示着算法可以直接输出序列。但在第三章介绍的算法中并不涉及序列相关内容,算法输入输出的特征图形式和传统SVM并没有不同。第四章中介绍了几种具体任务,其中也有使用该算法解非结构映射问题的任务,显然,使用处理序列的模型解决非序列问题是不明智的。因此我认为前文中提到的“算法直接输出序列”是一个错误的暗示,该方法并没有直接处理序列,实际处理序列还需要借助其它方法(见下文)

如何利用序列信息

对于seq2seq问题,可以使用前文改进的SVM对于每个x_i推断y_i。但我们要预测的是一个序列Y,它不是对于每个x_i推断一个y_i,推断n次就可以了。这样做的话,除了输入编码时以外,没有利用到序列信息,推断出的所有y_i都是孤立的。我们想要的是整体最优化。因此文章针对每个位置可能的推断结果再进行动态规划:

它用的这种方法有一个前提,就是得有能计算最终序列Y好坏的指标(比如文中提到的度量语法树的F1分数)。对于这个整体性指标,每次推断的y_i会影响后面最优的y_{i+1}(如“吃”后面大概率是“饱了”而不会是“饿了”)。这样,不能每次推断都机械性选择SVM给出的最好结果,因为局部最优不等于全局最优,针对这类序列优化问题,显然可以使用动态规划来优化这个外部指标,让整体序列最优。这和使用常规语言模型+CRF解决自然语言seq2seq问题的思路是相同的。

别的怪东西

另外这篇文章还有一个挺有意思的建模思路:

这一部分指出:因为结构的元素之间是有统一的特征的,比如对于偏序a<b<c,a和b之间的映射和b和c之间的映射肯定存在能共享的特征。因此可以对元素见的这些共享特征建模,并对于不同元素再学习不同的参数(比如我想象的一个例子:通过偏序序列前一个元素预测后一个元素,在输入不同元素时,会产生不同内部参数进行推断)。这一思路可以指导本文第二部分的具体建模

猜你喜欢

转载自blog.csdn.net/FYZDMMCpp/article/details/126322995