Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Βήμα 10: Error στο GeneralMixtureModel.from_samples() #57

Closed
vassilispan opened this issue Dec 19, 2020 · 14 comments
Closed

Βήμα 10: Error στο GeneralMixtureModel.from_samples() #57

vassilispan opened this issue Dec 19, 2020 · 14 comments

Comments

@vassilispan
Copy link

Καλησπέρα σας.

Εδώ και μερικές μέρες έχουμε κολλήσει σε ένα πρόβλημα που αφορά τις βιβλιοθήκες.
Αρχικά τρέχαμε τον κώδικα με βάση τα default versions που είχαμε εγκαταστήσει, δοκιμάζοντας διάφορους συνδυασμούς παραμέτρων, ωστόσο οι επιδόσεις ήταν συνεχώς γύρω από το 50%. Παράλληλα έβγαζε και αυτά τα errors που αναφέρθηκαν στο issue #43 και προτείνατε να τα αγνοήσουμε καθώς αν τα υπόλοιπα είχαν γίνει σωστά θα έπρεπε να βγάζει σωστές τιμές.

Τελικά, εγκαταστήσαμε τα προτεινόμενα πακέτα σε νέο environment με βάση την δική σας αναφορά #44 .

Αρχικά, μας πέταγε πρόβλημα όταν δίναμε στο gmm.from_samples() το όρισμα Χ ως λιστα από λίστες (n_samples στοιχεία όπου κάθε στοιχείο έχει m_features) και ζήταγε np.array. Το error ήταν AttributeError: 'list' object has no attribute 'shape'. Σημειώνεται ότι στην αρχική default εγκατάσταση δεν μας πέταγε τέτοιο πρόβλημα, δεχόταν κανονικά το Χ.

Αφού μετατρέψαμε τη λίστα σε np.array (n_samples, m_features) έδινε Segmentation fault: 11.

Μετά μετατρέψαμε τον πίνακα σε 'float64' με βάση ένα σχόλιο στο #44. Εκεί γινόταν το εξής παράξενο. Σε διαφορετικές εκτελέσεις του προγράμματος έδινε διαφορετικά σφάλματα. Τη μία φορά έδινε segmentation fault, την άλλη έτρεχε την πρώτη επανάληψη του loop των n_states ενώ στην δεύτερη έδινε Segmentation fault: 11. Τρέχοντας το ξανά μας πέταγε το πρόβλημα με τον kmeans που είχε αναφέρει ένας συνάδελφος στο #44. Γενικότερα σε κάθε εκτέλεση έδινε άλλα σφάλματα.

Τελικά δοκιμάσαμε να χρησιμοποιήσουμε την MultivariateGaussianDistribution.from_samples(X) αντί για το gmm και μας έδινε επίδοση στο 92%...

Τι πρέπει να κάνουμε τωρα; Γιατί η περισσότερη ώρα της ενασχόλησης μας με την εργασία έχει αναλωθεί για την αντιμετώπιση αυτών των errors...

@georgepar
Copy link
Contributor

Θυμάμαι αυτό το error εβγαινε σαν warning, αλλα δε σταματουσε η εκτέλεση και έπαιρνες κανονικά αποτελέσματα.
Δείτε αν είναι η ίδια περίπτωση και σε σας.

@vassilispan
Copy link
Author

Δυστυχως μας σταματαει τελειώς την εκτέλεση δεν έχουμε τίποτα. Τις περισσότερες φορές με segmentation fault...

@danae-charitou
Copy link

Και σε εμάς (#60) παρουσιάζει την ίδια συμπεριφορά. Δηλαδή εμφανίζεται ως σφάλμα και όχι ως warning, οπότε δεν μπορούμε να παράξουμε κάποιο output και να συνεχίσουμε με τα επόμενα βήματα.

@georgepar
Copy link
Contributor

georgepar commented Dec 21, 2020

Έτρεξα τη δική μας λύση για να επιβεβαιώσω (ακολουθώντας ακριβώς τις οδηγίες για στήσιμο περιβάλλοντος στο σχετικό issue) και βλέπω ότι σε κάποια ψηφία μπορεί να σκάει το GMM - HMM με n_mixture>1.

Αυτό που προτείνω να κάνετε είναι ενα απλό grid search για 2-3 τιμές του n_mixture σε κάθε ψηφίο:

for digit in digits:
   select X_train / y_train
   for n_states, n_mixture in (possible values for n_states, n_mixtures):
         try:
               model = train gmm hmm model
               log_likelihood = calculate model log likelihood
          except:
                # Failed to train GMM HMM model. Ignore
                log likelihood = infinity
          # n_mixture = 1 is equivalent to MultivariateGausian model
          # should converge for every digit
          # some digits benefit from larger number of mixtures
          keep model with smallest log likelihood.

Γενικά τα GMM / HMM μοντέλα από τη φύση τους είναι κάπως ευαίσθητα στο initialization, και είναι εύκολο να απειριστούν τιμές, ή να πέσεις σε περιπτώσεις όπου δεν μπορείς να αντιστρέψεις τον πινακα covariance. (και αυτό δεν είναι θέμα βιβλιοθήκης, είναι στη φύση του μοντέλου), οπότε η επιλογή των παραμέτρων τους πολλές φορές είναι αναγκαία.

Στον παραπάνω κώδικα θα δείτε ότι άλλα ψηφία μπορούν να μοντελοποιηθούν με 2-3 mixtures, ενώ άλλα μόνο με 1. (ανάλογα και τον αριθμό των features που χρησιμοποιείτε).

Πιο ευσταθές είναι, όπως έχετε δει και στο μάθημα, όταν αναγκάζουμε τον πίνακα συνδιακύμανσης να είναι διαγώνιος (δηλαδή όταν υποθέτουμε ότι οι γκαουσιανες στα mixtures είναι ανεξάρτητες). Έτσι γίνεται πολύ πιο εύκολη η εκπαίδευση και δεν πέφτουμε τόσο συχνά σε τέτοια θέματα.
(η αντιστροφή ενός full covariance matrix γίνεται με cholesky decomposition και απαιτεί σε όλα τα updates ο covariance matrix να παραμένει positive definite. Η αντιστροφή ενός διαγώνιου πίνακα είναι πολύ πιο απλή 1/(τα στοιχεία της διαγωνίου) και άρα δεν σκάει τόσο εύκολα.)

Αυτό είναι και το default στα μεγάλα frameworks αναγνώρισης φωνής, όπως το kaldi.

Αν θέλετε να το ψάξετε λίγο παραπάνω, στο framework που χρησιμοποιείτε αυτό γίνεται ως εξής

diagonal_gmm = IndependentComponentsDistribution([MultivariateGaussianDistribution(...) for _ in n_mixtures]) # random initialization of eatch Gaussian component

@inikokali
Copy link

Στη δική μας περίπτωση ακόμη και με n_mixtures=1 παρατηρείται το ίδιο σφάλμα όσες φορές και να τρέξουμε τον κώδικα σε οποιονδήποτε από τους δύο υπολογιστές της ομάδας. Επίσης το δικό μας σφάλμα είναι το σφάλμα που έχουν αναφέρει τα παιδιά στο #43 το οποίο αφορά μετατροπή complex128 σε float64. Επίσης η συμπεριφορά που περιγράφεται παραπάνω παρατηρείται είτε τρέξουμε τον κώδικα σε jupyter είτε με python script. Ωστόσο σε άλλο υπολογιστή ο κώδικας τρέχει κανονικά. Δηλαδή το error αυτό εμφανίζεται ως warning.

@georgepar
Copy link
Contributor

georgepar commented Dec 21, 2020

Στη δική μας περίπτωση ακόμη και με n_mixtures=1 παρατηρείται το ίδιο σφάλμα όσες φορές και να τρέξουμε τον κώδικα σε οποιονδήποτε από τους δύο υπολογιστές της ομάδας. Επίσης το δικό μας σφάλμα είναι το σφάλμα που έχουν αναφέρει τα παιδιά στο #43 το οποίο αφορά μετατροπή complex128 σε float64. Επίσης η συμπεριφορά που περιγράφεται παραπάνω παρατηρείται είτε τρέξουμε τον κώδικα σε jupyter είτε με python script. Ωστόσο σε άλλο υπολογιστή ο κώδικας τρέχει κανονικά. Δηλαδή το error αυτό εμφανίζεται ως warning.

Σε αυτη την περιπτωση δεν εχετε στησει σωστα τα πακέτα 99%. Φτιάξτε ένα νεο conda environment και ακολουθήστε επακριβώς τις οδηγίες εδώ: #44 (comment)

Αν δεν δουλεύει ούτε αυτό τότε δε γνωρίζω τι μπορεί να φταίει με αυτά τα δεδομένα.

@inikokali
Copy link

Δυστυχώς έχουμε φτιαξει 3-4 διαφορετικα περιβάλλοντα με τεράστια προσοχή στις οδηγίες που δίνετε παραπάνω και δεν τρέχει σε κανένα. Στην περίπτωση αυτή εμείς πως μπορούμε να συνεχίσουμε?

@efthymisgeo
Copy link
Contributor

Στη δική μας περίπτωση ακόμη και με n_mixtures=1 παρατηρείται το ίδιο σφάλμα όσες φορές και να τρέξουμε τον κώδικα σε οποιονδήποτε από τους δύο υπολογιστές της ομάδας. Επίσης το δικό μας σφάλμα είναι το σφάλμα που έχουν αναφέρει τα παιδιά στο #43 το οποίο αφορά μετατροπή complex128 σε float64. Επίσης η συμπεριφορά που περιγράφεται παραπάνω παρατηρείται είτε τρέξουμε τον κώδικα σε jupyter είτε με python script. Ωστόσο σε άλλο υπολογιστή ο κώδικας τρέχει κανονικά. Δηλαδή το error αυτό εμφανίζεται ως warning.

Σε linux? Επίσης δεν υπάρχει η δυνατότητα να το τρέξετε στο μηχάνημα που δεν σας σκάει?

@inikokali
Copy link

Ναι σε linux δουλεύουμε. Δυστυχώς όχι δεν έχουμε αυτή τη δυνατότητα. :(

@michaelbzms
Copy link

for digit in digits:
select X_train / y_train
for n_states, n_mixture in (possible values for n_states, n_mixtures):
try:
model = train gmm hmm model
log_likelihood = calculate model log likelihood
except:
# Failed to train GMM HMM model. Ignore
log likelihood = infinity
# n_mixture = 1 is equivalent to MultivariateGausian model
# should converge for every digit
# some digits benefit from larger number of mixtures
keep model with smallest log likelihood.

To hyperparameter tuning δεν πρέπει να γίνει στο ensemble των hmms που χρησιμοποιούμε ως κατηγοριοποιητή; Πως γίνεται να το εφαρμόσουμε σε κάθε hmm ξεχωριστά και γιατί στον παραπάνω κώδικα κρατάμε αυτό με το μικρότερο log likelihood αφου τελικά επιλέγουμε το μοντέλο με το μεγαλύτερο log likelihood?

@georgepar
Copy link
Contributor

To hyperparameter tuning δεν πρέπει να γίνει στο ensemble των hmms που χρησιμοποιούμε ως κατηγοριοποιητή; Πως γίνεται να το εφαρμόσουμε σε κάθε hmm ξεχωριστά;

Για κάθε digit χωριστα. Απλα κάνετε tuning μέσα στη λουπα που τρέχει πάνω στα digits.

γιατί στον παραπάνω κώδικα κρατάμε αυτό με το μικρότερο log likelihood αφου τελικά επιλέγουμε το μοντέλο με το μεγαλύτερο log likelihood?

negative log likelihood. mea culpa

@michaelbzms
Copy link

Το μεγαλύτερο average loglikelihood; Γιατί για κάθε sample στο validation θα πάρουμε και ένα διαφορετικό loglikelihood. Θα είχε νόημα και το μεγαλύτερο min loglikelihood ίσως;

@georgepar
Copy link
Contributor

ναι το μέσο Log likelihood όλων των δειγμάτων εννοούμε. Αν για κάποιο δείγμα παίρνει inf / nan τιμές αγνοήστε το κατά το averaging.

@michaelbzms
Copy link

Δεν μας εχει δώσει ποτέ inf μεχρι στιγμής. Ευχαριστώ.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants