[스파르타코딩클럽] 가장 쉽게 배우는 머신러닝 3주차 개발일지
4주차 듣는중,, ㅎㅎ 저만 완강 안했나요 ? 머쓱 ^___^
딥러닝이란?
선형회귀와 논리회귀는 모두 1차 함수를 이용해서 문제를 푼다. 하지만 자연계에서는 직선으로 설명할 수 없는 문제들이 훨씬 많다(ex. XOR문제). 이런 복잡한 문제를 풀기 위해서 선형회귀 사이에 비선형의 무엇인가를 넣어야 한다고 생각했다.
이렇게 층을 여러개 쌓기 시작했고 이 모델은 정말 잘 동작했다. 층을 깊게 쌓는다고 해서 딥러닝
이라고 불리게 되었다.
딥러닝의 역사
XOR 문제
💡 딥러닝의 태동을 불러온 XOR 문제에 대해 알아보자.
-
기존의 머신러닝은 AND, OR 문제로부터 시작한다.
출처: https://donghwa96.tistory.com/11
-
위와 같은 문제를 풀기 위해서는 논리 회귀로 쉽게 만들 수 있는 직선 하나만 있으면 된다.
💡 딥러닝의 태동을 불러온 XOR 문제에 대해 알아보자.
기존의 머신러닝은 AND, OR 문제로부터 시작한다.
출처: https://donghwa96.tistory.com/11
위와 같은 문제를 풀기 위해서는 논리 회귀로 쉽게 만들 수 있는 직선 하나만 있으면 된다.
이 수식을 아래와 같이 그림으로 나타낼 수 있고, 이런 모양을 Perceptron(퍼셉트론)이라고 한다.
- 그러나 선형회귀로 AND, OR 문제는 잘 풀었지만 XOR 문제는 풀지 못했다.
출처: https://extsdd.tistory.com/217
-
퍼셉트론을 여러개 붙인 Multilayer Perceptrons (MLP)라는 개념을 도입해서 문제를 폴어보려고 했다. 출처: https://towardsdatascience.com/convolutional-neural-networks-an-introduction-tensorflow-eager-api-7e99614a2879
-
Marvin Minsky는 한개의 퍼셉트론으로는 XOR 문제를 풀 수 없고, MLP를 써야하는데 당시 기술로는 불가능하다고 주장했다. 그래서 딥러닝의 발전은 후퇴하게 된다.
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 쌓기
- Input layer : 우리가 학습시키고 싶은 x값
- Output layer : 우리가 예측한 값 (y)
- Hidden layers(은닉층) : 입력층과 출력층을 제외한 중간층
- 문제에 따라 입출력층은 모양이 정해져있다. 따라서 우리는 은닉층을 신경써야 하는데, 은닉층은 Dense layer로 이루어져 있다.
- 기본적인 DNN에서는 보통 은닉층의 중간 부분을 넓게 만드는 경우가 많다. 예를 들면 보편적으로 노드의 개수가 점점 늘어나다가 줄어드는 방식으로 구성한다.
- 활성화 함수를 어디에 넣는지도 중요하다. 보편적으로 모든 은닉층 바로 뒤에 위치한다.
네트워크의 Width와 Depth
- Baseline model
: 적당한 연산량과 정확도를 가진 딥러닝 모델.
- Baseline model
: 적당한 연산량과 정확도를 가진 딥러닝 모델.
예시 )
▶ 입력층 : 4
▶ 첫 번째 은닉층 : 8
▶ 두 번째 은닉층 : 4
▶ 출력층 : 1
- 우리는 Baseline model을 가지고 튜닝을 해볼 수 있다. 가장 간단하게 성능을 테스트 할 수 있는 방법이 바로 모델의 너비와 깊이를 가지고 테스트하는 것이다.
- 네트워크의 너비를 늘리는 방법
네트워크의 은닉층의 개수를 그대로 두고 은닉층의 노드 개수를 늘리는 방법
▶ 입력층 : 4
▶ 첫 번째 은닉층 : 8 * 2 = 16
▶ 두 번째 은닉층 : 4 * 2 = 8
▶ 출력층 : 1
- 네트워크의 깊이를 늘리는 방법
네트워크의 은닉층의 개수를 늘리는 방법
▶ 입력층 : 4
▶ 첫 번째 은닉층 : 4
▶ 두 번째 은닉층 : 8
▶ 세 번째 은닉층 : 8
▶ 네 번째 은닉층 : 4
▶ 출력층 : 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
- 과적합을 해결할 가장 간단한 방법
- 각 노드들이 이어진 선을 빼서 없애버림
- 사공이 많으면 배가 산으로 간다!
- 각 배치마다 랜덤한 노드를 끊어버린다. 즉, 다음 노드로 전달할 때 랜덤하게 출력을 0으로 만들어버린다. 출처: https://www.researchgate.net/figure/Dropout-Strategy-a-A-standard-neural-network-b-Applying-dropout-to-the-neural_fig3_340700034
출처: https://www.youtube.com/watch?v=_JB0AO7QxSA
Ensemble
- 컴퓨팅 파워만 충분하다면 가장 시도해보기 쉬운 방법
- 여러개의 딥러닝 모델을 만들어 각각 학습시킨 후, 각각의 모델에서 나온 출력을 기반으로 투표를 하는 방법
- 다양한 방법으로 응용 가능 (다수결, 평균값 등등)
- 최소 2% 이상의 성능 향상 효과 기대
출처: https://towardsdatascience.com/neural-networks-ensemble-33f33bea7df3
Learning rate decay
-
Local minimum에 빠르게 도달하고싶을 때 사용
출처:https://www.deeplearningwizard.com/deep_learning/boosting_models_pytorch/lr_scheduling/
-
왼쪽 그림 : 학습의 앞부분에서는 큰 폭으로 건너뛰고 뒤로 갈수록 점점 조금씩 움직여서 효율적으로 Local minimum을 찾는 모습
-
오른쪽 그림 : Learning rate를 고정시켰을 때의 모습
출처: https://www.mygreatlearning.com/blog/understanding-data-augmentation/
출처: https://www.youtube.com/watch?v=_JB0AO7QxSA
출처: https://towardsdatascience.com/neural-networks-ensemble-33f33bea7df3
Local minimum에 빠르게 도달하고싶을 때 사용
출처:https://www.deeplearningwizard.com/deep_learning/boosting_models_pytorch/lr_scheduling/
왼쪽 그림 : 학습의 앞부분에서는 큰 폭으로 건너뛰고 뒤로 갈수록 점점 조금씩 움직여서 효율적으로 Local minimum을 찾는 모습
오른쪽 그림 : Learning rate를 고정시켰을 때의 모습
- 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주차 숙제
Author And Source
이 문제에 관하여([스파르타코딩클럽] 가장 쉽게 배우는 머신러닝 3주차 개발일지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ssongplay/스파르타코딩클럽-가장-쉽게-배우는-머신러닝-3주차-개발일지저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)