文献阅读——Revisiting Semi-Supervised Learning with Graph Embeddings

文献阅读——Revisiting Semi-Supervised Learning with Graph Embeddings

1 Introduction

半监督学习的目标是利用未标记的数据来改善模型的效果。大量半监督的学习算法共同优化利用已标记数据的监督学习损失和利用已标记数据和未标记数据的半监督学习的两个训练的目标函数。基于图的半监督学习定义了一个对于已标记数据和一个图的拉普拉斯正则化项的损失函数。其中图的拉普拉斯正则化项是一个基于周围节点假设:其假设图中相邻的节点之间拥有相同的标签结构。因为其通过图结构约束了标签的一致性,所以这种拉普拉斯约束是有效的。

最近被提出的半监督学习方法是通过学习预测分布情况的编码。例如:一个词的编码可以通过其周围的上下文进行预测。图中一个节点的编码可以通过其周围的节点进行预测。通过上下文分布来训练编码可以被用来提高相关任务的表现。例如:通过语言模型训练的词编码可以被应用到词性标注,分块和实体识别中去。

在本文中,我们考虑的不是词编码而是图的编码表示。结果显示图编码对于一个图的节点分类是有效的,例如在一个社交网络中的用户行为的预测。然而,图编码经常通过具体的监督学习任务分别的进行学习。因此,在某些意义下图编码对于不能够产生有效的特征,并且可能无法充分的利用到图结构中有效的编码信息的图的拉普拉斯正则化是互补的。

我们的工作的重点包括在于将图编码技术整合到基于图的半监督学习的环境中去。我们提出了一个新的,图的半监督学习的框架:Planetoid。一个样本被同时训练于预测该样本的类别标签和图中的上下文。然后,我们原始分类器的编码层和隐藏层进行拼接,并且将其输入到softmax中来进行预测。

因为这些编码是基于图结构进行学习的。以上的方法被称为转导推理。这种方式意味着我们仅仅能够预测在训练时在图中已经发现的样本。在很多的条件下,预测的样本点可以是在训练时没有在图中发现的节点,我们将这种预测称为归纳推理。为了描述这个问题,我们将提出我们的框架关于归纳推理的一个变体。我们定义这些编码定义为一个以特征作为输入的参数化函数。例如这些编码可以看做是神经网络的一个隐层。

为了演示我们提出的方法的有效性,我们使用五个数据集来完成3个任务。包括文本分类,远距离监督的实体抽取和实体分类任务。我们的归纳推理的方法的效果相比于第二名提升了18.7%,在准确度上平均提高了7.8%个点。

2 相关工作

2.1 半监督学习

这里使用L和U表示已经标记和没有标记的样本的数量。使用 X 1 : L X_{1:L} X1:L X L + 1 : L + U X_{L+1:L+U} XL+1:L+U表示的已经标记的样本的向量和没有标记的样本的向量表示。这里已标记的样本点的标签 y 1 ; L y_{1;L} y1;L已经给出。基于已标记和未标记的样本,半监督学习的问题被定义成学习一个分类器 f : x − > y f:x->y f:x>y,这里有两种范式,转导推理和归纳推理。转导推理的目标是将分类器应用在在训练时已经发现的未标记的数据,这个分类器不会囊括没有发现的数据。例如,转导支持向量机(TSVM),基于低密度分离的方式,假设一个好的超平面依赖于特征空间的稀疏区域。来最大化未标记数据的距离。另一个方面,归纳推理的目标是生成一个参数化的分类器 f f f来囊括没有发现的样本。

2.2 基于图的半监督学习

除了已标记和未标记的数据,一个通过一个(L+U) * (L+U)的矩阵A进行表示的图可以给出很多基于图的半监督学习算法。每一项 a i j a_{ij} aij表示的是样本i和样本j之间的相似情况。矩阵A的生成可以通过样本的之间的距离来派生出来,也可以明确地通过额外的信息派生出来。例如一个知识图谱或者一个文献之间的引用网络。在本文中,我们重点关注的是一个图可以被明确的给出,并且其特征向量中不包含其他的额外信息。例如,图中的边反应的是两个文献之间的超链接,而非采用词袋表示之后的文献之间的距离。

基于图的半监督学习的假设是相邻的节点之间具有相同的标签。一般的,基于图的半监督学习的损失函数如下所定义:
∑ i = 1 L l ( y i , f ( x i ) ) ) + λ ∑ i , j a i j ∣ ∣ f ( x i ) − f ( x j ) ∣ ∣ 2 = ∑ i = 1 L l ( y i , f ( x i ) ) ) + λ f T △ f ∑_{i=1}^Ll(y_i,f(x_i)))+λ∑_{i,j}a_{ij}||f(x_i)-f(x_j)||^2=∑_{i=1}^Ll(y_i,f(x_i)))+λf^T△f i=1Ll(yi,f(xi)))+λi,jaijf(xi)f(xj)2=i=1Ll(yi,f(xi)))+λfTf

在上面的等式中,第一项是常规的监督学习的损失,其中 l l l可以是对数损失,平方损失或者铰链损失。第二项表示的图的拉普拉斯惩罚项,其揭示了相似节点被预测成不同标签 f ( x i ) ≠ f ( x j ) f(x_i)≠f(x_j) f(xi)=f(xj)的惩罚项。图的拉普拉斯矩阵被定义为 △ = A − D △=A-D =AD,其中D是一个对角矩阵,每一个项被定义为 d i i = ∑ j a i j d_{ii}=∑_{j}a_{ij} dii=jaij,λ是一个常数的权重项。为了简单起见,我们没有给出参数的正则化项。

大量的基于图的半监督学习的算法定义的损失函数都是上述等式的变体。标签传播强制 f f f和标记的实例 y 1 : L y_{1:L} y1:L一致,f是一个对于图中未标记实例的查找表,并且可以获得一个相似的解决方案。局部或者全局一致性学习算法定义 l l l是一个平方损失,定义f是一个查找表,其不强制f必须和已标记的样本一致。MAD算法是标签传播的一个变体,其允许在已标记的数据上进行预测,以此来变化和合并不确定的点。Mainfold 正则通过将l定义为平方损失或者铰链损失 在复制内核希尔伯特空间参数化 f f f。因为f是一个参数化的分类器,其自然的可以取处理未发现的数据。

半监督编码算法扩展了在上述等式中的正则化项 ∑ i , j a i j ∣ ∣ g ( x i ) − g ( x j ) ∣ ∣ 2 ∑_{i,j}a_{ij}||g(x_i)-g(x_j)||^2 i,jaijg(xi)g(xj)2,其中g表示的是样本的编码,其可以是输出标签,隐藏层,或者是一个神经网络的辅助编码,通过将正则化项f扩展成g,这种方法加强了对于神经网络的约束。迭代分类算法使用一个以邻居节点的标签作为输入,并且使用一个在估计局部分类器和分配新标签之间的迭代过程的局部分类器。

2.3 编码学习

在编码学习领域,存在了广泛的研究方法。一个概率生成模型被用来学习节点表示,然后在图中生成边。一个聚类算法被用来在社交网络中学习隐藏的社交状态,最后预测社交标签。

最近,大量的编码学习的方法基于Skipgram模型,其是softmax的一个变形。给定一个实例和其上下文,给定一个实例和其上下文,Skipgram的目标是最小化一个对数损失来使用一个输入实例的编码预测上下文。常规的,令{(i,c)}是一个实例和上下文的集合。损失函数可以被定义为:
− ∑ i , c l o g p ( c ∣ i ) = − ∑ i , c ( w c T e i − l o g ∑ c ′ ∈ C e x p ( w c ′ T e i ) ) -∑_{i,c}logp(c|i)=-∑_{i,c}(w_c^Te_i-log∑_{c'∈C}exp(w_{c'}^Te_i)) i,clogp(ci)=i,c(wcTeilogcCexp(wcTei))
其中C表示的是所有可能的上下文集合。w’是Skipgram模型的参数, e i e_i ei是样本i的编码表示。

Skipgram第一次被介绍是为了学习词的表示,在Word2Vector中,对于每一个训练对(i,c),i表示的是当前的样本,c表示语句中固定窗口的上下文信息。上下文的空间C是语料库的词表。后来,Skipgram被用于图编码的学习,Deepwalk算法用图中的一个节点的表示来预测上下文。上下文以随机游走的方式来生成。更具体的,对于每一个训练对(i,c),样本i是图中待计算编码的节点。c表示的是在一个固定窗口内部通过随即游走的方式生成的序列。上下文的空间C是图中的所有的节点。LINE通过一阶和二阶邻居,以更多的上下文空间来扩展了模型。

尽管对于图而言,类似于Skipgram的模型在最近受到了很多的关注。很多其他的模型也是存在的,TRANSE模型在一个知识图中加入了实体的关系来学习实体的表示。 自编码器通过在图中的聚类来学习图的编码表示。

2.4 比较

我们在半监督学习和编学习方面比较了本文的模型和其他方法的效果。如下表所示:
在这里插入图片描述
不像我们的模型,基于其他方法的常规的图拉普拉斯在标签上加入了正则化,但是没有学习到编码表示。半监督编码方法使用神经网络学习到了编码表示,但是我们的方法在在强加正则化上和这个方法是不同的。我们使用编码表示来预测在图中的上下文。图编码的方法将图结构编码成编码表示,然而和我们的方法不同的是,这些方法是纯粹的无监督的并且没有没在在具体的任务中利用到标签信息。更多的,这些方法都是转导的,不能够直接的在训练的时候囊括未标记的样本。

3 通过图编码的半监督学习

通过上一节的说明的符号,我们的模型输入包括样本 X 1 : L , y 1 : L , X L + 1 : L + U X_{1:L},y_{1:L},X_{L+1:L+U} X1:L,y1:L,XL+1:L+U和一个表示图的矩阵 A A A,每一个样本i有一个编码表示为 e i e_i ei
下面,我们来利用前馈网络定义我们的模型,给定输入特征向量 X X X,神经网络的第k个隐层被表示为 h k h^k hk,其通过前一层和一个非线性的激活函数生成:
h k ( X ) = R e L U ( W k h k − 1 ( X ) + b k ) h^k(X)= ReLU(W^kh^{k-1}(X) + b^k) hk(X)=ReLU(Wkhk1(X)+bk)
其中, W k , b k W^k,b^k Wk,bk都是第k层的参数,并且 h 0 ( X ) = X h^0(X)=X h0(X)=X,我们采用的是ReLU(x)=max(0,x)作为非线性的激活函数。

在我们的框架中,使用的损失函数可以被表示为:
L s + λ L u L_s+λL_u Ls+λLu
其中 L s L_s Ls是监督学习中对于标签预测的损失, L u L_u Lu是无监督学习中预测图上下文的损失。我们首先介绍如何从图中进行上下文采样来形成 L u L_u Lu,然后从半监督学习框架中形成 L s L_s Ls

3.1 上下文采样

我们通过下面的等式来生成无监督损失 L u L_u Lu
− ∑ i , c l o g p ( c ∣ i ) = − ∑ i , c ( w c T e i − l o g ∑ c ′ ∈ C e x p ( w c ′ T e i ) ) -∑_{i,c}logp(c|i)=-∑_{i,c}(w_c^Te_i-log∑_{c'∈C}exp(w_{c'}^Te_i)) i,clogp(ci)=i,c(wcTeilogcCexp(wcTei))
给定一个图A,我们的方法的一个基本思路是对于样本i和上下文环境c进行采样,然后通过对数损失 − l o g p ( c ∣ i ) -logp(c|i) logp(ci)来形成损失 L u L_u Lu。我们首先通过介绍负采样的方式来 L u L_u Lu的形式。然后描述如何对于样本和上下文进行采样。

一般来讲,由于整个上下文空间C的归一化,直接使用上面的等式是不方便的。而负采样就是被用来解决这个问题,负采样通过负样本的采样来近似归一化项。对于我们而言,我们从一个分布中采样 ( i , c , γ ) (i,c,γ) (i,c,γ),其中i和c表示样本和其上下文空间,γ=+1意味着(i,c)是一个正例样本,γ=-1表示是负例。给定 ( i , c , γ ) (i,c,γ) (i,c,γ),我们最小化分类(i,c)到正负类的交叉熵损失。
− Ⅱ ( γ = 1 ) l o g σ ( w c T e i ) − Ⅱ ( γ = − 1 ) l o g σ ( − w c T e i ) -Ⅱ(γ=1)logσ(w_c^Te_i)-Ⅱ(γ=-1)logσ(-w_c^Te_i) (γ=1)logσ(wcTei)(γ=1)logσ(wcTei)
其中σ表示的是sigmoid函数:
σ ( x ) = 1 ( 1 + e − x ) σ(x)=\frac{1}{(1+e^{-x})} σ(x)=(1+ex)1
并且Ⅱ()是一个指示函数,为真的时候输出为1,否则为0。因此,在负采样的无监督损失为:
L u = − E i , c , γ l o g σ ( γ w c T e i ) L_u=-E_{i,c,γ}logσ(γw_c^Te_i) Lu=Ei,c,γlogσ(γwcTei)
其中分布 p ( i , c , γ ) p(i,c,γ) p(i,c,γ)是在标签 y 1 : L y_{1:L} y1:L和图A上是条件分布。由于它们是我们算法的输入并保持固定,因此我们将条件放在符号中。

我们现在来使用采样过程定义 p ( i , c , γ ) p(i,c,γ) p(i,c,γ)分布,其可以通过下面的算法进行描述:
在这里插入图片描述
在算法中,有两种上下文样本被采样。第一种上下文基于图矩阵A,其编码了结构信息。第二种类型的上下文基于标签。我们将标签信息注入到编码中。这里我们使用 r 1 ∈ ( 0 , 1 ) r_1∈(0,1) r1(0,1)来控制正负样本的比例,使用 r 2 ∈ ( 0 , 1 ) r_2∈(0,1) r2(0,1)来控制两种上下文的比例。

通过概率 p 2 p_2 p2,我们基于图A来采样上下文。我们首先均匀采样一个随机游走序列S。更具体的,我们从第一个集合1:L+U中采样序列 S 1 S_1 S1。给定之前的样例 S k − 1 = i S_{k-1}=i Sk1=i,下一个实例 S k = j S_k=j Sk=j a i j ∑ j ′ = 1 L + U a i j ′ \frac{a_{ij}}{∑_{j'=1}^{L+U}a_{ij'}} j=1L+Uaijaij的概率进行采样。通过概率 r 1 r_1 r1,我们采样从集合{ ( S j , S k ) : ∣ j − k ∣ < d (S_j,S_k):|j-k|<d (Sj,Sk):jk<d}一个正例对 ( i , c ) (i,c) (i,c),d是另外一个决定窗口大小的参数。通过概率 ( 1 − r 1 ) (1-r_1) (1r1),随机破坏上下文环境c来进行负样本采样。

通过概率( 1 − r 2 1-r_2 1r2),我们基于类别标签来采样上下文信息。正例对采样相同的标签,负例采样不同的标签。仅仅标记的样本的标签被采样。

我们基于采样方法的随机游走是建立在Deepwalk算法上的。与他们的方法相反,我们的方法处理的是真实的A,囊括了负采样,和以概率( 1 − r 2 1-r_2 1r2)从标签中明确采样来注入监督信息。

下面给出一个γ=1的采样实例:

在这里插入图片描述

3.2 转导推理形式

在这一节中,我们提出一个不通过未发现的样本来推断未标记样本 y L + 1 : L + U y_{L+1:L+U} yL+1:L+U的方法。因为,转导推理可以利用到未标记的测试数据,所以转导推理学习一般会比归纳推理的效果更好。

我们在输入特征向量X上应用K层神经网络来获取 h k ( x ) h^k(x) hk(x),并且l层的神经网络可以获得编码e的输出 h l ( e ) h^l(e) hl(e)。这里我们使用下面的算法进行描述:

在这里插入图片描述
两个隐藏层被拼接,并且送入到softmax层来预测样本的类别标签。更具体的,预测为标签y的概率为:
p ( y ∣ x , e ) = e x p [ h k ( X ) T , h l ( e ) T ] w y ∑ y ′ e x p [ h k ( x ) T , h l ( e ) T ] w y ′ p(y|x,e)=\frac{exp{[h^k(X)^T,h^l(e)^T]w_y}}{∑_{y'}exp[h^k(x)^T,h^l(e)^T]w_{y'}} p(yx,e)=yexp[hk(x)T,hl(e)T]wyexp[hk(X)T,hl(e)T]wy
其中[;]表示两个行向量的拼接。 h T h^T hT表示 h h h的转置。w表示模型的参数。

最后,结合负采样的无监督损失,我们定义转导推理的损失函数:
− 1 L ∑ i = 1 L p ( y i ∣ x i , e i ) − λ E i , c , γ l o g σ ( γ w c T e i ) -\frac{1}{L}∑_{i=1}^Lp(y_i|x_i,e_i)-λE_{i,c,γ}logσ(γw_c^Te_i) L1i=1Lp(yixi,ei)λEi,c,γlogσ(γwcTei)
在损失函数中,第一项定义的是我们上面提到的概率,第二项定义的是上下文预测的损失函数。标签y的预测依赖于在训练时仅仅能够在图A可以发现的样本的编码e。

3.3 归纳推理形式

我们考虑上面描述的转导推理的形式。在许多情况下,需要学习一个能够包括未标记样本的分类器,尤其是大型的任务上。例如,机器阅读系统经常在Web上遇到新的实体。然而,因为学习的图编码本质上是转导推理的。其不能直接用于归纳推理的设置。Perozzi等人通过逐渐的再训练编码来解决这个问题。这种方法和耗时,并且本质上不是归纳推理。

为了实现归纳推理的方法,标签y的预测应该仅仅依赖于输入特征向量x。因此,我们定义了编码e作为一个关于特征x参数化的函数。如下图所示:

在这里插入图片描述
与转导推理类似,我们使用K层的神经网络在输入向量x上来得到 h k ( x ) h^k(x) hk(x)。然而,这里不是使用一个“免费”的编码。我们应用 l 1 l_1 l1层网络在输入向量X上,并且定义其编码 e = h l 1 ( x ) e=h^{l1}(x) e=hl1(x)。然后另外 l 2 l_2 l2层并应用在 h l 2 ( e ) = h l 2 ( h l 1 ( x ) ) h^{l2}(e)=h^{l2}(h^{l1}(x)) hl2(e)=hl2(hl1(x))。标记 h l ( x ) h^l(x) hl(x),其中 l = l 1 + l 2 l=l_1+l_2 l=l1+l2。在这种形式中,编码e被视为一个关于特征X的参数函数形成的隐层。

通过上面的描述,标签y仅仅依赖于特征x,更具体的:
p ( y ∣ x ) = e x p [ h k ( x ) T , h l ( x ) T w y ] ∑ y ′ e x p [ h k ( x ) T , h l ( x ) T ] w y ′ p(y|x)=\frac{exp[h^k(x)^T,h^l(x)^Tw_y]}{∑_{y'}exp[h^k(x)^T,h^l(x)^T]w_{y'}} p(yx)=yexp[hk(x)T,hl(x)T]wyexp[hk(x)T,hl(x)Twy]

与转导推理相比,这里使用 h l ( x ) T h^l(x)^T hl(x)T替代了 h l ( e ) T h^l(e)^T hl(e)T,最后,定义损失函数为:
− 1 L ∑ i = 1 L p ( y i ∣ x i ) − λ E i , c , γ l o g σ ( γ w c T x i ) -\frac{1}{L}∑_{i=1}^Lp(y_i|x_i)-λE_{i,c,γ}logσ(γw_c^Tx_i) L1i=1Lp(yixi)λEi,c,γlogσ(γwcTxi)

3.4 训练

在训练的时候,采用的是随机梯度下降来在小批量样本上训练我们的模型。我们第一步对于已标记的样本采样一批。然后使用一个梯度步来分类预测优化损失函数。我们然后采样一批上下文 ( i , c , γ ) (i,c,γ) (i,c,γ),并且作为另外一个梯度步来优化上下文预测的损失。我们为上述的 T 1 , T 2 T_1,T_2 T1,T2来进行迭代获取近似的权重参数λ。算法2描述了基于SGD训练转导推理的形式。相似的是,我们可以通过替换 p ( y i ∣ x i , e i ) p(y_i|x_i,e_i) p(yixi,ei) p ( y i ∣ x i ) p(y_i|x_i) p(yixi) L s L_s Ls中,来获取归纳推理的训练算法,这里令θ表示模型所有的参数。我们使用编码和参数θ来进行转导推理。并且在归纳推理中更新参数θ。我们应用了许多训练迭代来优化无监督损失 L u L_u Lu。单独使用并使用学习到的编码e作为联合训练的初始化

4 参考

  1. Revisiting Semi-Supervised Learning with Graph Embeddings
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VLAD(Vector of Locally Aggregated Descriptors)是一种图像表示方法,常用于图像检索和计算机视觉任务中。它通过聚合局部特征描述符来生成图像的紧凑表示。 以下是一个简单的C++实现示例,展示了如何实现VLAD图像表示: ```cpp #include <iostream> #include <vector> #include <opencv2/opencv.hpp> // 聚类算法(这里使用K-means) cv::Mat kmeansClustering(const std::vector<cv::Mat>& descriptors, int numClusters) { cv::Mat allDescriptors; for (const cv::Mat& descriptor : descriptors) { allDescriptors.push_back(descriptor); } cv::Mat labels, centers; cv::TermCriteria criteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 100, 0.01); cv::kmeans(allDescriptors, numClusters, labels, criteria, 1, cv::KMEANS_PP_CENTERS, centers); return centers; } // 计算VLAD图像表示 cv::Mat computeVLAD(const std::vector<cv::Mat>& descriptors, const cv::Mat& visualWords) { int descriptorSize = descriptors[0].cols; cv::Mat vlad(visualWords.rows, descriptorSize, CV_32F, cv::Scalar(0)); for (const cv::Mat& descriptor : descriptors) { // 找到每个描述符最近的视觉词 cv::Mat difference = visualWords - descriptor; cv::Mat distances; cv::reduce(difference.mul(difference), distances, 1, cv::REDUCE_SUM); cv::Point minLoc; cv::minMaxLoc(distances, nullptr, nullptr, &minLoc); // 计算每个视觉词的残差 cv::Mat residual = descriptor - visualWords.row(minLoc.y); // 更新VLAD表示 for (int i = 0; i < descriptorSize; i++) { vlad.at<float>(minLoc.y, i) += residual.at<float>(0, i); } } // 归一化VLAD表示 cv::normalize(vlad, vlad, 1.0, 0.0, cv::NORM_L2); return vlad; } int main() { // 假设有一组局部特征描述符(使用OpenCV的Mat表示) std::vector<cv::Mat> descriptors = { (cv::Mat_<float>(1, 128) << /* descriptor values */ ), (cv::Mat_<float>(1, 128) << /* descriptor values */ ), (cv::Mat_<float>(1, 128) << /* descriptor values */ ), // ... }; // 聚类算法,得到视觉词汇 int numClusters = 100; cv::Mat visualWords = kmeansClustering(descriptors, numClusters); // 计算VLAD图像表示 cv::Mat vlad = computeVLAD(descriptors, visualWords); // 输出VLAD表示结果 std::cout << "VLAD Representation:\n" << vlad << std::endl; return 0; } ``` 在这个示例中,`descriptors`是一组局部特征描述符,每个描述符用一个`cv::Mat`对象表示。首先,使用K-means聚类算法将所有描述符聚类成`numClusters`个视觉词汇,并得到`visualWords`矩阵。然后,根据每个描述符找到最近的视觉词,并计算每个视觉词的残差。将残差累加到VLAD表示中,并进行归一化处理。最后,输出VLAD图像表示结果。 请注意,这只是一个简单的VLAD图像表示的C++实现示例,供你参考。在实际应用中,你可能需要根据具体需求进行修改和扩展,例如使用更复杂的特征提取方法、改进聚类算法等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值