신경망을 수식으로 분해
- 기존의 선형모델로는 복잡한 문제를 해결하기 힘들다
- 비선형모델인 신경망(neural network)
- 가중치 행렬 w가 있다(기존 행렬를 다른 행렬로 보내 줄 수 있다)
- x가 w와 b의 선형결합으로 o가 만들어진다
- 분류문제를 풀 때 학습을 시키기 위해서는 softmax가 필요
Softmax
- 모델의 출력을 확률로 해석할 수 있게 변환해주는 연산
- 분류 문제를 풀 때 선형모델과 소프트맥스 함수를 결합하여 예측
def softmax(vec):
#지수함수를 사용하면 너무 큰 벡터가 들어오면 오버플로우가 발생할 수 있다. 그러므로 np.max를 뺀다
denumerator = np.exp(vec - np.max(vec, axis=-1, keepdims=True))
numerator = np.sum(denumerator, axis=-1, keepdims=True)
val = denumerator / numerator
return val
vec = np.array([[1,2,0], [-1,0,1], [-10,0,10]])
softmax(vec)
# Ex [1,2,0] -> [0.24, 0.67, 0.09]
- O 출력벡터를 softmax 함수를 합성하면 확률벡터가 되므로 특정 클래스 k에 속할 확률로 해석가능
- 추론 시 원핫 벡터로 최대값을 가진 주소만 1로 출력하는 연산을 사용해서 softmax를 사용하지 않는다.
신경망
- 분류모델일 경우 소프트멕스를 이용해서 선형모델에 나온 출력값에 소프트멕스를 사용
- 소프트멕스를 사용하면 원하는 결과값을 얻을 수 있다.
- 신경망은 선형모델과 활성함수를 합성한 함수이다. <-소프트맥스처럼
- SoftMax는 모든 출력물을 고려해서 한다
- 활성화함수는 해당 주소의 결과값으로만 한다 -> 나온 결과값을 잠재벡터
활성함수
- 실수 값을 입력을 받아서 실수 값을 출력한다
- R위에 정의된 비선형 함수이다
- 활성함수를 쓰지 않으면 딥러닝은 선형모형과 차이가 없다.
- sigmoid함수나 tanh함수는 전통적으로 많이 쓰이던 활성함수지만 딥러닝에선 ReLU 함수를 많이 쓰고 있다.
- 신경망은 선형모델과 활성함수를 합성한 함수이다.
다층 퍼셉트론
- 신경망이 여러층 합성된 함수
- x를 입력으로 받고 w1가중치를 받아 z로 보내고 z를 활성화함수를 씌워서 H라는 잠재벡터에 보낸다
- 활성화함수는 각 벡터에 개별적으로 적용
-> 순차적인 신경망 계산을 foward propagation이라고 부른다
층을 여러개 쌓는 이유
- 층이 깊을 수록 목적함수를 근사하는데 필요한 뉴런(노드)의 숫자가 훨씬 빨리 줄어들어 좀 더 효율적으로 학습이 가능 (적은 노드로 복잡한 패턴을 만들 수 있다)
역전파
- 선형은 한번에 경사하강법을 하면 되지만 딥러닝은 각 층대로 수행한다.
- 위층에 있는 gradient를 계산하고 밑에 층에 전달하면서 가중치 업데이트
- 연쇄법칙 기반 자동미분을 사용
- 각 뉴런에 속하는 값을 텐서라고 한다
- 역전파를 하기 위해서는 각 텐서의 미분값를 미리 알고 있어야 하므로 순전파에 비해 메모리가 크다