업계 뉴스레터
전문가가 전하는 최신 AI 트렌드
가장 중요하고 흥미로운 AI 뉴스에 대한 선별된 인사이트를 확인하세요. 주간 Think 뉴스레터를 구독하세요. IBM 개인정보 보호정책을 참조하세요.
구독은 영어로 제공됩니다. 모든 뉴스레터에는 구독 취소 링크가 있습니다. 여기에서 구독을 관리하거나 취소할 수 있습니다. 자세한 정보는 IBM 개인정보 보호정책을 참조하세요.
위치 인코딩은 시퀀스에서 단어의 위치에 대한 정보를 트랜스포머 아키텍처에 주입하는 기술입니다.
단어의 순서는 문장을 의미론적으로 이해하는 데 있어 기본적인 역할을 합니다. 예를 들어, 'Allen walks dog'와 'dog walks Allen'는 동일한 단어 또는 토큰을 가지고 있음에도 불구하고 완전히 다른 의미를 갖습니다. 딥 러닝과 신경망을 사용하여 자연어 처리(NLP) 애플리케이션을 구현할 때는 기계가 문장의 단어 순서를 유지하여 논리적 아웃풋을 생성할 수 있는 메커니즘을 만들어야 합니다.
전통적으로 반복 신경망이나 장단기 메모리와 같은 모델에는 단어의 순서를 처리하는 메커니즘이 내장되어 있습니다. RNN과 LSTM은 인풋을 한 번에 하나의 토큰씩 순차적으로 처리하여 시퀀스에서 단어의 모든 위치를 기억합니다. 즉, '입력 벡터'라고도 하는 n차원 벡터가 차례로 처리되면서 내재적으로 순서를 학습합니다. 이와 반대로 콘볼루션 신경망(CNN)이나 변환기(Vaswani et al. 2017)를 활용하는 다른 아키텍처들은 단어 순서를 유지하지 않고 토큰을 병렬로 처리합니다. 따라서 우리는 시퀀스에서 단어의 순서를 명시적으로 표현하는 메커니즘, 즉 위치 인코딩이라고 알려진 기술을 구현해야 합니다. 위치 인코딩을 통해 트랜스포머는 단어 순서 정보를 유지하여 병렬화 및 효율적인 모델 훈련을 가능하게 합니다. GitHub에서 위치 인코딩이 구현된 것을 종종 찾아볼 수 있습니다.
업계 뉴스레터
가장 중요하고 흥미로운 AI 뉴스에 대한 선별된 인사이트를 확인하세요. 주간 Think 뉴스레터를 구독하세요. IBM 개인정보 보호정책을 참조하세요.
구독은 영어로 제공됩니다. 모든 뉴스레터에는 구독 취소 링크가 있습니다. 여기에서 구독을 관리하거나 취소할 수 있습니다. 자세한 정보는 IBM 개인정보 보호정책을 참조하세요.
문장 또는 시퀀스에서 단어의 순서는 자연어에서 문장의 고유한 의미를 결정합니다. 또한 기계 학습의 경우 단어의 순서를 인코딩하면 각 단어가 어디에 있어야 하는지에 대한 '사전'이 제공됩니다. 이 정보는 유지되며, 트랜스포머 모델의 훈련 전반에 걸쳐 일반화되면서 병렬화를 구현하고, 훈련 효율성 면에서 RNN과 LSTM을 능가할 수 있습니다.
예를 다시 살펴보겠습니다.
두 문장은 동일한 토큰 세 개를 가졌지만 단어 순서에 따라 의미가 완전히 달라집니다. 셀프 어텐션과 멀티헤드 어텐션 메커니즘에 의존하는 트랜스포머는 단어 순서에 대한 고유한 표현을 가지고 있지 않으며, 인간이 명시적인 위치 정보를 제공하지 않으면 단어 각각을 순서대로 동일하게 처리합니다. 모델은 단어의 위치만을 바탕으로 산책을 시키는 게 누구이고, 산책을 당하는 게 누구인지 이해해야 합니다.
먼저 각 단어를 의미를 나타내는 벡터로 처리하여 이 목표를 달성합니다(예를 들어 'dog'는 해당 개념을 인코딩하는 고차원 배열로 인코딩). 기술적인 용어로 이야기 하자면, 각 단어 또는 하위 단어가 다양한 길이의 인풋 임베딩에 매핑됩니다. 그러나 그 자체로는 의미 벡터가 문장에서 dog가 나타나는 위치를 알려주지 않습니다. 위치 인코딩은 '첫 번째 단어' 또는 '두 번째 단어' 등과 같이 위치 인덱스를 인코딩하는 두 번째 벡터를 추가합니다. 그런 다음 두 벡터를 추가하여 단어가 무엇인지, 단어가 어디에 있는지 나타냅니다. 이 결과로 나오는 벡터를 위치 인코딩 벡터라고 부르곤 합니다.
위치 인코딩을 만드는 방법에는 여러 가지가 있습니다. 이 글에서는 Attention is all you need1에 소개된 정현파 함수를 사용하는 유명한 예를 살펴봅니다.
Vaswani 등의 저자가 발표한 2017년 논문은 정현파 함수, 특히 사인 함수와 코사인 함수를 사용하여 시퀀스의 각 위치에 대해 고정되고 결정론적인 인코딩을 생성한다는 개념을 핵심으로 내세웠습니다. .
사인 함수는 매끄러운 파장 패턴을 생성하는 기본적인 수학 개념입니다. 특히 원래의 트랜스포머 함수에서 저자들은, 위치 인코딩을 돕기 위해 코사인 함수와 사인 함수를 사용합니다.
만약 및 를 그리면 반복되는 주기적인 패턴으로 -1과 1 사이에서 오르락내리락하는 곡선을 볼 수 있습니다.
위치 인코딩에 사인을 강력하게 만드는 몇 가지 속성을 알아봅시다.
사인파와 코사인파를 그려서 시각화해 보겠습니다
import numpy as np
import matplotlib.pyplot as plt
# Create an array of 100 x values evenly spaced from 0 to 2π (approx 6.28)
x = np.linspace(0, 2 * np.pi, 100)
# Compute the sine and cosine of each x value
sin_values = np.sin(x)
# Create the plot
plt.figure(figsize=(5, 2))
plt.plot(x, sin_values, label='sin(x)', color='blue')
# Customize the plot
plt.title('Sine Function')
plt.xlabel('x')
plt.ylabel('Function value')
plt.axhline(0, color='black', linewidth=0.5) # horizontal line at y=0
plt.axvline(0, color='black', linewidth=0.5) # vertical line at x=0
#plt.grid(True, linestyle='--', alpha=0.5)
plt.legend()
plt.tight_layout()
# Show the plot
plt.show()
사인 함수
이제 코사인 함수를 플로팅하는 방법을 살펴봅시다.
#apply the cosine function to the same array, x
cosine = np.cos(x)
plt.figure(figsize = (5,2))
plt.plot(x, cosine, label = 'cos(x)', color = 'blue')
plt.title('The Cosine Function')
plt.xlabel('x')
plt.ylabel('Function value')
plt.axhline(0, color='black', linewidth=0.5) # horizontal line at y=0
plt.axvline(0, color='black', linewidth=0.5) # vertical line at x=0
#plt.grid(True, linestyle='--', alpha=0.5)
plt.legend()
plt.tight_layout()
원래 트랜스포머 논문(Vaswani 등, 2017년) 저자가 정의한 정현파 위치 인코딩 공식은 다음과 같습니다.
짝수 위치일 때:
홀수 위치일 때:
: 문장에서 단어의 위치(예: 첫 번째 단어는 0, 두 번째 단어는 1 등)
임베딩 벡터의 차원 인덱스입니다. 컬럼 인덱스에 매핑됩니다. 2i는 짝수 위치를 나타내고 2i+1은 홀수 위치를 나타냅니다.
: 토큰 임베딩의 사전 정의된 차원(예: 512)
: 사용자 정의된 스케일러 값(예: 10000)
: 위치 매핑을 얻기 위해 입력 시퀀스에서 위치 k를 매핑하는 위치 함수
이 수식을 사용하면 위치 k의 각 단어는 단어의 위치에 따라 임베딩 값을 가집니다. 'Allen walks dog'라는 예문에서는 각 단어에 대한 임베딩을 아래와 같이 계산할 수 있습니다.
- = "앨런"
- = "산책시키다"
- ="개"
다음의 값을 계산하는 간단한 Python 함수를 작성해 보겠습니다. :
import numpy as np
import matplotlib.pyplot as plt
# create the positional encoding function using the formula above
def getPositionEncoding(seq_len, d, n=10000):
# instantiate an array of 0s as a starting point
P = np.zeros((seq_len, d))
# iterate through the positions of each word
for k in range(seq_len):
#calculate the positional encoding for even and odd position of each word
for i in np.arange(int(d/2)):
denominator = np.power(n, 2*i/d)
P[k, 2*i] = np.sin(k/denominator)
P[k, 2*i+1] = np.cos(k/denominator)
return P
함수를 호출하고 예제에서 해당 값을 입력하면 시퀀스 길이가 3이고 단순화된 차원은 및
P = getPositionEncoding(seq_len=3, d=4, n=10000)
print(P)
그러면 다음과 같은 인코딩 행렬(텐서라고도 함)이 나옵니다.
[[ 0. 1. 0. 1. ]
[ 0.84147098 0.54030231 0.09983342 0.99500417]
[ 0.90929743 -0.41614684 0.19866933 0.98006658]]
이 결과를 보다 구체적으로 나타내면 아래와 같습니다.
| 단어 위치 | Dim 0 sin(pos ÷ 10000^(0 ÷ 4)) | Dim 1 cos(pos ÷ 10000^(0 ÷ 4)) | Dim 2 sin(pos ÷ 10000^(2 ÷ 4)) | Dim 3 cos(pos ÷ 10000^(2 ÷ 4)) |
|---|---|---|---|---|
| "Allen" k = 0 | 0.0000 | 0.0000 | 0.0000 | 1.0000 |
| “walks” k = 1 | 0.841471 | 0.540302 | 0.010000 | 0.999950 |
| “dog” k = 2 | 0.909297 | -0.416147 | 0.020000 | 0.999800 |
여기에서 각 단어의 구체적인 값과 해당 위치 임베딩 값을 볼 수 있습니다. 그러나 이러한 임베딩을 직접 사용하여 단어의 순서를 해석할 수는 없습니다. 여기에서 계산된 값은 트랜스포머의 입력 벡터에 위치 관련 정보를 입력하는 데 사용됩니다. 왜냐하면 및 의 인풋이 각기 다르고, 위치 각각이 다른 정현파 함수에 대응하기 때문입니다. 다른 정현파 함수의 해당 위치는 'Allen walks dog'에서 단어의 절대 위치와 상대 위치에 대한 정보를 제공합니다. 즉, 모델은 이 정보를 활용해서, 이러한 패턴을 순서, 간격 및 구조와 연관시키는 방법을 학습할 수 있습니다.
이제 위치 행렬을 시각화하는 Python 함수를 구현해 보겠습니다.
import numpy as np
import matplotlib.pyplot as plt
def get_position_encoding(seq_len, d_model, n=10000):
P = np.zeros((seq_len, d_model))
for pos in range(seq_len):
for i in range(d_model):
angle = pos / np.power(n, (2 * (i // 2)) / d_model)
P[pos, i] = np.sin(angle) if i % 2 == 0 else np.cos(angle)
return P
# Parameters
seq_len = 100 # Number of tokens
d_model = 512 # Embedding dimensions
# Generate positional encoding
P = get_position_encoding(seq_len, d_model)
# Plot
plt.figure(figsize=(10, 6))
cax = plt.matshow(P, cmap='viridis', aspect='auto')
plt.title("Sinusoidal Positional Encoding Heatmap")
plt.xlabel("Embedding Dimension")
plt.ylabel("Token Position")
plt.colorbar(cax)
plt.tight_layout()
plt.show()
x 값을 기반으로 하는 다양한 빈도에서 볼 수 있듯이, 입력 단어 k의 각 상응 위치는 다음 척도에 따라 다릅니다. — 함수의 범위. 여기에서 인코더 및 디코더 기반 트랜스포머 모델은 각 단어의 서로 다른 위치 인코딩을 학습하고 보존하여 모델이 학습을 위한 정보를 유지할 수 있도록 합니다. 인코딩된 위치 벡터는 학습을 통해 정적으로 유지되므로 병렬 계산이 가능합니다.
AI 빌더를 위한 차세대 엔터프라이즈 스튜디오인 IBM watsonx.ai로 생성형 AI, 파운데이션 모델 및 머신 러닝 기능을 학습, 검증, 조정 및 배포하세요. 적은 데이터로 짧은 시간 내에 AI 애플리케이션을 구축하세요.
업계 최고의 AI 전문성과 솔루션 포트폴리오를 보유한 IBM과 함께 AI를 비즈니스에 활용하세요.
AI 추가를 통해 중요한 워크플로와 운영을 혁신함으로써 경험, 실시간 의사 결정 및 비즈니스 가치를 극대화합니다.
1. “Attention Is All You Need”, Ashish Vaswani et al., Proceedings of the 31st International Conference on Neural Information Processing Systems, arXiv:1706.03762v7, 2023년 8월 2일 개정.
2. “Long Short-Term Memories”, Sepp Hochreiter and Jürgen Schmidhuber. 1997년. Long Short-Term Memory. Neural Comput. 9, 8 (1997년 11월 15일), 1735–1780.,
3. “Foundations of Recurrent Neural Networks (RNNs) and Long Short-Term Memories” Alex Sherstinsky et al., Elsevier “Physica D: Nonlinear Phenomena” journal, 제404호, 2020년 3월: Special Issue on Machine Learning and Dynamical Systems