涉及序列的任务需要多少个 RNN 单元?
How many RNN units are needed for tasks involving sequences?
我正在针对以下任务训练 RNN:给定一个包含 30 个单词的序列,然后 class 将该序列转换为二进制 class。
我的网络中有超过 30 个单元(LSTM、GRU 或普通 RNN)有好处吗?
我在网上看到很多例子,其中类似的网络是用多层训练的,每个层都有 100 个单元,但这对我来说没有意义。
拥有比序列长度更多的细胞有何帮助? (在我的例子中这个长度是 30)
我很困惑,因为根据我的理解,每个单元接受两个输入
1.序列的新元素
2. 前一个单元格的输出
所以在30个cell之后,将没有新的序列元素输入到cell中。每个单元格将只处理前一个单元格的输出(不接收新信息)。
我正在使用 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)
?
您需要阅读 RNN 方程和 keras documentation。 GRU 初始值设定项的第一个参数是 不是 您正在使用的单元格数量,而是隐藏状态的维数(或者,用 Keras 尴尬的术语, 单位).
使用循环层的全部意义在于,您将通过一遍又一遍地应用相同的函数来折叠您的序列,并且该函数由单个* RNN 单元具体化——如果您的序列中的每一项都是由不同的细胞处理,那里不会有任何复发。
为了让事情更清楚,RNN 实现了一个函数 f: (x,h) → h。你给它你序列的第一项,x0 和一些预先初始化的 h-1,它给你 h0。然后你可以给 same 单元格 x1 和 h0 它会给你 h1,依此类推。现在你正在玩弄的参数只是调整隐藏向量的大小space;你仍然会得到和以前一样多的 h 向量(==你的输入序列长度),但现在这些 h 向量中的每一个都存在于 ℝ250 而不是 ℝ30.
* 在浅层 RNN 的情况下
我正在针对以下任务训练 RNN:给定一个包含 30 个单词的序列,然后 class 将该序列转换为二进制 class。
我的网络中有超过 30 个单元(LSTM、GRU 或普通 RNN)有好处吗? 我在网上看到很多例子,其中类似的网络是用多层训练的,每个层都有 100 个单元,但这对我来说没有意义。 拥有比序列长度更多的细胞有何帮助? (在我的例子中这个长度是 30)
我很困惑,因为根据我的理解,每个单元接受两个输入 1.序列的新元素 2. 前一个单元格的输出 所以在30个cell之后,将没有新的序列元素输入到cell中。每个单元格将只处理前一个单元格的输出(不接收新信息)。
我正在使用 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)
?
您需要阅读 RNN 方程和 keras documentation。 GRU 初始值设定项的第一个参数是 不是 您正在使用的单元格数量,而是隐藏状态的维数(或者,用 Keras 尴尬的术语, 单位).
使用循环层的全部意义在于,您将通过一遍又一遍地应用相同的函数来折叠您的序列,并且该函数由单个* RNN 单元具体化——如果您的序列中的每一项都是由不同的细胞处理,那里不会有任何复发。
为了让事情更清楚,RNN 实现了一个函数 f: (x,h) → h。你给它你序列的第一项,x0 和一些预先初始化的 h-1,它给你 h0。然后你可以给 same 单元格 x1 和 h0 它会给你 h1,依此类推。现在你正在玩弄的参数只是调整隐藏向量的大小space;你仍然会得到和以前一样多的 h 向量(==你的输入序列长度),但现在这些 h 向量中的每一个都存在于 ℝ250 而不是 ℝ30.
* 在浅层 RNN 的情况下