Ograniczone pole widzenia
Czy to nie świetne, że jesteśmy w stanie po prostu pakować w naszą sieć neuronową piksele, aby otrzymać rozpoznawanie obrazu? Nie tak szybko, oczywiście, nie jest to aż takie proste.
Po pierwsze, korzystna wiadomość jest taka, że nasz „rozpoznawacz” cyfry 8 naprawdę nie ma problemu z prawidłowym rozpoznaniem znaków, gdy cyfra znajduje się na środku obrazu:

Po drugie, niestety, mam bardzo złą wiadomość, a mianowicie taką, że nasz „rozpoznawacz” kompletnie rozłożył się na rozpoznawaniu znaków, które nie są na środku obrazu. Wystarczy najmniejsza zmiana w pozycji cyfry 8, a sieć neuronowa kompletnie wysiada. Nie wspominając już o zmianie perspektywy itp.

Powodem jest to, że sieć nauczyła się wzoru rozpoznawania cyfry 8, gdy ta jest dokładnie na środku obrazu. I nie ma żadnego pojęcia o tym, co oznacza pozycja odbiegająca od środkowej. Nauczyła się rozpoznawania tylko jednego wzorca.
Widzimy więc, że nie jest to bardzo użyteczne rozwiązanie w naszej rzeczywistości. Problemy pojawiające się w realnym świecie nigdy nie są tak proste i jasne. Co musimy zatem zrobić, aby sieć neuronowa była w stanie rozpoznawać cyfrę 8, która nie jest umieszczona dokładnie na środku obrazu?
Prosty pomysł to wyszukiwanie za pomocą przesuwającego się okna. Co się stanie, gdy będziemy przeszukiwać cały obraz w poszukiwaniu ósemki fragment po fragmencie − aż do jej wykrycia?
To podejście nazywa się metodą przesuwającego się okna (sliding window). Jest to rozwiązanie prymitywne i sprawdzające się w ograniczonej liczbie przypadków, a do tego mało wydajne. Trzeba sprawdzać obraz w nieskończoność, wyszukując obiekty o różnych rozmiarach. Stać nas na więcej niż takie rozwiązanie!
Inny prymitywny pomysł to zwiększenie ilości danych wejściowych oraz zastosowanie głębokiej sieci neuronowej.
Podczas procesu uczenia naszej prostej sieci neuronowej stosowaliśmy dane przedstawiające wyśrodkowaną cyfrę 8. A co się stanie, gdy spróbujemy wytrenować sieć z większą ilością danych, dostarczając ósemek w różnych pozycjach i rozmiarach na obrazie?
Do tego celu nie musimy nawet zbierać dodatkowych danych. Napiszemy skrypt, aby wytworzyć ósemki w wielu różnorodnych pozycjach i rozmiarach przy użyciu obrazów z bazy danych, które już mamy:

Stworzyliśmy dane uczące, które są syntetyczne (synthetic training data), przez wytworzenie z danych, które już mamy, różnorodnych wersji ósemek.
W ten sposób możemy z dużą łatwością tworzyć nieskończone zasoby danych uczących.
Większa ilość danych komplikuje zadanie naszej sieci neuronowej, ale możemy sobie z tym poradzić przez powiększenie sieci i tym samym umożliwienie jej analizy bardziej złożonych wzorców.
Aby powiększyć naszą sieć, powielamy jej warstwy wraz z połączeniami:

Skonstruowaliśmy tak zwaną głęboką sieć neuronową − ma ona o wiele więcej warstw niż tradycyjna sieć.
To rozwiązanie jest dostępne od późnych lat sześćdziesiątych, ale jeszcze do niedawna uczenie maszynowe tak złożonych sieci neuronowych było zbyt wolne, aby mogło być praktyczne. Stało się użyteczne i możliwe do szerokiego zastosowania, dopiero gdy zastąpiono zwykłe procesory w komputerach kartami graficznymi (zaprojektowanymi do bardzo szybkiego powielania macierzy). Ta sama karta Nvidia GeForce GTX 1080Ti, której używasz do grania, choćby w Overwatch, może służyć do uczenia sieci neuronowej z niesamowitą szybkością.

Mimo że możemy powiększyć sieć neuronową oraz bardzo szybko wytrenować za pomocą karty graficznej 3D, to jeszcze nie jesteśmy w stanie uzyskać zadowalającego nas rezultatu w rozpoznawaniu obiektów. Musimy użyć innych rozwiązań, aby sieć wychwytywała wzorce w celu ich klasyfikacji.
Jeśli zastanowimy się przez chwilę, to tak naprawdę nie ma sensu osobne uczenie sieci, aby rozpoznawała ósemki w górnej części obrazu oraz ósemki w dolnej części, jakby to były kompletnie odrębne obiekty.
Potrzebny jest nam sposób, aby tak zaprojektować sieć neuronową tak, by umiała znaleźć ósemkę niezależnie od pozycji na obrazie, ale bez żadnych dodatkowych kroków uczenia. Na szczęście taki sposób już istnieje i nosi nazwę konwolucji.

