参考学习资料里的先行回归梯度下降法的代码,为算法添加正则化(L1或L2)。 1)将修改后的代码提交; 2)比较正则化前后权重w和损失函数MSE的变化; 3)调整学习率Learning rate,分析学习率给网络训练带来的影响。
时间: 2024-09-13 17:02:26 浏览: 69
l1_ls.rar_L1正则化问题_l1 范数_二范数_最小化 范数_正则化范数
若您想对线性回归的梯度下降法加入正则化(L1或L2),您可以参照现有的梯度下降法代码,并在梯度计算时加上相应的正则化项。以下是加入L2正则化的示例代码:
```python
def Regression(x_train, y_train, x_test, y_test):
# 初始化参数
rng = np.random.RandomState(10)
w = rng.randn(1, x_train.shape[1]).reshape(-1,)
b = 0
w_grad_sum = np.zeros((1, x_train.shape[1])).reshape(-1,)
b_grad_sum = np.zeros((1, 1))
iteration = 30000
lr = 1
lv = 0.0001 # 正则化强度lambda
# 添加L2正则化项
lmd = 0.01
train_acc_list, test_acc_list, epoch_list = [], [], []
# 训练和预测
for i in range(iteration):
w_grad = np.zeros((1, x_train.shape[1])).reshape(-1,)
b_grad = np.zeros((1, 1))
y = (np.dot(x_train, w) + b).reshape(-1, 1)
# 添加正则化项到梯度
for j in range(y_train.size):
w_grad = w_grad - 2 * (y_train[j] - y[j]) * x_train[j] - 2 * lmd * w # 注意这里加上了正则化项
b_grad = b_grad - 2 * (y_train[j] - y[j])
w_grad_sum += w_grad ** 2
b_grad_sum += b_grad ** 2
w = w - lr * w_grad / (w_grad_sum ** 0.5)
b = b - lr * b_grad / (b_grad_sum ** 0.5)
if i % 200 == 0:
print("-" * 20)
train_pred = np.array(np.dot(x_train, w) + b).reshape(-1, 1)
test_pred = np.array(np.dot(x_test, w) + b).reshape(-1, 1)
# 计算MSE
mse_train = np.mean((train_pred - y_train) ** 2)
mse_test = np.mean((test_pred - y_test) ** 2)
train_acc_list.append(mse_train)
test_acc_list.append(mse_test)
epoch_list.append(i)
return train_acc_list, test_acc_list, epoch_list
```
接下来,您需要对比正则化前后的`w`值和MSE的变化。正则化后,`w`的值应当有所减小,因为正则化惩罚较大的权重。此外,由于加入了正则化项,MSE可能会略有增加,但这有助于防止过拟合。
至于学习率的选择,过高或过低都会影响网络训练的效果。过高的学习率可能使得训练过程不稳定或者无法收敛,而过低的学习率虽然能使模型收敛,但会大大延长训练所需的时间。调整学习率可以帮助更快地找到合适的模型参数。您可以通过监测损失函数随训练次数的变化来判断学习率的设置是否适当。
阅读全文