0%

fine-tune整体流程

1.加载预训练模型参数

2.修改预训练模型,修改其后面的层为适合自己问题的层

3.设置各层的可更新性。前面和预训练模型相同的部分不再进行训练,后面新加的部分还要重新进行训练

4.检查各层可更新性(可选)

5.设置优化器只对更新前面设置为可更新的部分。

1.加载预训练模型

​ 一般在fine-tune中的第一步是首先加载一个已经预训练好的模型的参数,然后将预加载的模型后面的部分结构改造成自己需要的情况。其中包括两种情况:

1.单单将其中的一两个单独的层进行简单的改造(如预训练的模型输出的类为1000类,目前想要使用的模型只包含两个类),使用原有的预训练模型。

2.使用预训练模型的参数,但是后面的层需要更换为比较复杂的模型结构(常见的就是并行结构)

1.使用torchvision中已经预训练好的模型

​ 使用torchvision中已经预训练好的模型结构和参数,然后直接将尾部进行修改。

1
2
3
4
5
6
from torchvision import models
from torch import nn
# 加载torchvision中已经训练好的resnet18模型,并且采用预训练的参数
resnet = models.resnet18(pretrained=True)
# 最后一层重新随机参数,并且将输出类别改为2
resnet.fc = nn.Linear(512,2)
2.使用自己预训练好的模型,并且将输出的结果设置为并行结构

​ 这里主要实现了之前自己已经预训练了,重新定义整体模型的结构(创建一个新的模型类),然后将共有部分的参数加载进来,不同的地方使用随机参数

注意:这里面新旧模型要共用的层名称一定要一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from models import TextCNN

#加载新的模型结构,这里面的Text_CNN_Regression_Class模型结构已经设置为和之前的Text_CNN模型整体结构一致,最后的全连接层改为一个分类输出头加一个回归输出头
model = Text_CNN_Regression_Class(len(FILE_TYPE_COL))

# 加载预训练的模型的参数
pretrained_dict = torch.load("../model/Text_CNN_add_filetype_1:1_epoch5.state")
# 加载新的模型结构的初始化参数
model_dict = model.state_dict()
# 将pretrained_dict里不属于model_dict的键剔除掉
pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict}#如果你的k在预备训练当中,那么你的参数需要做转换,否则为原先的
# 更新现有的model_dict
model_dict.update(pretrained_dict)#利用预训练模型的参数,更新你的模型
# 加载我们真正需要的state_dict
model.load_state_dict(model_dict)

2.将指定层设置为参数更新,其余设置为参数不更新

​ 在fine-tune过程中经常用到的操作就是将整个神将网络的前半部分直接采用预训练好的模型参数,不再进行更新,这里主要实现了已经加载了预训练模型的参数,固定了除最后一个全连接层全部参数。

1
2
3
4
5
6
7
#对于模型的每个权重,使其不进行反向传播,即固定参数
for param in resnet.parameters():
param.requires_grad = False

#将其中最后的全连接部分的网路参数设置为可反向传播
for param in resnet.fc.parameters():
param.requires_grad = True

3.查看各层参数以及是否进行梯度更新(可选)

​ 在fine-tune的过程中需要检查是不是已经将不需要更新梯度的层的各个参数值已经设置为不进行梯度更新,这是可以使用下面的代码进行查看:

1
2
3
4
for child in resnet.children():
print(child)
for param in child.parameters():
print(param.requires_grad)

4..将优化器设置为只更新需要更新的部分参数

​ 这里主要用于前面的各个参数是否进行更新已经设置完成后的最后一步,完成这一部就可以只接将优化器直接用于整个神经网络的重新训练了。

1
optimizer = optim.SGD(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-3)

​ 本文主要针对yolo模型的实现细节进行一些记录,前半部分不讨论yolo模型,直接将yolo模型当做黑盒子进行使用,讨论模型外的预处理以及输出表现等部分。

Yolo外部关键点

1.boxes阈值过滤

​ 该部分主要用于将对各个boxes进行打分,根据阈值对boxes进行过滤

1
2
3
4
5
6
7
8
def yolo_filter_boxes(box_confidence, boxes, box_class_probs, threshold = .6):
    box_scores = box_confidence*box_class_probs #boxes分数为置信度*类别概率
    box_classes = K.argmax(box_scores,-1)
    box_class_scores = K.max(box_scores,-1)
    filtering_mask = box_class_scores>threshold
    scores = tf.boolean_mask(box_class_scores,filtering_mask)
    boxes = tf.boolean_mask(boxes,filtering_mask)
    classes = tf.boolean_mask(box_classes,filtering_mask)

bbox信息(x,y,w,h)为物体中心位置相对于格子位置的偏移、高度和宽度,均被归一化

置信度反映了是够包含物体以及包含物体情况下的为位置准确性,定义为

  本文从整体上对目标检测算法做了概述,首先对目前目标检测算法的主要流派做阐述,然后针对传统目标检测算法以及新兴的候选区域+深度学习方式两种方式的主流目标检测算法分别做比较详细介绍。

image

阅读全文 »

​ RoI概念来源于SPP Net网络,其主要用于改善在卷积神经网络一般都包含卷积部分和全连接部分两个部分,卷积神经网络部分输入不需要固定尺寸,而全连接层则需要固定输入尺寸,因此在卷积神经网络中由于卷积部分提取到到的特征向量要输入到全连接网络中,因此卷积网络部分的的输入也只能输入固定的尺寸,但是在一些环境中所能提供的输入并不是一定的,因此在SSP Net中提出了RoI结构用来解决这个问题。

作用

​ 加在卷积层后用来将卷积层输出的不同尺寸的向量固定成一个尺寸,使其可以在模型原始输入向量大小不同时可将卷及部分输出的向量统一规格输入到后续的全连接部分。

具体结构

假设输入ROI Pooling层的feature map of conv5的shape是(h,w,c)

  1. 首先ROI Pooling层把feature map of conv5划分成4*4的小方块(对应图中蓝色矩形),每个小方块的宽高分别为w/4,h/4,通道数为c,不能整除时需要取整.针对feature map的每个通道,分别在这16个小方块进行最大池化(MaxPooling),也就是取出小方块里的最大值.每一个通道都能取出16个最大值,所以所有通道共有16c个值
  2. 然后ROI Pooling层把feature map of conv5划分成2*2的小方块(对应图中绿色矩形),使用同样的方法得到4c个值
  3. 接着ROI Pooling层把feature map of conv5划分成1*1的小方块(对应图中灰色矩形),得到c个值
  4. 最后将上面三个值串联起来得到长度为16c+4c+c=21c的特征表示

1.什么是IoU(intersection-over-union)?

IoU简单来讲就是模型产生的目标窗口和原来标记窗口的交叠率。具体计算公式为:

问题描述:

​ 在数据分析过程中发现当某一列的值为列表类型时,当存储成为csv时将自动将该列的列表存储成为对应的字符串,当重新进行读取时只能按照字符串进行处理。下面是一个真实的事例:

​ 首先直接创建一列数据类型为list,直接查看dataframe中存储的数据,发现还是正常的列表类型

1
2
3
4
5
6
>>> df = DataFrame(columns=['col1'])
>>> df.append(Series([None]), ignore_index=True)
>>> df['column1'][0] = [1, 2]
>>> df
col1
0 [1, 2]

​ 然后将dataframe进行存储后进行读取,这里可以看到列表列已经变成了字符串类型:

1
2
3
4
>>> df.to_csv("XXX.csv")
>>> df = pd.read_csv("XXX.csv")
>>> df['column1'][0]
'[1, 2]'

解决方案:

1.存储时不再存储为csv,存储为pickle文件

1
2
3
4
5
6
7
>>> import pickle
>>> with open("data.pkl",'wb') as file:
>>> pickle.dump(df,file)
>>> with open('tmp.pkl', 'rb') as file:
>>> new_df =pickle.load(file)
>>> new_df['col1'][0]
[1, 2]

2.存储后将ast.literal_eval从str转化会list

1
2
3
>>> from ast import literal_eval
>>> literal_eval('[1.23, 2.34]')
[1.23, 2.34]

1.什么是存储过程?优点是什么?

​ 存储过程是一些预编译的SQL语句。

​ 优点:1.更加容易理解

​ 2.存储过程是一个预编译的代码模块,执行效率更高

2.索引是什么?有什么作用以及优缺点?

​ 索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构

注意:所以需要占用物理和数据空间

作用:1.加快数据库检索速度

​ 2.降低了插入、删除、修改等维护任务的速度

​ 3.唯一索引可以确保每一行数据的唯一性

​ 4.通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能

建立索引的原则:在使用最频繁的、需要排序的字段上建立索引

3.什么是事务?

​ 事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。

事务的特性:

​ (1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。

​ (2)一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态

​ (3)隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,

​ (4) 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

4.使用索引查询一定能提高查询的性能吗?为什么?

​ 通常索引查询要比全表扫描速度要快,但是也存在特殊情况:

​ 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O,因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.

5.drop、delete与truncate的区别

​ 1.效果上:delete和truncate只删除表的数据不删除表的结构

​ 2.速度上:drop> truncate >delete

​ 3.操作类型:delete是dml,这个操作要放到rollback segment中,事物提交后才生效,如果有相应的trigger,执行时将被触发。truncated、drop是ddl,操作立即生效,但不能进行回滚,操作不触发trigger

使用场景:

​ 1.不需要一张表时,用drop

​ 2.删除部分数据行时,用delete+where子句

​ 3.保留表而删除所有数据时,用truncate

6.超键、候选键、主键、外键分别是什么?

超键:在关系中能唯一表示元组属性集称为关系模式的超键。一个属性获多个属性的组合都可以作为超键。超键包含候选键和主键

候选键:最小的超键,没有冗余元素的超键。

主键:数据库表中对存储数据对象予以唯一完整标识的数据列或属性组合。一个数据列只能有一个主键,并且逐渐的值不能为NULL

外键:在一个表中存在另一个表的主键称为词表的外键。

7.什么是视图?以及视图的使用场景有哪些?

视图是一种由一个或多个真实表的行或者列组成的虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,对视图的修改不影响基本表

使用场景:1.希望只暴露部分字段给访问者,可以使用视图

​ 2.查询的数据来源于不同的表,而查询者希望以一种统一的方式查询,可以使用视图

8.乐观锁和悲观锁

​ 数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作

乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

9、说一说三个范式。

​ 第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。

​ 第二范式(2NF):对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性

​ 第三范式(3NF):对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余

优势:

可以尽量减少冗余,使的更新更快、体积更小

10.什么是触发器(trigger)?Mysql中都有哪些触发器?

​ 触发器是指一段代码,当触发某个事件时,自动执行这些代码,提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程。。

​ 在mysql中一共有6中触发器:

​ 1.Before Insert

​ 2.After Insert

​ 3.Before Update

​ 4.After Update

​ 5.Before Delete

​ 6.After Delete

11.常见mysql表引擎

​ InnoDB、MyISAM、Memory

12.关系数据库和非关系型数据库

关系型数据库

​ 关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织

代表:

Oracle、SQL Server、Access、Mysql

优点
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。

非关系型数据库

​ 非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等

代表:

​ Hbase key-value形式

​ Redis key-value形式

​ MongodDB key-value形式

​ Neo4j 图形数据库

优点
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。

缺点
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、数据结构相对复杂,复杂查询方面稍欠。

13.CHAR和VARCHAR的区别

​ 1.char和varchar类型在存储和检索方面有所不同

​ 2.char列长度固定为创建声明时生命的长度,长度范围是1到255,当char值被存储时,他们被用空格填充到指定长度,检索char值时要删除尾随空格

14.如果一个表有一列定义为TIMESTAMP,将发生什么?

​ 每当行被更改时,时间戳字段都会获取当前时间戳

15.什么是内连接、外连接、自连接?

内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行
外连接 其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中
的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接

​ 左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,MySQL目前还不支持全外连接

16.SQL语言包括哪几部分?每部分都有哪些操作关键字?

SQL语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)四个部分。

​ 数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等

​ 数据操纵:Select ,insert,update,delete,

​ 数据控制:grant,revoke

​ 数据查询:select

17.完整性约束包括哪些?

数据完整性(Data Integrity)是指数据的精确(Accuracy)和可靠性(Reliability)。

分为以下四类:

​ 1) 实体完整性:规定表的每一行在表中是惟一的实体。

​ 2) 域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。

​ 3) 参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。

​ 4) 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求。

与表有关的约束:包括列约束(NOT NULL(非空约束))和表约束(PRIMARY KEY、foreign key、check、UNIQUE) 。

18.什么是锁?

​ 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

基本锁类型:行级锁和表级锁

19.NULL是什么?

论文名称:《Locate-Then-Detect: Real-time Web Attack Detection via Attention-based
Deep Neural Networks》

主要针对的攻击类型:sql、xss

采用的方式:先定位攻击载荷在进行恶意检测

内容解读:

​ 主要分为两阶段网络

PLN(Payload Locat-ing Network):在整个url、post中定位到关键部分,去掉无用信息

PCN(Payload Classification Network):利用PLN网络得到的关注度信息进行分类

PLN

目标

输入:固定长度的请求输入文本

输出:区域位置和可疑置信度

核心思想:图像分割的思想

PLN网络要进行单独的训练,然后加到PCN网络之前,固定参数值(我的理解)

request请求编码

​ 首先设置一个最大长度L,然后进行字符级别的embedding,即每个字符都转化成一个对应的k维Embbeding向量,最终输出为:L*K维向量

这里的最大长度法和我们之前的方法类似,直接进行长度限制,忽略了在超长的正常参数尾部追加恶意payload形式的攻击

特征提取

​ 模型:Xception

Xception模型

​ 先进行普通卷积操作,再对 1×1 卷积后的每个channel分别进行 3×3 卷积操作,最后将结果 concat

​ 加速计算:thin feature maps with small channel(不损失很大精度的前提下显著提升速度)

模型部分

​ 沿着特征图滑动几个mini-networks来检测可以片段,该网络采样特征图一个nm的窗口,在mini-network层之后经过两个1\m并列的层——区域回归层和区域分类层

为了保证保持嵌入张量中这些向量的语义完整性,我们令m等于字符向量的嵌入大小。

reg层输出坐标:(p,2p)有效载荷的开始位置和结束位置

cls层:输出每个区域的得分

对于输入特征图为WH的,将会有H\P个区域

并不是所有区域都是有效的,

区域的标注

区域标注为积极标签的方法为:

1.将用于最大的交集序列(Ios)的区域标为积极

2.将交集序列的值(Ios)大于0.5的值定位积极

区域标注为消极标签:

将交集序列的值小于0.2的标为消极序列

​ 如果既没有标为消极也没有标为积极,那么则忽略该区域。一般情况下消极区域的数量远大于积极区域,如果消极区域和积极区域的比例大于3:1,那么将其归置到3:1。

PLN层的损失函数:

​ 参数意义:

i:区域的编号

li:区域的label,积极区域为1,否则为0

posi、pos∗i :分别代表了区域的开始位置和结束位置

Lcls:是区域的分类对数损失函数,

Lreg: 是积极区域的回归损失函数,不关注负样本,该回归损失函数采用:

​ x表示区域真实标签和预测值之间的差距

λ:控制损失函数的前后两个部分的重要性,本文中采用的是1.0

Ncls: 本文中设置为mini-batch 大小

Nreg:本文设置为区域个数,

数据标注

​ 在整个LTD模型结构中,需要大量的标注数据,本文提出了基于HMM的异常检测系统来辅助序列标注,该系统通过大量的HMM模型来实现,每个host的每个url的参数值都会训练一个hmm模型,检测到的异常参数经过规则检测系统确定为xss或sql会标记起始和结束位置。

作用:表示有效payload位置

方法:参数hmm+规则系统

实例:

​ uri1 = /a.php?id=1&name=1’ and 1=1

首先提取各个参数的值,得到

​ {val1 : 1, val2 : 1′ and 1 = 1}

使用hmm参数异常检测模型确定是否存在异常参数值

​ val2是异常的参数值

使用规则模型判别该参数为sql注入,定位位置,标记异常区域

​ [Start (17), End (27), Label (1)]

PCN

​ 目标:对PLN层定位的可疑区域,在PCN部分进行深入的分析,找到攻击的区域,

​ 输入:PLN中得分最高的三个区域(最可疑)

​ 输出: 是否为攻击以及攻击类型

​ 核心思想:采用CNN进行文本分类

具体做法

采用5层不同大小的卷积核,并且每个卷积核后都会带一个max-overtime pooling operation ,不同的卷积核大小保证了PCN能够精确地识别具有多种特征的攻击。这些特征被连接起来,在连接在层线性层,最后使用softmax输出是各种攻击的可能性

损失函数

​ PCN部分的损失函数就是标准的交叉熵损失函数加上一个L1正则化项:

该层主要是一个文本分类的层,和PCN层共享相同的Embedding向量,输出给定区域是否为恶意以及攻击类型

数据产生方法

1.首先使用传统的WAF找出正常流量

2.构造sql、xss的payload参数值随机换到正常流量的参数值部分

实验结果

1.CSCI

​ CSCI 2010数据集包含针对电子商务Web应用程序生成的流量,该数据集包含25,000多个异常请求和36,000个良性请求,使用其中2,072 SQLi和1,502 XSS样本作为黑样本,其他的正常流量和攻击流量统一标记为白样本。

​ LTD与RWAF相比,在精确率吧和召回率方面均要好。LTD和Libinjection都具有100%的精确率,但是LTD拥有更高的召回率。

2.真实流量

数据来源

​ 300w条真实流量数据,其中包括38600个sql注入和xss攻击实例。

Part 1 模型优越性的证明

​ 其中,

1.LTD获得了最高的精确率,HMM-Web获得了最高的召回率,但是它的误报率过高,在在真实的WAF应用中,误报率必须少于0.01%。

分析:在该实验中,HMM-Web方式之所以比LTD获得了更加高的准确率,是因为HMM-Web所采用的方式是基于异常检测的方式,只要是之前没有见过的流量都会被判别为恶意。但这种HMM异常检测的缺陷也非常的明显,每当有系统更新时,HMM-web模型都需要重新进行训练,因此HMM-web并不是一个很好的实时web入侵检测方式。

对于对于Web攻击检测,在误报和召回之间存在权衡,而低误报是生产环境中的先决条件。因为高误报会造成用户正常访问的阻塞

2.Libinjection和LTD都获得了100%的精确率,但LTD的召回率达到了99.8%,而Libinjection只有71%。下面是一些Libinjection误分类而LTD分类正确分类的样本:

分析:这里的解释有点没太看懂,好像有点和上表对不上,大致意思是说Libinjection过分依赖指纹库,进行微小的改变都很难进行检测,而且由于有些正常流量可能偶尔也会出现指纹库中的部分内容,因此很容易误报

3.LTD比RWAF方式准确率和召回率都好。

Part2 PLN部分有效性的证明

实验组1:LTD

实验组2 :VPCN,把url参数部分却分为key-value形式,LTD去掉PLN部分只留下PCN部分进行分类

个人看法:这里我个人觉得对比试验有点问题,因为直接用PCN部分进行分类不一定非要进行参数切分,因此这里使用切与不切分进行对比,证明LTD效率更高个人认为不成立,应该使用直接使用PCN进行对原始embedding后的内容进行分类

1.效率上

​ 在有GPU的的环境下,带PLN的网络比不带的快6倍,没有GPU的环境下快了8倍。

​ 分析:LTD之所以效率高的多是因为不使用PLN,直接参数个数过多,27.5的Url有13个参数以上,切分参数需要花费大量的时间,在真实流量中,包含参数个数可能更多。另一方面,一些开发者因为某些原因重新模块来隐藏参数,在这种情况下,基于规则的计算需要更加复杂的计算来提取该值。与传统的方法相比,LTD通过限制检测区域来加快计算效率,另一方面也避免了参数重写造成的切割效率问题

2.准确率

对照组:典型的char级cnn从原始请求进行分类

​ 数据集来源:

​ 训练集:真实流量中320w正常流量,80w攻击样本

​ 测试数据集:10w条不同时间的正常流量数据,在其中选择10000个样本随机将其中一个参数的值替换为SQLi、XSS的攻击载荷,形成恶意样本,其他的为正常样本

​ 经过实验,明显可以看出,直接的CNN的误报率和漏报率比LTD都要高得多,而这时因为一般payload的长度都很短,而url请求的长度很长。某些已知攻击的payload长度最短可以为6个字符,而这些很短的payload就可以隐藏在很长的背景字符串之中,导致CNN很难学到恶意payload,而LTD中的PLN模块能通过过滤不相关部分来发现隐藏在很长背景字符串中的短payload,因此,LTD可以更准确地区分实际的攻击有效负载和那些恶意的良性URL片段。

Part3 PLN输出可疑区域个数选择

​ 分别绘制了xss、sql在1~5个可以区域的ROC、PR曲线,如下:

当区域数为3时,SQLi和XSS均达到了最好或者非常接近最好的准确率。使用更多的区域数能够获得更好的召回率,但是误报率将大大升高。

依然存在的问题

​ 1.限定输入长度,对于特长的尾部追加式的攻击依然没有识别能力

​ 2.单纯的在SQLi和XSS上进行实验,未来还需要文件包含和代码执行等其他攻击类型进行检测

​ 3.所谓的提升了可解释性我觉得并没有很好地可以追溯源头

【1】Hmm-web: A framework for the detection of attacks against web applications

【2】Xception:Deep learning with depthwise separable convolutions.

【3】Detection of sql injection attacks using hidden markov model.

【4】Character-aware neural language models.

【5】A method for stochastic optimization

【6】 Light-head r-cnn: In defense of two-stage object detector.

【7】Application of the generic feature selection measure in detection of web attacks

【8】Ef-ficient character-level document classification by combining convolution and recurrent layers

貌似