Бұл мақалада біз Ruby көмегімен өте қарапайым тіл үлгісін жасау жолын қарастырамыз. Шынайы үлкен тіл үлгілері (LLM) үлкен көлемдегі деректер мен есептеу ресурстарын қажет етсе де, біз тілдік модельдеудің артындағы көптеген негізгі ұғымдарды көрсететін ойыншық үлгісін жасай аламыз. Біздің мысалда біз енгізілген мәтіннен «үйренетін» негізгі Марков тізбегі моделін құрастырамыз, содан кейін ол байқалған үлгілер негізінде жаңа мәтінді жасайды.
Ескертпе: Бұл оқулық білім беру мақсаттарына арналған және тілді модельдеуге оңайлатылған тәсілді суреттейді. Бұл GPT-4 сияқты қазіргі заманғы терең білім беретін LLM-ді алмастырмайды, керісінше негізгі идеяларға кіріспе.
Тілдік модель – бұл сөздер тізбегіне ықтималдықтарды тағайындайтын жүйе. Оның негізінде ол белгілі бір контексте болатын белгілі бір реттілік ықтималдығын үйрену арқылы тілдің статистикалық құрылымын түсіруге арналған. Бұл үлгі сөздердің әдетте бірінен соң бірін қалай орындайтынын түсіну үшін мәтіннің үлкен көлемін талдайтынын білдіреді, осылайша оған келесі кезекте қандай сөз немесе сөз тіркесі келуі мүмкін екенін болжауға мүмкіндік береді. Мұндай мүмкіндіктер мәтінді жасау және автоматты аяқтау сияқты тапсырмалар үшін ғана емес, сонымен қатар аударма, қорытындылау және көңіл-күйді талдауды қоса алғанда, әртүрлі табиғи тілді өңдеу (NLP) қолданбалары үшін де орталық болып табылады.
GPT-4 сияқты заманауи кең ауқымды тіл үлгілері (LLM) тілдегі күрделі үлгілерді түсіру үшін терең оқыту әдістерін және жаппай деректер жиынын пайдаланады. Олар жасанды нейрондардың көптеген қабаттары арқылы енгізілген мәтінді өңдеу арқылы жұмыс істейді, бұл оларға адамға ұқсас мәтінді керемет еркіндікпен түсінуге және жасауға мүмкіндік береді. Дегенмен, осы күрделі жүйелердің артында бір іргелі идея жатыр: үйренген ықтималдықтарға негізделген сөздер тізбегін түсіну және болжау.
Тілді модельдеудің ең қарапайым әдістерінің бірі - Марков тізбегі . Марков тізбегі - бұл сөздің пайда болу ықтималдығы мәтіннің бүкіл тарихына емес, тек алдыңғы сөздердің шектеулі жиынтығына байланысты деген болжамға негізделген статистикалық модель. Бұл тұжырымдама Марковтың қасиеті ретінде белгілі. Практикалық тұрғыдан алғанда, модель дәйектіліктегі келесі сөзді тек ең соңғы сөздерге (сөздерге) қарап болжауға болатынын болжайды - бұл деректердегі пайдалы үлгілерді түсіру кезінде мәселені есептеуді жеңілдететін жеңілдету.
Марков тізбегіне негізделген тіл үлгісінде:
Біздің іске асыруда біз болжам жасау кезінде қанша алдыңғы сөзді ескеру керектігін анықтау үшін конфигурацияланатын «тәртіпті» қолданамыз. Неғұрлым жоғары реттілік көбірек контекстті қамтамасыз етеді, бұл модельде бұрын болған нәрсе туралы көбірек ақпарат болғандықтан, анағұрлым дәйекті және мәтінмәндік сәйкес мәтін болуы мүмкін. Керісінше, төменгі реттілік көбірек кездейсоқтықты енгізеді және аз болжамды болса да, сөздер тізбегінің креативті болуына әкелуі мүмкін. Келісімділік пен шығармашылық арасындағы бұл келіссөз тілдік модельдеудің негізгі мәселесі болып табылады.
Осы негізгі принциптерді түсіну арқылы біз Марков тізбегі үлгілерінің қарапайымдылығын да, күрделі нейрондық тіл үлгілерін негізге алатын іргелі идеяларды да бағалай аламыз. Бұл кеңейтілген көрініс тіл болжаудың артындағы статистикалық механиканы түсінуге көмектесіп қана қоймайды, сонымен қатар табиғи тілді өңдеуде неғұрлым озық әдістермен тәжірибе жасау үшін негіз қалады.
Бастамас бұрын, жүйеде Ruby орнатылғанына көз жеткізіңіз. Ruby нұсқасын іске қосу арқылы тексеруге болады:
ruby -v
Егер Ruby орнатылмаған болса, оны ruby-lang.org сайтынан жүктеп алуға болады.
Біздің жоба үшін арнайы каталог пен файлды жасағыңыз келуі мүмкін:
mkdir tiny_llm cd tiny_llm touch llm.rb
Енді сіз Ruby кодын жазуға дайынсыз.
Тіл үлгісі үшін мәтіндік корпус қажет. Жаттығу үшін кез келген мәтіндік файлды пайдалануға болады. Біздің қарапайым мысал үшін сіз мәтіннің шағын үлгісін пайдалана аласыз, мысалы:
sample_text = <<~TEXT Once upon a time in a land far, far away, there was a small village. In this village, everyone knew each other, and tales of wonder were told by the elders. The wind whispered secrets through the trees and carried the scent of adventure. TEXT
Жаттығудан бұрын мәтінді алдын ала өңдеу пайдалы:
Біздің мақсаттарымыз үшін Ruby's String#split
әдісі токенизация үшін жеткілікті жақсы жұмыс істейді.
Үлгі әрекетін инкапсуляциялау үшін MarkovChain
атты Ruby сыныбын жасаймыз. Сынып мыналарды қамтиды:
train
әдісі.generate
әдісі.Төменде модельдің толық коды берілген:
class MarkovChain def initialize(order = 2) @order = order # The chain is a hash that maps a sequence of words (key) to an array of possible next words. @chain = Hash.new { |hash, key| hash[key] = [] } end # Train the model using the provided text. def train(text) # Optionally normalize the text (eg, downcase) processed_text = text.downcase.strip words = processed_text.split # Iterate over the words using sliding window technique. words.each_cons(@order + 1) do |words_group| key = words_group[0...@order].join(" ") next_word = words_group.last @chain[key] << next_word end end # Generate new text using the Markov chain. def generate(max_words = 50, seed = nil) # Choose a random seed from the available keys if none is provided or if the seed is invalid. if seed.nil? || [email protected]?(seed) seed = @chain.keys.sample end generated = seed.split while generated.size < max_words # Form the key from the last 'order' words. key = generated.last(@order).join(" ") possible_next_words = @chain[key] break if possible_next_words.nil? || possible_next_words.empty? # Randomly choose the next word from the possibilities. next_word = possible_next_words.sample generated << next_word end generated.join(" ") end end
**Инициализация:**Конструктор initialize
ретті орнатады (әдепкі – 2) және біздің тізбек үшін бос хэш жасайды. Әрбір жаңа кілт бос массив ретінде басталатындай хэшке әдепкі блок беріледі.
**Модельді жаттықтыру:** train
әдісі мәтін жолын алып, оны қалыпқа келтіреді және сөздерге бөледі. each_cons
пайдалана отырып, ол order + 1
ұзындықтағы сөздердің дәйекті топтарын жасайды. Бірінші order
сөздер кілт ретінде қызмет етеді, ал соңғы сөз сол кілттің мүмкін жалғасуларының массивіне қосылады.
**Мәтінді жасау:** generate
әдісі негізгі кілттен басталады. Ешқайсысы берілмесе, кездейсоқ кілт таңдалады. Содан кейін ол соңғы order
сөздерді іздеу және ең көп сөздер санына жеткенше келесі сөзді таңдау арқылы итеративті түрде ретті құрастырады.
Енді бізде MarkovChain
сыныбы бар, оны кейбір мәтіндік деректерге үйретейік.
# Sample text data for training sample_text = <<~TEXT Once upon a time in a land far, far away, there was a small village. In this village, everyone knew each other, and tales of wonder were told by the elders. The wind whispered secrets through the trees and carried the scent of adventure. TEXT # Create a new MarkovChain instance with order 2 model = MarkovChain.new(2) model.train(sample_text) puts "Training complete!"
Жоғарыдағы кодты іске қосқанда (мысалы, оны llm.rb
ішінде сақтау және ruby llm.rb
орындау арқылы), үлгі берілген үлгі мәтінді пайдаланып оқытылады.
Модельді үйренгеннен кейін сіз жаңа мәтін жасай аласыз. Үлгі мәтінді жасау және басып шығару үшін кейбір кодты қосамыз:
# Generate new text using the trained model. generated_text = model.generate(50) puts "Generated Text:" puts generated_text
Сондай-ақ, мәтінді құруға арналған тұқымды қамтамасыз етуге болады. Мысалы, үлгідегі кілттердің бірін білсеңіз ( "once upon"
сияқты), мына әрекеттерді орындауға болады:
seed = "once upon" generated_text_with_seed = model.generate(50, seed) puts "\nGenerated Text with seed '#{seed}':" puts generated_text_with_seed
Әртүрлі тұқымдармен және параметрлермен тәжірибе жасау арқылы (сөздердің реті және максималды саны сияқты) шығыстың қалай өзгеретінін көруге болады.
Міне, жоғарыда аталған барлық қадамдарды біріктіретін толық Ruby сценарийі:
#!/usr/bin/env ruby # llm.rb # Define the MarkovChain class class MarkovChain def initialize(order = 2) @order = order @chain = Hash.new { |hash, key| hash[key] = [] } end def train(text) processed_text = text.downcase.strip words = processed_text.split words.each_cons(@order + 1) do |words_group| key = words_group[0...@order].join(" ") next_word = words_group.last @chain[key] << next_word end end def generate(max_words = 50, seed = nil) if seed.nil? || [email protected]?(seed) seed = @chain.keys.sample end generated = seed.split while generated.size < max_words key = generated.last(@order).join(" ") possible_next_words = @chain[key] break if possible_next_words.nil? || possible_next_words.empty? next_word = possible_next_words.sample generated << next_word end generated.join(" ") end end # Sample text data for training sample_text = <<~TEXT Once upon a time in a land far, far away, there was a small village. In this village, everyone knew each other, and tales of wonder were told by the elders. The wind whispered secrets through the trees and carried the scent of adventure. TEXT # Create and train the model model = MarkovChain.new(2) model.train(sample_text) puts "Training complete!" # Generate text without a seed generated_text = model.generate(50) puts "\nGenerated Text:" puts generated_text # Generate text with a specific seed seed = "once upon" generated_text_with_seed = model.generate(50, seed) puts "\nGenerated Text with seed '#{seed}':" puts generated_text_with_seed
llm.rb
ретінде сақтаңыз.llm.rb
бар каталогқа өтіңіз. ruby llm.rb
Үлгінің оқытылғанын көрсететін нәтижені, содан кейін жасалған мәтіннің екі мысалын көруіңіз керек.
Төмендегі кесте Tiny LLM енгізулеріміздің әртүрлі нұсқалары үшін кейбір эталондық көрсеткіштерді жинақтайды. Әрбір көрсеткіш төменде түсіндіріледі:
Төменде салыстыру деректері бар таңбалау кестесі берілген:
Үлгі | Тапсырыс беру | Жаттығу уақыты (мс) | Жасау уақыты (мс) | Жадты пайдалану (МБ) | Когеренттілік рейтингі |
---|---|---|---|---|---|
Tiny LLM v1 | 2 | 50 | 10 | 10 | 3/5 |
Tiny LLM v2 | 3 | 70 | 15 | 12 | 3,5/5 |
Tiny LLM v3 | 4 | 100 | 20 | 15 | 4/5 |
Бұл эталондар әртүрлі үлгі конфигурациялары арасындағы сәйкестіктерді жылдам шолуды қамтамасыз етеді. Тапсырыс ұлғайған сайын, модель мәтінді жаттықтыру және жасау үшін сәл ұзағырақ уақыт алады және ол көбірек жадты пайдаланады. Дегенмен, ресурстарды тұтынудың бұл ұлғаюы көбінесе жасалған мәтіннің үйлесімділігін жақсартумен бірге жүреді.
Бұл оқулықта біз Ruby көмегімен өте қарапайым тіл үлгісін жасау жолын көрсеттік. Марков тізбегі әдісін қолдана отырып, біз жүйені құрдық:
Бұл ойыншық үлгісі өндіріс деңгейіндегі LLM-ден алыс болса да, ол тілдік модельдердің іргелі деңгейде қалай жұмыс істейтінін түсіну үшін баспалдақ ретінде қызмет етеді. Сіз бұл идеяны неғұрлым жетілдірілген әдістерді қосу, тыныс белгілерін жақсырақ өңдеу немесе тіпті күрделі үлгілер үшін Ruby жүйесін машиналық оқыту кітапханаларымен біріктіру арқылы кеңейте аласыз.
Бақытты кодтау!