728x90

 

 그 다음으로 우리가 자세히 다뤄야할 주제로 신경망에서 사용할 하이퍼 파라미터를 어떻게 선정할까인데 

 

흔히 볼수있는 대표적인 방법으로 그리드 탐색 grid search가 있겠다. 여기서는 하이퍼 파라미터의 집합이 있는데 각각의 하이퍼파라미터들을 사용하면서 선택한 하이퍼파라미터를 사용한 결과들을 평가하는 방식이다.

 

 어쩔때는 선형 공간, 그러니까 하이퍼파라미터가 선형적으로 증가하는 경우보다 로그 선형 공간을 탐색해야하는 경우도 있다. 예를 들자면 위와 같이 4개의 로그 선형 공간상에서의 학습률과 4개의 로그 선형 공간 상에 있는 규제 강도, 가중치 감쇄치가 로그 선형 공간에서 탐색해야하는 하이퍼 파라미터인데, 이 4개의 학습률과 4개의 가중치 감쇄값으로 총 16가지 경우의 조합을 만들수가 있게 되겠다.

 

 만약 충분한 GPU 자원이 있다면 모든 경우들을 다 돌려보고 가장 좋은 성능을 보이는 하이퍼 파라미터를 찾으면 되겠지만, 하이퍼 파라미터의 개수가 많은 경우 GPU또한 많이 필요하고 하이퍼 파라미터를 튜닝하기가 어려워 질것입니다.

 

 

 그래서 그리드 탐색 대신 사람들이 사용하는 방법으로 랜덤 탐색 random search가 이용합니다. 이 방법의 경우 여러개의 하이퍼 파라미터들을 놓고 선택해서 평가하는 그리드 탐색과는 달리 하이퍼 파라미터 값의 범위를 지정해 놓고, 매 훈련 때 마다 그 범위에 속하는 랜덤한 값을 골라 하이퍼 파라미터로 사용하는 방법이다.

 

 학습률과 가중치 감쇄 같은 하이퍼 파라미터들은 로그 선형 공간에서 탐색을 해야되겠지만 모델 사이즈나 드롭 아웃 같은 확률의 경우 로그 선형 공간 보다는 선형 공간 상에서 탐색을 해야 하는데, 이와 같이 선형 공간에서 탐색해야하는 것인지 로그 선형 공간에서 탐색해야하는지는 어떤 하이퍼 파라미터이냐에 따라 달렸다고 볼수 있겠다.

 

 아무튼 이 랜덤 탐색 방법을 사용하는 경우 각 하이퍼 파라미터마다 각자 범위를 지정하고, 학습할때마다 구한 랜덤 값을 하이퍼 파라미터로 사용하는데, 여기서 시행 착오/학습을 반복할 횟수는 만든 신경망 모델로 여유있게 훈련 시킬수 있는 만큼 해주면 되겠다. 그렇게 학습이 끝날때까지 최고의 성능이 나온 하이퍼 파라미터로 시용하면 된다.

 

 2010년 초반에 나온 논문에 따르면 랜덤 탐색과 그리드 탐색을 비교할때 비슷하게 동작하기는 하지만 랜덤 서치를 사용할때 더 좋은 하이퍼 파라미터를 찾을수가 있다고 한다. 

-> 한 논문에 따르면 랜덤 탐색이 그리드 탐색보다 하이퍼 파라미터 탐색에 좋다.

 

 탐색하고자 하는 하이퍼 파라미터가 많다고 할때, 어떤 하이퍼파라미터들은 모델 성능에 있어서 중요한 것들이 있을수도 있고, 그렇치 않은 값들도 있있겠다. 하지만 학습하기 전까지 어떤게 중요한 하이퍼파라미터이고, 중요하지 않은 하이퍼파라미터인지 알수는 없다. 

-> 다양한 하이퍼 파라미터가 있겠지만 어떤게 중요하고, 안 중요한지 알 수 없다.

 

 그래서 그리드 탐색을 사용한다면 위에서 왼쪽 그림에 나오는 그리드 파라미터를 직접 평가해볼수가 있겠다. 위 왼쪽 그림의 수평 축은 신경망 성능 최적화에 중요한 파라미터를 보여주는데, 이 분포는 다양한 하이퍼 파라미터가 주어질때 성능에 대한 주변 확률 분포를 의미하고 있다.

-> 중요한 하이퍼 파라미터와 중요하지 않은 하이퍼 파라미터가 두 타입이 있는 경우 주변 분포

 

 한번 간단한 예시를 들자면 이 수평 축에서 왼쪽으로 갈수록 낮은 성능을 보이고, 중앙에서는 높은 성능을 보이다보니 이 수평 방향의 하이퍼 파라미터가 성능 향상에 중요한 하이퍼파라미터임을 알수가 있겠다.

-> 중요 파라미터의 주변 분포에 따르면 어떤 경우 성능 향상에 기여하지 않지만 어떤 경우 크게 성능이 향상.

 

 이와 반대로 수직방향 하이퍼 파라미터는 모델 성능 개선에 크게 중요하지 않는데, 그림의 왼편에 노란색의 주변 확률 분표를 보면 이 수직 하이퍼 파라미터 값이 어떻든간에 성능에 큰 영향을 주지않는다고 볼수 있겠다.

-> 중요하지 않은 하이퍼파라미터는 어떤 값이 오든 성능 향상에 큰 변화를 주지 않음.

 

 여기서 문제점은 그리드 탐색을 할때 매 반복때마다 중요한 타입의 파라미터를 고정 시켜 놓고, 중요하지 않은 타입의 하이퍼파라미터 값을 여러 경우로 반복하다보니 그렇게 많은 정보를 얻을수가 없으며, 이 그림의 예시의 경우 중요한 하이퍼 파라미터의 값이 3가지 인 경우에 대한 경우 밖에 볼수 없게 된다. 그렇다 보니 어떻게 튜닝하는게 좋은지 충분한 정보를 얻을수가 없다.

-> 그리드 탐색은 한 타입의 하이퍼 파라미터 값을 고정시키고 다른 타입의 값을 변화시킴. 위 예시의 경우 중요 파라미터 값이 3가지인 경우 밖에 볼수가 없다.

 

 

 하지만 랜덤 탐색의 경우 매 학습/시도 때마다 수직 방향/중요하지 않은 타입값, 수평 방향/중요한 하이퍼파라미터 값을 랜덤하게 구하여 시도하므로, 하이퍼 파라미터 값의 변화에 따른 모델 성능을 주변 분포로 그린 결과(수평 방향 분포)를 같이 보면 그리드 탐색에서는 수직, 수평방향으로 정렬되어 있었다보니 정확하게 일치하지 않은 랜덤 탐색으로 보다 더 다양한 경우 결과를 얻고, 더 효과적으로 중요한 하이퍼 파라미터 값/샘플이 무엇인지 찾을수가 있겠다.

-> 그리드 탐색에서 값들이 수평, 수직방향으로 일치하다보니 중요한 하이퍼 파라미터의 값이 3가지인 경우만 볼수 있었지만 랜덤 탐색은 범위 안의 무작위 값을 사용하다보니 더 다양한 경우의 하이퍼 파라미터들을 사용할 수 있고, 더 좋은 성능을 보이는 하이퍼파라미터를 찾기 좋다.

 

 이 슬라이드를 통해서 랜덤 탐색을 하는 예시를 살펴보았고,

 

 

 

 이 예시는 3가지 모델을 가지고 학습률과 규제 강도를 평가한 예시인데, 순전파 모델과 잔차 모델, 그리고 DART라고 부르는 신경망 아키텍처로 dart에 대해서는 중요하지 않으니 넘어가자. 이 세 플롯과 한 점의 색상은 각 모델들을 학습한 뒤 나온 성능을 나타낸다. 

 

 이 그림에서 x축이 학습률이고 y축은 규제 강도로 로그 단위를 따르고 있다. 이 걸로 알수 있는 점은 두 하이퍼 파라미터 사이의 상호 관계가 단순하지 않다는걸 알수 있다. 이 그림을 잘보면 강처럼 생긴 것의 중간에 보면 가장 좋은 학습률과 규제 강도를 찾을 수가 있겠다.

 

 

중간 질문) 하이퍼 파라미터를 찾는데 경사 하강법을 사용할 수 있을까?

 

 하이퍼 파라미터를 찾는 건 아주 중요한 연구 분야 중 하나인데 이 강의의 범위를 넘어가지만 다양한 방법들이 있다. 예시를 들자면 파이토치로 파이썬 코드로 역전파를 간단하게 구현할수 있었듯이 최적화 방법를 사용하기 위해서 이너 루프와 아우터 루프를 구현하면 되는데,

 

 여기서 이너 루프는 기존 모델의 학습 파라미터를 최적화 하는데 사용하여 그라디언트를 계산하고 초기 하이퍼 파라미터값에 따른 모델 성능을 구하고. 아우터 루프는 하이퍼 파라미터의 그라디언트를 학습하는데 사용하면 된다. 이런 방식으로 하이퍼파라미터를 탐색하는 다양한 논문들이 있기는 한데 (생략)

 

 

 

 아무튼 페이스북이나 구글 등 수 많은 GPU 자원을 사용할수 있는 곳에서 일한다면 이런 하이퍼 파라미터 탐색 방법을 쓸수 있겠지만 그렇지 않은 경우 효율적인 하이퍼 파라미터 탐색 방법을 사용하여야 한다. 수 많은 하이퍼 파라미터를 탐색할 필요 없이 좋은 하이퍼 파라미터를 찾는게 가능하니 너무 걱정할 필요는 없다.

 

1. 초기 비용 확인하기

 아무튼 사용 가능한 GPU 자원이 많지 않을때 우리가 할수 있는 방법으로 첫번째 단계는 우선 신경망 모델을 구현하고 초기 비용을 확인해보자. 비용 함수에 대해서 여러가지를 이미 살펴보았고, 교차 엔트로피 같은걸 사용한다고 하면 - log(클래스 개수)로 나타낼수가 있겠다.

 

 모델을 구현한 뒤에는 가중치 감쇄를 사용하지 않고, 한번만 학습하여 초기 비용을 확인해보자. 한번만 학습 하다보니 계산량도 크지 않고 빠르게 구할수 있을건데, 비용이 잘못되어 있다면 버그가 있다고 볼수 있고 이 버그를 해결하면 되겠다.

 

 

 

2. 다양한 설정과 일부 데이터만 가지고 학습되는지 확인하기

 다음 단계로 할 일은 훈련 데이터셋의 아주 작은 샘플을 가지고 오버피팅을 시켜보는것인데, 5 ~ 10개의 미니배치를 사용하면 된다. 이 소수의 데이터를 가지고, 규제를 하지 않은 채 100% 정확도를 얻을만큼 오버피팅을 시키면 되겠다.

 

 이렇게 하면서 계층 수를 늘린다거나 학습률을 조정한다거나, 가중치 초기화 방법들을 조정해나가면서, 훈련 데이터가 적은 만큼 학습 시간도 작다보니 100 정확도에 도달하는 하이퍼 파라미터를 빠르게 찾을수가 있겠다. 만약 10개 정도의 배치 가지고 학습할수 없으면, 전체 데이터를 가지도 학습할수 없을거고 그렇지 않다면 문제가 없다고 볼수 있겠다.

 

 아무튼 이 방법으로 다양한 경우들을 여러번 반복할 수 있을 것이고 모델 아키텍처에 알맞은 최적화 설정, 하이퍼 파라미터 설정에서 버그가 되는 것들을 잡아낼수 있다. 다만 이 단계에서는 최적화 과정을 아주 작은 훈련셋 가지고 디버그 하기 위함이지 규제나 검증셋으로 일반화를 하기위한게 아니니 이런것들을 고민할 필요는 없다.

 

 

3. 적절한 학습률 찾기

 이번에는 이전 단계에서 구한 신경망 아키텍처와 훈련 데이터 전체를 사용해서 학습률을 찾아 보고 전체 학습 셋에서 비용을 빠르게 줄일수 있도록 해보겠다. 이전 단계를 통해서 우리가 구한 신경망 모델이 데이터를 잘 학습할수 있도록 설계되었는지 확인했다면, 이번 단계에서는 이전 단계에서 구한 하이퍼 파라미터를 그대로 가지고 오고, 학습률만 바꿔나가면되겠다.

 

 여기서 목표는 100번 정도 훈련 셋으로 학습해 나가면서 비용을 크게 감소시키는 것인데, 적절하게 값들이 설정되었다면 초기 비용은 매우 크겠지만 백에서 수천회 학습하는 과정에서 지수적으로 비용이 감소하게 되며, 신경망 아키텍처를 다루는 문제에서 공통적으로 이런 경향을 보인다.

 

 이 단계에서는 적절한 학습률을 찾기 위한 것이다 보니 한번 학습할때마다 수백에서 수천번 반복해도 되고, 여러 가지 경우를 반복하면서 첫 100회 반복때 가장 잘 수렴하는 학습률 값을 사용하면 된다.

 

 

4. 작은 간격으로 하이퍼 파라미터 탐색하기

 다음으로 4번째 단계에서는 일정한 아주 작은 간격의 하이퍼 파라미터를 사용하여 학습률과 감쇄률/규제강도를 탐색하는 것으로 이전 3번째 찾은 값을 중심으로 보면 되겠다. 이전 단계에서 대략적인 하이퍼 파라미터를 잘 찾은 다음 이번에는 아주 작은 구간 간격으로 적합한 값을 찾다 보니 어떤 값을 사용하던 간에 크게 나쁜 모델이 만들어지지는 않는다.

 

 전체 훈련 셋을 5~ 10 에폭 정도 학습 한 뒤에, 검증 셋으로 이 모델의 일반화 성능이 얼마나 좋은지 확인해보면 되겠다. 얼마나 작은 간격으로 하이퍼 파라미터들의 경우들을 다룰지는 여유가 되는데로 하고 결과가 어떤게 좋은지 비교해나가면 되겠다.

 

5. 하이퍼 파라미터 세부 조정, 더 길게 학습하기

 4번째 단계 다음으로는, 이전 단계에서 구한 하이퍼 파라미터 값을 더 작은 간격, 세부적으로 조정하고, 더 길게 학습해보면 된다. 이 과정에서 한 에폭마다 몇 시간에서 몇일이 걸릴지는 학습할 모델이 얼마나 크냐에 따라 달린 문제가 되겠다.

6. 학습 커브 보기

 다음으로는 학습 커브를 보고 하이퍼 파라미터를 어떻게 조정해 나갈지를 판단하면 된다.

 이 학습 커브를 보면 좌측에 있는게 학습률 비용이고, 우측 그래프가 정확도를 나타내는데, 여기 나오는 훈련, 검증 정확도를 보고 모델이 올바르게 학습되는지 나쁘게 학습되는지 판단할수 있다.

 

 이 그림은 다른 종류의 학습 커브인데, 앞에서는 평평하게 가다가 어느 시점에서 떨어지기 시작하는 형태인데, 이 경우 초기화를 잘못 시켰다고 볼 수 있다. 왜냐면 훈련 시작 당시에 제대로 학습되지 않기 때문인데, 어떻게 초기화를 시킬지 조정해서 다시 시도해보면 되겠다.

 

 

 다른 문제 상황 예시로는 비용이 처음에는 잘 줄어들었다가 어느순간부터 평탄해지는 경우인데, 이 경우 학습률 감쇄를사용해야 한다. 이 경우는 학습률이 너무 높아서 시간이 지남에 따라 제대로 수렴하지 못해 평탄해지기 때문이며, 학습률 감쇄로 학습률을 낮추면 되겠다.

이번 경우는 반대로 학습률 감쇄를 너무 빨리 사용한 경우인데, 학습률 커브가 잘 내려가다가 감쇄하는 지점이후로 완전히 평평해져버린다. 이렇게 학습률 감쇄를 너무 빨리 한 경우에는 초기 학습률로 계속 진행하고 나서 감쇄해야 되겠다. 지금까지 본 내용들은 학습률 감쇄를 했을때 훈련 비용의 이동 평균이 어떻게 되는지를 보았고,

 

 

 

  훈련, 검증에 대한 정확도 그래프로 곡선 형태에 따라 특성을 알수가 있다. 이 예시에는 시작 당시에는 지수적으로 증가하고 이후에는 천천히 선형적으로 증가하고 있는데 훈련과 검증 정확도 사이 어느정도 갭을 두고 계속 진행하는 경우에는 학습을 더 오래 해서 더 좋은 성능의 모델을 얻을수가 있다.

 

이번 예시는 오버피팅 특성을 보이는 그래프의 정확도를 보여주고 있는데, 훈련셋의 정확도는 시간이 갈수록 계속 증가하지만 검증셋의 성능은 고지점에 도달하고 나서 계속 감소하고 있으며, 훈련과 검증 정확도 사이 일정한 간격이 유지되지를 않는다. 이렇게 학습과 검증 정확도사이 간격이 증가하는 것은 오버피팅이 되고 있을을 나타내는 것이며, 이를 개선하기 위해서는 규제 강도를 높인다거나, 훈련 셋을 늘린다거나, 드문 방법으로 모델의 크기를 축소 시키는게 필요하다.

 

 이번 그래프는 훈련과 검증 성능이 거의 동일하게 좋게 나오는 경우인데, 오버피팅이 존재하지 않으므로 좋다고 볼수는 있지만 훈련 셋과 검증셋의 성능이 같다는건 데이터를 과소 적합을 한다는 의미로, 좋지 않은 신호로 볼 수 있다. 이 경우 모델 크기를 늘리거나, 규제 강도를 낮춤으로서 성능을 더 개선할수가 있겠다.

 

(질의응답 생략)

 

 이제 하이퍼 파라미터 탐색의 마지막 단계는 이런 비용 함수에 대한 곡선을 보고 어떻게 하이퍼 파라미터 구간을 설정해서 조정해나갈지를 판단해서 5번째 단계로 돌아가서 시간 여유가 있는 만큼 반복하면 되겠다.

 

300x250
728x90

michigan online justin johnson

deep learning for computer vision

Training Neural Networks Part 2

 

 

 이제 11번째 강의를 할 차례고 오늘 배울 내용은 몇가지 핵심적인 팁들과 신경망을 학습하는데 필요한 기법들에 대해서 배워보도록 합시다.

 

 우선 이번 강의에서 더 나은 제목을 만들지 못해서 일단 사과를 하고, 지난 강의에서는 신경망을 학습을 할때 필요한 다양한 방법들을 살펴봤었습니다. 하지만 어떻게 해야 좋은 타이틀을 만들지가 어려웠습니다.

 

 아무튼 이번 강의에서는 여러분들이 신경망을학습하는데 알아야할 것으로 약간 다른 주제의 중요한 것들을 다루려고 합니다. 지난 시간에는 one-time setup 그러니까 신경망 아키텍처에서 시작 설정을 어떻게 할지에 대해 위주로 살펴봤는데 학습을 시작하기전에 해야될 것들을 배웠다고 할수 있겠습니다.

 

 그래서 아주 다양한 활성화 함수들에 대해서 살펴봤었고, 왠만한경우 ReLU를 사용하기로 정리하였습니다.

그리고 데이터 전처리에 대해서도 이야기 했지만, 데이터 전처리에 관한 미스터리들은 과제를 하면서 이해할수 있었을거에요.

 그리고 다음으로는 자비에 같은 초기화 방법들을 사용해서 어떻게 활성화 함수를 초기화 시킬지 신경망 각 계층마다 좋은 분포로 나올수있도록 하는 것에 대해서 살펴봤구요.  그 과정에서는 출력 결과가 너무 작아 0에 가까워지거나 혹은 너무커서 1이나 -1로 극단적으로 되거나 하는 문제 사이에서 어떻게 이걸 트레이드 오프/궤환관계/조정을 해나갈지에 대한것들을 볼수 있었습니다.

 

 그리고 지난 시간에 데이터 증강에 대해서 이야기했는데, 기존 훈련 셋을 신경망에 학습 시키기전에 훈련 데이터셋을 임의의 변환들을 적용해서 훈련 셋의 크기를 여러배로 늘리는 방법을 말한다고 했었습니다. 그리고 데이터 증강 방법을 고를때 우리가 어떤 문제를 다룰것인지에 따라 다른 데이터 증강 기법을 사용해서 신경망 훈련 과정에 사용하였습니다.

 

 그리고 우리는 규제에 대한 일반적인 개념들을 봤었는데, 과제물에서 l2 같은 규제가 규제항을 추가하여 사용해보았을겁니다. 이 규제항은 비용 함수에 추가되어 패널티를 주는데 L2 규제의 경우 가중치 행렬의 노름 norm을 사용하였었구요.

 

 하지만 지난 시간에는 신경망에서 자주 사용되는 더 일반화시킨 규제기, 규제 역활을하는 방법에 대해서 봤었는데 이 방법에서는 신경망의 순전파 처리과정에 랜덤성 같은 노이즈를 주고, 테스트 과정에서 노이즈/랜덤성에 대해 주변화를 한다거나 평균을 구하는 과정이 규제의 일반화 된 패턴인 것으로 알 수 있었습니다.

 

 위 그림에서 다양한 규제 방법들의 예시를 볼 수 있는데, 우리는 드롭 아웃이나 프랙탈 풀링, 드롭 커낵스, 확률적 깊이 방법이나, 실제로는 잘 사용되지는 않지만 컷아웃이나 믹스업 같은 특이한 방법도 알아봤었어요. 아무튼 규제에 대해서는 여기까지 봤고, 이제 다음 배울 내용으로 넘어갑시다.

 

 지금까지는 지난 시간에 배운 내용들을 살펴봤고, 오늘은 어떻게 신경망을 학습시킬것인가에 대한 다른 중요한 주제들에 대해서 배워봅시다. 특히 이번에 이야기하고자 하는건 모델을 훈련 시킬때 조심할 필요가 있는데, 모델이 학습할수 있도록 하기 위해선 학습률 스케줄 learning rate schedule을 설정하고, 어떻게 하이퍼 파라미터를 선정할지를 잘 고려애야 합니다.

 

  이 과정이 엄청 힘든건 알지만, 그 이후에 우리가 추가적으로 고려해야 할 사항들은 학습을 잘 마친 이후인데, 우리 모델을 어떻게 할지에 대해섭니다. 모델 앙상블을 할수도 있고, 전이 학습을 할 수도 있고, 그리고 만든 모델을 스케일 업, 더 키워서 어떻게 전체 데이터센터 레벨에서 계산을할지 등을 학습한 이후에 고려해야 합니다.

 

 우선 가장 먼저 다룰 주제는 학습률 스케쥴 learning rate schedules인데

 

  이전에 다양한 최적화 알고리즘을 봤었었죠. 바닐라 SGD나 SGD + 모멘텀, Adagrad, RMSProp, Adam 같은 것들이요. 그리고 이 모든 최적화 알고리즘들은 학습률 learning rate라고 부르는 하이퍼 파라미터를 가지고 있었어요. 보통 이 학습률 하이퍼 파라미터는 심층 신경망 모델을 설정하는데 있어서 필요한 가장 중요한 하이퍼 파라미터라고 할수 있습니다.

 

 지금까지는 다양한 모델들에다가 SGD를 사용을 했었다보니, 다른 최적화기에다가 다른 학습률을 사용했을때 어떤일이 일어날지 아마 감이 잡히기 시작할건데, 일단 위의 왼쪽 그림으로 다양한 학습율을 지정했을때 최적화가 어떻게 되는지 보여주고 있다.

 

 이 그림에서 노란색 예시는 학습율을 너무 높게 지정한 경우로 바로 폭증해 버려 무한대로 가게 된다. 그래서 아주 빠르게 잘못되는 경우라고 볼수 있다. 반대로 파란색 같은 경우에는 학습률을 아주 작게설정한 경우로 학습하는 과정이 매우 느리게 진행된다. 이렇게 학습률을 설정한느건 비용이 무한대로 폭증하지는 않아 좋을수는 있지만, 학습하는 과정에서 비용이 떨어지도록 하는데 오랜 시간이 걸리게 된다.

 

 이번에 녹색선의 경우 학습률이 높기는하나 너무 싶하기 크지는 않은 경우로 다행이 비용이 무한대로 폭증하지는 않는다. 파란색 학습률보다 높게 설정한 덕분에 더 빠르게 최저점으로 수렴을 할수있으나 비용이 최소가 되는 지점으로 확실하게 수렴한다고는 할수 없는 문제가 있다.

 

 마지막으로 빨간색 곡선의 경우 가장 이상적인 학습률로 비용이 최소가 되는 지점으로 빠르게 수렴하며, 무한대로 폭증하지 않고, 학습 과정이 꽤 빠르게 진행된다. 그래서 빨간색 곡선과 같은 학습률을 찾는게 좋겠다.

 하지만 빨간색 커브처럼 좋은 학습률을 찾지 못하는 경우도 있는데, 이런 완벽한 학습률을 찾을수 없을때는 위의 질문 처럼 우리는 어떻게 해야할까? 어떻게 위 그림에서 보이는 차선의 학습률들 사이에서 트레이드 오프를 잘 고려해서 선택해야한다고 한다면

 위 질문에서는 사용하기 가장 좋은 학습률이 어떤 것인가를 묻고 있으나 이 질문을 조금 비틀어서 보면, 꼭 다양한 학습률중에서는 한가지만 사용해볼 필요 없이 모두 사용해보면 된다.

 

예를 들자면 상대적으로 학습률이 큰 경우에서 시작해서 녹색 곡선같은, 그러면 비용은 첫 학습 에폭에서는 비용이 어느 정도 낮은 지점까지 떨어지고 나서 시간이 흐르면 녹색 커브는 평평하게 된다.

 

 파란색 곡선처럼 학습률이 낮은 경우를 생각하면 결국에는 비용이 가장 최저가 되는 지점을 찾을수 있을거다. 그래서 높은 학습률에서 시작하고 시간이 지나면서 학습률을 낮추면, 시작 당시에는 빠르게 진행하고 학습 끝에는 비용이 아주 작은 지점으로 수렴할수 있게 된다.

 

 하지만 지금까지 이야기 했던 것들은 명확하지 않고 애매하게 이야기를 했는데, 지금까지 큰 학습률로 시작하고 나중에는 낮은 학습률을 사용한다고 했지만 이 과정을 어떻게 구체적으로 표현할 수 있을까?

 

 조금 더 구체적으로 이야기 하자면 학습 과정에 학습률을 바꿔가는 메카니즘을 골라서 처리하는 과정을 학습률 스케쥴이라고 한다. 이 학습률 스케쥴에는 여러가지가 있는데 심층 신경망 모델을 학습하는데 자주 사용되고 있다.

 가장 많이 사용되는 학습률 스케줄 방법으로 스텝 스케줄이 있다. 위 예시에서 여러가지 학습률 값들이 있는데 ResNet에서 이런 스텝 학습률 스캐줄이 잘 사용되고 있다. 이런 학습률 스케쥴을 가지고 처음에는 상대적으로 큰 학습률 0.1로 시작하였다가 최적화 가정에서 특정 지점에서 학습률을 감쇄시키고자 더 낮은 학습률을 사용한다.

 

 그래서 ResNet에서 학습률 스케줄은 처음에는 0.1에서 시작하고 30 에폭에서 학습률을 0.01로 낮추어 학습을하고, 60에폭에는 더 크게 떨어트리고 90에폭에서는 더 떨어트리는 식으로 학습이 진행된다. 일반적으로 훈련 중 30 에폭마다 학습률을 1/10의 비율로 떨어트린다.

 

 위의 왼쪽 그림은 학습률 감쇄 스케쥴이라고 부르는 건데, 여기서 비용 함수의 특성이 나타나는 곡선을 볼수 있다. 여기서 스텝 학습률 감쇠로 첫 30 에폭 페이스에선 상대적으로 큰 학습률을 사용해서 빠르게 진행을 하여, 큰 값으로 시작했던 초기 비용을 지수적으로 줄일수가 있었다.

 

 하지만 30 에폭쯤에서 처음 처럼 빠르게 진행할 수가 없어, 이 30에폭 시점에서 학습률을 감쇄시켜 10으로 나눈뒤 학습을하면 다시 비용이 급격히 떨어져 지수적인 패턴이 나오기 시작한다. 또 다시 평탄한 부분이 나오면 60 에폭 쯤에서 학습률을 다시 감쇄하여 빠르게 떨어트리고 다시 평탄해지는 스케줄을 사용하였을때 이런 특성이 나타나게 된다. 이게 스탭 학습률 스캐쥴이란 방법으로 모델을 학습시킬때 볼수 있는 학습률 곡선의 특성 형태가 되겠다.

 

 이런 스탭 학습률 스케쥴을 사용할때 문제가 있는데, 모델을 학습하는데 여러개의 하이퍼 파라미터가 필요하다. 지금까지는 우리는 어떤 규제를 할지, 지금까지 모델을 학습할때 사용했던 초기 학습율을 고를지를 고려했으나 그 뿐만이아니라 어디 쯤, 어느 에폭에서 학습률 감쇄를 할지도 골라야 한다.

 

 그렇다보니 스텝 감쇄 스캐쥴의 경유 튜닝하는데 워낙 많은 경우의 수가 있다보니 꽤 많은 시행착오가 필요하다. 사람들이 주로 학습률 커브를 설정하는 방식은 비용이 평평한 지점을 찾도록 꽤 오랫동안 큰 학습률로 학습을 시키는 것으로 한번 다른 논문들을 살펴본다면 다들 경험적인 방법을 사용했다고 하는데 비용이 평평한 지점이 나올떄까지 혹은 검증 정확도가 평탄해질떄까지 그대로 유지시키다가 학습률을 감쇄시키며 경험적으로 감쇄 스캐줄을 할 스탭을 선정하였다.

 

 하지만 이렇게 하는것의 문제는 다양한 감쇄 스케줄을 실험해볼 시간이 충분하지 않다는 점은데, 그래서 이 스탭 감쇄 스케쥴은 튜닝해야할 부분들이 너무 많다보니 이 사용하기 좀 까다로운 문제가 있다.

 

 

 그래서 스탭 감쇄 스케줄의 단점을 극복한 다른 학습률 스캐줄 방법으로 최근 몇년간 트랜드로 사용되고 있는걸로 코사인 학습률 감쇄 스케줄이 있다. 이 방법에서는 이전 처럼 특정 반복 회차, 에폭에서 감쇄하는게 아니라 시간에 대한 함수를 사용하는데, 학습률은 모든 에폭 회차에 대한 함수로 정해집니다. 그래서 여기서 할일은 학습률을 어떻게 감쇄시킬지를 나타내는 곡선 형태의 함수가 있으면 되요.

 

 이 중에서 가장 대표적인것으로 코사인으로 하프 코사인 학습률 스캐쥴러가 있으며 오른쪽과 같습니다. 여기서 학습률은 시간에 대한 함수로 처음에는 아주 큰 값으로 시작하고, 학습률 감쇄는 코사인파의 절반과 같은 형태로 정해지게 되요.

 

 그래서 처음에는 학습률이 높이 시작했다가 학습이 끝날떄 쯤에 핛습률이 감쇄되서 0에 가까워 지게 됩니다. 이 ㅋ코사인 학습률 감쇄 스캐줄은 파라미터가 2개 뿐인데, 초기 학습률로 사용할 $\alpha_{0}$와 다른 하나는 학습할 에폭의 수로 T로 표기합니다. 

 

 이 코사인 학습률 스케쥴에서는 초기 학습률과 에폭 수만 필요하지, 이전에 봤던 다른 하이퍼 파라미터가 필요하지 않습니다. 그래서 코사인 스캐줄러는 이전에 본 스탭 감쇄 스캐줄러보다 다루기가 쉬우며, 일반적으로 학습을 길게 할수록 잘 동작하는 경향을 보여요.

 

 우리가 할 일은 초기 학습률과 모델이 얼마나 오래 학습시킬지만 튜닝하면 되겠습니다. 그래서 이런 이유들 덕분에 코사인 학습률 스캐줄러가 최근 몇년간 가장 많이 사용되었다고 볼수 있겠습니다. 그리고 위 슬라이드 아래 부분에다가 최근 몇 년간 코사인 러닝 스케줄이 사용된 논문들을 짚어넣었습니다.

 

 

 하지만 코사인은 시간 변화에 따른 학습률 감쇄에 사용할수 있는 수많은 형태중 하나이고, 다른 감쇄 스케줄로 사람들이 종종 쓰는걸로 단순 선형 감쇄도 있습니다. 일정한 초기 학습률로 시작해서 학습 과정을 거쳐 0까지 감쇄가 되요. 하지만 코사인 감쇄보다 이 감쇄 학습 스케쥴은 학습률을 시간에 따라 선형적으로 간단하게 감쇠를 해요.

 

 그리고 많은 문제에서 잘 동작을 하는데, 짚고 넘어갈 점은 다른 스케줄링 기법이랑 비교해서 잘되는지에 대한 좋은 연구들이 없습니다. 그래서 코사인 학습률 스캐줄러가 좋은지 선형 학습률 스캐줄러가 좋은지 확실하게 말하기는 어렵습니다.

 

 제 생각에 대부분의 사람들이 실제로 사용하는 방법은 사전에 있었던 연구가 어떤 타입의 스케쥴을 사용했던지 상관없이 참고해서 사용합니다. 이게 무슨 말이냐면 여러 딥러닝 분야에 따라 다른 학습률 스캐줄 방법을 사용하는 경향이 있는걸 보게 될게 되요.

=> 정리가 매끄럽지가 않은데 다시 정리하면

학습률 스캐줄러를 정하기 위해서 관련된 사전 연규에서 사용한 학습률 스캐줄러를 사용함.

그래서 특정 문제에서 비슷한 학습률 스캐줄러가 자주 사용되는 경향을 보임

 

 하지만 한 분야, 특정 분야에서에서 그 학습률 스캐줄러가 좋아서 그렇게 사용했다고 하기보다는, 저의 생각에서는 이전 연구에서 있었던것과 비교하기 위해서 그렇게 한다고 생각됩니다.

-> 이전 연구에서 사용한 학습률 스캐줄러를 쓰는건 그 스캐줄러가 해당 분야에서 성능이 다른것 보다 좋아서라기 보다는 이전 연구와 비교하기 위함. 

 

 우리가 이전 연구를 보면서 명심해야할건 우리가 다룰 컴퓨터 비전의 문제에 따라서 어떤 경우 코사인 학습률 감쇄 스캐줄을 사용할수도 있고, 아주 큰 스캐일의 자연어 처리를 다루는 경우에는 선형 학습률 스캐줄을 사용할수도 있습니다.

 

 이 학습률 스캐줄링은 비전이랑 자연어에 대한 근본적인것은 아니지만 서로 다른 분야의 연구자들이 연구해온 방향대로 사용하면 되겠습니다.

 

 

 이번에 또 다른 학습률 스캐줄러로 역 제곱 루트 스케줄러가 있는데, 아주 큰 학습률로 시작해서 작은 학습률로 끝나게 되는데, 이 방식은 2017년에 아주 주목을 받던 논문에서 사용하던거라 추가하였습니다. 하지만 선형 감쇄 스캐줄이나 코사인 감쇄 스캐줄과 비교해서 사용되는갈 자주보지는 못했어요.

 

 제 생각에는 역 제곱근 스캐줄러가 가지는 잠제적인 위험은 아주 높은 학습률을 사용하는 시간이 아주 짧기 때문이라고 봅니다. 여러분도 이 학습률이 아주 큰 초기값으로 시작하지만 급격히 떨어지고 대부분의 시간을 아주 낮은 학습률로 학습을 하게되는걸 볼수 있어요.

 

 그래서 이걸 선형이나 코사인학습률 스캐줄과 비교해본다면, 다른 학습률 스캐줄러는 초기에 아주 높은 학습률이 더 오랜 시간동안 사용되는걸 볼 수 있어요.

 

 

 지금까지 본 학습률 스캐줄과 다른 이번에는 실제로 아주 많이 사용되는 학습률 스케줄링 방식은 상수 스캐줄 입니다. 이건 아주 많은 문제들에서 실제로도 잘 동작을 하는데, 우리가 알다시피 그냥 초기 학습률을 지정하면 그 학습률로 전체 학습 과정에서 쭉 학습을 하는거에요.

 

 이 방식을 다른 걸쓸 이유가 없다면 실제로 쓰는걸 추천하는데, 사람들이 딥러닝 프로젝트를 시작할때 이 학습률 스캐줄을 가지고 오랜시간 해매는걸 봤었고, 이 학습률 스캐줄을 조정해나가는게 모델을 개발하고 동작하는데 필요한 일인데, 상수 시간 학습률 스캐줄을 사용하면 꽤 좋은 결과를 얻을수 있어요.

 

 상수 학습률 스캐줄과 다른 복잡한 스캐줄을 사용했을때 모델이 동작하느냐, 안하느냐에서 일반적으로 차이는 없고 대신 상수 스캐줄에서 복잡한 스캐줄로 바꿀때 성능이 몇 퍼센트 정도 더 좋아집니다. 그래서 어는 문제에 대한 기술을 다룰 뿐만이 아니라 목표가 해매는 일 없이 빠르게 돌려보고 있다면, 상수 시간 학습률이 꽤 좋을 수 있겠습니다.

 

 여기서 학습률과 최적화기 사이에 대해서 더 이야기 할게 있는데, 확률적 경사하강 + 모멘텀을 사용할때 어떤 학습률 감쇄 스캐줄을 사용할 것인지가 중요할 수도 있습니다. 하지만 RMSProp나 Adam같은 복잡한 최적화기를 사용하는 경우라면 상수 시간 학습률 스캐줄만 사용해도 됩니다.(이전에 최적화에 대한 강의에서 RMSProp, Adagrad 등의 방법에서 학습률을 최적화기가 조정했던 것으로 기억)

 

 다음 주제로 넘어가기 전에 학습률 스캐줄에 대한 질문들을 보면, 여러분들은 오랜 시간 동안 학습을 해서 비용이 쭉 내려가면 아주 좋겠죠. 여러분들이 만든 모델이 좋은 모델이니까. 그런데 비용이 갑자기 증가해버린다면 실망할겁니다. 하지만 이런 일이 있을때 일반화시켜서 말하기가 힘드는데, 잘못 동작하도록 해서 이런 문제가 생기는 원인이 많으니까요. 

 

 한가지 경우는 중간에 그라디언트가 0이 되는 경우가 있어서 그럴수도 있는데, 이 문제가 아니라 그라디언트가 여러번 반복하는과정에서 너무 누적되서 급격히 커지는 경우가 생기면 학습이 잘못 될겁니다. 또, 우리가 다루는 문제의 타입에 따라 잘못된 학습 과정으로도 이런 문제가 생길수도 있구요. 다른 종류의 생성모델이나 다른 종류의 강화학습 문제를 다루다가 학습 커브가 잘못되는걸 볼 수도 있겠습니다.

 

 우리가 잘 정리된 분류 문제를 다룬다고 해도, 일정 기간 학습을 한 후에 비용이 급격히 커지는 일이 생긴다면, 나쁜 하이퍼 파라미터를 써서 버그가 생긴걸 수도 있고, 데이터가 로드 되는 과정에서 버그가 생겼거나, 훼손된 데이터를 가지고 학습을 시켜서 생깃 것으로 추정할 수도 있겠습니다.

 

 그리고 우리가 가진 데이터셋에 한 샘플이 잘못된 경우도 문제의 원인이 될수도 있고, 다른 문제가 생길수 있는 경우로 여러분들이 Flickr를 알고 있으면 사용자들이 Flickr나 다른 사진 공유 사이트에 올릴수 있을거에요. 그리고 후에 이 사진들을 삭제를 할수도 있겟죠.

 

 Flickr 이미지 배포 링크로 실제 JPEG이미지들을 모아 데이터셋을 만들수도 있는데, 그 중간에 이미 삭제된 이미지를 다운로드 하려고 할수도 있을거에요. 그래서 실제 이미지가 아닌 손상된 JPEG 파일/실제 내용은 없고 텅빈 이미지 파일을 다운받을 수도 있고, 훈련하는 과정에서 사용하면 그 이미지는 라벨은 가지고 있으나 0인 데이터가 될수도 있어 비용을 급격하게 증가시킬수도 있겠습니다.

 

 그래서 여러분이 이런 손상된 이미지들을 포함한 미니패치를 가지고 학습을 하려고해서 갑자기 이런 문제를 발생시킬수도 있어요. 그래서 일반화 시켜서 대답하기는 힘들고 여러분들의 문제가 뭐가 원인인지 깊게 들여다봐야 합니다.

 

 

 다음 질문은 적응적 학습률에 관한 것으로 Adadgrad나 RMSprop 혹은 다른 적응적 학습률 방법이 있는데, 이들도 문제를 발생시킬수도 있지만 이 방법들은 더 강인하게 만들어지다보니 그래도 최적화 문제에서 계속 사용해도 되갰습니다.

 

*이후 몇가지 질문에 대해서 더 얘기하지만 학습률 스캐줄에 관해서는 여기까지..

 

 

 

 훈련을 얼마나 지속시킬지 결정하는데 도움되는 것으로 빠른 중지early stopping이라고 하는 개념이 있습니다. 이전에 신경망을 학습하면서 주로 세가지 커브를 보았는데, 하나는 좌측의 비용에 대한 그래프로 정상적으로 동작하면 지수적으로 감쇄되는걸 볼수 있어요. 그리고 꼭 봐야하는것으로 신경망의 훈련 정확도인데, 매 애폭마다 채크를 해줘야하고, 훈련셋에 대한 정확도 뿐만이 아니라 검증셋에 대한 정확도도 확인해주어야 합니다.

 

 이 곡선들을 보면서 만든 신경망이 학습 과정에서 정상적으로 동작하는지 알수 있어요.  일반적으로 우리가 할수 있는건 검증 정확도가 가장 높은 지점에서 학습을 중지시킬수가 있겠습니다. 그리고 그리고 그 지점을 최대 반복 회수 최대 에폭으로 지정해서 훈련을 할수 있을것이고, 매 애폭마다 배치단위들을 학습할수가 있겠습니다.

 

 하지만 모든 에폭 혹은 모든 5에폭 단위 혹은 10 에폭씩 훈련셋과 검증셋 정확도를 확인해야하고, 각 지점에서 모델 파라미터들을 저장을 해두어야 합니다. 모델이 핛브을 마친 후에 이러한 곡선들을 그릴 수 있고, 가장 검증셋의 성능이 좋은 시점에서의 지점을 고르면 되겠습니다. 그 체크포인트에서의 모델을 실제로 사용하겠습니다.

 

 이런 식으로 모델을 돌리는 중간에 훈련 과정에서 비용이 뒤에 갑자기 증가하는 경우도 생기는데, 이건 큰 문제가 되지 않고, 그냥 커브를 보고 갑자기 증가하기 이전에 있는 것들 중에서 가장 적합한 체크포인트의 모델을 사용하면 되겠습니다.

 

 이 방법은 신경망을 어떻게 학습시킬지 어디까지 학습시킬지 고르는데 매우 유용한 경험적인 방법이라고 할 수 있겠습니다. 그리고 이걸 신경망을 학습할떄시킬떄마다 사용하라고 추천드리고 싶습니다. 

 

 

300x250
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
728x90

오늘(지금 12시가 지났으니 어제지만) 그래프 이론에 대해서 

 

중간에 NP 문제 때문에 계산 복잡도 내용이 더 많아지게 되었으나

 

그래프 이론을 정리하고

 

딥러닝에 대해서도 정리를해야 한다.

 

 

지난번에 계속 진도를 나갔어야 햿지만 대칭 깨짐 존재하지 않는다는게 No symmetry breaking이

 

왜 학습에 안좋은지 정리를 하다보니 분량을 너무 뺏기고 말았다.

 

일단 자기 전까지 가중치 초기화 부분이라도 마무리 하고자한다.

 

 

 

 

 

 

 

잠깐 지난 시간에 본 대칭 깨짐을 다시 생각해보자.

 

아무튼 지난 시간에 봤다시피 가중치 행렬의 모든 원소가 0이나 동일한 상수로 초기화를 해버린다면

 

중간에 가중치에 대한 그라디언트 행렬이 값이 같아져버리는 이상한 형태가 됬었다.

 

지난번에 symemtry breaking에 대해서 검색 해봤을 때

 

물리학에서의 대칭 깨짐이 나와서 못찾았는데

 

이번에 잠깐 검색해보니 머신러닝에서의 대칭 깨짐에 대해 누가 정리해놓은 글이 있더라

 

 

 

 

아래 글에 따르면 가중치 행렬의 모든 원소로 똑같은 값으로 초기화해서 대칭이 되는 경우 학습이 잘 안되고

 

가중치 행렬이 대칭이 깨어져야, 대칭이 깨어진 형태여야만 올바르게 학습을 할수 있다는 의미에서

 

대칭 깨짐이 있어야 한다고 하고,

 

 

위의 저스틴 존슨 교수님의 강의에서 no symmetry breaking이란 말은

 

가중치 행렬의 대칭 형태가 부숴지지않아, 다시말하면 대칭 형태로 되어있다는 말이고

 

그래서 대칭 형태가 되어있을때 학습이 안된다 = 대칭 깨짐이 없다 = no symmetry breaking 으로 표현한것 같다.

 

말 자체는 정말 간단한데 의역을 잘 못해서 생긴 문젠듯 하다. 

 

ref : machinelearning.wtf/terms/symmetry-breaking/

 

 

 

아무튼 다시돌아와서

 

그런 이유 때문에 실제로 신경망을 초기화 할때 작은 임의의 수로 초기화를 한다.

 

위의 예시에서는 가중치 행렬을 정규 분포로 초기화를 시키고 0.01을 곱하여 표준 편차를 줄여주고 있ㄴ느데

 

이런 가우시안 분포로 가중치 행렬을 할때에는 평균이 0으로 지정하나, 표준 편차의 경우 위의 0.01과 같이 하이퍼 파라미터로 설정 할 수 있다.

 

 

 

 그래서 이렇게 작은 임의의 가우시안 분포를 따르는 값으로 초기화하는 경우는 얕은 신경망에서 잘 동작하지만 깊어질수록 잘 동작하지 않는 문제가 있다고 한다. 왜 그런지 활성화 함수에 관한 통계량을 보면서 알아보자.

 

 

 

어떻게 진행되는지 일단 이 코드 스니팻/코드 조각을 보면서 어떻게 계산되는지 6층 신경망이 순방향으로 가면서, 은닉층의 크기는 4096개라고 하면

 

-> 일단 이 코드 스니팻/조각을 보면서 어떻게 활성 통계량들이 전파되는과정에서 계산되는지 은닉층의 유닛이 409개인 6층 완전 연결 신경망의 예시로 한번 보자.

* 이렇게 긴덩어리는 풀기 너무 힘들다.

 

 그래서 여기서는 tanh를 활성화 함수로 쓸건데, 그 이유는 얼마전 슬라이드에 봤었던 어드바이스들을 안따랏을때 어떻게 되는지 보려고한다.(tanh를 사용한 경우 입력이 x가 -inf, +inf에 가까워질수록 y는 각각 -1, +1에 가까워졌으며 그라디언트 소멸이 발생함)

 

 

 순방향으로 처리하고, 각 계층들의 은닉층 값 그러니까 다음층의 입력에서 사용되는 값(이전 계층에서 활성화 함수의 출력)의 히스토그램을 보여주고 있다.

 

 일단 여기서 가중치 행렬을 곱하고, tanh를 적용한 결과로 여기서 보면 값들이 어떤 분포 형태를 따르는걸 볼 수 있다. 하지만 신경망이 깊게 들어가면 들어갈수록 활성화 함수가 모든 출력들을 0에 가까운 수가 나오도록하게 만든다.

 

 그래서 이렇게 되면 모든 활성화 함수의 출력에 0이 가까워지고, 그라디언트도 근사적으로 0에 가까워지기 지다보니 결국 역전파를 계산하기 힘들어져 좋다고 할 수 없다.

 

 첫번째 계층 행의 경우 tanh를 통과하다보니 모든 값들이 -1과 1 범위 사이안에 존재하게 되었고, 이게 처음으로 통과하다보니 히스토그램의 값이 고르게 분포가 되어있다.

 

 하지만 두번째 계층의 경우 다시 tanh를 거쳐 출력하는 만큼 1층보다 -1 혹은 1에 가까워질 경우의수 빈도가 줄어들다보니 첫번째 계층의 은닉층 값 만큼 고르게 분포되어 있지 않다.

 

 세 번째 층, 넷, 다섯, 여섯 번째 층까지 순전파가 진행되는 과정에 tanh라는 활성화 함수로 인해 대부분의 출력 값들이 0에 가깞게 분포하게 되어 처음 표준 편차가 0.49이던것에서 0.05로 줄어들었다.

 

 그래서 이 신경망은 활성정도가 0에 가까워지면서 그라디언트의 갱신치도 0에 가까워지고 효율적으로 학습을 할 수 없게 되는게 이렇게 가중치 초기화시키는 경우의 문제라고 할 수 있겠다.

 

 

 잠깐 여기서 말이 햇갈리는게 tanh의 입력이 -inf, inf에 가까운경우 그라디언트가 0에 가까워지는건 이해가 되는데 왜 활성 정도가 0으로 되면 그라디언트가 0에 가까워진다는건지 이해가 되지않는다.

 

 

 그냥 내 생각에는 가중치 갱신치를 계산하는데 입력 그러니까 이전 은닉층의 활성 정도가 0에 가까우니 가뜩이나 작은 가중치 갱신치가 매우 작아져 학습이 제대로 되지 않는다고 생각된다.

 

 

 

 그래서 표준 편차를 0.01로 아주 작게 해서 가중치를 초기화하는 바람에 이런 문제가 생겼고 대신에 0.05로 초기화 하는 경우를 한번 보면,

 

 

 

 이번에는 가중치 행렬이 너무 커져지다보니 tanh 비선형 활성화 함수의 포화 영역으로 입력값들을 밀어 넣게 된다. 그래서 히스토그램을 보면 이렇게 큰 값으로 가중치 행렬을 초기화 시킨 결과 대부분 tanh 함수의 출력 값들이 포화영역에 위치한걸 볼수 있다.

 

 그래서 이렇기 때문에 로컬 그라디언트는 0이 되고 학습이 제대로 되지않는다. 그래서 지금까지 가중치를 너무 작게 설정했을때 그라디언트에 0에 가까워지던 경우랑 가중치를 너무 크게 설정하여 활성 정도가 포화 영역에 빠져버리던걸 봤었다.

 

 

 그래서 우리는 가중치를 너무 작지도 않고, 크지도 않지만 좋은 성능을 보이는 골디락스 존을 찾아서 초기화 시켜야 한다. 위 슬라이드의 아래에 인용된 논문에서는 표준 편차를 하이퍼 파라미터로 사용하지 않고, 표준편차를 1/sqrt(Din)으로 사용하여 가중치 행렬을 초기화 시키는 방법을 자비에 초기화 Xaiver Initialization이라고 정의 하였다.

 

 

 

 

 그래서 이런 골디락스 영역으로 가중치를 초기화 시킨경우 활성 히스토그램이 아주 좋게 조정된 분포 scaled distribution로 나오게 되며 더 이상 신경망 깊이이 깊어지면서 가중치가 사라지는 문제가 줄어들었다.

 

 

 그리고 완전 연결 신경망 뿐만이 아니라 합성곱 계층 경우에도 잘 동작한다. 이런 자비에 초기화 방법은 출력의 부산이 입력의 분산과 동일하게 해주는 방법이라고 할수 있겠다. 이후 내용은 정의에 관한 건데 정리 하기 힘들고 일단 이 부분에서 자비에 초기화가 입력의 분산과 출력의 분산이 같게 만들어주는 초기화 기법인지에 대한 증명 과정 같은거라 넘어가겠다.

 

 

 하지만 문제는 활성화 함수로 ReLU를 사용하는 경우인데 (생략한) 정리 내용은 랠루 같은 힌지 비선형 함수를 고려한게 아니라 문제가 된다.

 

 제가 지금까지 예시에서 tanh를 사용한 이유는 이 함수로 선형 연산 계층에 대해서만 이야기했기 때문이며, 이런 선형 함수에서 tanh처럼 0 주위로 대칭이 되는 비선형 함수를 사용할 수도 있기 때문이다.

 

 

 

 

 선형 계층들의 분산들이 tanh를 사용했을때 일치되어/다 비슷비슷 해져서 괜찬지만, ReLU를 사용하는 경우에는 같은 방식으로 초기화 하면 문제가 생긴다.

 

 위 그림을 보면 ReLU를 활성화 함수로 사용한 경우를 볼수 있는데 활성 통계량이 망가져서 히스토그램이 이상하게 만들어지는걸 볼수 있다. 이 이유는 ReLU가 x = 0을 기준으로 힌지 형태이기 때문이며 ReLU가 0이하의 모든 값들을 제거하기 때문이다.

 

 이번에는 히스토그램의 0이 아닌 부분을 위주로 보면 심층으로 갈수록, 활성 정도가 0에 가까워지는걸 볼 수 있고 로컬 그라디언트가 0이되어 학습하기 어려워지게된다. 

 

 

 이런 문제가 있다보니 ReLU 활성화 함수에 적합한 다른 초기화 방법이 필요한데, 이 문제를 고치려면 2로 표준 편차를 나눈걸  곱해주면 된다.

 

 자비에 초기화에서는 sqrt(1/Din)을 표준편차로 사용했었지만, ReLU 함수의 경우 sqrt(2/Din)을 표준편차로 사용하면 된다. 여기서 2인건 ReLU가 입력의 절반을 죽이던거에 대처하기 위함이며이런 초기화 방법을 초기에 나왔을때는 Kalming 초기화 혹은 논문 저자가 마이크로소프트 아시아 연구팀에 있었다보니 MSRA 초기화라고도 부르고 있다.

 

 그래서 우리가 이런 비선형 함수를 초기화를 할때 MSRA 초기화 방법이 필요할 수도 있을거고, 써보면 잘 동작하는걸 볼수 있다고 한다. 그리고 지난 시간에 VGG 모델에 대해서 이야기 했었는데, 그 아키텍처가 만들어진 2014년 당시에는 아직 배치 정규화가 없다보니 괴상한 트릭을 사용하지 않고서는 VGG를 수렴시킬수가 없었다.

 

 하지만 이 Kalming 초기화 기법 덕분에 VGG는 초기화 방법만 간단하게 바꿈으로서 학습을 할수 있어졌고, 크게 유명한모델이 될 수 있었습니다.

 

 

 하지만 기억해야할 건 VGG에 대한 경우이고, 지난 시간에 표준 베이스라인 아키텍처로 ResNet을  사용해야한다고했었습니다. 이 모델에서는 MSAR, Kalming 초기화 방법은 ResNet에 좋은 방법은 아니에요.

 

 그래서 ResNet을 사용한다고 가정할때, 출력의 분포와 입력의 분포를 동일하게 만들어주는 여기에 맞는 합성곱 계층들의 초기화 방법을 만들어야 하는데요. 

 

 이 신경망에서 Residual connection, 스킵 커낵션을 사용하다보니, 스킵 커낵션 이후로는 입력을 다시 더해보리기 때문에 출력의 분산어 더 커지게 될겁니다.

 

 그래서 여기서 MSRA이나 자비에 초기화를 잔류 신경망에다가 사용한다면 활성의 분산은 여러 계층을 거치면 거칠수록 계속 커지다보니 폭발하게 될거고, 최적화 과정에 있어서 좋은 방법은 아니에요.

 

 그래서 ResNet에서 사용할수 있는 해결 방안으로는 Residual Block 잔류 블록의 첫번째 계층은 MSRA로 초기화 시키고, 두번째 계층은 0으로 초기화 시키면 되겠습니다. 그렇게 하면 이 블록은 분산을 완전히 보존하면서도 항등함수처럼 동작할수 있거든요. 이 기법은 ResNet을 초기화 하는데 자주 사용되고 있어요.

 

 -> 이 부분에서 이해가 안되점은 두번째 합성곱 계층의 가중치를 0으로 초기화를 시킨다면 이전 계층에서 뭐가 들어오던간에 활성화 함수의 입력이 0이 된다는 얘기라. 위 그림의 2번째 합성곱 계층 뒤에 입력 x를 더하면 그대로 x가 될텐데 Var(x + F(x) ) = Var(x)라고 표기하는 이유를 잘 모르겠다. 어짜피 F(x) = 0인데도 일단 이부분은 넘어가고 잠깐 이전에 이해되지 않던 Residual Block에 대해 검색해보았다.

 

 

Residual Blcok 잔차 블록

* 그동안 잔류 블록이라 불렀는데 잠깐 검색해보니 잔차 블록이 맞는것 같다. 이 블록이 항등 함수가 되도록 한다는 말의 의미가 잘 이해가 되지 않았는데 아래의 링크를 통해서 이 블록이 항등함수가 되도록 학습한다는 것의 의미를 조금 더 이해할 수 있었다.

ref : a292run.tistory.com/entry/Residual-blocks-Building-blocks-of-ResNet-1

 

 아무튼 기존의 합성곱 블록 같은 경우에는 신경망이 깊어지면서 항등 함수와 동일한 역활을 하는 합성곱 블록이 필요한데, 기존의 블록으로는 항등함수가 되도록 학습을 할수 없는 문제가 있었다. 그래서 스킵 커낵션을 활용해서 나온게 잔차 블록이다.

 

 이전에 통계를 공부할 때 잔차는 (실제 결과 - 예측 결과) 같은 값을 보고 잔차라고 했었고, 최대한 잔차가 줄어드는 방향으로 계수를 구했었다.

 

이 신경망 모델에서의 잔차는 입력 x와 실제 입력 x의 분포인 H(x)의 차이를 잔차라고 하더라

 

신경망에서의 잔차 R(x) = Output - input = H(x) - x

 

H(x)에 대한 식으로 정리하면 H(x) = x + R(x)의 형태가 된다.

 

이 잔류 블록 전체의 출력이 H(x)이고, 잔류 블록의 두 합성곱 계층의 출력이 잔차 R(x)가 된다.

 

기존의 합성곱 블록은 출력 H(x)을 학습하고, 잔차 블록은 잔차 R(x)를 학습다고 할 수 있다.

 

 

아무튼 모델이 항등 함수가 되려면 R(x) = 0이면 되고,

 

신경망은 항등 함수가 되는 방향, 합성곱 계층이 잔차가 0이 되도록 학습한다고 할수 있다고 한다.

 

 

 

 

 

 그래서 여러분들이 자신만의 신경망을 초기화 할때 어떻게 할지 짚고 싶은건, 여러분들은 하나의 초기화 방법만을 사용하고 싶을수도 있지만, 연구되고 있는 다른 방법들을 사용하면 더 좋은 결과가 나올수도 있을 거에요. 

300x250
728x90

그동안 ppt로 강의 내용을 정리하고 있었는데 오늘 부터는 블로그에다가 그대로 하려고한다.

 

계속 똑같은 사진 복붙하기가 너무 힘들어

 

 

지금까지 데이터 전처리에 대해서 봤고 다음으로 다룰 내용은 가중치 초기화에 대해서 다뤄보겠습니다. 여러분들이 신경망을 학습할떄마다 맨 처음에는 어떤 방법으로든 가중치를 한번 초기화를 해줘야 해요.

 

 

 

 한번 질문을 하면, 우리가 가중치와 편향을 0으로 초기화하면 어떤일이 벌어질까요? 아마도 아주 안좋은 결과가 나오게 됩니다. 왜냐면 가중치와 편향이 0이라는건 ReLU나 다른 비선형 활성화 함수들의 출력값들이 0이 될것이고, 그러면 입력 값으로 뭘 받던간에 그라디언트가 0이되버려서 멈춰버리겠죠.

 

-> 가중치 행렬이 모두 0이 되면 출력이 0이 되니, 해당 층에 대한 로스의 그라디언트도 0이 되는건 당연할거같다.

 

 

 

 그래서 실제로 사용할때는 이런 문제 때문에 0으로 초기화 시켜서는 안돠요. 0이나 특정한 상수로 초기화해서 생기는 문제, 대칭 깨짐symmetry breaking이 일어나지 않거든요.

-> 가중치 행렬의 모든 원소를 0 혹은 특정한 상수로 다 채워버리면 행렬 자체가 대칭해져버리기 때문

-> 대칭 깨짐에 대해 검색했더니 물리학적인 용어가 나오는데 행렬 원소들이 다 똑같아, 대칭이되니 대칭깨짐이 없다고 말하는거같다.

-> 아니면 가중치가 모두 같은 값을 가지면 가중치의 대칭이 깨지는 식으로 학습이 되지 않아 대칭 깨징이 없다고 하는거같기도 하고

ref : en.wikipedia.org/wiki/Symmetry_breaking

 

 

 왜냐면 훈련 셋이나 다른 뉴런들을 구분할수 없게 됩니다.

-> 모든 뉴런들이 같은 가중치를 가지고 있으면 학습이 되지 않을거고, 훈련 데이터를 구분할수도 없고/뉴런도 다 똑같아 보여서 그런가 싶다.

 

 

 그래서 상수값으로 초기화를 시키면, 어떤 훈련 데이터가 들어오더라도 모든 그라디언트가 같다보니 학습을 실패하게 되는 경우가 흔하게 생겨요. 그렇게 되면 신경망은 뭘하던간에 학습을 할수 없을거에요.

 

* 이전에 그라디언트 계산하는걸 정리하기는 했는데 다시 그리자니 감이 안잡히고 한번, 가장 간단한 계산그래프로 그려봣다.

모든 x의 그라디언트가 2가 되기는하지만 w의 경우 별 이상이 없어보이는데 한번 행렬의 경우 어떻게 되는지 봤다.

 

 

 

 

* 이전에 역전파 강의에서 본 행렬곱 연산을 참고해서 가중치 행렬을 똑같이 줬을때 어떻게 되는지 보자

 

 

일단 아래의 간단한 2층 신경망의 예시에

 

첫번째 가중치 행렬은 전부 2, 두번째 가중치 행렬은 전부 1을 주어 순전파 계산을 마치고,

 

출력의 두 원소가 (18, 18)로 동일하므로, 출력 Y에 대한 비용도 (5, 5)로 해주었다.

* 은닉층의 값부터 다 같아지기 시작하면서 일반적인 신경망 연산과는 다르게 진행되고 있다.

 

그러면 2번째 계층의 그라디언트와 이전 층으로 역전파 시킬 그라디언트를 아래의 식으로 구할수가 있는데

 

 

 위 식으로 은닉층에 대한 그라디언트와, 두번째 가중치 행렬에 대한 그라디언트 결과를 얻을수가 있었다.

이제 첫번째 완전 연결 계층의 가중치 행렬을 구할 수가 있었는데,

 

업스트림 그라디언트가 (10, 10, 10)으로 들어오는 바람에

 

첫번쨰 가중치 행렬의 그라디언트도 일반적인 가중치행렬의 그라디언트가 되지를 않고

 

대칭적인 형태가 보인다.

 

이런 이유로 가중치 행렬의 모든 원소들을 0이나 특정 상수로 초기화 하는 경우

 

가중치 행렬의 그라디언트들이 대칭 행렬이 되어버려

 

no symmetric breakinig -> 대칭 깨짐이 발생하지 않는다고 한것같다.

 

아무튼 일반적으로 생각하는 대각으로 대칭은 아니긴하지만

 

행렬들이 이런식으로 되면 학습이 안될수 밖에 없을거같다.

 

 

오늘 딥러닝은 여기까지.

300x250
728x90

 

 

 

 

 

 

저스틴 존슨 교수님 강의 정리

10강 신경망 학습하기 파트 1 - 2. 데이터 전처리
+ 활성화 함수 나머지

300x250
728x90

 

 

저스틴 존슨 교수님 강의 정리

10강 신경망 학습하기 파트 1 - 1. 활성화 함수

 

 

 

 

 

300x250
728x90

 

저스틴 존슨 교수님 강의 정리

8강 합성곱 신경망 아키텍처 5 - Others

 

 

 

Lec8_Convolution_Networks_Arcitecture5_Others.pdf
1.79MB

 

 

 

 

 

이번 자료에서 핵심 주제로 아래의 5가지를 꼽았다.

- 신경망 아키텍처의 복잡도 비교

- ResNext

- 모바일 신경망

- 신경망 아키텍처 탐색법

- 신경망 아키텍처 정리

 

 

 

 

1. 다양한 신경망 아키텍처들의 복잡도 비교

- 이번에는 그 동안 배웠던 다양한 신경망 아키텍처들의 복잡도를 그래프를 통해서 살펴볼 수 있었습니다. 각 모델들의 학습 파라미터의 수가 모델의 크기, x축을 모델의 연상량, y축을 모델의 에러율로 하는 그래프로 가장 먼저 보았던 AlexNet 부터 VGG, GoogLeNet, ResNet 등과 추가로 인셉션 모듈과 ResNet을 결합한 Inception-v4 모델 까지 보면서 더 가벼우면서도 더 좋은 성능을 보이는 흐름을 전체적으로 살펴볼수 있습니다.

 

 

 

2. ResNeXt

- 이전 시간에 봤던 ResNet을 계층 순서를 바꾸면서 성능을 약간 더 개선 시킬수 있었지만, 기존의 병목 블록을 병렬화 시켜 개선시킨 모델인 ResNeXt에 대해서 살펴봤습니다. ResNet에서 병목 블록은 기본 블록의 앞 뒤에 커널의 크기가 작은 합성곱 계층을 추가 시킴으로서 연산량을 줄이고 더 깊게 만든 블록이었습니다.

 

 하지만 ResNeXt에서는 이 병목 블록을 병목 블록과 동일한 연산량을 가지는 병렬 병목 블록들을 만들어 성능 개선을 할 수 있었습니다. 기존의 병목 블록을 병렬화 시키는 만큼 병목 통로 당 계산량은 줄었지만 전체적인 병렬 병목 블록의 계산은 동일하도록 채널 수를 조절한 덕분에 계산량이 늘어나지 않으면서 병렬 그룹을 많이 만들어 성능 향상에 기여시켰습니다.

 

 

3. MobileNet

- 지금까지 본 신경망들은 효율성을 고려해서 더 좋은 성능을 낼수 있도록 만든 아키텍쳐들이지만 저성능 디바이스나 모바일 환경에서 사용하기는 어려웠습니다. 그래서 정확도는 떨어지더라도 이런 한정된 자원의 임베디드 시스템에서도 가볍게 사용가능한 MobileNet과 ShuffleNet 같은 모델들이 나오게 되었습니다.

 

 MobileNet은 기존 합성곱 블록을 깊이단위 분리 합성곱으로 바꾸어 쌓은 모델로 깊이단위 합성곱층과 점단위 합성곱층을 분리하여 연산량을 크게 줄일수있었습니다. 점단위 합성곱 계층의 경우 커널 크기가 1 x 1로 하여 소수 연산을 줄일수 있었고, 깊이 단위 합성곱층에서는 그룹합성곱으로 나누어 기존 합성곱층보다 연산량 1/C배 만큼 줄일 수 있었습니다. 이런 덕분에 기존의 합성곱 블록보다 가장 작은 경우 1/9가 될만큼 가볍게 만들 수가 있었어요. 

 

 

 

4. 신경망 아키텍처 탐색

- 다음에 본 신경망 아키텍처는 신경망 아키텍처 탐색 모델로 신경망을 만드는 신경망 모델이라고 할수 있습니다. 이 모델은 컨트롤러라고 부르는 부모 신경망으로 자신 신경망을 생성하고 이 자식 신경망의 정확도를 비용으로 사용해 부모 신경망을 학습시키는 모델로 신경망을 만드는 신경망인 만큼 초기 모델은 한 단계 학습 시키는대만 800개의 GPU를 사용해서 28일이 걸릴 만큼 연산량이 많았으나 차후 연구를 통해 학습 속도를 빠르게 키울 수 있었습니다. 이 모델을 이용하여 자동적으로 탐색한 신경망 모델들은 기존의 방식으로 만든 신경망들보다 가볍고 뛰어난 성능을 보였습니다.

 

 

5. 신경망 아키텍처 정리

- 그 동안 배운 신경망 아키텍처에 대해서 정리를 하면 맨 초기 2012년 시행 착오를 통해 하이퍼 파라미터를 탐색하여 만든 AlexNet이 기존의 혼합 특징 기반 방법보다 우수한 성능을 보이면서 딥러닝이 크게 활성화 되기 시작하였습니다. 이후 더 시행착오를 거쳐 더 큰 모델, 더 좋은 성능을 보이는 ZFNet이 2013년도에 나왔습니다.

  2014년도에는 시행 착오를 통해 하이퍼파라미터를 찾던것과 달리 설계 규칙을 통해 신경망 모델을 만드는 VGG모델과 효율성과 성능 두가지 목표를 잡기 위해 집중적 다운샘플링, 인셉션 모듈, 전역적 풀링 등의 기법을 활용한 GoogLeNet이 나왔으며,

 배치 정규화가 나와 더 깊은 신경망을 만들 수 있었으나 제대로 학습이 되지 않는 문제를 개선하기 위해 스킵 커낵션을 활용한 ResNet이 나오면서 100층 넘어가는 신경망 모델이 나오기도 하였습니다. 이 외에 가벼운 환경에서 사용할수 있는 MobileNet과 ShuffleNet 등 많은 모델들이 나왔으며, 신경망을 만드는 신경망 아키텍처 NAS까지 기존의 사람이 만든 신경망보다 훨씬 뛰어난 성능의 모델을 찾을수가 있었습니다.

 

 

 

 

 

 

 

300x250
728x90

 

활성화 함수가 아닌것은?

  1. tan(x)
  2. max(0, x)
  3. tanh(x)
  4. max(0.1x, x)

정답 : 1번, 나머지 ReLU, tanh, Leaky ReLU는 활성화 함수비용 함수 loss function에 관해 틀린 설명은?

  1. 비용 함수는 현재 모델이 올바른지를 평가하기 위한 함수이다.
  2. 분류 문제의 비용함수로 multiclass svm loss, ross entropy loss가 있다.
  3. 회귀 문제의 비용함수로 MSE와 RMSE가 있다.
  4. 최적화 과정은 비용 함수를 최대화하기 위하여 수행한다.

정답 : 4번, 비용 함수를 최소화 시키는 방향으로 최적화를 수행한다.특징 변환 feature transform에 관한 틀린 설명은 것은?

  1. 신경 망에서는 특징 변환을 위해 활성화 함수가 사용된다.
  2. 특징 변환을 통해 기존에 선형 분리가 불가능한 데이터가 선형 분리가 가능해진다.
  3. ReLU 함수로 변환 후 선형 분리가 가능해진 데이터를 다시 역변환시켜도 선형 분리가 가능하다.
  4. 특징 변환은 기존 좌표계의 데이터를 다른 좌표계 상에서 나타내는것을 말한다.

정답 : 3번, ReLU 함수로 특징 변환 후 선형 분리가 가능해진 데이터는, 원래 공간으로 역 변환시 선형 분리가 불가능하다. 

 

 

 

 

 

 

 

 

 

Q)정규화 기법이 아닌것은?

  1. 배치 정규화 Batch Normalization
  2. 레이어 정규화 Layer Normalization
  3. 인스턴스 정규화 Group Normalization
  4. 활성 정규화 Activation Normalization

정답 : 4번, 정규화의 종류로 배치/레이어/인스턴스/그룹 정규화가 있다.Q)풀링 계층의 하이퍼 파라미터가 아닌것은?

  1. 커널 사이즈
  2. 스트라이드
  3. 패딩
  4. 풀링 함수

정답 :  3번. 풀링 계층은 패딩을 지정할 필요가 없다.Q) 역전파 과정에서 계산되는 그라디언트의 종류가 아닌것은?

  1. 다운 스트림 그라디언트
  2. 패러랠 그라디언트
  3. 로컬 그라디언트
  4. 업스트림 그라디언트

정답 : 2번. 역전파 과정에서 로컬 그라디언트와 업스트림 그라디언트를 곱해 다운스트림 그라디언트를 구한다.Q. 최적화 기법이 아닌것은?

  1. 확률적 경사 하강법
  2. Adaptive Gradient
  3. RMSProp
  4. RMSE

정답 : 4번. RMSE는 회귀 문제에서 사용되는 비용 함수, 척도이다.

 

 

 

 

 

 

 

 

 

 

 

Q ) Internal Covariate Shift에 관한 설명으로 틀린것은?

  1. 이 현상을 제거시킴으로서 그라디언트가 사라지는 문제를 개선하였고, 깊은 신경망을 만들 수 있게 되었다.
  2. 이전 파라미터의 변화로 인해 현재 입력의 분포가 바뀌는 현상을 말한다.
  3. 이 현상을 제거시키는 방법으로 드롭 아웃이 있다.
  4. 이 현상을 제거시키는 방법으로 배치 정규화와 화이트닝(백색잡음화. 평균 0, 분산 1)이 있다.

정답 : 3번, 드롭 아웃은 과적합을 제거시키기 위해 사용한다.
출처 : https://m.blog.naver.com/laonple/220808903260

 

 

 

Q ) 드롭 아웃에 관한 설명으로 틀린것은?

  1. 과적합 문제를 해결하기 위해 사용되었다.
  2. 학습 과정에 무작위로 신경망의 일부를 생략하면서 다양한 모델들을 투표한 것 같은 효과를 낸다.
  3. 각 뉴런들이 서로 동조화, 비슷해지는 현상을 막아 더 뚜렷한 특징들을 얻는다.
  4. 모든 데이터를 평균이 0, 분산이 1이 되도록 정규화 시킨다.

정답 : 4번, 화이트닝에 관한 설명이다.
출처 : https://m.blog.naver.com/laonple/220818841217

 

 

 

Q ) 활성화 함수에 관한 설명으로 틀린것은?

  1. sigmoid : 입력 값이 일정 이상 올라가면 기울기가 0에 가까워져 그라디언트 소멸 현상이 생긴다.
  2. tanh : sigmoid와는 다르게 그라디언트 소멸 현상이 생기지 않는다.
  3. ReLU : sigmoid나 tanh보다 구현이 매우 간단하고, 연산 비용도 가벼우며 학습 속도도 빠르나. 0보다 작은 경우 출력이 없어진다.
  4. Leakly ReLU : ReLU의 단점을 보완하기 위해 x < 0인 경우, 입력에 0.01를 곱하여 ReLU의 단점을 보완했다.

정답 : 2번 , tanh도 시그모이드와 마찬가지로 그라디언트 소멸 현상이 생긴다.
출처 : https://newly0513.tistory.com/20

 

 

Q) 신경망 아키텍처에 관한 설명으로 틀린것은?

  1. AlexNet과 ZFNet은 좋은 이미지 분류 성능을 내는 하이퍼 파라미터들을 시행착오를 통해 찾았다.
  2. VGG는 특정한 설계 규칙으로 만든 신경망이며 합성곱층의 커널크기를 직접 탐색하지 않고, 커널이 작은 합성곱 층을 쌓음으로서 더 좋은 성능을 내었다.
  3. GoogLeNet은 aggressive stem, inception module, average pooling으로 더 효율적인 모델을 만들었다.
  4. 신경망 아키텍처 설계에서 메모리 공간 크기, 학습 가능한 파라미터 개수, 소수점 연산횟수 FLOP은 중요한 척도가 아니다.

정답 : 4번, 신경망 아키텍처 설계에서 다음 요소들은 매우 중요한 척도이다.
출처 : 저스틴 존슨 교수님의 컴퓨터 비전 강의, 신경망 아키텍처

 

 

 

Q) 다양한 신경망 아키텍처에 관해 옳은 설명이 아닌것은?

  1. Network Architecture Search : 컨트롤러 신경망이 자식 신경망을 만들어내. 가장 좋은 성능의 자식 신경망을 찾는다.
  2. mobileNet, ShuffleNet : 저성능 환경에서도 사용가능하다.
  3. 신경망 아키텍처를 설계할 때 베이스라인 모델을 사용하지 않고, 처음부터 설계해 나가는것이 좋다.
  4. ResNeXt : Residual Block을 여러 그룹으로 병렬화를 하여 더 좋은 성능을 내었다.

정답 : 3번, 신경망 아키텍처 설계시 목적에 맞는 베이스라인 모델을 선정하여 개선해 나가는게 좋다.
출처 : 저스틴 존슨 교수님의 컴퓨터 비전 강의, 신경망 아키텍처

 

300x250
728x90

저스틴 존슨 교수님 강의 정리

8강 합성곱 신경망 아키텍처 4 - ResNet

 

 

 

 

 

 

Lec8_Convolution_Networks_Arcitecture4_ResNet.pdf
1.40MB

 

 

 

 

이번 자료에서 중요한 내용으로 아래의 다섯가지를 정리해보자

- Residual Network 배경
- Residual Block
- Residual Network
- Bottleneck Residual Block
- Residual Network 성과와 개선법

 

 

 

 

Residual Network의 배경

- Residual Network를 잔류 신경망이라고 써서 정리하겠습니다. 지금까지 신경망에 대해 학습하면서 배치 정규화 기법 덕분에 그라디언트 소멸 문제를 해결해 심층 신경망을 쌓을수 있게 된다고 했었습니다. 하지만 20층 짜리 신경망과 이를 복사해서 더 깊은 신경망을 만든 경우를 비교해보면 얕은 모델보다 깊은 모델이 테스트 에러율이 크다보니 오버피팅이 된다고 생각 할수 있지만, 훈련셋에 대한 에러율을 보면 오버피팅인 경우 깊은 모델의 에러율이 낮아져야 하지만 여전히 얕은모델보다 큰 경향이 나와 실제로는 오버피팅이 아니라 언더피팅이 발생하게 됩니다.

 

 한 모델을 복사해 깊은 모델을 만들었으면 동일한 성능이 나와야할것 같으나 그렇지 않은건 최적화의 문제입니다. 깊은 모델에서 얕은 모델의 층까지는 동일하게 학습되더라도 이후 계층들이 항등 함수라면 얕은 모델과 동일한 결과를 얻을수 있겠지만, 기존의 구조로는 깊은 신경망의 뒷편에도 얕은 신경망과 똑같은 계층들이 존재하기 때문에 항등 함수가 되도록 학습시킬수가 없습니다.

 

 

Residual Block

- 기존의 합성곱 블록이 합성곱 계층과 활성화 함수를 거쳐가는 식이었다면, 하나의 블록이 항등 함수, 항등 블록이 될수 있도록 입력을 그대로 출력으로 연결하는 지름길을 추가한 모델이 Residual Block 잔류 블록입니다. 기존 블록에다가 입력 x를 그대로 전달하는 통로 덕분에 학습 과정에서 이 잔류 블록은 합성곱 계층의 가중치들이 0이 되면, 합성곱 통로의 결과는 0이 되고 입력이 그대로 전달되는 통로만 남으므로 항등 함수가 되도록 학습이 가능해 졌습니다.

 

- 잔류 블록이 항등 함수로 학습이 가능해졌으며, 잔류 블록이 가진 추가적인 통로 덕분에 기존의 역전파 과정에서 relu를 지나 사라지는 경우가 생기더라도 이 통로를 통해서 그라디언트가 더 잘 전파되어 훨씬 심층적인 신경망을 구현하는게 가능해졌습니다.

 

 

 

Residual Network

- 잔류 신경망은 이전에 본 신경망 아키텍처인 VGG와 GoogleNet의 기법들을 활용하고 있습니다. VGG에서 설계 원칙을 가지고 신경망을 디자인한것 처럼 커널 크기가 작은 잔류 블록을 여러개 쌓았으며, 각 단계별 거칠때마다 채널의 크기가 두배가 되도록 하고 있으며

 

 GoogLeNet에서 사용했던 Aggressive Stem 집중적 다운샘플링이라 하겠습니다. 이 기법을 통해 초기에 처리할 공간적 차원의 크기를 크게 줄였고, 신경망 맨 끝 완전 연결 계층으로 출력을 만들기 직전 전역적 평균 풀링을 사용해 여러 완전 연결 계층을 사용할 필요없이 연상량을 늘리지 않고 빠르게 출력할수 있도록 설계 되었습니다.

 

 

 

 

 

Bottleneck Residual Block

- Bottleneck Residual Block을 병목 잔류 블록이라 부른다면, 우선 기존의 잔류 블록이 커널 크기가 3 x 3인 합성곱 계층을 두개 쌓아서 연산을 시키기고 있었습니다. 여기서 연산량을 더 줄이고 더 많은 레이어를 사용할수 있도록 커널 1 x 1 계층을 앞뒤로 두고 그 사이에 3 x 3 합성곱 계층을 두는 식으로 만든게 병목 잔류 블록입니다. 3 x 3 합성곱 계층 앞 뒤로 1 x 1 계층을 둔 덕분에 채널 수도 조정할수 있으며 더 깊고 가볍게 합성곱 연산이 가능해지게 되었습니다.

 

 ResNet-34는 기본 잔류 블록을 사용하여 ImageNet Top-5 Error가 8.58로 나왔으나, 이 모델을 병목 잔류 블록으로 변경하여 ResNet-50을 만들었으며 7.13으로 에러가 줄어들게 되었습니다. 이후에도 병목 잔류 블록을 추가한 방식으로 100층 이상의 신경망 아키텍처 ResNet-152 등이 나올 수 있었습니다.

 

 

 

 

Residual Network 성과와 개선법

- 잔류 신경망 모델이 나오기 전에 수 많은 이미지 관련 대회들이 있었고, 각 대회마다 서로 다른 팀들이 우승하고 있었습니다. 하지만 2015년 잔류 신경망 모델이 나오면서 이미지넷의 분류 대회 뿐만이 아니라 검출, 위치 추정 대회에서 우승했으며 이외에도 마이크로소프트의 COCO  데이터셋을 활용한 각종 대회들에서 우승하며 타 모델들 보다 훨씬 뛰어난 성능을 보였습니다.

 

- 이 잔류 신경망 모델을 개선하기 위한 방법으로 블록을 구성하는 계층들의 순서를 바꾸는 연구도 있었는데, 배치 정규화가 맨 앞, ReLU가 그다음, 그리고 Conv가 올때 약간의 성능 개선이 있엇습니다. 기존의 모델의 경우 마지막에 ReLU를 거치다보니 출력이 항상 양수가 되어 항등 함수 역활을 완전히 하기는 어려웠으나, 배치 정규화와 ReLU가 앞으로 간 덕분에 이 블록이 활성 함수의 역활를 할수 있도록 더 잘 학습된것 것 같습니다.

 

 

300x250

+ Recent posts