Coding Common Raven

イギリスの文系院卒(修士)のワタリガラスによるプログラミング挑戦記録

Google ColaboratoryのGPUクラウドサービス上でKeras /TensorFlowを使ってLSTM(ニューラルネットワーク)によるエドガー・アラン・ポー風の文章の自動生成を行う(自然言語処理/ディープラーニング)

f:id:commonraven2019:20190520063310j:plain

この記事について

ディープラーニング/深層学習(Deep Learning)のライブラリにTensorFlowの公式フロントエンド・ラッパーライブラリであるKeras(ケラス)を使って(KerasをTensorFlowバックエンドで実行して)、リカレントニューラルネットワーク/回帰型ニューラルネットワーク(Recurrent Neural Network: RNN)の一種であるLSTM/長・短期記憶(Long Short-Term Memory)をニューラルネットワーク(Neural Network: NN)に採用し、プロジェクト・グーテンベルク(Project Gutenberg: PG)で公開されているパブリックドメインであるエドガー・アラン・ポー(Edgar Allan Poe)の詩『大鴉』(“The Raven”)のテキストを訓練データとして自然言語処理(Natural Language Processing: NLP)である文章の自動生成を行います。簡単に言うとポーの詩『大鴉』のような文章の生成に挑戦します。

今回は無料でGPUクラウド(Cloud)サービス上で利用することができるGoogle Colaboratoryにてプログラミング/コードの実行をすることにしました。データ量が大変多いので、筆者の低スペックパソコンのローカルCUP処理では、実行結果の取得まで時間がかかることが予想されたからです。

文章の自動生成に挑戦しようと考えたきっかけは、CourseraのDeep Learning SpecialisationのCourse 5: Sequence Models,Week 1: Recurrent Neural NetworksにてLSTMとシェイクスピアの『ソネット集』("The Sonnets")風の文章生成を学んだことにあります。コードについても、そのコース内ものを模している部分が多いですが、同コースの参考文献にもなっているKeras teamがGitHubで公開しているLSTM text generatorのコードも倣ってもいます。文章の自動生成は何度も試みられ、同様のトピックについて書いた記事が、ネット上に既に多く存在しますが、このブログのディープラーニング練習ということで投稿することにしました。この試みの目的としては、成功例に倣ってコードを実行することで、Google Colaboratory上でのKeras /TensorFlowの使用スキルやLSTMによる文章の自動生成の手順を自分のものにするところにあります。



参考記事・先行事例

ディープラーニングで自動筆記 - Kerasを用いた文書生成(前編) - Deep Insider
ディープラーニングで自動筆記 - Kerasを用いた文書生成(後編) - Deep Insider
↳前後編ともにLSTM text generatorを使って日本語の小説を生成の解説。

Keras LSTMでサクッと文章生成をしてみる | cedro-blog
↳LSTM text generatorについての日本語での解説

KerasのSingle-LSTM文字生成サンプルコードを解説 – Qiita
↳LSTM text generatorの各コードを細かく解説

パッケージとライブラリ

最初に、必要なパッケージのライブラリ及びモジュールを取り込み(import)ます。今回はGoogle Colaboratoryを使うので、仮想環境の構築などの手間を省くことができ、ノートブックの設定を、ランタイムのタイプをPython 3、ハードウェアのアクセラレータ/device typeをGPUにするだけで使用できます。TensorFlow, Keras, NumPy(計算)と、Python標準ライブラリのrandomモジュール, sysモジュール, ioモジュールが必要です。

import tensorflow as tf
import keras
import numpy as np
import random
import sys
import io
from __future__ import print_function
from keras.callbacks import LambdaCallback
from keras.models import Model, load_model, Sequential
from keras.layers import Dense, Activation, Dropout, Input, Masking
from keras.layers import LSTM
from keras.utils.data_utils import get_file
from keras.preprocessing.sequence import pad_sequences

テキストの読み込み

エドガー・アラン・ポー(Edgar Allan Poe)の詩:『大鴉』(“The Raven”)のUTF-8形式でファイル名を「theraven.txt」で保存し、ファイルを読み込みます。

from google.colab import files
file = files.upload()
FILE_PATH = "./theraven.txt"
text=""
with open(FILE_PATH, 'r',encoding="utf-8") as f:
for line in f:
lines = line.split()
text += " ".join(lines)
text = text.lower()
len(text)

コードの流れ

テキストを読み込んだら、重複しているキャラクターを排除し、キャラクターを番号に変換、辞書を作成します。文字の区切り(maxlenパラメータ)、スキップ数(step)とシーケンスの設定をします。次にLSTMのモデルを作成します。その後、関数の設定をして、モデルの出力結果を指定し、Callbackを設定、文章を生成できるようにします。これらのコードの流れは、前述のLSTM text generatorコードとほぼ同じなので、本ブログでは割愛します。

今回の実行結果

実際に自動生成されたエドガー・アラン・ポーの詩『大鴉』のような文章は以下の通りです。

"f pallas just above my chamber door;and "

また、【Python】LSTMを使って文章を自動生成 | エンジニアの眠れない夜の記事で解説しているRNN_alice_pub_002のコードを写経し、条件を変更して実行すると以下の文章を生成しました。
HIDDEN_SIZE = 128; BATCH_SIZE = 128; NUM_ITERATIONS = 5; NUM_EPOCHS_PER_ITERATION = 5; NUM_PREDS_PER_EPOCH = 200の場合、

“oject gute oject gutenberg-tm electronic work is death and the poet's tounthe stance the menore and the foundation of the poet's tounthe stance the menore and the foundation of the poet's tounthe stance the menore and the”

HIDDEN_SIZE = 128; BATCH_SIZE = 128; NUM_ITERATIONS = 5; NUM_EPOCHS_PER_ITERATION = 10; NUM_PREDS_PER_EPOCH = 100の場合、

“riodic tax riodic taxed to owner the work and states the project gutenberg-tm electronic works in the poet's pooms, and t” 

雑感

思考回数/エポックを重ねた方が、単に長い文字列を生成しようとするよりも、文章として成り立っている結果を得やすいことがわかります。この記事は/も非常に読み難い悪文になっていますが、筆者の英語で行ってきた学習成果としての理解と日本語での表現・理解をすり合わせるために致し方ないと考えています。次回以降、SimpleRNNなど他のNNを使用した文章の自動生成や日本語の文章生成・自然言語処理にもチャレンジしてみたいです。また、LSTMによる株価・FX予想も試そうと思います。

余談

文章の自動生成の精度向上や、GANを用いた画像認識による判別や画像生成などにも挑戦したいですが、現在所有するマシンはGPUもなく、圧倒的にスペック不足なので、何か作るためにハードウェア環境を整えたいと思っています。今回のようにGPUクラウドサービスを活用する案として、アマゾン ウェブ サービス(Amazon Web Services: AWS)のGPUインスタンスの使用がありますが、インスタンスの止め忘れによるいわゆるクラウド破産が怖くて使用していません。インスタンスの止め忘れを防止のためにモニタリングサービスであるAmazon CloudWatch導入したとしても、リージョンにより料金に変動がある有料・従量制サービスであることが現在の筆者には抵抗があり、使用に二の足を踏んでしまいます。ハードウェア環境が整いかつ居所が定まるまでは、メモリ、連続学習時間、アイドリング時間などの制限があるものの、無料のGPUクラウドサービスであるGoogle Colaboratoryを工夫して使用するのが筆者にとっては現実的かと考えます。