오늘 배운거슨
PyTorch 딥러닝 기초!
https://colab.research.google.com/drive/109gHWFUlUzuwhgXROpzIuVoSPZA_qeoy#scrollTo=hlBvtfAmAp1i
nn.ipynb
Colaboratory notebook
colab.research.google.com
오늘은 코드를 써보진 않았구
개념을 이해하는 시간이었당
열띤 설명의 흔적... ㅋㅋㅋㅋㅋ
맨날 애들이 하는거만 봤지
인공지능을 만드는 구조에 대해 공부해본거는 처음이라 새로웠당
일단 소감은... 음 애들이 이해하긴 어렵겠구나..?ㅋㅋㅋ
물론 애들한테는 좀더 쉽게 설명하긴 하셨겠지만
우리 꼬맹이들이 GG 선언을 한데는 이유가 있었구나,. 티쳐블 머신 짱이다.,, 생각함ㅋㅅㅋ
무튼 정리해보면
<인공지능 개념>
처음에 머신러닝과 인공지능의 차이에 대해 이야기했다
어케 설명해주셨는지 잘 기억이 안나서..ㅋㅋㅋㅋㅋ
인공지능이 좀더 큰 범주라고 말씀해주셨고
구글링해서 나온 자료를 참고하자면
인공지능: 인간의 사고능력, 지적능력을 컴퓨터로 구현하는 것
머신러닝: 컴퓨터가 스스로 학습하여 인공지능의 성능을 향상시키는 것
딥러닝: 인간의 뉴런과 비슷한 인공신경망 방식으로 정보를 처리
라고 정의할 수 있는데,
오늘 모임에서 배운 거 없이 그냥 이 그림을 봤다면
딥러닝 개념을 딱 이해하긴 힘들었을 것 같다 ㅋㅋㅋ
하나 배운거는,, 머신러닝 다음에 딥러닝을 하는거라고 생각했는데
(머신러닝이 선행되어야 딥러닝을 할 수 있는 줄 알았는데)
오늘 배운 내용을 생각해보면
그냥 구현하고 싶은 거를 딥러닝에 바로 적용할 수 있겠구나 싶었다.
음.... 예를 들면
내가 오늘 모임 전에 그냥 이름만 듣고 상상했던거는
머신러닝이 supervised learning 이고
딥러닝이 그것을 토대로 정교화 시키는 과정이지 않을까? 생각했는데
그냥 훈련시키는 방식이 다른거였다!
supervised learning 이라는 학습시키는 방식이 있었던것,,
근데 이거는 머신러닝을 알아야 명확해질것 같다..
<머신러닝과 딥러닝 차이>
머신러닝이란 무엇일까요? 🔍
먼저 “머신러닝(Machine learning)”에 대해서 알아볼까요?
한국어로 직역해보면 “기계 학습”이 되겠죠? 머신러닝은 인공지능을 만들기 위해 기계를 학습시키는 다양한 방법에 대한 학문으로 ‘로봇공학’, ‘제어계측공학’과 같이 하나의 학문이랍니다.
최근에는 한국의 대학교에서 인공지능학과가 생겨나고 있다는 사실 들어보셨죠? 인공지능(머신러닝)을 전공한 학생들은 “저는 머신러닝을 전공했습니다”라고 할 수 있는 시대가 되었어요. “저는 전자공학을 전공했습니다” 같은 맥락처럼 말이죠.
그럼 딥러닝이란 무엇일까요? 🔍
딥러닝(Deep Learning)이란 머신러닝보다 더 작은 개념으로 ‘신경망’을 통해 인공지능을 만드는 머신러닝의 한 종류입니다.
이 딥러닝은 신경망을 여러 층 쌓아서 만든 것인데요. 중학교 교과에서 함수 y=f(x)를 배웠을 때, y = f(g(x))라는 함수 안에 들어간 또 다른 함수, 합성 함수를 배웠던 것을 기억하시나요? 함수의 합성처럼 동물의 신경세포들의 합성인 ‘신경망(Neural Network)’을 따라 만든 ‘인공신경망(Artificial Neural Network)’에서 여러 계층 쌓아서 만든 깊은 신경망(Deep Neural Network), 다른 이름 ‘딥러닝’이 만들어졌습니다. ‘층’이 깊다(Deep)고 해서, ‘심층 학습, 깊은 학습’으로 불리는 학습 방법입니다.
원래 ‘머신러닝’보다 딥러닝의 핵심인 ‘신경망’이 먼저 태어났어요. 그렇지만, 최근에는 ‘머신러닝’이라는 학문에 포함된 단어처럼 사용되기도 하죠. 그러나 ‘딥러닝’만 해도 또 다른 학문이라고 해도 과언이 아닐 만큼 학습해야 하는 양이 많기 때문에, 딥러닝을 하시는 분들은 “딥러닝이 왜 머신러닝이야?”라고 말하기도 합니다.
https://www.codestates.com/blog/content/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%94%A5%EB%9F%AC%EB%8B%9D%EA%B0%9C%EB%85%90
궁금해서 찾아봄 ㅋㅋ
머신러닝은 기계를 학습시키는 다양한 방법들이고,
딥러닝은 그 다양한 방법 중 '신경망'형태로 인공지능을 만드는 방식이다!
그래서 supervised/unsupervised learning(지도식/비지도식 훈련) 은 머신러닝에도 있고 딥러닝에도 있는
그냥 학습 시키는 방법중의 하나이다
오늘 주된 주제는 딥러닝의 구조를 이해하는 것이었는데!
요 복잡한 구조를... 수식화? 시키는 방법을 배우고
그것을 코드로 짜면 어떻게 나오는지 확인했다
<가중치와 편향>
가중치 (Weight)
처음 들어오는 데이터(입력층)에서 다음 노드로 넘어갈때 모두 같은값이면 계속 같은 값이 나올것 입니다. 각기 다르게 곱해야 한다는것이 바로 가중치(weight)입니다. 데이터를 각기 다른 비중으로 다음 은닉층(hidden layers)으로 전달시키기 위해 웨이트(weight), 중요도를 다르게 한다고 이해하시면 됩니다.
https://jh2021.tistory.com
편향(bias)
은 하나의 뉴런으로 입력된 모든 값을 다 더한 다음에(가중합이라고 합니다) 이 값에 더 해주는 상수입니다. 이 값은 하나의 뉴런에서 활성화 함수를 거쳐 최종적으로 출력되는 값을 조절하는 역할을 함
https://jh2021.tistory.com/3#:~:text=%ED%8E%B8%ED%96%A5(bias)%EC%9D%80%20%ED%95%98%EB%82%98%EC%9D%98,%EC%89%BD%EA%B2%8C%20%EC%98%88%EB%A5%BC%EB%93%A4%EC%96%B4%20%EB%B3%B4%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4.
먼저 딥러닝의 구조를 보면,
사람 신경계 뉴런을 본따서 만들었고
가중치, 편향, 활성화함수 각 개념에 대해서 알아보면
가중치는 그림에서 원들을 잇는 선들의 굵기에 해당한다고 보면된다
활성화함수는
입력값과 가중치를 곱한값들의 합을 0과 1사이로 들어오도록 만들어주는 함수이다(그중 하나가 시그모이드)
편향은
활성화함수로 뽑아낸 그래프의 중심은 0에 묶여있을 수 밖에 없는데,
그 중심을 옮길 수 있도록 더해주는 상수값이다
<수식화하기>
모임에서 가장 많이 할애했던 수식화하기,,
y1과 y2를 구하는 식이 행렬곱과 같다
(갑분 행렬 ㅋㅋㅋㅋ 한개두 기억안나서 물리학과인거 말 안하고 들었음.. 문과계열 회사에 취직하면 다 까먹어요..)
<코드로 표현하기>
X는 공부한시간, 잔 시간
Y는 성적
xPredicted 는 학습한 매개변수를 활용해서 성적을 예측하는 .... 입력..?
X = torch.tensor(([2, 9], [1, 5], [3, 6]), dtype=torch.float) # 3 X 2 tensor
y = torch.tensor(([92], [100], [89]), dtype=torch.float) # 3 X 1 tensor
xPredicted = torch.tensor(([4, 8]), dtype=torch.float) # 1 X 2 tensor
x에 (2,9) (1,5), (3,6)이 있다면 3X2 행렬이 됨
Y에 (92), (100), (89)가 있다면 3X1 행렬이 됨
X와 Y의 크기를 출력해보면 알 수 이따!
아까 활성화 함수를 이용해서 값들을 0과 1사이로 만들어준다고했는데,
그걸 코드로 표현하면
요러케 되는데,
가장 큰 값으로 값들을 다 나눠주는 과정이다
ex) (4, 8) 두개 값이 있다면 가장 큰 8로 값들을 나눠주면 (0.5, 1)이 됨
딥러닝의 전체 코드는 아래와 같다
class Neural_Network(nn.Module):
def __init__(self, ):
super(Neural_Network, self).__init__()
# parameters
# TODO: parameters can be parameterized instead of declaring them here
self.inputSize = 2
self.outputSize = 1
self.hiddenSize = 3
# weights
self.W1 = torch.randn(self.inputSize, self.hiddenSize) # 3 X 2 tensor
self.W2 = torch.randn(self.hiddenSize, self.outputSize) # 3 X 1 tensor
def forward(self, X):
self.z = torch.matmul(X, self.W1) # 3 X 3 ".dot" does not broadcast in PyTorch
self.z2 = self.sigmoid(self.z) # activation function
self.z3 = torch.matmul(self.z2, self.W2)
o = self.sigmoid(self.z3) # final activation function
return o
def sigmoid(self, s):
return 1 / (1 + torch.exp(-s))
def sigmoidPrime(self, s):
# derivative of sigmoid
return s * (1 - s)
def backward(self, X, y, o):
self.o_error = y - o # error in output
self.o_delta = self.o_error * self.sigmoidPrime(o) # derivative of sig to error
self.z2_error = torch.matmul(self.o_delta, torch.t(self.W2))
self.z2_delta = self.z2_error * self.sigmoidPrime(self.z2)
self.W1 += torch.matmul(torch.t(X), self.z2_delta)
self.W2 += torch.matmul(torch.t(self.z2), self.o_delta)
def train(self, X, y):
# forward + backward pass for training
o = self.forward(X)
self.backward(X, y, o)
def saveWeights(self, model):
# we will use the PyTorch internal storage functions
torch.save(model, "NN")
# you can reload model with all the weights and so forth with:
# torch.load("NN")
def predict(self):
print ("Predicted data based on trained weights: ")
print ("Input (scaled): \n" + str(xPredicted))
print ("Output: \n" + str(self.forward(xPredicted)))
차근차근 살펴보면
인풋이 2, 히든이 3, 아웃풋이 1
즉 아래 그림과 같을때
w1는 3X2 행렬이되고
w2는 3X1 행렬이 된다
그다음 forward함수는 그것을 계산해주는 거고
웨이트 행렬을 곱해준 다음 시그모이드를 적용함!
그니까 그림의 input에서 output까지 나아가는 과정이라고 볼 수 있다!
근데 딥러닝을 훈련시키기 위해서는,
이걸 거꾸로 돌려주는 작업이 필요함.
그래서 다음으로 오는 backward가 있는것!
backward 계산식을 정의해준 다음,
'딥러닝 훈련'시키는 train을 보면
먼저 forward를 한 다음에 그것을 backward하는 것을 알 수 이따!
모임에서 배운 것은 여기까지였는데,
여기에서 내가 이걸보고
"만약 forward 돌린 값이 우리가 바라는 정답과 이미 거리가 멀다면?" 이라는 생각이 들었다.
backward가 forward한번 거친 후 그걸 되돌리면서 정교화시키는거라면,
만약 완전히 틀린게 들어오면 훈련자체가 의미가 없어지지않나? 하는 생각이 들었음
결국 이건 컴퓨터가 스스로 배우는 게 아니라
사람의 판단이 들어갈수밖에 없겠는데..? 하는 생각이 들었었음!
그래서 물어봤는데 여기의 핵심이라고 했다
이건 supervised learning 방식이고,
forward가 첨에 제대로 되어있는지? 값을 제대로 뽑았는지? 인간이 판단해준 후 쓰는 방식인것이어따
후,,, 이걸 갔다와서 바로 썼어야했는데
넘 피곤해섴ㅋㅋㅋㅋ 쓰다 말았더니 기억이 안나서 ㅠㅠ
구글링이랑 강의도 찾아보면서 정리했다,,,
그래도 한번 다시 복습한거같아서 나뿌지않은듯 허허
'개발과 계발 > 코딩학당' 카테고리의 다른 글
2022-11-23 코딩학당 2 (0) | 2022.11.24 |
---|---|
2022-11-16 코딩학당 1 (0) | 2022.11.16 |