当前位置: 首页>数据库>正文

一文详解图神经网络(sa)

5.2 《Semi-Supervised Classification with Graph Convolutional Networks》

这篇论文受到谱图卷积的局部一阶近似可以用于对局部图结构与节点的特征进行编码从而确定卷积网络结构的启发,提出了一种可扩展的图卷积的实现方法,可用于具有图结构数据的半监督学习

5.2.1 GCN定义

按照图傅里叶变换的性质,可以得到如下图卷积的定义:
一文详解图神经网络(sa),(\boldsymbol{f} * \boldsymbol{h})_{\mathcal{G}}=\boldsymbol{\Phi} \operatorname{diag}\left[\hat{h}\left(\lambda_{1}\right), \ldots, \hat{h}\left(\lambda_{n}\right)\right] \mathbf{\Phi}^{T} \boldsymbol{f}\tag{46},第1张
其中:

  • 对于图一文详解图神经网络(sa),\boldsymbol{f},第2张的傅里叶变换为的傅里叶变换为的傅里叶变换为一文详解图神经网络(sa),\boldsymbol{\hat{f}}=\mathbf{\Phi}^{T} \boldsymbol{f},第3张
  • 对于卷积核的图傅里叶变换:一文详解图神经网络(sa),\hat{h}=\left(\hat{h}_{1}, \ldots, \hat{h}_{n}\right),第4张其中一文详解图神经网络(sa),\hat{h}_{k}=\left\langle h, \phi_{k}\right\rangle, k=1,2 \ldots,第5张,按照矩阵形式就是一文详解图神经网络(sa),\hat{\boldsymbol{h}}=\mathbf{\Phi}^{T} \boldsymbol{h},第6张
  • 对两者的傅里叶变换向量一文详解图神经网络(sa),\hat{f} \in \mathbb{R}^{N \times 1},第7张一文详解图神经网络(sa),\hat{h} \in \mathbb{R}^{N \times 1},第8张element-wise乘积等价于将一文详解图神经网络(sa),{h},第9张组织成对角矩阵,即一文详解图神经网络(sa),\operatorname{diag}\left[\hat{h}\left(\lambda_{k}\right)\right] \in \mathbb{R}^{N \times N},第10张,然后再求一文详解图神经网络(sa),\operatorname{diag}\left[\hat{h}\left(\lambda_{k}\right)\right],第11张一文详解图神经网络(sa),\boldsymbol{f},第2张矩阵乘法
  • 求上述结果的傅里叶逆变换,即左乘一文详解图神经网络(sa),\mathbf{\Phi},第13张

深度学习中的卷积就是要设计trainable的卷积核,从上式可以看出,就是要设计一文详解图神经网络(sa),\operatorname{diag}\left[\hat{h}\left(\lambda_{1}\right), \ldots, \hat{h}\left(\lambda_{n}\right)\right],第14张,由此,可以直接将其变为卷积核一文详解图神经网络(sa),\operatorname{diag}\left[\theta_{1}, \ldots, \theta_{n}\right],第15张而不需要再将卷积核进行傅里叶变换,由此,相当于直接将变换后的参量进行学习

第一代GCN

一文详解图神经网络(sa),\boldsymbol{y}_{\text {output}}=\sigma\left(\mathbf{\Phi} \boldsymbol{g}_{\theta} \mathbf{\Phi}^{T} \boldsymbol{x}\right)=\sigma\left(\boldsymbol{\Phi} \operatorname{diag}\left[\theta_{1}, \ldots, \theta_{n}\right] \mathbf{\Phi}^{T} \boldsymbol{x}\right)\tag{47},第16张

其中,一文详解图神经网络(sa),\boldsymbol{x},第17张就是graph上对应每个节点的feature构成的向量,一文详解图神经网络(sa),x=\left(x_{1}, x_{2}, \ldots, x_{n}\right),第18张,这里暂时对每个节点都使用标量,然后经过激活之后,得到输出一文详解图神经网络(sa),\boldsymbol{y}_{\text {output}},第19张,之后传入下一层

一些缺点:

  • 需要对拉普拉斯矩阵进行谱分解来求一文详解图神经网络(sa),\mathbf{\Phi},第13张,在graph很大的时候复杂度很高。另外,还需要计算矩阵乘积,复杂度为一文详解图神经网络(sa),O(n^2),第21张
  • 卷积核参数为一文详解图神经网络(sa),n,第22张,当graph很大的时候,一文详解图神经网络(sa),n,第22张会很大
  • 卷积核的spatial localization不好
第二代GCN

图傅里叶变换是关于特征值(相当于普通傅里叶变换的频率)的函数,也就是一文详解图神经网络(sa),F\left(\lambda_{1}\right), \ldots, F\left(\lambda_{n}\right),第24张,即一文详解图神经网络(sa),F(\mathbf{\Lambda}),第25张,因此,将卷积核一文详解图神经网络(sa),\boldsymbol{g}_{\theta},第26张写成一文详解图神经网络(sa),\boldsymbol{g}_{\theta}(\Lambda),第27张,然后,将一文详解图神经网络(sa),\boldsymbol{g}_{\theta}(\Lambda),第27张定义为如下k阶多项式:
一文详解图神经网络(sa),g_{\theta^{\prime}}(\mathbf{\Lambda}) \approx \sum_{k=0}^{K} \theta_{k}^{\prime} \mathbf{\Lambda}^{k}\tag{48},第29张
将卷积公式带入,可以得到:
一文详解图神经网络(sa),g_{\theta^{\prime}}*x≈\Phi\sum_{k=0}^K\theta^{\prime}_k\mathbf{\Lambda}^{k}\Phi^Tx\ =\sum_{k=0}^K\theta^{\prime}_k(\Phi\mathbf{\Lambda}^{k}\Phi^T)x\ =\sum_{k=0}^K\theta^{\prime}_k(\Phi\mathbf{\Lambda}\Phi^T)^{k}x\ =\sum_{k=0}^K\theta^{\prime}_kL^{k}x\tag{49},第30张
这一代的GCN不需要做特征分解,可以直接对Laplacian矩阵做变换,通过事先将Laplacian矩阵求出来,以及一文详解图神经网络(sa),\boldsymbol{L}^{k},第31张求出来,前向传播的时候,可以直接使用,复杂度为一文详解图神经网络(sa),O(Kn^2),第32张

对于每一次Laplacian矩阵一文详解图神经网络(sa),\boldsymbol{L},第33张一文详解图神经网络(sa),\mathbf{x},第34张相乘,对于节点一文详解图神经网络(sa),n,第22张,相当于从邻居节点一文详解图神经网络(sa),ne[n],第36张传递一次信息给节点一文详解图神经网络(sa),n,第22张,由于连续乘以了一文详解图神经网络(sa),k,第38张次Laplacian矩阵,那么相当于n节点的k-hop之内的节点能够传递信息给一文详解图神经网络(sa),n,第22张,因此,实际上只利用了节点的K-Localized信息

另外,可以使用切比雪夫展开式来近似一文详解图神经网络(sa),\boldsymbol{L}^{k},第31张,任何k次多项式都可以使用切比雪夫展开式来近似,由此,引入切比雪夫多项式的一文详解图神经网络(sa),K,第41张阶截断获得一文详解图神经网络(sa),\boldsymbol{L}^{k},第31张近似,从而获得对一文详解图神经网络(sa),g_{\theta}(\mathbf{\Lambda}),第43张的近似
一文详解图神经网络(sa),g_{\theta^{\prime}}(\mathbf{\Lambda}) \approx \sum_{k=0}^{K} \theta_{k}^{\prime} T_{k}(\tilde{\mathbf{\Lambda}})\tag{50},第44张
其中,一文详解图神经网络(sa),\tilde{\mathbf{\Lambda}}=\frac{2}{\lambda_{\max }} \mathbf{\Lambda}-\boldsymbol{I}_{n},第45张一文详解图神经网络(sa),\boldsymbol{\theta}^{\prime} \in \mathbb{R}^{K},第46张为切比雪夫向量,一文详解图神经网络(sa),\theta_{k}^{\prime},第47张为第一文详解图神经网络(sa),k,第38张个分量,切比雪夫多项式一文详解图神经网络(sa),T_{k}(x),第49张使用递归的方式进行定义:一文详解图神经网络(sa),T_{k}(x)=2 x T_{k-1}(x)-T_{k-2}(x),第50张,其中,一文详解图神经网络(sa),T_{0}(x)=1, T_{1}(x)=x,第51张,此时,带入到卷积公式:
一文详解图神经网络(sa),g_{\theta^{\prime}}*x≈\Phi\sum_{k=0}^K\theta^{\prime}_kT_k(\tilde{\mathbf{\Lambda}})\Phi^Tx\ ≈\sum_{k=0}^K\theta^{\prime}_k\Big(\Phi T_k(\tilde{\mathbf{\Lambda}})\Phi^T\Big)x\ =\sum_{k=0}^K\theta^{\prime}_k T_k(\tilde{\boldsymbol{L}}){x}\tag{51},第52张
其中,一文详解图神经网络(sa),\tilde{\boldsymbol{L}}=\frac{2}{\lambda_{\max }} \boldsymbol{L}-\boldsymbol{I}_{n},第53张,因此,可以得到输出为:
一文详解图神经网络(sa),\boldsymbol{y}_{\text {output}}=\sigma\left(\sum_{k=0}^{K} \theta_{k}^{\prime} T_{k}(\tilde{\boldsymbol{L}}) \boldsymbol{x}\right)\tag{52},第54张

第三代GCN

直接取切比雪夫多项式中一文详解图神经网络(sa),K=1,第55张,此时模型是1阶近似,将一文详解图神经网络(sa),K=1,第55张一文详解图神经网络(sa),\lambda_{\max }=2,第57张带入可以得到:
一文详解图神经网络(sa),g_{\theta^{\prime}} * x≈\theta_{0}^{\prime}x+\theta_{1}^{\prime}(\boldsymbol{L}-\boldsymbol{I}_{n})x\ =\theta_{0}^{\prime}x+\theta_{1}^{\prime}(\boldsymbol{L}-\boldsymbol{I}_{n})x\ =\theta_{0}^{\prime}x+\theta_{1}^{\prime})(\boldsymbol{D}^{-1 / 2} \boldsymbol{W} \boldsymbol{D}^{-1 / 2})x\tag{53},第58张
其中,归一化拉普拉斯矩阵一文详解图神经网络(sa),\boldsymbol{L}=\boldsymbol{D}^{-1 / 2}(\boldsymbol{D}-\boldsymbol{W}) \boldsymbol{D}^{-1 / 2}=\boldsymbol{I}_{n}-\boldsymbol{D}^{-1 / 2} \boldsymbol{W} \boldsymbol{D}^{-1 / 2},第59张。为了进一步简化,令一文详解图神经网络(sa),\theta_{0}^{\prime}=-\theta_{1}^{\prime},第60张,此时只含有一个参数一文详解图神经网络(sa),\theta,第61张
一文详解图神经网络(sa),g_{\theta^{\prime}} * x=\theta\left(I_{n}+D^{-1 / 2} W D^{-1 / 2}\right)\tag{54},第62张
由于一文详解图神经网络(sa),\boldsymbol{I}_{n}+\boldsymbol{D}^{-1 / 2} \boldsymbol{W} \boldsymbol{D}^{-1 / 2},第63张的谱半径一文详解图神经网络(sa),[ 0 , 2 ],第64张太大,使用归一化的trick:
一文详解图神经网络(sa),\boldsymbol{I}_{n}+\boldsymbol{D}^{-1 / 2} \boldsymbol{W} \boldsymbol{D}^{-1 / 2} \rightarrow \tilde{\boldsymbol{D}}^{-1 / 2} \tilde{\boldsymbol{W}} \tilde{\boldsymbol{D}}^{-1 / 2}\tag{55},第65张
其中,一文详解图神经网络(sa),\tilde{\boldsymbol{W}}=\boldsymbol{W}+\boldsymbol{I}_{n},第66张一文详解图神经网络(sa),\tilde{D}_{i j}=\Sigma_{j} \tilde{W}_{i j},第67张

由此,带入卷积公式
一文详解图神经网络(sa),\underbrace{g_{\theta^{\prime}} * x}_{\mathbb{R}^{n \times 1}}=\theta\left(\underbrace{\tilde{D}^{-1 / 2} \tilde{W} \tilde{D}^{-1 / 2}}_{\mathbb{R}^{n \times n}}\right) \underbrace{x}_{\mathbb{R}^{n \times 1}}\tag{56},第68张
如果推广到多通道,相当于每一个节点的信息是向量
一文详解图神经网络(sa),x \in \mathbb{R}^{N \times 1} \rightarrow X \in \mathbb{R}^{N \times C},第69张
其中,一文详解图神经网络(sa),N,第70张是节点数量,一文详解图神经网络(sa),C,第71张是通道数,或者称作表示节点的信息维度数。一文详解图神经网络(sa),\mathbf{X},第72张是节点的特征矩阵。相应的卷积核参数变化:
一文详解图神经网络(sa),\theta \in \mathbb{R} \rightarrow \Theta \in \mathbb{R}^{C \times F}\tag{57},第73张
其中,一文详解图神经网络(sa),F,第74张为卷积核数量,那么卷积结果写成矩阵形式为:
一文详解图神经网络(sa),\underbrace{Z}_{\mathbb{R}^{N \times F}}=\underbrace{\tilde{D}^{-1 / 2} \tilde{W} \tilde{D}^{-1 / 2}}_{\mathbb{R}^{N \times N}} \underbrace{X}_{\mathbb{R}^{N \times C}} \underbrace{\mathbf{\Theta}}_{\mathbb{R}^{C \times F}}\tag{58},第75张
上述操作可以叠加多层,对上述输出激活一下,就可以作为下一层节点的特征矩阵

一些特点:

  • 一文详解图神经网络(sa),K=1,第55张,相当于直接取邻域信息,类似于一文详解图神经网络(sa),3\times{3},第77张的卷积核
  • 由于卷积核宽度减小,可以通过增加卷积层数来扩大感受野,从而增强网络的表达能力
  • 增加了参数约束,比如一文详解图神经网络(sa),\lambda_{\max } \approx 2,第78张,引入归一化操作
5.2.2 论文模型

论文采用两层的GCN,用来在graph上进行半监督的节点分类任务,邻接矩阵为一文详解图神经网络(sa),A,第79张,首先计算出一文详解图神经网络(sa),\hat{A}=\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}},第80张,由此,前向网络模型形式如下:
一文详解图神经网络(sa),Z=f(X, A)=\operatorname{softmax}\left(\hat{A} \operatorname{ReLU}\left(\hat{A} X W^{(0)}\right) W^{(1)}\right)\tag{59},第81张
其中,一文详解图神经网络(sa),W^{(0)} \in \mathbb{R}^{C \times H},第82张为输入层到隐藏层的权重矩阵,隐藏层的特征维度为一文详解图神经网络(sa),H,第83张一文详解图神经网络(sa),W^{(1)} \in \mathbb{R}^{H \times F},第84张为隐藏层到输出层的权重矩阵,softmax激活函数定义为一文详解图神经网络(sa),\operatorname{softmax}\left(x_{i}\right)=\frac{1}{\mathcal{Z}} \exp \left(x_{i}\right),第85张一文详解图神经网络(sa),\mathcal{Z}=\sum_{i} \exp \left(x_{i}\right),第86张,相当于对每一列做softmax,由此得到交叉熵损失函数为:
一文详解图神经网络(sa),\mathcal{L}=-\sum_{l \in \mathcal{Y}_{L}} \sum_{f=1}^{F} Y_{l f} \ln Z_{l f}\tag{60},第87张
其中,一文详解图神经网络(sa),\mathcal{Y}_{L},第88张为带有标签的节点集合

5.2.3 代码实现
import torch_geometric.nn as gnn
class GCN(nn.Module):
    def __init__(self, config, in_channels, out_channels):
        '''
            in_channels : num of node features
            out_channels: num of class
        '''
        super().__init__()
        self.config = config
        self.hidden_dim = config.hidden_dim
        self.dropout_rate = config.dropout_rate
        self.conv1 = gnn.GCNConv(in_channels, self.hidden_dim, improved = False, cached=True, bias=True, normalize=True)
        self.conv2 = gnn.GCNConv(self.hidden_dim, out_channels, improved = False, cached=True, bias=True, normalize=True)
    def forward(self, data):
        x, edge_index = data.x, data.edge_index
        x = self.conv1(x, edge_index)
        x = F.relu(x)
        #x = F.dropout(x, p=self.dropout_rate) # If no drop out, accuracy 0.75 --> 0.80
        x = self.conv2(x, edge_index)
        #x = F.dropout(x, p=self.dropout_rate) # there are two dropout.. But performance bad.
        return x  

5.3 《Diffusion-Convolutional Neural Networks》

该模型对每一个节点(或边、或图)采用H个hop的矩阵进行表示,每一个hop都表示该邻近范围的邻近信息,由此,对于局部信息的获取效果比较好,得到的节点的representation的表示能力很强

5.3.1 任务定义
  • 一个graph数据集一文详解图神经网络(sa),\mathcal{G}=\left\{G_{t} | t \in 1 \ldots T\right\},第89张
  • graph定义为一文详解图神经网络(sa),G_{t}=\left(V_{t}, E_{t}\right),第90张,其中,一文详解图神经网络(sa),V_t,第91张为节点集合,一文详解图神经网络(sa),E_t,第92张为边集合
  • 所有节点的特征矩阵定义为一文详解图神经网络(sa),X_t,第93张,大小为一文详解图神经网络(sa),N_t\times{F},第94张,其中,一文详解图神经网络(sa),N_t,第95张为图一文详解图神经网络(sa),G_t,第96张的节点个数,一文详解图神经网络(sa),F,第74张为节点特征维度
  • 边信息一文详解图神经网络(sa),E_t,第92张定义为一文详解图神经网络(sa),N_t\times{}N_t,第99张的邻接矩阵一文详解图神经网络(sa),A_t,第100张,由此可以计算出节点度(degree)归一化的转移概率矩阵一文详解图神经网络(sa),P_t,第101张,表示从一文详解图神经网络(sa),i,第102张节点转移到一文详解图神经网络(sa),j,第103张节点的概率

模型的目标为预测一文详解图神经网络(sa),Y,第104张,也就是预测每一个图的节点标签,或者边的标签,或者每一个图的标签,在每一种情况中,模型输入部分带有标签的数据集合,然后预测剩下的数据的标签。DCNN模型输入图一文详解图神经网络(sa),\mathcal{G},第105张,返回硬分类预测值一文详解图神经网络(sa),Y,第104张或者条件分布概率一文详解图神经网络(sa),\mathbb{P}(Y|X),第107张。该模型将每一个预测的目标对象(节点、边或图)转化为一个diffusion-convolutional representation,大小为一文详解图神经网络(sa),H\times{}F,第108张一文详解图神经网络(sa),H,第83张表示扩散的hops,表示为一文详解图神经网络(sa),Z_t,第110张

  • 对于节点分类任务,表示为一文详解图神经网络(sa),Z_t,第110张为大小为一文详解图神经网络(sa),N_t\times{H}\times{F},第112张的矩阵
  • 对于图分类任务,张量一文详解图神经网络(sa),Z_t,第110张为大小为一文详解图神经网络(sa),H\times{F},第114张的矩阵
  • 对于边分类任务,张量一文详解图神经网络(sa),Z_t,第110张为大小为一文详解图神经网络(sa),M_t\times{H}\times{F},第116张的矩阵
    一文详解图神经网络(sa),第117张
5.3.2 论文模型
  1. 对于节点分类任务,假设一文详解图神经网络(sa),P_t^*,第118张一文详解图神经网络(sa),P_t,第101张的power series,大小为一文详解图神经网络(sa),N_t\times{H}\times{N_t},第120张,那么对于图一文详解图神经网络(sa),t,第121张的节点一文详解图神经网络(sa),i,第102张,第一文详解图神经网络(sa),j,第103张个hop,第一文详解图神经网络(sa),k,第38张维特征值一文详解图神经网络(sa),Z_{tijk},第125张计算公式为:
    一文详解图神经网络(sa),Z_{t i j k}=f\left(W_{j k}^{c} \cdot \sum_{l=1}^{N_{t}} P_{t i j l}^{*} X_{t l k}\right)\tag{61},第126张
    使用矩阵表示为:
    一文详解图神经网络(sa),Z_{t}=f\left(W^{c} \odot P_{t}^{*} X_{t}\right)\tag{62},第127张
    其中一文详解图神经网络(sa),\odot,第128张表示element-wise multiplication,由于模型只考虑一文详解图神经网络(sa),H,第83张跳的参数,即参数量为一文详解图神经网络(sa),O(H\times{F}),第130张使得diffusion-convolutional representation不受输入大小的限制

    在计算出一文详解图神经网络(sa),Z,第131张之后,过一层全连接得到输出一文详解图神经网络(sa),Y,第104张,使用一文详解图神经网络(sa),\hat{Y},第133张表示硬分类预测结果,使用一文详解图神经网络(sa),\mathbb{P}(Y|X),第107张表示预测概率,计算方式如下:
    一文详解图神经网络(sa),\hat{Y}=\arg \max \left(f\left(W^{d} \odot Z\right)\right)\tag{63}\ \mathbb{P}(Y | X)=\operatorname{softmax}\left(f\left(W^{d} \odot Z\right)\right),第135张

  2. 对于图分类任务,直接采用所有节点表示的均值作为graph的representation
    一文详解图神经网络(sa),Z_{t}=f\left(W^{c} \odot 1_{N_{t}}^{T} P_{t}^{*} X_{t} / N_{t}\right)\tag{64},第136张
    其中,一文详解图神经网络(sa),1_{N_t},第137张是全为1的一文详解图神经网络(sa),N_t\times{1},第138张的向量

  3. 对于边分类任务,通过将每一条边转化为一个节点来进行训练和预测,这个节点与原来的边对应的首尾节点相连,转化后的图的邻接矩阵一文详解图神经网络(sa),A_t,第139张可以直接从原来的邻接矩阵一文详解图神经网络(sa),A_t,第100张增加一个incidence matrix得到:
    一文详解图神经网络(sa),A_{t}^{\prime}= \begin{matrix} A_t & B_t^T\ B_t & 0\ \end{matrix} \tag{65},第141张
    之后,使用一文详解图神经网络(sa),A_t,第139张来计算一文详解图神经网络(sa),P_t,第143张,并用来替换一文详解图神经网络(sa),P_t,第101张来进行分类,对于模型训练,使用梯度下降法,并采用early-stop方式得到最终模型

5.3.3 代码实现
import lasagne
import lasagne.layers
import theano
import theano.tensor as T
import numpy as np
class DCNNLayer(lasagne.layers.MergeLayer):
    """A node-level DCNN layer.
    This class contains the (symbolic) Lasagne internals for a node-level DCNN layer.  This class should
    be used in conjunction with a user-facing model class.
    """
    def __init__(self, incomings, parameters, layer_num,
                 W=lasagne.init.Normal(0.01),
                 num_features=None,
                 **kwargs):
        super(DCNNLayer, self).__init__(incomings, **kwargs)
        self.parameters = parameters
        if num_features is None:
            self.num_features = self.parameters.num_features
        else:
            self.num_features = num_features
        self.W = T.addbroadcast(
            self.add_param(W,
                           (1, parameters.num_hops + 1, self.num_features), name='DCNN_W_%d' % layer_num), 0)
        self.nonlinearity = params.nonlinearity_map[self.parameters.dcnn_nonlinearity]
    def get_output_for(self, inputs, **kwargs):
        """Compute diffusion convolutional activation of inputs."""
        Apow = inputs[0]
        X = inputs[1]
        Apow_dot_X = T.dot(Apow, X)
        Apow_dot_X_times_W = Apow_dot_X * self.W
        out = self.nonlinearity(Apow_dot_X_times_W)
        return out
    def get_output_shape_for(self, input_shapes):
        """Return the layer output shape."""
        shape = (None, self.parameters.num_hops + 1, self.num_features)
        return shape

5.4 《Improved Semantic Representations From Tree-Structured Long Short-Term Memory Networks》

将序列型的LSTM模型扩展到树型的LSTM模型,简称Tree-LSTM,并根据孩子节点是否有序,论文提出了两个模型变体,Child-Sum Tree-LSTM模型和N-ary Tree-LSTM模型。和序列型的LSTM模型的主要不同点在于,序列型的LSTM从前一时刻获取隐藏状态一文详解图神经网络(sa),h_t,第145张,而树型的LSTM从其所有的孩子节点获取隐藏状态

5.4.1 论文模型

Tree-LSTM模型对于每一个孩子节点都会产生一个遗忘门¥f_{jk}¥,这个使得模型能够从所有的孩子节点选择性地获取信息和结合信息

  1. Child-Sum Tree-LSTMs
    该模型的更新方程如下:
    一文详解图神经网络(sa),\widetilde{h_j}=\sum_{k\in C(j)}h_k\ i_j=\sigma({W}^{(i)}x_j+{U}^{(i)}\widetilde{h_j}+b^{(i)})\ f_{ik}=\sigma({W}^{(f)}x_j+{U}^{(f)}{h_k}+b^{(f)})\ o_{j}=\sigma({W}^{(o)}x_j+{U}^{(o)}\widetilde{h_j}+b^{(o)})\ u_{j}=tanh({W}^{(u)}x_j+{U}^{(u)}\widetilde{h_j}+b^{(u)})\ c_j=i_j⊙u_j+\sum_{k\in C(j)}f_{ij}⊙c_k\ h_j=o_j⊙tanh(c_j)\tag{66},第146张
    其中,一文详解图神经网络(sa),C(j),第147张表示一文详解图神经网络(sa),j,第103张节点的邻居节点的个数,一文详解图神经网络(sa),h_k,第149张表示节点一文详解图神经网络(sa),k,第38张的隐藏状态,一文详解图神经网络(sa),i_j,第151张表示节点一文详解图神经网络(sa),j,第103张输入门一文详解图神经网络(sa),f_{jk},第153张表示节点一文详解图神经网络(sa),j,第103张的邻居节点一文详解图神经网络(sa),k,第38张遗忘门一文详解图神经网络(sa),o_j,第156张表示节点一文详解图神经网络(sa),j,第103张输出门

    这里的关键点在于第三个公式的一文详解图神经网络(sa),f_{jk},第153张,这个模型对节点一文详解图神经网络(sa),j,第103张的每个邻居节点一文详解图神经网络(sa),k,第38张都计算了对应的遗忘门向量,然后在第六行中计算一文详解图神经网络(sa),c_j,第161张时对邻居节点的信息进行遗忘组合

    由于该模型是对所有的孩子节点求和,所以这个模型对于节点顺序不敏感的,适合于孩子节点无序的情况

  2. N-ary Tree-LSTMs
    假如一个树的最大分支数为一文详解图神经网络(sa),N,第70张(即孩子节点最多为一文详解图神经网络(sa),N,第70张个),而且孩子节点是有序的,对于节点一文详解图神经网络(sa),j,第103张,对于该节点的第一文详解图神经网络(sa),k,第38张个孩子节点的隐藏状态和记忆单元分别用一文详解图神经网络(sa),h_{jk},第166张一文详解图神经网络(sa),c_{jk},第167张表示,模型的方程如下:
    一文详解图神经网络(sa),i_j=\sigma({W}^{(i)}x_j+\sum^N_{?=1}{U}_?^{(i)}{h_{j?}}+b^{(i)})\ f_{ik}=\sigma({W}^{(f)}x_j+\sum^N_{?=1}{U}_{k?}^{(f)}{h_{j?}}+b^{(f)})\ o_{j}=\sigma({W}^{(o)}x_j+\sum^N_{?=1}{U}_?^{(o)}{h_{j?}}+b^{(o)})\ u_{j}=tanh({W}^{(u)}x_j+\sum^N_{?=1}{U}_?^{(a)}{h_{j?}}+b^{(a)})\ c_j=i_j⊙u_j+\sum^N_{?=1}f_{j?}⊙c_{j?}\ h_j=o_j⊙tanh(c_j)\tag{67},第168张
    该模型为每个孩子节点都单独地设置了参数一文详解图神经网络(sa),U_{l},第169张

5.4.2 训练策略
  • 分类任务:

分类任务定义为在类别集一文详解图神经网络(sa),\mathcal{Y},第170张中预测出正确的标签一文详解图神经网络(sa),\hat{y},第171张,对于每一个节点一文详解图神经网络(sa),j,第103张,使用一个softmax分类器来预测节点标签一文详解图神经网络(sa),\hat{y}_j,第173张,分类器取每个节点的隐藏状态一文详解图神经网络(sa),h_j,第174张作为输入:
一文详解图神经网络(sa),\hat p_\theta(y|\{x\}_j)=softmax(W^{(s)}h_j+b^{(s)})\ \hat y_j=\underset{y}{\operatorname{argmax}} \hat p_\theta(y|\{x\}_j)\tag{68},第175张
损失函数使用negative log-likelihood
一文详解图神经网络(sa),J(\theta)=-\frac{1}{m} \sum_{k=1}^{m} \log \hat{p}_{\theta}\left(y^{(k)} |\{x\}^{(k)}\right)+\frac{\lambda}{2}\|\theta\|_{2}^{2}\tag{69},第176张

其中,一文详解图神经网络(sa),m,第177张是带有标签的节点数量,一文详解图神经网络(sa),\lambda,第178张一文详解图神经网络(sa),L2,第179张是正则化超参

  • 语义相关性任务:

该任务给定一个句子对(sentence pair),模型需要预测出一个范围在一文详解图神经网络(sa),[ 1 , K ],第180张之间的实数值,这个值越高,表示相似度越高。首先对每一个句子产生一个representation,两个句子的表示分别用一文详解图神经网络(sa),h_L,第181张一文详解图神经网络(sa),h_R,第182张

表示,得到这两个representation之后,从distance和angle两个方面考虑,使用神经网络来得到一文详解图神经网络(sa),(h_L,h_R),第183张相似度:
一文详解图神经网络(sa),h_× = h_L⊙h_R\ h_+ = ∣h_L?h_R∣\ h_s = σ(W^{(×)}h_×+W^{(+)}h_+ +b^{(h)})\ \hat p_θ=softmax?(W^{(p)}h_s+b^{(p)})\ \hat y=r^T\hat p_θ\tag{70},第184张
其中,一文详解图神经网络(sa),r^{T}=\left[1,2…K\right],第185张,模型期望根据训练得到的参数一文详解图神经网络(sa),\theta,第61张得到的结果:一文详解图神经网络(sa),\hat{y}=r^{T} \hat{p}_{\theta} \approx y,第187张。由此,定义一个目标分布一文详解图神经网络(sa),p,第188张
一文详解图神经网络(sa),y= \begin{cases} y??y?, \ \ \ \ \ \ \ \quad i=?y?+1\ ?y??y+1, \quad i=?y?\ 0 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \quad otherwise \end{cases} \tag{71},第189张
其中,一文详解图神经网络(sa),1\le{i}\le{K},第190张,损失函数为一文详解图神经网络(sa),p,第188张一文详解图神经网络(sa),\hat{p}_{\theta},第192张之间的KL散度:
一文详解图神经网络(sa),J(\theta)=\frac{1}{m} \sum_{k=1}^{m} \mathrm{KL}\left(p^{(k)} \| \hat{p}_{\theta}^{(k)}\right)+\frac{\lambda}{2}\|\theta\|_{2}^{2}\tag{72},第193张

5.4.3 代码实现
class TreeLSTM(torch.nn.Module):
    '''PyTorch TreeLSTM model that implements efficient batching.
    '''
    def __init__(self, in_features, out_features):
        '''TreeLSTM class initializer
        Takes in int sizes of in_features and out_features and sets up model Linear network layers.
        '''
        super().__init__()
        self.in_features = in_features
        self.out_features = out_features
        # bias terms are only on the W layers for efficiency
        self.W_iou = torch.nn.Linear(self.in_features, 3 * self.out_features)
        self.U_iou = torch.nn.Linear(self.out_features, 3 * self.out_features, bias=False)
        # f terms are maintained seperate from the iou terms because they involve sums over child nodes
        # while the iou terms do not
        self.W_f = torch.nn.Linear(self.in_features, self.out_features)
        self.U_f = torch.nn.Linear(self.out_features, self.out_features, bias=False)
    def forward(self, features, node_order, adjacency_list, edge_order):
        '''Run TreeLSTM model on a tree data structure with node features
        Takes Tensors encoding node features, a tree node adjacency_list, and the order in which 
        the tree processing should proceed in node_order and edge_order.
        '''
        # Total number of nodes in every tree in the batch
        batch_size = node_order.shape[0]
        # Retrive device the model is currently loaded on to generate h, c, and h_sum result buffers
        device = next(self.parameters()).device
        # h and c states for every node in the batch
        h = torch.zeros(batch_size, self.out_features, device=device)
        c = torch.zeros(batch_size, self.out_features, device=device)
        # populate the h and c states respecting computation order
        for n in range(node_order.max() + 1):
            self._run_lstm(n, h, c, features, node_order, adjacency_list, edge_order)
        return h, c
    def _run_lstm(self, iteration, h, c, features, node_order, adjacency_list, edge_order):
        '''Helper function to evaluate all tree nodes currently able to be evaluated.
        '''
        # N is the number of nodes in the tree
        # n is the number of nodes to be evaluated on in the current iteration
        # E is the number of edges in the tree
        # e is the number of edges to be evaluated on in the current iteration
        # F is the number of features in each node
        # M is the number of hidden neurons in the network
        # node_order is a tensor of size N x 1
        # edge_order is a tensor of size E x 1
        # features is a tensor of size N x F
        # adjacency_list is a tensor of size E x 2
        # node_mask is a tensor of size N x 1
        node_mask = node_order == iteration
        # edge_mask is a tensor of size E x 1
        edge_mask = edge_order == iteration
        # x is a tensor of size n x F
        x = features[node_mask, :]
        # At iteration 0 none of the nodes should have children
        # Otherwise, select the child nodes needed for current iteration
        # and sum over their hidden states
        if iteration == 0:
            iou = self.W_iou(x)
        else:
            # adjacency_list is a tensor of size e x 2
            adjacency_list = adjacency_list[edge_mask, :]
            # parent_indexes and child_indexes are tensors of size e x 1
            # parent_indexes and child_indexes contain the integer indexes needed to index into
            # the feature and hidden state arrays to retrieve the data for those parent/child nodes.
            parent_indexes = adjacency_list[:, 0]
            child_indexes = adjacency_list[:, 1]
            # child_h and child_c are tensors of size e x 1
            child_h = h[child_indexes, :]
            child_c = c[child_indexes, :]
            # Add child hidden states to parent offset locations
            _, child_counts = torch.unique_consecutive(parent_indexes, return_counts=True)
            child_counts = tuple(child_counts)
            parent_children = torch.split(child_h, child_counts)
            parent_list = [item.sum(0) for item in parent_children]
            h_sum = torch.stack(parent_list)
            iou = self.W_iou(x) + self.U_iou(h_sum)
        # i, o and u are tensors of size n x M
        i, o, u = torch.split(iou, iou.size(1) // 3, dim=1)
        i = torch.sigmoid(i)
        o = torch.sigmoid(o)
        u = torch.tanh(u)
        # At iteration 0 none of the nodes should have children
        # Otherwise, calculate the forget states for each parent node and child node
        # and sum over the child memory cell states
        if iteration == 0:
            c[node_mask, :] = i * u
        else:
            # f is a tensor of size e x M
            f = self.W_f(features[parent_indexes, :]) + self.U_f(child_h)
            f = torch.sigmoid(f)
            # fc is a tensor of size e x M
            fc = f * child_c
            # Add the calculated f values to the parent's memory cell state
            parent_children = torch.split(fc, child_counts)
            parent_list = [item.sum(0) for item in parent_children]
            c_sum = torch.stack(parent_list)
            c[node_mask, :] = i * u + c_sum
        h[node_mask, :] = o * torch.tanh(c[node_mask])

https://www.xamrdz.com/database/6y71997272.html

相关文章: