Python에서 기계 학습 모델의 복잡성을 명시 적으로 측정 할 수있는 방법이 있습니까?
저는 모델 디버그에 관심 이 있으며 권장하는 포인트 중 하나는 가장 복잡한 모델에서 성능이 실질적으로 더 나은지 확인하기 위해 모델을 "덜 복잡한"모델과 비교하는 것입니다.
내 질문을 제기합니다.
분류 작업을위한 앙상블 모델 과 선형 모델 이 있다고 가정합니다. "앙상블 모델이 선형 모델보다 더 복잡하다고 생각하는 것은 당연한 것 같습니다."
그러나 두 개 이상의 모델을 그러한 용어로 비교할 수 있도록 모델의 복잡성을 수치 적으로 측정하는 방법은 무엇일까요?
그러한 작업에 도움이 될 수있는 파이썬 구현이 있습니까?
답변
모델 복잡성을 측정하는 모델 불가지론 적 방법에 대해 들어 본 적이 없습니다. 몇 가지 전략이 있지만 모델에 따라 다릅니다.
다양한 모델 제품군을 사용하여 문제를 해결할 수 있습니다.
들어 선형 모델 당신이 사용하는 제로가 아닌 매개 변수의 수를 셀 수 있습니다. 예측에 사용 된 기능의 수입니다.
대한 의사 결정 나무 는 나무가 얻을 수있는 최대 깊이를 셀 수 있습니다.
들어 신경망 당신은 당신의 NN이 최적화되는 매개 변수의 수를 셀 수 있습니다.
들어 앙상블 방법 당신은 모델에 사용 된 다른 약한 학습자의 집계를 사용할 수 있습니다 (임의 숲, 그라데이션 강화).
파이썬 구현의 경우 측정하려는 모델에 따라 여러 구현이 있습니다. 당신이 눈치 채면 그들 중 일부는 정말 측정하기 쉽습니다.
서로 다른 모델 패밀리 간의 복잡성을 직관적으로 비교하기가 어렵습니다. 계수가 4 개인 선형 회귀 또는 max_depth = 3 인 의사 결정 트리가 더 복잡한 것은 무엇입니까?
딥 러닝 복잡성에 관한 주제 인 Hinton, Oriol, Jeff Dean 은 신경망 지식을 증류 하는 논문을 발표했습니다 . 신경망의 복잡성 단순화에 대해 이야기하는 곳.
다소 순진하지만 가장 먼저 떠오르는 아이디어는 학습 중에 추정해야하는 매개 변수의 수를 계산하는 것입니다. 더 많은 값을 추정해야할수록 모델이 더 복잡해집니다. 가설 공간이 더 크기 때문입니다. . 예를 들어 선형 모델에는$n+1$ 매개 변수 ( $n$기능의 수), 앙상블 모델에서 필요한 매개 변수의 수는 모든 학습자에 대한 매개 변수 수의 합계이므로 더 높을 수 있습니다. 이 아이디어는 매개 변수 값의 범위를 고려하여 수정 될 수 있습니다.
매우 대략적인 근사치로 파이썬에서 모델을 나타내는 객체의 크기를 간단히 계산할 수 있습니다 (모델의 표현이 공간 효율적이라고 가정하면 항상 그런 것은 아닙니다).
아시다시피, "복잡성"은 컴퓨터 과학에서로드 된 용어입니다. 일반적으로 복잡성은 "big-O 표기법"으로 측정되며 입력 수가 증가함에 따라 솔루션이 시간에 따라 확장되는 방식과 관련이 있습니다. 예를 들어, 이 게시물 은 컨볼 루션 레이어의 계산 복잡성에 대해 설명합니다.
그러나 딥 러닝에서 경쟁하는 신경망 아키텍처는 일반적으로 동일한 유형의 문제 (예 : ImageNet 분류)에 동일한 알고리즘 (역 전파)을 적용합니다. 유일한 차이점은 아키텍처입니다. 또한 대부분의 아키텍처는 유사한 계산 요소 (예 : 컨볼 루션 레이어 및 선형 레이어)를 사용합니다. 따라서 복잡성에 대한 기준 으로 매개 변수 의 수 를 사용하는 것이 관례 입니다. 이것은 근사치 일뿐입니다. 두 네트워크는 동일한 수의 매개 변수를 가질 수 있지만 다른 수의 작업이 필요할 수 있습니다. 그러나 일반적으로 서로 다른 아키텍처가 위에서 언급 한 유사성을 가지고 있지만 크기가 몇 배 정도 다를 수 있다는 점을 감안할 때 일반적으로 좋은 근사치입니다.
참고로 EfficientNet 백서의 그림 1을 고려하십시오 . 그들은 훈련 가능한 매개 변수의 수를 "모델 크기"의 기준으로 사용하고 매개 변수의 수가 런타임과 선형 적으로 상관 관계가 있다는 점에 주목합니다.
학습 가능한 매개 변수의 수를 계산하는 Python 함수의 경우 Keras, Tensorflow, PyTorch 등을 사용하는지 여부에 따라 달라집니다. Keras에서 이것은 한 줄 model.count_params()
입니다. PyTorch model.parameters()
에서는 여기에 설명 된 대로 계산할 수 있습니다 .
여기에서 다른 답변에서 언급했듯이 모델 복잡성에 대해 이야기 할 때 일반적으로 모델이 학습하는 매개 변수의 수에 대해 생각합니다. 덜 복잡한 모델과 비교하는 것에 대해 이야기 할 때, 이는 종종 직관적으로 덜 복잡한 모델 (예 : 뉴런 수가 적은 신경망과 같은 동일한 클래스의 모델 또는 선형 모델과 같은 단순한 클래스의 모델 중 하나)과 비교하는 것을 의미합니다. 임의의 숲이 아니라).
매우 다른 모델 간의 모델 복잡성을 생각하는 한 가지 방법은 Kolmogorov Complexity 이며 저장된 (예 : 절인) 모델이 차지하는 공간의 양을 확인하여 대략적으로 계산할 수 있습니다. 제공 한 예에서 앙상블이 선형 모델보다 단순하지 않은 경우 (예 : 학습 된 계수가 각각 10 개인 두 선형 모델의 앙상블과 학습 된 계수가 200 개인 선형 모델의 앙상블) 선형 모델보다 더 많은 디스크 공간을 차지합니다.
한 가지 옵션은 매개 변수 수에 페널티를주는 동안 최대화 된 가능성으로 측정 된 모델링 적합도에 대한 보상을 시도하는 모델 선택 기준 인 베이지안 정보 기준 (BIC) 입니다.
BIC 구현 중 하나가 RegscorePy패키지에 있습니다.
1. 그러나 두 개 이상의 모델을 그러한 관점에서 비교할 수 있도록 모델의 복잡성을 수치 적으로 측정하는 방법은 무엇일까요?
VC 차원을 사용하여 숫자 형식으로 모델의 복잡성을 측정 할 수 있습니다. Wikipedia에서 Vapnik–Chervonenkis 차원을 참조하십시오 .
2. 그러한 작업에 도움이 될 수있는 파이썬 구현이 있습니까?
VC 차원에 대해 설명하는 스택 교환 링크가 이미 있습니다. VC 차원을 계산하는 방법은 무엇입니까?