https://www.coursera.org/learn/generative-ai-with-llms/lecture/9uWab/course-introduction
들어가며
전 직장 동료가 운영하는 모여서 각자 글쓰기 동아리에 함께 참여하게 되면서, 그동안 미뤄왔던 LLM에 대한 기초 공부를 포스팅으로 남기고자 한다. 총 3주차로 짜여진 코스를 주차 별로 수강하면서 LLM 전반에 대한 흐름을 이해하고 간단한 예제를 직접 구현하는 것이 목표이다. 각 강의의 내용을 정리하고 이해를 돕기위해 영상에 나오는 그림들을 첨부할 예정이다.
➡️ Generative AI & LLMs
- LLM에 입력값으로 전달하는 텍스트를 Prompt라고 함
- 일반적으로 수천 단어를 입력할 수 있지만, 모델마다 상이함
- LLM의 결과값은 Completion이라고 함
- 즉, LLM의 inference값
- 원래 입력한 Prompt 텍스트와 생성된 텍스트를 포함
➡️ LLM use cases and tasks
- 최근 LLM과 Generative AI는 chat bot 개발에 집중됨
- Prompt를 기반으로 에세이를 작성하거나, 텍스트를 요약하거나, 서로 다른 두 언어간의 번역 작업을 수행할 수 있음
- 자연어를 기계 코드로 번역할 수 있음
- 뉴스 기사를 입력하여 모든 사람과 장소를 식별하는 작업을 할 수 있음 (NER: Named Entity Recognition)
- 외부 데이터 소스와 연동해서 LLM을 강화하는 작업을 할 수 있음
- Pretrain하는 과정에서 알지 못하는 정보를 모델에 제공하여 추가로 학습시키는 과정
➡️Text generation before transformers
- 생성 알고리즘은 새로운 기술이 아님
- 기존 RNN은 당시에 잘 수행되었지만, 부족한 계산 자원과 많은 메모리 사용으로 인해 제한적이었음
- RNN의 단점을 해결한 Transformer 아키텍쳐의 등장으로 오늘날의 Generative AI 발전이 가능했음
- GPU를 사용할 수 있도록 효율적인 확장이 가능함
- 입력 데이터를 병렬처리하여 더 큰 학습데이터를 활용할 수 있음
➡️Transformers architecture
Transformer 아키텍처의 RNN과 다른 특징들을 통해 언어 모델 성능이 크게 향상되었음
- 문장 내에서 단어와 인접한 단어들 뿐만 아니라 다른 모든 단어와의 관련성을 학습함 (Self-Attention, 향후 강의에서 자세히 다룸)
Transformer 구조는 Encoder와 Decoder로 분리할 수 있으며, 서로 연동되어 작동하고 여러 유사점을 가짐
텍스트를 Transformer에 Inputs으로 전달하기 위해서는 토큰화가 선행되어야 함
- 토큰화는 단어 문자열을 모델의 Input으로 사용하기 위해 숫자(Token IDs)로 변환하는 방법
- 토큰화를 통해 얻는 숫자(Token IDs)는 모델이 받아드릴 수 있는 모든 단어의 사전 내 위치를 나타냄
- 모델을 학습시킬 때와 추론(텍스트 생성)할 때 사용하는 토큰화 방식이 같아야 함
변환된 각 토큰은 Embedding 레이어에 전달됨
- Embedding 레이어는 학습 가능한 벡터 임베딩 공간
- 숫자로 표현된 토큰은 Embedding 레이어를 통과함으로써 다차원 벡터로 변환됨
- 다차원 벡터로 Embedding하는 과정을 통해 단어 토큰의 의미와 문맥을 학습함
- 위 예를 보면, 각 단어 토큰들이 512크기의 벡터로 Embedding 되었음을 볼 수 있음
- 512는 Transformer 원본 논문에서 제시한 Embedding 벡터 크기이고, 상황에 따라 조절해서 사용할 수 있음
Embedding된 다차원 토큰 벡터가 Encoder 및 Decoder의 Input으로 사용되기 전에 마지막으로 Positional Encoding 과정을 거치게 됨
- 모델의 Input은 병렬적으로 처리되기 때문에, 문장에서의 단어 순서 정보가 누락되게 됨
- Positional Encoding을 통해 단어 순서의 정보를 더해줌으로써 단어 위치의 관계성을 잃지 않게 됨
토큰 벡터와 Positional Encoding 벡터를 합산한 벡터는 Encoder 및 Decoder에 전달되어 Self-Attention 레이어로 전달됨
- 모델 학습 중 학습되는 Attention Weight는 해당 입력 문장 내에서 각 단어가 다른 모든 단어에 미치는 중요도를 대변함
Self-Attention을 통해서 모델은 문장 내 각 단어의 문맥적 종속성을 잘 포착할 수 있지만, 이러한 일련의 과정을 여러 다른 주체가 수행하도록 하는 방법이 Multi-headed Self-Attention임
- Multi-headed Self-Attention은 여러 세트(head)의 Self-Attention 과정을 서로 독립적으로 병렬적으로 학습하는 방법
- 여러 head에서 입력 문장을 각기 다른 각도에서 바라보며 학습을 진행한다고 해석할 수 있음
- 각 head의 Attention weight는 무작위로 초기화 되고 충분한 Train데이터와 시간이 주어져 입력 문장에 대한 다양한 측면을 학습하는 것
- head의 수는 모델마다 상이하지만 12~100개가 일반적
모든 head의 Attention weight가 계산 되고 나면, Fead forward 레이어를 통해서 모든 토큰의 Logit 벡터를 얻을 수 있음
이후에 Logit벡터를 Softmax 레이어를 통과시켜 문장 내의 모든 단어에 대한 확률값을 구할 수 있음
- Softmax 출력값에는 입력 문장에 있는 모든 단어에 대한 확률이 포함됨
- 가장 높은 확률을 갖는 단어가 모델이 예측하는 단어가 됨
- Task에 따라서 이 최종 벡터를 활용하는 방법이 다양할 수 있음
➡️Generating text with transformers
이전 lecture에서 Transformer의 아키텍처 주요 구성 요소들에 대해 개요를 소개했고, 이번 lecture에서는 전체 프로세스에 대한 설명을 진행
Example) 프랑스어를 영어로 번역하는 Transformer
- Transformer를 학습시킬 때 사용한 토큰화 방식을 사용해서 입력 문장(프랑스어)의 단어들을 토큰화
- 토큰들은 Embedding 레이어를 통과하여 다차원 벡터로 변환됨
- 변환된 벡터는 Encoder의 Multi-headed Self-Attention 레이어와 Feed forward 네트워크를 통과하여 출력됨
- 이때의 Encoder 출력값은 입력 문장의 구조와 의미를 심층적으로 표현함
- Encoder의 출력값은 Decoder의 중간에 삽입되어 Decoder의 Self-Attention의 일부 입력값으로 사용됨
- 문장의 시작을 알리는 토큰이 Decoder의 입력에 추가됨
- 이 상태가 되면 Decoder가 다음 토큰을 예측하도록 트리거되고, Encoder의 출력값을 바탕으로 다음 토큰을 예측함
- Decoder의 Self-Attention 출력은 Feed forward 네트워크와 Softmax를 거쳐서 첫 번째 토큰을 예측하게 됨
- 모델이 문장 종료를 알리는 토큰을 예측할 때 까지 Decoder의 출력 토큰을 Decoder의 입력 토큰으로 다시 전달하여 다음 토큰 예측을 트리거하며 이 루프를 계속함
- 이 시점에서 최종 예측된 토큰들을 해독해서 다시 단어로 변환하여 최종 출력을 생성함
위의 번역 예제에서는 Encoder와 Decoder를 모두 사용했지만, Encoder만을 사용하는 등의 아키텍처 변형을 할 수 있음
- Encoder만을 사용하는 모델
- 입력 시퀀스와 출력 시퀀스의 길이가 같지 않도록하는 레이어를 추가함으로써 감정 분석이나 분류 문제를 풀 수 있음
- e.g. BERT
- Encoder와 Decoder를 모두 사용하는 모델
- 번역 문제와 같이 시퀀스 간 작업에서 잘 작동함
- e.g. BART, T5
- Decoder만을 사용하는 모델
- 오늘날 가장 일반적으로 사용됨
- e.g. GPT, BLOOM, Jurassic, Lama