ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [cs231n] 6강 신경망 훈련하기 (1/4, 활성함수 (activation function))
    AI 2021. 3. 10. 17:48

    오늘 우리는 어떻게 신경망을 훈련시키는지에 대해 자세히 알아보겠습니다.

    우리가 어디에 와있죠? 우리는 함수를 계산 그래프로 어떻게 표현하는지 얘기했고, 그래서 어떤 함수든 계산 그래프로 표현할 수 있죠.

    그리고 신경망에 대해 더 명시적으로 얘기했습니다. 그건 일종의 그래프인데, 여기엔 선형 계층들이 있어서 그걸 쌓고, 중간에 비선형성을 집어넣죠.

    지난 강의에서는 합성곱 신경망에 대해 얘기했는데, 그건 특별한 타입의 망으로 합성곱 계층을 사용해서 계층구조(hierarchy)의 망 전체를 통과하면서 공간 구조를 유지합니다.

    그래서 우리는 정확히 합성곱 계층이 어떻게 생겼는지 봤고, 합성곱 계층 출력의 각각의 활성 지도는 가중치 필터를 입력의 모든 공간위치에 대해서 슬라이딩하면서 생성됩니다.

    우리는 또한 각 계층에는 여러 필터를 사용할 수 있다는 것을 봤고, 각각은 별도의 활성 지도를 생성해 냅니다. 그래서 우리가 어떤 깊이의 입력으로부터 얻을 수 있는 것은, 활성 지도 출력을 얻을 수 있고, 그건 약간 공간 차원이 유지가 됩니다. 뿐만 아니라, 깊이는 그 계층에서 우리가 사용한 필터의 숫자입니다. 우리는 이 모든 가중치와 파라미터를 학습하고 싶은 거죠.

    우리는 최적화를 통해서 망 파라미터를 학습할 수 있다는 것을 보았는데, 강좌 앞부분에서 약간 얘기했죠. 우리는 손실 지형에서 어떤 점에 도달해서 적은 손실을 얻고 싶은거죠. 우리는 이걸 음의 경사 방향으로 움직여서 그렇게 할 수 있습니다.

    그래서 우리가 미니배치 확률적 경사 하강이라고 부르는 전체 과정에서 단계는 이렇습니다. 우리는 계속해서 데이타 배치 (batch)를 샘플링합니다. 그걸 우리의 계산 그래프 혹은 신경망으로 통과시키면서 순전파합니다. 끝에서 손실을 얻죠. 우리의 망을 통해서 역전파하며, 경사를 계산합니다. 그다음 우리는 이 경사를 사용해서 망의 파라미터 혹은 가중치를 업데이트합니다.

    다음 2개의 강의를 통해서 우리는 신경망 학습에 관련된 몇 가지 세부사항에 대해 얘기할 겁니다.

    다음과 같은 것들이 포함됩니다. 초기에 우리의 신경망을 어떻게 셋업하는지, 어떤 활성 함수를 골라야 하는지, 어떻게 데이타를 전처리하는지, 가중치 초기화, 정규화, 경사 체킹 등이요. 우리는 또한 학습 다이내믹스 (dyanamics)에 대해서도 얘기할 겁니다. 우리는 어떻게 학습 과정을 베이비시팅 (babysitting)할 건지, 어떻게 파라미터를 업데트할지를 선택하는 것, 특정 업데이트 규칙, 그리고 어떻게 하이퍼파라미터 최적화를 해서 최선의 하이퍼파라미터를 고르는지 등에 대해서요. 그다음 우리는 또한 평가와 모델 앙상블에 대해서도 대해서도 얘기할 겁니다.

    그래서 오늘은 첫번째 파트로, 활성 함수, 데이타 전처리, 가중치 초기화, 배치 정규화, 학습 프로세스 베이비시팅, 하이퍼파라미터 최적화에 대해서 얘기할 겁니다.

    먼저 활성함수입니다.

    앞서서 우리는 어떤 특정 계층에서, 들어오는 데이타가 있다는 것을 봤죠. 우리는 완전 연결 (fully connected) 계층이나 합성곱 계층에서 우리의 가중치를 곱합니다. 그 다음 우리는 이것을 활성함수 즉, 비선형성에 전달합니다.

    우리는 이에 대한 몇 가지 예를 봤는데요. 우리는 앞서 몇가지 예에서 시그모이드를 사용했죠. 우리는 또한 렐루 비선형성도 봤습니다. 오늘은 이 여러 비선형성에 대한 다른 선택지와 그들 사이의 트레이드 오프 (trade-off)에 대해서도 얘기해 보죠.

    먼저 시그모이드입니다. 앞서서 봤는데, 아마도 가장 편안한 것이죠. 시그모이드 함수는 위에 적혀 있듯이, 1 나누기 1 더하기 e의 음의 x제곱이죠. 이게 하는 건 각 숫자를 취해서 시그모이드 비선형의 입력으로 넣는거죠. 각 원소를요. 이 함수를 사용하면 각 원소는 이 [0,1] 범위로 좁혀지게 됩니다. 만약 매우 큰 숫자를 입력으로 얻는다면, 출력은 1에 가까운 숫자가 되겠죠. 만약 큰 음수가 있다면, 0에 가깝게 되겠죠. 그리고 0근처의 영역에서는 선형 영역이죠. 선형함수처럼 보이네요. 이건 역사적으로 많이 쓰였는데, 시그모이드는 어떤 점에서는, 그걸 일종의 뉴런의 포화된 발사율 (saturating firing rate)로 해석할 수 있기 때문입니다. 0과 1사이의 어떤 것이라면, 여러분은 그걸 발사율이라고 생각할 수 있습니다. 우리는 다른 비선형성에 대해서도 얘기할 텐데, 렐루 같은 경우, 실제로 생물학적으로 더 그럴듯하다고 알려졌습니다. 하지만, 이것도 일종의 가능한 해석을 가집니다.

    이 비선형성을 더 자세히 보면, 몇 가지 문제점이 있습니다. 첫번째로는 포화된 뉴런이 경사를 죽일 수 있다는 겁니다. 이게 정확히 의미하는 바가 뭔가요?

    우리가 시그모이드 게이트 (gate)를 보면, 우리의 계산 그래프의 노드이죠. 우리는 그것에 대한 입력으로 데이타 x를 가지고, 그 다음 그로부터 나오는 시그모이드 게이트의 출력이 잇죠. 우리가 다시 돌아왔을 때, 경사 흐름은 어떻게 생겼을까요? 우린 dσ분의 dL이 있죠? 업스트림 (upstream) 경사는 아래쪽으로 가고, 우리는 여기에 dx분의 dσ를 곱할 겁니다. 이것이 지역 시그모이드 함수의 경사가 될 겁니다. 그리고 우리는 이것들을 다운스트림 경사를 위해 연결하고 뒤로 넘깁니다. x가 -10이면 어떻게 될까요? 경사가 어떻게 되죠? 0이죠. 맞습니다. 경사가 0이 되는데 그건 시그모이드의 매우 음인 영역에서는 그건 사실상 평평하니까, 경사는 0이죠. 그리고 우리는 내려오는 업스트림 경사를 체인 (chain)합니다. 사실 0에 가까운 뭔가를 곱하니까, 매우 작은 경사를 얻게 되고 아래쪽으로 거꾸로 흐르게 됩니다. 어떤 의미에선, 체인 룰 (chain rule)을 거치면 흐름이 죽고, 다운스트림 노드로 전달되는 0 경사를 얻게 될 겁니다. x가 0일때는 어떻게 되나요? 이 영역에서는 괜찮죠. 0에 가까운 영역에서는, 적절한 경사가 있고, 역전파를 해도 괜찮습니다. 만약 x가 10이면요? 0이죠. 다시 말하면, x가 양의 큰 수거나 음의 큰 수면, 시그모이드 함수가 평평한 영역이라 경사를 죽일거고, 여러분은 되돌아오는 경사 흐름을 얻지 못할 겁니다.

    두번째 문제는 시그모이드 출력은 0이 중심이 아닙니다. 이게 왜 문제가 되는지 보죠.

    뉴런에 대한 입력이 항상 양이라면 어떻게 되는지 생각해 보죠. 이 경우, 우리의 모든 x가 양수면, 그건 어떤 가중치 w로 곱해질 거고, 그다음 우리의 활성 함수로 통과시킬 겁니다. w에 대한 경사에 대해서 뭘 얘기할 수 있죠? 이 선형 계층에 대해서 지역 경사가 뭐가 될지 생각해 보죠. 우리는 어떤 활성 함수 분의 dL이 있죠. 그리고 내려오는 손실이 있습니다. 그리고 우리는 지역 경사가 있습니다. x는 뭐가 될까요? 만약 모든 x가 양수라면 그건 뭘 의미하죠? 항상 양수라고 누가 얘기하는 것을 들었는데, 거의 맞습니다.

    그건 항상 모두 양수거나 모두 음수가 됩니다. 내려오는 업스트림 경사는 우리의 손실 분의 dL이죠. L은 dL/df이구요. 이건 양수거나 음수가 됩니다. 그건 어떤 내려오는 임의의 경사죠. 그리고 이것에 곱하는 지역 경사는, w에 대한 경사를 찾는다면, df/dw가 될 겁니다. 그건 x가 될거구요. 그리고 만약 x가 항상 양이라면, w에 대한 경사는 이 둘을 곱하는 건데, 그건 항상 내려오는 업스트림 경사의 부호가 될 겁니다. 이게 의미하는 것은 w의 모든 경사는, 그것들이 항상 양수거나 음수이기 때문에, 그것들은 항상 같은 방향으로 움직일 거라는 겁니다. 여러분은 파라미터 업데이트할때, w의 모든 값을 차이나는 양의 숫자만큼 증가시키거나 그것들 모두를 줄일 겁니다. 이것에 대한 문제는, 이것이 매우 비효율적인 경사 업데이트를 한다는 겁니다. 오른쪽에 보면, w가 2차원인 예가 있는데요. w에 대한 2개의 축이 있죠. 우리가 모두 양이거나 모두 음인 업데이트만 가질 수 있다면, 그럼 우리는 이 2개의 사분면만 가지게 됩니다. 이것들은 축이 모두 양이거나 모두 음인 곳이죠. 그리고 이것들만이 우리가 경사 업데이트를 할 수 있는 방향입니다. 그래서 이 경우에 우리의 가정적으로 최적인 w가 사실 이 파란 벡터라면, 우리는 어떤 지점에서 시작을 하겠죠. 혹은 빨간 화살표가 시작하는 위에서요. 우리는 단지 바로 이 방향으로 경사 업데이트를 할 수 없습니다. 왜냐면, 이건 허락된 2가지 경사 방향 중의 하나가 아니기 때문이죠. 그래서 예를 들어, 허락된 방향으로, 각각인 이 빨간 화살표 방향으로 일련의 경사 업데이트를 가져야 한다는 것입니다. 결국 이 최적의 w를 얻기 위해서요. 그래서 이것이 일반적으로 우리가 0이 평균인 데이타를 원하는 이유입니다. 그래서 입력 엑스가 0으로 평균되길 원하는 거죠. 양의 값과 음의 값을 가질 수 있도록요. 그래서 우리가 이 w 경사 업데이트가 모두 같은 방향으로 움직이는 문제에 빠지지 않도록요.

    우리는 이 시그모이드에 대한 2가지 주요 문제에 대해 얘기했습니다. 포화된 뉴런은 경사를 죽일 수 있고, 만약 우리가 너무 양이거나 너무 음인 입력이 있으면, 그들은 0이 중심이 아니며, 우리는 비효율적인 경사 업데이트를 얻을 것입니다. 그다음 세번째 문제는, 여기 지수함수가 있어서 계산이 비쌉니다. 커다란 스키마 (schema)의 망에서는 이건 주요한 문제가 아니죠. 왜냐면 합성곱과 내적이 훨씬 더 비싸니까요. 하지만 이건 작지만 지켜봐야 할 점이죠.

    이제 두번째 활성 함수를 보죠. 여기 탠에이치가 있는데요. 이건 시그모이드와 매우 비슷하게 생겼는데, 하지만 다른점은 이것은 [-1, 1] 범위로 몰아넣는 다는 것입니다. 그래서 주요한 차이점은 그건 이제 0이 중심이라는 것입니다. 그래서 우리는 2번째 문제를 없애 버렸죠. 그러나 포화되면 여전히 경사를 죽이고 있습니다. 그래서 여전히 우리는 경사가 사실상 평평한 영역이 있고, 경사가 흐름을 죽이는 거죠. 이건 시그모이드보다 약간 낫지만 여전히 문제가 있네요.

    이제 렐루 활성함수를 보죠. 우리가 지난시간에 합성곱 신경망에 대해서 이야기할 때 예제에서 봤던 건데요. 우리는 렐루 비선형성이 많은 합성곱 계층 사이에 끼어져 있는 것을 보았습니다.이 함수, x에 대한 f는 0과 x의 최대값이죠. 그건 입력에 대해서 원소마다 연산을 하고 입력이 음수면 0에 놓는 것죠. 그리고 만약 양수면, 그냥 통과하는 것입니다. 그게 정체죠. 이건 꽤 흔히 사용되는 것인데, 이걸 보고 시그모이드와 탠에이치에서 봤던 문제들에 대해 생각해 보면, 양의 영역에서는 포화되지 않는 다는 것을 알 수 있죠. 입력 영역 전체의 절반은 포화되지 않을 거고 이건 큰 장점이죠. 이건 또한 계산적으로 매우 효율적입니다.우리는 앞서 시그모이드가 지수를 가지고 있는 것을 봤죠. 렐루는 그냥 단순한 최대값이죠. 그래서 매우 빠릅니다. 실제로 렐루를 사용하면, 시그모이드나 탠에이치보다 훨씬 빠르게 수렴합니다. 약 6배 빨리요. 또한 시그모이드보다 생물학적으로 더 그럴 듯하다고 판명되었습니다. 뉴런을 보고, 입력이 어떻게 생겼나 보고, 출력이 어떻게 생겼나 보면, 신경과학 실험에서 이것을 측정하려고 하면, 이것이 시그모이드보다 실제로 벌어지는 것에 더 가깝게 추정한 것이죠. 렐루는 알렉스넷 (AlexNet)이 나온 2012년 경에 많이 사용되기 시작했죠. 알렉스넷은 최초의 주요 합성곱 신경망이었고, 이미지넷 (ImageNet)과 대량 데이타에 대해서 잘 할 수 있었습니다. 그들은 렐루를 실험에서 사용했습니다.

    그런데 렐루의 문제점은 그게 더 이상 0중심이 아니라는 겁니다. 우리는 시그모이드가 0 중심이 아니라는 것을 봤죠. 탠에이치가 이걸 해결했는데 렐루는 다시 이 문제를 가지고 있습니다. 이게 렐루가 가진 하나의 이슈죠. 그다음 우리는 또한 더 짜증나는 것이 있는데, 우리는 입력의 양의 절반에 대해서는 포화가 없습니다. 그러나 음의 절반은 그렇지 않죠.

    이것에 대해서 좀 더 자세히 생각해 보면, x가 -10이면 어떻게 되나요? 0의 경사죠. x가 10이면 어떻게 되죠? 맞죠. 우리는 선형 영역에 있습니다. x가 0이면 어떻게 되나요? 네, 여기선 정의되어 있지 않죠. 그러나 실제에선 우리는 0이라고 할 겁니다. 기본적으로 그건 영역의 반에서 경사를 죽이고 있습니다.

    이 나쁜 부분에 있을 때 우리는 이런 죽은 렐루 현상을 얻을 수 있습니다. 여러분은 여러 잠재적인 이유로부터 이것을 볼 수 있는데요. 우리의 데이타 클라우드 (data cloud)를 보면, 이건 우리의 모든 학습 데이타 인데요. 우리가 어디서 렐루가 작동하지 않는지 보면, 렐루는, 이것들의 각각은 사실 그것이 활성화시키는 평면의 절반입니다. 이것들의 각각은 이 렐루 각각을 정의하는 평면이고, 여러분은 데이타 클라우드로부터 떨어진 이 죽은 렐루를 가질 수 있다는 것을 볼 수 있습니다. 이 경우에는 그건 절대 활성화하거나 업데이트하지 않을 것입니다. 액티브 렐루와 비교해 보면, 데이타의 일부가 양수여서 통과될거고 몇몇은 안 그렇겠죠. 이렇게 되는 여러 이유가 있는데요. 첫번째는 나쁜 초기화가 있을 때 발생할 수 있습니다. 만약 여러분이 운이 안좋은 가중치를 가지고 있어서 데이타 클라우드로부터 떨어져 있으면, 그것들은 여기 이 나쁜 렐루를 지정하게 됩니다. 그럼 그들은 절대 활성화시키는 데이타 입력을 가지지 않을 거고, 거꾸로 오는 좋은 경사 흐름을 얻지 못할 겁니다. 그럼 그건 절대 업데이트하지 않을거고 절대 활성화하지 않을 겁니다. 더 흔한 경우는 여러분의 학습율이 너무 높을 때입니다. 이 경우 여러분은 괜찮은 렐루로 시작하지만, 이 거대한 업데이트를 하기때문에, 가중치가 이리저리 뛸 거고, 여러분의 렐루 유닛 (unit)은 어떤 의미에선, 데이타 매니폴드 (manifold)로 인해 뻗을 겁니다. 이것은 훈련 중에 벌어집니다. 처음에는 좋았지만, 어떤 지점에서 나빠지고, 죽는거죠. 실제에선, 여러분이 훈련시킨 망을 그대로 멈추게 하고 데이타를 통과시키면, 망의 10 ~ 20%가 이런 죽은 렐루라는 것을 알 수 있습니다. 이게 문제이지만, 대부분의 망은 렐루를 사용하면 이런 타입의 문제를 가지고 있죠. 그들 중 몇몇은 죽을 거고, 실제로 사람들은 이걸 들여다 보고 있죠. 연구할 문제입니다. 그러나 망을 학습시키는 데는 아직은 괜찮습니다.

    실제로 사람들은 렐루를 약간의 양의 바이어스 (bias)로 초기화하길 좋아합니다. 초기화시에 활성될 (active) 가능성을 높이기 위해서 그리고 약간의 업데이트를 얻기 위해서죠. 그래서 이건 사실 초기에 발사하는 더 많은 렐루를 얻기 위한 바이어스죠. 실제로 어떤 사람들은 그게 도움이 된다고 합니다. 어떤 사람은 아니라고 하지만요. 일반적으로 사람들이 이걸 항상 사용하지는 않습니다. 많은 경우 사람들은 여전히 그냥 0 바이어스로 초기화합니다.

    이제 우리는 그 이후에 나온 렐루에 대한 약간의 변경을 볼 수 있는데, 하나의 예가 리키 렐루입니다. 이건 원래 렐루와 매우 비슷한데, 유일한 차이점은 음의 영역에서 평평하지 않고 약간의 음의 경사를 주는 것입니다. 이것이 앞에서 얘기한 많은 문제들을 해결합니다. 여기서는 음의 공간에서도 포화되는 영역이 없죠. 또한 계산적으로도 효과적입니다. 시그모이드와 탠에이치보다 더 빨리 수렴하고 렐루와 유사하죠. 그리고 이 죽는 문제가 없습니다.

    또 다른 예는 파라미터 렉터파이어 (Parametric Rectifier)인 피렐루인데요. 이 경우엔 리키 렐루처럼 음의 공간에서 이런 경사진 영역이 있는데, 음의 영역에서 이 경사는 이 알파 (alpha) 파라미터로 결정됩니다. 우리가 지정하지 않고 하드코딩 (hard-coding)하는 것도 아닙니다. 그대신 우리는 그것을 파라미터로 취급해서 역전파하고 학습합니다. 그래서 이건 더 유연하죠.

    우리는 또한 지수 선형 유닛 (Exponential Linear Unit)인, 엘루가 있습니다. 이런 여러 루 (LU)들이 있는데요. 이건 렐루의 모든 장점을 다 가지고 있고, 0 평균 출력에 더 가깝죠. 그건 장점이라서, 리키 렐루, 파라미터 렐루는 0에 더 가까운 평균을 갖도록 하죠. 그러나 리키 렐루와 비교하면 음의 영역에서 경사가 있는게 아니라 음의 포화된 영역으로 돌아가고 있죠. 이게 노이즈에 더 견고하도록 한다는 주장이 있고, 사실 이런 비활성 상태를 가짐으로 더 견고해지기도 합니다. 이 논문을 보면 이게 왜 그런지에 대한 여러 종류의 정당화가 있습니다. 어떤 점에서는 이건 일종의 렐루와 리키 렐루의 사이에 있는 것입니다. 리키 렐루가 가지는 모양을 갖고 있고, 0에 더 가까운 평균 출력을 가지고 있지만, 그건 또한 렐루가 가지는 더 포화되는 동작도 가지고 있죠.

    그래서 렐루에 대한 다양한 변형들이 있죠. 이 모든 것들에 대해서 여러분은 각각이 어떤 장점이 있고 어떤 단점이 있는지 실제에선 논쟁할 수 있을 겁니다. 사람들은 이 모두에 대해서 실험해 보고 경험적으로 뭐가 더 좋은지 알고 싶을 겁니다. 시도해 보고 정당화하고 새로운 것을 해보고 싶겠죠. 그러나 그것들은 모두 실험되는 다른 것들입니다.

    하나 더 얘기해 보죠. 이건 맥스아웃 (Maxout) 뉴런인데요. 이건 좀 달라보이네요. 앞선 것들과 다른 형태라는 점에서요. 그것들은 기본적으로 내적을 하고 그 앞에 이 원소마다의 비선형성을 놓았죠. 그렇게 하는 대신, 이건 이런 모양인데, x와 w의 내적에 b를 더한 것과 두번째 가중치 셋, 즉, w2와 x의 내적 더하기 b2의 최대값을 취하는 거죠. 이건 이 두 함수의 최대값을 취하는 거죠. 이건 렐루와 리키 렐루를 일반화하는 거죠. 왜냐면, 이 둘, 즉 두 선형 함수 중에서 큰 것을 취하는 것이니까요. 이것이 주는 혜택은, 다시 여러분은 선형 영역에서 연산을 하는 거고, 포화되거나 죽거나 하는 것이 없는거죠. 여기서 문제점은 뉴런마다 파라미터 숫자를 2배로 한다는 겁니다. 각각의 뉴런은 원래 가중치 w 집합이 있는데 반해, 그건 w1과 w2를 가지는 거라서 2배를 가지는 거죠.

    실제에선, 이 모든 활성 함수를 볼 때, 일반적으로 가장 좋은 방법은 렐루를 쓰는 겁니다. 이게 가장 표준적인 것이고 일반적으로 잘 동작합니다. 일반적으로 여러분은 학습률 (learning rate)에 대해 조심스럽게 정하며 조정하길 원할 거고 어떻게 돌아가는지 보고 싶을 겁니다. 학습률을 조정하는 것에 대해서는 뒤에서 더 얘기할 겁니다. 그러나 여러분은 또한 리키렐루, 맥스아웃, 엘루같은 이런 더 멋진 활성 함수들을 시도해 볼 수 있죠. 그러나 이런 것들은 일반적으로 더 실험적인 것들이죠. 여러분의 문제에 대해서 어떻게 동작하는지 해 볼 수 있습니다. 탠에이치도 시도해 볼 수 있죠. 그러나 아마도 렐루나 렐루 변형이 더 나을 겁니다. 그리고 일반적인 경우 시그모이드는 쓰지 마세요. 이건 가장 초기의 활성함수 중 하나이고, 그이후 나온 렐루나 이런 다른 변형들이 일반적으로 더 잘 동작합니다.

    댓글

Designed by Tistory.