aitech-moj-2023/cw/05_wygładzanie_modeli_językowych.ipynb

233 lines
7.9 KiB
Plaintext
Raw Normal View History

2022-03-27 17:13:37 +02:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n",
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Modelowanie Języka</h1>\n",
"<h2> 5. <i>Wygłazanie modeli językowych</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2022)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://web.stanford.edu/~jurafsky/slp3/3.pdf"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"class Model():\n",
" \n",
" def __init__(self, vocab_size, alfa, UNK_token= '<UNK>'):\n",
" pass\n",
" \n",
" def train(corpus:list) -> None:\n",
" pass\n",
" \n",
" def predict(text: list, probs: str) -> float:\n",
" pass"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Perplexity:\n",
"$$PPL(W) := P(w_1, w_2, \\ldots, w_n)^\\frac{-1}{N} $$\n",
"\n",
"Dla modelu bigramowego:\n",
"\n",
"$$PPL(W) := (\\prod_{i=1}^{N} P(w_i|w_{i-1} )^\\frac{-1}{N} $$\n",
"$$PPL(W) := ( P(w_2|w_1)*P(w_3|w_2)*P(w_4|w_3)*\\ldots*P(w_n|w_{n-1}) )^\\frac{-1}{N} $$\n",
"\n",
"\n",
"\n",
"Np. dla korpusu ewaluacyjnego: \"Ala ma kota i rybkę\" i modelu bigramowego:\n",
"\n",
"$$PPL(W) := ( P(ma|Ala)*P(kota|ma)*P(i|kota)*P(rybkę|i) )^\\frac{-1}{5} $$\n",
"\n",
"\n",
"\n",
"lub z tokenem $<s>$ :\n",
" \n",
"$$PPL(W) := (P(Ala|<s>) * P(ma|Ala)*P(kota|ma)*P(i|kota)*P(rybkę|i) )^\\frac{-1}{6} $$ "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Co jeżeli w cały korpusie trenującym ani razu nie wystąpił bigram \"i rybkę\"?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zadania do wyboru:\n",
" - wygładzanie za pomocą plusalpha (tunowanie na zbiorze deweloperskim parametru alpha- TAG plusaplha\n",
" - wygładzanie za pomocą interpolacji (tunowanie na zbiorze deweloperskim współczynników interpolacji) - TAG interpolation\n",
" - wygładzanie motodą Good-Turing (nie ma potrzeby tunowanania) - TAG backoff\n",
" - wygładzanie za pomocą back-off (nie ma potrzeby tunowania, nie ma potrzeby, żeby było prawdopodobieństwo) - TAG backoff"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Punktacja\n",
"\n",
"Za zadanie można otrzymać 70 punktów + 40 punktów za najlepszy wynik z zajęć (2 grup modelowanie języka)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Warunki zaliczenia:\n",
"- wynik widoczny na platformie zarówno dla dev i dla test\n",
"- wynik dla dev i test lepszy (niższy) niż 1024.00\n",
"- deadline do końca dnia 03.04\n",
"- commitując rozwiązanie proszę również umieścić rozwiązanie w pliku /run.py (czyli na szczycie katalogu). Można przekonwertować jupyter do pliku python przez File → Download as → Python. Rozwiązanie nie musi być w pythonie, może być w innym języku.\n",
"- zadania wykonujemy samodzielnie\n",
"- w nazwie commita podaj nr indeksu\n",
"- w tagach podaj tag opisany jak wyżej!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Jak tunować parametry na zbiorze deweloperskim?\n",
"\n",
"- tworzymy model opisany jak przez \"klasę abstrakcyjną\" na początku notebooku. Model ma podany jako parametr konstruktora pewien parametr wygładzania np. alpha\n",
"- tworzymy wiele modeli z różnymi parametrami, uczymy je i sprawdzamy na zbiorze deweloperskim, dostając np. taką tabelkę:\n",
"\n",
"\n",
"| parametr alfa | pplHashed na dev-0|\n",
"| ----------- | ----------- |\n",
"| 0.0 | 404 |\n",
"| 0.1 | 370 |\n",
"| 0.2 | 343 |\n",
"| 0.3 | 339 |\n",
"| 0.4 | **320** |\n",
"| 0.5 | 337 |\n",
"| 0.6 | 398 |\n",
"| 0.7 | 404 |\n",
"| 0.8 | 432 |\n",
"| 0.9 | 426 |\n",
"| 1.0 | 433 |\n",
"\n",
"Wybieramy najlepszy parametr względem metryki. Tutaj najlepszy wynik to **320** osiągany dla parametru **alfa=0.4**. Zatem taki model oddajemy w zadaniu na gonito. \n",
"\n",
"Oczywiście robienie tabelki nie jest konieczne. Podobnie postępujemy, jeżeli parametrów będzie więcej niż 1. Ilość modeli do stworzenia będzie rosła wykładnioczo względem ilości parametrów. Np. jeżeli każdy parametr będzie miał 10 możliwości i chcemy przetestować 3 parametry, to mamy 10^3 możliwości. Dlatego warto wtedy ograniczać zakres, np. zamiast 10 możliwości wziąć 3 możliwości."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Object `deweloperskiego` not found.\n"
]
}
],
"source": [
"Dlaczego używamy osobnego zbioru deweloperskiego?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Wymogi dla zadań"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zadanie plusalpha:\n",
"\n",
"- model powininen być bigramowy lub trigramowy\n",
"- należy tunować alpha na zbiorze deweloperskim "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zadanie wygładzanie za pomocą interpolacji\n",
"\n",
"- model powinien składać się z conajmniej dwóch modeli (np. unigramowy + bigramowy) z parametrem alpha, który steruje ile powinno wchodzić prawdopodobieństwa jednego modelu, a ile prawdopodbieństwa drugiego modelu\n",
"- należy tunować parametr alpha (lub 2 parametry, jeżeli będą 3 modele) na zbiorze deweloperskim "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zadanie wygładzanie za pomocą metody Back-off\n",
"\n",
"- model powinien składać się z conajmniej dwóch modeli (np. unigramowy + bigramowy). Jeżeli dla modelu bigramowego będzie za mało bigramów zaczynająch się od danego tokenu, należy użyć modelu unigramowego. \n",
"- można tunować parametr k, czyli parametr mówiący ile razy conajmniej musi wystąpić dany token (początek bigramu), abyśmy użyli tego bigramu, zamiast modelu unigramowego. Ale nie trzeba tego robić."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zadanie wygładzanie za pomocą metody Good-Turing\n",
"\n",
"- model powinien być conajmiej bigramowy\n",
"- nie ma potrzeby tunowania parametrów, ponieważ model nie ma parametrów\n",
"- pewną trudność może stanowić zliczanie: $ \\frac{N_{r+1}}{N_r} $ Warto zatem zrobić przygotować odpowiednie wartości w czasie trenowania modelu.\n",
"\n",
"\n"
]
}
],
"metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"lang": "pl",
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.3"
},
"subtitle": "0.Informacje na temat przedmiotu[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 4
}