ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [cs231n] 4강 역전파와 신경망 (4/4, 신경망, neural network)
    AI 2021. 2. 5. 19:46

    마침내 신경망에 대해 얘기할겁니다. 사람들은 신경망과 뇌 사이의 비유나 그리고 여러 종류의 생물학적 영감을 이끌어 냈습니다. 그걸 잠깐 보겠지만, 그러나 먼저 그걸 그냥 함수로 보죠. 뇌와 관련된 것은 빼구요.

    지금까지 우리는 이런 선형 함수로 많이 작업 했습니다. f는 W 곱하기 x죠. 우리는 이것을 우리가 최적화하고자 하는 함수의 예로 사용했구요.

    여러분의 변형 (transformation)에서 이 하나를 사용하는 대신, 신경망을 사용하고 싶다면, 간단한 형태로, 우린 이 두 개를 쌓을 수 있죠. 다른 하나 위에 선형 변형을 얹어서 2개의 계층 (layer)으로 된 신경망을 얻는 거죠.

    그래서 이건 우선 W1과 x를 행렬 곱셈하는 거고, 그럼 우리는 중간값을 얻고 0과 W의 최대값 (max of 0 and W)을 취하는 비선형 함수를 가집니다. 이 선형 계층과 출력과의 최대값이죠. 이런 비선형성을 갖는 것이 중요한데, 나중에 다시 얘기할 겁니다. 왜냐면, 비선형성이 없으면 선형 레이어를 다른 레이어 위에 쌓으면, 하나의 선형 함수가 될 뿐이거든요. 그래서 우리는 첫번째 선형 레이어가 있고, 그 다음 비선형성이 있고, 그 위에 다른 선형 레이어를 얹는 거죠. 그 다음 여기로부터 마침내 우리의 점수 함수를 얻을 수 있습니다. 점수의 출력 벡터를 얻는거죠. 그래서 사실, 더 넓게 얘기하면, 신경망은 일종의 함수이고, 거기엔 더 단순한 함수가 서로 서로 쌓여지는데, 계층적인 방식으로 쌓습니다. 더 복잡한 비선형 함수를 만들기 위해서 그런거죠. 그래서 이건 사실 여러 단계의 계층적 계산이죠. 이걸 하는 주요 방식은 이 행렬 곱하기와 선형 레이어를 취해서, 여러 개를 쌓는데, 그 사이에 비선형 함수를 넣는거죠.

    이게 어떤 걸 푸는 걸 도와주냐면, 이 선형 점수 함수를 기억해 보면, 우리가 우리의 가중치 행렬 W의 각 행이 템플릿 같은 것이라고 얘기했었죠. 그건 어떤 특정 클래스를 대한 입력에서 우리가 찾는 것을 표현한 템플릿이었죠. 차 템플릿은 일종의 흐릿한 빨간 차였고, 차 클래스에 대한 점수를 계산하기 위해 우리는 이걸 입력에서 찾고 있는 중이었죠. 우리는 이것에 대한 문제를 얘기했었는데, 하나의 템플릿만 있냐는 거였죠. 빨간 차가 있지만, 실제에선, 우리는 여러 스타일이 있죠. 여러분은 아마 빨간차, 노란차, 다양한 종류의 모든 차를 찾을 겁니다. 여러 레이어 망을 가지면 W1은 여전히 이런 종류의 템플릿이 될 수 있지만, h에서 이 템플릿들에 대한 이 점수를 가지고, 그 위에 이 두 개를 합치는 다른 레이어를 가질 수 있게 되는 겁니다. 그래서 우리는 내 차 클래스가 연결이 되어서, 우리는 빨간 차 뿐만 아니라 노란 차도 찾게 되는거죠. 우리는 h 속에 우리의 벡터의 가중치인 행렬 W2를 가지게 됩니다.

    우리는 이것에 대해 2개 레이어의 신경망을 예로 얘기했습니다. 그리고 우리는 더 많은 이런 계층을 쌓아서 임의의 깊이의 더 깊은 망을 만들 수 있습니다. 그래서 우리는 또다른 비선형으로 이걸 한번 더 하고 W3와 행렬 곱셈을 해서 3개 레이어의 신경망을 얻습니다. 이것이 딥 신경망 (deep neural network)이라는 용어가 나오기 시작하는 곳입니다. 이 아이디어는 여러분이 매우 깊은 신경망을 위해 이런 여러 레이어를 쌓을 수 있다는 것이죠.

    지금까지 우리는 함수로서의 신경망이 어떤 것인지 봤습니다. 우리는 사람들이 신경망에 대해서 어떻게 생물학적 영감이 있는지 얘기하는 것을 많이 듣습니다.그렇지만, 이 비유는 매우 느슨하다는 것을 강조하는 것이 중요합니다. 그건 정말 느슨한 연결이구요. 하지만 어디서 이런 연결과 영감이 나오는지를 이해하는 것은 재미있습니다. 이제 그것에 대해 간단히 얘기하겠습니다.

    우리가 뉴런에 대해 매우 단순한 방식으로 생각해 보면, 여기 뉴런 그림이 있죠, 우리는 각 뉴런으로 전달되는 신호가 있습니다. 우리는 많은 뉴런들이 연결되어 있고, 각 뉴런은 수상돌기가 있죠. 이것들은 일종의 뉴런들로 오는 신호를 받는 것입니다. 그리고 우리는 세포체가 있죠. 들어오는 신호를 받아들여서 합칩니다. 이걸 받아들여서 신호를 합친 후에, 축색돌기를 통해서 연결된 아래쪽 뉴런으로 멀리 전달합니다.

    지금까지 계산 노드로 한 것을 돌아보면, 그게 약간 비슷한 방식이라는 것을 볼 수 있죠. 계산 그래프에서도 노드가 서로 연결되어 있고, 우리는 뉴런으로 들어오는 입력 혹은 신호 x가 있습니다. 그리고 이 모든 x, x0, x1, x2는 합쳐집니다. 예를 들면, 우리의 가중치인 W를 사용해서요. 그래서 우리는 일종의 계산을 하는데, 여태까지 했던 계산은 W 곱하기 x 더하기 b같은 거죠. 이 모든 것들을 합친 다음, 활성 함수를 적용해서, 이 출력 값을 연결된 뉴런으로 전달합니다.

    그래서 이걸 보면, 매우 비슷한 방식으로 생각할 수 있습니다. 들어오는 신호들이 있고, 연접 (synapsis)에서 연결되죠. 연접은 여러 뉴런을 연결하고 수상돌기는 이 모든 것을 합치고 이 모든 정보는 세포체에서 합쳐지는 거죠. 그리고 우리는 나중에 출력으로 출력을 전달합니다. 이것이 둘 사이에서 유도할 수 있는 비유이구요. 활성 함수를 보면, 이것이 사실 모든 입력을 받아들인 다음 나가는 하나의 숫자를 출력합니다. 우리는 시그모이드 활성 함수 예와 여러 비선형에 대해 얘기했죠.

    일종의 느슨한 비유에서 이 비선형은 일종의 발사율 (firing rate) 혹은 극파율 (rate code)을 나타낼 수 있겠죠. 여기서 우리의 뉴런들은 연결된 뉴런에 신호를 전달하는데 이런 이산 스파이크 (discrete spike)를 사용하죠. 그래서 만약 그것들이 매우 빠르게 튀어 오른다면 다음으로 전달되는 강한 신호가 있는 거죠. 그래서 이 활성 함수를 지난 값을 발사율이라고 생각하고 전달할 수 있는 겁니다. 그리고 실제로 이것을 연구하는 신경과학자들은 뉴런과 가장 비슷한 방식으로 동작하는 비선형성 중의 하나가 렐루 (ReLu) 함수, 렐루 비선형성이라고 합니다. 나중에 보겠지만, 그건 음의 입력에 대해서는 0이고 양수 영역에 대해서는 선형 함수이죠. 아마도 뉴런이 동작하는 것과 가장 비슷한 겁니다.

    그러나 이런 뇌에 대한 비유를 하는 것은 극도로 조심해야 합니다. 왜냐면 생물학적 뉴런은 이것보다 훨씬 복잡하기 때문이죠. 생물학적 뉴런은 종류도 많고, 수상돌기는 매우 복잡한 비선형성 계산을 할 수 있죠. 우리의 연접은, 이 비유를 가져왔을 때 W0에 해당하죠. 연접은 우리가 가진 것처럼 하나의 가중치가 아닙니다. 그것들은 진짜 복잡한 비선형 다이나믹 (dynamic) 시스템입니다. 또한 우리의 활성 함수를 부호율 (rate code)나 발사율로 해석하는 것도 사실 불충분합니다. 이런 발사율은 뉴런이 어떻게 다음 뉴런과 의사소통하는지를 모델링하기에는 부족하죠. 매우 단순한 방식일 지라도, 뉴런은 다양한 레이트 (rate)로 발사할 겁니다. 이런 가변성이 아마도 고려되어야 할 겁니다.그래서 이 모든 것들은 우리가 다루는 것보다 훨씬 복잡한 것이죠. 촉수 계산에 대해서는 참고자료가 있으니 이 주제에 관심이 있다면 한번 보세요. 실제로는 높은 수준 (high-level)에서는 이게 어떻게 뉴런을 닮았는지 볼 수 있지만, 하지만 뉴런은 이것보다 훨씬 복잡하죠.

    우리는 사용될 수 있는 다양한 활성 함수에 대해서 얘기했죠. 앞서 렐루를 언급했구요. 앞으로 이 다양한 활성함수에 대해서 더 자세히 얘기를 할거고 사용하고 싶은 활성 함수를 고르는 것에 대해서도 얘기를 할겁니다.

     

    또한 다양한 신경망 아키텍처에 대해서도 얘기를 할겁니다. 우리는 이 완전 연결 (fully-connected) 신경망 예를 보고 있는데요. 각 계층은 행렬 곱셉이죠. 이것을 부르고 싶은 방법은 2계층 (layer) 신경망이라고 앞에서 얘기했고, 이건 우리가 두개의 계층을 갖고 있다는 것을 의미하죠. 우리는 또한 이것을 1히든 (hidden) 계층 신경망이라고 도 부릅니다. 행렬 곱셈을 하는 숫자를 세는 대신에 숨겨진 레이어를 세는 거죠. 둘 다 사용할 수 있지만, 2계층 신경망이 좀 더 흔히 사용되는 것 같네요. 그리고 여기 3계층 신경망이 있는데, 2히든 (hidden) 계층 신경망이라고도 부를 수 있습니다.

    우리가 신경망을 순방향으로 지나갈 때는, 이 망의 각 노드가 사실 앞에서 보여준 뉴런이 하는 연산을 하는거죠. 사실 벌어지는 일은 각 숨겨진 층을 전체 벡터라고 생각할 수 있고, 즉, 뉴런 집합이죠. 이런 식으로 뉴런 값을 계산하기 위한 행렬 곱셈으로 작성함으로써, 그건 우리가 효율적으로 이 전체 뉴런 계층을 평가할 수 있는 방법이 됩니다. 한번 행렬 곱셈을 한다는 것은, 예를 들면, 10개 50개 혹은 100개의 뉴런 층의 값을 얻는 겁니다.

    이걸 행렬 벡터 형태로 작성하면, 여기 비선형성이 있고, 우리가 사용하는 f는 이 경우 시그모이드죠. 우리는 데이타 x 즉, 입력 벡터를 받아 들여서 첫번째 행렬 곱셈을 하고 이것 위에 W1을 하는 거죠. 그다음 우리의 비선형성을 하고, 그다음 두번째 행렬 곱셈을 해서 두번째 히든 계층, h2를 얻고 그다음 우리의 최종 출력을 얻죠. 신경망을 작성하기 위해 필요한 것들은 바로 이것들입니다. 앞서 봤듯이 backward 패스는 역전파를 사용해서 이것들을 계산하는 것이죠. 바로 이것이 신경망이 무엇인지에 대한 주요 아이디어입니다.

    요약하면, 우리가 어떻게 뉴런을 이 완전 연결 혹은 선형 층의 계산으로 배열할 수 있는지 봤구요. 계층의 추상화는 매우 좋은 특성을 갖고 있어서 우리는 매우 효율적인 벡터화된 코드를 사용해서 모든 것을 계산할 수 있습니다. 또한 우리는 신경망이 생물학으로부터의 비유와 느슨한 영감을 가진다는 것을 알고 있는 게 얼마나 중요한지에 대해서도 얘기했습니다. 우리가 만든 비유는 매우 느슨한거죠. 

    댓글

Designed by Tistory.