teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

d

2019/12/26 10:00

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -1,4 +1,80 @@
1
1
  > ニューラルネットワークのパラメーターをどのようにすれば過学習が起きやすくなるのか教えていただきたいです。
2
2
 
3
3
  全結合層のみのネットワークで各層のニューロン数 (出力数) を大きな値にすれば、過学習すると思います。
4
- 基本的に学習するパラメータを増やして、重みの正則化などの制限もかけなければ過学習します。
4
+ 基本的に学習するパラメータを増やして、重みの正則化などの制限もかけなければ過学習します。
5
+
6
+ ## 追記
7
+
8
+ Pytorch で過学習の例を作ってみました。
9
+
10
+ ノイズを載せた x**2 関数を2層の全結合層で構成されるニューラルネットワークで回帰するコードを作り、中間層のニューロン数を変化させたときに、学習結果がどうなるかを確認しました。
11
+
12
+ ```python
13
+ import torch
14
+ import torch.nn.functional as F
15
+ import matplotlib.pyplot as plt
16
+
17
+
18
+ class Net(torch.nn.Module):
19
+ def __init__(self, n_feature, n_hidden, n_output):
20
+ super().__init__()
21
+ self.hidden1 = torch.nn.Linear(n_feature, n_hidden)
22
+ self.hidden2 = torch.nn.Linear(n_hidden, n_hidden)
23
+ self.predict = torch.nn.Linear(n_hidden, n_output)
24
+
25
+ def forward(self, x):
26
+ x = F.relu(self.hidden1(x))
27
+ x = F.relu(self.hidden2(x))
28
+ x = self.predict(x)
29
+ return x
30
+
31
+
32
+ def train_and_show_result(x, y, n_hidden):
33
+ net = Net(n_feature=1, n_hidden=n_hidden, n_output=1)
34
+ optimizer = torch.optim.Adam(net.parameters())
35
+ loss_func = torch.nn.MSELoss()
36
+
37
+ for t in range(1000):
38
+ # 順伝搬する。
39
+ prediction = net(x)
40
+
41
+ # 損失関数の値を計算する。
42
+ loss = loss_func(prediction, y)
43
+
44
+ # 逆伝搬する。
45
+ optimizer.zero_grad()
46
+ loss.backward()
47
+
48
+ # 学習する。
49
+ optimizer.step()
50
+
51
+ # 学習したモデルの予測結果
52
+ x2 = torch.unsqueeze(torch.linspace(-5, 5, 100), dim=1)
53
+ y2 = net(x2).detach().numpy()
54
+
55
+ # グラフを表示する。
56
+ fig, ax = plt.subplots()
57
+ ax.set_title(f"n_hidden={n_hidden}")
58
+ ax.scatter(x, y) # 学習データをプロットする。
59
+ ax.plot(x2, y2, "r") # 学習したモデルの予測結果をプロットする。
60
+ ax.grid()
61
+ plt.show()
62
+
63
+
64
+ # サンプルデータを生成する。 f(x) = x^2 + noise
65
+ torch.manual_seed(1)
66
+ x = torch.unsqueeze(torch.linspace(-5, 5, 20), dim=1)
67
+ y = x ** 2 + 10 * torch.rand(x.size())
68
+
69
+
70
+ for n in [100, 500, 1000]:
71
+ train_and_show_result(x, y, n_hidden=n)
72
+ ```
73
+
74
+ ![イメージ説明](14e67b03ca28ce0d517d0916c35e4acd.png)
75
+
76
+ ![](faa3e8c777f51fe3b0cdea8aaaad3998.png)
77
+
78
+ ![イメージ説明](e9366e2cbf95532aa764bf6d620eb174.png)
79
+
80
+ パラメータを増やせば増やすほど、モデルの自由度が高くなり、ノイズつきの学習データに fit しすぎて、過学習していることがわかるかと思います。

2

d

2019/12/26 10:00

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -1,4 +1,4 @@
1
1
  > ニューラルネットワークのパラメーターをどのようにすれば過学習が起きやすくなるのか教えていただきたいです。
2
2
 
3
3
  全結合層のみのネットワークで各層のニューロン数 (出力数) を大きな値にすれば、過学習すると思います。
4
- 基本的に学習するパラメータを増やしまくれば過学習します。
4
+ 基本的に学習するパラメータを増やして、重みの正則化などの制限もかけなければ過学習します。

1

d

2019/12/26 09:17

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -1,3 +1,4 @@
1
1
  > ニューラルネットワークのパラメーターをどのようにすれば過学習が起きやすくなるのか教えていただきたいです。
2
2
 
3
- 全結合層のみのネットワークで各層のニューロン数 (出力数) を大きな値にすれば、過学習すると思います。
3
+ 全結合層のみのネットワークで各層のニューロン数 (出力数) を大きな値にすれば、過学習すると思います。
4
+ 基本的に学習するパラメータを増やしまくれば過学習します。