☀️Siang
AI & Data Science

NLP dengan Transformers — BERT, GPT, Attention & Hugging Face

Tutorial lengkap Natural Language Processing modern dengan arsitektur Transformers — dari konsep attention, tokenization, arsitektur BERT dan GPT, fine-tuning, hingga deployment dengan Hugging Face

Artikel: Nlp Transformers Artikel: Nlp Transformers

1. Pengenalan NLP & Transformers

Natural Language Processing (NLP) adalah cabang AI yang memungkinkan komputer memahami, menginterpretasi, dan menghasilkan bahasa manusia. Sebelum Transformers, NLP menggunakan RNN dan LSTM yang lambat dan sulit menangkap konteks panjang.

Transformers (diperkenalkan tahun 2017 oleh Google dalam paper "Attention Is All You Need") merevolusi NLP dengan mekanisme self-attention yang bisa memproses seluruh sequence secara paralel.

Diagram: Evolusi Arsitektur NLP
Evolusi Arsitektur NLP

EVOLUSI ARSITEKTUR NLP

Era 1: Rule-based (1950-1990)

Regex, grammar rules, dictionary

Era 2: Statistical (1990-2013)

Bag of Words, TF-IDF, Naive Bayes, SVM

Era 3: Deep Learning (2013-2017)

Word2Vec, GloVe, RNN, LSTM, GRU

❌ Vanishing gradient, sequential processing

Era 4: Transformers (2017-sekarang)

Attention mechanism, parallel processing

BERT (2018), GPT-2 (2019), GPT-3 (2020)

GPT-4 (2023), Llama 3 (2024)

✅ State-of-the-art di hampir semua task NLP!

Mengapa Transformers Dominan?

FiturRNN/LSTMTransformers
Parallel processing❌ Sequential✅ Paralel penuh
Long-range dependencies⚠️ Sulit✅ Mudah (attention)
Training speedLambatCepat (dengan GPU)
Pre-trainingTidak umumTransfer learning
ScalabilityTerbatasSangat scalable

2. Tokenization

Tokenization adalah proses mengubah teks menjadi token (unit kecil) yang bisa dipahami model. Berbeda dari split kata biasa, tokenizer modern menggunakan subword tokenization.

Diagram: Self-Attention
Self-Attention

SELF-ATTENTION MECHANISM

Input: 'Kucing duduk di atas tikar'

Untuk setiap kata, hitung:

1. Query (Q): 'Apa yang saya cari?'
2. Key (K): 'Apa yang saya tawarkan?'
3. Value (V): 'Informasi apa yang saya punya?'

Attention(Q,K,V) = softmax(Q·K^T / √d_k) · V

Kata 'duduk' mencari:

Kucing (siapa yang duduk?)

attention tinggi

tikar (duduk di mana?)

attention tinggi

di, atas

attention medium (preposisi)

Multi-Head Attention:

Jalankan 8-12 attention paralel (heads)

Setiap head fokus pada pola berbeda

Gabungkan hasilnya

Diagram: BERT vs GPT Architecture
BERT vs GPT Architecture

BERT (Encoder-only) GPT (Decoder-only)

(CLS) tok1 tok2 (MASK) tok1 tok2 tok3

(NEXT)

Encoder Decoder

(Bidirect.) (Causal)

12 layers 12+ layers

(output embeddings) (next token pred)

Untuk: klasifikasi,

Untuk: text generation,

NER, QA, similarity chatbot, summarization

(understanding tasks) (generation tasks)

Python — BERT untuk Berbagai Tasks
# =============================================
# BERT untuk NLP Tasks
# =============================================
from transformers import pipeline

# ----- 1. Masked Language Model -----
fill_mask = pipeline("fill-mask", model="bert-base-uncased")
results = fill_mask("Transformers are [MASK] for NLP tasks.")
for r in results:
    print(f"  {r['token_str']}: {r['score']:.3f}")
# "good": 0.234, "used": 0.189, "great": 0.087, ...

# ----- 2. Sentence Embeddings -----
from transformers import AutoTokenizer, AutoModel
import torch

tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/all-MiniLM-L6-v2")
model = AutoModel.from_pretrained("sentence-transformers/all-MiniLM-L6-v2")

def get_embedding(text):
    inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=128)
    with torch.no_grad():
        outputs = model(**inputs)
    # Mean pooling
    embedding = outputs.last_hidden_state.mean(dim=1)
    return embedding[0]

emb1 = get_embedding("Saya suka belajar AI")
emb2 = get_embedding("AI sangat menarik untuk dipelajari")
emb3 = get_embedding("Resep nasi goreng enak")

# Cosine similarity
from torch.nn.functional import cosine_similarity
print(f"AI vs AI: {cosine_similarity(emb1, emb2):.3f}")   # ~0.85
print(f"AI vs Food: {cosine_similarity(emb1, emb3):.3f}") # ~0.15

5. Arsitektur GPT

GPT (Generative Pre-trained Transformer) adalah model decoder-only yang dilatih untuk memprediksi token berikutnya. GPT unggul dalam text generation, conversation, dan creative tasks.

Python — Text Generation dengan GPT
# =============================================
# Text Generation dengan GPT
# =============================================
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM

# ----- Menggunakan pipeline -----
generator = pipeline("text-generation", model="gpt2")
result = generator(
    "Artificial Intelligence di Indonesia",
    max_length=100,
    num_return_sequences=2,
    temperature=0.7,
    top_p=0.9,
    do_sample=True
)
for i, r in enumerate(result):
    print(f"Generated {i+1}: {r['generated_text']}")

# ----- GPT dengan Hugging Face -----
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")

# Manual generation
input_text = "Machine learning adalah"
input_ids = tokenizer.encode(input_text, return_tensors="pt")

output = model.generate(
    input_ids,
    max_length=150,
    temperature=0.7,
    top_k=50,
    top_p=0.95,
    do_sample=True,
    pad_token_id=tokenizer.eos_token_id
)
generated = tokenizer.decode(output[0], skip_special_tokens=True)
print(generated)

# ----- Menggunakan OpenAI API -----
from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "Anda adalah penulis teknis."},
        {"role": "user", "content": "Jelaskan Transformers dalam 100 kata."}
    ],
    temperature=0.7,
    max_tokens=200
)
print(response.choices[0].message.content)

6. Hugging Face Ecosystem

Hugging Face adalah "GitHub untuk AI" — platform utama untuk berbagi model, dataset, dan demo ML. HF Transformers library adalah standar industri untuk NLP.

Python — Hugging Face Essentials
# =============================================
# Hugging Face Ecosystem
# =============================================
# pip install transformers datasets evaluate huggingface_hub

# ----- 1. Pipeline (Paling Mudah) -----
from transformers import pipeline

# Sentiment Analysis
classifier = pipeline("sentiment-analysis", model="indobenchmark/indobert-base-p1")
result = classifier("Film ini sangat bagus dan menarik!")
print(result)  # [{'label': 'POSITIVE', 'score': 0.98}]

# Text Summarization
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
summary = summarizer(long_text, max_length=100, min_length=30)

# Translation (Indonesian → English)
translator = pipeline("translation", model="Helsinki-NLP/opus-mt-id-en")
result = translator("Saya suka belajar pemrograman")
print(result)  # [{'translation_text': 'I like learning programming'}]

# Named Entity Recognition
ner = pipeline("ner", model="dslim/bert-base-NER", grouped_entities=True)
entities = ner("Barack Obama lahir di Hawaii pada tahun 1961")
print(entities)

# Question Answering
qa = pipeline("question-answering", model="deepset/roberta-base-squad2")
result = qa(question="Siapa pendiri Tesla?", context="Tesla didirikan oleh Elon Musk...")
print(result)  # {'answer': 'Elon Musk', 'score': 0.95}

# ----- 2. Load Dataset dari Hub -----
from datasets import load_dataset
dataset = load_dataset("imdb", split="train[:1000]")
print(dataset)
print(dataset[0])  # {'text': '...', 'label': 1}

# ----- 3. Push Model ke Hub -----
from huggingface_hub import login
login(token="hf_...")

# Push model dan tokenizer
model.push_to_hub("username/my-indonesian-sentiment-model")
tokenizer.push_to_hub("username/my-indonesian-sentiment-model")

7. Fine-tuning untuk NLP Tasks

Python — Fine-tuning BERT untuk Sentiment Analysis
# =============================================
# Fine-tuning BERT untuk Sentiment Analysis
# =============================================
from transformers import (
    AutoTokenizer, AutoModelForSequenceClassification,
    TrainingArguments, Trainer
)
from datasets import load_dataset
import evaluate
import numpy as np

# Load dataset
dataset = load_dataset("imdb")
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

def tokenize(batch):
    return tokenizer(batch["text"], padding=True, truncation=True, max_length=256)

tokenized = dataset.map(tokenize, batched=True)
tokenized = tokenized.rename_column("label", "labels")

# Load model
model = AutoModelForSequenceClassification.from_pretrained(
    "bert-base-uncased", num_labels=2
)

# Metrics
accuracy = evaluate.load("accuracy")
def compute_metrics(eval_pred):
    logits, labels = eval_pred
    preds = np.argmax(logits, axis=-1)
    return accuracy.compute(predictions=preds, references=labels)

# Training
args = TrainingArguments(
    output_dir="./bert-sentiment",
    num_train_epochs=3,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=32,
    learning_rate=2e-5,
    weight_decay=0.01,
    eval_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True,
    report_to="none"
)

trainer = Trainer(
    model=model, args=args,
    train_dataset=tokenized["train"].shuffle(seed=42).select(range(5000)),
    eval_dataset=tokenized["test"].shuffle(seed=42).select(range(1000)),
    tokenizer=tokenizer,
    compute_metrics=compute_metrics
)

trainer.train()
results = trainer.evaluate()
print(f"Accuracy: {results['eval_accuracy']:.4f}")

8. NLP Tasks Populer

TaskModelPipeline Name
Text ClassificationBERT, RoBERTatext-classification
Named Entity RecognitionBERT-NERner
Question AnsweringRoBERTa-SQuADquestion-answering
SummarizationBART, T5summarization
TranslationMarian, NLLBtranslation
Text GenerationGPT-2, Llamatext-generation
Fill MaskBERTfill-mask
Semantic SimilaritySentence-BERTsentence-similarity

9. Deployment

Python — Deploy NLP Model
# =============================================
# Deploy NLP Model dengan FastAPI
# =============================================
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import pipeline

app = FastAPI()
classifier = pipeline("sentiment-analysis", model="./bert-sentiment")

class TextInput(BaseModel):
    text: str

@app.post("/predict")
async def predict(input: TextInput):
    result = classifier(input.text)
    return {"sentiment": result[0]["label"], "score": result[0]["score"]}

@app.post("/predict-batch")
async def predict_batch(texts: list[str]):
    results = classifier(texts)
    return {"results": results}

# Hugging Face Inference API (tanpa deploy)
# POST https://api-inference.huggingface.co/models/{model_id}
# Headers: {"Authorization": "Bearer hf_..."}
# Body: {"inputs": "teks Anda di sini"}

10. Quiz Pemahaman

1. Apa perbedaan utama BERT dan GPT?

2. Apa itu Self-Attention dalam Transformers?

3. Mengapa subword tokenization lebih baik dari word-level?

4. Apa fungsi dari Hugging Face Transformers library?

5. Apa keunggulan pre-training + fine-tuning dibanding training dari nol?

Rangkuman

📝 Poin Penting
  • Transformers — arsitektur revolusioner dengan self-attention, paralel processing
  • BERT — encoder-only, untuk understanding tasks (klasifikasi, NER, QA)
  • GPT — decoder-only, untuk generation tasks (chatbot, summarization)
  • Tokenization — subword (WordPiece, BPE) untuk menangani OOV
  • Attention — mekanisme Q, K, V untuk menentukan relevansi antar token
  • Hugging Face — ekosistem utama untuk load, train, deploy model NLP
  • Fine-tuning — transfer learning: pre-trained + data spesifik = performa tinggi
🔍 Zoom
100%
🎨 Tema