ABOUT ME

비전공자 코린이의 코딩 정복기

Today
Yesterday
Total
  • [0419 복습] 딥러닝_언어 모델 활용_transformer (GPT, BERT)
    KT 에이블스쿨 복습 2024. 4. 20. 10:11

     

    **셀프 복습용으로 작성한 것이라 실수가 있을 수 있습니다!

    혹시 실수를 발견하시면 댓글로 알려주시면 감사드리겠습니다 :)

     

    딥러닝 심화2

    CH1. ChatGPT API로 연결하기

    API

    • 클라이언트 프로그램에게 요청을 받아 서버를 전달, 서버를 요청 처리한 후 결과 데이터를 API에 전달

     

    • API를 사용하기 위해서 API 뒷부분(Backend)을 잘 몰라도 Request와 Response만 알면 사용 가능
    • Request: API 주소 + API Key, Request 형식: 요청 양식
    • Response: Response 형식: 결과 양식

    사용하기

    !pip install openai
    
    import pandas as pd
    import numpy as np
    
    import openai
    from openai import OpenAI
    
    api_key = '고유한 키 값'
    
    # 채팅을 위한 함수 생성
    def ask_chatgpt1(question):
    
        client = OpenAI(api_key = api_key)
    
        response = client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "You are a helpful assistant."},
                {"role": "user", "content": question},
            ]
        )
    
        return response.choices[0].message.content
        
    question = "질문?"
    response = ask_chatgpt1(question)
    print(response)

     

    CH2. PandasAI로 데이터 탐색 및 분석하기

    PandasAI란

    • 생성 AI를 사용해 데이터 전처리 및 탐색 및 분석 가능
    • 특징
      • 자연어 쿼리: 자연어로 데이터에 질의
      • 데이터 시각화: 그래프와 차트를 생성해 데이터를 시각화
      • 데이터 정리: 누락된 값을 해결해 데이터 세트를 정리
      • 특징 생성: 특징 생성을 통해 데이터 품질을 향상
      • 데이터 커넥터: CSV, XLSX, PostgreSQL, MySQL, GigQuery, Databrick, Snowflake 등과 같은 다양한 데이터 소스 지원

    사용하기

    !pip install pandasai
    
    import pandas as pd
    import numpy as np
    from pandasai import SmartDataframe
    from pandasai.llm import OpenAI
    
    api_key = '고유한 키 값'
    
    # 데이터 프레임 만들기
    sales_by_country = pd.DataFrame({
        "country": ["United States", "United Kingdom", "France", "Germany", "Italy", "Spain", "Canada", "Australia", "Japan", "China"],
        "sales": [5000, 3200, 2900, 4100, 2300, 2100, 2500, 2600, 4500, 7000]
    })
    sales_by_country
    
    # 거대모델 불러오기
    llm = OpenAI(api_token=api_key)
    
    # 스마트 데이터프레임으로 변환
    df = SmartDataframe(sales_by_country, config={"llm": llm})
    
    # 질문
    query = '질문?'
    df.chat(query)

     

     

    여러 데이터 프레임을 묶어서 분석하기

    • SmartDatalake 생성 → pd.merge와 같은 기능 (데이터 프레임 만들 때 칼럼 이름 같게 만들어야 함!
    # 데이터 프레임 만들기까지는 똑같음
    llm = OpenAI(api_token=api_key)
    sdl = SmartDatalake([df1, df2], config={"llm": llm})   # merge
    sdl.chat("질문?")

     

     

     

    CH3. 언어모델 이해

    NLP (Natural Language Processing)

    • NLP: 인간 언어와 관련된 모든 것을 이해하는 데 초점을 맞춘 언어학 및 기계 학습 분야
    • NLP의 작업 목표: 단일 단어를 개별적으로 이해하는 것뿐만 아니라 해당 단어의 맥락을 이해하는 것
    • 일반적인 NLP 작업
      • 문장 분류: 리뷰이ㅡ 감정 파악, 이메일 스팸 여부 감지 등
      • 개체 명(사람, 위치, 조직 등) 인식
      • 문장 생성
      • 질문에 대한 답변 (ex.GPT)
      • 텍스트 번역, 요약

    Transformer

    • 기존의 NLP: RNN 기반
      → 오랫동안 언어모델을 위한 주요한 접근 방식
    • 단점: 병렬 처리 어려움, 장기 의존성 문제, 확장성 제한
    • Transformer 등장
      • RNN 모델의 단점을 극복
      • 언어 모델의 Game Changer → 덕분에 LLM이 발전하게 됨
    • Transformer의 특징
      • 이전 문장들을 잘 기억 (Attention, Attention score)
      • 문맥상 집중해야 할 단어를 잘 캐치 (문장이나 단어 사이의 관계를 파악하는 데 탁월함)

    Transformer 사용하기

    • pipeline 함수
      • transformer 기반 LLM 모델을 손쉽게 사용할 수 있게 해주는 함수
      • 복잡한 언어 모델 처리(NLP) 과정을 감추고, 다음 과정이 물 흐르듯 흘러가게 해줌!
      • 사용자 입력(text)을 받아 → Text를 모델이 이해 가능한 형태로 전처리 →  모델에 전달, 예측
        → 측 결과를 사람이 이해 가능한 형태로 후처리 &  return
    •  pipeline으로 사용 가능한 언어 관련 task
      • sentiment-analysis: 주어진 문장에 대해 긍정, 부정 분류
      • zero-shot-classification: 학습 과정에서 본 적 없는 클래스에 대해 분류
      • summarization: 긴 문장이나 글에 대해 핵심 내용을 짧게 요약하는 기술
      • translation: 다양한 언어로 번역
      • text-generation: 몇 글자를 적어서 입력하면, 이어서 문장을 생성하는 기술
      • feature-extraction
      • fill-mask
      • ner(개체 명 인식)
      • question-answering
    # colab에서는 이미 설치되어 있음
    !pip install transformers
    from transformers import pipeline
    
    classifier = pipeline(task = "sentiment-analysis", model = 'bert-base-multilingual-cased')
    classifier = pipeline("sentiment-analysis")
    
    # 모델 사용
    text = ["I've been waiting for a HuggingFace course my whole life.",
            "I hate this so much!",
            "I have a dream.",
            "She was so happy."]
    
    classifier(text)

     

     

    Hugging Face

    • 허깅 페이스
      • 자연어 처리(NLP) 및 인공지능(AI) 분야에서 가장 인기 있는 오픈 소스 라이브러리와 모델을 제공하는 플랫폼
    • 허깅 페이스의 기여
      • transformer 라이브러리 제공: 사전 훈련된 다양한 Transformer 기반 LLM 모델을 쉽게 사용, 텍스트 분류 질문 답변 등 다양한 NLP 태스크를 수행
      • 모델 허브 제공: 연구자와 개발자가 자신의 모델 공유, 다른 사람들의 모델을 탐색하고 사용할 수 있는 플랫폼 제공, 커뮤니티에 의해 지속적으로 확장

     

    언어 모델링 절차

     

     

    데이터 전처리: Tokenize(토큰화)

    • 토큰화: 문장을 분석하기 위한 최소 단위 데이터(토큰)로 변화시키는 것 → 사람이 결정하는 하이퍼 파라미터
    • 문자 토큰화: 문자 단위
    • 단어 토큰화: 단어 단위
    • 형태소 토큰화: 형태소 단위
    # 모델, 토크나이저 다운
    from transformers import PreTrainedTokenizerFast, BartForConditionalGeneration
    
    tokenizer = PreTrainedTokenizerFast.from_pretrained("ainize/kobart-news")
    model = BartForConditionalGeneration.from_pretrained("ainize/kobart-news")
    
    # 입력 데이터 전처리(토크나이즈)
    input_text = '''
    국내 어쩌구 저쩌구 식으로 입력할 문장을 넣어줘용
    '''
    
    # 토크나이즈(encoding)
    input_ids = tokenizer.encode(input_text, return_tensors="pt")
    
    # 입력 토큰, 모델은 사전이 있어야 함 (사전에서 찾아보기)
    input_ids
    
    # 모델 사용
    # 모델 사용
    summary_text_ids = model.generate(
        input_ids=input_ids,                        # 입력으로 받는 데이터의 토큰
        bos_token_id=model.config.bos_token_id,     # Begin of String 문장이나 문단 등의 시작을 나타내는 특수한 토큰 ID
        eos_token_id=model.config.eos_token_id,     # End of String 문장이나 문단 등의 종료 나타내는 특수한 토큰 ID
        length_penalty=2.0,                         # 생성된 텍스트의 길이에 대한 패널티. 1< 더 긴 문장을 생성하려는 경향, 1 > 더 짧은 문장을 선호
        max_length=50,                              # 생성될 수 있는 최대 텍스트 길이(토큰 수)
        min_length=30,
        num_beams=4                                 # 빔 서치는 텍스트 생성 시 여러 가능성 있는 출력 중 최적의 결과를 찾기 위해 사용되는 기법. 이 클수록 더 많은 가능성을 탐색
    )
    # 출력 토큰을 문장으로 변환(Decoding)
    print(tokenizer.decode(summary_text_ids[0], skip_special_tokens=True)), 결과 후 처리

     

    Embedding(임베딩)

    • 임베딩: 사람이 쓰는 자연어(단어나 문장)를 machine이 이해할 수 있는 숫자의 나열(벡터)로 변환
    • 사람의 언어인 자연어를 처리하게 하려면 자연어를 숫자로 바꿔 입력해줘야 함
    • 단어 임베딩
      • 단어를 고차원 벡터로 매핑하는 기술
      • 문서, 문장 내에서 단어의 의미와 문맥을 담아 냄
      • Word2Vex, FastText 등
    !pip install gensim
    from gensim.models import Word2Vec
    
    # 각 문장 토크나이즈
    token_sent = [tokenizer.convert_ids_to_tokens(tokenizer(text).input_ids) for text in text_data]
    token_sent[0]
    
    # Word2Vec 임베딩 생성
    model = Word2Vec(sentences=token_sent, vector_size=30, window=5, min_count=1, workers=4)
    
    # 토큰 'core'의 벡터 확인
    token = 'components'
    vector = model.wv[token]
    
    print('index :', tokenizer([token]))
    print('embedding vector : \n', vector.round(4))

     

     

    CH4. 언어모델 Fine-tuning

    Fine-tuning

    • Fine-tuning이란
      • 사전 훈련된 모델을 특정 작업이나 데이터셋에 맞게 미세 조정하는 과정

    Fine-tuning 수행 절차

     

     

    예제 시나리오 - ① 사전 학습된 모델

    • DistilBERT 모델선정
      • BERT 모델은 언어 이해, 맥락 파악 good, 그러나 BERT의 복잡성과 크기는 특히 자원이 제한된 환경에서의 사용이 어려움
      • DistillBERT (경량화 모델)
        → BERT의 크기와 복잡성을 줄이면서도 성능의 상당 부분을 유지한 경량화 모델
      • BERT의 파라미터 수 40% 감소 → 학습 및 예측 속도 60% 향상
      • BERT의 97% 성능 유지

     

    예제 시나리오 - ② 데이터 준비

    • 트랜스포머 모델이 요구하는 입력 데이터의 형식
    • input_ids: 토큰화된 입력 시퀀스를 숫자 ID로 변환한 것
    • attention_mask: 모델이 패딩된 부분을 무시하고 실제 유용한 데이터에만 집중할 수 있도록 함
      • 패딩(padding): 토큰의 길이를 맞추기 위해서, 짧은 문장은 0으로 채움
    • tensorflow 모델에 입력하기 위한 dataset으로 변환(.to_tf_dataset)
      • 토큰화 데이터셋을 모델 입력에 필요한 feature와 target(label) 추출
      • 텐서플로우 데이터셋 객체(tf.data.Dataset)로 변환

     

    예제 시나리오 - ③ 모델 수정

    • DistilBERT 모델에 출력 레이어의 노드를 지정
    • TFAutoModelForSequenceClassification
      • TF: 텐서플로우 용
      • AutoModel: 사전 훈련된 모델의 이름이나 경로 제공 → 적절한 모델 아키텍처와 가중치를 자동으로 로드
      • SequenceClassification: 시퀀스 분류, 다중 분류와 유사 (예: 텍스트 분류, 감정 분석 등)
      • 주요 특징
        • 유연성: 다양한 프랜스포머 기반 모델 지원(BERT, RoBERTa, ElECTRA, DistilBERT 등)
        • 용이성: 복잡한 모델 아키텍처에 대한 깊은 이해 없이도 고성능의 자연어 처리 모델을 빠르게 구현하고 실험 가능
          파인 튜닝: 사전 훈련된 모델을 자신의 데이터셋에 맞게 파인 튜닝 가능

     

    예제 시나리오 - 추가 학습

    • 작은 학습률 지정
      • 이미 학습된 파라미터가 있는 상황에서 추가 학습하며 미세 조정하는 것이므로, 일반적으로 학습률은 작게 둠
    • 데이터 크기, epochs
      • 시스템 환경에 맞게, 소요 시간, 성능을 고려하여 조정
    • 예측 및 성능 평가
      • 일반적인 다중 분류 모델 평가와 동일 
Designed by Tistory.