4주차 듣는중,, ㅎㅎ 저만 완강 안했나요 ? 머쓱 ^___^
선형회귀와 논리회귀는 모두 1차 함수를 이용해서 문제를 푼다. 하지만 자연계에서는 직선으로 설명할 수 없는 문제들이 훨씬 많다(ex. XOR문제). 이런 복잡한 문제를 풀기 위해서 선형회귀 사이에 비선형의 무엇인가를 넣어야 한다고 생각했다.
이렇게 층을 여러개 쌓기 시작했고 이 모델은 정말 잘 동작했다. 층을 깊게 쌓는다고 해서
딥러닝
이라고 불리게 되었다.
💡 딥러닝의 태동을 불러온 XOR 문제에 대해 알아보자.
기존의 머신러닝은 AND, OR 문제로부터 시작한다.
출처: https://donghwa96.tistory.com/11
위와 같은 문제를 풀기 위해서는 논리 회귀로 쉽게 만들 수 있는 직선 하나만 있으면 된다.
이 수식을 아래와 같이 그림으로 나타낼 수 있고, 이런 모양을 Perceptron(퍼셉트론)이라고 한다.
출처: https://extsdd.tistory.com/217
퍼셉트론을 여러개 붙인 Multilayer Perceptrons (MLP)라는 개념을 도입해서 문제를 폴어보려고 했다. 출처: https://towardsdatascience.com/convolutional-neural-networks-an-introduction-tensorflow-eager-api-7e99614a2879
Marvin Minsky는 한개의 퍼셉트론으로는 XOR 문제를 풀 수 없고, MLP를 써야하는데 당시 기술로는 불가능하다고 주장했다. 그래서 딥러닝의 발전은 후퇴하게 된다.
💡 딥러닝의 발전을 가져온 아이디어인 역전파에 대해 알아보자.
계속되어온 딥러닝의 침체기는 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
- Baseline model
: 적당한 연산량과 정확도를 가진 딥러닝 모델.
예시 )
▶ 입력층 : 4
▶ 첫 번째 은닉층 : 8
▶ 두 번째 은닉층 : 4
▶ 출력층 : 1
- 네트워크의 너비를 늘리는 방법
네트워크의 은닉층의 개수를 그대로 두고 은닉층의 노드 개수를 늘리는 방법
▶ 입력층 : 4
▶ 첫 번째 은닉층 : 8 * 2 = 16
▶ 두 번째 은닉층 : 4 * 2 = 8
▶ 출력층 : 1
- 네트워크의 깊이를 늘리는 방법
네트워크의 은닉층의 개수를 늘리는 방법
▶ 입력층 : 4
▶ 첫 번째 은닉층 : 4
▶ 두 번째 은닉층 : 8
▶ 세 번째 은닉층 : 8
▶ 네 번째 은닉층 : 4
▶ 출력층 : 1
- 너비와 깊이를 전부 늘리는 방법
위에서 했던 두 가지의 방법을 모두 사용
▶ 입력층 : 4
▶ 첫 번째 은닉층 : 8
▶ 두 번째 은닉층 : 16
▶ 세 번째 은닉층 : 16
▶ 네 번째 은닉층 : 8
▶ 출력층 : 1
수많은 뉴런들은 서로 빠짐없이 연결되어 있고, 전기신호의 크기가 특정 임계치(Threshold)를 넘어야만 다음 뉴런으로 신호를 전달하도록 설계되어있다. 연구자들은 뉴런의 신호 전달 체계를 흉내내는 함수를 수학적으로 만들었는데, 전기 신호의 임계치를 넘어야 다음 뉴런이 활성화 한다고 해서 활성화 함수라고 부른다.
활성화 함수는 비선형 함수여야 한다. 그 대표적인 예가 시그모이드 함수이다.
활성화 함수를 통해 다음 뉴런을 활성화 시킬지를 결정할 수 있다.
시그모이드 함수는 x가 -6보다 작을 때는 0에 가까운 값을 출력으로 내보내서 비활성 상태를 만든다. 반대로 x가 6보다 클 떄에는 1에 가까운 값을 출력으로 내보내서 활성 상태로 만든다.
활성화 함수의 종류
Reference https://medium.com/@shrutijadon10104776/survey-on-activation-functions-for-deep-learning-9689331ba092
ReLU(렐루)
: 가장 보편적으로 쓰이는 활성화함수이다. 학습이 빠르고, 연산 비용이 적고, 구현이 간단하기 때문이다.
Overfitting : 우리가 풀어야하는 문제의 난이도 < 모델의 복잡도(Complexity)
(모의고사의 정답 번호를 달달 외워서 모의고사는 100점을 받는데, 실제로 수능 시험을 보면 틀리는 문제가 더 많아지는 현상)
Underfitting : 우리가 풀어야하는 문제의 난이도 > 모델의 복잡도
따라서 수십번의 튜닝 과정을 거쳐 최적합(Best fit)의 모델을 찾아야 한다.
ex) 데이터를 더 모으기, Data augmentation, dropout 등
Local minimum에 빠르게 도달하고싶을 때 사용
출처:https://www.deeplearningwizard.com/deep_learning/boosting_models_pytorch/lr_scheduling/
왼쪽 그림 : 학습의 앞부분에서는 큰 폭으로 건너뛰고 뒤로 갈수록 점점 조금씩 움직여서 효율적으로 Local minimum을 찾는 모습
오른쪽 그림 : Learning rate를 고정시켰을 때의 모습
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