05-从词嵌入到RNN

将词句“翻译”成计算机能理解的形式,这个过程叫做编码

一种编码方式是,只用一个数字来表示一个词,词表有多大,数字标识的范围就要有多大,缺点是,维度太低了,相当于一个一维向量,而且词和词之间没有任何相关性,对语义理解没有任何帮助。

1753606086215

另一种编码方式是,准备一个大的向量,每个向量中只有一个位置是1,其余位置都是0,每个向量代表一个词,这种方式叫做one-hot编码(独热编码)。缺点:维度太高了,非常稀疏,而且每个向量都是正交的,依然无法找到词与词之间的相关性。而且,如果把每个数字都看作是一个特征,那么每个特征是十分死板的是或者否。

1753606362600

设计一个不高也不低的编码方式,叫做词嵌入(word embedding),每个词的编码是一个固定长度的向量,这个向量中每个位置上的数字都是浮点数,而且每个词的向量都是独一无二的,但是,词与词之间的向量是相似的,语义相近的词,它们的向量在空间中的距离是相近的。可以使用两个向量之间的点积或余弦相似度来衡量它们之间的相关性。

ab=i=1naibicos(θ)=abab\bm{a}\cdot\bm{b}=\sum_{i=1}^{n}a_ib_i \\ \cos(\theta)=\frac{\bm{a}\cdot\bm{b}}{||\bm{a}||\cdot||\bm{b}||}

1753606652284

把所有词向量组合起来,就构成了词嵌入矩阵。词嵌入矩阵的维度是:词表大小×词向量维度。每一列(或行)都表示一个词向量,这个向量维度非常高,它所在的空间叫做潜空间(latent space)

1753606933198

如果将词向量依照之前神经网络结构输入,会有两个问题:一是输入层太大了,而且会随着一句话中词语数量的变化而变化,是变长的、不确定的;另一个问题是,无法体现词语的先后顺序,仅仅是将其平铺展开送入输入层,这样无法体现词语之间的关联和特征。


首先,在输入时不要输入一整个句子,而是输入一个词,同时,这个词得到的结果不要马上输出,而是输出到中间一个隐藏层,保存状态,并在下一个词的计算过程中参与进去,这样,隐藏层中的状态就保存了之前输入的词的信息。

1753607299810

上图就是一个循环神经网络(Recurrent Neural Network,RNN),它是一种特殊的神经网络,它的输入是变长的,而且每个输入之间是有关联的,它有一个隐藏层,隐藏层中的状态会保存之前输入的信息,并参与下一个输入的计算。

1753607497035

1753607509378

1753607600940

h<t>=g1(WxhX<t>+Whhh<t1>+bh)y<t>=g2(Whyh<t>+by)\begin{align*} h^{<t>} &= g_1(W_{xh}X^{<t>}+W^{hh}h^{<t-1>}+b_h) \\ y^{<t>} &= g_2(W_{hy}h^{<t>}+b_y) \end{align*}

RNN存在的问题:

  1. 无法捕捉长期依赖:RNN在处理长句子时,由于梯度消失或梯度爆炸,导致无法捕捉到句子中较远的词语之间的依赖关系。
  2. 无法并行计算:RNN在计算时,每个时间步的计算都需要依赖于前一个时间步的计算结果,无法并行计算,导致计算效率低下。