本质就是计算两个RNN,先计算一遍前向的,然后计算后向的,结果是结合这两个的输出结果。
    前向和后向的输入是一样的,输出是前向的输出结合后向的输出。

    双向语言模型 - 图1

    可以看到Forward层和Backward层共同连接着输出层,其中包含了6个共享权值w1-w6。在Forward层从1时刻到t时刻正向计算一遍,得到并保存每个时刻向前隐含层的输出。在Backward层沿着时刻t到时刻1反向计算一遍,得到并保存每个时刻向后隐含层的输出。最后在每个时刻结合Forward层和Backward层的相应时刻输出的结果得到最终的输出,用数学表达式如下:

    双向语言模型 - 图2

    用keras实现也是非常简单,只需要使用Bidirectional()将RNN包裹起来即可,参考:

    1. from tensorflow.python.keras.models import Sequential
    2. from tensorflow.python.keras.layers import Dense, GRU, Bidirectional
    3. maxlen = 5 # time_step
    4. max_features = 40 # 输入向量维度
    5. model = Sequential()
    6. #双向RNN
    7. model.add(Bidirectional(GRU(units), input_shape=(maxlen, max_features)))
    8. #输出层 2分类
    9. model.add(Dense(units=1, activation='sigmoid'))
    10. #模型可视化
    11. model.summary()