최근 뉴질랜드 출신의 Brendan Bycroft라는 남성이 기술계에 열풍을 일으켰습니다. 그가 만든 대형 모델 3D 시각화라는 프로젝트는 Hacker News 목록의 1위를 차지했을 뿐만 아니라 그 충격적인 효과는 더욱 놀랍습니다. 이 프로젝트를 통해 귀하는 단 몇 초 만에 LLM(Large Language Model)이 어떻게 작동하는지 완전히 이해하게 될 것입니다.
당신이 기술에 열광하든 아니든, 이 프로젝트는 당신에게 전례 없는 시각적 향연과 인지적 깨달음을 가져다 줄 것입니다. 이 놀라운 창조물을 함께 탐험해 봅시다!
이 프로젝트에서 Bycroft는 OpenAI 과학자 Andrej Karpathy가 개발한 Nano-GPT라는 경량 GPT 모델을 자세히 분석했습니다. GPT 모델의 축소 버전인 이 모델에는 85,000개의 매개변수만 있습니다. 물론 이 모델은 OpenAI의 GPT-3나 GPT-4에 비해 훨씬 작지만, "참새는 작지만 내장을 다 갖고 있다"고 할 수 있다.
Nano-GPT GitHub: https://github.com/karpathy/nanoGPT
Transformer 모델의 각 레이어 시연을 용이하게 하기 위해 Bycroft는 Nano-GPT 모델에 대한 매우 간단한 대상 작업인 모델을 준비했습니다. 입력은 6글자 "CBABBC"이고 출력은 알파벳 순서로 배열된 시퀀스입니다(예: 출력 "ABBBCC").
각 문자를 토큰이라고 부르며 이러한 서로 다른 문자가 어휘 어휘를 구성합니다.
이를 위해 테이블의 경우 각 문자에 아래 첨자 토큰 인덱스가 할당됩니다. 다음 첨자로 구성된 시퀀스는 모델의 입력으로 사용될 수 있습니다. 2 1 0 1 1 2
3D 시각화에서 각 녹색 셀은 계산된 숫자를 나타내고 각 파란색 셀은 모델의 가중치를 나타냅니다. .
순차 처리에서는 각 숫자가 먼저 C차원 벡터로 변환됩니다. 이 프로세스를 임베딩이라고 합니다. Nano-GPT에서 이 임베딩의 차원은 일반적으로 48차원입니다. 이러한 임베딩 작업을 통해 각 숫자는 C차원 공간에서 벡터로 표시되므로 후속 처리 및 분석이 더 잘 가능합니다.
임베딩은 일반적으로 Transformer라고 불리는 일련의 중간 모델 레이어를 통해 계산되어 최종적으로 하위 레이어에 도달합니다.
"그럼 출력은 무엇인가요?"
모델의 출력은 시퀀스의 다음 토큰입니다. 그래서 결국 우리는 다음 토큰이 A B C일 확률 값을 얻습니다.
이 예에서 6번째 위치 모델은 높은 확률로 A를 출력합니다. 이제 A를 모델에 대한 입력으로 전달하고 전체 프로세스를 반복할 수 있습니다.
GPT-2 및 GPT-3 시각화도 표시됩니다.
이 시각화는 주로 훈련이 아닌 모델 추론(추론)에 중점을 두므로 전체 기계 학습 프로세스의 작은 부분일 뿐이라는 점에 유의해야 합니다. 또한 여기서는 모델의 가중치가 사전 학습된 다음 모델 추론을 사용하여 출력을 생성한다고 가정합니다.
앞서 언급했듯이 간단한 조회 테이블을 사용하여 토큰을 일련의 정수에 매핑하는 방법입니다.
토큰 인덱스인 이러한 정수는 모델에서 정수를 볼 수 있는 최초이자 유일한 시간입니다. 이후에는 부동소수점(십진수)을 사용하여 연산을 수행하게 됩니다.
여기서 4번째 토큰(인덱스 3)을 예로 들어 입력 임베딩의 4번째 열 벡터를 생성하는 데 어떻게 사용되는지 확인하세요.
먼저 토큰 인덱스(여기서는 B=1을 예로 사용)를 사용하여 토큰 임베딩 행렬에서 두 번째 열을 선택하고 토큰 임베딩이라고 하는 크기 C=48(48차원)의 열 벡터를 얻습니다. .
그런 다음 위치 임베딩 행렬에서 네 번째 열을 선택합니다("여기에서는 주로 네 번째 위치의 (t = 3) 토큰 B를 보기 때문에"). 마찬가지로 C=48(48)의 크기를 얻습니다. 차원) 위치 임베딩이라고 하는 열 벡터입니다.
위치 임베딩과 토큰 임베딩은 모두 모델 학습(파란색으로 표시)을 통해 획득된다는 점에 유의해야 합니다. 이제 이 두 벡터가 있으므로 이를 추가하면 C=48 크기의 새로운 열 벡터를 얻을 수 있습니다.
다음으로, 동일한 프로세스에서 시퀀스의 모든 토큰을 처리하여 토큰 값과 해당 위치를 포함하는 벡터 세트를 만듭니다.
위 그림에서 볼 수 있듯이 입력 시퀀스의 모든 토큰에 대해 이 프로세스를 실행하면 TxC 크기의 행렬이 생성됩니다. 그 중 T는 시퀀스 길이를 나타낸다. C는 채널을 의미하지만 특징(feature), 차원(dimension), 임베딩 크기(embedding size)라고도 하며 이 경우 48입니다. 이 길이 C는 모델 크기와 성능 간의 균형을 제공하기 위해 설계자가 선택한 모델의 여러 "초매개변수" 중 하나입니다.
TxC 차원의 이 행렬은 입력 임베딩이며 모델을 통해 전달됩니다.
작은 팁: 입력 임베딩의 단일 셀 위로 마우스를 가져가면 계산과 소스를 볼 수 있습니다.
이전에 얻은 입력 임베딩 행렬은 Transformer 계층의 입력입니다.
Transformer 레이어의 첫 번째 단계는 입력 임베딩 행렬에 대해 레이어 정규화를 수행하는 것입니다. 이는 입력 행렬의 각 열 값을 정규화하는 작업입니다.
정규화는 심층 신경망 훈련에서 중요한 단계로, 훈련 과정에서 모델의 안정성을 향상시키는 데 도움이 됩니다.
행렬의 열을 별도로 볼 수 있습니다. 아래에서는 네 번째 열을 예로 들어 보겠습니다.
정규화의 목표는 각 열의 값이 평균 0, 표준편차 1이 되도록 만드는 것입니다. 이를 달성하려면 각 열의 평균과 표준편차를 계산한 다음 해당 평균을 빼고 각 열의 해당 표준편차로 나눕니다.
여기서 E[x]는 평균을 나타내는 데 사용되고 Var[x]는 분산(표준편차의 제곱)을 나타내는 데 사용됩니다. 엡실론(ε = 1×10^-5)은 0으로 나누는 오류를 방지하기 위한 것입니다.
정규화된 결과를 계산하여 저장한 후 학습 가중치 가중치(γ)를 곱하고 편향 편향(β)을 더해 최종 정규화된 결과를 얻습니다.
마지막으로 입력 임베딩 행렬의 각 열에 대해 정규화 작업을 수행하여 정규화된 입력 임베딩을 얻고 이를 self-attention 계층(self-attention)으로 전달합니다.
Self Attention 레이어는 아마도 Transformer의 핵심 부분일 것입니다. 이 단계에서는 입력 임베딩의 열이 서로 "통신"할 수 있지만 다른 단계에서는 각 열이 독립적으로 존재합니다.
Self Attention 레이어는 여러 개의 셀프 어텐션 헤드로 구성됩니다. 이 예에는 세 개의 셀프 어텐션 헤드가 있습니다. 각 헤더의 입력은 입력 임베딩의 1/3이며 지금은 그중 하나만 집중합니다.
첫 번째 단계는 정규화된 입력 임베딩 행렬의 C열에서 각 열에 대해 QKV인 3개의 벡터를 생성하는 것입니다.
이러한 벡터를 생성하려면 행렬-벡터 곱셈과 편향이 사용됩니다. 각 출력 단위는 입력 벡터의 선형 조합입니다.
예를 들어 쿼리 벡터의 경우 Q 가중치 행렬의 행과 입력 행렬의 열 간의 내적 연산을 통해 완성됩니다.
내적의 연산은 매우 간단합니다. 해당 요소를 곱하고 추가하기만 하면 됩니다.
이는 각 출력 요소가 입력 벡터의 모든 요소에 의해 영향을 받도록 하는 일반적이고 간단한 방법입니다(이 영향은 가중치에 의해 결정됩니다). 따라서 신경망에 자주 나타납니다.
신경망에서 이 메커니즘은 모델이 데이터를 처리할 때 입력 시퀀스의 모든 부분을 고려할 수 있기 때문에 자주 발생합니다. 이 포괄적인 주의 메커니즘은 특히 텍스트나 시계열과 같은 순차 데이터를 처리할 때 많은 현대 신경망 아키텍처의 핵심입니다.
Q, K, V 벡터의 각 출력 단위에 대해 이것을 반복합니다.
Q(쿼리), K(키) 및 V(값) 벡터를 어떻게 사용합니까? 이름 지정에서 힌트를 얻을 수 있습니다. '키'와 '값'은 키가 값에 매핑되는 사전 유형을 연상시킵니다. 그런 다음 '쿼리'는 값을 찾는 데 사용하는 것입니다.
Self Attention의 경우 단일 벡터(용어)를 반환하는 대신 가중치가 부여된 벡터(용어) 조합을 반환합니다. 이 가중치를 찾기 위해 Q 벡터와 각 K 벡터 사이의 내적을 계산하고 이를 가중치로 정규화한 다음 마지막으로 해당 V 벡터를 곱하고 더합니다.
6번째 열을 예로 들면(t=5) 쿼리는 다음 열에서 시작됩니다.
주의 매트릭스가 있기 때문에 KV의 처음 6개 열을 쿼리할 수 있으며, Q 값은 현재 시간입니다.
먼저 현재 열(t=5)의 Q 벡터와 이전 열(처음 6개 열)의 K 벡터 간의 내적을 계산합니다. 그런 다음 이는 주의 매트릭스의 해당 행(t=5)에 저장됩니다.
내적의 크기는 두 벡터 간의 유사성을 측정합니다. 내적의 크기가 클수록 더 유사한 것입니다.
그리고 Q 벡터만 과거 K 벡터와 연산을 하여 인과적인 self-attention을 하게 됩니다. 즉, 토큰은 '미래 정보를 볼 수' 없습니다.
따라서 내적을 찾은 후 sqrt(A)로 나눕니다. 여기서 A는 QKV 벡터의 길이입니다. 이 스케일링은 큰 값이 다음 정규화 단계(소프트맥스)를 지배하는 것을 방지하기 위해 수행됩니다.
다음으로 소프트맥스 연산을 수행하여 값 범위를 0에서 1로 줄입니다.
마지막으로 이 열의 출력 벡터(t=5)를 얻을 수 있습니다. 정규화된 주의 행렬의 (t=5) 행을 보고 각 요소를 다른 열의 해당 V 벡터와 곱합니다.
그런 다음 이러한 벡터를 함께 추가하여 출력 벡터를 얻을 수 있습니다. 따라서 출력 벡터는 고해상도의 V 벡터에 의해 지배됩니다.
이제 모든 열에 적용해보겠습니다.
Self Attention 레이어의 헤더 처리 과정입니다. "따라서 Self Attention의 주요 목표는 각 열이 다른 열에서 관련 정보를 찾고 해당 값을 추출하기를 원하며 쿼리 벡터를 다른 열의 키와 비교하여 이를 수행하는 것입니다. 추가된 제한은 "
Self Attention 작업이 끝나면 각 헤드에서 출력을 받게 됩니다. 이러한 출력은 Q 및 K 벡터의 영향을 받아 적절하게 혼합된 V 벡터입니다. 각 헤드의 출력 벡터를 병합하려면 간단히 서로 쌓으면 됩니다. 따라서 t=4에서 길이 A=16인 3개의 벡터를 중첩하여 길이 C=48인 1개의 벡터를 형성합니다.
GPT에서 헤드 내의 벡터 길이(A=16)는 C/num_heads와 동일하다는 점에 주목할 가치가 있습니다. 이렇게 하면 다시 쌓을 때 원래 길이 C를 얻을 수 있습니다.
이를 바탕으로 투영을 수행하고 이 레이어의 출력을 얻습니다. 이는 열당 간단한 행렬-벡터 곱셈에 편향을 더한 것입니다.
이제 Self Attention의 출력이 생겼습니다.
이 출력을 다음 단계로 직접 전달하는 대신 입력 임베딩에 요소로 추가합니다. 녹색 수직 화살표로 표시되는 이 프로세스를 잔여 연결 또는 잔여 경로라고 합니다.
계층 정규화와 마찬가지로 잔여 네트워크는 심층 신경망의 효과적인 학습을 달성하는 데 중요합니다.
이제 self-attention의 결과를 얻었으므로 이를 Transformer의 다음 계층인 피드포워드 네트워크로 전달할 수 있습니다.
Self Attention 이후 Transformer 모듈의 다음 부분은 MLP(Multilayer Perceptron)입니다. 여기서는 두 개의 레이어로 구성된 간단한 신경망입니다.
Self Attention과 마찬가지로 벡터가 MLP에 들어가기 전에 레이어 정규화를 수행해야 합니다.
동시에 MLP에서는 길이 C=48인 각 열 벡터에 대해 다음 처리를 (독립적으로) 수행해야 합니다.
벡터 중 하나를 추적해 보겠습니다.
MLP는 다음과 같이 처리됩니다.
먼저 행렬-벡터 곱셈을 수행하고 오프셋을 추가하여 벡터를 길이 4*C의 행렬로 확장합니다. (여기서 출력 행렬은 시각화를 위해 전치되었습니다.)
다음으로 벡터의 각 요소에 GELU 활성화 함수를 적용합니다. 이는 모든 신경망의 핵심 부분이므로 모델에 비선형성을 도입해야 합니다. 사용된 특정 함수인 GELU는 ReLU 함수 max(0, x)와 매우 비슷해 보이지만 날카로운 모서리 대신 부드러운 곡선을 가지고 있습니다.
그런 다음 또 다른 편향된 행렬-벡터 곱셈을 통해 벡터를 길이 C로 다시 투영합니다.
여기에도 잔여 네트워크가 있습니다. 셀프 어텐션 + 프로젝션 부분과 마찬가지로 MLP 결과를 요소 순서대로 입력에 추가합니다.
이 작업을 반복하세요.
이것이 MLP 레이어의 끝이고, 마침내 변환기의 출력을 얻습니다.
완전한 Transformer 모듈입니다!
이 여러 모듈은 모든 GPT 모델의 본체를 형성하며 각 모듈의 출력은 다음 모듈의 입력이 됩니다.
딥 러닝에서 흔히 볼 수 있듯이 각 레이어가 수행하는 작업을 정확히 말하기는 어렵지만 몇 가지 일반적인 아이디어가 있습니다. -수준 추상화 및 관계. 자연어 처리의 맥락에서 하위 계층은 문법, 구문 및 간단한 어휘 연관을 학습할 수 있는 반면, 상위 계층은 보다 복잡한 의미 관계, 담화 구조 및 상황에 따른 의미를 캡처할 수 있습니다.
마지막 단계는 각 토큰의 예측 확률을 출력하는 소프트맥스 연산입니다.
드디어 모델의 끝에 도달했습니다. 마지막 Transformer의 출력은 정규화 계층을 거친 다음 편향되지 않은 선형 변환을 거칩니다.
이 최종 변환은 각 열 벡터를 길이 C에서 어휘 크기 길이 nvocab으로 변환합니다. 따라서 실제로 어휘의 각 단어에 대한 점수 로짓을 생성합니다.
이 점수를 보다 직관적인 확률 값으로 변환하려면 먼저 소프트맥스를 통해 처리해야 합니다. 따라서 각 열에 대해 모델이 어휘의 각 단어에 할당된 확률을 얻습니다.
이 특정 모델에서는 실제로 세 글자를 주문하는 방법에 대한 모든 답을 학습했기 때문에 확률은 정답 쪽으로 크게 기울어져 있습니다.
시간이 지남에 따라 모델이 발전하도록 하면 마지막 열의 확률을 사용하여 시퀀스에서 다음에 추가되는 토큰을 결정해야 합니다. 예를 들어 모델에 6개의 토큰을 입력하는 경우 6열의 출력 확률을 사용합니다.
이 열의 출력은 일련의 확률 값이며 실제로 그 중 하나를 시퀀스의 다음 토큰으로 선택해야 합니다. 우리는 "분포에서 샘플링", 즉 확률에 따라 토큰을 무작위로 선택하여 이를 달성합니다. 예를 들어, 확률이 0.9인 토큰은 선택될 확률이 90%입니다. 그러나 항상 확률이 가장 높은 토큰을 선택하는 것과 같은 다른 옵션도 있습니다.
온도 매개변수를 사용하여 분포의 "부드러움"을 제어할 수도 있습니다. 온도가 높을수록 분포가 더욱 균일해지고, 온도가 낮을수록 확률이 가장 높은 토큰에 집중됩니다.
소프트맥스의 지수화는 더 큰 값에 상당한 증폭 효과를 가지며, 모든 값을 더 가깝게 하면 이 효과가 줄어들기 때문에 소프트맥스를 적용하기 전에 온도 매개변수를 사용하여 로지트(선형 변환의 출력)를 조정합니다.
사진
위 내용은 정보의 장벽을 돌파하라! 충격적인 대규모 3D 시각화 도구 출시!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!