23.02.06-과제4, LDA

류소리·2023년 2월 10일
0

4차 과제

목록 보기
5/6

출처 : https://coredottoday.github.io/2018/09/17/%EB%AA%A8%EB%8D%B8-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0-%ED%8A%9C%EB%8B%9D/ -> LDA

모델 학습 시작

우리는 이제 LDA model를 학습시켜봅시다. 모형 자체에 대한 설명은 잠시 미루어두고, 우선 학습 파라미터를 먼저 봅시다.

  • topic : 당신이 가설로 잡은 토픽의 갯수는?
  • chunksize : 얼마나 많은 문서가 훈련 알고리즘에 사용되는가?
    • 만약에 빠른 학습이 중요하시다면, 청크사이즈를 키워서 돌려봅시다!
    • Hoffman의 논문에 의하면 Chunksize는 모델 품질에 영향을 미치지만 차이그 그렇게 크진 않다고 합니다!
  • passes : 패스는 모델 학습시 전체 코퍼스에서 모델을 학습시키는 빈도를 제어한다고 합니다.
    • epochs 와 같은 용어 같다!
    • model를 학습시키는 횟수를 말하는것 같아요! model sampling?
  • iteration : 각각 문서에 대해서 루프를 얼마나 돌리는지를 제어한다고 합니다.
  • pass & iteration 은 최대한 많은게 좋다!
  • eval_every = 1 in LdaModel
  • alpha, eta = auto, 디리클레 분포의 감마함수에 대한 파라미터입니다!

저희는 오늘 이 파라미터중 topic 의 갯수, 그리고 passes 를 변화시켜보면서 더 좋은 모델을 설계해 보려고 합니다.

Measure? 평가기준은 어떻게 잡아야하나요?

바로 Perplexity, Topic Coherence입니다.

Perplexity

perpelxity는 사전적으로는 혼란도 라고 쓰인다고 합니다. 즉 특정 확률 모델이 실제도 관측되는 값을 어마나 잘 예측하는지를 뜻합니다. Perlexity값이 작으면 토픽모델이 문서를 잘 반영된다고 알 수 있습니다. 따라서 작아지는것이 중요합니다.

의미 의미확률 모델이 결과를 얼마나 정확하게 예측하는지.낮을수록 정확하게 예측.
토픽 모델링 기법이 얼마나 빠르게 수렴하는지 확인할 때,
확률 모델이 다른 모델에 비해 얼마나 개선되었는지 평가할 때,
동일 모델 내 파라미터에 따른 성능 평가할 때 주로 사용
한계 Perplexity가 낮다고 해서, 결과가 해석 용이하다는 의미가 아님

Coherence

이와달리 coherence는 주제의 일관성을 측정합니다. 해당 토픽모델이, 모델링이 잘 되었을수록 한 주제 안에는 의미론적으로 유사한 단어가 많이 모여있게 마련입니다. 따라서 상위 단어 간의 유사도를 계산하면 실제로 해당 주제가 의미론적으로 일치하는 단어들끼리 모여있는지 알 수 있습니다.

토픽이 얼마나 의미론적으로 일관성 있는지.
높을수록 의미론적 일관성 높음
해당 모델이 얼마나 실제로 의미있는 결과를 내는지 확인하기 위해 사용
평가를 진행하기 위해 다른 외부 데이터(코퍼스, 시소러스 등)가 필요

주의사항!

어떻게 문서들 집합간의 일관성을 정량화 할 것인가? 문서 집합의 Coherence 가 높아지면 monotonic 해지는 문제점이 생긴다. 하지만 다른 사실을 추가한다면 단조로움이 보다 감소되는 경향이 있다. 이 것은 마치 Bias-Variance tradeoff 처럼, 만약 특정 coherence가 너무 높아지면 정보의 양이 줄어들게 되고, coherence가 너무 낮아 정보들이 인관성이 없다면, 분석의 의미가 낲아지게 됩니다.

# 파라미터를 튜닝해볼까!

num_topics = 10
chunksize = 2000
passes = 20
iterations = 400
eval_every = None

%time model = LdaModel(corpus = corpus, id2word = id2word, chunksize = chunksize,\
alpha ="auto", eta="auto",\
iterations = iterations, num_topics = num_topics,\
passes = passes, eval_every = eval_every)

최적 topic의 갯수는?

coherencesT=[]
perplexitiesT=[]
passes=[]
warnings.filterwarnings('ignore')

for i in range(10):
    if i==0:
        ntopics = 2
    else:
        ntopics = 20*i
    nwords = 100
    tic = time.time()
    lda4 = models.ldamodel.LdaModel(corpus, id2word=dictionary, num_topics=ntopics, iterations=400, passes=30)
    print('ntopics',ntopics,time.time() - tic)

    cm = CoherenceModel(model=lda4, corpus=corpus, coherence='u_mass')
    coherence = cm.get_coherence()
    print("Cpherence",coherence)
    coherencesT.append(coherence)
    print('Perplexity: ', lda4.log_perplexity(corpus),'\n\n')
    perplexitiesT.append(lda4.log_perplexity(corpus))
profile
새싹 빅테이터 개발자

0개의 댓글