본문 바로가기
  • GDG on campus Ewha Tech Blog
3-2기 스터디/NLP 입문

[4주차] NLP Chapter 4. word2vec 속도 개선 ~ 5.2 RNN이란

by 근0 2022. 5. 2.

이 포스트는 "밑바닥부터 시작하는 딥러닝2 - 파이썬으로 직접 구현하며 배우는 순환 신경망과 자연어 처리 (한빛미디어, 사이토 고키 지음)" 책을 기반으로 공부해서 정리한 내용이다.

Chapter4: word2vec 속도 개선

4.1 word2vec 개선(1) & 4.2 word2vec 개선(2)

  • 앞 장에서 구현한 간단한 word2vec의 CBOW 모델의 문제점: 말뭉치 크기가 많이 크다면 그에 따라 계산량도 굉장히 많아진다 (아래와 같은 예시)

  • 입력층의 원핫 표현과 가중치 W_in의 곱 계산 <- Embedding 계층 도입
    - 기존의 원핫 표현과 MatMul 계층의 가중치 곱은 결국 가중치 행렬의 특정 행을 추출하는 것

- 사실상 계산이 필요없으므로 가중치 행렬으로부터 단어 id에 해당하는 행을 추출하는 계층인 Embedding 계층을 MatMul 계층 대신 도입
++ 단어의 밀집벡터 표현을 -> 단어 임베딩 or 단어의 분산 표현 (통계기반기법-> distributional representation, 신경망 추론기반기법 -> distributed representation)
- 순전파 & 역전파

 

-  미니배치 처리일 때 idx에 중복된 원소가 있을 수 있으므로 역전파시 idx가 가리키는 장소에 할당이 아닌 더하기를 해야 함
-> 이렇게 함으로써 메모리 사용량 ⬇️, 계산량도 ⬇️

  • 은닉층과 가중치 W_out의 곱 및 softmax 계산 <- Negative Sampling 손실 함수 도입
    - softmax 대신 negative sampling 사용하여 말뭉치가 커지더라도 계산량을 낮은 수준에서 일정하게 억제 가능
    - 핵심: 다중 분류 -> 이중 분류(출력층 뉴런 하나만 필요)
    (ex: "맥락이 'you'와 'goodbye'일 때 타깃 단어는 'say' 입니까?" yes/no)

- 단어 하나에 대해서만 그 점수를 계산 -> sigmoid 활성화 함수(0~1 사이의 값 출력) -> 확률
++ 다중 분류 경우: softmax, 교차 엔트로피 오차 / 이중 분류 경우: sigmoid, 교차 엔트로피 오차

- 정답 레이블 t: 정답이면 1, -logy 출력 / 오답이면 0, -log(1-y) 출력

  • - 역전파의 값 y-t : 정답일 경우 y, 신경망이 출력한 확률이 1(100%)에 가까울수록 오차 감소
    - 오차가 앞으로 흘러가기 때문에 오차가 크면 크게 학습, 오차가 작으면 작게 학습!
    - 이 이진 분류의 답이 오답이라면 정답 레이블에 0 입력
    - 정답일 경우 sigmoid 계층 출력이 1에 가깝고 오답일 경우에는 0에 가까워야 한다.
    - 하지만 오답인 경우를 모두 학습시키면 어휘 수 증가에 따른 문제점이 또 발생하므로 몇 개의 어휘만을 샘플링 한다 -> negative sampling
    - 말뭉치의 통계 데이터를 기초로 샘플링(확률분포대로) -> 자주 등장하면 많이 추출
    ++이 때 확률 분포에 0.75와 같은 수치를 곱해야 한다 -> 회소한 단어 또한 버리지 않기 위해
    ++unigram: 하나의 연속된 단어, bigram, trigram
    - negative sampling 최종 손실 = 정답인 경우 손실 + 샘플링 된 오답인 경우 손실

4.3 개선판 word2vec 학습

  • Embedding 계층, Negative Sampling Loss 계층 적용
  • PTB 데이터셋으로 학습
  • 맥락의 윈도우 크기 임의로 조정 가능
  • W_in, W_out 같은 형상(Negative Sampling Loss에서 Embedding을 사용)
  • 원핫 벡터가 아닌 단어 id를 인수로
    ++ 말뭉치에 따라 다르나 윈도우 크기는 2~10개, 은닉층의 뉴런 수(단어의 분산 표현 차원 수)는 50~500개면 좋은 결과
    ++python pickle
  • CBOW 모델 평가
    - 동의어, 유의어
    - 유추(비유) 문제 (ex. man:king = woman: ?)
    - 유추 문제를 벡터의 덧셈과 뺄샘으로 해결
    - 벡터 공간에서 man -> woman 벡터와 king -> ? 벡터가 가능한 한 가까워지는 단어 찾기
    - 시제 정보, 단수형과 복수형, 비교급 성질(의미 뿐만 아니라 문법적인 패턴도)

4.4 word2vec 남은 주제

  • 전이 학습(transfer learning): word2vec의 단어 분산 표현 -> 텍스트 분류, 문서 클러스터링, 감정 분석 등 다양하게 적용 가능
  • 단어/문장을 고정 길이 ⭐️벡터⭐️로 변환 가능 (ex. bag-of-words: 단어의 순서를 고려 X)
  • 단어의 분산 표현 학습과 머신러닝 시스템의 학습은 서로 다른 데이터셋을 사용해 개별적으로 수행하는 것이 일반적, 직면한 문제의 학습 데이터가 아주 많을 경우 단어 분산 표현과 머신러닝 시스템 학습 모두를 처음부터 수행하는 방안도 고려 가능
  • 단어 벡터 평가 방법
    - 궁극적으로 원하는 건 정확도 높은 시스템(여러 시스템으로 구성, ex: 단어의 분산 표현 만드는 시스템 + 특정 문제에 대해 분류를 수행하는 시스템)
    - 단어의 분산 표현의 차원 수가 시스템에 어떤 영향을 주는지?
    • 단어의 분산 표현 학습 -> 분산 표현 바탕으로 머신 러닝 시스템 학습 -> 평가, 하이퍼파라미터 조정, 시간 매우 오래 걸림
      -> 단어의 분산 표현의 우수성을 실제 전체 시스템과 분리해 평가
  • 평가 척도: 단어의 유사성, 유추 문제(단어의 의미나 문법적인 문제를 제대로 이해하고 있는지)
    - 모델에 따라 정확도 다름
    - 일반적으로 말뭉치가 클수록 결과 좋음
    - 단어 벡터 차원 수는 적당한 크기가 좋음
    -> 유추 문제에 의한 평가가 높다고 반드시 전체 시스템이 높은 정확도를 갖는다는 것은 아님

 

Chapter5: 순환 신경망(RNN)

  • Feed Forward 신경망: 흐름이 단방향, 구성이 단순, 많은 문제 응용 가능 but 시계열 데이터의 패턴을 충분히 학습할 수 없다 -> 순환 신경망(RNN) 등장

5.1 확률과 언어 모델

  • 윈도우 크기가 1인 CBOW 모델의 사후 확률 모델링
  • 좌우 비대칭으로도 윈도우 크기 설정 가능(ex:왼쪽 2, 오른쪽 0)
  • CBOW 모델의 학습 -> 손실 함수를 최소화하는 가중치 매개변수 찾기 -> 학습의 부산물인 단어의 분산 표현 얻기
  • 언어 모델(Language Model): 단어 나열에 확률을 부여, 특정한 단어의 시퀀스에 대해 그 시퀀스가 일어날 가능성이 어느 정도인지, 얼마나 자연스러운 시퀀스인지 확률로 평가
    ex) 기계 번역, 음성 인식(문장으로써 자연스러운지를 기준으로 순서 매김), 새로운 문장을 생성(확률분포에 따른 적한한 단어 샘플링 가능)
    - 언어 모델의 동시 확률 = 사후 확률의 총곱(타깃 단어보다 왼쪽에 있는 모든 단어를 맥락으로)
    - 조건부 언어 모델
    - 위의 사후 확률을 어떻게 구할 수 있을까?
    - CBOW에서는 맥락의 크기를 특정 값으로 한정하여 근사적으로 나타낼 수 있다
    여기서는 왼쪽 2개 단어로 한정
    2층 마르코프 연쇄(Markov Chain: 미래의 상태가 현재 상태에만 의존해 결정되는 것)
    -> 결국 특정 길이로 고정, 긴 맥락이 필요한 문제에 제대로 된 답을 도출 못함, 맥락 크기를 키울 수는 있으나 맥락 안의 단어 순서가 무시된다(bag-of-words)
  • 일반 CBOW 모델: 은닉층에서 더해지므로 순서 무시
  • 은닉층 연결(맥락의 단어 순서 고려) <- 신경 확률론적 언어 모델
    but 맥락의 크기에 비례해 가중치 매개변수 증가
    -> 해결책: RNN, 맥락이 아무리 길더라도 맥락 정보를 기억하는 매커니즘 -> 긴 시계열 데이터 대응 가능

++ word2vec: 단어의 분사 표현을 얻을 목적으로 고안된 기법, 언어 모델로 사용하는 경우는 잘 없음
RNN 이후에 word2vec 제안, RNN으로도 단어의 분산 표현 얻을 순 있으나 개선된 word2vec

5.2 RNN이란

  • 순환 신경망: 닫힌 경로 필요 -> 데이터가 순환하면서 정보가 끊임없이 갱신 + 과거 정보 기억
  • 출력이 2개로 분기하여 하나는 다시 입력으로
  • 시계열 데이터: 시간 방향으로 데이터 나열
  • 현 계층으로의 입력 + 전 계층의 출력을 입력 받음
  • 위의 값으로 갱신된다
  • RNN 계층: 상태를 가지는 계층, 메모리가 있는 계층 / h(t): 은닉 상태, 은닉 상태 벡터

++ Recursive Neural Network: 트리 구조 데이터를 처리하기 위한 신경망

  • 시간 방향으로 펼친 신경망의 오차역전파법 -> BPTT(Backpropagation Through Time)
    - 시계열 데이터의 시간 크기가 너무 크면 계산량과 메모리 사용량 등 문제
    - 계층이 길어짐에 따라 기울기 값이 조금씩 작아져 역전파되기 전에 0이 되어 소멸 가능
    -> Truncated BPTT(적당한 길이로 역전파의 연결을 잘라냄)
  • 순전파의 연결은 끊어지지 않고(데이터를 시간 순서대로 입력해야) 연전파의 연결만 끊어진다, 한 블록 안에서만 역전파 수행하면 된다
  • Truncated BPTT 미니배치 학습
  • 데이터 입력 시작 위치를 각 미니배치의 시작 위치로 이동, 데이터를 순서대로 입력하다가 끝에 도달하면 다시 처음부터 입력
    ⭐️데이터를 순서대로 제공, 미니배치별로 데이터를 제공하는 시작 위치 옮기기⭐️

 

______________________________________________________________________________________________________

학습한 코드는 여기에서
https://github.com/syi07030/NLP_study
위 코드는 이 책의 코드와 아래의 코드를 바탕으로 작성했습니다.
https://github.com/WegraLee/deep-learning-from-scratch-2
사진 출처 또한 여기에서: https://github.com/WegraLee/deep-learning-from-scratch-2

댓글