2018년 10월 7일 일요일

Deep Learning with Sequence Data and text (순차적 데이터와 텍스트의 딥러닝 PyTorch) (8)



Using pretrained word embeddings (미리 훈련된 word embeddings 사용)

미리 훈련된 word embeddings는 의학이나 제조와 같은 특정 분야에서 작업할때 유용할 것입니다.  embeddings를 훈련 할 수 없는 작은 데이터를 가지고 있을때 위키피디아, 구글 뉴스, 트위터의 트윗과 같은 자료를 훈련된 embeddings을 사용 할 수 있습니다. 많은 팀들은 오픈 소스 다른 접근을 가지고 훈련된 word embeddings를 가지고 있습니다. 이번 장에서는 어떻게 torchtext가 그것을 쉽게 사용하는지 와 우리의 pytorch모델에서 그것을 어떻게 사용하는지 확인해볼 것입니다. 이것은 컴퓨터 비전 어플리케이션에서 사용한 transfer learing과 유사합니다. ( 해당 부분을 공부하지 않았기 때문에 어떤 의미인지는 잘 모르겠습니다. ) 전형적으로 미리 훈련된 word embeddings을 사용하는것은 다음 절차를 포함 합니다.
- embeddings 다운로드
- 모델에서 embeddings 로드하기
- embdding layer 가중치(weights) 얼리기
어떻게 각각의 과정을 구현하는지 자세히 알아 보겠습니다.

embeddings 다운로드

torchtext 라이브러리 embeddings를 다운로드하고 올바른 단어를 매핑하는 것과 연관된 많은 복잡성을 추상화 합니다.  torchtext는 vocab모듈에서 Glove, FastText, CharNGram
3개의 클래스를 제공합니다. embeddings를 다운로드 하고 우리 사전에 그것들을 매핑하는 과정이 쉽습니다. 이 클래스들을 각각 다른 데이터들에 다른 기술을 사용해 훈련된 다른 embeddings를 제공해줍니다. 다른 embeddings을 제공되는 것을 보면 아래와 같습니다.

- charngram.100d
- fasttext.en.300d
- fasttext.simple.300d
- glove.42B.300d
- glove.840B.300d
- glove.twitter.27B.25d
- glove.twitter.27B.50d
- glove.twitter.27B.100d
- glove.twitter.27B.200d
- glove.6B.50d
- glove.6B.100d
- glove.6B.200d
- glove.6B.300d

Field 객체의 build_vocab 메소드는 embeddings를 위해서 인자를 가져갑니다. 다음 코드가 어떻게 embeddings를 다운로드 하는지 설명합니다.

from torchtext.vocab import GloVe

TEXT.build_vocab(train, vectors=GloVe(name='6B',dim=300),max_size=10000, min_freq = 10)
LABEL.build_vocab(train,)

인자 vector의 값은 어떤 embedding클래스가 사용되는지를 의미합니다. name과 dim인자들은어떤 embeddings가 사용 될어 질수 있는지 결정합니다. vocab 오브젝트로부터 embeddings를 쉽게 접근할 수 있습니다. 다음 코드가 그것을 보여주고 있습니다.

TEXT.vocab.vectors

실제 위와같이 해보면 동작이 되지 않습니다. 예제가 완벽한 전체 소스가 아니기 때문입니다. 여기에서는 build_vocab를 통해 vector를 선택하고 접근 방법이  embedding값을 TEXT.vocab.vectors 여기로 접근이 된다는 정도만 이해 하면 됩니다.
실행 가능한 예제로 만들었습니다. 데이터는 여기에서는 데이터가 별 의미는 없어서 (TEXT.vocab.vectors 보는것이 주목적이라) 이전에 사용한 데이터를 로드하였습니다.

from torchtext.vocab import GloVe
from torchtext.data import Field, TabularDataset

TEXT = Field(lower=True, batch_first=True,fix_length=20)  
LABEL = Field(sequential=False)

train = TabularDataset(path='./qtrain.tsv', skip_header=True, format='tsv', fields=[('text', TEXT), ('label', LABEL)])

TEXT.build_vocab(train, vectors=GloVe(name='6B',dim=300),max_size=10000, min_freq = 10)
LABEL.build_vocab(train,)

print (TEXT.vocab.vectors)

실행시 결과는 아래와 같습니다.
tensor([[ 0.0000,  0.0000,  0.0000,  ...,  0.0000,  0.0000,  0.0000],
        [ 0.0000,  0.0000,  0.0000,  ...,  0.0000,  0.0000,  0.0000],
        [ 0.0466,  0.2132, -0.0074,  ...,  0.0091, -0.2099,  0.0539],
        ...,
        [ 0.0333, -0.0408, -0.0484,  ..., -0.1541,  0.1781, -0.1968],
        [ 0.1270,  0.2106, -0.1898,  ..., -0.2849, -0.2937,  0.2436],
        [-0.2044,  0.1643,  0.0418,  ..., -0.3401, -0.0771, -0.0841]])















댓글 없음:

댓글 쓰기