본문 바로가기
AI/자연어처리

16. 문장 임베딩 | GPT

by 사라리24 2024. 7. 5.

 

1. GPT(Generative Pre-Training)

 

1. GPT 모델의 특징

  • 사전 학습에는 대규모의 unlabeled data를 사용하는데 unlabeld data에서 단어 수준 이상의 정보를 얻는 것은 매우 힘듦. 또한 어떤 방법이 유용한 텍스트 표현을 배우는데 효과적인지 불문명함 
  • 사전학습 이후에도 어떤 방법이 fine-tuning에 가장 효과적인지 불분명
  • GPT 논문에서는 uneupervised-pre-training과 supervised fine-tuning의 조함을 사용한 접근법을 제안
  • 모델은 이미 효과가 검증된 2017년 공개된 transformer를 사용
  • fine-tuning에서의 미세 조정만으로 다양한 자연어차리 작업에 적용할 수 있는 범위적인 표현을 사전학습에서 학습하는 것 

2. GPT 모델 구조

  • GPT는 Transformer의 변형인 multi-layer Transformer decoder만 사용
  • 입력 문맥 token에 mult-headed self-attenstion을 적용한 후,
    token에 대한 출력 분포를 얻기 위해 position-wise feedforward layer를 적용
  • 모델 구조의 변형이 거의 없음, 모델 구조를 변형하지 않고 linear layer를 마지막에 추가하는 아주 간단한 추가적 작업만 수행하게 됨

3. GPT 모델 학습 

  • unsupervised pre-training
    • 대규모 코퍼스에서 unsupervised learning으로 언어 모델을 학습 
    • transformer 디코더를 사용하여 계속 next token prediction 학습라는 것
    • multi-layer Transformer decoder를 사용하여 입력 문맥 token에 nulti-headed self-attention을 적용한 후, 목표 token에 대한 출력 분포를 얻기 위해 position-wise feedforward layer를 적용
  • supervised fine-tuning
    • 특정 작업에 대한 데이터로 모델을 fine-tuning
    • fine-tuning 단계에서는 사전 학습된 모델을 각 테스크에 맞게 input과 label로 구성된 supervised dataset에 대해 학습
    • 결과를 task에 맞는 loss들을 결합
    • 사전 학습은 nexrt token prediction아라는 language modeling으로 진행되었기 때문에 각 downstream task와 input 문양이 다를 수 밖에 없음 

 

  •  
  •  

 

 

설치


       
        !pip install transformers


 

 

 

◼ import


       
        import torch
        from transformers import pipeline

 
 

 

 

◼ 객체 생성 | 데이터 가져오기

  • 사이트 참고: https://huggingface.co/heegyu/kogpt-j-base
  • pipline( ) :
    허깅페이스의 Transformers 라이브러리에서 제공하는 
    다양한 자연어처리 작업을 간편하게 수행할 수 있도록 도와주는 함수

       
        model_name = "heegyu/kogpt-j-base"
        pipe = pipeline('text-generation', model=model_name)

 


 

 

  출력해보기


      
        print(pipe("안녕하세요", repetition_penalty=1.2, do_sample=True, eos_token_id=1, early_stopping=True, max_new_tokens=128))
        print(pipe("오늘 정부 발표에 따르면, ", repetition_penalty=1.2, do_sample=True, eos_token_id=1, early_stopping=True, max_new_tokens=128))
        print(pipe("싸늘하다. 가슴에 비수가 날아와 꽂힌다. ", repetition_penalty=1.2, do_sample=True, eos_token_id=1, early_stopping=True, max_new_tokens=128, min_length=64))


[{'generated_text': '안녕하세요 저는 오늘 아침에 늦게 들어와서 너무 힘들고 집에 가고 싶지만은\n네.\n피곤할 것 같습니다. 네. 어제 밤에 저 친구가 우리 회사 일 많이 한 거 같아요? 우리 회사에 있는 날이라고 하더라고요.\n무슨 내용이에요? 뭐예요?\n뭐일한 거랑 오늘 일 끝나고 보니까\n그렇죠. 오늘은 내가 그 사석에서 만나는 친구들인데 거기서 만난 친구들은요. 이렇게 뭔가 일을 했으면 됐지 뭘 했다고 다 얘기하잖아요. 뭐 다른 사람이니까 아~ 나는 못 한다 그래도 그렇지 정말 우리가 해야 될 일은 안 하면서 어떻게 자기 얘기를 할까 이 생각이 들잖아요? 그러니까 제가 보기에는 어~ 그런 게 있을 수가 없는 거죠. 그냥 제가 봤을'}]

[{'generated_text': '오늘 정부 발표에 따르면, ict 분야에선 올해 상반기 기술특허출원 건수는 총 6119건으로 1년 전의 331건에 비해 40%나 급증했다. 이는 지난 2013년에 439건의 특허 출원인 1만2801건을 크게 웃도는 결과로 그만큼 ip 기반 스타트업(start up)의 우수성 추세에 탄력이 붙어 있다는 분석이다.. ◇벤처산업은 igs·rxg·인텔리전트 rcs 등 해외 진출 본격화=국내 산업계에서도 글로벌 스타트업의 우위는 이어졌다. 스타트업의 경우 ieo(국제표준시료소자), pp'}]

[{'generated_text': '싸늘하다. 가슴에 비수가 날아와 꽂힌다. \n제5조(기물파손의 금지) ① 불법행위자는 누구든지 제19조 및 조례규정을 위반하거나 법령에 명백히 위배해서라도 불법행위를 하면 제43조에 따라 엄중한 처벌한다. ② 불법행위의 주된 구성요건인 물리적 가위에 대한 결탁에 관여하는 경우, 공무원이 법령 또는 법률에 위반되는 행위를 하는 행위는 공무원에 대하여 위법성을 인식하여 위법성조각사유가 되어도 이를 참작한 행정처분을 취하도록 한다. (1), circumbition of justice: a moral vitropos'}]

 

  • repetition_penalty : 텍스트 생성 과정에서 반복되는 단어 또는 구문의 생성을 억제하기 위한 파라미터
    • 특정단어가 반복될 때 단어의 확률을 감소시키는 방식으로 작동
    • 모델이 동일한 단어를 다시 생성하려고 할 때 로그 확률에 페널티를 부여하여 다른 단어를 선택하도록 유도
    • 1(페널티를 주지 않음)보다 큰 값을 사용, 1.5가 강한 페널티(텍스트 균형이 맞지 않을 수 있음)
    • 특정 단어의 원래 확률이 P라면 반복될 때 확률은 P/1.2 로 줄어듦
    • 예) 오늘 날씨는 좋습니다. 오늘 날씨는 맑습니다.
      => 오늘 날씨는 좋습니다. 하늘은 맑고 기온은 따뜻합니다.

 

  • do_sample : 텍스트 생성 과정에서 샘플링 방법을 설정. True일 경우 모델은 확률 분포에서 토큰을 무작위로 선택함. 텍스트 생성에 다양성과 창의성을 더할 수 있음
    • 샘플링(Sampling)
      • 모델이 예측한 확률분포에서 무작위로 토큰을 선택하는 방식
      • 다양한 결과를 생성할 수 있으며, 예측할 수 없는 창의적인 텍스트를 생성
      • 품질이 일관되지 않을 수 있음. 엉뚱하거나 의미없는 결과를 생성할 가능성이 있음
    • 빔 서치(Beam Search)
      • 여러 경로를 동시에 고려하여 가장 높은 점수를 가진 경로를 선택하는 방식
      • 덜 창의저이고 반복적인 텍스트를 생성할 수 있음. 계산 비용이 높음
    • 샘플링의 세부 설정
      • temperature
        • 확률 분로를 변화시켜 예측된 확률값을 부드럽게 하거나 날카롭게 만듦
        • 높은 값( 예 : 1.5 ) : 확률 분포를 평탄하게 만들어 무작위성이 높아짐
        • 낮은 값( 예 : 0.6 ) : 확률 분포를 날카롭게 만들어 특정단어를 결정론적으로 만듦
      • top-k 샘플링
        • 확률 분포에서 상위 k개의 후보만 고려하는 방법
        • 상위 k개의 후보 토큰만 남기고 나머지는 무시한 후, 해당 사이에서 샘플링
      • top-p 샘플링
        • 누적 확률이 p이상이 되는 후보군을 고려하는 방법
        • 후보토큰을 누적 확률이 p가 되는 지점까지 포함시킨 후, 해당 사이에서 샘플링

 

repetition_penalty : 1.5  / do_sample : False 로 변경


       
        print(pipe("안녕하세요", repetition_penalty=1.5, do_sample=False, eos_token_id=1, early_stopping=True, max_new_tokens=128))

[{'generated_text': '안녕하세요.\n네~ 네. 오늘 첫 번째 소식입니다. 이~ 문재인 대통령이 어제 신년사를 발표했는데요. 어~ 문 대통령은 이제 우리 사회가 직면한 가장 큰 도전은 경제라고 강조했습니다마는 그중에서 특히 소득 불평등 문제를 집중적으로 거론하면서 양극화 해소를 위한 노력을 기울여 나가겠다 라고 밝혔습니다만 과연 어떤 내용이 담길지 주목됩니다. 자 먼저 일 분 뒤에 바로 이어서는 지금 현재 한국 사회에서 벌어지고 있는 여러 가지 사회 문제들을 짚어보겠습니다. 아시다시피 이천십오 년 사 월 십팔 일에 있었던 촛불 집회가 있었습니다만은 당시 박근혜 대통령 탄핵에 대한 국민적 열망이 컸고'}]