Загружаем каталог…
Загружаем каталог…
토큰화와 임베딩을 따로 공부할 때는 각각의 역할만 봤는데, 이번 장에서는 둘이 LSTM과 연결된다. 리뷰 문장 하나가 들어와서 긍정 또는 부정이라는 결과로 나오는 흐름을 따라가 봤다. 이 글은 교재 코드를 읽고 정리한 리뷰다. 전체 데이터를 내려받아 학습을 실행한 실험 기록은 아니다. 전체 흐름부터 잡기 교재는 네이버 영화 리뷰의 긍정·부정 분류를 다룬다. 긍정은 1, 부정은 0이다. 중복과 결측치를 정리하고, 한글 중심으로 정제한 뒤 Mecab 토큰화와 불용어 제거를 수행한다. 이후 학습 데이터에서 단어 사전을 만들고 정수 인코딩한다. 이 장에서는 <PAD> 가 0, <UNK> 가 1이다. 앞서 본 예제와 번호가 다르므로 그대로 가정하면 안 되겠다. 리뷰는 길이 30으로 패딩하거나 자르고, Embedding → LSTM → Linear를 거쳐 두 클래스의 점수를 얻는다. 검증 손실이 가장 낮은 가중치를 저장한 뒤 테스트한다. 교재에 제시된 테스트 정확도는 84.92%다. WikiDocs 영화 리뷰 분류 챕터 이번에는 모델 이름을 외우는 것보다 각 단계에서 데이터가 어떤 모습인지 적어 보는 쪽이 더 도움이 됐다. 텐서 크기로 연결해 보기 배치 4개, 길이 7, 임베딩 크기 6, 은닉 크기 8인 작은 예를 따로 생각해 봤다. 패딩이 없는 동일 길이 입력의 구조 확인용 코드이며, 학습 성능을 측정하는 예제는 아니다. import torch import torch.nn as nn x = torch.tensor([ [2, 3, 4, 5, 6, 7, 8], [3, 4, 5, 6, 7, 8, 9], [4, 5, 6, 7, 8, 9, 2], [5, 6, 7, 8, 9, 2, 3], ], dtype=torch.long) embedding = nn.Embedding(10, 6) lstm = nn.LSTM(6, 8, batch_first=True) classifier = nn.Linear(8, 2) embedded = embedding(x) sequence_output, (h_n, c_n) = lstm(embedded) logits = classifier(h_n[0]) # 예상되는 크기 print(embedded.shape) # torch.Size([4, 7, 6]) print(sequence_output.shape) # torch.Size([4, 7, 8]) print(h_n.shape) # torch.Size([1, 4, 8]) print(logits.shape) # torch.Size([4, 2]) Embedding에서는 ID마다 벡터가 붙는다. LSTM의 sequence_output 에는 모든 시점의 은닉 상태가 있고, h_n 에는 마지막 은닉 상태가 있다. 위 코드는 단방향·1층이므로 h_n[0] 의 크기는 (4, 8) 이다. 이를 Linear에 넣으면 리뷰마다 두 점수를 얻는다. PyTorch Embedding 문서 , PyTorch LSTM 문서 여기서 “LSTM을 지나면 무조건 2차원이 된다”라고 기억하면 틀린다. 모든 시점의 출력과 마지막 상태를 구분해야 한다. 점수와 확률을 구분하기 logits 는 아직 확률로 정규화하지 않은 점수다. CrossEntropyLoss 에는 softmax를 미리 적용하지 않고 이 점수를 그대로 넣는다. 클래스 ID를 정답으로 사용하는 경우 정답은 배치 크기만큼의 정수 텐서다. labels = torch.tensor([1, 0, 1, 0], dtype=torch.long) loss = nn.CrossEntropyLoss()(logits, labels) predicted = logits.argmax(dim=1) dim=1 은 각 리뷰의 클래스 점수 두 개 중 큰 값의 위치를 찾는다는 뜻이다. (4, 2) 에서 리뷰별 예측 ID 네 개를 얻는다. 확률이 필요할 때는 별도로 softmax를 사용할 수 있지만, 손실 계산의 입력과는 구분해 둔다. PyTorch CrossEntropyLoss 문서 코드에서 더 확인하고 싶은 부분 교재는 뒤쪽에 패딩을 붙이고 최종 은닉 상태를 사용한다. 그런데 모델의 Embedding에는 padding_idx 가 없고, 예측 함수는 학습 때와 달리 동일한 정제·길이 맞춤을 하지 않는다. 이 차이는 직접 재현할 때 점검하고 싶다. 교재 코드 특히 padding_idx 를 지정하는 것과 LSTM이 패딩 시점을 건너뛰는 것은 별개다. 실제 길이를 전달하는 pack_padded_sequence 를 사용하면 가변 길이 시퀀스를 PackedSequence로 만들 수 있다. LSTM은 이런 입력도 받는다. 내 다음 실습에서는 패딩을 처리한 마지막 상태와 실제 문장 끝의 상태를 구분해 비교해 보려고 한다. PyTorch 패킹 문서 , LSTM 문서 다음 실습에서 남길 기록 이번 장을 읽고 나니 정확도 숫자 하나보다 확인할 항목이 먼저 보였다. 직접 실행할 때는 전처리 전후의 샘플, 사전에 없는 토큰의 비율, 잘리는 리뷰, 오분류 문장을 함께 기록하려고 한다. 학습이 돌아간다는 것과 내가 의도한 입력을 모델에 넣었다는 것은 별도로 확인해야겠다. 다음에는 긴 코드를 한 번에 따라 치기보다, 리뷰 하나가 토큰과 ID를 거쳐 점수로 바뀌는 과정을 먼저 출력해 보고 싶다.
То, что RADAR обнаружил и классифицировал для этой возможности. Это опубликованный источником текст, а не подтверждение, что предложение ещё действует.
[PyTorch 공부 기록] LSTM으로 영화 리뷰 분류하기, 전처리부터 예측까지. 토큰화와 임베딩을 따로 공부할 때는 각각의 역할만 봤는데, 이번 장에서는 둘이 LSTM과 연결된다. 리뷰 문장 하나가 들어와서 긍정 또는 부정이라는 결과로 나오는 흐름을 따라가 봤다. 이 글은 교재 코드를 읽고 정리한 리뷰다. 전체 데이터를 내려받아 학습을 실행한 실험 기록은 아니다. 전체 흐름부터 잡기 교재는 네이버 영화 리뷰의 긍정·부정 분류를 다룬다. 긍정은 1, 부정은 0이다. 중복과 결측치를 정리하고, 한글 중심으로 정제한 뒤 Mecab 토큰화와 불용어 제거를 수행한다. 이후 학습 데이터에서 단어 사전을 만들고 정수 인코딩한다. 이 장에서는 가 0, 가 1이다. 앞서 본 예제와 번호가 다르므로 그대로 가정하면 안…
Открыть источник