Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
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 29 30 31
Archives
Today
Total
관리 메뉴

9시 24분

경사 하강법 본문

인공지능

경사 하강법

leeeee.yeon 2021. 6. 28. 14:35

앞에서 그린 산점도에 가장 잘 맞는 직선은 두 번째 직선임을 직관적으로 알 수 있다.

즉, 데이터를 표현하는 점들의 가운데 지점을 가로지르는 직선을 자연스럽게 찾아낼 수 있는 것이다.

 

보통 여러 개의 특성을 가진 데이터를 이용하여 고차원의 그래프를 한 번에 그리는 것이 아니라 특성의 개수를 1, 2개만 이용하여 2차원이나 3차원의 그래프로 그리는 경우가 많다.

 

 

선형 회귀와 경사 하강법의 관계

 

(복습)

선형 회귀의 목표: 입력 데이터와 타깃 데이터를 통해 기울기와 절편을 찾는 것, 즉, 산점도 그래프를 잘 표현하는 직선의 방정식을 찾는 것

 

경사 하강법 (gradient descent)가 바로 그 방법 중 하나이다.

경사 하강법: 모델이 데이터를 잘 표현할 수 있도록 기울기(변화율)를 사용하여 모델을 조금씩 조정하는 최적화 알고리즘

 

( + 경사 하강법 외에도 정규 방정식, 결정 트리, 서포트 벡터 머신 등 여러 가지 회귀 문제를 푸는 알고리즘이 있다. )

 

 

경사 하강법 구현을 위해 필요한 지식들

 

  • 딥러닝 분야에서는 기울기 a를 가중치를 의미하는 ω나 계수를 의미하는 θ로 표기한다.
  • y는 ŷ (y-hat)으로 표기한다.
  • y= ax+b (=) ŷ=ωx+b
  • 가중치 ω와 절편 b는 알고리즘이 찾은 규칙을 의미하고, ŷ은 우리가 예측한 값을 의미한다.

 

예측값: 새로운 입력값을 넣으면 나오는 출력(모델을 통해 예측한 값)

ex) y=7x+4라는 모델의 x에 7을 넣으면 53이라는 값이 나온다.

여기서 53이라는 값이 모델을 통해 예측한 값이다.

 

[ 훈련 데이터에 잘 맞는 w와 b를 찾는 방법 ]

1. 무작위로 w와 b를 정한다. (무작위로 모델 만들기)
2. x에서 샘플 하나를 선택하여 ŷ를 계산한다. (무작위로 모델 예측하기)
3. ŷ과 선택한 샘플의 진짜 y를 비교한다. (예측한 값과 진짜 정답 비교하기)
4. ŷ이 y와 더 가까워지도록 w, b를 조정한다. (모델 조정하기)
5. 모든 샘플을 처리할 때까지 2~4번 과정을 반복한다.

 

위 과정을 코랩에서 직접 해보자.

 

1. w와 b 초기화하기

w와 b를 어떻게 초기화할지 규칙을 정하지 않았으므로 임시 규칙을 정한다.

 

2. 훈련 데이터의 첫 번째 샘플 데이터로 ŷ 얻기

타깃은 151.0로 차이가 크다

 

3. w 값 조절해 예측값 바꾸기

어떤 방법으로 w와 b를 바꾸면 y_hat이 y[0]에 가까워질까?

이를 알아보기 위해 y_hat이 증가하는지 감소하는지 살펴보자.

 

w 값을 0.1 증가시킨 다음 값을 다시 예측하여 y_hat_inc에 저장한다.

y_hat보다 조금 증가한 것을 볼 수 있다.

 

4. w 값을 조정한 후 예측값 증가 정도 확인하기

 

0.061696206518688734이 바로 첫 번째 훈련 데이터 x[0]에 대한 w의 변화율이다.

 

w_rate에 대한 코드를 수식으로 정리하면 위와 같다.

즉, 변화율은 훈련 데이터의 첫 번째 샘플인 x[0]라는 것을 알 수 있다.

 

위 경우 y_hat의 값이 y보다 작으므로 y_hat의 값을 증가시켜야 한다.

또, 변화율이 양수이므로 w의 값을 증가시키면 y_hat의 값을 증가시킬 수 있다.

( 변화율이 음수일 때 y_hat의 값을 증가시키려면 w의 값을 감소시키면 된다. )

 

이 방법을 사용할 때, 변화율이 양수일 때와 음수일 때를 구분하는 것이 번거로울 수 있다.

그러나 양수일 때와 음수일 때 모두 변화율을 가중치 w에 더하면 된다는 것을 알 수 있다.

 


이번에는 절편 b에 대한 변화율을 구하고 다음 변화율로 b를 업데이트해보자.

 

 

이제까지 y_hat을 증가시켜야 하는 상황을 가정하고 w와 b를 업데이트하는 방법에 대해 알아보았다.

그러나 이 방법은 조금 수동적인 방법이다.

  • y_hat이 y에 한참 미치지 못하는 값인 경우, w와 b를 더 큰 폭으로 수정할 수 없다.
  • y_hat이 y보다 커지면 y_hat을 감소시키지 못한다.

 


오차 역전파(backpropagation)를 통해 이 문제를 해결할 수 있다. ( w와 b를 더 능동적으로 업데이트할 수 있다. )

오차 역전파는 ŷ과 y의 차이를 이용하여 w와 b를 업데이트 하며, 이름에서 알 수 있듯이 오차가 연이어 전파되는 모습으로 수행된다. ( 지금 하는 예제는 간단해서 그 모습이 잘 보이지 않는다. )

 

[ 오차 역전파의 아이디어 ]

  • ŷ과 y의 차이가 크면 w와 b를 더 많이 증가시키자.
  • ŷ이 y보다 커져서 ŷ을 감소시켜야 한다면, w와 b를 감소시키자.
  • y에서 ŷ을 뺀 오차의 양을 변화율에 곱하는 방법으로 w를 업데이트하자.

 

이 아이디어를 코드로 구현해보자.

 

1. 오차와 변화율을 곱하여 가중치 업데이트하기

결괏값을 보면 w와 b가 큰 폭으로 바뀌었음을 알 수 있다.

 

2. 두 번째 샘플 x[1]을 사용하여 오차를 구하고 새로운 w와 b를 구하자.

w_rate이 샘플값과 같아진다는 것과 b_rate이 1이라는 점을 이용하여 코드를 구현하였다.

결과를 보면 w는 4가 증가하였고, b는 절반으로 줄어들었다.

이런 방식으로 모든 샘플을 사용해 가중치와 절편을 업데이트하자.

 

3. 전체 샘플 반복하기

zip() 함수는 여러 개의 배열에서 동시에 요소를 하나씩 꺼내준다.

 

4. 과정 3을 통해 얻어낸 모델이 전체 데이터 세트를 잘 표현하는지 그래프를 그려 알아보자.

직선 그래프를 그리기 위해 시작점과 종료점의 x좌표와 y좌표를 plot() 함수에 전달하였다.

pt1, pt2 선정 기준이 뭐지 ...?

 

5. 여러 에포크를 반복하기

경사 하강법에서는 주어진 훈련 데이터로 학습을 여러 번 반복한다.

이렇게 전체 훈련 데이터를 모두 이용하여 한 단위의 작업을 진행하는 것을 에포크(epoch)라고 부른다.

100번의 에포크를 반복하여 앞에서 찾은 직선을 보완해보자.

w = 587.8654539985689, b = 99.40935564531424에서

w = 913.5973364345905, b = 123.39414383177204로 바뀌었다.

 

그래프로 다시 나타내면,

그래프가 조금 위로 올라가고, 이전보다 더 전체 데이터의 경향을 잘 따라간다고 볼 수 있다.

즉, 우리가 찾은 머신러닝 모델은 ŷ=913.6x+123.4

이다!

 

6. 모델로 예측하기

 

입력 x에 새로운 데이터가 발생했다고 가정해보자.

이제 이 데이터에 대한 예측값을 얻으려면 우리가 찾은 모델에 x를 넣고 계산하기만 하면 된다.

 

예를 들어, x가 0.18일 때 ŷ의 값을 예측해 보자.

산점도에서 주황색 점이 x가 0.18일 때 ŷ의 예측값으로 어느 정도 산점도의 추세에 맞다고 생각할 수 있다.

앞에서 진행했던 과정을 다시 한번 정리하고 게시글을 마무리하자.

 

1. w와 b를 임의의 값 (1.0, 1.0)으로 초기화하고 훈련 데이터의 샘플을 하나씩 대입하여 y와 ŷ의 오차를 구한다.
2. 1에서 구한 오차를 w와 b의 변화율에 곱하고 이 값을 이용하여 w와 b를 업데이트한다.
3. 만약 ŷ가 y보다 커지면 오차는 음수가 되어 자동으로 w와 b가 줄어드는 방향으로 업데이트된다.
4. 반대로 ŷ이 y보다 작으면 오차는 양수가 되고 w와 b는 더 커지도록 업데이트된다.