涉及序列的任务需要多少个RNN单元?

时间:2018-12-05 04:12:48

标签: python machine-learning keras nlp rnn

我正在训练RNN进行以下任务:给定一个三十个单词的序列,然后将该序列分类为二进制类。

在我的网络中拥有30个以上的单元(LSTM,GRU或普通RNN)是否有好处? 我在网上看到了很多例子,其中相似的网络经过多层训练,每层有100个单元,但这对我来说没有意义。 比序列的长度有更多的单元格有什么帮助? (在我的情况下,该长度为30)

我很困惑,因为根据我的理解,每个单元格都接受两个输入 1.序列的新元素 2.上一个单元格的输出 因此,在30个单元格之后,将没有新的序列元素要输入到该单元格中。每个单元格将只处理前一个单元格的输出(不接收任何新信息)。

我正在为此任务使用LSTM单元(但是,我猜测所使用的RNN单元的实际类型无关紧要)。

当GRU单位与我的序列长度相同时

visible = Input(shape=(30,))
print(np.shape(visible ))
embed=Embedding(vocab_size,2)(visible)
print(np.shape(embed ))
x2=keras.layers.GRU(30, return_sequences=True)(embed)
print(np.shape(x2))

形状:

(?, 30)

(?, 30, 2)

(?, ?, 30)

当GRU单位与我的序列长度不同时

visible = Input(shape=(30,))
print(np.shape(visible ))
embed=Embedding(vocab_size,2)(visible)
print(np.shape(embed ))
x2=keras.layers.GRU(250, return_sequences=True)(embed)
print(np.shape(x2))

形状:

(?, 30)

(?, 30, 2)

(?, ?, 250)

形状如何从(?, 30, 2)变为(?, ?, 250)或什至(?, ?, 30)

1 个答案:

答案 0 :(得分:1)

您需要阅读RNN方程和keras documentation。 GRU初始值设定项的第一个参数是不是您正在使用的单元格数量,而是隐藏状态的维数(或者,在Keras的笨拙术语中, units >)。

使用循环图层的全部要点是,您将一遍又一遍地应用相同的功能来折叠序列,并且该功能由单个* RNN单元实现-如果序列的每个项目都由一个不同的单元格,那里就不会有重复发生。

为了使事情更清楚,RNN实现了一个函数f:(x,h)→h。您给它序列的第一项x 0 和一些预初始化的h -1 ,它又给您h 0 。然后,您可以给相同单元格x 1 和h 0 ,它会给您h 1 ,依此类推等等。现在,您要玩弄的参数只需调整隐藏向量空间的大小即可。您仍然会获得与之前相同的h个向量(==输入序列长度),但是现在,这些h个向量中的每一个都生活在ℝ 250 而不是ℝ 30

*对于浅层RNN