Natural Language Processing with PyTorch
  • 소개글
  • 서문
  • Index
  • 딥러닝을 활용한 자연어 처리 개요
    • 자연어 처리란 무엇일까?
    • 딥러닝 소개
    • 왜 자연어 처리는 어려울까?
    • 무엇이 한국어 자연어 처리를 더욱 어렵게 만들까?
    • 자연어 처리의 최근 추세
  • 기초 수학
    • 서문
    • 랜덤 변수와 확률 분포
    • 쉬어가기: 몬티 홀 문제
    • 기대값과 샘플링
    • Maximum Likelihood Estimation
    • 정보 이론
    • 쉬어가기: MSE 손실 함수와 확률 분포 함수
    • 마치며
  • Hello 파이토치
    • 딥러닝을 시작하기 전에
    • 설치 방법
    • 짧은 튜토리얼
    • 쉬어가기: 윈도우즈 개발 환경 구축
  • 전처리
    • 전처리란
    • 코퍼스 수집
    • 코퍼스 정제
    • 분절
    • 병렬 코퍼스 정렬
    • 서브워드 분절
    • 분절 복원
    • 토치텍스트
  • 유사성과 모호성
    • 단어의 의미
    • One-hot 인코딩
    • 시소러스를 활용한 단어 의미 파악
    • 특징
    • 특징 추출하기: TF-IDF
    • 특징 벡터 만들기
    • 특징 유사도 구하기
    • 단어 중의성 해소
    • Selectional Preference
    • 마치며
  • 단어 임베딩
    • 들어가며
    • 차원 축소
    • 흔한 오해 1
    • Word2Vec
    • GloVe
    • Word2Vec 예제
    • 마치며
  • 시퀀스 모델링
    • 들어가며
    • Recurrent Neural Network
    • Long Short Term Memory
    • Gated Recurrent Unit
    • 그래디언트 클리핑
    • 마치며
  • 텍스트 분류
    • 들어가기
    • 나이브 베이즈를 활용하기
    • 흔한 오해 2
    • RNN을 활용하기
    • CNN을 활용하기
    • 쉬어가기: 멀티 레이블 분류
    • 마치며
  • 언어 모델링
    • 들어가며
    • n-gram
    • 언어 모델의 평가 방법
    • SRILM을 활용한 n-gram 실습
    • NNLM
    • 언어 모델의 활용
    • 마치며
  • 신경망 기계번역
    • 들어가며
    • Sequence-to-Sequence
    • Attention
    • Input Feeding
    • 자기회귀 속성과 Teacher Forcing 훈련 방법
    • 탐색(추론)
    • 성능 평가
    • 마치며
  • 신경망 기계번역 심화 주제
    • 다국어 신경망 번역
    • 단일 언어 코퍼스를 활용하기
    • 트랜스포머
    • 마치며
  • 강화학습을 활용한 자연어 생성
    • 들어가며
    • 강화학습 기초
    • 정책 기반 강화학습
    • 자연어 생성에 강화학습 적용하기
    • 강화학습을 활용한 지도학습
    • 강화학습을 활용한 비지도학습
    • 마치며
  • 듀얼리티 활용
    • 들어가며
    • 듀얼리티를 활용한 지도학습
    • 듀얼리티를 활용한 비지도학습
    • 쉬어가기: Back-translation을 재해석하기
    • 마치며
  • NMT 시스템 구축
    • 파이프라인
    • 구글의 NMT
    • 에딘버러 대학의 NMT
    • MS의 NMT
  • 전이학습
    • 전이학습이란?
    • 기존의 사전 훈련 방식
    • ELMo
    • BERT
    • GPT-2
    • XLNet
    • 마치며
  • 이 책을 마치며
  • 참고문헌
Powered by GitBook
On this page
  • 사전 훈련된 가중치 파라미터의 사용 방법
  • 신경망 가중치 파라미터 초깃값으로 사용
  • 신경망 가중치 파라미터 값으로 고정
  • 신경망 가중치 파라미터 초깃값으로 사용 및 느린 학습
  • 사전 훈련된 단어 임베딩 벡터를 쓰지 않는 이유
  • 문장의 문맥을 반영하지 못하는 기존 단어 임베딩 알고리즘
  • 신경망의 입력 계층의 가중치 파라미터에만 적용
  • 자연어 처리에서 전이학습의 효과
  1. 전이학습

기존의 사전 훈련 방식

Previous전이학습이란?NextELMo

Last updated 5 years ago

word2vec이 등장한 이후, 사람들은 꾸준히 사전 훈련된pretrained 단어 임베딩 벡터word embedding vector를 사용해 딥러닝 모델을 개선하려 했습니다. 이와 관련해 앞서 단어 임베딩 벡터를 다룬 6장에서는 사람들이 흔히 갖는 잘못된 개념이라고 설명했습니다. 물론 사전 훈련된 단어 임베딩 벡터들을 기존의 머신러닝 알고리즘에 적용하면 성과가 있을 수는 있지만, 딥러닝 모델에서는 생각보다 큰 효과를 거둘 수 없기 때문입니다. 여기서는 사전 훈련된 단어 임베딩 벡터를 텍스트 분류와 같은 문제에 적용할 때 사용할 수 있는 방법들을 설명하고자 합니다.

아직은 새로운 전이학습 기법들을 다루지 않았으므로, 기존에 단어 임베딩 벡터를 활용한 방법을 전이학습에 적용하는 법을 살펴보겠습니다. 먼저 다음 그림과 같이 RNN을 사용한 간단한 텍스트 분류 신경망의 경우를 가정해보겠습니다.

앞서 텍스트 분류에 관련한 장에서 다루었듯이, 신경망은 소프트맥스 계층과 RNN 계층들 그리고 임베딩 계층으로 이루어져 있습니다. 우리는 원핫 인코딩 벡터들을 문장 내 단어 대신 입력 $x$ 로 넣고, 신경망 $f_\theta$ 를 통과시켜 클래스를 예측하는 분포 $\hat{y}$ 를 반환하도록 할 것입니다.

이전에 다루었듯이, 원핫 인코딩 벡터의 특징으로 인해, 1 위치의 값만 살아남을 것입니다. 따라서 임베딩 계층의 가중치 파라미터 $W$ 의 각 행(row)은 해당 단어의 임베딩 벡터와 같습니다.

사전 훈련된 가중치 파라미터의 사용 방법

신경망 가중치 파라미터 초깃값으로 사용

여기서 다음 그림과 같이 각 단어의 임베딩 벡터를 사전 훈련한 단어 임베딩 벡터로 치환하여 사용하면 됩니다. 이후에 해당 임베딩 계층의 가중치 파라미터 값과, 기타 신경망의 랜덤 초기화된 가중치 파라미터값에 대해 역전파 알고리즘과 경사하강법을 통해 학습을 수행하면 될 것입니다.

이때 각 단어에 해당하는 단어 임베딩 벡터는 앞서 그림에서 보았듯이 임베딩 계층의 가중치 파라미터의 해당 행(row)을 대체하여 초깃값으로 설정할 수 있습니다.

신경망 가중치 파라미터 값으로 고정

이때 임베딩 계층의 가중치 파라미터는 최적화 대상에서 제외함으로써, 임베딩 계층을 제외한 신경망의 다른 가중치 파라미터들만 학습하도록 할 수 있습니다. 기존에는 경사하강법을 수행하기 위해 다음과 같이 아담 옵티마이저에게 파라미터를 등록해주어야 했을 것입니다. 이때, model.parameters()는 모델 내의 가중치 파라미터들을 반환해주는 이터레이터입니다.

    optimizer = optim.Adam(model.parameters())

따라서 우리는 다음과 같이 임베딩 계층을 제외하고 신경망 내의 다른 구성요소들의 파라미터들을 등록해줄 수 있습니다.

    optimizer = optim.Adam(model.softmax_layer.parameters() + model.rnn.parameters())

신경망 가중치 파라미터 초깃값으로 사용 및 느린 학습

마지막으로 우리는 임베딩 계층의 가중치 파라미터를 최적화에서 제외하는 대신 천천히 학습하도록 할 수도 있습니다. 다만 이때는 또 다른 학습률이 하이퍼파라미터로 추가될 것입 니다.

    optimizer = optim.Adam(model.softmax_layer.parameters() + model.rnn.parameters())
    optimizer_emb = optim.Adam(model.emb_layer.parameters(), lr=1e-6)

사전 훈련된 단어 임베딩 벡터를 쓰지 않는 이유

하지만 이전에도 다루었듯이, 이러한 방식의 전이학습은 그다지 큰 효과를 거둘 수 없었습니다. 그 이유를 더 자세히 설명하겠습니다.

문장의 문맥을 반영하지 못하는 기존 단어 임베딩 알고리즘

word2vec의 Skip-gram이나 GloVe 알고리즘은 성공적으로 단어를 잠재 공간latent space에 임베딩할 수 있었지만, 그 알고리즘은 문장에 함께 출현co-occurrence한 단어들을 예측하는 데 기반합니다. 따라서 임베딩된 정보는 매우 한정적입니다. 특히 해당 알고리즘들의 목적 함수는 우리가 실제 수행하려는 문제를 해결하기 위한 목적 함수와 매우 다를 것이므로, 우리에게 필요한 특징을 반영하기 어려울 것입니다.

또한, 기존 단어 임베딩 알고리즘들의 결과는 문장의 문맥을 고려한 단어의 의미를 임베딩 하기에는 지나치게 단순합니다. 같은 단어라고 할지라도 문장의 문맥에 따라 그 의미가 확연하게 달라지는 것은 사실입니다. 예를 들어 'play'라는 단어가 있을 때, 목적어에 따라 그 의미는 매우 달라질 것입니다.

play

target

연주하다

guitar

재생하다

movie

놀다

football

목적어에 따른 play의 의미

또한 문장 내 단어의 위치에 따라서도 쓰임새와 의미가 달라집니다. 이러한 정보들이 임베딩 계층의 상위 계층에서 제대로 추출 및 반영되더라도, 애초에 단어를 임베딩할 때 고려되어 입력으로 주어진 것에 비해서 불리한 것은 당연한 사실입니다.

신경망의 입력 계층의 가중치 파라미터에만 적용

앞의 적용 방법에 대한 설명에서 보았듯이, 대부분의 기존 적용 방법들은 임베딩 계층에 국한됩니다. 임베딩 계층의 가중치 파라미터만 한정하여 본다면 전역 최소점에 더 가까울지라도, 신경망 전체 가중치 파라미터를 고려한다면 최적화에 유리할지는 알 수 없습니다. 따라서 신경망 전체에 대해 사전 훈련하는 방법을 사용하는 편이 더 낫습니다.

자연어 처리에서 전이학습의 효과

이번 장에서 소개하는 자연어 처리에 전이학습을 적용하는 방법들은 앞에서 열거한 기존의 단점들을 효과적으로 보완한 것이 특징입니다. 따라서 기존의 자연어 처리 문제에 다양하게 적용 되어 성공을 거둘 수 있었습니다. 이에 따라, 마치 영상 처리 분야에서 성공한 이미지넷의 사전 훈련된 신경망 가중치 파라미터들을 여러 다른 영상 처리 분야에 활발하게 사용했던 것처럼, 자연어 처리 분야에서도 수많은 문장을 수집하여 학습한 신경망을 통해 다른 문제에 성공적으로 적용하고 성능을 개선하는 방법이 마련되었습니다.

자연어 처리에서의 사전 훈련은 다른 분야의 사전 훈련 보다 훨씬 유리한 점을 갖습니다. 일반 문장들에 대해서 단순히 언어 모델을 훈련하는 것 만으로도 매우 큰 전이학습으로 인한 성능 향상을 볼 수 있다는 점입니다.

특히, 수집에 비용이 들어가는 병렬 코퍼스나 레이블링 텍스트와 달리, 일반적인 문장들의 수집은 매우 쉽고 값싸므로 전이학습이 더욱 큰 효과를 거둘 수 있습니다. 즉, 기존의 데이터셋 수집에 비해 일반 코퍼스 수집은 거의 비용이 들지 않으므로, 노력 대비 매우 큰 성과를 위험 부담 없이 얻을 수 있습니다.

1번 데이터셋에서 데이터 $x,y$ 를 입력받아 훈련하는 신경망 $\{\theta,W_{emb},W_{softmax}\}$
이 그림에서는 transposed 된 $W^T$ 이므로 열(column)로 표시되었습니다.
0번 데이터셋을 통해 사전 훈련한 단어 임베딩 벡터를 임베딩 계층에 적용합니다.
마찬가지로 0번 데이터셋을 통해 사전 훈련한 단어 임베딩 벡터를 임베딩 계층에 적용했지만, 이후 훈련에서 임베딩 계층을 제외한 빨간 점선 안쪽 부분의 신경망만 MLE를 통해서 갱신됩니다.
이전까지의 방법들처럼 임베딩 계층을 초기화했지만, 이번에는 두 개의 다른 학습률을 사용하여 임베딩 계층은 빨간색 점선 부분과 달리 천천히 갱신되게 합니다.
자연어 처리 분야에서의 전이학습 분류[46]