具有顺序数据和单标签的 RNN/ANN 的正确输出标签

数据挖掘 神经网络
2021-10-13 04:23:14

我有一个标记的时间序列数据集;例如,来自 kk 个传感器的连续输入长度 nn 对应于类“1”(见下文 n=50,k=2n=50,k=2)。如何正确分类?

如果我使用无限输入长度的 RNN,输入层将有 2 个单元(2 个通道),但是输出呢?标签“1”适用于整个序列,而不仅仅是单个输入。

因此,有两个相关的问题:1)我如何设计一个输出单元?它必须反映完整序列的输入,2)我如何计算错误?它还需要考虑整个序列的错误。

如果我将 ANN 与滑动窗口一起使用,问题实际上仍然相同 - 不同的类在窗口中可以具有可比较的值,因此输出必须对应于完整序列。

换句话说,我如何将时间序列与 1 个数字相匹配?

编辑:

例如,有一个 n×ķ 标记为“1”的数组(这可以是例如读数关闭 n 传感器,匹配 1 个类,如手势:'snap')和另一个 ×j 标记为“0”的数组,其中 n 是特征/输入神经元的数量和 ķj是输入数据的长度/大小。如果我使用 RNN 前馈第一个数组,我会这样做ķ次,显然。但是我如何标记它?我是否使用单位向量长度ķ,每次都会出现错误,然后平均得出样本错误和反向传播?我不这么认为,但不太确定。

在此处输入图像描述

1个回答

循环神经网络可以学习序列之间非常复杂的映射(与前馈网络不同,前馈网络只能转换固定大小的向量)。你真的只需要一个 RNN,它采用以下形式的序列(一个,b)作为输入(假设{1...}你有序列。一个b两者都有样本,您必须将这些信号分类为ķ类)。然后,您可以为采样运行以下过程(伪代码)(给定已训练的模型):

for t in (1..T)           //loop over an input sequence
    rnn.input[0] = a[t]   //assign t-th point of the blue seq.
    rnn.input[1] = b[t]   //assign t-th point of the green seq.
    rnn.forward()         //make forward pass
rnn.output.normalize()    //renormalize output probabilities
class_prob = rnn.output.max()
class      = rnn.output.argmax()

例如,我们有以下长度为 4 的序列:
信号 A: {1, 3, 4, 6}
信号 B: {4, 3, 0, 1}
然后在第一个时间步中我们分配向量(1,4) 到输入层,然后 (3,3)等等。在每个时间步,我们将输入向前传播到网络,更新其隐藏状态,该隐藏状态负责记住过去的数据点。在每次前向传递之后,我们的神经网络会在输出层生成一个预测,这暂时不重要。这种波动的预测反映了 rnn 对我们数据集部分的信念——它只见过第一个输入向量。在我们传播了整个信号之后,我们可以进行分类。
你的 RNN 的输出层应该是ķ维及其一世-th 分量是信号蜂在类中的伪概率一世. 例如,您可以执行 argmax(采用预测最大的索引)或使用 softmax 分布进行采样。例如,如果你有课一个和班级b你的输出向量是(5,15)那么你的信号被归类为b. 或者如果你做softmax然后sF一个X(5,15)=(0.000045,0.999955)所以你分配班级b几乎100%的概率。
训练 RNN 要复杂得多。我建议你使用一些现有的工具包,这些工具包已经实现了 RNN,例如 LSTM。为了训练递归神经网络,我们可以应用上述过程,但最后(在迭代序列之后)我们计算损失函数的梯度并进行反向传播。然而这种技术被称为时间反向传播(它实际上类似于普通的 FFN 反向传播,但我们必须及时“展开”出 RNN 以调整循环连接)。另请注意,如果您选择使用 softmax 输出单元,您的损失函数应该是交叉熵损失函数。
但是计算梯度损失的预期输出向量是什么?如果您的数据集包含ñ (绿-蓝)序列中的每一个 ķn 类,那么他们的预期输出向量就是 one-hot 向量 (0...,1,...0) 在哪里 1 位于 ķn仅 -th 组件。例如,如果您有一个序列分类为b,则其输出向量目标为 (0,1). @EDIT:假设在前面的例子中你的序列有类b 所以你希望看到向量 (0,1). 你现在接受网络的预测(比如说(0.34,0.57)) 并将误差函数计算为正常的 fe 平方误差或交叉熵。

您可以从karpathyHinton了解更多信息