前回、GPT-4のパラメーターの内、temperatureを変化させることによって、GPT-4の出力する文章がどのように変わるのかについてテストしてみました。
その結果、temperatureの値が1.0を超えると、出力する文章の自由度が増しますが、その分、文章表現がおかしくなって、最終的には文章が崩壊してしまうということが分かりました。
そこで今回は、top_pのパラメーターを調整することによって、temperatureの値が高くても、文章の崩壊を防ぐことができないかテストしてみることにしました。
1.パラメーターtop_pの概要
top_pは、GPT-4などのニューラルネットワーク言語モデルの出力を制御するために使用されるパラメーターで、モデルが生成する文章の多様性と品質を調整するために使われます。核サンプリングとも呼ばれています。
top_pは、出力されるトークンの確率分布から、トークンを選択する際の累積確率の閾値です。例えば、top_pを0.9に設定すると、モデルが選択するトークンの累積確率が90%になるように調整されます。
一般的に、top_pの値は0.7から0.95の範囲で調整されます。
top_pが低いと、モデルは確率の高いトークンを選択しやすくなり、一貫性と品質が高くなりますが、文章の多様性が低くなって、同じような文章が繰り返されることが多くなります。
逆にtop_pが高いと、文章の多様性が増しますが、一貫性と品質が低下して、文法的におかしくなったり、文章が理解しにくくなったりするおそれがあります。
temperatureも、top_pと同じように言語モデルの出力を制御するためのパラメーターであり、多様性と品質の調整に使用されます。
ただし、temperatureは確率分布全体をスケーリングするのに対して、top_pはトークンの確率分布からトークンを選択する際の閾値を設定します。
temperatureが低いと、確率の高いトークンを選択しやすくなり、高いと、モデルはよりランダムなトークンを選択しやすくなります。
一方、top_pは、選択されるトークンの累積確率に基づいて多様性を制御します。
top_pの調整は、生成されるテキストの品質と多様性に大きな影響を与えるので、特定のタスクや目的に適した値を選択することが重要です。
また、top_pとtemperatureの両方を調整することで、さらに細かい制御が可能になりますが、適切なバランスを見つけることが難しくなるため、実験と評価を繰り返し行い、適切なパラメーター設定を見つけることが重要です。
2.書き出しに続けて文章を生成するテスト
temperatureの値を1.0を超えて、高く設定すると、以下のように文章が壊れてしまうことがあります。
〇「むかしむかしあるところに、」に続けて、GPT-4に文章を生成させた場合
文章崩壊は、確率の低いトークンを選択することによって起こると考えられることから、今回は、top_pの値を調整することによって、このような文章崩壊が起こらないようにすることができないかテストしてみました。
(1) テスト用のコード
今回、top_pによるGPT-4の出力文章の変化を調べるために以下のとおりコードを用意しました。
このコードをGoogle Colaboratoryのノートブックにコピーし、事前に入手した自分用のOpenAIのAPIキーを入力してセルを実行してください。
なお、gpt-4のAPIの利用許可を取っていない人は、gpt-3.5-turboのAPIを利用してください。(model=の後の"gpt-4"を"gpt-3.5-turbo"に書き換え)
!pip install openai
import openai
openai.api_key = "ここに自分のAPIキーを入力"
messages = []
for t in [0.8, 0.9, 0.95, 0.98, 0.99, 1.0]:
print("top_p:", t)
response = openai.ChatCompletion.create(
model="gpt-4",
temperature=2.0,
top_p=t,
max_tokens=200,
messages=[{"role": "user", "content": "むかしむかしあるところに、"}])
print(response['choices'][0]['message']['content'])
モデルはGPT-4、temperatureの値は2.0、最大トークン数は200、top_pの値は0.8、0.9、0.95、0.98、0.99、1.0の6種類となっています。
(2) 出力結果
出力結果は以下のとおりです。
temperatureを2.0に設定した場合、デフォルトのtop_p=1.0では、ほぼ確実に文章が壊れてしまうのですが、今回のテスト結果によれば、top_p=0.98辺りまで文章が崩壊せずに済んでいます。やはり、top_pの調整は、文章崩壊を回避するのに効果があるようです。
ただし、top_p=0.98は、少し日本語の表現がおかしくなっています。temperature=2.0の場合は、この辺りが限界のようです。
3.ホラー小説の書き出し
(1) テスト用のコード
次に、以下のコードでホラー小説の最初の書き出しを書かせるテストをしてみます。
!pip install openai
import openai
openai.api_key = "ここに自分のAPIキーを入力"
messages = []
for t in [0.8, 0.85, 0.9, 0.95, 0.98, 0.99]:
print("top_p:", t)
response = openai.ChatCompletion.create(
model="gpt-4",
temperature=2.0,
top_p=t,
max_tokens=400,
messages=[
{"role": "system", "content": "あなたはホラー小説の作家です。userの指示に従って文章を作成してください。"},
{"role": "user", "content": "ホラー小説の最初の書き出しを作成してください。"}])
print(response['choices'][0]['message']['content'])
(2) 出力結果
出力結果は以下のとおりです。
やはり、top_pを調整することで、生成する文章の自由度を高めながら、文章崩壊を避けることが可能なようです。
top_p: 0.98と0.99は文章が崩壊しており、top_p: 0.95は少し文章がおかしくなっています。
今回は、top_p: 0.85辺りが一番、文章の自由度と文章表現の正しさのバランスが取れているように感じました。
4.SF小説のあらすじ
(1) テスト用のコード
次に、以下のコードで、人工知能が反乱を起こす近未来SF小説のあらすじを書かせてみました。
!pip install openai
import openai
openai.api_key = "ここに自分のAPIキーを入力"
messages = []
for t in [0.8, 0.85, 0.88, 0.92, 0.95]:
print("top_p:", t)
response = openai.ChatCompletion.create(
model="gpt-4",
temperature=2.0,
top_p=t,
max_tokens=2000,
messages=[
{"role": "system", "content": "あなたはSF小説の作家です。userの指示に従って文章を作成してください。"},
{"role": "user", "content": "人工知能が反乱を起こす近未来SF小説のあらすじを書いてください。"}])
print(response['choices'][0]['message']['content'])
(2) 出力結果
出力結果は以下のとおりです。
temperature=2.0でも、top_p=0.95くらいまで文章崩壊を起こさずに、文章生成することができるようです。
ただし、top_p=0.95になると、ところどころ日本語のおかしいところがあり、内容が分かりにくいところが出てくるので、top_p=0.92くらいまでに抑えておいた方がよいかも知れません。
後は、好みで色々と設定してみてください。
5.料理対決をテーマにしたストーリー
(1) テスト用のコード
以下のコードを用意して、temperature=2.0、top_p=0.9で、料理対決をテーマとしたストーリーを生成してみました。
!pip install openai
import openai
openai.api_key = "ここに自分のAPIキーを入力"
messages = []
response = openai.ChatCompletion.create(
model="gpt-4",
temperature=2.0,
top_p=0.9,
max_tokens=8000,
messages=[
{"role": "system", "content": "あなたはプロの作家です。userの指示に従って文章を作成してください。"},
{"role": "user", "content": "天才料理人が宿命のライバルと料理対決を繰り広げるリアルで感動的なストーリーを書いてください。天才料理人にふさわしい料理の内容を考え、登場人物の会話を多めにして、周囲の状況、登場人物の心の動きを詳しく描写してください。また、最後に予想外の結末を用意してください。"}])
print(response['choices'][0]['message']['content'])
(2) 出力結果
出力結果は以下のとおりです。
いかがだったでしょうか。文章に大きな破綻はありませんが、ところどころ少し変な表現で気になるところはあります。全体のストーリーは、それなりにまとまっていると思います。
このストーリーをChatGPTのGPT-4モデルにこのストーリーの修正を依頼して、以下のように書き直してもらいました。(temperatureはデフォルトなのでおそらく1.0程度。)
このように、高いtemperatureで文章を生成した後、temperatureを下げて文章の修正を依頼すると、表現のおかしなところは修正できると思います。
いずれにせよ、今回、生成する文章の自由度を高めるためにtemperatureの値を高く設定しても、top_pを調整することによって、文章崩壊を避けることができるということが分かりました。
これは大きな収穫であり、文章の自由度と正確さのバランスを取りながら、生成したい文章に合わせて、temperatureとtop_pを設定していくことが可能です。