알고리즘 개발?
알고리즘을 활용한 모듈 개발?
어찌되었든 내가 생각하는 최선의 개발환경을 구성하는 방법을 정리했었다.
https://jarikki.tistory.com/47?category=959329
이제 실제 AI 서비스를 위한 모듈 개발 방법에 대해 나름의 방법론을 정리해 본다.
AI 서비스를 개발하기 위해 우리는 Keras, Pytorch 등 다양한 프레임워크를 사용할 수 있다. ML 프레임워크의 사용 방법과는 별개로 어떻게 하면 조금 더 표준화된 AI 서비스 모듈을 개발할 수 있을지 나름의 방법론의 정리한다.
1. 서비스 모듈 구성
개발 모듈은 기능 역할에 따라 총 4개의 모듈로 분리할 수 있다.
- 실행 모듈 : 학습모듈 또는 예측모듈을 실행(구동)하는 실행 클래스
- 학습 모듈 : ML/DL 알고리즘의 학습을 수행하는 클래스
- 예측 모듈 : 학습된 ML/DL 알고리즘을 활용하여 실제 예측을 수행하는 클래스
- 유틸리티 모듈 : 유틸리티 기능을 수행하는 클래스
또한 이 모듈이 사용할 실제 알고리즘(ML/DL)이 필요하며, 이 알고리즘을 나는 "모델"이라 부른다.
즉 AI 서비스 모듈을 개발하기 위해서는 4개의 "모듈"과 1개 이상의 "모델"이 필요하다.
- 모델 : ML/DL 알고리즘(GRU, GAN, XGboosts, BERT 등)
2. 각 서비스 모듈의 세부기능 정의
[서비스 모듈]
- 유틸리티 모듈을 통한 raw data 획득
- 유틸리티 모듈을 통한 raw data 가공 및 DataFrame 생성
- 학습 모듈에 DataFrame을 전달하고, 학습 모듈을 실행
- 예측 모듈에 DataFrame을 전달하고, 예측 모듈을 실행
- 학습 결과 또는 예측 결과에 대한 수치(정확도 합산, 평균 등) 측정 및 시각화
[유틸리티 모듈]
- 데이터 소스 접근 및 데이터 조회(Load)
- 데이터 전처리 : 결측치 및 이상치 제거, scaling을 통한 데이터 정규화
- 독립변수, 종속변수에 따른 DataSet 생성
[학습 모듈]
- 모델(알고리즘) load
- 모델 학습을 위한 Network Layer 생성
- 모델 학습을 위한 Hyper Parameter 설정
- 모델 학습 수행 및 학습 결과(accuracy, recall, precision) 출력
- 학습된 모델 또는 가중치를 저장한 Check Point 저장
[예측 모듈]
- 학습된 모델(알고리즘) load
- 예측 실행
3. 데이터 전처리 표준화
이상치를 해결하기 위한 방법은 그 case가 매우 다양하여 수행 절차를 표준화하기 어렵다. 하지만 결측치에 대한 처리 절차는 표준화가 가능하고, 동일한 절차를 따름으로써 어느 정도 재사용이 가능한 코드화가 가능할 것 같다.
결측값을 대체하는 방법 역시 "평균값", "중앙값" 으로 대체하거나, 결측값이 존재하는 row를 제거하는 등 다양한 방법이 존재한다. 하지만 알고리즘을 학습하는 경우 대량의 데이터를 사용한다는 점을 감안하면, 단순 제거 보다는 대체하는 방법이 적절하다고 생각한다.
결측값에 대한 대체를 위해 내가 생각하는 전처리 순서는 Pandas 기준으로 "bfill" -> 'ffill' -> '평균값 대체" 이다.
이렇게 하면 결측값을 누락없이 대체할 수 있고, 절차를 표준화할 수 있다.
4. 모델 저장과 가중치 저장
모델을 학습한 후 재사용을 위한 모델 저장 방법은 "모델저장", "가중치저장" 2가지 방식이 있다.
모델저장의 경우 저장, 활용 방식이 간편한 장점이 있지만, 모델 자체의 크기가 커지는 단점이 있고, 특히 종속변수들의 값 차이에 따른 모델 분리(어떻게 정리할지 말이 어렵네..)가 어려운 문제가 있다.
예를 들어...
주식을 예측한다고 가정할 때 "삼성전자", "엘지전자" 와 같이 여러 회사의 주식을 회사 별로 각각 예측해야 한다.
이때 삼성전자 주식을 학습한 가중치와 엘지전자 주식을 학습한 가중치를 분리해서 재사용한다면 무거운 모델을 저장해서 사용하는 것 보다는 Checkpoint를 저장해서 재사용하는 방법이 유용하다.
가중치(check point)를 저장해서 모델에 사용하기 위해서는 모델의 Network Layer를 사전에 알고 있어야하는 단점이 존재하지만, 내가 직접 학습한 모델의 경우 이런 문제는 발생하지 않는다.
따라서 나는 모델 자체를 저장하는 것 보다는 모델 별 가중치를 저장해서 사용하는 방식이 효과적이라 생각한다.
AI 모듈을 개발하기 위한 사전 준비(환경구성)과 개발 방법(모듈 및 기능 정의)에 대한 생각이 정리되었으니,
이제 본격적으로 AI 모듈을 개발할 수 있다. (진짜? ㅋㅋ)
어찌되었든 내가 생각한 방법론에 따라 클래스를 개발하며 잘못된 부분을 수정해 나가다 보면 정교한 개발 표준화를 할 수 있을 것 같다.
'ML & AI > Algorithm' 카테고리의 다른 글
[알고리즘] ChatGPT - fine tuning #1 (0) | 2023.03.22 |
---|---|
[알고리즘] ChatGPT - API 활용 #1 (0) | 2023.03.22 |
[알고리즘] 임베딩과 손실함수 선택하기 #4 (0) | 2022.10.05 |
[알고리즘] Merge를 통한 데이터 Filtering & Mapping #3 (0) | 2022.09.30 |