Простий спосіб закодувати щось в нейронну мережу| задача_ші #02

Original article was published by Osaulenko V.M. on Artificial Intelligence on Medium


Простий спосіб закодувати щось в нейронну мережу| задача_ші #02

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

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

Ми хочемо, щоб у це була нейронна мережа, а х або сенсорні дані, або інша нейронна мережа. Нехай x в нас представлений бінарним вектором розміром N (це може бути будь-що: текст, зображення, інша мережа…). Зробимо обмеження, нехай кожен елемент у векторі х дорівнює одиничці з ймовірністю рх. Беремо просту функцію, що приймає бінарне значення — порогову функцію нейрона як в першій задачі.

І зробимо ваги w випадковими, w=1 з ймовірністю pw. Нейрон активний (y=1) якщо вхідна активація більша чи рівна певному порогу t. Вхідну активацію позначимо як v = w1*x1 + w2*x2 + …

Питання:
1.З якою ймовірністю нейрон у буде мати вхідну активацію v=к?
2.Яка ймовірність, що нейрон у активується?
3. Додамо ще нейронів до y, кількість яких стала Ny. Ці нейрони так само утворюють випадкові зв’язки з x. Скільки в середньому буде активних нейронів серед Ny, якщо в кожного поріг t?

Якщо ви колись вивчали теорію ймовірностей і ще щось пам’ятаєте, то можете спробувати розв’язати самостійно. А ні, то розберемо разом. Тут нічого складного 🙂

Розв’язок.
1. Спершу треба зрозуміти, коли конкретний нейрон x_i (i — номер нейрона)збільшує v? Тоді, коли і сам нейрон активний(x_i =1), і зв’язок від нього активний (w_i =1), а це буває з ймовірністю px*pw. (Ймовірність одночасної появи незалежних подій це добуток їх ймовірностей). Вхідна активація v — це сума випадкових величин, і шукаємо її так само як з монеткою: підкинули монетку 100 раз, яка ймовірність, що герб випаде 50 раз? Ймовірність, що сума v дорівнюватиме k (“випаде k гербів”), це ймовірність, що k нейронів передали сигнал (px * pw) ^ k (степінь ^ це і є добуток, бо події незалежні), а інші N-k не передали (1- px*pw)^(N-k) і так як нам не принципово, які саме нейрони передають сигнал(головне сума), треба врахувати всі можливі комбінації k нейронів С(k, N) і отримуємо:

Це біноміальний розподіл. Ось як він виглядає для px=0.5, pw=0.8, N=100.

2) З якою ймовірністю активується нейрон? З ймовірністю, що v більше або дорівнює t. Тому треба підсумувати ймовірність, що v=t і ймовірність, що v=t+1 і так далі … Це теж саме, що й площа під графіком, який відсікає пряма k=t :

3)Тепер беремо мережу з Ny нейронами, які теж випадково зв’язуються з х. В них будуть однакові ймовірності активації(p(y_i=1)) і тому кількість активних нейронів також описується біноміальним розподілом. В середньому кількість активних нейронів:

Виходить, якщо нейрони мають поріг t такий, що відсікає половину графіка, то окремий нейрон y активний 50% випадків. І тому серед 100 нейронів в середньому 50 буде активних. Інколи менше, інколи більше…

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

Гістограма ця кривувата і відрізняється від гарної форми біноміального розподілу. Чому так? Можете подумати самі і написати в коментарях. Ось код, де можна все спробувати самому.

Це простий спосіб закодувати інформацію в нейронну мережу. Поріг вибираємо так, щоб активними були небагато клітин(~2–5%) і отримаємо розріджену бінарну активацію. І далі можна асоціювати з іншими групами. Але є проблема — в загальному випадку дані можуть бути будь-які (ми розв’язували для випадку ймовірності px). Якщо px росте, то біноміальний розподіл рухається вправо, і за фіксованого порогу t в нас збільшується кількість активних нейронів. Щоб розрідженість була стабільною (~2–5%) потрібно так само рухати поріг. Тому замість порогової функції вводять функцію, що автоматично підлаштовує поріг. Називають її kWTA(v, py) (від k winners take all), яка на вхід приймає активацію v, а параметр py визначає скільки відсотків нейронів будуть активними. Тут вже не треба думати за поріг і на вхід можна приймати будь-які дані, навіть якщо вони не бінарні.

До кожного кодування має бути декодування. Як взнати, що нейрони зберегли вхідні дані? Можна спробувати їх відтворити використовуючи ту ж саму функцію активації, що й при кодуванні і ті самі зв’язки, тільки обернені. І це працює!

Ще є нюанси з параметром px, але суть в тому, що дані можна відтворити. Ось нижче приклад.

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

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

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

В наступній статті покажу, що це не просто цікава математична модель, таке кодування насправді використовують деякі прості тварини.