Reference)
https://www.pearsonhighered.com/assets/samplechapter/0/1/3/1/0131471392.pdf
https://towardsdatascience.com/rosenblatts-perceptron-the-very-first-neural-network-37a3ec09038a
https://en.m.wikipedia.org/wiki/Perceptron
Rosenblatt’s perceptron, the very first neural network
A quick introduction to deep learning.
towardsdatascience.com
Introduction
전 포스트에서 McCulloch-Pitt Neuron에 대해서 설명했다.
M-P model은 neuron을 최초로 수학적으로 develop 한 모델이며, 아주 직관적이고 간단하다. 때문에 여러 limitation이 있는데, 아주 주된 limitation은:
- Input이 Non-boolean인 경우라면?
- 항상 threshold를 수동 할당해야 하는가?
- 모든 input이 똑같은 가중치인가? 나는 특정 input의 중요도를 더 높이고 싶다.
- 선형적으로 분리할 수 없는 function (i.g. XOR function)이라면 어떡하나?
정도가 된다.
이로부터 15년 뒤, 1958년 미국의 한 심리학자 Frank Rosenblatt은 the Hebbian theory of synaptic plasticity (i.e. the adaptation of brain neurons during the learning process)에 영감을 받아 perceptron이라는 아이디어를 제시한다.
Perceptron
History
Perceptron은 기존 MCP 모델을 조금 변형시켜 단점을 보완한 '최초의 neural network'로 여겨지는 모델이다. 위키피디아에 따르면, Perceptron은 처음에 program이라기보다는 computer이기로 발명되었으나 나중에 IBM 704 컴퓨터에서 software로서 처음 실행이 되었다고 한다. 이후 IBM 704와 별도로 Rosenblatt은 'Mark I Perceptron'이라는 custom-built 하드웨어를 만들어서 image recognition을 주된 용도로 사용하였다.
AI winter - connectionism and symbolism
연결주의(連結主義, connectionism) 또는 병렬 분산처리(PDP, parallel distributed processing) 또는 연결주의 모델(connectionism model)은 인공 신경망을 사용하여 마음 현상 또는 심리적 기제를 과학적 절차에서 보다 구체적으로 구현하는, 인지 과학 분야의 접근법이다. - Wikipedia
In the history of artificial intelligence, symbolic artificial intelligence is the term for the collection of all methods in artificial intelligence research that are based on high-level symbolic (human-readable) representations of problems, logic and search. -Wikipedia
초창기 AI는 각종 네트워크 혹은 전기 회로들을 연결시켜 intelligent behaviour를 구현시키는 비교적 복잡하지 않은 방법들로 구현되었는데, 대표적으로 connectionism (Paul Werbo의 backpropagation도 여기 속함)을 예로 들 수 있다.
전 포스트의 MCP model의 주인공인 Walter Pitts와 Warren McCulloch가 몸담고 있는 이 connectionism은, 하지만, 1950년 Logic Theorist 나 the General Problem Solver 등의 이론들이 성공을 거두자 symbolism의 열풍이 불면서 연구자들이 대거 connectionism에서 symbolism으로 갈아타게 된다. 이 중 살아남은 connectionism의 연구 중 하나가 Rosenblatt의 Perceptron이다.
당시 Rosenblatt의 고등학교 동창인 Marvin Minsky라는 친구가 있었다. 이분은 MIT AI 연구실 공동 창립자면서 Turing award까지 받은 AI field의 대부이시며 connectionism에서 연구하시다 symbolism으로 넘어가신 분들 중 한 명이시다. Rosenblatt이 '퍼셉트론은 결국 학습하고, 결정을 내리고, 언어를 번역할 수 있을 것입니다.'라는 예언과 함께 Perceptron에 대한 열정을 보여주며 연구를 계속하고 계셨지만 Minsky는 1969년 Perceptron이 치명적 한계가 있음을 지적하는 책을 출판하며 connectionism의 안 좋은 부분이 부각된다. 예를 들자면, multi-layer perceptron network는 XOR와 같은 non-linear function을 학습하지 못한다고 하는데, Wikipedia에 따르면, 실제 이는 거짓된 사실이고 Minsky는 이미 가능함을 알고있었다고 한다. 이로써 Connectionism 연구에 지원이 끊기면서 AI의 겨울을 맞이하게 된다. Rosenblatt은 이 책이 출판된 지 얼마 되지 않아 보트사고로 죽었다고 한다. 참고로 1987년 출간된 Perceptrons 책의 확장판 책에서 Minsky의 그 주장이 틀렸음을 지적하는 내용이 포함되어있다.
Idea
Rosenblatt이 이루고자 했던 것은 MCP rule을 조금 완화시켜 데이터로부터 weight를 조정하게 함, 즉, '학습'을 가능하게 하는 것이었다. Supervised Learning의 시초였던 것!
Binary classficaiton
Perceptron의 아이디어를 binary classification으로 이해해보자.
MCP neuron model을 변형시켜 만든 Perceptron은 겉보기에 아주 비슷해 보이지만 명확한 차이점이 있다.
- 뉴런에 synaptic weight 역할을 하는 constant bias b가 input으로 들어간다. b는 단순 activation threshold의 음수이다.
- input의 summation을 구할 때 1이 아닌 weight가 각 input에 곱해져 더해진다. Input의 비중을 정할 수 있게 된 것이다.
- Input이 positive 하지만은 않기 때문에 inhibitory 영향을 보일 수 있다.
- 4번째 가설이었던 '어떠한 억제적인 (inhibitory) 시냅스는 그 시각의 뉴런의 활성화 (activation) 를 절대적으로 방지한다'는 더이상 적용되지 않는다.
따라서 weight와 bias가 추가된 summation은
이고 결과값 v는 hard limiter(signum function 수행)에 들어가게 되고 v가 negative면 signum funciton을 통해 나온 output이 -1, 아니면 +1이 출력된다.
그러므로 classificaiton boundary는
을 만족하는 w,b이다. 왜인지는 전 포스트 참고. 그럼 적절한 w,b를 찾아서 좋은 classification을 하도록 만들어야 하는데, 이들은 어떻게 학습되나?
Perceptron convergence algorithm
Perceptron이 어떻게 최적한 w, b 찾는지 과정을 살펴보자.
참값 $y_i$와 추정값 $\sigma(w^Tx+b)$의 차이를 error로 설정하여 0이 아니라면
$w=w+error*x_j$
해당 input에 error를 곱하여 현 weight 값에 더해주고 bias는 erorr 통째로 더해준다. 직관적으로 왜 이런 방식이 최적한 weight와 bias가 나오는지 이해는 안되지만.. it anyway works!
조금 더 자세한 workflow는 이 블로그를 참조
Python Code (출처)
import numpy as np
class Perceptron(object):
def __init__(self, eta=0.01, epochs=50):
self.eta = eta
self.epochs = epochs
def train(self, X, y):
self.w_ = np.zeros(1 + X.shape[1])
self.errors_ = []
for _ in range(self.epochs):
errors = 0
for xi, target in zip(X, y):
update = self.eta * (target - self.predict(xi))
self.w_[1:] += update * xi
self.w_[0] += update
errors += int(update != 0.0)
self.errors_.append(errors)
return self
def net_input(self, X):
return np.dot(X, self.w_[1:]) + self.w_[0]
def predict(self, X):
return np.where(self.net_input(X) >= 0.0, 1, -1)
'Artificial Intelligence > History of AI' 카테고리의 다른 글
1949) Hebbian Learning: The root of Unsupervised Learning (0) | 2021.12.23 |
---|---|
1943) McCulloch-Pitts Neuron (0) | 2021.12.08 |