1 RNN&LSTM
Recurrent Neural Network,是通过历史数据预测下一个可能出现的值的算法,比如预测天气,股票和语言。
图. RNN基础结构
如上图所示,整个模型只有w1,w2,w3,b1参数。每一次前一天的输入都会影响之后一天的预测。例如上图就是知道前天,昨天,今天的数据去预测之后一天的预测值。但是简单的RNN有很多理论上的问题。例如上述是前一个值主要影响的就是当前值,然而很多序列的规律不止如此。很多的数据即使相差多个间隔,但是仍有强联系。因此提出LSTM (Long Short-Term Memory)。
图. LSTM示意图
和上述的简单RNN区别,每一个输入还会影响到最后的预测结果。蓝色的是短距离记忆(影响),绿色的是长距离记忆(影响)。实际的LSTM的单元必简单的RNN复杂很多。
图. LSTM单元
我们看到一个单元里面有五个激活函数。我们用f0-f4代表从左到右的函数单元。f0最终是一个sigmoid函数,输出在0或1,所以它决定的就是这个长距离记忆在这里乘上的影响因子。也就是会影响长距离影响的后续传递,如果sigmoid得到0,那么就相当于阻断之前的记忆向后传递。如果sigmoid是1,那么就保留记忆(学术专业名称是forget fate)。
f1-f2是一体的,其中可以看到f2是用短距离记忆和当前的输入得到一个值(-1 ~1,tanh),传递给长距离记忆。这就是在制造长距离记忆。而f1和f0类似都是一个影响值因子的输出(0~1)。最终得到一个影响因子*新建长距离记忆的最终长距离记忆,并将这个记忆增加到原本的长距离记忆中。这个f1-f2的组合学术名称是input gate。
f3-f4也是一体的。最新的长距离记忆输入到f4,得到一个输出给下一个单元的短距离记忆,但是这个时候,仍然乘一个影响因子f3,得到最终的短距离记忆。
如下是对现有四个输入序列数据的预测,得到最后第五个值的流程图。
图. LSTM单元预测展开
例如在语言预测的时候,可以堆积LSTM来可参数,可以多层多头。最后的输出再通过一次网络换算成概率,映射到具体的单词。
图. 多层多头LSTM语言预测
2 Token处理
2.1 WORD ENBEDING
使用word enbeding是让单词变成数字的工具。相同的单词会转化成相同的数字,一种映射关系。如果简单的给单词一个固定的数字,这是可以的。但是我们希望映射的关系还能考虑到词和词之间的关联性,例如great和awesome是相近的,在两句话中是同一个意思,所以希望取值相近。
图. word enbeding模型
为了得到这一组数字,我们需要训练一个简单的模型。这个模型如上图,右上侧是训练用的数据集合,每个单词都有两个权重连接。训练的数据就是每个单词之后应该接什么,例如当Troll2 0,is 1,great 0. Gymkata 0的时候(表述输入是is) 输出应该是great。这样就可以训练模型,最后得到每个单词的两个权重值。当然还有很多其它的方式用来训练小模型,训练两个权重参数。注意这里只是获取一个文字到数字输出的模型。
2.2 Posotional Encoding
图. Positional Encoding
对于word enbeding之后的数据我们还需要来记录token的顺序,这是因为Tom eat dog,dog eat Tom两句话的含义是完全相反的,如果不增加单词之间的顺序区分的话,那么就会出现相似的enbeding value,区别只是前后出现顺序有差别。而我们希望的是,顺序会严重影响每个单词的enbeding, 即dog eat tom,tom eat dog中dog,tom的token完全不一样。为了处理这种情况,我们使用多个sin函数,每个enbeding 的值增加一个sin(x)的值,x就这个单词的位置。例如上面是选用了4 enbeding,那么4条不同的sin函数。在真正的使用的时候,很多的endeing加上非常多的单词位置,所以出现相同的顺序处理的可能性就会降低很多。上述就是第一个token用first,第一个token的第四个值用first的第四条曲线值。增加这个顺序的标准术语是positional encoding. 这里就是对word enbeding的添加顺序的一层模型。