etc/구글 머신러닝 부트캠프

[DSL] Structuring Machine Learning Projects Week 1 : ML Strategy (2)

uyt8989 2022. 7. 6. 22:19

요샌 사정이 있어서 강의를 매번 늦은 밤에 듣다 보니 집중력이 떨어진 것 같다. 그래도 열심히 해보자.

 

1. Error Analysis

모델의 오류를 줄이기 위한 분석 방법에 대해서 뭔가 열심히 듣긴 했는데,  핵심은 몇 문장 안 되는 것 같다. 수동으로 데이터를 살펴보면서 어떤 종류의 오류가 주로 발생하는지, 라벨링이 잘못된 데이터는 없는지 파악하라는 것이 알파이자 오메가가 아니었을까.

 

오류의 종류라고 하면 거창한 게 아니라 고양이 탐지 모델에서 개를 고양이라고 하지 않는지, 사자나 호랑이를 고양이라고 하지 않는지(좀 험악해서 그렇지 따지고 보면 고양이가 맞긴 맞다), 화질이 너무 구리지는 않았는지 정도를 파악한다. 그리고 그 비율을 파악해서 어떤 문제에 집중해야 할지 결정한다. 100개의 오류 중에 5개 정도만 개 관련 오류였고 50개가 호랑이 관련 오류였다면 아무래도 호랑이 쪽에 집중하는 게 효율적일 수밖에 없다. 

 

그리고 이 과정에서 만약 원래 개 사진인데 고양이라고 라벨이 잘못되어 있는 경우도 있을 수 있다. 저번에 업 스테이지 CTO님의 강의를 들을 기회가 있었다. 그때 라벨링 하는 과정에 대해 자세히 들으면서 이런 일이 꽤나 자주 발생한다는 것을 알게 되었다. 그런데 뭐 가끔 하나씩 틀리는 건 별로 문제가 안되지만, 개를 계속 고양이라고 라벨링 한 경우에는 좀 곤란하다. 그래서 라벨을 다시 붙여야 하냐 하면 꼭 그렇지 많아도 않은 것 같다. 이때도 라벨을 새로 붙이는 비용 대비 효율을 고려해서 결정하는 게 좋다. 그리고 만약 라벨을 다시 붙이게 된다면, 검증 데이터와 테스트 데이터 모두 새로 해야 한다. 둘은 무조건 같은 분포에서 와야 하기 때문이다.

 

2. Mismatched Training and Dev/Test Set

검증 데이터랑 테스트 데이터는 서로 같은 분포여야 한다. 하지만 가끔 얘네 둘하고 분포가 다른 학습 데이터를 사용할 수도 있다. 왜냐하면 내가 원하는 기능을 관련된 데이터가 너무 적어서 학습에 충분한 양이 안된다면 비슷한 데이터를 학습 데이터로 사용할 수 있다. 예를 들어서 자동차 내부 음성 인식을 위한 모델을 개발하는데 데이터가 20,000개 밖에 없다. 하지만 다른 음성 인식 데이터는 500,000개 정도 있다고 가정하자. 그럼 전자의 데이터 10,000개를 학습 데이터로 넘긴다. 그리고 나머지 5,000개씩을 검증 데이터나 테스트 데이터로 사용할 수 있다. 둘의 데이터를 섞어서 다시 배분하는 방식은 확률적으로 검증과 테스트 쪽에 필요한 데이터들이 학습에 많이 들어갈 수밖에 없기 때문에 잘 사용하지 않는다.

 

그런데 분포가 다른 데이터를 같은 모델로 돌려서 나온 결과를 어떻게 비교할 수 있을까? 그래서 사용하는 게 train-dev set이다. 훈련-검증 데이터(?)라고 할 수 있으려나. 이 데이터는 훈련 데이터이긴 하지만 실제로 학습에는 사용하지 않는 데이터다. 이 데이터로 오차를 뽑아서 검증/테스트 데이터의 오차와 비교한다. 이게 새로 생기면서 모델에서 편차, 분산, 데이터 불일치 중 어떤 것을 우선적으로 해결해야 하는지 파악할 수 있게 됐다.

다른 문제들은 이전에 어떻게 해결하면 좋을 지에 대해서 생각해봤지만 데이터 불일치에 대해서는 아직 모른다. 앤드류 응 교수님에 따르면 우선 수동으로 훈련 데이터와 검증/테스트 데이터의 무슨 차이가 있는지 파악한다. 그리고 훈련 데이터에 검증/테스트 데이터랑 비슷한 데이터를 더 추가함으로써 분포를 비슷하게 맞춰주는 작업을 한다.

 

그런데 뭐 데이터를 그렇게 쉽게 구할 수 있었으면 애초에 데이터를 똑같이 했겠지. 그래서 인공적으로 데이터를 만들어서 쓰기도 한다. 예를 들어서 자동차 소음이 들리는 음성 데이터가 필요한 경우에는 깨끗한 녹음 파일에 자동차 소음을 합성해서 새로운 데이터를 만들어내기도 한다. 대신 합성할 때 세심한 주의가 필요하다. 깨끗한 녹음 파일이 10,000시간이고 자동차 소음이 1시간이라면 10,000시간짜리 인공 데이터에는 똑같은 소음이 10,000번 반복될 것이다. 이러면 아무래도 1시간짜리 자동차 소음에 과적합되기 쉽다. 이런 문제를 주의해서 인공 데이터를 만들면 실제로 효과가 꽤나 있다. 

 

3. Tranfer Learning

한국말로는 전이 학습이다. 만약 내가 영상 의학 분야에 도움이 될만한 진단 모델을 만들고 싶다. 그런데 데이터를 많이 수집하지 못했다. 그러면 다른 감지 알고리즘에 사용되는 데이터를 사용해서 일단 모델을 pre-train 한다. 그 이후에 마지막 레이어를 새로운 레이어로 갈아 끼운 다음에 영상 의학 데이터를 사용해서 다시 학습시키는 방법이다. 이때 전체 모델을 학습시키거나 마지막 레이어만 학습시킬 수 있는데, 보통 데이터가 작은 경우엔 마지막 레이어만 학습시킨다.

 

이 방법은 둘의 데이터가 비슷할 때 사용 가능하다. 진단 모델을 만드는데 뜬금없이 무슨 자동차 소음 소리로 미리 학습시키면 도움이 하나도 안 된다.  이 말은 점선면부터 학습하는 이미지 감지 모델처럼 하나하나 쌓아 올려야 하는 경우에 이 방법이 의미가 있다는 소리다. 고양이 사진으로도 점선면 정도는 학습이 가능하니, 부족한 영상 의학 데이터를 처음부터 사용하기보다는 다른 데이터로 미리 학습시킨다는 아이디어이다. 

 

그리고 영상 의학 데이터보다 고양이 데이터가 훨씬 많은 경우에 의미가 있지, 그 반대의 경우에는 이 방법이 크게 도움이 되지 않는다.

 

4. Multi-task Learning

이건 한국말로 직역하면 다중 작업 학습이다. 한 신경망을 학습시키는데 여러 정답을 뱉을 수 있도록 하는 방법이다. 컴퓨터 비전 이외에 어떤 분야에서 잘 사용되는지는 잘 모르겠지만, 확실히 컴퓨터 비전에서는 잘 사용된다. 우선 이 방법도 예전의 소프트맥스처럼 Y 행렬이 (1, m)이 아니라 (n, m) 일 수 있다. 여기서 n은 정답의 개수로 사용했다. 대신 차이점은 소프트 맥스는 각각의 벡터에서 정답이 하나지만 여기서는 여러 개 일 수 있다. 예를 들어서 소프트 맥스는 어떤 사진을 보고 그게 고양인지 강아진지 분류하는 문제를 해결한다면, 이 방법은 그 사진에 고양이가 있는지, 강아지가 있는지 따로따로 정답을 내준다. 

 

그래서 사용하는 손실 함수는 각각의 라벨에 대한 손실을 더하는 형태로 사용한다. 그런데 만약 라벨이 붙어 있지 않은 데이터를 쓰게 됐다면 라벨이 붙어있지 않은 손실은 더하지 않는다.

이 방법은 신경망이 큰 경우에 도움이 된다. 한 번에 여러 가지 신경망을 학습시키는 데에도 사용할 수 있다.  이것도 아까처럼 어떤 특정 정답에 대한 데이터는 적지만, 도움이 될만한 데이터가 꽤나 많다면 사용한다. 신경망이 작은 경우를 제외하고 이 방법을 사용하면 성능이 좋아진다는 연구 결과도 있는 모양이다.

 

4. End-to-End Deep Learning

자막에는 종단간 심층 학습이라고 나왔던 것 같다. 복잡한 모델을 만들기 위해서 원래는 작은 부분으로 나눠서 작업하던걸 한 번에 학습시키는 방법이다. 예를 들어서 음성 인식 분야에서는 원래 소리를 듣고 음소로 인식하고 단어로 인식하는 등의 몇 번의 방법을 걸쳐서 했었다. 이 방법으로 하면 그냥 바로 처음부터 끝까지 한 모델로 학습해버린다. 이렇게 하면 중간 과정을 생략할 수 있고 성능이 더 좋아질 수도 있다. 하지만 예전보다 데이터 훨씬 많이 필요하게 된다. 그리고 사람이 직접 해서 조정할 수 있는 부분도 분명히 있었을 텐데 그걸 생략해버리는 경우도 있다. 

 

이번 강의는 뭔가 숫자보다는 계속 말로 설명을 들었던 것 같다. 이전보다 더 이론적이라고 해야 하나 아니면 덜 이론적이라고 해야 하나. 아무튼 좀 딥러닝 분야에 인사이트를 키울 수 있던 시간인건 확실한 것 같다.

 

* Courera의 Deep Learning Sepcialization 강의를 수강하는데 도움이 되고자 작성한 요약문입니다. 틀린 내용 있다면 정정해주시면 감사하겠습니다.