<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>AI lover</title>
        <link>https://velog.io/</link>
        <description>한발한발 나아갑니당!</description>
        <lastBuildDate>Thu, 13 Nov 2025 06:59:29 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>AI lover</title>
            <url>https://velog.velcdn.com/images/qlwkej285-/profile/ef6ae176-d74c-42a1-b66f-ac7d0747fd82/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. AI lover. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/qlwkej285-" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[공모전 시작!]]></title>
            <link>https://velog.io/@qlwkej285-/%EB%94%A5%ED%8E%98%EC%9D%B4%ED%81%AC-%EA%B3%B5%EB%AA%A8%EC%A0%84</link>
            <guid>https://velog.io/@qlwkej285-/%EB%94%A5%ED%8E%98%EC%9D%B4%ED%81%AC-%EA%B3%B5%EB%AA%A8%EC%A0%84</guid>
            <pubDate>Thu, 13 Nov 2025 06:59:29 GMT</pubDate>
            <description><![CDATA[<p>지금 열심히 딥페이크 공모전에 참여하고 있다. 
성능 올리는 방법에 대해서는 임시저장한 상태지만, 공모전이 끝난 뒤 업데이트할 예정! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[A survey on model-based reinforcement learning ]]></title>
            <link>https://velog.io/@qlwkej285-/A-survey-on-model-based-reinforcement-learning</link>
            <guid>https://velog.io/@qlwkej285-/A-survey-on-model-based-reinforcement-learning</guid>
            <pubDate>Thu, 08 May 2025 13:29:33 GMT</pubDate>
            <description><![CDATA[<h1 id="1-overview-of-model-based-rl">1. Overview of model-based RL</h1>
<p>Therefore, applying RL algorithms with high sample complexity to real-world tasks is diﬃcult, where trial-and-error can be extremely expensive.</p>
<p>→ RL알고리즘을 high sample complexity에 적용하는 게 어렵다. </p>
<p>Therefore, a major focus of recent deep RL (DRL) research has been on enhancing sample eﬃciency [5]. Model-based RL (MBRL) is one of the most important research directions that have the potential to make
RL algorithms significantly more sample eﬃcient [6].</p>
<p>→ 따라서, sample을 efficient하게 하려면 model-based RL이 필요 </p>
<p>→ <strong>수천 번의 가상 상호작용</strong>을 빠르게 수행</p>
<p>MDP는 ⟨S, A, M, R, γ⟩로 이루어진다. </p>
<blockquote>
<p>S : state space 
A : action space
γ :  discount factor for future rewards
M : S ×A →S  - state transition dynamics 
R : S ×A  -  reward function </p>
</blockquote>
<p>그래서, &quot;모델을 학습한다&quot;의 의미는, M과 R을 recover한다는 뜻. 
이미 많은 경우에 reward function은 이미 define되어있으니까, 
사실상, 주요 목표는 state transition dynamics인 M을 학습하는 게 주요 목표겠지! </p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/971c8862-8388-42a3-9de3-f4d6743dcc29/image.png" alt="">
이렇게 하면 샘플 복잡도가 줄어들고, 모델에서 생성된 시뮬레이션 데이터를 통해 학습을 하게 되는 것. 
이때, 이 시뮬레이션 데이터를 활용해서 policy를 학습하게 되는 것이다! </p>
<p>Recent studies from both theoretical [14] and empirical [6, 8] perspectives demonstrate that, given
a suﬃciently accurate model, it is intuitive that MBRL yields higher sample eﬃciency than MFRL.
-&gt; 일단 accurate한 모델이 있다면, MBRLd은 sample efficiency가 더 높다 MFRL보다는...</p>
<p>그리고 이 Model-based RL이 2가지로 나뉠 수 있다. </p>
<ul>
<li>blackbox model rollout for trajectory sampling</li>
<li>whitebox model for gradient propagation</li>
</ul>
<p>게다가, Model-based와 다른 애들이 합쳐진 걸 또 배울 것이다.
(OffRL, multi-agent RL 등등)</p>
<h1 id="2-model-learning">2 Model Learning</h1>
<p>We assume that some historical
data is available for learning. Usually, the historical data can be in the form of trajectories {τ1, τ2, . . . , τk },
and each trajectory is a sequence of state-action-reward pairs</p>
<p>M : (st, at) -&gt; (st+1) 
R : (st, at) -&gt; rt</p>
<h2 id="21-model-learning-in-tabular-setting">2.1 Model Learning in tabular setting</h2>
<p>단순히 Tabular setting이라고 한다면, 
<img src="https://velog.velcdn.com/images/qlwkej285-/post/66fff808-2010-426b-96fc-2d6022b20956/image.png" alt="">
(s,a)를 집어넣었을때, 
ex) (s,a,s1):3번 (s,a,s2): 4번 (s,a,s3):5번 
(s,a)를 넣었을때, s1이 나올 확률은? 
= 3/(3+4+5)가 되는 거지, </p>
<p>Notice that
$$
\hat{M}, \hat{R}
$$
are an unbiased
estimation of the true transition 
$$
M^* R^*
$$
respectively, and thus converge to
them as the samples approach infinity.
-&gt; 결국 추정치지만 나중에는 infinity로 수렴 </p>
<p>A key limitation of the
analysis is the assumption of the tabular setting, where models are not able to generalize across states.
-&gt; 근데, 이 Tabular setting의 중요한 점은, 
상태들 간의 일반화를 하지 못한다
: 상태가 매우 적고 고정되어 있는 경우에는 잘 작동 but 상태 공간이 커지거나 복잡해지면 효율적X 
=&gt; 상태 간의 연결 관계나 패턴을 파악하지 못한다</p>
<blockquote>
<p>예를 들어서, 상태 간 일반화가 이루어지지 않기 때문에 상태 A와 상태 C가 유사하다고 해도, 이를 따로 다룰 수밖에 없음. 
$$
P(s 
′
 ∣A,a)≈P(s 
′
 ∣C,a)</p>
</blockquote>
<p> for some s 
′
 ∈S
$$ </p>
<p>$$ 
Q(A,a)=R(A,a)+γ 
\underset{a
′}</p>
<p>max
​<br> Q(s 
′
 ,a 
′
 )
$$
$$ 
Q
(
C
,
a
)
=
R
(
C
,
a
)
+
γ
\underset{a
′}
max</p>
<p>Q
(
s
′
,
a
′
)</p>
<p>$$ 
이런식으로 일반화가 될 수 있다.! 
근데 Tabular setting에서는, 
독립적으로 값이 계산이 되는거지. </p>
<h2 id="22-model-learning-via-prediction-loss">2.2 Model Learning via prediction loss</h2>
<p>linear model들로 이제 approximation을 한다. 
$$
M_θ(approximation) 와 M^∗(real)
$$</p>
<h3 id="221-prediction-model-loss">2.2.1 Prediction model loss</h3>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/9e629ed2-2afa-4880-b2a5-257c5e78f2c7/image.png" alt=""></p>
<p>1) the stationary
state-action distribution induced by πD and M ∗
로부터 뽑은 (s,a)를 approximation에 넣은 다음에 나오는 state
2) M*(.|(s,a))로부터 뽑은 s&#39;
을 가지고 
MSE를 구하는 거다.</p>
<ul>
<li>근데 이렇게 되면 어떤 문제가 생긴다? </li>
</ul>
<p>=&gt; 바로 특정 하나의 s&#39;로 전이가 된다. 
$$
M(s&#39;|(s,a))
$$
얘가 무조건 s&#39;으로 되는가? ㄴㄴ
그럼 이것도 확률분포가 되는거. </p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/b0e31b17-0e9f-4614-9c25-6b5475f7ed06/image.png" alt=""></p>
<p>그래서 단순히, s&#39;으로 나오는 게 아니니까 MSE를 쓰지 말고 KL divergence를 활용해보자고요~! (분포와 분포사이의 척도를 재는 KL divergence) </p>
<p>근데, 이때, M_θ가 보통 가우시안으로 정의가 되기 때문에 
<img src="https://velog.velcdn.com/images/qlwkej285-/post/b9832ff9-426a-4d3f-a493-efa9965da2b1/image.png" alt="">
결국에는, 저 식으로 된다. 
그래서 어떤 supervised learning이라도 사용될 수 있는 이유임. </p>
<h3 id="222-model-properties">2.2.2 Model Properties</h3>
<p>수학적으로는, 시간이 지날수록 오차가 2차적으로 더 커진다. 그러니 실제환경이랑 매우 일치해야한다. </p>
<h3 id="223-model-variants">2.2.3 Model Variants</h3>
<p>&lt;단계별 모델&gt; </p>
<ul>
<li><p>기존의 전통적인 모델 
: 한 번에 하나의 상태를 예측
: 이 모델은 예측한 상태를 다시 입력으로 사용하는 구조 =&gt; 누적 오차(compounding error) 발생 가능 </p>
</li>
<li><p>단계별 모델(multistep model)
:  한 번에 여러 단계를 예측
: &quot;가짜&quot; 상태를 입력으로 사용하지 않으니까 =&gt; 오차가 누적되지 않음. </p>
</li>
</ul>
<p>&lt;역방향 전이 모델&gt;</p>
<ul>
<li><p>기존 모델 
s_t와 a_t를 입력으로 받아서 s_t+1예측하기 </p>
</li>
<li><p>역방향 전이 모델 
s_t+1과 a_t를 입력으로 받아서 s_t예측하기 </p>
</li>
</ul>
<h2 id="23-model-learning-with-reduced-error">2.3 Model Learning with reduced error</h2>
<h3 id="231-model-learning-with-lipschitz-continuity-constraint">2.3.1 Model learning with Lipschitz continuity constraint</h3>
<p>: 일단 아까 compounding error(계속해서 누적되는 error)가 생기니까, 그걸 없애줘야겠지?
활용한 것 1 : Lipschitz continuity constraint</p>
<p>활용한 것 2 : Wasserstein 거리
== 두 확률분포 P와  Q 사이의 &quot;최소한의 이동 비용&quot; 개념</p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/ad539a8d-975b-47bb-ae93-14c4b9efed8b/image.png" alt="">
(이때, Π (P, Q) denotes the set of all joint distributions γ(x, y))
( γ에서 x만 봤을 때 나오는 분포가 P, γ에서 y만 봤을 때 나오는 분포가 Q 
<img src="https://velog.velcdn.com/images/qlwkej285-/post/78a77e67-0ce7-4e3b-b902-e860796be2ea/image.png" alt="">
이렇게 생각하면 될듯. </p>
<p>그래서, a state distribution ρ over the state space S 를 고려해봤을 때, state transition dynamics를 이렇게 정의할 수 있다 : 
<img src="https://velog.velcdn.com/images/qlwkej285-/post/4db1a393-9cd8-4bdf-a28d-f40d096bda2f/image.png" alt="">
근데, 중요한 건 그러면 n-step error가 있을 때 upperbound가 뭐니 뭥미 이거잖아? </p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/8c8d6292-4cf5-4111-a565-0565a1a35839/image.png" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/e8f88804-bb16-4c85-9443-65575ff1088b/image.png" alt=""></p>
<h3 id="232-model-learning-by-distribution-matching">2.3.2 Model learning by distribution matching</h3>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/cb262d6a-6c7b-4ee0-a681-ad3b8b7c1009/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/fd178ac9-07d7-4716-b6ee-7a8f4165579a/image.png" alt="">
The prediction loss employed in Theorems 1 and 2 minimizes the model error on each point of the
state-action data. While the prediction loss minimization can be straightforwardly solved by supervised
learning, <strong>the long-term eﬀect of transitions</strong> is hard to capture, resulting in the horizon-squared com-
pounding error issue. 
=&gt; &quot;이 한 번의 예측&quot;만 잘하면 되는 게 아님!
=&gt; n-step 시뮬레이션이 중요
=&gt; 그러니,** match the distributions between the real trajectories and the trajectories rolled out in the learned model.** ! ! ! ! ! 
=&gt; 매칭을 시키자. </p>
<p>Model-based로 만들어낸 데이터랑 기존 데이터상의 분포 mismatch가 일어날 거 아니니! <img src="https://velog.velcdn.com/images/qlwkej285-/post/cf6e5331-e75b-4978-b6a1-d1056f9519d3/image.png" alt="">
그래서, phi(E) 즉, expert data로부터 온 (s,a)를 활용해서 log(D(s,a)) + phi(phi) 즉, 에이전트 만든 data로부터 온 (s,a)를 활용해서 만든 log(1-D(s,a))를 maximize해야한다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 1699 - 제곱수의 합 ]]></title>
            <link>https://velog.io/@qlwkej285-/%EB%B0%B1%EC%A4%80-1699-%EC%A0%9C%EA%B3%B1%EC%88%98%EC%9D%98-%ED%95%A9</link>
            <guid>https://velog.io/@qlwkej285-/%EB%B0%B1%EC%A4%80-1699-%EC%A0%9C%EA%B3%B1%EC%88%98%EC%9D%98-%ED%95%A9</guid>
            <pubDate>Thu, 17 Apr 2025 04:55:06 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-설명">문제 설명</h2>
<h1 id="제곱수의-합">제곱수의 합</h1>
<table>
<thead>
<tr>
<th>시간 제한</th>
<th>메모리 제한</th>
<th>제출</th>
<th>정답</th>
<th>맞힌 사람</th>
<th>정답 비율</th>
</tr>
</thead>
<tbody><tr>
<td>2 초</td>
<td>128 MB</td>
<td>68235</td>
<td>28119</td>
<td>20530</td>
<td>40.315%</td>
</tr>
</tbody></table>
<h2 id="문제">문제</h2>
<p>어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다. 이 경우, 수학자 숌크라테스는 “11은 3개 항의 제곱수 합으로 표현할 수 있다.”라고 말한다. 또한 11은 그보다 적은 항의 제곱수 합으로 표현할 수 없으므로, 11을 그 합으로써 표현할 수 있는 제곱수 항의 최소 개수는 3이다.</p>
<p>주어진 자연수 N을 이렇게 제곱수들의 합으로 표현할 때에 그 항의 최소개수를 구하는 프로그램을 작성하시오.</p>
<h2 id="입력">입력</h2>
<p>첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 100,000)</p>
<h2 id="출력">출력</h2>
<p>주어진 자연수를 제곱수의 합으로 나타낼 때에 그 제곱수 항의 최소 개수를 출력한다.</p>
<h2 id="접근-방법">접근 방법</h2>
<ol>
<li>일단 dp[i] 정의 = i를 제곱수의 합으로 표현할 때의 최소 항 개수 </li>
<li>min_count를 만든다 </li>
</ol>
<h2 id="코드">코드</h2>
<pre><code class="language-python">N = int(input())
dp = [0] * (N+1)

for i in range(1,N+1):
    min_count = i 
    j = 1 
    while j*j &lt;= i : 
        dp[i] = min(min_count,dp[i-j*j]+1]
        j += 1 
    dp[i] = min_count

print(dp[N])</code></pre>
<h2 id="선택사항-오류-해결">(선택사항) 오류 해결</h2>
<p>원래는 이걸 min_count를 i로 할 생각을 못했ㅇ듬… </p>
<p>뭔가 나한테는 아직 dp가 무조건 피보나치같은 애들로 생각이 되나봄. </p>
<p>→  DP는 피보나치처럼 단순한 연속 관계일 때도 있지만 / <strong>모든 가능한 선택지들을 확인하면서 최소값(또는 최대값)을 고르는 문제</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] Federated Ensemble-Directed Offline Reinforcement Learning (1) ]]></title>
            <link>https://velog.io/@qlwkej285-/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Federated-Ensemble-Directed-Offline-Reinforcement-Learning-1</link>
            <guid>https://velog.io/@qlwkej285-/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Federated-Ensemble-Directed-Offline-Reinforcement-Learning-1</guid>
            <pubDate>Mon, 07 Apr 2025 06:18:08 GMT</pubDate>
            <description><![CDATA[<h1 id="전체적인-내용">전체적인 내용</h1>
<blockquote>
<p>예시를 들어보자면, 
로봇 협업 학습 (예: 물류창고, 공장 로봇들)
문제: 서로 다른 환경에 있는 로봇들(예: 로봇 팔, 드론 등)이 유사한 작업을 하지만 환경이나 하드웨어가 조금씩 다름.
FRL 활용:
각 로봇은 자기가 있는 현장에서 로컬 강화 학습 수행.
정책만 공유 → 새로운 로봇이 빠르게 적응 가능 (few-shot transfer).
데이터는 유출되지 않으므로 보안 문제 없음. ! ! ! ! </p>
</blockquote>
<ul>
<li><p>federated RL?
= clients가 그들의 locally하게 train된 모델들을 share해서 client가 collaborative하게 학습하는 것이다. 
=&gt; privacy up + communication resource down</p>
<br>
<br>
</li>
<li><p>federated RL과 online RL?
sequential interaction을 통해서 환경에 대해 배우고 + 연합학습 Policy를 배우는.</p>
</li>
<li><blockquote>
<p>얘는 </p>
</blockquote>
</li>
<li><p>federated RL과 offline RL? </p>
</li>
</ul>
<p>=&gt; 각 클라이언트는 환경과 직접 상호작용하지 못함( 다른 조건에서 수집된 데이터만 가지고 있음)
=&gt; 그런데 이 데이터를 공유하지 않고도 전체적으로 가장 좋은 action policy를 어떻게 배울 수 있을까?
<br><br></p>
<ul>
<li><p>Offline RL알고리즘의 예시
CQL , TD3-BC : actor-critic learning approach 
= 각 클라이언트에 이미 존재하는 데이터셋만을 활용해서 actor-critic 학습을 수행하는 방식
<br><br></p>
</li>
<li><p>offline RL을 바로 fedearted learning에 적용했을 때의 문제점 
많은 클라이언트들이 각각 작은 데이터셋만 보유하고 있음 -&gt;  클라이언트마다 품질이 제각각인 정책(policy) 집합!이 생긴다. 
=&gt; 이런 상태에서, 이런 상태에서, 단순히 FedAvg 같은 일반적인 federated learning을 통해
이 policy들과 critic들을 평균 내듯이 통합하면,안됨. 
<br><br></p>
</li>
<li><p>offline RL을 federated learning에 적용했을 때 고려해야할 점 </p>
</li>
</ul>
<p>(i) Ensemble heterogeneity 
클라이언트의 데이터셋이 서로 달라서, 만들어진 정책들 또한 성능이 제각각. 
단순히 평균X 
<strong>이 정책 집합이 가진 집단적인 지혜(collective wisdom)</strong>를 잘 반영하는 방식이 필요하다.</p>
<p>(ii) Pessimistic value-computation (비관적인 가치 계산)
Offline RL은, 데이터에서 잘 나타나지 않은 행동에 대해
분포 이동(distribution shift)을 피하려고 낮은 가치를 부여하는 pessimistic 접근.
-&gt; 하지만 federated learning에서는 오히려,
이 policy 집합이 제공하는 <strong>가장 높은 가치(high-value actions)</strong>를
적극적으로 추출하려는 야심 있는 접근이 필요하다.</p>
<p>(iii) Data heterogeneity (데이터 이질성)
다른 federated learning과 마찬가지로,
클라이언트마다 다른 데이터로 여러 번 로컬 학습을 한 뒤 다 합치는 방식은 bias된 모델을 만들 위험이 있다.
-&gt; 따라서, <strong>로컬 정책이 너무 멀리 벗어나지 않도록 규제(regularize)</strong>하는 것이 필요하다.</p>
<p><br><br></p>
<ul>
<li>해결책 [FEDORA] </li>
</ul>
<p>문제 1 : Ensemble Heterogeneity</p>
<p>문제: 클라이언트의 데이터가 제각각이라 학습된 정책의 품질이 서로 다름. 단순 평균(FedAvg)을 하면 전체 성능이 악화될 수 있음.
해결:
→ 각 클라이언트의 정책을 평가하여 가중치를 다르게 주는 방식으로 결합함.
→ 엔트로피 정규화를 통해 과도한 쏠림 없이 <strong>ensemble wisdom</strong>를 추출.</p>
<p>문제 2 : Pessimistic Value Computation</p>
<p>문제: Offline RL은 훈련 데이터에 적게 나온 행동에 대해 낮은 가치를 부여함. 이로 인해 연합 시 높은 가치의 행동을 놓칠 수 있음.
해결:
→ 낙관적 평가(optimism) 원칙을 도입해, 연합 critic과 로컬 critic이 가장 높은 값을 추출하도록 유도.
→ policy가 적극적으로 high-value 행동을 하도록 훈련</p>
<p>문제 3 : (Data Heterogeneity</p>
<p>문제: 클라이언트마다 데이터 분포가 달라, 연합 전에 local 모델들이 너무 달라질 수 있음.
해결:
→ 클라이언트의 정책을 연합된 정책과 로컬 데이터 기준으로 정규화(regularization)
→ 이는 <strong>편향된 학습 경향(drift)</strong>을 줄이고 안정성을 향상</p>
<p>문제 4: 낮은 품질 데이터의 영향력 (Irrelevant or Low-Quality Data)</p>
<p>문제: 어떤 클라이언트는 매우 질 낮은 policy을 만들어, 전체 연합 정책에 악영향을 줄 수 있음.
해결:
→ <strong>policy의 품질을 추정</strong>하여, 품질이 낮은 경우 해당 클라이언트의 영향력을 점차 줄임
→ 즉, 무의미한 데이터는 자연스럽게 영향력이 감소
<br><br>
<br><br></p>
<ul>
<li>FEDORA 실험 
EDORA on a variety of MuJoCo environments and real-world datasets
FEDORA’s excellent performance via real-world experiments
on a TurtleBot robot  </li>
</ul>
<p>수식 관련된건 (2)탄에 올리도록 하겠습니다! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강화학습 스터디] 8강 Integrating Learning and Planning(1) + 구현 코드(미로 탐험)]]></title>
            <link>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EC%8A%A4%ED%84%B0%EB%94%94-8%EA%B0%95-Integrating-Learning-and-Planning1-%EA%B5%AC%ED%98%84-%EC%BD%94%EB%93%9C%EB%AF%B8%EB%A1%9C-%ED%83%90%ED%97%98</link>
            <guid>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EC%8A%A4%ED%84%B0%EB%94%94-8%EA%B0%95-Integrating-Learning-and-Planning1-%EA%B5%AC%ED%98%84-%EC%BD%94%EB%93%9C%EB%AF%B8%EB%A1%9C-%ED%83%90%ED%97%98</guid>
            <pubDate>Mon, 24 Mar 2025 07:54:09 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/77de940a-0644-4494-bea4-0effb7d3b30d/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/abcfff85-aa31-4000-94f1-5948712a6248/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/b9ada482-240b-4a40-9e3b-9f0a25c7723a/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/4778a36b-7849-49d9-84d0-9c0fb6ee70ce/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/65921b7a-c608-4bf7-b466-05d1eee56f3d/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/56385272-7f42-46f5-9f02-b3f266dcbeb4/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/daa1c8e6-b78f-4ba7-862c-3aa4e01b5c0a/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/518ed14b-245c-487c-97c3-62cbfb0ae467/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/32c5b20c-8201-4197-af2e-2b4f1fed6ae1/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/b16b3f7b-03d8-41a9-920e-f198d92e14f0/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/7365ece4-5899-4b4d-9dd7-71b5dad4a3e3/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/b91935a3-0efb-46a0-92ff-5e464bc7b733/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/88323064-f596-4ecc-884e-c5c727f58e60/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/00023a49-b49a-447e-8f59-74cbde0dc8a9/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/b727472a-780d-42cb-9ce3-8c410113cb57/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/6e84fe19-db4c-4c87-94f9-a18e5b174cff/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/d4319817-9592-428d-870b-63d1cad20eb1/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/755dcfd9-5925-4b15-adc5-b86da6d8ed76/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/20c5451c-ab7d-4fe3-bb50-7af934b03226/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/ac891a68-92f8-4ab1-af3d-d7581d38ef2c/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/cc653cd9-a4d3-468c-ac35-4c31e0133dd3/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/a57f4bc2-fb29-4f54-87a1-b3ad29bb9cb7/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/ff077c53-943e-4d3d-8447-8d8dbc86e73a/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/e6a4cdc1-cf53-4d59-83da-f6b495684a52/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/03e4c2d4-62f1-4590-a558-333efed5ccbd/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/b16705ac-4a96-4528-8622-4fe9d1b27c5f/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/8901795b-6a31-49b0-949b-20d97b11578c/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/a6195a9d-1112-4d85-8572-f63ef43334db/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/6cce78c0-eb29-4f82-88fb-8d786ce22c4e/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/6458d32b-fb86-4cb7-a95e-b1eabd2a8f07/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/a2ad7208-71a6-4e1e-bf4e-03bdba088717/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/4d153ec7-9c0b-4d60-bcac-557d52480961/image.jpg" alt="">
(요기 이 simulation based 부분은 아직 구현을 하지 못했고 강의를 끝까지는 못 들어성 다음 부분으로 넘겨보겠습니당...!) </p>
<p>그리고 저번까지는 계속해서 그냥 ppt에 나와있는 기본코드를 구현하는 것에 그쳤는데, 여기 나와있는 그 미로 탐험이 개인적으로 재미있어보이더라구요??</p>
<p>그래서 구현을 한번 해보았습니당ㅎㅎㅎ</p>
<pre><code>import numpy as np
import matplotlib.pyplot as plt
import time
import argparse

# 미로 크기 설정 (6x9 미로)
maze = np.array([
    [0, 0, 0, 0, 0, 0, 0, 1, 0],  # 벽 (1)
    [0, 0, 1, 0, 0, 0, 0, 1, 0],  # 길 (0)
    [0, 0, 1, 0, 0, 0, 0, 1, 0],
    [0, 0, 1, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0]
])

start = (2, 0)
goal = (0, 8)

actions = [&#39;up&#39;, &#39;down&#39;, &#39;left&#39;, &#39;right&#39;]
action_map = {0: &#39;up&#39;, 1: &#39;down&#39;, 2: &#39;left&#39;, 3: &#39;right&#39;}

# 미로 출력 함수
def plot_maze(maze, agent_position, ax=None, agent_plot=None,title=None):
    if ax is None or agent_plot is None:
        fig, ax = plt.subplots(figsize=(6, 6))
        ax.imshow(maze, cmap=&#39;binary&#39;)
        ax.scatter(goal[1], goal[0], c=&#39;green&#39;, s=100, marker=&#39;x&#39;)
        agent_plot = ax.scatter(agent_position[1], agent_position[0], c=&#39;red&#39;, s=100, marker=&#39;*&#39;)
        ax.set_xticks(np.arange(-0.5, maze.shape[1], 1), minor=True)
        ax.set_yticks(np.arange(-0.5, maze.shape[0], 1), minor=True)
        ax.grid(which=&#39;minor&#39;, color=&#39;black&#39;, linestyle=&#39;-&#39;, linewidth=2)
        plt.ion()
        plt.show()
        return ax, agent_plot
    agent_plot.set_offsets([agent_position[1], agent_position[0]])
    if title:
        ax.set_title(title, fontsize=14)

    plt.draw()
    plt.pause(0.01)

    return ax, agent_plot

# 에이전트 이동 함수
def move_agent(agent_position, direction):
    x, y = agent_position
    if direction == &#39;up&#39; and x &gt; 0 and maze[x-1, y] != 1:
        return (x-1, y)
    elif direction == &#39;down&#39; and x &lt; maze.shape[0] - 1 and maze[x+1, y] != 1:
        return (x+1, y)
    elif direction == &#39;left&#39; and y &gt; 0 and maze[x, y-1] != 1:
        return (x, y-1)
    elif direction == &#39;right&#39; and y &lt; maze.shape[1] - 1 and maze[x, y+1] != 1:
        return (x, y+1)
    return agent_position

# 상태 인덱스 변환
def state_index(state):
    return state[0] * maze.shape[1] + state[1]

# Q-테이블 및 모델 초기화
num_states = maze.shape[0] * maze.shape[1]
num_actions = len(actions)
Q = np.zeros((num_states, num_actions))
Model = {}

# ε-greedy 정책
def epsilon_greedy_policy(Q, state, epsilon):
    if np.random.rand() &lt; epsilon:
        return np.random.choice(num_actions)
    return np.argmax(Q[state])

# Dyna-Q 알고리즘
def DynaQ(planning_step, num_episodes, alpha=0.1, gamma=0.9, epsilon=0.1):
    global Q, Model

    ax, agent_plot = plot_maze(maze, start) #일단 maze만들고

    for episode in range(num_episodes):
        state = start
        state_idx = state_index(state) #idx를 통해 table을 만들어야하니.
        num_step = 1

        while state != goal:
            action = epsilon_greedy_policy(Q, state_idx, epsilon)
            next_state = move_agent(state, action_map[action])
            next_state_idx = state_index(next_state)
            reward = 1 if next_state == goal else -0.01 #reward는 goal에 도착할때만!

            # Q 업데이트
            Q[state_idx, action] += alpha * (reward + gamma * np.max(Q[next_state_idx]) - Q[state_idx, action]) #Q-learning에서 봤듯이.

            # 환경 모델 업데이트
            Model[(state_idx, action)] = (next_state_idx, reward) #next랑 reward

            # Planning 단계
            for _ in range(planning_step):
                sampled_state_idx, sampled_action = list(Model.keys())[np.random.randint(len(Model))] #요거 어케할지 몰라서 지피티참고
                sampled_next_state_idx, sampled_reward = Model[(sampled_state_idx, sampled_action)] #next랑 reward저장되어잇는고임
                Q[sampled_state_idx, sampled_action] += alpha * (sampled_reward + gamma * np.max(Q[sampled_next_state_idx]) - Q[sampled_state_idx, sampled_action])

            state = next_state
            state_idx = next_state_idx
            planning_title = f&quot;episode {episode + 1}, step {num_step}&quot;
            ax, agent_plot = plot_maze(maze, state, ax, agent_plot,planning_title)
            num_step += 1

        print(f&quot;Episode {episode + 1} completed with {num_step} steps!&quot;)

    return Q

# 메인 함수
def main():
    parser = argparse.ArgumentParser(description=&quot;Simple maze with Dyna-Q&quot;)
    parser.add_argument(&quot;--planning_step&quot;, type=int, default=5, help=&quot;Number of planning steps&quot;)
    parser.add_argument(&quot;--num_episodes&quot;, type=int, default=10, help=&quot;Number of training episodes&quot;)
    args = parser.parse_args()

    global Q, Model
    Q = np.zeros((num_states, num_actions))  # Q-테이블 초기화
    Model = {}  # 환경 모델 초기화

    final_Q = DynaQ(args.planning_step, args.num_episodes)

    print(&quot;\nFinal Q-table:&quot;)
    print(final_Q)

if __name__ == &quot;__main__&quot;:
    main()</code></pre><p>이전과는 다른 점은, Model[(state_idx,action)]이 추가 되었다는 것인데요.</p>
<p>여기서 Model은 정말 다양한 모델을 쓸 수 있지만 일단 ppt에서 Model에도 table lookup도 있다고 해서 일단은 table lookup방식으로 해보았습니다! ! ! ! 
<img src="https://velog.velcdn.com/images/qlwkej285-/post/e2cf96ef-99c2-4be7-96f4-9832e017d5b8/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/fe0eddc0-5791-4ead-a52a-2b2c2d7a86d7/image.png" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/55af7fbb-3f70-413a-a0e2-2ce463b7a21a/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/eae9d017-c94a-4025-aea3-e51e82685138/image.png" alt=""></p>
<blockquote>
<p>이런식으로 점점 수렴하는 것을 알 수 있습니다!!! </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강화학습 스터디] 7강 Policy Gradient + 구현 코드 ]]></title>
            <link>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EC%8A%A4%ED%84%B0%EB%94%94-7%EA%B0%95-Policy-Gradient-%EA%B5%AC%ED%98%84-%EC%BD%94%EB%93%9C</link>
            <guid>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EC%8A%A4%ED%84%B0%EB%94%94-7%EA%B0%95-Policy-Gradient-%EA%B5%AC%ED%98%84-%EC%BD%94%EB%93%9C</guid>
            <pubDate>Mon, 24 Mar 2025 07:37:59 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/c1812601-87c1-492d-9f77-c549adbc9066/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/0edb6066-2931-4961-a560-84973d8681f2/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/4a5eef33-c98f-4b00-ac86-3e031302d56d/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/a42ca072-e67e-4b95-b3da-83c3a8609ef5/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/c7d2d010-28f7-4467-9566-a04abbdf7b86/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/f92be231-9ca2-47b0-b8b3-5fbb6b575f17/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/e9b9bda3-690f-4c31-a0db-a94c1a8bc756/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/a20ec0f9-95f4-451d-b4cc-b6ec4009cbb8/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/aff84e9d-489a-4ef1-b0e7-257289a04159/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/11c70a07-b888-4973-a06a-60d7e334d1f0/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/dca2fb87-7839-4209-9315-144f378d0a73/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/fcb2c8f4-6d4c-4331-ae7e-1d7428dbbd86/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/6a30dbc4-40aa-4867-8e3d-e2bb4b214e84/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/37b72a99-eae3-425e-be4c-44c4c32d9560/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/b25b4b19-7f5b-4be4-97fb-e880e43cbcbf/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/9f424185-7234-4b0c-b3c0-10a57f41e12f/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/57dc58d7-bb78-48b3-b525-8bfbdfcf26bc/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/62d10418-33fc-44ef-ba9f-3eef75139bb7/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/0c365f3d-7a25-4543-8ff1-bea3098936a7/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/3f2b91b6-f9ea-4283-86b4-f5b01faa1ed5/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/b383ad2a-d090-479a-8524-0f159f3bf914/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/b0ce31b9-a76f-46c1-95a8-e05295aec357/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/66b7dfe3-af7a-42b2-8245-51c95d463e7a/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/dbf5cf4c-650d-41b1-a34b-4024fdb398f0/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/e973657c-7cfe-4b1b-85f8-e8871c29a7c9/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/241ba31c-fde9-4d39-b222-9ac4fd73263b/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/130a9d79-5da4-442e-ac66-b4701ad1a0b3/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/8e76bff7-6a92-405c-8486-8e0f68d19da8/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/8a430bcf-a788-4ac1-a9c9-98094bfec443/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/7d1778c0-91d0-455e-a865-7c126cb18d3f/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/6be379ff-2edc-4292-8ea8-02bb8d3faf38/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/7e70524d-89f2-4241-ade2-2ddf570402b0/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/12d381ec-e17c-4d3c-9c36-50ce02afa24c/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/321ae012-f119-429c-923d-e1da3f634c59/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/9dac82fc-e643-46a7-b156-121e49834a28/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/e078d13e-68ec-4fe2-bf8c-8c0fa3c99a3d/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/22960367-3162-404c-b00c-adeff3ab4b07/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/82600d27-65d5-445e-b679-055f6ac6b64d/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/15345e77-b020-49a3-a79e-8ad4e591a51f/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/96fa6f25-c454-4d49-af04-6f24c7c433d1/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/554840ed-0c09-48d0-a658-0220116bad22/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/7261d138-f9d0-4a45-b6d5-72541be12bf1/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/d4fc448e-e1bd-4274-be2c-cf56664c7b49/image.jpg" alt=""></p>
<pre><code>
#### 1.  Monte Carlo Control Policy #### 
#==============================================================================

import numpy as np

num_states = 5
num_actions = 2
num_episodes = 5000

theta = np.random.randn(num_states, num_actions)  # 각 상태에서 행동별 가중치
#원래 사실 theta를 어떻게 initialize 해야하는지 감이 안잡혔었음.

# Softmax 정책 함수
def softmax_policy(state, theta):
    preferences = theta[state]  # 해당 상태의 행동별 가중치 가져오기
    exp_values = np.exp(preferences - np.max(preferences))  # 안정적인 softmax
    return exp_values / np.sum(exp_values)

# 확률에 따라 행동 선택
def choose_action(state, theta):
    probs = softmax_policy(state, theta)
    return np.random.choice(num_actions, p=probs)


# 한 번의 에피소드를 실행하면서 데이터를 모으는 코드 (Monte Carlo)
def run_episode(theta, max_steps=10):
    episode = []
    state = np.random.randint(0, num_states)  # 랜덤한 초기 상태

    for _ in range(max_steps):  # max_steps 이후 종료
        action = choose_action(state, theta)
        next_state = np.random.randint(0, num_states)
        reward = np.random.randn()

        episode.append((state, action, reward))
        state = next_state

    return episode

alpha = 0.01  # 학습률
gamma = 0.9   # 감가율 (할인율)

# GLIE Monte Carlo Control 학습
for episode_num in range(1, num_episodes + 1):
    episode = run_episode(theta) 

    G = 0  # 리턴값 초기화

    for state, action, reward in reversed(episode):
        G = reward + gamma * G  # 할인된 보상 계산
        probs = softmax_policy(state, theta)

        grad = np.zeros_like(theta[state])
        #gradient를 저장하는 저장소! 
        grad[action] = 1 - probs[action]  # log 확률의 gradient가 이렇게 계산이 되고 
        #여기서 헷갈렸던 건, 선택한 행동 선택한 행동 a에 대해서만 기울기를 계산
        theta[state] += alpha * grad * G  # 정책 파라미터 업데이트
        #alpha * log gradient * G 이렇게 되는 것임. 

# 학습된 파라미터 출력
print(&quot;Theta:&quot;)
print(theta)



#### 2.  Action Value Actor Critic #### 
#==============================================================================

import numpy as np

num_states = 5
num_actions = 2
num_episodes = 5000

theta = np.random.randn(num_states, num_actions)  # 각 상태에서 행동별 가중치
#원래 사실 theta를 어떻게 initialize 해야하는지 감이 안잡혔었음.
w = np.zeros(num_states * num_actions)  # VFA에서 사용할 가중치 초기화

# Softmax 정책 함수
def softmax_policy(state, theta):
    preferences = theta[state]  # 해당 상태의 행동별 가중치 가져오기
    exp_values = np.exp(preferences - np.max(preferences))  # 안정적인 softmax
    return exp_values / np.sum(exp_values)

# 확률에 따라 행동 선택
def choose_action(state, theta):
    probs = softmax_policy(state, theta)
    return np.random.choice(num_actions, p=probs)
    #행동 선택 

# 한 번의 에피소드를 실행하면서 데이터를 모으는 코드 (Monte Carlo) : 이건 필요 x .왜냐면 매스텝마다 update하니까. 
#def run_episode(theta, max_steps=10):


alpha = 0.01  # 학습률
gamma = 0.9   # 감가율 (할인율)



def feature_vector(state,action,num_states,num_actions):
    vec = np.zeros(num_states * num_actions)
    vec[state * num_actions + action] = 1  
    return vec

def VFA(state, action, w):
    return np.dot(w, feature_vector(state, action, num_states, num_actions))  # 가중치와 특징 벡터의 내적



for episode_num in range(1, num_episodes + 1):
    state = np.random.randint(0, num_states)  # 초기 상태
    action = choose_action(state, theta) #action 고르고 

    #여기서 state,action,reard in reversed(episode)할 필요가 없는 게, 이건 매번 update다.
    for _ in range(10):  # 최대 10 스텝
        reward = np.random.randn()  # 보상 샘플링
        next_state = np.random.randint(0, num_states)  # 환경에서 다음 상태 샘플링
        next_action = choose_action(next_state, theta)  # 정책에 따라 다음 행동 선택

        delta = reward + gamma * VFA(next_state, next_action, w) - VFA(state, action, w)  # TD error


        # 크리틱 업데이트 (w 업데이트)
        w += alpha * delta * feature_vector(state, action, num_states, num_actions)

        # 액터 업데이트 (theta 업데이트)
        probs = softmax_policy(state, theta)
        grad = np.zeros_like(theta[state])
        grad[action] = 1 - probs[action]
        theta[state] += alpha * grad * delta

        # 다음 스텝으로 이동
        state, action = next_state, next_action        

# 학습된 파라미터 출력
print(&quot;Theta:&quot;)
print(theta)</code></pre><p>6강에 있는 내용들 그대로 이해하기 쉽게 조금만 바꿔서 해보았습니다!!!!! </p>
<p>5강에서 한번 개념 제대로 잡으니까, 그냥 지식 업데이트만 하면 되는 느낌이더라구용!!! 
혹시 질문이 있다면,,,댓글을 남겨주세요!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강화학습 스터디] 6강 Value Function Approximation + 구현코드]]></title>
            <link>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B0%95-Value-Function-Approximation-%EA%B5%AC%ED%98%84%EC%BD%94%EB%93%9C</link>
            <guid>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B0%95-Value-Function-Approximation-%EA%B5%AC%ED%98%84%EC%BD%94%EB%93%9C</guid>
            <pubDate>Mon, 24 Mar 2025 06:30:02 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/1454592f-4a0d-4782-b7ac-d21c644d2f9b/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/8c49b95c-bffc-4cc6-aa44-38fa5b736f97/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/38c5a9ab-1afe-4b44-93d9-11212ce1d03c/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/1fb6df9f-472c-450a-9daa-9c2dffa0266c/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/6f13fc18-48d6-437c-a0ae-fc923d9c38da/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/93a03e94-b8ae-4432-95ac-03036e6c9711/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/da43d293-5b4b-495c-8b35-942ec9b6258a/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/c13af3cf-1118-48d6-8d85-e74d2e74daea/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/3d4a1127-751b-4327-971f-3a16452afeee/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/2934864c-b8c6-44a9-8a4c-b9a1d635fb51/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/e1e62653-ddcc-49a2-9788-3b5580c0e126/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/8e9cd786-65cc-4caf-a4cf-54d7c942f87d/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/42dcc047-ec15-4452-b88f-9e189ebdaf68/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/e0f854f4-4367-4972-9086-06a612238232/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/12744f43-58a4-4d46-ad0f-5cfb7c9d6baf/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/0e9441cb-ba6f-4248-9d65-c01b80b6e0cb/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/4b2bcee6-9ab7-4d33-97cd-f855933eb31f/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/9cc951a8-5450-49da-b860-74227bf803b0/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/eb857ef5-0100-4a09-bf41-bcc37220c204/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/4a1600c2-bae9-4aa7-ae58-bf38a1a90421/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/9b4093f5-2fe0-4651-8b87-fea00d079f81/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/b89e59ff-2446-4dbf-a427-5f21b644ab06/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/97f85c9d-be6a-4eca-8001-01c5a380563b/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/129f3412-bfc7-4171-aafc-3e57f9a3e23e/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/b8c8520b-4c64-4f02-82d5-dc8ac08564df/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/8ae65d59-0a65-4917-8559-af370c3964a6/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/dc6c1a45-c44a-4a95-8137-6cc4ee323a9e/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/2cf3f24d-165f-415e-a43e-a7e6714e599d/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/ba897489-81bb-4f26-946e-0b92b82b7784/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/1dfaa657-d8b8-4c50-b345-075bc70540c6/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/5480bd60-ff61-424a-b065-3c32762aa2d1/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/97c9572b-3b8e-4e08-a955-36c878c6667f/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/b8f1ac9e-6751-4191-abf3-0bdd46cbdce1/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/e4a5f6a1-747a-4ea4-ad76-85188f13921d/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/53354ae1-1bb3-4c56-8636-2533bff1ae0c/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/3f1b78c0-bfb0-4775-916d-5009f0c2eb7b/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/989ad4fa-a961-4525-ab2c-f0574a3b711a/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/0a3c3242-bd2a-4cea-b2ed-23b13ba56fc1/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/8e0165a3-5043-4ec8-930c-22f7e0359520/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/e1c88cdc-8655-4170-a086-5ef4e810e1e4/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/1e447598-e0dc-45e3-be31-6575e76199cc/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/5918b757-d18e-4669-8832-600f31f2a9d8/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/ec9d6b6a-94f9-4a5a-9688-d78762e7adfb/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/a1048c54-1da1-4cbb-9dbe-3435d4091811/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/52661adf-c434-4955-8970-ff30fee410b9/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/aa3a4614-d715-4d5d-a867-9392c84b0c1b/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/c4199262-bc77-4b93-b5a3-9f5d40fe3dfb/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/5b5544c5-f735-4a2e-abbd-c5c384174db5/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/6f24d7dc-fc3e-477e-925a-49674112b7b7/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/dfcbb750-862f-4264-99f6-a354f9f61b48/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/93850f88-6c23-4cd6-a710-fc876cb0cc84/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/d3b6b19e-b2ab-42d6-81dd-94c9e9f3ea46/image.jpg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/af1a3927-8933-46e3-8060-4a182b799ade/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/17e49471-af35-4abe-a2db-f558b1d55de9/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/ec178409-7dfc-4393-a4a8-e55332aa00ad/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/fb013419-06a2-4171-ac06-30412dba7e63/image.jpg" alt=""></p>
<pre><code>&quot;&quot;&quot;
THis is a code for Model Free Control in RL. 
&quot;&quot;&quot;

# ###1. Monte Carlo Value Function Approximation ###
# #==============================================================================
import numpy as np

num_states = 5    # 상태 개수
num_actions = 2   # 행동 개수
num_episodes = 5000  

# 가중치 초기화 (VFA용)
w = np.zeros(num_states)  # feature vector의 크기만큼 가중치 생성

# ε-greedy policy [만약, 저 epsilon이 고정이라면 그냥 exploration만 계속하게 됨]
def epsilon_greedy_policy(w, state, epsilon):
    # 행동에 대한 VFA 값 계산
    action_values = [VFA(state, w) for _ in range(num_actions)] #수정 

    # 가장 높은 VFA 값을 가지는 행동 선택
    best_action = np.argmax(action_values)

    # ε-greedy 정책
    policy = np.full(num_actions, epsilon / num_actions)   # 모든 행동에 대해 ε/m 확률 부여
    policy[best_action] += 1 - epsilon # 가장 좋은 행동에는 1 - ε 추가 확률 

    return np.random.choice(np.arange(num_actions), p=policy)

# 한 번의 에피소드를 실행하면서 데이터를 모으는 코드 (Monte Carlo)
def run_episode(epsilon, max_steps=10):
    episode = []  
    state = np.random.randint(0, num_states)  # 랜덤한 초기 상태

    while True:
        action = epsilon_greedy_policy(w, state, epsilon) #epsilon_greedy_policy로 탐색과정! 
        next_state = np.random.randint(0, num_states)  #
        reward = np.random.randn()

        episode.append((state, action, reward)) 
        state = next_state

        if len(episode) &gt;= max_steps:  # 최대 10번 이동 후 종료
            break
    return episode

def feature_vector(state, num_states):
    vec = np.zeros(num_states)
    vec[state] = 1  
    return vec

def VFA(state, w):
    return np.dot(w, feature_vector(state, num_states))  # 상태에 대한 가중치 적용

# GLIE Monte Carlo Control 학습
for episode_num in range(1, num_episodes+1):
    epsilon = 1 / episode_num # episode를 점점 늘려갈 때마다 epsilon값이 줄어든다. 
    episode = run_episode(epsilon) #매번 epsilon greedy policy로 탐색을 해서 episode를 만들어낸다. 

    G = 0  # 매번 그냥 0에서부터 시작. 그 에피소드에서는 G=0인 것임.
    visited = set()  # 첫 방문 판별용

    for state, action, reward in reversed(episode):
        G = reward + 0.9 * G  # 감가율  = 0.9 

        if (state, action) not in visited:  # 첫 방문인지 확인 
            visited.add((state, action)) 
            state_vec = feature_vector(state,num_states) # 상태 벡터 생성
            alpha = 1 / (episode_num + 1)

            w += alpha * (G - VFA(state, w)) * state_vec  # w 업데이트
            #Q[state, action] += alpha * (G - Q[state, action])여기서는 이걸 할 필요가 없음. 단순히 w만 업데이트 하면 됨. 

print(&quot;W:&quot;)
print(w)


#==============================================================================

#### 2.SARSA ####
w = np.zeros(num_states * num_actions) # feature vector의 크기만큼 가중치 생성
def epsilon_greedy_policy(w, state, epsilon):
    # 행동에 대한 VFA 값 계산
    action_values = [VFA(state, w) for _ in range(num_actions)]

    # 가장 높은 VFA 값을 가지는 행동 선택
    best_action = np.argmax(action_values)

    # ε-greedy 정책
    policy = np.full(num_actions, epsilon / num_actions)   # 모든 행동에 대해 ε/m 확률 부여
    policy[best_action] += 1 - epsilon # 가장 좋은 행동에는 1 - ε 추가 확률 

    return np.random.choice(np.arange(num_actions), p=policy)
def run_episode_next(epsilon, max_steps=10):
    episode = []  
    state = np.random.randint(0, num_states)  # 랜덤한 초기 상태
    action = epsilon_greedy_policy(w, state, epsilon)  # 초기 행동 선택

    while True:
        next_state = np.random.randint(0, num_states)  # 임의의 환경 이동
        reward = np.random.randn()
        next_action = epsilon_greedy_policy(w, next_state, epsilon) # 다음 행동 선택

        episode.append((state, action, reward, next_state, next_action)) 

        state, action = next_state, next_action  # SARSA는 (s, a, r, s&#39;, a&#39;) 방식으로 진행!

        if len(episode) &gt;= max_steps:  # 최대 10번 이동 후 종료
            break
    return episode   


def feature_vector(state,action,num_states,num_actions):
    vec = np.zeros(num_states * num_actions)
    vec[state * num_actions + action] = 1  
    return vec

def VFA(state, action, w):
    return np.dot(w, feature_vector(state, action, num_states, num_actions))  # state-action에 대한 가중치 적용

for episode_num in range(1, num_episodes+1):
    epsilon = 1 / episode_num # episode를 점점 늘려갈 때마다 epsilon값이 줄어든다. 
    episode = run_episode_next(epsilon)  

    visited = set()  # 첫 방문 판별용

    for state, action, reward, next_state, next_action in reversed(episode):
        if (state, action) not in visited:  
            visited.add((state, action)) 
            state_action_vec = feature_vector(state, action, num_states,num_actions) # 상태 벡터 생성

            alpha = 1 / (episode_num + 1)

            w += alpha * (reward + 0.9 * VFA(next_state, next_action, w) - VFA(state, action, w)) * state_action_vec

print(&quot;학습된 가중치 벡터 w:&quot;)
print(w)


#### 3.n-step SARSA ####
n_step = 3  
alpha = 0.1

for episode_num in range(1, num_episodes + 1):
    epsilon = 1 / episode_num  # Exploration 감소
    episode = run_episode_next(epsilon)  # 에피소드 진행

    for t in range(len(episode)):  # 각 time step에 대해 반복
        G = 0  # n-step return 초기화

        # 1. n-step 동안 보상 계산
        for i in range(n_step):  # n-step동안 보상 계산
            if t + i &lt; len(episode):
                G += (0.9 ** i) * episode[t + i][2]  # 보상 추가 n-step 동안 보상 계산 : 이거는 건들 수 없고, 건들 필요가 없음. 

        # 2. n-step 후의 Q 값 추가 여기서 건든다.
        if t + n_step &lt; len(episode):
            G += (0.9 ** n_step) * VFA(episode[t + n_step][3], episode[t + n_step][4], w)

        # 3. Q 업데이트
        state, action = episode[t][:2]  # 현재 상태, 행동
        state_action_vec = feature_vector(state, action, num_states, num_actions)  # 상태-행동 벡터 생성
        w += alpha * (G - VFA(state, action, w)) * state_action_vec  # 가중치 업데이트

print(&quot;학습된 가중치 벡터 w:&quot;)
print(w)


#### 4.backward SARSA ####

alpha = 0.1  # 학습률
gamma = 0.9  # 할인율
lmbda = 0.8  # Eligibility Trace 감쇠율

for episode_num in range(1, num_episodes + 1):
    #원래는
    E = np.zeros((num_states, num_actions)) 
    #Q = np.zeros((num_states, num_actions)) 
    w = np.zeros(num_states * num_actions)  
    epsilon = 1 / episode_num  # Exploration 감소
    episode = run_episode_next(epsilon)

    for state, action, reward, next_state, next_action in reversed(episode):
        d = reward + gamma * VFA(next_state, next_action, w) - VFA(state, action, w)#d = reward + 0.9 * Q[next_state,next_action] - Q[state,action]

        E[state,action] = E[state,action] + 1 #일단 방문했으니까 +1 증가시킴
        #흠 여기까지는 그래도 어느정도 이해가 가는데,밑에는 잘 몰라서
        for s in range(num_states):
            for a in range(num_actions):
                w += alpha * d * E[s, a]  # Q 업데이트
                E[s, a] *= gamma * lmbda  #(시간이 지나면서 감소)
            &quot;&quot;&quot;
            1. 기본 SARSA와의 비교 
            Q[state, action] += alpha * (reward + 0.9 * Q[next_state, next_action] - Q[state,action])  
            =&gt; 이게 기본 SARSA알고리즘
            =&gt; Q[state, action] += alpha * (d) 인 것임.  
            따라서, E[s,a]를 단순히 곱하면
            Q[state, action] += alpha * (d) * E[s,a]임 


            2. 왜 여기서 num_states와 num_actions에 대해 다 계산하니? 
            Q 값을 업데이트할 때는 현재 상태뿐만 아니라 과거에 방문했던 상태들도 보상의 영향을 받음 
            이걸 처리하기 위해 모든 상태-행동 쌍에 대해 Eligibility Trace를 곱해서 업데이트
            &quot;&quot;&quot;
print(w)

#### 5. Q-Learning ####
def greedy_policy_val_weight(Q,state,action): #state가 주어질 때 best action을 선택해서 값을 찾는 greedy
    #return np.max(VFA(state,action,w)) #현실적으로 greedy가 안될 거 같다? 이부분이? 
    return np.max([VFA(state, action, w) for action in range(num_actions)])

    #ver2. 정리 버전 - 37p : Q(S,A) ←Q(S,A) + α R + γ maxa′Q(S′,a′)−Q(S,A)
for episode_num in range(1, num_episodes+1):
    epsilon = 1 / episode_num # episode를 점점 늘려갈 때마다 epsilon값이 줄어든다. 
    #behaviro policy ( 내가 관찰한 policy )
    episode = run_episode_next(epsilon) 

    visited = set()  # 첫 방문 판별용

    for state, action, reward, next_state, next_action in reversed(episode): 
        if (state, action) not in visited:  
            visited.add((state, action))  

            N[state, action] += 1  # 방문 횟수 증가
            alpha = 1 / N[state, action]  # 학습률 감소 (GLIE 조건)

            # target policy에서의 action 추출? 
            # 어떻게 target policy를 특정하지? 일단 greedy라고 나와있으니, greedy하게 episode를 뽑아보자. 
            #next_val = greedy_policy_val(Q, next_state)
            next_val =greedy_policy_val_weight(state,action,w) #이게 맞는건가?

            w += alpha * (reward + 0.9 * next_val - VFA(state, action, w)) * feature_vector(state, action, num_states, num_actions)
            #여기서 매우 중요한 건, 똑같이 저렇게 reversed(episode)를 했다고 하더라도, 저 위에서는 G를 썼지만, 여기서는 그때의 그 reward만을 써서 update를 한다는 것
print(&quot;w&quot;)
print(w)
&#39;&#39;&#39;
Q-learning에서는, 그 다음에 최적의 행동을 선택할 때, 
가장 그 이후의 최적의 행동이어야 하는데 과연 이걸 어떻게 weight로 표현할 수 있을까?

(이전에는 단순히 Q[state]의 max를 뽑았는데?)
=&gt; 일단 state가 고정되어 있으니까, 너무 걱정하지 말고 그 state에 해당하는 action을 뽑아서 그 action에 대한 가중치를 뽑아보자.
&#39;&#39;&#39;
### 6. DQN ###
w = np.zeros(num_states * num_actions)  # 가중치 벡터
w_minus = np.copy(w)

def get_mini_batch(episode, batch_size):
      &quot;&quot;&quot; 주어진 episode에서 미니 배치를 샘플링하는 함수 &quot;&quot;&quot;
    # 무작위로 미니 배치 샘플링 (배치 사이즈 만큼)
    mini_batch = random.sample(episode, batch_size)
    return mini_batch

for episode_num in range(1, num_episodes+1):
    epsilon = 1 / episode_num # episode를 점점 늘려갈 때마다 epsilon값이 줄어든다. 
    #behavior policy ( 내가 관찰한 policy )
    episode = run_episode_next(epsilon) #e-greedy로 episode를 뽑아낸다.

    visited = set()  # 첫 방문 판별용

    #매번 뽑는 게 아니라, random mini-batch를 뽑는다 
    batch_size = 4 
    mini_batch = get_mini_batch(episode, batch_size)

    for state, action, reward, next_state, next_action in mini_batch: 
        if (state, action) not in visited:  
            visited.add((state, action))  

            N[state, action] += 1  # 방문 횟수 증가
            alpha = 1 / N[state, action]  # 학습률 감소 (GLIE 조건)

            # target policy에서의 action 추출? 
            # 어떻게 target policy를 특정하지? 일단 greedy라고 나와있으니, greedy하게 episode를 뽑아보자. 
            #next_val = greedy_policy_val(Q, next_state)
            next_val = VFA(next_state, next_action, w_minus) #왜냐면, 저기 식에서 w_minus를 쓰니까
            w += alpha * (reward + 0.9 * next_val - VFA(state, action, w)) * feature_vector(state, action, num_states, num_actions)

    if episode_num % 10 == 0:  # 예: 10 에피소드마다 동기화
        w_minus = np.copy(w)

print(&quot;w&quot;)
print(w)</code></pre><p>밑에꺼는, GPT한테 argparse써서 좀 예쁘게 보일 수 있도록 맡겨보았습니당 </p>
<pre><code>import numpy as np
import random
import torch
import torch.nn as nn
import torch.optim as optim
from collections import deque

# 하이퍼파라미터 설정
num_episodes = 1000
epsilon_start = 1.0
epsilon_end = 0.1
epsilon_decay = 0.995
gamma = 0.99  # 할인율
batch_size = 32
learning_rate = 0.0001
update_target_every = 10  # 타겟 네트워크 업데이트 주기

# 환경 설정 (예시로 OpenAI Gym 환경을 사용)
import gym
env = gym.make(&#39;CartPole-v1&#39;)

# Q 네트워크 정의
class QNetwork(nn.Module):
    def __init__(self, state_dim, action_dim):
        super(QNetwork, self).__init__()
        self.fc1 = nn.Linear(state_dim, 64) 
        self.fc2 = nn.Linear(64, 64)
        self.fc3 = nn.Linear(64, action_dim)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        return self.fc3(x)

# Q 네트워크와 타겟 네트워크 초기화
state_dim = env.observation_space.shape[0]
action_dim = env.action_space.n
q_network = QNetwork(state_dim, action_dim)
target_network = QNetwork(state_dim, action_dim)
target_network.load_state_dict(q_network.state_dict())  # 타겟 네트워크 초기화
target_network.eval()  # 타겟 네트워크는 평가 모드

# 옵티마이저
optimizer = optim.Adam(q_network.parameters(), lr=learning_rate)

# 경험 리플레이 버퍼
memory = deque(maxlen=10000)

# epsilon-greedy 정책
def epsilon_greedy(state, epsilon):
    if random.random() &lt; epsilon:
        return env.action_space.sample()  # 랜덤 행동
    else:
        state_tensor = torch.FloatTensor(state).unsqueeze(0)
        q_values = q_network(state_tensor)  # Q값 예측
        return torch.argmax(q_values).item()  # 가장 큰 Q값을 가지는 행동 선택

# 경험 리플레이에서 미니 배치 샘플링
def get_mini_batch(batch_size):
    batch = random.sample(memory, batch_size)
    states, actions, rewards, next_states, dones = zip(*batch)
    return torch.FloatTensor(states), torch.LongTensor(actions), torch.FloatTensor(rewards), torch.FloatTensor(next_states), torch.BoolTensor(dones)

# 학습 루프
epsilon = epsilon_start
for episode in range(num_episodes):
    state = env.reset()
    total_reward = 0
    done = False

    while not done:
        action = epsilon_greedy(state, epsilon)
        next_state, reward, done, _ = env.step(action)
        memory.append((state, action, reward, next_state, done))  # 경험 리플레이 버퍼에 저장

        state = next_state
        total_reward += reward

        # 미니 배치로 학습
        if len(memory) &gt; batch_size:
            states, actions, rewards, next_states, dones = get_mini_batch(batch_size)

            # 현재 Q 네트워크에서 Q값 계산
            q_values = q_network(states) #feature vector뽑기 + w내적이 다 여기에 포함된 과정임. 
            q_value = q_values.gather(1, actions.unsqueeze(1))  # 현재 행동에 대한 Q값

            # 타겟 네트워크에서 Q값 계산
            next_q_values = target_network(next_states)
            next_q_value = next_q_values.max(1)[0]  # 가장 큰 Q값

            # 타겟 Q값 계산
            target = rewards + gamma * next_q_value * (~dones)

            # 손실 함수 계산
            loss = nn.MSELoss()(q_value.squeeze(), target)

            # 역전파
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

    # epsilon 값 감소
    epsilon = max(epsilon_end, epsilon * epsilon_decay)

    # 주기적으로 타겟 네트워크 업데이트
    if episode % update_target_every == 0:
        target_network.load_state_dict(q_network.state_dict())

    print(f&quot;Episode {episode+1}/{num_episodes}, Total Reward: {total_reward}&quot;)

print(&quot;학습 완료!&quot;)</code></pre><p>하나하나 다 저 David RL보고 구현한거라서! 오류가 있을 수도 있으니(?) 주의해주세요ㅎㅎ </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강화학습 스터디] 5강 Model Free Control  구현 코드 ]]></title>
            <link>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EC%8A%A4%ED%84%B0%EB%94%94-Model-Free-Control-%EA%B5%AC%ED%98%84-%EC%BD%94%EB%93%9C</link>
            <guid>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EC%8A%A4%ED%84%B0%EB%94%94-Model-Free-Control-%EA%B5%AC%ED%98%84-%EC%BD%94%EB%93%9C</guid>
            <pubDate>Wed, 05 Mar 2025 07:05:18 GMT</pubDate>
            <description><![CDATA[<pre><code>&quot;&quot;&quot;
THis is a code for Model Free Control in RL. 
&quot;&quot;&quot;

#### 1. GLIE Monte Carlo Control #### 
#==============================================================================
import numpy as np

num_states = 5    # 상태 개수
num_actions = 2   # 행동 개수
num_episodes = 5000  

# Q-테이블 초기화 (모든 Q(s,a)를 0으로 시작) 
# Q(s,a) ==  E[ Gt | St= s , At = a]
Q = np.zeros((num_states, num_actions)) 

# 각 상태에서 방문 횟수 저장
N = np.zeros((num_states, num_actions))

# ε-greedy policy [만약, 저 epsilon이 고정이라면 그냥 exploration만 계속하게 됨]
def epsilon_greedy_policy(Q, state, epsilon):
    m = len(Q[state])
    best_action = np.argmax(Q[state])  # Q 값이 가장 높은 행동 선택

    policy = np.full(m, epsilon / m)   # 모든 행동에 대해 ε/m 확률 부여
    policy[best_action] += 1 - epsilon # 가장 좋은 행동에는 1 - ε 추가 확률

    return np.random.choice(np.arange(m), p=policy)

# 한 번의 에피소드를 실행하면서 데이터를 모으는 코드 (Monte Carlo)
def run_episode(epsilon, max_steps=10):
    episode = []  
    state = np.random.randint(0, num_states)  # 랜덤한 초기 상태

    while True:
        action = epsilon_greedy_policy(Q, state, epsilon) #epsilon_greedy_policy로 탐색과정! 
        next_state = np.random.randint(0, num_states)  #
        reward = np.random.randn()

        episode.append((state, action, reward)) 
        state = next_state

        if len(episode) &gt;= max_steps:  # 최대 10번 이동 후 종료
            break
    return episode



# GLIE Monte Carlo Control 학습
for episode_num in range(1, num_episodes+1):
    epsilon = 1 / episode_num # episode를 점점 늘려갈 때마다 epsilon값이 줄어든다. 
    episode = run_episode(epsilon) #매번 epsilon greedy policy로 탐색을 해서 episode를 만들어낸다. 

    G = 0  # 매번 그냥 0에서부터 시작. 그 에피소드에서는 G=0인 것임.
    visited = set()  # 첫 방문 판별용

    for state, action, reward in reversed(episode):
        G = reward + 0.9 * G  # 감가율  = 0.9 

        if (state, action) not in visited:  # 첫 방문인지 확인 
            visited.add((state, action)) 
            N[state, action] += 1  # 특정 state, 특정 action에 대해 방문 횟수 증가
            alpha = 1 / N[state, action]  # GLIE 조건: α → 0 (학습율 감소)
            Q[state, action] += alpha * (G - Q[state, action])  # Q(s,a) 업데이트


print(&quot;학습된 Q 테이블:&quot;)
print(Q)


#==============================================================================

#### 2.SARSA ####
def run_episode_next(epsilon, max_steps=10):
    episode = []  
    state = np.random.randint(0, num_states)  # 랜덤한 초기 상태
    action = epsilon_greedy_policy(Q, state, epsilon)  # 초기 행동 선택

    while True:
        next_state = np.random.randint(0, num_states)  # 임의의 환경 이동
        reward = np.random.randn()
        next_action = epsilon_greedy_policy(Q, next_state, epsilon) # 다음 행동 선택

        episode.append((state, action, reward, next_state, next_action)) 

        state, action = next_state, next_action  # SARSA는 (s, a, r, s&#39;, a&#39;) 방식으로 진행!

        if len(episode) &gt;= max_steps:  # 최대 10번 이동 후 종료
            break
    return episode   


for episode_num in range(1, num_episodes+1):
    epsilon = 1 / episode_num # episode를 점점 늘려갈 때마다 epsilon값이 줄어든다. 
    episode = run_episode_next(epsilon)  

    visited = set()  # 첫 방문 판별용

    for state, action, reward, next_state, next_action in reversed(episode):
        if (state, action) not in visited:  
            visited.add((state, action))  

            N[state, action] += 1  # 방문 횟수 증가
            alpha = 1 / N[state, action]  # 학습률 감소 (GLIE 조건)

            Q[state, action] += alpha * (reward + 0.9 * Q[next_state, next_action] - Q[state, action])
            #여기서 매우 중요한 건, 똑같이 저렇게 reversed(episode)를 했다고 하더라도, 저 위에서는 G를 썼지만, 여기서는 그때의 그 reward만을 써서 update를 한다는 것
print(&quot;학습된 Q 테이블:&quot;)
print(Q)


#### 3.n-step SARSA ####
n_step = 3  
alpha = 0.1
for episode_num in range(1, num_episodes + 1):
    epsilon = 1 / episode_num  # Exploration 감소
    episode = run_episode_next(epsilon)  

    for t in range(len(episode)):  # 각 time step에 대해 반복
        G = 0  # n-step return 초기화

        # 1. n-step 동안 보상 계산
        for i in range(n_step): #3번 step이라고 하면 3번 반복해야함.
            if t + i &lt; len(episode):
                G += (0.9 ** i) * episode[t + i][2]  # 이건 보상!!!! 

        # 2. n-step 후의 Q 값 추가
        if t + n_step &lt; len(episode):
            G += (0.9 ** n_step) * Q[episode[t + n_step][3], episode[t + n_step][4]]

        # 3. Q 업데이트
        state, action = episode[t][:2]  # 현재 상태, 행동
        Q[state, action] += alpha * (G - Q[state, action])  
print(&quot;학습된 Q 테이블:&quot;)
print(Q)



#### 4.backward SARSA ####

alpha = 0.1  # 학습률
gamma = 0.9  # 할인율
lmbda = 0.8  # Eligibility Trace 감쇠율

for episode_num in range(1, num_episodes + 1):
    E = np.zeros((num_states, num_actions))
    Q = np.zeros((num_states, num_actions))
    epsilon = 1 / episode_num  # Exploration 감소
    episode = run_episode_next(epsilon)

    for state, action, reward, next_state, next_action in reversed(episode):
        d = reward + 0.9 * Q[next_state,next_action] - Q[state,action]

        E[state,action] = E[state,action] + 1 #일단 방문했으니까 +1 증가시킴
        #흠 여기까지는 그래도 어느정도 이해가 가는데,밑에는 잘 몰라서
        for s in range(num_states):
            for a in range(num_actions):
                Q[s, a] += alpha * d * E[s, a]  # Q 업데이트
                E[s, a] *= gamma * lmbda  #(시간이 지나면서 감소)
            &quot;&quot;&quot;
            1. 기본 SARSA와의 비교 
            Q[state, action] += alpha * (reward + 0.9 * Q[next_state, next_action] - Q[state,action])  
            =&gt; 이게 기본 SARSA알고리즘
            =&gt; Q[state, action] += alpha * (d) 인 것임.  
            따라서, E[s,a]를 단순히 곱하면
            Q[state, action] += alpha * (d) * E[s,a]임 


            2. 왜 여기서 num_states와 num_actions에 대해 다 계산하니? 
            Q 값을 업데이트할 때는 현재 상태뿐만 아니라 과거에 방문했던 상태들도 보상의 영향을 받음 
            이걸 처리하기 위해 모든 상태-행동 쌍에 대해 Eligibility Trace를 곱해서 업데이트
            &quot;&quot;&quot;

#### 5. Q-Learning ####

def greedy_policy_action(Q, state): #state만 주어질 때 best action을 찾는 greedy
    return np.argmax(Q[state])

    #ver1. 정석 버전 - 35p : Q(St ,At ) ←Q(St ,At ) + α Rt+1 + γQ(St+1,A′)−Q(St ,At ) 이 식 그대로 
for episode_num in range(1, num_episodes+1):
    epsilon = 1 / episode_num # episode를 점점 늘려갈 때마다 epsilon값이 줄어든다. 
    #behaviro policy ( 내가 관찰한 policy )
    episode = run_episode_next(epsilon) 

    visited = set()  # 첫 방문 판별용

    for state, action, reward, next_state, next_action in reversed(episode): 
        if (state, action) not in visited:  
            visited.add((state, action))  

            N[state, action] += 1  # 방문 횟수 증가
            alpha = 1 / N[state, action]  # 학습률 감소 (GLIE 조건)

            # target policy에서의 action 추출? 
            # 어떻게 target policy를 특정하지? 일단 greedy라고 나와있으니, greedy하게 episode를 뽑아보자. 
            next_action_target = greedy_policy_action(Q, next_state)  # 목표 정책의 행동 선택

            Q[state, action] += alpha * (reward + 0.9 * Q[next_state, next_action_target] - Q[state, action])

print(&quot;학습된 Q 테이블:&quot;)
print(Q)



def greedy_policy_val(Q, state): #state가 주어질 때 best action을 선택해서 값을 찾는 greedy
    return np.max(Q[state])

    #ver2. 정리 버전 - 37p : Q(S,A) ←Q(S,A) + α R + γ maxa′Q(S′,a′)−Q(S,A)
for episode_num in range(1, num_episodes+1):
    epsilon = 1 / episode_num # episode를 점점 늘려갈 때마다 epsilon값이 줄어든다. 
    #behaviro policy ( 내가 관찰한 policy )
    episode = run_episode_next(epsilon) 

    visited = set()  # 첫 방문 판별용

    for state, action, reward, next_state, next_action in reversed(episode): 
        if (state, action) not in visited:  
            visited.add((state, action))  

            N[state, action] += 1  # 방문 횟수 증가
            alpha = 1 / N[state, action]  # 학습률 감소 (GLIE 조건)

            # target policy에서의 action 추출? 
            # 어떻게 target policy를 특정하지? 일단 greedy라고 나와있으니, greedy하게 episode를 뽑아보자. 
            next_val = greedy_policy_val(Q, next_state)  # 최대 Q 값 사용

            Q[state, action] += alpha * (reward + 0.9 * next_val - Q[state, action])
            #여기서 매우 중요한 건, 똑같이 저렇게 reversed(episode)를 했다고 하더라도, 저 위에서는 G를 썼지만, 여기서는 그때의 그 reward만을 써서 update를 한다는 것
print(&quot;학습된 Q 테이블:&quot;)
print(Q)</code></pre><p>결국 중요한 건, 어떻게 저렇게 0.9뒤에 곱해지는 애들이 어떻게 달라지는지이다. </p>
<p>지피티를 진짜 검토할 때만 쓰고 혼자 이렇게 구현했다는 것이 매우 뿌듯&gt;&lt;하다</p>
<h1 id="q-learning과-다른-learning의-차이">Q-learning과 다른 learning의 차이?</h1>
<pre><code class="language-python">
#### 5. Q-Learning ####

def greedy_policy_action(Q, state): #state만 주어질 때 best action을 찾는 greedy
    return np.argmax(Q[state])

    #ver1. 정석 버전 PPT 35p : Q(St ,At ) ←Q(St ,At ) + α Rt+1 + γQ(St+1,A′)−Q(St ,At ) 이 식 그대로 
for episode_num in range(1, num_episodes+1):
    epsilon = 1 / episode_num # episode를 점점 늘려갈 때마다 epsilon값이 줄어든다. 
    #behaviro policy ( 내가 관찰한 policy )
    episode = run_episode_next(epsilon) 

    visited = set()  # 첫 방문 판별용

    for state, action, reward, next_state, next_action in reversed(episode): 
        if (state, action) not in visited:  
            visited.add((state, action))  

            N[state, action] += 1  # 방문 횟수 증가
            alpha = 1 / N[state, action]  # 학습률 감소 (GLIE 조건)

            # target policy에서의 action 추출? 
            # 어떻게 target policy를 특정하지? 일단 greedy라고 나와있으니, greedy하게 episode를 뽑아보자. 
            next_action_target = greedy_policy_action(Q, next_state)  # 목표 정책의 행동 선택

            Q[state, action] += alpha * (reward + 0.9 * Q[next_state, next_action_target] - Q[state, action])

print(&quot;학습된 Q 테이블:&quot;)
print(Q)

def greedy_policy_val(Q, state): #state가 주어질 때 best action을 선택해서 값을 찾는 greedy
    return np.max(Q[state])

    #ver2. 정리 버전 PPT 37p : Q(S,A) ←Q(S,A) + α R + γ maxa′Q(S′,a′)−Q(S,A)
for episode_num in range(1, num_episodes+1):
    epsilon = 1 / episode_num # episode를 점점 늘려갈 때마다 epsilon값이 줄어든다. 
    #behaviro policy ( 내가 관찰한 policy )
    episode = run_episode_next(epsilon) 

    visited = set()  # 첫 방문 판별용

    for state, action, reward, next_state, next_action in reversed(episode): 
        if (state, action) not in visited:  
            visited.add((state, action))  

            N[state, action] += 1  # 방문 횟수 증가
            alpha = 1 / N[state, action]  # 학습률 감소 (GLIE 조건)

            # target policy에서의 action 추출? 
            # 어떻게 target policy를 특정하지? 일단 greedy라고 나와있으니, greedy하게 episode를 뽑아보자. 
            next_val = greedy_policy_val(Q, next_state)  # 최대 Q 값 사용

            Q[state, action] += alpha * (reward + 0.9 * next_val - Q[state, action])
            #여기서 매우 중요한 건, 똑같이 저렇게 reversed(episode)를 했다고 하더라도, 저 위에서는 G를 썼지만, 여기서는 그때의 그 reward만을 써서 update를 한다는 것
print(&quot;학습된 Q 테이블:&quot;)
print(Q)</code></pre>
<pre><code class="language-python">#### 2.SARSA ####
for episode_num in range(1, num_episodes+1):
    epsilon = 1 / episode_num # episode를 점점 늘려갈 때마다 epsilon값이 줄어든다. 
    episode = run_episode_next(epsilon)  

    visited = set()  # 첫 방문 판별용

    for state, action, reward, next_state, next_action in reversed(episode):
        if (state, action) not in visited:  
            visited.add((state, action))  

            N[state, action] += 1  # 방문 횟수 증가
            alpha = 1 / N[state, action]  # 학습률 감소 (GLIE 조건)

            Q[state, action] += alpha * (reward + 0.9 * Q[next_state, next_action] - Q[state, action])
            #여기서 매우 중요한 건, 똑같이 저렇게 reversed(episode)를 했다고 하더라도, 저 위에서는 G를 썼지만, 여기서는 그때의 그 reward만을 써서 update를 한다는 것
print(&quot;학습된 Q 테이블:&quot;)
print(Q)</code></pre>
<ul>
<li>SARSA vs Q-Learning<ul>
<li>next_state, next_action은 어디서?<ul>
<li>next_state : 둘다 기존의 policy(behavior policy)에서 뽑는다.</li>
<li>next_action :<ul>
<li>SARSA : from behavior policy <em>(run_episode_next 함수 활용)</em></li>
<li>Q-Learning : from target policy <em>(greedy_policy_action 함수 or greedy_policy_val)</em></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>            &lt;br&gt;
            ⇒ 그렇다면, 언제 greedy_policy_action을? 언제 greedy_policy_val을?
            &lt;br&gt;
            &lt;br&gt;
            greedy_policy_action : 
            &lt;br&gt;
            최적의 행동(next action)을 직접 선택
            &lt;br&gt;
            `argmax(Q[state])`를 사용해 가장 높은 Q 값을 가진 행동 선택
            &lt;br&gt;
            &lt;br&gt;
            greedy_policy_val : 

            특정 상태에서 최대 Q 값을 가져오기 위해 사용

            `max(Q[state])`를 사용해 가능한 행동 중 최대 Q 값 반환</code></pre><h1 id="epsilon_greedy_policy-vs-greedy_policy">epsilon_greedy_policy vs greedy_policy</h1>
<pre><code class="language-python">def epsilon_greedy_policy(Q, state, epsilon):
    m = len(Q[state])
    best_action = np.argmax(Q[state])  # Q 값이 가장 높은 행동 선택

    policy = np.full(m, epsilon / m)   # 모든 행동에 대해 ε/m 확률 부여
    policy[best_action] += 1 - epsilon # 가장 좋은 행동에는 1 - ε 추가 확률

    return np.random.choice(np.arange(m), p=policy)
    # 완전히 랜덤이 아니라, 특정 확률 분포를 따르는 랜덤 선택을 하기 위해서. 


def greedy_policy_action(Q, state): #state만 주어질 때 best action을 찾는 greedy
    return np.argmax(Q[state])


def greedy_policy_val(Q, state): #state가 주어질 때 best action을 선택해서 값을 찾는 greedy
    return np.max(Q[state])</code></pre>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/fc331d55-3159-437d-9332-9bb9ab874226/image.png" alt=""></p>
<ul>
<li><p>epsilon_greedy_policy vs greedy_policy</p>
<ul>
<li><p>e_greedy : 탐색(exploration)까지 고려해야 할 때
  -&gt; ⇒ 다시 살펴보니, 애초에 ‘탐색’임. (함수 이름을 epsilon_greedy_policy_exp)이렇게 했어야하나…ㅎㅎ
  → 그래서 저기에 np.random.choice를 넣어두는 것임. </p>
</li>
<li><p>greedy_policy : 가장 좋은 행동, 좋은 값만 선택할 때</p>
<p>  → 그래서 저기에 np.random.choice가 없는 것</p>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코테] 백준 2775 python]]></title>
            <link>https://velog.io/@qlwkej285-/%EC%BD%94%ED%85%8C-%EB%B0%B1%EC%A4%80-2775-python</link>
            <guid>https://velog.io/@qlwkej285-/%EC%BD%94%ED%85%8C-%EB%B0%B1%EC%A4%80-2775-python</guid>
            <pubDate>Tue, 04 Mar 2025 08:16:14 GMT</pubDate>
            <description><![CDATA[<pre><code>

&#39;&#39;&#39;
문제
평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다.

이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다.

아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.

입력
첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다

출력
각각의 Test case에 대해서 해당 집에 거주민 수를 출력하라.

제한
1 ≤ k, n ≤ 14
예제 입력 1 
2
1
3
2
3
예제 출력 1 
6
10

&#39;&#39;&#39;</code></pre><h1 id="반성">반성</h1>
<ol start="0">
<li>처음부터 0층을 채움 </li>
<li>층을 순회할 때 :  1층~max_k층까지 채워야 함. (1,max_k+1)이 맞음.</li>
<li>호수를 순회할 때 : 1호~max까지 채워야 함. 그래서 (0,max)가 맞음.</li>
</ol>
<pre><code>
T = int(input())

for _ in range(T):  
    k = int(input())
    n = int(input())
    people = [x for x in range(1, n+1)]  
    for _ in range(k):
        for i in range(1, n): 
            people[i] += people[i-1] 
    print(people[n-1])</code></pre><h1 id="-잘못된-풀이"># 잘못된 풀이</h1>
<pre><code># T = int(input())
# d = [[0]*14 for i in range(0,14)] #14 x 14 matrix
# d[0] = [i for i in range(1,15)] #0층은 1부터 14까지 사람이 산다. d[0][0] = 0층 1호에 사는 사람 수 d[0][1] = 0층 2호에 사는 사람 수
# k_n = [(int(input()), int(input())) for _ in range(T)]
# max_k = max(k_n, key=lambda x: x[0])[0]  # 층 최대값
# max_n = max(k_n, key=lambda x: x[1])[1] 

# for a in range(1,max_k+1): #층(이미 1층부터는 채워져있으니까)
#   for b in range(0,max_n):#호수
#     if b == 0:
#             d[a][b] = d[a - 1][b]  # 1호는 바로 아래층의 사람 수와 같음
#         else:
#             d[a][b] = d[a][b - 1] + d[a - 1][b]  # 점화식 적용

# for (k,n) in k_n:
#   print(d[k][n-1])</code></pre><p>🚀 핵심 차이점</p>
<ol>
<li><p>공간 복잡도 차이
네 풀이: d라는 2차원 리스트(14x14) 를 만들어서 저장함. (메모리 사용 큼)
정답 풀이: 1차원 리스트(people) 만 사용하여 메모리 절약함.
👉 교훈: 꼭 필요한 데이터만 저장하자!
2차원 배열 없이, 필요한 부분만 업데이트하는 방식을 연습</p>
</li>
<li><p>점화식 적용 방식
네 풀이는 d[k][n] = d[k][n-1] + d[k-1][n]을 2차원 배열에 직접 적용.
정답 풀이는 people[i] += people[i-1]를 사용해 1차원 리스트에서 값을 누적.
👉 교훈: 배열을 줄이는 테크닉 배우기</p>
</li>
</ol>
<p>people[i] += people[i-1] 방식처럼, 계산에 필요한 최소한의 변수만 업데이트하는 방식 고민해 보기.</p>
<ol start="3">
<li>미리 저장 vs 실시간 계산
네 풀이는 최대 층수, 최대 호수를 미리 계산해서 d를 전부 채움.
정답 풀이는 각 테스트 케이스마다 바로 계산.
👉 교훈: 미리 계산할 필요가 없으면, 즉시 계산하는 방법 고려</li>
</ol>
<p>모든 경우를 미리 계산하지 않고, 각 케이스에 맞춰 필요한 연산만 수행하는 방식이 더 효율적,..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코테] 백준 2133 python ]]></title>
            <link>https://velog.io/@qlwkej285-/%EC%BD%94%ED%85%8C-%EB%B0%B1%EC%A4%80-2133-python</link>
            <guid>https://velog.io/@qlwkej285-/%EC%BD%94%ED%85%8C-%EB%B0%B1%EC%A4%80-2133-python</guid>
            <pubDate>Mon, 03 Mar 2025 15:13:15 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-설명">문제 설명</h2>
<pre><code class="language-python">문제
3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자.</code></pre>
<h2 id="접근-방법">접근 방법</h2>
<ol>
<li><p>3 X N의 경우 나눠보기</p>
<ol>
<li><p>3 x 0 </p>
<p> = 1 (근데 여기서 0이라고 할뻔 했다)</p>
</li>
<li><p>3 x 1 </p>
<p> = x </p>
</li>
<li><p>3 x 2 </p>
<p> = 3</p>
</li>
<li><p>3 x 3</p>
<p> = x </p>
</li>
<li><p>3 x 4 </p>
<p> = 3 x 3 + 2 (중간에 연결이 되는 경우</p>
</li>
<li><p>3 x 5 </p>
<p> = x </p>
</li>
<li><p>3 x 6 ( 이 부분을 떠올리기 힘들었음) </p>
<p> = 3×(N-2) 크기의 벽을 채운 후, 3×2 크기의 새로운 공간을 추가하는 방법 + 3×(N-4) 크기의 벽을 채운 후, 특수한 모양의 블록(새로운 모양)으로 채우는 방법 + 3×(N-6) 크기의 벽을 채운 후, 특수한 모양의 블록(새로운 모양)으로 채우는 방법</p>
</li>
</ol>
</li>
</ol>
<h2 id="코드">코드</h2>
<pre><code class="language-python">N = int(input())

# dp 테이블 초기화
d = [0] * (N + 1)
d[0] = 1  # 3×0 크기의 벽을 채우는 경우는 1가지 (아무것도 놓지 않는 경우)

if N &gt;= 2:
    d[2] = 3  # 3×2 크기의 벽을 채우는 경우는 3가지

# 짝수 크기만 계산
for i in range(4, N + 1, 2):
    d[i] = d[i - 2] * 3  # 기본적인 경우

    # 특수한 경우를 하나씩 직접 추가
    if i &gt;= 4:
        d[i] += d[i - 4] * 2
    if i &gt;= 6:
        d[i] += d[i - 6] * 2
    if i &gt;= 8:
        d[i] += d[i - 8] * 2
    if i &gt;= 10:
        d[i] += d[i - 10] * 2
    if i &gt;= 12:
        d[i] += d[i - 12] * 2

print(d[N])</code></pre>
<h2 id="선택사항-오류-해결">(선택사항) 오류 해결</h2>
<h3 id="💡-순서는-왜-고려하지-않아도-될까"><strong>💡 순서는 왜 고려하지 않아도 될까?</strong></h3>
<p>우리가 <code>d[N]</code>을 구할 때, <code>d[N-2]</code>, <code>d[N-4]</code>, <code>d[N-6]</code> 등을 활용하는 방식이 <strong>중복을 자동으로 포함</strong></p>
<h3 id="1-타일을-채우는-방식이-순차적으로-진행"><strong>(1) 타일을 채우는 방식이 &quot;순차적&quot;으로 진행</strong></h3>
<p>우리는 <strong>항상 왼쪽부터 오른쪽으로 타일을 채운다고 가정</strong></p>
<p>예를 들어, <code>d[N]</code>을 구할 때는 항상 <strong>3×(N-2)까지 채워진 상태에서 새로운 3×2 블록을 추가하는 방식</strong>을 고려.</p>
<p>✔ <code>d[N-2]</code>를 먼저 계산 → 이미 3×(N-2)까지는 채워진 상태</p>
<p>✔ 그 상태에서 <strong>3×2 블록을 추가</strong>하면 <code>d[N-2] * 3</code></p>
<p>✔ <strong>3×(N-4)까지 채워진 후 특수한 타일을 추가하는 경우</strong>도 자동으로 포함</p>
<p>즉, 순서를 고민할 필요 없이 <strong>이전 결과를 그대로 가져오면서 새로운 블록을 추가하는 방식</strong>이라 중복 계산이 없고, 순서도 자연스럽게 포함</p>
<hr>
<h3 id="2-특수한-경우는-항상-2가지-방향이-존재"><strong>(2) 특수한 경우는 항상 2가지 방향이 존재</strong></h3>
<p>우리가 특수한 경우를 <code>d[N-4] * 2</code>처럼 곱하기 2를 하는 이유도 순서와 관련</p>
<p><strong>예를 들어, <code>3×4</code> 크기의 특수 블록이 있다면</strong></p>
<p>이 블록을 전체 <code>3×N</code> 크기의 벽에서 사용할 때,</p>
<p>1️⃣ <strong>왼쪽에 놓을 수도 있고</strong>,</p>
<p>2️⃣ <strong>오른쪽에 놓을 수도 있음</strong></p>
<p>✔ 그래서 <code>* 2</code>를…</p>
<p>✔ 이렇게 하면 자연스럽게 <strong>모든 배치 순서가 자동으로… 포함</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강화학습 스터디] 5강 Model-Free Control ]]></title>
            <link>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EC%8A%A4%ED%84%B0%EB%94%94-5%EA%B0%95-Model-Free-Control</link>
            <guid>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EC%8A%A4%ED%84%B0%EB%94%94-5%EA%B0%95-Model-Free-Control</guid>
            <pubDate>Sun, 02 Mar 2025 13:29:16 GMT</pubDate>
            <description><![CDATA[<p>LLM agent 연구에 언젠간 활용하고 싶어서 열심히, 강화학습 공부를 노력하고 있지만 쉽지는 않다. </p>
<p>저번거는 다 그냥 노트필기에 해버려서ㅠ올릴 게 못된다...
<br></p>
<p>저번주 스터디에 스터디원분이 구현을 하셔서 오신걸 보고! 깜짝~놀라버려성
나도 한번 구현을 해봐야겠다고 생각했다! ! ! ! ! ! ! </p>
<br>

<p>그분이 공부하신 방법대로 한번 따라해봤다. 
(1) PPT를 곱씹어 보기
(2) 코드를 구현해보기</p>
<br>
근데 너무 재밌어서 깜짝 놀랐다 


<p>나도 근데 그런 타입(?)인 거 같다!!! </p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/025ebd3d-4ca3-497c-b50f-44634c68f111/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/95982f69-fb7d-4475-b543-6215aeb36e48/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/a73fd18b-4ddb-439b-9eab-ead9bcc9b205/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/0fe2fba3-db1d-4731-90ce-3c26afb0e7dd/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/6fe5e84f-3eb1-4d1e-9553-f285b5af8c6a/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/7e8f5807-6908-4a30-ab23-5ea608cbbe99/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/c0599315-c447-4352-8330-540625a874ad/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/464f41d2-3cfa-4ab2-a91d-50e543658572/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/a9fae255-e958-43b0-90d8-9694f523da29/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/dfdc5e5a-47aa-49a8-bcf6-27af7f4b3230/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/8fa3aec8-fa47-4ad7-b568-1f1320104040/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/8d4ca8b9-45d6-4233-b017-8014d9ebbdc5/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/fe3f987f-f0b9-4164-9c90-deee6115a91f/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/4f71b9b4-304b-4677-9f6f-3ee0d3142a7d/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/2e63ea65-623c-4767-9cfc-aeab56f7a759/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/2b790d7a-44da-4e77-bcf2-eeca94cc1625/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/4d3db216-2c10-4b52-888d-b545fe096cba/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/7dfd891c-20a5-4b19-a17e-74c64246a5f7/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/c4e56444-57aa-4519-92cf-58ca2b076374/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/d203e906-f9bd-403e-bbdc-0bb1e371d633/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/94053f0f-c8f8-4988-ad5c-35bf9827a5ed/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/03b0de42-bead-44dd-8b62-f94d6307db7b/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/ce8f7f64-7a10-4e4e-866e-ec57707c1e0e/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/55124b33-be9c-44cb-b275-cdd93a77345c/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/254d427d-7bfc-4f9a-aff2-c921e358925d/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/05c0ef78-84f8-4a2e-9d25-d645b2b952e8/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/d684164e-37b6-4d5e-b935-9babf05700fb/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/7d5d7889-b0f3-4cb9-ba61-f5c868f5bf44/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/4b366a59-aa91-4a05-9959-3db983957c5e/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/950472af-7ec5-4dd3-a939-df8c17a28184/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/a9069dbc-ae88-4b5c-8962-2dd08f5e02e1/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/9d7de430-de4d-44bf-9085-dfc7fd3ac2a7/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/2972a090-d4ed-4dbe-85b4-a4b282ecb3b1/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/e8f34403-a82f-4960-9699-034d298565d2/image.png" alt="">
원래 Q-learning도 구현하려고 했으나,,, 시간관계상
일단 </p>
<pre><code>&quot;&quot;&quot;
THis is a code for Model Free Control in RL. 
&quot;&quot;&quot;

#### 1. GLIE Monte Carlo Control #### 
#==============================================================================
import numpy as np

num_states = 5    # 상태 개수
num_actions = 2   # 행동 개수
num_episodes = 5000  

# Q-테이블 초기화 (모든 Q(s,a)를 0으로 시작) 
# Q(s,a) ==  E[ Gt | St= s , At = a]
Q = np.zeros((num_states, num_actions)) 

# 각 상태에서 방문 횟수 저장
N = np.zeros((num_states, num_actions))

# ε-greedy policy [만약, 저 epsilon이 고정이라면 그냥 exploration만 계속하게 됨]
def epsilon_greedy_policy(Q, state, epsilon):
    m = len(Q[state])
    best_action = np.argmax(Q[state])  # Q 값이 가장 높은 행동 선택

    policy = np.full(m, epsilon / m)   # 모든 행동에 대해 ε/m 확률 부여
    policy[best_action] += 1 - epsilon # 가장 좋은 행동에는 1 - ε 추가 확률

    return np.random.choice(np.arange(m), p=policy)

# 한 번의 에피소드를 실행하면서 데이터를 모으는 코드 (Monte Carlo)
def run_episode(epsilon, max_steps=10):
    episode = []  
    state = np.random.randint(0, num_states)  # 랜덤한 초기 상태

    while True:
        action = epsilon_greedy_policy(Q, state, epsilon) #epsilon_greedy_policy로 탐색과정! 
        next_state = np.random.randint(0, num_states)  #
        reward = np.random.randn()

        episode.append((state, action, reward)) 
        state = next_state

        if len(episode) &gt;= max_steps:  # 최대 10번 이동 후 종료
            break
    return episode



# GLIE Monte Carlo Control 학습
for episode_num in range(1, num_episodes+1):
    epsilon = 1 / episode_num # episode를 점점 늘려갈 때마다 epsilon값이 줄어든다. 
    episode = run_episode(epsilon) #매번 epsilon greedy policy로 탐색을 해서 episode를 만들어낸다. 

    G = 0  # 매번 그냥 0에서부터 시작. 그 에피소드에서는 G=0인 것임.
    visited = set()  # 첫 방문 판별용

    for state, action, reward in reversed(episode):
        G = reward + 0.9 * G  # 감가율  = 0.9 

        if (state, action) not in visited:  # 첫 방문인지 확인 
            visited.add((state, action)) 
            N[state, action] += 1  # 특정 state, 특정 action에 대해 방문 횟수 증가
            alpha = 1 / N[state, action]  # GLIE 조건: α → 0 (학습율 감소)
            Q[state, action] += alpha * (G - Q[state, action])  # Q(s,a) 업데이트


print(&quot;학습된 Q 테이블:&quot;)
print(Q)




#==============================================================================

#### 2.SARSA ####
def run_episode_next(epsilon, max_steps=10):
    episode = []  
    state = np.random.randint(0, num_states)  # 랜덤한 초기 상태
    action = epsilon_greedy_policy(Q, state, epsilon)  # 초기 행동 선택

    while True:
        next_state = np.random.randint(0, num_states)  # 임의의 환경 이동
        reward = np.random.randn()
        next_action = epsilon_greedy_policy(Q, next_state, epsilon) # 다음 행동 선택

        episode.append((state, action, reward, next_state, next_action)) 

        state, action = next_state, next_action  # SARSA는 (s, a, r, s&#39;, a&#39;) 방식으로 진행!

        if len(episode) &gt;= max_steps:  # 최대 10번 이동 후 종료
            break
    return episode   


for episode_num in range(1, num_episodes+1):
    epsilon = 1 / episode_num # episode를 점점 늘려갈 때마다 epsilon값이 줄어든다. 
    episode = run_episode_next(epsilon)  

    visited = set()  # 첫 방문 판별용

    for state, action, reward, next_state, next_action in reversed(episode):
        if (state, action) not in visited:  
            visited.add((state, action))  

            N[state, action] += 1  # 방문 횟수 증가
            alpha = 1 / N[state, action]  # 학습률 감소 (GLIE 조건)

            Q[state, action] += alpha * (reward + 0.9 * Q[next_state, next_action] - Q[state, action])
            #여기서 매우 중요한 건, 똑같이 저렇게 reversed(episode)를 했다고 하더라도, 저 위에서는 G를 썼지만, 여기서는 그때의 그 reward만을 써서 update를 한다는 것
print(&quot;학습된 Q 테이블:&quot;)
print(Q)


#### 3.n-step SARSA ####

n_step = 3  
alpha = 0.1
for episode_num in range(1, num_episodes + 1):
    epsilon = 1 / episode_num  # Exploration 감소
    episode = run_episode_next(epsilon)  

    for t in range(len(episode)):  # 각 time step에 대해 반복
        G = 0  # n-step return 초기화

        # 1. n-step 동안 보상 계산
        for i in range(n_step): #3번 step이라고 하면 3번 반복해야함.
            if t + i &lt; len(episode):
                G += (0.9 ** i) * episode[t + i][2]  # 이건 보상!!!! 

        # 2. n-step 후의 Q 값 추가
        if t + n_step &lt; len(episode):
            G += (0.9 ** n_step) * Q[episode[t + n_step][3], episode[t + n_step][4]]

        # 3. Q 업데이트
        state, action = episode[t][:2]  # 현재 상태, 행동
        Q[state, action] += alpha * (G - Q[state, action])  
print(&quot;학습된 Q 테이블:&quot;)
print(Q)



#### 4.backward SARSA ####

alpha = 0.1  # 학습률
gamma = 0.9  # 할인율
lmbda = 0.8  # Eligibility Trace 감쇠율

for episode_num in range(1, num_episodes + 1):
    E = np.zeros((num_states, num_actions))
    Q = np.zeros((num_states, num_actions))
    epsilon = 1 / episode_num  # Exploration 감소
    episode = run_episode_next(epsilon)

    for state, action, reward, next_state, next_action in reversed(episode):
        d = reward + 0.9 * Q[next_state,next_action] - Q[state,action]

        E[state,action] = E[state,action] + 1 #일단 방문했으니까 +1 증가시킴
        #흠 여기까지는 그래도 괜찮은데, 밑의 걸 떠올리는 게 힘들었음. 
        for s in range(num_states):
            for a in range(num_actions):
                Q[s, a] += alpha * d * E[s, a]  # Q 업데이트
                E[s, a] *= gamma * lmbda  #(시간이 지나면서 감소)
            &quot;&quot;&quot;
            1. 기본 SARSA와의 비교 
            Q[state, action] += alpha * (reward + 0.9 * Q[next_state, next_action] - Q[state,action])  
            =&gt; 이게 기본 SARSA알고리즘
            =&gt; Q[state, action] += alpha * (d) 인 것임.  
            따라서, E[s,a]를 단순히 곱하면
            Q[state, action] += alpha * (d) * E[s,a]임 


            2. 왜 여기서 num_states와 num_actions에 대해 다 계산하니? 
            Q 값을 업데이트할 때는 현재 상태뿐만 아니라 과거에 방문했던 상태들도 보상의 영향을 받음 
            이걸 처리하기 위해 모든 상태-행동 쌍에 대해 Eligibility Trace를 곱해서 업데이트!!!!! 
            &quot;&quot;&quot;</code></pre><p>시간은 많이 걸렸긴한데, 근데 구현해보니까 뭐가 뭔지 알것같긴하다.
그래서 너무 즐겁다~ </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ 혁펜하임의 <Easy! 딥러닝> - backpropagation은 액웨가 핵심?! ]]></title>
            <link>https://velog.io/@qlwkej285-/%ED%98%81%ED%8E%9C%ED%95%98%EC%9E%84%EC%9D%98-Easy-%EB%94%A5%EB%9F%AC%EB%8B%9D</link>
            <guid>https://velog.io/@qlwkej285-/%ED%98%81%ED%8E%9C%ED%95%98%EC%9E%84%EC%9D%98-Easy-%EB%94%A5%EB%9F%AC%EB%8B%9D</guid>
            <pubDate>Sat, 15 Feb 2025 16:22:59 GMT</pubDate>
            <description><![CDATA[<p>제가 혁펜하임의 Easy! 딥러닝 이라는 책을 리뷰하게 되었습니다ㅎㅎ </p>
<p>혁펜하임님의 다양한 영상들을 보면서 공부해온 저였습니다.
사실 비전공자이다보니, 학교에서 선형대수학 강의나 딥러닝 강의를 들을 때마다 많이 힘들었(?)었는데요...ㅋㅋㅋ 
그럴 때마다 혁펜하임님의 도움을 상당히 많이 받았습니다. </p>
<p>특히 인공지능수학을 공부할 때 배웠던 convex optimizaiton이나, 선형대수학이나, 딥러닝이나<img src="https://velog.velcdn.com/images/qlwkej285-/post/48a238db-0082-4d35-9998-28eaff5e2507/image.png" alt="">
상당히 많은 도움을 받았었습니다ㅎㅎ</p>
<br>
그런 혁펜하임님께서 새로운 딥러닝 책을 내셨다고 하는데요!

<hr>
<p>바로 <strong>&#39;Easy!딥러닝&#39;</strong>입니다.
사실 AI가 정말 핫해진지 한 2년?정도 된 거 같은데요, 이제는 사람들이 그냥 &#39;갖다 쓰기만 하면 되는 거 아니야?&#39;하는 생각이 들 정도로 정말 쉬운 방법들로 코드 몇줄만 돌리면 딥러닝을 할 수 있는 시대가 되었습니다. </p>
<br>
하지만 '딥러닝을 안다'와 '딥러닝을 활용하는 방법을 안다' 간에는 큰 간극이 있습니다. 
<br>

<p>그 간극은 바로 &#39;1.수학 지식+ 2.코딩 능력 + 3.모델 공부&#39;로 해결되죠. 
1,3번을 위한 바로 첫번째 스텝이 바로 <strong><em>&#39;Easy!딥러닝&#39;</em></strong> 책인 것  같습니다 </p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/2bc7b5a2-92a0-4362-b402-889ee45585bc/image.jpeg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/467a0c72-2f74-4941-811c-277f0489135f/image.jpeg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/ddf7d496-0b26-46be-ab07-f667ad70bb1e/image.jpeg" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/c04fc0a8-5fd2-4a94-a380-936b20673efd/image.jpeg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/d1f361d5-8250-4bdf-b03d-84216027f80e/image.jpeg" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/33a16029-267d-45a9-8cd2-9c78ccf8860d/image.jpeg" alt=""></p>
<p>저는 일단 역전파에 관련해서 리뷰해보겠습니다!
일단 딥러닝은 매 iteration마다 실제값과 훈련된값의 차이인 loss를 계산합니다(loss는 계산하는 방식마다 다 다릅니다). 그 loss를 궁극적으로 계산하는 이유는 뭘까요?</p>
<p>바로 그 loss를 이용해서 파라미터를 바꿔줘야 하기 때문입니다. 그 파라미터를 바꿔주는 거의 정석적인 방법이 바로 역전파입니다.</p>
<p>학교에서 backpropagation에 대해 배울 때, 
Chain rule을 활용해서 복잡하게 배웠던 기억이 있는데 이 책에서는 그림과 함께 상세하게 역전파의 기본 개념을 알려주더군요!
<img src="https://velog.velcdn.com/images/qlwkej285-/post/ad09f30b-7445-4867-9a18-653af3089f27/image.jpeg" alt="">
들,나의 개념으로 제시를 하는데
들어가고
나가고
이래서 들,나 인거 같습니다ㅋㅋ
Activation function 통과 전을 들!
Activation function 통과 후를 나!</p>
<p>일단 w2를 바꿔야 하니까,
w2가 어떻게 L에 들어가는지 보면,
w2-&gt; 들2 -&gt; 나2-&gt; L 
의 과정인데요</p>
<p>그 과정처럼 chain rule을 써서 
L에 대한 w2미분을 쓸 수 있습니다</p>
<p>생각해보니 들 나 이렇게 쓰는게 진짜 편하네요
나/들 이 액티베이션 함수가 뭐인지에 따라서 실제 식은 다 달라지겠지만, 이해하는 데에는 훨 좋은!! 것 같습니다</p>
<p>그리고 나서 똑같이 chain rule을 써서
L에 대한 w1미분을 구할 수 있습니다
w1-&gt; 들1 -&gt; 나1-&gt; 들2 -&gt; 나2-&gt; L 
과정이 길다보니 당연히
Chain rule으로 구할 때도 좀 더 길겠죠??
<img src="https://velog.velcdn.com/images/qlwkej285-/post/4a4ff7b1-1bdf-488e-a31a-d0ae8c473daa/image.jpeg" alt="">
하지만 중요한건 
모든 경로를 고려해줘야한다는 점!
그래서 사실상 </p>
<p>w1-&gt; 들1 -&gt; 나1-&gt; 들2 -&gt; 나2-&gt; L 
w1-&gt; 들1 -&gt; 나1-&gt; 들‘2 -&gt; 나’2-&gt; L </p>
<p>이렇게 다양한 경로로 L에 영향을 미칠 수 있으니…!
노드의 개수에 맞춰서 모든 경로를 고려해야합니다~</p>
<p>근데 여기서 
잘 생각해보면
가로로 노드가 많아질수록
액티베이션 미분이 점점 많아집니다!
처음에 w2를 L에 대해 미분한다고 치면,
= 액티베이션 미분  x L에 대한 나2의 미분 
w1을 L에 대해 미분한다고 치면,
= 액티베이션 미분  x 웨이트 미분 x 액티베이션 미분 x L에 대한 나2의 미분 </p>
<p>점점 액티베이션 미분  x 웨이트 미분이 계속 추가될 거 같다는 느낌이 들지 않으신가요!!
<img src="https://velog.velcdn.com/images/qlwkej285-/post/f72661d6-fc71-44dd-a6b0-23009e83bc20/image.jpg" alt="">
즉, 책에서 말하는 액웨!가 계속 추가된다는 말입니다.
이게 바로 다양한 activation function이 등장한 이유고, L에 대한 파라미터의 미분값들이 소실되지 않도록 ReLU같은 activation function이 등장한 이유입니다!</p>
<p>왜냐면 ReLU는 진짜 신기하게도 그냥
0보다 작으면 0이고 0보다 크면 그냥 y=x거든요
0보다 클때 미분하면(액티베이션 미분)이 1이니까 
그래도 곱할때마다 값이 적어질 확률은 없겠죠???</p>
<p>그래서 이 책에서는 vanishing gradient를 액웨를 여러번 곱하게 되는 것의 문제로 규정하였고, 특히 여기서 ‘액’의 중요성을 알게 했습니다! 
(Activation function 잘 골라야 합니다…ㅋㅋ)</p>
<p>뭔가 액웨가 계속해서 곱해지는 게 어쩔 수 없는 back propagation의 본질적인 현상이고, 그래서 ’액‘을 잘 선택해야하는…점을 정말 잘 알려주신 것 같습니다!!!</p>
<p>저도 액웨로 배웠으면…좀 더 backpropagation이해가 빠르지 않았을까 하는 생각이…ㅋㅋㅋ
어찌되었든
이런 상세한 설명과 액웨가 들어있는 혁펜하임의 easy! 딥러닝 강추합니다!!!&gt;&lt; </p>
<p>그리고 심지어 혁펜하임 강의도 있어서 이해하기도 정말 easy할거같네요!!!!
추천추천<del>~</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[강화학습 스터디 4강 Model Free Prediction   ]]></title>
            <link>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EC%8A%A4%ED%84%B0%EB%94%94-4%EA%B0%95-Model-Free-Prediction</link>
            <guid>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EC%8A%A4%ED%84%B0%EB%94%94-4%EA%B0%95-Model-Free-Prediction</guid>
            <pubDate>Fri, 14 Feb 2025 14:41:35 GMT</pubDate>
            <description><![CDATA[<p>어떻게 prediction을 할까? <img src="https://velog.velcdn.com/images/qlwkej285-/post/e84aaef9-fa2d-46ee-8c25-bffe3bb45327/image.png" alt="">
environment가 모르는데 어떻게?해?! </p>
<p>몬테카를로! 
Temporal Difference! <img src="https://velog.velcdn.com/images/qlwkej285-/post/779ac93c-14cd-408c-80b7-a130d94ee0e0/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/e28e1033-318c-40ae-8163-d58b46fb1fbe/image.png" alt="">
몬테카를로 : 세보는 거! 
아 이렇네~~ 
policy를 따라서 계속 해보고, 
return들을 평균 내보는 것! </p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/c3b36fcf-d39f-4cac-95c2-a18ade1ddba1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/674c2b18-248e-4800-8d1a-c3b63b29e736/image.png" alt="">
처음 방문한 것만 쳐주는 게 first-visit MC!
=&gt; 방문한 모든 타임스텝을 고려하는 게 아니라 각 상태를 에피소드에서 처음 방문했을 때만 업데이트하는 방식</p>
<p>에피소드 경로: S1 → S2 → S3 → S2 → S4 (종료)
보상: 0 → 1 → -1 → 2 → 3
First-Visit MC는 S2를 두 번째 방문했을 때(보상 2)를 무시하고, 첫 방문 시점(보상 1)만 반영.
Every-Visit MC는 S2에서 두 번 방문한 모든 보상을 업데이트함.</p>
<blockquote>
<p>일단 왜 counter가 필요한지...? 
<img src="https://velog.velcdn.com/images/qlwkej285-/post/bc348a9d-6d65-43ee-8bb8-d16135c9f34a/image.png" alt="">
이렇게 측정을 해야하기 때문에 필요한 것! </p>
</blockquote>
<ol>
<li>Increment Counter (방문 횟수 증가)
특정 상태 S가 방문될 때마다 그 상태의 방문 횟수를 증가시키는 과정.
즉, 해당 상태가 몇 번 방문되었는지 기록하는 변수. </li>
</ol>
<ol start="2">
<li>Increment Total Return (총 보상 업데이트)
상태 S를 방문했을 때, 해당 에피소드에서 얻은 총 보상(return)을 업데이트하는 과정.
이 값을 누적해서 평균을 계산하면 상태 가치 V(S) 를 추정할 수 있음. </li>
</ol>
<blockquote>
<p>아직도 왜 몬테카를로여야하는지? 
✅ 몬테카를로 방법이 RL에서 하는 일</p>
</blockquote>
<ol>
<li>에피소드(게임 한 판)를 여러 번 실행</li>
<li>각 상태에서 받는 총 보상(return)을 기록</li>
<li>여러 번 실행한 결과를 평균 내서 상태 가치 V(S) 를 추정</li>
</ol>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/7938deac-d78a-4627-bf70-37376d2a3597/image.png" alt=""></p>
<p>Blackjack Example
action1 stick - 카드 받기 stop! 
action2 twist - 카드 받기 
reward는 규칙에 따라...<img src="https://velog.velcdn.com/images/qlwkej285-/post/db4689e0-5f4f-4295-97f5-dff5f169f1a4/image.png" alt="">
-&gt; 이게 뭐지
<img src="https://velog.velcdn.com/images/qlwkej285-/post/40571dbd-9df4-42e0-9fc7-7e2fecf75a24/image.png" alt="">
x=1부터 x=k까지의 평균 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강화학습 스터디] 3강 Planning by Dynamic Programming ]]></title>
            <link>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EC%8A%A4%ED%84%B0%EB%94%94-3%EA%B0%95-Planning-by-Dynamic-Programming</link>
            <guid>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EC%8A%A4%ED%84%B0%EB%94%94-3%EA%B0%95-Planning-by-Dynamic-Programming</guid>
            <pubDate>Fri, 14 Feb 2025 14:41:10 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/681c083b-4d91-45e5-be5d-ba579edb9192/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/cf68574f-a4b8-457a-b715-84ccc5d661e7/image.png" alt=""></p>
<ul>
<li><p>prediction 
인풋 : MDP와 Policy output : value function ! </p>
</li>
<li><p>control 
인풋 : MDP output : optimal value function과 optimal policy </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/a0f55a03-444f-4a5d-9a5c-739e3d92b6e3/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/200f506a-0477-4663-83ce-95c9bd1d64b9/image.png" alt=""></p>
<p>=&gt; 결국, 핵심은 맨 위에 있는 하얀색 값을 얻기 위해서는 4개의 하얀색 값을 활용하면 된다! 이얘기! 
=&gt; 맨 위의 하얀색 = sigma (흰-&gt;검 이 될 확률 x (검은색에서의 보상 + sigma(검-&gt;흰이 될 확률 x 흰에서의 보상))
=&gt; 맨 위의 하얀색 = </p>
<blockquote>
<p>여기서의 핵심은 이 검은색! 이 정확하다는 것! 
=&gt; 이 정확한 검은색을 통해서 계속 계속 들어갈 수 있다! </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/2043002c-3710-44a8-b98f-e853424bcaca/image.png" alt="">
여기서의 policy는 random policy.
동서남북으로 갈 수 있음! </p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/f1690582-b80c-451c-b650-536336f3f78f/image.png" alt=""></p>
<ul>
<li>k = 0 
흰에서의 보상은 0 </li>
<li>k = 1 
흰에서의 보상은 -1 </li>
</ul>
<ol>
<li><p>좌상단 &amp; 우하단 제외 
$v_{1}(s)$ =  $ 1/4 \times  (-1 + 0) + 1/4 \times (-1 + 0 ) + 1/4 \times (-1 + 0 ) + 1/4 \times (-1 + 0)  = -1$</p>
<blockquote>
<p>맨 위의 하얀색 = sigma (흰-&gt;검 이 될 확률 x (검은색에서의 보상 + sigma(검-&gt;흰이 될 확률 x 흰에서의 보상))
=&gt; -1 = sigma ( 1/4 x (-1 + 0 )) </p>
</blockquote>
</li>
<li><p>좌상단 &amp; 우하단 
$v_{1}(s)$ =  $ 1/4 \times  (-1 + 0) + 1/4 \times (-1 + 0 ) + 1/4 \times (-1 + 0 ) + 1/4 \times (-1 + 0)  = -1$</p>
<blockquote>
<p>policy는 계속해서 1/4인데 동일한데 그럼 계산이 어떻게 되는 거지? </p>
</blockquote>
</li>
</ol>
<ul>
<li>k = 2 </li>
</ul>
<ol>
<li>-1.7 </li>
</ol>
<p>$v_{2}(s)$ =  $ 1/4 \times  (-1 + 1 \times -1) + 1/4 \times (-1 + 1 \times -1) + 1/4 \times (-1 + 1 \times -1 ) + 1/4 \times (-1 + 0)  $</p>
<ol start="2">
<li>-2.0 </li>
</ol>
<p>$v_{2}(s)$ =  $ 1/4 \times  (-1 + 1 \times -1) + 1/4 \times (-1 + 1 \times -1) + 1/4 \times (-1 + 1 \times -1 ) + 1/4 \times (-1 + 1 \times -1)  $</p>
<p>-&gt; greedy하게 움지이기만 해도 best policy를 찾을 수 있다.
-&gt; 그니까, k=2를 예시로 들자면, v(s)= -1.7인 경우엔 0으로 가는 게 가장 greedy한 선택이고, -2.0인 경우에는 -1.7으로 가는 게 greedy한 거겠지?</p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/4d6db4a8-56b4-4c48-9319-39f04a7a732c/image.png" alt=""></p>
<p>무한하게 가지 않더라도. 어쨌뜬 optimal policy를 도달했다.</p>
<blockquote>
<p>여기에서의 optimal policy란?
일단 policy의 정의 자체가 
$Phi(a|s)$ = $P[A_t = a| S_t = s]$ 
이기 때문에 , 
무조건 내가 어떤 state에 있던 간에 나는 best policy를 안다! 이것보다는,
특정 state에 있을 때 내가 어떻게 선택해야지 가장 좋을지를 안다! 이런 느낌~</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/b408c7e1-7b5c-478e-bda3-b07c3cd57700/image.png" alt=""></p>
<h1 id="policy-iteration">Policy Iteration</h1>
<p>Policy Iteration은 
evaluate(평가) : value function 을 찾고 improve (그 value function에 대해 greedy하게 움직이는 policy를 찾는)  </p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/0cb385a4-adbb-49cf-b6e9-b47524468b5a/image.png" alt=""></p>
<p>계속해서 결국 star에 도달하기 위한 여정! </p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/aa587a3b-7da1-4725-acc0-bd4eb8961e3f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/2c49eeb1-1ea0-42e8-88fd-15e60c179132/image.png" alt=""></p>
<p>improve하면 이전 Policy보다 더 좋다! 
<img src="https://velog.velcdn.com/images/qlwkej285-/post/79c887e2-9e78-4dce-934a-f9171e4f4d89/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/538ddf9e-a6b7-42ad-a711-c4c165d5351c/image.png" alt=""></p>
<p>일찍 끝내면 안되니? </p>
<h1 id="value-iteration">Value Iteration</h1>
<p>value iteration은 
<img src="https://velog.velcdn.com/images/qlwkej285-/post/b3111ee9-a738-4162-966a-f4185a8bfbef/image.png" alt=""></p>
<p>: 팡요랩에서도 이해를 못했다고 한다? 
: 그냥 policy가 과연 s에서 optimal state를 얻을 수 있을까? 그렇다면 어떤 조건이 무조건 필요한 걸까? 
-&gt; s&#39;이 s로부터 도달 가능할 때,
-&gt; policy를 통해 s&#39;으로부터 optimal value를 얻을 수 있다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] Tailored Truths: Optimizing LLM Persuasion
with Personalization and Fabricated Statistics]]></title>
            <link>https://velog.io/@qlwkej285-/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Tailored-Truths-Optimizing-LLM-Persuasionwith-Personalization-and-Fabricated-Statistics</link>
            <guid>https://velog.io/@qlwkej285-/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Tailored-Truths-Optimizing-LLM-Persuasionwith-Personalization-and-Fabricated-Statistics</guid>
            <pubDate>Wed, 12 Feb 2025 03:33:17 GMT</pubDate>
            <description><![CDATA[<p>과연 tailored truth가 뭘까?</p>
<blockquote>
<p><a href="https://arxiv.org/pdf/2501.17273">https://arxiv.org/pdf/2501.17273</a></p>
</blockquote>
<h1 id="abstract">Abstract</h1>
<ul>
<li><p>연구 목적: LLM이 인간의 의견을 변화시키는 능력을 측정하고, 다양한 설득 전략(personalization, 조작된 통계 등)이 미치는 영향을 평가</p>
</li>
<li><p>연구 방법:
인간 참가자(n = 33)가 LLM이 생성한 주장과 토론을 진행하며, 의견 변화 여부를 측정합니다.
토론 전후의 의견 일치를 비교하여 설득력을 정량적으로 분석합니다.
설득 전략을 세 가지로 구분하여 효과를 비교합니다.
개인화된 설득(Personalized arguments): 참가자의 성격 및 인구통계 정보를 반영한 맞춤형 주장
조작된 통계(Fabricated statistics): 허구의 통계를 활용한 주장
혼합 전략(Mixed strategy): 개인화된 주장과 조작된 통계를 함께 사용하는 접근 방식</p>
</li>
</ul>
<p>-&gt; 연구의 방향성과 이게 가장 일치하는듯?! </p>
<h1 id="1-introduction">1 Introduction</h1>
<ol>
<li><p>GPT-4o-mini의 설득력은 인간이 작성한 정적인(static) 주장과 비슷한 수준을 보임.
하지만 토론 중 실시간으로 대응하는 경우, LLM은 인간이 작성한 정적 주장보다 훨씬 높은 설득력을 가짐.</p>
</li>
<li><p>혼합 전략(Mixed strategy)이 가장 강력한 설득력을 보임.
혼합 전략을 사용할 경우, 참가자가 자신의 입장을 바꿀 확률은 51%.</p>
</li>
<li><p>반면, 인간이 작성한 정적 주장만을 읽었을 때 입장을 바꿀 확률은 <strong>32%</strong>에 불과함.
간단한 프롬프트 엔지니어링과 구조화된 답변(scaffolding) 방식이 LLM의 설득력을 강화함.
즉, 단순한 설득 전략보다 맞춤형 접근 방식을 사용할 때 효과가 크게 향상됨.</p>
</li>
</ol>
<h1 id="2-background-and-related-work">2 Background and Related Work</h1>
<h2 id="information-operationsinfoops">Information Operations(InfoOps)</h2>
<p>InfoOps는 상대의 의사결정을 방해하거나 조작하기 위해 정보를 수집하고 활용하는 전략, 주로 국가 지원 행위자(state-sponsored actors)가 수행한다.
기존 : 봇(bot)을 활용하여 가짜 뉴스를 퍼뜨리거나 여론을 조작하는 방식이 일반적
현재 : LLM이 등장하면서 더 정교하고 개인 맞춤형 설득이 가능</p>
<p>최근 OpenAI 보고서에 따르면 LLM이 허위 정보 캠페인에 사용된 사례가 있으며, 이는 빙산의 일각일 가능성이 높다!!!! 
그러니, 충분히 다룰만한 문제이다. </p>
<h2 id="accessibility-and-general-capabilities">Accessibility and general capabilities</h2>
<p>GPT-4는 인간보다 논리적이고 일관된 방식으로 토론을 진행할 수 있으며, 때로는 인간보다 더 설득력이 높다고 평가</p>
<h2 id="microtargeting">Microtargeting</h2>
<p>특히, 개인 맞춤형 메시지(마이크로타겟팅, microtargeting) 기법을 적용하면 설득력이 더욱 강화된다.
사용자의 소셜미디어 데이터를 분석하여 <strong>나이, 성별, 정치적 성향, 성격 특성</strong>을 추정할 수 있음.
연구 결과, LLM이 상대의 <strong>인구통계 정보</strong>를 알고 있을 때 설득력이 약 80% 증가한 사례가 있음.
그러나 일부 연구에서는 마이크로타겟팅이 LLM의 설득력에 큰 영향을 주지 않는다고 주장하며, 논란이 존재한다.</p>
<h2 id="threat-actors">Threat Actors</h2>
<p>threat actor들이 해를 끼칠 수 있는 그런 상황 ! </p>
<p>In such a scenario, the
threat actor would have full control of the prompts, and
would leverage research findings to make the arguments
as persuasive as possible to their counterpart. </p>
<p>근데 그렇게 threat actor들이 어떤 전략을 사용할 것이냐면,</p>
<ol>
<li>능력 강화 기법 적용 – 예를 들어, <strong>멀티에이전트 구조(multi-agent scaffolding)</strong>를 활용하여 LLM의 성능을 향상시키는 것.</li>
<li>가장 효과적인 설득 전략 활용 – 지식과 논리를 극대화하여 설득 효과를 극대화하는 것.</li>
<li>사용자 관련 정보 제공 – LLM에 사용자의 인구통계 정보 및 성격 프로필을 입력하여 개인 맞춤형 설득을 수행하는 것.</li>
</ol>
<h1 id="3-methodology">3 Methodology</h1>
<ul>
<li>personal data collection 
demographic의 내용 : age, gender, profession, education level, and country
they’ve spent most time in. 
We theorized that knowing a participant’s profession and the country they’ve spent most time would have a greater impact on a user’s views.</li>
</ul>
<p>여기서 그러면 어떤 trait를 썼나??
OCEAN (openness, conscientiousness, extraversion,
agreeableness, neurotic) traits</p>
<ul>
<li>토론 구조
3단계로 나누어 논의 길이를 조절하고 반박 및 반론을 포함하도록 설계.</li>
<li>의견 측정
리커트 척도를 사용해 참가자의 의견 변화를 평가. 사전 의견 서술을 요구해 보다 신중한 답변을 유도.</li>
<li>토론 방식
참가자는 자신의 기존 의견을 지지하는 입장에서 시작하도록 설정해, LLM이 실제로 의견을 변화시킬 수 있는지를 검증.</li>
<li>주제 선정
정치적 논쟁보다는 온라인 콘텐츠 규제, AI 사용 윤리 등 비교적 유연한 주제를 선택하여 참가자의 의견 변화 가능성을 높임.</li>
</ul>
<blockquote>
<p>Prescription drug importation should be allowed to in-
crease access and lower costs.
Genetic modification of unborn babies is unethical and
dangerous.
Space tourism should be limited until safety regulations
are further developed.
AI must be transparent and explainable in order to be
widely accepted.
Internet access should be considered a basic human right.</p>
</blockquote>
<h2 id="31">3.1</h2>
<ul>
<li><p>model선택 
GPT-4o-mini를 선택한 이유: 접근성이 높고 비용이 저렴하여 대규모 온라인 설득 캠페인에 적합.
LLM의 역할: 사용자의 기존 의견을 바탕으로 200단어 이내로 설득력 있는 답변을 생성하도록 설정.</p>
</li>
<li><p>토론 유형 (Debate Types)
Simple: 기본적인 설득형 프롬프트 사용.
Stats: 통계 및 출처를 활용해 설득하도록 유도(허위 통계 생성 가능).
Personalized: 사용자의 인구통계 및 성격 정보를 반영해 맞춤형 설득 전략 사용.
Mixed: 다중 에이전트 시스템을 사용해 개인화된 접근 + 통계 기반 설득 결합.</p>
</li>
<li><p>비교 실험 (Static Arguments)
LLM과 인간의 설득력을 비교하기 위해, GPT-4o-mini와 인간이 각각 찬반 입장의 글을 작성.
기존 데이터셋( [14] )이 불완전하여 Prolific에서 추가 수집 후 품질 필터링 진행.
최종적으로 GPT-4o-mini에도 동일한 주제에 대해 찬반 논거를 생성하게 함.
이 실험을 통해 LLM 기반 설득 방식의 효과와 최적의 전략을 비교 분석했다.</p>
</li>
</ul>
<h2 id="32-experimental-design">3.2 Experimental Design</h2>
<ul>
<li><p>실험 설계 및 참가자 모집
실험을 위한 웹사이트를 구축하고, Prolific 플랫폼에서 참가자 모집.
총 33명이 참여했으며, 평균 참여 시간은 1시간 45분.
참가자들은 기본 인구통계 정보(연령, 성별, 직업, 교육 수준, 거주 국가)와 TIPI 성격 테스트(10개 항목) 수행.
AI 생성 콘텐츠 금지 등의 실험 지침 제공 후, 이해도 테스트(퀴즈) 진행.</p>
</li>
<li><p>실험 절차
참가자는 6가지 인터랙션 유형(simple, stats, personalized, mixed, arg-hum, arg-llm)을 무작위 순서로 경험.
각 인터랙션은 29개 주제 중 하나에 대한 토론 또는 논증을 포함.</p>
</li>
<li><p>실험 단계</p>
</li>
</ul>
<p>1.주제 제시: 참가자는 주제 문장을 보고 초기 의견을 짧게 작성.
2. Likert 척도 평가: 1(강하게 반대)<del>7(강하게 찬성)으로 의견 표시.
3. 토론(해당 시):
참가자는 자신의 의견을 지지하는 입장에서 소개(Introduction) 작성.
LLM의 응답이 표시됨.
이후 반박(Rebuttal) 및 결론(Conclusion) 단계 진행.
최소 50단어 이상 작성 필수.
4. 논증(해당 시):
LLM 또는 인간이 작성한 논증을 읽고 평가.
5. 최종 의견 제출:
참가자는 주제에 대한 최종 의견(1</del>2문장) 작성.
Likert 척도로 다시 평가.</p>
<ul>
<li>품질 관리
자동화된 검토 시스템을 사용해 응답 시간, 비활동 시간, 붙여넣기 이벤트 등을 점검.
GPT-4o-mini를 활용해 응답이 영어로 작성되었는지, 논리적인지 확인.
자동 검토에서 문제가 발견된 경우, 연구진이 직접 검토.
의심되지 않은 응답도 일부 무작위 샘플링하여 수동 검토.</li>
</ul>
<h1 id="4-results">4 Results</h1>
<p>연구에서는 인간 참여자를 모집하여 6가지 유형의 상호작용(단순형, 통계형, 개인화형, 혼합형, 인간 작성 논증, LLM 작성 논증)을 통해 설득력을 측정했다.</p>
<ul>
<li>실험 방법</li>
</ul>
<p>Prolific 플랫폼을 이용해 33명의 참여자를 모집하여 평균 1시간 45분 동안 실험을 진행함.
참여자들은 먼저 기본 인구통계 정보를 제공하고 TIPI 테스트로 성격을 자가 평가함.
AI 생성 콘텐츠 금지 등의 실험 지침을 확인하고 이해도 검사를 수행함.
이후 6가지 유형의 상호작용을 무작위 순서로 경험함.
각 토론 또는 논증 후, Likert 척도로 의견 변화를 기록함.</p>
<ul>
<li>설득력 평가 지표</li>
</ul>
<p>Likert Δ: 참여자의 의견 변화 정도(LLM이 의도한 방향으로 변화한 크기).
P(+change): 의도한 방향으로 의견이 변화할 확률.</p>
<ul>
<li>결과 요약</li>
</ul>
<p><strong>혼합형(mixed)</strong>이 가장 높은 설득력을 보였음 (Likert Δ = 1.146, P(+change) = 51%).
<strong>개인화형(personalized)</strong>은 가장 낮은 설득력을 보였으며, 단순형(simple)보다도 효과가 떨어짐.
<strong>통계형(stats)</strong>은 단순형보다 약간 높은 성능을 보였으나 유의미한 차이는 없음.
<strong>인간 논증(arg-hum)</strong>이 LLM 논증(arg-llm)보다 Likert Δ가 높았지만, P(+change)는 LLM 논증이 더 높았음.
특정 참여자(15%)가 의견 변화를 거부하는 경향이 있었으며, 중립적 입장을 가진 참여자가 부정적 Likert Δ를 보일 확률이 높았음.</p>
<ul>
<li>한계점</li>
</ul>
<p>표본 크기가 작음(n=33, m=198)
자기 보고식(opinion self-report)이 노이즈를 포함할 가능성이 높음
통계적 유의성이 낮은 경우가 많음.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] Persuasion Games with Large Language Models]]></title>
            <link>https://velog.io/@qlwkej285-/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Persuasion-Games-with-Large-Language-Models</link>
            <guid>https://velog.io/@qlwkej285-/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Persuasion-Games-with-Large-Language-Models</guid>
            <pubDate>Wed, 12 Feb 2025 01:23:39 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><a href="https://arxiv.org/pdf/2408.15879">https://arxiv.org/pdf/2408.15879</a>
일단 acl논문이다. </p>
</blockquote>
<h1 id="abstract">Abstract</h1>
<p>일단 LLM이 다양한 분야에 쓰이고 있다.
(credit card, Insurance 등등. 이때 insurance policy나 investment plan을 선택하도록 돕는다.)</p>
<p>We present a sophisticated multi-agent framework wherein a
consortium of agents operate in collaborative manner. 
<img src="https://velog.velcdn.com/images/qlwkej285-/post/6515873b-5d37-472e-921b-db181b6ccfa7/image.png" alt=""></p>
<h1 id="1-introduction">1 Introduction</h1>
<p>현재, 다양한 assistive agent들이 많이 쓰이고 있다.
(보험, 여행 설계 등등) 
<br></p>
<p>하지만, 
<br></p>
<p>문제 : conducting a successful conversation that can motivate
the user to take a preferred action requires more than human-
like responses.</p>
<p>해결방법 : </p>
<ol>
<li>유저의 무드를 계속해서 분석할 수 있어야 함. </li>
<li>유저의 저항을 분석할 수 있어야 함. </li>
<li>아이디어에 대한 유저의 경향성을 파악할 수 있어야 함. </li>
</ol>
<p>결국엔, 문제가 이것임. 
그렇다면 어떻게 구현했을까? </p>
<h2 id="11-persuasion">1.1 Persuasion</h2>
<ul>
<li><p>persuasion의 정의
: 특정한 agenda에 관해 그들의 belief를 induce하는 것!</p>
</li>
<li><p>persuasion의 예시
: 소비자의 선택을 독려하거나, 정치적인 캠페인을 독려하거나. </p>
</li>
<li><p>persuasion의 구성요소 
1) user-directed : persuader &lt;&gt; target audience 간의 direct 상호작용! -&gt; 논문에선 여기에 좀 더 초점! 
2) vicarious message : 직접적인 고려 없이 indirect 상호작용! </p>
</li>
</ul>
<h2 id="12-resistance-to-perusasion">1.2 Resistance to Perusasion</h2>
<ul>
<li><p>resistance의 정의 
: 그들의 행동,태도,믿음 등에 영향을 끼치는 행위들에 withstand하는 것! </p>
</li>
<li><p>resistance의 technique </p>
</li>
</ul>
<ol>
<li>prior attitude 불러일으키기 </li>
<li>selective exposure</li>
<li>biased processing</li>
<li>counter-arguing </li>
</ol>
<p>: 근데 하지만 이러한 메커니즘은 아직 덜 발달됨. </p>
<h1 id="2-related-work">2 Related Work</h1>
<p>Carlos et al. [4]</p>
<p>Simon et.al [2] analyses the ability of LLMs to emulate
persuasion dynamics and achieve opinion change in another LLM
agent with a persona.</p>
<p>이전 연구의 특징 : 
moral language와 lexical complexity로 했었음. </p>
<h2 id="21-our-contributions">2.1 Our Contributions</h2>
<p>일단 persuasion을 위한 framework 만들기 
=&gt; 계속해서 user의 감정 + 저항 방법 + 사회적인 노출에 대해 분석! </p>
<h1 id="3-setup">3 Setup</h1>
<p>일단, chat application에서는 4개의 different agnet를 설정했다.
Conversation agent, Advisor agent, Moderator and retrieval agent. 
대화 시스템은 여러 에이전트로 구성된다.</p>
<p>Sales Agent: 최종 응답을 결정하는 핵심 에이전트
Advisor Agent &amp; Retrieval Agent: Sales Agent에 정보를 제공
Analyzer Agent: 사용자의 감정 및 저항 전략을 분석
Strategist Agent: 전문가의 규칙이나 LLM을 활용해 설득 전략을 생성
Fact Checker: 최종 응답의 정확성을 검증</p>
<p>-&gt; 결국 이렇게 다양한 에이전트가 협력해서! <img src="https://velog.velcdn.com/images/qlwkej285-/post/b98de35a-87ef-4fd6-aa6a-cfae0c7e3184/image.png" alt=""></p>
<h2 id="31-sales-agents">3.1 Sales Agents</h2>
<p>은행 에이전트: 신용카드를 추천하고 프리미엄 카드 가입을 유도
보험 에이전트: 사용자의 의문을 해소하고 적절한 보험 상품을 추천
투자 상담 에이전트: 전통 vs. 현대적 투자 방식의 차이점을 설명하고 투자 유도
사용자가 관심을 보이면 관련 URL을 제공하며, 구매 여부가 설득 성공 여부의 주요 지표로 측정된다.</p>
<h2 id="32-user-agents">3.2 User Agents</h2>
<p>LLM을 활용해 <strong>25가지 서로 다른 인격(Persona)</strong>을 생성
인구통계, 재정, 교육 수준 등을 달리해 다양성을 확보
무작위 감정 및 동기를 부여해 저항 패턴을 변화
주제별 <strong>기억 시스템(Belief System)</strong>을 보유해 반복된 대화에서도 변화된 반응을 보임</p>
<h2 id="33-evaluation-metrics">3.3 Evaluation Metrics</h2>
<p>3.3 평가 지표 (Evaluation Metrics)
설득 효과는 다음 세 가지 지표를 통해 측정된다.</p>
<ul>
<li><p>설문 조사 (Surveys)
사용자 관점에서 제품, 혜택, 브랜드, 구매 관심도의 변화를 측정
대화 전후 정량적 질문이 포함된 설문을 진행하여 변화량을 분석</p>
</li>
<li><p>행동 지표 (Action-based Metric)
사용자가 선택한 구매 결정 옵션을 분석
선택지: 구매, 웹사이트 방문, 추가 정보 요청, 구매하지 않음
사용자가 구매 결정을 내리면 해당 도구를 호출하여 기록</p>
</li>
<li><p>언어 분석 (Language Analysis)
대화를 제3자의 관점에서 분석하여 설득력을 평가
LLM을 활용해 사전 정의된 평가 기준을 적용하여 측정</p>
</li>
</ul>
<p>세 가지 지표의 가중 평균을 통해 최종 설득력 점수를 산출
행동 지표(Action)가 가장 높은 가중치를 가지며, 그다음 설문 조사(Survey), 마지막으로 <strong>언어 분석(Language Analysis)</strong>이 반영됨</p>
<h1 id="4-experiment">4 Experiment</h1>
<p>총 300개의 대화를 생성하였으며, 이는 25명의 사용자 에이전트와 3명의 판매 에이전트 간에 이루어졌다. 사용자 에이전트의 감정과 원인은 무작위로 설정되었으며, 비교 벤치마크로 <strong>75개의 중립 감정 대화(3×25)</strong>도 수행되었다.</p>
<ul>
<li>각 세션의 구성 요소:</li>
</ul>
<p>사전 설문조사: 사용자의 기존 신념을 측정
최대 20턴의 대화: 사용자와 판매 에이전트 간의 대화
사후 설문조사: 사용자의 신념 변화 측정
사용자 지식베이스 업데이트: 대화 후 사용자의 신념 시스템을 반영</p>
<ul>
<li><p>모델 사용 및 대화 종료 조건
사용자 에이전트: GPT-4o (제한 초과 시 GPT-4로 대체)
판매 에이전트: GPT-4o-mini 및 GPT-3.5-turbo
기타 지원 에이전트: GPT-4o-mini
구매 결정은 사용자 에이전트가 함수 호출을 통해 수행</p>
</li>
<li><p>세션 종료 조건:</p>
</li>
</ul>
<p>20턴을 초과하지 않는 대화
사용자가 구매 결정을 내린 경우</p>
<ul>
<li><p>구매 결정 옵션:
Buy: 성공적인 설득
Visit Site, Need More Details: 부분적 성공 (구매 의향 유발)
No Buy: 설득 실패 (하지만 사후 설문에서 긍정적인 인식 변화 가능)</p>
</li>
<li><p>결과 분석 및 후속 조치
설문조사 반복: 세션 종료 후, 사용자에게 동일한 질문을 포함한 사후 설문 실시
지식베이스 업데이트: 사용자 신념 시스템 진화 반영 (후속 대화에 영향)
LLM 분석: 전체 대화를 평가하여 판매 에이전트의 설득력 및 사용자 인식 변화 점수화
6턴 이하의 대화는 설득력 측정에서 제외되지만, 감정이 설득에 미치는 영향 연구에는 포함됨</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] Boosting LLM Agents with Recursive Contemplation
for Effective Deception Handling]]></title>
            <link>https://velog.io/@qlwkej285-/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Boosting-LLM-Agents-with-Recursive-Contemplationfor-Effective-Deception-Handling</link>
            <guid>https://velog.io/@qlwkej285-/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Boosting-LLM-Agents-with-Recursive-Contemplationfor-Effective-Deception-Handling</guid>
            <pubDate>Tue, 11 Feb 2025 05:12:01 GMT</pubDate>
            <description><![CDATA[<h1 id="introduction">Introduction</h1>
<p>현재 상황 : <strong>많은 llm연구들이 진행되고 있다.</strong> </p>
<p>문제 :  여기서의 assumption은 LLM에 의해 처리된 정보들이 <strong>honest</strong>하고, <strong>deception</strong>이 없다는 것을 가정</p>
<pre><code> 실제 예시 )

 **예시 1**. **deception** 구별 불가

 **예시 2**. 악의적인 가치들에 관련된 **위험 구분 불가** </code></pre><p>→ significant loss</p>
<p>해결책 : <strong>identify</strong> and <strong>counteract</strong> deceptive inputs를 하는 게 필요!!! </p>
<p>그렇다면, 여기서 쓰인 시나리오는? </p>
<p>→ realistic linguistic tasks with misinformation </p>
<p>인간은 그럼 이런 시나리오에 어떤 식으로 반응하는데? </p>
<p>→ recursive thinking, perspective-taking </p>
<p>따라서 우리는 ReCon을 제시한다!</p>
<aside>
🤗

<p><strong>ReCon</strong></p>
<ol>
<li><p><em>Framework</em> 구조 </p>
</li>
<li><p>formulation contemplation</p>
</li>
<li><p>refinement contemplation </p>
</li>
<li><p>evaluation </p>
<ol>
<li><p>environment </p>
<p> = <strong>avalon game</strong> </p>
</li>
<li><p>dataset </p>
<p> = BigTom : Misinformation 데이터셋!</p>
</li>
<li><p>evaluation method : quantative , qualitive </p>
</li>
</ol>
</li>
</ol>
<p><a href="https://proceedings.neurips.cc/paper_files/paper/2023/file/2b9efb085d3829a2aadffab63ba206de-Paper-Datasets_and_Benchmarks.pdf">proceedings.neurips.cc</a></p>
<p>( avalon game, dataset에 관한 논문 )</p>
<ol>
<li><p>result</p>
<p> = 최종적인 finetuning이나 data <strong>없이도 좋은 성과를 이루어냄.</strong> 
 = 새로운 research field 제안 / novel cognitive framework / comprehensive experiments </p>
</li>
</ol>
</aside>

<h1 id="2-related-work">2 Related Work</h1>
<ul>
<li>Thought methods of LLMs</li>
<li>Game Playing in Deceptive Environments</li>
</ul>
<h1 id="3-background">3 Background</h1>
<h2 id="31-brief-introduction">3.1 Brief introduction</h2>
<h3 id="avalon">Avalon</h3>
<p>= competitive한 setting에서, deception과 misinformation을 simulate할 수 있도록 만들어 놓은 보드게임! </p>
<p>= good vs evil</p>
<p><img src="attachment:d082485c-f96c-492e-a5d1-427fbeb997a0:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-02-02_17.25.19.png" alt="스크린샷 2025-02-02 17.25.19.png"></p>
<p><img src="attachment:61555a54-82e6-41f1-8129-f5c0ef69c74e:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-02-02_17.25.34.png" alt="스크린샷 2025-02-02 17.25.34.png"></p>
<p><img src="attachment:4670e2e3-f7de-4c7e-bd6b-0fc955032011:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-02-02_17.25.55.png" alt="스크린샷 2025-02-02 17.25.55.png"></p>
<ul>
<li>Good Team</li>
</ul>
<p>= 멀린 , 퍼시벌 </p>
<p>(근데 심지어 논문에 이렇게 나와있다)</p>
<p>(This game is about a battle between good
and evil, where the good team, featuring Merlin, Percival, and two Loyal Servants of Arthur, aims to complete quests.)</p>
<ul>
<li>evil side</li>
</ul>
<p>= 모르가나, 암살자 </p>
<p>( In contrast, the evil side, with Morgana and Assassin, seeks to fail these quests.)</p>
<ul>
<li><p>구체적인 아발론 관련 설명</p>
<p>  <img src="attachment:14bf56d8-f3f6-4524-8a28-e843f99fa0a1:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-02-02_17.28.29.png" alt="스크린샷 2025-02-02 17.28.29.png"></p>
</li>
</ul>
<h3 id="bigtom">BigTom</h3>
<p>= LLM의 ToM cabability를 알아보기 위해 만든 벤치마크! </p>
<p>( llm이 잘못된 정보 찾고, 그 잘못된 정보들을 가지고 navigate하는 시나리오 포함) </p>
<p>ex ) 잘못된 처음의 아래 믿음이 self-misinformation으로 연결 </p>
<blockquote>
<p>Noor believes a pitcher contains oat milk but it has already been
replaced with almond milk by his coworker</p>
</blockquote>
<p><img src="attachment:e6cae4c3-aa88-4cbf-ba33-1b7f0cd5584d:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-02-02_21.42.00.png" alt="스크린샷 2025-02-02 21.42.00.png"></p>
<h2 id="32-challenges-in-deceptive-environments">3.2 Challenges in Deceptive Environments</h2>
<p><img src="attachment:0a9a6c6f-87dc-45fd-a257-7e77aef454f2:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-02-02_17.39.03.png" alt="스크린샷 2025-02-02 17.39.03.png"></p>
<p>그렇다면, 도대체 저 avalon game이란 환경에서, 어떤 게 문제인데? 어떤 게 문제여서 해결을 해야하는건데?</p>
<ol>
<li><p>Misled by malicious content </p>
<p> = <strong>‘깜빡 속기!’</strong></p>
<p> Arthur’s loyal servant (a good player) &lt;&gt;  Assassin(an evil player)</p>
<ol>
<li><p><strong>Assassin</strong></p>
<p> 제안 : replacing a good player with an evil one ( 한번 바꿔보자! ) </p>
<p> ( 속셈 : evil한 거를 위해서! ) </p>
</li>
<li><p><strong>Arthur</strong></p>
<p> CoT를 통해서 답했을 때 :  그럼! evail player를 불러들이자~~ ( 속음 ) </p>
<p> ReCon을 통해서 답했을 때 :  근데, 되게 조심해야해! ( 안 속음 )</p>
</li>
</ol>
</li>
<li><p>Exposing private information</p>
<p> = <strong>비밀 정보 누설 !</strong> </p>
<ol>
<li><p>상황</p>
<p> 새로 뭔가 팀을 꾸려야 하는 상황 </p>
</li>
<li><p><strong>Merlin</strong> </p>
<p> CoT를 통해서 답했을 때 : 그럼! 나,Merlin,은~ ( 비밀 정보 누설 )</p>
<p> ReCon을 통해서 답했을 때 : 그냥 뭐 걱정되니까 다시한번 바꿔보자 ( 비밀 정보 누설 X ) </p>
</li>
</ol>
</li>
<li><p>Hidden thought deception </p>
<p> = <strong>생각을 말 안함</strong></p>
<ol>
<li><p>상황 </p>
<p> player 4가 assassin인 거를 Morgana만 아는 상황! </p>
</li>
<li><p><strong>Morgana</strong> </p>
<p> CoT를 통해서 답했을 때 : 뭐 미션 성공안했으니까~player 4를 제외하는 게 좋아 ( 생각 말 안함 )</p>
<p> ReCon을 통해서 답했을 때 : 나는 evil을 좋아하니까~player 4를 제외하는 게 좋아 ( 생각 말 함 ) </p>
</li>
</ol>
</li>
</ol>
<p>⇒ 결국 <strong>안 속고</strong> + <strong>비밀 정보 누설 안하고</strong> + <strong>생각 말 하는</strong> 애여야 해! </p>
<aside>
🤗

<p>이건, deceptive한 정보를 multi agent에 <strong>한번</strong> 주입했을 때 발생할 상황들! </p>
<p><em>우리는 deceptive한 정보를 multi agent에 <strong>여러번</strong> 주입했을 때 발생할 상황들에 대해 탐구해보면 어떨까?</em>
→ 근데, 우리가 <strong>한번</strong> 주입했을 때보다 더 안 좋은 현상이 발생한다는 것을 논문에 언급해야하는데…
<strong>여러번</strong> 의견을 주입하는 것에 <strong>어떤 안 좋은 현상</strong>이 있는 거지? </p>
</aside>

<h1 id="4-recursive-contemplation">4 Recursive Contemplation</h1>
<p>3.2에 있는 challengs를 해결하기 위해서, </p>
<p>과연 어떤 것들이 좋을까? </p>
<h2 id="41-formulation-contemplation">4.1 Formulation Contemplation</h2>
<p>해결할 문제 : Exposing private information &amp; Hidden thought deception </p>
<p>해결책 : 1) <strong>안에서 contemplate 한 다음</strong> →  2) <strong>밖으로 the spoken content 내뱉기!</strong> </p>
<p><strong>⇒ [First-order Perspective Transition]</strong></p>
<ul>
<li>First-order의 의미는?</li>
</ul>
<p>= <em>‘infer what others might be thinking from <strong>its own perspective</strong>’</em> </p>
<p>= <strong>내 관점에서</strong> 다른 사람들이 어떻게 생각할지! </p>
<ul>
<li>구체적인 실현 방법</li>
</ul>
<p>= deduce the roles of fellow players! </p>
<p>1 ) 다른 사람들의 역할 추측하기 
2 ) 다른 사람의 상태와 할 말 추측하기 
3 ) contemplation 하기 </p>
<ul>
<li>수학적으로 풀어내보기</li>
</ul>
<p><strong>1 ) 안에서 contemplate 한 다음</strong></p>
<p>플레이어 숫자 : </p>
<p><img src="attachment:3cac3bf8-855a-40cc-b583-2ef65b4228c5:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-02-02_20.57.11.png" alt="스크린샷 2025-02-02 20.57.11.png"></p>
<p>일때, </p>
<p>K번째 player는 first thinks about the current game situation and the
roles of fellow players, following the principle of first-order perspective transition:</p>
<p><img src="attachment:eaafdfa0-0d15-45ae-9c67-3c21e7255db8:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-02-02_20.58.37.png" alt="스크린샷 2025-02-02 20.58.37.png"></p>
<p>Tk = k의생각! </p>
<p>H = 기존의 대화 로그 </p>
<p>Rk = player k의 role</p>
<p>Gk = role assumption ( 다른 사람들에 대한 ) </p>
<p>G’k = 업데이트된 role assumption</p>
<p>IRk =  role-specific한 비밀 정보 </p>
<p>P뭐시기뭐시기 = 다 프롬프트 ! ! ! ! ! </p>
<aside>
🤗

<p>그렇다면 저 위의 수식이 말하는 것은?</p>
<p>(1) role assumption 업데이트하기 :  기존의 대화로그 + role-specific한 기본 정보 + role assumption +  PT1 프롬프트 ⇒  role assumption을 만들어냄. </p>
<p>(2) update 된걸로 role assumption 바꾸기 </p>
<p>(3) Tk(생각) 만들어내기 : 기존의 대화로그 + role-specific한 기본 정보 + 업데이트된 role assumption +  think 프롬프트  ⇒ Tk 만들어냄. </p>
</aside>

<p>2) <strong>밖으로 the spoken content 내뱉기!</strong> </p>
<p><img src="attachment:49e6ebfd-6664-4bb8-a0ab-2680a36267fc:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-02-02_21.07.03.png" alt="스크린샷 2025-02-02 21.07.03.png"></p>
<p>Sk = k의 내뱉는 말! </p>
<aside>
🤗

<p>그렇다면 저 위의 수식이 말하는 것은?
(4) Sk(내뱉는 말) 만들어내기 : 생각 + 업데이트된 role assumption + 기존의 대화로그 + role-specific한 기본 정보 + speak 프롬프트 ⇒ Sk만들어냄 </p>
</aside>

<h2 id="42-refinement-contemplation">4.2 Refinement Contemplation</h2>
<p>근데 4.1에서 했음에도 불구하고, 실수가 있었다고 한다. </p>
<p>해결할 문제 : Exposing private information…</p>
<p>해결책 : 1) <strong>안에서 contemplate 한 다음</strong> →  2) <strong>안에서 contemplate 한 다음</strong>  → 3) <strong>밖으로 the spoken content 내뱉기!</strong> </p>
<p>⇒ <strong>[Second-Order Perspective Transition]</strong> </p>
<ul>
<li>Second-Order의 의미는?</li>
</ul>
<p>= <em>‘putting oneself in someone else’s shoes’</em></p>
<p>= <strong>다른 사람의 관점에서</strong> 다른 사람들이 어떻게 생각할지! </p>
<ul>
<li><p>구체적으로 보자면,</p>
<p>  “If I verbalize my initial version Sk of spoken content, how would the other roles,
  from both good and evil sides, respectively perceive my speech?”</p>
</li>
<li><p>구체적인 실현 방법</p>
<p>  <img src="attachment:67bb120b-63f2-4e0a-bcb7-8449ae10ec9c:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-02-02_21.15.48.png" alt="스크린샷 2025-02-02 21.15.48.png"></p>
<p>  Ok = 다른 역할의 심리 상태에 대한 분석 </p>
  <aside>
  🤗

<p>  (5) 다른 역할의 심리상태에 대한 분석 : k가 내뱉는 말 + role-specific한 정보 + 대화 로그 + PT2 프롬프트 ⇒ Ok
  (6) 최종적인 생각, 최종적으로 내뱉는 말 : (3)에서 만든 생각 + (4)에서 만든 생각 + 대화로그 + (5)에서 만든 분석 + role-specific한 정보 + ref프롬프트 ⇒ Tk’,Sk’ </p>
  </aside>

<p>  <img src="attachment:5a4b2945-19a7-4a58-a379-00a9bca4dba3:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-02-02_21.21.39.png" alt="스크린샷 2025-02-02 21.21.39.png"></p>
<p>  최종적으로 대화 로그에 포함된다! </p>
</li>
</ul>
<h1 id="5-experimental-evaluations">5 Experimental Evaluations</h1>
<h2 id="51-experimental-results-on-avalon">5.1 Experimental Results on Avalon</h2>
<h3 id="511-end-to-end-evaluations">5.1.1 End-to-End Evaluations</h3>
<p>일단, 한번 마피아를 잘 뽑았나! 한번 볼게! 
원래는 이제 하도 애들이 잘 속이니까(거짓말을 잘 하니까), 사실 마피아를 잡는! 그런 확률이 현저~하게 떨어지지만, 이 기법을 적용해서 투명하게 게임을 해보면 어떨까? </p>
<p><img src="attachment:f4e04229-4754-47d4-a884-6b264910e136:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-02-02_21.22.28.png" alt="스크린샷 2025-02-02 21.22.28.png"></p>
<h3 id="🔹-실험-개요">🔹 <strong>실험 개요</strong></h3>
<ul>
<li>아발론 게임 여러번 하게 함.</li>
<li><strong>ReCon을 Chain-of-Thought(CoT)에 적용</strong>하여 평가함.<ul>
<li><strong>좋은 편(선한 편)</strong> 테스트: CoT를 나쁜 편(악한 편)으로 설정해 비교.</li>
<li><strong>나쁜 편(악한 편)</strong> 테스트: ReCon을 좋은 편(선한 편)으로 설정해 비교.</li>
</ul>
</li>
<li><strong>비교 대상</strong>:<ul>
<li>기본 프롬프팅(vanilla prompting)</li>
<li>Chain-of-Thought (CoT)</li>
<li>Tree-of-Thoughts (ToT)</li>
</ul>
</li>
<li><strong>모델</strong>: ChatGPT, Claude, LLaMA-2 (LLaMA-2는 응답 형식이 맞지 않아 실패).</li>
</ul>
<h3 id="🔹-실험-결과-요약">🔹 <strong>실험 결과 요약</strong></h3>
<ol>
<li><strong>ReCon이 기존 방법(CoT, ToT)보다 성능이 좋음.</strong></li>
<li><strong>ReCon의 다양한 설계 요소(예: formulation conotemplation, refinement)가 효과적.</strong><ul>
<li>선한 편에서는 관점 전환(first/second-order perspective transitions)이 성능 향상에 크게 기여.</li>
<li>악한 편에서는 정교화 기법(refinement contemplation)이 더 중요한 역할을 함.</li>
</ul>
</li>
<li><strong>ReCon의 모든 기법을 조합했을 때 성능이 가장 높음.</strong></li>
</ol>
<h3 id="512-multi-dimensional-evaluation">5.1.2 Multi-Dimensional Evaluation</h3>
<h3 id="🔹-recon-성능-비교-실험">🔹 <strong>ReCon 성능 비교 실험</strong></h3>
<p>ReCon과 그 변형(ablated variants), 그리고 기본 모델인 CoT를 비교하여 <strong>ReCon의 설계 효과</strong>를 평가</p>
<h3 id="📌-비교-기준-6가지-평가-지표">📌 <strong>비교 기준 (6가지 평가 지표)</strong></h3>
<ol>
<li><strong>Concealment (CCL)</strong> – 비밀 유지 능력 (불필요한 정보 노출 방지)</li>
<li><strong>Logic (LG)</strong> – 논리적인 게임 분석 능력</li>
<li><strong>Contribution (CTR)</strong> – 팀 성공에 기여하는 발언 여부</li>
<li><strong>Persuasiveness (PRS)</strong> – 다른 플레이어를 설득하는 능력</li>
<li><strong>Information (INF)</strong> – 유용한 정보를 제공하는 정도</li>
<li><strong>Creativity (CRT)</strong> – 독창적인 전략과 관점</li>
</ol>
<h3 id="📌-실험-방법">📌 <strong>실험 방법</strong></h3>
<ul>
<li><strong>ChatGPT로 20번의 Avalon 게임을 진행</strong>하여 데이터 수집</li>
<li>각 프롬프트에 대해 <strong>4가지 방식의 응답 생성</strong><ol>
<li><strong>ReCon</strong></li>
<li><strong>ReCon (2단계인 refinement 없음)</strong></li>
<li><strong>ReCon (1단계인 formulation 없음)</strong></li>
<li><strong>기본 CoT</strong></li>
</ol>
</li>
<li><strong>총 2300개 이상의 응답 생성</strong></li>
<li><strong>GPT-4를 이용하여 각 응답을 6가지 기준으로 비교</strong></li>
</ul>
<hr>
<p><img src="attachment:e75e687f-d58e-4a31-b53d-2a1b0a46197c:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-02-02_21.30.03.png" alt="스크린샷 2025-02-02 21.30.03.png"></p>
<h3 id="🔹-실험-결과">🔹 <strong>실험 결과</strong></h3>
<ol>
<li><strong>Figure 4(a):</strong> ReCon이 <strong>모든 기준에서 CoT보다 성능이 뛰어남</strong></li>
<li><strong>Figure 4(b), (c):</strong> 2단계 refinement contemplation와 1단계 formulation contemplation 기법이 <strong>성능 향상에 큰 도움을 줌</strong></li>
<li><strong>예외:</strong><ul>
<li><strong>PRS(설득력) 점수는 기대보다 낮음</strong></li>
<li>이유: 1단계 formulation contemplation 으로 인해 <strong>더 간결한 표현을 사용</strong>했기 때문</li>
<li>예를 들어, 감정적인 표현(“우리는 반드시 승리할 것이다! 단결하자!”)이 줄어듦</li>
</ul>
</li>
</ol>
<h3 id="🔹-first-order--second-order-perspective-transitions-분석">🔹 <strong>First-Order &amp; Second-Order Perspective Transitions 분석</strong></h3>
<p><strong>👉 핵심 내용:</strong></p>
<p>ReCon에서 <strong>1차 및 2차 관점 전환</strong>을 제거하면 <strong>모든 평가 지표에서 성능이 감소</strong>함.</p>
<hr>
<h3 id="📌-세부-분석">📌 <strong>세부 분석</strong></h3>
<ol>
<li><strong>Figure 4(d), (e):</strong><ul>
<li><strong>1차 및 2차 관점 전환을 제거하면 모든 평가 지표에서 성능 저하 발생</strong></li>
</ul>
</li>
<li><strong>Figure 4(f), (g):</strong><ul>
<li><strong>refinement 또는 formulation 고려 없이 1차·2차 관점 전환을 제거하면 대부분의 지표가 하락</strong></li>
<li>예외적으로 <strong>CCL(비밀 유지 능력)은 향상됨</strong></li>
<li>하지만 이는 <strong>관점 전환과 정교화/공식화 기법을 함께 사용해야 비밀 유지가 더 효과적임을 시사</strong></li>
</ul>
</li>
</ol>
<h3 id="513-reliability-of-automatic-evaluation"><strong>5.1.3 Reliability of Automatic Evaluation</strong></h3>
<p>그러면, GPT-4를 평가할 때 썼으니까 안좋은 거 아니야?!!! 잘못평가했으면 어떡해~! </p>
<h3 id="🔹-연구-방법"><strong>🔹 연구 방법</strong></h3>
<ul>
<li>GPT-4의 자동 평가 결과(Figure 4)를 <strong>인간 주석(annotations)과 비교</strong>하여 신뢰성을 평가</li>
<li><strong>무작위 샘플 216개 대화 선정</strong>, 인간 평가자들이 <strong>합의 수준에 따라 분류</strong><ul>
<li><strong>“완전 합의” (Full Agreement)</strong></li>
<li><strong>“대부분 합의” (Majority Agreement)</strong></li>
<li><strong>“대부분 불일치” (Majority Disagreement)</strong></li>
<li><strong>“완전 불일치” (Full Disagreement)</strong></li>
</ul>
</li>
<li><strong>주석 팀:</strong> Avalon 게임에 익숙한 <strong>12명의 평가자</strong> (남성 8명, 여성 4명)</li>
</ul>
<h3 id="🔹-결과-figure-5"><strong>🔹 결과 (Figure 5)</strong></h3>
<ul>
<li><strong>합의 비율: 73.15%</strong></li>
<li><strong>불일치 비율: 26.85%</strong></li>
<li><strong>통계적 검증 (§H.3 참고)에서도 신뢰도 높음</strong></li>
</ul>
<p>🔎 <strong>결론:</strong> GPT-4의 자동 평가는 신뢰할 만한 결과를 제공함.</p>
<h3 id="52-experimental-results-on-bigtom"><strong>5.2 Experimental Results on BigTom</strong></h3>
<p><strong>목표:</strong> ReCon이 Avalon 게임 외 <strong>다른 인지적 과제에도 확장 가능</strong>한지 검증</p>
<p>왜냐면, avalon 게임에만 적용되면 소용이 없잖니~ </p>
<h3 id="🔹-bigtom이란"><strong>🔹 BigTom이란?</strong></h3>
<ul>
<li><p><strong>BigTom (Gandhi et al., 2023):</strong> LLM의 <strong>심리 이론(ToM, Theory of Mind) 능력</strong>을 평가하는 사회적 추론 벤치마크</p>
</li>
<li><p><strong>특징: false belief 관련 사례 포함</strong> → 오정보(misinformation) 탐지와 연관</p>
<p>  <img src="attachment:e6cae4c3-aa88-4cbf-ba33-1b7f0cd5584d:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-02-02_21.42.00.png" alt="스크린샷 2025-02-02 21.42.00.png"></p>
</li>
</ul>
<h3 id="🔹-521-기본-모델과-비교-comparison-with-baselines"><strong>🔹 5.2.1 기본 모델과 비교 (Comparison with Baselines)</strong></h3>
<ul>
<li><p><strong>비교 대상:</strong></p>
<ul>
<li>일반 LLMs (<strong>Vanilla LLMs</strong>)</li>
<li><strong>CoT (Chain-of-Thought)</strong></li>
<li><strong>ToT (Tree-of-Thought)</strong></li>
<li><strong>ReCon</strong></li>
</ul>
</li>
<li><p><strong>실험 방법:</strong></p>
<ul>
<li>Vanilla LLM &amp; CoT → Gandhi et al. (2023) 방식 사용</li>
<li>ToT → Yao et al. (2023) 방식 적용 (<strong>2-depth tree, 각 플랜 5회 평가</strong>)</li>
</ul>
</li>
<li><p><strong>결과 (Table 1):</strong></p>
<p>  <img src="attachment:1ec2003e-d00d-4c26-b268-07509db8defb:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-02-02_21.42.36.png" alt="스크린샷 2025-02-02 21.42.36.png"></p>
<ul>
<li><strong>ReCon이 거의 모든 테스트에서 최고 성능</strong></li>
<li>특히 <strong>초기 신념(Initial Beliefs) 관련 문제에서 우수</strong>, 거짓 정보 대응력 향상</li>
</ul>
</li>
</ul>
<p>✅ <strong>결론:</strong> ReCon은 <strong>거짓 신념(misinformation) 탐지 및 대응에서 효과적</strong>!</p>
<hr>
<h3 id="📌-522-recon의-확장-가능성-scaling-trend-of-recon"><strong>📌 5.2.2 ReCon의 확장 가능성 (Scaling Trend of ReCon)</strong></h3>
<ul>
<li><strong>Figure 6 분석:</strong><ul>
<li>LLaMA-Chat의 <strong>매개변수 수(parameter count)</strong> 증가 → ReCon 성능도 꾸준히 향상</li>
<li><strong>같은 모델 크기에서 ReCon &gt; CoT, ToT</strong></li>
<li>🚀 <strong>결론:</strong> ReCon은 <strong>더 큰 모델에서도 확장 가능</strong>, 차세대 LLM과도 호환 가능</li>
</ul>
</li>
</ul>
<h1 id="6-conclusion">6. Conclusion</h1>
<ul>
<li>Limitations</li>
</ul>
<h3 id="📌-recon의-일반화-가능성과-한계"><strong>📌 ReCon의 일반화 가능성과 한계</strong></h3>
<p><strong>1. ReCon이 모든 LLM에서 효과적인가?</strong></p>
<ul>
<li><strong>불확실성:</strong> ReCon이 <strong>모든 종류의 LLM 성능을 향상</strong>시킬지는 확실하지 않음.</li>
<li><strong>광범위한 테스트:</strong> 연구에서는 <strong>GPT-3.5, GPT-4, Claude-2, LLaMA-7b-chat, LLaMA-13b-chat</strong> 등 다양한 LLM을 평가.</li>
<li><strong>핵심 관찰:</strong> 다양한 LLM에서 <strong>ReCon이 성능 향상을 보여줌</strong> → 현재 LLM에 대해 <strong>일관된 효과</strong>를 가질 가능성.</li>
<li><strong>미래 전망:</strong><ul>
<li>ReCon의 <strong>인지 전략(재귀적 사고, 관점 전환)</strong>은 인간 지능과 유사.</li>
<li>LLM이 인간 수준의 지능에 도달하더라도, <strong>ReCon의 접근법은 여전히 유효할 가능성이 높음</strong>.</li>
<li><strong>잠재적 약점:</strong> 만약 미래의 LLM이 <strong>생성 능력이 부족해진다면</strong>, ReCon의 효과가 감소할 수도 있음.</li>
</ul>
</li>
</ul>
<p>✅ <strong>결론:</strong> ReCon의 전략은 <strong>LLM이 발전하더라도 지속적으로 유용할 가능성이 높음</strong>, 다만 생성 능력이 약화될 경우 효과가 감소할 수도 있음.</p>
<hr>
<p><strong>2. ReCon이 모든 속임수 환경에서 효과적인가?</strong></p>
<ul>
<li><strong>불확실성:</strong> ReCon이 <strong>모든 종류의 기만(속임수) 및 허위 정보 환경</strong>에서 효과적일까?</li>
<li><strong>두 가지 대표적인 테스트 환경:</strong><ol>
<li><strong>Avalon 게임</strong> – 복잡한 속임수 및 <strong>이론적 사고(ToM)</strong> 필요, 그러나 <strong>정답(ground-truth)이 없음</strong>.</li>
<li><strong>BigTom 벤치마크</strong> – 단순한 허위 정보 및 ToM, 하지만 <strong>정답이 존재</strong>하고 다양한 추론 과제가 포함됨.</li>
</ol>
</li>
<li><strong>실험 결과:</strong><ul>
<li>ReCon은 <strong>두 환경에서 모두 우수한 성능을 보임</strong>.</li>
<li>다양한 <strong>기만 및 허위 정보 환경에 대해 일반화 가능성이 있음</strong>.</li>
</ul>
</li>
</ul>
<p>✅ <strong>결론:</strong> ReCon은 허위 정보 탐지에 유망하지만, <strong>실제 환경에서 추가적인 테스트가 필요함</strong>.</p>
<hr>
<p><strong>3. ReCon이 사전 학습 없이도 효과적인가?</strong></p>
<ul>
<li><strong>우려 사항:</strong> ReCon의 성능이 <strong>LLM의 본래 능력에 의존</strong>한다면, <strong>추가적인 미세 조정(fine-tuning)이 필요할까?</strong></li>
<li><strong>잠재적 이점:</strong> 추가적인 데이터로 미세 조정을 하면 <strong>ReCon의 성능이 더욱 향상될 가능성</strong>.</li>
<li><strong>인지적 접근법의 강점:</strong><ul>
<li>LLM이 본래 가지고 있는 능력을 <strong>항상 최적으로 활용하지는 않음</strong> → <strong>인지적 방법이 이를 극대화</strong>하는 역할.</li>
<li><strong>CoT(Chain-of-Thought)</strong> 및 <strong>ToT(Tree-of-Thought)</strong>와 유사하게, LLM의 <strong>추론 능력을 최대한 활용</strong>하도록 유도.</li>
<li><strong>장점:</strong> <strong>추가적인 훈련 데이터 없이도 작동 가능</strong> → 보다 <strong>광범위한 응용 가능성</strong> 제공.</li>
</ul>
</li>
</ul>
<p>✅ <strong>결론:</strong> 추가적인 학습이 ReCon의 성능을 높일 수 있지만, <strong>추가 데이터 없이도 LLM의 내재적 능력을 효과적으로 활용</strong>하는 것이 ReCon의 핵심 강점.</p>
<hr>
<h3 id="📌-최종-정리"><strong>📌 최종 정리</strong></h3>
<p>✅ ReCon은 다양한 LLM에서 성능을 향상시키며, AI가 발전하더라도 유효할 가능성이 높음.</p>
<p>✅ 실제 환경에서 추가적인 검증이 필요함.</p>
<p>✅ fine-tuning이 도움이 될 수 있지만, ReCon은 추가 학습 없이도 LLM의 잠재력을 극대화할 수 있음.</p>
<aside>
🤗

<p>역시 잘 쓰인 논문이라,,,술술 읽힌다. </p>
</aside>]]></description>
        </item>
        <item>
            <title><![CDATA[[강화학습스터디] 2강 Markov Decision Process ]]></title>
            <link>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5%EC%8A%A4%ED%84%B0%EB%94%94-2%EA%B0%95-Markov-Decision-Process</link>
            <guid>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5%EC%8A%A4%ED%84%B0%EB%94%94-2%EA%B0%95-Markov-Decision-Process</guid>
            <pubDate>Fri, 07 Feb 2025 14:01:43 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/de1ec327-039f-4a07-9c44-00c85fc0f0c8/image.png" alt="">
 <img src="https://velog.velcdn.com/images/qlwkej285-/post/8e1e0ff0-3e87-4671-a67a-82948731dc0d/image.png" alt="">
MDP는 일종의 environment를 표현하는 방법! 
대부분의 모든 RL problem은 MDP로 표현할 수 있다고 한다. <img src="https://velog.velcdn.com/images/qlwkej285-/post/a02a8ed3-e726-4ca7-9e17-8b20084f15b6/image.png" alt=""></p>
<p>*<em>Markov Process -&gt; MarKov Reward Process -&gt; Markov Decision Process *</em>
이렇게 확장이 된다. </p>
<p>일단 MarKoV 특성
<img src="https://velog.velcdn.com/images/qlwkej285-/post/77c913e2-a089-45a5-a5ff-0e386cac4269/image.png" alt="">
예전의 것들은 현재랑 관계가 없다. 
state만 필요할 뿐, 이전 history는 필요가 없다.</p>
<ul>
<li>State Transition Matrix 
<img src="https://velog.velcdn.com/images/qlwkej285-/post/0c651a61-7de6-4352-b569-3bdae905fefd/image.png" alt=""></li>
</ul>
<p>s에서 s&#39;으로 갈 확률을 Pss&#39;라고 하는데, </p>
<p>그것들을 이제 저렇게 matrix로 모아 놓은 게 P라고 생각하면 됨. 
n x n </p>
<h1 id="1-markov-process">1. markov process</h1>
<p>: 상태들이 n개가 있고 discrete하게 state를 옮겨다니는!
<strong>_state는 stochastially 움직이는 ! _</strong>
<img src="https://velog.velcdn.com/images/qlwkej285-/post/dd7508d6-a2f6-4ff8-bb55-b7dc40d0b123/image.png" alt="">
S = state들의 집합
P = 전이 확률 matrix </p>
<p>random process : 샘플링을 할 수 있다. <img src="https://velog.velcdn.com/images/qlwkej285-/post/4a85ba13-7fb6-4159-9922-412c8e17ab0a/image.png" alt=""></p>
<p>여기서 state는 7개! 
state의 전이 확률이 화살표...! 오오 
<img src="https://velog.velcdn.com/images/qlwkej285-/post/f67a0c65-ba3e-411d-8f58-e7c848ff66dc/image.png" alt="">
여기서, sampling을 해볼 수가 있음. </p>
<blockquote>
<p>episode란? 
처음부터 시작해서 final까지 가는 것! </p>
</blockquote>
<p>시작이 C1이라 하면, 그 뒤에 C2,C3
<img src="https://velog.velcdn.com/images/qlwkej285-/post/23dea1e0-697e-42fa-8384-8dd9ee5c4f4e/image.png" alt=""></p>
<h1 id="2-markov-reward-process">2. markov reward process</h1>
<p>= markov chain + rewards 하지만 action은 없다. </p>
<p>아까는 S,P였는데 R,r이 필요 <img src="https://velog.velcdn.com/images/qlwkej285-/post/2956be57-4f93-414d-9062-5aab4f05d4af/image.png" alt="">
R은 reward function 
r은 discount factor </p>
<blockquote>
<p>R에 있는 수는? 
그냥 뭐 예시다. </p>
</blockquote>
<p>이거는 action이 없기 때문에 확률적으로 그냥 그 확률을 따라가서 reward를 주는 거다. 
그래서 action이 결부될 일이 없음. </p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/5b578ca0-4399-4eec-9ea9-a6b9eaae26cd/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/26de3f63-1f5e-49c9-98d4-6585c1ef9e5d/image.png" alt=""></p>
<p>강화학습은 이 return을 maximize하는 것이 핵심이다. 
경로동안 받는 보상들의 총합!!!  
감마가 1 : 멀리 보는 거  = 미래의 보상도 현재 보상만큼 중요시 !  
감마가 0 : 단기 </p>
<p>Horizon = 얼마나 많은 state만큼 진행이 되는건지! </p>
<blockquote>
<p>discount 왜 해? 
<img src="https://velog.velcdn.com/images/qlwkej285-/post/0be83a44-c9d6-447e-8d5a-f98b37c3e2bc/image.png" alt=""></p>
</blockquote>
<ol>
<li>수학적으로 편리해서</li>
</ol>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/eaf95871-fbbb-4b34-91cb-dcd6ab33b3ca/image.png" alt=""></p>
<p>state value function은, reward의 총 기댓값 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강화학습 스터디] 1 Introduction to Reinforcement Learning ]]></title>
            <link>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EC%8A%A4%ED%84%B0%EB%94%94-1-Introduction-to-Reinforcement-Learning</link>
            <guid>https://velog.io/@qlwkej285-/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EC%8A%A4%ED%84%B0%EB%94%94-1-Introduction-to-Reinforcement-Learning</guid>
            <pubDate>Wed, 05 Feb 2025 16:30:24 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/7dfd2319-f079-4b01-8054-3701b9aa21a7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/abc807fb-4e65-4c26-9a93-eb8a1e25bee7/image.png" alt=""></p>
<ul>
<li><p>reward signal 
정답이 알려주는 사람 없이, 에이전트가 리워드 신호만 받으면서 좋은 방법론을 찾아가는 것 ! ! ! !
supervisor가 없이 ! ! ! 
== 자기주도학습 잘 하는 학생 
reward : 니가 알아서 해! </p>
</li>
<li><p>feedback is delayed 
supervised learning에서는 <strong>지연 학습 이런 게 없지만...</strong></p>
</li>
<li><p>time really matters
supervised learning 에서는 independent &amp; identically distributed.
하지만, 강화학습은 sequential ... 오.</p>
</li>
<li><p>agent&#39;s action affect the subsequent data it receives
아 순간적으로 학습하는 건가? </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/42d53133-4c40-42e1-894d-434333a4c314/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/708b8bfa-e2b9-46c6-ace0-0c75c81bbd00/image.png" alt="">
reward는 숫자 scalar 하나 !! !
하지만, 여기서는 cumulative reward...라는 것! 
(현재말고 전체를 봐서) </p>
<p>그러면, 굳이 스칼라로 치환해서 안되는 그런 문제들은??...(ex.벡터)
=&gt; 뭔가 조작을 해야하겠군.</p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/ec8e54bf-6991-4bb4-ac90-45beac1bcd9e/image.png" alt="">
(예시) </p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/3b14abe7-a7fd-4b87-9fdb-940ba473d179/image.png" alt="">
하 한번 결정 잘 하면 안되고, 지속적으로 결정을 잘해야함. 
greedy하게 하면 안되고 long-term을 언제나 생각해야함. <img src="https://velog.velcdn.com/images/qlwkej285-/post/a289c1ed-0045-4654-941f-acdcc7f14d0e/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/789a460f-d0cf-4f4b-99d3-2039d50ccccf/image.png" alt=""></p>
<p>llm agent, 주식 포트폴리오 알고리즘이 저 뇌</p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/2631aa30-9d4a-4c9a-8434-31642f502b29/image.png" alt=""></p>
<p>state : history에 함수를 씌운 것
= f : 과거 자체를 다 볼 수는 함수
= f : 과거 중 하나만 보는 함수 
= 즉, history의 어떤 부분에 가중치를 둘 지 생각할 수 있는 것임. </p>
<blockquote>
<p>얘는 그럼 실시간으로 학습하는 거네?
llm한테 프롬프트를 그냥 주입하는 것은 inference였고, 전혀 llm의 internal state에 영향이 없었는데 
얘는 inference + learing을 동시에 하다보니 internal state를 바꿀 수 있음. </p>
</blockquote>
<blockquote>
<p>llm chat history vs RL에서의 history
1 시점에서의 Agent A의 message+ 1 시점에서의 Agent B의 message + 2 시점에서의 Agent A의 message = chat history  : 단순히 inference 때의 prompt의 일부로 들어감 
O,R,A = H = RL history : learning에 사용 </p>
</blockquote>
<ul>
<li>environment state 
<img src="https://velog.velcdn.com/images/qlwkej285-/post/8755b761-4a9a-45fa-b463-0d4e35458d02/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/7f2dcdec-77c1-4ed5-91f9-476941147d32/image.png" alt=""></p>
<p>environment의 state는 뭔데? 
== obv + reward + action 을 관찰한 후 , 다음 obv값은?
== f (Ht) == f (obv + reward + action ) 
[근데 여기 f가 history를 가지고 environment의 state를 알아내는 함수인거지] 
-&gt; 다음 enviornment를 예측하기 위해 필요한 feature들 + 그 feature의 값들! 
-&gt; 내부에서 돌아가고 있는 것들@!!! !! ! ! </p>
<ul>
<li>agent state 
<img src="https://velog.velcdn.com/images/qlwkej285-/post/28199753-fa96-4f54-b7e1-1141081fd430/image.png" alt=""></li>
</ul>
<p>agnet의 state는 뭔데? 
== obv + reward + action 을 관찰한 후 , 다음 obv값은?
== f (Ht) == f (obv + reward + action ) 
[근데 여기 f가 history를 가지고 agent에게 필요한 정보들을 알아내는 함수인거지] 
ex) 삼성전자에서 주식할 때 필요한 것들(ex. 블룸버그 뉴스, 어제 매도량, 어제 매수량 등등)
-&gt; 학습할 때 중요하게 생각하는 feature를 추출 + 그 feature의 값들! </p>
<p> <img src="https://velog.velcdn.com/images/qlwkej285-/post/50325072-d072-4086-a469-d95a41f01eed/image.png" alt=""></p>
<p>여기서 information state가 등장. 
저거라면 markov인거<img src="https://velog.velcdn.com/images/qlwkej285-/post/ccc844de-8cac-45a8-b6b9-98b62fd636b1/image.png" alt=""></p>
<p>우리는 이제 쥐...
agent의 state를 어떻게 정하느냐에 따라서 달라지는 것. </p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/e8b68abc-2136-4075-a628-e7c6e575732c/image.png" alt=""></p>
<p>MDP</p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/0f68bfa6-1c36-4237-931a-d6d9bc088540/image.png" alt="">
agent state != environment state  </p>
<p>agent state : public한 정보들로만 구성됨 
environment state : public + private들로 구성  ( 모든 애들 다 ! ) </p>
<h1 id="rl-agent의-구성-요소">RL agent의 구성 요소</h1>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/2f991e36-7130-4277-9045-8d222df0dc2c/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/cf74d369-c5df-4471-99e2-c30cac243927/image.png" alt="">
state를 넣으면 action을 뽑아내는! 
오 신기 </p>
<ul>
<li>deterministic policy : 하나의 액션만 ! </li>
<li>stochastic policy  : 각 action별 확률을 뱉음 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/355eec41-be3b-401e-89dc-02d6400974b4/image.png" alt="">
state를 넣으면 value을 뽑아내는! 
어떤 Poclicy 파이를 따라갔을 때 예상되는 기댓값인 것임. </p>
<p>감마 : 2000년대의 돈 != 2010년대의 돈<img src="https://velog.velcdn.com/images/qlwkej285-/post/8c3de3ba-e00b-4087-9dbb-91f4973e04d4/image.png" alt="">
state를 넣으면 환경에 대한 예측값을 뽑아내는 ! </p>
<ol>
<li>reward 예측 </li>
<li>그다음 state 예측 
(모델이 이걸 예측을 한 것이다) <br> 
예시 
![](https://velog.velcdn.com/images/qlwkej285-/post/adf0e722-c66e-4c10-b693-25c75396345b/image.png)
policy : 선택 화살표 ![](https://velog.velcdn.com/images/qlwkej285-/post/8f6e6a96-1e0b-4e12-85b0-fc9efa3aef60/image.png)
처음에는 아예 검은색 맵인 것임. 

</li>
</ol>
<h1 id="categorizing-rl-agents">Categorizing RL agents</h1>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/f571c51e-04ba-4999-9f39-eaedb9e38f83/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/18cdbccb-122f-4376-9540-8e3b3f1ccaa7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/ebe2ac6d-e1a2-4ce7-9b2f-b58d56ff70c6/image.png" alt=""></p>
<h1 id="learning-and-planning">LEARNING AND PLANNING</h1>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/16d62649-974b-4f37-ba03-0d211e84c5f2/image.png" alt=""></p>
<p>강화학습은 두개를 합친 것
learning : env를 모르는 것. 환경에 그냥 던져진 것. 걔의 policy를 개선시켜가는 게 learning 
planning : env를 앎. reward가 어떻게 되는지 알고 transistion이 어떻게 되는지 앎 . (이게 몬테카를로...) </p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/a4699547-e9c0-403d-8379-1ace99d859f7/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/fce26de7-53e9-45cb-bf27-b726771a5c66/image.png" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/d10d105f-f162-4572-bf1a-e9fb61997bb1/image.png" alt="">
<img src="https://velog.velcdn.com/images/qlwkej285-/post/fbe85a7e-2ac2-4691-a0f6-64f0ec4b3303/image.png" alt=""><img src="https://velog.velcdn.com/images/qlwkej285-/post/e7cd69eb-1e03-4ced-af86-c13d2da8d2e0/image.png" alt="">
prediction은 value function을 잘 만드는 것 
control은 best policy를 찾는 것! <img src="https://velog.velcdn.com/images/qlwkej285-/post/deaa777e-99f7-4a1b-a2e4-7bf91cdc32e7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/8a1d31a3-74ff-4516-831e-fd8141b22d27/image.png" alt="">
아우 재밌다! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] BIAS RUNS DEEP: IMPLICIT REASONING BIASES IN PERSONA-ASSIGNED LLMS]]></title>
            <link>https://velog.io/@qlwkej285-/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-BIAS-RUNS-DEEP-IMPLICIT-REASONING-BIASES-IN-PERSONA-ASSIGNED-LLMS</link>
            <guid>https://velog.io/@qlwkej285-/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-BIAS-RUNS-DEEP-IMPLICIT-REASONING-BIASES-IN-PERSONA-ASSIGNED-LLMS</guid>
            <pubDate>Fri, 31 Jan 2025 08:45:40 GMT</pubDate>
            <description><![CDATA[<h1 id="introduction">Introduction</h1>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/128a20b2-efc9-4fd8-a9f4-6144234abff8/image.png" alt="">
LLM은 엄청난 발전을 했다.</p>
<p>하지만 customize하는 방법이 좋음(하나만  다 할 수는 없으니...)
-&gt; persona setting! 
( LLM-driven human behavior simulation can facilitate insightful exchanges (e.g. “You are a pro-choice devout Christian. Why do you support abortion?”)</p>
<p>하지만, persona-assinged LLM은 unintended한 side-effect를 찾기가 어렵다. </p>
<br>
그렇다면,
_Could persona assignment influence the fundamental reasoning capabilities of an LLM, even when the assigned persona is arguably tangential to the task at hand?_

<p>이걸 위해서 19 diverse personas 를 만들어서, 24 reasoning datasets spanning multiple subject domains에 테스트 해봤다. </p>
<p>충격적이게도,  For ChatGPT-3.53, 80% of our personas demonstrated bias, i.e., had a drop in performance on at least one dataset. Additionally, the magnitude of this bias is also significant—we observed a rel- ative drop of 70% in accuracy on certain datasets and an average drop of 35% across datasets for some personas. </p>
<p>인종별로, 종교별로 차이도 있었다. we observe the model bias resulting
in disparate performance, e.g. Jewish persona performs better on STEM datasets, Atheist persona
performs better than Christians on Sciences, and Obama Supporter persona outperforms Trump Sup-
porter on ethics</p>
<h1 id="2-methodology--setup">2. Methodology &amp; Setup</h1>
<ul>
<li>assigning a persona </li>
</ul>
<p>일단 chatgpt같은 llm은 2가지의 프롬프트가 있다.
(1) system prompt
(2) user prompt</p>
<p>시스템프롬프트에서, persona instruction을 따르라고 언급하고,
user prompt에서 user에 관한 정보를 넣었다. </p>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/8827d31a-6e99-4f3c-aeb2-412d4bb3fcc8/image.png" alt=""></p>
<ul>
<li>personas &amp; datasets in the study </li>
</ul>
<p>24개의 dataset을 썼다...! ! ! ! 
(math reasoning, programming, physics, maths, medicine ...)</p>
<ul>
<li>model &amp; evaluation 
chatgpt3.5를 대상으로. </li>
</ul>
<h1 id="3-findings">3 Findings</h1>
<h2 id="31-persona-elicits-bias-in-reasoning">3.1 Persona elicits bias in reasoning</h2>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/c74d7215-08bc-4d35-974e-f95a985a6193/image.png" alt="">
24개의 데이터셋에 대해 accuracy를 측정한건데, 
각각의 persona마다 이렇게 다르게 나왔다.</p>
<h2 id="32-extent-of-the-bias">3.2 Extent of the Bias</h2>
<p><img src="https://velog.velcdn.com/images/qlwkej285-/post/edf88653-cacb-4262-a78a-d430a5d22a48/image.png" alt="">
이건 이제 significant한 drop이 있는 경우를 체크한 것이다.
(ex.phys.disabled의 경우 baseline인 human persona보다 현저하게 drop이 있는 경우가 23개고, 
asian인 경우 baseline인 human persona보다 현저하게 drop이 있는 경우가 21개다)</p>
<h1 id="4-analysis">4 Analysis</h1>
<ol>
<li>고정관념에 의한 응답 거부 
모델은 특정 페르소나(예: &quot;신체 장애인&quot;, &quot;종교인&quot;, &quot;트럼프 지지자&quot;)에 대해 그들이 어떤 작업을 할 수 없다고 잘못 생각하고, 질문에 답하지 않거나 거부하는 경우가 많음.</li>
</ol>
<p>예를 들어, 신체 장애인을 묘사하는 모델이 &quot;수학 계산을 할 수 없다&quot;고 답할 수 있습니다. 이런 방식의 거부는 고정관념에 근거한 잘못된 추정에서...<img src="https://velog.velcdn.com/images/qlwkej285-/post/8a9de6bf-64f5-4abf-8621-034ec30e0652/image.png" alt=""></p>
<p>fig 8은 각 페르소나에 대한 오류 비율을 보여줍니다. 특히 신체 장애인이나 종교적인 페르소나는 응답 거부(abstentions)로 인한 오류 비율이 크다는 것을 나타냅니다. 예를 들어, 신체 장애인 페르소나에서는 <strong>58%</strong>가 &quot;응답 거부&quot;로 인한 오류</p>
<ol start="2">
<li>고정관념에 의한 추론 오류:
응답 거부를 넘어, 모델이 특정 페르소나에 대해 잘못된 추론을 할 수 있음.</li>
</ol>
<p>단순히 응답을 거부하는 것이 아니라, 특정 페르소나 때문에 응답이 이상하게 나올 수도 있단 의미. 
예를 들어, 신체 장애인이나 종교인 페르소나가 같은 질문에 대해 다르게 응답할 수 있는데, 이 차이는 모델의 고정관념에 의한 것
예를 들어, &quot;오바마 지지자&quot;와 &quot;트럼프 지지자&quot; 페르소나가 같은 수학 문제를 풀 때 정확도가 39% 차이가 나는 경우가 있었음. 
= 모델은 단순히 &quot;<strong>응답 거부</strong>&quot;하는 것만이 아니라, 잘못된 고정관념을 바탕으로 응답을 왜곡하거나 불균형적인 정확도 차이를 보입니다. 이 미묘한 편향은 &quot;응답 거부&quot;보다 발견하기 어렵기 때문에 더 문제 ! ! ! ! ! </p>
]]></description>
        </item>
    </channel>
</rss>