문제
어텐션은 단어 순서를 무시하므로, 원래의 트랜스포머는 각 토큰 임베딩에 위치 인코딩을 더합니다. 크기가 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에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.