๐ท BERT
BERT = Bidirectional Encoder Representations from transformers
์ฌ๋์ฒ๋ผ ๋ฌธ์ฅ์ ์ดํดํ๋ ค๊ณ ๋ง๋ ์ธ๊ณต์ง๋ฅ ์ธ์ด ๋ชจ๋ธ
๊ธฐ์กด์ AI ๋ชจ๋ธ์ ๋จ๋ฐฉํฅ์ผ๋ก ์ดํดํจ
BERT๋ ๋ฌธ์ฅ์ ์๋ฐฉํฅ์ผ๋ก ์ฝ์ด์ ๋ ๊น์ด ์ดํดํจ
๐ท BERT ์๋๋ฐฉ์
Transformer ๋ผ๋ ๋ฅ๋ฌ๋ ๊ตฌ์กฐ ์ฌ์ฉํด์ ์๋
๐ท ํ๋ จ ๋ฐฉ๋ฒ ์์
๋ฌธ์ฅ์์ ๋ช ๊ฐ ๋จ์ด๋ฅผ ๋ง์คํน ์ฒ๋ฆฌ
๋๋ [mask]์ ๋ง์ จ๋ค.
๋ชจ๋ธ์ด ๋น์นธ์ ๋ค์ด๊ฐ ๋จ์ด๋ฅผ ์์ธก
์ปคํผ
์ ๋ต ๋งํ๊ธฐ ํ๋ จ์ ์์ฒ๋ง ๊ฐ ๋ฌธ์ฅ์ผ๋ก ๋ฐ๋ณต ํ์ต
๐ท BERT ์ฅ์
๊ธฐ๋ฅ์์ | |
๋ฌธ์ฅ ์ดํด | "์งํ์ฒ ์ญ ๊ทผ์ฒ ๋ฐฉ" <-> "์ญ์ธ๊ถ ์๋ฃธ" -> ์๋ฏธ ํ์ ๊ฐ๋ฅ |
์ง๋ฌธ์ ๋ตํ๊ธฐ | "๋ํ๋ฏผ๊ตญ์ ์๋๋?" -> "์์ธ" |
๋ฌธ์ฅ ๊ฐ ๊ด๊ณ ํ์ | "๊ทธ๋ ๋ฐฅ์ ๋จน์๋ค. ๊ทธ๋ ๋ฐฐ๊ฐ ๊ณ ํ ๋ค." -> ๋ ผ๋ฆฌ ์ฐ๊ฒฐ ์ดํด |
๋ฌธ์ฅ ์์ฝ | ๊ธด ๋ฌธ์ฅ -> ํต์ฌ๋ง ์ ๋ฆฌ ๊ฐ๋ฅ(fine-tuning ํ์) |

๐ท SBERT
Sentence-BERT
๋ฌธ์ฅ ๊ฐ ์๋ฏธ ๋น๊ต๋ฅผ ์ํด ๋์จ ๋ชจ๋ธ
โ ๊ธฐ๋ณธ ๊ฐ๋
๊ธฐ์กด BERT
- ๋ ๋ฌธ์ฅ์ ๊ด๊ณ๋ง ํ์ต
- ๋ฌธ์ฅ ์์ฒด๋ฅผ ๋ฒกํฐ๋ก ํํํ๋ ๋ฐ๋ ์ ํฉํ์ง ์์
-> SBERT
- ๋ฌธ์ฅ ํ๋ -> ๊ณ ์ ๊ธธ์ด์ ์๋ฏธ ๋ฒกํฐ(์๋ฒ ๋ฉ)
- ๋ฌธ์ฅ A์ B -> ๋ฒกํฐ ๊ฑฐ๋ฆฌ๋ก ๋น๊ต ๊ฐ๋ฅ(์ฝ์ฌ์ธ ์ ์ฌ๋ ๋ฑ)
๐ท ์์ ์ฝ๋
๐ ์ค์น
pip install sentence-transformers
๐ฆ ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('sentence-transformers/paraphrase-multiligual-MiniLM-L12-v2')
| โ ์ ๋ชจ๋ธ์ ํ๊ตญ์ด ํฌํจ ๋ค๊ตญ์ด ์ง์ + ๋น ๋ฅด๊ณ ๊ฐ๋ฒผ์
**โ ๋ฌธ์ฅ ๋ฒกํฐํ (์๋ฒ ๋ฉ)
sentence = "๊ฐ๋จ์ ์๋ ์์ธ 1000 ์ดํ ์๋ฃธ ์ถ์ฒํด์ค"
embedding = model.encode(sentence)
print(embedding.shape) # (384,) ๋ฒกํฐ ์ฐจ์ ์
์ถ๋ ฅ๊ฐ: ๋ฒกํฐ (list๋ numpy ๋ฐฐ์ด์ฒ๋ผ ์๊น)
๋ฒกํฐ๋ผ๋ฆฌ์ ์ ์ฌ๋ ๋น๊ตํ๋ฉด ๋ฌธ์ฅ ์๋ฏธ ๋น๊ต ๊ฐ๋ฅ
๐ท ์ฝ์ฌ์ธ ์ ์ฌ๋ ๊ณ์ฐ ์์
from sklearn.metrics.pairwise import cosine_similarity
s1 = "์ญ์ธ๊ถ ์กฐ์ฉํ ์๋ฃธ"
s2 = "์งํ์ฒ ๊ทผ์ฒ ์กฐ์ฉํ ๋ฐฉ"
s3 = "๋ณต์ธต ์คํผ์คํ
, ๋์ ๊ฑฐ์ค"
emb1 = model.encode(s1)
emb2 = model.encode(s2)
emb3 = model.encode(s3)
print("์ ์ฌ๋ (1 vs 2):", cosine_similarity([emb1], [emb2])[0][0])
print("์ ์ฌ๋ (1 vs 3):", cosine_similarity([emb1], [emb3])[0][0])
์์ ๊ฒฐ๊ณผ:
1 vs 2: 0.85 = ๋น์ทํ ์๋ฏธ
1 vs 3: 0.40 = ๋ ๋น์ทํจ
๐ท ์ ์ฒด ํ๋ฆ ์์ฝ
SBERT ๋ชจ๋ธ ๋ก๋ฉ
SentenceTransformer
์ฌ์ฉ์ ๋ฌธ์ฅ ์ธ์ฝ๋ฉ
model.encode(user_input)
๋งค๋ฌผ ์ค๋ช or ํค์๋ ๋ฌธ์ฅ ์ธ์ฝ๋ฉ
model.encode(listing_texts)
๋ฒกํฐ ๊ฐ ์ฝ์ฌ์ธ ์ ์ฌ๋ ๊ณ์ฐ
์ ์ฌ๋ ๋์ ์์ผ๋ก ๋งค๋ฌผ ์ถ์ฒ
๐ท ์ถ์ฒ ๋ชจ๋ธ๋ก ํ์ฉํ ์ ์๋ SBERT ๋ชจ๋ธ
๋ชจ๋ธ ์ด๋ฆํน์ง | |
| ๋ค๊ตญ์ด ์ง์/๋น ๋ฆ/ํ๊ตญ์ด ํฌํจ |
| ํ๊ตญ์ด ์ ๋จ/์ฝ๊ฐ ๋ ์ ํ |
| ํ๊ตญ์ด ํนํ(์ง๋ฌธ/๋ฌธ์ฅ ์ ์ฌ๋์ ์ต์ ํ) |
์ฐธ๊ณ ์ฌํญ
โ ์๋ฒ ๋ฉ๋ ๋ฒกํฐ๋
numpy
๋ก ๋ณํํด์ ์ ์ฅํด๋๋ฉด DB ์กฐํ ์ ์๋ ๋น ๋ฆโ
model.encode()
์๋normalize_embeddings=True
์ต์ ์ฃผ๋ฉด ์ฝ์ฌ์ธ ์ ์ฌ๋ ๊ณ์ฐ ๋ ์ ํโ ๋ฌธ์ฅ ์ฌ๋ฌ ๊ฐ ํ ๋ฒ์ ๋ฒกํฐํ ๊ฐ๋ฅ