神经⽹络之循环神经⽹络及细节分析
以下内容是个⼈参考⽹上的学习资料以及⾃⼰的理解进⾏总结的
1、循环神经⽹络的介绍具体看
深度神经⽹络⽆法利⽤数据中时间序列信息,循环神经⽹络应势⽽⽣。循环神经⽹络的主要⽤途是处理和预测序列数据,它最擅长解决的问题是与时间序列相关的。它与CNN⼀样参数是共享的。
循环神经⽹络⼯作的关键点就是利⽤历史的信息来帮助当前的决策,因此⽽带来了更⼤的技术挑战--长期依赖(此外RNN的序列过长时会出现梯度消失现象)LSTM(长短时记忆)的出现正是为了解决这⼀问题。LSTM是对RNN细胞进⾏了改造,加⼊了“遗忘门”它的作⽤是让循环神经⽹络“忘记”没有⽤的信息,它会根据当前的输⼊Xt和上⼀时刻的输出Ht-1以及上⼀时刻的细胞状态共同决定应该从上⼀时刻的细胞状态记忆中遗忘什么。在循环神经⽹络‘忘记’了部分之前的状态后,它还需要从当前的输⼊补充最新的记忆,这个过程是由输⼊门完成的。“输⼊门”会根据当前的输⼊Xt和上⼀时刻的输出Ht-1以及当前产⽣的新的细胞状态决定哪些部分进⼊当前时刻的状态Ct。“输出门”它会根据更新后的状态Ct,上⼀时刻的输出Ht-1和当前的输⼊Xt来决定该时刻的输出Ht。
注意:LSTM相⽐于RNN具备长期的记忆功能是因为除了隐状态Ht,增加了⼀个新的细胞状态,通过对
赋予LSTM长期记忆功能的细胞状态不断进⾏更新,⼀⽅⾯及时的遗忘⽆⽤的信息,另⼀⽅⾯及时的补充新的信息。
当前时刻的隐藏状态输出由当前输⼊数据,之前的隐藏状态和更新后的细胞状态⼀起共同决定。
RNN以及其变种的⼀系列⽹络最⼤的问题是,由于其循环的结构导致其⽆法并⾏计算,所以训练RNN需要花费⼤量的时间。同时LSTM的记忆能⼒也是有限的,有论⽂证明当序列长度⼤于200时仍然会出现遗忘现象。
2、LSTM以及其变种(GRU等)图解析
其中牵扯到的计算如下:大气运动
(忘记门部分)
欲知山中事
(输⼊门部分)
(当前时刻新细胞状态的产⽣)
(细胞状态的更新,忘记门结合上⼀时刻的细胞状态决定需要遗忘的信息,输⼊门结合当前时刻产⽣的新的细胞状态决定应该添加什么信息,最终共同对包含长期记忆的细胞状态进⾏更新)
(输出门部分)
国画欣赏
(输出门结合包含长期记忆的细胞状态共同决定当前时刻的输出)
注意以上的*是元素级相乘,不是矩阵相乘。
根据以上的公式能够发现,细胞的状态⽆法对门控结构造成影响,可以加⼊窥视孔连接,使得细胞状态得以对门控结构造成影响。细胞单元结构图的改变:
相应计算公式的改变:
另⼀个变型GRU,它把LSTM中的遗忘门和输⼊门合并为了⼀个单⼀的更新门,同时还混合了细胞状态及隐藏状态以及其它⼀些改动。GRU 的门控结构减少到了两个,分别为更新门和重置门,更新门⽤于控制前⼀时刻的状态信息被带⼊到当前状态中的程度,更新门的值越⼤说明前⼀时刻的状态信息带⼊越多。重置门⽤于控制忽略前⼀时刻的状态信息的程度,重置门的值越⼩说明忽略得越多。
细胞结构图以及计算公式如下:
3.LSTM为什么选⽤sigmoid和tanh两个激活函数是否可以改变
从LSTM的前向传播计算公式中能够得出,三个sigmoid激活函数⽤于门处,通过sigmoid转换为0-1之间的值能够得到对遗忘输⼊输出的更直观的表⽰(因为后来⼜和细胞状态相乘是否起到⼀个概率的作⽤),为什么不⽤其他sig函数因为sigmoid函数更容易达到饱和,其他的难以饱和,LSTM应该需要饱和的门来记住或忘记信息,不饱和的门会使得过去和现在的记忆⼀直在叠加,造成记忆错乱。sigmoid激活函数最好不要改变。
两个tanh⽤于细胞状态处,有论⽂指出这个可以替换。
描写天气热的句子
4、对于cell和num_units(hidden_size隐藏层神经元的个数)的说明(最开始学习时在这⾥⽐较迷惑)
就拿最基础的RNN来说吧,cell其实就是⼀个RNN的⽹络,
cell表⽰多个时刻(序列)组成的RNN⽹络,从⼀个序列时刻到另⼀个序列时刻,cell的内部状态(神经元)就会更新。也就是说,从空间上讲,cell是同⼀个,但是时间上,cell_1表⽰输⼊x(1),隐状态h_1,cell_2表⽰输⼊x(2),隐状态h_2。
num_units(hidden_size)是RNN及其变种隐藏层节点的个数,也是神经⽹络⽤于特征提取的核⼼部分,其它的⼀些⽹络变换是为了使得隐藏层能够更好的提取特征。
num_units越⼤则每个LSTM的Cell能记忆的东西就越多。
我不是药神评价
5、LSTM的隐藏层到底在哪,以及其内部参数个数的计算
以下内容参考:
LSTM 的 cell ⾥⾯的 num_units 该怎么理解,其实也是很简单,看看下图:
可以看到cell在t时刻⾥⾯有四个黄⾊⼩框,你如果理解了那个代表的含义⼀切就明⽩了,每⼀个⼩黄框代表⼀个前馈⽹络层,对,就是经典的神经⽹络的结构,num_units就是这个层的隐藏神经元个数,就这么简单。其中1、2、4的激活函数是 sigmoid,第三个的激活函数是tanh。
1)cell 的权重是共享的,这是什么意思呢?这是指这张图⽚上有三个绿⾊的⼤框,代表三个 cell 对吧,但是实际上,它只是代表了⼀个 cell 在不同时序时候的状态,所有的数据只会通过⼀个 cell,然后不断更新它的权重。
2)那么⼀层的 LSTM 的参数有多少个?我们知道参数的数量是由 cell 的数量决定的,这⾥只有⼀个 cell,所以参数的数量就是这个 cell ⾥⾯⽤到的参数个数。假设 num_units 是128,输⼊是28位的,那么结合2中提及的计算公式,可以得到,四个⼩黄框的参数⼀共有
128*(128+28)*4,可以看看 TensorFlow 的最简单的 LSTM 的案例,中间层的参数就是这样,不过还要加上输出的时候的激活函数的参数,假设是10个类的话,就是128*10的 W 参数和10个bias 参数
3)cell 最上⾯的⼀条线的状态即 s(t) 代表了长时记忆,⽽下⾯的 h(t)则代表了⼯作记忆或短时记忆。
6、LSTM相⽐于RNN能够缓解梯度消失的原因
正向RNN中对于每⼀时刻的隐状态由当前时刻的输⼊和上⼀时刻的隐状态共同决定:
在对式中的权值W进⾏更新时需要对W求导,⽽由于RNN⽹络其特有的结构特性,使得在求导时会出现连乘操作:
⽽对于LSTM,相⽐于RNN加⼊了特有的门控结构,同时相⽐于RNN出了隐藏状态h还多了⼀个细胞状态C,没时刻都会对细胞状态进⾏更新,同时细胞状态的引⼊也是LSTM具备长期记忆能⼒的关键。
日本爱情电视剧7、BasicLSTMCell与LSTMCell的区别
BasicLSTMCell是LSTM实现的⼀个基础版本,LSTMCell是LSTM实现的⼀个⾼级版本。主要说LSTMCell中的u_peepholes参数,默认的为Fal表⽰不使⽤窥视孔连接。即为LSTMCell能够添加上⾯在第2条中所描述的窥视孔规则。
8、static_rnn和dynamic_rnn的区别:
静态RNN不能处理变长数据,动态RNN能够处理变长数据,这⾥的变长是说每个batch的最⼤长度能够不同,可以根据不同batch其batch中最⼤长度的⽂本进⾏填充,静态RNN是事先规定所有batch的句⼦最⼤长度都相同。注意:不管静态还是动态的RNN,其每个batch的⽂本长度都要是相同的。
单向的RNN:
注意:输出⽅⾯静态和动态的都是两个
输⼊数据⽅⾯:static_rnn接收的是⼀个个List,对于三维的输⼊x经过inputs=tf.unstack(x,axis=1)转换即可。⽽dynamic_rnn是Array
输出⽅⾯:Static_rnn输出的是⼀个⼤的list,顺序即为时间序列顺序,⾥⾯是⼀个个array,⼀维是批次⼤⼩,⼆维是RNN隐藏层节点的个
数。dynamic_rnn的输出是⼀个三维的array,注意需要维度转换,转换为时间批次优先的,anspo(outputs,[1,0,2])
作为下⼀全连接层输⼊,只需取最后⼀个序列的结果,因为前⾯的信息都被学习到了,最后⼀个序列的输出就是语义的表征,即为outputs[-1]即可。
双向的RNN:
注意:输出⽅⾯静态的是三个,动态的是两个
父亲的脊梁静态的也是输出⼀个list,顺序即为时间序列顺序,⾥⾯是⼀个个array,⼀维是批次⼤⼩,⼆维是RNN隐藏层节点的个数*2(这⾥是单向的⼆倍)。
具体代码实现为:
inputs=tf.unstack(x,axis=1)
outputs,_,_=tf.nn.static_bidirectional_rnn(lstm_fw_cell,lstm_bw_cell,inputs,dtype=tf.float32)
动态的也是⼀个Tensor,需要先对输出进⾏合并然后再转换为时间批次优先。
具体代码实现为:
outputs,output_bidirectional_dynamic_rnn(lstm_fw_cell,lstm_bw_cell,x,dtype=tf.float32)
at(outputs,2)#这⾥2可换为-1
anspo(outputs,[1,0,2])
dynamic_rnn中重要参数与返回值说明
它⽐静态RNN更加好⽤,注意的它的参数initial_state⽤于初始化cell的状态,这个参数不⽤设置,但是必须设置另外⼀个参数dtype它⽤于设置期望的输出和初始化state的类型,不设置initial_state必须要设置dtype,系统会⾃动按规定类型进⾏初始化。还有⼀个就是quence_length⽤于指定输⼊数据的有效长度,因为dynamic_rnn可以处理变长数据。对于其返回值,在说返回值之前还要说到⼀个参
数time_major:若其值设置为Fal则表⽰⾮时间批次优先,input的shape为[batch_size,max_time,...],如果是True则shape为
[max_time,batch_size,...]
⼀般选⽤默认的fal因为符合输⼊数据规范,同时dynamic_rnn的返回值有两个outputs和state,那么注意这⾥⼀定要对outputs输出进⾏维度转换,转换为时间批次优先,同时对于下⾯的全连接层只取最后⼀维。
anspo(outputs,[1,0,2])
ib.layers.fully_connected(outputs[-1],n_class,activation_fn=None)
我落泪情绪零碎9、动态RNN的第⼆个输出state的分析
具体参考:
对于dynamic_rnn的输出state是⼀个元组,元组的长度是LSTM⽹络的层数,state中的每⼀个元素为⼀个LSTMStateTuple,它的长度为2,第⼀个元素存的为每层LSTM最后⼀个时刻的c(细胞状态),第⼆个元素存的为每层LSTM最后⼀个时刻的h(即为隐层的输出),其中c和h的维度都是(batch_size,hidden_size)。其中LSTM最后⼀层的最后⼀个时间批次的输出为output[:-1:],同时为state[-1].h。
注意:LSTM⽹络结构从第⼀个输出output中能够得到最后⼀层各个时刻的输出。从第⼆个输出state中能够得到各层最后⼀个时刻的细胞状态c以及各层最后⼀个时刻隐层的输出h。
10.如何⽤LSTM处理过长的数据
尽管LSTM相⽐于RNN能够⼀定程度上缓解梯度消失问题,从⽽具备更好的记忆功能,但是当序列长度过长时仍然会出现梯度消失问题,有论⽂指出序列长度⼤于200LSTM也会容易出现梯度消失。