天行笑传之 complete code barrier
CFG:Context-Free Grammars,一组 expression 之间的转换法则
CFL:Context-Free Language,CFG 能生成的字符串集合。正则表达式都是 CFL,但并非所有 CFL 都正则。
CNF:Chomsky Normal Form,转移是二叉的 CFG。
CKY Parsing:给定句子和 CNF,推测该句子如何由 CNF 生成的 DP 方法。缺点是因为模糊性,一个句子可能由多种 parsing 方法。
PCFG:Probablisitic CFG,为每种转移赋以概率,可以让 CKY 寻找概率最高的 parsing。
Treebank:有配套 parse tree 的语料集合。
Synchronous CFG:两个语言的有关句子对会被同步生成。
TD 矩阵:Term-Document 矩阵,每一行是每个 term 在众多 document 中出现次数集合,一定程度上可以看作这个 term 的 embedding。优点是有关词语有时同时出现,缺点是不能保证这一点,并且太稀疏。
LSA:Latent Semantic Analysis,寻找行列的隐藏表示使得 \(W\) 接近二者乘积,然后用单词的隐藏表示当作单词的 embedding。这是我们 SVD,但是奇异向量彼此正交不牛,所以故意不取满让它没那么正交。
TF-IDF normalization:TF for term frequency,用次数除以总词数的 frequency 替代次数;IDF for Israel Defense Forces Inverse document frequency,使用总文档数除以出现文档数目取对数后加一来平衡那些常见词,二者求积即为 TF-IDF normalization。
HMM:Hidden Markov Model,使用隐藏状态 \(h_i\) 进行转移。前一时刻的 \(h_{i-1}\) 与本时刻的 \(x_i\) 共同得到 \(h_i\)。这个 \(h_i\) 可以用来做出进一步预测,例如 POS tagging。
Viterbi Algorithm:生成最可能 tag sequence 的 DP 方法。
EM Algorithm:做无监督学习。思想是把 \(\log p(O\mid\theta)\) 用 Jensen 变成 \(\sum_{Q\sim q}\log p(O,Q\mid\theta)+\text{entropy}(Q)\),然后最大化 \(\sum_{Q\sim q}\log p(O,Q\mid\theta)\)。
LM:Language Model,目标是为所有句子赋以一个概率。
\(N\)-gram:为所有 \(N\)-子串赋以概率(实际概率常常用频率近似)然后句子的概率等于所有 \(N\)-gram 概率之积。用其预测下一个词时,只会根据前 \(N-1\) 个词预测。缺点是有些罕见词在高 gram 上少见。改进方法之一是为所有词赋以一个基础的权重(add \(k\) smoothing),之二是用 \(1\sim N\)-gram 预测结果的线性组合(interpolation),之三是如果不存在 \(N\)-gram 即使用一个系数修正过的 \(N-1\)-gram 近似(backoff)。
Perplexity:一种 metric,其为 \(2^{-l}\),其中 \(l=\dfrac{\log_2P(W)}{len(W)}\)。
Word2Vec:为每个词找一个 embedding vector 的努力。
Skip-Gram:使用中心的词预测周边的词,\(L=-\sum\log p(x_{t+i}\mid x_t)\)。
CBOW:continuous bag-of-words,使用周边的词预测中心词。\(p(x_t\mid x_{t-s},\dots,x_{t+s})=\dfrac{\exp(u_{x_t}\cdot\dfrac1{2S}\sum_jw_{t+j})}Z\)。
Negative Sampling:为避免遍历全字符集计算分母,例如 skip-gram 的场合,以频率为概率随机采样并用 \(p(y\mid x)=\log\sigma(u_y\cdot w_x)+\sum\log\sigma(-u_{y'}\cdot w_x)\) 替代。
Compositional Morphology:通过分析一个单词的词缀等,处理未知词的方法。
mini-batch 的好处:快,有效,一定程度上起到 normalize 的效果。
KL divergence:\(D_{KL}(p(x)||q(x))=\sum p(x)\log\dfrac{p(x)}{q(x)}\)。它非对称、非负。
RNN:普通 RNN 类似 HMM 套了个神经网络的皮。
Gradient Exploding:解决方案是 gradient clipping,如果梯度大小超过一个阈值即手动将其 clip 到该阈值。
Bucketing:RNN batch 时,不同长度的句子要被 padding 为相同长度。为了避免 pad 过多,就把长度相近的句子放在一块。
Autoregressive LM:由之前生成的结果生成下一时刻的单词,然后把整个结果丢回去预测再下一时刻的结果。
RNN for text classification:把最后一时刻的 hidden state 作为整个句子的 embedding。
GRU:\(h_{t-1}\& x_t\to r_t,z_t\),用 sigmoid;\((r_t\odot h_{t-1})\&x_t\to\hat h_t\),用 tanh;\(z_t\odot\hat h_t+(1-z_t)\odot h_{t-1}\to h_t\)。可以避免 gradient vanishing。
Residual Connection:\(x'=x+F(x)\)。可以避免深度上的 gradient vanishing,构造更深的网络。
Bi-RNN:双向 RNN。不适用于自回归 LM。但是适用于求 sentence 的 embedding:在开头加入特殊 token 并使用特殊 token 的 hidden state 作为整句话的 state,或者把所有位置的 hidden state pooling 作为整句话的 hidden state。
Seq2Seq:读入句子输出句子。例如机器翻译。
Encoder-Decoder 模型:trivial 方法是用 bi-RNN 提取 encoding 然后直接作为 \(h_0\) 传给 autoregressive 的 RNN。attention 方法是使用矩阵 \(W\),然后用 \(h^{enc}_iWh_{t-1}^{dec}\) 作为位置 \(t\) 与输入位置 \(i\) 的 attention 系数,求 softmax 后以之为权重求和 \(h_i^{enc}\),使用和与 \(h_{t-1}^{dec}\) 二者共同推出 \(h_t^{dec}\)。
Greedy Decoding:autoregressive 时,每次贪心地选最可能出现的下一个 token。
Beam Search:维护多个 beam,每次所有 beam 扩展,并维护前 \(k\) 牛的 beam。
BLEU:\(\text{precision}_n\) 是所有预测的 \(n\)-gram 中出现在 reference 中的比例,\(\text{brevity-penalty}\) 是 \(\min(1,\exp(1-\dfrac{|\text{reference}|}{|\text{predicted}|}))\),为了遏制其说太短的话,BLEU 是前者 \(1\sim4\) 的几何平均与后者的积。越高效果越好。
Multi-Layer RNN:多层 RNN 堆叠。
Back Translation:少量双语对照文本,大量目标语种文本。可以训练反向翻译模型,生成一些输入语种不牛、目标语种很牛的文本对,用其训练的结果不算很拉、
GLUE benchmark:一堆 NLU(Natural Language Understanding)任务的大乱斗。
ELMo:多层双向 LSTM,从双侧分别预测下一个单词。
BPE tokenization:Byte Pair Encoding。初始每个字符为一个 token,然后每次不断选择频率最高的相邻字符对,将其合并为一个 token,直到 token 数目达到阈值。
Layer Normalizaion:让每层中的结果拥有一个固定的平均值和方差。
Batch Normalization:关于 minibatch 求平均。缺点是需要较大的 batchsize。
BERT:encoder only 结构。两个任务:MLM (Masked Language Modelling),随机将一部分 token 替换为 [mask] 并预测其结果,对比预测结果与原始 token。此外,还会随机保留一部分 token 不换成 mask、随机将一部分 mask 再替换为随机 token,以确保非 mask token 的 embedding 也得到学习。NSP(Next Sentence Prediction)预测两个句子是否有先后关系,因为被证明没啥用所以 BERT 之后就没人用了。
ELECTRA (Efficiently Learning an Encoder that Classifies Token Replacements Accurately):随机将一部分 mask 使用小型 MLM 网络替换为近义词,并侦测替换。似乎更有效?
Longformer:为处理 transformer 平方的不牛复杂度,仅让 attention 的感受域限制在周围 \(w\) 的范围内。每过一层,感受域增加 \(w\)。还可以让不同的 head 以不同的 stride 构建感受域。
GPT1:比 ELMo 好,但是不如 BERT。
zero-shot learning:使用 prompt。
top-\(K\) sampling:在 sample 时保留概率前 \(K\) 大的选项,renormalize 后按照此概率 sample。\(K=1\) 退化为 greedy sample。调小 \(K\) 会提高 quality,代价是 diversity。
MLE:Maximal Log Estimation:\(\log P(W)=\sum\log P(W_i\mid W_{1:i-1})\)。在 teacher forcing 时,\(W_{1:i-1}\) 全都是输入串,但是在 sample 时 \(W_{1:i-1}\) 都是之前生成的东西,误差被认为会累计。这被称作 exposure bias。
解决方法一:Gumbel-Softmax Reparameterization。其流程是,通过 \(\hat p_i\sim\exp\left(\dfrac1\tau(\log p_i+g_i)\right)\) 重塑概率,其中 \(g_i\) 服从某种 \(\text{Gumbel}(0,1)\) 的分布。
解决方法二:Reinforce Trick,借鉴 GAN 思想,硬把 \(\nabla\) 移到积分式里面。
MLE Training 被认为 emphasize diversity,它类似于用一个 Gaussian Distribution 去近似两个分隔的 GD。
但是 GPT 等东西让大家都不管这个 bias 了。
Top-\(P\) sampling:保留若干个大概率选项,直到已选择的选项概率和大于等于 \(P\)。
Tempered:\(\hat p_i=\dfrac{\exp(\log(p_i)/T)}Z\),其中 \(T\) 是温度参数。
这三种采样方式的共同点:order preserved,entropy reduced,非零元的 slope 不变:\(\dfrac{\log p_i-\log p_j}{\log p_j-\log p_k}=\dfrac{\log\hat p_i-\log\hat p_j}{\log\hat p_j-\log\hat p_k}\)。满足这三个性质的效果都挺好,但是不满足性质的也存在效果挺好的东西。通过调整参数,这三个采样都可以 trade quality for diversity。
Repetition 是使用 greedy decoding 或 beam search 模型的常见现象。另一个常见现象是回答 safe answers(generic response)。
biased decoding 可以为已生成的 token 加一些 bias 来避免 repetition。还可以显式地为模型的 repetition 加上 discourage。
MMI 使用 \(\log\dfrac{\Pr(S,T)}{\Pr(S)\Pr(T)}\) 来替代 \(\log\Pr(T\mid S)\)。其展开为 \(\log\Pr(T\mid S)-\log\Pr(T)\),效果是为常见输出添加一个 \(\log\Pr(T)\) 的 penalty。还可以 negative training,为最常见的几个 sample 当作 negative sample 并加上一个负的 loss。
通过以上操作,模型不再会产生 repetition 或 generic response 了。但是因为模型本身的局限性,它会出现 hallucination 即幻觉的现象。
BART:使用五种模式,token masking,sentence permutation,document rotation,token deletion,text infilling 训练。是 encoder-decoder 模式。
T5:训练时把随机一部分东西 mask 掉,然后预测那些 mask。使用 prompt 处理不同 task。
Decoder-only 为何比 Encoder-Decoder 强?decoder-only 在追加询问后,不用重构先前的 attention 结果,但是 encoder-decoder 因为是双向的,所以需要重构先前的 attention 结果,复杂度不牛。除此之外,decoder-only 时,pretrain 和 evaluate 的生成模式是大体相同的,可以简单处理可变长度的文本生成,而 encoder-decoder 则不然。
RoPE:Rotary Position Embedding。令 \(f(x_i,i)\) 表示 embedding 是 \(x_i\)、位置是 \(i\) 的 token 在加以 position embedding 后的结果。绝对位置编码是 \(f(x_i,i)=W(x_i+p_i)\),其中 \(p_i\) 是位置编码向量。RoPE 的 motivation 是保证 \(\lang f(x_i,i),f(x_j,j)\rang=g(x_i,x_j,i-j)\)。公式是 \(f(x_m,m)=RWx\),其中 \(R\) 是 \(\begin{bmatrix}\cos m\theta_1&-\sin m\theta_1\\\sin m\theta_1&\cos m\theta_1\end{bmatrix}\) 的堆叠。有 \(\theta_i=10000^{-2(i-1)/d},i=1,\dots,d/2\)。
ICL:in-context learning,通过 prompt 进行 few-shot learning 的方式。GPT3 展现了这种能力(但是之前的模型均没有)。
MAML 是 GPT3 之前 few-shot learning 的模式,仍然需要梯度更新。此时 few-shot 意指模型适应新任务的速度很快。模式是两层循环,内层使用小 dev-set 更新出一个伪的 \(\theta'\) 参数,然后外层再在大一点但也小的 train-set 上用 \(\theta'\) 更新 \(\theta\)。
CoT 能力在模型很大时效果才会显著。只需要一句“Let's think step by step”即可!使用 prompt 的 zero-shot learning 同理。CoT 为什么有效果?它首先有一个朴素的分治功能,其次 reasoning step 需要更多的计算,也即给予模型更多时间去思考。
CoT with self-consistency:采样 40 个 CoT answer,取最优解。显然,这个效率也是四十分之一。
ToT:Tree of thought,每次让 LLM 生成若干步,然后判断哪一步最有前景。可以使用 bfs 或 dfs。
ICL bias:ICL 会有 majority bias 和 recency bias 两种,分别指代输出 few shots 中的 majority 或后出现的 answer 的两种倾向。可以针对空输入判断,则此时 positive 和 negative 的输出应该 \(1:1\),因此使用空输入校准即可。
induction head 是一种如果先前出现过 [A] [B] 模式,则提高以后出现 [A] 时后接 [B] 的概率的 head。这种 head 会在训到某一时刻后突然出现。
FLAN:Fintuned Language Net。为了让模型适应 zero-shot 任务,我们预先在大量“Instruction Following Data”上训练,这些 data 包含大量各种有 instruction 的 task(但是不含测试集中的某些 task),来让模型有阅读 instruction 的能力。
RLHF:Reinforcement Learning Human Feedback。我们需要模型有两个特征:不知道就老老实实说不知道,不能瞎编误导性信息;不能说违背公序良俗的信息。其思想为:用人类判断训练一个 reward model,然后用它判定 generator 生成内容的好坏。其优势如:discriminator 容易训练;可以通过低权重让模型知道什么不能说。
非 RLHF 方法例如,添加 prompt(缺点:模型不一定听;prompt 需要炼丹);best-of-\(N\)(缺点:效率是 \(1/N\))。
一个 high-level 的理解:
- 大体而言三个模型,generator、reward、reference,分别是生成模型、奖励模型、背景模型。
- reward 给予奖励,reference 用 KL 散度作比,避免 generator 跑太偏。
目标 \(\theta\) 是一个
展开即得,reward 可以被看成 \(r(x,y)-\beta(\log\pi_\theta(y\mid x)-\log\pi_\text{ref}(y\mid x))\)。
PPO 需要四个模型:policy model 是有待 RL 的模型,reference model 是对照的 baseline(加上 KL 散度避免跑偏),value model 是预测未来收益的模型,reward model 是衡量下一步操作收益的模型。参数太多,模型太多,太烦了!所以大家用 DPO。其不再使用 reward model 或 value model。DPO 的思想是,RLHF 模型有封闭形式的最优解,代入 \(r^*\) 定义即得 DPO。
DPO 更简单、更稳定,PPO 则更富有潜力。
PET:Parameter-efficient tuning。指只对一部分参数 finetuning。优势是省空间。
Adapter 是一种 PET 模式:其是一个 \(s\to m\to s\) 的双层线性层,其中 \(s\) 是 seq_len
,\(m\) 是一个小参数。它只需维护一个 \(s\times m\) 和一个 \(m\times s\) 的参数即可,比 transformer \(s\times s\) 的矩阵而言小了非常多倍。BitFit 是另一种,其只训 bias。LoRA 则是对于矩阵 \(W\),使用两个低秩矩阵 \(AB\) 的积,即 \(W'=W+AB\) 来替代之,即只训 \(AB\) 两矩阵。很有用!它比起 Adapter 而言,优势是没有 latency。
Discrete Prompt Optimization (AutoPrompt):自动寻找最优 prompt 的方法。模式是:随机初始化一个 prompt,然后不断随机选择 prompt 中的一个位置 \(i\),求 \(\nabla\log p(y\mid x_i)\),然后找到与之最贴近的 \(k\) 个 token,将其更新为 token 中最牛的那一个。
Continuous Prompt Optimization:把 prompt 视作连续的 parameter 的一部分处理。本质上是一种 finetuning。
AI Detector 的三种 methodology 分别是:
- 训神经网络分类器。但是对于每个 AI 模型要分别训,模型之间的迁移效果不是很好。特别地,小模型容易迁移到同系列的大模型。
- 通过一些 metric 来衡量。GLTR(Giant Language Model Test Room) 通过检测各个词在模型眼中是否属于 top-\(K\) 来验证。DetectGPT 认为,AI 生成的内容的 probability 必然处于一个峰顶。于是找一个 MLM 模型随机作一些修改,修改后的结果的 probability 必然有所下降,而人工生成的内容不太可能处于峰顶,于是随机修改的 probability 会随机变动,不会下降很多。随机修改、求平均、判定 probability drop 是否超过一个阈值,即可。但是,如果使用其它模型改写,或者加入一些 typo,DetectGPT 的效果会下降。Fast-DetectGPT 则使用公式推导免去了 sampling。
- 加上水印。优势是不用收集数据且成功率高。一种 watermark 的方式是根据上一个时刻的 token 为 seed,将词汇表分为一个 green-list 和一个 red-list,为 green-list 中的词加一个 bias。调小 green-list 范围或调大 bias 能生成更强的 watermark,代价是质量变差。attacker 可以尝试逆向工程水印,解决方案是用前几个时刻的 token。可以尝试 paraphrase 句子,解决方案是在语义方面打 watermark,把语义空间切割并限制只生成一部分空间中的语义,生成时不断随机生成直到其落入目标空间中。
Model Stealing 是指通过给定输入、给出输出 embedding 的服务偷取模型参数的方式。为防止之,可以随机一个固定向量和一个由中等频率词组成的词汇集,以集合中单词的频率为系数将最终 embedding 趋向于该固定向量。这样,只需比较一个全由集合中单词组成的句子和一个全由非集合中单词组成的句子二者 embedding 哪个更贴近固定向量,以此验证模型是否偷了你的参数!
小偷的反制手段可以施加点积无关的变换,例如重排维数或者正交变换。水印者可以不采取固定的向量,换成固定词汇对应的词向量。
MIA:membership inference attack,检测一段语料有无被用于训练。具体而言,把语料丢进去算概率,挑出概率最小的 \(20\%\) token,把这些 token 的概率求平均作为一个 metric。