Recurrent Neural Network
RNN应用:Slot Filling
在一段文本中提取属于Slot的关键词,将这些关键词放入函数中,不同的关键词会产生不同的输出,使机器能够发展出类似文本理解的功能。
如何将词语抽象成向量vector以供函数使用?
1-of-N Encoding
lexicion={apple,bag,cat,dog,elephant}
apple =[1 0 0 0 0]
dog =[0 1 0 0 0]
cat =[0 0 1 0 0]
dog =[0 0 0 1 0]
elephant=[0 0 0 0 1]
如果出现意料之外的词语,需要新增一个dimension,”others”.或是根据哈希值来编码出现的单词
我们了解了哪些词汇可能会是符合我们slot特征的词汇,但是我们还需要知道一些信息
已知Taipei可能为地点,但是不知道是出发地还是目的地,我们希望这个网络可以记忆出现在它之前的一些词语以便更精确的设置它的属性。
在隐藏的中间网络层,其中会有将运行过程中的参数放入内存的行为(记忆),前置的词汇会对于后来的词汇的处理产生一定的影响,所以即使Slot关键词相同,也可以产生不同的输出结果.
以下例子输入的向量是[ 1,1] [ 1,1] [ 2,2],可以看到尽管输入的都是[ 1,1],但是输出却不同
对于一条语句,我们将词汇依次输入,RNN神经网络会重复这一循环
其实hidden layer可以有很多层,传递参数也不一定是同一层的hidden layer中的参数相互传值,也可以将每一层较易显现特征的y作为下一循环hidden layer层的输入。
而且RNN也可以逆向读取,因为有些定义关键词的词语是后置于关键词的,Bidirectional RNN
这样子可以将整个句子统一起来,根据上下文更精确的掌握关于关键词的信息。
如果按照上文的操作,每一步内存中的值都会刷新,事实上没有必要一直刷新,我们希望内存中的值可以存放的更久一些,所以需要一些控件来操纵内存的读写。
RNN对于内存数据有一套特殊的管理机制——Long Short-term Memory(LSTM),较长的短期内存
LSTM控制输入是否写入内存,内存是否可被输出,内存是否需要清空。
其实每一个Gate都是一个类似sigmoid函数在控制开闭,结合向量z的各个维度的值来控制内存中数据的读写
看看例子吧
实际上用于计算的值会是每一个(维度的值*weight+bias),其中每一个门对于每一个维度的weight和bias都是training_data通过梯度下降计算出来的,我们写出这些weight和bias来具体解释运行逻辑
其实呢,将LSTM看作一个函数的话,RNN就和一般的神经网络结构一样啦,都是输入->函数->输出,只是内部函数的结构有别,它所需要的参数量会是一般神经网络的四倍(一个输入,三个依赖输入的门)。
将最初的向量x乘以某个向量成为z向量,z向量的每一维都分配到一个LSTM里面去控制对应cell中的内容,z向量的维数就是LSTM的层数。
真正的LSTM
事实上软件可以直接调用LSTM,其中具体的底层步骤不用人工实现(挺好)