단어 Embedding 방식 관련 질문드립니다


#1

network.py에서 Embedding을 진행을 하는데 이 Embedding 방식이 COBW 방식인가요? Skip-gram 방식인가요…? 아시는 분 계신가요??


#2

:whale: 안녕하세요 ㅎㅎ
저도 대회 처음 시작할 때 찾아봤던 내용이었는데, 도움이 될까하여 글을 남기게되었습니다 :dog2:

:whale: Keras Embedding 에 대한 Referce 논문에서도 자세하게 나와 있지 않았던 것으로 기억합니다.
그래서 Keras 코드를 보며 살짝 이해하고 넘어갔습니다 ㅎㅎ

:whale: 제 기억으로는

  1. Embedding.build 메소드에서 (단어 수)x(embd_size) 형태의 matrix 가 초기화됩니다. matrix 를 구성하는 하나의 row(벡터) 는 하나의 단어에 매칭(대응, 할당)이 되겠죠 :slight_smile:

  2. matrix 는 어떤 주어진 initializer 로 초기화(Embedding.build 메소드 참고)되며, 학습 가능한 형태입니다. 네트워크가 학습이 될때, matrix 를 구성하는 값도 학습이 됨.

  3. 이 말은 어떤 단어(정수)에 매칭/대응/할당된 벡터의 요소(element)들이 네트워크의 Loss 를 줄이도록 변한다(학습된다)는 것을 의미 합니다.

  4. 요약하면, 정수가 주어졌을 때 하나의 벡터를 출력하는 테이블(사전)이 구성된다고 할 수 있을 것 같습니다. 해당 테이블(사전)을 구성하는 값(요소)들은 정의된 initializer 로 초기화 되며, 네트워크 학습 시 학습이 진행됩니다.

:whale: 도움이 되셨음하네요 :dog2:
혹시 틀린 부분이 있다면 지적 부탁드립니다 :dog2::dog2::dog2:


#3

저도 뇌피셜을 쓰자면 word를 embedding하는건 같지만 셋팅이 다른것 같습니다.
기본적으로 skip-gram, cbow의 방식의 word2vec은 unsupervised입니다. 단순히 문장만 존재하는거지요 지금처럼 레이블이 있는게 아니구요.

예를 들어 문장내의 단어간의 관계를 이용하여 “고양이는 사람을 좋아한다” 라는 문장이 있다고하면

X: (고양이 , 좋아한다) -> Y: 사람을 - cbow 혹은
X: (사람을) ->Y: 고양이, (사람을) -> 좋아한다 - skip-gram 방식으로 내부적으로 pair를 만들어 학습을 합니다.

하지만, 지금 classification에서는 문장에 대한 레이블이 존재하고 모델이 예측한 레이블과 실제레이블간의 crossentropy로 부터 loss가 만들어지고 백프롭 과정에서 결국 이 로스를 줄이기 위한 방향으로 embedding matrix의 weight가 변하여 word vector가 만들어질겁니다.

그러므로, 현재 코드에서 쓰느 embedding은 skip-gram, cbow와는 관계가 없어보입니다.

아닐수도 있어요 ㅋㅋ