Today I Learned(23/08/22)

karpathy·2023년 8월 23일

TIL

목록 보기
1/10

Summary

오늘은 주로 찐코딩님의 NLP 관련 2,3강을 듣는데 많은 시간으로 썼던 것 같다.
아직 강의 초반이다보니까, numpy, terminal, 파이썬 기본 문법 같은 것들 익숙해지는 시간들이 많았고, 추가적으로는 ML 대학원 주제 발표 중간중간 보는 시간도 가졌다.좀 더 개념들 정리하느라 어제 배운건데, 오늘 업로드하게 되었음.

Learn

  1. 허깅페이스 통해서 실제 데이터셋 가져오는 것
  2. tokenizer, 임베딩 방식 실습
  3. streamlit 활용
  4. 그 외의 텍스트 데이터에 대한 전처리 작업들

Details

데이터 전처리
자연어 처리는 딥러닝이 오기 전부터 연구가 되었던 분야였음.
그 당시에는 텍스트에 대한 Feature Extraction이 주요했지만 최근에는 딥러닝이 학습할 하나라고 생각하고 다 학습시켜버리는 추세여서, 이 부분에서 해결하려는 문제의 중요성이 낮아졌고 이를 처리 안하고 바로 딥러닝을 돌리는 경우도 있다.

그럼에도 불구하고 우선 자연어 데이터 전처리를 정리해보자면, 텍스트에서 의미 있는 요소를 뽑아내기 위한 작업들의 일환이라고 보면 편하다.

  1. Tokenizer : 의미있는 최소한의 단위로 단어들을 쪼개는 작업

    • 이전까지는 단어 단위, 콤마 단위, 공백 단위 등으로 쪼갰지만, 이제 딥러닝 활용해서 처리하는 작업들이 많아짐.
    • 서브워드 토크나이저 : BPE, Wordpiece, SentencePiece 등이 있음. 핵심은 세상의 모든 단어를 학습시킬 수 없기 때문에 사전 밖의 단어(Out of vocabulary)를 기계가 인지할 수 있도록 해결하는 방법
      1 ) Byte Pair Encoding : 각 단어들을 1개의 단어로 쪼갠 후에, 연속적으로 가장 많이 등장한 글자의 쌍을 찾아서 많이 생기면 이를 합치는 과정을 반복하는 작업
      2 ) SentencePiece : 현재는 실무적으로 가장 많이 이용하는 방법인데 사전 토큰화가 필요없다는 장점이 있음.
  2. Cleaning : 너무 많은 토큰들을 다 비교하게 되면, 학습시켜야할 데이터가 너무 많기 때문에 이를 제외하는 작업

    • Lemmatization : 단어의 기본형을 뽑아내는 작업(flies -> fly)
    • Stemming : 단어에서 접두사 접미사를 제거하고 어간만 살리는 작업(flies -> fli)

Embedding
Word2Vec

  • 의의 : word를 딥러닝이 활용할 수 있게, 벡터형태로 임베딩하는 시도를 했는데, 이전까지는 단어라는 것을 일종의 atomic한 존재로 생각했지만 "단어끼리 하나의 문장에서 같이 나올수록 서로 유사한 의미를 가질 것이다"와 같이 단어간의 유기적인 관계로 생각하고 접근했다는 것이 의미가 있다.(sparse representation -> distributed representation)
  • 특징
    • 논문을 보다보면 트레이닝 데이터를 어떻게 확보하는게 획기적인 경우도 있는 것 같다. CBOW와 skipgram을 통해서 하나의 문장에서 여러개의 데이터를 뽑아내는게 신기하다.
    • 두번째는 결국은 어떻게 해결하려는 문제를 어떻게 딥러닝이 학습할 수 있도록 벡터화하냐도 중요한 것 같음.

기타
1. 허깅페이스 데이터셋 활용법

  • 허깅페이스란? 사전학습된 모델을 쉽게 download하고 train할 수 있는 api와 도구를 제공한다. 오픈소스화된 데이터셋도 제공하고 있어서 쉽게 접근할 수 있다.
  • 이용법
    1) 우선 데이터셋을 설치하는 과정이 필요하다.
pip install datasets #터미널에서 할때
!pip install datasets # 주피터 노트북에서 실행할 때

2) 설치가 완료되면 자신이 활용하고 싶은 데이터셋을 찾는다.

from datasets import load_dataset
ScienceQA = load_dataset("derek-thomas/ScienceQA", split = "test")

{dataset_name}은 허깅페이스 데이터셋 상세페이지에 보면, 데이터셋 이름이 있다. 혹은 아래 빨간색 표시된 곳을 누르면 데이터셋 이름이 복사된다.

추가로, load_dataset에는 split이라는 인자를 줄 수 있는데 데이터셋은 주로 train, validation, test으로 나눌 수 있기 때문에 이에 대해서 지정해서 가져올 수 있다.

3) 데이터셋이 잘 들어왔는지 확인하고, 주로 데이터셋 접근은 feature 레벨로 접근가능하다.

print(ScienceQA[100]) #100번째열의 데이터를 가져오는 것
print(ScienceQA) #데이터셋 정보를 가져오는 것 
print([ScienceQA[columns][:5] for columns in ["question", "answer"]])

3번째 코드는 2개 이상의 키의 값을 가져오기 위한 용도이다.

참고 사이트
1. 자연어 처리 입문 : https://wikidocs.net/21693
2. 센텐스피스 설명 : https://velog.io/@gibonki77/SentencePiece

profile
Lean, Learn, Lesson

0개의 댓글