TinyML도 결국 머신러닝의 일종..!
TinyML에 필요한 모든 머신러닝 지식들을 빠르게 알아보자🤓
기본적으로 머신러닝은 컴퓨터를 사용하여 과거 관측치에 따라 사물을 예측하는 기술이다.
머신러닝 프로그램을 만드는 것은 일반적인 코드 작성 프로세스와 다르다. 머신러닝 프로그램을 만들기 위해 프로그래머는 데이터를 특수한 종류의 알고리즘에 공급하고 알고리즘이 규칙을 스스로 찾게 한다.
머신러닝 알고리즘은 훈련 이라는 과정을 통해 알고리즘에 제공한 데이터를 기반으로 시스템의 모델 을 구축한다.
모델은 컴퓨터 프로그램의 한 유형이다.
모델이 완성되면 여기에 새로운 데이터를 공급하여 예측을 수행하는데 이 과정을 추론이라 부른다.
머신러닝에는 여러가지 접근 방식이 있는데 TinyML 관련 포스팅에서는 딥러닝 방식에 대해 설명하겠다.
딥러닝에서 시뮬레이션한 뉴런의 네트워크(숫자 배열로 표현)는 다양한 입력과 출력 간의 관계를 모델링하도록 훈련된다.
시뮬레이션된 뉴런의 배열을 아키텍쳐라 하며 다양한 문제에 특화된 다양한 아키텍쳐가 존재한다.
딥러닝 워크플로에는 다음과 같은 작업이 포함된다.
- 목표설정
- 데이터셋 수집
- 모델 아키텍쳐 설계
- 모델 훈련
- 모델변환
- 추론 실행
- 평가와 문제해결
우선 수집할 데이터와 사용할 데이터와 사용할 모델 아키텍쳐를 결정하려면 먼저 예측할 대상을 결정해야 한다.
예를 들어, 공장 기계의 고장 여부를 예측하겠다고 가정해보자.
이러한 과제는 분류 문제의 일종으로 볼 수 있다.
분류 문제는 데이터를 입력받은 후 데이터가 알려진 각 클래스에 포함된 확률을 반환하는 머신러닝 과제의 일종이다.
앞서 설정한 목표에 따라 필요한 데이터를 식별해야 한다.
우선 딥러닝 모델은 문제해결과 관련된 정보만 사용하여 모델을 훈련하는 것이 가장 좋다
데이터 포함 여부를 결정할 때는 항상 도메인 전문 지식을 실험에 반영해야 한다. 통계기법을 사용하여 중요한 데이터를 식별할 수도 잇다. 그래도 특정 데이터 소스를 포함시킬지 확실하지 않다면 두 가지 모델을 훈련시키고 그중 가장 적합한 모델을 선택하는 것도 좋은 방법이다.
도메인 지식 없이 데이터 마구 수집했다가 낭패볼 뻔한 적이 매우 많다...(그게 바로 나)
데이터는 많을수록 좋다
시스템에서 발생할 수 있는 모든 조건과 이벤트를 나타내는 데이터를 수집해야 한다.
시간이 지남에 따라 변수가 자연스럽게 변하면 전체 범위를 표현할 수 있는 데이터를 수집해야 한다.
모델이 입력을 분류하는 방법을 배울 수 있도록 훈련과정에서 데이터 레이블링을 해주어야 한다.
훈련 중 데이터의 의미를 알고리즘에 지시하는 이러한 유형의 훈련을 지도학습이라고 한다. 지도학습을 통해 만들어진 분류 모델은 들어오는 데이터를 처리하고 어느 클래스에 속하는지 예측할 수 있다.
아키텍쳐를 결정할 때는 해결하려는 문제의 유형, 접근할 수 있는 데이터의 유형, 데이터를 모델에 공급하기 전에 해당 데이터를 변환할 수 있는 방법을 고려해야 한다.
가장 효과적인 아키텍처는 작업 중인 데이터의 유형과 관련이 있기 때문에 데이터 유형을 잘 파악하자.
모델을 실행할 장치의 제약조건도 고려해야 한다. 마이크로컨트롤러는 일반적으로 메모리가 제한적이고 프로세서 속도가 느리다.
TinyML에는 몇 개의 뉴런 층으로 간단한 모델을 훈련한 다음 유용한 결과를 얻을 때까지 반복적인 프로세스로 아키텍처를 개선하는 방법을 적용할 수 있다.
딥러닝 모델은 텐서 현태로 입력을 받고 출력을 생성한다. 텐서는 숫자나 다른 텐서를 폼함할 수 있는 목록으로 배열과 비슷하다고 생각할 수 있다.
머신러닝에서 특징이라는 용어는 모델이 학습되는 특정한 유형의 정보를 나타낸다. 서로 다른 모델은 서로 다른 특징을 통해 훈련된다.
예를 들어, 이미지를 처리하도록 설계된 모델은 이미지 데이터의 다차원 텐서를 입력으로 받을 수 있다.
위의 사진처럼 시계열 데이터는 각각 다른 시간 간격으로 수집되므로 주어진 순간에 사용 가능한 데이터만 전달하면 사용 가능한 모든 데이터가 포함되지 않을 수 있다.
각 시계열 데이터에 대해 창 안의 모든 값을 평균하고, 현재 창에 데이터 포인트가 없는 값에 대해서는 직전의 값을 가져오면 단일 값 집합이 만들어진다. 창에 비정상 레이블이 있는지에 따라 이 스냅숏에 레이블을 지정하는 방법을 결정해야 한다.
윈도잉을 활용한 접근은 단순한 방식으로, 비정상적인 동작을 예측하기 위해 모델을 사용해서 추론하는 동안에는 데이터에서 가장 최근의 창을 계산하고 모델을 통해 이를 계산하여 예측을 확인할 수 있다.
일반적으로 신경망에 공급하는 데이터는 부동소수점값 또는 부동소수점으로 채워진 텐서형태이다.
만약 입력 텐서가 매우 다른 범위에 있다면 입력값들을 네트워크에 전달하기위해 값이 모두 비슷한 범위에 있도록 정규화해야 한다.
이를 수행하는 방법은 데이터셋에서 각 특징의 평균을 계산하고 값에서 빼는 것이다.
훈련은 모델이 주어진 입력 세트로 올바른 출력을 생성하는 방법을 배우는 과정이다.
모델이란 시뮬레이션 된 뉴런의 네트워크이다.
이는 여러 레이어에 걸친 숫자 배열로 표현된다.
이 숫자를 가중치나 편향 또는 통칭하여 네트워크의 파라미터라 한다.
훈련 중에는 데이터의 배치(batch)를 모델에 공급하고 모델의 출력을 원하는 출력(레이블)과 비교한다.
역전파 알고리즘은 시간이 지남에 따라 모델 출력이 원하는 값과 일치하도록 가중치와 편향을 점진적으로 조정한다.
훈련은 에폭(epoch) 단위로 진행되며 인위적으로 멈추기 전까지 계속된다.
모델이 정확한 예측을 하기 시작한 시점부터는 모델이 수렴했다고 표현한다.
모델이 수렴했는지 확인하기 위해 훈련중인 모델의 그래프로 분석할 수 있다. 이때 확인하는 일반적인 성능 지표 두 가지가 손실과 정확도이다.
모델 성능을 개선하기 위해 모델의 아키텍쳐를 변경하고 훈련 과정을 조정하는 데 사용되는 다양한 값을 조정할 수 있다. 이러한 값을 통칭하여 하이퍼 파라미터라 한다. 여기에는 훈련의 에폭 수 , 각 레이어의 뉴런 수 같은 변수가 포함된다.
모델이 과소적합 상태라는 것은 충분한 패턴을 학습하지 못하여 좋은 예측을 할 수 없는 상태임을 나타낸다.
이는 일반적으로 아키텍쳐가 너무 작아 모델링해야 하는 시스템의 복잡성을 포착하기에 충분하지 않거나, 충분한 데이터로 학습을 하지 못했기 때문이다.
모델이 과적합 상태하는 것은 훈련 데이터를 너무 외우듯이 잘 배웠다는 뜻이다.
훈련 데이터를 입력으로 받을 떄는 레이블에 맞는 출력을 정확하게 예측할 수 있지만, 이전에 보지 못한 데이터까지 예측할 수 있는 일반화된 모델로 작동할 수 없다.
과적합을 방지하는 방법에는 여러 가지가 있다.
그 중 하나는 훈련 데이터를 그대로 표현할 수 있는 용량을 갖지 못하도록 모델의 크기를 줄이는 방식이다.
그리고 일반화로 알려진 일련의 기법을 훈련에 적용하면 과적합의 정도를 줄일 수 있다.
제한된 데이터를 최대한 활용하기 위해 데이터 증식이라는 기술을 사용하면 기존 데이터를 나누고 쪼개서 인위적으로 새로운 데이터 포인트를 생성할 수 있다.
그냥 외워야겠다. 데이터는 다다익선이다
모델이 훈련이 잘되었는지 확인해 볼려면 훈련에 사용되지 않은 새로운 데이터를 사용하여 모델을 검증해야 한다.
일반적인 데이터 분할은 전체 데이터셋의 60%를 훈련에, 20%를 검증에, 그리고 20%를 테스트에 할당한다.
이러한 분할은 각 부분에 동일한 정보 분포가 포함되도록 하고 데이터 구조를 보존하는 방식으로 이루어져야 하낟.
훈련 손실과 검증 손실을 시간에 따라 비교하면 모델이 과적합으로 빠지는지 확인할 수 있다.
위으 사진은 과적합 된 모델을 보여준다. 이는 모델이 학습 데이터를 점점 더 잘 예측하지만 새로운 데이터를 잘 예측할 수 있는 능력은 상실한다는 것을 의미한다.
텐서플로 모델은 기본적으로 출력을 생성하기 위해 인터프리터에 데이터를 변환하는 방법을 알려주는 일련의 명령어다. 모델을 메모리에 로드하고 텐서플로 인터프리터를 사용하여 실행하면 모델을 사용할 수 있다.
TinyML을 위해 텐서플로는 소형 저전역 장치에서 모델을 실행하기 위한 인터프리터와 도구를 제공한다. 이러한 도구를 텐서플로우 라이트라고 한다.
텐서플로우 라이트가 모델을 실행하려면 먼저 텐서플로우 라이트 형식으로 변환을 해야 하는데, 이를 위한 변환도구를 텐서플로우 라이트 컨버터이다.
컨버터는 모델의 크기를 줄이고 성능을 저하시키지 않으면서고 더 빠르게 실행하기 위한 특수 최적화 기능도 갖추고 있다
모델 변환이 끝났다면 이제 모델 배포를 한다. 모델이 애플리케이션 코드와 결합해야 하기 때문에 센서에서 원시 입력 데이터를 가져와 모델의 훈련 데이터와 동일한 형식으로 변환하는 코드를 작성해야 한다. 그런 다름 변환된 데이터를 모델로 전달하여 추론을 실행한다.
모델이 테스트 데이터를 정확하게 예측한다는 사실은 이미 입증했지만 실제 현장에서의 성능은 다를 수 있다.
이유는 다양하다. 훈련에 사용된 데이터가 실제 현장에서 얻을 수 있는 데이터와 다르다거나 , 실험자도 모르게 모델이 과적합에 빠졌을 수도 있다.
이를 해결하기 위해선,
첫째, 모델 데이터에 영향을 줄 수 있는 하드웨어 문제 (ex. 센서 노이즈, 예기치 않은 노이즈)를 배재한다.
둘째, 모델이 배포된 장치에서 일부 데이터를 받아서 원래 데이터셋과 비교하고 동일한 환경에 있는지 확인한다.
환경이 문제가 아니라면 과적합 문제일 가능성이 높다.
하드웨어 문제가 아닌것이 확인된다면 과적합에 대한 최선의 해결책은 더 많은 데이터를 훈련에 투입하는 것이다. 이 과정에서 일반화, 데이터 증식 기술을 적용하면 보유한 데이터를 최대한 활용할 수 있다.
TinyML 개발을 위해 최소한으로 알아야 할 머신러닝 용어/지식에 대해 알아보았다!😵💫😵💫
아두이노 보드에 모델 배포하는 그 순간까지,, 아자아자 홧팅이닷!