본 내용은 '김기현의 자연어 처리 딥러닝 캠프(한빛미디어)'를 정리한 내용입니다.

 

"이제까지 배운 자연어 처리 알고리즘은 실제 필드에 어떻게 적용될까?"

 

* 학습 목표 : NMT 시스템 구축 절차 및 구글, 에든버러 대학, MS, 네이버의 NMT


1. 기계번역 시스템 구축 절차 

ㅇ 기계번역뿐만 아니라 기본적인 자연어 처리 문제 전반에 적용 가능

준비과정 개요도. https://kh-kim.gitbook.io/natural-language-processing-with-pytorch/00-cover-13/01-pipeline

1) 코퍼스 수집 : WMT(기계번역 경진대회), 뉴스 기사, 드라마/영화 자막, 위키피디아 등

2) 정제 : 말뭉치 문장 단위 정렬부터 특수 문자 노이즈 제거 등

3) 분절 : 언어별 형태소 분석기(POS tagger)/분절기(tokenizer, segmenter)를 사용해 띄어쓰기/대소문자 정제 등

    - 한국어 형태소 분석기(Mecab, KoNLPy)

    - 띄어쓰기 후 추가 분절 : Subword, WordPiece 같은 공개툴을 통해 BPE(Byte Pair Encoding)

4) 미니배치 구성 : 미니배치 내 문장 길이 통일(ex> 5단어 문장끼리, 70단어 문장끼리 미니배치 구성)

5) 훈련 : 준비된 데이터셋으로 seq2seq 모델 훈련

6) 추론 : 성능 평가(evaluation)를 위한 추론 수행, 테스트셋 난이도가 적절해야 함

7) 분절복원(detokenization) : 추론 후에도 실제 사람이 사용하는 문장과는 다름. 실제 사용되는 문장 형태로 반환

8) 성능평가 : 얻어진 문장 정량 평가(기계번역-BLEU), 정성 평가, 두 지표 모두 개선되었을 시 서비스 적용 가능

 

ㅇ 서비스 과정

1) API 호출/사용자 입력 : 대부분 서비스별 API 서버를 만들어 실제 프론트엔드에서 API 호출을 받아 프로세스 시작

2) 분절 : 실제 모델에 훈련된 데이터셋과 동일한 형태로 분절. 훈련과 똑같은 툴과 모델을 사용해야 함

3) 추론 : 속도가 중요. 많은 수의 문장일 경우 병렬 연산을 통한 처리 속도 증가 등이 필요

4) 분절 복원 : 사람이 읽을 수 있는 형태로 다시 복원

5) API 결과 반환/사용자에 결과 반환 : 최종 결과물을 API 서버에서 반환

 

2. 구글의 NMT

ㅇ seq2seq 기반 모델

ㅇ 방대한 데이터셋에 맞는 깊은 모델(8 Layer LSTM) 구성(+레지듀얼 커넥션 활용)

    - 보통 LSTM 계층이 4개 이상이 되면 모델이 깊어짐에 따라 성능 효율이 저하됨.

      이 때, 레지듀얼 커넥션을 통해 기울기 소실 문제를 해결할 수 있고 더 깊은 신경망을 효율적으로 훈련할 수 있음

Residual Connection 적용. https://norman3.github.io/papers/docs/google_neural_machine_translation.html

ㅇ 첫번째 층에 양방향 LSTM 적용 : 성능의 큰 하락 없이 훈련 및 추론 속도 개선

충분한 컨텍스트를 살펴보기 위해 첫번째 층에 bi-directional 적용. https://norman3.github.io/papers/docs/google_neural_machine_translation.html

BPE 적용

강화학습을 통해 기계번역 성능 향상 : 기존 MLE + RL 선형결합으로 최종적인 목적 함수 설정

    - MLE는 BLEU 평가 지표와 부합하지 않아 조금 다른 목적의 함수를 도입(RL)

 

r(Y,Y*)는 문장 단위 점수 : 출력문서~실제문서 차이

 

최종 평가 함수는 ML 방식과 RL 방식을 합쳐 생성. a(알파)는 주로 0.017로 설정

양자화(Quantization) : 실제 서비스에 적용할 때는 양자화된 모델을 사용해 추론 시간을 줄여줌

    - 계산량 줄여 자원의 효율적 사용, 응답시간 감소, 부가적 regularization 효과 등

양자화된 모델이 더 낮은 음의 로그가능도(손실함수)를 보임 https://norman3.github.io/papers/docs/google_neural_machine_translation.html

ㅇ 디코더에 길이 페널티, 커버리지 페널티 사용

SGD + Adam 같이 사용했을 때 더 좋은 성능을 발휘

    - 첫번째 epoch은 아담을 사용해 낮은 손실값까지 빠르게 학습 후, 두번째부터 SGD 사용해 최적화

https://norman3.github.io/papers/docs/google_neural_machine_translation.html

ㅇ 결과 : 통계기반방식과 비교해 엄청난 성능 개선.

            구글은 이 논문을 통해 SMT 시대의 종말을 선언하고 자연어 처리분야에서 딥러닝 시대를 본격적으로 선포

 

3. 에든버러 대학교 NMT

- 조금 더 현실적인 스케일의 NMT

서브워드 분절 : BPE 방식을 통한 분절 방식 처음 제안

ㅇ seq2seq 기반 모델. GRU 사용. 레지듀얼 커넥션으로 깊은 RNN(인코더 4, 디코더 8 layer). Adam만 사용

ㅇ 단방향 코퍼스 활용 : back-translation 처음 제안. 합성 병렬 코퍼스를 구성해 훈련 데이터셋에 추가

앙상블

 

4. MS NMT

- 이미 일정 수준 이상 발전한 기술 기반 위에서 성능을 더욱 견고히 하는 방법에 대한 설명

- 주로 중국어-영어 간 기계번역, 뉴스 도메인 번역에서 사람과 비슷한 성능에 도달

  (단, 다른 도메인과 언어쌍에는 부족)

트랜스포머 구조를 사용한 seq2seq 구현

    - 트랜스포머를 메이저 상용시스템에 성공적으로 적용한 사례

듀얼리티 활용 : DSL(듀얼 지도학습)+DUL(듀얼 비지도학습, 단방향 코퍼스 활용 성능 극대화) 모두 사용

딜리버레이션 네트워크 활용 : 소스문장에서 번여 초안을 얻고, 초안으로부터 최종 타깃 문장을 번역

https://www.microsoft.com/en-us/research/blog/deliberation-networks/

 

본 내용은 '김기현의 자연어 처리 딥러닝 캠프(한빛미디어)'를 정리한 내용입니다.

 

"기계 번역의 성능을 어떻게 향상 시킬 수 있을까?"

 

* 학습 목표 : 기계번역의 성능을 높이기 위한 기법들(제로샷, 단일 언어 코퍼스 활용, 트랜스포머)


1. 다국어 신경망 번역

1) 제로샷 학습

- 제로샷 학습 : 전이학습(Transfer Learning)에서 발전된 기계학습의 한 종류

  *제로샷 학습 : 데이터 간 관계와 공통점을 통해 정답 발견. 예를 들어, 문제 A의 정답이 B,C,D 문제에도 존재할 경우, 인공지능이 문제들의 관계를 분석해 공통점을 파악하고 그것을 중심으로 문제의 정답을 찾는 것. 데이터가 풍부하지 않은 분야에서 유용

기존에 오카피를 본 적 없는 신경망이라도, 얼룩말/사슴 문제에서 학습된 특징으로 오카피를 분류할 수 있다https://m.blog.naver.com/with_msip/221886769247 과학기술정보통신부 블로그

  • 훈련 데이터에서 상당히 누락될 수 있는 드물고, 익숙하지 않고, 보이지 않는 객체의 즉각적인 인식
  • 매우 높은 수준의 전문 지식으로 분류된 훈련 데이터를 얻기 어려운 패턴 인식
  • 세분화된 카테고리의 확산으로 인해 통계적으로 다양한 분류된 훈련 데이터를 충분한 양으로 획득하기 어렵거나 엄청나게 비싼 객체 클래스의 인스턴스를 탐지하는 것

제로 샷 학습을 가능하게 하는 것은 통계적 또는 의미적 접근법을 통해 발견하고 용도를 변경할 수 있는 사전 지식의 존재다. 제로 샷 방법은 이 지식을 사용해(훈련해) 본 인스턴스(훈련 데이터에 있는 인스턴스)와 보이지 않는 인스턴스(훈련 데이터에 없는 인스턴스)를 모두 포함하는 특징(feature)을 예측

(ITworld 20.03.04 http://www.itworld.co.kr/news/145802#csidx4add731da3359c2b96936c9de33177a )

 

- 구글 번역 시스템에 제로샷 활용

'구글 다중 인공신경망 기계번역 시스템:제로샷 번역 활용

(Google’s Multilingual Neural Machine Translation system:Enabling Zero-Shot Translation Enabling Zero-Shot Translation)'

 

"다중 언어들 사이 번역을 위한 단일한 NMT 모델을 사용하면서 모델 아키텍처를 변경할 필요없이 인공 토큰을 입력한 문장을 붙이는 방법으로 필요한 언어로 번역할 수 있게 했다

 

구글 인공신경망 기계번역(GNMT)에 제로샷 활용. 이전에 학습하지 않았던 언어쌍도 번역 가능https://zdnet.co.kr/view/?no=20170302163740

 

영-한, 영-일 언어쌍에 대한 번역 기술을 갖춘 상태에서 한국어를 일본어로 바꾸기 위해 한국어에 특별한 꼬리표를 달면 알아서 한국어를 영어로 번역한 뒤 다시 일본어로 번역해주는 과정을 거친다.

 

제로샷 번역은 이 덕분에 여러 언어가 섞여 있는 경우에도 번역을 해낸다.

 

  • Japanese: 私は東京大?の?生です。 → I am a student at Tokyo University.
  • Korean: 나는 도쿄대학의 학생입니다. → I am a student at Tokyo University.
  • Mixed Japanese/Korean: 私は東京大?학생입니다. → I am a student of Tokyo University.

 

- 여러 언어쌍의 병렬 코퍼스를 하나의 모델에 훈련하면, 학습에 참여했지만 코퍼스에 존재하지 않는 언어쌍도 번역이 가능

- 구현 방법 : 기존 병렬 코퍼스의 앞에 특수 토큰 삽입하고 훈련! 

  ex> 기존 : Hello -> Hola / 제로샷 : <2es> Hello -> Hola

 

<실험 목표>

1) 다국어 신경망 머신러닝의 end2end 모델 구현할 수 있는가?

2) 서로 다른 언어쌍의 코퍼스를 활용해 번역기의 모든 언어쌍에 대해 전체적인 성능을 올릴 수 있는가?

 

Many to One : 전체적으로 성능 향상

- 다수 언어에서 하나의 언어로. 다수 언어를 인코더에 넣고 훈련

- 동시에 훈련된 다른 언어의 데이터셋을 통해 해당 언어의 번역성능을 높일 수 있음

 

One to Many : 향상되었다고 보기 어려움

- 하나의 언어에서 다수 언어로. 다수 언어를 디코더에 넣고 훈련

 

Many to Many : 대부분 성능 하락

- 다수 언어에서 다수 언어로. 다수 언어를 인코더, 디코더에 모두 넣고 훈련

- 다양한 언어쌍을 하나에 몰아 넣고 훈련한 것치고는 절대적 BLEU 수치는 쓸만하지만 하락

 

제로샷 번역 : 제로샷 모델 + 기존 모델 시 성능 우수

- 병렬 코퍼스의 양이 얼마 되지 않는 언어쌍의 번역기를 훈련할 대는 이러한 방법을 통해 성능을 끌어올릴 수 있음

 

-> 다국어 기계번역 모델로서는 의의가 있지만, 성능 측면에서는 큰 이득이 없어 실제 사용에는 한계가 있음

 

- 단, 합성 토큰을 추가하는 방식 응용 가능

  ex> 번역문의 말투 변경(뉴스기사 코퍼스/미드 자막 코퍼스, 문어체/대화체로 도메인을 나누고 특수 토큰을 추가)

        의료용/법률용 등

 

2. 단일 언어 코퍼스 활용하기

- 병렬코퍼스보다 단일 언어 코퍼스를 얻는 것이 훨씬 쉬움
- 단일 언어 코퍼스의 양이 많기 때문에 우리가 사용하는 언어의 확률 분포에 더 가까울 수 있음

 

1) 언어 모델 앙상블(by. Yoshua Bengio)

- shallow fusion : 두개의 서로 다른 모델 사용
- deep fusion : 언어 모델을 seq2seq에 포함시켜 end2end 학습을 통해 한 개의 모델로 만듦

 

 

 

2) 더미 문장 활용(by. Rico Sennrich)

- 디코더가 단일 언어 코퍼스를 학습하도록 하는 방법 

  -> 인코더로부터 전달되는 정보들을 없애는 것이 핵심  

      ㅇ 소스 문장인 X를 빈 인력으로 넣기

      ㅇ 어텐션 등을 모두 드롭아웃하여 끊어줌
- 디코더가 단일 언어 코퍼스를 활용하여 언어 모델을 학습하는 것과 같음

 

3) 반대 방향 번역기 활용 Back Translation (by. Rico Sennrich)

- 기존의 훈련된 반대 방향 번역기를 사용해 단일 언어 코퍼스를 기계번역해 합성 병렬 코퍼스를 만든 후, 

  이것을 기존 양방향 병렬 코퍼스에 추가하여 훈련에 사용 

  (ex>  기존에 훈련된 한 -> 영 번역기에 기계번역해, 한영 합성 병렬 코퍼스를 만들고, 기존에 수집한 오리지널 한영 병렬 코퍼스와 합쳐서 영->한 번역기의 훈련에 사용)

- 번역기를 하나 만들면 하나의 병렬 코퍼스로 두 개의 번역 모델을 만들 수 있는데, 이 두개의 모델을 서로 보완하여 성능을 향상

- 단, 합성 병렬 코퍼스가 너무 많아지면 문제가 생길 수 있어 양을 제한해야 함

 

 

*end2end모델이란 중간의 특징 추출 과정없이 인풋과 아웃풋데이터만 넣어주면 알아서 학습하는 것을 말하는데, 하나의 end2end모델에서 여러 언어쌍 번역을 동시에 제공한다는 것은 한국어->영어만 넣어줘도, 한국어->독일어->영어의 효과를 나타낸다는 것을 의미함

 

4) 반대 방향 번역기 활용 없이 단일 언어 코퍼스 활용 Copied Translation

- 더미 문장 활용 방식에서 좀 더 발전
- 소스와 타깃에 동일 데이터를 넣어 훈련하는데 드롭아웃 하지 않아도 되는 장점 
- 보통 back translation과 함께 사용됨

 

-> 최근에는 구현의 용이성과 효율성으로 back translation과 copied translation이 가장 많이 쓰임

 

3. 트랜스포머

- 구글의 [Attention is all you need] 논문에서 제안됨

- (RNN없이) 어텐션 연산만을 활용해 seq2seq를 구현하면서 성능과 속도 두마리 토끼를 잡음

 

- 포지션 임베딩 : 단어의 위치/순서 정보를 부여. 단어 임베딩 벡터 차원과 같음. 포지션 임베딩과 문장 임베딩 행렬을 더하여 인코더/디코더의 입력으로 넘겨줌

   ㅇ RNN은 데이터를 순차적으로 받으며 자동으로 순서에 대한 정보를 기록하지만 트랜스포머는 RNN을 이용하지 않으므로 순서 정보를 단어와 함께 주어야 함

 

4. 마치며

- 데이터가 많을수록 좋겠지만, 병렬코퍼스는 수집이 어렵고 제한적임

  단일 언어 코퍼스를 활용해 번역 성능을 향상 시킬 수 있음

- 트랜스포머는 어텐션만을 사용해 seq2seq을 구현하여 성능과 속도를 모두 높일 수 있었음

 

 

*end2end모델이란 중간의 특징 추출 과정없이 인풋과 아웃풋데이터만 넣어주면 알아서 학습하는 것을 말하는데, 하나의 end2end모델에서 여러 언어쌍 번역을 동시에 제공한다는 것은 한국어->영어만 넣어줘도, 한국어->독일어->영어의 효과를 나타낸다는 것을 의미함

본 내용은 '김기현의 자연어 처리 딥러닝 캠프(한빛미디어)'를 정리한 내용입니다.

 

"문장을 확률로(언어 모델) 나타내 자연어를 생성하거나 여러가지 자연어 문제의 성능을 올릴 수 있다."

 

* 학습 목표 : 언어 모델이란?(정의, 평가방법, 활용)


1. 언어 모델이란?

1) 언어 모델(LM Language Model) : 문장의 확률을 나타내는 모델

- 단어의 나열(문장)에 확률을 부여하여, 그 문장이 일어날 가능성이 어느정도인지

  (얼마나 자연스러운 문장인지) 확률로 평가하는 것

  ex> You say goodbye : 0.092 

        You say good die : 0.0000000032

 

2) 문장의 확률 표현

- 위 식에서, 문장의 확률(좌항)은 이전 단어들의 사후 확률(우항)으로부터 계산할 수 있음

- 문장 이 길어지면 곱셈이 많아지며 확률이 매우 낮아져 정확한 계산이나 표현이 어려워지고 연산속도도 느려짐

  이 때, 로그를 취해 덧셈으로 바꾸면 더 나은 조건을 취할 수 있음 (↓)

- 이 때, 이전 단어들의 사후 확률(첫번째 식 우항)은 아래식과 같이 단어 조합의 출현 빈도를 구해 추정할 수 있음

 

3) 한국어의 언어 모델 표현은 훨씬 어려움

  (1) 교착어(접사/조사에 따라 의미/역할이 달라짐)이기 때문에 희소성 증가

      (ex> 과학+자, 과학+실, 학교+에, 학교+를)

  (2) 단어의 어순이 중요하지 않아 단어 간의 확률 계산에 불리

      (ex> 나는 학교에 간다. 버스를 타고.

             나는 버스를 타고 학교에 간다.

             버스를 타고 나는 학교에 간다.

             위 경우, '타고' 뒤에 '., 학교에, 나는' 3가지 경우가 올 수 있어 확률이 퍼지는 현상이 나타남)

       

 

2. n-gram

- 전체 단어 조합이 아니라 일부 단어 조합의 출현 빈도만 계산하여 확률을 추정하는 방법(희소성 해결)

  (전체 단어 조합의 경우, 아예 출현 빈도를 구할 수 없거나, 확률이 너무 낮아져버림)

 

1) n-gram과 마르코프 가정

- 마르코프 가정 : 특정 시점의 상태 확률은 그 직전 상태에만 의존한다.

  즉, 앞서 출현한 모든 단어를 볼 필요없이 앞의 k개만 보고 다음 단어의 출현 확률을 구하는 것

- k = 0 : unigram

  k = 1 : bi-gram

  k = 2 : tri-gram

- 훈련 코퍼스의 양이 적당하다면 대부분 3-gram을 사용

=> 문장 전체의 확률에 대해(훈련 코퍼스 내에 해당 문장이 존재한 적이 없어도) 마르코프 가정을 통해

     해당 문장의 확률을 근사할 수 있게됨(훈련 코퍼스에서 보지 못한 문장도 확률 추정 가능) 

 

2) 언어 모델을 일반화하는 방법

- 일반화 : 좋은 머신러닝은 훈련 데이터에서 보지 못한 샘플의 예측 능력(일반화 능력)에 의해 좌우됨

   (1) 스무딩과 디스카운팅

     - 문제 : 출현 빈도를 확률값으로 추정할 경우, 훈련 코퍼스에 출현하지 않는 단어 시퀀스에 대한 대처 능력이 떨어짐

     - 해결책 : 출현하지 않았다고 확률을 0으로 추정하는 것이 아니라 빈도값이나 확률값을 다듬어 줘야 함

                  → 스무딩, 디스카운팅 : 들쭉날쭉한 출현 횟수 값을 부드럽게 해주는 것

     - 방법 : 모든 단어 시퀀스 출현 빈도에 1(혹은 상수값)을 더하기 

   

   (2) Kneser-Ney 디스카운팅

     - 해결책 : 다양한 단어 뒤에 나타나는 단어일수록 훈련 코퍼스에서 보지 못한 단어 시퀀스로 나타날 가능성이 높다!

       (ex> 딥러닝 책의 경우, learning과 book이라는 단어 중에서

              machine, deep, supervised, generative... : learning

              slim, favorite, fancy, expensive, chaep... : book

              book이 훈련 코퍼스에서 보지 못한 단어 시퀀스에서 나타날 확률이 더 높다고 가정하고 점수를 더 주는 것)

   

   (3) 인터폴레이션

     - 인터폴레이션 : 두 개의 다른 언어 모델을 선형적으로 일정 비율 섞어주는 것

     - 특정 영역에 특화된 언어 모델 구축 시 유용한데, 일반 영역의 코퍼스를 통해 구축한 언어 모델을 특정 영역의

       작은 코퍼스로 만든 언어 모델과 섞어주어 특정 영역에 특화된 언어 모델을 강화 할 수 있음. 상호보완적 역할

   

   (4) 백오프

     - n-gram의 확률을 n보다 더 작은 시퀀스에 대해 확률을 구해 인터폴레이션 하는 것

       (ex> 3-gram 확률은 2-gram, 1-gram 확률을 인터폴레이션)

     - n보다 더 작은 시퀀스를 활용해 더 높은 스무딩, 일반화 효과 가능

 

4) 결론

n-gram 방식은 출현 빈도를 통해 확률을 근사해 매우 쉽고 간편함. 하지만 단점도 명확해 훈련 코퍼스에 등장하지 않은 단어 시퀀스는 확률을 정확하게 알 수 없음. 이를 해결하기 위해 마르코프 가정을 통해 단어 조합에 필요한 조건을 간소화하고, 스무딩과 백오프 방식을 통해 남은 단점을 보완함. 워낙 간단하고 명확해 성공적으로 음성 인식이나 기계번역에 정착해 십 수 년 동안 쓰여져 옴. 하지만 여전히 근본적인 해결책은 아니라 한계가 있음. 딥러닝 시대인 지금도 n-gram은 여전히 강력하게 활용됨. 문장을 생성하는 문제가 아니라 주어진 문장의 유창성을 채점하는 경우, 굳이 복잡한 신경망없이도 n-gram 방식으로 좋은 성능을 낼 수 있음

 

 

3. 언어 모델의 평가 방법

- 좋은 언어 모델이란?

  실제 우리가 쓰는 언어와 최대한 비슷하게 확률 분포를 근사하는 모델

  많이 쓰는 문장은 확률 높게, 적게 쓰는 문장은 확률 적게

 

1) 퍼플렉서티(PPL : perplexity)

- 문장의 길이를 반영하여 확률값을 정규화한 값

- 확률값이 높을수록 PPL은 작아짐, PPL 수치가 낮을 수록 좋음

- 의미 : 뻗어나갈 수 있는 경우의 수 

  (ex> ppl 30인 경우, 평균 30개의 후보 단어 중에 다음 단어를 선택할 수 있다는 이야기)

- 엔트로피와 PPL의 관계는 아래식과 같음.

  MLE를 통해 파라미터를 학습할 때, 교차 엔트로피를 통해 얻은 손실값에 exp를 취하여 PPL을 얻을 수 있다는 것

4. NNLM

- n-gram기반 언어 모델은 간편하지만, 단어간 유사도를 모르기 때문에, 훈련 데이터에서 못 본 단어 조합에는 취약함

- 신경망은 단어 임베딩을 사용하여 단어를 차원 축소해 단어간의 유사도를 알 수 잇고, 훈련 코퍼스에서 보지 못했던 단어의 조합을 만나더라도 비슷한 훈련 데이터로부터 배운 것과 유사하게 대처할 수 있음. 즉, 희소성 해소를 통해 좋은 일반화 성능을 가질 수 있음

 

5. 언어 모델의 활용

- 언어 모델을 단독으로 사용하는 경우는 거의 없지만, 자연어 생성의 가장 기본이 되는 모델이기 때문에 중요함

- 음성인식 정확도 상승(음성 인식한 후 여러 후보들 중에서 선정 가능), 자연스러운 기계번역 문장 생성, 광학문자인식    시 더 높은 성능 획득 가능

- 기타 자연어 생성 문제 : 뉴스 기사 쓰기, 뉴스 기사 요약해 제목 짓기, 사용자 응답 따라 대답 생성하는 챗봇

- 검색엔진의 드롭다운

 

6. 정리

- 주어진 문장을 확률적으로 모델링하는 방법인 언어모델의 필요성은 딥러닝 이전부터 꾸준히 있었음. n-gram 방법론을 통해 많은 곳에서 활용되어왔지만 단어를 불연속적으로 취급하다보니 희소성 문제를 해결하지 못해 일반화 능력에서 어려움이 있었음. 마르코프 가정, 스무딩 등을 통해 단점을 보완하고자 했지만 완벽한 해결책이 될 수는 없음

- 신경망을 통해 언어모델링을 수행하면 일반화 문제는 해결됨. 신경망은 비선형적 차원 축소에 매우 뛰어난 성능을 가지므로, 희소한 단어들의 조합에 대해서도 효과적으로 차원 축소하여 기존 훈련 데이터 내의 다른 단어 조합에 대한 유사도 비교 등을 훌륭하게 수행함. 따라서 추론 수행 과정에서 처음 보는 시퀀스의 데이터가 주어져도 기존에 자신이 배운 것을 기반으로 훌륭하게 예측

본 내용은 '김기현의 자연어 처리 딥러닝 캠프(한빛미디어)'를 정리한 내용입니다.

 

"압축과 정보 추출을 용이하게 하는 "신경망을 통해 훨씬 더 정확하게 단어의 특징 벡터를 표현" 할 수 있다!"

 

* 학습 목표 : 신경망을 통해 특징 벡터를 표현하는 방법과 word2vec, GloVe 학습

 


1. 단어 임베딩과 차원 축소

1) 단어 임베딩 : 단어를 컴퓨터가 이해할 수 있는 형태(feature vector)로 변환하는 과정

- 앞서(5장) 코퍼스로부터 단어의 특징(출현 빈도 등)을 추출해 벡터로 만드는 과정을 봤지만,

  여전히 고차원의 희소벡터라는 문제점이 있음

  → 차원 축소로 해결하자!

 

2) 차원 축소

방법 1. PCA(주성분분석)

- 대표적으로 PCA 방법을 통해 차원을 축소할 수 있음

- 데이터를 구성하는 핵심 축 방향으로 차원을 감소시키는 것

- 하지만, 주성분은 직선/평면으로 정보의 손실이 나타남

 

방법 2. 신경망(매니폴드 가설, 오토인코더)

- 매니폴드(다양체) 가설 : 높은 차원에 존재하는 데이터를 아우르는 낮은 차원의 다양체가 존재한다는 가설

- 적은 정보의 손실로 차원을 축소할 수 있음

  → 딥러닝도 매니폴드를 찾는 과정과 동일하고, 비선형적 방식으로 차원을 축소하기 때문에 효과적(정보의 손실 적음)

http://kh-kim.gitbook.io/natural-language-processing-with-pytorch/00-cover-5/02-dimension-reduction

 

- 오토인코더 : 데이터에 대한 효율적인 압축을 신경망을 통해 자동으로 학습하는 모델

  오토인코더의 인풋으로 TF-IDF 등을 활용해 계산한 희소 단어 특징 벡터를 넣고,

  같은 출력값을 갖도록 훈련하여 오토인코더 병목 계층(z) 결괏값을 덴스 단어 임베딩 벡터로 사용

http://kh-kim.gitbook.io/natural-language-processing-with-pytorch/00-cover-5/02-dimension-reduction

2. word2vec

1) 언제 사용할까?

- 준비된 코퍼스의 양이 너무 적고, 외부로부터 많은 양의 말뭉치를 통해 미리 훈련한 단어 임베딩 벡터를 구하는 경우

- 임베딩 계층을 사용해 word2vec을 사용하지 않아도 문제의 특징에 맞는 단어 임베딩 벡터를 구할 수 있음

   → 텍스트 분류, 언어 모델, 번역 등 문제의 특징을 고려해 단어 임베딩 벡터를 사용!

* 임베딩 계층 : 임베딩 계층의 가중치와 원핫인코딩 벡터를 곱해 임베딩 벡터 추출. 실제로는 곱하지 않고 검색해 사용

http://kh-kim.gitbook.io/natural-language-processing-with-pytorch/00-cover-5/03-myth

 

2) word2vec

- 가정 : 함께 등장하는 단어가 비슷할수록 비슷한 벡터 값을 가진다

- 특정 단어를 기준으로 주변 단어들을 사용해 단어 임베딩 학습

- 사전 확률이 낮은(출현 빈도가 적은) 단어의 학습 기회가 적다는 단점 

 

2-1) CBOW

- 입력 : 주변 단어들의 원핫인코딩 벡터 / 출력 : 대상 단어

- 가중치(W_in, W_out)가 단어 분산 표현

  ㅇ W_in, W_out 모두 단어 분산 표현이 될 수 있지만, 주로 입력층의 가중치를 이용하는 경우가 많음(특히 skip-gram)

  ㅇ GloVe에서는 두 가중치를 더했을 때 좋은 결과

 

출처 : 밑바닥부터 배우는 딥러닝 2

2-2) skip-gram

- 입력 : 대상 단어의 원핫인코딩 벡터 / 출력 : 주변 단어

- 단어 분산 표현의 정밀도 면에서 skip-gram이 CBOW보다 좋은 경우 많음

  특히 말뭉치가 커질수록 저빈도 단어나 유추 문제 성능면에서 skip-gram이 더 뛰어난 경향

  하지만, 학습 속도 면에서는 CBOW 모델이 더 빠름

출처 : 밑바닥부터 배우는 딥러닝 2

 

 

 

3) 예제

- 단어 임베딩 벡터 훈련 기능 제공 공개 라이브러리

  ㅇ Gensim : 공개 연혁이 오래되어 학습 속도 느림

  ㅇ Fasttext : 빠른 속도

 

3. GloVe

- 추론 기반 기법과 통계 기반 기법을 융합한 모델

- 말뭉치 전체의 통계 정보를 손실 함수에 도입해 학습

- 대상 단어가 코퍼스에 함께 나타난 단어별 출현 빈도를 예측하게 함

  ㅇ 분류 문제가 아닌 출현 빈도를 근사하는 회귀 문제가 되어 평균오차제곱(MSE) 사용

  ㅇ 출력 벡터가 Cx(단어 x와 함께 코퍼스에 출현했던 모든 단어의 동시 출현 빈도를 나타낸 벡터)를 근사하도록 해            둘의 차잇값인 손실을 최소화하도록 역전파 및 경사하강법을 통해 학습

 

- 코퍼스 전체에서 대상 단어와 주변 단어를 가져와 학습하는 과정을 반복하는 skip-gram과 달리, 처음 코퍼스를 통해 단어별 동시 출현 빈도를 조사해 출현 빈도 행렬을 만들고, 이후에는 해당 행렬을 통해 동시 출현 빈도를 근사하기 때문에 학습 속도가 훨씬 빠름

 

* 통계 기반 기법 : 주변 단어의 빈도를 기초로 단어 표현. 말뭉치 전체 통계로 1회 학습해 분산 표현을 얻음

* 추론 기반 기법 : 말뭉치 일부를 여러 번 보며 학습(미니배치 학습). 통계 기반 기법이 주로 단어의 유사성을 인코딩하는 것에서 나아가 한층 복잡한 단어 사이의 패턴까지도 인코딩 할 수 있음(king-man+woman=queen 가능)

 

 

4. 정리

- 신경망은 비선형적인 차원 축소를 통해 단어의 특징을 효율적으로 추출할 수 있음

- 하지만, 딥러닝 비선형 축소는 계산비용이 비싸고 최적화가 어려움. word2vec은 비선형적인 방법 없이도 매우 좋은        단어 임베딩을 구현했고, GloVe는 더 빠르고 정화한 단어 임베딩 방법을 제시함

- 단, 텍스트 분류/자연어 생성 등 기법에서는 단어 임베딩 알고리즘보다 단순 임베딩 계층을 사용하는 편이 더 정확,        효율적. 해결하고자 하는 문제의 특성에 맞는 단어 임베딩 방법을 사용할 것!

 

+ Recent posts