PRJ1_5 About BERT

영영·2023년 5월 25일
post-thumbnail

BERT로 챗봇 만들기는 있는 모델을 그냥 갖다써서 너무 날로 먹은 느낌이라,, BERT 모델에 대해 공부해서 프로젝트 결과물에 끼워넣어야할 것 같다. 내가 직접 코드를 수정할 수 있으면 더 좋고..!

내가 사용한 모델은 'ddobokki/klue-roberta-base-nli-sts-ko-en'이고, 한국어와 영어의 nli, sts데이터를 klue/roberta-base에 학습시킨 모델이라고 한다. 감사합니다..👍😍

wikidocs요약

(링크에 첨부된 도표들을 같이 보면 도움이 된다.)

개요

사전 훈련된 워드 임베딩

BERT는 사전 훈련된 언어 모델을 가져다쓰는 방식.

Word2Vec 같은 임베딩 알고리즘으로 사전에 학습된 임베딩 벡터들을 가져와서 사용한다. 데이터가 적을 경우, 사전 훈련된 임베딩을 사용하면 성능 향상 기대 효과가 있음.


사전 훈련된 언어 모델

2015년 구글 논문 : LSTM 학습후 추가 학습하는 방법 소개
이전 단어로 다음 단어를 예측하도록 학습 (학습 전 별도 레이블 지정이 필요x)
그 다음 텍스트 분류와 같은 문제를 추가 학습시킴.

ElMo : 순방향과 역방향 언어 모델을 각각 따로 학습 후, 임베딩 값 얻기.
이런 방식의 임베딩은 문맥에 따라 임베딩 벡터값이 달라지므로 다의어 구분이 가능.

트렌스포머(Tm) : 번역기처럼 인코더-디코더 구조에서 LSTM 뛰어넘음.

Open AI : 트랜스포머 디코더로 12개 층 쌓은 후 학습시킨 GPT-1 만듬.

but, 기존 언어 모델로는 양방향 구조 도입 불가.


마스크드 언어 모델

마스크드 언어 모델은 입력 텍스트의 단어 집합의 15%를 랜덤으로 마스킹함. 그리고 인공 신경망이 마스킹 된 단어를 예측하도록함.

BERT

트랜스포머를 이용해 레이블이 없는 텍스트 데이터로 사전 훈련된 언어 모델.
사전 훈련 모델 + 파인 튜닝(파라미터 재조정을 위한 추가 훈련 과정)
BERT-BASE / BERT-Large 버전이 있음.(Large가 성능이 뛰어난듯, 아래 설명은 BASE 기준)

d_model=768로 정의해서, 모든 단어들이 768차원 임베딩 벡터가 되어서 입력값으로 사용됨. BERT 내부 연산 거친 후 768차원 벡터로 출력. 이 출력 임베딩은 문장의 문백을 모두 참고하여 문맥 정보를 가진 임베딩 벡터가 됨.(문장의 모든 단어를 참고함-12개 층에서 전부 이루어지는 연산 -> 각 층마다 '셀프 어텐션' 수행)

BERT는 단어보다 더 작은 단위로 쪼개는 서브워드 토크나이저(WordPiece) 사용.

<BERT 토큰화 방식>
준비물 : 이미 훈련 데이터로부터 만들어진 단어 집합

1. 토큰이 단어 집합에 존재한다.
=> 해당 토큰을 분리하지 않는다.

2. 토큰이 단어 집합에 존재하지 않는다.
=> 해당 토큰을 서브워드로 분리한다.
=> 해당 토큰의 첫번째 서브워드를 제외한 나머지 서브워드들은 앞에 "##"를 붙인 것을 토큰으로 한다.

transformers 패키지 사용해 BERT 토크나이저 사용 가능

import pandas as pd
from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained("bert-base-uncased") 
# Bert-base의 토크나이저

BERT의 단어 집합을 vocabulary.txt에 저장

# 저장
with open('vocabulary.txt', 'w') as f:
  for token in tokenizer.vocab.keys():
    f.write(token + '\n')

# 열기
df = pd.read_fwf('vocabulary.txt', header=None)

BERT에서 사용되는 특별 토큰과 해당 정수

[PAD] - 0
[UNK] - 100
[CLS] - 101
[SEP] - 102
[MASK] - 103

포지션 임베딩
BERT에서 단어 위치 정보 표시하는 방법.
위치 정보를 위한 임베딩 층을 하나 더 사용한다.(BERT 입력마다 포지션 임베딩 벡터를 더해줌)

첫번째 단어의 임베딩 벡터 + 0번 포지션 임베딩 벡터
두번째 단어의 임베딩 벡터 + 1번 포지션 임베딩 벡터
세번째 단어의 임베딩 벡터 + 2번 포지션 임베딩 벡터
네번째 단어의 임베딩 벡터 + 3번 포지션 임베딩 벡터

BERT의 사전훈련방법 2가지 : 마스크드 언어 모델 & 다음 문장 예측

1) 마스크드 언어 모델
위에서 설명함. 랜덤 마스킹 후 예측하도록 하는 방식. BERT는 약간 다른 방식으로 학습시킴.

2) 다음 문장 예측
실제 이어지는 두 문장 / 랜덤으로 이어붙인 두 문장으로 훈련.
--> QA(quastion answering)나 NLI(natural language inference) 같이 두 문장의 관계를 이해해야하는 문제도 풀 수 있도록.


세그먼트 임베딩

두 문장 테스크를 위해 BERT가 사용하는 또 다른 임베딩 층. sentence0, sentence1 총 2개의 임베딩 벡터 사용.

결론적으로 BERT는 총 3개의 임베딩 층 사용.
워드 임베딩 + 포지션 임베딩 + 세그먼트 임베딩
(단어, 위치 정보, 문장 --> 맥락 파악 가능)


파인 튜닝

우리가 풀고자 하는 테스크의 데이터를 추가 학습시켜 테스트하는 단계.
실질적으로 테스크에 BERT 사용하는 단계.

1) 하나의 텍스트에 대한 텍스트 분류 유형 (Single Text Classification)
예시: 영화 리뷰 감성 분류, 뉴스 분류
[CLS]토큰 위치의 출력층에 층을 추가하여 분류 예측을 하게됨.

2) 하나의 텍스트에 대한 태깅 작업 (Tagging)
기존 RNN 계열 신경망들을 이용해 풀던 작업.
예시: 품사 태깅, 개체명 인식

3) 텍스트의 쌍에 대한 분류 or 회귀 문제 (Text Pair Classification or Regression)
예시: 자연어 추론(다른 문장과 어떤 관계에 있는지 분류)

4) 질의 응답 (QA)
질문과 본문 텍스트 쌍 입력. 본문의 일부분 추출해 질문에 답하는 작업.문제 맞추기 같음.


그 외 정보

훈련 데이터는 위키피디아(25억 단어)와 BooksCorpus(8억 단어) ≈ 33억 단어
WordPiece 토크나이저로 토큰화를 수행 후 15% 비율에 대해서 마스크드 언어 모델 학습
두 문장 Sentence A와 B의 합한 길이. 즉, 최대 입력의 길이는 512로 제한
100만 step 훈련 ≈ (총 합 33억 단어 코퍼스에 대해 40 에포크 학습)
옵티마이저 : 아담(Adam)
학습률(learning rate) : 
가중치 감소(Weight Decay) : L2 정규화로 0.01 적용
드롭 아웃 : 모든 레이어에 대해서 0.1 적용
활성화 함수 : relu 함수가 아닌 gelu 함수
배치 크기(Batch size) : 256


어텐션 마스크

실제 BERT 실습 시에 추가 입력이 필요한 시퀀스. 실제 단어와 패딩 토큰을 구분할 수 있도록 알려줌.

0개의 댓글