目录
注意:以下对于优化的问题,要回答这个问题:前一种方法的局限性在哪里,优化的方法是怎么进行优化的?(未完全解决)
2.3:怎么用Transformer提升Kaggle平台的House_pricing竞赛?
前提:
注意:以下对于优化的问题,要回答这个问题:前一种方法的局限性在哪里,优化的方法是怎么进行优化的?(未完全解决)
Step1:关于Transformer的疑问
1.encoder层的输出向量是传递给第一层decoder还是所有层的decoder呢?(解决)
答案:所有层
2.transformer的encoder层的输入和输出维度是什么呢?(解决)
答案:encoder层的输入是(a,b),有a句话,每句话是b个分词的token,然后输入到encoder中,假设embed层是(m,n)的,那么经过embed层之后就是(a,b,n)了。 因为有resnet层的存在,所以encoder的每一层的输出和输入的维度是一样的。
解释一下:embedding层的参数含义:m指的是token表的大小,n指的是嵌入向量的维度
Attention层的参数含义:Q,K,V的维度大小是(n,d_k),n是为了迎合嵌入向量的维度,因为要做矩阵乘法,d_k是Q自身的维度,也就是softmax中要除以的那个d_k
3.Transformer的decoder层的输入和输出维度是什么呢?(解决)
答案:Transformer的decoder层输入和输出的维度是相同的。这通常由输出前的线性层决定,线性层的维度是(n,类别个数),取决于需要分类的类别个数,然后经过softmax将结果转换为概率分布,输出结果。
注意:将问题2和问题3总结一下,假设embed层的维度是(m,n),decoder层最后输出的线性层维度是(n,k),这里m是输入词汇表的大小,k是输出词汇表的大小,n是嵌入向量的维度。在Encoder的内部其他的任何层的输出维度都是一样的,在Decoder的内部其他的任何层的输出维度都是一样的,这样是为了保证可以进行resnet。
4.encoder-only和decoder-only的区别是什么呢?(解决)
答案:encoder-only是将输入x变成特征向量,然后用于下游的具体任务的操作方式,适合用于分类任务等有分类性质的任务;
decoder-only利用自回归的方式去预测下一个token的操作方式,decoder-only模型常用于生成任务
5.位置编码是什么样的,可以怎么优化?(未解决)
答案:Transformer中用的是标准位置编码,公式如下:
解释一下参数:1.pos指的是token所在的位置;2.d指的是编码向量的维度;3.point是编码点,取值范围是[0,d-1];4.k的取值范围是[0,d/2],k = [point /2],当计算位置编码点point是偶数的时候,用sinx计算,当计算位置编码点point是是奇数的时候,用cosx计算。
举个例子:我打篮球 对我进行512维位置编码,token化省略
我 = [,,....]在对我进行编码的第一个位置,其实这个时候point是0,是偶数,所以这个时候会用sinx计算,并且k = 0/2取整,所以是0;进行编码的第二个位置,这个时候编码点point是1,是奇数,所以这个时候会用cosx计算,并且k = 1/2取整,所以是0
优化:RoPE解释如下:RoPE只考虑局部的两个相邻分量之间的关系。
举个例子,如果x = [x_1,x_2,x_3,x_4],那么第一组分量是[x_1,x_2],第二组分量是[x_3,x_4]
推导出这个等式的关键一步是为了推导出如下等式:
为什么要推导出这个等式呢?
其中,各部分有相应的含义:
6.当前的注意力机制是什么样的,可以怎么优化?(未解决)
答案:当前的注意力机制是: 或者多头注意力机制(注意到不同的表征空间之后,再去聚焦)。这里的注意力机制就出现了两个问题:1.复杂度高;2.由于计算和内存限制难以处理超长文本,文本长度的限制,如果记忆5000个token,计算量需要25000000。
优化1:稀疏注意力机制:背景是:在传统的注意力机制的情况下,每一个token需要注意到所有的token,计算复杂度是O(N^2)(这里动手计算一下Q*K^T就明白了),所以呢,这个时候,不要求每一个token注意到所有的token,只要求它注意到和它相邻的前后k个token,这个时候算法复杂度是O(N * K),在处理长序列的时候,可以减少内存的消耗;或者将一句话分成不同大小的块,只要求每一个token注意到块中的token即可。(动手计算一下Q*K^T就明白了)
优化点:1.复杂度减少 2.相应的,可以处理超长token的建模问题
优化2:Flash attention机制:
7.前馈神经网络层是什么样的,可以怎么优化?(解决)
答案:Transformer的前馈神经网络层是由两层线性层和一层非线性层组成,结构是:全连接层 + 非线性层 + 全连接层
优化方式主要是非线性层上的优化,如下
8.非线性化是什么样的,可以怎么优化?(未解决)
答案:Transformer的激活函数是Relu = max(0,x),把小于零的部分变成零
先说一下Relu的缺点:Relu的特点是,当x<=0的时候,会将x设置为0,这样如果出现了大量负数的情况,就会出现大量为0的情况,使得这些神经元在学习的时候就变得无效,无法学习。
优化:,通常取为1
这里的和是经过了两个线性层得到的。
优点:SwiGLU更加的平滑,再加上门控的优点??
9.Padding Mask 、 Attention Mask 、 Casual Mask是什么?有什么用?(解决)
答案:9.1:padding mask是处理变长的序列的过程中,在较短的序列后加上padding,使得所有序列变成相同长度;
9.2:attention mask是在计算注意力机制的时候,确保哪些token可以被看到,例如:casual mask,确保在decoder中的自回归步骤,只能看到该token之前的token,而看不到后面的token,这样保证在训练的过程中,在自回归的过程中,预测的结果是真的预测出来的,而不是提前看见,然后说出来的
9.3:MLM Mask:这是在bert中用到的掩码机制,bert是encoder-only模型,在训练的时候,随机掩盖15%的token,让bert来学习,在掩盖的15%token中,其中80%是掩盖为[Mask]标记,10%替换为随机token,10%不变
10.transformer结构怎么进行更好地并行训练?(解决)
答案:10.1:self-attention计算注意力的时候是并行计算的;
10.2:层并行化,Transformer的不同层放到不同的GPU上进行并行处理;
10.3:数据并行化:将数据切分为一定大小的batch;
等等
11.Transformer层归一化函数是什么?有什么改进?(解决)
答案:1.层归一化函数,在Transformer中是layer norm,举个例子:
如果编码后的向量是(5,10),也就是5个token,每个token的向量维度是10,那么对于layernorm来说,归一化是横着来的,最后结果是(5,1);但是batchnorm是竖着来的,最后结果是(1,10).layernorm对于某个token进行归一化,batchnorm是以这句话为整体进行归一化。
具体公式为:
其中\gamma和\beta是可学习的参数
2.除了层归一化之外,还有RMSnorm,RMSnorm其实也是在layer norm的基础上进行改进的,具体公式如下:
12.Transformer层归一化的位置在哪里,有什么改进?(解决)
答案:Transformer层归一化的位置在注意力机制和FFN层之后,LLama模型的层归一化位置在注意力机制和FFN层之前
13.Transformer的注意力机制中,为什么要除以?(解决)
答案:一方面是为了避免梯度消失,另一方面是为了归一化。
先解释避免梯度消失:在softmax函数而言,值越大,导数值越小,除以sqrt(d_k)之后,导数值相对变大。
再解释一下归一化,数学计算如下:条件:Q和K的均值为0,方差为1且Q和K相互独立;将矩阵Q分块为(q1,q2,...,q_d),同样将K也这样分块,(k1,k2...,k_d),在计算的时候Q*K^T = q1*k1 + q2*k2 + ... + q_d * k_d.,于是Var(Q*K^T / sqrt(d)) = 1(动手写一下就明白了,假设均值为0,方差为1,且QK独立是重要的)
为什么Q和K可以假设为独立的呢? 这就要追溯到QK是怎么得到的,Q = x * Wq K = x*Wk,这里x是常数,因为Wq和Wk是独立的,所以Q和K是独立的
所以就进行了所谓的归一化
14.Transformer中用的优化器是什么?有哪些其他的优化器?(解决)
答案:SGD,Adam,AdamW
SGD适用于简单的机器学习模型和深度学习模型;Adam适用于复杂,高维,噪声较大的任务;Adamw保留了Adam的优点的同时,又加上了正则化来避免过拟合。
15.介绍一下Transformer中的多头注意力机制的实现方式是什么样的?(解决)
答案:如果一句话有30个token,编码后的向量维数是(30,512),WQ,WK,WV是(512,512),那么Q,K,V是(30,512),然后分到八个头,每个头有64维,那么Q,K,V就是(8,30,64),然后Q,K做注意力机制的乘积,得到了(8,30,30),然后再做softmax之后和V相乘得到(8,30,64),然后再把八个头合起来,先变成(30,8,64),然后合起来(30,512).
如果一个batch有64句话,那么在维度的最前面加上64,例如(64,8,30,64),具体变换的意义也是很明显的