Quiz / ML 회귀 / 전체 문항
GitHub

ML 회귀 전체 문항

선형 회귀, 비용 함수, 경사 하강법, 규제. 문항과 선택지별 해설을 글 순서대로 나열했습니다.

30문항 · 글 5편
직접 풀어보기 →

데이터에 가장 잘 맞는 직선을 찾는 선형 회귀

원문 읽기 →
개념 확인구조

가장 잘 맞는 직선을 고를 때 잔차를 그냥 더한 값을 쓰지 않는 이유는 무엇인가?

  1. 정답직선 위의 점은 양수, 아래의 점은 음수라 서로 상쇄되기 때문이다.

    모든 점을 크게 빗나간 직선도 잔차의 합이 0이 될 수 있다. 부호를 없애야 크기를 재는 자가 되므로 제곱해서 더한 잔차 제곱합을 최소화 대상으로 삼는다.

  2. 합은 데이터 개수에 따라 커지므로 모델끼리 비교할 수 없기 때문이다.

    개수로 나누면 해결되는 문제이고 실제로 평균 제곱 오차가 그렇게 만들어진다. 부호가 상쇄되는 것은 개수로 나눠도 그대로 남는다.

  3. 잔차의 합은 언제나 0이 되도록 정의되어 있기 때문이다.

    절편을 포함한 최소제곱 해에서는 결과적으로 그렇게 되지만, 그것은 이미 제곱합을 최소화한 뒤의 성질이다. 임의의 직선에서는 0이 아니다.

  4. 덧셈보다 제곱이 미분하기 쉬워 계산이 빠르기 때문이다.

    미분이 매끄럽다는 것은 제곱을 고르는 부수적인 이점이다. 절댓값을 씌워도 부호는 사라지므로, 애초에 부호를 없애야 한다는 것이 먼저다.

해설

잔차는 실제값에서 예측값을 뺀 값이라 직선 위의 점에서는 양수, 아래의 점에서는 음수가 된다. 그대로 더하면 서로 상쇄되어 모든 점을 크게 빗나간 직선도 합이 0이 나올 수 있다. 그래서 제곱해서 더한 잔차 제곱합을 최소화 대상으로 삼는다. 제곱을 고르면 부호가 사라지는 것 말고도 두 가지가 따라온다. 크게 빗나간 점일수록 더 무거운 벌점을 받고, 미분이 매끄러워 최적화에 편하다. 앞의 성질은 양날이다. 이상치 하나가 나머지를 전부 합친 것보다 큰 벌점을 만들어 직선을 통째로 끌어당길 수 있다.

이 내용 다시 읽기 →
상황 적용적용
area  = np.array([[60], [75], [85], [95], [110], [120], [140], [155]])  # m²
price = [2.1, 2.8, 3.2, 3.6, 4.1, 4.5, 5.2, 5.8]  # 억

model = LinearRegression().fit(area, price)
print(model.coef_[0], model.intercept_)   # 0.03804  -0.08176

이 두 숫자를 어떻게 읽어야 하는가?

  1. 면적 100m²의 예측은 데이터에 없는 값이라 계산되지 않는다.

    직선 위의 어느 점이든 계산된다. 0.03804 × 100 - 0.08176으로 약 3.72억이 나오고, 학습 범위 안이라 신뢰할 만한 구간이다.

  2. 면적 1m²당 3.8%씩 오른다. 계수는 비율을 뜻한다.

    계수는 비율이 아니라 y의 단위로 표현된 증가량이다. 비율로 읽으려면 로그를 취한 뒤 회귀해야 한다.

  3. 정답면적 1m²당 약 380만 원이 오르고, 절편은 직선의 위치를 맞추는 값이다.

    기울기는 x가 1 늘 때 y가 얼마나 변하는지이므로 0.03804억, 즉 약 380만 원이다. 절편 -0.08176은 면적 0일 때의 값이라 그 자체로는 뜻이 없고 직선의 높이를 맞추는 역할만 한다.

  4. 절편이 음수이므로 모델이 잘못 학습됐다.

    면적 0인 집은 데이터에도 현실에도 없으므로 그 지점의 값이 음수여도 문제가 되지 않는다. 직선이 학습 범위 안에서 데이터를 잘 지나가는지만 보면 된다.

해설

선형 회귀가 하는 일은 결국 두 개의 숫자를 정하는 것이다. 기울기는 면적이 1m² 늘 때 집값이 얼마나 오르는지를, 절편은 직선의 높이를 맞추는 값을 뜻한다. 여기서 절편 -0.08176이 음수인 것은 문제가 아니다. 면적 0인 집은 학습 데이터에도 현실에도 없으므로 그 지점의 값을 해석할 이유가 없고, 직선이 학습 범위 안에서 데이터를 잘 지나가는지만 보면 된다. 예측도 이 두 숫자의 산술로 끝난다. 100m²라면 0.03804에 100을 곱하고 절편을 더해 약 3.72억이다. 계수 하나만 봐도 어떤 특성이 예측에 얼마나 기여하는지 바로 읽히는 것이 이 모델이 지금도 기준선 자리를 지키는 이유다.

이 내용 다시 읽기 →
상황 적용구조
잔차 제곱합을 최소로 만드는 계수는 정규 방정식 w = (XᵀX)⁻¹Xᵀy로 한 번에 구해진다. 반복이 필요 없다.

특성이 수만 개가 되면 이 방법을 쓰기 어려운 이유는 무엇인가?

  1. 샘플 수가 특성 수보다 많아야 하는데 그 조건이 깨지기 때문이다.

    샘플이 부족하면 실제로 문제가 생기지만 그것과 별개로 계산 비용 자체가 감당하기 어려워진다. 샘플이 충분해도 특성 수만으로 벽에 부딪힌다.

  2. 정답역행렬 계산량이 특성 수의 세제곱에 비례해 한 번의 계산조차 감당하기 어렵다.

    특성이 수만 개면 세제곱은 천문학적인 수가 된다. 게다가 XᵀX가 역행렬을 갖지 않는 경우도 생기므로, 이 지점부터는 기울기를 따라 조금씩 내려가는 반복 알고리즘이 사실상 유일한 선택지가 된다.

  3. 정규 방정식은 절편을 다룰 수 없어 특성이 늘면 오차가 누적되기 때문이다.

    1로 채운 열을 앞에 붙이면 절편이 계수의 하나로 자연스럽게 처리된다. 특성 수와도 무관한 이야기다.

  4. 특성이 많으면 잔차 제곱합에 최솟값이 존재하지 않기 때문이다.

    잔차 제곱합은 볼록 함수라 최솟값이 존재한다. 다만 유일하지 않을 수 있고, 그때 역행렬이 존재하지 않는 상황이 겹친다.

해설

정규 방정식은 잔차 제곱합을 파라미터로 미분해 0으로 놓고 푼 결과라 반복 없이 한 번에 해를 준다. 문제는 역행렬 계산량이 특성 수의 세제곱에 비례한다는 것이다. 특성이 수만 개면 단 한 번의 계산조차 감당하기 어렵고, XᵀX가 역행렬을 갖지 않는 경우도 생긴다. 특성끼리 완전히 겹치거나 샘플보다 특성이 많을 때가 그렇다. 이 지점부터는 기울기를 따라 조금씩 내려가는 반복 알고리즘이 사실상 유일한 선택지가 된다. 반대로 특성이 몇 개뿐이라면 정규 방정식 쪽이 명백히 낫다. 학습률을 고를 필요도, 수렴을 기다릴 필요도 없기 때문이다.

이 내용 다시 읽기 →
상황 적용진단
가로축에 예측값, 세로축에 잔차를 찍은 산점도를 그렸다. 점들이 0을 중심으로 고르게 흩어지지 않고 오른쪽으로 갈수록 위아래로 벌어지는 부채꼴을 그린다.

이 그림이 알려주는 것은 무엇인가?

  1. 선형성이 깨졌다. 다항 회귀나 로그 변환으로 관계의 모양을 바꿔야 한다.

    선형성이 깨지면 잔차가 U자나 곡선 패턴을 그린다. 부채꼴은 중심은 맞는데 흩어짐만 커지는 모양이라 다른 가정을 가리킨다.

  2. 정규성이 깨졌다. Q-Q 플롯으로 다시 확인해야 한다.

    정규성은 잔차의 분포 모양에 대한 가정이라 잔차 플롯이 아니라 Q-Q 플롯으로 본다. 도구가 다르다.

  3. 정답등분산성이 깨졌다. 가중 최소제곱이나 y 변환을 검토할 차례다.

    잔차가 흩어진 정도가 예측값의 전 구간에서 일정해야 한다는 것이 등분산성이고, 부채꼴은 그 값이 한쪽으로 갈수록 커진다는 뜻이다. 값이 클수록 오차도 커지는 데이터에서 흔히 나타난다.

  4. 독립성이 깨졌다. 데이터가 시계열인지 확인해야 한다.

    독립성은 잔차 플롯으로 알아내기 어렵고 데이터가 어떻게 수집됐는지를 봐야 한다. 시계열이라면 잔차의 자기상관을 따로 재는 것이 순서다.

해설

선형 회귀가 전제하는 네 가지 가정 가운데 선형성과 등분산성은 잔차 플롯 한 장으로 함께 본다. 가로축에 예측값, 세로축에 잔차를 찍었을 때 0 주변에 고르게 흩어져 있으면 두 가정이 다 통과다. U자 패턴이 보이면 선형성이 깨진 것이라 다항 회귀나 로그 변환을 검토하고, 부채꼴이면 등분산성이 깨진 것이라 가중 최소제곱이나 y 변환을 검토한다. 나머지 둘은 도구가 따로다. 정규성은 Q-Q 플롯으로 보고, 독립성은 데이터가 어떻게 수집됐는지를 봐야 알 수 있다. 실전에서 네 가정을 완벽히 만족하는 데이터는 거의 없으므로, 중요한 것은 통과 여부가 아니라 위반을 확인하는 습관 쪽이다.

이 내용 다시 읽기 →
분석과 판단진단
데이터 8건으로 학습했더니 기울기 0.0380, 절편 -0.082가 나왔다. 여기에 면적 155m²에 가격 9억인 거래 한 건을 더하고 다시 학습하니 기울기 0.0528, 절편 -1.354가 됐다.

점 하나가 이만큼 직선을 비튼 이유는 무엇인가?

  1. 정답잔차를 제곱해 최소화하므로 멀리 떨어진 점의 벌점이 나머지를 압도한다.

    잔차가 2배면 제곱 기여분은 4배가 되므로, 혼자 크게 벗어난 점 하나의 벌점이 나머지를 전부 합친 것보다 커질 수 있다. 그 벌점을 줄이려고 직선이 그쪽으로 끌려간다.

  2. 데이터가 9건뿐이라 표본이 작아 생긴 흔들림이다.

    표본이 크면 한 점의 영향이 줄어드는 것은 맞지만, 이상치가 충분히 멀면 수천 건에서도 같은 일이 일어난다. 원인은 개수가 아니라 제곱이라는 벌점 방식이다.

  3. 추가된 점의 면적 155가 기존 최댓값과 같아 중복이 생겼기 때문이다.

    같은 x에 다른 y가 오는 것은 데이터에서 흔한 일이고 계산도 정상적으로 된다. 문제를 만드는 것은 x의 중복이 아니라 y의 크기다.

  4. 절편이 음수로 더 내려간 것이 원인이고 기울기 변화는 그 결과다.

    순서가 뒤바뀌었다. 기울기가 커지면서 직선이 회전했고, 데이터의 중심을 지나도록 절편이 따라 내려간 것이다.

해설

선형 회귀는 이상치에 유난히 약하다. 잔차를 제곱해서 최소화하기 때문에, 혼자 멀리 떨어진 점의 잔차가 제곱되면서 나머지를 전부 합친 것보다 커지고 직선이 그쪽으로 끌려간다. 여기서는 점 하나가 기울기를 39% 키우고 절편을 1.27억이나 끌어내렸다. 그래서 학습 전에 데이터를 그려보는 단계를 건너뛸 수 없다. 대처는 이상치의 정체에 따라 갈린다. 측정 오류나 입력 실수라면 걷어내고, 실제로 존재하는 값이라면 큰 잔차에 덜 반응하는 비용 함수나 이상치에 강한 모델로 바꾼다. 무조건 지우는 것은 답이 아니다. 그 점이 진짜 시장의 일부라면 지운 모델이 현실을 설명하지 못하게 된다.

이 내용 다시 읽기 →
분석과 판단판단

scikit-learn의 LinearRegression이 역행렬을 직접 구하지 않고 특이값 분해 기반의 최소제곱 풀이를 쓰는 이유는 무엇인가?

  1. 특이값 분해가 역행렬보다 계산량이 적어 더 빠르기 때문이다.

    특이값 분해 쪽이 오히려 계산량이 많다. 속도를 내주고 안정성을 얻는 거래에 가깝다.

  2. 특이값 분해는 반복 알고리즘이라 대규모 데이터에 유리하기 때문이다.

    특이값 분해는 반복 없이 한 번에 끝나는 직접법이다. 반복으로 푸는 쪽은 경사하강법 계열이다.

  3. 정답XᵀX가 거의 특이한 경우에도 해를 내놓기 위해서다.

    특성끼리 강하게 겹치면 XᵀX의 역행렬이 없거나 수치적으로 매우 불안정해져 계수가 터무니없이 튄다. 특이값 분해는 그런 방향을 걸러내고 최소 노름 해를 돌려주므로 계산이 멈추지 않는다.

  4. 역행렬 방식으로는 절편을 함께 추정할 수 없기 때문이다.

    1로 채운 열을 붙이면 절편도 계수의 하나로 함께 구해진다. 두 방식 모두 같은 방법으로 절편을 다룬다.

해설

정규 방정식과 특이값 분해 기반 풀이는 같은 해를 겨냥하지만 XᵀX가 거의 특이한 상황에서 갈린다. 특성끼리 강하게 겹치거나 샘플보다 특성이 많으면 역행렬이 없거나 수치적으로 매우 불안정해져 계수가 터무니없이 튀고, 손으로 짠 역행렬 코드는 그대로 멈추거나 쓰레기 값을 뱉는다. 특이값 분해는 아주 작은 특이값에 해당하는 방향을 걸러내고 최소 노름 해를 돌려주므로 그런 데이터에서도 계산이 이어진다. 대가는 계산량이고, 그래서 특성 수가 크게 늘면 두 방식 모두를 버리고 반복 알고리즘으로 옮겨간다. 라이브러리가 조용히 해주는 이런 선택을 알아두면 계수가 이상할 때 어디를 의심할지가 정해진다.

이 내용 다시 읽기 →

모델이 얼마나 틀렸는지 재는 비용 함수

원문 읽기 →
개념 확인구조

비용 함수를 잔차 제곱의 합이 아니라 평균으로 정의하는 이유는 무엇인가?

  1. 합으로 두면 값이 커져 부동소수점 오차가 누적되기 때문이다.

    수천 건 정도로는 문제가 될 정밀도 손실이 생기지 않는다. 평균을 쓰는 이유는 수치 안정성과 무관하다.

  2. 합은 최솟값의 위치가 데이터 개수에 따라 달라지기 때문이다.

    상수를 곱하거나 나누어도 최솟값의 위치는 바뀌지 않는다. 그래서 학습 결과는 합으로 두든 평균으로 두든 같다.

  3. 정답데이터 개수가 다른 모델끼리도 값을 견줄 수 있게 하기 위해서다.

    합은 데이터가 많을수록 커지므로 1,000건으로 잰 값과 100건으로 잰 값을 나란히 놓을 수 없다. 개수로 나누면 한 건당 평균 오차가 되어 크기가 다른 데이터셋에서도 같은 자로 읽힌다.

  4. 평균을 써야 미분이 가능해지기 때문이다.

    합도 미분된다. 상수 배 차이라 기울기의 방향도 같고 크기만 데이터 개수만큼 다르다.

해설

합을 쓰면 데이터가 많을수록 값이 커져 크기가 다른 데이터셋 사이에서 값을 견줄 수 없다. 개수로 나누면 한 건당 평균 오차가 되어 같은 자로 읽힌다. 최솟값의 위치 자체는 어느 쪽을 써도 같다는 점도 함께 알아둘 만하다. 함수 전체에 상수를 곱하거나 나누어도 바닥의 위치는 옮겨지지 않기 때문이고, 교과서에 따라 분모에 2n을 쓰는 관습도 같은 이유로 결과에 영향이 없다. 미분할 때 제곱의 지수가 앞으로 나오면서 2분의 1과 상쇄되어 식이 깔끔해지는 것이 그 관습의 목적이다. 참고로 개별 포인트의 오차만 가리킬 때는 손실 함수라 부르지만 실무에서 두 용어는 거의 구분 없이 쓰인다.

이 내용 다시 읽기 →
상황 적용구조
어떤 교과서는 비용 함수를 J = (1/n)Σ(ŷ - y)²로 쓰고 다른 교과서는 J = (1/2n)Σ(ŷ - y)²로 쓴다.

이 차이가 학습 결과에 미치는 영향은 무엇인가?

  1. 정답없다. 상수를 곱해도 최솟값의 위치는 바뀌지 않는다.

    비용 함수 전체를 2로 나누면 곡선이 납작해질 뿐 바닥의 가로 위치는 그대로다. 2분의 1을 붙이는 것은 미분할 때 제곱의 지수 2가 앞으로 나오면서 상쇄되어 식이 깔끔해지기 때문이다.

  2. 2분의 1을 붙인 쪽이 비용이 절반이라 더 좋은 모델로 평가된다.

    같은 모델의 비용을 다른 자로 잰 것이라 모델의 좋고 나쁨과 무관하다. 두 값을 나란히 놓고 비교하는 것 자체가 성립하지 않는다.

  3. 2분의 1을 붙이면 기울기가 절반이 되므로 학습률도 두 배로 잡아야 같은 결과가 나온다.

    기울기가 절반이 되는 것은 맞지만 결국 같은 바닥으로 수렴한다. 도달 속도가 달라질 뿐 학습률을 반드시 맞춰야 하는 것은 아니다.

  4. 2분의 1을 붙인 쪽은 볼록성이 깨져 국소 최솟값이 생길 수 있다.

    양수 상수를 곱해도 볼록성은 그대로 유지된다. 볼록성을 정하는 것은 상수가 아니라 예측식이 파라미터에 대해 선형이라는 사실이다.

해설

함수 전체에 양수 상수를 곱하거나 나누어도 최솟값의 위치는 바뀌지 않는다. 곡선의 높이만 달라질 뿐 바닥이 놓인 가로 위치가 그대로이므로 학습 결과도 같다. 2분의 1을 붙이는 관습은 미분할 때 제곱의 지수 2가 앞으로 나오면서 상쇄되어 식이 깔끔해지기 때문에 생겼다. 여기서 얻을 일반적인 감각이 하나 있다. 비용 함수에서 중요한 것은 값의 절대 크기가 아니라 파라미터를 움직였을 때 값이 어느 방향으로 변하는가다. 그래서 스케일이 다른 비용 값끼리 비교하는 것은 의미가 없고, 같은 정의로 잰 값끼리만 나란히 놓을 수 있다.

이 내용 다시 읽기 →
상황 적용적용
집값을 억 원 단위로 예측하는 모델의 MSE가 0.002542로 나왔다. 같은 예측의 MAE는 0.0405다.

MSE 0.0025를 사람이 읽을 수 있는 형태로 옮기면 무엇이 되는가?

  1. 0.25%다. 백분율로 옮기면 오차율이 된다.

    MSE는 비율이 아니라 억 원의 제곱 단위다. 오차율을 보고 싶다면 실제값으로 나누는 MAPE 같은 지표를 따로 써야 한다.

  2. 2,542만 원이다. 소수를 만 원 단위로 바꾸면 된다.

    단위를 옮기려면 먼저 제곱을 풀어야 한다. 제곱 단위의 숫자에 배율만 곱하면 뜻이 없는 값이 나온다.

  3. MAE 0.0405와 같은 값이어야 하므로 계산에 오류가 있다.

    두 지표는 서로 다른 방식으로 잔차를 요약하므로 값이 다른 것이 정상이다. 제곱근을 씌운 0.0504가 MAE보다 큰 것도 큰 잔차에 가중 벌점이 붙기 때문이다.

  4. 정답제곱근을 씌운 약 0.05, 즉 500만 원 안팎으로 빗나간다는 뜻이다.

    MSE는 억 원의 제곱 단위라 그대로는 읽히지 않는다. 제곱근을 씌우면 단위가 y와 같아져 0.0504억, 즉 500만 원 수준의 오차로 번역된다. 이 값이 RMSE이고 보고에 쓰는 이유가 여기 있다.

해설

MSE의 단위는 타깃의 제곱이라 그대로는 감이 오지 않는다. 제곱근을 씌우면 단위가 타깃과 같아져 사람이 읽을 수 있는 값이 되고, 그것이 RMSE다. 여기서는 0.0504억이므로 예측이 500만 원 안팎으로 빗나간다는 뜻이다. 학습에는 MSE를, 보고에는 RMSE를 쓰는 조합이 흔한 것도 이 때문이고, 제곱근이 단조 함수라 최소화 지점은 둘이 같으므로 어느 쪽을 최적화해도 결과가 동일하다. 함께 볼 것이 MAE와의 격차다. 잔차가 모두 같은 크기면 RMSE와 MAE가 일치하고 편차가 클수록 벌어지므로, 두 값의 차이 자체가 유독 크게 빗나간 예측이 섞여 있는지를 알려준다.

이 내용 다시 읽기 →
상황 적용구조

선형 회귀의 비용 함수가 그릇 모양의 볼록 함수가 되는 근거는 무엇인가?

  1. 잔차를 제곱했기 때문이다. 제곱을 쓰면 어떤 모델에서도 볼록해진다.

    제곱만으로는 부족하다. 신경망도 제곱 오차를 쓰지만 비용 지형이 울퉁불퉁해 국소 최솟값이 여럿 생긴다.

  2. 정답예측식이 파라미터에 대해 선형이기 때문이다.

    선형 식을 제곱하면 파라미터에 대한 2차식이 되고, 2차식은 볼록하다. 여기에 제곱 오차가 겹쳐야 그릇 모양이 나오므로 두 조건이 함께 필요하다.

  3. 데이터를 표준화해 모든 특성의 범위를 맞췄기 때문이다.

    표준화는 등고선을 원에 가깝게 만들어 수렴을 빠르게 할 뿐 볼록성 자체를 만들지 않는다. 표준화하지 않아도 선형 회귀의 비용은 여전히 볼록하다.

  4. 학습률을 충분히 작게 잡아 발산하지 않도록 했기 때문이다.

    학습률은 비용 지형 위를 어떻게 걷느냐를 정할 뿐 지형의 모양을 바꾸지 않는다. 볼록성은 데이터를 보기도 전에 모델의 구조에서 정해진다.

해설

비용 함수가 매끈한 그릇 모양인 것은 예측식이 파라미터에 대해 선형이기 때문이다. 선형 식을 제곱하면 파라미터에 대한 2차식이 되고 2차식은 볼록하다. 볼록 함수에서는 국소 최솟값이 곧 전역 최솟값이라 어느 지점에서 출발해 내려가든 같은 바닥에 도착하고, 최적화 알고리즘이 여기가 진짜 바닥인지 의심할 필요가 없다. 이 성질이 얼마나 큰 선물인지는 반대편을 보면 안다. 신경망처럼 비선형 모델에서는 같은 제곱 오차를 써도 비용 지형이 울퉁불퉁해져 국소 최솟값이 여럿 생기고, 어디서 출발하느냐에 따라 도착하는 바닥이 달라진다. 초기화 방법이 신경망에서 하이퍼파라미터로 다뤄지는 이유가 여기 있다.

이 내용 다시 읽기 →
분석과 판단판단
절댓값 함수는 x = 0에서 꺾여 왼쪽에서 다가가면 기울기가 -1, 오른쪽에서 다가가면 +1이다. 제곱 함수는 그 지점에서 기울기가 정확히 0이다.

이 차이가 학습에서 문제가 되는 이유는 무엇인가?

  1. MAE는 미분되지 않으므로 경사하강법으로 학습시킬 수 없다.

    꺾인 점 하나를 빼면 모든 곳에서 미분되고, 그 점에서도 서브그래디언트 같은 기법으로 값을 정해 쓸 수 있다. 불가능한 것이 아니라 다루기 번거로운 것이다.

  2. 정답미분값을 따라 파라미터를 옮기는데 그 기울기가 하나로 정해지지 않는다.

    잔차가 0에 가까워지는 지점에서 갱신 방향이 진동하며 불안정해진다. 매끄러운 제곱 함수는 잔차가 작아질수록 기울기도 함께 작아져 자연스럽게 잦아든다.

  3. 꺾인 지점이 국소 최솟값이 되어 학습이 그곳에 갇힌다.

    그 점은 절댓값 함수의 최솟값이자 우리가 도달하고 싶은 지점이다. 갇히는 것이 문제가 아니라 그 근처에서 움직임이 거칠어지는 것이 문제다.

  4. 미분값이 -1과 +1로 고정되어 잔차의 크기 정보가 사라진다.

    실제로 MAE의 기울기는 잔차의 부호만 담고 크기를 담지 않는다. 다만 그것은 이상치에 둔감해지는 성질의 원인이지 꺾임 때문에 생기는 문제와는 다르다.

해설

최적화 알고리즘은 비용 함수의 미분값을 따라 파라미터를 옮긴다. 기울기가 정의되지 않는 지점이 있으면 그 근처에서 갱신 방향이 진동하며 불안정해지고, 절댓값 함수의 꺾인 점이 바로 잔차가 0에 가까워지는 자리라 하필 수렴 직전에 그 일이 벌어진다. 제곱 함수는 어디서나 매끄럽고 잔차가 작아질수록 기울기도 함께 작아져 자연스럽게 잦아든다. MAE도 서브그래디언트 같은 기법으로 쓸 수 있으니 불가능한 것은 아니지만 MSE 쪽이 다루기 쉬운 것은 분명하다. 이 성질이 MSE를 기본값 자리에 올린 세 이유 가운데 하나이고, 나머지 둘은 큰 오차에 무거운 벌점을 준다는 것과 선형 모델에서 최솟값이 하나뿐이라는 것이다.

이 내용 다시 읽기 →
분석과 판단판단
잔차 분포를 보니 대부분 0.05 근처인데 스무 건 정도가 2를 넘는다. 확인해보니 그 스무 건은 입력 오류가 아니라 실제로 존재하는 거래다.

비용 함수를 어떻게 고를 것인가?

  1. 정답작은 잔차는 제곱으로, 큰 잔차는 절댓값으로 다루는 Huber가 맞는 자리다.

    실제 데이터이므로 지울 수 없고, 그대로 두면 제곱 벌점이 스무 건에 학습의 대부분을 쏟게 만든다. 임계 이상의 잔차에만 절댓값을 적용하면 이상치의 영향을 눌러두면서 미분 가능성도 유지된다.

  2. MSE로 두고 그 스무 건을 데이터에서 지운다.

    실제로 존재하는 거래이므로 지우면 모델이 현실의 일부를 설명하지 못하게 된다. 이상치를 지울지는 그 값의 정체가 정하는 것이고, 여기서는 지울 근거가 없다.

  3. MAE로 바꾸면 이상치 문제와 미분 문제가 함께 해결된다.

    이상치에는 둔감해지지만 미분 문제는 오히려 생긴다. 절댓값은 0에서 꺾이므로 수렴 직전에 갱신이 거칠어진다.

  4. 스무 건뿐이므로 어느 비용 함수를 써도 결과가 거의 같다.

    잔차 2는 제곱하면 4이고 0.05는 0.0025다. 스무 건의 기여분이 나머지 수백 건을 합친 것을 넘어설 수 있어 개수만으로 무시할 수 없다.

해설

이상치가 실제로 존재하는 값이라면 지우는 것은 답이 아니다. 그렇다고 제곱 벌점을 그대로 두면 소수의 큰 잔차가 학습의 대부분을 가져간다. Huber는 그 사이를 겨냥한다. 잔차가 작을 때는 제곱처럼 동작해 매끄러운 미분을 유지하고, 정해둔 임계를 넘으면 절댓값처럼 동작해 벌점이 선형으로만 늘어난다. 이상치의 영향을 눌러두면서 꺾임 문제도 피하는 절충이다. 대신 그 임계를 정해야 한다는 하이퍼파라미터가 하나 늘어난다. 실무 순서는 대체로 이렇다. MSE로 시작해 잔차 분포를 보고, 큰 잔차가 소수 섞여 있으면서 그것이 진짜 데이터라면 Huber나 MAE로 바꿔 성능을 비교한다.

이 내용 다시 읽기 →

비용 함수의 바닥까지 걸어 내려가는 경사하강법

원문 읽기 →
개념 확인구조

갱신식이 기울기를 더하지 않고 빼는 이유는 무엇인가?

  1. 기울기가 언제나 양수라서 빼야 왼쪽으로 갈 수 있기 때문이다.

    곡선의 왼쪽에 서 있으면 기울기가 음수다. 그때는 빼기가 곧 더하기가 되어 오른쪽으로 움직인다.

  2. 정답기울기가 양수면 그 방향으로 갈 때 비용이 오르므로 반대로 가야 한다.

    기울기가 양수라는 것은 파라미터를 키우면 비용이 커진다는 뜻이다. 비용을 줄이려면 반대로 가야 하고, 기울기가 음수면 뺄셈이 자연히 덧셈이 되어 곡면의 어느 쪽에 서 있든 부호가 알아서 방향을 잡아준다.

  3. 덧셈을 쓰면 파라미터가 음수가 될 수 없기 때문이다.

    부호는 기울기가 정하는 것이라 연산 방향과 무관하다. 어느 쪽을 쓰든 파라미터는 양수도 음수도 될 수 있다.

  4. 학습률이 양수여야 하므로 부호를 맞추기 위해서다.

    학습률은 보폭의 크기만 정하고 방향은 기울기의 부호가 정한다. 뺄셈은 부호 맞추기가 아니라 내리막을 고르는 규칙이다.

해설

기울기가 양수라는 것은 파라미터를 키우면 비용이 올라간다는 뜻이므로, 비용을 줄이려면 반대로 가야 한다. 기울기가 음수면 뺄셈이 곧 덧셈이 되어 오른쪽으로 움직이므로 곡면의 어느 쪽에 서 있든 부호가 알아서 방향을 잡아준다. 여기에 함께 붙는 성질이 하나 있다. 학습률은 처음부터 끝까지 고정인데도 바닥에 가까워질수록 보폭이 저절로 줄어든다. 경사가 완만해지면서 학습률 곱하기 기울기 값 자체가 작아지기 때문이고, 별도의 감속 장치 없이 바닥 근처에서 조심스러워지는 셈이다. 이 규칙이 단순한데도 살아남은 이유는 비용 함수의 전체 모양을 몰라도 현재 위치의 기울기 하나만으로 다음 걸음을 뗄 수 있다는 데 있다.

이 내용 다시 읽기 →
상황 적용구조
MSE를 파라미터로 편미분하면 두 식이 나온다. ∂J/∂w = (2/n)Σ(wxᵢ + b - yᵢ)·xᵢ ∂J/∂b = (2/n)Σ(wxᵢ + b - yᵢ) 두 식의 유일한 차이는 뒤에 곱해진 xᵢ다.

이 xᵢ 하나가 학습에서 만들어내는 결과는 무엇인가?

  1. w의 기울기가 언제나 b보다 크므로 w가 먼저 수렴한다.

    x가 0과 1 사이의 작은 값이라면 오히려 w 쪽 기울기가 더 작다. 크기 관계를 정하는 것은 입력값의 범위이지 식의 형태가 아니다.

  2. 정답x가 큰 데이터에서 생긴 오차일수록 w를 더 세게 흔든다.

    같은 크기의 잔차라도 x가 155인 지점에서 나온 것이 x가 60인 지점에서 나온 것보다 w의 기울기에 두 배 넘게 기여한다. 이 비대칭이 입력 스케일에 따라 두 기울기의 크기를 수십 배까지 벌려놓는다.

  3. b는 x에 의존하지 않으므로 입력 스케일과 무관하게 잘 학습된다.

    b의 기울기 자체는 x를 곱하지 않지만 학습률은 두 파라미터가 함께 쓴다. w가 발산하지 않도록 학습률을 작게 잡으면 b가 그 작은 보폭에 묶여 제자리걸음을 한다.

  4. x가 음수인 데이터가 있으면 갱신 방향이 뒤집혀 학습이 발산한다.

    부호가 뒤집히는 것은 그 데이터가 잔차를 줄이는 방향이 반대라는 뜻이라 정상적인 동작이다. 발산은 부호가 아니라 보폭의 크기가 만든다.

해설

두 편미분의 유일한 차이는 뒤에 곱해진 입력값이다. 합성함수의 미분을 적용하면 괄호 안을 w로 미분한 x가 곱해지고, b로 미분할 때는 b가 1이 되므로 아무것도 붙지 않는다. 그래서 x가 큰 데이터 포인트에서 생긴 오차일수록 w를 더 세게 흔든다. 이 비대칭이 곧 실제 문제로 나타난다. 면적 값이 60에서 155 사이라면 w의 기울기는 그 큰 숫자가 곱해진 값이고 b의 기울기는 그렇지 않으니, 두 기울기의 크기가 수십 배 차이 나는데 학습률은 하나뿐이다. 입력을 미리 비슷한 범위로 맞추는 전처리가 경사하강법에서 사실상 필수인 이유가 여기 있다.

이 내용 다시 읽기 →
상황 적용연결 문항진단
면적 60~155, 학습률 1e-5로 5,000번 돌린 결과다. 정규 방정식이 주는 정답은 w = 0.0380, b = -0.0818이다. epoch cost w b 0 16.648750 0.008920 0.000078 1000 0.003062 0.037320 0.000201 4000 0.003057 0.037324 -0.000179

비용이 0.003까지 떨어졌는데 b가 정답 근처에도 못 간 이유는 무엇인가?

  1. 정답w의 기울기에만 입력값이 곱해져 두 기울기의 크기가 수십 배 차이 나기 때문이다.

    w가 발산하지 않도록 학습률을 1e-5까지 낮추면 x가 곱해지지 않는 b 쪽은 한 걸음이 거의 0이 된다. 5,000번을 돌려도 b는 소수점 넷째 자리에서만 움직이고, 그 사이 w가 혼자 데이터를 맞추느라 0.0380이 아닌 0.0373에 자리 잡는다.

  2. 절편은 원래 학습되지 않는 값이고 데이터에서 자동으로 정해진다.

    절편도 갱신식을 통해 학습되는 파라미터다. 여기서 움직이지 않은 것은 학습 대상이 아니어서가 아니라 보폭이 사실상 0이기 때문이다.

  3. 5,000번이 부족하다. 반복을 열 배로 늘리면 b가 정답에 닿는다.

    1000회와 4000회 사이에 b가 0.0002에서 -0.0002로 움직였다. 이 속도로는 -0.0818까지 가는 데 수백만 번이 필요하다.

  4. 비용이 이미 최솟값에 도달했으므로 b의 값은 무엇이든 상관없다.

    0.003은 이 상태에서의 바닥일 뿐 진짜 최솟값이 아니다. 정규 방정식의 해에서는 비용이 0.00254까지 내려간다.

해설

w의 기울기에는 입력값이 곱해지고 b의 기울기에는 곱해지지 않는다. 면적이 60에서 155 사이라면 두 기울기의 크기가 수십 배 차이 나는데 학습률은 하나뿐이다. w가 발산하지 않도록 학습률을 낮추면 b 쪽은 한 걸음이 사실상 0이 되어 제자리걸음을 한다. 여기서 눈여겨볼 것은 비용이 0.003까지 떨어져 마치 수렴한 것처럼 보인다는 점이다. 절편이 거의 0에 묶인 채 기울기 혼자 데이터를 맞춘 상태라, 겉으로 드러나는 숫자만 보면 문제를 알아채기 어렵다. 해결은 입력을 표준화하는 것이다. 두 기울기의 크기가 맞아떨어지면 학습률 0.01로 1,000번만 돌려도 정규 방정식이 주는 해에 그대로 도달한다.

이 내용 다시 읽기 →
상황 적용진단
같은 데이터에 학습률만 바꿔 3,000번씩 돌렸다. lr = 2e-07 w 0.0373 b 0.0003 cost 0.003064 lr = 1e-05 w 0.0373 b -0.0001 cost 0.003059 lr = 1e-04 w nan b nan cost nan 마지막 설정은 첫 갱신에서 비용이 16.6에서 32.2로 뛰었다.

학습률 1e-4에서 nan이 나온 과정은 무엇인가?

  1. 학습률이 커서 부동소수점 곱셈에 오버플로가 생겼다.

    1e-4는 아주 작은 수라 곱셈 자체로 넘칠 일이 없다. 넘치는 것은 파라미터 값이고, 그것도 여러 번의 갱신이 쌓인 결과다.

  2. 정답바닥을 지나쳐 반대편으로 튕기고, 튕긴 자리가 더 가팔라 다음 걸음이 더 커진다.

    포물선에서 최솟값을 넘어서면 반대편은 경사가 더 가파르므로 기울기가 커지고 다음 보폭도 커진다. 이 데이터에서는 매 갱신마다 비용이 대략 두 배씩 불어나다가 부동소수점 범위를 넘어선다.

  3. 기울기가 0인 지점에 정확히 도달해 0으로 나누는 연산이 일어났다.

    갱신식에 나눗셈이 없다. 기울기가 0이면 갱신이 멈출 뿐 계산이 깨지지 않는다.

  4. 3,000번이라는 반복이 너무 많아 값이 누적된 것이다.

    수렴하는 학습률에서는 3,000번을 돌려도 값이 안정된다. 앞의 두 설정이 그 증거이고, 문제는 횟수가 아니라 한 걸음의 크기다.

해설

학습률이 너무 크면 바닥을 지나쳐 반대편 벽으로 튕겨 나간다. 튕긴 자리는 경사가 더 가파르니 다음 걸음은 더 크게 튕기고, 몇 번만 반복되면 비용이 무한대로 폭주해 부동소수점 범위를 넘어선다. 여기서는 첫 갱신부터 비용이 두 배 가까이 뛰는 것이 그 시작이다. 실무에서는 0.1, 0.01, 0.001처럼 10배씩 낮춰가며 비용 곡선이 매끄럽게 떨어지는 가장 큰 값을 고른다. 비용이 진동하거나 오히려 커지면 그 학습률은 너무 크다는 신호다. 앞의 두 학습률이 3,000번에서 사실상 같은 자리에 있는 것은 별개의 이유이므로 헷갈리지 않아야 한다. 둘 다 스케일 문제에 걸려 절편이 제자리이기 때문이다.

이 내용 다시 읽기 →
분석과 판단판단
데이터가 500만 건이다. 배치 경사하강법은 한 걸음을 떼는 데 500만 건을 전부 훑는다. 확률적 경사하강법은 1건만 보고 갱신한다.

실무 표준이 32에서 128건짜리 미니배치인 이유는 무엇인가?

  1. 미니배치가 배치보다 기울기 방향이 더 정확하기 때문이다.

    방향의 정확도는 전체를 훑는 배치 쪽이 낫다. 미니배치는 그 정확도를 조금 내주고 갱신 횟수를 얻는 거래다.

  2. 정답방향은 조금 부정확해도 같은 시간에 갱신 횟수가 훨씬 많아 결과적으로 빨리 내려간다.

    500만 건을 한 번 훑는 시간에 미니배치는 수만 번 갱신한다. 흔들리는 방향이 얕은 국소 최솟값을 빠져나오는 데 도움이 되기도 해서, 속도와 안정성의 절충 지점에 놓인다.

  3. 1건씩 처리하는 방식은 수렴이 보장되지 않아 쓸 수 없기 때문이다.

    1건짜리도 조건이 맞으면 수렴한다. 문제는 수렴 가능성이 아니라 방향이 너무 흔들려 비효율적이라는 데 있다.

  4. 메모리에 한 번에 올릴 수 있는 최대 크기가 128건이기 때문이다.

    요즘 하드웨어는 훨씬 큰 배치도 올린다. 32에서 128이라는 범위는 메모리 한계가 아니라 속도와 안정성이 맞물리는 경험적 지점이다.

해설

미니배치는 데이터를 섞어 작은 묶음으로 자르고 묶음 하나마다 파라미터를 한 번씩 갱신한다. 기울기 방향은 전체를 훑을 때보다 부정확하지만 같은 시간에 갱신 횟수가 훨씬 많아져 결과적으로 더 빨리 내려간다. 흔들리는 방향이 얕은 국소 최솟값을 빠져나오는 데 도움이 되기도 한다. 용어 하나를 짚어둘 만하다. SGD라는 이름은 엄밀히 1건짜리 방식을 가리키지만 실무에서는 미니배치까지 묶어 통칭으로 쓴다. 라이브러리의 SGD 옵티마이저도 배치 크기가 얼마인지는 모르고 넘겨받은 기울기를 갱신식에 그대로 넣을 뿐이라, 배치 크기는 옵티마이저가 아니라 데이터 로더 쪽에서 정해진다.

이 내용 다시 읽기 →
분석과 판단연결 문항함정
앞의 학습에 직전 epoch과의 비용 차이가 1e-7보다 작으면 멈추는 조기 종료를 걸었다. 수십 epoch 만에 조건이 충족되어 학습이 끝났다.

이 종료 신호를 그대로 믿어도 되는가?

  1. 믿어도 된다. 비용이 더 이상 변하지 않는다는 것이 곧 수렴의 정의다.

    수렴은 최솟값에 도달했다는 뜻이지 값이 안 변한다는 뜻이 아니다. 파라미터 하나가 사실상 얼어붙어 있어도 전체 비용은 평평해 보인다.

  2. 기울기 크기를 기준으로 바꾸면 이 문제가 사라진다.

    b의 기울기 자체는 0이 아니고 다만 곱해지는 보폭이 작을 뿐이다. 기준을 바꿔도 임계값을 데이터 스케일에 맞춰야 하므로 손만 더 간다.

  3. 최대 반복 횟수를 늘리면 해결된다. 지금은 너무 일찍 끊겼다.

    조기 종료를 풀고 5,000번을 다 돌려도 절편은 소수점 넷째 자리에서만 움직였다. 횟수로는 메워지지 않는 간격이다.

  4. 정답믿을 수 없다. 한 파라미터가 거의 움직이지 않아도 비용은 평평해 보인다.

    절편의 보폭이 사실상 0이라 비용 곡선이 정체된 것이지 최솟값에 닿은 것이 아니다. 정규 방정식의 해에서는 비용이 0.00254까지 내려가므로 0.003은 아직 바닥이 아니다.

해설

비용 변화량으로 조기 종료를 거는 것은 흔하고 대체로 잘 동작하지만, 비용이 평평해지는 원인이 하나가 아니라는 점이 함정이다. 진짜 최솟값에 닿아도 평평해지고, 어떤 파라미터의 보폭이 사실상 0이 되어도 평평해진다. 두 경우가 같은 신호를 내므로 비용 곡선만 보고는 구분할 수 없다. 여기서는 정규 방정식이 알려주는 최솟값 0.00254와 견주면 0.003이 아직 바닥이 아님이 드러나지만, 실전에서는 그 기준값을 모르는 경우가 대부분이다. 그래서 조기 종료를 걸 때 파라미터가 실제로 움직이고 있는지 함께 찍어보는 것이 안전하고, 애초에 입력을 표준화해 이런 정체가 생기지 않게 만드는 편이 근본적이다.

이 내용 다시 읽기 →

변수가 늘어나면 달라지는 것들, 다중 선형 회귀

원문 읽기 →
개념 확인구조
면적(평), 방 수, 층수로 가격(억)을 예측하는 모델의 계수가 [0.0247, 0.4909, 0.0262]이고 절편은 1.0321이다.

방 수의 계수 0.4909를 어떻게 읽어야 하는가?

  1. 방 수가 가격 변동의 49%를 설명한다.

    계수는 설명 비율이 아니라 y의 단위로 표현된 증가량이다. 설명 비율은 R² 계열의 값이고 개별 계수에서 바로 읽히지 않는다.

  2. 정답면적과 층수를 고정했을 때 방이 하나 늘면 가격이 약 4,900만 원 오른다.

    다중 회귀의 각 계수는 나머지 변수를 고정한 상태에서 그 변수만 1 늘렸을 때의 효과다. 면적이 1평 늘 때의 상승분과 방이 하나 늘 때의 상승분을 따로 떼어 볼 수 있다는 것이 단순 회귀와 다른 점이다.

  3. 방 수만 따로 회귀했을 때 나오는 기울기와 같은 값이다.

    혼자 회귀하면 면적과 함께 움직이는 부분까지 방 수의 몫으로 계산되어 값이 달라진다. 다중 회귀의 계수는 다른 변수가 설명하고 남은 부분에 대한 기여다.

  4. 방 수가 세 변수 중 가장 중요하다는 뜻이다.

    계수의 크기만으로는 중요도를 비교할 수 없다. 면적은 42에서 156까지 움직이고 방 수는 1에서 5까지밖에 못 움직이므로 단위를 맞춰야 순서를 말할 수 있다.

해설

다중 회귀의 각 계수는 나머지 변수를 고정한 상태에서 그 변수만 1 늘렸을 때 예측이 얼마나 변하는지를 뜻한다. 이 조건이 붙어 있어서 면적의 효과와 방 수의 효과를 따로 떼어 볼 수 있고, 그것이 변수를 여러 개 넣는 이유이기도 하다. 여기서 곧장 주의점이 두 가지 나온다. 계수를 단독 회귀의 기울기와 같다고 보면 안 된다. 다른 변수와 함께 움직이는 부분은 이미 그쪽으로 갔기 때문이다. 그리고 계수의 크기만으로 중요도를 비교해서도 안 된다. 단위가 제각각이라 값의 범위가 큰 변수일수록 계수가 작게 나오기 때문이다.

이 내용 다시 읽기 →
상황 적용진단
면적을 평으로 넣은 열 옆에 같은 면적을 m²로 환산한 열을 하나 더 붙였다. 1평은 3.3058m²다. 붙이기 전 면적(평) 계수 0.025 붙인 뒤 면적(평) 계수 -1.492, 면적(m²) 계수 0.459

면적 계수가 음수로 뒤집힌 것을 어떻게 읽어야 하는가?

  1. 면적이 넓을수록 가격이 떨어지는 관계가 데이터에 실제로 있다.

    붙이기 전에는 계수가 양수였고 데이터는 그대로다. 관계가 바뀐 것이 아니라 같은 정보를 두 열이 나눠 갖게 된 것이다.

  2. m² 열의 계수가 잘못 추정됐으므로 그 열만 다시 계산해야 한다.

    두 계수 중 어느 쪽이 틀렸다고 말할 수 없다. 무한히 많은 조합이 같은 예측을 내므로 그중 하나가 뽑힌 것뿐이다.

  3. 면적을 m²로도 넣어 단위가 섞였으므로 하나로 통일하면 부호가 돌아온다.

    결과적으로 맞는 처방이지만 이유가 다르다. 단위가 섞여서가 아니라 두 열이 같은 정보를 담고 있어서 생긴 일이다.

  4. 정답두 열이 같은 정보를 나눠 가진 것이다. 합치면 원래 값 0.025로 돌아온다.

    면적이 1평 늘면 m² 열도 3.3058 늘어나므로 실제 효과는 -1.492 + 0.459 × 3.3058 = 0.025다. 계수 하나만 떼어 읽으면 정반대의 결론에 이르지만 합치면 원래 값이 그대로 나온다.

해설

두 열이 정확히 비례하면 XᵀX의 행렬식이 0이라 역행렬이 없고, 같은 예측을 내는 계수 조합이 무한히 많아 해가 하나로 정해지지 않는다. 여기서 계산이 된 것은 m²를 반올림하면서 미세한 차이가 남은 덕분인데, 그 차이가 해를 하나로 정해주기는 해도 안정시키지는 못한다. 타깃에 작은 잡음을 얹고 다시 풀면 겹친 두 열의 계수만 크게 흩어지고 겹치지 않은 방 수와 층수는 제자리에 머문다. 이 상태를 다중공선성이라 한다. 요점은 무너진 것이 예측이 아니라 계수 해석이라는 데 있다. 두 계수를 합치면 원래 효과가 그대로 나오고 예측 성능도 멀쩡하다.

이 내용 다시 읽기 →
상황 적용구조
print(vif(X))    # [1.06  1.01  1.05]
print(vif(X2))   # [15206498.59  1.14  1.08  15206537.23]

# VIF_j = 1 / (1 - R_j²),  R_j²는 x_j를 나머지 변수로 회귀했을 때의 결정계수

VIF가 1,500만을 넘는 것은 무엇을 뜻하는가?

  1. 정답그 변수를 나머지 변수로 거의 완벽하게 예측할 수 있다는 뜻이다.

    VIF가 1/(1-R²)이므로 1,500만이 되려면 R²가 1에서 소수점 여덟째 자리쯤에서만 떨어져 있어야 한다. 면적 두 열이 서로를 거의 완전히 설명하므로 각자 고유하게 기여하는 정보가 사실상 없다.

  2. 그 변수가 타깃을 매우 잘 설명한다는 뜻이다.

    VIF의 회귀에는 타깃이 들어가지 않는다. 오직 특성끼리 서로를 얼마나 설명하는지만 잰다.

  3. 그 변수의 분산이 다른 변수보다 1,500만 배 크다는 뜻이다.

    이름에 분산이 들어가지만 원래 값의 분산이 아니라 계수 추정의 분산이 몇 배로 부풀려지는지를 뜻한다. 데이터 자체의 흩어짐과는 다른 이야기다.

  4. 그 변수를 반드시 제거해야 모델이 학습된다는 뜻이다.

    학습은 되고 예측도 멀쩡하다. 무너지는 것은 계수 해석이므로, 지우는 것 말고 규제를 거는 선택지도 있다.

해설

VIF는 변수 하나를 나머지 변수들로 회귀했을 때의 결정계수로 정의된다. 다른 변수들로 그 변수가 잘 설명될수록 분모가 0에 가까워져 값이 폭발하고, 보통 10을 넘으면 의심하고 들여다본다. 여기서 1,500만이 나온 것은 면적 두 열이 서로를 거의 완전히 설명한다는 뜻이다. 겹치지 않은 방 수와 층수는 1 근처에 머물러 대비가 뚜렷하다. 대처는 두 갈래다. 겹친 열 하나를 지우는 것이 가장 깔끔하고, 지우기 아깝다면 가중치 크기 자체에 벌점을 거는 규제를 쓴다. 표준화한 데이터에 Ridge를 걸면 두 열의 계수가 고르게 나뉘고 부호가 뒤집히는 일도 사라진다.

이 내용 다시 읽기 →
상황 적용진단
면적은 42에서 156, 방 수는 1에서 5, 층수는 2에서 23 사이다. 학습률 0.00001로 경사하강법을 5,000번 돌린 결과다. 비용 0.636 (정규 방정식의 최적값은 0.069) 방 수 계수 0.127 (최적해는 0.491)

5,000번을 돌려도 최적해에 닿지 못한 이유는 무엇인가?

  1. 학습률이 너무 작으므로 그 값만 키우면 해결된다.

    학습률을 키우면 기울기가 큰 면적 쪽이 먼저 발산한다. 변수마다 필요한 보폭이 다른데 손잡이는 하나뿐이라는 것이 문제의 핵심이다.

  2. 5,000번은 부족한 횟수이므로 반복을 열 배로 늘려야 한다.

    표에서 500회와 5,000회의 비용이 0.969와 0.636으로 아주 느리게만 내려간다. 열 배로 늘려도 최적값 0.069에는 닿지 못한다.

  3. 정답변수마다 값의 범위가 달라 기울기 크기가 크게 차이 나는데 학습률은 하나뿐이다.

    값이 42에서 156인 면적 열은 기울기가 크고 1에서 5인 방 수 열은 작다. 면적에 맞춰 학습률을 정하면 방 수가 거의 안 움직이고, 방 수에 맞추면 면적이 발산한다. 그래서 방 수 계수만 0.127에서 멈춰 있다.

  4. 경사하강법은 다변수 문제에서 정규 방정식과 다른 해로 수렴한다.

    비용 함수가 볼록해 최솟값이 하나뿐이므로 두 방법이 같은 해로 간다. 여기서는 아직 도착하지 못했을 뿐이다.

해설

경사하강법의 갱신량은 각 열의 값 크기에 비례한다. 면적 열은 값이 수십에서 백 단위라 기울기가 크고 방 수 열은 한 자리 수라 작은데, 학습률은 전 변수에 하나만 적용된다. 그래서 면적에 맞추면 방 수가 거의 움직이지 않고 방 수에 맞추면 면적이 발산한다. 비용 함수의 등고선으로 보면 가늘고 긴 타원이 되어 경사하강법이 골짜기를 가로지르며 지그재그로 내려간다. 해결은 모든 변수를 비슷한 범위로 맞추는 것이다. 표준화한 뒤에는 학습률을 1,000배 키울 수 있고 300회 부근에서 수렴한다. 스케일링 없이 5,000번을 돌려도 닿지 못한 지점이다.

이 내용 다시 읽기 →
분석과 판단함정
같은 모델의 계수를 두 단위로 읽었다. 원래 단위 면적 0.025 방 수 0.491 층수 0.026 표준화 단위 면적 0.856 방 수 0.645 층수 0.178 면적은 42에서 156, 방 수는 1에서 5까지 움직인다.

두 단위에서 중요도 순서가 뒤집히는 이유는 무엇인가?

  1. 표준화 과정에서 정보가 손실되어 순서가 바뀐 것이다.

    표준화는 평균을 빼고 표준편차로 나누는 가역 변환이라 정보가 사라지지 않는다. 실제로 표준화 단위 계수를 표준편차로 나누면 원래 계수가 그대로 복원된다.

  2. 정답원래 단위 계수는 1 단위 변화의 효과라 각 변수가 실제로 움직이는 폭을 반영하지 못한다.

    면적 1평과 방 하나는 같은 무게의 변화가 아니다. 면적은 100 넘게 움직일 수 있지만 방 수는 4밖에 못 움직이므로, 각자 표준편차 1만큼 움직였을 때로 환산해야 나란히 놓을 수 있다.

  3. 두 계수는 서로 다른 모델에서 나온 값이라 애초에 견줄 수 없다.

    같은 모델의 같은 해를 두 단위로 표현한 것이다. 표준화 단위 계수를 표준편차로 나누면 원래 계수가 소수 넷째 자리까지 그대로 나온다.

  4. 표준화하면 모든 계수가 0과 1 사이로 정규화되어 순위가 압축되기 때문이다.

    표준화 계수가 1을 넘는 경우도 흔하다. 여기서 값이 1 아래인 것은 우연이고, 정규화 때문에 순위가 바뀌는 것도 아니다.

해설

원래 단위 계수만 보면 방 수가 면적의 20배라 압도적으로 중요해 보인다. 그런데 면적은 42에서 156까지 움직이고 방 수는 1에서 5까지밖에 못 움직인다. 1 단위 변화의 효과를 나란히 놓는 것은 서로 다른 크기의 자를 같은 눈금으로 읽는 것과 같다. 각자 표준편차 1만큼 움직였을 때의 효과로 환산하면 면적이 0.856으로 방 수의 0.645를 앞선다. 같은 모델의 같은 해인데 결론이 뒤집히는 것이다. 그래서 계수로 중요도를 이야기하려면 어느 단위에서 나온 숫자인지를 반드시 확인해야 하고, 단위가 제각각인 계수를 크기순으로 늘어놓는 표는 그 자체로 오해를 만든다.

이 내용 다시 읽기 →
분석과 판단판단
면적을 평과 m²로 중복해 넣은 모델의 R²가 0.9508이다. 중복 없이 세 변수만 쓴 모델의 R²는 0.9506이다. 그런데 중복 모델의 면적 계수는 -1.492이고, 타깃에 작은 잡음을 얹어 다시 풀 때마다 -2.29에서 -0.86 사이를 오간다.

이 상태에서 실제로 무너진 것은 무엇인가?

  1. 예측 성능이다. R² 차이 0.0002가 그 손실을 보여준다.

    0.0002는 사실상 같은 값이다. 겹친 열을 넣어도 예측은 그대로라는 것이 오히려 이 현상의 특징이다.

  2. 학습의 수렴이다. 겹친 열 때문에 최적화가 끝나지 않는다.

    정규 방정식은 반복 없이 한 번에 해를 내놓았다. 수렴이 아니라 그 해가 하나로 정해지지 않는다는 것이 문제다.

  3. 데이터의 무결성이다. 같은 정보를 두 번 넣은 것 자체가 오류다.

    중복 열이 바람직하지는 않지만 데이터가 잘못된 것은 아니다. 두 열 모두 정확한 값이고, 문제는 그 둘로 계수를 나누는 방식이 정해지지 않는다는 데 있다.

  4. 정답계수 해석이다. 예측은 멀쩡한데 각 계수가 데이터의 미세한 흔들림에 끌려다닌다.

    같은 예측을 내는 계수 조합이 무한히 많으므로 그중 어느 것이 뽑히느냐가 잡음에 좌우된다. 예측만 필요하다면 그냥 둬도 되지만, 계수를 근거로 의사결정을 한다면 그 근거가 사라진 상태다.

해설

다중공선성에서 무너지는 것은 예측이 아니라 계수 해석이다. 겹친 두 열이 서로를 상쇄하며 같은 예측을 만들어내므로 R²는 거의 그대로이고, 대신 그 상쇄를 어느 비율로 나눌지가 정해지지 않아 계수가 데이터의 미세한 흔들림에 끌려다닌다. 여기서 실무적 판단이 갈린다. 예측값만 쓰는 시스템이라면 겹친 열을 그냥 둬도 큰 문제가 없다. 반면 계수를 근거로 정책을 정하거나 특성 중요도를 보고한다면 그 근거가 사라진 상태이므로 열을 정리하거나 규제를 걸어야 한다. VIF로 먼저 진단하고, 지울 수 없다면 Ridge로 계수를 고르게 나눠주는 순서가 실무에서 흔하다.

이 내용 다시 읽기 →

과적합을 막는 규제, Ridge와 Lasso는 무엇이 다른가

원문 읽기 →
개념 확인구조

가중치 크기를 누르는 것이 과적합을 막는 처방이 되는 이유는 무엇인가?

  1. 가중치가 작으면 계산량이 줄어 모델이 단순해지기 때문이다.

    가중치의 크기와 계산량은 무관하다. 값이 크든 작든 곱셈과 덧셈의 횟수는 같다.

  2. 가중치를 줄이면 사용하는 변수의 개수가 줄어들기 때문이다.

    개수를 줄이는 것은 L1 패널티가 부수적으로 만들어내는 효과이고, L2는 개수를 그대로 둔 채 크기만 줄인다. 그런데도 과적합은 억제된다.

  3. 정답가중치가 크면 입력이 조금 흔들릴 때 출력이 크게 튀어 노이즈에 민감해지기 때문이다.

    데이터 수보다 변수가 많아지면 훈련 데이터를 정확히 맞추는 해가 무한히 많아지고 그중에는 가중치가 극단적으로 큰 것도 섞여 있다. 그런 해는 점 사이에서 크게 요동쳐 새 데이터가 그 사이에 떨어지면 예측이 크게 빗나간다.

  4. 가중치가 크면 경사하강법이 발산해 학습 자체가 끝나지 않기 때문이다.

    발산은 학습률이 만드는 문제이고 과적합과 다른 이야기다. 과적합된 모델은 오히려 학습이 잘 끝난 상태다.

해설

변수가 늘어 데이터 수보다 많아지면 훈련 데이터를 정확히 맞추는 해가 무한히 많아지고, 그중에는 가중치가 극단적으로 큰 해도 섞여 있다. 가중치가 크다는 것은 입력이 조금 흔들릴 때 출력이 크게 튄다는 뜻이라 노이즈에 민감해지고, 그것이 과적합의 메커니즘이다. 차수 15 다항식이 점 하나하나를 쫓아가면서 점과 점 사이에서 위아래로 크게 요동치는 것이 그 모습이다. 처방도 그만큼 단순하다. 가중치를 작게 유지하면 모델이 단순해지는 대가로 훈련 오차는 조금 올라가지만 데이터가 조금 바뀌어도 결과가 덜 흔들린다. 둘의 합이 줄어드는 구간이 있고 규제는 그 구간을 노린다.

이 내용 다시 읽기 →
상황 적용구조
for _ in range(1000):
    error = X_scaled @ w + b - y
    w -= lr * ((2/m) * (X_scaled.T @ error) + 2 * lam * w)   # 규제 항이 붙는다
    b -= lr * (2/m) * np.sum(error)                          # b에는 붙지 않는다

편향 b에는 규제를 걸지 않는 이유는 무엇인가?

  1. 정답b는 출력 전체를 위아래로 옮기는 항이라 규제하면 타깃 평균만 0쪽으로 끌려간다.

    규제의 목적은 특성과 출력 사이 관계의 복잡도를 낮추는 것이지 출력의 평균 수준을 낮추는 것이 아니다. b까지 누르면 타깃의 평균이 0에서 멀수록 손해만 본다.

  2. b는 입력과 곱해지지 않아 값이 항상 작으므로 규제할 필요가 없다.

    b의 크기는 타깃의 평균 수준이 정한다. 집값을 억 단위로 예측하면 b가 5 근처가 되고, 원 단위로 바꾸면 5억이 된다.

  3. b를 규제하면 경사하강법의 갱신식이 정의되지 않기 때문이다.

    b에 대한 패널티의 미분도 정상적으로 계산된다. 걸지 않는 것은 계산이 안 돼서가 아니라 그럴 이유가 없어서다.

  4. b는 학습되는 파라미터가 아니라 데이터에서 직접 계산되는 상수이기 때문이다.

    b도 갱신식을 통해 학습된다. 코드에서 b를 갱신하는 줄이 따로 있다는 것이 그 증거다.

해설

편향은 입력과 무관하게 출력 전체를 위아래로 옮기는 항이다. 규제의 목적은 특성과 출력 사이 관계의 복잡도를 낮추는 것이지 출력의 평균 수준을 0쪽으로 끌어내리는 것이 아니므로, 편향까지 규제하면 타깃의 평균이 0에서 멀수록 손해만 본다. 집값을 억 단위로 예측하는 모델의 편향은 5 근처인데 그 값을 0쪽으로 밀 이유가 없다. 이 원칙은 라이브러리에도 반영되어 있어 sklearn의 Ridge와 Lasso 모두 절편을 패널티에서 제외한다. 같은 이유로 신경망에서도 가중치 감쇠를 걸 때 편향 파라미터는 대상에서 빼는 것이 관례다.

이 내용 다시 읽기 →
상황 적용진단
데이터 20건에 같은 규제를 두 방식으로 걸었다. 직접 구현 (lam=0.1) w = [0.7818, 0.5918, 0.1767] sklearn Ridge(alpha=1.0) w = [0.8169, 0.6173, 0.1775] 직접 구현은 오차를 데이터 수로 나눈 MSE 형태를 쓰고, sklearn은 오차 제곱합을 그대로 쓴다.

두 결과가 다른 이유와 맞추는 방법은 무엇인가?

  1. sklearn이 절편까지 규제해서 생긴 차이다. fit_intercept를 끄면 같아진다.

    sklearn도 절편은 규제하지 않는다. 절편을 끄면 오히려 모델의 형태 자체가 달라져 계수가 더 벌어진다.

  2. sklearn은 경사하강법이 아니라 닫힌 해를 쓰므로 수렴 오차만큼 다르다.

    직접 구현도 1,000회면 충분히 수렴한다. 차이가 소수 둘째 자리에서 나는 것은 수렴 오차로 설명되지 않는다.

  3. 정답규제 스케일이 다르다. lam은 alpha를 데이터 수로 나눈 0.05여야 한다.

    sklearn은 오차 제곱합에 alpha를 곱한 패널티를 더하고 직접 구현은 그 식의 양변을 데이터 수로 나눈 형태를 쓴다. 그래서 대응 관계가 lam = alpha / m이 되고, 0.05를 넣으면 두 결과가 소수 넷째 자리까지 일치한다.

  4. 표준화를 sklearn 내부에서 한 번 더 해서 생긴 차이다.

    Ridge는 입력을 건드리지 않는다. 두 코드 모두 미리 표준화한 같은 데이터를 받았다.

해설

sklearn의 Ridge는 오차 제곱합을 데이터 수로 나누지 않고 여기에 alpha를 곱한 패널티를 더한 값을 최소화한다. 반면 직접 구현한 코드는 오차를 MSE 형태로 썼으므로 같은 문제를 표현하려면 양변을 데이터 수로 나눠야 하고, 그 결과 lam이 alpha를 데이터 수로 나눈 값이 된다. 20건이면 alpha 1.0에 대응하는 값이 0.05이고 그 값을 넣으면 두 결과가 정확히 일치한다. 이 어긋남이 실무에서 중요한 이유는 규제 강도가 데이터 수에 따라 다르게 해석된다는 데 있다. 논문이나 다른 라이브러리에서 본 alpha 값을 그대로 가져오면 데이터 크기가 다를 때 전혀 다른 세기의 규제가 걸리므로, 값을 옮기기 전에 각 구현이 어떤 식을 최소화하는지 확인해야 한다.

이 내용 다시 읽기 →
상황 적용함정
면적은 42에서 156, 방 수는 1에서 5 사이다. 표준화를 건너뛰고 원래 단위 그대로 Ridge를 걸었다. 원래 단위 계수는 면적 0.025, 방 수 0.491이다.

표준화를 건너뛰면 무엇이 잘못되는가?

  1. Ridge는 표준화된 입력만 받으므로 예외가 발생한다.

    어떤 입력이든 정상적으로 학습된다. 문제는 계산이 되느냐가 아니라 그 결과가 의도한 규제냐다.

  2. 정답같은 λ가 두 변수에 전혀 다른 세기로 걸린다.

    패널티는 계수의 크기에 값을 매기는데 계수의 크기는 변수의 단위가 정한다. 값의 범위가 좁은 방 수는 계수가 크게 나와 강하게 눌리고, 범위가 넓은 면적은 계수가 작아 거의 규제받지 않는다.

  3. 규제 항이 없는 것과 같아져 규제가 아무 효과도 내지 못한다.

    효과가 없는 것이 아니라 변수마다 다르게 걸린다. 어떤 계수는 심하게 눌리고 어떤 계수는 거의 그대로 남는다.

  4. 표준화 없이도 결과는 같고 계수의 해석만 어려워진다.

    규제가 없다면 그 말이 맞지만 규제가 있으면 결과 자체가 달라진다. 패널티가 단위에 의존하므로 단위를 바꾸면 최적해가 옮겨간다.

해설

규제는 가중치의 크기에 값을 매기는데 가중치의 크기는 변수의 단위에 따라 달라진다. 값의 범위가 넓은 면적은 계수가 작게 나오고 범위가 좁은 방 수는 계수가 크게 나오므로, 같은 강도의 패널티가 두 변수에 전혀 다른 세기로 걸린다. 결과적으로 방 수만 집중적으로 눌리고 면적은 거의 규제받지 않는다. 이것은 우리가 의도한 규제가 아니라 단위가 우연히 만들어낸 규제다. 그래서 규제를 쓰는 모델에서 표준화는 선택이 아니라 전제이고, Pipeline으로 스케일러와 모델을 묶어두면 이 순서를 놓칠 일이 없다. 반대로 규제 없는 선형 회귀나 트리 계열에서는 표준화가 결과를 바꾸지 않는다는 점도 함께 알아둘 만하다.

이 내용 다시 읽기 →
분석과 판단구조
패널티가 붙은 최소화는 예산 제약이 걸린 최소화로 바꿔 쓸 수 있다. 변수가 둘일 때 제약 영역의 모양은 이렇다. Ridge w₁² + w₂² ≤ t 원점을 중심으로 한 원 Lasso |w₁| + |w₂| ≤ t 축 위에 꼭짓점이 놓인 마름모 해는 MSE 등고선이 커지다가 이 영역에 처음 닿는 지점이다.

L1만 계수를 정확히 0으로 만드는 이유는 무엇인가?

  1. 절댓값의 미분이 0에서 정의되지 않아 그 지점에 해가 고정되기 때문이다.

    미분 불가능성은 최적화를 까다롭게 만드는 성질이고, 해가 축으로 끌리는 것은 제약 영역의 기하에서 나온다. 같은 뾰족함이라도 마름모가 아니라 다른 모양이면 결과가 달라진다.

  2. 절댓값 패널티가 제곱보다 강해 계수를 끝까지 밀어내기 때문이다.

    계수가 1보다 작을 때는 절댓값 쪽 패널티가 오히려 크지만, 강도만으로는 왜 하필 축 위에서 멈추는지가 설명되지 않는다.

  3. 정답마름모의 뾰족한 꼭짓점이 축 위에 있어 등고선이 대개 그곳에 먼저 닿기 때문이다.

    원은 어디를 잘라도 매끄러워 등고선이 축이 아닌 자리에 닿고 두 계수가 모두 살아남는다. 마름모는 축 위에 꼭짓점이 튀어나와 있어 그곳에 먼저 부딪히고, 그 점은 나머지 좌표가 0인 점이다.

  4. L1은 계수의 부호를 무시하므로 음수 계수가 0으로 접히기 때문이다.

    절댓값은 부호를 무시하지만 그것 때문에 값이 0이 되지는 않는다. 음수 계수도 크기를 유지한 채 그대로 남을 수 있다.

해설

Ridge와 Lasso를 가르는 것은 패널티 식의 사소한 차이가 아니라 제약 영역의 모양이다. 원은 어디를 잘라도 매끄러워서 등고선이 축이 아닌 자리에 닿고 두 계수가 모두 0이 아닌 값으로 남는다. 마름모는 축 위에 뾰족한 꼭짓점이 있고 등고선이 커지다가 제일 먼저 부딪히는 곳이 대개 그 꼭짓점인데, 꼭짓점은 나머지 좌표가 0인 점이다. 차원이 올라갈수록 꼭짓점과 모서리가 늘어나 이 효과는 더 강해진다. 그래서 Lasso가 변수를 골라내는 능력은 따로 붙인 기능이 아니라 절댓값이라는 함수 모양에서 자동으로 따라 나온 것이고, 같은 이유로 L1 패널티는 선형 회귀 바깥에서도 계수를 희소하게 만들고 싶은 자리마다 쓰인다.

이 내용 다시 읽기 →
분석과 판단진단
면적, 방 수, 층수 세 변수로 집값을 예측하는 데이터에 교차 검증으로 규제 강도를 골랐다. RidgeCV가 고른 alpha 0.3907 LassoCV가 고른 alpha 0.0001

LassoCV가 거의 0에 가까운 값을 고른 것에서 무엇을 읽어야 하는가?

  1. 정답이 데이터에는 지울 변수가 없어 Lasso의 장기가 발휘되지 않는다.

    alpha를 0에 가깝게 두는 것은 규제를 사실상 끄는 선택이고, 교차 검증이 그렇게 판단했다는 것은 어떤 변수도 0으로 보낼 이유가 없다는 뜻이다. 쓸모없는 변수가 섞인 데이터라면 훨씬 큰 값이 뽑힌다.

  2. LassoCV의 탐색 범위가 잘못 설정되어 하한에 걸린 것이다.

    하한에 걸렸다면 범위를 더 낮춰봐야 알 수 있지만, 이미 1e-4는 규제가 사실상 없는 수준이라 더 낮춰도 결과가 달라지지 않는다.

  3. Lasso가 이 데이터에 수렴하지 못해 기본값이 남은 것이다.

    수렴하지 못하면 경고가 나오고 계수도 불안정해진다. 여기서는 교차 검증이 여러 값을 시도한 끝에 고른 결과다.

  4. Ridge의 0.3907과 크게 달라 둘 중 하나의 계산이 잘못됐다.

    두 방법의 alpha는 서로 다른 패널티에 붙는 계수라 애초에 같은 자로 잴 수 없다. 값의 차이 자체는 이상한 일이 아니다.

해설

교차 검증이 고른 규제 강도는 그 자체로 데이터에 대한 정보를 담고 있다. Lasso의 alpha가 거의 0으로 뽑혔다는 것은 어떤 변수도 0으로 보낼 이유가 없다는 뜻이고, 실제로 이 데이터는 면적과 방 수와 층수가 모두 유의미해서 지울 것이 없다. 쓸모없는 변수가 섞인 데이터라면 훨씬 큰 값이 뽑히고 그와 함께 계수 몇 개가 0으로 떨어진다. 여기서 실무적 판단이 하나 나온다. 변수 선택이 목적이라면 Lasso를 쓰기 전에 그럴 만한 변수가 있는지를 먼저 봐야 하고, 없다면 Ridge 쪽이 계수를 고르게 유지해 해석에도 유리하다. 상관된 변수 그룹이 있다면 Lasso가 그중 하나만 임의로 남기므로 ElasticNet이 더 안정적인 선택이 된다.

이 내용 다시 읽기 →

이 페이지는 문항 품질을 점검하는 용도로도 씁니다. 한 화면에서 전부 훑어야 중복된 문항, 쏠린 난이도, 소거법으로 풀리는 선택지가 보입니다.

Thank You for Visiting My Blog, Have a Good Day 😆