最近几个月都在研究课题组组长接的区块链安全项目的一个子课题——区块链安全风险评估,虽说是风险评估,但目前我们研究比较多的还是区块链的漏洞检测。区块链这个领域的研究其实一直都在进行,但使用的都是形式化验证、符号执行、模糊测试等传统检测方法,因此我们打算结合深度学习做点工作。我搭建了一个简易的CNN+LSTM多分类模型(详见文章《CNN+LSTM:智能合约漏洞检测》),并通过算法利用已知漏洞的分类结果来检测未知漏洞,然而这种方法不太严谨,因为后续算法会将已知漏洞和未知漏洞杂糅在一起,导致该模型最终也只能判别未知漏洞。我认为一个深度学习模型同时区分已知类别和未知类别是有可能的,所以这两天一直在网上寻找资料,发现这个领域其实已经有团队在研究了,只是这种方案的实现难度还是比较高的,毕竟深度学习每个领域的研究成果到目前为止也只是沧海一粟。下面我将以通俗易懂的定义给大家科普一下Few-shot learning、Zero-shot learning和Open set recognition。
Few-shot learning
小样本学习,简单理解就是利用小数量的训练样本便可以达到高准确率的检测结果,相较而言以前的深度学习模型,无论是监督学习还是无监督学习,都需要大量的正负样本作训练集。下图展示了Few-shot learning完整过程所需的数据,包括Training Set、Support Set和Query。Training Set指训练集,这里的训练集与传统深度学习模型使用的训练集并无差别,只是数据量可以相对少一些;Support Set指支撑集,支撑集的类别与训练集的类别不一样,同时每个类别提供的样本数量可以很少,甚至等于1(如图),这便是小样本学习名称的由来;Query指查询条件(即需要分类的输入数据),支撑集和查询条件同时作为测试过程的输入,模型通过比较查询条件和支撑集便可以进行分类。
举个例子,训练集有Husky、Elephant、Tiger、Macaw和Car五种类别,支撑集有Fox、Squirrel、Rabbit、Hamster、Otter和Beaver六种类别,训练集和支撑集的类别完全不一样,注意,训练后的模型只能区分支撑集里的类别,因为该模型学习的是如何区分两个图片中的物体(即比较相似度)。接着进入测试过程,我们提供Query条件,比如是一张兔子的图片,此时模型会比较Query的图片与支撑集每个类别的图片并得到各自的相似度,最终相似度最大的即为正确类别。
Zero-shot learning
零样本学习,简单理解就是把Few-shot learning模型中的Support Set去掉,只保留训练集和查询条件,但需要额外补充一个待分类的类别描述。即利用训练集数据训练模型,使得模型能够对测试集的对象进行分类,但是训练集类别和测试集类别之间没有交集;期间需要借助类别的描述,来建立训练集和测试集之间的联系,从而使得模型有效。举个例子(如图),训练集包括horse、donkey、hyena、tiger、penguin、panda六个类别,这六个类别中每两个类别有一些相同特征,比如tiger和hyena都有条纹,模型训练完后便会将这些特征量化。测试集只有斑马这一个类别,因此也只有一个类别描述——Zebra Descriptions(horse-like,stripe,black&white),每个描述会包含几个特征,此时当我们输入斑马的图片时,模型会把图片与测试集中所有的类别描述一一比对,符合描述所有特征的即为正确分类。
Open set recognition
开集识别。传统的模型包括以上两种模型都是闭集识别,即模型知道所有的类别,Zero-shot learning模型中即使训练集和测试集都没有斑马类别的样本,但测试集中包含了斑马类别的描述,这是有用的属性信息。然而开集识别要实现的是训练集和测试集的类别可以有一样,也可以有不一样的,但模型最终能在不提供任何辅助信息的情况下区分出已知类别,同时也能分辨出未知类别并作相应处理。下图是这个领域某篇论文中对深度学习使用数据的定义与分类。
KKCs:具有明确标签的正训练样本(对其他KKCs为负样本),包含相应的伴随信息(语义和属性信息等)的类别
KUCs:被标记为负样本,不必要被划分为一个具体的类别
UKCs:训练时没有可用的样本,但是有可用的伴随信息(语义和属性信息等)
UUCs:训练时没有可用样本,也没有伴随信息(语义和属性信息等)
传统分类只考虑KKCs;Zero-shot learning关注识别UKCs;Few-shot learning看作是Zero-shot learning的扩展,训练时有有限数量的UKCs;开集识别训练时只有KKCs,测试时有UUCs,需要准确分类KKCs同时需要正确的策略拒绝UUCs。
由于Zero-shot learning和Few-shot learning两个领域是2015年左右提出的,因此发展速度还比较快,也有一些比较成熟的模型了,但Open set recognition是2020年之后才提出来的,虽然有一些算法已经开始出现,终究还是处于起步阶段,所以我期望看到开集识别有更成熟的方案被提出,我也会持续关注。关于自己课题组的项目,我只能说尽力走好每一步吧,实在没有解决的方法那只能在输入模型之前先用他人的方案过滤掉已知漏洞的数据。