Chciałbym zaproponować innej społeczności golfistów wyzwanie:
(Sztuczne) sieci neuronowe są bardzo popularnymi modelami uczenia maszynowego, które można projektować i szkolić w celu przybliżenia dowolnej (zwykle nieznanej) funkcji. Często stosuje się je do rozwiązywania bardzo skomplikowanych problemów, których nie wiemy jak rozwiązać algorytmicznie, takich jak rozpoznawanie mowy, niektóre rodzaje klasyfikacji obrazów, różne zadania w autonomicznych systemach sterowania, ... Jeśli szukasz podkładu w sieciach neuronowych, rozważ to doskonałe Artykuł w Wikipedii .
Ponieważ jest to pierwszy z serii, która, mam nadzieję, będzie serią wyzwań związanych z golfem w uczeniu maszynowym, chciałbym, aby sprawy były jak najprostsze:
W wybranym przez siebie języku i ramach projektuj i trenuj sieć neuronową, która biorąc pod uwagę oblicza swój produkt dla wszystkich liczb całkowitych x_1, x_2 między (i włącznie) -10 i 10 . - 10 10
Cel wydajnościowy
Aby się zakwalifikować, Twój model nie może różnić się o więcej niż od poprawnego wyniku dla któregokolwiek z tych wpisów.
Zasady
Twój model
- musi być „tradycyjną” siecią neuronową (wartość węzła jest obliczana jako ważona liniowa kombinacja niektórych węzłów w poprzedniej warstwie, po której następuje funkcja aktywacji),
- może korzystać tylko z następujących standardowych funkcji aktywacyjnych:
- ,
- ,
- ,
- ,
- ,
- ,
- ,
- ,
- musi przyjmować albo jako tupel / vector / list / ... liczb całkowitych albo unosi się jako jedyne wejście,
- zwraca odpowiedź jako liczbę całkowitą, liczbę zmiennoprzecinkową (lub odpowiedni kontener, np. wektor lub listę, która zawiera tę odpowiedź).
Twoja odpowiedź musi zawierać (lub link do) cały kod niezbędny do sprawdzenia wyników - w tym przeszkolone masy modelu.
Punktacja
Sieć neuronowa o najmniejszej liczbie wag (w tym wag obciążenia) wygrywa.
Cieszyć się!
źródło
f(x) = x
przesyła dane wejściowe?Odpowiedzi:
21 13 119 ciężarówOpiera się to na identyczności polaryzacji form dwuliniowych, która w rzeczywistym przypadku jednowymiarowym sprowadza się do tożsamości wielomianowej:
Więc
y1
po prostu oblicza[x+y, x-y]
za pomocą transformacji liniowej iy3
jest po prostu wartością bezwzględnąy1
jako krok wstępnego przetwarzania dla następnego: Następnie „twarda” część oblicza kwadraty, które wyjaśnię poniżej, a następnie po prostu oblicza różnicę i skalowanie, które jest znowu operacją liniową.W celu obliczenia pola I użyć wykładniczy serii , która powinna być odpowiednia dla wszystkich liczb w ciągu około . Ta seria ma formęs {0,1,2,…,20} 0.5
gdzie właśnie zoptymalizowałem dla wag=(wi)i
W2
( ). Całe to przybliżenie obejmuje ponownie tylko dwie transformacje liniowe z aktywacją wykładniczą umieszczoną pomiędzy nimi. Takie podejście powoduje maksymalne odchylenie około .0.02
Wypróbuj online!
źródło
abs
. Ale i tak wszystko jest w porządku.y0
potrzebuje 4,y1
potrzebuje 2,y3
potrzebuje 2,y4
potrzebuje 1,y5
potrzebuje 1 iy6
potrzebuje 2. To jest 12?7 ciężarków
Wypróbuj online!
Używa następującej przybliżonej równości dla małego na podstawie rozszerzenia Taylora :ϵ ex≈1+x+x22
Wybranie tyle małe, że mieści się w wymaganych granicach błędu. Zauważ, że i są stałymi wagami w kodzie.ϵ
eps
c
źródło
C = -B
(1 wagę), a następnie mieć[e_s, e_d] = conv([A,B,C], [eps, eps])
(2 ciężary), aby zaoszczędzić jedną wagę :) (BTW: Bardzo sprytne podejście!)exp
)3331 ciężarówWypróbuj online!
Powoduje to długie mnożenie w (sorta) binariach, a tym samym zwraca dokładny wynik. Powinno być możliwe skorzystanie z okna błędu 0,5, aby zagrać w golfa, ale nie jestem pewien, jak to zrobić.
Warstwy od 1 do 6 rozkładają pierwsze wejście w 5 „bitach”. Z powodów golfowych nie używamy rzeczywistych plików binarnych. Najbardziej znaczący „bit” ma wagę -15 zamiast 16, a gdy wejście ma wartość 0, wszystkie „bity” mają wartość 0,5 (co nadal działa dobrze, ponieważ zachowuje tożsamość
inputA = -15*a15 + 8*a8 + 4*a4 + 2*a2 + 1*a1
).źródło
43 ciężary
Dwa opublikowane dotychczas rozwiązania były bardzo sprytne, ale ich podejścia prawdopodobnie nie będą działać w przypadku bardziej tradycyjnych zadań w uczeniu maszynowym (takich jak OCR). Dlatego chciałbym przedstawić „ogólne” (bez sprytnych sztuczek) rozwiązanie tego zadania, które, mam nadzieję, zainspiruje innych ludzi do ulepszenia go i wciągnięcia w świat uczenia maszynowego:
Mój model jest bardzo prostą siecią neuronową z 2 ukrytymi warstwami wbudowanymi w TensorFlow 2.0 (ale każda inna struktura również by działała):
Jak widać, wszystkie warstwy są gęste (co z pewnością nie jest optymalne), funkcja aktywacji jest tanh (co może być w porządku dla tego zadania), z wyjątkiem warstwy wyjściowej, która ze względu na charakter tego zadania, ma liniową funkcję aktywacji.
Istnieją 43 wagi:
Wagi zostały wytrenowane (przy użyciu optymalizatora Adama) poprzez podejście dopasowania warstwowego: Po pierwsze, zostały one dopasowane, aby zminimalizować średni błąd kwadratu nie tylko przy mnożeniu liczb całkowitych między a ale w rzeczywistości na wejściach w pewnym sąsiedztwie wokół tych wartości . Powoduje to znacznie lepszą zbieżność ze względu na charakter opadania gradientu. Obejmowało to 400 epok treningu na 57 600 próbkach treningowych, przy użyciu partii o wielkości 32.−10 10
Następnie dopracowałem je - optymalizując pod kątem maksymalnego odchylenia w dowolnym zadaniu mnożenia liczb całkowitych. Niestety, moje nuty nie pokazują zbyt dobrego dostrajania, które skończyłem, ale było to bardzo niewielkie. W sąsiedztwie 100 epok na tych 441 próbnych ćwiczeniach, przy wielkości partii 441.
Oto wagi, z którymi skończyłem:
który ledwie osiągnął określony cel w zakresie wydajności. Maksymalne odchylenie skończyło się na czym świadczy .0.44350433 9⋅10=90.443504
Mój model można znaleźć tutaj i możesz go wypróbować online! w środowisku Google Colab.
źródło
2 ciężary
Zainspirowały mnie inne odpowiedzi, aby przybliżyć tożsamość polaryzacji w inny sposób. Trzyma to dla każdego małegoϵ>0
Dla tego wyzwania wystarczy wziąć .ϵ=0.01
Oczywista implementacja tego przybliżenia w sieci neuronowej przyjmuje wagi w . Te cztery ciężary można golfować do trzech przez faktoring . Jak wspomniałem w komentarzu powyżej, każda sieć neuronowa o ciężarach z precyzją maszynową może być golfowana w (ogromną!) Sieć neuronową z tylko dwoma wyraźnymi wagami. Zastosowałem tę procedurę, aby napisać następujący kod MATLAB:{±ϵ,±(4ϵ2)−1} {±ϵ,(4ϵ3)−1} ±(4ϵ2)−1=±ϵ⋅(4ϵ3)−1
Podsumowując, ta sieć neuronowa składa się z 1250 010 ciężarów, z których wszystkie mieszczą się w .{±0.1}
Jak uciec z zaledwie 1 wagą (!)
Okazuje się, że można symulować dowolną sieć neuronową o masie w z większą siecią neuronową, która ma tylko jedną wagę, a mianowicie . Rzeczywiście, mnożenie przez można zaimplementować jako{±0.1} −0.1 0.1
gdzie to wektor kolumny pozycji, wszystkie równe . W przypadku sieci neuronowych, w których połowa wag jest dodatnia, ta transformacja wytwarza sieć neuronową, która jest razy większa.w 10 −0.1 10.5
Oczywiste uogólnienie tej procedury przekształci każdą sieć neuronową o ciężarze w w większą sieć neuronową o pojedynczej wadze . W połączeniu z procedurą opisaną w moim komentarzu powyżej utrzymuje zatem, że każda sieć neuronowa o ciężarach precyzyjnych maszynowo może zostać przekształcona w sieć neuronową o pojedynczej wadze.{±10−k} −10−k
(Być może powinniśmy zmodyfikować sposób, w jaki ponownie wykorzystywane wagi są oceniane w przyszłych wyzwaniach golfowych sieci neuronowych).
źródło