오픈소스 LLM에서 Embedding Tensor는 어느 Layer의 Output 인가요?

아래 모델에서 Open AI의 Embedding API처럼 임베딩 텐서를 출력하려면 어느 Layer의 Output Tensor를 사용하면 될까요?

  • layers의 28번째 Output tensor
  • final_layer_norm 의 Output tensor
  • embed_out의 Output Tensor
GPTNeoXForCausalLM(
  (gpt_neox): GPTNeoXModel(
    (embed_in): Embedding(30080, 4096)
    (layers): ModuleList(
      (0-27): 28 x GPTNeoXLayer(
        (input_layernorm): LayerNorm((4096,), eps=1e-05, elementwise_affine=True)
        (post_attention_layernorm): LayerNorm((4096,), eps=1e-05, elementwise_affine=True)
        (attention): GPTNeoXAttention(
          (rotary_emb): RotaryEmbedding()
          (query_key_value): Linear(in_features=4096, out_features=12288, bias=True)
          (dense): Linear(in_features=4096, out_features=4096, bias=True)
        )
        (mlp): GPTNeoXMLP(
          (dense_h_to_4h): Linear(in_features=4096, out_features=16384, bias=True)
          (dense_4h_to_h): Linear(in_features=16384, out_features=4096, bias=True)
          (act): GELUActivation()
        )
      )
    )
    (final_layer_norm): LayerNorm((4096,), eps=1e-05, elementwise_affine=True)
  )
  (embed_out): Linear(in_features=4096, out_features=30080, bias=False)
)
  • 아래 답변은 OpenAI의 GPT-3.5(ChatGPT) 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

Embedding Tensor는 embed_out의 Output Tensor입니다.

GPTNeoXForCausalLM 모델은 입력으로 embed_in을 받아서, layers에 있는 28개의 GPTNeoXLayer를 거쳐서 final_layer_norm을 거친 후, embed_out으로 출력됩니다. 따라서 임베딩 텐서를 출력하려면 embed_out의 Output Tensor를 사용하면 됩니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

GPTNeoXForCausalLM 모델에서 임베딩 텐서를 얻으려면 embed_in 레이어의 출력 텐서를 사용해야 합니다. 이 레이어는 입력 토큰을 임베딩 벡터로 변환하는 역할을 합니다.

(embed_in): Embedding(30080, 4096)

위 코드에서 Embedding 레이어는 입력 토큰의 수(30080)와 임베딩 차원(4096)을 인수로 받습니다. 이 레이어의 출력 텐서는 임베딩 벡터로 변환된 입력 토큰입니다.

따라서, 아래와 같이 모델의 embed_in 레이어를 사용하여 입력 토큰에 대한 임베딩 텐서를 얻을 수 있습니다.

input_tokens = torch.tensor([...])  # 입력 토큰
embedding_tensor = model.gpt_neox.embed_in(input_tokens)

이 경우, embedding_tensor는 임베딩 텐서가 됩니다. 다른 레이어의 출력 텐서는 임베딩 텐서가 아니며, 모델의 다른 부분에서 계산되는 중간 결과물입니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!

RLHF 학습을 할때 GPT3의 마지막 FF층을 교체하는 방식을 사용했다는 것을 보면,
제 생각에는 final_layer_norm 의 출력을 사용하는게 좋을 것 같습니다.

1개의 좋아요