Views
No views yet
| Method | F1 Score | Key Advantage |
|---|---|---|
| Baseline (LogReg + Frozen) | 0.777 | Fast, lightweight |
| Fine-tuned PatentSBERTa | 0.808 | Best accuracy-speed tradeoff |
| QLoRA Mistral | 0.811 | JSON output, memory efficient |
| Multi-Agent Debate | 0.867 | Most interpretable, robust |
1git clone https://github.com/KarolinaBohdan/Deep_Learning_Final.git
2cd Deep_Learning_Final1python -m venv venv
2source venv/bin/activate # Linux/Mac
3# OR
4venv\Scripts\activate # Windows1pip install --upgrade pip
2pip install -r requirements.txt1# PatentSBERTa auto-downloads
2python -c "from transformers import AutoModel; AutoModel.from_pretrained('AI-Growth-Lab/PatentSBERTa')"
3
4# Mistral-7B-Instruct
5python -c "from transformers import AutoModel; AutoModel.from_pretrained('mistralai/Mistral-7B-Instruct-v0.2')"# Core ML/DL
torch>=2.0.0
transformers>=4.41.0
peft>=0.11.0
trl>=0.8.0
datasets>=2.14.0
# Scientific Computing
numpy>=1.24.0
pandas>=2.0.0
scikit-learn>=1.3.0
# Utilities
tqdm>=4.66.0
joblib>=1.3.0
bitsandbytes>=0.42.0
accelerate>=0.25.0
pyarrow>=13.0.01import torch
2import json
3from transformers import AutoTokenizer, AutoModel
4from peft import PeftModel
5
6device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
7
8# Load fine-tuned PatentSBERTa (fastest, best accuracy)
9tokenizer = AutoTokenizer.from_pretrained("AI-Growth-Lab/PatentSBERTa")
10model = AutoModel.from_pretrained(
11 "partD_patentsberta_finetuned_evalsilver_only/",
12 device_map=device
13)
14
15# Classify a claim
16new_claim = "A method for converting wind energy into electrical power with 95% efficiency..."
17
18inputs = tokenizer(new_claim, return_tensors="pt", truncation=True, max_length=256)
19outputs = model(**inputs)
20# Process embeddings for classification...1python A3_qlora_inference_.py \
2 --adapter_dir qlora_mistral_adapter_json \
3 --eval_silver eval_silver.parquet \
4 --output_csv predictions.csvDeep_Learning_Final/
│
├── README.md (this file)
├── requirements.txt
│
├── ASSIGNMENT 2 - BASELINE & LLM INTEGRATION
│ ├── Assignment 2_Part A.ipynb [Data prep & splitting]
│ ├── Assigment2_baseline_partA.py [Frozen embeddings baseline]
│ ├── A2_partB_uncertainty.py [Uncertainty estimation]
│ ├── A2_partC_llm_local.py [Mistral labeling + HITL]
│ ├── A2_partD_finetune.py [PatentSBERTa fine-tuning]
│ └── results/
│ ├── A2_LR_results_partA.out
│ ├── A2PartD_finetuned_results/
│ └── finetune_part3_final_metrics/
│
├── ASSIGNMENT 3 - QLORA FINE-TUNING
│ ├── A3_qlora_finetuning.py [QLoRA training]
│ ├── A3_qlora_inference_.py [QLoRA inference]
│ ├── qlora_mistral_adapter_json/ [LoRA adapter checkpoint]
│ └── Qlora_patentsberta_finetuning_final_metrics/
│
├── ASSIGNMENT 4 - MULTI-AGENT DEBATE
│ ├── mas_final.py [MAS implementation]
│ ├── MAS_train_patentsberta_human3/ [Training procedures]
│ └── results/
│ ├── mas_debate_results.csv
│ └── MAS evaluation reports
│
├── DATA FILES
│ ├── patents_50k_green.parquet [50k balanced dataset]
│ ├── train_silver.parquet [30k training split]
│ ├── eval_silver.parquet [10k eval split]
│ ├── pool_unlabeled.parquet [10k pool split]
│ ├── hitl_green_100.csv [100 HITL samples]
│ ├── hitl_green_100_llm_corrected.csv [100 HITL samples (verified)]
│ └── embeddings/
│ ├── X_train.npy
│ ├── X_eval.npy
│ └── X_pool.npy
│
├── MODEL CHECKPOINTS
│ ├── baseline_logreg.joblib
│ ├── partD_patentsberta_finetuned_evalsilver_only/
│ └── qlora_mistral_adapter_json/
│
└── M4_ASSIGNEMENT1_BDS_MFC.ipynb [Portfolio assignment]Load 1.37M raw patent claims
↓
Create is_green_silver labels from Y02* CPC codes
↓
Balance to 50k (25k green + 25k non-green)
↓
Split into train/eval/pool (60/20/20)
↓
Output: 4 parquet filesjupyter notebook "Assignment 2_Part A.ipynb"Generate PatentSBERTa embeddings (frozen, 768-dim)
↓
Train Logistic Regression on train_silver
↓
Evaluate on eval_silver
↓
Output: Baseline metrics + model checkpointpython Assigment2_baseline_partA.pyCalculate uncertainty scores on pool_unlabeled
↓
Select top-100 uncertain samples
↓
Use Mistral-7B to generate initial labels + rationales
↓
Human review and correction (HITL)
↓
Output: 100 gold labels with human validationpython A2_partC_llm_local.pyLoad 30k train_silver + 100 gold labels
↓
Tokenize with PatentSBERTa tokenizer
↓
Fine-tune PatentSBERTa (unfrozen)
↓
Evaluate on eval_silverpython A2_partD_finetune.pyQuantize Mistral-7B to 4-bit
↓
Add LoRA adapters (trainable)
↓
Train on 30k train_silver + 100 gold
↓
Output JSON predictions with rationales1python A3_qlora_finetuning.py \
2 --output_dir qlora_mistral_adapter_json \
3 --num_train_epochs 3 \
4 --per_device_train_batch_size 4python A3_qlora_inference_.py --adapter_dir qlora_mistral_adapter_json
Results: 0.811 F1 scoreLoad fine-tuned Advocate (Mistral + LoRA)
↓
Load base Skeptic (Mistral base)
↓
Load base Judge (Mistral base)
↓
For each claim: Advocate argues GREEN,
Skeptic argues NOT GREEN, Judge decides
↓
Output: Final predictions with explanations1python mas_final.py \
2 --eval_silver eval_silver.parquet \
3 --hitl_file hitl_green_100_llm_corrected.csv \
4 --adapter_path qlora_mistral_adapter_json \
5 --output mas_debate_results.csvPatent Claim
├─→ ADVOCATE (Mistral + LoRA) → "Argue for GREEN (1)"
│
├─→ SKEPTIC (Mistral base) → "Argue against NOT GREEN (0)"
│
└─→ JUDGE (Mistral base) → Reviews both, decides
Output: {label, confidence, reasoning}| Method | F1 Score | Key Advantage |
|---|---|---|
| Baseline (LogReg + Frozen) | 0.777 | Fast, lightweight |
| Fine-tuned PatentSBERTa | 0.808 | Best accuracy-speed tradeoff |
| QLoRA Mistral | 0.811 | JSON output, memory efficient |
| Multi-Agent Debate | 0.867 | Most interpretable, robust |
1import torch
2from transformers import AutoTokenizer, AutoModel
3
4device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
5
6# Load fine-tuned PatentSBERTa
7tokenizer = AutoTokenizer.from_pretrained("AI-Growth-Lab/PatentSBERTa")
8model = AutoModel.from_pretrained(
9 "partD_patentsberta_finetuned_evalsilver_only/",
10 device_map=device
11)
12
13# Classify
14new_claim = "A method for converting wind energy..."
15inputs = tokenizer(new_claim, return_tensors="pt", truncation=True, max_length=256)
16outputs = model(**inputs)
17# Process embeddings...1python A3_qlora_inference_.py \
2 --adapter_dir qlora_mistral_adapter_json \
3 --eval_silver eval_silver.parquet \
4 --output_csv predictions.csv1python mas_final.py \
2 --eval_silver your_data.parquet \
3 --adapter_path qlora_mistral_adapter_json \
4 --output results.csv