주요 컨텐츠로 이동
Engineering blog

지난 블로그 게시물에서는 머신 러닝 수명 주기를 관리하는 오픈 소스 플랫폼인 MLflow
쉽게 시작할 수 있는 방법을 설명했습니다. 특히 MLflow 및 PyCharm을 사용하여 간단한
Keras/TensorFlow 모델을 설명했습니다.

이번에는 이진 분류 Keras 네트워크 모델을 살펴봅니다.
MLflow의 추적 APIs사용하여 기준 모델과 실험 모델 간의 실행에서 학습 및 유효성 검사중에
메트릭(정확도 및 손실)을 추적합니다. 이전과 마찬가지로 PyCharm 및 localhost를 사용하여
모든 Experiment실행합니다.

IMDB 영화 리뷰를 위한 이진 분류

이진 분류는 특히 감정 분류의 경우 결과를 두 개의 고유한 클래스로 분류하려는
일반적인 머신 러닝 문제입니다. 이 예에서는 감정을 표현하는 일반적인 단어가 있는지
리뷰의 텍스트 콘텐츠를 검사하여 영화 리뷰를 "긍정적" 또는 "부정적" 리뷰로 분류합니다.

주로 François Chollet의 " Deep Learning with Python" 에서 차용한 Keras 네트워크
예제 코드는 MLFlow 프로젝트 로 구성되고 MLflow 추적 API 를 통합하여,
parameter 메트릭 및 아티팩트를 기록하도록 모듈화 및 수정 되었습니다.

방법론 및 Experiment

인터넷 영화 데이터베이스(IMDB)는 Keras와 함께 패키지로 제공됩니다.
50,000편의 인기 영화 세트로, 교육용 리뷰 25,000개와 검증용 리뷰 25,000개로 나뉘며
"긍정적"과 "부정적" 감정이 고르게 분포되어 있습니다.
이 데이터 세트를 사용하여 모델을 학습하고 유효성을 검사합니다.

간단한 데이터 준비를 통해 이 데이터를 Keras 신경망 모델이 처리할 수 있도록
numpy 배열로 텐서로 변환할 수 있습니다.
(데이터를 읽고 준비하기 위한 코드는 모듈에 있습니다: data_utils_nn.py.)

두 개의 Keras 신경망 모델(기준선 및 실험적)을 만들고 데이터세트에서 학습합니다.
기준 모델은 일정하게 유지되지만 Experiment 결과를 비교하기 위해 서로 다른
튜닝 parameter 및 손실 함수를 제공하여 두 가지 실험 모델을 합니다.

여기서 MLflow의 추적 구성 요소는 무수히 많은 튜닝 parameter 중 모델에서
최상의 메트릭을 생성하는 것을 평가하는 데 큰 도움이 됩니다.
먼저 기준 모델을 살펴보겠습니다.

기준 모델: Keras 신경망 성능

출처 : Python을 사용한 딥 러닝

François의 코드 예제는 이진 분류를 위해 이 Keras 네트워크 아키텍처 선택을 사용합니다.
다이어그램에 표시된 대로 숨겨진 레이어 1개(16단위), 입력 계층 1개(16단위) 및
출력 계층 1개(1단위)의 세 가지 조밀한 레이어로 구성됩니다.

"숨겨진 단위는 레이어의 표현 공간에 있는 차원입니다"라고 Chollet은 썼는데,
여기서 16은 이 문제 공간에 적합합니다. 이미지 분류와 같은 복잡한 문제의 경우
항상 단위를 늘리거나 Experiment 에 숨겨진 레이어를 추가하고 정확도 및
손실 메트릭에 미치는 영향을 관찰할 수 있습니다(아래 Experiment 에서 수행).

입력 계층과 은닉 계층은 relu 를 활성화 함수로 사용하는 반면,
최종 출력 계층은 시그모이드를 사용하여 결과를 [0, 1] 사이의 확률로 스쿼시합니다.
1에 가까우면 긍정적이고 0.5보다 작으면 음수를 나타낼 수 있습니다.

이 권장 기준 아키텍처를 사용하여 기본 모델을 학습하고 모든 parameter,
메트릭 및 아티팩트를 기록합니다. 모듈 models_nn.py의 이 스니펫 코드,
위의 다이어그램에 표시된 대로 조밀한 레이어의 스택을 생성합니다.

....
def build_basic_model(자신):
 base_model = 모델. 순차()
 base_model.add(레이어. 밀도 (16, 활성화 = 'relu', input_shape = (10000, )))
 base_model.add(레이어. 조밀 (16, 활성화 = 'relu'))
 base_model.add(레이어. 조밀 (1, 활성화 = '시그 모이드'))

base_model 반환

다음으로, 모델을 구축한 후 적절한 손실 함수와 옵티마이저를 사용하여 모델을 컴파일합니다.
최종 출력으로 확률을 예상하기 때문에 이진 분류에 권장되는 손실 함수는 다음과 같고
해당 제안된 옵티마이저는 다음과 binary_crosstropy 같습니다.
rmsprop. 모듈 train_nn.py 의 코드 조각은 모델을 컴파일합니다.

Keras 가져오기 옵티마이저에서
 ...
 ... 
옵티마이저 == 'rmsprop'인 경우:
   opt = 옵티마이저. RMSprop(lr=lr)입니다.
model.compile(옵티마이저=opt, 손실='binary_crossentropy', 메트릭=['정확도'])
...

마지막으로, 각 반복에 대한 IMDB 데이터 세트의 512개 샘플에 대해 default 배치 크기로
반복 또는 epoch를 실행하여 피팅(학습)하고 평가합니다 default parameter

  • Epoch = 20
  • 손실 = binary_misantropy
  • 단위 = 16
  • 숨겨진 레이어 = 1

명령줄에서 실행하려면 Git 리포지토리 디렉터리Keras/imdbclassifier
cd하고 다음 중 하나를 실행합니다.

Python main_nn.py

또는 GitHub repo 최상위 디렉토리에서 다음을 실행합니다.

mlflow run Keras/imdbclassifier -e main

또는 Gitbub에서 직접 :

mlflow 실행 'https://github.com/dmatrix/jsd-mlflow-examples.git#keras/imdbclassifier'

https://www.youtube.com/watch?v=6oGIwyAlUIM
그림 1: 로컬 호스트에서 기본 모델 parameter 사용한 애니메이션 실행

실행이 끝나면 모델은 모든 반복 후 학습 세트와 검증 세트 모두에 대해 binary_loss, binary_accuracy, validation_lossvalidation_accuracy 와 같은 최종 메트릭 세트를 인쇄합니다.

그림 2: 기본 모델 parameter로 실행된 결과 및 메트릭

실행에서 알 수 있듯이 반복에 따라 손실이 감소하는 반면
정확도는 증가하며, 전자는 0으로, 후자는 1로 수렴합니다.


최종 학습 데이터(binary_loss)는 0.211로,
검증 데이터(validation_loss)는 0.29로 수렴했으며,
이는 binary_loss와 다소 비슷하게 추적되었습니다.

반면에, 정확도는 여러 epoch 후에 달라졌는데,
이는 훈련 데이터에 과적합될 수 있음을 시사합니다(아래 플롯 참조).

(참고: 이러한 플롯에 액세스하려면 MLFlow UI를 시작하고 실험 실행을
클릭한 다음 아티팩트 폴더에 액세스하십시오.)

보이지 않는 IMDB 리뷰로 예측했을 때 예측 결과의 평균 정확도는 0.88로
검증 정확도에 가깝지만 여전히 상당히 멀었습니다.
그러나 보시다시피 일부 리뷰의 경우 네트워크는
긍정적인 리뷰의 확률 99%로 결과를 자신 있게 예측했습니다.

그림 3a : 기본 및 Experiment 모델 parameter로 기록 된 Matplotlib 아티팩트
그림 3b : 기본 및 Experiment 모델 parameter로 기록 된 Matplotlib 아티팩트

이 시점에서 기본 모델 메트릭을 관찰한 후 더 잘할 수 있는지 물을 수 있습니다.
더 나은 결과에 영향을 미치기 위해 숨겨진 레이어의 수, epoch, 손실 함수 또는
단위와 같은 일부 튜닝 parameter 조정할 수 있습니까?
몇 가지 추천 Experiment시도해 보겠습니다.

실험 모델: Keras 신경망 성능

MLflow의 추적 구성 요소를 사용하면 다양한 parameter 모델의 실험적 실행을 추적하고
분석을 위해 메트릭 및 아티팩트를 유지할 수 있습니다.
Chollet이 제안한 대로 모델과 다른 다음 실험 사용하여
몇 가지 실행을 parameter default 시작하고 결과를 관찰해 보겠습니다.

모델단위신 기원손실 함수숨겨진 레이어
기지1620binary_crosstropy1개
Experiment-13230binary_crosstropy3
Experiment-23220증권 시세 표시기3

표 1: 모델 및 parameter

로컬 호스트에서 Experiment 실행

로컬 머신에서 MLflow를 실행하고 있으므로 모든 결과가 로컬로 기록됩니다.
그러나 환경 변수를 MLFLOW_TRACKING_URI 설정하거나
mlflow.set_tracking_uri() 를 사용하여 프로그래밍 방식으로 설정하여
Databricks의 호스팅된 추적 서버에서 원격으로 메트릭을 쉽게
기록할 수 있습니다.

추적 URI에 연결하고 결과를 기록합니다.
두 경우 모두 URI는 원격 서버의 HTTP/HTTPS URI이거나
디렉터리의 로컬 경로일 수 있습니다.
로컬 호스트에서 URI는 default mlruns 디렉토리로 .

MLFlow를 사용하여 PyCharm 내에서 Experiment 실행

필자는 Python 개발에 PyCharm을 선호하기 때문에 랩톱의
PyCharm 내에서 Experiment 실행하여 실험적인 parameter제공합니다.
아래는 첫 번째 Experiment의 애니메이션입니다.
(PyCharm 내에서 MLflow를 사용하는 방법을 알아보려면 이전 블로그를 읽어보세요.)

Experiment 필자는 parameter PyCharm의 실행 구성 내에서 제공하여 실행했지만 Experiment 최상위 디렉터리의 명령줄에서 이러한 쉽게 실행할 수도 있습니다.

mlflow 실행 Keras/imdbclassifier -e main -P hidden_layers=3 -P epochs=30
mlflow 실행 Keras/imdbclassifier -e main -P hidden_layers=3 -P 출력=32 -P 손실=mse

https://www.youtube.com/watch?v=Wgt6f6CfpkY
그림 4: Experiment-1 모델 parameter를 사용한 애니메이션 실행

모든 Experiment' 실행이 기록되며, 각 메트릭을 검사하고 다양한 실행을 비교하여 결과를
평가할 수 있습니다. MLflow 추적 API 를 사용하여 이러한 아티팩트를 기록하는 모든 코드는
train_nn.py 모듈에 있습니다. 다음은 부분 코드 조각입니다.

        ....
        mlflow.start_run() 사용:
            # 로그 parameter
            mlflow.log_param("hidden_layers", args.hidden_layers)
            mlflow.log_param("출력", args.output)을 사용합니다.
            mlflow.log_param("에포크", args.epochs)를 사용합니다.
            mlflow.log_param("loss_function", args.loss)를 사용합니다.
            # 로그 지표
            mlflow.log_metric("binary_loss", ktrain_cls.get_binary_loss(기록))
            mlflow.log_metric("binary_acc",  ktrain_cls.get_binary_acc (기록))
            mlflow.log_metric("validation_loss", ktrain_cls.get_binary_loss(기록))
            mlflow.log_metric("validation_acc", ktrain_cls.get_validation_acc (기록))
            mlflow.log_metric("average_loss", 결과[0])
            mlflow.log_metric("average_acc", 결과[1])

# 로그 아티팩트(손실/정확도를 위한 matplotlib 이미지)
            mlflow.log_artifacts(image_dir)
          #log 모델
            mlflow입니다.Keras.log_model(keras_model, model_dir)

print("손실 함수 사용", args.loss)

__name__ == '__main__'인 경우:
    #
    # 기능 테스트에 사용되는 main
    #
    파서 = KParseArgs()
    인수 = parser.parse_args()

    플래그 = len(sys.argv) == 1

플래그가 있는 경우:
        print("기준선 default parameter사용 ")
    다른:
        print("실험적 parameter사용 ")

인쇄 ( "hidden_layers :", args.hidden_layers)
    인쇄 ( "출력 :", args.output)
    인쇄 ( "epochs :", args.epochs)
    인쇄 ( "손실 :", args.loss)
    KTrain().train_models(인수, 플래그)

MLFlow UI와 Experiment 및 결과 비교

이제 가장 좋은 부분입니다. MLflow를 사용하면 세 가지 실행의 메트릭을 모두 비교할 수 있는
MLflow GUI에서 모든 실행 및 기록된 결과를 볼 수 있습니다. MLFlow v0.5.1
최근 UI 개선 사항은 실행 비교에 더 나은 환경을 제공합니다.

localhost:5000 에서 Flask 추적 서버를 시작하려면 명령줄 mlflow ui을 사용합니다 .

그림 5: 모든 실행의 메트릭, parameter및 아티팩트에 대한 MLflow UI 테이블 보기

예를 들어, 세 가지 Experiment' 메트릭을 모두 비교하여 허용 가능한 유효성 검사 정확도 및
손실을 생성한 실행을 확인하고 각 Experiment' matplotlib 이미지를 보고 epoch에 걸쳐
어떻게 진행되었는지 확인할 수 있습니다.

https://www.youtube.com/watch?v=89I0Tro8BAQ
그림 6: 실험적 parameter있는 메트릭의 애니메이션 보기

세 실행의 결과 비교

MLFlow UI에서 실행을 빠르게 검사하면 다음을 쉽게 관찰할 수 있습니다.

  • Epoch 수를 변경해도 모델이 99%의 훈련 정확도에 도달하면서 과적합이 시작되고
    여러 epoch 후에 발산하는 검증 정확도에 해당하는 차이가 없다는 점을 제외하고는
    아무런 이점이 없었습니다.
  • 그러나 손실 함수를 mse, 단위로 32로, 은닉층을 3으로 변경하면 검증 손실이
    더 좋아지고 검증 데이터에 대한 average_loss 이 0으로 수렴됩니다.
    다른 메트릭이 모델 간에 밀접하게 추적됨에 따라 몇 개의 추가 숨겨진 계층과
    더 많은 단위가 유효성 검사 손실을 최소화했습니다.
그림 7: 3개의 실행과 parameter개의 실행 비교

추가 Experiment모델 메트릭 개선

특히 François Chollet은 추가 교육, 검증 및 테스트(TVT)를 통해 95% 이상의 더 높은
정확도를 달성하고 손실을 0.01%로 수렴할 수 있다고 가정합니다.
이를 달성하는 한 가지 방법은 다음과 같은 머신 러닝 기술을 사용하여
추가 Experiment 하는 것입니다. 더 많은 데이터를 추가하고, 단순 홀드아웃 검증,
k-폴드 검증을 수행하고, 가중치 정규화를 추가하고, 드롭아웃 신경망 계층을 추가하고,
신경망 용량을 늘릴 수 있습니다
. 이를 통해 과적합을 최소화하고 일반화를
달성할 수 있으며, 결과적으로 정확도를 높이고 손실을 최소화할 수 있습니다.

여기에서 이러한 기술을 구현하고, 추가 Experiment수행하고,
MLflow를 사용하여 결과를 평가할 수 있습니다.
독자를 위한 연습으로 남겨두겠습니다.

이러한 Experiment 및 반복은 데이터 사이언티스트가 모델을
평가하는 방식의 핵심이므로 MLflow는 이러한 수명 주기 작업을 용이하게 합니다.
이 블로그는 MLflow 기능의 일부를 시연했습니다.

마무리 생각

지금까지 MLflow 추적 구성 요소의 APIs 모델의 무수한 parameter, 메트릭 및 아티팩트를
기록하여 언제든지 또는 누구나 모델의 MLflow Git 프로젝트 리포지토리에서 결과를
재현할 수 있도록 하는 주요 용도를 보여 주었습니다.

둘째, 명령줄, PyCharm 실행 및 MLFlow UI를 통해 다양한 실행을 비교하여
최상의 메트릭을 조사한 결과, 일부 parameter변경하여 긍정적 또는 부정적 리뷰를
표현하는 일반적인 단어를 기반으로 IMDB 영화 리뷰의 감정 분류를 수행하는데
허용 가능한 정확도로 사용할 수 있는 모델에 접근했음을 관찰했습니다.
앞서 언급했듯이 제안된 머신 러닝 기술을 사용하여 모델의 결과를 더욱 개선할 수 있습니다.

마지막으로, 훨씬 더 중요한 것은 로컬 호스트의 PyCharm 내에서 MLflow를 사용하는
Experiment 있지만 원격 서버에서도 Experiment 쉽게 추적할 수 있다는 것입니다.
PyCharm Python 가상 환경의 일부로 설치된 MLflow, Numpy, Pandas, Keras 및
TensorFlow 패키지를 사용하는 이 체계적인 모델 Experiment 반복은 머신 러닝 모델의
수명 주기에서 중요한 단계입니다. 그리고 MLflow 플랫폼은 즐겨 사용하는
Python IDE 내에서 이 중요한 단계를 용이하게 합니다.

다음 단계

기준 모델을 몇 가지 실험적 모델과 비교하고 MLflow의 장점을 확인했으므로
다음 단계는 무엇일까요? 시작하려면 mlflow.org 에 MLflow를 사용해 보세요.
또는 설명서의 자습서 및 예제 중 일부를 사용해 보세요.

자세히 읽기

다음은 자세히 알아볼 수 있는 몇 가지 리소스입니다.

Databricks 무료로 시작하기

관련 포스트

Engineering blog

MLflow를 사용하여 Keras 네트워크 모델을 실험하는 방법: 영화 리뷰의 바이너리 분류

August 23, 2018 작성자: 쥘 담지 in 엔지니어링 블로그
지난 블로그 게시물 에서는 머신 러닝 수명 주기를 관리하는 오픈 소스 플랫폼인 MLflow 를 쉽게 시작할 수 있는 방법을 설명했습니다. 특히 MLflow 및...
모든 엔지니어링 블로그 포스트 보기