paint-brush
Ruby-де кішкентай тіл үлгісін (TLM) қалай құруға болады: қадамдық нұсқаулықбойынша@davidesantangelo
520 оқулар
520 оқулар

Ruby-де кішкентай тіл үлгісін (TLM) қалай құруға болады: қадамдық нұсқаулық

бойынша Davide Santangelo10m2025/02/03
Read on Terminal Reader

Тым ұзақ; Оқу

Бұл мақалада біз Ruby көмегімен өте қарапайым тіл үлгісін жасау жолын қарастырамыз. Біз негізгі Марков тізбегі үлгісін жасаймыз, ол кіріс мәтінінен «үйренеді», содан кейін ол бақыланған үлгілер негізінде жаңа мәтінді жасайды.
featured image - Ruby-де кішкентай тіл үлгісін (TLM) қалай құруға болады: қадамдық нұсқаулық
Davide Santangelo HackerNoon profile picture
0-item

Бұл мақалада біз Ruby көмегімен өте қарапайым тіл үлгісін жасау жолын қарастырамыз. Шынайы үлкен тіл үлгілері (LLM) үлкен көлемдегі деректер мен есептеу ресурстарын қажет етсе де, біз тілдік модельдеудің артындағы көптеген негізгі ұғымдарды көрсететін ойыншық үлгісін жасай аламыз. Біздің мысалда біз енгізілген мәтіннен «үйренетін» негізгі Марков тізбегі моделін құрастырамыз, содан кейін ол байқалған үлгілер негізінде жаңа мәтінді жасайды.


Ескертпе: Бұл оқулық білім беру мақсаттарына арналған және тілді модельдеуге оңайлатылған тәсілді суреттейді. Бұл GPT-4 сияқты қазіргі заманғы терең білім беретін LLM-ді алмастырмайды, керісінше негізгі идеяларға кіріспе.


Мазмұны

  1. Тілдік модельдердің негіздерін түсіну
  2. Ruby ортаңызды орнату
  3. Деректерді жинау және алдын ала өңдеу
  4. Марков тізбегі моделін құру
  5. Модельді жаттықтыру
  6. Мәтінді құру және тексеру
  7. Қорытынды

Тілдік модельдердің негіздерін түсіну

Тілдік модель – бұл сөздер тізбегіне ықтималдықтарды тағайындайтын жүйе. Оның негізінде ол белгілі бір контексте болатын белгілі бір реттілік ықтималдығын үйрену арқылы тілдің статистикалық құрылымын түсіруге арналған. Бұл үлгі сөздердің әдетте бірінен соң бірін қалай орындайтынын түсіну үшін мәтіннің үлкен көлемін талдайтынын білдіреді, осылайша оған келесі кезекте қандай сөз немесе сөз тіркесі келуі мүмкін екенін болжауға мүмкіндік береді. Мұндай мүмкіндіктер мәтінді жасау және автоматты аяқтау сияқты тапсырмалар үшін ғана емес, сонымен қатар аударма, қорытындылау және көңіл-күйді талдауды қоса алғанда, әртүрлі табиғи тілді өңдеу (NLP) қолданбалары үшін де орталық болып табылады.

GPT-4 сияқты заманауи кең ауқымды тіл үлгілері (LLM) тілдегі күрделі үлгілерді түсіру үшін терең оқыту әдістерін және жаппай деректер жиынын пайдаланады. Олар жасанды нейрондардың көптеген қабаттары арқылы енгізілген мәтінді өңдеу арқылы жұмыс істейді, бұл оларға адамға ұқсас мәтінді керемет еркіндікпен түсінуге және жасауға мүмкіндік береді. Дегенмен, осы күрделі жүйелердің артында бір іргелі идея жатыр: үйренген ықтималдықтарға негізделген сөздер тізбегін түсіну және болжау.

Тілді модельдеудің ең қарапайым әдістерінің бірі - Марков тізбегі . Марков тізбегі - бұл сөздің пайда болу ықтималдығы мәтіннің бүкіл тарихына емес, тек алдыңғы сөздердің шектеулі жиынтығына байланысты деген болжамға негізделген статистикалық модель. Бұл тұжырымдама Марковтың қасиеті ретінде белгілі. Практикалық тұрғыдан алғанда, модель дәйектіліктегі келесі сөзді тек ең соңғы сөздерге (сөздерге) қарап болжауға болатынын болжайды - бұл деректердегі пайдалы үлгілерді түсіру кезінде мәселені есептеуді жеңілдететін жеңілдету.

Марков тізбегіне негізделген тіл үлгісінде:

  • Болашақ күй (келесі сөз) тек ағымдағы күйге (алдыңғы сөздер) байланысты: Бұл соңғы бірнеше сөздерді білгеннен кейін (үлгі реті бойынша анықталады) бізде келесіде не болатынын болжауға жеткілікті контекст бар дегенді білдіреді. Сөйлесудің немесе мәтіннің бүкіл тарихын қарастырудың қажеті жоқ, бұл күрделілікті азайтады.
  • Алдыңғы сөз(дер)ді ескере отырып, келесі сөздің ықтималдық үлестірімін құрастырамыз: Модель мәтін корпусында дайындалғандықтан, ол берілген тізбектен кейінгі әртүрлі сөздердің ықтималдығын үйренеді. Содан кейін бұл ықтималдық үлестірімі генерациялау кезеңінде, әдетте үйренген ықтималдықтарды құрметтейтін кездейсоқ іріктеу процесін пайдалана отырып, реттіліктегі келесі сөзді таңдау үшін пайдаланылады.

Біздің іске асыруда біз болжам жасау кезінде қанша алдыңғы сөзді ескеру керектігін анықтау үшін конфигурацияланатын «тәртіпті» қолданамыз. Неғұрлым жоғары реттілік көбірек контекстті қамтамасыз етеді, бұл модельде бұрын болған нәрсе туралы көбірек ақпарат болғандықтан, анағұрлым дәйекті және мәтінмәндік сәйкес мәтін болуы мүмкін. Керісінше, төменгі реттілік көбірек кездейсоқтықты енгізеді және аз болжамды болса да, сөздер тізбегінің креативті болуына әкелуі мүмкін. Келісімділік пен шығармашылық арасындағы бұл келіссөз тілдік модельдеудің негізгі мәселесі болып табылады.

Осы негізгі принциптерді түсіну арқылы біз Марков тізбегі үлгілерінің қарапайымдылығын да, күрделі нейрондық тіл үлгілерін негізге алатын іргелі идеяларды да бағалай аламыз. Бұл кеңейтілген көрініс тіл болжаудың артындағы статистикалық механиканы түсінуге көмектесіп қана қоймайды, сонымен қатар табиғи тілді өңдеуде неғұрлым озық әдістермен тәжірибе жасау үшін негіз қалады.


Ruby ортаңызды орнату

Бастамас бұрын, жүйеде 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

Әртүрлі тұқымдармен және параметрлермен тәжірибе жасау арқылы (сөздердің реті және максималды саны сияқты) шығыстың қалай өзгеретінін көруге болады.


Толық мысал: Tiny LLM-ді оқыту және тестілеу

Міне, жоғарыда аталған барлық қадамдарды біріктіретін толық 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

Сценарийді іске қосу

  1. Сценарийді llm.rb ретінде сақтаңыз.
  2. Терминалды ашыңыз және llm.rb бар каталогқа өтіңіз.
  3. Сценарийді пайдаланып іске қосыңыз:
 ruby llm.rb

Үлгінің оқытылғанын көрсететін нәтижені, содан кейін жасалған мәтіннің екі мысалын көруіңіз керек.


Эталон

Төмендегі кесте Tiny LLM енгізулеріміздің әртүрлі нұсқалары үшін кейбір эталондық көрсеткіштерді жинақтайды. Әрбір көрсеткіш төменде түсіндіріледі:

  • Үлгі: тіл үлгісінің атауы немесе нұсқа идентификаторы.
  • Тәртіп: Келесі сөзді болжау үшін Марков тізбегінде қолданылған алдыңғы сөздердің саны. Неғұрлым жоғары реттілік әдетте контексттің көбірек пайдаланылғанын білдіреді, бұл ықтимал үйлесімділікті арттырады.
  • Жаттығу уақыты (мс): миллисекундпен өлшенетін берілген мәтіндік деректерде үлгіні үйретуге кететін шамамен уақыт.
  • Генерация уақыты (мс): миллисекундпен өлшенетін үлгі мәтінді шығаруға қажетті уақыт.
  • Жадты пайдалану (МБ): Жаттығу және жасау кезінде үлгі тұтынатын жад көлемі.
  • Сәйкестік рейтингі: Жасалған мәтіннің қаншалықты дәйекті немесе контекстік сәйкестігін көрсететін субъективті бағалау (5-тен).

Төменде салыстыру деректері бар таңбалау кестесі берілген:

Үлгі

Тапсырыс беру

Жаттығу уақыты (мс)

Жасау уақыты (мс)

Жадты пайдалану (МБ)

Когеренттілік рейтингі

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 жүйесін машиналық оқыту кітапханаларымен біріктіру арқылы кеңейте аласыз.

Бақытты кодтау!

L O A D I N G
. . . comments & more!

About Author

Davide Santangelo HackerNoon profile picture
Davide Santangelo@davidesantangelo
Software Engineer - dad. APIs specialist, In love with #ruby, #go and #python - developer at sevio.it

ТЕГТЕРДІ АЛУ

БҰЛ МАҚАЛА БАСҚАРҒАН...