Няколко думи за разпознаването на модели. Какъв е алгоритъмът за разпознаване на текст? Прост калъф, едномерно разделяне

  • Урок

Отдавна исках да напиша обща статия, съдържаща самите основи на разпознаването на изображения, ръководство за основни методи, разказвайки кога да ги приложим, какви задачи решават, какво може да се прави вечер на коляно и за какво е по-добре да не се мисли без екип от 20 човека.

Пиша някои статии за оптично разпознаване от дълго време, така че те ми пишат няколко пъти в месеца различни хорас въпроси по тази тема. Понякога имаш чувството, че живееш с тях различни светове... От една страна разбирате, че човек най-вероятно е професионалист в свързана тема, но в методите оптично разпознаванезнае много малко. И най-обидното е, че той се опитва да приложи метод от близка област на знанието, което е логично, но не работи напълно в разпознаването на изображения, но не разбира това и е много обиден, ако започне да разказва нещо от самите основи. И като се има предвид, че разказването от основите е много време, което често не е, става още по-тъжно.

Тази статия е замислена така, че човек, който никога не се е занимавал с методи за разпознаване на изображения, може в рамките на 10-15 минути да създаде в главата си определена основна картина на света, съответстваща на темата, и да разбере в каква посока трябва да копае. Много от описаните тук техники са приложими за радарна и аудио обработка.
Ще започна с няколко принципа, които винаги започваме да казваме на потенциален клиент или човек, който иска да започне да прави оптично разпознаване:

  • Когато решавате проблем, винаги отивайте от най-простото. Много по-лесно е да окачите оранжев етикет на човек, отколкото да следвате човек, подчертавайки го с каскади. Много по-лесно е да вземете камера с по-висока разделителна способност, отколкото да разработите алгоритъм за супер разделителна способност.
  • Строгото формулиране на проблема в методите за оптично разпознаване е с порядък по-важно, отколкото в проблемите системно програмиране: едно излишна думав TK може да добавите 50% от работата.
  • В задачите за разпознаване няма универсални решения... Не можете да създадете алгоритъм, който просто ще „разпознае всеки надпис“. Знак на улицата и лист с текст са коренно различни обекти. Вероятно можете да направите общ алгоритъм (ето добър пример от Google), но той ще изисква много работа на голям екип и ще се състои от десетки различни подпрограми.
  • OpenCV е библия, която има много методи и с която можете да решите 50% от обема на почти всеки проблем, но OpenCV е само малка част от това, което всъщност можете да направите. В едно проучване заключенията са написани: „Проблемът не се решава чрез OpenCV методи, следователно е нерешим“. Опитайте се да избегнете това, не бъдете мързеливи и трезво оценявайте текущата задача всеки път от нулата, без да използвате OpenCV шаблони.
Много е трудно да се даде универсален съвет, или да ви кажа как да създадете някаква структура, около която можете да изградите решение на произволни проблеми компютърно зрение... Целта на тази статия е да структурира това, което можете да използвате. Ще се опитам да счупя съществуващи методина три групи. Първата група е предварително филтриране и подготовка на изображението. Втората група е логическа обработка на резултатите от филтрирането. Третата група са алгоритми за вземане на решения, базирани на логическа обработка. Границите между групите са много условни. За да се реши проблем, далеч не винаги е необходимо да се прилагат методи от всички групи, понякога са достатъчни два, а понякога дори един.

Списъкът на методите, предоставен тук, е непълен. Предлагам да добавите критични методи в коментарите, които не съм написал, и да припишете по 2-3 придружаващи думи на всеки.

Част 1. Филтриране

В тази група съм поставил методи, които ви позволяват да подчертавате области на интерес в изображенията, без да ги анализирате. Повечето от тези методи прилагат някакъв вид единна трансформация към всички пиксели в изображението. На ниво филтрация изображението не се анализира, но точките, които преминават през филтрацията, могат да се разглеждат като области с специални характеристики.
Бинаризация на прага, избор на област на хистограма
Най-простата трансформация е праговата бинаризация на изображението. За RGB изображенияа в изображенията в сивата скала прагът е стойността на цвета. Среща идеални задачипри което такава трансформация е достатъчна. Да приемем, че искате автоматично да избирате обекти на бял лист хартия:




Изборът на прага, при който се извършва бинаризацията, до голяма степен определя самия процес на бинаризация. V в такъв случай, изображението е бинаризирано от средния цвят. Обикновено бинаризацията се извършва с помощта на алгоритъм, който адаптивно избира прага. Този алгоритъм може да бъде избор на очакване или режим. И можете да изберете най-големия връх на хистограмата.

Бинаризацията може да даде много интересни резултатипри работа с хистограми, включително в ситуация, когато разглеждаме изображение не в RGB, а в HSV. Например, сегментирайте цветовете, които ви интересуват. Този принцип може да се използва за изграждане както на детектор на етикети, така и на детектор за човешка кожа.
Класическо филтриране: Фурие, LPF, HPF
Класическите методи за филтриране от радар и обработка на сигнали могат успешно да се прилагат в различни задачи за разпознаване на образци. Традиционен методв радара, който почти никога не се използва в изображения в чист вид, е преобразуването на Фурие (по-точно FFT). Едно от малкото изключения, които използват едномерна трансформацияФурие, - компресия на изображение. За анализ на изображението едноизмерна трансформация обикновено не е достатъчна; трябва да използвате много по-ресурсно интензивна двуизмерна трансформация.

Малко хора всъщност го изчисляват, обикновено е много по-бързо и по-лесно да се използва конволюция на интересуващата ни област с готов филтър, заточен за високи (HPF) или ниски (LPF) честоти. Този метод, разбира се, не позволява анализ на спектъра, но в конкретна задачавидео обработката обикновено се нуждае не от анализ, а от резултат.


Повечето прости примерифилтри, които изпълняват подчертаване ниски честоти(Гаусов филтър) и високи честоти(филтър на Габор).
За всяка точка от изображението се избира прозорец и се умножава с филтър със същия размер. Резултатът от тази конволюция е новата стойност на точки. При внедряване на нискочестотен и високочестотен филтър се получават изображения от следния тип:



Wavelets
Но какво ще стане, ако използваме произволна характеристична функция за конволюция със сигнал? Тогава ще се нарича "Wavelet transform". Тази дефиниция на уейвлетите не е правилна, но традиционно се развива, че в много команди уейвлет анализът е търсене на произволен модел в изображение с помощта на навиване с модел на този модел. Има комплект класически функцииизползвани при уейвлет анализа. Те включват уейвлет на Хаар, уейвлет на Морлет, уейвлет за мексиканска шапка и др. Примитиви на Хаар, за които имаше няколко от предишните ми статии (,), се отнасят до такива функции за двумерно пространство.


По-горе са 4 примера за класически вълни. 3D уейвлет на Хаар, 2D уейвлет на Майер, уейвлет на мексиканската шапка, уейвлет на Daubechies. Един добър примерИзползването на разширената интерпретация на уейвлетите е проблемът за намиране на отблясък в окото, за който самото изригване е вълната:

Класическите вълни обикновено се използват за компресиране на изображения или за тяхното класифициране (описано по-долу).
Корелация
След такава свободна интерпретация на уейвлетите от моя страна си струва да споменем действителната корелация, която е в основата им. При филтриране на изображения това е незаменим инструмент... Класическото приложение е корелация на видеопотоци за намиране на смени или оптични потоци. Най-простият детекторизместването също в известен смисъл е корелатор на разликата. Там, където изображенията не корелират, имаше движение.

Функции за филтриране
Интересен клас филтри е филтрирането на функции. Това са чисто математически филтри, които ви позволяват да откриете просто математическа функциявърху изображението (права, парабола, кръг). Изгражда се натрупващо се изображение, в което за всяка точка от оригиналното изображение се изчертава набор от функции, генериращи го. Най-класическата трансформация е трансформацията на Хаф за линии. При това преобразуване за всяка точка (x; y) се изчертава множеството точки (a; b) от правата y = ax + b, за които е вярно равенството. Получаваме красиви снимки:


(първият плюс е за този, който пръв намери уловка в снимката и такова определение и го обясни, втория плюс е за този, който първи ще каже какво е показано тук)
Преобразуването на Хаф ви позволява да намерите всякакви параметризиращи се функции. Например кръг. Има модифицирана трансформация, която ви позволява да търсите всякакви форми. Тази трансформация страшно харесва математиците. Но когато обработвате изображения, това, за съжаление, не винаги работи. Силно ниска скоростработа, много висока чувствителност към качеството на бинаризация. Дори в идеални ситуации предпочитах да се справя с други методи.
Аналогът на трансформацията на Хаф за прави линии е трансформацията на Радон. Изчислява се чрез FFT, което дава предимство на производителността в ситуация, когато има много точки. Освен това може да се приложи към небинаризирано изображение.
Филтриране на контури
Отделен клас филтри е филтрирането на граници и контури. Очертанията са много полезни, когато искаме да преминем от работа с изображение към работа с обекти в това изображение. Когато темата е достатъчно сложна, но добре дефинирана, това е често единствения начинработата с него е изборът на неговите контури. Съществува цяла линияалгоритми, разрешаване на проблемафилтриращи контури:

Най-често се използва Кени, който работи добре и чиято реализация е в OpenCV (Собел също е там, но изглежда по-зле за контури).



Други филтри
По-горе са филтрите, чиито модификации помагат за решаването на 80-90% от проблемите. Но освен тях има по-редки филтри, използвани в локални задачи. Има десетки такива филтри, няма да изброявам всички. Интересни са итеративните филтри (например модел на активен външен вид), както и ригели и криви трансформации, които са сплав от класическо уейвлет филтриране и анализ в полето на радоновата трансформация. Beamlet трансформацията работи добре на границата на уейвлет трансформацията и логически анализ, което ви позволява да подчертаете очертанията:

Но тези трансформации са много специфични и са пригодени за редки задачи.

Част 2. Логическа обработка на резултатите от филтриране

Филтрирането предоставя набор от данни, подходящи за обработка. Но често не можете просто да вземете и използвате тези данни, без да ги обработвате. В този раздел ще има няколко класически метода, които ви позволяват да преминете от изображението към свойствата на обектите или към самите обекти.
Морфология
Преходът от филтриране към логика според мен е методите на математическата морфология (,,). Всъщност това са най-простите операции за изграждане и разяждане на двоични изображения. Тези методи ви позволяват да премахнете шума от двоично изображение чрез увеличаване или намаляване на съществуващите елементи. На базата на математическата морфология съществуват алгоритми за контуриране, но обикновено те използват някакъв вид хибридни алгоритми или алгоритми във връзка.
Контурен анализ
Алгоритмите за получаване на граници вече бяха споменати в раздела за филтриране. Получените граници съвсем просто се преобразуват в контури. За алгоритъма на Canny това се случва автоматично; за други алгоритми е необходима допълнителна бинаризация. Можете да получите контур за двоичен алгоритъм, например чрез алгоритъма на бръмбарите.
Очертанието е уникална характеристика на обект. Това често прави възможно идентифицирането на обекта по контура. Има мощен математически апарат, който ви позволява да направите това. Апаратът се нарича контурен анализ (,).

Честно казано, никога не съм успявал да прилагам контурен анализ в реални проблеми. Необходими са твърде идеални условия. Или няма граница, или има прекалено много шум. Но ако трябва да разпознаете нещо в идеални условия, тогава анализът на контурите е чудесен вариант. Работи много бързо, красива математика и ясна логика.
Специални точки
Единичните точки са уникални характеристики на обект, които ви позволяват да асоциирате обект със себе си или с подобни класове обекти. Има няколко десетки начина за подчертаване на такива точки. Някои методи подчертават специални точки в съседни рамки, някои след дълъг период от време и при смяна на осветлението, някои ви позволяват да намерите специални точки, които остават такива дори когато обектът се завърти. Нека започнем с методи, които ни позволяват да намерим единични точки, които не са толкова стабилни, но се изчисляват бързо, и след това преминаваме към нарастваща сложност:
Първи клас. Единични точки, които са стабилни за секунди.Такива точки се използват за насочване на обекта между съседни видео кадри или за сливане на изображения от съседни камери. Тези точки включват локални максимуми на изображението, ъгли на изображението (най-добрият от детекторите, може би детекторът Haris), точки, при които се достигат максимуми на дисперсия, определени градиенти и т.н.
Втори клас. Специални точки, които са стабилни при промени в осветлението и малки движения на обекта.Такива точки се използват предимно за обучение и последваща класификация на типове обекти. Например, класификатор за пешеходци или класификатор на лица е продукт на система, изградена около такива точки. Някои от споменатите по-горе вълни могат да бъдат основа за такива точки. Например, примитиви Haar, търсене на акценти, търсене на други специфични функции... Тези точки включват точки, открити чрез метода на хистограмата с насочен градиент (HOG).
Трети клас. Стабилни точки.Знам само за два метода, които дават пълна стабилност и за техните модификации. Това са SURF и SIFT. Те ви позволяват да намирате специални точки дори когато завъртите изображението. Изчисляването на такива точки отнема повече време от другите методи, но достатъчно ограничено време... За съжаление тези методи са патентовани. Въпреки че в Русия алгоритмите не са патентовани, така че го използвайте за вътрешния пазар.

Част 3. Обучение

Третата част на историята ще бъде посветена на методи, които не работят директно с изображението, но позволяват вземане на решения. Основно различни методи машинно обучениеи вземане на решения. Наскоро Yandyks публикува курс по тази тема в Habr, има много добър избор... Ето го в текстовата версия. За сериозно проучване на темата силно препоръчвам да ги разгледате. Тук ще се опитам да очертая няколко основни метода, използвани при разпознаването на образи.
В 80% от ситуациите същността на ученето в проблема с разпознаването е следната:
Има тестов набор, съдържащ няколко класа обекти. Нека това е присъствието / отсъствието на човек на снимката. За всяко изображение има набор от функции, които са идентифицирани от някаква характеристика, било то Haar, HOG, SURF или някакъв вид вълни. Алгоритъмът за обучение трябва да изгради такъв модел, според който ще може да анализира ново изображение и да реши кой от обектите е в изображението.
Как се прави? Всеки от тестови изображенияе точка в пространството на характеристиките. Неговите координати са теглото на всяка от характеристиките в изображението. Нека нашите знаци са: "Наличие на очи", "Наличие на нос", "Наличие на две ръце", "Наличие на уши" и т.н. ... човек. За човек в такова пространство точката ще бъде правилна. За маймуната точката е за коня. Класификаторът се обучава на извадка от примери. Но не всички снимки показват ръце, други нямат очи, а на третата маймуната има човешки нос поради грешка в класификатора. Обученият човешки класификатор автоматично разделя пространството на характеристиките по такъв начин, че да каже: ако първата характеристика се намира в диапазона 0,5 По същество целта на класификатора е да начертае в характерното пространство областите, които са характерни за обектите на класификация. Ето как ще изглежда последователното приближение към отговора за един от класификаторите (AdaBoost) в двуизмерно пространство:


Има много класификатори. Всеки от тях работи по-добре в някаква собствена задача. Задачата за избор на класификатор за конкретна задача в много отношения е изкуство. Ето няколко красиви снимки по темата.
Прост калъф, едномерно разделяне
Нека анализираме с пример най-простия случай на класификация, когато пространството на характеристиките е едномерно и трябва да разделим 2 класа. Ситуацията се случва по-често, отколкото човек може да си представи: например, когато трябва да разграничите два сигнала или да сравните модел с проба. Да кажем, че имаме обучителна извадка. В този случай се получава изображение, където по оста X ще има мярка за сходство, а по оста Y - броя на събитията с такава мярка. Когато търсеният обект изглежда като себе си, се получава левият гаусов. Когато не като - нали. Стойност от X = 0,4 разделя извадките, така че едно погрешно решение минимизира вероятността от вземане на погрешно решение. Именно търсенето на такъв разделител е проблемът с класификацията.


Малка забележка. Критерият, който минимизира грешката, не винаги ще бъде оптимален. Следващата графика е графика на реална система за разпознаване на ириса. За такава система критерият е избран така, че да минимизира вероятността от фалшиво допускане на неупълномощено лице до обекта. Тази вероятност се нарича "грешка от първи вид", "вероятност на фалшива тревога", "фалшиво положително". В англоезичната литература "False Access Rate".
) AdaBusta е един от най-разпространените класификатори. Върху него например е построена каскадата Хаар. Обикновено те се използват, когато е необходима двоична класификация, но нищо не ви пречи да преподавате за по-голям брой класове.
SVM (,,,) Един от най-мощните класификатори с много реализации. По принцип при учебните задачи, които срещнах, той работи по подобен начин на адабуста. Смята се за достатъчно бърз, но обучението му е по-трудно от това на Adabusta и е необходим избор на правилното ядро.

Има също невронни мрежи и регресия. Но за да ги класифицираме накратко и да покажем как се различават, е необходима статия много повече от тази.
________________________________________________
Надявам се, че успях да направя бърз преглед на използваните методи, без да се гмуркам в математиката и описанието. Може би ще помогне на някого. Въпреки че, разбира се, статията е непълна и няма нито дума за работа със стерео изображения, нито за OLS с Калман филтър, нито за адаптивния байесов подход.
Ако статията ви харесва, тогава ще се опитам да направя втората част с селекция от примери за това как се решават съществуващите задачи на ImageRecognition.

И накрая

Какво да чета?
1) Веднъж много ми хареса книгата "Обработка на цифрови изображения" от Б. Яне, която е написана просто и ясно, но в същото време е представена почти цялата математика. Добре е да се запознаете със съществуващите методи.
2) Класиците на жанра са Р. Гонзалес, Р. Уудс „Цифрова обработка на изображения”. По някаква причина ми беше по-трудно от първия. Много по-малко математика, но повече методи и снимки.
3) "Обработка и анализ на изображения в задачи за машинно зрение" - написана на базата на курс, преподаван в една от катедрите на PhysTech. Има много методи и тяхното подробно описание. Но според мен книгата има два големи недостатъка: книгата е силно фокусирана върху софтуерния пакет, който идва с нея, в книгата твърде често описанието на прост метод се превръща в математическа джунгла, от която е трудно да се направи структурна схема на метода. Но авторите направиха удобен сайт, където е представено почти цялото съдържание - wiki.technicalvision.ru Добавяне на тагове

Този проект не претендира за първо място в света и не се разглежда като конкурент FineReader, но да се надяваме, че идеята за разпознаване на символи с помощта на характеристиката на Ойлер ще бъде нова.

Запознаване с образната характеристика на Ойлер.

Основната идея е, че се прави черно-бяло изображение и ако приемем, че 0 е бял пиксел и 1 е черен пиксел, тогава цялото изображение ще бъде матрица от единици и нули. В този случай черно-бяло изображение може да бъде представено като набор от фрагменти 2 на 2 пиксела, всички възможни комбинации са показани на фигурата:

На всяко изображение снимка 1, снимка 2,... изобразява червен квадрат на стъпката на броене в алгоритъма, вътре в който един от фрагментите Фот горната снимка. В резултат на всяка стъпка всеки фрагмент се сумира за изображението Оригиналенполучаваме множеството:, по-нататък ще се нарича характеристика на изображението на Ойлер или наборът от характеристики.


КОМЕНТАР:на практика стойността F0 (за оригиналното изображение тази стойност е 8) не се използва, тъй като това е фонът на изображението. Следователно ще бъдат използвани 15 стойности, вариращи от F1 до F15.

Свойства на характеристиките на Ойлер на изображението.

  1. Стойността на набора от характеристики е уникална, с други думи, няма две изображения с една и съща характеристика на Ойлер.
  2. Няма алгоритъм за преобразуване от набора от характеристики към оригиналното изображение, единственият начин е грубата сила.

Какъв е алгоритъмът за разпознаване на текст?

Идеята за разпознаване на букви е, че предварително изчисляваме характеристиката на Ойлер за всички символи от азбуката на езика и я запазваме в базата знания. След това за частите от разпознатото изображение ще изчислим характеристиката на Ойлер и ще я потърсим в базата знания.

Етапи на разпознаване:

  1. Изображението може да бъде черно-бяло или цветно, следователно първият етап е приближаването на изображението, тоест получаването на черно-бяло от него.
  2. Правим минаване пиксел по пиксел през цялото изображение, за да намерим черните пиксели. Когато се намери засенчен пиксел, се стартира рекурсивна операция за намиране на всички засенчени пиксели, съседни на намерения и следващите. В резултат на това получаваме фрагмент от изображението, който може да бъде или цял герой, или част от него, или "боклук", който трябва да бъде изхвърлен.
  3. След намиране на всички несвързани части на изображението, характеристиката на Ойлер се изчислява за всяка.
  4. След това влиза в действие анализаторът, който, преминавайки през всеки фрагмент, определя дали в базата от знания има стойност на неговата характеристика на Ойлер. Ако намерим стойността, тогава приемаме, че това е разпознат фрагмент от изображението, в противен случай го оставяме за по-нататъшно изследване.
  5. Неразпознатите части от изображението се подлагат на евристичен анализ, тоест чрез стойността на характеристиката на Ойлер се опитвам да намеря най-подходящата стойност в базата от знания. Ако не бъде намерен, тогава се прави опит да се "залепят" близките фрагменти и вече те да търсят резултата в базата от знания. Защо се прави "залепване"? Въпросът е, че не всички букви се състоят от едно непрекъснато изображение, например "!" Удивителният знак съдържа 2 сегмента (пръчка и точка), следователно, преди да го потърсите в базата знания, е необходимо да се изчисли общата стойност на характеристиката на Ойлер от двете части. Ако не беше възможно да се намери приемлив резултат дори след залепване със съседни сегменти, тогава фрагментът се отчита като боклук и се пропуска.

Състав на системата:

  1. Знание- файл или файлове, първоначално създадени от мен или някой друг, съдържащ набори от характерни знаци и необходими за разпознаване.
  2. Ядро- съдържа основните функции, които извършват разпознаване
  3. Генератор- модул за създаване на база знания.

ClearType и анти-алиасинг.

И така, на входа имаме разпознаваемо изображение, като целта е да направим от него черно-бяло, подходящо за стартиране на процеса на разпознаване. Изглежда, че това, което може да бъде по-просто, всички бели пиксели се броят като 0, а всички останали са 1, но не всичко е толкова просто. Текстът на изображението може да бъде сгъстен, а не с изглаждане. Символите с изглаждане изглеждат гладки и без ъгли, а тези без сглаживане ще изглеждат на съвременни монитори с видими пиксели по контура. С появата на LCD (течни кристали) екрани бяха създадени ClearType (за Windows) и други видове анти-алиасинг, които се възползват от характеристиките на матрицата на монитора. Пикселите на текстовото изображение сменят цветовете, след което изглежда много "по-меко". За да видите резултата от заглаждането, можете да въведете буква (или текст), например mspaint, увеличете и вашият текст се превръща в някаква многоцветна мозайка.

Какъв е проблема?Защо виждаме обикновен символ в малък мащаб? Очите лъжат ли ни? Факт е, че един пиксел на LCD монитор не се състои от един пиксел, който може да приеме желания цвят, а от 3 субпиксела от 3 цвята, които са достатъчни за получаване на желания цвят. Следователно целта на ClearType е да получи най-приятния за окото текст, използвайки функция на матрицата на LCD монитора, а това се постига с помощта на субпикселно изобразяване. Който има "Лупа", може с цел експеримент да увеличи всяко място на включения екран и да види матрицата, както е на снимката по-долу.

Фигурата показва квадрат 3x3 пиксела на LCD матрицата.

Внимание!Тази функция усложнява получаването на черно-бяло изображение и силно влияе на резултата, тъй като не винаги позволява да се получи едно и също изображение, чиято характеристика на Ойлер се съхранява в базата от знания. По този начин разликата в изображенията принуждава да се извърши евристичен анализ, който не винаги може да бъде успешен.


Получаване на черно-бяло изображение.

Алгоритмите за преобразуване на цвят в черно и бяло, намерени в интернет, не ме устройваха с качеството. След прилагането им изображенията на символи, подложени на субпикселно изобразяване, станаха различни по ширина, появиха се прекъсвания на линиите на букви и странни отломки. В резултат на това реших да получа черно-бяло изображение, като анализирах яркостта на пиксела. Смятах, че всички пиксели по-ярки (по-големи от стойността) 130 единици са черни, останалите са бели. Този метод не е идеален и все пак води до незадоволителен резултат, ако яркостта на текста се промени, но поне получава изображения, подобни на стойностите в базата знания. Реализацията може да се види в класа LuminosityApproximator.

Знание.

Първоначалната идея за попълване на базата знания беше такава, че за всяка буква от езика ще изчислих характеристиката на Ойлер на полученото изображение на символ за 140 шрифта, които са инсталирани на моя компютър (C: \ Windows \ Fonts), Ще добавя всички опции за типове шрифтове (Normal, Мазни, Курсив) и размери от 8 до 32, като по този начин ще покрия всички или почти всички варианти на букви и основата ще стане универсална, но за съжаление не се оказа толкова добре, колкото изглежда. При тези условия получих следното:

  1. Файлът с базата от знания се оказа достатъчно голям (около 3 мегабайта) за руски и английски. Въпреки факта, че характеристиката на Ойлер се съхранява като прост низ от 15 цифри, а самият файл е компресиран архив (DeflateStream), който след това се разопакова в паметта.
  2. Отнема ми около 10 секунди, за да десериализирам базата от знания. В същото време пострада времето за сравнение на набори от характеристики. Не можахме да намерим функцията за изчисляване на GetHashCode (), така че трябваше да сравняваме малко по малко. И в сравнение с база знания от 3-5 шрифта, времето за анализ на текст с база от 140 шрифта се е увеличило 30-50 пъти. В същото време едни и същи набори от характеристики не се записват в базата знания, въпреки факта, че някои знаци в различни шрифтове може да изглеждат еднакво и да са сходни, дори има например 20 и 21 шрифта.

Затова трябваше да създам малка база от знания, която влиза в основния модул и прави възможно тестването на функционалността. Има много сериозен проблем с попълването на базата данни. Не всички шрифтове показват правилно малки знаци. Да кажем, че символът "e" при изобразяване с размер на шрифта 8 с име "Franklin Gothic Medium" се получава като:

И не много прилича на оригинала. Освен това, ако го добавите към базата от знания, това е така ще влоши значително резултатите от евристичния метод, тъй като е подвеждащо да се анализират символи, подобни на този. дТози символ е получен от различни шрифтове за различни букви. Самият процес на попълване на базата знания трябва да се контролира, така че всяко изображение на символ, преди да бъде запазено в базата знания, да се проверява от лице за съответствие с буквата. Но, за съжаление, нямам толкова много енергия и време.

Алгоритъм за търсене на знаци.

Веднага ще кажа, че първоначално подцених този проблем с търсенето и забравих, че символите могат да се състоят от няколко части. Стори ми се, че в хода на обхождане пиксел по пиксел ще срещна символ, ще намеря неговите части, ако има такива, ще ги комбинирам и ще анализирам. Нормалното преминаване би изглеждало така, сякаш намирам буквата "H" (База знания) и вярвам, че всички символи по-ниска висока точка и над ниска точка са относителни спрямо текущия ред и трябва да бъдат подредени в куп:

Но това е идеална ситуация, в хода на разпознаването трябваше да се справя с разглобени изображения, които в допълнение към всичко можеха да имат огромно количество боклук, разположен до текста:


На тази снимка думата "да" ще се опита да обясни сложността на анализа. Ще приемем, че това е пълен низ, но b13 и i6 са боклуци в резултат на апроксимацията. На символа "y" липсва точка и в същото време нито един от знаците не присъства в базата знания, за да се каже с увереност, че имаме работа с ред текст от "c" до "i" ред. А височината на линията е много важна за нас, тъй като за залепването трябва да знаем колко най-близките фрагменти трябва да бъдат "залепени" и анализирани. В края на краищата може да има ситуация, в която случайно започнем да лепим символи от два низа и резултатите от такова разпознаване ще бъдат далеч от идеалните.

Евристика при анализа на изображения.


Какво представлява евристиката за разпознаване на изображения?
Това е процесът, при който набор от характеристики, който не присъства в базата знания, се разпознава като правилната буква от азбуката. Дълго време мислех как да извърша анализа и в резултат на това най-успешният алгоритъм се оказа този:

  1. Намирам всички набори от характеристики в базата знания с най-голям брой стойности F фрагментисъвпада с разпознатото изображение.
  2. След това избирам само онези набори от характеристики, за които разликата с разпознаваемо изображение чрез неравни F стойности на фрагмента е не повече от + - 1 единица: -1< F < 1. И это все подсчитывается для каждой буквы алфавита.
  3. Тогава намирам героя, който има най-много случаи. Считайки го за резултат от евристичен анализ.
Този алгоритъм не дава най-добри резултати при малки изображения на знаци (7 - 12 размера на шрифта) . Но това може да се дължи на факта, че базата от знания съдържа характерни набори за подобни изображения на различни символи.

Пример за използване в C #.

Пример за начално изображение за разпознаване на изображение. Резултатната променлива ще съдържа текста:

var recognizer = нов TextRecognizer (контейнер); var report = разпознаване. Разпознаване (изображение); // Необработен текст. var резултат = отчет.RawText (); // Списък на всички фрагменти и състояние на разпознаване за всеки от тях. var fragments = report.Symbols;

Демо проект.

За нагледна демонстрация на работата написах WPFприложение. Стартира се от проект на име " Qocr.Application.Wpf". Пример за прозорец с резултат от разпознаване е по-долу:

За да разпознаете изображението, ще ви трябва:

  • Преси "Нова картинка"избира изображение за разпознаване
  • Използвайки " Черно и бяло"можете да видите кое изображение ще бъде анализирано. Ако видите изображение с изключително ниско качество, тогава не очаквайте добри резултати. За да подобрите резултатите, можете да опитате сами да напишете конвертор от цветно изображение в черно-бяло.
  • Избор на език "език".
  • Натиска за разпознаване "Разпознае".
Всички части на изображението трябва да бъдат маркирани с оранжева или зелена рамка.
Пример за разпознаване на многоезичен текст:

С помощта на множество анимации на примера на проблема за разпознаване на числа и персептронния модел се дава визуално въведение в процеса на обучение на невронна мрежа.

Първото видео е посветено на структурата на компонентите на невронната мрежа, второто на нейното обучение, а третото на алгоритъма на този процес. Като задача за обучение взехме класическия проблем за разпознаване на ръкописни числа.

Многослойният персептрон е разгледан подробно – основен (но вече доста сложен) модел за разбиране на всякакви по-модерни версии на невронни мрежи.

1. Компоненти на невронна мрежа

Целта на първото видео е да покаже какво е невронна мрежа. Използвайки примера на проблема за разпознаване на числа, се визуализира структурата на компонентите на невронната мрежа. Видеото има руски субтитри.

Постановка на проблема за разпознаване на цифри

Да приемем, че имате номер 3, изобразен в изключително ниска разделителна способност от 28x28 пиксела. Вашият мозък лесно разпознава това число.

От гледна точка на компютърните науки е изненадващо колко лесно мозъкът извършва тази операция, като точното подреждане на пикселите варира значително от едно изображение до друго. Нещо в нашата зрителна кора решава, че всички тризнаци, колкото и да са изобразени, представляват едно и също същество. Следователно задачата за разпознаване на числа в такъв контекст се възприема като проста.

Но ако ви бъде предложено да напишете програма, която приема като вход изображение на произволна цифра под формата на масив от 28x28 пиксела и извежда самия "обект" - цифра от 0 до 9 - тогава тази задача вече няма да изглежда проста .

Както подсказва името, структурата на невронната мрежа е донякъде близка до структурата на невронната мрежа на мозъка. Засега за простота ще си представим, че в математическия смисъл в невронните мрежи невроните се разбират като определен контейнер, съдържащ число от нула до едно.

Активиране на неврони. Слоеве на невронна мрежа

Тъй като нашата мрежа се състои от 28x28 = 784 пиксела, нека има 784 неврона, съдържащи различни числа от 0 до 1: колкото по-близо е един пиксел до бялото, толкова по-близо е съответното число до единица. Тези числа, запълващи мрежата, ще се наричат ​​​​активации на неврони. Можете да си представите това, сякаш неврон свети като крушка, когато съдържа число близо до 1 и изключен, когато числото е близко до 0.

Описаните 784 неврона образуват първия слой на невронната мрежа. Последният слой съдържа 10 неврона, всеки от които съответства на една от десет цифри. В тези числа активирането също е число от нула до едно, което отразява колко уверена е системата, че входното изображение съдържа съответната цифра.

Има и няколко средни слоя, наречени скрити слоеве, които ще разгледаме скоро. Изборът на броя на скритите слоеве и невроните, които съдържат, е произволен (избрахме 2 слоя от по 16 неврона всеки), но обикновено те се избират от определени идеи за задачата, която се решава от невронната мрежа.

Принципът на невронната мрежа е, че активирането в един слой определя активирането в следващия. При възбуждане определена група неврони предизвиква възбуждането на друга група. Ако обучената невронна мрежа се прехвърли към първия слой със стойности за активиране според яркостта на всеки пиксел на картината, веригата от активирания от един слой на невронната мрежа към следващия ще доведе до преференциално активиране на един от невроните на последния слой, съответстващ на разпознатата цифра - изборът на невронната мрежа.

Предназначение на скрити слоеве

Преди да се задълбочим в математиката за това как един слой влияе на следващия, как се случва ученето и как невронната мрежа решава проблема с разпознаването на цифри, нека обсъдим защо такава многослойна структура изобщо може да действа интелигентно. Какво правят средните слоеве между входния и изходния слой?

Оформете слой с изображение

В процеса на разпознаване на цифри ние обединяваме различните компоненти. Например, деветка се състои от кръг отгоре и линия отдясно. Фигурата 8 също има кръг в горната част, но вместо линия вдясно, тя има сдвоен кръг отдолу. Четирите могат да се разглеждат като три линии, свързани по определен начин. И т.н.

В идеализирания случай може да се очаква всеки неврон от втория слой да съответства на един от тези компоненти. И когато, например, предавате изображение с кръг в горната част на невронна мрежа, има определен неврон, чието активиране ще стане по-близо до един. По този начин преходът от втория скрит слой към изхода съответства на знанието кой набор от компоненти на коя фигура съответства.

Слой от изображения на структурни единици

Проблемът с разпознаването на кръг също може да бъде разделен на подзадачи. Например за разпознаване на различните малки лица, от които се формира. По същия начин дългата вертикална линия може да се разглежда като модел на свързване на няколко по-малки части. По този начин може да се надяваме, че всеки неврон от първия скрит слой на невронната мрежа изпълнява операцията по разпознаване на тези малки ръбове.

По този начин входното изображение води до активиране на определени неврони от първия скрит слой, определяйки характерни малки парчета, тези неврони, от своя страна, активират по-големи форми, в резултат на активиране на неврона на изходния слой, свързан с определен брой.

Дали невронната мрежа ще действа по този начин или не е друг въпрос, към който ще се върнете, когато обсъждате процеса на обучение на мрежа. Това обаче може да ни послужи като ориентир, един вид цел за такава пластова структура.

От друга страна, подобна дефиниция на лицата и шарките е полезна не само в проблема за разпознаване на числа, но като цяло в проблема за определяне на модели.

И не само за разпознаване на числа и изображения, но и за други интелектуални задачи, които могат да бъдат разбити на слоеве от абстракция. Например, за разпознаване на реч, отделни звуци, срички, думи се извличат от необработено аудио, след това фрази, по-абстрактни мисли и т.н.

Определяне на зоната за разпознаване

За да бъдем конкретни, нека сега си представим, че целта на отделен неврон в първия скрит слой е да определи дали картината съдържа лице в областта, отбелязана на фигурата.

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

Нека присвоим числово тегло w i на всяка връзка между нашия неврон и неврона от входния слой. След това вземаме всички активации от първия слой и изчисляваме претеглената им сума според тези тегла.

Тъй като броят на теглата е същият като броя на активациите, на тях може да се присвои и подобна решетка. Ще обозначим положителните тегла със зелени пиксели, а отрицателните с червени. Яркостта на пиксела ще съответства на абсолютната стойност на теглото.

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

Ако искате да определите дали има ръб, можете да добавите червени ръбове с тежест около зеления правоъгълник с тежести, съответстващи на отрицателни тегла. Тогава претеглената сума за тази област ще бъде максимална, когато средните пиксели на изображението в тази област са по-ярки и пикселите около тях са по-тъмни.

Мащабиране на активирането до интервал

Чрез изчисляване на тази претеглена сума можете да получите произволно число в широк диапазон от стойности. За да попадне в необходимия диапазон на активиране от 0 до 1, е разумно да се използва функция, която да "компресира" целия диапазон до интервал.

Сигмоидната логистична функция често се използва за това мащабиране. Колкото по-голяма е абсолютната стойност на отрицателното входно число, толкова по-близо е сигмоидната изходна стойност до нула. Колкото по-голяма е стойността на положителното входно число, толкова по-близо е стойността на функцията до единица.

По този начин, активирането на невроните по същество е мярка за това колко положителна е съответната претеглена сума. За да предотвратите активиране на неврона при малки положителни числа, можете да добавите отрицателно число към претеглената сума - отклонение, което определя колко голяма трябва да бъде претеглената сума, за да активира неврона.

Досега разговорът е бил само за един неврон. Всеки неврон от първия скрит слой е свързан с всички 784 пикселни неврони на първия слой. И всяко от тези 784 съединения ще има различно тегло, свързано с него. Също така, всеки от невроните на първия скрит слой има изместване, свързано с него, добавено към претеглената сума, преди да "изстиска" тази стойност от сигмоида. Така че има 784x16 тегла и 16 смени за първия скрит слой.

Връзките между другите слоеве също съдържат теглата и отместванията, свързани с тях. Така за дадения пример около 13 хиляди тегла и отмествания, които определят поведението на невронната мрежа, действат като регулируеми параметри.

Да обучите невронна мрежа да разпознава числа означава да принудите компютъра да намери правилните стойности за всички тези числа, така че да реши задачата. Представете си, че задавате всички тези тежести и превключвате ръчно. Това е един от най-ефективните аргументи за третиране на невронна мрежа като черна кутия – почти невъзможно е психически да се проследи съвместното поведение на всички параметри.

Описание на невронна мрежа от гледна точка на линейната алгебра

Нека да обсъдим един компактен начин за математическо представяне на връзките на невронната мрежа. Нека комбинираме всички активации на първия слой в колонен вектор. Обединяваме всички тегла в матрица, всеки ред от която описва връзките между невроните на един слой с конкретен неврон на следващия (в случай на затруднение вижте описания от нас курс). В резултат на умножаването на матрицата по вектора получаваме вектор, съответстващ на претеглените суми от активирания на първия слой. Добавете матричния продукт с вектора на изместване и го обвийте със сигмоидна функция, за да мащабирате диапазоните от стойности. В резултат на това получаваме колона със съответните активации.

Очевидно вместо колони и матрици, както е обичайно в линейната алгебра, можете да използвате тяхната кратка нотация. Това прави съответния програмен код по-опростен и по-бърз, тъй като библиотеките за машинно обучение са оптимизирани за векторни изчисления.

Изясняване на невронното активиране

Сега е моментът да изясним опростяването, с което започнахме. Невроните съответстват не само на числа - активации, но и на функции за активиране, които приемат стойности от всички неврони на предишния слой и изчисляват изходни стойности в диапазона от 0 до 1.

Всъщност цялата невронна мрежа е една голяма функция, регулируема чрез обучение с 13 хиляди параметъра, приемаща 784 входни стойности и даваща вероятност изображението да съответства на една от десетте цифри, предназначени за разпознаване. Въпреки сложността си обаче, това е просто функция и в известен смисъл има смисъл да изглежда сложно, защото ако беше по-просто, тази функция не би могла да реши проблема с разпознаването на цифри.

Освен това ще обсъдим какви функции за активиране се използват за програмиране на невронни мрежи сега.

Допълнение: малко за функциите за активиране. Сравнение на сигмоидната и ReLU

Нека засегнем накратко темата за функциите, използвани за "компресиране" на интервала от стойности за активиране. Сигмоидната функция е пример, който имитира биологични неврони и е бил използван в ранната работа по невронни мрежи, но по-простата функция ReLU сега се използва по-често за улесняване на обучението на невронна мрежа.

Функцията ReLU съответства на биологичната аналогия, че невроните могат да бъдат в активно състояние или не. Ако се премине определен праг, тогава функцията се задейства, а ако не бъде премината, тогава невронът просто остава неактивен, с активиране, равно на нула.

Оказа се, че за дълбоки многослойни мрежи функцията ReLU работи много добре и често няма смисъл да се използва по-сложна сигмоидна функция за изчисляване.

2. Обучение на невронна мрежа за разпознаване на цифри

Възниква въпросът: как мрежата, описана в първия урок, намира съответните тегла и измествания само въз основа на получените данни? Вторият урок разказва за това.

Най-общо казано, алгоритъмът е да покаже на невронна мрежа набор от данни за обучение, представляващи двойки изображения на ръкописни цифри и техните абстрактни математически представяния.

В очертания

В резултат на обучението, невронната мрежа трябва правилно да различава числата от непредставените преди това тестови данни. Съответно, съотношението на броя на действията за правилно разпознаване на цифри към броя на елементите на тестовата извадка може да се използва като тест за обучение на невронна мрежа.

Откъде идват данните за обучението? Разглежданият проблем е много често срещан и за неговото решаване е създадена голяма база данни MNIST, състояща се от 60 хиляди маркирани данни и 10 хиляди тестови изображения.

Функция на разходите

Концептуално задачата за обучение на невронна мрежа се свежда до намиране на минимума на определена функция - функция на разходите. Нека опишем какво представлява.

Както си спомняте, всеки неврон от следващия слой е свързан с неврона на предишния слой, докато теглата на тези връзки и цялостното изместване определят неговата функция за активиране. За да започнем някъде, можем да инициализираме всички тези тегла и смени с произволни числа.

Съответно, в първоначалния момент, необучена невронна мрежа в отговор на изображение на дадено число, например изображение на триплет, изходният слой произвежда напълно произволен отговор.

За да обучаваме невронна мрежа, въвеждаме функция на разходите, която като че ли ще каже на компютъра в случай на такъв резултат: „Не, лош компютър! Стойността на активиране трябва да бъде нула за всички неврони с изключение на един правилен.

Задаване на разходна функция за разпознаване на цифри

Математически тази функция представлява сумата от квадратите на разликите между действителните стойности на активиране на изходния слой и техните идеални стойности. Например, в случай на триплет, активирането трябва да е нула за всички неврони, с изключение на съответния триплет, в който е равно на единица.

Оказва се, че за едно изображение можем да определим една текуща стойност на функцията на разходите. Ако невронната мрежа е обучена, тази стойност ще бъде малка, в идеалния случай клоняща към нула, и обратно: колкото по-голяма е стойността на функцията на разходите, толкова по-зле е обучена невронната мрежа.

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

Това е доста трудна задача. Ако нашата невронна мрежа има 784 пиксела на входа, 10 стойности на изхода и изисква 13 хиляди параметра, за да ги изчисли, тогава функцията на разходите е функция на тези 13 хиляди параметра, дава една единствена стойност на разходите, която искаме да минимизираме , и в същото време в целия набор за обучение се използва като параметри.

Как променяте всички тези тежести и измествания, за да тренирате невронната мрежа?

Градиентно спускане

Като начало, вместо да представяме функция с 13 000 входа, нека започнем с функция от една променлива C (w). Както вероятно си спомняте от курса по математически анализ, за ​​да намерите минимума на функция, трябва да вземете производната.

Въпреки това, формата на функцията може да бъде много сложна и една гъвкава стратегия е да започнете от произволна точка и да направите стъпка към намаляване на стойността на функцията. Повтаряйки тази процедура във всяка следваща точка, човек може постепенно да стигне до локалния минимум на функцията, както прави топка, търкаляща се по хълм.

Както показва фигурата, функцията може да има много локални минимуми, а локалният минимум, в който ще бъде алгоритъмът, зависи от избора на начална точка и няма гаранция, че намереният минимум е минималната възможна стойност на функцията на разходите. Това трябва да се има предвид. Освен това, за да не се "подхлъзне" стойността на локалния минимум, е необходимо да промените размера на стъпката пропорционално на наклона на функцията.

Леко усложнявайки тази задача, вместо функция на една променлива, можете да си представите функция от две променливи с една изходна стойност. Съответната функция за намиране на посоката на най-бързото спускане е отрицателният градиент -∇C. Градиентът се изчислява, прави се стъпка в посока -∇C, процедурата се повтаря до достигане на минимума.

Описаната идея се нарича градиентно спускане и може да се приложи за намиране на минимума не само на функция от две променливи, но и на 13 хиляди и всякакъв друг брой променливи. Представете си, че всички тегла и измествания образуват един голям вектор колона w. За този вектор можете да изчислите същия градиентен вектор на функцията на разходите и да се движите в съответната посока, като добавите получения вектор с вектора w. И така повторете тази процедура, докато функцията C (w) стигне до минимум.

Компоненти за градиентно спускане

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

За градиентно спускане е важно изходните стойности на функцията на разходите да се променят плавно. Ето защо стойностите за активиране не просто имат двоични стойности 0 и 1, а представляват реални числа и са в интервала между тези стойности.

Всеки градиентен компонент ни казва две неща. Знакът на компонент показва посоката на промяна, а абсолютната стойност показва ефекта на този компонент върху крайния резултат: някои тегла допринасят повече за функцията на разходите, отколкото други.

Тестване на предположението за целта на скритите слоеве

Нека обсъдим въпроса доколко слоевете на невронната мрежа отговарят на нашите очаквания от първия урок. Ако визуализираме теглата на невроните на първия скрит слой от обучената невронна мрежа, няма да видим очакваните цифри, които биха съответствали на малките съставни елементи на числата. Ще видим много по-малко ясни модели, съответстващи на това как невронната мрежа минимизира функцията на разходите.

От друга страна възниква въпросът какво да очаквате, ако прехвърлите изображение на бял шум в невронната мрежа? Може да се предположи, че невронната мрежа не трябва да произвежда никакво специфично число и невроните на изходния слой не трябва да се активират или, ако са активирани, тогава по еднакъв начин. Вместо това, невронната мрежа отговаря на произволно изображение с добре дефинирано число.

Въпреки че невронната мрежа извършва операции за разпознаване на цифри, тя няма представа как са записани. Всъщност такива невронни мрежи са доста стара технология, разработена през 80-те-90-те години. Въпреки това е много полезно да разберете работата на този тип невронна мрежа, преди да разберете съвременните опции, които могат да решат различни интересни проблеми. Но колкото повече се ровите в това какво правят скритите слоеве на невронната мрежа, толкова по-малко интелигентна изглежда невронната мрежа.

Обучение върху структурирани и произволни данни

Помислете за пример за съвременна невронна мрежа за разпознаване на различни обекти в реалния свят.

Какво се случва, ако разбъркате базата данни, така че имената на обекта и изображенията вече да не съвпадат? Очевидно, тъй като данните са маркирани на случаен принцип, точността на разпознаване на тестовата проба ще бъде безполезна. В този случай обаче в комплекта за обучение ще получите точност на разпознаване на същото ниво, както ако данните са маркирани по правилния начин.

Милиони тегла за тази конкретна модерна невронна мрежа ще бъдат настроени, за да съответстват точно на данните и техните маркери. Минимизирането на функцията на разходите отговаря ли на някои образци и дали обучението върху произволно етикетирани данни се различава от обучението върху неправилно етикетирани данни?

Ако обучавате невронна мрежа в процеса на разпознаване върху произволно маркирани данни, тогава обучението е много бавно, кривата на разходите от броя на предприетите стъпки се държи почти линейно. Ако обучението се извършва върху структурирани данни, стойността на функцията на разходите намалява за много по-малко итерации.

3. Метод на обратно разпространение

Обратното разпространение е ключов алгоритъм за обучение за невронна мрежа. Нека първо обсъдим в общи линии какъв е методът.

Контрол на активиране на невроните

Всяка стъпка от алгоритъма използва на теория всички примери от обучаващата извадка. Да предположим, че имаме изображение на две и сме в самото начало на обучението: тежестите и изместванията се регулират произволно и изображението съответства на някаква произволна картина на активациите на изходния слой.

Не можем директно да променим активациите на крайния слой, но можем да повлияем на теглата и изместванията, за да променим картината на активациите на изходния слой: да намалим стойностите на активиране на всички неврони, с изключение на съответните 2, и да увеличим активационна стойност на необходимия неврон. В този случай увеличаването и намаляването се изискват толкова повече, колкото по-далеч е текущата стойност от желаната.

Опции за конфигурация на невронна мрежа

Нека се съсредоточим върху един неврон, съответстващ на активирането на неврона от два на изходния слой. Както си спомняме, неговата стойност е претеглената сума от активациите на невроните на предишния слой плюс изместването, обвито в мащабираща функция (сигмоидна или ReLU).

По този начин, за да увеличим стойността на това активиране, можем:

  1. Увеличаване на изместването b.
  2. Увеличете теглата w i.
  3. Променете активациите на предишния слой a i.

От формулата за претеглена сума може да се види, че теглата, съответстващи на връзките с най-активираните неврони, имат най-голям принос за активирането на неврона. Стратегия, близка до биологичните невронни мрежи, е да се увеличат теглата w i пропорционално на количеството активации a i на съответните неврони от предишния слой. Оказва се, че най-активираните неврони се свързват с неврона, който искаме да активираме само с най-„силните“ връзки.

Друг близък подход е да промените активациите на невроните на предишния слой a i пропорционално на теглата w i. Не можем да променим активирането на невроните, но можем да променим съответните тегла и измествания и по този начин да повлияем на активирането на невроните.

Обратно разпространение

Предпоследният слой от неврони може да се разглежда подобно на изходния слой. Вие събирате информация за това как би трябвало да се промени активирането на невроните в този слой, за да се промени активирането на изходния слой.

Важно е да се разбере, че всички тези действия се извършват не само с неврона, съответстващ на двата, но и с всички неврони на изходния слой, тъй като всеки неврон от текущия слой е свързан с всички неврони на предишния.

След като обобщихте всички тези необходими промени за предпоследния слой, разбирате как трябва да се промени вторият слой от края. След това рекурсивно повтаряте същия процес, за да определите свойствата на теглата и изместванията на всички слоеве.

Класическо градиентно спускане

В резултат на това цялата операция върху едно изображение води до намиране на необходимите промени на 13 хиляди тегла и измествания. Повтаряйки операцията върху всички примери от обучаващата извадка, получавате стойностите на промяната за всеки пример, които след това можете да осредните за всеки параметър поотделно.

Резултатът от това осредняване е векторът колона на отрицателния градиент на функцията на разходите.

Стохастичен градиентен спускане

Отчитането на цялата съвкупност от обучаващата извадка за изчисляване на единичната стъпка забавя процеса на градиентно спускане. Следователно обикновено се прави следното.

Данните от обучаващата извадка се смесват на случаен принцип и се разделят на подгрупи, например 100 етикетирани изображения. След това алгоритъмът изчислява стъпката на градиентно спускане за една подгрупа.

Това не е точно истинският градиент за функцията на разходите, която изисква всички данни в обучаващата извадка, но тъй като данните са избрани на случаен принцип, това дава добро приближение и, което е важно, може значително да увеличи скоростта на изчисление.

Ако построите крива на обучение за такова модернизирано градиентно спускане, то няма да изглежда като равномерно, целенасочено спускане по хълм, а като криволичеща траектория на пиян, който прави по-бързи стъпки и също така достига до минимална функция.

Този подход се нарича стохастичен градиентен спускане.

Добавяне. Математически компонент за обратно разпространение

Сега нека погледнем малко по-формално в математическия фон на алгоритъма за обратно разпространение.

Примитивен модел на невронна мрежа

Нека започнем с изключително проста невронна мрежа, състояща се от четири слоя, където има само един неврон във всеки слой. Съответно мрежата има три тегла и три смени. Нека видим колко чувствителна е функцията към тези променливи.

Нека започнем с връзката между последните два неврона. Нека означим последния слой L, предпоследния L-1 и активирането на разглежданите неврони, лежащи в тях a (L), a (L-1).

Функция на разходите

Представете си, че желаната стойност на активиране на последния неврон, дадена от примерите за обучение, е y, което е например 0 или 1. Така функцията на разходите се дефинира за този пример като

C 0 = (a (L) - y) 2.

Припомнете си, че активирането на този последен неврон се задава от претеглената сума, или по-скоро от функцията за мащабиране на претеглената сума:

а (L) = σ (w (L) a (L-1) + b (L)).

За краткост претеглената сума може да бъде обозначена с буква с подходящ индекс, например z (L):

а (L) = σ (z (L)).

Нека разгледаме как малките промени в теглото w (L) влияят върху стойността на функцията на разходите. Или в математически термини, каква е тегловната производна на функцията на разходите ∂C 0 / ∂w (L)?

Може да се види, че промяната в C 0 зависи от промяната в a (L), която от своя страна зависи от промяната в z (L), която също зависи от w (L). Съгласно правилото за вземане на подобни производни, желаната стойност се определя от произведението на следните частични производни:

∂C 0 / ∂w (L) = ∂z (L) / ∂w (L) ∂a (L) / ∂z (L) ∂C 0 / ∂a (L).

Определение на производните

Нека изчислим съответните производни:

∂C 0 / ∂a (L) = 2 (a (L) - y)

Това означава, че производната е пропорционална на разликата между текущата стойност на активиране и желаната.

Средната производна във веригата е просто производна на функцията за мащабиране:

∂a (L) / ∂z (L) = σ "(z (L))

И накрая, последният фактор е производната на претеглената сума:

∂z (L) / ∂w (L) = a (L-1)

По този начин съответната промяна се определя от това колко е активиран предишният неврон. Това корелира с идеята, спомената по-горе, че се образува по-силна връзка между невроните, които светят заедно.

Краен израз:

∂C 0 / ∂w (L) = 2 (a (L) - y) σ "(z (L)) a (L-1)

Обратно разпространение

Припомнете си, че определена производна е само за цената на отделен пример от обучаващата извадка C 0. За функцията на разходите C, както си спомняме, е необходимо да се осредни по всички примери на обучаващата извадка:

∂C / ∂w (L) = 1 / n Σ ∂C k / ∂w (L)

Получената средна стойност за конкретен w (L) е един от компонентите на градиента на функцията на разходите. Съображенията за смени са идентични с тези за тежестите.

След като получихме съответните производни, можем да продължим разглеждането на предишните слоеве.

Модел с много неврони на слой

Как обаче да направите прехода от слоеве, съдържащи един неврон, към първоначално разглежданата невронна мрежа. Всичко ще изглежда по същия начин, само ще бъде добавен допълнителен индекс, отразяващ номера на неврона вътре в слоя, а теглата ще имат двойни индекси, например jk, отразяващи връзката на неврон j от един слой L с друг неврон k в слой L-1.

Крайните производни осигуряват необходимите компоненти за определяне на компонентите на градиента ∇C.

Можете да практикувате описаната задача за разпознаване на цифри, като използвате хранилището за обучение на GitHub и споменатия набор от данни за разпознаване на цифри MNIST.