Notice
Recent Posts
Recent Comments
05-21 07:17
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

Byeol Lo

밑바닥부터 시작하는 딥러닝1 - 2. 처리과정에서의 용어들 본문

AI

밑바닥부터 시작하는 딥러닝1 - 2. 처리과정에서의 용어들

알 수 없는 사용자 2023. 6. 7. 17:54

 일반적으로 데이터 분석을 위한 모델링은 다음과 같은 과정을 가진다. 데이터 수집 → 데이터 로딩 → 정규화/전처리 → 데이터 학습 → 테스트 데이터 추론 → 정확성 평가 → 모델 전개 이 과정에서 자주 쓰이는 용어들을 살펴볼 것이다.

 

Batch Process(배치 처리)

 테스트 데이터 하나하나를 추론(propagation)할 때는 데이터 하나하나를 쓰다보니 매우 느릴 것이다. 일반적으로 파일 입출력을 처리할 때 파일을 가져올때 하나하나 데이터를 가져오는 것보다 적재할 수 있는 한의 양만큼 가져와 처리하는 것이 더 효율적일 것이다. 이를 위해 배치 처리 Batch Process 라는 것이 나왔다. 배치 처리라는 것은 대량의 데이터를 행렬 연산을 통해 처리 시간을 대폭 줄여주는 것이 가장 큰 이점인데, 수치 계산 라이브러리 대부분이 큰 배열을 효율적으로 처리할 수 있도록 고도로 최적화되어 있다보니 배치(한 덩어리) 처리가 좋다. 다음 연산의 처리 과정을 보면 이해가 더 쉬울 것이다.

배치 처리

 처음 연산을 1*128로 넣는 것이 아니라 10000*128로 넣어 한번에 연산을 통해 처리량을 늘린다. 이처럼 데이터를 하나로 묶은 것을 batch라고 한다(CPU, GPU를 더 사용하여 순수계산을 수행하는 비율이 높아짐).

import numpy as np

if __name__ == "__main__":
    data_list = np.arange(0, 100*100)
    for i in range(0, 10000, 100) :
        print(data_list[i:i+100]) # 100 개씩 데이터를 뽑음
        print(len(data_list[i:i+100]))

 

end-to-end machine learning(종단간 기계학습 = 딥러닝)

 우리가 생각하는 일반적인 머신러닝은 데이터와 결과까지의 그 과정에 어떠한 특징(feature)이 있을 것이라 판단하고, 특징들을 몇몇의 노드들을 통해 신호가 가도록 표현할 수 있다. 하지만, 딥러닝은 다르다. 해당 특징은 기계가 알아서 찾도록 파라미터(parameter) 들을 조정해간다. 이는 처음부터 끝까지 사람의 개입 없이 결과를 얻는다는 의미이며 이를 end-to-end machine learning 이라고 한다. 밑의 예를 보자.

 첫번째가 사람이 구현한 알고리즘이며, 해당 알고리즘을 통해 결과를 도출한다. 이는 코테의 문제에 해당하는 수준이다. 하지만, 이는 복잡한 문제에 쓰기에 한계가 있다. 따라서 우리는 문제의 특징들을 살피고 퍼셉트론들을 겹겹이 쌓아서 그 특징에 맞는 알고리즘을 짠다. 이것이 일반적인 머신러닝에 해당한다. 마지막으로 종단간 기계학습인 딥러닝은 매우 많은 노드들을 통해 특징을 생각하지 않고 알아서 특징을 학습하도록 하는 것이다.

 

Overfitting(오버피팅)

 보통 데이터들을 몇대 몇의 학습 데이터(training data), 테스트 데이터(test data)로 나누어 학습을 수행하게 된다. 이때, 해당 학습 데이터들에 한해서만 지나치게 잘 맞추지만, 테스트 데이터에 대해서는 현저히 정확도가 떨어지는 경향이 있다. 이를 Overfitting 이라고 한다. 일상생활에서는 다음과 같이 들 수 있다. 수학 공식을 하나도 모르는 사람이 수학 테스트 A에 대해 시험의 답지를 다 알고 A에 대해서는 답을 다 쓰지만, 수학 테스트 B(test data)에 대해서는 아무 것도 모르기에 정확도가 매우 떨어지는 것이다. 따라서 우리는 수학 공식(feature)들을 잘 파악해야한다.

 

Loss Function, Cost Function(손실 함수)

 손실함수는 신경망의 성능의 나쁜지 좋은지, 노드의 hyper parameter들을 어느 정도로 수정할지의 여부를 따지는 중요한 지표다. 이 지표로는 SSE(sum of squares for errors), 교차 엔트로피 오차(cross entropy error)등을 자주 이용하게 된다.

SSE
cross-entropy error

 여기서 Cross-Entropy Error을 조금 더 살펴보자. 통계적인 지식이 조금 있어야 이 글을 쉽게 이해할 수 있을 것이다. Maximum Likelihood Estimation은 최대 우도 추정법이라는 통계적으로 분포를 결정할 수 있는 방법이 있다. 이 방법에 따르면, 우리가 가지고 있는 데이터들을 어떤 분포의 모수들을 추정하는 것이다. 더 쉽게 말해서, 분포들의 모양은 거의 유사하게 정해져 있는데, 이를 우리 데이터에 맞게 가져가려면 해당 분포의 모수들을 정해야하는데 그러한 추정 방법을 Maximum Likelihood Estimation이며, 가장 널리 알려진 좋은 추정량을 찾는 방법이다. 그러면 이런 추정 방법을 통해서 다음의 식을 도출할 수 있다.

 우리 데이터에 대해서 분포가 우리 데이터에 맞게 따르게 하려면 모수에 대해서 우리 데이터에 대응하는 전반적인 확률이 높아지도록 해야한다. 그러기 위해서 확률들의 곱을 생각할 수 있다. 그것이 위의 식이다. 이때, 이 곱들은 모수 세타에 대한(물론 지금은 세타가 하나라고 가정한 식이지만 더 있을 수 있다) 식이며, softmax function에 대응되는 식으로는 다음과 같이 쓸 수 있다.

 이때 t_i 는 [0, 0, 1, 0, 0, ... ] 등의 정답을 원-핫 인코딩을 한 벡터 데이터이고, P는 입력 데이터 x_i에 대응되는 확률 벡터라고 생각하면 된다. 이때, t_i는 진짜 정답에 1이 체크되어 있기에, 이 수식의 진정한 의미는 진짜 정답의 확률들을 다 곱하게 된다. 이제 이 Likelihood를 Log를 씌어 데이터에 맞는 세타 값을 구하는 것이 목표이고, 해당 Likelihood의 도함수는 나중에 Back propagation에서 쓰일 예정이다. 이제 이 함수를 다른 표현을 써서 나타내보면 다음과 같다.

log likelihood function

 log만 씌우고, 최종 결과인 확률을 y_k로 나타냈다. 또한, t_k는 마스킹(masking, 우리가 구하고자 하고 싶은 레이블의 확률만 뽑을 수 있도록 함)을 통해서 가지고 있는 데이터에 대한 세타를 추정할 수 있게 하였다. 하지만 이것은 SSE의 Loss function과는 반대되는 성향을 띄고 있다. 왜냐하면 맞힐 확률이 낮을수록 더 낮은 값을 반환하기 때문이다(log함수는 (0,1] 구간에서 음수이기 때문). 아니면 다음과 같이 생각해도 된다. likelihood function이 최대가 되도록 하는 모수를 추정한다 ⇒ -(likelihood function)=(loss function) 이 최소가 되도록 하는 모수를 추정한다. 따라서 -를 붙여주어 log likelihood function을 다음과 같이 수정해주면 된다.

Cross-Entropy

 이로써 Likelihood function을 임의로 설정해 최적의 모수를 찾는 것으로 MLE를 통해 cross-entropy가 어디서 도출되었는지 알아보았다.

 

Mini-Batch(미니배치 학습)

 모든 학습은 일단 훈련 데이터를 통해 파라미터들을 갱신한다. 근데 위에서도 살펴봤듯이 테스트 데이터에 대해서는 배치 처리를 통해 결과를 빠르게 도출할 수 있지만, 학습 데이터에 대해서도 그렇게 할 수 있으면 좋을 것이다. 그러면 각각의 데이터마다 Loss function의 결과를 도출해봤지만, 2개, 100개 등의 데이터들을 한꺼번에 받고 이를 통한 Loss Function의 지표로는 어떤 값을 쓸지 궁금증이 생길 것이다. 우리는 이때 평균을 이용하여 Loss Function을 계산하게 된다. 식은 다음과 같다.

 그냥 평균을 구한 것 뿐이다.

 

Gradient Descent Algorithm(경사하강법)

 모든 모델의 층 안에는 노드들이, 그 노드들에는 모수들이 있다고 생각하면 된다. 이 모수들을 데이터의 분포에 잘 맞도록 추정한다. 그것이 머신러닝의 핵심이다. 그러려면 Loss Function을 작게 만들도록 미분을 통하여 모수들을 수정해나가야 한다. 이 수정하는 과정을 Back Propagation 이라고 한다. 그렇게 되면 각각은 극값을 향해 갈 것이지만, 그것이 꼭 데이터의 분포에 가장 맞는 지점은 아니며 가장 적합한 곳을 찾도록 해야한다. 통계에서의 모수들은 노드에선 가중치로 볼 수 있다. 가중치는 다음과 같이 설정된다.

가중치 갱신

 여기서 에타는 학습률(learning rate)를 나타낸다. 한번의 training data로 얼마만큼 학습해야 하는지, 값을 얼만큼 갱신해야 하는지를 설정할 수 있다(보통 0.03 ~ 0.001 로 설정함). 여기서 학습률과 같은 매개변수를 하이퍼 파라미터라고 하는데, 하이퍼 파라미터는 훈련 데이터와 학습 알고리즘에 의해서 자동으로 획득되지 않는 파라미터라고 보면 된다.

Neural Network에서 Layer에 대한 가중치 업데이트

 경사하강법을 쓸때, 미니 배치를 무작위로 추출하는 것을 확률적 경사하강법(stochastic gradient descent)이라고 부른다.

 

  1. 미니 배치
     훈련 데이터 중 일부를 가져옴. 선별한 데이터를 미니 배치라고 하고, 이 미니 배치의 손실 함수 값을 줄이는 것이 목표
  2. 기울기 산출
     미니 배치의 손실함수 값을 줄이기 위해 각 가중치 매개변수의 기울기를 구함.
  3. 매개변수 갱신
     가중치 매개변수를 기울기 방향으로 갱신
  4. 1~3 반복

지금까지 정리하자면 위와 같다.

 

 

 

Comments