[ 
https://issues.apache.org/jira/browse/OPENNLP-1836?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Kristian Rickert resolved OPENNLP-1836.
---------------------------------------
    Resolution: Fixed

> Fix input encoding in SentenceVectorsDL
> ---------------------------------------
>
>                 Key: OPENNLP-1836
>                 URL: https://issues.apache.org/jira/browse/OPENNLP-1836
>             Project: OpenNLP
>          Issue Type: Bug
>          Components: dl
>    Affects Versions: 3.0.0-M3
>            Reporter: Kristian Rickert
>            Assignee: Kristian Rickert
>            Priority: Major
>             Fix For: 2.5.10, 3.0.0-M4, 3.0.0
>
>          Time Spent: 2.5h
>  Remaining Estimate: 0h
>
> SentenceVectorsDL encodes its model inputs incorrectly and has two robustness
> issues in the same code path.
> 1. Wrong input encoding
> The private tokenize method never fills the attention_mask array (it remains
> all zeros) and fills token_type_ids with 1:
>     final long[] mask = new long[ids.length];   // all zeros
>     ...
>     Arrays.fill(types, 1);
> For BERT-style encoders the convention is the opposite: attention_mask must be
> 1 for every real token and token_type_ids must be 0 for single-segment input.
> With an all-zero mask the encoder attends to nothing, so the produced
> "sentence vectors" do not reflect the input sentence the way the underlying
> sentence-transformers model intends. DocumentCategorizerDL in the same module
> already uses the correct encoding (mask=1, types=0), so SentenceVectorsDL is
> also inconsistent with its sibling class.
> 2. NPE on a vocabulary mismatch
> tokenize() looks up token ids with vocab.get(token) and unboxes the result.
> If the tokenizer emits a token that is missing from the vocabulary map (e.g.
> a vocabulary file that does not match the model and lacks the [UNK] entry),
> the call fails with an opaque NullPointerException.
> 3. Native resource leak
> getVectors() never closes the three OnnxTensor inputs nor the
> OrtSession.Result, leaking native memory on every call.
> Proposed fix
> ------------
> * Fill attention_mask with 1 and leave token_type_ids at 0 (single segment),
>   matching DocumentCategorizerDL.
> * Throw a descriptive IllegalArgumentException when a token cannot be mapped,
>   stating that the vocabulary file does not match the model.
> * Close all OnnxTensors and the OrtSession.Result deterministically.
> * Add a unit test for the encoding (tokenize is made package-private static;
>   it requires no ONNX session) and update the eval test expectations.
> Verification of the eval test values
> ------------------------------------
> SentenceVectorsDLEval pins exact vector values for the sentence
> "george washington was president". Running the current (unfixed) code against
> the public sentence-transformers/all-MiniLM-L6-v2 ONNX export reproduces the
> pinned values exactly (0.39994872, -0.055101186, 0.2817594), confirming the
> eval data model is the same export. Re-running with the corrected encoding
> yields the new expected values (0.044745024, 0.20219636, 0.41306049,
> dimension 384), which the patched class reproduces precisely.
> Compatibility note
> ------------------
> This is a behavioral fix: vectors produced by the previous encoding are not
> comparable with the corrected output. Users who persisted vectors from
> SentenceVectorsDL need to re-embed their data. This should be called out in
> the release notes.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to