1. 项目缘起当Transformer遇上“几何直觉”在深度学习领域尤其是计算机视觉和自然语言处理中Transformer架构已经从一个革命性的创新演变成了一个近乎“标配”的基础设施。从最初的ViTVision Transformer到后来的Swin Transformer再到层出不穷的各种变体大家都在思考同一个问题如何让这个强大的模型变得更高效、更轻量同时又不损失其核心的全局建模能力我们常常会陷入一种“工程化”的思维定式为了轻量化就去剪枝、量化、蒸馏或者设计更复杂的注意力机制来降低计算复杂度。这些方法当然有效但它们更像是“外科手术”在已有的、相对固定的结构上进行修补。有没有可能从更底层的“建筑学”角度重新审视Transformer的骨架引入一些先验的、符合数据本质特性的结构约束从而从根本上实现轻量化和性能提升呢这就是“三相位Transformer架构”试图回答的问题。它不是一个简单的注意力机制改进也不是一个花哨的模块堆叠而是一次基于“几何先验”对Transformer核心计算流程的结构性重构。这里的“几何先验”听起来有些抽象但你可以把它理解为一种对数据内在空间或关系结构的假设。比如一张图片的像素之间天然具有二维网格的邻接关系一段文本的词语之间除了顺序也可能存在语法树状的层级关系。传统的Transformer尤其是标准的自注意力机制在建模这些关系时是“平等”且“全连接”的这带来了强大的灵活性但也引入了巨大的计算开销和冗余。“三相位”的构想正是将这种全连接、无差别的信息混合过程拆解为三个有明确几何意义和功能分工的阶段。它试图模仿一种更高效的信息处理流程先局部聚合再在特定结构下进行中程交互最后进行全局精炼。这就像处理一个复杂问题我们不会一开始就让所有人互相讨论而是先分小组局部内部达成共识然后让小组代表基于某种结构如树状或环状进行协商最后再由一个中心节点汇总并微调全局策略。这种分阶段、有结构的信息流动在理论上更符合许多现实世界数据的组织方式在实践上则能显著减少不必要的计算。接下来我将深入拆解这个架构的核心思想、具体实现以及它背后的设计逻辑。你会发现这不仅仅是一个模型更是一种将领域知识几何先验深度嵌入模型骨架的设计哲学。2. 核心思想拆解什么是“三相位”与“几何先验”要理解三相位Transformer我们必须先跳出代码和公式从概念上把握两个核心关键词“三相位”和“几何先验”。它们是这个架构的灵魂所在。2.1 “几何先验”的具象化理解在深度学习中“先验”指的是我们在训练模型之前就对数据或任务本身做出的一些合理假设。而“几何先验”特指关于数据点之间空间或拓扑关系的假设。在视觉任务中最直接的几何先验就是“局部性”。一个像素与其上下左右相邻像素的关系远比它与图像另一角的像素关系更紧密、更重要。卷积神经网络CNN的成功很大程度上就源于其卷积核隐式地强加了这种强大的局部性先验。在序列任务中虽然文本是1维序列但同样存在“局部上下文”先验一个词的含义受其前后几个词影响最大和“句法层次”先验主谓宾等语法结构形成的树状关系。在图数据中几何先验就是图本身的连接关系节点只与其邻居直接相关。标准Transformer的自注意力机制是“几何无先验”或“弱先验”的。理论上序列中的任何一个token都可以关注所有其他token。这种灵活性让它能捕捉长程依赖但也意味着它需要学习所有可能的关系包括那些现实中几乎不存在的、冗余的关系。这导致了O(N²)的计算和内存复杂度。引入几何先验的目的就是将这些“不太可能”或“不重要”的连接在结构层面进行约束或简化引导模型更高效地学习真正有意义的关系。它不是通过损失函数间接鼓励而是直接修改了模型的计算图。2.2 “三相位”计算流程的构想“三相位”是对标准Transformer前向传播过程的一种重新划分。标准流程可以粗略地看作Token嵌入 - (自注意力 前馈网络) × L层 - 输出。而三相位架构将其解耦为三个串行且功能专注的阶段局部聚合相位这是最贴近输入数据的一层。在此阶段模型严格遵循最强的几何先验如局部邻接。每个数据单元如图像块、文本词只与其最直接的几何邻居进行信息交换。在视觉中这类似于一个轻量级的、固定感受野的卷积或基于窗口的自注意力在文本中类似于一个定长的N-gram上下文建模器。这个阶段的目标是快速提取低层、高分辨率的局部特征滤除噪声形成初步的特征表示。它的计算是高度并行的且复杂度通常与序列长度成线性关系。结构化交互相位这是架构的核心创新点。经过局部聚合后我们得到了一组具有丰富局部信息的特征。此时不再进行全连接交互而是依据一个预设的、更粗粒度的“几何结构”进行信息传递。这个结构就是引入的几何先验。例如基于层次树的结构我们可以将局部特征块进行聚类形成超像素或语义片段然后在这些聚类代表的节点之间构建一个树状结构如图像中的四叉树文本中的句法树。交互只发生在树的相邻层级之间父节点与子节点或同层兄弟节点之间。例如基于图的结构如果数据本身有关联图如社交网络、分子结构那么这个相位就直接在图上进行消息传递。例如基于多尺度网格的结构在视觉任务中可以构建一个图像金字塔在不同尺度的特征图之间进行信息交互下采样路径传递上下文上采样路径传递细节。 这个阶段的关键在于交互的路径不再是全连接而是沿着一个稀疏的、有意义的拓扑结构进行。这极大地降低了计算复杂度从O(N²)降至O(N log N)甚至O(N)同时迫使模型学习符合该结构的中程和远程依赖。全局精炼相位在经过前两个阶段后模型已经融合了局部细节和结构化中程信息。全局精炼相位的目的是引入一个非常轻量级的“全局视野”对前两阶段的结果进行微调和校准。它不再需要处理原始的高分辨率数据或复杂的结构因此可以设计得非常高效。一种实现方式是使用一个极简的全局注意力层但作用的序列长度已经通过前期的结构抽象大大缩短例如作用于树结构的根节点或图结构的聚类中心。另一种方式是使用一个小型的前馈网络或线性变换对整合后的特征进行最后的非线性映射和维度调整。 这个相位计算代价很小但确保了模型最终具备捕捉真正全局性交互的能力弥补了纯结构化交互可能遗漏的某些长程关联。三相位的关系它们是一个递进的信息抽象过程。局部相位捕获“纹理”结构化相位捕获“形状”和“部件间关系”全局相位进行最后的“整体协调”。这种分工明确的流程相比标准Transformer中每一层都试图同时做所有事情在计算上更经济在概念上也更清晰。3. 架构设计与实现细节理解了核心思想后我们来看如何将其落地为一个具体的神经网络架构。这里我将以一个面向图像分类任务的“三相位视觉Transformer”为例进行详细说明。你可以将其思想迁移到其他模态。3.1 整体架构框图与数据流假设输入是一张224x224的RGB图像。输入图像 (224x224x3) | v [阶段一局部聚合相位] 1. 图像分块与线性投影将图像划分为16x16的块共196个块每个块投影为C维向量。 2. 局部窗口自注意力将196个块划分为不重叠的7x7窗口每个窗口含4个块。在每个窗口内部进行标准的自注意力计算。这是强局部性先验。 | v 中间特征: [196, C] (已蕴含局部上下文) | v [阶段二结构化交互相位] 1. 构建层次树 a. 将每2x2个相邻的块特征进行平均池化得到49个“超块”特征。 b. 递归地再将2x2个“超块”池化得到更高层节点直至根节点。 c. 形成一棵四叉树叶子节点是原始196个块中间节点是不同尺度的聚合特征。 2. 树状消息传递 a. 自底向上传递子节点特征经过线性变换后汇总到父节点。 b. 自顶向下传递父节点特征经过线性变换后广播并加到子节点特征上。 c. 可以在树的每一层内部让兄弟节点之间也进行轻量化的注意力交互。 | v 精炼特征: [196, C] (已融合多尺度结构化信息) | v [阶段三全局精炼相位] 1. 全局池化对196个块特征进行平均池化得到一个全局特征向量 [1, C]。 2. 轻量级MLP或注意力将该全局向量通过一个小的MLP或让其与所有块特征做一次简化的交叉注意力Key和Value来自块特征Query是全局向量。 3. 特征回馈将处理后的全局信息广播加回到每个块特征上。 | v 最终特征: [196, C] (具备局部、结构、全局信息) | v 分类头对[CLS] token或全局平均池化后的特征进行分类。3.2 关键组件实现解析1. 局部聚合相位窗口化自注意力这是目前Swin Transformer等模型已经验证有效的策略。其核心是将计算限制在局部窗口内。# 伪代码示意 def local_phase(x, window_size7): x: [B, N, C] 输入序列N196块数 window_size: 窗口大小以块为单位 B, N, C x.shape H W int(N ** 0.5) # 假设是正方形排列HW14 # 1. 将序列重排为2D图像格式 x x.reshape(B, H, W, C) # 2. 划分窗口 x_windows window_partition(x, window_size) # [B*num_windows, window_size*window_size, C] # 3. 在每个窗口内计算自注意力 attn_windows WindowAttention(x_windows) # 可以是标准多头注意力 # 4. 窗口还原 x window_reverse(attn_windows, window_size, H, W) # [B, H, W, C] x x.reshape(B, N, C) return x设计理由在最低层施加最强的局部性约束符合视觉特征由局部到全局的认知规律。计算复杂度从O(N²)降至O(N * w²)其中w是窗口大小是常数。2. 结构化交互相位可学习的树构造与传播这是最具创新也最需要精心设计的部分。静态的、基于规则如四叉树的构造简单但可能不最优。我们可以引入可学习机制。# 伪代码示意基于可学习聚类的图结构交互 def structured_phase(x, num_clusters32): x: [B, N, C] 局部相位输出 num_clusters: 希望聚合成的聚类中心数量 B, N, C x.shape # 1. 可学习地生成聚类中心结构先验的嵌入 cluster_centers nn.Parameter(torch.randn(1, num_clusters, C)) # [1, K, C] cluster_centers cluster_centers.repeat(B, 1, 1) # [B, K, C] # 2. 计算所有块特征到聚类中心的软分配权重相似度 # 这里可以用点积注意力实现“软聚类” affinity torch.matmul(x, cluster_centers.transpose(-1, -2)) # [B, N, K] assignment F.softmax(affinity, dim-1) # 软分配矩阵表示每个块属于每个聚类的程度 # 3. 聚合根据分配权重将块特征聚合到聚类中心 # cluster_features assignment.T x但更高效写法 cluster_features torch.matmul(assignment.transpose(-1, -2), x) # [B, K, C] # 4. 在聚类中心之间进行交互图注意力 # 现在我们在一个较小的图K个节点上操作可以承受更复杂的注意力 updated_clusters GraphAttention(cluster_features) # [B, K, C] # GraphAttention可以是标准自注意力也可以考虑聚类中心间的相似性构建邻接矩阵。 # 5. 广播将更新后的聚类特征传播回原始块 # 每个块的特征用其所属各聚类特征的加权和来更新 updated_x torch.matmul(assignment, updated_clusters) # [B, N, C] # 6. 残差连接 x x updated_x return x设计理由通过可学习的聚类模型能自动发现数据中潜在的结构化分组如物体的部件、图像的语义区域。在这个稀疏的、高级别的图结构上进行交互效率远高于全连接。这相当于让模型自己学会如何“分组建模”。3. 全局精炼相位高效全局上下文建模此阶段输入已经是富含信息的特征无需复杂操作。def global_phase(x): B, N, C x.shape # 方案A轻量级交叉注意力一个查询 global_query self.global_token.unsqueeze(0).repeat(B, 1, 1) # [B, 1, C] context torch.mean(x, dim1, keepdimTrue) # [B, 1, C] 作为Key/Value的摘要 # 一个简单的单头注意力 global_context torch.matmul(F.softmax(torch.matmul(global_query, context.transpose(-1, -2)), dim-1), context) x x global_context # 广播加到所有位置 # 方案B简化的SE模块Squeeze-and-Excitation global_weights torch.sigmoid(self.fc2(F.relu(self.fc1(x.mean(dim1))))) # [B, C] x x * global_weights.unsqueeze(1) # [B, N, C] return x设计理由方案A用一个可学习的全局令牌去“询问”整个特征图的上下文摘要计算量极小O(NC)。方案B通过全剧平均池化和两个全连接层生成通道权重是经典的轻量级全局注意力。它们都能以极低成本引入全局视角。3.3 轻量化效益分析我们来定量对比一下计算复杂度FLOPs和参数量。假设输入N个token维度为C。标准Transformer层自注意力FFN自注意力~4NC² 2N²C。其中N²C项是核心瓶颈。FFN~8NC²。总计~12NC² 2N²C。三相位架构估算局部相位窗口注意力窗口大小w窗口数N/w²。每个窗口内复杂度O(w⁴C)。总复杂度 ~N * w² * C。当w固定如7此项为O(NC)。结构化相位图交互假设聚类为K个中心K N如K√N。软分配计算O(NKC)。聚类中心间交互在K个节点上做注意力O(K²C KC²)。由于K小此项可控。总复杂度 ~O(NKC K²C)。全局相位O(NC²)或更低。总计主要项为O(NKC NC²)。当K与w²同量级时复杂度从标准Transformer的O(N²)降为O(N^{1.5})甚至接近O(N log N)在长序列上优势巨大。参数量主要增加在于结构化相位中的聚类中心参数和可能的图注意力参数但相比标准Transformer巨大的QKV投影矩阵增量通常很小。整体参数量可以做到与标准模型相近甚至更少。4. 实战在图像分类任务上的实现与调优理论再好也需要实践验证。这里我将分享一个基于PyTorch的简化版三相位Transformer图像分类模块的实现要点和调优经验。4.1 环境搭建与依赖# 基础环境 pip install torch torchvision pip install timm # 优秀的模型库用于参考和对比 pip install einops # 便于张量操作4.2 核心模块代码实现我们实现一个名为TriPhaseTransformerBlock的模块它可以替换标准ViT中的Transformer层。import torch import torch.nn as nn import torch.nn.functional as F from einops import rearrange, repeat class LocalWindowAttention(nn.Module): 局部窗口自注意力 def __init__(self, dim, num_heads8, window_size7, qkv_biasTrue): super().__init__() self.dim dim self.num_heads num_heads self.window_size window_size self.scale (dim // num_heads) ** -0.5 self.qkv nn.Linear(dim, dim * 3, biasqkv_bias) self.proj nn.Linear(dim, dim) def forward(self, x): B, N, C x.shape H W int(N ** 0.5) # 划分窗口 x rearrange(x, b (h w) c - b h w c, hH, wW) x_windows rearrange(x, b (h1 w1) (h2 w2) c - (b h1 w1) (h2 w2) c, h1H//self.window_size, w1W//self.window_size, h2self.window_size, w2self.window_size) # 计算窗口内注意力 qkv self.qkv(x_windows).reshape(-1, self.window_size*self.window_size, 3, self.num_heads, C//self.num_heads) qkv qkv.permute(2, 0, 3, 1, 4) # [3, B*, heads, N*, C//heads] q, k, v qkv[0], qkv[1], qkv[2] attn (q k.transpose(-2, -1)) * self.scale attn attn.softmax(dim-1) x_window (attn v).transpose(1, 2).reshape(-1, self.window_size*self.window_size, C) # 还原窗口 x rearrange(x_window, (b h1 w1) (h2 w2) c - b (h1 h2) (w1 w2) c, h1H//self.window_size, w1W//self.window_size, h2self.window_size, w2self.window_size) x rearrange(x, b h w c - b (h w) c) x self.proj(x) return x class LearnableGraphInteraction(nn.Module): 可学习的图结构交互相位 def __init__(self, dim, num_clusters, num_heads8): super().__init__() self.num_clusters num_clusters self.cluster_centers nn.Parameter(torch.randn(1, num_clusters, dim) * 0.02) # 用于聚类中心间交互的注意力 self.cluster_attn nn.MultiheadAttention(dim, num_heads, batch_firstTrue) self.norm1 nn.LayerNorm(dim) self.norm2 nn.LayerNorm(dim) self.mlp nn.Sequential( nn.Linear(dim, dim * 4), nn.GELU(), nn.Linear(dim * 4, dim) ) def forward(self, x): B, N, C x.shape # 1. 计算软分配 centers repeat(self.cluster_centers, 1 k c - b k c, bB) affinity torch.matmul(x, centers.transpose(-1, -2)) # [B, N, K] assignment F.softmax(affinity, dim-1) # 行和为1每个token对各个聚类的归属度 # 2. 聚合到聚类中心 cluster_features torch.matmul(assignment.transpose(-1, -2), x) # [B, K, C] # 3. 聚类中心自注意力交互 (残差结构) cluster_features_attn self.cluster_attn(cluster_features, cluster_features, cluster_features)[0] cluster_features cluster_features cluster_features_attn cluster_features self.norm1(cluster_features) # 4. 聚类中心FFN cluster_features_mlp self.mlp(cluster_features) cluster_features cluster_features cluster_features_mlp cluster_features self.norm2(cluster_features) # 5. 广播回原始tokens updated_x torch.matmul(assignment, cluster_features) # [B, N, C] return x updated_x # 残差连接 class GlobalContextRefinement(nn.Module): 全局上下文精炼相位 (SE风格) def __init__(self, dim, reduction_ratio16): super().__init__() self.gap nn.AdaptiveAvgPool1d(1) self.fc nn.Sequential( nn.Linear(dim, dim // reduction_ratio, biasFalse), nn.ReLU(inplaceTrue), nn.Linear(dim // reduction_ratio, dim, biasFalse), nn.Sigmoid() ) def forward(self, x): B, N, C x.shape # 全局平均池化得到通道描述符 gap self.gap(x.transpose(1, 2)).view(B, C) # [B, C] # 生成通道权重 channel_weights self.fc(gap).view(B, 1, C) # [B, 1, C] # 加权 return x * channel_weights class TriPhaseTransformerBlock(nn.Module): 三相位Transformer块 def __init__(self, dim, num_heads, window_size7, num_clusters49, mlp_ratio4.): super().__init__() # 局部相位 self.local_attn LocalWindowAttention(dim, num_heads, window_size) self.local_norm nn.LayerNorm(dim) self.local_mlp nn.Sequential( nn.Linear(dim, int(dim * mlp_ratio)), nn.GELU(), nn.Linear(int(dim * mlp_ratio), dim) ) # 结构化相位 self.structured_interaction LearnableGraphInteraction(dim, num_clusters, num_heads//2) # 可用更少的头 self.structured_norm nn.LayerNorm(dim) # 全局相位 self.global_refine GlobalContextRefinement(dim) def forward(self, x): # 局部相位 x x self.local_attn(self.local_norm(x)) x x self.local_mlp(self.local_norm(x)) # 结构化相位 x self.structured_interaction(self.structured_norm(x)) # 全局相位 x self.global_refine(x) return x4.3 训练配置与调优心得将上述模块堆叠起来替换掉标准ViT的Encoder就可以构建完整的分类网络。在ImageNet-1K这样的数据集上进行训练时有以下关键调优点学习率与热身由于引入了可学习的聚类中心等新参数训练初期需要更谨慎。建议使用AdamW优化器初始学习率比标准ViT略低例如3e-4并配合较长的线性热身Warmup阶段10-20个epoch。聚类中心数量num_clusters这是一个关键超参数。它控制着结构化交互的粒度。设置过小如16聚类中心太少可能无法充分表达图像的复杂结构导致信息压缩损失过大性能下降。设置过大如196即不聚类退化回近似全连接失去轻量化意义。经验值对于输入14x14的特征图196个tokennum_clusters设置在32到64之间通常有较好平衡。可以尝试设置为N ** 0.5即14或N / 4即49。我的经验是从较小的值如32开始如果模型欠拟合再适当增加。局部窗口大小window_size决定了最底层的感受野。对于224x224输入16x16的块大小下window_size7意味着每个窗口看到112x112像素的区域这在底层是足够的。也可以尝试可变窗口或多尺度窗口。相位顺序与残差代码中采用了严格的串行顺序局部 - 结构化 - 全局。一个重要的技巧是在每个相位内部和相位之间广泛使用残差连接如代码所示。这能确保梯度有效流动避免因复杂结构导致的训练困难。也可以实验并行或更复杂的交织结构。可视化诊断为了理解模型是否学到了有意义的几何结构可以可视化软分配矩阵assignment。# 在验证时添加钩子或直接在前向传播中返回 def forward(self, x, return_assignFalse): # ... 计算 assignment ... if return_assign: return x, assignment return x将assignment矩阵形状[B, N, K]对于一张图片可以将其reshape为[H, W, K]然后对每个聚类中心k将其对应的分配权重可视化为一幅热力图。你会看到模型是否将语义相似的区域如所有车轮、所有窗户分配到了同一个聚类中心。这是验证“几何先验”是否被有效利用的直接证据。与现有架构结合三相位块可以灵活插入现有架构。例如在Swin Transformer中可以用它替换某些阶段尤其是后几个阶段的标准Swin块以增强结构化建模能力。5. 潜在问题、应对策略与扩展思考任何新架构在落地时都会遇到挑战。基于我的实验经验这里总结几个关键问题和应对策略。5.1 训练不稳定与收敛慢问题由于引入了可学习的聚类中心和图注意力训练初期可能出现损失震荡或收敛速度慢于标准Transformer。对策聚类中心初始化聚类中心参数cluster_centers的初始化至关重要。使用较小的标准差如0.02从正态分布采样避免初始值过大导致softmax饱和。分阶段训练采用课程学习Curriculum Learning策略。先固定聚类中心为某种规则初始化如K-means对预训练特征聚类的结果训练几个epoch然后再放开让其可学习。或者先以较小的学习率单独训练结构化相位部分。梯度裁剪在训练早期对整体梯度进行裁剪torch.nn.utils.clip_grad_norm_防止因新结构带来的梯度爆炸。5.2 聚类退化与模式坍塌问题所有token可能倾向于分配到同一个或少数几个聚类中心导致结构化交互相位失效这被称为模式坍塌。对策分配正则化在损失函数中加入对分配矩阵assignment的正则项。例如鼓励分配更均匀每个聚类中心都有一定数量的token归属可以使用熵最大化正则化。# 计算分配矩阵的熵正则化损失 (最大化) assignment_flat assignment.mean(dim0) # 平均 over batch, [N, K] entropy -torch.sum(assignment_flat * torch.log(assignment_flat 1e-10), dim-1).mean() loss classification_loss - lambda_entropy * entropy # lambda_entropy是一个小正数如0.01在线K-means辅助每隔一定步数用当前特征运行一次在线K-means算法用其结果作为聚类中心的目标进行辅助训练或者直接用它来更新聚类中心参数。5.3 对输入尺度变化的适应性问题固定的窗口大小和聚类中心数量可能对不同分辨率或长宽比的输入图像适应性不佳。对策相对位置编码在局部窗口注意力中必须使用相对位置编码Relative Position Bias而不是绝对位置编码这样模型才能处理不同大小的窗口或图像。动态聚类数量让num_clusters成为输入序列长度N的函数例如K max(32, int(N ** 0.5))使其能自适应不同尺度的输入。多尺度结构在结构化相位中可以设计多尺度的图结构。例如同时构建多个具有不同K值的图进行交互然后将结果融合。5.4 扩展到其他模态与任务三相位思想不局限于视觉。自然语言处理局部相位使用卷积或固定窗口的自注意力捕捉N-gram局部上下文。结构化相位利用预训练的句法解析树或依赖关系树作为几何先验在语法成分节点之间进行信息传递。或者使用可学习的聚类对语义相似的词语进行分组。全局相位与视觉任务类似使用轻量级全局注意力或池化。时序预测局部相位捕捉短期模式如卷积或局部注意力。结构化相位基于序列的周期性、趋势等先验构建图如将相似时间点连接或在多个时间尺度小时、天、周上构建层次结构进行交互。全局相位捕捉长期的整体趋势。扩展思考几何先验的自动学习目前的“几何先验”多少还是预设的如局部窗口、可学习聚类。一个更极致的思路是让模型完全自动学习最优的交互结构。这可以借鉴图神经网络GNN和结构学习Structure Learning的思想。例如设计一个元网络根据输入动态生成一个稀疏的邻接矩阵指示哪些token之间应该进行交互。虽然计算上更具挑战但可能是未来更通用的发展方向。三相位Transformer架构的魅力在于它提供了一种新的模型设计范式将问题领域的结构性知识以一种可计算、可学习的方式深度整合到模型的基础计算图中。它不是在已有的注意力机制上打补丁而是重新思考了信息应该如何在不同尺度、不同结构的约束下流动。这种基于先验的结构化设计在追求极致效率的边缘设备、处理超长序列的语言模型、以及需要强结构理解的多模态任务中都有着广阔的应用潜力。当然它也带来了新的调优挑战和理论问题例如如何保证学习到的结构是合理且稳定的这需要我们在工程实践和理论分析上继续深入探索。