合肥做网站的企业,佛山seo优化,八年级信息网站怎么做,2345天气预报第六章:自然语言处理技术全景
6.2 Transformer架构在NLP中的关键改进 学习目标
深入理解Transformer架构在自然语言处理中的核心改进点,掌握位置编码、注意力机制、训练优化等关键技术的发展脉络,了解如何针对不同NLP任务优化Transformer架构,并能够根据实际需求选择合适…第六章:自然语言处理技术全景6.2 Transformer架构在NLP中的关键改进学习目标深入理解Transformer架构在自然语言处理中的核心改进点,掌握位置编码、注意力机制、训练优化等关键技术的发展脉络,了解如何针对不同NLP任务优化Transformer架构,并能够根据实际需求选择合适的变体。一、位置编码系统的演进1.1 绝对位置编码的局限性与改进正弦位置编码的问题分析原始Transformer的正弦位置编码存在三大局限:长度外推性差:训练时固定最大长度,测试时难以处理更长序列# 训练时位置索引最大512pos=torch.arange(512)# [0, 1, ..., 511]# 测试时遇到513长度序列,sin(512/10000^0)未在训练中出现高频振荡问题:高维度位置编码振荡过快,影响模型学习维度i=0: sin(pos/10000^0) = sin(pos) # 周期2π ≈ 6.28 维度i=256: sin(pos/10000^(512/512)) = sin(pos/10000) # 周期62800绝对位置偏差:相对位置关系需要模型自行从绝对位置推断学习式位置编码将位置编码作为可学习参数:classLearnedPositionalEncoding(nn.Module):def__init__(self,max_len,d_model):super().__init__()self.pe=nn.Parameter(torch.zeros(1,max_len,d_model))nn.init.trunc_normal_(self.pe,std=0.02)defforward(self,x):returnx+self.pe[:,:x.size(1),:]优势:更灵活,适应任务特性劣势:无法外推到训练未见长度,需预设最大长度相对位置编码的革命T5的相对位置偏置T5模型将相对距离分桶,每个桶学习一个偏置标量:classT5RelativePositionBias(nn.Module):def__init__(self,num_buckets=32,max_distance=128,num_heads=12):super().__init__()self.num_buckets=num_buckets self.max_distance=max_distance self.relative_attention_bias=nn.Embedding(num_buckets,num_heads)def_relative_position_bucket(self,relative_position):# 将相对距离映射到桶索引ret=0n=-relative_positionifrelative_position0:ret=self.num_buckets//2else:n=-relative_position max_exact=self.num_buckets//4is_small=nmax_exactifis_small:ret+=nelse:# 对数分桶ret+=max_exact+(torch.log(n.float()/max_exact)/math.log(self.max_distance/max_exact)*(self.num_buckets-max_exact)).long()returnretdefforward(self,query_length,key_length):# 计算相对位置矩阵context_position=torch.arange(query_length)[:,None]memory_position=torch.arange(key_length)[None,:]relative_position=memory_position-context_position# 映射到桶索引rp_bucket=self._relative_position_bucket(relative_position)values=self.relative_attention_bias(rp_bucket)values=values.permute([2,0,1]).unsqueeze(0)returnvalues设计特点:对数分桶:近处精确,远处粗略双向对称:区分前后方向参数量少:仅需num_buckets × num_heads个参数DeBERTa的分离式注意力DeBERTa将内容和位置信息分离计算:[\begin{aligned}Q_c = HW_q, \quad K_c = HW_k, \quad V_c = HW_v \Q_r = P_rW_{q,r}, \quad K_r = P_rW_{k,r} \A_{i,j} = Q_c_i K_c_j^\top + Q_c_i K_r_{\delta(i,j)}^\top + Q_r_{\delta(i,j)} K_c_j^\top\end{aligned}]其中δ(i,j)\delta(i,j)δ(i,j)表示相对位置编码。1.2 旋转位置编码(RoPE):理论优美的解决方案复数空间旋转的直观理解将词嵌入向量视为复数空间中的向量,通过旋转操作注入位置信息:二维情况:给定位置mmm的词嵌入向量[x1,x2][x_1, x_2][x1,x2],旋转编码为:[\begin{bmatrix}x_1’ \ x_2’\end{bmatrix}\begin{bmatrix}\cos m\theta -\sin m\theta \\sin m\theta \cos m\theta\end{bmatrix}\begin{bmatrix}x_1 \ x_2\end{bmatrix}]RoPE的完整数学形式对于ddd维向量,将其分成d/2d/2d/2组,每组应用不同频率的旋转:[f_{\text{RoPE}}(x, m) =\begin{pmatrix}x_1 \ x_2 \ x_3 \ x_4 \ \vdots \ x_{d-1} \ x_d\end{pmatrix}\otimes\begin{pmatrix}\cos m\theta_1 \ \cos m\theta_1 \ \cos m\theta_2 \ \cos m\theta_2 \ \vdots \ \cos m\theta_{d/2} \ \cos m\theta_{d/2}\end{pmatrix}+\begin{pmatrix}-x_2 \ x_1 \ -x_4 \ x_3 \ \vdots \ -x_d \ x_{d-1}\end{pmatrix}\otimes\begin{pmatrix}\sin m\theta_1 \ \sin m\theta_1 \ \sin m\theta_2 \ \sin m\theta_2 \ \vdots \ \sin m\theta_{d/2} \ \sin m\theta_{d/2}\end{pmatrix}]RoPE的关键特性相对位置保持:两个向量的点积只与相对位置有关[f_{\text{RoPE}}(q, m)^\top f_{\text{RoPE}}(k, n) = g(q, k, m-n)]长度外推性:可处理任意长度序列线性注意力兼容:可与线性注意力结合RoPE的实践实现importtorchdefapply_rotary_pos_emb(q,k,cos,sin,position_ids):"""应用旋转位置编码"""# q, k: [batch_size, seq_len, num_heads, head_dim]# cos, sin: [seq_len, head_dim]# 将q和k的前半部分和后半部分分离q_embed=(q*cos)+(rotate_half(q)*sin)k_embed=(k*cos)+(rotate_half(k)*sin)returnq_embed,k_embeddefrotate_half(x):"""旋转一半维度:将[x1, x2, ..., xd]变为[-x2, x1, ..., -xd, x_{d-1}]"""x1=x[...,:x.shape[-1]//2]x2=x[...,x.shape[-1]//2:]returntorch.cat([-x2,x1],dim=-1)defprecompute_freqs_cis(dim:int,end:int,theta:float=10000.0):"""预计算旋转频率"""freqs=1.0/(theta**(torch.arange(0,dim,2)[:(dim//2)].float()/dim))t=torch.arange(end)freqs=torch.outer(t,freqs)# [seq_len, dim//2]# 转换为复数形式freqs_cis=torch.polar(torch.ones_like(freqs),freqs)# e^(i*theta)returntorch.view_as_real(freqs_cis)# [seq_len, dim//2, 2]1.3 ALiBi:线性偏置的简洁之美ALiBi的核心思想在注意力分数上添加与距离成线性关系的负偏置:[\text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}} + m \cdot \text{bias}\right)V]其中bias\text{bias}bias是一个下三角矩阵,mmm是头特定的斜率。偏置矩阵设计defget_alibi_mask(n_heads,max_len):"""生成ALiBi偏置矩阵"""slopes=torch.tensor(get_slopes(n_heads))# 不同头的斜率bias=torch.arange(max_len).view(1,1,max_len)-torch.arange(max_len).view(1,max_len,1)bias=-torch.abs(bias)# 距离越远,偏置越负# 每个头乘以不同的斜率bias=bias.unsqueeze(0)*slopes.view(