简单的RNN示例显示数字

时间:2018-04-26 18:49:12

标签: machine-learning deep-learning lstm rnn

我试图理解RNN,我想找到一个简单的例子,它实际上显示了一个热矢量和数值运算。优选地,因为实际代码可能使其更加混乱。我谷歌的大多数例子只显示带有循环的框,而且很难理解究竟发生了什么。在罕见的情况下,他们确实显示了向量,但仍然很难看出他们如何获得这些值。

例如,我不知道这张图片中值的来源https://i1.wp.com/karpathy.github.io/assets/rnn/charseq.jpeg

如果该示例可以集成LSTM和其他流行的扩展,那也很酷。

1 个答案:

答案 0 :(得分:1)

在简单的RNN情况下,网络接受输入序列 x 并生成输出序列 y ,而隐藏序列 h 存储网络的动态,使得在时间步长i:x(i)εℝ M ,h(i)εℝ N ,y(i)εℝ P 分别对应于输入,隐藏和输出值的M / N / P维度的实值向量。 RNN根据状态方程改变其状态并省略输出:

  1. h(t)= tanh(W xh * [x(t); h(t-1)]),其中W xh 线性图:ℝ M + N ↦↦ N ,*矩阵乘法和;连接操作。具体地说,为了获得h(t),你将x(t)连接到h(t-1),你应用W xh (形状(M + N,N))和连接之间的矩阵乘法矢量(形状M + N),并在结果矢量(形状N)的每个元素上使用tanh非线性。
  2. y(t)= sigmoid(W hy * h(t)),其中W hy 线性图:ℝ N ↦ ℝ P 。具体地说,在W hy (形状(N,P))和h(t)(形状N)之间应用矩阵乘法以获得P维输出向量,其上sigmoid函数是应用
  3. 换句话说,在时间t获得输出需要迭代i = 0,1,...,t的上述等式。因此,隐藏状态充当系统的有限存储器,允许依赖于上下文的计算(即h(t)完全取决于计算的历史和当前输入,y(t)也是如此。 / p>

    在门控RNN(GRU或LSTM)的情况下,状态方程式更难以遵循,因为门控机制基本上允许在输入和存储器之间进行选择,但核心概念保持不变。

    数字示例

    让我们按照你的榜样;我们有M = 4,N = 3,P = 4,所以W xh 具有形状(7,3)和形状(3,4)的W hy 。我们当然不知道W矩阵的值,所以我们不能重现相同的结果;我们仍然可以按照这个过程。

    • 在时间步t <0时,我们有h(t)= [0,0,0]。
    • 在时间步t = 0时,我们接收输入x(0)= [1,0,0,0]。将x(0)与h(0 - )连接,得到[x(t); h(t-1)] = [1,0,0 ......,0](让我们称这个向量u来简化表示法)。我们应用u * W xh (即将7维向量与7乘3矩阵相乘)并得到向量v = [v 1 ,v 2 ,v 3 ],其中v i j u j W ji = u 1 W 1i + u 2 W 2i + ... + u 7 W 7i 。最后,我们在v上应用tanh,得到h(0)= [tanh(v 1 ),tanh(v 2 ),tanh(v 3 )] = [0.3,-0.1,0.9]。从h(0)我们也可以通过相同的过程得到y(0);将h(0)乘以W hy (即具有3乘4矩阵的3维向量),得到向量s = [s 1 ,s 2 < / sub>,s 3 ,s 4 ],在s上应用sigmoid并得到σ(s)= y(0)。
    • 在时间步t = 1时,我们接收输入x(1​​)= [0,1,0,0]。我们将x(1)与h(0)连接起来得到一个新的u = [0,1,0,0,0.3,-0.1,0.9]。 u再次乘以W xh ,再次对结果应用tanh,得到h(1)= [1,0.3,1]。类似地,h(1)乘以W hy ,给出一个新的s向量,我们在其上应用sigmoid来获得σ(s)= y(1)。
    • 此过程一直持续到输入序列结束,结束计算。

    注意:我忽略了上述等式中的偏差项,因为它们不会影响核心概念,并且它们使符号无法遵循