모든 챌린지
보통 0명 해결 정답률 0%

사인파 위치 인코딩

트랜스포머가 토큰 임베딩에 더하는 사인과 코사인 위치 벡터를 계산합니다.

배우게 될 내용

  • 사인과 코사인 위치 벡터 계산하기
  • 차원마다 다른 주파수 사용하기
  • 트랜스포머가 단어 순서를 아는 방식 이해하기

문제

원문 보기 (영어)

어텐션은 단어 순서를 무시하므로, 원래의 트랜스포머는 각 토큰 임베딩에 위치 인코딩을 더합니다. 크기가 d_model인 모델에서 위치 pos와 차원 j(둘 다 0부터)에 대해:

  • 'j가 짝수: PE[pos][j] = sin(pos / 10000^(j / d_model))'
  • 'j가 홀수: PE[pos][j] = cos(pos / 10000^((j - 1) / d_model))'

즉 차원 0과 1은 같은 주파수를, 차원 2와 3은 다음 주파수를 쓰는 식입니다.

positional_encoding(length, d_model)를 구현하세요.

입력

length: 위치의 수 (0부터 length - 1까지).

d_model: 임베딩 크기.

출력

length × d_model 행렬을 반환하세요.

제약 조건

1 ≤ length ≤ 200, 1 ≤ d_model ≤ 128

예시

예시 1
입력:
length = 2
d_model = 4

예상 출력:
expected = [
    [0.0, 1.0, 0.0, 1.0],
    [0.841471, 0.540302, 0.01, 0.99995]
]
입력:
long long length = 2;
long long d_model = 4;

예상 출력:
std::vector<std::vector<double>> expected = {
    {0.0, 1.0, 0.0, 1.0},
    {0.841471, 0.540302, 0.01, 0.99995}
};
입력:
long length = 2;
long d_model = 4;

예상 출력:
double[][] expected = new double[][] {
    new double[] {0.0, 1.0, 0.0, 1.0},
    new double[] {0.841471, 0.540302, 0.01, 0.99995}
};

설명

위치 0은 모든 쌍이 sin(0) = 0, cos(0) = 1이므로 [0, 1, 0, 1]입니다. 위치 1은 주파수 1과 1 / 10000^(2/4) = 0.01을 씁니다: [sin 1, cos 1, sin 0.01, cos 0.01] ≈ [0.841471, 0.540302, 0.01, 0.99995].

예시 2
입력:
length = 3
d_model = 1

예상 출력:
expected = [
    [0.0],
    [0.841471],
    [0.909297]
]
입력:
long long length = 3;
long long d_model = 1;

예상 출력:
std::vector<std::vector<double>> expected = {
    {0.0},
    {0.841471},
    {0.909297}
};
입력:
long length = 3;
long d_model = 1;

예상 출력:
double[][] expected = new double[][] {
    new double[] {0.0},
    new double[] {0.841471},
    new double[] {0.909297}
};

설명

차원이 하나뿐이므로 sin(pos)만 사용합니다: [[0], [0.841471], [0.909297]].

참고 자료

이 문제는 CodeUtility에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.

다른 사람의 풀이 보기

커뮤니티 솔루션

아직 공개된 풀이가 없습니다. 문제를 풀고 첫 풀이를 공유하세요.