Tropicals-T1

The first release of an open model programme for tropical species. Names are the coordinate system of species data, so the programme starts at the name layer: give Tropicals-T1 a Chinese name — a formal common name, a market trade name, a horticultural cultivar label — and it retrieves the matching taxon from a corpus of 419,950 tropical taxa.

This is the first published embedding model for this task. GBIF and Catalogue of Life name-matching services accept scientific names only. The text towers of BioCLIP and PlantCLEF are English. General-purpose Chinese embedding models have no taxonomic grounding — we measured the un-fine-tuned BAAI/bge-small-zh-v1.5 at 0.03 % Recall@1 on this task.

Trained by Tropicals.cn on tropicals/vernacular-names-zh, 1.2 M vernacular-name ↔ taxon pairs with four-tier provenance labelling.

Usage

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("tropicals/Tropicals-T1")

# Document side: "scientific_name | family | genus | category_zh"
docs = [
    "Monstera deliciosa | Araceae | Monstera | 热带植物",
    "Poecilia reticulata | Poeciliidae | Poecilia | 热带水生",
]
q = model.encode(["龟背竹"], normalize_embeddings=True)
d = model.encode(docs, normalize_embeddings=True)
print((q @ d.T).argmax(axis=1))

The document side carries no Chinese name by design — a document containing the answer would make both training and evaluation meaningless. The model has to align Chinese morphology (genus-name suffixes, epithet translation, transliteration markers) to Latin binomials and their placement.

Evaluation — TropicalsBench

Scored on TropicalsBench, the open benchmark we publish for tropical species models. Its first task is Chinese name retrieval, and this model is its first entry. Retrieval runs over the full corpus of 419,950 taxa with no candidate pruning; random chance is 2.4e-06.

Seen genus (n = 3,000)

rank model Recall@1 Recall@5 Recall@10
family baseline 0.0110 0.0367 0.0557
family v0.1 0.4093 0.4820 0.5140
family this model (v0.2) 0.5343 0.6303 0.6670
genus baseline 0.0013 0.0053 0.0057
genus v0.1 0.1360 0.1930 0.2303
genus this model (v0.2) 0.1943 0.3523 0.4340
species baseline 0.0003 0.0003 0.0010
species v0.1 0.0087 0.0273 0.0467
species this model (v0.2) 0.0903 0.1753 0.2173

Unseen genus (n = 775)

rank model Recall@1 Recall@5 Recall@10
family baseline 0.0077 0.0245 0.0374
family v0.1 0.3742 0.4335 0.4581
family this model (v0.2) 0.5058 0.6310 0.6826
genus baseline 0.0013 0.0052 0.0065
genus v0.1 0.0103 0.0439 0.0774
genus this model (v0.2) 0.0723 0.1845 0.2619
species baseline 0.0000 0.0000 0.0013
species v0.1 0.0039 0.0194 0.0335
species this model (v0.2) 0.0400 0.1097 0.1445

Baseline is the un-finetuned BAAI/bge-small-zh-v1.5. Retrieval runs over the full corpus of 419,950 taxa. The benchmark — both test sets, the candidate pool, the split hashes and the gold criterion — is byte-identical to the one published with v0.1.

Two test sets, both reported. test_seen_genus holds out single species while their genus stays in training — the realistic case of a new species in a known genus. test_unseen_genus holds out entire genera, measuring generalisation to Chinese genus names the model has never seen. Scores on the first are optimistic and on the second pessimistic relative to production use; the pair brackets the real number.

Because retrieval documents carry no Chinese name, lexical and string matching score at chance here by construction: the benchmark measures retrieval precisely in the regime where a name is not already in an index.

Splits are assigned by deterministic hashing (FNV-1a, fixed salts), so anyone can reproduce them from the source data. Evaluation code ships with the dataset, and results on the same splits can be submitted through its discussion tab.

Intended use

Retrieval and entity linking: mapping Chinese name strings onto taxa. Useful for search, catalogue reconciliation, and normalising trade or horticultural names against a taxonomic backbone.

It operates on text, so it does not identify organisms from images or specimens. It should also not be used to mint Chinese names for taxa that lack one — the training data includes 116,512 machine-transliterated provisional names, which are valid things to search for but are not established nomenclature.

Training

v0.2 (current release). v0.1 learned coarse Chinese-morphology-to-clade mapping but could not separate species within a genus (0.87 % species Recall@1). With in-batch negatives drawn uniformly from 419,950 taxa, the objective never required telling Ficus lyrata from Ficus megalophylla — the model was never trained on the thing TropicalsBench measures. v0.2 changes the training signal, not just the parameter count.

base BAAI/bge-base-zh-v1.5 (102 M params, 768-dim)
objective CachedMultipleNegativesRankingLoss (GradCache)
explicit negatives 4 per anchor — 3 congeneric + 1 confamilial
training rows 1,085,820 triplets built from 1,084,621 name ↔ taxon pairs
auxiliary supervision 4,553 epithet-gloss pairs
schedule 1,144 steps at batch 128, two stages (lr 3e-5 then 1e-5, cosine)
max seq length 48
hardware Apple M2, MPS, ~8 h unattended

Congeneric hard negatives

Negatives are drawn from the anchor's own genus — falling back to the family for monotypic genera — rather than mined with the model's own embeddings. Embedding-mined negatives inherit the blind spot being corrected: they are only "hard" according to a model that cannot tell congeners apart. Congeneric membership is a taxonomic fact, and it targets the failure mode exactly. 94.0 % of anchors receive a full complement of three congeners; the rest fall back to the family.

Candidates that share any Chinese vernacular with the anchor query are excluded from its negative set, so a name that genuinely refers to several taxa is never trained against itself.

Epithet-gloss supervision

The corpus carries Chinese glosses for the Latin specific epithets of 75,067 taxa (deliciosa → 「美味」). Both test sets hold out whole species, so species-rank retrieval cannot be solved by memorising a name-to-taxon table; the compositional route — Chinese descriptor ↔ epithet meaning — is the part that can generalise to a species never seen. Gloss pairs supervise that route directly.

What the run actually consumed

The compute window bounded the schedule, so training is not a full pass over the pair set. The 146,432 anchor updates comprise a 49,014-row priority bucket (gloss pairs ×4, authoritative primary names ×2) seen in both stages, plus 48,404 draws from the 277,274 aligned/unassessed primary-name rows. Roughly 730 K alias-heavy and provisional rows were never reached. Tier priority replaces v0.1's weighted resampling; the ordering rationale is unchanged — all tiers are things users search for, but machine-transliterated names must not dominate the embedding space.

That the highest-scoring version so far has seen ~13 % of its own training data is worth stating plainly: it is a bound on the compute available, not evidence that the remainder is unhelpful.

Limitations

  • Label noise in the gold set. The authoritative tier is attached to a taxon's primary name, but the original classifier matched against its whole Chinese-name set. Re-verification of 200 sampled rows (2026-08-22) found 80.0 % of primary names still match the authority exactly, so gold labels carry roughly 20 % noise. Model-vs-baseline comparisons on the same split remain valid.
  • test_unseen_genus has 775 gold queries; its 95 % CI on Recall@1 is about ±3.5 pp.
  • Coverage is trade and husbandry oriented, not a biogeographic sample of the tropics.
  • Bird taxonomy follows IOC v15.2, superseded by AviList v2025.
  • Species-rank scores carry a structural ceiling. Both test sets hold out entire species, so any Chinese name that is an arbitrary convention rather than a description of the taxon is unrecoverable in principle. The gold-label noise above compounds this.
  • v0.2 is trained on ~13 % of the available pairs (see above), so the headroom from simply continuing the same recipe is real and untested.
  • Everyday trade names are under-trained relative to the benchmark. The gold criterion for both test sets is authoritative + primary name, and the v0.2 schedule spent both stages on that bucket. The unassessed tier — which carries many of the most-searched market names (孔雀鱼 guppy, 散尾葵 areca palm, 龟背竹 monstera) — was only partially reached. Spot checks on those names are still wrong at rank 1, and at least one (散尾葵) resolves to a worse family than it did under v0.1. TropicalsBench cannot see this, by construction. It is a scheduling consequence, not a property of the method, and it is the first thing the next run should fix.
  • Cultivars, hybrids and animal morphs are in the corpus but thinly covered by authoritative names, so retrieval on them is weaker than on species.

Citation

@misc{tropicals_t1,
  title  = {Tropicals-T1: an open Chinese name encoder for tropical species},
  author = {{Tropicals.cn}},
  year   = {2026},
  url    = {https://huggingface.co/tropicals/Tropicals-T1}
}

If you report scores on the benchmark, cite it as well:

@misc{tropicalsbench,
  title  = {TropicalsBench: an open benchmark for tropical species models},
  author = {{Tropicals.cn}},
  year   = {2026},
  url    = {https://tropicals.cn/models/benchmark}
}

License

CC-BY 4.0. Attribution: Tropicals.cn (https://tropicals.cn).

Downloads last month
-
Safetensors
Model size
0.1B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for tropicals/Tropicals-T1

Finetuned
(7)
this model

Dataset used to train tropicals/Tropicals-T1