머신러닝/딥러닝 이론

박박버러지·2024년 8월 14일

한이음에서 하는 학술제에 우리 팀이 하는 중인 프로젝트와 관련한 논문을 투고하기 위해서는 이론을 개 빠삭하게 알아야 한다는 생각이 들었다. 시간도 많이 남지 않았기 때문에 할 수 있는 건 다 해봐야겠다고도 생각했다.

일단 가장 기초적인 부분부터 와서 머신러닝 안에 딥러닝이 있다는 사실은 다들 알고 있을 것이다.
머신러닝부터 간단하게 한번 정리해보자.
틀린 내용이 있을 수도, 사실 많을 수도 있어서 제 말이 틀리고 님 말이 맞을 확률이 높으니 지적은 환영합니다.

Supervised Learning: 정답이 정해져 있는 데이터. 이건 강아지다, 이건 고양이다..등등

Unsupervised Learning: 정답이 정해져 있지 않은 데이터.

(ex. 추천 알고리즘 등에 활용)

Reinforcement Learning: Trial and error를 통해서 적합한 알고리즘을 찾는 것 정도로.

머신러닝에서 컴퓨터가 하는 것은 가중치를 찾는 것.
그걸 어떻게 하라고 시키냐면 데이터를 준다.
실제 데이터를 주고, 실제와 예측값의 차이인 오차값을 줄이는 과정을 컴퓨터한테 시키는 것이다.
여기까지는 머신러닝에 대한 이야기이다.

딥러닝은 퍼셉트론과 hidden layer라고 부르는 은닉층을 갖고 그 전체를 Neural Network 신경망이라고 한다.
이 신경망으로 가중치를 찾아내는 것이다.

hidden layer가 인간으로 치면 사고를 저장하는 공간의 역할을 하는 것.

다음으로, hidden layer에서는 feature extraction이라고 부르는 특성추출이 일어난다. 전통 머신 러닝에서는 예를 들어 차를 인식할 때 먼저 인간이 차의 사진을 주고 이건 바퀴야, 이건 창문이야 등등의 가이드를 줘야 하지만 딥러닝은 그러한 과정이 필요가 없다. 데이터는 좀 더 필요하겠지만 말이다.

<계산하는 방법>

이 그림에서 보자면 h1= 6월w1 + 9월w2 이런식으로 계산을 하는 것이다.
(출처: 유튜브 코딩애플님)


그런데 오차가 이런 학생3의 경우처럼 음수가 되는 경우 그냥 더하는 방식을 채택해버리게 된다면 오히려 오차가 줄어드는 일이 발생할 수가 있다.
그런 일을 방지하기 위해서는 절댓값을 씌우거나 평균제곱오차를 사용해야 한다.
중학교 때 통계 시간에 배웠던 기억이 새록새록 나는 거 같다 ㅋㅋ

Loss function

쉽게 말하자면 오차를 구하는 수식이다. 손실 함수라고도 하는데, 모델의 정확도를 평가할 때 쓰는 함수이다.

확률을 예측할 수 있는 손실 함수도 있다.
근데 실제로 계산할 일은 없고 tensorflow 한 줄이면 된다.

근데 사실 가중치 계산에서 hidden layer가 있거나 말거나 결론은 똑같다.
어쨋든 입력값으로 넣은 값에 가중치를 곱한다는 원리이기 때문이다.
이를 해결하기 위한 방법이 활성 함수 activation function이다.

activation function

이런 식으로 계산한 h1을 그대로 쓰지 않고 sigmoid(유명한 활성 함수 중 하나이다) 같은 활성 함수를 사용해서 값을 바꾸는 것이다. 값이 0과 1 사이에 오게 하는 것이다.
그래서 레이어를 겹겹이 쌓아 활성함수를 많이 넣어 정확도를 높이는 것.
활성 함수를 쓰는 이유는 비선형적인 예측을 하기 위해서이다. 비선형일때 좀 더 정확도가 높은 예측이 가능하다.
그리고 마지막 층인 출력층에는 activation function이 없을 수 있다.

그럼 이제 가중치 w를 찾는 방법에 대해 생각해보도록 하자.
가중치값을 잘 찾아야 손실을 최소화 할 수 있기 때문에 제대로 된 w값을 찾는 것은 중요하다.
그 방법을 찾기 위해 경사하강법을 사용한다.

현재 w1값에서의 접선의 기울기를 w1에서 뺀다.
그래프 상으로 본다면 접선의 기울기가 오른쪽 위를 향하고 있는 양수라면 값이 작아지므로 왼쪽으로 이동, 반대로 아래를 향하고 있는 음수라면 뺐을 때 오히려 값이 커지므로 오른쪽으로 이동할 것이고 그러면서 최적의 w1을 찾는 것이다.

일단 처음에는 w값을 랜덤으로 찍고, w값을 바탕으로 총손실 E를 계산하고, 경사하강으로 새로운 w값을 업데이트한다.계속 이런 과정을 반복하는게 딥러닝의 과정인 것이다.
그런데 단순하게 기울기로만 계산을 한다면 기울기가 0인 지점이 많은 곳에서는 문제가 생긴다.

이 식에서 learning rate는 알파값이다. 상수값이므로 아무 값이나 지정해도 큰 상관은 없다.
이 learning rate를 찾는 과정도 trial and error를 통해서 거쳐진다.
근데 너무 고정된 값만 쓰면 그것도 문제가 되니까 최적화를 계속 해줘야 한다.

learning rate optimizer

가속도를 유지하는 Momentum, AdaGrad, RMSProp, AdaDelta 등이 있다.
learning rate optimizer는 여러개를 써보고 모델과 잘 맞는 것을 채택하면 된다.
많이 쓰는 것은 Adam이라고 한다.

profile
실패가 두려워지지 않을 때까지

0개의 댓글