【论文解读】(如何微调BERT?) How to Fine-Tune BERT for Text Classification?

news2024/11/24 11:40:45

文章目录

  • 论文信息
  • 1. 论文内容
  • 2. 论文结论
    • 2.1 微调流程
    • 2.2 微调策略(Fine-Tuning Strategies)
    • 2.3 Further Pretrain
  • 3. 论文实验介绍
    • 3.1 实验数据集介绍
    • 3.2 实验超参数
    • 3.3 Fine-Tuning策略探索
      • 3.3.1 处理长文本
      • 3.3.2 不同层的特征探索
      • 3.3.3 学习率探索(灾难性遗忘探索)
      • 3.3.4 不同层使用不同学习率
    • 3.2 Further Pretraining探索
      • 3.2.1 step次数
      • 3.2.2 使用交叉领域(Cross-Domain)数据进行Further Pretrain
      • 3.2.3 比较不同的模型与BERT微调策略
    • 3.3 多任务微调探索
    • 3.4 小样本探索
    • 3.5 对BERT-Large使用Further Pretraining
  • 4. 总结

论文信息

论文地址:https://arxiv.org/pdf/1905.05583.pdf

论文年份:2019年05月

论文代码: https://github.com/xuyige/BERT4doc-Classification

论文引用量:1191 (截止2023-04-28)

论文阅读前提:熟悉NLP、深度学习、Transformer、BERT、多任务学习等。

1. 论文内容

现在NLP任务方式大多都是对BERT进行微调。例如:我们要做一个电影评论情感分类的任务,那就可以直接把BERT拿过来,换上自己的分类头,然后使用电影评论的数据集进行训练,最终就可以得到一个还不错的模型。(这个过程称为微调(fine-tune)

然而,目前针对“如何对BERT进行微调会比较好”的研究不多(例如学习率怎么选择、应该选择怎样的策略等等)。所以,该论文就使用分类任务对“如何微调BERT”进行了研究,这也是论文的题目“ How to Fine-Tune BERT for Text Classification?”。

2. 论文结论

该论文通过实验,得出了许多结论,可以供我们在使用BERT做特定任务时进行参考。

2.1 微调流程

作者通过实验得出最好的微调流程为:

在这里插入图片描述
最好的微调流程需要三步:

  1. Further Pre-training(更多的预训练):对BERT进行更多的预训练。该步骤使用和BERT相同的无监督任务MLM和NSP任务即可,但注意需要使用目标任务领域的数据集。例如:我们的任务是“电影评论情感分类”,那么我们第一步应该是收集大量的电影评论(无需带标签),然后使用MLM和NSP任务对BERT进行无监督训练。
  2. Multi-Task Fine-Tuning(多任务微调):使用多任务对BERT进行微调,即把多个相关的任务放在一起同时让BERT学习。例如:我们的任务是“电影评论情感分类”,为一个三分类任务(消极、中性和积极)。同时我们还有两个相关的任务“电影类型分类(12个类别)”和“电影评分预测(5分类)”,此时我们的模型就为BERT加三个分类头(分别为3/12/5分类),然后将这三个任务的数据混在一起同时给模型学习。学习过程中根据当前数据选择应该用哪个分类头。
  3. Single-Task Fine-Tuning(单任务微调):对BERT进行单任务微调。就是直接使用最终的任务进行有监督学习。例如:我们的任务是“电影评论情感分类”,那么我们就使用带标签的电影评论数据集对BERT进行训练。

大多数人可能都忽略了前两步,直接使用“单任务微调”的方式训练BERT,最终的结果总是差那么点意思。

2.2 微调策略(Fine-Tuning Strategies)

作者探究了微调BERT的一些基本的策略,例如学习率、长文本处理方式等。最终得出了以下结论:

  1. 最好的长文本的处理方式是“head+tail”。即当输入文本长度大于510时,截取文本开头128个字符和文本末尾382个字符效果最好。(BERT最多接收512个token,算上“开始”和“结束”标记,最多接收510个token)
  2. 最好的特征表示就是最后一层的特征。BERT有12层Transformer Encoder,每层的特征都不太一样,使用最后一层的特征效果最好。(这个结论不需要特别在意,正常BERT使用的就是最后一层的特征)
  3. 最好的学习率是 2 e − 5 2e-5 2e5,这样可以有效的避免“灾难性遗忘(Catastrophic Forgetting)”。(batch_size为32)
  4. BERT越靠近输入层的学习率应该越低,反之应该越高。衰减因子(decay factors)取0.95较好。即,对于第12层TransformerEncoder,学习率取 2 e − 5 2e-5 2e5,第11层取 ( 2 e − 5 ) ∗ 0.95 (2e-5) * 0.95 (2e5)0.95,第10层取 ( 2 e − 5 ) ∗ 0.9 5 2 (2e-5) * 0.95^2 (2e5)0.952,以此类推。

2.3 Further Pretrain

Further Pretain是指在正式使用目标任务训练BERT前,先使用该领域(In-domain)的数据对BERT进行无监督训练(训练BERT时用的MLM任务和NSP任务)。

例如:我们要训练一个电影评论情感分类模型,那么就是收集一堆无标签的电影评论数据,然后使用MLM和NSP任务对BERT进行无监督训练。

作者的得出的结论如下:

  1. 训练10w个step效果最好。(更新一次参数算一个step)
  2. 选择预训练数据集时,选择与目标任务相同领域(In-domain)的数据。例如:你的任务是情感分类,那么预训练时就选一些情感分类的数据集。
  3. 选择预训练数据集时,选择与目标任务相同分布的数据。例如:你的任务是电影评论情感分类,那么就选电影评论数据。如果你用外卖评论数据进行预训练,最终结果可能还不如不做预训练。
  4. 当训练数据较小(few-shot)时,使用Further Pretrain可以得到较好的结果。
  5. 对于BERT Large模型同样能得到以上结论。

上述就是论文得出的所有结论,接下来讲解论文中所做的实验,若不感兴趣,可以不看。

3. 论文实验介绍

3.1 实验数据集介绍

作者使用了7个数据集进行实验,共三种类型,分别为:情感分类(Sentiment Analysis)、问题分类(Question Classification)和主题分类(Topic Classification)。数据集如下表:

在这里插入图片描述

其中 IMDb 是二分类的电影评论情感分类, Yelp是商户评论情感分类(类似大众点评),Sogou News是中文数据集。

3.2 实验超参数

Further Pretrain BERT的实验使用的相关超参数如下:

  • BERT:BERT-base(hidden_size:768,12层Transformer,12个attention head)
  • batch size: 32
  • 最大句子长度(max squence length):128
  • 学习率:5e-5
  • train step: 10w
  • warm-up step: 1w

fine-tune BERT的实验使用的相关超参数如下:

  • batch size: 24
  • dropout: 0.1
  • Adam: β 1 = 0.9 , β 2 = 0.999 \beta_1=0.9, \beta_2=0.999 β1=0.9,β2=0.999
  • 学习率策略:slanted triangular learning rates(一种warmup的学习率策略)
  • base learning-rate: 2e-5
  • warm-up proportion: 0.1
  • epoch: 4

3.3 Fine-Tuning策略探索

3.3.1 处理长文本

BERT一次能够接收最长的token数量为512,算上开始结束这两个特殊的token,相当于一次能够接收510个token。

因此,对于那些token数超过510的文本,需要对其进行处理。作者实验了不同的处理方式,包括以下几种:

  • head-only:只用文本的前510个token。
  • tail-only:只用文本末尾的510个token。
  • head+tail:文本的前128token和文本末尾382个token。(根据经验选的)
  • Hierarchical methods:将长文本分成由510个token组成的小块,然后对每一块都喂给BERT,得到每一块的向量表示。最后将这些向量表示融合起来。作者使用了三种融合方式:
    • hier. mean: 平均池化。
    • hier. max: 最大池化。
    • hier. self-attention:使用自注意力的方式融合。

最终的结果如下表:

在这里插入图片描述

在IMDb和Sogou这两个数据集上,均为“head+tail”的方式效果最好。

3.3.2 不同层的特征探索

众所周知,BERT是由12层Transformer Encoder堆叠而成的,每一层的输出都是输入的特征向量表示,通常我们使用的是最后一层的输出作为输入的最终特征,然后将其送给分类头进行预测。

而作者在想,用最后一层的Transformer Encoder作为特征向量真的就最好吗?所以它就使用每一层的特征向量进行了实验,最终得到如下表结果:

在这里插入图片描述

实验代码在codes/fine-tuning/modeling_last_concat_avg.py

最终实验表示使用最后一层的Transformer特征效果最好,这和预期的一样。

TODO:论文中的 First/Last 4 Layers + concat/mean/max 表示什么意思我也不太清楚。论文没有解释,且提供的代码里也没有找到关于它们的影子。

3.3.3 学习率探索(灾难性遗忘探索)

灾难性遗忘(Catastrophic forgetting)是指预训练模型在学习新的知识后把过去老的知识给忘了。这是迁移学习中常见的一个问题。

通常该问题是因为学习率太大引起的。学习率太大会导致灾难性遗忘,学习率太小又会无法学会新的知识,所以要学选择一个合适的学习率。

作者在IMDb数据集上选择不同学习率进行了实验:

在这里插入图片描述

最终作者得出结论:当学习率为2e-5时,模型收敛最好,且不容易出现灾难性遗忘问题。

3.3.4 不同层使用不同学习率

通常,越靠近输出层的网络应使用较高的学习率,所以作者探索了一下应该如何为BERT的每一层设计学习学习率。

作者使用的方式为根据衰减因子 ξ \xi ξ 进行学习率逐层衰减。例如,学习率取2e-5,衰减因子取0.95,则第12层的Transformer使用 2e-5 的学习率,第11层学习率为 (2e-5)*0.95 ,第10层为 (2e-5)*0.952,第9层为 (2e-5)*0.953,依次类推。

作者的实验结果如下:

在这里插入图片描述

实验结论为:学习率取2e-5,衰减因子为0.95时效果最好。

3.2 Further Pretraining探索

作者探索了如何进行Further Pretrain效果最好。

3.2.1 step次数

既然要对BERT进行更多的预训练,那训练多少次合适呢?作者在IMDb数据集上进行了实验:

在这里插入图片描述

结果显示,当step数为10w时,效果最好。

BERT-ITPT-FiT为“BERT +withIn-Task Pre-Training + Fine-Tuning”,意思是使用原始的BERT进行Further Pretraining,然后再进行fine-tune。

3.2.2 使用交叉领域(Cross-Domain)数据进行Further Pretrain

作者尝试了若Further Pretrain时使用交叉领域的数据会不会好一点呢?

作者的数据集有三种任务:情感分类、问题分类和主题分类。他将这三种看做是不同领域(different domain)然后进行实验。

实验结果如下表:

在这里插入图片描述
该表的意思如下:

  • 数字表示错误率,错误率越低表示模型表现越好。
  • 第1行第1列的“4.37”表示使用IMDb数据进行Further Pretain后在IMDb数据集上的表现。
  • 第2行第1列的“5.24”表示使用Yelp P.数据集进行Further Pretrain后在IMDb数据集上的表现
  • 第4行第1列的“4.88”表示在所有的情感分类数据集(IMDb+Yelp P.+Yelp F.)上进行Further Pretrain后在IMDb上的表现
  • 第11行第1列的“5.18”表示使用所有数据集进行Further Pretrain后在IMDb上的表现
  • 最后一行第1列的“5.40”不进行Further Pretrain,在IMDb上的表现。
  • 其他数据同理

从上表可以得出如下结论:

  1. 使用同一领域(In-domain)的数据集对BERT进行Further Pretrain效果会变好。(图上的加粗字体基本都在对角线上)。
  2. 使用交叉领域(Cross-domain)的数据集Further Pretrain效果不佳。
  3. 进行Further Pretraining时尽量选择数据是同一分布的。例如:使用Yelp数据进行Further Pretraining后用在IMDb上的效果比较差,原因可能就是因为他们一个是商户评论,一个是电影评论,数据分布差的比较大。

3.2.3 比较不同的模型与BERT微调策略

作者比较了一些其他模型和使用不同BERT训练策略的结果,如下表:

在这里插入图片描述

数字表示错误率,越低越好。Avg为相比BERT-Feat,错误率下降的平均比率。

其他模型就不介绍了,不是重点。作者使用的BERT策略如下:

  • BERT-FeatBERT as Features. 应该是指不训练BERT,只训练后面的分类头。
  • BERT-FiTBERT+FineTuning. 对BERT进行微调。应该是直接使用目标任务的数据进行单任务训练
  • BERT-ITPT-FiTBERT+withIn-Task Pre-Training+Fine-Tuning。首先对BERT使用目标任务的数据进行Further Pretrain,然后再使用目标任务进行微调。例如:IMDb先使用IMDb的数据进行Further Pretrain,再使用IMDb数据进行FineTune。
  • BERT-IDPT-FiTBERT + In-Domain Pre-Training + Fine-Tuning。先使用In-Domain的数据集进行Further Pretrain,然后再使用目标任务数据进行单任务训练。例如:IMDb先使用情感分类任务的数据(IMDb+Yelp P+Yelp F)进行Further Pretraining,然后在使用IMDb数据进行FineTune.
  • BERT-CDPT-FiTBERT + Cross-Domain Pre-Training + Fine-Tuning。先使用Cross-Domain的数据进行Further Pretrain,然后再使用目标任务数据进行单任务训练。例如:IMDb先使用问题分类的数据(TREC+Yah A+AG)的数据进行Further Pretraining,然后在使用IMDb数据集进行FineTune。

最终的出的结论为:BERT-IDPT-FiT效果最好。这和上面的实验结论也一致。

3.3 多任务微调探索

通常,多任务训练可以让模型学会更加通用的特征表示,使模型的泛化性更强,提高模型的性能。

作者也对多任务进行了探索。作者使用IMDb、Yelp P、AG、DBP四个数据集进行多任务学习。

多任务就是同时学习多个任务。对于作者的实验来说,就是使用一个BERT,但为四个数据集分别使用不同的分类头(它们的类别数不一样,当然就算一样也肯定是不同的分类头),然后将四个数据集的数据混到一块进行学习。

最终的结果如下表:

在这里插入图片描述

  • BERT-MFiT-FiTBERT+Multi-task Fine-Tuning+FineTuning。即先使用Multi-task对模型进行FineTune,然后再使用目标任务对模型进行FineTune。例如:对于IMDb来说,就是先使用“IMDb+Yelp P+AG+DBP”数据集进行MultiTask训练,然后再使用IMDb数据集进行FineTune。
  • BERT-CDPT-MFiT-FiTBERT + Cross-Domain Pre-Training +Multi-task Fine-Tuning+ Fine-Tuning。即先进行Cross-Domain的Further Pretrain,在进行MultiTask训练,最后再进行单任务训练。例如,对于IMDb来说,就是先使用“IMDb+Yelp P+AG+DBP”数据集对BERT进行Further Pretraining,然后再使用“IMDb+Yelp P+AG+DBP”对模型进行MultiTask训练,最后在使用IMDb数据集进行FineTune。

这里为什么没有“BERT-IDPT-MFiT-FiT”?这是因为作者选用的这四个数据集属于Cross-Domain的,如果要做In-Domain的实验,就不是这组数据了。作者没做相应的实验。

作者相应的部分实验代码如下(codes/fine-tuning/modeling_multitask.py):

class BertForSequenceClassification(nn.Module):
	...
    def __init__(self, config, num_labels):
        super(BertForSequenceClassification, self).__init__()
        self.bert = BertModel(config)
        self.dropout = nn.Dropout(config.hidden_dropout_prob)
        self.classifier_1 = nn.Linear(config.hidden_size, 2)  # IMDb数据的分类头
        self.classifier_2 = nn.Linear(config.hidden_size, 2)  # Yelp数据的分类头
        self.classifier_3 = nn.Linear(config.hidden_size, 4)  # AG数据的分类头
        self.classifier_4 = nn.Linear(config.hidden_size, 14) # DBP数据的分类头
        ...

    def forward(self, input_ids, token_type_ids, attention_mask, labels=None, dataset_labels=None):
    	# 训练过程中,每个step过来的一批数据是IMDb、Yelp P、AG、DBP的其中一个。
        _, pooled_output = self.bert(input_ids, token_type_ids, attention_mask)
        pooled_output = self.dropout(pooled_output)
        # 若数据是IMDb,则使用classifier_1分类头
        if dataset_labels[0].item()==1:logits = self.classifier_1(pooled_output)
        # 若数据是Yelp,则使用classifier_2分类头
        if dataset_labels[0].item()==2:logits = self.classifier_2(pooled_output)
        # 若数据是AG,则使用classifier_3分类头
        if dataset_labels[0].item()==3:logits = self.classifier_3(pooled_output)
        # 若数据是DBP,则使用classifier_4分类头
        if dataset_labels[0].item()==4:logits = self.classifier_4(pooled_output)
        if labels is not None:
            loss_fct = CrossEntropyLoss()
            loss = loss_fct(logits, labels)
            return loss, logits
        else:
            return logits

3.4 小样本探索

通常我们的目标任务的训练数据集都是比较少的,作者针对这种情况做了对比实验。

作者的实验为:只使用IMDb数据集的一部分(例如10%),然后进行BERT-FiTBERT-ITPT-FiT的对比实验。

结果如下图:

在这里插入图片描述

从结果中可以看到,但只取0.4%的IMDb数据集时,做withIn-task Pretraining和不做差距还是挺大的。不过随着数据集的增大,差距越来越小,不过总归是有差距。

实验结论为:当训练数据较小(few-shot)时,使用Further Pretrain可以得到较好的结果。

3.5 对BERT-Large使用Further Pretraining

上面的实验已经证明了对BERT-base使用Further Pretraining是有效果的,但对BERT-Large是否还有同样的效果呢?作者也做了实验,实验结果如下表:

在这里插入图片描述

从实验结果看,BERT-Large增加ITPT后同样可以减小错误率。

4. 总结

作者中了一系列实验总结出微调BERT的一套方法论,即先进行In-Domain的Further Pretraining,然后进行多任务学习,最后再使用目标任务进行单任务微调。并且作者还对这些步骤的长文本处理、学习率选择等做了一些实验指导。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/478920.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Baumer工业相机堡盟相机如何使用ROI感兴趣区域功能( PARTIAL SCAN ROI功能的优点和行业应用)(C#)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具…

利用 ChatGPT4 回复的 markdown 文本生成 ppt

本篇博文不涉及账号以及基础网络知识,大伙可以自动搜索。 比如我最近要分享一篇关于 TCP 的分享,那么我可以设置如下 Prompt 我最近要做一篇关于 tcp 入门的 ppt 分享,帮我列出大纲以及需要注意的事项? 接下来就是 ChatGPT4 给…

RocketMQ的学习历程(3)----RocketMQ部署(docker版)

RocketMQ部署(docker版) 1. 部署开始前的准备 一台linux机器。(我这里使用的是阿里云的一个centos7的服务器)docker环境以及相关的简单知识。一些计算机网络的简单知识。(可以帮你透彻了解为什么这么部署) docker部署十分简单快捷…

JAVA85-135

JAVA85-135 字符集详解解码与编码方法 字符流FileWriter 拷贝文件夹字节缓冲流拷贝文件(一次读写一个字节)字节缓冲流拷贝文件(一次读写一个字节数组) 字符缓冲流控制软件运行次数 序列化流反序列化流/对象操作输入流打印流字节打…

macOS Monterey 12.6.5 (21G531) OC 0.9.1 / Cl 5151 / PE 三分区原版黑苹果镜像

苹果近期发布了 macOS Big Sur 11.7.6 和 macOS Monterey 12.6.5 更新,本次更新重点修复了标记为 CVE-2023-28206 的漏洞,在 macOS 13.3.1 更新中已修复,推荐大家安装升级。 镜像下载: macOS Monterey 12.6.5 (21G531) 三分区原版…

【面试】嵌入式C语言题目整理

【面试】嵌入式C语言题目整理 描述内存四区。 内存四区分为:代码区、静态区、堆区、栈区 代码区就是用来存放代码的。 静态区用来存放全局变量、静态变量、常量(字符串常量、const修饰的全局变量)。 堆区中的内存是由程序员自己申请和释放的&…

《高性能MySQL》读书笔记

《高性能MySQL》 第一章 MySQL架构与历史第二章 MySQL基准测试第三章 服务器性能剖析第四章 Schema与数据类型优化第五章 创建高性能的索引第六章 查询性能优化第七章 MySQL高级特性第八章 优化服务器设置第九章 操作系统与硬件优化第十章 复制第十一章 可扩展的MySQL第十二章 …

sed进阶之多行命令

shell脚本编程系列 前面使用sed编辑器的基础命令时,所有的命令都是针对单行数据执行操作的。在sed编辑器读取数据流时,它会根据换行符的位置将数据分成行。sed编辑器会根据定义好的脚本命令,一次处理一行数据,然后移到下一行重复这…

numpy稀疏矩阵拼接

今天我发现numpy中的array拼接时dense矩阵和sparse矩阵拼接使用的形式是不一样的,测试如下 普通矩阵拼接 import numpy as npaa np.random.randn(4,3) bb np.ones((4,3)) ccnp.c_[aa,bb] cc.shape结果如下 sparse矩阵拼接 from scipy.sparse import *row [1,1,…

DC-7通关详解

信息收集 漏洞发现 web提示我们说弱口令可能不会奏效 那么我们就先不考虑弱口令 searchsploit搜payload打打看,无果 看别人的wp知道了是通过web左下角的这个玩意去github搜 在这个仓库用户唯一的仓库中看config.php 发现账号密码 尝试后台和ssh登录 ssh登录成功 提权 当前…

一款免安装、多平台兼容的 拾色器(Color Picker)

文章目录 场景需求场景需求 Chrome Google DevTools 中的 拾色器 用法其他浏览器 场景需求 场景 我是一个前端开发人员,我写好的界面给老板过目。老板说有个地方颜色需要调整,然后发我一张图片指了指说就用这个位置这样的红色,我看挺合适。…

数字化时代 | 服务数字化创新和转型全景视图

本文我全面介绍一下数字化时代,服务将往何处去,将如何设计和推进数字化创新和转型。 Figure 1 服务创新和转型全景视图 如上图所示,在我CRM3.0理论体系中,服务创新和转型涉及到四个层面的内容: 服务定位和目标&#…

Python数据分析script必备知识(三)

Python数据分析script必备知识(三) 1.单个文件,双个文件,三个文件的读取方式 新建1.txt文件,2.txt文件,3.txt文件,效果如下 执行代码 """ 单文件,双文件,三文件的读取方式Python的读写 file.read() ———— 一次性读取整个文件内容,推荐使用re…

【信息安全案例】——系统软件安全(学习笔记)

📖 前言:操作系统是管理系统资源、控制程序执行、提供良好人机界面和各种服务的一种系统软件,是连接计算机硬件与上层软件和用户之间的桥梁。因此,操作系统是其他系统软件、应用软件运行的基础,操作系统的安全性对于保…

React框架课时二认识项目的结构目录一

1react项目的目录的内容信息 ├── README.md 使用方法的文档 ├── node_modules 所有的依赖安装的目录 ├── package-lock.json 锁定安装时的包的版本号,保证团队的依赖能保证一致。 ├── package.json ├── public 静态公共目录 └── src 开发用的源代码目录 2 图…

英伟达Jetson NX,AI配置。安装SDK Components

目录 0.前言 1.准备 2.安装 3.检验 4.总结 0.前言 五一了,劳动节劳个动。推荐一首歌《花房姑娘》。 1.准备 接上篇博客英伟达Jetson NX套件刷机 算是完整配置英伟达这个Jetson AI。说来也是强,把GPU的能力用在了算力上,CUDA可以的。 查看…

SqlServer数据库中文乱码问题解决方法

这个问题在网上找了很多资料都没找到真正解决问题的办法,最终去了官网,终于找到问题的答案了,整理出来做个记录。 问题描述: 项目中遇到一个问题,sqlserver中的数据是ok的,结果保存到mysql中是乱码&#…

PostgreSQL数据库

0 安装 我使用的操作系统为Ubuntu。 安装命令: sudo apt-get update sudo apt-get install postgresql postgresql-client 进入postgres: sudo -i -u postgres psql 退出命令: \q PostgreSQL启动服务等: sudo /etc/init.d/postgr…

KalLinux安装burpsuite(超详细)

注意事项 1.注意linux位数 安装jdk之前先输出uname -a,看看kali linux是32位的还是64位,例如此处我的kali是32位的,因此需下载的是32位的jdk 2.jdk版本 jdk版本最好是oracle的,若使用的是openjdk很可能会出现burpsuite闪退现象…

还在因为指针的释放问题而烦恼吗?快来看下C++11智能指针shared_ptr

智能指针是这样一种类,即其对象的特征类似于指针。例如,智能指针可以存储new分配的内存地址,也可以被解除引用。 因为智能指针是一个类对象,因此它可以修改和扩充简单指针的行为。例如,智能指针可以建立引用技术&#…