【发布时间】:2017-11-12 06:23:39
【问题描述】:
我正在尝试将 word2Vec 和 LSTM 应用于包含文件的 API 跟踪日志的数据集,其中包括 API 函数调用及其用于二进制分类的参数。
数据如下:
File_ID, Label, API Trace log
1, M, kernel32 LoadLibraryA kernel32.dll
kernel32 GetProcAddress MZ\x90 ExitProcess
...
2, V, kernel32 GetModuleHandleA RPCRT4.dll
kernel32 GetCurrentThreadId d\x8B\x0D0 POINTER POINTER
...
API 跟踪包括:模块名称、API 函数名称、参数(以空格分隔)
以文件1的第一个API trace为例,kernel32是模块名,LoadLibraryA是函数名,kernel32.dll是参数。每个 API 跟踪由 \n 分隔,以便每一行依次表示一个 API 序列信息。
首先,我根据所有 API 跟踪日志的行句训练了一个 word2vec 模型。大约有 5k 个 API 函数调用,例如LoadLibraryA,GetProcAddress。但是,由于参数值可能会有所不同,因此在包含这些参数后,模型会变得非常大(有 300,000 个词汇表)。
之后,我通过应用 word2vec 的 embedding_wrights 训练了一个 LSTM,模型结构如下:
model = Sequential()
model.add(Embedding(output_dim=vocab_dim, input_dim=n_symbols, \
mask_zero=False, weights=[embedding_weights], \
trainable=False))
model.add(LSTM(dense_dim,kernel_initializer='he_normal', dropout=0.15,
recurrent_dropout=0.15, implementation=2))
model.add(Dropout(0.3))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=batch_size, callbacks=[early_stopping, parallel_check_cb])
我得到 embedding_weights 的方法是创建一个矩阵,为 word2vec 模型中的每个词汇表,将模型中单词的索引映射到它的向量
def create_embedding_weights(model, max_index=0):
# dimensionality of your word vectors
num_features = len(model[model.vocab.keys()[0]])
n_symbols = len(model.vocab) + 1 # adding 1 to account for 0th index (for masking)
# Only word2vec feature set
embedding_weights = np.zeros((max(n_symbols + 1, max_index + 1), num_features))
for word, value in model.vocab.items():
embedding_weights[value.index, :] = model[word]
return embedding_weights
对于训练数据,我做的是对API调用中的每个单词,将实际单词转换为word2vec模型的索引,使其与上面embedding_weights中的索引一致。 e.g. kernel32 -> 0, LoadLibraryA -> 1, kernel32.dll -> 2. GetProcAddress -> 4, MZ\x90 -> 5, ExitProcess ->6
所以文件 1 的训练数据看起来像 [0, 1, 2, 3, 4, 5, 6]。请注意,我没有为每个 API 跟踪进行行拆分。结果,模型可能不知道 API 跟踪的起点和终点在哪里?而且模型的训练准确率很差——准确率为 50% :(
我的问题是,在准备训练和验证数据集时,在将实际单词映射到其索引时,我是否也应该分行?然后将上面的训练数据更改为以下,每个 API 跟踪由一行分隔,并且可能将缺失值填充到 word2vec 索引中不存在的 -1。
[[0, 1, 2, -1]
[3, 4, 5, 6]]
同时我使用一个非常简单的结构进行训练,而 word2vec 模型相当大,任何关于结构的建议也将不胜感激。
【问题讨论】:
-
@Marcin Możejko,你能帮我开绿灯吗?提前致谢。
标签: tensorflow deep-learning keras lstm word2vec