<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>tu11p</title>
        <link>https://velog.io/</link>
        <description>Anyone can be anything ... with agent!</description>
        <lastBuildDate>Fri, 02 May 2025 04:22:55 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>tu11p</title>
            <url>https://velog.velcdn.com/images/dutch-tulip/profile/a4e6a144-4488-42cf-8401-3ec6a8ef0fef/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. tu11p. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dutch-tulip" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[논문 리뷰] Exploring Expert Failures Improves LLM Agent Tuning (2025)]]></title>
            <link>https://velog.io/@dutch-tulip/EEF</link>
            <guid>https://velog.io/@dutch-tulip/EEF</guid>
            <pubDate>Fri, 02 May 2025 04:22:55 GMT</pubDate>
            <description><![CDATA[<p>(Thumbnail Image made with ChatGPT)</p>
<p><a href="https://arxiv.org/abs/2504.13145">논문 링크</a></p>
<p>From arXiv, 2025.04</p>
<h1 id="3줄-요약">3줄 요약</h1>
<ul>
<li>기존 LLM Agent Fine-Tuning 방법인 RFT는 간단한 작업만 잘한다.</li>
<li>어려운 작업을 해결하는 Agent Tuning 방법은 뭐가 있을까?</li>
<li>실패한 경로에서 ‘유용한 행동’을 식별해서 학습에 활용하면 성능 향상 → 우리가 제안하는 EEF</li>
</ul>
<h1 id="0-abstract">0. Abstract</h1>
<ul>
<li>Rejection Sampling Fine-Tuning(RFT)은 LLM을 agent로 Fine tuning하는 효과적 방법으로 부상<ul>
<li>전문가가 생성한 성공적인 trajectories를 모방하고,</li>
<li>성공적인 자가-생성 trajectories에 대한 반복적인 fine-tuning을 통해 agent 기술 향상</li>
</ul>
</li>
<li>GPT-4와 같은 전문가는 주로 더 간단한 작업에서 성공적, RFT는 본질적으로 간단한 시나리오 선호<ul>
<li>복잡한 작업은 OOD(Out of Distribution), 해결되지 않음</li>
</ul>
</li>
<li>실패한 전문가 경로에서 유익한 행동을 식별해 까다로운 작업에 대해 탐색 효율과 성능 향상에 도움을 줄 수 있음을 발견<ul>
<li>Exploring Expert Failures (EEF)</li>
</ul>
</li>
</ul>
<h1 id="1-introduction">1. Introduction</h1>
<ul>
<li>LLM을 에이전트로 활용할 때 주로 사용하는 RFT 방식은 간단하고 효과적이지만, 고난도 task에서는 여전히 해결되지 않는 부분이 많음</li>
<li>RFT는 전문가가 생성한 성공적인 예시만을 사용해 모델을 학습하고, 더 단순한 task를 선호<ul>
<li>복잡한 OOD task는 무시되고 해결되지 않음</li>
</ul>
</li>
<li>Exploring Expert Faliures (EEF) 제안<ul>
<li>실패한 전문가 경로에도 적절한 계획, 탐색 전략 등의 유용한 행동이 포함되어 있으며, 이를 적극적으로 추출해 학습하는 접근</li>
</ul>
</li>
<li>WebShop에서 62% 승률 및 0.81 초과, SciWorld에서 81점 초과 달성하며 새로운 SOTA 달성</li>
</ul>
<h1 id="2-background">2. Background</h1>
<ul>
<li>Text-based LLM Agent의 상호작용<ul>
<li>Markov Decision Process(MDP)로 모델링.</li>
</ul>
</li>
<li>RFT 기법<ul>
<li>초기: GPT-4와 같은 전문가가 성공적인 경로 생성 후 positive 경로만 학습 데이터로 사용</li>
<li>반복: agent가 탐색 성공한 경로를 추가하여 재파인튜닝하는 과정 반복</li>
</ul>
</li>
<li>WebShop<ul>
<li>실제 Amazon 상품 목록을 통해 온라인 쇼핑 행동을 시뮬레이션 하는 e-커머스 플랫폼</li>
<li>Language understanding과 Multistep decision making을 연구하기 적합</li>
</ul>
</li>
</ul>
<h1 id="3-methodology">3. Methodology</h1>
<h2 id="31-motivation">3.1 Motivation</h2>
<ul>
<li>Webshop 실험에서 GPT-4조차 35%의 낮은 성공률<ul>
<li>나머지 65%는 OOD 상태</li>
</ul>
</li>
<li>실패한 경로에도 유용한 탐색 및 recovery 행동이 포함<ul>
<li>Ex) GPT-3가 failure 후 Back을 사용해 recover을 시도하는 등의 행동은 agent에게 학습 가치</li>
</ul>
</li>
</ul>
<h2 id="32-exploring-expert-failure-eef">3.2 Exploring Expert Failure (EEF)</h2>
<p>3 main phases:</p>
<ul>
<li>Behavior Cloning: 전문가가 만든 긍정적(positive)한 경로를 모방해 기초 능력 학습</li>
<li>Exploration: 모델이 스스로 혹은 전문가 상태로부터 탐색</li>
<li>Fine-tuning: 유익한 행동만을 선별해 추가 학습</li>
</ul>
<ol>
<li>Behavior Cloning (Algo 1. line 4)<ul>
<li>Input: 전문가 데이터셋</li>
<li>긍정적 경로 중 보상 1인 것만 사용</li>
<li>시퀀스 중 Action 부분만 마스킹하여 학습해 정책(πθ) 초기화</li>
</ul>
</li>
<li>Exploration (Algo 1. line 6-10)<ul>
<li>정책(πθ)을 사용해 학습 데이터의 초기 상태 및 전문가 실패 경로 중 선택된 state에서 탐색</li>
<li>전문가 경로 τ_e에서 M개의 구간 선택해 시뮬레이션 → beneficial actions 추출</li>
</ul>
</li>
<li>Reinforcement Fine-Tuning (Algo 1. line 11-15)<ul>
<li>시뮬레이션에서의 긍정적 경로 중, 중요한 state 기준으로 need recover state(복구 필요 상태)를 식별</li>
<li>해당 상태에 대해 가장 효과적인 경로를 선택하고 그 이후 행동만 학습</li>
</ul>
</li>
</ol>
<p>구체적 Algorithm :</p>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/373e87a9-8a89-4bc1-b07a-efdc60d21d4c/image.png" alt=""></p>
<ul>
<li>전문가 데이터셋 D_e로부터 보상 <code>R(τ_e) = 1</code>인 경우만 초기 학습에 사용</li>
<li>for :<ul>
<li>모델을 환경에서 실행해 경로 수집</li>
<li>전문가 실패 경로에서 일정 간격으로 상태를 선택하고, 거기에서 정책을 실행해 성공 여부 확인</li>
<li>성공 경로는 D+에 저장</li>
<li>실패한 지점 기준으로 need recover state S_r 추출하고, 그 상태로부터 성공적인 경로가 있으면 학습에 사용</li>
</ul>
</li>
</ul>
<p>‘유익한 행동’의 정의와 선택 기준?</p>
<ul>
<li><strong>실험적 시뮬레이션 기반</strong>:<ul>
<li>전문가 실패 trajectory (<code>τe</code>)의 여러 상태(<code>si</code>)에서 현재 policy (<code>πθ</code>)로 시뮬레이션을 수행</li>
<li>만약 어떤 전문가 상태 <code>sl</code>에서 시작해서 성공하는 trajectory (<code>τsl</code>)를 만들 수 있다면, <code>sl</code>에 도달하기까지의 행동들(<code>a0~al-1</code>)은 <strong>유익한 행동</strong>으로 간주</li>
</ul>
</li>
<li><strong>회복(recovery) 행동 식별</strong>:<ul>
<li>이전 상태(<code>si−l</code>)에서는 성공했지만, 다음 상태(<code>si</code>)에서는 실패하면, <code>ai−l</code>~<code>ai−1</code> 구간의 행동은 <strong>잠재적 문제 행동</strong>으로 취급</li>
<li>이 실패한 상태 <code>si</code>에서 성공적인 trajectory가 생성되면, 이후 행동(<code>ai</code> 이후)만을 학습 데이터로 사용</li>
</ul>
</li>
<li><strong>데이터 편향 방지</strong>:<ul>
<li>동일한 상태에 대한 multiple positive trajectories가 있을 경우, <strong>가장 전문가 행동이 적은(shortest expert actions)</strong> trajectory를 선택해서 일반화 능력을 높임</li>
<li>이는 특정 도메인 행동으로 과적합(overfitting)되는 것을 방지하는 전략</li>
</ul>
</li>
<li><strong>Loss Masking 적용</strong>:<ul>
<li>선택된 beneficial actions 이후의 행동에만 학습 손실이 적용되며, 문제 행동이나 실패한 행동은 학습하지 않음</li>
</ul>
</li>
</ul>
<h1 id="4-experiments"><strong>4. Experiments</strong></h1>
<h2 id="41-experimental-settings">4.1 Experimental Settings</h2>
<ul>
<li>데이터셋:<ul>
<li>WebShop 11k(전체), 3k(일부 샘플)</li>
<li>ScienceWorld 2k (20단계 내외의 긴 trajectory 필요)</li>
</ul>
</li>
<li>비교 대상:<ul>
<li>No Fine-Tune: GPT-3.5, GPT-4</li>
<li>Fine-Tune Only: SFT-ALL, SFT-POS, NAT</li>
<li>Exploration 기반: ETO, RFT, RFT×6</li>
<li>제안 방식: EEF GPT-4, EEF GPT-3&amp;4</li>
</ul>
</li>
<li>모델 세팅:<ul>
<li>Base Model: LLama3 8B Instruct</li>
<li>학습 파라미터: 6 epoch, lr=5e-5, batch size=64</li>
<li>반복 횟수 I=4, 시뮬레이션 횟수 M=5</li>
</ul>
</li>
</ul>
<h2 id="42-main-results">4.2 Main Results</h2>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/92788497-8153-4816-b59b-c1e93bbdc5a6/image.png" alt=""></p>
<ul>
<li>Win Rate (Table 3):<ul>
<li>Webshop 11k: RFT×6 → 53.6% vs EEF GPT-4 → 58.4%, EEF GPT-3&amp;4 → 62.0%</li>
<li>Webshop 3k: RFT×6 → 41.4% vs EEF GPT-4 → 46.8%, EEF GPT-3&amp;4 → 50.0%</li>
<li>SciWorld: RFT×6 → 62.5% vs EEF GPT-4 → 68.5% (SOTA)</li>
</ul>
</li>
<li>해석:<ul>
<li>EEF는 기존 RFT 기반 방식보다 휠씬 높은 성능</li>
<li>특히 GPT-3.5 Turbo 데이터를 추가하면, 비용 효율성을 유지하면서 성능이 더 향상</li>
<li>EEF는 RFT의 구조는 유지하되, 실패 경로를 적극적으로 활용하는 것이 차별점</li>
</ul>
</li>
</ul>
<h2 id="43-ablation-studies">4.3 Ablation Studies</h2>
<ul>
<li>Navigation Skill 개선<ul>
<li>Next / Back 사용 성공률 및 시도율 측정</li>
<li>GPT-4는 시도율은 높으나 성공률 낮음 → 실행 역량 부족</li>
<li>EEF는 시도율, 성공률 모두 높음 → 해당 스킬 습득 및 실용화 성공</li>
</ul>
</li>
<li>Case Studies<ul>
<li>어려운 과제에서는 단순히 첫 페이지 상품을 선택하면 실패</li>
<li>EEF는 Next, Back 등의 행동을 사용해 조건에 맞는 제품 탐색</li>
<li>Ex) 원한 색상, 가격 조건을 갖춘 샴푸나 가구를 찾기 위해 여러 페이지 탐색</li>
</ul>
</li>
<li>Exploration Efficiency<ul>
<li>적은 시뮬레이션(M=2)으로도 40% win rate</li>
<li>GPT-3의 trajectory 탐색이 GPT-4보다 더 효과적인 경우도 있음 → 다양성, 편향 탈피 가능성</li>
</ul>
</li>
<li>Model Generalization<ul>
<li>mistral-7b-v0.3 모델에도 EEF 적용 시 동일한 성능 우수함 입증</li>
</ul>
</li>
</ul>
<h1 id="5-related-work">5. Related Work</h1>
<ul>
<li>LLM 기반 에이전트 학습 방식은 크게 3가지<ol>
<li>Fine-tune 없이 Prompt만 조정</li>
<li>Exploration 없이 Fine-tune (SFT 등)</li>
<li>Exploration 포함 Fine-tune (RFT, ETO, EEF 등)</li>
</ol>
</li>
<li>대부분은 trajectory 전체를 하나의 보상으로 취급하지만, EEF는 stepwise 분석으로 유익한 행동만 학습</li>
</ul>
<h1 id="6-conclusion-and-future-work">6. Conclusion and Future Work</h1>
<ul>
<li>결론:<ul>
<li>EEF는 실패한 전문가 trajectory 속 유익한 행동을 학습에 포함하여 RFT보다 성능 향상</li>
<li>GPT-3.5 같은 약한 전문가의 trajectory에서도 유용한 정보 추출 가능</li>
<li>SFT만 사용하기에 단순하고 효율적이며, reward 모델 불필요</li>
</ul>
</li>
<li>미래 방향:<ul>
<li>선택된 행동만을 사용한 preference learning</li>
<li>Binary Search 기반 beneficial action 탐색</li>
<li>MCTS 같은 트리 탐색 알고리즘과의 결합</li>
<li>전문가 소스 간 비용-효율 trade-off 전략 탐색</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning (2025)]]></title>
            <link>https://velog.io/@dutch-tulip/DeepSeek-R1</link>
            <guid>https://velog.io/@dutch-tulip/DeepSeek-R1</guid>
            <pubDate>Mon, 03 Feb 2025 05:15:25 GMT</pubDate>
            <description><![CDATA[<p><a href="https://github.com/deepseek-ai/DeepSeek-R1/blob/main/DeepSeek_R1.pdf">논문 링크</a></p>
<p>From DeepSeek, 2025.01</p>
<p>(이 글은 논문을 바탕으로 재구성하여 쓴 글이므로 인덱스는 원 논문의 인덱스와 상이합니다.)</p>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/4d17c948-93fa-465f-8f5a-b3594a6740d0/image.png" alt=""></p>
<h1 id="서론">서론</h1>
<p>DeepSeek-R1. 요즘 워낙 핫한 논문이라 연휴지만 안 읽어볼 수 없었다. o1급 성능을 구현하는데 모델 학습에 시간은 280만 H800 GPU hour 정도, 비용은 80억원 정도 밖에 들지 않았다고 한다.</p>
<p>이 논문이 발표되자마자 미국 기술주들(특히 매그니피센트 7)의 주가는 하락했다. 특히 GPU 물량빨로 학습을 이어나가는 추세에서 가성비있는 학습이 가능해짐이 보여지자 엔비디아는 17%가량 폭락했다(물론 다음날 상당 부분 회복했지만).</p>
<p>그렇다면 DeepSeek-R1은 어떻게 o1 수준의 성능을 적은 양의 학습으로 구현한 것일까?</p>
<p>바로 강화학습(Reinforcement Learning)을 통해 모델의 자율적인 추론 능력을 개발했다고 한다.</p>
<p>물론 기존 모델도 강화학습을 사용한다. 하지만 기존 모델들은 대규모 데이터 수집을 통한 지도학습(Supervised Fine-Tuning, SFT)으로 기본적인 능력을 학습한 이후에 강화학습을 적용했다. DeepSeek-R1은 순수 강화학습을 통해 모델 스스로 추론 능력을 발전시켰다고 한다.</p>
<p>논문에서 제시된 DeepSeek-R1의 핵심 특징 및 기여점은 다음과 같다.</p>
<ul>
<li>지도학습(SFT)없이 강화학습(RL)만으로 추론 능력 발전<ul>
<li>기존 모델들은 지도학습을 통해 먼저 기본적인 능력을 학습한 후 강화학습을 적용했지만, DeepSeek-R1-Zero는 base model(DeepSeek-V3-Base)에 곧바로 강화학습을 적용해 스스로 추론 능력을 발전시켰다.</li>
</ul>
</li>
<li>강화학습을 통해 자율적으로 복잡한 추론 전략 학습<ul>
<li>DeepSeek-R1-Zero는 self-verification, reflection, long CoT generation 등 복잡한 추론을 자율적으로 습득했다</li>
</ul>
</li>
<li>Cold Start 데이터를 활용한 성능 향상<ul>
<li>DeepSeek-R1은 DeepSeek-R1-Zero의 초기 불안정성을 해결하고 성능을 높이기 위해 적은 양의 high quality cold start data를 활용했다.</li>
</ul>
</li>
<li>소형모델 distilation을 통한 효율성 확보<ul>
<li>DeepSeek-R1의 추론 능력을 더 작은 모델로 distill해 효율성을 확보했다.</li>
</ul>
</li>
</ul>
<h1 id="deepseek-r1-의-구조">DeepSeek-R1 의 구조</h1>
<ul>
<li>DeepSeek-R1은 DeepSeek-R1-Zero, DeepSeek-R1의 두 가지 모델로 구성된다.</li>
</ul>
<h2 id="deepseek-r1-zero">DeepSeek-R1-Zero</h2>
<ul>
<li><p>이 모델은 지도 학습 없이 순수 강화학습 만으로 LLM의 추론 능력을 개발할 수 있음을 입증한 모델이다.</p>
</li>
<li><p>DeepSeek-V3-Base 모델을 기반으로 GRPO(Group Relative Policy Optimization) 알고리즘을 사용해 학습되었다.</p>
</li>
<li><p>기존 RL 알고리즘은 보통 정책(policy)과 비슷한 크기의 critic 모델을 사용하여 advantage를 계산</p>
</li>
<li><p>But, GRPO는 critic 모델을 사용하지 않고 그룹 내 sample의 상대적인 reward를 비교하는 방식으로 baseline 설정</p>
</li>
<li><p>GRPO 알고리즘</p>
<ul>
<li><p>critic을 제거하고, 하나의 질문에 대해 여러 개의 답변을 생성한 후 그룹 내에서 상대적인 reward를 비교하여 advantage 추정</p>
</li>
<li><p>GRPO는 critic 모델 없이 group score에서 baseline을 추정해 학습 비용을 절감하는 방식이다.</p>
</li>
<li><p>아래 수식과 같이 GRPO는 policy model 𝜋를 최적화하여 목표를 최대화한다.</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/81bc95db-1694-4111-93f1-e1ec21b51a64/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>    ![](https://velog.velcdn.com/images/dutch-tulip/post/b977d572-1bc4-491d-bc34-1716312ce655/image.png)


- *A*는 어드밴티지, *D_KL*는 Kullback-Leibler 발산, *β*는 하이퍼파라미터이다.</code></pre><ul>
<li><p>Reward Model</p>
<ul>
<li>Accuracy reward와 Format reward의 두 가지 유형의 reward를 사용한다.</li>
<li>Accuracy reward는 응답의 정답 여부를 평가하고, Format reward는 모델이 추론 과정을 <think> 및 </think> 태그 사이에 포함하도록 강제한다.</li>
<li>이 과정에서 Neural reward model은 reward hacking 문제와 추가적인 리소스 문제로 인해 사용하지 않았다.</li>
</ul>
</li>
<li><p>Training Template</p>
<ul>
<li><p>추론 과정과 최종 답변을 순서대로 생성하도록 요구하는 간단한 템플릿 사용</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/2eebdff6-3628-45a2-a4d0-7315e3efc408/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>Performance</p>
<ul>
<li>DeepSeek-R1-Zero는 AIME 2024에서 초기 15.6%에서 71.0%로 크게 향상된 성능을 보였으며, majority vote를 통해 86.7%까지 향상시켜 OpenAI-o1-0912을 능가했다.</li>
</ul>
</li>
<li><p>또한 모델 스스로 추론시간이 증가하면서 복잡한 문제를 해결하는 능력과 self-verification, reflection과 같은 advanced된 행동을 스스로 습득했다.</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/da1fb936-e466-4d47-bbb9-58f1aa85bff1/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p>Aha-moment</p>
<ul>
<li><p>학습을 진행하면서 모델이 스스로 <strong>&quot;생각하는 시간&quot;을 점점 늘리는 패턴</strong>을 보임.</p>
</li>
<li><p>reasoning을 깊이 있게 수행하려는 경향이 <strong>자연스럽게 발생</strong>.</p>
</li>
<li><p>DeepSeek-R1-Zero 학습 과정에서 모델이 중간에 ‘아하 모먼트’를 경험한다는 흥미로운 사실이 있었다고 한다.</p>
</li>
<li><p>이 순간이 발생하면, 모델은 문제에 대한 초기 접근 방식을 재평가하고, 더 많은 추론시간을 할당하는 방법을 학습한다.</p>
<ul>
<li><p>예를 들어, 복잡한 수학 문제에서, 초기 풀이 과정이 막히자, 모델은 스스로  &quot;Wait, wait. Wait. That’s an aha moment I can flag here.”와 같은 인간과 유사한 표현을 사용하며, 이전 단계를 재검토하는 모습을 보인다.</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/dacb91b9-5fa0-446a-94f7-86459902ce95/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>- 이는 강화 학습이 명시적인 지시 없이도 모델 스스로 문제 해결 전략을 발전시킬 수 있다는 강력한 증거이다.</code></pre><ul>
<li>하지만, DeepSeek-R1-Zero는 가독성이 떨어지고, 여러 언어가 섞이는 등의 문제점이 있었다.</li>
</ul>
<h2 id="deepseek-r1">DeepSeek-R1</h2>
<ul>
<li>DeepSeek-R1은 DeepSeek-R1-Zero의 개선된 버전이라고 할 수 있다.</li>
<li>요약하자면, Cold Start data로 사전학습된 base model을 초기 상태로 해서, (DeepSeek-R1-Zero와 동일한)대규모 강화학습을 적용한다. 강화학습이 수렴되면, 이 지점의 checkpoint에서 SFT 데이터를 수집한 뒤, 이 데이터를 기반으로 추가적인 강화학습을 진행한다. 이 강화학습에서는 모델의 helpfulness와 harmlessness를 향상시킨다.</li>
<li>Cold Start<ul>
<li>Cold Start란 데이터 부족이나 초기 상태에서의 학습 부족으로 인해 낮은 성능을 보이거나 최적의 행동을 수행하기 어려운 문제를 보이는 것을 의미한다.</li>
<li>DeepSeek-R1에서의 Cold Start 단계는 RL 초기 단계를 안정화하고 모델의 수렴 속도를 빠르게 하는 데에 목적이 있다.</li>
<li>DeepSeek-R1-Zero는 V3-Base에 직접 RL을 적용해 모델 스스로 추론 능력을 발전시켰는데, 초기 학습 단계에서 불안정성이 크고 수렴 속도가 낮다는 문제점이 있었다.</li>
<li>따라서 DeepSeek-R1은 미리 준비된 고품질의 데이터(Cold Start data)로 모델을 초기화해 이런 문제점을 해결하고자 했다.</li>
<li>Cold Start 데이터 수집 방법 (대망의…)<ul>
<li>데이터는 크게 4가지 방법으로 수집되었다고 합니다. 근데 생성 방식만 다를뿐, 결국은 다 DeepSeek 계열 모델을 기반으로 생성한 거라고 하네요. (<del>절대 GPT는 사용하지 않았답니다!!</del>)<ol>
<li>DeepSeek-R1-Zero에서 생성된 데이터 활용<ul>
<li>순수 RL 모델인 R1-Zero의 응답 일부 선택</li>
<li>Readability가 낮거나 여러 언어가 혼합된 문제가 있는 sample은 필터링</li>
<li>즉, RL only인 R1-Zero에서 자연스럽게 학습된 CoT 패턴을 가져옴</li>
</ul>
</li>
<li>Few-Shot prompting을 통해 V3, V3-Base로 생성<ul>
<li>V3 또는 V3-Base를 활용해 long CoT 데이터 생성</li>
<li>Few-shot으로 정제된 응답 유도</li>
<li>명확하고 논리적인 CoT 데이터 확보</li>
</ul>
</li>
<li>Human Annotator가 DeepSeek 모델 응답 Post-Process<ul>
<li>1), 2) 로 생성된 데이터를 사람이 직접 검토</li>
<li>필요 시 수정하거나, 추가로 재구성해 가독성 향상</li>
<li>인간이 데이터를 새로 생성하지는 않으며, 모델의 응답을 개선하는 과정</li>
</ul>
</li>
<li>Post-processing을 통한 필터링 및 정제<ul>
<li>Markdown 형식 등으로 데이터 정리해 구조화</li>
<li>다국어 혼합 문제 제거</li>
<li>모델 생성 응답 중 논리적 일관성 부족한 부분 수정</li>
</ul>
</li>
</ol>
</li>
<li>데이터 수집 방법까지를 포함한 Cold-Start 데이터를 활용한 다단계(4단계) 학습 전략은 아래와 같이 정리할 수 있겠다<ol>
<li>Cold-Start 데이터 준비<ul>
<li>DeepSeek-V3-Base 모델을 수천 개의 long CoT 데이터를 활용해 fine-tune</li>
<li>Readability를 높이기 위해 정형화된 Formatting</li>
<li>Ex)<ul>
<li>|special_token| <reasoning_process> |special_token| <summary></li>
</ul>
</li>
</ul>
</li>
<li>강화학습<ul>
<li>R1-Zero와 동일한 RL 기법을 적용해 reasoning 능력 강화</li>
<li>Language Consistency Reward 추가<ul>
<li>CoT 내 언어 일관성 유지하도록 유도</li>
<li>but 일부 성능 저하 부작용</li>
</ul>
</li>
</ul>
</li>
<li>Rejection Sampling 및 SFT<ul>
<li>RL이 수렴한 이후, 새로운 SFT 데이터 수집</li>
<li>R1의 checkpoint에서 600K 이상의 reasoning 데이터 생성</li>
<li>non-reasoning data(번역, 요약 등) 200K 추가, 총 800K로 추가 학습</li>
</ul>
</li>
<li>RL for all scenarios<ul>
<li>최종적으로 모든 유형의 입력에 대응할 수 있도록 광범위한 RL 적용</li>
<li>Helpfulness(유용성?) 및 Harmlessness(안정성?) 향상 목표로 reward 모델 조정</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="distillation-증류-모델">Distillation (증류 모델)</h1>
<ul>
<li>LLM은 말그대로 ‘Large’ Language Model이다. 성능이 강력하지만 그만큼 연산 비용이 높고 실시간 활용이 어렵다.</li>
<li>Distillation은 이를 해결하기 위한 대표적인 방법이다. Diatillation은 무엇인가?<ul>
<li>성능이 좋은 대형 모델(Teacher model이라 부른다)의 지식을 더 작은 모델(Student model)로 전이(transfer한다고 한다)하는 과정을 의미한다.</li>
<li>작은 모델을 별도로 fine-tuning하는 것이 아니라, 대형 teacher model이 학습했던 패턴과 추론 능력을 반영해서 학습한다는 것이 중요한 점이다.</li>
<li>이를 통해서 teacher model의 성능을 최대한 유지하면서도 연산량은 줄여서, 경량화된 모델을 제작할 수 있다는 것이 포인트이다.</li>
</ul>
</li>
<li>DeepSeek-R1도 그 추론 능력을 소형 모델로 transfer하기 위해 distillation 기법을 적용했다. 그리고 그 방식은 다음과 같다.<ol>
<li>DeepSeek-R1이 생성한 800K의 학습 데이터 활용<ul>
<li>앞에서 설명한 Cold start 데이터와, RL로 학습된 R1의 지식으로 고퀄리티의 학습 데이터를 생성</li>
<li>이걸로 소형 오픈 소스 모델을 학습</li>
</ul>
</li>
<li>오픈 소스 모델 기반으로 distillation<ul>
<li>LLM을 직접 만들지 않고 기존 오픈소스 모델 활용<ul>
<li>Qwen2.5-Math 시리즈 : 1.5B, 7B, 14B, 32B</li>
<li>Llama : Llama-3.1-8B, Llama-3.3-70B-Instruct<ul>
<li>Llama-3.3이 3.1보다 조금 더 뛰어난 reasoning 능력이 갖고 있어서 3.3 썼다고 함</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>dilstilled된 모델에는 RL을 적용하지 않음<ul>
<li>R1에는 RL을 적용했지만, distilled 된 모델이는 SFT만 적용해 최적화</li>
<li>distillation 목적 자체가 distill 만으로도 성능 향상됨을 입증하는 것이었고, RL 적용하느 것은 향후 연구 과제</li>
</ul>
</li>
</ol>
</li>
</ul>
<h1 id="deepseek-r1의-성능-초간단">DeepSeek-R1의 성능 (초간단)</h1>
<ul>
<li>논문에서 언급된 실험이나 성능 비교는 자세히 다루지 않겠다.</li>
<li>어짜피 o1과 비슷하거나 약간 높다고 하는 내용이 대부분이기 때문이다.</li>
<li>논문 첫 페이지에 있는 벤치마크 그래프만을 넣어 두겠다.</li>
<li>사용해본 사람이라면 알겠지만, 사실 o1이 수치로는 비교할 수 없는  무언가의 좋은 성능이 있긴 하다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/a5981f96-b714-4cff-b23e-02cfa04e9718/image.png" alt=""></p>
<h1 id="deepseek-r1이-시사하는-것">DeepSeek-R1이 시사하는 것</h1>
<ul>
<li>SFT vs. RL<ul>
<li>DeepSeek-R1-Zero는 SFT 없이 순수 RL만으로도 LLM의 reasoning 능력을 향상시킬 수 있다는 것을 입증했다.<ul>
<li>곧, SFT가 아닌 RL도 LLM의 자체적인 추론 능력 발달을 이끌어 낼 수 있다는 것이다.</li>
<li>SFT를 통한 LLM 학습은 매우 많은 양의, 양질의 학습 데이터가 필요하기 때문에, synthetic data에 대한 연구도 한창 진행 중이고, 많은 데이터로 인한 GPU 사용량도 고려해야 하기에 MoE(Mixture of Expert) 연구도 진행되는 등 많은 곁다리? 연구 분야도 생겨나는 중이었다. 물론 DeepSeek도 MoE방식은 쓴 것 같다만..</li>
<li>그런데 RL만으로 가성비 있는 방식을 통해 거의 유사한 성능을 냈다면 AI업계에나, 엔비디아에게나 일시적으로는 분명히 충격이 있긴 하다.</li>
</ul>
</li>
</ul>
</li>
<li>추론 모델의 미래는?<ul>
<li>이 논문에서 DeepSeek가 주장하는 것과 구현한 것이 100% 사실이라면, 개인적으로는 OpenAI, Google, Anthropic 등과 같은 프론티어 ai 모델 개발 기업을 제외하면 AGI급 모델을 개발하려고 하지는 않을 것 같다. DeepSeek 정도의 가성비있는 방법론으로도 거의 유사한 성능을 낼 수 있다면, 왜 그 많은 돈을 들여서 SOTA급 모델을 개발하려 할까? 적절한 비용으로 적절한 성능의 모델을 개발하는 것이 더 비용 효율적일 것이다.<ul>
<li>또한, 프론티어 기업들이 이미 저런 방법론들을 사용하고 있지 않으리란 보장이 절대 없다고 보인다.</li>
</ul>
</li>
</ul>
</li>
<li>엉뚱한 소리일 수 있지만, 엔비디아는 한동안은 결국 더 웃게 될 거 같다. 이러한 저렴한 모델 학습 방법론이 유행처럼 번져나가면, (딥러닝에 있어서의) 엔트리급 GPU의 수요는 더 늘어날 것으로 보이고, 기업들 사이에서 GPU를 확보하기 위한 경쟁은 더 치열해질 것 같다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Agent-R: Training Language Model Agents to Reflect via Iterative Self-Training (2025)]]></title>
            <link>https://velog.io/@dutch-tulip/Agent-R</link>
            <guid>https://velog.io/@dutch-tulip/Agent-R</guid>
            <pubDate>Fri, 31 Jan 2025 05:58:59 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/abs/2501.11425">논문 링크</a></p>
<p>From arXiv, 2025.01</p>
<h1 id="1-abstract-introduction">1. Abstract, Introduction</h1>
<ul>
<li>제안하는 Agent-R은 LLM agent가 상호작용하는 환경에서 복잡한 작업을 해결하는 과정에서 reflection과 self-improvement를 하게 하는 iterative한 self-training framework</li>
<li>기존 방법론들은<ul>
<li>expert를 cloning하거나,</li>
<li>보상함수를 기반으로 action의 정확성을 평가하는 방식에 의존</li>
<li>single-task에서 모델의 self-correction 강화하려 함</li>
</ul>
</li>
<li>따라서, 여러 한계<ul>
<li>오류 탐지 및 수정 능력에 한계</li>
<li>작업 종료 후에 수정하므로 실시간 reflection 능력 제한</li>
<li>multi-turn interaction이 필요한 복잡한 환경에는 적합하지 않음</li>
</ul>
</li>
<li>Agent-R
<img src="https://velog.velcdn.com/images/dutch-tulip/post/2ad79519-8184-490b-836b-ff4fa029a539/image.png" alt=""><ul>
<li>실시간 오류 감지와 수정 목표</li>
<li>주요 요소<ul>
<li>모델 기반 reflection data 생성: Monte Carlo Tree Search (MCTS)를 활용해 잘못된 경로를 올바른 경로로 수정</li>
<li>단계별 수정 능력: 작업 종료를 기다리지 않고 단계별로 오류를 수정함으로써 실시간 reflection 구현</li>
<li>interative training: 초기 약한 policy에서 점차 강한 policy로 발전</li>
</ul>
</li>
</ul>
</li>
<li>Agent-R의 기여<ol>
<li>language agent의 상호작용 환경에서 오류 수정 문제를 해결하는 첫번째 접근법</li>
<li>MCTS와 모델 기반 reflection을 통해 동적 데이터셋 생성 및 self improvement 가능</li>
<li>실험을 통한 성능 개선 입증</li>
</ol>
</li>
</ul>
<h1 id="2-preliminary">2. Preliminary</h1>
<h2 id="21-task-formulation">2.1 Task Formulation</h2>
<ul>
<li><p>이 환경은 Partially Observable Markov Decision Process (POMDP)로 모델링되며, 주요 구성 요소는 다음과 같다.</p>
<ul>
<li>U: 과제 설명 및 요구 사항을 제공하는 instruction 공간.</li>
<li>S: 상태 공간(State space).</li>
<li>A: 행동 공간(Action space).</li>
<li>O: 관찰 공간(Observation space).</li>
<li>T: 전이 함수(Transition function), 환경에 의해 결정.</li>
<li>R: 보상 함수(Reward function), 특정 행동의 보상을 정의</li>
</ul>
</li>
<li><p>U,S,A,O는 자연어로 표현되며, 시간 t에서의 histrorical trajectory τ_t는 아래와 같이 표현된다.</p>
<p>  τ_t = (a_1, o_1, …, a_t, o_t) ∼ π_θ(τ_t ∣ u)</p>
</li>
<li><p>π<em>θ는 agent의 policy 모델이고, 시간 t+1에서 에이전트는 τ_t와 u를 바탕으로 다음 행동 a</em>(t+1)를 생성해야 한다.</p>
</li>
<li><p>최종 보상 r(τ)는 task가 끝나거나 최대 턴 수에 도달하면 주어진다.</p>
</li>
</ul>
<h2 id="22-monte-carlo-tree-search">2.2 Monte Carlo Tree Search</h2>
<ul>
<li>MCTS는 Agent-R의 중요 요소로, 잘못된 trajectory를 수정해 새로운 trajectory를 생성한다.</li>
<li>MCTS는 아래 4단계를 포함한다<ol>
<li>Selection: Upper Confidence bound for Trees (UCT) 전략을 사용해 확장할 노드 선택</li>
<li>Expansion: 선택된 노드에서 새로운 자식 노드 생성</li>
<li>Simulation: 새로운 노드에서 터미널 노드까지 rollout 수행</li>
<li>Backpropagation: 시뮬레이션 결과 바탕으로 노드 값 업데이트</li>
</ol>
</li>
</ul>
<h1 id="3-method">3. Method</h1>
<ul>
<li>Agent-R은 두 개의 core phase로 구성된다.</li>
</ul>
<ol>
<li>Model-Guided Reflection Trajectory Generation<ul>
<li>MCTS를 사용해 잘못된 trajectory를 수정해 올바른 trajectory로 전환</li>
</ul>
</li>
<li>Iterative Self-Training with Revision Trajectories<ul>
<li>생성된 trajectory 기반으로 iterative하게 모델 학습해 성능 개선</li>
</ul>
</li>
</ol>
<h2 id="31-phase-1-model-guided-reflection-trajectory-generation">3.1. Phase 1: Model-Guided Reflection Trajectory Generation</h2>
<h3 id="reflection-trajectory-definition">Reflection Trajectory Definition</h3>
<ul>
<li><p>이 단계에서는 아래 trajectory 유형이 정의된다</p>
<ul>
<li><p><strong>초기 궤적 (Initial Trajectory)</strong> τ^i​: 초기 행동 및 관찰의 시퀀스</p>
<ul>
<li>τ^i = (a^i_1, o^i_1, …, a^i_t, o^i_t)</li>
</ul>
</li>
<li><p><strong>잘못된 궤적 (Bad Trajectory)</strong> τ^b​: 초기에 오류를 포함한 행동 및 관찰의 시퀀스.</p>
<ul>
<li>τ^b = (τ^i_1, a^b_(t+1), o^b_(t+1), …, a^b_(T_b), o^b_(T_b))</li>
</ul>
</li>
<li><p><strong>올바른 궤적 (Good Trajectory)</strong> τ^g​: 초기 궤적에서 시작해 최적화된 행동 시퀀스.
  <img src="https://velog.velcdn.com/images/dutch-tulip/post/3042574a-1876-4461-b75b-52140087c7a2/image.png" alt=""></p>
</li>
<li><p><strong>수정된 궤적 (Revision Trajectory)</strong> τ^r​: 잘못된 궤적을 올바른 궤적으로 수정한 결과.</p>
</li>
<li><p>rs: Revision Signal, agent의 reflection을 돕는 간단한 메시지</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/6bf67707-e5d4-4ae1-ac20-283ba82d210d/image.png" alt=""></p>
</li>
</ul>
</li>
<li><p>보상 조건</p>
<ul>
<li>최종 보상 r(τ)에 따라 다음 조건을 만족해야 한다.<ul>
<li>잘못된 궤적의 보상: r(τ^b​)&lt;β</li>
<li>올바른 궤적의 보상: β&lt;r(τ^g​)≤1</li>
<li>수정된 궤적의 품질: r(τ^g)=r(τ^r)≥α<ul>
<li>β: 잘못된 궤적과 올바른 궤적을 구분하는 임계값.</li>
<li>α: 고품질 궤적의 하한값.</li>
</ul>
</li>
</ul>
</li>
<li>r(τ^g)=1 은 이 good trajectory가 Optimal Trajectory임을 의미.</li>
</ul>
</li>
</ul>
<h3 id="trajectory-collection-with-mcts">Trajectory Collection with MCTS</h3>
<ul>
<li><p>MCTS는 다양한 행동 경로를 탐색하여 수정된 궤적을 생성하는 데 사용되며, 다음 4가지 단계로 구성된다.</p>
<ol>
<li><p>Selection(선택): UCT(Upper Confidence bound for Trees) criterion을 사용해 확장할 노드 선택</p>
<ol>
<li><p>UCT 공식</p>
<p> <img src="https://velog.velcdn.com/images/dutch-tulip/post/b25db11b-5d4d-493d-985e-be9a9e077735/image.png" alt=""></p>
<ul>
<li>Q(s):  average reward of state s</li>
<li>N(s): number of visits to state s</li>
<li>N_p(s): total visit count of the parent node of s</li>
<li>c_uct: 탐색-활용(exploration-exploitation) trade-off를 조절하는 상수</li>
</ul>
</li>
</ol>
</li>
<li><p>Expansion(확장): 선택된 노드에서 새로운 자식 노드 생성</p>
</li>
<li><p>Simulation: 터미널 노드에 도달할 때까지 행동 시퀀스를 샘플링</p>
</li>
<li><p>Backpropagation: simulation 결과를 바탕으로 노드값을 업데이트</p>
</li>
</ol>
</li>
</ul>
<h3 id="transition-point-determination">Transition Point Determination</h3>
<ul>
<li><p>agent는 잘못된 trajectory에서 오류를 감지하고, 오류가 발생한 첫번째 지점(t’)을 결정</p>
</li>
<li><p>이후 잘못도니 trajectory를 t’에서 잘라내고, t’ 이후부터는 올바른 궤적과 연결</p>
</li>
<li><p>이 과정은 agent의 selt reflection 능력을 활용하며, 실시간 수정 능력을 강화</p>
</li>
<li><p>요약: MCTS는 다양한 행동 시퀀스를 탐색하며 각 trajectory에 대한 보상을 평가하고, 잘못된 궤적과 올바른 궤적 간의 전환점을 식별한다.</p>
</li>
</ul>
<h2 id="32-phase-2-iterative-self-training-with-revision-trajectories">3.2. Phase 2: Iterative Self-Training with Revision Trajectories</h2>
<h3 id="objective">Objective</h3>
<ul>
<li>수정된 궤적을 사용해 agent를 반복적으로 학습시키고, agent의 정책을 지속적으로 개선하는 것</li>
<li>이를 통해 agent는 더 초기의 오류를 감지하고 수정할 수 있는 능력을 개발</li>
</ul>
<h3 id="mixed-training-strategy"><strong>Mixed training strategy</strong></h3>
<ul>
<li>수정된(revision) trajectory와 올바른(good) trajectory 데이터를 혼합해 학습 진행</li>
<li>학습 초기에는 revision trajectory가 중심이 되며, 점진적으로 good trajectory 데이터 비율이 증가합니다.</li>
<li>이 접근법은 초기 학습에서 발생하는 <strong>cold-start 문제</strong>를 완화</li>
</ul>
<h3 id="loss-function"><strong>Loss function</strong></h3>
<ul>
<li><p>아래의 loss function를 최소화해 학습이 이루어진다:</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/e69e46f5-a913-4348-a719-7054fd495e6d/image.png" alt=""></p>
<ul>
<li>η: 수정 궤적 데이터와 일반 데이터의 혼합 비율.</li>
<li>τ_g: 올바른 궤적.</li>
<li>τ_r: 수정된 궤적.</li>
<li>(x,y): 일반 데이터셋의 입력-출력 쌍.</li>
</ul>
</li>
</ul>
<h3 id="iterative-training">Iterative Training</h3>
<ul>
<li>매 반복(iteration)마다 agent는 새로운 revision trajectory를 생성하고 학습하며, 정책을 강화</li>
<li>이를 통해 약한 초기 정책에서 강력하고 효율적인 정책으로 점진적으로 발전</li>
</ul>
<h1 id="4-experiment">4. Experiment</h1>
<ul>
<li>3개의 interative 환경에서 실험을 통해 평가되었다.</li>
</ul>
<h2 id="41-interactive-and-agentic-environments">4.1. Interactive and Agentic Environments</h2>
<ol>
<li>WebShop<ol>
<li>온라인 쇼핑을 시뮬레이션한 웹 기반 환경</li>
<li>보상: 작업 완료 시 보상 </li>
</ol>
</li>
<li>ScienceWorld<ol>
<li>초등학교 과학 커리큘럼 수준의 30개 과학 작업 유형을 포함한 텍스트 기반 환경</li>
<li>agent의 과학적 추론 능력 평가ㅏ</li>
</ol>
</li>
<li>TextCraft<ol>
<li>Minecraft 아이템 제작을 시뮬레이션한 텍스트 기반 환경</li>
<li>아이템 제작 트리와 명령을 기반으로 목표 아이템 제작</li>
<li>보상: 성공적으로 목표 아이템 제작 시 1점 보상</li>
</ol>
</li>
</ol>
<h2 id="42-experiment-setting">4.2. Experiment Setting</h2>
<h3 id="1-data-split">1. Data Split</h3>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/f6230e13-8d5c-450a-bd50-4297082a23ac/image.png" alt=""></p>
<ul>
<li>WebShop 300회, ScienceWorld 200회, TextCraft 200회</li>
<li>각 시뮬레이션에서 MCTS를 사용해 trajectory 데이터 생성</li>
<li>초기 반복에서는 낮은 기준(α=0.5), 이후 반복에서 점진적으로 증가(α=1.0)</li>
</ul>
<h3 id="2-mcts-settings">2. MCTS Settings</h3>
<ul>
<li>각 시뮬레이션에서 k=8개의 롤아웃을 샘플링</li>
<li>탐색 깊이(d)를 20으로 설정</li>
<li>각 깊이에서 4개의 행동 후보 생성</li>
<li>UCT criterion의 탐색-활용 균형 상수 (c_uct)를 0.25로 설정</li>
</ul>
<h3 id="3-training-settings">3. Training Settings</h3>
<ul>
<li>3번의 iteration 학습 수행</li>
<li>첫 iteration에서 에폭은 3, 이후 iteration에서는 1로 설정해 과적합 방지</li>
<li>기본 모델: Llama-3.1-8B-Instruct</li>
</ul>
<h3 id="4-baselines">4. Baselines</h3>
<ul>
<li>Closed-source model: GPT-3.5-Turbo, GPT-4-Turbo, GPT-4o, Claude-3, DeepSeek-Chat</li>
<li>Open-source model: Llama2-Chat, AgentLM, Agent-FLAN</li>
<li>기존 기법: ETO, Direct-Revision Trajectory</li>
</ul>
<h3 id="5-evaluation-metrics">5. Evaluation Metrics</h3>
<ul>
<li>WebShop, ScienceWorld: average final reward</li>
<li>TextCraft: success rate</li>
<li>모든 환경에서 최대 라운드 수는 100으로 제한</li>
</ul>
<h2 id="43-main-results">4.3. Main Results</h2>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/41d3ee70-3513-4d5f-a0af-c9019e39985c/image.png" alt=""></p>
<ol>
<li>Performance improvement<ul>
<li>Agent-R은 GPT-4o, AgentLM, Agent-FLAN 등의 기존 모델보다 높은 성능</li>
<li>특히 revising erroneous trajectories를 활용한 학습이 기존의 expert data에 의존하는 학습보다 효과적임을 입증</li>
</ul>
</li>
<li>Early Error detection<ul>
<li>Agent-R은 trajectory 초기에 오류를 감지하고 수정하여 error propagation를 방지</li>
<li>수정된 궤적은 더 빠른 회복과 안정적인 학습 유도</li>
</ul>
</li>
<li>Limitation of Contrastive Learning(Ex: ETO)<ul>
<li>ETO와 같은 contrastive learning은 성능 향상에는 기여했지만, agent의 self reflection 능력을 충분ㄴ히 개선하지 못함</li>
</ul>
</li>
</ol>
<h2 id="44-findings-with-analysis">4.4. Findings with Analysis</h2>
<h3 id="finding-1--training-with-trajectories-from-agent-r-can-outperform-using-optimal-trajectories">Finding 1 : Training with trajectories from Agent-R can outperform using optimal trajectories.</h3>
<ul>
<li><p>수정 궤적의 성능 향상 효과</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/8ac306a1-0925-4e49-9c69-0e5720b5d268/image.png" alt=""></p>
</li>
<li><p>Revision trajectory를 사용한 학습이 optimal trajectory만을 사용한 학습보다 성능이 우수</p>
</li>
<li><p>초기 학습에서 수정 궤적과 최적(optimal) 궤적을 혼합하면 에이전트의 성능과 자기 반성 능력이 크게 향상</p>
</li>
</ul>
<h3 id="finding-2--agent-r-can-effectively-provide-language-agents-with-self-reflection-capabilities">Finding 2 : Agent-R can effectively provide language agents with self-reflection capabilities.</h3>
<ul>
<li><p>self reflection 능력 강화</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/fe9ab967-6325-4c70-9932-4f0d6be9fa88/image.png" alt=""></p>
</li>
<li><p>Agent-R로 학습한 agent는 오류를 감지하고 수정하는 능력이 크게 향상</p>
</li>
<li><p>직접 수정(Direct-Revision) 방식보다는 동적 수정 방식이 반복 루프 감지나 오류 수정에 더 효과적</p>
</li>
<li><p>SFT를 사용한 expert trajectory나 DPO를 사용한 contrastive learning은 성능은 향상시킬 수 있으나 self reflection은 잘 못한다.</p>
</li>
</ul>
<h3 id="finding-3--training-with-revision-trajectories-helps-agents-more-easily-identify-and-correct-erroneous-actions">Finding 3 : Training with revision trajectories helps agents more easily identify and correct erroneous actions.</h3>
<ul>
<li><p>초기 오류 탐지 능력</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/ea1814d6-96df-488c-ab7b-5ba57bd09117/image.png" alt=""></p>
</li>
<li><p>revision trajectory를 활용한 iterative training은 trajectory의 첫번째 오류를 더 효과적으로 탐지</p>
</li>
<li><p>평균 수정 길이(average revision length)가 짧아져서 효율적인 경로 조정 가능</p>
</li>
</ul>
<h3 id="finding-4--training-with-revision-trajectories-helps-agents-avoid-getting-stuck-in-loops">Finding 4 : Training with revision trajectories helps agents avoid getting stuck in loops</h3>
<ul>
<li>반복 루프 방지</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/86f2994f-c4c9-40c6-b2fe-83cb8edd0047/image.png" alt=""></p>
<ul>
<li>Agent-R으로 학습한 agent는 동일한 행동을 반복하는 dead loop에 빠질 확률이 매우 감소</li>
<li>이는 revision trajectory가 agent의 탐색 능력을 강화했음을 보임</li>
</ul>
<h3 id="finding-5--multi-task-training-is-a-more-effective-strategy-for-agent-r">Finding 5 : Multi-task training is a more effective strategy for Agent-R</h3>
<ul>
<li>multitask 학습</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/374b8150-7da3-43a9-93c7-39ae53c3cbb4/image.png" alt=""></p>
<ul>
<li>revision trajectory는 다양한 환경에서 멀티태스크 학습을 통해 Agent-R 성능을 더 향상시킴</li>
<li>단일 task 학습보다 다양한 환경에서의 일반화 성능이 높음</li>
</ul>
<h1 id="5-related-work">5. Related Work</h1>
<h2 id="1-agent-learning-in-interactive-environments">1. Agent Learning in Interactive Environments</h2>
<ul>
<li>기존 연구에서 interactive environment에서 agent learning은 크게 3가지 approach로 분류 가능하다: 1) Prompt-based Strategy, 2) Inference-time Search Strategy, 3) Training-based Strategy</li>
</ul>
<ol>
<li>Prompt-based Strategy<ul>
<li>사람이 작성한 프롬프트를 활용해 LLM이 탐색 과정에서 경험을 요약하도록 유도</li>
<li>Ex)<ul>
<li>이전 경험에서 얻은 기술(skill set) 요약 및 전이 가능하도록 구성</li>
<li>탐색을 돕는 유용한 힌트 제공</li>
</ul>
</li>
<li>LLM이 이러한 요약된 경험을 memory에 저장해 성능 향상을 도모하지만, 내재적(self-contained) 학습보다는 외부 지식 의존도가 높음</li>
</ul>
</li>
<li>Inference-time Search Strategy<ul>
<li>Tree-of-Thought, Monte Carlo Tree Search 등의 탐색 알고리즘을 활용해 최적 경로 찾음</li>
<li>LLM이 사전에 학습된 지식을 활용해 보다 효율적인 탐색 수행</li>
<li>단점: pre-trained된 지식에 의존하여 새로운 문제에 대한 적응력이 떨어질 수 있음</li>
</ul>
</li>
<li>Training-based Strategy<ul>
<li>Supervised Fine-Tuning(SFT)</li>
<li>Direct Preference Optimization(DPO)</li>
<li>학습 데이터 출처<ul>
<li>expert model에서 수집</li>
<li>MCTS를 활용한 탐색을 통해 데이터 생성</li>
</ul>
</li>
<li>이 strategy는 fine tuning을 통한 성능 향상을 목표로 하지만, agent가 self reflection하는 능력은 부족함</li>
</ul>
</li>
</ol>
<h2 id="2-self-correction-for-large-language-models">2. Self-Correction for Large Language Models</h2>
<ul>
<li>LLM의 self-correction 능력은 매우 중요한 기능이지만, LLM은 이를 효과적으로 수행하지 못하는 것으로 나타남</li>
</ul>
<ol>
<li>기존의 self-correction method<ul>
<li>Prompt Engineering<ul>
<li>특정한 프롬프트를 입력하여 LLM이 자기 수정을 수행하도록 유도</li>
<li>그러나 성능 향상 효과가 미미하거나 오히려 성능이 저하될 수 있음</li>
</ul>
</li>
<li>Revision Data Collection<ul>
<li>Human annotators, Expert models, Self-generated samples 를 통해 revision data를 생성</li>
<li>그러나 대부분의 연구는 code repair, tool use, math 등 특정 작업에 한정</li>
</ul>
</li>
</ul>
</li>
<li>기존 연구의 한계<ul>
<li>명확한 오류 신호(explicit error signal)가 있는 환경에 초점<ul>
<li>Ex) code error message, tool-use parameters 등의 signal</li>
<li>그러나 현실적인 interactive 환경에서는 명확한 오류 신호가 존재하지 않음</li>
</ul>
</li>
<li>Single-turn 문제 해결에 집중<ul>
<li>대부분의 연구가 단일 입력과 출력 간의 self correction에 초점을 맞춤</li>
<li>multi turn interactive 환경에서 LLM이 자율적으로 오류를 수정하는 방법론이 부족</li>
</ul>
</li>
</ul>
</li>
<li>Agent-R의 차별점<ul>
<li>Agent-R은 explicit error signal이 없는 interactive environment에서 LLM의 self-correction을 가능하게 함</li>
<li>기존 방법들이 prompt engineering, SFT, expert data에 의존하는 반면, Agent-R은 reflection과  self-training을 통해 성능을 점진적으로 개선하는 새로운 방법론 제시</li>
</ul>
</li>
</ol>
<h1 id="6-conclusion">6. Conclusion</h1>
<ul>
<li>Agent-R의 기여<ul>
<li>Monte Carlo Tree Search (MCTS) 및 모델 기반 반성(Model-Guided Reflection) 활용<ul>
<li>기존 방법들이 정적인 expert trajectory를 모방하는 것에 의존한 반면, Agent-R은 MCTS를 사용하여 동적으로 수정 궤적(revision trajectories)을 생성</li>
<li>agent가 자신의 행동을 분석하고, 적절한 수정 지점에서 궤적을 조정하도록 유도</li>
</ul>
</li>
<li>실시간 오류 수정 및 궤적 개선<ul>
<li>Agent-R은 잘못된 궤적을 조기에 감지하고 수정할 수 있도록 설계</li>
<li>기존 방식 대비 반복 루프(looping) 및 비최적 행동(suboptimal behavior) 방지</li>
</ul>
</li>
<li>상호작용 환경에서의 성능 향상<ul>
<li>Agent-R이 기존의 지도 학습(SFT), DPO, Direct-Revision 방식보다 우수한 성능</li>
<li>Self-correction 기능을 갖춘 agent는 더 높은 보상과 성공률</li>
</ul>
</li>
<li>자기 생성 수정 궤적(Self-Generated Revision Trajectories)의 효과<ul>
<li>agent가 생성한 수정 궤적을 학습에 통합하면, 지능적이고 자율적인 agent 발전 가능</li>
<li>이를 통해 LLM agent가 단순히 expert data를 학습하는 것이 아니라, 자율적으로 반성(self-reflection)하고 학습(self-improvement)하는 능력 갖춤</li>
</ul>
</li>
</ul>
</li>
<li>향후 연구<ul>
<li>self-correction 능력 고도화</li>
<li>agent-based system에서의 응용<ul>
<li>Agent-R이 MAS나 자동화된 의사결정 시스템에서도 활용될 가능성 탐색</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Decision Transformer: Reinforcement Learning via Sequence Modeling (2021)]]></title>
            <link>https://velog.io/@dutch-tulip/decision-transformer</link>
            <guid>https://velog.io/@dutch-tulip/decision-transformer</guid>
            <pubDate>Wed, 22 Jan 2025 05:38:42 GMT</pubDate>
            <description><![CDATA[<p><a href="https://proceedings.neurips.cc/paper/2021/hash/7f489f642a0ddb10272b5c31057f0663-Abstract.html">논문 링크</a></p>
<p>From NeurIPS, 2021</p>
<h1 id="0-abstract">0. Abstract</h1>
<ol>
<li>Idea<ul>
<li>RL을 sequence modeling 문제로 추상화해, transformer 아키텍처의 단순성과 확장성을 활용</li>
<li>기존 RL 접근법과 달리, 가치 함수(value function)를 학습하거나 정책 경사(policy gradient)를 계산하는 대신, causally masked Transformer를 통해 최적의 행동 생성</li>
</ul>
</li>
<li>Method<ul>
<li>모델은 desired return(reward), 과거 상태(state), 행동(action)을 조건으로 한 autoregressive모델로 동작</li>
<li>원하는 desired return(목표보상)과 조건을 입력받아, 이를 달성하는 action을 예측</li>
</ul>
</li>
<li>Result<ul>
<li>Atari, OpenAI Gym, Key-to-Door 벤치마크에서, model-free offline RL 기법과 비슷하거나 더 뛰어난 성능</li>
<li>Decision transformer는 간단하면서도 기존 알고리즘 한계 극복</li>
</ul>
</li>
</ol>
<h1 id="1-introduction">1. Introduction</h1>
<ol>
<li><p>Motivation</p>
<ul>
<li>Transformer: 언어 모델링과 이미지 생성 등에서 Transformer는 높은 성능과 확장성을 통해 일반화 능력을 증명</li>
<li>RL<ul>
<li>대부분의 RL은 특정 행동 분포를 학습하는데 초점, 너무 좁은 범위의 문제 다룸</li>
<li>Temporal Difference(TD) 학습법은 return의 bootstrapping을 사용하며, 이는 불안정성을 유발할 수 있다(deadly tried).</li>
</ul>
</li>
</ul>
</li>
<li><p>Goal</p>
<ul>
<li>Transformer를 RL에 적용해 시퀀스 모델링이 기존 RL을 대체할 수 있는지 탐구</li>
<li>기존 RL과 차별화<ul>
<li>Bootstrapping 없이 지도학습으로 데이터를 사용해 policy 학습</li>
<li>Discounting을 제거해 장기적 목표를 더 잘 학습</li>
</ul>
</li>
</ul>
</li>
<li><p>Proposed Method</p>
<ul>
<li><p>Decision Transformer</p>
<ul>
<li>GPT 아키텍처를 활용해 상태, 행동, 목표 보상의 시퀀스를 autoregressive하게 모델링</li>
<li>특정 목표보상을 설정하여 다양한 행동을 생성하고, 학습된 데이터를 바탕으로 최적 경로 예측</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/051524a4-eea7-4192-9521-d9999194201b/image.png" alt=""></p>
</li>
</ul>
</li>
</ol>
<ol start="4">
<li><p>Example</p>
<ul>
<li><p>그래프 최단 경로 (Figure 2)</p>
<ul>
<li>그래프 탐색 문제를 RL로 변환</li>
<li>Transformer는 과거 데이터 학습해 목표 달성하는 최적 경로 생성</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/8cb8c8c8-7d97-45e0-9b9f-a17453e234f5/image.png" alt=""></p>
</li>
</ul>
</li>
</ol>
<h1 id="2-preliminaries">2. Preliminaries</h1>
<h2 id="21-offline-reinforcement-learning">2.1 Offline Reinforcement Learning</h2>
<ul>
<li>강화학습 목표: Markov Decision Process(MDP)에서 주어진 정책(policy) 하에 기대 보상을 극대화하는 것<ul>
<li>MDP는 상태 S, 행동 A, 전이 확률 P(s′∣s,a), 보상 함수 R(s,a)로 구성</li>
</ul>
</li>
<li>Offline RL<ul>
<li>환경과의 상호작용 없이 고정된 데이터셋 내에서 학습 진행</li>
<li>고정된 데이터는 trajectory를 포함, 추가적 피드백 받을 수 없는 제약</li>
</ul>
</li>
</ul>
<h2 id="22-transformers">2.2 Transformers</h2>
<ul>
<li><p>Transformer</p>
<ul>
<li>시퀀스 데이터를 효율적으로 모델링하기 위해 설계</li>
<li>self-attention layer, residual connection</li>
</ul>
</li>
<li><p>Attention mechanism</p>
<ul>
<li><p>각 입력은 키, 쿼리, 밸류 벡터로 변환</p>
</li>
<li><p>출력은 아래와 같이 계산</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/b203de25-61cd-453a-aebb-230be31412c1/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- 쿼리와 키 유사도 기반으로 가중치 적용해 값 합산</code></pre><ul>
<li>GPT 아키텍처<ul>
<li>Causal self-attention mask 사용해 시퀀스 생성, 이전 토큰만을 고려</li>
<li>이 논문에서는 GPT 구조 활용해 RL을 시퀀스 모델링 문제로 변환</li>
</ul>
</li>
</ul>
<h1 id="3-method">3. Method</h1>
<h2 id="trajectory-representation">Trajectory representation</h2>
<ul>
<li>Decision Transformer<ul>
<li>RL trajectory를 autoregressive하게 모델링</li>
<li>Transformer 구조를 최소한으로 수정해, 상태, 행동, 목표 보상을 포함한 trajectory를 학습</li>
</ul>
</li>
<li>Return-to-go(RtG)<ul>
<li>return-to-go = reward-to-go = 특정 시점부터 미래(에피소드 종료)의 누적 보상</li>
<li>과거 보상이 아닌 미래 기대 보상 합계 모델링</li>
<li>Trajectory representation: τ=(R_1, s_1, a_1, R_2, s_2, a_2, … , R_T, s_T, a_T)</li>
<li>R_t는 시점 t에서의 Returns-to-go</li>
</ul>
</li>
</ul>
<h2 id="architecture">Architecture</h2>
<ul>
<li>Input<ul>
<li>최근의 K 타임스텝의 데이터를 사용해 RtG, 상태, 행동에 대한 총 3K개의 토큰을 생성</li>
<li>linear embedding을 통해 각 모달리티를 transformer입력으로 변환</li>
</ul>
</li>
<li>Transformer processing<ul>
<li>입력 토큰은 GPT 모델에 의해 처리되며, 다음 행동을 예측하기 위해 autoregressive하게 사용</li>
</ul>
</li>
</ul>
<h2 id="training">Training</h2>
<ul>
<li>Loss function<ul>
<li>행동 예측을 위해 discrete action은 Cross entropy loss, continuous action은 mean-squared error를 사용</li>
<li>loss는 타임스텝 별로 평균</li>
</ul>
</li>
</ul>
<h2 id="evaluation">Evaluation</h2>
<ul>
<li>목표 보상(RtG)와 시작 상태를 설정한 후, 모델이 생성한 행동을 환경에 적용하여 다음 상태와 보상을 계산</li>
<li>프로세스는 에피소드 종료까지 반복</li>
</ul>
<h2 id="pseudocode">Pseudocode</h2>
<ul>
<li>for continuous actions</li>
</ul>
<pre><code class="language-python">def DecisionTransformer(R, s, a, t):
    pos_embedding = embed_t(t)
    s_embedding = embed_s(s) + pos_embedding
    a_embedding = embed_a(a) + pos_embedding
    R_embedding = embed_R(R) + pos_embedding

    input_embeds = stack(R_embedding, s_embedding, a_embedding)
    hidden_states = transformer(input_embeds=input_embeds)
    a_hidden = unstack(hidden_states).actions
    return pred_a(a_hidden)

# R, s, a, t: returns -to -go , states , actions , or timesteps
# K: context length ( length of each input to DecisionTransformer )
# transformer : transformer with causal masking (GPT)
# embed_s , embed_a , embed_R : linear embedding layers
# embed_t : learned episode positional embedding
# pred_a : linear action prediction layer</code></pre>
<h1 id="4-evaluations-on-offline-rl-benchmarks">4. Evaluations on offline RL benchmarks</h1>
<ul>
<li>개요<ul>
<li>Decision Transformer(DT)가 기존 Temporal Difference(TD) 학습 및 Imitation Learning 방식과 비교해 Offline RL에서 얼마나 잘 학습하는지 평가한다.</li>
</ul>
</li>
<li>평가 기준<ul>
<li>TD 학습<ul>
<li>TD 학습은 일반적으로 action-space constraint나 value pessimism을 활용</li>
<li>비교 대상: Conservative Q-Learning(CQL), BEAR, BRAC 등</li>
</ul>
</li>
<li>Imitation Learning<ul>
<li>Bemman update 없이 supervised loss를 사용해 policy를 학습하는 방식</li>
<li>비교 대상: Behavior Cloning(BC)</li>
</ul>
</li>
</ul>
</li>
<li>Task<ul>
<li>Discrete control task - Atari<ul>
<li>고차원의 시각적 입력과 action-reward 간 시간 지연으로 인한 credit assignment 문제</li>
</ul>
</li>
<li>Continuous control task - OpenAI Gym<ul>
<li>미세한 연속 제어를 요구하는 다양한 task</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/597dbed2-eec5-4286-aa71-8a1b958cc8a1/image.png" alt=""></p>
<h2 id="41-atari">4.1 Atari</h2>
<ul>
<li><p>벤치마크 설정</p>
<ul>
<li>데이터: Agarwal et al.의 DQN-replay 데이터셋에서 1% 샘플(500,000개의 전이 데이터)</li>
<li>기준:<ul>
<li>Hafner et al.의 프로토콜에 따라 점수를 정규화</li>
<li>100 = 프로게이머 수준 점수, 0 = 무작위 정책</li>
</ul>
</li>
<li>평가 방식: 샘플링된 데이터로 3회 반복 실험 후 평균과 표준 편차 기록</li>
</ul>
</li>
<li><p>결과 요약</p>
<ul>
<li><p>게임별 성능 비교 (Table 1)</p>
<ul>
<li>Breakout: DT(267.5)가 CQL(211.1) 및 모든 baseline 능가</li>
<li>Qbert: DT는 BC(17.3)에 근접하며 CQL(104.2)보다 낮은 성능</li>
<li>Pong: DT(106.1)는 CQL(111.9)에 근접하며 다른 baseline 능가</li>
<li>Seaquest: DT(2.4)는 CQL(1.7) 및 다른 baseline 능가</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/37a44deb-5237-4157-b712-a861704997ce/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- 결론
    - DT는 4개 중 3개 게임에서 CQL과 동등하거나 더 나은 성능을 보이며, 다른 baseline보다 우수</code></pre><h2 id="42-openai-gym">4.2 OpenAI Gym</h2>
<ul>
<li><p>벤치마크 설정</p>
<ul>
<li>환경<ul>
<li>D4RL 데이터셋<ul>
<li>Offline RL 표준 데이터셋, 연속적 제어 환경(HalfCheetah, Hopper, Walker) 포함</li>
</ul>
</li>
<li>2D Reacher<ul>
<li>목표 위치에 팔 도달하게 하는 goal-conditioned 작업</li>
<li>sparse reward 환경 : agent가 목표를 달성했을 때만 보상</li>
</ul>
</li>
</ul>
</li>
<li>종류,유형<ul>
<li>Medium: Expert policy의 1/3 수준 성능 갖는 policy</li>
<li>Medium-Replay: 학습 도중의 replay buffer에서 생성된 데이터. 학습되지 않은 데이터 포함 가능. 다양한 상태-행동 쌍</li>
<li>Medium-Expert: Medium policy + Expert policy 결합. Expert policy는 environment에서 높은 성능(데이터 품질 다양성 높임)</li>
</ul>
</li>
</ul>
</li>
<li><p>결과 요약</p>
<ul>
<li><p>데이터셋별 성능 비교 (Table 2)</p>
<ul>
<li>Medium-Expert<ul>
<li>DT는 HalfCheetah, Walker 등에서 CQL 및 다른 알고리즘보다 우수</li>
<li>Hopper에서는 CQL과 비슷한 성능</li>
</ul>
</li>
<li>Medium<ul>
<li>DT는 Hopper에서 CQL을 능가하며, 다른 환경에서도 competitive</li>
</ul>
</li>
<li>Medium-Replay<ul>
<li>DT는 Hopper에서 CQL을 크게 능가</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/2ed8ddd1-cd48-40f7-8018-423b84b0ce68/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- 결론
    - DT는 대부분의 환경에서 기존 Offline RL 알고리즘보다 높은 성능을 보임</code></pre><h1 id="5-discussion">5. Discussion</h1>
<h2 id="51-does-dicision-transformer-perform-behavior-cloning-on-a-subset-of-the-data">5.1 Does Dicision Transformer perform behavior cloning on a subset of the data?</h2>
<ul>
<li><p>Decision Transformer는 데이터의 특정 부분 집합에 대해 Behavior Cloning을 수행하는가?</p>
<ul>
<li>DT가 특정 목표 보상(return)에 해당하는 데이터의 일부만 학습하는 모방 학습(Behavior Cloning)과 유사한 방식으로 작동하는지 확인</li>
</ul>
</li>
<li><p>새로운 실험</p>
<ul>
<li>Percentile Behavior Cloning (%BC):<ul>
<li>데이터셋에서 에피소드 보상(return) 기준 상위 X%의 데이터만 선책해 Behavior Cloning 수행</li>
<li>X%는 전체 데이터를 사용하는 표준 BC(X=100%)와 상위 소수 데이터를 학습하는 특화 모델(X →0%) 간의 tradeoff</li>
</ul>
</li>
</ul>
</li>
<li><p>결과 요약 (Table 3, 4)</p>
<ul>
<li><p>D4RL</p>
<ul>
<li>%BC는 데이터가 풍부한 환경에서 DT에 근접하거나 성능 능가</li>
<li>DT는 전체 데이터 분포를 학습하며, 특정 목표 보상에 집중하도록 조정 가능</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/c26bac27-b061-4ceb-9d02-203db924678e/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- Atari
    - 제한된 데이터 조건(1%의 DQN-replay 데이터)에서 %BC는 성능 크게 저하
    - 반면, DT는 모든 trajectory를 활용해 일반화 개선해 우수한 성능

![](https://velog.velcdn.com/images/dutch-tulip/post/8f12352e-ff12-4430-bfe0-1370c4f5e001/image.png)</code></pre><ul>
<li>결론<ul>
<li>DT는 단순히 특정 데이터 하위 집합을 모방하는 것이 아니라, 전체 데이터 학습을 통한 일반화를 통해 성능 향상</li>
</ul>
</li>
</ul>
<h2 id="52-how-well-does-decision-transformer-model-the-distribution-of-returns">5.2 How well does Decision Transformer model the distribution of returns?</h2>
<ul>
<li><p>DT는 목표 보상의 분포를 얼마나 잘 모델링 하는가?</p>
</li>
<li><p>실험 설정</p>
<ul>
<li>다양한 목표 보상(RtG) 값을 설정하고, 에피소드 동안 누적된 실제 보상과의 상관 관계 평가</li>
</ul>
</li>
<li><p>결과 분석</p>
<ul>
<li><p>대부분의 작업에서 설정한 목표 보상과 관찰된 실제 보상 간 높은 상관관계 확인됨</p>
</li>
<li><p>특정 task에서의 특징</p>
<ul>
<li>Pong, HalfCheetah, Walker<ul>
<li>목표보상(RtG)을 거의 완벽히 충족</li>
</ul>
</li>
<li>Seaquest<ul>
<li>데이터셋 내 최대 보상보다 높은 목표보상을 설정하면, DT가 가끔씩 extrapolation 가능</li>
<li>extrapolation: 데이터 범위 벗어난 영역에서 값을 추정하거나 예측하는 과정 ↔ interpolation</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/21404311-349f-45a9-af74-18513e812e5e/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<ul>
<li>결론<ul>
<li>DT는 다양한 목표 보상을 학습하고 생성 가능하며, 상황에 따라서는 데이터 범위 이외의 결과도 생성할 수 있다.</li>
</ul>
</li>
</ul>
<h2 id="53-does-decision-transformer-perform-effective-long-term-credit-assignment">5.3 Does Decision Transformer perform effective long-term credit assignment?</h2>
<ul>
<li>DT는 long term 보상 크레딧 할당을 효과적으로 수행하는가?</li>
<li>Evaluation 환경<ul>
<li>Key-to-Door 문제<ul>
<li>3단계로 구성된 grid 환경<ol>
<li>첫 번째 방에서 키 줍기</li>
<li>두 번째 방에서 빈 방 탐색</li>
<li>세 번째 방에서 문 열기</li>
</ol>
</li>
<li>키를 줍지 않으면 문 열어도 보상 X</li>
<li>long term 보상 할당이 어려운 문제</li>
</ul>
</li>
</ul>
</li>
<li>결과 요약 (Table 5)<ul>
<li>DT와 %BC<ul>
<li>훈련 데이터가 적을 때도 policy를 잘 학습해 최적 경로 생성</li>
</ul>
</li>
<li>CQL<ul>
<li>Q-value 가 효과적으로 propagate 되지 않아 성능 낮음</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/7c2ea878-2cc1-4810-91e5-682c45bd08c3/image.png" alt=""></p>
<ul>
<li>결론<ul>
<li>DT는 Transformer 특성상 self-attention을 활용해 long term 보상 크레딧을 효과적으로 할당</li>
</ul>
</li>
</ul>
<h2 id="54-can-transformers-be-accurate-critics-in-sparse-reward-settings">5.4 Can transformers be accurate critics in sparse reward settings?</h2>
<ul>
<li>Transformer는 sparse reward 환경에서 정확한 평가자(critic)으로 작동할 수 있는가?</li>
<li>추가 실험<ul>
<li>DT를 수정해 action뿐만 아니라 보상(return)도 예측하도록 구성</li>
<li>Key-to-Door 환경에서 결과<ul>
<li>보상 예측 확률은 에피소드 동안의 주요 이벤트(키 줍기, 문 열기)에 따라 계속 업데이트(Figure 5 참고)</li>
<li>Transformer는 주요 이벤트에 높은 attention, state-return 연관성을 효과적으로 학습</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/8dc75448-5ff0-488c-934e-6b32a8bc7526/image.png" alt=""></p>
<ul>
<li>결론<ul>
<li>DT는 action 예측 뿐만 아니라 sparse reward 환경에서 정확한 critic으로도 기능 가능</li>
</ul>
</li>
</ul>
<h2 id="55-does-decision-transformer-perform-well-in-sparse-reward-settings">5.5 Does Decision Transformer perform well in sparse reward settings?</h2>
<ul>
<li>DT는 sparse reward 환경에서도 잘 작동 하는가?</li>
<li>Evaluation 설정<ul>
<li>D4RL 벤치마크의 보상을 delayed된 형태로 변환<ul>
<li>trajectory 중간에는 보상 미제공, 에피소드 마지막에 누적 보상을 한 번에 제공</li>
</ul>
</li>
</ul>
</li>
<li>결과 요약 (Table 6)<ul>
<li>DT와 %BC는 reward의 density가 낮아져도 성능의 큰 영향 X</li>
<li>CQL은 보상 의존적 학습 방식으로 인해 성능 크게 저하</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/c5fd0dc1-2aa4-4934-b218-9bae51b29cf4/image.png" alt=""></p>
<ul>
<li>결론<ul>
<li>DT는 sparse reward 환경에서도 높은 성능, TD 학습보다 더 강건한 모델</li>
</ul>
</li>
</ul>
<h1 id="6-related-work">6. Related Work</h1>
<h2 id="offline-rl">Offline RL</h2>
<ul>
<li>Challenge of Offline RL<ul>
<li>Distribution Shift<ul>
<li>Offline data가 환경의 실제 동작 분포와 다를 때 발생하는 문제</li>
</ul>
</li>
<li>이를 해결하기 위한 기존 접근법<ol>
<li>행동 공간 제약(action-space contraint)<ol>
<li>policy가 data distribution에서 벗어나지 않도록 제한</li>
<li>Ex) BEAR, BRAC</li>
</ol>
</li>
<li>가치 비관주의(value pessimism)<ol>
<li>Q-value를 보수적으로 추정해 불확실성 처리</li>
<li>Ex) CQL</li>
</ol>
</li>
<li>동적 모델 기반 학습<ol>
<li>환경의 동적 모델을 학습해 더 안정적인 학습 보장</li>
<li>Ex) MOPO, MOREL</li>
</ol>
</li>
</ol>
</li>
<li>DT의 차별점<ul>
<li>DT는 동적 모델이나 Bellman 업데이트를 사용하지 않고, sequence modeling을 통해 정책 학습</li>
<li>기존 접근법과 달리 transformer의 확장성과 일반화 가능성을 활용</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="supervised-learning-in-reinforcement-learning-settings">Supervised learning in reinforcement learning settings</h2>
<ul>
<li>관련 연구<ul>
<li>기존 RL 방법 중 일부는 static supervised learning과 유사한 방식으로 동작</li>
<li>Ex)<ul>
<li>Q-learning: 여전히 Bellman 업데이트를 사용하지만, policy 학습은 supervised learning에 가깝다</li>
<li>Behavior Cloning: Bellman 업데이트 없이 policy를 직접 학습</li>
</ul>
</li>
</ul>
</li>
<li>Upside-Down RL (UDRL)<ul>
<li>UDRL은 목표 보상(return)에 조건부로 행동을 예측하는 방식으로, DT와 유사</li>
<li>차이점: DT는 sequence modeling을 기반으로 하며, 더 긴 context와 복잡한 행동 분포 모델링 가능</li>
</ul>
</li>
</ul>
<h2 id="credit-assignment">Credit Assignment</h2>
<ul>
<li>크레딧 할당 문제<ul>
<li>RL에서 long term reward를 특정 행동에 어떻게 효과적으로 할당할 것인가에 대한 연구</li>
<li>기존 접근법<ul>
<li>state와 reward를 연관짓는 구조 학습</li>
<li>Ex) Hindsight Credit Assignment, Return Decomposition(RUDDER)</li>
</ul>
</li>
<li>DT 접근법<ul>
<li>Transformer의 self-attention을 활요앻 credit assignment를 명시적 모델링 없이 자연적으로 처리</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="conditional-language-generation">Conditional Language Generation</h2>
<ul>
<li>조건부 생성 연구<ul>
<li>언어 및 이미지 생성에서 transformer를 사용한 조건부 생성이 연구됨<ul>
<li>controllable text generation 모델에 대한 다양한 연구</li>
<li>RL에서의 보상 기반 조건부 생성</li>
</ul>
</li>
</ul>
</li>
<li>DT의 차별성<ul>
<li>기존 text generation 연구에서는 reward가 고정된 class처럼 취급되지만, DT는 시간에 따라 변화하는 보상을 다룸</li>
<li>RtG를 지속적으로 업데이트하며 trajectory를 생성하는 구조는 DT의 독창적 특징</li>
</ul>
</li>
</ul>
<h2 id="attention-and-transformer-models">Attention and Transformer Models</h2>
<ul>
<li>Transformer 모델의 성공 사례<ul>
<li>NLP 및 비전에서 transformer는 강력한 성능을 보여주며 주류 모델이 됨<ul>
<li>Ex)<ul>
<li>NLP: GPT, BERT</li>
<li>Vison: ViT</li>
</ul>
</li>
</ul>
</li>
<li>RL<ul>
<li>RL에서 transformer의 연구는 상대적으로 적음</li>
<li>기존 연구<ul>
<li>Transformer를 RL 알고리즘에 보조적으로 활용</li>
<li>Ex) Relational Reasoning, Episodic Memory Integration</li>
</ul>
</li>
</ul>
</li>
<li>DT의 기여점<ul>
<li>기존 연구와 달리 DT는 transformer를 중심으로 RL 문제를 재구성하여 기본 알고리즘의 패러다임 전환을 제시</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="7-conclusion">7. Conclusion</h1>
<ul>
<li>기여<ul>
<li>DT는 RL 문제를 sequence modeling으로 해결할 수 있는 새로운 접근법을 제시<ul>
<li>기존 RL 알고리즘의 복잡성을 줄이고 transformer의 확장 가능성 활용</li>
<li>여러 Offline RL 벤치마크에서 기존 알고리즘을 능가하거나 동등한 성능<ul>
<li>특히, long term credit assignment가 필요한 문제에서 기존 방법보다 우수</li>
</ul>
</li>
<li>RL문제를 포함한 다양한 sequence decision making 문제에 잘 적용될 수 있음을 입증</li>
</ul>
</li>
</ul>
</li>
<li>한계<ul>
<li>context length나 RtG 설정과 같은 하이퍼파라미터의 중요성</li>
<li>복잡한 환경에서의 확장성과 일반화에 대한 추가 실험 부족</li>
</ul>
</li>
<li>향후 연구<ul>
<li>대규모 데이터셋에서의 성능 향상을 위한 self-supervised learning 적용</li>
<li>state, action, rreturn에 대한 더 정교한 임베딩 설계</li>
<li>더 복잡한 RL 및 실제 문제로 확장</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Multi-LLM Debate: Framework, Principals, and Interventions (2024)]]></title>
            <link>https://velog.io/@dutch-tulip/multii-llm-debate</link>
            <guid>https://velog.io/@dutch-tulip/multii-llm-debate</guid>
            <pubDate>Mon, 13 Jan 2025 07:51:33 GMT</pubDate>
            <description><![CDATA[<p><a href="https://neurips.cc/virtual/2024/poster/93363">논문 링크</a></p>
<p>From NeurIPS, 2024</p>
<h1 id="0-abstract">0. Abstract</h1>
<ul>
<li>Debate를 이론적으로 분석하고, 수학적으로 분석하는 framework를 제안한다.</li>
<li>이를 바탕으로 Multi-Agent 에서의 Debate에 대한 여러 이론적 결과를 제시한다.</li>
<li>모델 간 비슷한 성능이나 응답은 토론 과정이 majority opinion으로 단순 수렴되는 정적 토론을 초래할 수 있음을 보인다.<ul>
<li>이런 majority opinion이 common misconception(모델의 공유된 학습 데이터에 의해 가능)에서 비롯된 경우, 토론은 이런 misconception과 관련된 답변으로 수렴할 가능성이 크다.</li>
</ul>
</li>
<li>이런 이론적 결과를 바탕으로, 토론의 efficacy를 개선하는 3가지 intervention을 제안.<ul>
<li>각 intervention에 대해 개선 방법을 설명하는 이론적 결과를 제시하고, 4가지 벤치마크 작업에서 성능이 향상됨을 보인다.</li>
</ul>
</li>
</ul>
<h1 id="1-introduction">1. Introduction</h1>
<ul>
<li>LLM은 다른 모델로부터 의견을 수집하고 처리할 수 있는 능력을 갖고 있다.</li>
<li>이전 연구에서는 위 능력을 바탕으로 LLM이 토론에 참여해 협력적으로 task를 해결함을 보인다.</li>
<li>Multi-agent debate는 각 모델에게서 응답을 얻고, 그 응답을 모델들 간에 배포하며, 각 모델로부터 갱신된 응답을 다시 얻는 방식으로 진행된다.</li>
<li>이 연구는 debate process를 더 잘 이해할 수 있는 이론적 프레임워크를 제시하여 이를 탐구한다.<ul>
<li>베이지안 추론과 In-Context Learning에서 영감을 얻어, 토론을 부분적으로 ICL의 특수 유형으로 볼 수 있음을 보인다.</li>
<li>이 프레임워크를 통해 Multi-agent debate가 Echo-Chamber Effects에 취약하다는 것을 입증한다.<ul>
<li>Echo-Chamber effect는 특히 모델 다수 사이에 공유된 misconception에서 비롯된 경우 더 큰 영향을 미친다.</li>
<li>참고: Echo-Chamber effect(반향실 효과): 같은 입장을 지닌 정보만 지속적으로 되풀이하여 수용하는 현상을 비유적으로 나타낸 말 (위키백과)</li>
</ul>
</li>
<li>이후 프레임워크에서 도출한 결과를 활용해 토론 절차의 효율성을 개선하기 위한 세 가지 intervention을 제안한다.<ul>
<li>1) Diversity Pruning: 각 debate 단계에서 모델 응답의 information entropy를 최대화하는 것을 목표로 한다.</li>
<li>2) Quality Prunung: 각 모델의 응답의 관련성을 최대화 하는 것을 목표로 한다.</li>
<li>3) Misconception Refutation: 모델 응답에서 오해를 식별하고 반박하려고 시도한다.</li>
<li>이 interventions은 모델이 직접 답변을 제공하는 것보다 평가하는 데 더 능숙하다는 이전 연구들에서 영감을 얻었다.</li>
</ul>
</li>
<li>각 intervention에 대해 토론이 어떻게 개선되는지 설명하는 이론적 결과를 제시하고, 4개의 벤치마크에서 interventions이 실제로 토론의 efficacy를 개선함을 실험적으로 증명한다.</li>
</ul>
</li>
<li>기여점<ul>
<li><ol>
<li>베이지안 추론과 ICL의 연관성을 활용한 Multi-LLM debate의 이론적 프레임워크 제안</li>
</ol>
</li>
<li><ol start="2">
<li>Multi-LLM debate의 여러 주요 원칙에 대한 이론적 통찰 제공</li>
</ol>
</li>
<li><ol start="3">
<li>이 통찰을 활용해 4개의 언어적 벤치마크 및 3개의 LLM에서 debate의 성능을 일관되게 개선시키는 3가지 debate interventions을 설계</li>
</ol>
</li>
</ul>
</li>
</ul>
<h1 id="2-related-work">2. Related Work</h1>
<ul>
<li>본 연구는 Multi-agent debate와 밀접한 관련이 있다.<ul>
<li>agent들 간의 iterative 협력을 통해 결정을 내리는 과정에 초점을 맞추고 있다.</li>
<li>이런 연구들은 주로 QA task의 맥락에서 multi-agent debate을 다루며, single model보다 더 높은 품질의 답변을 제공하기 위해 여러 모델을 토론에 참여시키는 것을 목표로 한다.</li>
<li>Du et al. [2023, Improving factuality and reasoning in language models through multiagent debate]이 제안한 초기 debate framework에서는 먼저 각 모델에 질문을 던지고, 이전 라운드에서 모든 모델의 응답을 맥락화하여 동일한 질문을 다시 던지는 방식으로 토론을 진행한다.</li>
<li>이 절차의 다양한 변형도 제안된다.<ul>
<li>다른 기능을 가진 모델 간의 debate (Liang et al. [2023, Encouraging divergent thinking in large language models through multi-agent debate])</li>
<li>Round-robin 방식의 debate (Chat et al. [2023, Towards better llm-based evaluators through multi-agent debate])</li>
<li>agent 간 의견 차이를 동적으로 조절하는 debate (Chang [2024, Evince: Optimizing adversarial llm dialogues via conditional statistics and information theory])</li>
<li>debater의 correctness를 평가하기 위한 judge를 사용하는 방식 (Khan et al. [2024, Debating with more persuasive llms leads to more truthful answers])</li>
</ul>
</li>
<li>답변 품질을 iterative하게 향상시키기 위한 다른 기법도 제안되었다.<ul>
<li>CoT, Zero-shot-CoT, self-consistency(+Med-PALM2), self-reflection</li>
</ul>
</li>
</ul>
</li>
<li>토론과 유사한 방식의 LLM 활용에 대한 연구도 진행되어 왔다.<ul>
<li>서로 다른 LLM이 상효작용하는 방식이나,<ul>
<li>(Liu et al. [2023, Dynamic llm-agent network: An llm-agent collaboration framework with agent team optimization])</li>
<li>(Abdelnabi et al. [2023, Llm-deliberation: Evaluating llms with interactive multi-agent negotiation games])</li>
<li>(Zhang et al. [2023, Exploring collaboration mechanisms for llm agents: A social psychology view])</li>
<li>(Li et al. [2023, Tradinggpt: Multi-agent system with layered memory and distinct characters for enhanced financial trading performance])</li>
<li>(Park et al. [2023, Choicemates: Supporting unfamiliar online decision-making with multi-agent conversational interactions])</li>
</ul>
</li>
<li>LLM이 자신의 추론을 설명하는 방식,<ul>
<li>(Wang et al. [2024, Can chatgpt defend its belief in truth? evaluating llm reasoning via debate])</li>
</ul>
</li>
<li>general task에 협력적으로 수행하는 방식<ul>
<li>(Li et al. [2023, Communicative agents for&quot; mind&quot; exploration of large scale language model society])</li>
<li>등등</li>
</ul>
</li>
</ul>
</li>
<li>일부 연구에서는 토론 과정이 불안정할 수 있으며, 단일 모델을 사용하는 것보다 오히려 성능이 저하될 수 있음을 보여주기도 했다.<ul>
<li>(Wang et al. [2024, Rethinking the bounds of llm reasoning: Are multi-agent discussions the key?])</li>
<li>(Smit et al. [2023, Are we going mad? benchmarking multi-agent debate between language models for medical q&amp;a])</li>
</ul>
</li>
<li>본 연구는 ICL과 베이지안 추론과도 관련이 있다.<ul>
<li>ICL은 LLM이 몇가지 example만 제공받았을 때도 unseen task를 수행할 수 있음을 보인다.</li>
<li>다른 연구들은 ICL과 베이지안 추론 간의 연관성을 보여준다.<ul>
<li>모델에 제공되는 additional example은 토큰에 대한 모델의 사후 분포(posterior distribution)을 업데이트하는 것으로 볼 수 있다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="3-preliminaries">3. Preliminaries</h1>
<h2 id="debate">Debate</h2>
<ul>
<li>x를 question, y를 관련 답변이라 하자. 예를 들어, x=’하늘은 무슨 색인가요?’ 이고 y=’파랑’ 일 수 있다.</li>
<li>Du et al. [2023, Improving factuality and reasoning in language models through multiagent debate] 이 제안한 토론 절차에 따르면, n개의 LLM(이하 agent라고도 함)으로 구성된 집합이 T 라운드에 걸쳐 iterative하게 discussion을 수행해 올바른 답변 y을 추론하며 절차는 다음과 같다.<ul>
<li>t=0 라운드에서, 각 에이전트 i는 작업 x를 관찰한 후 응답 z_i^(0)을 제공한다.</li>
<li>t&gt;0 라운드에서, 각 에이전트 i는 작업 x와 이전 라운드의 모든 에이전트 응답 Z^(t-1) = z_1^(t-1), … , z_n^(t-1))을 관찰한 후, 갱신된 응답 z_i^(t)를 제공한다.</li>
<li>토론 과정은 t = T이거나, 에이전트들이 합의에 도달할 경우 종료된다.</li>
</ul>
</li>
<li>합의에 도달했는지 여부를 측정하기 위해 함수 a가 주어진 응답 z에서 답변을 추출한다.<ul>
<li>예를 들어, z=’낮에는 하늘이 파랗습니다’라면 a(z)=’파랑’이다.</li>
<li>t 라운드에서, agent i가 갱신된 응답 z_i^(t+1)을 제공할 확률은 다음과 같다.
  <img src="https://velog.velcdn.com/images/dutch-tulip/post/5648248a-029f-44b9-aeee-a258329978d5/image.png" alt=""></li>
<li>모델의 하이퍼 파라미터는 훈련 데이터, 아키텍처 등을 의미한다.</li>
<li>각 라운드에서 모든 agent는 동일한 입력(Z^(t), x)를 관찰한다.</li>
<li>따라서 출력z_i^(t+1)의 차이는 출력 생성의 확률적 성격과, 각 모델의 하이퍼 파라미터에 의해 결정된다.</li>
</ul>
</li>
<li>본 연구에서의 접근 방식과 ‘일반적인’ 토론의 주요 차이점은 각 토론 라운드 사이에 Z^(t) 응답을 수정하기 위해 latent concept을 활용한다는 것이다.</li>
</ul>
<h2 id="latent-concepts">Latent Concepts</h2>
<ul>
<li><p>이전 연구에서 설명되었듯이, 잠재 개념은 언어가 무작위로 생성되지 않는다는 생각을 담고 있다.</p>
</li>
<li><p>즉, 인간이든 모델이든 언어를 생성할 때, 먼저 마음 속에서 아이디어나 의도가 형성된 후, 그 아이디어나 의도를 전달할 단어를 선택한다.</p>
</li>
<li><p>더 formal 하게는, Θ를 latent concept space라 하고, θ ∈ Θ를 concept라 설정한다면,</p>
<ul>
<li>Xie ek al. [2021]에 따르면, task x와 관련 답변 y는 먼저 latent concept θ ∈ Θ에서 벡터를 선택하고, 이후 (x,y) ~ D(θ)를 샘플링하여 생성된다.</li>
<li>여기서 D는 concept에서 task-answer pair로 매핑하는 distribution을 나타낸다.</li>
</ul>
</li>
<li><p>유사하게, 모델이 응답을 제공할 때, x를 관찰하고, 잠재 개념 θ 또는 더 일반적으로 잠재 개념 공간에 대한 분포를 추론한 후, 추론한 개념에 따라 응답을 생성한다.</p>
<ul>
<li><p>즉, 위에서 주어진 모델 생성 확률 수식은 아래와 같이 표현될 수 있다.</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/6acfe372-427a-4dd2-8b11-5814fffab4a0/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- 위 식은 잠재 개념 공간 Θ에 대해 항상 성립한다.</code></pre><ul>
<li>잠재 개념의 예시<ul>
<li>BoolQ 데이터셋에서의 QA task<ul>
<li>Q: “Abraham Lincoln이 영화 <strong>Saving Private Ryan</strong>에서 편지를 썼습니까?”</li>
<li>A: “Yes”</li>
<li>이 경우, 잠재 개념은 영화의 한 장면, 즉 Lincoln이 쓴 Bixby letter가 병사들 앞에서 읽히는 장면과 관련있다.<ul>
<li>본 연구 case와 마찬가지로, 먼저 concept θ가 선택되고, 이후 영화에서 문자열 x가 샘플링된다(즉 영화와 관련된 질문이 생성된다).</li>
</ul>
</li>
</ul>
</li>
<li>산술 계산, ex. 곱셈<ul>
<li>언어로 곱셈은 “4 * 4” 와 같은 형식으로 작성 가능</li>
<li>이 문자열의 잠재 개념은 곱셈의 매커니즘을 나타낸다.<ul>
<li>예를 들어, 곱셈은 덧셈의 반복이며, 덧셈은 숫자 값을 반복적으로 1씩 증가시키는 것</li>
</ul>
</li>
</ul>
</li>
<li>그러나 잠재 개념은 더 추상적일 수 있다<ul>
<li>알려지지 않은 임베딩 공간의 벡터로 표현될 수 있다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="4-a-theoretical-fomulation-of-multi-agent-debate">4. A Theoretical Fomulation of Multi-Agent Debate</h1>
<ul>
<li>Multi-Agent Debate의 이론적 공식화를 제시한다.<ul>
<li>토론의 내부 동작 방식을 이해하는데 중요한 통찰을 제공하며, 이를 통해 토론을 개선하려 한다.</li>
</ul>
</li>
<li>프레임워크의 핵심은 잠재 개념의 아이디어와 각 모델의 생성 확률의 확장(두번째 수식)을 활용해 토론을 더 잘 이해하는 것이다.</li>
<li>그전에 중요한 가정이 있다.</li>
</ul>
<h3 id="assumption-41">Assumption 4.1</h3>
<ul>
<li><p>주어진 잠재 개념 공간 Θ에서, 응답 z_i^(t+1)을 생성할 확률은 concept θ ∈ Θ와 모델 파라미터 ϕ_i를 고려했을 때, 이전 응답 Z^(t)와 task x에 대해 조건적으로 독립적이다. 즉,</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/01aaea7d-6c25-4583-954e-ef3de0f64a57/image.png" alt=""></p>
</li>
<li><p>이는 모델의 generation z_i가 모델 파라미터 ϕ_i와 모델이 identify한 concept(θ)에 의해 고유하게 결정됨을 의미한다.</p>
<ul>
<li>인코더-디코더 기반 모델의 경우 ϕ와 θ의 결합은 인코더가 생성한 임베딩이라고 할 수 있다.</li>
<li>이 임베딩을 사용하면 원래의 입력 (x, Z^(t))는 더이상 모델의 출력을 결정하지 않고, 대신 임베딩과 모델 매개변수 만이 모델 출력을 고유하게 결정한다.</li>
</ul>
</li>
<li><p>다음으로, 토론 라운드가 진행됨에 따라 모델 응답이 어떻게 진화하는지 조사하는데 유용한 아래 Lemma 4.2를 도출한다.</p>
</li>
</ul>
<h3 id="lemma-42">Lemma 4.2</h3>
<ul>
<li><p>시간 t+1에서 모델 i의 generation은 아래와 같이 표현 가능하다. (skew: 왜곡)</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/59634aa9-135a-47da-9d9c-f72f30056131/image.png" alt=""></p>
</li>
<li><p>이 lemma의 중요성은 응답 z_i^(t+1)을 생성할 확률을 이전 응답 Z^(t)없이 생성하는 확률과, 이전 모델 응답에 의해 발생한 왜곡항(skew term)으로 표현할 수 있다는 것이다.</p>
</li>
<li><p>(수식이 많아 캡처로 대체)</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/c3be50ed-6aaa-4793-9961-969b68a06c4d/image.png" alt=""></p>
</li>
</ul>
<h3 id="debate-and-in-context-learning">Debate and In-Context Learning</h3>
<ul>
<li>Xie et al. [2021]의 연구를 통해 잠재 개념의 역할을 이해한다.<ul>
<li>이 연구는 잠재 개념에 대한 베이지안 추론을 사용해 ICL을 이해한다.</li>
</ul>
</li>
<li>ICL과 Multi-agent debate는 자연스러운 연결점이 있다.<ul>
<li>ICL은 다음과 같이 동작한다.<ul>
<li>Task x와 모델 f에 대해, x와 유사한 task-anwer pair (x_1, y_1), … , (x_m, y_m)을 선택한다.</li>
<li>이후 모델 f에게 (x_j, y_j)를 예로 들어 task x에 대한 answer z= f(x|(x_1, y_1), … , (x_m, y_m))을 요청한다.</li>
</ul>
</li>
<li>Xie et al. [2021]의 핵심 결과는 예제 (x_j, y_j)에 포함된 잠재 개념, 특히 다수 예제 간에 공유된 개념이 답변 z에 영향을 준다는 것이다.</li>
</ul>
</li>
<li>이와 유사하게 이전 라운드의 모델 응답 Z^(t)는 ICL의 예제와 같은 역할을 한다.<ul>
<li>다음 라운드 t+1에서 모델의 갱신된 응답 z_i^(t+1)은 Z^(t)에 공유된 개념에 영향을 받는다.</li>
<li>Lemma 4.2에서 왜곡항(skew term)은 Z^(t)에 의해 전달된 잠재 개념이 z_i^(t+1)의 생성에 영향을 미치는 방식을 보여준다.</li>
<li>즉 (식에서)∏ ~~ 는 모델 생성 확률에 가중치를 부여한다.</li>
</ul>
</li>
</ul>
<h2 id="41-debate-objective">4.1 Debate Objective</h2>
<ul>
<li><p>이런 관점에서 debate process를 설계하면 concept space Θ를 활용해 효과적으로 토론을 수행할 수 있다.</p>
</li>
<li><p>이를 위해 토론을 최적화 문제로 공식화하며, Lemma 4.2의 왜곡항이 최적화 변수가 된다.</p>
</li>
<li><p>task x와 answer y에 대해 각 토론 라운드는 아래와 같은 최적화 문제로 공식화된다.</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/76c9ad5a-de1e-4c9f-9d6e-94c2234c2af2/image.png" alt=""></p>
</li>
<li><p>시간 t에서, 다음 단계에서 올바른 answer를 제공할 확률을 최대화하도록 Z^(t)를 작성하는 것을 목표로 하며, 이 objective를 잠재 개념 공간 Θ를 사용해 확장하면 아래와 같다.</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/6e93d928-7da6-4bb4-bd76-4b84ecb195cc/image.png" alt=""></p>
</li>
<li><p>이 objective를 직접 최적화하는데 있어서 주요 challenge들은:</p>
<ul>
<li><ol>
<li>task x와 answer y가 유래된(생성된) true concept θ*, 응답 z_j^(j)와 underlying concept 간의 관계가 알려져 있지 않다.</li>
</ol>
</li>
<li><ol start="2">
<li>Z^(t)의 응답은 자연어로 이루어져 있다.</li>
</ol>
</li>
</ul>
</li>
<li><p>그럼에도 concept space 안에서 여러 approach를 설계해 더 잘 최적화할 수 있으며, 그런 방식을 설계하기 위해 토론 절차 전체를 더 살펴볼 필요가 있다.</p>
</li>
</ul>
<h1 id="5-debate-principals">5. Debate Principals</h1>
<ul>
<li>LLM debate의 효율성에 영향을 미치는 factor를 살펴본다.<ul>
<li>특히 Z^(t)의 응답 다양성과 모델 능력의 다양성 측면에서 정보 다양성의 역할을 살펴본다.<ul>
<li>어느 측면에서든 다양성이 부족하면 토론 과정에 부정적인 영향을 미침을 확인한다.</li>
</ul>
</li>
<li>또한, 토론에서의 특정 유형의 homogeneity, 즉 모델 대다수가 동일한 잘못된 신념을 공유하는 경우를 연구한다.</li>
</ul>
</li>
</ul>
<h2 id="51-information-diversity">5.1 Information Diversity</h2>
<ul>
<li>모델 능력과 모델 응답의 다양성이 토론 절차에 미치는 영향을 살펴본다.<ul>
<li>능력이나 응답의 동질성은 토론 절차를 특정 잠재 개념으로 편향시킬 수 있다.</li>
</ul>
</li>
</ul>
<h3 id="similar-model-capabilities">Similar Model Capabilities</h3>
<ul>
<li>토론 과정이 한 가지 타입의 모델로만 진행된다고 가정한다. 즉, n개의 동일한 모델 카피를 사용.<ul>
<li>따라서 모든 i ∈ [n]에 대해 ϕ_i = ϕ인 경우이다.</li>
<li>이 경우 agent 수가 증가함에 따라 토론 절차는 에코 챔버 효과에 더 영향을 받게 된다.<ul>
<li>즉, 에이전트들이 받아들이는 가장 유력한 개념이 변화할 확률은 0에 가까워진다.</li>
</ul>
</li>
<li>그 말인즉, 더 많은 수의 similar agent는 static debate dynamics를 초래하며, 이는 debate의 본래 목적을 저해한다.</li>
</ul>
</li>
</ul>
<h3 id="theorem-51">Theorem 5.1</h3>
<p>(수식 생략)</p>
<ul>
<li>내용: 동일한 모델의 copy나 매우 유사한 모델로 토론이 진행될 때, 모델의 수를 증가시키는 것은 하나의(변화하지 않는) 개념으로 토론을 수렴하게 만든다는 것을 의미한다.<ul>
<li>이는 여러 개념의 균형있는 분포 대신 특정 개념으로 집중되는 결과를 초래한다.</li>
</ul>
</li>
</ul>
<h3 id="similar-model-opinions">Similar Model Opinions</h3>
<ul>
<li>모델의 유사한 응답이 collaboration process에 미치는 영향을 살펴본다.</li>
<li>t 시점에 n개의 응답 Z^(t)가 존재하고, 이 중 최소 m개의 응답이 유사하다고 가정한다.<ul>
<li>즉, θ’라는 특정 개념이 존재하며, 이는 모든 j ≤ m 에 대해  P(θ∣z_j^(t),ϕ_i)값을 최대화한다고 할 수 있다.</li>
</ul>
</li>
</ul>
<h3 id="theorem-52">Theorem 5.2</h3>
<p>(수식 생략)</p>
<ul>
<li>내용: 다수의 모델이 task x에 대해 유사한 응답을 제공할 경우, 그 반복된 응답이 다른 모델의 응답 뿐만 아니라, task x 자체를 압도할 수 있음을 나타낸다. 실제로 Section 7에서 그 현상이 발생함을 보인다.</li>
</ul>
<h2 id="52-shared-misconceptions">5.2 Shared Misconceptions</h2>
<ul>
<li>모델 능력과 응답의 homogeneity의 particular type인 ‘Shared Misconceptions’에 대해 살펴본다.</li>
<li>모델들 사이에 공통적으로 잘못된 신념이 공유될 경우, 토론은 덜 효과적이며, 그 잘못된 신념과 관련된 잘못된 개념으로 수렴할 가능성이 높다.</li>
</ul>
<h3 id="definition-53-misconception">Definition 5.3 (Misconception)</h3>
<ul>
<li><p>특정 개념 θ<em>에 대해, 모델 i가 θ</em>에 대한 오해를 갖고 있다고 하자.</p>
</li>
<li><p>이는 다른 개념 θ’가 존재하여, 아래를 만족할 때 성립한다.</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/a17f981d-c5ad-4c94-87fc-540925a37c97/image.png" alt=""></p>
</li>
<li><p>즉, θ* 개념에서 생성된 task에 대해, 모델이 잘못된 개념 θ’이 task를 더 잘 설명한다고 믿는 경우이다.</p>
</li>
<li><p>m개의 agent가 동일한 잘못된 개념 θ’을 공유하는 경우, 이를 ‘shared misconception’이라 한다.</p>
<ul>
<li>이런 경우 모델이 생성한 응답은 잘못된 개념 θ’에 biased 된다.</li>
</ul>
</li>
</ul>
<h3 id="theorem-54">Theorem 5.4</h3>
<ul>
<li><p>참인 개념 θ*가 주어지고, n개의 agent 중 m개가 잘못된 개념 θ’에 대한 shared misconception을 갖고 있다고 가정한다.</p>
<ul>
<li><p>그러면 task-answer pair (x,y) ∼ D(θ*)에서, 마지막 라운드 T의 토론 절차의 평균 정확성은 m에 따라 단조(monotonically) 감소한다. 즉,</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/68a8ecb7-908c-4fbf-a5ad-2fbbfc3a5a96/image.png" alt=""></p>
</li>
<li><p>위 식은 m이 증가함에 따라 감소한다.</p>
</li>
</ul>
</li>
<li><p>잘못된 개념으로 수렴하는 현상은  더 많은 모델을 추가한다고 해서 쉽게 완화되지 않을 가능성이 있다.</p>
<ul>
<li>한 모델의 misconception이 훈련 데이터에 의해 형성된 경우, 다른 모델들도 비슷한 훈련 데이터 간 높은 상관관계로 인해 동일한 misconception을 가질 가능성이 높기 때문</li>
</ul>
</li>
</ul>
<h1 id="6-interventions">6. Interventions</h1>
<ul>
<li>토론 절차에 대한 interventions(수정, 개입)을 논의한다.</li>
<li>Intervention은 두 범주로 나눈다.<ul>
<li>가지치기(Pruning): 전체 응답 Z^(t)에서 어떤 응답을 유지할지 선택하는 데 초점을 맞춤</li>
<li>수정(Modifying): Z^(t)의 응답을 변경하거나 편집하는 데 초점</li>
</ul>
</li>
</ul>
<h2 id="61-pruning-interventions">6.1 Pruning Interventions</h2>
<ul>
<li>debate의 t 라운드에서, intervention은 t+1 라운드를 시작하기 전에 Z^(t)에서 하위집합 응답인 Z’^(t)을 선택하여 동작한다.</li>
<li>Pruning intervention을 사용할 때는, t+1라운드에서 모델은 pruned된 응답 집합인 Z’^(t)만을 보게 된다.(전체 응답인 Z^(t)가 아닌)</li>
</ul>
<h3 id="diversity-pruning">Diversity Pruning</h3>
<ul>
<li><p>KL divergence를 KL로 나타내면, diversity pruning intervention은 information entropy를 최대화하는 방향으로 Z^(t)의 n개의 응답에서 k개를 선택한다. (선택된 k개는 Z’^(t))</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/d3f16123-efeb-4f70-ade2-e39611f8b74d/image.png" alt=""></p>
</li>
</ul>
<h3 id="quality-pruning">Quality Pruning</h3>
<ul>
<li><p>Quality Pruning은 Z^(t)에서 task x와 highest similarity를 갖는 k개의 응답을 선택하는 것을 목표로 한다.</p>
</li>
<li><p>Diversity Pruning과 유사하지만, quality pruning은 time t에서 n개 중 k개의 응답을 고른다.</p>
<ul>
<li><p>Quality pruning은 diversity에 대해 선택하는 대신, 질문에 대한 k개의 제일 유사한 응답을 고른다. 이는 아래와 같이 수행된다.</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/248a56cb-c941-4c42-9a91-81eec6bcd7e3/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<ul>
<li>실제로 Diversity pruning과 Quality pruning의 수식에서, KL divergence 식을 계산하는 것은 비현실적이다.<ul>
<li>그러나 sentence embedding을 해당 값을 대체하는 근사치로 사용할 수 있다.(Section C 참고)</li>
</ul>
</li>
<li>다음은 모델이 shared misconception을 갖고 있는 경우, diversity pruning이 토론 절차가 해당 잘못된 개념으로 수렴될 가능성을 줄인다는 것을 보여준다.</li>
</ul>
<h3 id="theorem-61">Theorem 6.1</h3>
<ul>
<li>참인 concept이 θ∗이며, n/2 이상의 에이전트가 잘못된 개념 θ′에 대한 shared misconception을 가지고 있다고 가정한다. 이 경우, diversity pruning은 토론이 잘못된 개념 θ′에서 비롯된 답변 y′로 수렴할 확률을 줄인다. 즉, y′ ∼ D(θ′)이다.</li>
</ul>
<h3 id="theorem-62">Theorem 6.2</h3>
<ul>
<li><p>task-answer pair (x,y)에 대해, quality pruning은 토론이 올바른 answer로 수렴할 확률을 증가시킨다.</p>
<ul>
<li><p>즉, Z^(t)를 시간 t에서 모든 응답 집합이라고 하고, Z’(t)를 quality pruning의 결과라고 한다면, 아래가 성립한다.</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/9d56b00d-da6b-467c-8e1c-05a5d44a8511/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<h3 id="remark-63">Remark 6.3</h3>
<ul>
<li>Theorem 6.1과 6.2에서 보여지듯, diversity pruning은 특정 concept에서 비롯된 잘못된 답변으로 토론이 수렴할 확률을 감소시키며, quality pruning은 옳은 concept에서 비롯된 올바른 답변으로 토론이 수렴할 확률을 증가시킨다.</li>
<li>두 intervention은 동시에 사용 가능하며, 이를 통해 잘못된 답변은 멀리하고 올바른 답변으로 토론 절차를 유도할 수 있다.</li>
</ul>
<h2 id="62-modification-interventions">6.2 Modification Interventions</h2>
<h3 id="misconception-refutation오해-반박">Misconception Refutation(오해 반박?)</h3>
<ul>
<li>Z^(t)의 응답 중 어떤 것을 다음 라운드에 사용할지 선택하는 것 외에도, Z^(t)의 응답을 수정할 수도 있다.</li>
<li>Misconception Refutation은 이 작업을 하며, z_j^(t) 응답을 task x와 더 관련있게 업데이트 하는 것을 목표로 한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/f64ea014-473b-46b0-be05-258c09cc12ca/image.png" alt=""></p>
<ul>
<li>앞선 두 개의 pruning과 마찬가지로, 위 식에서 KL divergence를 직접 구하는 것은 불가능하다.<ul>
<li>따라서 업데이트를 위해 proxy를 사용한다.</li>
<li>특히 LLM이 주어진 응답 z_j^(t)를 최소로 수정해 z_j^*를 생성한다.<ul>
<li>모델은 먼저 응답에서 식별된 misconception과 오류의 목록을 요청받는다</li>
<li>이후 misconception의 refutation과 수정된 응답을 모델에게 요청한다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="theorem-64">Theorem 6.4</h3>
<ul>
<li><p>task-answer pair (x,y)에 대해, Misconception Refutation은 토론이 올바른 답변으로 수렴할 확률을 증가시킨다.</p>
<ul>
<li><p>즉, Z^(t), Z*^(t)가 각각 Misconception Refutation 전과 후의 응답이라면 아래가 성립한다.</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/486a820e-299f-4878-b5aa-12b75780668c/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<h1 id="7-experiments">7. Experiments</h1>
<ul>
<li>4개의 언어모델 벤치마크로 실험(BoolQ, MMLU, TruthfulQA, MathQ)</li>
<li>4개의 LLM 사용(GPT-3.5 Turbo, Llama-2 7B Chat, Llama-3 8B Instruct, Mistral 7B Instruct v0.2)</li>
<li>잠재 개념(Θ)의 프록시로 동작하는 sentence embedding은 OpenAI의 ADA-2</li>
<li>제안하는 3개의 intervention 조합을 Du et al.[2023]의 SoM(Society of Minds)와 비교</li>
</ul>
<h3 id="tyranny-of-the-majority-다수-의견의-독재">Tyranny of the Majority (다수 의견의 독재)</h3>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/05b67722-b8b8-4453-bd81-74d8a7bbce7d/image.png" alt=""></p>
<ul>
<li>모델이 다수 의견을 따를 가능성 조사</li>
<li>모델은 echo chamer effect에 민감함이 보여졌다.<ul>
<li>Z^(t)에 majority answer가 포함된 정도가 늘어나면(m이 증가하면) model이 majority answer를 제공할 가능성이 증가한다.</li>
</ul>
</li>
<li>Figure 1은 k=5의 diversity pruning이 에코 챔버 효과를 감소시킴을 보여준다.</li>
</ul>
<h3 id="diversity-of-opinions">Diversity of Opinions</h3>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/4b7fa5f3-3e40-4f17-8510-22b658eb46b9/image.png" alt=""></p>
<ul>
<li>제안하는 방법과 SoM이 opinion diversity에 따라 얼마나 효과적인지 조사</li>
<li>Figure 2: 4개 데이터셋에서 첫 라운드(t=0)의 응답 간 유사성(pairwise 코사인 유사도)에 따른 SoM(점선) 및 제안하는 방법(실선)의 Accuracy Improvement 향상 정도를 나타낸다.<ul>
<li>첫 라운드에서 응답 간 유사성이 증가할수록 SoM의 효율성이 감소함이 나타난다.</li>
<li>이는 Theorem 5.1, 5.2와 같이 intervention 없는 토론에서 응답이 너무 유사하면 덜 효과적이라는 것과 일치한다.</li>
</ul>
</li>
<li>제안하는 방법의 SoM대비 개선은 모델 의견이 유사할 수록 더 커진다.(MathQ는 반례)</li>
</ul>
<h3 id="debate-interventions">Debate Interventions</h3>
<ul>
<li>3가지의 Intervention의 조합이 얼마나 효과적인지 조사</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/f420ca43-ac7b-4b6c-b718-57c8c8841c4b/image.png" alt=""></p>
<ul>
<li>Figure 3: 제안하는 방법과 SoM의 각 라운드별 성능<ul>
<li>제안하는 방법의 우위는 토론 후반 라운드에서 두드러짐</li>
</ul>
</li>
<li>Table 1: 단일 모델, SoM, 제안하는 방법의 조합에 대한 결과<ul>
<li>모든 경우에서 제안하는 방법은 SoM과 비교해 Competitive or superior</li>
</ul>
</li>
<li>Supplement의 Table 3을 보면 각 intervention을 개별적으로 적용했을 때보다 세 가지를 동시에 적용할 때 가장 효과가 좋음을 보인다.<ul>
<li>실제로 일부 intervention은 단독으로 사용되면 토론에 부정적인 영향을 줄 수 있으며, 이는 각 intervention이 상호 보완적으로 설계되었기 때문에 예상되는 결과이다.</li>
</ul>
</li>
</ul>
<h1 id="8-limitations">8. Limitations</h1>
<ul>
<li><ol>
<li>제안하는 이론적 결과는 latent concept space를 활용하지만, 실제로는 이런 공간에 접근할 수 없는 경우가 많아 sentence embedding과 같은 대체 proxy를 사용해야 한다.<ul>
<li>수학적 질문 같이 sentence embedding이 덜 의미있는 도메인에서는 제안하는 방법의 효과가 떨어진다.</li>
</ul>
</li>
</ol>
</li>
<li><ol start="2">
<li>제안하는 intervention들은 토론 절차의 추론 시간을 증가시킬 수 있다.<ul>
<li>주요 원인은 misconception refutation으로, 이는 각 참여자에게 여러번의 re-prompting을 요구하기 때문이다.</li>
</ul>
</li>
</ol>
</li>
</ul>
<h1 id="9-conclusion">9. Conclusion</h1>
<ul>
<li>Multi-agent debate는 LLM response의 효율성을 향상시키는데 효과적이다.</li>
<li>그러나 토론은 본질적으로 tryanny of the majority나 shared misconception같은 문제에 취약하다.</li>
<li>본 연구에서는 이론적 토론 프레임워크를 활용해 이러한 문제를 완화하고 토론의 성능을 향상시키는 interventions를 확립했다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Reflexion: Language Agents with Verbal Reinforcement Learning (2023)]]></title>
            <link>https://velog.io/@dutch-tulip/reflexion</link>
            <guid>https://velog.io/@dutch-tulip/reflexion</guid>
            <pubDate>Mon, 23 Dec 2024 06:36:29 GMT</pubDate>
            <description><![CDATA[<p><a href="https://proceedings.neurips.cc/paper_files/paper/2023/file/1b44b878bb782e6954cd888628510e90-Paper-Conference.pdf">논문 링크</a></p>
<p>From NeurIPS, 2023</p>
<h1 id="abstract--introduction">Abstract &amp; Introduction</h1>
<ul>
<li>그동안의 자율적 의사결정 에이전트(autonomous decision-making agent)들은 주로 In-Context Learning 또는 강화 학습을 사용해 성능을 개선하고자 했다.<ul>
<li>그러나 이는 거대 LLM의 파라미터에 의존하거나 강화 학습의 낮은 계산 효율성으로 인한 문제가 있었다.</li>
</ul>
</li>
<li>이 논문에서는 모델을 fine-tuning 하지 않고 binary or scalar feedback을 언어적 피드백으로 변환해 text summary로 제공된다.<ul>
<li>이런 self-reflective feedback은 다음 action에서 의미론적인 gradient signal로 사용되어 구체적인 개선 방향을 제공해 성능 개선에 도움을 준다.
<img src="https://velog.velcdn.com/images/dutch-tulip/post/573ac28c-aa18-41e3-8ed4-dc8d046586c7/image.png" alt=""></li>
</ul>
</li>
</ul>
<ul>
<li>Reflexion은 useful reflective feedback을 만들기 위해 세가지 방법을 사용한다.<ul>
<li>Simple Binary Environment Feedback(단순 binary 환경 피드백),</li>
<li>Pre-defined Heuristics for common failure cases(실패 사례에 대한 휴리스틱),</li>
<li>self-evaluation such as binary classification using LLMs (decision-making) or self-written unit tests (programming) (자체 평가 - decision making에서는 binary classification, 프로그래밍에서는 자체 제작된 unit test)</li>
</ul>
</li>
<li>Reflexion에는 장단점이 존재한다.<ul>
<li>Reflexion은 전통적인 RL보다 몇 가지 장점을 갖는다.<ul>
<li>가볍고, LLM의 finetuning이 필요하지 않다.</li>
<li>스칼라/벡터 형태의 reward 보다 더 정교한 형태의 피드백을 가능하게 한다. ex) 행동에 대한 구체적 변경</li>
<li>이전 경험에 대한 명확하고 해석 가능한 episodic memory를 제공한다.</li>
<li>이후의 에피소드에서의 행동에 대한 명확한 hint를 제공한다.</li>
</ul>
</li>
<li>하지만 단점도 있다.<ul>
<li>Reflexion은 LLM의 자체 self-evaluation capability or heuristic에 의존하며, success에 대한 formal guarantee가 없다.<ul>
<li>다만 LLM의 성능이 향상될수록 이는 개선될 것으로 기대된다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Reflexion에 대해 1) Decision-making task, 2) Reasoning task, 3) Programming task 에서 실험을 수행했으며, 모두 성능 향상을 이루었다.</li>
<li>Reflexion의 주요 기여점은 다음과 같다.<ul>
<li>Reflexion이라는 새로운 ‘언어적’ 강화학습 패러다임을 제안하며, 이는 agent의 메모리 인코딩과 LLM 파라미터 선택을 policy로 한다.</li>
<li>LLM에서의 self-reflection이라는 속성을 탐구하며, 이를 통해 복잡한 작업을 적은 시도로 학습하는 데에 self-reflection이 매우 유용함을 실증적으로 보인다.</li>
<li>LeetcodeHardGym이라는 code-generation RL gym envirionment를 소개한다. 이는 19개의 언어로 작성된 40개의 Hard Level의 Leetcode 문제를 담고 있다.</li>
<li>Reflexion이 여러 task에서 strong baseline을 능가하고, 다양한 code generation 벤치마크에서 SOTA를 달성함을 보였다.</li>
</ul>
</li>
</ul>
<h1 id="related-work">Related Work</h1>
<h2 id="reasoning--decision-making">Reasoning &amp; Decision-making</h2>
<ul>
<li>Self-Refine은 self-refinement를 통해 성능을 개선하는 iterative 프레임워크를 사용한다.<ul>
<li>이러한 방식은 ‘이 generation을 어떻게 더 긍정적인 방식으로 쓸 수 있을까’ 와 같은 제약 조건에 따라 달라진다.</li>
<li>효과적이긴 하지만 단일 생성 추론 작업에만 제한된다.</li>
</ul>
</li>
<li>Semantic prompt-writing optimization을 수행한 연구도 있지만 역시 단일 생성 작업에 한정된다.</li>
<li>중간 피드백을 제공하기 위해 critic 모델을 파인튜닝해 reasoning 응답을 개선한 연구도 있다.</li>
<li>Action에 대한 stochastic beam search를 통해 더 효율적인 decision making을 하는 연구도 있다. 이는 agent가 self-evaluation component를 통해 예측 우위를 갖도록 하는 것이다.</li>
<li>여러 세대에 걸쳐서 reasoning을 하는 모델을 사용한 연구도 있다.</li>
<li>Evaluation 없이 고정된 단계 수만큼 retry를 하는 패턴에 대한 연구도 있다.</li>
<li>이전 생성물에 대한 정성적 평가 단계를 통한 최적화를 수행하는 연구도 있다.</li>
<li>본 논문에서는 이런 여러 개념 중 몇 가지가 Self-refelction을 통해 향상되어 Self-refelction 경험에 대한 지속적인 메모리를 구축할 수 있음을 보인다.<ul>
<li>이를 통해 agent는 자신의 오류를 스스로 식별하고 실수로부터 배울 교훈을 스스로 제안한 할 수 있다.</li>
</ul>
</li>
</ul>
<h2 id="programming">Programming</h2>
<ul>
<li>과거나 최근 연구들은 test-driven development 이나 code debugging 을 사용한다.<ol>
<li>AlphaCode는 hidden test cases에 대해 생성된 코드의 성능을 평가한다.</li>
<li>CodeT는 자체 생성한 unit test를 통해 함수 구현 점수를 매긴다.</li>
<li>Self-Debugging은 코드 실행 환경에서의 피드백을 바탕으로 기존 구현을 개선하는 debugging coomponent를 사용한다.</li>
<li>CodeRL은 RL프레임워크를 사용해 코드 실행 환경으로부터 피드백을 받아 프로그램을 디버깅한다.</li>
</ol>
</li>
<li>a., c., d. 는 복잡도가 낮은 버그를 수정하는데 효과적이지만, 이는 ground-truth 케이스에 의존하며 pass@1 평가에 적합하지 않고, 오류 개선과 구현 개선 사이의 격차를 self-reflection을 사용하지 않는다.</li>
<li>b. 는 hidden test case를 사용하지 않지만 코드 작성 개선을 위한 self-learning을 구현하지 않는다.</li>
</ul>
<h1 id="reflexion-reinforcement-via-verbal-reflection">Reflexion: reinforcement via verbal reflection</h1>
<ul>
<li>Reflexion은 3개의 모델이 모듈화되어 구성되어 있다.<ul>
<li>Actor (M_a): 텍스트와 행동 생성</li>
<li>Evaluator (M_e): 출력 결과 평가</li>
<li>Self-Reflection (M_sr): Actor의 self-improvement을 위한 언어적 강화 피드백 생성 모델</li>
</ul>
</li>
</ul>
<h2 id="actor">Actor</h2>
<ul>
<li>π_θ</li>
<li>Actor는 LLM을 기반으로 구축되며, state observation에 맞는 텍스트와 action을 생성하도록 프롬프트된다.</li>
<li>전통적인 policy-based RL 처럼, 시점 t에서의 현재 정책 π_θ으로부터 action이나 generation a_t를 샘플링하고, 환경으로부터 observation o_t를 받는다.</li>
<li>Actor 모델로는 Cot나 ReAct를 포함한 다양한 모델을 사용해 Reflexion의 다양한 요소의 성능이나 효율성을 살펴본다.</li>
<li>추가적으로, 메모리 component인 mem을 추가해 agent에게 추가적인 context를 제공한다.</li>
</ul>
<h2 id="evaluator">Evaluator</h2>
<ul>
<li>Actor가 생성한 출력의 품질을 평가하는 중요 역할</li>
<li>task context 내에서의 성능을 반영한 reward score 계산</li>
<li>Semantic space에 적용할 수 있는 효과적인 value/reward function을 정의하는 것은 어렵기 때문에, 여러 evaluator 모델의 변형을 조사한다.<ul>
<li>Reasoning task에서는 Exact Match(EM) 계산에 기반한 reward function을 실험해 생성된 출력이 예상 솔루션과 얼마나 일치하는지 확인한다.</li>
<li>Decision-making task에서는 특정 기준에 맞게 설계된 사전 정의된 휴리스틱 함수를 사용한다.</li>
<li>또한 decision-making과 programming 작업에서는 evaluator로서 LLM의 다른 instance를 사용하여 reward를 생성하는 방법도 실험한다.</li>
</ul>
</li>
</ul>
<h2 id="self-reflection">Self-Reflection</h2>
<ul>
<li>Self-Reflection은 LLM으로 구현되며, 언어적인 self-reflection을 생성하여 추후의 trial을 위한 귀중한 피드백을 제공하기 때문에 reflexion에서 중요한 역할을 한다.</li>
<li>binary reward signal(성공/실패)같은 sparse reward signal과, 현재 경로, 그리고 지속적인 메모리인 mem을 기반으로 구체적인 피드백을 생성한다.</li>
<li>이 informative한 피드백은 agent의 memory인 mem에 저장된다.<ul>
<li>예를 들어, multi-step decision-making task에서 agent가 실패 신호를 받으면, 특정 행동 a_i가 그 이후의 잘못된 행동 a_(i+1)과 a_(i+2)로 이어졌다는 것을 추론할 수 있다.</li>
<li>agent는 이를 언어적(verbal)으로 표현하여 다른 행동 a’_i를 취했어야 했음을 기록해둔다.</li>
<li>이를 토대로 agent는 과거 경험을 활용해 더 나은 decision-making approach를 할 수 있다.</li>
</ul>
</li>
<li>Trial, error, Self-reflection, persisting memory 의 프로세스는 agent가 빠르게 decision making성능을 향상시킬 수 있도록 돕는다.</li>
</ul>
<h2 id="memory">Memory</h2>
<ul>
<li>Reflexion 과정에서의 핵심 요소는 단기 메모리와 장기 메모리 개념이다.</li>
<li>Inference를 할 때, Actor는 단기 및 장기 메모리를 바탕으로 자신의 결정을 내리며, 이는 사람이 세세한 최근 정보를 기억하면서도 중요한 과거 경험을 장기 메모리에서 떠올리는 방식과 유사하다.</li>
<li>RL setup에서 경로 history는 단기 메모리로 작용하고, self-reflection 모델의 출력은 장기 메모리에 저장된다.</li>
<li>이러한 메모리 세팅은 Reflexion이 갖는 주요 장점이다.</li>
</ul>
<h2 id="the-reflexion-process">The Reflexion process</h2>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/90803cb1-0dbd-4b20-acac-fb0f9f918413/image.png" alt=""></p>
<ul>
<li>Reflexion은 1장에서 언급한 것처럼 반복적인 최적화 과정으로 공식화된다.</li>
<li>첫번째 trial에서 Actor는 환경과 상호작용하여 경로(trajectory) τ_0를 생성한다.<ul>
<li>이후 Evaluator는 τ_0를 입력으로 받아 점수 r_0를 계산하고, 이는 r_0=M_e(τ_0)로 표현된다.</li>
<li>r_t는 시행 t에서의 스칼라 보상값으로 작업 별 성능이 증가함에 따라 개선된다.</li>
</ul>
</li>
<li>첫 trial 이후에 r_0을 LLM 개선에 사용할 수 있는 피드백 형태로 바꿔야 한다.<ul>
<li>그러기 위해 Self-reflection 모델은 {τ_0, r_0} set를 분석해 summrary sr_0을 생성하고 이를 mem에 저장한다.</li>
</ul>
</li>
<li>sr_t는 trial t에 대한 언어적 경험 피드백을 의미하며, mem에 추가된다.<ul>
<li>실제로 mem에는 저장되는 경험에 수를 최대 Ω로 제한해(보통 1~3) LLM의 max context length를 초과하지 않도록 한다.</li>
</ul>
</li>
</ul>
<h1 id="experiments">Experiments</h1>
<ul>
<li>Agent의 여러 RL환경에서 Decision-making, reasoning, code-generation을 평가한다.<ul>
<li>HotPotQA를 사용한 search-based qa</li>
<li>AlfWorld의 일반 가정환경에서의 multi-step tasks</li>
<li>HumanEval, MBPP, LeetcodeHard 에서 interpreter와 compiler를 사용하는 code writing task</li>
</ul>
</li>
</ul>
<h2 id="sequential-decision-making-alfworld">Sequential decision making: ALFWorld</h2>
<ul>
<li>AlfWorld는 TextWorld를 기반으로 한 상호작용 환경에서 에이전트가 multi-step task를 해결하도록 하는 텍스트 기반 환경들의 모음이다.</li>
<li>숨겨진 객체 찾기(서랍에서 주걱찾기), 객체 이동(칼을 도마로 옮기기) 등과 같은 6가지 작업을 134개의 AlfWorld 환경에서 agent를 실행하며 Action generator로는 ReAct를 사용한다.</li>
<li>AlfWorld task는 작업이 완료되었을 때만 signal을 보내기 때문에 자연스럽게 self-evaluation step이 요구된다.<ul>
<li>Fully autonomous behavior를 위해 두가지 self-evaluation 기법을 도입한다<ul>
<li>LLM을 사용한 자연어 분류</li>
<li>수기로 작성된 휴리스틱<ul>
<li>휴리스틱은 에이전트가 동일한 행동에 대해 동일한 response를 받는 cycle이 3번 이상 반복되거나, 현재 환경에서 action을 30번 이상 수행하는 비효율적인 plan이라면 self-reflection을 수행하는 것이다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Baseline 실행에서는 self-reflection이 제안되면 이를 스킵하고 환경을 초기화한 후 새로운 trial을 시작한다.</li>
<li>Reflexion 실행에서는 agent가 self-reflection을 통해 실수를 찾아내고 메모리를 업데이트한 뒤 환경을 초기화하여 새로운 trial을 시작한다.<ul>
<li>Max context length를 초과할 수 있는 매우 긴 prompt window를 방지하기 위해, agent의 memory는 last 3 self-reflections(experiences)로 제한한다.</li>
<li>의미론적 오류를 막기 위해 도메인 별로 few-shot 경로를 주는데, 아래 예시(Figure 5)와 같다.(appendix에 있음)<br><img src="https://velog.velcdn.com/images/dutch-tulip/post/a3250a26-f071-41e5-9496-ab52d87c2913/image.png" alt=""></li>
</ul>
</li>
</ul>
<h3 id="result">Result</h3>
<ul>
<li>ReAct + Reflexion은 simple heuristic을 사용해 hallucination을 탐지하고 비효율적 planning을 탐지하면서 134개 task 중 130개를 완료하면서 ReAct를 크게 능가한다.<ul>
<li>ReAct + Reflexion은 12번의 연속적 trial을 통해 additional task를 해결하는 방법을 학습한다.</li>
<li>ReAct only에서는 6~7의 trial에서 성능 향상이 멈추는 것을 확인했다.</li>
<li>(아래 Figure 3 그래프 참고)<br><img src="https://velog.velcdn.com/images/dutch-tulip/post/4ab0b813-96f7-4725-be05-a437e6d666fa/image.png" alt=""></li>
</ul>
</li>
</ul>
<h3 id="analysis">Analysis</h3>
<ul>
<li>AlfWorld에서 실패 경로의 일반적인 오류는 agent가 item을 소유하고 있다고 생각하고 있지만, 실제로는 소유하지 않은 경우이다.<ul>
<li>Agent는 긴 경로에서 여러 행동을 하며 실수를 되돌릴 수 없다</li>
</ul>
</li>
<li>Reflexion은 self-reflection을 통해 긴 실패 경로를 관련된 경험으로 요약하고, 이를 미래의 self-hint로 사용할 수 있도록 해 이와 비슷한 대부분의 사례를 없앤다.</li>
<li>AlfWorld에서 장기 메모리가 agent를 돕는 2가지 주요 사례는 다음과 같다.<ul>
<li>긴 경로의 초기 실수를 쉽게 찾을 수 있다. 따라서 Agent는 새로운 action 선택이나 장기 plan 까지도 제안할 수 있다.</li>
<li>객체를 찾기 위해 너무 많은 surface/container를 체크해야 할 때에도 좋다. Agent는 여러 trial에 걸쳐 쌓인 경험 메모리를 활용해 방을 철저하게 search할 수 있다.</li>
</ul>
</li>
</ul>
<h2 id="reasoning-hotpotqa">Reasoning: HotpotQA</h2>
<ul>
<li><p>HotpotQA는 113k의 QA 쌍으로 구성된 Wikipedia 기반 데이터셋으로, agent가 여러 supporting documents를 파싱하고 reasoning하도록 한다.</p>
</li>
<li><p>추론 능력만의 개선을 테스트하기 위해 Reflexion + CoT를 구현한다.</p>
<ul>
<li>이는 Q → A와 Q, C_{gt} → A가 step by step으로 구현된다.</li>
<li>C_{gt}는 데이터셋에 있는 ground truth context, A는 최종 정답이다.</li>
<li>CoT가 multi-step decision-making techinique가 아니므로, C_{gt}를 제공하여 문서를 왔다갔다하는 reasoning은 따로 테스트한다.</li>
</ul>
</li>
<li><p>전체적인 QA능력, 즉 reasoning과 action choice가 모두 요구되는 능력을 테스트하기 뒤해 Reflexion + ReAct agent를 구현한다.</p>
<ul>
<li>이는 Wikipedia API를 사용해 relevant context를 검색하고, step-by-step explicit thinking을 통해 답변을 유추한다.</li>
<li>CoT 구현에는 6-shot, ReAct에는 2-shot, Self-Reflection에는 2-shot 프롬프팅을 사용한다. 예시 전체는 Appendix에 있으며 일부는 아래와 같다.<ul>
<li>CoT+Reflexion
  <img src="https://velog.velcdn.com/images/dutch-tulip/post/aae84adb-257a-4f13-8dd4-f1b37bb1f00c/image.png" alt=""></li>
<li>HotPotQA CoT + Reflexion
  <img src="https://velog.velcdn.com/images/dutch-tulip/post/732df4b4-0e77-4a84-9227-570cb9271fd0/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
<li><p>Answer들을 robust하게 평가하기 위해, trial 간에 environment를 사용해 Exact Match grading을 수행해 agent에게 binary success signal을 준다.</p>
<ul>
<li>이후 self-reflection loop를 통해 이 신호를 amplify하며 이는 AlfWorfd 처럼 memory size를 3 experiences로 한다.</li>
</ul>
</li>
</ul>
<h3 id="result-1">Result</h3>
<ul>
<li>Reflexion은 여러 learning step을 거치면서 베이스라인의 성능을 능가한다.<ul>
<li>더군다나, ReAct-only, CoT-only, CoT(GT)-only는 어떤 작업에서도 확률적으로 개선되지 않았다.</li>
<li>즉 첫번째 시행에서 실패한 걸 나중에 해결하지 못했다는 것</li>
</ul>
</li>
<li>Reflexion은 에이전트가 동일한 작업에서 3번까지는 실패한 후에도 자신의 경험을 통해 재시도할 수 있도록 했다.</li>
<li>CoT(GT)는 자연스럽게 질문의 정답 context에 접근할 수 있기 때문에 더 높은 정확도를 달성했다.<ul>
<li>그러나 여전히 질문의 39%에서 올바른 답변을 하지 못했다.</li>
</ul>
</li>
<li>그러나 Reflexion은 정답 context에 접근하지 않고도 agent가 본인의 실수를 수정해가면서 정확도를 14% 향상시켰다.
<img src="https://velog.velcdn.com/images/dutch-tulip/post/fd90a721-5430-4929-980e-82a06ad69423/image.png" alt=""></li>
</ul>
<h3 id="analysis-1">Analysis</h3>
<ul>
<li>CoT(GT)를 baseline으로 사용해 self-reflection에 대한 ablation study를 수행했다.<ul>
<li>CoT(GT)는 GT context가 제공된 상태에서 CoT reasoning을 사용하는 접근법으로, 긴 context를 통해 reasoning을 하는 능력을 테스트한다.</li>
<li>또한 최근 경로(trajectory)를 포함하는 에피소드 메모리(EPM)을 추가한다.</li>
<li>Reflexion agent는, 마지막으로 standard self-reflection step을 구현한다.</li>
</ul>
</li>
<li>직관적으로는 agent가 1인칭 언어적 설명을 사용해 반복적으로 효과적으로 학습할 수 있는지 테스트한다.</li>
<li>Figure 4의 실험 결과를 보면, Self-Reflection은 EPM을 통한 학습보다 8%의 성능향상을 보인다.<ul>
<li>단순 refinement 접근법보다 self-reflection 기반 refinement 접근법이 더 효과적이라는 주장을 뒷받침한다.</li>
</ul>
</li>
</ul>
<h2 id="programming-1">Programming</h2>
<p>(Dataset)</p>
<ul>
<li>MBPP, HumanEval, LeetcodeHardGym에서 Python/Rust code generation에 대해 평가한다.<ul>
<li>MBPP, HumanEval: 자연어 설명이 주어졌을 때 함수 본문 생성 정확도 측정<ul>
<li>MultiPL-E 사용해 데이터셋 일부 Rust로 변환<ul>
<li>MultiPL-E: Python 벤치마크 문제를 18개 언어로 변환할 수 있는 작은 컴파일러 모음</li>
</ul>
</li>
<li>Rust 코드 생성을 포함한 실험을 통해 Reflextion이 언어에 구애받지 않고, interpreted/complied language 모두에 적용될 수 있음을 보인다.</li>
</ul>
</li>
<li>LeetcodeHardGym: 40개의 Leetcode hard-rated question을 포함하는 interactive programming gym</li>
</ul>
</li>
</ul>
<p>(Experiment Setting)</p>
<ul>
<li>프로그래밍 task는 self-generated unit test suite와 같은 더 구체적인 self-evaluation 방식을 사용할 수 있다.<ul>
<li>따라서 Reflexion 프로그래밍 task는 pass@1 accuracy를 사용하기 적합하다.<ul>
<li>pass@1 accuracy: 모델이 첫 번째 시도에서 정확한 답변을 내는 비율</li>
</ul>
</li>
<li>test suite를 생성하기 위해 CoT를 사용해 여러 test와 대응하는 자연어 설명을 생성한다.<ul>
<li>이후 그 테스트가 유효한 추상 구문 트리(AST)를 생성할 수 있는지 확인해 문법적으로 유효한 테스트만 필터링한다.</li>
<li>이후 생성된 unit test들에서 n개의 test를 샘플링 해 test suite T={t_0, t_1, …, t_n}을 생성한다. n은 최대 6이다.</li>
<li>나머지 학습 설정은 Reasoning과 Decisio making에서와 동일하며, memory limit은 1 experience로 한다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="result-2">Result</h3>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/7aa6cb8d-62ec-4bec-a3a9-f272a2657c87/image.png" alt=""></p>
<ul>
<li>Reflexion은 모든 baseline을 넘어서는 성능을 보이며 SOTA 성능을 달성한다.<ul>
<li>하지만 MBPP python에서는 GPT-4를 넘어서지 못했다.</li>
<li>그래서 이 낮은 성능의 원인을 조사한다.</li>
</ul>
</li>
</ul>
<h3 id="analysis-2">Analysis</h3>
<ul>
<li>Self-reflection을 사용하는 code generation agent는 diverse &amp; comprehensive 한 test 작성 능력에 따라 성능이 좌우된다.<ul>
<li>1) Test suite를 잘못 만들 경우, 모든 테스트를 통과했을지라도 이는 False Positive로 이어진다.</li>
<li>2) 반면 잘못된 test suite가 올바른 solution에서 실패를 유발한다면 이는 False Negative로 이어진다.</li>
<li>Reflexion은 1) 보다는 2)을, 즉 False Negative(올바른 솔루션을 잘못된 성공으로 분류)를 선호한다.<ul>
<li>False Negative는 agent가 self-reflection을 통해 잘못된 테스트를 식별하고, 원래 코드 구현을 유지하도록 스스로 유도할 수 있기 때문</li>
<li>그러나 False Positive는 agent로 하여금 잘못된 결과를 조기에 제출하게 할 수 있다.</li>
</ul>
</li>
</ul>
</li>
<li>Table 2는 다양한 성능 지표를 나타낸다.
<img src="https://velog.velcdn.com/images/dutch-tulip/post/10709ce3-68f8-4bd3-8a0e-a15688f88fc6/image.png" alt=""></li>
<li>앞서서 MBPP Python이 baseline인 GPT-4보다 낮은 성능이 보인다는 것을 확인했다.<ul>
<li>그리고 Table 2에서는 False Positive 수치들의 불일치를 확인했다.</li>
<li>이는, P(not pass@1 generation correct | tests pass), 즉, ‘모든 unit test를 통과했지만 실제로는 올바르지 않은 result가 있을 확률’을 나타낸다.</li>
</ul>
</li>
<li>HumanEval과 MBPP Python에서 baseline의 pass@1 accuracy는 82%, 80%로 비교적 유사하다.<ul>
<li>그러나 MBPP Python의 FP rate는 16.3%로, HumanEval python의 1.4%에 비해 휠씬 높다.</li>
<li>이는 MBPP Python의 낮은 신뢰성을 의미한다.</li>
</ul>
</li>
</ul>
<h3 id="ablation-study">Ablation study</h3>
<ul>
<li>Reflexion의 test generation과 self-reflection cooperation 요소를 HumanEval Rust의 가장 어려운 50개 집합에서 실험했다.<ul>
<li>1) internal test generation &amp; execution step 생략<ul>
<li>Agent의 현재 구현이 맞는지 확인할 때, unit test 없이 self-reflection을 수행하도록 테스트했다.</li>
<li>이는 accuracy가 52%로 떨어지며, baseline의 60%보다 낮고, unit test 없이는 agent가 조기 종료없이 잘못된 수정작업을 진행함을 보여준다.</li>
</ul>
</li>
<li>2) Self-reflection 생략<ul>
<li>Unit test 실패 이후에 자연어 설명 단계를 제거해, agent가 모든 unit test에 대한 오류 식별 및 구현 개선 작업을 통합하도록 강제했다.</li>
<li>이 경우 baseline보다 성능이 향상되지 않았다.(동일)</li>
<li>오류는 잘 찾지만, 수정작업에서 오류를 반영하지 못했다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/91c9b411-d001-4d1d-9459-4f5d4459f2a0/image.png" alt=""></p>
<h2 id="limitations">Limitations</h2>
<ul>
<li>Reflexion은 본질적으로 자연어를 통해 policy optimization을 수행하는 최적화 기법이다.<ul>
<li>Policy optimization은 experience를 통해 action choice를 개선하는 강력한 접근법이지만, 여전히 local minima에 수렴할 가능성이 있다.</li>
<li>이 연구에서는 long-term memory를 maximum capacity를 갖는 sliding window로 제한했지만, 향후 연구에서는 이 메모리 구조를 더 발전된 구조로 확장할 것을 권장한다.</li>
</ul>
</li>
<li>Code generation과 관련해서는, 정확한 input-output mapping을 지정하는 test-driven development에 여러 한계가 있다. 즉, 여러 함수들은 입력에 대해 출력을 예측하기 현실적으로 어려워 (결과가 비결정적, 환경의존적 등) 평가하는 것에 제한이 있다.</li>
</ul>
<h2 id="conclusion">Conclusion</h2>
<ul>
<li>Verbal enhancement를 통해 agent가 과거의 실수로부터 학습하도록 돕는 Reflexion 제안. 성능 우수.</li>
<li>향후 연구에서는 Reflexion이 자연어에서의 value learning이나 off-policy exploration 기법 같은 전통적 강화학습 설정에서 연구된 더 발전된 기술을 활용할 수 있을 것이다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Survey] Deep dive into AI Agent & Multi-Agent System (MAS)]]></title>
            <link>https://velog.io/@dutch-tulip/ai-agent</link>
            <guid>https://velog.io/@dutch-tulip/ai-agent</guid>
            <pubDate>Mon, 25 Nov 2024 03:16:00 GMT</pubDate>
            <description><![CDATA[<h2 id="ai-agent">AI Agent</h2>
<ul>
<li>언어 모델을 기반으로 인간을 대신해 특정 목적을 달성하기 위해 설계된 지능형 시스템</li>
<li>주어진 입력(텍스트, 명령어, 대화 등)을 처리해 원하는 출력(정보, 결정, 행동 등)을 생성</li>
<li>특정 작업 및 특정 사례에 특화되어 사용 가능 </li>
<li>LangChain에서는 AI Agent를, ‘LLM을 사용해 애플리케이션의 제어 흐름을 결정하는 시스템’이라고 정의</li>
</ul>
<h3 id="그럼-우리는-왜-ai-agent를-사용할까-아니-왜-사용해야-할까">그럼 우리는 왜 AI Agent를 사용할까, 아니 왜 사용해야 할까?</h3>
<ul>
<li>일반적인 LLM 기반 서비스 사용자들(ChatGPT and so on…)은 zero-shot mode로 최종 결과물을 출력하게 사용한다.<ul>
<li>이는 누군가에게 처음부터 끝까지 에세이를 써달라고 하면서도, backspace없이 정확히 typing하고 higy quality의 result를 기대하는 것과 비슷하다.</li>
<li>그러나 LLM은 이러한 어려움을 이겨내고 잘 해낸다.</li>
</ul>
</li>
<li>AI Agent를 사용하면, LLM에게 최종 출력물을 내기 전에 내부적으로 작업을 여러번 반복하도록 할 수 있다(출력 퀄리티를 높이기 위해).</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/1809dc60-f3f6-4849-8772-99c8d3a3b2f2/image.png" alt=""></p>
<ul>
<li>실제로 GPT-3.5와 GPT-4에서 zero-shot과 agent workflow로 HumanEval(코드 생성 벤치마크) 퍼포먼스를 비교한 결과, agent를 사용했을 때 월등한 성능 향상을 보였다.<ul>
<li>GPT-3.5 with agent는 GPT-4 Vanilla 보다 성능이 좋다..</li>
</ul>
</li>
</ul>
<h3 id="ai-agent의-구조">AI Agent의 구조</h3>
<ul>
<li>AI Agent의 구조는 크게 5개로 나눌 수 있다.</li>
<li>코어가 되는 LLM, 그리고 Planning/Action/Profile/Memory</li>
</ul>
<ol>
<li><strong>LLM</strong><ul>
<li>사람으로 치면 두뇌다. 텍스트를 처리하고 의사결정을 한다.</li>
</ul>
</li>
<li><strong>Planning</strong><ul>
<li>AI Agent는 복잡한 objective를 작은 task로 나눌 줄 아는 능력이 중요하다.</li>
<li>이는 planning module을 통해 수행되며, 다음과 같은 동작들을 수행한다<ul>
<li>주어진 objective 분석</li>
<li>목표 달성 위해 필요한 단계 파악</li>
<li>단계들의 우선 순위 선정</li>
<li>새 정보들이 들어오면 계획을 수정하기</li>
</ul>
</li>
</ul>
</li>
<li><strong>Action</strong><ul>
<li>Ai agent가 task를 수행하기 위해 tool과 interact하는 component.</li>
<li>웹 검색, 코드 실행, DB 접근, API 사용, 다른 SW와 interact 등</li>
<li>이런 tool들을 얼마나 잘 쓰는지가 AI agent가 얼마나 넓은 범위의 작업을 할 수 있는지를 결정한다.<ul>
<li>tool의 사용으로 generative execution에서 deterministic execution으로 바뀌기 때문</li>
<li>llm이 생성하는 단순 언어적 응답이 아닌 tool을 사용한 구체적인 출력으로 인해 정확하고 신뢰성 있는 응답, 확장성과 유연성</li>
</ul>
</li>
</ul>
</li>
<li><strong>Profile</strong><ul>
<li>AI Agent의 행동, 성격, 기능을 정의한다. chat_template에서 role system과 비슷한 역할<ul>
<li>Agent의 전문 분야, tone &amp; communication style 등</li>
</ul>
</li>
</ul>
</li>
<li><strong>Memory</strong><ul>
<li>Memory를 통해 agent는 과거 정보를 저장하고 불러오는 것은 아래 상황에서 중요함:<ul>
<li>진행 중인 대화에서 context 유지하기</li>
<li>과거 경험으로부터 학습하기</li>
<li>점진적으로 성능을 향상시킴</li>
<li>user history에 따라 personalized된 응답 제공</li>
</ul>
</li>
</ul>
</li>
</ol>
<h2 id="multi-agent-systemmas">Multi-Agent System(MAS)</h2>
<ul>
<li>Multi-Agent System은 앞서 말했듯 여러 에이전트가 결합된 하나의 시스템으로, 한 분야에 특화된 에이전트가 각 역할을 맡아 양질의 출력을 낸다.</li>
<li>MAS에도 Reflection, Tool Use, Planning이 당연히 사용된다.</li>
</ul>
<h2 id="ai-agent-detailed">AI Agent Detailed</h2>
<ul>
<li>Agentic pattern은 AI agent들이 어떻게 동작하고 interact 하는지 가이드하는 프레임워크다. 최근 연구에서 확인된 주요 패턴은 다음과 같다.<ul>
<li><strong>Reflection</strong></li>
<li><strong>Tool Use</strong></li>
<li><strong>Planning</strong></li>
<li><strong>Multi-Agent Collaboration</strong></li>
</ul>
</li>
</ul>
<ol>
<li><strong>Reflection</strong></li>
</ol>
<ul>
<li>이 글에서 reflection은 반성, 반영 정도로 해석가능할 것 같다.</li>
<li>Reflection은 AI Agent가 자신의 출력을 분석하고 평가하는 능력을 의미한다.</li>
<li>Agent의 출력을 스스로 평가하여 개선을 위한 피드백을 제공할 수 있다.</li>
</ul>
<pre><code>1-1. **MAS에서의 Reflection**

- MAS에서 reflection은 두 에이전트가 서로 피드백을 주고 받는 방식으로 구현할 수 있다.
    - A 에이전트는 high quality의 output을 생성하도록 prompt를 받고,
    - B 에이전트는 A 에이전트의 output을 critic하게 평가하고 constructive한 피드백을 준다.
- 이런 방식으로 더욱 개선된 response가 생성될 수 있다.</code></pre><ol start="2">
<li><strong>Tool Use</strong></li>
</ol>
<ul>
<li>LLM의 사전 학습된 지식만으로는 출력을 생성하는 데 한계가 있다는 것을 깨닫게 되었다..</li>
<li>Agent는 아래와 예시와 같은 tool들을 사용해 역량을 확장한다<ul>
<li>Web Search: Agent가 Web Search와 결합되면 학습 데이터 범위를 넘어선 정보를 얻을 수 있으며, 이를 통해 knowledge base를 크게 확장한다.</li>
<li>Code Execution: 단순히 코드를 추론하는데 그치지 않고, 코드를 작성한 뒤 실행해보며 출력물을 실제로 testing &amp; application 해볼 수 있다.</li>
<li>Python을 실행하는 것도 tool use이다.</li>
</ul>
</li>
<li>LLM이 {tool: web-search, query: &quot;coffee maker reviews&quot;}같은 문자열을 생성하도록 fine tuning되거나, few shot 프롬프팅을 사용한다.<ul>
<li>이후 post processing에서 문자열을 검색해 tool을 호출해 그 결과를 다시 llm에 전달한다.</li>
</ul>
</li>
</ul>
<ol start="3">
<li><strong>Planning(+Reasoning)</strong></li>
</ol>
<ul>
<li>Planning과 Reasoning을 함께 묶어서 LLM이 어떤 행동을 취할지 생각하는 능력이라고 보는 경우도 있다.</li>
<li>LLM은 복잡한 task를 다루기 위해 task를 manageable한 step들로 나누는 능력을 갖고 있다.</li>
<li>이는 agent가 목표를 달성하기 위해 필요한 행동들의 순서를 고려한뒤 체계적으로 문제를 해결할 수 있게 한다.</li>
<li>Planning을 이해하기 위해, HuggingGPT 논문에서의 예시를 단순화해보면 아래와 같다.<ul>
<li>“소년의 사진을 보고, 동일한 자세를 취한 소녀의 그림을 그려줘”라고 요청할 경우, task는 두 단계로 나뉜다.<ul>
<li>소년 사진에서 pose detect</li>
<li>detected pose를 기반으로 소녀의 그림을 랜더링</li>
</ul>
</li>
<li>LLM은 {tool: pose-detection, input: image.jpg, output: temp1 } 과 같은 구조화된 문자열을 생성하도록 fine tuning되거나, few shot 프롬프팅으로 plan을 설정할 수 있는 것이다.</li>
</ul>
</li>
<li>Planning은 언제 필요할까?<ul>
<li>planning이 항상 필요하진 않다. 고정된 횟수만큼의 reflection을 통해 생성물을 개선하면 이 agent는 fixed하며 deterministic하다.</li>
<li>그러나 task를 사전에 단계별로 쪼갤 수 없는 경우에는, planning을 통해 agent가 동적으로 단계별 실행을 결정할 수 있다.</li>
</ul>
</li>
<li>Planning은 복잡한 작업을 agent가 독립적으로 적절하게 나누어 수행한다는 장점이 있지만, 그 step과 최종 output에 대한 예측 가능성이 떨어진다는 단점이 있다.</li>
<li>복잡한 작업을 잘 planning &amp; reasoning하여 수행하는 것은 쉽지 않은데, 왜냐하면<ol>
<li>LLM으로 하여금 큰 그림을 본 다음에 다시 단기적인 action을 하도록 해야 하고, </li>
<li>agent가 많은 작업을 하면 할수록 그 결과들이 llm에 피드백되므로 context window가 커지고, 결국 모델은 ‘distracted(산만해짐)’되어 성능이 낮아질 수 있다.</li>
</ol>
</li>
<li>Planning의 성능을 개선하기 위한 가장 낮은 단계의 해결책은 plan과 reason을 위한 모든 정보를 확보하는 것이다.<ul>
<li>종종 prompt에는 정보가 충분하지 않은 경우가 많다.</li>
</ul>
</li>
<li>또한 retrieval step을 추가하거나 prompt instruction을 명확히 하면 성능이 개선될 수 있다.</li>
<li>이후에는 애플리케이션의 cognitive architecture를 변경해보는 것이 좋다.<ul>
<li>cognitive architecture: 애플리케이션이 추론하는 데 사용하는 data engineering logic</li>
<li>gereral cognitive arch.(AlphaCodium 등) 와 domain specific cognitive arch. (커스텀 구현) 로 나뉜다.</li>
</ul>
</li>
</ul>
<ol start="4">
<li><strong>Multi-Agent Collaboration</strong></li>
</ol>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/c0172467-a679-462d-b713-9a3841a84f3e/image.png" alt=""></p>
<ul>
<li>하나에 특화된 agent들이 여러 개 모여서 Multi-Agent System(MAS)를 이룰 수 있다.</li>
<li>일반적인 개발 회사에서와 같이 기획, 디자인, 개발, QA 등의 전문적인 역할을 나누어 수행할 수 있다고 볼 수 있다.</li>
<li>MAS는 하나 혹은 여러 LLM을 프롬프트하여 서로 다른 task를 수행하도록 설정함으로써 구현할 수 있다.<ul>
<li>EX) 당신은 명확하고 효율적인 코드를 작성하는 전문가입니다. 다음 작업을 수행하기 위한 코드를 작성하세요. …</li>
</ul>
</li>
<li>한 LLM을 여러번 호출하면서도 여러 agent를 사용하는 programming abstraction을 적용하는 것은 직관에 반대되는 것처럼 보일 수도 있다. 하지만 이런 방식에는 몇가지 이유가 있다.<ul>
<li>먼저 결과가 좋다(ㅋㅋㅋ).<ul>
<li>좋은 성능이 실제로 가장 설득력 있는 이유가 된다. AutoGen 논문 등에서 수행한 ablation study에서도 multiple agents가 single agent보다 뛰어난 성능을 보이는 것을 나타낸다.</li>
</ul>
</li>
<li>LLM의 input context limitation을 보완한다.<ul>
<li>일부 최신 LLM은 100만 토큰의 긴 input context를 지원하지만, 길면서도 complex한 input을 truly understand하는 능력은 제한적이다.</li>
<li>한 번에 하나의 세부 작업에 집중하도록 LLM을 프롬프트하는 agent workflow는 더 좋은 성능을 제공한다.</li>
</ul>
</li>
<li>복잡한 작업을 잘 나눌 수 있게 한다.<ul>
<li>MAS가 복잡한 task를 세부 작업으로 분해하는 기능은 단일 CPU에서 프로그램을 실행할 때 여러 프로세스나 스레드로 나누는 방식과 유사하다.</li>
</ul>
</li>
</ul>
</li>
<li>MAS는 AutoGen, CrewAI, LangGraph 등의 프레임워크로 구현가능하다.</li>
<li>MAS는 planning과 마찬가지로 output의 quality를 미리 예측하기 어렵다.</li>
</ul>
<p><strong>Paper</strong>:</p>
<p>Reflection</p>
<ul>
<li>“<a href="https://arxiv.org/abs/2303.17651?utm_campaign=The%20Batch&amp;utm_source=hs_email&amp;utm_medium=email&amp;_hsenc=p2ANqtz-9dHVnW1I1bA3sPBbsikjT165Qez3QiiAssknCERwgki818YHG7PyHOQSgg-nxKDa0BuE7B">Self-Refine: Iterative Refinement with Self-Feedback</a>,” Madaan et al. (2023)</li>
<li>“<a href="https://arxiv.org/abs/2303.11366?utm_campaign=The%20Batch&amp;utm_source=hs_email&amp;utm_medium=email&amp;_hsenc=p2ANqtz-9dHVnW1I1bA3sPBbsikjT165Qez3QiiAssknCERwgki818YHG7PyHOQSgg-nxKDa0BuE7B">Reflexion: Language Agents with Verbal Reinforcement Learning</a>,” Shinn et al. (2023)</li>
<li>“<a href="https://arxiv.org/abs/2305.11738?utm_campaign=The%20Batch&amp;utm_source=hs_email&amp;utm_medium=email&amp;_hsenc=p2ANqtz-9dHVnW1I1bA3sPBbsikjT165Qez3QiiAssknCERwgki818YHG7PyHOQSgg-nxKDa0BuE7B">CRITIC: Large Language Models Can Self-Correct with Tool-Interactive Critiquing</a>,” Gou et al. (2024)</li>
</ul>
<p>Tool Use</p>
<ul>
<li>“<a href="https://arxiv.org/abs/2305.15334?utm_campaign=The%20Batch&amp;utm_source=hs_email&amp;utm_medium=email&amp;_hsenc=p2ANqtz--9ARMthd09q0ABUi-abo6BH62BLbcwPo13LrXs9hUezs-L050Ay7b_rHdWuRIqBVOD6k_S">Gorilla: Large Language Model Connected with Massive APIs</a>,” Patil et al. (2023)</li>
<li>“<a href="https://arxiv.org/abs/2303.11381?utm_campaign=The%20Batch&amp;utm_source=hs_email&amp;utm_medium=email&amp;_hsenc=p2ANqtz--9ARMthd09q0ABUi-abo6BH62BLbcwPo13LrXs9hUezs-L050Ay7b_rHdWuRIqBVOD6k_S">MM-REACT: Prompting ChatGPT for Multimodal Reasoning and Action</a>,” Yang et al. (2023)</li>
<li>“<a href="https://arxiv.org/abs/2401.17464?utm_campaign=The%20Batch&amp;utm_source=hs_email&amp;utm_medium=email&amp;_hsenc=p2ANqtz--9ARMthd09q0ABUi-abo6BH62BLbcwPo13LrXs9hUezs-L050Ay7b_rHdWuRIqBVOD6k_S">Efficient Tool Use with Chain-of-Abstraction Reasoning</a>,” Gao et al. (2024)</li>
</ul>
<p>Planning</p>
<ul>
<li>“<a href="https://arxiv.org/abs/2201.11903?utm_campaign=The%20Batch&amp;utm_source=hs_email&amp;utm_medium=email&amp;_hsenc=p2ANqtz-8Kh954rkXmE4vgpKvro3Klpjhn7IuT-Y_eXIYtgVIq9PTzwa5zFWX7FZZqv1tuDEEsTDuY">Chain-of-Thought Prompting Elicits Reasoning in Large Language Models</a>,” Wei et al. (2022)</li>
<li>“<a href="https://arxiv.org/abs/2303.17580?utm_campaign=The%20Batch&amp;utm_source=hs_email&amp;utm_medium=email&amp;_hsenc=p2ANqtz-8Kh954rkXmE4vgpKvro3Klpjhn7IuT-Y_eXIYtgVIq9PTzwa5zFWX7FZZqv1tuDEEsTDuY">HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face</a>,” Shen et al. (2023)</li>
<li>“<a href="https://arxiv.org/pdf/2402.02716.pdf?utm_campaign=The%20Batch&amp;utm_source=hs_email&amp;utm_medium=email&amp;_hsenc=p2ANqtz-8Kh954rkXmE4vgpKvro3Klpjhn7IuT-Y_eXIYtgVIq9PTzwa5zFWX7FZZqv1tuDEEsTDuY">Understanding the planning of LLM agents: A survey</a>,” by Huang et al. (2024)</li>
</ul>
<p>Multi-Agent Collaboration</p>
<ul>
<li>“<a href="https://arxiv.org/abs/2307.07924?utm_campaign=The%20Batch&amp;utm_source=hs_email&amp;utm_medium=email&amp;_hsenc=p2ANqtz-8TZzur2df1qdnGx09b-Fg94DTsc3-xXao4StKvKNU2HR51el3n8yOm0CPSw6GiAoLQNKua">Communicative Agents for Software Development</a>,” Qian et al. (2023) (the ChatDev paper)</li>
<li>“<a href="https://arxiv.org/abs/2308.08155?utm_campaign=The%20Batch&amp;utm_source=hs_email&amp;utm_medium=email&amp;_hsenc=p2ANqtz-8TZzur2df1qdnGx09b-Fg94DTsc3-xXao4StKvKNU2HR51el3n8yOm0CPSw6GiAoLQNKua">AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation</a>,” Wu et al. (2023)</li>
<li>“<a href="https://arxiv.org/abs/2308.00352?utm_campaign=The%20Batch&amp;utm_source=hs_email&amp;utm_medium=email&amp;_hsenc=p2ANqtz-8TZzur2df1qdnGx09b-Fg94DTsc3-xXao4StKvKNU2HR51el3n8yOm0CPSw6GiAoLQNKua">MetaGPT: Meta Programming for a Multi-Agent Collaborative Framework</a>,” Hong et al. (2023)</li>
</ul>
<p><strong>출처</strong>:</p>
<ul>
<li><a href="https://medium.com/@vinitgela/the-rise-of-ai-agents-91f93379c0c8">Mastering AI Agents: From Basics to Multi-Agent Systems</a></li>
<li><a href="https://www.deeplearning.ai/the-batch/how-agents-can-improve-llm-performance/">Agentic Design Patterns Part 1: Four AI agent strategies that improve GPT-4 and GPT-3.5 performance</a></li>
<li><a href="https://www.deeplearning.ai/the-batch/agentic-design-patterns-part-2-reflection/">Agentic Design Patterns Part 2, Reflection</a></li>
<li><a href="https://www.deeplearning.ai/the-batch/agentic-design-patterns-part-3-tool-use/">Agentic Design Patterns Part 3, Tool Use</a></li>
<li><a href="https://www.deeplearning.ai/the-batch/agentic-design-patterns-part-4-planning/">Agentic Design Patterns Part 4, Planning</a></li>
<li><a href="https://www.deeplearning.ai/the-batch/agentic-design-patterns-part-5-multi-agent-collaboration/">Agentic Design Patterns Part 5, Multi-Agent Collaboration</a></li>
<li><a href="https://blog.langchain.dev/what-is-an-agent/">What is an AI agent?</a></li>
<li><a href="https://blog.langchain.dev/planning-for-agents/">Planning for Agents</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Differential Transformer (Diff Transformer) (2024)]]></title>
            <link>https://velog.io/@dutch-tulip/differential-transformer</link>
            <guid>https://velog.io/@dutch-tulip/differential-transformer</guid>
            <pubDate>Mon, 11 Nov 2024 03:57:03 GMT</pubDate>
            <description><![CDATA[<p>By Microsoft Research Team</p>
<p><a href="https://arxiv.org/pdf/2402.19473">논문 링크</a></p>
<p>From arXiv, 2024</p>
<h1 id="0-abstract">0. Abstract</h1>
<ul>
<li>Transformer는 무관한 context에도 지나치게 attention 연산이 수행되는 경향이 있다.</li>
<li>우리가 제안하는 Diff Transformer는 ‘유’관한 context에 대한 attention을 극대화하면서도 노이즈를 줄인다.<ul>
<li>Differential attention은 두 개의 서로 다른 softmax 함수로 계산된 attention 가중치 행렬(map)의 차를 구해 attention score를 구한다.</li>
</ul>
</li>
<li>모델이나 토큰 크기를 확장했을 떄 기존 transformer보다 성능이 우수하며, long-context modeling같은 실용적인 task에서 성능이 특히 좋았다.</li>
<li>In-context learning에서는 robustness 도 좋았다.</li>
</ul>
<h1 id="1-introduction">1. Introduction</h1>
<ul>
<li>Transformer의 중심에는 softmax를 통해 토큰의 중요성을 순서대로 평가하는 attention machanism이 있다.</li>
<li>그러나 최근 연구에 따르면 LLM은 context에서 key info를 찾는데 어려움을 겪고 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/3a039192-5b5d-4dce-8391-c49b0ff4a9a4/image.png" alt=""></p>
<ul>
<li><p>Figure 1의 왼쪽 그림을 보면, Transformer는 document 가운데에 있는 정답에 적은 비율의 attention score만을 할당했으며, 무관한 context에도 불균형하게 집중한 것을 알 수 있다.</p>
</li>
<li><p>이렇듯 Transformer는 정답이 아닌 context에 attention score를 할당해 올바른 정답을 놓치고 있으며, 이런 잘못된 score를 논문에서는 ‘attention noise’라고 한다.</p>
</li>
<li><p>Diff Transformer에서는 query와 key vector를 두 그룹으로 나누고, 두 개의 서로 다른 softmax attention map을 계산한다.</p>
<ul>
<li>그리고 그 두 값의 차가 attention score로 사용된다.</li>
<li>노이즈 캔슬링 헤드폰이 두 신호의 차이를 사용하는 것과 비슷하다.</li>
</ul>
</li>
<li><p>Figure 1의 가운데 그림을 보면, Diff Transformer의 attention score 점수가 transformer에 비해 정답에 휠씬 높은 점수를 할당하고 관련 없는 컨텍스트에는 낮은 점수를 할당하는 것을 알 수 있다.</p>
</li>
<li><p>Figure 1의 오른쪽 그림을 보면 Diff transformer는 Retreval 성능을 많이 향상시킨다.</p>
</li>
<li><p>Diff Transformer는 language modeling에서도 transformer의 65% 모델 사이즈와 training 토큰으로 유사한 language modeling 성능을 낸다.</p>
</li>
<li><p>또한 Diff transformer는 transformer의 여러 downstream task에서도 좋은 성능을 낸다.</p>
<ul>
<li>Long-sequence evualuation을 통해 증가하는 context를 처리하는데 효율적임을 보인다.</li>
<li>Key information retrieval, Hallucination mitigation, Incontext learning에서 기존 transformer보다 높은 성능을 보인다.</li>
</ul>
</li>
<li><p>또한 Model activation을 위한 outlier를 줄여 quntization을 위한 여지를 제공한다.</p>
</li>
</ul>
<h2 id="21-differential-transformer">2.1 Differential Transformer</h2>
<ul>
<li><p>Attention은 query와 key vector를 사용해 attention score를 계산하고, 이후 value vector의 weighted sum을 구한다.</p>
</li>
<li><p>Diff Transformer의 중요한 설계는 두 개의 softmax 함수를 사용해 attention score의 노이즈를 줄이는 것이다.</p>
</li>
<li><p>입력이 X ∈ R^(N x d_model)일 때 이를 q, k, v 값으로 projection하여 Q_1, Q_2, K_1, K_2 ∈ R^(N x d), V ∈ R^(N x 2d) 을 얻는다.</p>
</li>
<li><p>Differential Attention 함수인 DiffAttn()은 아래와 같이 출력을 계산한다</p>
<p>  $$
  \begin{aligned}
  [Q_1; Q_2] &amp;= XW^Q, \quad [K_1; K_2] = XW^K, \quad V = XW^V, \
  \text{DiffAttn}(X) &amp;= \left( \text{softmax}\left(\frac{Q_1 K_1^T}{\sqrt{d}}\right) - \lambda \cdot \text{softmax}\left(\frac{Q_2 K_2^T}{\sqrt{d}}\right) \right) V
  \end{aligned}</p>
<p>  $$</p>
</li>
<li><p>3개의 W(가중치)는 parameter이며, λ는 학습가능한 스칼라값이다.</p>
</li>
<li><p>λ는 아래와 같이 re-parameterize된다.</p>
</li>
</ul>
<p>$$
\lambda = \exp(\lambda_{q1} \cdot \lambda_{k1}) - \exp(\lambda_{q2} \cdot \lambda_{k2}) + \lambda_{\text{init}}
$$</p>
<ul>
<li><p>앞의 4개의 λ는 학습 가능한 벡터이며, λ_init ∈ (0,1)은 λ 초기화를 위한 상수이다.</p>
</li>
<li><p>Differential attention은 두 softmax attention 함수의 차를 통해 attention noise를 제거한다.</p>
<ul>
<li>노이즈 캔슬링 헤드폰의 설계 원리와 유사</li>
</ul>
</li>
<li><p>FlashAttention을 직접 재사용할 수도 있다.</p>
</li>
</ul>
<h3 id="211-multi-head-differential-attention">2.1.1 Multi-Head Differential Attention</h3>
<ul>
<li>Diff Transformer는 multi-head mechanism도 사용한다.</li>
<li>헤드 수 h에 대해 서로 다른 projection matrix W_i^Q,W_i^K,W_i^V(i∈[1,h])를 사용한다.</li>
<li>각 head는 아래와 같이 계산된다.</li>
</ul>
<p>$$
\text{head}_i = \operatorname{DiffAttn}(\mathbf{X}; \mathbf{W}_i^Q, \mathbf{W}_i^K, \mathbf{W}_i^V, \lambda)</p>
<p>$$</p>
<ul>
<li>헤드의 출력은 정규화된 뒤 projection되어 아래와 같은 방식으로 multihead diff attention 연산을 수행한다.</li>
</ul>
<p>$$
\text{MultiHead}(\mathbf{X}) = \operatorname{Concat}(\text{head}_1, \dots, \text{head}_h)\mathbf{W}^O</p>
<p>$$</p>
<ul>
<li>head의 수 h는 d_model / 2d로 잡았다(d는 transformer의 head 차원).</li>
<li>이 방식은 결과적으로 모델이 서로 다른 유형의 유효한 정보를 병렬로 집중할 수 있게 해서 중요한 문맥을 더 잘 잡을 수 있게 한 것이다.</li>
</ul>
<h3 id="212-headwise-normalization">2.1.2 Headwise Normalization</h3>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/69388397-22c1-41ec-9cf2-04bcbf1b2ffe/image.png" alt=""></p>
<ul>
<li>Figure 2에서는 Layer Normalization이 각 head에 독립적으로 적용되었다는 것을 강조하기 위해 GroupNorm을 사용한다.</li>
<li>Diff attention은 sparse한 pattern을 갖는 경향이 있으므로, 각 헤드의 통계적 정보가 다양할 수 있다.<ul>
<li>따라서 헤드 별 정규화는 gradient statistics를 개선하고 학습 과정을 안정화하는데 도움이 된다.</li>
</ul>
</li>
</ul>
<h2 id="22-overall-architecture">2.2 Overall Architecture</h2>
<ul>
<li><p>전체 구조는 L개의 레이어를 쌓았으며, 각 레이어는 multi-head diff attention 모듈과 feed-forward network 모듈을 포함한다.</p>
</li>
<li><p>정리)</p>
<ul>
<li>Multi head diff attention은 유효한 context에 대한 attention은 amplify하고 noise는 제거하는 attention machanism이다.</li>
<li>Feed foward network는 기존 transformer 아키텍처에서 사용되는 FFN과 유사한 것으로 보인다.</li>
</ul>
</li>
<li><p>Diff Transformer 레이어는 다음과 같이 표현 가능하다.</p>
<p>  $$
  \mathbf{Y}^l = \operatorname{MultiHead}(\operatorname{LN}(\mathbf{X}^l)) + \mathbf{X}^l\quad\\mathbf{X}^{l+1} = \operatorname{SwiGLU}(\operatorname{LN}(\mathbf{Y}^l)) + \mathbf{Y}^l
  $$</p>
</li>
<li><p>LN(): RMSNorm Layer Normalization, SwiGLU(): SwiGLU Activation fuction</p>
</li>
</ul>
<h1 id="3-experiments">3. Experiments</h1>
<h2 id="31-language-modeling-evaluation">3.1 Language Modeling Evaluation</h2>
<ul>
<li>3B 크기의 Diff Transformer를 1T 토큰에 학습시킨 모델의 언어 모델링 성능을 기존 Transformer-based 모델을 350B 토큰에 학습한 모델과 비교한다.</li>
<li>SableLM, OpenLLaMA 등의 Transformer 기반 모델과 여러 다운스트림 작업에서 비교한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/70f470b4-90a5-4709-8a64-65dbc0fcb238/image.png" alt=""></p>
<ul>
<li>Diff Transformer는 동일 사이즈의 Transformer보다 여러가지 task에서 우수한 성능을 보였다.</li>
</ul>
<h2 id="32-scalability-compared-with-transformer">3.2 Scalability Compared with Transformer</h2>
<ul>
<li>Diff Transformer와 Transformer의 모델 크기와 훈련 토큰 수에 따른 scalability를 평가했다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/bfd6ca72-1255-470a-9615-96b0bb0324af/image.png" alt=""></p>
<h3 id="321-scaling-model-size">3.2.1 Scaling Model Size</h3>
<ul>
<li>830M부터 13B까지 모델 파라미터를 단계적으로 확장하여 비교했다.</li>
<li>Figure 3(a)에 따르면, 6.8B Diff Transformer가 11B 크기의 기존 Transformer와 유사한 성능을 보였다.</li>
</ul>
<h3 id="322-scaling-training-tokens">3.2.2 Scaling Training Tokens</h3>
<ul>
<li>3B 크기 모델을 360B 토큰까지 학습해 평가했으며, Diff Transformer는 Transformer 대비 63.7%의 토큰만으로도 유사한 성능을 달성했다.</li>
</ul>
<h2 id="33-long-context-evaluation">3.3 Long-Context Evaluation</h2>
<ul>
<li>Diff Transformer는 context 길이를 64K까지 확장하여 long context에서의 성능을 평가했다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/23352eac-2f06-432a-8515-8729a89461ba/image.png" alt=""></p>
<ul>
<li>결과적으로 Diff Transformer는 Transformer보다 낮은 Negative Log Likelihood를 기록하며 long context에서 효과적임을 입증했다.</li>
</ul>
<h2 id="34-key-information-retrieval">3.4 Key Information Retrieval</h2>
<ul>
<li>Needle-In-A-Haystack test를 통해 Diff Transformer와 Transformer의 Information Extract 능력을 평가했다.</li>
</ul>
<h3 id="341-342-retrieve-from-4k--64k-context-length">3.4.1, 3.4.2 Retrieve from 4K &amp; 64K Context Length</h3>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/0eaf35e1-63b6-4552-9640-539ebefb9dc1/image.png" alt=""></p>
<ul>
<li>4K와 64K 길이의 문맥에서 Multi-needle retrieval test에서 Diff Transformer는 Transformer보다 높은 accuracy를 유지했으며, 중요한 정보가 context의 첫 절반에 위치할 때에는 Transformer보다 76% 이상 개선된 성능을 보였다.</li>
</ul>
<h3 id="343-attention-score-analysis">3.4.3 Attention Score Analysis</h3>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/7bd33f61-2387-4764-8d93-8c4b02fcdb19/image.png" alt=""></p>
<ul>
<li>Diff Transformer는 정답 구간에 더 높은 attention score를 할당하고, noise에 대한 attention은 낮추는 것으로 나타났다.</li>
</ul>
<h2 id="35-in-context-learning">3.5 In-context Learning</h2>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/e2101eab-9d67-4233-9301-fb32eced6c52/image.png" alt=""></p>
<ul>
<li>Diff Transformer는 few shot classification 작업에서 Transformer보다 더 높은 accuracy를 기록했으며,</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/cce1dd1a-2527-47bb-8bf3-2238ade9b5c0/image.png" alt=""></p>
<ul>
<li>컨텍스트 내의 example 순서의 변동에 덜 민감한 robust한 성능을 보였다.</li>
</ul>
<h2 id="36-contextual-hallucination-evaluation">3.6 Contextual Hallucination Evaluation</h2>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/989bea47-17ed-4963-ad85-4c382f53ca81/image.png" alt=""></p>
<ul>
<li>Diff Transformer는 Summarization과 QA task에서 Transformer보다 contextual hallucination을 더 많이 줄였다. (Table 4)</li>
<li>이는 Diff Transformer가 불필요한 context에 덜 분산되고 중요한 정보에 더 집중할 수 있기 때문으로 분석된다.</li>
</ul>
<h2 id="37-activation-outliers-anlaysis">3.7 Activation Outliers Anlaysis</h2>
<ul>
<li>참고) Activation Outliers(활성화 이상치): 신경망에서 뉴런이 비정상적으로 큰 값이나 작은 값을 출력하는 현상<ul>
<li>뉴런이 지나치게 활성화되거나, 가중치나 편향이 비정상적으로 커지거나 작아지거나, 데이터 자체가 이상치거나, 활성화 함수 자체의 문제(ReLU는 음수 0으로 보내니까) 등등..</li>
<li>일반화 성능 저하되고 훈련이 불안정적으로 변하는 등의 문제가 생긴다!</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/3b5dc112-4ed2-460b-9248-0c5c1306a044/image.png" alt=""></p>
<ul>
<li>Diff Transformer는 Transformer에 비해 Activation Outliers의 크기를 줄였으며, 이로 인해 양자화가 더 효율적으로 가능함을 확인 했다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/88b24d81-e32d-4e50-8438-d7e20130ca86/image.png" alt=""></p>
<ul>
<li>Activation Outliers 통계에서 Diff Transformer는 Attention Logits과 Hidden States에서 Largest Activation Values가 낮아졌으며, 4Bit 양자화에서도 Transformer보다 25% 높은 정확도를 기록했다.</li>
</ul>
<h2 id="38-ablation-studies">3.8 Ablation Studies</h2>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/d32443a7-1db9-42c3-ab62-b09e8d4a2d34/image.png" alt=""></p>
<ul>
<li>Diff Transformer의 설계 요소를 분석하기 위해 다양한 소거 연구를 진행했다.</li>
<li>GroupNorm은 MultiHead의 다양한 값들을 normalizing 하는데 중요한 역할을 했으며, λ 초기화 에서 값의 변화에도 모델 성능이 robust함을 확인했다.</li>
<li>모델 성능의 개선은 주로 differential attention mechanism에서 기인하며, configuration이나 normalization 보다는 differential attention mechanism 자체가 중요하다고 분석되었다.</li>
</ul>
<h1 id="4-conclusion">4. Conclusion</h1>
<ul>
<li>DIFF Transformer는 관련 context에 대한 attention을 amplify하고 noise를 줄이는 differential attention mechanism을 통해 Transformer보다 뛰어난 성능을 보인다.</li>
<li>이는 scalability, long context modeling, key information retrieval, hallucination mitigation, in-context learning, reduction of activation outliers과 같은 여러 측면에서 성능 향상을 보인다</li>
<li>이러한 결과를 바탕으로, DIFF Transformer는 대규모 언어 모델 아키텍처로서 유망하며, 향후 low-bit attention kernel 개발과 캐시 압축에도 활용 가능성이 높아 보인다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Retrieval-Augmented Generation for Large Language Models: A Survey (2024)]]></title>
            <link>https://velog.io/@dutch-tulip/rag-survey-2024</link>
            <guid>https://velog.io/@dutch-tulip/rag-survey-2024</guid>
            <pubDate>Mon, 09 Sep 2024 08:31:39 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/pdf/2402.19473">논문 링크</a></p>
<p>From arXiv, 2024</p>
<h1 id="abstract">Abstract</h1>
<ul>
<li>RAG는 외부 DB의 지식을 통합함으로써 LLM의 문제들(환각, 최신 지식 부재, 불투명성, 추적 불가능)을 해결할 수 있는 해결책으로 떠오르고 있다.</li>
<li>RAG는 생성물의 정확성과 신뢰성을 높여주고, 지식의 지속적인 업데이트와 특정 도메인의 정보 통합을 가능하게 한다.</li>
</ul>
<h1 id="introduction">Introduction</h1>
<ul>
<li>LLM은 훈련 데이터를 벗어난 쿼리나 최신 정보에 대해 생성할 때 환각(hallucinations)을 일으키는 문제가 두드러진다.<ul>
<li>RAG는 외부 지식에서 의미적 유사성을 계산해 관련된 document chunks를 검색하여 LLM 성능을 향상시킨다. 이는 부정확한 콘텐츠를 생성하는 문제를 줄인다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/da365f9b-3347-4332-a48d-fce4abdcf2fe/image.png" alt=""></p>
<ul>
<li>RAG 기술은 최근 급격히 발전해왔으며, 관련 연구를 요약한 기술 트리는 Figure 1과 같다.</li>
<li>이 RAG 발전 방향은 단계적 특징을 갖는다.<ul>
<li>초기 단계는 Tansformer 아키텍처의 부상과 함께 시작됐으며, 추가지식을 PreTraining Models(PTM)을 통해 성능을 향상시키는 데 중점을 두었다. 이 단계는 pretrain 기법을 개선하기 위한 작업이 특징이었다.</li>
<li>이후 ChatGPT의 등장으로 LLM의 In-Context Learning(ICL) 능력이 입증되면서 큰 전환점을 맞았다. RAG 연구는 추론 단계에서 더 복잡하고 지식 집약적인 작업을 해결하기 위해 LLM에 더 나은 정보를 제공하는 방향으로 전환되었고, RAG의 연구가 빠르게 진전되었다.</li>
</ul>
</li>
</ul>
<h1 id="overview-of-rag">Overview of RAG</h1>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/11d2e063-5465-4c24-9e72-3be71c5c9013/image.png" alt=""></p>
<ul>
<li>RAG의 typical한 응용사례는 Figure 2와 같다.</li>
<li><strong>User</strong>는 최신 정보에 대한 질문을 한다. LLM의 사전 학습 데이터만으로는 정보를 제공할 수 없다.<ul>
<li>RAG는 외부 데이버베이스에서 정보(기사)를 검색하고 통합함으로써 정보 격차를 메운다.</li>
<li>이러한 정보는 원래 질문과 결합되어 LLM이 well-informed된 답변을 생성할 수 있는 prompt를 만든다.</li>
</ul>
</li>
<li>논문에서는 RAG 연구 패러다임을 세 단계로 분류한다. Advanced와 Modular RAG의 개발은 Naive RAG의 단점들을 해결하기 위한 대응으로 이루어졌다.<ol>
<li>Naive RAG</li>
<li>Advanced RAG</li>
<li>Modular RAG
<img src="https://velog.velcdn.com/images/dutch-tulip/post/2deb7dd4-8675-46c2-8682-5b5dd7af0368/image.png" alt=""></li>
</ol>
</li>
</ul>
<h2 id="naive-rag">Naive RAG</h2>
<ul>
<li>ChatGPT 도입 이후 주목받은 초기 RAG 방법론으로, indexing, retrieval, generation을 포함하는 전통적인 프로세스를 사용한다.</li>
</ul>
<ol>
<li>Indexing<ul>
<li>PDF, HTML, Word, Markdown 등의 원시 데이터로부터 raw data를 추출해 uniform한 plain text format으로 변환한다.</li>
<li>LM의 context 처리 한계를 고려해 텍스트는 더 작은 chunk 단위로 분할된다. 이후 임베딩 모델을 통해 벡터 표현으로 인코딩하고, 벡터 데이터베이스에 저장한다.</li>
<li>이 단계는 retrieval 단계에서 유사성 검색을 효율적으로 수행하게 하는 중요한 단계이다.</li>
</ul>
</li>
<li>Retrieval<ul>
<li>Indexing에서와 동일한 임베딩 모델로 User의 query도 vertor representation으로 변환한다.</li>
<li>이후 query vector와 indexed chunk vector 간에 유사성 점수를 계산한다.</li>
<li>유사성 점수 상위 k개의 chunk를 우선적으로 검색하며, 이후 이 chunk들은 expanded context로 prompt에 사용된다.</li>
</ul>
</li>
<li>Generation<ul>
<li>쿼리와 검색된 문서들이 합쳐져 하나의 prompt가 되고, LLM은 response를 생성한다.</li>
</ul>
</li>
</ol>
<ul>
<li>그러나 Naive RAG는 단점이 존재한다.<ul>
<li>Retrieval Challenges: retrieval 단계에서 precision과 recall의 어려움을 겪는 경우가 많아 잘못된 정보나 관련성이 낮은 chunk를 선택하거나 중요한 정보를 빠트리는 문제가 발생한다.</li>
<li>Generation Difficulties: response 생성 과정에서 모델은 hallucination 문제에 빠질 수 있는데, 이는 retrieval된 context에 뒷받침되지 않는 내용을 생성하는 경우다. 또한 생성된 응답이 관련성이 없거나 편향된 내용을 포함하여 응답의 품질과 신뢰성을 떨어트릴 수 있다.</li>
<li>Augmentation Hurdles: retrieval된 정보를 다른 task와 통합하는 것은 어려울 수 있으며, 때로는 관련없거나 일관성없는 output이 나올 수 있다. 또한 여러 source에서 비슷한 정보가 검색될 경우 반복적인 응답을 생성할 수도 있다. 복잡한 문제를 만났을 때에는 기존의 쿼리기반 단일 검색만으로는 충분한 context info를 얻기 어려울 수 있다.</li>
<li>또한 generation model이 augmented info에 과도하게 의존해 검색된 내용을 반복해 의미있는 정보를 제공하지 못할 수 있다.</li>
</ul>
</li>
</ul>
<h2 id="advanced-rag">Advanced RAG</h2>
<ul>
<li>Advanced RAG는 Naive RAG의 한계를 극복하기 위해 pre-retrieval과 post-retrieval 기법을 도입한다. Indexing 성능을 개선하기 위해서 sliding window, fine-grained segmentation, 메타데이터 통합을 도입한다. 또한 retrieval process를 최적화하기 위해 여러가지 최적화 방법을 도입한다.</li>
</ul>
<ol>
<li>Pre-retrieval process<ul>
<li>이 단계에서는 indexing structure와 original query를 최적화하는데 중점을 둔다.</li>
<li>인덱싱 최적화의 goal은 인덱싱 콘텐츠의 품질 향상으로, 이를 위해 데이터 세분화 개선, 인덱스 구조 최적화, 메타데이터 추가, 정렬 최적화, mixed retrieval 등의 기법을 사용한다.</li>
<li>쿼리 최적화의 목표는 user의 원래 질문을 더욱 명확하고 검색 작업에 적합하게 만드는 것으로, 이를 위해 쿼리 재작성, 쿼리 변환, 쿼리 확장 등의 기법을 사용한다.</li>
</ul>
</li>
<li>Post-retrieval process<ul>
<li>이 단계에서는 Chunk reranking과 Context compressing이 많이 사용된다.</li>
<li>검색된 정보를 재정렬하여 가장 관련성이 높은 내용을 프롬프트의 가장자리로 재배치하는 것이 핵심이다.</li>
</ul>
</li>
</ol>
<h2 id="modular-rag">Modular RAG</h2>
<ul>
<li>Modular RAG는 앞선 구조보다 더 발전을 이루며, 더 뛰어난 적응성과 유연성을 제공한다. 유사성 검색을 위한 검색 모듈을 추가하거나, fine tuning을 통해 retrieval을 개선하는 등 다양한 전략을 통합해 각 component를 향상시킨다. 특정한 문제를 해결하기 위해 RAG 모듈을 재구성하거나 RAG 파이프라인을 재배열하기도 한다.</li>
</ul>
<ol>
<li>New Modules<ul>
<li>Search module: LLM이 생성한 코드와 query language를 통해 여러 data sources(search engines, DB, knowledge graphs)에 <strong>직접</strong> 접근해서 검색한다.<ul>
<li>기존 RAG는 vector 기반 유사성 검사를 하는 것과 대비됨</li>
</ul>
</li>
<li>RAG Fusion: single query로는 찾기 어려운 정보를 parallel vector searches와 intelligent re-ranking을 통해 multi-query strategy를 도입하여 기존 검색의 한계를 해결한다.</li>
<li>Memory Module: LLM의 메모리를 활용해 검색을 유도하며, 반복적인 self-enhancement를 통해 텍스트가 데이터 분포와 더 유사해지도록 한다.</li>
<li>Routing: 다양한 data source를 탐색해 query가 어떤 data를 원하는지 그 최적의 경로를 찾는다.</li>
<li>Predict module: LLM을 통해 직접 context를 생성함으로써 노이즈와 중복을 줄이고 정확성을 높인다.</li>
<li>Task Adapter: RAG를 down stream에 맞게 조정한다.</li>
</ul>
</li>
<li>New Patterns<ul>
<li>Modular RAG는 모듈을 교체하거나 reconfiguration하여 specific challenge를 해결할 수 있는 적응성이 있다.</li>
<li>이는 단순한 &quot;Retrieval&quot;과 &quot;Read&quot; 메커니즘에 의존하는 Naive RAG 및 Advanced RAG의 fixed structure를 넘어선 것이다.</li>
</ul>
</li>
</ol>
<ul>
<li>Rewrite-Retrieve-Read 모델, Generate-Read 방식, Recite-Read, Hybrid retrieval strategies, Hypothetical Document Embeddings(HyDE) 등의 기법은 Retrieval의 성능을 강화하는데 초첨을 맞춘다.</li>
<li>모듈의 배열이나 모듈 간의 interation을 조정하는 기법들도 존재한다. Demonstrate-Search-Predict(DSP) framework, ITERRETGEN은 각 모듈의 기능을 강화해 시너지를 높인다. FLARE와 Self-RAG은 RAG의 유연성을 높인다.</li>
</ul>
<h2 id="rag-vs-fine-tuning">RAG vs. Fine-tuning</h2>
<ul>
<li>RAG는 fine-tuning과 프롬프트 엔지니어링과 자주 비교된다. 각 방법들은 Figure 4와 같이 고유한 특성을 갖고 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/a905058d-b22b-494c-9a67-808983cfe5dd/image.png" alt=""></p>
<ul>
<li>Figure 4에서 각 축은 model adaptation이 필요한지, 외부 지식이 필요한지를 의미한다.<ul>
<li>프롬프트 엔지니어링은 외부지식과 model adaptation이 거의 필요하지 않은 상태에서 모델의 내재된 기능을 사용한다.</li>
<li>RAG는 정보 검색을 위해 딱 맞는 교과서를 제공하는 것과 비슷하며, 정확한 정보를 검색하는 것에 이상적이다.</li>
<li>Fine-tuning은 학생이 지식을 습득하는 것에 비유되며, 특정한 구조나 형식을 copy해야 하는 시나리오에 적합하다.</li>
</ul>
</li>
<li>RAG는 latency가 길고, 데이터 검색에서 윤리적 고려사항이 동반된다.</li>
<li>Fine tuning은 정적이며 업데이트를 위해서는 재학습이 필요하지만, 모델의 action과 style을 커스터마이징할 수 있다. 데이터셋 준비 및 학습에 상당한 resource를 요구하며, 환각을 줄일 수 있지만 익숙하지 않은 데이터에 대해서는 어려움을 겪을 수 있다.</li>
<li>RAG와 FT를 평가한 결과, RAG는 훈련 중의 기존 지식과 새로운 지식 모두에서 우수한 성능을 보인다. RAG와 FT는 상호 보완적인 관계에 있으며 서로를 보완해 모델의 역량을 다양한 수준에서 향상시킬 수 있다. 일부의 경우에는 둘을 결합해 사용할 때 최적의 성능을 발휘한다.</li>
</ul>
<h1 id="retrieval">Retrieval</h1>
<h2 id="retrieval-source">Retrieval Source</h2>
<ul>
<li>retrieval source의 유형과 retrieval unit의 세분화는 최종적인 생성 결과에 영향을 미친다.</li>
</ul>
<ol>
<li><strong>Data Structure</strong><ul>
<li>초기에는, text가 주된 검색 source였다. 이후에는 PDF같은 semi-structured data와 knowledge graph같은 structured data를 포함하도록 확장되었다. 최근 연구에서는 LLM이 자체 생성한 콘텐츠를 retrieval이나 enhancement 목적으로 사용하는 경향도 커지고 있다.</li>
</ul>
<ol>
<li>Unstructured Data<ul>
<li>Text와 같은 비구조화 데이터는 주로 corpus에서 수집된다. 주로 특정 도메인 데이터가 포함된다.</li>
</ul>
</li>
<li>Semi-structured data<ul>
<li>반구조화 데이터는 주로 텍스트와 표를 결합한 데이터를 의미하며, PDF가 대표적이다. 이를 처리하는 것은 RAG시스템에 두 가지 이유로 challenge를 준다.<ul>
<li>텍스트 분할 과정에서 표가 분리되어 데이터가 손상될 수 있다.</li>
<li>표가 포함된 데이터는 semantic similarity 검색을 복잡하게 한다.</li>
</ul>
</li>
<li>이 분야에는 많은 연구 기회가 있다.</li>
</ul>
</li>
<li>Structured data<ul>
<li>Knowledge data와 같은 구조화 데이터는 보통 검증된 데이터로, 더 정확한 정보를 제공할 수 있다.</li>
<li>KnowledGPT, G-Retriever 모델, Prize-Collecting Steiner Tree(PCST) 최적화 문제 등 사용</li>
<li>structured db를 구축, 검증, 유지보수 하는 것은 추가적인 노력 필요</li>
</ul>
</li>
<li>LLMs-Generated Content<ul>
<li>RAG의 외부 정보 한계를 해결하기 위해, 일부 연구에서는 LLM 내부 지식을 활용한다.</li>
</ul>
</li>
</ol>
</li>
<li><strong>Retrieval Granularity(검색단위 세분화)</strong><ul>
<li>데이터의 세분화 정도는 중요한 요소다. 큰 단위의 검색은 이론적으로 더 관련있는 정보를 제공할 수 있지만, 불필요한 내용도 포함되어 이후 작업에서 혼란을 겪을 수 있다. 너무 작은 단위는 검색의 부담을 증가시키며 의미적 완전성을 보장하지 못할 수 있다. 이 단위는 token-phrase-sentence-proposition(명제)-chunk-document 까지 다양하다.</li>
</ul>
</li>
</ol>
<h2 id="indexing-optimization">Indexing Optimization</h2>
<ol>
<li>Chunking Strategy<ul>
<li>문장을 일정한 수의 토큰으로 분할한다. 큰 청크는 더 많은 context를 캡처할 수 있지만, 많은 노이즈를 생성하고 시간과 비용이 늘어난다. 작은 청크는 그 반대이다.</li>
<li>청크 분할은 문장이 잘리는 문제를 야기할 수 있어 recursive split이나 sliding window 방법을 최적화하여 여러 검색에서 정보를 병합하는 계층적 검색을 가능하게 한다.</li>
</ul>
</li>
<li>Metadata Attachments<ul>
<li>청크에 메타데이터 정보를 추가하여 문서의 범위를 좁힌 뒤 검색한다. 메타데이터를 인위적으로 구성할 수도 있다.</li>
</ul>
</li>
<li>Structural Index<ul>
<li>Hierarchical Index<ul>
<li>문서에 hierarchical structure을 구축함으로써 RAG의 검색 효율을 높인다.</li>
</ul>
</li>
<li>Knowledge Graph Index<ul>
<li>문서 계층 구조 구축을 위해 Knowledge Graph(KG)를 사용하면 일관성을 유지할 수 있으며, 정보 검색 프로세스를 LLM이 이해할 수 있는 명령으로 바꾸어 정확성을 높일 수 있으며, LLM이 context에 맞는 응답을 생성하도록 해 RAG의 전반적인 효율성을 높일 수 있다.</li>
</ul>
</li>
</ul>
</li>
</ol>
<h2 id="query-optimization">Query Optimization</h2>
<ul>
<li>Naive RAG의 주요 challenge 중 하나는 사용자의 원래 쿼리의 직접 의존해 검색을 수행한다는 것이다. 명확한 질문을 구성하는 것은 어려운 일이며, 부적절한 쿼리는 검색 효율성을 떨어뜨린다.</li>
<li>또 다른 어려움은 언어의 복잡성에 따른 모호성으로, 전문 용어나 다의어를 처리하는 데 어려움을 겪는다.</li>
</ul>
<ol>
<li>Query Expansion<ul>
<li>single query를 multiple query로 확장하면 쿼리의 내용을 풍부하게 하여 특정 뉘앙스 부족을 해결하고 답변과의 관련성을 최적화할 수 있다.</li>
</ul>
<ol>
<li>Multi-query<ul>
<li>LLM을 활용한 프롬프트 엔지니어링으로 쿼리를 확장하고, 이 여러 쿼리를 병렬로 실행할 수 있다. 이 확장은 무작위가 아닌 철저히 설계되어 이루어진다.</li>
</ul>
</li>
<li>Sub-query<ul>
<li>sub-question을 계획하는 과정은 원래 질문에 context를 추가하고 이를 답할 수 있도록 필요한 하위 질문을 생성하는 것을 의미한다. 복잡한 질문은 least-to-most 프롬프트 방식으로 더 단순한 하위 질문으로 분해 가능하다.</li>
</ul>
</li>
<li>Chain-of-Verification(CoVe)<ul>
<li>확장된 쿼리는 LLM을 통해 검증과정을 거치며, hallucination을 줄이는 효과를 얻을 수 있다.</li>
</ul>
</li>
</ol>
</li>
<li>Query Transformation</li>
</ol>
<ul>
<li>original query가 아닌 변환된 쿼리를 기반으로 검색을 수행한다.<ol>
<li>Query Rewrite<ul>
<li>original query는 llm 검색에 항상 최적화되어 있지 않으며, 따라서 LLM을 프롬프트하여 쿼리를 재작성할수 있다. 또는 특화된 sLM을 사용할 수 있다.</li>
</ul>
</li>
</ol>
</li>
</ul>
<ol>
<li>Query Routing<ul>
<li>쿼리의 특성에 따라 적합한 RAG 파이프라인으로 라우팅하여 다양한 시나리오에 적용가능한 다목적 RAG 시스템을 설계할 수 있다.</li>
</ul>
<ol>
<li>Metadata Router/Filter<ul>
<li>퀴리에서 키워드를 추출한 후, 키워드 내 메타데이터를 기반으로 필터링하여 검색 범위를 좁힌다.</li>
</ul>
</li>
<li>Semantic Router<ul>
<li>쿼리의 시맨틱 정보를 활용한다. 시맨틱과 메타데이터 정보를 결합한 하이브리드 방식도 있다.</li>
</ul>
</li>
</ol>
</li>
</ol>
<h2 id="embedding">Embedding</h2>
<ul>
<li>RAG에서는 질문 임베딩과 청크 임베딩의 유사성(ex: 코사인)을 계산해 검색을 수행하는데, 이때 임베딩 모델의 semantic representation 능력이 중요하다. 여기에는 주로 BM25 같은 sparse encoder와 BERT 아키텍처 PTM 같은 dense retriever가 포함된다. 어떤 임베딩 모델을 사용해야하는가에 대한 일관된 답은 없지만, 특정 모델들이 특정 task에 더 적합한 경향은 있다.</li>
</ul>
<ol>
<li>Mix/Hybrid Retrieval<ul>
<li>Sparse embedding과 dense embedding 방식은 서로 다른 relevance feature를 포착하며, 상호보완적인 관계가 될 수 있다. 예를 들어, sparse 모델을 dense 모델을 학습하기 위한 초기 검색 모델을 제공할 수 있다.</li>
</ul>
</li>
<li>Fine-tuning Embedding Model<ul>
<li>특수한 도메인을 사용할 경우 자체 데이터셋을 사용해 임베딩 모델을 fine-tuning 하는 것이 필수적이다.</li>
<li>fine-tuning의 또다른 목적은 Retriever와 Generator를 align하는 것이다. 예를 들어 LLM의 결과를 fine-tuning의 supervision signal로 사용하는 방법을 LSM(LM-supervised Retriever)이라고 한다.<ul>
<li>Retriever는 1) 데이터셋의 hard label과 2) LLM의 soft reward라는 두 가지 종류의 supervised signal을 통해 학습된다.<ul>
<li>이러한 이중 signal 접근 방식은 다양한 다운스트림 task에 맞게 조정하는데 효과적이다.</li>
</ul>
</li>
<li>RLHF에서 영감을 받아 LM 기반 피드백을 사용해 Retriever를 강화학습을 통해 강화하는 방법도 있다.</li>
</ul>
</li>
</ul>
</li>
</ol>
<h2 id="adapter">Adapter</h2>
<ul>
<li>일부 방식에서는 외부 어댑터를 사용해 모델을 align 한다.</li>
</ul>
<h1 id="generation">Generation</h1>
<ul>
<li>Retrieval 후 검색된 모든 정보를 LLM에 직접 입력하는 것은 좋은 방법이 아니다.</li>
</ul>
<h2 id="context-curation">Context Curation</h2>
<ul>
<li>중복된 정보는 generation에 방해가 될 수 있으며, 긴 context는 ‘Lost in the middle’ 문제를 초래할 수 있다. 따라서 RAG에는 검색된 내용을 post-process해야 한다.<ol>
<li>Reranking<ul>
<li>Reranking은 chunk를 reorder해 가장 관련성이 높은 것을 먼저 강조하는 방식으로, 전체 문서 pool을 줄이고, IR에서 enhancer와 filtering을 동시에 수행하여 LLM이 더 정확하게 처리할 수 있는 정제된 입력을 제공한다.</li>
</ul>
</li>
<li>Context Selection/Compression<ul>
<li>RAG에서 가능한 많은 관련 문서를 검색하고 긴 검색 프롬프트를 만드는 것이 유리하다는 것은 오해이다. 긴 context는 noise로 인해 LLM의 정보 인식 능력을 저하시킬 수 있다.</li>
<li>여러 모델에서는 sLM이나 information retriever, information condenser 등을 사용해 중요하지 않은 토큰을 감지하고 제거하는 방법을 사용했다.</li>
<li>context 압축 외에도 문서 수를 줄이는 것도 유용하다.</li>
</ul>
</li>
</ol>
</li>
</ul>
<h2 id="llm-fine-tuning">LLM Fine-Tuning</h2>
<ul>
<li>특정 task나 데이터에 타겟팅된 fine-tuning은 LLM에게 더 좋은 성능을 이끌어낸다. 이는 on-premise LLM을 사용하는 가장 큰 장점 중 하나이기도 하다.</li>
<li>Fine-tuning의 또 다른 장점은 모델의 입력과 출력을 조정할 수 있다는 점이다.</li>
<li>LLM의 출력을 인간이나 retriever의 선호에 맞추기 위해 강화학습을 사용하는 것도 가능한 방식이다.</li>
<li>거대한 오픈소스 모델에 접근할 수 없는 상황에서는 강력한 모델(ex: GPT-4)을 distillation하는 간단하면서도 효과적인 방법이 있다.</li>
<li>LLM의 fine-tuning은 reiriever의 fine-tuning과 함께 진행될 수 있으며, 이를 통해 preference를 align할 수 있다.</li>
</ul>
<h1 id="augmentation-process-in-rag">Augmentation Process in RAG</h1>
<ul>
<li>RAG에서는 일반적으로 한 번의 검색 단계를 거치고 답변을 생성한다. 그러나 이는 다단계의 추론을 요구하는 복잡한 문제에서는 제한된 정보만을 제공하므로 충분하지 않을 때가 많다. 이러한 문제를 해결하기 위해 많은 연구에서 검색 과정을 최적화하였으며, 아래 Figure 5에 나타낸다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/950089f7-073f-4706-a0c6-a6f6128afe58/image.png" alt=""></p>
<h2 id="iterative-search">Iterative Search</h2>
<ul>
<li>Iterative search는 초기 쿼리와, 지금까지 생성된 텍스트를 바탕으로 knowledge base에서 반복적으로 검색이 수행되는 과정이다. 이를 통해 답변 생성의 robustness를 향상시키는 것으로 나타났다.</li>
<li>하지만 이 방식은 의미적 불연속성이나 불필요한 정보의 축적으로 인해 영향을 받을 수 있다.</li>
</ul>
<h2 id="recursive-search">Recursive Search</h2>
<ul>
<li>Recursive search는 이전 검색에서 얻은 결과를 바탕으로 검색 쿼리를 반복적으로 수정하는 방식으로 진행된다.</li>
<li>Recursive search의 목표는 feedback loop를 통해 점진적으로 가장 관련성 높은 정보에 수렴하는 식으로 검색 경험을 개선하는 것이다.</li>
</ul>
<h1 id="task-and-evaluation">Task and Evaluation</h1>
<h2 id="downstram-task">Downstram Task</h2>
<ul>
<li>RAG의 core task는 QA로, 전통적인 single-hop/multi-hop(질문에 대한 답을 하나의 문단/여러문단에서만 정답을 찾을 수 있는 것) QA, multiple chioce QA, domain-specific QA, long-form scenarios suitable QA 를 포함한다. 또한 RAG는 IR, IE(Information Extration), Dialogue Generation, Code Search 등 다양한 다운스트림 작업으로 확장되고 있다.</li>
</ul>
<h2 id="evaluation-target">Evaluation Target</h2>
<ul>
<li>그동안 RAG 모델의 평가는 특정 다운스트림 작업에서의 성능으로 초점이 맞춰져왔으므로 해당 작업에 적합한 평가 지표가 사용되어 왔다. RAG의 자동평가를 위해 설계된 RALLE와 같은 도구도 이러한 task별 지표를 기반으로 평가를 수행한다.</li>
<li>그럼에도 RAG 모델의 고유한 특성을 평가하는 연구는 여전히 부족하다. 주요한 evaluation objectives는 Retrieval Quality와 Generation Quality를 평가하는 것이다.<ul>
<li>Retrieval Quality: Hit Rate, MRR(Mean Reciprocal Rank), NDCG(Normalized Disconted Cunulative Gain) 등의 지표가 일반적으로 활용</li>
<li>Generation Qulaity: 레이블의 유무에 따라 평가는 두가지로 나뉜다.<ul>
<li>레이블이 없는 콘텐츠는 생성된 답변의 <strong>충실성</strong>(faithfulness), <strong>관련성</strong>(relevance), <strong>무해성</strong>(non-harmfulness)을 평가하며, 레이블이 있는 콘텐츠는 정보의 <strong>정확성</strong>(accuracy)에 초점을 맞춘다. 이 평가는 수동/자동 평가를 통해 수행될 수 있다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="evaluation-aspects">Evaluation Aspects</h2>
<ul>
<li>현대의 RAG 평가는 3개의 quality score와 4개의 essential ablilty에 중점을 두며, 이는 RAG의 주 목표인 검색과 생성 평가에 대한 종합적인 정보를 제공한다.</li>
</ul>
<ol>
<li>Quality Scores: Quality scores는 RAG의 효율성을 다양한 관점에서 평가한다.<ul>
<li>1) Context Relevance: retrieved된 context의 precision(정확도)과 specificity(특이도)를 평가하여, 불필요한 콘텐츠로 인한 cost를 최소화하고 관련성은 보장한다.</li>
<li>2) Answer Faithfulness: 생성된 답변이 retrieved된 context에 충실하게 유지되도록 하여 일관성을 유지하고 모순을 피하도록 한다.</li>
<li>3) Answer Relevance: 생성된 답변이 제시된 질문과 직접적으로 관련되며 핵심적인 질문을 효율적으로 다루는지 평가한다.</li>
</ul>
</li>
<li>Required Abilities: 모델의 적응성과 효율성을 평가하는 4가지 ablility도 포함된다.<ul>
<li>1) Noise Robustness: 질문과 관련은 있지만 실질적인 정보가 부족한 noise document를 처리하는 모델의 능력을 평가한다.</li>
<li>2) Negative Rejection: retrieved된 문서에 질문이 답하기 위해 필수 지식이 없을 때, response를 자제하는 모델의 자제력(분별력)을 평가한다.</li>
<li>3) Information Integration: 모델이 복잡한 질문에 답하기 위해 여러 문서에서 정보를 통합하는 능력을 평가한다.</li>
<li>4) Conterfactual Robustness: 모델이 문서 내에서 잘못된 정보를 인식하고, 잠재적인 오정보에 대해 지시를 받았을 때 이를 무시하는 능력을 평가한다.</li>
</ul>
</li>
</ol>
<ul>
<li>1-1), 2-1)은 Retrieval quality를 평가하는 데 중요하며, 나머지는 Generation Quality를 평가하는 데 중요하다.</li>
</ul>
<h2 id="evaluation-bencmarks-and-tools">Evaluation Bencmarks and Tools</h2>
<ul>
<li>RGB, RECALL, CRUD 등의 주요 벤치마크는 RAG의 essential ablility를 평가하는 데 중점을 준다.</li>
<li>RAGAS, ARES, TruLens같은 최신 automated 도구들은 LLM을 통해 quality score를 측정한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/4deb3487-7909-4ad9-8878-ff85f83a7b73/image.png" alt=""></p>
<h1 id="discussion-and-future-prospects">Discussion and Future Prospects</h1>
<h2 id="rag-vs-long-context">RAG vs. Long Context</h2>
<ul>
<li>LLM의 context 처리 능력은 지속적으로 확장되고 있다(최근엔 20만 토큰). 이는 RAG에 의존하던 긴 문서 QA를 이제 문서 전체를 프롬프트에 직접 포함해 처리할 수 있음을 의미한다. 이러한 발전은 LLM이 컨텍스트에 제한받지 않을 때 RAG가 필요한가?에 대한 논의를 불러일으켰다.</li>
<li>사실 RAG는 여전히 대체할 수 없는 역할을 한다.<ul>
<li>LLM에 한 번에 많은 양의 context를 제공하면 추론 속도에 큰 영향을 미치지만, 반면 RAG의 retrieved chunk와 on-demand input은 효율성을 크게 향상시킬 수 있다.</li>
<li>RAG 기반 generation은 LLM이 원본 참조 자료를 빠르게 찾아서 generated response를 검증하는 데 도움을 줄 수 있다.<ul>
<li>RAG와 다르게 LLM은 여전히 블랙박스다.</li>
</ul>
</li>
</ul>
</li>
<li>그러나 context expansion은 RAG 발전에 새로운 기회를 제공해 더 복잡한 task를 다룰 수 있게 한다. 초장기 context를 처리하는 것은 RAG의 future research trend 중 하나다.</li>
</ul>
<h2 id="rag-robustness">RAG Robustness</h2>
<ul>
<li>Retrieval 과정에서 발생하는 noise나 모순된 정보는 RAG response quality에 악영향을 준다.<ul>
<li>이는 ‘잘못된 정보는 정보가 없는 것보다 더 해로울 수 있다’라는 비유로 설명된다.</li>
</ul>
</li>
<li>그러나 연구 결과에서는 관련없는 문서를 일부 포함했을 때 정확도가 30%이상 향상되는 경우가 있으며, 초기 가정과 상반된다.</li>
<li>RAG 연구에서 Retrieval과 generation 모델을 통합하는 특화된 전략을 개발할 필요성을 강조하며, RAG robustness에 대한 추가적인 연구의 중요성을 보여준다.</li>
</ul>
<h2 id="hybrid-approaches">Hybrid Approaches</h2>
<ul>
<li>RAG와 fine-tuning을 결합하는 방식이 주요 방식으로 떠오르고 있다.</li>
<li>특정 기능의 sLM을 RAG에 도입하고 RAG의 결과로 이를 미세소정하는 방식도 있다.</li>
</ul>
<h2 id="scaling-laws-of-rag">Scaling laws of RAG</h2>
<ul>
<li>End-to-end RAG와 RAG기반의 PTM에서 parameter는 중요한 요소이다.</li>
<li>LLM에서는 scaling laws가 성립되어 있지만, RAG에도 적용가능한지는 불확실하다.</li>
</ul>
<h2 id="production-ready-rag">Production-Ready RAG</h2>
<ul>
<li>RAG 생태계의 발전은 기술 스택의 발전에 큰 영향을 받는다.<ul>
<li>LangChain과 LLamaIndex와 같은 기술 스택은 RAG관련 API를 제고하고 LLM 분야에서 필수적인 역할을 하고 있다.</li>
</ul>
</li>
<li>RAG 기술 발전에는 몇 가지 특화된 방향이 나타난다.<ul>
<li>Customization: 특정 요구를 충족하도록 RAG를 조정하는 것</li>
<li>Simplication: 초기 learning curve를 줄이기 위해 RAG를 더 쉽게 만드는 것</li>
<li>Specification: RAG를 최적화하여 실제 환경에서 더 잘 작동하도록 만드는 것</li>
</ul>
</li>
<li>RAG는 기술 스택의 성장으로 인한 상호작용으로, RAG tool은 foundational technology stack이 되어가고 있으며 고급 application을 위한 기초를 마련하고 있다.</li>
</ul>
<h2 id="multi-modal-rag">Multi-Modal RAG</h2>
<ol>
<li>이미지<ul>
<li>RA-CM3는 텍스트와 이미지를 검색하고 생성하는 pioneering 멀티모달 모델이다.</li>
<li>BLIP-2는 고정된 이미지 인코더와 LLM을 결합해 visual 언어 사전학습을 효율적으로 수행하며, zeroshot image-to-text 변환을 가능하게 한다.</li>
<li>Visual Before You Write 방식은 이미지 생성을 통해 언어 모델의 텍스트 생성을 유도한다.</li>
</ul>
</li>
<li>오디오와 비디오<ul>
<li>GSS는 오디오 클립을 검색하고 이를 결합해 기계 번역된 데이터를 음성 번역 데이터로 변환한다.</li>
</ul>
</li>
<li>코드<ul>
<li>RBPS는 코드 예시를 검색해 개발자의 목표에 맞게 인코딩 및 빈도 분석을 통해 작은 규모의 학습 작업에서 뛰어난 성능을 발휘한다.</li>
</ul>
</li>
</ol>
<h1 id="conclusion">Conclusion</h1>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/ace4e77c-bab5-4d22-8db6-bbbb39a6ab17/image.png" alt=""></p>
<ul>
<li>Figure 6에 나타난 것처럼, LLM의 매개변수화된 지식과 외부 지식 기반의 비매개변수화된 데이터를 통합하여 RAG가 LLM의 기능을 크게 발전 시켰음을 강조한다.</li>
<li>RAG는 fine-tuning과 강화학습과 같은 다른 기술과의 통합을 통해 그 기능을 확장해왔다.</li>
<li>여전히 RAG의 robustness와 long context 처리 능력을 개선하기 위한 연구 기회는 존재한다.</li>
<li>RAG의 응용범위는 멀티모달 도메인으로 확장되어 이미지, 비디오, 코드와 같은 다양한 데이터 형식을 해석하고 처리하는데 사용되고 있다.</li>
<li>RAG 생태계가 확장하는 것은 RAG application과 이를 지원하는 tool의 지속적 개발로 입증된다.</li>
<li>RAG가 꾸준히 성장하기 위해서는 정확하고 대표적인 성능평가를 보장하는 것이 매우 중요하다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Survey] RAG(Retrieval Augmented Generation) 핵심 개념]]></title>
            <link>https://velog.io/@dutch-tulip/rag</link>
            <guid>https://velog.io/@dutch-tulip/rag</guid>
            <pubDate>Tue, 27 Aug 2024 06:35:15 GMT</pubDate>
            <description><![CDATA[<h1 id="rag">RAG</h1>
<ul>
<li>FAIR이 처음 사용, 제안한 명칭 (NeurIPS 2020, <a href="https://arxiv.org/pdf/2005.11401">https://arxiv.org/pdf/2005.11401</a>)</li>
<li>Pre-trained된 LM과 Retrieval component를 결합하여 광범위한 지식이 필요한 text generation의 성능을 개선하는 프레임워크<ul>
<li>Parametric memory (pre-trained seq2seq model (BART…)) + Non-parametric memory (dense vector index of <strong>external</strong> documents (Wiki …) accessed by neural retriever)</li>
</ul>
</li>
<li>간단하게, 외부 DB 지식을 통합(검색)하여 LM의 생성 능력을 향상시키는 기술</li>
</ul>
<h1 id="why-rag">Why RAG?</h1>
<ul>
<li>LLM은 비약적인 성능 향상 이룸. But, 긴 길이의 텍스트 처리 한계 (Lost in the middle problem)</li>
<li>RAG는 문서 모든 단락에 index를 생성해 쿼리와 관련성 높은 index를 LLM에게 전달<ul>
<li>LLM의 정보 과부하 방지하고 quality 향상</li>
</ul>
</li>
</ul>
<h1 id="neural-retrieval">Neural Retrieval</h1>
<ul>
<li>신경망을 사용하여 쿼리를 관련된 문서와 연결하는 IR 모델</li>
<li>쿼리와 문서를 dense vector representation으로 인코딩하고 유사성 계산<ul>
<li>이를 통해 의미적 관련성 포착 가능</li>
</ul>
</li>
<li>기존 키워드 기반 IR에서 텍스트의 근본적 의미와 관계를 이해하는 시스템으로의 변화를 의미</li>
<li>일반적인 동작 단계:<ol>
<li>벡터 인코딩
 a. 신경망 기반 인코더에 의해 쿼리와 문서는 고차원 공간에서 벡터로 변환
 b. 단어와 구 간 패턴, 관계 학습</li>
<li>시맨틱 매칭
 a. 유사성은 코사인 유사도 등으로 계산
 b. 단순 키워드 중복이 아닌 의미적 관련성 높은 문서 결정</li>
</ol>
</li>
</ul>
<h2 id="neural-retrievals-advantages">Neural Retrieval’s Advantages</h2>
<ul>
<li>단어가 사용된 문맥 이해 가능해 정확한 검색 가능</li>
<li>길고 복잡한 쿼리 처리 가능</li>
<li>다양한 언어 쿼리 처리 가능</li>
</ul>
<h2 id="neural-retrievals-challenges">Neural Retrieval’s Challenges</h2>
<ul>
<li>훈련과 추론 모두에 상당한 컴퓨팅 파워가 요구된다(특히 대규모 문서 인코딩)</li>
<li>Neural Retrieval의 성능은 train data에 따라 크게 달라지며, data의 bias를 물려받을 수 있다</li>
<li>동적으로 변화하는 문서의 representation을 최신 상태로 유지하는 것은 쉽지 않다</li>
</ul>
<h1 id="rag-pipeline">RAG Pipeline</h1>
<ul>
<li>RAG를 통해 LLM은 외부 지식에 접근하여 가중치에 포함되지 않은 정보를 활용</li>
<li>Retriever는 semantic retrieval의 필요성에 따라 다음 중 하나가 될 수 있음<ol>
<li><strong>Vector database</strong>: Dense vector는 BERT 등 사용, Sparse vector는 TF-IDF 등 사용. 이후 빈도 또는 유사성 기반으로 검색 수행</li>
<li><strong>Graph database</strong>:  텍스트에서 추출된 엔티티 관계로 지식 베이스 구축. 정확하지만 쿼리 매칭 필요할 수 있으며, 일부 task에서는 제한적일 수 있음</li>
<li><strong>Regular SQL database</strong>: 구조화된 데이터 저장과 검색이 가능하지만 의미론적 유연성 부족</li>
</ol>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/e343cf0f-b35e-48fd-ab05-42e33ae05a54/image.jpg" alt=""></p>
<ul>
<li><a href="https://www.linkedin.com/posts/damienbenveniste_machinelearning-datascience-artificialintelligence-activity-7119708674868051969-5HA1?utm_source=li_share&amp;utm_content=feedcontent&amp;utm_medium=g_dt_web&amp;utm_campaign=copy">Damien Benveniste에 의하면</a>, Vector database보다 Graph Database가 RAG에서 선호<ul>
<li>Vector database는 인코딩된 벡터로 데이터를 분할하고 인덱싱하므로 의미적으로 유사한 벡터 검색이 가능하지만, 관련없는 데이터를 가져올 수 있다.</li>
<li>반면 Graph database는 텍스트에서 추출된 엔티티 관계로부터 지식 베이스를 구축하여 검색을 간결하게 만듦.</li>
</ul>
</li>
</ul>
<h2 id="process-of-rag">Process of RAG</h2>
<ol>
<li><strong>(Vector) Database Creation</strong>: 내부 데이터셋을 벡터, 혹은 지정된 형태로 변환한 뒤 데이터베이스에 저장한다.</li>
<li><strong>User Input</strong>: 사용자가 쿼리를 제공한다.</li>
<li><strong>Information Retrieval</strong>: Retrieval 매커니즘은 vector database를 스캔하여 쿼리와 의미론적으로 유사한 세그먼트를 식별한다. 이 세그먼트는 LLM에 제공돼 답변을 생성하는 context를 강화한다.</li>
<li><strong>Combining Data</strong>: Database에서 선택한 data 세그먼트가 쿼리와 결합하여 확장된 prompt가 생성된다.</li>
<li><strong>Generating Text</strong>: 확장된 prompt는 LLM에 전달되어 context-aware response를 생성한다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/4bda163c-9529-4646-ae6c-72bca66b24ff/image.png" alt="High-level working of RAG">
High-level working of RAG</p>
<h1 id="benefits-of-rag">Benefits of RAG</h1>
<ul>
<li>RAG를 사용하면 LLM은 자신의 가중치에 포함되지 않은 정보를 외부 지식에 접근함으로써 활용 가능하다.</li>
<li>RAG는 재학습이 필요없어 시간&amp; 계산 리소스 절약 가능하다.</li>
<li>단점: 외부 지식의 포괄성과 정확성에 따라 RAG의 성능이 달라진다.</li>
<li>RAG는 라벨 데이터가 제한적인 경우 효과적이며, 특정 정보에 실시간 접근이 필요한 application에 이상적이다.<ul>
<li>인터넷에는 방대한 양의 텍스트가 있지만, 이 텍스트들이 구체적인 질문에 직접 답변하는 방식으로 이루어져 있지 않다.</li>
<li>RAG는 제품 매뉴얼과 같은 외부 리소스에서 질문과 관련된 정보를 검색한 뒤, 이를 사용해 명확하고 간결한 답변을 생성한다.</li>
<li>→ RAG는 많은 정보가 사용 가능하지만 라벨이 지정되지 않은 어플리케이션에 잘 맞는다.</li>
</ul>
</li>
</ul>
<h1 id="rag-vs-fine-tuning">RAG vs. Fine-Tuning</h1>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/42808b02-3d7f-404e-b1c9-2ed829b6f275/image.jpg" alt=""></p>
<p>표 요약</p>
<ol>
<li>RAG는 LLM에게 사실적이고 적절한 정보에 대한 접근을 제공한다. 이는 LLM이 관련 데이터베이스에서 정확하고 검증된 사실을 직접 가져올 수 있게 한다. Fine tuning은 이를 일부 해결할 수 있지만, RAG는 최신 정보를 제공하며 fine tuning과 관련된 상당한 비용 없이 특정 정보를 제공하는 데 뛰어나다. 또한 RAG는 최신 데이터에 동적으로 접근하고 검색함으로써 모델이 현재 상태를 유지하고 관련성을 유지하도록 한다. 또한 RAG의 방식은 더욱 유연하고 확장 가능하여 쉽게 업데이트 가능하다.</li>
<li>Fine tuning은 LLM의 스타일, 어조, 어휘 등을 조정하여 사용자의 언어적 방향성을 원하는 도메인에 맞게 조정된다. RAG는 이러한 수준의 커스텀을 제공하지 않는다.</li>
<li>RAG에 먼저 집중하라. RAG 어플리케이션을 먼저 성공적으로 구축하면 그 뒤에 fine tuning을 추가할 수 있다.</li>
</ol>
<h1 id="ensemble-of-rag">Ensemble of RAG</h1>
<ul>
<li>RAG의 앙상블을 통해 모델이 맥락적으로 정확한 텍스트를 생성하는 능력을 향상시킬 수 있다.<ul>
<li>Knowledge sources: RAG는 특정 도메인에서의 지식을 보완하기 위해 외부 지식 저장소에서 정보를 검색한다. 이는 Wikipedia, book, news 등에서의 paragraphs, tables, images가 포함될 수 있다.</li>
<li>Combining sources: 추론 시점에 여러 retriever가 다양한 corpus에서 관련 내용을 가져오면, 이들은 candidates pool로 연결된다.</li>
<li>Ranking: Candidates pool에 있는 후보들의 순위를 매긴다.</li>
<li>Selection: 순위가 높은 후보들이 LM의 generation을 위해 선택된다.</li>
<li>Ensembling: 다른 코퍼스에 특화된 RAG 모델들이 앙상블될 수 있다. 그 출력들은 합쳐져서 순위가 매겨지고 투표된다.</li>
</ul>
</li>
<li>다양한 source를 통해 RAG를 보강할 수 있으며, pooling과 ensemble을 통해 이루어진다.</li>
<li>각 retriever의 다른 출력을 합쳐서 응답을 생성하기 전 순위를 매기는 것을 염두에 두어야 한다.</li>
</ul>
<h1 id="building-a-rag-pipeline">Building a RAG Pipeline</h1>
<ul>
<li>Ingestion → Retrival → Synthesis/Response Generation</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/1c447cd5-405d-4a93-b3bd-c34c9ba1ae7a/image.png" alt=""></p>
<h2 id="ingestion">Ingestion</h2>
<h3 id="chunking">Chunking</h3>
<ul>
<li>Chunking: prompt나 검색할 문서를 더 작고 관리하기 쉬운 segment 또는 chunk로 나누는 과정</li>
<li>Chunk는 특정 문자, 문장 또는 단락 수 같은 fixed size로 정의될 수 있음</li>
<li>RAG에서는 chunk가 검색을 위해 임베딩 벡터로 인코딩.</li>
<li>더 작고 정확한 chunk는 쿼리와 컨텐츠 간의 세밀한 일치를 이끌어내어 검색된 정보와의 정확성과 관련성을 향상시킨다.</li>
<li>큰 chunk는 관련없는 정보를 포함할 수 있으며, 이는 노이즈가 포함되고 검색 정확도를 낮출 수 있다. chunk 크기를 조절함으로써 RAG는 포괄성과 정밀성 사이의 균형을 유지한다.</li>
<li>Chunk 크기를 정하는 방법 몇 가지:<ul>
<li><strong>Fixed-size chunking</strong>: chunk에 포함될 토큰 수를 결정하고, chunk 사이에 overlap 허용 여부를 결정한다. chunk 간의 overlap은 semantic context loss를 최소화한다. 이 방법은 계산 비용이 적고 구현이 간단하다.</li>
<li><strong>Context-aware chunking</strong>: Context-aware chunking은 텍스트 구조를 활용하여 유의미하고 맥락적으로 관련된 chunk를 생성한다.<ol>
<li><strong>Sentence Splitting</strong><ul>
<li><strong>Naive Splitting</strong>: 마침표와 개행을 이용하여 문장을 분할하는 기본적인 방법. 빠르지만 복잡한 문장은 간과할 수 있다.</li>
<li><strong>NLTK (Natural Language Toolkit)</strong>: 파이썬 라이브러리, 텍스트를 문장으로 효과적으로 분할하는 sentence tokenizer가 포함되어 있다.</li>
<li><strong>spaCy</strong>: NLP 작업을 위한 고급 파이썬 라이브러리, 효율적인 문장 분할 제공.</li>
</ul>
</li>
<li><strong>Recursive Chunking</strong>: 다양한 구분자를 사용해 계층적으로 텍스트 분할하는 반복적 방법. 재귀적으로 다른 기준을 적용하여 비슷한 크기나 구조의 chunk를 생성</li>
<li><strong>Specialized Chunking</strong>: Markdown이나 LaTeX 같은 formatted content는 원래 구조를 유지하면서 chunking을 수행한다.<ul>
<li><strong>Markdown Chunking</strong>: Markdown 구문을 인식하고 구조에 따라 콘텐츠를 나눔</li>
<li><strong>LaTeX Chunking</strong>: LaTeX 명령어와 환경을 구문 분석하여 콘텐츠를 chunking하면서 논리적 구성을 보존</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
<li>일반적으로, text chunk가 주변 맥락 없이도 인간에게 유의미하다면, LM에게도 유의미할 것이다. 따라서 corpus의 문서에 대한 optimal chunk size를 찾는 것이 검색 결과의 정확성과 관련성을 보장하는데 중요하다.</li>
</ul>
<h3 id="embeddings">Embeddings</h3>
<ul>
<li>Prompt와 문서를 임베딩한다는 것은 쿼리와 지식 기반 문서를 효과적으로 비교할 수 있는 형식으로 변환하는 것을 포함하며, RAG 능력에 매우 중요하다</li>
<li>임베딩 방식에서 Dense embedding과 Sparse embedding을 사용할 지의 문제가 있다.</li>
<li><strong>Sparse Embedding</strong>: TF-IDF 등의 sparse embedding은 prompt와 문서 간의 어휘적 일치를 찾는데 좋아 키워드 관련성이 중요한 application에 적합하다. 계산 비용이 낮지만 텍스트의 깊은 의미를 포착하지 못할 수 있다.</li>
<li><strong>Semantic Embedding</strong>: BERT나 SentenceBERT같은 semantic embedding은 그 자체로 자연스럽게 RAG에 적합하다.<ul>
<li><strong>BERT</strong>: 쿼리와 문서의 문맥적 뉘앙스를 포착하는 데 적합하다. Sparse embedding에 비해 계산 리소스가 더 필요하지만, 의미론적으로 더 풍부한 임베딩을 생성한다.</li>
<li><strong>SentenceBERT</strong>: 문장 수준에서 의미와 문맥이 중요한 경우에 이상적이다. BERT의 깊은 문맥 이해와, 유의미한 sentence representation 사이에서 균형을 맞춘다. RAG에 보통 선호되는 방법이다.</li>
</ul>
</li>
</ul>
<h3 id="sentence-embeddings-the-what-and-why">Sentence Embeddings: the What and Why</h3>
<ol>
<li><strong>Background: Differences Compared to Token-Level Models Like BERT</strong><ul>
<li>Sentence Transformers는 전통적인 BERT 모델을 수정한 것으로, 전체 문장을 생성하는데 특화되어 있다. 학습 과정에서의 차이점은 아래와 같다<ol>
<li><strong>Objective</strong>: BERT는 문장에서의 masked words와 다음 문장을 예측하도록 학습된다. 반면 Sentence Transformers는 전체 문장의 의미를 이해하도록 훈련된다. 유사한 의미를 가진 문장들이 임베딩 공간에서 가깝게 생성된다.</li>
<li><strong>Level of Embedding</strong>: BERT는 토큰(word or subword) 단위의 임베딩을 제공하지만, Sentence Transformers는 전체 문장에 대한 단일 임베딩을 제공한다.</li>
<li><strong>Training Data and Tasks</strong>: BERT는 문맥 속 단어 이해에 중점을 둔 작업으로 대규모 text corpus에서 학습이 이루어지지만, Sentence Transformers는 문장 쌍을 포함하는 데이터셋에서 자주 훈련된다. 이는 유사성과 관련성에 중점을 두어 모델이 전체 문장의 의미를 이해하고 비교하는 방법을 학습싴킨다.</li>
<li><strong>Siamese and Triplet Network Structures</strong>: Sentence Transformers는 종종 샴 네트워크나 triplet 네트워크 구조를 사용한다. 이 네트워크들은 pair나 triplet으로 구성된 문장들을 처리하고, 유사한 문장들이 유사한 임베딩을 가지고 다른 문장들은 다른 임베딩을 가지도록 모델을 조정하는 작업을 수행한다. 이는 BERT의 학습과는 다르며, 별개의 문장들을 직접적으로 비교하는 것을 본질적으로 포함하지 않는다.</li>
<li><strong>Fine-tuning for Specific Tasks</strong>: Sentence Transformers는 BERT보다 문장 수준의 이해에 더 중점을 두고 있어 semantic similarity, IR과 같은 특정 작업에 자주 fine-tuning된다. BERT는 QA, sentimental analysis 등 더 넓은 범위의 NLP 작업에 미세 조정될 수 있다.</li>
<li><strong>Applicability</strong>: BERT와 유사 모델들은 토큰 level의 이해가 필요한 작업(named entity 인식, QA 등)에 더 다양하게 사용될 수 있는 반면, Sentence Transformers는 문장 수준의 이해에 의존하는 작업(semantic search, sentence similarity)에 더 적합하다.</li>
<li><strong>Efficiency in Generating Sentence Embeddings or Similarity Tasks</strong>: BERT에서 문장 임베딩을 생성하는 것은 일반적으로 문장 시작 토큰인 [CLS]를 사용하는 것을 포함한다. 그러나 이는 문장 level의 작업에 항상 최적은 아니다. Sentence Transformers는 유의미하고 유용한 문장 임베딩을 생성하도록 최적화되어 있어 더 효율적이다. 문장마다 단일 벡터를 생성하므로 문장 간 유사도 점수를 계산할 때 계산 비용이 낮다.</li>
</ol>
</li>
</ul>
</li>
<li><strong>Related: Training Process for Sentence Transformers vs. Token-Level Embedding Models</strong></li>
</ol>
<ul>
<li>Sentence Transformer는 sentence level에서 임베딩을 생성하도록 훈련되며, 이는 BERT와 같은 token level 임베딩 모델의 접근 방식과는 확연히 다르다.<ol>
<li><strong>Model Architecture</strong>: Sentence transformer는 BERT나 다른 transformer 구조와 비슷한 base model로 시작한다. 하지만 개별 토큰이 아닌 각 input sentence 전체에 대해서 임베딩 벡터를 출력하는데 초점을 맞춘다.</li>
<li><strong>Training Data</strong>: Sentence transformer는 문장 간의 관계(유사성, paraphrasing 등)가 정해진 문장 쌍이나 그룹을 포함한 다양한 데이터셋으로 학습된다.</li>
<li><strong>Training Objectives</strong>: BERT는 token level에서의 문맥 이해를 중점으로 하여 masked language modeling(다음 단어 예측)과 next sentence prediction과 같은 objectives로 pre-trained 된다. 반면 sentence transformer는 sentence level의 문맥과 관계성을 이해하기 위해 특화되어 학습된다. 이들의 objective는 의미론적으로 유사한 문장들의 임베딩 거리를 최소화하고, 의미가 다른 문장들의 임베딩 거리를 최대화하는 것이다. 이는 triplet loss, cosine similarity loss 등의 contrastive loss function을 통해 수행된다.</li>
<li><strong>Output Representation</strong>: BERT에서의 sentence level representation은 일반적으로 [CLS]와 같은 special token의 임베딩 또는 token embedding을 pooling하여 도출된다. Sentence transformer는 directly하게 유의미한 sentence level representation을 출력하도록 설계되었다.</li>
<li><strong>Fine tuning for Downstream Tasks</strong>: Sentence transformer는 semantic text similarity와 같은 특정 작업에서 fine tuning 될 수 있으며, 모델은 전체 문장의 미묘한 의미를 포착하는 임베딩을 생성하는 방법을 학습한다.</li>
</ol>
</li>
</ul>
<ol>
<li><strong>Applying Sentence Transformers for RAG</strong></li>
</ol>
<ul>
<li>Sentence transformer가 RAG를 위한 임베딩 생성 모델로써 왜 최선의 선택인가<ol>
<li><strong>Improved Document Retrieval</strong>: Sentence transformer는 문장의 의미론적 의미를 포착하는 임베딩을 생성하도록 훈련된다. RAG setting에서 이러한 임베딩은 DB의 가장 관련있는 문서와 쿼리를 일치시키는 데 사용할 수 있다. 이는 생성된 응답의 quality가 검색된 정보의 관련성에 의존하기 때문에 중요하다.</li>
<li><strong>Efficient Semantic Search</strong>: 전통적인 키워드 기반 검색 방법은 쿼리의 맥락이나 의미론적 뉘앙스를 이해하는 데 어려울 수 있다. 의미론적으로 유의미한 임베딩을 생성하는 Sentence transformer는 키워드의 일치를 넘어서 더 미묘한 검색을 가능하게 한다. 이는 RAG의 검색 구성 요소가 정확한 키워드를 포함하지 않더라도 쿼리와 의미론적으로 관련된 문서를 찾을 수 있음을 의미한다.</li>
<li><strong>Contextual Understanding for Better Responses</strong>: Sentence transformer를 사용하면 RAG 모델은 쿼리와 source 문서의 맥락과 뉘앙스를 더 잘 이해할 수 있다. 이는 모델이 더 관련성 있고 잘 이해된 정보로 작업을 수행할 수 있기 때문에 정확하고 맥락적으로 적합한 응답을 생성할 수 있다.</li>
<li><strong>Scalability in Information Retrieval</strong>: Sentence transformer는 모든 문서에 대한 임베딩을 사전에 계산함으로써 대규모 문서 DB를 효율적으로 처리한다. 이는 모델이 런타임에서 쿼리의 임베딩만을 계산한 다음 가장 가까운 문서 임베딩을 빠르게 찾을 수 있게 해서 retrieval process를 더 빠르고 확장 가능하게 한다.</li>
<li><strong>Enhancing the Generation Process</strong>: RAG setting에서 generation component는 retrieval component의 ‘관련성이 높고 의미론적으로 rich한 정보를 제공할 수 있는 능력’으로부터 이득을 얻는다. 이를 통해 LM은 모델 자체가 학습된 정보보다 더 넓은 범위의 정보를 바탕으로 맥락적으로 정확한 답변을 생성할 수 있다.</li>
</ol>
</li>
<li>Sentence transformer는 효과적인 semantic search과 retrieval of information을 가능하게 함으로써 RAG 모델과 LLM의 검색 능력을 향상시킨다. 이는 QA, 챗봇, 정보 추출 등 대량의 텍스트 데이터를 이해하고 이를 기반으로 response를 생성해야 하는 작업에서 성능을 향상시킨다.</li>
</ul>
<h2 id="retrieval">Retrieval</h2>
<ul>
<li>Retrieval의 유형에는 3가지가 있다. Standard / Sentence window / Auto-merging</li>
</ul>
<h3 id="standardnaive-approach">Standard/Naive Approach</h3>
<ul>
<li>Standard pipeline은 indexing/embedding과 output synthesis에 모두 동일한 text chunk를 사용한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/c7c13e0d-4481-427a-b18c-b096693f94b0/image.png" alt=""></p>
<p><strong>Advantages</strong></p>
<ol>
<li><strong>Simplicity and Efficiency</strong>: 이 방법은 간단하고 효율적으로, 임베딩과 합성 모두에 동일한 text chunk를 사용하여 검색 과정을 단순화한다.</li>
<li><strong>Uniformity in Data Handling</strong>: 검색과 합성 단계에서 사용되는 데이터의 일관성이  유지된다.</li>
</ol>
<p><strong>Disadvantages</strong></p>
<ol>
<li><strong>Limited Contextual Understanding</strong>: LLM은 더 나은 response를 생성하기 위해 더 큰 window가 필요할 수 있는데, standard 방식은 이를 제공하지 못할 수 있다.</li>
<li><strong>Potential for Suboptimal Responses</strong>: 제한된 context를 갖고 있기 때문에, LLM은 가장 관련성 있고 정확한 response를 생성할 수 있는 충분한 정보를 갖고 있지 않을 수 있다.</li>
</ol>
<h3 id="sentence-window-retrieval--small-to-large-chunking"><strong>Sentence-Window Retrieval / Small-to-Large Chunking</strong></h3>
<ul>
<li>Sentence-window 접근법은 문서를 더 작은 단위로 쪼갠다(문장이나 문장의 그룹으로).</li>
<li>Retrieval 을 위한 임베딩(벡터 DB에 저장된 더 작은 chunk)을 분리하지만, 합성을 위해 검색된 chunk 주변 context에 다시 추가된다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/c0792f5b-d13e-4165-b432-87c8200f8d12/image.png" alt=""></p>
<ul>
<li>Retrieval 동안 유사도 검색을 통해 쿼리와 가장 유사한 문장을 검색하고, 문장을 주변 문맥으로 대체한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/65bd53a2-6d10-4b37-9295-aa1a09b10484/image.png" alt=""></p>
<p><strong>Advantages</strong></p>
<ol>
<li><strong>Enhanced Specificity in Retrieval</strong>: 문서를 더 작은 단위로 나눔으로써, 쿼리와 직접적으로 관련된 세그먼트를 더 정확하게 검색할 수 있다.</li>
<li><strong>Context-Rich Synthesis</strong>: 검색된 청크 주위에 context를 다시 도입하여, response를 작성할 때 더 넓은 understanding을 제공한다.</li>
<li><strong>Balanced Approach</strong>: focused한 검색과, 풍부한 context 사이에서 균형을 이루어 response의 퀄리티를 높일 수 있다.</li>
</ol>
<p><strong>Disadvantages</strong></p>
<ol>
<li><strong>Increased Complexity</strong>: retrieval과 통합 과정을 별도로 관리해야 하므로 pipeline의 complexity가 증가한다.</li>
<li><strong>Potential Contextual Gaps</strong>: 추가된 주변 정보가 포괄적인 정보가 아니라면 context를 놓칠 수 있다.</li>
</ol>
<h3 id="auto-merging-retriever--hierarchical-retriever">Auto-merging Retriever / Hierarchical Retriever</h3>
<ul>
<li><p>이전에 설명한 naive한 retrieval 방식은 chunk size가 작을수록 fragmented된 chunk들을 처리하는 데 어려움을 겪는다. (아래 그림 참고)</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/a9508c51-0b42-4fc4-816b-ad4ece4efc9d/image.png" alt=""></p>
</li>
<li><p>Auto-merging retrieval은 아래 그림과 같이 naive 방법에서 발생할 수 있는 fragmented chunk를 검색하지 않도록 한다.</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/8199b368-b0c4-43f5-8b89-735aae2934a9/image.png" alt=""></p>
</li>
<li><p>Auto-merging retrieval은 여러 source나 text segment에서 정보를 결합해 쿼리에 대해 맥락적으로 유의미한 response를 생성하는 것을 목표로 한다. 이 방식은 source가 여러 개일 때 특히 유용하다.</p>
</li>
<li><p>Auto-merging retrieval은 작은 chunk를 더 큰 상위 chunk로 합칠 수 있게 하며, 다음과 같은 단계로 이루어진다.</p>
<ol>
<li>상위 chunk에 연결된 작은 chunk의 계층 구조를 정의한다.</li>
<li>상위 chunk에 연결된 작은 chunk set이 일정 threshold(ex: 코사인 유사도)를 넘는다면, 작은 chunk를 더 큰 상위 chunk에 병합한다.</li>
</ol>
</li>
<li><p>최종적으로는 상위 chunk를 검색하게 된다.</p>
</li>
</ul>
<p><strong>Advantages</strong></p>
<ol>
<li><strong>Comprehensive Contextual Responses</strong>: 여러 source에서 정보를 가져오므로 더 포괄적이고 맥락적으로 관련있는 응답을 생성할 수 있다.</li>
<li><strong>Reduced Fragmentation</strong>: naive approach와 작은 chunk 크기에서 특히 자주 발생하는 fragmented information retrieval 문제를 어느 정도 해결한다. </li>
<li><strong>Dynamic Content Integration</strong>: 작은 chunk를 큰 chunk로 동적으로 결합하는 것은 LLM에게 제공되는 정보의 richness를 향상시킨다.</li>
</ol>
<p><strong>Disadvantages</strong></p>
<ol>
<li><strong>Complexity in Hierarchy and Threshold Management</strong>: hierachy를 정의하는 것과 적절한 임계값을 설정하는 것은 복잡하며, 이러한 과정은 매우 중요하다.</li>
<li><strong>Risk of Over-generalization</strong>: 너무 많은 정보나 관련없는 정보를 병합하는 것은 response가 지나치게 광범위해지거나 주제에서 벗어나게 될 가능성이 있다.</li>
<li><strong>Computational Intensity</strong>: chunk의 hierachy를 관리하는 추가적인 단계로 인해 많은 컴퓨팅 자원이 필요할 수 있다.</li>
</ol>
<h3 id="figuring-out-the-ideal-chunk-size">Figuring Out the Ideal Chunk Size</h3>
<ul>
<li>RAG 시스템을 구현할 때에는 고려해야 할 retrieval 파라미터와 전략이 매우 많다(chunk 크기, 벡터 vs 키워드 vs 하이브리드 검색 방식 등). 이 중 chunk size를 살펴본다.</li>
<li>RAG 시스템을 구축하는 과정에서 retrieval 컴포넌트가 처리할 문서의 이상적인 chunk 크기를 결정하는 것이 중요하며, 그 이상적 크기는 여러 요인에 따라 달라진다.<ol>
<li><strong>Data Characteristics:</strong> 텍스트 문서의 경우, 단락의 평균 길이나 섹션의 평균 길이를 고려해야 한다. 문서가 구분된 섹션으로 잘 구조화되어 있다면, 그런 자연스러운 구분이 chunk size로서의 좋은 기준이 될 수 있다.</li>
<li><strong>Retriever Constraints:</strong> 선택한 retriever 모델(BM25, TF-IDF, 신경망 기반 retriever like DPR)이 입력 길이에 제한이 있을 수 있다. chunk가 이러한 제약에 맞추어 구성되어야 한다.</li>
<li><strong>Memory and Computational Resources:</strong> chunk 크기가 커지면 연산량이 늘어나므로 효율적인 처리를 위해 가용 자원에 맞추어 chunk 크기를 조절해야 한다.</li>
<li><strong>Task Requirements:</strong> task의 성격(ex: QA, summarization 등)에 따라 이상적인 chunk의 size가 달라질 수 있다. Detailed task에서는 specific detail을 포착하기 위해 작은 chunk size가 유리할 수 있으며, broad한 task에서는 비교적 큰 chunk size가 유리할 수 있다.</li>
<li><strong>Experimentation:</strong> 이상적인 chunk size를 결정하는 가장 좋은 방법은 실험을 통해서 정하는 것이다. 다양한 실험에서의 성능 평가를 통해 세밀함과 맥락 사이의 균형을 찾아야 한다.</li>
<li><strong>Overlap Consideration:</strong> chunk 간의 overlap이 있는 것이 경계 구간에서 중요한 정보를 놓치지 않도록 하는 데 유리하다. task나 데이터 특성에 따라 적절한 overlap 크기를 정해야 한다.</li>
</ol>
</li>
</ul>
<p><strong>Retriever Ensembling and Reranking</strong></p>
<ul>
<li><strong>Thought</strong>: 여러 chunk 크기를 동시에 시도해보고, re-ranker(재정렬기)가 결과를 가지치기(prune)할 수 있다면 어떨까?</li>
<li>이는 두 목적을 달성할 수 있다:<ol>
<li>Re-ranker의 성능이 적당한 수준이라면, 다양한 chunk 크기로부터 도출된 결과를 모아서 더 나은 검색 결과를 얻을 수 있다(비록 비용은 더 많이 들지만).</li>
<li>Re-ranker에 대해 서로 다른 retrieval 전략을 서로 비교하는 벤치마크를 제공할 수 있다.</li>
</ol>
</li>
<li>프로세스는 다음과 같다:<ol>
<li>하나의 문서를 여러 방법으로 chunk 한다. 예를 들어 128, 256, 512, 1024를 chunk size로 한다.</li>
<li>Retrieval 중에, retriever에서 유사한 chunk를 가져오고, 이를 앙상블하여 retrieval을 수행한다.</li>
<li>Re-ranker을 사용하여 순위를 매기고 prune한다.</li>
</ol>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/3f71e9e5-3953-4786-b55f-f0d4dd18d6de/image.jpg" alt=""></p>
<ul>
<li>Ensemble 접근법의 faithfulness 지표가 약간 상승하여 검색된 결과가 약간 더 유사성이 있는 것으로 나타났다. 그러나 pairwise comparisons에서는 equal preference로 나타나, 앙상블 방식이 더 나은지 여부는 여전히 의문이다.</li>
</ul>
<h3 id="re-ranking">Re-ranking</h3>
<ul>
<li>RAG에서 re-ranking은 검색된 문서들이나 정보 조각들을 쿼리나 작업과의 관련성에 따라 평가하고 정렬하는 과정을 의미한다.</li>
<li>RAG에서는 여러 유형의 re-ranking 기법이 사용된다:<ul>
<li><strong>Lexical Re-Ranking:</strong> 쿼리와 검색된 문서 간의 어휘적 유사성에 기반해 재정렬하는 방식으로, BM25, TF-IDF 벡터, 코사인 유사도 같은 방법이 일반적으로 사용된다.</li>
<li><strong>Semantic Re-Ranking:</strong> semantic한 이해를 통해 문서의 관련성을 판단하는 방식이다. BERT와 같은 신경망 모델이나 다른 transformer 기반 모델을 사용해 단순 단어 기반이 아닌 맥락과 의미를 이해하는데 중점을 둔다.</li>
<li><strong>Learning-to-Rank (LTR) Methods:</strong> 문서의 ranking을 위한 모델을 훈련하는 방법으로, 쿼리와 문서 모두에서 추출한 feature를 바탕으로 문서의 rank를 매긴다. 이 feature에는 어휘적, 의미적 등등의 특징이 있을 수 있다. LTR 방법에는 point-wise, pair-wise, list-wise가 포함된다.</li>
<li><strong>Hybrid Methods:</strong> Lexical과 Semantic 접근법을 결합하거나, user feedback이나 도메인 specific features같은 것을 추가하여 성능을 개선한다.</li>
</ul>
</li>
<li>Re-ranking 단계에서는 후보 집합이 수십 개로 제한되므로 주로 신경망 기반 LTR 기법이 사용된다. Re-ranking에 일반적으로 사용되는 신경망 모델을 다음이 있다:<ul>
<li>Multi-Stage Document Ranking with BERT (monoBert and duoBERT)</li>
<li>Pretrained Transformers for Text Ranking BERT and Beyond</li>
<li>ListT5</li>
<li>ListBERT</li>
</ul>
</li>
</ul>
<h2 id="response-generation--synthesis">Response Generation / Synthesis</h2>
<ul>
<li>RAG pipeline의 마지막 단계는 사용자에게 response를 생성하는 것이다. 이 단계에서는 모델이 검색된 정보와 사전 학습된 지식을 통합하여 일관되고 맥락적으로 관련성 있는 응답을 생성한다.</li>
<li>LLM이 정보에 근거한 response를 생성할 수 있도록 retrieved된 top-k chunks를 사용해 확장된 프롬포트를 작성할 때, 입력 시퀀스의 시작이나 끝에 중요한 정보를 전략적으로 배치하는 것이 RAG 시스템의 효율성을 높이고 성능을 높일 수 있다.</li>
</ul>
<h3 id="paper-lost-in-the-middle-how-language-models-use-long-contexts"><a href="https://aclanthology.org/2024.tacl-1.9/">[Paper] Lost in the Middle: How Language Models Use Long Contexts</a></h3>
<ul>
<li>최근의 LM은 긴 context를 입력으로 사용할 수 있지만, 이 긴 문맥을 얼마나 잘 사용하는지에 대해서는 상대적으로 알려진 바가 적다.</li>
<li>해당 논문은 LM이 입력된 context 내에서 관련 정보를 식별하는 두 가지 task에서의 성능을 분석한다. (Multi-document QA, key-value retrieval)</li>
<li>Open-source 모델 (MPT-30B-Instruct, LongChat-13B)과 Closed-source 모델 (OpenAI’s GPT-3.5-Turbo and Anthropic’s Claude 1.3)로 실험을 진행했다.</li>
<li>Context 속에 여러 개의 검색된 문서와 하나의 정답을 포함시키고, 그 위치를 섞어 multi-document QA를 수행했다. 또한, 더 긴 context가 성능에 미치는 영향을 분석하기 위해 key-value pair retrieval을 수행했다.</li>
<li>연구진은 관련 정보가 input context의 시작이나 끝에 있을 때 성능이 가장 높고, 모델이 긴 context의 중간에 있는 관련 정보에 접근해야 할 때 성능이 크게 낮아진다는 사실을 발견했다.</li>
<li>연구의 주요 결과는 다음과 같다:<ul>
<li>관련 정보가 context의 시작에 있을 때 성능이 가장 좋다.</li>
<li>context의 길이가 길어질수록 성능이 저하된다.</li>
<li>너무 많은 문서가 retreived되면 성능이 저하된다.</li>
<li>Ranking 단계를 통해 retrieval과 프롬포트 생성 단계를 개선하면 성능이 20%까지 향상될 수 있다.</li>
<li>프롬프트가 original context에 잘 맞추어져 있다면, 확장된 context 모델들 (GPT-3.5-Turbo vs. GPT-3.5-Turbo (16K))이 더 나은 성능을 보여주지는 않는다.</li>
</ul>
</li>
<li>RAG는 외부 DB에서 정보를 검색하며, 이 DB는 일반적으로 chunk로 나뉘어진 긴 텍스트를 포함한다. chunk로 나누더라도 context window는 매우 빠르게 커지며, 적어도 ‘일반적인’ 질문보다 휠씬 더 커진다. 또한 input context가 길어질수록 성능은 상당히 감소하며, 이는 긴 context를 명시적으로 처리하는 모델도 마찬가지다.</li>
<li>LLM 아키텍처에서 문서 중간에 있는 텍스트의 검색 성능이 더 나빠야하는 귀납적 편향은 없다. 이는 훈련 데이터와 인간이 글을 작성하는 방식 때문이라고 생각한다. 가장 중요한 정보는 보통 시작이나 끝에 위치해 있다. LLM이 훈련 중에 attention weight를 parameterize하는 방식도 이와 관련이 있을 것이다.<a href="https://www.linkedin.com/feed/update/urn:li:activity:7083427280605089792/">(source)</a></li>
<li>인간이 직면하는 두 가지 대표적인 인지 편향(primacy &amp; recency bias)을 통해 모델링할 수 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/933feaa2-9284-4302-9858-123fc2452891/image.jpg" alt=""></p>
<ul>
<li>결론적으로, 추천 시스템에서와 같이 retrieval과 ranking을 결합하면 QA에서의 RAG의 최고성능을 얻을 수 있다.</li>
<li>아래 이미지는 ‘LLM은 input context의 처음이나 끝 정보를 사용하는데 탁월하다’라는 idea를 나타낸다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/d6062a81-a2d8-4a41-9e6d-a03a1ab7eede/image.jpg" alt=""></p>
<h3 id="the-needle-in-a-haystack-test">The “Needle in a Haystack” Test</h3>
<ul>
<li>긴 context를 가진 LLM의 context 내의 retrieval ability를 이해하기 위해, ‘needle in a haystack(건초더미 속 바늘)’ analysis를 수행할 수 있다. 이는 특정한 목표 정보(바늘)를 더 크고 복잡한 텍스트 본문(건초더미) 안에 임베딩하는 것을 포함한다. 이러한 분석의 목적은 방대한 양의 다른 데이터 속에서 특정한 정보를 식별하고 활용할 수 있는 LLM의 능력을 테스트 하는 데 있다.</li>
<li>이 실험은 LLM 성능의 여러 측면을 평가하도록 구조화될 수 있다. 예를 들어, ‘바늘’의 위치를 텍스트의 초반, 중간, 후반으로 다양하게 배치하여 정보의 위치에 따라 모델의 retrieval 성능이 어떻게 변하는지 확인할 수 있다. 또한 주변 ‘건초더미’의 복잡성을 조정하여, 다양한 contextual 난이도 하에서 LLM의 성능을 테스트할 수 있다.</li>
<li>아래 그림들은 GPT-4 128K 모델과 Claude-2.1 200K가 다양한 context 길이에 따라 수행한 성능을 나타낸다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/f7093b46-7606-4d60-ad79-803c74ff4245/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/dutch-tulip/post/1e2dbc9b-f034-4cb9-b79f-2552a0007a62/image.jpg" alt=""></p>
<ul>
<li>아래 figure는 Claude 2.1의 long context QA 오류를 context 길이 별로 나타낸 것이다. 평균적으로 Claude 2.1은 Claude 2와 비교하여 오답이 30% 감소한 것으로 나타났다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/5ea2aa3f-f14d-4611-84a8-f793fcd81769/image.jpg" alt=""></p>
<ul>
<li>그러나, Anthropic 블로그의 <strong>Long context prompting for Claude 2.1</strong> 글에 따르면, response 시작 부분에 ‘Here is the most relevant sentence in the context.(여기 context에서 가장 관련성이 높은 문장입니다)” 라는 문구를 추가했을 때, 원래 평가에서 점수가 27%에서 98%로 상승했다고 언급했다. 아래의 figure는 Claude 2.1이 전체 200K 토큰의 context window에서 개별 문장을 retrieving 할 때의 성능을 보여준다. 이 실험은 위에서 언급한 프롬프트 기법을 사용한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/64e34828-726e-4a82-9f5f-67b1e315bf00/image.jpg" alt=""></p>
<h1 id="component-wise-evaluation">Component-Wise Evaluation</h1>
<ul>
<li>Component-wise evaluation(구성 요소별 평가)은 LLM 시스템에서 개별 구성 요소들을 각각 평가하는 것을 의미한다.  이 접근 방식은 일반적으로 데이터베이스나 코퍼스에서 관련 정보를 가져오는 retrieval component와, 검색된 데이터를 기반으로 response를 생성하는 generation component의 성능을 검토한다. 이러한 컴포넌트들을 개별적으로 평가함으로써 전체 RAG 시스템에서 개선이 필요한 특정 영역을 식별할 수 있으며, 이는 정보 검색과 응답 생성의 효율성과 정확성을 높이는 데 기여한다.</li>
<li>Retrieval의 성능을 평가하는 데에는 Context Precision, Context Recall, Context Relevance와 같은 지표가 사용되며, Generation의 품질을 평가하기 위해서는 Groundedness와 Answer Relevance 지표가 사용된다.</li>
<li>구체적으로,<ul>
<li>Retrieval 평가 지표: Context Precision은 시스템이 관련 항목을 얼마나 높은 순위에 배치하는지를 평가하고, Context Recall은 시스템이 관련된 모든 맥락을 얼마나 잘 검색하는지를 측정한다. Context Relevance는 검색된 정보가 user query와 얼마나 일치하는지 평가한다. 이러한 지표들은 retrieval 시스템이 정확한 response를 생성하기 위해 가장 관련있고 complete한 context를 제공하는지 보장하는지 평가한다.</li>
<li>Generation 평가 지표: Faithfullness와 Answer Relevance는 생성된 응답의 사실적 일관성과, 응답이 원래 질문과 얼마나 관련이 있는지를 평가한다. Faithfulness는 응답의 사실적 정확성에 중점을 두며, 모든 주장들이 주어진 맥락에서 추론될 수 있는지를 확인한다. Answer Relevance는 응답이 원래 질문을 얼마나 잘 다루고 있는지를 평가하며, 불완전하거나 중복된 응답에 대해 페널티를 부여한다. 이런 지표들은 generation component가 맥락적으로 적절하고 의미적으로 관련된 응답을 생성하도록 평가한다.</li>
</ul>
</li>
<li>4개 점수(Context Precicion, Context Recall, Faithfulness, Answer Relevancy)의 조화 평균(harmonic mean)은 <strong>RAGAS score</strong>라고 불리며, RAG 시스템의 전반적인 성능을 중요한 모든 측면에서 단일 지표로 측정한 것이다.</li>
<li>대부분의 측정은 라벨 데이터가 필요하지 않기 때문에, 테스트 데이터셋을 구축할 필요 없이 수행할 수 있다. RAGAS를 측정하기 위해 필요한 것은 몇 가지 질문과, Context Recall을 사용할 경우 reference answer 뿐이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/c71d9c0c-2fb9-4424-94cd-d9775f69c6f1/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/afaf9c37-16ed-40a7-a8a2-43c339098810/image.png" alt=""></p>
<ul>
<li>Groundedness = Faithfulness</li>
</ul>
<h1 id="improving-rag-systems">Improving RAG Systems</h1>
<ul>
<li>RAG 시스템의 성능을 개선하기 위해, 아래 세 가지 구조화된 방법을 고려할 수 있다.<ol>
<li>Re-ranking Retrieved results: 기본적이면서도 효과적인 방법으로, 초기 검색을 통해 얻어진 결과를 refine 하기 위해 re-ranking 모델을 사용하는 것이 있다. 이 방식은 더 관련성이 높은 결과에 우선순위를 두어, 생성된 결과의 전반적 퀄리티를 향상시킨다. MonoT5, MonoBERT, DuoBERT 등이 re-ranking 모델로 사용될 수 있다.</li>
<li>FLARE 기법: re-ranking 이후에는 FLARE를 사용할 수 있다. FLARE는 생성된 content의 일부 구간의 신뢰 수준이 특정 임계값 이하로 떨어질 때마다 인터넷(또는 local knowledge base)를 동적으로 조회한다. 이는 일반 RAG가 knowledge base를 초기에만 조회한 뒤 최종 출력을 생성하는 한계를 극복한다.</li>
<li>HyDE 기법: HyDE 기법은 쿼리에 응답하기 위해 가상의 문서를 생성하는 개념을 도입한다. 이 문서는 임베딩 벡터로 변환된 후, vector similarity를 기반으로 corpus 임베딩 공간 내에서 유사한 인접 문서를 식별하는 데 사용된다. 이 방법의 독창성은 벡터를 사용해 유사한 실제 문서를 검색하는 데 있다.</li>
</ol>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] Streamlit 기본 문법 (text, data, cache, session)]]></title>
            <link>https://velog.io/@dutch-tulip/streamlit-basic</link>
            <guid>https://velog.io/@dutch-tulip/streamlit-basic</guid>
            <pubDate>Thu, 08 Aug 2024 06:18:56 GMT</pubDate>
            <description><![CDATA[<h1 id="streamlit"><strong>Streamlit?</strong></h1>
<p>데이터 과학자와 AI/ML 엔지니어가 단 몇 줄의 코드만으로 동적 데이터 앱을 제공할 수 있는 오픈 소스 Python 프레임워크</p>
<ul>
<li>복잡한 프론트 코딩 없이 간단/간결하게 페이지 만들어 AI 모델을 서빙할 수 있음</li>
<li>세밀하고 복잡한 UI/UX/디자인 서비스 구현 어려움</li>
<li>사용자 많을 경우 대응 어려움</li>
</ul>
<h2 id="0-데이터-출력-write">0. <a href="https://docs.streamlit.io/develop/api-reference/write-magic/st.write">데이터 출력 write</a></h2>
<pre><code class="language-python">a = 10
b = 3
st.write(&#39;a*b-a = &#39;, a*b-a)</code></pre>
<h1 id="1-text-다루기">1. <a href="https://docs.streamlit.io/develop/api-reference/text">Text 다루기</a></h1>
<h2 id="텍스트-text"><a href="https://docs.streamlit.io/develop/api-reference/text/st.text">텍스트 Text</a></h2>
<pre><code class="language-python">st.text(&#39;This is text&#39;)
st.markdown(&quot;This is Markdown text&quot;)</code></pre>
<h2 id="마크다운-markdown"><a href="https://docs.streamlit.io/develop/api-reference/text/st.markdown">마크다운 markdown</a></h2>
<pre><code class="language-python">st.markdown(&quot;This is Markdown text&quot;)
#볼드
st.markdown(&quot;**This is BOLD Markdown text**&quot;)
#이탤릭
st.markdown(&quot;*This is ITALIC Markdown text*&quot;)
st.markdown(&quot;_This is ITALIC Markdown text_&quot;)
#볼드&amp;이탤릭
st.markdown(&quot;**_This is BOLD &amp; ITALIC Markdown text_**&quot;)</code></pre>
<h2 id="페이지-제목-title"><a href="https://docs.streamlit.io/develop/api-reference/text/st.title">페이지 제목 title</a></h2>
<pre><code class="language-python">st.title(&#39;This is title&#39;)
st.markdown(&quot;# This is Markdown title&quot;)</code></pre>
<h2 id="헤더-header"><a href="https://docs.streamlit.io/develop/api-reference/text/st.header">헤더 header</a></h2>
<pre><code class="language-python">st.header(&#39;This is header&#39;)
st.markdown(&quot;## This is Markdown header&quot;)</code></pre>
<h2 id="sub헤더-subheader"><a href="https://docs.streamlit.io/develop/api-reference/text/st.subheader">sub헤더 subheader</a></h2>
<pre><code class="language-python">st.subheader(&#39;This is subheader&#39;)
st.markdown(&quot;### This is Markdown subheader&quot;)</code></pre>
<h2 id="캡션-caption"><a href="https://docs.streamlit.io/develop/api-reference/text/st.caption">캡션 caption</a></h2>
<pre><code class="language-python">st.caption(&#39;This is caption&#39;)
## markdown 사용 불가 - 이미지, 테이블, 차트 캡션 용도로 사용되므로</code></pre>
<h2 id="latex-수식-latex"><a href="https://docs.streamlit.io/develop/api-reference/text/st.latex">LaTeX 수식 latex</a></h2>
<pre><code class="language-python">st.latex(r&#39;&#39;&#39;\sqrt[n]{x}&#39;&#39;&#39;)</code></pre>
<h2 id="코드-스니펫-code"><a href="https://docs.streamlit.io/develop/api-reference/text/st.code">코드 스니펫 code</a></h2>
<pre><code class="language-python">text=&#39;&#39;&#39;print(&#39;hello world!&#39;)&#39;&#39;&#39;
st.code(text)</code></pre>
<h2 id="글머리-기호ul-li-by-markdown">글머리 기호(ul, li) by markdown</h2>
<pre><code class="language-python">st.markdown(&#39;- 1st \n&#39;
            &#39;  - 2nd \n&#39;         #공백 2칸
            &#39;    - 3rd \n&#39;) #공백 4칸</code></pre>
<h2 id="숫자-리스트ol-li-by-markdown">숫자 리스트(ol, li) by markdown</h2>
<pre><code class="language-python">st.markdown(&#39;- 1st \n&#39;
            &#39;   - 1st \n&#39;         #공백 3칸
            &#39;      - 1st \n&#39;) #공백 6칸</code></pre>
<h1 id="2-다양한-data--media-다루기-dataframe-이미지-동영상--">2. 다양한 Data + Media 다루기 (<a href="https://docs.streamlit.io/develop/concepts/design/dataframes">Dataframe</a>, 이미지, 동영상 … )</h1>
<h2 id="dataframe"><a href="https://docs.streamlit.io/develop/api-reference/data/st.dataframe">Dataframe</a></h2>
<pre><code class="language-python">data = {
    &#39;Name&#39;: [&#39;Alice&#39;, &#39;Bob&#39;, &#39;Charlie&#39;, &#39;David&#39;, &#39;Eva&#39;],
    &#39;Age&#39;: [25, 30, 35, 40, 45],
    &#39;City&#39;: [&#39;New York&#39;, &#39;Los Angeles&#39;, &#39;Chicago&#39;, &#39;Houston&#39;, &#39;Phoenix&#39;]
}

df = pd.DataFrame(data)

&#39;&#39;&#39;
# static 방법
st.write(&quot;DataFrame using st.write:&quot;)
st.write(df)
&#39;&#39;&#39;

# 동적 방법
st.write(&quot;DataFrame using st.dataframe:&quot;)
st.dataframe(df)</code></pre>
<h2 id="오디오-audio"><a href="https://docs.streamlit.io/develop/api-reference/media/st.audio">오디오 audio</a></h2>
<pre><code class="language-python">st.audio(&#39;audio.mp3&#39;)</code></pre>
<h2 id="동영상-video"><a href="https://docs.streamlit.io/develop/api-reference/media/st.video">동영상 video</a></h2>
<pre><code class="language-python">st.video(&#39;video.mp4&#39;)</code></pre>
<h2 id="이미지-image"><a href="https://docs.streamlit.io/develop/api-reference/media/st.image">이미지 image</a></h2>
<pre><code class="language-python">st.image(&#39;경로&#39;, caption=&#39;캡션&#39;)</code></pre>
<h2 id="표-table"><a href="https://docs.streamlit.io/develop/api-reference/data/st.table">표 table</a></h2>
<pre><code class="language-python">data = {
    &#39;Name&#39;: [&#39;Alice&#39;, &#39;Bob&#39;, &#39;Charlie&#39;],
    &#39;Age&#39;: [28, 34, 22],
    &#39;Job&#39;: [&#39;Engineer&#39;, &#39;Doctor&#39;, &#39;Artist&#39;]
}
table = pd.DataFrame(data)

st.table(table)</code></pre>
<ul>
<li>st.table은 static table을 표시하는 가장 기본적인 방식이라고 한다. 대부분의 동적 테이블은 st.dataframe으로 구현하며, 사용자가 편집하는 dataframe은 st.data_editor을 사용한다.</li>
</ul>
<h1 id="3-input-위젯-다루기">3. <a href="https://docs.streamlit.io/develop/api-reference/widgets">Input 위젯 다루기</a></h1>
<h2 id="버튼-button"><a href="https://docs.streamlit.io/develop/api-reference/widgets/st.button">버튼 button</a></h2>
<pre><code class="language-python">st.button(&quot;Reset button&quot;, type=&quot;primary&quot;)
if st.button(&quot;switch&quot;):
    st.write(&quot;change text&quot;)
else:
    st.write(&quot;reset&quot;)</code></pre>
<h2 id="다운로드-버튼-download_button"><a href="https://docs.streamlit.io/develop/api-reference/widgets/st.download_button">다운로드 버튼 download_button</a></h2>
<pre><code class="language-python">#dataframe을 csv로 변환하여 다운로드

@st.cache_data     #convert_df 결과를 캐싱하여 나중에도 사용
def convert_df(df):
    return df.to_csv().encode(&quot;utf-8&quot;)

csv = convert_df(my_large_df)

st.**download_button**(
    label=&quot;Download data as CSV&quot;,
    data=csv,
    file_name=&quot;large_df.csv&quot;,
    mime=&quot;text/csv&quot;,
)</code></pre>
<h2 id="링크-page_link"><a href="https://docs.streamlit.io/develop/api-reference/widgets/st.page_link">링크 page_link</a></h2>
<pre><code class="language-python">st.page_link(&quot;app.py&quot;, label=&quot;Home&quot;, icon=&quot;🏠&quot;)</code></pre>
<h2 id="입력-폼-form"><a href="https://docs.streamlit.io/develop/api-reference/execution-flow/st.form">입력 폼 form</a></h2>
<h3 id="체크박스-checkbox"><a href="https://docs.streamlit.io/develop/api-reference/widgets/st.checkbox">체크박스 checkbox</a></h3>
<h3 id="토글-toggle"><a href="https://docs.streamlit.io/develop/api-reference/widgets/st.toggle">토글 toggle</a></h3>
<h3 id="라디오-버튼-radio"><a href="https://docs.streamlit.io/develop/api-reference/widgets/st.radio">라디오 버튼 radio</a></h3>
<h3 id="드롭다운-selectbox"><a href="https://docs.streamlit.io/develop/api-reference/widgets/st.selectbox">드롭다운 selectbox</a></h3>
<h3 id="텍스트-입력받기-text_input"><a href="https://docs.streamlit.io/develop/api-reference/widgets/st.text_input">텍스트 입력받기 text_input</a></h3>
<ul>
<li><a href="https://docs.streamlit.io/develop/api-reference/widgets/st.number_input">number_input</a>, <a href="https://docs.streamlit.io/develop/api-reference/widgets/st.date_input">date_~</a>, <a href="https://docs.streamlit.io/develop/api-reference/widgets/st.time_input">time_~</a> 도 있음</li>
</ul>
<h3 id="양식-제출-버튼-form_submit_button"><a href="https://docs.streamlit.io/develop/api-reference/execution-flow/st.form_submit_button">양식 제출 버튼 form_submit_button</a></h3>
<pre><code class="language-python">with st.form(key=&#39;form 식별 값&#39;):
    st.write(&quot;모든 input field를 채우세요&quot;)

    checkbox_val = st.checkbox(&#39;checkbox 입니다&#39;)
    toggle_val = st.toggle(&#39;toggle 입니다&#39;)
    radio_val = st.radio(&#39;radio 입니다:&#39;, [&#39;Option 1&#39;, &#39;Option 2&#39;, &#39;Option 3&#39;])
    selectbox_val = st.selectbox(&#39;selectbox 입니다&#39;, [&#39;Red&#39;, &#39;Green&#39;, &#39;Blue&#39;])
    text_input_val = st.text_input(&#39;text input 입니다&#39;)

    # Submit button
    submit_button = st.form_submit_button(label=&#39;제출&#39;)

#input field 검증
if submit_button:
    if checkbox_val and toggle_val and radio_val and selectbox_val and text_input_val:
        st.success(&#39;제출되었습니다&#39;)
    else:
        st.error(&#39;모든 field를 채우세요&#39;)</code></pre>
<h2 id="★☆채팅-입력-받기☆★-chat_input-chat_massage">★☆채팅 입력 받기☆★ <a href="https://docs.streamlit.io/develop/api-reference/chat/st.chat_input">chat_input</a>, <a href="https://docs.streamlit.io/develop/api-reference/chat/st.chat_message">chat_massage</a></h2>
<pre><code class="language-python">prompt = st.chat_input(&quot;메시지를 입력하세요.&quot;) #placeholder
if prompt:
    with st.chat_message(&quot;user&quot;): #사용자 메시지 컨테이너
        st.write(prompt)
    with st.chat_message(&quot;ai&quot;, avatar=&quot;🤖&quot;): #인공지능 메시지 컨테이너
        st.write(&quot;이것은 인공지능 응답입니다.&quot;)</code></pre>
<ul>
<li><ul>
<li><p>채팅 관련 3rd-party component</p>
<ul>
<li>Streamlit Chat: <a href="https://github.com/AI-Yash/st-chat">https://github.com/AI-Yash/st-chat</a></li>
</ul>
<pre><code class="language-python">pip install streamlit-chat 

from streamlit_chat import message

message(&quot;My message&quot;) 
message(&quot;Hello bot!&quot;, is_user=True)  # align&#39;s the message to the right

input_text = st.text_input(&quot;You: &quot;,&quot;Hello, how are you?&quot;, key=&quot;input&quot;)</code></pre>
</li>
</ul>
</li>
</ul>
<h1 id="4-캐싱-세션-관리">4. 캐싱, 세션 관리</h1>
<h2 id="데이터-캐싱-cache_data"><a href="https://docs.streamlit.io/develop/api-reference/caching-and-state/st.cache_data">데이터 캐싱 cache_data</a></h2>
<ul>
<li>데이터 한 번 로딩되면 그 데이터는 캐싱해서 빠르게 로드 가능</li>
</ul>
<pre><code class="language-python">@st.cache_data
def load_data():
    time.sleep(5)  # 5초 딜레이
    data = pd.DataFrame({
        &#39;col1&#39;: range(1000),
        &#39;col2&#39;: range(1000, 2000)
    })
    return data

data = load_data()

st.write(data)</code></pre>
<h2 id="리소스-캐싱-cache_resource"><a href="https://docs.streamlit.io/develop/api-reference/caching-and-state/st.cache_resource">리소스 캐싱 cache_resource</a></h2>
<ul>
<li>AI 모델, DB 등의 리소스(반환 결과 등)를 효율적으로 사용하여 응답 시간 단축, 성능 최적화</li>
</ul>
<pre><code class="language-python">#사이킷런 캘리포니아 집 값 예측 모델 학습 예제
def load_data():
    california = fetch_california_housing()
    X = pd.DataFrame(california.data, columns=california.feature_names)
    y = pd.Series(california.target, name=&#39;target&#39;)
    return X, y

@st.cache_resource
def train_model(X, y):
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
    model = RandomForestRegressor(n_estimators=100, random_state=42)
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    return model, mse

def main():
    st.title(&quot;California Housing Price&quot;)

    X, y = load_data()

    model, mse = train_model(X, y)
    st.write(f&quot;Train MSE: {mse:.2f}&quot;)

    st.header(&quot;Input Features&quot;)
    MedInc = st.number_input(&quot;MedInc&quot;, float(X[&#39;MedInc&#39;].min()), float(X[&#39;MedInc&#39;].max()), float(X[&#39;MedInc&#39;].mean()))
    HouseAge = st.number_input(&quot;HouseAge&quot;, float(X[&#39;HouseAge&#39;].min()), float(X[&#39;HouseAge&#39;].max()), float(X[&#39;HouseAge&#39;].mean()))
    AveRooms = st.number_input(&quot;AveRooms&quot;, float(X[&#39;AveRooms&#39;].min()), float(X[&#39;AveRooms&#39;].max()), float(X[&#39;AveRooms&#39;].mean()))
    AveBedrms = st.number_input(&quot;AveBedrms&quot;, float(X[&#39;AveBedrms&#39;].min()), float(X[&#39;AveBedrms&#39;].max()), float(X[&#39;AveBedrms&#39;].mean()))
    Population = st.number_input(&quot;Population&quot;, float(X[&#39;Population&#39;].min()), float(X[&#39;Population&#39;].max()), float(X[&#39;Population&#39;].mean()))
    AveOccup = st.number_input(&quot;AveOccup&quot;, float(X[&#39;AveOccup&#39;].min()), float(X[&#39;AveOccup&#39;].max()), float(X[&#39;AveOccup&#39;].mean()))
    Latitude = st.number_input(&quot;Latitude&quot;, float(X[&#39;Latitude&#39;].min()), float(X[&#39;Latitude&#39;].max()), float(X[&#39;Latitude&#39;].mean()))
    Longitude = st.number_input(&quot;Longitude&quot;, float(X[&#39;Longitude&#39;].min()), float(X[&#39;Longitude&#39;].max()), float(X[&#39;Longitude&#39;].mean()))

    input_data = pd.DataFrame({
        &#39;MedInc&#39;: [MedInc],
        &#39;HouseAge&#39;: [HouseAge],
        &#39;AveRooms&#39;: [AveRooms],
        &#39;AveBedrms&#39;: [AveBedrms],
        &#39;Population&#39;: [Population],
        &#39;AveOccup&#39;: [AveOccup],
        &#39;Latitude&#39;: [Latitude],
        &#39;Longitude&#39;: [Longitude]
    })

    st.write(&quot;Input Features&quot;)
    st.write(input_data)

    if st.button(&quot;Predict&quot;):
        prediction = model.predict(input_data)
        st.write(f&quot;Predicted House Price: ${prediction[0]*100000:.2f}&quot;)

if __name__ == &quot;__main__&quot;:
    main()</code></pre>
<h2 id="세션-관리-session_state"><a href="https://docs.streamlit.io/develop/api-reference/caching-and-state/st.session_state">세션 관리 session_state</a></h2>
<ul>
<li>사용자 입력이나 데이터가 새로고침 후에도 유지되도록 세션 관리</li>
</ul>
<pre><code class="language-python">def load_data():
    california = fetch_california_housing()
    X = pd.DataFrame(california.data, columns=california.feature_names)
    y = pd.Series(california.target, name=&#39;target&#39;)
    return X, y

@st.cache_resource
def train_model(X, y):
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
    model = RandomForestRegressor(n_estimators=100, random_state=42)
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    return model, mse

def main():
    # 세션 초기화
    if &#39;page_refresh_count&#39; not in st.session_state:
        st.session_state.page_refresh_count = 0
    if &#39;predict_attempt_count&#39; not in st.session_state:
        st.session_state.predict_attempt_count = 0

    st.session_state.page_refresh_count += 1

    st.title(&quot;California Housing Price&quot;)


    X, y = load_data()

    model, mse = train_model(X, y)
    st.write(f&quot;Train MSE: {mse:.2f}&quot;)

    st.header(&quot;Input Features&quot;)
    MedInc = st.number_input(&quot;MedInc&quot;, float(X[&#39;MedInc&#39;].min()), float(X[&#39;MedInc&#39;].max()), float(X[&#39;MedInc&#39;].mean()))
    HouseAge = st.number_input(&quot;HouseAge&quot;, float(X[&#39;HouseAge&#39;].min()), float(X[&#39;HouseAge&#39;].max()), float(X[&#39;HouseAge&#39;].mean()))
    AveRooms = st.number_input(&quot;AveRooms&quot;, float(X[&#39;AveRooms&#39;].min()), float(X[&#39;AveRooms&#39;].max()), float(X[&#39;AveRooms&#39;].mean()))
    AveBedrms = st.number_input(&quot;AveBedrms&quot;, float(X[&#39;AveBedrms&#39;].min()), float(X[&#39;AveBedrms&#39;].max()), float(X[&#39;AveBedrms&#39;].mean()))
    Population = st.number_input(&quot;Population&quot;, float(X[&#39;Population&#39;].min()), float(X[&#39;Population&#39;].max()), float(X[&#39;Population&#39;].mean()))
    AveOccup = st.number_input(&quot;AveOccup&quot;, float(X[&#39;AveOccup&#39;].min()), float(X[&#39;AveOccup&#39;].max()), float(X[&#39;AveOccup&#39;].mean()))
    Latitude = st.number_input(&quot;Latitude&quot;, float(X[&#39;Latitude&#39;].min()), float(X[&#39;Latitude&#39;].max()), float(X[&#39;Latitude&#39;].mean()))
    Longitude = st.number_input(&quot;Longitude&quot;, float(X[&#39;Longitude&#39;].min()), float(X[&#39;Longitude&#39;].max()), float(X[&#39;Longitude&#39;].mean()))

    input_data = pd.DataFrame({
        &#39;MedInc&#39;: [MedInc],
        &#39;HouseAge&#39;: [HouseAge],
        &#39;AveRooms&#39;: [AveRooms],
        &#39;AveBedrms&#39;: [AveBedrms],
        &#39;Population&#39;: [Population],
        &#39;AveOccup&#39;: [AveOccup],
        &#39;Latitude&#39;: [Latitude],
        &#39;Longitude&#39;: [Longitude]
    })

    st.write(&quot;Input Features&quot;)
    st.write(input_data)

    if st.button(&quot;Predict&quot;):
        st.session_state.predict_attempt_count += 1
        prediction = model.predict(input_data)
        st.write(f&quot;Predicted House Price: ${prediction[0]*100000:.2f}&quot;)
        st.write(f&quot;Predict Attempt Count: {st.session_state.predict_attempt_count}&quot;)

    st.write(f&quot;Page Refresh Count: {st.session_state.page_refresh_count}&quot;)

if __name__ == &quot;__main__&quot;:
    main()</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] PEGASUS: Pre-training with Extracted Gap-sentences for Abstractive Summarization (2020)]]></title>
            <link>https://velog.io/@dutch-tulip/pegasus</link>
            <guid>https://velog.io/@dutch-tulip/pegasus</guid>
            <pubDate>Tue, 28 May 2024 09:28:31 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/pdf/1912.08777">논문 링크</a></p>
<p>From ICML, 2020</p>
<h1 id="1-introduction">1. Introduction</h1>
<ul>
<li>Text summarization은 입력 문서에서 정확하고 간결한 요약을 만드는 것을 목표로 하며, 추출 요약과 생성 요약으로 나뉜다.<ul>
<li>생성 요약 분야에서는 RNN기반의 seq2seq 아키텍처가 주를 이뤘으며, 최근 Transformer가 등장했다.</li>
<li>더 최근에는, 넓은 분야와 고품질, 긴 길이, 많은 양의 문서, 다양한 도메인의 데이터셋을 지도학습으로 학습시켜 좋은 성능을 이끌어내는 연구가 늘어나고 있다.</li>
<li>그러나 이런 광범위한 설정의 모델들을 체계적으로 평가하는 작업은 거의 없었다.</li>
</ul>
</li>
<li>본 연구(PEGASUS)는 생성 요약에 대한 pre-training 기법을 연구하고, 12가지 데이터셋에 대해 평가한다.<ul>
<li>PEGASUS는 문서에서 특정 문장 전체를 마스킹한 후 해당 문장(gap-sentences)들을 모델이 생성하게 하는 것이 요약 task에 효과적임을 발견함. → Gap-Sentences Generation (<strong>GSG</strong>)</li>
<li><strong>P</strong>re-training with <strong>E</strong>xtracted <strong>G</strong>ap-sentences for <strong>A</strong>bstractive <strong>SU</strong>mmarization <strong>S</strong>equence-to-sequence models → <strong>PEGASUS</strong></li>
</ul>
</li>
<li>12개 데이터셋에서 모두 SOTA와 비슷하거나 능가하는 성능을 보였다.<ul>
<li>큰 규모의 데이터셋은 구하기 힘들고, 실험 결과와 실생활에서의 결과가 다른 경우가 많다.<ul>
<li>그래서 적은 양의 데이터로도 쉽게 fine-tuning이 되는지 실험했다.</li>
<li>6개의 데이터셋에서는 1000개의 데이터셋만으로도 SOTA를 달성했다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="2-related-work">2. Related work</h1>
<ul>
<li>생략(MASS, UniLM, T5, BART)</li>
<li>PEGASUS는 위 모델들과 다르게 문장을 통으로 마스킹하며, 마스킹할 대상을 랜덤으로 고르지 않고 중요한 문장을 골랐다는 내용.</li>
<li>PEGASUS의 output은 문서 전체가 아닌 masked sentences만.</li>
</ul>
<h1 id="3-pre-training-objectives">3. Pre-training Objectives</h1>
<h2 id="31-gap-sentences-generation-gsg">3.1 Gap Sentences Generation (GSG)</h2>
<ul>
<li><p>우리는 Pre-training objective가 downstream task와 닮을수록 빠르고 좋은 fine-tuning 성능을 보인다고 가정한다.</p>
</li>
<li><p>GSG 학습은 다음과 같이 진행된다.</p>
<ul>
<li>문서에서 마스킹할 전체 문장을 선택하고,</li>
<li>선택한 문장을 concatenate하여 pseudo-summary를 만들고,</li>
<li>gap sentence 위치에 [MASK1]을 치환한다.</li>
</ul>
</li>
<li><p>Gap Sentences 고르는 방식</p>
<ul>
<li><p>Random : 랜덤으로 m문장 선택</p>
</li>
<li><p>Lead : 첫번째 m문장 선택</p>
</li>
<li><p>Principal : ROUGE1-F1 점수가 가장 높은 m개의 문장 선택</p>
<ul>
<li><p>Ind (Independently): 각 문장을 독립적으로 점수 매김</p>
</li>
<li><p>Seq (Sequentially): 문장을 순서대로 평가하여 점수 매김</p>
</li>
<li><p>Uniq (Unique): n-gram을 세트로 간주하여 점수를 매김 (동일한 n-gram 중복 count X)</p>
</li>
<li><p>Orig (Original): 동일한 n-gram 중복 count 하여 점수 매김</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/f9e45622-7a06-4976-a448-ecd47d106758/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/cf3679a8-11ce-4e36-b0c4-13dcf0ff6f7f/image.gif" alt=""></p>
<h2 id="32-masked-language-model-mlm">3.2 Masked Language Model (MLM)</h2>
<ul>
<li><p>BERT와 같이, 15%의 토큰을 input으로 사용하고, 그 중 80%는 [MASK2] 토큰으로, 10%는 random, 10%는 unchanged
<img src="https://velog.velcdn.com/images/dutch-tulip/post/8bc80e0c-f87e-41e9-bebf-4fd130b48493/image.png" alt=""></p>
</li>
<li><p>Fig. 1 은 GSG와 MLM이 둘다 적용된 예시를 보여준다.</p>
<ul>
<li>그러나 MLM이 downstream tasks에서는 효과가 없었기 때문에 final model에는 포함하지 않았다.</li>
</ul>
</li>
</ul>
<h1 id="4-pre-training-corpus">4. Pre-training Corpus</h1>
<ul>
<li>C4 (Colossal and Cleaned version of Common Crawl)<ul>
<li>750GB의 웹 크롤링 데이터</li>
</ul>
</li>
<li>HugeNews<ul>
<li>1.5B개의 기사 (3.8TB)</li>
<li>only main article text</li>
</ul>
</li>
</ul>
<h1 id="5-downstream-tasksdatasets">5. Downstream Tasks/Datasets</h1>
<ul>
<li>XSum</li>
<li>CNN/Dailymail</li>
<li>NEWSROOM</li>
<li>Multi-News</li>
<li>Gigaword</li>
<li>arXiv,PubMed</li>
<li>BIGPATENT</li>
<li>WikiHow</li>
<li>Reddit TIFU</li>
<li>AESLC</li>
<li>BillSum</li>
</ul>
<h1 id="6-experiments">6. Experiments</h1>
<ul>
<li>PEGASUS_base<ul>
<li>인코더&amp;디코더 Layer 수(L): 12</li>
<li>Hidden Size(H): 768</li>
<li>Feed-Forward Layer Size(F): 3072</li>
<li>Self-attention Heads 수(A): 12</li>
</ul>
</li>
<li>PEGASUS_large<ul>
<li>인코더&amp;디코더 Layer 수(L): 16</li>
<li>Hidden Size(H): 1024</li>
<li>Feed-Forward Layer Size(F): 4096</li>
<li>Self-attention Heads 수(A): 16</li>
</ul>
</li>
<li>Positional Encoding (Transformer의 그것과 같음)</li>
<li>Optimizer: Adafactor (pre-training과 fine-tuning 모두)</li>
<li>Square root learning rate decay</li>
<li>Dropout rate: 0.1</li>
<li>##Pre-train되지 않은 PEGASUS_base를 Transformer_base와 동일하게 부른다.##</li>
</ul>
<h2 id="61-ablations-on-pegasus_base">6.1 Ablations on PEGASUS_base</h2>
<h3 id="611-pre-training-corpus">6.1.1 Pre-training Corpus</h3>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/29adadbc-9c37-466f-9e04-93ff65968347/image.png" alt=""></p>
<ul>
<li>Fig. 3 : C4를 1.00으로 기준으로 하여 각 데이터셋에 대해 HugeNews의 성능을 일반화한 결과<ul>
<li>HugeNews는 news 데이터셋에서 더 높은 성능, C4는 news가 아닌 informal 데이터셋에서 더 높은 성능</li>
<li>→ pre-train 모델은 domain이 aligned 되어 있을 때 transfer가 더 잘 수행된다.</li>
</ul>
</li>
</ul>
<h3 id="612-effect-of-pre-training-objectives">6.1.2 Effect of Pre-training Objectives</h3>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/e4be3d2b-a6ec-410f-8502-9f8a4f90f189/image.png" alt=""></p>
<ul>
<li>30%의 Gap sentences를 고르는데 사용되는 GSG의 6가지 기법(Lead, Random, Ind-Orig, Ind-Uniq, Seq-Orig, Seq-Uniq)의 성능을 비교했다.<ul>
<li>Fig. 4(a)에 나타난 것처럼, <strong>Ind-Orig</strong> 가 가장 좋은 성능을 보인다.</li>
<li>GSR(Gap Sentence Ratio)는 0.5 이하일 때 가장 높은 성능</li>
<li>MLM 사용 시 초기 pre-training checkpoint(100k-200k steps)에서는 성능 이득을 보이지만, 500k 이후부터는 이득을 억제한다.<ul>
<li>따라서 MLM 사용 x</li>
</ul>
</li>
<li>→ PEGASUS_large는 GSG 기법은 Ind-Orig, GSR은 30%, MLM 적용 X</li>
</ul>
</li>
</ul>
<h3 id="61-effect-of-vocabulary">6.1. Effect of Vocabulary</h3>
<ul>
<li>Byte-pair-encoding algorithm(<strong>BPE</strong>)과 SentencePiece Unigram algorithm(<strong>Unigram</strong>)의 두 tokenizer에 대해 성능을 비교함<ul>
<li>비교 조건: PEGASUS_base 모델에 C4로 500k step으로 pre-train, 15% GSR + Ind-Orig</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/562d51f8-c41a-498f-bc41-a3791f8933a8/image.png" alt=""></p>
<ul>
<li>News 데이터셋에서는 BPE와 Unigram 성능이 유사, Non-news에서는 Unigram이 더 좋은 성능 보임<ul>
<li>WikiHow는 Unigram 128k, Reddit TIFU는 64k일 때 가장 좋은 성능</li>
</ul>
</li>
<li>→ PEGASUS_large에는 Unigram 96k 선택</li>
</ul>
<h2 id="62-larger-model-results">6.2 Larger Model Results</h2>
<ul>
<li>Abstractive dataset 뿐만 아니라 Extractive dataset을 타겟으로 한 성능 향상도 중요하므로, 20%의 선택된 문장은 [MASK1]으로 치환하던 것에서 unchanged로 방식을 변경했다.<ul>
<li>GSR의 20%는 unchanged, 80%는 GSG</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/ee865d0b-e1af-42ae-9542-ee5ac27cc782/image.png" alt="">
<img src="https://velog.velcdn.com/images/dutch-tulip/post/182af205-ccd2-470f-bb58-d4c892b94ad5/image.png" alt=""></p>
<ul>
<li>PEGASUS_base는 많은 데이터셋에서 SOTA를 넘어섰으며, PEGASUS_large는 모든 데이터셋에서 SOTA를 넘어섰다.</li>
<li>Transformer_base에서 PEGASUS_large로 발전할 때 소규모 데이터셋에서의 성능 향상은 특히 큰 편이다.<ul>
<li>ROUGE2-F1 score가 AESLC은 거의 3배, Reddit TIFU는 5배가 됨.</li>
<li>→ 소규모 텍스트 요약이 pre-training에 가장 이득을 본다.</li>
</ul>
</li>
</ul>
<h2 id="63-zero-and-low-resource-summarization">6.3 Zero and Low-Resource Summarization</h2>
<ul>
<li>적은 양의 데이터셋에 대한 fine-tuning 성능을 확인하기 위해 0, 1k, 10k, 100k 개에 대한 Rouge1,2,L-F1 score를 측정한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/0264f7b6-732b-4e02-9de2-95ac1d168542/image.png" alt=""></p>
<ul>
<li>12개 중 8개의 데이터셋에서, 단 100개의 example만으로도 PEGASUS_large는 Transformer_base의 성능을 앞질렀다.</li>
<li>12개 중 6개의 데이터셋에서, 1000개의 example로 기존 SOTA 성능을 추월했다.</li>
</ul>
<h2 id="64-qualitative-observations-and-human-evaluation">6.4 Qualitative Observations and Human Evaluation</h2>
<ul>
<li>PEGASUS가 생성한 요약문이 Human evaluation과 얼마나 차이나는지 비교한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/04d27f83-6433-4f1a-bab3-c10dff48fddb/image.png" alt=""></p>
<ul>
<li>이를 위해 Amazon Mechanical Turk에 돈을 주고 요약문(model summaries, reference summaries)에 대한 evaluation을 의뢰했다.<ul>
<li>3가지 데이터셋에 대한 평가이며, 1~5점으로 이루어져있다.</li>
</ul>
</li>
<li>Table 3를 보면, Reddit TIFU를 제외한 데이터셋에서는 PEGASUS 모델이 만든 summary가 인간이 만든 summary보다 나쁘지 않은 편임을 알 수 있다.</li>
</ul>
<h2 id="65-test-set-overlap-with-pre-training-corpus">6.5 Test-set Overlap with Pre-training Corpus</h2>
<ul>
<li>Pre-training에 사용된 corpus 데이터와, downstream 데이터셋들 간에 데이터 중복 정도를 측정하고, pre-trained 모델이 중복 정보에 대한 기억력을 활용할 수 있는지 연구했다.</li>
<li>(생략)</li>
<li>XSum에서만 15%~20% 사이의 상당한 중복이 있었고, 이러한 example을 필터링해도 ROUGE score가 1%이상 변하지 않음</li>
<li>모델은 중복 정보에 대한 기억 사용은 없는 것으로 나타났다.</li>
</ul>
<h2 id="66-additional-pegasus_large-improvements">6.6 Additional PEGASUS_large Improvements</h2>
<ul>
<li>(생략)</li>
</ul>
<h1 id="7-conclusion">7. Conclusion</h1>
<ul>
<li>PEGASUS는 abstractive summarization을 위해 최적화된 pre-training objective인 Gap-Sentences Generation을 제안했다.</li>
<li>GSG를 위한 여러 방안을 제안했고, 최적의 방식을 선택했다.</li>
<li>이를 통해 12개의 데이터셋에서 SOTA를 달성했다.</li>
<li>또한 unseen data에도 빠르게 적응하여, 1000개의 example만으로도 강력한 성능을 보임을 확인했다.</li>
<li>마지막으로 human evaluation을 통해 여러 데이터셋에서 인간 성능에 준하는 성능을 달성했음을 보였다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] ROUGE: A Package for Automatic Evaluation of Summaries (2004)]]></title>
            <link>https://velog.io/@dutch-tulip/rouge</link>
            <guid>https://velog.io/@dutch-tulip/rouge</guid>
            <pubDate>Sun, 14 Jan 2024 03:26:44 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/pdf/1910.13461.pdf">논문 링크</a></p>
<p>From ACL, 2004</p>
<ul>
<li><p><strong>사전 지식</strong></p>
<h2 id="rouge에서-recall과-precision">ROUGE에서 Recall과 Precision</h2>
<p>  y : 모델이 만든 요약문</p>
<p>  y’ : 사람이 만든 정답 요약</p>
<h3 id="recall">Recall</h3>
<ul>
<li><p>정답 요약문의 단어 중 모델이 생성한 요약문에서 나타난 단어의 개수의 비율</p>
<p>$$
ROUGE_{recall}= \frac{Number:Of:Overlapped:Words}{Total:Words:In:Reference:Summary} =\frac{y∩{y}&#39;}{y}
$$</p>
<h3 id="precision">Precision</h3>
</li>
<li><p>모델이 생성한 요약문 중 정답 요약문과 얼마나 많은 단어가 겹치는지의 비율</p>
<p>$$
ROUGE_{precision}= \frac{Number:Of:Overlapped:Words}{Total:Words:In:System:Summary} =\frac{y∩{y}&#39;}{{y}&#39;}
$$</p>
</li>
</ul>
</li>
</ul>
<h1 id="0-abstract">0. Abstract</h1>
<ul>
<li>ROUGE = <strong>R</strong>ecall-<strong>O</strong>riented <strong>U</strong>nderstudy for <strong>G</strong>isting <strong>E</strong>valuation</li>
<li>모델이 생성한 요약(후보 요약)과 인간이 만든 이상적인 요약(참조 요약)을 비교하는 자동화된 방법을 포함한다.<ul>
<li>(추출 요약, 생성 요약할 때 생성 요약 아님)</li>
<li>(모델의 출력물로 나온 요약문이라는 뜻)</li>
</ul>
</li>
<li>생성된 요약과 라벨 요약 사이에 중복되는 단위(n-gram, 단어 시퀀스, 단어 쌍 등)의 수를 세는 것</li>
<li>그래서 4가지 다른 지표인 ROUGE-N, ROUGE-L, ROUGE-W, ROUGE-S를 소개한다.</li>
</ul>
<h1 id="1-introduction">1. Introduction</h1>
<ul>
<li>요약문에 대한 evaluation을 수행하는 것은 ‘일관성, 간결성, 문법 정확성, 가독성, 내용’ 등 여러 지표를 평가해야 한다.</li>
<li>간단한 지표에 대한 수동 평가조차도 수 천 시간 이상의 human resource가 필요하므로 자주 수행되기 어렵다.<ul>
<li>따라서 자동화된 요약 평가 방법이 필요하다.</li>
</ul>
</li>
<li>코사인 유사도, n-gram, 최대 공통 부분열 등을 기반으로 한 평가 방법이 제시되었지만, 이러한 방식이 인간 판단과 어떤 상관 관계가 있는지는 보여주지 않았다.</li>
<li>우리는 2장부터 5장까지 n-gram과 최대 공통 부분열 등을 통한 여러가지 ROUGE 지표들을 제안하며, 6장에서는 이러한 지표들이 인간 판단과 어떤 상관 관계가 있는지를 보여준다.</li>
</ul>
<h1 id="2-rouge-n-n-gram-co-occurrence-statistics">2. ROUGE-N: N-gram Co-Occurrence Statistics</h1>
<ul>
<li>ROUGE-N은 후보 요약과 참조 요약 사이의 n-gram Recall이며, 아래와 같이 계산된다.</li>
</ul>
<p>$$
ROUGE-N=\frac{∑<em>{S∈{ReferenceSummaries}}∑</em>{gram_n∈S}Count_{match}(gram_n)}{∑<em>{S∈{ReferenceSummaries}}∑</em>{gram_n∈S}Count(gram_n)}
$$</p>
<ul>
<li>n은 n-gram의 길이를 나타내며, Count_match(gram_n)은 후보 요약과 참조 요약 집합에서 겹치는 n-gram의 최대 수이다.</li>
<li>BLEU는 기계 번역의 자동 평가에서 사용되는 지표로, precision 기반의 척도이다.</li>
<li>분모에 있는 n-gram의 수는 더 많은 참조 요약을 사용함에 따라 증가한다.<ul>
<li>여러 좋은 요약이 존재할 수 있으므로 직관적이고 합리적이다.</li>
</ul>
</li>
<li>분자는 모든 참조 요약에 걸쳐 합산된다.<ul>
<li>여러 참조 요약에서 일치하는 n-gram에는 더 많은 가중치가 부여된다.</li>
</ul>
</li>
</ul>
<h2 id="21-multiple-references">2.1 Multiple References</h2>
<ul>
<li>한번에 여러 개의 참조 요약이 사용될 때, 후보 요약 s와 참조 집합의 각 참조 요약 r_i 간의 쌍 별로 ROUGE-N을 구한 뒤 최종적으로는 최대값을 사용한다:</li>
</ul>
<p>$$
 ROUGE-N_{multi}=argmax_iROUGE-N(r_i,s)
$$</p>
<ul>
<li>위 방식의 구현을 위해서는 잭나이프 절차를 사용한다.<ul>
<li>M개의 참조 요약이 주어지면, M-1개의 참조 요약 집합에 대해 ROUGE-N 점수를 계산한다.</li>
<li>이를 모든 M개의 참조 요약마다 반복하여 총 M개의 ROUGE-N 점수를 얻는다.</li>
<li>M개의 점수를 평균하여 최종 ROUGE-N 점수를 얻는다.</li>
</ul>
</li>
</ul>
<h1 id="3-rouge-l-longest-common-subsequence">3. ROUGE-L: Longest Common Subsequence</h1>
<ul>
<li>Longest Common Subsequence(LCS): 최장 공통 부분열, 두 문자열에서 최대 길이를 가진 공통 부분 수열</li>
</ul>
<h2 id="31-sentence-level-lcs">3.1 Sentence-Level LCS</h2>
<p>→ 요약 문장 하나하나를 각각의 단위로 보고 ROUGE 점수를 계산</p>
<ul>
<li>요약 문장을 단어의 연속으로 간주한다.<ul>
<li>직관적으로, 두 요약문의 LCS가 길수록 두 요약은 더 유사하다.</li>
</ul>
</li>
<li>참조 요약 X (길이 m)와 후보 요약 Y (길이 n) 사이의 유사성을 계산하기 위해 LCS 기반 F1 score를 사용하는 것을 제안한다.</li>
</ul>
<p>$$
R_{{lcs}} = \frac{{LCS}(X,Y)}{m} \P_{{lcs}} = \frac{{LCS}(X,Y)}{n} \F_{{lcs}} = \frac{(1+\beta^2)R_{{lcs}} P_{{lcs}}}{R_{{lcs}} + \beta^2 P_{{lcs}}}
$$</p>
<ul>
<li>LCS(X,Y) : X,Y의 LCS 길이</li>
<li>ß : Precision / Recall , F1-score는 Recall과 Precision에 대해 동일한 민감도로 변함<ul>
<li>ß가 크면 Precision가 더 중요하게 고려되고, ß가 작으면 Recall이 더 중요하게 고려</li>
</ul>
</li>
<li>F_lcs 측정값을 ROUGE-L 지표로 사용<ul>
<li>X = Y 일 경우 1, LCS(X,Y) = 0 일 경우 0</li>
</ul>
</li>
<li>LCS를 사용하는 장점 중 하나는 단순히 연속적인 일치가 아니라 문장 수준의 어순을 n-gram으로 반영하는 시퀀스 단위의 일치를 요구한다는 것이다.</li>
<li>또 다른 장점은 가장 긴 순서대로 common n-gram을 포함한다는 것으로, 미리 정해진 n-gram의 길이가 필요하지 않다는 것이다.</li>
<li>예시) ROUGE-2와의 비교</li>
</ul>
<blockquote>
<p><em>S1. police killed the gunman           →</em> <strong>Reference Summary</strong>
**S2. police kill the gunman              → Candidate Sentence 1
S3. the gunman kill police              → Candidate Sentence 2
S4. the gunman <code>police killed</code>    → Candidate Sentence 3</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/9e5e9599-ed72-46a5-ab1a-c30865e94e73/image.png" alt=""></p>
<ul>
<li>S2와 S3는 같은 ROUGE-2 점수를 갖는다 (하나의 bi-gram(the gunman)만을 가지므로)<ul>
<li>하지만 S2와 S3의 ROUGE-L은 다르다.<ul>
<li>S2=3/4=0.75, S3=2/4=0.5</li>
</ul>
</li>
<li>이는 ROUGE-L이 문장 수준에서 신뢰 가능한 지표임을 보여준다.</li>
</ul>
</li>
<li>하지만 LCS는 하나의 시퀀스 단위만을 센다. 따라서 다른 LCS들은 최종 점수에 반영되지 못한다.<ul>
<li>예를 들어, S4에서는 “the gunman” 또는 “police killed”를 세지만 둘 다는 아니다. 따라서 S3와 S4는 동일한 ROUGE-L 점수를 갖는다.</li>
</ul>
</li>
</ul>
<h2 id="32-summary-level-lcs">3.2 Summary-Level LCS</h2>
<p>→ 전체 요약문장을 하나의 단위로 보고 ROUGE 점수를 계산</p>
<ul>
<li>총 m개의 단어를 포함하는 u개의 문장으로 구성된 참조 요약과, 총 n개의 단어를 포함하는 v개의 문장으로 구성된 후보 요약</li>
</ul>
<p>$$
R_{{lcs}} = \frac{\sum_{i=1}^{u} {LCS}\cup(r_i, C)}{m}  \P_{{lcs}} = \frac{\sum_{i=1}^{u} {LCS}\cup(r_i, C)}{n} \F_{{lcs}} = \frac{(1+\beta^2)R_{{lcs}} P_{{lcs}}}{R_{{lcs}} + \beta^2 P_{{lcs}}}
$$</p>
<ul>
<li>r_i = {w1 w2 w3 w4 w5}이고, C가 c1 = {w1 w2 w6 w7 w8}과 c2 = {w1 w3 w8 w9 w5}로 이루어지면?<ul>
<li>r_i와 c1의 LCS는 “w1 w2”이고 r_i와 c2의 LCS는 “w1 w3 w5”</li>
<li>r_i, (c1+c2)의 LCS는 “w1 w2 w3 w5” → LCS(r_i, C)는 4/5</li>
</ul>
</li>
</ul>
<h2 id="33-rouge-l-vs-normalized-pairwise-lcs">3.3 ROUGE-L vs. Normalized Pairwise LCS</h2>
<ul>
<li>2002년 제안된 Normalized Pairwise LCS와의 차이점</li>
<li>Normalized Pairwise LCS는 각 후보 요약들의 LCS들을 모두 찾아서 LCS의 <strong>최대</strong> 길이를 사용한다. (최대값)</li>
<li>하지만 ROUGE-L은 후보 요약 전체를 결합한 단위에서의 LCS를 찾아서 사용한다. (결합값)</li>
<li>따라서 ROUGE-L은 요약 전체의 맥락을 고려해서 유사성을 평가할 수 있고, Normalized Pairwise LCS는 개별 문장 간의 유사성을 평가할 수 있다.</li>
</ul>
<p>$$
\frac{  \sum_{s_i \in S_1} \max_{s_j \in S_2} {LCS}(s_i, s_j) + \sum_{s_j \in S_2} \max_{s_i \in S_1} {LCS}(s_i, s_j)}{  \sum_{s_i \in S_1} {length}(s_i) + \sum_{s_j \in S_2} {length}(s_j)}
\\frac{ 2* \sum_{s_i \in S_1} \max_{s_j \in S_2} {LCS}(s_i, s_j)}{  m + n}
\R_{{lcs-MEAD}} = \frac{  \sum_{s_i \in S_1} \max_{s_j \in S_2} {LCS}(s_i, s_j)}{  m}
\P_{{lcs-MEAD}} = \frac{  \sum_{s_i \in S_1} \max_{s_j \in S_2} {lcs}(s_i, s_j)}{  n}
$$</p>
<h1 id="4-rouge-w-weighted-longest-common-subsequence">4. ROUGE-W: Weighted Longest Common Subsequence</h1>
<ul>
<li>LCS는 좋은 특성을 갖지만, basic LCS는 서로 다른 공간적 관계를 갖는 시퀀스를 구분하지 못한다:</li>
</ul>
<blockquote>
<p>X:   [A B C D E F G]
Y1: [A B C D H I K]
Y2: [A H B K C I D]</p>
</blockquote>
<ul>
<li>Y1과 Y2는 같은 ROUGE-L 점수를 갖는다.<ul>
<li>하지만 Y1은 연속적인 LCS를 갖는데, Y3보다 더 높은 점수를 가져야 하지 않겠는가?</li>
</ul>
</li>
<li>지금까지 만난 연속적인 일치의 길이를 기억하도록 Dynamic Programming table을 만들 수 있다.<ul>
<li>이를 가중치가 있는 LCS(WLCS)라고 하고, k를 연속적인 길이로 사용한다.</li>
<li>두 문장 X, Y에 대한 WLCS 점수는 아래와 같은 Dynamic Programming 수도 코드로 나타낼 수 있다.</li>
</ul>
</li>
</ul>
<pre><code class="language-jsx">(1) For (i = 0; i &lt;=m; i++)
         c(i,j) = 0 // initialize c-table
         w(i,j) = 0 // initialize w-table
(2) For (i = 1; i &lt;= m; i++)
         For (j = 1; j &lt;= n; j++)
             If xi = yj Then
                 // the length of consecutive matches at
                 // position i-1 and j-1
                 k = w(i-1,j-1)
                 c(i,j) = c(i-1,j-1) + f(k+1) – f(k)
                 // remember the length of consecutive
                 // matches at position i, j
                 w(i,j) = k+1
             Otherwise
                 If c(i-1,j) &gt; c(i,j-1) Then
                     c(i,j) = c(i-1,j)
                     w(i,j) = 0 // no match at i, j
                 Else c(i,j) = c(i,j-1)
                     w(i,j) = 0 // no match at i, j
(3) WLCS(X,Y) = c(m,n)</code></pre>
<ul>
<li>w 테이블 안에 연속적인 일치의 길이를 저장하고, 가중치 함수인 f 함수를 통해 c 테이블 안에 가중치 값(WLCS 점수)을 저장한다.</li>
<li>가중치 함수 f는 연속적인 일치에 더 많은 점수를 부여하도록 설계<ul>
<li>ex) n-gram 시퀀스가 끊길 때마다 페널티 부여하는 함수</li>
</ul>
</li>
<li>WLCS를 기반으로 한 Recall, Precision, F1 score는 아래와 같이 계산된다.<ul>
<li>(f(가중치 함수)의 역함수 사용 이유)<ul>
<li>가중치가 적용되어 있는 LCS 점수를 기존 길이 비율로 정규화하기 위함</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>$$
R_{wlcs} = f^{-1}\left(\frac{WLCS(X,Y)}{f(m)}\right) \P_{wlcs} = f^{-1}\left(\frac{WLCS(X,Y)}{f(n)}\right) \F_{wlcs} = \frac{(1+\beta^2)R_{wlcs} P_{wlcs}}{R_{wlcs} + \beta^2 P_{wlcs}}
$$</p>
<h1 id="5-rouge-s-skip-bigram-co-occurrence-statistics">5. ROUGE-S: Skip-Bigram Co-Occurrence Statistics</h1>
<ul>
<li>Skip-Bigram은 문장 내에 단어 쌍을 간격을 허용하면서 순서대로 나타내는 것이다.</li>
<li>Skip-Bigram Co-Occurrence Statistics은 후보 번역과 참조 번역 사이의 skip-bigram 중복도를 측정한다.</li>
</ul>
<blockquote>
<p><em>S1. police killed the gunman           →</em> <strong>Reference Summary</strong>
**S2. police kill the gunman              → Candidate Sentence 1
S3. the gunman kill police              → Candidate Sentence 2
S4. the gunman <code>police killed</code>    → Candidate Sentence 3</p>
</blockquote>
<ul>
<li>각 문장은 4C2 = 6개의 skip-bigram을 갖는다.<ul>
<li>ex) S1 = (“police killed”, “police the”, “police gunman”, “killed the”, “killed gunman”, “the gunman”)</li>
</ul>
</li>
<li>S2와 S1은 3개가 일치하며, S3는 1개의 일치, S4는 2개가 일치한다.</li>
<li>길이가 m인 문장 X와 길이가 n인 문장 Y가 주어질 때, skip-bigram 기반의 F1-score는 아래와 같이 계산한다.</li>
</ul>
<p>$$
R_{{skip2}} = \frac{{SKIP2}(X,Y)}{C(m,2)} \P_{{skip2}} = \frac{{SKIP2}(X,Y)}{C(n,2)} \F_{{skip2}} = \frac{(1+\beta^2)R_{{skip2}} P_{{skip2}}}{R_{{skip2}} + \beta^2 P_{{skip2}}}
$$</p>
<ul>
<li>SKIP2(X,Y)는 X와 Y 사이의 skip-bigram 일치 수를 의미한다.</li>
<li>S1을 참조 요약으로 할 때, ROUGE-S 점수는<ul>
<li>S2: 0.5, S3: 0.167, S4: 0.333</li>
<li>ROUGE-L 보다 더 직관적이다.</li>
</ul>
</li>
<li>단어 사이의 거리를 두는 skip-bigram의 장점<ul>
<li>연속적인 일치를 요구하지 않으면서도 단어 순서에 민감하다는 것</li>
<li>단어 사이 거리 제한을 두지 않는다면?<ul>
<li>‘the the’나 ‘of in’ 같은 부적절한 일치도 유효하게 계산될 수 있다.</li>
<li>d_skip 파라미터로 스킵 거리 조절</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="51-rouge-su-extension-of-rouge-s">5.1 ROUGE-SU: Extension of ROUGE-S</h2>
<ul>
<li>ROUGE-S의 잠재적인 문제는, 후보 문장이 참조 문장과 일치하는 단어 <strong>쌍</strong>이 없을 경우에는 점수를 주지 않는다는 것이다.</li>
<li>예를 들어, 아래 S5는 ROUGE-S 점수가 0이다:</li>
</ul>
<blockquote>
<p>S5. gunman the killed police</p>
</blockquote>
<ul>
<li>S5는 S1의 정확한 역순이며, 이들 사이에는 skip-bigram 일치가 없다.<ul>
<li>하지만 이들을 구분할 필요가 있다.</li>
</ul>
</li>
<li>따라서 bigram 단위가 아닌 unigram 단위로 세는 ROUGE-SU를 추가했다.</li>
</ul>
<h1 id="6-evaluations-of-rouge">6. Evaluations of ROUGE</h1>
<ul>
<li>인간 요약과의 비교를 위해 DUC 2001, 2002, 2003 데이터를 사용했으며, 이 데이터에는 다음과 같은 인간 판단이 포함되어 있다.<ul>
<li>약 100 단어에 대한 단일 문서 요약</li>
<li>약 10 단어에 대한 매우 짧은 단일 문서 요약</li>
<li>약 10 단어에 대한 다중 문서 요약</li>
</ul>
</li>
<li>ROUGE score와 인간 요약 사이의 상관 관계를 분석하기 위해, 즉 ROUGE가 인간의 판단을 얼마나 잘 반영하는지 보기 위해서<ul>
<li>피어슨 상관계수, 스피어만 상관계수, 켄달 상관계수를 계산했다.<ul>
<li>공간의 한계로 논문에는 피어슨 상관계수 결과만 싣는데, 나머지도 피어슨과 밀접하다.</li>
</ul>
</li>
<li>요약문을 기존 버전(CASE 세트), 어간 추출 버전(STEM 세트), 불용어 제거 버전(STOP 세트)로 나누어 준비해 각각의 영향을 관찰했다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/137325e2-0c84-48a4-87c7-4019320a2ca3/image.png" alt=""></p>
<ul>
<li>표1 은 DUC 2001, 2003의 100단어 단일 문서 요약에 대한 17 종류의 ROUGE 지표와 인간 판단과의 피어슨 상관계수를 나타낸다.<ul>
<li>녹색은 최고값을 나타내며, 통계적으로 유사한 값들은 회색으로 표시되었다.</li>
<li>어간 제거나 불용어 제거가 상관관계에 영향을 미치지 않았으며,</li>
<li>ROUGE-2가 ROUGE-N 변형 중에서는 가장 성능이 좋으며,</li>
<li>ROUGE-L,W,S 모두 잘 수행되며,</li>
<li>다중 참조를 수행하면 성능이 향상되지만 큰 향상은 아니다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/7217eeed-93f0-450c-ae87-7efbbd8ca142/image.png" alt=""></p>
<ul>
<li>표2 는 DUC 2003의 단일 문서의 매우 짧은 요약에 대한 상관관계 분석 결과이다.<ul>
<li>N &gt; 1인 ROUGE-N은 결과가 현저히 떨어진다.</li>
<li>불용어 제거는 일반적으로는 성능을 향상시키지만 ROUGE-1은 아니다.</li>
<li>이 데이터는 샘플이 많기 때문에 다중 참조가 상관관계를 향상시키지 않았다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/62f2ac12-4590-4659-915a-6298146b9390/image.png" alt=""></p>
<ul>
<li>표3 A1,A2,A3은 DUC 2001, 2002, 2003의 100단어 다중 문서 요약에 대한 상관관계 분석 결과이다.<ul>
<li>요약하면, 다중 참조를 사용하고, 불용어를 제거하는 것이 일반적으로 성능을 향상시킨다.</li>
</ul>
</li>
<li>표3 C, D1,D2,E1,E2,F는 나머지 DUC 데이터에 대해 다중 참조를 사용한 것에 대한 상관관계 분석 결과이다.<ul>
<li>불용어 제거가 특히 50단어 이상의 다중 문서 요약에서 성능을 향상시킨다는 것 보임.<ul>
<li>200단어, 400단어 요약에서는 더 나은 상관 관계(&gt;0.70)</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="7-conclusions">7. Conclusions</h1>
<ul>
<li>ROUGE 지표를 제안했으며, 3개년의 DUC 데이터를 사용해 ROUGE에 대한 평가를 수행했다.</li>
<li>우리는 이러한 사실들을 알아냈다.<ul>
<li>(1) ROUGE-2, ROUGE-L, ROUGE-W, ROUGE-S가 단일 문서 요약 작업에서 잘 동작하며,</li>
<li>(2) ROUGE-1, ROUGE-L, ROUGE-W, ROUGE-SU4, ROUGE-SU9가 매우 짧은 요약(또는 헤드라인 같은 요약)을 평가하는 데 효과적이고,</li>
<li>(3) 다중 문서 요약 작업에서 높은 상관 관계를 달성하기는 어려웠지만, 불용어를 제거하면, ROUGE-1, ROUGE-2, ROUGE-S4, ROUGE-S9, ROUGE-SU4, ROUGE-SU9가 효과적으로 동작했다.</li>
<li>(4) 불용어를 제외하는 것은 일반적으로 상관관계를 향상시켰으며,</li>
<li>(5) 다중 참조를 사용함으로써 인간 판단과의 상관관계가 증가했다.</li>
</ul>
</li>
<li>요약하면, ROUGE는 요약의 자동 평가에 효과적으로 사용될 수 있음을 보여준다.</li>
<li>그러나 ROUGE가 단일 문서 요약 작업에서 효과적인 것처럼 다중 문서 요약 작업에서도 인간의 판단과 높은 상관 관계를 달성하도록 하는 것은 향후 연구로 진행되어야 하는 주제다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Improving Language Understanding
by Generative Pre-Training (GPT-1) (2018)]]></title>
            <link>https://velog.io/@dutch-tulip/gpt-1</link>
            <guid>https://velog.io/@dutch-tulip/gpt-1</guid>
            <pubDate>Thu, 04 Jan 2024 06:57:36 GMT</pubDate>
            <description><![CDATA[<p><a href="https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf">논문 링크</a></p>
<p>From OpenAI Research, June 2018</p>
<h1 id="0-abstract">0. Abstract</h1>
<ul>
<li>NLU(자연어 이해: NLP의 하위 집합)는 Textual Entailment(의미적 포함관계 판단), QA, 문서 분류, 의미 유사성 평가 등 광범위한 작업들로 구성된다.</li>
<li>이러한 작업들에서 unlabelled된 데이터는 풍부하지만 labelled된 데이터는 부족하므로, Discriminative(분류) task에 특화된 모델은 적절한 성능을 보여주기 힘들다.</li>
<li>따라서 우리는 unlabelled된 방대한 텍스트에 대해 <strong>generative하게 pre-train</strong>한 다음, 각 다운 스트림 작업에 대해 <strong>discriminative 하게 fine-tuning 함</strong>으로써 각 작업들에 대해 큰 성능 이득을 볼 수 있음을 보여준다.</li>
<li>(각 작업마다로의) 모델 변경을 최소화하기 위해 fine-tuning 중에 Task-aware input transformation을 사용<ul>
<li>각 작업에 맞게 input structure를 변환하는 방식</li>
</ul>
</li>
<li>NLU의 여러 벤치마크에서 우리가 제안하는 방식의 효율성을 검증한다.<ul>
<li>일반 GPT모델(특정 작업에 fine-tuned되지 않은)이 다른 fine-tuned된 discriminative 모델들보다 더 성능이 좋다.</li>
<li>실험한 12개 task 중 9개 작업에서 SOTA 달성</li>
</ul>
</li>
</ul>
<h1 id="1-introduction">1. Introduction</h1>
<ul>
<li><p>Raw Text로부터 효과적으로 학습하는 것은 지도 학습에 대한 의존도를 낮추기 위해 매우 중요하다.</p>
</li>
<li><p>많은 딥러닝 방법에서는 labelled 데이터가 필요하므로, 데이터가 부족한 분야에서의 적용이 제한된다.</p>
<ul>
<li>따라서 labelled되지 않은 언어 데이터를 사용할 수 있는 모델은 좋은 대안이 된다.<ul>
<li>라벨을 다는데 필요한 시간, 비용이 들지 않으므로</li>
</ul>
</li>
</ul>
</li>
<li><p>또한, 지도 학습이 가능한 많은 경우들에도 비지도 학습으로 좋은 표현(representations)을 학습할 경우 많은 성능 향상을 이룰 수 있다.</p>
<ul>
<li>가장 강력한 증거) NLP 작업들의 성능을 높이기 위해서 1) 비지도 데이터셋을 사전학습한 뒤, 2) 구체적인 지도학습 NLP 작업에 다시 적용되는 방식으로 사용됨</li>
</ul>
</li>
<li><p>그러나 라벨이 없는 데이터에서 단어 수준 이상의 정보를 활용하는 것은 두 가지 이유로 어려움</p>
<ul>
<li>1) 전이 학습에 유용한 최적화(optimization) 목적이 무엇인지 불분명하다.<ul>
<li>최근 연구들은 다양한 최적화 목적들(언어 모델링, 기계 번역, 담화 일관성(discourse coherence) 등)에서 서로의 모델이 각 작업에서 다른 모델보다 성능이 뛰어나다.</li>
</ul>
</li>
<li>2) 이러한 학습된 표현을 target task로 전이(transfer)하는 가장 효과적인 방법이 무엇인가에 대한 합의(consensus)가 없다.</li>
</ul>
</li>
<li><p>이런 불확실성은 자연어처리를 위한 준지도(semi-supervised) 접근법을 개발하는 것을 어렵게 한다.</p>
</li>
<li><p>이 논문은 Language Understanding tasks에 대해, 비지도 학습 방식과 fine-tuning 지도학습 방식을 결합한 준지도 학습 방식을 연구한다.</p>
<ul>
<li>많은 작업들에 대해서 모델의 큰 수정없이 전이학습이 가능한 universal한 representation을 만드는 것이 목표이다.</li>
</ul>
</li>
<li><p>제안하는 모델은 2단계의 학습 절차를 사용한다.</p>
<ul>
<li>1) 네트워크의 초기 파라미터를 학습하기 위해 <strong>unlabelled data</strong>를 language modeling optimization을 사용하여 학습</li>
<li>2) 이후, 학습된 파라미터를 supervised한 대상 작업에 적용한다.</li>
</ul>
</li>
<li><p>모델의 아키텍처는 Transformer를 기반으로 한다.</p>
<ul>
<li>Transformer는 장기 종속성을 처리하기 위한 구조를 갖고 있으며, 다양한 작업에서 전이학습을 통해 좋은 성능을 달성한다.</li>
<li>모델의 구조를 최소한으로 변경하면서 효과적으로 fine-tuning할 수 있다.</li>
</ul>
</li>
<li><p>모델 평가는 4가지 종류의 Language Understanding tasks에 대해 이뤄진다.</p>
<ul>
<li>NLI(Natural Language Inference, 자연어 추론), QA(Question Answering, 질의응답), Sementic Similarity(의미 유사성), Text Classification(텍스트 분류)</li>
</ul>
</li>
<li><p>12개 task 중 9개 task에서 SOTA 달성</p>
</li>
<li><p>또한, 4가지 서로 다른 setting으로 pre-trained된 모델의 zero-shot 동작을 분석해, 다운스트림 작업에 유용한 언어적 지식을 획득한다는 것을 확인했다.</p>
</li>
</ul>
<h1 id="2-related-work">2. Related Work</h1>
<ol>
<li><strong>Semi-supervised learning for NLP (NLP에서의 준지도 학습)</strong><ul>
<li>자연어 처리에서의 준지도 학습은 초기 방식과 최근 접근 방식이 다르다.</li>
<li>초기에는 라벨이 없는 데이터로부터 단어 수준이나 구문(phrase) 수준의 통계를 계산하고, 이를 지도학습 모델의 feature로 사용하는 수준에 그친다.</li>
<li>최근에는, 라벨이 없는 코퍼스에서 훈련된 워드 임베딩을 사용하여 다양한 task의 성능을 향상시키는데 중점을 둔다.</li>
<li>그러나 이러한 접근법은 주로 단어 수준의 정보를 전달하는데, 우리는 더 높은 수준(구문, 문장 이상)의 의미를 포착하고자 한다.</li>
<li>최근에는 라벨이 없는 데이터에서 단어 수준 이상의 의미를 학습하는 방법을 연구한다.</li>
</ul>
</li>
<li><strong>Unsupervised pre-training (비지도 사전학습)</strong><ul>
<li>비지도 사전학습은 준지도 학습의 특별한 형태이다.</li>
<li>초기에는 이미지 분류 및 회귀 작업에서 연구되었고, 이어진 연구에서는 사전 훈련이 정규화처럼 작용해서 Deep Neural Network에서 더 나은 일반화가 가능하다는 사실이 증명됐다.<ul>
<li>최근에는 다양한 작업에서 DNN을 훈련하는데 사용되었다.</li>
</ul>
</li>
<li>GPT와 가장 가까운 연구: 언어 모델링 목표를 통해 사전훈련한 뒤, supervised하게 target task에 fine tuning 하는 것</li>
<li>사전 훈련을 하는 것이 언어 정보를 포착하는 데 도움이 되지만, LSTM을 사용할 경우 예측 능력이 short range로 제한된다.<ul>
<li>Transformer를 사용할 경우 더 긴 range의 언어 구조를 포착할 수 있음을 실험으로 보여준다.</li>
</ul>
</li>
<li>다른 접근법들은 사전 훈련된 모델의 representation을 각 작업에서의 보조 feature로 사용하여 supervised 모델을 학습시킨다.<ul>
<li>하지만 이는 각각의 대상 작업마다 많은 양의 파라미터를 필요로 한다.</li>
<li>반면, GPT는 전이학습 과정에서 모델 아키텍처에 최소한의 변경만이 필요하다.</li>
</ul>
</li>
</ul>
</li>
<li><strong>Auxiliary training objectives (보조 학습 목표)</strong><ul>
<li>보조 비지도 학습 목표를 추가하는 것은 준지도 학습의 대안적인 형태이다.<ul>
<li>(라벨이 없는 데이터에 추가적인 학습 목표를 설정해서 모델 성능을 향상시키는 방법)</li>
</ul>
</li>
<li>초기 연구에서는 다양한 NLP 작업들(POS 태깅 등)을 보조 작업으로 사용하여 라벨링 성능을 향상시켰다.</li>
<li>GPT도 보조 학습 목표를 사용하지만, 비지도 사전훈련이 이미 target task에 대한 여러 언어적인 측면을 미리 학습한다는 것을 실험을 통해 보여준다.<ul>
<li>(GPT의 접근 방식은 기존과 달리 비지도 사전훈련을 통해 이미 다양한 언어 지식을 얻으며, 이는 곧 성능 향상으로 이어짐)</li>
</ul>
</li>
</ul>
</li>
</ol>
<h1 id="3-framework">3. Framework</h1>
<ul>
<li>훈련은 2단계로 구성됨<ul>
<li>1) 대규모 corpus로 대용량 언어 모델을 학습하는 단계</li>
<li>2) labelled 데이터를 통해 discriminative 작업에 모델을 fine-tuning하는 단계</li>
</ul>
</li>
</ul>
<h2 id="31-unsupervised-pre-training">3.1 Unsupervised pre-training</h2>
<ul>
<li>(비지도 사전학습 단계의 목표는 언어 모델을 학습해서 자연어의 기본 구조를 모델에게 이해시키는 것 → 일반적인 언어 모델의 목적 함수와 동일)</li>
</ul>
<p>$$
L_1(U) = \sum_{i}^{}log P(u_i|u_{i−k},...,u_{i−1};Θ)
$$</p>
<ul>
<li>U={u_1, u_2, … , u_n} : 비지도 학습을 위한 토큰 corpus</li>
<li>L_1(U) : corpus에서 각 토큰(u_i)에 대한 로그 확률의 합을 최대화하는 우도(likelihood) 함수<ul>
<li>참고) 우도(likelihood)<ul>
<li>특정한 사건이 확률 모델에 의해 발생할 정도</li>
<li>확률과는 다른 개념</li>
</ul>
</li>
</ul>
</li>
<li>Θ : 신경망의 가중치를 포함하는 모델의 매개변수들, SGD로 학습된다.</li>
<li>P(u_i|u_{i−k}, ... ,u_{i−1}) : 이전 토큰의 문맥(context)를 기반으로 한 다음 토큰의 조건부 확률값</li>
<li>본 연구에서는 multi-layer transformer decoder를 사용한다.</li>
</ul>
<p>$$
h_0 = UW_e + W_p
\h_l = transformer_block(h_{l−1})∀i ∈ [1, n]
\P(u) = softmax(h_nW^T_
e
)
$$</p>
<ul>
<li>h_0 : 초기 입력 임베딩, 두 임베딩의 합으로 이루어짐<ul>
<li>UW_e : U는 입력 토큰 시퀀스, W_e는 토큰 임베딩 행렬. → 각 토큰을 고차원 벡터로 변환</li>
<li>W_p : 포지션 임베딩 행렬, 시퀀스 내의 각 토큰의 위치 정보를 인코딩.</li>
</ul>
</li>
<li>h_l : Transformer 블록, 이전 레이어 h_l-1의 출력을 입력으로 받음.<ul>
<li>n : 모델의 전체 레이어 수</li>
<li>각 블록은 Multi-head self-attention 메커니즘과 Position-wise Feed Forward Network Layer를 포함한다.</li>
</ul>
</li>
<li>P(u) : output 확률<ul>
<li>h_n은 최종 레이어 출력이며, W^T_e는 토큰 임베딩 매트릭스의 transpose</li>
<li>두 값을 곱한 뒤 softmax를 거쳐 각 target 토큰의 확률 계산</li>
</ul>
</li>
</ul>
<h2 id="32-supervised-fine-tuning">3.2 Supervised fine-tuning</h2>
<ul>
<li>사전 학습된 언어 모델을 특정 지도 학습 작업에 맞게 fine-tuning 하는 과정</li>
<li><strong>Fine-tuning 과정</strong>은 아래 수식과 같이 표현됨</li>
</ul>
<p>$$
P(y∣x^1,…,x^m)=softmax(h^m_lW_y)
$$</p>
<ul>
<li><p>x_1, x_2, … , x_m : 입력 토큰 시퀀스</p>
</li>
<li><p>y : 예측해야 할 라벨</p>
</li>
<li><p>h^l_m : 사전 훈련 모델을 통과한 후 마지막 transformer 블록에서 얻어진 activation(출력)</p>
</li>
<li><p>W_y : fine-tuning될 때 추가된 linear output layer의 parameter</p>
</li>
<li><p>softmax로 확률분포로 변환</p>
</li>
<li><p><strong>최적화 목적 함수</strong>는 아래와 같이 표현됨</p>
</li>
</ul>
<p>$$
L_2(C) = \sum_{(x,y)}
log P(y|x^1, . . . , x^m).
$$</p>
<ul>
<li><p>입력 x에 대해 모델이 정확한 라벨 y를 예측할 로그 확률을 최대화하도록 학습</p>
<ul>
<li>(이는 cross entropy loss function의 negative log likelihood와 동일)</li>
</ul>
</li>
<li><p>Fine-tuning 과정에서 언어 모델링을 보조 목표로 포함하는 것은 2가지 이점이 있다:</p>
<ul>
<li>1) 지도학습 모델의 일반화 성능을 개선한다.</li>
<li>2) 모델의 수렴을 가속화한다.</li>
</ul>
</li>
<li><p>이는 아래의 합성 objective function을 최적화함으로써 수행됨</p>
</li>
</ul>
<p>$$
L_3(C) = L_2(C) + λ ∗ L_1(C) 
$$</p>
<ul>
<li>(λ : 두 objective 사이의 상대적 중요도를 조절하는 하이퍼파라미터)</li>
<li>전반적으로 fine-tuning 과정에서 필요한 추가적인 파라미터는 W_y와, Delimeter token에 대한 임베딩(3.3에서 설명) 뿐이다.</li>
</ul>
<h2 id="33-task-specific-input-transformations">3.3 Task-specific input transformations</h2>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/2f3adf91-c9b6-49ff-b579-2966459a77f2/image.png" alt=""></p>
<ul>
<li>텍스트 분류와 같은 일부 작업에서는 직접 모델을 fine-tuning할 수 있지만, QA나 Textual Entailment과 같은 작업들은 문장쌍이나 문서, 질문, 답변의 삼중항과 같은 구조화된 입력이 존재한다.<ul>
<li>GPT는 연속된 텍스트 시퀀스로 훈련되었기 때문에, 이러한 작업들에 적응하기 위해서는 모델의 일부 수정이 필요하다.</li>
<li>이전 연구들은 전이된 표현 위에 task에 특화된 아키텍처를 학습하는 것을 제안했다.<ul>
<li>그러나 이런 접근법들은 작업들마다 아키텍처를 변환하고, 추가된 아키텍처 요소에는 전이학습이 사용되지 않음.</li>
</ul>
</li>
</ul>
</li>
<li>GPT는 순회(traversal) 방식의 접근법을 사용하여 복잡한 구조의 입력을 pre-trained 모델이 처리할 수 있는 <strong>순서가 있는 시퀀스</strong>로 변환한다.<ul>
<li>이는 작업에 따라 아키텍처를 광범위하게 바꾸지 않게 한다.</li>
</ul>
</li>
</ul>
<ol>
<li><strong>Textual Entailment (텍스트 수반/함축)</strong><ul>
<li>Text Entail 작업에서는, 주장(premise) p와 가설(hypothesis) h 토큰 시퀀스를 연결하고, 그 사이에 구분 기호 토큰($)을 넣는다.</li>
</ul>
</li>
<li><strong>Similarity (유사도)</strong><ul>
<li>두 문장의 유사도를 평가할 때는 문장의 순서가 중요하지 않으므로, 두가지 순서를 모두 고려하여 각 문장의 시퀀스 표현 h_l^m를 생성한다. 그 표현들은 element-wise하게 추가되어 linear output layer에 공급된다.</li>
</ul>
</li>
<li><strong>Question Answering and Commonsense Reasoning (질문 답변 &amp; 상식 추론)</strong><ul>
<li>위 작업들에 대해서는, context 문서 z, 질문 q, 가능한 답변들의 집합 {a_k}를 제공받는다.</li>
<li>문서 문맥과 질문을 각각의 가능한 답변과 연결하고, 사이에 구분 기호 토큰을 넣어 [z; q; $; ak]를 얻는다.</li>
<li>이 시퀀스들은 독립적으로 처리되고, 그 다음 소프트맥스를 통해 정규화되어 가능한 답변들에 대한 출력을 생성한다.</li>
</ul>
</li>
</ol>
<h1 id="4-experiments">4. Experiments</h1>
<h2 id="41-setup">4.1 Setup</h2>
<ol>
<li><strong>Unsupervised pre-training</strong><ul>
<li>7,000권 이상의 다양한 장르의 미출판 책으로 구성된 BooksCorpus 데이터셋을 사용해 모델을 훈련한다.<ul>
<li>긴 연속된 텍스트를 포함</li>
<li>ELMo가 사용한 1B Word Benchmark와 달리 문장 레벨에서 섞이지 않아 장기적 구조를 파괴하지 않는다.</li>
<li>GPT는 이 corpus에서 매우 낮은 토큰 레벨의 PPL (18.4) 를 기록했다.</li>
</ul>
</li>
</ul>
</li>
<li><strong>Model specifications</strong><ul>
<li>GPT는 기존의 Transformer를 대체로 따르며, Masked self-attention heads를 가진 12개 layer의 decoder-only Transformer를 학습시켰다.<ul>
<li>768차원, 12개의 attention head</li>
<li>Position-wise feed-forward network에서, 3072차원의 내부 상태</li>
<li>Adam optimization, 최대 학습률 2.5e-4. 학습률은 2000번의 업데이트 동안 선형적으로 증가하며, 코사인 스케줄을 사용하여 0으로 감소시켰다.</li>
<li>64의 미니배치에서 무작위로 샘플링된 연속적인 512 토큰 시퀀스에 대해 100 에폭을 훈련시켰다.</li>
<li>모델 전체에 걸쳐 LayerNorm이 사용되기 때문에, 단순한 가중치 초기화 N(0, 0.02)로 충분하다.</li>
<li>바이트페어 인코딩(BPE) 어휘를 사용했고, regularization을 위해 residual, embedding, attention에 0.1 dropout 적용.</li>
<li>non bias나 gain weight에 대해 w = 0.01의 수정된 L2 규제 버전을 사용했다.</li>
<li>Activation function으로 GELU 사용</li>
<li>spaCy 토크나이저 사용</li>
</ul>
</li>
</ul>
</li>
<li><strong>Fine-tuning details</strong><ul>
<li>비지도 사전훈련에서 사용된 하이퍼 파라미터 설정을 재사용한다.(특별한 언급이 없으면)</li>
<li>분류기에 0.1 비율의 드롭아웃을 추가한다.</li>
<li>대부분의 작업에서 6.25e-5의 학습률과 32의 배치 크기를 사용한다.</li>
<li>GPT는 빠르게 파인튜닝되며, 대부분의 경우 3 에폭이면 충분했다.</li>
<li>학습의 0.2% 동안 웜업을 포함하는 선형 학습률 감소 스케줄을 사용한다.</li>
</ul>
</li>
</ol>
<h2 id="42-supervised-fine-tuning">4.2 Supervised fine-tuning</h2>
<ul>
<li>NLI(자연어 추론), QA(질문 응답), Semantic Similarity(의미론적 유사성), Classification(텍스트 분류)를 포함한 다양한 지도학습 작업에 대한 실험을 진행한다.</li>
<li>이 작업 중 일부는 최근 발표된 GLUE 다중 작업 벤치마크로 진행한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/40309366-12b2-4f40-bfdb-1b7f71a72932/image.png" alt=""></p>
<ol>
<li><p><strong>Natural Language Inference(자연어 추론, 텍스트적 함축)</strong></p>
<ul>
<li><p>텍스트적 함축을 인식하는 작업은 두 문장의 쌍을 읽고, 그들 사이의 관계를 <strong>포함, 모순, 중립</strong> 중 하나로 판단하는 것을 의미한다.</p>
</li>
<li><p>이 작업은 어휘적인 함축, 모호성 등으로 인해 어려운 task로 남아있다.</p>
</li>
<li><p>SNLI, MNLI, QNLI, SciTail, RTE 등의 다양한 데이터셋에 대해 평가한다.</p>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/d9af2c6b-0523-466b-8b9b-a1674d8cb61e/image.png" alt=""></p>
</li>
</ul>
</li>
</ol>
<pre><code>- 표 2는 결과를 나타내며, 5개의 데이터셋 중 4개에서 SOTA를 달성했다.
- GPT가 여러 문장에 대해 더 잘 추론하고 언어적 모호성을 더 잘 처리할 수 있는 능력이 있음을 보여준다.</code></pre><ol start="2">
<li><p><strong>Question answering and commonsense reasoning</strong></p>
<ul>
<li><p>문장 추론이 필요한 또 다른 작업은 QA다.</p>
</li>
<li><p>영어 지문과 관련된 질문들로 구성된 RACE 데이터셋 사용</p>
<ul>
<li>다른 데이터셋들 보다 더 많은 추론 유형의 질문을 포함한다.</li>
</ul>
</li>
<li><p>Story Cloze Test에 대해서도 평가</p>
<ul>
<li>두 가지 옵션 중에서 올바른 결말을 선택하는 것</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/c231c337-2ed7-4122-a063-61b0b10b1c82/image.png" alt=""></p>
</li>
</ul>
</li>
</ol>
<pre><code>- 두 작업에서 모두 SOTA
- GPT가 장기적인 문맥을 효과적으로 처리할 수 있음을 보여준다.</code></pre><ol start="3">
<li><p><strong>Semantic Similarity</strong></p>
<ul>
<li><p>의미론적 유사성 task는 두 문장이 의미론적으로 동등한지 여부를 예측하는 것을 의미한다.</p>
</li>
<li><p>3개의 데이터셋 사용</p>
<ul>
<li>MRPC, QQP, STS-B</li>
</ul>
</li>
<li><p>3개 중 2가지 데이터셋에서 SOTA 달성</p>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/4fb766cb-b7ed-44fe-a027-a3ce36ac804d/image.png" alt=""></p>
</li>
</ul>
</li>
</ol>
<ol start="4">
<li><strong>Classification</strong><ul>
<li>두가지 다른 텍스트 분류 작업에 대해 평가한다.</li>
<li>1) Corpus of Linguistic Acceptability(CoLA)는 문장이 문법적으로 맞는지에 대한 전문가의 판단을 포함한다.<ul>
<li>훈련된 모델의 내재된 언어적 편향을 테스트한다.</li>
</ul>
</li>
<li>2) Stanford Sentiment Treebank(SST-2)는 표준적인 이진 분류 작업이다.</li>
<li>CoLA에서 SOTA 달성</li>
<li>GLUE 벤치마크에서 성능 향상</li>
</ul>
</li>
</ol>
<ul>
<li>전반적으로, 12개 데이터셋 중 9개에서 SOTA 달성했고, 많은 경우에는 앙상블 모델도 능가한다.</li>
<li>또한 크기가 작은 데이터셋(5.7k)부터 크기가 큰 데이터셋(550k)에서까지 잘 동작한다는 것을 보여준다.</li>
</ul>
<h1 id="5-analysis">5. Analysis</h1>
<ol>
<li><p><strong>Impact of number of layers transferred (전이하는 레이어 수의 영향)</strong></p>
<ul>
<li><p>비지도 사전 훈련에서 target 지도학습으로 transfer하는 layer의 수가 달라짐에 따른 영향을 관찰했다.</p>
</li>
<li><p>Figure 2의 왼쪽 그림은 transfer되는 layer의 수에 따라 실험하는 데이터셋에서의 성능을 나타낸다.</p>
<ul>
<li>pre-trained된 레이어를 더 많이 전이할 수록 target task의 성능이 올라감을 보여준다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/01b4f332-5327-4491-a4cf-b2e89c5ed095/image.png" alt=""></p>
</li>
</ul>
</li>
</ol>
<ol start="2">
<li><p><strong>Zero-shot Behaviors</strong></p>
<ul>
<li>Transformer 의 사전 훈련이 효과적인 이유를 더 잘 이해하고 싶다.</li>
<li>GPT는 사전훈련(이건 generative한 작업을 위한 사전학습)을 하는 동안에도 다른 복잡한 NLP task에 필요한 지식들을 학습한다.</li>
<li>LSTM과 Transformer를 비교한 결과는, Transformer가 언어처리 작업에 대해 더 나은 전이 학습 능력을 가지고 있음을 보여준다.</li>
<li>또한 Transformer는 LSTM보다 제로샷 학습 성능에서 더 변동성이 적고 안정적으로 증가하는 성능을 보인다.</li>
</ul>
</li>
<li><p><strong>Ablation studies</strong></p>
<p> <img src="https://velog.velcdn.com/images/dutch-tulip/post/92cfdb52-b028-4161-ab3a-53ad11ca2031/image.png" alt=""></p>
</li>
</ol>
<pre><code>- 3가지 다른 제거 실험을 수행했다.
- 1) Fine-tuning에서 보조 LM 목표를 제거하고 성능을 확인했다.
    - 보조 LM 목표가 NLI 작업과 QQP 작업에 도움이 된다는 것을 확인했다.
    - 전반적으로, 더 큰 데이터셋이 보조 목표로부터 이득을 얻는 것 같다.
- 2) 동일 조건에서 LSTM과 Transformer의 성능을 비교했다.
    - LSTM은 MRPC에서만 Transformer보다 더 나은 성능을 보였고, 나머지는 전부 다 Transformer보다 성능이 낮았다.
- 3) 사전 훈련 없이 직접 지도학습된 target task에 대해 사전 훈련된 일반 모델과 성능 비교도 이뤄졌다.
    - 사전 훈련이 없으면 모든 작업에서 성능이 떨어졌다.
    - 복잡한 NLP 작업들에서는 결국 사전 훈련이 중요하다.</code></pre><h1 id="6-conclusion">6. Conclusion</h1>
<ul>
<li>우리는 Generative한 Pre-training과, Discriminative한 Fine-tuning을 통한 single model을 통해 자연어 이해 작업에서 강력한 성능을 달성하는 프레임워크를 소개했다.<ul>
<li>(기존 방식들이 각 task 별로 아키텍처를 설계하거나, fine-tuning을 새로 하거나 하는 것과는 차별적이고 휠씬 편한 방식임)</li>
</ul>
</li>
<li>다양한 긴 문장을 포함하는 corpus에 대한 pre-train을 통해 장거리 종속성을 해결하고, 12개 중 9개 task에서 SOTA 달성했다.</li>
<li>비지도 사전학습을 사용하여 discriminative task의 성능을 높이는 것은 ML의 오랜 목표였다.<ul>
<li>GPT 모델은 이것이 실제로 가능하다는 것을 보여주며, Transformer라는 모델과 장거리 종속성이 있는 텍스트를 사용할 때 성능 향상이 이루어 짐을 보여줬다.</li>
</ul>
</li>
<li>이 연구가 자연어 이해 및 다른 영역에서도 비지도 학습이 언제 어떻게 동작하는지에 대한 이해를 더 높이는데 도움이 되기를 기대한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension (2020)]]></title>
            <link>https://velog.io/@dutch-tulip/BART</link>
            <guid>https://velog.io/@dutch-tulip/BART</guid>
            <pubDate>Tue, 26 Dec 2023 07:01:55 GMT</pubDate>
            <description><![CDATA[<hr>
<p><a href="https://arxiv.org/pdf/1910.13461.pdf">논문 링크</a></p>
<p>From ACL 2020</p>
<h1 id="0-abstract">0. Abstract</h1>
<ul>
<li>Seq-Seq 모델을 pre-train하기 위한 denoising autoencoder인 BART를 제안한다.</li>
<li>BART는 다음의 방식으로 학습이 이루어지는데, 이는:<ul>
<li>임의의 노이즈 함수로 텍스트에 변형을 주고,</li>
<li>이 노이즈를 원본으로 복원하는 방식이다.</li>
</ul>
</li>
<li>BART는 양방향의 BERT, 단방향의 GPT 등 수많은 표준 Transformer 기반 NMT(Neural Machine Translation) 구조를 일반화한 모델이다.</li>
<li>여러가지 노이즈 기법을 평가했더니, (1) 원본 문장들의 순서를 랜덤하게 섞는 것과, (2) 텍스트 시퀀스(이하 <strong>span</strong>)가 하나의 MASK 토큰으로 치환되는 새로운 in-filling scheme을 사용하는 것을 모두 사용할 때 가장 좋은 퍼포먼스를 보인다는 것을 발견했다.<ul>
<li>참고)<ul>
<li>Span: 텍스트의 나열(시퀀스). 문장을 이룰 수도 있지만 꼭 그렇지 않음. 여러 문장에 걸쳐 형성될 수도 있음.</li>
</ul>
</li>
</ul>
</li>
<li>BART는 Text Generation에 대해 Fine-tuned 됐을 때 효과적이지만 이해력이 요구되는 작업에도 잘 동작한다.<ul>
<li>GLUE, SQuAD 벤치마크에 대해서 RoBERTa 모델과 유사한 학습 환경에서 Abstractive Dialogue, Question Answering, Summarization에서 SOTA 달성 (6 ROUGE 이상 상승)</li>
<li>기계 번역을 위한 역번역(Back-translation)에서 Target language에 대한 사전학습만으로도 1.1의 BLEU 상승이 있었다.<ul>
<li>참고)<ul>
<li>Back-translation: 번역 데이터가 충분하지 않을 경우 유용한 방식<ul>
<li>1) 원본 언어에서 Target 언어로 번역</li>
<li>2) Target 언어에서 원본 언어로 재번역 → Back-translation</li>
<li>원본 텍스트와 재번역된 텍스트의 차이를 줄이는데 유용</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>또한 본 논문에서는 ablation 실험을 통해 BART에서 성능에 가장 큰 영향을 미치는 요인을 측정한다.<ul>
<li>참고)<ul>
<li>Ablation study/experiment<ul>
<li>모델에서 특정 요소들을 제거하고 실험을 진행하면서 그 요소가 성능에 어떤 영향을 주는지 확인해보는 것</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="1-introduction">1. Introduction</h1>
<ul>
<li>Self-supervised 방식은 NLP에서 많은 성공을 거두었다.<ul>
<li>그러한 성공은 Masked Language Model의 변형들이었으며, 랜덤으로 마스킹된 텍스트를 재구성하도록 훈련된 Denoising Autoencoder들이었다.</li>
<li>최근에는 마스킹된 토큰의 분포 개선, 마스킹된 토큰의 예측 순서 개선 등을 통해 성능 향상 이루었다.</li>
<li>하지만 이러한 방법들은 End tasks(ex. span prediction, generation …)에 초점을 맞추기 때문에 활용 가능성이 제한적이다.</li>
</ul>
</li>
<li>본 논문에서는 양방향과 auto-regressive한 transformer를 결합한 사전학습 모델인 BART를 제안한다.<ul>
<li>BART는 sequence to sequence 모델로 제작된 Denoising autoencoder로, 다양한 End task에 적용가능하다.</li>
</ul>
</li>
<li>BART의 사전학습은 두단계로 이루어진다:<ul>
<li>임의의 노이즈 함수로 텍스트에 변형을 가하고,</li>
<li>seq-to-seq 모델이 텍스트의 원본을 복원하도록 학습된다.</li>
</ul>
</li>
<li>BART는 표준 Transformer 기반 NMT(신경망 기계 번역) 구조를 사용하는데, 이는 단순함에도 불구하고 양방향 인코더를 사용하는 BERT, Left to Right 단방향 디코더를 사용하는 GPT 등의 최신 사전학습 방식을 일반화한 것이라고 볼 수 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/0f26e71d-7291-45fc-92f9-3c7bb586d071/image.png" alt=""></p>
<ul>
<li>이러한 방식의 이점은 Noising의 유연성으로, 원본 텍스트에 길이 변경을 포함하는 임의의 변형을 가할 수 있다는 것이다.<ul>
<li>여러가지 노이즈 기법을 평가했더니, (1) 원본 문장들의 순서를 랜덤으로 섞는 것과, (2) 임의 길이(0도 포함)의 span이 하나의 MASK 토큰으로 치환되는 새로운 in-filling 방식을 사용하는 것을 모두 사용할 때 가장 좋은 성능을 보인다는 것을 발견했다.</li>
<li>이는 문장 전체 길이에 대해 더 많이 추론하고, 입력보다 더 긴 변환을 수행하도록 강제함으로써, 기존 BERT의 masking과 NSP를 일반화한다.</li>
</ul>
</li>
<li>또한, BART는 fine-tuning에 대한 새로운 사고 방식을 생각하게 한다.<ul>
<li>본 논문에서는 machine translation에 대한 새로운 scheme을 제안하는데, 이는 추가적인 transformer layer들 위에 BART를 올리는 것이다.</li>
<li>이 layer들은 BART의 순전파를 통해 외국어를 노이즈가 있는 영어로 번역하도록 학습된다. (BART를 target쪽 언어모델로 사용)</li>
<li>이는 WMT 루마니아어-영어 벤치마크에서 강력한 역번역 MT 기준에 대한 성능을 1.1 BLUE만큼 향상시킨다.</li>
</ul>
</li>
<li>Ablation 실험을 통해 BART에서 사용된 기법들의 효과를 이해한다.<ul>
<li>BART는 우리가 고려하는 모든 task에서 일관되고 강력한 성능을 보인다.</li>
</ul>
</li>
</ul>
<h1 id="2-model">2. Model</h1>
<ul>
<li>BART는 변형된 문서를 원본으로 매핑하는 denoising autoencoder다.<ul>
<li>이는 변형된 텍스트에 대해 양방향 인코더와 left-to-right autoregressive 디코더로 구성된 sequence-to-sequence 모델로 구현된다.</li>
</ul>
</li>
<li>사전학습 과정에서는 원본 문서의 negative log likelihood (NLL)을 최적화한다.<ul>
<li>참고)<ul>
<li>NLL: 일종의 손실함수로, Cross Entropy와 유사</li>
<li>모델이 정답 단어를 예측할 확률의 로그를 취한 것을 음수로 취한 것</li>
<li>ex) NLL: 단일 클래스 예측, Cross Entropy: 다중 클래스 예측</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="21-architecture">2.1 Architecture</h2>
<ul>
<li>BART는 표준 seq-to-seq Transformer 아키텍처를 사용하지만, GPT와 같이 ReLU가 아닌 GeLU 활성화 함수를 사용하고, 파라미터를 N(0, 0.02)로 초기화하여 사용한다.</li>
<li>Base 모델에는 인코더와 디코더에 각각 6개의 레이어를 사용하며, large 모델에는 12개의 레이어를 각각 사용한다.</li>
<li>이 구조는 BERT와 밀접한 관련이 있지만 다음과 같은 차이점들이 있다:<ul>
<li>(1) 디코더의 각 레이어는 (transformer seq-to-seq 모델과 같이) 최종 hidden layer에 대해 추가로 cross-attention을 수행한다.</li>
<li>(2) BERT는 word-prediction 이전에 추가적인 FFN을 사용하지만, BART는 그렇지 않다.</li>
<li>전체적으로, BART는 같은 크기의 BERT보다 10% 더 많은 파라미터를 갖는다.</li>
</ul>
</li>
</ul>
<h2 id="22-pre-training-bart">2.2 Pre-training BART</h2>
<ul>
<li>BART는 문서를 변형시킨 뒤 reconstruction loss, 즉 디코더의 출력과 원본 문서 간의 cross entropy를 최적화하며 학습된다.<ul>
<li>특정 noising 방식에 맞추어진 기존의 denoising audoencoder들과는 달리, BART는 모든 종류의 문서 변형에도 대응할 수 있다.</li>
<li>Extreme한 케이스, 즉 원본의 모든 정보가 날라간 경우라면, BART는 전통적인 언어모델과 동일하게 작동한다. (개인적인 생각: BART는 원래 denoising ‘오토인코더’처럼 동작하는데, 정보가 다 사라졌을 때에는 언어모델링, 즉 텍스트를 생성하는 작업도 수행할 수 있다는 뜻?)</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/d09d2046-68b0-4d67-af9b-1c706446a1e3/image.png" alt=""></p>
<ul>
<li>BART에서 사용한 텍스트 변형 방법은 아래과 같다:</li>
</ul>
<h3 id="1-token-masking">1) Token Masking</h3>
<ul>
<li>BERT처럼 무작위 토큰이 샘플링되고 [MASK]로 치환된다.</li>
</ul>
<h3 id="2-token-deletion">2) Token Deletion</h3>
<ul>
<li>무작위 토큰이 입력에서 제거된다.</li>
<li>Token Masking과 다르게, 모델이 반드시 어떤 위치의 입력이 제거될지 정해야 한다.</li>
</ul>
<h3 id="3-text-infilling">3) Text Infilling</h3>
<ul>
<li>여러개의 span이 샘플링되며, span 길이는 푸아송 분포(λ = 3)에서 추출된다.</li>
<li>각 span은 하나의 [MASK] 토큰으로 치환된다.<ul>
<li>이는 SpanBERT에서 그 아이디어를 가져왔지만, 이와 다른 점은 SpanBERT는 서로 다른 분포에서 span이 샘플링되고, 이를 span과 동일한 길이의 [MASK] 토큰으로 치환한다는 것.</li>
</ul>
</li>
<li>Text Infilling은 span에서 누락된 토큰의 수를 예측하도록 모델을 학습한다.</li>
</ul>
<h3 id="4-sentence-permutation">4) Sentence Permutation</h3>
<ul>
<li>마침표를 기준으로 문장이 나뉘고, 이러한 문장들이 랜덤한 순서로 섞여있다.</li>
</ul>
<h3 id="5-document-rotation">5) Document Rotation</h3>
<ul>
<li>토큰이 무작위로 선택되고, 그 토큰을 기준으로 문서가 회전되어 문서가 해당 토큰으로 시작할 수 있도록 한다.</li>
<li>이는 모델이 문서의 시작 부분을 찾아낼 수 있도록 훈련시키는 것이다.</li>
</ul>
<h1 id="3-fine-tuning-bart">3. Fine-tuning BART</h1>
<ul>
<li>BART의 representation은 다양한 방식의 다운스트림에서 사용가능하다.</li>
</ul>
<h2 id="31-sequence-classification-tasks">3.1 Sequence Classification Tasks</h2>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/ddd30119-c569-48bf-9ed4-1bcb5b38594b/image.png" alt=""></p>
<ul>
<li>Sequence classification 작업에서는 완전히 동일한 입력이 인코더와 디코더에 입력되고, 최종 디코더의 최종 은닉층이 새로운 multi-class 선형 분류기에 입력된다.<ul>
<li>이는 BERT의 CLS 토큰과 관련이 있지만, BART에서는 <strong>마지막</strong>에 additional token을 추가하여 디코더의 토큰 표현이 전체 입력에서 디코더 상태에 주목할 수 있도록 한다.(Figure 3a)</li>
</ul>
</li>
</ul>
<h2 id="32-token-classification-tasks">3.2 Token Classification Tasks</h2>
<ul>
<li>Token classification 작업에 대해서는, 인코더와 디코더에 전체 문서를 제공한 뒤 디코더의 최종 hidden state를 각 단어의 representation으로 사용한다.<ul>
<li>이 표현은 토큰을 분류하는데 사용된다.</li>
</ul>
</li>
</ul>
<h2 id="33-sequence-generation-tasks">3.3 Sequence Generation Tasks</h2>
<ul>
<li>BART는 autoregressive decoder를 갖고 있기 때문에, Abstractive QA나 Summarization과 같은 Sequence Generation 작업에도 바로 파인튜닝될 수 있다.</li>
<li>이러한 작업들에서, 정보는 input에서 복사되지만 변형된 형태로 복사되며, 이는 denoising pre-training의 목적과 관련이 있다.</li>
<li>인코더의 입력은 input 시퀀스이며 디코더는 autoregressive하게 출력을 생성한다.</li>
</ul>
<h2 id="34-machine-translation">3.4 Machine Translation</h2>
<ul>
<li>이전 연구에서는 pre-trained 된 인코더들을 결합하여 모델 성능을 개선할 수 있음을 보여주었지만, pre-trained된 디코더를 사용함으로서 얻을 수 있는 이점은 제한적이었다.</li>
<li>Bitext(양방향 텍스트)로부터 학습된 인코더 파라미터 셋을 추가함으로써 전체의 BART 모델(인코더와 디코더 둘다)을 Machine Translation을 위한 단일 Pre-trained 디코더로 사용할 수 있음을 보여준다.(Figure 3b)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/f2917063-e180-47d3-9566-16e0e336732c/image.png" alt=""></p>
<ul>
<li>자세하게는,<ul>
<li>기존 BART의 임베딩 레이어를 랜덤하게 초기화된 인코더로 교체한다.</li>
<li>이후 모델은 end-to-end로 학습되며, 모델의 새로운 인코더는 타겟 언어의 단어들(foreign words)을 input으로 매핑할 수 있도록 학습된다.</li>
<li>위 매핑을 통해 BART는 영어로의 de-noising이 가능하다.</li>
<li>교체되어 학습된 새로운 인코더는 기존의 BART과는 다른 별도의 vocab을 사용할 수 있게 된다.</li>
</ul>
</li>
<li>Source 인코더(원본 언어를 처리하는 인코더라서 source가 붙은 듯)는 2단계에 걸쳐서 학습되는데, 두 단계 모두 output에서의 cross-entropy loss를 역전파한다.<ul>
<li>첫번째 단계에서는, BART의 대부분의 파라미터를 고정(freeze)하고, 랜덤하게 초기화된 source 인코더와 BART의 positional embeddings, 인코더 첫번째 레이어의 self-attention input projection matrix 만을 업데이트 한다.</li>
<li>두번째 단계에서는, 모든 파라미터를 작은 iteration으로 학습한다.</li>
</ul>
</li>
</ul>
<h1 id="4-comparing-pre-training-objectives">4. Comparing Pre-training Objectives</h1>
<ul>
<li>BART는 pre-training 하는 과정에서 previous work보다 휠씬 더 넓은 범위의 노이징 방식을 제공한다.</li>
<li>이 논문에서는 base model에 대한 비교를 수행한다.<ul>
<li>6개의 인코더, 6개의 디코더, hidden size 768 (인코더와 디코더에서의 각 출력 차원이 768차원이라는 의미인 듯)</li>
<li>해당 base 모델의 성능은 5장에서 평가된다.</li>
</ul>
</li>
</ul>
<h2 id="41-comparison-objectives">4.1 Comparison Objectives</h2>
<ul>
<li>Pre-training의 많은 목적이 제안되었지만, 부분적으로는 훈련 데이터, 리소스, 모델 간의 아키텍처 차이, 파인튜닝 절차의 차이 등으로 인해 공정한 비교를 수행하기 어려웠다.</li>
<li>우리는 판별(Discriminative)과 생성(Generation) task들을 위해 최근 제안된 강력한 pre-training 접근법을 다시 구현한다.<ul>
<li>이는 pre-training의 목적과는 관련없는 차이들을 통제하는 것을 목표로 한다.</li>
<li>그러나 성능을 약간 향상시키기 위해 학습률과 계층 정규화의 사용률을 약간 수정한다.(각 pre-training 목적마다 다르게)</li>
</ul>
</li>
<li>참고로, 이렇게 구현된 방식을, BERT와 비교한다.<ul>
<li>BERT도, BART도, 책과 Wikipedia 데이터에 대해 1M steps(100만 스텝)학습됐다.</li>
<li>(같은 데이터로 동일한 스텝만큼 사전 학습 시켰으니까 어떤 사전 학습 방식이 좋은지, 어떤 모델이 좋은지 비교 가능 할 것!)</li>
</ul>
</li>
</ul>
<h3 id="1-language-model">1) Language Model</h3>
<ul>
<li>GPT와 비슷하게, left-to-right Transformer 언어 모델을 학습한다.<ul>
<li>해당 모델은 Cross-Attention이 없는 BART 디코더와 동일하다.</li>
</ul>
</li>
</ul>
<h3 id="2-permuted-language-model">2) Permuted Language Model</h3>
<ul>
<li>XLNet을 기반으로, 1/6의 토큰을 샘플링하여 해당 토큰들을 자기회귀적(autoregressively)으로, 그리고 랜덤하게 생성한다.</li>
<li>다른 모델과의 일관성을 위해 XLNet의 다른 특징들(segment across attention, relative positional embeddings)은 구현하지 않았다.</li>
</ul>
<h3 id="3-masked-language-model">3) Masked Language Model</h3>
<ul>
<li>BERT를 따라서, 15%의 토큰을 [MASK]로 치환하고, 모델이 이를 독립적으로 예측하도록 훈련한다.</li>
</ul>
<h3 id="4-multitask-masked-language-model">4) Multitask Masked Language Model</h3>
<ul>
<li>UniLM과 마찬가지로, MLM에 self-attention mask들을 추가하여 학습시킨다.<ul>
<li>Self-attention mask들은 아래와 같은 비율로 랜덤하게 선택된다:<ul>
<li>1/6: left-to-right</li>
<li>1/6: right-to-left</li>
<li>1/3: unmasked(마스크가 추가되지 않음)</li>
<li>1/3: 첫 절반 토큰들은 unmasked, 나머지 절반 토큰들은 left-to-right mask</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="5-masked-seq-to-seq">5) Masked Seq-to-Seq</h3>
<ul>
<li><p>MASS에서 영감을 받아, 토큰의 50%를 포함하는 span을 마스킹하고, 이 span을 예측하기 위해 seq-to-seq 모델을 학습한다.</p>
</li>
<li><p>Permuted LM, Masked LM, Multitask MLM에 대해서는, 시퀀스의 출력에 대한 가능성을 효율적으로 계산하기 위해 two-tream attention을 사용했다.</p>
<ul>
<li>Diagonal(대각선) self-attention mask를 출력 부분에 사용하여 왼쪽에서 오른쪽으로 단어들을 예측한다.</li>
</ul>
</li>
<li><p>우리는 (1) task들을 표준적인 시퀀스-투-시퀀스 문제로 처리하는 방식으로 처리하거나, (2) 원본을 디코더 target 시퀀스의 prefix로 추가하는 방식, 두가지로 실험했다.</p>
<ul>
<li>(1) 첫번째 방식은 전통적인 방식으로, 인코더의 source과 디코더에 target을 별도로 다룬다. 인코더는 입력 시퀀스를 처리하고, 디코더는 출력 시퀀스를 처리한다.</li>
<li>(2) 두번째 방식에서는, source 문장을 디코더의 target 시퀀스 앞에 접두사(prefix)로 추가하고, 모델의 loss는 타겟 시퀀스에만 적용된다.<ul>
<li>(source와 target을 연속된 시퀀스로 처리하니까 텍스트 관계 학습 면에서는 유리하고, 디코더 위주의 모델에서는 이러한 방식이 좋을 듯?)</li>
</ul>
</li>
</ul>
</li>
<li><p>BART는 (1)번 방식이 더 나은 성능을 보였고, (2)번 방식은 다른 모델들이 더 나은 성능을 보였다.</p>
</li>
<li><p>모델을 가장 직접적으로 비교하기 위해, Perplexity 수치를 비교한다.</p>
<ul>
<li>참고) Perplexity(PPL)
: a <strong><em>metric that quantifies how uncertain a model is about the predictions it make
→</em></strong> 선택 가능한 경우의 수를 수치화 (분기 계수, Branching Factor)</li>
<li>특정 시점에서 평균적으로 몇 개에 선택지를 갖고 고민했는가?</li>
<li>더 낮은 PPL을 갖는 모델이 같은 테스트 데이터에 대해 더 일치할 것임</li>
</ul>
</li>
</ul>
<h2 id="42-tasks">4.2 Tasks</h2>
<h3 id="1-squad">1) SQuAD</h3>
<ul>
<li>SQuAD는 Wikipedia 문단에 대한 Extractive QA 작업으로, 결과는 주어진 문서에서 추출된 text span이다.</li>
<li>BERT와 비슷하게, question과 context(문서의 일부분)를 인코더 입력으로 사용하고, 추가적으로 BART는 이를 다시 디코더에도 전달한다.<ul>
<li>(BERT는 인코더만 있으니까…)</li>
<li>(디코더에도 question과 context를 전달함으로써 generation 자체가 더 수월하게 진행되지 않을까 하는 생각)</li>
</ul>
</li>
</ul>
<h3 id="2-mnli">2) MNLI</h3>
<ul>
<li>MNLI는 한 문장이 다른 문장을 의미적으로 포함하는 여부를 예측하는 양방향 텍스트 분류 작업이다.</li>
<li>파인튜닝된 모델은 두개의 문장을 연결한 후(EOS토큰을 추가해서) 인코더와 디코더에 모두 통과시킨다.</li>
<li>BERT와 다르게,  BART의 EOS 토큰은 문장의 관계를 분류하는데에 사용된다.</li>
</ul>
<h3 id="3-eli5">3) ELI5</h3>
<ul>
<li>ELI5는 긴 형식의 Abstractive QA 데이터셋이다.</li>
<li>모델은 question과 documents의 concatenation에 따라 answer를 생성한다.</li>
</ul>
<h3 id="4-xsum">4) XSum</h3>
<ul>
<li>XSum은 뉴스 요약 데이터셋으로, Abstractive summaries를 포함한다.</li>
</ul>
<h3 id="5-convai2">5) ConvAI2</h3>
<ul>
<li>ConvAI2는 대화 응답 생성 작업을 수행하며, context와 persona를 필요로 한다.</li>
</ul>
<h3 id="6-cnndm">6) CNN/DM</h3>
<ul>
<li>CNN/DM은 뉴스 요약 데이터셋이다.</li>
<li>이곳에서의 요약문은 일반적으로 source 문장과 밀접한 관련이 있다.</li>
</ul>
<h2 id="43-results">4.3 Results</h2>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/2ac8fb55-d1bb-4450-bfa1-a83685189bd4/image.png" alt=""></p>
<ul>
<li>결과는 Table1 과 같으며, 다음과 같은 점들이 명확하게 드러났다.</li>
</ul>
<h3 id="1-performance-of-pre-training-methods-varies-significantly-across-tasks">1) Performance of pre-training methods varies significantly across tasks</h3>
<p><strong>= Pre-training 방법의 성능은 task에 따라서 크게 달라진다</strong></p>
<ul>
<li>단순한 Launguage Model은 ELI5에서 가장 높은 성능을 달성하지만, SQuAD에서 가장 안 좋은 성능을 보인다.</li>
</ul>
<h3 id="2-token-masking-is-crucial">2) Token masking is crucial</h3>
<p><strong>= 토큰 마스킹은 매우 중요하다</strong></p>
<ul>
<li>문서를 회전(rotating)시키거나 문장을 순열 변경(permuting)하는 것 단독으로 사용하면 성능이 떨어진다.<ul>
<li>참고)<ul>
<li>회전(Rotating): 문서나 단락 안에서 내용을 ‘회전’, 즉 문장이나 단락의 순서를 바꾸는 것. 문장이나 단락의 내부 구조는 유지된다.</li>
<li>순열 변경(Permuting): 문장이나 토큰 내부의 순서를 변경하는 것. Ex) 문장 내부의 단어들의 순서를 무작위로 재배열하는 것.</li>
</ul>
</li>
</ul>
</li>
<li>성공적인 방법은 토큰 삭제 or 토큰 마스킹 or self-attention masks를 사용하는 것이다.</li>
<li>Generation tasks에서는 토큰 삭제가 토큰 마스킹보다 성능이 뛰어난 것으로 나타났다.</li>
</ul>
<h3 id="3-left-to-right-pre-training-improves-generation">3) Left-to-right pre-training improves generation</h3>
<p><strong>= Left-to-right pre-training은 생성 작업의 성능을 향상시킨다</strong></p>
<ul>
<li>MLM과 Permuted LM은 Generation에서 다른 모델들보다 성능이 떨어진다.</li>
<li>또한 그 두 모델들은 pre-train 중에 left-to-right 자기회귀 언어모델링을 포함하지 않은 유이한 모델이다.</li>
</ul>
<h3 id="4-bidirectional-encoders-are-crucial-for-squad">4) Bidirectional encoders are crucial for SQuAD</h3>
<p><strong>= SQuAD 작업에는 양방향 인코더가 매우 중요하다</strong></p>
<ul>
<li>분류 작업에서는 future context가 중요한 역할을 하기 때문에, left-to-right 디코딩만 수행하는 것은 SQuAD에서 낮은 성능을 보인다.</li>
<li>그러나 BART는 양방향 레이어 수의 절반만으로도 비슷한 성능을 달성한다.<ul>
<li>(대충 BART는 효율적인 양방향 처리를 할 수 있다는 자랑)</li>
</ul>
</li>
</ul>
<h3 id="5-the-pre-training-objective-is-not-the-only-important-factor">5) The pre-training objective is not the only important factor</h3>
<p><strong>= Pre-training의 목적 만이 중요한 factor는 아니다</strong></p>
<ul>
<li>BART의 Permuted LM의 성능은 XLNet보다 떨어진다.</li>
<li>이는 XLNet의 특징인 relative-position embeddings이나 segment-level recurrence을 구현하지 않았기 때문일 수 있다.</li>
</ul>
<h3 id="6-pure-language-models-perform-best-on-eli5">6) Pure language models perform best on ELI5</h3>
<p><strong>= ELI5에서는 순수 Language model이 가장 높은 성능을 보인다</strong></p>
<ul>
<li>ELI5는 다른 task보다 휠씬 복잡하며, 다른 모델이 BART보다 성능이 높은 유일한 Generation task이다.</li>
<li>Pure LM이 가장 성능이 높으며, 이는 output이 input에 의해서 느슨하게 제한되는 경우 BART의 효율성이 떨어지는 것을 의미한다.<ul>
<li>(즉, 입력과 출력 사이의 관계가 덜 명확할 수록 BART는 효과적이지 않을 것이다!)</li>
<li>(찾아보니 ELI5는 긴 길이의 abstractive 답변, 창의적 답변 생성 등이 필요하다고 함)</li>
</ul>
</li>
</ul>
<h3 id="7-bart-achieves-the-most-consistently-strong-performance">7) BART achieves the most consistently strong performance</h3>
<p><strong>= BART는 가장 일관되면서 강력한 성능을 달성한다</strong></p>
<ul>
<li>ELI5를 제외하면 BART는 text-infilling을 사용하면서 모든 task에서 잘 동작한다.</li>
</ul>
<h1 id="5-large-scale-pre-training-experiments">5. Large-scale Pre-training Experiments</h1>
<ul>
<li>최근 연구에 따르면, pre-training을 대규모 배치 크기와 corpus로 확장하면 다운스트림 성능이 크게 향상될 수 있는 것으로 나타났다.</li>
<li>이러한 상황에서 BART가 얼마나 잘 동작하는지 테스트하기 위해 RoBERTa와 동일한 scale로 BART를 훈련시켰다.</li>
</ul>
<h2 id="51-experimental-setup">5.1 Experimental Setup</h2>
<ul>
<li>Large 모델에는 인코더와 디코더에 각 12개 레이어가 있고 hidden size는 1024이다.</li>
<li>RoBERTa와 같이 배치 크기는 8000, step은 500,000이다.</li>
<li>Documents는 GPT-2와 같이 BPE(byte-pair encoding)으로 토큰화된다.</li>
<li>섹션 4. 의 결과를 바탕으로, Text Infilling과 Sentence Permutation의 조합을 사용한다.</li>
<li>모든 문서에 대해 토큰의 30%는 마스킹하고, 모든 문장을 permute한다.<ul>
<li>Sentence Permutation은 CNN/DM summarization에서만 큰 이득을 보이지만, large pre-training 모델이 이 작업에서 더 잘 학습할 수 있다는 가설을 세웠다.</li>
</ul>
</li>
<li>학습 데이터로는 RoBERTa와 동일하게 뉴스, 책, stories, web text로 구성된 160GB의 데이터를 사용한다.</li>
</ul>
<h2 id="52-discriminative-tasks">5.2 Discriminative Tasks</h2>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/c9850373-2596-457b-b249-9d3db7fce9a0/image.png" alt=""></p>
<ul>
<li>Table 2는 SQuAD와 GLUE 벤치마크에 대해 BART와 다른 모델들의 성능을 비교한 표이다.</li>
<li>직접적으로 비교 가능한 기준은 동일한 리소스로 훈련되었지만 다른 objective를 가진 RoBERTa이다.</li>
<li>BART는 대부분의 task에서 약간의 차이만 있을 뿐 비슷한 성능을 보인다.</li>
<li>Generation task를 위한 BART의 개선이 Discriminative tasks에서의 성능도 희생시키지 않았음을 보여준다.</li>
</ul>
<h2 id="53-generation-tasks">5.3 Generation Tasks</h2>
<ul>
<li>BART는 표준적인 sequence-to-sequence 모델로 파인튜닝된다.</li>
<li>파인튜닝 동안 Label smoothed cross entropy loss를 사용하며, smoothing parameter는 0.1로 설정한다.</li>
<li>Beam size는 5로 설정하며 beam search 과정에서 중복된 trigrams를 제거한다.</li>
<li>Validation set에서 min-len, max-len, length penalty 를 설정하여 모델을 조정했다.</li>
</ul>
<h3 id="1-summarization">1) Summarization</h3>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/08680b90-6298-4f0a-8505-4a53935eae9f/image.png" alt=""></p>
<ul>
<li>서로 다른 특성을 가진 CNN/DailyMail , XSum 두가지 데이터셋에 대한 결과를 제시한다.</li>
<li>CNN/DM의 요약은 원본과 유사한 경향이 있다. Extractive 모델은 이 데이터셋에서 잘 동작하지만, 그럼에도 불구하고 BART는 기존 모든 작업보다 성능이 뛰어나다.</li>
<li>XSum은 매우 abstracive하며, extractive 모델은 성능이 떨어진다.</li>
<li>BART는 모든 ROUGE metric에서 6.0 정도 성능이 높으며, 번역의 질적으로도 품질이 뛰어나다(6장에서 다룸).</li>
</ul>
<h3 id="2-dialogue">2) Dialogue</h3>
<p>=대화 응답 생성</p>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/5bcd2afb-5d19-4ac8-a786-279c134d53e8/image.png" alt=""></p>
<ul>
<li>ConvAI2에 기반하여 대화 응답 생성 작업을 평가했다.</li>
<li>ConvAI2는 대화 에이전트가 반드시 persona와 이전 context를 고려하여 응답을 생성해야 하는 대화 응답 생성 작업이다.<ul>
<li>(따라서 단순히 이전 메세지에 반응하기만 하는 것이 아니라 persona의 특성도 고려해야 하고, 이전 context도 고려해야 함)</li>
</ul>
</li>
<li>BART는 이 작업에서 이전 모델들에 비해 두 개의 자동화된 metrics(Valid F1, Valid PPL)에 대해 더 높은 성능을 보였다.<ul>
<li>참고) Valid ~~: Validation 데이터 셋에 대해 평가된 성능</li>
</ul>
</li>
</ul>
<h3 id="3-abstractive-qa">3) Abstractive QA</h3>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/6194fb17-3170-4b94-9299-258ed8e74318/image.png" alt=""></p>
<ul>
<li>BART는 ELI5 작업에서 1.2 ROUGE-L을 통해 이전 작업들보다는 높은 성능을 달성했지만, 질문에 따라서 답변이 약하게 지정되는 문제가 있어서 ELI5는 여전히 어려운 문제로 남아있다.</li>
</ul>
<h2 id="54-translation">5.4 Translation</h2>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/b7670301-4f1c-4f70-b49e-8592ce12519b/image.png" alt=""></p>
<ul>
<li>WMT16 루마니아어-영어 번역 성능을 평가한다.</li>
<li>3.4에서 소개한 접근 방식에 따라 Transformer 인코더를 사용하여 루마니아어를 BART가 노이즈 제거를 통해 영어로 표현할 수 있는 representation으로 매핑했다.</li>
<li>결과는 Table 6과 같으며, baseline은 Transformer의 large setting이다.</li>
<li>Beam size = 5, length penalty  α = 1</li>
<li>역번역 데이터 없이는 BART의 접근 방식이 덜 효과적이며 과적합 경향이 있다.</li>
<li>향후 연구에서는 추가적인 정규화 기법이 연구되어야 한다.</li>
</ul>
<h1 id="6-qualitative-analysis">6. Qualitative Analysis</h1>
<ul>
<li>BART의 수치적인 성능을 넘어선 BART의 성능을 이해하기 위해 BART가 Generate하는 문장들을 분석한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/5a0e07ff-a977-481e-8e84-e85d23464659/image.png" alt=""></p>
<ul>
<li>Table 7은 BART가 생성은 summary를 보여준다.</li>
<li>BART의 output은 input에서 그대로 복사된 문구가 거의 없어 매우 추상적인 요약이라고 할 수 있다.</li>
<li>또한 output은 사실적이고 정확하며 input에 대한 background 지식(이름을 올바르게 완성하거나, 특정 기업이 어느 지역에서 운영된다거나 하는 등)을 잘 반영한다.</li>
<li>그러나 첫번째 예시에서 해당 연구가 Science지에서 출판되었다는 근거는 없다.</li>
<li>이러한 예시들은 BART Pre-training이 자연어와 generation에 대해 학습했음을 보여준다.</li>
</ul>
<h1 id="7-related-work">7. Related Work</h1>
<ul>
<li>GPT, ELMo, BERT, UniLM, MASS, XLNet 등…</li>
<li>GPT: GPT는 leftward한 정보(과거 정보)만 다루므로 일부 task에서 문제가 될 수 있다.</li>
<li>ELMo: ELMo는 left-only 표현과 right-only 표현을 연결하지만, 이는 사전 훈련 단계에서 상호작용하지 않는다.</li>
<li>BERT: MLM을 도입해서 양방향 상호작용을 도입했지만, autoregressive하지 않기 때문에 생성 task에는 적합하지 않다.</li>
<li>UniLM: BERT를 다양한 마스킹 조합으로 파인튜닝하여 판별과 생성 task에서 모두 사용가능하지만, UniLM은 조건부 독립적이지만 BART는 autoregressive하다.</li>
<li>MASS: 연속된 토큰의 범위(span)를 마스킹한 입력 시퀀스를 누락된 토큰으로 구성된 시퀀스에 매핑한다.(BART와 가장 비슷하다고 볼 수 있음) 그러나 인코더와 디코더에 제공되는 토큰이 다르기 때문에 판별 task에서는 성능이 비교적 낮다.</li>
<li>XLNet: BERT를 확장하여 마스킹된 토큰을 순열 순서로 autoregressive하게 예측한다. 그 예측은 왼쪽이나 오른쪽 맥락을 모두 조건으로 할 수 있지만, BART는 생성 동안의 설정과 같이 left-to-right으로 동작한다.</li>
</ul>
<h1 id="8-conclusion">8. Conclusion</h1>
<ul>
<li>우리는 손상된 문서를 원본으로 매핑하는 학습하는 pre-training 방식인 BART를 제안했다.</li>
<li>BART는 Discriminative 작업들에서 RoBERTa와 유사한 성능을 달성했다.</li>
<li>BART는 다양한 Generation 작업들에서 SOTA를 달성했다.</li>
<li>향후 작업: 특정한 end task들에 맞는 pre-training 방법을 개발하기 위해 문서를 손상시키는 새로운 방식을 찾아야 한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks (SBERT)(2019)]]></title>
            <link>https://velog.io/@dutch-tulip/Sentence-BERT</link>
            <guid>https://velog.io/@dutch-tulip/Sentence-BERT</guid>
            <pubDate>Tue, 12 Sep 2023 01:54:23 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/pdf/1908.10084.pdf">[논문 링크]</a>
From EMNLP 2019</p>
<h1 id="0-abstract">0. Abstract</h1>
<ul>
<li>BERT(2018)와 RoBERTa(2019)는 semantic textual similarity(STS)와 같은 sentence-pair regression 작업들에서 SOTA 달성</li>
<li>그러나 몇몇 문제 존재:<ul>
<li>문장의 쌍을 하나의 네트워크에 넣어야 하므로 막대한 연산 오버헤드 발생</li>
<li>10,000개 문장 모음에서 가장 유사한 문장 쌍 찾으려면 약 5,000만 번의 추론 연산 필요 → V100 기준 약 65시간</li>
<li>BERT는 clustering 같은 비지도 학습뿐만 아니라 의미적인 유사도 검색에도 부적합하다는 것 의미</li>
</ul>
</li>
<li>본 연구에서는 코사인 유사도를 사용해 문장 임베딩을 생성하기 위해 샴(Siamese) 네트워크과 Triplet 네트워크를 사용하는 BERT의 수정 버전인 Sentence-BERT(SBERT)를 제안</li>
<li>이를 통해 가장 유사한 문장 쌍을 찾는데 걸리는 시간이 65시간에서 약 5초로 단축되지만 BERT의 정확도는 유지</li>
<li>일반적인 STS 과제에서 SBERT와 SRoBERTa를 평가한 결과, 다른 최신의 문장 임베딩 방법보다 우수한 성능</li>
</ul>
<h1 id="1-introduction">1. Introduction</h1>
<ul>
<li>SBERT는 샴 네트워크와 triplet 네트워크를 사용하여 BERT를 수정하였다. 이를 통해 기존 BERT로는 수행하기 어려웠던 다운스트림 task인 대규모 의미 유사성 비교, 클러스터링, 정보 검색 등을 수행할 수 있다.</li>
<li>BERT는 cross-encoder 방식<ul>
<li>한 네트워크에 한 쌍이 들어가 두 문장을 [SEP]로 나눠 연산 수행하므로 STS를 수행하려면 너무 많은 가짓수를 학습시켜야 함</li>
<li>n개 문장을 pair로 학습시키려면 n(n-1)/2 → n=10,000이라면? 49,995,000 번 연산. V100으로 65시간…</li>
</ul>
</li>
<li>위 방법처럼 하지 않고 각 단일 문장을 벡터 공간으로 매핑하고 유사도나 거리를 구하는 방법을 사용하기도 함<ul>
<li>이런 방법은 과거에 제안된 GloVe 방법보다 낮은 성능이 나오기도 함</li>
</ul>
</li>
<li>이런 BERT의 특정 task에서의 성능 저하점을 개선하고자 SBERT 제안</li>
</ul>
<h1 id="2-related-work">2. Related Work</h1>
<ul>
<li>BERT는 pre-trained transformer 네트워크로, STS 벤치마크에서 SOTA를 달성했다</li>
<li>문장 쌍에 대한 입력은 [SEP]로 구분된 두 문장으로 구성</li>
<li>RoBERTa는 pre-train 과정을 조정하면 성능을 향상시킬 수 있음을 보여줌. XLNet은 BERT보다 나쁜 성능</li>
<li>그러나 BERT는 독립적인 단일 문장의 임베딩의 계산을 할 수 없음<ul>
<li>그래서 문장을 통과시키고 결과의 평균을 구하는 등의 우회 방법 사용</li>
</ul>
</li>
<li>문장 임베딩 모델에 대해 그동안 연구된 모델 여러가지 소개<ul>
<li>오버헤드 크고, 오래걸리는 등 사용하기 힘들다고 함.</li>
</ul>
</li>
<li>SBERT는 20분 이내에 tuning 가능하고 비슷한 문장 임베딩 방법보다 더 나은 결과를 얻을 수 있다</li>
</ul>
<h1 id="3-model">3. Model</h1>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/71032f40-94a0-4a9e-a08b-515f2f6e9e86/image.png" alt="Siamese-Network">
<a href="https://velog.io/@hsbc/230602-Siamese-Network">논문에 없는 그림</a></p>
<p>SBERT에서는 레이어의 형태도 같고 가중치도 같은 sub-network를 두 개 이상 갖는 샴(siamese) 네트워크를 사용한다. 입력으로 두 개의 데이터가 들어오면 동일한 가중치를 공유하는 레이어를 각각 통과해 각 임베딩 벡터를 생성해 이 벡터 간 거리를 비교하는 방식으로 학습이 진행된다. 샴 네트워크 사용하는 SBERT는 BERT와 달리 sub network의 가중치가 동일하게 업데이트 되므로 빠르게 두 개 입력을 비교할 수 있다. </p>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/e7d2b8ca-b4d4-4f9f-be39-990c94912a60/image.png" alt=""></p>
<ul>
<li>내부 pooling에는 BERT 출력의 [CLS], MAX 풀링, MEAN 풀링 3개를 사용할 수 있는데, 대부분의 경우에서 Mean 풀링이 성능이 가장 우수하게 나와 Mean 풀링을 사용한다</li>
</ul>
<p>SBERT 아키텍처 구조는 학습 데이터에 따라 크게 3가지로 나뉜다:</p>
<ol>
<li><p><strong>Classification Objective Function</strong></p>
<ul>
<li><p>Figure 1: For Classification</p>
</li>
<li><p>문장 임베딩 u, v와 그 둘의 element wise 차이를 concatenate 한 뒤 가중치를 곱한다. 이후 교차 엔트로피 오차(cross-entropy error loss)를 계산</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/25bc3e23-9098-42bf-a517-f518aa0c841f/image.png" alt=""></p>
</li>
</ul>
</li>
<li><p><strong>Regression Objective Function</strong></p>
<ul>
<li>Figure 2 : For Regression</li>
<li>문장 임베딩 u, v 사이의 코사인 유사도를 계산한 뒤 평균 제곱 오차(mean-squared-error loss)를 계산하여 목적 함수로 사용</li>
</ul>
</li>
<li><p><strong>Triplet Objective Function</strong></p>
<ul>
<li><p>중심 문장 a(anchor), 일치 문장 p(positive), 불일치 문장 n(negative)</p>
</li>
<li><p>a와 p는 가까워지게 하고, a와 n은 멀게 학습시키는 목적 함수</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/cf180631-8848-472a-871c-984706003380/image.png" alt=""></p>
</li>
<li><p>논문에서는 ϵ=1 사용</p>
</li>
</ul>
</li>
</ol>
<h2 id="31-training-details">3.1 Training Details</h2>
<ul>
<li>Train data<ul>
<li>SNLI - classification<ul>
<li>570,000 sentence pairs</li>
<li>labels: contradiction, entailment, neutral</li>
</ul>
</li>
<li>MNLI(MultiNLI) - regression<ul>
<li>430,000 sentence pairs</li>
<li>spoken and written text</li>
</ul>
</li>
</ul>
</li>
<li>batch size = 16</li>
<li>optimizer = Adam</li>
<li>learning rate = 2e-5</li>
<li>a linear learning rate warm-up over 10% of the training data</li>
<li>pooling strategy = MEAN</li>
</ul>
<h1 id="4-evaluation---semantic-textual-similarity">4. Evaluation - Semantic Textual Similarity</h1>
<ul>
<li>최신 모델에서는 종종 문장 pair 임베딩을 유사도에 매핑하도록 학습하는 경우가 있는데 이건 연산 횟수가 폭등한다.</li>
<li>대신 우리는 코사인 유사도로 구했다. 유클리드나 맨해튼도 해봤지만 비슷했다.</li>
</ul>
<h2 id="41-unsupervised-sts">4.1 Unsupervised STS</h2>
<ul>
<li><p>STS에 대한 모델의 비지도 학습을 측정하지만 관련된 데이터셋으로 모델을 학습시키지는 않고 측정했다.</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/c24f4eb0-a1ae-4f71-9fed-94483cab9546/image.png" alt=""></p>
</li>
</ul>
<ul>
<li>SBERT, SRoBERTa가 비지도학습에서도 높은 성능을 보임</li>
<li>Universal Sentence Encoder가 SICK-R에서 더 높긴하지만 Universal은 뉴스 데이터를 더 많이 학습해서 그렇다고 함</li>
<li>BERT의 [CLS]와 Glove는 성능이 떨어짐</li>
</ul>
<h2 id="42-supervised-sts">4.2 Supervised STS</h2>
<ul>
<li>STS 데이터셋으로 학습을 진행하고 성능 비교한 결과이다. 학습은 앞선 세가지 구조 중 regression으로 진행했다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/bd04231e-65af-42ed-aa97-94d0d9106e29/image.png" alt=""></p>
<ul>
<li>표 세번째 섹션에 나온 것과 같이 NLI에 대해 학습하고 STS에 대해 다시 학습하니까 성능 향상 폭이 매우 컸다</li>
<li>사실 이 부분은 SBERT나 SRoBERTa보다 BERT를 사용한게 더 성능이 우수한데 논문에선 언급이 없음 → 근데 계산의 속도 차이가 워낙 커서 이 정도 성능 차이를 충분히 감수할 만 하지 않을까 생각</li>
</ul>
<h2 id="43-argument-facet-similarity">4.3 Argument Facet Similarity</h2>
<ul>
<li>AFS는 논쟁이 될만한 3가지 주제를 다루는 데이터셋(총기 규제, 동성 결혼, 사형)</li>
<li>기존 STS와 다르게 동일한 주장과 동일한 이유를 다루고 있는지도 라벨링의 기준이 됨 → AFS가 더 성능 올리기 어려움</li>
<li>1) 10-fold cross validation, 2) 세가지 주제 중 두 주제를 학습에 사용하고, 나머지 한 주제를 평가에 사용하는 방식</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/c1c085e8-51a0-46a6-a8e8-57ef2cbc0e51/image.png" alt=""></p>
<ul>
<li>SBERT는 기존 BERT와 근접한 성능을 보이고 있음</li>
</ul>
<h2 id="44-wikipedia-sections-distinction">4.4 Wikipedia Sections Distinction</h2>
<ul>
<li>Wikipedia 문서 내에서 한 문서안이라도 같은 섹션에 있는 문장이면 다른 섹션에 있는 문장보다 더 가까울 것이라 가정하고 만든 데이터셋</li>
<li>Triplet으로 학습하므로 Anchor(기존 문장), Positive(같은 섹션 문장), Negative(다른 섹션 문장)으로 구성되어 있음</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/4018074f-6c00-40f1-ab3f-b5e79e8071b9/image.png" alt=""></p>
<ul>
<li>Accuracy는 Anchor가 어떤 문장에 더 가까운지 구별하는 척도</li>
</ul>
<h1 id="5-evaluation---senteval">5. Evaluation - SentEval</h1>
<ul>
<li>7개의 classification task를 갖는 SenEval에 대해 성능을 추가로 측정</li>
<li>MR, CR, SUBJ, MPQA, SST, TREC, MRPC</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/84c4ec74-4bd6-4c53-9a42-7d797b15f55c/image.png" alt=""></p>
<ul>
<li>7개 중 5개에서 SOTA에 버금가는 성능</li>
<li>transfer learning이 SBERT의 목적이 아님에도 불구하고 SBERT의 문장 임베딩 성능이 그만큼 뛰어나다는 것을 알 수 있다</li>
</ul>
<h1 id="6-ablation-study">6. Ablation Study</h1>
<ul>
<li>Pooling에서 Max, Mean, BERT의 [CLS] 중 왜 Mean을 썼는가?</li>
<li>목적함수 식은 왜 지금같이 이루어 지는가?</li>
<li>등에 대한 설명</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/6a4a51d9-9e4d-405f-9a60-c5e73e27e9bf/image.png" alt=""></p>
<ul>
<li>성능 평가 해보니 지금 같이 하는게 제일 좋았다.</li>
<li>특히 풀링에서 Mean 쓰는 것은 BiLSTM의 풀링에서는 Max를 쓰는게 유리한 것과는 대조적이다</li>
</ul>
<h1 id="7-computational-efficiency">7. Computational Efficiency</h1>
<ul>
<li>문장 간의 유사도 계산은 많은 연산이 필요하다</li>
<li>SBERT는 이를 많이 단축시켰다</li>
<li>근데 GPU로 병렬처리해서 연산하면 더 빠르다</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/13a9bee0-8301-4fae-a9d3-098310b1fbab/image.png" alt=""></p>
<h1 id="8-conclusion">8. Conclusion</h1>
<ul>
<li>기존 BERT를 사용한 문장의 임베딩 성능은 너무 낮았다.</li>
<li>그래서 우리는 샴 네트워크과 triplet 네트워크를 사용한 SBERT를 제안했다.</li>
<li>이 모델은 문장 임베딩 성능 개선을 보였고 연산 시간을 단축했음을 보였다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Attention Is All You Need | Transformer (2017)]]></title>
            <link>https://velog.io/@dutch-tulip/transformer</link>
            <guid>https://velog.io/@dutch-tulip/transformer</guid>
            <pubDate>Sun, 03 Sep 2023 08:38:42 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/pdf/1706.03762.pdf">[논문 링크]</a></p>
<p>From NIPS 2017</p>
<h1 id="0-abstract">0. Abstract</h1>
<ul>
<li>지금까지의 대부분 시퀀스 변환(sequence transduction) 모델들은 복잡한 RNN or CNN을 기반으로 한다.<ul>
<li>Encoder + Decoder 구조</li>
</ul>
</li>
<li>가장 성능이 뛰어난 모델들도 인코더와 디코더를 Attention mechanism으로 연결한 것</li>
<li>우리는 순환 구조와 합성곱 구조를 완전히 없애고 어텐션으로만 구성된 새로운 모델을 제안한다: Transformer</li>
<li>트랜스포머는 더 성능이 우수하면서도 병렬화가 가능하고 학습 시간이 짧다.</li>
<li>트랜스포머는 제한된 학습 데이터로 다른 task에도 일반화해서 적용 가능함을 확인했다. (ex. English constituency parsing)</li>
</ul>
<h1 id="1-introduction">1. Introduction</h1>
<ul>
<li>그동안 기계 번역 같은 transduction problem에서는 RNN, LSTM, GRU가 SOTA를 달성했다.</li>
<li>하지만 RNN 계열의 모델은 입력과 출력 시퀀스의 position을 순차적으로 계산하기 때문에 병렬 처리 및 일괄 처리가 제한됨<ul>
<li>h_t를 계산하기 위해 h_t-1과 t-1(input)이 제공되어야 함</li>
<li>t 이전의 모든 출력이 차례로 계산되어야지만 최종적인 output 생성 가능</li>
<li>이러한 문제는 시퀀스의 길이가 더 길수록 더 문제</li>
</ul>
</li>
<li>어텐션 매커니즘은 입출력 시퀀스의 길이에 상관없이 사용할 수 있어 많이 사용되지만, 대부분 RNN계열과 함께 사용됨.</li>
<li>그래서 우리는 RNN없이 어텐션만을 사용하는 transformer를 제안, 짧은 훈련 시간만으로도 SOTA 달성한다.</li>
</ul>
<h1 id="2-background">2. Background</h1>
<ul>
<li>(RNN 계열 모델들의 특징인) Sequential한 연산을 줄이려는 시도는 다양한 모델들에서 이루어져 왔다.<ul>
<li>Ex) Extended Neural GPU, ByteNet, ConvS2S</li>
</ul>
</li>
<li>이런 모델들은 CNN을 basic building block으로 사용하고, 모든 input과 output position에 대해 병렬 연산을 시도했다.<ul>
<li>하지만 이후 input과 output의 position을 연결하는데 필요한 연산이 너무나 폭등했고,</li>
<li>이로 인해 멀리 떨어진 position 간의 종속성(dependency)을 학습하는 것이 더욱 어려워졌다.</li>
<li>Transformer에서는 이 연산을 줄였지만 multi-head attention을 통해 그 부작용을 상쇄했다.</li>
</ul>
</li>
<li>Self-attention은 sequence의 representation을 계산하기 위해 한 sequence에서 다른 sequence를 연결하는 방식<ul>
<li>서로가 서로에게 가중치 부여</li>
<li>다른 다운스트림 작업에서 성공적으로 사용됨</li>
</ul>
</li>
<li>End-to-end memory network는 순차적인 recurrence 보다 recurrent attention에 기반하고, 간단한 언어의 question answering이나 language modeling task에서 좋은 성능을 보인다.</li>
<li>그럼에도 불구하고 Transformer는 순차적인 RNN이나 CNN을 사용하지 않고 입출력의 표현(representation)을 위해 오로지 attention에만 의존하는 최초의 모델이다.</li>
</ul>
<h1 id="3-model-architecture">3. Model Architecture</h1>
<ul>
<li>대부분의 시퀀스 변환 모델은 encoder-decoder 구조를 가진다.</li>
<li>인코더는 (x1, x2, … , x_n)이 입력 시퀀스로 주어지면 연속적인 표현인 Z = (z1, z2, …, z_n)으로 매핑한다.</li>
<li>디코더는 Z를 입력으로 받아 출력 시퀀스 (y1, y2, … , y_m)을 한번에 한 요소씩 생성한다.</li>
<li>transformer는 auto-regressive: 이전 단계에서 생성된 출력을 현재 단계의 추가적인 입력으로 사용하므로</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/50009c1d-e3ed-44f3-8f00-fdafd32d8a8d/image.png" alt=""></p>
<ul>
<li>트랜스포머의 전체적인 구조는 위와 같음</li>
</ul>
<h2 id="31-encoder-and-decoder-stacks">3.1 Encoder and Decoder Stacks</h2>
<ul>
<li>인코더<ul>
<li>6개의 동일한 레이어가 stack된 구조</li>
<li>각 레이어는 두 개의 sub-layer로 구성<ol>
<li>Multi-head self-attention mechanism</li>
<li>Position-wise Fully Connected Feed-Forward Network</li>
</ol>
</li>
<li>각 sub-layer에는 residual connection과 layer normalization을 적용<ul>
<li>LayerNorm(x+Sublayer(x))</li>
<li>residual connection을 용이하게 하기 위해 sub-layer와 embedding layer의 output의 차원은 512<ul>
<li>residual connection 하려면 input과 연결된 output의 차원이 같아야 하므로</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/e3fd6af5-f7a7-4aa3-a7a8-82875f509dde/image.png" alt=""></p>
<ul>
<li>디코더<ul>
<li>인코더처럼 6개의 동일한 레이어가 stack된 구조</li>
<li>인코더와 다르게 각 레이어에는 하나의 sub-layer가 추가됨<ol>
<li>Masked Multi-Head Self-Attention mechanism<ol>
<li>다음 스텝 position은 attention을 하지 않도록 masking</li>
<li>i번째 position을 예측할 때는 i보다 작은 position의 output만을 사용</li>
</ol>
</li>
<li>Multi-Head Self-Attention mechanism<ol>
<li>Encoder의 output에 대해 attention 연산을 수행</li>
</ol>
</li>
<li>Position-wise Fully Connected Feed-Forward Network</li>
</ol>
</li>
<li>인코더와 비슷하게 각 sub-layer에는 residual connection과  layer normalization이 적용</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/300e2692-2741-43e7-8cc7-5829fd714a8c/image.png" alt=""></p>
<h2 id="32-attention">3.2 Attention</h2>
<p>Attention은 query와 key-value 쌍 세트를 출력에 매핑하는 것이라고 할 수 있다. outputr은 value의 weighted-sum으로 계산된다.</p>
<h3 id="321-scaled-dot-product-attention">3.2.1 Scaled Dot-Product Attention</h3>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/60886946-bf8d-4ae3-b4c7-2e5c3a3f0382/image.png" alt=""></p>
<ul>
<li><p>Transformer에서 수행되는 attention은 ‘Scaled Dot-Prodoct Attention’이라고 부른다.</p>
<ul>
<li><p>이는 query와 key들을 모두 내적한 뒤 √dk로 나누어 주고, softmax 연산을 적용하는 것</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/37a10c6b-9b3a-447b-89f2-4f936319e9aa/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<ul>
<li>보통 자주 쓰이는 attention mechanism에는 Additive attention과 dot-product(multiplicative) attention 두가지가 있음<ol>
<li>Additive attention<ol>
<li>Single hidden layer로 구성된 feed-foward network를 사용해서 단어 간 일치도 계산</li>
</ol>
</li>
<li>Dot-product attention<ol>
<li>Scaling 된 점을 빼면 동일</li>
</ol>
</li>
</ol>
<ul>
<li>이론적 복잡도는 두 attention이 비슷하지만 실제 연산 속도와 공간 효율도가 dot-product attention이 휠씬 좋다.</li>
<li>dk값이 크면 내적이 커져서 기울기가 매우 작아지는 것으로 의심됨 → 스케일링으로 조정했다.</li>
</ul>
</li>
</ul>
<h3 id="322-multi-head-attention">3.2.2 Multi-Head Attention</h3>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/e458276e-9d38-40ce-ae67-c2b30ef0ad3c/image.png" alt=""></p>
<ul>
<li>단일 구조의 attention보다 h개의 attention을 선형으로 연결하는 것이 더 성능적으로 유리한 것을 확인했다. (h=8)</li>
<li>attention 연산들은 병렬로 수행되어 각각의 output을 생성하고 concat되어 최종 값이 된다.</li>
<li>Multi-head attention은 서로 다른 위치에 있는 단어에 집중(attention)하는 성능을 향상시켰다.<ul>
<li>8개의 Representation subspaces를 제공하여 여러 position의 representation에 대해 정보를 결합하여 attention 연산을 수행할 수 있기 때문</li>
</ul>
</li>
<li>Head의 output에서 차원이 축소되기 때문에, 총 계산 비용은 결론적으로 single head attention 과 유사하다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/88c910b5-eb5a-41ce-b0ae-e94c20036602/image.png" alt=""></p>
<h3 id="323-application-of-attention-in-our-model">3.2.3 Application of Attention in our Model</h3>
<p>Transformer에서는 Multi-head attention을 세가지 방식으로 사용했다:</p>
<ol>
<li>‘Encoder-decoder attention’ layer<ol>
<li>이 레이어의 query는 이전 단계의 decoder layer로부터 오고, key &amp; value는 encoder의 ouput으로부터 온다.</li>
<li>이는 decoder의 모든 position이 input sequence의 모든 position을 사용할 수 있게 한다.</li>
</ol>
</li>
<li>‘Encoder Self-attention’ layer<ol>
<li>Self-attention에서는 모든 query, key, value가 같은 곳에서 온다. 즉, 이전 단계 encoder의 출력이 현재 단계 encoder의 입력이 된다.</li>
<li>따라서 각 encoder layer는 이전 layer까지가 처리한 정보를 활용할 수 있다.</li>
</ol>
</li>
<li>‘Masked Decoder Self-attention’ layer<ol>
<li>Auto-regressive한 속성(출력값을 다시 입력으로 사용하는 것)을 보존하기 위해 뒤쪽의 position 정보를 참조하는 것을 막아주어야 하는데, transformer에서는 이를 위해 그러한 값들에 해당하는 softmax 값을 -∞로 마스킹했다.
<img src="https://velog.velcdn.com/images/dutch-tulip/post/95b15446-5bf2-4693-8286-612f47025137/image.png" alt="(논문에 없는 그림)">
<a href="https://velog.io/@aqaqsubin/Transformer-Attention-Is-All-You-Need">(논문에 없는 그림)</a></li>
</ol>
</li>
</ol>
<h2 id="33-position-wise-feed-forward-networks">3.3 Position-wise Feed-Forward Networks</h2>
<ul>
<li>Encoder와 Decoder는 둘다 각각 Fully Connected Feed-Forward Network를 통과한다.</li>
<li>동일한 구조를 갖고 있는 network를 encoder와 decoder에서 갖고 있어서 position-wise라고 부른다.</li>
<li>이 구조는 선형 변환 → ReLU → 선형 변환의 순서로 이루어진다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/f2d5280b-380c-4c70-9ec4-b1c6d3157797/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/e38a3b3c-8d02-4975-a79e-f95892d0b72d/image.png" alt="">
<a href="https://velog.io/@aqaqsubin/Transformer-Attention-Is-All-You-Need">(논문에 없는 그림)</a></p>
<ul>
<li>위 계산은 kernel size =1인 convolution을 두번 수행한 것으로 이해할 수도 있다.</li>
</ul>
<h2 id="34-embeddings-and-softmax">3.4 Embeddings and Softmax</h2>
<ul>
<li>다른 시퀀스 변환 모델 처럼 입력과 출력 토큰을 d_model 차원으로 변환시키기 위해 학습된 embedding을 사용했다.</li>
<li>선형 변환과 softmax도 학습된 것을 사용했다.</li>
<li>embedding layer 두개와 softmax 전 선형변환에서는 동일한 weight matrix를 사용한다.</li>
</ul>
<h2 id="35-positional-encoding">3.5 Positional Encoding</h2>
<ul>
<li>Transformer는 recurrent나 convolution을 사용하지 않으므로 시퀀스의 순서 정보를 사용하기 위해서는 토큰의 상대 or 절대 정보를 넣어줘야 할 필요가 있다.</li>
<li>그래서 encoder와 decoder의 embedding에 Positional Encoding을 더했다.</li>
<li>Positional Embedding은 d_model과 같은 512의 차원을 가지며, 이는 입력 임베딩과의 결합을 위한 것이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/9102fbb1-74ae-4870-8fee-73e3e39a38f9/image.png" alt=""></p>
<ul>
<li>position이 홀수일 때는 cos, 짝수일 때는 sin을 사용.</li>
</ul>
<h1 id="4-why-self-attention">4. Why Self-Attention</h1>
<ul>
<li><p>Self-attention을 Recurrent와 Convolution layer와 비교한다.</p>
</li>
<li><p>세가지 측면에서 self-attention을 쓰는 것이 유리했다.</p>
<ol>
<li><p>Layer 당 연산 복잡도</p>
</li>
<li><p>병렬화될 수 있는 연산의 양</p>
<p> → 순차적인 연산(sequential operation)의 숫자가 최소가 되는 방향으로 계산함</p>
</li>
<li><p>network 내 장거리 종속성(long-range dependency)의 최대 길이</p>
<ol>
<li>장거리 종속성을 학습시키는게 시퀀스 변환 모델들에게는 큰 과제였다.</li>
<li>이 학습에 영향을 미치는 요소는 순방향 및 역방향 신호가 통과해야 하는 경로의 <strong>‘길이’</strong>이다. </li>
<li>input과 output sequence의 position 사이 거리가 짧을수록 장거리 종속성을 배우기 더 쉽다.</li>
<li>따라서 우리는 input / output sequence의 position 사이의 maximum 거리 길이도 구해서 비교한다. </li>
</ol>
</li>
</ol>
</li>
</ul>
<h1 id="5-training">5. Training</h1>
<p>Transformer의 훈련 방식에 대해 설명한다.</p>
<h2 id="51-training-data-and-batching">5.1 Training Data and Batching</h2>
<ul>
<li>Training Data<ul>
<li>English-German dataset: Standard WMT 2014 Eng-Ger 450만 문장쌍<ul>
<li>Byte-pair 인코딩 사용</li>
</ul>
</li>
<li>English-French dataset: WMT 2014 Eng-Fre 3600만 문장<ul>
<li>Word-piece 임베딩 사용</li>
</ul>
</li>
</ul>
</li>
<li>Batching<ul>
<li>각 배치는 대략 25000 source 토큰과 25000 target 토큰을 포함하는 문장 쌍들을 담고 있다.</li>
</ul>
</li>
</ul>
<h2 id="52-hardware-and-schedule">5.2 Hardware and Schedule</h2>
<ul>
<li>P100 8개로 학습 돌렸다.</li>
<li>base model: 100,000 steps or 12시간 (step 당 0.4초)</li>
<li>big model: 300,000 steps(3.5일) (step 당 1초)</li>
</ul>
<h2 id="53-optimizer">5.3 Optimizer</h2>
<ul>
<li><p>Adam optimizer라는 최적화 알고리즘을 사용했다. (β1 = 0.9, β2 = 0.98, ϵ = 10−9)</p>
</li>
<li><p>learning rate는 다음과 같은 공식에 의해 조절했다.</p>
<p>  <img src="https://velog.velcdn.com/images/dutch-tulip/post/9bda8343-8631-4124-85bc-2a75daee6ea6/image.png" alt=""></p>
</li>
</ul>
<ul>
<li>위 공식은 warmup_steps(=4000) 단계에서는 learning rate를 선형적으로 증가시키고, 이후 단계에서는 step number의 역제곱근에 비례하여 leaning rate를 감소시키는 것을 의미한다.</li>
</ul>
<h2 id="54-regularization">5.4 Regularization</h2>
<ul>
<li>Residual Dropout<ul>
<li>각 sub-layer의 출력마다 그 출력이 다시 add &amp; norm 되기 전에 dropout을 해준다.</li>
<li>또한 embedding과 positional encodding 의 합들에도 dropout을 적용한다.</li>
<li>Base model에 사용한 dropout값 Pdrop = 0.1.</li>
</ul>
</li>
<li>Label Smoothing<ul>
<li>ϵls = 0.1의 label smoothing 값을 적용했다.</li>
<li>이는 모델이 더 불확실한 것을 학습하지만 오히려 모델의 정확성과 BLEU 점수를 향상시킨다.</li>
</ul>
</li>
</ul>
<h1 id="6-results">6. Results</h1>
<h2 id="61-machine-translation">6.1 Machine Translation</h2>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/a7f9415e-f59b-4054-babd-7c7762fc32dc/image.png" alt=""></p>
<ul>
<li><p>Eng-Ger 번역에서</p>
<ul>
<li>Big model은, (앙상블을 포함한) 기존 모델보다 2.0이 넘는 BLEU의 향상을 보이면서 28.4의 SOTA를 달성했다.</li>
<li>Base model조차도, 기존 모델들의 성능을 능가하며 training cost는 절약했다.</li>
</ul>
</li>
<li><p>Eng-Fre 번역에서</p>
<ul>
<li>Big model은, 41.8의 BLEU를 기록하며 SOTA를 달성했는데, 그러면서도 훈련 비용은 기존 SOTA 모델들보다 1/4로 줄였다.<ul>
<li>Pdrop=0.1 사용했다(0.3 대신)</li>
<li>20 checkpoint의 평균으로 얻어진 single model을 사용했다.</li>
</ul>
</li>
<li>Base model은, 5 checkpoint의 평균으로 얻어진 single model을 사용했다.</li>
</ul>
</li>
<li><p>Beam Search를 사용했다.</p>
<ul>
<li><p>Beam size = 4, Length Penalty α=0.6</p>
</li>
<li><p>위 파라미터는 development set에 대한 실험 이후에 결정됐다.</p>
</li>
<li><p>번역 시 최대 출력 길이는 입력 길이 +50이지만 최대한 짧게 출력한다.</p>
</li>
<li><p>Beam Search?</p>
<ul>
<li><p>확률이 높은 K개의 선택지만을 메모리에 관리 하면서 최상 우선 탐색을 진행하는 기법</p>
</li>
<li><p>즉 Best First Search에서 기억 노드의 수를 제한하는 것</p>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/709c5bec-0c92-4f20-a019-1ed07a7f1d93/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>    [(논문에 없는 그림)](https://d2l.ai/chapter_recurrent-modern/beam-search.html)

    - Length Penalty: 번역 길이가 길어지면 페널티를 주는 가중치
    - Beam size를 크게하면 번역 성능이 올라가지만 디코딩 속도가 낮아짐</code></pre><h2 id="62-model-variations">6.2 Model Variations</h2>
<ul>
<li>Transformer의 여러 구성 요소들의 중요성을 평가하기 위해 base model을 다양하게 수정해서 development set인 newstest2013에서 Eng-Ger 번역의 성능 변화를 측정했다.</li>
<li>Beam search는 사용했지만 Checkpoint averaging은 사용하지 않았다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/55a91949-82db-4d52-b0a3-711d80c18cd2/image.png" alt=""></p>
<ul>
<li>(A) 행에서는 3.2.2와 같이 Multi-head Attention의 head 수를 변경했다. single-head attention은 best setting 보다 BLEU가 0.9 낮지만, head가 너무 많으면 또 BLEU가 떨어진다.</li>
<li>(B) 행에서는 Attention의 key size(차원)인 d_k 값을 줄이면 모델의 성능이 줄어든다는 것을 알 수 있다. 이는 dot-product attention 보다 더 정교한 compatibility function이 존재할 수 있음을 시사한다.</li>
<li>(C) 행에서는 예상대로 더 큰(bigger) 모델이 더 좋다(better)는 것을 알 수 있다.</li>
<li>(D) 행에서는 dropout이 과적합을 피하는 데에 좋다는 것을 알 수 있다.</li>
<li>(E) 행에서는 기존에 사용한 Sinusoidal positional encoding을 learned positional encoding으로 바꿨는데 성능이 거의 동일했다.</li>
</ul>
<h2 id="63-english-constituency-parsing">6.3 English Constituency Parsing</h2>
<ul>
<li><p>Constituency Parsing</p>
<ul>
<li><p>구 단위 구문분석 (parsing에는 dependency parsing도 있음)</p>
</li>
<li><p>주어 + <strong>동사구</strong> → 동사 + <strong>명사구 →</strong> 정관사 + 명사</p>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/cd4a09bb-e741-4809-b59e-fe9b085e5e7e/image.png" alt=""></p>
<p><a href="https://ok-lab.tistory.com/57">(논문에 없는 그림)</a></p>
</li>
</ul>
</li>
<li><p>Transformer가 번역이 아닌 다른 작업에도 일반화할 수 있는지 평가하기 위해 영어 구 단위 구문 분석에 대한 실험을 수행했다.</p>
</li>
<li><p>이 작업은 구조적인 제약이 있고 입력보다 휠씬 더 긴 출력을 낸다는 특수한 과제를 갖고 있다.</p>
</li>
<li><p>WSJ의 문장에 대해 추가 학습을 시켰다. 일부는 반지도 학습을 시켰다.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/a4949a70-8b7e-4a12-be78-e11841c13d90/image.png" alt=""></p>
<ul>
<li>작업 별 튜닝이 부족했음에도 불구하고 transformer는 RNN 문법[8]을 제외하고 이전 모든 모델들보다 더 나은 성능을 보여준다.</li>
<li>RNN Seq2Seq[37]와 달리 Transformer는 40,000개의 WSJ 문장에 대해서만 훈련하는 경우에도 BerkeleyParser[29] 보다 성능이 뛰어나다.</li>
</ul>
<h1 id="7-conclusion">7. Conclusion</h1>
<ul>
<li>우리는 전적으로 Attention에만 의존한 시퀀스 변환 모델을 처음으로 제안했다.<ul>
<li>가장 흔하게 쓰이던 encoder-decoder 아키텍처를 multi-head self attention으로 바꿨다.</li>
</ul>
</li>
<li>번역 작업에서, Transformer는 recurrent나 convolution을 기반으로 하는 아키텍처보다 휠씬 빠르게 훈련할 수 있다. 우리는 Eng-Ger과 Eng-Fre에서 SOTA를 달성했다.</li>
<li>우리는 transformer를 텍스트 말고도 이미지, 오디오, 비디오 같은 대규모 입출력을 효율적으로 처리하기 위해 attention mechanism을 더 살펴볼 것이다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] BLEU: a Method for Automatic Evaluation of Machine Translation (2002)]]></title>
            <link>https://velog.io/@dutch-tulip/BLEU-a-Method-for-Automatic-Evaluation-of-Machine-Translation</link>
            <guid>https://velog.io/@dutch-tulip/BLEU-a-Method-for-Automatic-Evaluation-of-Machine-Translation</guid>
            <pubDate>Wed, 30 Aug 2023 09:43:38 GMT</pubDate>
            <description><![CDATA[<p><a href="https://aclanthology.org/P02-1040.pdf">[논문 링크]</a></p>
<p>#<strong>참고</strong>
기계 번역 = Machine Translation = MT</p>
<p>인간의 번역 = Human Translation = HT</p>
<h2 id="기존에-사용되던-metric-논문-외">기존에 사용되던 metric (논문 외)</h2>
<h3 id="1-perplexity-ppl">1. Perplexity (PPL)</h3>
<p>: a <strong><em>metric that quantifies how uncertain a model is about the predictions it makes</em></strong></p>
<p>→ 선택 가능한 경우의 수를 의미 (분기 계수, Branching Factor)</p>
<ul>
<li>특정 시점에서 평균적으로 몇 개에 선택지를 갖고 고민했는가?</li>
<li>더 낮은 PPL을 갖는 모델이 같은 테스트 데이터에 대해 더 일치할 것임</li>
</ul>
<p>PPL의 유의점</p>
<p>1) PPL 값 낮다는 것은 오직 test 데이터와의 일치율이 높은 것만을 의미할 뿐</p>
<ul>
<li>그게 사람이 느끼기에 진짜 좋은건 아닐 수도</li>
</ul>
<p>2) PPL 수치는 테스트 데이터의 좌우됨</p>
<ul>
<li>테스트 데이터가 달라지면 PPL 달라짐</li>
<li>test 데이터 자체도 양이 충분해야 함</li>
</ul>
<h3 id="2-cross-entropy">2. Cross Entropy</h3>
<p>: a measure of the difference between two probability distributions for a given random variable or set of events → 실제 데이터와 모델이 계산한 데이터의 확률 분포의 차이</p>
<h1 id="0-abstract">0. Abstract</h1>
<p>기계 번역(Machine Translation, MT)에 대한 사람의 평가는 포괄적이지만 비용이 많이 들고 시간이 오래 걸린다(수 주~ 수 개월). 따라서 우리는 빠르고 저렴하며 언어에 구애받지 않는 자동화된 기계 번역 평가 방법을 제안한다. </p>
<p><strong>B</strong>i<strong>L</strong>ingual <strong>E</strong>valuation <strong>U</strong>nderstudy → BLEU</p>
<h1 id="1-introduction">1. Introduction</h1>
<h2 id="선행-연구">선행 연구</h2>
<p>1994, 1999 - MT에 대한 인간 평가는 변역의 정확도, 충실도, 유창성 등 여러 측면 고려함</p>
<p>2001 - MT 평가 기법에 대한 문헌 제공됨</p>
<p>1999 - MT를 인간이 평가하는 방식은 비싸다</p>
<p>기계 번역 성능 확인 피드백 많지만 인간 평가는 한계(병목 현상) → 그래서 BLEU 제안</p>
<h2 id="main-idea">Main Idea</h2>
<p>: 번역된 문장이 인간이 한 전문적 번역에 가까울수록 성능이 좋은 것</p>
<p>그러기 위해서는?</p>
<ol>
<li>수치화된 ‘번역 근접성’ 지표 확보</li>
<li>좋은 품질의 인간 번역 말뭉치 확보</li>
</ol>
<p>문장의 번역은 정답이 없고 여러 번역이 존재할 수 있다. 인간은 좋은 번역, 나쁜 번역 구분 가능하지만 기계는 그렇지 않음. 다만 번역 문장과 레퍼런스 문장 간의 일치하는 단어나 구의 개수로 좋은 번역인지 판단 가능</p>
<h1 id="2-the-baseline-bleu-metric">2. The Baseline BLEU Metric</h1>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/72161b9b-753e-44dd-9162-c970a89a05f2/image.png" alt=""></p>
<h2 id="1-modified-n-gram-precision의-등장-배경">1) Modified n-gram precision의 등장 배경</h2>
<p>Example</p>
<p>Candidate 1: the the the the the the the.</p>
<p>Candidate 2: The cat is on the mat.</p>
<p>Reference: There is a cat on the mat.</p>
<table>
<thead>
<tr>
<th>n-gram</th>
<th>1-gram</th>
<th>2-gram</th>
<th>3-gram</th>
<th>4-gram</th>
</tr>
</thead>
<tbody><tr>
<td>Cand. 1</td>
<td>7/7</td>
<td>0/6</td>
<td>0/5</td>
<td>0/4</td>
</tr>
<tr>
<td>Cand 2</td>
<td>5/7</td>
<td>2/6</td>
<td>1/5</td>
<td>0/4</td>
</tr>
</tbody></table>
<p>Modified n-gram: Reference에서 한번 나온 단어는 더 이상 count하지 않음</p>
<p>→ 반복되는 단어에 대한 penalty 부여 가능</p>
<table>
<thead>
<tr>
<th>Modified n-gram</th>
<th>1-gram</th>
<th>2-gram</th>
<th>3-gram</th>
<th>4-gram</th>
</tr>
</thead>
<tbody><tr>
<td>Cand. 1</td>
<td><strong>7/7 → 2/7</strong></td>
<td>0/6</td>
<td>0/5</td>
<td>0/4</td>
</tr>
<tr>
<td>Cand 2</td>
<td><strong>5/7 → 5/7</strong></td>
<td>2/6</td>
<td>1/5</td>
<td>0/4</td>
</tr>
</tbody></table>
<h2 id="2-precision을-기하평균-하는-이유">2) Precision을 기하평균 하는 이유</h2>
<ul>
<li>n-gram에서 n 값이 증가할수록 정밀도가 지수적으로 떨어지는데, 일반적인 가중 산술 평균은 이를 반영하지 못함</li>
<li>로그의 가중 평균을 사용하는 기하 평균 방식을 사용(Geometric mean)</li>
<li>최대의 n-gram 값은 4가 적절함(실험적으로 얻은 결과)</li>
</ul>
<h2 id="3-brevity-penalty의-등장-배경">3) Brevity Penalty의 등장 배경</h2>
<p>→ Reference에 있는 모든 단어를 다 사용한다면? or 문장이 너무 짧다면?</p>
<p>Candidate 1: I always invariably perpetually do.</p>
<p>Candidate 2: I always.</p>
<p>Reference 1: I always do.</p>
<p>Reference 2: I invariably do.</p>
<p>Reference 3: I perpetually do.</p>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/d39862f8-dc1e-452b-9a05-5ba16864c8e7/image.png" alt=""></p>
<table>
<thead>
<tr>
<th></th>
<th>1-gram</th>
<th>2-gram</th>
<th>3-gram</th>
<th>BP</th>
</tr>
</thead>
<tbody><tr>
<td>Cand. 1</td>
<td>5/5</td>
<td>0/6</td>
<td>0/3</td>
<td>1 (c&gt;r)</td>
</tr>
<tr>
<td>Cand 2</td>
<td>2/2</td>
<td>1/1</td>
<td>-</td>
<td>0.x (c&lt;r)</td>
</tr>
</tbody></table>
<p>사실 reference 보다 긴 candidate는 이미 완전히 일치 하지 않는 이상 modified n-gram precision 의해 패널티를 받고 있음 → 그래서 짧은 문장에 패널티를 주는 BP 도입</p>
<h2 id="최종적인-bleu-계산">최종적인 BLEU 계산</h2>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/2c34c2d6-4c5c-43cd-a885-20351f6f7e66/image.png" alt=""></p>
<p>$$
w_{n}: weight (w_{n}&gt;0)</p>
<p>$$</p>
<p>$$
p_{n}: precision</p>
<p>$$</p>
<ul>
<li><p>0≤ BLEU ≤ 1 
→ 1에 가까울수록 더 좋음</p>
</li>
<li><p>레퍼런스와 동일하지 않는 이상 1일 수는 없음</p>
</li>
</ul>
<h1 id="3-the-bleu-evaluation">3. The BLEU Evaluation</h1>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/265c7e99-3326-4fd9-a38d-502bafd06599/image.png" alt=""></p>
<ul>
<li>S1 / S2 / S3 : 상업적인 시스템에 의한 기계 번역</li>
<li>H1 : 중국어, 영어 전문성이 부족한 인간 번역</li>
<li>H2 : 영어 전문성이 있는 인간 번역</li>
<li>S1&lt;S2&lt;S3&lt;&lt;&lt;H1&lt;H2</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/7fe4da86-922d-4b25-884a-d6b7bdc8dd05/image.png" alt=""></p>
<p>Table 1을 보고 드는 의문</p>
<ul>
<li>BLEU 지표 차이를 신뢰할 수 있나?</li>
<li>BLEU 지표의 분산은 얼마인가?</li>
<li>500개 문장이 달라진다면 여전히 S3가 S2보다 나을까?</li>
</ul>
<p>→ 그래서 25개로 구성된 20개 블록으로 나누고 paired t-test 진행</p>
<ul>
<li>Deviation(표준편차)이 크지 않음</li>
</ul>
<h1 id="4-the-human-evaluation">4. The Human Evaluation</h1>
<ul>
<li>Evaluated by rating from 1 (very bad) ~ 5 (very good)</li>
<li>Figure 3 : Monolingual group - 10 native English speakers</li>
<li>Figure 4 : Bilingual group - 10 native Chinese Speakers (lived in US for several years)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/0859fade-9a76-4744-b663-10a02c1ed35b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/141fedf5-a7b2-425b-931c-0c99697cdb6a/image.png" alt=""></p>
<ul>
<li>H1-S3의 수치가 큼 → HT를 높게 평가함</li>
</ul>
<h1 id="5-bleu-vs-the-human-evaluation">5. BLEU vs The Human Evaluation</h1>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/fb4d92a7-4c4d-4763-b36a-9e1da4c2e6e4/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/7e405afa-f1f6-4db7-b321-4b9fcb743333/image.png" alt=""></p>
<ul>
<li>각 점이 왼쪽에서 오른쪽으로 갈수록 S1, S2, S3, H1, H2 의미</li>
<li>Monolingual 상관관계 계수: <strong>0.99</strong></li>
<li>Bilingual 상관관계 계수: <strong>0.96</strong></li>
<li>특히 BLEU가 인접한 S2, S3 구별해낸게 흥미로움</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dutch-tulip/post/6904f6ca-b3f6-41ed-a1c4-f012a968f623/image.png" alt=""></p>
<ul>
<li>BLEU와 monolingual은 높은 상관 관계</li>
<li>MT와 HT에는 수치적으로 차이 존재</li>
<li>Bilingual은 H1, H2 큰 차이 두지 않음</li>
</ul>
<h1 id="6-conclusion">6. Conclusion</h1>
<ul>
<li>텍스트 말뭉치에서 개별적인 문장 판단의 오류를 평균화함으로써 인간이 하는 판간과 높은 상관 관계를 수치화함</li>
<li>MT R&amp;D 사이클의 가속화를 기대</li>
<li>텍스트 summarization 평가나 비슷한 NLG task에서 사용을 기대</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>