[스파르타코딩클럽] 가장 쉽게 배우는 머신러닝 3주차 개발일지

4주차 듣는중,, ㅎㅎ 저만 완강 안했나요 ? 머쓱 ^___^

딥러닝이란?

선형회귀와 논리회귀는 모두 1차 함수를 이용해서 문제를 푼다. 하지만 자연계에서는 직선으로 설명할 수 없는 문제들이 훨씬 많다(ex. XOR문제). 이런 복잡한 문제를 풀기 위해서 선형회귀 사이에 비선형의 무엇인가를 넣어야 한다고 생각했다.
이렇게 층을 여러개 쌓기 시작했고 이 모델은 정말 잘 동작했다. 층을 깊게 쌓는다고 해서 딥러닝이라고 불리게 되었다.


딥러닝의 역사

XOR 문제

💡 딥러닝의 태동을 불러온 XOR 문제에 대해 알아보자.

  • 기존의 머신러닝은 AND, OR 문제로부터 시작한다.
    출처: https://donghwa96.tistory.com/11

  • 위와 같은 문제를 풀기 위해서는 논리 회귀로 쉽게 만들 수 있는 직선 하나만 있으면 된다.

    y=w0+w1x1+w2x2y=w_0+w_1x_1+w_2x_2

이 수식을 아래와 같이 그림으로 나타낼 수 있고, 이런 모양을 Perceptron(퍼셉트론)이라고 한다.

  • 그러나 선형회귀로 AND, OR 문제는 잘 풀었지만 XOR 문제는 풀지 못했다.

출처: https://extsdd.tistory.com/217

Backpropagation (역전파)

💡 딥러닝의 발전을 가져온 아이디어인 역전파에 대해 알아보자.

  • 계속되어온 딥러닝의 침체기는 1974년에 발표된 Paul Werbos(폴)이라는 사람의 박사 논문 덕분에 끝이 나게 된다.

  • 폴은 다음과 같이 주장했다.출처: https://developer.nvidia.com/blog/inference-next-step-gpu-accelerated-deep-learning/

    	1. 우리는 W(weight)와 b(bias)를 이용해서 주어진 입력을 가지고 출력을 만들어 낼 수 있다.
    	2. 그런데 MLP가 만들어낸 출력이 정답값과 다를 경우 W와 b를 조절해야한다.
    	3. 그것을 조절하는 가장 좋은 방법은 **출력에서 Error(오차)를 발견하여 뒤에서 앞으로 점차 조절하는 방법**이 필요하다.
  • 이 알고리즘은 관심받지 못하다가 1986년에 Hinton 교수가 똑같은 방법을 독자적으로 발표하면서 알려지게 되었다.

  • 이렇게 해서 XOR 문제는 MLP를 풀 수 있게 되어 해결될 수 있었고 그 핵심방법은 바로 역전파 알고리즘의 발견이었다. 출처: https://www.youtube.com/watch?v=kNPGXgzxoHw


Deep Neural Networks 구성 방법

Layer 쌓기

  1. Input layer : 우리가 학습시키고 싶은 x값
  2. Output layer : 우리가 예측한 값 (y)
  3. Hidden layers(은닉층) : 입력층과 출력층을 제외한 중간층
  • 문제에 따라 입출력층은 모양이 정해져있다. 따라서 우리는 은닉층을 신경써야 하는데, 은닉층은 Dense layer로 이루어져 있다.
  • 기본적인 DNN에서는 보통 은닉층의 중간 부분을 넓게 만드는 경우가 많다. 예를 들면 보편적으로 노드의 개수가 점점 늘어나다가 줄어드는 방식으로 구성한다.
  • 활성화 함수를 어디에 넣는지도 중요하다. 보편적으로 모든 은닉층 바로 뒤에 위치한다.

네트워크의 Width와 Depth

  • Baseline model
    : 적당한 연산량과 정확도를 가진 딥러닝 모델.

예시 )
▶ 입력층 : 4
▶ 첫 번째 은닉층 : 8
▶ 두 번째 은닉층 : 4
▶ 출력층 : 1

  • 우리는 Baseline model을 가지고 튜닝을 해볼 수 있다. 가장 간단하게 성능을 테스트 할 수 있는 방법이 바로 모델의 너비와 깊이를 가지고 테스트하는 것이다.
  1. 네트워크의 너비를 늘리는 방법
    네트워크의 은닉층의 개수를 그대로 두고 은닉층의 노드 개수를 늘리는 방법

▶ 입력층 : 4
첫 번째 은닉층 : 8 * 2 = 16
두 번째 은닉층 : 4 * 2 = 8
▶ 출력층 : 1

  1. 네트워크의 깊이를 늘리는 방법
    네트워크의 은닉층의 개수를 늘리는 방법

▶ 입력층 : 4
▶ 첫 번째 은닉층 : 4
▶ 두 번째 은닉층 : 8
세 번째 은닉층 : 8
네 번째 은닉층 : 4
▶ 출력층 : 1

  1. 너비와 깊이를 전부 늘리는 방법
    위에서 했던 두 가지의 방법을 모두 사용

▶ 입력층 : 4
▶ 첫 번째 은닉층 : 8
두 번째 은닉층 : 16
세 번째 은닉층 : 16
▶ 네 번째 은닉층 : 8
▶ 출력층 : 1


딥러닝의 주요 개념

Batch size

  • 데이터셋을 작은 단위로 쪼개서 학습을 시키는데, 쪼개는 단위를 Batch 라고 부른다. 예를 들어 1,000만개의 데이터셋을 1,000개씩으로 쪼개어 10,000을 반복하는 것이다. 이 반복하는 과정을 iteration이라고 한다.

Epoch

  • 보통 머신러닝에서는 똑같은 데이터셋을 가지고 반복 학습을 하게 되는데, 반복 학습의 횟수를 Epoch이라고 한다.
  • Batch를 몇 개로 나눠놓았냐에 상관 없이 전체 데이터셋을 한번 돌 때 한 epoch이 끝난다.

Activation functions (활성화 함수)

  • 수많은 뉴런들은 서로 빠짐없이 연결되어 있고, 전기신호의 크기가 특정 임계치(Threshold)를 넘어야만 다음 뉴런으로 신호를 전달하도록 설계되어있다. 연구자들은 뉴런의 신호 전달 체계를 흉내내는 함수를 수학적으로 만들었는데, 전기 신호의 임계치를 넘어야 다음 뉴런이 활성화 한다고 해서 활성화 함수라고 부른다.

  • 활성화 함수는 비선형 함수여야 한다. 그 대표적인 예가 시그모이드 함수이다.

  • 활성화 함수를 통해 다음 뉴런을 활성화 시킬지를 결정할 수 있다.

  • 시그모이드 함수는 x가 -6보다 작을 때는 0에 가까운 값을 출력으로 내보내서 비활성 상태를 만든다. 반대로 x가 6보다 클 떄에는 1에 가까운 값을 출력으로 내보내서 활성 상태로 만든다.

  • 활성화 함수의 종류
    Reference https://medium.com/@shrutijadon10104776/survey-on-activation-functions-for-deep-learning-9689331ba092

  • ReLU(렐루) : 가장 보편적으로 쓰이는 활성화함수이다. 학습이 빠르고, 연산 비용이 적고, 구현이 간단하기 때문이다.

Overfitting, Underfitting (과적합, 과소적합)

  • Overfitting : 우리가 풀어야하는 문제의 난이도 < 모델의 복잡도(Complexity)
    (모의고사의 정답 번호를 달달 외워서 모의고사는 100점을 받는데, 실제로 수능 시험을 보면 틀리는 문제가 더 많아지는 현상)

  • Underfitting : 우리가 풀어야하는 문제의 난이도 > 모델의 복잡도

  • 따라서 수십번의 튜닝 과정을 거쳐 최적합(Best fit)의 모델을 찾아야 한다.
    ex) 데이터를 더 모으기, Data augmentation, dropout 등


딥러닝의 주요 스킬

Data augmentation (데이터 증강 기법)

  • 과적합을 해결할 가장 좋은 방법
  • 실무에서는 부족한 데이터 보충을 위해 데이터 증강기법을 사용한다.
  • 이미지 처리 분야의 딥러닝에서 주로 사용
  • 예시로, 다음과 같이 원본 이미지 한장을 여러가지 방법으로 복사한다.
    출처: https://www.mygreatlearning.com/blog/understanding-data-augmentation/

Dropout

Ensemble

  • 컴퓨팅 파워만 충분하다면 가장 시도해보기 쉬운 방법
  • 여러개의 딥러닝 모델을 만들어 각각 학습시킨 후, 각각의 모델에서 나온 출력을 기반으로 투표를 하는 방법
  • 다양한 방법으로 응용 가능 (다수결, 평균값 등등)
  • 최소 2% 이상의 성능 향상 효과 기대
    출처: https://towardsdatascience.com/neural-networks-ensemble-33f33bea7df3

Learning rate decay

  • learning rate가 줄어들 때마다 error 값이 한번씩 큰 폭으로 떨어지는 것을 확인할 수 있음.

Keras에서는 tf.keras.callbacks.LearningRateScheduler()tf.keras.callbacks.ReduceLROnPlateau() 를 사용하여 학습중 Learning rate를 조절한다.
https://keras.io/api/callbacks/learning_rate_scheduler/
https://keras.io/api/callbacks/reduce_lr_on_plateau


3주차 숙제

🔗 제출한 숙제

좋은 웹페이지 즐겨찾기