Deep Learning a gyakorlatban Python és LUA alapon Szaszák György
Ajánlórendszerek, zeneosztályozás, zeneajánlás
http://smartlab.tmit.bme.hu
3. kis házi Javítások elkészültek •16 darab megoldás
2/58
3. kis házi Észrevételek: •javasolt tanítás során validációt alkalmazni: •külön validációs adatbázissal •early stopping, ha adott epochig nem csökken a hiba a validációs halmazon •validációs halmaz ≠ teszt halmaz •érdemes tesztelni •pl. azonnal kibukik, ha nyárra -25 fok az előrejelzés •Dropout + reguralizáció
3/58
3. kis házi Előrejelzések november 7-én számolva...
(hőmérséklet 11:26-kor: 7 °C) 4/58
Deep learning híradó
Hírek az elmúlt hétről
5/58
Google DeepMind's next gaming challenge: can AI beat StarCraft II?
6/58
Jogi nyilatkozat Jelen előadás diái a „Deep Learning a gyakorlatban Python és LUA alapon” című tantárgyhoz készültek és letölthetők a http://smartlab.tmit.bme.hu honlapról. A diák nem helyettesítik az előadáson való részvételt, csupán emlékeztetőül szolgálnak. Az előadás diái a szerzői jog védelme alatt állnak. Az előadás diáinak vagy bármilyen részének újra felhasználása, terjesztése, megjelenítése csak a szerző írásbeli beleegyezése esetén megengedett. Ez alól kivétel, mely diákon külső forrás külön fel van tüntetve. 7/58
Ajánló rendszerek Felhasználói igények személyre szabott kiszolgálása Felhasználói preferenciák és ízlés modellezése Cél: ajánlatok annak előrejelzése alapján, hogy mi érdekelheti nagy eséllyel a felhasználót (mire vevő, mit érdemes neki ajánlani) Módszerek: 1. „Collaborative filtering” (naplózás majd szelekció) 2. Tartalomelemzés (content based) Alapfeltevések: 1. Ha B felhasználó előélete hasonlít A-éra, akkor valószínűsíthető, hogy B ugyanúgy fog viselkedni, mint korábban A. 2. Ha B tartalmat hasonló felhasználó kör preferál, mint A-t, akkor A és B tartalmak hasonlóak lehetnek. 8/58
Egy kis kitekintés az üzleti világba Példa: kiskereskedelem Az eladó szeretne minél nagyobb piaci részesedést és minél nagyobb forgalmat, hogy a nyereségét maximalizálja és hosszú távon biztosítsa Hagyományos bolt
Online bolt
csoportosít, de fizikai korlátok tömegcikkekben érdekelt tömegkiszolgálás
szűrni tud ajánlani tud diverzifikált kiszolgálás
9/58
Collaborative filtering sok-sok felhasználó járul hozzá (crowdsourcing, sok kicsi sokra megy) Item #1
kiszűrni a felhasználó számára relevánsnak gondolt tartalmakat
Item #2
Item #3
Item #4
...
Item #N
User #1 User #2 User #3 User #4 ... User#M
10/58
Collaborative filtering Ez az utility mátrix (~felhasználási mátrix?) ritka mátrix cél az, hogy a 0 (vagy a gyakorlatban semmi) elemek közül megtaláljuk azt, amelynek jó eséllyel nagynak kellene lennie (ha a felhasználó ismerné a tartalmat, tetszene neki) Item #1 Item #2 Item #3 Item #4
...
Item #N
User #1
12
0
10
15
66
User #2
34
0
5
0
0
User #3
0
0
15
8
0
User #4
12
0
0
0
24
0
58
0
0
0
... User#M
11/58
Megközelítés Vektorosan ábrázolni az adatokat, aztán ezek összehasonlítása (távolság számítása). A távolság alapján aztán: 1.ajánljunk olyat, amit más, hasonló ízlésű felhasználók már megnéztek/meghallgattak (pl.: user #2 → item #N). 2.ajánljunk olyat, ami hasonló ahhoz, amit a felhasználó eddig nézett/hallgatott (pl. item #1 → user #3). Item #1
Item #2
Item #3
Item #4
...
Item #N
User #1
12
0
10
15
66
User #2
34
0
5
0
0
User #3
0
0
15
8
0
User #4
12
0
3
0
24
0
58
0
0
0
... User#M
12/58
Collaborative filtering Módszere: Statisztikai adatok gyűjtése, (legfontosabb: ki, mit, hányszor használt/keresett/nézett/hallgatott meg). Általában hatalmas adatmennyiséget kell feldolgozni. Pl. Google Play 2015 szept: 1 milliárdodik felhasználó, kb. 35 millió zeneszám érhető el, ... Sok felhasználó követésével/modellezésével jól jósolható, hogyan viselkednek a hasonszőrűek (felhasználói profilozás)
13/58
Adatgyűjtés Közvetlen: ● Felhasználói értékelés (pl 1-5 terjedő skálán vagy csillagokkal) ● Felhasználói rangsorolás ● Választás (melyiket szereti jobban a két felajánlott közül) ● Felhasználó által összeállított lista a kedvencekről (pl. lejátszási listák) Nehéz rávenni a felhasználót, hogy értékeljen Zajosak az adatok Közvetett (sütik, logok): ● Naplózni, ki mit nézett meg (esetleg maradt-e az oldalon/tartalomnál hosszabban) ● Naplózni, ki mit hányszor keresett/nézett/látott ● Naplózni, ki mit vásárolt/töltött le eddig online ● Felhasználó számítógépén lejátszási listákat keresni ● Felhasználó szociális hálózati kapcsolatainak elemzése (vagy like-ok elemzése) Törvényességi aggályok Rengeteg adat 14/58
Kihívások, problémák Adatmennyiség: elhasalnak a statisztikai algoritmusok. „gerjedés”: minél több felhasználónak ajánlanak valamit, annál többen nézik meg, annál népszerűbb, annál többnek ajánlják... cold start: az új tartalmakat bünteti (hiszen nincsenek előzményeik). Megoldás: 1. ajánlás tartalomelemzés alapján 2. ajánlás tartalomelemzés alapján IS (hibrid rendszerek)
15/58
Tartalomalapú módszerek Termékprofilozás Metaadatok pl. zene: album, előadó, év, műfaj, stb. egyszerűen megvalósítható (általában vannak tagek) zajos lehet csak metaadatok alapján sablonos az ajánlás, untatja a felhasználót Mélyebb elemzés absztrakt tartalmi reprezentáció pl. zene: spektrumból nyerjünk ki adatokat Felhasználói profilozás (ezt már láttuk) Valamiféle vektoros adatábrázolás lenne jó, mert azt könnyen össze tudjuk hasonlítani: Koszinusz hasonlóság: ~ két vektor által bezárt szög
16/58
Koszinusz hasonlóság import math def cosine_similarity(a,b): # a és b koszinusz hasonlósága: (a dot b)/{||a||*||b||)" sumxx, sumxy, sumyy = 0, 0, 0 for i in range(len(a)): x = a[i]; y = b[i] sumxx += x*x sumyy += y*y sumxy += x*y return sumxy/math.sqrt(sumxx*sumyy)
Pl.
[1,0] vs [0, 1] ~ 90 fok [1,1] vs [1, 1] ~ 0 fok [1,1] vs [-1, -1] ~ 180 fok 17/58
Indikátor-vektor “~multi-hot” boolean vektor true, ha benne van a termékben valamilyen “összetevő” Összetevők a koordinátákhoz vannak rendelve (leképező tábla) Pl.: mozifilmek Az összes, legalább 5 filmben szereplő filmszínész által kifeszített térben egy adott filmre a koordináta true, ha az adott színész szerepel benne, false, ha nem.
18/58
Szózsák (bag of words) Lényegében egy leltár: halmaz, mely az egyes elemek számosságát is tartalmazza Eredetileg NLP (természtesnyelv-feldolgozás) és IR (információkinyerés) Pl. automatikus tartalmi kivonatolásban szövegre: ● egy vektor ● annyi dimenziós, ahány szó van (a szótárunkban) ● szavakat egy (egész) számra képezzük (0..N, ha N szó van) ● minden pozícióban az adott szó előfordulásának száma a szövegben -> vektorokkal leír egy egységet -> sorrendiségi információk elvesznek (kontextus marad) 19/58
Szózsák Gyümölcsért megyünk a piacra. Kapható alma, körte, barack, eper, meggy és kivi. Gyümölcs
kód
alma
0
körte
1
barack
2
eper
3
meggy
4
kivi
5
Ha veszünk 2 kg almát, 1 kg epret és 1,5 kg meggyet: [ 2, 0, 0, 1, 1.5, 0 ] 20/58
Szózsák words = tokenize(text) vocabulary = sorted(list(set(words))) words_to_indices = dict((w, i) for i, w in enumerate(vocabulary)) indices_to_words = dict((i, w) for i, w in enumerate(vocabulary)) def bag_of_words(document, words_to_indices) bow = np.zeros(len(words_to_indices)) words = tokenize(document) for word in enumerate(words): try: bow[(words_to_indices[word])] += 1 except IndexError: print ("Out of vocabulary word skipped: ", word) return bow 21/58
Vektor reprezentációk Skálázás és normálás: hasznos, ált 0-1 közé, ill. z-norm Súlyozás: nem biztos, hogy minden koordináta egyformán hasznos/informatív (súlyozhatunk pl. maszkkal) Büntetőpontok (negatív értékek használata): ha olyan van benne, amit a felhasználó nem szeret, az negatív előjelű Kivonásként jelennek meg a nevezőben Dimenziócsökkentés: a vektorok elemei gyakran összefüggnek, egymással valamennyire együtt mozoghatnak (korreláltak) → dimenzióredukció lehetséges (tömörítés) Haszna: kevesebb paraméter, gyorsabb és/vagy kevesebb adatot igénylő, stabilabb tanulás, kisebb számításigény 22/58
Dimenziócsökkentő technikák Alkalmazásuk: 1. jellemzőkinyerés 2. jellemző szelektálás A jellemzők közötti korreláltságot kihasználva alacsonyabb dimenziójú térbe transzformál PCA (Principal Component Analysis) faktoranalízisen alapuló technikák … Neuronhálókkal is lehet (majd későbbi alkalommal) 23/58
PCA Lineáris vagy nem lineáris (kernellel) transzformáció kisebb dimenziójú térbe import numpy as np from sklearn.decomposition import PCA
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) pca = PCA(n_components=2) pca.fit(X) print(‘Eredmény: ’, pca.explained_variance_ratio_) # Eredmény: [ 0.99244... 0.00755...]
24/58
Zeneszámok ajánlása Tartalmi profilok predikciója az audio alapján (hangminták összehasonlíthatósága) Ez egy regressziós feladat: - előrecsatolt háló (előtte front-end) - 1d Conv - 2d Conv - CRNN
25/58
Mel Frequency Cepstral Coefficients (MFCC) Ablakolás
FFT
Mel szűrőbank
mel spektrum
log(.)
DCT
MFCC
26/58
Ablakolás
Ábra forrása: S. Young et al.: The HTK Book. Cambridge University Press. 27/58
Mel Frequency Cepstral Coefficients (MFCC)
Ábra forrása: S. Young et al.: The HTK Book. Cambridge University Press. 28/58
Emberi hallásról Csak annyiban, hogy az MFCC-t értsük.
29/58
Névnek a NEPTUN kódodat add meg! https://kahoot.it/
Zeneszámok ajánlása Tartalmi profilok predikciója az audio alapján (hangminták összehasonlíthatósága) Ez egy regressziós feladat: - előrecsatolt háló (előtte front-end) - 1d Conv - 2d Conv - CRNN A számok közepéből vágunk ki egy fél perces részt elemzésre. 31/58
Előrecsatolt háló - front-end 1. MFCC jellemzők kiszámítása 2. Vektorkvantálás (k-means): k súlypont meghatározása a térben, minden elemet a legközelebbi súlypontba képzünk
32/58
Mel kepsztrum import librosa # Audio feldolgozó lib import matplotlib.pyplot as plt import mumpy as np # Hangfájl és mel spektogram y, sr = librosa.load("file.mp3") S = librosa.feature.melspectrogram(y, sr=sr, n_mels=128) log_S = librosa.logamplitude(S, ref_power=np.max) # referencia a maximum jelszint: np.max-> 0 dB # Megjelenítés, formázás plt.figure(figsize=(12,4)) librosa.display.specshow(log_S, sr=sr, x_axis='time', y_axis='mel') plt.title('mel power spectrogram') plt.colorbar(format='%+02.0f dB') plt.tight_layout() 33/58
Mel spektrogram
34/58
K means pszeudo kód def kmeans(dataSet, k): # Random init numFeatures = dataSet.getNumFeatures() centroids = getRandomCentroids(numFeatures, k) oldCentroids = None # Iterációk konvergenciáig while not stop(oldCentroids, centroids, iterations): # A régieket a konvergencia ellenőrzése miatt mentjük oldCentroids = centroids # Vektorok centroidokhoz rendelése (klaszterezés) labels = getLabels(dataSet, centroids) # Centroidok vektorának (átlag) újraszámolásas centroids = getCentroids(dataSet, labels, k) return centroids 35/58
Vektorizáció 3. Szózsákok (k dimenziós) készítése az egyes dalokra/zeneművekre vagy részleteikre (eloszlást fog megadni, ez a modellezés alapja) 4. Dimenzióredukció (pl. látens faktor analízis) 5. Előrecsatolt háló
36/58
Konvolúció audio jeleken 1D konvolúció vagy frekvenciában, vagy időben Idő ~ műfaj (időbeli mintázat) Frekvencia ~ hangszerek, vokál (frekvenciabeli mintázat) A két dimenzió más fizikai jelentéssel bír (↔ képek)
37/58
1d CNN Időben keresünk jellemzőket, jellegzetességeket A frekvenciatartományt megőrizzük a FC rétegeknek („narrow and tall” feature maps) Conv1D: 1x8 Max Pooling: 1x8, 1x8, 1x5, 1x4 N=15 .. 30 .. 150
Forrás: Convolutional Recurrent Neural Networks for Music Classification Keunwoo Choi, George Fazekas, Mark Sandler, Kyunghyun Cho, ICASSP 2017 38/58
2d CNN 2D konvolúció működhet az eltérő fizikai jelentés ellenére (heurisztika)
Conv2D: 3x3 Max Pooling: 2x4, 2x4, 2x4, 3x5, 4x4 N=15 .. 250 .. 500
Forrás: Convolutional Recurrent Neural Networks for Music Classification Keunwoo Choi, George Fazekas, Mark Sandler, Kyunghyun Cho, ICASSP 2017 39/58
CRNN RNN: időbeli összegzés (summarization)
Conv2D: 3x3 Max Pooling: 2x2, 3x3, 4x4, 4x4 N=15 .. 250 .. 300 RNN: 2 réteg
Forrás: Convolutional Recurrent Neural Networks for Music Classification Keunwoo Choi, George Fazekas, Mark Sandler, Kyunghyun Cho, ICASSP 2017
40/58
Receiver Operation Characteristics (ROC) AUC: Area Under Curve: munkapontokra összességében ad egy mérőszámot
True positive rate (felidézés=recall vagy sensitivity=érzékenység): TPR=TP/(TP+FP) False positive rate (1 - specificity): FPR=FP/FP+TN
41/58
ROC - ROC-AUC from sklearn.metrics import roc_curve, auc import numpy as np # Adat betöltés, osztályozó init, osztályozás # y_target: referencia # X_train, y_train: tanítóadatok # classifier, decision_function: osztályozó és döntés # y_score: osztályozás eredménye y_score = classifier.fit(X_train, y_train).decision_function(X_eval) fpr = dict() tpr = dict() roc_auc = dict()
42/58
ROC - ROC-AUC # n_classes osztályra történő osztályozás eredményei for i in range(n_classes): fpr[i], tpr[i], _ = roc_curve(y_target[:, i], y_score[:, i]) roc_auc[i] = auc(fpr[i], tpr[i]) # Átlag ROC görbe és AUC fpr["avg"], tpr["avg"], _ = roc_curve(y_target.ravel(), y_score.ravel()) roc_auc["avg"] = auc(fpr["avg"], tpr["avg"])
43/58
ROC - ROC-AUC import matplotlib.pyplot as plt plt.figure() lw = 2 plt.plot(fpr[2], tpr[2], color='darkorange', lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[2]) # 2. osztályra plot-olunk plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver operating \ characteristic example') plt.legend(loc="lower right") plt.show()
44/58
Műfaj szerinti osztályozás I. Forrás: Convolutional Recurrent Neural Networks for Music Classification Keunwoo Choi, George Fazekas, Mark Sandler, Kyunghyun Cho, ICASSP 2017
45/58
Műfaj szerinti osztályozás II. Forrás: Convolutional Recurrent Neural Networks for Music Classification Keunwoo Choi, George Fazekas, Mark Sandler, Kyunghyun Cho, ICASSP 2017
46/58
Rétegméretek
Forrás: Convolutional Recurrent Neural Networks for Music Classification Keunwoo Choi, George Fazekas, Mark Sandler, Kyunghyun Cho, ICASSP 2017 47/58
MusicTaggerCRNN https://keras.io/applications/#musictaggercrnn Előtanított CRNN háló (Million Songs Dataset)
48/58
Million Song Dataset http://labrosa.ee.columbia.edu/millionsong/ ● ● ● ● ● ● ● ●
1 M songs → metadata (genre, mood, instruments, era) SecondHandSongs dataset -> cover songs musiXmatch dataset -> lyrics Last.fm dataset -> song-level tags and similarity Taste Profile subset -> user data thisismyjam-to-MSD mapping -> more user data tagtraum genre annotations -> genre labels Top MAGD dataset -> more genre labels
280 GB úgy, hogy a zeneszámok nincsenek benne, csak lényegkiemelten 49/58
Stílus szerinti soft osztályozás from keras.applications.music_tagger_crnn import MusicTaggerCRNN from keras.applications.music_tagger_crnn import preprocess_input, decode_predictions import numpy as np # Előtanított modell betöltése, msd-> Million Song Dataset előtanított model = MusicTaggerCRNN(weights='msd') audio_path = 'audio_file.mp3' melgram = preprocess_input(audio_path) melgrams = np.expand_dims(melgram, axis=0) preds = model.predict(melgrams) print('Kapott eredmény:') print(decode_predictions(preds)) # példa print: ('Kapott eredmény:', [[('rock', 0.097071797), ('pop', 0.042456303), ('alternative', 0.032439161), ('indie', 0.024491295), ('female vocalists', 0.016455274)]]) 50/58
Jellemzőkinyerés from keras.applications.music_tagger_crnn import MusicTaggerCRNN from keras.applications.music_tagger_crnn import preprocess_input, decode_predictions import numpy as np # nem kérjük a FC kimeneti réteget, csak az RNN kimenetét model = MusicTaggerCRNN(weights='msd', include_top=False) audio_path = 'example_file.mp3' melgram = preprocess_input(audio_path) melgrams = np.expand_dims(melgram, axis=0) feats = model.predict(melgrams) print('Features:') print(feats[0, :10]) # első 10 jellemzőt # példa print: ('Features:', [-0.19160545 0.94259131 -0.9991011 0.47644514 -0.19089699 # 0.99033844 0.1103896 -0.00340496 0.14823607 0.59856361]) Forrás: Convolutional Recurrent Neural Networks for Music Classification Keunwoo Choi, George Fazekas, Mark Sandler, Kyunghyun Cho, ICASSP 2017
51/58
CRNN implementáció x = ZeroPadding2D (padding=(0, 37))(melgram_input ) x = BatchNormalization (axis=time_axis, name='bn_0_freq' )(x) x x x x
= = = =
Convolution2D (64, 3, 3, border_mode ='same', name='conv1')(x) BatchNormalization (axis=channel_axis , mode=0, name='bn1')(x) ELU()(x) MaxPooling2D (pool_size=(2, 2), strides=(2, 2), name='pool1')(x)
x x x x
= = = =
Convolution2D (128, 3, 3, border_mode ='same', name='conv2')(x) BatchNormalization (axis=channel_axis , mode=0, name='bn2')(x) ELU()(x) MaxPooling2D (pool_size=(3, 3), strides=(3, 3), name='pool2')(x)
x x x x
= = = =
Convolution2D (128, 3, 3, border_mode ='same', name='conv3')(x) BatchNormalization (axis=channel_axis , mode=0, name='bn3')(x) ELU()(x) MaxPooling2D (pool_size=(4, 4), strides=(4, 4), name='pool3')(x)
x x x x
= = = =
Convolution2D (128, 3, 3, border_mode ='same', name='conv4')(x) BatchNormalization (axis=channel_axis , mode=0, name='bn4')(x) ELU()(x) MaxPooling2D (pool_size=(4, 4), strides=(4, 4), name='pool4')(x)
Forrás: Convolutional Recurrent Neural Networks for Music Classification Keunwoo Choi, George Fazekas, Mark Sandler, Kyunghyun Cho, ICASSP 2017
52/58
CRNN implementáció x = Reshape((15, 128))(x)
# GRU block 1, 2, output x = GRU(32, return_sequences =True, name='gru1')(x) x = GRU(32, return_sequences =False, name='gru2')(x)
if include_top : x = Dense(50, activation ='sigmoid', name='output')(x)
# Create model model = Model(melgram_input , x) if weights is None: return model else: # Load weights if K.image_dim_ordering () == 'tf': weights_path = get_file('music_tagger_crnn_weights_tf_kernels_tf_dim_ordering.h5' , TF_WEIGHTS_PATH , cache_subdir ='models') return model Forrás: Convolutional Recurrent Neural Networks for Music Classification Keunwoo Choi, George Fazekas, Mark Sandler, Kyunghyun Cho, ICASSP 2017 53/58
End-to-end learning Gépi tanuláson alapuló rendszerek általános felépítése Front-end: jellemzőkinyerés, előfeldolgozás (≠adatelőkészítés!), jelformálás … adatfeldolgozás: mérések (pl. távolság), modellezés (behelyettesítés), stb. Back-end: osztályozás, döntés, dekóder, stb.
54/58
Front-end: „engineering” A jellemzőket hogyan érdemes kinyerni, feldolgozni Paradigma: koppintsuk az embert (lásd MFCC) Pl. a hallás fizikai, „mechanikus” részét értjük (Békésy, 1961), a rejtély az idegi feldolgozás (képfeldolgozás hasonlóképpen) A neuronháló is képes lehet megtanulni az egész folyamatot az elejétől (audio jel) a végéig (mit hall).
55/58
Front-end: CNN megtanulja
Back-end: már lecseréltük neuronhálóra... Forrás: Dieleman, S., & Schrauwen, B. (2014, May). End-to-end learning for music audio. In 2014 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP) (pp. 6964-6968). IEEE. 56/58
Mit csinál a köztes réteg?
Első CNN réteg síkjai által megtanult szűrők Forrás: Dieleman, S., & Schrauwen, B. End-to-end learning for music audio. In 2014 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP) (pp. 6964-6968). IEEE. 57/58
End-to-end rendszerek Nagyon magas adat- és erőforrásigény Nagyon nagy háló (→ stride >> 1, mert redundáns és nagyon magas dimenziószámú az input) vagy dilated conv (~WaveNet) Közel olyan teljesítmény, mint a hagyományos front-endet használó rendszerekben (de általában nem jobb) Egyelőre kell a front-end, de eljöhet az idő, amikor már nem...
58/58
Köszönöm a figyelmet!
[email protected]
http://smartlab.tmit.bme.hu