【学习笔记】transformer 简札

input embeddings

【segment embedding】

【word embedding】

现在是使用 WordPiece,使用最少的 subpart 表示出所有的英文单词。做法是类似 BPE 的。先建立 a...z*a,*b,...*z 等 52 个元素加到 token 集合里面,表示一个字母作为单词第一个字母出现和作为非第一个字母出现。

把语料库里面的所有单词拆成字母,并根据情况用 a/* a 代替。类似 BPE,找到语料库里面满足 \(\rm \frac{app_{\alpha\beta}}{app_{\alpha}\times app_{\beta}}\) 即所有连续出现两个元素中满足出现次数除以各自出现次数乘积最大的 top k 个合并得到新的子部分,如果第二个子部分以* 开头就把 * 去掉。我们将合并后的结果添加进 token 集合(k 取多少不清楚,可能可以是 1),多次迭代直到 \(\rm \frac{app_{\alpha\beta}}{app_{\alpha}\times app_{\beta}}\) 小于某个值就停止。那么 token 集合里面有一些 abcd 和一些 *abcd,我们为它们每个准备一个词向量,可能需要 pretrain,也可能可以直接在大模型里面跟着梯度下降。

现在可能还有一些 SentencePiece 的库函数,这是处理英文中具有语义信息的前后缀。

【postition embedding】

有绝对位置编码和 RoPE(旋转式位置编码)

Encoder

word vector -> position encoding -> [(multihead) self-attention -> residual add & normalization -> Feed forward module->residual add & normalization]×n

  • Attention block

    input vector a

    parameter \(W^q,W^k,W^v\),\(q=W^qa,k=W^ka,v=W^va\)

    attention(q,k,v)=\(softmax(\frac{qk^T}{\sqrt {d_k}})v\)

    \(d_k\) represents for the dimention of vector k,这里对权重的缩放是为了防止矩阵乘法得到的结果太大导致落在 softmax 梯度小的地方,非常细节。

    细说 qkv

    q -> query;k -> key;v -> value

    其实能明显感觉出来 q 和 k 是地位相同的。考虑一下整个 attention 计算的过程:首先将词向量通过 \(W^q,W^k\) 映射到另外两个线性空间中,然后通过矩阵乘法得到一个 \(n\times n\) 的矩阵,这里 \(n\) 表示句子中的 token 数量。然后对每一行的元素进行 softmax,缩放之后再去乘 \(v\)

    不难发现这里 \(qk^T\) 实现了一个计算任意两个词向量(的映射)内积的过程。有解释称这是计算向量的相似度,但是向量内积在模长不同的情况下不能表示相似度,所以这里存疑。

    如果承认这是表示相似度,那么至于为什么不能把公式改写成 \(softmax(\frac{kk^T}{\sqrt {d_k}})\) 便看起来能解释了:这是因为计算 \(kk^T\) 的结果是一个对称矩阵,实际上在一个句子中,A -> B 和 B -> A 的重要性可以是不相同的,模型的处理能力就变弱了。

    至于整个过程最后的和 \(v\) 做矩阵乘法,不妨假设 \(W^v\) 是一个单位矩阵看看发生了什么。其实就是句子中所有元素加权得到新的向量。目测是实现了一种语意理解。

    multihead self attention 就是进行多个矩阵乘法然后把 \(z_1\dots z_t\) concat 起来然后再用一个 \(W^z\) 和这个 concat 过的矩阵乘一下得到 z

    问题:为什么叫 query key value,怎么理解这个称呼;为什么要多头。

  • Feed forward module

    FFN(x)=max(0,\(W_1x+b_1\))\(W_2\) + \(b_2\)

这里的 norm 是 layer normalization ,即对每个词的所有维度进行正则化。

Decoder

Decoder 的 QK 是继承了 Encoder 最后一层的 QK 向量,V 是向右平移一位的 output(比如预测第二个词时我们传入的矩阵第一个位置是 <start>对应的向量 第二个位置是第一个单词对应的向量)也是经过一些 Attention Block 进行特征提取。

每个单词后面的词不能对这个词产生影响,或者说矩阵的下三角是 \(-\infty\)(后面会通过 softmax 把它映射到 0~1)

Decoder 最后经过 softmax 判断下一个token 是谁,那么你能发现 decoder 得一个 token 一个 token 去运行得到结果。

optimize

最牛的几集。

  • https://arxiv.org/pdf/2312.13558.pdf 这篇文章提出可以使用奇异值分解降噪。

    考虑 FFN 中的矩阵 \(W\) 那么我们希望找到一个矩阵 \(W_1\) 满足 \({\rm{rank}}(W_1)\le r\)\(||W-W_1||_ 2\)最小,这里的 \(r\) 是我们自己设定的参数。Eckart-Young-Mirsky 定理证明这个问题可以用奇异值分解做。

    简单来说,利用奇异值分解设 \(W=USV^T\),其中 \(S\) 是对角矩阵。那么保留 \(S\)\(r\) 大的元素,剩下的直接设为 \(0\) 得到 \(S_1\),那么 \(W_1=US_1V\)

    总的来说就是给网络减肥了。类比可以使用“黑色背景”。因为黑色背景通常都不满足 每个像素的 rgb 都是 (0,0,0) 。感觉这种方法的启发性很强。

  • 关于 softmax attention

    我们称上文中提到的 \(\rm softmax\left(\frac{QK^T}{\sqrt{d_k}}\right)V\) 为 softmax attention,如果 QKV 的大小均为 \(N\times d\),那么矩阵乘法时间复杂度是 \(\Theta(N^2d)\)。这在 corpus 大或者说语料库长的情况下是非常不利的。

    现在希望可以进行 \(\Theta(Nd^2)\) 时间复杂度的 Attention 并尽可能让模型计算效果类似。思路是 \(Q\leftarrow \phi_Q(Q),K\leftarrow \phi_K(K)\)\(K^T\)\(V\) 先做 dot product,再和 \(Q\) 做 dot product。这显然违背了 softmax Attention 的计算原理,但是通过精细找 \(\phi_Q,\phi_K\),可以很大程度近似。

    这种做法被称为 linear attention

posted @ 2023-12-13 23:33  没学完四大礼包不改名  阅读(93)  评论(2)    收藏  举报