神经网络学习笔记-04-循环神经网络算法解释

神经网络学习笔记-04-循环神经网络算法解释

本文是根据WildML的Recurrent Neural Networks Tutorial写的学习笔记。

门控循环单元 - GRUs (Gated Recurrent Units)

先看看计算公式:

\[x_e = Ex_t \\ z = \sigma(U^zx_e + W^zs_{t-1} + b^z) \\ r = \sigma(U^rx_e + W^rs_{t-1} + b^r) \\ h = tanh(U^hx_e + W^h(s_{t-1} \circ r) + b^h) \\ s_t = (1 - z) \circ h + z \circ s_{t-1} \\ o_t = Vs_t + c \]

计算公式的理解

首先,我们有一个单词集合,包含了常用的单词和标点符号。
这个单词集合,在训练前就已经确定了。因此:单词量在训练和预测的过程中是固定的。比如:8000。
我们想象现在正在学习需要句子,用来自动生成有一定含义的语句。

在训练的过程中,会建立以下数据:

  • 输入数据
    \(x_t\)的维度为\(8000\)。每个维度对应一个单词。是一个one-hot vector。
    就是说8000个维度里,只有一维为1,其它都是0。
    表示当前输入的单词。

  • 输出数据
    \(o_t\)的维度为\(8000\)。含义同\(x_t\)。可以理解为,根据已输入的单词,预测下一个应该是哪个单词。

  • 内部状态
    \(s_t\)的维度为\(100\)。内部状态。取值范围[-1, 1]。
    \(s_t\)是算法中的关键,可以理解为语言中的上下文。或者记忆。
    由算法可以看出\(s_t\)决定\(o_t\)

  • 参数
    \(E\)的维度为:\(100 \times 8000\)。为单词集合中的每个单词建立一个单词特征值。每个单词特征值的维度为100。
    \(U^z, U^r, U^h\)的维度为:\(100 \times 100\)
    \(W^z, W^r, W^h\)的维度为:\(100 \times 100\)
    \(b^z, b^r, b^h\)的维度为:\(100\)
    \(V\)的维度为:\(8000 \times 100\)
    \(c\)的维度为:\(8000\)

  • 计算过程和计算变量
    \(x_e = Ex_t\)的意思是从\(E\)取出单词\(x_t\)的状态。(SELECT state FROM E WHERE word_id = x_t)
    \(x_e\)的维度为:\(100\)
    \(z\)的维度是\(100\)。每个数的取值范围为[0, 1]。可以简单地理解为\(0\)\(1\)。就像一个开关。\(0\)表示不要。\(1\)表示要。
    \(z\)这个开关,控制上下文中哪些数据要保留
    \(r\)的维度是\(100\)。同\(z\)
    \(r\)这个开关,控制上下文中哪些数据需要重置。
    \(h\)的维度是\(100\)。每个数的取值范围为[-1, 1]。可以简单地理解为\(-1\)\(1\)。控制输出单词的可能性。
    \(h\)这个开关,控制上下文中(由\(z\)确定的)不保留的数据的新值
    \(h\)就是\(s_t\)(的新值)。
    \(h\)决定了\(s_t\)

  • 参数的意义

    • \(E\)是单词特征值集合。
      我们可以想象特征可以表示为这个单词是否是名词,是否是形容词,是否表示否定等等各种语言特征。
      上面所说的是一个比喻。因为没有输入词性的信息。RNN不可能学习到名词、形容词等概念。
      (为了方便理解,后面,会继续用这个比喻来说明。)
      实际情况是什么呢?我还不知道。😦。
      我猜测很可能是这样的特征信息:

是否容易出现在开头。
是否容易出现在结尾。
关系1
关系1,我在前面
关系1,我在后面
关系2
关系2,我在第一位
关系2,我在最后一位
...
如果,两个单词的" 前后关系1“的值都为1。在前面的单词已经出现了,那么后面的那个单词出现的可能性就大了。

* 上下文$s_t$的含义

可以很容易的注意到,上下文和单词特征有一对一的关系。
\(s_t\)是根据前一个上下文\(s_{t-1}\)和当前输入单词的特征\(x_e\)变化而来。
\(s_t\)的值是直接从\(h\)来的,取值范围是\([-1, 1]\)。有方向性的表示,比如:名词的相关程度(和不相关程度)。
因此:\(s_t\)的含义是当前语境下,各个语言特征的相关程度
比如:有一个名字,一个动词,否定语气。
\(s_t\)最终又决定了输出单词的概率。我们仔细看看它是如何决定\(o_t\)的?
通过和\(V\)的乘积!这是什么意思呢?
我们要理解\(V\)\(V\)表示对每个单词,上下文(语言特征相关性)决定的下一个单词出现可能性的权值。

* $U^z$是单词特征值的保留权值。

在决定上下文中哪些特征需要保留的时候,单词特征值的价值。
比如:如果这个单词是个名词的话,价值更大,需要保留。是个介词的话,价值较小。

* $W^z$是前上下文的保留权值。

在决定上下文中哪些特征需要保留的时候,前上下文的价值。

* $b^z$是保留偏差。
* $U^r$是单词特征值的重置权值。

在决定上下文中哪些特征需要重置的时候,单词特征值的价值。
比如:如果这个单词是个名词的话,价值更大,需要重置上下文。是个介词的话,价值较小,不太需要重置上下文。

* $W^r$是上下文的重置权值。

在决定上下文中哪些特征需要重置的时候,前上下文的价值。
* \(b^r\)是重置偏差。
* \(U^h\)是单词特征值变成上下文值的权值。
* \(W^h\)是前上下文值变成当前上下文值的权值。
* \(b^h\)是上下文值的偏差。
* \(V\)是每个单词对应上下文,产生输出单词的概率权值。
\(V\)表示对每个单词,上下文(语言特征相关性)决定的下一个单词出现可能性的权值。
* \(c\)是输出单词概率的偏差。

随想

如果你看懂了我的上面的烂文。就明白\(E, V, s_t\)是核心。它们包含的数据到底有什么意义呢?
\(E\)对每个单词有一个100维的矢量。用来保存每个单词的特征值。
\(V\)对每个单词有一个100维的矢量。是计算输出单词概率的权值。
\(s_t\)是一个100维的矢量。用来保存上下文。
很容易理解,这三个100维的数据,在同一维度上是关联的。
单词的每个特征值的含义会是什么?那么,上下文和\(V\)的每维的含义呢?

我在这里猜测一下。由于训练的目的(被训练数据决定)是学习如何产生一句自然语言。
那么这些数据都是和单词前后位置有关的信息。这些信息会是什么?
比如:我会出现在首位,我会出现在末尾,我们几个会一起出现等等等等,可能性很多。
\(E\)中每个单词的特征值可能是位置信息。
\(s_t\)可能是当前已输入单词组成的句子结构。
\(V\)可能是每个单词在句子结构中的位置可能性。

一个常常想到的问题是:会不会有语法和语法结构的概念?
直观的回答是:不会。因为,训练数据中,并没有这个东西。算法也不可能知道那怕名词、动词这样的概念。
如果,我们从机器的角度看,训练结果可以理解为机器学习到的语法结构
机器没有主谓宾的概念,所以不会说:“我学习到了主谓宾的语法结构”。
但是一个有趣的问题是:机器的语法结构和人类的语法结构是否会匹配?
我觉得是很有可能的。毕竟它学习的是人类语言。
它很可能学会了"cannot help doing"这样的关系;发现某些词容易出现在有问号结尾的句字开头;
发现有一类词很可能出现在另一类词的后面。
机器没有给这些关系起名字,描述这些关系。而这些是我们可以做的。

参照

posted @ 2017-02-16 20:11  SNYang  阅读(1827)  评论(0编辑  收藏  举报