일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 실버
- 밑바닥부터 시작하는 딥러닝
- 설정
- n과 m
- 재귀
- 파이썬
- 가상환경
- 4948
- 백준
- 그리디 알고리즘
- 기계학습
- Mac
- BOJ
- 15649
- 신경망 학습
- streamlit
- Python
- 경사하강법
- 개발환경
- 1101
- 9020
- end to end
- pyenv
- N-Queen
- 1002
- 손실함수
- 백트래킹
- 파이싼
- Today
- Total
파이톨치
[밑바닥부터 시작하는 딥러닝] 퍼셉트론 본문
시작하기 전에
책을 시작하기 전에 딥러닝이란 무엇이고, 왜 배워야 하는지에 대한 설득이 부족하다고 생각합니다. 저는 그래봐야 학부생이지만, 처음 딥러닝을 알기시작하시는 분들을 위해 조금이나마 이해를 돕기위해서 설명을 해보겠습니다.
우선 딥러닝이 무엇일까요? 한국어로는 심층 학습이라고 합니다만, 용어만 들어서 무엇인지 추측하기란 정말 어렵습니다. 근의 공식이라는 용어로 근의 공식을 알 수는 없는 것처럼 말이죠. 우선 딥러닝을 알기 전에 러닝이라는 단어에 초점을 맞춰봅시다. 러닝은 학습이라는 뜻을 가지고 있습니다. 기계가 학습을 한다는 것 입니다.
예를 들어서, (1,1), (2,2), (3,3)이라는 좌표가 주어졌을 때 다음에 올 좌표가 무엇일까요? 라는 문제가 있을 때 우리는 (4,4)가 다음에 올 좌표라는 것을 "예측"할 수 있습니다. 우리의 뇌는 이미 잘 학습된 장치입니다. 때문에 다음과 같은 예측을 할 수 있는 것이죠.
하지만 기계는 이를 처음부터 알려주어야 합니다. 이 과정을 학습이라고 하는 것입니다. 다시 말하면, 학습이라는 과정은 결국 패턴을 찾는 것입니다. 특정한 데이터가 주어졌을 때, 상황에 맞는 패턴을 찾아 답을 "예측"하는 것이 기계학습의 목표입니다. 그
이제 러닝을 알았습니다. 그렇다면 왜 "딥"러닝일까요? 이를 알기 위해서 신경망의 구조를 파악해야 합니다.
후에 배우겠지만 딥러닝은 이러한 구조를 가지고 있습니다. 여기서 은닉층이라고 하는 층이 깊어지면서 딥러닝이 되는 것입니다. 예시를 보면 다음과 같습니다. 중간에 뭐가 많은데, 뭐가 많아서 딥러닝이라고 생각하면 편합니다.
그렇다면 딥러닝은 왜 배워야 할까요? 이유는 너무나 간단합니다. 최신 인공지능 연구가 이런 딥러닝을 중심으로 이루어지기 때문입니다. 우리가 흔히 보는 그림을 그려주는 인공지능이나 이루다 같은 챗봇들의 기반이 이런 딥러닝입니다. 아래 사이트를 들어가보면 인공지능에 MBTI 까지 넣어주는 세상이니 신기할 뿐입니다. 진짜 실제 인간과 꽤나 비슷한 성능을 보입니다. (물론 허점은 있겠지만 말이죠.)
우리가 앞으로 살아가게 될 인생에서 인공지능이 차지하게 되는 비중은 더욱 더 커질 것입니다. 때문에 이런 딥러닝의 기본 원리들을 알아두는 것은 인공지능을 메인으로 배우던 배우지 않던 필요할 것입니다.
파이썬의 꽃은 딥러닝
프로그래밍 언어들은 각자의 역할들이 있습니다. 자바스크립트의 경우 웹 페이지를 만드는데 특화되어 있고, C/C++은 크고 작은 기계를 만들 때 많이 사용하곤 합니다. 제 생각에 파이썬은 딥러닝과 데이터과학을 하는데 특화되어 있다고 생각됩니다. 그런 의미에서 파이썬의 꽃은 딥러닝이라고 생각됩니다.
많은 사람들이 파이썬이 쉽다고 말합니다. 하지만 파이썬이 쉽다고 해서 파이썬이 만들어내는 결과물들이 쉬운 결과물들이 되는 것은 아니라고 생각합니다. 어떤 언어를 쓰냐보다는 무엇을 만들어내는지가 더 중요하다고 생각합니다.
또한 그 안에 있는 라이브러리들도 중요합니다. C++의 경우에는 STL의 존재가 C++을 더 강력하게 만든다고 생각합니다. 파이썬도 마찬가지로 데이터 과학을 하는데 있어서 넘파이나 사이파이는 파이썬을 더욱 빛나게 하고, 파이토치나 텐서플로우 같은 딥러닝 프레임워크들도 파이썬을 강력하게 만들어주는 것들 중 하나입니다.
이러한 것들을 활용하면 딥러닝을 하기 편하지만, 이 책의 목표는 이러한 강력한 API를 사용하지 않고 최소한의 넘파이만 사용하여 딥러닝을 구현하는데 있다고 생각합니다.
간단한 퍼셉트론부터
퍼셉트론은 생각보다 오래된 알고리즘입니다. 처음 고안된 것은 1957년이라고 합니다. 하지만 오래 되었다고 해서 좋지 못한 것은 아닙니다. 지금까지 사용되고 있다는 것은 그 가치가 충분히 있다는 것이겠죠. 마치 우리가 지금 몇 백년전의 고전문학을 읽는 것과 비슷할 것입니다.
퍼셉트론의 구조는 다음과 같습니다. 굉장히 간단합니다. 다음과 같이 다수의 신호를 입력받아서 y라는 하나의 출력을 만들어냅니다. 우리가 요리를 할 때 재료를 다 넣어서 하나의 요리를 만들어내는 것과 비슷합니다. 만약 잡채요리를 한다면, 면의 비중이 가장 클 것 입니다. 그리고 여러가지 채소들이 조금씩 들어가겠죠. 그러한 비중을 나타내는 것이 저 선분 w들입니다.
명칭들을 살펴보자면, 이 동그라미들은 노드(뉴런)라고 합니다. 그리고 저 선분을 가중치라고 부릅니다. 우리는 컴퓨터과학을 하는 사람들입니다. 그림에 친숙해지기 보다는 수식을 알아야할 필요가 있습니다. 수식은 다음과 같습니다.
위 식은 선형대수학에서 많이 볼 것 같은 식 입니다. 위 식을 관찰해보면, 우리가 중고등학생 때 배웠던 직선의 방정식과 유사합니다.
조금만 생각해보면 두 행렬의 곱으로 표현할 수 있겠지만, 이것은 나중에 이야기 하겠습니다.
이러한 퍼셉트론으로 우리는 논리 게이트를 만들 수 있습니다. 우리가 회로 시간에 한번쯤 봤던 것들입니다. 다음과 같습니다.
우리는 여기서 AND와 NAND, OR를 구현해보려고 합니다. 논리회로는 진리표라는 것이 있습니다. 입력에 따른 결과를 정리해놓은 것이죠.
입력에 따른 저러한 출력을 만드는 것을 목표로 해봅시다. 이것을 파이썬을 통해 구현을 해야합니다. 위의 퍼셉트론 구조보다는 위의 수식을 생각하며 구현하는 것이 편할 것입니다.
def AND(x1, x2):
w1, w2 = 0.5, 0.5
theta = 0.6
y = x1*w1 + x2*w2
if y <= theta:
return 0
else:
return 1
AND 게이트를 구현하면 다음과 같습니다. 여기서 w1, w2, theta값을 조절하면 위의 게이트들을 만들 수 있습니다. 위의 식에서 theta값이 0.4가 된다면 AND 게이트가 OR 게이트로 변할 것 입니다. NAND 게이트는 AND 게이트에서 if문의 부등호의 방향을 바꾸어주는 식으로 구현할 수 있습니다. 이는 모두 선형적인 형태로 만들어줄 수 있습니다.
참고로 앞에서 말했던 행렬의 연산을 통해 구현한다면 위의 코드를 다음과 같이 만들어 줄 수 있습니다. 행렬을 연산하는 넘파이를 통해서 말이죠.
import numpy as np
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
y = np.sum(w*x) + b
if y <= 0:
return 0
else:
return 1
비선형적인 구조는 어떻게?
하지만 XOR의 경우에는 아무리 직선을 그려봐도 구현을 할 수가 없습니다. 때문에 퍼셉트론은 처음에 한계를 맞이 했습니다. 비선형적인 구조에서는 쓸 수 없으니 말이죠.
하지만 지금까지 살아남았다는 것은 대단하신 선배님들께서 이 방법을 찾아내신 것입니다. 바로 다층 퍼셉트론입니다. 퍼셉트론을 여러개 만들어서 합친 것으로 오늘날의 딥러닝의 기본이 되는 아이디어 입니다. 여기서부터 오늘날의 딥러닝이 발전해왔다고 생각하니 조금 신기한 기분이 듭니다.
코드로 구현하면 다음과 같습니다. 앞에서 썼던 게이트들을 합친 것이라 코드 자체는 간단하지만 이를 생각하기가 어렵지 않았을까 생각해봅니다.
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
이러한 게이트를 만들어내는 것이 왜 중요하냐고 물어볼 수 있습니다. 하지만 컴퓨터의 구조를 배워본다면, 컴퓨터는 사실 굉장히 단순한 구조를 빠르게 연산하는 장치라는 것을 알 수 있습니다. 때문에 이러한 논리 회로로 컴퓨터를 구현할 수 있는 것입니다. 또한 마지막에 봤던 퍼셉트론을 여러개 쓴다는 아이디어를 통해 오늘날의 딥러닝을 구현했기에 꽤나 중요한 개념이라고 생각합니다.
'AI&ML > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글
[밑바닥부터 시작하는 딥러닝] 오차역전파법 학습 코드 (0) | 2023.01.03 |
---|---|
[밑바닥부터 시작하는 딥러닝] 오차역전파법 (0) | 2022.12.31 |
[밑바닥부터 시작하는 딥러닝] 신경망 학습 (2) | 2022.12.31 |
[밑바닥부터 시작하는 딥러닝] 신경망 구현하기 (0) | 2022.12.27 |
[밑바닥부터 시작하는 딥러닝] 신경망 (0) | 2022.12.26 |