[Ⅲ. Structuring Machine Learning Projects] Error Analysis (1)
Structuring Machine Learning Projects
Error Analysis
Carrying Out Error Analysis
만약 학습 알고리즘이 인간이 할 수 있는 일을 수행하도록 하고 싶을 경우 또는 현재 여러분의 학습 알고리즘이 인간의 성과에 아직 못 미치는 경우 알고리즘이 하는 실수를 수동으로 점검하면 다음으로 무엇을 해야 할지에 대한 인사이트를 얻을 수 있습니다. 이런 절차를 오류 분석이라고 합니다.
고양이 분류기로 개발 세트에서 90%의 정확도 또는 같은 의미로 10%의 오류를 얻었다고 합시다. 그리고 이 수치가 원하던 것에 훨씬 못 미친다고 해 봅시다. 이런 경우 팀원이 알고리즘의 분류 오류 예제 일부를 살펴보고 개를 고양이로 잘못 분류하고 있었다는 것을 발견할 수 있습니다.
이 두 개의 경우에는 개들이 약간 고양이처럼 보일 수 있습니다. 적어도 처음 볼 때는 말이죠. 팀원이 이를 보고 특히 개에 대해 알고리즘을 강화하는 방법을 제안할 수도 있습니다. 노력을 집중하는 경우를 생각하면 되는데요. 개 사진을 더 모은다거나 개 고유의 특성을 설계할 수 있습니다. 고양이 분류기가 개를 더 잘 분류하도록 하여 개를 고양이로 틀리게 인식하는 경우를 방지하기 위함이죠.
그러면 이제 바로 개 문제에 대해 프로젝트를 시작해야 할까요? 알고리즘에서 강아지 사진을 잘못 인식하는 것을 줄이기 위해 몇 달이 걸릴 수도 있습니다. 과연 이런 노력을 할 가치가 있을까요? 이런 과정을 진행하는데 수개월을 소비한 뒤 결과적으로 별로 도움이 되지 않았다는 것을 깨달을 수 있습니다. 이런 노력이 가치 있는지를 빠르게 알려줄 수 있는 오류 분석 절차가 있습니다.
추천드리는 부분은 이렇습니다. 먼저 대략 100개의 잘못 표기된 개발 예시를 수동으로 검사합니다. 한 개씩 세어 개발 세트에서 잘못 표기된 것 중 몇 개가 실제로 개 이미지인지 확인합니다. 이제 100개의 잘못 표기된 개발 세트 예시 중 5%가 개 이미지라고 해 봅시다. 즉 100개의 잘못 표기된 개발 세트 예시 중 5개가 개 이미지라면 개 문제를 완전히 해결한다 해도 100개 중에 오직 5개만 더 정확해진 것입니다.
다시 말해 만약 오류 중 5%만이 개 사진이라고 했을 때 많은 시간을 들여서 얻을 수 있는 것은 오류가 10%에서 9.5%로 내려갈 수도 있는데요. 이것은 상대적으로 5%가 줄어든 것입니다 10%에서 9.5%로 줄어든 것이 말이죠. 따라서 합리적으로 보면 이는 효율적인 시간 투자가 아니라고 생각할 수도 있습니다.
아니면 적어도 상한선을 설정하니 좋을 수도 있겠죠. 개 문제에 대해 얼마까지 성능을 개선할 수 있는지에 대한 상한선이요 그렇죠? 머신 러닝에서는 이를 성능 상한이라고 합니다. 즉 최선의 케이스가 무엇인가 하는 것입니다. 개 문제에 노력을 들이는 것이 얼마나 가치가 있는지
그럼 이제 다른 경우를 가정해 봅시다. 100개의 잘못 표기된 개발 세트 예시 중 50장이 실제로 개 이미지인 경우입니다. 즉 50%가 개 사진인 것입니다. 이런 경우 개 문제에 시간을 투자하는 것이 조금 더 긍정적으로 다가올 것입니다. 이런 경우 개 문제를 해결하게 되면 오류가 10%에서 5%로 줄 수 있기 때문이죠. 그러면 오류를 반으로 줄이는 것이 노력할 가치가 있다고 생각할 수 있습니다. 잘못 표기된 개 사진 수를 줄이는 데 집중하는 것 말이죠.
머신 러닝에서는 가끔 수작업으로 일을 해결하거나 너무 많은 밸류 인사이트를 사용하는 것을 낮게 평가합니다. 하지만 응용 시스템을 만드는 경우 이렇게 간단히 숫자를 세는 것으로 오류를 분석하면 시간을 상당히 절약할 수 있습니다. 가장 중요한 것이 무엇인지 주로 집중해야 할 방향은 무엇인지 결정하기 위해서죠.
가령 100개의 잘못 표기된 개발 세트 예시를 살펴보는 것은 어쩌면 5분에서 10분 정도만 할애하면 됩니다. 수동으로 100개의 샘플을 확인해서 수동으로 개 사진의 수를 세는 데 소요되는 시간이 말이죠. 결과에 따라 5%인지 50%인지 혹은 기타인지 확인도 가능합니다. 5분에서 10분 내에 업무 방향의 효용성을 예측할 수 있습니다.
이렇게 하면 훨씬 더 나은 결정을 내릴 수 있습니다. 잘못 표기된 개 이미지에 해결책을 찾기 위해 향후 수개월을 들일 것인가를 결정할 수 있지요. 한 아이디어 평가를 위해 이번 사례에서는 개 문제가 되겠죠. 이어서 오류 분석을 사용하는 것이 가치 있는지 설명드리겠습니다.
가끔은 여러가지 아이디어를 평행으로 오류 분석해 평가할 수 있습니다. 예를 들어 고양이 이미지를 감지하는 데 몇 가지 아이디어가 있다고 해 봅시다. 개 이미지 인식 성능을 개선하는 게 한 방법이겠죠?
또는 큰 고양이라고도 하는 사자, 표범, 치타 등이 작은 고양이나 집고양이로 인식되는 경우도 있는데요. 이런 부분을 개선할 수도 있습니다. 또는 이미지가 흐릿한 경우에 대비해 선명하지 않은 이미지에서 잘 작동하는 알고리즘을 디자인할 수도 있습니다. 이를 실행하기 위한 생각이 있으실 수도 있겠죠.
이런 3가지의 아이디어 평가를 위해 오류 분석을 진행하려면 저같은 경우 이렇게 생긴 테이블을 만들 것입니다. 저는 보통 스프레드시트에서 진행하는데요 일반 텍스트 파일을 사용하셔도 됩니다. 왼쪽에서는 수동으로 작업하려는 이미지들로 들어가는데요. 사진 100개를 보는 경우 1에서 100까지 갈 겁니다. 스프레드시트에서 이 테이블의 세로 줄은 평가하려는 아이디어에 해당합니다. 즉 개 문제, 큰 고양이 문제 흐릿한 이미지 문제죠 또 저는 보통 스프레드시트에서 코멘트를 위한 공간을 남겨둡니다.
그러니 기억하세요. 오류분석 진행 중에는 알고리즘이 잘못 분류한 개발 세트 예시를 보고 있을 뿐이라는 것을요. 만약 첫번째로 잘못 인식된 이미지가 개 사진이였을 경우 여기에다 체크로 표시할 것입니다. 그리고 이 이미지를 기억하기 위해 여기 이렇게 코멘트란에 메모를 남겨둘 것입니다.
예를 들어 이미지가 핏불 사진이었을 수 있죠. 두번째 사진이 흐릿했다면 여기에 메모를 남깁니다. 세번째 사진이 비오는 날 동물원에서 찍은 사자의 이미지라면 잘못 인식된 것입니다. 아주 큰 고양이가 흐릿하게 찍힌 것이죠. 코멘트란에 이렇게 적습니다. 비오는 날 동물원 비로 인해 사진이 흐릿하게 나옴 등으로요.
마지막으로 이미지 세트를 어느 정도 리뷰하셨다면 알고리즘의 몇 퍼센트가 또는 이 각각의 오류 카테고리 중 몇 퍼센트가 개, 큰 고양이, 흐릿한 이미지에 기인했는지 셉니다. 가령 개 8% 큰 고양이 43% 흐릿한 이미지 61%일 수 있습니다. 각 세로줄을 따라 내려가면서 해당 줄에서 이미지 몇 퍼센트에 체크가 되어 있는지 세는 겁니다.
이걸 어느 정도 마치셨다면 또 다른 범주에 해당하는 실수를 발견할 수 있는데요. 예를 들어 인스타그램 스타일 필터 이런 화려한 필터들이 분류기를 혼란스럽게 하는 경우가 있을 수 있습니다. 그런 경우 진행 과정에서 세로줄을 이렇게 하나 더 추가하셔도 됩니다. 멀티컬러 필터, 인스타그램 필터 스냅챗 필터에 대한 세로줄이요. 그런 뒤 여기에 해당하는 개수를 다시 세고 새로운 오류 카테고리에서 몇 퍼센트의 오류가 발생하는지 확인합니다.
이런 절차를 모두 마치면 이렇게 다른 종류의 오류 카테고리에 대한 수정 작업이 얼마나 가치 있는지 추정할 수 있습니다. 예를 들어, 이 예시에서는 흐릿한 이미지에 대한 오분류가 많고, 큰 고양이에 대한 오분류도 꽤 많았습니다. 이 분석의 결론은 흐릿한 이미지에 대한 수정 작업을 해야 한다는 것이 아닙니다. 수학 공식처럼 단순히 뭘 어떻게 하라고 알려주는 건 아니고 전반적으로 가장 선택하기 좋은 옵션에 대한 감각을 제시해주는 것이죠.
또한 이런 내용도 말해줍니다. 예를 들어 아무리 개나 인스타 필터를 잘 분류한다 해도 성능 개선이 8%나 12%밖에 안 된다는 것입니다. 한편 큰 고양이나 흐릿한 사진을 작업하면 더 많은 진전이 있겠죠.
또 성능 개선과 관련해서는 상한선이 존재하는데요. 큰 고양이나 흐릿한 이미지 분류 개선에 대한 아이디어가 몇 개 있는지에 따라 두 개 중 하나를 고를 수도 있겠고 팀원이 충분해 팀을 두 개 꾸릴 수도 있겠지요. 한 팀은 큰 고양이에 대한 오류를 개선하고 다른 한 팀은 흐릿한 이미지 오류를 개선하는 것입니다.
이렇게 수동으로 세는 방법은 주로 몇 시간이면 처리가 가능하지만 우선순위를 정하는 데 많은 도움이 되고 다양한 접근 방식의 효용성도 측정할 수 있는 좋은 방법입니다.
요약하자면 오류 분석을 위해서는 먼저 개발 세트에서 잘못 표기된 예시를 찾고 이렇게 잘못 표기된 예시에서 거짓 양성과 거짓 음성을 찾습니다. 그리하여 다양한 카테고리에 대한 오류의 총 개수를 각각 카테고리별로 찾아냅니다. 이 과정에서 방금 본 것처럼 새 오류 카테고리를 생성해야겠다는 생각이 들 수 있는데요. 예시에서 분류기를 혼란스럽게 하는 많은 Instagram 필터나 Snapchat 필터를 본다면, 진행 중 새로운 카테고리를 만들 수 있습니다.
다양하게 잘못 표기된 예시들을 직접 세면서 그 비율을 계산하면 우선순위를 정하는 데 도움이 될 것입니다. 아니면 새로운 방향을 갖도록 자극제 역할을 해줄 수도 있구요. 오류 분석을 하면서 가끔 개발 세트 예시가 잘못 표기된 경우가 있을 텐데요. 이럴 경우 어떻게 해야 할까요? 다음에 살펴보겠습니다.
댓글남기기