이 딥러닝 포스트는 '밑바닥부터 시작하는 딥러닝' 내용을 공부하고 복습 차원에서 작성하는 포스트가 될 것이다.
파이썬, 아나콘다, Numpy,matplotlib 설치 후 간단한 사용, 그리고 퍼셉트론에 대해서 알아보자
python --version을 터미널에 입력하면 파이썬이 설치되어 있는 버전이 나온다. 설치가 되어있지 않거나 2.x 버전이라면 3.x버전을 설치해야 한다.
https://www.python.org/downloads/
해당 링크에서 본인 컴퓨터의 OS에 맞는 파이썬을 설치하자.
아나콘다는 파이썬의 배포판중 하나인데, 사용자가 설치를 한 번에 수행할 수 있도록 필요한 라이브러리 등을 하나로 정리해둔 것으로 아나콘다는 그중 데이터 분석에 중점을 둔 배포판이다.
https://www.anaconda.com/products/distribution#Downloads
해당 링크에서 본인 컴퓨터의 OS에 맞는 파이썬을 설치하자.
아나콘다 까지 설치를 마쳤다면,numpy와 matplotlib를 설치할 차례이다.
아나콘다가 잘 설치 되어있다면, 터미널에 기존 유저 이름 왼쪽 끝에 (base)라고 적혀 있을 것이다. 설치되어 있어도 저 글자가 없다면 다음과 같이 입력해 주도록 하자
$ conda activate
아나콘다를 활성화 시키고, 아래와 같이 작성해 라이브러리를 설치해 주자.
$ conda install numpy
$ conda install matplotlib
두 라이브러리를 파이썬에서 사용하려면 가져와야 한다.
import numpy as np
import matplotlib.pyplot as plt
해석해보면 numpy 라이브러리를 np라는 이름으로 가져와라 라는 뜻이다. 아래 matplotlib도 같다.
numpy 라이브러리는 배열, 행렬 계산에 편리한 메소드를 가지고 있는 라이브러리이며, matplotlib는 그래프를 그려주는 라이브러리이다.
일단 numpy의 간단한 예제부터 알아보자.
import numpy as np
x = np.array([1.0, 2.0, 3.0])
x+y
x-y
x*y
x/y
main.py라는 파일을 만들고 위와 같이 작성해 보자, 그리고 터미널을 이용해 main.py가 위치한 폴더로 이동하고 다음과 같이 작성하면 저 코드가 실행이 된다.
$ python main.py
결과는 아마 다음과 같이 나올 것이다.
array([3., 6., 9.])
array([-1., -2., -3.])
array([2., 8., 18.])
array([0.5, 0.5, 0.5])
배열끼리 서로 곱할 때 원소 수가 깥아야 각 원소에 대해서 산술 연산이 발생한다.
하지만 원소별 계산 뿐만 아니라 numpy 배열과 수치 하나의 조합으로 된 산술 연산도 수행 가능하다. 이 기능을 브로드캐스트라고 한다.
A = np.array([1, 2], [3, 4]) B = np.array([10, 20]) A*B
result : array([[10, 40], [30, 80]])
위와 같이 [10, 20] 배열이 2X2로 자동으로 확대된 후 연산이 이루어 진다. 이 기능을 브로드 캐스트 라고 한다.
다음과 같이 main.py를 작성한 후, 위 설명한 대로 실행해 보자
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 6, 0.1)
y = np.sin(x)
plt.plot(x,y)
plt.show()
np.arange는 데이터를 생성하는 메소드 이다. 위 작성한 콛에서는 0에서 6까지 0.1 간격으로 데이터를 생성한다. (ex: 0.1, 0.2, 0.3 ... 5.9, 6.0)
위 코드를 실행하면 0부터 6까지를 x좌표로 하는 sin 함수 그래프가 그려지게 된다. 이렇게 pyplot을 이용해 그래프를 그릴 수 있다.
퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력하는 알고리즘 이다. 앞으로 전달한 퍼셉트론 신호는 1, 0 두가지 값으로만 존재한다.
입력으로 2개의 신호를 받은 퍼셉트론을 예로 들어보면 x1, x2는 입력 신호, y는 출력 신호, w1, w2는 입력 신호에 가해지는 가중치를 뜻한다.
입력 신호가 각 노드(뉴런)으로 보내질 때는 각각 고유한 가중치가 곱해진다. 이 신호의 총 합이 정해진 한계, 임계값을 넘어서게 된다면 1을 출력하고, 넘지 못한다면 0을 출력한다.
식은 다음과 같다. 수식을 velog에 작성을 어떻게 하는지 잘 몰라 내 식으로 작성해 보도록 하겠다.
y = 0 if w1x1 + w2x2 <= theta
y = 1 if w1x1 + w2x2 > theta
AND 게이트를 예로 들어보자. AND 게이트는 두 입력이 모두 1이어야만 출력 값으로 1을 출력하는 논리 회로이다. 이 게이트를 퍼셉트론으로 표현해 보면
(w1, w2, theta)가 (0.5, 0.5, 0.7)일 때 위 조건을 만족하는 퍼셉트론이 만들어 질 것이다.
이를 이용해 파이썬으로 AND 게이트를 구현해 보자
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
tmp = x1*w1 + x2*w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
위에서는 w1x1 + w2x2 > theta 이런 식으로 판별했지만 theta를 이항해서 좀 쉽게 치환할 수 있도록 변경해 보자.
y = 0 if b + w1x1 + w2x2 <= 0
y = 1 if b + w1x1 + w2x2 > 0
b는 편향이라고 하며 theta에 부호만 바뀐 것이다. 이 식으로 퍼셉트론을 해석해 보면 퍼셉트론은 입력신호에 가중치를 곱한 값과 편향을 합하여 그 값이 0을 넘으면 1을 출력하고, 그렇지 않으면 0을 출력하는 알고리즘인 것이다.
논리 회로에는 XOR이라는 회로가 있다. x1, x2 한쪽이 1일 때만 1을 출력하는 회로이다. 퍼셉트론으로는 이 XOR 게이트를 구현할 수 없다.
이유를 알아보자, OR 게이트를 예로 들면 b+w1x1+w2x2 이 값이 0을 넘느냐 안넘느냐에 따라서 값이 달라진다. x1, x2를 각각 x축 y축으로 하는 그래프를 그려보면, 직선으로 두 영역으로 나눠지는 것을 알 수 있다. 하지만 XOR 그래프를 직선 하나로 두 영역을 나눌 수 없다, 하지만 곡선을 이용한다면 나눌 수 있다.
우리는 이런 직선으로 표현하는 영역을 선형 영역, 곡선으로 표현하는 영역을 비선형 영역이라고 한다.
예전 대학교 2학년때 디지털 회로시간에 배웠지만, 논리회로를 조합해서 XOR 게이트를 구현할 수 있다.
OR, NAND 게이트에서 나온 결과를 AND게이트에 연결하면 XOR 게이트와 같은 논리 회로를 구현할 수 있다. 이 처럼 다층구조의 퍼셉트론을 만들면 단층 구조이 퍼셉트론이 구현하지 못했던 XOR 게이트와 같은 논리 회로도 구현이 가능하다.
오늘은 딥러닝 학습에 필요한 기초 개발 셋팅과 각 라이브러리 사용 예시, 그리고 퍼셉트론에 대해 알아봤다. 다음 시간에는 신경망에 대해서 다뤄보려 한다.