머신러닝
기계학습machine learning이란, 기계가 이미 가지고 있는 데이터 집합에서 특징feature을 파악하는 방법을 익혀 새로운 데이터의 특징도 잘 파악할 수 있게 하는 것이다.
위 정의는 딱히 엄밀한 정의도 아니고, 정의가 엄밀해야할 필요도 없다. 기계는 간단히 말해서 컴퓨터, 즉 프로그래밍 코드라고 이해하면 된다. 이미 가지고 있는, 그러니까 학습에 쓰이는 데이터 집합을 트레이닝 셋training set, 훈련집합이라고 한다. 기계학습을 시험공부하는 학생에 비유하면 다음과 같다.
- 기계: 학생
- 트레이닝 셋: 기출문제
- 특징: 출제 경향
- 새로운 데이터: 실제 시험문제
- 학습: 기출문제를 풀어봄으로써 실제 시험문제를 풀 수 있도록 하는 것
2021년 현재, 기계학습을 구현하는데 가장 많이 쓰이는 방법은 인공신경망의 은닉층을 늘리는 딥러닝deep learning, 심층학습이다. 인공신경망은 최근에 들어서 비약적으로 성능이 높아졌으며, 가장 좋은 성능을 뽐내기도 한다. 딥러닝이 만족할만한 성능을 보여주기 전까지 기계학습의 주류였던 것은 통계적 이론을 바탕으로한 모델들이었다.
머신러닝을 할 줄 아는 사람이 되려면 수학, 통계학, 프로그래밍을 할 줄 알아야한다. 이론을 이해하기 위해서 수학, 통계학 지식이 요구되고, 이를 구현하기 위해서는 프로그래밍을 할 줄 알아야하기 때문이다. 특히나 머신러닝 이론에 대해서 깊게 공부하려면 행렬에 대한 선형대수학 지식 뿐만 아니라 측도론, 함수해석학 등이 필요하다. 또한 최근에는 기하학, 그래프이론, 편미분방정식 등과 인공지능을 연계한 연구도 진행되고 있다1.
또한 아래의 글들은 최대한 수학 전공자가 읽기 쉽도록 작성되었다.
기초
학습개념
최적화
샘플링sampling, 표본추출
- 몬테카를로 방법이란?
- 몬테 카를로 적분
- 기각 샘플링
- 중요도 샘플링
- 마코프 체인 몬테 카를로MCMC
고전 기계학습
선형 회귀 모델
선형 분류 모델
- 선형 분류 모델
- 최소 제곱법
- 피셔 선형 판별기 Fisher’s Linear Discriminant
- 네이만-피어슨 이진 분류 Neyman-Pearson Criterion for Binary Classification
- 베이즈 리스크 분류기 Bayes Risk Classifier
클러스터링
세부 분야
강화학습
컴퓨터 비전
딥러닝 이론
- 레이어
- 선형층
- 합성곱층
- 스킵 커넥션
- 활성화 함수
- 인공 신경망ANN이란
- [ANN인공신경망, DNN심층신경망, FNN순방향신경망의 뜻과 차이점]
- 퍼셉트론의 정의
- 딥러닝이란?
- 자동 미분
- 딥러닝의 수학적 근거, 시벤코 정리 증명
- 딥러닝에서 연속 학습이란
- 볼츠만 머신
- 제한된 볼츠만 머신
- 배치 학습 알고리즘
- 온라인 학습 알고리즘
- 분류를 위한 RBM
- Radial Basis Function
- [MLP다층 퍼셉트론]
- [CNN합성곱 신경망]
- Autoencoder자동부호기
- PINN물리정보기반 신경망 논문 리뷰
- DeepONet심층 연산자 신경망 논문 리뷰
- 파이토치로 구현하기
- 줄리아로 구현하기
- [U-net 논문 리뷰]
- [줄리아로 구현하기]
- KAN콜모고로프-아놀드 신경망 논문 리뷰
딥러닝 프레임워크
Python PyTorch
- 모델/텐서가 올라간 디바이스 확인하는 방법
.get_device()
- 주어진 분포로 랜덤 샘플링하는 법
torch.distributions.Distribution().sample()
- Numpy 배열로 커스텀 데이터 셋 만들고 사용하는 방법
TensorDataset
,DataLoader
- 가중치, 모델, 옵티마이저 저장하고 불러오는 방법
torch.save(model.state_dict())
신경망
- 멀티 레이어 퍼셉트론 구현
- 리스트와 반복문으로 인공 신경망 정의하는 방법
nn.ModuleList
- 모델의 가중치 값을 얻는 방법
.weight.data
,.bias.data
- 가중치 초기화
torch.nn.init
텐서
- 모듈러 연산
fmod
,remainder
- 차원, 크기 다루는 법
.dim()
,.ndim
,.view()
,.reshape()
,.shape
,.size()
- 랜덤 순열 만들고 텐서 순서 섞는 법
torch.randperm
,tensor[indices]
- 깊은 복사하는 법
.clone()
- 붙이거나 쌓는 법
torch.cat()
,torch.stack()
- 패딩하는 법
torch.nn.functional.pad()
- 소팅하는 법
torch.sort()
,torch.argsort()
트러블 슈팅
- ‘RuntimeError: grad can be implicitly created only for scalar outputs’ 해결법
- 리스트에 대한 ‘TypeError: can’t convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first’ 해결법
- ‘RuntimeError: Boolean value of Tensor with more than one value is ambiguous’ 해결법
- 모델 저장할 때 ‘RuntimeError: Parent directory does not exists’ 해결법
Julia
Flux
- 은닉층 다루는 방법
- MLP 구현하고 경사하강법으로 최적화하는 방법
- 원-핫 인코딩하는 방법
onehot()
,onebatch()
,onecold()
- MLP 구현하고 비선형함수 근사하는 방법
- MLP 구현하고 MNIST 학습하는 방법
- GPU 사용하는 법
- 신경망 훈련/테스트 모드 설정하는 법
trainmode!
,testmode!
주요 참고문헌
- Christoper M. Bishop, Pattern Recognition annd Machine Learning (2006)
- Simon Haykin, Neural Networks and Learning Machines (3rd Edition, 2009)
- Trevor Hastie, The Elements of Statistical Learning: Data Mining, Inference, and Prediction (2nd Edition, 2017)
- 오일석, 기계 학습(MACHINE LEARNING) (2017)
- Richard S. Sutton, Reinforcement Learning: An Introduction (2nd Edition, 2018)
전체 포스트
- 자동미분과 이원수
- 줄리아에서 이원수를 이용하여 자동미분 전진모드 구현하기
- 인터넷에 무료 공개된 인공지능, 머신러닝, 딥러닝 교재
- 이미지(신호, 데이터)에서 노이즈와 아티팩트의 차이
- 오토인코더 (자동부호기)
- 오류행렬과 민감도, 특이도
- 교차검증
- R 에서 ROC 곡선 그리는 법
- ROC 곡선을 이용해 최적의 컷오프 찾는 법
- ROC 곡선의 AUC 를 이용해 모형 비교하는 법
- 인공 신경망이란?
- 머신러닝에서의 손실 함수
- 머신러닝에서의 경사하강법, 확률적경사하강법
- 딥러닝이란?
- 딥러닝에서의 활성화 함수
- 딥러닝에서의 소프트맥스 함수
- 딥러닝에서의 드롭아웃
- 지도학습과 비지도학습
- k-평균 군집화
- 머신러닝에서 오버피팅과 레귤러라이제이션이란?
- 머신러닝에서 많이 쓰이는 데이터 셋
- 논문 리뷰: Do We Need Zero Training Loss After Achieving Zero Training Error?
- 딥러닝에서 연속 학습이란
- 컴퓨터 비전이란
- 퍼셉트론의 정의
- 시그모이드 함수란?
- 로지스틱 함수란?
- 머신 러닝에서 회귀를 위한 선형 모델
- 차별 함수란?
- 시그모이달 함수란?
- 딥러닝의 수학적 근거, 시벤코 정리 증명
- 머신러닝에서 강화학습이란
- 퍼셉트론 수렴 정리
- 역 전파 알고리즘
- 파이토치 RuntimeError: grad can be implicitly created only for scalar outputs 해결법
- 파이토치에서 MLP 구현하는 방법
- 파이토치에서 가중치 초기화 하는 방법
- 파이토치에서 Numpy 배열로 커스텀 데이터 셋 만들고 사용하는 방법
- 파이토치에서 가중치, 모델, 옵티마이저 저장하고 불러오는 방법
- 파이토치에서 랜덤 순열 만들고 텐서 순서 섞는 법
- 파이토치에서 리스트와 반복문으로 인공 신경망 레이어 정의하는 방법
- 파이토치에서 텐서 깊은 복사하는 방법
- 파이토치에서 모델의 가중치 값을 얻는 방법
- 파이토치에서 텐서 붙이거나 쌓는 방법
- 줄리아에서 머신러닝 데이터 셋 사용하는 방법
- 파이토치 텐서 패딩하는 방법
- 파이토치 텐서의 차원, 크기 다루기
- 줄리아 플럭스에서 은닉층 다루는 방법
- 줄리아 플럭스에서 MLP 구현하고 경사하강법으로 최적화하는 방법
- 줄리아 플럭스에서 원-핫 인코딩하는 방법
- 줄리아 플럭스에서 MLP 구현하고 MNIST 학습하는 방법
- 파이토치에서 리스트에 대한 타입 에러 'TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.' 해결법
- 줄리아 플럭스에서 MLP 구현해서 비선형함수 근사하는 방법
- 계층적 군집화
- 머신러닝에서 선형회귀모델의 경사하강법 학습
- 논문 리뷰: 물리정보기반 신경망(PINN)
- 기계학습에서 ReLU란?
- 머신러닝에서 훈련/검증/테스트 집합이란?
- 소프트플러스 함수란?
- 파이토치 모델/텐서가 올라간 디바이스 확인하는 방법
- 서포트 벡터 머신
- 머신러닝에서의 정부호 커널과 재생 커널 힐베르트 공간
- 머신러닝에서 원-핫 인코딩이란?
- 표현자 정리 증명
- 자동 미분
- 줄리아의 여러가지 딥러닝 프레임워크
- MNIST 데이터베이스
- Iris 데이터 셋
- 딥러닝에서 레이어란?
- 파이토치에서 주어진 분포로 랜덤 샘플링하는 법
- 파이토치에서 'RuntimeError: Boolean value of Tensor with more than one value is ambiguous' 에러 해결 방법
- 파이토치에서 텐서 정렬에 관한 함수
- 플럭스-파이토치-텐서플로우 치트 시트
- 파이토치에서 모델 저장할 때 'RuntimeError: Parent directory does not exists' 에러 해결법
- 몬테 카를로 적분
- 중요도 샘플링
- 기각 샘플링
- 몬테카를로 방법
- 데이터 어그멘테이션이란?
- 머신러닝에서 온라인 러닝과 배치 러닝이란?
- 파이토치의 모듈러 연산
- 경사하강법에서 모멘텀 기법
- 적응적 학습률: AdaGrad, RMSProp, Adam
- 텐서플로-케라스에서 시퀄션 모델, 함수형 API로 MLP 정의하고 훈련하는 법
- 파이토치에서 AdaBelief 옵티마이저 사용하는 방법
- 인공신경망에서 스킵 커넥션이란?
- 머신러닝에서 가중치란?
- 파이토치에서 torch.nn과 torch.nn.functional의 차이
- 그리드 서치, 브루트 포스, 노가다
- 대학원생 하강법
- 논문 리뷰: DeepONet
- 줄리아 플럭스에서 GPU 사용하는 법
- 줄리아 Flux에서 신경망 훈련모드, 테스트모드 설정하는 방법
- DeepONet 논문 구현 무작정 따라하기 (PyTorch)
- 논문 리뷰: 콜모고로프-아놀드 신경망(KAN)
- 소금 후추 노이즈