Aktywne Wpisy

Sylvio19 +311
Treść przeznaczona dla osób powyżej 18 roku życia...

Przed
źródło: Screenshot_2024-07-26-03-00-23-098_com.ss.android.ugc
PobierzSkopiuj link
Skopiuj link

źródło: Screenshot_2024-07-26-03-00-23-098_com.ss.android.ugc
PobierzWykop.pl
Mam takie zadanie do wykonania, jestem newbie i zastanawiam sie nad generalnym podejsciem/architektura:
Generowanie textu na podstawie podprzednio widzianych zdan oraz przekazanego kontekstu (slowa kluczowe).
W pierwszym przypadku jak rozumiem, moge zastosowac jakas rekurencyjna warstwe np LSTM, GRU, zmapowac zdania na chary i jako cel ustawic wybor kolejnej litery - zrobiem pare takich.
Ale w jaki sposob moge przekazac konktekst wypowiedzi? Np. uczenie generowania zdan ala Shakespear lub Nietzsche? Zalozmy ze dane wejsciowe bede mial dodatkowo otagowane taka statyczna flaga oznaczajaca autora.
paperwithcode
OpenML
Github
h0 to jest stan początkowy dla komórki rnn. Potem komórka wczytuje po kolei tokeny (czyli zakodowane znaki / wyrazy) i przy każdym zmienia ten stan na kolejny.
Najpierw skup się na tym jak działają LSTM, potem czym jest atencja (xD), a potem jak działa Transformer.
Mam do Ciebie dwa pytania, skoro tak:
1) Dlaczego lepiej jest kodować całe wyrazy niż litery? Generalnie nie mam zbyt dużo danych, ok 20k zdań z tagami opisującymi każde z nich - może powiem totalną głupotę - czy nie lepiej w takim wypadku stosować pojedyncze litery?
2) Dostałem początkowe info
Kodować całe wyrazy jest lepiej po prostu dlatego, że wtedy sekwencja jest o wiele krótsza. Jak napiszesz zdanie "Ala ma kota" to zakodowanie tego wyrazami da Ci sekwencję o długości 3, a znakami 11. I odwrotnie, stworzenie tego zdania przez model będzie wymagało wygenerowania 3 wartości zamiast 11.
Seq2seq to inaczej architektura encoder-decoder, może pod tym hasłem znajdziesz więcej
1) mój problem nie jest klasycznym Seq2Seq -> oglądałem jakiegoś mądrego azjatę na YT i przedstawiał tam różne struktury RNN. Wspomniany wyżej zakłada, że Input jest sekwencyjny, jak w przypadku np. tłumaczenia zdań z angielkiego na polski (w wielkim uproszczeniu jak rozumiem). Powiedział także o modelu One2Many, który oparł o generowanie muzyki "po jednej nutce" lub na przykład gatunku muzycznym.
2) W przełożeniu na mój problem, "pierwsza nutka" - tutaj, litera, może być losowa, a gatunek muzyczny - wektorem z tagami do tekstu. Sieć będzie generować kolejne frazy na podstawie wygenerowanych wcześniej + przekazywanego stanu z poprzedniej iteracji.
A więc dopiero po 3 dniach wertowania neta, chyba zrozumiałem co miałaś na myśli mówiąc, że mogę zakodować tagi jako h0 (。◕‿‿◕。) Całe clue moich starań - zakodować występujące tagi do uporządkowanego one-hot vectora, zrobić embedding na wymiar warstwy ukrytej i przekazywać
Embeddings to przypisanie każdemu elementowi (w tym wypadku literze albo słowu) wektora n liczb. Można na to patrzeć, jak na współrzędną tego elementu w n-wymiarowej przestrzeni. Na początku, gdy inicjujemy losowo, te elementy są porozrzucane w tej przestrzeni chaotycznie i bez sensu.
W trakcie treningu te współrzędne są zmieniane w taki sposób, że podobne elementy zaczynają się do siebie zbliżać, a odsuwać od elementów kompletnie z nimi niezwiązanych. I tak słowo "kot" w miarę trenowania będzie coraz bliżej słowa "pies", ale coraz dalej słowa "śpiewać". Nasz słownik zostanie uporządkowany wg
(autor, zdanie) -> (następne zdanie)
Jeśli kodujesz całe słowa, to możesz po prostu scalić autora i zdanie w jeden string, tak że słowo reprezentujące autora będzie zawsze na pierwszym miejscu. Więc twój przykład będzie wyglądał
Mój zbiór danych to komentarze do zdjęć - każde zdjęcie jest otagowane kilkoma słowami kluczowymi (np. animal, ecology). Same komentarze są raczej jednozdaniowe i mało skomplikowane (Instagram :P), aczkolwiek problematyczny moze być fakt, że jest w nich dużo emotek (które być może wyfiltruję, jeśli okaże się to zbyt złożony problem ( ͡° ʖ̯ ͡°)). Mam około 20k danych, czyli niezbyt wiele (sam je 'pozyskuję' i nie idzie to zbyt szybko), ale w moim przypadku to problem akademicki właśnie, także na sam start efekt nie musi być zwalający z nóg :P Przykład:
'ecology, dog, nature, happy' -> 'omg such a lovely doggo <3'
'ecology, dog, nature, happy' -> 'i
W zasugerowanym przykladzie bez RNN, jak rozumiem, zakladam kodowanie literowe.
Input = array[200], gdzie 1 sa tylko uzywane tagi, np. input[34] = 1, bo ecology tam zakodowalem.
Przepuszczam calosc przez warstw Dense
Jak już zrobisz wszystko tak, że będzie działało i się uczyło, to będziesz mógł eksperymentować. Np zamiast warstwy wyjściowej wsadzić kilka warstw rnn. Potem dodać atencję. Albo zamiast wejścia multi-hot zrobić embedding-bag (zsumowane embeddings). Albo zrobić
PS: Bede mogl sie w przyszlosci jeszcze Cie podpytac o te rnn? Bo prawde mowiac, nadal nie mam pojecia jak to osadzic w tej architekturze (。◕‿‿◕。)
input - one hot encoded tags : [1,1,0,0 ... 0] - dlugosc to 200, od poczatku sa najczesciej uzywane (jako ciekawostka powiem Ci, ze calkiem wysoko w tematach ekologicznych jest #leonardodicaprio :P )
output - lista liter o dlugosci 40 znakow : [12, 53, 13, 1, 43 ... 0,0] - zerami oznaczylem padding do zalozonej dlugosci 40 - co ciekawe mediana to 28