Сегодня мы узнаем из чего состоят нейросети - так сказать
"разложим их на атомы", и применим к распознаванию домашних животных. Также, как материя состоит из атомов, нейросетки (как легко догадаться) состоят из нейронов. Тут уместна аналогия с химией - имея всего лишь один атом вещества мы можем очень многое сказать о его свойствах. Так же и здесь - зная, как работает всего лишь один нейрон мы многое можем сказать о нейросетях в целом.
Вспомним, что за основу построения искусственного разума, взят мозг человека. А, он состоит из клеток называемых нейронами.
У нейрона существует два вида отростков: дендриты (их может быть несколько тысяч!) - по которым он принимает сигналы от других нейронов. И аксон(он-один) - по которому он свой сигнал передает. Ну, и собственно, функция нейрона состоит в том, что он преобразует входные электрические сигналы в выходной. Передаваемый сигнал может либо "активировать" (переводить в возбужденное состояние) принимающий нейрон, либо "тормозить" (переводить в состояние покоя). Так как же он это делает?
Уже знакомый нам Фрэнк Розенблатт ( и несколько других парней) предложили простейшую модель функционирования нейрона.
Простыми словами это можно объяснить так. Нейрон принимает на вход сигналы (x1, x2,... xn) и перемножает их на на веса (w1, w2,.. wn), которые (если так можно выразиться) "хранятся в памяти" этого нейрона. Затем он результаты этих умножений складывает и вычисляет так называемую "функцию активации" Ф. Этот результат ее передает по своему аксону следующим нейронам. Что на на языке математики можно записать как:
Выход = Ф(w1*x1+w2*x2+...+wn*xn)
Если обратить внимание на выражение в скобках, внимательный читатель сразу распознает в нем скалярное произведение вектора параметров X и вектора весов W. И это очень показательно. 99% вычислений в нейронных сетях - это именно такие произведения. Они сформировали тренд в микроэлектронике последних лет. Все пытаются вычислять их быстрее, точнее, энергоэффективнее. Но об этом мы еще поговорим отдельно.
А пока давайте обратимся к "функции активации" Ф которая превращает наше скалярное произведение в сигнал распространяемый по аксону. Она может быть такой.
Это так называемая степ-функция Хевисайда. И именно с таких функций и начинал Розенблатт. У нее есть то неоспоримое достоинство, что она очень четко отделяет "мух от котлет", "агнцев от козлищ", а кисок от собачек (об этом- ниже). Но и недостатки ее весьма существенны. Она - разрывная и не дифференцируемая. Последнее обстоятельство превращает обучение подобных нейронов в сущий ад (обсудим, когда будем заниматься тренингом нерйосеток). А математики всегда любили функции непрерывные (и не зря). Потому и возникла идея сгладить "ступеньку".
Это сигмоид. Он уже лучше, чем степ -функция. Но и у него есть свои недостатки. Он сложнее, а значит -дольше вычисляется. Как ни странно, наибольшую популярность среди разработчиков нейронных сетей завоевала следующая форма.
Это - так называемый "линейный выпрямитель". И он оказывается одним из лучших выборов.
Но, хватит сухой теории. Давайте лучше рассмотрим как все это работает на конкретном примере. Как я люблю шутить "основное предназначение искусственного интеллекта в том, чтобы различать кисок и собачек"
Давайте попробуем с помощью всего лишь одного нейрона решить эту задачу. В качестве признаков (как их вычислять - отдельная задача и ей мы займемся позже) возьмем два. x1 = круглая мордочка (у собак она все же по большей части вытянутая). x2 = хвост крючком (у кисок он бывает "трубой", "поленом", но "крючком" крайне редко). Теперь, допустим что мы определили "веса" этих признаков. w1 = 0.6, это означает то животное с круглой мордочкой имеет хорошие шансы оказаться киской. w2 = -0.3. Не удивляйтесь отрицательному числу. Логика говорит нам, что у кисок почти не бывает хвоста крючком. К тому же давайте вспомним, что нейроны мозга могут не только возбуждать друг друга, но и "тормозить". Именно это и означает отрицательный вес. Итак, наше скалярное произведение будет иметь вид 0.6*x1 - 0.3*x2 . Мы считаем, что на изображении есть киска, если это выражение больше или равно 0. То есть, нам надо решить неравенство
0.6*x1-0.3*x2>=0
На графике решение будет выглядеть так (вспоминайте алгебру за 9й класс!)
Итак, мы сумели "отличить" кисок от не-кисок с помощью всего лишь одного нейрона и двух признаков (features). Теперь давайте обсудим, что будет при различных функциях активации нашего нейрона. Если в качестве таковой мы возьмем степ -функцию(№1) то на разделяющей красной линии у нас возникнет ступенька. Слева от нее будут "не- киски" (они нас мало интересуют), а правее - усатые-полосатые. Но скачкообразные изменения - это не очень хорошо. Дело в том, что вблизи линии разделения есть пограничные состояния - "вроде бы киска, но в военное время при плохом освещении может оказаться носорогом". Иными словами степ-функция упускает тот факт, что чем ближе к линии разделения - тем меньше наша уверенность в распознавании. Логистический сигмоид (№2) сглаживает ступеньку и уже лишен этого недостатка. Но у него остается другой - он довольно быстро насыщается. То есть его значения далеко от нуля (линии разделения) мало отличаются. Это приведет к тому что нам трудно будет отличить "уверенную киску" от "всем кискам киски". Наконец, "линейный выпрямитель" ReLU(№3) позволяет нам справиться с обоими проблемами. Именно поэтому они и завоевали такую популярность.
А теперь давайте сделаем некоторые выводы из того, что мы узнали сегодня.
1. Модель одного нейрона очень проста . Нам всего лишь надо посчитать сумму произведений входных сигналов и их весов, а затем вычислить некоторую нелинейную функцию от результата. И ступенька, и сигмоид, и ReLU - это нелинейные функции (хотя ступенька и ReLU -кусочно - линейные). Нелинейность в данном случае принципиальна. Как мы увидим далее все те "чудеса" на которые способны нейросети, возникают именно за счет нелинейности.
2. Нейросетки работают в пространстве признаков (features) или параметров, снабженных весами. Для различения кисок мы с вами воспользовались двумя признаками - "круглая мордочка" и "хвост крючком". В реальной жизни этих признаков обычно намного больше. Однако, прикол в том, что зачастую нейросетки как-то сами выбирают те признаки на которые они ориентируются. И мы часто даже не знаем какие...
3. Обратите внимание на красную линию, которая разделяет области "кисок" и "не- кисок" на последнем графике. Такого рода классификация, называемая "линейной разделимостью" - это лучшее на что способен один нейрон. Если бы мы выбрали какие-то другие признаки у нас могла бы получиться вот такая картинка.
С такой задачей один нейрон справиться не может - как бы мы не провели разделяющую линию (в многомерном случае это будет гиперплоскость) мы не сможем правильно отделить наших четвероногих друзей. Это одно из возражений, которое "похоронило" попытки создания искусственного интеллекта в середине прошлого века.
К счастью, нейросети вовсе не обязаны состоять из одного нейрона. Они представляют собой многослойные ансамбли и легко справляются с проблемами, подобными той, что приведена на рисунке выше. Но об этом - уже в следующий раз.
Оставайтесь со мной.