基础概念:语言模型应用于检测

2020-07-10  本文已影响0人  VChao

2020/05/30 -
昨天的时候,简单学习了跟语言模型相关的内容。其实主要的内容都是word2vec的内容;本质上我想找的内容是,能够给我建立一个模糊的说法。我是使用这个模型,能带来的好处是什么。但是感觉上来说,完全就是从反向的角度来说明。使用了这个模型,然后告诉你这个模型的好处。

对于语言模型来说,我简单看了一下,这里来简单总结一下,不涉及具体原理。
首先就是最开始的one-hot模型,假设不是用n-gram,(其实对于这一块我也不是非常清楚)
那么就是单个词是否出现,或者说利用统计词频的形式。
但是这种模型,按照他们的说法,就是完全没有任何的词与词之间的关联。
同时当语料库比较大的时候,容易形成高维的数据,而且比较稀疏。

然后就是分布式的表示,这种表示考虑了上下文的内容。
其中有一个就是n-gram的形式,这个跟我前面提到的这个n-gram还不一样,他是类似马尔可夫的形式,就是说,你这个词汇,出现的概率是跟前面词汇出现相关的。以此来表示语义的内容。

还有就是最近使用的这种,word2vec的形式,他有两种方法,一种就是cbow,另外就是skip-gram。
这种也是说考虑的上下文的关系问题。

大致上就是这些内容了。

关于语言模型的学习,还是要加强。

这里记录几个比较不错的网站:
word2vec 中的数学原理详解
词向量表示方法梳理
[NLP] 秒懂词向量Word2vec的本质
NLP常见语言模型总结
通俗理解word2vec


不过,我感觉我有些跑偏了,从最开始我要学习的这个内容,恶意软件检测的相关说法,到最后的这些语言模型,感觉没有系统化的学习,就像是非常跨越性的东西,完全没有自己的理解。没有系统的具体构建。


好像是这么回事,就是我没有理解这样一个平缓的过程,就是起承转合的一个内容提要,为什么要使用这种模型。
大部分论文中,总是说,这种方式可以帮助你怎么样怎么样,但其实,这些说法都不够具体,没有完整的让你构建起来这个内容。
另外就是,我发现不了原有的方法具备哪些不足!!!这个就是发现问题的过程。
特别是说,当你的数据,使用某种算法已经达到了非常好的效果,你怎么来体现你的新的方式呢?这就是问题的来源。

这里有两个新的,关于词语转化为向量的文章,我感觉还挺好的。不要一想起就是说word2vec

将文本转换成向量的方法有哪些?
different-techniques-to-represent-words-as-vectors-word-embeddings-3e4b9ab7ceb4

下面这个网站中,主要列举了四种模型。

  1. Count Vectorizer 词频向量化
  2. TF-IDF Vectorizer
  3. Hashing Vectorizer这个不知道是啥玩意,但也是sklearn中的一种向量方法
  4. word2vec 这个采用gensim进行,不知道使用keras的时候,那个embedding层是不是也是这个特性呢?

2020/06/04 -
今天看了一篇基于图嵌入方式进行代码相似度检测的内容。从这个过程,我就感觉出来,其实这些方法只不过是将二进制的内容进行数值转化的过程。他们就是通过这种方式将二进制的原始数据转化为可以被机器所处理的数据。
但是当然不是简单简单的进行转化就可以,肯定是需要一定的含义,或者说意义。
比如说,word2vec就是想找出来,词与词之间的关系,只不过,我没有找到这个东西能够实际在这个二进制中所代表的含义。

前面也说过,通过进行词频的查找,来验证这个webshell是否是恶意的。我个人对这个东西的意义理解,就感觉是可能某个单词就代表这某些含义吧。

我在想是不是能够进行一些简单的可视化呢?
这个也是我之前的想法,定位出某个函数,或者说某个函数的序列就是恶意的呢?或者说, 只要这些东西成对出现,就能算是恶意的呢?这个说法感觉很想是频繁项挖掘中的东西。


2020/06/04
今天仔细看了一下word2vec这个东西,通过仔细的理解,感觉对他的说法有些明确了。
他的意思是,一个词的词义,是由他的上下文来决定的。正式有了这个启发,才出现了这种skip-gram的形式,就是通过这个词阿里预测他旁边的词。来看看他原文的说法。
这段话主要是从训练的角度来说明(数据输入)

We're going to train the neural network to do the following. Given a specific word in the middle of a sentence (the input word), look at the words nearby and pick one at random. The network is going to tell us the probability for every word in our vocabulary of being the "nearby word" that we chose.

下面这段话体现出来了这个上下文的信息。

If two different words have very similar "context" (that is, what words are likely to appear around them), then our model needs to output very similar results for these two words. And one way for the network to output similar context predictions for these two words is if the word vector are similar. So, if two words have similar contexts, then our network is motivated to learn similar word vectors for these two words!

另外一个网站的一段话。

There are a set of neural network models that have the aim to represent words in the vector space. These models are highly efficient and performant in understanding the relation between words. Similar words are palced close together in the vector while dissimilar words are placed wide apart.

注意这里透露出来的一个信息,他是随机选择了他旁边的词语。但是是在某个窗口大小内的。
也就是说,他并没有考虑这个词语收到了之后,到底是属于什么地方的信息。

http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/
这里产生的一个疑问就是,到底这个最后的向量是什么呢?他说是权值,那你这个全职又是啥地方的呢?是将最后一层直接剥离吗?
而且如果谈到具体的实现的时候,我记得keras会封装的好,也就是说它会帮你完整弄清楚吗?不理解。这个后面再说吧,目前暂时的了解就是,我能够通过当前的方式理解到,他可以帮助我获取一个这样的过程。

这里基本上原理已经清楚了, 那么我来思考一下,如果是将这个东西应用到我的环境中呢?
比如说,我所使用的数据源是dump后的汇编语句。假设我使用word2vec的方法, 这只不过是一种向量的转换过程。
从整体的流程语义上来说,就是将某个汇编的语句找到了他的代表方式。但是还是那句话,你这个东西跟恶意有什么关系呢?!
注意,我仿佛有些明白了,我可能还是陷入在之前的想法中了,就是说,我是想着怎么把这个命令序列直接将这个恶意给关联上。但实际上,这里不说2vec的内容,就之说机器学习的分类这种东西,这种东西他是依赖于数据进行学习的。也就是说,他完全就是帮你建立一个数据内容(泛化能力这里不谈,你的数据都不好,就别提泛化了)。
所以,说,那么就是,我是用机器学习或者深度学习的角度,本身就是为了能够帮助你从数据中找到这种东西。
那么,再把问题回来就比较明显了。
我知道某个二进制是恶意的,也就是有标签的数据。我训练的时候就是用这些数据(2vec以后)的数据进行比对,从这些特征上得到一个非线性的关系。这样来说,就比较简单了,就有点像我使用的那种n-gram词频直接进行分类的过程一样。
明白了吧。
就是有一堆向量,我让这个东西自己去学是否是能够映射到某个关系的。

我感觉我这里对这个机器学习更理解了。他会学习历史数据,那么历史数据相似度高的,自然也就归类到了一起。这里也是一样,如果语句相似度高,那么他从数学上来讲,他们的非线性关系的参数也是大体上一致的。
这也就是,我感觉,为什么要研究某个函数或者某个软件相似度的一个重要原因。

上面这些话,从机器学习或者深度学习的角度已经能够理解了,但是还是那句话,就是实际上从直观上的可解释性怎么理解。
就是既然我能够得到一个词向量,那么这个词向量能够担任什么角色,他能够传递什么信息给我呢?
(这里可能还有一个问题没有说明,就是这个时候的数据,还不能直接进行分类,其实还要进行序列化处理一下,哦,我明白了,如果有了这个序列化处理的过程,我也就能够理解了。他就是要从这个里面去寻找相关的关系,找出pattern这种一样,如果说的简单点,那不就是再次用滑动窗口来学习这个关系吗。。。哈哈哈哈,傻逼)

这里再说一下,我之前的一些思考。我记得这些内容我也曾经写过。我思考的就是,为什么你可以将这个东西说是恶意或非恶意的。从整体上的理解,那么你必须给出的信息是,他干了什么事情,或者他带有什么特征。那么从行为上来说,就是看他做了什么操作,如果这些操作被人认定为恶意,那他就是恶意。我之前也说过,如果这个恶意软件仅仅是干了一些链接CC这种行为,你没有非常高的置信度就说这个东西是恶意的。
不过这让我感觉出来一个事情,就是说,那些杀毒软件可能指纹上也找不到什么东西来定义这个东西。他通过的方式是监控注册表,或者说某些关键系统路径的东西。如果你针对上面提到的这些东西,干了一些事情,那你就是恶意的。从浅层信息上来看,这个东西好像没有什么。

所以为了能够帮助工作人员能够及时定位问题,应该思考的是,如何找到这个恶意的部分呢?感觉这个其实就是找那些相似度高的代码部分。
不过,还有一种方案,就是频繁序列挖掘的方式,就是说,我要找的就是他们这些代码都在使用的内容。

这让我想起来一件事,word2vec能不能反向呢?
好像不能,我看他们还是正向的方式,就是你要查哪个词,你就是输入进去。

我这里的一个 想法就是,是不是能够利用类似doc2vec的方式呢。就是将这部分代码给向量化,然后进行聚类呢?
因为我要做的就是说,希望能够能够得到这个代码跟那些内容相似。

这里其实,感觉跟ssdeep的流程很像。

2020/06/05
妈的,感觉看了这个描述之后,就感觉我之前对神经网络的理解不是很对,更具体来说,就是记忆不够深入。导致实际上,没办法对应上这些东西,比如这个参数到底是什么,当时也只是非常模糊的记忆。
然后我现在也没有办法就是找到以前的笔记,以前根本没有记笔记。这就很尴尬了。为了更好的理解这个具体的内容,那么必须想办法把这个内部的原理了解清楚。


2020/06/05 -
我突然感觉到,相似度比较这个东西非常有用。特别是大数据环境下的相似度比较。这就不难说明,当时很多人研究字符串比较这个东西。这两天看到的论文,他们是属于这种利用图嵌入形式来进行比较的。
由此我也联想到,上午得出的结论,在机器学习过程中,相似的记录会加强某些参数,让他们逐渐分配到同一范围。
同时,在文本相似度的检测中,估计也是这种过程。

我刚刚简单翻了翻海量数据挖掘这本书,记得当时在文本数据上,他使用的方式是minhash还有lsh的形式。
那么你在联想联想最近在恶意样本分析中遇到的这个过程。

但是,显而易见的结果就是,如果是采用两两相比较的方式,必然会产生大量的时间消耗,他们解决这种问题的方式就是利用minhash来解决。


2020/06/16 -
今天本来想把word2vec的内容给看一看,找了几个文章。这里我提出几个疑问:
1)训练过程中,输入是某个单词的独热编码,但是输出是什么。每次训练的时候,都是一对一对输入吗?不明白。
这个好像不是这么回事。。。感觉内容还是稍微有些复杂。

这样,我这里把我今天算是一天的学习成果来简单总结一下。
还是因为自己很多东西都已经忘了, 特别是说之前深度学习的一些东西,然后加上一些python代码我也没见过,稍微有些磕绊,但实际上,我已经看了很久这个word2vec的东西,但是这次来看这个具体实现的时候,还是感觉有非常多的这种困难,我觉得主要原因就是,在看一些宏观性的说法的时候,都没有考虑过具体的实现,理解起也比较简单。但这次要看这个东西的时候,就感觉有点吃力。

这里来简单总结一下:(这里仅考虑skip-gram形式)
首先要理解,word2vec是一种利用神经网络来进行这种单词向量化的过程。他的输入就是某个单词的独热编码。然后模型的输出是softmax层,这一层(本层节点数量跟独热编码的数量相同,说白了如果不是概率输出,他就是一个独热编码,而其对应的这个单词就是上下文中的某个单词)将最大化某一个单词。
这里我不理解的是,因为很多图哈,他们有的输出是对应了多个单词(就是将多个上下文单词都放在了一起来描述),或者说单个的。但是从图中的信息来看,隐藏层的矩阵好像也是固定的,这也隐喻着,这个东西应该是共享权值,但是如果是共享的话,那同一个单词(输入)输出来的两个东西不一致,这好像也有点说不过去。(不过如果硬要理解的话,反正他里面是一个概率的东西)

这里其实还隐喻这个一个问题,那就是这个东西的训练过程。训练的时候,是一起训练吗?就是同时输出4个,但是权值是一样的。我总感觉这里其实也应该从简单的角度来理解,估计就是那种的,就是一对一对输入,然后一起训练。

最后就是我一开始不理解的地方了。那就是最后的单词向量是什么,这个向量才是我们真正的说法。
因为是使用的单层的神经网络,那么他应该是存在着两个地方。就是两个矩阵的地方,到底应该使用哪个矩阵呢?不清楚。
好像也可以使用两个地方的和,或者怎么样的,反正我估计,应该是都行。

反正总之你就是要一个变量,而这两个地方的变量,应该有一定的语义信息。

那么这里我来详细描述一下。到底是个什么意思。
输入是一个列向量,1000 x 1大小。(这里假定了单词表是1000个);然后输入层与隐藏层之间的关系矩阵(所谓的权值)应该是1000 x 300。输入向量经过转置之后,与矩阵相乘,就变成了1 x 300,然后后面是一个反过来,300 x 1000的矩阵。

这样来看的话,就比较明朗了。我个人也倾向于是中间的这个矩阵。正如他们文章所说,利用这种权值矩阵,就跟要查表一样,而这个表就是1000 x 300的矩阵。同时,你可以想想,这个矩阵,他的每一行就是一个单词最后转化成的向量。

2020/06/17 -

https://www.ahmedbesbes.com/blog/sentiment-analysis-with-keras-and-word-2-vec
从上述网站中给出的两个图可以可以看出。
word2vec不仅仅是说与语义上能够体现关联,同时在语法上也能。他的那个图就是例子,就是比较级和最高级的关系。

上一篇下一篇

猜你喜欢

热点阅读