-
Notifications
You must be signed in to change notification settings - Fork 184
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
sent_to_word_contexts_matrix 내 dynamic_weight 관련 문제 #137
Comments
안녕하세요. dynamic_weight=True인 경우 word_context 계산 시 나눗셈이 있어서, sent_to_word_contexts_matrix가 만들어질 때 자동으로 np.double로 캐스팅이 되는 것 같습니다. 일단 사용자분의 코드에서 |
sent_to_word_contexts_matrix 에서 dynamic_weight=False시 contexts_matrix가 long type이 되어 GloVe에 fit 시 에러 발생가능한 부분 수정
fix lovit#137 contexts matrix dtype error
안녕하세요 그런데 제가 코퍼스의 크기에 따라 모델의 정확도가 어떻게 변하는지를 연구중인데, 저는 이게 dynamic_weight의 문제일거라 생각해서 이를 False로 놓고 구현해봤는데, glove-python 구현체의 문제가 없다는 전제 하에서, soynlp를 이용한 co-occrence matrix 구현에 문제가 있는 것 같은데,
|
안녕하세요. @smbslt3 님, 혹시 실험 진행하신 코드를 올려주실 수 있을까요? co-occurrence matrix 구현상의 문제점은 보이지 않습니다. dynamic weight의 경우에도, 단어간 거리에 따른 가중치 차이를 주기 위한 방법의 하나일 뿐, 구현이 잘못된 것이 아닙니다. corpus의 크기가 증가할 때 무조건 성능이 높아지는 것은 아닙니다. 일단 성능 측정을 결국 어떤 task로 하셨는지도 중요할 것 같고, soynlp의 co-occurrence matrix 구하는 코드를 보자면 tokenizer가 그냥 띄어쓰기를 가지고 split하는 것이기 때문에, 전처리 되지 않은 문서를 가지고 계산시 corpus가 커질수록 성능이 떨어질 가능성이 있습니다. 종합적인 판단을 위해서는 전체적인 실험세팅을 보아야 가능할 것 같습니다. |
안녕하세요 코드가 매우 길어 일부를 축약하여 colab 링크로 대체합니다 (데이터의 문제로 실행은 안되실겁니다)
세 개의 노트북에서 대부분의 코드(코퍼스 전처리, 시각화 등)는 공유하고 있습니다. soynlp를 사용해 구현한 경우(dynamic = True/False), 둘 다 코퍼스의 크기가 1N을 초과하면서 성능 증가치가 감소합니다. 저는 이 두 차이가 dynamic weight 때문이라 생각해서, 이를 False로 놓으면 구현체와 상관 없이 glove-python처럼 단조증가 하는 모습을 보일거라 예상했는데, 오히려 구현체에 따라 결과가 다르게 나왔습니다. 이미 tokenizing을 완료한 list를 입력으로 사용했기에, |
안녕하세요. 코드를 확인해보았는데, 실제 데이터가 어떻게 생겼는지 잘 모르겠어서 분석에 어려움이 있습니다. 일단 glove-python에서 제공하는 corpus.fit()도 co-occurrence matrix를 생성해 주는 함수이고, 이의 내부 구현은 dynamic = True와 같습니다. glove Corpus
와 같이 계산하므로 따로 tokenizer 부분이 있고, glove-python는 그냥 corpus 전체를 words로 바꾼 후 한번의 for문을 돌립니다. 이 두 방법의 차이를 논의해보자면, 길이 10이 되지않는 sentence 들이 많을 것이고, 특히 문장 양 끝에 있는 단어는 window에 잡히는 단어가 적을 것입니다. 그에 따른 차이가 성능에 영향을 미쳤을 수 있을 것입니다. 만약 space tokenizer를 사용하지 않고 mecab과 같은 pos tagger를 사용하신다면, 의미를 가지는 명사, 형용사 위주의 단어만을 word dict에 넣어서 쓰시고, windows를 줄이는 것을 추천 드립니다. |
안녕하세요 피드백이 늦었습니다.
위 네 경우를 테스트 한 결과, 2=3=4>1 의 결과가 나옵니다. 추정컨데, window_stop = int_min(i + window_size + 1, wordslen) soynlp의 경우, # left_contexts
for w in range(windows):
j = i - (w + 1)
if j < 0 or not (words[j] in vocab2idx):
continue
word2contexts[word][words[j]] += weight[w]
# right_contexts
for w in range(windows):
j = i + w + 1
if j >= n or not (words[j] in vocab2idx):
continue
word2contexts[word][words[j]] += weight[w] 즉, glove는 테스트 해본 결과, soynlp에서 |
위 코드와 https://lovit.github.io/nlp/representation/2018/09/05/glove/ 게시물을 참고하여 Glove를 학습시키는데,
dynamic_weight를 False로 하는 경우에
glove.fit(x.tocoo()
에서ValueError: Buffer dtype mismatch, expected 'double' but got 'long'
라는 에러가 발생합니다.동일한 데이터/코드 상태에서
dynamic_weight=True
인 경우, glove-python 자체 Corpus()를 통해 학습시키는 경우문제 없이 학습 및 동작합니다.
The text was updated successfully, but these errors were encountered: