티스토리 뷰

728x90

[ 밑줄/연결 ]

 

머신러닝은 과거의 경험(데이터)을 기반으로 새로운 데이터에 대한 예측을 내리는 데 주로 사용된다.....대규모 과거 데이터로 학습해 새로운 데이터에 대한 예측을 수행한다. 

 

비즈니스에서는 아직 알지 못하는 새로운 데이터에 대한 예측에 지도 학습을 많이 사용한다.....이미 알고 있는 데이터에 어떤 알고리즘을 적용하여 입력 데이터와 출력 데이터 사이의 관계를 파악하고, 그 결과(모델)을 이용해 새로운 데이터에 대한 예측을 수행하는 방식...

 

모델이란 입력 데이터와 출력 데이터 사이의 드러나지 않은 관계를 수식이나 규칙을 이용하여 근사한 것을 말함....모델, 다시 말해 입력과 출력의 관계를 나타내는 파라미터를 구함으로써 새로운 데이터에 대해서도 일정 수준의 예측을 할 수 있게 됨.

 

(머신러닝 프로젝트의 과정)

(1) 문제를 정의

(2) 머신러닝을 사용하지 않는 방법은 없는지 검토

(3) 시스템을 설계

(4) 사용할 알고리즘을 선택

(5) 특징과 정답 데이터, 로그를 설계

(6) 데이터를 전처리

(7) 학습을 수행하고 파라미터를 튜닝

(8) 시스템에 통합

 

해결하려는 문제를 머신러닝으로 풀 수 있는 문제로 바꾸기 (1~ 2) -> 문제를 풀기 위한 도구 선택 및 전처리 (3~6) -> 모델 구축(7) -> 기존 시스템에 통합(8)

 

특히 문제 정의 및 전처리가 중요함.....

머신러닝으로 해결 가능한 것과 그렇지 않은 것을 구분하는 능력 +데이터 분석의 80%는 전처리 (형식이 흐트러진 CSV를 파싱하거나 웹 로그에서 필요한 정보를 추출하는 작업 등)

 

머신러닝으로 해결한 사례를 찾으면 먼저 다음 세 가지을 중점적으로 살펴보길 바란다.

(1) 어떤 알고리즘을 사용했는가?

(2) 어떤 데이터를 특징으로 사용했는가?

(3) 머신러닝 부분을 어떻게 통합했는가? 

 

(1) 문제 정의하기

 

목적을 명확하 정의 -> 해결하려는 문제에 대한 가설을 세우고 -> 무엇을 해야 할지 명확히

예를 들어 생산비용 절감(목적) --> 수율개선 --> 머신러닝을 이용해 불량이 발생하는 원인(지점)을 탐색

 

머신러닝을 위한 문제 설정의 예.  사용자마다 추천 상품을 제시해 온라인 쇼핑몰 매출을 늘린다, 소비전력을 예측해 공장 전력소비 최적화에 활용한다.

 

(2) 머신러닝을 사용하지 않는 방법 검토

 

머신러닝은 기술부채 중 이자율이 매우 높은 신용카드다......다른 시스템에 비해 기술부채가 쉽게 누적된다.  머신러닝을 적용한 운영 시스템에는 다음과 같은 문제가 발생할 수 있다. 

확률적인 부분이 있어 자동 테스트가 어렵다.

ㅇ 오래 운용하면 사용자 경향이 변해 입력 경향도 바뀐다.

    (창조경제는 이전에는 긍정적으로 쓰였지만 최근에는 부정적인 의미로 바뀌었다.)

처리 파이프라인이 복잡해진다.

데이터 의존관계가 복잡해진다.

ㅇ 실험 코드 혹은 파라미터가 포함되기 쉽다.

개발 시스템과 운영 시스템 간의 언어/프레임워크가 제각각이기 쉽다.

 

정기적으로 새로운 데이터로 모델을 갱신하거나, 필요에 따라 특징을 재검토해야 한다. 즉 모델 역시 유지보수가 필요

 

머신러닝 알고리즘이 난수를 사용해 확률적으로 처리하는 코드를 포함하므로 규칙 기반으로 처리할 때처럼 시스템의 행동이 결정론적으로 정해지지 않는다. 

 

다양한 데이터에 대한 반응 모두를 미리 확인하기는 불가능하다......생각하지 못한 예측 결과를 출력할 위험은 항상 존재.

(구글 포토에서 아프리카계 사람을 고릴라로 인식....)

 

어떤 비즈니스 문제에 머신러닝을 적용하면 좋을까?

ㅇ 대량의 데이터에 대해 고속으로 안정적인 판단을 내려야 한다.  --> 대량의 데이터를 항상 같은 기준으로 처리할 수 있다. 

ㅇ 예측 결과에 일정 수준의 오류가 용인된다.   ---> 예측 결과가100% 정확할 수는 없으므로 운영 쪽에서 이 오류에 대응할 수 있는 구조를 반드시 갖춰야 한다.

 

(3) 시스템 설계

 

설계에서 중요한 핵심 두 가지..

ㅇ 예측 결과를 어떻게 이용할 것인가?   ---> 예측 처리를 배치로 수행한 다음 그 결과를 RDB에 배포하는 방법, 웹서비스나 애플리케이션에서 사용자 액션마다 비동기적으로 예측하는 방법 등 

ㅇ 예측 오류의 영향을 어떻게 흡수할 것인가?   ---> 시스템 전체에서 위험 요소를 어떻게 통제할지를 결정해야 함. 예측 결과를 사람이 직접 확인하는 단계를 두거나, 잘못된 예측이 큰 영향을 줄 수 없는 경우에만 애플리케이션에 적용하는 방법.. 등

 

목표 성능과 포기 지점을 설정. '2개월 안에 90% 예측 성능 달성' 같은 구체적인 목표 성능과 포기 지점을 정해두어야 함

 

(4) 시스템 설계

 

데이터의 특성을 모른다면 군집화 같은 비지도 학습이나 스케터플롯 매트릭스로 시각화해보고 어떤 방법으로 문제를 풀지 생각해 본다. 

 

데이터양을 예상해보고 온라인 학습과 배치 학습 중 어느 쪽이 적합한지 가늠해 본다. 

 

(5) 특징, 정답 데이터, 로그 설계하기 

 

알고리즘 후보를 골랐다면 어떤 정보를 사용할지도 설계해야 함

 

특징(feature)은 머신러닝 예측 모델에 입력될 정보....입력 정보를 수치 벡터로 만들어야 함. 예를 들어 내일 눈이 올지를 예측하는 데 오늘의 기온(섭씨 1도), 강수량(0.8mm), 풍속(0m/s), 적설량(2cm), 날씨(흐림) 정보를 사용한다면, 이들 값을 각각 수치화한 리스트인 [1.0, 0.8, 0.0, 2.0, 1]이 입력 벡터가 됨

 

머신러닝에 입력될 특징이 예측에 필요한 정보를 포함하는지를 도메인 전문가에게 미리 확인한다. (예를 들어 과거 경험을 기반으로 망치를 두들겨 나는 소리 정보를 수집하여 터빈의 고장 여부를 검출한 사례도 있다. 요즈음 구매이력, 공장의 센서 데이터 등을 활용)

 

딥러닝에서는 특징보다는 신경망의 구조를 어떻게 설계하는지가 더 중요

 

지도 학습에서 필요한 정답 범주 레이블(정답 레이블)과 그 정답의 입력 데이터의 쌍을 준비...

 

(6) 데이터 전처리

 

불필요한 정보를 발라내고, 데이터를 머신러닝에 사용할 수 있는 형태로 바꾸는 과정이 주....

 

수치 데이터는 누락값이나 정상 범위를 벗어난 이상값을 처리하고, 값의 변동폭으로 인한 영향을 줄이는 정규화 등의 작업을 거쳐야 한다. 

 

과적합 < -> 처음 보는 데이터를 잘 처리하는 모델은 '일반화' 성능이 높다고 한다.

 

(7) 학습 및 파라미너 튜닝

 

머신러닝 알고리즘을 조정하는 파라미터를 시행착오를 거쳐가며 수정해보고 결과가 더 나은 값을 찾음. 우선 사람이 직접 부여한 정답이나 규칙 기반으로 예측한 성능을 기준치로 하여 이를 뛰어넘는 것을 목표로 삼음

 

(8) 시스템에 통합

 

예측 성능과 비즈니스 성과를 모니터링....

 

머신러닝을 시스템을 오래 운영하다 보면 인력의 경향이 바뀔 수 있다. 이로 인해 예측 성능이 서서히 혹은 급격히 저하되는 일이 흔하다. 

---> 이런 일은 직접 개발 및 운영을 해보지 않으면 알 수 없는 문장.....저자들이 경험이 많다는 반증이다. 

 

(운영 시스템에서 발생하는 머신러닝 문제 대처 방법)

 

예측 성능만을 추구하며 모델을 갱신하기가 어렵게 되며, 시스템이 계속 복잡해져 유지보수하거나 변화에 대응하기가 어렵게 된다. 처음부터 변화를 전제로 설계해야 한다.

 

(1) 사람이 직접 작성한 황금기준을 사용하여 예측 성능을 모니터링한다.

ㅇ 머신러닝의 처리 과정에는 확률적인 부분이 있어 그 예측 결과를 자동 테스트로 검증하기가 어려움

ㅇ 미리 확보한 데이터와 그 정답을 이용해 예측 성능을 측정하고 이 성능의 추이를 모니터링함

 

(2) 예측 모델을 모듈화하여 알고리즘에 대한 A/B 테스트를 실시한다.

ㅇ 예측 모델을 모듈화해두면 여러 모델을 병렬로 두고 바꿔가며 A/B 테스트를 할 수 있음

 

(3) 모델을 버전관리하여 언제든 원하는 시점으로 돌아갈 수 있도록 한다. (모델 버전관리를 통한 자유로운 롤백)

ㅇ 입력 데이터의 형식이 바뀌었을 수도 있고 처리 과정에 무언가 차이가 발생했을 수도 있음

소스 코드와 더불어 데이터, 모델 모두를 역시 버전관리하는 편이 바람직

 

(4) 데이터 처리 파이프라인 자체를 저장한다.

ㅇ 전처리와 예측 모델 구축을 포함하여 데이터 처리 파이프라인 전체를 저장해둬야 함

(5) 개발 시스템과 운영 시스템 간의 언어/프레임워크를 일치시킨다.

ㅇ 예측 모델은 R로 개발하고, 애플리케이션은 자바로 재구현한 상황.....두 가지 언어로 모두 구현해야 하므로 알고리즘 변경 비용이 크게 상승함. 

 

ㅇ 실험에 쓰인 코드로부터 운영 환경에 배포될 코드로 진행하는 일 역시 똑같은 프레임워크를 사용한다면 마이그레이션과 커뮤니케이션 비용을 줄일 수 있을 것... 시스템의 복잡성을 낮추는 장점도 누릴 수 있음

 

ㅇ 최근에는 마이크로서비스라고 해서 시스템을 구성하는 각 기능이나 서비스가 서로 API나 메시지 큐를 이용해 통신하는 구조를 택하는 사례가 늘고 있음......시스템을 잘게 분할한다는 점에서 머신러닝 부분을 따로 다루기 편리함. 이런 설계 사상에 따라 머신러닝을 위한 REST 혹은 gPRC API 서버를 두는 경우도 있음

 

(머신러닝 시스템을 성공적으로 운영하려면)

머신러닝을 적용한 시스템을 만드는 데는 어느 정도 도박적인 요소가 있다. 일반적인 시스템은 설계만 적절히 이뤄진다면 어떻게든 동작은 할 것이다. 그러나 머신러닝 시스템은 최악의 경우 수 주 혹은 수개월 후에도 의미 있는 결과물이 나오지 않을 수 있다. ....분류 모델이 무작위 추출보다 성능이 떨어지는 일도 흔하다. 

 

(머신러닝 제품을 사업적으로 성공시키려면 어떤 사람이 중요할까?)

(1) 제품에 대한 도메인 지식을 갖춘 사람

해결할 문제가 무엇인지, 제품의 어떤 부분에 머신러닝을 적용할지를 고려할 때 중요...

특징을 결정하거나 데이터를 수집할 때도 도메인 지식이 중요한 열쇠가 됨

 

(2) 통계와 머신러닝을 잘 아는 사람

(3) 데이터 분석 인프라를 구축할 수 있는 엔지니어링 능력을 갖춘 사람

(4) 실패에 대한 위험을 짐어질 수 있는 책임자

ㅇ 머신러닝은 실패 확률이 높은 투자.....

 

(분류)

지도학습의 한 종류로 카테고리와 같은 비연속적인 값을 예측함. 예를 들어 이메일의 스팸 여부나 사진 속 물체를 검출하는 것처럼 비연속적값으로 나타낼 수 있는 대상을 예측하는 경우...

 

분류 알고리즘:  페셉트론, 로지스틱 회귀,  SVM, 신경망, k-최근접 이웃(k-NN), 결정트리, 랜덤 포레스 등 

 

(배치 처리로 학습+ 예측 결과를 웹 애플리케이션에서 직접 산출(예측을 실시간 처리))

ㅇ 배치 처리로 학습해서 얻은 예측 모델을 웹 애플리케이션에서 실시간 처리에 이용

ㅇ 모놀리식 웹 애플리케이션에 예측 처리를 통합하고 예측 결과 자체는 라이브러리 API를 통해 구한 다음, 이 결과를 웹 애플리케이션에서 이용함

ㅇ 규모가 커지고 코드 변경과 배포 비용이 증가함

ㅇ 학습 단계에서는 배치 시스템이 미리  DB에 축적한 로그와 사용자 정보를 이용하여 특징을 추출함. 이때 만든 특징으로부터 모델을 학습함. 이렇게 학습된 모델을 직렬화하여 저장소에 저장한 것이 학습 결과가 됨

ㅇ 예측 단계에서는 특정 이벤트가 발생하면 웹 애플리케이션이 예측을 요청함. 이벤트가 발생하면 예측해야 할 대상에 대한 정보를 DB에서 (혹은 HTTP 요청에서 직접) 얻은 다음, 그에 대한 특징을 추출함. 직렬화하여 저장해둔 모델을 읽어 들여서 추출된 특징으로부터 예측 결과를 출력함. 이 결과값을 기반으로 사용자에게 피드백을 남기거나 그 다음 단계로 넘어 가게 됨

(배치 처리로 학습+ 예측 결과를 웹 애플리케이션에서 직접 산출(예측을 실시간 처리))

ㅇ 예측을 수행하는 부분을 별도 API서버에 맡기는 패턴. 학습은 배치 처리로 이뤄지며, 예측 결과는 실시간으로 처리되어 API를 통해 웹 애플리케이션에 전달됨. HTTP나 RPC 요청의 응답으로 예측 결과를 전달하는 API 서버를 둔다는 점이 특징임

ㅇ 웹 애플리케이션에서 이벤트가 발생하면 예측이 실시간으로 수행됨

ㅇ 요즈음은 AWS 람다로 예측 API를 구축하여 규모를 쉽게 확장할 수 있는 환경을 만들 수 있게 됨

ㅇ 예측 모델을 S3 같은 객체 저장소에 저장하고 API서버는 도커 이미지로 만들어서 일래스틱 컨테이너 서비스나 구글 쿠버네틱스 엔진을 통하는 방식으로도 규모확장이 손쉬운 환경을 구축할 수 있음

ㅇ 지연시간이 중요한 사항이라면 HTTP나 RPC를 비동기로 호출하여 예측 결과를 기다리는 사이에 다른 작업을 처리할 수 있도록 함

(배치 처리로 학습+ 예측 결과를 DB에 저장하고 사용(예측을 배치 처리))

웹 애플리케이션에 적용하기 쉬운 가장 유리한 패턴

ㅇ 먼저 일괄 학습한 다음, 이 모델로 예측까지 배치 처리함. 그 결과를 DB에 저장해 둠

ㅇ 이 패턴은 예측을 배치 처리하며, 그 결과를 DB를 거쳐 주고받기 때문에 웹 애플리케이션과 머신러닝 부분을 서로 다른 언어로 구현해도 된다는 것이 장점. API 패턴과 달리, 예측 처리에 다소 시간이 걸리더라도 웹 애플리케이션의 응답 시간에 영향을 주지 않음

ㅇ 예측에 필요한 정보는 예측 배치를 실행할 때만 필요함. (사용자의 웹 페이지 요청 같은) 이벤트에 대한 예측 결과를 즉각 알려주지 않아도 됨

ㅇ 상품을 배치로 분류하거나 사용자 이력을 군집화하는 것처럼 예측 빈도가 하루 한 번 정도(적어도 수 시간 간격)여도 무방할 때 적용함.

학습 단계에서는 로그나 사용자로부터 특징을 추출하고 모델을 일괄 학습한다. 이렇게 학습한 모델은 직렬화해 저장소에 저장한 다음 다음 예측 단계에서 사용된다.

예측 단계에서는 학습 배치에서 만든 모델을 사용하여 예측을 수행....DB에 저장된 데이터에 학습에 사용된 것과 같은 특징 추출 모듈을 사용해서 특징을 추출한 다음 예측을 수행함. 예측 결과는 웹 애플리케이션이 사용할 수 있는 형태로 가공하여 다시 DB에 저장한다.

[ 자평 ]

 

머신러닝이 실제 프로젝트의 어느 부분에서, 어떻게 활용되는지 알고 싶어서 훑어 보았다. 

경험치를 정리해 놓았다고 보여지는 좋은 책이다....

 

다만 내 경험과 지식이 부족하여 전부 이해는 하지 못했다....

 

'4장. 기존시스템에 AI를 통합하는 부분'은 다른 곳에서 본 적이 없는 귀한 내용이다. 

댓글