Штучний інтелект в Wolfram Language: проект по ідентифікації зображень

Переклад поста Стівена Вольфраму (Stephen Wolfram) "Wolfram Language Artificial Intelligence: The Image Identification Project".
Висловлюю величезну подяку Кирилу Гузенко за допомогу в перекладі.


«Що намальовано на цій картинці?» Люди практично відразу можуть відповісти на це питання, і раніше здавалося, що це непосильне завдання для комп'ютерів. Останні 40 років я знав, що комп'ютери навчаться вирішувати подібні завдання, але не знав, коли це станеться.

Я створював системи, які дають комп'ютерів різні складові інтелекту, і ці складові найчастіше далеко за межами людських можливостей. З давніх про ми інтегруємо розробки з штучного інтелекту в Wolfram Language.

І зараз я дуже радий повідомити про те, що ми перейшли новий рубіж: вийшла нова функція Wolfram Language — ImageIdentify, яку можна спитати — «що зображено на картинці?» і отримати відповідь.

Сьогодні ми запускаємо Wolfram Language Image Identification Project — проект з ідентифікації зображень, який працює через інтернет. Можна відправити туди зображення з камери телефону, з браузера, або перетягнути його за допомогою drag&drop у відповідну форму, або просто завантажити файл. Після цього ImageIdentify видасть свій результат:

Give the Wolfram Language Image Identify Project a picture, and it uses the language's ImageIdentify function to identify it
Зміст
Тепер в Wolfram Language
Особиста передісторія
Машинне навчання
Все це пов'язано з аттракторами
Автоматично створені програми
Чому зараз?
Бачу тільки капелюх
Ми втратили мурахоїдів!
Назад до природи

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

Це хороший практичний приклад штучного інтелекту. Однак для мене важливий момент полягає в тому, що подібна взаємодія з штучним інтелектом ми вбудовуємо безпосередньо в Wolfram Language — ще один потужний камінь фундаменту парадигми програмування, заснованої на знаннях.

Тепер в Wolfram Language
Для того, щоб розпізнати якесь зображення при роботі з Wolfram Language, Вам потрібно просто застосувати функцію ImageIdentify зображення:

In[1]:= ImageIdentify[image:giant anteater]

На виході Ви отримуєте деякий символьний об'єкт, з яким можна і далі працювати в Wolfram Language. Як в даному прикладі — з'ясувати, що це саме тварина, ссавець і так далі. Або просто запитати визначення:

In[2]:= giant anteater ["Definition"]

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

In[3]:= WordCloud[DeleteStopwords[WikipediaData[giant anteater]]]

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

За допомогою функції ImageIdentify, вбудованих безпосередньо в Wolfram Language, дуже легко створювати якісь API, додатки, в яких це використовується. А за допомогою Wolfram Cloud дуже легко створювати сайти — як, приміром, сайт Wolfram Language Image Identification Project.

Особиста передісторія
Особисто я дуже довго чекав ImageIdentify. Десь 40 років тому я читав книгу під назвою The Computer and the Brain, яку пронизувала думка — рано чи пізно ми створимо штучний інтелект, швидше за все емулюючи електричні зв'язки в мозку. І в 1980-му році, після того, як я досяг деяких успіхів моїм першим комп'ютерним мовою, я почав роздумувати про те, що потрібно зробити для того, щоб створити повноцінний штучний інтелект.

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

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

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

в якийсь момент я усвідомив, що як нейронні мережі, так і самопритягивающиеся скупчення частинок є прикладами систем, які хоч і мали прості базові компоненти, але чомусь домоглися складного колективного поведінки. Копаючи глибше, я дійшов до клітинних автоматів, що привело мене до всіх тих ідей і відкриттів, які вилилися в книгу A New Kind of Science.

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

Some of my early work on neural networks--from 1983...

Історія нейронних мереж була пов'язана з низкою зльотів і падінь. Мережі раптово з'являються в 1940-е. Однак до 60-х років інтерес до них знизився, і ходило думка про те, що вони досить-таки марні і з їх допомогою мало чого можна зробити.

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

І мені здавалося, що нейронні мережі — занадто складні формальні системи; як-то я навіть спробував розробити свою власну альтернативу. Проте я все ще підтримував людей в науковому центрі дослідження нейронних мереж і включав їх статті в свій журнал Complex Systems.

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

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

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

Я спочатку не був упевнений, що це буде працювати. Але все працює, і дуже добре.

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

In[4]:= Classify["Language", {"欢迎光临", "Welcome", "Bienvenue", "Ласкаво просимо", "Bienvenidos"}]

In[5]:= Classify["CountryFlag", {images:flags}]

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

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

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

Є безліч різних систем з подібним "аттракторным" поведінкою. В якості прикладу з фізичного світу можна привести схил гори. Краплі дощу можуть впасти на яку завгодно частину гори, але (принаймні, в ідеальній моделі) вони будуть стікати вниз до максимально низькорозташованим точкам. Краплі, які знаходяться поруч, будуть прагнути до одних і тих же точках. Далеко розташовані один від одного краплі будуть текти до різних точок.

In a mountainscape, water flows to different lowest points depending on where it falls on the terrain

Краплі дощу — вони як зображення, а точки підніжжя гори — як види об'єктів. Під краплями дощу ми маємо на увазі деякі фізичні об'єкти, які рухаються під дією гравітації. Однак зображення складається з пікселів. І замість фізичного руху ми повинні думати про те, як ці цифрові значення повинні бути оброблені програмою.

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

Cellular автоматів with different initial states same but final states. Like rain on a mountainscape, initial cells can "fall" in any of many different places and wind up in the same final position.

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

A lot of image processing can be--and is--done with cellular автоматів

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

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

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

Cellular автоматів can be used for a kind of iterative sculpting

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

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

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

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

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

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

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

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

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

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

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

When we gave it a picture of Indiana Jones, it zeroed in on the hat

Ймовірно, як і у мозку, у нейронної мережі ImageIdentify є безліч шарів, які містять нейрони різних типів (загальна структура, звичайно, добре описана символьним поданням Wolfram Language).

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

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

Ми втратили мурахоїдів!
Як і в безлічі інших проектів для Wolfram Language, при створенні ImageIdentify нам потрібно займатися безліччю різних речей. Робота з великою кількістю навчальних зображень. Розробка онтології які візуалізуються об'єктів і перенесення її на Wolfram Language. Аналіз динаміки нейронних мереж з використанням методів, які застосовуються у фізиці. Копітка оптимізація паралельного коду. Навіть деякі дослідження в стилі A New Kind of Science для програм обчислювального світу. І безліч суб'єктивних думок про те, як привносити функціональність, яка була б корисною на практиці.

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

Але залишилося ще велика кількість невирішених проблем. Система добре справлялася з одними речами, але серйозно буксувала в інших. Ми щось міняли, щось налаштовували, а потім були нові невдачі і шквал повідомлень в стилі «ми знову втратили мурахоїда!» (про те, як ті зображення, які ImageIdentify використовував для коректного розпізнавання мурахоїдів, розпізнавалися чомусь як щось абсолютно інше).

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

Бували і речі, які на перший погляд здавалися абсолютно божевільними. Свиня, яка идентифицировалась як упряж. Шматок кам'яної кладки визначався як мопед. Але хороша новина полягала в тому, що ми завжди знаходили причину — наприклад те, що деякі нерелевантні об'єкти постійно опинялися на навчальних зображеннях (єдині кам'яні кладки, що бачив ImageIdentify — азіатські, на тлі яких постійно були мопеди).

Щоб випробувати систему, я часто пробував нестандартні зображення:

Unexpected images often gave unexpected results

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

Що щодо абстрактного мистецтва? Це щось на кшталт тесту Роршака як для машин, так і для людей — дуже цікаве уявлення про риси ImageIdentify.

Abstract art gets fascinating interpretations, sort of like Rorschach-blot interpretations from humans

Назад до природи
Такі проекти, як створення ImageIdentify, ніколи не закінчуються. Але пару місяців тому (див. статтю на Хабрахабре "Стівен Вольфрам: Рубежі обчислювального мислення (звіт з фестивалю SXSW)") ми випустили попередню версію на Wolfram Language. І сьогодні ми випустили нову версію і використовували її як основу для Wolfram Language Image Identification Project.

Ми продовжимо навчання і розробку ImageIdentify, особливо зосередившись на зворотному зв'язку і статистикою з сайту. Як для Wolfram|Alpha в сфері розуміння природної мови, без активного використання людьми немає ніякої можливості реально оцінити прогрес, або навіть визначити, якими повинні бути цілі для розпізнавання реальних зображень.

Повинен сказати, що я знаходжу веселим заняттям навіть просто пограти з Wolfram Language Image Identification Project. Це розбурхує — бачити, як після довгих років роботи вийшов штучний інтелект, який і справді працює. Більше того, коли Ви бачите, що ImageIdentify відповідає на незвичайне або складне зображення, виникає таке відчуття, ніби це людина робить припущення, або просто жартує.

Some of ImageIdentify's errors are quite funny

Під капотом всього цього, звичайно, просто код, з досить простими циклами. Цей код майже такий же, як той, який я, наприклад, писав для своїх нейронних мереж у вісімдесяті (звичайно, зараз це код на Wolfram Language, а не на низкоуровневом C).

Це дуже незвичайний приклад з історії ідей — нейронні мережі досліджуються більше сімдесяти років, однак інтерес до них неодноразово згасав. Нейронні мережі для нас — те, що привело нас до успіху у вирішенні такої зразкової завдання штучного інтелекту, як розпізнавання зображень. Вважаю, що такі передовики в дослідженні нейронних мереж, як Уоррен Мак-Каллок і Уолтер Піттс кілька здивувалися б того, що робить ядро Wolfram Language Image Identification Project. Ймовірно, вони були б вражені, що для цього знадобилося аж 70 років.

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

Що стосується поточного моменту, то я сподіваюся, що Вам сподобається Wolfram Language Image Identification Project. Розглядайте його як про свято досягнення нових рубежів штучного інтелекту. Розглядайте його як відпочинок для розуму, що навіває думки про майбутнє штучного інтелекту. Але не варто забувати найбільш, на мій погляд, важливе: це так само і прикладна технологія, яку Ви можете використовувати тут і зараз Wolfram Language і вивантажувати туди, куди тільки побажаєте.

Наостанок від команди Блогу Wolfram...

Одного разу потрапивши на Хабрахабр, захворієш їм в хорошому сенсі цього слова і ImageIdentify здається знає чому.



Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.