神经网络学习笔记-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不可能学习到名词、形容词等概念。
      (为了方便理解,后面,会继续用这个比喻来说明。)
      实际情况是什么呢?我还不知道。