Since our model contains no recurrence and no convolution, in order for the model to make use of the order of the sequence, we must inject some information about the relative or absolute position of the tokens in the sequence.
RNN과 LSTM과 다르게 트랜스포머는 입력 순서가 단어 순서에 대한 정보를 보장하지 않는다. 다시 말하면, 트랜스포머의 경우 시퀀스가 한번에 병렬로 입력되기에 단어 순서에 대한 정보가 사라진다. 따라서 단어 위치 정보를 별도로 넣어줘야 한다.
위와 같이 transformer 입력이 주어질 것이다. 이때 width는 embedding 차원, height은 vocab_size가 될 것이다. 처음 생각은 위와 같은 데이터가 들어온다면 각 행은 단어에 관한 정보를 담고 있고 행의 순서는 곧 단어의 순서를 의미하기 때문에 PE가 굳이 필요한가라는 생각이 있었다.
이에 대해 간단한 데이터셋으로 설명하겠다.
MAX = 1000data = []for i in range(MAX):for j in range(MAX):data.apend(f'{i}+{j}' + f'={i+j}' + '\n')data.apend(f'{i}-{j}' + f'={i-j}' + '\n')with open('dataset/number_data.txt', 'w') as f:f.writelines(data)
위 코드로 2,000,000 개의 데이터를 생성했다. 덧셈과 뺄셈식을 넣었을 때 결과를 transformer 모델이 학습해 이를 유추하는 모델이다. (학습 모델 및 데이터 전처리 과정 코드 생략)
attention이 이를 잘 관찰하는가가 문제이다. 따라서 입력 “21+211=232”에 대한 값(가중치)을 시각화해 보겠다.
이는 를 계산하는 과정에서 이해할 수 있다.
먼저 Query, Key, Value는 입력 에 대해 가중치 W를 이용해 생성된다. 처음 Encoder에서 생각해보면 의 각 행은 단어를 의미할 것이고 행렬곱 연산을 적용한 후 나온 matrix의 각 행도 의 행 값에 영향이 많을 것이다. 입력이 **“12+1”**이라면 행렬곱으로 생성된 를 위와 같다고 생각할 수 있다.
의 십의 자리 “1”과 일의 자리 “1”은 같은 값을 갖을 것이다.(Word Embedding의 결과) 따라서 각각의 행렬에서 십의 자리 “1”과 일의 자리 “1”은 같은 값을 갖을 것이다.
이후 값을 구해도 십의 자리 “1”과 일의 자리 “1” 두 행의 값은 동일하다라는 것을 생각할 수 있고 이후 연산도 동일하다.
결론적으로 나온 가중치 값은 Attention mechanism에서 매우 중요한 에 대해 어떤 단어를 집중할지를 보여줄 텐데 가중치 에서 이미 이 두 개의 정보를 구분할 수 없기에 이후 나오는 output은 이에 대해 모호한 결과로 나올 것이다. 따라서 위치 정보가 없다면 학습하는 데 영향을 줄 수 있다.
위 데이터셋은 덧셈과 뺄셈에 관한 데이터셋이지만 이를 확장시켜 문장 번역 task에서도 한 문장안에 똑같은 단어가 주어졌을 때 이를 구분할 수 없을 것이다.