def softmax(x):
if x.ndim == 2:
x = x.T
x = x - np.max(x, axis=0)
y = np.exp(x) / np.sum(np.exp(x), axis=0)
return y.T
x = x - np.max(x)
return np.exp(x) / np.sum(np.exp(x))
- 밑바닥부터 시작하는 딥러닝(WegraLee-deep-learning-from-scratch)의 common functions 중 softmax에 대한 코드이다.
x.ndim == 2: 들어온 x의 차원이 2차원인 경우, 보통 입력 데이터는 (배치 크기, 특징 수)로 들어온다.
x = x.T : 이걸 (특징 수, 배치 크기)로 바꾸어 계산을 편하게 한다.
(batch_size, num_features) -> (num_features, batch_size)
x = x-np.max(x, axis = 0): 여기서 값이 너무 커지면 exp할 때 오버플로가 발생할 수 있으므로 열을 기준으로(axis=0)으로 제일 큰 값으로 빼준다. 이 때, 전치를 했기 때문에 실제로는 각 특징에서 최댓값을 빼는 것이다!
np.sum(np.exp(x), axis = 0): 여기서도 전치를 했기 때문에 특징별 exp 값의 합이 된다.
y.T: 전치했던 걸 다시 되돌린다.
따라서 2차원일 경우 각 특징(열)별로 확률값이 되도록 정규화가 된다.
2차원이 아닐 경우 1차원 벡터인 경우를 가정한다.