나의 작은 valley

[Information Retrieval] 신경망 정보 추출 본문

Computer Science/[인공지능]

[Information Retrieval] 신경망 정보 추출

붕옥 아이젠 2024. 6. 23. 20:33
728x90

Vector Similarity

임베딩

: 단어나 문장을 고차원 벡터(산술 연산이 가능해짐)로 표현하는 행위. -> 단어 간의 유사도를 측정할 수 있게 된다. 이때 의미적으로 관련이 있을 때 1의 근접한 값을 가진다. 의미적으로 관련이 있음의 예시로는 여왕과 왕이 있다. 둘은 반의어지만 높은 vector simiartiy score를 가진다.

 

관련 모델

초기) word2vec : 동시에 등장하는 단어들을 벡터 공간에서 가깝게 위치하도록 학습.

 

이후) context(맥락) 에 대한 고려 

1. ELMo (컨텍스트를 고려한 최초의 임베딩 생성 방식 - LSTM 기반)

2. OpenAi Transformer 

3. Bert

 

Query-document matching Algorithm

Bi-Encoder

; 질의와 문서가 입력으로 들어오면 인코딩하기 위한 각각의 모델을 fine-tuning하는 구조이다. 그 단계에서는 질의와 문서 토큰 간의 직접적인 연결은 없다. 오직 최종 score만으로 각 모델이 업데이트 된다. 즉 논리적으로는 각각의 두 모델로 이루워진 encoder이다.

 

Trade Off)

빠른 속도 : 문서 임베딩을 미리 계산할 수 있기 떄문에 검색 요청이 들어올 때 질의에 대한 임베딩을 계산하고 similarty 계산을 통해 빠르게 점수화가 가능하다.

 

낮은 성능 : Cross-encoder 보다 성능이 낮다. 그러나 학습을 잘 시킬 경우 대체로 높은 성능이 나오게 할 수 있다. 즉 현실적으로 bt-encoder가 압도적으로 자주 사용된다.

모델 소개

1. Dense Passage Retrieval (DPS)

- Dense Passage Retrieval 

  i) Query-documents pair를 입력함(이떄 pair는 tripe 구조 {query, doc +, doc -}

  ii) 입력의 cls 토큰을 임베딩으로 가지고 와서 임베딩간의 유사도 계산

  iii) postive pair(query와 doc +)간의 score는 높아지도록, negative pair(query와 doc -) 간의 score는 낮아지도록 모델을 학습.

 

 

임베딩 실습

1) 임베딩 생성을 위한 샘플 테스트 문장을 준비한다. 이때 짧은 문장 리스트, 긴 문장 리스트 두 개를 준비하는데 각 리스트의 동일 인덱스는 유사한 의미를 가지고 있다. 즉 vector simlarity 점수가 높을 것으로 예상된다.

# 임베딩 테스트를 위한 예시 문장
short_sentences = [
    "겨울에는 따뜻한 옷을 입는다.",
    "추운날은 두꺼운 외투가 필요하다.",
    "인공지능은 기술 발전의 부산물이다.",
    "AI는 인류에게 유용한 기술이다.",
    "AI는 인류에게 위험한 기술이다.",
]

long_sentences = [
    "겨울이 되면 눈이 내려서 거리가 하얗게 변하고 사람들은 따뜻한 옷을 입는다.",
    "하얀 눈이 내리면서 도시가 은빛 세상으로 변하고, 사람들은 두꺼운 외투를 입는다.",
    "인공지능은 과학 기술의 진보, 데이터 처리 능력의 향상, 그리고 복잡한 문제 해결을 위한 새로운 접근 방식의 필요성이 결합된 결과이다.",
    "인공지능은 단순히 기술의 발전을 넘어서 인류의 삶을 개선하고, 더 나은 미래를 구축하는 데 필수적인 역할을 하고 있다.",
    "인공지능은 인류에게 잠재적인 위험 요소를 내포하는 기술로, 그 사용과 발전에 있어 신중한 접근이 필요하다.",
]

all_sentences = short_sentences + long_sentences

 

2-BERT 모델)

# Sentence Transformer를 통해 모델을 로드하고 문장들을 벡터로 인코딩합니다
from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer('snunlp/KR-SBERT-V40K-klueNLI-augSTS')
sb_vectors = model.encode(all_sentences)

# 문장 벡터들 간의 코사인 유사도를 계산합니다
sb_short_similarities = util.cos_sim(sb_vectors[:6], sb_vectors[:6])
sb_long_similarities = util.cos_sim(sb_vectors[6:], sb_vectors[6:])
sb_similarities = util.cos_sim(sb_vectors, sb_vectors)

문장이 총 12개인데 0번 인덱스가 A라는 내용의 짧은 버전 6번 인덱스가 A라는 내용의 긴 버전이 된다.

-> 0번 인덱스와 6번 인덱스의 유사도를 보면 0.74라는 상당히 높은 점수를 맞은 것을 볼 수 있다. 또한 인공지능은 위험한 기술이다, 와 인공지능은 유익한 기술이다라는 두 문장은 의미적으로는 상반되나 유사도 점수가 높은 것을 확인할 수 있다.

 

3-openAi)

# OpenAI API로 임베딩을 생성합니다
openai_vectors = texts_to_tensor(all_sentences)

# 문장 벡터들 간의 코사인 유사도를 계산합니다
openai_similarities = util.cos_sim(openai_vectors, openai_vectors)

# 유사도 행렬의 히트맵을 시각화합니다
plt.figure(figsize=(10, 8))
sns.heatmap(openai_similarities, annot=True, cmap='coolwarm')
plt.title("OpenAI Sentence Embedding Similarity Heatmap")
plt.xlabel("Sentence Index")
plt.ylabel("Sentence Index")
plt.show()

-> Bert 모델에 비해 전반적인 유사도 점수들의 score가 올랐음을 확인할 수 있다. 이게 openai가 더 좋은 모델이라기 보다는 점수가 후하다고 보는 편이 맞을 것 같다. 

728x90
Comments