티스토리 뷰

Study/AI

[MLY] 학습 곡선 출력

생각많은 소심남 2018. 9. 26. 14:45

 예를 들어 100여개의 작은 학습 데이터를 가지고 있다고 가정해보자. 아마 10개의 데이터를 랜덤하게 선택해서 알고리즘을 학습시킬 것이고, 그다음에는 20개, 30개, 최종적으로는 100개까지 10의 단위로 갯수를 증가시키면서 학습을 시킬 것이다. 그러고 난 후에 10개의 데이터를 바탕으로 학습 곡선을 출력할 것이다. 아마 적은 학습 데이터 크기에서는 학습 곡선이 약간 오차가 발생하는 것처럼 보일 것이다.(값이 예상한 것보다는 크거나 작거나 할거란 것이다.)

 10개의 데이터를 랜덤하게 뽑아서 학습시키면, 수많은 모호하거나 잘못 라벨링된 데이터와 같이 "나쁜" 학습 데이터를 뽑게 될 수 있다. 아니면, 운이 좋아서 상대적으로 "좋은" 학습 데이터를 뽑을 수 있을 것이다. 적은 학습 데이터를 가지고 있다는 것은 개발 데이터 오류와 학습 데이터 오류가 랜덤하게 흔들릴 수 있다는 것을 의미한다.

 만약 지금 만든 머신러닝 어플이 하나의 클래스에 매우 치우쳐져 있다면,(예를 들어 고양이 분류시 잘 못 분류된 데이터의 비율이 잘 분류된 데이터의 비율보다 큰 경우) 또는 클래스가 매우 많은 경우(예를 들어 100개의 서로 다른 동물들을 구분해야 하는 경우), 그렇다면 특별한 "특징이 없는 데이터" 나 나쁜 학습 데이터를 선택할 확률 또한 높아지게 된다. 예를 들어 가지고 있는데 중 80%가 거짓인 예제(y=0)이고, 단지 20%의 데이터만 참인 예제(y=1)이라면, 10개의 학습 데이터에는 모두 잘못된 예제만 들어있을 가능성이 존재하고, 이로 인해 알고리즘이 뭔가 의미있는 것을 학습하기 어려울 수 있다.

 만약 학습 곡선내 오류가 이렇게 실제의 경향을 파악하기 어렵게 만드는 경우라면, 여기 두가지 해결책이 있다:

 - 10개의 데이터를 바탕으로 한가지 모델에 대해서만 학습하지 말고, 원래 가지고 있던 100개의 데이터 중에서 대체 데이터(replacement)로부터 샘플링함으로써(여기서 대체 데이터를 샘플링한다는 것의 의미는 다음과 같다. 우선 첫번째 학습 데이터군을 만들기 위해서 100개의 데이터 중 10개의 서로 다른 데이터를 랜덤하게 선택한다. 그리고, 두번째 학습 데이터군을 만들기 위해서 10개의 데이터를 랜덤하게 선택하되, 첫번째 학습 데이터에서 선택한 것은 빼도록 한다. 물론 이와 같이 안하면 첫번째 학습 데이터군과 두번째 학습 데이터 군에서 둘다 같은 데이터가 나타날 수 있다. 이와 반대로 만약 대체 데이터를 샘플링하게 되면, 두번째 학습 데이터 군은 첫번째 데이터 선택시 선택되지 않았던 90개 데이터 중에서 10개를 선택하게 되는 것이다. 실제 상황에서 대체 데이터를 빼냐 안 빼냐는 그렇게 큰 차이를 나타내지는 않지만, 보통은 대체 데이터로부터 샘플링하는 것은 일반적으로 취하는 방법이다.) 10개의 랜덤하게 선택한 학습 데이터에 대해서 여러번(3-10번 정도) 뽑아 학습시키면 된다. 각각의 데이터에 대해서 다른 모델을 학습시키고, 학습 오류와 개발 오류를 해당 모델로부터 뽑아서 계산해라. 평균 학습 오류와 평균 개발 데이터 오류를 계산하고 출력해보면 된다.

 - 만약 앞에서 언급한 바와 같이 하나의 클래스에 치우쳐져 있던가, 아니면 클래스가 많은 경우라면 100개의 데이터 중 10개의 학습 데이터를 고르는 것 대신에 "균형이 잡힌(balanced)" 데이터를 선택해라. 예를 들어 선택할 데이터도 데이터중 20%가 참인 데이터이고, 80%가 거짓인 데이터라는 것을 확신하라는 것이다. 좀더 구체적으로 말하자면, 각 클래스 별 데이터 비율을 원래 데이터에서 뽑아내는 데이터 비율과 가능한 한 가깝게 하라는 것이다.

 나는 두가지 방법이 실제로 학습 곡선을 출력해보고, 학습 곡선이 뭔가의 경향을 보기에 너무 오류가 많다고 결론을 내지 않는 한 거기에 방해가 되지 않을거라고 생각한다. 만약 학습 데이터 군이 10000개 정도 될 정도로 크고, 클래스 분포가 어느 한쪽으로 치우쳐지지 않는다면, 이런 방법들은 아마 필요하지 않을 것이다.

 학습 곡선을 출력하는 것은 어쩌면 연산적으로 리소스가 많이 필요할 수 있다. 예를 들어 1000개의 학습 데이터를 가지고 10개의 모델을 학습시켜야 할 수도 있고, 2000개, 끝에 가서는 10000개의 데이터를 학습 시켜야 할 수 있다. 적은 데이터들을 가지고 모델을 학습시키는 것은 많은 데이터들을 가지고 학습시키는 것보다 빠르다. 그렇기 때문에 위와 같이 선형 단위(linear scale)로 학습 데이터 군을 나누는 것보다는 1000개, 2000개, 4000개, 6000개, 그리고 10000개 단위로 학습시켜야 한다. 이렇게 하면 학습 곡선의 경향에 대한 명확한 관점을 제공할 수 있다. 물론 이 방법은 추가적인 모델을 학습시키는데 필요한 연산 리소스가 중요한 케이스에서만 적용된다.

< 해당 포스트는 Andrew Ng의 Machine Learning Yearning 중 chapter 32. Plotting learning curves을 번역한 내용입니다.>

댓글