Predicting Domain Generation Algorithms with Long Short-Term Memory Networks

Predicting Domain Generation Algorithms with Long Short-Term Memory Networks 解读

RNN模型

1.为什么会有RNN模型

RNN称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。CNN对于简单的猫,狗,手写数字等单个物体的识别具有较好的效果. 但是, 对于一些与时间先后有关的, 比如视频的下一时刻的预测,文档前后文内容的预测等, 这些算法的表现就不尽如人意了.因此, RNN就应运而生了.

2.RNN模型

在这里插入图片描述

隐藏层的具体细节

在这里插入图片描述
a ⟨ 0 ⟩ a^{\langle0\rangle} a0是激活值,通常是零向量,在 t 时刻,
a ⟨ t ⟩ = g 1 ( W a a a ⟨ t − 1 ⟩ + W a x x ⟨ t ⟩ + b a ) y ^ ⟨ t ⟩ = g 2 ( W y a a ⟨ t ⟩ + b y ) a^{\langle t \rangle} = g_1(W_{aa}a^{\langle t-1 \rangle} + W_{ax}x^{\langle t \rangle}+ b_a) \\ \hat{y}^{\langle t \rangle} = g_2(W_{ya}a^{\langle t \rangle} + by) at=g1(Waaat1+Waxxt+ba)y^t=g2(Wyaat+by)
上面的等式定义了神经网络的向前传播,从 a ⟨ 0 ⟩ a^{\langle 0 \rangle} a0开始,用 a ⟨ 0 ⟩ a^{\langle 0 \rangle} a0 x ⟨ 1 ⟩ x^{\langle 1 \rangle} x1 计算 a ⟨ 1 ⟩ a^{\langle 1 \rangle} a1 y ^ ⟨ 0 ⟩ \hat{y}^{\langle 0 \rangle} y^0 x ⟨ 2 ⟩ x^{\langle 2 \rangle} x2 a ⟨ 1 ⟩ a^{\langle 1 \rangle} a1 计算 a ⟨ 2 ⟩ a^{\langle 2 \rangle} a2 y ^ ⟨ 2 ⟩ \hat{y}^{\langle 2 \rangle} y^2 等等,循环神经网络从左向右传播,同时每个时间步的参数也是共享的。

LSTM

长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题
举个例子
假如你需要训练一个语言模型,假如看到这句子 “The cat, which already ate ……, was full.”,前后应该保持一致,因为cat是单数,所以应该用was。“The cats, which ate ……, were full.” cats是复数,所以用were。这个句子有长期的依赖,最前面的单词对句子后面的单词有影响。你的RNN模型要做的就是根据cat来判断改用was还是were 。如果你的RNN的隐藏层有100层,甚至更多,如果要通过was所在的隐藏层通过梯度下降把误差反向传导到cat,就可能存在梯度消失的问题,很难影响到cat所在层的计算。
在这里插入图片描述

  1. 忘记阶段。这个阶段主要是对上一个节点传进来的输入进行选择性忘记。简单来说就是会 “忘记不重要的,记住重要的”。
  2. 选择记忆阶段。这个阶段将这个阶段的输入有选择性地进行“记忆”。主要是会对输入进行选择记忆。哪些重要则着重记录下来,哪些不重要,则少记一些。
  3. 输出阶段。这个阶段将决定哪些将会被当成当前状态的输出。

文章使用的模型结构

在这里插入图片描述
Ⅰ. embedding layer (嵌入层)
嵌入层的作用就是将输入字符序列从输入域 S ⊂ Z l \mathcal{S} \subset \mathcal{Z^l} SZl 映射为向量 R d × l \mathcal{R^{d \times l}} Rd×l,其中 l l l 是由训练集确定的一个上限长度, d d d是嵌入层的输出维度,是一个可变参数
Ⅱ. LSTM layer
LSTM layer 的作用就是隐式特征提取,不同于手动提取特征,而是通过LSTM模型学习输入数据的字符模式。
Ⅲ. logistic regression
用LSTM layer 学习到的隐式特征训练logistic 分类器

机器学习中的Dropout

1. Dropout简介

1.1 Dropout出现的原因
在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。
Dropout可以比较有效的缓解过拟合的发生,在一定程度上达到正则化的效果。
1.2 Dropout工作流程及使用
对于一个神经网络如图所示
在这里插入图片描述
包含输入层、隐藏层、和输出层,dropout是在隐藏层做出修改
神经网络学习的正常的流程是:我们首先把输入数据通过网络前向传播,然后把误差反向传播以决定如何更新参数让网络进行学习。
使用Dropout后,流程如下:
1)首先随机(临时)删掉网络中1-p的隐藏神经元,输入输出神经元保持不变(途中虚线部分就是临时被删除的神经元)
在这里插入图片描述
2) 然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数。

3)然后继续重复这一过程:

恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新)
从隐藏层神经元中随机选择一个一半大小的子集临时删除掉(备份被删除神经元的参数)。
对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b) (没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。
不断重复这一过程。
1)在训练模型阶段
无可避免的,在训练网络的每个单元都要添加一道概率流程
在这里插入图片描述
对应的公式变化如下:
.没有Dropout的网络计算公式:
在这里插入图片描述
采用Dropout的网络计算公式:
在这里插入图片描述
其中 r ( l ) \textbf r^{(l)} r(l) 表示一个由多个独立的服从相同伯努利分布的变量构成的向量, ∗ * 表示点乘,即对应元素相乘,第 l l l层的输出 y ( l ) \textbf y^{(l)} y(l)经过dropout变为 y ~ ( l ) \widetilde {\textbf y}^{(l)} y (l) l + 1 l + 1 l+1层的输入和输出算法不变。在应用BP进行训练时,只对子网络的参数求导即可。

  1. 在测试阶段中

预测模型的时候,每一个神经单元的权重参数要乘以概率p。
在这里插入图片描述
测试时子网络的参数需要被缩放: W t e s t ( l ) = p W ( l ) W^{(l)}_{test}=pW^{(l)} Wtest(l)=pW(l)

为什么测试的时候还需要乘以 p p p呢?
因为我们训练的时候会随机的丢弃一些神经元,但是预测的时候就没办法随机丢弃了。如果丢弃一些神经元,这会带来结果不稳定的问题,也就是给定一个测试数据,有时候输出a有时候输出b,结果不稳定,这是实际系统不能接受的,用户可能认为模型预测不准。那么一种”补偿“的方案就是每个神经元的权重都乘以一个p,这样在“总体上”使得测试数据和训练数据是大致一样的。比如一个神经元的输出是x,那么在训练的时候它有p的概率参与训练,(1-p)的概率丢弃,那么它输出的期望是px+(1-p)0=px。因此测试的时候把这个神经元的权重乘以p可以得到同样的期望。
不过很多算法通常采用inverted dropout。当模型使用了dropout layer,训练的时候只有占比为 p p p的隐藏层单元参与训练,那么在预测的时候,如果所有的隐藏层单元都需要参与进来,则得到的结果相比训练时平均要大 1 p \frac{1}{p} p1,为了避免这种情况,就需要测试的时候将输出结果乘以 p p p使下一层的输入规模保持不变。
而利用inverted dropout,我们可以在训练的时候直接将dropout后留下的权重扩大 p p p倍,这样就可以使结果的scale保持不变,而在预测的时候也不用做额外的操作了,更方便一些。

Embedding(词嵌入)

词汇表征(Word Representation)

自然语言处理(NLP)的过程中往往是使用one-hot编码来表示一个词,假设我们的字典里面有10000个词,比如如果man(下图编号1所示)在词典里是第5391个,那么就可以表示成一个向量,只在第5391处为1(下图编号2所示),我们用 O 5391 O_{5391} O5391代表这个量,这里的代表one-hot。接下来,如果woman是编号9853(上图编号3所示),那么就可以用 O 9853 O_{9853} O9853来表示,这个向量只在9853处为1(上图编号4所示),其他为0,其他的词king、queen、apple、orange都可以这样表示出来这种表示方法的一大缺点就是它把每个词孤立起来,这样使得算法对相关词的泛化能力不强。
在这里插入图片描述
  举个例子,假如你已经学习到了一个语言模型,当你看到“I want a glass of orange ___”,那么下一个词会是什么?很可能是juice。即使你的学习算法已经学到了“I want a glass of orange juice”这样一个很可能的句子,但如果看到“I want a glass of apple ___”,因为算法不知道apple和orange的关系很接近,就像man和woman,king和queen一样。所以算法很难从已经知道的orange juice是一个常见的东西,而明白apple juice也是很常见的东西或者说常见的句子。这是因为任何两个one-hot向量的内积都是0,如果你取两个向量,比如king和queen,然后计算它们的内积,结果就是0。如果用apple和orange来计算它们的内积,结果也是0。很难区分它们之间的差别,因为这些向量内积都是一样的,所以无法知道apple和orange要比king和orange,或者queen和orange相似地多。
  换一种表示方式会更好,如果我们不用one-hot表示,而是用特征化的表示来表示每个词,man,woman,king,queen,apple,orange或者词典里的任何一个单词,我们学习这些词的特征或者数值。
在这里插入图片描述
  举个例子,对于这些词,比如我们想知道这些词与Gender(性别)的关系。假定男性的性别为-1,女性的性别为+1,那么man的性别值可能就是-1,而woman就是-1。最终根据经验king就是-0.95,queen是+0.97,apple和orange没有性别可言,所以他们的特征为0.00和0.01。
  所以你可以想很多的特征,为了说明,我们假设有300个不同的特征,这样的话你就有了这一列数字(上图编号1所示),这里我只写了4个,实际上是300个数字,这样就组成了一个300维的向量来表示man这个词。接下来,我想用这个符号来表示,就像这样(上图编号2所示)。同样这个300维的向量,我用代表这个300维的向量用来表示woman这个词(上图编号3所示),这些其他的例子也一样。

嵌入矩阵(Embadding Matrix)

  特征矩阵表示可以很好的在词与词之间建立联系,那么如何来得到这样的一个特征矩阵呢,?
  和之前一样,假设我们的词汇表含有10,000个单词,词汇表里有a,aaron,orange,zulu。我们要做的就是学习一个嵌入矩阵,它将是一个300×10,000的矩阵。这个矩阵的各列代表的是词汇表中10,000个不同的单词所代表的不同向量。假设orange的单词编号是6257(下图编号1所示),代表词汇表中第6257个单词,我们用符号 O 6257 O_{6257} O6257来表示这个one-hot向量,这个向量除了第6527个位置上是1(下图编号2所示),其余各处都为0,显然它是一个10,000维的列向量,它只在一个位置上有1,它不像图上画的那么短,它的高度应该和左边的嵌入矩阵的宽度相等。
在这里插入图片描述
  假设这个嵌入矩阵叫做 E E E矩阵,注意如果用 E E E去乘以右边的one-hot向量(上图编号3所示),也就是 O 6257 O_{6257} O6257,那么就会得到一个300维的向量, E E E是300×10,000的, O 6257 O_{6257} O6257是10,000×1的,所以它们的积是300×1的,即300维的向量。要计算这个向量的第一个元素,你需要做的是把 E E E的第一行(上图编号4所示)和 O 6257 O_{6257} O6257的整列相乘,不过的所有元素都是0,只有6257位置上是1,最后你得到的这个向量的第一个元素(上图编号5所示)就是orange这一列下的数字(上图编号6所示)。然后我们要计算这个向量的第二个元素,就是把 E E E的第二行(上图编号7所示)和这个相乘,和之前一样,然后得到第二个元素(上图编号8所示),以此类推,直到你得到这个向量剩下的所有元素(上图编号9所示)。
  这就是为什么把矩阵和这个one-hot向量相乘,最后得到的其实就是这个300维的列,就是单词orange下的这一列,它等于 e 6257 e_{6257} e6257,这个符号是我们用来表示这个300×1的嵌入向量的符号,它表示的单词是orange。

学习词嵌入(Learning Word Embaddings)

  学习词嵌入通常是通过一个神经网络模型来学习得到的,这里介绍Word2Vec 中的Skip-Gram 模型。Word2Vec是从大量文本语料中以无监督的方式学习语义知识的一种模型,它被大量地用在自然语言处理(NLP)中。那么它是如何帮助我们做自然语言处理呢?Word2Vec其实就是通过学习文本来用词向量的方式表征词的语义信息,即通过一个嵌入空间使得语义上相似的单词在该空间内距离很近。Embedding其实就是一个映射,将单词从原先所属的空间映射到新的多维空间中,也就是把原先词所在空间嵌入到一个新的空间中去。
  我们从直观角度上来理解一下,cat这个单词和kitten属于语义上很相近的词,而dog和kitten则不是那么相近,iphone这个单词和kitten的语义就差的更远了。通过对词汇表中单词进行这种数值表示方式的学习(也就是将单词转换为词向量),能够让我们基于这样的数值进行向量化的操作从而得到一些有趣的结论。比如说,如果我们对词向量kitten、cat以及dog执行这样的操作:kitten - cat + dog,那么最终得到的嵌入向量(embedded vector)将与puppy这个词向量十分相近。

模型

  Word2Vec模型中,主要有Skip-Gram和CBOW两种模型,从直观上理解,Skip-Gram是给定input word来预测上下文。而CBOW是给定上下文,来预测input word。本篇文章仅讲解Skip-Gram模型。
在这里插入图片描述
  Word2Vec模型实际上分为了两个部分,第一部分为建立模型,第二部分是通过模型获取嵌入词向量。Word2Vec的整个建模过程实际上与自编码器(auto-encoder)的思想很相似,即先基于训练数据构建一个神经网络,当这个模型训练好以后,我们并不会用这个训练好的模型处理新的任务,我们真正需要的是这个模型通过训练数据所学得的参数,例如隐层的权重矩阵——后面我们将会看到这些权重在Word2Vec中实际上就是我们试图去学习的“word Embadding”。
  训练模型的真正目的是获得模型基于训练数据学得的权重。接下来我们来看看如何训练我们的神经网络。假如我们有一个句子“The dog barked at the mailman”。

  • 首先我们选句子中间的一个词作为我们的输入词,例如我们选取“dog”作为input word;
  • 有了input word以后,我们再定义一个叫做skip_window的参数,它代表着我们从当前input word的一侧(左边或右边)选取词的数量。如果我们设置skip_window=2,那么我们最终获得窗口中的词(包括input
    word在内)就是[‘The’, ‘dog’,‘barked’, ‘at’]。skip_window=2代表着选取左input word左侧2个词和右侧2个词进入我们的窗口,所以整个窗口大小span = 2 × 2 2 \times 2 2×2。另一个参数叫num_skips,它代表着我们从整个窗口中选取多少个不同的词作为我们的output word,当skip_window = 2,num_skip = 2时,我们将会得到两组 (input word, output word) 形式的训练数据,即 (‘dog’,‘barked’),(‘dog’, ‘the’)。
  • 神经网络基于这些训练数据将会输出一个概率分布,这个概率代表着我们的词典中的每个词是output word的可能性。这句话有点绕,我们来看个栗子。第二步中我们在设置skip_window和num_skips=2的情况下获得了两组训练数据。假如我们先拿一组数据(‘dog’, ‘barked’) 来训练神经网络,那么模型通过学习这个训练样本,会告诉我们词汇表中每个单词是“barked”的概率大小。

  模型的输出概率代表着到我们词典中每个词有多大可能性跟input word同时出现。举个栗子,如果我们向神经网络模型中输入一个单词“Soviet“,那么最终模型的输出概率中,像“Union”, ”Russia“这种相关词的概率将远高于像”watermelon“,”kangaroo“非相关词的概率。因为”Union“,”Russia“在文本中更大可能在”Soviet“的窗口中出现。我们将通过给神经网络输入文本中成对的单词来训练它完成上面所说的概率计算。下面的图中给出了一些我们的训练样本的例子。我们选定句子“The quick brown fox jumps over lazy dog”,设定我们的窗口大小为2([公式]),也就是说我们仅选输入词前后各两个词和输入词进行组合。下图中,蓝色代表input word,方框内代表位于窗口内的单词。
在这里插入图片描述
  我们的模型将会从每对单词出现的次数中习得统计结果。例如,我们的神经网络可能会得到更多类似(“Soviet“,”Union“)这样的训练样本对,而对于(”Soviet“,”Sasquatch“)这样的组合却看到的很少。因此,当我们的模型完成训练后,给定一个单词”Soviet“作为输入,输出的结果中”Union“或者”Russia“要比”Sasquatch“被赋予更高的概率。

模型细节

下图是我们神经网络的结构:
在这里插入图片描述
  我们基于成对的单词来对神经网络进行训练,训练样本是 ( input word, output word ) 这样的单词对,input word和output word都是one-hot编码的向量。最终模型的输出是一个概率分布。
输入层
  输入层是一个one-hot编码的向量,在我们的例子中是一个10000维的向量,只有输入词对应的地方是1,其他都为0。
隐藏层
  如果我们想用300个特征来表示一个单词。那么隐藏层的权重矩阵应该为10000行,300列(隐藏层有300个节点)。隐藏层是一个线性计算过程,没有激活函数。
  从输入层到隐藏层所做的计算就是我们上面的”嵌入矩阵“部分提到的计算,隐藏层的每一个节点得到的是一个input word 的一个特征。所作的计算就是 E ⋅ O j = e j E\cdot O_{j} = e_{j} EOj=ej
输出层
  经过神经网络隐层的计算,ants这个词会从一个1 x 10000的向量变成1 x 300的向量,再被输入到输出层。输出层是一个softmax回归分类器,把预测结果分为10000类,对应了词汇表中的10000个单词,因此这里的输出层有10000个神经元,它的每个结点将会输出一个0-1之间的值(概率),这些所有输出层神经元结点的概率之和为1。softmax模型如下所示:
S o f t m a x : p ( t ∣ c ) = e θ t T e c ∑ j = 1 10000 e θ t T e c Softmax:p(t|c)=\frac{e^{\theta_t^Te_c}}{\sum_{j=1}^{10000}{e^{\theta_t^Te_c}}} Softmax:p(tc)=j=110000eθtTeceθtTec
  下面是一个例子,训练样本为 (input word: “ants”, output word: “car”) 的计算示意图。
在这里插入图片描述
  蓝色的向量代表了隐藏层输出的300个特征即公式中的 e c e_c ec,红色向量代表了输出层的每一个神经元的参数向量即 θ t \theta_t θt。对应于输出层的第一个神经元,在这里代表的就是词汇表中排在第一个位置上的词的特征向量,在这个神经网络中是通过神经网络的学习来获得的。最终softmax的损失函数就会像之前一样,我们用 y y y表示output word 即标签, y ^ \hat{y} y^表示预测词, y y y y ^ \hat{y} y^都是用one-hot表示的,于是损失函数就会是:
L ( y ^ , y ) = − ∑ i = 1 10000 y I log ⁡ y i ^ L(\hat{y},y) = - \sum_{i=1}^{10000}{y_I\log{\hat{y_i}}} L(y^,y)=i=110000yIlogyi^
通过损失函数使用梯度下降法来更新所有参数

  如果两个不同的单词有着非常相似的“上下文”(也就是窗口单词很相似,比如“Kitty climbed the tree”和“Cat climbed the tree”),那么通过我们的模型训练,这两个单词的嵌入向量将非常相似。
  那么两个单词拥有相似的“上下文”到底是什么含义呢?比如对于同义词“intelligent”和“smart”,我们觉得这两个单词应该拥有相同的“上下文”。而例如”engine“和”transmission“这样相关的词语,可能也拥有着相似的上下文。

对于论文使用模型的一些问题

1.从上面对embbading的理解来看,特征的提取似乎与LSTM无关。论文中是用LSTM来提取特征,也就是说使用LSTM来学习嵌入矩阵,那么其复杂度和上面提到的WordVec有什么分别吗?这个问题主要还是对kera的模型不了解
2.文中中模型的输入并不是one-hot编码,而是使用 [ 0 , 0 , . . . , 4 , 74 , 46 , . . . 0 , 0 ] [0,0,...,4,74,46,...0,0] [0,0,...,4,74,46,...0,0]这种方式表示一个恶意域名,其中的序号表示词汇表中相同序号所代表的字母,0是为了填充为相同的输入维度。其词汇表是这样的字典 [ " a " : 1 , " c " : 2 , . . . ] ["a":1,"c":2,...] ["a":1,"c":2,...],其中的key为所有域名使用过的字符,value是1,2,3,4,… 使用次数最多的就为1,然后依次按序排列。那么论文使用的模型内部会将其进行one-hot编码吗?如果不是one-hot编码,那么如何来学的嵌入矩阵的呢?
3. 对于自然语言这种词语与词语之间是有联系的,虽然对于机器来说看不出其联系,但是通过嵌入矩阵,两个相近的词语应该在特征上是相同的,例如apple和orange应该具有相似的特征向量,但是对于字母,a和b之间即使通过机器学习学得了其两个具有相似的特征,但是这种特征有具体的意义吗?其学得的特征对于两个字母之间的联系相对于词语之间是否较弱?
4. 实验结果
将下图中的数据剔除训练数据,然后使用未包含这些数据的训练样本来训练模型,然后预测下面几类DGA算法
在这里插入图片描述
使用所有37种DGA样本作为训练数据训练模型,然后做出的对于预测的结果是否为DGA的对比
在这里插入图片描述
使用所有37种DGA样本作为训练数据训练模型,然后做出的对于预测的结果是某一类DGA的对比实验
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值