Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
Dobór optymalnej architektury
Teoretyczne Podstawy Informatyki - Rok I - kierunek IS w IFAiIS UJ /2006 Sieci Neuronowe Wykład 8 Dobór optymalnej architektury i danych uczących część I wykład przygotowany na podstawie. S. Osowski, “Sieci Neuronowe w ujęciu algorytmicznym ”, Rozdz. 3, PWNT, Warszawa 1996. Elzbieta Richter-Was
2
Dobór optymalnej architektury
Przystępując do rozwiązywania problemu przy wykorzystaniu sieci neuronowej wielowarstwowej należy, oprócz dobrania danych uczących zaprojektować strukturę sieci, dopasowana do danego zagadnienia. Oznacza to wybór liczby warstw sieci i neuronów w warstwie oraz powiązań miedzy warstwami. Dobór liczby neuronów w warstwie wejściowej jest uwarunkowany wymiarem wektora danych x. Podobnie jak w warstwie wyjściowej, w której liczba neuronów równa się wymiarowi wektora zadanego d. Problemem pozostaje dobór warstw ukrytych i liczby neuronów w każdej warstwie.
3
Dobór optymalnej architektury
Dobór liczby neuronów w warstwach ukrytych formalnie można zdefiniować jako problem matematyczny aproksymacji funkcją wielu zmiennych. Sieć neuronowa pełni funkcje układu aproksymującego dane uczące (x,d). W trakcie uczenia dobierane są współczynniki funkcji (wektory wag poszczególnych neuronów). Na etapie odtwarzania, przy ustalonych wartościach wag, następuje zwykle obliczenie wartości funkcji aproksymującej przy danym wektorze wejściowym.
4
Dobór optymalnej architektury
Określenie minimalnej liczby warstw ukrytych opiera się na właściwościach funkcji aproksymujących. Każda funkcja zadana g(x) może być wyrażona jako liniowa kombinacja lokalnych impulsów, które maja wartość różną od zera jedynie w małym otoczeniu aktualnej wartości x. Funkcja impulsowa określonego kształtu może być wygenerowana jako superpozycja dwóch funkcji przesuniętych względem siebie. Dwie identyczne sigmoidy S1 i S2 przesunięte względem siebie tworzą w wyniku odcięcia impuls w taki sposób, aby pojawiał się w zadanym miejscu, miał odpowiednia szerokość i stromość narastania. Do realizacji tego typu kształtowania impulsów należy zastosować sieć neuronową dwuwarstwową, w której neurony wyjściowe mogą być liniowe.
5
Dobór optymalnej architektury
W przypadku sieci dwuwejściowej można w identyczny sposób ukształtować impuls na płaszczyźnie. Różnica dwóch funkcji sigmoidalnych zdefiniowanych jako funkcja dwu zmiennych i przesuniętych względem siebie tworzy grzbiet o nieskończonej długości trwania. Dodając następna parę funkcji sigmoidalnych przesuniętych względem poprzedniej i tworząc ich różnicę można otrzymać drugi grzbiet o nieskończonej długości. Dobierając parametry obu funkcji sigmoidalnych w taki sposób aby grzbiety tworzyły ze sobą pewien kat, można otrzymać w wyniku zsumowania obu grzbietów kształt dwuwymiarowego garbu. W miejscu przecięcia obu grzbietów powstaje dwuwymiarowy kształt impulsu zakończony z 4 stron odejściami ciągnącymi się do nieskończoności których usunięcie jest możliwe przez zastosowanie sigmoidalnej funkcji aktywacji neuronu z odpowiednio dobranym progiem.
6
Dobór optymalnej architektury
Siec neuronowa o dwu wejściach, powstała w ten sposób, zawiera warstwę ukrytą, złożoną z 4 neuronów, oraz warstwę wyjściową, zawierającą 1 neuron typu sigmoidalnego, realizujący równocześnie etap dodawania sygnałów wszystkich 4 neuronów oraz odcinania odejść przez zastosowanie funkcji aktywacji z odpowiednim progiem.
7
Twierdzenie Kolmogorowa
Uogólnienie na wypadek wielowymiarowy jest znany w teorii sieci neuronowych pod nazwa twierdzenia Kolmogorowa. Ograniczając się do funkcji ciągłej przekształcającej N-wymiarowy zbiór danych wejściowych x w M-wymiarowy wektor wyjściowy d, udowodniono, w sensie istnienia rozwiązania, że aproksymacja tego typu jest możliwa przy użyciu sieci o jednej warstwie ukrytej. Przy N wejściach wystarczy użycie (2 N + 1) neuronów w warstwie ukrytej. W dowodzie twierdzenia przyprowadzonym przez Kolmogorowa, dotyczącego ogólnej teorii aproksymacji, przyjęto że sygnały wyjściowe poszczególnych warstw opisane są zależnościami: zk = Aj (xj +bj) + B0k dla neuronów warstwy ukrytej przy k=1,2, ,2N+1, oraz yi = Ck g (zk +dk) + D0i dla neuronów warstwy wyjściowej. N j=1 N j=1
8
Twierdzenie Kolmogorowa
RYSUNEK Postać sieci neuronowej odpowiadającej twierdzeniu Kolmogorowa.
9
Twierdzenie Kolmogorowa
Wynik uzyskany dzięki teorii Kolmogorowa jest wyjątkowo ważny, gdyż dowodzi istnienia rozwiązania problemu aproksymacji funkcji wielu zmiennych przez superpozycje wielu funkcji jednej zmiennej i daje podstawy określenia architektury sieci neuronowej. Samo proste zastosowanie twierdzenia Kolmogorowa nie prowadzi jednak do optymalnych rozwiązań. Zarówno liczba warstw jak i neuronów w warstwie w rozwiązaniach uznawanych za optymalne mogą znacznie różnić się od wyniku uzyskanego dzięki teorii Kolmogorowa. Przyjęcie różnych funkcji bazowych ma wpływ zarówno na algorytm doboru współczynników liczbowych założonych w aproksymacji, jak i na sama liczbę składników sumy.
10
Zdolności uogólniania sieci wielowarstwowej
Przy poszukiwaniu optymalnej architektury sieci wielowarstwowej jednym z najważniejszych zagadnień jest problem zdolności uogólniania sieci. Proces uczenia polegający na minimalizacji funkcji celu E(W) dotyczy zbioru uczącego L, dla którego E(W) = EL(W) = E(yk(W), dk) przy czym p jest liczbą par uczących (xk, dk), yk – wektorem odpowiedzi sieci na wymuszenie w postaci xk. Minimalizacja tej funkcji zapewnia dobre dopasowanie odpowiedzi sieci do wartości zadanych, ale dla zbioru uczącego. Rzeczywistym celem uczenia jest taki dobór architektury i parametrów sieci, który zapewni minimum błędu dla zbioru testującego, a więc zminimalizuje błąd tzw. uogólniania (generalizacji). p k=1
11
Zdolności uogólniania sieci neuronowej
Podstawową cechą sieci neuronowej jest jej zdolność do uogólniania, a więc generowania właściwego rozwiązania dla danych, które nie pojawiły się w zestawie danych uczących. Sieć zostaje poddana uczeniu na zbiorze L z bieżącym sprawdzeniem stopnia uczenia na zbiorze V. Zdolność odtworzenia zbioru L przez sieć jest miarą zdolności zapamiętania danych uczących, natomiast zdolność do generowania właściwych rozwiązań dla danych należących do zbioru T, na których sieć nigdy nie była trenowana, jest miarą zdolności uogólniania. Zakłada się że dane tworzące zarówno zbiór L jak i zbiór T są typowymi reprezentantami zbioru danych. R T L V R – zbiór danych wejściowych T - zbiór testujący (testing) L - zbiór uczący (learning) V - zbiór danych sprawdzających (validation)
12
Zdolności uogólniania sieci neuronowej
Ilościowa miara uogólniania jest pojęciem trudnym do zdefiniowania i jest oparta na zależnościach statystycznych odnoszących się do zbiorów. Podstawową wielkością jest tu miara Vapkina-Chervonenkisa, zwana w skrócie VCdim. Miara VCdim systemu została zdefiniowana jako liczebność największego zbioru S danych wzorców, dla których system może zrealizować wszystkie możliwe 2n dychotomii zbioru S (podział zbioru na dwie części przy pomocy lini). Na przykład VCdim dla neuronu o dwóch wejściach wynosi n=3. Można wykazać, że zbiór złożony z trzech danych uczących jest największym zbiorem, w którym można przeprowadzić podział na dwie liniowo separowalne grupy na 23 sposobów.
13
Zdolności uogólniania sieci neuronowej
Zwiększenie o jeden rozmiaru próbek uczących powoduje, że 2 neurony nie są w stanie zrealizować wszystkich 24 podziałów liniowo separowanych. W ogólności dla neuronu o N wejściach (wektor x N-elementowy) miara VCdim wynosi N+1. Innymi słowy, miara VCdim dla sieci rozwiązującej problem klasyfikacji binarnej oznacza maksymalna liczbę danych uczących, które mogą zostać bezbłędnie odtworzone we wszystkich możliwych konfiguracjach. Niech vL(W) oznacza błąd uczenia sieci, czyli częstotliwość wystąpienia błędu klasyfikacji podczas procesu uczenia, a P(W) – średnie prawdopodobieństwo wystąpienia błędnej klasyfikacji podczas uczenia. Oznaczając przez e wartość dopuszczalnego błędu wykazano, że Prob{|P(W) –vL(W)| > e} 0 jeśli liczba próbek uczących p , przy czym Prob{} oznacza prawdopodobieństwo zdarzenia.
14
Zdolności uogólniania sieci neuronowej
Niech oznacza prawdopodobieństwo zdarzenia sup |P(W) – vL(W) | > prawdopodobieństwo to zostało oszacowane w postaci = (2pe/h)h exp(- e2p) przy czym e jest liczba Eulera, p-liczba próbek uczących, a h aktualna wartością VCdim. Oznaczając przez e0 wartość e spełniającą relacje przy przy zadanej wartości otrzymuje się e0 = sqrt{ h/p [ ln(h/2p) + 1] – 1/p ln() } Wartość e reprezentuje przedział ufności. Przedział ten jest funkcją aktualnej miary VCdim, liczby próbek uczących p oraz wartości i nie zależy od błędu uczenia sieci vL(W). Miara ta obowiązuje tylko w przypadku dopuszczenia dużych wartości P(W). W
15
Zdolności uogólniania sieci neuronowej
Przy wymaganiu małych wartości P(W) zmodyfikowana definicja przedziału ufności ( oznaczona przez 1 ) zależy również od błędu uczenia vL(W) i przybiera postać. 1 = 02 ( 1 + sqrt{1 + vL(W)/02} ) Na podstawie zdefiniowanych przedziałów ufności można stwierdzić, że w ogólności, przy małym poziomie błędu uczącego vL(W), średnie prawdopodobieństwo wystąpienia błędu klasyfikacji spełnia nierówność P(W) < vL(W) + 1 Przy bardzo dużych błędach uczenia vL(W), dokładniejszą estymatę średniego prawdopodobieństwa wystąpienia błędu klasyfikacji określa relacja P(W) < vL(W) + 0
16
Zdolności uogólniania sieci neuronowej
Podobnie jak błąd uczenia, definiuje się błąd uogólniania vg(W) jako częstotliwość wystąpienia błędu podczas testowania zbioru na danych testujących. Przy liczbie próbek uczących p > h (h – aktualna wartość VCdim sieci poddanej uczeniu) z prawdpodobienstwem (1- ) błąd uogólnienia jest mniejszy niż vgm(W), vg(W) vgm(W), przy czym vgm(W) = vL(W) + 1 Przy stałej liczbie próbek p i wzrastającej wartości miary VCdim błąd uczenia vL(W) maleje monotonicznie, a przedział ufności 1 rośnie. W efekcie maksymalny błąd uogólniania osiąga minimum. Zakres VCdim < hopt odpowiada nadmiarowości danych bieżących względem aktualnej wartości VCdim. Zakres VCdim > hopt odpowiada zbyt malej liczbie danych uczących przy aktualnej wartości VCdim. RYSUNEK
17
Zdolności uogólniania sieci neuronowej
W przypadku ustalonej wartości VCdim błąd uogólniania zależy w istotnym stopniu od liczby próbek uczących. Dla zapewnienia odpowiednio małej wartości tego błędu liczba próbek musi spełniać odpowiednie proporcje względem VCdim. Dla każdego rodzaju sieci jest to oddzielny problem. Szczególnie jaskrawo występuje on w przypadku sieci wielowarstwowej, gdzie liczba wag jest zwykle bardzo duża w stosunku do liczby neuronów. Trudność: oszacowanie wartości VCdim dla dowolnej sieci. W praktyce, dla uzyskania dobrych zdolności uogólniania sieci należy ograniczać liczbę neuronów ukrytych oraz powiązań miedzy neuronowych, jak również stosować takie metody wstępnego przetwarzania danych, które umożliwiają zmniejszenie wymiarowości wektora wejściowego sieci. Każdy z tych czynników, pośrednio lub bezpośrednio, wpływa na zmniejszenie efektywnej liczby wag sieci neuronowej.
18
Zdolności uogólniania sieci neuronowej
Wpływ sposobu i czasu uczenia na zdolności uogólniania W ogólnym przypadku wraz z upływem czasu uczenia błąd uczenia vL(W) maleje i błąd testowania vV(W) również (przy ustalonej wartości liczby próbek uczących p oraz miary VCdim). Od pewnego momentu błąd testowania pozostaje stały, natomiast błąd uczenia nadal maleje. W ostatnich fazach procesu uczenia nieregularności w danych odbiegające od cech charakterystycznych danego procesu zaczynają odgrywać role i powodują wzrost błędu testowania. RYSUNEK Tendencje te (przeuczenie) jest tym silniejsze im większe nadmiarowości wag występuje w sieci. Te “niepotrzebne” wagi dopasowywują się do nieregularności danych uczących, traktując je jako cechę główną. Ważne jest aby kontrolować proces uczenia przez przeplatanie go z procesem testowania, jak daleko jest zaawansowany proces uczenia.
19
Zdolności uogólniania sieci neuronowej
Błąd uogólniania może być oszacowany na podstawie błędu uczenia vL(W) oraz tzw. przedziału ufności 1 vG(W) vL(W) + 1 (p/h, vL) Mała liczba próbek uczących przy ustalonej wartości h oznacza bardzo dobre dopasowanie sieci do próbek uczących ale złe uogólnienie bo w procesie uczenia nastąpił nadmiar parametrów dobieranych. Zadanie aproksymacji zostało niejako sprowadzone do zagadnienia interpolacji. p-ilosc probek, K – liczba neuronow w warstwie ukrytej RYSUNEK p=40, K=20 p=40, K=5 p=40, K=2 Rosądnym rozwiązaniem jest wówczas redukcja stopnia złożoności sieci prowadzaca do zmniejszenia miary VCdim.
20
Zdolności uogólniania sieci neuronowej
Nie istnieje prosty związek miedzy architekturą sieci wielowarstwowej a miarą VCdim. Można podać oszacowanie w postaci 2 int(K/2) N VCdim 2 Nw (1 + log Nn) gdzie N – wymiar wektora wejściowego, K- liczba neuronów w warstwie ukrytej, Nw - całkowita liczba wag w sieci, Nn – całkowita liczba neuronów w sieci. Dolna granica przedziału jest w przybliżeniu równa liczbie wag łączących warstwę wejściową z warstwą ukrytą, górna granica natomiast jest większa niż dwukrotna liczba wszystkich wag w sieci. Na ogół przyjmuje się oszacowanie, że VCdim Nw. Dla sieci o sigmoidalnych ciągłych funkcjach aktywacji przyjmuje się VCdim 2 Nw. Szacunkowe przyjęcie VCdim umożliwia ocenę minimalnego wymiaru zbioru uczącego p. Dobre zdolności uogólniania występują jeżeli p 10 VCdim.
21
Zdolności uogólniania sieci neuronowej
Sam proces uczenia powinien być powiązany ze sprawdzaniem zdolności do uogólniania, a więc powinien zawierać “fazę uczącą” i “fazę sprawdzającą”. Proces uczenia kontynuuje się do chwili uzyskania minimum funkcji celu lub dopóki błąd testowania nie zacznie wzrastać (wskazując na przeuczenie). Dobór liczby neuronów w warstwie (warstwach) ukrytych jest kluczowym zagadnieniem, decydującym o właściwościach uogólniających sieci. Są możliwe dwa kierunki działań: Zakłada się wstępną liczbę neuronów ukrytych, opartą bądź na teorii Kolmogorowa, bądź na dotychczasowych doświadczeniach, a następnie przeprowadza się redukcję w trakcie uczenia sieci. Stratuje się z minimalną liczbę neuronów ukrytych i stopniowo następuje proces ich dodawania aż do uzyskania dobrego stopnia wytrenowania na zbiorze uczącym. Proces dodawania jest zazwyczaj połączony ze sprawdzaniem zdolności do uogólniania sieci na podzbiorze V.
22
Metody redukcji sieci Zadaniem redukcji sieci jest zmniejszanie liczby neuronów ukrytych oraz powiązań miedzy neuronowych. Uzyskuje się w ten sposób poprawę zdolności uogólniania. RYSUNEK siec siec Wektor wejsciowy (x1, x2). Siec , 671 wag, 31 danych. Zbyt mala ilosc danych uczacych. W procesie uczenia wiekszosc wag dobrana dowolnie, przypadkowe dopasowanie do nieistotnych szczegolow.
23
Metody redukcji sieci Podstawę redukcji sieci (pruning) stanowią algorytmy podejmujące decyzje co do obcięcia wagi lub redukcji neuronów w trakcie procesu uczenia. Większość stosowanych obecnie algorytmów może być zakwalifikowana do dwóch grup: Szacuje się wrażliwość funkcji względem wagi lub neuronu. Wagi o najmniejszej wrażliwości, wpływając najmniej na funkcje celu, są usuwane, a proces uczenia kontynuowany na tak zredukowanej sieci. Modyfikuje się funkcję celu wprowadzając kary za nieefektywną strukturę. Najczęściej do definicji funkcji celu wprowadza się składniki faworyzujące małe amplitudy wag, zmuszając algorytm uczący w trakcie uczenia do ich ciągłej redukcji. Metoda ta jest mniej efektywna niż pierwsza, bo małe wartości wag niekoniecznie muszą oznaczać mały ich wpływ na działanie sieci.
24
Metody wrażliwosciowe redukcji
Parametrem, na podstawie którego podejmuje się decyzje co do eliminacji wagi (redukcji złożoności sieci) jest wrażliwość funkcji celu na dane połączenie synaptyczne. Do określenia wrażliwości neuronu wprowadzamy współczynnik i dla każdej wagi. Wyjściowy sygnał –tego neuronu określa się na podstawie zmodyfikowanej zależności yi = f ( Wij j yj ) w której Wij jest waga od j-tego do i-tego neuronu, yj oraz yj oznaczają sygnały wyjściowe odpowiednich neuronów a f() oznacza funkcje aktywacji. Przy wartości i = 0 nie ma połączenia Wij , przy j = 1 występuje stan normalny pracy sieci. j
25
Metody wrażliwosciowe redukcji
Ważność połączenia synaptycznego opisanego waga Wij , jest oceniana na podstawie wrażliwości bezwzględnej funkcji celu E względem współczynnika j. rj = - E / j dla wartości j = 1. Jest to równoznaczne wyznaczeniu składnika gradientu funkcji celu względem wagi Wij, określanym zwykłą metodą propagacji wstecznej. Waga Wij, jest obcinana jeżeli wartość rj zmniejszy się poniżej określonego progu. j
26
Metody wrażliwosciowe redukcji
Zwykle, dla zapewnienia stabilności procesu wartość współczynnika rj w k-tym cyklu oblicza się w postaci skumulowanej, korzystając ze wzoru rj (k) = 0.8 rj (k - 1) E / j Inna metoda redukcji wrażliwości, przyjmuje miarę półwzględną współczynnika wrażliwości Sij, zdefiniowana w postaci Sij = - (E(Wf) – E(0) ) / ( Wij,f – Wij,0 ) Wij,f gdzie Wf oznacza wektor końcowy wag sieci (po zakończeniu procesu uczenia), Wij,0 jej zerowa wartość po usunięciu z sieci, E(Wf) jest oznaczeniem wartości funkcji celu po zakończeniu procesu uczenia, a E(0) wartością funkcji celu po zakończeniu procesu uczenia i usunięciu wagi Wij.
27
Metody wrażliwosciowe redukcji
Zamiast dodatkowych obliczeń wymaganych do wyznaczenia funkcji wrażliwości Sij, stosuje się jej aproksymacje, uwzględniającą wszystkie zmiany wagi w procesie uczenia. Przybliżona wartość Sij jest określana ze wzoru Sij - E/ Wij Wij (k) /( Wij,f – Wij,0 ) Po przeprowadzeniu procesu uczenia sieci każda waga Wij ma określoną skumulowana wartość wrażliwości Sij. Połączenia synaptyczne o najmniejszych wartościach Sij są usuwane, a siec po redukcji podlega powtórnemu douczeniu. W obu przedstawionych metodach jest możliwe usunięcie neuronu z warstwy, jeśli wszystkie wagi dochodzące lub odchodzące od niego zastaną wyeliminowane. nc k=1
28
Metoda ODB (Optimal Brain Damage)
Punktem wyjścia jest rozwiniecie funkcji celu w szereg Taylora w otoczeniu aktualnego rozwiązania. E = gi Wi + ½ [ hii [ Wii ]2 + hij Wi Wj ] + O(|| W ||2) w którym Wi oznacza perturbacje wagi i-tej, gi – i ty wskaźnik wektora gradientu względem tej wagi, gi = E/ Wi , hij= 2E/ Wi Wj. Ponieważ obcinanie wag dotyczy sieci już wytrenowanej, składowe gradientu są bliskie zeru (wytrenowanie oznacza ze minimum funkcji celu zostało osiągnięte) i mogą zostać pominięte w rozwinięciu. Ostatni składnik również może zostać pominięty. Otrzymujemy więc przybliżony wzór E ½ [ hii [ Wii ]2 + hij Wi Wj ] ij ij
29
Metoda ODB (Optimal Brain Damage)
Dla uproszczenia przyjmuje się że tylko diagonalne elementy hii są istotne. Miarą ważności danego połączenia synaptycznego pozostaje współczynnik Sij = ½ 2E/ W2ij W2ij. Obcięciu podlegają wagi o najmniejszej wartości tego współczynnika. ij
30
Procedura ODB Procedurę ODB redukcji sieci można przedstawić następująco. 1. Selekcja wstępna struktury sieci neuronowej (wstępny wybór liczby neuronów w poszczególnych warstwach). 2. Przeprowadzenie programu uczenia tak dobranej sieci przy zastosowaniu dowolnej metody gradientowej uczenia 3. Określenie elementów diagonalnych hkk = 2E/ W2ij odpowiadających każdej wadze Wij sieci (sumowanie po wszystkich połączeniach synaptycznych którym przypisana jest waga Wij, “shared weight”) 4. Obliczenie parametru Sij = ½ hkk Wij określającego znaczenie danego połączenia synaptycznego dla działania sieci. 5. Posortowanie wag wg. przypisanych im parametrów Sij i obcięcie tych których wartości są najmniejsze. 6. Kilkakrotne powtórzenie procedury 2-5. Metoda ODB uważana jest za jedną z najlepszych metod redukcji sieci spośród metod wrażliwosciowych.
31
dla danych testujacych
Procedura ODB Przykład zastosowania procedury ODB dla sieci rozpoznającej ręcznie pisane kody pocztowe. Sieć miała 105 połączeń synaptycznych, którym zostało przypisane 2578 różnych wag (część wag była wspólna). RYSUNEK dla danych uczacych dla danych testujacych bez douczenia po obcieciu wag blad douczenie po obcieciu wag
32
Procedura ODB Przy zastosowaniu metody ODB uzyskuje się bardzo dobre własności uogólniające sieci, niewiele odbiegające od błędu uczenia. Szczególnie dobre wyniki uzyskuje się dzięki powtórzeniu douczenia sieci po obcięciu najmniej znaczących wag. Ulepszeniem metody ODB jest opracowana 3-lata pozniej metoda OBS ( Optimal Brain Surgeon ). Punktem wyjscia jest rozwiniecie w szereg Taylora (podobnie jak w metodzie ODB) . Podstawowa roznica metody OBS w stosunku do ODB jest inna definicja wspolczynnika asymetrii (ktory sluzy do podjecia decyzji o eleminacji danego polaczenia synaptycznego) oraz korekta wag sieci po wyeliminowaniu wagi o najmniejszym znaczeniu. Osiagniete uprzednio minimum zostaje zachowane. Metoda ta ma znacznie wieksza zlozonosc obliczeniowa.
33
kontynuacja na nastepnym wykladzie
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.