使用 RNN/LSTM 检测速度变化(给定当前 xy 位置)
Posted
技术标签:
【中文标题】使用 RNN/LSTM 检测速度变化(给定当前 xy 位置)【英文标题】:Detecting changes in speed (given current xy position) with RNNs/LSTMs 【发布时间】:2020-05-08 19:33:37 【问题描述】:在给定连续数据的 x,y 坐标的情况下,我将如何使用 RNN/LSTM 来学习速度变化? (我必须使用循环层,因为这是一个更大的端到端模型的子问题,它也可以做其他事情)
训练数据示例:
x,y,speed_changed
0,0,0
0,0.1,0
0,0.2,0
0,0.3,0
0,0.5,1
0,0.6,0
0,0.7,0
...
到目前为止,我构建了有状态 LSTM,并在每批一个项目上对其进行训练。之后,每次速度发生变化时,我都会重置 LSTM 的状态,因此我了解到一个段具有相同的速度(段可以有不同的长度)。
由于段的长度不同,我该如何在生产中使用这种模型?
或者有没有更好的方法来训练此类数据的循环网络?也许是异常检测? (我想避免固定的批量大小(例如 3 帧的窗口))
【问题讨论】:
这很简单,根本不需要任何神经网络。你有什么理由特别想用 RNN 来做这件事吗?这是一个真正的问题,还是一个学习练习?当您需要回忆时间上遥远的信息时,通常会使用 LSTM,因此我个人认为在这里使用它们没什么意义。即使您想使用神经网络(有效地学习毕达哥拉斯定理...),如果您可以使用衍生特征,例如 x 和 y 的平方,学习速度也会大大加快 另外,你为什么不想使用固定窗口呢?它似乎非常适合这个问题,因为您正在寻找瞬时速度的变化 @goncalopp 这个特性应该是多标签模型的一部分,每个标签都关注时间数据的不同部分,并进行分类或预测。速度变化是商业项目的要求。我知道如何在网络之外做到这一点,但该项目是关于端到端的学习 @Boris Mocialov,如果您知道如何在网络之外执行此操作,为什么不简单地将这个额外的计算列添加到您的数据集中,并将该列用作另一个列的输入你的模型的一部分?正如 goncalopp 所写,学习可以直接计算的值没有多大意义,除非它是一个示例或 excersize。 @isp-zax 必须在网络中的原因是端到端学习 【参考方案1】:RNN 和 LSTM 的结构不会让你直接做,这就是为什么 - RNN 的激活函数是: h(t) = Tanh(W * h(t-1) + U * x(t) + 偏差) 请注意,W、U 和偏差都是相同的——无论您为 RNN 使用多少时间框架。因此,给定一些 X 向量,输出将是 p1*X1+p2*X2 的函数,依此类推,在您的示例中 X1 是 X,X2 是 Y。
但是 - 要检测速度变化 - 您需要进行不同的计算。速度的变化表明在时间框架 1 和 2 之间以及时间框架 2 和 3 之间行驶了不同的距离。 行驶距离为 SQRT((X1(t)-X1(t-1))^2 + (X2(t)-X2(t-1))^2)。 这意味着您需要一个以某种方式考虑 X1*X1 的激活函数——这在 RNN 或 LSTM 中是不可能的。
但是,您可以通过使用计算在最新时间范围内传递的距离的自定义激活函数间接实现您的需要。看看this link。通过使用您的自定义激活函数,您可以插入 X1(t)、X2(t)、X1(t-1)、X2(t-1) 的向量并计算距离 D。在 t=1 时,您可以使用 0如 X1(t=0) 和 X2(t=0)。
您的自定义激活函数应类似于 D = (X1(t) - X1(t-1))^2 + (X2(t)-X2(t-1))^2。这样 - 如果时间帧之间的速度相同,您将为 RNN 提供恒定的 D 值,因此您希望 RNN 实现的权重将模拟 D(t) - D(t-1) 的函数。
【讨论】:
以上是关于使用 RNN/LSTM 检测速度变化(给定当前 xy 位置)的主要内容,如果未能解决你的问题,请参考以下文章