y
와 선형모델의 결과인 ŷ
의 차이(L2-Norm)를 최소화하는 β
를 찾는 것이다.O = X W b
O : 선형모델의 결과로 출력(output)되는 행렬 (행벡터 oi를 원소로 가짐) -n x p
X : 데이터 -n x d
W : 일종의 연산자 역할을 하는 가중치 행렬 -d x p
b : y절편에 해당하는 행벡터를 데이터의 개수(n
)에 맞춰 모든 행에 복사한 행렬n x p
d
에서 p
로 바뀐다는 것을 기억하자출처 : https://towardsdatascience.com/softmax-activation-function-explained-a7e1bc3ad60
def softmax(vec):
numerator = np.exp(vec - np.max(vec, axis=-1, keepdims=True))
# vec의 max값을 빼주는 이유는 지수함수이므로 값이 너무 커지면 overflow가 발생할 수 있기 때문이다.
# 분모, 분자가 동일한 값을 사용하므로 결과에 영향을 주지 않는다.
denominator = np.sum(numerator, axis=-1, keepdims=True)
val = numerator / denominator
return val
softmax(O) = softmax(Wx + b)
max(vec)
의 값만을 1로 출력하는 원-핫(one-hot) 벡터를 사용하므로 softmax 함수를 사용하지 않는다.선형모델의 출력물(O)에 대해, 각각의 원소에 개별로 적용되는 비선형(nonlinear) 함수
쉽게 말해 실수값을 input으로 받아 실수값을 출력하는 비선형 함수이다.
모든 원소를 고려하는 softmax와 달리, 한 원소에 대한 활성함수는 그 원소만 고려한다.
활성함수는 σ
기호로 나타낸다.
현재 딥러닝에서 가장 많이 쓰이는 활성함수는 ReLU 함수이다.
- max{0, x} : 0보다 작으면 0, 0보다 크면 x를 출력한다.
H
기호로 나타낸다.H = σ(z) = (σ(z1), σ(z2) ... σ(zn))
X -> W(1), b(1) 과 σ(Z(1)) -> H (신경망 1개의 구조)
H -> W(2), b(2) -> O (잠재벡터를 한 번 더 선형변환하여 출력)
이러한 구조를 2층 신경망이라 한다.
또한 이런 구조를 여러층 합성하여 만든 함수를 다층 퍼셉트론이라 한다.
L
층으로 이루어진 다층 퍼셉트론은 L
개의 가중치 행렬(W)과 L개의 y절편 파라미터(b)로 이루어져 있다.이론적으로는 2층 신경망만으로도 임의의 연속함수를 근사할 수 있다.
하지만 실전에서는 뉴런의 개수가 기하급수적으로 많아져 무리가 있다.
하지만, 층이 많을수록 목적함수 전사에 필요한 노드(뉴런)의 숫자가 빠르게 줄어든다.
결과적으로 조금 더 효율적인 학습이 가능하다.
하지만 무작정 층이 깊다고 좋은 것이 아니다.
층이 깊으면 근사는 쉽지만 최적화가 어려워진다는 단점이 있다.
위 그림과 같이 y를 x에 대해 미분하기 위해 2번의 편미분을 순차적으로 이용하는 것이다.