개괄
이 챕터에서는 텍스트 데이터를 생성하는 것을 배운다. 앞서 배운 GAN의 여러 기술들을 텍스트 데이터에 바로 적용하는 것은 무리가 있다. 왜냐하면 이미지 데이터와 텍스트 데이터의 특성이 다르기 때문이다.
-
텍스트는 개별적인 데이터 조각(문자나 단어 등)으로 구성되어 있지만 이미지의 픽셀은 연속적인 색상 스펙트럼 위의 한 점이다. 픽셀 하나를 초록색에서 파란색으로 바꾸는 것은 쉽지만 ‘cat’이라는 단어를 ‘dog’으로 바꾸는 것은 어렵다. 이미지의 경우 그래디언트를 계산하면 픽셀의 색을 어떻게 바꿔야 하는지 방향성을 알 수 있지만 이산적인 텍스트 데이터에는 일반적인 방식으로 역전파를 사용할 수 없다.
-
텍스트는 시간 차원이 있고 공간 차원은 없다. 이미지는 두 개의 공간 차원이 있고 시간 차원은 없다. 텍스트는 순서가 문맥 정보를 담고 있기 때문에 동시에 처리되기 어렵지만 이미지는 그렇지 않아서 동시에 처리될 수 있다.
-
텍스트 데이터는 개별 단위의 작은 변화에도 민감한 반면 이미지는 작은 변화에 덜 민감하다. 픽셀 하나가 바뀐다고 해서 전체 이미지가 확 바뀌지 않는다. 그러나 문장에서 단어 하나는 큰 변화를 줄 수 있다. (아 다르고 어 다르다는 말이 있듯이^^)
-
텍스트는 문법 구조를 가진다. 반면 이미지는 픽셀값을 할당하기 위해 사전에 정의된 규칙이 없다.
텍스트를 다루는 기술에도 당연히 발전이 있지만 위의 문제점은 여전히 도전적인 영역으로 남아있다. 시퀀스 데이터에 성공적인 모델 중 하나인 RNN, 특히 LSTM에 대해 알아보도록 하겠다. 또한 “질문-대답” 쌍을 생성하는 분야에서 새로운 기법도 소개한다.
LSTM
- LSTM : Long short-term memory
LSTM 네트워크는 RNN의 한 종류이다. 처음 RNN이 소개되었을 때 순환 층이 단순하고 tanh 함수 하나로 구성되어 있었다. 활성화함수로 tanh를 사용하였기 때문에 -1, 1 사이로 스케일링을 한다. 이는 그레디언트가 항상 0, 1 사이에 머무는 것을 의미하며 층이 깊어질수록 그레디언트가 사라지는 gradient descent 문제가 대두되었다. 이 문제에서 큰 돌파구가 LSTM 이었다. (자세한 설명은 RNN 소개 포스트에서 참고) 그 이후 GRU(Gated Recurrent Unit) 과 같이 LSTM의 변형된 형태가 나왔고 이는 케라스 레이어로도 제공이 된다.
데이터 준비
이 책이 영어판이니 당연히 영어 데이터이다. 구텐베르그 프로젝트의 이솝 우화 모읍집이다. 텍스트 파일 하나라서 이전 이미지 데이터들보다는 크기가 훨씬 작다.
이 책의 repository 를 클론한 폴더 내에서 실행하면 된다. (아래 명령어는 당연히 bash가 실행가능한 os에서 지원한다.)
bash ./scripts/download_gutenburg_data.sh 11339 aesop
이 데이터를 가공하는 코드는 06_01_lstm_text_train.ipynb에 있다.
Tokenizing
텍스트 전처리의 기본은 토크나이징이라고 생각한다. 당연히 엄청나게 중요하고 이 방식에 따라 과정과 결과가 확연히 다르다고 본다.
단어 토큰
문자 토큰
언어별 특성을 고려해보자
특히 언어별 특성이 토크나이징에도 영향을 준다. 현재는 영어를 기준으로 한다. 이를 한국어에 바로 적용했을 때 한국어의 특성을 다 살릴 수 있을까? 아니라고 본다. 효과가 없다는 것은 아니지만 그 영향력이 감소되는 것은 있다. 그 차이점을 몇개 생각해보면, ‘영어는 대문자, 소문자가 있다. 한글은 없다.’, ‘영어는 조사를 띄어쓴다. 한글은 붙여쓴다’, ‘한글은 초성, 중성, 종성을 조합하여 음절을 이룬다. 영어는 그렇지 않다.’ 등 차이가 난다. 구글이 만든 sentencepiece, wordpiece는 영어에 더 특화되어 있다고 볼 수 있다.