티스토리 뷰

아래 글에 이어 작성된 글입니다.

 

 

 

[인공지능] 머신러닝과 인공신경망

아래 글에 이어 작성된 글입니다. [인공지능] 전문가 시스템과 지식 아래글에 이어 작성된 글입니다. [인공지능] 탐색 아래글에 이어 작성된 글입니다. [인공지능] 인공지능과 딥러닝 [인공지능

munak.tistory.com

 

인공신경망의 초기 모델 퍼셉트론에 대한 설명과 sklearn을 이용한 간단한 구현을 다룹니다.

 

 


 

 

 

 

퍼셉트론은 하나의 뉴런 모델로 구성된 신경망을 말합니다. 이번 글에서는 간단한 예시를 들어 퍼셉트론의 학습 알고리즘과 그 한계점에 대해 알아보도록 하겠습니다.

 

 

 

 

 


 

 

퍼셉트론 학습 알고리즘과 AND 연산 학습

 

퍼셉트론은 다음과 같은 학습 알고리즘을 사용합니다. 입력 데이터와 출력 데이터가 필요하고 바이어스는 입력이 1인 가중치 \(w_{0}\)로 취급하여 출력 신호를 계산합니다. 학습이 진행될수록 목표값이 나올 때까지 가중치가 계속 변경되며 학습의 결과는 가중치에 누적되게 됩니다.

 

 

 

데이터셋:(x(입력데이터),d(출력데이터))

모든 가중치(w)와 바이어스(b)는 0또는 작은 난수로 초기화 한다.

가중치가 변경되지 않을 때까지 반복한다.
	i번째 학습 데이터에 대한 출력 신호를 계산한다.
    
	출력이 올바르게 나왔다면
		아무것도 하지 않는다.
	출력이 올바르게 나오지 않았다면
		가중치를 변경한다.

 

 

 

 

 

 

조금 복잡해 보이지만 '원하는 출력이 나올 때까지 계속 가중치를 변경한다'로 정리할 수 있습니다. 그럼 자세한 설명을 위해 AND 연산을 학습시키는 예를 들어 보겠습니다. AND 연산은 2개의 입력이 들어왔을 때, 두 입력 모두가 1일 때만 1이 출력되는 연산입니다. 그럼 학습 데이터셋은 아래와 같게 됩니다.

 

 

 

 

 

 

 

 

 

아래와 같이 2개의 입력과 1개의 출력이 나오는 퍼셉트론이 있다고 가정하고 출력 값을 계산해 보겠습니다. (위의 알고리즘과 번갈아 가면서 보시면 좋습니다.)

 

 

 

 

 

 

 

 

 

 

먼저 가중치와 바이어스를 0이나 작은 난수로 초기화합니다. 저는 계산의 편리함을 위해 0을 사용했습니다.

 

 

 

 

 

 

 

 

 

그리고 i번째, 즉 각각의 입력 데이터셋에 대해 출력값을 계산합니다. 처음은 0번째 데이터 \(x=(0,0)\;d=0\)가 되겠네요. 주어진 알고리즘에 따라 계산을 해보니 총합은 아래와 같이 0이 됩니다.

 

 

 

 

 

 

 

 

 

그다음 활성화 함수에 총합을 넣어 출력 값을 계산합니다. 퍼셉트론의 활성화 함수는 0보다 크거나 같으면 1, 0보다 작으면 0으로 출력되는 계단 함수기에 0번째 데이터 셋에 대한 출력 값은 1이라고 할 수 있습니다. 이 출력 값을 편의상 앞으로 y라고 부르겠습니다.

 

 

 

 

 

 

 

 

 

결과를 보니 0이 나와야 올바른 출력 값인데 1이 나온 것을 볼 수 있습니다. 그럼 알고리즘에 따라 가중치를 변경해야 하는데,, 어떻게 바꾸는 게 합리적일까요? 

 

 

 

 

 

 

 

 

 

 

결과 값이 0이 나오기 위해서는 활성화 함수에 들어가는 값이 음수가 되어야 합니다. 그럼 총합을 줄이면 올바른 결과가 나온다고 생각할 수 있습니다. (반대로 1이 나와야 하는데 0이 나왔다면 총합을 늘려야 올바른 결과가 나온다고 할 수 있습니다.) 

 

 

 

 

 

 

 

 

 

계산식을 보고 잠시 생각해보면 총합을 줄이기 위해서는 입력값을 1로 취급하는 바이어스 \(w_{0}\)를 변경해야하는 것을 알 수 있습니다. 어차피 입력값이 0이면 곱했을 때 0이 되니 결괏값에 영향을 미치지 않기 때문이죠. 그럼 입력값이 0이 아닌 가중치를 바꾸되 얼마큼 변경하면 좋을까요?

 

 

 

 

 

 

 

 

 

이때 학습률이라는 개념이 등장합니다. 학습률은 한 번에 변경하는 학습의 비율로, 학습률이 클수록 한 번에 변경되는 가중치가 커진다고 할 수 있습니다. 보통 0.0 에서 1.0 사이의 값을 학습률로 지정합니다. 

 

여기서 하나 더 생각해봅시다. 오차가 클수록 가중치를 많이 바꾸면 효율이 좋아지지 않을까요? 맞습니다. 요약하면 우리는 입력값이 0이 아닌 가중치들을 오차(정답-출력값) 비례한 학습률 만큼 변경하면 됩니다. 따라서 다음 가중치를 계산하는 식은 아래와 같습니다.

 

 

 

 

 

 

 

 

 

 

이렇게 하면 값이 작아져야 할 때는 가중치의 총합을 줄이게 되고 커져야 할 때는 늘리게 되며, 오차에 따라 학습률을 적용할 수 있고 입력값이 0일 때에는 변화가 없도록 할 수 있습니다! 위 내용을 더해 알고리즘을 다시 한번 정리해 보았습니다. 

 

 

데이터셋:(x(입력데이터),d(출력데이터))

모든 가중치(w)와 바이어스(b)는 0또는 작은 난수로 초기화 한다.

가중치가 변경되지 않을 때까지 반복한다.
	i번째 학습 데이터에 대한 출력 신호를 계산한다.
    
	i번째 학습데이터에 대해 d=y라면
		아무것도 하지 않는다.
	i번째 학습데이터에 대해 d!=y라면
		모든 가중치를 현재 가중치 + 학습률 ∙ (정답 – 출력값) ∙ 입력값으로 업데이트한다.

 

 

 

 

 

 

 

다시 예시로 돌아와 학습률을 0.1로 하고 위 식을 적용해 가중치를 변경시켜 보겠습니다. 식에 맞추어 모든 다음 가중치(바이어스)를 계산하면 다음과 같습니다.

 

 

 

 

 

 

 

 

 

 

 

변경된 가중치로 인해 어떤 결과가 나올지 다시 한번 \(x=(0,0)\;d=0\) 데이터의 총합과 출력값 y를 계산해 볼까요?

 

 

 

 

 

 

 

 

 

출력값이 0으로 바뀌면서 원하는 결과가 나오면서 퍼셉트론 알고리즘이 제대로 작동하고 있는것을 확인할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

이어서 다른 입력값에 대해서도 계산을 해보겠습니다.

 

\(x=(1,0)\;d=0\)

 

 

 

 

 

 

 

 

 

 

 

 

\(x=(0,1)\;d=0\)

 

 

 

 

 

 

 

 

 

 

 

\(x=(1,1)\;d=1\)

 

 

 

 

 

 

 

 

 

 

 

 

주어진 4개에 데이터에 대해 학습을 진행해 보았는데요. 이렇듯 제공된 모든 데이터에 대해 학습하는 단위를 에포크(epoch)라고 합니다. 현재는 1 에포크만큼 학습을 진행시킨 것이고 보통은 이 에포크를 여러 번 진행시켜 학습을 합니다. 저희는 위 알고리즘대로 가중치가 변하지 않을 때까지 학습을 진행시켜보겠습니다. 

 

 

 

 

 

4 에포크를 진행하니 더 이상 가중치가 변경되지 않으면서 정확한 값이 출력되는 것을 확인할 수 있습니다. 퍼셉트론 알고리즘을 통해 AND 연산이 학습된 것입니다.

 

 

 

 

 


 

 

OR 연산 학습

 

위와 같이 OR연산도 학습도 한번 계산해 보겠습니다. OR연산은 AND와는 다르게 두 입력 중 하나라도 1이 있으면 1을 출력하는 연산입니다.

 

 

 

 

 

 

AND 연산 학습과 똑같이 먼저 가중치와 바이어스를 0으로 초기화하고 학습률은 0.1로 설정한 뒤 1 에포크 학습을 진행시켜 보겠습니다.

 

 

 

 

 

 

 

 

 

다음과 같이 가중치(바이어스)가 변경되었습니다. 계속해 학습 과정을 계산해 보겠습니다.

 

 

 

 

 

 

 

 

AND와 마찬가지로 4 에포크에서 가중치에 변화가 없어 학습이 마무리되는 모습입니다. 

 

 

 

 

 

 

 

 


 

 

 

 sklearn으로 퍼셉트론 사용해 보기

 

파이썬의 sklearn(scikit-learn)을 통해 퍼셉트론을 쉽게 사용해 볼 수 있습니다. 아나콘다의 스파이더 환경에서 실행시켜 보겠습니다. 

 

 

 

sklearn.linear_model.Perceptron

Examples using sklearn.linear_model.Perceptron: Out-of-core classification of text documents Out-of-core classification of text documents, Comparing various online solvers Comparing various online ...

scikit-learn.org

 

 

// sklearn 설치 명령어
$ pip install scikit-learn

 

### 퍼셉트론 AND 연산 학습 코드 ###
from sklearn.linear_model import Perceptron

# 입력 데이터
X = [[0,0],[0,1],[1,0],[1,1]]
Y = [0,0,0,1]

# 퍼셉트론 생성
# tol 종료 조건 (오차가 tol 보다 작아질 경우 학습 종료)
# random_state 난수 시드 (학습 데이터 순서를 랜덤으로 설정)
clf = Perceptron(tol=1e-3, random_state=0)

# 학습 진행 (퍼셉트론 알고리즘)
clf.fit(X,Y)

# 테스트 진행
print(clf.predict(X))

 

 

 

 

 

 

 

테스트 결과 [0,0,0,1]이 나오며 제대로 학습이 된것을 볼 수 있습니다. OR 연산도 학습해 볼까요?

 

 

 

 

 

 

 

OR 연산도 잘 학습되는 것을 볼 수 있습니다.

 

 

 

 

 

이렇게 퍼셉트론은 AND와 OR 같은 연산들을 학습할 수 있다는 것이 증명되었는데요. 연구자들도 퍼셉트론을 이용해 금방 인공지능을 구현해 낼 수 있을 거라고 생각했었습니다. 하지만 이후에 퍼셉트론에서는 치명적인 문제점이 발견되었습니다. 

 

 

 


 

 

 

 

퍼셉트론의 한계와 XOR연산

 

문제는 XOR연산이었습니다. XOR연산은 0과 1이 교차되어 입력으로 들어올 때만 1이 출력되는 연산입니다. 퍼셉트론은 사람에게는 간단한 XOR연산을 학습할 수 없었는데요. 

 

 

 

 

 

 

 

 

 

 

위의 코드를 XOR로 바꾸어 한번 실행해 볼까요? 테스트 결과 [0,0,0,0]이 나오면서 학습이 제대로 되지 않는 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

이렇듯 퍼셉트론이 선형분리가 가능한 문제만 해결할 수 있다는 사실이 밝혀(Minsky와 Papert의 저서 ‘퍼셉트론’에 의해)지면서 신경망에 대한 연구는 중단되고 맙니다. 결국 서서히 잊혀져 인공지능의 첫번째 겨울을 맞고 말죠. 

 

 

 

하지만 퍼셉트론은 오늘날 인공지능 기술의 핵심인 신경망 아이디어의 시작이기에 그 자체로 큰 의미가 있다고 생각합니다. 다음글에서는 퍼셉트론의 문제점을 보완한 다층 퍼셉트론에 대해 작성해 보겠습니다.

 

 

감사합니다.

 

 


 

 

공부한 내용을 복습/기록하기 위해 작성한 글이므로 내용에 오류가 있을 수 있습니다.

 

댓글
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Total
Today
Yesterday