eBook

딥러닝 실용 안내서: 데이터부터 시작해 배포까지

챕터 5

딥러닝 모델의 테스트 및 배포


딥러닝 워크플로는 데이터를 분류할 수 있는 모델을 얻는 것으로 끝나지 않습니다. 이 모델이 미지의 데이터에 대해 작동하고, 다른 시스템 구성요소와도 예상대로 상호작용할 것이라는 믿음을 가질 수 있어야 할 것입니다. 이 챕터에서는 특정한 성능 특성을 요구하는 타겟 기기에 모델을 배포하는 방법을 알아봅니다.

섹션

신경망을 다른 시스템 논리와 통합하고 테스트하기

앞 챕터에서는 3축 가속도 데이터에서 하이 파이브를 인식하도록 신경망을 훈련했습니다. 그러나 신경망은 성공적인 하이 파이브 카운터에 필요한 전체 논리의 일부분에 불과합니다. 시스템에는 최소한 다음과 같은 작업을 수행할 논리가 필요합니다.

  • 센서로부터 가속도 읽기
  • 센서 데이터를 스케일로그램으로 전처리
  • 스케일로그램을 신경망으로 전달
  • 레이블이 지정된 하이 파이브 개수 계수(패턴이 스케일로그램을 지나면서 하나의 하이 파이브 동작이 두 번으로 계수되지 않도록 하는 논리도 포함)
dl-engineers-ebook-ch5-high-five-counter-logic-simulink

위: Simulink의 하이 파이브 카운터 논리 표현 아래: 상단 플롯은 가속도계에서 읽어 들인 데이터, 가운데 선(녹색)은 하이 파이브로 레이블이 지정된 스케일로그램, 하단 플롯은 계수된 하이 파이브 개수를 나타냅니다.

이제 신경망과 기타 시스템 논리가 제대로 작동하는지 알아보는 것이 합리적이고, 바로 여기서 테스트의 역할이 중요해집니다. 하이 파이브 카운터의 경우, 훈련 과정에서 40개의 검증 영상을 이용하여 모델의 정확도를 평가하였고 40개 중에 1개만 잘못 레이블을 지정했기 때문에 신경망 자체가 일정한 방식으로 작동한다는 점을 알 수 있습니다.

dl-engineers-ebook-ch5-validation-accuracy

시작점으로는 좋습니다만, 비록 이 모델이 40개의 검증 영상에 대해 작동한다는 신뢰가 어느 정도 있다고 해도 아직 접하지 못한 영상에 대해서도 제대로 작동할지는 알 수 없습니다. 따라서 신경망의 정확도가 전체 해 공간에 걸쳐 적절한 수준인지 확인하기 위해, 훈련 중에 사용한 검증 데이터셋 이외에도 테스트 데이터셋을 사용하게 됩니다.

하이 파이브 카운터의 경우, 훈련 중에 신경망이 수렴하는지 검증하기 위해 40개의 영상으로 충분했습니다만 실제로 신경망이 접하게 될 모든 팔 동작을 포괄하기에는 충분하지 않았습니다. 이 신경망을 현장에 배포하기 전에 추가적인 테스트가 필요합니다. 그런 다음, 시스템을 테스트한 후 구현에 신뢰를 갖게 되었다면 Simulink Coder™를 사용하여 임베디드 C 코드를 구축하고, 심층 신경망을 포함한 이 모든 논리를 팔에 배포할 수 있습니다.

테스트의 일부는 하이 파이브 동작이나 하이 파이브 이외의 동작 등 시계에서 경험할 수 있는 다양한 팔 동작을 체계적으로 모두 시험해 보는 것입니다. 대표적인 훈련 세트를 구축하고 전체 해 공간을 포착하기 위해서는 가능하면 다양한 사람이 참여하는 것이 좋습니다. 시스템이 사용자 동작을 오분류하는 경우마다 그 데이터를 따로 저장하고 그것을 훈련 데이터셋에 추가하여 신경망을 재훈련하고 미세 조정할 것입니다.

중요한 점은 전체 해 공간의 부분 집합을 샘플링함으로써 완벽하게 기능하는 신경망을 갖게 된다고 보장할 수는 없지만, 그것이 작동할 것이라는 신뢰를 가질 수 있는 범위가 늘어나게 된다는 점입니다. 이것이 바로 심층 신경망에 대한 표준 접근 방식입니다. 현재 심층 신경망을 검증하는 체계적인 최적의 방법은 없습니다. 그래서 전체 해 공간에 걸쳐 신경망에 대한 신뢰를 갖기 위해 보통 몬테카를로 접근법 같은 샘플링 방법에 의존하게 됩니다.

재료 결함을 찾든, 오디오에서 음성 명령을 추출하든, RF 변조 방식을 분류하든, 여러분의 프로젝트에 대해서도 몬테카를로 접근법으로 테스트하게 될 가능성이 높습니다. 훈련된 신경망을 전체 시스템에 통합하고 다양한 상황에서 테스트하게 될 것입니다.

중요한 점은 여러분이 아무리 많은 테스트를 실행하더라도 테스트하지 않은 해 공간은 항상 있을 것입니다.

dl-engineers-ebook-ch5-monte-carlo

전체 해 공간을 테스트하기 위한 몬테카를로 접근법. 일부 해에 대해 신경망을 테스트했지만 대부분의 해는 테스트되지 않았습니다.

이 부분에서 합성 데이터가 강력한 역할을 할 수 있습니다. 신경망을 훈련하기 위해 RF 데이터를 합성하는 방법은 챕터 2에서 살펴보았습니다. 이와 유사하게 여러분은 합성 데이터를 이용하여 수백만 개의 다른 테스트 케이스를 생성하고 아주 조밀한 해 공간 샘플링을 생성할 수 있습니다. 이로써 시스템에 대해 높은 신뢰를 가질 수 있게 됩니다.

dl-engineers-ebook-ch5-monte-carlo-synth-test-data

전체 해 공간을 테스트하기 위한 몬테카를로 접근법. 합성 테스트 데이터로 더 많은 해 공간을 빠르게 포괄할 수 있습니다.

하이 파이브 프로젝트에서는 팔 동작으로 가능한 모든 가속 패턴을 정확하게 모델링하기 어렵고 어떤 동작이 하이 파이브인지 알기 어렵기 때문에 데이터 합성이 어려울 것입니다. 일부 프로젝트에서 테스트 데이터를 합성하는 것보다 신경망을 물리적으로 테스트하는 것이 더 쉬운 이유가 바로 이것입니다.

테스트 데이터를 합성할 수 있는지 여부와 무관하게, 궁극적으로는 실제 하드웨어에서 시스템을 테스트해야 할 것입니다.

섹션

신경망 배포

만약 여러분의 코드가 타겟 하드웨어에서 작동하지 않는다면 시뮬레이션에서 작동하는지는 중요하지 않습니다.

여러분의 코드가 타겟 하드웨어에서 실행될지 확인하는 과정에는 신경망의 크기와 실행 속도를 평가하는 과정이 수반됩니다. 신경망의 크기가 너무 크거나 실행 시간이 너무 오래 걸린다면 더 작은 사전 훈련된 신경망으로 시작할 수 있습니다. SqueezeNet(1백만 개의 파라미터)으로 전이 학습을 진행한다면 과연 GoogLeNet(7백만 개의 파라미터)을 사용한 프로젝트만큼 잘 작동할까요?

dl-engineers-ebook-ch5-pretrained-size

신경망이 여전히 너무 크다면 더 작은 사전 훈련된 신경망을 찾아보는 대신에, 가지치기나 양자화를 통해 신경망의 크기 축소를 시도할 수 있습니다.

가지치기는 여러분의 특정 데이터 분류에 크게 기여하지 않는 일부 신경망 파라미터를 제거하는 것입니다.

양자화는 신경망에서 단일 정밀도 또는 이중 정밀도 가중치와 편향을 취해 그것들을 8비트로 스케일링한 정수 데이터형으로 양자화하는 것입니다. 고정밀도 데이터형을 사용하지 않고도 신경망에서 동일한 성능을 얻을 수 있다는 것이 골자입니다. 더 자세한 내용은 int8 양자화 소개 및 심층 신경망 분야에서 int8 양자화가 인기 있는 이유를 참조하십시오.

신경망을 축소하는 것이 어떤 의미인지 알 수 있도록 하나의 예를 들자면 아래에서 심층 신경망 양자화기 앱을 사용하여 하이 파이브 신경망을 8비트로 스케일링한 정수로 양자화한 결과를 볼 수 있습니다. 실행 시간은 몇 분 정도 걸렸으며, 그 후에 신경망은 75% 압축되었고 정확도에는 거의 차이가 없었습니다.

dl-engineers-ebook-ch5-deep-network-quantizer

사전 훈련된 신경망, 전이 학습, 가지치기, 양자화를 통해 여러분의 응용 사례에 맞는 적절한 크기와 효율성을 가진 모델을 얻을 수 있다는 것을 알 수 있습니다.

신경망이 여전히 너무 크다면, 최후의 방법은 처음부터 새로 신경망 아키텍처를 구축하는 방법입니다. 시작할 때 신경망은 아무 개념이 없기 때문에 모든 것을 학습해야 하므로 이 방법은 가장 많은 훈련 데이터와 가장 긴 훈련 시간이 필요합니다.

또 다른 단점은 처음부터 새로 효율적인 신경망을 만들려면, 다양한 신경망 아키텍처를 완벽하게 이해하고 있어야 한다는 점입니다.

섹션

요점

여러분의 응용 사례에 맞는 딥러닝을 고려할 때는 신경망의 아키텍처, 훈련 데이터에 대한 액세스, 시뮬레이션 사용 여부, 신경망에 대한 신뢰를 얻는 방법, 시스템 전체에 대해 생각해야 합니다.  

모든 프로젝트에 맞는 획일적인 답은 없지만, 딥러닝의 이점과 가능성을 볼 수 있었을 것입니다. 아마 여러분은 데이터에 있는 복잡한 패턴을 감지하고 레이블을 지정할 수 있어야 하는 공학 문제에 대한 해답을 현재 고민하고 계실지도 모릅니다. 만일 그렇다면, 딥러닝을 한 가지 접근법으로 고려해 볼 수도 있습니다. 생각보다 쉬울 수도 있습니다.