提交 fdc211e8 编写于 作者: M muli

update reg & overfit

上级 cdad8cfd
......@@ -30,7 +30,6 @@ y_train, y_test = y[:num_train], y[num_train:]
跟前一样定义训练模块。你也许发现了主要区别,`Trainer`有一个新参数`wd`。我们通过优化算法的``wd``参数 (weight decay)实现对模型的正则化。这相当于$L_2$范数正则化。
```{.python .input}
%matplotlib inline
import matplotlib as mpl
......@@ -76,7 +75,7 @@ def train(weight_decay):
plt.show()
return ('learned w[:10]:', net[0].weight.data()[:,:10],
'learend b:', net[0].bias.data())
'learned b:', net[0].bias.data())
```
### 训练模型并观察过拟合
......
......@@ -74,23 +74,20 @@ def get_params():
## $L_2$范数正则化
线性模型就是将输入和模型做乘法再加上偏移。
这里我们引入$L_2$范数正则化。不同于在训练时仅仅最小化损失函数(Loss),我们在训练时其实在最小化
$$\text{loss} + \lambda \sum_{p \in \textrm{params}}\|p\|_2^2。$$
直观上,$L_2$范数正则化试图惩罚较大绝对值的参数值。在训练模型时,如果$\lambda = 0$,则未使用正则化。需要注意的是,在测试模型时,$\lambda$必须为0。
直观上,$L_2$范数正则化试图惩罚较大绝对值的参数值。下面我们定义L2正则化。注意有些时候大家对偏移加罚,有时候不加罚。通常结果上两者区别不大。这里我们演示对偏移也加罚的情况:
```{.python .input n=6}
def net(X, lambd, w, b):
return nd.dot(X, w) + b + lambd * ((w**2).sum() + b**2)
```{.python .input}
def L2_penalty(w, b):
return (w**2).sum() + b**2
```
## 定义训练和测试
我们定义一个训练函数,这样在跑不同的实验时不需要重复实现相同的步骤
下面我们定义剩下的所需要的函数。这个跟之前的教程大致一样,主要是区别在于计算`loss`的时候我们加上了L2正则化,以及我们将训练和测试损失都画了出来
```{.python .input n=8}
%matplotlib inline
......@@ -98,6 +95,9 @@ import matplotlib as mpl
mpl.rcParams['figure.dpi']= 120
import matplotlib.pyplot as plt
def net(X, lambd, w, b):
return nd.dot(X, w) + b
def square_loss(yhat, y):
return (yhat - y.reshape(yhat.shape)) ** 2
......@@ -118,7 +118,8 @@ def train(lambd):
for data, label in data_iter(num_train):
with autograd.record():
output = net(data, lambd, *params)
loss = square_loss(output, label)
loss = square_loss(
output, label) + lambd * L2_penalty(*params)
loss.backward()
SGD(params, learning_rate)
train_loss.append(test(params, X_train, y_train))
......
......@@ -122,8 +122,7 @@ def train(X_train, X_test, y_train, y_test):
# 设一些默认参数
learning_rate = 0.01
epochs = 100
# batch_size = min(1, y_train.shape[0])
batch_size = 1
batch_size = min(10, y_train.shape[0])
dataset_train = gluon.data.ArrayDataset(X_train, y_train)
data_iter_train = gluon.data.DataLoader(
dataset_train, batch_size, shuffle=True)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册