Neural Network with Memory
记忆力的重要性:如进位这个问题,你可以设计如下模型来实现这个记忆力:
![]()
如上图所示,左边的神经元是将两个数字相加后,如果大于10则输出1,反之输出0,输出后存在Memory cell里一份,然后将值乘以-10做为红色神经元的输入;右边的神经元则是将输入相加,相加后做为红色神经元的输入,红色神经元则是将左右两个输入相加。如,现在传入的是x1 = 4,x2 = 7,那么左边的绿色神经元会输出1,并存一份到Memory cell中,再将这个1*-10作为红色神经元的输入;右边的绿色神经元会输出一个11;接下来将这两个神经元作为红色神经元的输入,11-10 = 1,所以输出值为1。
目录:
- RNN
- RNN的变形
- LSTM(长短时间记忆)
RNN
- RNN的简单过程:
换一种表现形式:
这里的网络结构都是相同的,包括参数Wi,Wh,Wo都是相同的。
输出的yi是由x1,x2,…xi决定的。 - RNN的Cost:
对于RNN来说,越接近input层的神经元会影响的更小。 - RNN的Training:
Training要做的就是调参,这里的参数只有三组Wh,Wo,Wi。由于RNN和时间序列有关,因此我们使用BPTT算法。
- RNN的应用场景:
- 语音识别等(如果采用DNN,那么每一帧将会被独立考虑)。
- input和output都是vector sequence with the same length,如:POS Tagging(词性标注)
- Name entity recognition(命名实体识别),即定义什么词是人名,地名,组织等等。如:Harry Potter[people] is a student of Hogwarts[organizations] and lived on Privet Drive[places]
- Information extraction(消息提取),如对话系统。
RNN的变形
- Elman Network(最常见的type)与Jordan Network:
因为Jordan Network是将输出传递给下一个神经元,这时候的输出是有标准答案的,因此Jordan Network可能比Elman Network更加实用,但当Jordan Network输出维度很大的时候就得不偿失了。
- Deep RNN:
- Bidirectional RNN:
这种RNN将input中的左右都看了。
以上都是input和output都是the same length。 - 多对一的RNN:
- 如:Sentiment Analysis(情感分析)
- 如:Sentiment Analysis(情感分析)
- 多对多(输出比较短):
- 如:Speech Recognition(语音识别)
这时候可以用Connectionist Temporal Classification(CTC):
- 如:Speech Recognition(语音识别)
- 多对多(没有限制,即不知道谁长谁短):
- 如:Machine Translation(机器翻译)
在看完一句句子之后,由于我们知道input,而不知道output的长度,所以我们要如何做停止呢?我们可以增加一个断句符”===”
- 如:Machine Translation(机器翻译)
- 一对多(Input is one vector,output is a vector sequence):
- Caption generation(字幕生成):
- Caption generation(字幕生成):
长短期记忆(LSTM)
- 这是一个有4个input,1个output的特殊神经元,有三个门为:Output Gate,Forget Gate和Input Gate。
神经元的计算如下:
假设有两个输入,这里不同颜色的线代表不同的参数,这里比之前多了4倍的参数。
- 实例:
在下面问题中:
- x2 = 1:表示将x1与memory中的数值求和并且存入memory中。
- x2 = -1:表示重置memory
- x3 = 1:表示输出memory中的值
具体流程如下:
Application on language modeling
Language model(LM):
Language Model在语音辨识的时候有很大作用,它就是对word sequence出现的几率进行估算。假如今天需要判断一段语音是recognize speech还是wreck a nice beach,那么单单从发音上进行辨识是不行的,还需要从概率上进行辨识,如果P(recognize speech)>P(wreck a nice beach)那么output就是”recognize speech”。
传统方法,怎么估测几率呢?
1. 收集一系列的text data作为training data。
2. 然而如果这时候word sequence w1,w2,…,wn没出现在training data中。那么我们应该这么计算P(w1,w2,w3,…,wn) = P(w1|START)P(w2|w1)…P(wn|wn-1)。具体说P(“wreck a nice beach”) = P(wreck|START)P(a|wreck)P(nice|a)P(beach|nice)
3. 那么上述几率要怎么估测呢?比如P(beach|nice) = C(nice beach)/C(nice)。
4. 现在做LM中有可能出现的问题:
- Training Data中:
- The dog ran…
- The cat jumped…
那么这时候就可能出现以下问题,如果Training data中没有狗跑猫跳那么就会出现:
P(jumped|dog) = 0 / P(ran|cat) = 0
这是因为training data是有限的,所以几率的估测是很不准的,一个比较简单的方法,就是看到几率为0的时候,我们给这个0修改成一个很小的值,这样我们就可以算每一个word sequence的几率,这样可以比直接设0更好,这就叫做language model smoothing:
5. NN based LM:
我们有NN如何做LM呢?
P(“wreck a nice beach”) = P(wreck|START)P(a|wreck)P(nice|a)P(beach|nice)我们本来是直接用count,来计算P。但我们现在有一个NN是可以估测next word的。比如说,我们输入一个”wreck”,通过NN,我们得到一个m维的vector,那么针对”a”的dimension输出的值就是P(a|wreck)。
为什么用NN而不用count,可以处理smoothing的问题呢?
因为我们收入1-of-N encoding后,类似的word的hidden layer的output是类似的。这样当P(jump|dog) 变大,P(jump|cat)也会变大,即使training data中从来没有出现”…cat jump…”,因为dog和cat是类似的词,而dog后面有接跳,cat后面接跳的可能性就会变大。
6. RNN-based LM:
- input是1-of-N encoding,output是下一个word出现的几率。
如果我们更详细的来说就是这样的: