見出し画像

gtp-2-simple (1) - GPT-2でテキスト生成

以下の記事を参考に書いてます。

How To Make Custom AI-Generated Text With GPT-2

1. はじめに

2019年2月、OpenAITransformerベースのテキスト生成のニューラルネットワーク「GPT-2」に関する論文を発表しました。テキスト生成の観点から、含まれているデモは非常に印象的でした。テキストは長期間にわたって一貫性があり、文法と句読点はほぼ完璧です。

画像1

同時に、モデルをダウンロードするためのコードと、ダウンロードしたモデルで予測するためのコードがGitHubで公開されました。

2. gtp-2-simple

Neil Shepperdは、OpenAIのリポジトリをフォークし、カスタムデータセットで既存のモデルをファインチューニングできるようにしました。その後すぐに「Google Colab」のノートブックを作成しました。「Google Colab」の無料のGPUで「GPT-2」をファインチューニングできるようになりました。そこから、「GPT-2」で生成されたテキストが急増しました。Gwern Branwenなどの研究者が「GPT-2」でを作成し、Janelle Shaneが「GPT-2」でDungeons and Dragonsのキャラクター経歴を作成しました。

私は、誰かが「ファインチューニング」と「テキスト生成」を簡単に利用するツールを作成してくれるのを待ちました。数カ月後、誰も作成してなかったので、Shepperdのファインチューニングを機能的なインタフェースでラップし、モデル管理と生成制御のための多くのユーティリティを追加したPythonパッケージ「gpt-2-simple」を作成しました。

gpt-2-simple」と「Google Colab」のノートブックを使うことで、独自のデータセットで「GPT-2」を簡単に「ファインチューニング」し、独自仕様の「テキスト生成」を行うことができます。

3. GPT-2のしくみ

OpenAIはこれまでに、3種類の「GPT-2モデル」をリリースしています。

・small : 124Mパラメータモデル(ディスク 500MB)
・medium : 355Mパラメータモデル(ディスク 1.5GB)
・large : 774Mパラメータモデル(ディスク 3GB)

 これらモデルは、一般的なAIチュートリアルで利用されるものよりもはるかに大きく、使いこなすのが難しいです。smallモデルはコンシューマのGPUでファインチューニング中にGPUのメモリ制限に達し、mediumモデルはサーバーでファインチューニングする前に追加の学習手法が必要です。largeモデルは、現在のサーバーGPUを使用してファインチューニングすることは全くできません。

「GPT-2」が使用する実際のTransformerの説明は非常に複雑です。こちらの記事が参考になります。ファインチューニングのために、アーキテクチャを変更できないため、「GPT-2」をブラックボックスと見なす方が簡単です。

入力はトークンのシーケンスです。出力はシーケンスの次のトークンの確率です。これらの確率は、AIがシーケンスの次のトークンを選択するための重みとして機能します。

事前学習済みの「GPT-2モデル」は、Redditで訓練されています。 そのため、モデルは英語をよく理解しており、この知識を他のデータセットに転送し、わずかな追加のファインチューニングで十分に機能させることができます。エンコーダーの構築には英語の偏りがあるため、ロシア語やCJKなどの非ラテン文字の言語では、ファインチューニングのパフォーマンスが低下します。

「GPT-2」をファインチューニングする際は、「速度」「サイズ」「創造性」のバランスが良いsmallモデルを使用することをお勧めします。 大量の訓練データ(> 10 MB)がある場合は、mediumモデルがより適切に機能する可能性があります。

4. gpt-2-simple と ノートブック

gpt-2-simple」の機能を紹介するために、「Google Colab」のノートブックを作成しました。 「Google Colab」は、NvidiaサーバーGPU(ランダムにK80またはT4 : T4が理想的)が接続された無料の仮想マシン上で実行されます。

画像2

ノートブックの最初のセルでは、「gpt-2-simple」のパッケージをインポートします。

画像3

ノートブックの後半では、gpt2.download_gpt2()でリクエストされたモデルをダウンロードします。

「Google Colab」のサイドバーを展開すると、ファイルのアップロードが可能なUIが表示されます。 UIを介してchar-rnnで提供しているtinyshakespeareデータセット(1MBのテキストファイル)をアップロードし、セル内のファイル名(file_name = '<xxx>')を変更して、セルを実行します。

これでファインチューニングを開始できます。指定されたデータセットを読み込み、指定されたステップ数の訓練を行います。デフォルトの1,000ステップは、個別のテキストを出現させるのに十分であり、約45分かかります。必要に応じてステップ数を増やすこともできます。

画像4

モデルがファインチューニングされている間、平均損失(loss)は、ほとんどの場合セルに出力されます。損失の絶対値は重要ではありませんが、減少しなくなった場合、それはモデルが収束し、追加の訓練が役立たないことを示しています。

デフォルトでは、モデルは「checkpoint/run1」フォルダに保存され、そのフォルダを使用してモデルも読み込む必要があります。「Google Colab」からモデルをエクスポートする場合は、Googleドライブ経由でエクスポートすることをお勧めします(「Google Colab」は大きなファイルをエクスポートすることを好みません)。gpt2.mount_gdrive()のセルを実行して、「Googleドライブ」を「Google Colab」にマウントし、次にgpt2.copy_checkpoint_to_gdrive()のセルを実行します。その後、「Googleドライブ」から圧縮モデルフォルダをダウンロードして、好きな場所でモデルを実行できます。同様に、gpt2.copy_checkpoint_from_gdrive()のセルを使用して、保存されたモデルを取得し、ノートブックで生成できます。

ファインチューニングしたらモデルができたら、それを使ってテキスト生成できます。デフォルトでは、gpt2.generate()は、少しランダムに、できるだけ多くのテキスト(1,024トークン)を生成します。

【注意】適切に訓練されたモデルを使用しても、適切なテキストは100%の確率で得られません。上記のOpenAIのデモでは、25回の試行で適切なテキストが取得できました。

画像5

temperatureでテキストのランダムさを指定することもできます。prefixで任意のテキストに続くテキストを生成することもできます。top_pなど、他にも多くのパラメータがあります。

画像6

おまけとして、nsamples(生成するテキストの総数)とbatch_size(一度に生成するテキストの数)を設定することで、「gpt-2-simple」でテキストを一括生成できます。「Google Colab」のGPUは最大20の「batch_size」をサポートでき、gpt2.generate_to_file(file_name)gpt2.generate()と同じパラメータを使用して、テキストファイルに生成できます。 生成されたファイルをサイドバーからローカルにダウンロードし、それらを使用して生成されたテキストを簡単に保存および共有できます。

ノートブックにはさらに多くの機能があり、より多くのパラメータと詳細な説明が含まれています。ノートブックの外部でモデルを使用する場合、「gpt-2-simple README」に「gpt-2-simple」の追加機能がリストアップされています。

【注意】別のモデルやデータセットでファインチューニングしたり、別のファインチューニングされたモデルを読み込んだりするには、「Runtime → Restart Runtime」でノートブックをリセットする必要があります。

5. ショートテキストのためのGPT-2

「GPT-2」および「その他のAIテキスト生成」の弱点は、長いコンテンツ用に作られているため、指定した長さに達するまでテキストを生成し続けることです。

「gpt-2-simple」では、AIテキスト生成に明示的な処理トリックを追加して、この問題を回避しました。「spt-2-simple」には、gpt2.generate()に渡すことができる2つのパラメータ「truncate」「include_prefix」があります。

例えば、各ショートテキストが<|startoftext|>で始まり、<|endoftext|>で終わる場合、prefix='<|startoftext|>'truncate=<|endoftext|>'include_prefix=Falselengthを設定します。これによって、バッチで生成する場合でも、短い形式のテキストを自動的に抽出するようになります。

以下のクエリは、BigQuery(無料)で実行されると、指定されたReddit subreddit+マイナーテキストの前処理について、2019年1月から3月までのスコアで上位16,000タイトルを返します。そして、1.3 MBのCSVとしてローカルにダウンロードできます。

#standardSQL
SELECT
  REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(title, '&amp;', '&'), '&lt;', '<'), '&gt;', '>'), '�', '') AS title
FROM
  `fh-bigquery.reddit_posts.*`
WHERE
  _TABLE_SUFFIX BETWEEN '2019_01' AND '2019_03'
  AND LENGTH(title) >= 8
  AND LOWER(subreddit) = 'askreddit'
ORDER BY
  score DESC
LIMIT
  16000

「gpt-2-simple」では、上記で生成されたような単一列のCSVを入力データセットとして使用すると、自動的に<|startoftext|>および<|endoftext|>トークンが適切に追加されます。通常どおり新しい「GPT-2モデル」をファインチューニングし、上記パラメータを使用して生成します。

画像7

モデルへの大量の入力データにもかかわらず、ファインチューニングされたネットワークは短い形式のテキストに簡単に適合しすぎる可能性があることに注意してください。これらのサンプルタイトルの一部は、既存の タイトルに非常に近いものです。過適合は、訓練時間を短くするか、入力データを追加することで修正できます。生成されたテキストが一意であることを再確認してください。

このノートブックで、このRedditバリアントで試すことができます。

6. GPT-2アプリの作成

largeモデル用のUIを提供するAdam Kingの「TalkToTransformer」や、GitHubコードによるファインチューニングで確率的なコード補完を行う「TabNine」など、「GPT-2」のクールな使い方は既にあります。

多くのAIチュートリアルでは、「Flask」を使用して小さなモデルをWebサービスにデプロイする方法を紹介しています。「GPT-2」の問題は、非常に大きなモデルであるため、従来のアドバイスの多くがパフォーマンスの向上には適切ではないことです。

「gpt-2-simple」で私が思いついた解決方法は、「gpt-2-cloud-run」です。「Google Cloud Run」で「GPT-2」を実行することを目的とした小さなWebアプリを作成します。利点は、「Cloud Run」が使用したコンピューティングに対してのみ課金され、トラフィックが急増した場合に無制限にスケーリングできることです。この「Cloud Run」を使用して、「Reddit-wide submission titles」と「Magic: The Gathering cards!」を作成しました。

画像8

7. AIが生成したテキストの原因

私が「gpt-2-simple」を開発した理由の1つは、AI技術に詳しくなくても、楽しいストーリーを作れるようにしたい、AIによるテキスト生成をもっと身近なものにしたいということです。

法的には必須ではありませんが、「gpt-2-simple」で生成したテキストを共有する場合は、AIによるテキスト生成の知識を広めるため、リポジトリまたはノートブックへのリンクを追加するようにお願いします。これは、個人的な利益のためではなく、透過的でなければならない技術だからです。

8. GPT-2の未来

この記事では、「GPT-2」のファインチューニングでテキストを生成する方法についてのアイデアを紹介しました。まだ未開発の可能性はたくさんあります。手つかずのクールなアプリや、使用されていないクールなデータセットもまだたくさんあります。「GPT-2」とTransformerアーキテクチャは、AIによるテキスト生成のゴールではありません。

この記事が気に入ったらサポートをしてみませんか?