ํ ์คํธ ๋ถ๋ฅ๋ฅผ ์งํํ๋ฉด์ ๋๋ ์ ์ ๋ชจ๋ธ, ํ์ต๊ณผ ๊ด๋ จ๋ ๋ถ๋ถ๋ค์ ๋ธ๋ ๋ฐ์ค์ธ ๋ถ๋ถ๋ค์ด ๋ง์ ์ธ๊ณผ๊ด๊ณ๋ค์ ํ์ ํ๊ธฐ๊ฐ ์ ๋ง ์ด๋ ต๋ค๋ ๊ฒ์ด์๋ค
๋ฌผ๋ก ๋ชจ๋ธ ์ธก๋ฉด์์๋ Loss๋ ์ฑ๋ฅ ์งํ, ํด๋์ค ๊ฐ์ค์น, ํ๋ผ๋ฏธํฐ ํ๋ ๋ฑ ๋ค๋ค๋ณผ ๋ถ๋ถ๋ค์ ์ ๋ง ๋ง์ง๋ง... ์์ง ์ดํด๋๊ฐ ๋๋ฌด ๋ฎ์์ ์ด๋ค ๋ถ๋ถ์ ์์ ํ์์ ๋ ๋ชจ๋ธ์ ์ฑ๋ฅ์ด ๋๋ ์ด๋ค ์ํฅ์ด ์๊ธธ์ง ์์์กฐ์ฐจ ๋์ง ์์๋ค
๊ทธ๋์ ๋ฐ์ดํฐ ์ฐจ์์์ ์ด๋ป๊ฒ ๋ ๋ณผ ์ ์์๊น ํ๋ค๊ฐ ์ธ์ฝ๋๋ฅผ ํตํด feature vector๋ฅผ ์ถ์ถํ์ฌ ๋ถ์ํด๋ณด๋ผ๋ ์ข์ ์์ด๋์ด๋ฅผ ๋ฐ์์ ์งํํด๋ณด์๋ค
๋ชจ๋ธ์ ๋ถ๋ฅ ์ฑ๋ฅ ์์ฒด๋ฅผ ๋์ด์, ๋ชจ๋ธ์ด ํ์ตํ ๋ฐ์ดํฐ์ ํน์ง ๊ณต๊ฐ(Feature Space)์ ๋ถ์ํ์ฌ ๋ฐ์ดํฐ์ ๋ชจ๋ธ์ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ ์ ํ์ ํ๋ ๊ฒ
๐ ๋ชจ๋ธ์ feature space(ํน์ง ๊ณต๊ฐ)๋ฅผ ์ง์ ๋ค์ฌ๋ค๋ด์, ๋น์ทํ ๊ฐ์ ์ ํ์ ๋ฌธ์ฅ๋ค์ด ์ค์ ๋ก ๋น์ทํ ์๋ฒ ๋ฉ์ผ๋ก ๋ฝํ๋์ง ํ์ธํด๋ณด๋ ๊ฒ์ด๋ค
์ฆ, ๋จ์ํ ์ ํ๋๋ง ๋ณด๋ ๊ฒ ์๋๋ผ ๋ชจ๋ธ์ด ๊ฐ์ ๊ตฌ์กฐ๋ฅผ “์ ํ์ตํ๊ณ ์๋๊ฐ”๋ฅผ ์๊ฐ์ ์ผ๋ก ๊ฒ์ฆํ์๋ ์ ๊ทผ
1. ์ต์ข ๋ชฉํ: ์๋ฒ ๋ฉ ๊ณต๊ฐ ๋ถ์
- ์๋ ๋ด์ฉ: ๋ชจ๋ธ์ ๋ถ๋ฅ๊ธฐ(Classifier) ์ ๋ ฅ ์ง์ ๋จ๊ณ์์ ์ถ์ถ๋ ํน์ง ๋ฒกํฐ(Feature Vector)๋ค์ ๋ฝ์๋ด์ด(Embedding), ์ด ๋ฒกํฐ๋ค์ ํด๋ฌ์คํฐ๋ง(Clustering) ๋ฐ ์๊ฐํ(Visualization) ํด๋ณด๋ ๊ฒ์ด๋ค
- ๋ชฉ์ : ๋ชจ๋ธ์ด ๋ฐ๋ผ๋ณด๋ ํ
์คํธ ๋ฐ์ดํฐ์ ํน์ง ๊ณต๊ฐ์์, ์๋์ ๋ผ๋ฒจ(๊ธ์ /๋ถ์ , ๊ฐํ/์ฝํ)์ด ์ ์ฌํ ํ
์คํธ๋ค๋ผ๋ฆฌ ์ค์ ๋ก ๊ฐ๊น๊ฒ ๋ชจ์ฌ ์๋์ง ํ์ธํ์ฌ, ๋ค์ ๋ ๊ฐ์ง๋ฅผ ์ ๊ฒํ๋ค
- ๋ฐ์ดํฐ ๋ฌธ์ : ๋ผ๋ฒจ์ด '์ค๊ตฌ๋๋ฐฉ'์ด๋ผ๋ ๋ง์ฒ๋ผ, ๋ฐ์ดํฐ ์์ฒด์ ๋ผ๋ฒจ๋ง์ด ๋ชจํธํ์ฌ ์๋ฒ ๋ฉ ๊ณต๊ฐ์์ ๋๋ ทํ๊ฒ ๋ถ๋ฆฌ๋์ง ์๋์ง.
- ๋ชจ๋ธ ๋ฌธ์ : ํน์ง ์ถ์ถ๊ธฐ(Feature Extractor)๊ฐ ๋ผ๋ฒจ์ ๊ตฌ๋ถํ ๋งํผ ์๋ฏธ ์๋ ํน์ง์ ์ ํ์ตํ์ง ๋ชปํ๋์ง.
2. ๊ตฌ์ฒด์ ์ธ ์คํ ๋จ๊ณ
| ๋จ๊ณ | ๊ธฐ์ ์ ๋ด์ฉ | ๋น๊ณ / ์ค์์ฑ |
| ํน์ง ์ถ์ถ | NLP ๋ชจ๋ธ์์ ์ธ์ฝ๋(Encoder) ๋๋ Feature Extractor ๋ถ๋ถ๋ง ์ฌ์ฉํ์ฌ ์ต์ข
ํด๋์ค ์์ธก(Classification)์ด ์๋ ๋ฌธ์ฅ ์๋ฒ ๋ฉ ๋ฒกํฐ๋ฅผ ์ถ์ถ. ํ๊น ํ์ด์ค ๋ฑ์์ ์ ๊ณตํ๋ extractor๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ๊ธฐ์กด ๋ชจ๋ธ ํด๋์ค์์ ๋ถ๋ฅ๊ธฐ ๋ ์ด์ด ์ง์ ์ ์ถ๋ ฅ์ ๊ฐ์ ธ์์ผ ํ๋ค |
๊ฐ์ฅ ์ค์ํ ํต์ฌ: ๋ถ๋ฅ ๊ฒฐ๊ณผ(Class)๊ฐ ์๋๋ผ, ํน์ง ๊ณต๊ฐ(Feature Space)์ ๋ถ์ํ๋ ๊ฒ. |
| ์ฐจ์ ์ถ์ | ํน์ง ๋ฒกํฐ๋ ๊ณ ์ฐจ์(์๋ฐฑ~์์ฒ ์ฐจ์)์ด๋ฏ๋ก, ์๊ฐํ๋ฅผ ์ํด t-SNE๋ PCA ๊ฐ์ ๊ธฐ๋ฒ์ผ๋ก 2D ๋๋ 3D๋ก ์ฐจ์์ ์ถ์ | ์ฃผ์: ์ผ๋จ ๊ณ ์ฐจ์ ์ํ์์ ํด๋ฌ์คํฐ๋ง์ ์๋ํด๋ณด๊ณ , ์๊ฐํํ ๋๋ง ์ถ์ํ๋ ๊ฒ์ด ๋ฐ์ดํฐ ์์ค์ ์ต์ํํ๋ ๋ฐฉ๋ฒ์ผ ์ ์์ |
| ๋ถ์ ๋ฐ ๊ฒ์ฆ | ์ถ์ถ๋ ์ ์ฐจ์ ๋ฒกํฐ๋ค์ K-means๋ DBSCAN ๋ฑ์ผ๋ก ํด๋ฌ์คํฐ๋งํ๊ณ , ์๋์ ๋ผ๋ฒจ(๊ฐํ ๊ธ์ /์ฝํ ๋ถ์ ๋ฑ)์ ์์ผ๋ก ํ์ํ์ฌ ์๊ฐํ |
ํต์ฌ ๊ฒํ ์ฌํญ: ๋ผ๋ฒจ์ด ๊ฐ์ ๋ฐ์ดํฐ๋ค์ด ํ๋์ ํด๋ฌ์คํฐ๋ก ์ ๋ฌถ์ด๋์ง, ์๋๋ฉด ๋ผ๋ฒจ์ด ๋ค๋ฅธ ๋ฐ์ดํฐ๋ค์ด ์์ฌ์๋์ง. |
| ๋ผ๋ฒจ ์กฐ์ (์ฌ๊ฒ์ฆ) | ๋ผ๋ฒจ์ด ๋๋ฌด ์ธ๋ถํ(๊ฐ/์ฝ)๋์ด ๋ชจํธ์ฑ์ด ํฌ๋ค๋ฉด, ์ด์ง ๋ถ๋ฅ(Binary Classification) ๋ฌธ์ (๊ธ์ vs. ๋ถ์ )๋ก ๋จ์ํํ์ฌ ํน์ง ๊ณต๊ฐ์ ์ฌ๋ถ์ | ๋ฐ์ดํฐ ๋ผ๋ฒจ๋ง์ ์คํจ์ฑ์ ๊ฒ์ฆํ๋ ์ค์ํ ๋จ๊ณ |
1. ํ๊น ํ์ด์ค์์ Feature Vector ์ถ์ถ ๋ฐฉ๋ฒ
์ฐธ๊ณ ํ๋ฉด ์ข์ ์๋ฃ
https://chanmuzi.tistory.com/243
[PyTorch] AutoModel vs AutoModelForSequenceClassification ๋น๊ตํ๊ธฐ (BERT ํํค์น๊ธฐ!!)
๋ณธ ๊ฒ์๋ฌผ์ NLP ๋ถ์ผ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ชจ๋ธ ์ค ํ๋์ธ BERT๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ฑ๋์์ต๋๋ค. ๋๋์ด ํผ์์ ์์ฃผ ๊ฐ๋จํ ํ๋ก์ ํธ์ ๋์ ํด ๋ณผ ๊ธฐํ๊ฐ ์ฃผ์ด์ ธ์ ๋ฐ๋ฐ๋ฅ๋ถํฐ ๋ฅ๋ฌ๋ ๋ชจ๋ธ ๊ตฌ์กฐ
chanmuzi.tistory.com
์ฃผ ๋ชจ๋ธ์ธ BERT๊ฐ ์ด๋ค ๋ชจ๋ธ์ธ์ง๋ ์์์ผํ๋ค
17-02 ๋ฒํธ(Bidirectional Encoder Representations from Transformers, BERT)
* ํธ๋์คํฌ๋จธ ์ฑํฐ์ ๋ํ ์ฌ์ ์ดํด๊ฐ ํ์ํฉ๋๋ค.  BERT(Bidire…
wikidocs.net
ํน์ง ์ถ์ถ : Feature Extractor๋ง ์ฌ์ฉ
- ํ๊น ํ์ด์ค ๋ชจ๋ธ์ ๋ฐ๋์ ํค๋๋ก ๊ตฌ๋ถ๋์ด ์์. ๊ฐ์ ๋ฐ๋๋ฅผ ์ฌ์ฉํ๋ฉด์ ํค๋๋ง ๋ฐ๊พธ์ด ์ฌ์ฉํ ์๋ ์๊ธฐ์ ๊ฐ๊ฐ ๋ฐ๋ก ๋ถ๋ฌ์ค๊ฑฐ๋ ์ปค์คํ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค
- ๋ฒ ์ด์ค๋ผ์ธ์์ ์ฌ์ฉํ๋ ํ๊น ํ์ด์ค ๋ชจ๋ธ(AutoModelForSequenceClassification)์ “feature extractor + classifier”๊ฐ ๊ฒฐํฉ๋ ํํ
- ํ์ง๋ง ์ง๊ธ ํ์ํ ๊ฑด classifier๋ก ๊ฐ๊ธฐ ์ ์ hidden representation, ์ฆ “๋ฌธ์ฅ์ ์๋ฏธ๋ฅผ ์์ฝํ ์๋ฒ ๋ฉ ๋ฒกํฐ”๋ฅผ ๋ณด๋ ๊ฒ.
- ๊ทธ๋์ AutoModel์ด๋ AutoModelForMaskedLM์ฒ๋ผ classifier ํค๋๋ฅผ ์ ๊ฑฐํ ๋ชจ๋ธ์ ๋ถ๋ฌ์์ ์จ์ผํ๋ค
AutoModelForSequenceClassification
“๋ฌธ์ฅ ๋ถ๋ฅ๊น์ง ๋๋ ์์ฑ๋ ๋ชจ๋ธ”
[Transformer encoder] → [pooler] → [classification head (linear layer + softmax)]
- ์ฆ, feature extractor + classifier๊ฐ ๋ชจ๋ ํฌํจ๋์ด ์์.
- ์ด ๋ชจ๋ธ์ ํ์ต ์ loss์ logits์ ๋ฐ๋ก ๋ฐํ
- ๋ถ๋ฅ ์์ (๊ฐ์ฑ ๋ถ์, ์คํธ ํ์ง ๋ฑ)์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋๋ก ์ธํ ๋์ด ์์.
- ๊ฒฐ๊ณผ๋ก ๋ฐ๋ก ํด๋์ค๋ณ ์ ์(logits)๋ฅผ ์ป๊ฒ ๋จ.
- ์ด๊ฑด softmax๋ง ์ทจํ๋ฉด ๊ณง๋ฐ๋ก ํ๋ฅ ๋ก ๋ณํ ๊ฐ๋ฅ.
AutoModel
“ํน์ง(Feature)๋ง ์ถ์ถํ๋ Encoder ๋ชจ๋ธ”
[Transformer encoder only]
- ์ฆ, classifier head๊ฐ ์์.
- loss๋ logits์ ๊ณ์ฐํ์ง ์๊ณ , ๋ฌธ์ฅ ๋๋ ํ ํฐ ์์ค์ hidden state๋ง ๋ฐํํจ.
- outputs.last_hidden_state๋ฅผ ํตํด ๊ฐ ํ ํฐ์ ์๋ฒ ๋ฉ์ ์ป๊ณ , [CLS] ํ ํฐ์ด๋ ํ๊ท ํ๋ง์ ํตํด ๋ฌธ์ฅ ์๋ฒ ๋ฉ์ ๋ฝ์ ์ ์์.
๋์ ๋น๊ตํด์ ํ๋ก ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ๋ค
| ํญ๋ชฉ | AutoModelForSequenceClassification | AutoModel |
| ๋ชฉ์ | ๋ฌธ์ฅ ๋ถ๋ฅ | ํผ์ฒ ์ถ์ถ |
| ๊ตฌ์กฐ | Transformer + Classifier Head | Transformer๋ง |
| ์ถ๋ ฅ | logits (ํด๋์ค๋ณ ์ ์) | hidden states (์๋ฒ ๋ฉ) |
| ์ฌ์ฉ ์์ | ํ๋ จ/์ถ๋ก ๋จ๊ณ | ๋ถ์/์๊ฐํ ๋จ๊ณ |
| ๋ํ ํ๋ | outputs.logits | outputs.last_hidden_state |
| ํ์ต ๋ชฉ์ | ๋ถ๋ฅ loss ๊ณ์ฐ ๊ฐ๋ฅ | feature representation ํ์์ฉ |
๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณด๋ฉด
- AutoModelForSequenceClassification
→ ๋ถ๋ฅ ๋ชจ๋ธ์ ํ์ต์ํค๊ฑฐ๋ ์์ธกํ ๋ ์ฌ์ฉ. - AutoModel
→ ๋ถ๋ฅ๊ธฐ ์๋จ์ “๋ฌธ์ฅ ํํ(embedding)”์ ์ถ์ถํ ๋ ์ฌ์ฉ. “ํน์ง ๋ฒกํฐ(feature vector)”๋ ๋ฐ๋ก ์ด ๋จ๊ณ
๊ทธ๋ผ ์ค์ ๋ก ์ด๋ป๊ฒ ์ถ๋ ฅ์ด ๋์ค๋์ง ์์๋ก ํ์ธํด๋ณด์
AutoModelForSequenceClassification vs AutoModel ๋น๊ต ์์
from transformers import AutoTokenizer, AutoModelForSequenceClassification, AutoModel
import torch
# ๋ชจ๋ธ ์ด๋ฆ
MODEL_NAME = "klue/roberta-base"
# ์์ ๋ฌธ์ฅ
sentences = ["์ด ์ํ ์ง์ง ์ต๊ณ ๋ค", "์คํ ๋ฆฌ๊ฐ ๋๋ฌด ์ง๋ฃจํ๋ค"]
# 1๏ธโฃ ํ ํฌ๋์ด์
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
inputs = tokenizer(sentences, padding=True, truncation=True, return_tensors="pt")
# 2๏ธโฃ AutoModelForSequenceClassification: classifier ํฌํจ
model_cls = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=4)
outputs_cls = model_cls(**inputs)
print("=== AutoModelForSequenceClassification ===")
print("logits shape:", outputs_cls.logits.shape) # (batch_size, num_labels)
print("logits example:", outputs_cls.logits)
# 3๏ธโฃ AutoModel: feature extractor๋ง
model_feat = AutoModel.from_pretrained(MODEL_NAME)
outputs_feat = model_feat(**inputs)
print("\n=== AutoModel ===")
print("last_hidden_state shape:", outputs_feat.last_hidden_state.shape) # (batch_size, seq_len, hidden_dim)
# CLS ํ ํฐ ์๋ฒ ๋ฉ๋ง ํ์ธ
cls_embedding = outputs_feat.last_hidden_state[:, 0, :]
print("CLS embedding shape:", cls_embedding.shape) # (batch_size, hidden_dim)
print("CLS embedding example:", cls_embedding[0][:5]) # ์ฒซ 5์ฐจ์ ๊ฐ๋ง ์ถ๋ ฅ
=== AutoModelForSequenceClassification ===
logits shape: torch.Size([2, 4])
logits example: tensor([[-0.0906, 0.3809, 0.2833, -0.0410],
[-0.0896, 0.3786, 0.2914, -0.0469]], grad_fn=<AddmmBackward0>)
=== AutoModel ===
last_hidden_state shape: torch.Size([2, 8, 768])
CLS embedding shape: torch.Size([2, 768])
CLS embedding example: tensor([ 0.0730, -0.5276, -0.2339, -0.0581, 0.0356], grad_fn=<SliceBackward0>)
- ๋ผ๋ฒจ์ด 4๊ฐ๋ผ ๊ฐ์ , ๋ฐฐ์น๊ฐ 2์ธ ๋ฌธ์ฅ ๋ฐ์ดํฐ 2๊ฐ๋ฅผ ๋ฃ์์ ๋
- AutoModelForSequenceClassification ์ 2๊ฐ ๋ฌธ์ฅ์ ๋ํด ๊ฐ๊ฐ์ ๋ผ๋ฒจ์ ๋ํ logits ๊ฐ์ ์ถ๋ ฅํ๋ค
- AutoModel ์ ๋ฌธ์ฅ ๊ฐ๊ฐ์ ๋ํด 768์ฐจ์์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฌธ์ฅ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด์ feature vector๋ฅผ ์ถ๋ ฅํ๋ค
๐ค ์ฌ๊ธฐ์ ๋ค์ ์๋ฌธ์ . ์ CLS ์๋ฒ ๋ฉ ๋ฒกํฐ์์ ์๋์ฒ๋ผ [ :, 0, : ] ์ธ๋ฑ์ฑ์ ํด์คฌ์๊น??
outputs_feat.last_hidden_state[:, 0, :]
์์์ ํ์ธํ๋ฏ์ด last_hidden_state ์ shape์ (batch_size, seq_len, hidden_dim) ํํ์ด๋ค
- batch_size → ๋ฌธ์ฅ ๋ช ๊ฐ๋ฅผ ํ ๋ฒ์ ๋ฃ์๋์ง, ๋ฌธ์ฅ์ ๊ฐ์
- seq_len → ๊ฐ์ฅ ๊ธด ๋ฌธ์ฅ์ ๋จ์ด ๊ฐ์, ํ ํฐ ๊ธธ์ด (ํ ํฌ๋์ด์ ๋ก ์ชผ๊ฐ ํ ํฐ ์, padding ํฌํจ)
- hidden_dim → Transformer๊ฐ ๊ฐ ํ ํฐ์ ๋ํด ๋ง๋ ์๋ฒ ๋ฉ ์ฐจ์ (์: 768)
์ฌ๊ธฐ์ [CLS] ํ ํฐ์ด ์ด๋ค ์ญํ ์ ํ๋์ง ์ดํดํ๋ ๊ฒ์ด ํ์ํ๋ค
BERT ๊ณ์ด ๋ชจ๋ธ์์๋:
- ์ ๋ ฅ ๋ฌธ์ฅ ๋งจ ์์ ํน์ ํ ํฐ [CLS]๋ฅผ ๋ฃ์
- [CLS] ํ ํฐ์ hidden state๋ ๋ฌธ์ฅ ์ ์ฒด ์๋ฏธ๋ฅผ ์์ฝํ๋ ๋ฒกํฐ๋ก ํ์ต๋จ
- ๊ทธ๋์ ๋ถ๋ฅ ๋ชจ๋ธ์์๋ classifier๊ฐ [CLS] ๋ฒกํฐ๋ง ์ฌ์ฉํจ
์ฆ, [CLS]๋ ๋ฌธ์ฅ-level representation์ ๋ด๋นํ๋ ํ ํฐ์ด๋ค
์๋ ๊ธ๋ค์ ๋ณด๋ฉด ๋ ์์ธํ๊ฒ ์ ์ค๋ช ๋์ด ์์ผ๋ ์ฐธ๊ณ ํ ๊ฒ
https://seungseop.tistory.com/35
BERT์ [CLS]ํ ํฐ์ ์ด๋ป๊ฒ sentence์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์๊น?
BERT์ ์ด๋ก๋ถํฐ ํ์๋ ๋ค์ํ ์ธ์ด ๋ชจ๋ธ์์๋ ๊ฐ์ฅ ์ฒซ ์์น์ ๋ฌธ์ฅ ๊ณตํต ํ ํฐ์ธ [CLS]๋ฅผ ๋์ด ํด๋น ์์น์ ์๋ฒ ๋ฉ ๊ฒฐ๊ณผ๋ฅผ ๋ํ ์๋ฒ ๋ฉ์ผ๋ก ์ฌ์ฉํ๋ค. ์์ปจ๋, BERT-base ๋ชจ๋ธ์ ํ ํฐ์ ๊ธธ์ด๊ฐ 512์ด
seungseop.tistory.com
https://jimmy-ai.tistory.com/338
CLS ํ ํฐ์ด๋? / ํ์ด์ฌ BERT CLS ์๋ฒ ๋ฉ ๋ฒกํฐ ์ถ์ถ ์์
[CLS] ํ ํฐ์ด๋? BERT, RoBERTa ๋ฑ์ ์ธ์ด ๋ชจ๋ธ์์ ๋ฌธ์ฅ ํ ํฐ๋ค์ด ์ธ์ฝ๋ฉ๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์ ์ฉํ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ ๊ฐ์ฅ ์ฒซ ์์น์ ๋ฌธ์ฅ ๊ณตํต ํ ํฐ์ธ [CLS]๋ฅผ ๋์ด ํด๋น ์์น์ ์๋ฒ ๋ฉ ๊ฒฐ๊ณผ๋ฅผ ๋
jimmy-ai.tistory.com
๋ฐ๋ผ์ ์ธ๋ฑ์ฑ [ :, 0, : ] ์ ๋ค์์ ์๋ฏธํ๋ค
last_hidden_state shape: torch.Size([2, 8, 768])
cls_embedding = outputs_feat.last_hidden_state[:, 0, :]
- : → batch ์ ์ฒด ์ ํ
- 0 → sequence ๊ธธ์ด์์ ์ฒซ ๋ฒ์งธ ํ ํฐ [CLS] ์ ํ
- : → hidden_dim ์ ์ฒด ์ ํ
๊ฒฐ๊ณผ:
cls_embedding.shape = (batch_size, hidden_dim)
- ๊ฐ ๋ฌธ์ฅ๋ง๋ค ํ๋์ feature vector๋ฅผ ์ป์
- ์ด์ ์ด ๋ฒกํฐ๋ฅผ ์๊ฐํํ๊ฑฐ๋ ์ ์ฌ๋ ๊ณ์ฐ, clustering ๋ฑ ํ์ฉ ๊ฐ๋ฅ
์
๋ ฅ ๋ฌธ์ฅ: "์ด ์ํ ์ง์ง ์ต๊ณ ๋ค"
ํ ํฐํ: [CLS] ์ด ์ํ ์ง์ง ์ต๊ณ ๋ค [SEP]
| | | | | |
v v v v v v
ํ ํฐ ์๋ฒ ๋ฉ: e_CLS e_์ด e_์ํ e_์ง์ง e_์ต๊ณ ๋ค e_SEP
| | | | | |
v v v v v v
+---------------- Transformer Encoder Blocks ----------------+
| Multi-Head Attention + Feed Forward + LayerNorm ๋ฐ๋ณต |
| ๊ฐ ํ ํฐ ๋ฒกํฐ๊ฐ ๋ฌธ๋งฅ ์ ๋ณด๋ฅผ ๋ฐ์ํ๋๋ก ์
๋ฐ์ดํธ |
+------------------------------------------------------------+
| | | | | |
v v v v v v
last_hidden_state (batch_size, seq_len, hidden_dim)
|
v
CLS ์ ํ: cls_embedding = last_hidden_state[:, 0, :]
shape -> (batch_size, hidden_dim)
|
v
Feature vector / ๋ฌธ์ฅ ์๋ฒ ๋ฉ
(๋ถ๋ฅ๊ธฐ ์
๋ ฅ, ์๊ฐํ, ํด๋ฌ์คํฐ๋ง ๋ฑ ํ์ฉ ๊ฐ๋ฅ)
์ ํ์ ์ผ๋ก:
cls_embedding → Linear Layer → Softmax → logits → ํด๋์ค
(AutoModelForSequenceClassification)
2. Hard case feature embedding ์ถ์ถ
- “hard case”๋ ๋ชจ๋ธ์ด ์์ฃผ ํ๋ฆฌ๊ฑฐ๋ confidence๊ฐ ๋ฎ์ ์ํ๋ค์ ๋งํ๋ค
- ๊ทธ ๋ฐ์ดํฐ๋ค์ ์์์ ๋ฝ์ feature extractor์ ํต๊ณผ์์ผ์ ์๋ฒ ๋ฉ์ ์ป๋๋ค
๊ฒฐ๊ณผ์ ์ผ๋ก hard_cases_embeddings.shape๋ [num_samples, hidden_dim]์ด ๋ ๊ฒ์ด๋ค
ex) : [2000, 768]
hard case sample์ ๋ฝ๋ ๋ถ๋ถ์ ์ฌ๊ธฐ
https://bh-kaizen.tistory.com/61
ํ ์คํธ ๋ถ๋ฅ - Hard Example Mining
ํ ์คํธ ๋ถ๋ฅ๋ฅผ ์งํํ๋ ์ค, ์น๊ตฌ์๊ฒ ์ข์ ์์ด๋์ด๋ฅผ ํ๋ ๋ฐ์๋ค๋จผ์ ๊ต์ฐจ๊ฒ์ฆ์ ๋๋ฆฌ๋ฉด์ ๊ฐ ํด๋๋น ๊ฒ์ฆ์ ์ ๋ํด ์์ธกํ ๋ผ๋ฒจ๊ณผ ํ๋ฅ ๊ฐ์ ์ ์ฅํ๋ฉด ๋ฒ ์ด์ค๋ผ์ธ์ด ์๋ณธ ์ ์ฒด ๋ฐ์ดํฐ์ ์
bh-kaizen.tistory.com
์์ ๊ธ๋๋ก ๊ต์ฐจ ๊ฒ์ฆ์ ์ด์ฉํด ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ฉด์ ์์ธก์ด ํ๋ฆฐ ํ๋ ์ํ ๋ฐ์ดํฐ 38,713๊ฐ๋ฅผ ์ ์ฅํด๋์๋ค
์๋ ์ฝ๋๋ฅผ ํตํด ํ๋ ์ํ๋ค์ pre-trained๋ BERT ๋ชจ๋ธ์ ๊ฑฐ์ณ feature vector๋ฅผ ์ถ์ถํ์๋ค
from transformers import AutoTokenizer, AutoModel
import torch
from torch.utils.data import DataLoader, Dataset
# 1. ๋ชจ๋ธ ๋ฐ ํ ํฌ๋์ด์
MODEL_NAME = "kykim/bert-kor-base"
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = AutoModel.from_pretrained(MODEL_NAME)
model.eval() # ์ถ๋ก ๋ชจ๋๋ก ์ ํ
# 2. ํ๋ ์ผ์ด์ค ๋ฐ์ดํฐ (์: list of strings)
hard_cases_texts = hard_df['review_normalized'].tolist() # 38713๊ฐ ๋ฌธ์ฅ
# 3. Dataset / DataLoader ์ ์
class TextDataset(Dataset):
def __init__(self, texts):
self.texts = texts
def __len__(self):
return len(self.texts)
def __getitem__(self, idx):
return self.texts[idx]
dataset = TextDataset(hard_cases_texts)
dataloader = DataLoader(dataset, batch_size=16, shuffle=False)
# 4. Feature ์ถ์ถ
all_embeddings = []
device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)
with torch.no_grad():
for batch_texts in dataloader:
# ํ ํฌ๋์ด์ฆ
inputs = tokenizer(batch_texts, padding=True, truncation=True, return_tensors="pt").to(device)
outputs = model(**inputs)
# CLS ๋ฒกํฐ ์ถ์ถ
cls_embeddings = outputs.last_hidden_state[:, 0, :] # shape: (batch_size, hidden_dim)
all_embeddings.append(cls_embeddings.cpu())
# 5. ํฉ์น๊ธฐ
hard_cases_embeddings = torch.cat(all_embeddings, dim=0)
print("Hard cases embeddings shape:", hard_cases_embeddings.shape)
Hard cases embeddings shape: torch.Size([38713, 768])
- ๊ฐ ๋ฌธ์ฅ๋ง๋ค 768์ฐจ์์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฒกํฐ๋ก ์ถ์ถํ์๋ค
- ์๋ฒ ๋ฉ ์ฐจ์์ด 768์ธ ์ด์ ๋ BERT-base ๊ณ์ด ๋๋ถ๋ถ์ด hidden_size = 768 ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ
- ์๋์ฒ๋ผ ๋ด๊ฐ ์ฌ์ฉํ๋ ๋ชจ๋ธ์ด ๋ช ์ฐจ์์ผ๋ก ์ค์ ํ๋์ง ํ์ธ ๊ฐ๋ฅํ๋ค
from transformers import AutoModel
model = AutoModel.from_pretrained("kykim/bert-kor-base")
print(model.config.hidden_size) # 768
=> 768
3. ์ฐจ์ ์ถ์ ๋ฐ ํด๋ฌ์คํฐ๋ง ์๊ฐํ
- 768์ฐจ์์ ์ฌ๋์ด ๋ณผ ์ ์์ผ๋๊น, t-SNE๋ UMAP, PCA ๊ฐ์ ๊ฑธ๋ก ์ถ์.
- ์ถ์ ํ 2D ํน์ 3D๋ก ํํํด์ ์ ๋ค์ด ์ด๋ป๊ฒ ๋ชจ์ด๋์ง ๋ณธ๋ค.
t-SNE
import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from sklearn.decomposition import PCA
import umap.umap_ as umap # ์ค์น ํ์ / pip install umap-learn
from sklearn.cluster import DBSCAN
# embeddings: torch.Tensor (38404, 768)
embeddings = hard_cases_embeddings.cpu().numpy()
labels = hard_df['label'].values # shape (38404,)
# ๋ผ๋ฒจ๋ณ ์์ ํ๋ ํธ
colors = ['#FF6B6B', '#FFD93D', '#6BCB77', '#4D96FF']
# 2D
tsne_2d = TSNE(n_components=2, perplexity=30, n_iter=1000, random_state=42)
emb_2d_tsne = tsne_2d.fit_transform(embeddings)
plt.figure(figsize=(10,8))
for i in np.unique(labels):
plt.scatter(emb_2d_tsne[labels==i,0], emb_2d_tsne[labels==i,1],
label=f'Label {i}', s=10, alpha=0.7, c=colors[i])
plt.title("t-SNE (2D)")
plt.legend()
plt.show()
# 3D
tsne_3d = TSNE(n_components=3, perplexity=30, n_iter=1000, random_state=42)
emb_3d_tsne = tsne_3d.fit_transform(embeddings)
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')
for i in np.unique(labels):
ax.scatter(emb_3d_tsne[labels==i,0], emb_3d_tsne[labels==i,1], emb_3d_tsne[labels==i,2],
label=f'Label {i}', s=10, alpha=0.7)
ax.set_title("t-SNE (3D)")
ax.legend()
plt.show()


PCA
# 2D
pca_2d = PCA(n_components=2, random_state=42)
emb_2d_pca = pca_2d.fit_transform(embeddings)
plt.figure(figsize=(10,8))
for i in np.unique(labels):
plt.scatter(emb_2d_pca[labels==i,0], emb_2d_pca[labels==i,1],
label=f'Label {i}', s=10, alpha=0.7, c=colors[i])
plt.title("PCA (2D)")
plt.legend()
plt.show()
# 3D
pca_3d = PCA(n_components=3, random_state=42)
emb_3d_pca = pca_3d.fit_transform(embeddings)
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')
for i in np.unique(labels):
ax.scatter(emb_3d_pca[labels==i,0], emb_3d_pca[labels==i,1], emb_3d_pca[labels==i,2],
label=f'Label {i}', s=10, alpha=0.7)
ax.set_title("PCA (3D)")
ax.legend()
plt.show()


UMAP
# 2D
umap_2d = umap.UMAP(n_components=2, n_neighbors=15, min_dist=0.1, random_state=42)
emb_2d_umap = umap_2d.fit_transform(embeddings)
plt.figure(figsize=(10,8))
for i in np.unique(labels):
plt.scatter(emb_2d_umap[labels==i,0], emb_2d_umap[labels==i,1],
label=f'Label {i}', s=10, alpha=0.7, c=colors[i])
plt.title("UMAP (2D)")
plt.legend()
plt.show()
# 3D
umap_3d = umap.UMAP(n_components=3, n_neighbors=15, min_dist=0.1, random_state=42)
emb_3d_umap = umap_3d.fit_transform(embeddings)
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')
for i in np.unique(labels):
ax.scatter(emb_3d_umap[labels==i,0], emb_3d_umap[labels==i,1], emb_3d_umap[labels==i,2],
label=f'Label {i}', s=10, alpha=0.7)
ax.set_title("UMAP (3D)")
ax.legend()
plt.show()


์... ๋ณด๋ค์ํผ ๋ผ๋ฒจ์ ๊ตฌ๋ถ์ด๊ณ ๋ญ๊ณ ์๊ณ ๊ทธ๋ฅ ๋ค ํ๋์ ๋ผ๋ฒจ ๋ง๋ฅ ๋ญ์ณ์๋ค
ํน์ 3D plotly๋ก ๋๋ ค๊ฐ๋ฉด์ ๋ณด๋ฉด ๋ ์ด์ด๋ก ๋๋ ์ ธ์์ง ์์๊น...?
3D plotly ์๊ฐํ ์ฝ๋
import numpy as np
import plotly.express as px
from sklearn.manifold import TSNE
from sklearn.decomposition import PCA
import umap.umap_ as umap
# embeddings: torch.Tensor (38404, 768)
embeddings = loaded_embeddings.cpu().numpy()
labels = hard_df['label'].values # shape (38404,)
label_names = {0: "๊ฐํ ๋ถ์ ", 1: "์ฝํ ๋ถ์ ", 2: "์ฝํ ๊ธ์ ", 3: "๊ฐํ ๊ธ์ "}
# ์์ ํ๋ ํธ (Plotly์ฉ)
colors = ['#FF6B6B', '#FFD93D', '#6BCB77', '#4D96FF']
# --- t-SNE 3D ---
tsne_3d = TSNE(n_components=3, perplexity=30, n_iter=1000, random_state=42)
emb_3d_tsne = tsne_3d.fit_transform(embeddings)
fig_tsne = px.scatter_3d(
x=emb_3d_tsne[:,0], y=emb_3d_tsne[:,1], z=emb_3d_tsne[:,2],
color=[label_names[l] for l in labels],
title="t-SNE (3D) Interactive",
color_discrete_sequence=colors,
opacity=0.7
)
fig_tsne.update_traces(marker=dict(size=3))
fig_tsne.show()
# --- PCA 3D ---
pca_3d = PCA(n_components=3, random_state=42)
emb_3d_pca = pca_3d.fit_transform(embeddings)
fig_pca = px.scatter_3d(
x=emb_3d_pca[:,0], y=emb_3d_pca[:,1], z=emb_3d_pca[:,2],
color=[label_names[l] for l in labels],
title="PCA (3D) Interactive",
color_discrete_sequence=colors,
opacity=0.7
)
fig_pca.update_traces(marker=dict(size=3))
fig_pca.show()
# --- UMAP 3D ---
umap_3d = umap.UMAP(n_components=3, n_neighbors=15, min_dist=0.1, random_state=42)
emb_3d_umap = umap_3d.fit_transform(embeddings)
fig_umap = px.scatter_3d(
x=emb_3d_umap[:,0], y=emb_3d_umap[:,1], z=emb_3d_umap[:,2],
color=[label_names[l] for l in labels],
title="UMAP (3D) Interactive",
color_discrete_sequence=colors,
opacity=0.7
)
fig_umap.update_traces(marker=dict(size=3))
fig_umap.show()



์ด๋ฆผ๋ ์์ง!!
ํ๋์ 3๋ฒ ๋ผ๋ฒจ, ๊ฐํ ๋ถ์ ์ด ์ ์ฒด์ ์ผ๋ก ํผ์ ธ์๊ณ ๊ทธ๋๋ง ์ด๋ก์ 2๋ฒ ๊ฐํ ๊ธ์ ์ด ์กฐ๊ธ์ด๋๋ง ๋ถ๋ฆฌ๊ฐ ๋๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค
๊ทธ๋ผ ํ๋ฆฐ ๋ฐ์ดํฐ๋ค์ด ์๋๋ผ ์ ๋ง์ถ๋ ๋ฐ์ดํฐ๋ค, ๋์ ํ๋ฅ ๋ก ์ ๋ต ๋ผ๋ฒจ์ ๋ง์ถ ๋ฐ์ดํฐ๋ค์ ์ฌ์ฉํ๋ฉด ๊ณผ์ฐ ํด๋ฌ์คํฐ๋ง์ด ์ ๋ ๊น?
27๋ง๊ฐ์ ๋ฐ์ดํฐ ์ค ์ ์ ๋ผ๋ฒจ์ 90% ์ด์ ํ๋ฅ ๋ก ์์ธกํ ๋ฐ์ดํฐ๋ค์ 184,404๊ฐ

์ด๋ ๊ฒ ๋ณด๋ ํ๋ ์ผ์ด์ค์๋ ๋ฌ๋ฆฌ ๋ผ๋ฒจ๋ณ๋ก ์ด๋์ ๋ ์๋ฆฌ๊ฐ ์กํ์์์ ํ์ธํ ์ ์๋ค






๊ธฐ๋ํ๋ ๊ฒ๋งํผ ๊น๋ํ๊ฒ ๋ถ๋ฆฌ๋์ง ์์ง๋ง ์๊ฐ์ ์ผ๋ก ์ ์๋ฏธํ ์ฐจ์ด๋ฅผ ํ์ธํ ์ ์์๋ค
๋ชจ๋ธ์ ๊ฒฝ์ฐ ํ์ธ ํ๋์ด ์๋ pre-trained๋ก ์ฌ์ฉํด๋ณด์์ผ๋ ํ์ธ ํ๋์ด ๋ ๋ชจ๋ธ๋ก ๋ดค๋ค๋ฉด ์ด ๋ผ๋ฒจ๊ฐ์ ๊ตฌ๋ถ์ ๋ ์ ํํ๊ฒ ํด์ฃผ์ง ์์๊น ์ถ์๋ค
์ด๋ฐ ์๊ฐํ๋ ํ์ตํ๊ธฐ ์ ๋ชจ๋ธ์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ผ๋ณด๋ ์์ผ๋ผ๊ณ ๋ ํ ์ ์๊ฒ ๋ค
4. ๋ผ๋ฒจ๋ณ๋ก ๊ตฌ๋ถํด์ ๊ด์ฐฐ
ํ ๋ฒ์ 4๊ฐ ๋ผ๋ฒจ(๊ฐ๋ถ์ ·์ฝ๋ถ์ ·์ฝ๊ธ์ ·๊ฐ๊ธ์ )์ ๋ค ๋ณด๋ ๋์ :
- ๊ธ์ vs ๋ถ์ (์ด์ง)
- ์ฝ vs ๊ฐ (๊ฐ๋ ๊ตฌ๋ถ)
์ด๋ ๊ฒ ๋ ์ถ์ผ๋ก ๋๋ ์ ์๊ฐํํ๋ฉด ๊ตฐ์ง์ด ์ข ๋ ๋ช ํํ๊ฒ ๋ํ๋ ์ ์๋ค
ํ์ฌ ๋ผ๋ฒจ:
- 0: ๊ฐํ ๋ถ์ 1: ์ฝํ ๋ถ์ 2: ์ฝํ ๊ธ์ 3: ๊ฐํ ๊ธ์
๋ ์ถ์ ์ ์ํ๋ค:
- X์ถ: ๊ธ์ (+) ↔ ๋ถ์ (-)
- Y์ถ: ๊ฐ(↑) ↔ ์ฝ(↓)
import numpy as np
import matplotlib.pyplot as plt
label_names = {0: "๊ฐํ ๋ถ์ ", 1: "์ฝํ ๋ถ์ ", 2: "์ฝํ ๊ธ์ ", 3: "๊ฐํ ๊ธ์ "}
# ์์: (38404,) ํํ์ ์ ๋ต ๋ผ๋ฒจ ๋ฒกํฐ
# y = np.array([...])
# ๊ฐ์ฑ polarity: ๋ถ์ (0,1)=0 / ๊ธ์ (2,3)=1
polarity = np.where(y < 2, 0, 1)
# ๊ฐ์ฑ intensity: ์ฝ(1,2)=0 / ๊ฐ(0,3)=1
intensity = np.where((y == 0) | (y == 3), 1, 0)
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
# # t-SNE 2D
# tsne_2d = TSNE(n_components=2, perplexity=30, n_iter=1000, random_state=42)
# emb_2d_tsne = tsne_2d.fit_transform(embeddings)
# ๐จ ๊ณ ์ฑ๋ ์ปฌ๋ฌ๋งต (์ง์ ์ ์)
from matplotlib.colors import LinearSegmentedColormap
bright_cmap = LinearSegmentedColormap.from_list("bright_red_green", [
(0.0, "#FF0000"), # pure red
(0.5, "#FFFF00"), # bright yellow
(1.0, "#00FF00") # pure green
])
# โ
Polarity ์๊ฐํ (๋ถ์ =๋นจ๊ฐ, ๊ธ์ =์ด๋ก)
plt.figure(figsize=(8, 6))
plt.scatter(
emb_2d_tsne[:, 0], emb_2d_tsne[:, 1],
c=polarity, cmap=bright_cmap, # ๊ณ ์ฑ๋ ๋นจ๊ฐ-๋
ธ๋-์ด๋ก
s=10, alpha=0.7, edgecolors='none'
)
plt.title("Polarity (Red=๋ถ์ , Green=๊ธ์ )")
plt.xlabel("t-SNE Dim 1")
plt.ylabel("t-SNE Dim 2")
plt.grid(False)
plt.show()
# โ
Intensity ์๊ฐํ (์ฝ→๊ฐ: ๋ฐ์→์ง์, ๋ ์จํ ๋ฒ์ )
vivid_viridis = LinearSegmentedColormap.from_list("vivid_viridis", [
(0.0, "#B7E3FF"), # ๋ฐ์ ํ๋์
(0.5, "#4D9BE6"), # ์งํ ํ๋
(1.0, "#1E3A8A") # ๋งค์ฐ ์ง์ ๋จ์
])
plt.figure(figsize=(8, 6))
plt.scatter(
emb_2d_tsne[:, 0], emb_2d_tsne[:, 1],
c=intensity, cmap=vivid_viridis,
s=10, alpha=0.7, edgecolors='none'
)
plt.title("Intensity (Light=์ฝ, Dark=๊ฐ)")
plt.xlabel("t-SNE Dim 1")
plt.ylabel("t-SNE Dim 2")
plt.grid(False)
plt.show()


ํ๋ ์ผ์ด์ค๋ค์ ํผ์ณ ๋ฒกํฐ๋ค๋ก ์ดํด๋ณด๋ฉด ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค
์ฌ์ค์ ๊ธ์ ๋ถ์ ๊ณผ ๊ฐ์ฝ ๋ชจ๋ ๋ง์ด ์์ฌ์์ด์ ๊ตฌ๋ถ์ด ์ ๋๋ก ๋์ง ์๋๋ค
๊ทธ๋ผ ์ ๋ต ๋ผ๋ฒจ์ 0.9 ์ด์์ ๋์ ํ๋ฅ ๋ก ๋ง์ถ ๋ฐ์ดํฐ๋ค์ ์ด๋ป๊ฒ ๋์ฌ๊น??


์ค.. ํ์คํ ๋ถํฌ ์์ฒด๊ฐ ๋ค๋ฅด๋ค
๋ ์ ํํ๊ฒ ๋น๊ตํ๊ธฐ ์ํด ๋ ๊ทธ๋ํ๋ค์ ๋ถ์ฌ๋ณด๋ฉด ํจ์ฌ ๋ ๋์ ์ ๋ค์ด์จ๋ค




์ ๋ต ํ๋ฅ ์ด 90% ์ด์์์๋ ๋ถ๊ตฌํ๊ณ ์ผ์ชฝ, ์์ชฝ์ ํด๋ฌ์คํฐ์ฒ๋ผ ๋ช
ํํ ๊ตฌ๋ถ์ด ์๋๋ ์ง์ ์ด ์กด์ฌํ๋ค
์ ๊ธฐ์ ๋ถํฌ๋ ์ง์ ์ ๋ฐ์ดํฐ๋ค์ ๋ฝ์๋ด์ ๋ถ์ ํ ์ฆ๊ฐ ๋ฐ ์ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค๋ฉด ์ด๊ฒ๋ ์ ํจํ ๋ฐฉ๋ฒ์ด ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค
๊ทธ๋์ ์ด๋ฌํ ๊ฒฐ๊ณผ๋ค์ ํตํด ๋ฌด์์ ์ ์ ์์๊น?
๊ทธ๋ฅ ๊ทธ๋ํ๋ง ์ฐ์ด๋ณด๊ณ ๋๋๋ฉด ๊ทธ๊ฑด ๋ถ์์ด ์๋๋ผ ์๊ฐํ์ ๋ถ๊ณผํ๋ค
โ ํด๋์ค ๊ฐ ๋ถ๋ฆฌ๋ (Separability)
- ํด๋ฌ์คํฐ๊ฐ ๋ช
ํํ ๋ถ๋ฆฌ๋์ด ์๋ค๋ฉด:
๋ชจ๋ธ์ ์๋ฒ ๋ฉ ๊ณต๊ฐ์์ ๊ฐ ๊ฐ์ ํด๋์ค๊ฐ ์ ๊ตฌ๋ถ๋๊ณ ์๋ค๋ ๋ป.
→ ์ฆ, ์ด๋ฏธ ๋ชจ๋ธ์ด ๊ฐ์ ์ ๊ฒฝ๊ณ๋ฅผ ์ ํ์ตํ๊ณ ์๋ค๋ ์๋ฏธ. - ํด๋ฌ์คํฐ๊ฐ ๊ฒน์ณ ์๋ค๋ฉด:
ํด๋น ๊ฐ์ ๋ค ์ฌ์ด์ ํํ์ ๊ฒฝ๊ณ๊ฐ ๋ถ๋ถ๋ช ํจ.
์: ์ฝํ ๊ธ์ (2)๊ณผ ์ฝํ ๋ถ์ (1)์ด ์์ฌ ์๋ค๋ฉด, ๋ชจ๋ธ์ด ๋ฌธ์ฅ์ "๊ฐ์ฝ" ํํ์ ๊ตฌ๋ถํ์ง ๋ชปํ๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ๋์.
๊ทธ๋ํ๋ค์ ๋ณด๊ณ ์ ํนํ ๊ฒฝ๊ณ๋ฅผ ์ ๊ตฌ๋ถํ์ง ๋ชปํ๋ ๋ผ๋ฒจ์ ๋ํด ์ง์ค์ ์ผ๋ก ์ฆ๊ฐ์ ์์ผ์ฃผ๋ ๊ฒ์ด ์ ์ฉํ ์ ์๋ค
๋๋ ๊ทธ๋ฐ ๋ผ๋ฒจ๋ค์ ํ ์คํธ๋ฅผ ํ์ธํ์ฌ ๋ ธ์ด์ฆ๋ ์ด์์น ๋ฑ์ ํ์ธํด ์ ๊ฑฐํด์ฃผ๋ ๋ฑ์ ๋ฐ์ดํฐ ํ์ง์ ๊ฐ์ ์ํฌ ์ ์๋ค
โก ํด๋์ค ๋ด๋ถ ์์ง๋ (Intra-class compactness)
- ๊ฐ์ ๋ผ๋ฒจ์ ์ํ๋ค์ด ๋ฐ์ง๋์ด ์๋ค๋ฉด:
ํด๋น ํด๋์ค ๋ด ๋ฌธ์ฅ ํํ์ด ์ผ๊ด์ฑ ์๊ฒ ์ธ์ฝ๋ฉ๋๊ณ ์์. - ๊ฐ์ ๋ผ๋ฒจ์์๋ ํผ์ ธ ์๋ค๋ฉด:
ํด๋น ๊ฐ์ ์ ํํ ๋ฐฉ์์ด ๋ค์ํ๊ฑฐ๋ ๋ฐ์ดํฐ ํ์ง์ด ๋ถ๊ท ์ผํจ์ ์๋ฏธ.
์์ ๋น์ทํ ๋ด์ฉ์ด์ง๋ง ํผ์ ธ ์๋ ํน์ ํด๋์ค์ ์ํ๋ค์ ์ดํด์, ๋ฐ์ดํฐ ๋ ธ์ด์ฆ(๋ผ๋ฒจ ์ค๋ฅ, ์คํ, ์ค์์ ํํ)๋ฅผ ์ ์ ํ๋ค
์๋ฅผ ๋ค์ด “์ฝํ ๊ธ์ ”์ด ๋๋ฌด ํฉ์ด์ ธ ์๋ค๋ฉด, ๊ฐ๋์ ๋ํ ํํ ๊ธฐ์ค์ด ๋ชจํธํ ์ ์๋ค → ๋ผ๋ฒจ๋ง ๊ธฐ์ค ์ฌ์ ๊ฒ.
โข Hard Case์ ์์น
- ํ๋์ผ์ด์ค(hard samples)๋ฅผ ์๊ฐํ์ ํจ๊ป ํ์ํ๋ฉด,
์ด๋ค์ด ํด๋ฌ์คํฐ ๊ฒฝ๊ณ ๊ทผ์ฒ์ ๋ชฐ๋ ค ์๋์ง, ์๋๋ฉด ํน์ ์์ญ์ ์ง์ค๋์ด ์๋์ง ํ์ธ ๊ฐ๋ฅ - ๊ฒฝ๊ณ ๊ทผ์ฒ์ ๋ชฐ๋ ค ์๋ค๋ฉด:
๊ฐ์ ๊ฐ ๊ฒฝ๊ณ๊ฐ ์ ๋งคํ ๋ฌธ์ฅ๋ค์ด ๋ฌธ์ ์ ์ฃผ ์์ธ - ํน์ ์์ญ(์: “์ฝํ ๊ธ์ ” ํด๋ฌ์คํฐ ๋ด๋ถ ํ ๋ถ๋ถ)์ ์ง์ค๋์ด ์๋ค๋ฉด:
ํด๋น ํํ ์ ํ(์: “์ข๊ธด ํ๋ฐ ์์ฌ์์ด ์๋ค”)์ ๋ชจ๋ธ์ด ํ์ตํ์ง ๋ชปํ ๊ฒ
ํ๋์ผ์ด์ค ๋ฌธ์ฅ๋ง ๋ฐ๋ก ๋ชจ์ ๋ฐ์ดํฐ ์ฆ๊ฐ(์ญ๋ฒ์ญ, synonym replacement) ์ํ.
๋ชจ๋ธ์ด ์ฝํ ๊ฐ์ ๊ฒฝ๊ณ ํํ์ ๊ฐํํ๋๋ก ํ์ต.
์ด ๋ถ๋ถ๊น์ง๋ ํด๋ณด์ง ๋ชปํ์ผ๋ ์ ๋ง์ถ ์ํ vs ํ๋ ์ผ์ด์ค 2๊ฐ๋ก ์๊ฐํ๋ฅผ ํด๋ณด๋ฉด ๋ ๋ค๋ฅธ ์ธ์ฌ์ดํธ๋ฅผ ์ป์ ์ ์์ง ์์๊น ์ถ๋ค
โก๏ธ ์์ธก์ ์์ ํ ํ๋ฆฌ๊ฒ ํ ํ๋ ์ผ์ด์ค๋ค, ๋๋ต 16000๊ฐ์ ํด๋นํ๋ ํ ์คํธ์ ๋ํด back-translation์ ํตํด ์ฝ 16000๊ฐ ํ ์คํธ๋ฅผ ์ฆ๊ฐ์ํจ ํ ๋ฒ ์ด์ค๋ผ์ธ์ ๋ํด ํ์ต์์ผ๋ณด์์ผ๋ ์ ์๋ฏธํ ์ฑ๋ฅ ํฅ์์ ์์๋ค.
์๋ง ์ ์ฒด ๋ฐ์ดํฐ์ ์ฝ 27๋ง๊ฐ ์ค ์ผ๋ถ์ ๋ถ๊ณผํด ํฐ ์ํฅ์ ๋ฏธ์น์ง ๋ชปํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค
โฃ Pre-trained vs Fine-tuned ๋น๊ต
- ์ง๊ธ์ pre-trained ์๋ฒ ๋ฉ์ด์ง๋ง, fine-tuning ํ ๊ฐ์ ์๊ฐํ๋ฅผ ๋ค์ ํ๋ฉด
ํด๋ฌ์คํฐ๊ฐ ํจ์ฌ ๋ ๋ช ํํ๊ฒ ๋ถ๋ฆฌ๋๋ ๊ฑธ ๋ณผ ์ ์์ ๊ฑฐ์ผ. - ์ฆ, fine-tuning์ด “semantic space๋ฅผ ๊ฐ์ ๋ณ๋ก ์ฌ๋ฐฐ์นํ๋ ๊ณผ์ ”์์ ์๊ฐ์ ์ผ๋ก ๊ฒ์ฆํ ์ ์์.
fine-tuning ์ ํ ์๊ฐํ๋ฅผ ๋น๊ตํ์ฌ, ๋ชจ๋ธ ํ์ต ํจ๊ณผ๋ฅผ ์ง๊ด์ ์ผ๋ก ํ๊ฐ ๊ฐ๋ฅ.
“ํด๋ฌ์คํฐ ๋ถ๋ฆฌ๋ ↑”๊ฐ ์ค์ accuracy ํฅ์๊ณผ ์ผ์นํ๋์ง๋ ํ์ธ ๊ฐ๋ฅ.
์ด ๋ถ๋ถ์ ํ์ต ํ ๋ณด๊ณ ์ ์์ฑ ๋ฑ์ ์๊ฐํ ์๋ฃ๋ก ๊ฐ์ด ๋ณด์ฌ์ฃผ๋ ๊ฒ์๋ ์ ์ฉํด๋ณด์ธ๋ค
๋ช ํํ ์ฑ๋ฅ ์งํ์ ์์น๋ค, ๊ทธ๋ํ ๋ฑ์ผ๋ก ๋ณด์ฌ์ค ์ ์์ผ๋ ๊ฐ ๋ฌธ์ฅ๋ค์ด ์ขํ์ ์ด๋์ ์์นํ์ผ๋ฉฐ ๋ชจ๋ธ์ด ์ด๋ฅผ ์ ํ์ตํ์ฌ ์ผ๋ง๋ ์ ๋ถ๋ฅํ๋์ง๋ฅผ ๋ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ณด์ฌ์ค ์ ์๋ค
์ฐธ๊ณ ์๋ฃ
07. ์ฃผ์ Auto ํด๋์ค
## [์คํ ํด๋์ค] ⇒ Transformer ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ชจ๋ธ์ด๋ ํ ํฌ๋์ด์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ด๋ฆ๋ง์ผ๋ก ์๋์ผ๋ก ๋ถ๋ฌ์ฌ ์ ์๊ฒ ํด์ฃผ๋ ํธ์ ํด๋์ค - ํ๊น ํ์ด์ค์ ์๋ ์๋ง…
wikidocs.net
https://huggingface.co/docs/transformers/ko/model_doc/auto
Auto ํด๋์ค
(๋ฒ์ญ์ค) ํจ์จ์ ์ธ ํ์ต ๊ธฐ์ ๋ค
huggingface.co
https://jimmy-ai.tistory.com/539
ํ์ด์ฌ UMAP ์ฐจ์ ์ถ์ ๋ฐ ์๊ฐํ ์์
์๋ ํ์ธ์.์ด๋ฒ ๊ธ์์๋ python์์ ๋ํ์ ์ธ ์ฐจ์ ์ถ์ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์ธumap์ ํตํด์ ์ฐจ์ ์ถ์๋ฅผ ํด๋ณด๊ณ ์๊ฐํ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ดํด๋ณด๋ ์์ ๋ฅผ ๋ค๋ฃจ์ด ๋ณด๊ฒ ์ต๋๋ค. ๋ชจ๋ ์ค์นUMAP ์๊ฐํ๋ฅผ ์
jimmy-ai.tistory.com
'AI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Object Detection] Fast R-CNN ์ดํด๋ณด๊ธฐ (0) | 2025.12.01 |
|---|---|
| [Object Detection] R-CNN ์ดํด๋ณด๊ธฐ (+SPPNet) (0) | 2025.11.27 |
| ํ ์คํธ ๋ถ๋ฅ - Hard Example Mining (0) | 2025.10.28 |
| VGGNet (ICLR 2015) ์์ฝ ๋ฐ ๋ฆฌ๋ทฐ (0) | 2024.01.29 |