クイックノート

ちょっとした発見・アイデアから知識の発掘を

文章を自動生成する GPT-2 の 774M モデルを使ってみる

近年のAIの進化はめざましく、
応用範囲も得意としていた画像認識のみに留まらず、
文章の自動生成への応用も積極的に取り組まれています。

そんな文章自動生成のモデルとして注目されているGPT-2の
より表現力の大きいモデルが公開されたいうニュースを目にしたので、
簡単に使ってみたいと思います。

環境

公開されているコードはpythonのものなので、
pythonがインストールされていない場合は、
インストールしておきましょう。

準備

コードをリポジトリから取得して、
必要なパッケージをインストールし、
モデルをダウンロードすれば、
文章自動生成の準備が完了です。

一つずつ順に実行していきましょう。

コードを取得

githubからコードをクローンします。

git clone https://github.com/openai/gpt-2.git
cd gpt-2/

必要パッケージのインストール

コードを実行するために必要なパッケージをインストールします。

pip3 install tensorflow
pip3 install -r requirements.txt

gpuが利用可能な場合はtensorflow-gpu
インストールした方が望ましいでしょう。

モデルのダウンロード

GPT-2では、ニューラルネットワークの大きさに応じて、
複数の大きさのモデルが提供されています。

今回は 774M のモデルを利用するので、
774Mを指定してダウンロードします。

python3 download_model.py 774M

文章を自動生成する

取得したコードの中には、
文章自動生成のサンプル実行用コードも含まれているので、
それを使って文章を生成してみましょう。

設定を書き換える

サンプル実行用のコードsrc/interactive_conditional_samples.pyでは、
コンソールから文章を受け取って、その続きを生成します。

デフォルトでは、124Mのモデルを利用することになっているため、
サンプルコード自体を修正して、774Mのモデルを利用するようにします。

使用するモデルを変更する

エディタでsrc/interactive_conditional_samples.pyを開き、
下のように、interact_model内のmodel_name
774Mに変更します。

def interact_model(
    model_name='774M', #ここを変更
    seed=None,
    nsamples=1,
    batch_size=1,
    length=None,
    temperature=1,
    top_k=0,
    models_dir='models',
):

top_kの値を変更する

せっかくエディタでコードを開いたので、
もう少し設定をいじっておきましょう。

文章を自動生成する際には、
次の単語は何が良さそうかを予測しながら単語を選びます。

この時、生成される文章に多様性を持たせるため、
GPT-2では、次に来そうな単語のトップk番目までの中から、
ランダムに次の単語を選択するというランダム性を入れています。

このkの値をtop_kで設定することができます。

"40 generally is a good value." とのことなので、40にしておきましょう。

def interact_model(
    model_name='774M', #ここを変更
    seed=None,
    nsamples=1,
    batch_size=1,
    length=None,
    temperature=1,
    top_k=40,
    models_dir='models',
):

自動生成を実行する

いよいよ文章の自動生成です。

コンソールでサンプル実行用のコードを実行しましょう。

python3 src/interactive_conditional_samples.py

するとコンソールに次のような表示が現れます。

f:id:u874072e:20190822124635p:plain
初めの文章の入力画面

モデルでは、文章の続きを自動生成していくので、
自動生成の種となる初めの文章の入力が要求されています。

ここに文章を入力してEnterを押せば、
続きの文章を自動的にモデルが生成してくれます。

実行例

とりあえず、適当な文章で実行してみます。

f:id:u874072e:20190822124909p:plain
実行例の入力

モデルは英語に対応しているので、英語で入力しています。
大まかな意味は下のような感じです。

朝起きると異世界だった。 この物語は、異世界でコンピューターを作るまでの苦労を描いた物語である。

Enterを押してから、しばらく待つと次のような文章が生成されます。

f:id:u874072e:20190822125224p:plain
生成された文章

書き手が作家であり、コンピューターを専門としているなど、
最初に入力した文章の続きとしてはまあまあでしょう。

上の文章をGoogle 翻訳にかけると、
下のような感じになります。

熱心な作家として、私は通常「あなたが知っていた世界」については書きませんが、自分が作ったものだけを書きます。私の場合、私はウプサラ大学の美術学校の助教授でした。コンピューターアーキテクチャに関するコースを教えました。私の学生の考え方は、それはコンピューターを構築する方法を学ぶことではなく、むしろそれを使用する方法についてであるということです。これにより、コンピューターを表示するのではなく、コンピューターの使用方法を教えることができます。これは私がやったことです。

C ++などのプログラムを実行できるコンピューターを作りたかった。方法を知っているのはプログラムを書くことだけだと気づきました。だから私はプログラムを書く目的でプログラムを書きました。当時、私はアセンブラーで小さなプログラムのみを書きました。このプログラムは、誰もが読むことを意図したものではありません。プログラムに名前やその他の個人情報を載せることは決してありません。なぜなら、それは教師としての価値を与えないからです。

しかし、最後に、「X」という名前を付けました(XはXerox Xの省略形です)。これは、命令を実行し、バイナリデータとデータを保存するプログラムです。情報を作成します。ファイルを読み取り、実行のためにコンピューターに渡します。 Xについて最初に理解することは、この時点では実際に命令を実行しないことです。メモリに保存するだけで、後で使用するためにメモリに保存します。

プログラムを書くという私の考えは簡単でした。プログラムはXとYの2つの次元になります。ただし、これは1つの次元にすぎません。プログラムには、時間ディメンションと空間ディメンションの2つのディメンションもあります。 X次元(移動する方向)とY次元(移動する方向)は移動の方向です。

このプログラムは、基本設計を構成する10個のコンポーネントで構成されています。これは、ファイルの読み取り用と書き込み用の2つの関数で構成されています。データは、メモリモジュールとファイルモジュールの2つの異なるモジュールに保存されます。メモリモジュールは「メモリファイル」と呼ばれます。ファイルモジュールは「データファイル」と呼ばれます。

ファイルを読み込んで情報を書き出す小さなプログラムを作成します。最初の読み込みの後、新しいファイルを読み込むまでファイルを読み込みます。その時点で、後で結果を保存するための別のモジュールを作成します。簡単に新しいものを追加できます

詳細に踏み込むと言ってることは無茶苦茶ですが、
眺めて見る分にはそれっぽく見えます。

文字埋めが必要な時に、
「ああああ」の代わりに自動生成の文章を埋めるとかなら、
そのままでも使えそうでしょうか。

まとめ

GPT-2の774Mモデルを使って文章を自動生成してみました。

簡単に使えて、自動的に生成されたとは思えないような
テーマに沿った単語で文章が生成されるので、
眺めて読む分には違和感がないかもしれません。

プライバシーポリシー