케라스 창시자에게 배우는 딥러닝 - 6장

Jajuna_99·2022년 11월 15일
0

6장 텍스트와 시퀀스를 위한 딥러닝

텍스트 데이터 다루기

CV가 픽셀에 적용한 패턴 인식 문제인 것처럼, NLP 또한 단어, 문장, 문단에 적용한 패턴 인식 문제이다.

그렇다면 텍스트를 신경망에 넣어서 처리해야 될텐데, 텍스트 원본을 신경망에 넣을 수는 없다. (수치형 텐서만 다루니) 그래서 텍스트 벡터화를 적용해야겠다.

텍스트 벡터화의 여러가지 방법

  • 텍스트를 단어로 나누고 각 단어를 하나의 벡터로 변환한다.
  • 텍스트를 문자로 나눈고 각 문자를 하나의 벡터로 변한한다.
  • 텍스트에서 단어나 문자의 n-그램(n-gram)을 추출하여 각 n-그램을 하나의 벡터로 변환한다.(p.246)
    • n-그램은 연속된 단어나 문자의 그룹으로 텍스트에서 단어나 문자를 하나씩 이동하면서 추출한다.

텍스트를 나누는 이러한 단위(단어, 문자, n-그램)를 토큰(token)이라고 한다.

그리고 텍스트를 토큰으로 나누는 작업을 토큰화(tokenization)이라고 한다.

모든 텍스트 벡터화 과정은 어떤 종류의 토큰화를 적용하고 생성된 토큰에 수치형 벡터를 연결하는 으로 이루어진다. -> 이 벡터가 시퀸스 텐서로 묶어져서 심층 신경망에 주입된다.

이 절에서는 토큰과 벡터를 연결하는 여러가지 방법 중에 원-핫 인코딩토큰 인베딩(혹은 단어 임베딩)을 알아본다.

단어, 문자 수준의 원-핫 인코딩, 케라스와 해싱 기법을 사용한 단어 수준의 원-핫 인코딩하기는 깃헙에 구현했다.

원-핫 인코딩으로 만든 벡터는 희소하고 고차원인 방면, 단어 임베딩은 저차원의 실수형 밀집 벡터이다. 쉽게 말해 조금 더 어려운 방법으로 차원을 줄이고 많은 정보를 저장할 수 있다.

단어 임베딩을 만드는 2가지 방법이 있다.

  • 관심 대상인 문제와 함께 단어 임베딩을 학습한다. 이런 경우에는 랜덤한 단어 벡터로 시작해서 신경망의 가중치를 학습하는 것과 같은 방식으로 단어 벡터를 학습한다.
  • 사전 훈련된 단어 임베딩 사용

embedding 층을 사용하여 단어 임베딩을 학습한다는 것은, 기하학적인 공간에서 의미적으로 비슷한 단어들끼리 매핑한다는 것이다. 가장 간단한 방법을 단어들을 랜던함 벡터로 선택하여 가중치를 학습시키는 것이겠다. (p.250 설명 요약)

IMDB 영화 리뷰 감성 예측 문제를 적용한 모델은 깃헙에 구현했다.

사전 훈련된 단어 임베딩은 훈련 데이터가 부족한 경우에 적합하다.

스탠포드에서 개발한 GloVe 모델을 사용해 똑같이 IMDB 데이터를 훈련, 분류하는데 이에 대한 구현은 생략하겠다.(p.255)

순환 신경망 이해하기

순환 신경망은 시퀸스의 원소를 순회하면서 지금까지 처리한 정보를 상태(state)에 저장한다. 이 상태를 저장한다는 점에서 지금까지 봐왔던 신경망들과 구분될 수 있다. (완전 연결, 합성곱)

위 정의에 맞는 구현 방법과 형태는 얼마든지 많지만, 알고리즘 관점에서, 간단한 예시로, 보면 RNN은 반복할 때 이전에 계산한 정보를 재사용하는 for 루프에 지나지 않는다.

깃헙에 넘파이로 간단하게 RNN을 구현했다.(p.266) <- 이 구현이 실제 케라스 SimpleRNN 층에 해당한다.

SimpleRNN의 출력을 함수에 매개변수를 다르게 하여 다르게 할 수 있다. (ex. 전체 시퀸스, 타임스텝)

IMDB 영화 리뷰 분류 문제를 SimpleRNN을 사용하여 구현했다. (p.269)

이런 SimpleRNN은 실제로는 긴 시간에 걸친 의존성은 학습할 수 없다는 문제점이 있다. 이 때문에 그래디언트 소실 문제(gradient vanishing problem)이 발생한다.

위 문제 해결을 위해 고안된 것이 LSTMGRU층 이다.

책에서는 LSTM만 소개했는데 (잘 이해가 안된다...) 이해한 바로는 여러 게이트를 추가해서 시퀀스 어느 지점에서 추출된 정보를 필요한 시점의 타임스템으로 이동해서 떨구는 컨베이어 벨트가 추가 됐다고 한다.

그리고 이 연산들이 실제로 하는 일은 연산에 관련된 가중치 행렬에 따라 결정된다. 이 가중치는 엔드-투-엔드 방식으로 학습된다. 훈련 반복마다 매번 새로 시작되면 이런저런 연산들에 특정 목적을 부여하기가 불가능하다. RNN 셀의 사양이 가설 공간을 결정한다. (p.275)

요는 같은 층이더라도 가중치에 따라 결과가 다르고 과정이 다르다. 따라서 RNN 셀을 구성하는 연산 조합은 엔지니어링적인 설계가 아니라 가설 공간의 제약 조건으로 해석하는 것이 낫다. (사람이 이해하는 계산 보다는 최적화 알고리즘에 학습을 맡기는 것이다.)

위에서 구현한 IMDB 영화 리뷰 분류 문제를 LSTM을 구현하면 더 괜찮은 정확도가 나온다. (p.276)

순환 신경망의 고급 사용법

순환 신경망의 성능과 일반화 능력을 향상시키는 세 가지 기술을 보자.

  • 순환 드롭아웃 (recurrent dropout) : 순환 층에서 과대적합을 방지하기 위해 케라스에 내장되어 있는 드롭아웃을 사용한다.
  • 스태킹 순환 층 (stacking recurrent layer) : 네트워크의 표현 능력(representation power)을 증가시킨다. but 계산 비용이 높아진다.
  • 양방향 순환 층 (bidirectional recurrent layer) : 순환 네트워크에 같은 정보를 다른 방향으로 주입하여 정확도를 높이고 기억을 더 오래 유지시킨다.

이번 절에서는 시퀸스 데이터를 다루는 방법을 직관적으로 보기 위해 위에 방법들로 "Jena_climate"데이터를 사용해서 학습한다. (p.279)

컨브넷을 사용한 시퀀스 처리

1D 컨브넷은 특정 시퀸스 처리 문제에서 RNN과 견줄만 하고, 일반적으로 계산 비용이 훨씬 싸다. 특징으로는 팽창된 커널(dilated or atrous kernel)과 함께 사용한다.

1D 합성 층은 시퀸스에 있는 지역 패턴을 인식할 수 있다. 동일한 변환이 시퀸스에 있는 모든 패치에 적용되기 때문에 특정 위치에서 학습한 패턴을 나중에 다른 위치에서 인식할 수 있다. 그래서 1D 컨브에넷에 이동 불변성(translation invariant)을 제공한다.
즉, 문자 수준의 1D 컨브넷은 단어 행태학(word morphology)에 관해 학습한다. (p.301)

1D 컨브넷은 2D 컨브넷과 마찬가지로 텐서의 크기를 다운 샘플링하기 위해 풀링 연산을 한다. -> 서브 샘플링(subsampling).

1D 컨브넷을 구현해보고 컨브넷과 RNN을 합성한 모델을 만들어본다. (p.302)

요약

RNN이 왜 자연어처리에 많이 쓰이는지 알아볼 수 있었고, 좀 더 공부가 필요할 것 같다.

profile
Learning bunch, mostly computer and language

0개의 댓글