paint-brush
Tôi đã tinh chỉnh Llm bằng lịch sử trò chuyện trên Telegram của mình. Đây là những gì tôi đã học đượctừ tác giả@furiousteabag
1,351 lượt đọc
1,351 lượt đọc

Tôi đã tinh chỉnh Llm bằng lịch sử trò chuyện trên Telegram của mình. Đây là những gì tôi đã học được

từ tác giả Alex7m2024/06/13
Read on Terminal Reader

dài quá đọc không nổi

Tôi đã tinh chỉnh mô hình ngôn ngữ bằng cách sử dụng tin nhắn Telegram của mình để xem liệu nó có thể mô phỏng phong cách viết và kiểu trò chuyện của tôi hay không. Tôi đã chọn mẫu Mistral 7B vì hiệu suất của nó và thử nghiệm cả LoRA (thích ứng cấp thấp) và các phương pháp tinh chỉnh đầy đủ. Tôi đã trích xuất tất cả tin nhắn Telegram của mình, tổng cộng 15.789 phiên trong 5 năm và ban đầu đã thử nghiệm bằng mô hình Mistral đã tinh chỉnh cuộc trò chuyện chung. Đối với LoRA, quá trình đào tạo trên RTX 3090 mất 5,5 giờ và tốn 2 USD, cải thiện khả năng bắt chước phong cách nhưng gặp khó khăn về ngữ cảnh và ngữ pháp. Tinh chỉnh toàn diện, sử dụng 8 GPU A100, cải thiện hiệu năng ngôn ngữ và khả năng lưu giữ ngữ cảnh nhưng vẫn mắc một số lỗi. Nhìn chung, mặc dù mô hình nắm bắt tốt phong cách trò chuyện và các chủ đề chung nhưng nó thường thiếu ngữ cảnh trong các câu trả lời.
featured image - Tôi đã tinh chỉnh Llm bằng lịch sử trò chuyện trên Telegram của mình. Đây là những gì tôi đã học được
Alex HackerNoon profile picture
0-item
1-item

Đối với hầu hết những người tôi tương tác, tôi hầu như chỉ là một chương trình dựa trên văn bản khác. Nếu đầu vào và đầu ra đơn giản như vậy thì liệu tôi có thể thay thế bằng mô hình được không? Để thực hiện được điều này, người mẫu không chỉ cần hiểu phong cách viết của tôi mà còn phải biết nhiều điều về tôi. Nguồn tốt nhất cho việc này là trình nhắn tin Telegram của tôi, vì tôi sử dụng nó hàng ngày và nó chứa hầu hết mọi thứ về suy nghĩ và hành động của tôi dưới dạng lịch sử trò chuyện.

Tiếp cận

Cách tiếp cận đơn giản nhất là trích xuất tất cả tin nhắn của tôi, tải chúng vào ngữ cảnh của ChatGPT và hướng dẫn nó sử dụng thông tin này để bắt chước phong cách của tôi khi trả lời tin nhắn mới. Tuy nhiên, cách tiếp cận này bị hạn chế bởi kích thước cửa sổ ngữ cảnh, đòi hỏi tôi phải xử lý trước các tin nhắn để trích xuất các điểm chính. Vì tôi muốn tránh rắc rối này, có lẽ Thế hệ tăng cường truy xuất (RAG) có thể được sử dụng để lấy thông tin cần thiết khi cần. Tuy nhiên, theo kinh nghiệm của tôi, việc truy xuất dữ liệu đa dạng như phiên trò chuyện thường cần có sự tinh chỉnh có giám sát của mô hình truy xuất và tôi không quan tâm đến việc tạo tập dữ liệu như vậy. Vì vậy, tinh chỉnh có vẻ là lựa chọn tốt nhất. Nó lý tưởng vì nhiều lý do: nó sẽ nắm bắt được phong cách viết của tôi và có khả năng tích lũy kiến thức từ tất cả các tin nhắn của tôi mà không cần phải chọn nội dung quan trọng.


OpenAI cung cấp khả năng tinh chỉnh , nhưng vì tôi sẽ sử dụng tin nhắn riêng tư của mình nên tôi không muốn sử dụng bất kỳ dịch vụ tinh chỉnh nào của bên thứ ba. Vì vậy, tôi cần phải chọn một mô hình cơ sở. Theo Bảng xếp hạng LLM ôm mặt mở , một trong những mẫu nhỏ hơn hàng đầu (thông số 13B) là Mistral 7B . Nó thậm chí còn vượt trội hơn Llama 2 13B . Bây giờ, câu hỏi đặt ra là liệu LoRA có đủ hay cần phải tinh chỉnh đầy đủ. Nhiều so sánh khác nhau [1] [2] cho thấy LoRA tệ hơn một chút so với tinh chỉnh hoàn toàn nhưng hầu hết vẫn ổn. Tuy nhiên, đối với các nhiệm vụ cụ thể như của tôi (tiếng Nga + trò chuyện), tôi đã tìm thấy một bài báo , trong đó các nhà nghiên cứu tiến hành tinh chỉnh hướng dẫn Llama bằng tiếng Trung, có độ phức tạp tương tự như mục tiêu của tôi. Họ nhận thấy rằng việc điều chỉnh dựa trên LoRA trên mô hình cơ sở mà không điều chỉnh hướng dẫn trước sẽ kém hiệu quả hơn so với việc tinh chỉnh hoàn toàn. Tuy nhiên, việc điều chỉnh dựa trên LoRA trên một mô hình đã được tinh chỉnh theo hướng dẫn có thể mang lại kết quả tương đương. Trong trường hợp của tôi, điều này có nghĩa là tinh chỉnh hoàn toàn trên mô hình cơ sở hoặc LoRA trên mô hình đã được tinh chỉnh để trò chuyện bằng tiếng Nga. Vì tôi không thể tìm thấy mô hình được tinh chỉnh cho trò chuyện bằng tiếng Nga nên tôi sẽ thử LoRA trên một mô hình được tinh chỉnh cho trò chuyện bằng tiếng Anh, chẳng hạn như mô hình Mistral được tinh chỉnh cho cá heo .


Vì vậy, kế hoạch là:

  1. Bắt đầu với LoRA trên Dolphin, trò chuyện tiếng Anh được tinh chỉnh Mistral
  2. Nếu chất lượng chưa đủ, hãy thử tinh chỉnh đầy đủ trên Mistral

Chuẩn bị dữ liệu

Một khía cạnh độc đáo của tính năng nhắn tin trong các ứng dụng như Telegram, so với email, là luồng hội thoại. Các tin nhắn thường không luân chuyển từng tin nhắn một giữa bạn và người liên hệ của bạn. Thay vào đó, bạn thường thấy mình gửi một vài tin nhắn liên tiếp, sau đó là một số phản hồi từ người kia. Những tin nhắn này nhìn chung cũng ngắn. Tôi muốn duy trì phong cách trò chuyện tự nhiên này trong dữ liệu của mình.


Telegram cung cấp tính năng tích hợp sẵn để xuất tất cả các cuộc trò chuyện sang JSON. Sau một số lần lọc và nhóm tin nhắn thành các phiên, tôi đã tổng hợp dữ liệu từ 5 năm sử dụng Telegram gần đây nhất. Điều này dẫn đến 15.789 phiên từ 466 cuộc trò chuyện, với độ dài phiên trung bình là 8,51 tin nhắn. Để cấu trúc dữ liệu, tôi đã chọn định dạng lời nhắc ChatML . Đây là một phiên mẫu (được dịch từ tiếng Nga):


<|im_start|>John Smith
>>> chết tiệt, không thể vượt quá giới hạn thời gian 135

>>> cố gắng làm mọi thứ siêu tối ưu nhưng không gặp may<|im_end|>

<|im_start|>Alexander Smirnov
>>> ừ cũng vậy

>>> bạn vẫn có ý tưởng tương tự?<|im_end|>

<|im_start|>John Smith
>>> không biết, tôi nghĩ chúng ta cùng quan điểm

>>>như bạn đã nói

>>> thử dùng chuỗi đảo ngược và cố gắng tìm thứ gì đó ở đó

>>> có vẻ tệ thật vì hàm z phá hỏng mọi thứ………………<|im_end|>

<|im_start|>Alexander Smirnov
>>> không hiểu z dính vào đâu<|im_end|>

<|im_start|>John Smith
>>> không biết có vẻ như tôi đang làm mọi thứ lặp đi lặp lại, nhưng vâng, tôi phải đảo ngược một số chuỗi để xây dựng hàm z

>>> và đó chỉ là một giải pháp ngẫu nhiên

>>> từ các cuộc thảo luận<|im_end|>

<|im_start|>Alexander Smirnov
>>> hiểu rồi<|im_end|>


Trình đối chiếu dữ liệu của tôi đảm bảo rằng tổn thất chỉ được tính toán dựa trên phản hồi của ai đó. Việc dự đoán ai sẽ phát biểu tiếp theo tương đối đơn giản và chúng tôi không muốn mô hình tập trung vào việc tìm hiểu điều đó. Do đó, các phần của cuộc hội thoại tính toán tổn thất sẽ được in đậm.


Bạn có thể nhận thấy rằng không chỉ câu trả lời của tôi mà cả câu trả lời của những người khác cũng được sử dụng để tính toán tổn thất. Đây là cố ý. Bằng cách này, người mẫu sẽ có thể nhập vai không chỉ với tư cách là tôi mà còn với tư cách là đối tác trò chuyện thường xuyên của tôi!

Kế hoạch đánh giá

Tôi sẽ kiểm tra các mô hình bằng cách trò chuyện theo hai cách. Đầu tiên, người mẫu sẽ đóng giả tôi và tôi sẽ trò chuyện với chính mình dưới góc nhìn của những người bạn khác nhau của tôi. Sau đó, tôi sẽ trò chuyện với tư cách là chính mình trong khi người mẫu đóng vai bạn của tôi. Cuộc trò chuyện của tôi bắt đầu sẽ luôn có 2 tin nhắn giống nhau: “hey” và “có chuyện gì thế?” (bằng tiếng Nga, “прив” và “как дела?”). Các cụm từ và người được tạo ra làm người mẫu hành động sẽ được đánh dấu . Để thử nghiệm, tôi sẽ sử dụng oobabooga/text-Generation-webui .


Lúc đầu, tôi muốn khám phá cách mô hình Mistral đã tinh chỉnh trong cuộc trò chuyện chung xử lý nhiệm vụ đó mà không cần tôi đào tạo trước.


Bạn 1 vs Alexander Smirnov


Alexander Smirnov đấu với Bạn 1


Ok, nó có khả năng hình thành các câu mạch lạc. Vấn đề dễ nhận thấy nhất là thiếu nhận thức về bối cảnh của cuộc trò chuyện dẫn đến những câu trả lời nhạt nhẽo và chung chung. Các tin nhắn không có bất kỳ phong cách riêng biệt nào, mang lại cảm giác khá cơ bản. Một vấn đề nữa là tiếng Nga của người mẫu còn kém. Điều này được mong đợi vì mô hình quá nhỏ để có thể khái quát tốt cho các ngôn ngữ khác ngoài ngôn ngữ chính là tiếng Anh. Ngoài ra, mô hình này có xu hướng chủ động quá mức, kết thúc hầu hết mọi câu bằng một câu hỏi, đây không phải là cách người thật thường giao tiếp trong ứng dụng nhắn tin.


Hãy cố gắng khắc phục tất cả những điều này!

LoRA

LoRA cung cấp một cách tiếp cận tốn ít công sức cả về quy trình đào tạo và yêu cầu phần cứng. Nó tập luyện khoảng 1% tổng trọng lượng. Tôi đã chọn độ dài chuỗi 1024 và kích thước lô là 8. Quá trình đào tạo tiêu tốn 20GB VRAM trên RTX 3090, mất ba kỷ nguyên và kéo dài trong 5,5 giờ. Để làm điều này, tôi đã sử dụng broad.ai , trong đó chi phí GPU là 0,362 USD mỗi giờ, tổng cộng là 2 USD cho toàn bộ quá trình đào tạo, không bao gồm thời gian dành cho thử nghiệm và sửa lỗi.


Dưới đây là kết quả:


Bạn 1 vs Alexander Smirnov


Bạn 2 vs Alexander Smirnov


Alexander Smirnov đấu với Bạn 1


Alexander Smirnov đấu với Bạn 2


Thế này tốt hơn. Nó chắc chắn nắm bắt được phong cách của người mà nó thay mặt phản hồi. Nó cũng xác định các chủ đề phổ biến nhất được thảo luận giữa các cặp người cụ thể. Ví dụ, với người bạn 2, rõ ràng trọng tâm là công việc nhiều hơn. Tuy nhiên, ngữ pháp vẫn còn sai và nó nhanh chóng làm mất đi bối cảnh của cuộc trò chuyện. Tôi khá tự tin rằng LoRA sẽ hoạt động với chất lượng hợp lý bằng tiếng Anh và việc tinh chỉnh đầy đủ có thể không cần thiết. Tuy nhiên, vì tiếng Nga không phải là ngôn ngữ mẹ đẻ của mô hình nên hãy thử tinh chỉnh hoàn toàn.

Tinh chỉnh đầy đủ

Việc tinh chỉnh hoàn toàn khó khăn hơn do nhu cầu đào tạo về nhiều GPU. Các phương pháp phổ biến bao gồm ZeRO & DeepSpeed [3] hoặc FSDP [4] , với FSDP về cơ bản là ZeRO3 [5] . Tôi quyết định đi với FSDP.


Trong khi triển khai quy trình đào tạo, tôi đã đề cập đến mã tinh chỉnh Stanford Alpacamã tinh chỉnh Mistral của Anton Bacaj .


Việc sử dụng phân đoạn đầy đủ FSDP có độ chính xác một nửa với độ dài chuỗi 1024 và kích thước lô vi mô là 2 yêu cầu 63GB VRAM trên mỗi GPU trong số 8 GPU A100 80 GB. Quá trình đào tạo kéo dài ba kỷ nguyên, chỉ mất 20 phút. Tổng chi phí cho VM là 8,88 USD mỗi giờ, tương đương 3 USD, chưa bao gồm thời gian thử nghiệm và sửa lỗi.


Cuộc trò chuyện:


Bạn 1 vs Alexander Smirnov


Bạn 2 vs Alexander Smirnov


Alexander Smirnov đấu với Bạn 1


Alexander Smirnov đấu với Bạn 2


Các cuộc trò chuyện đã trở nên thú vị và hấp dẫn hơn, mặc dù vẫn có nguy cơ mất bối cảnh. Hiệu suất ngôn ngữ tiếng Nga đã được cải thiện, nhưng vẫn xảy ra lỗi. Tôi tin rằng trước khi tinh chỉnh cho một nhiệm vụ cụ thể với dữ liệu hạn chế, như của tôi, trước tiên sẽ có ích nếu tinh chỉnh mô hình không được giám sát trên một kho văn bản tiếng Nga lớn. Ngoài ra, việc kết hợp tên của các đối tác trò chuyện chung làm mã thông báo riêng biệt có thể nâng cao chất lượng.


Tôi sẽ không nói rằng nó tốt hơn đáng kể so với LoRA. Sẽ hiệu quả hơn nếu chỉ tập trung vào một người và tính toán tổn thất chỉ dựa trên phản hồi của tôi (hoặc của người khác), thay vì cố gắng tìm hiểu về từng đối tác trò chuyện.

Bớt tư tưởng

Chắc chắn, tôi đã phải chọn lọc các kết quả, không phải vì hầu hết các câu trả lời của mô hình đều không đầy đủ, mà vì nhiều câu trả lời đơn giản như “Tôi sẽ gọi cho bạn sau”, “bận” và “được”, vốn là những câu trả lời thường xuyên. trong các cuộc trò chuyện. Mặc dù vậy, rõ ràng là mô hình này rất xuất sắc trong việc bắt chước phong cách của người mà nó mạo danh. Nó cũng nắm bắt các chủ đề thường được thảo luận giữa hai người. Tuy nhiên, nó thiếu bối cảnh đáng kể trong các cuộc trò chuyện. Trả lời các câu hỏi như “yo, vậy?” hoặc “kế hoạch cuối tuần của bạn là gì” là một thách thức nếu không có bối cảnh đầy đủ. Có lẽ việc sử dụng một hệ thống như Rewind , hệ thống ghi lại mọi thao tác của người dùng trên máy tính, có thể mang lại lợi ích.

Mã số

Bạn có thể tìm thấy mã cho dự án này cũng như hướng dẫn về cách tự sao chép nó trên kết xuất Telegram của riêng bạn trong kho lưu trữ github của tôi . Nhật ký đào tạo có thể được truy cập trên WandB .


Hình ảnh chính của Christian Wiediger trên Bapt