アカリの部屋

循环神经网络

RNN的基本结构

对于CNN这样的结构来说,相隔较远的两个点可能是彼此独立的,但是在语言处理里,距离比较远的两个词可能是相关的,为了解决这个问题,RNN引入了“记忆”的概念。

下面是RNN的基本结构,对于输入法联想的需求,假设有“我 是 中国 人”这样一个单词序列,词是有一定顺序的,从语言模型角度来说,在“我”后面跟着“是”是有一定概率的,所以这个任务就是用RNN学习一个语言模型,来生成一个通常的句子。

logo

图中的W、U、V是三个权重矩阵,RNN也只有这三个全局参数,下面三个x是按顺序输入到RNN中的单词序列,分别是“我、是、中国”,上面三个o则是三个输出“是、中国、人”。每个小球上的s就是“记忆”,本质上是个向量,它试图捕获当前位置学到的所有信息。

在DNN中,每个神经元是通过f(wx+b)的方式存储信息的,f是激活函数,而在RNN中,因为即需要记住新东西,也需要记忆老东西,所以需要两个权重U和W,这两个权重是需要去学习的,记忆则是 $ S{_t} = f(UX{_t}+WS{_{t-1}}) $ ,其中f可以是tanh等,因为两个s等维度不一定是一样的,所以需要W和U去做维度上的变更。O是某个时刻是输出,在预测下个词的例子中,由于某时刻输出可能有很多个词,所以用 $ O{_t} = softmax(VS{_t}) $ 输出这个时刻在无数个词上的概率,比如在看到“是”的时候,希望“中国”的概率最高。(之所以这里的f曲tanh,是因为这种函数能把输出值压缩在一个范围内,防止值突然变大。)

在这里 $ S{_t} $ 的容量是有限的,扩充它不能解决根本问题,所以如果文本相当长,加上有tanh、sigmoid这类激活函数,就很容易把距离离结尾很远的输入给稀释,而且模型会很难训练,所以有LSTM。另外,并不需要每一个 $ O{_t} $ 都有输出,比如情感分析,虽然可以拿到截止到某个时间点的情感,但是更关心的是最终的情感。

更多RNN结构

RNN还有很多其他变种结构,如适用于需要看完序列整体才能对某个位置做判断的完形填空,使用双向RNN:

logo

有时候某些东西不能只学一遍,希望在某个时间点上多学几轮有些深度,使用深层双向RNN:

logo

BPTT算法

BPTT是RNN中求损失的算法。为了训练这个网络需要用到反向传播,沿着BP算法的思路,RNN在每个时间点上的输出实际都是个多分类器,也就是说每个时间点上都会有一个交叉熵损失,那么最终的损失就是把这些损失求和,然后再对W参数求偏导。问题在于在数学上,对于每个独立的时间点,求损失E对W偏导的时候,需要有一步s对W求偏导,而每一个s都是由上一个Ws通过tanh算来的,而前一个Ws又和更前面有关系,这时候就需要根据求导的链式法则,把公式老老实实地展开到根上。这就是BPTT的麻烦之处。

image to text

看图说话的一种实现方式是拿着AlexNet(一种训练好的7层CNN)的最后输出,也就是图像特征向量v(4096*1的向量)喂给RNN的 $ S{_0} $ ,只喂一次,每张图片都会有一个答案,比如“人戴草帽”,那么RNN这边最小化图像特征v到这句话的损失就行了。

logo

LSTM

随着时间不断增大,RNN会丧失掉对连接很远的地方的学习能力,其实质原因并不是因为容量有限,而是在BPTT算法中对 $ S{_t} = f(UX{_t}+WS{_{t-1}}) $ 求偏导时,因为内部也有一个S,所以复合函数求导会产生连乘的结构,这就会导致梯度消失的风险。LSTM通过(及其变种、包括GRU)改造记忆细胞解决了这个问题,能让该记住的信息一直记住,不该记的会被截断。

logo

在传统RNN中把之前的记忆和本次的输入叠加通过tanh,相当于只有一个计算层,而LSTM靠多个层保证了长时记忆性。它首先让数据进入忘记门,通过一个sigmoid决定有多少老记忆可以通过,然后生成补充记忆、对记忆做更新,然后再进行选择性输出。

这里有一个总结得很好的帖子:https://www.jianshu.com/p/9dc9f41f0b29

SoftAttention机制

在看图说话的任务当中,我们希望能让NN能把注意力有的放矢地投射到图像中的某个位置,在CNN当中,某一层的某个数值是由前一层的某个区域计算得到的,这就引入了注意力模型。

logo

首先把CNN最后输出的 $ L * D $ 矩阵(L是比如 $ 14 * 14 $ 的特征图,厚度D是CNN神经元个数比如512个)给RNN当作输入。RNN的每个记忆细胞除了输出一个 $ n * 1 $ (n为词表长度)的预测概率向量 $ d $ 之外,还会输出一个 $ 1 * 14 * 14 $ 的权重向量 $ a $ 。向量 $ a $ 的每个值,表示对 $ 14 * 14 $ 的特征图中国年投射在每个特征上的注意力。这个权重向量和原始输入进来的 $ 512 * 14 * 14 $ 矩阵点乘,会得到一个 $ 1 * 14 * 14 $ 的结果,然后在这196个值上做e的指数次方归一化,得到一个 $ 1 * 14 * 14 $ 的概率分布矩阵,这些值的和为1。这个操作的含义是,因为CNN产出的矩阵每个神经元上的每个点都对应一块视野区域,那么这个概率矩阵和原本的CNN结果点乘之后,就相当于对原本输入进来的每个位置都做了缩放,即在某个时间点产出一句话的同时,还可以产出一个描述在这个时间点上该在哪投射多大的注意力的矩阵,来影响下一步学习,下一个时间点的输入,出了上一步的输出 $ y $ 之外,还会带上新的加权特征图 $ z $ 。

这个方式之所以叫SoftAttention,是因为并没有强制不看某个区域,而是更关注某个概率更大的区域,HardAttention则是强制制定某个区域为1,其它位置为0。