代码大模型的应用及其安全性研究
写在最前面 一些想法 大型模型输出格式不受控制的解决方法 大模型介绍 (很有意思)GPT 模型家族的发展 Chatgpt 优点 缺点 GPT4 其他模型 补充:self-instruct合成数据 Code Llama 代码大模型的应用 (第一次理解清楚hh,这图好清晰,学长的讲解也好好)“预训练-微调”范式和“预训练-prompt”范式 课堂讨论:预训练一般是无监督的,一般为下一个token预测 提示工程——漏洞检测(召回率上升,精确率几乎没变) 基本提示 增强提示1 思维链提示(角色扮演、API和DF只加一个效果更好) 提示工程——漏洞修复 增强提示2 提示工程——代码摘要(效果不行、给出的原因:单词不一样,但表述更好) 学长自己做的“微调——漏洞检测”评估实验(和参数量呈正比关系) 代码大模型的安全问题 模型窃取攻击(API和网页接口) 数据窃取攻击 对抗攻击(用途:漏洞隐藏) 后门攻击(加触发器+标签翻转) 参考文献写在最前面
本文为邹德清教授的《网络安全专题》课堂笔记系列
的文章,本次专题主题为大模型。
第一次课上,文明老师的博士生杜小虎学长进行了代码大模型的应用及其安全性研究
的相关介绍
将我之前不太明白的一些概念解释得深入浅出,醐醍灌顶
另有部分个人不成熟的理解,欢迎交流
后面如果有进一步理解,将对文章进行更新
一些想法
大型模型输出格式不受控制的解决方法
大型模型输出格式不受控制
的情况,一些可能的解决方法:
大模型介绍
国内外生成式大模型研究现状总结
GPT 系列模型的发展历程总结
(很有意思)GPT 模型家族的发展
GPT 模型家族的发展从 GPT-3 开始分成了两个技术路径并行发展 :
1、一个路径是以 Codex 为代表的代码预训练技术
2、另一个路径是以 InstructGPT 为代表的文本指令(Instruction)预训练技术。
但这两个技术路径不是始终并行发展的,而是到了一定阶段后(具体时间不详)进入了融合式预训练的过程,并通过指令学习(Instruction Tuning)
、有监督精调(SupervisedFine-tuning)
以及基于人类反馈的强化学习(Reinforcement Learning with HumanFeedback,RLHF)
等技术实现了以自然语言对话为接口的 ChatGPT 模型。
GPT 演化图,图源How does GPT Obtain its Ability? Tracing Emergent Abilities of Language Models to their Sources
Chatgpt
优点
零样本泛化能力、参数量大、逐步推理
缺点
输出格式不受控制(感觉是目前所有生成式模型的通用问题?)
训练一次时空复杂度高,导致:时效性差、成本高昂
GPT4
主要引入多模态,并达到SOTA性能
其他模型
由于个人目前没有涉猎相关研究,待后续补充想法
斯坦福Alpaca:self-instruct、instruction数据上监督微调
清华ChatGLM:双语能力
补充:self-instruct合成数据
self-instruct是一种将预训练语言模型与指令对齐的方法。 可以通过模型自己来生成数据,而不需要大量的人工标注。
参考:https://blog.csdn.net/dzysunshine/article/details/130390587
Step1:通过模型生成新的指令;
根据人工设计的175个任务,每个任务都有对应的(指令,输入,输出)或(指令,输出);使用模型生成新的指令;
Step2:对模型生成的指令进行判断(指令是否是一个分类任务);
Step3:根据Step2的判断结果,给出不同的输出
如果是分类任务,就通过模型输出 Class_label 和 Input(Output-first);
如果不是分类任务,就通过模型输出 Input 和 Output(Input-first)。
Step4:过滤及后处理
对上述模型生成的数据进行过滤和后处理,将经过过滤和后处理的数据添加到种子池中。
对于以上4个步骤进行不断循环,直到种子池有足够多的数据(通常会设定一个具体的参数,比如:52000),生成过程停止。
Code Llama
所有 Code Llama 模型
均使用 Llama 2 模型权重进行初始化,并使用来自代码密集数据集的 500B token 进行训练.Code Llama Python 模型
从 Llama 2 模型初始化,并使用 Code Llama 数据集的 500B token 进行训练,并使用 Python 数据集进一步专门针对 100B token训练。Code Llama - Instruct 模型
基于 Code Llama 并使用额外的5B token 进行了微调,可以更好地遵循人类指令。Unnatural model
.。为了进行比较,它们还对 Code Llama - Python 34B 对 15,000 个非自然指令进行了微调。Meta没有发布这个模型,但观察到 HumanEval 和 MBPP 的明显改进,这表明可以通过一小组高质量编码数据来实现改进。
代码大模型的应用
(第一次理解清楚hh,这图好清晰,学长的讲解也好好)“预训练-微调”范式和“预训练-prompt”范式
神经网络需要大量数据的训练才能使得模型的效果更好,但训练是非常漫长的过程。我们可以把整个训练过程裁成两个部分:
开始的占比最大的部分称为预训练
,后面的占比较小的部分称为微调
随着的着技术的发展,对于很多不同的任务,可以共享同一个预训练过程和不同的微调过程。这就是“预训练-微调”范式,
大模型还给出了另一个范式,“预训练-prompt”
课堂讨论:预训练一般是无监督的,一般为下一个token预测
(马兴宇学长补充,预训练一般是无监督data,但可以添加部分监督data)
微调可以理解为对齐任务,以符合人类期望
补充:prompt为提示工程
提示工程——漏洞检测(召回率上升,精确率几乎没变)
基本提示
(单词积累:漏洞vulnerability、脆弱(或者翻译为存在漏洞更合适?)vulnerable)
写该漏洞是否包含在Yes/no格式的代码中: write whether the vulnerability is contained in the code in the Yes/no format:
下面的功能包含一个漏洞写在Yes/no格式和为什么? does the following function contain a vulnerability write in Yes/no format and why?
判断该函数是否在Yes/no格式下存在漏洞: tell whether this function is vulnerable in the Yes/no format:
写这个函数是否脆弱: write whether this function is vulnerable:
增强提示1
你是一个提示优化者。 You are a prompt optimizer.
请优化以下提示: Please optimize the following prompt:
“你是智能合约的漏洞检测器。 “You are a vulnerability detector for a smart contract.
请检查此合同中的以下九种漏洞:[vULs]。 Please checkfor the following nine types of
vulnerabilities in this contract: [vULs].
让我们一步一步来思考。 Let’s think step by step.
智能合约的源代码如下:[输入]。 The source code for the smart contract is asfollows:
[Input].”
没有问题。 No problem.
我的优化提示如下: My optimized prompt is as follows:
您是一个智能合约漏洞检测器,请分析提供的以下9个漏洞的源代码:[vULS]。 “You are a smart contract vulnerability detector, please analyze theprovided source code for the following nine vulnerabilities: [vULS].
一步一步仔细思考。 Think step by step carefully.
合同源代码:[输入]。” The contract source code: [Input]."
思维链提示(角色扮演、API和DF只加一个效果更好)
请描述给定代码的意图。 Please describe the intent of the given code.[CODE].
我想让你扮演一个漏洞检测系统。 I want you to act as a vulnerability detection system.
上面的代码有bug吗? Is the above code buggy?
只回答是或否。 Only answer Yes or No.
下面是你可以使用的API调用序列/数据流信息:[API描述]/[DF描述]。 Here is its API call sequence/data flow information that you may use: [API description]/[DF description].
提示工程——漏洞修复
增强提示2
模板:下面的代码是为一个训练在[Y]上的[X]问题设计的。 Template: The following code is designed for a [X] problem trained on [Y].
请修理它以便[Z]。(代码)
Please repair it in order to [Z].[Code]
示例:下面的代码是为在Iris数据集上训练的分类问题而设计的。 Example: The following code is designed for a classification problem trained on Iris dataset.
为了提高精度,请修理一下代码。 Please repair it in order to improve the accuracy.[Code]
对话:修错了。 Dialogue: The repair is wrong.
故障可能发生在以下位置:[Loc]。 Faults may happen in the following locations:[Loc].
请修理一下。 Please repair it.
提示工程——代码摘要(效果不行、给出的原因:单词不一样,但表述更好)
这个工作,效果肉眼可见的差hh
学长自己做的“微调——漏洞检测”评估实验(和参数量呈正比关系)
学长是用A800完成的实验
补充:A100比A800更好,但都是80G的
闭源api接口,微调差不多60刀一次
代码大模型的安全问题
模型窃取攻击(API和网页接口)
模型窃取
指的是攻击者依靠有限次数的模型询问,从而得到一个和目标模型 的功能和效果一致的本地。这类攻击的性价比非常高. 因为 攻击者不需要训练目标模型所需的金钱、时间、脑力劳动的开销,却能够得到一个原本花费了大量的时间、金钱、人力、算力才能得到的模型。由于 ChatGPT 和GPT4 的模型参数很大并且功能十分广泛,要完整窃取其整个模型是具有极大困难的。
但是攻击者可以只窃取其某一部分的能力,例如窃取的模型在关于金融领域的知识上能够与 ChatGPT/GPT4 的能力相一致,就可以免费使用 ChatGPT 和GPT4 的能力。特别是在现在 ChatGPT 呈现专业化应用的情况下,具有某一领域中强大能力的模型是受人追捧的。并且 ChatGPT 已经开放了 API 的使用,这更为模型窃取提供了询问入口。
数据窃取攻击
数据窃取攻击
指的是通过目标模型的多次输出去获取训练过程中使用过的数据的分布。如果攻击者能够知晓 GPT 模型训练过程中使用过的数据是哪些,就有可能会造成数据隐私损害。
在此之前研究者就发现人工智能模型使用过程中产生的相关计算数据,包括输出向量、模型参数、模型梯度
等,可能会泄露训练数据的敏感信息。这使深度学习模型的数据泄露问题难以避免。
例如,
1、模型逆向攻击,攻击者可以在不接触隐私数据的情况下利用模型输出结果等信息来反向推导出用户的隐私数据;
2、成员推断攻击,攻击者可以根据模型的输出判断一个具体的数据是否存在于训练集中。
ChatGPT 和 GPT4 虽然没有输出向量等特征因素,但是由于其模型结构,训练方式的一部分已经被人所知,并且开放了 API 接口来访问,因此针对 ChatGPT 和 GPT4 的数据逆向攻击已经具有相当威胁。
Bard承认自己是GPT3
对抗攻击(用途:漏洞隐藏)
大模型鲁棒性差
标识符(label)随机替换对预训练模型容易产生误导,因而影响较大
后门攻击(加触发器+标签翻转)
代码搜索、死代码插入、修改标识符
代码风格转换
参考文献
生成式大模型安全与隐私白皮书,之江实验室
GPT-4 Technical Report,OpenAI