๋ฐ์ํ
-- ๋ณธ ํฌ์คํ
์ ํ์ดํ ์น๋ก ๋ฐฐ์ฐ๋ ์์ฐ์ด ์ฒ๋ฆฌ (ํ๋น๋ฏธ๋์ด) ์ฑ
์ ์ฐธ๊ณ ํด์ ์์ฑ๋ ๊ธ์
๋๋ค.
-- ์์ค์ฝ๋ โฝ
โถ ํ์ฑํ ํจ์ (activation function)
- ์ ๊ฒฝ๋ง์์, ์ ๋ ฅ ์ ํธ์ ์ดํฉ์ ์ถ๋ ฅ ์ ํธ๋ก ๋ณํํ๋ ํจ์
- ๋ฐ์ดํฐ๊ฐ ํ์ต์ด ๊ฐ๋ฅํ๊ฒ๋ ๋ง๋ค์ด์ฃผ๋ ํจ์ (๋ฏธ๋ถ๊ฐ๋ฅํํจ์)
- ์ ๊ฒฝ๋ง์์, ํ ๋ ธ๋์์ ๋ค์ ๋ ธ๋๋ก ๋ณด๋ผ์ง ๋ง์ง ๊ฒฐ์ ํ๋ ํจ์ (์ ๋ ฅ๋ฐ์ ์ ํธ๋ฅผ ์ผ๋ง๋ ์ถ๋ ฅํ ์ง ๊ฒฐ์ ํด์ฃผ๊ณ , ๋น์ ํ์ผ๋ก ํํํ ์ ์๊ฒ ๋์์ค๋ค)
โท ํ์ฑํํจ์๋ฅผ ์ฌ์ฉํ๋ ์ด์ ? (์ฐธ๊ณ ๊ธ https://ganghee-lee.tistory.com/30)
- ์ ๋ ฅ๊ฐ์ ๋น์ ํ ๋ฐฉ์์ ์ถ๋ ฅ๊ฐ์ผ๋ก ๋์ถํ๊ธฐ ์ํด ์ฌ์ฉ
- ์ด๋ฅผ ํตํด ์ ํ (linear) ์์คํ ์ ๋น์ ํ ์์คํ ์ผ๋ก ๋ฐ๊ฟ ์ ์๊ฒ ๋๋ ๊ฒ
- ์ด๋ ๊ฒ ํ์ฑํ ํจ์๋ฅผ ํ์ฉํด์ ๋น์ ํ ์์คํ
์ธ XOR ๋ฌธ์ ๋ ํด๊ฒฐ ๋ ์ ์์๋ค. ํ์ง๋ง, MLP ์ ํ๋ผ๋ฏธํฐ ๊ฐ์๊ฐ ๋ง์์ง๋ฉด์, ๊ฐ๊ฐ์ ๊ฐ์ค์น(weight)์ ํธํฅ(bias)์ ํ์ต์ํค๋ ๊ฒ์ด ์ด๋ ค์ '์ญ์ ํ'๋ผ๋ ๊ฐ๋
์ด ๋ฑ์ฅํ๋ค.
- ์ญ์ ํ์ ๊ฐ๋ ์ ์ถํ ํด๋น ๋ธ๋ก๊ทธ์ ์ ๋ก๋ ํด๋ณด๋ ๊ฒ์ผ๋ก ํ์.
- ํผ์ ํธ๋ก ์ ๊ฐ๋ : https://didu-story.tistory.com/73
์ด์จ๋ , ํด๋น ํฌ์คํ ์์๋ ํ์ฑํ ํจ์์ ์ข ๋ฅ์, ๊ทธ ํน์ง ๊ทธ๋ฆฌ๊ณ ํ์ดํ ์น๋ก ๊ฐ๋จํ๊ฒ ๊ตฌํํด๋ณด๊ธฐ๋ก ํ๋ค.
1. ์๊ทธ๋ชจ์ด๋ ํจ์ (sigmoid)
โท ์๊ทธ๋ชจ์ด์ค ํจ์์ ํน์ง
- ๋น์ ํํจ์ => ์ ํํํ์ธ MLP์์ ๋น์ ํ ๊ฐ์ ์ป๊ธฐ์ํด ์ฌ์ฉํ๊ธฐ ์์ํ์
- ์ค์ซ๊ฐ์ ์ ๋ ฅ๋ฐ์ 0๊ณผ 1์ฌ์ด์ ๋ฒ์๋ก ์์ถํด์ ์ถ๋ ฅ
- ์ฆ, ์ถ๋ ฅ๊ฐ์ด 0๊ณผ 1์ฌ์ด์ ๊ฐ์ด๋ค
- ๋ฐ๋ผ์ ์ถ๋ ฅ์ ํ๋ฅ ๋ก ์์ถํ๊ธฐ ์ํด์ ์๊ทธ๋ชจ์ด๋ ํจ์๋ฅผ ํ์ฉํ๋ค.
โท ์๊ทธ๋ชจ์ด๋ ํจ์์
โท pytorch์์ ์ง์ํ๋ sigmoid ํจ์
import torch
import matplotlib.pyplot as plt
x = torch.range(-5., 5., 0.1)
y = torch.sigmoid(x)
plt.plot(x.numpy(), y.numpy())
plt.show()
โท ์๊ทธ๋ชจ์ด๋ ํจ์์ ๋จ์ (ํ๊ณ)
- ๊ทธ๋ํ์์ ๋ณผ ์ ์๋ฏ, ์๊ทธ๋ชจ์ด๋ ํจ์๋ ์ ๋ ฅ ๋ฒ์๊ฐ ๋๋ถ๋ถ ๋งค์ฐ ๋น ๋ฅด๊ฒ ํฌํ (์ฆ, ๊ทน๋จ์ ์ธ ์ถ๋ ฅ๊ฐ์ ๋ง๋ฆ)
- ์ด๋ก ์ธํด Gradient Vanishing (๊ทธ๋ผ๋์ธํธ ์์ค ๋ฌธ์ & ๊ทธ๋ผ๋์ธํธ ํญ์ฃผ ๋ฌธ์ ) ๋ฐ์
- ๊ทธ๋ผ๋์ธํธ๊ฐ 0์ด ๋๊ฑฐ๋ ๋ฐ์ฐํ๊ฒ ๋์ด ๋ํ๋๋ ๋ฌธ์
- ๋ฏธ๋ถํจ์์ ๋ํด x๋ 0์์ ์ต๋๊ฐ 1/4์ ๊ฐ์ง๊ณ , input๊ฐ์ด ์ผ์ ์ด์ ์ฌ๋ผ๊ฐ๋ฉด ๋ฏธ๋ถ๊ฐ์ด ๊ฑฐ์ 0์ ์๋ ดํ๊ฒ ๋๋ค. ์ด๋ x์ ์ ๋๊ฐ์ด ์ปค์ง ์๋ก ๋ฏธ๋ถ๊ฐ์ด ์์ค๋ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค๋ ๊ฒ์ ์๋ ค์ค๋ค.
- ํจ์๊ฐ์ ์ค์ฌ์ด 0์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ์ค์ฌ๊ฐ์ด 0์ด ์๋๋ผ์ ํ์ต ์๋๊ฐ ์ ํ๋ ์ ์๋ค. ์๊ทธ๋ชจ์ด๋์ ๋ฏธ๋ถํจ์์์ ์ดํด๋ณด๋ฉด, ํ ๋ ธ๋์ ๋ํด ๋ชจ๋ ํ๋ผ๋ฏธํฐ w์ ๋ฏธ๋ถ๊ฐ์ ๋ชจ๋ ๊ฐ์ ๋ถํธ๋ฅผ ๊ฐ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์ ๋ฐ์ดํธ ๋๋๋ฐ ํ์ต์ zigzag๋ก ๋ง๋ค์ด๋ฒ๋ฆฌ๊ฒ ๋์ด ์๋๊ฐ ๋๋ ค์ง๋ค๊ณ ํ๋ค. (https://reniew.github.io/12/)
- ๋ฐ๋ผ์, ์๊ทธ๋ชจ์ด๋ํจ์๋ ๊ฑฐ์ ์ถ๋ ฅ์ธต์์๋ง ์ฌ์ฉํ๊ฒ ๋๋ค.
2. ํ์ดํผ๋ณผ๋ฆญ ํ์ ํธ (Hyperbolic Tangent (tanh))
โท tanh ํจ์์ ํน์ง
- ์๊ทธ๋ชจ์ด๋ ํจ์์ ๋ณ์ข (์๊ทธ๋ชจ์ด๋ ํจ์์ ์ ํ ๋ณํ)
- ๋ฆญํ์ ํธ๋ผ๋ ์๊ณก์ ํจ์ ์ค ํ๋
- ์๊ณก์ ํจ์ : ์ผ๊ฐํจ์์ ์ ์ฌํ ์ฑ์ง์ ๊ฐ์ง๊ณ , ํ์ค ์๊ณก์ ์ ๋งค๊ฐ๋ณ์๋ก ํ์ํ ๋ ๋์ค๋ ํจ์
- ํจ์์ ์ค์ฌ๊ฐ์ 0์ผ๋ก ์ฎ๊ฒจ์ sigmoid ํจ์์ ์ต์ ํ ๊ณผ์ ์ด ๋๋ ค์ง๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
- ํ์ง๋ง ๋ฏธ๋ถํจ์์ ๋ํด์๋ ์ผ์ ๊ฐ ์ด์ ์ปค์ง์ ๋ฏธ๋ถ๊ฐ์ด ์์ค๋๋ gradient vanishing ๋ฌธ์ ๋ ์ฌ์ ํ ๋จ์์์
- ์๊ทธ๋ชจ์ด๋์ ๋น์ทํ ํํ์ ์์ถ ํจ์์ด์ง๋ง, ์ถ๋ ฅ๊ฐ์ (-∞, +∞) ๋ฒ์์ ์ค์ซ๊ฐ์ [-1, +1]๋ก ๋ฐ๊ฟ์ค๋ค.
โท tanh ํจ์์
ํ๋์ ๋ถ๋ถ์ด tanh์์ด๊ณ , ์ ๊ฐํ๋ฉด ์ต์ข ์ ์ผ๋ก ์๊ทธ๋ชจ์ด๋ํจ์๋ฅผ ํ์ฉํ ์ ํ ๋ชจ์์ผ๋ก ์ ๊ฐ๊ฐ ๊ฐ๋ฅํ๋ค.
โท pytorch์์ ์ง์ํ๋ tanh ํจ์
import torch
import matplotlib.pyplot as plt
x = torch.range(-5.,5., 0.1)
y = torch.tanh(x)
plt.plot(x.numpy(), y.numpy())
plt.show()
3. ReLU ํจ์
โท ReLU ํจ์์ ํน์ง
- ๋ ๋ฃจ๋ ์ต๊ทผ ๋ฅ๋ฌ๋์ ํ์ ์ ๊ฐ์ฅ ์ค์ํ ์ญํ ์ ํ๋ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๊ณ , ์ค์ํ ํจ์
- ์ ๊ฒฝ๋ง์์ ์๋์ธต๋ถ๋ถ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ํจ์๊ฐ relu์ด๋ค.
- ์ฐ์ฐ๋น์ฉ์ด ํฌ์ง์๊ณ ๊ตฌํ์ด ๋งค์ฐ ๊ฐ๋จํ์ฌ ํ์ต์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ค.
- x>0 ์ด๋ฉด ๊ธฐ์ธ๊ธฐ๊ฐ 1์ธ ์ง์ , x<0์ด๋ฉด ํจ์ซ๊ฐ์ด 0์ด๋๋ค. (์์ซ๊ฐ์ 0์ผ๋ก ์๋ฅธ๋ค)
- ์์๋ฅผ ์ ๊ฑฐํด๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ Gradient Vanishing (๊ทธ๋ผ๋์ธํธ ์์ค๋ฌธ์ )์ ๋์์ด ๋๋ค.
- ์ฃฝ์ ๋ ๋ฃจ ๋ฌธ์ = ํ์ง๋ง, x<0์ธ ๊ฒ๋ค์ ๋ํด์๋ ๊ธฐ์ธ๊ธฐ๊ฐ 0์ด๊ธฐ ๋๋ฌธ์, ๋ด๋ฐ์ด ์ฃฝ์ ์ ๋ ์๋ ๋จ์ ์ด ์กด์ฌ
- ์ด๋ฌํ ํ์์ ์ค์ด๊ธฐ ์ํด ์๋ก์ด ํ๋ผ๋ฏธํฐ α๋ฅผ ์ถ๊ฐํ์ฌ x<0์์๋ ๊ธฐ์ธ๊ธฐ๋ฅผ ํ์ตํ ์ ์๊ฒ ๋ง๋ PReLUํจ์๋ฑ ์ฌ๋ฌ๊ฐ์ง ๋ณ์ข ํจ์๊ฐ ๋ฑ์ฅํ๋ค.
โท ReLU ํจ์์
โท pytorch์์ ์ง์ํ๋ ReLU ํจ์
import torch
import matplotlib.pyplot as plt
x = torch.range(-5.,5., 0.1)
y = torch.relu(x)
plt.plot(x.numpy(), y.numpy())
plt.show()
4. ์ํํธ๋งฅ์ค ํจ์ (Softmax)
โท softmax ํจ์์ ํน์ง
- ์๊ทธ๋ชจ์ด๋ ํจ์์ฒ๋ผ ์ ๊ฒฝ๋ง ์ ๋์ ์ถ๋ ฅ์ 0๊ณผ 1์ฌ์ด๋ก ์์ถ
- ๋ชจ๋ ์ถ๋ ฅ์ ํฉ์ผ๋ก ๊ฐ ์ถ๋ ฅ๊ฐ์ ๋๋์ด k๊ฐ ํด๋์ค์ ๋ํ ์ด์ฐํ๋ฅ ๋ถํฌ๋ฅผ ๋ง๋ฆ
- ๋ชจ๋ ์ถ๋ ฅ์ ํฉ์ด 1
- ์ถ๋ ฅ์ ํด์ํ๋๋ฐ ๋งค์ฐ ์ ์ฉ
- ๋ฐ๋ผ์ ์ํํธ๋งฅ์ค ํจ์๋ ๋๋ถ๋ถ ํ๋ฅ ๊ธฐ๋ฐ์ ๋ชฉ์ ํจ์์ธ ๋ฒ์ฃผํ ํฌ๋ก์ค ์ํธ๋กํผ์ ํจ๊ป ์ฌ์ฉ๋๋ค.
โท softmax ํจ์์
โท pytorch์์ ์ง์ํ๋ softmax ํจ์
import torch.nn as nn
import torch
softmax = nn.Softmax(dim=1)
x_input = torch.randn(1,3)
y_output = softmax(x_input)
print(x_input)
print(y_output)
print(torch.sum(y_output, dim=1))
input์ ๋๋ค์ผ๋ก ์ง์ ํ๊ณ softmax ํจ์๋ฅผ ์ด์ฉํ์ฌ y์ถ๋ ฅ๊ฐ์ ์ถ๋ ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ sum์ ํด๋ณด๋, ๋ชจ๋ output ์ถ๋ ฅ๊ฐ์ ํฉ์ด 1์ด ๋๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
๋ฐ์ํ