×

Вступ до Machine Learning: знайомство з моделями

Цю статтю створено у співавторстві з Анастасією Білоус.

Машинне навчання і штучний інтелект за останні кілька років стали дуже гарячими темами. В тих чи інших варіантах вони сьогодні є частиною величезної кількості продуктів, і мало хто не задумується над їхнім запровадженням. Приклади застосування ML (Machine Learning) — від автоматичного визначення важливих листів і швидких відповідей в Gmail, створення музики за допомогою машинного навчання до AlphaGo. Ця стаття також буде прочитана роботами швидше і більше разів, ніж людьми :)

У цьому матеріалі ми сфокусуємося виключно на темі машинного навчання і спробуємо на інтуїтивному рівні описати принципи його роботи. В Iнтернеті є кілька визначень машинного навчання різного ступеню формальності, але в кінці статті ми прийдемо до свого власного. Оскільки це наш перший матеріал про машинне навчання на DOU, ми почнемо нашу, можна сказати екскурсію, з основ.

Знайти рішення

Візьмемо за приклад таку історію. Всесвітньо відомий український політехнічний університет (скорочено ПТУ) запровадив платну перездачу екзаменів. І у фінансового директора університету Іван Івановича виникла проблема: обсяги цих надходжень дуже складно запланувати наперед. Складніше ніж погоду, яка і так корелює з успішністю студентів. А Ryanair і all inclusive треба ж бронювати наперед.

Думати Іван Івановичу не дуже хотілося, тому він поставив цю задачу студенту Колі в якості курсової роботи. Коля був програміст моторний, тому швидко сів писати відповідну програму на Пітоні:

def predict_num_failed_exams(self):
  result = 0
  for student in self.all_students:
    for exam in student.exams:
      if self.predict_exam_failure(student, exam):
        result = result + 1
  return result

Він задумався над реалізацією методу predict_exam_failure(). Очевидно, що реалізація має брати до уваги попередні оцінки студентів, але як саме виразити це в коді — він не знав.

Тут йому і пригодилася база даних ПТУ, доступ до якої він отримав сумнівними способами ще минулого року, щоб дізнатися номер телефону Марічки. Коля швидко написав запит, який вивів минулорічну успішність студентів по предмету «Обчислювальні методи», який він дуже любив:

РікІм’я студентаПредметБали тест 1Бали тест 2Екзамен*
2017АндрійОМ475352
2017АняОМ757880
2017БорисОМ524747
2017МаріяОМ524949
...

* Для здачі екзамену необхідно набрати мінімум 51 бал

Розглянувши результати, Коля повернувся до коду:

def predict_exam_failure(student, exam):
  return student[exam.subject].test1_grade < 51 or student[exam.subject].test2_grade < 51

Але трохи подумавши, він зрозумів, що для запису «Андрій» з вищенаведеної таблиці цей метод передбачить нездачу, так як результат першого тесту — менше 50 балів. Тому він виправив реалізацію методу на:

return (student[exam.subject].test1_grade + student[exam.subject].test2_grade) < 100

Тепер прогноз для Андрія правильний, але виходить для Марії ми тепер передбачимо успішну здачу екзамену. Хоча Коля і так знав, що Марічка завалила екзамен через нього, вiн вирішив, що результат другого тесту важливіший, ніж першого, і знову переписав свою формулу:

return (0.6 * student[exam.subject].test1_grade + 1.4 * student[exam.subject].test2_grade) < 100

І щоб уже вкотре переконатися у своїй геніальності, він вирішив перевірити, чи зможе його код точно передбачити результати минулих екзаменів, для яких результати уже були відомі. Він швидко написав код, який рахує, у скількох відсотків випадків його передбачення збігається з фактичним результатом. Цю метрику називають точність (англ. accuracy).

def calculate_accuracy(students):
  num_correct = 0
  num_total = 0
  for student in students:
    for exam in student.exams:
      num_total += 1
      if predict_exam_failure(student, exam) == exam.final_grade <= 50:
        num_correct += 1
  return 100.0 * num_correct / num_total

Точність

Запустивши цей метод на результатах екзаменів минулого літа, він отримав точність своєї функції — 54,8%. Тут наш герой почав усвідомлювати, що його халявна курсова суттєво ускладнилася. Іван Іванович навряд чи зрозуміє, як же це він полетить у Туреччину з імовірністю 55%.

Коля витратив дуже багато часу, підбираючи різні варіанти коефіцієнтів у своїй функції, тестуючи її кожен раз на точність. Десь під ранок у нього була функція, точність якої сягала 75%! Самооцінка Колі піднялася до такого ж рівня. Але перед тим як святкувати, він вирішив перевірити точність функції також на студентах інших факультетів. Після чого його самооцінка опустилася до 45%. Очевидно, що він так довго працював над своєю функцію, що «витиснув» з неї максимальну точність на екзаменах свого факультету, але це зробило її ще гіршою для інших. Цю ситуацію називають надмірне навчання або перенавчання (анг. overfitting).

Відіспавшись, наш Микола подумав, що він хоче змарнувати ще одну ніч, підбираючи всі можливі коефіцієнти знову. Врешті для цього він і вчиться на програміста — щоб писати код для автоматизації ручної роботи. Тоді чому б не автоматизувати процес підбору коефіцієнтів для його функції, тобто автоматизувати процес автоматизації! У нього почала вимальовуватися ідея для докторської дисертації...

Зобразивши результати екзамену точками різних кольорів, Коля отримав такий малюнок:

З нього стало очевидно, що простим правилом розділити ці приклади даних не вийде. І що його вчорашня функція, яка виглядала, як чорна лінія на наступному малюнку, дуже точно розділяла дані у його вибірці. Але через свою складну форму погано робила передбачення на даних, під які вона не була підібрана.

Помаранчева лінія на тому ж малюнку не наскільки точно відділяє наші групи успішних і не успішних екзаменів, але вона є простішою і відповідно не такою чутливою до винятків у даних. В екстремальному випадку функція, яка просто матиме перелік всіх, хто здав і хто не здав екзамен, буде дуже точно відображати наші вхідні дані, але приноситиме нульову користь на нових, не відомих їй результатах.

Функцію, яку машина буде писати під конкретну задачу, будемо називати модель.

Моделі

Оскільки функція (модель) передбачає провал на екзамені, результат Правда (True) означає, що ми передбачаємо провал, і навпаки, Неправда (False) означає, що вона передбачає успішно зданий екзамен. Надалі ми абстрагуємося від екзаменів і будемо називати записи відповіді позитивниминегативними. При застосуванні та оцінювані моделі ми будемо пам’ятати, що означає «позитивний» в нашому випадку. Метрика точність (accuracy) не залежить від того, що ми називаємо позитивним, а що — негативним, тому що ми рахуємо кількість правильних передбачень.

Тепер саме питання: як могла б виглядати така модель-функція з середини, враховуючи, що писати і читати її буде машина, а не людина. Ми, звичайно, можемо представляти її програмним кодом на довільній мові програмування, але перебір різних варіантів машиною буде значно ускладнений.

Розглянемо наступний приклад, для простоти запису якого приймемо Х1 = бали за перший тест, Х2 = бали за другий тест. Наша функція виглядатиме так: F(X1, X2: number) => Y: boolean — приймаємо два чисельні аргументи і повертаємо булевий результат. Цю функцію вище ми називали predict_exam_failure().

Для прикладу розглянемо одну з попередніх реалізацій нашої функції:

 F(X1, X2) => 0.6 * X1 + 1.4 * X2 < 100

Виділені константи 0.6 та 1.4 наша машина і буде підбирати. Ми будемо називати їх параметрами моделі і позначатимемо W1 і W2, а Х1 і X2 — це властивості даних. Y — вихідна властивість моделі. Модель зазвичай має більше, ніж дві вхідні властивості, узагальнений запис функції-моделі виглядає так: F(X1, X2, ... Xn) => Y. Звернемо увагу, що реалізація цієї функції з нашого прикладу матиме N параметрів — W1, W2, ... Wn. Такі моделі називають лінійними. Є багато інших способів зображати моделі, які ми опишемо в наступній статті, якщо буде до них інтерес :)

Для того, щоб оцінювати точність функції, ми додамо модель як вхідний параметр (не плутати з параметрами моделі) у наш метод для обрахунку точності, а вхідний параметр students перейменуємо в data для універсальності:

def calculate_accuracy(students, model_func):

Реалізація її залишається такою ж, як вище.

Тренування моделі

У найпростішому варіанті машинного навчання ми будемо використовувати код, який перебере багато різних параметрів і поверне той набір, для яких наша функція демонструє найбільшу точність. Цей процес називають тренуванням (training) моделі. Алгоритм тренування відповідно учителем чи тренером (trainer). Цей код реалізовує тренера для нашого методу повного перебору:

def brute_force_train(data, min_w, max_w, train_step):
  best_model = None
  best_accuracy = 0
  w1 = min_w
  while w1 <= max_w:
    w2 = min_w
    while w2 <= max_w:
      model = lambda datum: w1 * datum[0] + w2 * datum[1]
      accuracy = calculate_accuracy(data, model)
      if accuracy > best_accuracy:
        best_model = model; best_accuracy = accuracy
      w2 += train_step
    w1 += train_step
  return best_model

На практиці такий спосіб не використовується через його надмірну ресурсоємкість, i існує багато інших набагато більш оптимальних алгоритмів, які ми залишимо для наступних статей.

Параметри min_w, max_w, train_step функції brute_force_train називаються метапараметрами (hyperparameters). Набір параметрів залежить від тренера (алгоритму навчання), і їх вказують ті, хто тренує модель. На противагу параметрам W, які власне тренер сам і підбирає.

Вище ми згадували, що спосіб, яким ми рахуємо точність, буде схиляти алгоритм навчання до вибору тої моделі-функції, яка зможе найкраще запам’ятати всі записи з наших вхідних даних (списку всіх студентів у нашому випадку). В екстремальному випадку модель просто пам’ятатиме всіх студентів і їхню успішність поіменно — буде перенавчатися. Ця проблема не залежить ні від від типу моделі, ні від алгоритму тренера, хоча сама можливість перенавчання залежить від типу моделі.

Способи боротьби з перенавчанням залежать від алгоритму і полягають у правильних значеннях метапараметрів тренера. На практиці оцінка моделі не проводиться на тих же вхідних даних, які використовувалися для тренування моделі. 10-20% усіх доступних даних відділимо в окремий набір і назвемо набором для оцінки. Інших 10-20% ми винесемо в набір для ратифікації, а 60-80%, які залишаться, «віддамо» тренеру. За яким принципом розділяти дані — залежить від даних і задачі. Випадкова вибірка часто є хорошим методом, якщо вхідні записи незалежні один від одного і немає сильного дисбалансу між кількістю позитивних і негативних записів.

Інтуїтивно аналогія тут така ж, як і з навчанням в університеті: викладач розв’язує одні задачі зі студентами на парах, а інші, але схожі задачі, дає на екзамені. Тут важливим є (і в навчанні студентів, і моделей) те, що ці задачі рiзноманiтнi, i студенти не можуть просто запам’ятати відповіді, а ті, хто засвоїли матеріал (схожі задачі) зможуть повторити хід думок і відповісти правильно.

У машинному навчанні ми розділяємо два окремі набори: набір для оцінки ми використовуватимемо для оцінки кожної моделі, яку тренуватимемо, використовуючи різні підходи, алгоритми і типи моделей, щоб вибрати найкращу з них. Тобто для кожної моделі у нас буде два значення точності — точність на наборі даних для тренування і точність на наборі даних для оцінки. Нормальною є ситуація, коли перша вища за другу, але не значно. Велика різниця вказує на перенавчання.

Призначення набору для ратифікацї ми також розберемо в наступній статті.

Для того, щоб тренер працював успішно, йому необхідна достатня кількість даних. Залежно від складності проблеми — від сотень і тисяч до десятків і сотень тисяч. Більша кількість даних дозволяє будувати точніші і складніші моделі. На практиці — не рідкість набори даних з багатьма сотнями мільйонів записів. Але більш важливими факторами є якість (оскільки некоректні значення вихідної властивості призводять до того, що модель не може знайти різниці між позитивними і негативними записами) і «свіжість» даних (оскільки тренер може знайти в даних закономірності, які застарілі або помінялися, і засмітити цими «знаннями» пам’ять результуючої моделі, що неодмінно повпливає на її передбачення).

Розміри наборів для оцінки (і репрезентативність даних в них) є важливими для статистичної значущості метрик, які рахуються на їх основі. Вище ми використовували точність (accuracy) як спосіб оцінки нашої моделі, і для даної проблеми ця метрика підходить. Але давайте припустимо, що позитивні записи є рідкістю, наприклад, модель передбачає ймовірність рідкісної хвороби і тільки 0,1% усіх записів є позитивними. У такому випадку модель, яка всі записи класифікує як негативні незалежно від їхніх властивостей, матиме точність 99,9% — неймовірну високу для будь-якого способу прийняття рішень. Але, як ми розуміємо, користь такої моделі дуже обмежена :)

Висновки

Тепер ми вже можемо дати і визначення.

Машинне навчання — це застосування алгоритмів для автоматичного знаходження закономірностей в даних і використання їх для прийняття великої кількості однотипних рішень, для яких певний відсоток помилок є допустимими.

У цій статті ми спробували інтуїтивно описати, що собою являє машинне навчання, не заглиблюючись занадтно, оскільки це дуже широка дисципліна. Новачків у машинному навчанні запрошуємо писати в коментарях, про що вам було б цікаво почитати в наступних статтях. Подальші пригоди Колі і Марічки вам цікаві? :)


Читайте наступні статті циклу:

Вступ до Machine Learning: створюємо першу модель
Володар машин. Ставимо завдання машинному навчанню

Все про українське ІТ в телеграмі — підписуйтеся на канал DOU

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному1
LinkedIn

Схожі статті




Найкращі коментарі пропустити

Было б здорово прикрепить еще какой-нибудь список литературы/курсов/статей которые дадут фундаментальные знания и которые можно прочитать даже будучи на нулевом уровне и понять как все работает. Читал «ИИ: современный подход» дает очень классное понимания того что такое вообще ИИ и как его применяют, но без конкретики. Вот хотелось бы что-то такое, но чтобы после прочтения можно было пилить ИИ приложения для решения своих/рабочих задач осознано. Смотрел на курсере курсы Andrew Ng, выглядит сложновато с математической части и матлаб совсем не улыбает.

137 коментарів

Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.

Чудова стаття — продовжуйте!

Вот и новая статья от Володи: dou.ua/...​les/master-of-machines-1

Не забывайте оставлять комментарии.

Дякую! Тепер можна почитати щось далі.

Есть хороший вводный курс на русском, который читает Константин Вячеславович Воронцов
Он есть разной степени свежести на youtube и на coursera. Мне больше понравился курс, проведенный в Школе анализа данных Яндекса, но доступ к нему сейчас заблокирован благодаря нашим высокорозумным законодателям, так что только через vpn

Якщо завдання Івана Івановича визначити скільки він заробить грошей (не важливо здасть чи не здасть кожен конкретний студент), то хіба не краще (обчислювати і) додавати імовірності нездачі екзамену для кожного студента? замість того, щоб додавати кількість студентів, що «імовірно» не здадуть...

Слушне зауваження. Це *може* дати кращу оцінку. Я б спробував і порівняв обидва методи при вирішенні такої задачі.

Я вот не согласен с тем, что AlphaGo (AlphaZero) это больше достижение Machine Learning. Тут больше пиара... AlphaGo это в чистом виде Monte Carlo Tree Search. И в целом большой революцией в MCTS было открытие в 2002-2006 годах формул UCT, UCB. Собственно говоря, именно после применений этих формул сила го-программ скачкообразно выросла.

Ну а роль Machine Learning тут немного более вспомогательная — это часть метода MCTS, которая даёт список ходов кандидатов и позволяет получить вероятности. И которая, в общем-то напрашивается.

«Мальчик в клубе склеил модель» © и не Маричку!

появляется третий смысл этого выражения.

третий смысл

Надо думать походу он таки второй только в вариациях относительно «т.н. ИИ» ))

В клубі анонімних математиків:)

@Володя Штеньович, мені здається тут неправильно вжиті weight coefficients:

Хоча Коля і так знав, що Марічка завалила екзамен через нього, вiн вирішив, що результат першого тесту важливіший, ніж другого, і знову переписав свою формулу:

return (0.6 * student[exam.subject].test1_grade + 1.4 * student[exam.subject].test2_grade)<100

Адже 0.6 буде зменшувати вагу першого тесту, а 1.4 буде збільшувати вагу другого тесту.

Там, наверное, ошибка в тексте, а не в коэффициентах т.к. поправки идут по оценкам Марии, а у неё второй тест важнее первого.

Так, дякую за уважність! Помилка в тексті — правильно буде «результат другого тесту важливіший ніж першого»

Эх люблю учёных! Вот вы понимаете в ИИ а объясните как работает котик и собачка вот в вопросе что собачка бегает за палкой и за фрисби а котик нет? Это во встроенном интеллекте или в днк ошибка какая?

котик бегает за пятнышком лазерной указки, подпрограмма работает с поправкой на размеры догоняемого объекта.

И за мухами с комарами по квартире носится

И собачка бегает за пятнышком (см. петкубе) соотв. в этом месте программы одинаковы а почему?

Собачка же ж приносит а котик нет. Это тренированная модель или предустановленная программа? Если программа предустановленная можно ли получать ИИ сразу готовым по наследству? Соотв. его можно сохранить закодировав в ДНК?

Кот — птица гордая)

Вот-вот а пачиму!? С научной точки зрения устройства и работы нейронной сети.

А я то думал что не увижу никогда на доу нормальной статьи с простым выводом — что машинное обучение сейчас не более чем задача апроксимации данных с минимизацией функции ошибки... :)

для яких певний відсоток помилок є допустимими.
if accuracy > best_accuracy:
best_model = model; best_accuracy = accuracy

эхъ, а потом седые 25-ти летние лиды читают код 20 летних сениоров :)

Максимизация точности === минимизация ошибки.

Спробуйте замінити «помилка» тотожним в даному контексті «неточність». Мені як новачку в МЛ допомогло :)

Мінімізація помилки або максимізація точності відбувається в тренері — функції brute_force_train()

Перепрошую що ми не виправдали ваші очікуванні по формулах:) в контексті даної статті для того щоб зробити її якомога доступнішою помилка = 100% — точність.

В реальному житті це значно складніше. Ми трохи більше заглибимося в наступній статті в те що саме оптимізовує тренер в наступній статті, там є різні варіанти в залежності від наших цілей. Але для того треба ввести ще кілька метрик для моделей

Маєте рацію, якщо б ми передбачали оцінку як числову величину а не «здав» чи «не здав» то ми б брали таку або схожу метрику як помилку. При числових передбаченнях часто застосовується en.wikipedia.org/...​oot-mean-square_deviation але якщо проміжок значень для передбачення душе широкий, RMSE збиває модель з пантелику і перенавчається під великі значення

Ви праві, є багато бізнес-логіки яку ми опустили. Ще він може не «паритися з моделями» і повпливати на видачу балів напряму. Нам всерівно на Івана Івановича — в нас головний герой Коля і ми слідуємо по його невпевнених кроках в машинне навчання:)

Якщо в межах курсової Коля отримає задачу вирахувати «правильний» прохідний бал то він може побудувати кілька різних моделей кожна з яких бінарна і передбачає кількість балів >= X. Ми доберемося і до числових моделей, наразі розлядаємо простіші варіанти

Дякую, написано простими словами та з гумором. Тут питали про корисні ресурси. Окрім канонічного курсу Andrew Ng мені, наприклад, дуже сподобалась ця книга, до неї ще йдуть безкоштовні ipython ноутбуки: github.com/ageron/handson-ml До автора маю питання: на вашу думку, чи є взагалі сенс вивчати і використовувати традиційні моделі ML, бо здається, що їх повністю витіснили нейронні мережі?

чи є взагалі сенс вивчати і використовувати традиційні моделі ML, бо здається, що їх повністю витіснили нейронні мережі?

Чи є сенс вчитися їздити на велосипеді, якщо і так буду мати автівку, коли здам на права ?

Дуже дякую за книгу, виглядає справді цікаво!

На рахунок нейронних мереж — справді є тенденція витіснення ними інших типів моделів, про повне витиснення ще рано говорити. Моя думка — працювати з нейронними мережами складніше, не тільки тому що для них потрібно більше ресурсів а і тому що таку модель тяжче розуміти, складніше управляти процесом тренування, вона має дуже суттєві схильності перенавчатися і гірше узагальнюється.

Наша рекомендація — завжди починат з дерев, Logistic Regression або інших типів моделей які легше розуміти, якщо вони є застосовними до проблеми (скажімо у вас не по відео, аудіо чи картинках треба передбачати). При наявності часу і ресурсів пробувати нейронні мережі і порівнювати. Важливо порівнювати точність на різних наборах даних для оцінки — особливу увагу приділити набору який містить найсвіжіші дані при тренуванні на попередніх. Для нашого прикладу тренувати на попередніх екзаменаційних роках і оцінювати на остайньому.

Нейронки можуть дати трохи кращу точність, але час який треба потратити на них більший, тому для кожної проблеми треба оцінювати потенційний виграш.

А чому серед усіх мов, якими автор володіє, був обраний все-таки Пайтон?

По-перше, Пайтон лаконiчний та найбiльш зрозумiлий починаючим програмiстам. По-друге, особиста преференцiя:)

Найчастіше використовується при вивченні ML, також дуже часто використовується на практиці, для навчання моделей і т.д.

Тому що не R))

Спасибо за прекрасную статью в нужном направлении.
Хотел уточнить это помарки в питон коде или я торможу к вечеру?
В частности:
— неправильный знак «больше» в ’calculate_accuracy()’
— отсутствие self в параметрах,
— реализация ’calculate_accuracy()’ таки чуть поменяется, в случае передачи ей модели, как параметра (нужно будет вызывать эту модель внутри функции).
Спасибо.

Дякую за уважність! Так 1 і 2 це помилки.
На рухунок реалізації

calculate_accuracy()

- перша версія використовує функцію

predict_exam_failure()

яка по суті і є моделю. Далі в розділі «Моделі» є обновленна версія яка приймає функцію як параметр.

Статья супер! Очень хорошее введение в ML!
Если вас интересует тема — рекомендую курс www.coursera.org/learn/machine-learning

С точки зрения реального применения в Швеции уже используются разные модели в продакшене в Spotify, Electrolux, Ericsson, Volvo и во многих других компаниях поменьше. Deep learning это то что сегодня программируют в топ компаниях мира.

Дякую! Курс Ендрю Енга справді класний і дає розуміння основних алгоритмів для машинного навчання, плюс хороші практичні задачі, що з на мою думку є невід’ємною його частиною

что потенциальный ИИ будущего не особо зависит от современных методов машин лернинга

Я тоже так думаю, когда читаю различные новости из сферы ИИ, очень смущало что-то все время, но не знал как это выразить словами))). Выглядит действительно как подбор подходящего варианта из огромного количества заложенных вариантов в память. Что совсем не похоже хотя бы на примитивное мышление.

Это неверно. Брутфорсом тут и не пахнет. В статье, конечно, этого не указано, но подбор параметров — это не перебор от Х до У с шагом 0.000001 =) Конкретно тут применяется gradient descent. И есть вполне конкретная формула для получения следующего числа при «переборе».

а как бы вы смоделировали «интеллектуальное» распознавание? В игре «Угадай мелодию» исполняли несколько нот из известной мелодии — неужели человеческий мозг делает что-то отличное от поиска по индексу?

Ну, человек по какой-то причине упорно пытается смоделировать что-то уже существующее с использованием новых технологий, будь то декоративный подсвечник с электрической лампой, электромобиль с капотом, радиаторной решеткой и фарами на привычных местах или же ИИ который непременно должен заниматься самоосознанием.

То, что мы считаем разумом и отождествляем с самими собой — скорее, просто ограничивающая надстройка над эффективными низкоуровневыми механизмами. Если мы не можем объяснить в деталях, как мы вспомнили о чем-то или, наоборот, забыли — означает, что мы никак не контролируем этот уровень, просто отправили запрос «вспоминай» и ждем, придет что-то на ум или нет. Писали же где-то, что основная масса лобных долей мозга отвечает за контроль над базовыми инстинктами, то есть огромная работа производится ежесекундно только для того, чтоб хомо сапиенс не выхватывал еду из тарелки сидящего рядом с ним сородича (как-то неловко ведь!). В общем, в процессе мышления происходит постоянное метание между скукой и увлеченностью, страхом и агрессией, и, кажется, какой-то результат получается скорее вопреки, чем благодаря.

без подпрограммы, которая должна задействовать имеющиеся системы на основании изначально заложенных факторов (базовое — стремление примитивных организмов двигаться к источнику света, например) — конечно нет!

у Пелевина есть роман «ЗЕНИТНЫЕ КОДЕКСЫ АЛЬ-ЭФЕСБИ», в котором смоделировано собственно это самое самоосознание в виде подпрограммы для дрона, генерирующей целое ток-шоу с произвольными участниками в каждый момент, когда системе беспилотника нужно принять решение стрелять по обнаруженной цели. По-моему, достаточно близко к поставленной задаче — заниматься построением модели мира и созданием образов на ее основании с целью распознать команду, содержащуюся в процитанном тексте и переслать наконец два байта куда надо.

ой ли? А есть ли свобода выбора у «разумного существа»? Насколько я помню, психологи в большинстве случаев занимаются поиском и топорным исправлением багов в духе «это вы неправильно все восприняли в детстве и теперь своими действиями пытаетесь что-то доказать». Принятие решения для человека — не более чем визуализация колебания стрелки весов, пока на обе чаши давят механизмы, работающие на низком уровне и сформированные вследствие предыдущего опыта. Собственно, к этому придет компьютерная программа в процессе оптимизации — некоторые этапы брутфорса можно будет подменить сгенерированными данными, которые и так чаще всего выпадают

Способности обучаться, строить логические выводы и переживать некоторые «высокие чувства» заложены в нас изначально, более того — мы умеем показать пальцем на «странного» человека и предположить, что именно у него «сломано». Ровно так же в искусственную систему можно заложить возможность конфигурировать имеющиеся модули и достраивать новые — до определенного предела.

Мне кажется, «искусственное прививание» чего либо связано с тем, что мы не хотим ждать вечность, пока генератор случайных чисел выдаст нам код компилятора, который начнет трансформировать очередные последовательности обратно в машинный код и пытаться его выполнить — это бесконечно далеко от поставленной задачи. Поэтому мы и идем «напрямик» — зачем нам страдающий осознанный раб, которого надо бить палкой, если конструкция с электродвигателем и «бездушной программой» ровно так же эффективно переместит для нас грузы из одной точки в другую? Конечно, у нее не возникнет из ниоткуда идеи предложить варить нам кофе вместо утомительного физического труда — ибо для нее нет самого понятия труда, усталости или напитка, влияющего на способность более эффективно управлять своими механизмами. Все это возникло в результате следования базовому инстинкту живого существа — выжить, произвести потомство, обеспечить его выживание. Темы о том, много или мало 120к в Ванкувере — суть попытки определиться, хорошо ли получается выживать в данный момент и есть ли возможность выживать как-нибудь эффективнее.

реализовать на данном этапе невозможно, так же как и невозможно было 100 лет тому назад (несмотря на все достижения цивилизации) симулировать реальность на уровне современных консольных видеоигр, в которых, как всем известно, графика-мыльцо, да и грабежи корованов далеко не всегда предусмотрены создателями.

ну и реализовывать аналог человеческого мышления — задача похвальная, но совершенно неактуальная на данный момент, просто так уж устроен человек, что пытается воссоздать что-нибудь уже существующее, пока его поделкам случайно не найдется другое применение. Все на основании доброй воли, с полной свободой выбора и кристально чистым осознанием происходящего, конечно же.

А может потому, что человека вечно тянет совершить ненужное — с кем-нибудь себя сравнить?

Мне кажется, чуть сложнее, психологи не дают оценочных суждений, что одному хорошо, другому — чужой навязанный шаблон и сублимация. Опыт, фантазия и эмпатия формируют нашу интуицию. Как научить фантазировать, подставлять изначально некорректные условия для достижения желаемого в итоге, как научить иметь желаемое. Ну про эмпатию — это вообще, в эстественной бы разобраться количественно. :) Нам не нужно учиться, что будет завтра (или не будет), а вот как это базовое ощущение алгоритмизировать?

Всё-таки градиентный спуск чаще...

Тогда все методы, где пробуется больше одного варианта — брутфорс :) Всё-таки брутфорс в моём понимании подразумевает точное решение задачи путём перебора всех вариантов.

Основные положения метода Brutte force (из wiki):
1) Доказательство возможности исчерпания всех состояний системы. Требуется показать, что любое конкретное состояние системы (например, значение доказываемого логического выражения) соответствует хотя бы одному из рассматриваемых кандидатов в решения.
2) Проверка каждого варианта и доказательство того, что рассматриваемый вариант является или не является решением поставленной задачи.

В крестика-ноликах можно перебрать все варианты. А вот недавно строил эндшпильные таблицы для окончаний в русских шашках, до шести шашек включительно перебрал все варианты. От задачи зависит.

В задачах с бесконечным количеством вариантов, применять брутфорс некорректно :)

Мышление это часто хорошо формализуемый процесс, а ИИ это больше реализация безсознательных процессов. Например, возьмём в качестве примера шахматы. Человек считает варианты, и может запрограммировать этот счёт. Это мышление. А вот относится ли к мышлению те хода, которые приходят в голову? Глядя на позицию у меня сразу же возникает несколько ходов-кандидатов. Откуда они беруться? Я этого не могу сказать. Они просто вспывают в сознании (из опыта, из ещё чего-нить). И большая сложность была формализовать эти правила, по которым этот ход сто́ит смотреть, а этот ход не сто́ит. Ботвинник пытался, но потерпел неудачу.

Ну и, конечно, представление знаний (Khowlange Representation, KR) тоже достаточно нетривиальная задача.

У новичков скорее всего таки перебор, у опытных людей — похоже ,что «искусство», основанное на опыте. Настоящей теоретической базы крайне мало и она ограничена. Но это все со слов «людей, знающих людей», кто ж его знает,что там в секретных подвалах

Дякую, радий що Вам сподобалася Марічка:) Якщо коротко то не банальний і не брутфорс. Я в статті спростив проблему до 2 вхідних сигналів і кількох прикладів даних для простоти розуміння. Її і брутфорсом можна вирішити, а можна і без моделі кусок коду написати.

В реальності при застосуванні машинного навчання ми працюємо з величезними наборами даних — скажімо 10,000 вхідних сигналів, деякі з яких мають мільйони значень і проблема достатньо складна щоб для тренування моделі потрібно було закинути всі доступні дані — скажімо сотні мільйонів або навіть мільярдів рядків. Скільки часу займе вирішення повним перебором навіть якщо у вас в розпорядженні всі обчислювальні ресурси планети?

Стаття виключно по машинному навчанні. Я тему штучного інтелекту зачепив якраз для того щоб відділити його від машинного навчання і сфокусувати на остайньому.

Якщо Ви розумієте як працюють алгоритми машинного навчання їх можна і брутфорсом називати і ворожінням на відбитках ліній магічних ідентифікаторів:) Ця стаття для людей які мають нуль або мало досвіду з машинним навчанням і я не переконаний що для таке спрощення полегшить розуміння чи сприйняття сутностей і підходів. Буду радий почути будь-які ідеї як донести принципи роботи МЛ доступним способом.

1) в МЛ брутфорса нет и близко. в частности, для линейной регрессии (модель из поста) есть решение в замкнутом виде — пара операций над матрицами и все.

2) НЛП это 80% МЛ и 20% feature engineering. ИИ там и в помине нету.

и вообще,

3) нет никакого ИИ, это все хайп для обывателей. раньше вон экспертные системы называли ИИ, потом статистические модели, теперь дип лернинг, а завтра еще что-нибудь придумают. так что давайте обсуждать алгоритмы и математику, а термин ИИ оставим журналистам и любителям понадувать щеки.

приведи пример брутфорса именно в МЛ (т.е. model selection / hyperparameter tuning не считается)

да ну, кам он. сейчас, скорее, ML for combinatorial optimization чем наоборот.

Глобальный минимум часто соответствует переобучению в DL. Часто мы просто идём по градиенту, а останавливаемся когда начинает расти ошибка обобщения.

1 Чи така реалізація calculate_accuracy еквівалентна градієнтному спуску методом найменших квадратів?

ви хотіли сказати — найменші квадрати методом градієнтного спуску? ні, це не воно. в градієнтному спуску ми на кожній ітерації обчислюємо похідну від нашої оцінної функції, і потім підправляємо параметри моделі, враховуючи цей градієнт.

2 Чим отакий, з бухти-барахти вибір метрики кращий за брутфорс?

оцінка точності, в загальному випадку, не має ніякого відношення до власне моделі. скажімо, перед сесією два студенти побилися об заклад, хто точніше передбачить результати іспиту. вони надрукували прізвища студентів, і навпроти кожного прізвища написали свій прогноз: здасть чи ні. питання: як визначити переможця? тобто, яку метрику використовувати для порівняння прогнозу з результатом? чи є вибір такої метрики «з бухти-барахти»? це я до того, що таких метрик не так вже і багато, вони мають зрозумілу семантику, і метрика, яку оптимізували в моделі, може, в загальному випадку, відрізнятися від метрики, за якою буде оцінюватися результат.

Супер! Чекаю продовження!

Дуже цікаво. Продовжуйте. Як тут вже писали — список літератури (не дуже складної) не помішав би

Дякую! Додаючи до моєї відповіді нижче — мені потрібно краще розуміти яка Ваша ціль? Які проблеми ви б хотіли вирішувати?

Ціль — цікаво те що зараз, як хтось писав, — main stream :). Я працюю в тестуванні тому можливо якісь проблеми якості можна вирішити? Як machine learning тестують та чи взагалі тестують ?

Розділю відповідь на дві:

1. МЛ в тестуванні можна використовувати. Приклад — передбачити що конкретна зміна коду приведе до помилки (тестувальник напише багу).

2. Тестування МЛ — одну частину ми трохи зачепили — це оцінка якості моделі. Точність це не дуже хороша метрика але її просто пояснити, в наступній статті подивимося глибше. Тестування результатів роботи МЛ є занадто широким щоб відповідати в коментарі. Якщо можете напишіть конкретніше як ви його використовуєте і я спробую щось запропонувати.

Очень веселая статья) Можно с помощью нее школьников агитировать идти в Data science, им в таком формате зайдет.
Возможно не совсем по теме, но хочу обратиться к вам за советом. Я стремлюсь войти в сферу Data science и ML, частично получила базу в университете, что-то почерпнула на стажировке + онлайн курсы. Проблема заключается в том, что основа у меня есть, могу реализовать основные задачи (кластеризация, классификация, анализ временных рядов) преимущественно в R, также параллельно изучаю Python. Проблема в том, что не совсем понятно, как дальше развиваться, так как курсы уже ничего особо нового не дают, нюансов не раскрывают, но в Data science по-прежнему не берут :(
Может быть вы как опытный специалист сможете что-то посоветовать, более продвинутые источники, поделитесь, с чего вы сами (или ваши коллеги) начинали? Заранее вам спасибо)

Если не берут в Data Science, а хочется, то нужно идти либо в Data, либо в Science. Еще одна прочитанная книжка вряд ли поможет, да и читать ее лучше, уже имея доступ к Data

З того що Ви описали, мені видається що варто шукати складніші практичні проблеми і їх вирішувати. Я не рекомендую далі насідати на курси.
Подивіться, які цікаві проблеми над якими не працює ніхто в межах Вашого проекту спробуйте їх вирішити і зробити прототип для команди. Це може означати придумати трохи штучну проблему. Будьте готові до того що перших N рішень будуть нікому не потрібні — в процесі Ви наберетеся того досвіду який не дадуть Вам курси і буде чіткіше видно що варто вчити далі.

Есть еще Kaggle, где можно участвовать в разных конкурсах, предлагая свои решения разных ML задач.

Было б здорово прикрепить еще какой-нибудь список литературы/курсов/статей которые дадут фундаментальные знания и которые можно прочитать даже будучи на нулевом уровне и понять как все работает. Читал «ИИ: современный подход» дает очень классное понимания того что такое вообще ИИ и как его применяют, но без конкретики. Вот хотелось бы что-то такое, но чтобы после прочтения можно было пилить ИИ приложения для решения своих/рабочих задач осознано. Смотрел на курсере курсы Andrew Ng, выглядит сложновато с математической части и матлаб совсем не улыбает.

ВУЗовский (или даже школьный) предмет называется «Математическая статистика». Плюс методы оптимизации и численные методы. Правда, просто?

Если вы отвечали на мою просьбу:

список литературы/курсов/статей которые дадут фундаментальные знания и которые можно прочитать даже будучи на нулевом уровне и понять как все работает

То это не совсем то что я хотел услышать =) Но спасибо за ответ ;)

Верно, отвечал на вопрос о базовых знаниях и курсах. Статистика позволит понять, что нужно подогнать многочлен под значения функции (для примера с предсказанием), численные методы — как это сделать, методы оптимизации — взглянуть на алгоритм со стороны и направить его по нужному пути или лучше воспользоваться его результатами.

Спасибо, что пояснили. Так мне понятнее. Наверное именно из-за отсутствия такой математической базы я и испытываю недопонимание происходящего. Был бы благодарен, если бы еще посоветовали план и материал по которому можно изучить математическую базу, которая пригодится в МЛ.

Линейная алгебра, теория вероятностей, математическая статистика, численные методы.
С другой стороны не могу сказать, что нужно хорошо ориентироваться в предмете, хватит и обзорного представления. И часто в книгах по ML это представление даёться в начале.

С другой стороны потратить полгода на изучение математики в основе немного грустно и демотивирует. ИМХО, лучше сочетать. Опять же, не у всех будет интерес создавать свои подходы. Многим надо просто решить задачу :)

Курси Ендрю Енга я насправді і рекомендую:) Причини наступні — 1) в книжках, як правило, теорії алгоритмів ще більше і пояснюються вони сухіше. 2) Ендрю Енг дає практичні задачі посильні для людей взагалі без досвіду. На цих задачах я і пропонуюю сфокусуватися.

Ось джерела:
www.youtube.com/...​msIIuiBfYad6rFYQU_jL2ryal
developers.google.com/...​ne-learning/crash-course

Очікування також доведеться занизити — «зрозуміти як все працює» і отримати фундаментальні знання по книжках не вийде — галузь занадто широка. Якщо можна сформулюйте чіткіше чого б хотілося досягнути і я спробую дати конкретнішу відповідь.

Спасибо за ответ. Тогда действительно подучу математику и попробую пройти курс еще раз. Наверное на данном этапе это все что мне нужно.

Могу сказать со своего личного опыта. Машинное обучение было одним из курсов по специализации, которую я проходил на курсере. Всё что знал до этого — основы программирования на Python, немного javascript + основы descriptive & inferential statistics. В целом, идея была ясна. Взял данные, подключил библиотеки, определил параметры в функциях — получил результат. Но, когда стал вопрос о построении своих моделей, моментально понимаешь, что взять и понять почему поиск оптимальных весов для линейной регресси происходит через градиентный спуск просто так не получиться — нужен Calculus. После того как прошел курс single-variable & multivariable Calculus на Khan Academy, начинаешь задумываться о вероятностных моделях и попадаешь в мир Probability Theory. И вот когда ты уже почти догрёб до конца, очень важно еще немного углубиться в linear algebra.

Завжди, чогось, курс Ng сприймався як такий, де математика максимально спрощена: треба лише вміти брати похідну і множити матриці — це навіть в школі проходять.

А matlab — то згоден ... багато хотіли б python.

Можливо, ... в матлаба, як мови, є сильні сторони (робота з матрицями) і слабкі сторони (практично все інше).
Але тут справа в тому, що зручність — річ зовсім другорядна.
Важливим є кількість реалізованих ліб/прикладів/рішень готових.
А тут python виграє з великим відривом.
В матлаба — більшість від розробників, в python — в основному OpenSource.

Гудфеллоу и ко, «Глубокое обучение» Первые две части читаются легко и дают хорошее базовое обзорное понимание предмета. Собственно говоря, при чтении этой статьи постоянно ловил себя на мысле на том, что в книге это было объяснено куда понятнее. Третья часть более специфическая, и, скорее даже, справочная. Материал сложнее, разбираться в нём надо больше, всё вряд-ли пригодится. Но безусловно будет полезна, если работать над конкретной проблемой.

Спасибо, обращу внимание.

Підписатись на коментарі