ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [cs231n] 7강 신경망 훈련하기 (4/4, 정규화와 전이 학습 (regularization & transfer learning))
    AI 2021. 3. 23. 18:42

    우리가 보기에 드랍아웃은 구체적인 예시 (instantiation)죠. 정규화에 대한 더 일반적인 전략이 있는데요. 훈련 동안 우리는 일종의 임의성을 망에 추가해서 훈련 데이타에 너무 잘 맞아 들어가지 않게 하는 거죠. 약간 망쳐서 훈련데이타에 완벽히 맞아 들어가지 못하게 하는 거죠. 테스트시에는 바라건데 우리의 일반화를 개선하기 위해서 저 임의성을 모두 평균내 버리는 거죠.

    드랍아웃이 아마도 이런 종류의 가장 흔한 전략이지만, 사실 배치 정규화도 이 아이디어에 잘 맞습니다. 배치 정규화에서 훈련중에, 하나의 데이타 점이 여러 미니 배치에서 여러 다른 데이타 점들과 함께 나타날 수 있습니다. 단일 데이타 점에 대해 얼마나 정확하게 그 점이 훈련중에 정규화될 것인지 확률성이 있습니다.그러나 테스트시에는 우리는 이 확률성을 미니 배치당 추정값을 사용하기 보다는 정규화할 글로벌 확률성을 사용해서 평균을 내어 버립니다. 사실 배치 정규화는 드롭아웃과 비슷한 정규화 효과가 있습니다. 왜냐면 둘다 훈련시에 일종의 확률성 혹은 노이즈 (noise)를 갖는 경향이 있고, 그러나 테스트시에는 그것을 평균내어 버리죠. 망을 배치 정규화로 훈련할 때, 가끔씩 드랍아웃을 전혀 사용하지 않을 거고, 배치 정규화만으로도 망에 충분한 정규화 효과를 더해줍니다. 드랍아웃은 어쨌든 좋은데, 왜냐면, 파라미터 피를 바꿔가면서 정규화 강도를 조정할 수 있죠. 배치 정규화엔 그런 제어를 할 수 없습니다.

    이 패러다임에 맞는 다른 전략은 이 데이타 증강 (data augmentation)이란 아이디어입니다. 훈련 동안, 훈련을 위한 바닐라 (vanilla) 버전에서, 우리는 데이타가 있고, 레이블이 있죠. 그걸 사용해서 매번 CNN을 업데이트 합니다.

    그러나 우린 그대신, 훈련하는 동안 레이블이 유지되는 어떤 방식으로 이미지를 임의로 변형할 수 있습니다. 우리는 원본 이미지 대신 이 임의의 이미지 변형에 대해 훈련합니다.

    가끔 임의의 수평적 뒤집기를 볼 수 있습니다. 왜냐면 고양이를 수평적으로 뒤집어도 그건 여전히 고양이죠.

    이미지로부터 임의로 여러 크기의 자르기를 샘플링할 겁니다. 왜냐면 고양이를 임의로 잘라도 그건 여전히 고야잉니까요.

    그다음 테스트시에, 잘라낸 것의 정해진 집합으로 평가해서 이 확률성을 평균내어 버리죠. 종종 네 모서리와 중간과 뒤집어진 것이 집합이 됩니다. 예를 들면, 이미지넷 (ImageNet)에 관한 논문을 읽어 보면, 모델에 대한 단일 자르기 성능이 꽤 자주 보고 되곤 합니다. 그건 전체 이미지와 모델의 10개 자르기 성능 같은 거죠. 10개 자르기는 이 5개 표준 자르기와 뒤집어진 것의 자르기입니다.

    데이타 증강할 때, 가끔씩 색깔 바꾸기를 할 겁니다. 즉, 훈련동안 임의로 이미지의 명암과 밝기를 변경합니다.

    또한 색깔 바꾸기로 약간 복잡한 것을 할 수 있습니다. 색깔을 데이타 공간에서 주성분 분석 (principal component analysis) 방향으로 바꾸는 것을 하는거죠. 또는 데이타 의존적인 방식으로 색깔을 변경할 수 있습니다. 그러나 덜 자주 사용합니다.

    일반적으로 데이타 증강은 어떤 문제에도 적용할 수 있는 매우 일반적인 것입니다. 어떤 문제를 풀려고 하던지 어떤 방식으로 데이타를 레이블 변경없이 변형시킬 수 있는 지를 생각해 보세요. 훈련 동안, 이 임의의 변형을 입력 데이타에 적용하세요. 이건 망에 정규화 효과를 가집니다. 왜냐면 여러분은 훈련동안 일종의 확률성을 더하고 테스트시에는 그것을 떨어뜨리기 때문이죠.

    이제 우리는 이런 세가지 패턴 즉, 드랍아웃, 배치 정규화, 데이타 증강을 보았습니다. 그러나 다른 예들도 많이 있습니다. 이런 패턴을 알고 있으면, 가끔 다른 논문을 읽을 때, 이런 것들을 인지할 겁니다.

    드랍아웃과 연관된 다른 아이디어는 드랍커넥트 (dropconnect)라고 불리는 것이 있는데요. 드랍아웃은 같은 아이디어지만, 모든 순방향 전달에서 활성을 0으로 하기 보단, 그대신 우린 임의로 가중치 행렬의 값의 일부를 0으로 만듭니다. 다시 얘기하지만, 그건 이런 특징이 있는거죠.

    제가 좋아하는 또다른 멋진 아이디어는, 흔히 사용되지 않지만, 멋진 아이디어라고 생각하는데요. 작은 맥스 풀링 (fractional max pooling) 아이디어입니다. 일반적으로 2 x 2 맥스 풀링을 할 때, 순방향 전달에서 풀링하는 이런 고정된 2 x 2 영역이 있습니다. 작은 맥스 풀링에선 풀링 계층에서, 풀링하는 영역의 풀을 정확히 임의화합니다. 여기 오른쪽 예에서, 훈련동안 볼게 될 3개의 다른 임의의 풀링 영역 집합이 있습니다. 테스트시에 여러 개를 많이 시도해서 확률성을 평균내어 없애 버리는 거죠. 풀링 영역의 어떤 고정된 집합만 사용하거나 많은 샘플을 추출해서 평균내 버림으로써요. 그건 일종의 멋진 아이디어죠. 흔하게 사용되진 않지만요.

    이 패러다임에서 또 다른 놀라운 논문이 작년에 나왔는데, 이건 수업에서 가르친 적 없는 새로운 거죠. 확률적 깊이 (stochastic depth)라는 아이디어입니다. 왼쪽에 망이있죠. 아이디어는 매우 깊은 망이 있을 때, 훈련중에 망으로부터 계층을 임의로 드랍합니다. 훈련중에, 몇몇 계층을 없앨거고 훈련중에 계층의 일부 하위 집합만을 사용하는 거죠. 이제 테스트 시간 동안에는 전체 망을 사용할 겁니다. 이건 미친 것 같죠. 이게 동작한다는 건 놀랍습니다. 그러나 이것은 드랍아웃이나 다른 전략들과 비슷한 정규화 효과가 있는 것 같습니다. 다시 얘기하지만, 이건 슈퍼 슈퍼 최첨단의 연구죠. 실제에서 슈퍼 흔하게 사용되는 것은 아니지만, 멋진 아이디어죠.

    한가지 빠르게 얘기할 것은, 전이 학습 아이디어입니다. 우리는 정규화에서 봤는데, 훈련 에러와 테스트 에러 사이의 간격을 이 여러 정규화 전략을 추가함으로써 줄일 수 있죠. 과적합 (overfitting)에서의 문제점 하나는 가끔 충분한 데이타가 없기 때문에 과적합 된다는 겁니다. 크고, 강력한 모델을 사용하고 싶지만, 그 크고 강력한 모델이 작은 데이타 셋에 너무 많이 과적합 되는거죠. 정규화가 그것과 싸우는 하나의 방법이고, 다른 하나의 방법이 전이 학습을 사용하는 것을 통한 방법이죠.

    전이 학습은 이 미신을 부수므로, CNN을 훈련시키는데 엄청나게 많은 데이타가 필요하지 않습니다.

    아이디어는 매우 간단하죠. 먼저 어떤 CNN을 가져옵니다. 여기 VGG 스타일 아키텍처가 있는데요. CNN을 가지고 이미지넷 (ImageNet)같은 매우 큰 데이타셋에서 그걸 훈련시킬겁니다. 여러분은 충분한 데이타로 그 망 (network)을 훈련시키죠.

    이제 아이디어는 이 데이타셋으로부의 피쳐 (feature)를 우리가 신경쓰는 어떤 작은 데이타셋에 적용하고 싶은 겁니다. 이미지넷의 1000개 카테고리 (category)를 분류하는 대신, 10개의 개 종류 (dog breed) 분류같은 것을 하고 싶은 거죠. 여러분은 작은 데이타셋만 있는 거죠. 여기서 작은 데이타셋은 C 클래스들만 갖고 있습니다. 이제 여러분이 이 마지막 완전 연결 계층에 대해서 할 일은 마지막 계층 피쳐에서 최종 클래스 점수로 가는 것입니다. 이제 그 행렬을 임의로 재초기화해야 합니다. 이미지넷에 대해서는, 그건 4096 x 1000 차원 행렬이죠. 새로운 클래스에 대해서는 4096 x C x 10 정도가 될 겁니다. 이 마지막 행렬을 임의로 재초기화하고, 모든 이전 계층의 가중치를 고정합니다. 이제 그냥 선형 분류기를 훈련시키고 이 마지막 계층의 파라미터들만 훈련시킵니다. 그리고 그것들이 데이타에 수렴되게 하는 거죠. 작업할 데이타셋이 매우 작다면 이건 꽤 잘 동작하는 경향이 있습니다.

    만약 약간 더 많은 데이타가 있다면, 해볼 수 있는 것은 전체 망 (network)을 미세조정 (fine tuning)하는 겁니다. 상위 (top) 계층이 수렴하고 데이타에 대해 마지막 계층이 학습하고 난 후, 전체 망을 업데이트 하는 것도 고려해 볼 수 있습니다. 데이타가 더 많다면, 망의 더 큰 부분을 업데이트하는 것도 고려해 볼 수 있습니다. 여기서 일반적인 전략은 망을 업데이트할 때, 초기 학습률보다 낮게 학습률을 떨어뜨리는 거죠. 왜냐면 아마도 이미지넷에 수렴했던 이 망의 원래 파라미터들은 일반적으로 꽤 잘 동작했기 때문이죠. 그리고 여러분은 데이타셋에 대한 성능을 튜닝하기 위해서 그것들을 변경하고 싶을 겁니다.

    그다음 전이 학습으로 작업할 때, 이 2 x 2 그리드 (grid)의 시나리오를 생각할 수 있죠. 한쪽엔 아마도 데이타셋에 대한 매우 작은 양의 데이타가 있거나 혹은 데이타셋의 굉장히 큰 데이타 양이 있을 겁니다. 그리고 데이타가 이미지와 매우 비슷할 겁니다. 이미지넷 같은 곳에는 동물, 식물 같은 많은 그림이 있죠.

    만약 다른 종류의 동물과 식물, 다른 종류의 이미지를 분류하고 싶다면, 여러분은 꽤 좋은 상태에 있는 겁니다. 그다음엔 만약 데이타가 이미지넷 것과 매우 유사하다면, 그리고 데이타 양이 매우 적다면, 그냥 이미지넷 모델을 사용해서 추출한 피쳐 위에다가 선형 분류기를 훈련시킬 수 있죠. 만약 작업할 데이타가 약간 더 많다면, 데이타를 미세조정 하는 것을 생각할 수 있습니다.

    그러나, 만약 데이타가 이미지넷과 매우 다르다면 곤란해 질 수 있습니다. 만약 엑스레이나 씨에이티 (CAT) 스캔 혹은 이미지넷의 이미지들과 매우 다르게 보이는 것들과 작업한다면, 그 경우에는, 좀 더 창의적이 될 필요가 있습니다. 가끔은 그게 잘 동작하지만, 마지막 계층 피쳐들에서 알아낼 수 있는 게 별로 없을 겁니다. 망의 더 큰 부분을 재초기화하고 좀 더 창의적으로 더 많은 실험을 해보는 것을 고려해야 할 겁니다. 만약 매우 다른 데이타셋에 많은 데이타가 있으면 이건 약간 완화될 수 있죠. 왜냐면, 망의 더 큰 부분을 미세조정할 수 있으니까요.

    또 얘기하고 싶은 것은 전이학습이 매우 많이 퍼져있다는 겁니다. 그건 사실 표준이죠. 예외라기 보다는 요. 컴퓨터 비전 (vision) 논문을 읽다보면, 여러 작업에 대해 이와 같은 시스템 다이어그램을 종종 볼 겁니다. 왼쪽은 물체 인식에 대해 작업하는 거고, 오른쪽은 이미지 캡셔닝 (captioning)에 대해 작업하는 거죠.

    이 모델 둘 다 CNN을 가지고 이미지를 처리하고 있죠. 요즘 컴퓨터 비전의 거의 모든 응용프로그램에서 대부분의 사람들은 이것들을 아무것도 없는 상태에서부터 훈련시키지 않습니다. 거의 항상, CNN은 이미지넷에 대해 사전훈련될거고, 처리할 작업에 대해 아마도 미세조정될 겁니다.

    또한, 캡셔닝 의미에서는, 가끔 언어에 관련된 워드 벡터들을 사전 학습할 수 있습니다. 이미지넷에 대해 CNN을 사전학습할 수 있습니다. 큰 텍스트 코퍼스 (corpus)에 대해 워드 벡터를 사전학습할 수 있습니다. 그리고 데이타셋에 대해 전체를 미세 조정할 수 있습니다. 비록 캡셔닝의 경우에는 이 워드벡터로 사전학습 하는 것이 약간 덜 사용되고 약간 덜 중요하죠.

    프로젝트를 위해 기억할 점입니다. 여러 모델에 대해 일반적으로 작업할 때, 풀고 싶은 문제가 있지만 큰 데이타셋이 없을 때마다, 여러분이 신경쓰는 작업과 비교적 가까운 사전 훈련된 모델을 다운로드해서 그 모델의 부분들을 재초기화하거나 데이타에 대해 모델을 미세조정 해야 합니다. 그렇게 하면 잘 되곤 합니다. 비록 작업할 훈련 데이타의 양이 그다지 많지 않다고 해도요. 이것이 너무나도 흔히 사용되는 전략이기 때문에, 모든 다양한 딥러닝 소프트웨어 패키지들이 모델 주 (zoo)를 제공하고, 다양한 모델의 사전학습된 버전을 다운로드할 수 있습니다.

    오늘 요약하자면, 최적화에 대해서 얘기했는데, 훈련 손실을 개선하는 방법에 관한 것이었죠. 정규화에 대해서 얘기했고, 테스트 데이타에 대한 성능을 개선하는 것이죠. 모델 앙상블도 여기에 들어 맞는 것이죠. 전이학습에 대해서도 얘기했는데, 적은 데이타로 더 잘 할 수 있는 방법이었습니다. 이것들은 모두 슈퍼 유용한 전략들입니다. 프로젝트에서도 그리고 나중에도 이것들을 사용해야 합니다. 다음 시간에는 다양한 딥러닝 소프트웨어 패키지에 대해 더 구체적으로 얘기하겠습니다.

    댓글

Designed by Tistory.