ratsgo / embedding

한국어 임베딩 (Sentence Embeddings Using Korean Corpora)
https://ratsgo.github.io/embedding
MIT License
455 stars 130 forks source link

단어 유추 평가 관련 질문 #132

Closed taeheejeon22 closed 2 years ago

taeheejeon22 commented 3 years ago

안녕하세요. 좋은 책 써 주셔서 감사드립니다. 단어 유추 평가와 관련해 질문이 있습니다.

정오표를 보면 p.32의 설명이 '단어1 - 단어2 + 단어3'으로 '단어4'를 유추하는 것으로 설명되어 있습니다. p.155(3쇄는 p.157)에 대해서도, 이 부분에서는 '갑을병정'이라고 표현하기는 하였으나, 동일한 방식으로 '단어1 - 단어2 + 단어3'으로 '단어4'를 유추하는 것으로 설명이 되어 있습니다. 그런데 이 식이 조금 이상하게 생각되어 질문을 드립니다.

p.156(1, 2쇄)의 코드 4-37 코드는 https://github.com/ratsgo/embedding/blob/master/models/word_eval.py 코드와 관련됩니다. 그중 유추하는 식은 get_analogy_vector라는 함수에 정의되어 있습니다. 여기서는 책의 설명과 마찬가지로 '단어1 - 단어2 + 단어3'로 유추하고 있습니다.

그런데 해당 코드의 원본이라고 할 수 있는 (word_eval.py 142행에 주석으로 적어 두신) https://github.com/dongjun-Lee/kor2vec/blob/master/test/analogy_test.py 를 보면 식이 달라 보입니다. 거기서는 similar_pos = pos_vectors.most_similar(positive=[poss[1], poss[2]], negative=[poss[0]]) 과 같이 유추를 하고 있습니다. 즉 (인덱스가 0부터 시작하므로) '단어2 + 단어3 - 단어1'의 식으로 단어4(코드에서는 poss[3]) 유추를 하고 있는 셈이어서 우리 교재와 방식이 다른 것 같습니다.

식이 다른 만큼 결과가 다르게 나올 텐데, 제가 보기에는 교재 p.33의 그림 1-3을 가지고 생각해 보면, 후자(dongjun-Lee) 방식이 맞는 것이 아닌가 하는 생각이 듭니다. 그림 1-3에서 단어1(아들)과 단어2(딸)의 관계(단어1과 단어2 벡터의 차)가 단어3(소년)과 단어4(소녀)의 관계(단어3 단어4 벡터의 차)가 동일하게 임베딩된 것이 가장 이상적인 임베딩 결과라고 생각됩니다. 비례식으로 쓰면 다음과 같을 것입니다.

단어1(아들): 단어2(딸) = 단어3(소년) : 단어4(소녀)

교재에서 이용하는 벡터의 합과 차의 방식으로 나타내면 다음과 같을 것입니다.

Vec1 - Vec2 = Vec3 - Vec4

이를 최종적으로 유추해야 하는 단어4를 기준으로 다시 쓰면 다음과 같을 것입니다.

Vec1 - Vec2 - Vec3 = -Vec4 -Vec1 + Vec2 + Vec3 = Vec4

이렇게 보면 교재처럼 단어2(딸)의 벡터가 아니라, dongjun-Lee처럼 단어1(아들)의 벡터를 빼고 나머지 것들은 더하는 것이 맞는 것이 아닌가 하는 생각이 들었습니다.

설명이 다소 장황해진 것 같습니다. 살펴보시고 답변 주시면 감사하겠습니다.

ratsgo commented 2 years ago

@taeheejeon22 님 안녕하세요. 답이 너무 늦었습니다. 여러모로 생각해봤는데요, 말씀하신 내용이 맞을 것 같습니다. get_analogy_vector 해당 부분을 수정하겠습니다. 이건 자세히 안보면 잡아내기 어려울 것 같은데요. 진심으로 감사드립니다.

ratsgo commented 2 years ago

다만 책 본문 33페이지(3쇄 기준)에 있는 표와 설명은 정오표에 반영하면 되레 혼란스러울 것 같아, 일단 이대로 두고요. 이후 전면 혹은 부분 개정시 종이책에 반영하도록 하겠습니다. 다시 한번 감사드립니다.