+ − ⋅ − = nfnf nfnf Sim 2 4

Transkrypt

+ − ⋅ − = nfnf nfnf Sim 2 4
5.VI.2006
Jacek Wołkowicz
Pracownia Problemowa II
„Analiza utworów fortepianowych róŜnych kompozytorów zapisanych w plikach MIDI”
1. Cel pracy
Celem pracy będzie usprawnienie metody klasyfikowania i umoŜliwienie
indeksowania dokumentów muzycznych MIDI poprzez analizę dataminingową i statystyczną
profili kompozytorów (wytłumaczone później).
Metody analizy utworów MIDI są zastosowane takie jakimi analizuje się teksty pisane
w Information Retrieval czy Text Data Mining. Prace tego typu nie były dotychczas
prowadzone.
Główny nacisk informatyka kładzie dziś na przetwarzaniu tekstów, głównie przez
ogrom danych na globalnej sieci, oraz przez to, Ŝe tekst jest bliski kaŜdemu człowiekowi
(wszyscy umiemy czytać, nie wszyscy znamy się na muzyce) oraz to, Ŝe tekst niesie ze sobą
główną informację. Rola muzyki sprowadza się w zasadzie tylko do wywierania wraŜenia,
choć dla badaczy i muzykologów jest równie cenna jak tekst. Podobnymi cechami cechuje się
przetwarzanie obrazów.
JednakowoŜ zajmowanie się przetwarzaniem danych muzycznych jest waŜne, moŜe
głównie przez to, Ŝe znajomość muzyki nie jest powszechną umiejętnością a, jak twierdzę, w
pewien sposób da się ją zaimplementować i wyposaŜając komputery we właściwe narzędzia –
wspomóc człowieka w jego pracy z muzyką.
Dodatkową cechą muzyki podobną do tekstu, a róŜniącą ją od grafiki jest
symboliczność – zapis nutowy moŜemy przetwarzać jak język naturalny, podobnie jak tekst.
Obrazy nie mają takiej symbolicznej reprezentacji, moŜemy je próbować kwantować, ale to
cały czas są dane „analogowe” w sensie zawartości.
2. Klasyfikator plików MIDI
Badaną klasyfikacją będzie analiza statystyki n-gramów w utworach fortepianowych
zapisanych w formacie MIDI. Najprostszy klasyfikator powstał juŜ pół roku temu. Jego
zadanie polega na robieniu statystyk występowania słów – n-gramów – kolejnych n-nutowych
fragmentów. W badaniach wyszło na jaw, Ŝe najlepszą wielkością n jest 7. Następnie przy
pomocy uzyskanych profili kompozytorów stosowane jest porównanie do profilu badanego
utworu i na tej podstawie – wyliczany werdykt. Jako miarę podobieństw profili wybrałem
daną zaleŜność:
  2 ⋅ ( f (n ) − f (n ))  2 
1
2
 
Sim = ∑  4 − 

(
)
(
)
f
n
+
f
n
n∈ profile
2
 
  1
Gdzie podobieństwo profili jest sumą podobieństw wszystkich jego składników a f1(n)
i f2(n) są częstością (ilością wystąpień) danego słowa w profilach.
1/9
Do badań uŜyłem korpusu 251 utworów 5 kompozytorów:
Liczba
utworów
J.S.Bach
Ilość róŜnych
n-gramów
Pojemność
n-gramy
melodyczne
n-gramy
rytmiczne
109
963kB
59932
45451
11584
L. van Beethoven
44
1399kB
54299
48076
12836
F.Chopin
58
1052kB
38508
33711
9341
W.A.Mozart
17
448kB
16554
13981
5345
F.Schubert
23
1116kB
27311
24560
7217
251
4978kB
189494
149364
37297
Suma
3. Profile kompozytorów i ich analiza
Produktem ubocznym powyŜszej analizy jest macierz utwór-sekwencja – podobna do
macierzy document-term znanej z IR. W ramach projektu wykonałem 2 typy analizy na tych
danych jedną metodę typu „unsupervised” a drugą „supervised”.
Wszystkie programy analizujące zostały napisane w języku PERL a program
wizualizacyjny i analizator MIDI – w OpenGL + C++.
a) analizator – program w C++ o składni wywołania ./preprocessor plik.mid generuje
plik result.mtxt w którym dane zapisane są w postaci
channel 1 [liczba nut]
[zmiana rytmu1][zmiana melodii1]
[zmiana rytmu2][zmiana melodii2]
[zmiana rytmu3][zmiana melodii3]
…
channel [nr kanału] [liczba nut]
[zmiana rytmu1][zmiana melodii1]
[zmiana rytmu2][zmiana melodii2]
[zmiana rytmu3][zmiana melodii3]
Które następnie mogą być przetwarzane przez perlowe programy
b) program treningowy train.pl
Program w Perlu który zbiera informacje z pliku wejściowego .mid i zapisuje
profile w bazie danych gdbm. Składnia programu ./train.pl <kompozytor>
<plik.mid>[…]. Program korzysta z preprocesora przy parsowaniu pliku. Po
nauczeniu wszystkich utworów obecne są 3 katalogi – profiles,
melodicprofiles,
rhythmicprofiles. Posiadają one profile rytmiczne,
melodyczne oraz kombinowane dla kaŜdego kompozytora:
torch: ~$ ls *profiles
melodicprofiles:
bach.gdbm
beeth.gdbm
chopin.gdbm
mozart.gdbm
schub.gdbm
profiles:
bach.gdbm
chopin.gdbm
mozart.gdbm
schub.gdbm
beeth.gdbm
2/9
rhythmicprofiles:
bach.gdbm
beeth.gdbm
chopin.gdbm
mozart.gdbm
schub.gdbm
c) program extract.pl i addstat.pl do wypełniania macierzy document-term:
Program extract.pl pobiera dane o wszystkich n-gramach i tworzy listę
unikalnych słów dla wszystkich kompozytorów wpisując je w kolejności od
najczęściej uŜywanego, do najrzadziej tworząc pliki profiles.xlsdata,
melodicprofiles.xlsdata i rhythmicprofiles.xlsdata program addstat.pl
(składnia ./addstat/pl […lista plików .mid]) dodaje statystyki dla kaŜdego
pliku muzycznego.
Wyjściowe pliki są bardzo duŜe ( w KB):
torch: /tmp/jacek$ du -ks *data
110472 profiles.xlsdata
77312
profilesmelody.xlsdata
20800
profilesrhythm.xlsdata
Te macierze mogą juŜ być przetwarzane przez dalsze algorytmy.
4. Prawo Zipfa dla utworów muzycznych
Zanim zastosujemy metody odpowiednie do tekstów, zbadajmy, czy dane muzyczne
spełniają fundamentalne prawo Zipfa dla tekstów, które jest podstawą narzędzi badania
tekstów. Mówi ono o liniowej zaleŜności logarytmu częstości występowania słowa, do
logarytmu rangi słowa w korpusie. Dla tych danych jest to spełnione:
combined – słowa rytmiczno-melodyczne.
melody – słowa melodii
rhythm – słowa rytmu
5. Dekompozycja SVD
Analiza SVD (Singular values decomposition) zwana w informatyce pod nazwą PCA
(Partial component analysis) polega na przeniesienie danego przekształcenia (macierzy) do
3/9
nowej bazy tak, aby wartości kolejnych wymiarów były moŜliwie jak najmniejsze.
Najogólniej, przy prawie 200tys cech dla 250 utworów wystarczyłoby 250 wymiarów, by
dokładnie rozpoznać kaŜdy utwór ale my chcemy jeszcze bardziej to uprościć. Innymi słowy
– kaŜdy następny wymiar przynosi coraz mniej informacji więc moŜna arbitralnie obciąć
część wymiarów pogarszając jakość danych, ale teŜ móc spróbować wizualizować te dane,
np. w 3-wymiarowych przestrzeniach.
Metoda ta jest typu „unsupervised” czyli nie potrzebuje wiedzieć, która kolumna
naleŜy do którego kompozytora. Ma to duŜo zalet, gdyŜ jeŜeli się powiedzie, moŜna załoŜyć,
Ŝe przy dodaniu nowych utworów i nowych kompozytorów – wynik będzie zbliŜony, tzn. Ŝe
poprawnie rozpozna pojawienie się nowego kompozytora. Wadą jest to, Ŝe nie przekazujemy
programowi prawie nic – musimy liczyć na jego intuicję, Ŝe uda mu się rozpoznać poprawnie
przypisać cechy.
Na macierzy profiles.xlsdata (ogólnej) przeprowadziłem dekompozycję SVD
programem svd(.exe) wczytujący macierz z pliku M.txt i generujący macierze U, W i V
takie, Ŝe M=UWV gdzie W jest macierzą diagonalną wartości własnych M (wskazuje na
waŜności nowych wymiarów) a U i V – odwzorowaniami dokumentów i n-gramów w nowej
przestrzeni. Program jest własny, jednakowoŜ przy implementacji algorytmu wsparłem się
implementacją SVD z ksiąŜki „Numerical Receipes In C”. Wykonując mnoŜenie UTM
uzyskujemy proporcjonalne współrzędne dla nowej przestrzeni tym razem 251 wymiarowej,
gdzie najistotniejsze są początkowe wymiary.
Wyniki przeprowadzonej analizy nie satysfakcjonują jednak – okazuje się, Ŝe
kompozytorskość nie jest pierwszorzędową cechą. MoŜe wydawać się to oczywiste –
najbardziej liczą się takie rzeczy, jak forma, tryb, tempo utworu i to one powinny wyjść w
analizie.
Poza tym – wiele wymiarów, nie tylko pierwsze 2, 3 niosą duŜo informacji – oto
wykres „waŜności wymiarów”:
800
700
600
500
400
300
200
100
0
Wartość własna
0
20
40
60
80
100
120
140
160
180
200
220
240
Ten wykres pokazuje, Ŝe całkiem sporo informacji niosą nam wartości własne do 20.
zatem wizualizacja w 3 wymiarach nie moŜe dać nam wiele.
4/9
O tym, Ŝe te wartości zachowują się monotonicznie (we współrzędnych
logarytmicznych) świadczą poniŜsze dwa wykresy:
Program show.exe wykorzystuje OpenGL do wizualizacji punktów w przestrzeni 3D. Program
ładuje współrzędne punktów z pliku points.dat we wszystkich wymiarach i prezentuje
pierwsze 3. Sterując klawiszami 0-9 przestawiamy widoki między wymiarami.
Poszczególne kolory oznaczają róŜnych kompozytorów:
Wymiary (0,1,2): (nie pokazują one niczego szczególnego)
Wymiary
(4,6):
(wyraźne
zielonym(Beethovenem))
rozróŜnienie
5/9
między
czerwonym(Bachem)
a
Wymiary (4,7,8): (wyraźna grupa czerwona (Bach))
Wnioski:
Metody „unsupervised” jak dekompozycja SVD nie nadają się do określania autorstwa
utworów muzycznych. Jest to wynikiem tego, Ŝe za przynaleŜność do konkretnego autora
odpowiadają dosyć subtelne cechy tak, Ŝe bez określenia grupy treningowej – nie moŜna
rozpoznać autorów. Co prawda – pewne grupy da się zauwaŜyć, ale ujawniają się one dopiero
po odkryciu autorstwa, co mija się z celem metod bez nauczyciela.
6. Badanie Entropii
W ogromie ilości danych naleŜałby znaleźć metodę do usunięcia zbędnych danych –
informacji, które nic nie wnoszą, które zaszumianą sytuację, które wręcz zmylają klasyfikator.
6/9
Cecha która dobrze klasyfikuje powinna charakteryzować się duŜą entropią wewnątrz
grupy utworów jednego kompozytora, a małą entropią entropii wszystkich grup
kompozytorskich, innymi słowy – powinna często występować wśród jego utworów i rzadko
– gdzieindziej.
Miarą dobroci informacyjnej słowa jest R (definicja):
Oznaczmy H(i,k) jako informację jaką niesie słowo ‘i’ w grupie kompozytora
‘k’ (‘k’ zmienne od 1 do ‘N’). Ustalam, Ŝe entropia samych zer jest równa 0.
Ranga cechy ‘i’ – R(i) oznaczam jako:
(
R (i ) = max (H (i, k ) ) log 2 N − H (i )
k ∈1.. N
k
)
Czyli ranga cechy jest proporcjonalna do informacji jaka niesie o kompozytorze na
którego wskazuje i proporcjonalna do informacji, jak ta cecha wyróŜnia tego kompozytora w
danej grupie.
Program calc.entropy.pl liczy rangi dla kaŜdego słowa i zapisuje je na wyjście.
NajwaŜniejsza część programu – obliczająca rangę:
#oblicznie entropii w grupach kompozytorskich
foreach my $c (@composers) {
entropies{$item}{$c}=entropy(@vals[($composers_ranges{$c}[0])..($composers_ranges{$c}[1])]) ;
}
#obliczanie rang na podstawie powyŜszych entropii
$rank{$item}=max(values %{$entropies{$item}})*
( log(scalar @composers)/log(2)- entropy(values %{$entropies{$item}}) );
Następnie listę entropii (wraz z Zipf’owską rangą kaŜdego słowa) przetworzyłem
przez program entropy.plot.pl, który zliczał w oktawach rank Zipf’owskich ilość
wystąpień następujących grup słów:
1) grupa słów o R(i)>2.322 (‘key words’)
2) grupa słów o 2.32<R(i)<2.322 (‘ones’)
3) grupa słów o 0<R(i)<2.32 (‘stop words’)
4) grupa słów o R(i)=0 (‘noise words’)
Pierwsza grupa to słowa niosące nam najwięcej informacji o ręku autora. Druga grupa
wskazuje nam granicę między wiedzą a zmylaniem. Wartość R(i)~2.321 mają n-gramy o
strukturze H(i,k)k=1..N=(0,….,0,1,0,….,0) przy N=5. Mówią nam one, Ŝe powtórzenie n-gramu
w innym utworze tego samego kompozytora było jednokrotne, zatem moŜemy twierdzić, Ŝe
przypadkowe, a szanse na to były jak 1/N, czyli ta cecha na 1/N wskazuje na właściwego
kompozytora (zakładając losowość wystąpienia cechy) czyli działa jak klasyfikator losowy.
Trzecia grupa nie wnosi niewiedzy, po prostu moŜe mieć trochę inną strukturę, ale uznałem,
Ŝe to są juŜ słowa które bardziej zamydlają oczy niŜ przynoszą informację. Czwarta grupa to
słowa, które mają maksymalnie jednego reprezentanta w kaŜdej grupie – zerowa przydatność.
Dodatkowo program zipf2.pl oblicza jaki procent zajmują do tej pory
przeanalizowane słowa w całym korpusie.
Oto wykresy proporcji liczności tych grup do liczności przedziału (2i) dla słów
rytmiczno-melodycznych. Linie oznaczone ‘%’ stanowią o zajętości korpusu
dotychczasowymi słowami (max 412868 słów):
7/9
1
rozkład słów w korpusie
0.9
0.8
I
0.7
II
III
0.6
IV
%
0.5
0.4
0.3
0.2
0.1
przedział (log(Zipf's rank))
0
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Dla słów melodycznych:
1
rozkład słów w korpusie
0.9
0.8
I
0.7
II
III
0.6
IV
%
0.5
0.4
0.3
0.2
0.1
przedział (log(Zipf's rank))
0
0
1
2
3
4
5
6
7
8
Oraz rytmicznych:
8/9
9
10
11
12
13
14
15
16
17
1
rozkład słów w korpusie
0.9
0.8
I
0.7
II
III
0.6
IV
%
0.5
0.4
0.3
0.2
0.1
przedział (log(Zipf's rank))
0
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Wnioski:
ZauwaŜam, Ŝe pierwsze 16-64 (24-26) słów to wyłącznie ‘stop words’ – słowa
powszechnie uŜywane przez wszystkich kompozytorów – nie pomagają one nam rozróŜnić
kompozytorów od siebie a jedynie wprowadzają bałagan. Jak moŜna zaobserwować stanowi
to kłopot obliczeniowy wyłącznie przy profilach rytmicznych gdzie stanowią one ok. 65%
wszystkich słów (dwa na trzy słowa są nimi). Przy profilach melodycznych jest to ok. 5%
zawartości. Następnie we wszystkich profilach następuje okres nasilania występowania ‘key
words’, gdzie nawet co drugie słowo ma duŜe znaczenie dla danego kompozytora. We
wszystkich profilach okres ten pochłania 20-25% całej masy słów. Przy 1000-2000 słowie
(210-211) zaczynają dominować ‘noise words’ i ‘ones’ – przypadkowe potknięcia – raz, dwa
razy uŜyte frazy – nic nie wnoszące. Potkniętych rytmów jest stosunkowo mało (ok. 5-10%) o
tyle ‘przypadkowe melodie’ mogą stanowić ok. 70% całej masy papieru, na której zostały
wydrukowane.
Ostatnia konkluzja mówi nam, Ŝe utwory muzyczne składają się najczęściej z
unikalnych fraz nawet w ramach jednego utworu, nie do podrobienia Ŝadną metodą. Zatem
próby statystycznego generowania utworów muzycznych muszą oprzeć się na innej metodzie.
7. Podsumowanie, wnioski
Swoją analizą potwierdzam podatność danych muzycznych na analizę podobną tej,
znanej z IR czy TDM. Utwory muzyczne oporne są jednak na analizę metodami bez
nauczyciela, zdecydowanie preferowane byłyby metody ‘supervised’. Pozytywnie dziwi
skupienie słów kluczowych w środku przetwarzanej logarytmicznej skali problemu.
Świadczyłoby to o podatności na indeksowanie a potem wyszukiwanie w takim zbiorze
klasycznymi metodami Information Retrieval. To, co teraz moŜna udoskonalić, to próba
zwiększenia skuteczności klasyfikatora poprzez obcięcie ‘noise words’ i ‘stop words’ z
przetwarzanego korpusu. Pozwoliłoby to 4 krotnie zmniejszyć ilość przetwarzanych danych i
100 krotnie zmniejszyć wymagania profilowe.
9/9