一个热编码维度——模型复杂性
One Hot Encoding dimension - Model Compexity
我会解释我的问题:
- 我有大约 50.000 个样本,每个样本都由代表 "events"
的代码列表描述
- 唯一码数量在800左右。
- 一个样本最多可以有 600 个代码。
我想使用单热编码来表示每个样本。如果我们考虑对那些代码较少的样本进行填充操作,表示应该是一个 800x600 矩阵。
将这个新表示作为网络的输入,意味着将每个矩阵展平为大小为 800x600(460.000 个值)的向量。
最后,数据集应包含 50.000 个大小为 460.000 的向量。
现在,我有两个考虑:
- 如何处理这么大的数据集?(我试过数据生成器来即时获取表示,但它们真的很慢)。
- 将大小为 460.000 的向量作为每个样本的输入,这意味着我的模型的复杂性(要学习的参数数量)非常高(在我的例子中约为 15.000.000),因此,我需要一个巨大的数据集来正确训练模型。不是吗?
为什么不使用NLP中使用的常规模型?
这些事件可以通过嵌入矩阵按你说的翻译。
然后您可以使用 LSTM(或 GRU 或 RNN o Bilateral LSTM)表示事件链,使用 LSTM 而不是传统网络的区别在于您使用相同的模块重复 N 次。
所以你的输入实际上不是 460,000,但在内部事件 A 间接帮助你了解事件 B。那是因为 LSTM 有一个模块,可以为链中的每个事件重复自身。
这里有一个例子:
https://www.kaggle.com/ngyptr/lstm-sentiment-analysis-keras
从广义上讲,我会做以下事情(在 Keras 伪代码中):
- 检测总事件数。我生成一个唯一列表。
unique_events = list (set ([event_0, ..., event_n]))
You can perform the translation of a sequence with:
seq_events_idx = map (unique_events.index, seq_events)
- 为每个序列添加必要的填充:
sequences_pad = pad_sequences (sequences, max_seq)
- 然后你可以直接使用一个embedding将事件转移到你考虑的维度的关联向量上。
input_ = Input (shape = (max_seq,), dtype = 'int32')
embedding = Embedding (len(unique_events),
dimensions,
input_length = max_seq,
trainable = True) (input_)
- 然后定义 LSTM 的架构(例如):
lstm = LSTM (128, input_shape = (max_seq, dimensions), dropout = 0.2, recurrent_dropout = 0.2, return_sequences = True) (embedding)
- 添加密集度和您想要的结果:
out = Dense (10, activation = 'softmax') (lstm)
我认为这种类型的模型可以帮助您并提供更好的结果。
我会解释我的问题:
- 我有大约 50.000 个样本,每个样本都由代表 "events" 的代码列表描述
- 唯一码数量在800左右。
- 一个样本最多可以有 600 个代码。
我想使用单热编码来表示每个样本。如果我们考虑对那些代码较少的样本进行填充操作,表示应该是一个 800x600 矩阵。
将这个新表示作为网络的输入,意味着将每个矩阵展平为大小为 800x600(460.000 个值)的向量。
最后,数据集应包含 50.000 个大小为 460.000 的向量。
现在,我有两个考虑:
- 如何处理这么大的数据集?(我试过数据生成器来即时获取表示,但它们真的很慢)。
- 将大小为 460.000 的向量作为每个样本的输入,这意味着我的模型的复杂性(要学习的参数数量)非常高(在我的例子中约为 15.000.000),因此,我需要一个巨大的数据集来正确训练模型。不是吗?
为什么不使用NLP中使用的常规模型?
这些事件可以通过嵌入矩阵按你说的翻译。 然后您可以使用 LSTM(或 GRU 或 RNN o Bilateral LSTM)表示事件链,使用 LSTM 而不是传统网络的区别在于您使用相同的模块重复 N 次。 所以你的输入实际上不是 460,000,但在内部事件 A 间接帮助你了解事件 B。那是因为 LSTM 有一个模块,可以为链中的每个事件重复自身。
这里有一个例子: https://www.kaggle.com/ngyptr/lstm-sentiment-analysis-keras
从广义上讲,我会做以下事情(在 Keras 伪代码中):
- 检测总事件数。我生成一个唯一列表。
unique_events = list (set ([event_0, ..., event_n])) You can perform the translation of a sequence with: seq_events_idx = map (unique_events.index, seq_events)
- 为每个序列添加必要的填充:
sequences_pad = pad_sequences (sequences, max_seq)
- 然后你可以直接使用一个embedding将事件转移到你考虑的维度的关联向量上。
input_ = Input (shape = (max_seq,), dtype = 'int32') embedding = Embedding (len(unique_events), dimensions, input_length = max_seq, trainable = True) (input_)
- 然后定义 LSTM 的架构(例如):
lstm = LSTM (128, input_shape = (max_seq, dimensions), dropout = 0.2, recurrent_dropout = 0.2, return_sequences = True) (embedding)
- 添加密集度和您想要的结果:
out = Dense (10, activation = 'softmax') (lstm)
我认为这种类型的模型可以帮助您并提供更好的结果。