双向RNN

普通的RNN只能依据之前时刻的时序信息来预测下一时刻的输出,但在有些问题中,当前时刻的输出不仅和之前的状态有关,还可能和未来的状态有关系。

比如预测一句话中缺失的单词不仅需要根据前文来判断,还需要考虑它后面的内容,真正做到基于上下文判断。

BRNN有两个RNN上下叠加在一起组成的,输出由这两个RNN的状态共同决定。

从前往后:从1到t时刻正向计算,得到并保存每个时刻的隐藏层的输出向后传播

从后往前:从t时刻向1反向传播,得到并保存每个时刻向后隐藏层的输出

\overrightarrow{h_t}=g(x_tW_{xh}^{(f)}+\overrightarrow{h}_{t-1}W_{hh}^{(f)}+b_h^{(f)})

 \overleftarrow{h_t^{'}}=g(x_tW_{xh}^{(b)}+\overleftarrow{h}_{t+1}^{'}W_{hh}^{(b)}+b_h^{(b)})

对于每个时刻t,输入会同时提供给两个方向相反的RNN。

计算过程是,先从前往后计算h_1、h_2...,h_t,再从后往前计算,最终得到两个隐状态

完整的隐藏状态是把前向和后向的隐藏状态拼接起来

H_t=[\overrightarrow{h_t},\overleftarrow{h^{'}_t}]

如果前向和后向的隐状态都是1000*1维的,拼接后的H_t就是1000*2维的

输出由这两个单向RNN共同决定:

y_t=H_tW_{hq}+b_q

注意:

双向RNN需要保存两个方向的权重矩阵,所以需要的内存约为RNN的两倍。

两条RNN完全独立,不共享参数也不共享状态


 

参考:(46条消息) Keras学习:05.RNN和双向RNN讲解及实践_AI学习社的博客-CSDN博客_双向rnn

41-双向循环神经网络和代码实现-自然语言处理-pytorch_哔哩哔哩_bilibili 

RNN模型与NLP应用(5/9):多层RNN、双向RNN、预训练_哔哩哔哩_bilibili

(46条消息) (五)通俗易懂理解——双向LSTM_Dreamdreams8的博客-CSDN博客_双向lstm


(46条消息) 一幅图真正理解LSTM、BiLSTM_⊙月的博客-CSDN博客_bilstm

### 双向RNN概述 双向循环神经网络(Bidirectional Recurrent Neural Network, Bi-RNN)是一种特殊的RNN结构,它能够同时处理序列数据的前向和后向信息。这种设计使得模型可以更好地捕捉到时间序列中的长期依赖关系以及上下文信息[^2]。 在传统的单向RNN中,信息仅沿一个方向流动——从前向后;而在双向RNN里,则引入了另一个反向传播路径来补充正向的信息传递过程。因此,在任意时刻t处的状态不仅取决于过去的历史状态,还关联着未来可能发生的事件,从而提高了预测准确性并增强了表达能力[^1]。 具体来说,对于给定输入序列$x_1,x_2,\dots ,x_T$: - 正向部分按照正常顺序依次读取各个元素; - 而逆向组件则相反地从最后一个元素开始逐一向回扫描整个序列直到第一个位置为止。 最终得到的结果是由这两个不同视角下的隐含表示拼接而成的新特征向量$h_t=[\overrightarrow{h}_t;\overleftarrow{h}_t]$作为当前节点$t$的真实输出[^3]。 ### 实现方式 以PyTorch框架为例展示如何构建一个简单的双向LSTM用于文本分类任务: ```python import torch.nn as nn class TextClassifier(nn.Module): def __init__(self, vocab_size, embed_dim, hidden_dim, output_dim, n_layers, bidirectional=True): super().__init__() self.embedding = nn.Embedding(vocab_size, embed_dim) self.rnn = nn.LSTM(embed_dim, hidden_dim, num_layers=n_layers, bidirectional=bidirectional, dropout=0.5 if n_layers>1 else 0.) self.fc = nn.Linear(hidden_dim * (2 if bidirectional else 1), output_dim) def forward(self, text): embedded = self.embedding(text) outputs, _ = self.rnn(embedded) predictions = self.fc(outputs[-1,:,:]) return predictions ``` 上述代码片段定义了一个名为`TextClassifier` 的类继承自 `nn.Module`. 这个类包含了三个主要组成部分:词嵌入层(`Embedding`)、双向 LSTM 层 (`LSTM`, 设置参数 `bidirectional=True`) 和全连接线性变换(`Linear`). 当调用该对象实例化后的模型进行推理时,会先通过词嵌入获取句子中每个单词对应的低维稠密向量形式; 接下来送入双向LSTM单元做进一步加工提取高层次语义特性; 最终经由线性映射转换为目标类别概率分布.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值