以下の内容はhttps://pydocument.hatenablog.com/entry/2023/04/23/113906より取得しました。


Pythonによる自然言語生成:TransformersとOpenAI APIの活用

自然言語生成(NLG)は、自然言語処理NLP)の一分野であり、コンピュータがデータから人間が理解できる自然な文章を生成する技術です。近年のTransformerモデルの登場により、NLGの性能は飛躍的に向上し、様々な応用分野で活用されています。

この記事では、Pythonを使用して自然言語生成を実践する方法を、以下の2つの主要なアプローチに焦点を当てて解説します。

  • Hugging Face Transformersライブラリ: オープンソースで、多様な事前学習済みモデルを簡単に利用できます。
  • OpenAI API: 商用のGPT-3.5やGPT-4といった高性能モデルを利用できます。

Transformerモデル

Transformerは、2017年にGoogleの研究者らが発表した論文「Attention Is All You Need」で提案されたモデルです。従来のRNN(再帰ニューラルネットワーク)やCNN(畳み込みニューラルネットワーク)とは異なり、Attentionメカニズムを用いることで、文脈全体を考慮した高品質な文章生成が可能になりました。

Transformerモデルの特徴

  • Attentionメカニズム: 文中の各単語間の関連性を捉え、重要な単語に注目して処理を行います。これにより、長文でも文脈を理解した生成が可能になります。
  • 並列処理: RNNとは異なり、文全体の情報を並列処理できるため、高速な学習が可能です。
  • 事前学習: 大規模なテキストデータで事前学習を行うことで、様々なタスク(文章生成、要約、翻訳など)に適用できる汎用的な言語モデルを構築できます。

pydocument.hatenablog.com

主要なTransformerモデル

Transformerモデルの登場以降、以下のような様々な高性能な言語モデルが開発され、NLGの応用範囲がますます広がっています。

  • GPTシリーズ (OpenAI): GPT-2, GPT-3, GPT-3.5, GPT-4
  • BERT (Google): 双方向Transformerを使用
  • その他: Gemini (Google), LLaMA (Meta), Mistral 7B (Mistral AI), T5, BART, RoBERTa, DistilBERT

これらのモデルの多くは、Hugging FaceのModel Hubで公開されており、transformersライブラリを通じて利用可能です。ただし、GPT-3以降のOpenAIのモデルやGeminiなどは、商用のAPI経由での利用となります。

PythonとTransformersライブラリによるテキスト生成

Hugging Face社のTransformersライブラリは、Transformerモデルを簡単に利用できるPythonオープンソースライブラリです。事前学習済みのモデルを利用したテキスト生成、文章の要約、翻訳など、様々な自然言語処理タスクを手軽に実行できます。

実践:GPT-2モデルによるテキスト生成

ここでは、Transformersライブラリを用いて、GPT-2モデルによるテキスト生成を行う手順を説明します。

環境構築とライブラリのインストール

まず、Pythonの実行環境を準備し、必要なライブラリをインストールします。仮想環境の利用を推奨します。

# 仮想環境の作成(推奨)
python3 -m venv .venv
source .venv/bin/activate  # Windowsの場合は .venv\Scripts\activate

# 必要なライブラリのインストール
pip install transformers torch

モデルとトークナイザの準備

テキスト生成には、事前学習済みのモデルと、テキストをトークンに分割するためのトークナイザが必要です。

from transformers import AutoTokenizer, AutoModelForCausalLM

# モデルとトークナイザの指定(ここではGPT-2を使用)
model_name = "gpt2"  # 他にも "distilgpt2" など軽量なモデルも選択可能

# トークナイザの読み込み
tokenizer = AutoTokenizer.from_pretrained(model_name)

# モデルの読み込み
model = AutoModelForCausalLM.from_pretrained(model_name)

AutoTokenizer.from_pretrained()は指定したモデル名に対応するトークナイザを読み込みます。 AutoModelForCausalLM.from_pretrained()は指定したモデルを読み込みます。今回は、GPT-2の事前学習済みモデルを読み込みます。

テキストのトークン化

生成したいテキストの元となる入力テキスト(プロンプト)をトークン化します。

# 入力テキスト(プロンプト)
text = "The quick brown fox"

# テキストをトークン化
inputs = tokenizer(text, return_tensors="pt")  # PyTorchのテンソル形式で返す

テキスト生成

トークン化された入力データを用いて、モデルにテキストを生成させます。

# テキスト生成
outputs = model.generate(
    inputs["input_ids"],
    max_new_tokens=50,  # 生成する最大トークン数
    do_sample=True,      # ランダムサンプリングを有効にする
    top_k=50,          # 候補とする上位トークン数
    top_p=0.95,        # 累積確率が閾値を超えるトークンを候補とする
    temperature=0.7,   # 生成の多様性を調整するパラメータ
    repetition_penalty=1.2 # 同じトークンの繰り返しを抑制
)

# 生成されたテキストをデコード
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)

# 結果を出力
print(generated_text)

model.generate()トークン化されたインプットを入力し、続く文章を生成させます。各パラメータの説明は以下のとおりです。

  • max_new_tokens: 生成する最大トークン数を指定します。
  • do_sample=True: 多様性のある文章を生成するために、ランダムサンプリングを有効にします。
  • top_k: 各ステップで考慮する上位k個のトークンを指定します。
  • top_p: 各ステップで累積確率がp以上となるトークンの集合からサンプリングします。
  • temperature: 生成されるテキストの多様性を調整します。値を小さくすると確実性の高いトークンが選ばれやすくなり、大きくすると多様性が増します。
  • repetition_penalty: 同じトークンの繰り返しを抑制します。

tokenizer.decode()トークンIDの列を人間が読めるテキストに変換します。 skip_special_tokensを有効にすることによって、特殊トークン(文の開始や終了を示すトークンなど)を結果から除外します。

完成: コード全体 (GPT-2)

from transformers import AutoTokenizer, AutoModelForCausalLM

# モデルとトークナイザの指定
model_name = "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

# 入力テキスト
text = "The quick brown fox"

# テキストをトークン化
inputs = tokenizer(text, return_tensors="pt")

# テキスト生成
outputs = model.generate(
    inputs["input_ids"],
    max_new_tokens=50,
    do_sample=True,
    top_k=50,
    top_p=0.95,
    temperature=0.7,
    repetition_penalty=1.2
)

# 生成されたテキストをデコード
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)

# 結果を出力
print(generated_text)

OpenAI APIによるテキスト生成(GPT-3.5/GPT-4など)

GPT-3.5やGPT-4は、OpenAIのAPIを通じて提供されており、非常に高品質なテキスト生成が可能です。

注意 2024年時点では、GPT-3.5/GPT-4はtransformersライブラリから直接利用できません。OpenAIのAPIキーを取得し、openaiライブラリを使用する必要があります。

環境構築とライブラリのインストール (OpenAI API)

# 仮想環境の作成(推奨)
python3 -m venv .venv
source .venv/bin/activate # あるいは .venv\Scripts\activate

# 必要なライブラリのインストール
pip install openai

OpenAI APIキーの準備

OpenAIのウェブサイトでAPIキーを取得し、環境変数に設定するか、コード内で直接指定します。セキュリティのため、自分だけが使う環境以外では、APIキーをコード内に直接記述することは避けてください。(誤ってgithub等でAPIキーを公開してしまうなどの危険性もあります。)

import openai
import os

# 環境変数からAPIキーを読み込む(推奨)
openai.api_key = os.environ.get("OPENAI_API_KEY")

# または、コード内で直接APIキーを指定する(非推奨:セキュリティに注意)
# openai.api_key = "YOUR_API_KEY"

テキスト生成 (GPT-3.5/GPT-4)

GPT-3.5 (gpt-3.5-turbo) および GPT-4 は、チャット形式のAPI (ChatCompletion) を使用します。

import openai
import os

def generate_text_with_gpt(prompt, model="gpt-3.5-turbo"):
    """
    GPT-3.5-turbo または GPT-4 を使用してテキストを生成する関数

    Args:
        prompt (str): プロンプトとなるテキスト
        model (str): 使用するモデル ("gpt-3.5-turbo" または "gpt-4" など)

    Returns:
        str: 生成されたテキスト
    """
    openai.api_key = os.environ.get("OPENAI_API_KEY")
    response = openai.ChatCompletion.create(
        model=model,
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},  # システムの役割を設定(オプション)
            {"role": "user", "content": prompt},  # ユーザーからのプロンプト
        ],
        max_tokens=50,
        n=1,
        stop=None,
        temperature=0.7,
    )
    return response.choices[0].message['content'].strip()

# プロンプトを設定
prompt = "The quick brown fox"

# GPT-3.5-turbo でテキスト生成を実行
generated_text_35 = generate_text_with_gpt(prompt, model="gpt-3.5-turbo")
print("GPT-3.5-turbo:", generated_text_35)

# GPT-4 でテキスト生成を実行 (利用可能な場合)
# generated_text_4 = generate_text_with_gpt(prompt, model="gpt-4")
# print("GPT-4:", generated_text_4)

openai.ChatCompletion.create()がGPT APIを呼び出す関数です。ここでは、modelに使用するモデル名(gpt-3.5-turbogpt-4など)を指定します。

max_tokens, n, stop, temperatureなどはmodel.generate()と同様のパラメータです。最後にresponse.choices[0].message['content']で生成されたテキストを取り出します。

生成パラメータの調整

model.generate() メソッド (Transformers) や openai.ChatCompletion.create() (OpenAI API) のパラメータを調整することで、生成されるテキストの多様性や品質を制御できます。例えば、物語を作成する場合は多様性を高めるためにtemperatureを上げ、事実に基づくレポートを作成する場合はtemperatureを下げる、といった使い分けが考えられます。以下に、主なパラメータとその影響を示します。

パラメータ 説明 影響
max_tokens / max_new_tokens 生成する最大トークン数 値を大きくすると、より長い文章が生成されます。
do_sample Trueの場合、確率的サンプリングを行う。Falseの場合、最も確率の高いトークンを常に選択する。 Trueにすると、多様な文章が生成されやすくなります。Falseにすると、同じ入力に対しては常に同じ文章が生成されます。
top_k 各ステップで考慮する上位k個のトーク 値を小さくすると、確実性の高いトークンが選ばれやすくなり、文章の多様性が低下します。
top_p 各ステップで累積確率がp以上となるトークンの集合からサンプリング 値を小さくすると、確実性の高いトークンが選ばれやすくなり、文章の多様性が低下します。top_kと同時に使用されることが多いです。
temperature 確率分布を調整するパラメータ。 値を小さくすると、確率の高いトークンが選ばれやすくなり、文章がより予測可能になります。値を大きくすると、多様性が増しますが、文章の品質が低下する可能性があります。
repetition_penalty 同じトークンの繰り返しを抑制する。(Transformersのみ) 値を大きく設定することで、生成テキスト中の単語やフレーズの繰り返しを抑制できます。
num_beams ビームサーチで利用するビームの数(Transformersのみ) 計算コストは増加しますが、文脈により適合した自然な文章を生成できます。探索空間が広がるため、より良い候補が見つかる可能性が高まります。
num_return_sequences 生成する文章の数 (Transformersのgenerateメソッドのみ) 1より大きい値を指定すると、複数の異なる文章を一度に生成できます。
stop 特定の文字列が出現した場合に生成を停止する (OpenAI APIのみ) 生成を終了させたい単語やフレーズを指定します。

まとめと応用

本記事では、Pythonを用いた自然言語生成(NLG)の基本的な手法として、TransformersライブラリとOpenAI APIの活用方法を紹介しました。

  • Transformersライブラリ
    • オープンソースで、多様な事前学習済みモデル(GPT-2, BERT, LLaMAなど)を利用可能。
    • model.generate()メソッドでテキスト生成。
    • パラメータ調整により、生成テキストの多様性や品質を制御。
  • OpenAI API
    • 商用サービスで、GPT-3.5/GPT-4などの高性能モデルを利用可能。
    • openai.ChatCompletion.create()でテキスト生成。
    • チャット形式のインターフェース。

これらの技術を活用することで、創造的なタスクの自動化や効率化、新しいコミュニケーションの形を実現できます。また、より高度な利用方法として、特定のタスクに特化したモデルのファインチューニングや、複数のモデルを組み合わせたシステム構築などがあります。

最後にPythonの学習に利用できるUdemy iconのサイトを紹介します。ぜひ活用ください。

[PR]

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com




以上の内容はhttps://pydocument.hatenablog.com/entry/2023/04/23/113906より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14