2018년 9월 22일 토요일

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

시작하기 전에


여기 글의 예제는 PyTorch 로 되어 있습니다.
본문의 내용은 Deep Learning with PyTorch (Vishnu Subramanian) 책 내용으로 구성 되어있으며, 해당 내용은 Chapter 6 의 내용으로 구성되어 있습니다.

Creating a network model with embedding (embedding을 가진 네트웍 모델 생성)

앞에서 간단하게 word embeddings에 대해서 설명을 했습니다. 여기에서 word embeddings 네트워크 구조의 부분으로 생성하고 각 리뷰(IMDB 데이터가 영화의 리뷰 데이터입니다.)의 의미를 예측하는 전체 모델을 훈련합니다. 훈련(train)의 마지막에서는 의미 분류 모델과 IMDB 데이터셋을 위한 word embeddings를 가질 것입니다.(앞에서도 언급했지만 word embedding에서 최종 결과는 vectors 변환 테이블을 가지게 됩니다. 물론 그 값은 의미적으로 비슷할때 유사한 값을 가지게 될겁니다. 앞에서 영화 superman, batman, thor 를 예를 들어서 설명하였습니다. ) 다음 코드는 word embeddings를 사용해서 의미를 예측하는 네트워크 구조를 어떻게 생성하는지 나타냅니다.


class EmbNet(nn.Module):
    def __init__(self,emb_size,hidden_size1,hidden_size2=400):
        super().__init__()
        self.embedding = nn.Embedding(emb_size,hidden_size1)
        self.fc = nn.Linear(hidden_size2,3)
        
    def forward(self,x):
        embeds = self.embedding(x).view(x.size(0),-1)
        out = self.fc(embeds)
        return F.log_softmax(out,dim=-1)


위 코드에서 EmbNet 은 의미 분류기로서 모델을 생성했습니다. __init__ 함수 내부에서 nn.Embedding 클래스의 객체를 초기화 합니다. 어휘와 차원의 크기 두개의 인자를 가져갑니다. emb_size<=어휘크기, hidden_size1=>word embeddings에서 차원의 크기가 됩니다.
앞에서 어휘 크기를 10000으로 제한 한적이 있습니다. TEXT.build_vocab 인자로 max_Size=10000, 그리고 빠른 훈련을 위해서 작은 embedding size를 선택하는게 유용합니다. 그러나 실제 제품에서는 큰 크기를 가지고 해야합니다.
또한 선형 레이어를 가지고 있는데 이것은 word embeddings을 카테고리(긍정, 부정, 알려지지 않음)에 매핑합니다.
forward함수는 어떻게 입력 데이터를 처리할지 결정합니다. 32배치 크기에 최대 20 글자 길이를 가진 문장에 대해 입력 크기는 32*20이 될것입니다. 첫번째 embedding 레이어는 embedding vector로 변환되는 lookup 테이블로 동작이 됩니다. embedding 10차원에 대해 출력은 vector로 변경되므로 32*20*10이 됩니다. view()함수는 embedding 레이어 결과를 평평(1차원으로) 하게 합니다. view 함수에 전달된 첫번째 인자는 그 차원을 그대로 유지할 것입니다. 이 경우에 다른 일괄 작업(batch)들과 결합하는 것을 원하지 않습니다. 그래서 첫번째 차원을 유지 하였습니다. view 함수가 적용된 후에 텐서의 형태는 32*200 형태로 변경됩니다. 다음 레이어는 평평하게 된 embedding을 카테고리 번호에 매핑합니다. 네트워크가 정의 되면 네트워크 모델을 평소처럼 훈련 할 수 있습니다.

이번 장에서는 실행시킬 예제는 없습니다. 다음 training에서 앞서 생성한 네트워크 모델과 한꺼번에 예제를 작성하도록 하겠습니다.




댓글 없음:

댓글 쓰기