rnn神经网络

1.概述

循环神经网络是一种能对序列数据进行精确建模的有力工具。实际上,循环神经网络的理论计算能力是图灵完备的。自然语言是一种典型的序列数据(词序列),近年来,循环神经网络及其变体在自然语言处理的多个领域,如语言模型、句法解析、语义角色标注(或一般的序列标注)、语义表示、图文生成、对话、机器翻译等任务上均表现优异甚至成为目前效果最好的方法。

rnn神经网络

图为只有一层的rnn网络,循环神经网络按时间展开后如图2所示:在第tt时刻,网络读入第tt个输入xtxt(向量表示)及前一时刻隐层的状态值ht1ht−1(向量表示,h0h0一般初始化为00向量),计算得出本时刻隐层的状态值htht,重复这一步骤直至读完所有输入。如果将循环神经网络所表示的函数记为ff,则其公式可表示为:

 公式

rnn神经网络

2.rnn神经网络的单元

(1).LSTM长效记忆门

rnn神经网络

其中,it,ft,ct,otit,ft,ct,ot分别表示输入门,遗忘门,记忆单元及输出门的向量值,带角标的WW及bb为模型参数,tanhtanh为双曲正切函数,⊙表示逐元素(elementwise)的乘法操作。输入门控制着新输入进入记忆单元cc的强度,遗忘门控制着记忆单元维持上一时刻值的强度,输出门控制着输出记忆单元的强度。三种门的计算方式类似,但有着完全不同的参数,它们各自以不同的方式控制着记忆单元cc,

(2).GRU是LSTM的一个简化,只有两个门

  • 重置门(reset gate):如果重置门关闭,会忽略掉历史信息,即历史不相干的信息不会影响未来的输出。
  • 更新门(update gate):将LSTM的输入门和遗忘门合并,用于控制历史信息对当前时刻隐层输出的影响。如果更新门接近1,会把历史信息传递下去。

rnn神经网络

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