기존의 사전 훈련 방식
word2vec이 등장한 이후, 사람들은 꾸준히 사전 훈련된pretrained 단어 임베딩 벡터word embedding vector를 사용해 딥러닝 모델을 개선하려 했습니다. 이와 관련해 앞서 단어 임베딩 벡터를 다룬 6장에서는 사람들이 흔히 갖는 잘못된 개념이라고 설명했습니다. 물론 사전 훈련된 단어 임베딩 벡터들을 기존의 머신러닝 알고리즘에 적용하면 성과가 있을 수는 있지만, 딥러닝 모델에서는 생각보다 큰 효과를 거둘 수 없기 때문입니다. 여기서는 사전 훈련된 단어 임베딩 벡터를 텍스트 분류와 같은 문제에 적용할 때 사용할 수 있는 방법들을 설명하고자 합니다.
아직은 새로운 전이학습 기법들을 다루지 않았으므로, 기존에 단어 임베딩 벡터를 활용한 방법을 전이학습에 적용하는 법을 살펴보겠습니다. 먼저 다음 그림과 같이 RNN을 사용한 간단한 텍스트 분류 신경망의 경우를 가정해보겠습니다.
1번 데이터셋에서 데이터 $x,y$ 를 입력받아 훈련하는 신경망 $\{\theta,W_{emb},W_{softmax}\}$
앞서 텍스트 분류에 관련한 장에서 다루었듯이, 신경망은 소프트맥스 계층과 RNN 계층들 그리고 임베딩 계층으로 이루어져 있습니다. 우리는 원핫 인코딩 벡터들을 문장 내 단어 대신 입력 $x$ 로 넣고, 신경망 $f_\theta$ 를 통과시켜 클래스를 예측하는 분포 $\hat{y}$ 를 반환하도록 할 것입니다.
이 그림에서는 transposed 된 $W^T$ 이므로 열(column)로 표시되었습니다.
이전에 다루었듯이, 원핫 인코딩 벡터의 특징으로 인해, 1 위치의 값만 살아남을 것입니다. 따라서 임베딩 계층의 가중치 파라미터 $W$ 의 각 행(row)은 해당 단어의 임베딩 벡터와 같습니다.

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

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

여기서 다음 그림과 같이 각 단어의 임베딩 벡터를 사전 훈련한 단어 임베딩 벡터로 치환하여 사용하면 됩니다. 이후에 해당 임베딩 계층의 가중치 파라미터 값과, 기타 신경망의 랜덤 초기화된 가중치 파라미터값에 대해 역전파 알고리즘과 경사하강법을 통해 학습을 수행하면 될 것입니다.
0번 데이터셋을 통해 사전 훈련한 단어 임베딩 벡터를 임베딩 계층에 적용합니다.
이때 각 단어에 해당하는 단어 임베딩 벡터는 앞서 그림에서 보았듯이 임베딩 계층의 가중치 파라미터의 해당 행(row)을 대체하여 초깃값으로 설정할 수 있습니다.

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

마찬가지로 0번 데이터셋을 통해 사전 훈련한 단어 임베딩 벡터를 임베딩 계층에 적용했지만, 이후 훈련에서 임베딩 계층을 제외한 빨간 점선 안쪽 부분의 신경망만 MLE를 통해서 갱신됩니다.
이때 임베딩 계층의 가중치 파라미터는 최적화 대상에서 제외함으로써, 임베딩 계층을 제외한 신경망의 다른 가중치 파라미터들만 학습하도록 할 수 있습니다. 기존에는 경사하강법을 수행하기 위해 다음과 같이 아담 옵티마이저에게 파라미터를 등록해주어야 했을 것입니다. 이때, model.parameters()는 모델 내의 가중치 파라미터들을 반환해주는 이터레이터입니다.
1
optimizer = optim.Adam(model.parameters())
Copied!
따라서 우리는 다음과 같이 임베딩 계층을 제외하고 신경망 내의 다른 구성요소들의 파라미터들을 등록해줄 수 있습니다.
1
optimizer = optim.Adam(model.softmax_layer.parameters() + model.rnn.parameters())
Copied!

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

이전까지의 방법들처럼 임베딩 계층을 초기화했지만, 이번에는 두 개의 다른 학습률을 사용하여 임베딩 계층은 빨간색 점선 부분과 달리 천천히 갱신되게 합니다.
마지막으로 우리는 임베딩 계층의 가중치 파라미터를 최적화에서 제외하는 대신 천천히 학습하도록 할 수도 있습니다. 다만 이때는 또 다른 학습률이 하이퍼파라미터로 추가될 것입 니다.
1
optimizer = optim.Adam(model.softmax_layer.parameters() + model.rnn.parameters())
2
optimizer_emb = optim.Adam(model.emb_layer.parameters(), lr=1e-6)
Copied!

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

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

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

word2vec의 Skip-gram이나 GloVe 알고리즘은 성공적으로 단어를 잠재 공간latent space에 임베딩할 수 있었지만, 그 알고리즘은 문장에 함께 출현co-occurrence한 단어들을 예측하는 데 기반합니다. 따라서 임베딩된 정보는 매우 한정적입니다. 특히 해당 알고리즘들의 목적 함수는 우리가 실제 수행하려는 문제를 해결하기 위한 목적 함수와 매우 다를 것이므로, 우리에게 필요한 특징을 반영하기 어려울 것입니다.
또한, 기존 단어 임베딩 알고리즘들의 결과는 문장의 문맥을 고려한 단어의 의미를 임베딩 하기에는 지나치게 단순합니다. 같은 단어라고 할지라도 문장의 문맥에 따라 그 의미가 확연하게 달라지는 것은 사실입니다. 예를 들어 'play'라는 단어가 있을 때, 목적어에 따라 그 의미는 매우 달라질 것입니다.
play
target
연주하다
guitar
재생하다
movie
놀다
football
목적어에 따른 play의 의미
또한 문장 내 단어의 위치에 따라서도 쓰임새와 의미가 달라집니다. 이러한 정보들이 임베딩 계층의 상위 계층에서 제대로 추출 및 반영되더라도, 애초에 단어를 임베딩할 때 고려되어 입력으로 주어진 것에 비해서 불리한 것은 당연한 사실입니다.

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

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

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

이번 장에서 소개하는 자연어 처리에 전이학습을 적용하는 방법들은 앞에서 열거한 기존의 단점들을 효과적으로 보완한 것이 특징입니다. 따라서 기존의 자연어 처리 문제에 다양하게 적용 되어 성공을 거둘 수 있었습니다. 이에 따라, 마치 영상 처리 분야에서 성공한 이미지넷의 사전 훈련된 신경망 가중치 파라미터들을 여러 다른 영상 처리 분야에 활발하게 사용했던 것처럼, 자연어 처리 분야에서도 수많은 문장을 수집하여 학습한 신경망을 통해 다른 문제에 성공적으로 적용하고 성능을 개선하는 방법이 마련되었습니다.
자연어 처리 분야에서의 전이학습 분류[46]
자연어 처리에서의 사전 훈련은 다른 분야의 사전 훈련 보다 훨씬 유리한 점을 갖습니다. 일반 문장들에 대해서 단순히 언어 모델을 훈련하는 것 만으로도 매우 큰 전이학습으로 인한 성능 향상을 볼 수 있다는 점입니다.
특히, 수집에 비용이 들어가는 병렬 코퍼스나 레이블링 텍스트와 달리, 일반적인 문장들의 수집은 매우 쉽고 값싸므로 전이학습이 더욱 큰 효과를 거둘 수 있습니다. 즉, 기존의 데이터셋 수집에 비해 일반 코퍼스 수집은 거의 비용이 들지 않으므로, 노력 대비 매우 큰 성과를 위험 부담 없이 얻을 수 있습니다.
Last modified 2yr ago