TIL | NN Basic

[ AI / ML / DL ] Neural Networks Basic - Basic Structure, Multi-layered Structure

πŸ‘©πŸ»β€πŸ’» K-MOOC μ‹€μŠ΅μœΌλ‘œ λ°°μš°λŠ” λ¨Έμ‹ λŸ¬λ‹ κ°•μ˜

πŸ“™ ν•΄λ‹Ή ν¬μŠ€νŠΈλŠ” K-MOOC κ°•μ˜ λ‚΄μš©κ³Ό μΆ”κ°€λ‘œ λ‹€λ₯Έ μžλ£Œλ“€μ„ μ°Ύμ•„ λ‚΄μš©μ„ μž‘μ„±ν•˜μ˜€μœΌλ©°, 이둠 및 κ°œλ…μ— λŒ€ν•΄ κ³΅λΆ€ν•˜κ³  예제 μ‹€μŠ΅λ„ μ§„ν–‰ν•œ ν›„ λ‚΄μš©μ„ μ •λ¦¬ν•˜μ˜€λ‹€.


1. Basic Structure

λ‘œμ§€μŠ€ν‹± νšŒκ·€λŠ” 인곡 신경망을 μ΄λ£¨λŠ” ν•˜λ‚˜μ˜ perceptron에 ν•΄λ‹Ήν•œλ‹€κ³  λ³Ό 수 μžˆλ‹€.

πŸ€” νΌμ…‰νŠΈλ‘ μ΄λž€

λ”₯ λŸ¬λ‹μ„ μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” μš°μ„  인곡 신경망에 λŒ€ν•œ 이해가 ν•„μš”ν•œλ°, νΌμ…‰νŠΈλ‘ (Perceptron)이 λ°”λ‘œ 초기의 인곡 신경망이닀.

νΌμ…‰νŠΈλ‘ μ€ μ‹€μ œ λ‡Œλ₯Ό κ΅¬μ„±ν•˜λŠ” μ‹ κ²½ 세포 λ‰΄λŸ°μ˜ λ™μž‘κ³Ό μœ μ‚¬ν•˜λ‹€. λ‰΄λŸ°μ€ κ°€μ§€λŒκΈ°μ—μ„œ μ‹ ν˜Έλ₯Ό 받아듀이고, 이 μ‹ ν˜Έκ°€ μΌμ •μΉ˜ μ΄μƒμ˜ 크기λ₯Ό 가지면 μΆ•μ‚­λŒκΈ°λ₯Ό ν†΅ν•΄μ„œ μ‹ ν˜Έλ₯Ό μ „λ‹¬ν•œλ‹€.

xλŠ” μž…λ ₯값을 μ˜λ―Έν•˜λ©°, WλŠ” κ°€μ€‘μΉ˜(Weight), yλŠ” 좜λ ₯κ°’μž…λ‹ˆλ‹€. κ·Έλ¦Ό μ•ˆμ˜ 원은 인곡 λ‰΄λŸ°μ— ν•΄λ‹Ήλ©λ‹ˆλ‹€. μ‹€μ œ μ‹ κ²½ 세포 λ‰΄λŸ°μ—μ„œμ˜ μ‹ ν˜Έλ₯Ό μ „λ‹¬ν•˜λŠ” μΆ•μ‚­λŒκΈ°μ˜ 역할을 νΌμ…‰νŠΈλ‘ μ—μ„œλŠ” κ°€μ€‘μΉ˜κ°€ λŒ€μ‹ ν•©λ‹ˆλ‹€. 각각의 인곡 λ‰΄λŸ°μ—μ„œ 보내진 μž…λ ₯κ°’ λŠ” 각각의 κ°€μ€‘μΉ˜ 와 ν•¨κ»˜ 쒅착지인 인곡 λ‰΄λŸ°μ— μ „λ‹¬λœλ‹€.

2. Multi-layered Structure

ν™œμ„±ν™” ν•¨μˆ˜ Activation Functions

1. λΉ„μ„ ν˜• ν•¨μˆ˜ Nonlinear Functions

λΉ„μ„ ν˜• ν™œμ„±ν™” ν•¨μˆ˜(Activation function)λŠ” μž…λ ₯을 λ°›μ•„ μˆ˜ν•™μ  λ³€ν™˜μ„ μˆ˜ν–‰ν•˜κ³  좜λ ₯을 μƒμ„±ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.

인곡 μ‹ κ²½λ§μ˜ λŠ₯λ ₯을 높이기 μœ„ν•΄μ„œλŠ” 은닉측을 μ—¬λŸ¬ 개 μΆ”κ°€ν•΄μ•Ό ν•œλ‹€. 그런데 λ§Œμ•½ ν™œμ„±ν™” ν•¨μˆ˜λ‘œ μ„ ν˜• ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κ²Œ 되면 은닉측을 μŒ“μ„ μˆ˜κ°€ μ—†λ‹€. ν™œμ„±ν™” ν•¨μˆ˜λ‘œ μ„ ν˜• ν•¨μˆ˜λ₯Ό μ„ νƒν•˜κ³  은닉측을 계속 μŒ“μ•„λ„ 은닉측을 1회 μΆ”κ°€ν•œ 것과 λ™μΌν•œ 효과λ₯Ό μ£ΌκΈ° λ•Œλ¬Έμ΄λ‹€.

f ( x ) = W x   βž‘️   y ( x ) = f ( f ( f ( x ) ) )   βž‘️   W × W × W × x   βž‘️   y ( x ) = k x


βž• μ„ ν˜• ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œ 것이 아무 μ˜λ―Έκ°€ μ—†λŠ” 것은 μ•„λ‹ˆκ³ , ν•™μŠ΅ κ°€λŠ₯ν•œ κ°€μ€‘μΉ˜κ°€ μƒˆλ‘œ μƒκΈ΄λ‹€λŠ” μ μ—μ„œ μ˜λ―Έκ°€ 있긴 ν•˜λ‹€. 이에 μ„ ν˜• ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œ 측을 ν™œμ„±ν™” ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 은닉측과 κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ μ„ ν˜•μΈ΅ (linear layer) μ΄λ‚˜ νˆ¬μ‚¬μΈ΅ (projection layer) λ“±μ˜ λ‹€λ₯Έ ν‘œν˜„μ„ μ‚¬μš©ν•˜μ—¬ ν‘œν˜„ν•˜κΈ°λ„ ν•œλ‹€.

2. μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜μ™€ 기울기 μ†Œμ‹€

μœ„ 인곡 μ‹ κ²½λ§μ˜ ν•™μŠ΅ 과정은 λ‹€μŒκ³Ό κ°™λ‹€.

μš°μ„  인곡 신경망은 μž…λ ₯에 λŒ€ν•΄μ„œ μˆœμ „νŒŒ(forward propagation) 연산을 ν•˜κ³ , 그리고 μˆœμ „νŒŒ 연산을 톡해 λ‚˜μ˜¨ μ˜ˆμΈ‘κ°’κ³Ό μ‹€μ œκ°’μ˜ 였차λ₯Ό 손싀 ν•¨μˆ˜(loss function)을 톡해 κ³„μ‚°ν•˜κ³ , 그리고 이 손싀(loss)을 미뢄을 ν†΅ν•΄μ„œ 기울기(gradient)λ₯Ό κ΅¬ν•˜κ³ , 이λ₯Ό 톡해 μ—­μ „νŒŒ(back propagation)λ₯Ό μˆ˜ν–‰ν•œλ‹€.

μ—­μ „νŒŒ κ³Όμ •μ—μ„œ 0에 κ°€κΉŒμš΄ μ•„μ£Ό μž‘μ€ κΈ°μšΈκΈ°κ°€ κ³±ν•΄μ§€κ²Œ 되면, μ•žλ‹¨μ—λŠ” κΈ°μšΈκΈ°κ°€ 잘 μ „λ‹¬λ˜μ§€ μ•Šκ²Œ λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν˜„μƒμ„ 기울기 μ†Œμ‹€(Vanishing Gradient) 문제라고 ν•œλ‹€.

μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 은닉측을 μ—¬λŸ¬ 개 μŒ“κ²Œ 되면 0에 κ°€κΉŒμš΄ κΈ°μšΈκΈ°κ°€ 계속 곱해지면 μ•žλ‹¨μ—μ„œλŠ” 거의 기울기λ₯Ό μ „νŒŒλ°›μ„ 수 μ—†κ²Œ λœλ‹€. λ‹€μ‹œ 말해 λ§€κ°œλ³€μˆ˜ Wκ°€ μ—…λ°μ΄νŠΈ λ˜μ§€ μ•Šμ•„ ν•™μŠ΅μ΄ λ˜μ§€ μ•ŠλŠ”λ‹€.

➑️ μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜λ₯Ό μ€λ‹‰μΈ΅μ—μ„œ μ‚¬μš©ν•˜λŠ” 것 지양 ❌

3. tanh ν•¨μˆ˜

ν•˜μ΄νΌλ³Όλ¦­νƒ„μ  νŠΈ ν•¨μˆ˜(Hyperbolic tangent function)λŠ” μž…λ ₯값을 -1κ³Ό 1 μ‚¬μ΄μ˜ κ°’μœΌλ‘œ λ³€ν™˜ν•œλ‹€.

tanh ν•¨μˆ˜λŠ” μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜μ™€λŠ” 달리 0을 μ€‘μ‹¬μœΌλ‘œ ν•˜κ³  μžˆλŠ”λ°, μ΄λ•Œλ¬Έμ— μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜μ™€ λΉ„κ΅ν•˜λ©΄ λ°˜ν™˜κ°’μ˜ 변화폭이 더 크닀. κ·Έλž˜μ„œ μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜λ³΄λ‹€λŠ” 기울기 μ†Œμ‹€ 증상이 적은 νŽΈμž…λ‹ˆλ‹€. κ·Έλž˜μ„œ μ€λ‹‰μΈ΅μ—μ„œ μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜λ³΄λ‹€λŠ” 많이 μ‚¬μš©λ˜λŠ” νŽΈμ΄λ‹€.

4. ReLU ν•¨μˆ˜

인곡 μ‹ κ²½λ§μ—μ„œ κ°€μž₯ 졜고의 인기λ₯Ό μ–»κ³  μžˆλŠ” ν•¨μˆ˜λ‘œ, μˆ˜μ‹μ€ λ‹€μŒκ³Ό κ°™λ‹€.

f ( x ) = m a x ( 0 , x )

ReLU ν•¨μˆ˜λŠ” νŠΉμ • μ–‘μˆ˜κ°’μ— μˆ˜λ ΄ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ κΉŠμ€ μ‹ κ²½λ§μ—μ„œ μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜λ³΄λ‹€ 훨씬 더 잘 μž‘λ™ν•œλ‹€. ReLU ν•¨μˆ˜λŠ” μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜μ™€ tanh ν•¨μˆ˜μ™€ 같이 μ–΄λ–€ 연산이 ν•„μš”ν•œ 것이 μ•„λ‹ˆλΌ λ‹¨μˆœ μž„κ³„κ°’μ΄λ―€λ‘œ μ—°μ‚° 속도도 λΉ λ₯΄λ‹€.

κ·ΈλŸ¬λ‚˜ ReLU ν•¨μˆ˜λ„ λ¬Έμ œμ μ„ 가지고 μžˆλ‹€. μž…λ ₯값이 음수면 κΈ°μšΈκΈ°λ„ 0이 λœλ‹€. 그리고 이 λ‰΄λŸ°μ„ λ‹€μ‹œ νšŒμƒμ‹œν‚€λŠ” 것이 맀우 μ–΄λ ΅λ‹€. 이 문제λ₯Ό 죽은 렐루(dying ReLU)라고 ν•œλ‹€. κ·Έλž˜μ„œ μ œμ•ˆλœ ν•¨μˆ˜κ°€ Leaky ReLU이닀.

5. Leaky ReLU

dying ReLU 문제λ₯Ό λ³΄μ™„ν•˜κΈ° μœ„ν•΄ ReLU의 λ³€ν˜• ν•¨μˆ˜λ“€μ΄ λ“±μž₯ν•˜κΈ° μ‹œμž‘ν–ˆλ‹€. κ·Έ 쀑 ν•˜λ‚˜κ°€ Leaky ReLU이닀. Leaky ReLUλŠ” μž…λ ₯값이 음수일 κ²½μš°μ— 0이 μ•„λ‹ˆλΌ 0.001κ³Ό 같은 맀우 μž‘μ€ 수λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ λ˜μ–΄μžˆλ‹€. μˆ˜μ‹μ€ λ‹€μŒκ³Ό κ°™λ‹€.

f ( x ) = m a x ( a x , x )

6. Softmax function

multi-class classification을 ν•  λ•Œ 주둜 μ‚¬μš©ν–ˆλ˜ Softmax ν•¨μˆ˜λ₯Ό 좜λ ₯측에 μ μš©ν•˜μ—¬ λΆ„λ₯˜ 문제λ₯Ό μ˜ˆμΈ‘ν•œλ‹€.

7. 좜λ ₯측의 ν™œμ„±ν™” ν•¨μˆ˜μ™€ 였차 ν•¨μˆ˜μ˜ 관계

λ‹€μŒμ€ 각 λ¬Έμ œμ— λ”°λ₯Έ 좜λ ₯측의 ν™œμ„±ν™” ν•¨μˆ˜μ™€ λΉ„μš© ν•¨μˆ˜μ˜ 관계이닀.


문제 ν™œμ„±ν™” ν•¨μˆ˜ λΉ„μš© ν•¨μˆ˜
이진 λΆ„λ₯˜ Sigmoid nn.BCELoss()
닀쀑 클래슀 λΆ„λ₯˜ Softmax nn.CrossEntropyLoss()
νšŒκ·€ μ—†μŒ MSE


βœ… μ£Όμ˜ν•  점 : nn.CrossEntropyLoss()λŠ” Softmax ν•¨μˆ˜λ₯Ό 이미 ν¬ν•¨ν•˜κ³  μžˆλ‹€.

μŠ€νƒ ν¬λ“œ λŒ€ν•™κ΅μ˜ λ”₯ λŸ¬λ‹ κ°•μ˜ cs231nμ—μ„œλŠ” ReLUλ₯Ό λ¨Όμ € μ‹œλ„ν•΄λ³΄κ³ , κ·Έλ‹€μŒμœΌλ‘œ LeakyReLUλ‚˜ ELU 같은 ReLU의 λ³€ν˜•λ“€μ„ μ‹œλ„ν•΄λ³΄λ©°, sigmoidλŠ” μ‚¬μš©ν•˜μ§€ 말라고 ꢌμž₯ν•©λ‹ˆλ‹€.


πŸ’» μ‹€μŠ΅ 예제 μ½”λ“œ

λ‹€μΈ΅ νΌμ…‰νŠΈλ‘ μœΌλ‘œ 손글씨 λΆ„λ₯˜ν•˜κΈ°

from sklearn.datasets import load_digits
import matplotlib.pyplot as plt  # μ‹œκ°ν™”λ₯Ό μœ„ν•œ λ§·ν”Œλ‘―λ¦½
%matplotlib inline
digits = load_digits()  # 1,979개의 이미지 데이터 λ‘œλ“œ


images_and_labels = list(zip(digits.images, digits.target))
for index, (image, label) in enumerate(images_and_labels[:5]):  # 5개의 μƒ˜ν”Œλ§Œ 좜λ ₯
    plt.subplot(2, 5, index + 1)
    plt.axis('off')
    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
    plt.title('sample: %i' % label)

X = digits.data  # 이미지. 즉, νŠΉμ„± ν–‰λ ¬
Y = digits.target  # 각 이미지에 λŒ€ν•œ λ ˆμ΄λΈ”


import torch
import torch.nn as nn
from torch import optim


model = nn.Sequential(
    nn.Linear(64, 32),  # input_layer = 64, hidden_layer1 = 32
    nn.ReLU(),
    nn.Linear(32, 16),  # hidden_layer2 = 32, hidden_layer3 = 16
    nn.ReLU(),
    nn.Linear(16, 10)  # hidden_layer3 = 16, output_layer = 10
)


X = torch.tensor(X, dtype=torch.float32)
Y = torch.tensor(Y, dtype=torch.int64)


loss_fn = nn.CrossEntropyLoss()  # 이 λΉ„μš© ν•¨μˆ˜λŠ” μ†Œν”„νŠΈλ§₯슀 ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜κ³  있음.
optimizer = optim.Adam(model.parameters())
losses = []


for epoch in range(100):
  optimizer.zero_grad()
  y_pred = model(X)  # forwar μ—°μ‚°
  loss = loss_fn(y_pred, Y)
  loss.backward()
  optimizer.step()

  if epoch % 10 == 0:
    print('Epoch {:4d}/{} Cost: {:.6f}'.format(
        epoch, 100, loss.item()
    ))

  losses.append(loss.item())


plt.plot(losses)
Epoch    0/100 Cost: 2.380815
Epoch   10/100 Cost: 2.059323
... μ€‘λž΅ ...
Epoch   90/100 Cost: 0.205398

λ§ˆλ¬΄λ¦¬ν•˜λ©΄μ„œ..

λ‹€μŒ ν¬μŠ€νŠΈμ—μ„œ λ§Œλ‚˜μš” πŸ™Œ



μ°Έκ³ 

K-MOOC μ‹€μŠ΅μœΌλ‘œ λ°°μš°λŠ” λ¨Έμ‹ λŸ¬λ‹

Wikidocs

https://excelsior-cjh.tistory.com/177

 

Related Posts



πŸ’™ You need to log in to GitHub to write comments. πŸ’™
If you can't see comments, please refresh page(F5).