군집화(Clustering) `군집화(Clustering)`이란 예측 모델과 같이 예측을 목적으로 하는 것이 아닌, 데이터가 주어졌을 때 데이터 간에 유사한 속성들을 갖는 관측치들을 묶어 전체 데이터를 몇 개의 군집(그룹)으로 나누는 것을 말한다. 군집화의 기준은 동일한 군집에 소속된 관측치들은 서로 유사할수록 좋으며, 상이한 군집에 소속된 관측치들은 서로 다를수록 좋다. `분류(Classification)`와 `군집화(Clustering)`의 차이는 다음과 같다. 분류 : 사전 정의된 범주가 있는(labeled) 데이터로부터 예측 모델을 학습하는 문제 → `지도학습(Supervised Learning)` 군집화 : 사전 정의된 범주가 없는(unlabeled) 데이터에서 최적의 그룹을 찾는 문제 → `비..
성능 최적화 데이터를 사용한 성능 최적화 일반적으로 ML/DL 알고리즘은 데이터양이 많을수록 성능이 좋기 때문에 가능한 많은 데이터를 수집 많은 데이터를 수집할 수 없다면 직접 데이터를 만들어 사용 활성화 함수로 시그모이드(0~1의 값), 하이퍼볼릭 탄젠트(-1~1의 값) 등을 사용하여 데이터셋 범위를 조정 정규화, 규제화, 표준화 등도 성능 향상에 도움 알고리즘을 사용한 성능 최적화 ML/DL을 위한 다양한 알고리즘 중 유사한 용도의 알고리즘들을 선택하여 모델을 훈련시켜 보고 최적의 성능을 보이는 알고리즘을 선택해야 한다. 알고리즘 튜닝을 위한 성능 최적화 모델을 하나 선택하여 훈련시키려면 다양한 하이퍼파라미터를 변경하면서 훈련시키고 최적의 성능을 도출해야 한다. 진단 : 성능 향상이 어느 순간 멈췄을..
매개변수 갱신 확률적 경사 하강법(SGD) 신경망 학습의 목적은 손실 함수의 값을 가능한 한 낮추는 매개변수를 찾는 것으로 이는 곧 매개변수의 최적값을 찾는 문제이며, 이러한 문제를 푸는 것을 `최적화(optimization)`이라고 한다. 최적의 매개변수 값을 찾기 위한 단서로 매개변수의 기울기(미분)를 이용하는데, 매개변수의 기울기를 구해 기울어진 방향으로 매개변수 값을 갱신하는 일을 반복해서 최적의 값을 향해 다가가는 것이 `확률적 경사 하강법(SGD)`이다. SGD는 다음과 같은 수식으로 표현이 가능하다. 결국 SGD는 기울어진 방향으로 일정 거리만 가겠다는 단순한 방법이다. SGD를 파이썬 코드로 구현하면 다음과 같다. class SGD: def __init__(self, lr=0.01): se..
파이썬 코드를 보면 `if __name__ == '__main__':` 이런 코드를 확인할 수 있다. 이는 파이썬 코드를 모듈로 사용할 때와 직접 실행할 때를 구분하기 위해 사용하는 코드 패턴으로. 해당 모듈이 임포트된 경우가 아니라 인터프리터에서 직접 실행된 경우에만 if문 코드를 실행하라는 명령어이다. 다음과 같은 코드 예시가 있다고 하자.# my_module.pydef my_function(): print("모듈 내 함수 실행")if __name__ == '__main__': print("직접 실행됨")여기서 다른 모듈 `another_module.py`에서 다음과 같이 `my_function()`이라는 함수를 호출하면 "모듈 내 함수 실행"이라는 실행 결과가 나온다.# another_m..
Transformer `Transformer`는 `Attention`을 사용하면서 학습과 병렬화를 쉽게 하여 속도를 높인 모델이다. Transformer는 `Seq2Seq` 모델과 같이 순차적으로 input 토큰을 처리하는 것이 아니라 이를 한꺼번에 처리한다.Transformer 모델의 기본적인 구조는 다음과 같다. Transformer 모델을 signle black box와 같이 표현하면 다음과 같다. 이는 `RNN` 기반의 `Encoder-Decoder` 구조와 Input과 Output은 동일하다. 또한 Transformer를 자세히 들여다 보면 Encoding component와 Decoding Component가 따로 존재하며, 이를 어떻게 연결하는지가 결국 RNN 구조와의 차이점이다. Encod..
Sequence-to-sequence model `Seq2Seq` 모델은 words, letters, features of images 등의 sequence data를 Inputs으로 사용하며 Outputs 또한 또다른 sequence data이다. 여기서 입력에 사용하는 sequence에 해당하는 item의 개수와 출력의 sequence에 해당하는 item의 개수가 동일할 필요는 없다. 이러한 sequence-to-sequence 모델은 번역 머신으로 사용되며 이 경우 sequence는 단어들로 구성되며, output 또한 마찬가지로 단어들로 구성된다. Encoder-Decoder Seq2Seq 모델은 `Encoder`와 `Decoder`로 구성된다. 각각의 역할은 다음과 같다. Encoder : in..
부분최소제곱법(Partial Least Squares, PLS) `부분최소제곱법(Partial Least Squares, PLS)`은 X의 선형결합의 분산을 최대화하는 것과 더불어 X의 선형결합 Z와 Y간의 공분산을 최대화하는 변수를 추출하는 방법이다. PLS는 Y와의 공분산이 높은 k개의 선형조합 변수를 추출(Supervised feature extraction)하는 방식이다. PLS(부분최소제곱)의 용어는 선형조합으로 추출된 변수가 설명하지 못하는 부분에(데이터 일부분) 지속적으로 최소제곱법을 사용하는 것에서 유래했다. PLS의 주요 목적은 PCA와 동일하게 회귀 및 분류 모델을 구축하고, 데이터의 차원을 축소시키는 것이다. 그러나 PCA와의 차이점은 추출된 변수가 PCA에서는 반영하지 못했던 Y와의..
고차원 데이터 고차원 데이터란 X 변수의 수가 많은 데이터를 말한다. 이는 변수의 수가 많기 때문에 불필요한 변수가 존재하며 시각적으로 표현하기 어렵다. 또한 계산 복잡도가 증가하기 때문에 모델링이 비효율적일 가능성이 크다. 따라서 이 경우 중요한 변수만을 선택해서 모델링을 하는 것이 필요하며, 이를 `차원 축소(dimension reduction)`라고 한다. 변수 선택/추출을 통한 차원 축소 차원 축소의 방법은 `변수 선택(feature selection)`과 `변수 추출(feature extraction)` 두 가지가 있다. 변수 선택이란 분석 목적에 부합하는 소수의 예측 변수만을 선택하는 방법으로 본 데이터에서 변수를 선택하기 때문에 선택한 변수의 해석이 용이하지만 변수간 상관관계를 고려하기 어렵..
def training(epoch, model, trainloader, validloader): correct = 0 total = 0 running_loss = 0 model.train() for b in trainloader: x, y = b.text, b.label x, y = x.to(device), y.to(device) # 반드시 모델과 같은 device y_pred = model(x) loss = loss_fn(y_pred, y) optimizer.zero_grad() loss.backward() optimizer.step() with torch.no_grad(): ..
nn.ReLU() 파이토치의 신경망 모듈 중 하나인 활성화 함수 모듈`nn.Sequential()` 모델에 추가할 수 있는 `nn.Module`을 만듬모델의 `__init__` 메서드에서 레이어로 초기화되며, 그 레이어가 `forward()` 메서드에서 사용될 때 활성화 함수가 적용F.relu()파이토치의 함수 라이브러리인 `torch.nn.functional`의 함수함수로서 주로 모델의 forward 연산 내에서 활성화 함수를 적용하는 데 사용모델의 forward 메서드에서 함수로 직접 호출https://discuss.pytorch.org/t/whats-the-difference-between-nn-relu-vs-f-relu/27599https://asidefine.tistory.com/80