mirror of
				https://github.com/explosion/spaCy.git
				synced 2025-10-30 23:47:31 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			175 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | ||
| title: Models
 | ||
| teaser: Downloadable pretrained models for spaCy
 | ||
| menu:
 | ||
|   - ['Quickstart', 'quickstart']
 | ||
|   - ['Model Architecture', 'architecture']
 | ||
|   - ['Conventions', 'conventions']
 | ||
| ---
 | ||
| 
 | ||
| The models directory includes two types of pretrained models:
 | ||
| 
 | ||
| 1. **Core models:** General-purpose pretrained models to predict named entities,
 | ||
|    part-of-speech tags and syntactic dependencies. Can be used out-of-the-box
 | ||
|    and fine-tuned on more specific data.
 | ||
| 2. **Starter models:** Transfer learning starter packs with pretrained weights
 | ||
|    you can initialize your models with to achieve better accuracy. They can
 | ||
|    include word vectors (which will be used as features during training) or
 | ||
|    other pretrained representations like BERT. These models don't include
 | ||
|    components for specific tasks like NER or text classification and are
 | ||
|    intended to be used as base models when training your own models.
 | ||
| 
 | ||
| ### Quickstart {hidden="true"}
 | ||
| 
 | ||
| import QuickstartModels from 'widgets/quickstart-models.js'
 | ||
| 
 | ||
| <QuickstartModels title="Quickstart" id="quickstart" description="Install a default model, get the code to load it from within spaCy and test it." />
 | ||
| 
 | ||
| <Infobox title="📖 Installation and usage">
 | ||
| 
 | ||
| For more details on how to use models with spaCy, see the
 | ||
| [usage guide on models](/usage/models).
 | ||
| 
 | ||
| </Infobox>
 | ||
| 
 | ||
| ## Model architecture {#architecture}
 | ||
| 
 | ||
| spaCy v2.0 features new neural models for **tagging**, **parsing** and **entity
 | ||
| recognition**. The models have been designed and implemented from scratch
 | ||
| specifically for spaCy, to give you an unmatched balance of speed, size and
 | ||
| accuracy. A novel bloom embedding strategy with subword features is used to
 | ||
| support huge vocabularies in tiny tables. Convolutional layers with residual
 | ||
| connections, layer normalization and maxout non-linearity are used, giving much
 | ||
| better efficiency than the standard BiLSTM solution.
 | ||
| 
 | ||
| The parser and NER use an imitation learning objective to deliver **accuracy
 | ||
| in-line with the latest research systems**, even when evaluated from raw text.
 | ||
| With these innovations, spaCy v2.0's models are **10× smaller**, **20% more
 | ||
| accurate**, and **even cheaper to run** than the previous generation. The
 | ||
| current architecture hasn't been published yet, but in the meantime we prepared
 | ||
| a video that explains how the models work, with particular focus on NER.
 | ||
| 
 | ||
| <YouTube id="sqDHBH9IjRU" />
 | ||
| 
 | ||
| The parsing model is a blend of recent results. The two recent inspirations have
 | ||
| been the work of Eli Klipperwasser and Yoav Goldberg at Bar Ilan[^1], and the
 | ||
| SyntaxNet team from Google. The foundation of the parser is still based on the
 | ||
| work of Joakim Nivre[^2], who introduced the transition-based framework[^3], the
 | ||
| arc-eager transition system, and the imitation learning objective. The model is
 | ||
| implemented using [Thinc](https://github.com/explosion/thinc), spaCy's machine
 | ||
| learning library. We first predict context-sensitive vectors for each word in
 | ||
| the input:
 | ||
| 
 | ||
| ```python
 | ||
| (embed_lower | embed_prefix | embed_suffix | embed_shape)
 | ||
|     >> Maxout(token_width)
 | ||
|     >> convolution ** 4
 | ||
| ```
 | ||
| 
 | ||
| This convolutional layer is shared between the tagger, parser and NER, and will
 | ||
| also be shared by the future neural lemmatizer. Because the parser shares these
 | ||
| layers with the tagger, the parser does not require tag features. I got this
 | ||
| trick from David Weiss's "Stack Combination" paper[^4].
 | ||
| 
 | ||
| To boost the representation, the tagger actually predicts a "super tag" with
 | ||
| POS, morphology and dependency label[^5]. The tagger predicts these supertags by
 | ||
| adding a softmax layer onto the convolutional layer – so, we're teaching the
 | ||
| convolutional layer to give us a representation that's one affine transform from
 | ||
| this informative lexical information. This is obviously good for the parser
 | ||
| (which backprops to the convolutions, too). The parser model makes a state
 | ||
| vector by concatenating the vector representations for its context tokens. The
 | ||
| current context tokens:
 | ||
| 
 | ||
| | Context tokens                                                                     | Description                                                                 |
 | ||
| | ---------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
 | ||
| | `S0`, `S1`, `S2`                                                                   | Top three words on the stack.                                               |
 | ||
| | `B0`, `B1`                                                                         | First two words of the buffer.                                              |
 | ||
| | `S0L1`, `S1L1`, `S2L1`, `B0L1`, `B1L1`<br />`S0L2`, `S1L2`, `S2L2`, `B0L2`, `B1L2` | Leftmost and second leftmost children of `S0`, `S1`, `S2`, `B0` and `B1`.   |
 | ||
| | `S0R1`, `S1R1`, `S2R1`, `B0R1`, `B1R1`<br />`S0R2`, `S1R2`, `S2R2`, `B0R2`, `B1R2` | Rightmost and second rightmost children of `S0`, `S1`, `S2`, `B0` and `B1`. |
 | ||
| 
 | ||
| This makes the state vector quite long: `13*T`, where `T` is the token vector
 | ||
| width (128 is working well). Fortunately, there's a way to structure the
 | ||
| computation to save some expense (and make it more GPU-friendly).
 | ||
| 
 | ||
| The parser typically visits `2*N` states for a sentence of length `N` (although
 | ||
| it may visit more, if it back-tracks with a non-monotonic transition[^4]). A
 | ||
| naive implementation would require `2*N (B, 13*T) @ (13*T, H)` matrix
 | ||
| multiplications for a batch of size `B`. We can instead perform one
 | ||
| `(B*N, T) @ (T, 13*H)` multiplication, to pre-compute the hidden weights for
 | ||
| each positional feature with respect to the words in the batch. (Note that our
 | ||
| token vectors come from the CNN — so we can't play this trick over the
 | ||
| vocabulary. That's how Stanford's NN parser[^3] works — and why its model is so
 | ||
| big.)
 | ||
| 
 | ||
| This pre-computation strategy allows a nice compromise between GPU-friendliness
 | ||
| and implementation simplicity. The CNN and the wide lower layer are computed on
 | ||
| the GPU, and then the precomputed hidden weights are moved to the CPU, before we
 | ||
| start the transition-based parsing process. This makes a lot of things much
 | ||
| easier. We don't have to worry about variable-length batch sizes, and we don't
 | ||
| have to implement the dynamic oracle in CUDA to train.
 | ||
| 
 | ||
| Currently the parser's loss function is multi-label log loss[^6], as the dynamic
 | ||
| oracle allows multiple states to be 0 cost. This is defined as follows, where
 | ||
| `gZ` is the sum of the scores assigned to gold classes:
 | ||
| 
 | ||
| ```python
 | ||
| (exp(score) / Z) - (exp(score) / gZ)
 | ||
| ```
 | ||
| 
 | ||
| <Infobox title="Bibliography">
 | ||
| 
 | ||
| 1. [Simple and Accurate Dependency Parsing Using Bidirectional LSTM Feature Representations {#fn-1}](https://www.semanticscholar.org/paper/Simple-and-Accurate-Dependency-Parsing-Using-Bidir-Kiperwasser-Goldberg/3cf31ecb2724b5088783d7c96a5fc0d5604cbf41).
 | ||
|    Eliyahu Kiperwasser, Yoav Goldberg. (2016)
 | ||
| 2. [A Dynamic Oracle for Arc-Eager Dependency Parsing {#fn-2}](https://www.semanticscholar.org/paper/A-Dynamic-Oracle-for-Arc-Eager-Dependency-Parsing-Goldberg-Nivre/22697256ec19ecc3e14fcfc63624a44cf9c22df4).
 | ||
|    Yoav Goldberg, Joakim Nivre (2012)
 | ||
| 3. [Parsing English in 500 Lines of Python {#fn-3}](https://explosion.ai/blog/parsing-english-in-python).
 | ||
|    Matthew Honnibal (2013)
 | ||
| 4. [Stack-propagation: Improved Representation Learning for Syntax {#fn-4}](https://www.semanticscholar.org/paper/Stack-propagation-Improved-Representation-Learning-Zhang-Weiss/0c133f79b23e8c680891d2e49a66f0e3d37f1466).
 | ||
|    Yuan Zhang, David Weiss (2016)
 | ||
| 5. [Deep multi-task learning with low level tasks supervised at lower layers {#fn-5}](https://www.semanticscholar.org/paper/Deep-multi-task-learning-with-low-level-tasks-supe-S%C3%B8gaard-Goldberg/03ad06583c9721855ccd82c3d969a01360218d86).
 | ||
|    Anders Søgaard, Yoav Goldberg (2016)
 | ||
| 6. [An Improved Non-monotonic Transition System for Dependency Parsing {#fn-6}](https://www.semanticscholar.org/paper/An-Improved-Non-monotonic-Transition-System-for-De-Honnibal-Johnson/4094cee47ade13b77b5ab4d2e6cb9dd2b8a2917c).
 | ||
|    Matthew Honnibal, Mark Johnson (2015)
 | ||
| 7. [A Fast and Accurate Dependency Parser using Neural Networks {#fn-7}](http://cs.stanford.edu/people/danqi/papers/emnlp2014.pdf).
 | ||
|    Danqi Cheng, Christopher D. Manning (2014)
 | ||
| 8. [Parsing the Wall Street Journal using a Lexical-Functional Grammar and Discriminative Estimation Techniques {#fn-8}](https://www.semanticscholar.org/paper/Parsing-the-Wall-Street-Journal-using-a-Lexical-Fu-Riezler-King/0ad07862a91cd59b7eb5de38267e47725a62b8b2).
 | ||
|    Stefan Riezler et al. (2002)
 | ||
| 
 | ||
| </Infobox>
 | ||
| 
 | ||
| ## Model naming conventions {#conventions}
 | ||
| 
 | ||
| In general, spaCy expects all model packages to follow the naming convention of
 | ||
| `[lang`\_[name]]. For spaCy's models, we also chose to divide the name into
 | ||
| three components:
 | ||
| 
 | ||
| 1. **Type:** Model capabilities (e.g. `core` for general-purpose model with
 | ||
|    vocabulary, syntax, entities and word vectors, or `depent` for only vocab,
 | ||
|    syntax and entities).
 | ||
| 2. **Genre:** Type of text the model is trained on, e.g. `web` or `news`.
 | ||
| 3. **Size:** Model size indicator, `sm`, `md` or `lg`.
 | ||
| 
 | ||
| For example, `en_core_web_sm` is a small English model trained on written web
 | ||
| text (blogs, news, comments), that includes vocabulary, vectors, syntax and
 | ||
| entities.
 | ||
| 
 | ||
| ### Model versioning {#model-versioning}
 | ||
| 
 | ||
| Additionally, the model versioning reflects both the compatibility with spaCy,
 | ||
| as well as the major and minor model version. A model version `a.b.c` translates
 | ||
| to:
 | ||
| 
 | ||
| - `a`: **spaCy major version**. For example, `2` for spaCy v2.x.
 | ||
| - `b`: **Model major version**. Models with a different major version can't be
 | ||
|   loaded by the same code. For example, changing the width of the model, adding
 | ||
|   hidden layers or changing the activation changes the model major version.
 | ||
| - `c`: **Model minor version**. Same model structure, but different parameter
 | ||
|   values, e.g. from being trained on different data, for different numbers of
 | ||
|   iterations, etc.
 | ||
| 
 | ||
| For a detailed compatibility overview, see the
 | ||
| [`compatibility.json`](https://github.com/explosion/spacy-models/tree/master/compatibility.json)
 | ||
| in the models repository. This is also the source of spaCy's internal
 | ||
| compatibility check, performed when you run the [`download`](/api/cli#download)
 | ||
| command.
 |