NLP中的RNN、Seq2Seq与attention注意力机制

https://zhuanlan.zhihu.com/p/28054589

这篇文章通过易于理解的例子,把自然语言处理过程中会遇到 RNN(循环神经网络)、Seq2Seq、Attention 的大致工作方式讲的挺清楚的(主要面向初学者,不涉及实现细节,基本不需要数学和编程知识)。

  • 循环神经网络,就是有这么个神经网络,它会挨个处理文字(计算机内部会将它表示为特定的向量),同时也会将上一次的处理结果作为输入一并处理。这样的话,即使是同一个文字,如果出现的位置不一样,就会有不同的效果。也是因为这个特性,导致无法并行处理文字。
  • Seq2Seq,就是将一个序列映射为另一个序列,比如将一段中文映射(翻译)为一段英文。一个纯粹的神经网络是一一对应的,如果输入的长度为 10,那么输出的长度也为 10。但现实中,中英文的长度往往是不一样的,所以需要引入 Encoder-Decoder 模型,先将输入数据编码成一个上下文向量 c (context),拿到 c 之后,再用另一个RNN网络对其进行解码,从而达到 M→N 的效果。除了翻译的场景外,文本摘要、语音识别也是典型的使用场景。
  • 因为 c 中必须包含原始序列中的所有信息,它的长度就成了限制模型性能的瓶颈。Attention 机制不再使用一个单独的 c,而是将它分散到 decoder 中(这块不太明白)。一方面解决 c 过长的问题,另一方面也可以进行权重分配。比如「机器学习」,翻译的时候「机器」作为一组来翻译,「学习」作为另一组翻译,也就是分配不同的权重(注意力)。至于如何来判断单词的相似度,可以通过向量间的余弦相似度或其他方式。

❤️