Hayden's Archive
[AI] 머신러닝 & 딥러닝 / 지도학습 & 비지도학습 & 강화학습 / Training Model & Inference Model(Test Model) 개념 / Forward Propagation / Back Propagation / Hyperparameter 본문
[AI] 머신러닝 & 딥러닝 / 지도학습 & 비지도학습 & 강화학습 / Training Model & Inference Model(Test Model) 개념 / Forward Propagation / Back Propagation / Hyperparameter
_hayden 2020. 7. 22. 11:30< 목차 >
머신러닝이란?
머신러닝을 하기 위한 핵심적인 3가지 요소
AI / Machine Learning / Deep Learning
지도학습 / 비지도학습 / 강화학습
Training Model / Inference Model(Test Model) / Underfitting / Overfitting
Forward Propagation
Back Propagation
하이퍼 매개 변수(Hyperparameter)
머신러닝 하면서 쓰게 되는 파이썬 오픈소스 데이터셋
< 머신러닝이란? >
사람이 프로그램을 짤 때는 explicit하게(명료하게, 명시적으로) 짜야 함.
기계가 학습할 수 있는 능력을 부여. 우리 입장에서는 기계가 어떻게 학습하는지 explicit하게 알 수 없음. 기계가 어떻게 하는지 모르겠지만 결론이 기계한테서 나온다.
인간이 할 수 없는 부분이 있다. 바둑을 짜는 알고리즘을 못 만들고, 만들어도 완벽하지 않음. 경우의 수가 굉장히 많아서 인간의 용량으로는 explicit하게 짤 수 없다. 인간이 감당할 수 없음.
-> 이런 것들을 기계한테 시킨다. 데이터가 아무리 많아도 기계는 돌려냄. 대표적으로 자율주행, 스팸메일 거르는 필터 방법
"A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P if its performance at tasks in T, as measured by P, improves with experience E." - T. Michell(1997) |
< 머신러닝을 하기 위한 핵심적인 3가지 요소 >
Task T -> 목적
Performance Measure P -> 성능 점수
Experience E -> 학습 데이터 로 이해하면 됨
Task를 위해서 학습 데이터(Experience)를 부여했을 때 어떤 성능(Performance Measure)으로 학습을 완수할 수 있는가?
퍼포먼스를 어떻게 측정하느냐에 따라 태스크를 어떻게 수행하는지 많은 차이가 있음.
학습데이터 -> 위치에 대한 학습을 할 때 위치와 관련없는 학습 데이터가 들어오면 안 됨. 태스크에 딱 맞는 학습 데이터를 얼마나 갖출 수 있느냐.
기계가 학습한다 => 프로그램을 짜는 것과 다름.
기계가 학습을 하는데 학습하려면 데이터가 있어야 함. 데이터는 이미지, 숫자, 여러 가지 정보, 특성, 성격 등이 될 수 있음(이 때 그 데이터가 뭔지에 대한 라벨이 같이 주어져야 함. 데이터마다 정답을 분류할 수 있는 태그가 있어야 함. 이건 마우스, 이건 볼펜 이런 식으로)
학습데이터가 500개 -> 머신러닝 쓰기보다 알고리즘 하나 만드는 게 나음. 머신러닝에서는 굉장히 많은 학습데이터 사용.
그동안 어마어마한 데이터가 없었기 때문에 학문이 발전하지 못했음. 지금은 클라우드 기반, SNS 등으로 어마어마한 데이터가 있음.
Training DataSet = 기계가 학습할 수 있도록 던져주는 데이터
학습데이터를 머신러닝 안으로 넣으면 기계가 알아서 학습. 얼마나 학습했는지 알아보려면 학습데이터 말고 한번도 학습해본 적이 없는 미지의 데이터(Test Data)를 넣었을 때 어떤 결과를 내는지 보면 제대로 학습했는지 알 수 있음.
모델 = 머신.
사람의 개입 없이 모델이 스스로 학습.
Training DataSet(데이터와 라벨이 있음)으로 모델에게 학습을 시키면 모델이 학습해서 라벨을 뱉어냄. 데이터를 넣으면 그 데이터에 해당하는 라벨을 정확하게 뱉어내는가.
내가 이미 공부한 걸 가지고 예측하게 하면 예측을 잘함. 학습한 데이터를 잘 맞히는 건 안 중요함. 새로운 미지의 데이터를 맞히는 게 중요함.
-> 굉장히 학습을 잘하게 하려면 기계가 외우지 않도록 마구마구 섞어야 함.
정량화한다는 것 -> 10개의 데이터 중 9개의 데이터를 맞히면 90%의 정확도.
=> 어느 정도의 정확도로 예측하느냐에 따라 학습할 때 수정이 커질 수도 있고 작아질 수도 있음.
< AI / Machine Learning / Deep Learning >
AI(Artificial Intelligence)
1) Narrow AI -- 한가지 영역에서만 능력을 가짐.(얼굴 인식하는 알고리즘을 쓴 인공지능을 얼굴만 인식함. 티셔츠 같이 다른 건 인식 못함. // 음성만 인식. 꽹과리 치면 인식 못함.) => 기업 입장에서 다루고 있는 AI
2) General AI -- 일반적인, 전영역에 걸친... 인간보다 더 뛰어난 능력을 지닌 인공지능. 아이언맨 자비스. 데이터를 정의하는 게 아니라 자기가 알아서 창의적인 영역까지 넘어서게 됨. => 기업에서 연구하지는 않음. 국가 시스템에서 연구.
Machine Learning
- 인간이 데이터의 특징들을 수천개, 수만개 라벨을 붙여야 함.
- 데이터를 집어넣으면 그 때부터는 인간 개입 없이 모델이 학습. 지도학습, 비지도학습 둘 중 하나로 학습.
- 학습 후 새로운 데이터의 결과값을 예측
- 얼마나 잘 예측했는가에 대한 성능 평가
=> 학습 50만번 하고 나서 하나의 데이터를 예측... 예측값이 틀렸을 때 다시 학습해야 하는데 기존과 똑같이 학습하면 안 됨. 어떻게 학습을 바꿔줄 수 있는지가 중요한 관건.
Deep Learning
- 딥러닝은 뉴럴 네트워크(Neural Network) 중에 하나의 방법.
- 머신러닝을 좀 더 딥하게 다룸. Layer가 굉장히 많아짐. 선형이 계속 쌓임.
- Layer가 여러개 쌓이는 것을 인간이 어떻게 학습하고 신경세포에서 받아들이는지를 본뜸. 인간 뇌의 뉴런을 흉내.
< 지도학습 / 비지도학습 / 강화학습 >
학습분류
결정트리, 선형회귀 -> 지도 학습.
협업 필터링 -> 비지도 학습. 일종의 군집.
지도학습(Supervised Learning)은 트레이닝 데이터셋을 주긴 주는데 정답도 같이 줌. 비지도학습은 데이터는 있는데 답을 알려주지 않음. 라벨이 없음. 비지도학습은 딱히 정답이 없기 때문에 수치화할 수 없고 평가를 못함. 추천에서 끝날 뿐.
비지도학습(Unsupervised Learning) -> 검색어 분류하는 것에서 Clustering(군집화). 이런 데이터의 그룹은 어떤 성향의 그룹으로 해석된다 정도임. 내가 관심 있는 것들끼리 연관. 똑같이 자바를 쳐도 A가 검색하면 자바 언어가 나오는데 B가 검색하면 커피가 나올 수 있음.
사용자 유사도냐, 아이템 유사도에 따라 달라짐. 유사도끼리 점점 확대시켜가는 것이 군집. 비지도학습은 그냥 군집.
그 외에는 전부 다 지도학습!
머신러닝을 내가 가지고 있는 환경, Resource적인 측면에서 본다면 비지도학습이 좋음. 데이터셋이 어마어마하게 많지 않아도 가능함.(물론 쓰다보면 연산의 양이 어마어마하게 많아질 수 있음. ex)넷플릭스) 작은 규모의 기업에서 보면 비지도학습이 Clustering이 훨씬 좋음. 지도학습을 쓰려면 어마어마한 데이터가 있어야 함.
그럼에도 불구하고 현실적으로는 지도학습을 더 많이 씀. 지도학습은 정답이 있음.
인간이 데이터를 작업하는 힘든 부분이 있음에도 불구하고 지도학습을 쓴다. 좀 더 수치가 보이기 때문.
강화학습(Reinforcement Learning)
- 행동까지 연결될 수 있는 방법론.
- 라벨이 없지만 그렇다고 비지도학습도 아님. 지도/비지도학습에 속하지 않고 별도로 있음.
- 게임할 때는 강화학습이 쓰이는데 실제로는 강화학습이 쓰이는 빈도가 높지 않았음. 그런데 점차 자율주행 뿐만 아니라 계속해서 빈도수가 높아지고 있음. 유심히 봐야 함.
< Training Model / Inference Model(Test Model) / Underfitting / Overfitting >
머신이 학습하는 방식 자체를 모델이라고 함.
모델은 크게 2가지 측면으로 나뉨. Training Model이냐 Inference Model(Test Model)이냐.
Inference Model을 통해서 어떤 값을 예측했을 때 에러를 현저하게 낮추는 게 궁극적인 목적.
- Training Model 성능이 100% 나오면 좋아할 일이 아니라 그냥 외운 것일 확률이 높음. 해당하는 데이터에 너무 의존하고 있음.(데이터에 overfitting되어져 있는 것. overfitting을 낮춰야 함) 십중팔구 Inference Model의 성능이 안 좋음. - Training Model 성능이 96~97% 나오는 게 좋음. 외운 게 아니라 트레이닝도 자신이 학습한 것. - Training Model 성능이 70% 정도 나오면 공부를 너무 안한 것 -> 데이터를 늘리고 학습기간도 늘려야 함. - 정확도 성능을 어떻게 바라보느냐가 중요. Inference Model의 성능은 무조건 높은 게 좋음. |
모델이 학습하고 나서 예측한 결과를 두고 그래프로 그린 것.(x축은 학습량, y축은 에러량)
그래프 출처 : https://www.textbook.ds100.org/ch/15/bias_cv.html
Underfitting : 아직 공부를 많이 안 했다. -> 공부를 더 많이 시키면 됨. 데이터셋 늘리기.
Overfitting : 트레이닝할 때는 잘 맞혔는데 실제 예측할 때는 에러가 많음. 내가 가진 데이터에 너무 연연하게 되면 overfitting이 됨. -> 데이터를 좀 더 추상적으로 볼 줄 알아야 함. 중요도가 떨어지는 것은 좀 더 한걸음 떨어져서 범위를 넓게 추상성을 늘려줘야 함. 사람인데 눈 하나 없어도 사람.
Test Error를 낮추려면 overfitting을 낮춰야 한다.
<지도학습에서 Machine Learning - Forward Propagation하는 방법 >
데이터 준비 -> 모델 생성 -> 학습시킴(만번 돌릴지, 돌린 걸 또 돌려서 이만번 돌릴지 정해주면 됨)
Forward Propagation Flow 1. load_iris() - 데이터 로드 2. train_test_split() - 역할 1) train과 test를 분리시킴(8대 2나 7대 3) - 역할 2) 디폴트로 shuffle해준다(섞어주기만 해도 학습 효과 올라감) => 나중에 배울 건데 transforms도 있다 (어떤 라이브러리는 동일한 사진을 좀 틀어서 변형시켜서 학습 효과를 올려주기도 함. 45도 각도, 여러 각도로 틀거나 흑백 배경으로 변형시키거나 밝기를 바꾸거나) 3. DecisionTreeClassifier() - 결정트리 모델을 만든다 4. fit() - 학습시킨다 5. score(), accuracy_score() - 평가 관련 포스팅 : https://hayden-archive.tistory.com/297 |
머신러닝에서
Dimensionality = Feature의 수
데이터의 차원이 높다는 것은 Feature의 수가 많다는 것.
참고) Back Propagation Flow -> 자세한 것은 딥러닝에서 또 나올 것
Feature가 분류 기준. 이 정보를 바탕으로 분류가 되고 Label이 결정됨.
머신의 입장에서 모든 Feature의 중요도를 동일하게 돌릴 수도 있고, 다르게 돌릴 수도 있을 것
Accuracy가 굉장히 낮아졌다 -> 중요한 비중을 가진 Feature가 있을 거고 굳이 분류하지 않아도 될, 굳이 가중치를 부여하지 않아도 될 Feature가 있을 것. Feature에 대한 수정이 필요.
ex) Feature에서 A 80, B 10, C 0.1, D 0.2 이렇게 가중치를 두고 돌리니까 65%가 나옴. A에 대한 가중치를 수정해야 함.
-> 이 과정은 예측을 한 후에야 가능하다
< 하이퍼 매개 변수(Hyperparameter) >
학습 프로세스 자체를 관리하는 모델을 학습하기 위해 선택한 조정 가능한 매개 변수
사람이 직접 지정해줘야 하는 값. 기계가 학습한 결과로 나올 수 있는 값이 아님. 기계가 학습한 Accuracy를 가지고 인간이 직접 값을 매길 수 있는...
hyperparameter 값을 튜닝하는 게 관건. hyperparameter의 종류도 굉장히 많고 값의 레벨로 굉장히 다양. 다양한 데이터에 여러 값을 넣어본 경험으로 얻어짐.
참고 : https://docs.microsoft.com/ko-kr/azure/machine-learning/how-to-tune-hyperparameters
< 머신러닝 하면서 쓰게 되는 파이썬 오픈소스 데이터셋 >
* MNIST 0~9 손글씨 예측 => 카테고리(라벨)이 10개(0~9)
손글씨보다 이미지가 더 성능 점수가 더 낮게 나옴(더 구체적인 데이터이기 때문)
* Cifar-10 => 라벨이 10개라서 싸이파 뒤에 10이 붙음.
Cifar-100은 라벨이 100개, Cifar-1000은 라벨이 1000개
라벨의 개수가 많을수록 예측이 더 어려움. 라벨의 개수는 성능 점수에 큰 영향을 줌.
50개를 넘으면 위험함. 굉장히 힘든 작업이 됨. 마지노선을 50으로 둔다.
성능 80->90 올리는 건 어렵지 않음.
석사 수준에서 93까지 올릴 수 있음.
95~97%까지 올리는 건 피나는 고통. 박사까지 가야 함.