텐서플로우(TensorFlow)를 이용해서 글자 생성(Text Generation) 해보기 – Recurrent Neural Networks(RNNs) 예제 – Char-RNN

 

이번 시간에는 텐서플로우(TensorFlow)를 이용해서 글자를 생성(Text Generation)하는 예제를 살펴보자.

글자 생성을 위해서는 이전에 포스팅에서 배운 Recurrent Neural Networks(RNNs) [R1, R2]를 이용한다. 코드는 Sherjil Ozair가 Torch 라이브러리로작성된 Andrej Karpathy의 char-rnn 코드[1]를 텐서플로우(TensorFlow)로 porting한 아래의 github repositroy[2]를 사용하자.

https://github.com/sherjilozair/char-rnn-tensorflow

이제 단계별로 어떻게 글자를 생성을 생성해내는 RNNs을 만드는지 살펴보자.

 

1. Preprocess :

텍스트 데이터셋을 글자(Character) 단위로 쪼개고 글자들의 사전(Dictionary)을 만들고 글자를 모두 할당된 숫자로 맵핑한다.

 

먼저 글자 생성을 진행하기 위해서, 학습에 사용할 데이터셋을 준비한다. 예를 들어 다음과 같은 데이터셋[3]으로 학습을 진행한다고 가정해보자.

인공지능이 무엇이냐는 질문은 두 가지로 나눌 수 있다. “인공이란 무엇인가?”와 “지능이란 무엇인가?”이다. 첫 번째 질문은 꽤 답하기 쉽겠지만, ‘무엇을 인공적으로 만들 수 있는가’ 라는 질문을 낳는다. (여기서 만든다는 의미는 고전적인 연산 시스템과 같은 특정 형태의 시스템 하에서 이루어 질 것, 인공적 제조 공정이 존재할 것을 의미하고 인간 지능의 한계라는 테두리 안에서 이루어진다.)

두 번째 질문에 대답하기는 훨씬 어려운데, ‘이는 의식이나 자아혹은 심리(무의식을 포함해서) 등이 무엇인가’, 그리고 ‘우리가 연구할 수 있는 유일한 종류의 지능인 인간의 지능은 어떠한 요소로 구성되어 있는가’ 라는 문제를 제기하기 때문이다. 인간의 지능적인 행동을 연구하거나 이해하는 것은 무척이나 어렵고 복잡한 작업이다. 기존의 모델과 다른 각도에서 접근하고 있는 동물과 인공지능의 관계에 대한 연구는 그 타당성을 널리 인정받고 있다.

개념이 뚜렷한 형태의 일부 인공지능은 아래에 설명되어 있다. 인공지능의 주제별 분류, 역사, 그리고 주제별 장단점 및 응용 사례에 대해서 기술되어 있다. 끝으로 인공지능이 등장하는 소설 및 비소설 목록이 마련되어 있다.

그림 1 – 학습에 사용하는 글자 묶음 예시[3]

이 데이터를 Neural Networks 학습에 사용하기 위해서는 전처리(Preprocessing)가 필요하다.

전처리로, 문장들을 모두 개별 글자(Character) 단위로 쪼개고,  각각의 글자를 나타내는 숫자를 하나씩 할당해준다. 이후, 데이터셋에 포함된 전체 글자들로 사전(Dictionary)을 만들고 모든 글자들을 할당된 숫자로 맵핑한다.

그림 2 – 전체 문장 데이터셋을 글자(Character) 단위로 쪼개고, 글자마다 숫자를 할당한다.

2. Training :

인풋 데이터(input data-x-)에서 글자(Character)를 하나 뒤로 민 타겟 데이터(target data-y-)로 RNNs을 학습한다.

 

이제, 전처리(Preprocess)가 끝난 데이터를 이용해서 RNNs을 이용해서 학습을 진행하자. 학습을 진행하기 위해서는 input data와 target data가 필요하다. 이때 input data와 target data를 아래와 같이 구성하자.

Input Data : 전체 문장 중 일정 길이의 글자들의 배열

Target Data : 전체 데이터중 Input Data를 한글자 뒤로 민 배열

그림 3 – Input Data와 Target Data 구성 [4]

위의 그림을 보면 좀 더 간단히 이해할 수 있다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

예를 들어 전체 데이터셋이 “hello”라는 글자로 구성되어 있다면, 일정길이(4글자)로 글자를 나눠서

Input Data : hell(전체 문장 중 일정 길이의 글자들의 배열)

Target Data : ello(전체 데이터중 Input Data를 한글자 뒤로 민 배열)

로 Recurrent Neural Networks(RNNs)의 학습을 진행하면 RNNs는 “hell 다음에 올 글자는 o이구나!”라는 사실을 학습할 수 있다.

이런 과정을 전체 글자 데이터셋에 대해 진행하면, 결과적으로 RNNs는 주어진 데어터셋에 대해서 “주어진 글자묶음 이후에 어떤 글자가 오는것이 적절한지” 학습할 수 있다.

 

좀 더 이해를 돕기 위해, 위에서 언급할 데이터셋을 Input Data와 Target Data로 나타내어보자. (데이터셋을 10글자씩 나눴다고 가정한다.-띄워쓰기와 쌍따옴표와 같은 부호들도 한글자로 취급한다.-)

Input Data : (인공지능이 무엇이냐), (는 질문은 두 가지),(로 나눌 수 있다.),…

Target Data : (공지능이 무엇이냐는),( 질문은 두 가지로),( 나눌 수 있다. ),…

 

3. Sampling:

학습된 결과를 토대로 샘플링을 통해 임의의 글자를 생성한다.

이제 마지막으로, 학습된 결과를 토대로 샘플링(Sampling)을 통해 글자를 생성해보자. 샘플링이란 학습된 확률분포(Probability Distribution)에서 임의의 샘플들(Samples)을 추출하는 기법이다.

우리가 사용하는 코드에서는 첫 시작글자(‘ ‘-공백-)를 RNN의 input으로 넣고, 공백으로부터 다음 글자를 prediction한다. 이후, 다시 이 prediction 값을 RNN의 input으로 넣고 prediction을 진행하는 과정을 반복한다.

아래는 사무엘 베케트의 희곡 “고도를 기다리며”를 데이터셋으로 필자가 학습을 진행한 이후에 얻은 결과 중 좋아 보이는 것을 하나 발췌하였다. 발췌한 부분을 보면,

에스트라공: “대사”, 블라미디르: “대사”아 같이 희곡의 구조는 아주 그럴듯하게 학습해낸 것을 볼 수 있다. 하지만 글자 배열의 구조는 맞지만 의미가 엉망인 문장들이 대부분이다.(예를 들어, “회연하는 성을 거일도 좋니?”, “벌써 미칠대를 럭키의 주위를 지면줘요!”)

하지만 의미적으로도 놀랍도록 정확하게 생성해내는 부분도 발견된다. 예를들어, “조용히!”라는 대사 이후에 “침묵)”이라는 지시어가 나오는 부분과 “고도를 기다려야지.”라는 대사 이후에 “참 그렇구 말야?”라는 대사가 나오는 부분은 정말 사람이 쓴 문장과 같은 느낌을 준다.

에스트라공: (무대 옆에서 몸을 비꼰다.) 앞으로!
블라디미르: 나는 우릴 고맙다 (헐떡내 다친다) 이것 사실이오. (럭키에게) 하지만 
각을 할까? 무슨 소리를 터터봐
블라디미르: 회연하는 성을 거일도 좋니?
에스트라공: 벌써 미칠대를 럭키의 주위를 지면줘요!
블라디미르: 빨리빨리! 이놈  일으켜 세워요!
그는 발을 멈추고 블라디미르 모자를 놓고 럭키의 모자를 고우지 않을 거들어 줘!
블라디미르가 끈과 소년은 물러서며) 이번 한테전 것도 없었냐?
에스트라공:  그래요!
블라디미르: 조용히!
침묵)
에스트라공:   누구?
블라디미르: 고도를 기다려야지.
에스트라공:  그렇구 말야?
블라디미르: 고도가 싫다니까. 벌써 시간이 흐르는  있으면

그림 4 – 사무엘 베케트의 희곡 “고도를 기다리며”를 데이터셋으로 학습을 진행한 이후에 샘플링한 결과

이제, 나만의 데이터셋을 만들어 위와 같이 재밌고 다양한 실험을 진행해보자.

 

연관 포스팅

[R1] Recurrent Neural Networks(RNNs) 소개 – 기본 Architecture와 Backpropagation Through Time(BPTT) 알고리즘

[R2] Bidirectional Recurrent Neural Networks (BRNNs) 소개 – 양방향 Recurrent Neural Networks(RNNs)

 

[출처] http://solarisailab.com/archives/1620

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
공지 오라클 기본 샘플 데이터베이스 졸리운_곰 2014.01.02 86304
공지 [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE 가을의 곰을... 2013.02.10 78755
공지 [G_SQL] Sample Database 가을의 곰을... 2012.05.20 95504
16 [ADsP] 취업 깡패 ADP 뿌시기! "빅데이터 분석가 최고의 자격증이에요" file 졸리운_곰 2022.11.20 1540
15 ADsP Chap01.Chap02 file 졸리운_곰 2018.01.01 1906
14 [ADsP준비] chap04.데이터마트 file 졸리운_곰 2018.01.01 1149
13 [ADsP준비] chap03.데이터분석 개요 file 졸리운_곰 2018.01.01 1925
12 [ADsP준비] chap02. 데이터의 이해 file 졸리운_곰 2018.01.01 1543
11 [ADsP준비] chap01.데이터의 이해 file 졸리운_곰 2018.01.01 1639
10 [ADsP] 제12회 데이터분석준전문가 시험 복원 file 졸리운_곰 2017.11.23 2095
9 [빅데이터자격증] 제3회 데이터분석 준전문가(ADsP) 시험 후기 기출문제 정리 file 졸리운_곰 2017.11.19 1945
8 [시험후기] 제 11회 ADsP 시험 후기 & 기출문제 복원 file 졸리운_곰 2017.11.19 1818
7 [ADsP] 제12회 데이터분석준전문가 시험 복원 file 졸리운_곰 2017.11.05 4995
6 제 9회 ADsP - 시험 후기 file 졸리운_곰 2017.05.03 1664
5 ADSP요약정리.pdf file 졸리운_곰 2016.10.23 8205
4 [빅데이터자격증] 제3회 데이터분석 준전문가(ADsP) 시험 후기 기출문제 정리 file 졸리운_곰 2016.10.23 3170
3 R 기본 문법 및 통계 프로그래밍 file 졸리운_곰 2014.10.24 3343
2 R을 이용한 데이터 분석 실무.pdf file 졸리운_곰 2014.10.24 3571
1 R 기초입문 - XMLArchive file 졸리운_곰 2014.10.24 1659
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED