მოდელების შერწყმის ტიპური გზა, აქამდე, მოიცავდა მოდელების ნაკრების აღებას და მათ გაერთიანებას. ეს პოსტი წარმოადგენს კარგ შესავალს ამ თემაზე. ზოგადად, მრავალი მოდელის შერწყმისთვის, ჩვენ ჯერ ვიწერთ მათ საგუშაგო წერტილებს (checkpoints) და შემდეგ ვასრულებთ შერწყმას. შერწყმის ალგორითმისა და ძირითადი მოდელის ზომების მიხედვით, ეს პროცესი შეიძლება იყოს საკმაოდ მეხსიერება-ინტენსიური. mergekit ბიბლიოთეკა გვთავაზობს ოპტიმიზებულ გზებს ამის სამართავად, რაც პროცესს შესაძლებელს ხდის შეზღუდული მეხსიერების პირობებშიც კი. მაგრამ რა მოხდება, თუ გვსურს ერთი და იგივე მოდელიდან მიღებული სხვადასხვა „ადაპტერების“ შერწყმა? შესაძლოა გქონდეთ ოთხი განსხვავებული LoRA საგუშაგო წერტილი, რომლებიც მიღებულია ერთი და იგივე საბაზისო მოდელიდან, და გსურთ ექსპერიმენტები სხვადასხვა შერწყმის ტექნიკებით. საბოლოოდ, თქვენ გსურთ აირჩიოთ საუკეთესო შერწყმა, რომელიც მოგცემთ საუკეთესო შედეგებს თქვენი ამოცანისთვის. ასეთი დეველოპერული გამოცდილების გათვალისწინებისას რამდენიმე რამ აშკარა ხდება: ამ ასპექტების გათვალისწინებით, ჩვენ გამოვაქვეყნეთ შერწყმის ახალი მეთოდები, რომლებიც მიმართულია პოპულარული LoRA ადაპტერებისკენ 🤗 PEFT-ში. ამ პოსტში გვსურს გაგაცნოთ ხელმისაწვდომი მეთოდები, კოდის მაგალითები, რომლებიც დაგეხმარებათ საქმეში, შთამბეჭდავი შედეგები და ჩვენი სამომავლო გეგმები. დავიწყოთ 🚀 **მეთოდი 1: კონკატენაცია** ამ მეთოდში, LoRA მატრიცები კონკატენირდება. მაგალითად, თუ გვაქვს 2 LoRA ადაპტერი (A₁, B₁) და (A₂, B₂) წონებით `weight₁` და `weight₂` ამ ორი ადაპტერის შეწონილი შერწყმისთვის, მაშინ შერწყმა ხდება შემდეგნაირად: `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 აქტიური იყო წონებით `weight₁` და `weight₂`, რომლებიც გამოიყენებოდა შესაბამისად პირველ და მეორე ადაპტერებზე. `h=W0x+BmergedAmergedx` აქ შეგვიძლია დავაკვირდეთ, რომ: `BmergedAmerged=weight1*scaling1*B1A1+weight2*scaling2*B2A2` **მეთოდი 2: შეწონილი ჯამი (ინდივიდუალური LoRA მატრიცებზე)** ამ მეთოდში, LoRA მატრიცები ჩართულია შეწონილ ჯამში. სწორედ ამას ახორციელებს "Task arithmetic" ნაშრომი ამოცანის წონებზე. ამოცანის არითმეტიკაში, ჯერ გამოითვლება ამოცანის წონები, რაც არის დაზუსტებული წონებისა და საბაზისო მოდელის წონებს შორის სხვაობა, შემდეგ კი ხდება ამ ამოცანის წონების შეწონილი ჯამი. აქ, განხილული დელტა წონები არის ინდივიდუალური A და B მატრიცები, მათი ნამრავლი BA-ს ნაცვლად. ამ მეთოდის გამოყენება შესაძლებელია მხოლოდ იმ შემთხვევაში, თუ ყველა მონაწილე LoRA ადაპტერს აქვს იგივე რანგი. განვიხილოთ მაგალითი. ავიღოთ 2 LoRA ადაპტერი (A₁, B₁) & (A₂, B₂) წონებით `weight₁` და `weight₂` ამ ორი ადაპტერის შეწონილი შერწყმისთვის, მაშინ შერწყმა ხდება შემდეგნაირად: `Amerged=sqrt(weight1*scaling1)*A1+sqrt(weight2*scaling2)*A2` `Bmerged=sqrt(weight1*scaling1)*B1+sqrt(weight2*scaling2)*B2` დამატებითი დეტალებისთვის, გთხოვთ, იხილოთ ნაშრომი: Editing Models with Task Arithmetic. **მეთოდი 3: ამოცანის არითმეტიკა (დელტა წონებზე)** ინდივიდუალური A და B მატრიცების, როგორც ამოცანის წონების, განხილვის ნაცვლად, მათი ნამრავლი BA, რომელიც დელტა წონაა, განიხილება ამოცანის წონად. გავაგრძელოთ წინა ქვეპუნქტების მაგალითით. აქ, ჯერ შერწყმული კომბინაციის დელტა წონა გამოითვლება შემდეგნაირად: `deltamerged=weight1*scaling1*B1A1+weight2*scaling2*B2A2` ზემოთ შერწყმული დელტა წონის მიღების შემდეგ, გამოიყენება SVD (განსაკუთრებული მნიშვნელობის დეკომპოზიცია) მიახლოებების `Amerged_approx` და `Bmerged_approx` მისაღებად. **მეთოდი 4: TIES (TRIM, ELECT SIGN & MERGE)** ეს მეთოდი ეფუძნება წრფივ და SVD მეთოდებს, ცვლის ადაპტერების ამოცანის წონებიდან შერწყმის გამოთვლის ხერხს და შესაბამისად იძლევა TIES და TIES_SVD მეთოდებს. TIES-ში (TRIM, ELECT SIGN & MERGE), ჯერ გამოითვლება ამოცანის წონები, რომელიც ჩვენს შემთხვევაში იქნება LoRA ადაპტერები A, B არა-SVD ვარიანტისთვის და მათი ნამრავლი BA SVD ვარიანტისთვის. ამის შემდეგ, იჭრება ამოცანის წონების უმცირესი მნიშვნელობები და შენარჩუნდება ტოპ-კ მნიშვნელობები მითითებული წილადი სიმკვრივის საფუძველზე.