rmc*_*701 7 python machine-learning lstm keras tensorflow
假设我有一个整数序列:
0,1,2, ..
并希望根据给定的最后3个整数来预测下一个整数,例如:
[0,1,2]->5,[3,4,5]->6等
假设我像这样设置模型:
batch_size=1
time_steps=3
model = Sequential()
model.add(LSTM(4, batch_input_shape=(batch_size, time_steps, 1), stateful=True))
model.add(Dense(1))
Run Code Online (Sandbox Code Playgroud)
据我了解,模型具有以下结构(请原图):
第一个问题:我的理解正确吗?
请注意,我已经画出了C_{t-1}, h_{t-1}进入图片的先前状态,因为指定时会暴露出来stateful=True。在这个简单的“下一个整数预测”问题中,应通过提供此额外的信息来改善性能(只要先前的状态是由前三个整数产生的)。
这使我想到了一个主要问题: 似乎标准做法(例如,参见此博客文章和TimeseriesGenerator keras预处理实用程序)是在训练过程中向模型提供一组交错的输入。
例如:
batch0: [[0, 1, 2]]
batch1: [[1, 2, 3]]
batch2: [[2, 3, 4]]
etc
Run Code Online (Sandbox Code Playgroud)
这让我感到困惑,因为这似乎需要第一Lstm单元的输出(对应于第一时间步长)。看这个图:

从tensorflow docs:
stateful:布尔值(默认为False)。如果为True,则批次中索引i的每个样本的最后状态将用作下一个批次中索引i的样本的初始状态。
似乎此“内部”状态不可用,并且所有可用状态都是最终状态。看这个图:

因此,如果我的理解是正确的(显然不是这样),那么在使用时是否不应该将不重叠的样本窗口馈送到模型中stateful=True?例如:
batch0: [[0, 1, 2]]
batch1: [[3, 4, 5]]
batch2: [[6, 7, 8]]
etc
Run Code Online (Sandbox Code Playgroud)
答案是:取决于眼前的问题。对于单步预测的情况-是的,可以,但是不必这样做。但是,无论您是否这样做,都会对学习产生重大影响。
批处理与示例机制(“参见AI” =参见“其他信息”部分)
所有模型都将样本视为独立的例子;一批32个样品就像一次32个样品(有差异-参见AI)。从模型的角度来看,数据分为批处理维度batch_shape[0]和要素维度batch_shape[1:]-两个“不要说话”。两者之间的唯一关系是通过渐变(请参见AI)。
重叠与非重叠批处理
理解它的最佳方法也许是基于信息的。我将从时间序列二进制分类开始,然后将其与预测联系起来:假设您有10分钟的EEG记录,每个记录有240000个时间步长。任务:癫痫发作还是非癫痫发作?
取10个样本,定形(240000, 1)。怎么喂?
(10, 54000, 1),包括所有样品,切片为sample[0:54000]; sample[54000:108000]...(10, 54000, 1),包括所有样品,切片为sample[0:54000]; sample[1:54001]...您选择上述两个中的哪一个?如果为(2),则您的神经网络将不会混淆这10个样本的非癫痫发作。但这对其他任何样本也一无所知。即,它将极大地过度拟合,因为在每次迭代中看到的信息几乎没有差异(1/54000 = 0.0019%)-因此,您基本上是连续多次向同一批物料中饲喂。现在假设(3):
(10, 54000, 1),包括所有样品,切片为sample[0:54000]; sample[24000:81000]...更合理;现在我们的窗户有50%的重叠,而不是99.998%。
预测:重叠不好吗?
如果您要进行单步预测,则信息格局现在已更改:
这会极大地改变您的损失函数,以及将其最小化的“好的做法”:
我该怎么办?
首先,请确保您了解整篇文章,因为这里没有什么是真正的“可选”。然后,这是每批重叠与不重叠的关键:
您的目标:平衡两者;1在2上的主要优势是:
我应该在预测中使用(2)吗?
LSTM有状态:实际上可能对您的问题完全没有用。
当LSTM不能一次处理整个序列时,即“分裂”状态,或者当反向传播需要不同的梯度时,可以使用有状态。对于前者,想法是-LSTM在评估后者时会考虑前者的顺序:
t0=seq[0:50]; t1=seq[50:100]说得通; t0逻辑上导致t1seq[0:50] --> seq[1:51]没有意义; t1不是因果关系t0换句话说:不要在有状态的批次中重叠。相同的批次可以,独立的也可以-样本之间没有“状态”。
何时使用有状态:何时LSTM在评估下一个时受益于前一个批次。这可以包括一步预测,但前提是您不能一次输入整个序列:
t0, t1按照上面的第一个项目符号进行设置。lr = 0。LSTM何时以及如何在有状态的情况下“通过状态”?
stateful=True 需要你指定batch_shape,而不是input_shape-因为,Keras建立batch_size了LSTM的独立的国家在编制根据以上情况,您不能执行以下操作:
# sampleNM = sample N at timestep(s) M
batch1 = [sample10, sample20, sample30, sample40]
batch2 = [sample21, sample41, sample11, sample31]
Run Code Online (Sandbox Code Playgroud)
这暗示了21因果关系10-将破坏培训。而是:
batch1 = [sample10, sample20, sample30, sample40]
batch2 = [sample11, sample21, sample31, sample41]
Run Code Online (Sandbox Code Playgroud)
批次与样本:其他信息
“批”是一组样本-1个或更多(假定对于该答案总是为后者)。三种迭代数据的方法:批量梯度下降(一次整个数据集),随机GD(一次一个样本)和Minibatch GD(中间)。(但是,在实践中,我们也称最后一个SGD,并且仅区分vs BGD-对此答案假设如此。)差异:
奖金图:

