활연개랑

[딥러닝] 딥러닝 기본 정리 해석 - 1 본문

딥러닝

[딥러닝] 딥러닝 기본 정리 해석 - 1

승해tmdhey 2022. 2. 1. 20:28
반응형

http://neuralnetworksanddeeplearning.com/index.html

 

 

Neural networks and deep learning

 

neuralnetworksanddeeplearning.com

딥러닝의 기본에 대해 자세히 설명되어있는 사이트입니다.

공부할겸 차근차근 블로그에 해석해서 올리겠습니다. 

 

 


인간의 시각 체계는 세계의 불가사의중 하나입니다. 다음 수기 숫자를 순서대로 읽어봅시다.

대부분의 사람들은 쉽게 이 숫자가 504192라는 것을 인식할 수 있습니다. 인간의 시각은 이보다도 더 복잡한 이미지 처리를 수행합니다. 우리는 시각적인 세계를 이해할 수 있도록 수억년에 걸쳐 진화했습니다. 손으로 쓴 숫자를 인식하는 것은 쉽지 않은 작업이지만 우리 인간은 시각적인 것을 잘 이해할 수 있습니다. 그러나 거의 모든 작업은 무의식적으로 수행되므로 우리는 일반적으로 시각 시스템이 해결하는 문제가 얼마나 어려운지 잘 알지 못합니다.

 

위와 같은 숫자를 인식하는 컴퓨터 프로그램을 작성하려고 하면 시각적 패턴 인식의 어려움이 분명해집니다. 우리 스스로 할 때 쉬워보이는 것이 컴퓨터 프로그램 작성을 하려고 하면 매우 어려워진다는 것입니다. 규칙을 정확하게 만들려고 하면 수많은 예외와 주의사항, 또는 특별한 경우에 빠지게 됩니다.

 

신경망은 다른 방식으로 문제에 접근합니다. 알려진 훈련 예제로는, 직접 손으로 쓴 숫자를 많이 사용하는 방법이 있습니다. 

다음과 같이 많은 수의 데이터를 가지고 컴퓨터가 배울 수 있는 시스템을 개발합니다. 즉, 신경망은 예제를 사용해 필기 숫자를 인식하는 규칙을 자동으로 추론합니다. 또한 훈련 예제 수를 늘리면 데이터에 대해 더 많이 학습할 수 있으므로 정확도가 향상됩니다. 따라서 위에서는 100개의 숫자만을 표시했지만 수천 똔느 수백만, 수십억개의 교육 예제를 사용한다면 더 나은 필기 인식기를 구축할 수 있습니다. 

 

이 장에서 우리는 손으로 쓴 숫자를 인식하는 법을 배우는 신경망을 구현하는 컴퓨터 프로그램을 작성할 것입니다. 이 프로그램은 길이가 74줄에 불과하며 특별한 신경망 라이브러리를 사용하지 않습니다. 그러나 이 짧은 프로그램은 사람의 개입 없이 96% 이상의 정확도로 숫자를 인식할 수 있습니다. 또한, 나중에 우리는 정확도를 99% 이상으로 향상시킬 수 있는 아이디어를 개발할 것입니다. 사실 최고의 상용 신경망은 은행에서 수표를 처리하는데 사용하고 우체국에서 주소를 인식하는데 사용됩니다. 

 

(손으로 쓴 숫자를 인식하는 것은 매우 복잡한 솔루션이나 엄청난 계산 능력이 필요한 만큼 그렇게 어렵지는 않습니다. 또한 딥러닝과 같은 고급 기술을 개발할 수 있는 좋은 방법입니다. 그래서 책 전반에 걸쳐 우리는 필기 인식 문제로 반복해서 돌아올 것입니다. 

 

물론 만약 장의 요점이 단지 손으로 쓴 숫자를 인식하는 컴퓨터 프로그램을 작성하는 것이라면 그 장은 훨씬 더 짧을 것입니다. 그러나 그 과정에서 인공 뉴런의 두가지 중요한 유형(퍼셉트론 및 시그모이드 뉴런)과 확률적 경사하강법으로 알려진 신경망의 표준 학습 알고리즘을 포함하여 신경망에 대한 많은 핵심 아이디어를 개발할 것입니다. 전반에 걸쳐 일이 이 수행되는 이유를 설명하고 신경망 직관을 구축하는데 중점을 둡니다. 

결국, 이 장의 끝에 가면 우리는 딥러닝이 무엇인지 이해할 수 있는 위치에 있게 될 것입니다.

 


퍼셉트론

신경망이란 무엇입니까? 시작하기 위해 퍼셉트론(perceptron)이라는 인공 뉴런 유형을 살펴보겠습니다. 퍼셉트론은 Waren McCulloch와 Walter Pitts의 초기 연구에서 영감을 받아 과학자 Frank Rosenblatt에 의해 1950년대와 1960년대에 개발되었습니다. 오늘날, 인공 뉴런의 다른 모델을 사용하는 것이 더 일반적입니다. - 이 책에서, 그리고 신경망에 대한 많은 현대 연구에서 사용되는 주요 뉴런 모델은 시그모이드 뉴런이라고 불리는 것입니다. 시그모이드 뉴런에 대해서도 곧 알아보겠습니다. 하지만 시그모이드 뉴런이 있는 그대로 정의되는 이유를 이해하기 위해서는 먼저 퍼셉트론을 이해하는데 시간을 할애할 가치가 있습니다.

 

퍼셉트론은 어떻게 작동할까요? 퍼셉트론은 x1, x2, 등 여러 개의 이진 입력을 받고 단일 이진 출력을 생성합니다. 

다음 예시에서 퍼셉트론에는 3개의 입력 x1,x2,x3 이 있습니다. (더 많거나 더 적은 입력을 가질 수 있습니다.) Rosenblatt는 출력을 계산하는 간단한 규칙을 제안했습니다. 그는 가중치(weights) w1,w2,w3... 를 도입했습니다. 뉴런 출력 0 또는 1은 가중치의 합 j wjxj 가 일부 임계값보다 작거나 큰지에 의해 결정됩니다. 가중치와 마찬가지로 임계치는 뉴런의 매개변수인 실수입니다. 좀 더 정확한 대수 용어로 표현하자면 : 

 

 

퍼셉트론이 작동하는 방식은 이것이 전부입니다.!

 

이것이 기본적인 수학적 모델입니다. 퍼셉트론에 대해 이해할 수 있는 쉬운 방법은 ' 퍼셉트론이 증거들을 저울질하여 결정을 내리는 장치'라는 것입니다. 예를 들어봅시다. 그다지 현실적인 예는 아니지만 이해하기 쉽습니다. 주말이 다가오고 있고, 여러분이 사는 도시에서 치즈 축제가 열린다고 들어봤다고 가정해 보세요. 당신은 치즈를 좋아하고 축제에 갈지말지 고민하고 있습니다. 다음 세 가지 요소를 고려하여 갈지말지 결정할 수 있습니다.

 

1. 날씨가 좋은가?

2. 남자친구나 여자친구가 같이 가고싶어 하는가?

3. 축제는 대중교통과 가까운가? (차를 소유하지 않았다는 가정 하에)

 

우리는 이 세 요인을 이진 변수 x1,x2,x3으로 나타낼 수 있습니다. 예를 들어 날씨가 좋으면 x1=1이고, 날씨가 나쁘면 x1=0입니다. 

 

자 이제, 당신이 치즈를 너무 좋아하고, 남자친구나 여자친구는 축제에 관심이 없고,축제에 가기 어렵더라도 축제에 가는 것이 정말 행복하다고 가정해봅시다.. 하지만 아마도 당신은 안좋은 날씨를 정말 싫어할 것이고, 날씨가 나쁘면 축제에 갈 방법이 없을 것입니다. 퍼셉트론을 사용해 이런 종류의 의사결정을 모델링 할 수 있습니다. 이 작업을 수행하는 방법은 날씨의 경우 w1=6이고 다른 조건의 경우 w2=2, w3=2를 선택하는 것입니다. 

w1이 더 크다면 날씨가 당신에게 매우 중요한 요소라는 것을 나타내며, 당신의 남자친구나 여자친구가 당신에게 합류하는지 또는 대중교통의 근접성보다 날씨가 더욱 중요하다는 것을 의미합니다. 마지막으로 퍼셉트론에 대한 임계점을 5로 설정했다고 가정해봅시다. 그렇다면 날씨가 좋으면 1을 출력하고 날씨가 나쁘면 0을 출력하게 될 것입니다. 애인이 가고싶어하든 대중교통이 근처에 있든 출력에는 차이가 없어지게 됩니다. 

 

가중치와 임계값을 변경하여 다양한 의사결정 모델을 얻을 수 있습니다. 예를들어, 임계점을 3으로 정했다고 가정해봅시다. 그러면 퍼셉트론은 날씨가 좋을 때 참여할 수 있거나, 애인이 가고싶으면서 대중교통이 편리할 때 축제에 참여할 수 있을 것입니다. 즉, 다른 의사결정 모델이 됩니다. 문턱을 낮추면 축제에 더 많이 갈 의향이 있습니다.

 

분명히 퍼세트론은 인간 의사 결정의 완전한 모델이 아닙니다. 그러나 예시가 보여주는 것은 퍼셉트론이 결정을 내리기 위해 다양한 종류의 것들을 평가할 수 있는 방법입니다. 그리고 퍼셉트론의 복잡한 네트워크가 아주 미묘한 결정을 내릴 수 있다는 것이 그럴듯해 보일 것입니다. 

 

 

이 네트워크에서 퍼셉트론의 첫 번째 열(퍼셉트론의 1 layer)은 입력한 것들을 평가하여 세 가지 매우 간단한 결정을 내리는 것입니다. 두번째 레이어의 퍼셉트론은 어떤가요? 각 퍼셉트론은 의사 결정의 첫번째 layer에서 얻은 결과를 평가하여 의사 결정을 내립니다. 이런 방식으로 두번째 레이어의 퍼셉트론은 첫번째 계층의 퍼셉트론보다 더 복잡하고 추상적인 수준에서 결정을 내릴 수 있습니다. 그리고 세 번째 계층의 퍼셉트론이 훨씬 더 복잡한 결정을 내릴 수 있습니다. 이러한 방식으로 퍼셉트론의 다층 네트워크는 정교한 의사 결정에 참여할 수 있습니다. 

 

덧붙여서, 처음에 퍼셉트론을 정의할 때 퍼셉트론이 하나의 출력만을 갖는다고 했습니다. 위 네트워크에서 퍼셉트론이 여러 출력이 있는 것처럼 보일 수 있지만 여전히 단일 출력입니다. 다중 출력 화살표는 퍼셉트론의 출력이 여러 다른 퍼셉트론에 대한 입력으로 사용되고 있음을 나타내는 유용한 방법일 뿐입니다. 

 

퍼셉트론 설명을 단순화해봅시다. ∑jwjxj>threshold 의 방법은 번거롭습니다. 따라서 우리는 그것을 단순화하기 위해 두가지를 변경시킬 수 있습니다.첫번째는 ∑jwjxj를 내적으로 바꾸는 것입니다. wxjwjxj  >> 여기서 w와 x는 각각 가중치와 입력 성분인 벡터입니다. 

두번째는 임계치를 반대편으로 옮겨서 퍼셉트론의 bias, 즉 한계값으로 대체하는 것입니다. 임계치 대신 bias를 사용하여 퍼셉트론의 규칙을 다시 작성할 수 있습니다.

 

 

 

bias를 퍼셉트론이 1을 출력하는 것이 얼마나 쉬운지에 대한 척도로 생각할 수 있습니다. 좀더 생물학적 용어로 표현하자면, bias는 퍼셉트론이 얼마나 쉽게 발화할 수 있는지를 보여주는 척도입니다. 퍼셉트론이 정말 큰 bias를 가진다면 퍼셉트론이 1을 출력하는 것은 매우 쉽습니다. 하지만 만약 bias가 마이너스가 된다면 퍼셉트론은 1을 출력하기 어렵습니다. 나중에 더 많은 인지적 단순화로 이어지기때문에 앞으로는 책에서 임계치(threshhold)를 사용하지 않고 bias를 사용할 것입니다.

 

퍼셉트론을 결정을 내리기 위한 것들의 가중치를 측정하는 방법으로 설명드렸습니다. 퍼셉트론을 사용할 수 있는 또 다른 방법은 기본연산, AND, OR 및 NAND와 같은 함수로서 우리가 일반적으로 생각하는 기본적인 논리 함수를 계산하는 것입니다. 예를 들어, 각각 무게가 -2이고 전체 bias가 3인 두 개의 입력을 가진 퍼셉트론이 있다고 가정합시다. 퍼셉트론은 다음과 같습니다. 

그런 다음 input 0,0 (x1=0, x2=0 이라는 의미)은 output 1을 생성함을 알 수 있는데, 이는  (−2)∗0+(−2)∗0+3=3 가 양수이기 때문입니다. input 값을 0,1 또는 1,0으로 넣어도 output은 양수이기 때문에 1이 됩니다. 하지만 input 값을 1,1을 주게되면  (-2)*1 + (-2_*1 +3 = -1 즉, 음수가 되기 때문에 output은 0이 됩니다. 그리고 우리는 방금 퍼셉트론 NAND gate를 구현했습니다. ! 

 

NAND gate 예시는 퍼셉트론을 사용해 간단한 논리함수를 계산할 수 있음을 보여줍니다. 우리는 퍼셉트론 네트워크를 이용해서 어떤 논리함수라도 만들 수 있습니다. 그 이유는 NAND gate가 계산에 보편적이기 때문입니다. 즉, NAND gate를 사용하여 어떠한 계산도 할 수 있습니다. 예를들어 우리는 NAND gate를 활용해 x1과 x2, 2비트를 추가하는 회로를 만들 수 있습니다. 이를 위해서는 비트합과 비트곱을 할 줄 알아야 합니다.

 

 

 

퍼셉트론의 동등한 네트워크를 얻기 위해 우리는 모든 NAND gate를 각각 weights가 -2이고 전체 bias가 3인 두 개의 입력으로 합니다. 여기 결과 네트워크가 있습니다. 참고로 다이어그램에 화살표를 쉽게 그릴 수 있도록 오른쪽 하단 NAND gate에 해당하는 퍼셉트론을 약간 움직였습니다.

 

 

 

이 퍼셉트론 네트워크에서 주목할만한 측면중 하나는 맨 왼쪽 퍼셉트론으로부터의 출력이 맨 아래 퍼셉트론에 대한 입력으로 두 번 사용된다는 것입니다. 퍼셉트론 모델을 정의할 때 저는 이런 종류의 이중 출력방식이 허용되는지에 대해서는 말하지 않았습니다. 사실, 그건 별로 중요하지 않습니다. 이런 것을 허용하지 않으려면 가중치가 -2인 두 개의 연결 대신 가중치가 -4인 단일 연결로 두 줄을 병합하는 것이 가능합니다(이것이 명확하지 않다면 멈추고 이것이 동등함을 증명해야합니다). 이렇게 바꾸면 네트워크는 다음과 같이 표시됩니다. 표시되지 않은 모든 가중치는 -2, 모든 bias는 3, 표시된 단일 가중치는 -4입니다.

 

지금꺼지 저는 퍼셉트론 네트워크의 왼쪽에 둥둥 떠있는 변수로서 x1,x2와 같은 입력을 그려왔습니다. 사실, 입력을 인코딩 하기 위해 퍼셉트론 층(입력층)을 추가로 그리는 것이 일반적입니다.

출력은 있지만 입력이 없는 입력 퍼셉트론에 대한 이 표기법은 

약칭입니다. 실제로 입력이 없는 퍼셉트론을 의미하지는 않습니다. 이를 알아보기 위해 우리는 입력이 없는 퍼셉트론을 갖고 있었다고 가정해봅시다. 그러면 j wjxj을 계산했을 때 항상 0값이 나올 것이고,  b>0일 경우 퍼셉트론의 output은 1이 될 것이고, b<=0일 경우 output은 0이 될 것입니다. 즉, 퍼셉트론은 원하는 값이 아니라 단순히 고정된 값을 출력합니다. 입력 퍼셉트론은 퍼셉트론이 아니라 단순히 원하는 값을 출력하기 위해 정의하는 특별한 unit으로 생각하는 것이 좋습니다. (원하는 출력을 얻기 위해서 입력값이 거의 항상 필요할 것이라는 의미)

 

추가적인 예는 퍼셉트론 네트워크가 많은 NAND gate를 포함하는 회로를 시뮬레이션 하는데 어떻게 사용될 수 있는지를 보여줍니다. NAND 게이트는 계산에 보편적이기 때문에 퍼셉트론 또한 계산에 보편적입니다. 

 

퍼셉트론의 계산적 보편성은 안심이 되는 동시에 실망스럽기도 합니다. 퍼셉트론의 네트워크는 다른 계산 장치만큼 강력할 수 있기때문에 안심할 수 있습니다. 하지만 퍼셉트론이 단지 새로운 유형의 NAND gate인 것처럼 보이게 만들기 때문에 실망스럽기도 합니다. 별일은 아니네요 쩝,,

 

 

하지만 곧 인공 뉴런 네트워크의 가중치와 bias를 자동으로 조절할 수 있는 학습 알고리즘을 고안할 수 있다는 것이 밝혀졌습니다. 이러한 것은 프로그래머의 직접적인 개입 없이 외부 자극에 반응하여 이루어집니다. 이런 학습 알고리즘은 기존의 논리게이트와는 근본적으로 다른 방식으로 인공 뉴런을 사용할 수 있게 해줍니다. NAND와 다른 게이트의 회로를 명시적으로 배치하는 대신, 이 신경망은 문제를 단순하게 해결하는 법을 배울 수 있습니다. 하지만 때로는 기존 회로를 매우 어렵게 설계하는 경우도 있습니다.

 


다음에는 시그모이드 뉴런에 대해 알아보도록 하겠습니다~

딥러닝 기본 정리 해석 - 2에서 봬요