Алдыңғы мақала:

Машиналық оқыту деген не?

Машиналық оқыту алгоритмінің екі түрі.

Машиналық оқыту алгоритмдерін екі негізгі топқа бөлуге болады. Олар: бақыланатын оқыту және бақылаусыз оқыту. Екеуінің айырмашылығы қарапайым болғанымен, өте маңызды.

Бақыланатын оқыту

Сіз жылжымайтын мүлік сататын агент деп есептейік. Сіздің бизнесіңіз кеңейгендіктен сіз өзіңізге көмектеседі деген оймен қосымша көмекшілерді жалдадыңыз. Бірақ мынадай мәселе туындады. Сіздің тәжірибеңіз мол болғандықтан, үйдің түріне қарап-ақ оның нарықтағы бағасын шамамен айта аласыз. Ал сіздің көмекшілеріңіз тәжірибенің жоқтығынан олай істей алмайды.

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

Бұл біздің оқыту деректеріміз.

Осы оқыту деректерін қолданып, біз мысалға мына үйдің бағасын есептеп бере алатын бағдарламаны жасаймыз.

Біз оқыту деректерін қолдану арқылы керек үйдің бағасын жоспарлағымыз келеді.

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

Өзіңіздің бағдарламаңызды құру үшін сіз дайын оқыту деректерін машиналық оқыту алгоритіміне бересіз. Алгоритм сол мәліметтерді қолданып, сандар сәйкес келуі үшін қандай математика қолдану керектігін түсінуге тырысады.

Ол арифметикалық символдары өшірілген теңдеуге ұқсайды.

Осы суретке қарай отырып, қандай теңдеулер жасырылғанын таба аласыз ба? Сіз сол жақтағы сандармен бірнәрсе істеу арқылы он жақтағы санға шығуға болатынын білесіз.

Бақыланатын оқытуда сіз компьютерге сол теңдеуді табуға мүмкіндік бересіз. Дәл осы мәселені шешуге қажет математиканы білгеннен кейін, сіз сол алгоритмді осыған ұқсас мәселелердің шешімін табуға қолдана аласыз.

Бақылаусыз  оқыту

Жылжымайтын мүлік агентінің мысалына қайта оралайық. Егер біз үйлер қай бағамен сатылғандығын білмесек ше? Сіз бар болғаны үйдің көлемін, орналасуын және т.б. деректерді ғана білсеңіз де, осы мәліметтер арқылы сіз керемет заттар жасай аласыз. Осы бақыланбайтын оқыту деп аталады.

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

Бұл біреу сізге кестеге толтырылған сандарды беріп: “Мына сандар не білдіретінін білмеймін, бірақ сен мүмкін солардың арасындағы бір байланысты байқап қаларсың – іске сәт!” дегенмен пара-пар.

Сонда бұл деректермен не істеуге болады? Біріншіден, сіз осы деректерге қарап, әртүрлі нарық сегменттерін аңықтай алатын алгоритм жасау аласыз. Сіз жергілікті колледждің қасындағы үй сатып алушылардың көлемі шағын, бірақ бөлмелері көп үйлерді, ал қаланың сыртындағылары 3 бөлмелі, бірақ көлемі үлкен үйді ұнататынын байқауыңыз мүмкін. Тұтынушылардың осындай айырмашылықтарын білу, маркетингтік стратегияның дұрыс таңдалуына көмектесетіні белгілі.

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

Біз осы постыда бақыланатын оқытуды көбірек қарастырамыз. Бірақ осыны байқап, бақылаусыз оқытудың пайдасы жоқ екен деп ойлап қалмаңыздар. Шын мәнінде бақылаусыз оқыту соңғы жылдары үлкен трендке айналып жатыр. Ал оның басты себебі – деректерді дұрыс жауаппен беруді қажет етпеуінде.

Үйдің бағасын болжай білу керемет қой әрине, бірақ ол машиналық оқытуға жата ма?

Барлық адамдар сиақты, сіздің миыңыз кез келген мәселеге келіп, cол мәселені қалай шешу болатынын еш нұсқаусыз таба алады. Егер сіз ұзақ уақыт бойы үйлерді сатумен айналысып жүрсеңіз, онда сіз инстинктивті түрде үйдің дұрыс бағасы, сол үйді сатудың тиімді жолы, сол үйге қандай тұтынушы қызығатыны ж/е т.б. жайлы сезім пайда болады. Күшті жасанды интеллектінің басты мақсаты сондай мүмкіндіктерді комьютер арқылы қайталау.

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

Өкінішке орай, «Белгілі бір мысал деректерін негізге алып, нақты мәселені шешу үшін теңдеуді анықтау» деген атау жақсы деуге келмейді. Сондықтан біз оның орнына «Машиналық оқыту» терминын қолданамыз.

Әрине, егер сіз осы постыны 50 жылдан кейін оқысаңыз және сол кезі адамзат Күшті ЖИ алгоритмін тақан болса, онда бұл пост сізге біртүрлі болып көрінуі мүмкін. Онда оқуды доғарып, өзіңіздің роботыңызға сізге сендвич дайындап берсін деп айтыңыз, болашақтың адамы.

Осы бағдарламаны жазайық

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

Егер сіздің машиналық оқыту саласынан хабарыңыз жоқ болса, онда сіз төмендегідей бағдарлама жазуыңыз мүмкін.

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = 0
  # In my area, the average house costs $200 per sqft
  price_per_sqft = 200
  if neighborhood == "hipsterton":
    # but some areas cost a bit more
    price_per_sqft = 400
  elif neighborhood == "skid row":
    # and some areas cost less
    price_per_sqft = 100
  # start with a base price estimate based on how big the place is
  price = price_per_sqft * sqft
  # now adjust our estimate based on the number of bedrooms
  if num_of_bedrooms == 0:
    # Studio apartments are cheap
    price = price — 20000
  else:
    # places with more bedrooms are usually
    # more valuable
    price = price + (num_of_bedrooms * 1000)
 return price

Егер сіз осыны көптеген сағат бойы отырып жасасаңыз, онда жұмыс істейтін бір бағдарлама шығуы мүмкін. Алайда, сіздің бағдарламаңыз ешқашан мінсіз болмайды, үйдің бағалары өзгерген кезде оны жетілдіру қиын болады. 

Егер осы функцияны қалай жасауға болатынын компьютер өзі түсініп алса, сізге жақсы болар ма еді? Егер функция әрдайым дұрыс жауапты қайтаратын болса, оның қалай жұмыс істейтіні кімге қызықты болады?

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = <computer, plz do some math for me>
  return price

Осы мәселені қарауды бір жол бағаны – дәмді тағам ретінде, ал жатын бөлме саны, үйдің аумағы мен үйдің орналасуын – ингридиент ретінде қабылдау. Егер біз әр ингридиент нәтижеде шығатын бағаға қаншалықты әсер ететін білсек, онда біз нәтижедегі бағаға шығуға қажетті ингридиенттердің нақта қатынасын білер едік.

Осының арқасында біздің бастапқы бағдарламамыз (барлық if және else-пен қоса) мынадай ықшамдалған түрге келер еді.

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
 price = 0
 # a little pinch of this
 price += num_of_bedrooms * .841231951398213
 # and a big pinch of that
 price += sqft * 1231.1231231
 # maybe a handful of this
 price += neighborhood * 2.3242341421
 # and finally, just a little extra salt for good measure
 price += 201.23432095
 return price

.841231951398213, 1231.1231231, 2.3242341421, және 201.23432095 қойын түспен белгіленген сандарға назар аударайық. Олар біздің салмақтарымыз. Егер біз барлық үй үшін жұмыс істейтін салмақты тауып алсақ, онда біздің функциямыз бағаны болжай алады.

Ең жақсы салмақты есептеудің қарапайым жолы шамамен мынаған ұқсас болады:

Қадам 1

Барлық салмақты 1,0 деп қабылдаудан бастайық

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = 0
  # a little pinch of this
  price += num_of_bedrooms * 1.0
  # and a big pinch of that
  price += sqft * 1.0
  # maybe a handful of this
  price += neighborhood * 1.0
  # and finally, just a little extra salt for good measure
  price += 1.0
  return price

Қадам 2

Әр үйді біздің функциядан өткізіп, есептелген баға дұрыс бағадан қаншалықты ауытқитынын түсінейік.

Функциямызды әр үйдің бағасын болжауға қолданып көрейік

Мысалға, егер функциямыз біздің бірінші үйіміз 178 000 долларға сатылды деп болжап, ал шын мәнінді ол үй 250 000 долларға сатылған болса, онда 72 000 $-ға қателесті деген сөз.

Енді осы айырмашылықтардың квадратын шығарып, бәрін қосайық. Мысалы, мәліметтер жиынтығымызда 500 үйдің деректері бар деп ойлайық. Және сол айырмашылықтардың квадратының қосындысы 86 123 373 $ болды делік. Онда осы сома біздің функциямыз қаншалықты “қате” екенін көрсетеді.

Енді осы соманы алып, 500-ге бөлсек, онда әр үйіміз орта есеппен қаншалықты қате шыққанын есептей аламыз. Осы орташа қателікті функцияның құны деп аталады.

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

Қадам 3

Барлық мүмкін салмақ комбинациясын 2-ші қадамға қолданып көруіңіз керек. Қай комбинация функцияның құнын нөлге неғұрлым жақын қылса, сол мәселенің шешімі деп қабылдаймыз.

Миды жаратын уақыт келді

Бұл өте жеңіл, дұрыс па? Енді не істегенімізді ойлап көрейік. Сіз мәліметтерді алып, оларды үш өте қарапайым қадам арқылы өткізіп, сіздің аймағыңыздағы кез-келген үйдің бағасын болжап бере алатын функцияны ойлап таптыңыз.

Бірақ сіздің миыңызды жаратын тағы да қосымша фактілер бар:

  1. Әр түрлі аймақта (лингвистика/аударма) соңғы 40 жылда болған зерттеулердің нәтижесі, бұл жалпы машиналық оқыту алгоритмдері кәдімгі адамдар өздері болжауға арналған әдістерден әлдеқайда асып түсетінін көрсетті. Машиналық оқытудың “топас” әдістері шын мәнінде эксперт адамдарды басып озды.
  2. Біз тапқан функция шын мәнінде ақымақ. Ол “текше метр” не, “жатын бөлме” деген не екенін де білмейді. Оның бар білетіні — дұрыс жауапты табу үшін белгілі мөлшердегі сандарды араластыру керектігі ғана.
  3. Сіз белгілі салмақтардың мөлшері неге дұрыс жұмыс істеп тұрғандығын білмеуіңіз мүмкін. Сіз қалай жұмыс істейтінін толық түсінбесеңіз де, дұрыс істеп тұрған функцияны жаздыңыз.
  4. Енді сіздің болжағыш функцияңыз “sqft” және “num_of_bedrooms” параметрлерін алудың орнына сандар массивын қабылдайды деп есептейік. Айталық, әр сан көлігіңіздің үстіне орнатылған камерада түсірілген суреттегі бір пиксельдің жарықтығын бейнелейді. Ал функцияның шығысында “price”(баға) параметрінің орнына “degreed_to_turn_steering_wheel”(рөлді қанша градусқа бұру керек) параметрі болады деп ойлайық. Сіз жаңа ғана көлігіңізді басқара алатын функция ойлап таптыңыз.

Сұмдық, иә?

Үшінші қадамдағы “барлық мәндерді қолданып көру” жайлы ше?

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

Осыны болдырмас үшін математиктер барлық мәндерді тексермей-ақ әр түрлі салмақтар үшін жақсы шешімді табуға көмектесетін бірталай ақылды әдістерді тапқан.

Біріншіден, жоғарыдағы екінші қадамды сипаттайтын теңдікті жазып шығайық.

Бұл сіздің — құн функцияңыз

Енді д

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

Θ ағымдағы салмақты сипаттайды. J(θ) ағымдағы салмақтың құнын білдіреді 

Бұл теңдік біз енгізген салмақтар үшін бағаны есептейтін функциямыз қаншалықты қате екенін көрсетеді.

Number_of_bedrooms және sqft үшін барлық мүмкін салмақтар үшін құн теңдігін графикке салатын болсақ, онда ол мынаған ұқсас болады:

Бағаны есептейтін функциямыздың графигі тостағанға ұқсайды. Вертикалді ось бағаны сипаттайды.

Осы графиктегі көк түсті аймақтағы ең төменге нүкте — функцияның қателігі ең төмен нүктесі. Ал ең биік нүктелерде біздің функциямыздың қателігі ең жоғары болады. Сондықтан, бізді осы графиктегі ең төменгі нүктеге әкеле алатын салмақтарды тапсақ, онда біз ең жақсы жауап тапқанымыз.

Бізге бар болғаны салмақтарды реттеу арқылы, “төбеден түсіп”, өзімізді ең төменгі нүктеге бағыттай аламыз. Егер бізді ең төменгі нүктеге бағыттайтындай қылып салмақтарды сәл реттеп отырсақ, онда өте көп салмақтарды тексермей-ақ, ақыры сол нүктеге жетеміз.

Егер Calculus-тан естеліктер қалған болса, онда функцияның туындысын алатын болсаңыз ол сізге кез-келген нүктедегі функцияның жанамасының көлбеуін көрсететінін білетін шығарсыз. Басқа сөзбен айтқанда, біздің графиктағы кез-келген нүктесінде қай жол төмен қарай баратынын көрсетеді. Біз осы білімді төмен қарай жылжу үшін қолдана аламыз.

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

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

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

Тағы қандай нәрселерді ыңғайыңыз үшін елемей өттіңіз?

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

«Бірақ мен сізге көрсеткен тәсіл қарапайым жағдайларда жұмыс істегенімен, барлық жағдайларда жұмыс істемейді. Себебінің бірі — үй бағалары әрдайым үздіксіз сызықты ұстанатындай қарапайым бола бермейді.»

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

«Сондай-ақ, мен модельдің шамадан тыс сәйкестігі (overfitting) идеясын ескермедім. Бастапқы деректер жиынындағы үйлердің бағаларын болжауда әрқашан мінсіз жұмыс істейтін, бірақ бастапқы деректер жиынында болмаған кез келген жаңа үйлер үшін мүлдем жұмыс істемейтін салмақтар жиынтығын ойлап табу оңай. Бірақ бұл мәселені шешудің жолдары бар (мысалы, реттеу (regularization) және кросс-валидациялық деректер жиынын пайдалану). Бұл мәселені шешуді үйрену — машиналық оқытуды сәтті қолдануды үйренудің негізгі бөлігі.»

«Басқаша айтқанда, негізгі тұжырымдама өте қарапайым болғанымен, машиналық оқытуды қолданып, пайдалы нәтижелер алу үшін белгілі бір дағдылар мен тәжірибе қажет. Бірақ бұл кез келген әзірлеуші үйрене алатын дағды!»

Келесі мақала:

Машиналық оқыту сиқыр ма?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *