LLM Note

server/2025/2/11 18:49:00/

PreNorm vs PostNorm

Transformer Layer中有两处残连接,分别是网络输入 x \boldsymbol x xSelfAttention层MLP/FFN层的输出。

前标准化: 标准化在残连接add之前,即对SelfAttention/MLP层的输入进行标准化,将其输出再与输入相加。
后标准化: 标准化在残连接add之后,即网络输入与SelfAttention/MLP层输出相加后,进行标准化。

Qwen2 DecoderLayer的实现:

python">class Qwen2DecoderLayer(nn.Module):def __init__(self, config: Qwen2Config, layer_idx: int):super().__init__()self.hidden_size = config.hidden_sizeself.self_attn = Qwen2Attention(config=config, layer_idx=layer_idx)self.mlp = Qwen2MLP(config)self.input_layernorm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps)self.post_attention_layernorm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps)if config.sliding_window and config._attn_implementation != "flash_attention_2":logger.warning_once(f"Sliding Window Attention is enabled but not implemented for `{config._attn_implementation}`; ""unexpected results may be encountered.")def forward(self,hidden_states: torch.Tensor,attention_mask: Optional[torch.Tensor] = None,position_ids: Optional[torch.LongTensor] = None,past_key_value: Optional[Cache] = None,output_attentions: Optional[bool] = False,use_cache: Optional[bool] = False,cache_position: Optional[torch.LongTensor] = None,position_embeddings: Optional[Tuple[torch.Tensor, torch.Tensor]] = None,  # necessary, but kept here for BC**kwargs: Unpack[FlashAttentionKwargs],) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]:residual = hidden_stateshidden_states = self.input_layernorm(hidden_states)# Self Attentionhidden_states, self_attn_weights = self.self_attn(hidden_states=hidden_states,attention_mask=attention_mask,position_ids=position_ids,past_key_value=past_key_value,output_attentions=output_attentions,use_cache=use_cache,cache_position=cache_position,position_embeddings=position_embeddings,**kwargs,)hidden_states = residual + hidden_states# Fully Connectedresidual = hidden_stateshidden_states = self.post_attention_layernorm(hidden_states)hidden_states = self.mlp(hidden_states)hidden_states = residual + hidden_statesoutputs = (hidden_states,)if output_attentions:outputs += (self_attn_weights,)return outputs

Grouped-Query Attention(GQA)

两种方法弥补参数:

  • 扩展FFN层宽度
  • 扩展网络深度

源码:https://github.com/fkodom/grouped-query-attention-pytorch/blob/main/grouped_query_attention_pytorch/attention.py

python">import torch
from einops import einsum, rearrange# Initialization
bsz = 2
qlen = 128
kv_cache_len = 32
hsz = 5120
qhead = 40
khead = 8head_dim = 5120 // qhead
num_head_groups = qhead // kheadq_proj = torch.nn.Linear(hsz, qhead * head_dim)
k_proj = torch.nn.Linear(hsz, khead * head_dim)
v_proj = torch.nn.Linear(hsz, khead * head_dim)
o_proj = torch.nn.Linear(qhead * head_dim, hsz)x = torch.randn((bsz, qlen, hsz))# position from kv_cache_len to kv_cache_len + qlen - 1
q = q_proj(x)
k = k_proj(x)
v = v_proj(x)# position from 0 to kv_cache_len - 1
k_cache = torch.randn(bsz, kv_cache_len, khead * head_dim)
v_cache = torch.randn(bsz, kv_cache_len, khead * head_dim)# expand kv cache
k = torch.concat((k_cache, k), 1)
v = torch.concat((v_cache, v), 1)
print('shape after concat kv cache:', q.size(), k.size(), v.size())
# torch.Size([2, 128, 5120]) torch.Size([2, 160, 1024]) torch.Size([2, 160, 1024])# !!!这里实现与源码不同,源码是b n (h g d) -> b g h n d,感觉没必要加一层转置???
q = rearrange(q, 'b n (g h d) -> b g h n d', g=num_head_groups, h=khead, d=head_dim)
k = rearrange(k, 'b s (h d) -> b h s d', h=khead, d=head_dim)
v = rearrange(v, 'b s (h d) -> b h s d', h=khead, d=head_dim)
print('shape after reshape:', q.size(), k.size(), v.size())
# torch.Size([2, 5, 8, 128, 128]) torch.Size([2, 8, 160, 128]) torch.Size([2, 8, 160, 128])scores = einsum(q, k, 'b g h n d, b h s d -> b g h n s')
attention = scores.softmax(-1)
print('attention shape:', attention.size())
# torch.Size([2, 5, 8, 128, 160])out = einsum(attention, v, 'b g h n s, b h s d -> b g h n d')
out = rearrange(out, 'b g h n d -> b n (g h d)')
print('out shape:', out.size())
# torch.Size([2, 128, 5120])

Scaling Law

算力与批次大小和学习率的关系: 算力增加,最优批次大小增加,但是最优学习率下降。

批次大小增加,最优学习率不应该增加吗?为什么下降?

从噪声角度来看:小批次训练时,噪声大,较大的学习率有助于跳出局部最优点,提高模型泛化能力。大批次训练时,噪声小、梯度反向更准确,使用较小的学习率有助于保证模型训练的稳定性。

从线性缩放角度来看,批量增大到一定程度后,梯度方向已接近真实梯度(类似梯度下降),此时学习率需调整为更保守的值(如按根号batch size缩放),而非线性增长。

Qwen系列模型需要知道的几点

  • SiLU/SwishGLU激活函数
  • RMSNorm均方根正则化
  • PreNorm前层正则化

http://www.ppmy.cn/server/166831.html

相关文章

记录IMX6ULL开发板上移植SQLite3并运行Qt程序

文章目录 概要移植SQLite3Qt程序部署实验现象 概要 基于上一章对使用Qt运行对应的实验实例来完成对用户使用ui界面完成对SQLite数据库的增删改查等操作。本文旨在对上一句节的Qt程序部署到IMX6ULL开发板,并且完成对SQLite数据库在IMX6ULL开发板上的移植。 移植SQ…

docker配置国内源

在国内使用 Docker 时,由于默认的官方镜像源在访问速度上可能较慢,因此我们可以配置国内的镜像源来加快 Docker 镜像的下载速度。以下是配置国内 Docker 镜像源的步骤: 1. 修改 Docker 的配置文件 Docker 使用 /etc/docker/daemon.json 文件…

CNN-day6-经典神经网络AlexNet

day7-经典神经网络AlexNet ImageNet大规模视觉挑战赛(ILSVRC)被称为深度学习在图像分类任务研究方面进展的标杆。 AlexNet网络参加了ILSVRC2012年大赛获得冠军(超过第二名10%的性能),掀起了一波深度学习的浪潮,一个具有里程碑意…

微信小程序案例3——仿香哈菜谱微信小程序

文章目录 项目步骤第一部分 导航栏设计第一步:第三步:第四步第五步:第二部分:第1步:轮播图第2步 :宫格导航第3步:香哈头条初始化数据第4步:香哈头条列表渲染及绑定数据效果讲解1 swiper轮播图2 WXML 模板3 WXML引用import引用include引用4 WXML 列表渲染wx:for列表渲染…

2025年最新版武书连SCD期刊(中国科学引文数据库)来源期刊已更新,可下载PDF版!需要的作者进来了解~

2025年最新版武书连SCD期刊(中国科学引文数据库)来源期刊已更新! 官网是不提供免费查询的。小编给大家两个路径,无需下载PDF,随时随地都能查25版SCD目录。 路径一:中州期刊联盟官网,25版SCD目…

ART光学跟踪系统在汽车制造与设计审核中的实际应用

虚拟现实技术的融入正在快速推动汽车制造与设计审核领域实现前所未有的变革。其中,ART光学跟踪系统以其高精度和高效性,在这一领域展现出了巨大的应用价值。本文将深入探讨ART光学跟踪系统在汽车制造与设计审核中的实际应用,揭示其如何助力汽…

Git 与持续集成 / 持续部署(CI/CD)的集成

一、引言 在当今快速发展的软件开发领域,高效的代码管理和持续的交付流程是项目成功的关键因素。Git 作为一款分布式版本控制系统,已经成为了开发者们管理代码的标配工具;而持续集成 / 持续部署(CI/CD)则是一种能够加…

Unity3D仿星露谷物语开发28之切换场景

1、目标 Player可以在Scene1_Farm和Scene2_Field之间自动切换。通过Trigger实现该功能。同时创建一个预设体绑定该功能,这样可以把预设体放到任何场景中,通过配置即可实现Player在Scene之间的自由切换。 2、创建场景切换的工具对象 在Hierarchy中&…