Deep Learning Note: 5-1 序列模型

1. 序列模型

  循环神经网络(Recurrent Neural Network)用于处理序列模型,常见的应用场景有:

  • 语音识别(Speech Recognition):输入一段语音数据,输出语音内容的文本。输入和输出都是序列数据。
  • 音乐生成(Music Generation):没有输入,或输入特定参数(如一个表示音乐风格的数字),输出一段音乐。只有输出是序列数据。
  • 情感分类(Sentiment Classification):输入为一段文字(如用户对某个电影的影评),输出作者的情感(如用户对电影的喜好程度)。
  • DNA 序列分析(DNA Sequence Analysis):输入一段 DNA 序列,标记其中哪一段属于哪种蛋白质。
  • 机器翻译(Machine Translation):输出一种语言,翻译成另一种语言。
  • 视频活动识别(Video Activity Recognition):输入一段视频,判断视频中正在进行的活动。
  • 名称实体识别(Name Entity Recognition):输入一段文本,标记其中的名称(如人名)。

  以上问题中,有些问题的输入和输出都是序列,输入和输出的长度可能相同,也可能不同;有些问题的输出和输出只有一个是序列。这些问题都可以通过监督学习来解决。

2. 使用的符号表示

  下面以名称实体识别的问题为例,给出以后要使用的符号表示方法。搜索引擎可以通过名称实体识别来检索新闻中的人名,名称实体识别还可以用于识别不同的名称,如公司名、地名、国家名、货币名等等。

  这里假设要识别文本中的人名,并给出人名在文本中的位置,使用的符号表示如下。

  • 使用 $x$ 和 $y$ 分别表示输入文本和标签:
    [code lang=”kotlin”]x: Harry Potter and Hermione Granger invented a new spell.
    y: 1 1 0 1 1 0 0 0 0
    [/code]

  如果 $x$ 中的哪个词是人名,则 $y$ 在对应位置上的值为 1,否则为 0。为了方便说明,这里使用了对每个词进行标记的方法来定位人名。实际上,更好的表示方式是给出人名的起止位置。

  对于上面单个样例的情况:

  • 使用 $x^{\lt t \gt}$ 表示 $x$ 中的第 $t$ 个词,这里有 $x^{<1>} = Harry$,$x^{<2>} = Potter$,$x^{<3>} = and$,等等。
  • 使用 $y^{\lt t \gt}$ 表示 $y$ 中的第 $t$ 个元素,这里有 $y^{<1>} = 1$,$y^{<2>} = 1$,$y^{<3>} = 0$,等等。
  • 使用 $T_x$ 表示 $x$ 序列的长度,这里有 $T_x = 9$。
  • 使用 $T_y$ 表示 $y$ 序列的长度,这里有 $T_y = 9$。

  对于多个样例的情况:

  • 使用 $x^{(i)}$ 表示第 $i$ 个样例,则 $x^{(i)\lt t \gt}$ 表示第 $i$ 个样例中的第 $t$ 个词。使用 $T_x^{(i)}$ 表示第 $i$ 个样例序列的长度。
  • 使用 $y^{(i)}$ 表示第 $i$ 个样例的标签,则 $y^{(i)\lt t \gt}$ 表示第 $i$ 个样例的标签中的第 $t$ 个元素。使用 $T_y^{(i)}$ 表示第 $i$ 个样例的标签的长度。

  对于文本中单词的表示,不会直接使用单词的文本,而是先建立一个词汇表(Vocabulary),也称为字典(Dictionary)。如下面所示,左边的向量是词汇表,右边的数字表示词汇表中的单词所在的位置。

\begin{equation}
\begin{bmatrix}
a \\
aaron \\
… \\
and \\
… \\
harry \\
… \\
potter \\
… \\
zulu \\
\end{bmatrix}
\begin{matrix}
1 \\
2 \\
… \\
367 \\
… \\
4075 \\
… \\
6830 \\
… \\
10000 \\
\end{matrix}
\end{equation}

  上面的词汇表中总共有 1 万个单词,对于现代的自然语言处理问题,词汇表经常有 3 万到 5 万的单词,拥有 10 万单词的词汇表也不少见,大型的公司甚至会使用上百万的单词。

  使用上面的词汇表,对 $x$ 中的单词进行独热编码(One-Hot Encoding),即得到了各 $x^{\lt t \gt}$ 的值。例如前面句子中的第一个词 harry,它在词汇表中的位置为 4075,则 $x^{<1>}$ 是一个 $10000 \times 1$ 的向量,其中第 4075 个元素的值为 1,其他元素的值都为 0,即:

\begin{equation}
x^{<1>} =
\begin{bmatrix}
0 \\
0 \\
… \\
1 \\
… \\
0 \\
0
\end{bmatrix}
\begin{matrix}
1 \\
2 \\
… \\
4075 \\
… \\
9999 \\
10000 \\
\end{matrix}
\end{equation}

  类似地,$x^{<1>}$ 的值为:

\begin{equation}
x^{<2>} =
\begin{bmatrix}
0 \\
0 \\
… \\
1 \\
… \\
0 \\
0
\end{bmatrix}
\begin{matrix}
1 \\
2 \\
… \\
6830 \\
… \\
9999 \\
10000 \\
\end{matrix}
\end{equation}

  在词汇表中,会额外定义一个特殊的符号,如 <UNK>,来表示未知的单词,如果在文本中遇到词汇表中没有的单词,则将该单词映射为 <UNK>。

3. 使用普通神经网络处理序列数据

  如果使用普通的神经网络来处理前面识别文本中的人名的问题,网络的输入为 $T_x$ 个 $10000 \times 1$ 的向量(10000 为词汇表的大小),经过若干层网络,输出 $T_y$ 个值,如图 1 所示。

图 1

图 1

  以上实现主要存在两个问题:

  • 对于不同的样例,网络的输入和输出可能具有不同的长度,而对于图 1 所示的网络,其输入层和输出层的结构不会随样本的变化而变化。
  • 图 1 所示的网络不能在文本的不同位置共享特征。例如网络习得句子的第一个单词 Harry 是一个人名后,我们希望网络也能将其他位置上的 Harry 看成是潜在的人名。类似于卷积神经网络,共享特征可以减少所要学习的参数的数量。图 1 所示的网络输入层就有 $10000 \times T_x$ 个值,网络第一层的参数会非常多。

  循环神经网络既可以处理可变长度的序列,又可以对在不同位置上习得的特征进行共享,解决了以上两个问题。