moj-2024/lab/11_Ensemble_modeli.ipynb
Paweł Skórzewski 65219c12dc Lab. 11
2024-05-29 09:37:16 +02:00

11 KiB
Raw Permalink Blame History

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 _ensembleu 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