TensorFlow를 사용한 텍스트 요약

텍스트 요약은 하나의 문장이 다른 문장에서 유추될 수 있는지를 식별하려는 논리의 간단한 연습입니다. 세가지 범주 중 하나로 문장의 순서 쌍을 분류하기 위한 텍스트 요약작업을 수행하는 컴퓨터 프로그램입니다. “positive entailment(긍정적 요약)”이라고 불리는 첫 번째 범주는 첫 번째 문장을 사용하여 두 번째 문장이 “참”임을 증명할 수 있을 때 발생합니다. 두 번째 범주인 “negative entailment(부정적 요약)”는 긍정적 요약의 역입니다. 첫 번째 문장을 사용하여 두 번째 문장을 반증 할 수있는 경우에 발생합니다. 마지막으로 두 문장이 상관 관계가 없다면 “중립적 요약(universal entailment)”이 있는 것으로 간주됩니다.

텍스트 요약은 훨씬 더 큰 응용 프로그램에서 구성 요소로 유용합니다. 예를 들어, 질의 응답 시스템은 저장된 정보로 부터 응답을 하기 위해 텍스트 요약을 사용할 수 있습니다. 텍스트 요약은 또한 새로운 정보를 포함하지 않는 문장을 필터링함으로써 문서 요약을 향상시킬 수 있습니다. 다른 자연어 처리(NLP) 시스템은 이와 유사한 요약을 사용합니다.

이 글에서는 TensorFlow를 사용하여 텍스트 요약을 수행 할 수 있는 간단하고 신속한 신경망을 구축하는 방법을 안내합니다.

시작하기 전에

TensorFlow 버전 1.0 을 설치하는 것 외에도 다음 각 항목을 설치했는지 확인하십시오.

  • Jupyter

  • Numpy

  • Matplotli

네트워크 교육 중 진행 상황을보다 잘 이해하기 위해 TQDM 을 설치할 수도 있지만 필수는 아닙니다.

GitHub에 Jupyter Noteboo으로 코드에 접근하십시오. 우리는 스탠포드의 SNLI 데이터세트를 교육에 사용 하겠지만, 필요한 데이터를 Jupyter Notebook으로 코드를 사용하여 다운로드하고 추출하므로 수동으로 다운로드 할 필요가 없습니다. TensorFlow를 처음 사용하는 분이라면 Aaron Schumacher의 기사 “Hello, Tensorflow“를 읽어 보시기 바랍니다 .

우리는 필요한 모든 import를 수행함으로써 시작할 것이고, Jupyter Notebook에 그래프와 이미지를 표시해야한다는 방법을 알려줄 것입니다.

 

 

사용하려는 파일이 다운로드하는 데 5분 이상 걸릴 수 있으므로 해당 Notebook에서 프로그램을 실행하면 다음 몇 개의 셀을 자유롭게 실행할 수 있습니다. 그 동안 텍스트 요약을 더 자세히 살펴 보겠습니다.

텍스트 요약의 예

이 섹션에서는 긍정적인, 부정적인, 중립적인 의미를 설명하기 위해 몇 가지 텍스트 동사 예제를 살펴 보겠습니다. 우선, “Maurita and Jade both were at the scene of the car crash”는 것을 읽을 때, “Multiple people saw the accident”라는 긍정적인 요약을 살펴볼 것입니다).이 예문에서는 우리는 첫 번째 문장 ( “텍스트”라고도 함)에서 두 번째 문장 ( “가설(hypothesis)”이라고도 함)을 증명할 수 있습니다.이 문장은 긍정적인 함축을 의미합니다. Maurita와 Jade가 둘 다 충돌을 보았다는 것을 감안할 때, 여러 사람들이 그것을 보았음에 틀림 없습니다. 참고 : “car crash”과 “accident”는 비슷한 의미를 지니지만 동일한 단어는 아닙니다. 사실,이 문장 쌍에서 볼 수 있듯이, 요약이 반드시 문장이 단어를 공유한다는 의미는 아닙니다.

다른 문장 쌍을 고려해 봅시다. “Two dogs played in the park with the old man” 문장은 “There was only one canine in the park that day”로 요약할 수 있을까요? 2마리의 개가 있다면 적어도 2마리의 개과(canine)가 있어야합니다. 두 번째 문장은 그 생각과 모순되기 때문에 이것은 부정적인 의미입니다.

마지막으로, 중립적인 요약을 설명하기 위해, “I played baseball with the kids”라는 문장이 “The kids love ice cream”라는 문장으로 어떻게 요약하는지 생각해 봅니다. 야구를하고 아이스크림을 사랑하는 것은 서로 전혀 관련이 없습니다. 나는 아이스크림 애호가들과 함께 야구를 할 수 있었고 아이스크림을 싫어하는 사람들(둘 다 동일한 가능성을 가지고 있음)과도 야구를 할 수 있었습니다. 따라서 첫 번째 문장은 두 번째 암시적인 중립적 인 요약의 진실 또는 거짓에 대해서는 아무 것도 말하지 않습니다.

 

 

단어 벡터화를 사용하여 단어를 숫자로 표현

신경망의 경우 불행히도 주로 숫자 값을 사용합니다. 이 문제를 해결하려면 단어를 어떤 식 으로든 숫자로 나타내야합니다. 이상적으로 이 숫자는 의미가 있습니다. 예를 들어 단어의 글자 코드를 사용할 수는 있지만 그 의미에 대해 아무 것도 알려주지 않습니다 (이는 TensorFlow가 “개과(canine)”를 “개”라고 말하기 위해 많은 작업을해야 한다는 것을 의미합니다).  비슷한 의미를 신경망이 이해할 수 있는 것으로 바꾸는 과정은 워드 벡터화 (word vectorization)라는 과정에 의해 발생합니다.

워드 벡터화를 생성하는 일반적인 방법 중 하나는 각 단어가 매우 고차원 공간의 단일 점을 나타내는 것입니다. 유사한 표현을 가진 단어는이 공간에서 상대적으로 가깝게 있어야합니다. 예를 들어, 각 색상은 일반적으로 다른 색상과 매우 유사한 표현을가집니다. 이 데모는 단어 벡터화에 대한 TensorFlow 자습서에서 볼 수 있습니다.

스탠포드의 GloVe 워드 벡터화 + SNLI 데이터세트 작업

우리의 목적을 위해, 우리는 단어의 새로운 표현을 숫자로 생성 할 필요가 없습니다. 범용 목적의 데이터가 충분하지 않은 경우 더욱 전문화된 자료를 교육하는 방법뿐만 아니라 단어에 대한 환상적인 범용 벡터 표현이 많이 있습니다.

이 글의 관련 Notebook은 스탠포드의 GloVe 워드 벡터화를 위해 미리 훈련된 데이터와 함께 작동하도록 설계되었습니다 . 우리는 다운로드하는 것이 가장 쉽기 때문에 “six-billion-token Wikipedia 2014 + Gigaword 5 vectors”를 사용할 것입니다. 프로그래밍 방식으로 파일을 다운로드 하겠지만 실행하는 데 시간이 걸릴 수 있습니다 (상당히 큰 파일 임).

동시에 텍스트 요약을 위한 데이터세트인 스텐포드의 SNLI 데이터세트도 수집 할 것 입니다 . 우리는 속도를 고려하여 개발 세트를 사용할 것입니다(10,000 개의 문장 쌍). 그러나 더 나은 결과를 얻고 학습을 위한 시간을 갖기를 원하면 전체 데이터세트를 사용해 보십시오.

 

 

이제 GloVe 벡터를 다운로드 했으므로 메모리에 로드 할 수 있으며 공백으로 구분된 형식을 Python 사전으로 deserializing 할 수 있습니다.

우리가 말을하면, 우리는 전체 문장을 포함하여 신경망을 통해 그것을 처리하기 위해 입력이 필요합니다. 시퀀스 만들기부터 시작합시다.

문장을 볼 때 컴퓨터가 보는 것

단어 벡터화 과정을보다 효과적으로 시각화하고 문장을 볼 때 컴퓨터가 보는 것을 확인하기 위해 벡터를 이미지로 나타낼 수 있습니다. Notebook을 사용하여 자신의 문장을 시각화하여 보십시오. 각 행은 단일 단어를 나타내고 열은 벡터화된 단어의 개별 치수를 나타냅니다. 벡터화는 다른 단어와의 관계로 훈련되므로 표현이 실제로 의미하는 바가 모호합니다. 컴퓨터는 이 벡터 언어를 이해할 수 있으며 이는 우리에게 가장 중요한 부분입니다. 일반적으로 동일한 위치에 유사한 색상을 포함하는 두 벡터는 의미가 비슷한 단어를 나타냅니다.

이미지와 달리 문장은 본질적으로 순차적이므로 크기에 따라 제약을 받을 수 없으므로 하나의 입력 값을 가져 와서 단일 출력을 생성 할 때까지 실행되는 완전히 연결된 순방향 공급 네트워크 대신 새로운 유형의 네트워크가 필요합니다.

바닐라 반복 네트워크(Vanilla recurrent network)

Recurrent neural network(RNN)은 신경망을 위한 시퀀스 학습 도구입니다. 이 유형의 신경망은 시퀀스의 각 입력에 대해 재사용되는 하나의 계층의 숨겨진 입력만 가지고 있으며 다음 입력의 계산에 앞서 전달되는 “메모리”와 함께 사용됩니다. 이것은 행렬 곱셈을 사용하여 계산됩니다. 매트릭스 인덱스는 완전히 연결된 레이어에있는 것처럼 훈련된 가중치입니다.

동일한 계산이 시퀀스의 각 입력에 대해 반복되므로 반복적인 신경망의 단일 “레이어”가 여러 레이어로 전개될 수 있습니다. 실제로 시퀀스에 입력 된 수 만큼의 레이어가 있습니다. 이를 통해 네트워크는 매우 복잡한 문장을 처리 할 수 ​​있습니다. TensorFlow는 vanilla RNN cell인 BasicRNNCell 을 다음과 같이 TensorFlow 그래프에 추가 할 수 있도록 자체적으로 구현 합니다.

vanishing gradient 문제

이론적으로 네트워크는 첫 번째 레이어 중 하나에서 문장의 훨씬 이전, 심지어 문장의 끝에서 물건을 기억할 수 있습니다. 이러한 형태의 재발에 대한 주된 문제점은 실제로는 초기 데이터가 새로운 입력과 정보로 완전히 빠져 나가 거의 중요하지 않게 된다는 점입니다. Recurrent neural network, 또는 적어도 표준 히든 유닛을 가진 신경망은 종종 오랜 시간 동안 정보를 유지하지 못합니다. 이 문제를 vanishing gradient 문제라고합니다.

이를 시각화하는 가장 간단한 방법은 예제입니다. 가장 단순한 경우 입력 및 “메모리”는 대략 똑같이 가중치가 적용됩니다. 데이터에 대한 첫 번째 입력은 첫 번째 출력의 약 절반 (나머지 절반은 시작 “메모리”)에 영향을 미치고 두 번째 출력의 1/4, 세 번째 출력의 8 번째 등에 영향을 미칩니다.

이것은 vanilla recurrent network를 사용할 수 없다는 것을 의미합니다. 적어도 이 쌍의 두 문장을 모두 추적하려는 경우는 아닙니다. 해결책은 다른 유형의 recurrent network 레이어를 사용하는 것입니다. 아마도 가장 간단한 것은 LSTM이라고 하는 long short-term memory 레이어입니다.

LSTM 활용

LSTM에서 현재 메모리 계산시 매번 동일한 방식으로 input (xt)이 항상 사용되는 대신 네트워크는 현재 값이 “입력 게이트”에 의해 메모리에 영향을 줄 수 있는 정도를 결정합니다. (ct)가 적절하게 명명된 “forget gate”(ft)에 의해 잊혀진 것에 대한 또 다른 결정을 내리고 마지막으로 “output gate(ot)”에 의해 다음 타임스텝(ht)으로 보내지는 메모리의 어떤 부분을 결정짓는 세번째 결정을 합니다.

 

이 세 개의 게이트가 결합되어 하나의 LSTM 노드가 정보를 장기간 메모리에 보관하거나 단기 메모리에 보관할 수 있지만 동시에 둘 다 수행 할 수는 없습니다. 단기 메모리 LSTM은 일반적으로 많은 정보를 입력하고 잊어 버리는 상대적으로 개방된 입력 게이트를 갖도록 훈련되며 장기 메모리 LSTM은 아주 작고 매우 구체적인 정보만 허용하는 긴밀한 입력 게이트를 가지고 있습니다. 이 견고함이 정보를 쉽게 잃어 버리지 않으므로 더 긴 보존 시간을 허용합니다.

일반적으로 LSTM은 암호화되어 있습니다. 같은 네트워크에 있는 서로 다른 LSTM 노드는 서로 의존하는 다른 게이트를 가질 수 있습니다. 예를 들어 단기 게이트를 사용하면 “John did not go to the store”라는 단어를 기억할 수 있습니다. 단어 “go”가 나타나면, 장기 게이트는 “go”대신에 “not go”를 기억할 수 있습니다. 물론 이것은 인위적 사례이며 실제로 이러한 관계는 해독 할 수 없는 지점까지 매우 복잡합니다.

네트워크의 상수(constant) 정의

네트워크에서 vanilla RNN 레이어를 사용하지 않으므로 그래프를 지우고 TensorFlow가 기본적으로 포함하는 LSTM 레이어를 추가해 봅시다. 이것이 실제 네트워크의 첫 번째 부분이 될 것이므로 네트워크에 필요한 모든 상수를 정의 해 보겠습니다.이 상수는 다음과 같이 나타납니다.

 

 

 

우리는 이전에 추가 한 RNN 셀을 포함하지 않도록 그래프를 다시 설정합니다.이 네트워크에서는 이 그래프를 사용하지 않을 것입니다.

두 가지 방법을 모두 사용하여 다음과 같이 TensorFlow를 사용하여 LSTM을 정의 할 수 있습니다.

정규화를위한 dropout 구현

LSTM 레이어만 사용했다면 네트워크는 많은 의미를 “a”, “the”, “and”와 같은 공통적이지만 의미심장한 단어를 읽을 수 있습니다. 네트워크가 부정적인 결과를 발견했다고 잘못 판단 할 수 있습니다. 하나의 문장이 “an animal”이라는 문구를 사용하고 다른 문구가 동일한 대상을 나타내는 경우에도 다른 문구로 “the animal”을 사용합니다.

이를 해결하기 위해서는 개개의 단어가 의미 전체에 중요한 의미를 가지는지 알아보기 위해 정규화를 해야합니다. dropout은 선택된 숨겨지거나 보이는 유닛을 무작위 적으로 드롭하는 신경망 디자인의 정규화 패턴입니다. 신경망의 크기가 커짐에 따라 최종 결과를 계산하는 데 사용되는 파라미터의 수는 증가합니다. 각 파라미터는 한꺼번에 교육을 받으면 overfitting이 발생합니다. 규화하기 위해 네트워크에 포함된 유닛의 일부가 무작위로 선택되고 훈련 중 일시적으로 제로 아웃되며 실제 사용 중에 출력이 적절하게 조정됩니다.

“표준”(즉, 완전히 연결된) 레이어의 dropout은 여러 개의 작은 네트워크를 효율적으로 교육하고 테스트 시간 중에 결합하기 때문에 유용합니다. 머신러닝의 상수 중 하나는 여러 모델을 결합하면 거의 모든 모델이 단일 모델보다 더 나은 방법을 만들고 dropout은 단일 신경 네트워크를 여러 노드를 공유하는 여러 작은 신경 네트워크로 전환시키는 역할을 한다는 것입니다.

dropout 레이어에는 p로 알려진 하나의 하이퍼 파라미터가 있습니다.이 하이퍼 파라미터는 단순히 각 반복 유닛의 반복 학습을 위해 각 유닛이 네트워크에 보관될 확률입니다. 유지되는 유닛은 다음 레이어에 출력을 제공하고 유지되지 않는 유닛은 아무 것도 제공하지 않습니다. 다음은 하나의 교육 반복 동안 dropout이 없는 완전히 연결된 네트워크와 dropout이 있는 완전히 연결된 네트워크 간의 차이를 보여주는 예입니다.

 

recurrent layer를 위한 Tensorflow의 DropoutWrapper

불행히도 LSTM 레이어의 내부 게이트는 특히 dropout이 좋지 않습니다. 결정적인 메모리의 특정 부분이 손실되면 1차 로직에 필요한 복잡한 관계가 dropout과 함께 형성되기가 더 어려워 지므로 LSTM 레이어의 경우 내부 게이트에서 dropout을 사용하지 않고 나머지 모든 항목에 사용합니다. 고맙게도, 이것은 recurrent layer를위한 Tensorflow의 DropoutWrapper 의 기본 구현입니다.

모델 완성

모든 설명이 끝나면 모델을 마무리 할 수 ​​있습니다. 첫 번째 단계는 GloVe 사전을 토큰화하고 사용하여 두 입력 문장을 단일 벡터 시퀀스로 변환하는 것입니다. LSTM 내에서 전달되는 정보에 대해 효과적으로 dropout을 사용할 수 없기 때문에 단어의 기능 및 최종 출력물에 대해 dropout을 사용합니다. 즉, 펼쳐진 LSTM 네트워크 부분의 첫 번째 및 마지막 레이어에 dropout을 효과적으로 사용합니다.

두 개의 서로 다른 LSTM 장치가 있는 양방향 RNN을 사용하고 있습니다. 이 반복적인 네트워크 형태는 입력 데이터를 통해 앞뒤로 실행되므로 네트워크가 독립적으로 또는 서로 관련하여 가설과 증거를 검토 할 수 있습니다.

LSTM의 최종 출력물은 완전히 연결된 레이어 집합으로 전달되고 그 다음부터는 각각의 종류의 요약이 얼마나 강한지를 나타내는 단일 실제 평가 점수가 표시됩니다. 최종 결과 및 그 결과에 대한 신뢰도를 결정할 수 있습니다.

TensoeFlow로 정확도(accuracy) 계산 표현

정확성을 테스트하고 최적화 제약 조건을 추가하려면 TensorFlow에 정확하게 예측된 라벨의 정확도 또는 백분율을 계산하는 방법을 보여줄 필요가 있습니다.

또한 네트워크가 얼마나 저조한지를 보여주기 위해 손실(loss)을 결정해야합니다. 분류 점수(classification score)와 최적 점수(optimal score)가 모두 있기 때문에 TensorFlow의 softmax 손실에 대한 변형인 tf.nn.softmax_cross_entropy_with_logits 을 사용합니다. overfitting에 도움이되는 정규화 손실(regularization loss)을 추가한 다음 손실을 줄이는 방법을 배우기 위해 옵티마이저를 준비합니다.

 

 

네트워크 훈련

마지막으로, 우리는 네트워크를 훈련시킬 수 있습니다! TQDM을 설치했다면 네트워크를 통해 진행 상황을 추적 할 수 있습니다.

 

 

이제 네트워크가 훈련되었습니다! 하이퍼 파라미터를 신중하게 수정하고 전체 학습 세트를 포함하도록 데이터 세트 크기를 늘리면 50-55 % 정도의 정확도를 볼 수 있습니다. 일반적으로 이것은 교육 시간의 증가와 일치합니다.

자신의 문장을 삽입하여 Notebook에서 다음 코드를 자유롭게 수정할 수 있습니다.

 

 

마지막으로 일단 모델 재생을 마친 후에는 세션을 닫아 시스템 리소스를 비웁니다.

더 많은 결과를 얻고 싶습니까?

이 네트워크의 설계 초점은 쉽고 빠르게 훈련 할 수있는 간단한 시스템을 만드는 것이 었습니다. 보다 정확한 결과를 얻으려면 다음 사항을 고려해야합니다.

 

  • 더 많은 LSTM 레이어 추가

  • Gated Recurrent Units (GRU) 와 같은 대체 유형의 RNN 계층 사용 . TensorFlow에는 GRU 구현도 포함됩니다 .

  • 히든 유닛을 추가합니다. 이렇게하면 네트워크에 더 많은 매파라미터가 있다는 사실을 설명하기 위해 정규화 및 dropout 강점을 높입니다.

  • 다른 종류의 네트워크를 이용한 실험

Tags:

tensorflow

GRU

LSTM

RNN

Jupyter

Numpy

entailment

텍스트요약

dropout

Vanilla recurrent network