OpenAI API Fine-tuning

2023-03-17 15:26 更新

介紹

通過提供以下內(nèi)容,微調(diào)可讓您從 API 提供的模型中獲得更多收益:

  1. 比即時設(shè)計更高質(zhì)量的結(jié)果

  2. 能夠訓(xùn)練比提示中更多的例子

  3. 由于更短的提示而節(jié)省了代幣

  4. 更低的延遲請求

GPT-3 已經(jīng)在來自開放互聯(lián)網(wǎng)的大量文本上進行了預(yù)訓(xùn)練。當(dāng)給出僅包含幾個示例的提示時,它通??梢詰{直覺判斷出您要執(zhí)行的任務(wù)并生成合理的完成。這通常稱為“小樣本學(xué)習(xí)”。

微調(diào)通過訓(xùn)練比提示中更多的示例來改進小樣本學(xué)習(xí),讓您在大量任務(wù)中取得更好的結(jié)果。對模型進行微調(diào)后,您將不再需要在提示中提供示例。這樣可以節(jié)省成本并實現(xiàn)更低延遲的請求。

在高層次上,微調(diào)涉及以下步驟:

  1. 準(zhǔn)備和上傳訓(xùn)練數(shù)據(jù)

  2. 訓(xùn)練新的微調(diào)模型

  3. 使用您的微調(diào)模型

請訪問我們的定價頁面,詳細(xì)了解微調(diào)模型訓(xùn)練和使用的收費方式。

哪些模型可以微調(diào)?

微調(diào)目前僅適用于以下基本模型:davinci、curie、babbage 和 ada。這些是訓(xùn)練后沒有任何說明的原始模型(例如 text-davinci-003 有)。您還可以繼續(xù)微調(diào)微調(diào)模型以添加其他數(shù)據(jù),而無需從頭開始。

安裝

我們建議使用我們的 OpenAI 命令行界面 (CLI)。要安裝這個,運行

pip install --upgrade openai

(以下說明適用于 0.9.4 及更高版本。此外,OpenAI CLI 需要 python 3。)

通過將以下行添加到您的 shell 初始化腳本(例如 .bashrc、zshrc 等)或在微調(diào)命令之前的命令行中運行它來設(shè)置您的 OPENAI_API_KEY 環(huán)境變量:

export OPENAI_API_KEY="<OPENAI_API_KEY>"

準(zhǔn)備訓(xùn)練數(shù)據(jù)

訓(xùn)練數(shù)據(jù)是你如何教 GPT-3 你想讓它說什么。

您的數(shù)據(jù)必須是 JSONL 文檔,其中每一行都是一個提示完成對,對應(yīng)于一個訓(xùn)練示例。您可以使用我們的 CLI 數(shù)據(jù)準(zhǔn)備工具輕松地將您的數(shù)據(jù)轉(zhuǎn)換成這種文件格式。

{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
...

設(shè)計用于微調(diào)的提示和補全不同于設(shè)計用于我們的基本模型(Davinci、Curie、Babbage、Ada)的提示。特別是,雖然基礎(chǔ)模型的提示通常包含多個示例(“小樣本學(xué)習(xí)”),但對于微調(diào),每個訓(xùn)練示例通常包含一個輸入示例及其相關(guān)輸出,無需給出詳細(xì)說明或在同一提示中包含多個示例。

有關(guān)如何為各種任務(wù)準(zhǔn)備訓(xùn)練數(shù)據(jù)的更多詳細(xì)指導(dǎo),請參閱我們準(zhǔn)備數(shù)據(jù)集的最佳實踐。

您擁有的訓(xùn)練示例越多越好。我們建議至少有幾百個示例。一般來說,我們發(fā)現(xiàn)數(shù)據(jù)集大小每增加一倍都會導(dǎo)致模型質(zhì)量線性增加。

CLI數(shù)據(jù)準(zhǔn)備工具

我們開發(fā)了一個工具來驗證、提供建議和重新格式化您的數(shù)據(jù):

openai tools fine_tunes.prepare_data -f <LOCAL_FILE>

此工具接受不同的格式,唯一的要求是它們包含提示和完成列/鍵。您可以傳遞 CSV、TSV、XLSX、JSON 或 JSONL 文件,它會在指導(dǎo)您完成建議的更改過程后將輸出保存到 JSONL 文件中以備微調(diào)。

創(chuàng)建微調(diào)模型

以下假設(shè)您已經(jīng)按照上述說明準(zhǔn)備了訓(xùn)練數(shù)據(jù)。

使用 OpenAI CLI 開始微調(diào)工作:

openai api fine_tunes.create -t <TRAIN_FILE_ID_OR_PATH> -m <BASE_MODEL>

其中 BASE_MODEL 是您開始使用的基礎(chǔ)模型的名稱(ada、babbage、curie 或 davinci)。您可以使用后綴參數(shù)自定義微調(diào)模型的名稱。

運行上面的命令會做幾件事:

  1. 使用文件 API 上傳文件(或使用已經(jīng)上傳的文件)

  2. 創(chuàng)建微調(diào)作業(yè)

  3. 流式傳輸事件直到作業(yè)完成(這通常需要幾分鐘,但如果隊列中有很多作業(yè)或您的數(shù)據(jù)集很大,則可能需要數(shù)小時)

每個微調(diào)工作都從一個默認(rèn)為居里的基本模型開始。模型的選擇會影響模型的性能和運行微調(diào)模型的成本。您的模型可以是以下之一:ada、babbage、curie 或 davinci。請訪問我們的定價頁面,了解有關(guān)微調(diào)費率的詳細(xì)信息。

開始微調(diào)作業(yè)后,可能需要一些時間才能完成。在我們的系統(tǒng)中,您的工作可能排在其他工作之后,訓(xùn)練我們的模型可能需要幾分鐘或幾小時,具體取決于模型和數(shù)據(jù)集的大小。如果事件流因任何原因中斷,您可以通過運行以下命令恢復(fù)它:

openai api fine_tunes.follow -i <YOUR_FINE_TUNE_JOB_ID>

工作完成后,它應(yīng)該顯示微調(diào)模型的名稱。

除了創(chuàng)建微調(diào)作業(yè)外,您還可以列出現(xiàn)有作業(yè)、檢索作業(yè)狀態(tài)或取消作業(yè)。

# List all created fine-tunes
openai api fine_tunes.list

# Retrieve the state of a fine-tune. The resulting object includes
# job status (which can be one of pending, running, succeeded, or failed)
# and other information
openai api fine_tunes.get -i <YOUR_FINE_TUNE_JOB_ID>

# Cancel a job
openai api fine_tunes.cancel -i <YOUR_FINE_TUNE_JOB_ID>

使用微調(diào)模型

當(dāng)作業(yè)成功時, fine_tuned_model 字段將填充模型名稱。您現(xiàn)在可以將此模型指定為我們的 Completions API 的參數(shù),并使用 Playground 向它發(fā)出請求。

在您的工作首次完成后,您的模型可能需要幾分鐘時間才能準(zhǔn)備好處理請求。如果對您的模型的完成請求超時,可能是因為您的模型仍在加載中。如果發(fā)生這種情況,請在幾分鐘后重試。

您可以通過將模型名稱作為完成請求的模型參數(shù)傳遞來開始發(fā)出請求:

OpenAI CLI:

openai api completions.create -m <FINE_TUNED_MODEL> -p <YOUR_PROMPT>

cURL:

curl https://api.openai.com/v1/completions \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt": YOUR_PROMPT, "model": FINE_TUNED_MODEL}'

Python:

import openai
openai.Completion.create(
    model=FINE_TUNED_MODEL,
    prompt=YOUR_PROMPT)

Node.js:

const response = await openai.createCompletion({
  model: FINE_TUNED_MODEL
  prompt: YOUR_PROMPT,
});

您可以繼續(xù)使用所有其他完成參數(shù),如 temperature、frequency_penalty、presence_penalty 等,對這些請求進行微調(diào)模型。

刪除微調(diào)模型

要刪除微調(diào)模型,您必須在您的組織中被指定為“所有者”。

OpenAI CLI:

openai api models.delete -i <FINE_TUNED_MODEL>

cURL:

curl -X "DELETE" https://api.openai.com/v1/models/<FINE_TUNED_MODEL> \
  -H "Authorization: Bearer $OPENAI_API_KEY"

Python:

import openai
openai.Model.delete(FINE_TUNED_MODEL)

準(zhǔn)備數(shù)據(jù)集

微調(diào)是一種強大的技術(shù),可用于創(chuàng)建特定于您的用例的新模型。在微調(diào)您的模型之前,我們強烈建議您閱讀以下針對您的用例的最佳實踐和具體指南。

數(shù)據(jù)格式化

要微調(diào)模型,您需要一組訓(xùn)練示例,每個訓(xùn)練示例都包含一個輸入(“提示”)及其關(guān)聯(lián)的輸出(“完成”)。這與使用我們的基本模型明顯不同,在基本模型中,您可能會在單個提示中輸入詳細(xì)說明或多個示例。

  • 每個提示都應(yīng)以固定分隔符結(jié)尾,以在提示結(jié)束和完成開始時通知模型。通常效果很好的簡單分隔符是 \n\n###\n\n。分隔符不應(yīng)出現(xiàn)在任何提示中的其他地方。

  • 由于我們的標(biāo)記化,每個完成都應(yīng)該以一個空格開頭,它用一個前面的空格標(biāo)記了大多數(shù)單詞。

  • 每次完成都應(yīng)以固定的停止序列結(jié)束,以在完成結(jié)束時通知模型。停止序列可以是 \n、### 或任何其他未出現(xiàn)在任何完成中的標(biāo)記。

  • 對于推理,您應(yīng)該按照與創(chuàng)建訓(xùn)練數(shù)據(jù)集時相同的方式格式化提示,包括相同的分隔符。還指定相同的停止序列以正確截斷完成。

一般最佳實踐

使用更多高質(zhì)量的示例進行微調(diào)效果更好。要微調(diào)一個比使用我們的基本模型使用高質(zhì)量提示更好地執(zhí)行的模型,您應(yīng)該提供至少幾百個高質(zhì)量的示例,最好由人類專家審查。從那里開始,性能往往會隨著示例數(shù)量的每增加一倍而線性增加。增加示例的數(shù)量通常是提高性能的最佳和最可靠的方法。

分類器是最容易上手的模型。對于分類問題,我們建議使用 ada,經(jīng)過微調(diào)后,它通常只會比功能更強大的模型稍微差一點,同時速度更快,成本更低。

如果您要對預(yù)先存在的數(shù)據(jù)集進行微調(diào),而不是從頭開始編寫提示,請務(wù)必在可能的情況下手動檢查您的數(shù)據(jù)是否存在令人反感或不準(zhǔn)確的內(nèi)容,或者如果數(shù)據(jù)集很大,請檢查盡可能多的隨機樣本。

具體準(zhǔn)則

微調(diào)可以解決多種問題,最佳使用方式可能取決于您的具體用例。下面,我們列出了最常見的微調(diào)用例和相應(yīng)的指南。

分類

在分類問題中,提示中的每個輸入都應(yīng)分類到預(yù)定義的類別之一。對于此類問題,我們建議:

  • 在提示末尾使用分隔符,例如\n\n###\n\n。當(dāng)您最終向您的模型發(fā)出請求時,請記住還要附加此分隔符。

  • 選擇映射到單個令牌的類。在推理時,指定 max_tokens=1 因為您只需要第一個標(biāo)記進行分類。

  • 確保提示+完成不超過 2048 個標(biāo)記,包括分隔符

  • 目標(biāo)是每類至少 ~100 個例子

  • 要獲得類日志概率,您可以在使用模型時指定 logprobs=5 (對于 5 個類)

  • 確保用于微調(diào)的數(shù)據(jù)集在結(jié)構(gòu)和任務(wù)類型上與模型將用于的數(shù)據(jù)集非常相似

案例研究:模型是否做出了不真實的陳述?

假設(shè)您希望確保您網(wǎng)站上的廣告文字提及正確的產(chǎn)品和公司。換句話說,您要確保模型沒有胡編亂造。您可能想要微調(diào)過濾掉不正確廣告的分類器。

數(shù)據(jù)集可能類似于以下內(nèi)容:

{"prompt":"Company: BHFF insurance\nProduct: allround insurance\nAd:One stop shop for all your insurance needs!\nSupported:", "completion":" yes"}
{"prompt":"Company: Loft conversion specialists\nProduct: -\nAd:Straight teeth in weeks!\nSupported:", "completion":" no"}

在上面的示例中,我們使用了包含公司名稱、產(chǎn)品和相關(guān)廣告的結(jié)構(gòu)化輸入。我們使用 \nSupported: 作為分隔符,它清楚地將提示與完成分開。對于足夠數(shù)量的示例,分隔符不會產(chǎn)生太大影響(通常小于 0.4%),只要它沒有出現(xiàn)在提示或完成中即可。

對于這個用例,我們微調(diào)了一個 ada 模型,因為它會更快、更便宜,而且性能將與更大的模型相當(dāng),因為它是一個分類任務(wù)。

現(xiàn)在我們可以通過發(fā)出完成請求來查詢我們的模型。

curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "prompt": "Company: Reliable accountants Ltd\nProduct: Personal Tax help\nAd:Best advice in town!\nSupported:",
    "max_tokens": 1,
    "model": "YOUR_FINE_TUNED_MODEL_NAME"
  }'

這將返回是或否。

案例研究:情緒分析

假設(shè)您想要了解特定推文的正面或負(fù)面程度。數(shù)據(jù)集可能類似于以下內(nèi)容:

{"prompt":"Overjoyed with the new iPhone! ->", "completion":" positive"}
{"prompt":"@lakers disappoint for a third straight night https://t.co/38EFe43 ->", "completion":" negative"}

對模型進行微調(diào)后,您可以通過在完成請求上設(shè)置 logprobs=2 來取回第一個完成標(biāo)記的對數(shù)概率。正類別的概率越高,相對情緒就越高。

現(xiàn)在我們可以通過發(fā)出完成請求來查詢我們的模型。

curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "prompt": "https://t.co/f93xEd2 Excited to share my latest blog post! ->",
    "max_tokens": 1,
    "model": "YOUR_FINE_TUNED_MODEL_NAME"
  }'

哪個將返回:

{
  "id": "cmpl-COMPLETION_ID",
  "object": "text_completion",
  "created": 1589498378,
  "model": "YOUR_FINE_TUNED_MODEL_NAME",
  "choices": [
    {
      "logprobs": {
        "text_offset": [
          19
        ],
        "token_logprobs": [
          -0.03597255
        ],
        "tokens": [
          " positive"
        ],
        "top_logprobs": [
          {
            " negative": -4.9785037,
            " positive": -0.03597255
          }
        ]
      },

      "text": " positive",
      "index": 0,
      "finish_reason": "length"
    }
  ]
}

案例研究:電子郵件分類的分類

假設(shè)您希望將收到的電子郵件歸入大量預(yù)定義類別之一。對于大量類別的分類,我們建議您將這些類別轉(zhuǎn)換為數(shù)字,最多可處理約 500 個類別。我們觀察到,由于標(biāo)記化,在數(shù)字前添加一個空格有時會對性能略有幫助。您可能希望按如下方式構(gòu)建訓(xùn)練數(shù)據(jù):

{"prompt":"Subject: <email_subject>\nFrom:<customer_name>\nDate:<date>\nContent:<email_body>\n\n###\n\n", "completion":" <numerical_category>"}

例如:

{"prompt":"Subject: Update my address\nFrom:Joe Doe\nTo:support@ourcompany.com\nDate:2021-06-03\nContent:Hi,\nI would like to update my billing address to match my delivery address.\n\nPlease let me know once done.\n\nThanks,\nJoe\n\n###\n\n", "completion":" 4"}

在上面的示例中,我們使用了一封上限為 2043 個令牌的傳入電子郵件作為輸入。 (這允許使用 4 個標(biāo)記分隔符和一個標(biāo)記完成,總計為 2048。)作為分隔符,我們使用 \n\n###\n\n 并且我們刪除了電子郵件中所有出現(xiàn)的 ### 。

條件生成

條件生成是需要在給定某種輸入的情況下生成內(nèi)容的問題。這包括釋義、總結(jié)、實體提取、編寫給定規(guī)范的產(chǎn)品描述、聊天機器人等。對于此類問題,我們建議:

  • 在提示末尾使用分隔符,例如\n\n###\n\n。當(dāng)您最終向您的模型發(fā)出請求時,請記住還要附加此分隔符。

  • 在完成結(jié)束時使用結(jié)束標(biāo)記,例如結(jié)尾

  • 請記住在推理過程中將結(jié)束標(biāo)記添加為停止序列,例如 stop=[" END"]
  • 目標(biāo)是至少 ~500 個示例

  • 確保提示+完成不超過 2048 個標(biāo)記,包括分隔符

  • 確保示例具有高質(zhì)量并遵循相同的所需格式

  • 確保用于微調(diào)的數(shù)據(jù)集在結(jié)構(gòu)和任務(wù)類型上與模型將用于的數(shù)據(jù)集非常相似

  • 使用較低的學(xué)習(xí)率和僅 1-2 個時期往往更適合這些用例

案例研究:根據(jù)維基百科文章撰寫引人入勝的廣告

這是一個生成用例,因此您需要確保提供的樣本具有最高質(zhì)量,因為微調(diào)模型將嘗試模仿給定示例的風(fēng)格(和錯誤)。一個好的起點是大約 500 個示例。示例數(shù)據(jù)集可能如下所示:

{"prompt":"<Product Name>\n<Wikipedia description>\n\n###\n\n", "completion":" <engaging ad> END"}

例如:

{"prompt":"Samsung Galaxy Feel\nThe Samsung Galaxy Feel is an Android smartphone developed by Samsung Electronics exclusively for the Japanese market. The phone was released in June 2017 and was sold by NTT Docomo. It runs on Android 7.0 (Nougat), has a 4.7 inch display, and a 3000 mAh battery.\nSoftware\nSamsung Galaxy Feel runs on Android 7.0 (Nougat), but can be later updated to Android 8.0 (Oreo).\nHardware\nSamsung Galaxy Feel has a 4.7 inch Super AMOLED HD display, 16 MP back facing and 5 MP front facing cameras. It has a 3000 mAh battery, a 1.6 GHz Octa-Core ARM Cortex-A53 CPU, and an ARM Mali-T830 MP1 700 MHz GPU. It comes with 32GB of internal storage, expandable to 256GB via microSD. Aside from its software and hardware specifications, Samsung also introduced a unique a hole in the phone's shell to accommodate the Japanese perceived penchant for personalizing their mobile phones. The Galaxy Feel's battery was also touted as a major selling point since the market favors handsets with longer battery life. The device is also waterproof and supports 1seg digital broadcasts using an antenna that is sold separately.\n\n###\n\n", "completion":"Looking for a smartphone that can do it all? Look no further than Samsung Galaxy Feel! With a slim and sleek design, our latest smartphone features high-quality picture and video capabilities, as well as an award winning battery life. END"}

這里我們使用了多行分隔符,因為維基百科文章包含多個段落和標(biāo)題。我們還使用了一個簡單的結(jié)束標(biāo)記,以確保模型知道何時應(yīng)該完成完成。

案例研究:實體提取

這類似于語言轉(zhuǎn)換任務(wù)。為了提高性能,最好按字母順序或按照它們在原始文本中出現(xiàn)的相同順序?qū)Σ煌奶崛嶓w進行排序。這將有助于模型跟蹤需要按順序生成的所有實體。數(shù)據(jù)集可能如下所示:

{"prompt":"<any text, for example news article>\n\n###\n\n", "completion":" <list of entities, separated by a newline> END"}

例如:

{"prompt":"Portugal will be removed from the UK's green travel list from Tuesday, amid rising coronavirus cases and concern over a \"Nepal mutation of the so-called Indian variant\". It will join the amber list, meaning holidaymakers should not visit and returnees must isolate for 10 days...\n\n###\n\n", "completion":" Portugal\nUK\nNepal mutation\nIndian variant END"}

多行分隔符效果最好,因為文本可能包含多行。理想情況下,輸入提示的類型會高度多樣化(新聞文章、維基百科頁面、推文、法律文件),這反映了提取實體時可能遇到的文本。

案例研究:客戶支持聊天機器人

聊天機器人通常會包含有關(guān)對話的相關(guān)上下文(訂單詳細(xì)信息)、到目前為止的對話摘要以及最近的消息。對于這個用例,相同的過去對話可以在數(shù)據(jù)集中生成多行,每次都有稍微不同的上下文,對于每個代理生成作為完成。這個用例將需要幾千個示例,因為它可能會處理不同類型的請求和客戶問題。為確保高質(zhì)量的性能,我們建議審查對話樣本以確保代理消息的質(zhì)量??梢允褂脝为毜奈谋巨D(zhuǎn)換微調(diào)模型生成摘要。數(shù)據(jù)集可能如下所示:

{"prompt":"Summary: <summary of the interaction so far>\n\nSpecific information:<for example order details in natural language>\n\n###\n\nCustomer: <message1>\nAgent: <response1>\nCustomer: <message2>\nAgent:", "completion":" <response2>\n"}
{"prompt":"Summary: <summary of the interaction so far>\n\nSpecific information:<for example order details in natural language>\n\n###\n\nCustomer: <message1>\nAgent: <response1>\nCustomer: <message2>\nAgent: <response2>\nCustomer: <message3>\nAgent:", "completion":" <response3>\n"}

在這里,我們有意分離不同類型的輸入信息,但在提示和完成之間以相同的格式維護客戶代理對話框。所有的完成都應(yīng)該只由代理完成,我們可以在進行推理時使用 \n 作為停止序列。

案例研究:基于技術(shù)屬性列表的產(chǎn)品描述

在這里,將輸入數(shù)據(jù)轉(zhuǎn)換為自然語言很重要,這可能會帶來卓越的性能。例如,以下格式:

{"prompt":"Item=handbag, Color=army_green, price=$99, size=S->", "completion":" This stylish small green handbag will add a unique touch to your look, without costing you a fortune."}

不會像以下那樣工作:

{"prompt":"Item is a handbag. Colour is army green. Price is midrange. Size is small.->", "completion":" This stylish small green handbag will add a unique touch to your look, without costing you a fortune."}

為了獲得高性能,請確保完成是基于所提供的描述。如果經(jīng)常查閱外部內(nèi)容,則以自動方式添加此類內(nèi)容將提高性能。如果描述基于圖像,則使用算法提取圖像的文本描述可能會有所幫助。由于補全只有一個句子長,我們可以使用 .作為推理期間的停止序列。

高級用法

自定義您的模型名稱

您可以使用后綴參數(shù)將最多 40 個字符的后綴添加到經(jīng)過微調(diào)的模型名稱中。

OpenAI CLI:

openai api fine_tunes.create -t test.jsonl -m ada --suffix "custom model name"

結(jié)果名稱將是:

ada:ft-your-org:custom-model-name-2022-02-15-04-21-04

分析您的微調(diào)模型

我們會在每個作業(yè)完成后附上一個結(jié)果文件。當(dāng)您檢索微調(diào)時以及查看微調(diào)中的事件時,將列出此結(jié)果文件 ID。您可以下載這些文件:

OpenAI CLI:

openai api fine_tunes.results -i <YOUR_FINE_TUNE_JOB_ID>

CURL:

curl https://api.openai.com/v1/files/$RESULTS_FILE_ID/content \
  -H "Authorization: Bearer $OPENAI_API_KEY" > results.csv

_results.csv 文件為每個訓(xùn)練步驟包含一行,其中一個步驟是指對一批數(shù)據(jù)的一次前向和反向傳遞。除步驟編號外,每行還包含與該步驟對應(yīng)的以下字段:

  • elapsed_tokens: 到目前為止模型已經(jīng)看到的標(biāo)記數(shù)量(包括重復(fù))
  • elapsed_examples: 模型到目前為止已經(jīng)看到的示例數(shù)量(包括重復(fù)),其中一個示例是您的批次中的一個元素。例如,如果 batch_size = 4,則每一步都會將 elapsed_examples 增加 4。
  • training_loss: 訓(xùn)練批次損失
  • training_sequence_accuracy: 模型的預(yù)測標(biāo)記與真實完成標(biāo)記完全匹配的訓(xùn)練批次中的完成百分比。例如,如果 batch_size 為 3,如果您的數(shù)據(jù)包含補全 [[1, 2], [0, 5], [4, 2]] 和模型預(yù)測 [[1, 1], [0, 5] , [4, 2]], 這個精度將是 2/3 = 0.67
  • training_token_accuracy: 模型正確預(yù)測的訓(xùn)練批次中標(biāo)記的百分比。例如,如果 batch_size 為 3,如果您的數(shù)據(jù)包含補全 [[1, 2], [0, 5], [4, 2]] 和模型預(yù)測 [[1, 1], [0, 5] , [4, 2]], 這個精度將是 5/6 = 0.83

分類特定指標(biāo)

我們還提供了在結(jié)果文件中生成其他特定于分類的指標(biāo)的選項,例如準(zhǔn)確性和加權(quán) F1 分?jǐn)?shù)。這些指標(biāo)是根據(jù)完整的驗證集和微調(diào)結(jié)束時定期計算的。您將在結(jié)果文件中看到它們作為附加列。

要啟用此功能,請設(shè)置參數(shù) --compute_classification_metrics。此外,您必須提供一個驗證文件,并為多類分類設(shè)置 classification_n_classes 參數(shù),或為二元分類設(shè)置 classification_positive_class 參數(shù)。

OpenAI CLI:

# For multiclass classification
openai api fine_tunes.create \
  -t <TRAIN_FILE_ID_OR_PATH> \
  -v <VALIDATION_FILE_OR_PATH> \
  -m <MODEL> \
  --compute_classification_metrics \
  --classification_n_classes <N_CLASSES>

# For binary classification
openai api fine_tunes.create \
  -t <TRAIN_FILE_ID_OR_PATH> \
  -v <VALIDATION_FILE_OR_PATH> \
  -m <MODEL> \
  --compute_classification_metrics \
  --classification_n_classes 2 \
  --classification_positive_class <POSITIVE_CLASS_FROM_DATASET>

如果您設(shè)置 --compute_classification_metrics,以下指標(biāo)將顯示在您的結(jié)果文件中:

對于多類分類

  • classification/accuracy: accuracy
  • classification/weighted_f1_score: weighted F-1 score

對于二進制分類

以下指標(biāo)基于 0.5 的分類閾值(即當(dāng)概率 > 0.5 時,示例被分類為屬于正類。)

  • classification/accuracy
  • classification/precision
  • classification/recall
  • classification/f{beta}
  • classification/auroc - AUROC
  • classification/auprc - AUPRC

請注意,這些評估假設(shè)您正在為將標(biāo)記化為單個標(biāo)記的類使用文本標(biāo)簽,如上所述。如果這些條件不成立,您得到的數(shù)字很可能是錯誤的。

驗證

您可以保留一些數(shù)據(jù)以供驗證。驗證文件與訓(xùn)練文件具有完全相同的格式,并且您的訓(xùn)練數(shù)據(jù)和驗證數(shù)據(jù)應(yīng)該互斥。

如果您在創(chuàng)建微調(diào)作業(yè)時包含驗證文件,則生成的結(jié)果文件將包括對微調(diào)模型在訓(xùn)練期間定期對驗證數(shù)據(jù)執(zhí)行情況的評估。

OpenAI CLI:

openai api fine_tunes.create -t <TRAIN_FILE_ID_OR_PATH> \
  -v <VALIDATION_FILE_ID_OR_PATH> \
  -m <MODEL>

如果您提供了驗證文件,我們會在訓(xùn)練期間定期計算批量驗證數(shù)據(jù)的指標(biāo)。您將在結(jié)果文件中看到以下附加指標(biāo):

  • validation_loss: 驗證批次損失
  • validation_sequence_accuracy: 模型的預(yù)測標(biāo)記與真實完成標(biāo)記完全匹配的驗證批次中的完成百分比。例如,batch_size 為 3,如果您的數(shù)據(jù)包含完成 [[1, 2], [0, 5], [4, 2]] 和模型預(yù)測 [[1, 1], [0, 5] , [4, 2]], 這個精度將是 2/3 = 0.67
  • validation_token_accuracy: 模型正確預(yù)測的驗證批次中標(biāo)記的百分比。例如,batch_size 為 3,如果您的數(shù)據(jù)包含完成 [[1, 2], [0, 5], [4, 2]] 和模型預(yù)測 [[1, 1], [0, 5] , [4, 2]], 這個精度將是 5/6 = 0.83

超參數(shù)

我們選擇了適用于一系列用例的默認(rèn)超參數(shù)。唯一需要的參數(shù)是訓(xùn)練文件。

也就是說,調(diào)整用于微調(diào)的超參數(shù)通??梢援a(chǎn)生產(chǎn)生更高質(zhì)量輸出的模型。特別是,您可能需要配置以下內(nèi)容:

  • model: 要微調(diào)的基本模型的名稱。您可以選擇“ada”、“babbage”、“curie”或“davinci”之一。要了解有關(guān)這些模型的更多信息,請參閱模型文檔
  • n_epochs - 默認(rèn)為 4。訓(xùn)練模型的時期數(shù)。一個紀(jì)元指的是訓(xùn)練數(shù)據(jù)集的一個完整周期。
  • batch_size - 默認(rèn)為訓(xùn)練集中示例數(shù)的 0.2%,上限為 256。批量大小是用于訓(xùn)練單個前向和反向傳遞的訓(xùn)練示例數(shù)??偟膩碚f,我們發(fā)現(xiàn)更大的批次大小往往更適用于更大的數(shù)據(jù)集。
  • learning_rate_multiplier - 默認(rèn)為 0.05、0.1 或 0.2,具體取決于最終的 batch_size。微調(diào)學(xué)習(xí)率是用于預(yù)訓(xùn)練的原始學(xué)習(xí)率乘以該乘數(shù)。我們建議使用 0.02 到 0.2 范圍內(nèi)的值進行試驗,以查看產(chǎn)生最佳結(jié)果的值。根據(jù)經(jīng)驗,我們發(fā)現(xiàn)較大的學(xué)習(xí)率通常在較大的批量大小下表現(xiàn)更好。
  • compute_classification_metrics - 默認(rèn)為假。如果為 True,為了對分類任務(wù)進行微調(diào),在每個 epoch 結(jié)束時在驗證集上計算特定于分類的指標(biāo)(準(zhǔn)確性、F-1 分?jǐn)?shù)等)。

要配置這些額外的超參數(shù),請通過 OpenAI CLI 上的命令行標(biāo)志傳遞它們,例如:

openai api fine_tunes.create \
  -t file-JD89ePi5KMsB3Tayeli5ovfW \
  -m ada \
  --n_epochs 1

從微調(diào)模型繼續(xù)微調(diào)

如果您已經(jīng)為您的任務(wù)微調(diào)了一個模型,并且現(xiàn)在有您想要合并的額外訓(xùn)練數(shù)據(jù),您可以從模型繼續(xù)微調(diào)。這將創(chuàng)建一個從所有訓(xùn)練數(shù)據(jù)中學(xué)習(xí)的模型,而無需從頭開始重新訓(xùn)練。

為此,請在創(chuàng)建新的微調(diào)作業(yè)時傳入微調(diào)模型名稱(例如 -m curie:ft-<org>-<date>)。不必更改其他訓(xùn)練參數(shù),但是如果您的新訓(xùn)練數(shù)據(jù)比以前的訓(xùn)練數(shù)據(jù)小得多,您可能會發(fā)現(xiàn)將 learning_rate_multiplier 減少 2 到 4 倍很有用。

權(quán)重和偏差

您可以將微調(diào)與權(quán)重和偏差同步以跟蹤實驗、模型和數(shù)據(jù)集。

要開始使用,您需要一個 Weights & Biases 帳戶和一個付費的 OpenAI 計劃。為確保您使用的是最新版本的 openai 和 wandb,請運行:

pip install --upgrade openai wandb

要將微調(diào)與權(quán)重和偏差同步,請運行:

openai wandb sync

您可以閱讀權(quán)重和偏差文檔以獲取有關(guān)此集成的更多信息。

示例筆記本

分類

finetuning-classification.ipynb

此筆記本將演示如何微調(diào)模型,該模型可以對一段輸入文本是否與棒球或曲棍球相關(guān)進行分類。我們將在筆記本中分四個步驟執(zhí)行此任務(wù):

  1. 數(shù)據(jù)探索將概述數(shù)據(jù)源和示例

  2. 數(shù)據(jù)準(zhǔn)備會將我們的數(shù)據(jù)源變成一個jsonl文件,可以用來微調(diào)

  3. 微調(diào)將啟動微調(diào)工作并解釋生成的模型的性能

  4. 使用該模型將演示向微調(diào)模型發(fā)出請求以獲得預(yù)測。

問題解答

olympics-1-collect-data.ipynb

olympics-2-create-qa.ipynb

olympics-3-train-qa.ipynb

這個項目的想法是基于提供的文本的幾段來創(chuàng)建一個問答模型。當(dāng)答案包含在段落中時,基本 GPT-3 模型在回答問題方面做得很好,但是如果答案不包含在內(nèi),基本模型往往會盡力回答,這通常會導(dǎo)致混淆答案。

為了創(chuàng)建一個僅在有足夠上下文的情況下才回答問題的模型,我們首先創(chuàng)建一個基于文本段落的問題和答案數(shù)據(jù)集。為了訓(xùn)練模型僅在出現(xiàn)答案時回答,我們還添加了對抗性示例,其中問題與上下文不匹配。在這些情況下,我們要求模型輸出“沒有足夠的上下文來回答問題”。

我們將在三個筆記本中執(zhí)行此任務(wù):

  1. The first notebook 專注于收集最近的數(shù)據(jù),這些數(shù)據(jù)是 GPT-3 在預(yù)訓(xùn)練期間沒有看到的。我們選擇了 2020 年奧運會(實際發(fā)生在 2021 年夏天)的主題,并下載了 713 個獨特的頁面。我們按各個部分組織數(shù)據(jù)集,這些部分將作為提問和回答問題的背景。
  2. The second notebook 將利用 Davinci-instruct 根據(jù)維基百科部分提出一些問題,并根據(jù)該部分回答這些問題。
  3. The third notebook 將利用上下文、問題和答案對的數(shù)據(jù)集來額外創(chuàng)建對抗性問題和上下文對,其中問題不是在該上下文中生成的。在這些情況下,系統(tǒng)將提示模型回答“沒有足夠的上下文來回答問題”。我們還將訓(xùn)練一個鑒別器模型,該模型預(yù)測是否可以根據(jù)上下文回答問題。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號