일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 딥러닝
- Python
- 모두를 위한 딥러닝
- 주피터노트북 커널 추가
- 데이터분석
- 회귀분석
- 주피터노트북
- Udacity
- feature scaling
- pandas
- GitHub
- regression
- deep learning
- lol api
- Linear Regression
- random forest
- 주피터테마
- MySQL
- Machine Learning
- Git
- 한빛미디어
- jupytertheme
- ubuntu
- 경사하강법
- 나는리뷰어다2021
- deeplearning
- overfitting
- 주피터노트북 커널 목록
- 주피터 노트북 테마
- 주피터노트북 커널 제거
- Today
- Total
유승훈
친절한 딥러닝 수학(3) - 역전파를 배우자 본문
본 도서는 한빛미디어 도서 서평단 <나는 리뷰어다 2021>로 선정되어 받은 도서입니다. 리뷰 작성 겸 각 챕터를 간단하게 정리해보고자 합니다.
앞선 챕터에서는 문제를 푸는데 필요한 가중치(W)와 편향을 알고 있었습니다. 이번에는 이를 최적화하는 과정에 대해서 공부해보고자 합니다.
오차
우리는 가중치와 편향을 계속해서 갱신해서, 우리의 딥러닝 알고리즘이 내는 답인 `f(x)`가 실제값인 `y`에 가까이 가도록 합니다. "우리의 답이 정답과 다르다"라는 것은, 원하는대로 예측이 이루어지지 않는 것을 의미합니다. 책에서는 어떤 이미지가 길쭉한지 길쭉하지 않은지를 판단하는 문제가 등장하는데, 실제로는 길쭉한 이미지를 모델은 길쭉하지 않다고 판단한다면, 모델이 우리가 의도하지 않은 방향으로 문제를 풀고 있음을 알 수 있습니다.
이상적으로는 `y=f(x)` 형태가 되어야 합니다. 이 말인 즉슨, `y-f(x)=0`으로 오차가 0 인 상태를 의미합니다. 실제로 오차가 딱 0이 되기는 어렵기 때문에, 이 오차가 가장 작아지는 방향으로 우리 모델의 파라미터인 가중치와 편향을 학습해나갑니다.
여기서 오차를 가장 작은 방향으로 학습하는 것은 미분을 활용합니다. 다들 아시겠지만 미분은 특정 점에서 접선의 기울기를 구하는 것이죠. 그렇다면 '오차'를 최소화한다는 것에 대해서 자세히 알아봅시다.
최적화와 목적함수
`y`도, `f(x)`도 항상 데이터 포인트 하나하나마다 존재합니다. 당연히 오차도 데이터 포인트의 개수만큼 존재하죠. 이런 상황에서 보통 하나의 수치를 보기 위해서는 합계나 평균을 사용합니다.
하지만 오차의 합계를 내면, 음수인 오차와 양수인 오차가 상쇄되어 합이 항상 0이 되어버립니다. 당연히 평균도 0이죠. 그럼 오차의 절댓값의 합계를 내면 어떨까요? 절대값은 오차의 합이 0이 되지는 않습니다. 하지만 오차의 절대값의 합을 최소화하기 위해 미분하다보면 미분할 수 없는 경우가 생기기도 하기 때문에 이 또한 좋은 방법이 아닙니다. 우리는 보통 오차의 제곱합을 활용합니다. 보통은 미분식의 원활한 정리를 위해서 1/2을 곱해줍니다. 미분해주면 제곱의 2가 내려오는데, 이를 약분해서 없애줄 수 있죠. 1/2를 곱해주면 오차의 합의 값만 달라질 뿐, 이를 최소화 하는 가중치(W)와 편향의 값은 달라지지 않습니다.
이렇게 어떤 함수값을 최소화하는 파라미터를 찾는 문제를 최적화 문제라고 하고, 이 최적화 문제에서 최소화하고자 하는 함수값이 바로 목적함수입니다. 우리의 경우에는 오차제곱합/2가 되겠죠.
설명한 목적함수를 정리하면 위와 같은 형태가 됩니다.
경사하강법
앞서 간단히 설명했듯 미분은 기울기를 구합니다. 기울기를 변화의 정도라고 설명할 수도 있겠습니다.
`g(x)=(x-1)^2`인 `g(x)`를 가장 작게 만드는 `x`를 구하는 과정입니다. 미분해서 구한 도함수의 값이 `x=1`일때 0이 됩니다. `g(x)`를 최소화하기 위해서는, `x`가 1보다 작을때는 `x`를 늘리고, `x`가 1보다 클 때는 `x`를 줄여야 합니다. 생각해보면 `g(x)`의 값은 도함수의 방향과도 연관이 있습니다.
1보다 한 단계씩 크고 작은 자연수를 대상으로 생각해봅시다. `x`가 0일때는 도함수의 값이 -2입니다. 음수죠. `x`가 점점 작아질수록 도함수의 값도 점점 작아집니다. 반대로 `x`가 2일때는 도함수의 값이 2입니다. 양수죠. `x`가 점점 커질수록 도함수의 값도 점점 커집니다.
정리하면, 도함수의 값이 음수일때는 `x`를 늘리고, 양수일 때는 `x`를 줄이면 `g(x)`가 작아지게 됩니다. 도함수의 부호와 역방향으로 움직인다는 것을 식으로 정리하면,
위와 같은 형태죠. 만약에 `x=4`에서 시작하는 식이 있다고 해 봅시다.
이렇게 계속 4와 -2 사이를 왔다 갔다만 합니다. 우리가 알고 있는 최저점인 1이 아니라, 두 값을 시계추처럼 왔다 갔다만 하게 되는 것이죠. 지금까지는 '어느 방향으로 움직일까'를 정했다면, 이제는 '한번에 어느 정도를 움직일까'를 정해야 할 필요가 있게 됐습니다.
앞의 식에서 도함수의 값에 $\eta$값이 등장했습니다. 우리는 이를 학습률, Learning Rate라고 부릅니다. 도함수의 값을 `x`값을 업데이트 하는데 100% 활용하는 것이 아니라 일부분만을 반영하는 개념입니다. 일종의 보폭이라고 생각하면 좋을 것 같습니다.
Learning Rate도 적절한 값을 설정해 주는 것이 필요한데요, 보폭이 너무 작으면 최소값을 향해 갈 수는 있지만, 같은 거리 대비 걸어야 하는 걸음의 수가 많아지기 때문에 모델이 학습하는데 시간이 오래 걸리게 됩니다. 너무 크면 걸어가다가 목적지인 최소값을 지나치게 되고, 가까이 갈 수는 있지만 최소값에 도달하기는 어렵게 됩니다.
이러한 방식이 최적화 문제를 푸는 방법들 중 하나인 경사하강법(Gradient Descent)입니다.
앞서 예시로 들었던 `g(x)=(x-1)^2`에서는 최소값을 찾고자 하는 것이 `x`하나였습니다. 하지만 우리의 알고리즘에서는 여러 개의 값을 갱신해야 합니다. 각각의 가중치와 편향을 갱신해야하기 때문이죠. 이런 경우에는 미분할 때 최적화하는 변수를 대상으로 편미분을 해줍니다. 하지만 층이 깊어질 수록 여러 겹의 합성 함수를 미분해주는 것은 그리 쉬운 일이 아닙니다. 출력층의 가중치의 미분은 간단하지만, 우리의 모델이 깊어지면 깊어질수록 입력층에 가까운 가중치는 더 복잡한 형태가 됩니다.
때문에 조금 쉽게 계산하는 방식이 활용되는데요, 우리의 목적함수를 가중치로 편미분하는 것이 아니라, 가중치가 부여된 값으로 편미분을 해줍니다. 각 층의 식을 일반화하면 `a(Wx+b)`의 형태인데요, 우리가 최적화하고자 하는 가중치는 `W`에 들어있습니다. 그리고 `a(Wx+b)`는 우리의 목적함수인 `y-f(x)`에서 `f(x)`에 해당하죠. 그래서 미분을 분할해서 계산해줍니다.
일반화하면 위와 같은 형태의 분할이죠.
지금까지 설명한 내용을 책에서는 이렇게 정리하고 있습니다.
편미분을 해서 나온 두 식 중 앞의 것을 $\delta$라고 합시다. 출력층의 $\delta$를 먼저 구하고 이를 그 앞층의 델타를 구할 때 활용하고, 또 그 델타를 앞층의 델타를 구하는데 활용합니다. 이를 델타의 재활용이라고 표현합니다. 이렇게하면 아무리 깊고 복잡한 모델이라고 하더라도 어렵지 않게 최적화 문제를 계산할 수 있습니다.
이처럼 입력층에서부터 최적화 문제를 풀어나가는 것이 아니라, 가장 뒤에 있는 출력층에서부터 역방향으로 입력층까지 오면서 뒤에 있는 층의 최적화 결과를 활용하는 것을 역전파, Back Propagation이라고 합니다.
'책 리뷰 > 친절한 딥러닝 수학' 카테고리의 다른 글
친절한 딥러닝 수학(2) - 순전파를 배우자 (0) | 2021.04.02 |
---|---|
친절한 딥러닝 수학(1) - 신경망을 시작하자 (0) | 2021.03.31 |