死灵淋巴药房-Necro Lymph Pharmacy
CFG
指一系列“ 的转化规则。可以发现,因为转化规则是一对多,所以一个词生成的内容完全上下文无关的。同时,一次转化呈树形结构,因此有对应的 parse tree。
虽然 CFG 是一对多的,但是总是可以通过设中间态让转移变成一对二或一对终态两种场合。此时 parsing tree 是二叉树。此乃 Chomsky Normal Form(CNF)。
依赖 CNF 和转化规则,我们可以对一句话设计 DP 方式来找到它的 parsing tree。
但是一句话的 parsing tree 可能不唯一。因此,我们可以通过统计学方法,对多种转移方式赋以不同的概率,得到 PCFG。对 PCFG 使用 DP 方法,可以生成若干种最可能的 parsing tree。
LSA
对于若干份文本,使用每个单词在各个文本中出现频率的频率向量作为 embedding。
- 问题很大!
使用 SVD 提取向量!
- 全都正交!
不直接取 近似,而是取一个稍微弱一点的近似,它即不再正交。
其它优化?
- 干掉某些出现过于频繁的单词。
HMM
对于文本 ,HMM 假设存在隐标签 ,且文本之间的依赖关系满足 Markov 链关系,即
若已知标签-标签转移矩阵和标签-文本转移矩阵,则通过 DP 即可简单计算上式。
不仅如此,通过把正向 DP 和反向 DP 拼接,我们可以计算一些例如
等信息,在下文中的 E-M 算法有用。
同时,若已知矩阵,还可以根据 计算最可能的标签 ,即
对其 DP 即可。DP 的算法被称作 Viterbi 算法。
现在思考如何得到矩阵。在有监督学习的场合,直接使用统计学方法,用频率替代概率不失为一种好的求出矩阵的方法;但是如果是无监督的场合呢?
迁移:GMM 算法,处理数据服从混合 Gauss 分布的场合。
是数据在 引导的 Gauss 分布下的密度函数。再加入一个 表示 Gauss 分布的权重(有 ),则有
初始时,对全体概率密度随机初始化,然后不断调整参数优化概率。
首先,计算每个点属于某个 Gauss 分布的后验概率
然后根据后验概率,可以依托某个公式更新 。交替两个步骤,最终参数会收敛。
现在对于参数 (由隐变量转移矩阵 、隐变量-显变量转移矩阵 、初始隐变量概率分布 构成),我们希望计算
其中,外面套一个 是为了接下来应用 Jensen 不等式。对于任一组 的一组 distribution ,有
特别地,更精细的分析依赖于 K-L 散度
其中后面的熵项 与参数 无关。因此,当 固定时,我们只需寻找最大化前一半的 即可。
任意时刻,我们可以根据当前的 生成 ,然后更新 。
在已知 并由其确定 后,新 对应的
其中,后者即为 HMM 的 DP,因此
两项求和直接 DP 即可。于是剩下就变成了优化由 决定的 的过程。
事实上,使用
即可更新。 也类似。
N-GRAM
核心公式
其它:
- 特殊 token
可以通过参数设置让某些结尾得不合常理的句子的权重小(例如, I go to.
的权重应该小于I go to school
)。 - 完全未出现的词汇会被赋以特殊 token
,虽然在更先进的 Language Model 中,被 subword unit(covered later) 替换了。 - 处理未出现 n-gram 的方法之一是 add-k smoothing,即 ;方法之二是同时使用多个 gram 的结果,为它们赋以 的系数,该系数可以调参;方法之三是 backoff,如果长 gram 未出现则换短 gram(但是短 gram 要乘以一个参数使其与长 gram 公平竞争)
Seq2Seq
假如要从序列到序列,例如机器翻译,则流程为:
- 把输入序列丢进 encoder,得到整句话的一个 encoding,然后作为 decoder RNN 的初始输入开跑。
但是这么搞,一整句话被浓缩为一个向量。
- attention is all you need!
对于某一时刻 ,考虑全体 encoder 状态 ,计算对齐分数
其中 是一个所有时刻共享的参数矩阵, 是 decoder 上一时刻的隐藏状态。对 求 softmax 得到 ,然后计算 ,将其与 一同作为 decoder 当前时刻的输入运行。
假设我们已经训好一个 LM,我们的目标是对输入语句 ,找到输出语句 满足
一种想法是,令
(Greedy 生成法)
这样做,每次仅仅找了局部最优解,在模型不是很牛的时候,这种做法也不是很牛。
DP 也没法跑。所以,我们使用 Beam Search!
思想:维护一堆备选的 beam,每次所有 beam 各自扩展一步,排序后选择概率最大的一批作为新 beam 继续跑。
数据增强。
现在,假设我们有少量 - 语言配好对的对,还有大量目标语言 中的孤立语句,如何构建 的模型?
答曰:首先先训一个 的反向模型,由此为 中的孤立语句生成 中的语句。
- idea:输入的 noise 问题不大,输出的 noise 问题很大!
其它语言分类模型!
CNN 实现 RNN 功能:对 embedding 跑 CNN。好处是不会出现梯度消失/爆炸问题。
在 RNN 里结合 parse tree。沿着 parse tree 以类似 DP 的方式聚合 embedding,甚至可以在 parse tree 里使用 LSTM。
GLUE benchmark 涵盖一众与自然语言理解(NLU)相关的任务。
ELMo 模型:多层双向 LSTM。
VAE-LM:
首先,生成一个向量,即描述输出句子的潜在向量,然后由该向量输出句子。训的同时也会得到一个 encoder,由句子得到潜在向量。
Tokenization
把不常见词直接一律看作
会有效果!
如何这么搞呢?
Byte Pair Encoding (BPE) Tokenization:
初始每个字符独立成 token。每次遍历中,寻找最常见的相邻对,把它们合并。重复若干次,直到字典大小达到阈值(如 50k)。
Transformer!
Transformer 由众多 block 组成。一个 block 大体由一个 self-attention 层和一个 feed forward 层构成。
每个 token 被分别左乘三个矩阵 得到询问向量、键值向量、值向量三个向量。然后对于每个 ,用它的 去点乘全体 ,除以 normalize 后,做 softmax 归一化,然后将全体 关于前述系数求组合得到 对应输出 。
可以用多个 attention 头提取不同角度特征,然后将它们暴力拼接得到最终 attention。
记得缝上 Layer Norm!
其中 是可学习的参数,用来调整最终输出的标准差和均值。
- 与 BatchNorm 有所不同。LayerNorm 针对整个序列,而 BN 针对 minimatch 中的所有数据。
NLP 的 batchsize 一般很小,因此 BN 不实用。
这么跑后,完全没有嵌入任何位置信息!
因此还要为每个位置加以特异的位置向量修饰!
Transformer 的学习往往需要一个 warmup 阶段:在若干步内逐渐提高 learning rate,然后再开始正式训练。
BERT!
BERT 是自监督模型!没有标注!
BERT 的两个模式:
-
Masked Language Modeling (MLM):把 的 token 标记为 {mask},然后让 transformer 去预测所有的 {mask} 原有的词语。
但是这么搞,对于那些未被 mask 的词语,训练效果不佳。
于是我们将 10% 的 {mask} 变成随机 token,10% 的 {mask} 复原!
-
Next Sentence Prediction (NSP):在一句话的中央插一个 {cls} 标签,然后判定前一半和后一半是否有顺承关系;后一半以 的概率被替换为随机句子。
效果不好!大家都不用了。
BERT 在应用时,会在后面拼上接口,在 downstream application 中作 fine tuning。
ELECTRA
首先对输入作一步 noise,利用小型网络(如比较烂的 MLM)把输入中的一些词替换为似是而非的其它词,然后 ELECTRA 网络判断每个词是否被替换。
- 比 BERT 更牛的一点是,BERT 仅能最好地处理被 {mask} 的 token,而 ELECTRA 可以处理全体 token。
Longformer
Transformer 的复杂度是文本长度的平方。
如果对于每个词,仅对其以及其周围宽度为 的滑动窗口应用 Transformer,则效率被大大提高。
并且,每过一层,如同多层 CNN 一样,实际感受域被放大了!
甚至,可以用多个感受域不同的 Head!让几个 head 以较大的 gap 选取感受点,几个以小 gap 选取感受点,几个仅收集周围的信息。
Autoregressive LM
Attention 是双向的。在训练它预测下一个词时,如何让它不接受将来的信息?把将来的信息 mask 即可。
注意,mask 应发生于 softmax 之前。
GPT 2
在大规模数据集上训好了模型!现在我们想作 zero-shot 的 downstream 应用,即不经 fine-tuning 直接跑下游应用,如翻译、总结等。
咋办呢?往前面加一个 prompt。
就算没有 finetuning,一个足够牛的大模型应该只凭借 prompt 就够用了。
但显然,我们的结果显示它还是不够牛。
但是图像显示,参数规模越大,效果越好!
所以我们应该增加参数量?
是的!所以 GPT 3 就出现了。
Open-ended Generation 指那些与故事续写类似的 task。与 translation 或 generation 不同:这两者更需要贴近输入,而 generation 更需要保证自洽。即,需要有对自身故事的记忆,而非先前所展示之与输入的对应。
因此,使用 top-K sampling algorithm,以 diversity 置换 quality。
现在,假设根据已知信息,我们生成下一个 token 是一个概率分布 ,其中将概率和 token 均重排使得其按照递减顺序 排布。然后,强制扔掉那些过烂的东西,例如令 的 均变成零,令新 。
特别地,如果 ,此时算法是 Greedy Sampling。
Beam Search 没有 diversity,但是这个 Sampling 是有 diversity 的。
MLE 死了吗?
MLE (Maximal Likelihood Estimation) 即
被认为有问题。这是因为其在训练时使用的是 Teacher Forcing,对于训练数据的每个前缀找到合适的下一个单词,而没有用模型自己生成的前缀训练;微小的误差会累计,最后生成的结果会越来越不可理喻。【这种误差被称作 Exposure Bias】
因此,MLE+Teacher Forcing 被认为是不牛的。我们得换点更牛的训练方式……吗?
大力出奇迹。GPT 2 使用大剂量的训练击败了 Exposure Bias。
CV 中的 GAN(对抗训练)被认为有可能替代 MLE。GAN 由分类器 (尝试分别 data 和自己生成的图像)和生成器 (尝试生成会迷惑 的图像)组成。式子是
其中 是一个潜在变量。
GAN(或其思想)能被直接用来语言生成吗?不能!因为生成器 中,对于每个前缀生成下一个词的分布这一步为止是可导的,但是从分布中选取某个作为最终生成这一步是不可导的。因此使用 Gumbel-Softmax Reparapeterization。
这来自一个叫做 Gumbel-Max trick 的方法。假设我们要从分布 中采样,我们使用一些 Gumbel Noise ,然后一个思想是 ;但 一步还不够到位,因此换成除以 hyperparameter 然后作 softmax,即生成 满足
当 合适时,这样做会强制最大值被拉得很大接近 one-hot 的格式。可以手动修饰其为严格 one-hot,直接把需要加的 difference 补上(这一步不可微),被称作 straight-through trick。
Reinforce Trick:
考虑
其中 取遍所有可生成的文本, 是 generator 生成 的概率, 是 discriminator 对其的评分。
硬把 移进去(这其实不太对,但是在 NLP 里我们不管),得到
GAN 真的有用吗?
其实直接 MLE 时我们也可以除以 temperature 以 diversity 换 quality。即使用
效果其实和 top- 类似。 乃温度参数。
……这么搞后,MLE 就能把 GAN 橄榄。这是因为,GAN 虽然能保证 quality 一定,但是 diversity 往往就很烂。
为什么 MLE 的 diversity 很牛?
MLE 的式子训的是
其中 是数据集中采样的数据, 是模型给定的信息。
这可以写成 KL 散度的
的式子。
KL 的性质是,假如用单 Gaussian 去拟合双 Gaussian(两个 Gaussian 的线性组合),则拟合出的结果倾向于居中而非紧贴一个 Gaussian,展现出了 diversity。
因此,exposure bias,真的是问题吗?
有人作了尝试,使用 data 中的前缀、model 自己造的前缀、随机 token 前缀三者分别让已训好的模型开说。
……然后发现,data 前缀和 model 前缀都说出了很好的话。随机前缀刚开始胡言乱语,但是说着说着居然变好了(self recover)?
然后知 exposure bias 乃是无稽之谈。
最后总结好用的 sampling algorithm:
- top-:仅保留概率最大的前 个。
- top-:保留若干个,直到已保留的部分总概率和至少为 。一般 取 等。
- tempered-,即 。
……然后实验知好像差不多?
这几个东西的共同点是,操纵后概率间偏序关系保持;信息熵减小;非零元的斜率保持。
因此,可以将 sampling 分成两类,即同时满足此三类的 sampling 和不满足某一类的 sampling。
- 声称,满足该条件的 sampling 至少与 top-, top-, tempered- 一样好,而不满足者则更差?
- 实践知其然……但不尽其然。有违背 order preservation 的东西结果也差不多。
Repeatation Problem & Safe Reply Problem
我们使用 MLE 教会了模型该说什么。但我们似乎没有教它不该说什么。这尤其会发生在数据集不够大的场合,此时很有可能模型会输出循环模式。
- 在续写任务上经常出现这样的问题,但是在翻译或总结的任务上则不然。
为什么?
- 原因一是数据集里少有这样的重复问题。
- 原因二是数据是高度对齐的。【而续写是 open-ended 问题】
计算重复 pattern 在模型预测中的概率,会发现,随着重复次数加多,继续重复的概率会不断抬升(也即,在第一遍后重复第二遍的概率,小于第十遍后重复第十一遍的概率)。
推测产生重复的原因。
- 数据特性(人类的本质是复读机)?
- 随着 pattern 不断变多,hidden state 中会积累大量 pattern 的 embedding。
- 如果历史上预测了这样的重复 pattern,LM 会倾向于继续重复。
同时,chatbot 会倾向于回复一些“通配符”,即 I don't know. Bye bye. Sorry. Okay. 等,与训练数据集中展现的 diversity 不同。
猜测原因:模型 not sure 该说啥时,它就会倾向于说一些 simple 和 safe 的回复。
如何解决?使用一些 top- 等采样方法……但还不够好。
现在给一个机会,可以往下一个单词的分布向量在跑 softmax 前手工加一个 bias。如何设计这样的 bias?
为了遏制重复,可以为所有近期出现过的单词全都减去一个 bias,遏制它们的出现。
虽然看上去很不讲道理,但是它真的有用!
或者,也可以通过在误差函数上为之前出现过的 token 手动减权重,来避免 bias。
避免 naive responce,使用 MMI criterion。
如果我们要计算 ,不如用
这个 loss 会奖赏那些强关联的前后句,惩罚那些 safe responce(也即 很大的 responce)
Negative training:收集一些负面样例,然后令
经过以上的优化,大模型现在可能不太会说不牛的话了。但是它会说胡话,即产生幻觉(hallucination)。
回到世界最先进方法,Transformer!
BERT 是 encoder 模型。GPT 是 decoder 模型。我们联合!就有了 seq2seq 的 encoder-decoder 模型。
decoder 由一层 self-attention 和一层 cross attention 得到。cross attention 的 query 是前一层 decoder 的 query,但是 key 和 value 均是最后一层 encoder 的输出。
也即,在 self-attention 调整 qkv,在 cross attention 将 q 与 encoder 的 kv 对齐。
两个流行的 enc-dec LLM:
- BART:随机对 token 做一些 noise(扔掉一些 token、重排一些 token 等),然后 denoise。
- T5:同样是 masked 处理。
T5 模型提出了 text-to-text 的方式,即把 task 本身也作为 prompt 放入输入中。这样,不需要为不同的 task 专门设计不同的 architecture。
……但是现在大家都不再用 encoder 了,使用 decoder only 了。怎么回事呢?
Rotary position embedding (RoPE)
我们希望 处的 query 与 处的 key 点积后的结果是关于 的 function。
也即,
可以用一些 的分块矩阵达到这一目的。
In-context Learning
现在有一个很牛的 LM。我们希望其做一些工作,例如 semantic negation:把所有词取为反义词。我们的数据很少。我们很懒,甚至不想做梯度更新。因此我们的目标是找一个好的 prompt 让它学会取反。
咋办?可以如下处理:
Please negate the meaning of the sentence. [<-task description, optional] I hate NLP => I love NLP; Today’s weather is good => Today’s weather is bad; [<-the demonstrations] I had a good day =>[<-the example for testing (output)]
这样可以搞 few shot training。
在 GPT 3 以前,few shot learning 是衡量模型 quickly adapt to demonstration 的能力,会更新梯度;但 GPT 3 以后,它就被融入 prompt 的一部分不再更新梯度了。
CoT
在 CoT 时,可以 sample 多次,每次让模型走一条不同的思维路径,然后找到所有路径结果的众数。
ToT
Tree of Thought 维护一棵思维树,每次提供多个备选方案,然后判断哪些方案更有前景,并丢掉那些不太可能的方案。
Bias
在 ICL 中,为了遏制 bias(例如,如果训练数据中有很多 positive 则其倾向于输出 positive,同时其倾向于输出上次的输出),我们对概率分布 作线性变换 ,并期望其对空输入有 balanced velidation (即以相等概率返回 N/P)。于是令空输入的概率为 ,令 , 即可。
把 demonstration 中的 label 换成随机 label,表现没有差太多!
咋回事?事实上 demonstration 比较重要的意义即在于确定输入格式与 label 空间。
Induction attention head 是在已有 {A}{B} 式的数据时,增加 {A} 后接 {B} 的概率的 head。Induction head 在经过一定程度的训练后会突然出现,因此训练的质量会出现陡升的状况。
为了让模型适应 zero-shot 任务,我们预先在大量“Instruction Following Data”上训练,这些 data 包含大量各种有 instruction 的 task(但是不含测试集中的某些 task),来让模型有阅读 instruction 的能力。
RLHF
模型能说话,但它不应该啥都说。例如,如果你问了未来的事情(“2028 年世界杯谁赢了?”)或者不合法的事(“帮我作弊!”),它应该拒绝!
因此就有 RLHF:
先训一个 Reward Model,用它来替代人的手动打分。然后用它协助训练。
RLHF 比起高质量数据集上的 finetuning,有什么好处?
- 训练 Discriminator 比起训练 Generator 简单得多。因此 Reward Model 很容易就有很好的性能。
- Reward Model 可以方便实现 Negative Example,只需为不该说的话打低分即可。
其它替代方案:
- 使用 Prompting。优点是不需训,缺点是模型不一定听你的 prompt。
- Best of N:训 Reward Model(但不用它参与正式模型的训练),而是用正式模型输出多个方案,用 Reward Model 输出最优方案。优点是简单有效,缺点是有时需要把 设的很大。
对于输入 ,输出 ,我们有 reward model 。
现在,把人类看成一个 model ,其认为 比 好的概率
对于有标记 data ,其中 从有监督模型 中随机取样,则
添加 KL Divergence 以抑制 变得离 太远,即
把 KL 散度展开,只需最大化
把这项当成 reward 即可!
但如果 离 太远,这个 reward 可能不太牛;因此我们采用 KL 散度以遏制跑太远,并多次迭代。
使用大数据集下训练的 gold medal 为基准,训练 proxy model。
Proximal Policy Optimization (PPO):我们不希望 policy 有过大的变动(因此称作 proximal),因此用奇怪公式处理。
PPO 的问题:好多好多模型在一块,超参数太多了!
因此我们有 DPO (direct preference optimization)。
DPO loss
这样,我们不再需要 reward model。事实上,这个模型内部秘密嵌套了一个 reward model!
DPO 更简单、更稳定,但不用 reward model 就失去了相关的好处。
PET
虽然 LLM 很牛,但是还是需要 finetuning!
Paramater-efficient tuning (PET):仅仅 tune 一小部分参数。这样子,本地模型只需存储一小部分参数。并且,在 adam optimizer 中,参数、梯度、第一矩、第二距,这四个量都与参数规模是同阶的;但是使用 PET,则后三个量只需与 PET 规模相符,则内存就可以压缩很多!
PET 的实现是,在 transformer 的过程中,加入一些 adapter 层;adapter 是一个 的全连接、 的激活函数、 的全连接构成,外层有一个 skip 连接。这样,只需调整 规模的参数即可, 可以设得很小。
BitFit
在 Transformer 中,不调转移参数的 ,只调 bias 。似乎很有用?
LoRA
Low-rank Adaptation。对于权重矩阵 ,令每次的增量 是低秩的,即可以写成两个矩阵 ,其中 ,然后只调 两矩阵。 可以很小,比如 。
LoRA 的好处是它是 zero-latency 的,因为它只用被加入参数,不需要从头计算。与 adapter 不同,它因为是加法,所以效率很高。在 batchsize 很低(例如人机交互)时,优势得以体现。
Discrete Prompt Optimization
自动寻找最牛的 prompt!
首先,随机使用文本中存在的 token 初始化一条 prompt。然后在每一步迭代中,选择一个位置,找到一组候选 token 集合,使用 first-order approximation 挑选出最牛的那些替代方案。
具体而言,令选择的位置当前的 token 是 ,则对 loss 关于 的 embedding 求梯度,求完梯度将其与每个 token 的 embedding 求点积,点积越大,则猜测用这个 token 换当前位置更牛。
效果和 fine-tuning 其实差不多!
Continuous Prompt Optimization
输入的 prompt 也不过就是一堆 embedding 罢了。既然是 embedding,那显然可以不拘泥于离散的、人类可读的一堆 token,而采取任意的连续参数向量!
也即,把开头的一串 embedding 也看作参数的一部分,但是只训这一块参数,transformer 主体是 frozen 的。
……咋感觉很像我们 PET 捏?
它有一个缺点是不太稳定。
LM as knowledge base
在 Knowledge Base (KB) 中,询问由主语+关系+答案三部分构成;但是 LM 直接把询问部分 mask 掉就能跑。
但是,如果能对询问使用一些更好的 prompt,模型的效果将变得非常好!
那就调 prompt 吧。
AI Detection
如何判定一篇文章是否是 AI 写的?
- 写一个神经网络分类器。
- 找到 AI 喜欢说的某些模式。
- 在写 AI 的时候让说的话中打一些水印。
第一种体系是,例如识别假新闻,则在真新闻数据集上针对某个模型特别训。但是问题在于,这样训出来的结果没有迁移性,一个模型的 classifer 大概率不适用于其它模型。特别地,小版本的模型的 classifier 在规模更大的同模型上能成立,但是反过来却往往不行(?)
通过把小版本的 classifier 攒成一块,可以一定程度上替代大版本的 classifier,降低训练成本。
第二种体系的方法一是 GLTR 方法:LLM 喜欢说 top-K 的东西,因此通过统计所有 token 出现的频率,则如果 GPT 喜欢说的东西给定文本也喜欢说,则有理由相信这个文本是 GPT 写的。
方法二被称作 DetectGPT:对于给定的文本 ,可以使用 masked LM 为 添加一些 noise 变成 。现在,使用语言模型判定 以及全体 noised 版本 的概率;如果 是 LM 生成的,那么它的得分应该高于全体 noised 版本;如果其是人写的,那么加入 noise 会随机提高或降低它的得分。因此,LM 生成的 会有得分高出 noised 版本一截的现象出现。
但是,如果想干扰 Detect GPT,可以将生成结果的一部分用另一种模型重写,乃至用一个模型的 detector 去验证另一个模型,则效果就会变差。甚至,如果加入少量 typo,则效果会大打折扣!
因此,detect 在真实世界中的效果是不佳的,甚至鲁棒性会很不足。
Detect-GPT 有点慢,因为要 noise 很多次,再把 noised 结果扔进模型里面评分。因此我们可以在 token 级别进行 sample,即生成 。这只需做一次 forward,因为我们只需要 distribution 而已。
现在,定义 (注意,每一项 其实是彼此独立的)
然后定义一个
其中,令
且令
利用 的独立性,这个可以简单计算。
RLHF revisited!
给定两个 policy 和参数 ,想要缝合两个 policy,最大化
即二者的一种几何平均。
法一:parameter merging:直接将参数以 为系数线性相加。虽然很简单也很常用,但显然不牛。
法二:
首先,我们使用 greedy decoding 的思想(其中有 )。
然后令 (其中 是避免 softmax 不牛的一个偏移),令 ,然后使用这个 policy 做 greedy decoding 即可。
这个推论可以被用于 merge 两个 DPO policy。
DPO policy 是
然后两个 policy merge 后就有
由此,可以快速地调参。
同时,可以有 proxy tuning,使用训好的小模型 ,来处理大模型 。令 对齐后的 满足
因此 即为能对齐的大模型。
同理,可以使用 jail breaking 来制造一个更不安全的大模型 ,有
DPO 时,一定会保证 吗?一坨推导显示,未必。但是这真的有必要么?
Detector Methodology: Watermarked Generation
在建立模型时,蓄意地引入一些噪声。这些噪声应可被某种方式检测,但不能被人类识别。
这个很牛,因为它不需要收集数据,且在没有 hack 的情况下成功率接近百分百。
方法:随机将某些 token 标为 watermarked token,并鼓励模型多说这些话。同时,我们不希望 LM 偏移最初模型过远。
在每一时刻,依据 前一个 token 伪随机地将词汇库分成一个 green list 和一个 red list,然后为 green list 加一个小 bias。
- 使用前一个 token(而非先前所有 token),因此改一个 token 只会影响前后两个值。
这个算法在验证时不需要模型介入。最终算一个 score,计算其落入 green list 内的数目,如果其显著高于期望则认为被打过 watermark。
Threat: Reverse-Engineer
我们知道只使用了前一个 token 作为伪随机种子,并且我们可以调用 detection API 去判定是否是 AI 生成。我们如何 reverse engineer?
答曰:把所有前一个 token-后一个 token 二元组扔进去问,就能知道每一个 previous token 对应的 list separation。因此需要 token 种类的平方次。
如果选择前两个 token 作为 seed,那就需要三方次。
Threat: Paraphrase
生成 watermarked 结果后,如果有人把它拿来又过了一个 paraphrase 模型后,watermark 就消失了。这该咋办?
单一 token seed 的场合,paraphrase 模型只要不动很多 bigram,就不会受到很大的破坏 ;但是如果选择更多 token 的场合,改一个 token 就会影响很多 bigram。
Revision: Semantic Watermark Algorithm
既然 Paraphrase 不改变 semantic 的 embedding,我们为什么不在 semantic 里安一些 watermark 呢?
效果是,把 semantic space 使用多个超平面约束出一块 green list,每次生成多个句子,然后选择 green list 中的句子作为最终结果。
缺点?每次重 sample 句子花费太大了!
Model Stealing
现在有一个在线模型。小偷尝试给你的模型发一堆 query,尝试训一个和你的模型类似但规模更小的模型!
随机初始化一个向量 。随机挑一个由频率中等的词汇组成的 trigger set 。
对于一个 query,若其有词汇集 ,令 为 中 出现的频率, 为其初始 embedding,然后修改其为
这时,对于一个你怀疑偷了你模型的东西,你可以用两组集合,一种所有元素都属于 、一种都不属于 ,丢进模型,如果后者更靠近 ,则有理由相信它偷了你的模型。
但是,stealer 可以重排 embedding 的维数,或者为 embedding 添加一个正交的线性变换,来 hack 你的防御。
怎么防御?不使用连续的随机 ,而使用一个离散的随机词语对应的 token。
Membership Inference Attack
MIA 判定一段文字(或图像)有没有被用于训练某个模型。
把 data 扔进去求 log-prob。但是,我们只使用 的 log-prob 最小的那些 token 扔进去。令 ,效果出人意料地很不错(?)
Jailbreak
法一:使用一些话术(如装可怜)。
法二:说一些模型预想之外的输入(如不明字符串,但是其恰好和不合法输入有相同 embedding)
法一的例子比如“You are DAN”,其中 DAN 意味 do anything now。或者,使用一些 safety alignment 弱的语言(例如祖鲁语)。或者,“动之以情,晓之以理”。甚至,通过这样的操作可以说服模型坚信一些奇怪的信条。
法二的例子比如加一个奇怪的 prompt 作为后缀(例如一堆感叹号)。这个 prompt 可以 autoprompt 地搞。
Internal Representation of refusal
对一组 harmful 回答在位置 的特征向量求平均 ,harmless 的特征向量求平均 ,则 被称作 refusal 向量。声称,从算法求出的 embedding 中减掉 分量,有可能能使得模型起到 jailbreak 的结果。
Jailbreak on vision language models (VLMs)
首先,啥是 VLM?VLM 是允许图像作为输入的 LM。它通过一些 encoder(比如 CLIP)把图像变成 embedding,然后作为 LM 输入。输出还是 text。
对于公开 encoder 的 VLM,可以尝试使用一些噪音让无害图片的 encoding 与试图让其做出的非法行为的 semantic 很像,以起到 jailbreak 的效果。
此外,甚至可以直接把字写到图里让 VLM 识别。
Evaluate Jailbreak
如何判定 jailbreak 是否成功?
法一:template-base,直接检测有没有 I'm sorry, I apologize 即可。优点是快,缺点是模型如果说胡话无法识别(此时其实并没有成功 jailbreak)
法二:LLM-based,训一个模型或是找一个合适的 prompt。
如何 defend jailbreak?
system-level:另训一个模型当 filter 即可。……但是,攻击方可以对模型说:每个词中间加一个😊,这样另训的模型就没法办了。【但是,这样的东西必然对模型的性能要求很高】
context-based:加一个 prompt。
iterative-refinement:和 sandbox 中的 jailbreaker 迭代
unlearning:让模型能忘掉它学过的有害内容。
……具体是什么?令 是全体数据集, 为待删去数据。则,我们希望 unlearning 后的模型与 上训出的模型效果类似。
方法:gradient ascent,把 上的 loss 取反。但是这样会不知道跑偏到哪里去。所以要加上正的 上的 loss。
……但是这样,虽然它忘了 ,但是它会开始说胡话。
……那就把 DPO 搬过来罢!改了改,使得模型不会像 DPO 一样“排斥”说某些话,而是单纯地“遗忘”了某些话。
注意,不能让模型在忘记的东西上面回复 I don't know(因为 RT 模型上显然不会这么做)……但是这真的有必要么?
TOFU
我们显然无法训练一个 retained 模型以检验 unlearning 有没有忘掉不该忘的东西。因此我们可以对一个幻想的数据集 finetune,然后让模型忘掉它的一部分。因为幻想的数据集不大,所以再 fine-tune 一个 RT 模型也不难。
Representation Misdirection Unlearning
对于 unlearning 时,可以把要训练的东西与随机 embedding 对齐,有时有效果。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?