11 KiB
Modelowanie języka – laboratoria
29 maja 2024
11. _Ensemble modeli
W jaki sposób można polepszyć wynik predykcji dla zadania uczenia maszynowego?
Metody zbiorcze (_ensemble) polegają na agregacji predykcji różnych modeli, aby uzyskać wynik lepszy niż dla każdego z modeli z osobna.
!mkdir dev-0-ireland-news
mkdir: cannot create directory ‘dev-0-ireland-news’: File exists
Mamy wyzwanie:
!wget https://github.com/kubapok/ireland-news-word-gap/raw/11c72875023c5c01c9d0c0ca39d72c90c840aeb3/dev-0/out.tsv
!mv out.tsv ./dev-0/out-solution1.tsv
!wget https://github.com/kubapok/ireland-news-word-gap/raw/0c6557c8a3cd6d8c77f64618850b2ae82c19476a/dev-0/out.tsv
!mv out.tsv ./dev-0/out-solution2.tsv
! ( cd dev-0 ; wget https://git.wmi.amu.edu.pl/kubapok/ireland-news-word-gap-prediction/raw/branch/master/dev-0/expected.tsv)
--2022-05-13 13:23:05-- https://github.com/kubapok/ireland-news-word-gap/raw/11c72875023c5c01c9d0c0ca39d72c90c840aeb3/dev-0/out.tsv Resolving github.com (github.com)... 140.82.121.4 Connecting to github.com (github.com)|140.82.121.4|:443... connected. HTTP request sent, awaiting response... 302 Found Location: https://raw.githubusercontent.com/kubapok/ireland-news-word-gap/11c72875023c5c01c9d0c0ca39d72c90c840aeb3/dev-0/out.tsv [following] --2022-05-13 13:23:06-- https://raw.githubusercontent.com/kubapok/ireland-news-word-gap/11c72875023c5c01c9d0c0ca39d72c90c840aeb3/dev-0/out.tsv Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.111.133, 185.199.108.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 63249692 (60M) [text/plain] Saving to: ‘out.tsv’ out.tsv 100%[===================>] 60,32M 26,7MB/s in 2,3s 2022-05-13 13:23:08 (26,7 MB/s) - ‘out.tsv’ saved [63249692/63249692] --2022-05-13 13:23:09-- https://github.com/kubapok/ireland-news-word-gap/raw/0c6557c8a3cd6d8c77f64618850b2ae82c19476a/dev-0/out.tsv Resolving github.com (github.com)... 140.82.121.4 Connecting to github.com (github.com)|140.82.121.4|:443... connected. HTTP request sent, awaiting response... 302 Found Location: https://raw.githubusercontent.com/kubapok/ireland-news-word-gap/0c6557c8a3cd6d8c77f64618850b2ae82c19476a/dev-0/out.tsv [following] --2022-05-13 13:23:09-- https://raw.githubusercontent.com/kubapok/ireland-news-word-gap/0c6557c8a3cd6d8c77f64618850b2ae82c19476a/dev-0/out.tsv Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.111.133, 185.199.108.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 63271863 (60M) [text/plain] Saving to: ‘out.tsv’ out.tsv 100%[===================>] 60,34M 45,1MB/s in 1,3s 2022-05-13 13:23:10 (45,1 MB/s) - ‘out.tsv’ saved [63271863/63271863] --2022-05-13 13:23:11-- https://git.wmi.amu.edu.pl/kubapok/ireland-news-word-gap-prediction/raw/branch/master/dev-0/expected.tsv Resolving git.wmi.amu.edu.pl (git.wmi.amu.edu.pl)... 150.254.78.40 Connecting to git.wmi.amu.edu.pl (git.wmi.amu.edu.pl)|150.254.78.40|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 866583 (846K) [text/plain] Saving to: ‘expected.tsv.1’ expected.tsv.1 100%[===================>] 846,27K 1,91MB/s in 0,4s 2022-05-13 13:23:11 (1,91 MB/s) - ‘expected.tsv.1’ saved [866583/866583]
!wget https://gonito.net/get/bin/geval
!chmod u+x geval
--2022-05-13 13:23:12-- https://gonito.net/get/bin/geval Resolving gonito.net (gonito.net)... 150.254.78.126 Connecting to gonito.net (gonito.net)|150.254.78.126|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 12860136 (12M) [application/octet-stream] Saving to: ‘geval.1’ geval.1 100%[===================>] 12,26M 2,67MB/s in 4,1s 2022-05-13 13:23:16 (2,97 MB/s) - ‘geval.1’ saved [12860136/12860136]
!./geval --metric PerplexityHashed -o ./dev-0/out-solution1.tsv -e dev-0/expected.tsv
35.05218788086649
!./geval --metric PerplexityHashed -o ./dev-0/out-solution2.tsv -e dev-0/expected.tsv
33.47429048442195
with open('./dev-0/out-solution1.tsv') as s1, open('./dev-0/out-solution2.tsv') as s2, open('./dev-0/out-merge.tsv','w') as f_merge:
for l1, l2 in zip(s1, s2):
dir1 = {''.join(x.split(':')[:-1]): float(x.split(':')[-1]) for x in l1.rstrip().split(' ')}
dir2 = {''.join(x.split(':')[:-1]): float(x.split(':')[-1]) for x in l2.rstrip().split(' ')}
newdir = dict()
for k in dir1.keys() | dir2.keys():
newdir[k] = dir1[k] if k in dir1 else 0.0
newdir[k] += dir2[k] if k in dir2 else 0.0
newdir[k] /= 2
merge_line = ' '.join([k + ':' + str(v) for k,v in newdir.items()]) + '\n'
f_merge.write(merge_line)
!./geval --metric PerplexityHashed -o ./dev-0/out-merge.tsv -e dev-0/expected.tsv
29.054162509715063
Jakie modele można składać ze sobą w metodach _ensemble?
- kilka dobrych niezależnych modeli
- kilka modeli wyuczonych dla różnego ziarna losowości (_seed)
- kilka ostatnich checkpointów
W jaki sposób można składać różne modele?
- średnia ważona
- średnia geometryczna
- inna średnia
- głosowanie klas (dla zadań klasyfikacyjnych)
- uczenie osobnego prostego modelu, którego zadanie to składanie modeli (np. regresja liniowa)
- jednoczesne uczenie kilku modeli ze wspólnym backpropagation
Jakie są wady metod _ensemble?
- wyższy stopień skomplikowania modelu
- dłuższy czas inferencji
- zużycie większych zasobów komputera
- gorsza interpretowalność
Nie zawsze warto robić _ensemble:
- w zastosowaniach komercyjnych, jeżeli mamy ograniczenia czasu lub zasobów, model jest ciężki lub wynik ewaluacji modelu nie jest bardzo ważny,
- w zastosowaniach akademickich/naukowych lub kiedy chcemy porównać kilka różnych metod, wtedy składanie modeli może nam zaburzyć obraz zagadnienia.
W praktyce, jeżeli startujemy w konkursie uczenia maszynowego, zawsze warto korzystać z _ensemble.
Warto mieć na uwadze, że niektóre metody z założenia są ensemblami. Np. las losowy albo boostowane drzewa decyzyjne.
Zadanie
Stworzyć _ensemble dwóch sieci LSTM dla Challenging America word gap prediction (https://gonito.csi.wmi.amu.edu.pl/challenge/challenging-america-word-gap-prediction):
- jedna sieć powinna działać do przodu (czyli jak zwyczajna sieć rekurencyjna),
- druga sieć powinna działać do tyłu.
Przykład:
- przykładowy tekst:
"ala" "ma" "kota" "MASK" "2" "psy" "i" "chomika"
- sieć do przodu:
"ala" "ma" "kota"
- sieć do tyłu:
"chomika" "i" "psy" "2"
Zrobienie sieci odwrotnej („do tyłu”) jest bardzo proste. Wystarczy odwrócić kolejność słów, nie ma potrzeby ingerować w architekturę modeli.
Metodą agregacji zastosowaną w _ensemble’u w najprostszej wersji może być np. średnia arytmetyczna. Można też spróbować innych sposobów, np. jednoczesnego uczenia obu sieci.
Punktacja: 50 punktów
Deadline: 12 czerwca 2024 przed zajęciami