생물학적 기본단위는 뉴런(신경세포) 를 보겠습니다.
모든 뉴런은 한쪽끝에서 다른쪽 끝으로 전기신호를 전송합니다.
즉 가지돌기에서 축삭을 거쳐 축삭말단까지 전송하는 것입니다.
인간의 뇌는 약 1천억개 우와 진짜많다, 의 뉴런을 가지고있다.
초파리는 겨우 10만개 정도의 뉴런이 있다고한다.
그럼에도 잘날아다니고 음식을 찾아 섭취하는 등 복잡한 업무를 수행한다.
우리도 좀만 공부하면 초파리정도의 인공지능은 만들 수 있지않을까??
뉴런의 동작 원리를 알아보자
뉴런은 전기입력을 받아 또다른 전기신호를 발생한다.
이는 분류 또는 예측자에서 입력을 받아 어떤 처리를 하여 결과를 출력하는 것과 매우 유사하다.
뉴런은 입력을 받았을 때 즉시 반응하지 않고 입력이 누적되어 어떤 수준으로 커진 경우에만 출력을 하게 된다.
즉 입력값이 어떤 분계점에 도달해야 출력이 발생하는 것이다.
뉴런이 미세한 잡음 신호 따위는 전달하지 않고 의미 있는 신호만 전달하게 된다는 점에서도 직관적으로 이해가 될 것이다.
이처럼 신호를 받아 특정 분계점을 넘어서는 경우에 출력 신호를 발생하는 함수 를 활성화 함수 (Activation Function)
수학적으로 다양한 활성화 함수가 존재하는데 활성화 함수 중 가장 단순한 형태인 계단함수 (Step Function)은 다음과 같이 표현한다.
그래프에서 보듯이 입력값이 작은 경우에는 출력값이 0, 입력값이 분계점을 넘게되면 1 으로 출력
이번에는 계단함수를 개선해볼까요?
시그모이드 함수 ( Sigmoid function) 은 차갑고 딱딱한 계단함수보다 부드러운 형태를 가지는데
이보다 자연스럽고 현실에 가깝다.
앞으로 인공신경망을 만들 때 이처럼 부드러운 S자 형태를 가지는 시그모이드 함수를 활용할 것이다.
시그모이드는 단순하면서도 전통적으로 많이 쓰여온함수 이므로 인공 신경망을 처음 공부하는 우리에게 안성맞춤이다.
시그모이드함수는 때때로 로지스틱 함수 (Logistic function) 이라고도 부른다.
수식으로는
수식을 보고 겁낼 필요없다.
e 라는 기호는 2.71828... 이라는 값의 상수로서 수학이나 물리학에서 흔이 사용하는 상수 ( 오일러의 수 , 자연상수 )
입력이 a,b,c 의 합이 x 가 분계점을 넘어설 정도로 충분히 크지않다면 시그모이드 함수는 아무것도 출력하지 않는다.
반대로 x 가 분계점을 넘으면 시그모이드 함수는 이 뉴런을 작동시킨다.
흥미로운점은 나머지 입력값이 매우 작더라도 1개의 입력값이 크면 뉴런은 작동할 수 있다.
전기신호는 가지돌기에 의해 수집된 다음 하나로 연결되어 더 강한 전기신호가 됩니다.
이 신호가 분계점을 넘어설 정도로 충분히 크면 뉴런은 축삭으로 신호를 발사해 축삭말단을 통해 다음 뉴런의 가지돌기로 전달하게 합니다.
각 뉴런은 1개가 아니라 여러 개의 뉴런으로 부터 입력을 받는다는 점이다.
또한 각각의 뉴런은 한번씩 작동될 때 여러개의 뉴런으로 신호를 전달하게 된다.
이러한 생물학전 뉴런을 인공적으로 모델화하려면 어떻게해야할까? 이게 인공지능이겠지?
바로 뉴런을 여러계층에 걸쳐 위치하고 각각의 뉴런은 직전계층과 전후 계층에 있는 모든 뉴런들과 상호 연결되어 있는 식으로 표현하면 될것이다.
그림에서 3개의 계층이 있으며 각 계층에는 뉴런이 3/4/2개가 존재합니다.
각각의 인공뉴런을 노드(Node)라고 부른다.
각 노드는 직전계층과 직후 계층에 존재하는 다른 모든 노드와 연결되어있다.
이러한 구조에서 과연 어떤부분이 학습을 하는 것일까?
학습데이터를 통해 학습을 진행하게 되면 도대체 무엇을 조정해야하는 것일까?
분명한 것은 한가지는 노드간 연결의 강도를 조정해나가야한다는 점이다.
하나의 노드 내에서 입력값들의 합을 조정하거나 시그모이드함수의 형태를 조정할 수 있지만
이는 단순히 노드간 연결의 강도를 조정하는 것보다 훨씬 복잡한 작업이다.
단순한 방법이 제대로 동작한다면 그것을 이용하면 됩니다.
각각 연결에 적용할 가중치(Weight)를 함께 표현했습니다.
낮은 가중치는 신호를 약화하며 높은 가중치는 신호를 강화한다.
왜 하나의 노드가 직전계층과 직후계층 모든 노드와 연결할까?
프로그램 구현이 쉽기 때문이다.
문제를 해결하기 위해 필요로 하는 절대적인 최소값보다 연결이 몇개 더 있다고해서 별 문제가 되는 것도 아니기 때문이다.
그 연결은 학습과정을 통해 자동적으로 가중치가 매우 낮아지기 나름이다.
신경망 내 의 신호 따라가기
신호가 입력되어 계층들을 거쳐서 출력까지 가는 과정에서 우리가 직접 이 신호를 계산해나갈 것을 생각하니 막막하다.
하지만 신경망을 단계별로 하나하나 그림으로 그려나가면서 어떤 일이 벌어지고있는지 확인해나갈 것이므로 걱정할 필요없다.
2개의 입력 값이 각각 1.0 과 0.5 이라고 하겠습니다. 이를 그림으로 표현해보겠습니다.
각 노드는 각 입력 값의 합을 구한후 활성화 함수를 통해 이를 출력합니다.
활성화 함수는 시그모이드 함수를 사용할 것입니다.
시그모이드 함수에서 x는 입력 값의 합을 , y는 출력값을 의미 합니다.
가중치는 어떻게 초기화 해야할까요? 일단 임의의 값으로 초기화 해봅시다.
W(1,1) = 0.9
W(1,2) = 0.2
W(2,1) = 0.3
W(2,2) = 0.8
첫 번째 계층은 입력 계층이므로 입력 신호 값을 표현하는 것 외에는 어떤 작업도 필요하지 않다.
신경망의 첫번 째 계층은 입력 계층이며 입력 계층이하는 일은 그저 입력값을 표시하는 것 뿐이다. ( 일단은 이렇게 정의하고 넘어가자 )
입력계층인 Layer 1 은 어떤 계산도 없이 쉽게 끝났다.
다음으로 Layer 2에서는 계산을 수행할 것입니다. 우리는 계층 2에 존재하는 각각의 노드로 들어오는 입력값들의 합에 대해 작업해야 합ㄴ디ㅏ.
시그모이드 함수에서 바로 X 가 해당하는 노드로 들어온 입력 값들에 가중치를 곱한 값들의 합입니다.
우선 계층 2의 노드 1을 보겠습니다. 입력 계층의 2개 노드가 모두 연결되어 있습니다. 입력 노드의 값이 각각 1.0 과 0.5입니다.
첫번 째 노드로부터의 연결은 가중치가 0.3 입니다. 따라서 입력 값들에 대해 가중치를 곱하고 합계를 낸 값은 다음과 같이 계산할 수 있다.
x = (노드1 의 출력 값 * 가중치) + (노드2의 출력값 * 가중치)
x = (1.0 * 0.9) + (0.5 * 0.3) = 0.9 + 0.15 = 1.05
이를 입력의 합이라고 부르며 이렇게 입력의 합을 구하는 것을 조합 (Combine) 한다.
신호를 조정하지 않았다면 1.0 + 0.5 = 1.5 라고 단순합을 결과로 얻었을 것이다.
하지만 신경망에서 학습을 하는 대상은 가중치입니다. 즉 점점 나은 결과를 얻기 위해 가중치의 값을 반복적으로 업데이트 해가는 것이 바로 신경망 학습이므로 가중치가 반드시 포함되어야 합니다.
우리는 계층2의 노드 1로 들어온 입력의 합을 x = 1.05 라고 계산했으므로
활성화함수 (시그모이드함수)에 이 입력 값을 넣어줌으로써 최종적으로 이 노드의 출력 값을 계산할 준비가 되었습니다.
y = 1 / (1 + 0.3499 ) = 0.7408 이 됩니다.
이로써 우리는 2개 노드 중 1개 노드의 출력 값을 실제로 계산해낸것입니다.
남아있는 계층 2의 노드2에 대해 동일한 방식으로하면 0.6457 이라는 출력 값을 얻게됩니다.
수많은 계층과 노드를 가지는 복잡한 신경망이라고 하더라도 매우 간결하게 출력값을 구할 수 있는 수학적 방법이 존재합니다.
간결한 접근 방법을 제공하는 것이 바로 행렬 입니다.
행렬곱은 유용하다
행렬은 어렵다 ㅠㅠ
복잡한 업무를 행렬 기반으로 잘만들어서 컴퓨터에게 넘기면 컴퓨터가 알아서 효율적으로 처리하기때문에 사용한다.
행렬에서는 관행적으로 행(Row)를 먼서 쓰고 다음에 열 (Column) 을 쓴다.
행렬은 2개의 행을 가지며 3개의 열을 가진다. 따라서 2x3 행렬이다.
행렬의 곱셈 연산인 행렬곱을 보면 얼마나 유용한지 감을 잡을 수 있다.
행렬 2개의 곱을 예로 해보자
계층 2의 각 노드에 전달되는 입력의 합의 계산을 행렬곱을 이용해 표현할 수 있다. 이를 축약해서 표현하면
X = W · I
여기서 W는 가중치의 행렬이며 I 는 입력 값들의 행렬
활성화함수 계산은 가단하고 행렬 곱은 필요로하지 않습니다.
O = sigmoid(X)
'TensorFlow' 카테고리의 다른 글
신경망 첫걸음, 05 가중치의 진짜 업데이트 (0) | 2022.04.01 |
---|---|
신경망 첫걸음, 04 가중치 학습하기 (0) | 2022.03.31 |
신경망 첫걸음, 02 분류자 학습시키기 (0) | 2022.03.28 |
신경망 첫걸음, 01. 예측자 와 분류 기초 (0) | 2022.03.28 |
Keras in TensorFlow 2.0 (0) | 2022.03.25 |