๐ก BERT๋ฅผ ํ์ฉํด ์ง๋ฌธ๊ณผ ๋ฌธ์ ๋ด์ฉ์ ์ซ์๋ก ๋ณํํ ํ, ์ฝ์ฌ์ธ ์ ์ฌ๋๋ฅผ ์ด์ฉํด ์๋ฏธ์ ์ ์ฌ์ฑ์ ๊ณ์ฐํ์ฌ ์ ๋ขฐํ ์ ์๋ ๋ฌธ์๋ฅผ ์ฐพ๋๋ค. ์ฝ๋์์ BERT ๊ธฐ๋ฐ ๋ฌธ์์ ์ง๋ฌธ์ ์ ์ฌ๋ ํ๊ฐ๋ evaluate_with_bert() ํจ์์์ ์ํ๋๋ค.
์ด ํจ์๋ Sentence-BERT (SBERT) ๋ชจ๋ธ์ ์ด์ฉํด ์ง๋ฌธ๊ณผ ๋ฌธ์ ๊ฐ ์๋ฏธ์ ์ ์ฌ๋๋ฅผ ์ธก์ ํ๋ค.
BERT (Bidirectional Encoder Representations from Transformers)๋
Google์์ ๊ฐ๋ฐํ ์์ฐ์ด ์ฒ๋ฆฌ(NLP) ๋ชจ๋ธ๋ก, ๋ฌธ์ฅ์ ๋งฅ๋ฝ์ ์๋ฐฉํฅ์ผ๋ก ์ดํดํ ์ ์๋ ๊ฐ๋ ฅํ AI ๋ชจ๋ธ์ด๋ค.
๐ก ์ผ๋ฐ์ ์ธ NLP ๋ชจ๋ธ๊ณผ์ ์ฐจ์ด์
๊ธฐ์กด ๋ชจ๋ธ๋ค์ ๋ฌธ์ฅ์ ์ผ์ชฝ โ ์ค๋ฅธ์ชฝ ๋ฐฉํฅ(๋๋ ๋ฐ๋)์ผ๋ก๋ง ํด์ํ์.
ํ์ง๋ง BERT๋ ์๋ฐฉํฅ์ผ๋ก ๋ฌธ์ฅ์ ์ฝ์ด ๋ ์ ํํ ์๋ฏธ ๋ถ์ ๊ฐ๋ฅ!
๐ ์์ :
"๋๋ ์ํ์ ๊ฐ๋ค."
BERT๋ '์ํ'์ด ๊ธ์ต๊ธฐ๊ด์ธ์ง, ๊ฐ๊ฐ์ธ์ง ๋ฌธ๋งฅ์ ๋ณด๊ณ ํ๋จํ ์ ์์!
๐น evaluate_with_bert(question, context) ํจ์๋ BERT๋ฅผ ์ด์ฉํด ๋ฌธ์ฅ ๊ฐ ์๋ฏธ์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ๋ค.
def evaluate_with_bert(question, context):
""" BERT ๊ธฐ๋ฐ ๋ฌธ์์ ์ง๋ฌธ์ ์ ์ฌ๋ ํ๊ฐ """
question_embedding = bert_model.encode(question, convert_to_tensor=True) # ์ง๋ฌธ์ ์ซ์๋ก ๋ณํ
context_embedding = bert_model.encode(context, convert_to_tensor=True) # ๋ฌธ์ ๋ด์ฉ์ ์ซ์๋ก ๋ณํ
similarity_score = util.pytorch_cos_sim(question_embedding, context_embedding).item() # ์ฝ์ฌ์ธ ์ ์ฌ๋ ๊ณ์ฐ
return min(max(similarity_score, 0), 1) # 0~1 ๋ฒ์ ์ ์ง
์ ์ฝ๋์ ๋์์ ํ ์ค์ฉ ์ดํด๋ณด์.
question_embedding = bert_model.encode(question, convert_to_tensor=True)
context_embedding = bert_model.encode(context, convert_to_tensor=True)
๐ BERT๋ ๋ฌธ์ฅ์ ์ซ์๋ก ๋ณํํ๋ "์๋ฒ ๋ฉ(embedding)" ์์ ์ ์ํํ๋ค.
bert_model.encode(text): ๋ฌธ์ฅ์ ๋ฒกํฐ(์ซ์๋ก ์ด๋ฃจ์ด์ง ๋ฆฌ์คํธ)๋ก ๋ณํ
convert_to_tensor=True: ๋ฒกํฐ๋ฅผ PyTorch Tensor ํํ๋ก ๋ณํ (์ฐ์ฐ ์ต์ ํ)
๐ ์์ :
"๊ฐ์์ง๋ ๊ท์ฝ๋ค." โ [0.21, -0.67, 1.34, ..., 0.87]
"๋๋ ๊ณ ์์ด๋ฅผ ํค์ด๋ค." โ [0.15, -0.71, 1.22, ..., 0.93]
๐น ์ด๋ ๊ฒ ์ซ์๋ก ๋ณํ๋ ๋ฌธ์ฅ์ ๋ฒกํฐ ๊ณต๊ฐ์์ ๋น๊ต ๊ฐ๋ฅํด์ง!
similarity_score = util.pytorch_cos_sim(question_embedding, context_embedding).item()
๐ BERT๋ก ๋ณํ๋ ๋ ๊ฐ์ ๋ฒกํฐ ๊ฐ ์ ์ฌ๋๋ฅผ ๋น๊ตํ๋ ๊ณผ์
์ฝ์ฌ์ธ ์ ์ฌ๋ (Cosine Similarity) ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ฌธ์ฅ์ ์ ์ฌ๋๋ฅผ ์ธก์
util.pytorch_cos_sim(vec1, vec2): ๋ ๋ฒกํฐ ๊ฐ์ ์ฝ์ฌ์ธ ์ ์ฌ๋๋ฅผ ๋ฐํ
๐ ์ฝ์ฌ์ธ ์ ์ฌ๋ (Cosine Similarity)
์ฝ์ฌ์ธ ์ ์ฌ๋ ๊ด๋ จ ์์ธ ์ค๋ช
return min(max(similarity_score, 0), 1)
๐ ๊ณ์ฐ๋ ์ ์ฌ๋ ์ ์๋ฅผ 0~1 ๋ฒ์๋ก ์กฐ์
min(max(score, 0), 1): ์์ ๋ฐฉ์ง & 1 ์ด๊ณผ ๋ฐฉ์ง (๊ฐ ์์ ํ)
์ด๋ ๊ฒ ํ๋ฉด ์ผ๊ด๋ 0~1 ์ค์ผ์ผ๋ก ์ ์๋ฅผ ์ ๊ณตํ ์ ์์!
โ
1) ๋ฌธ์ฅ์ SBERT(BERT ๊ธฐ๋ฐ) ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์ซ์ ๋ฒกํฐ๋ก ๋ณํ
โ
2) ๋ฒกํฐ ๊ฐ ์ ์ฌ๋๋ฅผ ์ฝ์ฌ์ธ ์ ์ฌ๋๋ก ์ธก์ (0~1 ๋ฒ์)
โ
3) ์ ๊ทํํ์ฌ ์ต์ข
์ ์ ๋ฐํ
๐ GPT์ ๋ฌ๋ฆฌ BERT๋ "์ ํํ ์๋ฏธ ๋น๊ต"์ ๊ฐํจ!
GPT๋ "์์ฑ" (ํ
์คํธ๋ฅผ ๋ง๋ค๊ธฐ) ์ ํนํ
BERT๋ "์ดํด" (ํ
์คํธ ๊ฐ ์๋ฏธ ๋น๊ต) ์ ํนํ
โ
๊ทธ๋์ ์ด ์ฝ๋์์๋ "์ ๋ขฐํ ์ ์๋ ๋ฌธ์๋ฅผ ๊ฒ์ํ๋ ๋ฐ" BERT๋ฅผ ํ์ฉ!
โ
์ต์ข
์ ์ผ๋ก GPT ๋ชจ๋ธ๊ณผ ๊ฒฐํฉํ์ฌ ๋์ฑ ์ ๊ตํ ๋ต๋ณ์ ์์ฑ