Takagi-Sugeno模型因子数增加时溢出、预测值为NaN该如何解决?
问题定位
- 核心原因是梯度爆炸,高维场景下学习率设置过高,参数更新步长太大,导致权重和预测值快速溢出为无穷大,最后触发数值计算警告、输出NaN
- 次要问题包括特征幂次变换的数值累积、归一化函数的隐式原数组修改、无梯度约束机制
可行修复方案
1. 调低学习率
你当前代码中学习率设为1,属于过高配置,建议降到1e-3 ~ 1e-2区间,高维场景下可进一步调小:
# 原代码 model = TakagiSugeno(lr=1, n_iters=1000) # 修改后 model = TakagiSugeno(lr=0.001, n_iters=1000)
2. 修复归一化函数的引用修改问题
原归一化函数直接修改输入数组,会导致原始数据被意外篡改,改为对数组副本操作,同时增加除0保护:
def normalise_x(X): X_norm = [] # 生成副本避免修改原数组 X = X.copy() for x in X.T: min_val = np.min(x) x -= min_val max_val = np.max(x) if max_val != 0: x = x/max_val X_norm.append(x) return np.array(X_norm).T def normalise_y(X): # 生成副本避免修改原数组 X = X.copy() min_val = np.min(X) X -= min_val max_val = np.max(X) if max_val != 0: X = X/max_val return X
3. 增加梯度裁剪机制
在参数更新步骤对梯度做截断,避免梯度过大导致参数爆炸,可根据实际场景调整裁剪阈值:
修改model_estimation方法内的参数更新逻辑:
# 梯度裁剪,限制梯度在[-1,1]区间 dw = np.clip(dw, -1, 1) db = np.clip(db, -1, 1) # 权重更新 self.weights[c] -= self.lr * dw self.bias[c] -= self.lr * db
4. 可选优化:增加L2正则化
在梯度计算时加入权重正则项,抑制权重过度增长,正则系数可根据效果调整:
reg_lambda = 0.001 dw = (2 / n_samples) * np.dot(weight_mult(X_polynom[c], cluster_w[c]).T, (y_predicted - y)) + reg_lambda * self.weights[c]
按上述方案修改后,因子数超过9时也不会出现数值溢出、输出NaN的问题。
内容的提问来源于stack exchange,提问作者Nikita Maximovich
相关产品推荐
相关产品推荐

