ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 04_multilingual-ner.ipynb
    transformer 2024. 7. 26. 14:22

    출처 

    https://product.kyobobook.co.kr/detail/S000200330771

     

    출처: RoBERTa 논문

    아래그림) RoBERTa(모델) 가 BERT(모델)보다 성능이 향상됨. 데이터를 10배정도 늘렸고, Pretraining 방식을 바꿈

    아래그림) NER Task(모델아님 task) 각 단어가 사람인지 지역인지 분류하는 task  ->출처 https://arxiv.org/pdf/1907.11692

       

     

    아래그림) NER Task 각 단어가 사람인지 지역인지 분류하는 task

     

    아래그림)  4개의 언어의 dataset임 , 독일어의 비중이 가장많고 다른언어 비율이 나타남.  shuffle로 원래 있는 data를 섞어서 random하게 갖고온다는뜻

     

    아래그림) 우리가 갖고오고 싶은 언어의 비율,

                    아래는 원래 각언어의 train, validation, test 의 단어갯수 ex) 20000개, 이거를 비율대로 갖고옴 0.629*20000

     

     

    (아래그림)  # 현재 dataset에는 라벨이(원래는 문자) 숫자로 담아놓은것 , ner_tags(라벨): [0, 0, 0, 0, 5, 6, 0, 0, 5, 5, 6, 0]

     

    아래그림) #원래 data label을 int2str 함수로 변환

     

    class label

     

    아래그림 ) tags를 출력하면 classlabel 객체(인스탄스)로 나옴

    classlabel의 인스탄스가 tags

     

    아래그림) ClassLabel class 는 class안의 함수인 method로 int2str, str2int갖음. in2str는 int-> strg으로변환하는 매소드

     

    아래그림) # 독일어에만 적용. #panx_des는 독일어에서 map함수로 create_tag_names함수를 모든데이터에 적용

     

    아래그림) #원래 data label을 int2str 함수로 변환 #원래 ner_tags가 int라서 정확히보기위해 ner_tags_str 로 만듬

     

    아래그림) panx_de 변수는  ner_tags_str 원소를 담음

     

    (아래그림) 

    # 다른데서 쓰는 tokenizer 가져옴, bert는 영어만취급, xlml_tokenizer는 다국어

     

    (아래그림)  # 공백도 하나의 문자로 취급해서 띄어쓰기가 있든 없든 tokenizer가가능

     

    (아래그림)

    원래 BERT 모델 파인튜닝하기 - encoder에서 BERT를 통과시켜서 Dense layer를 통과후 원하는 차원으로 변환

    (예, 0, 1, 2 -> 기쁨,슬픔, 화남 (3가지 tag)

     

     

    (아래그림) 위 BERT 모델 적용한 것 

    (하나의 텍스트에 대한 텍스트 분류 유형(Single Text Classification)

     

    (아래그림) 바디와 헤드 를 통한 fine tuning

    바디 - pretrain된 모델 갖고와서

    헤드 - 추가적 학습

     

     

    아래그림)  body를 encoder일종, forward함수는 body+head를 통과시키는것, decoder는 없음

     

    아래그림)

    body를 선언후 forward함수에서 body를 통과시킴

     

    아래그림) 헤드 통과후 return 함

     

    (아래그림) config object 객체안에 여러가지 정보를 담아서 편리하게 갖다쓴다.

     

     

    (아래그림)  # 원래 XLMRobertaForTokenClassification # 이 XLMRobertaForTokenClassification 모델안에(바디랑 헤드결합됨) input_ids를 forward처럼 지나감

     

    아래그림) 

    # 리스트 안에 ,로 구분되있어서 한문장안에 공백구분으로 부름
    # tokenized_input 변수에 token화된 결과를 대입하면 인덱스 숫자로 나옴
    #convert to toeken 해서 다시 문자로 봄

     

     

    아래그림) 

    #  word_ids() 메소드(함수) 는 원래단어의 인덱스를 알려준다 참고로 object는 인스턴스(객체)
    # ▁Dan zi ger가 원래 한단어였는데 token이 분리되서 뒤쪽부분은 IGN(ignore)로 무시한다.

     

    아래그림)

    #  train data의 0번째 data,  k,v 는 input_ids: [0 ,  .. -> 이런식으로 표현하기위한것

     

     

    정답: 0 0 0 0 0 / 0 1 0 1 1
    예측: 0 0 0 0 0 / 1 1 0 1 0

    accuracy: 8/10
    precision: 모델이 true라고 한 것 중에 옳은 비율 2/3
    recall: 실제 true인 것 중에 모델이 찾아낸 비율 2/3
    f1: precision, recall의 조화평균

         2
    ------------
    역수+역수

     

     

    아래그림

    정답: 0 0 0 0 0 / 0 1 0 1 1
    예측: 0 0 0 0 0 / 1 1 0 1 0

    accuracy: 8/10
    precision: 모델이 true라고 한 것 중에 옳은 비율 2/3
    recall: 실제 true인 것 중에 모델이 찾아낸 비율 2/3
    f1: precision, recall의 조화평균

         2
    ------------
    역수+역수

    ========================
    정답: "345"
    예측: "2345"
    accuracy: 0
    precision: 0
    recall:0
    f1 : 0

    support 는 B-MISC", "I-MISC", "I-MISC"가 1덩어리라서 1

    avg는 해당값의 평균

     

    아래그림)

    #input_ids 는 한문장 []리스트 안이 데이터 한개, 문장이 하나에서 여러개까지 있을수 있음

     

    아래그림)

    태스크 : 감성분류 (부정0, 긍정1)일때

    데이터: 자연어 문장   이고,
    모델 학습: 데이터가 많이 필요

    ----------------
    입력   라벨(정답)    -> 라벨은 정답이고, 라벨을 붙여서 하는게 supervised learning, 라벨없는게 unsupervised learning
    문장1 긍정
    문장2 부정
    문장3 긍정
    문장4 부정
    ...
    ...
    ...

    모델(입력) => 예측값 <> 정답(라벨) -> loss 값을 줄여나가려함


     

     

    Data collator

    Data collator that will dynamically pad the inputs received, as well as the labels.

    라벨을 data만큼 구성

    https://huggingface.co/docs/transformers/main_classes/data_collator

     

    Data Collator

    Data collator used for language modeling that masks entire words. This collator relies on details of the implementation of subword tokenization by BertTokenizer, specifically that subword tokens are prefixed with ##. For tokenizers that do not adhere to th

    huggingface.co

     

    아래그림)

    batch는 data를 묶어놓은것
    한데이터씩 처리하려면
    시간걸려서

    1epoch는 data전체

    예) batch size 4 이면 
    1batch안에 data4개 들어감
    그래서
    전체 data가 100개면 
    4개씩 묶어놓으면
    batch가 25개

    25개 batch를 한바퀴 학습해서돌면 1epoch
    두바퀴 돌면 2 epoch

     

    data collector 는 아래그림에서 data에 padding 붙이는것(파란색부분)

     

    아래그림)

     

    training loss ,validation loss 둘다 모델 통과한 값인데 validation은 따로 

    training data, test data, validation data - label은 셋다에 있는 정답

    training

    validation

     

    training data, validation data, test data 비교

     

    training data로 training- model forward - prediction<>label -> loss - model back propagation - model parameter update->학습
    validation data- model forward - prediction<>label -> loss, metric(ex, f1, acc, ...)    
              (validation은 training으로 너무 정답을 외워버리면 안되서 별도로 f1, loss나 성능(metric) 등을 측정하기위한 data)
    model select
    =======
    test => model forward - prediction <> label -> metric(ex. f1, acc, BLEU), loss, ...

    아래그림)

    파란부분이 정답률 , 실제 맞춘값

     

    train_on_subset

    제로샷
    바디 pretrained(bert - Masked Langauge Model,
     gpt - causal language modeling-앞에단어보고 뒤에단어맞추기) 된 모델 갖고온것
    ->이런 pretrained 작업은 라벨이 없어도 가능 - 자연어 문장만 있으면 가능
    웹에서 엄청많은 단어를 import해서 pretrained 하면 자연어 이해하는 능력이 됨

    task(down stream task): sentiment classification 감성분류(기쁨,슬픔 분류), NER(각단어가 위치인지, 조직인지, 사람인지 분류),
           번역, QA, ....같은 task

    위에서 자연어 이해하는 능력생긴후 위에 감성분류등의 task를 잘하는지 test함

    fine tuning - pretrained 후 downstream task 대해서 추가적인 학습 
    head - body끝에 head를 살짝 붙이고 fine tuning
            - head정의 : decoder라고 볼수도 있지만 굳이 나눠서부르지는 않음


    Finetuning - Test 결과값
    독일어 - 독일어 0.866 - 기존 독일어 data로 fine tuning 한 결과값
    독일어 - 프랑스어 0.702 (zero shot transfer)- 기존 프랑스어 학습이 없는상태에서 독일어학습
    (독일어안하고)프랑스어(250개 data대해서만)에 대해서만 finetuning -프랑스어 0.26 
    -> 결과: 프랑스어 finetuning안하고 이미 있는 독일어를 finetuning하고 프랑스어에 대해서 test한게 성능이 더좋음.

     

    (아래그림) 

    프랑스어(500, 1000, 2000, 4000개 로 데이터 늘려서 했을때는 아래그림처럼

    어느시점부터 프랑스어 데이터 test 결과값이 커진다.

     


    독일어로 (body+head)+ fine-tuning(모델을 추가적으로 학습시키는것)
    cf. downstream task에 학습시킴(내가원하는 작업에 대해서 학습시킴) - fine-tuning

    초기모델부터 학습
    바디 pretrained 된 모델 갖고온것
    헤드 초기화된 상태
    => 

    아래그림 ) language family를 갖고왔을때는

    세로열(독일어만 학습시키거나 각언어만 학습시키거나(둘째줄), all (모든 언어 data갖고옴))에서

    모든 언어 data를 학습시킨것이 각각의 언어에 대해서 따로 finetuning 했을때 보다 높은 결과값을 갖게됨.

    'transformer' 카테고리의 다른 글

    06_summarization.ipynb  (0) 2024.08.07
    05_text-generation.ipynb  (0) 2024.07.31
    03_transformer 파해치기 https://nlpinkorean.github.io/illustrated-transformer/  (0) 2024.07.12
    F1 score  (0) 2024.07.12
    02. classification  (0) 2024.07.06
Designed by Tistory.