성씨 국적 분류 데이터셋 다운로드
이번 장에서는 RNN을 이용한 성씨 국적 분류 예제를 진행하며 RNN의 기본 성질과 앞서 공부한 엘만 RNN 모델을 활용하는 방법을 배워보겠습니다.
파이토치의 미니배치 파이프라인
파이토치에서는 NLP 처리를 위해 주어진 텍스트를 일련의 과정을 거쳐 미니배치(mini-batch)형태로 변환하여 모델에 입력으로 전달합니다. 이 과정에는 텍스트의 토큰화, 벡터화, 미니배치로 모으는 과정을 모두 포함합니다. 즉, 미니배치 파이프라인이란 모델에게 사용자 정의 데이터셋을 입력하기 위한 전처리 과정이라고 볼 수 있습니다. 사용자 정의 데이터셋에 파이프라인을 적용하는 과정은 다음과 같습니다.
1.
Dataset
새로운 데이터셋 정의 및 생성
2.
Vocabulary
데이터셋의 토큰을 정수로 매핑하기
3.
Vectorizer
Vocabulary를 참고해 데이터셋의 토큰을 정수로 변환하여 벡터화하기
4.
DataLoader
Vectorizer가 변환한 벡터 데이터를 모아 미니배치로 만들기
각각의 모듈에 대한 설명과 코드를 순서대로 아래에 작성해두었습니다. 소스코드의 경우, 토글버튼을 누르면 확인할 수 있습니다.
1. Dataset
파이토치에서는 새로운 데이터셋을 사용하기 위해 Dataset 클래스를 상속하고 __init()__, __getitem__(), __len__() 3개의 메서드를 구현해야 합니다. 새로운 데이터셋인 SurnameDataset 클래스의 필요한 값들을 __init__() 함수를 통해 선언하고, 필요한 매서드를 구현해봅시다.
데이터셋 소스코드
2. Vocabulary
Vocabulary는 데이터셋의 각 문자 토큰들이 고유한 정수값에 매핑되도록 하는 작업입니다. 딕셔너리 자료형을 이용해 Vocabulary를 관리하는데, 하나의 딕셔너리는 문자를 정수 인덱스에 매핑하고 나머지 딕셔너리는 정수 인덱스를 문자에 매핑합니다.
본 예제에서는 Vocabulary를 상속하는 SequenceVocabulary를 만듭니다. 학습 과정에서 한 번도 본 적 없는 단어가 테스트 과정에서 입력된 경우에는 Vocabulary에서 대응되는 정수값을 찾을 수 없습니다. 이러한 경우에 대해서도 커버하기 위해 SequenceVocabulary에서는 UNK(unknown)과 같은 다양한 특수 토큰을 활용합니다.
•
unk_token : 학습 과정에서 보지 못해 어휘 사전에 없는 단어가 입력으로 들어온 경우 UNK 토큰으로 처리
•
mask_token : 가변 길이의 입력을 처리할 때 MASK 토큰을 사용
•
begin_seq_token : 문장 시작에 BEGIN 토큰을 붙여 모델이 문장 경계를 인식하도록 함
•
end_seq_token : 문장 시작에 END 토큰을 붙여 모델이 문장 경계를 인식하도록 함
Vocabulary 소스코드
3. Vectorizer
Vectorizer는 앞서 정의한 SequenceVocabulary 객체를 활용합니다. Vectorizer는 Vocabulary에서 단어에 대한 정수 인덱스를 받아와 벡터화를 진행합니다. 벡터화는 문장 단위(또는 한 번에 처리할 시퀀스 길이 단위)로 진행됩니다. 벡터화의 결과로 나온 벡터의 길이는 항상 같아야하므로, 빈 자리에 0을 채워넣는 패딩 등의 방법을 사용합니다. 아래에서 벡터화 과정의 예시를 보겠습니다.
[예시]
원문 : I Love Deep Daiv
-> 정수 매핑 : 1 5 7 6
-> 토큰 부여 : 8 1 5 7 6 9 (BEGIN, END 토큰을 8, 9 라고 하자)
-> 벡터 패딩 : 8 1 5 7 6 9 0 0 (한 번에 처리하는 길이가 8일 때, 남은 자리 0으로 채우기)
Python
복사
Vectorizer에서 Vocabulary 객체를 생성하기 때문에, Vocabulary가 가질 수 있는 단어의 개수를 제한하거나 특정한 임계값을 지정해 한 두번 등장하는 단어를 Vocabulary에 등록하지 않는 등의 방법으로 단어 노이즈를 제거하고 메모리를 절약하는 역할도 수행합니다.
Vectorizer 소스코드
4. DataLoader
DataLoader는 Vectorizer에서 벡터로 변환한 데이터 포인트들을 미니배치로 모아 작업을 편리하게 해줍니다. DataLoader가 생성한 미니배치를 통해 분류, 분석 모델들이 학습과 테스트를 처리합니다.
미니배치란 학습과 테스트에 데이터 전체를 활용하지 않고 일부만을 활용해 더 빠르게 모델의 가중치를 최적화시키기 위해 데이터를 더 작은 단위로 쪼갠 것을 말합니다. 아래 링크에서 미니배치에 대해 읽어보세요.
DataLoader 소스코드
이전 글 읽기
Dictionary 자료형
key와 value가 1대1로 순서 없이 매핑되는 형태의 자료형
”banana”라는 문자열을 value로 하고, 숫자 ‘5’를 key로 하여 딕셔너리에 저장할 경우, key 값인 5를 통해 “banana” value를 받아올 수 있다.
[예시]
dict = {5 : “banana”}
dict[5]
>>> banana