1) Layer (신경망 기본 블록)

  - 선형 Layer, 즉 y=wx+b를 의미함 (= Dense, Fully Connected Layer)

  - 각 Layer은 개별적 학습 parameter를 가짐, but 선형 Layer를 여러개 쌓는다고 성능이 좋아지는 것은 아니다. 이는 결국 1개의 선형 Layer로 표현될 수 있기 때문에 결국 1개의 Layer와 차이가 없어진다.

  - 그래서 여러 비선형 활성 함수를 같이 사용해야 한다! (Sigmoid, Tanh, ReLU, Leaky ReLU)

   비선형 활성 함수

     Sigmoid: 실수를 취해 0~1 사이를 출력하도록 한다. input이 음수이면 0에, 양수이면 1에 가까운 값을 반환함. 단점으로는 0 or 1에 가까워 지면 기울기가 0이 되면서 가중치가 더 이상 조정되지 않으며 dead neuron이 됨.

     Tanh: -1에서 1 사이의 값으로 반환, 이 함수도 기울기가 0이 되는 경우가 존재하지만 출력값이 0을 기준으로 만들어지므로 변화폭이 더 큼

      ReLU: f(x) = max(0,x) 로, 음수는 0, 양수는 그대로 반환하게 한다. (단, Leaky ReLU는 음수를 0.001과 같은 매우 작은 수로 반환함). 최근에 가장 많이 사용되는 방법으로 SGD(Stochastic Gradient Descent)가 더 빨리 수렴하고 연산 비용이 적다라는 장점이 있지만, 이 또한 기울기가 크면 죽는 경우가 있어 learning rate를 조정해야 한다.

 

2) Neural Network 구축

    - Pytorch의 nn.Module class를 상속하여 init, forward method를 구현

        * init: 선형 Layer를 초기화

        * forward: init 메소드에서 초기화한 Layer에 입력 데이터를 전달하고 최종 출력 반환 (여기서 ReLU 같은 비선형 함수 사용)

class LinearRegressionModel(nn.Module): 
    def __init__(self): 
        super().__init__()
        self.linear = nn.Linear(5, 2)
        self.linear = nn.Linear(2, 1)

    def forward(self, x):
        return self.linear(x)

model = LinearRegressionModel()

     Model 아키텍쳐

      회기: 예측 문제로 1개의 숫자를 반환함 (마지막 Layer는 선형)

      이진분류: Sigmoid 함수를 마지막 layer에 배치하여 이미지의 output을 A 또는 B 중에 선택하게 함

      다중분류: 마지막 Layer에 softmax 함수를 사용하여 입력 데이터가 각 class로 분류될 확률을 구함 (전체 합=1)

 

3) 오차함수

    - Gradient descent optimizer (scalar를 입력 받기 때문에 loss func도 scalar로 반환해야 함)

    ML은 오차함수에서 나오는 값을 최소화하는 반복 과정으로, 2개의 오차함수가 있어도 1개의 Scalar 형태로 만들어야 함 (part 4 참고). 회기 문제는 nn.MSELoss(), 이진 및 다중 분류 문제는 cross-entropy Loss 등등을 사용하고 L1, NLL, NLL Loss 2d 등이 있다. (nuguziii.github.io/dev/dev-002/)

 

4) 최적화

    - 오차를 줄이고, 알고리즘 정확도를 향상시키기 위해 가중치 최적화하는 과정으로 optim = optim.SGD(model.parm(), lr=0.01)로 사용하고, lr은 학습 param 변경 비율을 의미함. 그리고 계속 누적되기 때문에 반복문 안에서 zero_grad()를 호출하여 기울기 초기화 과정이 필요함

for input.target in dataset:
    #초기화
    optimizer.zero_grad()

    #기울기 계산
    output = model(input)
    loss = loss_fn(output, target)
    loss.backward()

    #학습 param에 적용
    optimizer.step()

'Programming > Deep Learning' 카테고리의 다른 글

7. Recurrent Neural Networks (RNN) & LSTM  (0) 2022.04.08
6. Convolution Neural Network (CNN)  (0) 2021.02.04
5. 머신러닝 Workflow  (0) 2021.02.01
4. 머신러닝 입문  (0) 2021.01.22
2. 신경망 구성 요소  (0) 2021.01.13

+ Recent posts