티스토리 뷰
[ML Andrew Ng] C1-Supervised Machine Learning: Regression and Classification 강의 (W2-2) Linear Regression with Multiple Variables
Life4AI 2024. 9. 5. 15:55Practical Tips for Linear Regression - Feature Scaling Part I
Gradient descent를 훨씬 빠르게 수행할 수 있는 feature scaling 기술을 보자.
다중 선형 회귀에서 파라미터 \(w_{1}\), \(w_{2}\) , 그리고 \(b\)가 어떻게 예측에 영향을 미치는지 살펴보자.
예를들어, 2000평방피트 크기의 집에 침실 5개가 있고 가격이 50만 달러 또는 50만 달러인 집을 들어 보자.
\(w_{1}\)=50이고 \(w_{2}\)=0.1이고 \(b\)=50일 때, 예측 가격은 10만 달러에 0.5만 달러를 더하고, 여기에 50만 달러를 더한 금액으로 약 1억 달러에 해당한다. 하지만 실제 가격이 50만 달러라 이 값은 너무 크게 차이난다. 즉, 좋은 파라미터 조합이 아니다.
반대로, \(w_{1}\)=0.1이고 \(w_{2}\)=50이고 \(b\)=50인 경우를 보자. 이때, \(w_{1}\)은 비교적 작고 \(w_{2}\)는 비교적 크다. 예상 가격을 계산하면, 50만 달러로 실제 가격과 일치하게 된다.
이 예시에서 알 수 있듯이, feature의 값 범위에 따라 적절한 파라미터 값이 달라진다.
그렇다면 이것이 gradient descent와 어떻게 관련이 있을까?
가로축을 평방피트 크기(\(x_{1}\))로, 세로축을 침실 수(\(x_{1}\))로 해서 데이터를 도표화해 보면, \(x_{1}\)의 값 범위가 훨씬 넓다는 것을 알 수 있다. 이때 비용 함수의 등고선을 보면, 가로축 범위는 좁지만 세로축 범위는 넓어 타원형 등고선이 형성된다.
이러한 상황에서는 \(w_{1}\)을 조금만 바꿔도 예측 가격과 비용 함수에 큰 영향을 미친다. 왜냐하면 \(w_{1}\)이 큰 값(평방피트)에 곱해지기 때문이다. 반면, \(w_{2}\)는 값이 작아 더 큰 변화를 주어야 예측에 큰 영향을 준다.
따라서, 이 문제를 해결하기 위한 방법은 feature scaling이다. Feature Scaling은 각 fetaure들을 비슷한 척도로 변환하는 과정이다. 위의 예제처럼 \(x_{1}\)값의 범위(300-2000)와 \(x_{2}\)값의 범위(0-5)이라면, 그 차이가 매우 크다. 이 경우, gradient descent가 global optimum에 도달하기 위해 많은 단계를 거치게 되어 알고리즘 계산 비용이 크게 증가한다.
이런 과도한 계산 비용을 줄이기 위해, 모든 변수를 0과 1사이의 비슷한 범위로 조정한다. 이렇게 하면 비용 함수의 등고선이 타원형에서 원형으로 바뀌고, gradient descent는 전역 최솟값에 더 빠르고 효율적으로 도달할 수 있다.
요약하자면, feature들의 값 범위가 크게 다르면 gradient descent가 느려진다. 하지만 feature들의 범위를 비슷하게 조정하면, 알고리즘이 더 빠르고 효율적으로 학습할 수 있다.
Practical Tips for Linear Regression - Feature Scaling Part II
feature scaling 방법들을 살펴보자.
원래 \(x\)값을 범위의 최대값으로 나눠 범위를 0-1사이로 맞춰준다.
feature들을 0을 중심으로 배치되도록 크기를 다시 조정하는 것이다.
음수와 양수 값이 모두 있는 보통 -1~1사이로 조정한다.
각 feature의 평균과 표준 편차를 구하여 z-점수로 정규화한다.
장점이 있다.
feature scaling을 사용해도 성능이 나빠질 일은 거의 없기 때문에, 확신이 서지 않더라도 시도해 보는 것이 좋다. 이 간단한 기법을 통해 gradient descent를 훨씬 더 빠르게 실행할 수 있는 경우가 많다.
그렇다면, feature scaling을 하든 안 하든, 경사하강법이 제대로 작동하고 있는지, 그리고 전역 최솟값 또는 그 근처를 찾았는지 어떻게 알 수 있을까?
이제 경사하강법이 수렴하고 있는지 확인하는 방법을 다뤄보자.
Practical Tips for Linear Regression - Checking Gradient Descent for Convergence
gradient descent을 수행할 때 수렴(covergence) 여부를 어떻게 알 수 있을까?
즉, 비용 함수의 global minimum에 가까운 parameter를 찾는 데 도움이 되는 지 여부이다.
gradient descent의 목표는 비용 함수 \(J(w,b)\)를 최소화하는 매개변수 \(w\)와 \(b\)를 찾는 것이다. gradient descent이 반복될 때마다 비용 함수 \(J\)가 어떻게 변하는지 확인하기 위해, 보통 매 반복(iteration)마다 계산된 \(J\)의 값을 그래프로 그린다.
gradient descent이 제대로 작동한다면, 그래프에서 반복이 진행될수록 비용 \(J\)가 점차 감소하는 모습을 볼 수 있다. 만약 \(J\)가 감소하지 않고 오히려 증가한다면, 학습률 \(\alpha\)가 너무 크거나, 코드에 문제가 있을 수 있다.
또한, 이 그래프를 통해 gradient descent이 언제 수렴하는지 알 수 있다. 예를 들어, 약 300번의 반복 후에는 비용 \(J\)가 거의 변하지 않고 평평해지기 시작했으므로, gradient descent이 수렴했다는 신호이다. 이는 더 이상 반복을 진행해도 비용이 크게 줄어들지 않는다는 뜻이다. 이처럼 학습 곡선(learning curve)을 통해 gradient descent이 수렴했는지 확인할 수 있다.
하지만 수렴하는 데 필요한 반복 횟수는 문제마다 다르다. (30번의 반복으로 수렴할 수 있고, 다른 문제는 1,000번, 심지어 100,000번의 반복이 필요할 수 있음) 사전에 필요한 반복 횟수를 정확히 예측하는 것은 어렵기 때문에, 학습 곡선을 그려보는 것이 매우 유용하다.
모델 학습 완료 시기를 결정하는 다른 방법은 자동 수렴 테스트이다. 예를 들어, \(\varepsilon\)이라는 작은 값을 정해둡니다. 보통 0.001 정도로 설정하며, 만약 비용 \(J\)의 변화량이 이 값보다 작아지면 수렴했다고 판단할 수 있다. 즉, 비용 함수의 변화가 미미해지면 더 이상 큰 개선이 이루어지지 않기 때문에 학습을 멈출 수 있다.
다만, 적절한 \(\varepsilon\)값을 설정하는 것도 쉽지 않기 때문에 저는 주로 학습 곡선을 통해 수렴 여부를 판단하는 경향이 있다. 또한, 경사하강법이 잘못된 방향으로 진행될 때, 학습 곡선은 중요한 경고 신호를 제공할 수 있다.
이제 경사하강법이 잘 작동할 때의 학습 곡선이 어떻게 보이는지 살펴봤다. 다음 단계에서는 적절한 학습률 \(\alpha\)을 선택하는 방법에 대해 알아보겠다.
Practical Tips for Linear Regression - Choosing the Learning Rate
적절한 학습률을 선택하면 학습 알고리즘이 훨씬 더 잘 수행된다. 크기가 너무 작으면 실행 속도가 매우 느리고 너무 크면 수렴하지 않을 수도 있다. 모델에 적합한 학습률을 선택하는 방법을 알아보자.
gradient descent을 반복하면서 비용 함수의 변화를 확인할 때, 비용이 오르락내리락하는 현상이 발생한다면 이는 경사하강법이 제대로 작동하지 않는다는 신호일 수 있다. 이러한 경우에는 두 가지 가능성이 있다: 코드에 버그가 있거나 학습률(\(\alpha\))이 너무 높을 수 있습니다. \(\alpha\)가 너무 크면, 알고리즘이 최적의 값을 지나쳐버리는 오버슈팅(overshoot)현상이 발생해 비용이 불안정해질 수 있다.
이를 해결하려면 학습률을 낮추면 된다. 학습률이 낮아지면 각 반복에서 매개변수가 조금씩 조정되어 비용이 점진적으로 감소하게 된다.
하지만, 만약 반복할 때마다 비용이 지속적으로 증가한다면, 이는 학습률 \(\alpha\)이 너무 높아서 발생하는 현상일 수 있으며, 이 경우에는 학습률을 더 낮춰야 한다. 또 다른 가능성은 코드 자체에 문제가 있을 수 있다는 점이다. 예를 들어, 매개변수 \(w_{1}\)을 갱신할 때 도함수의 방향으로 업데이트하지 않고 잘못된 방향으로 업데이트하는 경우, 비용 \(J\) 는 최솟값으로 수렴하는 대신 멀어지게 된다. 이때는 코드를 점검하고, 매개변수를 갱신할 때 마이너스 부호를 포함한 올바른 수식을 적용해야 한다.
gradient descent가 올바르게 작동하는지 디버깅하는 방법 중 하나는 학습률 \(\alpha\)을 아주 작게 설정해보는 것이다. 학습률 \(\alpha\)이 충분히 작으면, 반복할 때마다 비용 함수가 지속적으로 감소해야 한다. 만약 학습률 \(\alpha\)을 아주 작게 설정했는데도 비용이 감소하지 않거나 오히려 증가한다면, 이는 코드에 버그가 있음을 시사한다.
단, 학습률 \(\alpha\)을 지나치게 낮게 설정하는 것은 디버깅 목적으로만 사용해야 한다. 학습률 \(\alpha\)이 너무 작으면 경사하강법이 수렴하는 데 많은 반복이 필요해 비효율적일 수 있다.
따라서, 실제로 모델을 학습할 때는 다양한 학습률을 시도해보는 것이 좋다. 예를 들어, 처음에는 \(\alpha\)=0.001로 시작한 후, 0.01, 처럼 10배 더 큰 값을 시도해 본다. 각 학습률 \(\alpha\)에 대해 경사하강법을 몇 번 실행한 후 비용 함수의 변화를 그려보면, 어느 학습률에서 가장 일관되게 비용이 감소하는지 확인할 수 있다.
이러한 과정에서 일반적으로 학습률 \(\alpha\)을 3배씩 증가시키면서 여러 값을 시도해보는 방법을 사용할 수 있습니다. 예를 들어, \(\alpha\)=0.001, 0.003, 0.01과 같은 방식으로 학습률을 늘려가면서 적절한 값을 찾아보는 것이다. 너무 작은 학습률은 비용 감소 속도가 느리게 하고, 너무 큰 학습률은 비용이 불안정하게 변동할 수 있으므로, 그 중간 지점을 찾아가는 것이 중요합니다.
결국, 가능한 가장 큰 학습률 \(\alpha\)중에서도 비용이 안정적으로 감소하는 값을 선택하는 것이 이상적이다. 이렇게 하면 경사하강법을 더 효율적으로 사용할 수 있다.
Practical Tips for Linear Regression - Feature Engineering and Polynomial Regression
feature selection은 학습 알고리즘의 성능에 큰 영향을 미칠 수 있다. 학습 알고리즘에 가장 적합한 기능을 선택하거나 설계하는 방법을 보자.
위의 예시처럼 집 면적의 가로, 세로 길이가 각각의 feature로 되어 있을 때, feature들을 하나의 feature로 만들어도 된다. 가로랑 세로를 곱하면 면적이기 때문이다.
또한 우리는 여태까지 선형적인 관계만 살펴보았다. 그러나 regression은 항상 선형의 형태로 나타나는 것은 아니다. feature에 제곱, 세제곱, 루트 등이 있을 때 그 모양은 자유자재로 바뀐다. 이 때 feature scaling이 특히 더 중요해지는데, 만약 제곱, 세제곱을 하면 값의 범위가 너무 커질 수도 있기 때문이다.
Practice quiz: Gradient descent in practice
'Coursera 강의 > Machine learning Specialization' 카테고리의 다른 글
- Total
- Today
- Yesterday
- numpy 배열 생성
- **kwargs
- NumPy
- action value function
- 파이썬
- 경사하강법
- *args
- state value function
- 앤드류응
- 강의노트 정리
- 백준
- omp: error #15
- Andrew Ng
- 강화학습
- *
- 11870
- 딥러닝
- baekjoon
- numpy 배열 속성
- python
- policy function
- 비용함수
- 로지스틱 회귀
- **
- sorted
- computation graph
- Sort
- 손실함수
- 숏코딩
- adrew ng 머신러닝 강의
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |