მოდელების შერწყმის ტიპური გზა აქამდე გულისხმობდა რამდენიმე მოდელის აღებას და მათ გაერთიანებას. ეს პოსტი წარმოადგენს კარგ შესავალს ამ თემაზე. ზოგადად, მრავალი მოდელის შერწყმისთვის, ჩვენ ჯერ გადმოვწერთ მათ ჩექპოინტებს (checkpoints) და შემდეგ ვასრულებთ შერწყმას. შერწყმის ალგორითმისა და ძირითადი მოდელის ზომების მიხედვით, ეს პროცესი შეიძლება იყოს საკმაოდ მეხსიერება ინტენსიური. mergekit ბიბლიოთეკა გთავაზობთ ოპტიმიზებულ გზებს ამის სამართავად, რაც პროცესს შესაძლებელს ხდის შეზღუდული მეხსიერების პირობებშიც კი. მაგრამ რა მოხდება, თუ გვინდა ერთი და იმავე მოდელიდან მიღებული სხვადასხვა „ადაპტერის“ შერწყმა? შესაძლოა, გქონდეთ ოთხი განსხვავებული LoRA ჩექპოინტი, რომლებიც მიღებულია ერთი და იგივე საბაზისო მოდელიდან, და გსურთ ექსპერიმენტების ჩატარება შერწყმის სხვადასხვა ტექნიკით. საბოლოოდ, თქვენ მოისურვებთ საუკეთესო შერწყმაზე შეჩერებას, რომელიც საუკეთესო შედეგებს მოგცემთ თქვენი ამოცანისთვის. ასეთი დეველოპერის გამოცდილებასთან მიდგომისას რამდენიმე რამ აშკარა ხდება: ამ ასპექტების გათვალისწინებით, ჩვენ გამოვაქვეყნეთ შერწყმის ახალი მეთოდები, რომლებიც მიმართულია პოპულარული LoRA ადაპტერებისკენ 🤗 PEFT-ში. ამ პოსტში გვინდა გაგაცნოთ ხელმისაწვდომი მეთოდები, კოდის მაგალითები, რომლებიც დაგეხმარებათ დაწყებაში, შთამბეჭდავი შედეგები და ჩვენი სამომავლო გეგმები. მოდით დავიწყოთ 🚀 ამ მეთოდში LoRA მატრიცები ერთიანდება (კონკატენირდება). მაგალითად, თუ გვაქვს 2 LoRA ადაპტერი (A1,B1) და (A2,B2) შეწონილი შერწყმისთვის weight1 და weight2 წონებთან ერთად, მაშინ შერწყმა ხდება შემდეგნაირად: Amerged=concat(weight1*scaling1*A1,weight2*scaling2*A2,dim=0) Bmerged=concat(B1,B2,dim=1) სადაც shape(Amerged)=(rank1+rank2, d)) და (shape(Bmerged)=(d, rank1+rank2). ახლა, ამ ახალი შერწყმული LoRA ფენის გამომავალი ისეთი იქნება, თითქოს ორიგინალი 2 LoRA აქტიური იყო შესაბამისად weight1 და weight2 წონებით პირველ და მეორე ადაპტერებზე გამოყენებული. h=W0x+BmergedAmergedx აქ შეგვიძლია დავაკვირდეთ, რომ: BmergedAmerged=weight1*scaling1*B1A1+weight2*scaling2*B2A2 ამ მეთოდში LoRA მატრიცები შეწონილი ჯამის სახით მონაწილეობენ. სწორედ ამას ახორციელებს „დავალების არითმეტიკის“ (Task arithmetic) ნაშრომი დავალების წონებზე. დავალების არითმეტიკაში, ჯერ გამოითვლება დავალების წონები, რაც არის დაზუსტებული წონებისა (finetuned weights) და საბაზისო მოდელის წონებს შორის სხვაობა, შემდეგ კი ხდება ამ დავალების წონების შეწონილი ჯამი. აქ, დელტა წონებად განიხილება ინდივიდუალური მატრიცები A და B, და არა მათი ნამრავლი BA. ეს მეთოდი შეიძლება გამოყენებულ იქნას მხოლოდ მაშინ, როდესაც ყველა მონაწილე LoRA ადაპტერს აქვს იგივე რანგი (rank). განვიხილოთ მაგალითი. განვიხილოთ 2 LoRA ადაპტერი (A1,B1) და (A2,B2) weight1 და weight2 წონებთან ერთად ამ ორი ადაპტერის შეწონილი შერწყმისთვის, მაშინ შერწყმა ხდება შემდეგნაირად: Amerged=sqrt(weight1*scaling1)*A1+sqrt(weight2*scaling2)*A2 Bmerged=sqrt(weight1*scaling1)*B1+sqrt(weight2*scaling2)*B2 დამატებითი დეტალებისთვის, გთხოვთ, იხილოთ ნაშრომი: Editing Models with Task Arithmetic. ინდივიდუალური მატრიცების A და B, როგორც დავალების წონების, ნაცვლად, მათი ნამრავლი BA, რომელიც არის დელტა წონა, განიხილება დავალების წონად. გავაგრძელოთ წინა ქვე-სექციების მაგალითით. აქ, ჯერ გამოითვლება შერწყმული კომბინაციის დელტა წონა შემდეგნაირად: deltamerged=weight1*scaling1*B1A1+weight2*scaling2*B2A2 ზემოთ მოცემული შერწყმული დელტა წონის მიღების შემდეგ, გამოიყენება SVD (სინგულარული მნიშვნელობების დეკომპოზიცია) მიახლოებითი Amerged_approx და Bmerged_approx მისაღებად. ეს მეთოდი ეფუძნება ხაზოვან და SVD მეთოდებს იმის შეცვლით, თუ როგორ გამოითვლება შერწყმული ადაპტერები დავალების წონებიდან და იწვევს TIES და ties_svd მეთოდებს, შესაბამისად. TIES-ში (TRIM, ELECT SIGN & MERGE), ჯერ გამოითვლება დავალების წონები, რაც ჩვენს შემთხვევაში იქნება LoRA ადაპტერები A, B არა-SVD ვარიანტისთვის და მათი ნამრავლი BA SVD ვარიანტისთვის. ამის შემდეგ, თქვენ ამცირებთ დავალების წონების უმცირეს მნიშვნელობებს და ინარჩუნებთ ტოპ-k მნიშვნელობებს მითითებული ფრაქციული სიმკვრივის საფუძველზე.