精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

ML工程師一次微調七個模型,擊敗OpenAI GPT-4

人工智能 新聞
「微調你的模型,獲得比GPT-4更好的性能」不只是說說而已,而是真的可操作。最近,一位愿意動手的ML工程師就把幾個開源LLM調教成了自己想要的樣子。

模型微調(Fine Tuning)指的是在已經訓練好的大語言模型(LLM)的基礎上,使用特定的數據集進行進一步訓練,這種「站在巨人肩膀上」的做法,可以用比較小的數據集,比較低的訓練成本獲得更好的收益,避免了重復造輪子。

在大模型時代,提示詞工程(Prompt Engineering)、模型微調和檢索增強生成(RAG)都是非常重要的能力,對于大多數個人使用者來說,掌握提示詞工程就夠用了,但如果想要在自己的服務中接入大模型,模型微調是必由之路,也因為其對于技能的更高要求,成為了ML工程師高手過招之地。

今日,一位ML工程師的微調模型就登上了HN熱榜,「我的微調模型擊敗了OpenAI的GPT-4」!

圖片

工程師Alex Strick van Linschoten在博客中指出,就他的測試數據而言,Mistral、Llama3和Solar LLM的微調模型都要比OpenAI的模型更準確。

圖片

文章地址:https://mlops.systems/posts/2024-07-01-full-finetuned-model-evaluation.html#start-date-accuracy

圖片

對此,作者戲稱道,這篇文章的標題可以直接改為:微調模型擊敗OpenAI,但評估過程實在痛苦。

他坦言,代碼量很多,運行速度也較慢。在這次微調中,他第一次為微調選擇而糾結權衡。如果沒有某種系統來處理這個問題,維護這一切的復雜性就會開始增加。

現在,我們來看一下這位工程師是如何做的。(詳細代碼請參見原文)

加載數據集

所有數據都存儲在Hugging Face Hub的一個公共倉庫中。

為了進行這些評估,作者選擇使用數據集的測試部分,因為模型之前沒有接觸過這些數據,這樣可以更好地評估模型在新數據上的表現。

test_dataset
Dataset({
    features: ['name', 'eventrefnumber', 'text', 'StartDate', 'eventtype', 'province', 'citydistrict', 'village', 'targetgroup', 'commander', 'position', 'minkilled', 'mincaptured', 'capturedcharacterisation', 'killedcharacterisation', 'killq', 'captureq', 'killcaptureraid', 'airstrike', 'noshotsfired', 'dataprocessed', 'flagged', 'glossarymeta', 'minleaderskilled', 'minfacilitatorskilled', 'minleaderscaptured', 'minfacilitatorscaptured', 'leaderq'],
    num_rows: 724
})

首先在DataFrame中添加一個額外的列,然后對數據集中的每一行進行預測。將預測的副本存儲到這一列中,以避免重復執行這個計算密集的步驟。

但首先需要將數據組裝成Pydantic對象,以便處理數據驗證。

[
    IsafEvent(
        name='5',
        text='2013-01-S-025\n\nKABUL, Afghanistan (Jan. 25, 2013)\nDuring a security operation in Andar district, Ghazni province, yesterday, an Afghan and coalition force killed the Taliban leader, Alaudin. Alaudin oversaw a group of insurgents responsible for conducting remote-controlled improvised explosive device and small-arms fire attacks against Afghan and coalition forces. Prior to his death, Alaudin was planning attacks against Afghan National Police in Ghazni province.',
        start_date=datetime.date(2013, 1, 24),
        event_type={'insurgentskilled'},
        province={'ghazni'},
        target_group={'taliban'},
        min_killed=1,
        min_captured=0,
        killq=True,
        captureq=False,
        killcaptureraid=False,
        airstrike=False,
        noshotsfired=False,
        min_leaders_killed=1,
        min_leaders_captured=0,
        predictions={}
    ),
    IsafEvent(
        name='2',
        text='2011-11-S-034\nISAF Joint Command - Afghanistan\nFor Immediate Release\n\nKABUL, Afghanistan (Nov. 20, 2011)\nA coalition security force detained numerous suspected insurgents during an operation in Marjeh district, Helmand province, yesterday.  The force conducted the operation after receiving information that a group of insurgents were at a compound in the area.  After calling for the men inside to come out peacefully, the insurgents emerged and were detained without incident.',
        start_date=datetime.date(2011, 11, 19),
        event_type={'detention'},
        province={'helmand'},
        target_group={''},
        min_killed=0,
        min_captured=4,
        killq=False,
        captureq=True,
        killcaptureraid=True,
        airstrike=False,
        noshotsfired=False,
        min_leaders_killed=0,
        min_leaders_captured=0,
        predictions={}
     )
]

因此,當進行預測時,我們希望從模型中得到一個類似這樣的JSON字符串:

json_str = events[0].model_dump_json(exclude={"text", "predictions"})
print(json_str)
{"name":"5","start_date":"2013-01-24","event_type":["insurgentskilled"],"province":["ghazni"],"target_group":["tali
ban"],"min_killed":1,"min_captured":0,"killq":true,"captureq":false,"killcaptureraid":false,"airstrike":false,"nosh
otsfired":false,"min_leaders_killed":1,"min_leaders_captured":0}

從使用GPT模型進行完整評估開始,需要一個更復雜的提示詞才能獲得理想的結果。

由于GPT模型沒有經過訓練或微調來響應微調模型的特定提示詞,因此我們不能直接使用相同的提示詞。

這帶來了一個有趣的問題:我們需要花多少精力在設計GPT提示詞上,才能達到微調模型的準確度?換句話說,是否真的有辦法在接受不同提示詞的模型之間進行公平的比較?

嘗試OpenAI的GPT-4和GPT-4 Turbo可以看到,為了讓GPT模型有機會與微調模型競爭,提示詞需要多長。

理想情況下,作者會在上下文中加入更多的示例,但他也不希望增加token的使用量。

from openai import OpenAI
from rich import print
import json
import os


def query_openai(article_text: str, model: str) -> str:
    query = (
        f"The following is a press release issued by ISAF (formerly operating in Afghanistan):\n{article_text}\n\n"
        "## Extraction request\n"
        "Please extract the following information from the press release:\n"
        "- The name of the event (summarising the event / text as a headline)\n"
        "- The start date of the event\n"
        "- The event type(s)\n"
        "- The province(s) in which the event occurred\n"
        "- The target group(s) of the event\n"
        "- The minimum number of people killed during the event\n"
        "- The minimum number of people captured during the event\n"
        "- Whether someone was killed or not during the event\n"
        "- Whether someone was captured or not during the event\n"
        "- Whether the event was a so-called 'kill-capture raid'\n"
        "- Whether an airstrike was used during the event\n"
        "- Whether no shots were fired during the event\n"
        "- The minimum number of leaders killed during the event\n"
        "- The minimum number of leaders captured during the event\n\n"
        "## Annotation notes:\n"
        "- A 'faciliator' is not a leader.\n"
        "- If a press release states that 'insurgents' were detained without further "
        "details, assign a minimum number of two detained. Interpret 'a couple' as "
        "two. Interpret 'several' as at least three, even though it may sometimes "
        "refer to seven or eight. Classify the terms 'a few', 'some', 'a group', 'a "
        "small group', and 'multiple' as denoting at least three, even if they "
        "sometimes refer to larger numbers. Choose the smaller number if no other "
        "information is available in the press release to come up with a minimally "
        "acceptable figure. Interpret 'numerous' and 'a handful' as at least four, "
        "and 'a large number' as at least five.\n\n"
        "## Example:\n"
        "Article text: 'ISAF Joint Command Evening Operational Update Feb. 19, 2011\nISAF Joint Command - "
        "Afghanistan\u20282011-02-S-143\u2028For Immediate Release \u2028\u2028KABUL, Afghanistan (Feb. 19)\u2028\u2028ISAF "
        "service members at a compound in Sangin district, Helmand province observed numerous insurgents north and south of "
        "their position talking on radios today. After gaining positive identification of the insurgent positions, the "
        "coalition troops engaged, killing several insurgents. Later, the ISAF troops observed more insurgents positioning "
        "in the area with weapons. After positive identification, coalition forces continued firing on the various insurgent "
        "positions, resulting in several more insurgents being killed.'\n\n"
        'Output: `{"name":"Several insurgents killed in '
        'Helmand","start_date":"2011-02-18","event_type":["insurgentskilled"],"province":["helmand"],"target_group":[""],"mi'
        'n_killed":6,"min_captured":0,"killq":true,"captureq":false,"killcaptureraid":false,"airstrike":false,"noshotsfired"'
        ':false,"min_leaders_killed":0,"min_leaders_captured":0}`'
    )


    # set up the prediction harness
    client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))


    response = client.chat.completions.create(
        model=model,
        response_format={"type": "json_object"},
        messages=[
            {
                "role": "system",
                "content": "You are an expert at identifying events in a press release. You are precise "
                "and always make sure you are correct, drawing inference from the text of the "
                "press release.\n\n You always return a JSON string with the following schema: "
                "## JSON Schema details\n"
                "Here is some of the schema for the JSON output string you "
                "should make use of: event_types = ['airstrike', 'detention', "
                "'captureandkill', 'insurgentskilled', 'exchangeoffire', 'civiliancasualty'], "
                "provinces = ['badakhshan', 'badghis', 'baghlan', 'balkh', 'bamyan', "
                "'day_kundi', 'farah', 'faryab', 'ghazni', 'ghor', 'helmand', 'herat', "
                "'jowzjan', 'kabul', 'kandahar', 'kapisa', 'khost', 'kunar', 'kunduz', "
                "'laghman', 'logar', 'nangarhar', 'nimroz', 'nuristan', 'paktya', 'paktika', "
                "'panjshir', 'parwan', 'samangan', 'sar_e_pul', 'takhar', 'uruzgan', "
                "'wardak', 'zabul'], target_groups = ['taliban', 'haqqani', 'criminals', "
                "'aq', 'hig', 'let', 'imu', 'judq', 'iju', 'hik', 'ttp', 'other']\n\n",
            },
            {"role": "user", "content": query},
        ],
        temperature=1,
    )


    return response.choices[0].message.content

可以通過一個簡單的示例來驗證這個函數是否正常工作:

json_str = query_openai(events[0].text, "gpt-4o")
print(json.loads(json_str))
{
    'name': 'Taliban leader Alaudin killed in Ghazni',
    'start_date': '2013-01-24',
    'event_type': ['insurgentskilled'],
    'province': ['ghazni'],
    'target_group': ['taliban'],
    'min_killed': 1,
    'min_captured': 0,
    'killq': True,
    'captureq': False,
    'killcaptureraid': True,
    'airstrike': False,
    'noshotsfired': False,
    'min_leaders_killed': 1,
    'min_leaders_captured': 0
}

模型正常工作(如預期的那樣),并且我們得到了一個JSON字符串。

接下來,構建一個程序來遍歷所有測試數據,獲取預測結果,并將這些預測結果存儲在Pydantic對象中。

對于批量預測,要確保以異步方式進行,因為有大量的事件,所以不希望耗費太多時間。

此外,作者還在函數中添加了一些重試機制,以應對GPT-3.5-turbo模型的速率限制。

正如我們現在所看到的,作者對每個事件都附加了三個預測結果。

print(events[0])
IsafEvent(
    name='5',
    text='2013-01-S-025\n\nKABUL, Afghanistan (Jan. 25, 2013)\nDuring a security operation in Andar district, Ghazni province, yesterday, an Afghan and coalition force killed the Taliban leader, Alaudin. Alaudin oversaw a group of insurgents responsible for conducting remote-controlled improvised explosive device and small-arms fire attacks against Afghan and coalition forces. Prior to his death, Alaudin was planning attacks against Afghan National Police in Ghazni province.',
    start_date=datetime.date(2013, 1, 24),
    event_type={'insurgentskilled'},
    province={'ghazni'},
    target_group={'taliban'},
    min_killed=1,
    min_captured=0,
    killq=True,
    captureq=False,
    killcaptureraid=False,
    airstrike=False,
    noshotsfired=False,
    min_leaders_killed=1,
    min_leaders_captured=0,
    predictinotallow={'gpt-4o': '{\n  "name": "Taliban leader Alaudin killed in Ghazni",\n  "start_date": "2013-01-24",\n  "event_type": ["insurgentskilled", "captureandkill"],\n  "province": ["ghazni"],\n  "target_group": ["taliban"],\n "min_killed": 1,\n  "min_captured": 0,\n  "killq": true,\n  "captureq": false,\n  "killcaptureraid": true,\n  "airstrike": false,\n  "noshotsfired": false,\n  "min_leaders_killed": 1,\n  "min_leaders_captured": 0\n}',
        'gpt-4-turbo': '{\n    "name": "Taliban leader Alaudin killed in Ghazni",\n    "start_date": "2013-01-24",\n    "event_type": ["captureandkill"],\n    "province": ["ghazni"],\n    "target_group": ["taliban"],\n    "min_killed": 1,\n    "min_captured": 0,\n    "killq": true,\n    "captureq": false,\n    "killcaptureraid": true,\n    "airstrike": false,\n    "noshotsfired": false,\n    "min_leaders_killed": 1,\n    "min_leaders_captured": 0\n}',
        'gpt-3.5-turbo': '{\n    "name": "Taliban leader Alaudin killed in Ghazni province",\n    "start_date": "2013-01-24",\n    "event_type": ["captureandkill"],\n    "province": ["ghazni"],\n    "target_group": ["taliban"],\n    "min_killed": 1,\n    "min_captured": 0,\n    "killq": true,\n    "captureq": false,\n    "killcaptureraid": false,\n    "airstrike": false,\n    "noshotsfired": false,\n    "min_leaders_killed": 1,\n    "min_leaders_captured": 0\n}'
    }
)

目前,已經將所有預測結果都存儲在內存中,所以現在是時候將它們提交到數據集,并推送到Hugging Face Hub了,以防筆記本崩潰、本地計算機關閉或其他意外情況發生。

作者創建了一個函數來處理這個過程,因為還需要對其他模型重復這個步驟。雖然過程有點冗長,但這樣做更好,這樣方便我們可以清楚地看到每一步的操作。

一個更簡潔和抽象的 convert_to_dataset 函數可能如下所示:

def convert_to_dataset(data: List[BaseModel]) -> Dataset:
    dataset_dict = {}


    for field_name, field_value in data[0].__fields__.items():
        field_type = field_value.outer_type_
        if field_type in [str, int, float, bool, date]:
            dataset_dict[field_name] = [getattr(item, field_name) for item in data]
        elif field_type == set:
            dataset_dict[field_name] = [list(getattr(item, field_name)) for item in data]
        elif issubclass(field_type, BaseModel):
            dataset_dict[field_name] = [getattr(item, field_name).dict() for item in data]
        else:
            dataset_dict[field_name] = [getattr(item, field_name) for item in data]


    dataset = Dataset.from_dict(dataset_dict)
    return dataset

不過現在,要先把數據推送到Hub上。

convert_and_push_dataset(events, "isafpressreleases_with_preds", split_name="test")

添加來自微調模型的預測

在添加完基線OpenAI模型之后,現在再來添加一些之前微調過的模型,包括本地模型以及由一鍵微調服務商托管的模型。

重新加載預測數據集

先加載數據集,然后再添加一些本地模型的預測結果:

from datasets import load_dataset

preds_test_data = load_dataset("strickvl/isafpressreleases_with_preds")[
    "test"
].to_list()

微調TinyLlama的預測

現在,如果我們檢查數據集,就會發現新的模型預測結果已經保存進去了:

from rich import print

print(preds_test_data[0])
{
    'name': '5',
    'text': '2013-01-S-025\n\nKABUL, Afghanistan (Jan. 25, 2013)\nDuring a security operation in Andar district, Ghazni province, yesterday, an Afghan and coalition force killed the Taliban leader, Alaudin. Alaudin oversaw a group of insurgents responsible for conducting remote-controlled improvised explosive device and small-arms fire attacks against Afghan and coalition forces. Prior to his death, Alaudin was planning attacks against Afghan National Police in Ghazni province.',
    'predictions': {'gpt-3.5-turbo': '{\n    "name": "Taliban leader Alaudin killed in Ghazni province",\n    "start_date": "2013-01-24",\n    "event_type": ["captureandkill"],\n    "province": ["ghazni"],\n    "target_group": ["taliban"],\n    "min_killed": 1,\n    "min_captured": 0,\n    "killq": true,\n    "captureq": false,\n    "killcaptureraid": false,\n    "airstrike": false,\n    "noshotsfired": false,\n    "min_leaders_killed": 1,\n    "min_leaders_captured": 0\n}',
        'gpt-4-turbo': '{\n    "name": "Taliban leader Alaudin killed in Ghazni",\n    "start_date": "2013-01-24",\n    "event_type": ["captureandkill"],\n    "province": ["ghazni"],\n    "target_group": ["taliban"],\n    "min_killed": 1,\n    "min_captured": 0,\n    "killq": true,\n    "captureq": false,\n    "killcaptureraid": true,\n    "airstrike": false,\n    "noshotsfired": false,\n    "min_leaders_killed": 1,\n    "min_leaders_captured": 0\n}',
        'gpt-4o': '{\n  "name": "Taliban leader Alaudin killed in Ghazni",\n  "start_date": "2013-01-24",\n  "event_type": ["insurgentskilled", "captureandkill"],\n  "province": ["ghazni"],\n  "target_group": ["taliban"],\n "min_killed": 1,\n  "min_captured": 0,\n  "killq": true,\n  "captureq": false,\n  "killcaptureraid": true,\n  "airstrike": false,\n  "noshotsfired": false,\n  "min_leaders_killed": 1,\n  "min_leaders_captured": 0\n}',
        'tinyllama-templatefree': '\n{"name":"Taliban leader killed in Ghazni","start_date":"2013-01-24","event_type":["insurgentskilled"],"province":["ghazni"],"target_group":["taliban"],"min_killed":1,"min_captured":0,"killq":true,"captureq":false,"killcaptureraid":false,"airstrike":false,"noshotsfired":false,"min_leaders_killed":1,"min_leaders_captured":0}',
        'tinyllama-sharegpt': 
'{"name":"2","start_date":"2013-01-24","event_type":["airstrike"],"province":["ghazni"],"target_group":["taliban"],"min_killed":1,"min_captured":0,"killq":true,"captureq":false,"killcaptureraid":false,"airstrike":true,"noshotsfired":false,"min_leaders_killed":1,"min_leaders_captured":0}'
    },
    'start_date': datetime.date(2013, 1, 24),
    'province': ['ghazni'],
    'target_group': ['taliban'],
    'event_type': ['insurgentskilled'],
    'min_killed': 1,
    'min_captured': 0,
    'killq': True,
    'captureq': False,
    'killcaptureraid': False,
    'airstrike': False,
    'noshotsfired': False,
    'min_leaders_killed': 1,
    'min_leaders_captured': 0
}

微調Mistral的預測

正如作者之前提到的,微調后的Mistral模型無法在本地運行,所以他在Modal上進行推理,在那里他可以使用強大的A100顯卡來進行預測。

我們會看到,模型的表現并不理想,幾乎所有評估都失敗了。在圖表中數值為零的就是mistral-lora-templatefree模型。

微調OpenAI的預測

使用OpenAI的一鍵微調服務對gpt-3.5-turbo-1106模型進行了微調。通過OpenAI SDK 遍歷數據集,生成了這個微調模型的預測結果。

微調Mistral模型(通過OpenPipe)

使用OpenPipe微調了Mistral 7B和Mistral 8x7B模型,以便有一個合理的基準來比較其他模型。

微調Solar LLM(通過Predibase)

大約一周前,Predibase宣布了一個新的頂級微調模型,即Upstage的Solar LLM,所以作者決定試試。

這個模型的優勢在于它被訓練得非常擅長人們常常微調模型的任務,例如結構化數據提取。正如在圖表中呈現的,它表現得相當不錯!

微調Llama3的預測(通過OpenPipe)

作者本地微調的Llama3模型表現并不好,但在OpenPipe上的輸出看起來還可以,所以他使用這些預測進行最終評估。

from rich import print

print(preds_test_data[0])
{
    'name': '5',
    'text': '2013-01-S-025\n\nKABUL, Afghanistan (Jan. 25, 2013)\nDuring a security operation in Andar district, Ghazni province, yesterday, an Afghan and coalition force killed the Taliban leader, Alaudin. Alaudin oversaw a group of insurgents responsible for conducting remote-controlled improvised explosive device and small-arms fire attacks against Afghan and coalition forces. Prior to his death, Alaudin was planning attacks against Afghan National Police in Ghazni province.',
    'predictions': {'finetuned-llama3-7b-32k-openpipe': 
'{"name":"1","start_date":"2013-01-24","event_type":["insurgentskilled"],"province":["ghazni"],"target_group":["taliban"],"min_killed":1,"min_captured":0,"killq":true,"captureq":false,"killcaptureraid":true,"airstrike":false,"noshotsfired":false,"min_leaders_killed":1,"min_leaders_captured":0}',
        'finetuned-mistral-7b-optimised-openpipe': 
'{"name":"1","start_date":"2013-01-24","event_type":["insurgentskilled"],"province":["ghazni"],"target_group":["taliban"],"min_killed":1,"min_captured":0,"killq":true,"captureq":false,"killcaptureraid":true,"airstrike":false,"noshotsfired":false,"min_leaders_killed":1,"min_leaders_captured":0}',
        'finetuned-openai-gpt-3.5-turbo-1106': 
'{"name":"4","start_date":"2013-01-24","event_type":["insurgentskilled"],"province":["ghazni"],"target_group":["taliban"],"min_killed":1,"min_captured":0,"killq":true,"captureq":false,"killcaptureraid":true,"airstrike":false,"noshotsfired":false,"min_leaders_killed":1,"min_leaders_captured":0}',
        'gpt-3.5-turbo': '{\n    "name": "Taliban leader Alaudin killed in Ghazni province",\n    "start_date": "2013-01-24",\n    "event_type": ["captureandkill"],\n    "province": ["ghazni"],\n    "target_group": ["taliban"],\n    "min_killed": 1,\n    "min_captured": 0,\n    "killq": true,\n    "captureq": false,\n    "killcaptureraid": false,\n    "airstrike": false,\n    "noshotsfired": false,\n    "min_leaders_killed": 1,\n    "min_leaders_captured": 0\n}',
        'gpt-4-turbo': '{\n    "name": "Taliban leader Alaudin killed in Ghazni",\n    "start_date": "2013-01-24",\n    "event_type": ["captureandkill"],\n    "province": ["ghazni"],\n    "target_group": ["taliban"],\n    "min_killed": 1,\n    "min_captured": 0,\n    "killq": true,\n    "captureq": false,\n    "killcaptureraid": true,\n    "airstrike": false,\n    "noshotsfired": false,\n    "min_leaders_killed": 1,\n    "min_leaders_captured": 0\n}',
        'gpt-4o': '{\n  "name": "Taliban leader Alaudin killed in Ghazni",\n  "start_date": "2013-01-24",\n  "event_type": ["insurgentskilled", "captureandkill"],\n  "province": ["ghazni"],\n  "target_group": ["taliban"],\n "min_killed": 1,\n  "min_captured": 0,\n  "killq": true,\n  "captureq": false,\n  "killcaptureraid": true,\n  "airstrike": false,\n  "noshotsfired": false,\n  "min_leaders_killed": 1,\n  "min_leaders_captured": 0\n}',
        'mistral-lora-templatefree': '1',
        'tinyllama-sharegpt': 
'{"name":"2","start_date":"2013-01-24","event_type":["airstrike"],"province":["ghazni"],"target_group":["taliban"],"min_killed":1,"min_captured":0,"killq":true,"captureq":false,"killcaptureraid":false,"airstrike":true,"noshotsfired":false,"min_leaders_killed":1,"min_leaders_captured":0}',
        'tinyllama-templatefree': '\n{"name":"Taliban leader killed in Ghazni","start_date":"2013-01-24","event_type":["insurgentskilled"],"province":["ghazni"],"target_group":["taliban"],"min_killed":1,"min_captured":0,"killq":true,"captureq":false,"killcaptureraid":false,"airstrike":false,"noshotsfired":false,"min_leaders_killed":1,"min_leaders_captured":0}',
        'ft-solar-1-mini-chat-240612-predibase': 
'\n\n{"name":"2","start_date":"2013-01-24","event_type":["insurgentskilled"],"province":["ghazni"],"target_group":["taliban"],"min_killed":1,"min_captured":0,"killq":true,"captureq":false,"killcaptureraid":true,"airstrike":false,"noshotsfired":false,"min_leaders_killed":1,"min_leaders_captured":0}'
    },
    'start_date': datetime.date(2013, 1, 24),
    'province': ['ghazni'],
    'target_group': ['taliban'],
    'event_type': ['insurgentskilled'],
    'min_killed': 1,
    'min_captured': 0,
    'killq': True,
    'captureq': False,
    'killcaptureraid': False,
    'airstrike': False,
    'noshotsfired': False,
    'min_leaders_killed': 1,
    'min_leaders_captured': 0
}

現在我們有了來自七個微調模型和三個OpenAI模型的預測結果(用于比較),可以開始進行評估了。

不過在此之前,還需要先進行一個簡單的檢查,看看這些預測中有多少是有效的JSON格式。

JSON有效性測試

from datasets import load_dataset

dataset_with_preds = load_dataset("strickvl/isafpressreleases_test_predictions")[
    "train"
].to_list()

圖片

通過對比templatefree和sharegpt生成有效JSON的能力,我們已經能看到它們在TinyLlama微調中的差異,這非常具有指導意義。

OpenAI模型每次都能生成有效的JSON,微調后的Mistral和Llama3模型也是如此。

在編寫評估模型的代碼時,作者注意到有些條目是空白的或者根本沒有預測結果,所以他接下來對這個問題進行了調查。

# find out how many of the predictions are None values or empty strings
missing_values = {
    "gpt-4o": 0,
    "gpt-4-turbo": 0,
    "gpt-3.5-turbo": 0,
    "tinyllama-templatefree": 0,
    "tinyllama-sharegpt": 0,
    "finetuned-openai-gpt-3.5-turbo-1106": 0,
    "finetuned-llama3-7b-32k-openpipe": 0,
    "mistral-lora-templatefree": 0,
    "finetuned-mistral-7b-optimised-openpipe": 0,
    "ft-solar-1-mini-chat-240612-predibase": 0,
}


for row in dataset_with_preds:
    for model in row["predictions"]:
        if row["predictions"][model] is None or row["predictions"][model] == "":
            missing_values[model] += 1


print(missing_values)
{
    'gpt-4o': 0,
    'gpt-4-turbo': 0,
    'gpt-3.5-turbo': 0,
    'tinyllama-templatefree': 0,
    'tinyllama-sharegpt': 38,
    'finetuned-openai-gpt-3.5-turbo-1106': 0,
    'finetuned-llama3-7b-32k-openpipe': 0,
    'mistral-lora-templatefree': 0,
    'finetuned-mistral-7b-optimised-openpipe': 0,
    'ft-solar-1-mini-chat-240612-predibase': 0
}

如果沒有缺失值,tinyllama-sharegpt模型將會有全部724個預測結果,并且都是有效的JSON。

現在我們可以進入我們真正感興趣的部分:準確性。作者將計算所有有意義的屬性的分數,然后展示模型比較的結果。

這些屬性包括:

  • start_date
  • province
  • target_group
  • event_type
  • min_killed
  • min_captured
  • killq
  • captureq
  • killcaptureraid
  • airstrike
  • noshotsfired
  • min_leaders_killed
  • min_leaders_captured

重要提示,對于接下來的所有圖表,總任務數為724,所以這些數字是從724中得出的。

測試結果

開始日期準確性

{
    'gpt-4o': 527,
    'gpt-4-turbo': 522,
    'gpt-3.5-turbo': 492,
    'tinyllama-templatefree': 231,
    'tinyllama-sharegpt': 479,
    'finetuned-openai-gpt-3.5-turbo-1106': 646,
    'finetuned-llama3-7b-32k-openpipe': 585,
    'mistral-lora-templatefree': 0,
    'finetuned-mistral-7b-optimised-openpipe': 636,
    'ft-solar-1-mini-chat-240612-predibase': 649
}

圖片

Solar和微調的GPT-3.5模型在預測事件發生日期方面表現最佳。

省份準確性

{
    'gpt-4o': 649,
    'gpt-4-turbo': 645,
    'gpt-3.5-turbo': 595,
    'tinyllama-templatefree': 335,
    'tinyllama-sharegpt': 660,
    'finetuned-openai-gpt-3.5-turbo-1106': 704,
    'finetuned-llama3-7b-32k-openpipe': 707,
    'mistral-lora-templatefree': 0,
    'finetuned-mistral-7b-optimised-openpipe': 711,
    'ft-solar-1-mini-chat-240612-predibase': 704
}

圖片

分析發現,微調后的模型實際上比OpenAI模型表現更好,只犯了少量錯誤。

目標群體準確性

在這里,可能會提到多個目標群體,因此作者會根據模型預測的群體中有多少是正確的來給出一個滿分為1的分數。

圖片

微調后的模型在目標群體識別方面明顯優于OpenAI。

不過,作者懷疑如果添加一些訓練數據中沒有的新群體,模型的表現可能會下降。

事件類型準確性

圖片

事件類型實際上是最難的類別之一,因為有些類別在語義上存在重疊,有時甚至連人工標注者也難以區分。

再一次,微調后的模型在這方面表現得相當好。

min_killed準確性

圖片

在這些數字估計任務中,微調模型和OpenAI模型的表現差距突然縮小了。

雖然Mistral依然表現最佳,但優勢并不明顯!而且OpenAI模型在這方面的表現非常出色,令人印象深刻。

作者猜測這是因為提示中有一整段解釋了用于標注示例的標準:

標注說明:‘facilitator’ 不是領導者。如果新聞稿中提到‘叛亂分子’被拘留而沒有進一步細節,則分配至少兩名被拘留者。將‘a couple’解釋為兩人。將‘several’解釋為至少三人,盡管有時可能指七或八人。將‘a few’、‘some’、‘a group’、‘a small group’和‘multiple’解釋為至少三人,即使有時它們指代更多人數。如果新聞稿中沒有其他信息來提供一個最低可接受的數字,請選擇較小的數字。將‘numerous’和‘a handful’解釋為至少四人,而‘a large number’解釋為至少五人。

min_captured準確性

圖片

killq準確性

圖片

作者期望這些布爾屬性的準確性非常高,基本上幾乎所有模型都能達到這一點。

不過,微調后的Mistral仍然擊敗了GPT-4o的最佳成績。

captureq準確性

圖片

killcaptureraid準確性

圖片

「kill-capture raid」是一種特定術語,在標注時以特定方式使用。

OpenAI對作者如何進行這些調用一無所知,這也解釋了他們在這里表現不佳的原因。

airstrike準確性

圖片

noshotsfired準確性

圖片

「noshootsfired」屬性指的是新聞稿中是否提到在某次突襲/事件中沒有開槍。(在某段時間內,新聞稿特別喜歡提到這一點。)

作者不太確定為什么OpenAI模型的表現與預期相反。

對此,可以想到的一些半擬人化解釋方式是,比如GPT-4類模型可能「過度思考」了這個標簽,但需要更多的調查才能真正理解這一點。

min_leaders_killed準確性

圖片

我們經常聽說LLM在處理數字時表現不佳,或者會默認使用某些值等等。但在這個任務中,所有模型都得到了如此高的分數。

這應該是大家一直在努力改進的地方,并且成效顯著。不過,微調模型仍然表現最好。

min_leaders_captured準確性

圖片

最終得分

讓我們將這些單項能力分數相加,取平均值,得到我們模型在準確性方面的最終分數。

圖片

甚至連作者自己也感到驚訝,微調模型竟然超過了OpenAI的GPT類模型。甚至,連TinyLlama都比GPT-3.5 Turbo表現更好!

其中,表現最好的是Mistral-7B(在OpenPipe上微調),緊隨其后的是Solar LLM和Llama3-7B。

僅從分數來看,任何想為結構化數據提取微調模型的人都可以先從Mistral-7B、Solar 7B或Llama3-7B入手。它們在準確性方面可能都差不多,而在模型服務、效率和延遲方面可能有不同的權衡。

作者認為,雖然在提示中再加入一些示例(以及更多的解釋和規則),就可以讓OpenAI的模型表現得更好,但擁有自己的微調模型也會有其他好處:

  • 數據隱私(不會將你的信息發送給 OpenAI)
  • 更小的模型很可能意味著更好的性能(盡管我仍需測試和證明這一點)
  • 整體上更多的控制
  • 成本改進

在成本方面,現在進行比較或聲明有點困難,尤其是考慮到大型云服務供應商可以依賴的規模經濟。

但在一個需要長期重復推理構建這個模型的實際用例中,更有可能讓成本論點成立。

特別是,因為唯一能讓OpenAI推理調用變得更好的方法是填充大量示例和額外解釋,這顯著增加了每次查詢的成本。

話雖如此,微調模型時確實會出現一些真實的權衡。

微調效果顯著,但是……

首先,作者非常高興地發現,常說的「微調你的模型,獲得比GPT-4更好的性能」實際上是真的!不僅是真的,而且只需要相對較少的調整和適應。

要知道,上述所有模型都是用現有數據進行的第一次微調。基本上只是使用了所有默認設置,因此它們開箱即用。

對于下一步的工作,作者表示,他將專注于表現最好的Solar、Llama3和Mistral 7B模型。

評估過程很痛苦

作者有一些在本地工作的模型,還有一些部署在不同環境和不同服務中的其他模型。

讓模型分布在不同地方確實很麻煩。在理想情況下,你會希望所有模型的推理都有一個標準接口,尤其是當它們用于相同的用例或項目時。很方便的是,作者的微調GPT3.5自動由OpenAI部署和服務,Llama3、Solar和Mistral也是如此,但作者希望有一個地方可以看到它們全部。

當你有多個模型在運行,并且你在微調和更新它們,數據也在不斷變化時,你就需要一種管理這一切的方法。

這也是微調大語言模型的主要挑戰之一,你必須管理所有這些東西,以確保它們可靠且可重復地工作。即使在項目的早期階段,也需要一種方法來保持一切井然有序不出錯。

但可以了解是否在進步

盡管評估的實施過程有些痛苦,但它們給了作者一個重要的工具,那就是他現在有了一種特定任務的方法,來判斷訓練數據或模型的任何改進或優化是否在幫助自己前進。沒有這個工具,那基本上就是在盲目摸索。

下一步是什么

作者最初想要訓練多個模型,讓它們在各自的領域都成為超級專家,例如有一個模型非常擅長估算某個特定事件中有多少人被捕。

然而,看到模型的表現,作者不太確定下一步還應不應該這樣做,或者說,不太確定自己是否真的能夠通過這種方法顯著提高準確性。

接下來要做的,是進行一些與準確性無關的測試評估。比如,看看模型在域外數據(即完全虛構的關于完全不同的事情的數據)上的表現如何。

另一件事,是深入研究模型服務的一些細節。作者想拿出他前三名表現最佳的模型,深入研究大語言模型服務是如何完成的。

但在進入下一步之前,還要等他的興奮勁退卻一些——「目前,我只是很高興微調后的模型擊敗了GPT-4!」

責任編輯:張燕妮 來源: 新智元
相關推薦

2023-05-29 09:29:52

GPT-4語言模型

2023-04-09 16:17:05

ChatGPT人工智能

2024-05-07 08:00:00

自然語言處理機器學習

2023-06-08 11:27:10

模型AI

2023-07-07 09:32:57

GPT-4OpenAI

2023-12-09 13:24:40

OpenAIChatGPT人工智能

2024-01-23 14:39:30

2024-06-28 13:40:03

2023-06-19 08:19:50

2023-08-27 14:08:17

開源代碼Meta大模型

2023-03-16 17:28:59

技術AI

2023-12-17 22:04:04

微軟GPT-4

2023-06-14 14:57:38

模型AI

2023-09-19 13:48:31

AI數據

2024-03-08 12:35:27

AI模型

2024-05-28 14:40:00

2023-08-06 08:06:30

OpenAIChatGPTGPT-4

2023-09-06 16:44:03

2023-12-26 08:17:23

微軟GPT-4

2025-04-16 09:35:03

點贊
收藏

51CTO技術棧公眾號

三级精品在线观看| 免费v片在线观看| 精品中文字幕一区二区| 色一情一乱一区二区| jizz18女人| 黄色网在线播放| 国产福利不卡视频| 91精品国产精品| 麻豆精品免费视频| 国产欧美自拍| 国产精品传媒入口麻豆| 99在线观看视频| 韩国av中文字幕| 91欧美大片| 日韩av网站导航| 国产精品久久久久7777| 伦理片一区二区三区| 免费在线观看日韩欧美| 欧美区在线播放| 香蕉视频久久久| 四虎国产精品免费久久5151| 夜夜爽夜夜爽精品视频| 久久视频在线观看中文字幕| 91福利在线观看视频| 亚洲小说欧美另类婷婷| 国产一区二区三区在线视频 | 日本www在线观看| 大尺度一区二区| 国产精品久久久久久久久久新婚 | 欧美专区在线视频| 国产免费一区二区三区四区| 亚洲人成亚洲精品| 91精品国产欧美日韩| av免费播放网址| 日本乱理伦在线| 中文字幕+乱码+中文字幕一区| 国产高清一区视频| 中文字幕永久在线观看| 亚洲国产激情| 久久综合久中文字幕青草| 亚洲第一香蕉网| 麻豆国产精品| 欧美日韩在线播放一区| 哪个网站能看毛片| 污的网站在线观看| ●精品国产综合乱码久久久久| 麻豆av福利av久久av| 亚洲成人久久精品| 美女视频免费一区| 欧美激情视频免费观看| 99热这里只有精品4| 国产精品欧美三级在线观看| 亚洲黄一区二区| 国产麻豆剧传媒精品国产| 亚洲图片小说区| 91高清在线观看| 日韩avxxx| 欧美办公室脚交xxxx| 亚洲一区在线观看视频| 欧洲金发美女大战黑人| 久操免费在线| 日韩理论片网站| 日本精品一区二区三区高清 久久| 成人爽a毛片一区二区| 国产一区二区h| 亚洲xxxx在线| 亚洲AV无码一区二区三区性| 国产综合久久久久影院| 成人在线播放av| 国产欧美日韩综合精品一区二区三区| 九一九一国产精品| 成人福利视频网| 国产精品国产三级国产aⅴ| 免费av成人在线| 91精品国产综合久久香蕉| 亚洲一区中文字幕永久在线| 免费观看一级特黄欧美大片| 91精品久久久久久综合乱菊 | 神马久久精品综合| 97精品国产一区二区三区| 日日噜噜噜夜夜爽亚洲精品| 在线免费看av网站| 欧美激情第8页| 国内成人精品一区| 狠狠人妻久久久久久| 久久久久久自在自线| 国产精品久久久久久久久久小说 | 在线欧美小视频| 成人一区二区三| 日日夜夜天天综合| 欧美三级在线看| 精品综合久久久久| 综合久久av| 精品日韩欧美一区二区| 日本黄色免费观看| 欧美限制电影| 久久在线免费观看视频| 久久高清无码视频| 麻豆久久精品| 国产啪精品视频| 亚洲精品.www| 国产人成亚洲第一网站在线播放| 一级黄色免费在线观看| 成人免费网站观看| 欧美日韩一区二区欧美激情| 男人添女人荫蒂国产| 香蕉久久精品日日躁夜夜躁| 色妞欧美日韩在线| 久久久久成人精品无码| 一区精品久久| 国产精品影片在线观看| 囯产精品久久久久久| 久久精品视频免费| 91精品国产毛片武则天| 悠悠资源网亚洲青| 欧美精品电影在线播放| 国产激情第一页| 午夜精品久久久久久久四虎美女版| 欧美高清性猛交| 最新黄色网址在线观看| 成人在线视频首页| 亚洲精品一区二区三区樱花| hd国产人妖ts另类视频| 欧美日韩国产首页在线观看| 亚洲香蕉中文网| 国产一区二区三区91| 色综合色综合网色综合| 最近日韩免费视频| 久久综合五月天婷婷伊人| 国产高潮呻吟久久久| 欧美色999| 亚洲国产高潮在线观看| 日本午夜在线观看| 日本一区中文字幕| 久久久com| 日韩成人伦理| 欧美群妇大交群中文字幕| 久久久久久久久久久久| 欧美日韩三级电影在线| 国产盗摄xxxx视频xxx69| 人妻偷人精品一区二区三区| 综合婷婷亚洲小说| 午夜欧美福利视频| 九色精品国产蝌蚪| 美女久久久久久久久久久| 亚洲视屏在线观看| 久久精品欧美一区二区三区不卡 | 成人亚洲一区| 欧美在线观看网址综合| 人人妻人人澡人人爽久久av | 亚洲免费精品| av免费观看久久| 国产精品人人人人| eeuss影院在线观看| 中文字幕综合网| 黄色一级一级片| 老汉色老汉首页av亚洲| 欧美成人免费在线视频| 麻豆成人免费视频| 97久久精品人人做人人爽50路| 欧美人与动牲交xxxxbbbb| 黄色日韩网站| 中文字幕久久久| 日韩欧美国产另类| 国产视频不卡一区| 日日碰狠狠丁香久燥| 久久91成人| 日韩**中文字幕毛片| 欧洲成人av| 色哟哟在线观看一区二区三区| 在线观看日韩精品视频| 一区二区三区成人精品| 国产视频在线观看一区| 黄色片网站在线观看| 欧美精品 国产精品| 欧美性x x x| 国产电影精品久久禁18| 国产精品国三级国产av| 国产精品白浆| 日韩av123| 精品亚洲综合| 欧美日韩国产首页| www.av视频| 99精品视频在线观看| 成人av一级片| 成人精品影视| 91gao视频| 性欧美1819sex性高清大胸| 精品国产一区久久| 日韩精品一区二区亚洲av| 国产色综合一区| 日韩av影视大全| 影音先锋中文字幕一区| 免费精品视频一区| 欧美a一级片| 欧美黄色成人网| 免费理论片在线观看播放老| 欧美浪妇xxxx高跟鞋交| www欧美com| 99久久精品国产毛片| 青青草精品视频在线观看| 亚洲午夜精品一区 二区 三区| 国产精选一区二区| 欧美aaa大片视频一二区| 久久亚洲精品小早川怜子66| 亚洲黄色小说网| 色婷婷亚洲综合| 国产第100页| 国产精品伦理一区二区| 亚洲一区二区三区四区五区六区| 精东粉嫩av免费一区二区三区| 无码人妻精品一区二区三区在线 | 欧美一区二区三区免费大片| 九九热在线免费观看| 一区二区三区四区蜜桃| 一本在线免费视频| 99re8在线精品视频免费播放| 午夜av中文字幕| 日韩精品国产欧美| 亚洲中文字幕无码专区| 欧美日韩伊人| 欧美日韩亚洲国产成人| 欧洲乱码伦视频免费| 精品视频在线观看| 操欧美女人视频| 91在线播放国产| 欧美97人人模人人爽人人喊视频| 国产成人精品视频在线| 看黄在线观看| 久久久久久久久久久91| 中文在线手机av| 日韩视频欧美视频| 在线视频自拍| 中文字幕av日韩| 韩国免费在线视频| 亚洲精品自拍视频| 四季av日韩精品一区| 欧美成人高清电影在线| www.热久久| 日韩欧美第一区| 亚洲精品无遮挡| 欧美精品一区二区三区在线播放| 亚洲欧美强伦一区二区| 精品国产乱码久久久久久久 | 免费看欧美黑人毛片| 欧美aⅴ99久久黑人专区| 玖玖精品在线视频| 中国精品18videos性欧美| 超碰97在线看| 亚洲特色特黄| 黄色一级片播放| 久热re这里精品视频在线6| 国产综合免费视频| 日韩电影在线一区二区三区| mm131国产精品| 国产一二精品视频| 久久精品aⅴ无码中文字字幕重口| 国产成人亚洲精品青草天美| 91视频在线免费| 91视频你懂的| www.日本高清视频| 国产精品久久久久久久久搜平片 | 亚洲第一黄色网址| ww亚洲ww在线观看国产| 极品久久久久久久| 亚洲女同女同女同女同女同69| 色在线观看视频| 五月天久久比比资源色| 久久久精品毛片| 欧美精选午夜久久久乱码6080| 99久久久久成人国产免费| 欧美成人乱码一区二区三区| 人操人视频在线观看| 色av中文字幕一区| 亚洲图区一区| 欧美一区深夜视频| 日韩久久99| 国产精品果冻传媒潘| 久久综合色占| 成年人三级视频| 亚洲三级国产| 嫩草视频免费在线观看| 成人免费视频播放| 永久免费毛片在线观看| 亚洲精品国产一区二区精华液| 日本特黄一级片| 欧美午夜一区二区三区| 亚洲国产精彩视频| 一区二区中文字幕| 日本理论片午伦夜理片在线观看| 日本久久久久久久久| 久久久久毛片免费观看| 蜜桃av色综合| 欧美激情一级片一区二区| 少妇高清精品毛片在线视频 | 蜜桃av免费看| 一区二区三区免费| 国产精品午夜一区二区| 日韩精品一区二区三区中文不卡| 欧美精品久久久久久久久久丰满| 日本精品性网站在线观看| 国产激情视频在线播放| 亚洲精品一二区| 在线观看电影av| 国产精品高潮在线| av男人一区| 二级片在线观看| 久久久精品网| 亚洲熟女一区二区三区| 中文字幕av免费专区久久| 日本中文字幕在线免费观看| 欧美福利视频导航| 欧美xxxx黑人又粗又长精品| 亚洲香蕉av| 亚洲一二三区av| av亚洲精华国产精华精| 青青操在线视频观看| 色婷婷av一区二区三区大白胸| 88国产精品欧美一区二区三区| 天然素人一区二区视频| 精品国产福利| 国产精品mm| 亚洲av毛片在线观看| 亚洲国产精品成人综合| 久久黄色精品视频| 精品国产乱码久久久久久浪潮| 黄色网在线播放| 国产一区深夜福利| 精品国产一区二区三区噜噜噜| 欧美在线一区视频| 粉嫩一区二区三区性色av| 亚洲国产123| 在线成人av网站| 欧美成人精品一区二区男人看| 国产成人精品免费久久久久 | 欧美男男青年gay1069videost| 加勒比一区二区三区在线| 国外成人免费在线播放| 日本一区二区三区播放| 成年人视频大全| 国产乱理伦片在线观看夜一区| 日韩影院一区二区| 91精品国产品国语在线不卡| 成人免费网址| 1卡2卡3卡精品视频| 欧美视频一区| 日韩精品国产一区| 亚洲国产精品人人做人人爽| 亚洲精品久久久久久久久久| 欧美激情精品在线| 国偷自产av一区二区三区| 全黄性性激高免费视频| 成人app下载| av大片免费观看| 亚洲欧美成人精品| 国产极品久久久久久久久波多结野| 亚洲精品一卡二卡三卡四卡| 九九在线精品视频| 国产黄色片在线免费观看| 精品国产乱码久久久久久久久| 性欧美18~19sex高清播放| 欧美一区1区三区3区公司| 日韩av不卡一区二区| 午夜精品一区二区三级视频| 日韩欧美二区三区| 天堂av中文在线观看| 日韩视频精品| 韩国视频一区二区| 国产又爽又黄ai换脸| 色鬼7777久久| 日本成人激情视频| 深夜福利久久| 亚洲一区二区三区观看| 亚洲免费av网站| 偷拍精品一区二区三区| 欧美在线不卡区| 久久婷婷蜜乳一本欲蜜臀| 黑人性生活视频| 欧美日韩精品中文字幕| 69av亚洲| 亚洲国产欧美在线成人app| 国产高清成人久久| 午夜不卡av免费| 99青草视频在线播放视| 亚洲aaaaaa| 男人的天堂亚洲在线| 一本在线免费视频| 亚洲精品一区二区三区影院| 免费欧美电影| 真实国产乱子伦对白视频| 国产欧美一区二区精品性| 国产婷婷在线视频| 青青草成人在线| 欧美va天堂在线| 山东少妇露脸刺激对白在线| 日韩精品一区二区三区四区视频 | 国产91色在线观看| 亚洲综合一区二区| 成人免费在线电影| 国产精品久久久久免费|