【发布时间】:2018-02-02 07:15:52
【问题描述】:
背景
我想在 Keras 中对“有状态”LSTM 进行小批量训练。我的输入训练数据位于一个大矩阵“X”中,其维度为 m x n,其中
m = number-of-subsequences
n = number-of-time-steps-per-sequence
X 的每一行都包含一个子序列,该子序列从前一行的子序列离开的地方开始。所以给定一长串数据,
Data = ( t01, t02, t03, ... )
其中“tK”表示原始数据中位置K处的token,序列在X中的布局如下:
X = [
t01 t02 t03 t04
t05 t06 t07 t08
t09 t10 t11 t12
t13 t14 t15 t16
t17 t18 t19 t20
t21 t22 t23 t24
]
问题
我的问题是,当我使用有状态 LSTM 对以这种方式布局的数据进行小批量训练时会发生什么。具体来说,小批量训练通常一次训练“连续”的行组。因此,如果我使用 2 的 mini-batch 大小,那么 X 将被分成三个 mini-batch X1、X2 和 X3,其中
X1 = [
t01 t02 t03 t04
t05 t06 t07 t08
]
X2 = [
t09 t10 t11 t12
t13 t14 t15 t16
]
X3 = [
t17 t18 t19 t20
t21 t22 t23 t25
]
请注意,这种类型的 mini-batching 不适合训练 stateful LSTM,因为通过处理前一批的最后一列产生的隐藏状态不是对应于时间的隐藏状态-在后续批次的第一列之前执行。
要看到这一点,请注意小批量将像这样从左到右进行处理:
------ X1 ------+------- X2 ------+------- X3 -----
t01 t02 t03 t04 | t09 t10 t11 t12 | t17 t18 t19 t20
t05 t06 t07 t08 | t13 t14 t15 t16 | t21 t22 t23 t24
暗示
- Token t04 comes immediately before t09
- Token t08 comes immediately before t13
- Token t12 comes immediately before t17
- Token t16 comes immediately before t21
但我希望小批量对行进行分组,以便我们在小批量之间获得这种时间对齐:
------ X1 ------+------- X2 ------+------- X3 -----
t01 t02 t03 t04 | t05 t06 t07 t08 | t09 t10 t11 t12
t13 t14 t15 t16 | t17 t18 t19 t20 | t21 t22 t23 t24
在 Keras 中训练 LSTM 时完成此任务的标准方法是什么?
感谢您的指点。
【问题讨论】:
标签: tensorflow machine-learning keras theano lstm