笔记参考和图片来源@hanbingtao:零基础入门深度学习(7) - 递归神经网络

递归神经网络

循环神经网络可以用来处理包含序列结构的信息。但是对于树、图等更复杂的结构,循环神经网络无法处理。

递归神经网络

神经网络的输入层单元数是固定的,因此必须用循环或递归的方式处理可变长度的输入。循环神经网络实现了前者,通过将长度不定的输入分割成为等长的小块,然后再依次输入到网络中,从而实现对变长输入的处理。递归神经网络可以把一个树/图结构信息编码为一个向量,也就是把信息映射到一个语义向量空间中。此语义向量空间满足某些性质,如语义相似的向量距离更近。也就是说,如果两句话意思相近,那么分别编码后的两个向量距离也相近。如下图所示:

图中可见,递归神经网络将所有的词、句都映射到一个二维向量空间中,这样通过向量的距离就得到了一种语义的表示。

上图还显示了⾃然语⾔可组合的性质:词可以组成句、句可以组成段落、段落可以组成篇章,⽽更⾼层的语义取决于底层的语义以及它们的组合⽅式。递归神经⽹络是⼀种表示学习,它可以将词、句、段、篇按照他们的语义映射到同⼀个向量空间中,也就是把可组合(树/图结构)的信息表示为⼀个个有意义的向量。⽐如上⾯这个例⼦,递归神经⽹络把句⼦"the country of my birth"表示为⼆维向量[1,5]。有了这个『编码器』之后,我们就可以以这些有意义的向量为基础去完成更⾼级的任务(⽐如情感分析等)。

如下图所示,递归神经⽹络在做情感分析时,可以⽐较好的处理否定句,这是胜过其他⼀些模型的:

在上图中,蓝⾊表示正⾯评价,红⾊表示负⾯评价。每个节点是⼀个向量,这个向量表达了以它为根的⼦树的情感评价。其中,模型能够正确处理doesn’t的含义,将正面评价转为负面评价。

尽管递归神经网络具有更为强大的表示能力,但是在实际应用中并不太流行。其中⼀个主要原因是,递归神经⽹络的输⼊是树/图结构,⽽这种结构需要花费很多⼈⼯去标注。循环神经⽹络处理句⼦可以直接把句⼦作为输⼊,而递归神经⽹络处理句⼦必须把每个句⼦标注为语法解析树的形式。很多时候,相对于递归神经⽹络能够带来的性能提升,这个投⼊是不太划算的。

递归神经网络的前向计算

这里以树型信息为例介绍。

递归神经网络的输入是两个子节点,输出就是这两个子节点编码后产生的父节点,父节点的维度和每个子节点是相同的。

其中,c1c_1c2c_2分别是表示两个子节点的向量,pp是表示父节点的向量。子节点和父节点组成一个全连接网络。用矩阵WW表示这些连接上的权重,它的维度将是d×2dd\times 2d。其中,dd表示每个节点的维度。父节点的计算公式可以写成

p=tanh(W[c1c2]+b)p=\tanh(W\begin{bmatrix}c_1\\c_2\end{bmatrix}+b)

上式中tanh\tanh是激活函数(也可以是其他激活函数),bb是偏置项,它也是一个维度为dd的向量。

随后将产生的父节点的向量再次作为网络的输入,产生它们的父节点,如此递归下去,直至整棵树处理完毕。最终将得到根结点的向量,可认为它是整棵树的表示,这样就把一棵树映射为一个向量。

上式就是递归神经网络的前向计算方法,和全连接神经网络的计算没有区别,只是在输入过程中需要根据输入的树结构依次输入每个子节点。

递归神经网络的权重WW和偏置项bb在所有的节点都是共享的

递归神经网络的训练算法

递归神经网络的训练算法和循环神经网络类似。不同之处在于前者将δ\delta从根结点反向传播到各个子节点,后者将δ\delta从当前时刻tkt_k反向传播到初始时刻t1t_1

下面介绍用于递归神经网络的训练算法BPTS算法。

误差项的传递

首先推导将误差从父节点传递到子节点的公式,如下图:

定义δp\delta_p为误差函数EE相对于父节点pp的加权输入netpnet_p的导数,即

δp=Enetp\delta_p=\frac{\partial E}{\partial \text{net}_p}

netpnet_p是父节点的加权输入,则

netp=W[c1c2]+b\text{net}_p=W\begin{bmatrix}c_1\\c_2\end{bmatrix}+b

其中,netp,c1,c2net_p,c_1,c_2都是向量,而WW是矩阵。

将其展开可得:

[netp1netp2netpn]=[ωp1c11ωp1c12ωp1c1nωp1c21ωp1c22ωp1c2nωp2c11ωp2c12ωp2c1nωp2c21ωp2c22ωp2c2nωpnc11ωpnc12ωpnc1nωpnc21ωpnc22ωpnc2n][c11c12c1nc21c22c2n]+[b1b2bn]\begin{bmatrix}\text{net}_{p_1} \\\text{net}_{p_2} \\\vdots \\\text{net}_{p_n}\end{bmatrix}=\begin{bmatrix}\omega_{p_1 c_{11}} & \omega_{p_1 c_{12}} & \cdots & \omega_{p_1 c_{1n}} & \omega_{p_1 c_{21}} & \omega_{p_1 c_{22}} & \cdots & \omega_{p_1 c_{2n}} \\\omega_{p_2 c_{11}} & \omega_{p_2 c_{12}} & \cdots & \omega_{p_2 c_{1n}} & \omega_{p_2 c_{21}} & \omega_{p_2 c_{22}} & \cdots & \omega_{p_2 c_{2n}} \\\vdots & \vdots & \ddots & \vdots & \vdots & \vdots & \ddots & \vdots \\\omega_{p_n c_{11}} & \omega_{p_n c_{12}} & \cdots & \omega_{p_n c_{1n}} & \omega_{p_n c_{21}} & \omega_{p_n c_{22}} & \cdots & \omega_{p_n c_{2n}}\end{bmatrix}\begin{bmatrix}c_{11} \\c_{12} \\\vdots \\c_{1n} \\c_{21} \\c_{22} \\\vdots \\c_{2n}\end{bmatrix}+\begin{bmatrix}b_1 \\b_2 \\\vdots \\b_n\end{bmatrix}

其中,pip_i表示父节点pp的第ii个分量,cjkc_{jk}表示cjc_j子节点的第kk个分量,ωpicjk\omega_{p_ic_{jk}}表示子节点cjc_j的第kk个分量到父节点pp的第ii个分量的权重。因此,对于子节点cjkc_{jk}来说,它会影响到父节点所有的分量。求误差函数EEcjkc_{jk}的导数时,需要用到全导数公式:

Ecjk =iEnetpinetpicjk=iδpiωpicjk\begin{aligned} \frac{\partial E}{\partial c_{jk}}  &= \sum_i \frac{\partial E}{\partial \text{net}_{p_i}} \cdot \frac{\partial \text{net}_{p_i}}{\partial c_{jk}} \\ &= \sum_i \delta_{p_i} \, \omega_{p_i c_{jk}} \end{aligned}

这样就可以将其表示为矩阵形式,从而得到一个向量化表达:

Ecjk=Ujδp\frac{\partial E}{\partial c_{jk}}=U_j\delta _p

其中,矩阵UjU_j是从矩阵WW中提取部分元素组成的矩阵,其单元为:

ujik=ωpkcjiu_{j_{ik}}=\omega_{p_kc_{ji}}

以下是对上式的解释:

首先将WW矩阵拆分为两个矩阵W1W_1W2W_2,如下图所示:

显然子矩阵W1W_1W2W_2分别对应子节点c1c_1c2c_2的到父节点pp的权重。则矩阵UjU_j为:

Uj=WjTU_j=W_j^T

也就是说,将误差项反向传递到相应子节点cjc_j的矩阵UjU_j就是其对应权重矩阵WjW_j的转置。

netcjnet_{c_j}是子节点cjc_j的加权输入,ff是子节点cc的激活函数,则

cj=f(netcj)c_j=f(net_{c_j})

因此,

δcj=Enetcj=Ecjcjnetcj=WjTδpf(netcj)\begin{aligned}\delta_{c_j}&=\frac{\partial E}{\partial net_{c_j}}\\&=\frac{\partial E}{\partial c_j}\frac{\partial c_j}{\partial net_{c_j}}\\&=W_j^T\delta _p\circ f'(net_{c_j})\end{aligned}

上式就是将误差项从父节点传递到其子节点的公式。

反复应用上式,即可得到逐层传递的公式。

上图是在树型结构中反向传播误差项的全景图,在已知δp(3)\delta_p^{(3)}的情况下,δp(1)\delta_p^{(1)}为:

δ(2)=WTδp(3)f(net(2))δp(2)=[δ(2)]pδ(1)=WTδp(2)f(net(1))δp(1)=[δ(1)]p\begin{aligned}\delta^{(2)} &= W^T \delta_p^{(3)} \circ f'(\text{net}^{(2)})\\\delta_p^{(2)} &= [ \delta^{(2)} ]_p\\\delta^{(1)} &= W^T \delta_p^{(2)} \circ f'(\text{net}^{(1)})\\\delta_p^{(1)} &= [ \delta^{(1)} ]_p\end{aligned}

在上面的公式中,

δ(2)=[δc(2)δp(2)]\delta^{(2)} =\begin{bmatrix}\delta_c^{(2)} \\\delta_p^{(2)}\end{bmatrix}

[δ(2)]p[\delta^{(2)}]_p表示从向量δ(2)\delta^{(2)}中取出属于节点pp的部分。

权重梯度的计算

根据加权输入的计算公式

netp(l)=Wc(l)+bnet_p^{(l)}=Wc^{(l)}+b

其中netp(l)net_p^{(l)}表示第ll层父节点的加权输入,c(l)c^{(l)}表示第ll层的子节点,WW是权重矩阵,bb是偏置项。展开可得:

netpjl=iωjicil+bjnet_{p_j}^l=\sum_i\omega_{ji}c_i^l+b_j

可以求得误差函数在第ll层对权重的梯度为:

Eωji(l)=Enetpj(l)netpj(l)ωji(l)=δpj(l)ci(l)\frac{\partial E}{\partial \omega_{ji}^{(l)}} = \frac{\partial E}{\partial \text{net}_{p_j}^{(l)}} \cdot \frac{\partial \text{net}_{p_j}^{(l)}}{\partial \omega_{ji}^{(l)}} = \delta_{p_j}^{(l)} c_i^{(l)}

上式用来计算一个ω\omega,将其写成矩阵形式:

Eω(l)=[Eω11(l)Eω12(l)Eω1m(l)Eω21(l)Eω22(l)Eω2m(l)Eωn1(l)Eωn2(l)Eωnm(l)]=[δp1(l)c1(l)δp1(l)c2(l)δp1(l)cm(l)δp2(l)c1(l)δp2(l)c2(l)δp2(l)cm(l)δpn(l)c1(l)δpn(l)c2(l)δpn(l)cm(l)]=δ(l)(c(l))T\begin{aligned}\frac{\partial E}{\partial \boldsymbol{\omega}^{(l)}} &= \begin{bmatrix}\frac{\partial E}{\partial \omega_{11}^{(l)}} & \frac{\partial E}{\partial \omega_{12}^{(l)}} & \cdots & \frac{\partial E}{\partial \omega_{1m}^{(l)}} \\\frac{\partial E}{\partial \omega_{21}^{(l)}} & \frac{\partial E}{\partial \omega_{22}^{(l)}} & \cdots & \frac{\partial E}{\partial \omega_{2m}^{(l)}} \\\vdots & \vdots & \ddots & \vdots \\\frac{\partial E}{\partial \omega_{n1}^{(l)}} & \frac{\partial E}{\partial \omega_{n2}^{(l)}} & \cdots & \frac{\partial E}{\partial \omega_{nm}^{(l)}}\end{bmatrix}\\&=\begin{bmatrix}\delta_{p_1}^{(l)} c_1^{(l)} & \delta_{p_1}^{(l)} c_2^{(l)} & \cdots & \delta_{p_1}^{(l)} c_m^{(l)} \\\delta_{p_2}^{(l)} c_1^{(l)} & \delta_{p_2}^{(l)} c_2^{(l)} & \cdots & \delta_{p_2}^{(l)} c_m^{(l)} \\\vdots & \vdots & \ddots & \vdots \\\delta_{p_n}^{(l)} c_1^{(l)} & \delta_{p_n}^{(l)} c_2^{(l)} & \cdots & \delta_{p_n}^{(l)} c_m^{(l)}\end{bmatrix}\\&= \delta^{(l)} \left( \mathbf{c}^{(l)} \right)^T\end{aligned}

上式就是第ll层权重项的梯度计算公式。由于权重WW在所用层共享,因此,递归神经网络的最终权重梯度是各个层权重梯度之和,即:

EW=iEW(l)\frac{\partial E}{\partial W}=\sum_i\frac{\partial E}{\partial W^{(l)}}

下面求偏置项bb的梯度计算公式。先计算误差函数对第ll层偏置项b(l)b^{(l)}的梯度:

Ebj(l)=Enetpj(l)netpj(l)bj(l)=δpj(l)\frac{\partial E}{\partial b_j^{(l)}} = \frac{\partial E}{\partial \text{net}_{p_j}^{(l)}} \cdot \frac{\partial \text{net}_{p_j}^{(l)}}{\partial b_j^{(l)}} = \delta_{p_j}^{(l)}

将其扩展为矩阵的形式:

Eb(l)=[Eb1(l)Eb2(l)Ebn(l)]=[δp1(l)δp2(l)δpn(l)]=δp(l)\frac{\partial E}{\partial \mathbf{b}^{(l)}} =\begin{bmatrix}\frac{\partial E}{\partial b_1^{(l)}} \\\frac{\partial E}{\partial b_2^{(l)}} \\\vdots \\\frac{\partial E}{\partial b_n^{(l)}}\end{bmatrix}=\begin{bmatrix}\delta_{p_1}^{(l)} \\\delta_{p_2}^{(l)} \\\vdots \\\delta_{p_n}^{(l)}\end{bmatrix}= \delta_p^{(l)}

最终的偏置项梯度是各个层偏置项梯度之和,即:

Eb=lEb(l)\frac{\partial E}{\partial \mathbf{b}} = \sum_l \frac{\partial E}{\partial \mathbf{b}^{(l)}}

权重更新

如果使用梯度下降优化算法,则权重更新公式为:

WW+ηEWW\leftarrow W+\eta\frac{\partial E}{\partial W}

同理,偏置项的更新公式为:

bb+ηEbb\leftarrow b+\eta\frac{\partial E}{\partial b}

以上。