머신러닝 : Data로부터 내재된 패턴을 학습하는 과정
구성
입력 x와 출력 y의 쌍으로 구성되어 있음
Ex) 개 이미지[x] -> h(x)-> 개[y]
ML은 그 자체로서 데이터 결핍으로 인한 불안정성을 가지고 있다. => 일반화가 중요하다!!
관찰하지 못했던 새로운 input에 대해서도 잘 예측할 수 있는가?
Train Error
: 주어진 sample에서 model parameter를 최적화 시키는 데에 사용
Test Error
: 전체 데이터셋에서 transet를 제외한 것. 현실 세계의 데이터를 반영한 데이터셋
Train Error를 0에 가깝게 만들거나 Train Error와 Test Error를 가깝게 만드는 방향으로 학습
Test 와 Train 을 가깝게
-실패하면 : Overfitting [high variance] // 해결법 : 규제, 데이터추가
Train을 0에 가깝게
-실패하면 : Underfitting [high bias] // 해결법 : 최적화, 모델을 더 복잡하게
Bias와 Variance는 Trade off 관계에 있음
모델의 복잡도에 따라 Overfitting / Underfitting이 발생하니 이 둘의 균형을 맞추는 것이 중요하다.
최근엔 오버피팅이 더 흔하게 일어남 [차원의 저주]
Regression : 모델의 출력이 연속값
Linear model
Model Parameder와 x의 선형합으로 이루어질 수 있는 것 (aT * X)로 표현 가능한 것!!
(logistic regression이 비선형인 이유)
: 단순하다 (일단 해보기 쉽다) / 일반화에 좋다 / 회귀와 분류 문제 둘 다 풀이 가능
입력되는 feature들은 수치로 변환되어야 함
Regression도 지도학습이기 때문에 x – y pair로 되어 있음
단변량 문제, 다변량 문제는 변수의 수에 따라 결정됨 (단항회귀 다중회귀)
상수항은 offset 역할
Loss Function은 MSE를 사용한다.
Parameter는 Gradient Descent를 이용해서 구함
Loss Function을 최소화 시키는 지점 [Error Surface의 최저점] 을 향해 Parameter를 조절함 -> Fitting.
Parameter Optimization
결국 target의 vector, Y 와 feature의 vector, X, parameter의 Vector P의 Error를 구하는 과정
|| Y - XP || 가 바로 loss가 됨 -> 이 loss를 최소화 시키는 parameter를 찾는 것!!
바로 직빵으로 loss =0인 parameter를 구하는 방식을 Normal Equation으로 구한다~ 라고 하는데 이런 과정은 데이터가 많아질수록 비효율적임
Why? 차원이 증가할수록 Matrix의 Inverse증가 -> 연산량이 너무 많아짐
효율적으로 구해보자!! -> Gradient Descent!!!!!
Gradient Descent 찍먹
최저점에 도달하면 기울기가 = 0 이됨 (Gradient=0)
그 지점을 찾아가는 과정임
내려가려면 기울기가 큰 방향(내리막길)로 가야함 -> Gradient가 큰 방향으로 이동! Lr을 조정함으로써 얼마나 이동할지를 결정할 수 있음
이런 걸 Greedy 알고리즘이라고 함
Global Optimum 은 전체 loss에서 가장 낮은 지점을 말하지만 local optimum은 그 지역에서만 낮은 지점을 말함
Minimum에 도달할 때까지 내부 parameter를 update 시키는 것!!!
Normal vs Gradient
노말 : 한번에 구할 수는 있지만 데이터가 많아지면 비효율적
Gradient : 편하게 구할 수는 있지만 너무 오래걸림 -> SGD
Gradient : 벡터의 편미분값 (변화량)
Learning Rate
Lr 값의 크기에 따라 수렴 속도를 조절할 수 있음
작으면 : 안정적으로 수렴, 그러나 오래걸림
너무 크면 : 학습 진행 자체가 안 됨
Batch Gradient Descent
Local Optimum에 취약하지만 어느 정도 수렴하는 모습을 보이긴 함
SGD (Stochastic Gradient Descent)
BGD보다 빠르게 iter를 돌 수 있음!
Momentum을 이용하자!!
: 업데이트 되어 오던 방향과 속도를 어느 정도 반영해서 Gradient = 0이 되더라도 학습을 계속 하게 하는 방법
Nestrov Momentum
Gradient를 먼저 보고 update!! 기존은 모멘트 스텝과 Gradient 를 벡터 합 한 것만큼 이동하지만 이건 momentum을 보기 전에 Gradient의 방향을 고려함
약간 전에는 방향과 얼마나 움직여 왔는지를 한번에 고려했다면 이건 방향 먼저 보고 생각한 다음에 얼마나 움직여왔는지를 고려한다는 말인듯.
Ada Grad
각 방향으로의 LR을 적응적으로 조절 -> 학습효율을 높임
지금까지 움직였던 방향일수록 이미 그 방향으로 학습이 많이 진행되었다는 의미 (Gradient 누적 값이 크다!)
RMSProp
Gradient 누적 값을 계산할 때 그대로 Gradient를 곱하는 게 아니라 (1-lo)를 곱함 -> 이것도 현재가치를 계산하는 아이디어네
Adam (Adaptive Moment Estimation)
RMSProp와 Momentum 방식을 합침
1. 모멘텀 방식으로 첫번째 모멘텀 계산
2. RMSProp 방식으로 두번째 모멘텀 계산
3. Bias를 Correct
4. 파라미터 Update
Optimizer의 종류를 설명해주실 때, 제가 예전에 봤던 Optimizer 정리도가 생각이 나서 이 Note에 살짝 두고 갑니다!
LR Scheduler
LR을 Epoch마다 조절하는 방법
학습 초기에는 LR을 큰 값으로 진행하고 Epoch가 진행될수록 LR을 줄임!
과적합 극복 Tip
Regularization : Feature의 수를 줄이는 방법
Classification의 Label은 Discrete한 값!
Linear Model은 결국 회귀계수와 Feature가 선형 결합이 된 형태
즉, Linear Classification은 선으로 data들을 구분해내는 것이 목적이 됨
Decision Boundary로 Label을 분류해내는 것! (가정 : 데이터들이 선형구분하게 되어있다~)
전반적인 과정은 NN과 비슷함 특정 함수에 들어가서 Boundary를 그어줄 기준을 정의해주고 거기에 맞게 Classification을 해주는 것!
Input이 함수에 들어가서 나온 output을 Score라고 하는데, 이 Score는 결국 Decision Boundary와 Data Point간의 거리가 됨(Projection 했을 때)
그럼 학습을 어떻게 시키냐?
Classification 의 Loss는 좀 다름
Zero-One : 틀리면 1, 맞으면 0을 출력
'+ Margin 사용 : Score에 y를 곱한 값이 Margin -> 정답을 잘 맞힐수록 Margin은 양수를 가지게 됨!! 틀리면 음수를 가지게 되므로 이걸로 판단
근데 Zero-One은 Gradient가 0이 됨
Hinge Loss 사용
Hinge Loss : 1-Margin값과 0 중에 큰 값을 출력함
Margin이 크면[잘 맞추면] 1-Margin은 완전 음수 -> 0이 나오게 됨 -> Loss = 0
Margin이 작으면[못맞추면] -> 해당 값이 나옴 -> Loss 그대로 출력
따라서 이렇게 Gradient가 나오게 됨
Cross-Entropy Loss
KL발산에 기반함! 다르면 다를수록 loss가 커지고 같으면 같을수록 작아지는 형태
Training 과정
1. 가중치 초기화
2. Gradient 계산
3. 이동 방향, 정도 계산
4. 가중치 Update
5. 수렴할 때까지 반복
Multiclass Classification
Ex) One vs All : A냐 아니냐 B냐 아니냐 -> Multi를 Binary로 풀어냄! -> 이걸 Class별로 반복해서 Score를 얻고 확률값으로 나타냄 -> Cross Entropy loss 계산하고 업데이트!
Linear Classification의 장점
간단하다 / 해석하기 쉽다
아까처럼 Decision Boundary를 그을 건데, 그릴 수 있는 것중에 뭘 고르지? 최적의 분류 선은 어떻게 고를 수 있을까? -> 새로운 Data가 들어와도 강건한 선을 그어야 함
SVM (Support Vector Machine)
Margin을 기준으로 결정하자!!!
Hard Margin SVM : SV들과 Boundary 사이엔 그 어떤 데이터도 없어야 한다.
Soft Margin SVM : 몇 개는 있어도 돼~
Hard Margin SVM
이렇게 나타낼 수 있음 (Scaling을 통해 -1과 1 사이의 값을 가지게 만듦)
때문에 Boundary의 거리를 2/||w||로 나타낼 수 있고, 이게 바로 Margin임
그리고 이 식을 최대화 시키는 것이 목적! 즉, ||w||를 최소화 시켜야함 -> 계산이 귀찮아지므로 ||w||^2를 최소화 시키는 것을 목표로 함
Kernel 함수
Polinomial / RBF / Hyperbolic Tangent 등을 활용해서 비선형적으로 분포된 애들도 선을 그을 수 있음
ANN (Artificial Neural Network)
앞서 했던 내용과 굉장히 비슷함 이름만 바뀌었을 뿐
Activation Function
Sigmoid : 층을 깊게 하면 별로 안 좋게 됨… Gradient가 어차피 갈수록 작아지게 됨
ReLU : 미분해도 0 아니면 1의 값을 가짐
핵심은 비선형적인 층을 쌓으면 아무리 복잡한 형태라도 표현할 수가 있다는 것!!
XOR문제도 해결 가능 (제 블로그 가시면… 쉽게 설명했습니다 ㅎㅎ)
이런식으로 여러 층을 쌓은 모델을 MLP라고 함!!!
이런 여러 층의 모델들은 이미지, Video와 같은 고차원의 이미지에 적합함!!
물론 너무 계속 쌓아가다 보면 오히려 성능이 낮아지는 경우가 있음 (By Gradient Vanishing)
알고리즘 종류에 상관없이, 여러 모델들을 묶어 함께 사용하는 방식
Ex ) SVM + NN
여러 학습 데이터들을 같은 데이터에 대해 결과들을 투표해서 최종 결과를 결정함
장점 : 노이즈에 강건함, 구현하기 쉬움, 파라미터 튜닝이 많이 필요 없음
단점 : 모델 자체로 Compact한 표현하기가 어려움
Bagging
학습 데이터를 n개로 구분하여 n개의 Classification에 각각 학습시킴 -> 각각 다른 특성을 학습할 수 있다!!
Bootstrap
Sample Data Set을 생성해서 학습하는 방식
어차피 다른 모델로 학습 시킬 거면 같은 Data로 학습 시켜도 큰 상관 없음
Boosting
Weak Classifier들을 여러 개로 묶어서 이전 Classifier가 데이터를 학습할 때의 정보를 반영함!!
Weak Classifier : Bias가 높은 Classifier (단순해서 혼자서는 성능 x)
Ada Boost
연속적인 Classfier들로 분류작업이 진행 될 때마다 데이터에 가중치를 둬서 성능을 향상
평가
Accuracy : 가장 흔하게 사용
Confusion Matrix
이런 식으로 표현 가능하다는 말
FP : N인데 P라고 판단함 (틀린 Positive)
TP : 잘 맞춘 P
Precision : TP/(TP+FP) | Recall : TP/(TP+FN)
풀고자 하는 문제에 따라 적합한 Metic을 사용해야함
Object Detection / Image - Sentence / Segmentation 도 SL로 풀어냄
SL이 진짜 좋긴 한데 데이터가 많이 필요한 것이 한계임