首页 > 解决方案 > 涉及序列的任务需要多少个 RNN 单元?

问题描述

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

在我的网络中拥有超过 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)to(?, ?, 250)或 to (?, ?, 30)even 变化?

标签: pythonmachine-learningkerasnlprnn

解决方案


您需要阅读 RNN 方程和keras 文档。GRU 初始化器的第一个参数不是您正在使用的单元格的数量,而是隐藏状态的维度(或者,在 Keras 的尴尬术语中,单位)。

使用循环层的全部意义在于,您将通过一遍又一遍地应用相同的函数来折叠序列,并且该函数由单个 * RNN 单元实现——如果序列的每个项目都由不同的单元处理,那里不会有任何复发。

为了让事情更清楚,RNN 实现了一个函数 f: (x,h) → h。你给它你序列的第一项, x 0和一些预初始化的 h -1,它给你返回 h 0。然后,您可以给相同的单元格 x 1和 h 0,它会给您 h 1,依此类推。现在你正在玩弄的参数只是调整隐藏向量空间的大小;你仍然会得到和以前一样多的 h 向量(== 你的输入序列长度),但是现在这些 h 向量中的每一个都存在于 ℝ<sup>250 而不是 ℝ<sup>30 中。

* 在浅 RNN 的情况下


推荐阅读