[ML/DL Attention] argmax vs. softargmax 너무 대충 알고 있던 그것 | (ft. hardmax / softmax)


Transformer 그리고 Attention 메커니즘을 이해하기 위한 Score vector 만드는 방법 정리.

1. Hard-attention  (with argmax)

2. Soft-attention   (with softargmax)

--------------------------------------------------------------------------------------

Transformer 를 이해하기 전에 Attention 에 대한 개념을 알아야 한다. Attention 을 위한 Score vector 를 어떤걸로 사용하느냐에 따라 다음 두 가지로 나뉜다 :

1. Hard-attention

2. Soft-attention

이 둘의 차이는 Score vector를 생성할 때 argmax 를 사용하는지 아니면 softargmax 를 사용하는지에 차이다. 그리고 다시 다음과 같은 연쇄적인 적용 관계를 가진다:

- hardmax → argmax → hard-attention

- softmax → softargmax → soft-attention

엥??? 뭔가 헷갈린다. 보통 Neural networks 를 이용한 classifier 의 경우 Softmax + argmax 조합을 사용한다. 즉, Softmax 를 통해 정규화된(normalized)된 모델 스코어에서 가장 큰 값을 가지는 노드의 인덱스를 출력하는게 보통의 classification pipeline 이다.

그런데 위의 관계도는 내가 기존에 알고 있던 조합과 달라서 혼란스러웠다. 그래서 정리했다.

Softmax vs. Hardmax

그리고

Argmax vs. Softargmax


--------------------------------------------------------------------------------------


※ A라는 대상을 바로 이해하기 힘들다면 그와 반대되는 B에 대해서 먼저 이해하라.

>> A : B = Softmax : Hardmax 혹은 Softargmax : Argmax

사실 Hardmax 는 단순히 숫자 리스트에서 최대값을 찾는 것과 같다. 코딩을 한다면 max() 함수를 사용하면 된다. max 함수를 구현한다면 다음과 같이 리스트 순회를 통해 비교하면서 최대값을 구할 수 있다:


data = [3, 1, 2, 5, 6]

max_val = None 
for i in data: 
    if max_val == None or i > max_val:
        max_val = i

print(f"max value: {max_val}")


이렇듯 Hardmax() 함수는 단순히 크기 비교를 통해 가장 큰 값을 반환하는 함수다.

그렇다면 Softmax() 함수는?



Softmax() 함수

이를 한 마디로 정리하면:

- 값 리스트를 exponential function을 통한 표준화된 비율로 정규화(normalized) 시켜서 가장 큰 값에서 비율이 증폭되는 함수.

Hardmax() 함수가 최대값만 짚어내는 impluse function 이라면, Softmax() 함수는 최대값에서 비율 수치가 증폭되는 조금더 스무딩(smoothing)된 형태라고 할 수 있다. 무슨 말인지 다음 예시를 보자.

Softmax Fuction 은 다음과 같이 정의된다:







이를 기반으로 다음과 같은 value table 이 있다고 하자:








- 노란색 영역이 입력 리스트이다

- 입력에 softmax function 정의식을 적용하면 오른쪽과 같은 그래프가 그려진다

- 보는 것 처럼 최대값 8 에서 softmax() 의 반환 값이 가장 높은 비율을 차지한다.

- 즉, 최대값 근처에서 거의 대부분의 확률을 가져간다 = 최대값이 8이 될 확률이 가장 높다

이번에는 입력 범위를 음수 영역까지 포함해서 테스트 해보자:

input = [-4, 4] 사이의 정수


input = [-9, -1] 사이의 정수








값의 범위가 바뀌어도 여전히 최대값(maximum value) 에서 가장 높은 비율 값을 반환한다.

- (i.e) Softmax() 함수는 항상 최대값에 sensitive 하다

이 원리를 바탕으로 Softargmax() 가 구현된다.



Softargmax() 함수

한마디로:

softmax() 를 통해 최대값의 인덱스(index)를 근사치(approximate value)로 반환하는 함수다. 근사치이기 때문에 실수값을 반환한다.

- argmax() 는 최대가 되는 위치의 특정 인덱스를 정수값으로 반환한다.

- 이것이 이 둘의 가장 큰 차이점이다.

먼저 Softargmax() 의 정의식은 다음과 같이 유도된다:


softmax() 를 통해 인덱스 I 의 기대값을 구함 = softargmax()















즉, Softargmax() := softmax() 확률 값을 통한 인덱스의 기대값 으로 정의된다.

이때, 기본적인 softmax() 함수로 기대값을 구하면 여러 개의 최빈수(mode)가 존재할 때 증폭이 약해지는 성질을 띤다. 최대값은 올리고, 다른 값들은 낮추기 위해 큰 베타(𝛽) 라는 상수 값을 입력 x에 곱한다.



구현

softmax() 함수는 벡터로 표현된다. 그리고 softargmax() 는 softmax() 에 의한 벡터 곱으로 표현할 수 있다.

이러한 계산 방식을 일반화 시키기 위해 argmax 를 구할 때에도 hardmax() 함수가 벡터를 반환시킬 필요가 있다.

이때 hardmax() 함수는 다음과 같이 다시 정의할 수 있다:

- a hard version of softmax which returns 1 for the maximum component and 0 for all the others

- 즉, 최대값의 위치를 나타내는 one-hot 벡터이다

구현은 다음과 같다:











- 주어진 데이터의 최대값은 2.1 이다

- hardmax() 벡터를 통해 argmax() 를 구하면 정확히 최대값 2.1 이 위치하는 인덱스 3을 반환한다

- softmax() 를 통한 기대값 인덱스는 2.56 이다

- 베타 상수를 곱한 향상된 softmax() 를 사용하면 기대값 인덱스는 2.999 (= softargmax)

- 즉, softargmax() 는 argmax() 를 근사화 시킨 함수로 볼 수 있다

[정리]

- argmax : hardmax 를 이용한 최대값의 인덱스 구하기

- softargmax : softmax 를 활용한 근사된 최대값의 인덱스 구하기



Softargmax() 를 사용하는 이유

- argmax() 는 미분이 불가능하다 (impulse 함수)

- 미분이 불가능하면 기울기 기반의 최적화 알고리즘을 사용할 수 없다 (= 딥러닝 학습 X)

- 따라서, 미분이 가능한 형태의 argmax() 함수가 필요하다

- 그 대안으로 Softargmax() 가 사용된다.

Softargmax() 의 활용 예시는 (ref5)를 참고하자.

colab 구현

위의 코드를 실행하면 다음을 알 수 있다:

- beta 항이 곱해진 향상된 Softmax 신호가 Hardmax의 one-hot 시그널과 유사해진다

- 그러면서도 미분이 가능한 형태

즉, beta-softmax는 hardmax의 명확성softmax의 미분가능성을 모두 가진 형태로 생각할 수 있다



--------------------------------------------------------------------------------------

Reference

개념 관련

1. https://bouthilx.wordpress.com/2013/04/21/a-soft-argmax/

2. https://www.tutorialexample.com/understand-softargmax-an-improvement-of-argmax-tensorflow-tutorial/

3. https://stats.stackexchange.com/questions/298849/soft-version-of-the-maximum-function / 어떻게 벡터로 표현하지?

4. https://m.blog.naver.com/sw4r/221378182223

5. https://powerofsummary.tistory.com/154


구현 관련

6. https://medium.com/@nicolas.ugrinovic.k/soft-argmax-soft-argmin-and-other-soft-stuff-7f94e6120dff

7. https://titanwolf.org/Network/Articles/Article?AID=f2607f6e-78e3-4916-9f3c-c1ff65b8c941


기타

8. https://www.youtube.com/watch?v=KpKog-L9veg / 영상자료

9. https://www.youtube.com/watch?v=M59JElEPgIg / 미분가능 함수

10. https://www.youtube.com/watch?v=ytbYRIN0N4g / 심도 있게 이해하기

11. https://www.youtube.com/watch?v=Z3qBybK4bZg / Softmax 라고 부르는 이유에 대한 설명

12. https://atcold.github.io/pytorch-Deep-Learning/en/week12/12-3/ / NYU-DLSP20


댓글

이 블로그의 인기 게시물

[DL for CV] Down-Sampling (Encoding)