CoolFace
Modelpublic

kikwaib/mt5-base-kenswquad-abstractive

sourceHugging Faceapache-2.0updated 9mo agoView on Hugging Face
0likes28downloads
Model Card

mT5-base-KenSwQuAD-Abstractive

The final model in a 3-stage Hierarchical Curriculum Learning pipeline for Swahili Question Answering.

This model generates abstractive answers to questions about Swahili text, using Context Scaffolding technique with anchor tokens to improve answer localization.

Model Description

PropertyValue
Base ArchitecturemT5-base (Google)
Parameters582.4M
Vocabulary250,150 tokens (50 custom anchor tokens)
LanguagesSwahili (sw), English (en)
TaskAbstractive Question Answering
LicenseApache 2.0

Pipeline Position

This model is Stage 3 of a curriculum learning pipeline:

StageModelTaskStatus
1mt5-base-squad-transferEnglish SQuAD Transfer✅
2mt5-base-kenswquad-extractiveSwahili Extractive QA✅
3mt5-base-kenswquad-abstractiveSwahili Abstractive QA✅

Performance

Evaluation Results

MetricValueDescription
BLEU15.52N-gram overlap with reference
BERTScore F10.7721 (77.21%)Semantic similarity
Eval Loss2.4184Cross-entropy loss

Training Progress

EpochTrain LossVal LossBLEUBERTScore F1
13.0332.59613.370.757
22.6142.48513.360.769
32.3632.45215.680.768
42.0942.45514.720.767
51.9172.41815.520.772 ⭐
62.0462.39815.030.770
71.8812.43514.950.770
81.7282.40016.250.769

Best model saved at Epoch 5 (highest BERTScore F1)

Usage

Basic Usage

python
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

# Load model and tokenizer (MUST be from same checkpoint!)
tokenizer = AutoTokenizer.from_pretrained("kikwaib/mt5-base-kenswquad-abstractive")
model = AutoModelForSeq2SeqLM.from_pretrained("kikwaib/mt5-base-kenswquad-abstractive")

# Simple question answering
question = "Nani aliandika kitabu hiki?"
context = "Kitabu hiki kiliandikwa na Ngugi wa Thiong'o. Kilitolewa mwaka 1967."

input_text = f"question: {question} context: {context}"
inputs = tokenizer(input_text, return_tensors="pt", max_length=1024, truncation=True)
outputs = model.generate(**inputs, max_length=128)
answer = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(answer)  # "Ngugi wa Thiong'o"

With Context Scaffolding (Recommended)

For optimal performance, use anchor tokens to mark paragraph boundaries:

python
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

tokenizer = AutoTokenizer.from_pretrained("kikwaib/mt5-base-kenswquad-abstractive")
model = AutoModelForSeq2SeqLM.from_pretrained("kikwaib/mt5-base-kenswquad-abstractive")

# Apply scaffolding with <p1>, <p2>, ... tokens
question = "Nani aliandika kitabu hiki?"
context = "<p1> Kitabu hiki kiliandikwa na Ngugi wa Thiong'o. <p2> Kilitolewa mwaka 1967."

# Add pointer hint if you know which paragraph contains the answer
input_text = f"question: {question} context: {context} <pointer> <p1>"

inputs = tokenizer(input_text, return_tensors="pt", max_length=1024, truncation=True)
outputs = model.generate(**inputs, max_length=128)
answer = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(answer)  # "Ngugi wa Thiong'o"

Scaffolding Helper Function

python
import re

def apply_scaffolding(context, question, paragraph_pointer=None):
    """
    Transform raw context into scaffolded format with anchor tokens.
    
    Args:
        context: Raw text (paragraphs separated by newlines)
        question: The question to answer
        paragraph_pointer: Optional paragraph number (1-indexed) containing the answer
    
    Returns:
        Scaffolded input string
    """
    # Split into paragraphs
    paragraphs = [p.strip() for p in re.split(r'\n+', context) if p.strip()]
    
    # Add anchor tokens
    scaffolded = ""
    for i, para in enumerate(paragraphs):
        p_num = i + 1
        if p_num < 50:
            scaffolded += f"<p{p_num}> {para} "
        else:
            scaffolded += f"{para} "
    
    # Add pointer hint
    hint = ""
    if paragraph_pointer and 1 <= int(paragraph_pointer) < 50:
        hint = f" <pointer> <p{paragraph_pointer}>"
    
    return f"question: {question} context: {scaffolded}{hint}"

# Usage
input_text = apply_scaffolding(
    context="First paragraph.\nSecond paragraph with answer.",
    question="What is in the second paragraph?",
    paragraph_pointer=2
)

Pipeline Usage

python
from transformers import pipeline

qa_pipeline = pipeline(
    "question-answering",
    model="kikwaib/mt5-base-kenswquad-abstractive",
    tokenizer="kikwaib/mt5-base-kenswquad-abstractive"
)

result = qa_pipeline("question: Nani aliandika kitabu? context: <p1> Ngugi aliandika kitabu hiki.")
print(result[0]['generated_text'])

Context Scaffolding

What is Context Scaffolding?

Context Scaffolding is a technique that structures input text with special anchor tokens:

  1. 1.Paragraph Anchors (<p1>, <p2>, ..., <p49>): Mark paragraph boundaries
  2. 2.Pointer Token (<pointer>): Provides a late contextual hint about which paragraph contains relevant information

Why Use Scaffolding?

  • —Helps the model locate information in long contexts
  • —Provides attention guidance to relevant paragraphs
  • —Improves performance on multi-paragraph documents

Example Transformation

Without Scaffolding:

question: What is the capital? context: Kenya is in East Africa. Nairobi is the capital city.

With Scaffolding:

question: What is the capital? context: <p1> Kenya is in East Africa. <p2> Nairobi is the capital city. <pointer> <p2>

Training Details

Training Data

DatasetSamplesDescription
KenSwQuAD (Abstractive)2,428QA pairs where answer requires reasoning
Train Split2,185 (90%)Training samples
Test Split243 (10%)Evaluation samples

Hyperparameters

ParameterValue
Learning Rate5e-5
Batch Size8
Max Epochs15
Early Stopping Patience3
Max Input Length1024 tokens
Max Target Length128 tokens
Weight Decay0.01
Max Gradient Norm1.0
OptimizerAdamW
Best Model MetricBERTScore F1

Training Infrastructure

ComponentSpecification
GPUNVIDIA A100-SXM4-40GB
GPU Memory42.5 GB
PlatformGoogle Colab
Training Time29.7 minutes
Epochs Completed8 (early stopped)

Framework Versions

PackageVersion
Transformers4.57.3
Datasets4.0.0
PyTorch2.9.0+cu126
CUDA12.6

Sample Predictions

QuestionGround TruthPredictionAnalysis
Ni vipi uwekezaji utaimarishwaKwa mikopo na nafasi ya kufanyia kaziKwa kuwapa wawekezaji mikopo na nafasi za ajira✅ Semantically equivalent
Wahispania walikuja na ugonjwa ganindulindui⚠️ Close variant
Kipi kinachangia wanandoa kutalakianaKukosa kusajili ndoa zao rasmiKwa kukosa kusajili ndoa zao✅ Core meaning preserved

Limitations

  1. 1.Tokenizer Dependency: Must load tokenizer from this checkpoint (has 50 custom tokens)
  2. 2.Context Length: Inputs longer than 1024 tokens are truncated
  3. 3.Scaffolding Preference: Best performance requires anchor token formatting
  4. 4.Dataset Size: Trained on relatively small abstractive dataset (2,428 samples)
  5. 5.Swahili Variants: May struggle with dialectal differences

Ethical Considerations

  • —Intended Use: Research and educational applications for Swahili NLP
  • —Not Intended: Production systems without additional validation
  • —Bias: May reflect biases present in KenSwQuAD training data
  • —Verification: Answers should be verified for critical applications

Citation

If you use this model, please cite:

bibtex
@misc{mt5-kenswquad-abstractive,
  author = {Kikwai, B.},
  title = {mT5-base-KenSwQuAD-Abstractive: Hierarchical Curriculum Learning for Swahili QA},
  year = {2025},
  publisher = {Hugging Face},
  url = {https://huggingface.co/kikwaib/mt5-base-kenswquad-abstractive}
}

Related Models

ModelTaskLink
mt5-base-squad-transferStage 1: English QA Transfer🔗
mt5-base-kenswquad-extractiveStage 2: Swahili Extractive QA🔗
mt5-base-kenswquad-abstractiveStage 3: Swahili Abstractive QAThis model

Acknowledgments

  • —KenSwQuAD Dataset: For providing Swahili QA pairs
  • —Google: For the mT5 base model
  • —Hugging Face: For the Transformers library and model hosting

Model trained: December 20, 2025 | Last updated: December 20, 2025