====================================
학습내용
GPT-1

GPT-1 의 경우, 우리가 배웠던 transformer를 12개, 24개 이상 layer로 쌓고 원래 학습하던 Text의 시작과 끝에 특별한 토큰 start end를 붙여 이 문장이 긍정인지 부정인지, 혹은 사실과 가정 모순여부를 중간에 Delim과 끝에 end를 붙여 모순여부 파악을 하는 방식으로 했다. 이를 위해 최종 output에는 우리가 기존에 하던 단어가 입력되었을 때 그 다음 단어를 예측하는 모델에 classifier도 추가해서 내놓는 식으로 개조를 해서 사용한다.

그런데 모델을 더 개조해서 사용하고 싶다고 가정하자. 예를들면 이미 Text 끝에 Extract를 붙여 긍정, 부정을 나누는걸 학습한 모델에 긍정, 부정이 아니라 정치, 경제, 문화 등의 카테고리로 나누는 모델로 바꾸고 싶다면? 그럼 Transformer 모델에서 나온 결과를 Linear로 넣어서 하는게 아니라 넣기 전 나온 결과물에 우리가 원하는 layer를 붙여 학습한다. 이런걸 fine-tuning 이라고 함.
이렇게 하는게 장점이 뭐냐면, 다음 단어를 예측하는 모델은 따로 label이 필요없다. 그래서 여기저기서 막 가져다가 학습하면 되기 때문에 학습데이터 양이 어마어마하다. 하지만 주제 카테고리 별로 나눈것은 학습데이터가 별로 없다. 그렇기 때문에 미리 학습한 pretrained-model 에 기존에 있던 학습 목적 결과용 마지막 layer를 떼어내고 내가 원하는 걸로 붙인 뒤 learning rate를 작게 하여 원래 학습한 pretrained-model엔 약간의 변화만 주고, 내가 원하는 목적으로 학습시켜 만들 수 있다. 그래서 초기에 weight를 random initialization 해서 오래 학습이 걸리는 걸 보완가능.
이렇게 학습하면 적은데이터로 학습하는 것보다 훨씬 더 좋은 성능이 나오더라.
BERT
Masked Language Model 을 만든 동기: 실제에선 모르는 단어가 나오거나 정보가 유실되도 앞 뒤 문맥을 보고 파악할 수 있다. 이런걸 구현하고 싶은듯.

그래서 중간중간에 k개의 비율만큼 단어를 [MASK] 로 치완해서 학습한다. 이 비율이 너무 많으면 예측 못하고 적으면 비효율적인 학습이 된다.

그래서 경험상 15%로 하면 적당히 잘 되는것 같아 그걸로 쓰는 듯.
그런데 문제가 있다. BERT는 이렇게 Masked language model로 pretrained 한 모델을 쓰지만 실제 사용해서 예측할 땐 이 pretrained model이 masked language라 문장 중간에 [MASKED]가 있는 걸로만 훈련해서 결과가 잘 안나오는 것. 그래서 [MASKED] 를 하긴 하지만 그 중에서 80% 만 진짜 [MASKED] 씌우고, 10%는 걍 랜덤한 단어, 10% 는 진짜 단어로 남겨둔다.

또 Next Sentence Prediction 사전학습 모델도 함께 훈련하는 듯. 얘는 말 그대로 A 문장 뒤에 나오는 B 문장이 서로 관계가 있는 이어지는 문장인지 확인하는 거다. [CLS]로 연속된 문장이 나온다는 걸 알려주고(MASKED 도 학습하느라 중간에 채워진게 보임) [SEP]을 통해 그 다음 문장을 알려준다. 그렇게 두 문장이 관계가 있는지 없는지 label을 통해 보고 학습한다. 이렇게 하는 이유가 실제로 만 개의 문장을 가지고 훈련한다고 하면 그대로 다 때려박아서 학습할 순 없으니까 저렇게 중간중간에 연속된 훈련 문장 시작을 알리는 토큰을 넣어주는 듯.

L은 self-attention block 쌓은 갯수. A는 각 layer 별로 정의되는 attention head의 숫자. H는 encoding vector의 차원수.
word를 좀더 잘게 쪼개서 넣는 wordpiece embedding. 이걸 해야 out-of-vocabulary(OOV) 가 나오는걸 줄이는 듯. 그럼 Byte Pair Encoding 같은건가? 또 fransformer의 position embedding 같은거. 문장 시작과 연속을 알리는거. 또 문장이 끝나고 다음 문장의 시작점도 새로운 문장이니 그에 따른 order embedding인 Segment embedding.

GPT와 BERT 차이점은 입력때 다음단어를 예측하면 안되니 역방향 입력 안되게 transformer의 decoder에서 사용하는 masked self attention 을 사용하게 된다. 근데 BERT는 그렇지 않고 다 넣음. 주로 MASKED 로 치환된 톼큰들을 주로 예측하게 되고 그래서 MASKED 단어를 포함하여 주어진 모든 단어에 접근이 가능하게 하도록 함으로써 attention pattern은 모두가 모두를 볼 수 있도록 하는, 즉 transformer의 encoder에서 사용하는 self attention을 사용하게 된다.
둘 다 비슷한건 transformer를 거쳐서 마지막에 나오는 encoder output vector들이 있을 텐데 얘는 원래 목적에 맞게 설계되잇던 layer 를 통과시켜 원하는 output이 나오게 만들었을 거다. 이 layer를 자르고 새로 원하는 목적에 맞는 layer를 넣고 random initialization을 한다. learning rate를 줄여 이미 일반화 학습된 transformer는 영향을 줄이고 우리가 목적에 맞게 새로 만든 layer만 변화하도록. 즉 일반화된 학습은 유지하도록.

즉 BERT는 이렇게 masked model 과 next sentence model 로 pretraining 한 모델을 fine-tuning 하여 원하는 모델을 만듬.

BERT 와 GPT-1의 차이점. 언어에서 batch size가 많을수록 효율적이고 성능도 잘 나오는데 이는 gradient algorithm에서 얼마나 많은 문장을 가지고 학습에 고려할지를 판단하니까 당연히 더 많은 문장을 가지고 학습해서 성능이 잘 나오는듯.
이 BERT fine-tuning을 통해 좋은 성능을 얻은 모델 중 예시로 Machine Reading Compreghension (MRC) Question Answering를 보자. 기계 독해 기반 질의응답.

이렇게 주어 여러개, 목적어도 여러개가 나오는데 질문에 따라 정확한 답을 내놓는다.
이런 목적으로 만든 데이터셋 SQuAD 1.0, 2.0 ... 이 있고 BERT와 결합한 모델들이 좋은 성과를 내고 있다.
(10강) Advanced Self-supervised Pre-training Models
GPT-2

왜 만들었는가? 모든 문장은 질문과 대답으로 변형할 수 있어서 만들어 본 것 같다.
그래서 평범한 질문대답이나 레딧같은데서 질문하면 대답한 것 중에 반응이 제일 좋았던 것을 가져오는 등 별의별 방식을 다 취해서 어쨋든 가져왔다.

기존과 다른 특징은 weights layer가 위로 올라갈수록, output에 가까워 질수록 가중치를 작게해서 영향을 덜 주게 함. 아마 일반적인 보편화된 지식에 대한 학습만 크게 남겨놓고 구체적인 질문 등의 영향은 덜 받게 하려고 그런 것 같다. 물론 layer수도 많이 늘려서 파라미터 수도 늘렸다.
또 질답 뿐 아니라 세줄요약 같은것도 가지고 왔다. 모든 내용을 기록한 문장을 첫번째 문장으로 두고, 다음 두번째로 이어지는 sequence 문장엔 글 밑에 써있는 세줄요약을 가지고와서 학습하는 방식. 비록 어마무시한 학습량으로 fine-tuning 한 BERT보단 점수가 덜 나왔지만, 바닥부터 학습해서 이정도면 잘 나온거라고 만족한 것 같다. 또 책 같은데서 가끔 인용구로 외국어 나올 때가 있는데 이런것들도 외국어 학습을 하는 등 정말 영혼까지 끌어모아 데이터 학습을 한다.
GPT-3
GPT-2 에 비해 거의 100배 넘는 파라미터 수를 줘서 조금만 힌트를 줘도 얘가 잘 알아먹어서 답을 내놓는다. 그래서 모델이 커지면 커질수록 성능이 좋아진다는 것을 발견했다.
ALBERT (A Lite BERT)
너무 무거워서 가볍게. 가볍게 하면서도
Is having better NLP models as easy as having larger models?
• Obstacles
• Memory Limitation
• Training Speed
• Solutions
• Factorized Embedding Parameterization
• Cross-layer Parameter Sharing
• (For Performance) Sentence Order Prediction

초기 embedding 차원이랑 이 값이 encoder를 통과해도 차원이 같은 벡터가 나온다. 그러나 초기 벡터보다 layer를 어느정도 거친 벡터가 상대적으로 더 많은 정보량을 가지게 된다. 래서 초기 embedding 벡터는 상대적으로 덜 중요한 정보니까 정보를 조금 잃어버리거나 뭉개지더라도 행렬 곱셈으로 행렬을 나눠서 파라미터 수를 줄일 수 있지 않을까? 하는 발상으로 진행하는 것 같다. 실제로 곱셈으로 나누면 파라미터 수가 줄어든다.


파라미터 공유 방법. 원래 각 layer마다 query, keys, values 각각 모두 weight가 달라야 한다. 근데 그걸 파라미터 수 줄여볼려고 공유해보는 것 같다. feed-forward 에서만 공유해보고 attention layer에서만 공유 해보고 그냥 다 해보고 하면서 만들어 봤는데 줄어든 파라미터 수에 비해 성능이 그다지 떨어지지 않는다.

그리고 다음 문장 순서 예측. 사실 이게 별로 실용적이지 않더라. 왜냐하면 A 다음에 오는 B문장이 올바른 순서의 경우 맞다고 하는데 순서가 다른 문장은 그냥 랜덤하게 두 개 문장 불러오고 학습했다. 그랬더니 서로 단어가 얼마나 겹치는지 그런것만 가지고 문장 관계를 판단하니 그다지 의미있게 해석하지 못하는것 같다. 그래서 원래 정방향 문장을 맞다고 하고 순서를 뒤집어 거꾸로 되었다고 판단하는 것도 교육시켜서 좀 더 의미있게 만든다. 그래서 성능 향상이 있었다.

GAN(generative adversarial network) 에 착안한 ELECTRA 모델. Generator인 기존 BERT에서 MASKED 토큰을 채우고 Discriminator 에서 검사한다. Discriminator가 pre-trained model 에서 fine-tuning 해서 만듬. 여기에 더 신경을 쓰는 듯. 성능도 같은 파라미터 및 정보량으로 학습 대비 다른 모델에 비해 성능이 뛰어나다.

이번엔 경량화 시킨 다른 모델들을 보자.. DistillBERT는 한명의 Teacher와 여러명의 Student를 둔다. Teacher가 예측한 걸 ground truth 라고 생각하고 student 들에게 학습하는 거다.
TinyBERT는 더 나아가서 중간의 hidden state들 까지 비슷하도록 학습을 함. 근데 Student는 teacher에 비해 경량화된 모델이니까 hidden state의 차원이 다를 수 있음. 그래서 Teacher 에서 Student로 갈때 fully-connected layer로 차원을 줄여줘서 갈 수 있다.

현재 연구되는 모델은 배경지식에 기반한 언어해석 연구가 있다. Knowledge Graph가 배경지식인듯.
예를들어 "사람이 꽃을 심기 위해 땅을 팠다" 와 "집을 짓기 위해 땅을 팠다" 라고 하면 사람이 이 문장을 보면 꽃을 심으려면 작게만 파면 되니까 모종삽 같은 걸 사용했겠구나 생각하고 집을 지을려고 팠다면 포크레인 같은걸로 팠겠구나 생각할 거다. 하지만 컴퓨터는 이런 삽이나 포크레인 같은 배경지식이 없어서 이런 부분에 취약하다. 그래서 제안된 모델이 저거다.
실습
(실습_9강)_HuggingFace's_Transformers_1
https://colab.research.google.com/drive/1A1FVDbdFDmDjrVHgnkFt2GTE1tKpw1Oz?usp=sharing
(실습_10강)_HuggingFace's_Transformers_2
https://colab.research.google.com/drive/1YOFPCLeDq_fsJ_YH_xHHqq4MXGFAuJMD?usp=sharing
==================================
과제 / 퀴즈
외부 라이브러리 command line을 사용해 실행해보고 kaggle에 제출해보기.
https://github.com/monologg/KoELECTRA/tree/master/finetune%22
====================================
피어세션
batch norm은 단어별로 layer norm은 embedding에 있는 각 단어 위치대로.
order index 할 때 depth는 단어를 embedding 했을 때의 차원.
맥시카나 순살 (불닭소스, 까르보나라)
========================================
마스터세션
arxivisanity
REALM
챗봇에선 MEENA
UniLM
...
한국자연어처리 패키지 pororo
부족한 배경지식은 계속 인지하고 있다가 시간이 될 때 중요한 일들을 다 끝냈을 때 현재 상황 시간에 따라 우선순위 커리큘럼 생각하고 하는게 낫다.
석사는 2년밖에 안되니까 언제든지.. 그리고 바로 쓰일 수 있는 기술들로 많이 연결되서 회사에서 수요가 있다. 그래서 회사에서도 배려해주는 경우가 있다.
transformer가 성능이 좋아서 추천시스템 등에도 활용이 되더라.
취준 얼마 안남았는데 뭘 해야 하나? AI product 같은 실생활에 사용하는 모델 만드는데 많은 시간이 들어서 힘드니까 공모전 같은데서 성과내는게 좋을 것 같다.
새로 만드는게 좋은거인듯. 그냥 기존에 있던 걸 하면 그냥 돌려만 본건지 제대로 이해한건지 판단이 안서니까.
핫한건 챗봇이나 ... 다양하게 있음. kaggle이나 공모전에 흥미가 가는거 해보는게. 잘 모르겠다.
엔지니어도 논문 마스터 하고 이해, 구현, insight도 해야 되나? 경쟁력 때매 고민하는듯. 최신기술 따라갈 수 있는 정도는 되야 하는듯. 어제 화제가 되더라 하면 대충 빠르게 이해하고 흡수할 수 있는게 좋다. 어려우니까 연습 등이 필요한 듯. 논문 500편중 사람나눠서 2~3시간 abstract 읽고 한줄요약하고 grading 해서 흥미있는거 더 자세히 읽고.. 이런게 도움이 되더라.
대학원 진학? 바로 취업? 개인마다 다른듯. 회사가 석사를 선호하인 하지만 근데 AI쪽은 실제로 까보면 수학쪽에 벽이 생기거나 함. 이런 앱개발쪽과 다른 배경지식에 기반해서 프로그래밍이 이루어지는 부분이 있기 때문에 이런 부분에서 막히게 되고 stackoverflow에서 답변 봐도 이해못하는 어려움이 있을 수 있다. 이런부분도 잘 고려해서 석사가 아니더라도 따로 공부할 수 있는 생각을 해야 함.
거꾸로 현업에 있다 대학원 가면 이미 사회생활 하고와서 잘못될 변수가 좋다.
취업. 기초에 충실하는게 좋지않을까 싶음. 그러니까 코딩테스트나 'MNIST 학습하는 모델을 몇시간안에 만드시오' 같은거?
AutoML 같은게 나와서 비전공자도 많아져서 개발자의 역량이 줄어드는 것 같다. 어떤 역량을 키워야 좋을까? 근데 AutoML같은 쉽게 하는게 만족할 만큼 성능이 있는지는 의문이 들긴 한다. 이런곳에서 알게모르게 크고 작은 노하우가 나올 것 같고. 중요한 역량 경험이라고 될 수 있는 듯.
모델을 어디까지 이해해야 하나? 여기서 부스트코스 공부하는거. 솔직히 제대로 하는게 필요하긴 하다. 실제 경쟁력은 일주일씩만 얻어서 공부할 수 있는 지식을 가지고 있는 사람은 굉장히 많다. 깊이가 필요하지 않을까.. 완전히 다 이해못해서 답답한 부분이 있다는 견해라면 .. 메타인지라는 개념이 있는데 내가 뭘 할고 뭘 모르는지를 아는게 메타인지. 나도 모르는 경우가 있는데 동작 원리 이해를 못하는 모델이 있을 때이거는 모르지만 이 모델의 역할, 입력이 뭐고 목적이 뭐고 출력이 뭐가 나오는 것이고 언제 필요할때 가져다 쓰는거구나 까지는 이해하고 넘어감. 그래서 나중에 필요할 때 떠올려서 쓸 수 있는 정도는 된다. 이 정도의 insight는 가지고 있어야 하지 않을까. 일단 메타인지를 잘 파악하는게 중요하지 않을까.
학사 석사 대우 차이? 막 사회가 부조리로 똘똘뭉치고 그런건 아니고.. 평가등이 쉬운일도 아니다. 남들에 대해 얼마나 알아야 하는지 인지하는 시간이 필요하다보니 생기는 현상이지. 연봉? 석사 2년 투자한 거에 비해 더 많이 받고 그럴지.. 는 잘 모르겠음. 뭐 지금당장이 아니더라도 나중에 생각 가능한 옵션이라 그때 생각해도 좋을 듯.
c, c++, java등 다른 언어에서도 구현하는 능력? embeded나 같은 쪽에서 중요하게 쓰일 것 같음. 따로 언어 배우고 싶으면 그냥 그 언어쪽 커리큘럼 공부 따로 가지고 배우는게 좋을 듯. 시간될 때 꾸준히 하는게 좋을 듯.
도메인 상관없이 transformer가 잘 되는 이유? 그냥 잘 되니까? 그냥 RNN이나 CNN 같은 기존 모델에 비해서 receptive field 나 long dependency가 장점이 됨. CNN에서도 conv 하며 줄여가며 그정도만 보는 제한적으로 볼 수 밖에 없고 RNN도 마찬가지였고. 아마 한번에 접근하는게 잘되는 듯. 교수님 의견은 self-attention 기반 모델은 주변을 얼마만큼 가져올지의 가중치 자체도 예측하는게 유연하게 되는것이 근본적인 차이인 것 같다.
현업에서는 크롤링, 백엔드, 프론트엔드? 크롤링은 중요한 것 같고. 백엔드나 프론트엔드는 공부하면 좋겠지만 선택과 집중.. 중소기업 가면 모델 핵심만 있으면 안되고 내가 안되면 새로 뽑거나 해야 되니까. 분업이 잘 되는 곳에 있으면 AI만 해도 되지만 아니라면 프론트/백엔드 하는것도 역량이 되지 않을까 싶음.
더 궁금한거 있으면 (주재걸 교수님) 이메일이나 김태희 조교를 통해..
=================================
후기
졸려
'과거의 것들 > AI Tech boostcamp' 카테고리의 다른 글
AITech 학습정리-[Day 22] 페이지랭크 & 전파 모델 (0) | 2021.11.27 |
---|---|
AITech 학습정리-[DAY 21] 그래프 이론 기초 & 그래프 패턴 (0) | 2021.11.27 |
AITech 학습정리-[DAY 19] Transformer, 실습-Multi-head Attention, Masked Multi-head Attention (0) | 2021.11.27 |
AITech 학습정리-[DAY 18] seq2seq with attention, Beam search and BLEU score (0) | 2021.11.27 |
AITech 학습정리-[DAY 17] basic of RNNs, LSTM, GRU (0) | 2021.11.27 |