6 분 소요

KoGPT2-taf

SKT의 KoGPT2를 기반으로 5개 주요 일간지(조선일보, 중앙일보, 동아일보, 한겨레, 경향신문)의 논조를 반영한 사설 문단을 생성하게끔 개발된 생성모델.

개발 의도 및 활용 방안 예상

같은 정치 이슈를 두고 진보와 보수는 입장이 다르다. 이러한 입장차는 각각 진보와 보수를 대표하는 일간지인 한겨레/경향신문과 조선일보/중앙일보/동아일보들의 사설에도 반영될 것이다. 어떤 이슈에 있어서 진보와 보수의 입장차가 두드러지게 나타나는지 (혹 큰 차이가 없는지), 입장차가 있다면 일반인이 예상하는 언론사별 입장차에 부합하는지(예를 들어 “진보 언론은 ‘임신중절’에 있어 여성의 자기결정권 보호를 우선시할 것이다”), 언론사별 논조에 있어서 차이점은 없는지를 확인하기 위해서 이번 프로젝트를 기획했다.

모델이 제대로 개발 된다면 다음과 같이 활용할 수 있다.

  • 이슈별 여론 파악

최신 정치 이슈에 있어서 전반적인 여론 뿐만 아니라 진보/보수별 입장차를 파악할 수 있다.

  • 페이크 뉴스 탐지

러시아가 SNS을 활용하여 페이크 뉴스를 광범위하게 배포하여 미 대선에 악영향을 미친 이후로 페이크 뉴스 탐지 기술의 중요도가 높아졌다. 페이크 뉴스 뿐만 하니라 딥러닝을 활용한 딥페이크 기술에 대한 우려가 크다. 실제로 GPT3 개발자들은 해당 언어모델을 오용하여 악의적인 생성물을 내는 것을 막기 위해 가장 큰 모델을 공개하지 않았다. 페이크 뉴스도 공신력을 높이기 위해 기존의 언론사를 사칭하는 경우가 있는데, 언론사별 논조에 맞게 사설(기사)을 생성할 수 있는 모델이 있다면 주어진 사설이 표기된 언론사의 평소 논조와 일치하는지 등을 판단해 페이크 뉴스인지 아닌지를 분별할 수 있는 모델 역시 추가로 만들 수 있다. (GAN의 생성/구별 구조 활용)

  • 다각도의 논점 파악

실제 개발 후 다양한 정치적 이슈로 실험해 보니, 내가 생각해 보지 못했던 논거를 제시하는 것을 보고 놀랐다. 후술하겠지만 총 여섯개(주요 일간지 5개 + 언론사 불특정)의 결과물을 모델이 생성하는데, 이 결과물들이 서로 다르다. 논술을 준비하는 학생들이 다양한 논거를 파악하거나, 기사 생성기가 최종 결과물을 결정할 때 비교할 수 있는 후보들을 확보할 수 있다.

개발 환경 및 모델 선택

pytorch, huggingface 라이브러리를 사용하여 개발하였다. 생성모델을 목표로 하였기 때문에 생성에 최적화된 GPT 모델 중 한국어로 훈련된 KoGPT2를 선택하게 되었다. 프로그래머스에서 매우 비싼 aws P3 인스턴스를 지원해 주었고, P3의 경우 16GB의 GPU가 달려 있기 때문에 카카오브레인에서 제공한 KoGPT를 파인튜닝 하려고 했다. 카카오의 모델이 SKT의 그것보다 배는 큰 모델인 만큼 아무래도 생성 결과물이 훨씬 자연스러웠기 때문이다. KoGPT측에서 말하는 최소 사양이 16GB라 아슬아슬하지만 문제는 없을 줄 알았는데, 문제는 이 최소사양이라는 게 추론(inference)을 위한 최소 사양이라는 것이었다. 즉 파인튜닝까지 하려면 더 큰 gpu가 필요했던 것이다. 허깅페이스에서 KoGPT의 사전 훈련된 웨이트를 다운받으면 12GB 정도 나오는데, 기본적으로 pytorch가 차지하는 GPU가 있는 모양이었다. GPU 사용을 최소화하려고 다음과 같은 기법(huggingface가 제공하는 방법들)을 사용했으나 메모리 부족은 여전했다.

  • batch 사이즈 줄임 (1까지…)
  • 변수 활용 최소화 (loss라는 변수 만들어서 iteration마다 누적 loss 측정하는 행위 등을 안함; 불가피하게 변수를 만들어야 할 경우 사용 후 바로 del ‘variable’, torch.cuda.empty_cache() 해줬음.)
  • gradient checkpointing (역전파를 위해 모든 unit의 함수를 저장하는 대신 일부만 저장; 시간은 늘어나나 메모리 활용은 줄어듬. 자세한 설명은 여기)
  • gradient accumulation (배치마다 업데이트 하지 않고 어느정도 누적함으로써 사실상 더 큰 batch로 훈련하는 효과를 누림.)

위의 기법을 다 활용하니 훈련 트레이닝 셋 배치를 토큰화하는 것도 안되다가 optimizer step에서 막히는 정도로 까지 메모리 최소화를 이뤄내긴 했다. 결론적으로 16GB의 램으로는 파인튜닝이 불가능해 카카오브레인을 포기하긴 했지만, 애초에 모델 임포트 자체로도 시간이 너무 걸리기 때문에 서비스용으로 적합하지 않았다 (그래서 teacher-student 구조로 knowledge distillation하려고 했으나 애초에 메모리 부족으로 훈련이 안됨…). 결국 SKT의 KoGPT2가 파인튜닝하고 서비스하기에 적합한 사이즈라고 판단하고 이를 기반으로 우리 모델을 만들기로 했다.

KoGPT-taf의 Tokenizer & Model

SKT-KoGPT2가 사용하는 tokenizer 사전의 크기는 51,200이다. 그런데 KoGPT2의 경우 정치에 특화된 코퍼스에 훈련되지 않았기 때문에, ‘이명박’, ‘박근혜’, ‘문재인’, ‘윤석열’과 같은 주요 정치인의 이름은 물론 ‘청와대’와 같은 조직명과 ‘코로나’, ‘세월호’ 등 한국 정치사의 주요 사건을 하나의 토큰으로 인식하지 않는다.

한국 정치에 특화된 모델을 지향하는 KoGPT-taf의 경우 정치 관련 주요 개체명을 따로 사전에 등록한 후 추가 훈련을 진행하였다. 추가할 개체명은 5개 주요 일간지별 만 개의 사설의 제목을 KoNLPy의 Komoran tagger로 분석, 명사만 추출한 후 빈도수를 측정하여 가장 빈도가 높은 고유명사들만 뽑아 선정하였다(불용어 + 의존명사는 제거함).

참고로 빈도수 top 300개의 명사는 다음과 같다. (빈도수 추출 전 )

# 빈도수 추출 전 다음과 같은 토큰을 불용어로 판단하고 제거
# ['수', '것', '번', '호', '제', '때', '년', '명', '만', '이번', '인가']
# top 300:
['대통령', '정부', '국민', '검찰', '수사', '미', '정치', '경제', '일', '한국', '한', '개혁', '북', '국회', '대책', '의혹', '북한', '청와대', '법', '책임', '정책', '정권', '선거', '말', '필요', '문제', '박', '위기', '중', '민주당', '핵', '장관', '대화', '안', '계기', '남북', '후보', '대선', '사회', '미국', '대표', '일본', '나라', '박근혜', '문', '조사', '국정', '코로나', '비리', '국가', '기업', '원전', '중국', '의원', '사태', '차', '대응', '대북', '논란', '국정원', '외교', '세월호', '관계', '인사', '우려', '사건', '합의', '이유', '총리', '야당', '기대', '사드', '게', '교육', '원', '시장', '시대', '여당', '갈등', '불법', '안전', '여야', '안보', '정상회담', '평화', '노조', '금융', '당', '중단', '규명', '시민', '역사', '트럼프', '돈', '경찰', '언론', '김정은', '협상', '사과', '세계', '정상', '방역', '대', '총장', '권력', '복지', '길', '속', '통합', '노동', '세금', '지원', '현실', '일자리', '시작', '혁신', '판결', '사퇴', '논의', '부동산', '공무원', '재벌', '회담', '이제', '자', '새누리당', '방송', '강화', '결정', '한반도', '공약', '인권', '위', '삼성', '예산', '해결', '개입', '주목', '해법', '비핵화', '미래', '특검', '고용', '참사', '말라', '선언', '불안', '민심', '발언', '자격', '힘', '끝', '성장', '문재인', '거부', '조작', '확대', '안철수', '규제', '조국', '대비', '법원', '식', '실패', '사고', '개편', '윤석열', '정당', '교과서', '시간', '진실', '건', '씨', '보수', '군', '4대강', '요구', '부실', '소득', '진상', '반대', '앞', '위험', '민주', '공천', '정', '후보자', '청년', '사업', '신뢰', '은행', '경고', '변화', '간', '아베', '과제', '전환', '검사', '개선', '대한민국', '협력', '서울', '공개', '사법', '이상', '국제', '방치', '사람', '투표', '포기', '인상', '대학', '폐지', '자유', '백신', '관리', '연금', '최저임금', '총선', '제재', '탄핵', '폭력', '처리', '도발', '뿐', '약속', '대기업', '경쟁', '한국당', '쇄신', '전', '미사일', '금리', '전략', '텐가', '인식', '원칙', '확인', '외면', '종', '의지', '피해', '기회', '등', '노동자', '이후', '확산', '위원장', '손', '사찰', '학교', '전쟁', '공공', '실', '세', '집값', '재판', '재난', '입법', '충격', '단', '제도', '기관', '적극', '남', '공정', '추진', '정신', '테러', '처', '위안부', '뒤', '강행', '탓', '경영', '파업', '검증', '공수', '철회', '보호', '완화', '이', '성공', '회장', '걱정', '전면', '공단', '진보', '비판', '운동', '범죄', '단체', '학생', '산업', '집단', '근본', '군사', '농', '기준', '판사']

이중 최근 중요도를 임의로 판단하여 “박근혜”, “트럼프”, “김정은”, “문재인”, “안철수”, “윤석열”, “이명박”, “코로나”, “세월호”, “사드”, “새누리당”, “4대강”, “청와대”를 사전에 등록하였다.

이에 KoGPT-taf의 토크나이저의 사전과 모델의 임베딩 레이어의 크기가 SKT-KoGPT2에 비해 13개 증가였다.

KoGPT-taf Tokenizer 사양

vocab size max_length class special tokens
51,213 128 PreTrainedTokenizerFast (from HuggingFace) </s>, <unk>, <pad>, <mask>

Model

model type # of hidden # of layers and heads 최대 생성 길이
GPT2 768 12 128 토큰

모델 훈련

KoGPT2를 실험해 본 결과 그대로 활용하기엔 아쉬운 점이 몇몇 보였다.

  • 많이 부족한 생성 결과

말그대로 부자연스러운 생성물이 많았다.

  • 뉴스라기엔 격식이 떨어지는 말투

많은 대언어모델들이 그렇듯 웹문서를 마구잡이로 수집해 만든 코퍼스로 훈련되었기 때문에 생성물의 register가 뉴스의 그것과 달랐다.

  • 사실과 다른 결과물

21년 상반기에 공개된 모델인만큼 KoGPT2는 ‘예전’의 문서들로 훈련되었는데, 이에 따라 현재의 정치적 상황과 다른 결과물이 여럿 발견되었다 (예를 들어 ‘전 대통령 박근혜’ 대신 ‘대통령 박근혜’라든지 박근혜 정부 때 얘기하면서 문 정부 때의 ‘박수현 대변인’을 제시하는 등). 즉 최신의 뉴스 문서들로 추가 훈련할 필요가 있었다.

무엇보다 BERT나 OpenAI GPT가 모델의 크기에 비해 과소적합되어 있다면서 추가로 훈련을 진행하거나, 더 큰 데이터셋으로 훈련을 시킨 경우가 있었던 만큼(ALBERT 등) 우리 모델도 KoGPT2를 단순히 파인튜닝 수준이 아니라 추가로 훈련시키기로 했다.

추가 language modeling 훈련

KoGPT2의 웨이트를 불러온 후, 국립국어원 모두의 말뭉치의 ‘신문 말뭉치 2021’(4.4GB)의 본문을 대상으로 언어모델링을 추가로 진행했다 (epoch:10, batch_size:32, learning_rate: 5e-5, context_length: 128).

fine-tuning

이후에 epoch:5, learning_rate: 5e-5, context_length:128, batch_size:32로 파인튜닝을 진행했다. 이 때 사용한 데이터셋은 5대 일간지(중앙일보, 조선일보, 한겨레, 동아일보, 경향신문)의 사설 5만여개이다. 각 일간지별로 만여개씩 모았다. 사실 만여개씩 모으면 대략 최근 4-5년치 정도가 되지 않을까 했는데, 실제로 모아보니 대략 10년치였다 (러프하게 계산해보면 언론사별로 1년에 1000개, 하루에 2~3개의 사설을 내는 것이다.)

더 많은 최신의 신문 데이터를 확보하려면 사설뿐만 아니라 ‘정치’, ‘사회’, ‘경제’ 섹션의 기사들도 모으면 된다. 그런데도 사설만 모아 훈련시킨 이유는 매일매일 가장 주목을 받는 정치적 이슈에 대한 언론사의 대표적 입장이 가장 잘 드러나는 섹션이 사설이기 때문이다. 사설 또한 ‘오피니언’ 섹션의 일부이지만, ‘오피니언’은 말그대로 언론사의 입장과 정반대의 입장도 기고할 수 있는 곳이기 때문에 기자 개인의 이름이 아닌 사명을 달고 내는 사설만 활용하기로 했다.

사설을 활용한 또다른 이유는 사설은 ‘팩트’ 뿐만 아니라 ‘주장’이 확실히 담고 있기 때문이다. 물론 일반 보도 기사 역시 기자와 편집부의 의견이 간접적으로 담기기는 하지만 대부분의 문장에 가치판단이 빠져 있으나 (e.g. “문재인 대통령은 지난 2일 ~~라고 말했다”, “중대재해법을 어기면 ~한 처벌을 받을 수 있다” 등), 사설에는 어떤 이슈에 대한 가치판단이 담긴 문장이 분명히 나타날 수 밖에 없다.

128 토큰으로 잘라진 ‘[언론사명]:[사설 내용 일부](e.g. “조선일보:더 심각한 문제는 북한의 의료·방역 수준…”)’ 형태의 배치로 훈련되어 이슈별 언론사별 입장을 학습하도록 했다.

업데이트: