- Open Morals
- Data and target definition
- Training settings
- Hardware
- Experimental protocol
- Results
- Selected checkpoint: per-label test results
- Epoch statistics
- Load the published model
- Reproduction and provenance
- Qualitative check
- Limitations
- License and attribution
- Long-text chunks and sliding windows
- HTTP inference and API access approval
- Data and target definition
Open Morals
Multi-label moral framing, six revised foundations plus thin morality and non-moral; not a good/evil judgment.
English RoBERTa with independently scored labels: care, equality, proportionality, loyalty, authority, purity, thin_morality, non_moral. The root weights are the baseline arm selected by validation. They are publicly downloadable. Additional weights are downloadable in synthetic-candidate.zip and real-only-control.zip; their outcomes are included even when not selected.
Data and target definition
Source: USC-MOLA-Lab/MFRC, snapshot ddc21d2f03e156732fd1ba95a51c4c29f07975be, file final_mfrc_data.csv. The dataset card lists CC BY 4.0. Original human texts are not redistributed here.
For each normalized comment, keep first annotation per annotator; targets are fractions of distinct annotators selecting each label. Evaluation labels require fraction >= 0.5; all-zero reference labels are allowed.
Input format: plain text. Training/validation/test sizes: 14,307/1,788/1,789. 80/10/10 shuffled groups: normalized comment for morals; target word for sensations.
The downloaded CSV contains 61,226 annotation rows and 17,884 unique normalized comments, rather than the paper's stated 16,123 comments. These observed snapshot counts and our derived splits should not be presented as the paper's official benchmark. We removed 7,695 repeated per-comment annotator rows; 43 had conflicting labels, for which the first file-order annotation was retained. No implicit/explicit target is invented because that field is absent. Categories are independently scored, including non-moral; annotator disagreement and half-vote ties can produce overlapping moral/non-moral reference labels or predictions. These are not mutually exclusive judgments of objective moral truth.
Training settings
Full encoder and classifier fine-tuning with soft-target binary cross-entropy, float32, and eager attention. Base revision: e2da8e2f811d1448a5b465c236feacd80ffbac7b.
| Setting | Value |
|---|---|
| Seed | 20261004 |
| Baseline epochs | 3 |
| Batch size | 32 |
| Microbatch / gradient accumulation | 8 / 4 |
| Maximum sequence tokens | 256 |
| Baseline learning rate | 2e-05 |
| Continuation epochs | 1 |
| Continuation learning rate | 5e-06 |
| Optimizer | AdamW |
| Weight decay | 0.01 |
| Warmup | 6%, then linear decay |
| Gradient norm clipping | 1.0 |
Training-text token profile: {"median_tokens": 39.0, "max_tokens": 457, "truncated_examples": 10, "count": 14307}. Longer inputs are truncated. Package versions: {"torch": "2.13.0+rocm10.0.0", "transformers": "4.57.6", "datasets": "3.6.0", "numpy": "2.5.3", "pyarrow": "20.0.0"}.
Hardware
ASUS ROG Flow Z13 (2025), GZ302EA; AMD Ryzen AI Max+ 395; integrated Radeon 8060S Graphics; 128 GB unified system RAM (approximately 123.6 GiB reported by Windows). Host: Windows 11 Pro. Training: Ubuntu 24.04 under WSL 2 with AMD ROCm PyTorch. One local GPU, no cloud training service. System memory is capacity, not measured training usage; peak memory and power were not recorded.
Experimental protocol
Baseline checkpoint maximizes validation macro F1 after global threshold search. Candidate must beat both baseline/control validation macro F1 by >=0.005 while losing <=0.01 micro F1 against either; otherwise publish baseline. Test evaluated only after this decision freezes.
global sigmoid threshold 0.10..0.80 step 0.05, maximizing validation macro F1. Sigmoid scores do not sum to one. Per-label metrics use zero F1 for undefined/no-positive cases. Every arm shares the fixed human evaluation groups. Test results are never used to change the release choice.
The synthetic training set has 240 examples from 80 assistant-authored seeds, each with three correlated framing variants, no independent human review. See synthetic_data.jsonl and prepare_tasks.py. One-hot generated labels simplify naturally overlapping or graded targets. Synthetic data is confined to training. Both arms replay all real training examples once. Synthetic arm has additional optimizer steps; not perfectly compute matched.
Results
Root checkpoint selected using validation only. Test scores were obtained after the decision froze.
| Arm | Threshold | Validation micro F1 | Validation macro F1 | Test micro F1 | Test macro F1 |
|---|---|---|---|---|---|
| baseline | 0.35 | 0.7075 | 0.5242 | 0.7073 | 0.4988 |
| real-only | 0.35 | 0.7047 | 0.5258 | 0.7029 | 0.4993 |
| synthetic | 0.35 | 0.7012 | 0.5187 | 0.7058 | 0.4932 |
Selected root arm: baseline. Synthetic acceptance rule met: False.
| Arm | Examples per epoch | Epochs | Optimizer steps | Selected epoch | Runtime minutes |
|---|---|---|---|---|---|
| baseline | 14307 | 3 | 1344 | 3 | 30.83 |
| real-only | 14307 | 1 | 448 | 1 | 21.02 |
| synthetic | 14547 | 1 | 455 | 1 | 21.06 |
Total experiment time: 75.74 minutes. Runtime includes evaluation and checkpoint saving; continuation arms start from the same selected baseline.
Selected checkpoint: per-label test results
| Label | Precision | Recall | F1 | Positive support |
|---|---|---|---|---|
| care | 0.4906 | 0.7927 | 0.6061 | 164 |
| equality | 0.4969 | 0.6923 | 0.5786 | 117 |
| proportionality | 0.3830 | 0.4091 | 0.3956 | 44 |
| loyalty | 0.2973 | 0.4231 | 0.3492 | 26 |
| authority | 0.3298 | 0.4844 | 0.3924 | 64 |
| purity | 0.4286 | 0.3913 | 0.4091 | 23 |
| thin_morality | 0.4238 | 0.4076 | 0.4156 | 157 |
| non_moral | 0.7897 | 0.9058 | 0.8438 | 966 |
Constant predictor (no text understanding), trained from mean human targets and threshold-calibrated on validation: test micro F1 0.3715, macro F1 0.1288. See constant_baseline.json for the exact recipe and per-label results. No superiority over existing published models is claimed.
Epoch statistics
| Arm | Epoch | Mean training loss | Validation micro F1 | Validation macro F1 | Threshold |
|---|---|---|---|---|---|
| baseline | 1 | 0.33814 | 0.6351 | 0.3865 | 0.25 |
| baseline | 2 | 0.27514 | 0.6961 | 0.5192 | 0.30 |
| baseline | 3 | 0.26190 | 0.7075 | 0.5242 | 0.35 |
| real-only | 1 | 0.25361 | 0.7047 | 0.5258 | 0.35 |
| synthetic | 1 | 0.25633 | 0.7012 | 0.5187 | 0.35 |
Load the published model
import json
from huggingface_hub import hf_hub_download
from transformers import pipeline
repo = "mts-the-architect/open-morals-125m-fp32"
options = json.load(open(hf_hub_download(repo, "thresholds.json")))
classifier = pipeline("text-classification", model=repo, tokenizer=repo, device=-1)
scores = classifier("Everyone deserves the same rights.", top_k=None, function_to_apply="sigmoid",
truncation=True, max_length=options["max_length"])
labels = [item for item in scores if item["score"] >= options["global_threshold"]]
print(labels)
To inspect the synthetic checkpoint, download and extract synthetic-candidate.zip, then load the extracted directory with Transformers and its own thresholds.json. The archive contains candidate weights, tokenizer, and provenance; it is not an automatically selected better model.
The corresponding real-only continuation is in real-only-control.zip, using the same extraction/loading procedure. These downloads preserve all experimental arms for independent inspection.
Reproduction and provenance
Included: prepare_tasks.py, train_tasks.py, supporting train_emotions.py, predict_tasks.py, training_environment.lock.txt, data_manifest.json, split_ids.json, experiment_plan.json, comparison.json, and training_run.json. Manifests include pinned upstream revisions, input hashes, source-code hashes, label supports, and all arm histories. Synthetic data is included; raw human texts are obtained from the credited sources.
Run scripts from the original project layout described in LEARNING_GUIDE.md. The provided source is an archive of the project workflow, not an arbitrary standalone script that discovers data files without preparation. Existing output directories are protected against overwrite.
Qualitative check
CPU inference loaded successfully. In the rights example, Open Morals selected equality and an extra proportionality label. See exact inputs, scores and interpretation. This diagnostic did not change the validation-frozen release decision.
Limitations
These are research prototypes. English social-media moral framing and ambiguous-word sensory norms have restricted domain coverage. Generated examples are repetitive and may have incomplete labels. Short texts, domain shifts, negation, irony, unfamiliar words, and long documents may behave differently. Small label supports make scores unstable. Neither classifier establishes personal character, moral correctness, medical status, or a writer's actual sensations. A score above threshold is a text/model association, not a factual diagnosis. Human review and external evaluation are needed for consequential use.
License and attribution
Our released model artifacts and project code are offered under MIT (LICENSE-CODE); the pretrained RoBERTa MIT notice is retained in LICENSE. Human datasets have their own CC BY 4.0 attribution and terms; their original text is not relicensed or redistributed by this model release.
- RoBERTa: Liu et al., 2019; paper.
- MFRC: Trager et al.; paper.
- Contextualized Sensorimotor Norms: Sean Trott and Benjamin Bergen; paper.
- CC BY 4.0 terms.
Long-text chunks and sliding windows
Windowing guide includes starting ranges, local usage and a labeled evaluation plan. Start with 256 total tokens / 64 context tokens overlap; compare no overlap, 25% and 50% overlap. Total window tokens include special tokens and, for sensations, the repeated target/context prefix.
Download predict_windows.py for per-window evidence and exploratory max/mean summaries. Sensations evaluates only windows containing a complete target mention. Windowing does not increase the model's native context capacity, change the trained weights, or establish higher accuracy. Existing thresholds were calibrated on short inputs; document-level aggregation is not calibrated.
Diagnostic report compares 18 configurations on an assistant-authored sample without reference labels. window-experiment-results.zip contains the sample, all results and comparison records; experiment_windows.py and test_windows.py preserve the reproducible diagnostic and boundary checks.
HTTP inference and API access approval
See API_USAGE.md for running the local service, requesting an API key, owner approval/revocation commands, and using the inference endpoints. Download serve_models.py, api_access.py, api_demo.html and predict_windows.py; --model-dir TASK=PATH accepts downloaded model directories.
Default access requires approved keys, with 10 requests/minute and 500/day per key. Applications remain pending until owner approval. Rate exhaustion returns HTTP 429 with Retry-After; input size and inference concurrency are also bounded. test_api_access.py exercises approvals, revocation and quotas. The server is local only; these Hub files do not deploy a public HTTP endpoint. Never upload the private approval/usage database.
- Downloads last month
- 46
Model tree for mts-the-architect/open-morals-roberta-125m-fp32
Base model
FacebookAI/roberta-base