双向神经网络(Bidirectional RNN)

来源:Coursera吴恩达深度学习课程

目前为止,我们已经了解了大部分RNN模型的关键的构件(key building blocks),还有两个方法(two more ideas)可以让你构建更好的模型,①双向RNN模型(bidirectional RNN),它可以让你在序列的某点处不仅可以获取之前的信息,还可以获取未来的信息。②第二个就是深层的RNN(deep RNN)。我们现在先从双向RNN开始吧。

回顾命名实体识别的例子,在判断第三个单词Teddy是不是人名的一部分时,我们只看了前三个单词,除了这些信息我们还需要更多的信息。因为根据前3个单词无法判断他们说的是Teddy熊,还是前美国总统Teddy Roosevelt,所以这是一个非双向的或者说只有前向的RNN。不管这些单元(上图方形区域)是标准的RNN块,还是GRU单元或者是LSTM单元,只要这些构件都是只有前向的

那么一个双向的RNN是如何解决这个问题的?下面解释双向RNN的工作原理

(备注:还是这个问题,不知道为什么右上角的符号就是显示不出来,这篇文章都会()代替,有时间会解决这个bug,望谅解。)

如上图,为了简化,用一个只有4个单词(4个输入,x^(1)到x^(4))的句子,这个网络会有一个前向的循环单元(紫色标记),在这上面加个向右的箭头(right arrow)来表示前向的循环单元(forward recurrent component),然后连接起来。这四个循环单元都有一个当前输入x输入进去,得到预测的y帽。

如上图,我们增加一个反向循环层(绿色标记),左箭头代表反向连接。这样,这个网络就构成了一个无环图(acyclic graph)。给定一个输入序列x^(1)到x^(4),序列先计算前向a^(1)(右箭头),然后计算a^(2)(右箭头)、a^(3)(右箭头)和a^(4)(右箭头)。然后反向序列从a^(4)(左箭头)开始计算,反向进行,计算反向是a^(3)(左箭头)。你计算的是网络激活值,这不是反向而是前向的传播,而图中这个前向传播一部分计算是从左到右,一部分计算是从右到左。可以用这些激活值计算反向的a^(2)(左箭头),然后是反向的a^(1)(左箭头),把所有这些激活值都计算完了就可以计算预测结果了。

为了预测结果,应用激活函数有公式:

具体看一个例子:

如上图黄色标记,比如你要观察时间3这里的预测结果,信息从x^(1)过来,流经前向的a^(1)(右箭头)和a^(2)(右箭头),到前向的a^(3)(右箭头)再到y^(3),这条路径把输入信息x^(1)到x^(3)都考虑在内。而x^(4)的信息会流到反向的a^(4)(左箭头),到反向a^(3)(左箭头),再到y^(3),这条路径使用了输入信息x^(4)。这样使得时间3的预测结果不仅输入了过去的信息,还有现在的信息,同时涉及了前向和反向的传播信息以及未来的信息。给定一个句子"He said Teddy Roosevelt..."来预测Teddy是不是人名的一部分,你需要同时考虑过去和未来的信息。

这就是双向循环神经网络(bidirectional recurrent neural network),并且这些基本单元不仅仅是标准RNN单元,也可以是GRU单元或者LSTM单元。事实上,很多的NLP问题,对于大量有自然语言处理问题的文本,有LSTM单元的双向RNN模型是用的最多的。所以如果有NLP问题,并且文本句子都是完整的,首先需要标定这些句子,一个有LSTM单元的双向RNN模型,有前向和反向过程是一个不错的首选。

以上就是双向RNN的内容,这个改进的方法不仅能用于基本的RNN结构,也能用于GRU和LSTM。

说明:记录学习笔记,如果错误欢迎指正!转载请联系我。

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中可以使用深度学习框架如TensorFlow或PyTorch来实现双向RNN神经网络双向RNN可以同时考虑上下文信息,对于处理序列数据非常有用。在TensorFlow中,可以使用tf.keras.layers.Bidirectional函数来构建双向RNN层。以下是一个简单的示例代码: ```python import tensorflow as tf # 定义双向RNN模型 model = tf.keras.Sequential(\[ tf.keras.layers.Bidirectional(tf.keras.layers.SimpleRNN(units=64, return_sequences=True), input_shape=(timesteps, input_dim)), tf.keras.layers.Bidirectional(tf.keras.layers.SimpleRNN(units=64)), tf.keras.layers.Dense(units=num_classes, activation='softmax') \]) # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=\['accuracy'\]) # 训练模型 model.fit(x_train, y_train, epochs=10, batch_size=32) # 使用模型进行预测 predictions = model.predict(x_test) ``` 在上述代码中,我们使用了tf.keras.layers.Bidirectional函数来构建双向RNN层。双向RNN层接受一个RNN单元作为参数,可以是SimpleRNN、LSTM或GRU等。通过设置return_sequences参数为True,我们可以保留每个时间步的输出,否则只保留最后一个时间步的输出。最后,我们添加了一个全连接层来输出预测结果。 需要注意的是,上述代码只是一个简单的示例,实际应用中可能需要根据具体任务和数据进行调整和优化。 #### 引用[.reference_title] - *1* *2* *3* [python自然语言处理—RNN(循环神经网络)](https://blog.csdn.net/weixin_38477351/article/details/108476400)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值