Ukážeme vytvorenie a natrénovanie vlastnej neurónovej siete. Natrénujeme ju texte knihy. V reálnej praxi by sa trénovala na tisíckach kníh a ďaľších textov. Následne túto neurónovú sieť použijeme na generovanie textu krátkej poviedky. Zadáte prvých päť slov a algoritmus bude generovať ďalšie slová poviedky.
V predchádzajúcej časti sme ukázali načítanie textu knihy, prevod na slová a vyčistenie od neabecedných znakov. Na natrénovanie použili knihu Rivers of Babylon od Petra Pišťanka, ktorú máme na Google disku v súbore Rivers of Babylon.txt. Aby bol kód v tomto článku kompletný uvedieme aj kód na načítanie knihy a vyčistenie textu
#načítanie knihy z Google drive
from google.colab import drive
drive.mount('/content/drive')
kniha1 = open('/content/drive/My Drive/ML Neuronova siet/Rivers of Babylon.txt', 'r')
print("Slovník obsahuje", len(zoznam_slov),"slov, unikátnych slov je", len(slovnik))
indexy_slov = {slovo: i for i, slovo in enumerate(slovnik)}
zoznam_indexov_slov = [indexy_slov[slovo] for slovo in zoznam_slov]
davka=5
pocet_slov = len(zoznam_slov) #pocet slov knihy
trenovacia_mnozina = [([zoznam_indexov_slov[i], zoznam_indexov_slov[i+1], zoznam_indexov_slov[i+2], zoznam_indexov_slov[i+3], zoznam_indexov_slov[i+4]], zoznam_indexov_slov[i+5]) for i in range(pocet_slov-davka) ]
Takže toľko kompletný kód z minulého dielu, kde bol aj podrobne vysvetlený. Aby článok nebol príliš dlhý tak v tejto časti uvedieme len kódy na vytvorenie a natrénovanie NS a na predpoveď, vrátane zadávania prvých päť slov poviedky a generovania jej textu
Trénovaciu množinu máme pripravenú, môžeme sa pustiť do definovania a trénovania neurónovej siete.Postup:
načítanie vstupných dát a prvotná inicializácia váh,
pre vopred zvolený počet iterácií sa vykonajú nasledovné kroky:
posun vpred forward pass,
spätná propagácia,
úprava váh na základe gradientnej metódy,
Potom bude nasledovať otestovanie úspešnosti klasifikácie
Posun vpred (forward)pri predpovedaní informácie prúdia zo vstupu cez skryté vrstvy na výstup , čiže po predikciu výsledku. Na každom neuróne sa vstupy, čiže výstupy predchádzajúcich uzlov vynásobia príslušnými váhami spojení a následne sa sčítajú. Na záver sa aplikuje aktivačná funkcia neurónu. V našom prípade ako aktivačnú funkciu využijeme funkciu ReLu
Spätná propagácia – (backward propagation) rieši úpravu váh neurónových spojení tak, aby neurónová sieť poskytovala výstup, ktorý je bližší k požadovanému výsledku, čiže minimalizujeme stratovú funkciu. Tento proces prebieha opačne od výstupov k vstupom. Ako prvý sa vypočíta gradient váh poslednej výstupnej vrstvy a ako posledný sa vypočíta gradient váh prvej vrstvy. Výsledky výpočtu gradientu z príslušnej vrstvy sa použijú pri výpočte gradientu pre predchádzajúcu vrstvu.
Najskôr uvedieme kompletný kód na vytvorenie triedy modelu, funkcie trénovania a kód na zadanie prvých piatich slov poviedky a v bydúcom pokračovaní vysvetlíme akú činnosť vykonávajú použité funkcie
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import time
embedding_dim = 5 #veľkosť embedding vektorov
# === Trieda definujúca model neurónovej siete ===
# Embedding (vložená vrstva) je skrytá vrstva NS ktorá
# mapuje vstupné informácie z vysoko do nízko rozmerného priestoru
Vygenerovaný text po dvoch iteráciách trénovania po zadaní piatich slov:“ obloha čoraz častejšie dostáva farbu“
obloha čoraz častejšie dostáva farbu na nich a po sa do tmy rácz sa z svoju a už si s z a rácz sa mu do vily za sa a rácz na všetko do tmy rácz je rácz až a rácz sa do svoju rácz sa už do na hodinky sa už sa na svoju
Vygenerovaný text po desiatich iteráciách trénovania po zadaní rovnakých prvých piatich slov
obloha čoraz častejšie dostáva farbu na nevinných no trolejbusom do vily že ho do nechápavo až vám keď nesie oblokom fitness že kvapku rácz s prsty ktorý stisnúť alebo jemu veď až na všetko fredyho a o ústam vzrušenia hneď rácz si sa necítia sebou pred sebou sa však a už dávno opäť stučnel stáť
Po ďalšom spustení vznikne iný text
obloha čoraz častejšie dostáva farbu pred všetkých života o hotelovej veľa rácz mohol rácz vzdiali ako sám niekedy strach s sa platnosťou že za slobodu a čo si chceli rácz sem no kedysi že nemá to že si sa im skončí lesknú a pozerá si dnes stôl každý mu nikdy pred svoju sa stane naučil
V budúcom pokračovaní podrobne popíšeme funkcie použité na vytvorenie a trénovvanie neurónovej siete a na generovanie textu