728x90

한번 할때 마무리해야하는데 계속 조금씩 조금씩하다가 끝내질 못하고 있네..

 

이번에 끝까지 가야되겠다.

 

michigan online justin johnson 교수님의 deep learning for computer vison 강의

 

lecture 10 : training neural network 1 나머지 내용들

 

 

 

 

 그래서 지금까지 모델을 훈련하는 다양한 방법들에 대해서 얘기를 했다. 활성화 함수를 보고, 초기화에 대해서도 예기를 했는데, 우리가 모델을 잘 만들더라도 학습하는 과정에서 오버 피팅이 심해지는걸 볼수도 있다.

 

 

 처음에는 테스트셋이 훈련 셋보다 성능이 더 좋게 나올수도 있지만 시간이 지나면서 나빠질수가 있는데, 이 문제를 해결하기 위해서 규제 regularization라는 방법을 사용한다.

 

 보통 규제를 하기위해서는 비용함수에다가 규제 항을 추가시키는 방법이 자주 사용되고 있는데, 이 강의의 과제에서 전에 L2 규제를 사용했던 적이 있었다. 이 L2 규제를 가중치 감쇄 weight decay라고도 부르며 가중치 행렬의 놈 norm을 패널티로 사용하는 방법이다.

 

가중치 감쇄

ref : ko.d2l.ai/chapter_deep-learning-basics/weight-decay.html

 

 이렇게 규제항을 사용하는 방법이 심층 신경망에서 널리 사용되고 있으나 이 외에도 사람들이 딥러닝에서 자주사용하는 규제 기법으로 드롭 아웃 drop out이 있다. 이 드롭아웃의 아이디어는 신경망이 순방향으로 진행하는 과정에서 임의로 일부 뉴런을 0으로 지정해서 계산을 해나가는 방법이다.

 

 그래서 순전파 방향으로 각 계층들을 계산하는 과정에서 임의의 뉴런들이 0으로 만들고 계산하고, 다른 계층에서는 다른 임의의 뉴런들을 0으로 해서 계산하고, 이런 식으로 순방향으로 나간다. 여기서 뉴런을 드롭 아웃 시킬 확률은 하이퍼파라미터로 일반적인 경우 0.5로 지정한다.

 

 

 하지만 1/2로 하는건 코인 던지기 같은 확률로 뉴런을 살릴까 말까 결정하다보니 어의없을수도 있지만, 구현하기가 쉽다. 이 예시는 2층 완전 연결 신경망을 드롭아웃 기법과 사용해서 구현한건데 보다시피 아주 간단하게 구현할수 있다.

 

 그냥 각 계층에서 연산을 마친 뒤에 이 이진 마스크 bianry mask를 곱하기만 하면 되겠다. 여기서 U1, U2가 이진 마스크 역활을 하고 있는데, U1가 생성한 난수가  [0.3, 0.6, 0.7]인 경우 여기다가 < p 연산을 하면 [0, 1, 1]가 U1이 된다. 이 U1을 완전 연결 계산 결과(입력과 가중치 행렬의 곱 결과)와 곱함으로서 이진 마스크 역활을 하며 드롭아웃 기법을 구현한게 되겠다.

 

 

 드롭아웃은 신경망이 중복된 표현들을 학습해서 가지는걸 방지한다. 이걸 다시 말하자면 특징의 공적응 = 상호 적응 co-adaptation을 방지한다고 할수 있는데, 물체를 강인하게 인식할수 있도록 다양한 표현 벡터들을 신경망이 학습하게 만든다고 할수 있다.

 

 한번 예를들면 고양이 분류기를 만들때, 나쁜 일이지만 벡터의 각 원소가 독립적으로 고양이 인지 아닌지를 학습할수도 있다. 

 

 하지만 드롭아웃을 추가한다면, 우리가 더 강인한 표현들을 학습 하길 원한다고 할때, 어떤 뉴런은 귀를 학습하고, 어떤건 털을 학습하고, 어떤 건 고양이의 고차원적인 특징 같은것들을 배워야 할것이고,

 

 이런 뉴런들을 드롭 아웃으로 절반을 제거시키면서 학습을하면 고양이에 대한 표현식이 어지르더라도(위 특징들), 일부 특징 만으로도 강인하게 고양이를 인식 할수 있게 되겠다.

 

 

* 원문을 직역하면 이상하고, 의역해도 이상해서 어떻게든 고쳐봤는데 이 의미가 맞는지는 모르겠다.

 

 

=> 아무튼 이부분을 다시 정리하면

 

드롭 아웃 : 특징의 상호 적응 방지

 

 드롭 아웃은 신경망이 비슷한 특징, 중복된 특징이 되도록 하는걸 방지하고, 이걸 다른 말로 공적응을 서로 비슷해지는것을 방지한다고 말한다. 하지만 드롭 아웃은 특징들이 서로 비슷해지는걸 막다보니 다양한 표현들, 벡터들을 학습해서 물체를 더 강인하게 인식할수 있게 된다고 하는것 같다.

 

 고양이 분류기의 예를 들자면 벡터의 한 원소만 가지고 독립적으로 고양이 인지 아닌지를 구분하도록 한다면, 내 생각에는 아주 일부 특징 한가지만 가지고 고양이로 판정을 내리려 한다면 잘못된 예측을 할수 있어 좋지 않다는 말인것같다. 

 

 하지만 드롭 아웃을 추가 한 경우, 신경망이 임의로 뉴련들이 제거되다보니 신경망이 다양한 표현식들을 학습을해서 어떤 뉴런은 귀를, 어떤것들은 털을, 어떤것들을 고양이에 대한 고차원 특징들을 학습하게 되고,

 

 이렇게 뉴런들을 드롭 아웃으로 절반씩이나 제거하면서 학습한 덕분에, 어질러진 표현식이라도 다양한 특징들이 모이다보니 강인하게 고양이를 인식할수 있다. 라는 말로 정리할수 있을것같다.

 

아우 진짜힘들어..

 드롭 아웃에 대해서 다른 방식으로 이해한다면, 이 드랍아웃 기법은 모든 가중치를 공유하는 신경망들의 앙상블을 효율적으로 학습시키는 방법이라고 볼수 있겠다.

 

 왜냐면 각 계층에서 뉴런들을 마스킹으로 없애면서 하나의 새로운 신경망을 만들었다고 볼수도 있는데, 원본 신경망으로 부터 다양한 하부 신경망을 각 순전파 때마다 만들고, 우린 하부 신경망 하나하나를 학습해 나간다.

 

그 결과 가중치가 공유되는 지수적으로 아주 많은 하부 신경망들을 학습을 하다보니, 전체 신경망은 수 많은 하부 신경망의 앙상블 모델이라 할수 있겠다. 

 

 아무튼 드롭아웃에 관한 자세한 사항은  논문을 확인해서 어떻게 동작하는지 보면 될거고

 

* 이부분을 정리할때 테스트 시간이 랜덤성을 바꾼다는 말인지, 드롭 아웃이 테스트에 걸리는 시간을 바꾸는지 이해가 되질않는다. 이후 내용을 계속 보다보니 테스트 시간에, 테스트 떄마다 랜덤하게 동작 되는걸로 다시정리했다.

 

 드롭 아웃이 가지고 있는 문제는 테스트 시간에 신경망이 무작위로 동작한다는 점인데, 순전파 순간 순간 마다 각 계층의 뉴런 절반을 임의로 제거하기 때문이며, 실제로 드롭 아웃을 적용한 신경망을 사용할때 일관된(deterministic을 결정이 아니라 일관으로 해석) 결과가 나와야하지만 그렇지 못하게 된다.

 

 한 웹서비스에다가 사진을 업로드 해서 고양이라고 인지되었다가 다음날 다른걸로 인지되는 경우가 생길수가 있어서 드롭 아웃을 사용한 신경망은 결과가 바뀔수 있는 문제를 가지고 있다.

 

 그래서 신경망을 사용할때 결과가 일관되게 나오게 만들기 위해서는 랜덤한 결과들의 평균을 취하면 되겠다. 그렇게 하려면 신경망에 대한 수식을 고치면 되는데, 입력을 실제 입력 이미지 X와 랜덤 마스크 z 두개를 주자. 여기서 z는 랜덤 변수로 신경망을 순전파시키기전에 구한 표본이라 하자.

 

 그러면 신경망 출력 결과는 입력 데이터와 랜덤 변수에 따라 결정 될거고, 신경망이 일관된 결과를 출력되도록 할 일은 테스트 시간때 랜덤 변수를 평균을 취해주면 되겠다. 이걸 하기위한 방법은 랜덤 변수 z에 대한 기대값을 구하면 되겠다.

 

 그래서 이거를 해석적으로 계산을 한다면, 수식을 통해 계산을 한다면 확률 변수 z에 대해서 적분으로 주변화해서 계산하면 되겠지만 신경망의 크기를 생각하면 이걸 해석적으로 해낼수 있는 방법이 없다.

 

 

 그래서 이 적분 대신에 할수 있는 방법은 연결 강도 w1, w2를 가지는 뉴런 하나에다가 두 입력 x, y를 주고, 스칼라 출력a를 구한다고 할께요.

 

 

 

 테스트를 할때는 가중치 행렬과 두 입력의 내적을 한다고 하고

 

 훈련 과정에 드롭아웃을 사용해서 4가지 경우의 랜덤 마스크(모든 경우의 확률은 1/4로 같다)가 있다고 하자. 이렇게 해서 x, y 둘다 살리거나 x만 살리는 경우 y만 살리는 경우, 둘다 죽는 경우를 구할수가 있겠다.

 

 이런 4가지 경우의 수가 나올수 있는 이유는 x가 살수있는 확률이 1/2, y가 살수 있는 확률도 1/2로 같기 때문이다. 이 예시로 구한 출력은 순전파 출력에다가 1/2한것과 같아지겠다.

 

  이걸 일반화해서 본다면, 드롭아웃을 적용한 한 계층의 기대값은 기존의 출력에다가 드롭아웃의 확률을 곱해서 구할수 있는것을 알수 있겠다.

 

 

 그래서 우리가 원하는건 테스트 때도 훈련 시간때 기대한 출력이 나온것과 동일한 결과가 나오는 것인데, 위 정리를 통해서 얻을 수 있다. 다시 말하면 테스트 때는 모든 뉴런들이 활성화 되어있고, 모든 뉴런들이 가중치를 가지고 동작을 할하게 된다.  그리고 각 계층의 출력을 드롭아웃 확률을 이용해서 리스캐일링을 시키면 된다. 

 

 이 내용들은 드롭 아웃 구현 정리인데, 순전파 과정에서 드롭아웃을 구현해서 랜덤 마스크를 생성하고 일부 뉴런들을 무작위로 0으로 만드는걸 볼수가 있겠다.

 

 그리고 테스트 시간에는 드롭아웃때 사용한 확률을 곱함으로서 출력을 리스케일을 시키면 각 층에서의 출력이 기대값이 되어 무작위성에 의한 영향이 더 이상 존재하지 않게 된다. 

 

 이렇게 기대값을 계산하는 방법은 각 드롭아웃 계층을 여러게 쌓아가면서 만든 상황에서 사실 정확하다고는 할수는 없다. 하지만 실제로 사용할때는 적당히 잘 동작한다고 볼 수 있겠다. 

 여기서 짚고 넘어갈만한 흔하게 드롭아웃을 구현하는 방법은 역 드롭아웃 inverted dropout이라 부르는 방법인데, 기본적인 틀은 같지만 약간 다르게 구현이 되어있다. 차이점은 리스케일링을 테스트때 하느냐 훈련중에 하느냐일 차이 뿐이라, 실제 사용할 시스템의 효율성을 높일 수 있도록 우리가 테스트 때 리스케일링을 하기 싫다면 이렇게 쓰면 된다. 

 

 왜냐면 모바일 장치나 서버같은 곳에서 많은 양의 이미지를 다룰 수도 있고, 훈련 과정에서 비용을 더 쓰고 싶다면 이 방법을 사용하면 되겠다. 이 방법은 실제로 자주 사용되고 있는데 훈련 과정에서 랜덤 마스크를 생성해서 드롭아웃하고, 뉴런들을 확률로 나눠주면, 테스트 타임때는 그냥 모든 뉴런을 가지고 평소 하던데로 계산만 하면 되겠다.

 

 

 질문이 들어왔는데, 드롭아웃 계층은 신경망 아키텍처의 어디에 넣어야 할까?

 

일단 이전에 봣던 AlexNet과 VGG 아키텍처의 경우를 떠올려보면 아주 많은 량의 학습 파라미터가 있었고, 이런 것들은 신경망의 맨 끝에 위치한 완전 연결 계층에 위치하고 있었다. 그 부분이 드롭아웃을 주로 넣어야할 위치이며, 이런 합성곱 신경망의 맨 끝에 위치한 아주 커다란 완전 연결 계층에 주로 드롭 아웃 계층을 넣는다.

 

 

 하지만 ResNet이나 GoogleNet같이 큰 완전 연결 계층이 없는 최신 신경망 구조 같은 경우에는 드롭아웃기법을 사용하지 않는다. 하지만 2014년까지 혹은 초반까지만 해도, AlexNet이나 VGG 같은 모델이 오버피팅하는걸 크게 줄이는데 도움 됬으며 신경망이 잘 동작하는데 있어서 필수적인 기법이었었다.

 

 드롭 아웃은 좀더 현대적인 아키텍처들 ResNet 같은 것들이 나오면서 덜 중요해 졌지만, 신경망에서 자주 사용되는 다른 형태의 규제 기법이라고 할수 있겠다.

 

 

 지금까지 드롭아웃에 대해서 보면서 봤던 개념들은 많은 신경망 규제 방법에서 사용되는 흔한 패턴이다. 기본적으로 훈련하는 동안 시스템에 다른 랜덤한 정보에 영향을 받도록 랜덤성을 추가시키고, 테스트때는 일관된 결과를 얻을 수 있도록 랜덤성에 대해 평균을 구하였다. 드롭아웃의 경우 랜덤 마스크로 랜덤성을 추가시킨거라 볼 수 있겠다.

 

 

 하지만 이 외에도 지금까지 다른 타입의 수 많은 규제들을 봤었는데, 우리가  이미 본 다른 규제 방법중 하나로 배치 정규화가 있다. 왜냐면 배치정규화가 훈련 과정에서 랜덤성을 추가했었는데, 출력이 임의로 만들어진 미니 배치로 만들어지기 때문이며,

 

 미니배치에서 평균과 표준 편차를 계산하고 사용을 했었는데, 이 미니배치가 훈련 중 반복 때마다 어떻게 혼합되어 들어가 있는지에 따라 변할수 있고 계산 결과도 달라지기 때문이다. 또 배치 정규화에서는 훈련 중 어떻게 배치를 만들지 가중을 줌으로서 랜덤성을 추가할수도있다.

 

 그러고 나서 테스트 중에는 드롭 아웃에서 출력에 확률을 곱하여 기대값, 랜덤하게 나온 결과들의 평균을 구하는 것과는 달리, 전체 평균들과 표준 편차들의 평균을 사용한다.

 

 

 이후에 다룰 ResNet이나 다른 현대적인 신경망 아키텍처에서 드롭 아웃 대신 배치 정규화가 주로 규제 용도로 사용되고 있다. 추가적으로 ResNet에서는 L1, L2 가중 감쇄와 배치 정규화가 훈련 과정에서 주로 사용되고 있으며, 아주 큰 심층 신경망에서도 잘 동작한다.

 

 여기서 (교수님이) 잘못 말한 부분이 있는데, 실제로 랜덤성을 추가시키는 다른 하는 방법 있다고 말 하였지만. 다른 사람들은 규제라고 보지 않는 방법이 있습니다.

-> 교수님은 규제라고 생각하지만 남들은 규제라고 보지 않는다? 라는 말로 보임.

 

 여기서 말하고자 하는 방법은 데이터 증강 data augmentation으로 지금까지 수업에서 데이터를 읽고 반복해서 훈련하는것에 대해서 이야기 해 왔는데, 항상 훈련 데이터를 로드 할때 고양이 사진과 고양이 라는 라벨을 훈련 데이터라고 해 왔습니다.

 

 이 이미지는 신경망 전체를 지나가서 예측한 라벨과 실제 라벨이 맞는지 비교하고, 비용이 줄어드는 방향으로 그라디언트를 계산하는데 사용됩니다.

 

 하지만 현실에서 자주 사용되는 방법으로 이 데이터 샘플을 변환시킬수가 있는데, 신경망에다가 입력으로 주기 전에 해당 샘플의 라벨은 나두고 입력 이미지를 무작위로 변환해서 사용할 수가 있습니다.

 

 예를 들어 수평 방향으로 뒤집은 이미지를 만들수도 있겠는데, 이미지를 수평 방향으로 뒤집더라고 고양이인걸 알수 있죠.

 

 다른 흔하게 사용하는 방법은 모든 훈련 과정에서 임의로 자른다거나 크기를 조정시키는것으로 이미지를 임의의 크기로 줄이거나 이미지 일부분을 잘라낼 수가 있겠습니다. 왜냐면 고양이 이미지 일부를 잘라내더라도 여전히 고양이로 인식할 수 있으니까요.

 

 이 아이디어들은 효과적으로 훈련 데이터셋을 늘리는 방법이라고 할수 있어요. 훈련 데이터를 변환시켜 늘렸고, 훈련 라벨을 바뀌지 않았죠. 그래서 이건 비용을 들이지 않고 신경망에 더 많은 입력 이미지를 학습시킬수 있도록 훈련 데이터셋을 배로 늘렸다고 할수 있을거에요.

 

 

 이건 다시 훈련 시간때 랜덤성을 추가시킨건데 이 예시에서 랜덤하게 자르고, 뒤집고, 스캐일링하고 있는데, ResNet 같은 신경망은 매 반복때마다 모든 훈련 이미지를 랜덤 사이즈로 조정하고, 임의 224 x 224 사이즈 이미지를 잘라낸 걸로 학습을 하게 되요.  매 반복 과정마다 각 이미지들을 랜덤하게 자르고, 크기조정하고, 뒤집는다고 할수 있겠죠.

 

 또 다른 랜덤성을 더하는 방법으로, 테스트 때 랜덤성에다가 주변화 개념을 적용시켜볼수도 있겠습니다. 데이터 증강을 위해서 몇 고정된 이미지 일부 crop의 집합을 가지고 크기조정된 것들의 집합을 가지고 테스트 평가시에 사용할 수도 있다.

 

 ResNet 논문에서는 5가지 서로 다른 이미지 스케일이 있었는데, 각 스케일로 5가지 이미지 크롭을 뽑았고, 원점을 중심으로 수평뒤집은 것으로 총 10개의 이미지를 사용하여 평가를 하였습니다. 또 다른 크롭들을 가지고 여러차례 동작시킨후에 모든 예측 결과의 평균을 구하였는데, 이러하 방식으로 훈련중에 랜덤성을 더하고, 테스트 중에 랜덤성의 평균을 구할수가 있었습니다.

 

 또 다른 사람들이 사용하는 기법으로 임의로 색상에 지터링을 주는건데, (자세한 설명은 없이 넘어간다) 슬라이드에 따르면 임의로 밝기랑 명암을 조정하는 방법인가 보다.

 

 

 이 아이디어들이 크리에이티브하게 생각해낼수 있는 다른 타입의 데이터 증강 방법들이 있지만 어떤 증강방법을 사용할지는 풀고자 하는 문제에 달려있다. 예를들어 오른손인지 왼손인지 알려주는 분류기를 만드는데, 수평 뒤집기는 좋은 데이터 증강 방법이라 할수 없겠지만 고양이와 강아지를 분류해야하는 경우 수평 뒤집기는 괜찬은 방법이 되겠다.

 

 아니면 의학 이미지를 다루는 상황에서 막 인지 세포인지 인지해야하는 경우 임의 회전을 시키는게 좋은 방법이 되겠다. 그래서 데이터 증강을 할때는 사람의 전문 지식을 활용해서 훈련 할 시스템에 어떤 변환을 해서 라벨에 영향을 안주고 증강을 할수 있는지 판단하여야 한다.

 

 지금까지 훈련때는 랜덤성을 추가하고 테스트 때는 주변화, 평균을 구하는 규제에서 흔히 사용되는 패턴들을 보았다. 이런 패턴을 보이는 나머지 예시들이 있긴한데 필요할때 자세히 보면 되겠다.

 

이 방법은 드롭 커낵트라고 부르는것으로 드롭아웃이랑 비슷한데 드롭아웃에서 활성 결과를 0으로 만들던것과는 달리 이건 매 순전파때마다 랜덤하게 가중치를 0으로 만드는것을 말한다. 그리고 테스트때 유연하게 평균을 해서 일관된 결과를 얻을수가 있겠다.

 

 

 다른 방법으로 프랙탈 맥스 풀링이라고 부르는 방법이 있는데 풀링할 수용장 영역의 크기를 랜덤하게 구하는 방법으로 어떤 영역은 2 x 2 풀링 영역을 가질수 있고, 어떤 뉴론들은 1 x 1 풀링 영역을 가질수도 있을거고 이게 매 순전파때마다 일어난다. 이게 프랙탈 맥스 풀링이라 부르는 이유는 1 x 1 수용장이냐 2 x 2 수용장이냐를 선택하는 사이에 랜덤성이 1.35의 풀링 기대값을 가지고 있기 때문이다(?)

 

 

 다른 아주 특이한 방법으로 확률적인 깊이를 가지는 심층  신경망을 만드는 방법이 되겠다. ResNet처럼 100층 넘어가는 신경망을 만드는데, 훈련 중 순전파때 다른 잔류 블록들을 사용하고, 테스트떄는 모든 블록을 사용한다.

 

 우린 드롭 아웃을 봤었는데, 그 때는 각 뉴런들의 값을 없앴고, 또 드롭 커낵션의 경우 개별적인 가중치 값을 제거했었다. 이건 드롭 블록이라고 할수 있는 방법으로, 이 심층 잔차 신경망 아키텍처에서 블록들을 제거해 나가겠다.

 

 

 이번에 볼 방법은 주로 컷아웃 cutout이라고 부르는 방법인데, 여기서는 간단하게 훈련과정에서 매 순전파때마다 입력 이미지의 일부 영역들을 0으로 설정한다. 그리고 테스트 떄는 전체 이미지를 사용한다. 이런 랜덤성을 사용하는 훈련떄 신경망을 망치는 랜덤성이 존재한다.

 

 

 이번에 볼 방법은 (교수님도 왜 동작하는지 모르겟다고 말하는..) 믹스업 mixup 방법인데, 입력 이미지들을 임의의 비율로 섞는것으로 고양이 이미지와 강아지 이미지 샘플을 임의의 비율로 섞었는데, 예측 결과가 고양이는 0.4, 강아지는 0.6으로 실제 섞은 비율과 동일한 결과가나왔다.

 

 이 방법이 잘 동작은 하지만 어쩌면 합리적인 방법일수도 있는게 여기서 섞은 비율이 베타 분포를 따르고 있는데, 이 경우 섞은 비율은 고양이가 0.4, 강아지가 0.6이 아니라 0에 아주 가깝거나 1에 아주 가까운 식으로 되야한다. 그러면 고양이는 0.95, 강아지는 0.05 될것 같지만 실제로는 그렇지가 않다. 

 

 

 지금까지 본 내용들을 보면서 실제로 어떤 방법을 사용할지가 중요한데, 일단 우리가 아주아주 큰 완전 연결 계층을 가진 신경망 아키텍처를 만난다면 드롭 아웃을 쓰면 된다. 하지만 요즘은 잘 사용되지는 않고, 주로 배치 정규화나 L2 가중치 감쇄 그리고 데이터 증강 같은것들이 오늘날 신경망 규제에 사용되고 있다.

 

 그리고 놀랍게도 컷아웃과 믹스업이 CIFAR10같이 작은 데이터셋에서 유용하게 사용되고 있다. 하지만 이미지넷같이 큰 데이터넷의 경우 드롭아웃이나 컷아웃, 믹스업 같은 방법은 그렇게 잘 사용되지는 않는다.

 

 오늘 신경망을 훈련할때 고를수 있는 많은 핵심적인 것들을 파트 원에서 보았고,

 

다음 강의에서 잘 훈련할수 있도록 알아야될 것들을 자세히 알아보자.

 

--------------

 

와 죽겟다..

 

300x250

+ Recent posts