@@ -67,6 +67,8 @@ def __init__(self, num_units, embed_dim=256, num_heads=4, num_layers=4, dropout=
6767 nn .init .xavier_uniform_ (self .enemy_attentions [- 1 ].in_proj_weight )
6868 nn .init .xavier_uniform_ (self .friend_attentions [- 1 ].in_proj_weight )
6969 # self.norm.append(nn.LayerNorm(embed_dim))
70+ # 为了稳定 LN-free 训练,引入固定的残差缩放因子
71+ self .res_scale = num_layers ** - 0.5
7072
7173 def forward (self , left_signs , left_counts , right_signs , right_counts ):
7274 # 提取TopK特征(怪物 + 场地)
@@ -125,12 +127,12 @@ def forward(self, left_signs, left_counts, right_signs, right_counts):
125127 )
126128
127129 # 残差连接
128- left_feat = left_feat + delta_left
129- right_feat = right_feat + delta_right
130+ left_feat = left_feat + delta_left * self . res_scale
131+ right_feat = right_feat + delta_right * self . res_scale
130132
131133 # FFN
132- left_feat = left_feat + self .enemy_ffn [i ](left_feat )
133- right_feat = right_feat + self .enemy_ffn [i ](right_feat )
134+ left_feat = left_feat + self .enemy_ffn [i ](left_feat ) * self . res_scale
135+ right_feat = right_feat + self .enemy_ffn [i ](right_feat ) * self . res_scale
134136
135137 # 友方注意力
136138 delta_left , _ = self .friend_attentions [i ](
@@ -149,12 +151,12 @@ def forward(self, left_signs, left_counts, right_signs, right_counts):
149151 )
150152
151153 # 残差连接
152- left_feat = left_feat + delta_left
153- right_feat = right_feat + delta_right
154+ left_feat = left_feat + delta_left * self . res_scale
155+ right_feat = right_feat + delta_right * self . res_scale
154156
155157 # FFN
156- left_feat = left_feat + self .friend_ffn [i ](left_feat )
157- right_feat = right_feat + self .friend_ffn [i ](right_feat )
158+ left_feat = left_feat + self .friend_ffn [i ](left_feat ) * self . res_scale
159+ right_feat = right_feat + self .friend_ffn [i ](right_feat ) * self . res_scale
158160 # 不要归一化,数值嵌入本质是用模长表示战斗力,归一化后数值只能体现成角度变化
159161 # left_feat = self.norm[i](left_feat)
160162 # right_feat = self.norm[i](right_feat)
0 commit comments