Similarity beräknad av similarity cos och L1-distans

2017-02-19

Börjande från för ett tag sedan nu 400 dimensioner för resp. cirka 450 000 ord skapade via dimensions-reduktion med en variant av LSA vilka sedan dimensions-reducerades till 300-dimensioner för resp. varje ord, ett antal miljoner flergram via två algoritmer för att skapa resp. 400 dimension (en utnyttjande relationer till ordet kända via annan datatyp medan den andra beräknande dem för resp. ord till ord kombination summerande xy ( x + y ) element-vis) tränar jag över min common-sense med FF-varianten (baserad relationer) där antalet dimensioner (var och en 300-dimension via ett 300-tillstånd) varierar något med antalet koncept kända hörande till kategorin men vilka försöks hållas väldigt få (3 - 12 st). Reduktion dimensioner från 400 till 300 gjorde jag med en variant av Kohonens självorganiserande kartor vilket har den för mig avgörande fördelen att:


  • Varje dimension blir också en meningsfull kategori av ord och resp. nära besläktade med de till vänster och höger om dem.
  • Kategorisering vid reduktion dimensioner är den algoritm som bäst klarar av att efterlikna hur människor presterar vid ett flertal tester (emedan LSA i grundtyp alltid tenderar att varje den som presterar sämst medan PLSA presterar emellan resp.).
  • Meningsfulla kategorier gör att det starkaste inom natural language processing över längre tid kan introduceras: Människan.
    • Ser jag för resp. dimension sorterade efter värdena där något koncept som har ett underligt värde. Kan jag gå in och manuellt förändra det.
    • Och av och till skapa om NOSQL databaserna från de manuella sorteringarna.
    • Effekten kortsiktigt av detta är föga men arbetar upp sig över tiden och gör det enkelt att korrigera omedelbara problem som irriterar.

    Känt för mig är att färdigtränade 300 resp. är för varje normalanvändning bättre än de 400. Jag tror vidare att i allmänhet när man börjar med ord som representationer och använder normalt väldigt stort corpus (snarare än tänkbart extremt stort avvikande från publikt tillgängliga vilket jag avstod från att pröva själv då jag inte såg någon trolig poäng med det men möjligen avvikande) ligger man nära optimum för normal användning någonstans runt 300 st flyttals-dimensioner. En bit ovanför 400 tror jag man väldigt snart generellt med vanliga algoritmer hamnar där dimensionerna ej bra nog generaliserar utan uttrycker diskriminering som ej väl fungerar i alla användningar eller lika väl går att ta från enskilda ord vidare till kompositioner av flera ord till fraser och named-entities, hela dokument, kategorier av ord hörande till ett ämne o.s.v. Även om det kanske upp till 600 dimensioner ej nödvändigt utan större testning märks. Jag har några gånger sett att andra noterat samma sak också (åtminstone något publicerat runt nlp.stanford.edu/projects/glove/ men jag har också sett andra som sätter upp många fler dimensioner). Förövrigt ska man ej underskatta den prestandaförbättring man får bara från att gå ner från 400 dimensioner till 300.

    Känt för mig är att färdiga 300-dimensioner ska kvadreras innan de lagras och börjar användas. Jag har i sista typen av träning experimenterat med att kvadrera efter varje förändring vilket dock ej var meningsfullt. Om de ej kvadreras fungerar de ej lika bra men mycket bättre men L1-distans istället för L2-distans emedan L2-distansen åtminstone för kvadrerad FF (relationer) tycks vara något bättre åtminstone för personer.

    Tränande tillstånd för klassificering av personer (cirka 500 000 namn samt ett mindre antal roller inkluderande även sådana som ambassadör från land-x till land-y år XX) till 12 dimensioner vardera ett 300-tillstånd igen med Kohonen-nät (självorganisering namn tenderar att följa de stora kulturgrupperna i mening arabiska namn, europeiska namn (inkl. anglosaxiska namn Nordamerika), spanska namn, asiatiska namn, och med rollerna tagande position varierat över dessa och ej mutande in någon egen dimension (förväntat därför att de är väsentligt färre i antal men tycks ej störa klassificeringen). 300-FF när skapat bestämde resp. vinnande tillstånd under träningen med cosinus similarity men här gjorde jag det istället med ej kombination av cosinus-similarity och L1-distansen som jag av och till (men mycket mer sällsynt än cosinus-similarity) använt för 300-vektorerna.

    Denna similarity experimenterade jag med ett tag som tänkbart alternativ till att kvadrera 300-vektorerna och bygga om BDB-databaserna (jag hade vid tillfället mer än 90% av allt minne ockuperat kontinuerligt och jag föredrar när jag bygger NOSQL databaserna att försöka få in resp. datatyp i en stor fil istället för uppdelat efter ex. första bokstaven vilket gör med den BDB-provider till perl jag använder att för god prestanda ska man bäst ha mycket ledigt minne - dessutom bryter BDB mycket effektivt bussen även för OS-processor när den sparar vilket alltid gör mig nervös rörande swap även om den tycks hantera det åt OS också rent av inloggad i Ubuntu bättre - ej svårt kanske givet hur sämre prestanda Ubuntu blivit sedan de också inkluderade sin server anpassning görande det ex. omöjligt att utnyttja mer än säg 70 - 80% av allt fysiskt ram-minne man har eller utnyttja alla cpu-kernels samtidigt utan att få processen dödad : Ett litet mysterium - så jag vill ogärna ha processer igång mot samma partitioner igång som behöver skriva ofta även om jag aldrig sett att det genererat exceptions i nivå med mina perl-processer som istället stannar och tyst väntar via något nedanför min kod). Operationen som varianten jag nu gjorde (samma princip men sökande att garantera riktning p.s.s. som cosinus - d.v.s. samma anledning som jag föredrar cosinus i Kohonen-näten framför L2 även om de ofta uppges ekvivalenta):

    • Sim: Vi beräknat similarity cosinus p.s.s. som normalt: Summan över L2-normaliserade vektorer element-vis: x(i) * y(i).
    • L1: Vi beräknat absolutbeloppet av differensen element-vis: (1/2) * abs ( x(i) - y(i) ).
    • Vi dividerar L1 med 300 vilket ger oss ett värde som i storlek ligger mer jämförbart med sim. Jag känner ej till hur man i princip kan tänka för att göra dem jämförbara enligt något systematiskt. Eftersom alla vektorer vi utnyttjar i sig har samma antal element och varje element följer samma fördelning och varje vektor normaliserar p.s.s. behöver vi egentligen ej oroa oss här eller för den delen egentligen göra divisionen (dock ev. behöver vi tänka till rörande (1 + L1) i nästa steg).
    • Vi dividerar sim med (1 + L1). Jag adderar ett därför att L1 ligger ]0,1] och jag vill att likheten ska minska med växande L1.

    Cosinus similarity blir gränsen för den största likheten vi kan få. Med reduceras med växande L1-distans. Och när distansen är maximal får vi halva cosinus-similarity.

    Vid träningen av klassificering personer tycks sim-hh bättre utnyttja 300-vektorerna än cosinus även om skillnaden ej är särskilt stor (för kvadrerade nu normala default 300-FF) för resp. operation gör det i tid mycket märkbar skillnad vid träningen. Hade det nu handlat om LSA 400-vektorerna tror jag ej (men har aldrig prövat) att skillnaden hade varit särskilt stor alls. Utan jag anar att det har att göra med att:

    • Resp. dimension är en meningsfull kategori där ett flertal redan har stor preferens mot personer.
    • Personerna har dock värden satta för samtliga dimensioner där dessa resp. värden beräknades av cosinus-similarity mellan deras 400-vektor och resp. 400-dim tillstånd för kohonen-nätet.
  • Personer som ex. har mycket att göra med flera ämnen (ex. litteratur, en karriär inom ett ämne, länder, språkområden m.m.) har också detta uttryckt men ej nödvändigtvis uteslutande eller alls via de dimensioner som har stor preferens för personer (d.v.s. visa dimensioner 300 sorterar efter grovt stora länder och/eller språkområden ex. tror jag två till tre samlar arabiska namn, några romerska, en eller två japanska namn o.s.v. medan för japanska namn har självorganiserat dimensionerna till preferens både japanska personer och japanska ortnamn för 300-CC d.v.s. ej utnyttjande relationerna medan detta förekommer knappt alls 300-FF), andra orter, ämnen o.s.v. En person kommer ha större värden för tillhörande språkområde men också ligga relativt högt i dimensioner relaterade kulturområden, geografiska orter, ämnen m.m. vilket också gäller som default även när personen i indatat 300-FF skapades ifrån saknar samtliga relationer så länge indata till 400 representationerna d.v.s. (bl.a. Wikipedia-dump och common-crawl uttrycker relativa preferenser som för flergram person klaras att uttryckas diskriminerbart vilket för namn som har kultur- och geo-association är mycket tydligt via särskilt tror jag Wikipedia)

Komponenten L1 trots kvadreringen FF tycks göra jämförelserna något effektivare i mening att resp. dimension-personer vid träningen konvergerar tidigt i träningen oerhört snabbt redan under första epoken första 1000 - 5000 slumpvis valda personer (medan bara cosinus förvisso klarar att grovt ha alla dimensionerna sorterade rätt också första epoken d.v.s. första varvet men först senare i den och med ett större antal som hamnat kontinuerligt under hela epoken på andra dimensioner än de slutligen hamnar).


Jag tenderar att gärna se matematik vilket tycks fungera väl för mig även om jag ofta utnyttjar detta sämre än nödvändigt därför att jag upplever en osäkerhet där jag föredrar att läsa någon som rekommenderar lösning jag hamnat i om jag ej klarar att uttrycka eller förstå den mer i matematiska-metodiken. Väsentligt här försökande det senare (antagligen ej perfekt alls) gäller tror jag att formen för distributionen av värden vi har att göra med väsentligt är annorlunda än L2 resp. L1 (men jag har ej beräknat ut värdena allt och jämfört: Utan lär även fortsatt utnyttja L2 när jag behöver distribution alla värden). Jag tror vi snarare får något hyperboliskt skapat av förhållandet. Jag tycker rörande en egenskap jag menar (men minns ej att jag bra kontrollerade då: Istället jämförde jag vid tillfället ett antal operationer komposition kända samt skapade några andra själv varav denna som jag tyckte var svagt bättre på vissa kombinationer av ord i koncept som hade något jag upplevde problematiskt i topp cirka 100 av närmaste grannar - och såg ej anledning att jämföra mer än så därför att bra mycket när så lika varandra försvinner bort under reduktionen från 400 till 300 dimensioner emedan användning nu skulle kräva mer testande) att operationen för komposition tidigare refererad använd av mig för att skapa 300-CC (görs då för varje kombination av två ord möjliga oavsett position för orden i konceptet från 400 vektorerna) resp. ej helt olikt när koncept kombineras med resp. relation det har när 300-FF skapades: x(i)y(i) (x(i) + y(i)):


  • Resp. addition och multiplikation är de mest använda operationerna för komposition.
  • Vill vi kan vi se det som likheten för resp. element får vikta summan.
  • Men vi kan också välja att se min komposition som att uttrycka följande (jag planerat - men ej kommit mig för än - att generera och rita upp värdena för så jag är säker på att jag ej visualiserar förhållandet felaktigt vilket ej helt sällan är fallet):
    • När x(i) och y(i) är resp. stora kommer element i i den nya vektorn öka med större delen av vad den linjära additionen klarar att ge.
    • Men när något av x(i) och y(i) är litet kommer den linjära additionen att mycket "snabbt" / mer reduceras.
  • Vi kan jämföra med algoritmer (ex. lastdelning, routing: "Hans upp till hänsynslösa men håll det fungerande" mining ner stor datakälla på nätet perl-script resp. mänsklig preferens (men där oftare givet en mer övergripande nivå mycket mer genomgripande och magnitud-större) där vi när saker fungerar ökar upp vår villighet / storleksordningen vi ockuperar ex. kanal med ett enhetssteg medan om det blir problem blir vi rädda och springer bort en längre sträcka eller motsvarande för algoritmer reducerar ner den kanal vi ockuperar kraftigt. Tar vi min algoritm för mining gäller att vi hänsynslöst vill hålla maximalt av den och kanal ockuperat för min användning (denna använde jag under en period när jag tog ner ett väldigt stort antal stora datakällor och att ta maximalt var mycket meningsfullt i totala mängden tid reducerad över allt insparad även om det per fall inte behöver bli mer än någon eller några dagar sparade) så vi trådar upp (eller som det slutligen blev med en tråd per server och körande cirka 15 - 30 st parallellt - skickar requests fritt till den maximalt vad kanalen klarar: Numera körande alltid från små enheter - i varje fall hårddisk-enheter resp. Sygate eller WN jag gjort om till små servrar - med www.archlinux.org ligger de ej tidsstressat och har som default aldrig ändrat att alltid ta in en mycket hög tidsfördröjning eftersom datat ej är planerat att användas på väldigt länge) får vi nu ett fel eller att server börjar svara långsamt eller går tyst och vi är under de första timmarna under två till tre (jag minns ej vilket det var) tidsperioder första dygnet kända för mig att oftare ge problem också från annat än servern själv i vissa regioner vanliga (även om ej alls längre jämförbart med hur det var 1995 till kanske så sent som 2000 när man märkte när vissa regioner USA vaknade och delar av internet blev oanvändbart) kortare perioder på någon halvtimme in i testning för att försöka höja nedladdning. Nedladdning kan vara nivå 1 till 10 med tio som högst. Nivå vi börjar på är antingen nuvarande nivå eller en tidigare lägsta nivå högre än den vi börjat på (enligt enkel regellogik prövande detta för att ev. problem tidigare ej vanligt ej ska göra ny testning ineffektiv). Vi höjer nu nivån stegvis (ex. 2, 3, 4, 5, ..., 10) efter några tusen nedladdningar så länge ej problem uppstår. Får vi ett problem går vi hela vägen tillbaka tillbaka till nivån vi började på och börjar höga igen. Denna gång höjer vi emellertid ej upp till den nivå där vi fick problem (vilket istället jag gör åt programmet senare samma dag manuellt och ser betraktande det hela om det går att gå något steg ovanför). Poängen är att få hög prestanda men ej riskera att ligga och få en massa data som bara består av timeouts slösande såväl hårddisk som tid nedladdning på ingenting. Något problem med att riskera att ej komma åt servrar alls via accessregler gäller dock i princip aldrig. Endast två av många tusen (säg 9000 större datakällor i form av nyhetstidningar, bibliotek m.m.) gav sådana problem varav en (ett arkiv över militärforskning: Jag misstänker också att det hela ej inträffade så mycket på deras initiativ som relaterat den den externa tjänst - Google som är känt helt unikt känslig rörande allt som kan tänkas spara ned deras sökresultat: D.v.s. givet deras marknadsandel väldigt fin möjlighet för andra sökmotorer att etablera en potentiellt väldigt stor marknad mot företag som söker uppgifter andra tjänster som Google i princip helt givet nivån på deras särskilda tjänster för sådant ej agerar i och rätt där för sådana aktörer är att tillåta allt här fritt under överskådlig tid för att etablera sig skälv som inbyggd kanal ej trivial att ersätta - för indexering av deras forskning som de använde: Men har ej försökt kontrollera det.) korrigerade detta och den andra (arkiv över medicinsk forskning) tydligt anger att man ej ska gå över ett högt antal requests per dygn emedan mitt program via en defekt låg kontinuerligt över tror jag en månad tio - 20 ggr över denna nivå.


D.v.s. jämförelsen är relevant genom att additionen går kraftigt ner i effekt av resp. värde om ett värde är lågt. Storleken av additionen begränsas av det lägsta värdet hos resp. Om vi vet att en av vektorerna definierar ett ämne (och har dimensioner som klarar sådant på detta sätt vilket jag ej menar att LSA-dimensioner klarar likaväl därför att det där tror jag också ligger påverkande information i kombinationer av uttryck av dimensionerna men som vi åtminstone är mycket närmare för mina 300-vektorerna) hade vi jämförbart istället kunnat låta endast den sätta den yttre gränsen modifierande den andra vektorn så att endast vad i den som är innanför den antingen får komma med (ex. kastande värden om avvikande väsentligt) eller alternativt behållande värde ej modifierat om mindre eller lika med värdet för första i dimensionen och om större sättande ned det till första dimensionens värde. Nu sker similarity operationen via resp. L1 och sim vi får adderande över alla dimensioner innan kombinerat. Men om det hade gjorts (vilket jag ej tror är i allmänhet lämpligare: tvärtom kanske) kan vi se att vi gör något liknande: x(i) * y(i) / ( 1 + abs ( x(i) - y(i) ) ).

Men med skillnaden att det nu är reduktionen för ett avvikande värde som ej får möjlighet att reducera samlad distans lika mycket. Ser vi nu att vi för resp. dimension har relevanta koncept som man direkt och enkelt ser är i något ämne av samma sak för i princip alla liggande ovanför ett cosinus similarity värde av för 300-FF (kvadrerade) cirka 0.40 - 0.45 (för 300-FF kvadrerade valde jag ej att göra något av "align" på resultatet vilket jag hade gjort innan genom att bl.a. subtrahera medelvärde vilket gör att de ligger cirka 0.10 förskjutna åt höger mot förväntat i övriga - i allmänhet alltid alla andra är samma gränsnivå 0.30 - 0.35 med eller utan align gjord och förutom att FF oftare är korrektare vid klassificering gäller att den av orsaker ej helt klara för mig ligger något förskjuten uppåt allmänt hela vägen under träningen) gäller att vi ej endast har meningsfull information i att två koncept båda ligger ovanför detta värde. Dessutom gäller att koncept som har högre värden kommer tendera att (för 300-FF där i princip resp. koncept fick påverka med samma sannolikhet under träningen emedan det för ex. 300-WORD finns ett samband till sannolikhet för att garantera att ord ej ovanliga d.v.s. de cirka 80 000 i värden vanligaste orden på den närmare eller konkret den engelska världen har bra utrymme i dimensioner - Dock 300-FF gäller att över alla dimensioner kommer similarity uttrycka sannolikhet koncept genom att dess representation 400 skapats via dess relationer till andra koncept d.v.s. koncept med hög samtidig förekomst andra koncept kommer få höga värden likhet över fler av de 300-dimensionerna) vara mer typiska eller mer genuint tydliga för vad dimensionen uttrycker. xy ger därför en indikation på hur genuina båda är med den lägsta som övre gräns.

Dock jämför vi två koncept på en dimension gäller ju också att om skillnaden i värden mellan dem är liten är de mer lika varandra även om värdena i sig är olika. Samtidigt gäller att informationen sådan likhet bär ej självklart är jämförbar för alla nivåer eller för den delen dimensioner vi beräknar på. Att båda har liten distans betyder troligen något bra att använda oavsett nivå men det är antagligen information med mer värde när värdena är högre än om de är låga. Troligen (jag tror så) men ej vad jag kontrollerat kommer värdet av denna information krympa väldigt snabbt ner till något minsta uttryck ju mindre nivå de resp. ligger i. Därför att vid för båda låga värden finns något minsta en dimension specialiserad mot ett ämne här klarar av att säga om koncept som har nästan inget i sig relevant för det ämnet.

Jag tror vi ej får denna information lika bra med när vi bara gör xy-operationen.

Vidare kan vi acceptera att L2-distans och cosinus-similarity är samma sak i mening att vi kan få ut samma värde via omräkning (sedan vill jag egentligen ej riktigt hålla med om att principen är generell: Vi kan ju få en riktning som representerar meningsfull information man bör garantera att algoritm utnyttjar så om utan korrigering omräkningen gäller så är algoritmerna man använder ej optimalt gjorda. Men jag förstår hur man kan uppleva dem som samma sak eftersom värdena ser lika ut). Säg att en av vektorerna är medelvärdet av alla existerande koncept (vilka också deltog i träningen som resulterade i vad 300-FF skapades i från). Jag ville mena i jämförelse att vi får L2 och cosinus-sim får något vi kan se som motsvarande variansen emedan L1 ger något vi se som differensen mellan medelvärde i Fishers linjära-diskriminant eller som signal-to-noise-ratio motsvarande förhållandet delta-värde dividerat med bredden för hur spritt det är (se Värdet av kaos (2017-02-07)). Men jag tappade precis förståelsen av detta (rörande hur man se på summeringen över vektor-dimensionerna).

Rörande jämförelsen dator-nätverk med mänskligt beteende är min referens beteende mer hur vi agerar i ex. sådant tydligast barn när vi utforskar något okänt (jämför barn osm under lek smyger sig fram men vid plötsligt ljud flyr ordentlig sträcka snabbt). Men vi har också ett resonemang jag ej ännu läst i detalj som rör något djupare i detalj rörande hur nätverk av noder beter sig när de transporterar och processar information där man menar att hjärnan kanske utnyttjar något likartat: The Internet and your brain are more alike than you think (2017-02-09), Salk Institute via EurekAlert.org.