Skip to main content

텍스트 생성을 위한 순환 신경망

텍스트 생성을 위한 순환 신경망 최적화 방법 이 글은 AI 번역본입니다. 오역이 의심되는 부분이 있으면 댓글로 알려 주세요.
Created on September 15|Last edited on September 15
주로 이미지와 ConvNet을 다뤄 왔지만, 최근에는 순환 신경망(RNN)에 관심이 생겼습니다. 다음에 자세히 소개된 텍스트 생성 문제를 다시 살펴보고 싶었습니다. 순환 신경망의 놀라운 효용 그리고 RNN을 더 잘 이해하고, 이를 어떻게 최적화할지 알아보려는 목적도 있습니다.
이 프로젝트를 현대적인 …을(를) 만드는 작업으로 생각하고 싶습니다 로렘 입숨이는 온갖 템플릿에서 자리표시자로 쓰이는 텍스트입니다. 우리는 방대한 텍스트를 읽고, 동일한 문체를 갖춘 “무작위” 텍스트를 생성함으로써 훨씬 더 나은 결과를 만들 수 있습니다.
우리가 만들 모델로 생성한 텍스트 예시는 다음과 같습니다.

요즘 실제 책 대신 생성된 가짜 텍스트만 너무 많이 읽고 있는 것 같아요!
이 프로젝트는 다음과 함께 개발되었습니다 PyTorch 그리고 모든 실행은 다음에 기록되었습니다 Weights & Biases 그리고 완전히 재현 가능합니다.
아래를 통해 프로젝트 구현 과정을 따라가 볼 수 있습니다 노트북.
요즘은 사용자 정의 셀과 여러 층을 사용하고, 층 사이에 드롭아웃을 넣은 RNN을 구현하는 일이 꽤 쉽습니다.
self.rnn = torch.nn.LSTM(input_size = input_size, hidden_size = hidden_size, num_layers = num_layers, dropout = dropout)
정의는 여기까지입니다! 안타깝게도 처리해야 할 세부 사항이 아직 꽤 많이 남아 있습니다…
핵심 아이디어는 각 문자를 읽어 원-핫 텐서로 인코딩하고, 이를 RNN에 입력한 뒤 출력값을 다음 문자의 확률 분포로 사용하는 것입니다. 교차 엔트로피 손실과 역전파를 사용하면 예측을 점차 향상시킬 수 있습니다.

모델을 제대로 작동시키기 위해 필수적인 구성 요소들이 있었습니다:
  • 훈련 중에는 메모리 사용을 최소화하기 위해 원‑핫 텐서로의 인코딩을 실시간으로 수행해야 합니다.
  • 역전파 전에 긴 문자 시퀀스에 대해 손실을 누적해야 하며, 그렇지 않으면 모델이 유의미한 것을 학습하지 못합니다(이렇게 하면 가중치 업데이트가 안정화됩니다).
  • 효율적인 학습을 위해서는 여러 개의 시퀀스 데이터를 병렬로 읽어야 합니다.
노트북을 통해 완전한 프로토타입을 만들어 두면, 최적화에 들어가기 전에 구현해야 할 핵심 항목들을 디버깅하고 관찰하는 데 큰 도움이 됩니다. 사실 그런 필수적인 “세부 사항” 중 일부는 나중으로 미뤘을지도 모르고, 어쩌면 영영 손대지 않았을지도 모릅니다…
텍스트를 병렬 배치로 읽기 위해, 가중치가 특정 문맥(즉, 텍스트의 한 구간)에 치우치지 않도록 텍스트를 동일 간격으로 분할합니다. 다음 배치는 각 시퀀스를 계속 따라가며 hidden state의 관련성을 유지합니다.

고작 5분 정도 훈련하고 미세 조정도 그리 많이 하지 않았는데, 꽤 고무적인 결과가 나왔습니다:
"사슴이 남자에게서 들렸다."
“그는 이제 파리의 마지막과 함께 젊은 남자의 무덤을 기념하기를 원하지 않았고, 그녀는”
문을 지닌 아들의 짐을 나르다."
“나는 네가 곧 증명할 거라고 생각해. 네가 일종의 확인을 하게 될 텐데, 그리고 어디에서 대화의 정적이 여전히 이어지는지도 알게 될 거야.”
그 오해의 응축에 관하여. 나는 발랑틴에게 갈 것이고, 그에게 말하라고 한 백작의 불만을 전하겠다."
“그 젊은 남자는 실수투성이였고, 그 순간에도 그랬다.”
이제 순환 신경망의 내부 깊숙한 부분으로 들어가, 이를 최적으로 최적화하는 방법을 탐구해 보겠습니다.

모든 기록된 실행을 분석하고 비교한 끝에 도출한 결론은 다음과 같습니다:
  • GRU는 LSTM과 기본 RNN보다 더 효율적이다
  • 이 RNN에는 2~3개 층이면 충분히 깊다
  • 너비가 깊이보다 훨씬 더 큰 영향을 미친다
  • 과적합 징후가 나타난 뒤에만 드롭아웃을 사용하라
  • 손실은 약 100자 길이의 시퀀스 단위로 계산하는 것이 좋다(더 긴 시퀀스를 써도 개선 폭은 크지 않음).
  • 배치당 여러 시퀀스를 사용하면 성능이 향상되지만, 과적합을 피하기에는 8개면 충분하다.
  • 네트워크 아키텍처는 특정 텍스트 길이에 맞게 조정되어야 한다.
참조하시기 바랍니다 W&B 보고서 근거와 도표는 해당 보고서를 참조해 주세요. 저는 새로운 실험을 진행하면서 통찰을 쉽게 기록하고 추적할 수 있도록 그때그때 보고서를 작성했습니다.
흥미롭게도 어떤 텍스트는 다른 텍스트보다 더 예측 가능하다는 점을 알 수 있다. 예를 들어, Internal Revenue Code 보다 훨씬 더 빠르게 학습한다 몽테크리스토 백작, 길이를 10으로 나눈 뒤에도(결과적으로 비슷한 문자 수가 되도록)
모델이 생성한 텍스트만 봐도 그 기반이 무엇인지 짐작할 수 있다는 점을 관찰했다. 예를 들어, Internal Revenue Code로부터 생성된 텍스트는 네트워크가 거기서 무엇을 학습해 기억하고 있는지 ��� 보여 준다. 수많은 개정 조항, 섹션과 하위 섹션, 속성, 그리고 세금 항목들까지!
텍스트의 종류와 상관없이 문법이 대부분 잘 보존된다는 사실은 정말 인상적이며, 주의를 기울이지 않으면 누구든 쉽게 속을 수 있다.
자유롭게 클론해 보세요 GitHub 프로젝트 저장소 그리고 결과와 결론을 공유해 주세요!
프로젝트 링크:




이 글은 AI 번역본입니다. 오역이 의심되는 부분이 있으면 댓글로 알려 주세요. 원문 보고서는 아래 링크에서 확인할 수 있습니다: 원문 보고서 보기