[NLP]BERT 이해하기

차보경·2022년 6월 17일
0

Training

목록 보기
2/2
post-thumbnail

-하기 내용들은 BERT 이해하기유튜브 영상을 정리한 내용입니다.

  • BERT(Bidirectional Encoder Representations from Transformers) : 트랜스포머의 양방향 인코더를 사용한다. 문맥을 양방향으로 이해해서 숫자의 형태로 바꿔준다.

  • 구조는 양방향 레프리젠태이션을 학습하게 되는데, 2가지목적을 가지고 프리트레이닝을 수행함.
    1) 마스크드 랭귀지 모델 (각각의 인풋들이 들어왔을때, 랭귀지 모델 자체는 시퀀셜한 모델이기 때문에 이전 정보들을 받아서 다음 정보를 예측하던지, 바이디렉션의 반대방향일 경우엔 엘모-뒤에서부터 정보를 받아서 바로 앞단어를 예측하던지 함 //바트는 순차적으로 랭귀지모델을 사용하는 것이 아니라, 특정 위치에있ㄴㄴ 부분들을 마스킹을 해서 그들을 예측하게 하도록 함. 엘모는 포워드/백워드 따로 학습해서 리프리젠터들을 결합함. 반면에 GPT는 트랜스포머의 디코더부분(앞쪽에서 나오면서 뒤쪽에 해당하는 단어들을 마스킹해서 학습함) 반면, 바트는 포워드/백워드 양방향으로 -> 한번에 다 들어가니 방향성도 없음. 특정한 단어를 리프리젠테이션 학습하기위해 해당단어 앞뒤의 단어를 전부 사용함. 단, 여기에대해 일정 부분 마스킹해서 사용하겠다.
    2) 넥스트 센텐스 프리딕션 : 특정 2쌍의 묹ㅇ이 들어왔을 때 해당하는 문장이 다음 문장이 코퍼스의 컨테스트럭??하게 바로 실질적으로 다음에 등장했던 센텐스인지 아닌지를 알려주는 학습

  • 이렇게 프리트레이닝을 하고 버트 제일 윗단에 하나의 단순한 레이어만을 쌓아서 스쿼드 같은 Q&A(SQuAD),NER,MNLI것들을 버트 위에 레이어 추가함으로 버트가 처음 소개되었던 시점에서의 소타모델을 전부 다 앞지를 수 있는 정도의 우수한 성능을 나타냄. 지금도 기본 모델로 많이 사용됨.

  • 모델 아키텍쳐 (오른쪽이 트랜스포머의 구조) 버트는 인코더 블락만 사용함. 버트 베이스는 레이어의 갯수가 12개, 히든 스테이트 사이즈는 768, 헤드의 수 12개. 토탈 파라미터 : 110M.... 당시 엘모나오고 GPT나왔을 때, GPT하고의 성능을 비슷한 복잡도로 비교하려던 목적이었던거같음.

  • 버트 라지 : L 24, H 히든 노드 1,024, Asms 16개 -> 토탈은 340M 개

  • 버트의 인풋과 아웃풋 관련...! 다양한 down-stream task를 위해 input을 유연하게 구성될 필요가 있다. = 인풋리프리젠테이션 자체가 하나의 싱글 센텐스만들 받을 수도잇고, 페어를 받을 수도 잇음(QNA).여기서 센텐스랑 시퀀스의 정의를 다르게함. 우리가 아는 센텐스는 주어~ 하나의 의미를 갖는 문장인데, 버트의 센텐스 개념은 어떤 연속적인 텍스트의 스팬이라고 봄. 단지 센텐스가 linguistic 센텐스가 아니어도 됨.우리가아는 문장이 아니어도 된다. 라고함. 그래서 문장의 일부분일 수도 있고, 문장보다 더 긴것일 수도 잇음. 연속적인 단어들의 나열이면 센텐스로 보겠다.

  • 시퀀스 :버트에 들어가는 입력에 대한 시퀀스를 으미ㅣ. 싱글센텐스일수도있고 2개의 센텐스가 결합된 구조일수도 잇음. 단, 시퀀스의 센텐스는 우리의 센텐스가 아닌, 일련의 연속적인 단어들의 집합. 언어학적인 문장이 아니어도 된다.

  • 트랜스포머는 2017년에서 인코더-디코더 구조를 가진 것. 기꼐번역에서 우수한 성적. 인코더 양방향, 디코더는 단방향으로 함.
  • GPT1에서 시작. 트랜스포머의 딥코더 구조를 사용해서 만든 자연어처리 모델
    Generative Tranining of Language Model로 학습한 모델이 얼마나 자연어 처리에 우수한지 보여준 모델. 문장을 데이터로 사용, 단어를 하나씩 사용하며 다음단어를 예측하도록 모델이 학습함.
    이런 학습방법은 별도의 labling을 하지않아 비지도 학습으로 들어감. 한문장으로 여러 학습데이터 만들 수 있음(사진). 문장에서 현재 위치의 다음 단어를 예측하는 방법으로 예측하니 사람이 직접 레이블링할 필요가 없다. 현재 위치의 다음 단어르ㅏㄹ 예측하는 방법으로 학습. 따라서 GPT학습에 필요한 것은 엄청난 량의 데이터가 필요함. 물론 질적으로 좋은 데이터를 선별하는 노력도 중요함.

  • 인터넷 상에는 텍스트가 많고 질좋은 데이터를 선별하는 기술도 같이 발전하니 GPT는 ㄴ앞으로도 각광받을 것.

  • bERT느ㅜ ㄴ GPT 발표 후 구글이 발표함.
  • 구글은 버트논문을++ 통해 GPT1의 트랜스포머 디코더를 사용한 자연어 처리는 문장학습에 부족함이 있을 수 있다고 얘기함. 더불어 질의 및 문답은 문맥의외에 능력이 상당히 주용한데 단순히 왼족에서 오른쪽으로 읽는 방법ㅇ은 문맥의외에 약점이 있을 수 잇음.
    -이에 닫ㄴ순히 문맥을 왼쪽에서 오른쪽으로 읽는 디코더보다, 양방향으로 문맥을 이해하는 인코더 모델을 BERT라고 하고 발표함.
  • 버트가 가진 실제 인풋과 아웃풋의 구조를 자세히 살펴보면, 2개의 센텐스를 입력으로 받는다. 그냥 센텐스가 아닌 마스크드 된 센텐스임. 센텐스가 가지고 있는 각각의 토큰 (1~n개, 1~m개)에 일정비율로 실제 토큰이 아닌 마스킹을 해서 입력으로 넣겠다는 것. 언레이블도니 센텐스는 센텐스에 대한 어떤 슈퍼바이드 러닝??이 아니라는 것. 우리가 가지고 있는 코퍼스에서 영ㄴ속적인 2개의 센텐스를 시퀀스로 넣겟다는 것. 그리고 몇가지 스페셜 토큰이 있는데,
    CLS : 모든 시퀀스의 시작.
    SEP : 센텐스 세퍼레이팅.
    C :버트의 레이어를 계속 타고 마지막에 나오는게 첫번째CLS에 해당하는 final hidden vector(감성분류나 시뮬러리티같은 단순한 바이너리 클레시피케이션 같은 것을 수행할땐 얘만가지고 수행).
    Tn : 각각의 위치에 대응하는 토큰들이 의미하는것이 여러 인코더를 타고 올라가서 최좆ㅇ적으로 버트가 표현해주는 final hidden vector
    NSP : 두개의 센텐스가 실제로 코퍼스에서 다음센텐스인지 아닌지를 판별하는 0/1의 바이너리 클래시피케이션 태스크가있고,
    mask LM :마스킹된 토큰을 예측하는 마스크트 랭귀지 모델
    이 주가지의 테스트를 동시에 학습시키는게 버트의 목적임.

  • 버트의 입력으로 들어가는 인풋 리프젠터의 모델?

    • 세가지의 임베딩 벡터의 합으로 표현됨.
      1) 토큰 임베딩 : 단어 토큰 임베딩. 토큰 자체를 워드 피스를 사용해서 넣는데, 그 중에서 3만개에 해당하는 것을 일반적으로 사용함.
      2) 세그먼트 임베딩 : SEP를 경계로 왼쪽은 Ea, 오른쪽은 Eb로 표시. 시퀀스가 2개가 들어갔을 때, 첫번째 시퀀스에 해당하는지, 두번째 시퀀스에 해당하는지 알려주는 정보.
      3) 포지션 임베딩 : 트랜스포머와 마찬가지로 각각의 포지션에대한 포지셔널 임베딩.
    • 이 세가지가 같은 차원이니까 그냥 단순 더해서 최종 Input Representations를 구성하게 됨.
    • 세그멘트 임베딩 : 첫번째ㅐ 임베딩은 시퀀스의 시작을 알려주는 CLS 토큰, SEP를 보함함. 여기에 해당하는 것들이 1째 세그먼트, 나머지가 2째 세그먼트.
      • 버트 베이스의 경우 768차원이니까 실제 우리는 첫번째에 해당하는 세/임과 두번째에 해당하는 세/임 각각 768차원 2개를 학습을 시켜야함. 세그먼트 임베딩 자체도 학습이 되는 상황임.
  • 버트로 프리트레이닝 시키는
    첫번째 테스크가 Masked Language Model (MLM)임.
    - 전체 시퀀스의 15%가 랜덤하게 mask토큰으로 바뀜. 원래는 w1,w2,w3,w4 에서 w4가 마스크로 되서 들어감. 버트로 쭉 들어가면서 최종적인 아웃풋이 O4로 나오는데, 최종적으로 Fully connected~ 에 GELU, Norm거치고 하나의 레이어만 심어주고 W4'이 실제 토큰인 W4가 되도록 학습시키는 것이 MLM임. 다시 보면, 엘모는 랭귀지모델을 쓰지만, 바이디렉션을 사용했기 때문에한쪽으로 들어오는 정방향의 모델과 역방향의 모델을 따로 학습해서 특정 토ㅡㄴ이 있으면 해당 토큰의 representaion을 선형 연결하는 방식을 사용함. 버트는 그게아니라 순차적이 아닌 서로 쌍방향으로 한 인코더를 쓰되, 실제 인풋에 들어가는 것을 임의의 비율 15%로 마스킹을 하고 모델이 학습을 통해 실제 가려진 단어를 잘 예측하도록 학습하는게 버트의 프리트레이닝인 MLM의 목적이 됨.

    • 버트의 오리지날논문에서 언급하는 MLM의 문제점 중 하나가, 마스킹은 실제로 프리드레이닝에서만 이렁나지 파인튜닝단계엔 등장하지 않음. 그렇기에 마스크 토큰에 해당하는 미스메칭이 발생할 수 있다. 그 솔루션으로 80%는 마스크, 10%는 랜덤한 다른 단어, 10%는 원래단어 그대로 쓰면 val에 대해서 좋아짐
  • 두번째 테스크 : LSP 다음 문장 예측하기.
    - QNA, NLI는 2개 이상의 문장의 관계를 이해해야 풀어낼 수 있다. 문장단위의 랭귀지모델링같은 경우는 관계 이해할 수 없다는 것이 저자들의 지적임. 엘모 GPT는 문장단위로 학습을 하다보니 2개 문장을 함께 학습하지 않음. -> 버트는 2개문장을 알아야 답할 수 있는 것에 nlp테스크에도 좋은 성적은 내기 위해 9

  • 트랜스포머 작동방식
    - 입력값은 인코더에 입력됨. 그럼 각 토큰은 포지셔널 인코딩과 결합 > 인코더는 행렬계산을 통해서 한방에 어텐션 벡터 생성함. 어텐션 벡터는 토큰의 의미를 구하기 위해 생서함. 단어의 의미가 모호할 수 있음.
    • ++ 각각의 토큰으느 문장속의 모든 토큰을 보고 각 토ㅡㄴ의 의미를 정확히 모델에 전달하게됨. text와 message가 같이 있어 text는 문자보내는 행위임을 어텐션 벡터를 통해 전달하게되고, 메세지라는 의미도 텍스트와 함께 있는 거을 알게되어 문자메세지라는 것을 다음 레이어로 전송함.
    • 어텐션 레이어는 풀리커넥티드 레이어로 전송됨. 이와 동일한 과정이 6번 진행됨. 그 최좆ㅇ 값은 디코더의 입력값으로 들어감.
    • 꼭 기억해야할 것. 인코더는 모든 토큰을 한방에 계산함. RNN이 없다는 것.
    • 디코더는 인코더의 출력값과 최초 시작인 START_TOKEN으로 시작함. 왼쪽부터 오른쪽으로 순차적으로 문자를 출력함. 디코더는 예전 생성된 디코더의 출력값과 인코더의 출력값을 사용하여 다음 출력값을 생성함.
    • 디코더 역시 어텐션만들고 풀리 보내는 작업 6번 진행함. END_TOKEN이라는 스페셜 토큰을 출력할 때까지 반복함,.
    • 이것을 통해 ++ 아이엠어보이 한글어로 번역
  • ㅌ랜스포머의 인코더는 양방향으로 문맥을 이해하고, 디코더는 왼쪽에서 오른쪽으로 문맥을 이해한다는 것이 중요포인트

  • BERT는 양방향으로 문맥을 이해하는 식으로 진행하는 것일 뿐, language 모델이 맞다!

  • 기존 랭귀지(단방향)의 대표적 모델은 GPT -> 현재까지 읽은 단어를 사용해 다음단어를 예측하도록 학습됨. 입력된 문장을 통해 how are you 다음 doing을 출력하도록 학습됨.

  • 반면 bert는 동일한 문장 그대로 학습을 하되, 가려진 단어를 예측하도록 학습됨. 가려진 단어는 마스크 토큰이라 불림. 버트의 학습 역시 GPT처럼 사람이 데이터를 레이블링 할 피룡가 없다. 단순히 랜덤하게 문장속 단어만 가려주고 가려진 단어를 맞추도록 학습하면 되는 것. ++

  • 버트의 입력값으로는 1문장뿐 아닌 2문장도 받을 수 있음,. ㅎㄴ문장 입력값을 받아 처리하는 대표적인 자어넝처리테스크는 스팸인지 아닌지 문장이 긍정인지 부정인지 분류하는 모델임. 2문당을 입력받는 대표적인 자연어처리테스크는 질문과 답이 들어있는 문장을 받음. 입력으로 질문과 답이 있는 문장을 받아서 정답으르 출력하는 테스크
    버트는 한두문장의 입력값을 받아서 토큰간의 상관관계ㅂ뿐만 아니라 문장간ㄴ의 상관관꼐도 학습하게 됨.

  • CLS는 분류 테스크에 사용하기 위한 벡터임. 문장 전체가 하나의 벡터로 표현된 스페셜 토큰.

  • 두분장으로 입력된 경우, SEP라는 스페셜 토큰으로 두 문장이 구별됨. ++

  • 입력값을 족므 깊게보면 입력토큰들이 포지셔널 인코딩, 세그먼트 임베딩이 더해지는 것을 볼 수 있다. 버트는 워드피스 임베딩을 사요해서 문장을 토큰단위로 분류함. 워드피스 임베딩은 단순히 띄어쓰기로 토큰을 나누는것보다 효과적으로 토큰을 구분함.

  • 슬라이드에서 보시는 것처럼 playing은 하나의 닫ㄴ어지만, play와 ing로 토큰이 나눠짐.

  • 이같은 방법은 2가징 장점이 있다.
    1) play는 놀다라는 뜻이 있고,ing는 무엇인가 하고 있다는 뜻이 명확하게 있기때문에 딥러닝 모델에게 이 두가지 의미를 명확히 전달할 수 있다는 장점이 있다.
    2) 이렇게 쪼개서 입력할 경우 신조어/오탈자있는 단어(texting, googling같이 사전에 없는 단어)도 text와 ing처럼 딥러닝 모델에게 학습할때 봤을만한 단어로 입력되기 때문에 흔치않은 단어에 대한 예측이 향상됨.

  • 이번엔 세그먼트 임베딩을 알아볼까요> 개념은 아주 쉽습니다. 2개의 문장이 입력되면, 각각의 문장에 서로다른 숫자를 더해주는게 세그먼트 임베딩.

  • 딥러닌ㅇ 모델에게 2개의 다른 문장이 있다는 것을 쉽게 알려주기위해 사용하는 임베딩

  • 포지셔널 임베딩은 토큰들의 상대적 위치정보를 알려줌.

  • 딥러닝 모델은 포지셔널 임베딩으로 이원다음 E2 -E3토큰이 위치함을 알 수 있음.

  • 포지셔널은 sin cos를 ㅏ숑앟,ㅁ
    1) 사인과 코사인의 출력값은 입력갑세 따라달라짐. 따라서 사인 코사인의 출력값은 입력값의 상대적인 위치를 알 수 있는 숫자로 사용이 가는ㅇ함.
    2) 사인과 코사인의 출력값은 규칙적으로 증가 또는 감소함. 딥러닝 모델이 이 규칙을 사용해서 입력값의 상대적 위치를 쉽게 계산할 수 잇음
    3) 사인과 코사인은 무한대길이의 입력값도 상대적인 위치값을 출력할 수 있음. 어떤 위치의 입력값이라도 -1에서 1사이의 값을 출력하게 되어 ㅣㅇㅆ음.

  • 포지셔널 임베딩의 질문중 하나가 왜 상대적인 위치를 사용하냐, 절대적 위치를 사용하면 안되냐, 인데, 사용할 수 있다. 하짐나 절대적 위치를 사용하게 될 경우 최장길이의 문장을 셋팅해야함. 학습시 학습한 최장길이의 문장을 벗어난 길이의 문장은 받을 수 엇ㅂ다. 따라서 상대적 위치가 포지셔널 임베딩에서 더 선호됨

  • 버트는 프리트래이닝과 파인튜닝 2파트로 나눠짐. 그리고 방금 우린 프리트래이닝 부분을 마스터함. finetunung 가기전에 간단하게 GPT와 BERT의 차이점을 보자.

1) 버트는 양방향, GPT는 단방향
2) 버트는 finetuning을 하기 위해서 만들어짐. GPT는 finetuning이 필요없도록 만들어짐.

  • ++ 그림으로 알아볼까요? 주황색은 선행학습(프리트레이닝)된 모델. GPT는 선행학습된 모델 그 자체로 여러가지 목적의 자연어 처리를 수행가능함. 다만, 그 모델 크기가 상당히 큼.

  • 버트는 모델이 상대적으로 작고, 다른 목적에 따라 finetunning이 필요함. 물론 문장을 단순히 분류하는 모델로 QNA 모델로 사용할 수 없음.

  • gPT는 한번 학습시키는데 많ㅇ느 돈과 시간이 듦. 버트는 상대적으로ㅓ 적은 시간과 돈이 들지만, 파인튜닝을 개발자가 해줘야하고, 파인튜ㅣ닝역시 별도의 시간과 돈이 든다.

  • 버트의 파인튜닝을 알아볼까? 선행학습된 버트는 인터넷으로 쉽게 다운로드 할 수 있다. 개발자가 더 잘알 아야하는 부분은 다운로드 받은 모델을 어떻게 파인튜닝할까 입니다.

  • 버트 논문에 공개된 방법으로 파인튠이 방법에대해 할아볼까요.
    1) 예제1. 두 문장의 관계를 예측하기위해 모델을 만드는 방법. 버트의 입력값으로 2개의 문장을 받는거 기억하지죠. 2가지 문장을 SEP 토큰으로 구분해서 버트에 입력해서 출력값의 첫번째 CLS 토큰을 두문장의 관계를 나타내도록 학습시킨다.
    2) 예제2. 문장을 분류하는 모델. 문장 1개를 입력받고 CLS 토큰이 둘중 하나가 되도록 학습시킨다.
    3) 예제3. QNA. 입력값으로 질문과 답변이 포함된 장문을 SEP 토큰으로 구분해서 줍니다. 그리고 버트의 출력값의 마지막 토큰들이 장문속에 있는 정답의 시작 인덱스와 마지막 인덱스를 출력하도록 학습시킴.
    4) 예제4. 문장속 단어를 태깅하는 모델. 각각의 입력토큰의 출력값이 있기때문에 이 출력값이 원하는 태깅으로 출력되도록 학습시킴.

  • 버트의 성능은 상당히 좋음.

추가 Reference

profile
차보의 Data Engineer 도전기♥ (근데 기록을 곁들인)

0개의 댓글