def softmax(vec):
denumerator = np.exp(vec - np.max(vec, axis=-1, keepdims=True))
numerator = np.sum(denumerator, axis=-1, keepdims=True)
val = denumerator / numerator
return val
'''
array([[2.44728471e-01, 6.65240956e-01, 9.00305732e-02],
[9.00305732e-02, 2.44728471e-01, 6.65240956e-01],
[2.06106005e-09, 4.53978686e-05, 9.99954600e-01]])
'''추론(Inference)을 할 때에는 One-hot Vector(최대값을 가진 주소만 1로 출력하는 연산)를 사용해서 softmax를 사용하진 않음
def one_hot(val, dim):
return [np.eye(dim)[_] for _ in val]
def one_hot_encoding(vec):
vec_dim = vec.shape[1]
vec_argmax = np.argmax(vec, axis=1)
return one_hot(vec_argmax, vec_dim)
def softmax(vec):
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]])
print(one_hot_encoding(vec))
print(one_hot_encoding(softmax(vec)))
'''
[array([0., 1., 0.]), array([0., 0., 1.]), array([0., 0., 1.])]
[array([0., 1., 0.]), array([0., 0., 1.]), array([0., 0., 1.])]
'''


딥러닝은 역전파 알고리즘을 이용하여 각 층에 사용된 파라미터 를 학습함.
경사하강법을 적용해서 각각의 가중치 행렬을 학습시킬 때, 각각의 Gradiant Vector를 계산해야함.
딥러닝에서는 각 층에 존재하는 파라미터에 대한 미분을 계산하여 파라미터를 업데이트
-> 모든 행렬들의 원소들에 대하여 경사하강법 적용
=> 훨씬 많은 파라미터들에 경사하강법이 적용됨
각 층 파라미터의 Gradient Vector는 윗층부터 역순으로 계산(미분)하게 되며, 연쇄법칙(Chain Rule)을 통해 해당 Gradient Vector를 전달함.