Korean SmileStyle Dataset으로 문체 스타일을 바꾸는 모델 만들어보기

말투를 바꿔주는 AI 모델을 만들고 싶었는데, 때마침 좋은 토이 데이터셋을 스타일게이트에서 공유해주셔서 실험해볼 수 있게 됬습니다. Huggingface 라이브러리를 이용해서 GPT-2, BART 두 모델을 Fine-Tuning해서 말투를 바꾸는 모델을 만들어보았습니다.

https://github.com/smilegate-ai/korean_smile_style_dataset

GPT-2 vs BART

처음에는 GPT-2를 이용해서 문체 스타일을 변환해보는 모델을 만들어봤습니다. 예를 들어 아래와 같은 데이터 쌍이 있다고 가정했을 때

존댓말 스타일(formal): 고양이를 6마리나요? 키우는거 안 힘드세요?
반말 스타일(informal): 고양이를 6마리나? 키우는거 안 힘들어?
로봇 스타일(android): 고양이. 6마리. 양육. 번거로운가.

원래 문장과 바꿀 스타일 토큰, 문체 스타일이 바뀐 문장을 이어서 한 텍스트로 만들었습니다.

고양이를 6마리나요? 키우는거 안 힘드세요?[android]고양이. 6마리. 양육. 번거로운가.

코드는 아래 코랩 노트북에 있습니다.

그랬더니 결과는…

보시는 것처럼 스타일 토큰의 앞 뒤 문장은 유사하지만 완전히 동일한 내용을 갖고있지는 않습니다. 대신 뒤쪽 문장은 스타일 토큰에 맞는 스타일의 문장이 생성됬습니다. 즉, 스타일에 맞는 문장은 생성했지만, 의도한 내용과 일치하지 않았습니다. 이것은 어떻게보면 GPT의 특징이라는 생각도 들었습니다. GPT는 주어진 input과 같은 의미를 갖는 output을 만들어야 하는 모델이 아니라 문맥에 맞는 문장을 만들어내는 모델이니까요.

그래서 번역기, 요약문 생성에 쓰이는 Encoder-Decoder 모델을 이용해서 다시 Fine-tuning을 해보았습니다. Decoder의 output이 Encoder와 같은 의미를 갖되 문체 스타일만 다르게 만들어낼 수 있을 거라고 생각했습니다. 모델로는 BART를 사용했습니다.

Encoder의 input으로는 아래처럼 원본 문장과 바꿀 문체 스타일을 prompt로 지정했습니다.

구어체 말투로 변환:반가운. 나는 6마리의 고양이를 소지하고 있다.

Decoder의 input으로는 결과물 문장과 eos token인 </s>를 추가했습니다.

안녕! 나는 고양이 6마리 키워.</s>

위 코랩 노트북에 모델 코드가 있습니다. BART를 이용해서 만든 모델의 결과는 아래와 같습니다.

긴 문장을 예시로 넣어봤는데 다 되지 않고 잘리는 모습입니다.

긴 문장을 넣을 때는 kss같은 라이브러리로 문장을 잘라서 넣어야 할 것 같네요.

--

--

나는 최고의 선수다. 나를 최고라고 믿지 않는 사람은 최고가 될 수 없다.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
김희규

나는 최고의 선수다. 나를 최고라고 믿지 않는 사람은 최고가 될 수 없다.