# ET-BERT **Repository Path**: xxdxxdxxd/et-bert ## Basic Information - **Project Name**: ET-BERT - **Description**: 网络流量分类网络ET-BERT论文复现和探讨。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 22 - **Forks**: 4 - **Created**: 2023-08-07 - **Last Updated**: 2025-10-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## ET-BERT 复现结果 > 贡献人:舒沛谙 ![result](results/%E5%A4%8D%E7%8E%B0%E7%BB%93%E6%9E%9C2.png) 【更新】 - 底色加深的单元格为补充结果。黑体为复现结果。 - 补充了ISCX-Tor数据集在flow级别fine-tune的复现结果。ET-BERT原论文结果不是很理想,但是复现效果很好。最大的可能是对数据集的预处理不同,原论文没有给出在ISCX-Tor上的预处理结果。 - 补充了ISCX-Tor数据集分类目标从app改为service后的结果,从而与YaTC论文保持一致。YaTC作者复现的ET-BERT效果很差,但是事实上ET-BERT复现表现很好,原因在下文有分析。 - 补充了ET-BERT在CIC-IoT数据集上的结果,和YaTC进行对比,依然比YaTC对ET-BERT的复现结果更优。同时测试了ET-BERT的few shot能力(按比例减少用于训练的样本数,验证集和测试集不变)。 - 在CIC-IoT数据集和ISCX-Tor上测试了不使用预训练模型直接进行监督学习的结果,和YaTC的对ET-BERT的复现结果进行了比较。 【旧】 - 原论文,在fine-tune阶段,ET-BERT(packet)结果普遍高于或接近ET-BERT(flow)结果,且按flow进行fine-tune效果确实不明显,故主要复现了ET-BERT(packet)的结果。 - 具体评测结果见results目录对应数据集目录下的 `score.json`文件。 - 训练日志见logs目录。 - `my_data_process.py`对包含原始pcap文件的数据集进行预处理,最终在datasets目录下对应位置生成tsv文件。 - scripts目录下为运行和评测脚本。如 `bash scripts/fine-tune.sh [DATASET]`开始fine-tune训练。其中 `[DATASET]`替换成数据集名称(datasets目录下)。运行结果将输出logs和results目录对应数据集的目录下。`eval.sh`可用于输出模型分类score。 - CSTNET-TLS1.3、ISCX-VPN-app、ISCX-VPN-service、USTC-TFC使用原仓库提供的预处理好的数据,CrossPlatform(android)、CrossPlatform(ios)、ISCX-Tor没有提供相关预处理数据,因此是从原始数据集处理得来。 - CrossPlatform(android)从原数据集中选取了china地区的89个安卓应用(其余数据包过小)。CrossPlatform(ios)从原始数据集中选取了us地区的65个iOS应用(中国地区应用较少)。ISCX-Tor2016数据集原本按照service划分,但原论文将其用于application分类,因此手动提取了数据集中包含的16个应用(原论文具体划分未知)。 - 原始论文epoch设置为10。在复现中,根据训练的实时表现,缩减了如下数据集的epoch:CrossPlatform(android)的epoch为6,CrossPlatform(ios)的epoch为5,ISCX-Tor的epoch为3。其余数据集epoch均为10。 【更新】 - CIC-IoT数据集:按照YaTC论文选取了10个类别,其中包括3个attack类别和7个正常类别。每类最多选择500个flow,每个flow取前5个packet,每个packet最多取128字节。 - ISCX-Tor数据集:重新按照flow方式进行划分,分类目标从app识别更改为service识别。由于所有pcap文件中含有的flow很少,基本都是两个地址之间的长时间通信,因此将每条很长的flow按照5个packet一组重新划分成粒度更小的flow用于训练和测试。 ## YaTC与ET-BERT的实验设置 1. 预训练使用的数据不同。YaTC使用ISCX-VPN、ISCX-Tor、USTC-TFC、CIC-IoT这四个数据集进行预训练,但是又在这几个数据集上进行了fine-tune,并且用于fine-tune的训练集和用于预训练的数据完全重合(是否合理??)。ET-BERT的预训练语料来自于ISCX-VPN、CIC-IDS和自己收集的CSTNET-TLS1.3,而在其他数据集上进行fine-tune和测试(ISCX-VPN除外)。个人认为后者更合理。 2. YaTC对ET-BERT的复现结果普遍比ET-BERT原论文结果和我的复现结果低,最可能的原因是: 1. YaTC作者没有使用ET-BERT提供的预训练模型参数,而是和YaTC一样在上述四个数据集上重新进行了训练,其数据量应该远小于ET-BERT作者用于预训练的语料量,这应该是主要原因。 2. YaTC作者还比较了YaTC、ET-BERT、PERT在不经过预训练直接监督学习的结果,这就排除了预训练数据不同的影响,但是对ET-BERT的复现结果依然低于我的复现结果。 3. 以上说明,YaTC作者在fine-tune阶段对数据集的预处理也不同。首先,在ISCX-VPN、ISCX-Tor、CrossPlatform上,YaTC和ET-BERT对分类目标的定义都有差别。同时,YaTC的作者在复现ET-BERT时,对header头的处理、数据的截断、无关协议的清理、session的划分、flow数目的确定可能存在差异。 4. 最好能知道YaTC作者是如何选择预训练数据、以及处理fine-tune数据集的。 3. 在将pcap转化为用于训练的数据上,YaTC和ET-BERT其实差异不大。只是YaTC规定了单个packet的header和payload的长度(80字节和240字节),ET-BERT没有规定header长度(但包含了传输层和应用层的header,剔除port,并不是像YaTC论文中说的ET-BERT只使用了payload数据),同时payload长度最大只为128字节。两者都是将flow的前5个packet进行堆叠连接。 4. 但是使用CV方法的YaTC模型参数量远小于ET-BERT(按照YaTC论文,为1.8M v.s. 132M)。 5. 在数据集的选择上,USTC-TFC为最简单的数据集,ISCX-Tor为最难的数据集(但没有人给出预处理的准则)。大部分选择的数据集都来自[Canadian Institute for Cybersecurity](https://www.unb.ca/cic/)。可以考虑选择其中的其他数据集。 6. 考察模型的泛化能力是很重要的一环。在上述数据集进行fine-tune时,尽管训练集和测试集不重合,但是数据集中的数据包同质化严重,同一类别的数据包使用的协议、header数据、字节数目基本相同,很难测试出模型的泛化能力。 7. **综上,为了比较YaTC、ET-BERT、PERT和我们的模型,需要保持以下条件相同:使用的预训练数据相同、对fine-tune数据集的预处理相同,并且fine-tune数据集不应该出现在预训练语料中。** ## 数据集处理流程 ### 1.fine-tune的下游任务数据集处理 - 先将数据集中的pcap按照label重新组织,同一个类别的pcap放在同一个目录下(名称为label名)。所有label目录放在{DATASET}-pcap目录下(或{DATASET}-pcap-flow,表示用于划分为session,否则将划分为packet)。 - 在{DATASET}-pcap目录下使用 `data_process/prepare_dataset.py`,完成重命名、大文件截断、协议清理、按session或packet划分等流程。 - 再使用 `my_data_process_{flow/packet}.py`生成对应的npy和tsv数据集,供fine-tune使用。 ### 2. 用于pre-train的数据集处理 - 先使用 `vocab_process/main.py`,从原始pcap中生成语料 `burst.txt`以及词汇表 vocab.txt。 - 再使用 `preprocess.py`生成 `dataset.pt`数据集文件,供pretrain使用。