현재 애플의 시리, 삼성의 빅스비, 네이버의 클로바 등등 AI 비서라고 불리는 대화형 인공지능이 점점 개발되고 있는데 이처럼 인공지능 비서가 갖춰야 할 필수 능력은 바로 사람의 언어를 이해하는 것!
문장을 듣고 무엇을 의미하는지를 알아야 서비스를 제공할 수 있기 때문인데 인공지능이 문장을 듣고 이해한다는 것은 많은 문장을 이미 학습(train)해 놓았다는 것이다.
그런데 문장을 학습한다는 건 지금까지 배운 내용과 다른 특징이 있다.
문장은 여러 개의 단어로 이루어져 있는데 그 의미를 전달하려면 각 단어가 정해진 순서대로 입력되어야 하기 때문! 즉, 과거에 입력된 데이터와 나중에 입력된 데이터 사이의 관계를 고려해야 하는 문제가 생겼는데 이를 해결하기 위해 순환 신경망(Recurrent Neural Network, RNN) 방법이 고안되었다.
순환 신경망은 여러 개의 데이터가 순서대로 입력되었을 때 앞서 입력받은 데이터를 잠시 기억해 놓는 방법이다. 그리고 기억된 데이터가 얼마나 중요한지를 판단해 별도의 가중치를 둬서 다음 데이터로 넘어가게 한다. 모든 입력 값에 이 작업을 순서대로 실행하므로 다음 층으로 넘어가기 전에 같은 층을 맴도는 것처럼 보인다고 순환 신경망이라고 부름!
RNN 방식의 장점은 입력 값, 출력 값을 어떻게 설정하느냐에 따라 여러 가지 상황에서 이를 적용할 수 있다는 것이다.

RNN이 처음 개발된 이후 RNN의 결과를 더욱 개선하기 위한 노력이 계속되어 왔는데 이 중에서
LSTM(Long Short Term Memory) 방법을 함께 사용하는 기법이 현재 가장 많이 사용됨!
LSTM은 한 층 안에서 반복을 많이 해야 하는 RNN의 특성상 일반 신경망보다 기울기 소실 문제가 더 많이 발생하고 이를 해결하기 어렵다는 단점을 보완한 방법인데
즉, 반복되기 직전에 다음 층으로 기억된 값을 넘길지 말지를 관리하는 단계를 하나 더 추가하는 것!

그림에 나와있는 것처럼 '오늘'이라는 단어가 '주가가'라는 단어에 영향을 줄 때 순환되는 과정에서 다음 층으로 기억된 값을 넘길지 말지를 LSTM 기법을 사용해 기울기 소실 문제를 보완한다.
이번에는 RNN 학습에 적절한 '로이터 뉴스 카테고리 분류'와 'IMDB 영화 리뷰' 데이터를 통해 RNN 학습을 하는데 케라스는 딥러닝 학습에 필요한 데이터를 쉽게 내려받을 수 있게 load_data()함수를 제공한다. 그리고 지금 사용하는 두 데이터셋은 load_data()함수를 통해 다운로드가 가능!
입력된 문장의 의미를 파악하는 건 모든 단어를 종합해 하나의 카테고리로 분류하는 작업인데 이번에 실습한 내용은 긴 텍스트를 읽고 이 데이터가 어떤 의미를 지니는지를 카테고리로 분류하는 연습이다.
실습을 위해 로이터 뉴스 데이터(11,258개의 뉴스 기사, 46개의 카테고리)를 사용!
그럼 딥러닝을 실행하면

그런데 print(len(X_train)으로 기사를 출력해 보니 단어가 나오는게 아니라 [1,2, 2, ...] 같은 숫자가 나온다. 딥러닝은 단어를 그대로 사용하지 않고 숫자를 변환한 다음 학습할 수 있어 여기서는 데이터 안에서 해당 단어가 몇 번이나 나타나는지 세어 빈도에 따라 번호를 붙임!
이러한 작업을 위해서 tokenizer() 같은 함수를 사용하는데 케라스는 이 작업을 이미 마친 데이터를 불러올 수 있다. 그리고 기사에는 거의 사용되지 않는 단어들도 있어 효율적으로 실행하기 위해 빈도가 높은 단어만 불러와 사용하려고 num_word를 1000으로 지정!(빈도가 1~1000에 해당하는 단어)
또 하나의 주의할 점은 각 기사의 단어 수가 제각각 다르므로 단어의 숫자를 맞춰야 한다.
이때는 데이터 전처리 함수 sequence를 다음과 같이 이용할 수 있다!

이제 모델층을 겹겹히 쌓아 에포크와 배치크기를 지정한 후 딥러닝을 실행해 테스트셋, 학습셋의 오차의 그래프 확인!


테스트셋에 대한 정확도가 69.9%을 보이고 있다. 테스트 오차가 상승하기 전까지의 학습이 과적화 직전의 최적 학습 시간!
그 다음으로 사용할 인터넷 영화 데이터베이스(IMDB)는 영화, 출연진, 개봉날짜, 후기, 평점에 이르기까지 매우 폭넓은 데이터가 저장된 자료다. 25,000개의 영화 리뷰가 담겨 있으며 해당 영화의 긍정적, 부정적 평가까지 담겨 있다. 앞서 다뤘던 로이터 뉴스 데이터와 마찬가지로 전처리 과정은 같으며 다만 클래스가 긍정, 부정 두 가지 뿐이여서 원-핫 인코딩이 없다.

모델을 다음과 같이 설정하고 마지막에 model.summary() 함수를 넣어 현재 설정된 모델의 구조를 밑의 그림으로 한눈에 볼 수 있다! 그리고 마찬가지로 딥러닝을 실행하면



딥러닝 실행 결과 테스트셋의 정확률은 85.21%이다!
이렇게 RNN까지 모두의 딥러닝 책을 모두 마무리했다. 이 책을 주피터 노트북에다 정리한지가 4개월이 넘었는데 아직 생생한 것 같다.
사실 필자는 데이터를 그만두고 경제쪽으로 전향했다.. ㅠㅠ
그래서 딥러닝 카테고리를 2개의 글로 남긴 채로 놔둘려고 했는데 마음먹은 건 끝내야 겠다는 생각이 들어서 이번에 한꺼번에 올리게 되었고 이렇게 마무리를 지었다.
모두의 딥러닝을 통해서 잘 배웠다 생각하고 패스트캠퍼스의 [데이터 분석] 강의, 밑바닥부터 시작하는 딥러닝 등의 책들, 기타 유튜브 영상으로 데이터에 깊게 들어갈려고 했지만 항상 느끼지만 숙제를 하는 느낌만 들었다. 주변에 IT쪽에 관심있는 사람들은 이 쪽에 공부를 할 때 확실히 재밌어한다.
예를 들어 전공공부를 제낄만큼. 그정도의 재미는 못 느껴서 안타깝지만 딥러닝에 관한 포스트의 미래는 불투명해졌다. 웹 프로그래밍을 할 때도 데이터를 먼저 시작을 하지 못해 조금 아쉬웠고 원래 수학에 관심이 많아서 데이터를 시작하면 본인에게 잘 맞아 잘 될것이고 요즘 시대의 흐름을 따라 괜찮은 방향으로 가고 있다고 생각했지만 현실은 그렇지가 않았다. 물론 충분히 안했다고 할 수는 있겠지만 그러기에는 많은 시간을 투자했다고 생각한다. 확실히 직업은 재미가 있어야 탄력성이 붙지만 IT쪽 분야는 필수적인 것 같다. 오늘 하지 못한 디버깅, 캐글에서 오늘 증가시키지 못한 Acurracy, 오늘 좀더 나아가는 방향으로 개발하지 못한 알고리즘들이 자기 전에 머리 속에 맴도는 것이 본인에게 스트레스가 아닌 자극, 재미로 느껴진다면 당신은 IT 분야가 천성이다!!!!!! 축하한다. 사실 페이스북, 유튜브 광고에서 매번 데이터 광고를 볼 때마다 아픈 손가락처럼 가슴 한켠이 좀 시리다. 하지만 아닌 건 아닌 것 같다. 다시 경제 쪽으로 돌아오는데 시간이 조금 걸렸지만 마음을 접어서 다행이라고 생각한다. 하지만 지금까지 배운 IT 지식은 나에게 좋은 양분이 될 거라고 생각하기 때문에 IT 분야에 진입한 12개월의 시간을 후회하지 않는다. 그리고 그렇게 후회하지 않도록 행동했기 때문에 더 그렇게 생각할 수 있게 되었다.
시간이 남으면 틈틈히 올리려고 노력할 것이여서(?) 최대한 이 카테고리가 먼지가 쌓이지 않게 노력할 것이다!!
'딥러닝' 카테고리의 다른 글
모두의 딥러닝 (11) - 이미지 인식의 꽃, CNN 익히기 (0) | 2019.12.25 |
---|---|
모두의 딥러닝 (10) - 베스트 모델 만들기 (0) | 2019.12.24 |
모두의 딥러닝 (9) - 과적합 피하기 (0) | 2019.12.24 |
모두의 딥러닝 (8) - 다중 분류 문제 해결하기 (0) | 2019.12.24 |
모두의 딥러닝 (7) - 데이터 다루기 (0) | 2019.12.24 |