AI自学笔记
l l a m a llamallama流程结构理解每个h e a d headhead可能代表一类信息比如标点符号的权重、或者是意义的关联度以及各个范畴内对两个t o k e n tokentoken之间关联度的权重表示。还是从代码角度捋一捋流程。b a t c h _ s i z e batch\_sizebatch_size*h i d d e n _ s i z e hidden\_sizehidden_size推理时b a t c h 1 batch1batch1Q ′ QQ′:hidden_size, head_dim, head_numK ′ KK′:hidden_size, head_dim, head_numV ′ VV′:hidden_size, head_dim, head_numO ′ OO′:hidden_size, head_dim, head_nums o f t m a x ( softmax(softmax(( x Q ′ (xQ(xQ′*( 拼起来 ( x K ′ , p a s k K ) ) T ) ∗ V (拼起来(xK, paskK) )^T)*V(拼起来(xK′,paskK))T)∗V假设QxQ,KxK,VxV初始x(seq_len, hidden_size)总体应该是这样Q(head_num, seq_len(infer时1), head_dim)K(head_num, head_dim, past_token_num)V(head_num, head_dim, past_token_num)O(head_num, head_dim, hidden_size)QK (head_num, seq_len, past_token_num)QKsoftmax(QK) 对于每个head去做softmaxQKV(head_num, head_dim, seq_len)QKVO(seq_len, hidden_size)最后这个乘法相当于向量*常量了。这里实际采用的是BMM批量矩阵乘法s o f t m a x softmaxsoftmax应该是以h e a d headhead为单位做吧每个h e a d headhead做类似归一化的操作使得所有t o k e n tokentoken概率加起来 1 11如何理解Q K QKQK可以理解为向量点积计算与之前t o k e n tokentoken的关联度。s o f t m a x softmaxsoftmax之后实际上是n u m _ h e a d num\_headnum_head个关联度计算结果每个可能代表学习到的某个特征的与某个t o k e n tokentoken的关联度比如标点符号或者位置之类的。对V VV来说就是对当前t o k e n tokentoken的向量做一个线性变换所以s o f t m a x softmaxsoftmax的结果与V VV想乘实际上这一步是为了组成更新的能够代表当前t o k e n tokentoken的向量而服务本质是一个加权乘法比如只考虑一个h e a d headhead这时候Q K QKQK的结果已经是形状为( 1 , n u m _ p a s t _ t o k e n s ) (1, num\_past\_tokens)(1,num_past_tokens)每个位置可以理解为与对应t o k e n tokentoken的关联度。这个与( n u m _ p a s t _ t o k e n s , h e a d _ d i m ) (num\_past\_tokens, head\_dim)(num_past_tokens,head_dim)的V想乘就是根据s o f t m a x softmaxsoftmax权重加权乘上对应t o k e n tokentoken的向量相加得到一个能够大体表达当前t o k e n tokentoken的h e a d d i m head_dimheaddim维度的向量。所以本质上还是用以前的token通过一定组合表达当前的token \textbf{用以前的token通过一定组合表达当前的token}用以前的token通过一定组合表达当前的tokenh i d d e n _ s t a t e s r e s i d u a l h i d d e n _ s t a t e s hidden\_states residual hidden\_stateshidden_statesresidualhidden_states这里的r e s i d u a l residualresidual是经过a t t e n t i o n attentionattention之前的h i d d e n _ s t a t e s hidden\_stateshidden_states值为了强化当前t o k e n tokentoken的影响因为会过很多a t t e n t i o n attentionattention层所以要不断提醒模型虽然能被别的人表示但我还是我是独特的是不被定义的。这之后会经过N O R M NORMNORM避免参数爆炸 归一化一下整体缩放下h i d d e n _ s t a t e hidden\_statehidden_state然后会经过M L P MLPMLP层这里会先经历一次矩阵乘法向量升维度然后再矩乘一次降维特别的中间会经历一层激活层也就是将某些维度的值给砍掉。我对于这里的理解是之前a t t e n t i o n attentionattention做的事线性变换考虑的是其他t o k e n tokentoken的影响但是是线性也意味着容易得出规律这样无法表达出很多情况就像多项式次数越多的多项式能够表达的东西越多。激活层我理解就是为了增加复杂度以应对复杂情况的表示毕竟不光是遗传还得考虑的基因突变的可能。最后再经过一层类似M L P MLPMLP维度按照词库大小做个s o f t m a x softmaxsoftmax啥的取概率最大的那个当作预测的下一个t o k e n tokentoken即可。l l a m a llamallama整体结构还是挺简单易懂的以后学到点什么还是记下来不然容易忘干净了。感觉大模型大道至简其实是忽略了细节非常抽象宏观与C N N , R N N CNN, RNNCNN,RNN对比就可见端倪。这俩反而更复杂但对于细节应该理解更出色某些领域应该还是能够继续有用。FlashAttention学习这篇文章写得很好从讲故事的角度来理解flashattention的产生GPU架构真的得记录一下SM 若干72个用户无法设置用哪个-调度-BLOCK(可以是多维如(128, 2, 2)但是三维乘积有上限包含乘积个线程-调度-thread(单个线程但是32个为一组执行同一个指令)首先理解GPU的存储结构以A10为例DRAM/HBM (20 GB)-L2 cache(6M)-shared_mem/L1 cache (per SM, 100K)-register延迟越来越低内存越来越小。SRAM在L2 cache之后的层级所以希望attention能够尽量用延迟最低的部分计算。所以最基础简单的矩阵乘法不可行需要O(n^2)的空间太大绝对超过shared_mem能够满足的层级。如果要空间尽可能小就要求在线计算(online process)。就是即算即走。所以一开始要达到的目标就是简化公示使得能够不费空间F l a s h A t t e n t i o n FlashAttentionFlashAttention一句话来解释还是从巧妙减少空间复杂度的角度来解释。原本的a t t e n t i o n attentionattention中Q K QKQK会产生一个N ∗ N N*NN∗N的大矩阵症结在于softmax必须要算出所有pasttoken的score才能在一起算softmax归一化。但是实际上softmax可以只记录max啥的分治处理所以不用每次都N*N生成出来可以部分处理计算