Загружаем каталог…
Загружаем каталог…
지난번에는 문장을 토큰으로 나누는 방법을 봤다. 이번에는 나눈 토큰을 모델에서 사용할 벡터로 바꾸는 단계다. 이름만 보면 복잡한 계산이 숨어 있을 것 같았는데, 먼저 테이블의 행을 꺼내는 과정으로 보니 이해하기 쉬웠다. 정수 번호와 임베딩 벡터는 다르다 이번 챕터는 사전 훈련된 벡터를 가져오는 대신, 임베딩 층을 만들고 학습하는 방법을 다룬다. 각 단어에 정수 ID를 부여하고, 그 ID에 해당하는 행을 임베딩 테이블에서 찾는다. ID 자체가 단어의 의미를 나타내는 벡터는 아니다. 벡터를 찾기 위한 번호라고 생각하면 된다. nn.Embedding 의 입력을 원-핫 벡터로 만들 필요도 없다. 정수 인덱스를 그대로 넣으면 해당 행의 밀집 벡터를 반환한다. 테이블의 값은 모델이 풀려는 작업의 학습 과정에서 갱신된다. WikiDocs nn.Embedding 챕터 두 숫자가 각각 무엇을 정하는가 embedding = nn.Embedding(num_embeddings=5, embedding_dim=3) 이 설정은 행이 5개이고, 각 행에 숫자가 3개 있는 테이블을 만든다. num_embeddings 는 등록할 항목 수, embedding_dim 은 벡터 하나의 크기다. 생성 직후의 일반 행은 무작위로 초기화된다. 따라서 층을 만들었다고 곧바로 의미 있는 단어 관계가 완성되는 건 아니다. PyTorch Embedding 공식 문서 작은 단어 사전으로 따라가 보기 동작과 크기를 확인하기 위한 예제를 따로 만들었다. 아래 주석의 shape는 구조상 예상되는 값이며, 학습 실험을 실행한 결과는 아니다. import torch import torch.nn as nn vocab = {"<unk>": 0, "<pad>": 1, "오늘": 2, "책": 3, "읽기": 4} embedding = nn.Embedding( num_embeddings=len(vocab), embedding_dim=3, padding_idx=vocab["<pad>"] ) tokens = ["오늘", "책", "커피"] ids = [vocab.get(token, vocab["<unk>"]) for token in tokens] x = torch.tensor(ids, dtype=torch.long) y = embedding(x) print(x) # tensor([2, 3, 0]) print(embedding.weight.shape) # torch.Size([5, 3]) print(y.shape) # torch.Size([3, 3]) 커피 는 사전에 없어서 직접 작성한 vocab.get() 처리에 의해 <unk> 의 ID가 된다. nn.Embedding 이 모르는 문자열을 알아서 바꾸는 것은 아니다. 이 층에 들어가기 전에 정수 인코딩을 끝내야 한다. WikiDocs nn.Embedding 챕터 입력의 각 자리에 벡터가 붙는다 입력이 (3,) 이면 출력은 (3, 3) 이다. 인덱스 세 개 각각에 길이 3짜리 벡터가 붙는다. 배치로 넣어도 같은 규칙이다. batch = torch.tensor([[2, 3, 1], [4, 2, 1]], dtype=torch.long) output = embedding(batch) print(output.shape) # torch.Size([2, 3, 3]) 입력 (2, 3) 뒤에 임베딩 차원 3 이 붙었다. 행렬을 다른 모양으로 펴는 view() 가 아니라, 각 ID에 대응하는 벡터를 가져오는 연산이다. padding_idx=1 로 지정한 행은 새 층에서 기본적으로 0 벡터이며, Embedding의 역전파에서는 그 행의 기울기가 발생하지 않는다. <unk> 와 달리 패딩용으로 따로 지정한 행이라는 점을 구분해 둔다. PyTorch Embedding 공식 문서 이번 장에서 기억할 것 내가 다시 코드를 읽을 때는 단어 사전, ID 목록, 테이블 크기, 출력 크기 순서로 확인하려고 한다. 이 네 가지를 따라가면 지금 어느 행을 꺼내고 있는지 놓치지 않을 것 같다. 특히 테이블의 전체 크기와 한 번 조회한 결과의 크기를 섞지 않기. 위 예제에서 테이블은 (5, 3) 이지만 단어 세 개를 넣은 결과는 (3, 3) 이다. 이제 임베딩 코드를 보면 숫자 값부터 보기보다, 어떤 ID가 어떤 행으로 연결됐는지 먼저 살펴봐야겠다.
То, что RADAR обнаружил и классифицировал для этой возможности. Это опубликованный источником текст, а не подтверждение, что предложение ещё действует.
[PyTorch 공부 기록] nn.Embedding, 단어 번호로 벡터를 꺼내는 테이블. 지난번에는 문장을 토큰으로 나누는 방법을 봤다. 이번에는 나눈 토큰을 모델에서 사용할 벡터로 바꾸는 단계다. 이름만 보면 복잡한 계산이 숨어 있을 것 같았는데, 먼저 테이블의 행을 꺼내는 과정으로 보니 이해하기 쉬웠다. 정수 번호와 임베딩 벡터는 다르다 이번 챕터는 사전 훈련된 벡터를 가져오는 대신, 임베딩 층을 만들고 학습하는 방법을 다룬다. 각 단어에 정수 ID를 부여하고, 그 ID에 해당하는 행을 임베딩 테이블에서 찾는다. ID 자체가 단어의 의미를 나타내는 벡터는 아니다. 벡터를 찾기 위한 번호라고 생각하면 된다. nn.Embedding 의 입력을 원-핫 벡터로 만들 필요도 없다. 정수 인덱스를 그대로 넣으면…
Открыть источник