Completion Parameter – Penalty

Penalty berguna untuk mengatur repetisi pada output. Terdapat dua macam penalty parameter yaitu:

  • Frequency Penalty
  • Presence Penalty

Frequency Penalty

Rentang nilai dari [-2, 2], defaultnya adalah 0. Nilai positif akan melakukan penalti terhadap token baru berdasarkan frekuensi token dalam sebuah text. Sementara nilai negatif, berarti mengijinkan model untuk menggunakan token yang sama berulang pada sebuah text.

Kita gunakan contoh code dari modul sebelumnya untuk melakukan demo.

import openai
from dotenv import dotenv_values
import textwrap

config = dotenv_values(".env")
openai.api_key = config["OPENAI_KEY"]

def nice_print(dictionary):
    for key, value in dictionary.items():
        wrapped_text = "\n".join(textwrap.wrap(value, width=120))
        print(f"{key}:")
        print(wrapped_text)
        print("-"*100)

nice_print({
    f"Frequency Penalty {x}": openai.Completion.create(
        model="text-davinci-003", 
        prompt="""The first 15 elements are Hidrogen, Helium,""".strip(), 
        max_tokens =200, 
        frequency_penalty=x, 
        echo=True)
    .choices[0]["text"]
    .strip()
    for x in [-2, -1, 0, 1, 2]
})
Frequency Penalty -2:
The first 15 elements are Hidrogen, Helium, Lithium, Beryllium, Boron, Carbon, Nitrogen, Oxygen, Fluor,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
----------------------------------------------------------------------------------------------------
Frequency Penalty -1:
The first 15 elements are Hidrogen, Helium, Lithium, Beryllium, Boron, Carbon, Nitrogen, Oxygen, Fluor, Neon, Sodium,
Magnesium, Aluminum, Silicon, Phosphorus,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
----------------------------------------------------------------------------------------------------
Frequency Penalty 0:
The first 15 elements are Hidrogen, Helium, Lithium, Beryllium, Boron, Carbon, Nitrogen, Oxygen, Fluorine, Neon, Sodium,
Magnesium, Aluminum, Silicon, Phosphorus
----------------------------------------------------------------------------------------------------
Frequency Penalty 1:
The first 15 elements are Hidrogen, Helium, Lithium, Beryllium, Boron, Carbon, Nitrogen, Oxygen, Fluorine, Neon, Sodium
, Magnesium , Aluminum , Silicon and Phosphorus.
----------------------------------------------------------------------------------------------------
Frequency Penalty 2:
The first 15 elements are Hidrogen, Helium, Lithium, Beryllium, Boron Carbon, Nitrogen, Oxygen , Fluorine , Neon  Sodium
, Magnesium  Aluminum   Silicon   Phosphorus Sulphur .
----------------------------------------------------------------------------------------------------

Dapat dilihat dari result diatas, token “,” makin berkurang seiring dengan nilai penalty yang makin besar.

Perhatian: contoh diatas adalah contoh sederhana untuk menunjukan pengaruh frequency penalty. Bukan cara untuk tidak mengenerate tanda koma.

Petunjuk penggunaan Frequency Penalty

  • Gunakan nilai dari 0.1 – 1 untuk mengurangi repetitive samples.
  • Penalty yang terlalu tinggi akan menghasilkan output yang buruk.
  • Nilai negatif mengijinkan repetisi pada samples.

Presence Penalty

Memiliki rentang nilai [-2, 2] dan default value adalah 0. Nilai positif akan penalize tokens baru berdasarkan keberadaan token tersebut sebelumnya. Nilai makin besar akan mendorong model untuk membuat topik baru.

Mirip dengan frequency penalty, namun proses dibelakang layar berbeda, berikut perbedaannya:

  • Presence penalty adalah kontribusi aditif satu kali yang berlaku untuk semua token yang telah diambil sampelnya setidaknya satu kali. Jadi, jika token pernah muncul, maka akan dipenalti. Tidak masalah pernah muncul 1, 2 atau 10 kali.
  • Frequence penalty adalah kontribusi yang sebanding dengan seberapa sering token tertentu telah diambil sampelnya. Jadi, Penalty diberikan kepada token yang paling sering muncul.

Presence penalty lebih tidak kentara dalam melakukan penalty dan mendorong mengenerate topik baru.

Berikut demo dengan menggunakan kode yang sama, namun mengganti menjadi presence_penalty .

nice_print({
    f"Presence Penalty {x}": openai.Completion.create(
        model="text-davinci-003", 
        prompt="""The first 15 elements are Hidrogen, Helium,""".strip(), 
        max_tokens =200, 
        presence_penalty=x, 
        echo=True)
    .choices[0]["text"]
    .strip()
    for x in [-2, -1, 0, 1, 2]
})
Presence Penalty -2:
The first 15 elements are Hidrogen, Helium, Lithium, Beryllium, Boron, Carbon, Nitrogen, Oxygen, Fluorine, Neon, Sodium,
Magnesium, Aluminium, Silicon, Phosphorus
----------------------------------------------------------------------------------------------------
Presence Penalty -1:
The first 15 elements are Hidrogen, Helium, Lithium, Beryllium, Boron, Carbon, Nitrogen, Oxygen, Fluorine, Neon, Sodium,
Magnesium, Aluminum, Silicon, and Phosphorus.
----------------------------------------------------------------------------------------------------
Presence Penalty 0:
The first 15 elements are Hidrogen, Helium, Lithium, Beryllium, Boron, Carbon, Nitrogen, Oxygen, Fluorine, Neon, Sodium,
Magnesium, Aluminium, Silicon, Phosphorus.
----------------------------------------------------------------------------------------------------
Presence Penalty 1:
The first 15 elements are Hidrogen, Helium, Lithium, Beryllium, Boron, Carbon, Nitrogen, Oxygen, Fluorine, Neon, Sodium,
Magnesium, Aluminium, Silicon and Phosphorus
----------------------------------------------------------------------------------------------------
Presence Penalty 2:
The first 15 elements are Hidrogen, Helium, Lithium, Beryllium, Boron, Carbon, Nitrogen, Oxygen, Fluorine, Neon, Sodium,
Magnesium, Aluminum, Silicon and Phosphorus.
----------------------------------------------------------------------------------------------------
Sharing is caring: