Fast Text Compression with Neural Networks

Matthew V. Mahoney
Computer Science Dept., Florida Institute of Technology
150 W. University Dr., Melbourne FL 32901

© 2000, AAAI, All rights reserved


Neural networks have the potential to extend data compression algorithms beyond the character level n-gram models now in use, but have usually been avoided because they are too slow to be practical. We introduce a model that produces better compression than popular Limpel-Ziv compressors (zip, gzip, compress), and is competitive in time, space, and compression ratio with PPM and Burrows-Wheeler algorithms, currently the best known. The compressor, a bit-level predictive arithmetic encoder using a 2 layer, 4 × 106 by 1 network, is fast (about 104 characters/second) because only 4-5 connections are simultaneously active and because it uses a variable learning rate optimized for one-pass training.

Keywords: Neural networks, Text compression, Data compression, On-line training/learning, Maximum entropy, Prediction, Efficiency.

1. Introduction

One of the motivations for using neural networks for data compression is that they excel in complex pattern recognition. Standard compression algorithms, such as Limpel-Ziv or PPM (Bell, Witten, and Cleary, 1989) or Burrows-Wheeler (Burrows and Wheeler, 1994) are based on simple n-gram models: they exploit the nonuniform distribution of text sequences found in most data. For example, the character trigram the is more common than qzv in English text, so the former would be assigned a shorter code. However, there are other types of learnable redundancies that cannot be modeled using n-gram frequencies. For example, Rosenfeld (1996) combined word trigrams with semantic associations, such as "fire...heat", where certain pairs of words are likely to occur near each other but the intervening text may vary, to achieve an unsurpassed word perplexity of 68, or about 1.23 bits per character (bpc) [1], on the 38 million word Wall Street Journal corpus. Connectionist neural models (Feldman and Ballard, 1982) are well suited for modeling language constraints such as these, e.g. by using neurons to represent letters and words, and connections to model associations.

We follow the approach of Schmidhuber and Heil (1996) of using neural network prediction followed by arithmetic encoding, a model that they derived from PPM (prediction by partial match), developed by Bell, Witten, and Cleary. In a predictive encoder, a predictor, observing a stream of input characters, assigns a probability distribution for the next character. An arithmetic encoder, starting with the real interval [0, 1], repeatedly subdivides this range for each character in proportion to the predicted distribution, with the largest subintervals for the most likely characters. Then after the character is observed, the corresponding subinterval becomes the new (smaller) range. The encoder output is the shortest number that can be expressed as a binary fraction within the resulting final range. Since arithmetic encoding is optimal within one bit of the Shannon limit of log2 1/P(x) bits (where P(x) is the probability of the entire input string, x), compression ratio depends almost entirely on the predictor.

Schmidhuber and Heil replaced the PPM predictor (which matches the context of the last few characters to previous occurrences in the input) with a 3-layer neural network trained by back propagation to assign character probabilities when given the context as input. Unfortunately the algorithm was too slow to make it practical to test on standard benchmarks, such as the Calgary corpus (Bell, Witten, and Cleary, 1989). Training on a 10K to 20K text file required days of computation on an HP 700 workstation, and the prediction phase (which compressed English and German newspaper articles to 2.94 bpc) ran 1000 times slower than standard methods. In contrast, the 2-layer network we describe, which learns and predicts in a single pass, will compress a similar quantity of text in about 2 seconds on a 100 Mhz 80486 (typically achieving better compression).

In section 2, we describe a neural network that predicts the input one bit at a time, and show that it is equivalent to the maximum-entropy (Rosenfeld, 1996; Manning and Schütze, 1999, pp. 589 ff) approach to combining probabilistic constraints. In (3), we derive an optimal one-pass learning rate for independent, stationary inputs, and extend the model to the more general case. In (4), we compare this model to a number of variations and find experimentally that it is the best. In (5), we find experimentally that neural network compression performs almost as well as PPM and Burrows-Wheeler (current the best known character models) in both speed and compression ratio, and better (but slower) than popular Limpel-Ziv models such as UNIX compress, zip, and gzip. In (6) we describe the implementation.

[1]. Rosenfeld's perplexity of 68 is equivalent to an entropy of log2 68 = 6.09 bits per word, or 1.11 bpc at 5.5 characters per word (including spaces). In addition, we assume that the 2.2% of the words outside a 20,000 word vocabulary that Rosenfeld modeled as a single token could be encoded at 3 bits per 10 character word using a reasonable n-gram character model, adding 3 x 0.022 x 10/5.5 = 0.12 bpc. The 20K dictionary would add negligible space.

2. A Maximum Entropy Neural Network

In a predictive encoder, we are interested in predicting the next input symbol y, given a feature vector x = x1, x2,..., xM, where each xi is a 1 if a particular context is present in the input history, and 0 otherwise. In our implementation, we predict one bit at a time, so y is either 0 or 1. We can estimate P(y = 1|xi) » N(1)/N, for each context xi, by counting the number of times, N(1), that y = 1 occurs in the N occurrences of that context. In an n-gram character model (n about 4 to 6), there would be one active input (xi = 1) for each of the n contexts.

The set of known probabilities P(y|xi) does not completely constrain the joint distribution P(y|x) that we are interested in finding. According to the maximum entropy principle, the most likely distribution for P(y|x) is the one with the highest entropy, and furthermore it must have the form (using the notation of Manning and Schütze)

  1. P(x, y) = 1/Z Pi aifi(x, y)

where fi(x, y) is an arbitrary "feature" function, equal to xi in our case, ai are parameters to be determined, and Z is a normalization constant to make the probabilities sum to 1. The ai are found by generalized iterative scaling (GIS), which is guaranteed to converge to the unique solution. Essentially, GIS adjusts the ai until P(x, y) is consistent with the known probabilities P(xi, y) found by counting n-grams.

Taking the log of (1), and using the fact that P(y|x) = P(x, y)/P(x), we can rewrite (1) in the following form:

  1. P(y|x) = 1/Z' exp(Si wixi)

where wi = log ai. Setting Z' so that P(y = 0|x) + P(y = 1|x) = 1, we obtain

  1. P(y|x) = g(Si wixi), where
  2. g(x) = 1/(1 + e-x)

which is a 2-layer neural network with M input units xi and a single output P(y = 1|x).

Analogous to GIS, we train the network to satisfy the known probabilities P(y|xi) by iteratively adjusting the weights wi to minimize the error, E = y - P(y), the difference between the expected output y (the next bit to be observed), and the prediction P(y).

  1. wi = wi + Dwi
  2. Dwi = hxiE

where h is the learning rate, usually set ad hoc to around 0.1 to 0.5. This is fine for batch mode training, but for on-line compression, where each training sample is presented only once, we need to choose h more carefully.

3. Maximum Entropy On-line Learning

We now wish to find the learning rate, h, required to maintain the maximum-entropy solution after each update. We consider first the case of independent inputs (P(xi, xj) = P(xi)P(xj)), and a stationary source (P(y|xi) does not vary over time). In this case, we could just compute the weights directly. If we let xi = 1 and all other inputs be 0, then we have:

  1. p º P(y|xi = 1) = g(wi)
  2. wi = g-1(p) = ln p/(1 - p) » ln N(1)/N(0)

where N(1) and N(0) are the number of times y has been observed to be a 1 or 0 respectively in context xi. (We will return to the problem of zero counts later).

If we observe y = 1, then wi is updated as follows:

  1. Dwi = ln (N(1)+1)/N(0) - ln N(1)/N(0) » 1/N(1)
and if y = 0,
  1. Dwi = ln N(1)/(N(0)+1) - ln N(1)/N(0) » -1/N(0)

We can now find h such that the learning equation Dwi = hxiE (which converges whether or not the inputs are independent) is optimal for independent inputs. For the case xi = 1,

  1. Dwi = DwiE/E = hE
  2. h = Dwi/E
If y = 1, then
  1. E = 1 - p = 1 - N(1)/N = N(0)/N
  2. h = Dwi/E = 1/EN(1) = N/N(0)N(1) = 1/s2
And if y = 0, then
  1. E = -p = -N(1)/N
  2. h = Dwi/E = -1/EN(0) = N/N(0)N(1) = 1/s2

where N = N(0) + N(1), and s2 = N(0)N(1)/N = Np(1 - p) is the variance of the training data.

If the inputs are correlated, then using the output error to adjust the weights still allows the network to converge, but not at the optimal rate. In the extreme case, if there are m perfectly correlated copies of xi, then the total effect will be equal to a single input with weight mwi. The optimal learning rate will be h = 1/ms2 in this case. Since the correlation cannot be determined locally, we introduce a parameter hL, called the long term learning rate, where 1/m £ hL £ 1. The weight update equation then becomes

  1. Dwi = hLE/s2

In addition, we have assumed that the data is stationary, that p = P(y|xi) does not change over time. The following bit stream fragment of y for one particular context xi suggests that a better model is one where p periodically varies between 0 and 1 over time. The input is alice30.txt, Alice in Wonderland by Lewis Carroll, from Project Gutenberg. The context xi = 1 for 256 particular values (selected by a hash function) of the last 24 bits of input.


If the probability were fixed, we would not expect to find long strings of both 0's and 1's. It is clear from this example that the last few bits of input history is a better predictor of the next bit than simply weighting all of the bits equally, as hL does. The solution is to impose a lower bound, hS, on the learning rate, a parameter that we call the short term learning rate. This has the effect of weighting the last 1/hS bits more heavily.

  1. Dwi = (hS + hL/s2)E

Finally, recall that s2 = N(0)N(1)/N = Np(1 - p), which means that the learning rate is undefined when either count is 0, or equivalently, when p = N(1)/N is 0 or 1. A common solution is to add a small offset, d, to each of the counts N(0) and N(1). For the case d = 1, we have Laplace's law of succession, which is optimal when all values of p are a priori equally likely (Witten and Bell, 1991). Cleary and Teahan (1995) found, however, that the optimal value of d depends on the data source. For text, their experiments suggest a value of d » 0.1, though we found that 0.5 works well. Thus, in (18), we use

  1. s2 = (N+2d) / (N(0)+d)(N(1)+d)

4. Alternative Approaches

So far we have only shown how to optimally predict stationary data with independent features, and suggested extensions to the more general case. To test these, a large number of alternatives (about 20) were tested experimentally. Space prevents us from describing all but three of the most promising approaches, none of which improved over the methods described.

For all of the tests, the input was Alice in Wonderland, 152,141 bytes. A neural network was constructed with 258K input units, divided into four sets of contexts, listed below. Exactly one input from each set was active at any time. The context sets were:

These contexts are similar to the ones used by PPM compressors, which typically use the last 1, 2, 3, and 4 characters to predict the next character.

The parameters of (18) and (19) where hand tuned to hL = 0.5, hS = 0.08, and d = 0.5, to optimize compression, obtaining a baseline of 2.301 bpc. This compares to 2.466 bpc for conventional training (hS tuned to 0.375 with hL fixed at 0), 2.368 bpc for the assumption of stationary, independent inputs, (hL = 1, hS = 0), and 2.330 bpc allowing for some correlation between inputs, (hL tuned to 0.6-0.7 with hS fixed at 0).

4.1. Adaptive learning rate

Of the many alternatives tested, the most successful approach was to adjust the learning rate dynamically for each connection. The idea is to observe the last two errors when xi = 1, and adjust the learning rate in the direction that would have reduced the second error.

where E and Ei are the current and previous errors, and A < 1 is a parameter that determines how rapidly the learning rate is adjusted. This works fairly well. After hand tuning, compression of 2.344 bpc (0.043 over baseline) was obtained with A = 0.5, and hi initially 0.5.

4.2. Rate decay

The second best alternative tried was to take a more direct approach to decreasing the learning rate each time xi is active, which (18) does indirectly:

The result was 2.380 bpc (0.079 over baseline), only a little better than the best fixed rate (2.466 bpc). This was obtained by tuning A to 1/2, B to 1/8, and hi to an initial value of 1.5. With these parameters, hi converges to B/(1 - A) = 1/4.

4.3. PPM and interpolation

In 4.1 and 4.2, we experimented with different learning rates. Now we experiment with different methods of combining the known probabilities P(y|xi). The most common alternatives to maximum entropy are linear interpolation and PPM. Of the m = 4 active contexts with lengths 11, 16, 24, and 32 bits, PPM simply selects the longest one which occurred at least once before (N > 0), and estimates P(y) = (N(1) + d)/(N + 2d). In contrast to larger alphabets, binary PPM performs surprisingly poorly:

0.1 3.930
0.25 3.798
0.5 3.800
1 (Laplacian)3.915

Binary PPM compression was much worse than fixed rate learning (2.445 bpc), and worse than the 3.123 bpc obtained by simply averaging the four probabilities (with d = 0.5). It was thought that weighted averaging, with weights proportional to set size (i.e. 211, 216, 216, 217) to favor the longer and presumably more reliable contexts, should improve compression over simple averaging. Instead, compression worsened to 3.182 bpc.

5. Experimental Evaluation

The small (258K input) neural network of section 4, and a larger network with 222 (about 4 × 106) inputs were compared to seven popular and top rated compression programs. Compression ratios and times for Alice in Wonderland and ratios for book1 from the Calgary corpus (Hardy's Far from the Madding Crowd, 768,771 bytes) are shown below. Parameters for both neural networks were hand tuned only for Alice in Wonderland, and then tested on book1 without further tuning. Tests were performed on a 100 MHz 80486 with 64 MB of RAM under Windows 95.

Program Version Year Type Alice bpc Compress Decompress Book1 bpc
compress 4.3d 1990 LZ 3.270 1 sec 0.5 sec 3.486
pkzip 2.04e 1993 LZ 2.884 6 sec <0.5 sec3.288
gzip -9 1.2.4 1993 LZ 2.848 7 sec 0.5 sec3.250
szip -b41 -o0 1.05Xf 1998 BW2.239 9 sec 6 sec 2.345
ha a2 0.98 1993 PPM 2.171 16 sec 16 sec 2.453
boa -m15 0.58b 1998 PPM 2.061 33 sec 34 sec 2.204
rkive -mt3 1.91b1 1998 PPM 2.055 134 sec117 sec2.120 [2]
NN small P5 1999 NN 2.301 24 sec 24 sec 2.508
NN large P6 1999 NN 2.129 26 sec 26 sec 2.283

Compression ratios and times for Alice in Wonderland and ratios for book1

[2] rkive ran out of memory using the -mt3 option on book1, so -mt2 was used. The options -mt0 through -mt3 produce successively better compression at the cost of memory.

The large model uses 5 sets of inputs. In each set, the index i of the active input xi is a 22-bit hash of the last n (1 to 5) characters, the last 0 to 7 bits of the current character, and the position (0 to 7) within the current character. For n = 1, there are only 64K possible values. The other four sets (n = 2 through 5) overlap each other in a space of size 222 - 64K = 4,128,768. The paramters were hand tuned to hL = 0.35 and hS = (0.08, 0.15, 0.2, 0.2, 0.2) for the context sets for n = (1, 2, 3, 4, 5), with d = 0.5.

The seven compression program options were set for maximum text compression. UNIX compress, pkzip, and gzip are popular Limpel-Ziv compressors because of their speed, and in spite of their poor compression. They work by replacing reoccurring n-grams with a pointer to the previous occurrence.

Gilchrist (1999) rated boa (Sutton, 1998) as giving the best compression from among hundreds of archivers on the Calgary corpus, and rkive (Taylor, 1998) as the best on the text portion as of Sept. 1998. Both are PPM programs, which predict characters based on n-gram counts. Bell (1998) rated szip (Schindler, 1998), a Burrows-Wheeler encoder, the best on the large (2-4 MB) text portion of the Canterbury corpus. It sorts the input stream by context, then uses an adaptive 1-gram compressor on the permuted stream. ha (Hirvola, 1993) is an early PPM encoder, rated the best compressor in 1994 (Data Compression FAQ, 1998).

The large model compressed to within 0.074 bpc of rkive, the best compressor on Alice in Wonderland, and 0.719 bpc better than gzip, the best LZ compressor. With no further tuning, it compressed within 0.163 bpc of rkive on book1, and 0.967 bpc better than gzip.

In another test, the large model was compared with the top-rated boa on the Calgary corpus of 14 text and binary files, again with no further tuning. Both programs use about the same amount of memory (15 MB for boa, 16 MB for the neural network), and both compress in "solid" mode (boa option -s), treating the input as a single file. The result, using the same file order, was 1.904 bpc for boa in 720 seconds, and 2.142 bpc for the neural network in 537 seconds.

6. Implementation

Both the large and small neural networks use 4 bytes of memory for each input. The weight wi is represented as a 16 bit signed number with a 10 bit fraction, i.e, ±32 with precision 0.001. The counts N(0) and N(1) are represented as 8 bit unsigned numbers with a 1 bit fraction, i.e. 0 to 127.5 (integers 0 to 255 in the large model). To prevent overflow, both counts are divided by 2 whenever either count exceeds 125 (250 in the large model). This has the same effect as a small hS, of favoring recent training data. In fact, when hS = 0, rolling over the counts at around 25 or 30 instead of 125 improved the compression.

The arithmetic encoder stores the current range as a pair of unsigned 32 bit numbers, writing out the leading bytes whenever they match. This, and using a 16 bit unsigned probability, results in a slight loss of efficiency, experimentally less than 0.0001 bpc.

Additional optimization techniques include the exclusive use of integer arithmetic, using bit shifts in place of division when possible, using table lookup to compute g(.), and representing the weights as an array of structures (instead of a structure of arrays) to optimize cache usage. The programs were written in C++.

7. Conclusions

It was shown that it is practical to use neural networks for text compression, an application requiring high speed. Among neural models, the best one found combines long and short term learning rates to achieve a balance between using the entire input history and favoring the most recent data to adapt to changing statistics..

Although we optimized the neural network to predict text, it was found to give good performance on a wide variety of data types. It would probably be better to have the program automatically adjust hS and hL, rather than setting them ad hoc, but this would just introduce another parameter to determine the adjustment rate. The problem of ad hoc parameters seems to be unavoidable.

Research is ongoing, and it is expected that improved compressors will be found. We have yet to investigate models that exploit syntactic or semantic constraints, our reason for using neural networks in the first place. Improved models (C++ source code and Windows 95 executables) will be posted to as they become available.


I would like to thank Dr. Phil Chan for helpful comments on this paper.


Bell, Timothy, Ian H. Witten, John G. Cleary (1989), "Modeling for text compression", ACM Computing Surveys, 21(4): 557-591.

Bell, Timothy (1998), Canterbury Corpus,

M. Burrows and D. J. Wheeler (1994), A block-sorting lossless data compression algorithm , Digital Systems Research Center,

Cleary, John G., W. J. Teahan (1995), "Experiments on the zero frequency problem", Proc. Data Compression Conference, 480.

Data Compression FAQ (1998),

Feldman, J. A. and D. H. Ballard (1982), "Connectionist models and their properties", Cognitive Science, 6: 205-254

Gilchrist, Jeff (1999), Archive Comparison Test,

Hirvola, H. (1993), ha 0.98,

Manning, Christopher D., and Hinrich Schütze, (1999), Foundations of Statistical Natural Language Processing, Cambridge MA: MIT Press.

Rosenfeld, Ronald (1996), "A maximum entropy approach to adaptive statistical language modeling", Computer, Speech and Language, 10, see also

Schindler, Michael (1998), szip homepage,

Schmidhuber, Jürgen, and Stefan Heil (1996), "Sequential neural text compression", IEEE Trans. on Neural Networks 7(1): 142-146.

Sutton, Ian (1998), boa 0.58 beta,

Taylor, Malcolm, RKIVE v1.91 beta 1 (1998),

Witten, Ian H., Timothy C. Bell (1991), "The zero-frequency problem: estimating the probabilities of novel events in adaptive text compression", IEEE Trans. on Information Theory, 37(4): 1085-1094