AI Engineering - 2장: 파운데이션 모델 이해하기

파운데이션 모델을 쓰는 앱을 만들려면 이 모델의 작동원리를 이해해보는 것도 좋다. 하지만 천문학적 비용이 드는 비용을 든 모델을 공개할 이유는 없으므로, 이 모델을 활용해서 서비스 개발 시 필요한 설계요소를 고민해보자.

파운데이션 모델의 차이점은 학습 데이터, 모델 아키텍처와 크기, 사람의 의도에 맞추는 사후학습 방식 등의 차이가 있다.

모델은 데이터를 학습한다. 따라서 데이터를 확인해보는 것으로 모델의 성능과 한계를 생각해보자. 모델 개발자가 학습 데이터를 수집하는 방법을 다루면서 학습 데이터의 분포에 초점을 맞추고 8장에서 데이터 품질 평가, 데이터 합성을 포함한 데이터셋 엔지니어링 기법을 살펴보자.

AI 모델 분야에서 트랜스포머 아키텍처는 대세가 되었다. 그러므로 트랜스포머 아키텍처를 이해하고 다른 아키텍처가 대세가 되려면 얼마나 걸릴지, 새 구조는 어떨지에 대해서도 다뤄보자. 또한 새 모델이 나올 때는 모델 크기도 중점적인 논의사항이 되는데, 적절한 모델크기의 결정 과정도 살펴보자.

모델은 사전 학습, 사후 학습으로 학습과정이 나뉘어진다(1장 콜아웃 참조). 사전학습을 통해 모델이 추론 능력을 가지지만, 안정성/사용편의성은 보장되지 않는다. 이런 경우 사후 학습이 필요하다. 사후 학습의 목표는 모델이 사람의 의도에 맞게 작동하도록 하는 것이다. 사람의 의도(human preference)란 그럼 뭘까? 모델이 학습할 수 있는 형태로 어떻게 표현할 수 있을까? 이 모호함 때문에 모델 조정하는 건 사용성에 큰 영향을 준다. 이번 장은 이걸 다룬다.

모델 성능에 학습이 미치는 영향만큼, 샘플링이 미치는 영향도 고려해보자. 선택 가능한 옵션 중 어떤 것을 출력으로 선택할 것인지 살펴보자. 샘플링을 통해 환각, 비일관성을 포함한 AI의 behavior를 이해하고, 샘플링 전략을 적절히 택해서 모델의 성능을 향상할 수 있다.

학습 데이터

AI 모델은 학습한 데이터의 특성에 따라 할 수 있는 일이 정해진다.

모델의 특정 작업성능을 높이려면 데이터를 더 추가하고자 할 것이다. 대규모 모델 학습에 필요한 데이터를 충분히 확보하는 것은 어렵고 비용이 많이 든다. 모델 개발자들은 원하는 데이터 대신 구할 수 있는 데이터를 최대한 활용한다.

이런 대표적인 학습 데이터는 커먼 크롤(common crawl)이 있다. 비영리 단체가 웹사이트를 주기적으로 크롤링하여 데이터셋을 만든다. 커먼 크롤은 매월 20-30억개의 웹 페이지를 크롤링했다.[1] 구글은 정제된 부분집합 C4(colossal clean crawled corpus)를 제공한다. 그런데 이 데이터는 오만가지 글들을 모두 학습했고, 헛소리도 많다.

과거 주요 모델은 데이터가 쉽다보니 커먼 크롤을 활용했거나, 하고 있을 것으로 추측하고 있다. 그리고 이런 데이터는 저품질의 데이터를 회피하기 위해 휴리스틱으로 처리했다.

원하는 데이터가 아닌 가진 데이터만 사용하는 접근법은 모델이 가진 학습데이터로써는 작업이 잘 되지만, 원하는 작업은 잘 안될 수 있다. 그런 의미로 유용한 데이터셋 선별이 무엇보다 중요하다. 여기서는 특정 언어와 분야의 데이터를 선별하는 방법을 다루며, 이를 가지고 해당 분야의 애플리케이션을 만들 수 있는 기반을 제공한다. 8장에서 작업 특화 모델을 위한 데이터 전략을 살펴본다.

언어, 도메인별 파운데이션 모델은 처음부터 학습할 수도 있지만, 범용 모델 위에서 파인튜닝하는 것도 일반적이다.

모든 데이터(일반 데이터 + 전문 데이터)로 학습하면 컴퓨팅 자원이 더 필요하기도 하고, 데이터가 많다고 해서 모델의 성능이 개선되지 않는다. 고품질의 적은 데이터를 통한 학습이 저품질의 대량 데이터를 통한 학습보다 더 나은 성능을 보일 수도 있다.[2]

다국어 모델

인터넷에서 가장 많이 쓰이는 언어는 영어다. 커먼 크롤 데이터셋을 근간으로 보면 영어가 전체 데이터의 거의 절반(45.88%)을 차지한다. 이는 두 번째로 많이 쓰이는 러시아어(5.97%)보다 약 8배 더 많이 쓰인다[3].

커먼 크롤에서 1% 미만을 차지하는 언어들은 AI를 학습시키는데 사용가능한 데이터가 부족하다. 이런 언어를 저자원 언어(low-resource language)라고 한다.

사용인구가 많아도 비중이 과소 대표[4]되는 언어가 있다. 인구 대비 데이터 비율이 일치될 수록 이상적이다. 이를 놓고 보았을 때, 다른 언어보다 영어에서 더 좋은 성능을 보인다. 과거 모델에서도 영어로 MMLU 3-shot 정확도를 놓고보면 가장 정답률이 높았다. 성능차이가 나는 이유는 데이터에 해당 언어가 적게 포함되어있기 때문이다.

그렇다면, 모든 질의를 영어로 번역하고 이를 원래 언어로 번역하는 것은? 완벽하지는 않다. 아래 두 맹점이 있다.

  1. 적은 데이터를 충분히 이해해 번역할 수 있는 모델이 필요하다
  2. 번역 중 정보 손실이 있을 수 있다

영어가 아닌 언어에서도 성능문제가 일어날 수도 있다. 요컨대 미국 모델에서 중국어 품질이 안좋다거나. 원인은 정확히는 알 수 없지만.

영어외의 모델은 더 느리고 비용이 더 들 수도 있다. 모델의 추론 지연시간과 비용은 입력과 응답에 포함된 토큰 수에 비례하며, 연구 결과 언어별 토큰화 효율성의 차이가 있다는 것이 밝혀졌다[5].

그렇다보니 다양한 많은 모델이 비영어권에 초점을 맞추어 학습되었다. 중국어가 이 면에선 가장 활발하고, 한국어, 프랑스어, 베트남어, 아랍어 등이 있다.

도메인 특화 모델

Gemini, GPT, LLaMA 같은 범용 모델은 다양한 영역에서 성능이 좋다. 이는 학습 데이터에 다양한 도메인의 데이터가 포함되어있기 때문이다. 앞서말한 커먼 크롤에 포함된 도메인의 분포를 보면 우리 사회의 도메인이 다양하게 구성되어있다. 구체적인 비율은 추산하기 어렵지만, 모델이 다루는 분야와 벤치마크 상의 성능을 통해 어떤 부분에서 더 많은 데이터와 도메인을 학습했는지 파악할 수 있다.

즉, 도메인 특화 작업에서는 좋은 성능을 내기 어렵다. 이를테면 신약 발견, 암 선별 검사같은 작업은 계열이 있다. 신약 발견에 대한 데이터와 제반지식 혹은 암에 대한 데이터와 제반지식은 확득비용과 개인정보 보호 문제 등으로 확보조차 어렵다.

따라서 특화 도메인에서 성능을 내기 위해선 해당 분야의 전문적 데이터셋이 필요하다. 딥마인드의 알파폴드(AlphaFold)[6] 같은 모델이나 엔비디아의 바이오네모(생체 분자 데이터)[7] 같은 모델, 의료 데이터와 LLM을 결합한 메드-팜2[8] 같은 모델이 있다.

모델링

모델을 학습하기 전, 개발자는 모델을 어떻게 설계할지 결정해야 한다. 어떤 아키텍처를 따르고 파라미터는 몇 개인지 등, 모델의 능력 뿐 아니라 모델을 활용해 만드는 서비스의 사용성까지 모두 구성해야 한다. 이를테면 7B 파라미터의 모델은 175B 파라미터 모델보다 배포하기가 훨씬 쉽다. 지연 시간 최적화도 아키텍처에 따라 달라진다(트랜스포머 모델 최적화 방식이 다른 아키텍처와 다른 이유).

모델 아키텍처

언어 기반 파운데이션 모델에서 가장 널리 쓰이는 아키텍처는 Attention Is All You Need (Vaswani et al., 2017)에 기반한 아키텍처다. 이 아키텍처는 기존 모델의 한계점을 극복하고 트랜스포머의 성공을 가져왔다. 여기서는 이 한계점과 대안을 살펴본다.

트랜스포머 아키텍처

  1. seq2sec 아키텍처의 한계점을 어텐션 메커니즘 도입으로 해결함.
    1. 문제점
      1. 최종 은닉(hidden state) 상태로 인한 출력물 품질 저하 우려
        (E.g., 책 요약본만 가지고 응답을 만드는 것과 유사)
      2. RNN 인코더/디코더는 순차처리 - 롱 시퀀스 처리 시 속도 저하 우려
    2. 해결방안
      1. 출력토큰 생성 시 서로 다른 입력 토큰의 중요도에 가중치 부여 가능
      2. RNN 을 사용하지 않고 설계하여 병렬처리 - 입력처리속도 확보

하지만 트랜스포머 기반 자기회귀 언어 모델은 여전히 순차적 출력 병목현상이 남아있음

트랜스포머 기반 언어모델 추론은 두 단계로 이루어짐

  1. 프리필 - 모델이 입력토큰을 병렬로 처리 → 첫 출력 토큰 생성에 필요한 중간상태를 만듦(이 때 각 입력 토큰의 키 벡터/값 벡터가 중간 상태에 저장됨)
  2. 디코드 - 출력 토큰을 한 번에 하나씩 생성

프리필 단계의 병렬성과 디코드 단계의 순차적 특성은 언어모델 추론을 더 저렴하고 빠르게 만들기 위한 최적화 기법을 야기했다

어텐션 메커니즘

트랜스포머 아키텍처의 핵심이다. 어텐션 메커니즘은 내부적으로 키(key), 값(value), 쿼리 벡터(query vector)를 활용한다.
- 쿼리 벡터(): 디코딩 단계여서 디코더의 현재 상태를 나타냄 (E.g., 요약을 만들기 위해 정보를 찾는 사람)
- 각 키 벡터(): 이전 토큰. (E.g., 각 이전 토큰을 책의 페이지라고 생각하면, 각 키 벡터는 '페이지 내용 요약', '색인 키워드'에 가까움) 특정 디코딩 단계에서 이전토큰에는 입력 토큰과 이미 생성된 토큰이 모두 포함됨
- 각 값 벡터(): 모델이 학습한 이전 토큰의 실제값. (E.g., 각 값 벡터는 페이지의 내용과 동일)

어텐션 메커니즘은 쿼리 벡터와 키 벡터 간의 내적(dot product)을 통해 각 입력 토큰에 얼마나 주목할지 계산한다. 점수가 높을 수록 모델이 책 요약을 생성할 때 해당 페이지의 내용(값 벡터)을 더 높은 비중으로 반영하겠다는 의미다.

이전 토큰마다 키 벡터와 값 벡터가 있기 때문에, 시퀀스가 길어질 수록 더 많으 키 벡터와 값 벡터를 계산하고 저장해야 한다. 이로인해 트랜스포머 모델의 컨텍스트 길이 확장이 어려우며, 키 벡터/값 벡터를 효율적으로 저장하기 위한 기법은 7장, 9장에서 각각 다룬다.

어텐션 함수의 작동방식을 살펴보면, 입력 가 주어지면 키, 값, 쿼리 행렬로 키, 값, 쿼리벡터를 계산한다. 를 각각 키, 값, 쿼리 행렬이라고 하면 키, 값, 쿼리 벡터는 아래와 같이 계산된다.

쿼리, 키, 값 행렬의 차원은 모델의 은닉차원에 해당한다. 라마 2-7B(Touvron et al., 2023) 에선 모델의 은닉 차원 크기가 4096이므로, 행렬의 크기는 이다. 이렇게 만들어지는 벡터는 각각 4096 차원을 가진다.

어텐션 메커니즘은 멀티헤드로 구성된다. 이를 사용하면 서로 다른 이전 토큰 그룹들을 동시에 주목할 수 있다. 멀티헤드 어텐션은 쿼리, 키, 값 벡터가 더 작은 벡터들로 나뉘어 각각 하나의 어텐션 헤드에 해당한다. 라마 2-7B의 경우 32개의 어텐션 헤드가 있으므로, 각 벡터는 128차원을 가진 32개의 벡터로 나뉜다. 4096을 32로 나누면 128이 되기 때문이다.

모든 어텐션 헤드의 출력은 이어붙여진다. 이렇게 이어붙여진 결과는 출력 투영 행렬을 통과한 후 다음 연산 단계로 넘어간다. 출력 투영 행렬은 은닉 차원과 같은 크기를 가진다.

트랜스포머 블록

어텐션 메커니즘이 모델에서 쓰이는 방안을 알아보자. 트랜스포머 아키텍처는 여러 개의 트랜스포머 블록으로 구성된다. 일반적으로 각 트랜스포머 블록은 어텐션 모듈과 다층 퍼셉트론(multi-layer perceptron(MLP)) 모듈을 포함한다.

용어 정리

어텐션 모듈

  • 쿼리, 키, 값, 출력 투영의 네 가중치 행렬로 구성

MLP 모듈

  • 비선형 활성화 함수로 구분된 선형 레이어
  • 각 선형 레이어는 선형 변환에 사용되는 가중치 행렬
  • 활성화 함수는 선형 레이어가 비선형 패턴을 학습할 수 있도록 돕는다
  • 선형 레이어는 피드포워드 레이어라고도 일컫는다

트랜스포머 모델의 트랜스포머 블록 수는 흔히 해당 모델의 레이어 수라고 한다. 트랜스포머 기반 언어모델은 모든 트랜스포머 블록 전후에 모듈을 갖추고 있다

Note

트랜스포머 블록 이전의 임베딩 모듈

이 모듈은 토큰을 임베딩 벡터로 변환하는 임베딩 행렬과 토큰의 위치를 임베딩 벡터로 변환하는 위치 임베 딩 행렬로 구성되며, 최종적으로 이 두 벡터를 합산한다. 단순하게 보면 위치 색인의 수가 모델의 최대 컨텍스트 길이를 결정한다. 예를 들어, 모델이 2048개의 위치를 추적한다면 최대 컨텍스트 길이는 2048이다. 하지만 위치 색인의 수를 늘리지 않고도 모델의 컨텍스트 길이를 늘릴 수 있는 기법들이 있다.

트랜스포머 블록 이후의 출력 레이어

이 모듈은 모델의 출력 벡터를 모델 출력을 샘플링하는 데 사용되는 토큰 확률로 매핑한다(2.4 ‘샘플링’ 절 참조). 이 모듈은 일반적으로 언임베딩(unembedding) 레이어라고 하는 하나의 행렬로 구성된다. 일부는 출력 생성 전 모델의 마지막 레이어이므로 출력 레이어를 모델 헤드라고 부른다.

트랜스포머 모델의 크기는 구성요소의 차원에 의해 결정된다. 주요한 값은 아래와 같다

차원 값이 커지면 모델 크기도 커진다.

모델 크기

AI의 발전은 모델 크기가 커짐으로 인함이라고 해도 과언이 아니다. 따라서 모델을 발표하면 보통 파라미터 수를 이름에 같이 쓰곤한다.

모델의 파라미터 수가 늘어나면 학습 용량이 커져서 성능이 향상된다. 같은 모델 시리즈 내에서도 130억개의 파라미터를 가진 모델이 70억개의 파라미터를 가진 모델보다 더 좋은 성능을 보이는 경우가 많다.

파라미터 수는 이 모델을 학습하고 실행하는 데 필요한 컴퓨팅 자원을 추정하는 데 도움이 된다.
이를테면 모델이 70억개의 파라미터를 가지고 있고 각 파라미터가 2바이트(16비트)를 쓴다면 이 모델로 추론하는 데 필요한 최소 GPU 메모리는 140억바이트(약 14GB)가 된다[9].

모델이 희소하다면 파라미터 수가 오해를 살 수 있다. 모델의 희소함은 파라미터 중 0인 값이 높은 비율을 차지하는 것을 의미한다(예를 들어, 70억 파라미터 모델이 90% 희소하다면 0이 아닌 파라미터는 7억 개뿐). 이 특성을 활용하면 보다 적은 컴퓨팅 자원으로 실행할 수 있다.

대표적인 희소모델은 전문가 혼합(mixture-of-experts, MoE)이 있다(Shazeer et al., 2017). MoE 모델은 여러 파라미터 그룹으로 나누고 , 각 그룹이 특정 도메인에 특화된 전문가 역할을 담당한다. 토큰 처리 시 이 전문가 중 일부만 활성화(사용)된다.

더 큰 모델이라도 충분한 데이터로 학습하지 않으면 더 작은 모델보다 성능이 떨어질 수 있다.

모델 크기를 논할 땐 학습에 쓰인 데이터의 크기도 함께 고려해야한다. 대부분의 모델은 데이터셋 크기를 학습 데이터 개수로 측정한다. 구글의 플라밍고(Alayrac et al., 2022)는 여러 데이터셋을 썼다. 그 중 하나는 18억개의 <이미지, 텍스트> 쌍이고, 다른 하나는 3억 1200만개의 <이미지, 텍스트> 쌍이었다.

언어모델은 문장, 위키백과 페이지, 채팅대화, 책 등의 데이터를 사용한다. 하나의 책이 담고있는 정보량은 한 문장보다 훨씬 많기 때문에 데이터 갯수만으로 데이터셋의 크기를 측정하기 보단 토큰의 수를 세는 것이 더 좋은 측정방법이다.

같은 데이터셋이라도 모델마다 토큰화하는 방식이 다르기 때문에, 토큰 수가 완벽한 기준이라고 하긴 어렵다. 하지만 모델이 해당 데이터로부터 얼마나 많이 학습할 수 있는지 가늠할 수는 있다.

데이터셋의 토큰 수와 학습 토큰 수는 다르다. 학습 토큰 수는 모델이 실제로 학습한 토큰의 총 량을 의미한다. 예를 들어, 1조 개의 토큰을 가진 데이터셋으로 2번 반복 학습(2 에포크)을 한다면, 학습 토큰 수는 2조가 된다. 여기서 에포크는 전체 데이터셋을 한 번 학습하는 단위를 말한다.

Note

데이터의 규모와 양, 품질과 다양성 모두 학습 데이터의 목표다.
이 내용은 8장에서 자세히 다룬다.

대규모 모델을 사전 학습할 때는 많은 컴퓨팅 자원이 필요하다. 필요한 컴퓨팅 자원의 양을 측정하는 방법 중 하나는 GPU, CPU, TPU 같은 기기의 수를 세는 것이다. 하지만 기기마다 성능과 비용이 크게 다르다. 예를 들어, 엔비디아 A10 GPU는 엔비디아 H100 GPU나 인텔 코어 울트라 프로세서와 성능이 다르다.

모델의 컴퓨팅 요구사항을 나타내는 더 표준화된 단위는 **부동소수점 연산(Floating Point Operation, FLOP)**이다. FLOP은 특정 작업을 수행하는 데 필요한 부동소수점 연산의 개수를 의미한다.

주요 모델별 컴퓨팅 요구량 예시:

FLOPs vs FLOP/s (FLOPS)

FLOP의 복수형인 FLOPs는 종종 초당 부동소수점 연산을 나타내는 **플롭스(FLOP/s)**와 혼동되곤 한다.

예시: 엔비디아 H100 NVL GPU

헷갈리는 표기법 주의 - FLOP/s vs FLOPS

FLOP/s는 종종 FLOPS로 표기되는데, 이는 복수형인 FLOPs와 매우 비슷해 보인다. 이런 혼동을 피하기 위해 오픈AI를 포함한 일부 기업들은 컴퓨팅 요구량을 측정할 때 FLOPs 대신 FLOP/s-day를 사용한다.

하지만 기기의 성능을 최대로 끌어낼 수는 없다. 활용률은 최대 컴퓨팅 성능 대비 실제 사용가능한 비율을 말한다. 좋은 활용률의 기준은 모델, 작업유형, 하드웨어에 따라 다르다. 최대성능의 50%만 되어도 괜찮고 70%면 매우 훌륭한 성능이라 할 수 있다. (9장 참조)

모델의 규모를 나타내는 세 가지 숫자

  • 파라미터 수: 모델의 학습용량
  • 토큰 수: 모델이 얼마나 많이 학습했는지를 나타냄
  • FLOPs의 수: 학습 비용

스케일링의 법칙: 컴퓨팅 자원 최적의 모델

위 내용을 통해 도출된 아래 세 가지를 기억한다.

  1. 모델의 성능은 모델의 크기와 데이터셋의 크기에 좌우된다
  2. 모델과 데이터셋이 더 커질 수록 더 많은 컴퓨팅 자원이 필요하다
  3. 이런 컴퓨팅 자원에는 상당한 수준의 비용이 수반된다

돈이 무한하지 않으면 예산을 세워야한다. 그 돈으로 얻을 수 있는 최대 모델 성능을 찾아야한다.

사후 학습

사전 학습된 모델에서 시작한다. 자기 지도 학습을 사용해 파운데이션 모델을 사전 학습했다고 치면, 현재 사용되는 사전 학습 방식으로 인해 아래와 같은 두 문제가 발생한다

  1. 자기 지도 학습은 모델을 대화가 아닌 텍스트 완성을 잘 하도록 학습한다
  2. 인터넷의 무차별 데이터로 모델을 사전학습하면 답의 품질이 낮아진다

사후학습은 이를 해결하기 위한 기법이고 아래 두 단계로 구성된다.

  1. 지도 파인튜닝(SFT): 대화를 위해 모델을 최적화하기 위한 고품질 지시 데이터로 사전학습된 모델을 파인튜닝한다
  2. 선호도 파인튜닝: 사람의 선호도에 맞는 응답을 출력하도록 파인튜닝한다. 이는 강화학습으로 수행된다. 이 기법에는 사람 피드백 기반 강화학습(RLHF), 직접 선호도 최적화(DPO), AI 피드백 기반 강화학습(RLAIF) 등이 있다.

사전학습은 토큰 예측과 품질을 높이는 것에 주안점을 둔다면 사후학습은 응답의 품질에 신경쓰는 것이라 할 수 있다. 사후학습은 사전학습 대비 적은 자원을 사용한다.

RLHF를 이용한다 가정한다면, 사전학습, SFT, 선호도 파인튜닝의 워크플로우를 통해 이루어진다.
비교 데이터를 토대로 <프롬프트, 응답> 쌍에 대한 스칼라 점수를 부여하도록 학습한다. 이 보상모델과 프롬프트로 보상 모델의 점수가 최대가 되는 응답을 생성하도록 강화학습을 수행한다. 이를 통한 최종 모델이 탄생한다.

짤방으로는 이런 내용이 있다.

지도 파인튜닝

사전학습은 완성에 집중되어있으므로 대화라는 개념이 모호하다. 만약 모델에 대화라는 응답을 목표로 하길 원한다면 이를 적절히 구성해줘야 한다. 예를 들어보자.

"피자 만드는 법"을 모델에 입력하면, 모델은 이것이 대화여야 한다는 개념이 없기 때문에 이 문장을 계속 완성할 것이다. 다음 세 가지 옵션 중 어느 것이든 유효한 완성이 될 수 있다.

  1. 질의에 더 많은 컨텍스트 추가하기: "여섯 식구를 위한?"
  2. 후속 질의 추가하기 : "어떤 재료가 필요한가요? 시간은 얼마나 걸리나요?"
  3. 피자 만드는 방법에 대한 지침 제공하기

사용자에게 적절하게 응답하는 것이 목표라면, 올바른 옵션은 3번이다.

모델은 학습 데이터를 모방한다. 그러려면 적절한 응답의 예시를 보여주면 된다. 이 예시는 <프롬프트, 응답>의 형식을 따르며 시연 데이터(demonstration data)라고 한다. 이 과정은 혹자는 행동 복제라고 한다.

전통적인 데이터 레이블링과 다른 식의 시연 데이터가 필요하다. 이를테면 비판적 사고, 정보 수집, 사용자 요청의 적절성에 대한 판단이 필요한 복잡한 프롬프트가 포함될 수 있다.

이런 레이블링은 고품질이고 비용이 많이 든다. 그리고 모든 기업이 감당할 수도 없고, 비영리 단체에서 만들어진다면 편향성을 제어하기도 어렵다. 그렇다보니 딥마인드는 인터넷 데이터에서 대화를 필터링하는데 간단한 휴리스틱을 사용했다[10]. 이런 합성 데이터는 8장에서 다룬다.

선호도 파인튜닝

모델을 기괴하게 틀어서 쓰려는 사람이 있다. 흔히 gpt 고문, 제미나이 고문 운운하며 나오는 짤방들이 그것이다. 모델을 만드는 사람의 경우에는 논란의 여지가 있는 문제에 대해 어떻게 풀지 구성해야 한다.

AI 모델이 부적절한 응답을 생성할 수도 있다는 우려로 인해 앱 출시도 못하게 하는 경우도 있다. 선호도 파인튜닝의 목표는 AI 모델이 사람의 선호도에 따라 행동하도록 만드는 것이다. 하지만 난이도는 매우 높다. 사람의 보편을 정할 수는 없는 노릇이며, 이를 AI에 내장하는 것도 불가능하다.

이 분야에서 자주 쓰이는 알고리즘은 RLHF이다. 아래 두 부분으로 구성되어있다:

  1. 파운데이션 모델의 출력에 점수를 매기는 보상모델 학습
  2. 보상 모델이 최대 점수를 줄 응답을 생성하도록 파운데이션 모델을 최적화

이에 대한 세부사항을 살펴보려면 InstructGPT에서 사용한 공식[11]을 참고하라.

샘플링

샘플링은 모델의 출력을 확률적으로 만든다. 이런 확률적 특성은 AI의 주요 오동작(일관성 없음, 환각)을 다루는데 중요하다.

샘플링의 기초

신경망은 입력이 주어지면 잠재 결과들의 확률을 먼저 계산하여 출력을 생성한다. 분류모델의 잠재적인 출력은 모델이 분류할 수 있는 클래스다. 스팸메일 탐지만을 하기 위한 모델의 잠재 출력은 스팸/스팸아님 뿐이며, 이 각각을 계산한다.

언어모델은 다음 토큰을 생성하기 위해 어휘들의 모든 토큰에 대한 확률분포를 계산한다.

잠재적인 결과들의 확률이 서로 다를 때, 흔이 쓰이는 전략은 가장 높은 확률을 가진 결과를 택하는 것이다. 이를 그리디 샘플링이라 한다. 분류작업에서는 매우 훌륭하다.

다음 토큰으로 가장 가능성이 높은 것만 고르는 것 대신, 가능한 모든 값에 대한 확률분포에 따라 다름 토큰을 샘플링할 수 있다. 'My favorite color is'라는 컨텍스트가 주어졌을 때, 'red'가 다음 토큰이 될 확률이 **30%**이고 'green'이 **50%**라면, 모델은 실제 선택 과정에서 'red'를 **30%**의 확률로, 'green'을 **50%**의 확률로 선택한다.

입력이 주어지면 신경망은 로짓(Logit) 벡터를 출력한다.

더 큰 로짓의 값은 더 높은 확률에 대응하지만, 로짓은 확률이 아니다. 이를 확률로 변환하기 위해 소프트맥스 레이어가 쓰인다. 모델의 어휘 크기가 이고, 로짓 벡터를 이라 할 때, i번째 토큰의 확률 는 아래와 같이 계산된다:

샘플링 전략

적절한 샘플링 전략을 사용하면 모델이 애플리케이션에 더 적합한 응답을 생성하도록 할 수 있다. 예를 들어, 한 샘플링 전략은 모델이 더 창의적인 응답을 생성하도록 만들 수 있고, 다른 전략은 더 예측 가능한 응답을 만들게 할 수 있다. 모델이 특정 속성을 가진 응답을 하도록 유도하기 위해 많은 다양한 샘플링 전략이 등장했다. 모델의 로짓에 접근할 수 있다면 자신만의 샘플링 전략을 설계할 수도 있다. 자주 쓰이는 샘플링 전략이 어떻게 작동하는지 살펴보자.

온도

모델의 창의성에 관여하는 전략이다. 더 높은 온도는 흔한 토큰의 확률을 줄임으로써, 희귀한 토큰의 확률을 증가시킨다.

온도는 소프트맥스 변환 전 로짓을 조정하는데 사용되는 상수다. 이 값을 컨트롤하는 것으로 처리할 수 있다.

온도가 높을수록, 모델이 가장 명백한 값(가장 높은 로짓을 가진 값)을 선택할 가능성이 낮아져서 모델의 출력이 더 창의적이지만, 일관성이 떨어질 수 있다. 온도가 낮을수록, 모델이 가장 명백한 값을 선택할 가능성이 높아지므로, 모델의 출력이 더 일관적이지만 더 지루해질 수 있다.

top-k

모델의 응답 다양성을 희생하지 않으면서 계산 작업량을 줄이기 위한 샘플링 전략이다.

소프트맥스 레이어는 모든 후보 값의 확률분포를 계산한다. 소프트맥스는 모든 후보값에 대해 두번의 연산을 수행하는데, 큰 어휘를 가진 언어모델은 이 과정에서의 계산 비용이 매우 높다.

따라서 모델이 로짓을 계산한 후, 상위 개의 로짓(50에서 500 사이)을 선택하고 상위 개의 로짓에 대해 소프트맥스 연산을 수행하게 하도록 샘플링할 수 있다.

top-p

이 샘플링 전략은 고려되는 값의 수를 로 고정한다. 숫자는 상황에 따라 변하게 한다. 뉴클리어스 샘플링(nucleus sampling)이라고도 한다. top-p는 소프트맥스 계산 부하를 반드시 줄여주지는 않는다. top-p의 이점은 컨텍스트와 관련이 높은 단어들만 후보로 삼기 때문에, 컨텍스트에 적절한 문장을 생성할 수 있다는 것이다. 이론적으로 top-p 샘플링은 장점이 많지 않은 것으로 보이지만, 실제로 사용했을 때 잘 작동해서 인기가 높아졌다.

중단 조건

모델이 시퀀스 생성을 중단하는 조건을 설정할 수도 있다. 중단 토큰이다 중단 단어를 사용하여 생성 중단을 요구하게 할 수 있다. 조기 중단으로 인해 출력형식이 망가질 수도 있고, 깨진 JSON이 오는 등의 문제가 발생할 수도 있다.

테스트 시점 연산

질의당 하나의 응답 대신 여러 응답을 생성하여 best of N 으로 활용한다. 출력의 다양성을 높여 더 나은 후보를 고르게끔 하고 이를 위한 샘플링 변수를 변경하는 방안이다.

구조화된 출력

실 서비스에서는 모델이 특정 형식을 따르는 출력을 생성해야 하는 경우도 있다. 이를테면:

  1. 구조화된 출력이 필요한 작업
    • text-to-sql 변환. 유효 SQL 쿼리를 보내도록 한다거나
  2. 다운스트림 애플리케이션에서 출력이 사용되는 작업
    • 이 출력은 다른 애플리케이션에서 사용되어야 하므로 특히 유의한다
    • 에이전트 워크플로우에 특히 중요하다

프롬프팅

어떤 형식으로 출력을 생성하도록 지시할 수 있다. 이는 모델에 대한 지시능력과 지시의 명확성에 따라 달려있지만, 항상 지시를 따른다는 보장은 없다(!). 따라서 유효한 출력의 비율을 높이기 위해 프롬프트 출력을 검증하거나 검증에 AI를 쓰기도 한다. 최소 2번이상의 모델 질의를 할 수도 있다는 뜻이다.

후처리

비슷한 실수를 하면 이를 직접 수정하도록 하는 스크립트나 방어적 작업을 하는 파서로 보강할 수 있다. 이는 수정하기 쉬운 실수에만 효과가 있다는 점에 유의한다.

제약 샘플링

특정 제약조건에 맞게 텍스트 생성을 유도하는 기법이다. 구조화된 출력도구와 함께 쓰인다. 이는 토큰 생성레벨까지 내려가는데, 제약조건을 만족하는 값 중 토큰을 샘플링하는 방식이다. 제약조건을 만족하는 토큰만 걸러내고 그 중 유효한 로짓으로 쓰게끔 필터링 하는 것이다.

파인튜닝

원하는 형식에 맞는 예시로 모델을 학습시키는 것이다(처음부터 모델을 깎을 수도 있다). 이 형식대로 출력을 생성하게 만드는 가장 효과적이고 일반적인 방법이다.

AI의 확률적 특성

AI 모델은 응답 샘플링을 확률적으로 한다. 동일한 명령을 내리면 동일하게 수행하는 게 아니라, 응답이 달라질 수 있다(비일관성). 또한 잘못된 데이터가 학습데이터에 포함되어 있다면 확률적으로 이를 답할 수 있다(환각).

파운데이션 모델은 대규모 데이터셋이기 때문에 다양한 가능성이 담겨있다. 0이 아닌 확률이라면 아무리 터무니없거나 올바르지 않더라도 얼마든지 생성할 수 있다.

비일관성

비일관성은 아래와 같은 특징을 가진다.

  1. 같은 입력, 다른 출력: 동일 프롬프트를 두번 주면 완전히 다른 응답이 나옴
  2. 살짝 다른 입력, 완전히 다른 출력: 프롬프트를 조금만 틀어도 완전히 다른 대답이 나옴

1의 경우를 보정하기 위해 응답을 캐시처리 하거나, 모델의 샘플링 변수를 고치거나, 난수 생성기의 시드값을 고정한다 하더라도 100% 일관된 결과를 보장할 수 없다. 하드웨어까지 직접 임대하여 서비스를 구성하는 수준까지 컨트롤 하더라도 기계마다 명령 실행방식이 다르고 다룰 수 있는 숫자 범위가 다르다. 하물며 파운데이션 모델이면 오죽할까.

환각

가장 치명적이다. 쉽게말해 헛소리 하는거다. 하지만 환각에 대한 명확한 규명은 제시되지는 못했다. 가설은 두 가지가 있다.

  1. 딥마인드의 오르테가(Ortega) 등이 처음 제시[12]
    1. 언어모델이 주어진 데이터와 자신이 생성한 데이터를 구별하지 못하기 때문
    2. 이를 자기 기만(self-delusion)으로 지칭함
  2. 오픈AI 연구원인 레오 가오(Leo Gao)가 처음 제시[13]
    1. 모델의 내부 지식과 레이블러의 내부 지식이 일치하지 않기 때문
    2. SFT(지도 파인 튜닝)과정에서 레이블러가 작성한 답을 모델이 모방하도록 가르침

따라서, 환각을 멈출 수 없다면 최소한 모델이 환각을 일으킬 때를 탐지하도록 하는 것이 좋을 것이다. 4장에서는 환각을 감지하고 측정하는 방안에 대해, 5장 및 6장에서는 프롬프팅과 컨텍스트 구성 기법에 대해 살펴본다.

마무리

파운데이션 모델은 방대한 데이터와 트랜스포머 아키텍처, 그리고 스케일링 법칙에 따른 거대 자본의 투입으로 탄생하지만, 자기 지도 학습의 한계로 인해 사용자의 의도와 어긋나는 출력을 생성하기도 한다. 이를 해결하기 위해 사후 학습(SFT, 선호도 튜닝)과 확률적 샘플링 기법을 동원하여 모델의 창의성과 대화 능력을 끌어올리지만, 이 과정에서 발생하는 비일관성과 환각(Hallucination)은 모델이 가진 태생적 불확실성을 보여준다.

따라서 AI 엔지니어링의 핵심은 이러한 모델의 확률적 특성을 인정하되, 이를 방치하지 않고 공학적으로 제어하는 체계적인 워크플로를 설계하는 데 있다. 그 첫 번째 단계는 모델의 실패와 변화를 즉각적으로 감지할 수 있는 견고한 평가 파이프라인을 구축하는 것이며, 이를 통해 결정론적이지 않은 모델을 최소한 예측 가능하고 신뢰할 수 있는 시스템으로 안착시키는 것이 목표다


  1. 2022년, 2023년 기준 ↩︎

  2. https://arvix.org/abs/2306.11644 ↩︎

  3. https://arxiv.org/abs/2304.05613 ↩︎

  4. '어떤 기준과 비교했을 때 상대적으로 적다'는 의미. ↩︎

  5. https://oreil.ly/Zq5Sw ↩︎

  6. https://oreil.ly/JX37g ↩︎

  7. https://oreil.ly/M1Nsc ↩︎

  8. https://oreil.ly/F76hq ↩︎

  9. 실제 필요한 메모리는 더 크다. 이는 7장의 모델 메모리 사용량 계산방안에서 살펴본다. ↩︎

  10. https://arxiv.org/abs/2112.11446 ↩︎

  11. https://arxiv.org/abs/2203.02155 ↩︎

  12. https://arxiv.org/abs/2110.10819#deepmind ↩︎

  13. https://orail.ly/9idN4 ↩︎