1.概述
循环神经网络是一种能对序列数据进行精确建模的有力工具。实际上,循环神经网络的理论计算能力是图灵完备的。自然语言是一种典型的序列数据(词序列),近年来,循环神经网络及其变体在自然语言处理的多个领域,如语言模型、句法解析、语义角色标注(或一般的序列标注)、语义表示、图文生成、对话、机器翻译等任务上均表现优异甚至成为目前效果最好的方法。
图为只有一层的rnn网络,循环神经网络按时间展开后如图2所示:在第tt时刻,网络读入第tt个输入xtxt(向量表示)及前一时刻隐层的状态值ht−1ht−1(向量表示,h0h0一般初始化为00向量),计算得出本时刻隐层的状态值htht,重复这一步骤直至读完所有输入。如果将循环神经网络所表示的函数记为ff,则其公式可表示为:
公式
2.rnn神经网络的单元
(1).LSTM长效记忆门
其中,it,ft,ct,otit,ft,ct,ot分别表示输入门,遗忘门,记忆单元及输出门的向量值,带角标的WW及bb为模型参数,tanhtanh为双曲正切函数,⊙⊙表示逐元素(elementwise)的乘法操作。输入门控制着新输入进入记忆单元cc的强度,遗忘门控制着记忆单元维持上一时刻值的强度,输出门控制着输出记忆单元的强度。三种门的计算方式类似,但有着完全不同的参数,它们各自以不同的方式控制着记忆单元cc,
(2).GRU是LSTM的一个简化,只有两个门
- 重置门(reset gate):如果重置门关闭,会忽略掉历史信息,即历史不相干的信息不会影响未来的输出。
- 更新门(update gate):将LSTM的输入门和遗忘门合并,用于控制历史信息对当前时刻隐层输出的影响。如果更新门接近1,会把历史信息传递下去。
encoder_fwd_cell = layers.GRUCell(hidden_size=hidden_dim) encoder_fwd_output, fwd_state = layers.rnn( cell=encoder_fwd_cell, inputs=src_embedding, sequence_length=src_sequence_length, time_major=False, is_reverse=False) # 使用GRUCell构建反向RNN encoder_bwd_cell = layers.GRUCell(hidden_size=hidden_dim) encoder_bwd_output, bwd_state = layers.rnn( cell=encoder_bwd_cell, inputs=src_embedding, sequence_length=src_sequence_length, time_major=False, is_reverse=True) # 拼接前向与反向GRU的编码结果得到h encoder_output = layers.concat( input=[encoder_fwd_output, encoder_bwd_output], axis=2) encoder_state = layers.concat(input=[fwd_state, bwd_state], axis=1) return encoder_output, encoder_state
来源:https://www.cnblogs.com/yangyang12138/p/12432116.html