Spis treści
1. Sztuczna sieć neuronowa.
Początkowo termin sieci neuronowych był używany w odniesieniu do sieci lub obwodu biologicznych neuronów. Nowoczesne użycie tego terminu często odnosi się do symulowanej sieci neuronowej zwanej "Sztuczną siecią neuronową". Zarówno biologiczna jak i sztuczna sieć neuronowa składa się z grupy połączonych ze sobą komórek zwanych neuronami tworząc bardzo skomplikowaną strukturę sieci, z tą różnica iż sztuczna sieć neuronowa w celu przetwarzania informacji wykorzystuje model matematyczny. Oryginalną inspiracją takiej struktury była budowa naturalnych neuronów oraz układów nerwowych, w szczególności mózgu a pierwsze badania nad sztucznymi sieciami neuronowymi miały swoje początki już w latach czterdziestych XX w.
Istotnymi cechami sztucznych sieci neuronowych jest ich zdolność uczenia się oraz rozwiązywania problemów (zadań) niezbyt zdefiniowanych formalnie, inaczej mówiąc wykazują zdolność do interpretacji znaczenia danych o skomplikowanych lub niedokładne zdefiniowanych wartościach. Dzięki temu mogą być stosowane do rozpoznawania zachowań i wykrywania trendów, które są zbyt skomplikowane, aby mogły być zauważone przez człowieka bądź inne techniki komputerowe.
Sztuczne sieci neuronowe znalazły liczne zastosowania w analizie danych. Mogą być wykorzystywane w sytuacjach, gdzie pomiędzy zmiennymi zależnymi i niezależnymi istnieje rzeczywista zależność lub zespół zależności, nawet jeśli są one bardzo skomplikowane i niewyrażalne w klasyczny sposób. Dlatego z powodzeniem stosowane są wszędzie tam, gdzie pojawiają się zadania związane z predykcją (prognozowaniem) czy też klasyfikacją danych.
Niżej wymieniono kilka przykładów interesujących zastosowań sieci neuronowych:
- Predykcja - czyli prognozowanie zjawisk przynajmniej częściowo deterministycznych, których przyszły przebieg chcielibyśmy poznać. Przykładowo sztuczne sieci neuronowe wykorzystywane są zarówno do prognozowania zachowań giełdowych jak i prognozy sprzedaży lub cen.
- Określanie ryzyka - jako przykład można podać udzielanie kredytu w banku. Sieć neuronowa określa ryzyko związane z udzieleniem pożyczki osobie, która złożyła wniosek o kredyt na podstawie danych dotyczących kredytobiorcy. Przykładowo analizowane są takie wartości jak: dochody tej osoby, informacje dotyczące spłat wcześniej udzielonych kredytów czy też dane dotyczące biznesplanu. Dzięki temu sieć może określić wiarygodność danej osoby oraz odpowiednio ja sklasyfikować.
- Rozpoznawanie i klasyfikacja wzorców - Jest to działanie polegające na analizie przykładowo poprzez siec neuronową surowych danych i podejmowaniu dalszych czynności zależnych od kategorii do której należą te dane.
Biologiczny pierwowzór
Dokładnie nie wiadomo w jaki sposób ludzki mózg, uczy się i zapamiętuje informacje ale naśladujące go sztuczne sieci neuronowe, których części składowe wzorowane są na prawdziwych komórkach nerwowych, potrafią także zapamiętywać i uczyć się na podstawie wcześniej gromadzonych danych. Mogą też podejmować decyzje i zastępować człowieka w skomplikowanych czynnościach wymagających nie tylko wiedzy ale i intuicji. A wszystko to dzięki specyficznej strukturze opartej o zasadę działania biologicznego neuronu.
Biologiczny neuron składa się z jądra, wielu dendrytów (które stanowią wejścia) i aksonu (będącego jedynym wyjściem komórki nerwowej). Synapsy umieszczone na końcach dendrytów i aksonu służą do przekazywania informacji. Akson danego neuronu połączony jest poprzez synapsy z dendrytami innych neuronów (ale z tylko jednym dendrytem każdego neuronu). Działanie biologicznej sieci neuronowej polega na tym, że każdy z dendrytów dostarcza do komórki sygnał o danym poziomie , gdzie następuje skumulowanie tych sygnałów i jeśli sygnał osiągnie wartość progową, jest przewodzony przez synapsę do wejścia kolejnej komórki nerwowej, jeśli będzie za słaby komórka nie zostanie pobudzona. Te rozwiązanie zostało "zapożyczone" przez uczonych do stworzenia sztucznego neuronu na którym opierają się współczesne sztuczne sieci neuronowe.
Sztuczna sieć neuronowa to tak naprawdę uproszczony ale i bogaty model rzeczywistego biologicznego systemu nerwowego a dokładniej jest to bardzo uproszczony model ludzkiego mózgu. Składa się z dużej liczby elementów przetwarzających informacje - sztucznych neuronów. Taki sztuczny neuron ma znacznie zredukowane funkcje względem naturalnego odpowiednika , ograniczające się do wykonywania kilku najprostszych zadań. Jest to spowodowane tym iż, gdybyśmy chcieli wiernie naśladować działanie mózgu, stopień złożoności sztucznego neuronu przekraczałby możliwości współczesnych komputerów.
Struktura sieci neuronowej
Aby sieci neuronowe mogły poprawnie rozwiązać dany problem, muszą mieć odpowiednio dobraną strukturę (budowę) do specyfiki powierzonego im zadania. Od odpowiedniej struktury i typu zależy faktyczna moc obliczeniowa sztucznych sieci neuronowych. Dlatego rozróżniamy wiele typów sieci, o różnych parametrach i charakterystyce.
Jak już wspominaliśmy sztuczna sieć neuronowa składa się z zespołów połączonych ze sobą elementów zwanych neuronami. Każdy neuron posiada zależną od potrzeb liczbę "xn" wejść i dokładnie jedno wyjście "y". Schemat sztucznego neuronu przedstawia rys 1.
Rys.1. Schemat sztucznego neuronu.
Niestety sam neuron posiada niewielkie możliwości w zakresie przetwarzania informacji i właśnie z tego względu powstały połączone ze sobą grupy sztucznych neuronów tworzące sieć neuronową pozwalające przeprowadzać znacznie bardziej złożone obliczenia.
Prosta sieć neuronowa składa się z trzech podstawowych warstw. Pierwsza warstwa nosi nazwę warstwy wejściowej, ostatnia warstwy wyjściowej, natomiast wszystkie warstwy znajdujące się pomiędzy nimi określane są mianem warstw ukrytych . Przykładową strukturę sieci ilustruje rys.2.
Rys.2. Przykładowa struktura sieci typu feed forward.
Patrząc pod względem architektury, sztuczne sieci neuronowe można podzielić przynajmniej na dwa podstawowe typy:
- sieci jednokierunkowe (feed forward networks) - tj. sieci o jednym kierunku przepływu sygnału w których nie występuje sprzężenie zwrotne, czyli pojedynczy wzorzec lub sygnał przechodzi przez każdy neuron dokładnie raz w swoim cyklu.
- sieci rekurencyjne (sieci ze sprzężeniem zwrotnym np. sieci Hopfielda ) - Mianem sieci rekurencyjnej określa się sieć, w której sygnały mogą "życ" dowolnie długo a połączenia między neuronami stanowią graf z cyklami.
Działanie sieci neuronowej
Podstawowym atutem sieci neuronowych jest masowe i równoległe przetwarzanie danych. Aby lepiej poznać działanie takiej sieci powinniśmy zapoznać się z działaniem jej podstawowego elementu czyli pojedynczego neuronu zwanego także perceptronem. Takie pojedyncze neurony są zdolne do równoczesnego przetwarzania informacji a ich wspólne i z synchronizowane działanie może dostarczyć rozwiązanie problemu o wiele szybciej niż jakikolwiek inny system komputerowy.
Zasadniczą funkcją pojedynczego neuronu jest przetworzenie wartości sygnałów wprowadzanych na jego wejścia
"xn" w wartość wyjściową, wysyłaną na jego jedynym wyjściu "y".
Sygnały xn podane na wejścia, są mnożone przez współczynniki wn zwane wagami.
Wagi mają różne wartości i dzięki temu niektóre mają mniejszy lub większy priorytet, dając odpowiednio mniejszy lub
większy wkład do sygnału sumarycznego.
W dalszym procesie iloczyny sygnałów wejściowych i wag są sumowane i jeśli wynik osiągnie pewną wartość progową "x0" to otrzymujemy wartość wyjściową "s".
Jeżeli na tym proces się kończy to "s" jest ostatecznym sygnałem wyjściowym "y" a neuron który ten sygnał obliczył nazywamy "neuronem liniowym". Natomiast jeżeli wartość "s" jest dodatkowo poddawana działaniu poprzez funkcję aktywacji "f" w wyniku czego otrzymujemy sygnał wyjściowy "y" to taki neuron nazywamy "neuronem nieliniowym". Schemat działania sztucznego neuronu można w przybliżeniu przedstawić następująco (rys 3):
Rys.3. Schemat działania sztucznego neuronu.
Pojemność informacyjna pojedynczego neuronu jest ograniczona i nie jest zbyt duża, a więc nie jest on wstanie zapamiętać zbyt wielu wzorców. Dlatego, aby zwiększyć pojemności informacji pojedyncze neurony łączone są w grupy sztucznych neuronów czyli sieć neuronową . Sieć może składać się z wielu warstw i to właśnie ich ilość, określa jej wielkość.
Sposób pracy sieci gwarantujący prawidłowe rozwiązywanie problemów uzależniony jest od wielu czynników, do których należy zaliczyć przede wszystkim: strukturę sieci (topologię), przyjęte modele neuronów,typ sieci, wartości współczynników wagowych i wreszcie liczbę neuronów oraz warstw sieci. Podstawowy schemat działania prostej, wielowarstwowej sieci neuronowej przedstawia się następująco:
Wartości początkowe (nasze dane) wprowadzane są na wejścia neuronów warstwy wejściowej a następnie poprzez połączenia pomiędzy neuronami, wartości pierwszej warstwy przekazywane są na wejścia elementów przetwarzających kolejnej warstwy zwanej ukrytą. Neurony warstwy ukrytej (jednej lub każdej kolejnej) zbierają wartości sygnałów z każdego z neuronów z warstwy poprzedniej i mnożą każdy z tych sygnałów przez odpowiednią wagę. Następnym procesem jest sumowanie otrzymanych wartości i przekazywanie do wszystkich neuronów następnej warstwy. Wartości uzyskane w ostatniej warstwie na wyjściach neuronów są jednocześnie wartościami wyjściowymi sieci.
Należy wspomnieć, że proces sumowania otrzymanych wartości w poszczególnych warstwach sieci, nie jest taką prostą sumą iloczynów lecz funkcją tej sumy zwaną funkcją aktywacji. Do najczęściej używanych funkcji aktywacji należą: funkcja liniowa, unipolarna,bipolarna, niesymetryczna liniowa z nasyceniem, symetryczna liniowa z nasyceniem, logarytmiczno-sigmoidalna, liniowa dodatnia a także tangens hiperboliczny.
2. Uczenie sieci neuronowej
Proces mający na celu określenie prawidłowych wartości parametrów sieci nazywany jest uczeniem sieci neuronowej. Uczenie sieci polega na wymuszeniu na niej określonego reagowania poprzez odpowiednie dobieranie wag połączeń między neuronami w taki sposób, aby po podaniu na wejście sieci jakiś wartości, na jej wyjściu uzyskać interesujący nas wynik, dający rozwiązanie danego problemu. Uczenie realizowane jest zawsze przy wykorzystaniu pewnych zestawów danych (najczęściej z przeszłego okresu czasu), które w jakiś sposób charakteryzują (opisują) wybrany problem. W trakcie uczenia przeprowadzana jest modyfikacja parametrów sieci mająca na celu poprawę jej funkcjonowania. Sposób przeprowadzenia tych modyfikacji określany jest przez zastosowany algorytm uczenia sieci. Dzięki procesowi uczenia się, sieci neuronowe mają charakter sztucznej inteligencji i potrafią samodzielnie przystosowywać się do zmieniających się warunków.
Istnieją dwa podstawowe sposoby przeprowadzania uczenia sieci. Są nimi: uczenie z nauczycielem oraz uczenie bez nauczyciela. Ze względu na to iż w neurolotto stosujemy uczenie się sieci z nauczycielem, opiszemy tylko ten jeden sposób.
Uczenie z nauczycielem (nadzorowane) polega na bezpośrednim porównaniu sygnału wyjściowego sieci ze znanymi prawidłowymi przykładami rozwiązania danego problemu. Jeśli porównywane wartości nie są równe, to wagi sieci modyfikowane są w taki sposób, aby odpowiedź sieci upodobniła się do wartości w podawanych przykładach.
Jednym z podstawowych algorytmów uczenia nadzorowanego wielowarstwowych jednokierunkowych sieci neuronowych jest algorytm wstecznej propagacji błędów. Algorytm ten został opisany przez Werbosa w 1974r. a nastepnie rozwinięty i opracowany przez Rumelharta,Hintona i Williamsa w 1986 r. stanowiąc przełom w metodach uczenia sieci neuronowych. Do dnia dzisiejszego jest jedną z najpopularniejszych i najskuteczniejszych metod uczenia sieci wielowarstwowych.
Algorytm wstecznej propagacji błędu (ang. BackPropagation) - określa przepis na dobór współczynników wagowych w sieci wielowarstwowej na podstawie znanej wartości popełnionych błędów. Oparty jest on na minimalizacji sumy kwadratów błędów uczenia z wykorzystaniem optymalizacyjnej metody największego spadku. Nazwa wsteczna propagacja pochodzi od sposobu obliczania błędów w poszczególnych warstwach sieci. Najpierw obliczane są błędy w warstwie ostatniej, następnie w warstwach przed ostatnich, kończąc na warstwie wejściowej, a więc oblicza wstecz. Przebieg całego procesu uczenia możemy opisać następująco: Algorytm rozpoczynamy od przygotowania danych uczących czyli zbioru takich danych, które w miarę dokładnie charakteryzują dany problem. Jednorazowa porcja takich danych nazywana jest wektorem uczącym. W skład wektora uczącego wchodzi wektor wejściowy (dane wejściowe) i wyjściowy (dane oczekiwane). Następnie wektor wejściowy jest przetwarzany i porównywany z otrzymanymi wartościami oczekiwanymi. Poprzez porównanie sieć otrzymuje informacje czy wynik jest poprawny lub jeżeli nie to jaki powstał błąd. Powstały błąd jest propagowany do sieci od warstwy wyjściowej do wejściowej (w odwrotnej niż wektor wejściowy kolejności) i na jego podstawie następuje taka korekcja współczynników wag w każdym neuronie, aby ponowne przetworzenie tego samego wektora wejściowego spowodowało zmniejszenie błędu odpowiedzi. Procedura taka powtarzana jest aż do momentu osiągnięcia przez sieć błędu mniejszego niż założony. Wtedy na kolejne wejście sieci podaje się kolejny wektor wejściowy i powtarza te czynności. Po przetworzeniu całego ciągu uczącego czyli procesu zwanego epoką, oblicza się błąd dla epoki i cały cykl powtarzany jest do momentu, aż błąd ten spadnie poniżej dopuszczalnego.
3. Sieć Neurolotto
Prognozowanie (predykcja) jest naukowym sposobem przewidywania, w jaki sposób będą kształtowały się w przyszłości procesy lub zdarzenia, często oparte na informacjach z przeszłości i aktualnego stanu. W prognozowaniu bada się relacje między różnymi czynnikami a badanym zjawiskiem, stosując nauki statystyczne i matematyczne często wspomagane narzędziami (programami) prognozującymi.
Jednym z takich narzędzi prognozujących jest właśnie sieć neuronowa "Neurolotto".
Charakterystyka sieci Neurolotto
Sieć Neurolotto jest jednokierunkową siecią wielowarstwową. Cechą charakterystyczną tego typu sieci jest występowanie, co najmniej jednej warstwy pośredniej tzw. warstwy ukrytej, która pośredniczy w przekazywaniu sygnałów między warstwą wejściową i wyjściową.
Interfejs naszej sieci został zaprojektowany w taki sposób aby każdy użytkownik mogł decydować ile takich warstw sieć ma zawierać i ile neuronów ma być w każdej z warstw wewnętrznych. Ilość neuronów w warstwie wejściowej i wyjściowej jest stała i nie podlega zmianom użytkownika. Przykładowo dla Multi Multi ilość neuronów w warstwie wejściowej i wyjściowej wynosi 80, a dla Lotto 49.
Rys.4. Schemat budowy sieci dla gry "Lotto".
Dzięki powyższemu rozwiązaniu użytkownicy mogą badać wpływ różnych rodzajów struktury sieci na typowania w danej grze. Należy jednak pamiętać, że zły projekt sieci może nam błędnie odpowiadać na zadawane problemy (w naszym przypadku typowania), dlatego proponujemy na początku dobierać wartości doświadczalnie.
Pozostałe informacje:
funkcja aktywacji - Funkcją aktywacji wykorzystaną w sieci Neurolotto jest tzw. "symetryczna sigmoida" - funkcja zdefiniowana jako f(x)=2/(1 + exp(-2*x)) - 1
Uczenie sieci - w sieci Neurolotto mamy do dyspozycji dwa różne algorytmy uczenia sieci neuronowej i każdy z nich stosuje propagację wsteczną. Są to algorytmy rprop w którym wagi sieci są uaktualniane na podstawie średniego błędu kwadratowego liczonego z całego zbioru uczącego oraz algorytm quickprop.
Typowania - Typowania sieci bazują na wartościach pobudzeń neuronów wyjściowych, które przyjmują wartości z przdziału <-1,1> . Każdy użytkownik ma możliwość zapoznania się z wartościami pobudzeń neuronów wyjściowych sieci która stworzył - reprezentowane są one w tabeli W.N.W.
Użytkownik powinien typować te liczby które są reprezentowane przez neurony wyjściowe o najwiekszych pobudzeniach dodatnich, ponieważ teoretycznie to one mają największe prawdopodobieństwo wylosowania. W dziale "Typowania" podawane jest w zależności od gry: 6 liczb o najwyższych wartościach neuronów wyjściowych dla gry Lotto, oraz 10 najwyższych wartości dla gry Multi Multi.
Oczywiście użytkownik dzięki tabeli W.N.W, może sam określić zakres liczb na których będzie opierał swoje przyszłe skreślenia, bez konieczności korzystania z działu "Typowania".
Opis panelu "Ustawiania"
Głównym panelem zarządzającym ustawieniami sieci neuronowej jest panel w menu "Ustawiania". Każda z dostępnych gier czyli "Lotto" i "Multi Multi" posiada oddzielne zestawy parametrów(ustawiane w panelu),a liczby generowane są przez niezależne sieci neuronowe.
Strona neurolotto.com została zaprojektowana w taki sposób aby każdy użytkownik miał możliwość ustawiania własnych parametrów dla każdej z gier. Rezultatem tych ustawień są wyniki przyszłej prognozy w menu "Typowania" i w "Tabeli W.N.W" czyli w tabeli wartości neuronów wyjściowych.
Zarówno w panelu do gry "Lotto" jak i "Multi Multi" znajdziemy identyczne nastawy parametrów sieci do których należą: ilość warstw sieci, ilość neuronów w warstwach ukrytych, algorytm uczący, współczynnik szybkości uczenia, data początku uczenia oraz data końca uczenia. Poniżej postaramy się wytłumaczyć i opisać szczegółowo każdą z nastaw:
Ilość warstw sieci (2-10) - Ta nastawa służy do ustawiania ilości warstw ukrytych w naszej sieci. Nasza sieć może się składać z maksymalnie ośmiu warstw ukrytych. Z reguły przyjmuje się, iż sieć neuronowa powinna składać się z minimum jednej warstwy ukrytej, która wystarcza do rozwiązania większości problemów w trakcie uczenia.
Oznaczenie (2-10) informuje nas o stworzonej już warstwie wejściowej i wyjściowej a różnica (2-10) to nasza ilość możliwych do stworzenia warstw ukrytych. Tak więc gdy wpiszemy w te pole wartość "3" sieć automatycznie przyjmuje model "1x1x1" czyli 1-warstwa wejściowa, 1-warstwa ukryta i 1-warstwa wyjściowa. Gdy wpiszemy wartość "4" sieć przyjuje model "1x2x1" czyli 1-warstwa wejściowa, 2-warstwy ukryte oraz 1-warstwa wyjściowa itd.
Ilość neuronów w warstwach ukrytych (1-100) - Ta nastawa służy do ustawiania ilość neuronów znajdujących się w warstwach ukrytych. Oznaczenie (1-100) informuje nas o możliwym zakresie ustawień czyli od 1 neuronu do maksymalnie 100 neuronów przypadających na jedną warstwe ukrytą.
Algorytm uczący - Dzięki tej nastawie wybieramy jeden z dwóch dostępnych algorytmów uczenia się sieci. Do naszej dyspozycji są dwa typy algorytmów:
"Propagacja wsteczna" to klasyczna wersja tego algorytmu gdzie wagi sieci są uaktualniane po każdym wzorcu uczącym(w naszym przypadku po każdym losowaniu).
"Propagacja wsteczna v2" różni się tym ,że wagi sieci są uaktualniane na podstawie średniego błędu kwadratowego liczonego z całego zbioru uczącego(w naszym przypadku po wszystkich losowaniach z wybranego okresu uczenia).
Współczynnik szybkości uczenia - Jedna z najważniejszych nastaw odpowiedzialnych za uczenie się sieci neuronowej.
Nastawa ta usprawnia proces uczenia poprzez korektę współczynników wagowych. Algorytm uczenia zawsze musi obliczyć korekty wag które są mnożone właśnie przez ten współczynnik. Przykładowo jeśli współczynnik ma wartość 0.1, to korekta zostanie dziesięciokrotnie zmniejszona. Można to porównać do nauczyciela (współczynnik) i ucznia (nasza sieć): zbyt wysoka wartość współczynnika to nauczyciel surowy, stosujący zbyt wysokie kary za drobne pomyłki. Niski współczynnik to nauczyciel zbyt łagodny, przy którym sieć uczy się bardzo powoli a jej błędy są dosyć łagodnie tolerowane.
Należy pamiętać, że zły dobór współczynnika uczenia może spowodować podawanie nietypowych wartości neuronów wyjściowych w menu "Tabela W.N.W". Zbyt łagodny współczynnik np wartość 0,1 może podawać na wyjściach same dodatnie wartości neuronów. Taki objaw jest sygnałem do zmiany współczynnika na większy, oczywiście o ile typowania według tego współczynnika nas nie satysfakcjonują.
Data początku uczenia - Jest to nastawa daty od której zacznie się proces uczenia się sieci. Dzięki tej nastawie użytkownik, może samodzielnie dobierać interesującą go datę początku uczenia dla danej gry.
Należy jednak pamiętać, iż zbyt długi okres losowań jedynie wydłuża proces uczenia, i wcale nie musi przekładać się na rezultaty naszych typowań.
Użytkownik powinien także, zwracać uwagę na zmiany maszyn losujących dla danej gry. Teoretycznie zmiana maszyny może całkowicie popsuć uczenie sieci i pogorszyć jakoś typowań.
Data końca uczenia - Jest to nastawa informująca o dacie zakończenia procesu uczenia się sieci i jest to ostatnie archiwalne losowanie danej gry. Wartość ta jest stała i użytkownik nie może jej zmieniać.
Dodatkowe informacje dotyczące nastaw parametrów znajdziesz w dziale Pytania i Odpowiedzi
4. Podsumowanie
Zdolność sieci neuronowych do uczenia się sprawia, że są one bardzo elastyczne i wydajne w rozwiązywaniu problemów z którymi inne programy nie są wstanie sobie poradzić. Sztuczne sieci neuronowe stanowią doskonałe narzędzie do prognozowania i rozpoznawania wzorców. W predykcji wykorzystanie sieci polega na wytrenowaniu ich na pewnym zbiorze danych, aby potem za jej pomocą móc przewidywać określone dane wyjściowe. Mamy zatem do czynienia z czymś w rodzaju urządzenia prognozującego.
Istotne jest to, że sieć nabiera zdolności do prognozowania wyłącznie na podstawie dostarczonych danych, nie podaje się jej natomiast żadnych wzorów lub teorii o związkach pomiędzy danymi a prognozowanymi wynikami. Można zatem sieci stosować w przypadkach, gdy nie znamy zależności pomiędzy przewidywanymi wynikami a znanymi danymi wejściowymi.
Przykładowo, jeżeli w losowaniach występują jakieś ciągle powtarzające się schematy wygranych lub anomalie np. powtórzenia wynikające z błędu konstrukcyjnego maszyny, bądź wagi piłki, sieci neuronowe są w stanie to wykryć i przewidzieć, oczywiście o ile takie anomalie istnieją. Należy pamiętać, że dobrze zorganizowane gry losowe nie dają się przewidzieć żadnymi sposobami.