<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>HYE_bang.log</title>
        <link>https://velog.io/</link>
        <description>AI &amp; Robotics</description>
        <lastBuildDate>Fri, 06 Mar 2026 11:16:58 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>HYE_bang.log</title>
            <url>https://velog.velcdn.com/images/mit_bang/profile/1bff20e3-9878-4040-8aae-1c587cd549e5/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. HYE_bang.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/mit_bang" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[바닥부터 배우는 강화학습] - Chapter 9. 정책 기반 에이전트 2 (Actor-Critic)]]></title>
            <link>https://velog.io/@mit_bang/9-2</link>
            <guid>https://velog.io/@mit_bang/9-2</guid>
            <pubDate>Fri, 06 Mar 2026 11:16:58 GMT</pubDate>
            <description><![CDATA[<p>딥러닝과 정책 함수가 결합하면 강력한 정책 네트워크를 만들어 냅니다. 이번 챕터에서는 보상 및 밸류 네트워크를 이용해 직접적으로 정책 네트워크를 학습하는 방법에 대해 알아보겠습니다. 이는 수많은 최신 강화학습 알고리즘의 뿌리가 되는 방법론입니다.</p>
<hr>
<h1 id="93-액터-크리틱">9.3 액터-크리틱</h1>
<ul>
<li>Actor-Critic : 정책 네트워크와 밸류 네트워크를 함께 학습하는 이론</li>
</ul>
<br/>

<h2 id="q-액터-크리틱">Q 액터-크리틱</h2>
<ul>
<li>$\nabla_\theta J(\theta)=\mathbb{E}<em>{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * Q</em>{\pi_\theta}(s,a)]$<ul>
<li>REINFORCE 알고리즘은 여기서 $Q_{\pi_\theta}(s,a)$ 자리에 그 샘플의 리턴 $G_t$를 사용함 <br/><br/></li>
<li>$Q_{\pi_\theta}(s,a)$를 리턴 $G_t$로 대체하지 않고 그대로 사용한것이 Q 액터-크리틱임 <br/><br/></li>
<li>$Q_{\pi_\theta}(s,a)$는 미지의 함수이기 때문에, w로 파라미터화된 뉴럴넷 $Q_w(s,a) \approx Q_{\pi_\theta}(s,a)$를 도입함 <br/><ul>
<li>즉, $\theta$로 파라미터화된 정책 네트워크 $\pi_\theta$와 w로 파라미터화된 밸류 네트워크 $Q_w$ 이렇게 2개의 뉴럴넷을 함께 학습함</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li>$\pi_\theta$는 실행할 액션 a를 선택하는, 즉 행동하는 <strong>액터(actor)</strong> 역할이고, $Q_w$는 선택된 액션 a의 밸류를 평가하는 <strong>크리틱(critic)</strong> 역할임 <br/><br/></li>
<li>에이전트의 학습 과정에서 정책 $\pi_\theta$와 밸류 Q를 모두 학습하는 방식을 액터-크리틱이라고 함</li>
</ul>
<br/>

<h3 id="q-actor-critic-pseudo-code"><strong>Q Actor-Critic pseudo code</strong></h3>
<blockquote>
<ol>
<li>정책, 액션-밸류 네트워크의 파라미터 $\theta$와 w를 초기화 <br/><br/></li>
<li>상태 s를 초기화 <br/><br/></li>
<li>액션 $a \sim \pi_\theta(a|s)$를 샘플링 <br/><br/></li>
<li>스텝마다 다음(A~E)을 반복</li>
</ol>
</blockquote>
<ul>
<li>A. a를 실행하여 보상 r과 다음 상태 s&#39;을 얻음 <br/><br/></li>
<li>B. $\theta$ 업데이트: $\theta \leftarrow \theta + \alpha \nabla_\theta \log \pi_\theta(s,a) * Q_w(s,a)$ <br/><br/></li>
<li>C. 액션 $a&#39; \sim \pi_\theta(a&#39;|s&#39;)$를 샘플링 <br/><br/></li>
<li>D. w 업데이트: $w \leftarrow w + \beta (r + \gamma Q_w(s&#39;,a&#39;) - Q_w(s,a))\nabla_w Q_w(s,a)$ <br/><br/></li>
<li>E. $a \leftarrow a&#39;, ; s \leftarrow s&#39;$</li>
</ul>
<ul>
<li>정책 네트워크 $\pi_\theta$와 밸류 네트워크 $Q_w$가 함께 학습됨 <br/><br/></li>
<li>핵심은 $\theta$를 업데이트할 때 실제 보상 값이 전혀 쓰이지 않고 오로지 크리틱 $Q_w$에 의존하여 학습이 이루어지는 점임</li>
</ul>
<br/>

<hr>
<h2 id="어드밴티지-액터-크리틱">어드밴티지 액터-크리틱</h2>
<ul>
<li>$\nabla_\theta J(\theta)=\mathbb{E}<em>{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * Q</em>{\pi_\theta}(s,a)]$<ul>
<li>$\nabla_\theta \log \pi_\theta(s,a)$은 벡터이고, $Q_{\pi_\theta}(s,a)$는 스칼라 값임 (상태 s에서 액션 a를 하고 얻게 되는 리턴의 기대값) <br/><br/></li>
</ul>
</li>
<li>여기서 문제가 애초에 s&#39;이 매우 좋은 상태일경우, s&#39;에서 어떤 액션을 택하든 이후에 얻게 되는 리턴이 높은 상황이됨<ul>
<li>ex) $Q(s&#39;, a_0)=1000$, $Q(s&#39;, a_1)=1050$ 인 상황 <br/><br/></li>
<li>이때 policy gradient 식을 이용해 업데이트하면 둘 다 비슷하게 강화됨.<ul>
<li>$a_1$이 근소하게 크기 때문에 확률차이가 발생하긴하는데 그러기 위해서는 수많은 샘플을 필요 <br/></li>
<li>샘플을 무한히 많이 모아서 계산하면 해결할 수 있긴 하지만 “효율적인가”하는 부분에서는 고민을 해야함 <br/></li>
</ul>
</li>
<li>즉, s&#39;에서는 $a_0$보다 $a_1$이 더 좋은 액션인데 둘 다 강화됨 <br/><br/></li>
</ul>
</li>
<li>$\nabla_\theta J(\theta) = \mathbb{E}<em>{\pi_\theta}\left[\nabla_\theta \log \pi_\theta(s,a) * \left{Q</em>{\pi_\theta}(s,a) - V_{\pi_\theta}(s)\right}\right]$<ul>
<li>위와 같이 모든 상태에서 업데이트할 때, 각 상태의 밸류인 $V_{\pi_\theta}(s)$를 빼서 해결함</li>
<li>$Q_{\pi_\theta}(s,a)-V_{\pi_\theta}(s)$는 상태 s에 있는 것보다 액션 a를 실행함으로써 “추가”로 얼마의 가치를 더 얻게 되는 것인지를 의미함 → 이 값을 <strong>어드밴티지(advantage)</strong> $A_{\pi_\theta}(s,a)$라고 함 <br/><br/></li>
</ul>
</li>
<li>$A_{\pi_\theta}(s,a)\equiv Q_{\pi_\theta}(s,a)-V_{\pi_\theta}(s)$<ul>
<li>$V_{\pi_\theta}(s)$를 <strong>기저(baseline)</strong> 라고 함</li>
<li>상태 s에 도착하는 사건은 이미 벌어진 일이기 때문에 주어진 것으로 받아들이고, 거기서 액션 a를 했을 때 현재보다 미래가 어떻게 변화하는 가를 통해 액션의 확률을 수정하는 것</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li>$V_{\pi_\theta}(s)$를 빼도 되는가?<ul>
<li>기존 수식에서 $V_{\pi_\theta}(s)$를 뺄 수 있으려면 다음이 성립해야함</li>
</ul>
</li>
</ul>
<blockquote>
<p>$\mathbb{E}<em>{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * Q</em>{\pi_\theta}(s,a)]$ <br/>
$= \mathbb{E}<em>{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * {Q</em>{\pi_\theta}(s,a)-V_{\pi_\theta}(s)}]$ <br/>
$= \mathbb{E}<em>{\pi_\theta}[\nabla_\theta \log \pi _\theta(s,a) * Q</em>{\pi_\theta}(s,a)] - \mathbb{E}<em>{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * V</em>{\pi_\theta}(s)]$ <br/>
즉, $\mathbb{E}<em>{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * V</em>{\pi_\theta}(s)]=0$</p>
</blockquote>
<br/>

<h2 id="증명">증명</h2>
<ul>
<li>사실 $V_{\pi_\theta}(s)$를 빼도 괜찮을 뿐만 아니라 상태 s에 대한 그 임의의 함수를 빼도됨<ul>
<li>어떤 함수가 액션 a에 대한 함수가 아니기만하면 됨 <br/><br/></li>
</ul>
</li>
<li>상태 s에 대한 임의의 함수를 B(s)라고 할때, B(s)는 상태 s를 넣었을때 숫자 값 하나를 리턴하는 함수임<ul>
<li>$V_{\pi_\theta}(s)$는 B(s)의 특별한 경우 <br/><br/></li>
</ul>
</li>
<li>상태 s에 관한 임의의 함수 B(s)에 대해 다음이 성립함<ul>
<li>$\mathbb{E}_{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * B(s)] = 0$ <br/><br/></li>
</ul>
</li>
<li>먼저 <strong>상태 분포(state distribution)</strong> $d_\pi(s)$를 정의<ul>
<li>상태 분포는 정책 $\pi$를 따라서 움직이는 에이전트가 각 상태에 평균적으로 머무는 비율을 나타내는 분포 → 즉, 정책 $\pi$가 정해져야 정의될 수 있는 분포임
<img src="https://velog.velcdn.com/images/mit_bang/post/79884b43-8cd7-4af9-ad07-b86ce290cce7/image.png" alt=""></li>
<li>어떤 정책 $\pi$를 이용해 움직이는 에이전트를 출발점에 놓고 종료 상태에 도착할 때까지 그 경로를 총 3번 그린것 → 상태별 방문 빈도를 나타낸 것이 $d_\pi(s)$임 <br/><br/></li>
<li>이 상태 분포 $d_{\pi_\theta}(s)$를 이용해 기존에 구했던 기댓값을 풀어 쓸 수 있음<ul>
<li>이 $d_{\pi}(s)$는 1-스텝 MDP의 d(s)와 같음 → 1-스텝에서는 시작하는 상태에서 바로 종료 상태로 가기 때문에 시작하는 상태의 분포가 곧 $d_{\pi}(s)$이기 때문 <br/><br/></li>
</ul>
</li>
</ul>
</li>
<li>$\mathbb{E}<em>{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * B(s)]  =  \sum</em>{s\in S} d_{\pi_\theta}(s)\sum_{a\in A}\pi_\theta(s,a)\nabla_\theta \log \pi_\theta(s,a) * B(s)$<ul>
<li>존재하는 모든 상태에 대해 각 상태에 있을 확률과 각 상태에서 어떤 액션을 선택할 확률을 곱하여 더해줌 (기대값의 정의)</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li>증명<blockquote>
<p>$\sum_{s\in S} d_{\pi_\theta}(s)\sum_{a\in A}\pi_\theta(s,a)\nabla_\theta \log \pi_\theta(s,a) * B(s)$ <br/>
$= \sum_{s\in S} d_{\pi_\theta}(s)\sum_{a\in A}\pi_\theta(s,a)\frac{\nabla_\theta \pi_\theta(s,a)}{\pi_\theta(s,a)} * B(s)$ <br/>
$= \sum_{s\in S} d_{\pi_\theta}(s)\sum_{a\in A}\nabla_\theta \pi_\theta(s,a) * B(s)$ <br/>
$= \sum_{s\in S} d_{\pi_\theta}(s)B(s)\sum_{a\in A}\nabla_\theta \pi_\theta(s,a)$ <br/>
$= \sum_{s\in S} d_{\pi_\theta}(s)B(s)\nabla_\theta \sum_{a\in A}\pi_\theta(s,a)$ <br/>
$= \sum_{s\in S} d_{\pi_\theta}(s)B(s)\nabla_\theta 1$ <br/>
= 0 <br/>
$\therefore; \mathbb{E}_{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * B(s)]=0$</p>
</blockquote>
</li>
</ul>
<ul>
<li>어드밴티지 액터-크리틱의 Policy gradient는 다음과 같게 됨<ul>
<li>$\nabla_\theta J(\theta)=\mathbb{E}<em>{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * A</em>{\pi_\theta}(s,a)]$<ul>
<li>$A_{\pi_\theta}(s,a)=Q_{\pi_\theta}(s,a)-V_{\pi_\theta}(s)$ <br/><br/></li>
</ul>
</li>
</ul>
</li>
<li>어드밴티지를 사용하여 policy gradient를 계산하면 분산이 줄어들어 훨씬 안정적인 학습이 가능함<ul>
<li>$Q_{\pi_\theta} \approx Q_w$ , $V_{\pi_\theta} \approx V_\phi(s)$</li>
<li>실제 가치 함수를 알 수 없기 때문에 뉴럴넷을 이용하여 근사함 <br/><br/></li>
</ul>
</li>
<li>즉, 학습을 위해선 3개의 뉴럴넷을 필요함<ul>
<li>정책 함수 $\pi_\theta(s,a)$의 뉴럴넷 $\theta$</li>
<li>액션-가치 함수 $Q_w(s,a)$의 뉴럴넷 w</li>
<li>가치 함수 $V_\phi(s)$의 뉴럴넷 $\phi$</li>
</ul>
</li>
</ul>
<br/>

<h3 id="advantage-actor-critic-pseudo-code">Advantage Actor-Critic pseudo code</h3>
<blockquote>
<ol>
<li>3쌍의 네트워크 파라미터 $\theta$, w, $\phi$를 초기화 <br/><br/></li>
<li>상태 s를 초기화 <br/><br/></li>
<li>액션 $a \sim \pi_\theta(a|s)$를 샘플링 <br/><br/></li>
<li>스텝마다 다음(A~F)을 반복 
A. a를 실행하여 보상 r과 다음 상태 s&#39;을 얻음 <br/>
B. \theta 업데이트 : $\theta \leftarrow \theta + \alpha_1 \nabla_\theta \log \pi_\theta(s,a) * {Q_w(s,a)-V_\phi(s)}$ <br/>
C. 액션 $a&#39; \sim \pi_\theta(a&#39;|s&#39;)$를 샘플링 <br/>
D. w 업데이트: $w \leftarrow w + \alpha_2 (r + \gamma Q_w(s&#39;,a&#39;) - Q_w(s,a))\nabla_w Q_w(s,a)$ <br/>
E. $\phi$  업데이트: $\phi \leftarrow \phi + \alpha_3 (r + \gamma V_\phi(s&#39;) - V_\phi(s))\nabla_\phi V_\phi(s)$ <br/>
F. $a \leftarrow a&#39;,; s \leftarrow s&#39;$</li>
</ol>
</blockquote>
<ul>
<li>즉, 정책 네트워크와 밸류 네트워크, 액션-밸류 네트워크가 함께 학습함<ul>
<li>밸류 네트워크는 모두 TD방식으로 학습</li>
</ul>
</li>
</ul>
<br/>

<hr>
<h2 id="td-액터-크리틱">TD 액터-크리틱</h2>
<ul>
<li>Q 액터-크리틱에 비해 어드밴티지 액터-크리틱은 그라디언트 추정치의 변동성을 줄여줌으로써 학습 효율에 이점이 있지만, $\pi_\theta,$ $V_\phi$, $Q_w$ 이렇게 3쌍의 뉴럴넷을 필요로 하기 때문에 구현이 복잡하고 학습이 오래걸리는 단점이 존재함 <br/><br/></li>
<li>V(s)의 TD 에러 $\delta$는 다음과 같음<ul>
<li>$\delta = r + \gamma V(s&#39;) - V(s)$ <br/><br/></li>
</ul>
</li>
<li>여기서 상태 s에서 어떤 액션 a를 실행했을 때 $\delta$의 기댓값을 계산하면<ul>
<li>$\mathbb{E}_\pi[\delta|s,a] = \mathbb{E}_\pi[r + \gamma V(s&#39;) - V(s)|s,a]$
$= \mathbb{E}_\pi[r + \gamma V(s&#39;)|s,a] - V(s)$
$= Q(s,a) - V(s) = A(s,a)$ <br/><br/></li>
</ul>
</li>
<li>즉, TD 에러인 $\delta$의 기댓값이 어드밴티지 A(s,a)와 동일함<ul>
<li>$\delta$는 A(s,a)의 <strong>불편 추정량(unbiased estimate)</strong>임</li>
<li>$\delta$ 값은 같은 상태 s에서 같은 액션 a를 선택해도 상태 전이 확률에 따라 매번 다른 값을 얻는데, 이 값을 모아서 평균내면 그 값이 A(s,a)로 수렴한다는 뜻임 <br/><br/></li>
</ul>
</li>
<li>$\nabla_\theta J(\theta)=\mathbb{E}_{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * \delta]$<ul>
<li>$\delta$는 상태 가치 함수 V만 있으면 계산할 수 있는 값이기 때문에 Q가 없어도 계산이 가능함</li>
</ul>
</li>
</ul>
<br/>

<h3 id="td-actor-critic-pseudo-code">TD Actor-Critic pseudo code</h3>
<blockquote>
<ol>
<li>정책, 밸류 네트워크의 파라미터 $\theta$와 $\phi$를 초기화 <br/><br/></li>
<li>액션 $a \sim \pi_\theta(a|s)$를 샘플링 <br/><br/></li>
<li>스텝마다 다음(A~E)을 반복
 A. a를 실행하여 보상 r과 다음 상태 s&#39;을 얻음 <br/>
 B. $\delta$를 계산: $\delta \leftarrow r + \gamma V_\phi(s&#39;) - V_\phi(s)$ <br/>
 C. $\theta$ 업데이트: $\theta \leftarrow \theta + \alpha_1 \nabla_\theta \log \pi_\theta(s,a) * \delta$ <br/>
 D. $\phi$ 업데이트: $\phi \leftarrow \phi + \alpha_2 \delta \nabla_\phi V_\phi(s)$ <br/>
 E. $a \leftarrow a&#39;,; s \leftarrow s&#39;$</li>
</ol>
</blockquote>
<br/>

<h2 id="td-actor-critic-구현"><a href="https://github.com/BDH-teacher/RL_from_basics/blob/main/RL_from_basic_ch_9_ActorCriticipynb.ipynb">TD Actor-Critic 구현</a></h2>
<br/>

<hr>
<h3 id="summary">Summary</h3>
<blockquote>
<p>$\nabla_\theta J(\theta)$ <br/>
$=\mathbb{E}<em>{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * Q</em>{\pi_\theta}(s,a)]
\quad #\ \text{Policy Gradient Theorem}$ <br/>
$=\mathbb{E}<em>{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * G_t]
\quad\quad\quad#\ \text{REINFORCE}$ <br/>
$=\mathbb{E}</em>{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * Q_w(s,a)]
\quad #\ \text{Q Actor Critic}$ <br/>
$=\mathbb{E}<em>{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * A_w(s,a)]
\quad #\ \text{Advantage Actor Critic}$ <br/>
$=\mathbb{E}</em>{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * \delta]
\quad\quad\quad\quad #\ \text{TD Actor Critic}$</p>
</blockquote>
<ul>
<li>앞의 $\nabla_\theta \log \pi_\theta(s,a)$까지는 같고 뒤에 어떤 값이 곱해지느냐에 따라 차이가 생김</li>
</ul>
<br/>

<ul>
<li>policy gradient : 실제 가치 함수인 $Q_{\pi_\theta}$를 사용하여 계산하면 그것이 곧 목적 함수 $J(\theta)$의 그라디언트와 같음을 이용 <br/><br/></li>
<li>REINFORCE : 리턴 $G_t$가 $Q_{\pi_\theta}$의 샘플이었기 때문에 $G_t$를 대신 사용 <br/><br/></li>
<li>Q Actor-Critic : $Q_{\pi_\theta}$ 자리에 뉴럴넷을 이용해 학습한 $Q_w$를 사용 <br/><br/></li>
<li>Advantage Actor-Critic : Q Actor-Critic에서 그라디언트 추정치의 분산을 줄이고자 Advantage($A_w$)를 사용 <br/><br/></li>
<li>TD Actor Critic : $\delta$가 Advantage의 샘플임을 이용하여 $\delta$를 대신 사용</li>
</ul>
<p><br/><br/><br/><br/><br/><br/></p>
<h1 id="1단계-자동-apt-개입-막기">1단계. 자동 apt 개입 막기</h1>
<p>백그라운드 apt가 또 끼어들면 다시 꼬입니다.</p>
<pre><code class="language-bash">sudo systemctl stop apt-daily.service apt-daily-upgrade.service
sudo systemctl mask apt-daily.service apt-daily-upgrade.service</code></pre>
<p>확인:</p>
<pre><code class="language-bash">systemctl is-active apt-daily.service apt-daily-upgrade.service</code></pre>
<p>둘 다 <code>inactive</code> 또는 <code>unknown</code> 비슷하게 나오면 됩니다.</p>
<hr>
<h1 id="2단계-문제-서비스-막기">2단계. 문제 서비스 막기</h1>
<p>지금 사진상 핵심은 <code>binfmt-support.service</code> 쪽입니다.</p>
<pre><code class="language-bash">sudo systemctl stop binfmt-support.service
sudo systemctl disable binfmt-support.service
sudo systemctl mask binfmt-support.service</code></pre>
<p>확인:</p>
<pre><code class="language-bash">systemctl status binfmt-support.service</code></pre>
<p><code>masked</code>이면 됩니다.</p>
<hr>
<h1 id="3단계-dpkg-꼬인-상태-복구">3단계. dpkg 꼬인 상태 복구</h1>
<p>먼저 현재 상태 점검:</p>
<pre><code class="language-bash">sudo dpkg -C
sudo dpkg --audit</code></pre>
<p>그다음 복구:</p>
<pre><code class="language-bash">sudo dpkg --configure -a</code></pre>
<p>이게 또 중간에 멈추면, 로그 저장 방식으로 다시 돌리세요.</p>
<pre><code class="language-bash">sudo dpkg --configure -a &gt; ~/dpkg-configure.log 2&gt;&amp;1
tail -n 100 ~/dpkg-configure.log</code></pre>
<hr>
<h1 id="4단계-깨진-의존성-복구">4단계. 깨진 의존성 복구</h1>
<pre><code class="language-bash">sudo apt-get check
sudo apt-get -f install</code></pre>
<p>멈추면 이것도 로그로:</p>
<pre><code class="language-bash">sudo apt-get -f install &gt; ~/apt-fix.log 2&gt;&amp;1
tail -n 100 ~/apt-fix.log</code></pre>
<hr>
<h1 id="5단계-binfmt-support-패키지-상태-확인">5단계. binfmt-support 패키지 상태 확인</h1>
<pre><code class="language-bash">dpkg -l | grep binfmt</code></pre>
<p>여기서 <code>ii</code>가 아니고 <code>iU</code>, <code>iF</code>, <code>rc</code> 같이 이상한 상태면 정리해야 합니다.</p>
<h3 id="재설치-시도">재설치 시도</h3>
<pre><code class="language-bash">sudo apt-get install --reinstall binfmt-support</code></pre>
<p>이게 또 멈추거나 실패하면 제거 후 복구:</p>
<pre><code class="language-bash">sudo apt-get remove --purge binfmt-support
sudo dpkg --configure -a
sudo apt-get -f install</code></pre>
<hr>
<h1 id="6단계-ros-관련-패키지-설치-상태-확인">6단계. ROS 관련 패키지 설치 상태 확인</h1>
<p>지금 <code>ros-melodic-desktop-full</code> 설치 도중 멈춘 거라 상태를 봐야 합니다.</p>
<pre><code class="language-bash">dpkg -l | grep ros-melodic</code></pre>
<p>패키지가 반쯤 걸쳐 있으면 우선 전체 configure부터 끝내는 게 맞습니다.
그래서 보통은 <strong>ROS를 바로 다시 설치하지 말고</strong>, 위 3~5단계를 먼저 끝내야 합니다.</p>
<hr>
<h1 id="7단계-ros-설치-다시-시도">7단계. ROS 설치 다시 시도</h1>
<p>위 복구가 끝난 뒤에만 다시:</p>
<pre><code class="language-bash">sudo apt update
sudo apt install ros-melodic-desktop-full</code></pre>
<p>설치 중 화면이 멈추는지 보려면 그냥 실행해도 되지만,
지금 환경은 불안정하니 로그로 남기는 걸 추천합니다.</p>
<pre><code class="language-bash">sudo apt install ros-melodic-desktop-full &gt; ~/ros-melodic-install.log 2&gt;&amp;1
tail -n 100 ~/ros-melodic-install.log</code></pre>
<hr>
<h1 id="8단계-설치-끝나면-환경설정">8단계. 설치 끝나면 환경설정</h1>
<p>설치가 끝났다면:</p>
<pre><code class="language-bash">echo &quot;source /opt/ros/melodic/setup.bash&quot; &gt;&gt; ~/.bashrc
source ~/.bashrc</code></pre>
<p>확인:</p>
<pre><code class="language-bash">roscore --version</code></pre>
<p>또는</p>
<pre><code class="language-bash">which roscore</code></pre>
<hr>
<h1 id="9단계-자동-apt-다시-풀기">9단계. 자동 apt 다시 풀기</h1>
<p>복구와 설치가 다 끝났을 때만:</p>
<pre><code class="language-bash">sudo systemctl unmask apt-daily.service apt-daily-upgrade.service</code></pre>
<hr>
<h1 id="한-번에-복붙용">한 번에 복붙용</h1>
<p>아래는 핵심 복구 묶음입니다.</p>
<pre><code class="language-bash">sudo systemctl stop apt-daily.service apt-daily-upgrade.service
sudo systemctl mask apt-daily.service apt-daily-upgrade.service

sudo systemctl stop binfmt-support.service
sudo systemctl disable binfmt-support.service
sudo systemctl mask binfmt-support.service

sudo dpkg -C
sudo dpkg --audit
sudo dpkg --configure -a
sudo apt-get check
sudo apt-get -f install

dpkg -l | grep binfmt
dpkg -l | grep ros-melodic</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[바닥부터 배우는 강화학습] - Chapter 9. 정책 기반 에이전트 1 (Policy Gradient)]]></title>
            <link>https://velog.io/@mit_bang/9-1</link>
            <guid>https://velog.io/@mit_bang/9-1</guid>
            <pubDate>Fri, 06 Mar 2026 11:15:49 GMT</pubDate>
            <description><![CDATA[<p>딥러닝과 정책 함수가 결합하면 강력한 정책 네트워크를 만들어 냅니다. 이번 챕터에서는 보상 및 밸류 네트워크를 이용해 직접적으로 정책 네트워크를 학습하는 방법에 대해 알아보겠습니다. 이는 수많은 최신 강화학습 알고리즘의 뿌리가 되는 방법론입니다.</p>
<hr>
<h1 id="91-policy-gradient">9.1 Policy Gradient</h1>
<ul>
<li>가치 기반 에이전트가 액션을 선택하는 방식은 <strong>결정론적(deterministic)</strong>임<ul>
<li>즉, 모든 상태 s에 대해 각 상태에서 선택하는 액션이 변하지 않음</li>
<li>학습이 끝나면 Q(s,a)의 값이 고정되기 때문임 <br/><br/></li>
</ul>
</li>
<li>정책 기반 에이전트는 확률적 정책(stochastic policy)을 취할 수 있음<ul>
<li>정책 함수의 정의가 $\pi(s,a) = \mathbb{P}[a \mid s]$ 임으로 즉, 상태 s에서 할 수 있는 액션에 대한 확률 분포를 가리키기 때문임 <br/><br/></li>
</ul>
</li>
<li>만약 <strong>액션 공간(action space)</strong>이 <strong>연속적(continuous)</strong>인 경우 즉, 0에서 1 사이의 모든 실수값이 액션으로 선택될 수 있는 상황일때<ul>
<li>가치 기반 에이전트가 작동하려면 모든 $a \in [0,1]$에 대해 Q(s,a)의 값을 최대로 하는 입력 a를 찾아야함 → 이 자체로 하나의 최적화 문제가 되기 때문에 연속적 액션 공간에서는 Q(s,a) 기반 에이전트가 작동하기 힘듬 <br/><br/></li>
<li>정책 기반 에이전트는 $\pi(s)$가 주어져 있다면 바로 액션을 뽑아줄 수 있기 때문에 문제없음 <br/><br/></li>
<li>또한 정책 기반 방법론이 가치 기반 방법론에 비해 환경에 숨겨진 정보가 있거나, 환경 자체가 변하는 경우에도 더 유연하게 대처할 수 있음</li>
</ul>
</li>
</ul>
<br/>

<h2 id="목적-함수-정하기">목적 함수 정하기</h2>
<ul>
<li>(정책 네트워크를 $\pi_\theta(s,a)$로, $\theta$는 정책 네트워크의 파라미터로 표현) <br/><br/></li>
<li>목표는 환경에 $\pi_\theta(s,a)$로 움직이는 에이전트를 가져다 놓아 경험을 쌓게 하고, 그 경험으로부터 $\pi_\theta(s,a)$를 계속해서 강화하는 것임<ul>
<li>$\pi_\theta(s,a)$를 업데이트 한다는 것은 결국 뉴럴넷의 파라미터를 업데이트 하는 것이니 그라디언트 디센트 방법론을 사용함 → 손실 함수를 정의 해야 사용 가능</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<p>$\pi_\theta(s,a)$의 손실 함수를 어떻게 정의하지...?</p>
</blockquote>
<ul>
<li>손실 함수가 정의되어야 이를 줄이는 방향으로 파라미터를 업데이트있는데, 손실 함수를 정의하려면 먼저 정답지가 정의되어야 됨 (뉴럴넷의 예측값과 실제 정답 사이의 차이기 때문) <br/><br/></li>
<li>정책 함수의 정답이란 것이 곧 최적 정책인데, 최적 정책를 알면 강화학습을 하는 이유가 없음<ul>
<li>즉, 손실 함수를 줄이는 방향이 아니라, 정책을 평가하는 기준을 세워서 그 값을 증가시키도록 하는 방향으로 그라디언트 업데이트를 함 → <strong>그라디언트 어센트(gradient ascent)</strong></li>
</ul>
</li>
</ul>
<br/>

<ul>
<li>목표는 주어진 정책 네트워크 $\pi_\theta(s,a)$에 대해 이 정책이 얼마나 좋은 정책인지 평가하는 방법을 찾는 것 → 이때 평가 함수를 $J(\theta)$라고 함<ul>
<li>$\pi$를 인풋으로 받아 점수를 리턴하는 함수이고, $\pi$가 곧 $\theta$에 의해서 표현되기 때문에 $\theta$만 인풋으로 들어감</li>
<li>이 함수를 알 수 있다면 이 함수의 값을 증가시키는 방향으로 그라디언트 어센트를 진행 할 수 있음 <br/><br/></li>
</ul>
</li>
<li>하지만, $\pi$가 고정되어도 에피소드마다 서로 다른 상태를 방문하고 서로 다른 보상를 받기 때문에 정책을 평가하기 위해서는 기대값 연산자가 필요함<ul>
<li>$J(\theta)=\mathbb{E}_{\pi_\theta}\left[\sum_t r_t\right]$</li>
<li>보상의 합에 기댓값을 취한 것이 곧 $J(\theta)$임 <br/><br/></li>
</ul>
</li>
<li>이는 시작하는 상태가 $s_0$로 항상 고정되어 있다면 $s_0$의 가치로 볼 수 있음<ul>
<li>$J(\theta)=\mathbb{E}<em>{\pi_\theta}[\sum_t r_t]=v</em>{\pi_\theta}(s_0)$</li>
<li>즉, $J(\theta)$는 $s_0$의 밸류로 표현 가능함 <br/><br/></li>
</ul>
</li>
<li>만약 시작하는 상태가 $s_0$로 고정된 것이 아니라 매번 다른 상태에서 출발한다고 가정할 경우, 시작 상태 s의 확률 분포 d(s)가 정의되어야함 <ul>
<li>$J(\theta)=\sum_{s\in S} d(s),v_{\pi_\theta}(s)$</li>
<li>모든 상태 s에 대하여 해당 상태에서 출발했을 때 얻을 가치를 해당 상태에서 출발할 확률과 곱하여 가중 합을 해준 것</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li>$\nabla_\theta J(\theta)$를 구하여 “$\theta&#39; \leftarrow \theta + \alpha * \nabla_\theta J(\theta)$” 를 실행하면 $J(\theta&#39;)$의 값은 $J(\theta)$보다 증가하게 됨<ul>
<li>이 과정을 반복하면 최적 정책의 파라미터 $\theta^*$를 찾을 수 있음 → 이를 그라디언트 어센트라고함 <br/><br/></li>
<li>그라디언트 디센트가 손실 함수를 최소화하기 위해 그라디언트를 계산하여 그 반대 방향으로 파라미터를 업데이트 했다면, 그라디언트 어센트는 목적 함수를 최대화하기 위해 그라디언트를 계산하여 그라디언트 방향으로 파라미터를 업데이트함</li>
</ul>
</li>
</ul>
<br/>

<h2 id="1-step-mdp">1-Step MDP</h2>
<ul>
<li>1-Step MDP : 한 스텝만 진행하고 바로 에피소드가 끝나는 MDP<ul>
<li>처음 상태 $s_0$에서 액션 a를 선택하고 보상 $R_{s,a}$를 받고 끝나는 것</li>
<li>처음 상태 $s_0$는 확률분포 d(s)를 통해 정해짐 → $s_0 \sim d(s)$ <br/><br/></li>
</ul>
</li>
<li>$J(\theta)=\sum_{s\in S} d(s),v_{\pi_\theta}(s) =\sum_{s\in S} d(s)\sum_{a\in A}\pi_\theta(s,a),R_{s,a}$<ul>
<li>d(s) : 존재하는 모든 상태 s에 대해 s가 첫 상태가 될 확률</li>
<li>$v_{\pi_\theta}(s)$는 s에서 모든 액션 a에 대해 a를 선택할 확률과 그 때 발생하는 보상을 곱해서 더해주면 됨 <br/><br/></li>
</ul>
</li>
<li>$\nabla_\theta J(\theta)=\nabla_\theta \sum_{s\in S} d(s)\sum_{a\in A}\pi_\theta(s,a),R_{s,a}$<ul>
<li>양변에 그라디언트 취한것</li>
<li>하지만 $R_{s,a}$를 모르기 때문에 계산할 수 없음 (사실 알아도 continuous action space라 못함)</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li>샘플 기반 방법론을 활용하여 계산 진행<blockquote>
<p>$\nabla_\theta J(\theta) = \nabla_\theta \sum_{s\in S} d(s)\sum_{a\in A}\pi_\theta(s,a),R_{s,a}$ <br/>
$= \sum_{s\in S} d(s)\sum_{a\in A}\nabla_\theta \pi_\theta(s,a),R_{s,a}$ <br/>
$= \sum_{s\in S} d(s)\sum_{a\in A}\frac{\pi_\theta(s,a)}{\pi_\theta(s,a)},\nabla_\theta \pi_\theta(s,a),R_{s,a}$ <br/>
$= \sum_{s\in S} d(s)\sum_{a\in A}\pi_\theta(s,a),\frac{\nabla_\theta \pi_\theta(s,a)}{\pi_\theta(s,a)},R_{s,a}$ <br/>
$= \sum_{s\in S} d(s)\sum_{a\in A}\pi_\theta(s,a),\nabla_\theta \log \pi_\theta(s,a),R_{s,a}$ <br/>
$= \mathbb{E}<em>{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a),R</em>{s,a}]$</p>
</blockquote>
</li>
</ul>
<ul>
<li>기대값 연산자 $\mathbb{E}_{\pi_\theta}$ 덕분에 “샘플 기반 방법론”을 활용해 계산 할 수 있음<ul>
<li>$\pi_\theta(s,a)$에 대한 기댓값이기 때문에 $\pi_\theta(s,a)$로 움직이는 에이전트를 환경에 가져다 놓고, $\nabla_\theta \log \pi_\theta(s,a) * R_{s,a}$의 값을 여러 개 모으면 됨 <br/><br/></li>
</ul>
</li>
<li>$\nabla_\theta \log \pi_\theta(s,a)$는 뉴럴넷의 그라디언트이기 때문에 쉽게 계산할 수 있으며, $R_{s,a}$는 s에서 a를 선택하고 얻는 보상을 관측하기만 하면 됨<ul>
<li>상태전이마다 1개의 $\nabla_\theta \log \pi_\theta(s,a) * R_{s,a}$ 값을 계산할 수 있고, 이 값을 모아서 평균을 내면, 그 평균이 곧 $\nabla_\theta J(\theta)$와 같음 <br/><br/></li>
</ul>
</li>
<li>이게 가능한 이유는 $\nabla_\theta \log \pi_\theta(s,a),R_{s,a}$을 기댓값 연산자 형태로 바꿨기 때문임<ul>
<li>수식 앞에 $\sum \pi_\theta(s,a)$가 곱해진 형태이기 때문<ul>
<li>$\sum \pi_\theta(s,a)$가 곱해져 있으면 이는 곧 그 뒤에 나올 값에 $\pi_\theta(s,a)$만큼의 가중치를 곱해서 더해주라는 뜻이고, 이는 곧 기댓값 연산자 $\mathbb{E}_{\pi_\theta}$의 정의이며, 이 부분이 policy gradient의 핵심임</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<h2 id="일반적-mdp에서의-policy-gradient">일반적 MDP에서의 Policy Gradient</h2>
<blockquote>
<ul>
<li>1 step MDP : $\nabla_\theta J(\theta) = \mathbb{E}<em>{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * R</em>{s,a}]$ <br/><br/></li>
</ul>
</blockquote>
<ul>
<li><p>MDP : $\nabla_\theta J(\theta) = \mathbb{E}<em>{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * Q</em>{\pi_\theta}(s,a)]$ → “<strong>Policy Gradient Theorem”</strong></p>
</li>
<li><p>$R_{s,a}$가 $Q_{\pi_\theta}(s,a)$로 바뀜. s에서 a를 할 때 받는 보상 대신, s에서 a를 할 때 얻는 리턴의 기댓값으로 바꾼 것 → 한 스텝만 진행하고 MDP가 끝나는 것이 아닌 이후 여러 스텝이 존재하기 때문 <br/><br/></p>
</li>
<li><p>이 식을 <strong>Policy Gradient Theorem</strong>이라고 함</p>
<ul>
<li><strong>Policy gradient</strong> : 목적함수 $J(\theta)$에 대한 그라디언트를 $\pi_\theta(s,a)$가 경험한 데이터를 기반으로 계산할 수 있게 해주는 방법론</li>
</ul>
</li>
</ul>
<br/>

<hr>
<h1 id="92-reinforce-알고리즘">9.2 REINFORCE 알고리즘</h1>
<h2 id="이론적-배경">이론적 배경</h2>
<ul>
<li>$\nabla_\theta J(\theta)=\mathbb{E}_{\pi_\theta}[\nabla_\theta \log \pi_\theta(s,a) * G_t]$<ul>
<li>기존 수식의 $Q_{\pi_\theta}(s,a)$ 자리에 그 샘플의 리턴 $G_t$가 들어감<ul>
<li>$G_t$는 $Q_{\pi_\theta}(s,a)$의 정의 때문에 편향되지 않은 샘플임</li>
<li>$Q_\pi(s,a)=\mathbb{E}[G_t \mid s_t=s, a_t=a]$이기 때문에, $G_t$의 샘플을 여러 개 모아서 평균을 내면 그 식이 실제 $Q_{\pi_\theta}(s,a)$에 근사해지기 때문</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<h3 id="reinforce-pseudo-code">REINFORCE pseudo code</h3>
<blockquote>
<ol>
<li>$\pi_\theta(s,a)$의 파라미터 $\theta$를 랜덤으로 초기화 <br/><br/></li>
<li>다음(A~C)을 반복 </li>
</ol>
</blockquote>
<ul>
<li>A. 에이전트의 상태를 초기화: $s \leftarrow s_0$ <br/><br/></li>
<li>B. $\pi_\theta$를 이용하여 에피소드 끝까지 진행, ${s_0, a_0, r_0, s_1, a_1, r_1, \ldots, s_T, a_T, r_T}$을 얻음 <br/><br/></li>
<li>C. $t = 0 \sim T$에 대해 다음을 반복<ul>
<li>$G_t \leftarrow \sum_{i=t}^{T} r_i * \gamma^{i-t}$ <br/></li>
<li>$\theta \leftarrow \theta + \alpha * \nabla_\theta \log \pi_\theta(s_t, a_t) * G_t$</li>
</ul>
</li>
</ul>
<ul>
<li>$\pi_\theta$로 에피소드 하나에 해당하는 데이터를 얻고, 해당 데이터로 $\theta$를 업데이트하고, 업데이트된 $\pi_\theta$를 이용해 또 다음 에피소드의 경험을 얻고, 그 데이터로 또 강화하고, 이 과정을 계속해서 반복 <br/><br/></li>
<li>$\nabla_\theta \log \pi_\theta(s,a) * G_t$<ul>
<li>리턴이 음수일 경우, 그 리턴을 반환하는 액션의 확률은 감소시키도록 업데이트됨 <br/><br/></li>
<li>만약 양수만 존재할 경우, 더 큰 값을 더 크게 업데이트 함 → $\pi_{\theta}(s,a)$의 아웃풋은 확률이기 때문에 값을 모두 더하면 1인데 즉, 리턴이 더 좋았던 쪽의 액션이 더 많이 강화되어 더 확률이 올라감</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<p>Q : $\nabla_\theta \log \pi_\theta(s,a)$ 대신 $\nabla_\theta \pi_\theta(s,a)$를 사용해도 될까요?</p>
</blockquote>
<ul>
<li>$\nabla_\theta J(\theta) \ne \mathbb{E}_{\pi_\theta}[\nabla_\theta \pi_\theta(s,a) * G_t]$이기 때문에 안됨 <br/><br/><ul>
<li>아까 말한 샘플 기반 방법론 기반 변환 수식을 보면<blockquote>
<p>$\nabla_\theta J(\theta) = \sum_{s\in S} d(s)\sum_{a\in A}\nabla_\theta \pi_\theta(s,a),R_{s,a}$
$\nabla_\theta J(\theta) \ne \sum_{s\in S} d(s)\sum_{a\in A}\pi_\theta(s,a),\nabla_\theta \pi_\theta(s,a),R_{s,a}$</p>
</blockquote>
</li>
<li>임으로 사실 그냥 다른 식임</li>
</ul>
</li>
</ul>
<br/>

<hr>
<h2 id="reinforce-구현"><a href="https://github.com/BDH-teacher/RL_from_basics/blob/main/RL_from_basic_ch_9_REINFORCE.ipynb">REINFORCE 구현</a></h2>
<ul>
<li>$\nabla_\theta J(\theta) \approx G_t * \nabla_\theta \log \pi_\theta(s_t, a_t)$ <ul>
<li>데이터를 이용하여 계산해야 하는 gradient 식</li>
<li>식은 $G_t$라는 상수에 $\log \pi_\theta(s_t, a_t)$의 그라디언트가 곱해져있지만, 파이토치나 텐서플로같은 라이브러리는 미분된 형태의 수식을 사용하지 않음 <br/><br/></li>
</ul>
</li>
<li>DQN에서 구현할 땐 아래처럼 $\nabla_\theta L(\theta)$에 대한 수식이 아니라 $L(\theta)$에 대한 수식을 사용함<ul>
<li>$L(\theta)=(r+\gamma \max_{a&#39;} Q_\theta(s&#39;,a&#39;)-Q_\theta(s,a))^2$</li>
<li>$\nabla_\theta L(\theta)\approx-\left(r+\gamma \max_{a&#39;} Q_\theta(s&#39;,a&#39;)-Q_\theta(s,a)\right)\nabla_\theta Q_\theta(s,a)$ <br/><br/></li>
</ul>
</li>
<li>$G_t * \log \pi_\theta(s_t, a_t)$<ul>
<li>$\theta$에 대한 항이 $\pi_\theta(s_t,a_t)$뿐이기 때문에 그냥 $\nabla_\theta$ 연산자를 지워버리면 $L(\theta)$가 됨 <br/><br/></li>
</ul>
</li>
<li>라이브러리의 optimizer는 손실 함수를 자동으로 minimize하는 방향으로 업데이트 하지만 REINFORCE 알고리즘은 gradient ascent를 사용하기 때문에 maximize하는 방향으로 업데이트 해야함<ul>
<li>$-G_t * \log \pi_\theta(s_t, a_t)$<ul>
<li>즉, 위 값을 minimize하는 것은 곧 $G_t * \log \pi_\theta(s_t,a_t)$를 maximize하는 것</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br/><br/><br/><br/><br/><br/></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[바닥부터 배우는 강화학습] - Chapter 8. 가치 기반 에이전트]]></title>
            <link>https://velog.io/@mit_bang/rl8</link>
            <guid>https://velog.io/@mit_bang/rl8</guid>
            <pubDate>Sun, 22 Feb 2026 18:37:48 GMT</pubDate>
            <description><![CDATA[<p>신경망을 이용해 액션 밸류 네트워크를 학습하면 그게 곧 하나의 애이전트가 될 수 있습니다. 아타리 게임을 플레이 하던 DQN이 바로 이 방식입니다. 이번 챕터에서는 가치 함수만을 가지고 움직이는 에이전트, 즉 가치 기반 에이전트에 대해 알아보겠습니다.</p>
<hr>
<ul>
<li>이번 문제는 더이상 제약 조건이 없는 상황임<ul>
<li>여전히 Model-free이며</li>
<li><strong>상태공간(state space)</strong>과 <strong>액션 공간(ation space</strong>)이 매우 커서 밸류를 테이블에 담지 못하는 상황 → 신경망 사용 <br/><br/></li>
</ul>
</li>
<li>강화학습에 신경망을 사용하는 대표적인 2가지 방법론<ul>
<li>$v_{\pi}(s)$나 $q_{\pi}(s, a)$를 신경망으로 표현 하는 방식</li>
<li>함수 $\pi(a|s)$ 자체를 신경망으로 표현하는 방식</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/fc508461-3a1b-4bb3-87fc-e8f41ddf61a0/image.png" alt=""></p>
<ul>
<li>가치 기반(value-based) : 에이전트가 가치 함수에 근거하여 액션을 선택함<ul>
<li>즉, q(s, a)의 값을 통해 액션을 선택하는 것</li>
<li>가치 기반 에이전트는 액션을 선택할 때 가치 함수만 있으면 되므로, 정책 함수를 따로 정의 하지않음<ul>
<li>ex) SARSA, Q-Learning <br/><br/></li>
</ul>
</li>
</ul>
</li>
<li>정책 기반(policy-based) : 에이전트가 정책함수 $\pi(a|s)$를 보고 직접 액션을 선택함<ul>
<li>밸류를 통해서 액션을 선택하지 않으며, 가치 함수를 따로 정의하지 않음</li>
<li>$\pi$만을 통해 MDP에서 경험을 쌓고 활용하며, 학습 과정에서 $\pi$를 강화함 <br/><br/></li>
</ul>
</li>
<li>액터-크리틱(actor-critic) : 가치 함수와 정책 함수를 모두 사용함<ul>
<li>actor는 “행동하는 주체”, 즉 정책 $\pi$를 의미하며, critic은 “비평가”, 즉 v(s) 또는 q(s,a)를 의미함</li>
<li>이름 그대로 행동하는 $\pi$와 평가하는 v(혹은 q)가 함께 존재함</li>
</ul>
</li>
</ul>
<br/>

<hr>
<h2 id="81-밸류-네트워크의-학습">8.1 밸류 네트워크의 학습</h2>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/e63ea183-89d4-4d87-91eb-66bf53322ec2/image.png" alt=""></p>
<ul>
<li>밸류 네트워크(value-network) : 뉴럴넷으로 이루어진 가치 함수 $v_{\theta}(s)$<ul>
<li>$\theta$ : 뉴럴넷의 파라미터. 만약 뉴럴넷에 포함된 파라미터가 100개 라면 세타는 길이가 100인 벡터임 (처음엔 랜덤으로 초기화 되어있음) <br/><br/></li>
</ul>
</li>
<li>상태별 별류의 값을  $v_{\text{true}}(s)$라고 가정했을 때 손실함수를 다음과 같이 표현 할 수 있다<ul>
<li>$L(\theta) = (v_{\text{true}}(s) - v_\theta(s))^2$</li>
<li>이는 어떤 s에 대해 위 값을 계산할 것인지에 대해 정의를 하지 않았기 때문에 엄밀한 정의는 아님 <br/><br/></li>
</ul>
</li>
<li>모든 상태 s에 대해서 $L(\theta)$를 최소화하기 매우 어렵기 때문에 다음과 같이 정의함<ul>
<li>$L(\theta) = \mathbb{E}<em>\pi[(v</em>{\text{true}}(s) - v_\theta(s))^2]$</li>
<li>여기서 기댓값 연산자 $\mathbb{E}<em>\pi$*는 정책 함수 $\pi$를 이용해 방문했던 상태 s에 대해 $(v</em>{\text{true}}(s) - v_\theta(s))^2$*를 계산하라는 뜻 <br/><br/></li>
</ul>
</li>
<li>$\pi$를 이용해 데이터를 모으고 그 데이터를 이용해 학습하면, 손실 함수에서 $\pi$가 자주 방문하는 상태의 가중치는 더 높아지고, $\pi$가 거의 방문하지 않는 상태의 가중치는 낮아지는 성질이 추가됨</li>
</ul>
<br/>

<ul>
<li>$\nabla_\theta L(\theta) = - \mathbb{E}<em>\pi[(v</em>{\text{true}}(s) - v_\theta(s))\nabla_\theta v_\theta(s)]$<ul>
<li>$v_{\text{true}}(s)$는 상수이기 때문에 <strong>체인 룰(chain rule)</strong>을 사용하여 얻을 수 있는 식인 $\frac{d}{dx}{c - f(x)}^2 = -2{c - f(x)}\cdot \frac{d}{dx}f(x)$임을 이용<ul>
<li>(앞에 곱해지는 상수 2는 생략) → 상수값은 나중에 $\alpha$를 이용해 조절 가능<br/><br/></li>
</ul>
</li>
</ul>
</li>
<li>$\mathbb{E}<em>\pi[(v</em>{\text{true}}(s) - v_\theta(s))\nabla_\theta v_\theta(s)]$의 값을 실제로 계산하려면 $\pi$를 이용하여 움직이는 에이전트를 통해 샘플을 뽑아야함<ul>
<li>$\nabla_\theta L(\theta) \approx -(v_{\text{true}}(s) - v_\theta(s)),\nabla_\theta v_\theta(s)$<ul>
<li>$\pi$가 상태 s를 방문했다고 가정하고, 이 과정을 여러 번 반복하면 우변이 좌변으로 수렴함 <br/><br/></li>
</ul>
</li>
</ul>
</li>
<li>이후 $\theta$ 업데이트 진행 <ul>
<li>$\theta&#39; = \theta - \alpha \nabla_\theta L(\theta)
= \theta + \alpha (v_{\text{true}}(s) - v_\theta(s)),\nabla_\theta v_\theta(s)$</li>
<li>$v_{\text{true}}(s)$가 없으면 손실 함수를 정의할 수 없어 그라디언트 계산이 불가능함 → MC, TD 활용하여 해결</li>
</ul>
</li>
</ul>
<br/>

<hr>
<h3 id="첫-번째-대안--몬테카를로-리턴">첫 번째 대안 : 몬테카를로 리턴</h3>
<ul>
<li>MC : 시점 t에서 시작하여 에피소드가 끝날 때까지 얻은 감쇠된 누적 보상을 리턴 $G_t$를 이용하여 업데이트하는 방식 <br/><br/></li>
<li>$V(s_t) \leftarrow V(s_t) + \alpha\big(G_t - V(s_t)\big)$<ul>
<li>실제 가치 함수의 정의가 곧 $G_t$의 기대값이기 때문에 $v_{\text{true}}(s)$대신 사용 가능 <br/><br/></li>
</ul>
</li>
<li>$L(\theta) = \mathbb{E}_\pi\left[\left(G_t - v_\theta(s_t)\right)^2\right]$<ul>
<li>뉴럴넷을 업데이트하려면 손실 함수를 정의해야함 → $v_{\text{true}}(s)$대신 $G_t$사용 <br/><br/></li>
</ul>
</li>
<li>$\theta&#39; = \theta + \alpha\big(G_t - v_\theta(s_t)\big)\nabla_\theta v_\theta(s_t)$<ul>
<li>이후 $\theta$ 업데이트 진행</li>
</ul>
</li>
</ul>
<br/>

<h3 id="두-번쨰-대안--td-타깃">두 번쨰 대안 : TD 타깃</h3>
<ul>
<li>TD : 한 스텝 더 진행해서 추측한 값을 이용하여 현재의 추측치를 업데이트하는 방식 <br/><br/></li>
<li>$L(\theta)=\mathbb{E}<em>\pi[(r</em>{t+1}+\gamma v_\theta(s_{t+1})-v_\theta(s_t))^2]$<ul>
<li>TD 타깃인 $r_{t+1} + \gamma v_\theta(s_{t+1})$ 활용 <br/><br/></li>
</ul>
</li>
<li>$\theta&#39;=\theta+\alpha\left(r_{t+1}+\gamma v_\theta(s_{t+1})-v_\theta(s_t)\right)\nabla_\theta v_\theta(s_t)$<ul>
<li>이후 $\theta$ 업데이트 진행 <br/><br/></li>
</ul>
</li>
<li>여기서 $r_{t+1} + \gamma v_\theta(s_{t+1})$ 값은 변수가 아닌 상수임 (MC도 동일)<ul>
<li>$v_\theta(s_{t+1})$ 항이 포함되어 있지만, 업데이트 시점의 $\theta$를 이용하여 $r_{t+1} + \gamma v_\theta(s_{t+1})$의 값을 계산할 경우 상수로 취급됨 → 편미분 값 : 0</li>
<li>만약, 상수로 취급하지 않을 경우 업데이트 되는 값과 목표가 함께 움직이기 때문에 학습이 매우 불안정해짐</li>
</ul>
</li>
</ul>
<br/>

<hr>
<h2 id="82-딥-q러닝">8.2 딥 Q러닝</h2>
<ul>
<li>가치 기반 에이전트는 <strong>명시적 정책(explicit policy)</strong>이 따로 존재하지 않음<ul>
<li>$\pi$를 사용하지 않고, q(s, a)를 활용하여 액션을 선택하기 때문<ul>
<li>즉, 정책은 <strong>암묵적 정책(implicit policy)</strong>임</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<h3 id="이론적-배경---q러닝">이론적 배경 - Q러닝</h3>
<ul>
<li>Q러닝 : 벨만 최적방정식을 이용해 최적의 $Q_*(s,a)$를 학습함</li>
</ul>
<blockquote>
<p>$Q_<em>(s,a)=\mathbb{E}<em>{s&#39;}[r+\gamma \max</em>{a&#39;} Q_</em>(s&#39;,a&#39;)]$
$Q(s,a)\leftarrow Q(s,a)+\alpha(r+\gamma \max_{a&#39;} Q(s&#39;,a&#39;)-Q(s,a))$</p>
</blockquote>
<ul>
<li>딥 Q러닝은 Q러닝에 뉴럴넷으로 환장한것<ul>
<li>즉, Q(s,a)가 아닌 $Q_{\theta}(s,a)$로 표기 <br/><br/></li>
</ul>
</li>
<li>$L(\theta)=\mathbb{E}[(r+\gamma \max_{a&#39;} Q_\theta(s&#39;,a&#39;)-Q_\theta(s,a))^2]$<ul>
<li>$r+\gamma \max_{a&#39;} Q(s&#39;,a&#39;)$를 정답으로, 이것과 $Q_\theta(s,a)$ 사이 차이의 제곱을 손실 함수로 정의함</li>
<li>손실 함수를 정의할 때에는 기댓값 연산자($\mathbb{E}$)가 반드시 필요<ul>
<li>같은 s에서 같은 a를 선택한다 하더라도 매번 다른 상태에 도달할 수 있기 때문 <br/><br/></li>
</ul>
</li>
</ul>
</li>
<li>$\theta&#39;=\theta+\alpha(r+\gamma \max_{a&#39;} Q_\theta(s&#39;,a&#39;)-Q_\theta(s,a))\nabla_\theta Q_\theta(s,a)$<ul>
<li>실제 뉴럴넷을 업데이트할 때는 샘플 기반 방법론으로 $\mathbb{E}$를 무시하고 계산함</li>
<li>이 식을 통해 $\theta$를 계속해서 업데이트해 나가면 $Q_\theta(s,a)$는 $Q_*(s,a)$에 가까워짐</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li>기댓값 연산자를 없애기 위해 여러 개의 샘플을 뽑아서 그 평균을 이용해 업데이트를 진행하는데, 이처럼 복수의 데이터를 모아 놓은 것을 <strong>미니 배치(mini-batch)</strong>라고 함<ul>
<li>미니 배치 업데이트 : 미니 배치를 이용해 업데이트 하는 방식 <br/><br/></li>
</ul>
</li>
<li>“하나의 미니 배치를 구성하는 데 몇 개의 데이터를 사용할 것인가”를 <strong>미니 배치 사이즈(mini-batch size)</strong>라고 함<ul>
<li>미니 배치의 크기가 커질수록 더 정확한 그라디언트를 계산할 수 있지만, 한 번에 소모해버리는 데이터가 많아짐</li>
</ul>
</li>
</ul>
<br/>

<h3 id="딥-q러닝-pseudo-code">딥 Q러닝 pseudo code</h3>
<blockquote>
<ol>
<li>$Q_\theta$의 파라미터 $\theta$를 초기화 <br/><br/></li>
<li>에이전트의 상태 s를 초기화 $(s \leftarrow s_0)$ <br/><br/></li>
<li>에피소드가 끝날 때까지 다음(A~E)를 반복
A. $Q_\theta$에 대한 $\varepsilon$-greedy를 이용하여 액션 a를 선택
B. a를 실행하여 r과 s&#39;을 관측
C. s&#39;에서 $Q_\theta$에 대한 greedy를 이용하여 액션 a&#39;을 선택
D. $\theta$ 업데이트: $\theta \leftarrow \theta + \alpha(r + \gamma Q_\theta(s&#39;, a&#39;) - Q_\theta(s,a))\nabla_\theta Q_\theta(s,a)$
E. $s \leftarrow s&#39;$ <br/><br/></li>
<li>에피소드가 끝나면 다시 2번으로 돌아가서 $\theta$가 수렴할 때까지 반복</li>
</ol>
</blockquote>
<ul>
<li>환경에서 실제로 액션을 선택하는 부분 : <strong>3-A</strong> <br/><br/></li>
<li>TD 타깃의 값을 계산하기 위한 액션을 선택하는 부분 : <strong>3-C</strong><ul>
<li>실제로 실행되지 않고, 업데이트를 위한 계산에만 사용</li>
<li>행동 정책($\varepsilon$-greedy $Q_{\theta}$)과 타깃 정책(greedy $Q_{\theta}$)는 서로 다름 <br/><br/></li>
</ul>
</li>
<li>손실함수에서 한 번 미분된 형태 : <strong>3-D</strong><ul>
<li>라이브러리를 사용할 경우 계산할 필요없이, 손실함수만 정의함<ul>
<li>$L(\theta)=\left(r+\gamma \max_{a&#39;} Q_\theta(s&#39;,a&#39;)-Q_\theta(s,a)\right)^2$</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<hr>
<h3 id="익스피리언스-리플레이와-타깃-네트워크">익스피리언스 리플레이와 타깃 네트워크</h3>
<ul>
<li><strong>DQN(Deep Q-Network)</strong> <ul>
<li><a href="https://www.nature.com/articles/nature14236">DQN paper (nature)</a></li>
<li>본질은 뉴럴넷을 활용하여 Q함수를 강화하는것</li>
<li>논문에서는 학습을 안정화하고 성능을 끌어 올리기 위해 2가지 방법을 사용함<ul>
<li><strong>익스피리언스 리플레이(Experience Replay)</strong>와 <strong>타깃 네트워크(Target Network)</strong></li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<h3 id="익스피리언스-리플레이experience-replay">익스피리언스 리플레이(Experience Replay)</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/1c375fa6-392f-4931-b086-4648288ba64a/image.png" alt=""></p>
<ul>
<li>Experience Replay는 과거의 겪었던 경험을 재사용하는것<ul>
<li>경험은 여러 개의 에피소드로 이루어져 있고, 에피소드는 여러 개의 <strong>상태 전이(transition 또는 트랜지션)</strong>로 이루어져있음 <br/><br/></li>
</ul>
</li>
<li>하나의 상태 전이 $e_t$는 ($s_t, a_t, r_t, s_{t+1}$)로 표현 가능<ul>
<li>“상태 $s_t$에서 액션 $a_t$를 했더니 보상 $r_t$을 받고 다음 상태 $s_{t+1}$에 도착 하였다” → 하나의 상태 전이가 곧 하나의 데이터임 <br/><br/></li>
</ul>
</li>
<li>낱개의 데이터를 재사용하기 위해 <strong>리플레이 버퍼(replay buffer)</strong>사용<ul>
<li>버퍼에 가장 최근 데이터 n개를 저장하는 것 <br/><br/></li>
<li>학습할 때는 이 버퍼에서 임의의 데이터를 뽑아서 사용함 → 랜덤하게 뽑다 보면 각각의 데이터가 여러 번 재사용될 수 있음 (데이터 효율성 증가) <br/><br/></li>
<li>또한 랜덤하게 데이터를 뽑다 보면 하나의 미니 배치 안에서 서로 다른 데이터들이 섞이게됨<ul>
<li>연속된 데이터를 사용할 때 보다 각각의 데이터 사이 <strong>상관성(correalation)</strong>이 작아서, 더 효율적으로 학습할 수 있음</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<h3 id="별도의-타깃-네트워크target-network">별도의 타깃 네트워크(Target Network)</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/300042b0-45c7-43a2-8460-0949a458e3b5/image.png" alt=""></p>
<ul>
<li>손실 함수 $L(\theta)$의 직관적 의미는 정답과 추측 사이의 차이이며, 이 차이를 줄이는 방향으로 $\theta$가 업데이트 됨 <br/><br/></li>
<li>하지만, Q러닝에서는 $R + \gamma \max_{A&#39;} Q_\theta(S&#39;, A&#39;)$이 정답으로 사용되기 때문에 정답이 $\theta$에 의존적임<ul>
<li>$\theta$가 업데이트 될 때마다 정답에 해당하는 값이 계속해서 변함</li>
<li>뉴럴넷을 학습할 때 정답지가 자주 변하는 것은 학습의 안정성을 매우 떨어뜨림</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li>타겟 네트워크의 아이디어 : 정답을 계산할 때 사용하는 네트워크인 타깃 네트워크와 학습을 받고 있는 Q 네트워크, 이렇게 두 개의 네트워크를 준비하고, 정답지를 계산할 때 사용하는 네트워크의 파라미터를 잠시 얼려두는 것<ul>
<li>변하지 않도록 얼린 파라미터 $\theta_i^{-}$를 고정해놓고 정답지를 계산하면 정답이 안정적인 분포를 가지게 됨 <br/><br/></li>
<li>그 사이 학습을 받고 있는 네트워크의 파라미터는 $\theta_{i+1}, \theta_{i+2}, \cdots$ 이렇게 계속해서 업데이트 됨 <br/><br/></li>
<li>그리고 일정 주기마다 얼려 놓았던 $\theta_i^{-}$를 최신 파라미터로 교체함 <br/><br/></li>
</ul>
</li>
<li>즉, 학습 도중에는 똑같이 생긴 두 쌍의 파라미터가 사용됨<ul>
<li>학습 대상이 되는 Q네트워크의 파라미터 $\theta_t$와 정답지 계산에 쓰이는 파라미터 $\theta_i^{-}$가 공존하게됨</li>
</ul>
</li>
</ul>
<br/>

<hr>
<h3 id="dqn-구현"><a href="https://github.com/BDH-teacher/RL_from_basics/blob/main/RL_from_basic_ch_8.ipynb">DQN 구현</a></h3>
<ul>
<li>OpenAI Gym 카트폴 구현<ul>
<li>오른쪽, 왼쪽 항상 2가지의 액션 <br/><br/></li>
<li>스텝마다 +1의 보상을 받으며, 막대를 넘어뜨리지 않고 오래 균형을 잡아야 보상이 최대가 됨 <br/><br/></li>
<li>막대가 수직으로 부터 15도 이상 기울어지거나, 카트가 화면 끝으로 나가면 종료 <br/><br/></li>
<li>카트의 상태 s는 길이 4의 벡터<ul>
<li>s = (카트의 위치, 카트의 속도, 막대의 각도, 막대의 각속도)</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<p><img src="https://velog.velcdn.com/images/mit_bang/post/a294794f-0759-406c-b078-2c3029a3beaf/image.png" alt=""></p>
<ul>
<li>forward 함수의 뉴럴넷 구조<ul>
<li>상태 s를 의미하는 길이 4의 인풋 벡터가 들어가며, 모든 액션에 대한 각 액션의 밸류인 Q(s,a)를 리턴함</li>
<li>카트폴에서 선택할 수 있는 액션은 2개이기 때문에 아웃풋의 차원은 2임 <br/><br/></li>
</ul>
</li>
<li>Q함수 구현하는 방식<ol>
<li>s와 a를 한번에 인풋으로 받아 그 밸류를 리턴하는 형태</li>
<li>s만 인풋으로 받아 모든 액션에 대한 밸류값들을 한 번에 리턴하는 형태 → 원래 DQN 논문의 구현 방식</li>
</ol>
</li>
</ul>
<br/>

<ul>
<li>결과 
<img src="https://velog.velcdn.com/images/mit_bang/post/ba27e78d-47f5-4005-806e-68bb67efefa5/image.png" alt=""></li>
</ul>
<p><br/><br/><br/><br/><br/><br/></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[바닥부터 배우는 강화학습] - Chapter 7. Deep RL 첫걸음]]></title>
            <link>https://velog.io/@mit_bang/rl7</link>
            <guid>https://velog.io/@mit_bang/rl7</guid>
            <pubDate>Sun, 22 Feb 2026 18:34:31 GMT</pubDate>
            <description><![CDATA[<p>커다란 MDP의 세계를 항해하기 위해서 우리에게는 또 다른 무기가 하나 필요합니다. 바로 “딥러닝”입니다. 딥러닝과 강화 학습이 만나 Deep RL이라는 유연하고도 범용적인 방법론이 탄생합니다. 이번 챕터에서는 먼저 딥러닝에 대한 이야기부터 시작합니다.</p>
<hr>
<h2 id="71-함수를-활용한-근사">7.1 함수를 활용한 근사</h2>
<ul>
<li>테이블 기반 방법론으로 학습을 하려면 상태 s마다 그에 해당하는 밸류를 적어 놓기 위해, 총 상태의 개수만큼 테이블이 커져야함<ul>
<li>ex) 체스 : $10^{47}$, 바둑 : $10^{170}$ → 10의 170승만큼의 상태가 존재</li>
<li>상태의 개수가 무한해지는 경우도 있음 (ex- 속도) <br/><br/></li>
</ul>
</li>
<li><strong>연속적인 상태 공간(continuous state space)</strong> : 상태값이 바둑이나 체스처럼 <strong>이산적(discrete)</strong>일 수도 있지만, 실수 범위 내에서 연속적인 값을 가질 수도 있음<ul>
<li>상태 공간이 연속적이면 테이블을 만들기 불가능함</li>
</ul>
</li>
</ul>
<br/>

<h3 id="함수의-등장">함수의 등장</h3>
<ul>
<li>함수 $f(x) = ax + b$ 에 v(s)나 q(s, a)를 저장한다고 가정했을때, (100, 1), (200, -10)은<ul>
<li>$f(s_0) = f(100) = 1, f(s_1) = f(200) = -10$  로 표현 가능함</li>
<li>이를 통해 a와 b의 값을 추정하면 a = -0.11, b = 12임 <br/><br/></li>
</ul>
</li>
<li>s와 v(s)의 쌍의 데이터를 통해서 파라미터 a,b의 값을 조정하는 것임 <br/><br/></li>
<li>즉, $f$는 상태 값을 인풋으로 받아 가치 값을 내놓는 함수가 되므로, 이를 실제 가치 함수의 <strong>근사 함수(function approximator)</strong>라고 할 수 있음<ul>
<li>$f(s) = \hat{v_{\pi}}(s)$ </li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/248dc518-7669-4811-b069-48f5e1c46385/image.png" alt=""></p>
<ul>
<li>데이터가 많아지면 모든 선을 지나는 직선을 그릴 수 없음 → 모든 점들을 가장 “가깝게” 지나는 선으로 표현함 <br/><br/></li>
<li><strong>최소제곱법(least squares)</strong> : 각각의 데이터를 $(x_1, y_1), (x_2, y_2), \ldots, (x_{30}, y_{30})$이라고 표현한다면 <br/><br/><ul>
<li>$(f(x_1)-y_1)^2 + (f(x_2)-y_2)^2 + \cdots + (f(x_{30})-y_{30})^2$ <br/><br/></li>
<li>위의 식(=오차의 제곱의 합)을 최소화하는 a와 b를 찾는 방법론<ul>
<li>데이터의 개수와 무관하게 표현한다면 각 오차의 제곱 합을 평균내고, <strong>MSE(Mean Squared Error(평균제곱오차))</strong>를 최소화하는 것 <br/><br/></li>
</ul>
</li>
</ul>
</li>
<li>$\mathrm{MSE}= \frac{1}{30}\left( (f(x_1)-y_1)^2 + (f(x_2)-y_2)^2 + \cdots + (f(x_{30})-y_{30})^2 \right)$
$= \frac{1}{30}\left( (ax_1+b-y_1)^2 + (ax_2+b-y_2)^2 + \cdots + (ax_{30}+b-y_{30})^2 \right)$ 
<img src="https://velog.velcdn.com/images/mit_bang/post/f30127ef-7417-4d6d-a1ae-0ab511b5e18e/image.png" alt=""></li>
<li>MSE를 최소화하는 a와 b를 구하여 그린 $f(x)$ <br/><br/></li>
<li>함수의 곡선이 데이터에 가깝게 지나도록 피팅(fitting)해야함 → 선형식 만이 최선은 아님</li>
</ul>
<br/>

<h3 id="함수의-복잡도에-따른-차이">함수의 복잡도에 따른 차이</h3>
<blockquote>
<p>$f(x) = a_0 + a_1 x$
$f(x) = a_0 + a_1 x + a_2 x^2$
$\cdots$
$f(x) = a_0 + a_1 x + a_2 x^2 + \cdots + a_n x^n$</p>
</blockquote>
<ul>
<li>1차 함수에서 n차 함수로 차수가 점점 올라갈수록 함수는 더 유연해지고, 더 복잡한 데이터에도 피팅할 수 있음 <br/><br/></li>
<li>“함수를 피팅한다”의 의미<ul>
<li>함수에 데이터를 기록한</li>
<li>데이터 점들을 가장 가깝게 지나도록 함수를 그려본다</li>
<li>함수 $f$의 파라미터 $(a_0 \sim a_n)$의 값을 찾는다.</li>
<li>함수 $f$를 학습한다</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/221b43a6-6fec-46f5-9be9-28b0c5835c78/image.png" alt=""></p>
<ul>
<li>1차, 4차, 16차 함수를 이용한 피팅 결과의 평균 에러(MSE)는 각각 0.3, 0.03, 0.00000002임<ul>
<li>하지만, 데이터에는 <strong>노이즈(noise)</strong>가 섞여있기 때문에 무조건 차수가 높은 함수가 좋은 것은아님</li>
</ul>
</li>
</ul>
<br/>

<h3 id="오버-피팅과-언더-피팅">오버 피팅과 언더 피팅</h3>
<ul>
<li>오버 피팅(over fitting) : $f$를 정할 때, 너무 유연한 함수를 사용하여  $f$가 노이즈에 피팅해버리는 것</li>
<li>언더 피팅(under fitting) : 실제 모델을 담기에 함수 $f$의 유연성이 부족하여 주어진 데이터와의 에러가 큰 상황 <br/><br/></li>
<li>MDP에서도 똑같은 정책 $\pi$로 똑같은 상태 s에서 출발하여도 매번 다른 리턴을 받음 → 노이즈 <br/><br/></li>
<li>데이터를 생성하는 함수 F를 찾는것이 목표임<ul>
<li>상태에 따른 리턴의 쌍이 모두 데이터가 되며 여기서 데이터를 생성해준 함수 F는 가치함수 $v_{\pi}(s)$가 됨 <br/><br/></li>
</ul>
</li>
<li>임의의 F에 대한 식<ul>
<li>$F(x) = cos(1.5\pi * x) + x$ <br/><br/></li>
</ul>
</li>
<li>실제 데이터를 생성하는 함수 $F_{real}(x)$도 F에 노이즈 $\varepsilon$을 추가하여 정의함 <br/><ul>
<li>$F_{\text{real}}(x) = F(x) + \varepsilon = \cos(1.5\pi x) + x + \varepsilon$, ($\varepsilon \sim N(0,1)\cdot \frac{1}{10}$)<ul>
<li>$\varepsilon$은 표준 정규 분포에서 샘플링된다고 가정</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/1a86b4d7-e14b-4641-aedf-af88372b0c14/image.png" alt=""></p>
<ul>
<li>30개의 쌍$(x, F_{real}(x))$를 통해 표현함<ul>
<li>빨간색 선 : 1차~16차함수까지의 f를 설정하여 학습시킴</li>
<li>초록색 선 : $F(x)$</li>
<li>파란색 점 : $F_{real}(x)$로부터 샘플링된 값 <br/><br/></li>
</ul>
</li>
<li>목표 :초록색 선과 가장 가까워지도록 하는 빨간 선을 찾는것<ul>
<li>1차 함수는 <strong>프리 파라미터(free-parameter)</strong>가 적기 때문에 유연하지 못함 → 언더 피팅</li>
<li>16차 함수는 모든 데이터를 가장 에러 없이 학습했지만, 과하게 유연하여 $F_{real}$이 가지고 있는 노이즈까지 모두 정확하게 학습하게됨 → 오버 피팅</li>
</ul>
</li>
</ul>
<br/>

<h3 id="함수의-장점---일반화">함수의 장점 - 일반화</h3>
<ul>
<li>문제가 커질 경우, 테이블에 모든 v(s)나 q(s,a)를 저장할 수 없음<ul>
<li>그렇기 때문에 실제 v(s)를 모방하는 함수 $f$를 학습 시킨것 <br/><br/></li>
</ul>
</li>
<li>즉, 함수를 통해 <strong>일반화(generalization)</strong>를 잘 해야함
<img src="https://velog.velcdn.com/images/mit_bang/post/ce303f2c-5e4f-4292-9aa0-65495e7fc033/image.png" alt=""></li>
<li>새로운 데이터가 추가된 경우, 테이블 기반 방법론을 사용하면 새로운 상태에 대한 값이 비어있기 때문에 어떤 밸류를 갖게 될지 알 수 없음<ul>
<li>하지만 함수를 통해 일반화를 진행할 경우(일반화가 잘 된 경우) 처음 보는 데이터에 대해서도 예측을 통해 알 수 있음</li>
</ul>
</li>
</ul>
<br/>

<p><img src="https://velog.velcdn.com/images/mit_bang/post/84e5bcf1-1864-4e72-b311-d6a9a2620a2d/image.png" alt=""> </p>
<ul>
<li>언더 피팅된 1차 함수와 오버 피팅된 16차 함수 모두 새로운 데이터를 일반화하여 표현하는 성능이 매우 부족함 <ul>
<li>여기서 빨간 선을 그리는 데에 노란색 데이터는 아예 사용되지 않음</li>
</ul>
</li>
</ul>
<br/>

<hr>
<h2 id="72-인공-신경망의-도입">7.2 인공 신경망의 도입</h2>
<h3 id="신경망">신경망</h3>
<ul>
<li>인공 신경망(Artificial Neural Network) : 신경망의 본질은 매우 유연한 함수인 것 → 매우 유연하기 때문에 세상의 어떤 복잡한 관계에도 피팅할 수 있음<ul>
<li>함수에 포함된 프리 파라미터의 개수를 통해 함수의 유연성을 표현할 수 있는데, 신경망의 경우 100만 개가 넘음<ul>
<li>(Large Model의 경우 1000억 개 이상) <br/><br/></li>
</ul>
</li>
</ul>
</li>
<li>이러한 인공 신경망을 통해 상태별 가치 값을 담는 것이 Deep RL 학습임</li>
</ul>
<br/>

<p><img src="https://velog.velcdn.com/images/mit_bang/post/90e11eac-22d7-4d20-84e7-5561a5e74ac9/image.png" alt=""></p>
<ul>
<li>크기가 3인 벡터를 인풋으로 받아 값 하나를 리턴하는 신경망 <br/><br/></li>
<li>$y = f(x_1, x_2, x_3)$ 형태로 표현 가능<ul>
<li><strong>히든 레이어(hidden layer)</strong>가 두 층이 쌓여 있고, 각각의 히든 레이어는 여러 개의 <strong>노드(node)</strong>로 구성됨</li>
<li>즉, 노드가 신경망의 기본 구성 단위임</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li>노드는 해당 노드로 들어오는 값들을 <strong>선형 결합(linear combination)</strong>한 후에 <strong>비선형 함수(non-linear activation)</strong>를 적용함
<img src="https://velog.velcdn.com/images/mit_bang/post/d49ce311-9843-4490-82e3-24c69da7610f/image.png" alt=""></li>
<li>해당 노드로 들어오는 3개의 값($x_1, x_2, x_3$)을 선형결합 하여 $w_1x_1 + w_2x_2 + w_3x_3 + b$의 값으로 만든 후 비선형 함수 g(x)를 통과 시킴<ul>
<li>대표적인 비선형 함수 : <strong>RELU(rectified linear unit)</strong><ul>
<li>RELU : $g(x) = (max(0,x))$ <br/><br/></li>
</ul>
</li>
</ul>
</li>
<li>선형 결합 : 새로운 <strong>피쳐(feature)</strong>를 만드는 과정. 이 피쳐는 인풋 벡터의 피쳐보다 한층 더 추상화(abstract)된 피처임<ul>
<li>학습에 필요한 피쳐가 있다면 신경망의 파라미터들이 알맞은 값으로 학습됨 <br/><br/></li>
</ul>
</li>
<li>비선형 함수 : 인풋과 아웃풋의 관계가 비선형 관계일 수 있기 때문에 사용됨<ul>
<li>선형 관계만 학습하게 되면 신경망의 표현력이 실제 자연의 많은 문제를 표현하기 어려움 <br/><br/></li>
</ul>
</li>
<li>즉, 신경망을 학습 한다는 것은 신경망을 구성하는 파라미터들인 w와 b의 값을 찾는 과정임</li>
</ul>
<br/>

<h3 id="신경망의-학습---그레디언트-디센트">신경망의 학습 - 그레디언트 디센트</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/d93d80fd-ac02-46ee-acc6-f9ecd8409ca5/image.png" alt=""></p>
<ul>
<li>빨간 곡선 : 랜덤하게 초기화된 $f$<ul>
<li>현재 w로는 $f_w(3) = 1$을 만족하지 않음 <br/><br/></li>
</ul>
</li>
<li>신경망의 $f_w(3)$ 값과 실제 값의 차이를 계산하기 위해, w에 대한 함수를 L(w)로 표현 할 수 있음<ul>
<li>$L(w) = (1 - f_w(3))^2$</li>
<li>L(w)는 신경망의 아웃풋이 주어진 데이터로부터 틀린 정도를 나타내기 때문에 <strong>손실 함수(loss function)</strong>이라고 함 <br/><br/></li>
</ul>
</li>
<li>L(w)를 계산하기 위해선 w의 영향력을 알아야함<ul>
<li>w를 조금 증가시키거나 감소시켰을 때 함수 L(w)의 값이 어떻게 바뀌는지 확인하는 것 → <strong>미분(derivative)</strong></li>
<li>L(w)를 w로 미분한것이 곧 w가 L(w)에 미치는 영향력임 <br/><br/></li>
</ul>
</li>
<li>신경망에는 여려 개의 w가 존재 하기 때문에 영향력을 평가하기 위해서는 L(w)를 각각의 파라미터에 대해 미분해야함 → 이를 <strong>편미분(partial derivative)</strong>이라고 함</li>
</ul>
<br/>

<p>$\nabla_w L(w) = (\frac{\partial L(w)}{\partial w_1}, \frac{\partial L(w)}{\partial w_2}, \cdots, \frac{\partial L(w)}{\partial w_{100}})$</p>
<ul>
<li><strong>그라디언트(gradient)</strong> : $f$를 $w_1$부터 $w_{100}$까지 각각의 파라미터에 대해 편미분하여 벡터를 만든것<ul>
<li>w를 그라디언트 방향으로 아주 조금씩 이동 시킴 <br/><br/></li>
</ul>
</li>
<li>w를 얼만큼 이동시킬지는 $\alpha$라는 상수를 통해 정해짐 <br/><br/></li>
<li>$\alpha$는 업데이트 크기를 결정하는 상수로, <strong>러닝 레이트(learning rate)</strong> 혹은 <strong>스텝 사이즈(step size)</strong>라고 부름<ul>
<li>목적 함수를 최소화하기 위해서 그라디언트에 $\alpha$라는 상수를 곱하여 원래 값에서 빼 줌</li>
</ul>
</li>
</ul>
<blockquote>
<p>$w_1&#39; = w_1 - \alpha \frac{\partial L(w)}{\partial w_1}$
$w_2&#39; = w_2 - \alpha \frac{\partial L(w)}{\partial w_2}$
$\cdots$
$w_{100}&#39; = w_{100} - \alpha \frac{\partial L(w)}{\partial w_{100}}$</p>
</blockquote>
<ul>
<li>위 100개의 식을 벡터를 이용해 한 줄로 표현<ul>
<li>$\mathbf{w}&#39; = \mathbf{w} - \alpha \nabla_w L(w)$ <br/><br/></li>
</ul>
</li>
<li><strong>그라디언트 디센트(gradient descent(경사 하강법))</strong> : 그라디언트를 계산하여 파라미터를 업데이트하는 방식으로 목적함수를 최소화 해나가는 과정</li>
</ul>
<br/>

<hr>
<h3 id="간단한-확인">간단한 확인</h3>
<blockquote>
<ol>
<li>모델(함수) 정의<ul>
<li>$f_w(x_1,x_2)=w_1x_1-w_2x_2+1$ <br/><br/></li>
</ul>
</li>
<li>초기값, 데이터, 목표 설정</li>
</ol>
</blockquote>
<ul>
<li>초기 파라미터: $w_1=0.5, w_2=1.2$</li>
<li>데이터 한 개: $(x_1,x_2,y)=(1,2,1)$</li>
<li>목표: $f_w(1,2)$가 y=1에 가까워지게 만들기 <br/><br/><ol start="3">
<li>현재 예측값 계산</li>
</ol>
</li>
<li>$f_w(1,2)=0.5\cdot1-1.2\cdot2+1=0.5-2.4+1=-0.9$</li>
<li>목표와 차이가 큼 <br/><br/><ol start="4">
<li>손실 함수 정의 (제곱오차)</li>
</ol>
</li>
<li>“정답”과 “예측값”의 차이를 제곱<ul>
<li>$L(w)=(1-f_w(1,2))^2$ <br/><br/></li>
</ul>
</li>
<li>여기서 $f_w(1,2)=w_1-2w_2+1$ 이니까<ul>
<li>$L(w) = (1-(w_1-2w_2+1))^2 = (-w_1+2w_2)^2$ <br/><br/></li>
</ul>
</li>
<li>전개하면<ul>
<li>$L(w)=w_1^2-4w_1w_2+4w_2^2$ <br/><br/><ol start="5">
<li>그라디언트(편미분) 구하기</li>
</ol>
<ul>
<li>$\frac{\partial L}{\partial w_1}=2w_1-4w_2, \qquad \frac{\partial L}{\partial w_2}=-4w_1+8w_2$ <br/><br/></li>
</ul>
</li>
</ul>
</li>
<li>초기값 $w_1=0.5, w_2=1.2$ 대입<ul>
<li>$\frac{\partial L}{\partial w_1}=2(0.5)-4(1.2)=1-4.8=-3.8$</li>
<li>$\frac{\partial L}{\partial w_2}=-4(0.5)+8(1.2)=-2+9.6=7.6$ <br/><br/></li>
</ul>
</li>
<li>그래서<ul>
<li>$\nabla_w L(w)=(-3.8,7.6)$ <br/><br/><ol start="6">
<li>경사하강법 업데이트</li>
</ol>
</li>
</ul>
</li>
<li>학습률 $\alpha=0.01$</li>
<li>업데이트 규칙<ul>
<li>$w&#39; = w - \alpha \nabla_w L(w)$ <br/><br/></li>
</ul>
</li>
<li>각 파라미터에 적용<ul>
<li>$w_1&#39; = w_1 - \alpha\frac{\partial L}{\partial w_1}=0.5-0.01(-3.8)=0.538$</li>
<li>$w_2&#39; = w_2 - \alpha\frac{\partial L}{\partial w_2}=1.2-0.01(7.6)=1.124$ <br/><br/><ol start="7">
<li>업데이트 후 예측값이 좋아졌는지 확인</li>
</ol>
<ul>
<li>$f_{w&#39;}(1,2)=0.538\cdot1-1.124\cdot2+1=0.538-2.248+1=-0.71$</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>이전: -0.9</li>
<li>이후: -0.71 <br/><br/></li>
<li><strong>즉, 목표값인 1 방향으로(증가 방향으로) 조금 이동함.</strong></li>
</ul>
<br/>

<hr>
<h3 id="파이토치를-이용한-신경망의-학습-구현"><a href="https://github.com/BDH-teacher/RL_from_basics/blob/main/RL_from_basic_ch_7.ipynb">파이토치를 이용한 신경망의 학습 구현</a></h3>
<ul>
<li>그라디언트 기반 방법론을 쓰려면 $f_w$를 미분 가능한 함수로 정의해야함<ul>
<li>하지만, 신경망은 매우 복잡하기 때문에 직접 미분할 수가 없음 → 컴퓨터 활용 <br/><br/></li>
</ul>
</li>
<li><strong>텐서플로우(Tensorflow)</strong>, <strong>파이토치(PyTorch)</strong> 같은 다양한 <strong>자동 미분(auto diff)</strong> 라이브러리를 사용해야함<ul>
<li>이 라이브러리는 역전파(back propagation) 알고리즘을 통해 아주 복잡한 함수여도 그라디언트를 효율적이고 빠르게 구함</li>
<li>파이토치 공식 홈페이지 : <a href="https://pytorch.org/">PyTorch Foundation</a> <br/><br/></li>
</ul>
</li>
<li>사전 정의<ul>
<li>$F(x) = \cos(1.5\pi x) + x + \varepsilon, \qquad \varepsilon \sim U(-0.2, 0.2)$<ul>
<li>앞 예제에서 다룬 함수에서 노이즈를 균등 분표로 변형함</li>
</ul>
</li>
<li>이 함수는 실제론 알 수 없다고 가정하며, 함수가 만들어 내는 데이터만 관찰 가능함 → 근사가 목표 
<img src="https://velog.velcdn.com/images/mit_bang/post/1ad99161-4bee-4894-b897-43963dac94c9/image.png" alt=""></li>
<li>임의로 정한 신경망 구조 ($f_w$)<ul>
<li>총 3개의 히든 레이어 + 128개의 노드</li>
<li>각 레이어에 ReLU라는 <strong>활성화 함수(activation function)</strong> 사용</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<p><img src="https://velog.velcdn.com/images/mit_bang/post/519ab43e-c67d-45e5-bd93-95b49e683f67/image.png" alt=""></p>
<p><br/><br/><br/><br/><br/><br/></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[청강] 딥러닝 20 - RAG Advanced, LoRA Fine-tuning (끝)]]></title>
            <link>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-19-RAG-Advanced-LoRA-Fine-tuning</link>
            <guid>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-19-RAG-Advanced-LoRA-Fine-tuning</guid>
            <pubDate>Fri, 06 Feb 2026 04:44:53 GMT</pubDate>
            <description><![CDATA[<p><a href="https://seoyeon-p.github.io/">한양대학교 박서연 교수님 - github.io</a></p>
<h5 id="한양대학교-박서연-교수님의-딥러닝-수업을-청강-하면서-정리한-내용을-바탕으로-교수님의-허락을-받고-작성하였습니다">(한양대학교 박서연 교수님의 딥러닝 수업을 청강 하면서 정리한 내용을 바탕으로 교수님의 허락을 받고 작성하였습니다.)</h5>
<br/>

<hr>
<h1 id="retrieval-augmented-generation-rag">Retrieval Augmented Generation (RAG)</h1>
<h3 id="lora-code---github"><a href="https://github.com/BDH-teacher/Deep_Learning_Audit_code/blob/main/LoRA.ipynb">LoRA Code - GitHub</a></h3>
<br/>

<blockquote>
<h3 id="enhancing-rag-with-post-retrieval-processing">Enhancing RAG with Post-Retrieval Processing</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/275af97e-cc87-4cd7-ad41-0840d25c13ff/image.png" alt=""></p>
</blockquote>
<ul>
<li>Retriever가 가져온 문서들을 그대로 LLM에 넣지 않고, <strong>한 번 더 가공</strong>해서 품질을 올리는 단계 <br/><br/></li>
<li>Reranking(정확도 높은 순으로 재정렬), 필터링(중복·무관 문서 제거), chunk 병합/분할, 요약·하이라이트 생성 등을 통해 <strong>LLM이 볼 context를 더 짧고, 관련성 높고, 정보 밀도 높은 형태로 만들어 주는 것</strong></li>
</ul>
<hr>
<blockquote>
<h3 id="reranking-ie-relevance-estimator-re-rag-emnlp-2024">Reranking (i.e., Relevance Estimator) (RE-RAG, EMNLP 2024)</h3>
</blockquote>
<ul>
<li><a href="https://arxiv.org/abs/2406.05794">RE-RAG Paper</a>
<img src="https://velog.velcdn.com/images/mit_bang/post/00005bb1-cf7c-4f3b-a403-df8831b5ff7b/image.png" alt=""></li>
</ul>
<br/>

<blockquote>
<h3 id="knowledge-refinement-using-summarization-and-reranking-rankcot-acl-2025">Knowledge Refinement using Summarization and Reranking (RankCoT, ACL 2025)</h3>
</blockquote>
<ul>
<li><a href="https://arxiv.org/abs/2502.17888">RankCoT Paper</a>
<img src="https://velog.velcdn.com/images/mit_bang/post/6af09dfa-bdc7-42ca-a5ef-c6841d796714/image.png" alt=""></li>
</ul>
<br/>

<blockquote>
<h3 id="advanced-reranker-dynamicrag-neurips-2025">Advanced Reranker (DynamicRAG, Neurips 2025)</h3>
</blockquote>
<ul>
<li><a href="https://arxiv.org/abs/2505.07233">DynamicRAG Paper</a>
<img src="https://velog.velcdn.com/images/mit_bang/post/074f8842-9295-4e6e-a6f9-ce68f4e4868b/image.png" alt=""></li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="enhancing-rag-with-pre-retrieval-processing">Enhancing RAG with Pre-Retrieval Processing</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/c0c43263-ab1c-4883-95d3-29100f7d9fee/image.png" alt=""></p>
</blockquote>
<ul>
<li>사용자의 raw query를 바로 검색하지 않고, retriever가 이해·매칭하기 좋은 형태로 사전 가공하는 단계<ul>
<li><strong>Query normalization</strong>: 소문자 변환, 불용어 제거, 토큰 정규화 등 <br/><br/></li>
<li><strong>Query rewriting / expansion</strong>: LLM으로 질문을 풀어서 쓰기, 동의어·관련 키워드 추가, 애매한 표현 명확화 <br/><br/></li>
<li><strong>Query decomposition / routing</strong>: 복잡한 질문을 여러 sub-question으로 나누거나, 알맞은 index·도메인으로 라우팅 <br/><br/></li>
</ul>
</li>
<li>이런 pre-retrieval processing을 통해 retriever가 더 관련성 높은 문서들을 찾을 수 있게 만들어 RAG 전체 성능을 향상시킴.</li>
</ul>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/96df654d-a70c-40c4-a4b7-357402f1303b/image.png" alt=""></p>
</blockquote>
<ul>
<li><a href="https://aclanthology.org/2023.emnlp-main.585.pdf">Query2doc Paper</a></li>
<li><a href="https://aclanthology.org/2024.acl-long.242.pdf">Small Models, Big Insights Paper</a></li>
<li><a href="https://aclanthology.org/2023.emnlp-main.322/">Query Rewriting for Retrieval-Augmented Large Language Models Paper</a></li>
</ul>
<br/>

<hr>
<p><strong>Enhancing the Generator in RAG</strong> → Generator자체를 향상시키는것도 방법임 </p>
<blockquote>
<h3 id="reflection-based-rag-self-rag-iclr-2024">Reflection-based RAG (Self-RAG, ICLR 2024)</h3>
</blockquote>
<ul>
<li><a href="https://arxiv.org/abs/2310.11511">Self-RAG Paper</a>
<img src="https://velog.velcdn.com/images/mit_bang/post/fb48b913-b564-4d58-bcd3-f3276b0b942f/image.png" alt=""> <br/></li>
</ul>
<hr>
<h3 id="noisy-robustness-of-rag-llms-acl-2024">Noisy Robustness of RAG LLMs (ACL 2024)</h3>
<ul>
<li><a href="https://arxiv.org/abs/2405.20978">Noisy Robustness of RAG Paper</a>
<img src="https://velog.velcdn.com/images/mit_bang/post/725ea813-a427-45dc-be29-6e5fb9698081/image.png" alt=""> <br/></li>
</ul>
<hr>
<h3 id="pa-rag-naacl-2025">PA-RAG (NAACL 2025)</h3>
<ul>
<li><a href="https://aclanthology.org/2025.naacl-long.459/">PA-RAG Paper</a>
<img src="https://velog.velcdn.com/images/mit_bang/post/e2e5fb20-fc8c-4d40-978d-db06071025ca/image.png" alt=""></li>
</ul>
<br/>

<blockquote>
<h3 id="rag-for-specialized-domains-rag-studio-emnlp-findings-2024">RAG for Specialized Domains (RAG-Studio EMNLP findings 2024)</h3>
</blockquote>
<ul>
<li><a href="https://aclanthology.org/2024.findings-emnlp.41/">RAG-Studio Paper</a>
<img src="https://velog.velcdn.com/images/mit_bang/post/906872b8-7ce8-4c94-9430-729326c7c09b/image.png" alt=""></li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="low-rank-adaptation-lora">Low Rank Adaptation (LoRA)</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/4481f5b6-a61c-421e-96dd-c0d463051c38/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>Zero Inference Latency</strong><ul>
<li>기존엔 input 마다 추가로 계산해야함</li>
<li>W1이 설정된 이후엔 <strong>Only one-time addition</strong>이 가능 <br/><br/></li>
</ul>
</li>
<li>전체 weights를 Full Fine-tuning하는 대신, 적은 수의 파라미터만 학습하고도 동일한 효과를 보임</li>
</ul>
<br/>

<blockquote>
<h3 id="adapter-layer">Adapter Layer</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/d61dd2db-64a3-4542-b202-7b353050a948/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>Foundation Model&#39;s Original Weights</strong><ul>
<li>pre-trained model의 원래 weight metrics $W_0$</li>
<li>LoRA fine-tuning 과정에서 이 weight metrics은 <strong>Frozen 상태</strong>로 유지되며, 업데이트되지 않음 <br/><br/></li>
</ul>
</li>
<li><strong>LoRA Weight Changes</strong><ul>
<li>특정 작업을 학습하며 얻은 <strong>weights의 변화량</strong> $\Delta W$ <br/><br/></li>
</ul>
</li>
<li><strong>Specialized Model&#39;s Fine-tuned Weights</strong><ul>
<li>원래 가중치($W_0$)와 학습된 변화량($\Delta W$)을 더하여 만들어진 <strong>Output weight metrics</strong>(W)</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<h3 id="low-rank-adaptation-lora-1">Low Rank Adaptation (LoRA)</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/f316a86b-36cc-46e2-81e6-5f579d7a39fc/image.png" alt=""></p>
</blockquote>
<ul>
<li>LoRA의 핵심은 weight metrics를 그대로 학습하는 대신, <strong>multiple weight metrics로 decomposition</strong>하여 학습 파라미터 수를 줄이는 것임.</li>
</ul>
<br/>

<blockquote>
<h3 id="lora--rank">LoRA : Rank</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/fe21d54d-bc0f-4c75-b01c-62102b56c6cf/image.png" alt=""></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/649a528b-4ca0-41b3-be6e-19f975491393/image.png" alt=""></p>
<ul>
<li>Rank(r)는 분해된 두 행렬 사이의 중간 차원을 의미함 <br/><br/></li>
<li>rank를 8에서 256 사이로 설정할 때 Approximation 성능에 유의미한 차이가 없음<ul>
<li>즉, <strong>모델의 특징을 학습하는 데 Low Intrinsic Rank만으로도 충분</strong>함</li>
</ul>
</li>
</ul>
<p><br/><br/><br/></p>
<h1 id="끝"><em>끝!</em></h1>
<p><br/><br/><br/></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[청강] 딥러닝 19 - Retrieval Augmented Generation (RAG)]]></title>
            <link>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-19-Retrieval-Augmented-Generation-RAG</link>
            <guid>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-19-Retrieval-Augmented-Generation-RAG</guid>
            <pubDate>Mon, 19 Jan 2026 03:18:31 GMT</pubDate>
            <description><![CDATA[<p><a href="https://seoyeon-p.github.io/">한양대학교 박서연 교수님 - github.io</a></p>
<h5 id="한양대학교-박서연-교수님의-딥러닝-수업을-청강-하면서-정리한-내용을-바탕으로-교수님의-허락을-받고-작성하였습니다">(한양대학교 박서연 교수님의 딥러닝 수업을 청강 하면서 정리한 내용을 바탕으로 교수님의 허락을 받고 작성하였습니다.)</h5>
<br/>

<hr>
<h1 id="retrieval-augmented-generation-rag">Retrieval Augmented Generation (RAG)</h1>
<h3 id="rag-code---github"><a href="https://github.com/BDH-teacher/Deep_Learning_Audit_code/blob/main/RAG_ChatHistory.ipynb">RAG Code - GitHub</a></h3>
<h3 id="ragllama-code---github"><a href="https://github.com/BDH-teacher/Deep_Learning_Audit_code/blob/main/RAG_LlamaGPT4oMini.ipynb">RAG(Llama) Code - GitHub</a></h3>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/b457430b-2d95-4f25-b4b2-db34e3560f63/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>Retrieval Augmented Generation(RAG)</strong> : 검색을 증강해서 대답하는 것<ul>
<li>추가적인 데이터에 대한 <strong>fine-tuning없이</strong> LLM이 외부 지식(Website, PDF, 외부 문서 등)을 검색 시스템이 관련 있는 문서/링크만 골라서 리스트업함 → 이후 <strong>관련 정보를 모아서 요약·재구성해서 답변 생성</strong></li>
</ul>
</li>
</ul>
<hr>
<blockquote>
<h3 id="custom-data-to-vector-format">Custom Data to Vector Format</h3>
</blockquote>
<ul>
<li><a href="https://platform.openai.com/docs/guides/embeddings">OpenAI Platform guides</a></li>
</ul>
<br/>

<hr>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/7e9ac749-ab24-48ca-baf1-8e858f8a5783/image.png" alt=""></p>
</blockquote>
<ul>
<li><a href="https://huggingface.co/spaces/mteb/leaderboard">Embedding Leaderboard huggingface</a> <br/><br/></li>
<li>AG with Open Source HuggingFace Library (Embedding Model)<ul>
<li>Open AI의 RAG모델이 제일 좋음 (유료) <br/><br/></li>
<li>Huggingface에서 무료로 사용가능 (Qwen model)
<img src="https://velog.velcdn.com/images/mit_bang/post/cd19e883-01a3-4dd5-970a-409db4a119da/image.png" alt=""></li>
</ul>
</li>
</ul>
<br/> 

<hr>
<blockquote>
<h3 id="rag-using-langchain">RAG using LangChain</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/f094dea4-70cb-4db9-b325-60092346f7a0/image.png" alt=""></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/9dfd67be-9424-49cf-aa86-5f7544da126b/image.png" alt=""></p>
<ul>
<li><a href="https://docs.langchain.com/oss/python/langchain/rag">Build a RAG agent with LangChain - Docs by LangChain</a></li>
</ul>
<blockquote>
<h3 id="dataloader">DataLoader</h3>
</blockquote>
<ul>
<li><a href="https://docs.langchain.com/oss/python/integrations/document_loaders">Document loaders - Docs by LangChain</a></li>
</ul>
<hr>
<h3 id="textsplitters">TextSplitters</h3>
<ul>
<li><a href="https://docs.langchain.com/oss/python/langchain/overview">LangChain overview - Docs by LangChain</a></li>
</ul>
<hr>
<h3 id="store">Store</h3>
<ul>
<li><a href="https://docs.langchain.com/oss/python/integrations/vectorstores">Vector stores - Docs by LangChain</a></li>
<li><a href="https://docs.langchain.com/oss/python/integrations/text_embedding">Embedding models - Docs by LangChain</a></li>
</ul>
<hr>
<h3 id="local-db-such-as-faiss-by-meta">Local DB such as FAISS by Meta</h3>
<ul>
<li><a href="https://docs.langchain.com/oss/python/integrations/vectorstores/faiss">Faiss - Docs by LangChain</a><ul>
<li>Cloud DB쓴다면<ul>
<li>ElasticSearch, Weaviate, Pinecone (보안 조심해야함)</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/> 

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/cdf05f15-715a-417d-ae96-c27ba13f5ae2/image.png" alt=""></p>
</blockquote>
<ul>
<li>직접 LLM을 구성할때는 Chat History를 Maintaining해야한다 → GPT는 기본적으로 되지만, 직접 만들경우 memory를 기억하는 부분을 넣어줘야함</li>
</ul>
<br/> 

<hr>
<blockquote>
<h3 id="retriever">Retriever</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/2b9a1899-e18e-415d-b275-74dc0f4f9f6f/image.png" alt=""></p>
</blockquote>
<ul>
<li>query와 문서를 vector로 embedding해서, dot product / cosine similarity 같은 방법으로 가장 유사한 문서들을 찾아오는 검색 모듈 <br/><br/></li>
<li>RAG에서 외부 knowledge(Website, PDF 등)를 LLM에게 가져다주는 역할을 담당함</li>
</ul>
<br/> 

<blockquote>
<h3 id="contrastive-learning">Contrastive Learning</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/8ba2c8df-6b26-43cf-92f4-370af85c9dc3/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>아이디어</strong> : 기준이 되는 샘플을 <strong>anchor</strong>라고 두고, anchor와 <strong>비슷한 샘플(positive), 다른 샘플(negative)</strong>을 구성한다. <br/><br/></li>
<li><strong>학습 목표</strong> : embedding / feature space에서 anchor–positive 쌍은 가깝게 위치하도록 만들고 anchor–negative 쌍은 멀어지도록 만드는 <strong>loss를 최소화</strong>한다. <br/><br/></li>
<li><strong>직관</strong> : “비슷한 것끼리는 모으고(끌어당기고), 다른 것끼리는 떼어놓는(밀어내는) 방식으로 representation을 학습하는 방법”이 바로 <strong>contrastive learning</strong></li>
</ul>
<p><br/><br/><br/></p>
<p><br/><br/><br/></p>
<hr>
<ul>
<li>참고자료</li>
</ul>
<p><a href="https://www.timeanddate.com/weather/south-korea/seoul/ext">General Usage of LLMs (Reference)</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[청강] 딥러닝 18 - Prompting]]></title>
            <link>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-18-Prompting</link>
            <guid>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-18-Prompting</guid>
            <pubDate>Mon, 19 Jan 2026 03:13:00 GMT</pubDate>
            <description><![CDATA[<p><a href="https://seoyeon-p.github.io/">한양대학교 박서연 교수님 - github.io</a></p>
<h5 id="한양대학교-박서연-교수님의-딥러닝-수업을-청강-하면서-정리한-내용을-바탕으로-교수님의-허락을-받고-작성하였습니다">(한양대학교 박서연 교수님의 딥러닝 수업을 청강 하면서 정리한 내용을 바탕으로 교수님의 허락을 받고 작성하였습니다.)</h5>
<br/>

<hr>
<h1 id="prompting">Prompting</h1>
<blockquote>
<h3 id="tips-for-prompting">Tips for prompting</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/19cc0b09-720b-47de-ab5d-f557a1e3d167/image.png" alt=""></p>
</blockquote>
<ul>
<li><a href="https://learn.deeplearning.ai/courses/chatgpt-prompt-eng/lesson/dfbds/introduction">ChatGPT Prompt Engineering for Developers - DeepLearning.AI</a> <br/><br/></li>
<li>specific instructions <br/><br/></li>
<li>Specify the steps to complete a task <br/><br/></li>
<li>Use delimiters to clearly separate parts of the input <br/><br/></li>
<li>Consider to use few-shot prompting</li>
</ul>
<br/>

<blockquote>
<h3 id="system-prompts">System Prompts</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/2acb395d-d941-4a60-9009-4120cd641266/image.png" alt=""></p>
</blockquote>
<ul>
<li>LLM에 들어가는 최상위 prompt → query로 input을 넣는것이 아니라 System Prompts로 고정으로 적어 두는 것 <br/><br/><ul>
<li>요즘은 굳이 Special token을 추가해서 System Prompt를 구성하진 않음 
<img src="https://velog.velcdn.com/images/mit_bang/post/a86ad782-31a9-4dba-b555-e9e560b48e1c/image.png" alt=""><ul>
<li>System Prompts 예시</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="few-shot-learning-few-shot-learning-paper">Few-Shot Learning <a href="https://arxiv.org/pdf/2005.14165">(Few-Shot Learning Paper)</a></h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/20c1af6b-fb89-4121-a7d0-2e7edb41e971/image.png" alt=""></p>
</blockquote>
<ul>
<li>Post-Processing, Few-shot Prompting 예시</li>
</ul>
<br/>

<blockquote>
<h3 id="role-prompting-role-prompting-github">Role Prompting <a href="https://github.com/pacholoamit/chatgpt-prompts">Role Prompting GitHub</a></h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/f3879adf-308a-4f61-b077-05a948451667/image.png" alt=""></p>
</blockquote>
<ul>
<li>Role playing Prompting이 LLM 보안을 뚫을때 악용되기도함</li>
</ul>
<br/>

<blockquote>
<h3 id="chain-of-thoughts-cot-chain-of-thought-prompting-paper">Chain of Thoughts (CoT) <a href="https://arxiv.org/abs/2201.11903">Chain-of-Thought Prompting Paper</a></h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/cce4269c-e58f-46b8-bedf-e3485fb1709c/image.png" alt=""></p>
</blockquote>
<p><br/><br/><br/><br/><br/><br/></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[청강] 딥러닝 17 - Instruct GPT]]></title>
            <link>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-17-Instruct-GPT</link>
            <guid>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-17-Instruct-GPT</guid>
            <pubDate>Mon, 19 Jan 2026 03:11:36 GMT</pubDate>
            <description><![CDATA[<p><a href="https://seoyeon-p.github.io/">한양대학교 박서연 교수님 - github.io</a></p>
<h5 id="한양대학교-박서연-교수님의-딥러닝-수업을-청강-하면서-정리한-내용을-바탕으로-교수님의-허락을-받고-작성하였습니다">(한양대학교 박서연 교수님의 딥러닝 수업을 청강 하면서 정리한 내용을 바탕으로 교수님의 허락을 받고 작성하였습니다.)</h5>
<br/>

<hr>
<h1 id="instruct-gpt">Instruct GPT</h1>
<h3 id="instructgpt-code---github"><a href="https://github.com/BDH-teacher/Deep_Learning_Audit_code/blob/main/InstructGPT.ipynb">InstructGPT Code - GitHub</a></h3>
<h5 id="참고--openai-api-없으면-작동-안함">(*참고 : openAI API 없으면 작동 안함)</h5>
<br/>

<blockquote>
<h3 id="state-of-the-art-large-language-models">State-of-the-art Large Language Models</h3>
</blockquote>
<ul>
<li><a href="https://arxiv.org/abs/2005.14165">Language Models are Few-Shot Learners</a><ul>
<li><strong>Prompting</strong> : instruction과 input을 어떻게 쓸 지를 설계해서 원하는 output을 유도하는 방법<ul>
<li><strong>Zero-shot Prompting</strong> : 아무런 instruction없이 input만 주는것 <br/><br/></li>
<li><strong>Few-shot prompting</strong> : Prompt 안에 (input, output) 예시들을 추가해주는 것 <br/><br/></li>
<li>Prompting도 Learning으로 봄 <br/><br/></li>
</ul>
</li>
<li><strong>In-context learning</strong> : context안에 있는 설명만으로 새로운 task를 수행할 수 있게 하는것</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/0340363c-9715-422f-88a1-7bdccd162c2c/image.png" alt=""></p>
</blockquote>
<ul>
<li>ChatGPT는 여러 training을 추가하여 사용됨<ul>
<li>GPT-3 + (SFT, RLHF) = InstructGPT <br/><br/></li>
</ul>
</li>
<li>왜 추가적인 작업이 필요한가? → LLM이 misalignment되어있기 때문에<ul>
<li>LLM은 generate하지 않거나, unhelpful하거나, untruthful 혹은 toxic한 생성을 하면 안되는데, 추가적인 training이 없으면 <strong>“follow the user’s instructions helpfully and safely”라는 목표에 적합하지 않게됨</strong><br/><br/></li>
<li><strong>핵심은 misalignment → alignment로 바꾸는 작업 (ex- hallucination)</strong></li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/657cd86c-1c57-4175-b46c-e55cf21d068d/image.png" alt=""></p>
</blockquote>
<ul>
<li>Labelers-based data와 User-based data를 모두 사용하여 Dataset을 Construction함</li>
</ul>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/5c88de2f-294a-439c-a2b5-dd7cecc36e29/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>SFT</strong> : 특정 query에 대한 answer를 잘 generative하게끔 training하는 것 </li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="rlhf-reinforcement-learning-human-feedback-paper">RLHF <a href="https://arxiv.org/abs/2009.01325">(Reinforcement Learning Human Feedback Paper)</a></h3>
</blockquote>
<ul>
<li>크게 <strong>PPO vs DPO</strong>로 나뉨 <br/><br/></li>
<li><strong>PPO (Proximal Policy Optimization)</strong><ul>
<li>PPO는 policy(여기선 language model)를 <strong>fine-tuning하는 trainer(optimizer)</strong> 역할을 하며, <strong>Reward Model(RM)이 높게 점수 주는 출력</strong>을 더 잘 만들어 내도록 모델을 조정함. <br/><br/></li>
<li>RM이 준 <strong>reward</strong>와 현재 <strong>language model의 출력</strong>을 받아서, 이 reward를 <strong>극대화하는 방향으로</strong> 모델 파라미터를 <strong>iterative하게 업데이트</strong>함. <br/><br/></li>
<li><strong>안정성 (KL penalty)</strong><ul>
<li>fine-tuned 모델과 <strong>원래 pretrained 모델 사이의 분포 차이</strong>를 <strong>KL-divergence term</strong>으로 측정해서, <strong>너무 멀리 벗어나지 않도록(regression 방지)</strong> regularization을 걸어줌.</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><strong>PPO-PTX (PPO with Pretrained Transformer Cross-Entropy)</strong><ul>
<li><strong>KL-divergence만으로는</strong> pretrained 모델과의 거리를 충분히 통제하지 못할 수 있음.</li>
<li>현재 모델과 original pretrained 모델 사이에 cross-entropy loss를 추가로 걸어서, fine-tuning 동안 언어 모델이 원래 pretrained LM의 분포에서 너무 멀어지지 않도록 한 번 더 강하게 regularization 하는 방식. <br/><br/>   </li>
</ul>
</li>
<li><strong>PPO-PTX</strong> = PPO(RLHF) + “pretrained LM와 비슷하게 말하게 만드는 CE loss” 를 더한 버전.</li>
</ul>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/a6443572-809f-46ca-835a-2314b3bc088a/image.png" alt=""></p>
</blockquote>
<ul>
<li>RLHF를 쓰지않고 SFT만 쓰게 되면 overfitting됨</li>
</ul>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/b887bcc5-a52d-4775-9fb3-6f3a18226b85/image.png" alt=""></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/ec1ac4a1-141b-47bf-961d-8659658c8e62/image.png" alt=""></p>
<ul>
<li>Reward Model을 어떻게 학습하는가가 매우 중요함 → <strong>너무 어렵고 오래걸림</strong></li>
</ul>
<br/>

<hr>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/9f602a5b-339e-4ca0-a426-c3fdaaf005e8/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>Evaluation metrics for InstructGPT</strong><ul>
<li>모델의 유용성(helpful  or Appropriateness)</li>
<li>모델의 진실성(Truthfulness)</li>
<li>모델의 유해성(Toxicity)</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li>참고) hugging face에서 LLM을 불러올땐 미리 신청하고 토큰을 발급받아야함</li>
</ul>
<p><br/><br/><br/><br/><br/><br/></p>
<hr>
<ul>
<li>참고자료</li>
</ul>
<blockquote>
<h3 id="hfrl-optimization">HFRL Optimization</h3>
</blockquote>
<ul>
<li><a href="https://arxiv.org/abs/1707.06347">Proximal Policy Optimization Algorithms</a><ul>
<li><strong>PPO</strong> <br/><br/></li>
</ul>
</li>
<li><a href="https://arxiv.org/abs/2305.18290">Direct Preference Optimization: Your Language Model is Secretly a Reward Model</a><ul>
<li><strong>DPO</strong> → PPO가 하던걸 RL없이 loss로 구현한 방법 <br/><br/></li>
</ul>
</li>
<li><a href="https://arxiv.org/abs/2407.00087">ARES: Alternating Reinforcement Learning and Supervised Fine-Tuning for Enhanced Multi-Modal Chain-of-Thought Reasoning Through Diverse AI Feedback</a><ul>
<li><strong>ARES</strong> → PPO에 검수하는 teacher를 추가한 방법<ul>
<li>선행 연구 <ul>
<li><a href="https://arxiv.org/abs/2302.00923">Multimodal Chain-of-Thought Reasoning in Language Models</a> <br/><br/></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><a href="https://arxiv.org/abs/2402.03300">DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models</a><ul>
<li><strong>GRPO</strong> → PPO를 Group별로 묶은 방법 <br/><br/></li>
</ul>
</li>
<li><a href="https://arxiv.org/abs/2507.06448">Perception-Aware Policy Optimization for Multimodal Reasoning</a><ul>
<li><strong>PAPO</strong> → Visual Feature를 더 잘 이해할 수 있게 하기 위해 PPO에 LOSS term을 추가한 방법</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[청강] 딥러닝 16 - GPT, BERT , BART]]></title>
            <link>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-16-GPT-BERT-BART</link>
            <guid>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-16-GPT-BERT-BART</guid>
            <pubDate>Mon, 19 Jan 2026 03:08:24 GMT</pubDate>
            <description><![CDATA[<p><a href="https://seoyeon-p.github.io/">한양대학교 박서연 교수님 - github.io</a></p>
<h5 id="한양대학교-박서연-교수님의-딥러닝-수업을-청강-하면서-정리한-내용을-바탕으로-교수님의-허락을-받고-작성하였습니다">(한양대학교 박서연 교수님의 딥러닝 수업을 청강 하면서 정리한 내용을 바탕으로 교수님의 허락을 받고 작성하였습니다.)</h5>
<br/>

<hr>
<h1 id="gpt-bert-bart">GPT, BERT, BART</h1>
<h3 id="bert-code---github"><a href="https://github.com/BDH-teacher/Deep_Learning_Audit_code/blob/main/BERT.ipynb">BERT Code - GitHub</a></h3>
<h3 id="gpt_2-code---github"><a href="https://github.com/BDH-teacher/Deep_Learning_Audit_code/blob/main/GPT_2.ipynb">GPT_2 Code - GitHub</a></h3>
<br/>

<blockquote>
<p><strong>+ 오늘의 연구 코멘트</strong></p>
</blockquote>
<ul>
<li><a href="https://arxiv.org/abs/2503.03321">See What You Are Told: Visual Attention Sink in Large Multimodal Models</a><ul>
<li>Attention Sink 문제를 어떻게 해결할 것인가에 대한 paper <br/><br/></li>
</ul>
</li>
<li><a href="https://arxiv.org/abs/2507.16746">Zebra-CoT: A Dataset for Interleaved Vision Language Reasoning</a><ul>
<li>visual Reasoning을 가능하게하는 dataset을 만들겠다는 paper</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="transformer-based-pre-trained-language-models-gpt-gpt-paper">Transformer based Pre-trained Language Models: GPT <a href="https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf">(GPT Paper)</a></h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/e65f85ec-e6f8-4865-b8ac-bdb2be31ce75/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>transformer의 decoder</strong>만 사용한 모델<ul>
<li>Autoregressive Language Modeling으로 <strong>이전 token만 확인</strong>하여다음 token을 prediction하도록 학습됨 <br/><br/></li>
<li>GPT는 <strong>unidirectional(단방향)</strong>으로 동작해서, <strong>왼쪽에서 오른쪽 방향만 고려하여 prediction</strong>함</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="transformer-based-pre-trained-language-models-bert-bert-paper">Transformer based Pre-trained Language Models: BERT <a href="https://arxiv.org/abs/1810.04805">(BERT Paper)</a></h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/171ecb0a-04e9-4e22-8510-7dab0f11e292/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>transformer의 incoder</strong>만 사용한 모델<ul>
<li>Masked Language Modeling : <strong>input token을 무작위로 mask</strong>하고 context기반으로 prediction하도록 학습됨 <br/><br/></li>
<li><strong>Next Sentence Prediction</strong> : <strong>주어진 두개의 sentences가  original text에서 연속되는지 prediction</strong>하도록 학습됨 <br/><br/></li>
<li>BERT는 <strong>bidirectional(양방향)</strong>으로 동작해서, <strong>context의 양쪽을 모두 보고 prediction</strong>함</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="transformer-based-pre-trained-language-models-bart-bart-paepr">Transformer based Pre-trained Language Models: BART <a href="https://arxiv.org/abs/1910.13461">BART Paepr</a></h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/05af8b36-e6a2-4f34-8e36-c2b37ec770da/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>transformer의 incoder와 decoder를 모두 사용</strong>한 모델<ul>
<li>목표는 <strong>손상된 input sequences를 재구성</strong> 하는것 (seq2seq)</li>
<li>ex) Token Masking, Token Deletion, Text Infilling, Sentence Permutation, Document Rotation  <br/><br/></li>
</ul>
</li>
<li>비슷한 구조로 <strong>T5 model</strong>도 있음<ul>
<li>둘다 <strong>Seq2Seq(incoder-decoder) model</strong></li>
<li>하지만, 각 model마다 architecture나 data processing에서 요구하는 것이 다르기 때문에 task에 맞게 잘 선택해야함 <br/><br/></li>
</ul>
</li>
</ul>
<hr>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/a88c4e5c-5b7b-46d2-ab84-aad74ea15557/image.png" alt=""></p>
<ul>
<li>BART로 machine translation을 진행할경우 encoder를 하나더 추가하는 것이 좋음</li>
</ul>
<br/>

<hr>
<ul>
<li><strong>Pre-trained model</strong> : <strong>이미 학습된(Pre-trained)</strong> 모델 <br/><br/></li>
<li><strong>Fine-tuning</strong> : Pre-trained model을 dataset을 추가하여 <strong>미세조정(Fine-tuning)</strong>하는 것 <br/><br/></li>
<li><strong>Transfer Learning</strong> : task에 대한 정의가 달라질 경우 <strong>task가 전이(Transfer)</strong>되었기 때문에 Transfer Learning이라고 함.<ul>
<li>task간의 전이가 일어날때, Catastrophic Forgetting이 자주 발생함</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<h3 id="summary">Summary</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/22046651-962a-47c1-b132-6429549076a7/image.png" alt=""></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/eeb7156f-deaf-46f9-b3ec-04b3827d4bc3/image.png" alt=""></p>
<p><br/><br/><br/><br/><br/><br/></p>
<hr>
<ul>
<li>참고자료</li>
</ul>
<p><a href="https://huggingface.co/docs/transformers/en/index">Transformers</a></p>
<p><a href="https://huggingface.co/datasets/Rowan/hellaswag">Rowan/hellaswag · Datasets at Hugging Face</a></p>
<p><a href="https://huggingface.co/datasets/allenai/swag">allenai/swag · Datasets at Hugging Face</a>
다음 sentence에 뭐가 와야되는지 prediction하는 방법으로 학습하는 데이터셋</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[청강] 딥러닝 15 - Attention, Transformer]]></title>
            <link>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-15-Attention-Transformer</link>
            <guid>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-15-Attention-Transformer</guid>
            <pubDate>Mon, 19 Jan 2026 02:59:09 GMT</pubDate>
            <description><![CDATA[<p><a href="https://seoyeon-p.github.io/">한양대학교 박서연 교수님 - github.io</a></p>
<h5 id="한양대학교-박서연-교수님의-딥러닝-수업을-청강-하면서-정리한-내용을-바탕으로-교수님의-허락을-받고-작성하였습니다">(한양대학교 박서연 교수님의 딥러닝 수업을 청강 하면서 정리한 내용을 바탕으로 교수님의 허락을 받고 작성하였습니다.)</h5>
<br/>

<hr>
<h1 id="attention-transformer">Attention, Transformer</h1>
<h3 id="transformer-code---github"><a href="https://github.com/BDH-teacher/Deep_Learning_Audit_code/blob/main/transformer.ipynb">transformer Code - GitHub</a></h3>
<br/>

<blockquote>
<p><strong>+ 오늘의 연구 코멘트</strong></p>
</blockquote>
<ul>
<li><a href="https://neurips.cc/virtual/2025/loc/san-diego/poster/116123">NeurIPS Poster Nested Learning: The Illusion of Deep Learning Architectures</a></li>
<li><a href="https://research.google/blog/introducing-nested-learning-a-new-ml-paradigm-for-continual-learning/">Introducing Nested Learning: A new ML paradigm for continual learning</a><ul>
<li>catastrophic forgetting issue를 해결하기 위한 continual learning을 재정의한 paper<ul>
<li>비슷한 keyword : unknown learning</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/19994240-95ed-4530-a638-d21727f1e99f/image.png" alt=""> </p>
</blockquote>
<ul>
<li><a href="https://arxiv.org/abs/1409.0473">Neural Machine Translation by Jointly Learning to Align and Translate</a> <br/><br/></li>
<li>기존에 Seq2Seq model은 Encoder step별로 계산하고, 하나의 lest hidden state가 output으로 나오게 되는데, <strong>각각의 hidden state를 모두 사용할 수 없을까</strong>를 고안하기위해 Attention이라는 이론이 등장함<ul>
<li>모든 time-step의 hidden state를 보기때문에 context를 좀 더 정교하게 볼 수 있다 → <strong>context vector</strong>라고 함</li>
<li>context vector가 decoder의 input으로 추가됨 <br/><br/></li>
</ul>
</li>
<li>이렇게 한 step의 decoder의 hidden state을 업데이트함<ul>
<li>이때, <strong>알파가 decoder의 time-step마다 새롭게 다시 계산하는 것이 핵심</strong></li>
</ul>
</li>
</ul>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/399d6591-5502-41e4-80fb-0872a3c15a64/image.png" alt=""></p>
</blockquote>
<ul>
<li>weight matrix를 Random Initialization하고, <strong>모든 time-step의 hidden state를 붙인것을 dot-product로 계산</strong>함 → 이후 softmax를 적용해서 각 time-step에 대한 attention weight T개를 만듬</li>
</ul>
<br/>

<blockquote>
<h3 id="왜-attention이-좋은가">왜 Attention이 좋은가</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/e0f6c9dc-f5c8-4013-bc5d-dcddd0e5fe9b/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>model이 어디에 집중(Attention)해야하는지 스스로 배움</strong> → network가 ‘context’를 배워간다</li>
</ul>
<br/>

<hr>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/3b643833-9c69-43c7-886f-f86aa59ba133/image.png" alt=""></p>
</blockquote>
<ul>
<li>RNN 계열 Seq2Seq에 attention을 붙이면 성능은 좋아지지만, 여전히 sequential processing에 의존하기 때문에 <strong>parallelization과 efficiency에 한계</strong>가 있음 <br/><br/></li>
<li>하지만, self-attention은 한 문장 안의 각 토큰이 자기와 같은 문장에 있는 모든 토큰을 attention으로 볼수 있기 때문에 <strong>모든 token이 스스로 source이자 target이 되어 각자 안에서 네트워크가 스스로 배울 수 있음</strong></li>
</ul>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/cc95148a-2c9d-4a2b-a739-acd789d87f04/image.png" alt=""></p>
</blockquote>
<ul>
<li><a href="https://arxiv.org/abs/1706.03762">Attention Is All You Need</a> <br/><br/></li>
<li><strong>Self-Attention의 핵심은 Query, Key, Value임</strong><ol>
<li><strong>각 word에 대한 embedding vector를 생성</strong>함 <br/></li>
<li><strong>Query, Key, Value를 각각 담당하는 weight matrix를 생성</strong>함 (처음엔 Random Initialization) 
→ $W_Q$, $W_K$, $W_V$ <br/></li>
<li>각 word embedding vector와 $W_Q$, $W_K$, $W_V$를 곱해서 <strong>각 word에 해당하는 Query, Key, Value의 vector를 구함</strong></li>
</ol>
</li>
</ul>
<hr>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/c20eed65-9ada-4b9e-ba3e-30d8ef03dc02/image.png" alt=""></p>
</blockquote>
<ol>
<li><strong>각 Query vector마다 문장 안의 모든 Key vector와 dot-product를 해서 score들을 계산</strong>함 <br/><br/></li>
<li>각 score들을 <strong>Key dimension의 제곱근(√d_k)으로 나눔</strong> (실험적으로 이렇게 나누는 것이 학습이 가장 안정적이고 잘 됨) <br/><br/></li>
<li>scale된 score에 <strong>softmax를 씌워서 T개의 probability distribution(= attention weight)를 계산</strong>함 <br/><br/></li>
<li>이 weight들을 <strong>각 Value vector에 곱해서, 그 Query에 대한 final output vector를 구함</strong> <br/><br/></li>
<li><strong>모든 time-step</strong> 대해 위 과정을 수행하고, 이들을 모아서 <strong>self-attention layer의 출력 sequence로 사용</strong>됨</li>
</ol>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/7dabfdaf-b524-4600-bdba-44cdf0f6c8c5/image.png" alt=""> </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/621b7907-e8bd-47e1-8910-2c137c035ba5/image.png" alt=""></p>
<ul>
<li><strong>Self-Attention의 과정은 parallel하게 한번에 진행됨</strong> <br/><br/></li>
<li>Multi-head Self-Attention은 Q/K/V weight matrix 세트를 여러 개 두고, 여러 개의 self-attention을 병렬로 돌리는 구조임<ul>
<li><strong>각 head는 문장 안에서 서로 다른 관계에 집중해서 여러 “관점”을 동시에 보게 해서 더 풍부한 문맥 표현과 성능 향상을 얻는 것이 목적</strong></li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/ebfb8d32-6920-4d90-83c3-78f7758a91c4/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>sequential processing을 하지않고 한번에 계산해서 한번에 사용</strong>함 → 굉장히 빠름<ul>
<li>하지만 <strong>순서에 대한 정보를 잃어버림</strong> → 이를 해결하기 위해 <strong>Positional Encoding을 추가</strong>함</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<h3 id="transformer-encoder-architecture">transformer encoder architecture</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/90035855-8d62-4534-86a7-e62dca9cbb43/image.png" alt=""></p>
</blockquote>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/20948ed4-6296-4706-a1ca-d4d4a3766299/image.png" alt=""></p>
</blockquote>
<ul>
<li>Self-Attention은 기본적으로 Parallel Processing이기 때문에 
현재 token이 미래의 token을 보는 것을 방지하기 위해 <strong>오른쪽에 있는 토큰들에 대한 score를 mask해서 softmax 이후 probability가 0이 되도록 만들고, attention을 진행</strong>함</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="add--norm">Add &amp; Norm</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/fb35fcce-57ab-4fbf-9ac2-a769655e1137/image.png" alt=""></p>
</blockquote>
<ul>
<li>Multi-Head Attention의 input으로 들어갔던 시점의 각 word에 대한 embedding vector를 Multi-Head Attention의 Output에 더 해줌<ul>
<li>그렇기 때문에 Multi-head Attention의 <strong>output의 weight matrix를 곱해 dimension을 맞춰줌</strong> <br/><br/></li>
</ul>
</li>
<li>왜 더하는가?<ul>
<li>embedding vector을 그대로 더해 <strong>gradient가 shortcut 경로로 흘러 vanishing gradient 문제를 완화</strong>함 </li>
<li>attention에서 많이 변형되더라도 원래 input이 더해져 있기 때문에 정보 소실을 줄이고 원래 token 정보가 보존됨 <br/><br/></li>
</ul>
</li>
<li>하지만, 단순히 더하는 경우 model이 너무 많은 Feature Space를 handling해야해서 오히려 normalization이 안될 수도 있음 → <strong>layer normalization을 적용</strong>함<ul>
<li>그래서 <strong>Add &amp; Norm</strong>라고 함</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/0d465911-95c2-4f9e-96b1-70e5302e56d2/image.png" alt=""></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/1d4ed8ef-537f-4682-831d-35a27bc269bb/image.png" alt=""></p>
<ul>
<li>여러번의 과정을 거쳐서 나온 <strong>최종 encoder의 output이 decoder의 Multi-Head Attention의 input으로 들어감</strong> <ul>
<li>encoder의 <strong>output은 Key와 Value</strong>로, decoder의 <strong>output은 Query</strong>로 들어가짐 <br/><br/></li>
</ul>
</li>
<li>여기서 층이 깊어질수록 (N값) model의 크기가 커짐 (LLM)</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="positional-encoding">Positional Encoding</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/834f062f-48d3-4def-9411-d656a1eee054/image.png" alt=""></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/b1475f5a-94ca-45d6-8a19-49375474a370/image.png" alt=""></p>
<ul>
<li>평범하게 각 Word마다 순서대로 특정 값을 더하게 될 경우, word의 수가 굉장히 많아 지면 word embedding vector의 크기가 매우 커져서 network가 제대로 작동을 안할 수도 있음 <br/><br/></li>
<li>그렇기 때문에 <strong>주기함수를 사용하여 추가되는 vector의 크기를 크지 않은 값으로 고정</strong>시킴</li>
</ul>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/61eaa080-7bd3-4a71-95d3-694575b2f69a/image.png" alt=""></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/f686d1f5-892b-4395-838b-247335b4d262/image.png" alt=""></p>
<ul>
<li>결국 각 word embedding vector마다 순서가 다르다는 것을 의미하게 하고 싶은것이지만 주기함수 특성상 같은 같이 반복됨<ul>
<li><strong>짝수와 홀수를 각 다른 주기함수</strong>로 나누고, <strong>각 dimension별로 상수를 추가</strong>하여 주기를 다르게 해서 <strong>순서의 차이를 표현</strong>함 (d-model은 fixed 값)</li>
</ul>
</li>
<li>Positional Encoding덕분에 transformer based model들은 매우 긴 context들도 처리를 할 수 있게 됨</li>
</ul>
<p><br/><br/><br/><br/><br/><br/></p>
<hr>
<ul>
<li>참고자료</li>
</ul>
<p><a href="https://jalammar.github.io/illustrated-transformer/">The Illustrated Transformer</a></p>
<p><a href="https://www.youtube.com/watch?v=eMlx5fFNoYc">Attention in transformers, step-by-step | Deep Learning Chapter 6</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[청강] 딥러닝 14 - Text Generation]]></title>
            <link>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-14-Text-Generation</link>
            <guid>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-14-Text-Generation</guid>
            <pubDate>Mon, 19 Jan 2026 02:56:34 GMT</pubDate>
            <description><![CDATA[<p><a href="https://seoyeon-p.github.io/">한양대학교 박서연 교수님 - github.io</a></p>
<h5 id="한양대학교-박서연-교수님의-딥러닝-수업을-청강-하면서-정리한-내용을-바탕으로-교수님의-허락을-받고-작성하였습니다">(한양대학교 박서연 교수님의 딥러닝 수업을 청강 하면서 정리한 내용을 바탕으로 교수님의 허락을 받고 작성하였습니다.)</h5>
<br/>

<hr>
<h1 id="text-generation">Text Generation</h1>
<h3 id="machinetranslation-code---github"><a href="https://github.com/BDH-teacher/Deep_Learning_Audit_code/blob/main/MachineTranslation.ipynb">MachineTranslation Code - GitHub</a></h3>
<br/>

<blockquote>
<p><strong>+ 오늘의 연구 코멘트</strong></p>
</blockquote>
<ul>
<li><a href="https://transformer-circuits.pub/2025/introspection/index.html">Emergent Introspective Awareness in Large Language Models</a><ul>
<li>language model이 무엇을 알고있는지를 확인하는 paper<ul>
<li>그냥 훈련 데이터에서 배운 연기인지, 아니면 진짜 자기 내부 상태를 읽어서 말하는지 <br/><br/> </li>
</ul>
</li>
</ul>
</li>
<li><a href="https://arxiv.org/abs/2510.23595">Multi-Agent Evolve: LLM Self-Improve through Co-evolution</a><ul>
<li>어떻게 하면 LLM이 더 잘 지식을 받아드릴 수 있을까에 대한 paper <br/><br/></li>
</ul>
</li>
<li><a href="https://arxiv.org/abs/2310.01352">RA-DIT: Retrieval-Augmented Dual Instruction Tuning</a><ul>
<li>instruction tuning에 대한 paper <br/><br/><ul>
<li><a href="https://arxiv.org/abs/2210.11416">Scaling Instruction-Finetuned Language Models</a><ul>
<li>instruction tuning의 시작인 paper</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="how-can-we-implement-a-neural-language-model-training-framework">How can we implement a neural language model training framework?</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/85fc109c-bfba-47c1-a9db-bbbeacf35c90/image.png" alt=""></p>
</blockquote>
<ul>
<li>data construction을 진행할 때 주의해야함 (<strong>many-to-one</strong>)<ul>
<li>pytorch의 경우 내부에서 이미 구현되어있음 → vector의 크기를 맞춰줘야함</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<h3 id="ex-rnn">ex) RNN</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/4a6af7c6-f5d9-4679-a43e-39623a0150dc/image.png" alt=""></p>
</blockquote>
<ol>
<li><strong>embedding weight matrix를 무조건 구성해야함</strong> → hidden layer의 input으로 들어가서 n-step hidden state로 나옴 <br/><br/></li>
<li>이후, Fully connected layer로 들어가 vocab distribution만큼 출력 <br/><br/></li>
<li>이후, Ture와 값이 비슷하게 되게끔 Loss를 계산한 뒤, Backpropagation진행 → <strong>이 과정 반복</strong></li>
</ol>
<hr>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/f481f27d-d071-457b-ba1c-ae50ca680ab9/image.png" alt=""></p>
<ul>
<li>data construction을 이렇게 진행하는 이유는 <strong>sequential processing</strong> 하기위함<ul>
<li>사실 Many-to-Many로 줘도 내부적으로 알아서 처리함<ul>
<li>하지만  many-to-one이 좀 더 효율적임</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li>training을 구성했으면 testing도 구성해야함
<img src="https://velog.velcdn.com/images/mit_bang/post/e7366b82-3bc3-4f62-81da-f0660705f78f/image.png" alt=""></li>
<li>decoding을 어떻게 할건지에 대한건 매우 많은 알고리즘들이 있음 (ex - greedy decoding)</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="text-generation-eg-machine-translation">Text Generation (e.g., Machine Translation)</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/028f4832-d0e3-406c-b615-915983d151da/image.png" alt=""></p>
</blockquote>
<ul>
<li>Machine Translation에서 궁극적인 목표는 <strong>sequence x가 주어졌을때 target sequence y를 생성하는 probability를 최대화 하는 것 → Increase the conditional probability</strong></li>
</ul>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/3faa27f2-068b-402c-828a-7e81e4d30b25/image.png" alt=""></p>
</blockquote>
<ul>
<li>Seq2Seq Model for Text Generation (e.g., Machine Translation) 구조</li>
</ul>
<hr>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/414f773c-a0ec-47b1-be98-86f7a1b4c9b1/image.png" alt=""></p>
<ul>
<li>special token은 필수로 들어가야함 → <strong>문장의 시작과 끝을 명확하게 하기 위함</strong></li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="greedy-decoding">Greedy decoding</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/f28ff809-0146-4dab-a7ae-2a915880c179/image.png" alt=""></p>
</blockquote>
<ul>
<li>Greedy decoding은 굉장히 단순하고 빠르지만, 항상 optimal한 output이 나오지는 않음</li>
</ul>
<br/>

<blockquote>
<h3 id="beam-search">Beam search</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/de591c92-e478-4b57-be77-f05c3082ce4b/image.png" alt=""></p>
</blockquote>
<ul>
<li>top-k의 후보를 두고 계속적으로 확장해나가는 방법 (greedy의 확장판)<ul>
<li>각 후보는 현재 token과 이전 token들의 누적 probability를 기반으로 결정됨</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<h3 id="top-k-sampling">Top-k Sampling</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/2f3b6cce-d455-41e9-994a-aed29f77733b/image.png" alt=""></p>
</blockquote>
<ul>
<li>top-k개의 후보를 선택하여 probability Normaliztion를 진행함 → 정규화된 probability를 기반으로 sampling 함 (greedy가 아니기 때문에 무조건 높은값을 선택하지 않음)</li>
</ul>
<br/>

<blockquote>
<h3 id="top-p-sampling">Top-p Sampling</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/40342a7f-fc71-4db1-976e-a2608953a2ba/image.png" alt=""></p>
</blockquote>
<ul>
<li>누적 probability가 p 이상이 될 때까지 상위 후보들을 모아 동적으로 후보 집합을 만든 뒤, 그 안에서 probability를 정규화해서 sampling함 (그래서 top-k처럼 후보 개수가 고정돼 있지 않음)</li>
</ul>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/fe642536-dff3-4392-bb64-5cdc5b1857cc/image.png" alt=""></p>
</blockquote>
<ul>
<li>요즘엔 Top-k와 Top-p를 섞어서 같이 쓰기도함</li>
</ul>
<br/>

<hr>
<h3 id="summary">summary</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/1114f16e-9f64-4a74-a2dc-a4b6a43c0417/image.png" alt=""></p>
<p><br/><br/><br/><br/><br/><br/></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[청강] 딥러닝 13 - Language Model]]></title>
            <link>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-13-Language-Model</link>
            <guid>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-13-Language-Model</guid>
            <pubDate>Mon, 19 Jan 2026 02:55:13 GMT</pubDate>
            <description><![CDATA[<p><a href="https://seoyeon-p.github.io/">한양대학교 박서연 교수님 - github.io</a></p>
<h5 id="한양대학교-박서연-교수님의-딥러닝-수업을-청강-하면서-정리한-내용을-바탕으로-교수님의-허락을-받고-작성하였습니다">(한양대학교 박서연 교수님의 딥러닝 수업을 청강 하면서 정리한 내용을 바탕으로 교수님의 허락을 받고 작성하였습니다.)</h5>
<br/>

<hr>
<h1 id="language-model">Language Model</h1>
<h3 id="language_model-code---github"><a href="https://github.com/BDH-teacher/Deep_Learning_Audit_code/blob/main/Language_Model.ipynb">Language_Model Code - GitHub</a></h3>
<br/>

<blockquote>
<h3 id="-오늘의-연구-코멘트">+ 오늘의 연구 코멘트</h3>
<p><a href="https://arxiv.org/abs/2503.05179">Sketch-of-Thought paper</a></p>
</blockquote>
<ul>
<li>prompting 관련 연구<ul>
<li>VLM 오픈소스 중 대표적인 모델 llama, Qwen이 있는데 Qwen이 좀더 성능이 좋음</li>
<li>대형 모델을 학습시켜야 할때 클라우드 서비스 이용하는 것도 방법임<ul>
<li><a href="https://www.runpod.io/?ref=uy3oggcm&amp;gad_source=1&amp;gad_campaignid=23151377700&amp;gbraid=0AAAABBaExYWAfZGVlkkAFF2e44X7nWi90&amp;gclid=Cj0KCQiAi9rJBhCYARIsALyPDttDCW6eQjG8llzvDG3CnK9le2vGTedcs99sL0CFMzrNZ0wynmzC1XkaAkwGEALw_wcB">Runpod | The cloud built for AI</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>  

<hr>
<blockquote>
<h3 id="language-model-1">Language Model</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/998f51ad-4f87-4426-b24a-9cec10a6444b/image.png" alt=""></p>
</blockquote>
<ul>
<li>language modeling은 우리가 살고있는 세계의 언어 지식을 model에게 encodeing하는 것 → 자주보이는 sentence Probability를 그렇지 않은 Probability보다 높여가는 것<ul>
<li>probability theory를 적용 → sentence를 하나의 unit으로 보는것이 아닌 <strong>timestep별로 쪼개서 Conditional Probability로 적용</strong></li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="neural-language-modeling">(Neural) Language Modeling</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/140c2082-4439-4e9f-9b21-625509cb167e/image.png" alt=""></p>
</blockquote>
<ul>
<li>핵심은 현실 세계에서 자주 등장하는 sentence의 Probability를 높이는것<ul>
<li><strong>즉, sequence에 대한 Conditional Probability를 높이는 것이 목표</strong></li>
</ul>
</li>
</ul>
<br/>  

<blockquote>
<h3 id="left-to-right-language-models">(Left-to-Right) Language Models</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/3d8aa4dc-80b1-4d93-99b9-406c4d283ffe/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>autoregressive language model</strong> : 이전 token이 주어졌을때 다음 token의 probability 높이는 방법<ul>
<li>ex) GPT series</li>
</ul>
</li>
</ul>
<br/>  

<blockquote>
<h3 id="masked-language-models">(Masked) Language Models</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/77a5a0d1-3a36-4044-b0b8-9c566b7d2286/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>Masked Language Model</strong> : sequence 안의 일부 token 위치를 랜덤하게 [MASK]로 가린 뒤, 주변 context를 보고 <strong>mask자리의 정답 probability를 prediction</strong>하도록 학습하는 방법<ul>
<li>양방향의 context를 모두 보고 prediction하도록 학습되기 때문에, text generation에 적합하지 않음</li>
<li>ex) BERT</li>
</ul>
</li>
</ul>
<p><br/><br/><br/><br/><br/><br/></p>
<hr>
<ul>
<li>참고자료</li>
</ul>
<p><a href="https://arxiv.org/abs/1910.13461">BART Paper</a> </p>
<p><a href="https://arxiv.org/abs/1910.10683">Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer Paper</a></p>
<ul>
<li>대표적인 trasformer기반 Text Generation model<ul>
<li>BERT는 Text Classification model (혹은 RoBERTa)</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[청강] 딥러닝 12 - Evaluation Metric]]></title>
            <link>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-12-Evaluation-Metric</link>
            <guid>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-12-Evaluation-Metric</guid>
            <pubDate>Mon, 19 Jan 2026 02:51:07 GMT</pubDate>
            <description><![CDATA[<p><a href="https://seoyeon-p.github.io/">한양대학교 박서연 교수님 - github.io</a></p>
<h5 id="한양대학교-박서연-교수님의-딥러닝-수업을-청강-하면서-정리한-내용을-바탕으로-교수님의-허락을-받고-작성하였습니다">(한양대학교 박서연 교수님의 딥러닝 수업을 청강 하면서 정리한 내용을 바탕으로 교수님의 허락을 받고 작성하였습니다.)</h5>
<br/>

<hr>
<h1 id="evaluation-metric">Evaluation Metric</h1>
<h3 id="evaluation_metric-code---github"><a href="https://github.com/BDH-teacher/Deep_Learning_Audit_code/blob/main/Evaluation_Metric.ipynb">Evaluation_Metric Code - GitHub</a></h3>
<br/>

<blockquote>
<h3 id="-오늘의-연구-코멘트">+ 오늘의 연구 코멘트</h3>
</blockquote>
<ul>
<li>최근 연구 동향<ul>
<li><a href="https://arxiv.org/abs/2211.10438">SmoothQuant Paper</a></li>
<li><a href="https://arxiv.org/abs/2406.18406">IRCAN Paper</a></li>
<li><a href="https://arxiv.org/abs/2502.17888">RankCo Paper</a></li>
<li><a href="https://arxiv.org/abs/2406.05794">RE-RAG Paper</a></li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="evaluation-metric-1">Evaluation Metric</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/7b87360e-30f7-4d73-9ec5-a78f03f7a381/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>perplexity(혼잡도)</strong> : text generation에서 next word를 prediction할 때, 몇 개의 word 사이에서 헷갈리는지 → 자주 쓰임 <br/><br/></li>
<li>BLEU,ROGUE는 특정 task에서만 쓰임<ul>
<li><strong>BLEU</strong> : 내가 번역한 문장 안에, 정답 번역에 있는 “짧은 구(단어 묶음)”가 얼마나 많이/정확히 겹치는지</li>
<li><strong>ROUGE</strong> : 내가 쓴 요약·문장 안에, 정답 요약에 있는 중요 단어/구를 얼마나 빠짐없이 담았는지 <br/><br/></li>
</ul>
</li>
<li>최근엔 BLEU,ROGUE을 안쓰고 exact match score를 사용함<ul>
<li><a href="https://arxiv.org/abs/2407.01102">BERGEN: A Benchmarking Library for Retrieval-Augmented Generation</a></li>
<li><a href="https://github.com/naver/bergen">GitHub - naver/bergen: Benchmarking library for RAG</a></li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/df0c94fa-b0a6-4503-a516-8f9f14c30180/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>Recall</strong> : 실제 정답 중에 몇개 맞췄는지 (<strong>실제 정답 중에서 맞춘 비율</strong>) <br/><br/></li>
<li><strong>Precision</strong> : 모델이 Prediction한 것 중에 몇개가 정답인지 (<strong>예측한 것들 중에서 진짜인 비율</strong>) <br/><br/></li>
<li>굳이 외울 필요 없음 → 의미가 중요</li>
</ul>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/98d84e55-66f7-4b48-b831-33e9711b721a/image.png" alt=""></p>
</blockquote>
<ul>
<li>dataset이 balance되어서 public하게 공개된 것이 아니라면 Accuracy와 Recall, Precision을 모두 봐야함</li>
</ul>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/f5b90733-9e36-4123-bdfa-faba1154bd9b/image.png" alt=""></p>
</blockquote>
<ul>
<li>제일 대표적으로 Macro F1을 사용함</li>
</ul>
<br/>

<hr>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/103c2ba4-ea93-4a53-8e9e-ca5fd5e7a1a3/image.png" alt=""></p>
</blockquote>
<ul>
<li>model이 prediction한 confidence랑, 실제로 맞은 비율이 얼마나 차이 나는지를 측정하는 Evaluation Metric<ul>
<li>Calibration Error을 수치화 한것이 Expected Calibration Error임</li>
<li>model이 prediction을 과신하기 때문에 생김 <ul>
<li>즉, model이 <strong>prediction한 확률(confidence)과 실제 정답 비율(accuracy) 사이의 간극을 측정</strong>하는 것</li>
</ul>
</li>
</ul>
</li>
</ul>
<blockquote>
<h3 id="ece-example">ECE Example</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/7cb71a7d-a77b-47b5-b81f-23bb25dd7d5e/image.png" alt=""></p>
</blockquote>
<br/>

<hr>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/6fa0d5ff-78de-4f37-bd1e-0851ba7ba91b/image.png" alt=""></p>
</blockquote>
<ul>
<li>ROC Curve가 y축에 가까울수록 (혹은 ROC Curve의 아래쪽 넓이가 클수록) 좋은 모델임</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="text-generation-evaluation-metric--perplexity">Text Generation Evaluation Metric : Perplexity</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/0971fb65-4593-4b87-89d1-61216eb2dde4/image.png" alt=""></p>
</blockquote>
<ul>
<li>Sentence의 Perplexity를 구하는것<ul>
<li>output prediction값을 통해서 문장을 구성 → chain-rule</li>
<li>어떤 language probability을 구할 때, model이 Produce한 모든 probability를 모두 곱해서 계산함 <br/><br/></li>
</ul>
</li>
<li>최종 결과값인 Perplexity값을 통해 model이 몇개의 단어 사이에서 혼동이 왔는지를 알 수 있음</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="text-generation-evaluation-metric--bleu-rogue">Text Generation Evaluation Metric : BLEU, ROGUE</h3>
</blockquote>
<ul>
<li>machine translation task에서 제일 많이 쓰임<ul>
<li><strong>reference</strong> : 정답</li>
<li><strong>hypothesis</strong> : model의 prediction값</li>
<li>단어들을 보고, hypothesis와 reference을 비교해서 매칭되는 것들을 찾는다 <br/><br/></li>
</ul>
</li>
</ul>
<hr>
<h3 id="bleu-precision-based-scoring）">BLEU (Precision based scoring）</h3>
<p><a href="https://arxiv.org/pdf/1810.05995">BLEU Paper</a></p>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/1446dc58-cd7f-46f7-ab1a-9deb56ea3593/image.png" alt=""></p>
<ul>
<li>Precision based로 hypothesis(prediction)를 기준으로(분모로) 계산함<ul>
<li>prediction문장이 짧은 경우 penalty을 추가함 <br/><br/></li>
</ul>
</li>
</ul>
<hr>
<h3 id="rogue-recall-based-scoring">ROGUE (Recall based scoring)</h3>
<p><a href="https://aclanthology.org/W04-1013.pdf">ROGUE Paper</a></p>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/92bea7f0-5162-4941-8c6e-889b8f040e3f/image.png" alt=""></p>
<ul>
<li>Recall based로 reference(True)를 기준으로(분모로) 계산함<ul>
<li>ROUGE-F1 score : Precision과 Recall을 구한뒤 조화평균을 계산하는것<ul>
<li>ROGUE는 Recall based인데 이경우 결국 Precision도 계산하는 것이라 ROGUE의 의미가 줄어듬</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="text-generation-analysis-technique--t-sne-visualization">Text Generation analysis Technique : T-SNE Visualization</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/c69cf6c6-bf0b-4a12-b7c0-a63a1a03aea0/image.png" alt=""> </p>
</blockquote>
<ul>
<li>BERT 기반으로, word vector(768 dimension)을 2d space로 축소해서 각 단어/문장을 점으로 표현해 visualization하는 방법<ul>
<li>의미가 비슷한 단어·문장이 실제로 가까이 모이는지, generated text의 분포가 reference와 얼마나 비슷한지 확인 할 수 있음</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="overfittingunderfitting--k-fold-cross-validation">Overfitting/Underfitting : K-fold Cross-validation</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/23dcac2b-364f-4932-bcbb-447883424944/image.png" alt=""></p>
</blockquote>
<ul>
<li>이론적으로는 K-fold cross-validation을 쓸 수도 있지만, 요즘은 benchmark dataset이 미리 정해진 train/validation/test split을 같이 공개해두기 때문에, 제공된 split에 맞춰 training하고 Evaluation을 진행하는 것이 일반적임 → custom dataset이 아닐 경우 쓸일이 없음</li>
</ul>
<p><br/><br/><br/><br/><br/><br/></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[청강] 딥러닝 11 - Normalization, Optimization]]></title>
            <link>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-11-Normalization-Optimization</link>
            <guid>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-11-Normalization-Optimization</guid>
            <pubDate>Mon, 19 Jan 2026 01:44:15 GMT</pubDate>
            <description><![CDATA[<p><a href="https://seoyeon-p.github.io/">한양대학교 박서연 교수님 - github.io</a></p>
<h5 id="한양대학교-박서연-교수님의-딥러닝-수업을-청강-하면서-정리한-내용을-바탕으로-교수님의-허락을-받고-작성하였습니다">(한양대학교 박서연 교수님의 딥러닝 수업을 청강 하면서 정리한 내용을 바탕으로 교수님의 허락을 받고 작성하였습니다.)</h5>
<br/>

<hr>
<h1 id="normalization-optimization">Normalization, Optimization</h1>
<h3 id="normalization--optimization-code---github"><a href="https://github.com/BDH-teacher/Deep_Learning_Audit_code/blob/main/Normalization%2C_Optimization.ipynb">Normalization &amp; Optimization Code - GitHub</a></h3>
<br/>


<blockquote>
<h3 id="-오늘의-연구-코멘트">+ 오늘의 연구 코멘트</h3>
<p><a href="https://github.com/ndb796/Deep-Learning-Paper-Review-and-Practice/tree/master">GitHub - ndb796/Deep-Learning-Paper-Review-and-Practice: 꼼꼼한 딥러닝 논문 리뷰와 코드 실습</a></p>
</blockquote>
<p><a href="https://arxiv.org/abs/2510.18212">A Definition of AGI Paper</a></p>
<ul>
<li>paper는 Introduction이 제일 중요함<ul>
<li>Introduction : 개념들 정의, 저자들의 관심있어하는 기술들 소개, 이전의 연구들에 대한 한계점 및 저자들의 해결 방안</li>
<li>즉, 논리적인 흐름이 중요함</li>
<li>논문 읽을때나 무언가를 공부할때는 항상 how(어떻게 했는가)을 공부한 뒤에 why(왜 그렇게 했는가)를 공부하는 것이 좋음</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/c6bece0d-a8ff-4477-be53-73b131db49d0/image.png" alt=""></p>
</blockquote>
<ul>
<li>zero-centered가 아닌 문제 해결하는 방법<ul>
<li>zero-centered한 activation function 사용</li>
<li>input이 항상 positive하지 않게 해주면 됨 →  Batch Normalization <br/><br/></li>
</ul>
</li>
<li><strong>Normalization : 베타와 감마를 통해 Flexibility하게 만드는 것</strong></li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="batch-normalization"><a href="https://arxiv.org/abs/1502.03167">Batch Normalization</a></h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/cb3bf3b4-83c5-4dfd-aa4f-a955c39b6ad2/image.png" alt=""></p>
</blockquote>
<ul>
<li>Batch Normalization<ul>
<li>input vector가 zero mean이고 unit variance을 가지도록 range를 조정하는 방법</li>
<li>test Phase때는 train data에서 기록되어진 mean과 variance를 가지고 test input을 Normalization함 (<strong>test data 자체를 가지고 Normalization 하는 것이 아님</strong>)</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<h3 id="layer-normalization"><a href="https://arxiv.org/abs/1607.06450">Layer Normalization</a></h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/00e7650a-f867-40b2-8554-f67858100081/image.png" alt=""></p>
</blockquote>
<ul>
<li>sequential data processing(texts processing)할 때는 Batch Normalization이 아니라 Layer Normalization을 진행해야함<ul>
<li>Batch Normalization은 <strong>data의 sample이 0을 평균으로 가지고, variance가 1을 가지는 distribution에서 뽑아졌다고 가정</strong>함. 즉, sample들이 independent하다고 가정하는 것)<ul>
<li>texts processing에서는 <strong>문장안에 각 word가 서로 매우 dependent</strong>하기 때문에 사용할 수 없음 <br/><br/></li>
</ul>
</li>
</ul>
</li>
<li>Layer Normalization : feature dimension을 따라서 Normalization을 진행하는 방법<ul>
<li>Batch Normalization은 Batch dimension을 따라 진행해서 각 vector들의 dependent한 feature을 무시하게 되지만, Layer Normalization은 feature dimension을 따라 Normalization을 진행하기 때문에 의미 정보가 소실되지 않음</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="optimization--stochastic-gradient-descent">Optimization : Stochastic Gradient Descent</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/f8e27eac-4361-42a6-8590-5ce3c5a09ac8/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>기본적인 Gradient Descent</strong> 방법은 모든 data sample을 보고 각각의 step별로 Gradient를 다 계산한 후, 그 Gradient들을 가지고 <strong>한번에 update</strong>를 하는것</li>
</ul>
<hr>
<ul>
<li><strong>Stochastic Gradient Descent</strong>는 모든 Gradient를 다보고 한번에 update를 하는 것이 아니라, <strong>Gradient가 계산될 때마다 update</strong>을 하는 방법 <br/><br/><ul>
<li><strong>problem 1</strong> : 모든 Gradient를 보고 update를 하는 것이 아니기 때문에(batch processing 하기 때문에) <strong>Gradient Noise가 누적</strong>되어, 학습이 제대로 되지 않을 수도 있음 <br/><br/></li>
<li><strong>problem 2 : Poor Conditioning</strong> <img src="https://velog.velcdn.com/images/mit_bang/post/1b202d50-d45b-47bd-a899-f65fa527d255/image.png" alt=""><ul>
<li>weight가 어떻게 변하는지에 따라서 Gradient가 너무 많이 변함 → Gradient가 예민하기 때문에 <strong>zigzagging behavior이 발생</strong>하여 매애애애애우 느려지는 현상이 발생함 <br/><br/><ul>
<li><strong>problem 3 : Local Minima, Saddle Points</strong> <img src="https://velog.velcdn.com/images/mit_bang/post/c45c7a60-ea83-4815-8198-f50bd08f9958/image.png" alt=""></li>
<li>결국 Gradient를 통해 update하는것 이기 때문에, <strong>gradient=0인 지점이 여러 개 존재할 경우, local minima나 saddle point에 수렴</strong>할 수 있음</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="optimization-sgd--momentum">Optimization: SGD + Momentum</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/0e04d34e-41cc-4a93-94aa-1398118bf4db/image.png" alt=""></p>
</blockquote>
<ul>
<li>zigzagging behavior와 Local Minima의 문제를 해결하기 위해서 <strong>Momentum이라는 velocity를 추가</strong>해서 빠져나올 수 있도록함 → <strong>즉, Gradient에 memory가 생기는 것</strong> <br/><br/><ul>
<li><strong>problem 1</strong> →  velocity 덕분에 gradient estimate에 섞인 <strong>noise가 평균화</strong>가 되어 해결됨 <br/><br/></li>
<li><strong>problem 2</strong> → velocity가 <strong>step을 가속</strong>시켜 줘서, gradient 방향이 자꾸 바뀌며 생기는 zigzagging behavior를 줄임 <br/><br/></li>
<li><strong>problem 3</strong> → gradient가 0이어서 local minima나 saddle points에 갇혀 있어도, 이제는 velocity가 있어 그 지점을 빠져 나올 수 있음</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/4c469e01-cd31-43c2-b756-2654b5236985/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>AdaGrad</strong> : Momentum은 velocity을 update할 때 gradient하나만 가지고 진행했다면, squared gradients로 velocity를 update하는 방법 <br/><br/></li>
<li><strong>RMSProp</strong> : AdaGrad방법론에서 얼만큼 update할건지 베타를 사용하여 정하는 방법</li>
</ul>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/e1fe1b9f-336a-4f0d-99e4-99f252ed34c7/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>Adam</strong> : Momentum에서 계산하는 방식과 AdaGrad에서 계산하는 방식에서의 benefit들을 가지고와서 합친 방법 <br/><br/></li>
<li><strong>AdamW</strong> : Adam에서 Weight Decay을 추가한 방법</li>
</ul>
<br/>

<hr>
<blockquote>
<ul>
<li><strong>Monitoring a Learning Procedure</strong><ol>
<li>train loss을 확인하고 learning rate조절 (국룰 learning rate : 1e-3, 1e-5)</li>
<li>eval accuracy을 확인하고 갑자기 좋아진 순간 Early Stopping하는 것도 좋음 </li>
</ol>
</li>
</ul>
</blockquote>
<hr>
<blockquote>
<ul>
<li><strong>Hyperparameter Optimization</strong> <img src="https://velog.velcdn.com/images/mit_bang/post/eb89b981-c366-48b6-be10-97ab8ba83444/image.png" alt=""><ul>
<li>loss을 확인하기</li>
<li>다른 reference 참고 하기</li>
<li><strong>핵심은 많이 학습해서 많이 확인하기 (노가다)</strong></li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/8d755f49-a97e-4a25-aab4-00330f8b7d76/image.png" alt=""></p>
</blockquote>
<ul>
<li>Learning rate을 크게 바꿔봐야 Learning rate문제인지 code문제인지 알 수 있음 <br/><br/></li>
<li>underfitting이 된경우 : Network의 Complexity을 높이는 쪽으로 접근할 수도 있음 <br/><br/></li>
<li>제일 중요한것은 data가 얼마나 많은지, 질이 좋은지 확인하는것</li>
</ul>
<p><br/><br/><br/><br/><br/><br/></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[청강] 딥러닝 10 - Regularization]]></title>
            <link>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-10-Regularization</link>
            <guid>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-10-Regularization</guid>
            <pubDate>Mon, 19 Jan 2026 01:43:25 GMT</pubDate>
            <description><![CDATA[<p><a href="https://seoyeon-p.github.io/">한양대학교 박서연 교수님 - github.io</a></p>
<h5 id="한양대학교-박서연-교수님의-딥러닝-수업을-청강-하면서-정리한-내용을-바탕으로-교수님의-허락을-받고-작성하였습니다">(한양대학교 박서연 교수님의 딥러닝 수업을 청강 하면서 정리한 내용을 바탕으로 교수님의 허락을 받고 작성하였습니다.)</h5>
<br/>

<hr>
<h1 id="regularization">Regularization</h1>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/b236c7ab-19fc-4f04-b163-24e2e6738384/image.png" alt=""></p>
</blockquote>
<ul>
<li>Regularization통해 generalization을 잘해야 overfitting을 방지할 수 있음<ul>
<li><strong>model training의 목표는 generalization된 model을 만드는것</strong> → Regularization를 통해 train <strong>data를 외워버리는 overfitting issue를 방지</strong>해야함 <br/><br/></li>
</ul>
</li>
<li>사실 데이터를 많이 모으는것이 제일 좋음</li>
</ul>
<br/>

<hr>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/6903873f-949b-48bb-a107-2c461ea8c4f7/image.png" alt=""></p>
</blockquote>
<ul>
<li>idea : 너무 많은 neuron들이 불필요하게 학습이 되고있기 때문에 몇몇 neuron을 껏다 켰다하자</li>
<li><strong>각 neuron들을 random하게 sampling해서 value를 확인하고, activate할지 deactivate할지 정한다</strong></li>
</ul>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/a3cecafa-66dc-4e35-913a-8973357af1f8/image.png" alt=""></p>
</blockquote>
<ul>
<li>Training Loss와 eval Loss을 관측하고 특정순간 이후로 지속적으로 eval Loss가 계속 증가하면 중간에 training을 멈춤</li>
<li>너무 성급하게 Early Stopping을 하는것 보다 Loss을 분석하고 learning rate을 조절하는것이 더 옳바른 방법임</li>
</ul>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/43f08abf-fa4e-452e-87f3-508dcec54613/image.png" alt=""></p>
</blockquote>
<ul>
<li>Weight Decay는 Weight가 엄청 큰 경우에만 작용하는 regularization technique이다 → 항상 잘 적용되지는 않음</li>
<li>Weight의 크기를 측정하여 loss을 작게 만드는것이 목표<ul>
<li>즉, Weight가 크지 않으면 Weight Decay가 잘 작동하지 않을 수가 있음 <br/><br/></li>
</ul>
</li>
</ul>
<hr>
<ul>
<li>L1 : sparse model에서 유용함<ul>
<li>중요하지 않은 weight를 0으로 보내서 feature selection 효과를 내고, parameter를 자연스럽게 sparse하게 만들기 때문 <br/><br/></li>
</ul>
</li>
<li>L2 : deep learning에서 유용함<ul>
<li>모든 weight를 부드럽게 shrink시켜서 gradient가 항상 well-define되다보니, backpropagation과 optimization이 안정적이고 generalization을 개선하기 때문</li>
</ul>
</li>
</ul>
<p><br/><br/><br/><br/><br/><br/></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[청강] 딥러닝 9 - Activation Functions]]></title>
            <link>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-9-Activation-Functions</link>
            <guid>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-9-Activation-Functions</guid>
            <pubDate>Mon, 19 Jan 2026 01:42:22 GMT</pubDate>
            <description><![CDATA[<p><a href="https://seoyeon-p.github.io/">한양대학교 박서연 교수님 - github.io</a></p>
<h5 id="한양대학교-박서연-교수님의-딥러닝-수업을-청강-하면서-정리한-내용을-바탕으로-교수님의-허락을-받고-작성하였습니다">(한양대학교 박서연 교수님의 딥러닝 수업을 청강 하면서 정리한 내용을 바탕으로 교수님의 허락을 받고 작성하였습니다.)</h5>
<br/>

<hr>
<h1 id="activation-functions">Activation Functions</h1>
<h3 id="activation_function-code---github"><a href="https://github.com/BDH-teacher/Deep_Learning_Audit_code/blob/main/Activation_Function.ipynb">Activation_Function Code - GitHub</a></h3>
<br/>

<blockquote>
<h3 id="activation-functions-1">Activation Functions</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/3ac665f4-c936-4220-a159-9a2c14da4119/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>Basics Activation Functions : Sigmoid, Tanh, ReLU</strong></li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="sigmoid">Sigmoid</h3>
</blockquote>
<ul>
<li>neuron이 포화되었는지 확인하는 Activation Function
<img src="https://velog.velcdn.com/images/mit_bang/post/cf3c1668-940c-4f71-8615-9bcb7d8fffe3/image.png" alt=""></li>
<li>neuron이 어떤 input이 들어왔을때 반응이 없으면 포화되었다고 함</li>
<li>즉, <strong>gradients 정보가 소실</strong>됨</li>
</ul>
<br/>

<blockquote>
<h3 id="problem-1">Problem 1</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/febbe9be-6c43-484f-b43b-4aa9d7836000/image.png" alt=""></p>
</blockquote>
<ul>
<li>neuron이 포화되었는지 빠르게 확인 할 수 있는 benefit이 있지만, 반대로 <strong>Sigmoid를 사용했기때문에 neuron이 포화되는 현상</strong>이 생김<ul>
<li>ex) input = -6이면 gradient가 0이되버림 → Vanishing Gradient <br/><br/><blockquote>
<h3 id="problem-2">Problem 2</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/0c886c87-c975-4dfa-95f6-4f3b5ab7f312/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
<li>Sigmoid outputs are not zero-centered<ul>
<li><strong>모든 input이 다 양수일때, 모든 gradient가 다 양수이거나 음수가 되버릴 수 있음</strong> (not always)<ul>
<li>gradient의 의미가 없어짐 → 한방향으로만 update됨 <br/><br/></li>
</ul>
</li>
<li><strong>Batch Normalization</strong> : 이를 해결하기위해 다 양수이거나 음수가 아니게 변경해주는 것</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="tanh">tanh</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/c761fd44-2c86-4b81-8734-e628ef7cb59a/image.png" alt=""></p>
</blockquote>
<ul>
<li>Sigmoid의 Problem 2를 해결하기위한 zero-centered 형태인 Activation Function<ul>
<li>하지만, <strong>neuron이 포화되었을때 Still kills the gradients 됨 (Vanishing Gradient)</strong></li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="relu">ReLU</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/eba43dda-50bf-491a-80bd-8d8e71f62698/image.png" alt=""></p>
</blockquote>
<ul>
<li>Sigmoid나 tanh의 neuron saturated 이슈를 해결하기 위한 형태의 Activation Function<ul>
<li>negative Value에 대해선 여전하지만, <strong>positive 부분에서는 Vanishing Gradient 문제를 해결</strong>함</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<h3 id="leaky-relu">Leaky ReLU</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/97e249f1-6665-4103-b81d-da0f38132354/image.png" alt=""></p>
</blockquote>
<ul>
<li>negative Value에 대해서도 해결하기 위한 형태의 Activation Function</li>
</ul>
<blockquote>
<h3 id="elu-elu-paper">ELU <a href="https://arxiv.org/abs/1511.07289">(ELU Paper)</a></h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/09daaa81-bcd5-4eac-853c-c3ae2a8e61f7/image.png" alt=""></p>
</blockquote>
<ul>
<li>모든 이슈들을 해결하기 위한 형태의 Activation Function</li>
</ul>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/150b01d8-80d3-4219-93fa-32e73822adcf/image.png" alt=""></p>
</blockquote>
<ul>
<li>그외의 현대의 Activation Function들 → 최근 동향은 여러 Activation Function을 융합하는 형태임</li>
<li>그래서 <strong>random하게 Weight Initialization하는것이 중요</strong>함</li>
</ul>
<p><br/><br/><br/><br/><br/><br/></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[청강] 딥러닝 8 - Data Exploration, Data Processing]]></title>
            <link>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-8-Data-Exploration-Data-Processing</link>
            <guid>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-8-Data-Exploration-Data-Processing</guid>
            <pubDate>Mon, 19 Jan 2026 01:41:08 GMT</pubDate>
            <description><![CDATA[<p><a href="https://seoyeon-p.github.io/">한양대학교 박서연 교수님 - github.io</a></p>
<h5 id="한양대학교-박서연-교수님의-딥러닝-수업을-청강-하면서-정리한-내용을-바탕으로-교수님의-허락을-받고-작성하였습니다">(한양대학교 박서연 교수님의 딥러닝 수업을 청강 하면서 정리한 내용을 바탕으로 교수님의 허락을 받고 작성하였습니다.)</h5>
<blockquote>
<h3 id="오늘의-tmi">오늘의 TMI</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/aae62150-4982-48da-8bce-96419a6752df/image.png" alt=""></p>
</blockquote>
<ul>
<li>최근 동향 : 처음부터 Data Exploration &amp; Processing을 진행하는 것이 아닌 pre-trained model을 가져와서 추가적으로 data를 학습함<ul>
<li>BERT: encoder만 쓰는 양방향 masked language model로, 문장 이해·분류용에 특화된 모델</li>
<li>BART: BERT식 encoder + GPT식 decoder를 합친 seq2seq generation model로, 문장 복원·생성용에 특화된 모델 <br/><br/></li>
</ul>
</li>
<li>pre-trained model을 가져와서 fine-tuning할때 사용한 모델에 special tokens의 형식이 어떻게 되어있는지 잘 확인해야함 <br/><br/></li>
</ul>
<hr>
<p><a href="https://arxiv.org/abs/1710.09412">mixup: Beyond Empirical Risk Minimization</a></p>
<ul>
<li>text classification에서 Noiseless Level을 해결하기위한 방법론<ul>
<li>LLM을 이용하여 datasets을 collecting할때, reasoning을 필요로 한 datasets일 경우 noise가 발생함 <br/><br/><blockquote>
</blockquote>
<a href="https://dblp.org/">dblp: computer science bibliography</a></li>
</ul>
</li>
<li>computer science 분야의 대부분의 논문들 모아둔 사이트<ul>
<li>ICLR : 이론적인 학문을 연구하는 학회</li>
<li>CVPR, ICCV, ECCV : CV 학회
<a href="https://aclanthology.org/">ACL Anthology</a></li>
<li>저명한 NLP 분야 학회 모아둔 사이트<ul>
<li>ex) ACL</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<hr>
<h1 id="data-exploration-data-processing">Data Exploration, Data Processing</h1>
<h3 id="data_processing-code---github"><a href="https://github.com/BDH-teacher/Deep_Learning_Audit_code/blob/main/Data_Processing.ipynb">Data_Processing Code - GitHub</a></h3>
<br/>

<blockquote>
<h3 id="1-data-collection">1. Data Collection</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/f447d50d-156a-4f8d-8196-3434d7799805/image.png" alt=""></p>
</blockquote>
<ul>
<li>제일 먼저 task를 정의해야함 최대한 논문으로 publish된 dataset을 사용하는 것이 좋음 <br/><br/><blockquote>
</blockquote>
<img src="https://velog.velcdn.com/images/mit_bang/post/da6dfa25-4038-45b0-ac4c-8c88dd956939/image.png" alt=""></li>
<li>만약 dataset이 없을 경우 → data scraping</li>
</ul>
<br/>

<blockquote>
<h3 id="2-data-pre-processing">2. Data Pre-Processing</h3>
</blockquote>
<ul>
<li>Lowercasing <br/><br/></li>
<li>Special characters, Stopwords remove<ul>
<li>제거하지 않는것이 최근 트랜드 (transformer 이후 모델)</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<h3 id="3-data-collection-split-into-trainvaltest-sets">3. Data Collection: Split into Train/Val/Test sets</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/9e0e81ba-b20c-486e-bedf-5cc3580fbfa0/image.png" alt=""></p>
</blockquote>
<ul>
<li>dataset을 적절하게 분할 해야함<ul>
<li>각 class별로 묶은 다음 각 class별로 Train/Val/Test 분할</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<h3 id="4-data-processing-tokenization">4. Data Processing: Tokenization</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/c5a26c21-5bdb-4011-9a1c-19aacb75ef72/image.png" alt=""> <img src="https://velog.velcdn.com/images/mit_bang/post/2d2ab027-109a-457b-87d4-01f2b4490893/image.png" alt=""></p>
</blockquote>
<ul>
<li>Word Tokenization의 경우 Vocabulary에 없으면 처리하지 못함 <br/><br/></li>
<li>→ Character Tokenization : 각 알파벳별로 쪼개서 학습. 하지만, 범위가 너무 커지는 issue가 생김 <br/><br/></li>
<li>→ Subwords 단위로 쪼갬 <ul>
<li>Subword의 정의는 방법마다 약간씩 다름</li>
<li>하지만, Subword 단위로 나뉘게 되면 기존의 단어의 의미를 잘못 예측하거나, 소실될 수도 있음</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<h3 id="5-data-processing-construct-vocabulary-for-encoding">5. Data Processing: Construct Vocabulary for Encoding</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/713adcdb-6b5f-4759-9a81-2a72285ed5d1/image.png" alt=""></p>
</blockquote>
<ul>
<li>각 Token를 통해 Vocabulary를 만듬<ul>
<li>unique한 word의 index mapping하는 과정</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<h3 id="6-data-processing-encoding-padding">6. Data Processing: Encoding, padding</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/e700d0df-7009-491d-8a73-a42e21af9ac9/image.png" alt=""></p>
</blockquote>
<ul>
<li>input_ids을 통해 Vocabulary의 모든 token들을 정수로 변환함 <br/><br/></li>
<li>Padding을 통해 모든 sample의 크기를 일관되게 만듬<ul>
<li>모든 sample의 크기가 다른경우 각각 계산을 해야하지만, 같은 경우 각 Encoding된 vector들을 하나의 Matrix로 만들어서 한번에 처리할 수 있음 (GPU 병렬 연산) <br/><br/></li>
</ul>
</li>
<li>어떤 부분을 집중적으로 봐야하는지 attention mask를 통해 학습전에 표시함</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="special-tokens">Special Tokens</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/042cf18d-f860-465f-b262-7559a3b872c6/image.png" alt=""></p>
</blockquote>
<ul>
<li>Language Models이 좀 더 잘 training하기 위해 special toekn을 사용함<ul>
<li>[SEP]: 하나의 입력 안에서 sentences를 구분할 때 쓰는 분리 토큰</li>
<li>[SOS] / [BOS]: sequence 생성 시작을 알리는 토큰</li>
<li>[EOS] / &lt;|endoftext|&gt; / </s>: sequence가 여기서 끝났다는 것을 표시하는 토큰</li>
<li>[UNK]: Vocabulary에 없거나 인식할 수 없는 word를 대신 나타내는토큰</li>
<li>[CLS]: 전체 문장의 정보를 요약해서 classification 등의 task에 쓰기 위한 특수 토큰</li>
<li>[MASK] / <mask>: 가려진 위치의 word를 모델이 맞추도록 하는 masking 토큰</li>
<li>[PAD] / <pad>: 길이를 맞추려고 빈 자리를 채울 때  쓰는 토큰 → Padding</li>
</ul>
</li>
</ul>
<blockquote>
<h3 id="pre-trained-language-models-leverage-special-tokens-example">Pre-trained Language Models leverage special tokens example</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/c3a1ca5b-78d1-4912-84e5-cc10afacd4d8/image.png" alt=""> <img src="https://velog.velcdn.com/images/mit_bang/post/dd720874-687c-42fc-9de4-433659d616c2/image.png" alt=""></p>
</blockquote>
<ul>
<li>매번 이 모든 과정을 거치지 않아도 됨 (ex - AutoTokenizer)</li>
</ul>
<br/>

<hr>
<blockquote>
<ul>
<li><strong>Batch Processing can be done by leveraging DataLoader</strong><ul>
<li>data preprocessing을 진행한 후, 이 data를 모델에 사용하기 위해 Chunk 별로 분할함 → batch 단위
<img src="https://velog.velcdn.com/images/mit_bang/post/91bf6e05-07a7-44aa-831a-909452d39718/image.png" alt=""></li>
</ul>
</li>
</ul>
</blockquote>
<br/>    

<hr>
<blockquote>
<h3 id="summary">summary</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/010faf24-52ed-4561-81be-c448a10f819a/image.png" alt=""> <a href="https://gluebenchmark.com/">GLUE Benchmark</a></p>
</blockquote>
<ul>
<li>꼭 <strong>torch.utils.data.Dataset Class안에서 Encoding을 진행</strong>해야함</li>
</ul>
<p><br/><br/><br/><br/><br/><br/></p>
<hr>
<ul>
<li>참고자료</li>
</ul>
<p><a href="https://huggingface.co/datasets/stanfordnlp/sst2">stanfordnlp/sst2 · Datasets at Hugging Face</a></p>
<p><a href="https://huggingface.co/datasets/allenai/swag">allenai/swag · Datasets at Hugging Face</a></p>
<p><a href="https://github.com/abisee/cnn-dailymail">GitHub - abisee/cnn-dailymail: Code to obtain the CNN / Daily Mail dataset (non-anonymized) for summarization</a></p>
<p><a href="https://github.com/emorynlp/MRL-2021">GitHub - emorynlp/MRL-2021: English-Korean Parallel Dataset</a></p>
<p><a href="https://github.com/hendrycks/test">GitHub - hendrycks/test: Measuring Massive Multitask Language Understanding | ICLR 2021</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[청강] 딥러닝 7 - Long Short Term Memory (LSTM), Gated Recurrent Unit (GRU)]]></title>
            <link>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-7-Long-Short-Term-Memory-LSTM-Gated-Recurrent-Unit-GRU</link>
            <guid>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-7-Long-Short-Term-Memory-LSTM-Gated-Recurrent-Unit-GRU</guid>
            <pubDate>Sun, 18 Jan 2026 20:39:52 GMT</pubDate>
            <description><![CDATA[<p><a href="https://seoyeon-p.github.io/">한양대학교 박서연 교수님 - github.io</a></p>
<h5 id="한양대학교-박서연-교수님의-딥러닝-수업을-청강-하면서-정리한-내용을-바탕으로-교수님의-허락을-받고-작성하였습니다">(한양대학교 박서연 교수님의 딥러닝 수업을 청강 하면서 정리한 내용을 바탕으로 교수님의 허락을 받고 작성하였습니다.)</h5>
<br/>

<hr>
<h1 id="long-short-term-memory-lstm-gated-recurrent-unit-gru">Long Short Term Memory (LSTM), Gated Recurrent Unit (GRU)</h1>
<h3 id="lstmgru-code---github"><a href="https://github.com/BDH-teacher/Deep_Learning_Audit_code/blob/main/LSTM%26GRU.ipynb">LSTM&amp;GRU Code - Github</a></h3>
<br/>

<blockquote>
<h3 id="rnn">RNN</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/39c93edf-7983-4752-8035-983aafaf2b1e/image.png" alt=""></p>
</blockquote>
<ul>
<li>Gradient를 통해 update를 진행해야 하는데, flow상 <strong>Gradient가 폭발하거나 없어져서 Gradient 소실이 발생</strong>함<ul>
<li><strong>W_hh가 지속적으로 곱해지기 때문에 무한히 작아지거나, 무한이 커짐</strong> <br/><br/><blockquote>
</blockquote>
<img src="https://velog.velcdn.com/images/mit_bang/post/f2742123-670b-4be3-a607-5e5b74e9f86c/image.png" alt=""></li>
</ul>
</li>
<li>Solution 1 : Gradient Clipping<ul>
<li>Gradient의 범위를 정해서 소실을 최소화함 → task마다 너무 다름 <br/><br/></li>
</ul>
</li>
<li>Solution 2 : Change RNN architecture → <strong>Long Short Term Memory (LSTM)</strong></li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="long-short-term-memory-lstm">Long Short Term Memory (LSTM)</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/3c1f1ffe-8021-47ed-abfb-fa66d87eacd6/image.png" alt=""> <img src="https://velog.velcdn.com/images/mit_bang/post/2b97ad44-7bf8-4061-94cf-f464af6391e8/image.png" alt=""></p>
</blockquote>
<ul>
<li>정보를 얼마나 저장할지 정해서 해결함<ul>
<li>장기기억력이 좋다 : <strong>필요한정보와 버릴정보를 적절히 조절함 → Cell</strong></li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/680ecf77-0588-4818-8faa-14a8516e5908/image.png" alt=""></p>
</blockquote>
<ul>
<li>Sigmoid를 사용하여 weighting 매커니즘을 구현</li>
<li>Tanh는 Non-linearity를 표현하기 위한 activation function</li>
</ul>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/2fbdef32-85bf-4fcf-806b-860cb62f102b/image.png" alt=""></p>
</blockquote>
<ul>
<li>Input gate : 입력을 얼마나 받는지</li>
<li>Forget gate : 이전 time step의 cell memory를 얼마나 잊는지</li>
<li>Output gate : 현재 cell memory를 얼마나 출력하는지</li>
<li>Cell state gate : 입력과 이전 은닉 상태를 얼마나 드러내는지</li>
</ul>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/425f5f85-04d1-456b-b5dc-f82a895ade4b/image.png" alt=""></p>
</blockquote>
<ul>
<li>Element wise multiplication이기 때문에 multiplication의 수가 매우 적어, Backpropagation이 굉장히 빠르고 계산이 안정적임</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="gru">GRU</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/9f7b168d-71dc-4609-b227-a8a4d0de59c3/image.png" alt=""></p>
</blockquote>
<ul>
<li>LSTM을 gate가 너무 많아 복잡함 → 이를 단순화 한게 GRU<ul>
<li>hidden state 자체의 얼마만큼의 Information flowrk 있어야하는지 관리함</li>
</ul>
</li>
</ul>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/6043f927-db01-4a58-8caa-e0f1b69fc050/image.png" alt=""></p>
</blockquote>
<ul>
<li>GRU flow에 대한 수식정리</li>
</ul>
<p><br/><br/><br/><br/><br/><br/></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[청강] 딥러닝 6 - Recurrent Neural Network (RNN)]]></title>
            <link>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-6-Recurrent-Neural-Network-RNN</link>
            <guid>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-6-Recurrent-Neural-Network-RNN</guid>
            <pubDate>Sun, 18 Jan 2026 18:57:07 GMT</pubDate>
            <description><![CDATA[<p><a href="https://seoyeon-p.github.io/">한양대학교 박서연 교수님 - github.io</a></p>
<h5 id="한양대학교-박서연-교수님의-딥러닝-수업을-청강-하면서-정리한-내용을-바탕으로-교수님의-허락을-받고-작성하였습니다">(한양대학교 박서연 교수님의 딥러닝 수업을 청강 하면서 정리한 내용을 바탕으로 교수님의 허락을 받고 작성하였습니다.)</h5>
<br/>

<hr>
<h1 id="recurrent-neural-network-rnn">Recurrent Neural Network (RNN)</h1>
<h3 id="rnn-code---github"><a href="https://github.com/BDH-teacher/Deep_Learning_Audit_code/blob/main/RNN.ipynb">RNN Code - GitHub</a></h3>
<br/>

<ul>
<li>RNN의 issue : <strong>Gradient 소실문제</strong> &gt; LSTM</li>
<li>RNN, LSTM, GRU &gt; 어떤 모델을 썼느냐에 따른 차이</li>
</ul>
<hr>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/7189fda5-8837-40c3-b44e-41bc57189012/image.png" alt=""></p>
</blockquote>
<ul>
<li>FFNN : 일반적인 Deep Learning Model 구조 <br/><br/></li>
<li>RNN : 입력이 한방향으로 흐르는것이 아닌 <strong>자기자신을 스스로 update하는 과정</strong>이 생김<ul>
<li>Time-series data 대한 Processing이 가능</li>
<li><strong>이전에 가지고 있던 time step에 대한 상황을 update</strong>할 수 있음 → <strong>순차적으로 들어오는 data에 대한 개념을 적용</strong>할 수 있게됨</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/3d2adefa-9cc0-481b-8937-a74b43f879a8/image.png" alt=""> <img src="https://velog.velcdn.com/images/mit_bang/post/512458a2-a381-4341-8e1a-7dd4b6a0d5cf/image.png" alt=""></p>
</blockquote>
<ul>
<li>각 time step에 대해 Weight Matrix가 들어감<ul>
<li>각 step에 대한 Gradient를 구하고 저장해 둠 → 다음 time step의 Weight Matrix를 계산할 때 사용함</li>
<li>Many-to-Many : <strong>각 time step별로 Loss를 구한 후 마지막에 Final Loss를 계산</strong>함</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="many-to-one">Many-to-One</h3>
</blockquote>
<ul>
<li>각 state 별 output Prediction을 계산하는것이 아닌 <strong>끝까지 처리 후 마지막 time step에서만 Prediction</strong>을 진행함
<img src="https://velog.velcdn.com/images/mit_bang/post/163bb181-3f23-4b3c-b179-062ab0105ef9/image.png" alt=""></li>
</ul>
<br/>

<blockquote>
<h3 id="one-to-many-">One-to-Many :</h3>
</blockquote>
<ul>
<li><strong>하나의 input이 주어지고 각 time step별로 output</strong>이 나오게도 가능함
<img src="https://velog.velcdn.com/images/mit_bang/post/0c58a206-9c5c-4104-bfab-caa3b8248802/image.png" alt=""></li>
</ul>
<br/>

<blockquote>
<h3 id="many-to-many">Many-to-Many</h3>
</blockquote>
<ul>
<li>Many-to-Many는 Many-to-One와 One-to-Many를 합쳐서 사용할 수 있음
<img src="https://velog.velcdn.com/images/mit_bang/post/28c94a5e-d946-44fa-a5f5-84119c6eb673/image.png" alt=""></li>
<li>이런 구조를 <strong>Sequence to Sequence</strong>라고함 <br/><br/></li>
<li><strong>Many-to-One를 Encoder, One-to-Many를 Decoder</strong>로 부름<ul>
<li>transformer 이전 Text generation에서 가장 많이 쓰였던 구조</li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/00b4f2d5-baae-4f74-b867-78313da450ef/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>output은 vocabulary size와 동일하게 Scoring</strong>해야함 <br/><br/></li>
<li>각 W_hh, W_hy, W_xh는 동일함 → sharing됨 <br/><br/></li>
<li><strong>Output Matrix에서 가장 큰 값(argmax)을 next word로 Prediction함</strong><ul>
<li>여기선 greedy하게 고르지만, 다양한 방법론이 존재</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/c4814e9c-8c7e-48fe-a609-e07ec532b23c/image.png" alt=""></p>
</blockquote>
<ul>
<li>기존의 Backpropagation과정은 한 sample마다 진행함<ul>
<li>전체 sequence를 전달하여 Loss를 계산한 후의 전체 sequence에 대한 Backpropagation를 진행하면 매우 느리고, 메모리를 많이 잡아먹게됨 → <strong>Truncated Backpropagation</strong> (즉, 잘라서 진행) <br/><br/></li>
</ul>
</li>
<li>기존의 Backpropagation은 1번만 진행하지만, Truncated Backpropagation는 나눈 만큼 진행하게됨</li>
</ul>
<p><br/><br/><br/><br/><br/><br/></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[청강] 딥러닝 5 - Convolutional Neural Network (CNN)]]></title>
            <link>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-5-Convolutional-Neural-Network-CNN</link>
            <guid>https://velog.io/@mit_bang/%EC%B2%AD%EA%B0%95-%EB%94%A5%EB%9F%AC%EB%8B%9D-5-Convolutional-Neural-Network-CNN</guid>
            <pubDate>Sun, 18 Jan 2026 18:55:28 GMT</pubDate>
            <description><![CDATA[<p><a href="https://seoyeon-p.github.io/">한양대학교 박서연 교수님 - github.io</a></p>
<h5 id="한양대학교-박서연-교수님의-딥러닝-수업을-청강-하면서-정리한-내용을-바탕으로-교수님의-허락을-받고-작성하였습니다">(한양대학교 박서연 교수님의 딥러닝 수업을 청강 하면서 정리한 내용을 바탕으로 교수님의 허락을 받고 작성하였습니다.)</h5>
<br/>

<hr>
<h1 id="convolutional-neural-network-cnn">Convolutional Neural Network (CNN)</h1>
<h3 id="cnn-code---github"><a href="https://github.com/BDH-teacher/Deep_Learning_Audit_code/blob/main/CNN.ipynb">CNN Code - GitHub</a></h3>
<br/>

<blockquote>
<h3 id="fully-connected-neural-network">Fully Connected Neural Network</h3>
</blockquote>
<ul>
<li>이전 layer에 있는 모든 피쳐가 다음 layer의 모든 피쳐들에 영향을 준다</li>
<li><strong>한계점 : Weight Matrix가 여러개여도 Stretch input vectors into column이 한 개임</strong>
<img src="https://velog.velcdn.com/images/mit_bang/post/13348d0d-086c-4972-8ec1-ed0f0edad77f/image.png" alt=""></li>
<li><strong>이미지의 경우 공간 정보가 없어져버리는 issue가 생김 -&gt; CNN 등장 이유</strong></li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="convolutional-neural-network-cnn-1">Convolutional Neural Network (CNN)</h3>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/664dcc03-f5af-4cc1-a0a1-4bae96dbfe48/image.png" alt=""></p>
</blockquote>
<ul>
<li>filter를 적용하여 공간 정보를 보존함<ul>
<li>보통 <strong>Image의 depth와 filter의 마지막 Dimension의 크기를 같게함</strong></li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/619bcd61-4f5f-4056-8537-3989236b5f6b/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>filter를 적용하여 나온 값들을 activation map</strong>이라고함<ul>
<li>filter size만큼 생성됨 (각 activation map마다 정보가 다름) <br/><br/><blockquote>
</blockquote>
<img src="https://velog.velcdn.com/images/mit_bang/post/0368aa2f-f5ff-4ec5-bfe0-6ae8f5ed22eb/image.png" alt=""></li>
</ul>
</li>
<li>filter를 적용했을 때 output dimension의 크기 계산 <br/><br/><blockquote>
</blockquote>
<img src="https://velog.velcdn.com/images/mit_bang/post/fb847b0d-9eea-4cd3-9ead-d4904157d90e/image.png" alt=""></li>
<li>filter를 계속 진행할 경우 dimension이 점점 작아짐<ul>
<li><strong>정보의 소실이 계속 이러나게됨 -&gt; Padding</strong></li>
</ul>
</li>
</ul>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mit_bang/post/496bec66-9696-4022-82e1-08352801db4f/image.png" alt=""></p>
</blockquote>
<br/>

<hr>
<blockquote>
<h3 id="pooling">Pooling</h3>
</blockquote>
<ul>
<li>Padding를 통해 Convolutional layer를 진행하게 되면 정보의 소실은 줄였지만, 너무 <strong>dimension이 커짐 → 최소한의 정보의 소실을 통해 핵심 의미 정보만 추출</strong>
<img src="https://velog.velcdn.com/images/mit_bang/post/51eeb2ee-d9bc-470e-ae16-7c871606f7ca/image.png" alt=""> <img src="https://velog.velcdn.com/images/mit_bang/post/4841c167-0d65-4876-8089-4fc0de0ffeef/image.png" alt=""> <br/><h3 id="benefits-of-leveraging-pooling-layer">Benefits of leveraging Pooling Layer</h3>
</li>
<li>makes a model to be robust to small translations<ul>
<li>c<strong>ontext를 배울 수 있음 → 노이즈를 어느정도 해결할 수 있음</strong> <br/><br/></li>
</ul>
</li>
<li>the model to be <strong>more generalizable → It can prevent overfitting</strong></li>
</ul>
<br/>

<hr>
<blockquote>
<h3 id="convolutional-neural-network-for-natural-language-processing">Convolutional Neural Network for Natural Language Processing</h3>
<p><a href="https://arxiv.org/abs/1510.03820">Convolutional Neural Network for Natural Language Processing Paper</a> 
<img src="https://velog.velcdn.com/images/mit_bang/post/044ca4f0-cd23-413a-a669-45bf85781e3d/image.png" alt=""></p>
</blockquote>
<ul>
<li>CNN은 sequence of words를 image처럼 처리함<ul>
<li>단어간의 관계를 파악할땐 유용하지만, long-term dependency를 파악할때는 적절하지 않음</li>
<li>text는 순서가 중요하지만, CNN은 순서를 구분하지 않음</li>
</ul>
</li>
</ul>
<p><br/><br/><br/><br/><br/><br/></p>
<hr>
<ul>
<li>참고자료</li>
</ul>
<p><a href="https://nafizshahriar.medium.com/what-is-convolutional-neural-network-cnn-deep-learning-b3921bdd82d5">What is Convolutional Neural Network — CNN (Deep Learning)</a></p>
<p><a href="https://docs.pytorch.org/docs/stable/generated/torch.nn.Conv2d.html">Conv2d — PyTorch 2.9 documentation</a></p>
<p><a href="https://docs.pytorch.org/docs/stable/generated/torch.nn.MaxPool2d.html">MaxPool2d — PyTorch 2.9 documentation</a></p>
<p><a href="https://docs.pytorch.org/docs/stable/generated/torch.nn.AvgPool2d.html">AvgPool2d — PyTorch 2.9 documentation</a></p>
]]></description>
        </item>
    </channel>
</rss>