Programování

Strojové učení pro vývojáře Java, Část 1: Algoritmy pro strojové učení

Auta s vlastním pohonem, software pro detekci obličeje a hlasem ovládané reproduktory jsou postaveny na technologiích a rámcích strojového učení - a to je jen první vlna. V příštím desetiletí promění náš svět nová generace produktů a zahájí nové přístupy k vývoji softwaru a aplikacím a produktům, které vytváříme a používáme.

Jako vývojář Java chcete tuto křivku překonat, zejména proto, že technologické společnosti začínají vážně investovat do strojového učení. Na čem se dnes naučíte, můžete stavět na příštích pěti letech, ale musíte někde začít.

Tento článek vás seznámí. Začnete prvním dojmem, jak funguje strojové učení, následovaným krátkým průvodcem implementací a tréninkem algoritmu strojového učení. Po prostudování interních prvků algoritmu učení a funkcí, které můžete použít k trénování, hodnocení a výběru nejvhodnější funkce predikce, získáte přehled o použití rámce JVM Weka k vytváření řešení strojového učení. Tento článek se zaměřuje na supervizované strojové učení, což je nejběžnější přístup k vývoji inteligentních aplikací.

Strojové učení pro vývojáře Java, část 2

Jste připraveni na další krok? Druhá polovina tohoto kurzu vám ukáže, jak vyvíjet a nasazovat váš datový kanál strojového učení.

Strojové učení a umělá inteligence

Strojové učení se vyvinulo z oblasti umělé inteligence, která se snaží vyrábět stroje schopné napodobovat lidskou inteligenci. Ačkoli je strojové učení v počítačové vědě nastupujícím trendem, umělá inteligence není novým vědeckým oborem. Turingův test, který vyvinul Alan Turing na počátku 50. let, byl jedním z prvních testů vytvořených za účelem zjištění, zda počítač může mít skutečnou inteligenci. Podle Turingova testu mohl počítač dokázat lidskou inteligenci tím, že napálil člověka, aby věřil, že je to také člověk.

Mnoho nejmodernějších přístupů k strojovému učení je založeno na desetiletích starých konceptů. Co se za poslední desetiletí změnilo, je to, že počítače (a distribuované výpočetní platformy) nyní mají výpočetní výkon potřebný pro algoritmy strojového učení. Většina algoritmů strojového učení vyžaduje ke zpracování obrovské množství násobení matic a dalších matematických operací. Výpočetní technologie pro správu těchto výpočtů neexistovala ani před dvěma desetiletími, ale je tomu tak dnes.

Strojové učení umožňuje programům provádět procesy zlepšování kvality a rozšiřovat jejich schopnosti bez lidské účasti. Program vytvořený pomocí strojového učení je schopen aktualizovat nebo rozšířit svůj vlastní kód.

Učení pod dohledem vs. Učení pod dohledem

Učení s učením a učení bez učení jsou nejoblíbenějšími přístupy k strojovému učení. Oba vyžadují, aby byl stroj zásoben obrovským množstvím datových záznamů, aby bylo možné je korelovat a poučit se z nich. Takto shromážděné datové záznamy jsou běžně známé jako vektory funkcí. V případě jednotlivého domu může vektor funkcí sestávat z prvků, jako je celková velikost domu, počet pokojů a věk domu.

v učení pod dohledem, je algoritmus strojového učení vyškolen, aby správně reagoval na otázky související s vektory funkcí. K trénování algoritmu je stroji přiváděna sada vektorů prvků a přidružený štítek. Štítky obvykle poskytuje lidský anotátor a představují správnou „odpověď“ na danou otázku. Algoritmus učení analyzuje vektory funkcí a jejich správné štítky, aby našel vnitřní struktury a vztahy mezi nimi. Stroj se tak učí správně reagovat na dotazy.

Například může být inteligentní aplikace v oblasti nemovitostí proškolena pomocí vektorů funkcí, včetně velikosti, počtu pokojů a příslušného věku pro řadu domů. Lidský štítek by na základě těchto faktorů označil každý dům správnou cenou domu. Analýzou těchto údajů bude aplikace v oblasti nemovitostí trénována, aby odpověděla na otázku: „Kolik peněz bych mohl za tento dům získat?"

Po skončení tréninkového procesu nebudou nová vstupní data označena. Stroj bude schopen správně reagovat na dotazy, a to i na neviditelné neznačené vektory funkcí.

v neřízené učení, je algoritmus naprogramován tak, aby předpovídal odpovědi bez lidského označení nebo dokonce otázek. Spíše než předurčovat popisky nebo jaké by měly být výsledky, bezobslužné učení využívá obrovské datové sady a výkon zpracování k objevování dříve neznámých korelací. Například v oblasti marketingu spotřebitelských produktů lze nekontrolované učení použít k identifikaci skrytých vztahů nebo seskupení spotřebitelů, což nakonec povede k novým nebo vylepšeným marketingovým strategiím.

Tento článek se zaměřuje na supervizované strojové učení, což je dnes nejběžnější přístup k strojovému učení.

Kontrolované strojové učení

Veškeré strojové učení je založeno na datech. U projektu strojového učení pod dohledem budete muset data označit smysluplným způsobem pro požadovaný výsledek. V tabulce 1 si všimněte, že každý řádek záznamu domu obsahuje štítek „cena domu“. Korelací dat řádků se štítkem ceny domu bude algoritmus nakonec schopen předpovědět tržní cenu domu, který není v jeho datové sadě (velikost domu je založena na metrech čtverečních a cena domu je založena na eurech).

Tabulka 1. Záznamy domu

VLASTNOSTIVLASTNOSTIVLASTNOSTIOZNAČENÍ
Velikost domuPočet pokojůVěk domuOdhadované náklady na dům
90 m2 / 295 stop2 pokoje23 let249,000 €
101 m2 / 331 stop3 pokojen / a338,000 €
1330 m2 / 4363 ft11 pokojů12 let6,500,000 €

V raných fázích budete pravděpodobně datové záznamy označovat ručně, ale nakonec byste mohli svůj program naučit automatizovat tento proces. Pravděpodobně jste to už viděli u e-mailových aplikací, kde přesunutí e-mailu do složky spamu má za následek dotaz „Je to spam?“ Když odpovíte, trénujete program tak, aby rozpoznal poštu, kterou nechcete vidět. Filtr nevyžádané pošty aplikace se naučí označovat budoucí poštu ze stejného zdroje nebo nesoucí podobný obsah a zlikvidovat ji.

Sady označených dat jsou vyžadovány pouze pro účely školení a testování. Po skončení této fáze pracuje algoritmus strojového učení na neoznačených datových instancích. Například byste mohli předpovědní algoritmus vložit novým, neoznačeným záznamem domu a ten by automaticky předpověděl očekávanou cenu domu na základě tréninkových dat.

Jak se stroje učí předpovídat

Výzvou supervizovaného strojového učení je najít správnou predikční funkci pro konkrétní otázku. Matematicky je úkolem najít funkci vstupu a výstupu, která vezme vstupní proměnné X a vrátí hodnotu predikce y. Tento funkce hypotézy (hθ) je výstupem z tréninkového procesu. Často se také nazývá funkce hypotézy cílová nebo předpověď funkce.

Gregor Roth

Většinou, X představuje bod s více daty. V našem příkladu by to mohl být dvourozměrný datový bod jednotlivého domu definovaný velikost domu hodnota a počet pokojů hodnota. Pole těchto hodnot se označuje jako vektor funkcí. Vzhledem k konkrétní cílové funkci lze tuto funkci použít k vytvoření predikce pro každý vektor prvku X. Chcete-li předpovědět cenu jednotlivého domu, můžete cílovou funkci zavolat pomocí vektoru funkcí {101.0, 3.0} obsahujícího velikost domu a počet pokojů:

 // cílová funkce h (což je výstup procesu učení) Funkce h = ...; // nastaví vektor prvku s velikostí domu = 101 a počtem pokojů = 3 Double [] x = Nový Double [] {101,0, 3,0}; // a předpověděl cenu domu (štítek) dvojnásobek y = h. použít (x); 

V seznamu 1 proměnná pole X hodnota představuje vektor prvku domu. The y hodnota vrácená cílovou funkcí je predikovaná cena domu.

Úkolem strojového učení je definovat cílovou funkci, která bude pracovat co nejpřesněji pro neznámé, neviditelné datové instance. Ve strojovém učení je cílová funkce (hθ) se někdy nazývá a Modelka. Tento model je výsledkem procesu učení.

Gregor Roth

Na základě označených příkladů tréninku učící se algoritmus hledá struktury nebo vzory v tréninkových datech. Z nich vytváří model, který z těchto dat dobře generalizuje.

Proces učení je obvykle průzkumný. Ve většině případů bude proces prováděn vícekrát pomocí různých variant algoritmů učení a konfigurací.

Nakonec budou všechny modely vyhodnoceny na základě metrik výkonu a bude vybrán ten nejlepší. Tento model se poté použije k výpočtu předpovědí pro budoucí neoznačené datové instance.

Lineární regrese

Chcete-li naučit stroj přemýšlet, je prvním krokem výběr algoritmu učení, který použijete. Lineární regrese je jedním z nejjednodušších a nejoblíbenějších algoritmů učení pod dohledem. Tento algoritmus předpokládá, že vztah mezi vstupními funkcemi a výstupním štítkem je lineární. Obecná funkce lineární regrese níže vrací předpovězenou hodnotu shrnutím každého prvku vektor funkcí vynásobeno a parametr theta (θ). Parametry theta se v rámci tréninkového procesu používají k přizpůsobení nebo „vyladění“ regresní funkce na základě tréninkových dat.

Gregor Roth

Ve funkci lineární regrese jsou parametry theta a parametry funkcí vyčísleny podle čísla předplatného. Číslo předplatného označuje polohu parametrů theta (θ) a parametrů funkcí (x) ve vektoru. Všimněte si, že funkce x0 je konstantní offsetový termín nastavený na hodnotu 1 pro výpočetní účely. Výsledkem je, že index funkce specifické pro doménu, jako je velikost domu, bude začínat x1. Jako příklad, pokud x1 je nastavena na první hodnotu vektoru funkce Dům, velikost domu, pak x2 bude nastaveno na další hodnotu, počet pokojů atd.

Výpis 2 ukazuje implementaci této lineární regresní funkce v jazyce Java, která je matematicky znázorněna jako hθ(X). Pro zjednodušení se výpočet provádí pomocí datového typu dvojnásobek. V rámci aplikovat() metoda, očekává se, že první prvek pole byl nastaven na hodnotu 1,0 mimo tuto funkci.

Výpis 2. Lineární regrese v Javě

 veřejná třída LinearRegressionFunction implementuje funkci {private final double [] thetaVector; LinearRegressionFunction (double [] thetaVector) {this.thetaVector = Arrays.copyOf (thetaVector, thetaVector.length); } public Double apply (Double [] featureVector) {// z výpočetních důvodů musí být první prvek 1,0 prosazovat featureVector [0] == 1,0; // jednoduchá, postupná implementace dvojitá předpověď = 0; for (int j = 0; j <thetaVector.length; j ++) {predikce + = thetaVector [j] * featureVector [j]; } predikce návratu; } public double [] getThetas () {return Arrays.copyOf (thetaVector, thetaVector.length); }} 

Aby bylo možné vytvořit novou instanci LinearRegressionFunction, musíte nastavit parametr theta. Parametr theta nebo vektor se používá k přizpůsobení funkce obecné regrese základním tréninkovým datům. Parametry theta programu budou vyladěny během procesu učení na základě příkladů tréninku. Kvalita trénované cílové funkce může být pouze tak dobrá jako kvalita daných tréninkových dat.

V níže uvedeném příkladu LinearRegressionFunction bude vytvořena instance pro predikci ceny domu na základě velikosti domu. Vzhledem k tomu, že x0 musí být konstantní hodnota 1,0, cílová funkce je vytvořena pomocí dvou parametrů theta. Parametry theta jsou výstupem procesu učení. Po vytvoření nové instance bude cena domu o velikosti 1330 metrů čtverečních předpovězena následovně:

 // zde použitý vektor theta byl výstupem vlakového procesu double [] thetaVector = new double [] {1.004579, 5.286822}; LinearRegressionFunction targetFunction = new LinearRegressionFunction (thetaVector); // vytvoření funkce vektoru funkcí s x0 = 1 (z výpočetních důvodů) a x1 = velikost domu Double [] featureVector = new Double [] {1.0, 1330.0}; // předpovědi zdvojnásobí predikciPrice = targetFunction.apply (featureVector); 

Předpovědní čára cílové funkce je v níže uvedeném grafu zobrazena jako modrá čára. Řádek byl vypočítán spuštěním cílové funkce pro všechny hodnoty velikosti domu. Tabulka také obsahuje páry cen a velikostí používané pro trénink.

Gregor Roth

Zdá se, že se graf predikce zatím dobře hodí. Souřadnice grafu (průsečík a sklon) jsou definovány vektorem theta { 1.004579, 5.286822 }. Jak ale víte, že tento theta vektor je nejvhodnější pro vaši aplikaci? Hodila by se funkce lépe, kdybyste změnili první nebo druhý parametr theta? K identifikaci nejvhodnějšího vektoru parametrů theta potřebujete a užitková funkce, který vyhodnotí, jak dobře funguje cílová funkce.

Bodování cílové funkce

Ve strojovém učení, a nákladová funkce (J (θ)) se používá k výpočtu střední chyby nebo „ceny“ dané cílové funkce.

Gregor Roth
$config[zx-auto] not found$config[zx-overlay] not found