回答編集履歴

3

d

2019/12/26 10:00

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -5,3 +5,155 @@
5
5
  全結合層のみのネットワークで各層のニューロン数 (出力数) を大きな値にすれば、過学習すると思います。
6
6
 
7
7
  基本的に学習するパラメータを増やして、重みの正則化などの制限もかけなければ過学習します。
8
+
9
+
10
+
11
+ ## 追記
12
+
13
+
14
+
15
+ Pytorch で過学習の例を作ってみました。
16
+
17
+
18
+
19
+ ノイズを載せた x**2 関数を2層の全結合層で構成されるニューラルネットワークで回帰するコードを作り、中間層のニューロン数を変化させたときに、学習結果がどうなるかを確認しました。
20
+
21
+
22
+
23
+ ```python
24
+
25
+ import torch
26
+
27
+ import torch.nn.functional as F
28
+
29
+ import matplotlib.pyplot as plt
30
+
31
+
32
+
33
+
34
+
35
+ class Net(torch.nn.Module):
36
+
37
+ def __init__(self, n_feature, n_hidden, n_output):
38
+
39
+ super().__init__()
40
+
41
+ self.hidden1 = torch.nn.Linear(n_feature, n_hidden)
42
+
43
+ self.hidden2 = torch.nn.Linear(n_hidden, n_hidden)
44
+
45
+ self.predict = torch.nn.Linear(n_hidden, n_output)
46
+
47
+
48
+
49
+ def forward(self, x):
50
+
51
+ x = F.relu(self.hidden1(x))
52
+
53
+ x = F.relu(self.hidden2(x))
54
+
55
+ x = self.predict(x)
56
+
57
+ return x
58
+
59
+
60
+
61
+
62
+
63
+ def train_and_show_result(x, y, n_hidden):
64
+
65
+ net = Net(n_feature=1, n_hidden=n_hidden, n_output=1)
66
+
67
+ optimizer = torch.optim.Adam(net.parameters())
68
+
69
+ loss_func = torch.nn.MSELoss()
70
+
71
+
72
+
73
+ for t in range(1000):
74
+
75
+ # 順伝搬する。
76
+
77
+ prediction = net(x)
78
+
79
+
80
+
81
+ # 損失関数の値を計算する。
82
+
83
+ loss = loss_func(prediction, y)
84
+
85
+
86
+
87
+ # 逆伝搬する。
88
+
89
+ optimizer.zero_grad()
90
+
91
+ loss.backward()
92
+
93
+
94
+
95
+ # 学習する。
96
+
97
+ optimizer.step()
98
+
99
+
100
+
101
+ # 学習したモデルの予測結果
102
+
103
+ x2 = torch.unsqueeze(torch.linspace(-5, 5, 100), dim=1)
104
+
105
+ y2 = net(x2).detach().numpy()
106
+
107
+
108
+
109
+ # グラフを表示する。
110
+
111
+ fig, ax = plt.subplots()
112
+
113
+ ax.set_title(f"n_hidden={n_hidden}")
114
+
115
+ ax.scatter(x, y) # 学習データをプロットする。
116
+
117
+ ax.plot(x2, y2, "r") # 学習したモデルの予測結果をプロットする。
118
+
119
+ ax.grid()
120
+
121
+ plt.show()
122
+
123
+
124
+
125
+
126
+
127
+ # サンプルデータを生成する。 f(x) = x^2 + noise
128
+
129
+ torch.manual_seed(1)
130
+
131
+ x = torch.unsqueeze(torch.linspace(-5, 5, 20), dim=1)
132
+
133
+ y = x ** 2 + 10 * torch.rand(x.size())
134
+
135
+
136
+
137
+
138
+
139
+ for n in [100, 500, 1000]:
140
+
141
+ train_and_show_result(x, y, n_hidden=n)
142
+
143
+ ```
144
+
145
+
146
+
147
+ ![イメージ説明](14e67b03ca28ce0d517d0916c35e4acd.png)
148
+
149
+
150
+
151
+ ![](faa3e8c777f51fe3b0cdea8aaaad3998.png)
152
+
153
+
154
+
155
+ ![イメージ説明](e9366e2cbf95532aa764bf6d620eb174.png)
156
+
157
+
158
+
159
+ パラメータを増やせば増やすほど、モデルの自由度が高くなり、ノイズつきの学習データに fit しすぎて、過学習していることがわかるかと思います。

2

d

2019/12/26 10:00

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -4,4 +4,4 @@
4
4
 
5
5
  全結合層のみのネットワークで各層のニューロン数 (出力数) を大きな値にすれば、過学習すると思います。
6
6
 
7
- 基本的に学習するパラメータを増やしまくれば過学習します。
7
+ 基本的に学習するパラメータを増やして、重みの正則化などの制限もかけなければ過学習します。

1

d

2019/12/26 09:17

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -3,3 +3,5 @@
3
3
 
4
4
 
5
5
  全結合層のみのネットワークで各層のニューロン数 (出力数) を大きな値にすれば、過学習すると思います。
6
+
7
+ 基本的に学習するパラメータを増やしまくれば過学習します。