词嵌入

编码

自然语言就是人类用于交流的文字,例如中文、日文、英文。人可通过眼睛识别文字符号,然后通过大脑理解表达含义。对于人而言,文字可以通过「眼睛」直接输入到大脑,但是计算机并没有「眼睛」,因此,需要先将「文字」转换为「二进制」,才能交给计算机进行处理。将「文字」转换为「二进制」的过程便是编码

alt

早期的编码方式

  • 编号 : 每个词使用唯一编号进行标记,维度低,只实现了词的区分,无法表示词之间的关系

    PLAINTEXT
    他          32
    开心        1240 
    我          12
  • one hot: 使用一个高维度向量(向量由0,1构成)表示一个词,维度高,但也只实现了词的区分,无法表示词之间的关系

    PLAINTEXT
    他          [0,1,0,..,0]
    开心        [0,0,1,..,0]
    我          [0,0,0,..,1]

词嵌入

词嵌入word embeddig: 每一个词由一个特征向量表示,维度适中,且可以表达式词之间的关系

alt

通过特征向量便能进行数学运算

  • 加减法:桌子 - 椅子, 鼠标 - 键盘
  • 比较运算:桌子 - 椅子 == 鼠标 - 键盘
  • 点积运算: $\vec{a} \cdot \vec{b}$ ,常用于判断两个词的相关性

嵌入矩阵:将所有词的特征向量拼接在一起得到的矩阵

alt

RNN

背景

文本通过分词器拆分为词,接着查询嵌入矩阵便能得到词相关的特征向量(词嵌入)。将这些特征向量按照文本顺序排列,便得到了模型输入参数。

alt

但如果直接将这些特征向量展开为一维向量输入FNN神经网络,显然是不现实的,输入参数太多,例如特征向量维度是 100, 那么 5 个词构成的句子输出向量的维度便是5 * 100 = 500因此,诞生了RNN(Recurrent Neural Network) 循环神经网络

网络结构

alt

  1. 利用 $h^{}$ 传递前文信息。对于 FNN 而言, $Y^{} = \sigma(W X^{} + b)$ 的输出 $Y^{}$ 只反应了 $X^{}$ 影响,这显然不对,当前词表达的含义肯定是和前文有关。因此,利用 $h^{}$ 传递前文的信息

基本公式:

$$\begin{align*} h^{<t>} &= g(W_{hh} \cdot h^{<t-1>} + W_{xh} \cdot x^{<t>} + b_h) \\ y^{<t>} &= \sigma(W_{hy} \cdot h^{<t>} + b_y) \end{align*}$$

网络图示结构便是

alt

参数的维度

alt

缺陷

RNN 只是给 NLP 研究开了一个头,但并非版本答案,其网络结构存在严重缺陷 2. ${x^{<1>} \rightarrow y^{<1>}, \dotsm ,x^{} \rightarrow y^{}}$ 只能串行计算,无法并行 3. 无法捕捉长期依赖信息,例如 $x^{<1>}, x^{}$, 当 $n$ 远大于 $1$ 时,$x^{<1>}$ 对 $y^{}$ 的影响可会略不计。

针对 RNN 的上述问题,又提出了 GRULSTM 两种改进网络。

License

Author: 海拉鲁的三角

Link: http://localhost:1313/artificial_intelligence/posts/nlp/rnn/

License: MIT

只要学不死,就往死里学