双向 LSTM 是什么?同时从前往后和从后往前读序列
双向长短期记忆网络(Bi-directional Long Short-Term Memory,Bi-LSTM)是一种处理序列数据的神经网络,它由两个长短期记忆网络组成:一个从序列的开头往后读,另一个从序列的末尾往前读,再把两者在每个位置得到的信息合并起来。这样,序列中每个位置的表示,既包含了它前面的信息,也包含了它后面的信息。
为什么需要“双向”
普通的循环神经网络和长短期记忆网络按照从前往后的顺序处理序列,在每个位置上,它只能“看到”这个位置之前的内容。但在很多任务中,理解一个词需要同时参考它前后的内容。比如“我在苹果店买了一部手机”和“我在水果店买了一斤苹果”,要判断“苹果”指的是公司还是水果,后面的“手机”或者前面的“水果店”都很关键。又比如在“他说的话很___,大家都笑了”中,要猜出空格处的词,后面的“大家都笑了”提供了重要的线索。只从一个方向读,就会丢失另一侧的信息。
它是怎么工作的
双向结构的思想最早由 Mike Schuster 和 Kuldip Paliwal 在 1997 年提出,称为双向循环神经网络;2005 年前后,Alex Graves 和 Jürgen Schmidhuber 把它与长短期记忆网络结合,用于语音识别中的音素分类,取得了很好的效果。它的结构很直观:一个正向的长短期记忆网络从第一个元素开始,依次读到最后一个元素,在每个位置得到一个包含“过去”信息的隐藏状态;一个反向的长短期记忆网络从最后一个元素开始,倒着读到第一个元素,在每个位置得到一个包含“未来”信息的隐藏状态。两个网络各自有独立的参数。最后,把两个方向在同一位置上的隐藏状态拼接起来,作为这个位置的最终表示,再交给后面的层进行预测。
典型的应用
序列标注:比如命名实体识别(找出句子中的人名、地名、机构名)、词性标注、中文分词。在深度学习时代早期,“双向长短期记忆网络加条件随机场”是这类任务的标准做法:双向网络负责提取每个词的上下文特征,条件随机场负责保证输出的标签序列整体合理。语音识别:识别某一帧语音时,参考它前后的声音。情感分析和文本分类:把两个方向最后的隐藏状态合起来,作为整个句子的表示。预训练语言模型:2018 年的 ELMo 模型使用了双向的多层长短期记忆网络,在大量文本上预训练后,为每个词提供随上下文变化的表示,在多项任务上带来了显著的提升,它是 BERT 等预训练模型的重要先驱之一。
局限和后来的发展
双向结构要求在处理之前就拿到完整的序列,因此不适用于需要实时处理、边接收边输出的任务,也不适用于文本生成这样逐个生成下一个词的任务,因为生成时还没有“后面”的内容。此外,它和普通的循环网络一样需要按顺序计算,难以并行,在很长的序列上训练较慢。2018 年以后,基于 Transformer 的 BERT 通过注意力机制让每个位置都能直接看到全部上下文,而且可以并行计算,在大多数任务上取代了双向长短期记忆网络。不过在一些对模型大小和速度有要求的场景中,它仍然被使用。