Data Science: 자연어 처리 (Natural Language Processing)

2021. 8. 14. 17:57AI/Machine learning

    목차
반응형

자연어 처리?

한국어와 영어 등 우리가 평소에 쓰는 말을 자연어라고 하며, 이를 처리하는 분야가 자연어 처리임
자연어를 컴퓨터가 이해하도록 만들어 우리에게 도움이 되는 일을 수행하게 하는 것이 NLP

 

thesaurus (시소러스)

표준국어대사전(:각각의 단어에 그 의미를 설명) 처럼, 일반적인 사전이 아닌 사전
기본적으로 유의어 사전
뜻이 같은 단어(동의어)나 뜻이 비슷한 단어(유의어) 가 한 그룹으로 분류 됨

 

시소러스의 문제점

수정이 힘듦
시대가 변하면 신조어가 생기고, 단어가 없어지기도 함

만드는데 많은 노력이 필요함
WordNet 에 등록된 단어는 20만개 이상

이를 피하기 위해
통계 기반 기법
신경망을 사용한 '추론 기반 기법'을 사용

-> 단어의 의미를 자동으로 추출
이는 영상 인식에서 feature 추출과 유사

 

통계 기반 기법

corpus(말뭉치)
특정 분야를 위해 모은 text data
말뭉치에서 자동으로 핵심을 추출

 

전처리

  • 구둣점이 단어로 인식 되지 않도록 앞에 공백 추가
  • 공백 단위로 분리 (tokenization)
  • 불용어(stopword)를 제거

 

단어의 분산 표현

단어도 vector로 표현
distributional representation (분산 표현)
-> 고정길이의 dense vector로 표현함 (대부분의 원소가 0이 아닌 실수인 vector)

 

분포 가설

"단어의 의미는 주변 단어에 의해 형성된다"
이것이 분포 가설 (distributional hypothesis)

We drink wine
drink 주변에는 음료가 등장할 가능성이 높다.

We guzzle wine
guzzle은 drink와 같은 맥락에서 사용됨을 알 수 있다.

window size가 2인 '맥락'
그 좌우의 두 단어(총 네 단어)를 맥락으로 이용함
즉, 2-gram

 

동시발생 행렬 (co-occurrence matrix)

어떤 단어에 대해 주변에 다른 어떤 단어들이 몇 번 등장했는지 count
-> statistical based(통계기반) 기법

맥락에 해당하는 단어의 빈도

 

1-gram

you
            you say goodbye and i say hello 
            ---  ^
             |   |
             +---+

                you say goodbye and i say hello .
            you 0   1   0       0   0 0     0

you = [0, 1, 0, 0, 0, 0, 0]

 

say

            you say goodbye and i say hello 
             ^  ---    ^        ^ ---   ^
             |   ||    |        |  ||   |
             +---++----+        +--++---+

say = [1, 0, 1, 0, 1, 1, 0]

동시발생 행렬 (co-occurrence matrix)

                 you  say   goodbye  and  i  hello  .
        you      0    1     0        0    0  0      0
        say      1    0     1        0    1  1      0
        goodbye  0    1     0        1    0  0      0
        and      0    0     1        0    1  0      0
        i        0    1     0        1    0  0      0
        hello    0    1     0        0    0  0      1
        .        0    0     0        0    0  1      0

 

벡터 간 유사도

벡터의 내적 혹은 Euclidean distance로 유사도를 측정
이외에도 cosine similarity등을 사용

 

* cosine similarity
두 vector가 가리키는 방향이 얼마나 비슷한지 정도
1이면 동일
-1이면 완전 반대

검색어의 단어 벡터와 다른 모든 단어 벡터와의 코사인 유사도를 각각 계산
계산한 코사인 유사도 결과를 기준으로 값이 높은 순서대로 출력

 

ex. you에 대한 유사도 순위를 출력
you와 다른 단어들 모두와 유사도를 계산하고 유사성이 높은 순서대로 출력

 

통계 기반 기법 개선

상호정보량

“the”, “car”의 경우 두 단어의 동시발생 횟수는 높음.
“car”와 “drive”는 관련이 있음

 

그러나 단순히 등장 횟수만을 고려하면, “car”는 “drive”보다는 “the”와의 관련성이 더 높게 나옴.

점별 상호정보량 Pointwie Mutual Information (PMI)라는 척도를 사용하여 문제 해결

 

PMI(x,y) = log2 P(x,y) / P(x)P(y)

교집합의 ratio
높을수록 동시 발생 확률이 높음

10,000 개의 단어로 이뤄진 corpus에서 the가 100번 등장하면, P(‘the’) = 0.01
‘the’와 ‘car’가 10번 동시발생했다면, P(‘the’, ‘car’) = 10/10,000 = 0.001

PMI(x,y) = log2 C(x,y) x N / C(x)C(y)

와 같이 식을 단순화 시켜 계산 가능

분모에 단어 빈도가 들어가기에 많이 나오는 단어일수록 PMI 값은 낮아짐


PMI(the, car) = 2.32
PMI(car, drive) = 7.97

 

동시발생 횟수가 없다면 -INF

 

차원감소

차원 문제를 해결하기 위해서, 중요한 것 위주로 차원에 남기고 중요하지 않은 것들을 제거

SVD (Singular Vector Decomposition)

  • X = USV^T
  • X vector를 U, S, V 세 행렬의 곱으로 분해
    U와 V는 직교행렬
    S는 diagonal matrix
  • U: 단어공간의 기저 space를 형성
    S: 특잇값 <- 축의 중요도 (큰 값 순서대로 나열)

word2vec

  • 추론 기반 기법은 추측이 목적
  • 부산물로 단어의 분산 표현을 얻을 수 있음
  • word2vec은 추론 기반 기법이며 단순한 2층 신경망
  • word2vec의 구현 모델
    • skip-gram, CBOW
    • CBOW는 context에서 target(중심 단어)를 예측
    • Skip-gram은 target에서 contexts(주변 단어)를 예측
  • word2vec은 가중치로 다시 학습할 수 있어 단어 갱신 시 학습에 유리

CBOW: 중심단어 예측
Skip-gram: 주변단어 예측

 

추론 기반 기법

단어를 벡터로 표현하는 방법

 

통계 기반 기법의 문제점

통계 기반 기법은 단어의 출현 빈도를 기준으로 표현
DTM (Document Term Matrix)

    -    과일이 길고  노란  먹고  바나나 사과  싶은  저는  좋아요
    문서1 0     0    0     1     0     1    1    0    0
    문서2 0     0    0     1     1     0    1    0    0
    문서3 0     1    1     0     2     0    0    0    0
    문서4 1     0    0     0     0     0    0    1    1

이를 SVD를 적용하여 밀집벡터 (단어의 분산 표현)을 얻음

 

문제점
메모리, 속도의 문제

  • 메모리 사용량
    • 대규모 corpus를 다룰 시, 어휘 수가 많기에 거대한 차원의 matrix가 필요함
    • 즉, 현실적인 방법이 아님 (ex. 어휘가 100만개면 100만 차원의 벡터로 각 문서를 표현해야 함)
  • 연산 속도
    • SVD의 time complexity: O(n^3)
    • 슈퍼 컴퓨터를 동원해도 처리 하기 어려운 수준
  • SGD 방식만 가능
    • Batch, mini-batch가 불가능
    • 늘 1 time에 전체를 처리 해야 함

신경망에 문장을 주되, 학습하고자 하는 단어의 위치를 비워서 문장을 입력하여 학습

모델로서 신경망을 사용
모델은 맥락 정보를 받고 각 단어의 출현 확률을 출력 (softmax)

 

신경망에서의 단어 처리

you, say 등을 ‘고정 길이의 벡터’로 변환해야 함

(you, say, goodbye, and, i, hello, .)
가 space이고,
you 의 경우 [1, 0, 0, 0, 0, 0, 0]
goodbye의 경우 [0, 0, 1, 0, 0, 0, 0]

  • 총 어휘 수만큼의 원소를 갖는 벡터를 준비
  • 단어 index가 같은 원소를 1로 나머지는 0으로

이렇게 하여 입력층의 뉴런 개수를 고정

 

단순한 word2vec

CBOW (Continuous Bag Of Word)

 

Bag of Words(BoW) <- word의 frequency

단어의 등장 순서를 고려하지 않는 빈도수 기반의 단어 표현 방법

 

ex.
"정부가 발표하는 물가상승률과 소비자가 느끼는 물가상승률은 다르다."
->
{'가': 2, '물가상승률': 2, '정부': 1, '발표': 1, '하는': 1, '과': 1, '소비자': 1, '느끼는': 1, '은': 1, '다르다': 1}

 

각 단어가 등장한 횟수를 수치화하는 텍스트 표현
단어의 등장 빈도를 통해 문서의 성격을 판단할때 사용됨

 

CBOW 신경망 구조

(you, say, goodbye, and, i, hello, .)를 각각 따로 입력으로 받음
즉, 입력층이 2개

 

Win(7x3) --> 은닉칭 --> W out(3x7)
Win(7x3)

 

모든 연결은 FCL

"7x3의 W (가중치) 행렬이 학습됨"

 

  • Win의 각 행은 단어의 분산 표현임
  • 학습을 진행할수록 맥락에서 출현하는 단어를 잘 추측하는 방향으로 이 W값이 갱신될 것임

 

예를들어, 이렇게 학습이 되면,
입력이 "you"에 대한 one-hot-vector가 들어오면, 출력으로 "say"가 나오는 확률이 가장 높게 학습될 수 있음.

Win과 Wout 에 단어의 출현 패턴을 파악한 벡터가 학습됨

  • Multi-class classifier가 되어야 하기에
    • Softmax layer와
    • Cross Entropy loss function이 필요함
      • 여기서 정답 label을 ex. [0, 1, 0, 0, 0, 0, 0]을 줘서 loss를 계산

 

word2vec의 가중치와 분산표현

Win, Wout의 가중치
Win의 각 행: 단어의 분산 표현 (행 단위로 저장)
Wout: 단어의 의미가 인코딩된 벡터들 (열 단위로 저장)

최종적으로 사용하는 가중치는 word2vec에서는 입력 측의 가중치만 이용

 

학습

You say goodbaye and I say hello 라는 한 문장짜리 corpus를 사용
Word2vec에서 이용하는 신경망의 입력은 ‘맥락’
이 ‘맥락’을 입력했을 때 ‘타깃’이 출현할 확률을 높이도록 함

You say goodbye and I say hello.
라는 말뭉치를 가지고 context와 target을 만들어야 함

  • you, goodbye -> say
  • say, and -> goodbye
  • goodbye, I -> and
    ...

각 단어를 직접 주지 않고 sample space 내 단어의 차원을 지정해서 입력
[0, 2] -> 1
[1, 3] -> 2
...

[[0 2]
[1 3]
[2 4]
[3 1]
[4 5]
[1 6]]

[1 2 3 4 1 5]

 

맥락과 타킷을 one-hot vector로 표현

신경망 처리를 위해 [0, 2]같은 입력을 one-hot vector로 변환
label인 1역시 one-hot vector로 변환

 

즉, 7차원의 0번, 2번 차원을 1로 만들어 입력으로 사용
7차원의 1번 차원을 1로 만들어 label로 사용

 

parameter 갱신은, SGD와 AdaGrad 같은 유명 알고리즘을 사용할 수 있음
Adam을 사용

 

학습이 진행될 수록 손실이 줄어듦

you [ 1.1850799  1.5069174 -1.1526543  0.8004383  1.0953863]
say [-1.1548733  -1.2162304   0.22438572 -1.205595   -1.1066525 ]
goodbye [ 0.7389878   0.17415817 -0.8969243   1.1819862   0.9081551 ]
and [-0.92003286 -1.1074499   1.924769   -1.0309802  -0.79065084]
i [ 0.7196404   0.18662961 -0.87568134  1.1717869   0.90631545]
hello [ 1.1961105   1.4972966  -1.1712347   0.81301403  1.1054945 ]
. [-1.0726244 -1.019004  -1.7413862 -1.021502  -1.0954931]

이 밀집벡터가 단어의 분산 표현
단어의 의미를 잘 파악한 벡터 표현

그러나 이런 작은 corpus로는 좋은 결과를 얻을 수 없음

 

CBOW 해설

CBOW 모델과 확률

P(⋅)로 확률 표현
 * 동시 확률: P(A, B)  동시에 A와 B가 일어날 확률
 * 사후 확률: P(A|B)  사건이 일어난 후의 확률 (B가 일어나고 A 가 일어날 확률)

 

... Wt-1 Wt Wt+1 ...

Wt의 발생 예측 확률
Wt-1과 wt+1이 주어질 시 wt를 예측

 

P(wt|wt-1, wt+1)


CBOW는 이 확률을 모델링 하는 것

 

Cross entropy loss를 적용

  • L = -∑tk logyk
  • Yk는 k번째 해당하는 사건이 일어날 확률
    tk는 정답 레이블 (원핫 벡터로 표현)

 

L = -log P(wt|wt-1, wt+1)

 

-이기에 negative log livelihood
  • 전체 corpus에 대한 loss
    • L = -1/T ∑log P(wt|wt-1, wt+1)

CBOW 모델의 학습은 이 loss의 값을 작게 만드는 것이 목표
이 때의 가중치 param이 얻고자 하는 단어의 “분산 표현” -> 학습되는 weight가 단어의 분산표현
Window 크기가 1인 경우만 고려했으나, 다른 크기 (m)이어도 수식으로 쉽게 표현 가능함.

 

Skip-gram model

skip-gram은 CBOW에서 다루는 contexts와 target을 뒤집은 모델
Skip-gram은 중앙의 target 단어로부터 주변의 여러 단어 (contexts)를 예측

 

즉, 입력층이 차원 벡처 1개이고, 출력층이 차원 벡터 2개

Skip-gram의 단어 분산 표현의 정밀도가 높음


Corpus가 커질수록 저빈도 단어나 유추 문제의 성능 면에서 더 뛰어남
단, 학습 속도가 CBOW 보다 느림 (비용 함수의 차이 때문)

 

통계 기반 vs. 추론기반

 통계 기반 기법
어휘 수정 시, 통계 기반 기법에서는 계산을 처음부터 다시 해야 함
단어의 분산 표현을 조금만 수정해도 DTM을 만들고 SVD를 수행해야 함
단어의 유사성이 인코딩 됨

 

 추론 기반 기법
추론 기반은 mini-batch 단위로 학습 가능
추론 기반 기법(word2vec)은 매개변수를 다시 학습할 수 있음
지금까지 학습한 가중치를 초깃값으로 사용하여 수정된 부분에 대해 다시 학습하면 됨
단어의 유사성 및 단어 사이의 패턴도 파악되어 인코딩 됨

 

Ex. King – man + woman = queen도 유구 가능

 

 

그러나 실제로 단어의 유사성을 정량 평가 시 추론 기반과 통계 기반 기법의 우열을 가릴 수 없다고 함
추론 기반 기법과 통계 기반 기법은 서로 관련되어 있음

Skip-gram은 negative sampling을 이용한 모델은 corpus 전체의 동시발생 행렬(DTM)에 특수한 행렬 분해를 적용한 것과 같음. 즉, 특정 조건 하에서 둘은 서로 유사

  • GloVe
    • word2vec + 통계기반 기법
    • corpus 전체의 통계 정보를 손실 함수에 도입하여 mini-batch로 학습

 

word2vec 속도 개선

  • word2vec은 어휘 수의 증가에 비례해 계산량이 증가함
    • corpus가 커질 수록 어휘량이 많아져(feature space가 커져서) 연산량이 증가
      • 근사치로 계산하는 기법 적용 필요
    • negative sampling
      • 부정 ex.를 다 사용하지 않고 몇 개 sampling 해서 사용 (하여 연산량을 줄임)
      • 다중 분류를 마치 이진 분류 loss처럼 계산
    • embedding layer
      • 단어의 분산표현을 담고 있음
      • 순전파 시 지정한 단어 id의 벡터를 추출

embedding이라는 계층 도입
negative sampling이라는 새로운 손실 함수 도입

 

병목 부분

  • 입력층에서 원합벡터와 Win의 곱
  • 은닉층에서 Wout의 곱과 softmax 계층의 계산

 

NLP에서 단어의 밀집 표현을

  • 단어 임베딩 혹은 분산 표현이라 함
    • 통계 기반 기법으로 얻은 벡터를 distributional representation
    • 추론 기반 기법으로 얻은 벡터를 distributed representation
  • Embedding layer을 정의
    • 단어의 분산 표현을 담고 있으며, 순전파 시 지정한 단어 id의 벡터를 추출

 

단어 ID에 해당하는 벡터를 추출하는 계층

softmax 계층의 계산은 negative sampling으로 개선
어휘가 아무리 많아져도 계산량을 낮은 수준에서 일정하게 억제할 수 있음


Multi-class classification을 binary classification으로 근사하는 것이 negative sampling

이전에는 출력층의 모든 단어를 대상으로 계산을 수행했으나, 여기서는 say라는 단어 하나만 가져와 계산하는 차이
Sigmoid로 점수를 확률로 변환

 

즉, 적은 수의 부정적 예를 sampling 하여 사용 -> negative sampling

긍정적 예의 손실을 구하고, 동시에 부정적 예를 몇 개 sampling 하여 마찬가지로 손실을 구함
그리고 각각의 긍정/부정 데이터의 손실을 더한 값을 최종 손실로 함

 

word2vec에서는 네거티브 샘플링 시 확률분포에서 기본 확률분포에 0.75를 제곱하라고 권고
출현 확률이 낮은 단어를 버리지 않기 위해 제곱함

 

word2vec appliations

  • 전이학습
    • 텍스트 분류, 문서 clustering, 품사 태그 달기, 감정 분석 등은 단어를 벡터로 변환해야 함
    • 학습된 분산 표현을 사용하면 이들에 좋은 결과를 가져다 줄 수 있음.
    • 고정 길이 벡터
      • 단어를 고정 길이 벡터로 변환
      • 문장도 단어의 분산 표현을 통해 고정 길이 벡터로 변환 가능
        • 가장 간단한 방법: Bag-of-words (순서 고려 안 함)

RNN을 사용할 경우 보다 세련된 방법으로 문장을 고정 길이 벡터로 변환 가능
자연어로 쓰여진 질문을 고정 길이 벡터로 변환하면, 이 벡터를 다른 머신러닝 시스템의 입력으로 사용할 수 있음.

 

감정 분류

입력 (ex. e-mail) -> word2vec (단어의 vector화) -> 감정분류 model -> 분류 결과

메일을 보고 모은 메일을 수동으로 labeling
이후 word2vec으로 메일을 벡터로 변환
이후 감정 분석 수행 ML model에 벡터화된 감정 label을 입력하여 학습

 

단어 벡터 평가 방법

단어의 분산 표현의 차원 수가 최종 정확도에 어떤 영향 을 주는지 파악
우선 단어의 분산 표현을 학습
분산 표현으로 다른 머신 러닝 시스템을 학습
즉, 두 단계의 학습을 수행해서 평가 -> 시간이 오래 걸림

 

그래서 단어의 분산 표현의 평가를 실제 application과 별개로 수행하는 것이 일반적임
이때 평가의 척도가 단어의 ‘유사성’ 혹은 ‘유추 문제’를 확용한 평가

  • 유사성 평가
    사람이 작성한 단어 유사도를 검증 세트를 사용해 평가
    Ex. Cat, animal은 8점, cat과 car는 2점

사람이 부여한 유사 점수와 word2vec에 의한 cosine similarity 점수를 비교해 그 상관성을 살핌

  • 유추 문제 평가
    King:queen = man:?
    같은 유추 문제를 출제하고 그 정답률로 단어의 분산 표현을 측정

 

RNN

지금까지 살펴변 신경망은 feed forward (앞먹임)이라는 유형의 신경망.
흐름이 단방향

Feed forward 모델은 시계열 데이터를 잘 다루지 못함
그래서 RNN(Recurrent Neural Network)가 등장함

  • RNN은 데이터를 순환시킴으로써 과거에서 현재, 그리고 미래로 데이터를 계속 흘려보냄
  • RNN 계층 내부에는 ‘은닉상태’를 기억하는 능력이 추가 되었음
  • RNN 언어모델
    • 언어모델은 단어 sequence에 확률을 부여
    • 특히 조건부 언어 모델은 지금까지의 단어 시퀀스로부터 다음에 출현할 단어의 확률을 계산

 

RNN은 이론적으로는 아무리 긴 시계열 데이터라도 중요 정보를 RNN의 은닉 상태에 기억해 둘 수 있으나, 실제로는 기울기 값의 감소 등으로 학습이 잘 안됨 그래서 Truncated BPTT로 학습을 수행

RNN의 문제점들을 개선할 수 있는 RNN 대체인 "LTSM" 이 있음

 

  • RNN은 순환하는 경로가 있고 내부에 ‘은닉 상태’를 기억할 수 있음
  • RNN의 순환 경로를 펼침으로써 다수의 RNN 계층이 연결된 신경망으로 해석될 수 있음
  • 보통의 오차 역전파법으로 학습 가능(BPTT)
    • 긴 시계열 데이터의 경우 적당한 길이씩 모아(block) 이 단위로 학습 (Truncated BPTT)
    • Truncated BPTT에서는 역전파의 연결만 끊음
  • Truncated BPTT에서는 순전파의 연결을 유지하기 위해 데이터를 순차적으로 입력해야 함
  • 언어 모델은 단어 시퀀스를 확률로 해석
  • RNN 계층을 이용한 조건부 언어 모델은 (이론적으로는) 그때까지 등장한 모든 단어의 정보를 기억

 

언어모델

단어 나열에 확률을 부여
특정 단어 sequence에서 그 sequence가 일어날 가능성을 확률로 평가

 

you say goodbye에 높은 확률인 0.092를 출력하고,
you say good die엔 낮은 확률인 0.000000000000032를 출력하는 것이 일종의 언어 모델

 

언어모델의 응용

  • 기계 번역
  • 음성 인식
    • 사람의 음성으로부터 몇 개의 문장을 후보로 생성
    • 이후 언어 모델을 사용해 후보 문장이 “문장으로서 자연스러운지”를 기준으로 score
  • 새로운 문장 생성
    • 언어 모델은 단어 순서의 자연스러움을 확률적으로 평가
    • 이 확률분포에 따라 다음으로 적합한 단어를 sampling (자아낼) 수 있음

 

언어모델의 수식적 표현
w1, w2, w3, …wm의 순서로 단어가 출현할 확률 P(w1, w2, … wm)
여러 사건이 동시에 일어날 확률 즉, 동시확률

확률의 곱셈정리를 사용하 m개 단어의 동시 확률을 사후 확률로 나타낼 수 있음
P(w1, ... wm-1, wm) = P(A, wm) = P(wm|A) P(A)

 

CBOW 모델을 언어 모델로

word2vec의 CBOW model을 언어 모델에 적용하면?

word2vec은 단어의 분산 표현을 얻을 목적으로 고안된 기법이라, 이를 언어 모델이 사용하지는 않음
어휘수 증가에 따른 대응과 단어의 분산 표현의 질에 있어서 word2vec이 나음

 

Markov Chain, Markov Model

미래의 상태가 현재 상태에만 의존되어 결정되는 모델
이 사상의 확률이 직전 N개의 사건에만 의존할 때 N층 Markov Chain이라 함
이번 예는 직전 2 단계에 의존하여 다음 단어가 정해지기에 2층 Markov Chain이라 부를 수 있음

맥락의 길이는 임의 길이 설정 가능
왼쪽 10개 단어를 맥락으로 CBOW 모델을 만들어도 더 왼쪽의 단어는 무시됨

20~30으로 키우면? 맥락을 키우면, 키울수록 CBOW는 맥락 안의 “단어 순서가 무시”된다는 한계가 있음

이를 해결하기 위해 RNN이 등장

 

RNN?

Recurrent Neural Network: 순환 신경망
Recursive Neural Network: 재귀 신경망 – 주로 tree 구조의 데이터 처리용

 

순환하는 신경망

순환: 반복해서 되돌아감
Closed loop(순환하는 경로)가 필요함

이 순환 구조를 펼치면 친숙한 신경망으로 변신함
Feed forward 신경망과 같은 구조 (한 방향으로만 data가 흐르는 신경망)

시계열 데이터는 시간 방향으로 데이터가 나열됨
즉, 시계열 데이터의 인덱스는 ‘시각’이라는 용어를 사용

RNN은 h라는 ‘상태’를 가지고 있고
그래서 RNN 계층을 ‘상태를 가지는 계층’ 혹은 ‘메모리(기억력)가 있는 계층’ 이라고 함

RNN의 h는 상태를 기억해 시각이 1 스템 진행 시 위 식으로 갱신됨
ht를 은닉상태 혹은 은닉상태 벡터라고 함

 

BPTT (Backpropagation Through Time)

RNN 계층은 가로로 펼친 신경망으로 간주 가능
RNN 계층에서의 오차역전파법
시간 방향으로 펼친 신경망의 오차역전파법
Backpropagation Through Time BPTT

시계열 데이터의 시간 크기가 커지는 것에 비례해 BPTT의 연산이 증가 (메모리도 증가)
또한 시간 크기가 커지면 역전파 시 기울기가 불안정해짐 (중간에 소멸)

 

Truncated BPTT

큰 시계열 데이터 취급 시 흔히 신경망 연결을 적당한 길이로 끊음
이로 오차역전파를 수행

역전파의 연결만 끊어야 함
잘라낸 신경망 단위로 학습을 수행

Ex. 1000개짜리 말뭉치
1000인 시계열 데이터

 

역전파가 연결되는 일련의 RNN 계층을 블록이라 함
위의 경우 10개 단위로 끊음
즉, 그보다 미래의 데이터에 대해 고려안함

각 블록은 미래 블록과는 독립적으로 오차역전파법을 완결
순전파의 연결은 끊어지지 않음)

 

Truncated BPTT의 mini-batch 학습

지금까지는 미니배치 수가 1인 경우
배치 방식을 고려해 위 그림처럼 데이터를 순서대로 입력해야 함
즉, 데이터를 주는 시작 위치를 각 미니배치의 시작 위치로 옮겨야 함

 

1000 인 길이의 시계열 data에서 10개 단위 Truncated BPTT로 학습하는 경우
미니배치의 수를 2개로 구성하면?

  • Mini-batch가 2개인 경우
  • 1000개 data를 2개로 쪼개서 학습

RNN 계층의 입력 데이터로 첫 번째 미니배치때는 처음부터 순서대로 데이터를 제공
두 번째 미니배치 때는 500번째의 데이터를 시작 위치로 정하고 다시 순서대로 제공
즉, 시작 위치를 500만틈 옮김

 

RNN의 구현

Truncated BPTT 방식의 학습을 따른다면, 가로 크기가 일정한 일련의 신경망을 만들어야 함

Time RNN 계층 내에서 한 단계의 작업을 수행하는 계층을 RNN 계층이라 함
T개 단계의 작업을 한꺼번에 처리하는 계층을 Time RNN 계층이라 함

 

RNN 언어 모델

RNNLM의 계층 구성, 우측은 이를 시간축으로 펼친 신경망

Wt -> embedding -> RNN -> Affine -> Softmax -> Yt

 

임베딩 계층: 단어 ID의 단어를 분산표현(단어 벡터)로 변환
RNN 계층은 은닉 상태를 다음 층(위층)으로 출력하면서 동시에 다음 RNN 계층으로 (우측) 출력

you의 입력 시 Softmaxn 계층이 출력하는 확률분포는 “say”가 가장 높음
즉, you 이후에는 say라는 단어가 올 것을 올바르게 예측
이처럼 제대로 예측하려면 좋은 가중치(잘 학습된 가증치)를 사용해야 함

 

say의 경우 goodbye와 hello 두 곳에서 높에 나옴

RNN 계층은 “you say”라는 context를 ‘기억’ 하고 있음
“you say”라는 과거 정보를 응집된 은닉 상태 벡터로 저장하고 있음.

이런 정보를 더 위의 Affine 계층, 그리고 다음 시각의 RNN 계층에 전달하는 것이 RNN 계층이 하는 일

 

RNNLM은 지금까지 입력된 단어를 ‘기억’ 하고 그것을 바탕으로 다음에 출현할 단어를 예측
RNN 계층이 과거에서 현재로 데이터를 계속 흘려보내줌으로써 과거의 정보를 인코딩해 저장(기억)할 수 있는 것

 

word cloud

관심사와 관련된 단어의 수를 집계
단어와 그 개수를 시각화 하는 방법은 단어의 크기와 단어의 개수에 비례하도록 보여주는 워드 클라우드
발생, 언급 빈도를 기반으로 word의 크기를 (절대적으로) 조절하여 word cloud를 구성할 수 있다.

data = [ ("big data", 100, 15), ("Hadoop", 95, 25), ("Python", 75, 50),
("R", 50, 40), ("machine learning", 80, 20), ("statistics", 20, 60),
("data science", 60, 70), ("analytics", 90, 3),
("team player", 85, 85), ("dynamic", 2, 90), ("synergies", 70, 0),
("actionable insights", 40, 30), ("think out of the box", 45, 10),
("self-starter", 30, 50), ("customer focus", 65, 15),
("thought leadership", 35, 35)]

for word, job_popularity, resume_popularity in data:
    plt.text(job_popularity, resume_popularity, word,
        ha='center', va='center',
        size=text_size(job_popularity + resume_popularity))

 

N-gram language model

문서가 여러개 있는 말뭉치(corpus)를 구해서 언어에 대한 통계적 모델을 만들자.
마침표를 기준으로 web page 내 text에서 문장들을 추출하자.

언어를 모델링하자.

시작 단어를 하나 주자.


"book"

문서들을 훑으면서 book이라는 단어 다음에 등장하는 단어들이 무엇인지 확인한다.
이 중 하나를 임의로 선택해서 다음 단어가 되게 한다.
문장의 끝을 나타내는 마침표가 등장할때까지 반복한다.

반응형

'AI > Machine learning' 카테고리의 다른 글

LDA Latent Dirichlet Allocation  (0) 2021.08.16
LSA Latent Semantic Analysis  (0) 2021.08.16
특징 생성  (0) 2021.08.14
모델 평가 지표  (0) 2021.08.14
Data Science: Introduction  (0) 2021.08.14