Три теми поспіль ми розбирали архітектури — AlexNet і VGG, ResNet, Inception і MobileNet. У них різні ідеї, різна вартість і різні роки, але одна спільна умова, яку ми жодного разу не назвали вголос: кожна з них училася на розмічених даних. Хтось узяв мільйон двісті тисяч фотографій і поставив біля кожної слово. Ця тема — про те, що робити, коли такого «когось» немає.
ЦінаСкільки коштує одна мітка
Тема 02 вже рахувала цю ціну в секундах. Нагадаємо числа, бо саме з них росте вся тема: 3 секунди на одну мітку класу, 15 секунд на рамку навколо предмета, 3 хвилини на маску предмета, годину на повну маску сцени. Сто фотографій із простою класифікацією — пʼять хвилин роботи: 100 × 3 с = 300 секунд. Ті самі сто фотографій із масками предметів, а предметів у кадрі зазвичай не один — при двох це вже 100 × 2 × 180 с = 36 000 секунд, тобто десять годин.
Помножимо це на реальний масштаб. Мільйон зображень із однією міткою кожне — це 833 години, або чотири місяці роботи однієї людини по сім годин щодня без вихідних. І це найдешевший тип розмітки з усіх.
Тепер погляньмо з іншого боку. Непозначених зображень у світі на порядки більше. Камера спостереження знімає цілодобово. Мікроскоп у лабораторії дає знімки щодня. Супутник фотографує ту саму ділянку раз на кілька днів. Виробнича лінія знімає кожну деталь. У всіх цих випадках зображень мільйони, а міток нема жодної — і не буде, бо ставити їх мусить людина, яка вміє читати такі знімки.
Тема 12 дала один вихід: взяти чуже передтреноване тіло й донавчити голову. Механіку ти вже знаєш — тіло і голова, заморожування, лінійна проба, донавчання. Але вона мовчазно припускала, що десь є ImageNet із його міткою на кожному зображенні. Питання цієї теми інше: звідки взяти передтреноване тіло, якщо міток немає взагалі й ніде.
ІдеяВигадати задачу з самих даних
Ідея на диво проста, і сформулювати її можна одним реченням: якщо мітку не може дати людина, хай її дасть саме зображення.
Ось як це виглядає. Візьми фотографію. Поверни її на 90 градусів. Тепер у тебе є пара «зображення → відповідь», і відповідь ти знаєш точно, бо сам щойно її і зробив: 90 градусів. Жодна людина в цьому не брала участі. Повтори мільйон разів — і в тебе мільйон навчальних пар.
Задача, яку ми в такий спосіб вигадали, зветься привід (англійською pretext task — «задача-привід», «задача для приводу»). Слово влучне: відповідь на неї нікому не потрібна. Нікому в світі не цікаво, на скільки градусів повернуто фотографію, — та й обертали її ми самі. Потрібне інше: щоб дорогою до відповіді мережа мусила навчитися дивитися.
Уся конструкція зветься самонаглядовим навчанням (self-supervised learning). Назва підкреслює, чим воно не є. Це не навчання без учителя — учитель тут є, і він суворий. Просто його роль виконує не людина, а сама операція над даними.
Далі схема така сама, як у темі 12. Навчили тіло на приводі — викинули голову приводу — поставили нову голову під справжню задачу — навчили її на тих небагатьох мітках, які все-таки є. Різниця лише в тому, звідки взялося тіло: не з чужого ImageNet, а з наших власних непозначених даних.
ПриводиЩо пробували вигадувати
За десять років приводів вигадали десятки. Ось пʼять, які варто знати, — кожен по одному абзацу.
Поворот. Повернути зображення на 0°, 90°, 180° або 270° і вгадати кут. Задача з чотирма відповідями. Розрахунок такий: щоб зрозуміти, де в кота верх, треба знати, як виглядає кіт. Привід простий у реалізації й став найпопулярнішим навчальним прикладом.
Пазл. Порізати зображення на девʼять патчів, перемішати й вимагати назвати перестановку. Тут мережа мусить розуміти, що ніс буває над ротом, а колесо під кузовом, — тобто вивчити взаємне розташування частин.
Розфарбовування. Перевести кольорове фото в сіре, показати мережі сіре й вимагати повернути колір. Мітка — оригінальні кольори, і вона безкоштовна для будь-якого кольорового знімка. Щоб пофарбувати правильно, треба впізнати предмет: трава зелена, шкіра тілесна, небо синє.
Домальовування закритої ділянки. Вирізати з фото шматок і вимагати відновити те, що там було. Мітка — самий вирізаний шматок. Ця ідея пізніше виросла в маскований автоенкодер, про який мова в розділі 10.
Взаємне розташування. Показати два патчі одного зображення й питати, як другий розташований відносно першого: вище, праворуч, по діагоналі. Той самий сюжет, що в пазлі, тільки дешевший.
Список привабливий, і легко подумати, що вигадування приводу — вправа на винахідливість: чим хитріше, тим краще. Це найпоширеніша й найдорожча помилка теми. У приводу є дві жорсткі вимоги, і обидві перевіряються числом ще до того, як ти напишеш перший рядок коду навчання.
Вимога першаПривід має бути розвʼязний
Вимога звучить банально: у задачі має бути правильна відповідь. Перевіряють її майже ніколи — привід беруть із чужої статті й запускають. Подивимось, що з цього виходить на наших фігурах.
Наскрізний приклад теми той самий, що в усьому блоці: шість фігур 28×28 — коло, квадрат, ромб, кільце, хрест і трикутник. Здавалося б, ідеальний матеріал для приводу «вгадай поворот». Перевіримо.
Візьми коло й поверни його на 90 градусів. Що вийшло? Те саме коло. Тепер квадрат — теж той самий квадрат. Ромб, кільце, хрест — те саме. З шести фігур лише трикутник при повороті стає іншим.
Чи існує в цієї задачі відповідь
Обери фігуру й привід. Полотно показує всі варіанти, які привід просить розрізнити; однакові позначено. Праворуч — частка фігур, для яких відповідь однозначна.
Порахувати цю частку можна формально й наперед: беремо кожну фігуру, породжуємо всі варіанти, яких вимагає привід, і дивимось, чи є серед них однакові. Ось результат для наших шести фігур:
| привід | розвʼязний для | частка |
|---|---|---|
| поворот 0/90/180/270° | 1 фігури з 6 | 0.167 |
| дзеркало | 0 фігур з 6 | 0.000 |
| квадрант | 6 фігур з 6 | 1.000 |
Це і є та перевірка, яку треба робити першою, а не останньою. Вона коштує десять рядків коду й нуль секунд навчання. Пропустиш — і зʼясуєш те саме через дві години прогону, але вже у вигляді «щось погано вчиться, спробую інший lr».
Вимога другаПривід має вимагати потрібних ознак
Друга вимога тонша, і ламається на ній більше приводів, ніж на першій. Задача може мати відповідь — і при цьому розвʼязуватись дешево, обхідним шляхом, який нічого не вчить.
Повернімось до наших фігур і зробимо чесний експеримент. Візьмемо не ідеальну фігуру по центру, а справжнє зображення з датасету: центр зсунуто на кілька пікселів у випадковий бік, зверху накладено шум. Тепер запитаємо ще раз: чи відрізняється таке зображення від свого повороту на 90°?
Відрізняється. У 100 % випадків. Заміряно: на сирих зображеннях поворот «помітний» із часткою 1.000, а на чистій геометрії фігури — лише 0.167.
Різниця між цими двома числами і є дірка, у яку провалюється привід. Мережа справді зможе вгадувати кут — але не за формою фігури, а за тим, у який бік зсунуто центр і як лягли пікселі шуму. Вона розвʼяже задачу й не навчиться нічого, що знадобиться для розпізнавання фігур.
Це не наша особливість, а типова хвороба приводів, у неї навіть є назва: обхідний розвʼязок (shortcut). Три класичні приклади з реальних робіт:
| привід | обхідний розвʼязок |
|---|---|
| Пазл із девʼяти патчів | патчі ріжуться з однієї картинки, тож сусідні мають однаковий рівень шуму й однакові артефакти стиснення JPEG. Мережа складає пазл за швами, не дивлячись на вміст |
| Взаємне розташування патчів | у багатьох камерах є хроматична аберація: колірна кайма на краях кадру спрямована від центра. По ній видно, у якому куті знімка був патч, — і задача розвʼязується самим кольором кайми |
| Розфарбовування | якщо в наборі переважає один сюжет, вигідно завжди малювати те саме: небо блакитним, низ кадру зеленим. Модель вивчає статистику датасету, а не предмети |
Лікування завжди одне: прибрати те, що дозволяє обійти. Для пазла патчі беруть із проміжками й окремо перетискають кожен, щоб шви не збігалися. Для кайми знебарвлюють краї патчів. У нашому випадку зі зсувом лікування теж є — але воно приводить нас до зовсім іншого приводу, у якому зсув перестає бути підказкою й стає частиною завдання.
Контрастне навчанняНе вгадувати, а зближувати
Приводи, які ми перебирали, влаштовані однаково: мережу просять щось назвати — кут, перестановку, колір. Сучасний підхід відмовився від цього зовсім і робить річ, яка спочатку здається дивною.
Візьми одне зображення. Зіпсуй його двічі по-різному: перший раз зсунь і освітли, другий раз зсунь інакше й додай шуму. Вийшло два види одного предмета. Тепер вимагай від мережі одного: щоб ці два види вона вважала схожими, а види інших зображень — несхожими.
Тут немає жодної назви, яку треба вгадати. Є лише «свій — чужий». Тому підхід і зветься контрастним (contrastive): мережа вчиться протиставляти.
Що псувати, а що ні
Псування — це не косметика. Кожна аугментація — це заява: «ось це міняти можна, предмет від цього не стає іншим». Ми вже говорили про це в темі 10, і там ця заява стосувалася класифікатора. Тут вона стає буквально формулюванням задачі: мережа вчиться не звертати увагу рівно на те, що ти оголосив неістотним.
Тому набір аугментацій для наших фігур такий: зсув на кілька пікселів, яскравість і контраст, додатковий шум. І тому в ньому немає повороту — ми ж щойно порахували, що поворот наших фігур майже не міняє, і вимагати «вважай повернуту фігуру тією самою» означало б вимагати очевидного.
Два види одного предмета
Ліворуч — оригінал, праворуч — два його види. Повзунки керують силою кожної аугментації. Вердикт дивиться на форму, яка лишилась під шумом, і перевіряє, чи впізнається в ній та сама фігура.
NT-Xent: формула, у якій чисельник — свій, а знаменник — усі
Тепер треба перетворити слова «свій має бути схожішим за чужих» на число, яке можна мінімізувати. Формула зветься NT-Xent (normalized temperature-scaled cross entropy — «нормована перехресна ентропія з температурою»). Розберемо її по частинах, починаючи з того, що означає «схожі».
Мережа перетворює кожен вид на вектор — стовпчик із 32 чисел. Поділимо кожен вектор на його довжину, і тоді звичайний скалярний добуток двох векторів (перемножити покоординатно й додати) дасть косинус кута між ними: 1, якщо напрямки збігаються, 0 — якщо перпендикулярні, −1 — якщо протилежні. Позначимо цю схожість s(a, b).
Беремо партію з N зображень і робимо з кожного два види — разом 2N. У кожного виду є рівно один свій (другий вид того самого зображення) і 2N − 2 чужих.
Ділимо кожну схожість на температуру τ (грецька «тау» — просто число, зазвичай від 0.05 до 1) і застосовуємо експоненту ex. Експонента перетворює будь-яке число на додатне й різко підсилює різницю між великим і малим.
Ділимо «експоненту свого» на суму експонент усіх, крім себе самого. Знак Σ (грецька «сигма») означає «додай усе, що йде далі». Вийшло число від 0 до 1 — частка, яку свій відхопив від загального пирога схожості.
Хочемо, щоб
частка була близька до одиниці. Логарифм тут натуральний — той самий, що
обертає експоненту з кроку 3: log(ex) = x. Логарифм
одиниці — нуль, логарифм малого числа — велике відʼємне. Тому −log перетворює
«хочу частку 1» на «хочу втрату 0».
Словами вся формула читається так: у чисельнику — свій, у знаменнику — усі, крім себе самого. Втрата мала тоді, коли свій забирає майже весь знаменник. Загальна втрата — середнє по всіх 2N видах.
Порахуємо, що це за числа. Якщо мережа нічого не знає й усі схожості однакові, то частка свого дорівнює 1 поділити на (2N − 1), а втрата — log(2N − 1). Для партії з 8 зображень це log 15 ≈ 2.708, і саме стільки дає втрата на випадкових векторах, поки мережа справді нічого не знає. Для партії з 256 — log 511 ≈ 6.236, і саме звідти стартує наше навчання.
Втрата NT-Xent по кроках
Матриця схожостей для партії з чотирьох зображень: вісім видів, вісім рядків. Обери рядок і покрути температуру — побачиш, як міняється частка свого й сама втрата.
Що з цим робити далі — уже знайомо. Втрата рахується, градієнт іде назад, крок оптимізатора. Одна деталь: вектор для порівняння дає не саме тіло, а маленька надбудова над ним — проєктор (projection head), два лінійні шари 288 → 64 → 32. Після навчання проєктор викидають, а лишають тіло. Причина практична: втрата тягне свій вихід у дуже специфічний бік, і краще, щоб вона робила це з окремим шматком мережі, який нікому потім не потрібен.
Формулу варто перевірити двічі: порахувати втрату матрицями — і окремо в лоб, двома вкладеними циклами по всіх парах. На нашій партії обидва способи дають 2.351308 до останнього знака. Уся реалізація — дванадцять рядків, і магії всередині немає.
АугментаціїНабір аугментацій — це і є задача
Тепер найважливіше твердження теми, і воно не про формулу, а про те, що ти пишеш у списку аугментацій.
Контрастна мережа вчиться рівно тому, що ти оголосив неістотним. Не «крім того», а «рівно». Якщо ти сказав «зсув не міняє предмет», мережа мусить навчитися впізнавати предмет незалежно від положення — і це змушує її дивитися на форму. Якщо ти зсув не назвав, то два види одного зображення лишаються на тому самому місці, і найдешевший спосіб їх зблизити — запамʼятати положення.
Перевіримо це числом. Приберемо зсув із набору й передтренуємо заново, усе інше без змін. Для контролю приберемо натомість яскравість.
Що станеться, якщо забрати одну аугментацію
Ліворуч — як виглядають два види під обраним набором. Праворуч — заміряна якість тіла, яке цим набором навчили: лінійна проба на 30 і 60 мітках і точність найближчого сусіда.
ПеревіркаЧи вивчило воно взагалі щось
Ми маємо тіло, яке ніколи не бачило слова «трикутник». Перш ніж міряти точність класифікації, поставимо пряміше питання: чи розкладає воно фігури по різних кутках свого простору ознак?
Перевірка не вимагає жодного навчання з мітками. Беремо 300 зображень із відомими класами як довідник. Для кожного тестового зображення шукаємо серед довідника найсхожіше — очима мережі, тобто за косинусом кута між векторами ознак — і дивимось, чи збігся клас. Це зветься точність найближчого сусіда (kNN-точність) і є найпрямішою мірою якості представлення.
Обовʼязкова точка відліку — зовсім випадкове тіло, яке взагалі не навчали. Згорткова мережа з випадковими вагами вже щось робить із зображенням, і без цього рядка легко приписати передтренуванню чужу заслугу. Три зерна, ось результат:
| тіло | kNN-точність | розкид |
|---|---|---|
| випадкове, не навчене | 0.411 | ±0.007 |
| привід «поворот» | 0.423 | ±0.017 |
| контрастне | 0.497 | ±0.008 |
| вгадування | 0.167 | — |
Читається це так. Контрастне тіло, яке не бачило жодної мітки, дає 0.497 — на 0.086 більше за випадкове. Воно справді щось вивчило.
А тіло, навчене на нерозвʼязному приводі, дає 0.423 при 0.411 у випадкового. Різниця в межах розкиду. Ціле передтренування на тих самих 4800 зображеннях дало рівно стільки, скільки дає ніщо, — і це найпряміший доказ першої вимоги з розділу 04.
Простір ознак до появи міток
180 зображень, показаних як точки. Кожна точка — 288 чисел, які видало тіло, стиснуті до двох вимірів методом головних компонент. Колір — справжній клас, якого тіло не бачило.
РозворотСкільки це коштує й скільки дає
Тепер головний замір. У нас є тіло, навчене без міток. Скористаємось ним трьома способами, знайомими з теми 12:
| спосіб | тіло | що вчиться | вільних чисел |
|---|---|---|---|
| З нуля | випадкове | усе | 7 622 |
| Лінійна проба | передтреноване, заморожене | лише шар 288 → 6 | 1 734 |
| Донавчання | передтреноване, вільне | усе | 7 622 |
Міряємо на чотирьох кількостях міток, по три зерна на кожну клітинку. Рівень вгадування на шести класах — 0.167.
| міток | з нуля | проба | донавчання | проба після «повороту» |
|---|---|---|---|---|
| 30 | 0.339 ±0.014 | 0.372 ±0.030 | 0.369 ±0.013 | 0.237 ±0.014 |
| 60 | 0.427 ±0.003 | 0.407 ±0.025 | 0.454 ±0.020 | 0.248 ±0.024 |
| 120 | 0.524 ±0.020 | 0.418 ±0.010 | 0.504 ±0.020 | 0.298 ±0.023 |
| 300 | 0.702 ±0.024 | 0.451 ±0.026 | 0.737 ±0.034 | 0.416 ±0.024 |
Читаємо таблицю по колонках, бо кожна відповідає на своє питання.
Лінійна проба виграє лише поки міток зовсім мало. На 30 мітках 0.372 проти 0.339 — передтреноване тіло дає фору. Але сказати це треба обережно: розкид проби ±0.030 майже зʼїдає різницю 0.033, і купи ледь торкаються краями (0.342…0.402 у проби проти 0.325…0.353 у навчання з нуля). Тобто перевага є, але вона на межі того, що ці три зерна взагалі здатні розрізнити. На 60 вона зникає зовсім: 0.407 проти 0.427, тобто різниця в 0.020 при розкиді проби ±0.025 — це нічия. А на 300 проба програє з розгромом: 0.451 проти 0.702. Це той самий розворот, що в темі 12, і причина та сама: заморожене тіло — це стеля. Воно дивиться так, як навчилося дивитися, і жодні додаткові мітки цього не змінять, бо змінюватись у пробі нема чому — вільних чисел лише 1 734 із 7 622.
Донавчання поводиться інакше й у нас виявилось найкращим способом. На 60 мітках воно дає 0.454 — більше і за пробу, і за навчання з нуля. На 300 — 0.737 проти 0.702. Стелі в нього немає, бо тіло вільне; передтренування працює як вдалий початковий стан, а не як обмеження.
Нерозвʼязний привід не просто не допомагає — він заважає. Остання колонка гірша за навчання з нуля на кожному рядку, і різниця росте: −0.102 на 30 мітках, −0.286 на 300. Тіло, навчене вгадувати кут за шумом і зсувом, активно тягне класифікатор не туди.
Де проходить розворот
Повзунок обирає кількість міток. Перемикач міняє привід, яким передтренували тіло. Числа заміряні на трьох зернах, вусики — розкид.
Скільки треба непозначених даних
Лишилось питання, заради якого все й затівалось. Головний аргумент самонаглядового навчання — непозначених даних можна взяти скільки завгодно. Перевіримо, чи справді від їхньої кількості щось залежить: передтренуємо на 300, 1200 і 4800 зображеннях і щоразу зміряємо лінійну пробу на тих самих 60 мітках.
Непозначених більше — і що з того
Повзунок обирає, скільки непозначених зображень пішло на передтренування. Пунктир — навчання з нуля на тих самих 60 мітках, без жодного передтренування.
Останній рядок останнього стовпчика варто прочитати повільно. Ми взяли в шістнадцять разів більше непозначених зображень, ніж маємо міток, витратили на них окреме навчання — і лишились позаду простого навчання з нуля. Виграш зʼявляється тільки там, де міток справді мало: на 30 мітках, тобто по пʼять прикладів на клас.
МасштабЯк це виглядає насправді
Наш замір показує механізм, а не результат. Скажемо це прямо, бо різниця в масштабі не в рази, а в порядках. Ось короткий довідник по методах, які варто знати на імена.
| метод | ідея в одному реченні |
|---|---|
| SimCLR | рівно те, що ми зробили: два види, проєктор, NT-Xent. Показав, що набір аугментацій важить більше за архітектуру, а партія має бути величезною |
| MoCo | щоб не тримати гігантську партію в памʼяті, чужі приклади складають у чергу з попередніх кроків, а другу копію мережі оновлюють повільно |
| BYOL | чужих прикладів немає взагалі: одна копія мережі вчиться передбачати вихід другої, повільнішої. Знаменника немає, а працює |
| DINO | те саме без міток і без негативних, але на трансформерах; його карти уваги самі показують межі предметів, хоча про предмети ніхто не казав |
| Маскований автоенкодер | закрити три чверті патчів зображення й вимагати відновити закрите. Прямий нащадок «домальовування» з розділу 03 |
Тепер порядки величин, які роблять різницю відчутною. Такі методи навчаються партіями в кілька тисяч зображень і сотнями епох на ImageNet — а це мільйон двісті тисяч картинок. Разом виходять сотні мільйонів переглядів зображення за одне навчання, дні роботи кластера відеокарт і рахунок за електрику. Ціна цього — лінійна проба на замороженому тілі, яка наближається до мережі, навченої на всіх мітках ImageNet.
Наш режим: партія 256, чотири епохи, 4800 зображень, чотири з половиною хвилини на процесорі. Це в тисячі разів менше обчислень, і саме тому виграш у нас крихітний і зникає вже на 60 мітках. Механізм той самий, режим — інший.
Де це працюєЗадачі, у яких вибору немає
Самонаглядове навчання не всюди дає перевагу. Воно дає її там, де виконуються дві умови одразу: непозначених даних дуже багато і розмітка коштує як фахівець.
Медичні знімки. Лікарня накопичує рентгени, КТ і МРТ тисячами на тиждень — вони й так зберігаються. Розмітити знімок може тільки лікар-рентгенолог, і на один складний випадок у нього йдуть хвилини, яких у нього немає. Тут співвідношення «мільйони непозначених до сотень позначених» — норма, і це якраз лівий край нашої таблиці, де проба виграє.
Супутникові й аерознімки. Супутник фотографує ту саму ділянку роками. Позначити, де поле, де вирубка, а де підтоплення, здатен фахівець із дистанційного зондування. Додаткова обставина: у знімка згори немає верху й низу в звичному сенсі — і привід «вгадай поворот» там порожній рівно так само, як у нашого кола. Це не теоретична заувага, а типова причина, чому чужий рецепт не переноситься.
Промислові дефекти. Камера на лінії знімає кожну деталь — мільйони кадрів на місяць. Дефектних серед них частки відсотка, і саме їх треба знаходити інженерові вручну. Тут самонаглядове навчання часто працює навіть без класифікатора: тіло вчать на самих справних деталях, а потім шукають те, що не вкладається в вивчений розподіл.
І де воно не потрібне. Якщо задача звичайна — кіт проти собаки, товар проти не-товару — жодного самонаглядового навчання не треба. Візьми передтреноване на ImageNet тіло, як у темі 12, і донавчи. Хтось уже витратив на це кластер і рік; повторювати роботу безглуздо.
ПідсумокЩо лишається в голові
| Мітка коштує хвилини фахівця, зображення — нуль | звідси й уся тема: вчитися на тому, чого багато |
| Привід — задача, мітку до якої дає саме зображення | відповідь на неї нікому не потрібна; потрібне те, чого мережа навчиться дорогою |
| Перша вимога: привід має бути розвʼязний | у нас поворот розвʼязний для 0.167 фігур, дзеркало — для 0.000. Перевіряй числом ДО навчання |
| Друга вимога: розвʼязуватись потрібними ознаками | на сирих зображеннях поворот «помітний» у 1.000 випадків — за шумом і зсувом, тобто ні за чим |
| Контрастне навчання: свій вид у чисельнику, всі чужі — у знаменнику | партія — це і є складність задачі; температура вирішує, кого мережа слухає |
| Набір аугментацій і є постановка задачі | без зсуву проба падає з 0.372 до 0.339; без яскравості не падає зовсім |
| Тіло без міток справді щось вивчає | kNN 0.497 проти 0.411 у випадкового; нерозвʼязний привід дає 0.423, тобто нічого |
| Розворот такий самий, як у переносі навчання | проба виграє на 30 мітках і програє з 60; донавчання при правильному lr виграє всюди з 60 |
І головне, що варто винести з цієї теми, — не формула NT-Xent, а порядок дій. Спершу доведи, що придумана тобою задача має розвʼязок і що розвʼязати її можна лише потрібними ознаками. Потім навчай. Десять рядків перевірки економлять години прогону й, головне, рятують від висновку «самонаглядове навчання не працює» там, де насправді не працював конкретний привід.