본 글은 학교 '머신러닝' 수업을 들으며 공부한 내용을, 저의 말로 바꿔서 남에게 설명해주듯이 쓰는 글입니다.
다시 한번 복습하는 과정에서 Coursera Andrew Ng 교수님의 강의를 일부 수강하였고, 인터넷 검색 등을 통해 내용을 보충하였습니다.
너무 쉬운 개념들은 따로 정리하지 않았습니다. 따라서 해당 글에는 적히지 않은 개념들이 일부 있을 수 있습니다.
본 글은 Andrew Ng 교수님의 'machine learning' 수업 강의 노트를 일부 사용하였습니다.
본 글에 사용된 강의노트 사진들 대부분의 저작권은 'DeepLearning.AI'에 귀속되어 있음을 밝히며,
본 글은 'DeepLearning.AI'의 'Copyright rights'에 따라 수익 창출을 하지 않고,
또한 해당 정책에 따라 '개인 공부 및 정보 전달'이라는 교육적 목적으로 글을 작성함을 밝힙니다.
SVM 기본 개념
SVM은 이진 분류에 사용되는 기법임.
우리가 지금까지 배웠던 로지스틱 회귀에서는, 각각의 값에 대한 z 및 h값과 이를 lable y와 비교해 error을 구해서, 모든 data에 대해 그 error을 최소화할 수 있는 경계를 구했잖음.(이 때 convex graph를 위해서 MSE가 아닌 엔트로피 이진 분류 함수를 비용 함수에 사용했던 것도 기억하기)
근데, SVM은 모든 데이터가 아닌, 경계 근처에 가까이 있는 데이터들만 고려함.
즉, 경계로부터 가장 가까운 곳에 있는 데이터들(=>을 서포트 벡터 라고 부름.)의 margin을 최대하하는 경계를 찾음. margin은 선과 점 사이의 거리로 정의됨.
그 결과 구해진 경계가 위 사진에선 검정색 선임. 서포트 벡터의 경우는 위 파란 선 위의 점들이 됨.
근데, 이렇게 안 하고 우리가 로지스틱 회귀에서 했던 것처럼 모든 training set에 대해 다 따진다면, 저 검정 선과는 다른 경계가 나올 수도 있음.
또, 기존처럼 margin이 아니라 MSE처럼 error로 했으면, 초기 파라미터(쎄타)를 랜덤으로 시작하니까, local minimum에 빠질 수 있어 파란 선 내에 다른 경계가 생길 수도 있잖음. 근데, SVM은 랜덤화하는 과정이 없기 때문에 항상 같은 경계를 뱉어냄.
참고1) SVM이 항상 같은 경계를 뱉어내는건, SVM이 convex optimization problem(볼록 최적화 문제)이기 때문임. 이게 뭔 소리냐? 두 class에 대한 경계의 합을 함수값으로 두고 함수의 파라미터를 변수로 하면, 정의역 내 변수에 따라 그려지는 함수는 볼록한 꼴이지 않겠음?? 생각해보셈. 그래프가 쭈욱 쭈욱 움직이면, 가운데쯤에 그 margin이 최대가 되는 곳은 한 곳만 생기게 됨. 함수가 위로 볼록한 형태란말임.)
SVM은 30년 가까이 되다보니 이미 골수까지 다 빨림. 최적화, 경량화 다 잘 돼있음. 그냥 함수만 콜하면 잘 작동함. 이진 분류일 때 써먹기에 괜찮음. 작은 데이터셋에선 성능도 꽤 준수함. SVM이 30년동안 살아남은 이유가 있음. 상대적으로 봤을 때, 데이터 셋이 적을 때 쓸만함.
다만... 요즘은 데이터셋이 많기도 하고, 다중 클래스 분류를 많이 하기 때문 딥러닝 위주로 쓰긴 함.
참고2) 무슨 기술이 처음 나타나면, 처음엔 hard한 방식으로 써보다가, 그담엔 좀 더 soft한 방식으로 해보게 됨. SVM도 마찬가지로 초기의 SVM은 가까이 있는 건 포함하고, 멀리 있는 건 안 포함한 식으로 했는데, 이걸 어느 거리 안에 있는 걸 가까이 있는 거라고 할지도 애매하고,,, 그래서 나중에 가면 가까이에 있는 건 가중치 높게, 멀리 있는 건 가중치 낮게 해서 margin에 반영되게 하는 방식도 등장함.
처음에 교수 누구누구(누군진 기억안남)는 SVM은 전체 error을 보는 게 아니라, structure error(근처에 있는 애들 error)을 고려해서 하는 게 낫다고 말하기도 했음. 뭐 근데 기술은 바뀌기 마련아니겟음.
=> 이거 틀린듯. 서포트 벡터로 무슨 점을 다루냐는 그냥 가장 가까운 거만 따지면 됨. 가까이 가중치 높게 멀리 가중치 낮게 저거는, 이후 설명할 hard 랑 soft margin 관련 설명인듯. 정확히 둘로 나누기 힘들어지니까 가중치를 부여한거임.
이건 이후 설명할 수식에 나올 C라는 값에 따른 경계의 변화를 보여주는 그림인데, 대충 일단 C는 람다에 반비례한다고 생각하면 됨.
만약, 위 그림에서 좌측 아래 x가 없었고, 처음으로 구했던 경계가 검정 선이라고 해보자.
여기서 좌측 아래 x표시 outlier가 추가돼서 경계를 다시 구하게 된 상황임.
이 때,
C가 엄청 크면 => 람다가 작으니 => 오버피팅될 확률이 높음.
따라서 outlier의 영향을 크게 받아 핑크색 선으로 경계가 바뀜.
C가 막 엄청 큰것까진 아니면 => 람다도 엄청 작지는 않으니까 => 오버피팅까지는 되지 않을 확률이 높음
따라서 outlier는 noise로 여겨서 여전히 검정 선이 경계임.
SVM을 써서 최적화하려는 목적
우리가 기존에 로지스틱 회귀를 배웠잖음?? 서포트 벡터 머신은 로지스틱 회귀에서 어려웠던 비선형 함수 학습에 좋은 대안이 됨.
우리가 로지스틱 회귀에서 썼던 시그모이드 함수에 로그씌워서 이진 엔트로피 함수 구했던거 안에 항들인데... 나중에 식을 간단하게 하기 위해, 저 그래프를 핑크색처럼 간단하게 근사해서 사용할 거임. 여기서 기울기는 고려하지 않을거임. 어차피 뭐 기울기 별 안중요함 그냥 분류에 쓰일 거니까.
참고) 우리가 로지스틱 회귀에서 배워오던 흐름 이어가려고 저렇게 근사화한거지, 실제 논문에선 저렇게하진 않는다는 듯함. 실제론 라그랑주 상수를 써서 최적화해서 margin을 최대화하고, 그럼 식이 나오는데 그걸 미분하면 결과가 나오는 그런 느낌이라곤 하는데... 일단 이 강의대로 이해하고, 나중에 필요하면 추가 공부하자.
참고2) 저렇게 부분적으로 선형적인 함수를 hinge loss function이라고 함.
이제 저 핑크색 부분을 대입하면, 위와 같이 비용 함수 식이 바뀌게 될거임.
이제 여기서, 우리는 항을 왼쪽으로 쫙 밀어볼거임. 그니까, 오른쪽 정규화 항을 간단하게 하고, 앞에 붙은 상수들을 왼쪽 항으로 옮겨볼거임.
일단, 우리는 이 비용 함수 값이 최소가 되는 파라미터를 구하고 싶은 거잖음?? 그 최소가 되는 값이 몇이냐는 전혀 중요하지 않음.
그렇기 때문에 상수는 무시, 즉 1/m을 양쪽에서 제거해줌. (m이라는 상수를 양쪽에 곱해줌.)
또, C를 1/람다라고 정의하자.
람다 또한 그 값을 변화시키는 요인일 뿐이지 최소가 되는 파라미터의 값에는 똑같음. 따라서 양쪽을 람다로 나눠주면,
왼쪽 항에는 C만 남게됨. 최종 식은 아래와 같음.
참고) 이렇게 왼쪽으로 항을 몬 이유는, SVM을 편하게 좀 써보려 그런건데, 나중에 나옴.
여기서, h가 로지스틱 회귀가 하는 예측이잖음. 우리의 모델 h.
SVM은 로지스틱 회귀와 달리 확률을 예측하는게 아니라, 1 또는 0으로 예측하는데, 전치쎄타x가 0보다 (많이) 크면 1 즉 class 1에 속한다 예측하고, 아니면 0 즉 클래스 2에 속한다고 예측함.
참고) 실제 예시를 들어보면, y = 1일때 z = 3이 나왔다고 하면, h = 1이 나올거임. 이러면 맞게 예측한거잖슴? 계산상으로도 cost가 0이 나와서 앞에께 0이 됨. error의 일부분이 0이니까 에러가 작게 나올거임. 당연하지 맞게 예측했으니까.
실제로 학습이 끝난 SVM이 있다 하면, 어떤 데이터가 입력되었을 때, 그 전치쎄타x 값이 (나중에 나오지만 거리임) 양수면, 뭐 예를 들어 왼편에 있단 거니까 class 1에 속하는 거임.
그에 비해 로지스틱회귀는 0.574 이런식으로 속할 확률로 나옴.
그에 따른 error 계산은 이후의 몫이고... ㅇㅇ...
Large Margin Intuition
참고) SVM은 large margin classifier(큰 마진 분류기) 라고도 불림.
여기서, 아까 우리가 전치쎼타x(이하 z라 말할거임)가 0보다 많이 클 때와 많이 작을 때를 기준으로 했잖음.
그게 위와 같이 우리가 간단하게 바꾼 버전에서는, 1과 -1이 기준임.
즉, y = 1일때는 z가 1보다 크면 앞에께 0이 되고, y = 0일때는 z가 -1보다 작으면 앞에께 0이 됨.
여기서 앞에 꺼 라는건 앞에 C 붙은 항을 말하는거임.
(직관적으로 마진을 각각 1, -1을 준다고 생각해도 된다는데... 더 헷갈린다 ㅋㅋ..)
여기서, 상수 C를 100,000와 같이 엄청 큰 값으로 가정해보자. 잊지 말자. 위에 저 식은 비용함수고, 우린 비용함수가 가장 작아지는, 즉 최적화되는 목표를 달성하고자 함. 따라서 C가 있는 항이 0이 되어야 함.
따라서 y = 1일 때는 z >= 1 이고, y = 0 일 때는 z <= -1 이어야 함.
이거 첨에 좀 뇌멘붕올수도 있는데 여러차례 읽어보자.
앞에께 0이 돼야 내가 최소한의 비용 함수를 구할 수 있다고 생각.
이렇게 되면, C가 매우 큰 값이라면 우리가 최적화를 목표하고 있을 땐 앞에 항은 거의 없는 거나 마찬가지잖음. 따라서 비용 함수에선 두 번째 항인 정규화 항만 남게 됨.
따라서, 위 최적화 문제는 위와 같이 단순해진다. (s.t. = subject to : ~에 대하여)
SVM의 margin을 수학적으로 어떻게 구하는가?
내적에 대해 복습해보자.
왼쪽과 같이 두 벡터 v와 u가 있을 때,
p는 벡터 v를 벡터 u에 투영했을 때 생긴 투영의 길이이다.
이 때 vTu가 저 수선의 발의 길이인데, 이건 p * u의 크기 로도 구할 수 있음.
이제, 위와 같이 피쳐 개수 2개에, 쎄타0은 0일 때로 가정하고 간단화하여 살펴보자.
여기서 위와 같은 식 변환을 통해, 우리가 구하려는 비용 함수를 최소화하는 건, 벡터의 크기의 제곱을 최소화하는 것과 같게됨.
이 때, 아까 우리가 z >= 1, z <= 1 이런 조건들을 막 가정했잖음?? 근데, 저 z가 p||쎄타||와 같아짐.
따라서 z를 저걸로 바꿔 쓰면 아래와 같다.
즉, z는 x 벡터를 쎄타 벡터로 투영시킨 거임.
여기서 그 투영시킨 p와 ||쎄타||를 곱한 게 1보다 커야 y = 1이라고 추정하는 거임.
이제, 같은 데이터 셋에 대해 다른 경계를 도입한 두 예시를 보자. 각 경계에 대해, 서포트 벡터와의 마진(p)를 계산할거임.
왼쪽 예시의 경우, y = 1인 경우인데, 저 p가 너무 적음. 이는 즉 쎄타의 놈이 엄청 크다는 건데, 그러면 당연히 cost function이 매우 커지는 문제가 발생함...
반대로 오른쪽 예시의 경우 p가 꽤나 큼. 따라서 쎄타의 놈이 비교적 작교, 결과적으로 cost function이 작아짐. 즉 최적화됨.
여기서 p = margin이다!!
** 이거 잘 이해 안될 수 있는데, 그냥 다 때려치우고 우린 쎄타의 크기가 작아져야 최적화되는건데, 쎄타의 크기가 작아지려면 p가 커져야함. 근데 p가 여기서 margin임. 따라서 저렇게 p가 커지도록 경계가 설정돼야 최적화됨.
따라서, 위와 같은 내용을 통해 SVM을 사용하면 margin이 큰 dicision boundary를 찾게 된다는 것이 증명이 완료됨.
여기서 우리는 쎄타0을 0으로 가정했는데, 쎄타0이 0이란건 경계가 원점을 지난다는거고, 뭐 0이 아니면 원점을 안지난다는 것 뿐이지 작동 방식은 차이가 없음.
** 잊지 말자. 쎄타는 저 경계 함수를 정의하는 파라미터 벡터임.
** 여기서 쎄타 벡터와 경계는 수직이라고 보면 될듯.
이제 초심으로 돌아와서, 처음에 봤던 위 SVM 경계 그림을 보면 이해가 잘 될 것이다.
p, 즉 margin이 최대화되는 검정선을 찾게 될 수밖에 없다.
커널 - 1편
하나 뽑고, 젤 좋은건 멀리 있는 거 한 거임. 그럼 무조건 놓ㅇ르 거임. 아웃라이;어라서 오버헤드 씸새가 살짝 있겠지만.
#27
저런 아웃라어가 문제..
녹음32분
아웃라이어 문제 몇개까지? -> 그 데이터 전체 중에서 1% 이내면 뭐 아웃라이어 아니다 등등.
#32
순서대로 읽기
(이후 추가)
'AI > 머신러닝(코세라)' 카테고리의 다른 글
[ML] #12 차원 축소 - PCA(Dimensionality Reduction - PCA) (0) | 2024.11.13 |
---|---|
[ML] #11 비지도 학습 - 클러스터링(Unsupervised learning - clustering) (0) | 2024.11.08 |
[ML] #9 모델 평가하기(Model Evaluation) (0) | 2024.11.01 |
[ML] 신경망으로 이진 분류를 할 때의 결정 경계(decision boundary) 구하기 (0) | 2024.10.18 |
[ML] chain rule을 이용한 back propagation 공식 유도 손정리 (0) | 2024.10.18 |