了解RNN

卷积神经网络适合处理图片信息,那文字信息怎么办呢?首先要明白,对于计算机,或者说神经网络来说,文字都是要转换为数字之后再进行处理的。那么我们要面对的第一个问题就是:如何将文字转换为数字?

文字转数字的朴素思想

有一种简单粗暴的方法:每一个文字或词组都用一个数字来代表,建一个非常大的映射关系表。

但这样有几个显而易见的缺点:

  1. 只用一个数字表示,不仅要建的表很大,维度也很低(只有一维)。
  2. 数字和数字之间无法表示字与字、词与词之间的联系。

为了解决维度低的问题,有人提出了 one-hot 编码,即准备一个维度非常高的向量,每个字只有向量中一个位置是 1,其余全是 0。虽然维度低的问题被解决了,但是维度好像又太高了,并且依然没有解决之前的第二个问题。

更好的方案:词嵌入

那有没有能解决以上两种问题的方法呢?有的,这种方法就是 词嵌入(Word Embedding)

通过词嵌入的方式得到的词向量,维度不高不低,每个位置可以理解为一个特征值,但这个特征是通过训练得到的,我们并不知道代表着什么。那这种方式如何表示词与词之间的语义相关性呢?可以用两个向量的点积或余弦相似度来表示向量之间的相关性,进而表示词语之间的相关性。

这样就将自然语言之间的联系转为可以用数学公式计算的方式。同时,一些数学上的计算结果可能反映出一些很微妙的关系,例如一个训练好的词嵌入矩阵,很可能使得 桌子 - 椅子 = 鼠标 - 键盘

把所有词向量组成一个大矩阵,这个大矩阵就叫做 嵌入矩阵,每一列表示一个词向量。

矩阵中的值由训练得到,比较经典的方法是 word2vec,这里不展开讲解。虽然这样表示的维度比起 one-hot 已经大大下降,但是也超过了人能直接理解的二维、三维,我们管这些向量所在的空间叫做 潜空间

我们无法理解潜空间中的位置关系,但是也有一些方法能够把潜空间降维至 2-3 维,方便我们直观看到词与词之间的关系。

RNN 如何处理序列信息

这样我们的第一个问题就算是解决了,我们可以用词嵌入的方法将文本转为数据,但这样就可以了吗?举个例子,一句话中的五个词转为 5 个词向量,每个词向量假设为 300 维度,那么输入层就要有 1500 个神经元。当然是可以的,但是有两个新问题:

  1. 输入层太大了,并且长度不固定;
  2. 无法体现词语的先后顺序,参考之前无法体现图片像素的位置关系。

在之前的图像处理中,我们可以通过卷积的方式来解决这一问题,那现在呢?

让我们回到经典的神经网络,但是不是一次输入一句话,而是输入一个词。

可以发现在第二个词的计算过程中,完全没有让第一个词的任何信息参与进来,怎么办呢?我们可以让它先输出一个隐藏状态,然后再经过一次非线性变换,得到输出 Y。这就是 循环神经网络 RNN(Recurrent Neural Network)

这个 RNN 模型就具备了理解词与词之间先后顺序的能力,可以判断一句话中各个单词的褒贬词性,还能给出一句话,不断生成下一个字,以及完成翻译等自然语言处理工作。

RNN 的局限性

那么 RNN 是否就完美了呢?当然不,RNN 依旧存在两个问题:

  1. 长期依赖问题:信息会随着时间步的增多而逐渐丢失,无法捕捉长期依赖,而有的语句的关键信息恰好在很远的地方。
  2. 顺序处理限制:RNN 必须顺序处理,每个时间步必须依赖上一个时间步的隐藏状态的计算结果,这限制了并行计算的能力。

为了解决这些问题,研究者们提出了多种 RNN 的变体。其中最著名的就是 长短期记忆网络(LSTM)门控循环单元(GRU)

  • LSTM:通过引入“门”机制(输入门、遗忘门、输出门)来控制信息的流动。这使得网络可以有选择地学习、记忆或遗忘信息,从而更好地捕捉序列中的长期依赖关系。
  • GRU:作为 LSTM 的一种简化变体,它将输入门和遗忘门合并为“更新门”,并引入了“重置门”。GRU 的结构更简单,计算效率更高,在许多任务上也能取得与 LSTM 相近的效果。

这些改进在很大程度上缓解了 RNN 的梯度消失问题,但它们仍然需要按顺序处理数据,未能解决并行计算的限制。那么,是否有一个可以彻底抛弃按顺序计算的新方案呢?

有的,那就是 Transformer

参考自 B站up主 飞天闪客