Un papier que je lisais, http: // www .cs.toronto.edu / ~ ilya / pubs / 2011 / LANG-RNN.PDF , utilise des bits par caractère en tant que métrique de test pour estimer la qualité des modèles d'ordinateur génératifs de texte mais ne fait pas référence à la manière dont il était calculé. Googling autour, je ne peux vraiment rien trouver à ce sujet. P>
Est-ce que quelqu'un sait comment le calculer? Python de préférence, mais la pseudo-code ou quoi que ce soit fonctionne. Merci! P>
3 Réponses :
La bibliothèque SYS a une fonction GETIZEOF (), cela peut être utile? http://docs.python.org/dev/Library/sys p>
bits par caractère est une mesure de la performance des méthodes de compression. Il est appliqué en comprimant une chaîne puis en mesurant combien de bits la représentation comprimée prend totalement, divisé par le nombre de symboles (c'est-à-dire des caractères) dans la chaîne d'origine. Moins de bits par caractère La version compressée prend, plus la méthode de compression est efficace. P>
En d'autres termes, les auteurs utilisent leur modèle de langue générative, entre autres, pour compression em> et en supposant qu'une efficacité élevée em> de la méthode de compression résultante indique une hauteur. précision em> du modèle génératif sous-jacent. p>
dans la section 1, ils indiquent: p>
Le but du papier est de démontrer la puissance des grandes RNN entraînées avec le nouvel optimiseur sans Hessian en les appliquant à la tâche de prédire le caractère suivant dans un flux de texte. C'est un problème important, car un meilleur modèle de langue de niveau de caractère pourrait améliorer la compression des fichiers texte (Rissanen & Langdon, 1979) [...] p>
blockQuote>
L'article de Rissanen & Langdon (1979) est la description originale de codage arithmétique fort> , un procédé bien connu pour la compression de texte. p>
Le codage arithmétique fonctionne sur la base d'un modèle de langue générative, tel que celui que les auteurs ont construit. Compte tenu d'une séquence de caractères (éventuellement vide), le modèle prédit quel personnage peut venir ensuite. Les humains peuvent aussi faire cela, par exemple, étant donné la séquence d'entrée Ceci s'adapte naturellement avec le codage arithmétique: donné une séquence d'entrée qui a déjà été codée, la séquence de bits pour le caractère suivant est déterminée par la répartition des probabilités de caractères possibles: les caractères à haute probabilité Obtenez une séquence de bits courte, des caractères bas la probabilité obtenir une séquence plus longue. Ensuite, le caractère suivant est lu à partir de l'entrée et codé à l'aide de la séquence de bits qui a été déterminée à partir de la distribution de probabilité. Si le modèle de langue est bon, le caractère aura été prédit avec une probabilité élevée. La séquence de bits sera donc courte em>. Ensuite, la compression continue avec le caractère suivant, à nouveau en utilisant l'entrée jusqu'à présent pour établir une distribution de probabilité de caractères, déterminer des séquences de bits, puis lire le caractère suivant réel et le coder en conséquence. P>
Notez que le modèle génératif est utilisé à chaque étape pour établir une nouvelle distribution de probabilité. Il s'agit donc d'une instance de codage arithmétique adaptatif em>. P>
Après que toute entrée a été lue et codée, la longueur totale (dans les bits) du résultat est mesurée et divisée par le nombre de caractères dans l'entrée d'origine et non compressée. Si le modèle est bon, il aura prédit les personnages à haute précision, la séquence de bits utilisée pour chaque caractère aura été courte en moyenne, d'où le total des bits par caractère sera faible. P>
Je ne suis pas au courant d'une mise en œuvre de codage arithmétique qui permet une intégration facile de votre propre modèle de langue générative. La plupart des implémentations construisent leur propre modèle adaptatif à la volée, c'est-à-dire. Ils ajustent les tables de fréquence de caractères lorsqu'ils lisent l'entrée. P>
Une option pour vous peut être de commencer avec Arcode . J'ai examiné le code et il semble que cela puisse être possible d'intégrer votre propre modèle, bien que ce ne soit pas très facile. Le membre
Hello w code>, nous pouvons deviner les probabilités pour le caractère suivant:
o code> a une probabilité élevée (car
bonjour monde code> est une continuation plausible), mais des caractères comme
h code> comme dans
bonjour où puis-je trouver .. code> ou
i code> comme dans
Bonjour Winston Code> a également une probabilité non nulle. Nous pouvons donc établir une distribution de probabilité em> de caractères pour cette entrée particulière, et c'est exactement ce que le modèle générateur des auteurs aussi. P>
auto._ranges code> représente le modèle de langue; Fondamentalement comme un éventail de fréquences de caractère cumulatif, donc
self._ranges [ord (d ('d')] code> est la fréquence relative totale de tous les caractères inférieurs à
d code> (c.-à-d.
A code>,
B code>,
c code> si nous supposons uniquement des caractères alphabétiques minuscules). Vous devriez modifier ce tableau après chaque caractère d'entrée et cartographier les probabilités de caractères que vous recevez du modèle générateur à des gammes de fréquences de caractère. P>
Le modèle que je travaille sur génère une distribution de probabilité pour le caractère suivant, étant donné une longueur fixe de caractères précédents. Il semble donc que ce soit un peu de travail, mais je devrais pouvoir le comprendre.
@Newmu Cela devrait certainement être possible. Mais je suis d'accord, il sera facile de faire des erreurs. Vous aurez besoin de la tester soigneusement après la mise en œuvre. (Malheureusement, je n'ai pas d'insisties connaissances sur Arcode. Le code semblait être relativement i> facile à comprendre, c'est pourquoi j'ai suggéré ce module. Il y en a d'autres aussi. Si vous faites une recherche "Si vous faites une recherche" Codage arithmétique Python "ou similaire, vous pourrez peut-être trouver des implémentations plus appropriées.)
Pour le bénéfice des autres rechercher des informations sur BPC, ce fil à CrossValidée complète ces réponses solides avec d'autres détails, telles que des équations formelles, etc. statists.stackexchange.com/questions/211858/...
dans "Séquences génératrices avec des réseaux de neurones récurrents" par Alex Graves (2014), il est donné comme suit: -log P (x (t + 1) | y (t)) sur l'ensemble de l'ensemble de données. Dans ce numéro X (T + 1), le symbole correct et Y (t) est la sortie de l'algorithme. Cette probabilité conditionnelle est celle que vous affectez à la bonne réponse. P>
Par conséquent, si la sortie de votre système est probabiliste, c'est la puissance prédictive moyenne. p>
Parlez-vous des trucs définis dans C
Char_bit Code> TIGCC.TICALC .org / doc / limites.html # Char_bit ?
Nope, ceci est lié à la théorie de l'information et à l'entropie, pas de taille de bit réelle.