# [논문 리뷰] Training language models to follow instructions with human feedback (InstructGPT) > **저자:** Long Ouyang et al. (OpenAI) > **학회/년도:** NeurIPS 2022 > **논문 링크:** [arXiv:2203.02155](https://arxiv.org/abs/2203.02155) ---

목차


1. Summary

이 논문이 해결하고자 하는 핵심 문제와 해결 방법을 요약합니다.

"Making language models bigger does not inherently make them better at following a user’s intent. For example, large language models can generate outputs that are untruthful, toxic, or simply not helpful to the user."
  1. 모델 스케일링의 한계 직시: 단순히 파라미터 수를 키우는 스케일링만으로는 LLM이 사용자의 실제 의도(Intent)를 파악하고 지시에 따르게 만들 수 없음을 지적합니다.
  2. RLHF 기반 정렬(Alignment): 인간의 선호 피드백을 보상 신호로 활용하여 모델을 파인튜닝하는 RLHF(Reinforcement Learning from Human Feedback) 방법론을 제시합니다.
  3. 압도적인 효율성 증명: RLHF로 학습된 1.3B 크기의 InstructGPT가 100배 이상 큰 175B GPT-3보다 인간 평가자들에게 훨씬 더 안전하고 유용한 답변을 생성하는 것으로 선호됨을 확인했습니다.

2. Introduction & Motivation

"This is because the language modeling objective used for many recent large LMs—predicting the next token on a webpage from the internet—is different from the objective 'follow the user’s instructions helpfully and safely'."
  • What is the limit?: 기존 GPT-3 모델의 목적 함수는 인터넷 본문에서 **'다음 토큰 예측(Next-token prediction)'**을 수행하도록 설계되었습니다. 이 모델은 사용자에게 도움을 주거나 유해성을 검열하려는 내재적 목적이 없기 때문에, 지시와 무관한 텍스트를 나열하거나 거짓 정보를 사실처럼 말하는 환각(Hallucination), 적대적인 답변 등의 오정렬(Misalignment) 문제를 유발합니다.
  • What is the key idea?: 논문은 Askell et al. (2021)의 정의를 인용하여 모델이 **Helpful(유익성), Honest(진실성), Harmless(무해성)**라는 세 가지 핵심 가치(3Hs)에 부합하도록 정렬(Alignment)되어야 함을 강조합니다.
    "Using the language of Askell et al. (2021), we want language models to be helpful (they should help the user solve their task), honest (they shouldn’t fabricate information or mislead the user), and harmless (they should not cause harm to people or the environment)."
    이를 위해 실제 사용자의 API 입력 프롬프트와 전문 레이블러(Labeler) 그룹의 평가를 결합한 **RLHF 3단계 파이프라인**을 제안합니다.

3. Methodology

InstructGPT의 학습 프로세스는 Supervised Fine-Tuning(SFT), Reward Modeling(RM), 그리고 강화학습(PPO) 세 단계로 나뉩니다.

3.1 핵심 아키텍처 및 데이터셋

각 학습 과정에 쓰인 데이터셋의 규모와 성격은 다음과 같이 상세히 구별됩니다.

  • SFT 데이터셋 (약 13k prompts): 레이블러가 직접 프롬프트를 작성하고 그에 맞는 정답(Demonstration)을 수작업으로 적어 만든 데이터셋입니다.
  • RM 데이터셋 (약 33k prompts): 모델이 생성한 여러 답변 후보에 대해 레이블러가 선호도 순위를 매긴 데이터셋입니다.
  • PPO 데이터셋 (약 31k prompts): 인간의 라벨링 피드백 없이, 실제 API 환경에서 사용자가 제출한 다양한 프롬프트로만 구성되어 강화학습 루프에 공급됩니다.

3.2 수식 및 목적 함수

논문에서 다루는 핵심 수식 두 가지를 상세히 분석합니다.

A. 보상 모델(Reward Model, RM)의 손실 함수

인간의 상대적 선호도를 효과적으로 학습하기 위해, 하나의 프롬프트 $x$에 대해 출력한 여러 답변들($K$개, 실제 실험에서는 $K=4$에서 $K=9$ 사이의 값 사용)을 레이블러가 정렬한 정보를 기반으로 Pairwise 비교를 수행합니다.

$$ \text{loss}(\theta) = -\frac{1}{\binom{K}{2}} \mathbb{E}_{(x, y_w, y_l) \sim D} \left[ \log \sigma (r_\theta(x, y_w) - r_\theta(x, y_l)) \right] $$
  • $r_\theta(x, y)$는 파라미터 $\theta$를 가진 보상 모델이 프롬프트 $x$와 답변 $y$에 대해 매긴 스칼라 점수입니다.
  • $y_w$(winner)는 인간이 선호하는 답변, $y_l$(loser)는 덜 선호하는 답변입니다. 두 답변 간의 점수 차이가 커지도록 모델을 학습시킵니다.
  • 단순 Pairwise를 넘어 한 번에 $\binom{K}{2}$쌍의 비교 결과를 하나의 미니 배치로 처리하여 연산 효율성(Overfitting 방지 포함)을 크게 높였습니다.

B. PPO-ptx 목적 함수 (강화학습 핵심 수식)

보상 모델을 해킹하여 문장이 붕괴되는 현상(Reward Hacking)과 기존 언어 모델 성능의 유실(Alignment Tax)을 방지하기 위해 설계된 복합 목적 함수입니다.

$$ \text{obj}(\theta) = \mathbb{E}_{(x, y) \sim D_{\pi_\theta^{\text{RL}}}} \left[ R_\psi(x, y) - \beta D_{\text{KL}}(\pi_\theta^{\text{RL}}(y|x) \parallel \pi^{\text{SFT}}(y|x)) \right] + \gamma \mathbb{E}_{x \sim D_{\text{pretrain}}} \left[ \log \pi_\theta^{\text{RL}}(x) \right] $$
  • 보상 최대화 ($R_\psi(x, y)$): 보상 모델로부터 고득점을 유도하여 인간의 의도에 어울리는 응답을 만듭니다.
  • KL Divergence 제약 ($\beta D_{\text{KL}}$): 강화학습 중인 정책 모델($\pi_\theta^{\text{RL}}$)이 초기 지도학습 모델($\pi^{\text{SFT}}$)과 급격히 달라지는 것을 막아, 리워드 모델의 빈틈을 파고드는 기만적인 답변(Reward Hacking) 생성을 억제합니다.
  • 사전 학습 손실 추가 ($\gamma \mathbb{E}[\log \pi_\theta^{\text{RL}}(x)]$): 공공 NLP 벤치마크 데이터셋 등에서 모델의 전반적인 지식 수준이 저하되는 현상인 **정렬 세금(Alignment Tax)**을 완화하기 위해 기존 pre-training 데이터셋 $D_{\text{pretrain}}$의 그래디언트를 일정 비율로 섞어주는 장치입니다.

4. Experiments & Results

논문이 제시하는 구체적인 수치와 실험 데이터는 다음과 같습니다.

"when compared directly, 175B InstructGPT outputs are preferred to GPT-3 outputs 85 ± 3% of the time, and preferred 71 ± 4% of the time to few-shot GPT-3."
  • 인간 선호도 비교 우위: 175B InstructGPT는 원래의 GPT-3 대비 85 ± 3%의 승률을 기록했으며, 정밀한 Few-shot 프롬프트를 먹인 GPT-3와 직접 대조해도 71 ± 4%의 높은 확률로 선호되었습니다.
  • 진실성(Truthfulness) 및 안전성: TruthfulQA 벤치마크 평가 결과, InstructGPT는 거짓 정보를 출력하거나 편향된 답변을 생성하는 경우가 유의미하게 억제되었습니다.
  • 학술용 벤치마크 데이터와의 괴리 발견: FLAN 및 T0와 같이 학계에서 구축한 Instruction 파인튜닝 데이터로 학습시킨 모델보다 InstructGPT가 월등히 우수한 선호도를 보였습니다. 논문은 그 이유를 아래와 같이 분석합니다.
    "We believe this is partly because academic datasets focus on tasks where performance is easily measured, like classification and QA, while our API distribution consists of mostly (about 57%) open-ended generation tasks."
    즉, 학술용 벤치마크는 분류나 단순 질의응답 중심이었지만, 실제 유저들이 사용한 API 환경은 약 57%가 자유도가 높은 열린 결말 형태의 텍스트 생성(Open-ended generation)이었기 때문에 실전 대응 능력에서 차이가 벌어진 것입니다.

5. Discussion & Takeaways

이 논문이 모델 연구자들에게 전하는 진정한 교훈과 한계점입니다.

  • 강점 (Pros) - 효율적 정렬: 파라미터 모델을 100배 증설하지 않고도, **소규모 선호도 라벨 데이터와 RLHF 설계**를 통해 100배 큰 모델을 유용성 측면에서 능가할 수 있음을 입증했습니다. 이는 거대 인프라 비용 장벽에 막힌 AI 업계에 스케일만이 전부가 아니라는 중요한 돌파구를 제시했습니다.
  • 한계점 (Cons) - 평가 집단의 편향성: 훈련 데이터를 라벨링한 약 40명의 작업자(contractors) 집단이 전 인류의 보편적인 윤리적, 문화적 합의를 대변할 수 없다는 태생적 한계가 존재합니다. 모델의 가치관 정렬이 특정 소수 라벨러의 성향에 지나치게 좁혀지는 **'정렬 가치 판단(Whose alignment?)'** 문제가 발생합니다.
  • 적용 방안 (Future Work): 최근 LLM 연구에서는 RLHF의 높은 자원 소모와 불안정성을 대체하기 위해, 보상 모델 없이 동작하는 DPO(Direct Preference Optimization)나, 대규모 언어 모델을 피드백 파트너로 이용하는 RLAIF(AI Feedback)로 발전해가고 있습니다. InstructGPT의 3단계 설계 구조는 이러한 Preference Alignment 연구의 모든 모태가 되고 있으므로 확실하게 짚고 넘어가야 합니다.

문제 출처: chat gpt 생성


문제

당신은 커머스 플랫폼의 데이터 분석가입니다.
사용자 행동 로그를 통해, "첫 방문 후 첫 구매까지 걸린 일 수" 를 측정하려 합니다.

테이블: user_logs

user_id 사용자 ID
event_date 날짜 (DATE 타입)
event_type 행동 유형 ('visit', 'purchase')

각 사용자별로, 첫 visit 이후 첫 purchase까지 걸린 일 수를 계산하세요.
단, 구매가 없으면 제외합니다.

출력 컬럼

user_id 사용자 ID
days_to_purchase 첫 visit 이후 구매까지 걸린 일 수

답안

with fst_visit as (
select user_id
    , event_date
    from (select user_id
    , event_date
    , rank() over(partition by user_id order by event_date) as rank
from user_logs
    where event_type='visit')
where rank =1
    )
, fst_pur as (
select user_id
    , event_date
    from (select user_id
    , event_date
    , rank() over(partition by user_id order by event_date) as rank
from user_logs
    where event_type='purchase')
where rank =1
    )
select user_id
, datediff(p.event_date, v.event_date) as days_to_purchase
from fst_visit v 
join fst_pur p
on v.user_id=p.user_id and v.event_date<=p.event_date
order by user_id

문제 출처: chat gpt 생성


문제

당신은 실험 설계를 담당한 데이터 분석가입니다.
웹사이트에서 두 가지 버튼 디자인(A와 B)의 클릭 효과를 실험하고 있습니다.

table : ab_test_logs

user_id 사용자 고유 ID
test_group 실험 그룹 ('A', 'B')
event_date 행동 발생 날짜 (DATE 타입)
action 사용자 행동 ('view', 'click')

각 실험 그룹(A와 B)에서 전환율(CTR: 클릭률)을 계산하세요.
결과는 그룹별로 1행씩 출력하고, 전환율은 소수점 4자리까지 출력해주세요.

 


답안

with log as (
select event_date
    , user_id
    , test_group 
    , case when action='view' then 1 else 0 end as view_yn
    , case when action='click' then 1 else 0 end as click_yn
from ab_test_logs
group by 1,2,3,4,5)
--한 날짜에 발생한 view와 click 기준으로 CTR을 집계하기 위함
, log2 as (
select event_date
    , user_id
    , test_group
    , max(view_yn) as view_yn
    , max(click_yn) as click_yn
from log)
, ctr as (
select event_date
, test_group
, sum(view_yn) as view_cnt
, sum(click_yn) as click_cnt
from log2
group by 1,2)
---일자별로 view와 click 합산 먼저 진행하여 같은 날짜에서 발생한 이벤트 기준으로만 CTR집계
select 
test_group
, sum(view_cnt) as view
, sum(click_cnt) as click 
, round(sum(click_cnt)/sum(view_cnt),4) as CTR
from ctr

문제 출처: chat gpt 생성


문제

당신은 웹 서비스의 데이터 분석가입니다.
user_logs 테이블에는 사용자의 행동 기록이 저장되어 있습니다.

user_id 사용자 고유 ID
event_date 사용한 날짜 (DATE 형식)
event_type 행동 유형 ('visit', 'purchase' 등)


같은 사용자가 특정 방문일 이후 2일 이내에 다시 방문한 기록이 있는 경우,
그 사용자 ID와 최초 방문일을 출력하세요.


답안1

with visit_rk as (
select user_id
    , event_date
    , dense_rank() over(partition by user_id order by event_date) as visit_rk
from user_logs
where event_type = 'visit')
select other_visit.user_id
, fst_visit.event_date
from (select * from visit_rk where visit_rk = 2) other_visit
join (select * from visit_rk where visit_rk =1 ) fst_visit
on other_visit.user_id=fst_visit.user_id
group by 1, 2
having datediff(other_visit.event_date, fst_visit.event_date) <= 2

답안2

with visit_rank as (
select user_id
    , event_date
    , dense_rank() over(partition by user_id order by event_date) as visit_rank
from user_logs
where event_type='visit')
, rk_1_2 as (
select user_id
    , max(case when visit_rank=1 then event_date) as fst_visit
    , max(case when visit_rank=2 then event_date) as second_visit
from visit_rank)
select user_id
, fst_visit
from rk_1_2
where datediff(second_visit, fst_visit) <=2

난이도: level 4
문제 출처: 프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/276035


Q. FrontEnd 개발자 찾기

DEVELOPERS 테이블에서 Front End 스킬을 가진 개발자의 정보를 조회하려 합니다. 조건에 맞는 개발자의 ID, 이메일, 이름, 성을 조회하는 SQL 문을 작성해 주세요. 결과는 ID를 기준으로 오름차순 정렬해 주세요.


최초 풀이과정

  1. 문제 요구 조건 확인
    DEVELOPERS 테이블에서 Front End 스킬을 보유한 개발자 정보 조회 → 스킬 테이블과 매핑 필요

  2. 테이블 결합 조건 설정
    DEVELOPERS 테이블이랑 SKILLCODES 테이블은 SKILL_CODE <> CODE를 key값으로 매핑

  3. 필터링 조건 설정
    SKILLCODES 테이블의 NAME = 'Front End'

  4. 필요 칼럼
    - DEVELOPERS. ID
    - DEVELOPERS. EMAIL
    - DEVELOPERS. FIRST_NAME
    - DEVELOPERS. LAST_NAME

  5. 최종 뷰 조건
    - DEVELOPERS. ID ASC

초기 답안

select d.ID
, d.EMAIL
, d.FIRST_NAME
, d.LAST_NAME
from DEVELOPERS d
where d.SKILL_CODE & (select s.CODE from SKILLCODES s where s.CATEGORY='Front End') != 0
  • 어려웠다...
  • 일단 2진수 개념을 이해하는데 쪼오금 시간이 걸림
    • 2진수 1 & 2진수 2로 연산하면, 1 안에 들어있는 2를 반환해줌
      • 예를 들면, 400 & 256 = 256, 400 & 62 = 0 (없으니까)
  • 그리고 join 할 때 그냥 습관적으로 left join을 하는 경향이 있는데,
    • 이번 같은 경우는 join으로 해결해서 where 없이 쓰는게 더 간편하고 성능 우수함.
    • join + on 조건으로 필터링 효과까지 
  • 마지막으로...그냥 결과를 내면, 한 사람이 여러개의 프론트 엔드 기술을 가진 경우 한 ID에 여러 행이 발생함
    • 이를 방지하기 위해 DISTINCT 처리 해줘야 함

최종 답안

select distinct d.ID
, d.EMAIL
, d.FIRST_NAME
, d.LAST_NAME
from DEVELOPERS d
join SKILLCODES s
on d.SKILL_CODE&s.CODE != 0
where s.CATEGORY='Front End'
order by d.ID

짚고 넘어갈 것

  1. JOIN
    • JOIN 타입
      • LEFT JOIN : 왼쪽 테이블 데이터 유지, 오른쪽은 겹치는 부분만 가져오고 없으면 NULL
      • INNER JOIN (JOIN): 양쪽 테이블에 모두 존재하는 경우만 유지(교집합)
    • ON 절
      • 역할: 조인할 조건 (매핑 / 필터링 포함)
      • 단순 key 비교뿐 아니라, 조건 논리도 가능(=, !=, >, &, LIKE)
  2. 2진수 비교 시 & (비트 AND 연산자) 개념
    • & 연산 쓰임 : 조합형 상태값 분석에 자주 쓰임
    • 예시 : user.PERM & 4 != 0 →3번째 권한(4=100)을 가졌는지 확인

난이도: Level 3
문제 출처: 프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/59042


Q. 없어진 기록 찾기

입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.


풀이 과정_최초

  1. 문제 요구 조건 확인
    입양을 간 기록(ANIMAL_OUTS) 기록은 있으나, 보호소에 들어온 기록(ANIMAL_INS)은 없는 row 찾기

  2. 테이블 결합 조건 설정
    입양 간 기록은 있으나, 보호소 기록은 없는 row 정의
    = ANIMAL_OUT에 있는 ID 중 ANIMAL_INS에는 없는 ID select

  3. 필터링 조건 설정
    join + null로 필터링

  4. 필요 칼럼
    - ANIMAL_ID
    - NAME

  5. 최종 뷰 조건
    - ID와 NAME으로 asc

답안

select ANIMAL_ID
,NAME
from ANIMAL_OUTS
where ANIMAL_ID not in (
select ANIMAL_ID
from ANIMAL_INS)
order by 1,2
  • 정확도: 입소기록 없는 ANIMAL_ID만 출력, 출력 컬럼 이상 없음, 정렬 기준 적합
  • 성능: NOT IN 사용 시 성능 저하 가능성
  • 가독성: 들여쓰기, 컬럼 정렬 등 우수
  • 견고성: NOT IN과 NULL 처리 > ANIMAL_INS.ANIMAL_ID는 NOT NULL이므로 안전함 ✅

개선안

SELECT ANIMAL_ID,
       NAME
FROM ANIMAL_OUTS o
WHERE NOT EXISTS (
    SELECT 1
    FROM ANIMAL_INS i
    WHERE o.ANIMAL_ID = i.ANIMAL_ID
)
ORDER BY ANIMAL_ID, NAME;
  • NOT EXIST 사용 → 서브 쿼리에 NULL이 있는 경우 더 안전한 방법
    • 서브 쿼리에 NULL이 있는경우
      • NOT IN : Null이 하나라도 있으면 NOT IN 전체가 NULL 처리 → 아무 결과도 안나옴
      • NOT EXIST : true/false로 판단하여 Null이 있어도 정상 작동

+ Recent posts