작성
·
213
1
안녕하세요,
'Simple Chatbot 만들기' 관련하여 진행하다가 문의드립니다.
새롭게 최신 학습용 zip 파일을 다운받아서, 콜랩에서 해당 실습 파일 올리고,
바로 전체 셀 실행 테스트 해도,
질문에 대한 답변이, 계속 같은 답변으로만 나오고 있는 증상입니다.
sentencepiece 같은 모듈 설치시, 시간이 지나, 버전 차이로 인한 문제일까요?
이상입니다.
답변 1
0
좋은 질문 감사합니다.
저도 같은 현상이 나오네요. 아마도 뭔지 몰라도 version 차이로 제가 교재를 만들 때와 다르게 결과가 나오는 것 같습니다. 그러나 이 교재의 목적은 language model 이 어떤 원리로 작동하는지를 보여주는 것이고 key point는 chatbot 은 생각이 없고 단순히 가장 큰 확률의 단어를 나열하는 것 뿐이라는 것을 이해하는 것이고 이 원리가 Chat-GPT 같은 첨단 모델에도 그대로 적용되기 때문에 초거대 언어 모델의 "환각 현상"이 발생하는 것 입니다.
이 문제는 Greedy Decoding을 사용했기 때문에 이런 현상이 발생합니다. Greedy Decoding에서는 각 시점에서 가장 확률이 높은 단어를 선택하므로 매번 동일한 출력을 얻게 됩니다.
더 다양한 답변을 얻기 위해 Stochastic Sampling 또는 Beam Search와 같은 기법을 사용할 수 있습니다. 아래 코드는 Stochastic Sampling을 사용해 수정한 것 입니다.
Stochastic Sampling에서는 출력 확률 분포에서 단어를 샘플링하여 다양한 답변을 생성합니다. 이 방법은 각 단계에서 동일한 확률 분포를 가진 다른 단어를 선택할 수 있으므로 다양한 답변을 얻을 수 있습니다.
수정 내용을 github 에 반영하였습니다. 감사합니다.
def decode_sequence(input_seq, temperature=1.0):
# 입력된 질문을 encoder 에 입력하여 state vector 생성
states_value = encoder_model.predict(input_seq)
# size 1 짜리 빈 target sequence 생성
target_seq = np.zeros((1, 1))
# target sequence 의 첫번째 character 를 <s> 로 assign -> 1
target_seq[0, 0] = 1
eos = 2 #</s>
# 답변 생성 시작
output_ids = []
for in range(maxlen_A):
output_tokens, h, c = decoder_model.predict([target_seq] + states_value)
# 확률 분포에 따라 단어 샘플링
output_probs = output_tokens[0, 0, :]
idx = np.random.choice(len(output_probs), p=output_probs)
if eos == idx: # End sentence of EOS
break
if idx > 0: # idx 0 은 zero padding 이므로 skip
output_ids.append(int(idx))
# 생성된 word 를 decoder 의 다음 input 으로 사용
target_seq[0, 0] = idx
# Update states
states_value = [h, c]
return output_ids
감사합니다.