Kỹ sư ML tinh chỉnh 7 mô hình cùng một lúc, đánh bại OpenAI GPT-4

Trung Đào

Writer
"Tinh chỉnh mô hình của bạn để có hiệu suất tốt hơn GPT-4" không chỉ là lời nói mà nó thực sự có thể hành động được. Gần đây, một kỹ sư ML sẵn sàng làm điều đó đã điều chỉnh một số LLM nguồn mở theo những gì anh ta muốn.

Tinh chỉnh mô hình đề cập đến việc sử dụng một tập dữ liệu cụ thể để đào tạo thêm dựa trên mô hình ngôn ngữ lớn (LLM) đã được đào tạo. Cách tiếp cận “đứng trên vai người khổng lồ” này có thể sử dụng Tập dữ liệu nhỏ hơn, chi phí đào tạo thấp hơn để thu được lợi ích tốt hơn. và tránh phát minh lại bánh xe.

Trong thời đại của các mô hình lớn, kỹ thuật nhắc nhở, tinh chỉnh mô hình và tạo nâng cao truy xuất (RAG) đều là những khả năng rất quan trọng đối với hầu hết người dùng cá nhân, việc nắm vững kỹ thuật nhắc nhở là đủ, nhưng nếu bạn muốn tích hợp các mô hình lớn vào của riêng mình. dịch vụ, việc tinh chỉnh mô hình là cách duy nhất để thực hiện. Do yêu cầu kỹ năng cao hơn nên nó đã trở thành nơi để các kỹ sư ML bậc thầy cạnh tranh.
Hôm nay, mẫu tinh chỉnh của kỹ sư ML đã lọt vào danh sách hot HN, "Mẫu tinh chỉnh của tôi đã đánh bại GPT-4 của OpenAI"!

Kỹ sư Alex Strick van Linschoten đã chỉ ra trên blog rằng xét về mặt dữ liệu thử nghiệm của ông, các mô hình tinh chỉnh của Mistral, Llama3 và Solar LLM đều chính xác hơn mô hình OpenAI.

1719908826805.png

Địa chỉ bài viết: https://mlops.systems/posts/2024-07-01-full-finetuned-model-evaluation.html#start-date-accuracy
1719908948847.png
Về vấn đề này, tác giả nói đùa rằng tiêu đề bài viết này có thể đổi trực tiếp thành: Mô hình tinh chỉnh đánh bại OpenAI, nhưng quá trình đánh giá thực sự rất đau đớn.Anh thừa nhận có rất nhiều mã và tốc độ chạy chậm. Trong quá trình tinh chỉnh này, lần đầu tiên anh ấy phải vật lộn với sự đánh đổi trong các lựa chọn tinh chỉnh. Nếu không có loại hệ thống nào đó để xử lý việc này, sự phức tạp của việc duy trì tất cả sẽ bắt đầu tăng lên.

Bây giờ chúng ta hãy xem kỹ sư đã làm điều đó như thế nào. (Vui lòng xem văn bản gốc để biết mã chi tiết)

Tải tập dữ liệu

Tất cả dữ liệu được lưu trữ trong kho lưu trữ công cộng trong Hugging Face Hub.Để tiến hành những đánh giá này, các tác giả đã chọn sử dụng phần thử nghiệm của tập dữ liệu vì mô hình chưa từng tiếp xúc với dữ liệu này trước đây, điều này cho phép đánh giá tốt hơn về hiệu suất của mô hình trên dữ liệu mới.

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})
Trước tiên, hãy thêm một cột bổ sung vào DataFrame rồi đưa ra dự đoán cho từng hàng trong tập dữ liệu. Lưu trữ một bản sao của dự đoán vào cột này để tránh lặp lại bước tính toán chuyên sâu này. Nhưnglưu ý dữ liệu cần phải được tập hợp thành các đối tượng Pydantic để có thể xử lý việc xác thực dữ liệu.

[
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={}
)
]

Vì vậy, khi đưa ra dự đoán, chúng ta mong đợi nhận được chuỗi JSON từ mô hình trông như thế này:

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}

Bắt đầu bằng việc đánh giá đầy đủ bằng mô hình GPT, cần có một từ nhắc phức tạp hơn để đạt được kết quả lý tưởng.Vì mô hình GPT không được đào tạo hoặc tinh chỉnh để phản hồi các từ gợi ý cụ thể đã tinh chỉnh mô hình nên chúng tôi không thể trực tiếp sử dụng các từ gợi ý giống nhau. Điều này đặt ra một câu hỏi thú vị: Chúng ta cần tốn bao nhiêu công sức cho việc thiết kế lời nhắc GPT để đạt được độ chính xác của một mô hình tinh chỉnh?

Nói cách khác, có thực sự có cách nào để so sánh công bằng giữa các mô hình chấp nhận các từ gợi ý khác nhau không? Hãy thử GPT-4 và GPT-4 Turbo của OpenAI để xem lời nhắc cần dài bao lâu để mô hình GPT có cơ hội cạnh tranh với mô hình đã được tinh chỉnh. Lý tưởng nhất là tác giả nên đưa thêm nhiều ví dụ vào ngữ cảnh, nhưng anh ấy cũng không muốn tăng mức sử dụng mã thông báo.

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

Bạn có thể xác minh rằng chức năng này đang hoạt động bình thường bằng một ví dụ đơn giản:

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
}

Mô hình hoạt động tốt (như mong đợi) và chúng ta nhận được chuỗi JSON. Tiếp theo, xây dựng một chương trình lặp qua tất cả dữ liệu thử nghiệm, nhận dự đoán và lưu trữ những dự đoán đó trong đối tượng Pydantic. Đối với các dự đoán hàng loạt, hãy đảm bảo bạn thực hiện không đồng bộ vì bạn có số lượng lớn sự kiện nên không muốn mất quá nhiều thời gian.

Ngoài ra, tác giả cũng bổ sung thêm một số cơ chế thử lại vào chức năng nhằm khắc phục hạn chế về tốc độ của mẫu GPT-3.5-turbo. Như chúng ta có thể thấy, các tác giả đính kèm ba dự đoán cho mỗi sự kiện.

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,
predictions={'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}'
}
)

Hiện tại, tất cả các kết quả dự đoán đều được lưu trong bộ nhớ, vì vậy đã đến lúc gửi chúng vào tập dữ liệu và đẩy chúng đến Hugging Face Hub trong trường hợp sổ ghi chép gặp sự cố, máy tính cục bộ tắt hoặc các tình huống không mong muốn khác xảy ra.

Tác giả đã tạo một hàm để xử lý quá trình này vì bước này cần được lặp lại cho các mô hình khác. Mặc dù quá trình này hơi dài nhưng tốt hơn nên làm theo cách này để chúng ta có thể nhìn rõ từng bước thao tác.Hàm Convert_to_dataset ngắn gọn và trừu tượng hơn có thể trông như thế này:

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

Nhưng bây giờ, dữ liệu cần được đẩy lên Hub trước.

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

Thêm dự đoán từ mô hình tinh chỉnh

Sau khi thêm mô hình OpenAI cơ sở, bây giờ hãy thêm một số mô hình đã tinh chỉnh trước đó, bao gồm các mô hình cục bộ và mô hình do các nhà cung cấp dịch vụ tinh chỉnh bằng một cú nhấp chuột lưu trữ.

Tải lại tập dữ liệu dự đoán

Trước tiên hãy tải tập dữ liệu và sau đó thêm một số dự đoán mô hình cục bộ:

from datasets import load_dataset

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

Tinh chỉnh dự đoán của TinyLlama

Bây giờ, nếu kiểm tra tập dữ liệu, chúng tôi thấy rằng các dự đoán mô hình mới đã được lưu:

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
}

Tinh chỉnh dự báo của Mistral

Như tác giả đã đề cập trước đó, mô hình Mistral đã tinh chỉnh không thể chạy cục bộ nên anh ấy đã thực hiện suy luận trên Modal, nơi anh ấy có thể sử dụng card đồ họa A100 mạnh mẽ để đưa ra dự đoán.Chúng ta sẽ thấy rằng mô hình hoạt động không tốt và thất bại trong hầu hết các đánh giá. Mô hình có giá trị bằng 0 trong biểu đồ là mô hình không có mẫu sai.

Tinh chỉnh dự đoán của OpenAI

Mẫu gpt-3.5-turbo-1106 đã được tinh chỉnh bằng dịch vụ tinh chỉnh chỉ bằng một cú nhấp chuột của OpenAI. Kết quả dự đoán của mô hình tinh chỉnh này được tạo ra bằng cách duyệt qua tập dữ liệu thông qua OpenAI SDK.

Tinh chỉnh các mô hình Mistral (thông qua OpenPipe)

Các mẫu Mistral 7B và Mistral 8x7B đã được tinh chỉnh bằng OpenPipe để có đường cơ sở hợp lý để so sánh với các mẫu khác.

Tinh chỉnh Solar LLM (thông qua Predibase)

Khoảng một tuần trước, Predibase đã công bố một mẫu tinh chỉnh cấp cao nhất mới, Solar LLM của Upstage, vì vậy tôi quyết định dùng thử.Ưu điểm của mô hình này là nó được đào tạo để thực hiện rất tốt các nhiệm vụ mà mọi người thường tinh chỉnh các mô hình, chẳng hạn như trích xuất dữ liệu có cấu trúc. Như được trình bày trong biểu đồ, nó hoạt động khá tốt!

Tinh chỉnh dự đoán của Llama3 (thông qua OpenPipe)

Mô hình Llama3 được tinh chỉnh cục bộ của tác giả không hoạt động tốt nhưng kết quả đầu ra trên OpenPipe có vẻ ổn nên anh ấy đã sử dụng những dự đoán này để đánh giá cuối cùng.

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
}

Bây giờ chúng ta đã có dự đoán từ bảy mô hình tinh chỉnh và ba mô hình OpenAI (để so sánh), chúng ta có thể bắt đầu đánh giá.Nhưng trước đó, chúng ta cần thực hiện một kiểm tra đơn giản để xem có bao nhiêu dự đoán trong số này ở định dạng JSON hợp lệ.

Kiểm tra tính hợp lệ của JSON'

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

1719910529453.png
Bằng cách so sánh khả năng của templatefree và sharegpt trong việc tạo JSON hợp lệ, chúng ta có thể thấy sự khác biệt trong việc tinh chỉnh TinyLlama của họ, điều này mang tính hướng dẫn rất cao. Mô hình OpenAI luôn tạo ra JSON hợp lệ, cũng như các mô hình Mistral và Llama3 đã được tinh chỉnh. Trong khi viết mã để đánh giá mô hình, tác giả nhận thấy rằng một số mục nhập trống hoặc không có dự đoán nào cả, vì vậy tiếp theo anh ấy đã điều tra vấn đề.

# 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
}

Nếu không có giá trị nào bị thiếu, mô hình tinyllama-sharegpt sẽ có tất cả 724 dự đoán và tất cả chúng đều là JSON hợp lệ.Bây giờ chúng ta có thể đến phần chúng ta thực sự quan tâm: độ chính xác. Các tác giả sẽ tính điểm cho tất cả các thuộc tính có ý nghĩa và sau đó trình bày kết quả so sánh mô hình.Những tài sản này bao gồm:
  • ngày bắt đầu
  • tỉnh
  • nhóm mục tiêu
  • loại sự kiện
  • min_killed
  • phút_bắt
  • giết chết
  • chụp q
  • giết bắt
  • cuộc không kích
  • không bị bắn
  • min_leaders_killed
  • min_leaders_captured
Lưu ý quan trọng, đối với tất cả các biểu đồ tiếp theo, tổng số nhiệm vụ là 724, vì vậy những con số này bắt nguồn từ 724.

Kết quả kiểm tra

Độ chính xác của ngày bắt đầu

{
'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
}

1719910797534.png
Các mô hình GPT-3.5 sử dụng năng lượng mặt trời và tinh chỉnh hoạt động tốt nhất khi dự đoán ngày diễn ra sự kiện.

Tỉnh chính xác

{
'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
}

1719910912223.png
Phân tích cho thấy mô hình được tinh chỉnh thực sự hoạt động tốt hơn mô hình OpenAI, chỉ mắc một số lỗi nhỏ.

Độ chính xác của nhóm mục tiêu

Ở đây, nhiều nhóm mục tiêu có thể được đề cập, vì vậy các tác giả cho điểm 1 dựa trên số lượng nhóm mà mô hình dự đoán chính xác.

1719911044676.png
Mô hình được tinh chỉnh vượt trội đáng kể so với OpenAI trong việc xác định nhóm mục tiêu.Tuy nhiên, các tác giả nghi ngờ rằng hiệu suất của mô hình có thể giảm nếu một số nhóm mới được thêm vào không có trong dữ liệu huấn luyện.

Độ chính xác của loại sự kiện

1719911120316.png
Các loại sự kiện thực sự là một trong những danh mục khó nhất vì một số danh mục trùng lặp về mặt ngữ nghĩa và đôi khi ngay cả người chú thích cũng khó phân biệt được.Một lần nữa, mô hình tinh chỉnh lại hoạt động khá tốt về mặt này.

Độ chính xác tối thiểu

1719911196081.png

Trong các nhiệm vụ ước tính bằng số này, khoảng cách hiệu suất giữa mô hình tinh chỉnh và mô hình OpenAI đột nhiên được thu hẹp.Dù Mistral vẫn thể hiện tốt nhất nhưng lợi thế lại không hề rõ ràng! Và hiệu suất của mô hình OpenAI về mặt này là rất ấn tượng. Tác giả suy đoán rằng điều này là do lời nhắc bao gồm toàn bộ đoạn văn giải thích các tiêu chí được sử dụng để gắn nhãn cho các ví dụ:
Lưu ý: 'điều phối viên' không phải là người lãnh đạo. Nếu thông cáo báo chí đề cập đến việc giam giữ 'người *******' mà không có thêm thông tin chi tiết, hãy chỉ định ít nhất hai người bị giam giữ. Giải thích 'một cặp vợ chồng' có nghĩa là hai người. Giải thích “vài” có nghĩa là ít nhất ba người, mặc dù đôi khi nó có thể có nghĩa là bảy hoặc tám người. Giải thích 'một vài', 'một số', 'một nhóm', 'một nhóm nhỏ' và 'nhiều' có nghĩa là ít nhất ba người, ngay cả khi đôi khi chúng đề cập đến một số lượng lớn người hơn. Nếu trong thông cáo báo chí không có thông tin nào khác cung cấp con số tối thiểu có thể chấp nhận được, hãy chọn con số thấp hơn. Giải thích 'nhiều' và 'một số ít' có nghĩa là ít nhất bốn người và 'một số lượng lớn' có nghĩa là ít nhất năm người.​

Độ chính xác tối thiểu

Ngay cả bản thân tác giả cũng ngạc nhiên khi mô hình tinh chỉnh lại vượt qua mô hình giống GPT của OpenAI. Thậm chí TinyLlama còn hoạt động tốt hơn GPT-3.5 Turbo!Trong số đó, sản phẩm có hiệu suất tốt nhất là Mistral-7B (được tinh chỉnh trên OpenPipe), tiếp theo là Solar LLM và Llama3-7B.Chỉ đánh giá từ điểm số, bất kỳ ai muốn tinh chỉnh mô hình trích xuất dữ liệu có cấu trúc có thể sẽ bắt đầu với Mistral-7B, Solar 7B hoặc Llama3-7B. Tất cả chúng đều có thể giống nhau về độ chính xác nhưng có thể có những đánh đổi khác nhau về việc phân phối mô hình, hiệu quả và độ trễ.Tác giả tin rằng mặc dù việc thêm một vài ví dụ (và nhiều giải thích cũng như quy tắc hơn) vào lời nhắc sẽ giúp các mô hình của OpenAI hoạt động tốt hơn, nhưng việc có mô hình tinh chỉnh của riêng bạn cũng mang lại những lợi ích khác:
  • Quyền riêng tư dữ liệu (thông tin của bạn sẽ không được gửi đến OpenAI)
  • Các mô hình nhỏ hơn rất có thể sẽ có hiệu suất tốt hơn (mặc dù tôi vẫn cần kiểm tra và chứng minh điều này)
  • Kiểm soát tổng thể nhiều hơn
  • cải thiện chi phí
Khi nói đến chi phí, hiện tại hơi khó để so sánh hoặc tuyên bố, đặc biệt là với quy mô kinh tế mà các nhà cung cấp dịch vụ đám mây lớn có thể dựa vào.Nhưng trong trường hợp sử dụng thực tế đòi hỏi lý luận lặp đi lặp lại trong thời gian dài để xây dựng mô hình này, nhiều khả năng lập luận về chi phí sẽ được giữ vững.Đặc biệt, vì cách duy nhất để thực hiện các cuộc gọi suy luận OpenAI tốt hơn là đưa vào chúng rất nhiều ví dụ và giải thích bổ sung, điều này làm tăng đáng kể chi phí cho mỗi truy vấn.Phải nói rằng, có một số sự đánh đổi thực sự phát sinh khi tinh chỉnh một mô hình.
Việc tinh chỉnh có tác dụng kỳ diệu, nhưng...

Trước hết, tác giả rất vui khi phát hiện ra rằng câu nói thường nói “tinh chỉnh mô hình của bạn để có hiệu suất tốt hơn GPT-4” thực ra là đúng! Điều này không chỉ đúng mà còn đòi hỏi tương đối ít sự điều chỉnh và thích ứng.Hãy nhớ rằng tất cả các mô hình trên đều được tinh chỉnh lần đầu tiên bằng cách sử dụng dữ liệu hiện có. Về cơ bản, chỉ cần sử dụng tất cả các cài đặt mặc định để chúng hoạt động tốt.Đối với bước tiếp theo của công việc, tác giả cho biết sẽ tập trung vào các mô hình Solar, Llama3 và Mistral 7B hoạt động tốt nhất.

Quá trình đánh giá đau đớn

Tác giả có một số mô hình hoạt động cục bộ và những mô hình khác được triển khai trong các môi trường và dịch vụ khác nhau.Việc phân bổ các mô hình ở nhiều nơi khác nhau thực sự rất phức tạp. Lý tưởng nhất là bạn muốn có một giao diện chuẩn cho suy luận của tất cả các mô hình, đặc biệt nếu chúng được sử dụng cho cùng một trường hợp sử dụng hoặc dự án. Thuận tiện là GPT3.5 đã tinh chỉnh của tôi được OpenAI tự động triển khai và phục vụ, cũng như Llama3, Solar và Mistral, nhưng tôi ước có một nơi để xem tất cả.Khi bạn có nhiều mô hình đang chạy và bạn đang tinh chỉnh cũng như cập nhật chúng, đồng thời dữ liệu liên tục thay đổi, bạn cần một cách để quản lý tất cả.Đây cũng là một trong những thách thức chính trong việc tinh chỉnh các mô hình ngôn ngữ lớn, bạn phải quản lý tất cả những thứ này để đảm bảo rằng chúng hoạt động đáng tin cậy và có thể tái tạo. Ngay cả trong giai đoạn đầu của dự án, bạn cần có cách để giữ mọi thứ ngăn nắp và không có lỗi.

Nhưng bạn có thể biết liệu bạn có đang tiến bộ hay không

Mặc dù việc thực hiện các đánh giá có phần khó khăn nhưng chúng đã mang lại cho tác giả một công cụ quan trọng mà giờ đây anh ta có cách đánh giá theo từng nhiệm vụ cụ thể xem liệu có bất kỳ cải tiến hoặc tối ưu hóa nào đối với dữ liệu hoặc mô hình đào tạo đang giúp anh ta tiến lên phía trước hay không. Nếu không có công cụ này, về cơ bản bạn đang mò mẫm một cách mù quáng.

Tiếp theo sẽ là gì?​

Ban đầu, các tác giả muốn đào tạo nhiều mô hình để tất cả họ đều trở thành siêu chuyên gia trong lĩnh vực tương ứng của mình, chẳng hạn như một mô hình rất giỏi trong việc ước tính có bao nhiêu người bị bắt trong một vụ việc cụ thể.Tuy nhiên, nhìn vào hiệu suất của mô hình, tác giả không chắc liệu đây có phải là bước tiếp theo hay liệu anh ta thực sự có thể cải thiện đáng kể độ chính xác thông qua phương pháp này hay không.Điều tiếp theo cần làm là tiến hành một số đánh giá thử nghiệm không liên quan gì đến độ chính xác. Ví dụ: xem cách mô hình hoạt động trên dữ liệu ngoài miền (tức là dữ liệu hoàn toàn được tạo thành về những thứ hoàn toàn khác nhau).Một điều nữa là đi sâu vào một số chi tiết về việc phân phát mô hình. Tác giả muốn chọn ra ba mô hình hoạt động tốt nhất của mình và đi sâu vào cách thực hiện việc phân phát mô hình ngôn ngữ lớn.Nhưng trước khi chuyển sang bước tiếp theo, anh ấy phải đợi cho sự phấn khích của mình lắng xuống một chút - "Hiện tại, tôi chỉ rất vui vì mẫu tinh chỉnh đã đánh bại GPT-4!"

Nguồn giới thiệu: https://mlops.systems/posts/2024-07-01-full-finetuned-model-evaluation.html#start-date-accuracy
 


Đăng nhập một lần thảo luận tẹt ga

Gợi ý cộng đồng

Top