[๊ฐ๋ ] Deep Learning Normalization Techniques
์๋ณธ ๊ฒ์๊ธ: https://velog.io/@euisuk-chung/๊ฐ๋ ์ ๋ฆฌ-Deep-Learning-Normalization
๋ฅ๋ฌ๋์์์ ์ ๊ทํ ๊ธฐ๋ฒ
์ถ์ฒ: https://theaisummer.com/normalization/
์ ๊ทํ์ ์ ์์ ๋ชฉ์
์ ๊ทํ(Normalization)
๋ ๋ฐ์ดํฐ์ ์ค์ผ์ผ์ ์กฐ์ ํ๋ ๊ณผ์ ์ผ๋ก, ๋จธ์ ๋ฌ๋๊ณผ ๋ฅ๋ฌ๋์์ ๋ชจ๋ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ํต์ ์ธ ๋จธ์ ๋ฌ๋์์์ ์ ๊ทํ์ ๋ฅ๋ฌ๋์์์ ์ ๊ทํ๋ ๊ทธ ๋ชฉ์ ๊ณผ ๋ฐฉ๋ฒ์ ์์ด ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๋จธ์ ๋ฌ๋์์์ ์ ๊ทํ
์ ํต์ ์ธ ๋จธ์ ๋ฌ๋์์ ์ ๊ทํ์ ์ฃผ์ ๋ชฉ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํน์ฑ ๊ฐ ๋จ์ ์ฐจ์ด ํด์: ์๋ก ๋ค๋ฅธ ๋จ์๋ ๋ฒ์๋ฅผ ๊ฐ์ง ํน์ฑ๋ค์ ๋์ผํ ์ค์ผ์ผ๋ก ์กฐ์ ํฉ๋๋ค.
- ๋ชจ๋ธ์ ์์ ์ฑ ํฅ์: ํน์ฑ ๊ฐ ์ค์ผ์ผ ์ฐจ์ด๋ก ์ธํ ํ์ต์ ๋ถ์์ ์ฑ์ ์ค์ ๋๋ค.
- ํ์ต ์๋ ๊ฐ์ : ๊ฒฝ์ฌ ํ๊ฐ๋ฒ ๋ฑ์ ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์๋ ด ์๋๋ฅผ ๋์ ๋๋ค.
์ฃผ๋ก ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ:
Min-Max Scaling
: ๋ฐ์ดํฐ๋ฅผ [0, 1] ๋ฒ์๋ก ์ค์ผ์ผ๋งtandardization
: ํ๊ท ์ 0, ํ์คํธ์ฐจ๋ฅผ 1๋ก ์กฐ์
๋ฅ๋ฌ๋์์์ ์ ๊ทํ
๋ฅ๋ฌ๋์์์ ์ ๊ทํ๋ ์์ ๋ชฉ์ ๋ค์ ํฌํจํ๋ฉด์๋, ๋ค์๊ณผ ๊ฐ์ ์ถ๊ฐ์ ์ธ ๋ชฉ์ ์ ๊ฐ์ง๋๋ค:
-
๋ด๋ถ ๊ณต๋ณ๋ ๋ณํ ๊ฐ์
: ๋คํธ์ํฌ์ ๊ฐ ์ธต์์ ์ ๋ ฅ ๋ถํฌ์ ๋ณํ๋ฅผ ์ค์ ๋๋ค.๋ด๋ถ ๊ณต๋ณ๋ ๋ณํ(Internal Coveriate Shift)๋?
โ๏ธInternal Covariate Shift๋ ๋คํธ์ํฌ์ ๊ฐ Layer๋ Activation๋ง๋ค ์ถ๋ ฅ๊ฐ์ ๋ฐ์ดํฐ ๋ถํฌ๊ฐ Layer๋ง๋ค ๋ค๋ฅด๊ฒ ๋ํ๋๋ ํ์์ ๋งํ๋ค.
๊ธฐ์ธ๊ธฐ ์์ค/ํญ๋ฐ ๋ฌธ์ ์ํ
: ๊น์ ๋คํธ์ํฌ์์ ๋ฐ์ํ๋ ๊ธฐ์ธ๊ธฐ ์์ค ๋๋ ํญ๋ฐ ๋ฌธ์ ๋ฅผ ์ํํฉ๋๋ค.์ผ๋ฐํ ์ฑ๋ฅ ํฅ์
: ๊ณผ์ ํฉ์ ์ค์ด๊ณ ๋ชจ๋ธ์ ์ผ๋ฐํ ๋ฅ๋ ฅ์ ํฅ์์ํต๋๋ค.ํ์ต ์์ ์ฑ ์ ๊ณต
: ๋์ ํ์ต๋ฅ ์ฌ์ฉ์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ํ์ต์ ๊ฐ์ํํฉ๋๋ค.
์ฃผ์ ์ฐจ์ด์
-
์ ์ฉ ์์ :
- ์ ํต์ ML: ์ฃผ๋ก ์ ์ฒ๋ฆฌ ๋จ๊ณ์์ ๋ฐ์ดํฐ์ ์ ์ฒด์ ์ ์ฉ
- ๋ฅ๋ฌ๋: ๋คํธ์ํฌ์ ๊ฐ ์ธต์์ ๋์ ์ผ๋ก ์ ์ฉ
-
์ ์ฉ ๋ฒ์:
- ์ ํต์ ML: ์ฃผ๋ก ์ ๋ ฅ ํน์ฑ์ ๋ํด ์ ์ฉ
- ๋ฅ๋ฌ๋: ๋คํธ์ํฌ์ ์ค๊ฐ ์ธต์ ํ์ฑํ ๊ฐ์๋ ์ ์ฉ
-
ํ์ต ๊ฐ๋ฅ์ฑ:
- ์ ํต์ ML: ๊ณ ์ ๋ ๋ณํ
- ๋ฅ๋ฌ๋: ํ์ต ๊ฐ๋ฅํ ํ๋ผ๋ฏธํฐ๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์
-
๋ชฉ์ ์ ํ์ฅ:
- ์ ํต์ ML: ์ฃผ๋ก ๋ฐ์ดํฐ ์ค์ผ์ผ ์กฐ์ ์ ์ด์
- ๋ฅ๋ฌ๋: ๋ด๋ถ ๊ณต๋ณ๋ ๋ณํ ๊ฐ์, ๊ธฐ์ธ๊ธฐ ์์ค/ํญ๋ฐ ๋ฌธ์ ํด๊ฒฐ ๋ฑ ์ถ๊ฐ์ ์ธ ๋ชฉ์ ํฌํจ
์ด๋ฌํ ์ฐจ์ด์ ์ ์ธ์ํ๊ณ ๊ฐ ์ํฉ์ ๋ง๋ ์ ๊ทํ ๊ธฐ๋ฒ์ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด ๊ธ์์๋ ๋ฅ๋ฌ๋์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ ์ ๊ทํ ๊ธฐ๋ฒ๋ค์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
์ฃผ๋ก ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ:
- ๋ฐฐ์น ์ ๊ทํ (Batch Normalization)
- ๋ ์ด์ด ์ ๊ทํ (Layer Normalization)
- ์ธ์คํด์ค ์ ๊ทํ (Instance Normalization)
- ๊ทธ๋ฃน ์ ๊ทํ (Group Normalization)
- RMS ์ ๊ทํ (RMS Normalization)
๋ฐฐ์น ์ ๊ทํ (Batch Normalization)
๊ฐ๋
๋ฐฐ์น ์ ๊ทํ๋ 2015๋ Sergey Ioffe์ Christian Szegedy๊ฐ ์ ์ํ ๊ธฐ๋ฒ์ผ๋ก, ์ ๊ฒฝ๋ง์ ๊ฐ ์ธต์์ ์ ๋ ฅ์ ์ ๊ทํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์๋ ์๋ฆฌ
-
๋ฏธ๋๋ฐฐ์น ๋จ์๋ก ํ๊ท ๊ณผ ๋ถ์ฐ์ ๊ณ์ฐํฉ๋๋ค.
-
์ ๋ ฅ๊ฐ์ ์ ๊ทํํฉ๋๋ค.
-
์ค์ผ์ผ(ฮณ)
๊ณผ์ํํธ(ฮฒ)
ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ฉํฉ๋๋ค.
- ๊ฐ ๋ ์ด์ด/์ฑ๋๋ง๋ค ๋ค๋ฅธ ฮณ์ ฮฒ๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ, ๋คํธ์ํฌ๋ ๊ฐ ๋ ์ด์ด์ ํน์ฑ๊ณผ ์ญํ ์ ๋ง๋ ์ต์ ์ ์ ๊ทํ๋ฅผ ํ์ตํ ์ ์์ต๋๋ค.
์์
y=ฮณโ((xโฮผB)/sqrt(ฯB2+ฮต))+ฮฒy = ฮณ * ((x - ฮผ_B) / sqrt(ฯ_B^2 + ฮต)) + ฮฒy=ฮณโ((xโฮผBโ)/sqrt(ฯB2โ+ฮต))+ฮฒ
์ฌ๊ธฐ์ ฮผBฮผ_BฮผBโ๋ ๋ฐฐ์น ํ๊ท , ฯB2ฯ_B^2ฯB2โ๋ ๋ฐฐ์น ๋ถ์ฐ, ฮต์ ์์ ์์, ฮณ์ ฮฒ๋ ํ์ต ๊ฐ๋ฅํ ํ๋ผ๋ฏธํฐ์ ๋๋ค.
์์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# ์
๋ ฅ ๋ฐฐ์น
import torch
import torch.nn as nn
X = torch.tensor([[1,2,3],
[4,5,6],
[7,8,9]], dtype=torch.float32)
print(X.shape)
print(X)
# torch.Size([3, 3])
# tensor([[1., 2., 3.],
# [4., 5., 6.],
# [7., 8., 9.]])
# 3์ ํน์ฑ(feature) ์
bn = nn.BatchNorm1d(3)
output_bn = bn(X)
print("Batch Normalization ๊ฒฐ๊ณผ:")
print(output_bn)
# Batch Normalization ๊ฒฐ๊ณผ:
# tensor([[-1.2247, -1.2247, -1.2247],
# [ 0.0000, 0.0000, 0.0000],
# [ 1.2247, 1.2247, 1.2247]], grad_fn=<NativeBatchNormBackward0>)
# ์ง์ ๊ตฌํ
def batch_norm(X, eps=1e-5):
mean = X.mean(dim=0, keepdim=True)
var = X.var(dim=0, unbiased=False, keepdim=True)
X_norm = (X - mean) / torch.sqrt(var + eps)
return X_norm
print("Batch Normalization ๊ฒฐ๊ณผ:")
print(batch_norm(X))
# Batch Normalization ๊ฒฐ๊ณผ:
# tensor([[-1.2247, -1.2247, -1.2247],
# [ 0.0000, 0.0000, 0.0000],
# [ 1.2247, 1.2247, 1.2247]])
์ฅ๋จ์
-
์ฅ์ :
- ํ์ต ์๋ ํฅ์
- ๋ด๋ถ ๊ณต๋ณ๋ ๋ณํ(Internal Covariate Shift) ๊ฐ์
- ๋ ๋์ ํ์ต๋ฅ ์ฌ์ฉ ๊ฐ๋ฅ
-
๋จ์ :
- ์์ ๋ฏธ๋๋ฐฐ์น์์ ๋ถ์์ ํ ์ ์์
- ์ํ ์ ๊ฒฝ๋ง(RNN)์ ์ ์ฉํ๊ธฐ ์ด๋ ค์
์์ฉ ์ฌ๋ก
- CNN ๋ชจ๋ธ์์ ์ฃผ๋ก ์ฌ์ฉ
- EfficientNet: ์ด๋ฏธ์ง ๋ถ๋ฅ๋ฅผ ์ํ CNN ์ํคํ ์ฒ
- BERT: ์์ฐ์ด ์ฒ๋ฆฌ๋ฅผ ์ํ ํธ๋์คํฌ๋จธ ๊ธฐ๋ฐ ๋ชจ๋ธ
๋ ์ด์ด ์ ๊ทํ (Layer Normalization)
๊ฐ๋
๋ ์ด์ด ์ ๊ทํ
๋ 2016๋
Jimmy Lei Ba ๋ฑ์ด ์ ์ํ ๊ธฐ๋ฒ์ผ๋ก, ๊ฐ ์ํ์ ๋ํด ๋ชจ๋ ๋ด๋ฐ์ ์ถ๋ ฅ์ ์ ๊ทํํฉ๋๋ค.
์๋ ์๋ฆฌ
-
๊ฐ ์ํ์ ๋ํด ๋ชจ๋ ๋ด๋ฐ ์ถ๋ ฅ์ ํ๊ท ๊ณผ ๋ถ์ฐ์ ๊ณ์ฐํฉ๋๋ค.
-
๊ณ์ฐ๋ ํ๊ท ๊ณผ ๋ถ์ฐ์ผ๋ก ์ ๋ ฅ์ ์ ๊ทํํฉ๋๋ค.
-
์ค์ผ์ผ(ฮณ)
๊ณผ์ํํธ(ฮฒ)
ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ฉํฉ๋๋ค.
์์
๋ค์์ ๋ ์ด์ด ์ ๊ทํ์ ์์์ ๋๋ค:
y=ฮณโ((xโฮผL)/sqrt(ฯL2+ฮต))+ฮฒy = ฮณ * ((x - ฮผ_L) / sqrt(ฯ_L^2 + ฮต)) + ฮฒy=ฮณโ((xโฮผLโ)/sqrt(ฯL2โ+ฮต))+ฮฒ
- ์ฌ๊ธฐ์ ฮผLฮผ_LฮผLโ์ ๋ ์ด์ด ํ๊ท , ฯL2ฯ_L^2ฯL2โ๋ ๋ ์ด์ด ๋ถ์ฐ์ ๋๋ค.
์์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# ์
๋ ฅ ๋ฐฐ์น
import torch
import torch.nn as nn
X = torch.tensor([[1,2,3],
[4,5,6],
[7,8,9]], dtype=torch.float32)
print(X.shape)
print(X)
# torch.Size([3, 3])
# tensor([[1., 2., 3.],
# [4., 5., 6.],
# [7., 8., 9.]])
ln = nn.LayerNorm(3) # 3์ ์ ๊ทํํ ๋ง์ง๋ง ์ฐจ์์ ํฌ๊ธฐ
output_ln = ln(X)
print("Layer Normalization ๊ฒฐ๊ณผ:")
print(output_ln)
# Layer Normalization ๊ฒฐ๊ณผ:
# tensor([[-1.2247, 0.0000, 1.2247],
# [-1.2247, 0.0000, 1.2247],
# [-1.2247, 0.0000, 1.2247]], grad_fn=<NativeLayerNormBackward0>)
def layer_norm(X, eps=1e-5):
mean = X.mean(dim=-1, keepdim=True)
var = X.var(dim=-1, unbiased=False, keepdim=True)
X_norm = (X - mean) / torch.sqrt(var + eps)
return X_norm
print("Layer Normalization ๊ฒฐ๊ณผ:")
print(layer_norm(X))
# Layer Normalization ๊ฒฐ๊ณผ:
# tensor([[-1.2247, 0.0000, 1.2247],
# [-1.2247, 0.0000, 1.2247],
# [-1.2247, 0.0000, 1.2247]])
์ฅ๋จ์
-
์ฅ์ :
- ๋ฐฐ์น ํฌ๊ธฐ์ ๋ ๋ฆฝ์
- RNN์ ์ ์ฉ ๊ฐ๋ฅ
- ์์ฐ์ด ์ฒ๋ฆฌ ์์ ์ ํจ๊ณผ์
-
๋จ์ :
- CNN์์๋ ๋ฐฐ์น ์ ๊ทํ๋ณด๋ค ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์์
์์ฉ ์ฌ๋ก
- RNN, ํธ๋์คํฌ๋จธ ๋ชจ๋ธ์์ ์ฃผ๋ก ์ฌ์ฉ
- GPT (Generative Pre-trained Transformer) ์๋ฆฌ์ฆ
- ALBERT (A Lite BERT)
์ธ์คํด์ค ์ ๊ทํ (Instance Normalization)
๊ฐ๋
์ธ์คํด์ค ์ ๊ทํ
๋ 2016๋
Dmitry Ulyanov ๋ฑ์ด ์ ์ํ ๊ธฐ๋ฒ์ผ๋ก, ์ฃผ๋ก ์คํ์ผ ์ ์ด ์์
์ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ ์๋ฆฌ
-
๊ฐ ์ํ์ ๊ฐ ์ฑ๋์ ๋ํด ํ๊ท ๊ณผ ๋ถ์ฐ์ ๊ณ์ฐํฉ๋๋ค.
-
๊ณ์ฐ๋ ํ๊ท ๊ณผ ๋ถ์ฐ์ผ๋ก ์ ๋ ฅ์ ์ ๊ทํํฉ๋๋ค.
-
์ค์ผ์ผ(ฮณ)
๊ณผ์ํํธ(ฮฒ)
ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ฉํฉ๋๋ค.
์์
ynchw=ฮณโ((xnchwโฮผnc)/sqrt(ฯnc2+ฮต))+ฮฒy_nchw = ฮณ * ((x_nchw - ฮผ_nc) / sqrt(ฯ_nc^2 + ฮต)) + ฮฒynโchw=ฮณโ((xnโchwโฮผnโc)/sqrt(ฯnโc2+ฮต))+ฮฒ
- ์ฌ๊ธฐ์ n์ ์ํ, c๋ ์ฑ๋, h์ w๋ ๋์ด์ ๋๋น๋ฅผ ๋ํ๋ ๋๋ค.
์์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# ์
๋ ฅ (2๊ฐ์ ์ํ, ๊ฐ 2x2 ํฌ๊ธฐ, 4 ์ฑ๋)
X = torch.tensor([[
[[1, 2], [3, 4]],
[[5, 6], [7, 8]],
[[9, 10], [11, 12]],
[[13, 14], [15, 16]]
],
[
[[17, 18], [19, 20]],
[[21, 22], [23, 24]],
[[25, 26], [27, 28]],
[[29, 30], [31, 32]]
]], dtype=torch.float32)
print(X.shape)
# torch.Size([2, 4, 2, 2])
# tensor([[[[ 1., 2.],
# [ 3., 4.]],
#
# [[ 5., 6.],
# [ 7., 8.]],
#
# [[ 9., 10.],
# [11., 12.]],
#
# [[13., 14.],
# [15., 16.]]],
#
#
# [[[17., 18.],
# [19., 20.]],
#
# [[21., 22.],
# [23., 24.]],
#
# [[25., 26.],
# [27., 28.]],
#
# [[29., 30.],
# [31., 32.]]]])
# Instance Normalization์ ์ฃผ๋ก 2D๋ 3D ๋ฐ์ดํฐ์ ์ฌ์ฉ๋์ง๋ง,
# InstanceNorm2d ์ ์ฉ (4์ ์ฑ๋ ์)
in_norm = nn.InstanceNorm2d(4, affine=True)
output_in = in_norm(X)
print("Instance Normalization ๊ฒฐ๊ณผ (PyTorch):")
print(output_in)
# Instance Normalization ๊ฒฐ๊ณผ (PyTorch):
# tensor([[[[-1.3416, -0.4472],
# [ 0.4472, 1.3416]],
#
# [[-1.3416, -0.4472],
# [ 0.4472, 1.3416]],
#
# [[-1.3416, -0.4472],
# [ 0.4472, 1.3416]],
#
# [[-1.3416, -0.4472],
# [ 0.4472, 1.3416]]],
#
#
# [[[-1.3416, -0.4472],
# [ 0.4472, 1.3416]],
#
# [[-1.3416, -0.4472],
# [ 0.4472, 1.3416]],
#
# [[-1.3416, -0.4472],
# [ 0.4472, 1.3416]],
#
# [[-1.3416, -0.4472],
# [ 0.4472, 1.3416]]]], grad_fn=<ViewBackward0>)
def instance_norm(X, eps=1e-5):
mean = X.mean(dim=(2, 3), keepdim=True)
var = X.var(dim=(2, 3), unbiased=False, keepdim=True)
X_norm = (X - mean) / torch.sqrt(var + eps)
return X_norm
print("Instance Normalization ๊ฒฐ๊ณผ (์๋ ๊ตฌํ):")
print(instance_norm(X))
# Instance Normalization ๊ฒฐ๊ณผ (์๋ ๊ตฌํ):
# tensor([[[[-1.3416, -0.4472],
# [ 0.4472, 1.3416]],
#
# [[-1.3416, -0.4472],
# [ 0.4472, 1.3416]],
#
# [[-1.3416, -0.4472],
# [ 0.4472, 1.3416]],
#
# [[-1.3416, -0.4472],
# [ 0.4472, 1.3416]]],
#
#
# [[[-1.3416, -0.4472],
# [ 0.4472, 1.3416]],
#
# [[-1.3416, -0.4472],
# [ 0.4472, 1.3416]],
#
# [[-1.3416, -0.4472],
# [ 0.4472, 1.3416]],
#
# [[-1.3416, -0.4472],
# [ 0.4472, 1.3416]]]])
๐ ์ dim = (2,3)์ธ๊ฐ?
โ๏ธ dim=(2, 3)์ ํ ์์ ๋ง์ง๋ง ๋ ์ฐจ์(๋์ด์ ๋๋น)์ ๋ํด ํ๊ท ๊ณผ ๋ถ์ฐ์ ๊ณ์ฐํ๋ผ๋ ์๋ฏธ์ ๋๋ค.
- ํ ์ ํํ: (๋ฐฐ์น, ์ฑ๋, ๋์ด, ๋๋น)
dim=0
: ๋ฐฐ์น ์ฐจ์dim=1
: ์ฑ๋ ์ฐจ์dim=2
: ๋์ด ์ฐจ์dim=3
: ๋๋น ์ฐจ์
(๋ํ๊ธฐ๋ ํ์ฅ์ ๊ฐ๋ ์ด์ง ์ค์ ๋ํ๋ค๋ ์๋ฏธ๊ฐ ์๋๋๋ค ><)
์ฅ๋จ์
-
์ฅ์ :
- ์คํ์ผ ์ ์ด ์์ ์ ํจ๊ณผ์
- ๋ฐฐ์น ํฌ๊ธฐ์ ๋ ๋ฆฝ์
-
๋จ์ :
- ์ฑ๋ ๊ฐ ์ ๋ณด๋ฅผ ๊ณ ๋ คํ์ง ์์
์์ฉ ์ฌ๋ก
- ์คํ์ผ ์ ์ด(Style Transfer) ๊ณ์ด ๋ชจ๋ธ
- ์ด๋ฏธ์ง ์์ฑ ๋ชจ๋ธ: GAN(Generative Adversarial Networks) ๊ณ์ด ๋ชจ๋ธ
๊ทธ๋ฃน ์ ๊ทํ(Group Normalization)
Group Normalization
์ 2018๋
Yuxin Wu์ Kaiming He๊ฐ ์ ์ํ ์ ๊ทํ ๊ธฐ๋ฒ์
๋๋ค. ์ด ๊ธฐ๋ฒ์ Batch Normalization (BN)์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ๊ฐ๋ฐ๋์์ต๋๋ค.
BN์ ์ฃผ์ ํ๊ณ์
- ์์ ๋ฐฐ์น ํฌ๊ธฐ์์ ์ฑ๋ฅ ์ ํ
- ๋ฐฐ์น ํต๊ณ์ ์์กดํ์ฌ ๋ฐฐ์น ๊ฐ ๋ณ๋์ฑ์ด ํผ
์๋ ์๋ฆฌ
-
GN์ ์ฑ๋์ ์ฌ๋ฌ ๊ทธ๋ฃน์ผ๋ก ๋๋๊ณ , ๊ฐ ๊ทธ๋ฃน ๋ด์์ ์ ๊ทํ๋ฅผ ์ํํฉ๋๋ค.
-
์ฑ๋ ๊ทธ๋ฃนํ
: ์ ๋ ฅ ํน์ฑ์ ์ฑ๋์ G๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋๋๋๋ค. -
๊ทธ๋ฃน๋ณ ์ ๊ทํ
: ๊ฐ ๊ทธ๋ฃน ๋ด์์ ํ๊ท ๊ณผ ํ์คํธ์ฐจ๋ฅผ ๊ณ์ฐํ์ฌ ์ ๊ทํํฉ๋๋ค. -
์ ๊ทํ๋ ๊ฐ์ ํ์ต ๊ฐ๋ฅํ
์ค์ผ์ผ(ฮณ)
๊ณผ์ํํธ(ฮฒ)
ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ฉํฉ๋๋ค.
์์
ฮผ = (1/m) *ฮฃx
ฯยฒ = (1/m)* ฮฃ(x - ฮผ)ยฒ
y = (x - ฮผ) / โ(ฯยฒ + ฮต)
- ์ฌ๊ธฐ์ m์ ๊ทธ๋ฃน ๋ด ์์์ ์, ฮต์ ์์ ์์์ ๋๋ค.
์์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import torch
import torch.nn as nn
# ์
๋ ฅ (2๊ฐ์ ์ํ, ๊ฐ 2x2 ํฌ๊ธฐ, 4 ์ฑ๋)
X = torch.tensor([[
[[1, 2], [3, 4]],
[[5, 6], [7, 8]],
[[9, 10], [11, 12]],
[[13, 14], [15, 16]]
],
[
[[17, 18], [19, 20]],
[[21, 22], [23, 24]],
[[25, 26], [27, 28]],
[[29, 30], [31, 32]]
]], dtype=torch.float32)
print(X.shape)
def group_norm_pytorch(X, num_groups=2): # ๊ทธ๋ฃน ์๋ฅผ 2์ผ๋ก ๋ณ๊ฒฝ
# num_groups: ๊ทธ๋ฃน์ ์
# num_channels: ์ฑ๋์ ์ (X์ ๋ ๋ฒ์งธ ์ฐจ์)
num_channels = X.shape[1]
gn = nn.GroupNorm(num_groups, num_channels)
return gn(X)
# PyTorch GroupNorm ์ ์ฉ
gn_pytorch = group_norm_pytorch(X)
print("\nPyTorch GroupNorm ๊ฒฐ๊ณผ:")
print(gn_pytorch)
# PyTorch GroupNorm ๊ฒฐ๊ณผ:
# tensor([[[[-1.5275, -1.0911],
# [-0.6547, -0.2182]],
#
# [[ 0.2182, 0.6547],
# [ 1.0911, 1.5275]],
#
# [[-1.5275, -1.0911],
# [-0.6547, -0.2182]],
#
# [[ 0.2182, 0.6547],
# [ 1.0911, 1.5275]]],
#
#
# [[[-1.5275, -1.0911],
# [-0.6547, -0.2182]],
#
# [[ 0.2182, 0.6547],
# [ 1.0911, 1.5275]],
#
# [[-1.5275, -1.0911],
# [-0.6547, -0.2182]],
#
# [[ 0.2182, 0.6547],
# [ 1.0911, 1.5275]]]], grad_fn=<NativeGroupNormBackward0>)
(๋ํ๊ธฐ๋ ํ์ฅ์ ๊ฐ๋ ์ด์ง ์ค์ ๋ํ๋ค๋ ์๋ฏธ๊ฐ ์๋๋๋ค ><)
์ฅ๋จ์
-
์ฅ์
- ๋ฐฐ์น ํฌ๊ธฐ์ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํฉ๋๋ค.
- ์์ ๋ฐฐ์น ํฌ๊ธฐ์์๋ ์์ ์ ์ผ๋ก ๋์ํฉ๋๋ค.
- CNN์์ ๋ฐฐ์น ์ ๊ทํ๋ฅผ ๋์ฒดํ ์ ์์ต๋๋ค.
-
๋จ์
- ๊ทธ๋ฃน ์๋ฅผ ์ถ๊ฐ์ ์ธ ํ์ดํผํ๋ผ๋ฏธํฐ๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
ํ์ฉ ์ฌ๋ก
- ๊ฐ์ฒด ํ์ง ๋ฐ ์ธ๊ทธ๋จผํ ์ด์ ๋ชจ๋ธ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
- ์๊ท๋ชจ ๋ฐฐ์น๋ฅผ ์ฌ์ฉํ๋ ๊ณ ํด์๋ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์์ ์ ์ ํฉํฉ๋๋ค.
RMS ์ ๊ทํ (RMS Normalization)
๊ฐ๋
RMS Norm
(Root Mean Square Layer Normalization)์ 2019๋
Biao Zhang๊ณผ Rico Sennrich๊ฐ ๋ฐํํ ๋
ผ๋ฌธ โRoot Mean Square Layer Normalizationโ์์ ์ฒ์ ์๊ฐ๋์์ต๋๋ค. RMS ์ ๊ทํ๋ ์ต๊ทผ ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ์์ ์ฃผ๋ชฉ๋ฐ๊ณ ์๋ ๊ธฐ๋ฒ์ผ๋ก, ๋ ์ด์ด ์ ๊ทํ๋ฅผ ๊ฐ์ํํ ๋ฒ์ ์
๋๋ค.
์๋ ์๋ฆฌ
-
๊ฐ ์ํ์ ๋ํด ๋ชจ๋ ํน์ฑ์ ์ ๊ณฑํ๊ท ์ ๊ณฑ๊ทผ(RMS)์ ๊ณ์ฐํฉ๋๋ค.
-
๊ณ์ฐ๋ RMS ๊ฐ์ผ๋ก ์ ๋ ฅ์ ๋๋๋๋ค.
-
์ค์ผ์ผ(ฮณ) ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ฉํฉ๋๋ค.
์์
y=x/โ(mean(xยฒ)+ฮต)y = x / โ(mean(xยฒ) + ฮต)y=x/โ(mean(xยฒ)+ฮต)
- ์ฌ๊ธฐ์ x๋ ์ ๋ ฅ, ฮต์ ์์ ์์์ ๋๋ค.
๐ก RMS vs Layer Norm
Layer Norm๊ณผ RMS Norm์ ์ฃผ์ ์ฐจ์ด์ :
- ์ค์ฌํ(centering) ์ ๊ฑฐ:
- Layer Norm: (x - ฮผ) / โ(ฯยฒ + ฮต)
- RMS Norm: x / โ(mean(xยฒ) + ฮต)
- ๋ถ์ฐ ๊ณ์ฐ ๋ฐฉ์:
- Layer Norm: ฯยฒ = mean((x - ฮผ)ยฒ)
- RMS Norm: mean(xยฒ)๋ฅผ ์ง์ ์ฌ์ฉ
๐ RMS๋ก ๋๋๋ ์๋ฏธ
๊ณ์ฐ ํจ์จ์ฑ
: mean(xยฒ)๋ ฯยฒ๋ณด๋ค ๊ณ์ฐ์ด ๊ฐ๋จํฉ๋๋ค.์ค์ผ์ผ ๋ถ๋ณ์ฑ ์ ์ง
: ์ ๋ ฅ์ ์ค์ผ์ผ์ ๊ด๊ณ์์ด ์ผ์ ํ ์ถ๋ ฅ ๋ฒ์๋ฅผ ์ ์งํฉ๋๋ค.์ ๊ทํ ํจ๊ณผ
: ์ ๋ ฅ์ ์ ์ ํ ๋ฒ์๋ก ์กฐ์ ํ์ฌ ํ์ต ์์ ์ฑ์ ๋์ ๋๋ค.
์์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import torch
import torch.nn as nn
X = torch.tensor([[1,2,3],
[4,5,6],
[7,8,9]], dtype=torch.float32)
print(X)
# tensor([[1., 2., 3.],
# [4., 5., 6.],
# [7., 8., 9.]])
def rms_norm(X, eps=1e-8):
rms = torch.sqrt(torch.mean(X**2, dim=-1, keepdim=True) + eps)
X_norm = X / rms
return X_norm
print("RMS Normalization ๊ฒฐ๊ณผ:")
print(rms_norm(X))
# RMS Normalization ๊ฒฐ๊ณผ:
# tensor([[0.4629, 0.9258, 1.3887],
# [0.7895, 0.9869, 1.1843],
# [0.8705, 0.9948, 1.1192]], grad_fn=<MulBackward0>)
์ฅ๋จ์
-
์ฅ์ :
- ๊ณ์ฐ ํจ์จ์ฑ์ด ๋์
- ๋๊ท๋ชจ ๋ชจ๋ธ์ ์ ํฉ
- ํ๊ท ์ ๊ณ์ฐํ์ง ์์ ๋ ์์ ์
-
๋จ์ :
- ๋ ์ด์ด ์ ๊ทํ์ ๋นํด ํํ๋ ฅ์ด ๋ค์ ์ ํ๋ ์ ์์
์์ฉ ์ฌ๋ก
- PaLM (Pathways Language Model)
- LLaMA (Large Language Model Meta AI)
์ ๊ทํ ๊ธฐ๋ฒ ๋น๊ต
๊ฐ ์ ๊ทํ ๊ธฐ๋ฒ์ ์๋ก ๋ค๋ฅธ ํน์ฑ๊ณผ ์ฅ๋จ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์๋ ํ๋ ์ด๋ค์ ๊ฐ๋จํ ๋น๊ตํ ๊ฒ์ ๋๋ค:
๊ธฐ๋ฒ | ๊ณ์ฐ ๋จ์ | ์ฅ์ | ๋จ์ | ์ฃผ์ ์์ฉ ๋ถ์ผ |
---|---|---|---|---|
๋ฐฐ์น ์ ๊ทํ | ๋ฏธ๋๋ฐฐ์น | ํ์ต ์๋ ํฅ์, ๋์ ํ์ต๋ฅ ์ฌ์ฉ ๊ฐ๋ฅ | ์์ ๋ฐฐ์น์์ ๋ถ์์ , RNN์ ์ ์ฉ ์ด๋ ค์ | CNN, ์ด๋ฏธ์ง ์ฒ๋ฆฌ |
๋ ์ด์ด ์ ๊ทํ | ๊ฐ๋ณ ์ํ | ๋ฐฐ์น ํฌ๊ธฐ ๋ ๋ฆฝ์ , RNN์ ์ ์ฉ ๊ฐ๋ฅ | CNN์์ ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ | RNN, ์์ฐ์ด ์ฒ๋ฆฌ |
์ธ์คํด์ค ์ ๊ทํ | ๊ฐ๋ณ ์ํ์ ์ฑ๋ | ์คํ์ผ ์ ์ด์ ํจ๊ณผ์ , ๋ฐฐ์น ํฌ๊ธฐ ๋ ๋ฆฝ์ | ์ฑ๋ ๊ฐ ์ ๋ณด ๋ฌด์ | ์คํ์ผ ์ ์ด, ์ด๋ฏธ์ง ์์ฑ |
๊ทธ๋ฃน ์ ๊ทํ | ์ฑ๋ ๊ทธ๋ฃน | ๋ฐฐ์น ํฌ๊ธฐ ๋ ๋ฆฝ์ , ์์ ๋ฐฐ์น์์๋ ์์ ์ | ๊ทธ๋ฃน ์ ์ ํ์ด ์ฑ๋ฅ์ ์ํฅ | ๊ฐ์ฒด ํ์ง, ์ธ๊ทธ๋ฉํ ์ด์ |
RMS ์ ๊ทํ | ๊ฐ๋ณ ์ํ | ๊ณ์ฐ ํจ์จ์ฑ ๋์, ๋๊ท๋ชจ ๋ชจ๋ธ์ ์ ํฉ | ํํ๋ ฅ ๋ค์ ์ ํ | ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ |
๊ฒฐ๋ก
์ ๊ทํ ๊ธฐ๋ฒ์ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํค๋ ์ค์ํ ์์์ ๋๋ค. ๊ฐ ๊ธฐ๋ฒ์ ๊ณ ์ ํ ํน์ฑ๊ณผ ์ฅ๋จ์ ์ ๊ฐ์ง๊ณ ์์ด, ์์ ์ ์ฑ๊ฒฉ๊ณผ ๋ชจ๋ธ ๊ตฌ์กฐ์ ๋ฐ๋ผ ์ ์ ํ ๊ธฐ๋ฒ์ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ต๊ทผ์๋ ์ด๋ฌํ ๊ธฐ๋ณธ์ ์ธ ์ ๊ทํ ๊ธฐ๋ฒ๋ค์ ์กฐํฉํ๊ฑฐ๋ ๋ณํํ์ฌ ๋ ๋์ ์ฑ๋ฅ์ ์ป์ผ๋ ค๋ ์ฐ๊ตฌ๋ ํ๋ฐํ ์งํ๋๊ณ ์์ต๋๋ค.
๋ฅ๋ฌ๋ ๋ถ์ผ๊ฐ ๋น ๋ฅด๊ฒ ๋ฐ์ ํจ์ ๋ฐ๋ผ, ์๋ก์ด ์ ๊ทํ ๊ธฐ๋ฒ๋ค์ด ๊ณ์ํด์ ์ ์๋๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ต์ ์ฐ๊ตฌ ๋ํฅ์ ์ฃผ์ํ๊ณ , ์์ ์ ์์ ์ ๊ฐ์ฅ ์ ํฉํ ์ ๊ทํ ๊ธฐ๋ฒ์ ์คํ์ ํตํด ์ฐพ์๋ด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ค์ํ ๊ฐ๋ ์ด๊ธฐ์ ๊ทธ๋งํผ ์๊ฐ์ ๋ค์ฌ์ ์ด์ฌํ ์์ฑํด๋ดค๋๋ฐ์! ๋์์ด ๋์ จ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค ๐ค