Index
1 | 1. Chapter 2 "Perceptron" |
Navigation
Perceptron
신경망
신경망 학습
Chapter 2 “Perceptron”
AND Gate Python으로 구현하기
1 | # 내가 만든 |
OR Gate Python으로 구현하기
1 | # 내가 만든 |
XOR Gate Python으로 구현하기
1 | def and1(x1:int, x2:int)->int: |
Chapter 3 “신경망”
활성화 함수
신호의 총 합을 출력 신호로 변환하는 함수
단층 퍼셉트론에서 사용하는 Step Function
1 | import numpy as np |
Sigmoid Function
1 | import numpy as np |
Relu Function
1 | import numpy as np |
Hyperbolic Tangent Function
sigmoid보다 output 값의 범위가 넓어 vanishing gradient 문제가 발생할 가능성이 있는 모델에서 사용한다.
하지만 여전히 층이 많이 깊어지면 vanishing gradient 문제를 피할 수는 없다.
1 | import numpy as np |
선형 VS 비선형
중첩의 원리가 적용되면 선형! 적용되지 않으면 비선형!
입력값 각각을 함수에 대입한 결과의 합과
1 | y = ax1 + bx2 일때 |
입력값의 합을 함수에 대입한 결과가 서로 같다면
1 | y = ax1 + bx2 일때 |
바로! 중첩의 원리가 적용되는 것!
신경망에서는 활성화함수로 비선형 함수를 사용하는 이유는?
1 | 활성화 함수를 f(x) = ax 라고 했을 때 |
행렬 곱연산 VS dot VS matmul
**행렬 곱연산(Element wise, 일반적인 행렬 곱셈과 다름)**
1 | n = np.array([1,2]) |
dot(Element wise의 합, 내적)
1 | import numpy as np |
matmul(@, 행렬 곱셈(matrix multiplication))
1 | g = np.array([[1,2],[1,2]]) |
dot과 matmul dot은 내적을, matmul은 행렬의 곱을 의미하는데 3차원, 3차원 연산부터 값이 서로 상의 하게 나온다. 내적의 의미는 서로 다른 두 벡터의 방향성을 알 수 있는 연산값이지만 행렬의 곱의 의미는 무엇일까..? 왜 3차원 부터 다른것일까? 아는 사람은 메일 주세요 ㅠ
내적(inner product)
방향이 있는 서로 다른 두 벡터가 있을 때
한 벡터를 기준으로 같은 방향이 되도록 다른 한 벡터를 정사영시켜
기준 벡터의 크기와 정사영시켜 생긴 벡터의 크기의 곱이다.
즉, 한쪽 방향으로의 크기의 곱!
내적을 구하면 두 벡터의 방향이 얼마나 일치하는지 알 수 있다!
다층 신경망 구현하기(3층 신경망 또는 2층 신경망)
version 1
1 | import numpy as np |
version 2
1 | import numpy as np |
출력층 설계하기
우선 학습의 결과값으로 유한개의 결과가 나오는가 무한개의 결과가 나오는가 판별해야 합니다
유한개의 결과가 나온다면 분류 문제 (몇개로 분류되는지도 생각해봐야 함)
무한개의 결과가 나온다면 회귀 문제
결과값을 달리 해야 하기 때문에 출력층에서 사용하는 활성화 함수도 분류 문제인지, 회귀 문제인지에 따라 달라져야 합니다.
기계학습은 학습과 추론 두 단계를 거친다(backward propagation & forward propagation)
1 | 추론 => 지금의 사고방식(가설함수, 모델)로 예측하는 것 |
사람 VS 기계학습 VS 딥러닝
딥러닝은 기계학습의 일종이지만 학습을 하는데 있어서 조금 차이를 보입니다.
1 | ex) 숫자 5를 학습하는 법 |
분류
이중 분류라면 step function이나 sigmoid 다중 분류라면 softmax (step, sigmoid, softmax이외에 다른 함수가 될 수도 있다)
ex) 0 ~ 9사이의 숫자중 어느 하나를 분류해야하는 문제가 있다고 한다면 출력층의 노드의 수는 10개가 되고
2개 이상의 분류이기 때문에 softmax같은 활성화 함수를 활용해 10개의 출력을 하되 마지막에는 가장 확률이 높은 값 하나만을 출력하면 된다
**step, sigmoid는 많이 다뤘으므로 softmax를 알아보자**
1 | def softmax(x): |
softmax 계산시 오퍼플로우 문제 softmax에 709이상의 입력값을 대입하면 오버플로우 현상이 발생한다. 따라서 오버플로우를 방지하기 위해서 입력값중 가장 큰 값을 뽑아 대입하는 값에 각각을 빼주고 계산하게 되면 각각의 값에 전부 같은 값을 빼주었기 때문에 softmax의 결과는 달라지지 않고 출력됨을 확인할 수 있다. softmax는 발생확률 값을 리턴하기 때문에 출력값의 총 합이 1이되기만 하면 된다.
MNIST 데이터 셋으로 추론 처리 구현하기(분류)
test data로 이미 학습된 모델(pickle) 정확도 확인하기 (test data의 예측값과 test data의 실제값 비교)
1 | import pickle |
회귀
배치 (Batch)
하나로 묶은 입력 데이터를 배치(Batch)라고 합니다.
MNIST데이터는 숫자 이미지 데이터로 이미지 크기가 28 X 28 => 784라고 했을 때
1 | 이미지 데이터 1장일 때 |
배치 처리의 장점 1. numpy가 벡터연산을 효율적으로 처리하기 때문에 한번에 많은 데이터를 입력하더라도 빠른 시간에 처리할 수 있다. 2.
신경망에서 데이터 전송이 병목으로 작용하는 경우가 자주 있는데, 배치 처리를 함으로써 버스에 주는 부하를 줄일 수 있다.
배치 처리 구현 (위 MNIST 예제와 동일)
1 | x, y = get_data() |
Batch VS Mini Batch VS Stochastic Gradient Descent
1 | Batch는 여러 데이터를 한 묶음으로 하여 1 Iteration에 사용되는 data set의 모음 |
Chapter 4 “신경망 학습”
## 학습하기
Lose Function(Cost Function)
신경망 학습에서는 현재 상태를 하나의 지표로 표현하고
그 지표를 가장 좋게 만들어주는 가중치 매개 변수의 값을 탐색해나갑니다.
이때 현재 상태와 다음 상태를 비교하여 최적의 상태를 만들기 위한 수단으로 손실 함수를 사용하게 됩니다.
Mean Squared Error(평균 제곱 오차)
1 | def mse(y, t): |
Cross Entropy Error(교차 엔트로피 오차)
1 | def cee(y, t): |
해석적 미분 VS 수치 미분
해석적 미분
해석적으로 미분
오차를 포함하지 않는 진정한 미분 값을 구할 수 있다
1. 전미분
2. 편미분
수치 미분
아주 작은 차분으로 미분하는 것
수치 미분에는 오차가 포함된다
반올림 오차
반올림 오차는 소수점 8자리 이하가 생략되어 최종 계산에 오차가 생기게 하는 경우를 말한다
1 | import numpy as np |
차분
중앙 차분
수치 미분의 예
1 | import numpy as np |
func_draw(x, y, x, function_1)
func_draw(x, y, x, function_2)
학습 알고리즘 구현하기
1 | [학습] => 데이터(Feature)의 중요도에 관여하는 가중치와 편향을 훈련 데이터에 적응하도록 조정하는 과정 |