<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>webb-c.log</title>
        <link>https://velog.io/</link>
        <description>우주의 아름다움도 다양한 지식을 접하며 스스로의 생각이 짜여나갈 때 불현듯 나를 덮쳐오리라.</description>
        <lastBuildDate>Sat, 27 May 2023 10:51:26 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>webb-c.log</title>
            <url>https://velog.velcdn.com/images/webb-c/profile/edefb249-569a-43f1-a8f3-1b1311ca9200/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. webb-c.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/webb-c" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[환경설정 기록]]></title>
            <link>https://velog.io/@webb-c/%ED%99%98%EA%B2%BD%EC%84%A4%EC%A0%95-%EA%B0%9C%EC%82%BD%EC%A7%88-%EA%B8%B0%EB%A1%9D</link>
            <guid>https://velog.io/@webb-c/%ED%99%98%EA%B2%BD%EC%84%A4%EC%A0%95-%EA%B0%9C%EC%82%BD%EC%A7%88-%EA%B8%B0%EB%A1%9D</guid>
            <pubDate>Sat, 27 May 2023 10:51:26 GMT</pubDate>
            <description><![CDATA[<h3 id="anaconda-재설치">anaconda 재설치</h3>
<p>버전 문제랑 기본 파일 깨짐 등등 여러가지 문제로 죽어가길래 그냥 한번 갈아엎고자 conda를 재설치 했다.
설치할 때 환경변수 추가하는걸 까먹어서 실행이 인식 못하던 문제가 하나 있었다.</p>
<p>윈도우에서는 </p>
<ol>
<li>시스템 환경변수 편집 &gt; 고급 &gt; 환경변수에서
 a. 만약 본인이 현재 User에 대해서만 설정했다면 User 탭에서, 
 b. 전체 User에 대해서 conda를 설치했다면 System 탭에서</li>
<li>&quot;Path&quot; 변수를 더블클릭하고 다음 3개의 폴더를 추가해주면 된다.
 a. anaconda
 b. anaconda/Library
 c. anaconda/Scripts</li>
</ol>
<p>추가를 완료한 뒤 다음 명령어를 통해 제대로 설치 되었는지 확인해보자.</p>
<pre><code class="language-bash">conda --version
</code></pre>
<h3 id="cuda-version-확인">cuda version 확인</h3>
<p>사용하는 GPU에 따라서 tensorflow-gpu의 권장 버전이 다르다는 이야기가 있기 때문에 cuda version을 확인했다. </p>
<blockquote>
<p>cuda는 NVDIA에서 개발한 병렬 컴퓨팅 및 프로그래밍 모델로, NVIDA에서 제작한 GPU가 효율적인 병렬처리 연산을 할 수 있도록 지원하기 위한 소프트웨어이다.</p>
</blockquote>
<h4 id="cuda-version-확인하기">CUDA version 확인하기</h4>
<pre><code class="language-bash">nvcc --version
</code></pre>
<p>-&gt; 내가 사용하는 컴퓨터의 version은 11.3 인 것을 확인했다.
여기서 문제 : </p>
<h4 id="그-외-알아두면-유용한-cuda-명령어">그 외 알아두면 유용한 CUDA 명령어</h4>
<p>GPU상태, 메모리 사용 등을 표기</p>
<pre><code class="language-bash">nvidia-smi</code></pre>
<p><img src="https://velog.velcdn.com/images/webb-c/post/7d4ec233-2fb8-4daa-8a3b-d830f2e10f96/image.png" alt=""></p>
<p>자 이제 가상환경(들)을 만들어보자</p>
<h1 id="가상환경-설정">가상환경 설정</h1>
<h3 id="만들기">만들기</h3>
<pre><code class="language-bash">conda create -n {가상환경이름} 
</code></pre>
<p>추가적인 다양한 옵션을 쓸 수 있다. 유용해 보이는 옵션만 몇개 적어본다.  </p>
<ul>
<li>python 버전 지정 <code>python=버전</code></li>
</ul>
<h3 id="활성화-및-비활성화">활성화 및 비활성화</h3>
<pre><code class="language-bash">conda activate {이름}</code></pre>
<h3 id="패키지-관리">패키지 관리</h3>
<p>pip이랑 conda를 사용할 수 있다. pip을 쓰면 서로 다른 버전때문에 발생하는 호환성 문제를 해결하지 않지만 대부분의 라이브러리를 지원하며, conda는 라이브러리를 설치할 때 호환성을 고려하여 설치해준다. 
(*pip은 권한 문제가 발생할 수 있는데, 이때는 가장 뒤에 <code>--user</code>를 붙여주자.)</p>
<h4 id="설치">설치</h4>
<p>특정 버전을 설치하고 싶다면,</p>
<ul>
<li>pip : <code>=={버전}</code></li>
<li>conda : <code>={버전}</code><pre><code class="language-bash">pip install {라이브러리이름}
</code></pre>
</li>
</ul>
<pre><code>```bash
conda install {라이브러리이름} 
</code></pre><h4 id="업그레이드">업그레이드</h4>
<pre><code class="language-bash">pip install --upgrade {라이브러리이름}
</code></pre>
<pre><code class="language-bash">conda upgrade {라이브러리이름} 
</code></pre>
<h4 id="삭제">삭제</h4>
<pre><code class="language-bash">pip uninstall {라이브러리이름}
</code></pre>
<pre><code class="language-bash">conda remove {라이브러리이름} 
</code></pre>
<h3 id="기타-명령어-들-conda-pip">기타 명령어 들 (conda, pip)</h3>
<h4 id="현재-환경에-설치된-라이브러리-출력">현재 환경에 설치된 라이브러리 출력</h4>
<pre><code class="language-bash">conda list</code></pre>
<h4 id="가상환경-리스트">가상환경 리스트</h4>
<pre><code class="language-bash">conda info --envs</code></pre>
<h4 id="가상환경-삭제">가상환경 삭제</h4>
<pre><code class="language-bash">conda remove -n {가상환경이름} --all</code></pre>
<h1 id="실전도입">실전도입</h1>
<p>총 3개의 가상환경을 만들어야한다. 
하나는 tensorflow를 사용하며, 다른 하나는 torch를 사용하고 마지막을 torch와 image처리와 관련된 다양한 응용을 사용하는 환경이다. tensorflow-gpu를 잘... 사용하고자한다.</p>
<h3 id="gpu-못-찾음">GPU 못 찾음</h3>
<p><del>버전문제가 아니었다. 그냥 지금 torch든지 tensorflow든지 그냥 GPU를 못 잡고 있다.</del>
인줄 알았는데 tensorflow는 버전 문제가 맞았다. ㅋㅋㅋ CUDA 11.2까지 GPU를 지원하는 2.10버전을 사용하는데 내 컴퓨터에 깔려있는 CUDA는 11.3이고... 이거 한번 돌리고 다시는 안 쓸 tensorflow 사용하기 위해서 CUDA 재설치하는건 너무 낭비라고 생각하기 때문에 걍 pytorch만 잘 해보려고 한다.</p>
<p>해결하려는 과정을 써보려한다.</p>
<ol>
<li><p>cuDNN 활성화 여부 확인</p>
<pre><code class="language-python">if torch.backends.cudnn.enabled:
 print(&quot;활성화&quot;)</code></pre>
</li>
<li><p>CUDA version에 맞는 pytorch 설치하기
<a href="https://download.pytorch.org/whl/cu113/torch_stable.html">https://download.pytorch.org/whl/cu113/torch_stable.html</a></p>
</li>
</ol>
<p>나는 11.3이므로 cu113을 써두었다. 자신에게 맞는 버전으로 url를 바꾸면 된다.
해당 CUDA버전과 호환이 잘 되는 pytorch 버전을 찾아볼 수 있다.</p>
<p>하지만 문제가 읎음 -&gt; ??</p>
<ol start="3">
<li><p>새로운 문제... nvcc-v로 확인한 CUDA버전이랑 nvidia-smi로 확인한 버전이 다르다. </p>
<p>=&gt; 큰 문제 아니고 그냥 nvcc-v를 참고하라함...? 뭘까</p>
</li>
</ol>
<p>ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 그냥 바보짓함...</p>
<p>당연히 나는 선배가 cuDNN설치 했을 줄 알았고 위에 코드도 True로 나오길래 음. 있구만 했었는데.. 아니었다. 위에 코드는 뭐지...? 써서는 안되는 코드인가 어이없음. 혹시나 해서 include, lib 라이브러리 가봤는데 cudnn 관련 파일들이 없었다... 그래서 다운 받고 추가해줬다.</p>
<p>미래에 도움 될 수 있으니까 설정 관련 정보 추가한다.</p>
<h4 id="cudnn-다운-받는-곳">cuDNN 다운 받는 곳</h4>
<p><a href="https://developer.nvidia.com/rdp/cudnn-archive">https://developer.nvidia.com/rdp/cudnn-archive</a></p>
<p>-&gt; 압축 파일을 받아서 생긴 lib, include, bin 폴더 안에 있는 파일들을 NVIDIA GPU ~~ &gt; CUDA &gt; v11.3에다가 옮겨준다.</p>
<h4 id="cuda-환경변수-설정하는-방법">CUDA 환경변수 설정하는 방법</h4>
<p>사용자 환경변수의 Path에다가 아래 3개의 폴더를 추가해준다.</p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/90d583bf-38db-4af2-bf29-4ceb584dfa23/image.png" alt=""></p>
<p>시스템 환경변수에는 CUDA 설치시 기본적으로 CUDA_PATH와 CUDA_PATH_V11_3이 만들어진다.
<img src="https://velog.velcdn.com/images/webb-c/post/eaa0d57b-11ea-4961-9cfc-ff490a87ac3d/image.png" alt=""></p>
<p><del>*<em>근데 왜 아직도 안됨? *</em></del></p>
<h3 id="💙-cuda-사용을-위한-pytorch-설치-방법">💙 CUDA 사용을 위한 pytorch 설치 방법</h3>
<p><a href="https://pytorch.org/get-started/previous-versions/">CUDA 버전에 맞는 pytorch와 toolkit 설치하기</a></p>
<p>위 사이트에서 내가 사용하는 os, CUDA버전에 맞게 pytorch를 설치하는 방법이 나와있다. 나는 바보였고... <code>cudatoolkit</code> 도 함께 설치해줘야하는 걸 모르고 있었다. </p>
<h3 id="kobert">KoBERT</h3>
<p>koBERT를 사용하는 프로젝트가 하나 있는데 개발한 사람이 window를 고려안한건지 뭔지 잘 모르겠지만 mxnet이랑 trnasformer간에 numpy 버전 충돌이 있어서 계속 설치가 안되는 문제가 있었다.</p>
<p><a href="https://github.com/SKTBrain/KoBERT/issues/84">https://github.com/SKTBrain/KoBERT/issues/84</a></p>
<p>위 issue를 참고하여 그냥 직접 설치명령어를 실행하니까 오류메시지가 나기는하는데 그래도 설치가 되긴한다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강화학습] Model Free Control]]></title>
            <link>https://velog.io/@webb-c/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-Model-Free-Control</link>
            <guid>https://velog.io/@webb-c/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-Model-Free-Control</guid>
            <pubDate>Mon, 30 Jan 2023 07:06:09 GMT</pubDate>
            <description><![CDATA[<p><em>본 포스팅은 David Silver 교수님의 강화학습 강의와 그 강의를 정리한 팡요랩 강의를 바탕으로 정리한 것입니다.</em></p>
<br>

<p>환경을 알지 못하는 상황에서 던져진 Agent를 이용하여 어떻게 최적의 policy를 찾을 것인가? &lt;Control 문제&gt;</p>
<br>

<h1 id="1-model-free-control">1. Model-free control</h1>
<hr>
<h3 id="11-model-free-control의-문제점">1.1 model-free control의 문제점</h3>
<blockquote>
<p>⚠️ model-free환경에서 control문제를 해결할때는 MDP를 모르기 때문에 발생하는 여러 문제점이 존재한다.
  (=$\mathcal P^a_{ss&#39;}, \mathcal R^a_s$를 알지못한다)</p>
</blockquote>
</aside>

<ul>
<li><p><em>policy iteration의 원리</em></p>
<ul>
<li><p>기본적으로 control문제를 풀기 위해서는 policy evaluation과 policy improvement를 반복해서 수행하면서 점차 개선된 policty를 찾아나가는 과정을 필요로한다.</p>
</li>
<li><p>이때, policy evaluation과 improvement 각 단계에서는 어떤 method를 적용하여도 된다.</p>
<p> <em>e.g. (model-based에서는) iterative, greedy</em></p>
</li>
</ul>
</li>
</ul>
<pre><code>![](https://velog.velcdn.com/images/webb-c/post/a9ebfb85-1b29-42f5-95a5-9e4b3ff061a0/image.png)</code></pre><ul>
<li><p><strong>MDP를 모를 때 발생하는 문제점</strong></p>
<ol>
<li><p>Iterative policy evaluation을 적용할 수 없다.</p>
<p> Iterative policy evaluation은 Bellman Expectation Equation을 기반으로 value를 계산해나가는 과정이다.</p>
<p> 그런데 Bellman Expectation Equation에는 <strong>MDP를 알아야만 알 수 있는 요소$^*$</strong>들이 존재하기 때문에 MDP를 알 수 없는 model-free환경에서는 이 식을 그대로 적용할 수 없다.</p>
<ul>
<li><p>state $s$에서 action $a$를 했을 때 받는 reward는 실제로 Agent가 경험해봐야만 알 수 있다.</p>
</li>
<li><p>state $s$에서 action $a$을 했을 때 어떤 state $s&#39;$에 도달하게 되는지는 실제로 Agent가 경험해봐야만 알 수 있으며, 경험을 하더라도 구체적인 확률 분포를 정의하지는 못한다.</p>
<p>$$
v_\pi(s) =\sum_{a\in\mathcal A} \pi(a|s) \left( \mathcal R^a_s + \gamma \sum_{s&#39;\in\mathcal S}\mathcal P^a_{ss&#39;}v_\pi(s&#39;)\right)
$$</p>
</li>
</ul>
</li>
<li><p>$V$를 기반으로는 Greedy policy를 만들 수 없다. </p>
<p> greedy policy는 <em>state-value function</em>을 기반으로 가장 value가 높은 next-state에 도달하게 하는 action을 선택하는 방법으로 만들어진다.</p>
<p> 그런데 model-free환경에서는 어떤 action $a$을 수행했을 때 어떤 state $s&#39;$에 도달하게 되는지는 실제로 Agent가 경험해봐야만 알 수 있으며, 경험을 하더라도 구체적인 확률 분포를 정의하지는 못한다.</p>
<p> 따라서 어떤 action을 했을 때 최종적으로 더 높은 value를 갖는 state에 도달할 확률이 더 높은 action을 선택하는 greedy policy를 정의할 수 없다. </p>
</li>
</ol>
<p><em>*Example of Greedy Action Selection</em></p>
<ul>
<li><p>problem : 2개의 문이 존재하고 각각의 문을 선택할 때마다 reward를 받게 되며, 문을 선택한 뒤에는 그 방으로 들어간다. (model-free)</p>
<ul>
<li>action : 왼쪽 문을 연다, 오른쪽 문을 연다</li>
<li>state : left, right</li>
</ul>
<ul>
<li><p><em>episode</em></p>
<ol>
<li><p>왼쪽 문을 열고 reward 0을 받은 뒤 왼쪽 방에 들어갔다. → $V(\text{left}) = 0$</p>
</li>
<li><p>오른쪽 문을 열고 reward 1을 받은 뒤 오른쪽 방에 들어갔다. → $V(\text{right}) = 1$</p>
</li>
<li><p>더 value가 높은 state인 right에 도달하기 위해 오른쪽 문을 열고 reward 3을 받은 뒤 오른쪽 방에 들어갔다. → $V(\text{right}) = (1+3)/2 =2$</p>
</li>
<li><p>더 value가 높은 state인 right에 도달하기 위해 오른쪽 문을 열고 reward 2을 받은 뒤 오른쪽 방에 들어갔다. → $V(\text{right}) = (1+3+2)/3 =2$  </p>
<p>$\vdots$</p>
</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code> - $Q$.  오른쪽 문을 여는 행동을 선택하는 것이 과연 최적의 행동이라고 확신할 수 있는가?
   $A$. 왼쪽 문을 여는 행동을 딱 한번 수행하는 것으로는 완전히 파악할 수가 없다. (e.g. 왼쪽 문을 다시 열었더니 reward $+100$이 주어질수도 있음)</code></pre><br>

<h3 id="12-model-free에서-policy-improvement">1.2 model-free에서 Policy improvement</h3>
<blockquote>
<p><em>MDP를 모를 때 발생하는 문제점의 해결방안</em></p>
<ul>
<li><p>policy evaluation 단계
  즉 <strong>prediction</strong> 문제는 model-free prediction문제를 해결하는 방법론인 <strong>MC, TD</strong>를 적용하여 평가할 수 있다. </p>
</li>
<li><p>policy improvement 단계</p>
<ul>
<li>더 나은 action을 평가하는 기준으로 state-value $v(s)$ 대신에 <strong>action-value $q(s,a)$</strong>를 이용한다.</li>
<li>exploration을 고려하기 위하여 $\epsilon$<strong>-greedy 방법</strong>을 이용한다.</li>
</ul>
</li>
</ul>
</blockquote>
<ul>
<li><p>Greedy policy improvement</p>
<ul>
<li><p>MDP를 알아야, $V(s)$에 대하여 greedy policy improvement를 할 수 있다.  </p>
<p>$=$<em>model-free일 때는 할 수 없다!</em></p>
<p>  $$
  \pi&#39;(s) = \argmax_{a\in \mathcal A}\left( \mathcal R^a_s + \gamma \sum_{s&#39;\in \mathcal S}\mathcal P^a_{ss&#39;}V(s&#39;)\right)
  $$</p>
</li>
<li><p>model-free일 때는 $Q(s,a)$에 대하여 greedy하게 action을 선택하는 방법으로서 greedy policy improvement를 수행할 수 있다.  </p>
</li>
</ul>
</li>
</ul>
<pre><code>    $$
    \pi&#39;(s) = \argmax_{a\in \mathcal A} Q(s,a)
    $$</code></pre><ul>
<li><p>$\epsilon$-greedy Exploration</p>
<ul>
<li><p><em>Exploration이 고려되어야하는 이유</em>  </p>
<p>model-based와 달리 model-free환경에서는 실제로 Agent가 action을 선택하고 state사이를 이동하면서 환경에 대한 정보를 배우게 된다. 그런데 학습의 초기 단계에서부터 greedy action만을 선택한다면 Agent가 다양한 state를 방문하지 못하고 이미 방문한 state만 계속 방문하게 될 수 있다.</p>
</li>
<li><p>각 action이 non-zero probability를 가질 때, ($n(\mathcal A) = m$)</p>
<ul>
<li><p>$1-\epsilon$의 probability만큼 greedy action을 선택한다. → policy가 계속 emprovement함을 보장한다.</p>
</li>
<li><p>$\epsilon$의 probability만큼 random action을 선택한다. → agent가 모든 state를 방문할 수 있음을 보장한다.</p>
<p>$$
\pi(a|s) = \begin{cases} \epsilon /m +1 - \epsilon &amp; \text{if }a^* = \argmax_{a\in \mathcal A} Q(s,a)\ \epsilon /m &amp; \text{otherwise}\end{cases}
$$</p>
</li>
</ul>
</li>
<li><p>(Theorem) $\epsilon$-greedy policy improvement</p>
<blockquote>
<p>For any $\epsilon$-greedy policy $\pi$, the $\epsilon$-greedy policy $\pi&#39;$ with respect to $q_\pi$ is an <strong>improvement</strong></p>
<p>$$
v_{\pi&#39;} (s) \ge v_\pi(s)
$$</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<pre><code>  1. state $s$에서의 action은 $\pi&#39;$을 따라 선택하고 이후에는 $\pi$를 따라 시행했을 때의 action-value $q_\pi(s, \pi&#39;(s))$를 bellman equation으로 표현한 것 
  2. $\pi&#39;(a|s)$를 epsilon-greedy형태로 표현한 것 

        가능한 모든 action에 대하여 greedy action에 대해서는 $\epsilon/m+(1-\epsilon)$을 곱해주고 그렇지 않은 경우 그냥 $\epsilon/m$만을 곱해주었다. *(probability $\times$ value)

    3. geedy action에 대한 value는 다른 어떤 action-value보다도 큰 값이기 때문에 다른 action들에 대한 weighted-sum보다도 큰 값을 가진다.

        **weight는 4번째 식으로 정리하기 위해 곱해준 임의의 값*

    4. 해당 수식은 $v_\pi(s)$로 표현된다. (action-value간의 관계)

      → 1-step에 대해서 더 좋음을 보이면 결국 policy improvement theorem에 의해 $v_{\pi&#39;}(s) \ge v_\pi(s)$임을 보일 수 있다. 


    $$
    q_\pi(s, \pi&#39;(s)) = \sum_{a\in \mathcal A}\pi&#39;(a|s) q_\pi(s,a)
    $$
    $$
    =\frac{\epsilon}{m}\sum_{a\in \mathcal A}q_\pi(s,a) + (1-\epsilon)\max_{a\in \mathcal A}q_\pi(s,a)
    $$
    $$
    \ge \frac{\epsilon}{m}\sum_{a\in \mathcal A}q_\pi(s,a) + (1-\epsilon)\sum_{a\in \mathcal A}\frac{\pi(a|s) - \epsilon/m}{1-\epsilon}q_\pi(s,a)
    $$
    $$
    =\sum_{a\in \mathcal A}\pi(a|s) q_\pi(s,a) = v_\pi(s)
    $$</code></pre><br>

<h3 id="13-on-policy와-off-policy">1.3 on-policy와 off-policy</h3>
<ul>
<li><strong>On-policy</strong> Learning<ul>
<li><em>Learn on the job</em></li>
<li>학습시키려는 policy와 실제 environment에서 Agent가 경험을 쌓을 때 따르는 policy가 <strong>동일한</strong> 경우</li>
</ul>
</li>
<li><strong>Off-policy</strong> Learning<ul>
<li><em>Look over someone’s shoulder</em></li>
<li>학습시키려는 policy와 실제 environment에서 Agent가 경험을 쌓을 때 따르는 policy가 <strong>다른</strong>경우</li>
</ul>
</li>
</ul>
<br>

<h1 id="2-on-policy-monte-carlo-control">2. On-Policy Monte-Carlo Control</h1>
<hr>
<h3 id="21-monte-carlo-control">2.1 Monte-Carlo Control</h3>
<p><em>for Every <strong>episode</strong> :</em></p>
<ul>
<li>Policy evaluation : Monte-Carlo policy evaluation, $Q \approx q_\pi$</li>
<li>Policy improvement : $\epsilon$-greedy policy improvement</li>
</ul>
<p><img src="https://velog.velcdn.com/images/webb-c/post/7f88e9a6-488b-4ce3-80e7-a4ed6453da61/image.png" alt=""></p>
<p><em>*효율적인 갱신방법</em> : policy evaluation을 수행할 때, $q_\pi$에 수렴할 때까지 진행하지 않고 early-stop한다. </p>
<p>→ Agnet가 경험한 하나의 episode에 대한 정보를 가지고 바로 더 나은 pocliy로 갱신</p>
<br>

<h3 id="22-glie-property">2.2 GLIE property</h3>
<ul>
<li><p>Definition of Greedy in the Limit with Infinite Exploration : GLIE</p>
<blockquote>
<p>Greedy in the Limit with Infinite Exploration <em>under the following conditions :</em></p>
<ul>
<li><p>All state-action pairs are explored infinitely many times, <Exploration></p>
<p>  $$
  \lim_{k \rightarrow \infin} N_k(s,a) = \infin
  $$</p>
<br></li>
<li><p>The policy <strong>converges</strong> on a greedy policy, <Exploitation></p>
<p>  $\epsilon$-greedy를 이용한다면 optimal Q-value를 가지고 있더라도 $\epsilon$이라는 확률만큼은 최적이 아닌 랜덤한 action을 수행하기 때문에, 결국 최적의 policy를 찾기 위해서는 최종적으로 greedy policy에 수렴해야한다. </p>
<p>  $$
  \lim_{k \rightarrow \infin} \pi_k(a|s) = \bold 1(a=\argmax_{a&#39; \in \mathcal A} Q_k(s,a&#39;))
  $$</p>
</li>
</ul>
</blockquote>
<p>  ⇒ <em>GLIE와 $\epsilon$-greedy :</em> 예를 들어, $\epsilon$이 점차 $0$으로 수렴한다면($=\epsilon_k = 1/k$) GLIE의 조건을 만족시킬 수 있다.</p>
</li>
</ul>
<br>

<ul>
<li><p>GLIE Monte-Carol Control</p>
<p>  $\pi$를 따라 수행한 $k$번째 episode에서, ${S_1, A_1, R_2, \cdots, S_T} \sim \pi$</p>
</li>
</ul>
<ul>
<li><p>For each state $S_t$ and action $A_t$ in the episode, (in Evaluation)
  *$N(S_t, A_t)$ : 수행 횟수</p>
<p>  $$</p>
<pre><code>N(S_t, A_t) \leftarrow N(S_t, A_t) + 1</code></pre><p>  $$</p>
<p>  $$</p>
<pre><code>Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \frac{1}{N(S_t, A_t)} (G_t - Q(S_t, A_t)</code></pre><p>  $$</p>
</li>
<li><p>Improve policy based on new action-value function (in Emplovement)</p>
<p>  $$</p>
<pre><code>\epsilon \leftarrow \frac{1}{k}</code></pre><p>  $$</p>
<p>  $$</p>
<pre><code>\pi \leftarrow \epsilon\text{-greedy}(Q)</code></pre><p>  $$</p>
</li>
</ul>
<ul>
<li><p>(Theorem) GLIE Monte-Carol Control의 수렴성</p>
<blockquote>
<p><strong>GLIE</strong> Monte-Carlo control <strong>converges</strong> to the optimal action-value function,</p>
<p>$$
Q(s,a) → q_*(s,a)
$$</p>
</blockquote>
</li>
</ul>
<br>


<h3 id="23-mc-vs-td-control">2.3 MC vs. TD Control</h3>
<ul>
<li><p>TD의 장점</p>
<ul>
<li>MC에 비하여 Lower variance</li>
<li>Online Update</li>
<li>Incomplete sequence에도 적용가능하다.</li>
</ul>
</li>
<li><p>TD를 MC대신에 control loop에 적용하자!</p>
<ul>
<li>apply <strong>TD</strong> to $Q(S,A)$</li>
<li>$\epsilon$-greedy policy improvement</li>
<li>Update every <strong>time-step</strong></li>
</ul>
</li>
</ul>
<br>


<h1 id="3-on-policy-temporal-difference-learning">3. On-Policy Temporal-Difference Learning</h1>
<hr>
<h3 id="31-sarsa">3.1 SARSA</h3>
<ul>
<li><p><em>SARSA</em>: state $S$에서 action $A$를 수행하여 reward $R$을 받고 next state $S&#39;$에 도달한 뒤, 다시 action $A&#39;$를 수행하는 과정</p>
</li>
<li><p>SARSA를 이용한 Action-Value function <strong>Update</strong></p>
<ul>
<li>TD Target : $R + \gamma Q(S&#39;, A&#39;)$</li>
<li>TD error : $\delta = R+\gamma Q(S&#39;, A&#39;) - Q(S,A)$</li>
</ul>
<br>

<p>  $$
  Q(S,A) \leftarrow Q(S,A) + \alpha (R+\gamma Q(S&#39;, A&#39;) - Q(S,A))
  $$</p>
</li>
<li><p><em>for Every <strong>time-step</strong> :</em></p>
<ul>
<li><p>Policy evaluation : <strong>SARSA</strong>, $Q \approx q_\pi$</p>
</li>
<li><p>Policy improvement : $\epsilon$-greedy policy improvement</p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/13a3f85b-47a3-4958-89f2-0c7353f50740/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="32-sarsa-algorithm">3.2 SARSA Algorithm</h3>
<ul>
<li><p><em>SARSA 알고리즘 설명</em></p>
<ol>
<li><p>초기에는 랜덤한 값들로 <strong>Q</strong>-table을 초기화한다. </p>
</li>
<li><p>$Q$에 대한 $\epsilon$-greedy방법을 이용하여 state $S$에서의 action $A$를 고른다.</p>
</li>
<li><p>action $A$를 Agent가 시행하고, 그 결과로 받게되는 reward $R$과 도달한 next-state $S&#39;$에 대한 정보를 받는다.</p>
</li>
<li><p>$Q$에 대한 $\epsilon$-greedy방법을 이용하여 이동한 state $S&#39;$에서의 action $A&#39;$를 선택한다.</p>
</li>
<li><p>next state-action pair에 대한 Q-value를 이용하여 current Q-value를 <strong>TD</strong>방법으로 업데이트한다.</p>
<p> $$
 Q(S,A) \leftarrow Q(S,A) + \alpha (R+\gamma Q(S&#39;, A&#39;) - Q(S,A))
 $$</p>
</li>
<li><p>current state, action에 $S&#39;$, $A&#39;$를 대입한다. </p>
<p> $\vdots$</p>
</li>
</ol>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/webb-c/post/071e191e-d58f-4c61-b8b4-47558d847f5c/image.png" alt=""></p>
<br>

<h3 id="33-convergence-of-sarsa">3.3 Convergence of SARSA</h3>
<ul>
<li><p>(Theorem) SARSA의 수렴성</p>
<blockquote>
<p>SARSA <strong>converges</strong> to the optimal action-value function $Q(s,a) → q_<em>(s,a)$, *under the following conditions :</em></p>
<ul>
<li><p><strong>GLIE</strong> sequence of policies $\pi_t(a|s)$</p>
</li>
<li><p>Robbins-Monro sequence of <strong>step-sizes</strong> $\alpha_t$</p>
<p>  : step size는 충분히 커야하지만, 수렴할 정도로 작아야한다. </p>
<p>  $$
  \sum^\infin_{t=1} \alpha_t = \infin,\ \ \ \sum^\infin_{t=1} \alpha_t^2 &lt; \infin
  $$</p>
</li>
</ul>
</blockquote>
</li>
</ul>
<br>

<h3 id="34-n-step-sarsa𝝺">3.4 n-step SARSA(𝝺)</h3>
<ul>
<li><p>n-step SARSA($\lambda$)</p>
<ul>
<li><p>$n=1,2,\cdots, \infin$일 때의 Q-return</p>
<blockquote>
<p>$n$만큼의 실제 reward와, $t+n$번째 step에서의 추정 value function의 합으로 표현한다.</p>
</blockquote>
<ul>
<li><p>$n=1$ : $q_t^{(1)} = R_{t+1} + \gamma Q(S_{t+1})$ <strong>[SARSA]</strong></p>
</li>
<li><p>$n=2$ : $q_t^{(2)} = R_{t+1} + \gamma R_{t+2} + \gamma ^2Q(S_{t+2})$</p>
<pre><code>$\vdots$</code></pre></li>
<li><p>$n=\infin$ : $q_t^{(\infin)} = R_{t+1} + \gamma R_{t+2} + \cdots + \gamma^{T-1}R_T$ <strong>[MC]</strong></p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>n-step Q-return</strong>의 define</p>
<p>  $$</p>
<pre><code>q_t^{(n)} = R_{t+1} + \gamma R_{t+2} + \cdots + \gamma^{n-1}R_{t+n} + \gamma^n Q(S_{t+n})</code></pre><p>  $$</p>
<ul>
<li><p>n-step SARSA learning</p>
<ul>
<li><p>n-step TD target : $q^{(n)}_t$</p>
</li>
<li><p>n-step TD error : $\delta_t = q^{(n)}_t - Q(S_t, A_t)$ ; target과 이전 예측 값의 차이</p>
<p>$$
Q(S_t, A_t) \leftarrow Q(S_t, A_t)+\alpha(q_t^{(n)} - Q(S_t, A_t))
$$</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>Forward View SARSA($\lambda$)</p>
<ul>
<li><p>$q^\lambda$<strong>-return</strong> : SARSA부터 MC까지 진행했을 때의 모든 return의 평균</p>
<ul>
<li><p>각 n-step return $q_t^{(n)}$에 대하여 $(1-\lambda)\lambda^{(n-1)}$  weight를 적용하여 계산한다.</p>
</li>
<li><p>$n$이 커질수록 $\lambda$가 계속해서 곱해지게 되므로 더 작은 가중치를 가지게 된다.</p>
<p>$$
q_t^\lambda = (1-\lambda)\sum^\infin_{n=1}\lambda^{n-1} q_t^{(n)}
$$</p>
</li>
</ul>
</li>
<li><p>Forward-view SARSA($\lambda$) <strong>Update</strong></p>
<p>  $$
  Q(S_t, A_t) \leftarrow Q(S_t, A_t)+\alpha(q_t^{\lambda} - Q(S_t, A_t))
  $$</p>
</li>
</ul>
</li>
</ul>
<br>


<ul>
<li><p><strong>Backward View SARSA</strong>($\lambda$)</p>
<ul>
<li><p>아이디어</p>
<ul>
<li>TD($\lambda$)에서 사용한 것처럼 SARSA도 eligibility traces를 적용할 수 있다.</li>
<li>단, SARSA는 Q-function에 대해 TD를 적용하므로 각각의 state-action pair에 대해 대응되는 하나의 eligibility trace를 가진다.</li>
</ul>
</li>
<li><p>eligibility trace</p>
<ul>
<li><p>init : $E_0(s, a) = 0$</p>
</li>
<li><p>time-step $t$에서 어떤 state $s$에서 어떤 action $a$를 수행하면, $1$을 더해주고 방문하지 않았을 때는 $t-1$에서의 값에다가 $\gamma\in (0,1)$를 곱해줘서 값을 감소시킨다.</p>
<p>  $$
  E_t(s,a) = \gamma\lambda E_{t-1}(s,a)+\bold 1(S_t=s, A_t = a) 
  $$</p>
</li>
</ul>
</li>
<li><p>Backward-view SARSA($\lambda$) <strong>Update</strong></p>
<p>$$
  \delta_t = R_{t+1} + \gamma Q(S_{t+1}, A_{t+1}) - Q(S_t, A_t)
$$</p>
</li>
</ul>
</li>
</ul>
<pre><code>$$
Q(s, a) \leftarrow Q(s)+\alpha \delta_tE_t(s, a)
$$</code></pre><ul>
<li><p><em>SARSA(</em>$\lambda$<em>)의 효율성 (Gridworld Example)</em></p>
<ul>
<li><p>one-step SARSA에서는 reward를 받는 순간, 그 state에만 갱신이 된다.</p>
</li>
<li><p>그러나 SARSA($\lambda$) *$\lambda \approx 1$는 reward를 받는 순간, 그 state까지 오기까지 거쳤던 모든 state, action에 대해 약간이나마 그 reward가 전파된다!</p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/77a9f58d-99d2-4172-bf55-57c978c698ae/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<br>


<h3 id="35-sarsa𝝺-algorithm">3.5 SARSA(𝝺) Algorithm</h3>
<ul>
<li><p><em>SARSA(</em>$\lambda$<em>) 알고리즘 설명</em></p>
<ol>
<li><p>초기에는 랜덤한 값들로 <strong>Q</strong>-table을 초기화한다. </p>
</li>
<li><p>$Q$에 대한 $\epsilon$-greedy방법을 이용하여 state $S$에서의 action $A$를 고른다.</p>
</li>
<li><p>action $A$를 Agent가 시행하고, 그 결과로 받게되는 reward $R$과 도달한 next-state $S&#39;$에 대한 정보를 받는다.</p>
</li>
<li><p>$Q$에 대한 $\epsilon$-greedy방법을 이용하여 이동한 state $S&#39;$에서의 action $A&#39;$를 선택한다.</p>
</li>
<li><p>next state-action pair에 대한 Q-value를 이용하여 current Q-value와의 차이; <strong>TD error</strong>를 계산한다. </p>
<p> $$
 \delta \leftarrow R+\gamma Q(S&#39;, A&#39;) - Q(S,A)
 $$</p>
</li>
<li><p>current state-action pair에 대한 eligibility; 방문횟수를 1 더해준다.</p>
<p> $$
 E(S,A) =  E(S,A)+ 1
 $$</p>
</li>
<li><p>모든 $s, a$에 대하여 eligibility를 고려한 만큼의 TD-error값을 더하여 Q-value를 갱신하고, 다른 실제로 방문되지 않은 state-action pair에 대해 eligibility를 감소시키는 과정을 반복한다. </p>
<p> (=Q-table 전체를 업데이트 한다.)</p>
<p> $$
 Q(s,a) \leftarrow Q(s,a)  +  \alpha \delta E(s,a)
 $$</p>
<p> $$
 E(s,a) \leftarrow \gamma \lambda E(s,a)
 $$</p>
</li>
<li><p>current state, action에 $S&#39;$, $A&#39;$를 대입한다. </p>
<p> $\vdots$</p>
</li>
</ol>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/webb-c/post/ea0e3d04-8d0f-4f50-88cf-270788787f2e/image.png" alt=""></p>
<br>

<h1 id="4-off-policy-learning">4. Off-Policy Learning</h1>
<hr>
<h3 id="41-off-policy-learning">4.1 off-policy learning</h3>
<ul>
<li><p><em>off-policy란?</em></p>
<p>  target policy $\pi$를 따랐을 때의 value를 계산하거나, policy를 개선하고 싶을 때 target과 다른 behavior policy $\mu$를 따랐을 때의 경험적 정보를 활용하는 방법  </p>
<ul>
<li><p><strong>target  policy</strong> $\pi(a|s)$ : compute $v_\pi(s)$ or $q_\pi(s,a)$  </p>
</li>
<li><p><strong>behavior policy  $\mu(a|s)$</strong> : ${S_1, A_1, R_2, \cdots, S_T} \sim \mu$</p>
<p>  → 실제로 action을 sampling 할 때 사용하는 policy</p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>off-policy의 장점</strong></p>
<ul>
<li><p>사람이나 다른 agent가 수행한 결과를 보고 나의 target policy를 emprovement 할 수 있다.</p>
</li>
<li><p>emprovement policy에 대해 다시 iterative를 수행할 때, 이미 <strong>과거에 했던 경험</strong>을 재사용할 수 있다.</p>
<p>  (=behavior policy는 update되지 않았으므로)</p>
</li>
<li><p>behavior policy가 <strong>exploration</strong>하는 경험을 바탕으로 optimal policy를 학습할 수 있다.</p>
<p>  <em>*trade-off에서 탈출!</em></p>
</li>
<li><p>하나의 behavior policy의 경험을 바탕으로 여러개의 policy들을 학습시킬 수 있다.</p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="42-importance-sampling-for-off-policy">4.2 Importance Sampling for off-policy</h3>
<ul>
<li>Importance Sampling<ul>
<li><em>notation</em><ul>
<li>$X$ : 확률분포 $P$를 따라 sampling되는 확률변수</li>
<li>$Q$ : $P$와는 다른 어떤 확률분포</li>
<li>$f(\cdot)$ : input에 대한 어떤 function</li>
</ul>
</li>
<li><em>proof</em><ol>
<li>$P$를 따라 samping된 $X$에 대한 $f(X)$의 Expectation은 expectation의 definition에 의해 probability $\times$ value의 합으로 표현될 수 있다. </li>
<li>위 수식을 $Q$에 대한 probability로 나타내기 위하여 $Q(X)$를 분자 분모에 동일하게 곱해준다.</li>
<li>위 수식은 이제 $(\text{probability} = Q(X)) \times (\text{value} =  (P(X)/Q(X)) \cdot f(X))$의 형태로 해석할 수 있고, 이는 $Q$<strong>를 따라 samping</strong>된 $X$에 대한 $(P(X)/Q(X)) \cdot f(X)$의 <strong>expectation</strong>으로 나타낼 수 있다!</li>
</ol>
</li>
</ul>
</li>
</ul>
<pre><code>&gt; 💡  두 **확률분포의 비율**만 곱해주면 어떤 확률 분포를 기반으로 구한 값에 대한 기댓값을 다른 확률 분포를 기반으로 구했을 때에 대한 기댓값으로 표현할 수 있다!


$$
\mathbb E_{X \sim P}[f(X)] = \sum P(X)f(X)
$$

$$
=\sum Q(X) \frac{P(X)}{Q(X)}f(X)
$$

$$
=\mathbb E_{X\sim Q}\left[\frac{P(X)}{Q(X)}f(X)\right]
$$</code></pre><ul>
<li><p>Importance Sampling for <strong>Off-policy MC</strong></p>
<ul>
<li><p>$G_t$를 얻을 때까지 수행한 각각이 action이 선택될 <strong>확률의 비</strong>을 계속 곱해준다.</p>
</li>
<li><p>return</p>
<p>  $$</p>
<pre><code>G_t^{\pi/\mu}= \frac{\pi(A_t|S_t)}{\mu(A_t|S_t)} \frac{\pi(A_{t+1}|S_{t+1})}{\mu(A_{t+1}|S_{t+1})} \cdots \frac{\pi(A_T|S_T)}{\mu(A_T|S_T)} G_t</code></pre><p>  $$</p>
</li>
<li><p>Update</p>
<p>  $$</p>
<pre><code>V(S_t) \leftarrow V(S_t) + \alpha\left(G_t^{\pi/\mu} - V(S_t)\right)</code></pre><p>  $$</p>
</li>
<li><p>그러나 MC는 전체 episode가 끝난 다음에 $G_t$를 받아 계산하기 때문에, 끝날때까지 수행한 action의 수가 커지면 커질수록 $G_t$의 앞에 곱해지는 ratio가 너무 많아지기 때문에 실제로 이 방법을 사용해서 계산할 수는 없다. (ratio들의 곱에 대한 variance가 너무 큼)</p>
<p>  <em>→ 그렇다면 1-step해서도 수행가능한 TD는?</em></p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>Importance Sampling for <strong>Off-policy TD</strong>  </p>
<p>TD의 경우에는 앞에 곱해지는 term이 훨씬 적기 때문에 Importance sampling을 이용하여 off-policy method로 학습할 수 있다.</p>
<p>  $$
  V(S_t) \leftarrow V(S_t) + \alpha\left(\frac{\pi(A_t|S_t)}{\mu(A_t|S_t)}(R_{t+1} + \gamma V(S_{t+1})) - V(S_t)\right)
  $$</p>
</li>
</ul>
<br>

<h3 id="43-q-learning">4.3 Q-Learning</h3>
<ul>
<li><p>Q-Learning의 특징</p>
<ul>
<li><p><strong>No</strong> importance sampling required !</p>
</li>
<li><p>Agent가 실행할 실제 next-action은 behaviour policy를 따라 선택된다.
$A_{t+1} \sim \mu(\cdot |S_t)$</p>
</li>
</ul>
</li>
</ul>
<ul>
<li>그러나 Q-function을 update할 때는 target policy를 따라 선택된 action $A&#39;$에 대하여 계산한다!
$A&#39; \sim \pi(\cdot |S_t)$  </li>
</ul>
<pre><code> &gt;  TD는 reward + **추측값**과의 차이를 이용하여 현재값을 update하는데, 추측값에서는 behavior policy를 따르지 않아도 상관없기 때문이다.

- *update (by Bellman Equation!)*

    $$
    Q(S_t, A_t)\leftarrow Q(S_t, A_t) + \alpha(R_{t+1} + \gamma Q(S_{t+1}, A&#39;) - Q(S_t, A_t))
    $$</code></pre>  <br>

<ul>
<li><p>off-policy control with Q-Learning</p>
<ul>
<li><p><em>(both)</em> policy improvement  </p>
</li>
<li><p><em>아이디어*</em> : behavior policy와 target policy 둘다 점차 emprovement가 되지만, behavior policy는 여전히 exploration을 고려할 수 있도록 policy를 설정하고 싶다.  </p>
<ul>
<li><p>target policy : <strong>greedy</strong></p>
<p>  $$</p>
<pre><code>\pi(S_{t+1}) = \argmax_{a&#39;}Q(S_{t+1}, a&#39;)</code></pre><p>  $$</p>
</li>
<li><p>behavior policy : $\epsilon$<strong>-greedy</strong></p>
</li>
</ul>
</li>
<li><p><strong>Q-Learning target</strong></p>
<p>  target policy를 이용하여 선택된 action A’를 greedy policy에 대한 수식으로 바꾸어 표현할 수 있다. </p>
<p>  $$
  R_{t+1} + \gamma Q(S_{t+1}, A&#39;)
  $$
  $$
  =R_{t+1} + \gamma Q(S_{t+1}, \argmax_{a&#39;}Q(S_{t+1}. a&#39;))
  $$
  $$
  =R_{t+1}+\max_{a&#39;}\gamma Q(S_{t+1}, a&#39;)
  $$</p>
</li>
<li><p><strong>Q-Learning <em>Update</em></strong></p>
<p>  $$
  Q(S, A)\leftarrow Q(S, A) + \alpha\left( R + \gamma \max_{a&#39;} Q(S&#39;, a&#39;) - Q(S, A)\right)
  $$</p>
</li>
</ul>
</li>
<li><p>(Theorem) Q-learning Control의 수렴성</p>
<blockquote>
<p>Q-learning control <strong>converges</strong> to the optimal action-value function,</p>
<p>$$
Q(s,a) → q_*(s,a)
$$</p>
</blockquote>
</li>
</ul>
<br>

<h3 id="44-q-learning-algorithm">4.4 Q-Learning Algorithm</h3>
<ul>
<li><p><em>Q-Learning 알고리즘 설명</em></p>
<ol>
<li><p>초기에는 랜덤한 값들로 <strong>Q</strong>-table을 초기화한다. </p>
</li>
<li><p>$Q$에 대한 $\epsilon$-greedy방법을 이용하여 state $S$에서의 action $A$를 고른다.</p>
</li>
<li><p>action $A$를 Agent가 시행하고, 그 결과로 받게되는 reward $R$과 도달한 next-state $S&#39;$에 대한 정보를 받는다.</p>
</li>
<li><p>$Q$에 대한 <strong>greedy방법</strong>을 <em>***이용하여 state $S&#39;$에서의 action $A&#39;$를 *선택한다.</em></p>
</li>
<li><p>Q-Learning Update를 수행한다. </p>
<p> $$
 Q(S, A)\leftarrow Q(S, A) + \alpha\left( R + \gamma \max_{a} Q(S&#39;, a) - Q(S, A)\right)
 $$</p>
</li>
<li><p>current state, action에 $S&#39;$<strong>만</strong> 대입한다. </p>
<p> $\vdots$</p>
</li>
</ol>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/webb-c/post/527ec49f-3374-4ef7-8d38-340624b506d7/image.png" alt=""></p>
<br>

<h3 id="summary"><strong><em>Summary</em></strong></h3>
<blockquote>
<p>Relationship Between DP and TD</p>
</blockquote>
<p>  (<em>where</em> $x\overset{\alpha}{\leftarrow} y \equiv x \leftarrow x + \alpha(y-x)$</p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/4715e806-4b6c-4149-9a1f-cdfbd6291204/image.png" alt="">
<img src="https://velog.velcdn.com/images/webb-c/post/281ce5a0-1bf2-4d50-8b6f-61cbb184ec96/image.png" alt=""></p>
<br>


<h3 id="reference">Reference</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=2pWv7GOvuf0">Introduction to Reinforcement Learning by David Silver</a>  </li>
<li><a href="https://youtube.com/playlist?list=PLpRS2w0xWHTcTZyyX8LMmtbcMXpd3s4TU">팡요랩 : 강화학습의 기초 이론</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강화학습] Model Free Prediction]]></title>
            <link>https://velog.io/@webb-c/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-Model-free-Prediction</link>
            <guid>https://velog.io/@webb-c/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-Model-free-Prediction</guid>
            <pubDate>Mon, 30 Jan 2023 02:59:38 GMT</pubDate>
            <description><![CDATA[<p><em>본 포스팅은 David Silver 교수님의 강화학습 강의와 그 강의를 정리한 팡요랩 강의를 바탕으로 정리한 것입니다.</em></p>
<br>

<p>환경을 알지 못하는 상황에서 던져진 Agent를 이용하여 어떻게 value function을 추정할 것인가? &lt;Prediction 문제&gt;</p>
<h1 id="1-model-free-prediction">1. Model-Free Prediction</h1>
<hr>
<h3 id="11-model-free">1.1 Model-Free?</h3>
<ul>
<li><p>Environment의 MDP에 대한 정보를 알지 못하는 상황</p>
</li>
<li><p><em>MDP를 모른다?</em></p>
<ul>
<li><p>내가 어떤 action을 했을 때 받는 reward $R_{t}$를 사전에 알지 못한다. → 직접 경험해봐야 알 수 있다.</p>
</li>
<li><p>내가 어떤 action을 했을 때 어떤 next-state로 transition할지를 결정하는 transition probability $\mathcal P^a_{ss&#39;}$를 알지 못한다.</p>
<ul>
<li>직접 경험해봐야 어떤 next-state에 도달했는지를 알 수 있다.</li>
<li>많이 경험하더라도 어떤 정확한 “확률 분포”를 알 수 없다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="12-model-free일-때-문제의-종류">1.2 Model-Free일 때 문제의 종류</h3>
<ul>
<li><p><em>prediction 문제</em> : MDP를 모를 때, value function을 구하는 과정</p>
</li>
<li><p><em>control 문제</em> : MDP를 모를 때, 최적의 optimal policy를 찾는 과정 → (next chapter)</p>
</li>
</ul>
<br>

<h1 id="2-monte-carlo-learning">2. Monte-Carlo Learning</h1>
<hr>
<h3 id="21-monte-carlo-policy-evaluation">2.1 Monte-Carlo Policy Evaluation</h3>
<ul>
<li><p><em>Mote-Carlo method?</em></p>
<ul>
<li><p>실제로 구하기 어려운 값을 계산할 때, Agent의 “경험”을 기반으로 구해진 <strong>실제 값</strong>들을 이용하여 추정하는 방법</p>
</li>
<li><p>(in prediction)  </p>
<p>prediction 문제에는 Agent가 따르는 “<strong>policy</strong>”가 정의되어있기 때문에 실제로 agent가 해당 policy를 따라서 environment를 경험하도록 한다. 이를 하나의 episode라고 한다.  </p>
<p>episode를 수행하면서 얻은 각각의 실제 return 값을 저장하고 평균을 구하면, value를 계산할 수 있다.  </p>
</li>
<li><p>→ value function의 definition이 return의 expectation이기 때문!*</p>
</li>
</ul>
<p>$$</p>
<pre><code>  \text{value} = \text{mean Return}</code></pre><p>$$</p>
<ul>
<li>하나의 episode가 완전히 끝나야 return을 알 수 있기 때문에 모든 episode가 반드시 종료된다는 조건을 만족할 때만 적용할 수 있다는 단점을 가진다.  </li>
</ul>
</li>
<li><p>Policy Evaluation의 목적 : agent가 policy $\pi$를 따라 경험한 episode를 이용하여 $v_\pi$를 찾는 것</p>
</li>
<li><p>Monte-Carlo 방법의 적용</p>
<ul>
<li><p>return : total discounted reward</p>
<p>  $$
  G_t = R_{t+1}+\gamma R_{t+2} + \cdots + \gamma^{T-1}R_T
  $$</p>
</li>
<li><p>value function : expected return</p>
<p>  $$
  v_\pi(s) = \mathbb E_\pi[G_t|S_t=s]
  $$</p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="22-mc-update">2.2 MC Update</h3>
<ul>
<li><p>가정 : Agent가 모든 state $s\in \mathcal S$를 방문해야한다.  </p>
<p><em>why? $N(s) → \infin$에 근접해야하기 때문</em></p>
</li>
<li><p>First-visit MC Update : Agent가 해당 state에 처음 방문 했을 때만, 방문횟수를 증가시키고 return을 더한다.</p>
<p>  <em>To evaluate state $s$,</em></p>
<ol>
<li><p>Increment <strong>counter</strong> </p>
<p> $N(s) ← N(s) +1$</p>
</li>
<li><p>Increment total return</p>
<p> $S(s) ← S(s) + G_t$</p>
</li>
<li><p>Mean return </p>
<p> $$
 V(s) = \frac{S(s)}{N(s)}
 $$</p>
<p> ⇒ 큰 수의 법칙; law of large number에 따라 $N(s) → \infin$에 가까워질수록 $V(s) → v_\pi(s)$에 수렴한다.</p>
</li>
</ol>
</li>
<li><p>Every-visit MC Update: Agent가 해당 state에 방문 할 때마다, 방문횟수를 증가시키고 return을 더한다.</p>
<p>  <em>To evaluate state $s$,</em></p>
<ul>
<li><p><code>for</code> <strong>every</strong> time-step $t$ in <code>each</code> <strong>episode</strong></p>
<ol>
<li><p>Increment counter </p>
<p> $N(s) ← N(s) +1$</p>
</li>
<li><p>Increment total return</p>
<p> $S(s) ← S(s) + G_t$</p>
</li>
</ol>
</li>
<li><p>Mean return</p>
<p>  $$
  V(s) = \frac{S(s)}{N(s)}
  $$</p>
<p>  ⇒ 큰 수의 법칙; law of large number에 따라 $N(s) → \infin$에 가까워질수록 $V(s) → v_\pi(s)$에 수렴한다.</p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="23-incremental-mean을-이용한-mc-update">2.3 Incremental Mean을 이용한 MC Update</h3>
<p><em>*한번에 평균을 구하여 업데이트를 하는 것이 아니라 하나의 에피소드가 끝날때마다 조금씩 평균을 업데이트 하는 방법</em></p>
<ul>
<li><p>Incremental Mean</p>
<ul>
<li><p>점진적으로  평균을 구하는 방법</p>
</li>
<li><p>mean $\mu_1, \mu_2$는 sequence $x_1, x_2, \cdots$가 구해짐에 따라 다음과 같이 점진적으로 증가시키면서 update할 수 있다.<br>$$
\mu_k = \frac{1}{k}\sum^k_{j=1}x_j
$$
$$
=\frac{1}{k}\left(x_k + \sum^{k-1}<em>{j=1} x_j \right)
$$
$$=\frac{1}{k}(x_k+(k-1)\mu</em>{k-1})
$$
$$
=\mu_{k-1}+\frac{1}{k}(x_k - \mu_{k-1})
$$</p>
</li>
</ul>
</li>
<li><p>MC Update</p>
<ul>
<li><p>Incremental Mean을 이용하면 $V(s)$를 <strong>episode하나</strong>가 끝난 뒤에 incrementally update할 수 있다.  </p>
</li>
<li><p>for each state $S_t$ with return $G_t$</p>
<p>  $$
  N(S_t) \leftarrow N(S_t) +1
  $$</p>
<p>  $$
  V(S_t) \leftarrow V(S_t)+\frac{1}{N(S_t)}(G_t - V(S_t))
  $$</p>
</li>
</ul>
</li>
</ul>
<pre><code>  → 실제값 $G_t$와 학습중인 value $V(S_t)$의 차이; error만큼 조금씩 업데이트 한다.


- $N(S_t)$를 사용하지 않는 경우
    - $1/N(S_t)$가 아닌, 어떤 고정된 상수 $\alpha$를 곱해서 업데이트 하는 방법
    - $1/N(S_t)$는 자주 방문할 수록 점점 작아지기 때문에 기존 방법은 최신 episode보다 과거의 episode에 대해 더 중요하게 가정했다면, 이 방법에서는 **과거의 episode를 forget하는 효과**를 보일 수 있다.
    - non-stationary problem문제\*에서는 이렇게 update하는 방법이 더 효과적일 수 있다.
    _*non-stationary problem_ : MDP가 일정하지 않고 조금씩 변화하는 문제</code></pre><p>$$
        V(S_t) \leftarrow V(S_t)+\alpha(G_t - V(S_t))
        $$</p>
<br>

<h1 id="3-temporal-difference-learning">3. Temporal-Difference Learning</h1>
<hr>
<h3 id="31-temporal-difference-policy-evaluation">3.1 Temporal-Difference Policy Evaluation</h3>
<ul>
<li><p><strong>Temporal-Difference method의 아이디어</strong></p>
<ul>
<li><p>Agent의 “경험”을 기반으로 추정하는 방법  </p>
</li>
<li><p>TD는 incomplete episode에서도 업데이트 할 수 있다.  </p>
</li>
<li><p>TD updates a <strong>guess</strong> towards a <strong>guess</strong></p>
<blockquote>
</blockquote>
<p> 💡 1-step을 더 진행하면 1-step만큼의 실제정보(=reward)가 반영되기 때문에 더 정확한 value를 가지고 있을 것이다 !</p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>Policy Evaluation의 목적 : agent가 policy $\pi$를 따라 경험한 episode를 이용하여 $v_\pi$를 찾는 것</p>
</li>
<li><p>Temporal-Difference 방법의 적용</p>
<ul>
<li><p>MC policy evaluation : value를 실제 return $G_t$과의 <strong>차이</strong>를 이용해 update</p>
<p>  $$
  V(S_t) \leftarrow V(S_t)+\alpha(G_t - V(S_t))
  $$</p>
</li>
</ul>
</li>
</ul>
<pre><code>- **TD learning algotithm** : value를 **1-step을 더 진행**했을 때, **추정된** return $R_{t+1}+\gamma V(S_{t+1})$과의 **차이**을 이용하여 update
    - TD target : $R_{t+1} + \gamma V(S_{t+1})$
    - TD error : $\delta_t = R_{t+1} + \gamma V(S_{t+1}) - V(S_t)$ ; target과 실제 값의 차이

    $$
    V(S_t) \leftarrow V(S_t)+\alpha(\red{R_{t+1} + \gamma V(S_{t+1})} - V(S_t))
    $$</code></pre><br>

<h3 id="32-n-step-td">3.2 n-step TD</h3>
<p>TD를 적용할 때는 1-step만 진행하고 바로 update를 진행할 수도 있지만, 여러번의 step을 진행하고 나서 그 때의 값을 이용하여 update하는 방법을 사용할 수도 있다. </p>
<p>→ 이때 terminal state까지의 step을 경험한뒤에 update하는 방법은 <strong>MC</strong>와 동일하다!</p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/0671a190-7adc-4f20-a416-0bbb8f920d89/image.png" alt=""></p>
<ul>
<li><p>n-step Return  </p>
<ul>
<li><p>$n=1,2,\cdots, \infin$일 때의 return</p>
<blockquote>
<p>$n$만큼의 실제 reward와, $t+n$번째 step에서의 추정 value function의 합으로 표현한다.</p>
</blockquote>
<ul>
<li>$n=1$ : $G_t^{(1)} = R_{t+1} + \gamma V(S_{t+1})$ <strong>[TD]</strong></li>
<li>$n=2$ : $G_t^{(2)} = R_{t+1} + \gamma R_{t+2} + \gamma ^2V(S_{t+2})$
  $\vdots$<ul>
<li>$n=\infin$ : $G_t^{(\infin)} = R_{t+1} + \gamma R_{t+2} + \cdots + \gamma^{T-1}R_T$ <strong>[MC]</strong>  </li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><strong>n-step return</strong>의 define
$$<pre><code>G_t^{(n)} = R_{t+1} + \gamma R_{t+2} + \cdots + \gamma^{n-1}R_{t+n} + \gamma^n V(S_{t+n})</code></pre>  $$</li>
</ul>
<br>

<ul>
<li><p>n-step TD learning</p>
<ul>
<li><p>n-step TD target : $G^{(n)}_t$</p>
</li>
<li><p>n-step TD error : $\delta_t = G^{(n)}_t - V(S_t)$ ; target과 실제 값의 차이</p>
<p>$$
V(S_t) \leftarrow V(S_t)+\alpha(G_t^{(n)} - V(S_t))
$$</p>
</li>
</ul>
</li>
</ul>
<blockquote>
<p>🍎 TD(0)과 MC사이에는 둘의 효과를 극대화할 수 있는 가장 적절한 sweet-spot이 존재한다.</p>
</blockquote>
<br>

<h3 id="33-forward-view-of-td𝝺">3.3 Forward View of TD(𝝺)*</h3>
<ul>
<li><p>Averaging n-Step Returns</p>
<ul>
<li><p>여러가지의 n-step을 따라 수행해서 구한 return이 있을 때, 각각의 return을 평균한 값을 사용하여 학습해도 된다! (combine)</p>
</li>
<li><p>e.g. 2-step and 4-step return의 average</p>
<p>  $$
  \frac{1}{2}G^{(2)} + \frac{1}{2}G^{(4)}
  $$</p>
</li>
<li><p>$\lambda$<strong>-return</strong> : TD(0)부터 MC까지 진행했을 때의 모든 return의 평균 $G^\lambda_t$</p>
<ul>
<li><p>각 n-step return $G_t^{(n)}$에 대하여 $(1-\lambda)\lambda^{(n-1)}$  weight를 적용하여 계산한다.</p>
<ul>
<li>$n$이 커질수록 $\lambda$가 계속해서 곱해지게 되므로 더 작은 가중치를 가지게 된다.</li>
</ul>
<p>$$
G_t^\lambda = (1-\lambda)\sum^\infin_{n=1}\lambda^{n-1} G_t^{(n)}
$$</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>  <img src="https://velog.velcdn.com/images/webb-c/post/ff1ee847-70bb-4bc2-82dd-fd84fc3fcee1/image.png" alt=""></p>
<pre><code>- *TD($\lambda$) weighting function*

![](https://velog.velcdn.com/images/webb-c/post/8908ed44-5894-439d-a274-9910670ba63d/image.png)</code></pre><ul>
<li><p>Forward-view TD($\lambda$)</p>
<ul>
<li><p>작은 step만이 아닌, 미래를 보고 update한다.</p>
</li>
<li><p>MC에서 사용하는 return도 사용하기 때문에 episode가 끝나야 계산할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/b843c2f4-9d54-4fda-b140-93f2c9806209/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>$$
V(S_t) \leftarrow V(S_t)+\alpha(G_t^{\lambda} - V(S_t))
$$</code></pre><br>

<h3 id="34-backward-view-of-td𝝺">3.4 Backward View of TD(𝝺)*</h3>
<ul>
<li><p>Eligibility trace $E_t(s)$  </p>
<p>어떤 사건이 일어났을 때, 그 사건에 대한 책임이 가장 큰 요소를 더 많이 update하는 방법</p>
<ul>
<li><p>$Q$. 누가 책임이 가장 큰지는 어떻게 판단하는가?</p>
</li>
<li><p><strong>아이디어</strong> : heuristic을 이용하자!</p>
<ul>
<li>Frequency heuristic : 가장 자주 일어난 state의 책임이 크다.</li>
<li>Recency heuristic : 가장 최근에 일어난 state의 책임이 크다.</li>
</ul>
</li>
<li><p><strong>Eligibility trace</strong></p>
<ul>
<li><p>init : $E_0(s) = 0$</p>
</li>
<li><p>time-step $t$에서 어떤 state s에 방문하면, $1$을 더해주고 방문하지 않았을 때는 $t-1$에서의 값에다가 $\gamma\in (0,1)$를 곱해줘서 값을 감소시킨다.</p>
<p>  $$</p>
<pre><code>E_t(s) = \gamma\lambda E_{t-1}(s)+\bold 1(S_t=s) </code></pre><p>  $$</p>
</li>
<li><p>시간에 따른 <em>eligibility trace의 변화</em>
<img src="https://velog.velcdn.com/images/webb-c/post/3eb5435b-9e5d-4b84-8f93-9bc20d90479d/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p><em>TD-error</em></p>
<p>  $$
  \delta_t = R_{t+1} + \gamma V(S_{t+1}) - V(S_t)
  $$</p>
</li>
<li><p>Backward-view TD($\lambda$)</p>
<ul>
<li><p>TD(0)와 TD($\lambda$)의 장점을 모두 가진다.</p>
<ul>
<li>online(매 step)마다 update할 수 있다.</li>
<li>episode가 끝나지 않는 환경에서도 사용할 수 있다.</li>
</ul>
</li>
<li><p>$t$일때의 TD-error에 대해 그 상황에서의 eligibility trace값을 곱한만큼 update한다. → 수학적으로 TD($\lambda$)와 동일함</p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/41caa117-1579-4751-9827-5255e46bc564/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>$$
V(s) \leftarrow V(s)+\alpha \delta_tE_t(s)
$$</code></pre><br>

<h3 id="35-forward-and-baackward-equivalance">3.5 Forward and Baackward Equivalance*</h3>
<ul>
<li><p>TD($\lambda$) and TD(0)</p>
<ul>
<li><p>$\lambda=0$일 때, 오직 current state만이 update된다.</p>
<ul>
<li>eligibility trace</li>
<li>$E_t(s) = \bold 1(S_t=s)$</li>
</ul>
</li>
<li><p>TD(0) update</p>
<p> $$</p>
<pre><code>V(S_t) \leftarrow V(S_t)+\alpha \delta_t</code></pre><p>  $$</p>
</li>
</ul>
</li>
<li><p>TD($\lambda$) and TD(1) and <strong>MC</strong></p>
<ul>
<li><p>$\lambda=1$일 때, episode의 끝까지 고려하게된다.</p>
</li>
<li><p>Theorem</p>
<blockquote>
<p>The sum of offline updates is identical for forward-view and backward-view TD($\lambda$)</p>
<p>$$
\sum^T_{t=1} \alpha\delta_tE_t(s) = \sum^T_{t=1} \alpha \left(G_t^\lambda - V(S_t)\right) \bold 1 (S_t=s)
$$</p>
</blockquote>
</li>
<li><p>eligibility trace</p>
<p>  $$
  E_t(s) = \gamma\lambda E_{t-1}(s)+\bold 1(S_t=s) 
  $$</p>
<p>  $$
  =\begin{cases} 0 &amp; \text{if }t&lt;k \ \gamma^{t-k} &amp; \text{if } t\ge k \end{cases}
  $$</p>
</li>
<li><p>update : online</p>
<p>  $$
  \sum^{T-1}<em>{t=1} \alpha\delta_tE_t(s) = \alpha\sum^{T-1}</em>{t=k}\lambda^{t-k}\delta_t =\alpha \left(G_t - V(S_k)\right) 
  $$</p>
</li>
<li><p>total error</p>
<p>  $$
  \delta_k + \gamma\delta_{k+1}+ \gamma^2\delta_{k+2} + \cdots+ \gamma^{T-1-k}\delta_{T-1}
  $$</p>
</li>
<li><p><strong>MC error의 표현</strong>  </p>
<p>$\delta_k + \gamma\delta_{k+1}+ \gamma^2\delta_{k+2} + \cdots+ \gamma^{T-1-k}\delta_{T-1}$</p>
<p>$=R_{t+1} + \gamma V(S_{t+1})-V(S_t)$</p>
<p>$+ \gamma R_{t+2} + \gamma^2 V(S_{t+2}) - \gamma V(S_{t+1})$</p>
<p>$+ \gamma^2 R_{t+3} + \gamma^3 V(S_{t+3}) - \gamma^2 V(S_{t+2})$</p>
<p>$\ \ \ \vdots$</p>
<p>$+ \gamma^{T-1-t} R_{T} + \gamma^{T-t} V(S_{T}) - \gamma^{T-1-t} V(S_{T-1})$</p>
<p>$=R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \cdots + \gamma^{T-1-t} R_T - V(S_t)$</p>
<p>$=G_t - V(S_t)$</p>
</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>Forward and Backwards TD($\lambda$)</p>
<ul>
<li><p>For general $\lambda$, TD errors also telescope to $\lambda$-error, $G_t^\lambda - V(S_t)$  </p>
<p>$G_t^\lambda - V(S_t)$  </p>
<p>$= -V(S_t) + (1-\lambda)\lambda^0 (R_{t+1} + \gamma V(S_{t+1}))$  </p>
</li>
</ul>
</li>
</ul>
<pre><code> $+ \ (1-\lambda)\lambda^1 (R_{t+1} + \gamma R_{t+2} + \gamma^2 V(S_{t+2}))$

 $+ \ (1-\lambda)\lambda^2 (R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3}  + \gamma^3 V(S_{t+3}))$

 $+\ \cdots$

 $= -V(S_t) + (\gamma\lambda)^0 (R_{t+1} + \gamma V(S_{t+1})-\gamma\lambda V(S_{t+1}))$

 $+\ (\gamma\lambda)^1 (R_{t+2} + \gamma V(S_{t+2})-\gamma\lambda V(S_{t+2}))$

 $+\ (\gamma\lambda)^2 (R_{t+3} + \gamma V(S_{t+3})-\gamma\lambda V(S_{t+3}))$

 $+\ \cdots$

 $= (\gamma\lambda)^0 (R_{t+1} + \gamma V(S_{t+1}) - V(S_t))$

 $+\ (\gamma\lambda)^1 (R_{t+2} + \gamma V(S_{t+2})-V(S_{t+1}))$

 $+\ (\gamma\lambda)^2 (R_{t+3} + \gamma V(S_{t+3})-V(S_{t+2}))$

 $+\ \cdots$

 $$
    =\delta_t + \gamma\lambda\delta_{t+1} + (\gamma\lambda)^2\delta_{t+2} + \cdots
 $$</code></pre><br>


<p><em>TD 총정리</em>*  
<img src="https://velog.velcdn.com/images/webb-c/post/402acc0b-911f-4ad0-b29f-f2312966cc58/image.png" alt=""></p>
<br>

<h1 id="4-mc-vs-td">4. MC vs. TD</h1>
<hr>
<h3 id="41-non-episodic-mdp">4.1 Non Episodic MDP</h3>
<ul>
<li><p>TD는 final outcome이 산출되기 <strong>전에</strong> 학습할 수 있다.</p>
<ul>
<li>TD는 각각의 모든 step에서 online으로 학습이 가능하다.</li>
<li>MC는 반드시 episode의 끝에 도달할 때까지 기다리고 return을 알게되면 그때 학습한다.</li>
</ul>
</li>
<li><p>TD는 final outcome <strong>없이도</strong> 학습할 수 있다.</p>
<ul>
<li>TD는 non-teriminatinh 환경에서도 적용할 수 있다.</li>
<li>MC는 오직 episodic(=terminating)한 환경에서만 적용할 수 있다.</li>
</ul>
</li>
</ul>
<br>

<h3 id="42-bias--variance-trade-off">4.2 Bias / Variance trade-off</h3>
<ul>
<li><p>bias와 variance</p>
<ul>
<li><p><strong>bias</strong></p>
<ul>
<li><p>return $G_t$는 $v_\pi(S_t)$에 대한 unbiased estimate이다.  </p>
<p>즉, value function의 정의에 따라 $G_t$를 계속 sampling하면 결국 $v_\pi(S_t)$에 수렴할 것이다. </p>
<ul>
<li><strong>true</strong> TD target $R_{t+1}+\gamma v_\pi(S_{t+1})$은 $v_\pi(S_t)$에 대한 unbiased estimate이지만, 우리는 $v_\pi$의 실제 값을 알지 못한 상태에서 계산하기 때문에 TD target은 $R_{t+1} + \gamma V(S_{t+1})$은 <strong>biased</strong> estimate이다.</li>
</ul>
<p>추정값을 이용하여 갱신하기 때문에 발생하는 biase가 존재하고 따라서 수없이 많이 반복하더라도 TD target이 실제 $v_\pi(S_t)$에 정확히 수렴하리라는 보장은 가질 수 없다.  </p>
</li>
</ul>
</li>
<li><p><strong>variance</strong></p>
<ul>
<li><p>TD target은 반드시 return보다 더 작은 variance를 가진다.</p>
</li>
<li><p><em>why?</em><br> Return은 수많은 랜덤한 action, transition, reward를 이용하여 계산되지만 TD target은 딱 한번의 랜덤한 action, transition, reward에 의해 계산되기 때문이다.<br> → 1-step에서 발생할 수 있는 랜덤성은 episode가 끝날 때까지 발생할 수 있는 랜덤성보다 훨씬 작다.</p>
</li>
<li><p>variance가 클수록 그 확률분포에서 어떤 것을 sampling 했을 때 뽑힌 sample들에대한 편차가 클 수 있다. → 정확성이 떨어진다.</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>MC는 high variance, zero bias</p>
<ul>
<li>(function approximation$^{[1]}$에서도) 수렴성이 좋다.</li>
<li>initial value에 그다지 민감하지 않다.</li>
<li>이해하고 사용하기 간단하다.</li>
</ul>
</li>
<li><p>TD는 low variance, some bias</p>
<ul>
<li>MC보다 대부분 더 효율적이다.</li>
<li>TD(0)은 $v_\pi(s)$로 수렴하긴 하지만, function approzimation에서는 수렴함이 보장되지 않는다.</li>
<li>MC에 비하여 더 initial value에 민감하다.</li>
</ul>
</li>
</ul>
<br>

<h3 id="43-batch-mc-and-td">4.3 Batch MC and TD</h3>
<ul>
<li><p>MC와 TD의 수렴성</p>
<ul>
<li><p>$\infin$번 experience할 수 있다면 $V(s) → v_\pi(s)$로 반드시 수렴한다는 것은 알고 있다.</p>
</li>
<li><p>그런데 만약 k개의 제한된 episode만을 가지고 있을 때, MC와 TD는 수렴하는가?</p>
<p>  $s^1_1, a^1_1, r^1_2, \cdots, s^1_{T_1}$</p>
<p>  $\vdots$</p>
<p>  $s^k_1, a^k_1, r^k_2, \cdots, s^k_{T_k}$</p>
</li>
</ul>
</li>
<li><p><em>AB Example</em></p>
<ul>
<li><p>problem</p>
<ul>
<li><p>state : A, B</p>
</li>
<li><p>아래의 8개의 episode에 대한 정보만을 알고 있을 때 $V(A), V(B)$의 값은?</p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/a7eefe33-d60e-428c-b291-d9dd3a75b96f/image.png" alt=""></p>
</li>
</ul>
</li>
<li><p>MC와 TD에서의 value</p>
<ul>
<li><p>MC : $V(A)= 0$
전체 episode에서 A에 도달한 경우는 1번인데 그때의 return이 0이므로</p>
</li>
<li><p>TD : $V(A) = 0.75$
$V(A)$는 reward $0+V(B)$, 즉 V(B)의 value를 이용하여 갱신되기 때문이다.</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>certainty Equivalence</strong></p>
<ul>
<li><p>MC : <strong>minimum MSE</strong></p>
<p>  $$
  \sum^K_{k=1}\sum^{T_k}_{t=1} (G_t^k - V(s^k_t))^2
  $$</p>
</li>
<li><p>TD(0) : <strong>max likelihood Markov model</strong></p>
<p> $$
  \hat{\mathcal P}^a_{s, s&#39;} = \frac{1}{N(s,a)}\sum^K_{k=1} \sum^{T_k}<em>{t=1} \bold 1(s^k_t, a^k_t, s^k</em>{t+1} = s, a, s&#39;)
 $$</p>
<p> $$
  \hat{\mathcal R}^a_{s} = \frac{1}{N(s,a)}\sum^K_{k=1} \sum^{T_k}_{t=1} \bold 1(s^k_t, a^k_t = s, a)r^k_t
 $$</p>
<p>→ 한정된 개수의 episode를 이용할 때는 MC와 TD를 사용하여 계산했을 때 value에 차이가 발생한다.</p>
</li>
</ul>
</li>
</ul>
<pre><code>*따라서,*  

- TD는 Markov property를 사용하여 value를 추측한다. → Markov 환경에서 더 효율적이다.
- MC는 Markov property를 사용하지 않고 value를 추측한다. → non-Markov 환경에서 더 효율적이다.</code></pre><br>

<h3 id="44-more-difference">4.4 <em>More difference</em></h3>
<ul>
<li><p>Backup 방법의 차이</p>
<ul>
<li><p>Monte-Carlo Backup : <strong>DFS</strong></p>
<p>  $$
  V(S_t) \leftarrow V(S_t) + \alpha(G_t- V(S_t))
  $$</p>
<p>  <img src="https://velog.velcdn.com/images/webb-c/post/c235d9a2-b64f-4f2e-89c9-35723073bb37/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- Temporal-Difference Backup : (1-step) &lt;**Bootstraping**&gt;

    $$
    V(S_t) \leftarrow V(S_t) + \alpha(R_{t+1}+\gamma V(S_{t+1})- V(S_t))
    $$

    ![](https://velog.velcdn.com/images/webb-c/post/f46dc542-6d7e-4812-8480-52751c64012c/image.png)


- Dynamic Programming Backup : BFS

    $$
    V(S_t) \leftarrow V(S_t) + \alpha(R_{t+1}+\gamma V(S_{t+1})- V(S_t))
    $$

    ![](https://velog.velcdn.com/images/webb-c/post/1e0867ac-6b3f-4e6d-82b5-473c2a0a1b7c/image.png)</code></pre><ul>
<li>Bootstrapping &amp; Sampling<ul>
<li><strong>Bootstrapping</strong> : update involves an estimate <depth><ul>
<li>DP : bootstraps</li>
<li>MC : does not bootstraps</li>
<li>TD : bootstraps</li>
</ul>
</li>
<li><strong>Sampling</strong> : update samples an expectation ****<width><ul>
<li>DP : does not sample (sampling을 하지않고 가능한 모든 action에 대한 값을 이용한다.</li>
<li>MC : samples</li>
<li>TD : samples</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><em>(bootstrapping &amp; sampling 관점에서) RL method의 총정리</em>*</p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/30fd94e1-1fde-43e6-99a2-c0fba5b886bd/image.png" alt=""></p>
<br>

<h3 id="45-with-example">4.5 with Example</h3>
<p><em>Random Walk Example</em></p>
<ul>
<li><p>problem : policy를 평가</p>
<ul>
<li><p>state : A, B, C, D, E</p>
</li>
<li><p>teminal state : ▪️</p>
</li>
<li><p>policy : left / right 랜덤하게 움직인다.</p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/a8fde6bc-fad9-40b4-a714-d6d1cce90b7c/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>MC vs. TD (with. $\alpha$ 값에 따른 변화)</p>
<p>  → error는 실제 value function과의 RMS로 표현</p>
<p>  <img src="https://velog.velcdn.com/images/webb-c/post/ce67cf02-1196-468b-9b87-12c8c40ec960/image.png" alt=""></p>
</li>
</ul>
<br>

<h3 id="reference">Reference</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=2pWv7GOvuf0">Introduction to Reinforcement Learning by David Silver</a>  </li>
<li><a href="https://youtube.com/playlist?list=PLpRS2w0xWHTcTZyyX8LMmtbcMXpd3s4TU">팡요랩 : 강화학습의 기초 이론</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강화학습] Planning by Dynamic Programming]]></title>
            <link>https://velog.io/@webb-c/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-Planning-by-Dynamic-Programming</link>
            <guid>https://velog.io/@webb-c/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-Planning-by-Dynamic-Programming</guid>
            <pubDate>Sat, 28 Jan 2023 14:56:33 GMT</pubDate>
            <description><![CDATA[<p><em>본 포스팅은 David Silver 교수님의 강화학습 강의와 그 강의를 정리한 팡요랩 강의를 바탕으로 정리한 것입니다.</em></p>
<br>

<p><em><strong>Planning</strong>이란?</em></p>
<p>→ Environment; MDP를 알고 있을 때 더 나은 policy를 찾아나가는 과정</p>
<h1 id="1-dynamic-programming">1. Dynamic Programming</h1>
<hr>
<h3 id="11-dynamic-programming-이란">1.1 Dynamic Programming 이란?</h3>
<blockquote>
<p>⚙ <em>Dynamic Programming</em></p>
</blockquote>
<ul>
<li><strong>Dynamic</strong> : sequential or temporal component to the problem</li>
<li><strong>Programming</strong> : optimising a “program”</li>
</ul>
<p>하나의 큰 문제를 바로 해결하기 힘들 때, 여러개의 작은 부분 문제들로로 문제를 나누고 부분 문제들의 해를 모두 구한 뒤에 그 해를 이용해서 더 큰 크기의 부분 문제를 해결하는 과정을 거쳐 문제를 해결하는 하나의 방법론</p>
<br>

<h3 id="12-dynamic-programming의-요구조건">1.2 Dynamic Programming의 요구조건</h3>
<ul>
<li><p>Optimal substructure : 하나의 큰 문제에 대한 solution은 여러개의 작은 부분문제들의 solution으로 분할 할 수 있어야 한다.  </p>
</li>
<li><p>Overlapping subproblems : 어떤 부분문제의 해는 상위의 부분문제를 해결하기 위하여 여러번 사용될 수 있다. 따라서 보통 부분문제의 해들을 저장해두고 가져와서 이용한다.  </p>
</li>
<li><p>⇒ Markov decision processes satisfy both properties!*  </p>
<ul>
<li><p>Bellman equation은 재귀적으로 표현된다.  </p>
</li>
<li><p>value function이 계산한 value는 저장해두었다가 Policy를 평가/갱신하기 위해 사용된다.</p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="13-planning-by-dp">1.3 Planning by DP</h3>
<ul>
<li><p>DP를 이용하여 planning을 수행할 때는, <strong>MDP에 대한 모든 정보$^{[1]}$를 알고있다</strong>고 가정한다.
<em>[1] MDP의 정보</em>  </p>
<ol>
<li>state transition probability</li>
<li>reward</li>
</ol>
</li>
<li><p>강화학습 문제의 종류에 따른 표현</p>
<ul>
<li><p>prediction    </p>
<blockquote>
<p>MDP와 policy가 주어졌을 때, 그 policy$^{[2]}$를 따라 Agent가 수행했을 때의 value function을 계산하는 문제  </p>
<ul>
<li>input : <strong>MDP</strong> $&lt;\mathcal S, \mathcal A, \mathcal P, \mathcal R, \gamma&gt;,\ \pi$ (=<em>or</em> $&lt;\mathcal S, \mathcal P^\pi, \mathcal R^\pi, \gamma&gt;$)  <ul>
<li>output : value function $v_\pi$  </li>
</ul>
</li>
</ul>
</blockquote>
<p><em>[2] 이때 주어지는 Policy는 optimal policy여야하는 조건같은건 가지고 있지 않는다.</em></p>
</li>
<li><p><strong>control</strong>  </p>
<blockquote>
<p>MDP가 주어졌을 때, optimal value function, policy를 찾는 문제  </p>
<ul>
<li>input : <strong>MDP</strong> $&lt;\mathcal S, \mathcal A, \mathcal P, \mathcal R, \gamma&gt;$  </li>
<li>output : optimal value function $v_<em>$, optimal policy $\pi_</em>$</li>
</ul>
</blockquote>
</li>
</ul>
</li>
</ul>
<br>

<h1 id="2-policy-evaluation">2. Policy Evaluation</h1>
<blockquote>
<p>Policy가 고정되어있을 때, value-function을 게산하는 과정</p>
</blockquote>
<hr>
<h3 id="21-iterative-policy-evaluation">2.1 Iterative Policy Evaluation</h3>
<ul>
<li><p><em>문제 정의</em></p>
<ul>
<li><p><em>problem</em> : 주어진 어떤 policy $\pi$를 평가하는 것, 즉 policy를 따랐을 때의 value function $v_\pi(s)$를 찾는 것을  목적으로 한다. <strong>[prediction]</strong>  </p>
</li>
<li><p><em>solution</em> : Bellman expectation equation을 이용하여 iterative한 방법을 적용한다.  </p>
<p>$v_{1;\ init} → v_2 → \cdots → v_\pi$</p>
</li>
</ul>
</li>
<li><p>synchronous backup  </p>
<ol>
<li><p><code>each</code> iteration k+1</p>
<ol start="2">
<li><p><code>for</code> <strong>all</strong> states $s \in \mathcal S$</p>
<ol start="3">
<li><p>update $v_{k+1}(s)$ from $v_k (s&#39;)$ </p>
<p>→ 전 단계 $k$에서의 value f를 이용하여 현재 단계 $k+1$에서의 value를 갱신한다.</p>
<p>(<em>where</em> $s&#39;$는 $s$에서 갈 수 있는 가능한 모든 state)</p>
</li>
</ol>
</li>
</ol>
<p>→ 이 과정을 반복하면 $v_\pi(s)$에 수렴하게 된다.</p>
</li>
</ol>
</li>
</ul>
<br>


<ul>
<li><p>Bellman Expectation Equation  </p>
<ul>
<li>$k+1$ 단계에서는 $k$단계에서보다 더 정확한 value 값을 가지게 하고 싶어한다.</li>
<li>evaluate하는 state $s$에서 갈 수 있는 가능한 모든 state $s&#39;$에서의 value를 사용하여 갱신해준다.</li>
<li>next state의 value일수록 지금까지 policy를 따라 진행하면서 <strong>실제로 얻은 정확한 reward $r$</strong>의 값이 더 많이 존재하기 때문에 점점더 정확한 value를 가지게 된다.</li>
<li>따라서 가장 초기 init 상태일 때의 value function의 값은 모두 정확하지 않더라도 정확한 값인 “reward”가 고려되기 때문에 최종적으로 $v_\pi(s)$에 수렴할 수 있게 된다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/webb-c/post/f5b87174-1d6d-49c4-ae43-c9ca50cb383d/image.png" alt=""></p>
<p>$$
v_{k+1}(s) = \sum_{a\in \mathcal A} \pi(a|s) \left( \mathcal R^a_s + \gamma \sum_{s&#39;\in \mathcal S} \mathcal P^a_{ss&#39;}v_k(s&#39;)\right)
$$</p>
<p>$$
\bold v _{k+1} = \mathcal R^{\pi} + \gamma \mathcal P^\pi \bold v _k
$$</p>
<br>

<h3 id="22-example-with-gridword">2.2 Example with Gridword</h3>
<ul>
<li><p><em>*Gridworld for prediction</em>  </p>
<ul>
<li><p>MDP</p>
<ul>
<li><p>1~14는 nonterminal state이고, 왼쪽 위 또는 오른쪽 아래에 하나의 terminal state를 가진다.</p>
</li>
<li><p>$\gamma = 1$ (미래지향적)</p>
</li>
<li><p>terminal state에 도달하기 전까지 항상 $-1$의 reward를 받는다.</p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/8a70fc63-4286-4bd9-a5f9-39bb5a5ccbf4/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>random policy  <pre><code>$\pi(n|\cdot)=\pi(s|\cdot)=\pi(w|\cdot)=\pi(e|\cdot)=0.25$</code></pre></li>
</ul>
<ul>
<li><p>Iterative Policy Evaluation</p>
<ul>
<li><p>ex) $k=0$
일 때 6번 state의 갱신과정</p>
<p>$$
  v_{1}(6) = \sum_{a\in \mathcal {n, s, w, e}} 0.25 \times \left( -1 + 1\times  \sum_{s&#39;\in \mathcal {2, 5, 7, 10}} \mathcal 1\times 0\right) = -1
$$</p>
</li>
</ul>
</li>
</ul>
<pre><code>![](https://velog.velcdn.com/images/webb-c/post/cbef3f51-3e3c-455e-9d97-909eaea67219/image.png)</code></pre><p>   <img src="https://velog.velcdn.com/images/webb-c/post/4ee53735-459f-4846-953d-f2251da9c9f1/image.png" alt=""></p>
<pre><code>&gt; 🤖 (이 예시에서는) 멍청한 policy를 기반으로 value function의 값을 계산하였는데, 계산된 value function에 대하여 value가 $\max$가 되게하는 action만 항상 **그리디하게** 선택하는 policy를 따랐더니 optimal policy가 되었다!

→ 더 나은 policy를 찾을 수 있다. **[policy 개선의 아이디어]**</code></pre><br>

<h1 id="3-policy-iteration">3. Policy Iteration</h1>
<blockquote>
<p>Iterative한 방법을 사용하여 policy기반으로 최적의 policy를 찾는 과정</p>
</blockquote>
<hr>
<h3 id="31-policy-개선의-원리">3.1 Policy 개선의 원리</h3>
<ul>
<li><p><strong>Evaluate</strong> the policy <em>(=policy evaluation)</em></p>
<p>  $$
  v_\pi(s) = \mathbb [R_{t+1} + \gamma R_{t+2} + \cdots | S_t = s]
  $$</p>
</li>
<li><p><strong>Improve</strong> the policy</p>
<p>  $$
  \pi&#39; = \text{greedy} (v_\pi)
  $$</p>
<p>  ⇒ Evaluate와 Improve를 반복해서 수행하면 점점 policy가 optimal policy $\pi*$에 수렴하게 된다!</p>
</li>
</ul>
<br>

<h3 id="32-policy-iteration">3.2 Policy Iteration</h3>
<blockquote>
<p>Policy 개선 과정</p>
<ol>
<li><p>초기 policy $\pi$를 평가 [evaluation]</p>
</li>
<li><p>계산된 value function에 대하여 greedy하게 선택하는 새로운 policy $\pi&#39;$로 policy를 개선 [improvement]</p>
</li>
<li><p>개선된 policy $\pi&#39;$를 다시 평가 [evaluation]</p>
<p> $\cdots$</p>
</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/webb-c/post/9b2c9d96-1dee-410e-89d9-8a41fcc2b441/image.png" alt=""></p>
<br>

<h3 id="33-proof-of-policy-improvement">3.3 proof of policy Improvement</h3>
<ul>
<li><p>$\text{Q}_1$. greedily하게 행동하는 새로운 policy는 항상 이전의 policy보다 <strong>개선되는가?</strong></p>
<ul>
<li><p>어떤 deterministic$^{[1]}$한 policy, $a = \pi(s)$가 있다고 하자.  </p>
<p><em>[1] 어떤 state에서 어떤 action을 할 지 명확하게 정의된 policy → 확률 분포가 아님</em></p>
</li>
<li><p>greedily하게 행동하는 새로운 policy를 정의함으로서 우리는 policy를 <strong>improve</strong>시킬 수 있다</p>
<p>  $$
  \pi&#39;(s) = \arg\max_{a\in \mathcal A} q_{\pi} (s,a)
  $$</p>
</li>
<li><p><strong>one-step에 대한 policy improve 증명</strong></p>
<p>  <em>*notation</em></p>
<p>  $q_\pi(s, \pi(s))$ : $\pi$를 따라서 1-step을 수행하고 그 이후로도 계속 \pi를 따랐을 때의 action-value</p>
<p>  $q_\pi(s, \pi&#39;(s))$ : $\pi&#39;$를 따라서 1-step을 수행하고 그 이후에는 \pi를 따랐을 때의 action-value </p>
<ul>
<li><p>$s$에서의 state-value는 $s$에서 policy에 의해 결정된 action $a = \pi(s)$을 수행했을 때의 action-value와 동일하다. (action-value function의 정의상 자명함)</p>
</li>
<li><p>policy가 결정한 action을 했을 때의 value는 value가 최대가 되도록하는 action을 했을 때의 value보다는 절대로 크지는 않을 것이다.</p>
</li>
<li><p>그런데 greedily policy의 정의에 따라 이 값은 greedily policy에 의해 결정된 action $a= \pi&#39;(s)$을 수행했을 때의 action-value와 동일하다.</p>
<p>  $$
  q_{\pi} (s, \pi&#39;(s)) = \max_{a\in\mathcal A} q_{\pi} (s,a) \ge q_{\pi} (s, \pi(s)) = v_\pi(s)
  $$</p>
<p>  ⇒ <strong>one</strong>-<strong>step</strong>이라도 $\pi&#39;$를 따라 진행했을 때의 action-value가 기존 policy를 따랐을 때의 value보다 항상 같거나 크다.</p>
</li>
</ul>
</li>
<li><p><strong>value function에 대한 증명</strong></p>
<ul>
<li><p>one-step일 때 증명한 것에 따라서 $v_\pi(s) ≤ q_\pi(s, \pi&#39;(s))$이다. $-\ (1)$</p>
</li>
<li><p>Q-function의 정의에 의하여 아래와 같이 expectation 공식으로서 나타낼 수 있다.</p>
<p>  $$
  v_\pi(s) \le q_\pi(s, \pi&#39;(s)) = \mathbb E_{\pi&#39;}[R_{t+1} + \gamma v_{\pi} (S_{t+1}) | S_t = s]
  $$</p>
</li>
<li><p>one-step일 때 증명한 내용 (1)을 다시 적용하면 아래와 같이 표현할 수 있다.</p>
<p>  $$
  \le \mathbb E_{\pi&#39;} [R_{t+1} + \gamma q_\pi(S_{t+1}, \pi&#39;(S_{t+1}))|S_t=s]
  $$</p>
</li>
<li><p>Q-function에 대해 한번의 step을 더 진행하여 bellman equation처럼 재귀적으로 아래와 같이 표현할 수 있다.</p>
<p>  $$
  \le \mathbb E_{\pi&#39;} [R_{t+1} + \gamma R_{t+2}+\gamma^2 q_\pi(S_{t+2}, \pi&#39;(S_{t+2}))|S_t=s]
  $$</p>
</li>
<li><p>재귀적인 과정을 반복하면 결국 value-function에 정의에 의하여 $v_\pi&#39;(s)$로 표현된다.</p>
<p>  $$</p>
<p>  \le \mathbb E_{\pi&#39;} [R_{t+1} + \gamma R_{t+2}+\cdots |S_t=s] = v_{\pi&#39;}(s)
  $$</p>
<p>  ⇒ 따라서 모든 state에서 $\pi&#39;$를 따랐을 때의 value가 $\pi$를 따랐을 때의 value보다 높기 때문에 policy는 항상 improvement 된다는 것을 보일 수 있다. </p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>$\text{Q}_2$. 개선된 policy는 최종적으로 <strong>optimal</strong>에 수렴하는가?</p>
<ul>
<li><p>아래 등식이 성립하는 상황이라면 어떤 policy에 수렴했다고 말할 수 있다.</p>
<p>  $$
  q_{\pi} (s, \pi&#39;(s)) = \max_{a\in\mathcal A} q_{\pi} (s,a) = q_{\pi} (s, \pi(s)) = v_\pi(s)
  $$</p>
</li>
<li><p>bellman optimality equation을 적용할 수 있는 상황이다.</p>
<ul>
<li><p>$v_\pi(s) = v_*(s)$ for all $s \in \mathcal S$</p>
</li>
<li><p>따라서 $\pi$는 optimal policy이다.</p>
<p>  $$
  v_\pi(s) = \max_{a\in \mathcal A} q_\pi(s, a)
  $$</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="34-modified-policy-iteration">3.4 Modified Policy Iteration</h3>
<blockquote>
<p>💬 Q. policy iteration을 수행할 때, evaluation단계에서 $v_\pi$가 수렴할 때까지 반드시 진행해야하는가?</p>
</blockquote>
<p><em>*여러가지 아이디어</em></p>
<ul>
<li>$\infin$보다 조금 더 일찍 종료할 수는 없을까?</li>
<li>$k=3$과 같이 iteration횟수를 정해두고 수행하면 안될까?</li>
</ul>
<p>A. $v_\pi$가 수렴할 때까지 진행하지 않아도 된다!</p>
<p>극단적인 경우, 단 한번만 policy evaluation을 진행하고 바로 policy improvement 단계로 넘어가도된다.</p>
<p>정확히 수렴하지는 않았지만 달라진 policy에 대한 value가 업데이트 되었기 때문!</p>
<br>

<h1 id="4-value-iteration">4. Value Iteration</h1>
<blockquote>
<p><strong>policy가 존재하지 않을 때</strong> Iterative한 방법을 사용하여 value 기반으로 최적의 value function을 찾는 과정</p>
</blockquote>
<hr>
<h3 id="41-principle-of-optimality--theorem">4.1 Principle of Optimality : Theorem</h3>
<ul>
<li><p>optimal policy의 component</p>
<ul>
<li>첫번째로 optimal action $A_*$를 수행한다.</li>
<li>이후 그 다음 state $S&#39;$에서 다시 optimal policy를 따라 진행한다.</li>
</ul>
</li>
<li><p>Principle of Optimality : Theorem</p>
<blockquote>
<p>A policy $\pi(a|s)$ achieves the optimal value from state $s$, $v_\pi(s) = v_<em>(s)$, *if and only if</em></p>
<ul>
<li>For any state $s&#39;$ reachable from s</li>
<li>$\pi$ achieves the optimal value from state $s&#39;$, $v_\pi(s&#39;) = v_*(s&#39;)$</li>
</ul>
</blockquote>
</li>
</ul>
<br>

<h3 id="42-deterministic-value-iteration">4.2 Deterministic Value Iteration</h3>
<ul>
<li><p>value iteration; DP의 도입</p>
<ul>
<li><p>$v_<em>(s&#39;)$를 구하는 문제는 여러개의 *</em>subproblem**들로 표현할 수 있다.</p>
</li>
<li><p><em>subproblem</em></p>
<p>  one-step lookahead를 통하여 $v_*(s)$를 구할 수 있다. [Bellman Optimality Equation]</p>
<p>  $$
  v_<em>(s) \leftarrow \max_{a\in\mathcal A} \left(\mathcal R^a_s + \gamma \sum_{s&#39; \in \mathcal S} \mathcal P^a_{ss&#39;} v_</em>(s&#39;)\right)
  $$</p>
</li>
</ul>
</li>
</ul>
<br>
### 4.3 Example with Gridword

<ul>
<li><p>문제 : 최단거리를 찾는 문제</p>
<ul>
<li><p>reward는 항상 -1</p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/51a47d42-6da4-4cf4-806c-a6a1027bc9e7/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="44-value-iteration">4.4 Value Iteration</h3>
<ul>
<li><p><em>문제 정의</em></p>
<ul>
<li><p><em>problem</em> : optimal policy $\pi$를 찾는 것을 목적으로 한다.  </p>
</li>
<li><p><em>solution</em> : Bellman <strong>optimality</strong> equation을 이용하여 iterative한 방법을 적용한다.</p>
<p>  $v_{1;\ init} → v_2 → \cdots → v_*$</p>
</li>
<li><p>synchronous backup</p>
<ol>
<li><p><code>each</code> iteration k+1  </p>
<ol start="2">
<li><p><code>for</code> <strong>all</strong> states $s \in \mathcal S$  </p>
<ol start="3">
<li>update $v_{k+1}(s)$ from $v_k (s&#39;)$ </li>
</ol>
<p>→ 전 단계 $k$에서의 value f를 이용하여 현재 단계 $k+1$에서의 value를 갱신한다.</p>
<p>(<em>where</em> $s&#39;$는 $s$에서 갈 수 있는 가능한 모든 state)</p>
</li>
</ol>
<p>→ 이 과정을 반복하면 $v_\pi(s)$에 수렴하게 된다.</p>
</li>
</ol>
</li>
<li><p><strong>policy가 주어지지 않는다.</strong></p>
</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>Bellman optimality Equation</p>
<p>  <img src="https://velog.velcdn.com/images/webb-c/post/6655ecb0-4747-447e-b297-5e79088ab5c4/image.png" alt=""></p>
</li>
</ul>
<pre><code>$$
v_{k+1}(s) = \max_{a\in \mathcal A} \left( \mathcal R^a_s + \gamma \sum_{s&#39;\in \mathcal S} \mathcal P^a_{ss&#39;}v_k(s&#39;)\right)
$$

$$
\bold v_{k+1} = \max_{a\in\mathcal A} \mathcal R^{\pi} + \gamma \mathcal P^\pi \bold v_k
$$</code></pre><br>


<h4 id="model을-알-때-prediction과-control문제의-해결방법">model을 알 때, prediction과 control문제의 해결방법</h4>
<table>
<thead>
<tr>
<th>문제</th>
<th>사용하는 벨만 방정식</th>
<th>알고리즘</th>
</tr>
</thead>
<tbody><tr>
<td>Prediction</td>
<td>Bellman Expectation Equation</td>
<td>Iterative</td>
</tr>
<tr>
<td>Policy Evaluation</td>
<td></td>
<td></td>
</tr>
<tr>
<td>Control</td>
<td>Bellman Expectation Equation +</td>
<td></td>
</tr>
<tr>
<td>Greedy Policy Improvement</td>
<td>Policy Iteration</td>
<td></td>
</tr>
<tr>
<td>Control</td>
<td>Bellman Optimality Equation</td>
<td>Value Iteration</td>
</tr>
</tbody></table>
<br>

<h1 id="5-extensions-to-dp">5. Extensions to DP*</h1>
<p>기본적인 DP 방법을 적용하여 RL문제를 해결하는 것은 computation적으로 비효율이 너무 크기 때문에 여러가지 테크닉을 이용한다.</p>
<hr>
<h3 id="51-asynchronous-dp">5.1 Asynchronous DP</h3>
<ul>
<li><p>In-Place DP</p>
<ul>
<li><p>기존 방법 (synchronous) : $k$번째의 value function에 대한 정보와 $k+1$번째의 value function에 대한 정보를 따로 저장해야하기 때문에 2배의 저장공간을 필요로 한다.</p>
<p>  $$
  v_{\text {new}}(s) \leftarrow \max_{a\in \mathcal A} \left( \mathcal R^a_s + \gamma \sum_{s&#39;\in\mathcal S} \mathcal P^a_{ss&#39;} v_{\text{old}}(s&#39;)\right)\\ \ v_{\text{old}} \leftarrow v_{\text{new}}
  $$</p>
</li>
<li><p>In-Place : 갱신된 값과 갱신되지 않은 값을 저장하기 위한 공간을 따로 할당하지 않고 바로 덮어씌워서 업데이트 한다.</p>
<ul>
<li><p>다른 state에 대해 value를 계산할 때는 이제 바로 직전에 갱신된 값을 사용하게된다.</p>
</li>
<li><p>이렇게 구현하더라도 문제를 풀 수 있다는 것은 증명되어있다.</p>
<p>$$
v(s) \leftarrow \max_{a\in \mathcal A} \left( \mathcal R^a_s + \gamma \sum_{s&#39;\in\mathcal S} \mathcal P^a_{ss&#39;} v(s&#39;)\right)
$$</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>Prioritised Sweeping</p>
<ul>
<li>state에 우선순위(priority)를 두어, value를 업데이트할 때 중요한 state를 먼저 갱신한다.</li>
<li>중요한 state?<br>→ Bellman error가 큰 state</li>
</ul>
</li>
</ul>
<pre><code>$$
\left| \max_{a\in \mathcal A} \left( \mathcal R^a_s + \gamma \sum _{s&#39; \in \mathcal S}\mathcal P^a_{ss&#39;}v(s&#39;) \right) - v(s)\right|
$$</code></pre><ul>
<li>Real-Time DP<ul>
<li>state의 공간은 매우큰데 실제로 agent가 유의미하게 자주 방문하는 state는 그리 많지 않을 때,</li>
<li>Agent가 실제로 방문한 state를 먼저 업데이트한다.</li>
</ul>
</li>
</ul>
<p>$$
v(S_t) \leftarrow \max_{a\in \mathcal A} \left( \mathcal R^a_{S_t} + \gamma \sum_{s&#39;\in\mathcal S} \mathcal P^a_{S_ts&#39;} v(s&#39;)\right)
$$</p>
<hr>
<h3 id="52-full-width--sample-backups">5.2 Full-width &amp; sample backups</h3>
<ul>
<li>Full-width backup<ul>
<li><em>DP의 방법론</em></li>
<li>$s$에서 갈 수 있는 <strong>모든</strong> $s&#39;$를 이용하여 업데이트한다. → 이럴 필요가 있는가?</li>
</ul>
</li>
</ul>
<ul>
<li>Sample backup</li>
</ul>
<pre><code>- large MDP에서는 Full-width backup으로 구현하기 매우 어렵다.

    (state수가 늘어날 수록 계산량이 exponential하게 변화함)

- Advantage
   - state가 많아지더라도 고정된 sample의 수만 확인하기 때문에 cost가 일정하다.
   - Model-free인 문제에서도 수행할 수 있다.
   - break the curse of dimensionality

![](https://velog.velcdn.com/images/webb-c/post/3a06d87a-38ca-4703-a913-60f41eaf99a1/image.png)</code></pre><br>

<h3 id="53-approximate-dp">5.3 Approximate DP</h3>
<p>$$
\tilde v_k(s) = \max_{a\in \mathcal A} \left( \mathcal R^a_s + \gamma \sum_{s&#39; \in \mathcal S} \mathcal P^a_{ss&#39;} \hat v (s&#39; \bold w_k)\right)
$$</p>
<br>

<h3 id="reference">Reference</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=2pWv7GOvuf0">Introduction to Reinforcement Learning by David Silver</a>  </li>
<li><a href="https://youtube.com/playlist?list=PLpRS2w0xWHTcTZyyX8LMmtbcMXpd3s4TU">팡요랩 : 강화학습의 기초 이론</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강화학습] Markov Decision Process]]></title>
            <link>https://velog.io/@webb-c/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-Markov-Decision-Process</link>
            <guid>https://velog.io/@webb-c/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-Markov-Decision-Process</guid>
            <pubDate>Tue, 24 Jan 2023 17:04:06 GMT</pubDate>
            <description><![CDATA[<p><em>본 포스팅은 David Silver 교수님의 강화학습 강의와 그 강의를 정리한 팡요랩 강의를 바탕으로 정리한 것입니다.</em></p>
<br>

<blockquote>
<p>문제를 해결하기 위해서는 먼저 문제를 잘 정의하는 것에서부터 시작하여야한다.</p>
</blockquote>
<p>대부분의 강화학습 문제는 Environment를 MDP로 formal하게 표현할 수 있다.(<em>fully</em> <em>observable</em>) 그렇다면 MDP는 무엇이며, MDP를 풀기 위해서는 어떻게 해야하는가?</p>
<h1 id="1-markov-processes--mp">1. Markov Processes : MP</h1>
<hr>
<h3 id="11-markov-property">1.1 Markov Property</h3>
<blockquote>
<p>✂️ “The future is independent of the past given the present”</p>
</blockquote>
<ul>
<li><p>Definition of <strong>Markov Property</strong><br>A state $S_t$ is Markov <em>if and only if</em>
$$
\mathbb P[S_{t+1}|S_t] = \mathbb P [S_{t+1} | S_1. \cdots, S_t]
$$</p>
<ul>
<li>시작 state $S_1$에서부터 현재 state $S_{t+1}$까지 도달할 확률이 <strong>바로 이전</strong> state $S_{t}$에서 현재 state $S_{t+1}$까지 도달할 확률과 같은 state를 Markov state라고 한다.</li>
<li>이전 state만 알 수 있다면, 이전까지의 모든 history는 잊어버려도 된다.</li>
<li>강화학습의 문제는 기본적으로 MDP로 표현하기 때문에 Markov Property를 따른다고 가정한다.  </li>
</ul>
</li>
<li><p>State Transition Matrix</p>
<ul>
<li><p>Basic Markov Process에서는 action 없이, 매번의 time-step마다 state를 확률에 기반하여 옮겨다니게 된다.</p>
</li>
<li><p>Markov state $s$에서 $s&#39;$로 transition할 <strong><em>probability</em></strong>은 다음과 같이 정의된다.</p>
<p>  $$
  \mathcal P_{ss&#39;} = \mathbb P[S_{t+1}=s&#39; | S_t = s]
  $$</p>
</li>
<li><p>가능한 모든 state $s$와 $s&#39;$ pair를 원소로 갖는  matrix로 표현할 수 있다. (matrix의 각각의 row의 합은 1)</p>
<p>$$
\mathcal P = \begin{bmatrix} \mathcal P_{11} &amp; \cdots &amp; \mathcal P_{1n} \ \vdots &amp;  &amp; \vdots \ \mathcal P_{n1} &amp; \cdots &amp; \mathcal P _{nn}\end{bmatrix}
$$</p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="12-definition-of-markov-processes">1.2 Definition of Markov Processes</h3>
<ul>
<li>Definition of Markov Processes<br>A <em>Markov</em> <em>Process</em> is a tuple $&lt; \mathcal S, \mathcal P &gt;$  <ul>
<li>$\mathcal S$ is a (finite) set of states</li>
<li>$\mathcal P$ is a state transition probability matrix,
$$
\mathcal P <em>{ss&#39;} = \mathbb P [S</em>{t+1}=s&#39;|S_t = s]
$$   <ul>
<li>Markov process는 <strong>memoryless</strong> random process이다.<ul>
<li>memoryless는 내가 지금까지 어떤 경로를 따라 도달했는지 상관없이 state s에 도달한 순간, $s&#39;$를 결정할 수 있다.</li>
<li>random process는 동일한 state에서 시작하더라도 어떤 state를 거치는지에 따라 여러가지 episode를 샘플링을 할 수 있다는 뜻이다.<br>→ 즉, random한 state들의 sequence $S_1, S_2, \cdots$ 는 <strong>Markov</strong> <strong>property</strong>를 따른다!</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="13-example-of-markov-processes">1.3 Example of Markov Processes</h3>
<p><img src="https://velog.velcdn.com/images/webb-c/post/83ca0e67-7f6e-4cd0-9c39-ed29355084d2/image.png" alt=""></p>
<ul>
<li>위와 같은 model에서 $S_1=C1$에서 시작하는 <strong>Sample</strong> <strong>episode</strong>는 다음과 같은 것들이 있을 수 있다.<ul>
<li>C1 → C2 → C3 → Pass → Sleep</li>
<li>C1 → FB → FB → C1 → C2 → Sleep</li>
<li>C1 → C2 → C3 → Pub → C2 → C3 → Pass → Sleep</li>
<li>C1 → FB → FB → C1 → C2 → C3 → Pub → C1 → FB → FB → FB → C1 → C2 → C3 → Pub → C2 → Sleep</li>
</ul>
</li>
<li>Model의 Edge에 표기된 probability를 바탕으로 다음과 같은 Transition Matrix를 정의할 수 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/webb-c/post/25953008-324e-4ec8-9c2d-a6f1cc8d6634/image.png" alt=""></p>
<br>

<h1 id="2-markov-reward-processes--mrp">2. Markov Reward Processes : MRP</h1>
<hr>
<h3 id="21-definition-of-markov-reward-processes">2.1 Definition of Markov Reward Processes</h3>
<ul>
<li><p>Definition of Markov Reward Processes</p>
<blockquote>
<p>A <em>Markov</em> <em>Reward</em> <em>Process</em> is a tuple $&lt; \mathcal S, \mathcal P , \color{red} \mathcal R, \mathcal \gamma \color{b}&gt;$</p>
<ul>
<li>$\mathcal S$ is a finite set of states</li>
<li>$\mathcal P$ is a state transition probability matrix, $\mathcal P_{ss&#39;} = \mathbb P [S_{t+1}=s&#39;|S_t = s]$</li>
<li>$\mathcal R$ is a reward function, $\mathcal R_s = \mathbb E[R_{t+1} | S_t = s]$</li>
<li>$\gamma$ is a discount factor, $\gamma \in [0, 1]$</li>
</ul>
</blockquote>
</li>
<li><p><em>Reward</em></p>
<ul>
<li>state의 변화에 따른 <strong>reward</strong>를 “environment”가 Agent에게 알려준다.</li>
<li>MRP에서는 현재 state $S_t=s$에 도달하면 Reward $R_{t+1}$을 제공한다.</li>
<li>Agent는 immediate reward 뿐만 아니라, 이후로 얻게되는 미래의 reward까지 고려한다. <em>(with discount)</em></li>
</ul>
</li>
</ul>
<br>

<h3 id="22-value-function">2.2 Value function</h3>
<ul>
<li><p>Definition of Return</p>
<blockquote>
<p>The return $G_t$ is the total discounted reward from time-step $t$</p>
<p>$$
G_t = R_{t+1} + \gamma R_{t+2} + \cdots = \sum^\infin_{k=0} \gamma^k R_{t+k+1}
$$</p>
</blockquote>
<ul>
<li>discount $\gamma \in [0,1]$<ul>
<li>$k+1$ time-step이후의 reward는 $\gamma^k R$의 reward로 표현된다.</li>
<li>immediate reward가 delayed reward보다 더 큰 영향을 줄 수 있게 한다.<ul>
<li>$<em>\gamma$ 값에 따른 효과</em></li>
</ul>
</li>
<li>$0$에 가까울수록 “myopic” evaluation (근시안적)</li>
<li>$1$에 가까울수록 “far-sighted” evaluation (미래지향적)<ul>
<li><strong>why discount?</strong>  </li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>    *discount가 없을 때 발생할 수 있는 문제점*

    - **infinite**한 time-step을 가질 때, 매 time step마다 0.1의 reward를 받는 episode와 1의 reward를 받는 episode를 구분할 수 없다. ($\infin$ 크기비교 불가)
    - Agent가 시작할 떄 1을 받은 경우와 종료할 때 1을 받은 경우 둘 중에 어떤 episode가 더 나은지를 판단할 수 없다.</code></pre><ul>
<li><p>Definition of Value Function</p>
<blockquote>
<p>The <em><strong>state</strong> value function</em> $v(s)$ of an MRP is the expected return starting from state $s$</p>
<p>$$
v(s) = \mathbb E[G_t|S_t=s]
$$</p>
</blockquote>
<ul>
<li>현재 state $s$에서 Return에 대한 기댓값으로 value function을 정의할 수 있다.</li>
</ul>
</li>
</ul>
<br>

<h3 id="23-bellman-equation-for-mrps">2.3 Bellman Equation for MRPs</h3>
<ul>
<li><p>Bellman Equation  </p>
<ul>
<li><p>value function은 다음의 2가지 part로 분리할 수 있다.</p>
<ul>
<li><strong>immediate</strong> <strong>reward</strong> $R_{t+1}$</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>  - **discounted** **value** *of* *successor* *state*  $\gamma v(S_{t+1})$    </code></pre><ul>
<li><em>유도과정</em><ol>
<li>$v(s) = \mathbb E [G_t | S_t = s]$</li>
<li>$= \mathbb E [R_{t+1}+\gamma R_{t+2} + \gamma^2 R_{t+3} + \cdots | S_t=s]$</li>
<li>$= \mathbb E [R_{t+1}+\gamma (R_{t+2} + \gamma R_{t+3} + \cdots) | S_t=s]$</li>
<li>$= \mathbb E [R_{t+1}+\gamma G_{t+1} | S_t=s]$ </li>
<li>$= \mathbb E [R_{t+1}+\gamma v(S_{t+1}) | S_t=s]$  </li>
</ol>
</li>
</ul>
<br>

<ul>
<li><p>Bellman Equation의 직관적인 이해</p>
<ul>
<li><p><em>Bellman Equation</em></p>
<p>$$
v(s) = \mathbb E [R_{t+1} + \gamma v(S_{t+1})|S_t = s]
$$</p>
<p>현재 state $s$가 transition할 수 있는 다음 state $s&#39;$들의 후보는 여러가지가 있을 수 있다. 여러가지 후보 중에서 “확률”에 따라 next state를 결정하게 된다. 따라서 가능한 여러가지 episode들에 대한 기댓값으로서 리턴을 계산하며, 이 때 같은 value-function을 사용하여 재귀 형태로 표현할 수 있게된다.</p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/a10ed17d-51c4-4b8b-8ff7-0ac2be407674/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- *Expectation을 제거한 형태*
  - MRP에서 1-step Reward는 현재의 state $s$에 따라 고정된 상수이기 때문에 그대로 빠져나온다.
   - $v(s&#39;)$는 next state s’가 무엇인지에 따라 달라지는 값이기 때문에 Expectation을 적용한다.  
   *Definition of Expectation : probability $\times$ value 


$$
v(s) = \mathcal R_s + \gamma\sum_{s&#39;\in \mathcal S} \mathcal P_{ss&#39;}v(s&#39;)
$$</code></pre><ul>
<li><p><em>for Matrix Form</em></p>
<p>  $$
  v = \mathcal R + \gamma \mathcal Pv
  $$</p>
<p>  $<em>v$ is a column vector with one entry per state</em></p>
<p>  $$
  \begin{bmatrix} v(1) \ \vdots \ v(n) \end{bmatrix} = \begin{bmatrix} \mathcal R_1 \ \vdots \  \mathcal R_n \end{bmatrix}  + \gamma \begin{bmatrix}  \mathcal P_{11} &amp; \cdots &amp; \mathcal P_{1n} \ \vdots &amp; &amp; \vdots \ \mathcal P_{n1} &amp; \cdots &amp; \mathcal P_{nn} \end{bmatrix}  \begin{bmatrix} v(1) \ \vdots \ v(n) \end{bmatrix} 
  $$</p>
<ul>
<li><p>solving Bellman Equation</p>
<p>  $$
  v = \mathcal R + \gamma \mathcal Pv
  $$</p>
<p>  $$
  (I-\gamma\mathcal P) v = \mathcal R
  $$</p>
<p>  $$
  v = (I - \gamma \mathcal P)^{-1} \mathcal R
  $$</p>
<p>  ⇒ Bellman Equation을 linear equation으로 표현하여 <strong>directly solve</strong>할 수 있다!</p>
</li>
<li><p><em>단점</em></p>
<ul>
<li>단, computational complexity가 $O(n^3)$이다.</li>
<li>state가 커질수록 계산량이 매우 커지기 때문에 direct solution은 small MRPs에만 적용한다.</li>
</ul>
</li>
<li><p>대부분의 경우 MRPs는 iterative method를 이용하여 해결한다.</p>
<ul>
<li><em>Dynamic Programming</em></li>
<li><em>Monte-Carlo evaluation</em></li>
<li><em>Temporal-Difference learning</em></li>
</ul>
<p>여기서 소개된 iterative method는 MDP를 solve하기 위해서 사용되는 방법이기도 하다. MRP와 달리 MDP는 directly solve를 위한 방법이 존재하지 않기 때문에, iterative method를 채택한다. </p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="24-example-of-mrps">2.4 Example of MRPs</h3>
<p><img src="https://velog.velcdn.com/images/webb-c/post/2f2562f3-6eeb-4f44-85d2-c4dc6bb6f399/image.png" alt=""></p>
<ul>
<li><p><em>Sample returns for Student MRP</em></p>
<p>  starting from $S_1 = C1$ with $\gamma = 0.5$ 일 때, 각각의 sample episode들에 대한 Return은 다음과 같이 계산될 수 있다.</p>
<p>  $$
  G_1 = R_2 + \gamma R_3 + \cdots + \gamma^{T-2}R_T
  $$</p>
<p>  <img src="https://velog.velcdn.com/images/webb-c/post/9dbc8a9c-3818-4f08-a42e-0e09e59e3fbf/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p>discount value에 따른 state value의 변화</p>
<p>  <img src="https://velog.velcdn.com/images/webb-c/post/f126987d-d811-43ff-8e83-fc5799fadaff/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/2a2371e1-84b6-4533-a85e-601a5b1cf57b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/aeb861d0-1ffd-4cbf-9a47-7d7c37a3e9b8/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p>Bellman Equation</p>
<p>  Q. 빨간색 state의 value가 $4.3$이라고 알려져 있을 떄, Bellman Equation을 만족하는가?</p>
<p>  <img src="https://velog.velcdn.com/images/webb-c/post/469275f9-6707-4a4b-a4cc-74b39d320b54/image.png" alt=""></p>
</li>
</ul>
<br>

<h1 id="3-markov-decision-processes--mdp">3. Markov Decision Processes : MDP</h1>
<hr>
<h3 id="31-definition-of-markov-decision-processes">3.1 Definition of Markov Decision Processes</h3>
<p>MP, MRP에서는 state의 변화가 오로지 <strong>Environment</strong>의 <strong>transition</strong> <strong>probability</strong> $\mathcal P$에 의해 결정되었다. </p>
<p>그러나 MDP에서는 state의 변화가 <strong>Agent</strong>의 <strong>Action</strong> $\mathcal A$에 의해 결정되게 된다! (다만, 여전히 환경의 불안정함은 존재)</p>
<ul>
<li><p>Definition of Markov Reward Processes</p>
<blockquote>
<p>A <em>Markov</em> <em>Reward</em> <em>Process</em> is a tuple $&lt; \mathcal S, \color{red} \mathcal A, \color{b}\mathcal P ,  \mathcal R, \mathcal \gamma&gt;$</p>
<ul>
<li><p>$\mathcal S$ is a finite set of states</p>
</li>
<li><p>$\mathcal A$ is a finite set of actions</p>
</li>
<li><p>$\mathcal P$ is a state transition probability matrix, $\mathcal P^{a}<em>{ss&#39;} = \mathbb P [S</em>{t+1}=s&#39;|S_t = s, A_t = \color {red} a \color{b} ]$</p>
<p>  → state $s$에서 action $a$를 취할 때, state $s&#39;$에 도달할 확률 (환경의 불안정함)</p>
</li>
<li><p>$\mathcal R$ is a reward function, $\mathcal R^a_s = \mathbb E[R_{t+1} | S_t = s, A_t = \color{red} a \color{b} ]$</p>
</li>
<li><p>$\gamma$ is a discount factor, $\gamma \in [0, 1]$  </p>
</li>
</ul>
</blockquote>
</li>
<li><p>state transition probability  </p>
<ul>
<li>Agent가 어떠한 <strong>Action</strong>을 취했을 때, Agent가 인식하는 state가 deterministic하게 결정되지 않고 “<strong>확률</strong>”적으로 정해지게 된다.<ul>
<li>또한 해당 state에서 그 <strong>Action을 할 확률</strong>도 정해진다. <policy></li>
<li><em>Example</em>) 무인이동체가 우회전이라는 action을 결정했지만, 그 순간 빨간불로 신호가 바뀌어 우회전을 하지 못하고 정지하는 경우</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="32-policy--value-function">3.2 Policy &amp; Value function</h3>
<ul>
<li><p>Definition of <strong>Policy</strong></p>
<blockquote>
<p>A policy $\pi$ is a distribution over actions given states,</p>
<p>$$
\pi(a|s) = \mathbb P[A_t=a|S_t=s]
$$</p>
</blockquote>
<ul>
<li>state $s$에서 action $a$를 수행할 <strong>확률 분포</strong></li>
<li>Agent는 policy를 따라서 어떤 action을 선택할지를 결정하게 된다.</li>
<li>MDP의 policy는 agent가 지금까지 겪어온 history가 아닌, 오직 current state에 의해서만 의존한다.$^{[1]}$</li>
<li>Policies are <em>stationary</em> (time-independent)<br>$A_t ∼ \pi (\cdot|S_t),\ \ \forall t&gt;0$</li>
</ul>
</li>
</ul>
<ul>
<li><p><em>(번외) policy와 MDP를 이용하여 MRP로 표현하기</em>  </p>
<p>MDP에서 Agent의 policy가 고정이라면 Agent가 없는 Markov Process로 표현할 수 있다.   </p>
<p>  Given an MDP $\mathcal M = &lt; \mathcal S, \mathcal A, \mathcal P, \mathcal R, \gamma&gt;$ and a policy $\pi$</p>
<ul>
<li><p>State sequence $S_1, S_2, \cdots$ → Markov process $&lt;\mathcal S, \mathcal P^\pi&gt;$ 로 표현할 수 있다.  </p>
<ul>
<li>State and Reward sequence $S_1, R_2,  S_2, \cdots$ → Markov reward process $&lt;\mathcal S, \mathcal P^\pi, \mathcal R^\pi, \gamma&gt;$ 로 표현할 수 있다.<br>*<em>where</em> : policy가 고정되어있다면, 어떤 action 선택하고-transition probability에 따라 최종적으로 어떤 state가 next state가 되는지를 확률로서 계산할 수 있다.  </li>
</ul>
</li>
<li><p>transition probability : $s&#39;$으로 갈 확률은 각 action의 확률 $\times$ action $a$를 했을 때 $s&#39;$로 갈 확률의 합(기댓값)  </p>
</li>
<li><p>reward : $s$의 return은 각 action의 확률 $\times$ action $a$를 했을 때 $s$의 reward의 합(기댓값)</p>
<p>  $$
  \mathcal P^\pi_{s,s&#39;} = \sum_{a\in\mathcal A} \pi(a|s) \mathcal P^a_{ss&#39;}
  $$</p>
<p>  $$
  \mathcal R^\pi_{s} = \sum_{a\in\mathcal A} \pi(a|s) \mathcal R^a_{s}
  $$</p>
</li>
</ul>
</li>
<li><p><strong>Value Function</strong></p>
<ul>
<li><p>어떤 <strong>“policy”</strong> 를 따라 episode를 진행하는지에 따라 value가 달라질 수 있기 때문에, Agent가 어떻게 행동하는지를 나타내는 policy $\pi$를 함께 기술해야한다.</p>
</li>
<li><p>Definition of <strong>state</strong>-value function</p>
<blockquote>
<p>The state value function $v_\pi(s)$ of an MDP is the expected return starting from state $s$, and then <strong>following policy</strong> $\pi$</p>
<p>$$
v_\pi(s) = \mathbb E_\pi[G_t|S_t=s]
$$</p>
</blockquote>
</li>
<li><p>Definition of <strong>action</strong>-value function</p>
<blockquote>
<p>The action value function $q_\pi(s, a)$ is the expected return starting from state $s$, taking action $a$, and then following policy $\pi$</p>
<p>$$
q_\pi(s,a) = \mathbb E_\pi[G_t|S_t=s, A_t = a]
$$</p>
</blockquote>
<ul>
<li><p>현재 state $s$에서 선택하는 action $a$는 <strong>policy를 따라 선택한 것이 아닐수도 있다!</strong> 단, 이후 episode를 진행할 때는 policy $\pi$를 따라 진행하게 된다.</p>
</li>
<li><p>action-value function이 정의된다면, Agent가 <strong>어떤 action을 선택할 지 결정할 때</strong> Action value function의 값을 보고 선택하기만 하면된다.<br>⇒ 즉, 문제를 간단하게 표현할 수 있다. 
(state value function을 사용하면 다른 state들의 value function을 알아야하며, 그때 어떤 action을 했을 때 $s&#39;$로 가게될 확률도 알고 있어야한다.)</p>
</li>
<li><p>Q-learning이나 DQN같은 곳에서 사용하는 Q가 바로 action-value function을 의미한다.</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="33-bellman-expectation-equation">3.3 Bellman Expectation Equation</h3>
<p>MRP에서 value function을 2가지 part(immediate reward, discounted value)로 분리했던 과정을 동일하게 적용하면 MDP에서도 초기 Bellman Equation을 쉽게 얻을 수 있다. </p>
<ul>
<li><p>Bellman Expectation Equation (초기)</p>
<ul>
<li>Bellman Expectation Equation for $v_\pi$<blockquote>
<p>$s$에서의 state-value는 $<strong>\pi$를 따라</strong> 1-step 수행하여 받은 reward와 next-state $S_{t+1}$에서의 value의 합의 기댓값과 동일하다.</p>
</blockquote>
</li>
</ul>
<p>$$</p>
<pre><code>  v_\pi(s) = \mathbb E_\pi[R_{t+1} + \gamma v_\pi(S_{t+1})|S_t=s] \\ \ \\</code></pre><p>$$</p>
</li>
</ul>
<pre><code>- **state와 action의 관계** - (1)  
  - state의 value는 그 state에서 가능한 모든 action($a\in \mathcal A$)에 대한 action-value의 기댓값과 동일하다.
  - action의 선택은 오로지 policy에 의존하기 때문에 확률분포에 따라 episode별로 선택된 action이 달라지고 따라서 reward가 변화하여 정확한 값을 모르기 때문에 기댓값 형태로 표현해야한다.
  - state-value function의 definition이 policy에 의해 선택된 action에 대한 가능한 모든 episode의 리턴의 기댓값이기 때문에 Q-function으로 표현할 수 있다.  

  → $G_t$에 대한 기댓값의 다른 표현</code></pre><p><img src="https://velog.velcdn.com/images/webb-c/post/dee58d8c-33fe-4388-844d-d032b0045b71/image.png" alt=""></p>
<p>  $$
    v_\pi(s) =\sum_{a\in\mathcal A} \pi(a|s) q_\pi(s,a)
  $$</p>
<ul>
<li><p>Bellman Expectation Equation for $q_\pi$</p>
<blockquote>
<p>$s$에서 action $a$를 선택하여 받은 action-value는 $a$를 선택해 1-step 수행하여 받은 reward와 next-state $S_{t+1}$에서의 action-value의 합의 기댓값과 동일하다.</p>
</blockquote>
<p>  $$
   q_\pi(s,a) = \mathbb E_\pi[R_{t+1} + \gamma q_\pi(S_{t+1}, A_{t+1})|S_t=s, A_t = a]\\ \
  $$</p>
<ul>
<li><p><strong>action과 state의 관계</strong> - (2)</p>
<ul>
<li><p>action의 value는 action을 수행함으로써 전달받는 1-step reward  $\mathcal R^a_s$과 가능한 모든 next-state($s&#39;\in \mathcal S$)에 대한 state-value의 (감쇄)기댓값의 합과 동일하다.</p>
</li>
<li><p>특정 action $a$를 수행하면 그 때 받게되는 reward의 값을 확실하게 알 수 있기 때문에 immediate rewrd를 이용하여 표현한다.</p>
</li>
<li><p><em>Bellman Expectation Equation에서 Expectation $\mathbb E$를 제거한 형태</em></p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/1c27c3a3-f49e-4106-a1b1-5cc697f1caa2/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>    $$
    q_\pi(s, a) =\mathcal R_s^a+\gamma \sum_{s&#39;\in\mathcal S}\mathcal P^a_{ss&#39;}v_\pi(s&#39;)
    $$</code></pre><ul>
<li><p><strong>Bellman Expectation Equation [재귀]</strong></p>
<p>  MRP에서의 Bellman Equation과 달리, MDP에서는 action의 존재로 인하여 가장 초기의 Bellman Equation을 바로 재귀적으로 표현하기 힘들다. 따라서 action-value와 state-value간의 관계를 이용하여 재귀적 표현으로 Bellman Expectation Equation을 표현한다.</p>
<p>  <em>→ 그대로 관계식을 대입한다!</em></p>
<ul>
<li><p>Bellman Expectation Equation for $v_\pi$</p>
<p>  <img src="https://velog.velcdn.com/images/webb-c/post/2e4fe32b-ccde-4111-9460-dc1a31971f9c/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>    $$
    v_\pi(s) =\sum_{a\in\mathcal A} \pi(a|s) \left( \mathcal R^a_s + \gamma \sum_{s&#39;\in\mathcal S}\mathcal P^a_{ss&#39;}v_\pi(s&#39;)\right)
    $$

- Bellman Expectation Equation for $q_\pi$

    ![](https://velog.velcdn.com/images/webb-c/post/51c24b9a-b976-44e4-b7a3-173affa676fb/image.png)


    $$
    q_\pi(s, a) =\mathcal R_s^a+\gamma \sum_{s&#39;\in\mathcal S}\mathcal P^a_{ss&#39;} \sum_{a&#39;\in\mathcal A}\pi(a&#39;|s&#39;) q_\pi(s&#39;,a&#39;)
    $$</code></pre><ul>
<li><p><em>for Matrix Form</em><br>*MDP에서 Agent의 policy가 고정이라면 Agent가 없는 MRP로 표현할 수 있기 때문에, 그대로 matrix form을 적용해서 direct solution을 얻을 수 있다.</p>
<p>  $$
  v_\pi = \mathcal R^\pi + \gamma \mathcal P^\pi v_\pi
  $$</p>
<p>  <em>with direct solution</em></p>
<p>  $$
  v_\pi = (I - \gamma \mathcal P^\pi)^{-1} \mathcal R^\pi
  $$</p>
</li>
</ul>
<br>

<h3 id="34-example-of-mdps">3.4 Example of MDPs</h3>
<ul>
<li><p>MDP의 예시 : Action에 대하여 reward가 제공된다</p>
<p>  <img src="https://velog.velcdn.com/images/webb-c/post/be1a968a-6b16-4e4b-8db3-607fff26bcbd/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p><em>MDP에서 state-value function의 계산</em></p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/88a836bb-ded6-4304-826c-99f7ecf09b2c/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p><em>Bellman Expectation Equation</em></p>
<p>  Q. 빨간색 state의 value가 $7.4$라고 알려져 있을 떄, Bellman Expectation Equation을 만족하는가?</p>
<p>  <img src="https://velog.velcdn.com/images/webb-c/post/0c774fdc-6e79-4bf1-be22-7a85a73a511d/image.png" alt=""></p>
</li>
</ul>
<br>

<h1 id="4-optimal-solution">4. Optimal Solution</h1>
<hr>
<h3 id="41-optimal-value-function">4.1 Optimal Value Function</h3>
<ul>
<li><p>Definition of Optimal Value Function  </p>
<p>가능한 모든 policy에 대하여 계산했을 때, 그 중에서 가장 maximum 값을 갖는 value function</p>
<ul>
<li><p>Definition of <em>optimal</em> <strong>state</strong>-value function</p>
<blockquote>
<p>The <em>optimal</em> <em>state</em> <em>value</em> <em>function</em> $v_<em>(s)$ is the *</em>maximum** value function over all policies</p>
<p>$$
v_*(s) = \max_\pi v_\pi(s)
$$</p>
</blockquote>
</li>
<li><p>Definition of <em>optimal</em> <strong>action</strong>-value function</p>
<blockquote>
<p>The <em>optimal action value function</em> $q_<em>(s, a)$ is the *</em>maximum** action-value function over all policies</p>
<p>$$
q_*(s,a) = \max_\pi q_\pi(s,a)
$$</p>
</blockquote>
</li>
</ul>
</li>
<li><p>Optimal Value Function</p>
<ul>
<li>optimal value function은 MDP에서 가능한 최고의 성능을 나타낸다.</li>
<li>해당 MDP의 optimal value function을 찾았다면, 그 MDP는 “<strong>solved</strong>”되었다고 한다.</li>
<li>일반 value function과 달리 bellman optimality eqation은 matrix form으로 표현되지 않기 때문에 directly solve가 불가능하다.</li>
</ul>
</li>
<li><p><em>Example</em></p>
<p>  optimal policy를 따랐을 때, state-value function과 action-value function</p>
<p>  <img src="https://velog.velcdn.com/images/webb-c/post/cf50df66-1b59-4cb3-a855-02200f5aab13/image.png" alt="">
<img src="https://velog.velcdn.com/images/webb-c/post/844a4285-3439-4924-b730-19633c78f812/image.png" alt=""></p>
</li>
</ul>
<br>

<h3 id="42-optimal-policy">4.2 Optimal Policy</h3>
<ul>
<li><p><em>policy간의 partial ordering</em></p>
<blockquote>
<p>모든 state에 대하여 $v_\pi(s)$가 $v_\pi&#39;(s)$보다 같거나 크다면, $\pi$가 $\pi&#39;$보다 더 나은 policy 라고 말할 수 있다.</p>
</blockquote>
<p>  $$
  \pi \ge \pi&#39; \text{ if } v_\pi(s) \ge v_{\pi&#39;}(s), \forall s\\ \
  $$</p>
</li>
<li><p><strong>Theorem</strong> of policy  </p>
<p><em>For any Markov Decision Process</em></p>
<ul>
<li><p>다른 <strong>모든</strong> <strong>policy</strong>보다 더 같거나 좋은 $\pi_* \ge \pi, \forall \pi$ <strong>optimal policy $\pi_*$가 존재</strong>한다.</p>
</li>
<li><p><em>optimal policy를 따르는 value function은 optimal value function과 동일하다</em></p>
<ul>
<li><p>모든 optimal policy는 그 optimal policy를 따르는 optimal value function을 가진다.
  $v_{\pi_<em>}(s) = v_</em>(s)$</p>
</li>
<li><p>모든 optimal policy는 그 optimal policy를 따르는 optimal <em>action-value</em> function을 가진다.</p>
<p>  $q_{\pi_<em>}(s,a) = q_</em>(s,a)$</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>Optimal Policy를 찾는 방법</p>
<ul>
<li><p>optimal action-value function에 대하여 max가 되게하는 action만을 계속해서 취하는 policy</p>
</li>
<li><p>즉, <strong>optimal</strong> action-value function $q_<em>(s,a)$을 알고있다면 그 즉시 *deterministic</em> optimal policy를 구할 수 있다. ⇒ <strong>MDP를 solve!</strong></p>
<p><em>deterministic</em>  </p>
<ul>
<li>원래 policy는 각각의 action을 수행할 확률로 정의되기 때문에 stochastic하다.</li>
<li>그러나 optimal action-value function을 사용하여 구한 optimal policy는 하나의 action만을 하도록 결정된 deterministic한 policy이다.</li>
</ul>
<p>$$
\pi_<em>(a|s) = \begin{cases} 1 &amp; \text{if } a= \argmax_{a\in \mathcal A}q_</em>(s,a)\ 0 &amp; \text{ otherwise}\end{cases}
$$</p>
</li>
</ul>
<br>
</li>
<li><p><em>Example :</em> Optimal Policy</p>
<p>  <img src="https://velog.velcdn.com/images/webb-c/post/49032a4b-a112-4b75-991d-045d4366034f/image.png" alt=""></p>
</li>
</ul>
<br>

<h3 id="43-bellman-optimality-equation">4.3 Bellman Optimality Equation</h3>
<p>기본적으로 Bellman Expectation Equation과 동일한 구조를 이룬다. 다만, optimal policy를 알지 못하여 모든 수식을 Expectation으로부터 표현하기 시작했던 것과 달리 여기서는 optimal policy $*$를 알고있기 때문에 이를 이용하여 equation을 표현한다. </p>
<ul>
<li><p><strong>Optimal</strong> state-value function과 <strong>Optimal</strong> action-value function의 관계</p>
<ul>
<li><p>state과 action의 관계 - (1)</p>
<ul>
<li><p>state $s$의 <strong>optimal</strong> value는 그 state에서 optimal action-value가 최대가 되게하는 action $a$을 취했을 때의 <strong>optimal</strong> action value와 동일하다.</p>
</li>
<li><p>action-value를 maximize하는 action을 선택하는것이 optimal하기 때문에 자명하다.</p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/8c765d63-7c30-4adc-b330-df8e4477ba97/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>    $$
    v_*(s) =\max_aq_*(s,a)
    $$</code></pre>  <br>

<pre><code>- action과 state의 관계 - (2)
    - (state $s$에서) action $a$의 optimal value는 action을 수행함으로써 전달받는 1-step reward  $\mathcal R^a_s$과 가능한 모든 next-state($s&#39;\in \mathcal S$)에 대한 **optimal** state-value의 (감쇄)기댓값의 합과 동일하다.
    - action을 하더라도 그 다음 state가 무엇으로 결정되는지는 환경의 불안정성(=state probability)를 따르기 때문에 기댓값의 형태로 표현한다.

    ![](https://velog.velcdn.com/images/webb-c/post/14c756cf-8cba-4568-a886-195ae5705296/image.png)


    $$
    q_*(s, a) =\mathcal R_s^a+\gamma \sum_{s&#39;\in\mathcal S}\mathcal P^a_{ss&#39;}v_*(s&#39;)
    $$</code></pre><ul>
<li><p>Bellman Optimality Equation <strong>[재귀]</strong></p>
<ul>
<li><p>Bellman Optimality Equation for $v_\pi$</p>
<p>  <img src="https://velog.velcdn.com/images/webb-c/post/0caa1d0d-ddbe-4a25-b6b0-3bb2d184d0e6/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>    $$
    v_*(s) =\max_a \mathcal R^a_s + \gamma \sum_{s&#39;\in\mathcal S}\mathcal P^a_{ss&#39;}v_*(s&#39;)
    $$

- Bellman Optimality Equation $q_\pi$

    ![](https://velog.velcdn.com/images/webb-c/post/c380cf0d-865a-4830-a5db-f7a9520c3767/image.png)


    $$
    q_*(s, a) =\mathcal R_s^a+\gamma \sum_{s&#39;\in\mathcal S}\mathcal P^a_{ss&#39;} \max_{a&#39;} q_*(s&#39;,a&#39;)
    $$</code></pre><ul>
<li><p><em>Example</em></p>
<p>  Q. 빨간색 state의 value가 $6$이라고 알려져 있을 떄, Bellman Optimality Equation을 만족하는가?</p>
<p>  <img src="https://velog.velcdn.com/images/webb-c/post/48b52012-bbab-4100-82f0-47c4a7149827/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p><strong>Bellman Optimaliy Equation을 푸는 방법</strong></p>
<ul>
<li><p>Bellman Optimally Equation은 <em>non</em>-<em>linear</em> equation이다. ($\max$ 때문)</p>
<p>  ⇒ 따라서 closed form solution을 가지지 았는다. (in general)</p>
</li>
<li><p>Many <strong><em>iterative</em></strong> solution methods</p>
<ul>
<li>Value Iteration (DP)</li>
<li>Policy Iteration (DP)</li>
<li>Q-learning</li>
<li>SARSA</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="reference">Reference</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=2pWv7GOvuf0">Introduction to Reinforcement Learning by David Silver</a>  </li>
<li><a href="https://youtube.com/playlist?list=PLpRS2w0xWHTcTZyyX8LMmtbcMXpd3s4TU">팡요랩 : 강화학습의 기초 이론</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[파워포인트에서 LaTex 문법 사용하여 수식넣기 : IguanaTex]]></title>
            <link>https://velog.io/@webb-c/%ED%8C%8C%EC%9B%8C%ED%8F%AC%EC%9D%B8%ED%8A%B8%EC%97%90%EC%84%9C-LaTex-%EB%AC%B8%EB%B2%95-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%88%98%EC%8B%9D%EB%84%A3%EA%B8%B0-IguanaTex</link>
            <guid>https://velog.io/@webb-c/%ED%8C%8C%EC%9B%8C%ED%8F%AC%EC%9D%B8%ED%8A%B8%EC%97%90%EC%84%9C-LaTex-%EB%AC%B8%EB%B2%95-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%88%98%EC%8B%9D%EB%84%A3%EA%B8%B0-IguanaTex</guid>
            <pubDate>Tue, 17 Jan 2023 17:19:31 GMT</pubDate>
            <description><![CDATA[<p>최근 랩미팅 발표용 파워포인트를 제작할 때마다 느껴지는 불편함이 존재했다. </p>
<p>현재 나는 다년간의 경험으로 수식을 입력할 때 LaTex 문법이 매우 익숙해진 상태이다. ppt를 제작할 때 레이텍으로 Notion에 정리해둔 수식을 그대로 끌어와서 ppt에 삽입하고 싶은데 MSpowerpoint는 레이텍을 지원하지 않아서 파워포인트 자체적으로 지원하는 수식 입력 기능을 사용해야한다.</p>
<p>파워포인트에서 한번이라도 수식을 입력해본적이 있다면 이게 얼마나 귀찮은 일인지 알고 있으리라 생각한다. (^, _ 사용 불가, 기호 단축키 없음...)</p>
<p>그래서 최근에 계속 수식을 삽입할 때마다 귀찮음을 느끼고 있어서 새벽에 생각난 김에 해결방법을 한번 찾아보았다. </p>
<br>

<h3 id="iguanatex">IguanaTex</h3>
<p><strong>IguanaTex</strong>라는 MS powerpoint용 add-in을 사용하면, LaTex문법으로 작성된 수식을 그대로 이용하여 파워포인트 안에 삽입할 수 있다!</p>
<blockquote>
<p>🔗 <a href="https://www.jonathanleroux.org/software/iguanatex/">IguanaTex 홈페이지</a></p>
</blockquote>
<p>위 홈페이지에 접속하면 IguanaTex에 대한 설명과 간단한 사용방법, 그리고 <a href="https://github.com/Jonathan-LeRoux/IguanaTex"><code>github</code>  주소</a>를 얻을 수 있다.</p>
<p>깃허브에서 자신이 맞는 운영체제(Window/MacOS/Linux)를 선택하여 README에서 안내하는 방식을 따라 설치하면 된다.</p>
<p>나는 MacOS를 사용하고 homebrew를 이용하기 때문에 별도로 다른 파일을 다운로드 없이 터미널에서 명령어 입력을 통해 자동 다운로드 방식으로 설치했다.</p>
<pre><code class="language-bash">brew tap tsung-ju/iguanatexmac
brew install --cask --no-quarantine iguanatexmac latexit-metadata</code></pre>
<p>제대로 설치가 완료되었다면, 파워포인트의 상단 탭에 자동으로 IguanaTex가 추가된것을 확인할 수 있을 것이다. </p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/8fa02b36-7710-4aa0-9cb4-7e1a8ce4fe33/image.png" alt="1"></p>
<br>

<h3 id="사용방법">사용방법</h3>
<p><strong>새로운 수식 삽입하기</strong></p>
<ol>
<li><p>New Latex display</p>
</li>
<li><p>default틀 안에, LaTex문법으로 작성된 equation을 삽입한다.  <img src="https://velog.velcdn.com/images/webb-c/post/ae206d37-3159-42c8-a5c8-d0d1512da259/image.png" alt="defalt"></p>
</li>
<li><p>Generate를 누르면 파워포인트에 삽입할 수식 &quot;이미지&quot;를 생성하고 자동으로 현재 ppt 슬라이드에 수식이 추가된다.</p>
</li>
</ol>
<p><em>사용예시</em></p>
<ul>
<li><p>기존 LaTex 수식
  <img src="https://velog.velcdn.com/images/webb-c/post/d58d5eca-318c-48e5-8178-20c9d399b320/image.png" alt=""></p>
</li>
<li><p>파워포인트에 삽입된 수식
  <img src="https://velog.velcdn.com/images/webb-c/post/bfb12810-64c0-4168-b0af-a036f33711d7/image.png" alt=""></p>
</li>
</ul>
<p><strong>이미 삽입한 수식 수정하기</strong></p>
<ol>
<li>수정하고자하는 수식 이미지를 선택한다.</li>
<li>Edit LaTex display</li>
<li>수식을 수정한 뒤 ReGenerate를 눌러 변경된 수식을 다시 삽입한다. </li>
</ol>
<br>

<p>매우 편리하게 사용할 수 있으며, 작성된 수식을 캡쳐하여 첨부하면 화질이 깨지지만 실제로 수식을 입력하자니 귀찮았던 두가지 문제를 모두 해결해주는 유용한 기능이라고 생각한다. </p>
<p>또는 레이텍 문법에 많이 익숙하다면, LaTex을 이용하여 프레젠테이션 파일을 PDF 형식으로 제작할 수 있는 <strong>Beamer latex</strong>을 이용하여도 된다. </p>
<br>

<p>나는 Beamer Latex까지 사용하기에는 너무 시간이 오래 걸릴 것 같아서 이구아나로 만족하고 있다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강화학습] Deep Reinforcement Learning]]></title>
            <link>https://velog.io/@webb-c/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-Deep-Reinforcement-Learning</link>
            <guid>https://velog.io/@webb-c/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-Deep-Reinforcement-Learning</guid>
            <pubDate>Thu, 05 Jan 2023 08:26:27 GMT</pubDate>
            <description><![CDATA[<h1 id="1-deep-reinforcement-learning">1. Deep Reinforcement Learning</h1>
<hr>
<h3 id="11-needs-for-drl">1.1 Needs for DRL</h3>
<p>기본적인 강화학습 방법들은 Agent가 반복해서 시뮬레이션하면서 Agent가 겪는 경험들을 이용하여 action을 선택할 때 참조하는 일종의 look-up table을 갱신하는 방법이었다. 즉, 경험;heuristic을 통해 데이터베이스를 쌓아가면서 나에게 유리한 action과 그렇지 않은 action을 구분해나가는 방법이다.</p>
<p><em>*look-up table : 특정한 state에 연관된 action과 reward를 기록한 table</em></p>
<p align="center"><img src="https://velog.velcdn.com/images/webb-c/post/043efcd6-9c1a-4c26-b6a3-e5bc1b9699b3/image.png" height="300px" width="600px"></p>

<p>그러나 더이상 모든 state와 그때의 가능한 모든 action을 표기할 수 없을정도로 큰 state space, action space를 갖는 환경이라면, look-up table의 형식으로 표현하는것이 불가능하다.</p>
<p>Deep Reinforcement Learning은 신경망을 이용하여 학습하면서, 주어진 state에서 중요한 feature만을 뽑아내어 state를 자동으로 분석한다. 신경망 모델에서 사용되는 parameter는 가능한 모든 state의 조합을 저장하는데 필요한 항목의 개수보다 훨씬 적다!</p>
<p>예를 들어, <code>Atari 2600</code> 게임을 플레이하는 강화학습 agent를 학습하는데 사용했던 구글 딥마인드의 DQN의 파라미터의 개수는 $1792$개 뿐이지만 실제로 비디오 게임 화면($84\times 84$ gray scale image)의 고유한 표현상태는 $256^{28228}$개 였다. </p>
<p>DRL의 발전과 함께 강화학습도 많은 발전을 이루었으며, 실제 세계의 대부분의 문제는 매우 복잡한 state-action space를 가지기 때문에 실제 세계의 문제에 적용하기 위해서는 대부분 DRL을 사용한다. </p>
<h3 id="12-category-of-deeprl">1.2 Category of (Deep)RL</h3>
<p>강화학습 알고리즘을 구분하는 기준은 크게 2가지로 나뉜다.</p>
<ol>
<li><p>모델이 존재하는가?</p>
<ul>
<li><p><strong>Model-Free RL</strong></p>
<ul>
<li>모델이 존재하지 않는 RL</li>
<li>실제 문제에서는 Environment를 정확히 묘사할 수 있는 모델을 구하는것이 매우 어렵다.</li>
</ul>
</li>
<li><p>Model-Based RL</p>
<ul>
<li><p>모델이 존재하는 RL</p>
</li>
<li><p>Environment를 정확히 표현할 수 있는 모델이 존재한다면, env와 실제로 상호작용하지 않고도 모델을 이용하여 Planning을 할 수 있다.</p>
<p>  → 즉, 실제로 Action을 하기전에 미리 simulate해보고 최적의 action을 선택할 수 있다. </p>
</li>
<li><p>모델이 주어진 경우와, 모델을 스스로 학습하는 2가지 범주로 분류할 수 있다.</p>
</li>
<li><p><em>대표적인 model-based RL이 바로 AlphaZero이다.</em></p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>Value function / Policy 중에서 무엇을 최적화하는가?</p>
<p> Value function을 학습한다면, 각각의 state에서 최적의 value를 갖는 Action만을 선택하면 Optimal Policy를 구할 수 있다. 반면에 Policy를 학습한다면, value function은 Policy를 얻기 위하여 중간 계산과정일 뿐이기 때문에 Optimal Policy를 구할 수 있다. </p>
<ul>
<li><p>Policy-based method (Policy Optimization)</p>
</li>
<li><p>Value-based method (Q-Learning)</p>
<p>(완벽하게 2가지 범주로 구분되는 것은 아니고, 2가지를 모두 함께 학습하는 Actor-Critic 등의 방법들도 존재한다.) </p>
</li>
</ul>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/webb-c/post/6f5c8015-bd00-4b97-95f8-8e324eb830d0/image.png" alt=""></p>
<h1 id="2-dqn">2. DQN</h1>
<hr>
<h3 id="21-q-learning">2.1 Q-Learning</h3>
<p>Q-Learning은 간단하게 설명하자면, 각각의 state에서 선택한 action에 따른 reward값을 이용하여 Q(=value function)값을 계속해서 갱신해나가는 과정이다. (using Bellman Optimal Equation)</p>
<blockquote>
<p>💡 현재의 추측 value 값을, 바로 그 다음 time-step에서의 추측 value값을 이용하여 갱신하자</p>
</blockquote>
<p>Q-Learning의 분류</p>
<ul>
<li><p><em>Temporal-Difference; TD</em></p>
<p>  episode가 끝날 때까지 기다리지 않고, 그 다음 time-step에서 즉각적으로 얻은 return과 그때의 value를 이용하여 갱신을 수행한다. (↔  episode가 끝날 때 까지 기다리는 방법이 MC)</p>
</li>
<li><p>Model-Free RL</p>
</li>
<li><p>Value based method</p>
<p>  (보통 $\epsilon$-<em>greedy</em>와 같은 policy를 사용하여 action을 선택한다.)</p>
</li>
<li><p><strong>off-policy</strong></p>
</li>
</ul>
<p><em>*off-policy와 on-policy?</em></p>
<p>off-policy는 실제로 environment와 상호작용하면서 경험을 쌓는 Agent와 실제로 내가 갱신하고자하는 Agent가 다른 경우를 뜻한다. </p>
<ul>
<li>on-policy : target policy = behavior policy</li>
<li>off-policy : target policy ≠ behavior policy</li>
</ul>
<p>예를 들어, 실제로 게임을 하면서 경험을 쌓아 티어가 올라가는 경우는 off-policy를 사용하는 것이고 게임을 계속 플레이하는 사람의 뒤에서 그 사람이 플레이 하는 것을 보고 학습하는 경우는 on-policy를 사용하는 것이다.</p>
<p>off-policy를 사용하는데에는 다음과 같은 이유가 존재한다.</p>
<ol>
<li><p>사람이나 다른 RL method를 이용하여 학습된 Agent를 이용할 수 있다.</p>
</li>
<li><p>behavior policy를 따르는 agent가 수행한 결과를 보고, 좋지 못한 결과를 만드는 action의 경우에는 수정할 수 있다.</p>
<p> <em>ex) 바둑에서 잘못된 곳에 둬서 승률이 급격하게 떨어지는 것을 확인했다면, target policy를 수정할 수 있다.</em></p>
</li>
</ol>
<h3 id="22-q-update--in-formal">2.2 Q-update : in Formal</h3>
<p>아이디어 : Bellman Optimal Equation for $q_{*}$</p>
<p>벨만 최적 방정식에 따라, $R_{t+1} + \gamma\max_a q_<em>(S_{t+1}, a)$의 기댓값이 $q_</em>(S_t, A_t)$이다. 즉, 여러번의 반복을 통해 바로 그 다음 time-step에서의 값을 모을 수록 점점 value function의 값을 업데이트 할 수 있을 것이다. </p>
<p>$$
q_*(S_t, A_t) = \mathbb E_{S_{t+1}}[R_{t+1} + \gamma\max_{a}q(S_{t+1}, a)]
$$</p>
<ul>
<li><p>Notation</p>
<ul>
<li><p>$Q$ : value-function
  → state와 그때 수행한 action이 주어지면 value를 평가하여 반환하는 함수</p>
<ul>
<li>$S_t$ : time-step $t$에서 state</li>
<li>$A_t$ : time-step $t$에서 수행한 ation</li>
</ul>
</li>
</ul>
</li>
<li><p>각 term의 의미</p>
<ul>
<li><p>$\alpha$ : 갱신할 때, 새로운 값을 기존의 value-function값에 비하여 어느정도로 고려할 것인가?</p>
</li>
<li><p>$R_{t+1} + \gamma \max_{a} Q(S_{t+1}, a )$ : <strong>TD target</strong></p>
<p>  $\epsilon$-greedy 등의 policy를 이용하여 transition한 뒤, 다음 time-step에서 value를 최대로 하는 action을 선택했을 때의 value와 return의 합</p>
<p>  즉, Q-learning은 off-policy를 이용하기 때문에 <strong>transition</strong>은 behavior policy를 따라서 수행하고 이동한 미래의 state에서 <strong>value를 계산할 때</strong>는 target policy를 이용한다.</p>
<p>  ⇒ Target과 기존 값 $Q(S_t, A_t)$의 차이를 이용하여 Q-update를 수행한다. </p>
</li>
</ul>
</li>
</ul>
<p>$$
Q(S_t, A_t) \leftarrow Q(S_t,A_t) + \alpha(R_{t+1} + \gamma \max_{a} Q(S_{t+1}, a )- Q(S_t, A_t)))
$$</p>
<p>위와 같은 Q-update과정을 반복해서 수행하여 최종적으로 얻은 Optimal action value function은 다음의 수식으로 표현할 수 있다.</p>
<p>$$
Q_<em>(S_t, A_t) = \mathbb E_{S_{t+1}} [R_{t+1} + \gamma \max_{a} Q_</em>(S_{t+1}, a)]
$$</p>
<h3 id="23-dqn">2.3 DQN</h3>
<p>DQN은 Q-Learning에서 value function을 Table형태가 아닌 “<strong>신경망</strong>”으로 표현하기 때문에, $Q$는 신경망의 parameter $\theta$에 영향을 받게 된다. 따라서 DQN에서는 value function term을 $Q_\theta$로 표현한다.</p>
<p><strong><em>DQN으로 표현한 Q-Learning의 수식</em></strong></p>
<ul>
<li><p>Loss function</p>
<p>  실제 정답을 $R_t + \gamma \max_{a_{t+1}}Q_{\theta}(s_{t+1}, a_{t+1})$ 라고 보고, 현재 value function값과의 차이의 제곱으로 loss를 표현한다. </p>
<p>  $$
  L(\theta) = \mathbb E[(R_{t+1} + \gamma \max_{a}Q_{\theta}(S_{t+1}, a) - Q_{\theta}(S_t, A_t))^2]
  $$</p>
</li>
<li><p>parameter update</p>
<p>  $$
  \theta&#39; = \theta + \alpha\left(R_{t+1} + \gamma \max_{a}Q_{\theta}(S_{t+1}, a) - Q_{\theta}(S_t, A_t)\right)\nabla_\theta Q_\theta(S_t, A_t)
  $$</p>
</li>
</ul>
<p><strong>DQN의 성능향상을 위한 방법</strong></p>
<ul>
<li>Replay Buffer<ul>
<li>이미 한번 겪었던 경험을 재사용함으로서 이전에 있었던 실수를 줄이고 더 나은 방향으로 학습하게하기 위하여 도입한 개념</li>
<li>여러개의 경험들을 저장해두었다가 샘플링하여 학습하면서, 여러번 재사용될 수 있다.</li>
<li>샘플링 되어 뽑히는 경험들은 실제 episode의 연속된 state와 달리 state간의 상관성이 떨어지기 때문에 더 효율적으로 학습할 수 있다.</li>
</ul>
</li>
<li>target Network<ul>
<li>학습 대상이 되는 Q-net과 정답을 계산할 때 사용되는 network 2가지를 사용하여 각 network에 사용되는 parmeter를 달리하는 방법</li>
<li>정답을 계산할 때 사용하는 네트워크가 자주 갱신되는 것은 학습의 안정성을 떨어트리기 때문에, 매우 긴 일정 주기마다 한번씩 정답 네트워크의 parameter를 갱신해준다.</li>
</ul>
</li>
</ul>
<h3 id="24-playing-atari-with-deep-reinforcement-learning">2.4 Playing Atari with Deep Reinforcement Learning</h3>
<p>“Playing Atari with Deep Reinforcement Learning” 은 처음으로 Neural Net과 Reinforcement Learning을 결합하여 유의미한 성과를 보인 논문이다.</p>
<p><em>Atari 2600 Games</em></p>
<ul>
<li><p>Agent가 플레이하는 게임 : Atari 2600 game<strong>s</strong></p>
<p>  ⇒ 각각의 게임에 대해 학습한다면 여러 게임을 플레이할 수 있는 강화학습의 “알고리즘” 개발</p>
</li>
<li><p>게임 화면 : $210 \times  160$ (pixel) RGB video (60 Hz)</p>
</li>
</ul>
<p align="center"><img src="https://velog.velcdn.com/images/webb-c/post/629aab2a-c179-4420-8ae8-c44d292cffa7/image.png" height="300px" width="700px"></p>


<p><strong>DQN Network 구조</strong></p>
<p>게임 화면 “이미지”를 입력받기 때문에 CNN을 사용한다.</p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/f50caefc-c094-4853-8185-3fb6b599d6d6/image.png" alt=""></p>
<p><strong>DQN Algorithm</strong></p>
<ul>
<li><p><em>notation</em></p>
<ul>
<li><p>reward $r$ : game score</p>
</li>
<li><p>$s_1 = {x_1}$ : 한 episode의 sequence를 초기화</p>
<p>  → observation과 action의 sequence</p>
</li>
<li><p>$x$ : observation → 게임 화면</p>
</li>
<li><p>$\phi$ : image preprocessing</p>
<p> <img src="https://velog.velcdn.com/images/webb-c/post/74dc93ca-153c-4089-8568-924690293e74/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<ul>
<li>반복문<ul>
<li><strong>for</strong> episode : 각각의 episode별로 반복하며 $M$번 수행</li>
<li><strong>for</strong> t : <code>episode</code>의 sequence time-step별로 반복</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/webb-c/post/59a66769-763d-4e8b-88a1-eb5380d6dfe6/image.png" alt=""></p>
<p><strong>Reward 비교</strong></p>
<p>다른 방법을 이용하여 학습한 모델들과 비교했을 때 훨씬 띄어난 성능을 보였으며, 몇몇 게임의 경우에는 심지어 사람이 play한 것보다도 좋은 성능을 보이는 것을 확인할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/265662bc-b201-4023-8d3d-6d3a8b160aa3/image.png" alt=""></p>
<h1 id="3-policy-gradient-method">3. Policy Gradient Method</h1>
<hr>
<h3 id="31-concept-of-policy-gradient">3.1 Concept of Policy Gradient</h3>
<p>Action을 선택하기 위한 Policy를 참조할 때, Value function없이도 action을 선택할 수 있는 <strong>파라미터</strong> 기반의 policy를 학습하는 방법이다. </p>
<p>$\theta \in \mathbb R^d$로 표현되는 policy parameter vector를 이용하여 policy를 정의하고, parameter에 대한 value를 나타내는 $J(\theta)$의 gradient를 이용하여 policy의 parameter를 학습할 것이다. </p>
<ul>
<li>policy를 나타내는 신경망의 구조<ul>
<li>input : state</li>
<li>output : 그 state에 대한 각각의 action의 <strong>확률</strong></li>
</ul>
</li>
</ul>
<p><strong>Needs for Policy Gradient method</strong></p>
<p>value based Agent는 Optimal value function $Q_<em>$를 구하면, action을 선택할 때는 항상 value가 최대가 되게 하는 action만을 *</em>deterministic**하게 선택한다.</p>
<p>그러나 policy는 $\pi(s,a) = \mathbb P[a|s]$ 처럼 “<strong>확률</strong>”로서 정의되기 때문에 policy based Agent는 다음 action이 non-deterministic한 유연한 선택을 할 수 있게 해준다.</p>
<p><em>Example</em></p>
<p>예를 들어, 가위바위보 게임에서 처음으로 낼 action을 고른다고 가정하자.</p>
<p>value based Agent에서 Optimal value function의 값이 $Q_<em>(s_0, 보) = 0.1, Q_</em>(s_0, 주먹) = 0.8, Q_<em>(s_0, 가위) = 0.5$ 이라면 Agent는 $\max_a Q_</em>(s_0, a)$을 따라 항상 “보”만을 선택하게 된다.</p>
<p>그러나 policy based Agent가 갖는 policy가 각각의 action에 대해 $1/3$이라면, 각각의 action을 선택할 확률이 $1/3$이 되어 $s_0$이 주어질 때마다 다른 action을 선택할 수 있다.</p>
<h3 id="32-policy-optimization--in-formal">3.2 Policy Optimization : in formal</h3>
<p><strong>Policy Optimization을 위한 아이디어</strong></p>
<ul>
<li>loss의 정의<br>Policy Neural Net을 학습시키기 위해서는 Loss를 정의해야한다. 
Loss는 실제 정답과 현재 출력의 차이로서 정의할 수 있는데 policy net의 정답은 바로 Optimal Policy가 되지만, 이는 현재 우리가 모르는 상태이기 때문에 optimal policy를 정답으로 사용할수는 없다.<br>따라서 policy optimization을 수행할 때는, 현재 policy $\pi_\theta$가 얼마나 좋은지를 평가하는 평가함수 $J(\theta)$를 정의하여 평가함수의 값을 최대화하는 방향으로 Gradient Ascent를 통해 갱신한다.</li>
</ul>
<ul>
<li><p>평가함수의 정의</p>
<ul>
<li><p>Q. 그렇다면 좋은 정책은 무엇일까?</p>
</li>
<li><p><strong>A. Return의 합이 가장 큰 정책!</strong></p>
<p>각각의 episode에 따라 최종적으로 받는 Return의 합은 달라질 수 있기 때문에, 기댓값을 이용하여 표현하면 다음과 같이 평가함수를 정의할 수 있다.</p>
<p>$$
J(\theta) = \mathbb E_{\pi_\theta} \left[ \sum_t R_t\right]
$$</p>
<p>Return의 합은 state-value function과 동일! (최종합이므로 start state에 대한 value function)</p>
<p>$$
J(\theta) = \mathbb E_{\pi_\theta} \left[ \sum_t R_t\right] = v_{\pi_{\theta}} (s_0)
$$</p>
<p>시작 state가 고정이 아니고 시작 state 또한 매번 다른 상태에서 시작한다면, start state에 대한 확률분포를 정의하여 이에 따른 <strong>확률$\times$ 값</strong>; 기댓값 공식으로 표현한다.</p>
<p>$$
J(\theta) = \sum_{s\in S}d(s) \times v_{\pi_\theta}(s)
$$</p>
</li>
</ul>
</li>
<li><p>Gradient ascent</p>
<p>  최대화가 목적이기 때문에 gradient와 같은 방향으로 update한다.</p>
<p>  $$
  \theta&#39; \leftarrow \theta + \alpha \nabla_\theta J(\theta)
  $$</p>
</li>
</ul>
<p><strong>Policy Optimization : 1-step</strong></p>
<p>1-step MDP로 문제를 간소화하고 생각하자. start state $s_0$에서 policy를 따라 하나의 action을 선택한 뒤 바로 Return을 받고 episode가 종료된다. </p>
<p>가능한 모든 action에 대한 return의 기댓값; <strong>action을 선택할 확률 $\times$보상</strong>으로 value function을 재정의할 수 있다. </p>
<p>$$
J(\theta) = \sum_{s\in S}d(s) \sum_{a\in A}\pi_\theta(s, a)\times R_{s, a}
$$</p>
<p><em>Gradient 도입</em></p>
<p>$$
\nabla_\theta J(\theta) =\nabla_\theta \sum_{s\in S}d(s) \sum_{a\in A}\pi_\theta(s, a)\times R_{s, a}
$$</p>
<p>우리의 문제는 Model-free이며 무한히 많은 state가 존재하기 때문에 위의 term으로는 계산할 수 없다. 샘플기반 방법론을 도입한다면 아래와 같이 수식을 변경하여 계산할 수 있다.</p>
<ol>
<li><p>$d(s)$는 $\theta$와 관계없음</p>
<p> $$
 \nabla_\theta J(\theta) =\sum_{s\in S}d(s) \sum_{a\in A} \nabla_\theta  \pi_\theta(s, a)\times R_{s, a}
 $$</p>
</li>
<li><p>분모 분자가 같은 값을 곱함 (=1이니까 수식자체에 변화는 없다)</p>
<p> $$
 \nabla_\theta J(\theta) =\sum_{s\in S}d(s) \sum_{a\in A} \frac{\pi_\theta(s, a)} {\pi_\theta(s, a)}\nabla_\theta  \pi_\theta(s, a)\times R_{s, a}
 $$</p>
<p> $$
 \nabla_\theta J(\theta) =\sum_{s\in S}d(s) \sum_{a\in A} \pi_\theta(s, a)\frac{\nabla_\theta  \pi_\theta(s, a)} {\pi_\theta(s, a)}\times R_{s, a}
 $$</p>
</li>
<li><p>$\ln x$의 미분을 이용하여 변경</p>
<ol>
<li><p>$\frac{d }{dx} \ln x= \frac{1}{x}$</p>
</li>
<li><p>(양변 $\times dx$) ⇒ $d \ln x = \frac{dx}{x}$</p>
<p>$$
\nabla_\theta J(\theta) =\sum_{s\in S}d(s) \sum_{a\in A} \pi_\theta(s, a)\nabla_\theta  \log\pi_\theta(s, a)\times R_{s, a}
$$</p>
</li>
</ol>
</li>
<li><p>기댓값으로 표현</p>
<p> $$
 \nabla_\theta J(\theta) =\mathbb E_{\pi_\theta} [\nabla_\theta \log \pi_\theta(s,a) \times R_{s,a}]
 $$</p>
<p> ⇒ 기댓값으로 표현되었기 때문에, $\pi_\theta(s,a)$를 따라 움직이는 Agent가 실제로 Environment와 상호작용하면서 기댓값을 계산하기 위해 사용할 샘플값을 여러개 모아 평균을 내어 gradient를 계산할 수 있다.</p>
</li>
</ol>
<p>1-step이 아닌 일반적인 MDP에서는 return을 바로 받는 것이 아니라 리턴의 기댓값 q로 표현된다.</p>
<p>$$
\nabla_\theta J(\theta) =\mathbb E_{\pi_\theta} [\nabla_\theta \log \pi_\theta(s,a) \times Q_{\pi_\theta}(s,a)]
$$</p>
<h3 id="33-reinforce">3.3 REINFORCE</h3>
<p>최초의 policy gradient method로 몬테카를로 기법을 이용한다. → episode 단위로 학습</p>
<p>action-value function의 정의에 따라 $Q_{\pi}(s,a) = \mathbb E_{\pi_\theta}[G_t|s_t=s,a_t=a]$로 표현될 수 있기 때문에 기댓값의 term 안에 $Q$를 $G_t$로 표현하여 넣어준다.</p>
<p>$$
\nabla_\theta J(\theta) =\mathbb E_{\pi_\theta} [\nabla_\theta \log \pi_\theta(s,a) \times G_t]
$$</p>
<p><strong>Algorithm</strong></p>
<p align="center"><img src="https://velog.velcdn.com/images/webb-c/post/8f46fd04-44de-4502-b0a2-2a330af4580a/image.png" height="300px" width="700px"></p>

<h3 id="34-ppo">3.4 PPO</h3>
<p>PPO는 Gradient를 이용하여 학습하기 때문에 발생하는 REINFORCE 알고리즘의 단점을 해결하기 위해 고안된 알고리즘이다.</p>
<ul>
<li><p>Needs for PPO</p>
<ul>
<li><p>REINFORCE의 단점 : episode 단위로 학습하기 때문에 한번에 결과가 반영되어서 각각의 step에 대한 중요도가 잘 표현되지 않는다. ⇒ MC의 단점을 그대로 가짐</p>
</li>
<li><p>작은 step이 아닌 가능한 큰 step만큼 갱신을 하면서도 어느정도는 기존의 policy를 유지하고 싶다.</p>
<p>  <strong>⇒ Gradient가 너무 커서도, 너무 작아서도 안되게 조절하고 싶다!!</strong></p>
</li>
</ul>
</li>
</ul>
<p><strong>Formal Optimization</strong></p>
<ul>
<li><p>policy gradients : loss의 미분값</p>
<p>  $$
  \nabla_\theta J(\theta) =\mathbb E_{\pi_\theta} [\nabla_\theta \log \pi_\theta(s,a) \times \hat A_{\pi_\theta}(s,a)]
  $$</p>
</li>
<li><p><em>obejective function</em></p>
<ul>
<li><p>gradient를 취하기 전 표현</p>
<p>$$
J^{PG}(\theta) = \mathbb E_{\pi_\theta}[\log \pi_\theta(s,a)\times \hat A_{\pi_\theta} (s,a)]
$$</p>
</li>
<li><p>probability ratio를 이용한 표현</p>
<p>  $$
  J_{\theta_\text{old}} (\theta) = \mathbb E_{\pi_\theta} \left[ \frac{\pi_\theta(s, a)}{\pi_{\theta_{old}}(s,a)} \hat A_{\theta_{old}}(s,a)\right]
  $$</p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>probability ratio</strong></p>
<p>  old policy와 new policy 간의 probability ratio를 다음과 같이 정의할 수 있다.</p>
<p>  $$
  r(θ)=\frac{\pi_θ(a|s)}{π<em>{θ</em>{old}}(a|s)}
  $$</p>
<p>  $θ_{old}$와 $θ$ 간의 차이에 대한 제한이 없다면, $J$를 maximize하기 위해 parameter $\theta$를 update할 때 극도로 커질 수도 있고 극도록 작아질 수도 있게 된다. 즉, 안정성이 매우 떨어지게된다.</p>
</li>
</ul>
<p>PPO에서는 $r(θ)$가  1 이내의 작은 interval $[1−ϵ,1+ϵ]$ 사이의 값을 계속 가지도록 <strong>constraint</strong>를 추가함으로서 안정성을 유지할 수 있게 하였다. 원래의 값과, clip으로 다듬어진 probability ratio를 이용한 값 중에서 더 작은 값을 택한다. </p>
<p>⇒ 이로 인하여 더 많은 reward를 받기 위해 policy를 과하게 update하는 경우를 예방할 수 있다. </p>
<p align="center"><img src="https://velog.velcdn.com/images/webb-c/post/b9c85842-91a8-4e04-bccf-fc5228590f4b/image.png" height="300px" width="700px"></p>


<p>$$
J^{\text{CLIP}} (\theta) = \mathbb E [\min (r(\theta) \hat{A}<em>{\theta</em>{old}}(s,a),\ \text{clip}(r(\theta), 1-\epsilon , 1+\epsilon) \hat A_{\theta_{old}}(s,a))]
$$</p>
<ul>
<li><p><em>Actor-critic Network</em><br>policy(actor)와 value-function(critic)간에 parameter를 공유하는 network 구조에 PPO를 적용할 때는 value function에 대한 error값과 entropy에 대한 term을 추가하여 exploration을 더 고려해준다. </p>
<p> $$
  J^{\text{CLIP}&#39;}(\theta) = \mathbb E[J^{\text{CLIP}}(\theta) - c_1 (V_\theta(s) - V_{\text{target}})^2 + c_2 H(s, \pi_\theta(\cdot))]
 $$</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/webb-c/post/284e68ca-74ad-47bb-9395-a05ea7f84564/image.png" alt=""></p>
<p>(사실 policy optimization은 헷갈리는부분이 아직 있어서 추후에 따로 더 공부할 생각이다)</p>
<h3 id="reference">Reference</h3>
<ul>
<li><a href="http://spinningup.openai.com/en/latest/algorithms/ppo.html">OpenAI</a></li>
<li><a href="https://talkingaboutme.tistory.com/entry/RL-Policy-Gradient-Algorithms">[RL] Policy Gradient Algorithm</a></li>
<li>바닥부터 배우는 강화학습, 노승은</li>
<li>심층 강화학습 인 액션</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강화학습] Introduction to Reinforcement Learning]]></title>
            <link>https://velog.io/@webb-c/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-Introduction-to-Reinforcement-Learning</link>
            <guid>https://velog.io/@webb-c/%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-Introduction-to-Reinforcement-Learning</guid>
            <pubDate>Tue, 27 Dec 2022 02:36:33 GMT</pubDate>
            <description><![CDATA[<p><em>본 포스팅은 David Silver 교수님의 강화학습 강의와 그 강의를 정리한 깃북, 팡요랩 강의를 바탕으로 정리한 것입니다.</em></p>
<h1 id="1-what-is-reinforcement-learning">1. What is Reinforcement Learning</h1>
<hr>
<h3 id="11-definition-of-rl-in-wikipedia">1.1 Definition of RL (in WikiPedia)</h3>
<blockquote>
<p>강화 학습(Reinforcement learning)은 기계학습이 다루는 문제 중에서 다음과 같이 기술 되는 것을 다룬다. 어떤 <strong>환경</strong>을 탐색하는 <strong>에이전트</strong>가 현재의 <strong>상태</strong>를 인식하여 어떤 <strong>행동</strong>을 취한다. 그러면 그 에이전트는 환경으로부터 <strong>포상</strong>을 얻게 된다. 포상은 양수와 음수 둘 다 가능하다. 강화 학습의 알고리즘은 그 에이전트가 앞으로 누적될 포상을 최대화하는 일련의 행동으로 정의되는 <strong>정책</strong>을 찾는 방법이다.</p>
</blockquote>
<ul>
<li><p>학습 : 환경과의 상호작용을 통한 습득과정</p>
</li>
<li><p>기계학습 : 학습 과정을 “computational”한 방법으로 접근하는 것</p>
<p>  <em>기계학습의 범주</em>
  <img src="https://velog.velcdn.com/images/webb-c/post/29c04903-c0c3-4264-9a3e-8e04c11cd7d2/image.png" alt=""></p>
</li>
</ul>
<ul>
<li>강화학습 : 올바른 action이 무엇인지 알지 못하지만, <strong>환경과의 상호작용</strong>을 통하여 점차 학습해 나가는 기계학습의 한 학습 방법  </li>
<li>Example*) 사람이 처음 자전거를 탈 때</li>
</ul>
<br>


<h3 id="12-problem-of-rl">1.2 Problem of RL</h3>
<p>강화학습은 해결하고자하는 문제가 강화학습 <strong>문제</strong>; Problem인지를 기준으로 정의된다.<br>-&gt; 대부분의 기계학습 방법들은 “어떻게 학습하는가”를 기준으로 정의된다. (학습하는 방식)</p>
<ul>
<li><p><em>강화학습 문제의 예</em></p>
<ul>
<li>Fly stunt manoeuvres in a helicopter</li>
<li>Defeat the world champion at Backgammon (→ AlpaGo)</li>
<li>Manage an investment portfolio : 이윤을 maximize</li>
<li>Control a power station</li>
<li>Make a humanoid robot <strong>walk</strong></li>
<li>Play many different Atari games better than humans</li>
</ul>
</li>
<li><p>강화학습의 특징</p>
<ul>
<li><p>no supervisor, only a <strong><em>reward</em></strong> signal </p>
<ul>
<li>supervisor가 존재한다면 기계가 아무리 학습을 잘 하더라도 supervisor를 넘어설 수 없다.<ul>
<li>스스로 optimal 한 해를 찾아간다.
↔ supervisor는 아무리 잘 하더라도 suboptimal일 가능성이 높다…!</li>
<li><em>Example) 바둑에서 이기는 것을 목적이라고 할 때, supervised learning은 어떻게 돌을 둬야 좋은지 직접 일일이 <strong>훈수</strong>하는 것이라면, RL은 게임에서 이기는게 좋은 reward를 줄 뿐 어떻게 해야 게임에서 이길지를 알려주지 않는다.</em>  </li>
</ul>
</li>
</ul>
</li>
<li><p>Agent’s actions affect the subsequent data it receives</p>
<ul>
<li>수행한 행동에 따라서 그 다음에 주어지는 데이터가 달라진다.<br>↔ 일반적인 기계학습 모델은 train set이 정해져있다. (ex. image classification…)</li>
</ul>
</li>
<li><p><strong>Delayed Reward</strong></p>
<ul>
<li><p>강화학습은 “<strong>시간</strong>에 따른 순서”가 있는 문제를 해결하기에 지금 수행한 행동에 대한 반응이 뒤늦게 전달될 수도 있다. (즉각적으로 전달되지 않는다.)</p>
<p>  → sequential, non i.i.d data</p>
</li>
<li><p>지연된 그 시간동안 수행한 여러가지 다른 행동들중에서 어떤 것이 좋은 행동이었는지를 판단하기 어렵게 만드는 주요한 문제가 된다.</p>
</li>
</ul>
</li>
<li><p><strong>Trial and Error</strong></p>
<ul>
<li>Predict이 아니라, 실제로 Trial; 수행해보면서 모델을 조정해나간다.</li>
<li>good action을 수행하면 enviroment로부터 good reward가 전달된다.</li>
<li>어떻게 상을 더 많이 받을 것인지를 알아내는게 강화학습의 주요 쟁점 중 하나이다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="12-history-of-rl">1.2 History of RL</h3>
<ul>
<li><strong>Trial and Error</strong><ul>
<li>동물 행동에 대한 심리학 연구에서 출발했다.</li>
<li><em>심리학에서 “강화”</em><br>동물이나 인간이 행동에 대한 결과에 따라, 다음의 행동을 변화시키고 발전시킨다는 이론(스키너 상자실험)</li>
</ul>
</li>
</ul>
<ul>
<li><strong>Delayed Reward</strong><ul>
<li>optimal control : 어떤 비용함수의 비용을 최소화하도록 controler를 디자인하는것</li>
<li>Bellman equation : optimal control 문제의 해결방법 [Dynamic Programming]</li>
<li>MDP : Bellman이 고안한 순차 결정 문제에 대한 수학적 모델</li>
</ul>
</li>
</ul>
<p>이 2가지의 기초적인 토대로부터 강화학습이 탄생하였으며, 이후 Temporal difference Learning, Q-Learning으로 발전하다가 최근 <strong>Deep RL</strong>으로 발전하게 되었다.  </p>
<p><em>*Deep Reinforcement Learning</em></p>
<ul>
<li>처음에 강화학습을 배우기 시작할 때는 Grid world같이 작은 환경에서 예시 문제를 풀어볼 것이다.</li>
<li>그러나 실제로 게임을 학습하거나 해결하고싶은 복잡한 문제를 풀 때는 데이터의 숫자가 너무 많기 때문에 고전적인 RL을 이용해서는 제대로 학습이 되지 않는다.</li>
<li>따라서 데이터의 숫자를 다 일일이 Table로 저장해서 행동하는 것이 아니라 <strong>함수의 형태</strong>로 만들어서 정확하지는 않더라도 효율적으로 학습을 할 수 있게 하는 방법을 사용한다. [Approximation]</li>
</ul>
<br>

<h3 id="13-example-of-rl">1.3 Example of RL</h3>
<ul>
<li><p>Playing atari with deep reinforcement learning</p>
<ul>
<li><p>강화학습 + 딥러닝을 이용하여 Atari라는 고전게임을 학습</p>
</li>
<li><p>Breakout 게임의 학습과정</p>
<ul>
<li><p>랜덤하게 Agent가 움직이다가 우연히 공을 쳐서 게임의 점수가 올라가는 것을 확인한다면, “이 행동이 나에게 보상을 주는구나!”를 학습하게되어 보상을 받은 행동을 계속 수행하게된다.</p>
</li>
<li><p>이때 Agent는 단순히 즉각적인 점수만을 높이려는 것이 아니라 하나의 episode 동안 받는 점수를 최대화시키려고 한다.</p>
<p>  ⇒ 따라서 Agent는 최대한 높은 점수를 얻게 해주는 일련의 연속된 행동; 정책(Policy)을 찾아나선다.</p>
</li>
<li><p>어떤 행동이 좋은 행동이고, 어떤 행동들의 조합이 좋은 정책이 되는지는 Trail and Error로 여러번 시도하보면서 학습된다.
<img src="https://velog.velcdn.com/images/webb-c/post/d13596c5-6b4a-4d40-bfd9-9c4dc8ae18c6/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>- *논문에서 주목할 점*
    - input data로 raw pixel를 받아온 점 → CNN과의 연결
    - 같은 agent로 여러 개의 게임에 적용되어서 학습이 된다는 점
    - Deep neural network를 function approximator로 사용
    - Experience Replay
    - Target networks  </code></pre><br>

<h1 id="2-the-rl-problem">2. The RL Problem</h1>
<hr>
<h3 id="21-reward">2.1 Reward</h3>
<ul>
<li><p>Definition of Reward</p>
<blockquote>
<p><em>All</em> goals can be described by the maximisation of expected cumulative reward</p>
</blockquote>
<ul>
<li><p><em>with Reward Hypothesis</em></p>
<p>  모든 목적이 누적된 reward를 최대화하는 것으로 표현할 수 있다는 가정</p>
</li>
<li><p>scalar feedback signal $R_t$ (with $t$ is time step)</p>
</li>
<li><p>Indicates <strong>how well</strong> agent is doing at $t$</p>
<blockquote>
<p>🛠 Agent’s job is to <strong>maximise</strong> cumulative;누적 reward</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<ul>
<li><p><em>Example</em></p>
<ul>
<li>Fly stunt manoeuvres in a helicopter<ul>
<li>+ve reward for following desired trajectory</li>
<li>−ve reward for crashing</li>
</ul>
</li>
<li>Defeat the world champion at Backgammon<ul>
<li>+/−ve reward for winning/losing a game</li>
</ul>
</li>
<li>Manage an investment portfolio<ul>
<li>+ve reward for each $ in bank</li>
</ul>
</li>
<li>Control a power station<ul>
<li>+ve reward for producing power</li>
<li>−ve reward for exceeding safety thresholds</li>
</ul>
</li>
<li>Make a humanoid robot walk<ul>
<li>+ve reward for forward motion</li>
<li>−ve reward for falling over</li>
</ul>
</li>
<li>Play many different Atari games better than humans<ul>
<li>+/−ve reward for increasing/decreasing score  </li>
</ul>
</li>
</ul>
</li>
<li><p>Sequential Decision Making</p>
<ul>
<li><p><strong>Goal</strong> : select <strong>Actions</strong> to <strong>maximise</strong> total future reward</p>
</li>
<li><p><em>Problem 특징</em></p>
<ul>
<li>Action에 대한 결과는 long term이후에 나타날 수도 있다.</li>
<li>Reward가 Delay될 수 있다.</li>
</ul>
</li>
<li><p>가끔은 즉각적인 Reward는 포기하는 대신 long-term reward를 더 maximise하기 위한 Action을 수행할 수도 있다.</p>
<p>  → 늘 greedy 하게 local oprima만 선택하지는 않는다.</p>
</li>
<li><p><em>Example</em></p>
<ul>
<li>A financial investment (may take months to mature)</li>
<li>Refuelling a helicopter (might prevent a crash in several hours)</li>
<li>Blocking opponent moves (might help winning chances many moves from now)</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="22-agent-and-environment">2.2 Agent and Environment</h3>
<p>At each step $t$,</p>
<ul>
<li><p>The Agent’s aspect</p>
<ul>
<li><p>env로부터 Observation $O_t$를 받는다.
<em>이때 Observation은 Agent의 action으로 인하여 변화된 환경을 나타낸다.</em></p>
</li>
<li><p>env로부터 scalar reward $R_t$를 받는다.</p>
<p>  ⬇</p>
</li>
<li><p>Action $A_t$를 수행한다.</p>
</li>
</ul>
</li>
<li><p>The Environment’s aspect</p>
<ul>
<li><p>agent로부터 Action $A_t$를 받는다.  </p>
<p>⬇</p>
</li>
<li><p>observation $O_{t+1}$를 준다.</p>
</li>
<li><p>scalar reward $R_{t+1}$를 준다.</p>
<p>  → $t$는 environment의 step에 따라 증가한다.</p>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/webb-c/post/95a053a8-f147-44f7-8bf7-c71bfb7fc75f/image.png" alt=""></p>
<br>


<h3 id="23-state">2.3 State</h3>
<ul>
<li><p>History  </p>
<ul>
<li><p>$H_t$는 그 시간 $t$까지 있었던 모든 각각의 timestep마다 Agent가 수행한 action과 그때의 observation, reward를 순차적으로 기록한 것</p>
</li>
<li><p><em>history가 결정하는 것</em>  </p>
<ul>
<li>Agent는 Action을 결정한다.</li>
<li>Environment는 observation과 reward를 결정한다.</li>
</ul>
<p>$$
H_t = O_1,R_1,A_1, \cdots, A_{t-1},O_t,R_t
$$</p>
</li>
</ul>
</li>
<li><p><strong>State</strong></p>
<ul>
<li><p>State is the information used to determine what happens <strong>Next</strong></p>
</li>
<li><p>history에 대한 함수; History가 가지고 있는 정보들을 가공하여 State를 만든다.</p>
<p>$$
S_t = f(H_t)
$$</p>
</li>
</ul>
</li>
<li><p><em>관점에 따른 State</em></p>
<ul>
<li><p>Environment State $S^e_t$</p>
<ul>
<li><p>env가 <strong>Next observation</strong>과 <strong>reward</strong>를 계산하기 위해 사용한 모든 information (숫자들)  </p>
<p>Example<em>) Atari game에서 Agent가 select한 Action에 따라 표기되는 다음 화면(=observation)을 계산하기 위해 참고하는 정보들<br>  *→ 공의 위치, 현재 박스의 개수 및 구조…</em></p>
</li>
<li><p>env의 state는 agent에게는 보이지 않는다. (보이더라도 너무 복잡한 정보라 활용x)</p>
<p>  <em>Example</em>) 우리가 게임을 플레이할 때는 컴퓨터 내부적으로 어떻게 계산되는지는 알 필요가 없다 !</p>
</li>
</ul>
</li>
<li><p>Agent State $S^a_t$</p>
<ul>
<li><p>Agent가 <strong>Next Action</strong>을 select하기 위해 참고하는 정보들 (내가 정하는 것)</p>
</li>
<li><p>실제로 통용되는 State와 동일하다.</p>
<p>$$
S^a_t = f(H_t)
$$</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>Information state : <strong>Markov state</strong></p>
<ul>
<li><p>Definition</p>
<blockquote>
<p>A state $S_t$ is <strong>Markov *</strong>if and only if*</p>
<p>$$
\mathbb P[S_{t+1}|S_t] = \mathbb P[S_{t+1}|S_1, \cdots, S_t]
$$</p>
</blockquote>
</li>
<li><p><em>The future is <strong>independent</strong> of the past given the present</em></p>
<ul>
<li><p>과거와 미래는 독립적이다!</p>
</li>
<li><p>미래를 결정할 때, 예전의 state들은 필요없이 바로 이전의 state만을 참고하여 결정한다.</p>
<p>  $$
  H_{1:t} \rightarrow S_t \rightarrow H_{t+1:\infin}
  $$</p>
</li>
</ul>
</li>
<li><p>즉, 이런식으로 state를 Markov하게 표현할 수 있다면, 문제를 훨씬 더 간단하게 표현할 수 있다!</p>
</li>
<li><p><em>Example : Rat</em></p>
<p>  <img src="https://velog.velcdn.com/images/webb-c/post/fe5eb20c-a3f9-4cdb-a1f7-f2db47cbe395/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>    1. 최근 3가지의 signal을 state로 정의한다면, → *감전*
    2. 전체 history에서 각 signal이 등장한 횟수를 state로 정의한다면, → *치즈*

    ⇒ 즉, 어떻게 History에 대한 function을 정의하여 State를 표현하는지에 따라서 같은 데이터라 하더라도 다르게 예측할 수 있다.</code></pre><ul>
<li><p><em>Observe에 따른 State</em></p>
<ul>
<li><p>Fully Observability</p>
<ul>
<li><p><em>Markov decision process : MDP</em></p>
</li>
<li><p>env의 state를 agent가 볼 수 있는 상황</p>
</li>
<li><p>Agent state = environment state = Information state</p>
<p>$$
O_t = S^a_t = S^e_t
$$</p>
</li>
</ul>
</li>
<li><p>Partially Observability</p>
<ul>
<li><em>partially observable Markov decision process : POMDP</em></li>
<li>Agent state ≠ environment state<br>⇒ 따라서 Agent는 반드시 자신의 State를 표현하기 위한 방법을 구축해야한다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>    - Agent의 State 표현법 예시들…
        - Complete history : $S^a_t = H_t$
        - Beliefs of environment state : $S^a_t = (\mathbb P[S^e_t = s^1],\cdots, \mathbb P[S^e_t = s^n])$
        - Recurrent Neural network : $S^a_t = \sigma(S^a_{t-1}W_s + O_t W_o)$
    - *Example*
        - 로봇이 길을 걸을 때 카메라는, 로봇의 정확한 위치정보를 제공하지 않는다.
        - 포커를 할 때, 상대방이 가지고 있는 패와 내가 뽑게될 패에 대한 정보를 모르더라도 Action을 결정해야한다.</code></pre><br>


<h1 id="3-the-rl-agent">3. The RL Agent</h1>
<hr>
<p>대표적인 RL Agent의 구성요소</p>
<ul>
<li><p>Policy : Agent’s behaviour function</p>
</li>
<li><p>Value Function : how good is each state and/or action</p>
</li>
<li><p>Model : Agent’s representation of the environment</p>
<p>  → Agent는 3가지의 구성요소를 모두 가지고 있을수도 있고, 하나만 가지고 있을수도 있다!</p>
</li>
</ul>
<h3 id="31-policy">3.1 Policy</h3>
<p>$$
\pi
$$</p>
<ul>
<li><p>A <strong>policy</strong> is the Agent’s behaviour</p>
<ul>
<li>Agent의 행동을 규정한다.</li>
<li>state를 입력으로 전달하면, action을 반환한다. → state와 action을 <em>mapping</em></li>
</ul>
</li>
<li><p>Policy의 종류</p>
<ul>
<li><p>deterministic policy : state에 대하여 <strong>하나의 action</strong>을 정확하게 결정해서 반환한다.</p>
<p>  $$
  a=\pi(s)
  $$</p>
</li>
<li><p>stochastic policy : state에 대하여 <strong>여러가지 action</strong>이 가능한데, 이때 각각의 action에 대한 확률을 반환한다.</p>
<p>  $$
  \pi(a|s) = \mathbb P[A_t=a|S_t=s]
  $$</p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="32-value-function">3.2 Value Function</h3>
<p>$$
v_\pi
$$</p>
<ul>
<li><p><strong>Value function</strong> is a prediction of future reward</p>
<ul>
<li>현재의 state가 얼마나 좋은지를 “평가”한다.</li>
<li>현재로부터 미래까지 받을 수있는 모든 Reward들의 합산의 기댓값으로 표현할 수 있다.  </li>
</ul>
</li>
<li><p><em>Formal 표현</em></p>
<ul>
<li><p>$s$ : 현재 state를 의미</p>
</li>
<li><p>$v$ : value fuction을 의미</p>
<p>  → 이때 아래첨자 $\pi$는 Agent가 어떤 policy $\pi$를 따라서 진행한다는 것을 나타낸다.</p>
</li>
<li><p>$\mathbb E$ : 여러가지 가능한 모든 episode가 존재하기 때문에, 기댓값을 이용하여 나타낸다.</p>
</li>
<li><p>$\gamma$ : 미래의 Reward에 대한 가중치를 줄여서 나타내기 위한 상수값</p>
</li>
</ul>
</li>
</ul>
<p>$$
v_\pi(s) = \mathbb E_{\pi}[R_{t+1}+\gamma R_{t+2} + \gamma^2R_{t+3} + \cdots | S_t = s]
$$</p>
<br>

<h3 id="33-model">3.3 Model</h3>
<ul>
<li><p>Model predicts what the environment will do next</p>
<ul>
<li>Environment가 어떻게 변화할지를 <strong>예측</strong>하는 요소</li>
<li>Environment의 역할(=state의 변화, reward 전달)을 Agent가 Model을 이용하여 예측해서 표현</li>
</ul>
</li>
<li><p><em>Model의 종류</em></p>
<ul>
<li><p>$\mathcal P$ predicts the next state = state의 <em>transition</em>을 예측</p>
</li>
<li><p>$\mathcal R$ predicts the next (immediate) reward</p>
<p>  $$
  \mathcal P^a_{ss&#39;} = \mathbb P[S_{t+1} = s&#39; | S_t = s, A_t =a]
  $$</p>
<p>  $$
  \mathcal R^a_{s} = \mathbb E[R_{t+1} | S_t = s, A_t =a]
  $$</p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="34-category-of-rl-agent">3.4 Category of RL Agent</h3>
<ul>
<li><em>Policy와 Value에 따른 분류</em><ul>
<li>Value Based<ul>
<li>No Policy</li>
<li>Value Function</li>
</ul>
</li>
<li>Policy Based<ul>
<li>Policy</li>
<li>No Value Function</li>
</ul>
</li>
<li>Actor Critic<ul>
<li>Policy</li>
<li>Value Function</li>
</ul>
</li>
</ul>
</li>
<li><em>Model에 따른 분류</em><ul>
<li>Model Free<ul>
<li>Policy and/or Value Function</li>
<li>No Model</li>
</ul>
</li>
<li>Model Based<ul>
<li>Policy and/or Value Function</li>
<li>Model</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/webb-c/post/cbe43796-0cdc-48e4-92d4-d90e20c3d8db/image.png" alt=""></p>
<br>

<h1 id="4-problems-within-rl">4. Problems within RL</h1>
<hr>
<h3 id="41-learning--planning">4.1 Learning &amp; Planning</h3>
<p>[1] </p>
<p>강화학습 문제의 종류</p>
<ul>
<li>(Reinforcement) Learning<ul>
<li>Environment는 initially <strong>unknown</strong>이다.</li>
<li>Agent는 environment와 상호작용한다.</li>
<li>Agent는 자신의 policy를 향상시키려고한다.</li>
<li><em>Example with Atari</em><br>실제로 게임의 동작과정이나 규칙을 모르는 상태에서, 실제로 Agent가 게임을 플레이하는 과정을 통하여 env와 상호작용하면서 policy가 향상되는 방향으로 학습해나간다. </li>
</ul>
</li>
</ul>
<ul>
<li><p>Planning
<em>*(a.k.a) delibertation, reasoning, introspection, pondering, thought, search</em></p>
<ul>
<li><p>Environment의 Model은 <strong>known</strong>이다. (즉, Reward와 Transition을 알고있다.)</p>
</li>
<li><p>Agent는 model을 이용하여 computation한다.<br>→ 실제로 environment와 상호작용하지 않고도 simulation할 수 있다. </p>
</li>
<li><p>Agent는 자신의 policy를 향상시키려고한다.</p>
</li>
<li><p><em>Example with Atari</em><br>게임의 규칙을 알고 있어서 어떤 query emulator가 존재한다. emulator에 query를 전달하면, 그 Action에 대한 state의 transition, reward등에 대한 질문에 대답할 수 있다.</p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="42-exploitation--exploration">4.2 Exploitation &amp; Exploration</h3>
<ul>
<li><p><strong>Exploration</strong> finds more information about the environment<br>env로부터 정보를 얻는 과정</p>
</li>
<li><p><strong>Exploitation</strong> exploits known information to maximise reward<br>지금까지 얻은 정보를 바탕으로 reward를 maximise할 수 있는 선택을 수행하는 과정
  ⇒ It is usually important to explore as well as exploit</p>
</li>
<li><p><em>Example</em></p>
<ul>
<li>Restaurant Selection<ul>
<li>Exploitation Go to your favourite restaurant</li>
<li>Exploration Try a new restaurant</li>
</ul>
</li>
<li>Online Banner Advertisements<ul>
<li>Exploitation Show the most successful advert</li>
<li>Exploration Show a different advert</li>
</ul>
</li>
<li>Oil Drilling<ul>
<li>Exploitation Drill at the best known location</li>
<li>Exploration Drill at a new location</li>
</ul>
</li>
<li>Game Playing<ul>
<li>Exploitation Play the move you believe is best</li>
<li>Exploration Play an experimental move</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="43-prediction--control">4.3 Prediction &amp; Control</h3>
<ul>
<li><p>Prediction</p>
<ul>
<li><p>evaluate the future, Given a policy</p>
</li>
<li><p>policy가 주어졌을 때, 미래를 평가하는 문제</p>
<p>  ⇒ value function을 잘 학습시키는 것이 문제의 목적이다.</p>
</li>
</ul>
</li>
<li><p>Control</p>
<ul>
<li><p>optimise the future, Find the best policy</p>
</li>
<li><p>미래를 최적화하는 문제</p>
<p>  ⇒ best policy를 찾는 것이 문제의 목적이다.</p>
</li>
</ul>
</li>
<li><p><em>Gridworld Example</em></p>
<ul>
<li><p>Prediction : uniform random policy로 agent가 움직일 때, 각 칸의 value는 얼마가 될 것인가?</p>
</li>
<li><p><em>(a)가 주어진 reward일 때, (b)가 prediction 문제를 푼 결과이다.</em></p>
<p><img src="https://velog.velcdn.com/images/webb-c/post/23a6ba29-15fc-4221-869e-83fad7744939/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- Control : 최적$^{[1]}$ policy는 무엇이고, 최적 policy를 따르는 value function을 이용한 value는 얼마가 될 것인가?
- *(a)가 주어진 reward일 때, (b)와 (c)가 control 문제를 푼 결과이다.*

    ![](https://velog.velcdn.com/images/webb-c/post/6ff9286d-e237-49d3-a983-579766e6d134/image.png)</code></pre><br>


<h3 id="reference">Reference</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=2pWv7GOvuf0">Introduction to Reinforcement Learning  by David Silver</a></li>
<li><a href="https://youtube.com/playlist?list=PLpRS2w0xWHTcTZyyX8LMmtbcMXpd3s4TU">팡요랩 : 강화학습의 기초 이론</a></li>
<li><a href="https://dnddnjs.gitbooks.io/rl/content/index.html">깃북 : Fundamental of Reinforcement Learning</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[선형대수학] Change of Basis]]></title>
            <link>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Change-of-Basis</link>
            <guid>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Change-of-Basis</guid>
            <pubDate>Sun, 28 Aug 2022 05:05:21 GMT</pubDate>
            <description><![CDATA[<h1 id="image-compression-idea">Image Compression idea</h1>
<h3 id="basis의-특징">Basis의 특징</h3>
<ul>
<li><p>Basis는 하나의 동일한 subspace에 대하여 여러개 존재할 수 있다.</p>
<p>  이때, subspace안의 벡터를 표현할 때 어떤 basis를 사용하여 표현하는지에 따라서 필요한 정보의 양이 달라질 수 있다. [이미지 압축의 아이디어]</p>
</li>
<li><p>Basis들은 subspace안의 모든 벡터들을 linear combination으로 표현할 수 있다.</p>
</li>
</ul>
<p>→ 이런 basis의 특징들을 이용하여 어떤 벡터나 값을 아주 단순하게 표현하게 하는 basis를 찾을 수 있고, 현재의 복잡한 basis 대신에 단순한 basis를 이용하여 subspace를 표현하는 것이 바로 <strong><em>Change of Basis</em></strong>이다.</p>
<p><U><em>Example</em></U></p>
<p>$\mathbb R^4$상에 존재하는 벡터 $\bold v$의 간단한 표현</p>
<ul>
<li><p><em>standard basis 표현</em></p>
<p>  $$
  \bold v = \begin{bmatrix} 2 \ -2 \ 2 \ -2 \end{bmatrix} = 2 \begin{bmatrix} 1 \ 0 \ 0 \ 0 \end{bmatrix} -2 \begin{bmatrix} 0 \ 1 \ 0 \ 0 \end{bmatrix} + 2 \begin{bmatrix} 0 \ 0 \ 1 \ 0 \end{bmatrix} - 2 \begin{bmatrix} 0 \ 0 \ 0 \ 1 \end{bmatrix}
  $$</p>
<p>  → 이렇게 표현하면 컴퓨터는 각 standard vector에 곱해지는 상수값 2, -2, 2, -2 (4개)와 사용하는 basis의 벡터와 그 순사를 모두 저장해야한다.</p>
</li>
</ul>
<ul>
<li><p><em>동일한 공간을 나타내는 다른 basis를 사용한 표현</em></p>
<ul>
<li><p><em>basis</em></p>
<p>  $\left{ \begin{bmatrix} 1 \ 1 \ 1 \ 1 \end{bmatrix},\begin{bmatrix} 1\ -1 \ -1 \ 1 \end{bmatrix},\begin{bmatrix} 1 \ 1 \ -1 \ -1 \end{bmatrix},\begin{bmatrix} 1 \ -1 \ 1 \ -1 \end{bmatrix} \right}$</p>
</li>
<li><p>표현</p>
<p>$$
\bold v = 0\begin{bmatrix} 1 \ 1 \ 1 \ 1 \end{bmatrix}+0 \begin{bmatrix} 1\ -1 \ -1 \ 1 \end{bmatrix}+0 \begin{bmatrix} 1 \ 1 \ -1 \ -1 \end{bmatrix}+2\begin{bmatrix} 1 \ -1 \ 1 \ -1 \end{bmatrix} 
$$</p>
<p>→ 이렇게 표현하면 사용하는 벡터가 1개 뿐이므로, 사용되는 벡터와 거기에 곱해지는 상수값 2만 저장하면 된다.</p>
<p>⇒ standard basis를 이용하여 표현 했던 것보다 훨씬 간단하게(=저장용량을 적게 사용하도록) 표현할 수 있다!</p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="image-compression-idea-1">Image Compression Idea</h3>
<p>$1024\times 1024$ pixel의 gray image($255$)를 나타내는 벡터 $\bold x ∈ \mathbb R^{1024^2}$. 이때 벡터 $\bold x$의 각각의 픽셀 $x_i$는 $0 -255$ 사이의 값(=$1$byte로 표현가능)을 가진다.</p>
<ul>
<li><p>각각의 픽셀 값을 모두 저장하려면 $1024^2$개의 픽셀 값을 저장하기 위한 공간이 필요하다.</p>
<p>  → $1024^2$ byte 필요</p>
</li>
<li><p>Image Compression</p>
<ul>
<li><p>각각의 픽셀이 모두 검은색인 어떤 imgae를 저장한다고 가정해보자.</p>
</li>
<li><p>아무런 처리과정을 거치지 않고 저장한다면 $1024^2$개 픽셀값에 모두 $255$(=black)값이 저장되어 $1024^2$ byte를 이미지 표현에 사용하게된다.</p>
<p>  $$
  255\begin{bmatrix} 1 \ 0 \ \vdots \ 0 \end{bmatrix}+255 \begin{bmatrix} 0\ 1 \ \vdots \ 0\end{bmatrix}+\cdots +255\begin{bmatrix} 0 \ 0 \ \vdots \ 1 \end{bmatrix} 
  $$</p>
</li>
<li><p><em>만약, 앞에서 보인 예시처럼 standard basis를 이용하여 이미지를 표현하지 않고 다른 basis를 사용하면 어떻게 될까?</em></p>
</li>
<li><p>벡터$[1,1,...,1]^T$를 가지는 어떤 basis를 사용하여 이미지를 표현하면 다음과 같이 나타낼 수 있다.</p>
<p>  $$
  255\begin{bmatrix} 1 \ 1 \ \vdots \ 1 \end{bmatrix}+0 \begin{bmatrix} 1\ -1 \ \vdots \ -1\end{bmatrix}+\cdots +0\begin{bmatrix} -1 \ -1 \ \vdots \ -1 \end{bmatrix} 
  $$</p>
</li>
<li><p>0 이 곱해지는 의미없는 벡터는 무시하고,  의미있는 상수값 255가 곱해지는 벡터만을 컴퓨터가 저장하면 훨씬 작은 저장공간을 사용하면서 같은 이미지를 저장할 수 있게 된다.</p>
</li>
</ul>
</li>
</ul>
<p>→ standard basis의 결합으로 이미지를 표현하지 말고 다른 basis로 표현하면 저장공간을 아낄 수 있다.</p>
<p><strong><em>*JPEG?</em></strong></p>
<p>표준 이미지 형식 JPEG는 이미지를 각각의 $8\times 8$ block으로 나눈다. </p>
<p>(이미지 전체를 계산하기에는 계산양이 너무 많기 때문에 고안한 방식)</p>
<br>

<h1 id="discrete-wavelet-transform-dwt">Discrete Wavelet Transform; DWT</h1>
<h3 id="discrete-wavelet-transform">Discrete Wavelet Transform</h3>
<ul>
<li><p>아래의 Othogonal basis는 실제로 JPEG2000에서 사용하는 basis이다.</p>
</li>
<li><p><strong>영벡터가 아닌 직교벡터 8개는 서로 독립</strong>이므로 아래의 벡터들은 $\mathbb R^8$의 basis이다.</p>
<p>  $$
  \begin{bmatrix} 1 \1 \1\1\1\1\1\1 \end{bmatrix},\begin{bmatrix} 1 \1 \1\1\-1\-1\-1\-1 \end{bmatrix},\begin{bmatrix} 1 \1 \-1\-1\0\0\0\0 \end{bmatrix},\begin{bmatrix} 0 \0 \0\0\1\1\-1\-1 \end{bmatrix},\begin{bmatrix} 1 \-1 \0\0\0\0\0\0 \end{bmatrix},\begin{bmatrix} 0 \0 \1\-1\0\0\0\0 \end{bmatrix},\begin{bmatrix} 0 \0 \0\0\1\-1\0\0 \end{bmatrix},\begin{bmatrix} 0 \0 \0\0\0\0\1\-1 \end{bmatrix}
  $$</p>
</li>
</ul>
<p>💡 이처럼, <strong>orthogonal basis를 basis로 고르는 것</strong>이 가장 좋은 방법이다. <em>(why?)</em></p>
<br>

<h3 id="interpretation-of-harar-wavelet-basis">Interpretation of Harar Wavelet Basis</h3>
<p>$\mathbb R^4$<em>으로 생각해보기 - Harar Matrix 이해하기</em></p>
<ul>
<li><p>$\mathbb R^4$의 Othogonal basis는 다음과 같다.</p>
<p>  $$
  \begin{bmatrix} 1 \ 1\ 1\ 1 \end{bmatrix} , \begin{bmatrix} 1 \ 1\ -1\ -1 \end{bmatrix} ,\begin{bmatrix} 1 \ -1\ 0\ 0 \end{bmatrix} ,\begin{bmatrix} 0 \ 0\ 1\ -1 \end{bmatrix} 
  $$</p>
</li>
<li><p>다음 vector $\bold x$를 Othogonal basis로 표현 해보자.</p>
<p>  $$
  \bold x =\begin{bmatrix} 100 \ 100\ 101\ 101 \end{bmatrix}
  $$</p>
<p>  $$
  =\begin{bmatrix} 100 \ 100\ 101\ 101 \end{bmatrix} = 100.5 \times \begin{bmatrix} 1 \ 1 \ 1\ 1 \end{bmatrix} + (-0.5) \times \begin{bmatrix} 1 \ 1 \ -1\ -1 \end{bmatrix} + 0 \times \begin{bmatrix} 1 \ -1 \ 0\ 0 \end{bmatrix} + 0 \times \begin{bmatrix} 0 \ 0 \ 1\ -1 \end{bmatrix}
  $$</p>
<ul>
<li><p>첫번째 basis 벡터에는 벡터 $\bold x$ 요소들의 <strong>평균값을 곱한다.</strong></p>
<p>  $$
  \frac{\sum_{i=1}^4 x_i}{4} = \frac{(x_1 + x_2 + x_3 + x_4) - 0}{4}
  $$</p>
</li>
<li><p>두번째 basis 벡터는 $\bold x$를 <strong>반으로 나눴을 때</strong>($x_1, x_2$ / $x_3, x_4$)위 요소의 합과 아래요소 합의 차이의 평균을 곱한다.</p>
<p>  (이때 나누는 기준은 vector의 값이 1 → -1로 변하는 위치이다)</p>
<p>  $$
  \frac{(x_1 + x_2) - (x_3 + x_4)}{4}
  $$</p>
</li>
<li><p>세번째 basis 벡터는 첫번째 요소와 두번째 요소 차이의 평균을 곱한다.</p>
<p>  $$
  \frac{x_1 - x_2}{2}
  $$</p>
</li>
<li><p>네번째 basis 벡터는 세번째 요소와 네번째 요소 차이의 평균을 곱한다.</p>
<p> $$
  \frac{x_3 - x_4}{2}
 $$</p>
</li>
</ul>
</li>
</ul>
<pre><code>→ basis 벡터에서 0이 아닌 요소만을 고려했을 때, 값이 **음수**인 부분과 **양수**인 부분 각각의 합의 차이의 **평균값**이 각 basis 벡터에 곱해지는 상수 값이 된다.

$$
\frac{\text{양수인 요소들의 합 - 음수인 요소들의 합}}{\text{0이아닌 요소의 개수}}
$$</code></pre><br>

<ul>
<li><p>벡터 $\bold x$를 압축시킬 수 있는 벡터 $\bold c$ 구하기</p>
<ul>
<li><p>벡터 $\bold c$는 $\bold x$를 압축시키기 위해 basis에 곱해지는 상수값들의 집합</p>
</li>
<li><p>$W$는 $\bold w_i$를 column vector로 갖는 basis를 의미한다.</p>
<p>$$
\bold x= c_1\bold w_1 + ... + c_4 \bold w_4 = [\bold w_1 \cdots \bold w_4] \begin{bmatrix} c_1 \ \vdots \ c_4 \end{bmatrix} = W\bold c 
$$</p>
</li>
<li><p>따라서 위 수식을 다르게 표현하면 다음과 같이 벡터 $\bold c$를 나타낼 수 있다.</p>
<p>  ($W$는 서로 independence한 column vector로 이루어져 있기에, 역행렬을 갖는다.)</p>
<p>  $$
  \bold c = W^{-1}\bold x
  $$</p>
</li>
<li><p>$\bold c$<strong>의 의미</strong></p>
<blockquote>
<p>$\bold x$를 $W$basis를 이용한 좌표계상의 좌표로 표현한 것이 바로 $\bold c$이다.</p>
</blockquote>
<p>  이렇게 표현한 $\bold c$에서는 데이터를 저장할 때 사용되는 용량을 줄이기 위해서 정보량이 가장 위쪽으로 쏠리도록 구성하는 것이 일반적이다.  (0은 저장하지 않기 때문)</p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="loseless압축과-lossy압축"><strong>loseless압축과 lossy압축</strong></h3>
<ul>
<li><p>loseless</p>
<p>  <em>손실없는 압축이라는 의미</em></p>
<ul>
<li><p>0을 제외한 $\bold c$의 값들을 그대로 저장한다.</p>
</li>
<li><p>압축된 이미지를 클릭하는 순간 압축파일 $\bold c$ 왼쪽에 basis $W$를 곱해지면서 원본이미지를 그대로 복원할 수 있다.</p>
<p>$$
W\bold c = WW^{-1}\bold x = \bold x
$$</p>
</li>
</ul>
</li>
<li><p>lossy</p>
<ul>
<li><p>0을 제외한 $\bold c$의 값 중에서 특히 0과 가까운 값은 <strong>근사</strong>하여 0으로 취급하여 저장한다.</p>
<p>  → 0으로 근사된 값은 저장하지 않음</p>
</li>
<li><p>이렇게 압축을 했다가 복원하면 미세한 색의 차이가 1가지 색으로 뭉뚱그러지기때문에 약간의 손실이 발생한다.</p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="conditions-for-good-basis">Conditions for Good Basis</h3>
<p><em>좋은 basis 선택의 조건</em></p>
<ul>
<li><p>빠른 계산이 가능해야한다.</p>
<p>  → <strong>DWT</strong>에서는 <strong>역행렬을 $W^{-1} = W^T$로 표현할 수 있기 때문에</strong> 빠른 계산이 가능하다.</p>
</li>
<li><p>압축시 메모리 공간을 적게 차지하게 하는 basis를 선택해야한다.</p>
</li>
</ul>
<br>

<h3 id="응용">응용</h3>
<p>이미지는 기본적으로 2-D matrix형태이므로, 행렬에 대해서 압축을 하기 위해서는 <strong>Haar matrix</strong>가 필요하다.</p>
<br> 

<h1 id="haar-wavelet-transform">Haar Wavelet Transform</h1>
<p><em>최초의 DWT 변환 (변환방법의 한 종류임)</em></p>
<h3 id="kronecker-product">Kronecker Product</h3>
<ul>
<li><p>$m\times n$ 행렬 $A$와 $p\times q$ 행렬 $B$에 대하여 $A$의 각각의 요소에 모두 행렬 $B$를 곱하는 연산자.</p>
</li>
<li><p>연산결과는 $mp\times nq$ 행렬이 된다.</p>
</li>
<li><p>$A\otimes B$</p>
<p>  $$
  A \otimes  B = \begin{bmatrix} a_{11}B &amp; a_{12}B &amp; \cdots &amp; a_{1n} \a_{21}B &amp; a_{22}B &amp; \cdots &amp; a_{2n}\ \vdots &amp; \vdots &amp; \ddots &amp; \vdots \ a_{m1}B &amp; a_{m2}B &amp; \cdots &amp; a_{mn}B  \end{bmatrix}
  $$</p>
</li>
<li><p>$A$와 $B$가 둘다 벡터라면, 이 연산은 <strong>외적</strong>과 동일하다.</p>
</li>
</ul>
<br>

<h3 id="haar-matrix">Haar Matrix</h3>
<blockquote>
<p>$n=2^t (t=0,1,2,...)$인 $n\times n$행렬 $H_n$은 다음과 같이 정의된다.</p>
</blockquote>
<p>($I_m$은 $m\times m$ identity matrix를 의미한다.)</p>
<p>$$
H_n = \begin{cases} \left[ H_m \otimes \begin{bmatrix} 1 \ 1 \end{bmatrix} \ \ I_m \otimes \begin{bmatrix} 1 \ -1 \end{bmatrix} \right]  &amp; \text{if } n=2m\ \left[ 1 \right ] &amp; \text{if }n=1 \end{cases}
$$</p>
<p>→ 이렇게 정의된 Haar Matrix에서 각각의 column vector를 column vector의 크기로 나누어 정규화:<strong>normalize</strong> 해서 사용한다. </p>
<p><em>Example of Haar Matrix</em></p>
<p>$$
H_2 = \begin{bmatrix}1 &amp; 1 \ 1 &amp; -1 \end{bmatrix}
$$</p>
<p>$$
H_4 = \begin{bmatrix}1 &amp; 1 &amp; 1 &amp; 0\ 1 &amp; 1 &amp; -1 &amp; 0 \ 1 &amp; -1 &amp; 0 &amp; 1 \ 1 &amp; -1 &amp; 0 &amp; -1 \end{bmatrix}
$$</p>
<p>$$
H_8 = \begin{bmatrix}1 &amp; 1 &amp; 1 &amp; 0 &amp; 1 &amp; 0 &amp; 0 &amp; 0\ 1 &amp; 1 &amp; 1 &amp; 0 &amp; -1 &amp; 0 &amp; 0 &amp; 0 \ 1 &amp; 1 &amp;-1 &amp; 0 &amp; 0 &amp; 1 &amp; 0 &amp; 0\ 1 &amp; 1 &amp;-1 &amp; 0 &amp; 0 &amp; -1 &amp; 0 &amp; 0  \ 1 &amp; -1 &amp;0 &amp; 1 &amp; 0 &amp; 0 &amp; 1 &amp; 0 \ 1 &amp; -1 &amp;0 &amp; 1 &amp; 0 &amp; 0 &amp; -1 &amp; 0 \ 1 &amp; -1 &amp;0 &amp; -1 &amp; 0 &amp; 0 &amp; 0 &amp; 1 \ 1 &amp; -1 &amp;0 &amp; -1 &amp; 0 &amp; 0 &amp; 0 &amp; -1 \end{bmatrix}
$$</p>
<br>

<h3 id="haar-wavelet-transforms--2-d-dwt">Haar Wavelet Transforms : <strong>2-D DWT</strong></h3>
<ul>
<li><p>$n\times n$ matrix $A$가 $n \times n$ pixel의 gray image를 나타낸다. ($n = 2^t$)</p>
</li>
<li><p>$H_n$이 정규화된 Harr Matrix라고 하자.</p>
<ul>
<li>정규화된 Harr Matrix는 <strong>Orthogonomal</strong> matrix이다.</li>
<li>$\bold h_i$  는 $H_n$의 $i$번째 column vector</li>
</ul>
</li>
<li><p>$H_n^TH_n = I_n$ 임을 Orthogonal 행렬의 성질으로부터 알아낼 수 있고 이를 활용하여 나타낼 수 있다.</p>
<p>  → Orthogonal matrix는 역행렬이 전치행렬과 동일하다. </p>
</li>
<li><p>이미지 파일을 압축하기 위해서는 original image matrix $A$의 왼쪽에는 $H_n^T$를 오른쪽에는 $H_n$을 곱해줘서 압축한다.</p>
</li>
</ul>
<p>$$
B = {H_n}^T A H_n = \begin{bmatrix} \bold {h_1}^TA\bold h_1  &amp; \bold {h_1}^TA\bold h_2  &amp; \cdots &amp; \bold {h_1}^TA\bold h_n \ \bold {h_2}^TA\bold h_1  &amp; \bold {h_2}^TA\bold h_2  &amp; \cdots &amp; \bold {h_2}^TA\bold h_n \ \vdots &amp; \vdots &amp; \ddots &amp; \vdots \ \bold {h_n}^TA\bold h_1  &amp; \bold {h_n}^TA\bold h_2  &amp; \cdots &amp; \bold {h_n}^TA\bold h_n\end{bmatrix}
$$</p>
<br>

<h3 id="haar-wavelet-transforms의-특징">Haar Wavelet Transforms의 특징</h3>
<ul>
<li><p>정보량이 Left-Top으로 모인다. (아래쪽에는 0)</p>
<ul>
<li>전체 pixel의 평균값을 나타내는 성분 $\bold {h_1}^TA\bold h_1$이 $B_{11}$에 위치한다.</li>
<li>또한 $B_{nn}$으로 갈수록 적은 픽셀간의 차이만 나타내기 때문에 0에 가까운 값을 가지게 된다.</li>
</ul>
</li>
<li><p>이 특징을 이용해서 압축 matrix $B$에서 <strong>데이터가 많이 모여있는 부분만 저장하고 다시 압축을 풀면</strong>, 차이는 있겠지만 여전히 $A$와 비슷한 이미지를 띈다.</p>
<p>  $$
  \hat A = H_n \hat B {H_n}^T
  $$</p>
</li>
</ul>
<br>

<h1 id="orthonomal-matrix">Orthonomal matrix</h1>
<p><em>Orthogonal + nomalize</em></p>
<h3 id="orthonomal-matrix-1">Orthonomal matrix</h3>
<blockquote>
<p>$n\times n$ matirx $Q = [\bold q_1,\ \bold q_2, \cdots , \ \bold q_n]$ 에서 각 column 벡터가 다음 성질을 만족하면 <strong>Orthonomal</strong> matrix이다.</p>
</blockquote>
<p>$$
\bold{q_i}^T\bold{q_j} = \begin{cases} 1 &amp; (i=j) \ 0 &amp; (i \neq j)\end{cases}
$$</p>
<ul>
<li>$i=j$ 일 때, $1$ → 각 열벡터들의 <strong>자기자신의 내적</strong>이 $1$이므로 이는 column vector가 길이가 1인 <strong>nomal vector라는 것을 의미한다.</strong></li>
<li>$i≠j$ 일 때, $0$ → 각 열벡터들간의 내적이 $0$이므로 서로 <strong>직교(Orthogonal)</strong>관계라는 것을 의미한다.</li>
</ul>
<p>💡 따라서 행렬 $Q$는 각 열벡터의 길이가 1이고 서로 직교인 열벡터들로 이루어져 있다.</p>
<br>

<h3 id="orthogonomal-행렬의-역행렬이-전치행렬과-같은-이유"><strong>Orthogonomal 행렬의 역행렬이 전치행렬과 같은 이유</strong></h3>
<p><em>Orthogonomal matrix $Q$에 대하여,</em> </p>
<p>$Q^TQ$를 계산하면 Orthogonomal 행렬의 정의에 의해 항등행렬이 결과로 나타나게 된다. </p>
<p>$$
\bold{q_i}^T\bold{q_j} = \begin{cases} 1 &amp; (i=j) \ 0 &amp; (i \neq j)\end{cases}
$$</p>
<p>$$
Q^TQ = \begin{bmatrix} \bold{q_1}^T \ \vdots \ \bold{q_n}^T\end{bmatrix} \begin{bmatrix} \bold{q_1} &amp; \cdots &amp; \bold{q_n}\end{bmatrix}\\ \ =  \begin{bmatrix} \bold {q_1}^TA\bold q_1  &amp; \bold {q_1}^T\bold q_2  &amp; \cdots &amp; \bold {q_1}^T\bold q_n \ \bold {q_2}^T\bold q_1  &amp; \bold {q_2}^T\bold q_2  &amp; \cdots &amp; \bold {q_2}^TA\bold q_n \ \vdots &amp; \vdots &amp; \ddots &amp; \vdots \ \bold {q_n}^T\bold q_1  &amp; \bold {q_n}^T\bold q_2  &amp; \cdots &amp; \bold {q_n}^T\bold q_n\end{bmatrix}
$$</p>
<p>$$
Q^TQ = I
$$</p>
<p>→ 따라서 $Q^{-1} = Q^T$ 이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[선형대수학] Orthogonality]]></title>
            <link>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Orthogonality</link>
            <guid>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Orthogonality</guid>
            <pubDate>Sun, 28 Aug 2022 02:22:57 GMT</pubDate>
            <description><![CDATA[<h1 id="orthogonality">Orthogonality</h1>
<h3 id="definition-of-orthogonal-vectors">Definition of Orthogonal Vectors</h3>
<blockquote>
<p>Two vectors $\bold{v}$ and $\bold{w}$ are said to be <strong>orthogonal</strong> if their inner product is zero.  ($\bold v^T \bold w = 0$)</p>
</blockquote>
<p>→ 두 벡터의 내적이 0일 때, 두 벡터는 <strong>직교</strong>한다.</p>
<ul>
<li><p>orthogonal의 의미 : $\cosθ$가 0이다.</p>
<p>  두 벡터가 이루는 각 $\theta$ 에 대해 $\cos \theta$를 계산하는 수식은 다음과 같은데, 이때 두 벡터의 내적이 $0$이기 때문에 $\cos \theta  = 0$ 이 된다.</p>
<p>  $\cos \theta = 0$이 되게하는 $\theta$는  $\pi \over 2$ <strong>[직교]</strong></p>
<p>  $$
  \cos \theta = \frac{\bold v \cdot \bold w}{||\bold v|| \ ||\bold w||} = 0
  $$</p>
</li>
<li><p><em>Example of Orthogonal Vectors</em></p>
</li>
</ul>
<p>$$
\begin{bmatrix} 1 \ 2 \end{bmatrix} \text{ and }\begin{bmatrix} -2 \ 1 \end{bmatrix}
$$</p>
<br>

<h3 id="orthogonal-관계인-vector-and-subspace">Orthogonal 관계인 Vector and Subspace</h3>
<blockquote>
<p>어떤 subspace $S$에 들어있는 모든 벡터와 벡터 $\bold v$가 수직일 때, Subspace $S$와 벡터 $\bold v$가 orthogonal하다.</p>
</blockquote>
<p>$$
\bold v⊥S \ \text{if }\ \bold v^T \bold w = 0\ (∀ \bold w∈S)
$$</p>
<br>

<h3 id="definition-of-orthogonal-subspaces">Definition of Orthogonal Subspaces</h3>
<p><em>Orthogonal 관계인 Vector and Subspace의 표현을 확장시켜서 정의할 수 있다.</em></p>
<blockquote>
<p>Two subspaces $S_1$ and $S_2$ are said to be <strong>orthogonal</strong>, if $\bold v$  and $\bold w$ are orthogonal <strong>for all</strong> $\bold v \in S_1$, $\bold w \in S_2$</p>
</blockquote>
<p>→ $S_1$에 포함된 모든 벡터와 $S_2$에 포함된 모든 벡터가 수직(<em>orthogonal</em>)일 때 $S_1$과 $S_2$는 <strong>직교</strong>한다.</p>
<p>$$
S_1 ⊥ S_2\ \text{if} \ \bold v^T \bold w =0\ (\forall \bold v \in S_1, \forall \bold w \in S_2)
$$</p>
<ul>
<li><em>Example of Orthogonal Vectors</em></li>
</ul>
<p>$$
S_1 = \left{ c \begin{bmatrix} 1 \ 2 \end{bmatrix}, \ \forall c \in \mathbb R \right} \text{ and }S_2 = \left{ c \begin{bmatrix} -2 \ 1\end{bmatrix}, \ \forall c \in \mathbb R \right}
$$</p>
<br>

<h3 id="dimension과-orthogonal의-관계">Dimension과 orthogonal의 관계</h3>
<ul>
<li><p>Dimension과 orthogonal의 관계</p>
<blockquote>
<p>Subspace $S_1$ and $S_2$ of $\mathbb R^n$ cannot be orthogonal when $\dim(S_1) + \dim(S_2) &gt; n$</p>
</blockquote>
<p>  → $\mathbb R^n$의 subspace  $S_1$과 $S_2$에서 $\dim(S_1) + \dim(S_2) &gt; n$ 을 만족하면, $S_1$과 $S_2$는 직교관계를 가질 수 없다. </p>
</li>
</ul>
<ul>
<li><p><U>Dimension의 의미</U>
3차원 공간 ($\mathbb R^3$)의 subspace인 평면($\dim = 2$) $S_1$과 $S_2$를 가정하자.
Orthogonal의 정의에 의해, 두 subspace가 orthogonal하기 위해서는 해당 subspace안에 속하는 어떤 벡터에 대해서도 직교해야하는데, 이를 만족하지 못한다.
  → 따라서 두 subspace는 orthogonal하지 않는다.<br>  이때 위에서 정의한 관계식에 각 값을 대입하면 다음과 같이 두 subspace의 dimension의 합이 기존 space의 차원보다 크다.</p>
<p>$$
  \dim(S_1) + \dim(S_2) = 4 &gt; 3
$$</p>
</li>
</ul>
<br>

<h1 id="otrhogonality-of-four-fundamental-supspace">Otrhogonality of Four Fundamental Supspace</h1>
<h3 id="orthogonality-of-cat-and-na"><strong>Orthogonality of $C(A^T)$ and $N(A)$</strong></h3>
<p>$$
C(A^T)\ ⊥\ N(A)
$$</p>
<ul>
<li><p>$A$의 row space와 nullspace는 서로 직교관계이다.</p>
</li>
<li><p><em>증명</em>
 * $A$가 $m\times n$ 행렬일 때, 두 부분공간은 $\mathbb R^n$의 subspace이다.</p>
<ol>
<li><p>$C(A^T)$에 포함되는 벡터 $\bold v$와 $N(A)$에 포함되는 벡터 $\bold w$가 있다</p>
<p> $$
 \bold v \in C(A^T),\ \bold w \in N(A)
 $$</p>
</li>
<li><p>$\bold v=A^T \bold y를$ 만족하는 벡터 $\bold y$를 가정하자.</p>
</li>
<li><p>벡터 $\bold v$의 위치에 위에서 정의한 표현을 대입하면 다음과 같이 나타난다.</p>
<ul>
<li><p>$\bold v \in C(A^T)$이므로, $A^T \bold y$ 로 표현할 수 있다.</p>
</li>
<li><p>$\bold w \in N(A)$이므로, $A\bold w = 0$ 이다.</p>
<p>  $$
  \bold v^T \bold w = (A^T \bold y)^T \bold w = \bold y^TA \bold w =\bold y^T \cdot \bold 0 = 0 
  $$</p>
<p>  → 따라서 $\bold v^T \bold w = 0$ 이므로, 두 subspace에 속하는 모든 임의의 벡터들끼리 서로 직교관계임을 보일 수 있다.</p>
</li>
</ul>
</li>
</ol>
</li>
<li><p>NullSpace의 의미</p>
<ul>
<li><p>$N(A)$는 원래 행렬 $A$의 row에 직교하는 모든 벡터들을 모아둔 subspace이다.</p>
</li>
<li><p>$A\bold x = 0$에서 각각의 row vector $\bold a^T$에 곱해지는 $\bold x$의 결과가 $0$이므로 다음과 같이 해석할 수 있다.</p>
<p>  $$
  \bold a^T \bold x  = 0
  $$</p>
</li>
<li><p>의미자체가 이렇다보니 $A$의 row들의 linear combination한 space인 $C(A^T)$와도 orthogonal하게 된다.</p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="orthogonality-of-ca-and-nat"><strong>Orthogonality of $C(A)$ and $N(A^T)$</strong></h3>
<p>$$
C(A^T)\ ⊥\ N(A)
$$</p>
<ul>
<li>$A$의 column space와 left nullspace는 서로 직교관계이다.</li>
<li>row space와 nullspace간의 orthogonality 증명 과정을 $A^T$기준으로 진행하면 쉽게 증명할 수 있다.</li>
</ul>
<br>

<h1 id="orthogonal-complement--직교여집합">Orthogonal Complement : 직교여집합</h1>
<h3 id="definition-of-orthogonal-complement">Definition of Orthogonal Complement</h3>
<blockquote>
<p>The <strong>orthogonal</strong> <strong>complement</strong> of a subspace $S$, contains every vector that is perpendicular to $S$.</p>
</blockquote>
<p>→ 직교 여집합은 어떤 Subspace $S$와 <strong>직교하는 모든 벡터들의 집합</strong>이다. </p>
<ul>
<li><p>직교 여집합의 표현</p>
<p>  $$
  S^⊥
  $$</p>
</li>
</ul>
<br>

<h3 id="orthogonal-complement-of-four-fundamental-supspace">Orthogonal Complement of Four Fundamental Supspace</h3>
<p><em>Four Fundamental Supspace은 단순 직교관계가 아닌 직교 여집합 관계를 만족한다.</em> </p>
<p><strong>Orthogonal Complement of Nullspace and Row space</strong></p>
<p>$m\times n$  행렬 $A$에 대하여</p>
<blockquote>
<p>$C(A^T)$ and $N(A)$ are <strong>orthogonal</strong> <strong>complements</strong> of each other in $\mathbb R ^n$</p>
</blockquote>
<p>$$
N(A) = C(A^T)^⊥
$$</p>
<ul>
<li><p>$N(A)$의 정의에 의하여 성립한다.</p>
<ul>
<li>$N(A)$는 모든 row 벡터와 직교한 벡터들의 집합이다.</li>
<li>따라서 row 벡터에 대한 직교 여집한관계가 성립한다.</li>
</ul>
</li>
<li><p>두 부분공간은 서로 <strong>직교</strong>하며, 현재 차원에서 자신의 차원을 뺀만큼의 차원을 상대방이 가지기 때문에 직교 여집합 관계를 만족할 수 밖에 없다.</p>
<ul>
<li><p>$n- \dim(C(A^T)) = \dim(N(A))$</p>
</li>
<li><p>$n- \dim(N(A)) = \dim(C(A^T))$</p>
<br>

<p>$$
\dim(C(A^T))+\dim(N(A)) = n
$$</p>
</li>
</ul>
</li>
</ul>
<br>

<p><strong>Orthogonal Complement of Column space and Left Nullspace</strong></p>
<p>$m\times n$  행렬 $A$에 대하여</p>
<blockquote>
<p>$C(A)$ and $N(A^T)$ are <strong>orthogonal</strong> <strong>complements</strong> of each other in $\mathbb R ^m$</p>
</blockquote>
<p>$$
C(A^T) = N(A)^⊥
$$</p>
<ul>
<li><p><em>증명</em> [귀류법]</p>
<ol>
<li><p>$N(A)$에 직교하지만, $C(A^T)$에 포함되지 않는 어떤 벡터 $\bold v$를 가정하자.</p>
<p> $$
 \bold v ⊥ N(A),\ \ \bold v \notin C(A^T)
 $$</p>
</li>
<li><p>이 벡터 $\bold v$를 $A$의 행에 추가하여 행렬 $B$를 얻을 수 있다.</p>
<p> $$
 B = \begin{bmatrix} A \ \bold v^T\end{bmatrix}
 $$</p>
</li>
<li><p>이때 새로 정의된 행렬 $B$의 nullspace는 기존 행렬 $A$의 nullspace와 동일하다.</p>
<p> <em>→ nullspace는 변하지 않는다.</em></p>
<ol>
<li><p>$A\bold x = 0$ 일 때 $\bold x \in N(A)$이다 .</p>
</li>
<li><p>이때 행렬 $B$에 대해서 $B \bold  x = 0$이 성립한다면, $\bold x \in N(A) \sub N(B)$를 만족한다.</p>
<ul>
<li><p>$A\bold x = 0$ (자명)</p>
</li>
<li><p>$\bold v ⊥ N(A)$이므로 $\bold v^T\bold x = 0$</p>
<p>$$
B\bold x = \begin{bmatrix} A\bold x \ \bold v ^T \bold x \end{bmatrix} = \begin{bmatrix} 0 \ 0 \end{bmatrix} = 0
$$</p>
<p>→ 따라서 $N(A) \sub N(B)$ - <strong>(1)</strong></p>
</li>
</ul>
</li>
<li><p>행렬 $B$를 정의할 때, 기존 행렬 $A$에 새로운 행을 추가시켜서(차원증가) 조건이 추가되었기에 $N(B) \sub N(A)$ - <strong>(2)</strong></p>
</li>
<li><p><strong>1번과 2번 조건</strong>을 모두 만족하는 것은 두 subspace가 동일한 경우이다.</p>
<p> $$
 N(A) = N(B)
 $$</p>
</li>
</ol>
</li>
<li><p>$B$행렬은 $A$에 비해서 새로운 행이 하나 더 추기되었기 때문에 랭크의 갯수가 1개 더 많다.</p>
<p> $$
 r(B) = r(A) +1
 $$</p>
</li>
<li><p>랭크와 차원의 관계를 이용하여 다음과 같은 계산과정을 거칠 수 있다.</p>
<ul>
<li><p>$N(A) = N(B)$이기 때문에 다음을 만족</p>
<p>  $$
  \dim(N(B)) + \dim(C(B^T)) = n
  $$</p>
<p>  $$
  \dim(N(A)) + \dim(C(B^T)) = n
  $$</p>
</li>
<li><p>차원을 Rank로 표현</p>
<p>  $$
  n-r(A) + r(B) = n
  $$</p>
<p>  $$
  n - r(A) + r(A) + 1 =  n 
  $$</p>
<p>  $$
  n - \cancel{(r(A))} + \cancel{(r(A))} + 1 = n
  $$</p>
<p>  → $n+1 = n$ <strong>[모순]</strong></p>
</li>
</ul>
</li>
<li><p>따라서 처음 가정이 틀렸음을 보일 수 있다.</p>
</li>
</ol>
</li>
</ul>
<br>

<h1 id="orthogonality-and-independence">Orthogonality and Independence</h1>
<h3 id="n-independent-vectors-in-mathbb-rn">$n$ Independent Vectors in $\mathbb R^n$</h3>
<blockquote>
<p>Any $n$ <strong>independent</strong> vectors in 
$\mathbb R^n$ must <strong>span</strong> $\mathbb R^n$. So they are a <strong>basis</strong>.</p>
</blockquote>
<p>→ $\mathbb R^n$ 안에서 $n$개의 독립적인 벡터(=basis)는 $\mathbb R^n$ 을 <strong>span</strong>한다. </p>
<blockquote>
<p>Any $n$ vectors in 
$\mathbb R^n$ that <strong>span</strong> $\mathbb R^n$ must be <strong>independent</strong>. So they are a <strong>basis</strong>.</p>
</blockquote>
<p>→ ↔ $\mathbb R^n$ 을 <strong>span</strong>하는 $n$개의 벡터(=basis)는 서로 독립이다.</p>
<br>

<h3 id="n-independent-vectors-in-mathbb-rn-matrix">$n$ Independent Vectors in $\mathbb R^n$ (Matrix)</h3>
<ul>
<li><p>If the $n$  columns of $A$  are independent, they span $\mathbb R^n$. So $A\bold x = b$ is always solvable.</p>
<ul>
<li><p>만약 $A$의 $n$개의 열이 독립이라면, $\mathbb R^n$을 span한다.</p>
</li>
<li><p>따라서 $A\bold x=b$의 해는 항상 존재한다.</p>
<p>  → $A$의 열의 linear combination으로 공간 안의 어떤 벡터도 표현가능하다.</p>
</li>
</ul>
</li>
<li><p>If the $n$  columns of $A$  span $\mathbb R^n$, they are independent. So $A\bold x = b$ has a unique solution.</p>
<ul>
<li>만약 $A$의 $n$개의 열이 $\mathbb R^n$을 span하면 서로 독립이다.</li>
<li>따라서 $A\bold x=b$의 해는 항상 존재한다.</li>
</ul>
</li>
</ul>
<br>

<h3 id="orthogonality-and-independence-1">Orthogonality and Independence</h3>
<ul>
<li><p>Orthogonal한 subspaces들의 basis</p>
<blockquote>
<p>벡터 $\bold v_1, \bold v_2, \cdots, \bold v_r$이 subspace $S∈\mathbb R^n$의 basis이고 $\bold v_{r+1}, \bold v_{r+2} , \cdots , \bold v_n$이 subspace $T∈\mathbb R^n$의 basis일 때,</p>
<p>→ $S$와 $T$가 직교관계이면 벡터 $\bold v_1, \bold v_2, ..., \bold v_n$은 $\mathbb R^n$의 basis이다.</p>
</blockquote>
</li>
<li><p><em>Q) 벡터들이 직교관계이면 해당 벡터들은 독립인가?</em></p>
<ul>
<li><p>벡터 중에 영벡터가 들어있다면 직교관계는 만족한다.</p>
</li>
<li><p>하지만 영벡터가 존재하면 독립관계는 성립하지 않는다.</p>
<p>  → 따라서 <strong>항상 직교라고 독립조건을 만족하는 것은 아니다</strong>. </p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="combining-bases-from-cat--and-na">Combining Bases from $C(A^T)$  and $N(A)$</h3>
<blockquote>
<p>Combining bases from $C(A^T)$ and $N(A)$ to form a basis of $\mathbb R^n$</p>
</blockquote>
<ul>
<li><p>위 정리에 의해 $C(A^T)$  와  $N(A)$ subspace를 모은 것이 $\mathbb R^n$의 basis임을 알 수 있다.</p>
<ul>
<li><p>$\dim(C(A^T)) + \dim(N(A)) = n$</p>
<ul>
<li>$\dim(C(A^T)) = r$</li>
<li>$\dim(N(A)) = n-r$</li>
</ul>
</li>
<li><p>$C(A^T)⊥N(A)$</p>
<p>  <em>→ 위 정리의 두가지 조건을 모두 만족하기 때문</em></p>
</li>
</ul>
</li>
<li><p>$\mathbb R^n$에 속하는 어떤 벡터 $\bold x$를 서로 <strong>직교관계인 두 벡터</strong>로 나눌 수 있다.</p>
<p>  $$
  \bold x = \bold x_r + \bold x_n
  $$</p>
<ul>
<li><p>$C(A^T) = { \bold v_1, \bold  v_2, \cdots , \bold v_r}$ → $\bold x_r$</p>
</li>
<li><p>$N(A) = {\bold v_{r+1}, \bold v_{r+2}, \cdots, \bold v_n}$ → $\bold x_n$</p>
</li>
<li><p>⇒ 특히 row space에 속하는 벡터와 nullspace에 속하는 벡터로 표현할 수 있다.*</p>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C++] 상속 : 응용]]></title>
            <link>https://velog.io/@webb-c/C-%EC%83%81%EC%86%8D-%EC%9D%91%EC%9A%A9</link>
            <guid>https://velog.io/@webb-c/C-%EC%83%81%EC%86%8D-%EC%9D%91%EC%9A%A9</guid>
            <pubDate>Tue, 23 Aug 2022 01:36:39 GMT</pubDate>
            <description><![CDATA[<h1 id="1객체-포인터의-참조관계">1.객체 포인터의 참조관계</h1>
<h3 id="01-객체-포인터-변수란">01-객체 포인터 변수란?</h3>
<blockquote>
<p>객체의 주소값을 저장하는 포인터 변수</p>
</blockquote>
<ul>
<li>포인터는 어떤 변수의 <strong>주소값</strong>을 저장하는 변수이다.</li>
<li>따라서 클래스를 기반으로 생성된 객체의 주소값 저장을 위해-<em>객체를 가리키기 위하여</em> 해당 <strong>클래스의 타입</strong>으로 포인터 변수를 선언할 수 있다.</li>
<li><U>객체 포인터 변수의 선언 및 참조</U>  </li>
</ul>
<pre><code class="language-cpp">    Person* ptr;          //Person class의 객체를 가리키기 위한 ptr 포인터변수
    ptr = new Person();   //포인터 변수의 객체 참조</code></pre>
<br>

<h3 id="02-객체-포인터-변수의-특성">02-객체 포인터 변수의 특성</h3>
<blockquote>
<p>C++에서 <strong>객체 포인터 변수는 가리키는 객체 뿐만 아니라, 그 클래스를 직접/간접 상속하는 자식 클래스의 객체도 가리킬 수 있다.</strong></p>
</blockquote>
<pre><code class="language-cpp">//Person을 직접 상속하는 Student
class Student : public Person {
    ...
};

//Person을 간접 상속하는 High_Student
class High_Student : public Student {
        ...
};

int main(){
    Person* ptr;          //Person class의 객체를 가리키는 ptr 포인터변수
    ptr = new Student(); 
        ptr = new High_Student();  
}</code></pre>
<p><U>Q.이런 특성을 갖게 되는 이유는 무엇일까?</U></p>
<p>그 해답은 <strong>상속의 의미</strong>로부터 찾을 수 있다. </p>
<p>상속의 관계는 IS-A(~는 ~이다.)의 관계로 표현되는데, 따라서 Person을 상속받는 Student에서 상속의 관계는 “Student는 Person이다.”로 표현되는데, 이는 클래스와 해당 클래스로 만들어진 객체간의 관계와 유사하다. </p>
<ul>
<li>클래스-객체 관계 : Vaughan(객체)은 Person(클래스)이다.</li>
<li>부모클래스-자식클래스 관계 : Student(자식)은 Person(클래스)이다.<br><em>→ 두 관계의 의미가 유사하다.</em></li>
</ul>
<p>이러한 상속의 관계때문에 <strong>Person의 포인터 변수는 Student객체를 Person 객체의 일종으로 간주</strong>하게 된다.</p>
<br>

<h1 id="2-가상함수--virtual-function">2. 가상함수 : Virtual Function</h1>
<h3 id="01-c-컴파일러의-포인터-객체-참조-연산의-특성">01-C++ 컴파일러의 포인터 객체 참조 연산의 특성</h3>
<ul>
<li>객체포인터의 특성을 이용하면 우리는 쉽게 하나의 포인터를 이용해 부모/자식 객체에 편하게 접근할 수 있지만, 한가지 단점이 존재한다.</li>
<li>C++ 컴파일러는 <U>포인터 연산의 가능 유무를 판단할 때 <strong>포인터의 자료형을 기준으로 판단</strong>하며, 실제 포인터 변수가 가리키는 객체의 자료형은 고려하지 않는다.</U></li>
</ul>
<blockquote>
<p>따라서 <strong>실제로 객체 포인터가 가리키는 객체의 자료형이 Student 클래스</strong>라도, <strong>객체 포인터의 자료형이 Person 클래스</strong>라면 자식 클래스인 Student만 가지는 멤버에는 접근할 수 없다 !</p>
</blockquote>
<br>

<h3 id="02-객체-포인터-변수를-이용해-참조할-때-발생할-수-있는-오류-예시">02-객체 포인터 변수를 이용해 참조할 때 발생할 수 있는 오류 (예시)</h3>
<ul>
<li>Person 클래스 타입으로 정의한 객체 포인터 변수를 사용하여 자식 클래스인 Student의 객체를 사용한다.</li>
<li>이때, 가리키는 객체는 Studnet 타입이라도 포인터 변수가 정의된 자료형은 Person 클래스이기 때문에, 포인터 변수를 이용하여 객체를 참조할 때 마치 Person 클래스의 객체를 참조하는 것처럼 동작한다.<ul>
<li>Student만이 가지는 멤버 변수/함수에 접근할 수 없다.</li>
<li>Student에서 재정의했던 Person의 함수를 호출하지 않고, Person에서 정의했던 기존 함수를 사용</li>
</ul>
</li>
</ul>
<pre><code class="language-cpp">#include&lt;iostream&gt;
using namespace std;

class Person {
        private:
                char name[10];
        public:
                Person(char* name) {
                        strcpy(this-&gt;name, name);
                }
                void ShowInfo() const {
                        cout&lt;&lt;&quot;name: &quot;&lt;&lt;name&lt;&lt;endl;
                }
};

//Person을 상속하는 Student
class Student : public Person {
        private:
                int number;   //Student만이 갖는 멤버 함수
        public:
                Student(char* name, int num) : Person(name), number(num) {}
                // Studnet만이 갖는 멤버 함수
                void GetNumber() const {
                        cout&lt;&lt;&quot;number: &quot;&lt;&lt;number&lt;&lt;endl;
                }
                // 함수 오버라이딩
                void ShowInfo() const {    
                        Person::ShowInfo();  // 기존 함수
                        GetNumber();
                }
};

int main(){
    Person* ptr;          //Person class의 객체를 가리키는 ptr 포인터변수
    ptr = new Student(&quot;vaughan&quot;, 2022); 
      //ptr-&gt;GetNumber();   //컴파일 오류
    ptr-&gt;ShowInfo();      //오버라이딩 이전의, Person 클래스에 정의된 기존 함수를 사용함 
    return 0;
}</code></pre>
<br>

<h3 id="03-가상-함수의-의미-및-사용">03-가상 함수의 의미 및 사용</h3>
<blockquote>
<p><code>virtual</code> 키워드를 이용하여 가상함수로 선언된 함수는 포인터 변수를 이용하여 함수를 호출할 때 포인터 변수의 자료형을 기반으로 결정하지 않고 <strong>실제로 가리키는 객체를 참조하여 호출대상을 결정</strong>한다.</p>
</blockquote>
<ul>
<li>가상함수 또한 함수의 <strong>body</strong>를 가질 수 있다.</li>
<li>가상함수를 오버라이딩 하는 함수(=자식클래스에서 재정의한 함수)또한 (별도로 virtual 선언을 추가하지 않더라도,) <strong>가상함수</strong>로 정의된다.</li>
<li><em>가상함수의 사용 예시</em>  </li>
</ul>
<pre><code class="language-cpp">    #include &lt;iostream&gt;
    using namespace std;

    class First {
        public:
            virtual void MyFunc() { cout&lt;&lt;&quot;FirstFunc&quot;&lt;&lt;endl; }
    };

    class Second : public First {
        public:
            virtual void MyFunc() { cout&lt;&lt;&quot;SecondFunc&quot;&lt;&lt;endl; }
    };

    class Third : public Second {
        public:
            virtual void MyFunc() { cout&lt;&lt;&quot;ThirdFunc&quot;&lt;&lt;endl; }
    };

    int main() {
        Third* tptr = new Third;   //선언 자료형 : Third, 실제 가리키는 객체 자료형 : Third
        Second* sptr = tptr;       //선언 자료형 : Second, 실제 가리키는 객체 자료형 : Third
        First* fptr = sptr;        //선언 자료형 : First, 실제 가리키는 객체 자료형 : Third

        tptr-&gt;MyFunc();
        sptr-&gt;MyFunc();
        fptr-&gt;MyFunc();

        delete tptr;
        return 0;
    }</code></pre>
<p><img src="https://velog.velcdn.com/images/webb-c/post/aaee0b51-4992-4ca7-9567-441a32986bda/image.png" alt=""></p>
<br>

<h3 id="04-순수-가상함수pure-virtual-function와-추상클래스abstract-class">04-순수 가상함수(pure virtual function)와 추상클래스(abstract class)</h3>
<ul>
<li><p><U><strong>추상클래스</strong></U></p>
<blockquote>
<p>실제로 객체생성은 하지 않고, 상속만을 위해 정의된 클래스</p>
</blockquote>
<ul>
<li>객체 생성을 목적으로 정의되지 않는 클래스</li>
<li>이렇게 아무런 기능을 하지 않는 추상클래스를 실수로 생성했을 때, 문법적으로는 아무런 오류가 발생하지 않기 때문에 생성도지 않도록 막아두는 것이 좋다.  </li>
<li>→ 이를 위해 순수 가상함수가 사용된다.*</li>
</ul>
</li>
<li><p><U><strong>순수 가상함수</strong></U></p>
<blockquote>
<p>함수의 몸체가 정의되지 않은 함수</p>
</blockquote>
<ul>
<li><p>순수 가상함수는 <code>=0</code> 으로 표현한다.</p>
<pre><code class="language-cpp">  // 추상 클래스
  class Employee {
          private:
                  char name[100];
          public:
                  Employ(char* name) {
                          strcpy(this-&gt;name, name);
                  }
                  void ShowYourname() const {
                          cout&lt;&lt;&quot;name: &quot;&lt;&lt;name&lt;&lt;endl;
                  }
                  //순수가상함수
                  virtual int GetPay() const = 0;
                  virtual void ShowSalaryInfor() const = 0;
  }</code></pre>
</li>
<li><p>이는 실제로 0을 대입하는 것이 아니라 컴파일러에게 명시적으로 해당함수가 순수 가상함수임을 보여주는 것이다.</p>
</li>
<li><p><U>이렇게 정의된 1개 이상의 순수 가상함수를 지닌 클래스는 완전하지 않은 클래스가 되어(추상클래스) 객체를 생성하려 하면 컴파일에러가 발생한다.</U></p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="05-다형성polymorphism">05-다형성(Polymorphism)</h3>
<ul>
<li>C++에서 가상함수의 호출단계에서 보이는 특성을 가리켜, ‘다형성&#39;이라고 한다.</li>
<li><U>모습은 같은데(=명령문은 동일한데) 형태는(=결과는) 다르다.</U>  </li>
<li>→ 동일한 포인터 변수라도, 참조하는 객체의 자료형에따라 그 결과가 달라진다.*</li>
</ul>
<br>

<h3 id="06-멤버함수와-가상함수의-동작원리">06-멤버함수와 가상함수의 동작원리</h3>
<ul>
<li><p><U>멤버변수와 멤버변수</U></p>
<ul>
<li>어떤 클래스의 객체가 생성되면 멤버변수는 실제로 그 객체 안에 존재한다.</li>
<li>그러나 멤버함수는 <strong>메모리의 한 공간에 별도로 위치</strong>하고, 해당 클래스로 생성된 모든 객체가 그 멤버함수를 서로 공유하는 형태를 취한다.  </li>
</ul>
</li>
<li><p><U>가상함수의 동작원리</U></p>
<ul>
<li><p>1개이상의 가상함수를 포함하는 클래스에 대해서는 컴파일러가 <strong>가상함수 테이블</strong>을 만든다.</p>
</li>
<li><p>가상함수 테이블은 실제 호출되야할 <strong>함수의 위치정보(=주소)</strong>를 담고 있는 테이블이다.</p>
</li>
<li><p>이때 오버라이딩 된 가상함수의 주소정보는 자식클래스의 테이블에 포함되지 않는다.</p>
<p>  → 따라서 오버라이딩 된 가상함수를 호출하면 자동적으로 가장 마지막에 오버라이딩 한 자식 클래스의 멤버함수가 호출되는 것이다. </p>
</li>
<li><p><em>가상함수 테이블의 예시</em><br>AAA를 상속받은 자식클래스 BBB의 V-table</p>
<table>
<thead>
<tr>
<th>key</th>
<th>value</th>
</tr>
</thead>
<tbody><tr>
<td>void BBB::Func1()</td>
<td>0x1024</td>
</tr>
<tr>
<td>void AAA::Func2()</td>
<td>0x2048</td>
</tr>
<tr>
<td>void BBB::Func3()</td>
<td>0x4096</td>
</tr>
</tbody></table>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="07-가상함수-테이블이-참조되는-방식">07-가상함수 테이블이 참조되는 방식</h3>
<ul>
<li>가상함수 테이블은 멤버함수 호출에 쓰이는 일종의 데이터이기 때문에, 객체가 생성되지 않더라도 일단 메모리 공간에 할당된다.</li>
<li>각 클래스의 객체에는 해당 클래스의 <U>가상함수 테이블의 <strong>주소값</strong></U>이 저장된다.</li>
<li><U>참조 과정</U><ol>
<li>객체를 통해 어떤 가상함수가 호출되었다.</li>
<li>가상함수가 어디에 위치한지 파악하기 위해 가상함수 테이블이 저장된 주소를 이용해 참조된다.</li>
<li>참조된 가상함수 테이블에서 저장된 가상함수의 주소로 향해 가상함수를 수행한다.</li>
</ol>
</li>
</ul>
<br>

<h1 id="-객체-포인터-변수와-가상함수의-활용-예제">+ 객체 포인터 변수와 가상함수의 활용 (예제)</h1>
<h3 id="프로그램-설명-및-상속관계">프로그램 설명 및 상속관계</h3>
<p>어떤 회사의 전체 직원에게 제공하는 급여를 계산하고 관리하고자한다.</p>
<ul>
<li><U>직원 종류</U><ul>
<li>정규직 : 정해진 월급을 받는다.</li>
<li>임시직(알바) : 일한시간 * 시간당급여 로 계산된 급여를 받는다.</li>
<li>영업직 : 정해진 월급 + 판매실적*상여금비율 로 계산된 급여를 받는다.</li>
</ul>
</li>
<li><U>클래스의 상속관계</U><br>→ 이때 Employee는 실제로 객체생성되지 않고 상속을 위해 정의된 <strong>추상클래스</strong>이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/webb-c/post/f1c12ac8-171a-4f60-a4a9-20a225ec7a11/image.png" alt=""></p>
<h3 id="예제-코드">예제 코드</h3>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cstring&gt;
using namespace std;

class Employee {
    private:
        char name[100];
    public:
        Employee(char* name){
            strcpy(this-&gt;name, name);
        }
        void ShowYourName() const {
            cout&lt;&lt;&quot;name: &quot;&lt;&lt;name&lt;&lt;endl;
        }

        /*Employee형 포인터 변수를 이용해 Employee를 상속받는 자식클래스의 메소드 호출을 위한 가상함수 선언*/
        virtual int GetPay() const = 0;
        virtual void ShowSalaryInfo() const = 0;
};

class PermanentWorker : public Employee {
    private:
        int salary;   // 월 급여
    public:
        PermanentWorker(char* name, int money) : Employee(name), salary(money) {}
        int GetPay() const {
            return salary;
        }
        void ShowSalaryInfo() const {
            ShowYourName();
            cout&lt;&lt;&quot;salary: &quot;&lt;&lt;GetPay()&lt;&lt;endl&lt;&lt;endl;
        }
};

class TemporaryWorker : public Employee {
    private:
        int workTime;     // 일한 시간
        int payPerHour;   // 시간당 급여
    public:
        TemporaryWorker(char* name, int pay) : Employee(name), workTime(0), payPerHour(pay) {}
        void AddWorkTime(int time) {
            workTime+=time;
        }
        int GetPay() const {
            return workTime*payPerHour;
        }
        void ShowSalaryInfo() const {
            ShowYourName();
            cout&lt;&lt;&quot;salary: &quot;&lt;&lt;GetPay()&lt;&lt;endl&lt;&lt;endl;
        }
};

class SalesWorker : public PermanentWorker {
    private:
        int salesResult;     // 판매 실적
        double bonusRatio;   // 상여금 비율
    public:
        SalesWorker(char* name, int money, double ratio) : PermanentWorker(name, money), salesResult(0), bonusRatio(ratio) {}
        void AddSalesResult(int value) {
            salesResult+=value;
        }
        // 함수 오버라이딩
        int GetPay() const {
            /*PermanentWorker::GetPay() : 현재 자식 클래스에서 재정의된 함수가 아닌 부모 클래스의 원본 함수를 호출*/
            return PermanentWorker::GetPay() + (int)(salesResult*bonusRatio);  // 기본 원급 + 상여금
        }
        // 함수 오버라이딩
        void ShowSalaryInfo() const {
            ShowYourName();
            cout&lt;&lt;&quot;salary: &quot;&lt;&lt;GetPay()&lt;&lt;endl&lt;&lt;endl;
        }
};

class EmployeeHandler {
    private:
        Employee* empList[50];
        int empNum;
    public:
        EmployeeHandler() : empNum(0) {}
        void AddEmployee(Employee* emp){
            empList[empNum++]=emp;
        }
        void ShowAllSalaryInfo() const {
            for(int i=0 ; i&lt;empNum ; i++)
                empList[i]-&gt;ShowSalaryInfo();
        }
        void ShowTotalSalary() const {
            int sum=0;
            for(int i=0 ; i&lt;empNum ; i++)
                sum+=empList[i]-&gt;GetPay();
            cout&lt;&lt;&quot;salary sum: &quot;&lt;&lt;sum&lt;&lt;endl;
        }
        ~EmployeeHandler(){
            for(int i=0 ; i&lt;empNum ; i++)
                delete empList[i];
        }
};

int main(){
    //직원관리를 목적으로 설계된 control class 객체 생성
    EmployeeHandler handler;

    //정규직 등록
    handler.AddEmployee(new PermanentWorker(&quot;KIM&quot;, 1000));
    handler.AddEmployee(new PermanentWorker(&quot;LEE&quot;, 1500));

    //임시직 등록 (알바)
    TemporaryWorker* alba = new TemporaryWorker(&quot;Jung&quot;, 700);
    alba-&gt;AddWorkTime(5);
    handler.AddEmployee(alba);

    //영업직 등록
    SalesWorker* seller = new SalesWorker(&quot;Hong&quot;, 1000, 0.1);
    seller-&gt;AddSalesResult(7000);
    handler.AddEmployee(seller);

    //이번 달 지불할 급여 정보
    handler.ShowAllSalaryInfo();

    //이번 달 지불할 급여 총합
    handler.ShowTotalSalary();

    return 0;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/webb-c/post/ccb11b30-dd40-4db7-a8a0-1469d20e2b43/image.png" alt=""></p>
<h3 id="함수-오버라이딩과-함수-오버로딩">함수 오버라이딩과 함수 오버로딩</h3>
<ul>
<li><p><U>함수 오버라이딩</U> : 부모 클래스와 동일한 이름의 함수를 자식 클래스에서 재정의 하는 것  </p>
</li>
<li><p><U>함수 오버로딩</U> : 부모 클래스와 동일한 이름의 함수를 자식 클래스에 재정의할 때, <strong>매개변수의 자료형 및 개수가 다른 경우</strong>로, 이때는 함수 호출시 전달된 인자에 따라 호출되는 함수가 결정된다.</p>
<p>  → 이는 상속의 관계에서도 구성할 수 있다.</p>
</li>
</ul>
<br>

<h1 id="3가상-소멸자와-참조자의-참조-가능성">3.가상 소멸자와 참조자의 참조 가능성</h1>
<h3 id="01-가상-소멸자virtual-destructor">01-가상 소멸자(Virtual Destructor)</h3>
<p><em>가상함수 말고도 virtual 키워드를 붙여줘야하는 대상, 소멸자</em></p>
<ul>
<li><p><U>가상 소멸자의 필요성</U></p>
<ul>
<li><p>부모클래스의 타입으로 선언된 포인터가 자식클래스의 객체를 가리킬 때, 객체 포인터를 이용하여 객체의 소멸을 명시하면 부모클래스의 소멸자만 호출되게된다.</p>
</li>
<li><p>이런 경우에는 메모리의 누수(leak)가 발생한다.</p>
</li>
<li><p>따라서 객체 소멸과정에서는 <strong>객체 포인터의 자료형과 관계없이, 실제로 포인터가 가리키는 객체의 자료형에 맞게 모든 소멸자가 호출</strong>되게 해주어야한다.</p>
<p>  → <code>virtual</code> 키워드의 필요성</p>
</li>
</ul>
</li>
<li><p><U>가상 소멸자의 특징</U></p>
<ul>
<li>부모클래스의 소멸자가 virtual로 선언되면, 이를 상속하는 자식클래스의 소멸자들은 (별도로 virtual 선언을 추가하지 않더라도,) 모두 자동으로 가상 소멸자로 선언된다.</li>
<li>객체가 소멸되면서 가상 소멸자가 호출되면, 객체 포인터의 자료형과 관계없이 상속의 계층구조상 가장 아래에 있는 자식클래스의 소멸자가 대힌 호출된다.  </li>
<li>→ 차례대로 부모클래스의 소멸자까지 순차적으로 호출됨*</li>
</ul>
</li>
<li><p><U>가상 소멸자의 사용</U></p>
<pre><code class="language-cpp">  class First {
          . . .
          public:
                  virtual ~First() { . . . . }      // 가상 소멸자
  }

  //자식클래스
  class Second : public First {
          . . . 
          public:
                  virtual ~Second() { . . . . }
                  // ~Second() {} 로 정의해도(키워드없이) 자동으로 가상 소멸자로 정의된다. 
  }</code></pre>
</li>
</ul>
<h3 id="02-참조자의-참조-가능성">02-참조자의 참조 가능성</h3>
<blockquote>
<p>C++에서 어떤 클래스의 참조자는 그 클래스를 직접/간접적으로 상속하는 모든 객체를 참조할 수 있다.</p>
</blockquote>
<ul>
<li><p>객체 포인터를 다룰때 설명한 특성은 <strong>참조자</strong>에도 적용된다.</p>
</li>
<li><p>또한, 객체 포인터 특성과 가상함수 등의 개념도 참조자에 그대로 적용된다.</p>
</li>
<li><p><em>참조자의 사용 예시</em></p>
<ul>
<li><p>First 클래스 또는 이를 직/간접적으로 상속하는 클래스의 객체가 인자의 대상이 되는 함수</p>
</li>
<li><p>인자로 전달되는 객체의 실제 자료형과는 관계없이, 참조자가 First 클래스 타입이므로 함수 내에서는 First 클래스 내에서 정의된 멤버에 대해서만 접근할 수 있다.</p>
<pre><code class="language-cpp">void GoodFunction(const First &amp;ref) {}</code></pre>
</li>
</ul>
</li>
</ul>
<br>

<h1 id="4다중상속--multiple-inheritance">4.다중상속 : Multiple Inheritance</h1>
<h3 id="01-다중상속의-의미와-문제점">01-다중상속의 의미와 문제점</h3>
<blockquote>
<p>다중상속은 둘 이상의 클래스를 동시에 상속하는 것을 말한다.</p>
</blockquote>
<ul>
<li>일반적으로 다중상속은 많은 문제를 동반하기 때문에, 가급적 사용하지 않는 것이 좋다.</li>
<li>실제로 다중상속만으로 해결가능한 문제는 존재하지 않으니…</li>
</ul>
<br>

<h3 id="02-다중상속의-기본방법">02-다중상속의 기본방법</h3>
<p><em>기본적으로 상속방법은 기존과 동일하다.</em></p>
<ul>
<li>다중상속시에는 상속의 대상이 되는 부모클래스를 <code>,</code>를 이용하여 명시할 수 있다.</li>
<li>또한 상속의 대상이되는 각 부모클래스를 어떤 접근제한 형태로 상속할 지 또한 별도로 지정이 가능하다.</li>
</ul>
<pre><code class="language-cpp">#includ &lt;iostream&gt;
using namespace std;

class BaseOne {
        public:
                void SimpleFuncOne() { cout&lt;&lt;&quot;BaseOne&quot;&lt;&lt;endl; }
};

class BaseTwo {
        public:
                void SimpleFuncTwo() { cout&lt;&lt;&quot;BaseTwo&quot;&lt;&lt;endl; }
};

// 다중상속 받은 클래스
class MultiDerived : public BaseOne, protected BaseTwo {
        public:
                void ComplexFunc() {
                        SimpleFuncOne();
                        SimpleFuncTwo();
                }
};</code></pre>
<br>

<h3 id="03-다중상속의-모호성-ambiguous">03-다중상속의 모호성 (Ambiguous)</h3>
<ul>
<li><p>다중상속의 대상이 되는 두 부모 클래스에 <strong>동일한 이름의 멤버</strong>가 존재하는 경우 문제가 발생할 수 있다.</p>
<p>  → 어떤 부모 클래스의 멤버에 접근하라는 것인지 알 수 없기 때문에 <U>멤버의 이름만으로 접근이 불가능하다.</U></p>
</li>
<li><p>다중상속의 모호성을 해결하기 위해서는 <code>부모클래스이름::멤버</code> 의 형태로 접근해야한다.</p>
</li>
</ul>
<pre><code class="language-cpp">#includ &lt;iostream&gt;
using namespace std;

class BaseOne {
        public:
                void SimpleFunc() { cout&lt;&lt;&quot;BaseOne&quot;&lt;&lt;endl; }
};

class BaseTwo {
        public:
                void SimpleFunc() { cout&lt;&lt;&quot;BaseTwo&quot;&lt;&lt;endl; }  // 동일한 이름의 멤버함수
};

// 다중상속 받은 클래스
class MultiDerived : public BaseOne, protected BaseTwo {
        public:
                void ComplexFunc() {
                        //모호성 해결
                        BaseOne::SimpleFunc();
                        BaseTwo::SimpleFunc();
                }
};</code></pre>
<br>

<h3 id="04-가상-상속">04-가상 상속</h3>
<ul>
<li><p><U>간접상속으로 인한 다중상속의 모호성</U></p>
<ul>
<li><p>Base 클래스를 상속하는 2개의 자식클래스를 가정해보자.</p>
<ul>
<li>MiddleOne</li>
<li>MiddleTwo</li>
</ul>
</li>
<li><p>만약 Derived 클래스가 MiddleOne, MiddleTwo 클래스를 모두 상속받게 된다면 Derived 클래스는 Base 클래스에 <strong>2번 간접 상속</strong>하게된다.</p>
</li>
<li><p>이렇듯 하나의 객체 안에 2개의 Base클래스 멤버가 존재하기 때문에, 어떤 Base클래스의 멤버를 호출할지에 대한 구분이 필요하다. [다중상속의 모호성]</p>
<ul>
<li><p><code>MiddleOne::Func()</code> : MiddleOne클래스가 상속한 Base클래스의 Func() 함수 호출</p>
</li>
<li><p><code>MiddleTwo::Func()</code> : MiddleTwo클래스가 상속한 Base클래스의 Func() 함수 호출</p>
<p>→ 그러나 이경우, Base클래스의 멤버가 1개씩만 존재하는 것이 타당하기 때문에 해결책이 필요하다.</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p><U>만약 <strong>가상</strong>으로 Base 클래스를 상속하는 두 클래스를 다중상속하게 되면, Base클래스의 멤버가 1개씩만 존재하게 할 수 있다.</U>. </p>
</li>
</ul>
<pre><code>→ 가상 상속을 하면 Base클래스의 생성자가 1번만 호출된다.</code></pre><br>

<p><em>본문은 ⟪열혈 C++ 프로그래밍, 윤성우⟫ 도서에 기반하여 정리한 내용입니다.</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[선형대수학] Four Fundamental Subspace (feat.dimension)]]></title>
            <link>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Four-Fundamental-Subspace-feat.dimension</link>
            <guid>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Four-Fundamental-Subspace-feat.dimension</guid>
            <pubDate>Tue, 16 Aug 2022 08:34:48 GMT</pubDate>
            <description><![CDATA[<h1 id="four-fundamental-subspace">Four Fundamental Subspace</h1>
<p>$m\times n$ matrix $A$에 대하여,</p>
<h3 id="column-space-of-a">Column space of A</h3>
<blockquote>
<p>모든 $n$차원 벡터 $\bold x$에 대해 $A\bold x$ 들의 집합 공간. (=행렬 $A$의 column의 linear combination)</p>
</blockquote>
<ul>
<li><p>$\bold x$ 의 차원 : $m\times n$ matrix $A$의 오른쪽에 곱해지므로 $n$차원 벡터  </p>
</li>
<li><p>$A \bold x$는 $m\times \not n \cdot \not n \times 1 = m \times 1$ 이므로 $m$차원의 subspace</p>
</li>
</ul>
<p>$$
C(A) = {A \bold x|\ ∀ \bold x ∈ \mathbb R^ n}\text{ , a subspace of } \mathbb R^m
$$</p>
<br>

<h3 id="row-space-of-a">Row space of A</h3>
<p><em>=Column space of $A^T$</em></p>
<blockquote>
<p>모든 $m$차원 벡터 $\bold x$에 대해 $A^T\bold x$ 들의 집합 공간. (=행렬 $A^T$의 column, 즉 $A$의 row의 linear combination)</p>
</blockquote>
<ul>
<li><p>$\bold x$ 의 차원 : $n\times m$ matrix $A^T$의 오른쪽에 곱해지므로 $m$차원 벡터  </p>
</li>
<li><p>$A^T \bold x$는 $n\times \not m \cdot \not m \times 1 = n \times 1$ 이므로 $n$차원의 subspace</p>
</li>
</ul>
<p>$$
C(A^T) = {A^T \bold x|\ ∀ \bold x ∈ \mathbb R^m}\text{ , a subspace of } \mathbb R^n
$$</p>
<br>

<h3 id="nullspace-of-a">Nullspace of A</h3>
<blockquote>
<p>$A$에 곱한 결과가 0이 되도록하는 $n$차원 벡터 $\bold x$들의 집합 공간.</p>
</blockquote>
<ul>
<li>벡터 $\bold x$는 $m\times n$ matrix $A$의 오른쪽에 곱해지므로 $n$차원의 subspace</li>
</ul>
<p>$$
N(A) = {\bold x|\ A \bold x = \bold 0}\text{ , a subspace of } \mathbb R^n
$$</p>
<br>

<h3 id="left-nullspace-of-a">Left nullspace of A</h3>
<p><em>=Null space of $A^T$</em></p>
<blockquote>
<p>$A^T$에 곱한 결과가 0이 되도록하는 $m$차원 벡터 $\bold x$들의 집합 공간.</p>
</blockquote>
<ul>
<li><p><em>Left?</em></p>
<ul>
<li><p>행렬 $A$의 <strong>왼쪽</strong>에 곱한 결과가 $0$이 되는 벡터 $\bold y$를 가정한다.</p>
<p>  $$
  \bold y A =\bold 0
  $$</p>
</li>
<li><p>기존의 방정식 형태에 양변을 전치하여, $\bold y^T = \bold x$로 생각하여 left nullspace를 표현할 수 있다.</p>
<p>  $$
  (\bold y A)^T = \bold 0 \rightarrow A^T\bold y ^T = \bold 0
  $$</p>
</li>
</ul>
</li>
<li><p>벡터 $\bold x$는 $n\times m$ matrix $A^T$의 오른쪽에 곱해지므로 $m$차원의 subspace<br>(↔  벡터 $\bold y$는 $m\times n$ matrix $A$의 왼쪽에 곱해지므로 $m$차원의 subspace)</p>
</li>
</ul>
<p>$$
N(A^T) = {\bold x|\ A^T \bold x = \bold 0}\text{ , a subspace of } \mathbb R^m
$$</p>
<br>

<h1 id="demension-of-four-fundamential-subspace">Demension of Four Fundamential Subspace</h1>
<h3 id="dimension-of-ca">Dimension of C(A)</h3>
<p>$C(A)$의 basis는 $A$의 pivot column의 갯수와 같다.</p>
<p>→ pivot column의 수는 pivot의 수와 동일하고, pivot의 개수를 나타내는 것은 <strong>rank</strong>이다.</p>
<p>→ 따라서 차원은 $r(A)$이다. </p>
<p>$$
\dim(C(A)) = r(A)
$$</p>
<br>

<h3 id="dimension-of-cat">Dimension of C(A^T)</h3>
<p>$C(A^T)$의 basis는 $A^T$의 pivot column의 갯수와 같다.</p>
<p>→ pivot column의 수는 pivot의 수와 동일하고, pivot의 개수를 나타내는 것은 <strong>rank</strong>이다.</p>
<p>→ $r(A^T) = r(A)$이므로 차원은 $r(A)$이다. </p>
<p>$$
\dim(C(A^T)) = r(A)
$$</p>
<br>

<h3 id="dimension-of-na">Dimension of N(A)</h3>
<p>$A\bold x = \bold 0$의 special solution은 </p>
<ul>
<li>서로 선형독립관계이다.</li>
<li>$N(A)$를 span한다.</li>
</ul>
<p>→ special solution이 $N(A)$의 basis이며, basis안의 벡터의 개수(=차원)는 special solution의 개수와 동일하다. </p>
<p>→ special solution의 개수는 free column의 수와 동일하므로 전체 column에서 pivot column의 수를 빼준다.</p>
<p>→ 따라서 차원은 $n- r(A)$이다.</p>
<p>$$
\dim(N(A)) = n-r(A)
$$</p>
<br>

<h3 id="dimension-of-nat"><strong>Dimension of N(A^T)</strong></h3>
<p>앞서 영공간의 차원을 구하는 과정을 똑같이 적용한다. (이때 $r(A) == r(A^T)$이므로 아래와 같이 표현가능)</p>
<p>$$
\dim(N(A^T)) = m - r(A^T)\\ \ =m-r(A)
$$</p>
<br>

<h3 id="for-fundamential-subspace의-dimension-연산">For Fundamential Subspace의 dimension 연산</h3>
<p><em>4개의 subspace와 그 dimension에 대하여 아래 공식이 항상 성립한다.</em>  ($A$는 $m\times n$ 행렬)</p>
<ul>
<li><p>$\mathbb R^n$에서</p>
<p>  $$
  \dim(C(A^T)) + \dim(N(A)) = n
  $$</p>
</li>
</ul>
<ul>
<li>$\mathbb R^m$에서</li>
</ul>
<p>$$
\dim(C(A)) + \dim(N(A^T)) = m
$$</p>
<p>→ 각 dimension이 어떤 값을 갖는지 생각해보면 쉽게 증명할 수 있다. </p>
<br>

<h1 id="-elimination-전후-row-space-💫">+ Elimination 전후 row space 💫</h1>
<blockquote>
<p>행렬 $A$에 elimination을 진행한 결과로 나타나는 행렬을 $U$라고 할 때, $A$와 $U$는 <strong>동일한 row space</strong>를 갖는다.</p>
</blockquote>
<ul>
<li><p>elimination 과정은 <U>기존 행렬의 row space안에서 일어나는 과정</U>이다.  </p>
</li>
<li><p>→ 기존 행들의 <strong>linear combination</strong>이 바로 Gauss elimination를 의미한다.* </p>
</li>
<li><p>linear combination은 해당 공간안에서만 일어나는 닫힌 연산이기 때문에, 기존의 row space로 표현할 수 없는 새로운 벡터가 Elimination이후에 나타날 수 없다.</p>
</li>
<li><p>단, column space는 변화한다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[선형대수학] Basis and Dimension of Subspace]]></title>
            <link>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Basis-and-Dimension-of-Subspace</link>
            <guid>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Basis-and-Dimension-of-Subspace</guid>
            <pubDate>Mon, 15 Aug 2022 12:54:32 GMT</pubDate>
            <description><![CDATA[<h1 id="span">Span</h1>
<h3 id="definition-of-span">Definition of Span</h3>
<blockquote>
<p><U>벡터들의 모든 linear combination을 모아둔 space가 다른 <strong>space</strong>와 <strong>정확히 같을 때</strong>,</U> 해당 벡터들의 집합이 해당 space를 <strong>span</strong>한다고 한다.</p>
</blockquote>
<ul>
<li><p>주의점 : 정확히 동일한 경우에만 span이라고 한다. 포함관계($⊂,⊃$)면 span하지 않는다.</p>
</li>
<li><p>$\bold v_1$과 $\bold v_2$의 span : $\bold v_1$과 $\bold v_2$의 모든 linear combination을 모아둔 space</p>
<p>  $$
  \left{ c_1 \bold v_1 + c_2 \bold v_2,\ \ \forall c_1,c_2 \in \mathbb R \right}
  $$</p>
</li>
<li><p><em>ex)</em> 행렬의 column들은 <em>column space</em>*를 span한다.<br>→ column space는 column의 모든 linear combination을 모아둔 subspace</p>
<p>  $$
  \text{if}\ \ A=[\bold a_1\ \bold a_2\ \cdots\ \bold a_n]\\ \C(A) = \left{ c_1 \bold a_1 + c_2 \bold a_2+\cdots+c_n \bold a_n,\ \ \forall c_i \in \mathbb R \right}
  $$</p>
</li>
</ul>
<br>

<h3 id="special-solution과-nullspace의-관계--span">special solution과 NullSpace의 관계 : span</h3>
<blockquote>
<p>$A\bold x = \bold 0$의 <strong>special</strong> <strong>solution들</strong>은 Null space $N(A)$를 <strong>span</strong>한다.</p>
</blockquote>
<ul>
<li><p>Null space인 $N(A)$의 정의 자체가 special solution들의 모든 linear combination을 모아둔 공간이기 때문이다.</p>
</li>
<li><p>$A$가 $m\times n$ 행렬일 때 $r(A) = r$개라고 가정하면, $n-r$개의 special solution을 가진다.</p>
<p>  $$
  N(A) = {c_1\bold s_1 + ... + c_{n-r}\bold s_{n-r},\ ∀c_1, ..., c_{n-r} ∈ \mathbb R}
  $$</p>
</li>
</ul>
<br>

<h3 id="span과-independent">span과 independent</h3>
<ul>
<li>어떤 vector들이 어떤 space를 span한다고 해서, 해당 벡터들이 반드시 선형독립인것은 아니다.<ul>
<li><U>span하는 벡터들은 서로 독립이어야한다는 조건은 존재하지 않는다.</U></li>
<li>종속관계인 벡터들도 서로 모여 space를 만들고, span할 수 있다.</li>
</ul>
</li>
<li>어떤 space를 span하는 벡터들이 <strong>특별히</strong> <strong>linear independent 관계</strong>일 때, 이를 <strong>Basis</strong>라고 부른다.</li>
</ul>
<br>

<h1 id="basis">Basis</h1>
<h3 id="definition-of-basis">Definition of Basis</h3>
<blockquote>
<p>어떤 space를 span하는데 필요한 벡터의 <strong>최소모음</strong></p>
<p>→ 이 벡터들은 서로 <em>lineary independent</em> 하다.</p>
</blockquote>
<ul>
<li><p>basis의 표현은 무수히 많을 수 있다. (ex: $[1, 2], [2, 4], [0.5, 1]...$ <em>같은 계수비</em>)</p>
</li>
<li><p>어떤 basis로 그 basis가 span하는 공간안의 어떤 벡터를 표현할 때, <strong>단 1가지 방법</strong>의 선형결합으로 표현할 수 있다. [only one linear combination]</p>
</li>
<li><p><U><strong>basis는 space를 span하기 때문에, 해당 space안의 어떤 벡터라도 basis들의 linear combination으로 표현할 수 있다.</strong></U></p>
</li>
</ul>
<br>

<h3 id="basis-of-ca">Basis of C(A)</h3>
<ul>
<li><p><U>Comlun space와 linear independence</U>  </p>
<ul>
<li>$C(A)$는 $A$의 모든 column들의 linear combination이다.</li>
<li>따라서 $A$의 column은 $C(A)$  공간을 span한다.</li>
<li>하지만 $A$의 column들 사이에는 독립관계가 보장되지 않기 때문에 basis는 아니다.</li>
</ul>
</li>
<li><p><strong>Basis of $C(A)$ 찾는 방법</strong></p>
<ol>
<li><p>행렬 $A$를 elimination하여 <strong>pivot column</strong>을 찾는다.</p>
<ul>
<li>elimination하면 column space는 바뀔 수 있지만, row space는 변하지 않는다.</li>
<li>elimination했을 때, pivot column들은 반드시 독립이 될 수 밖에 없다.</li>
</ul>
</li>
<li><p><U><strong>pivot</strong> <strong>column</strong>과 <strong>동일한 위치(=열)에 존재</strong>하는 기존 $A$의 column들이 $C(A)$의 basis이다.</U></p>
<p> <em>→ pivot column만 basis인 것은 아니지만, <strong>pivot column은 무조건 basis</strong>이다.</em></p>
</li>
</ol>
</li>
</ul>
<br>

<h3 id="finding-a-basis-ca-case의-확장">Finding a Basis (C(A) case의 확장)</h3>
<p>벡터 $\bold v_1, \bold v_2, ... \bold v_n$이 어떤 space $S$를 span할 때,</p>
<ol>
<li><p>각 벡터를 column을 갖는 행렬 $A$를 생각한다. $A = [\bold v_1\ \bold v_2\ \cdots \ \bold v_n]$</p>
</li>
<li><p>행렬 $A$를 elimination하여 pivot column을 찾는다.</p>
</li>
<li><p>pivot column과 동일한 위치에 존재하는 elimination하기 전 기존 행렬 $A$의 column벡터들이 $S$의 <strong>basis</strong>이다.</p>
</li>
</ol>
<p><em>각 벡터를 열로 갖는 행렬을 가정한 뒤에는, $C(A)$의 Basis를 찾는 과정과 동일하다.</em></p>
<br>

<p><strong>예시</strong></p>
<p>*space $S$</p>
<p>$$
S=\left{c_1 \begin{bmatrix} 1 \ 2 \ 3 \end{bmatrix} + c_2\begin{bmatrix} 1 \ 1 \ 1 \end{bmatrix} + c_3 \begin{bmatrix} 4 \ 6 \ 8 \end{bmatrix},\ \ \forall c_1,c_2,c_3 \in \mathbb R\right}
$$</p>
<ol>
<li><p>행렬 $A$ 가정</p>
<p> $$
 A = \begin{bmatrix} 1 &amp; 1 &amp; 4 \ 2 &amp; 1 &amp; 6 \ 3 &amp; 1 &amp; 8 \end{bmatrix}
 $$  </p>
</li>
<li><p>elimination해서 pivot column 구하기</p>
<p> $$
 \begin{bmatrix} 1 &amp; 1 &amp; 4 \ 2 &amp; 1 &amp; 6 \ 3 &amp; 1 &amp; 8 \end{bmatrix} \rightarrow^{G.E}\begin{bmatrix} 1 &amp; 1 &amp; 4 \ 0 &amp; -1 &amp; -2 \ 0 &amp; -2 &amp; 0 \end{bmatrix} \rightarrow^{G.E}\begin{bmatrix} \color{blue}1 &amp; \color{blue}1 &amp; 4 \ \color{blue}0 &amp; \color{blue}-1 &amp; -2 \ \color{blue}0&amp; \color{blue}0 &amp; 0\end{bmatrix} 
 $$</p>
</li>
<li><p>basis 구하기</p>
<p> $$
 \begin{bmatrix} \color{blue}1 &amp; \color{blue}1 &amp; 4 \ \color{blue}2 &amp; \color{blue}1 &amp; 6 \ \color{blue}3 &amp; \color{blue}1 &amp; 8 \end{bmatrix}\ \ \rightarrow\ \ \ \begin{bmatrix} 1 \ 2  \ 3  \end{bmatrix},\ \begin{bmatrix} 1 \ 1  \ 1\end{bmatrix}
 $$</p>
</li>
</ol>
<br>

<h3 id="invertible-matrix와-basis">invertible matrix와 basis</h3>
<blockquote>
<p>$n\times n$ invertible matrix의 column들은 $\mathbb R^n$의 basis이다.</p>
</blockquote>
<p><em>why?</em></p>
<ul>
<li>역행렬을 가지기 위한 조건에 따라 $A$는 $n$개의 pivot을 갖는다. $r(A) = n$</li>
<li>$A$의 column들은 모두 linear independece이다.</li>
<li>따라서 $n$차원 $n$개의 column vector는  $\mathbb R^n$을 <strong>span</strong>하며, 서로 linear independece하기 때문에 <strong>basis</strong>이다.</li>
</ul>
<br>

<h3 id="basis와-basis를-구성하는-벡터간의-관계">basis와 basis를 구성하는 벡터간의 관계</h3>
<blockquote>
<p>어떤 Space에 대하여 basis는 무수히 많이 존재하는데, 이 basis들은 모두 <strong>같은 수의 벡터를 가진다.</strong></p>
</blockquote>
<p><em>증명</em></p>
<ol>
<li><p>어떤 하나의 space에 대하여 $m$개의 벡터를 가지는 basis $V$와 $n$개의 벡터를 가지는 서로 다른 basis $W$가 있을때 $n &gt; m$이라고 가정하자. (서로 다른 수의 벡터를 갖는 basis들이 존재한다고 가정: 귀류법)</p>
</li>
<li><p>basis $W$를 구성하는 벡터들은 space안에 포함된 벡터이기 때문에, 다른 basis인 $V$의 선형결합으로 각 벡터들를 표현할 수 있을 것이다. </p>
<p> $$
 \bold w_i = a_{1i}\bold v_1 + a_{2i}\bold v_2 + \cdots + a_{mi}\bold v_m 
 $$</p>
</li>
<li><p>이를 행렬곱으로 나타내면, 아래와 같다.</p>
<p> $$
  W= [\bold w_1\ \bold w_2\ \cdots\ \bold w_n] = [\bold v_1\ \bold v_2\ \cdots\ \bold v_m] \begin{bmatrix} a_{11}&amp; \cdots &amp;a_{1n} \ \vdots &amp;\ddots &amp;\vdots \ a_{m1}&amp; \cdots &amp;a_{mn} \end{bmatrix} = VA</p>
<p> $$</p>
<p> a. 이때 행렬  $A$에서 가정에 따라 $n&gt;m$이므로 full column rank 조건을 만족하지 않는다.  </p>
<p>   → $A\bold x = \bold 0$에서 $0$이 아닌 solution이 존재한다. </p>
<p> b. 따라서 양변에 0이 아닌 solution $\bold x$를 곱한다. </p>
<pre><code>$$
 W\bold x = VA\bold x 
$$</code></pre></li>
<li><p>이때 $A\bold x = \bold 0$이 되는 $0$이 아닌 solution $\bold x$를 곱했기 때문에, 우변은 $0$이 된다. </p>
<p> $$
 W\bold x = \bold 0
 $$</p>
</li>
<li><p><strong>[모순]</strong> 이때 basis $W$는 독립관계이기 때문에 위 수식을 만족하는 solution $\bold x$는 반드시 0이 되어야한다. 즉, $0$이 아닌 solution $\bold x$에 대하여 $W\bold x = \bold 0$이 될 수 없다. </p>
<p> → 증명 도중 모순이 발생했기 때문에 가정이 틀렸다.</p>
<p> + $m&gt;n$인 경우에 대해서도 진행하면 모순이 발생함 ($V=WA$). 따라서 $n=m$이다.</p>
</li>
</ol>
<br>

<h3 id="standard-basis">Standard basis</h3>
<blockquote>
<p>어떤 공간을 표현하는 <strong>표준 기저</strong>.</p>
</blockquote>
<ul>
<li><p>열 벡터를 구성하는 요소중에 <strong>하나만 1</strong>인 벡터들로 구성된 basis를 칭한다.</p>
</li>
<li><p>ex) 3차원 공간 $\mathbb R^3$의 Standard basis</p>
<p>  $$
  \bold e_x = \begin{bmatrix} 1 \ 0 \ 0\end{bmatrix},\ \bold e_y = \begin{bmatrix} 0 \ 1 \ 0\end{bmatrix},\ \bold e_z = \begin{bmatrix} 0 \ 0 \ 1\end{bmatrix}
  $$</p>
</li>
</ul>
<br>

<h1 id="dimension">Dimension</h1>
<h3 id="definition-of-dimension">Definition of Dimension</h3>
<blockquote>
<p><strong>어떤 space의 차원은 basis의 벡터의 개수를 의미한다.</strong></p>
<p>$=$ pivot column의 개수</p>
<p>$=$ pivot의 개수</p>
<p>$=$ rank의 개수</p>
</blockquote>
<h3 id="dimension-of-subspace">Dimension of Subspace</h3>
<p>$m\times n$ <em>행렬 $A$에 대하여,</em> </p>
<ul>
<li><p><em>column space :</em> $A$의 column space의 dimention은 $A$의 rank의 개수와 같다.</p>
<p>  $$
  \dim(C(A)) = r(A)
  $$</p>
</li>
<li><p><em>Null space :</em> $A$의 nullspace의 dimention은 $A$의 special solution의 개수와 같다.</p>
<p>  $$
  \dim(N(A)) = n - r(A)
  $$</p>
<p>  $N(A)$는 special solution들의 linear combination으로 서로 독립이니까 basis의 조건을 만족함<br>  $=$ $A$의 special solution의 개수<br>  $=$ free column/variable의 개수</p>
</li>
</ul>
<br>

<h3 id="영벡터의-dimension-💫">영벡터의 dimension 💫</h3>
<ul>
<li><p>영벡터는 기하학적으로 어떤 1개의 <strong>dot</strong>을 의미함</p>
</li>
<li><p>영벡터는 모든 linear combination에 대하여 <strong>갇혀있기에</strong> subspace가 맞다.<br>ex)  $c \cdot \bold 0 = \bold 0$  </p>
</li>
<li><p>basis는 empty vector이다. $\dim=0$</p>
<p>  $$
  \text{span} (\empty) = \left{ \bold 0 \right }
  $$</p>
<p>  <em>증명</em></p>
<ol>
<li><p>empty vector이 basis임을 보인다.
 a. linear combination의 결과가 $0$이면 $\bold x$는 영벡터만 가능하다. (=span 조건)</p>
<pre><code>가정) 어떤 영벡터가 아닌 $\bold x$에 대해 다음이 성립한다고 하자. [귀류법]

$$
 x_1\bold v_1 + \cdots + x_n \bold v_n = 0
$$</code></pre><p> b. 서로 독립이다.</p>
<pre><code>→ empty vector는 가지고 있는 벡터가 없기 때문에, 식이 성립할 수가 없기 때문에 두 조건 모두 만족한다고 할 수 있다.</code></pre></li>
<li><p>따라서 empty vector가 span하는 space는 가장 작은 space이다.</p>
</li>
<li><p>그런데 empty vector는 모든 space에 포함관계이다. </p>
<p> <em>(모든집합은 부분집합으로 공집합을 가짐)</em></p>
</li>
<li><p>따라서 가장 작은 space는 ${ \bold 0 }$이다.</p>
</li>
</ol>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[선형대수학] Linear Independence (feat. Rank)]]></title>
            <link>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Linear-Independence-feat.-Rank</link>
            <guid>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Linear-Independence-feat.-Rank</guid>
            <pubDate>Mon, 15 Aug 2022 11:21:03 GMT</pubDate>
            <description><![CDATA[<h3 id="definition-of-linearly-independent">Definition of <strong>linearly Independent</strong></h3>
<blockquote>
<p>아래 linear combination를 만족하는 유일한 해가 $x_i=0, \forall i$ 일 때, $\bold v_1... \bold v_n$ 벡터들은 서로 <strong>linearly Independent</strong>(일차/선형 독립) 이다.</p>
</blockquote>
<p>$$
x_1\bold v_1 + x_2 \bold v_2 + · · · + x_n \bold v_n = \bold  0 \ \ \text{only when}\ \ x_i=0, \forall i
$$</p>
<ul>
<li><p><U>Definition의 의미</U></p>
<p>  $\bold v_1... \bold v_n$ 열벡터를 갖는 행렬 $A$에 대해, $A \bold x= \bold 0$의 유일한 해가 $\bold x = \bold 0$ 일 때 <strong>행렬</strong> $A$<strong>의 열벡터는 서로 선형독립이다.</strong> </p>
<p>  <em>→ <strong>Rank</strong>의 개념을 적용하면 선형독립과 Rank의 관계를 유추할 수 있다!</em> [Full column Rank]</p>
</li>
</ul>
<p>$$
A\bold x =[\bold v_1\ \bold v_2 \ \cdots \ \bold v_n ] \begin{bmatrix} x_1\ x_2\ \vdots \ x_n\end{bmatrix} = \bold 0\ \ \text{only when}\ \ \bold x= \bold 0
$$</p>
<br>

<ul>
<li><p><U>독립이 아니라면? (=종속이라면?)</U></p>
<ul>
<li><p>만약 종속관계라면 linear combination에서 $0$이 아닌 다른해를 가진다.</p>
</li>
<li><p>종속관계이면 해당 관계에 속하는 벡터를 다른 벡터의 linear combination으로 표현할 수 있다.<br>→ $x_i ≠ 0$ 이라면, 다음과 같은 linear combination으로 $\bold v_i$를 표현할 수 있다.</p>
<p> $$
  \bold v_i = - \frac{1}{x_i} (x_1\bold v_1 + x_2 \bold v_2 + \cdots + x_n \bold x _n )
 $$</p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="linear-independece에서-rank의-의미">Linear Independece에서 Rank의 의미</h3>
<blockquote>
<p><em>the rank of a matrix is also defined as the maximum number of linearly independent columns in the matrix.</em></p>
<p>행렬의 <strong>Rank</strong>는 행렬에서 <strong>독립적으로 뽑아낼 수 있는 column</strong>의 최대개수이다.</p>
</blockquote>
<ul>
<li><p>Rank와 Independence의 관계</p>
<ul>
<li><p>만약 행렬이 <strong>full column rank</strong>이면, <strong>모든</strong> column들이 서로 독립적인 관계이다.  </p>
</li>
<li><p><em>full column rank :</em> Rank의 개수가 column의 갯수와 동일 </p>
<ul>
<li><p>$m \times n$ 행렬 $A$가 full column rank일 때, $n$개의 pivot variable/column을 가진다.</p>
</li>
<li><p>(pivot variable/column으로 표현되는) free variable/column을 가지지 않는다. [<strong>종속</strong>적인 관계]</p>
</li>
<li><p>Null Space는 영벡터만을 갖는다.</p>
<p>  $$
  N(A) = { \bold 0 }
  $$</p>
</li>
<li><p>$A\bold x = \bold b$ 는 해를 아예 가지지 않거나 1개의 해만을 가진다.</p>
</li>
</ul>
</li>
<li><p>pivot을 가지는 column(=pivot column)들은 서로 <strong>독립관계</strong>이며, pivot을 갖지 않는 column(=free column)은 다른 pivot column들의 linear combination으로 나타낼 수 있다.</p>
</li>
</ul>
</li>
<li><p>Row / Column rank와 Independence의 관계</p>
<ul>
<li><strong>Row</strong> rank는 선형독립한 <strong>행</strong>의 최대개수와 같다.</li>
<li><strong>Column</strong> rank는 선형독립한 <strong>열</strong>의 최대개수와 같다.<br>⇒ row rank와 column rank는 사실상 같은 의미이다.<br>$$
r(A) = r(A^T)
$$</li>
</ul>
</li>
</ul>
<br>

<h3 id="checking-linear-independence">Checking Linear Independence</h3>
<blockquote>
<p>Rank의 갯수는 독립인 column의 수와 동일하다는 점을 이용하여 확인한다.</p>
</blockquote>
<p>$m$차원 벡터 $n$개가 모여있을 때, (= $m \times n$ 행렬 $A$을 의미)</p>
<ul>
<li><p>$n &gt; m$이면 (벡터가 존재하는 차원보다 더 많은 벡터가 있을 때) <strong>종속</strong>이다.</p>
<p>  <em>ex)</em> 2차원 좌표에 2개 이상의 벡터가 존재하면, 그 벡터들의 선형결합으로 다른 모든 2차원상의 벡터를 표현할 수 있게 된다.</p>
</li>
<li><p>$n ≤ m$인 경우</p>
<ol>
<li><p>각각의 벡터를 열벡터로 갖는 행렬 $A$를 생각한다. $A = [\bold v_1\ \bold v_2\ \cdots\  \bold v_n]$</p>
</li>
<li><p>$A$에 Gauss Elimination을 적용하여 $r(A)$를 구한다. </p>
</li>
<li><p>만약 $r(A) =  n$ (<em>full column rank</em>) 이면 <strong>독립</strong>이다. </p>
<p> ↔  $r(A)&lt;n$ 이면 종속이다.</p>
</li>
</ol>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C++] 상속 : 기초]]></title>
            <link>https://velog.io/@webb-c/C-%EC%83%81%EC%86%8D-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@webb-c/C-%EC%83%81%EC%86%8D-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Mon, 15 Aug 2022 08:47:36 GMT</pubDate>
            <description><![CDATA[<h1 id="1상속ingeritance의-이해">1.상속:Ingeritance의 이해</h1>
<h3 id="00-객체지향에서-중요시-하는-원리">00-객체지향에서 중요시 하는 원리</h3>
<ol>
<li>요구사항의 변경에 쉽게 대응할 수 있는 프로그램의 <strong>유연성</strong></li>
<li>다른 기능을 쉽게 추가할 수 있는 프로그램의 <strong>확장성</strong></li>
</ol>
<br>

<h3 id="01-상속이-필요한-이유">01-상속이 필요한 이유</h3>
<p><strong>과거에 상속을 바라보았던 관점</strong></p>
<blockquote>
<p>기존에 정의해 놓은 클래스의 재활용을 목적으로 만들어진 문법적 요소가 상속이다.</p>
</blockquote>
<p>→ <U>그러나 상속은 재활용을 목적으로만 존재하는 문법적 요소가 아니며, 다양한 이점들이 존재한다.</U></p>
<p>어떤 회사가 직원의 급여를 관리하기 위해 어떤 프로그램을 만들었다. 회사 초기에는 ‘정규직&#39;으로 직원의 종류가 1가지였지만, 점점 회사가 커지면서 직원의 역할이 세분화됨에 따라 직원의 고용형태가 달라졌다고하자. 이미 설계해둔 프로그램을 이용하여 현재의 조건에 맞는 기능을 할 수 있게 변경할 수는 없을까?</p>
<p><em>→ 상속을 적용하면 가능하다!</em></p>
<br>

<h3 id="02-상속의-방법">02-상속의 방법</h3>
<blockquote>
<p>자식클래스가 부모클래스를 상속하게 되면, 자식클래스는 부모클래스가 지니고 있는 모든 멤버를 물려받는다.</p>
</blockquote>
<ul>
<li><p>자식클래스를 정의할 때, 자식클래스의 이름 뒤에 <code>: 접근제한자 부모클래스이름</code> 을 붙여 상속할 수 있다.</p>
</li>
<li><p><em>소스코드</em></p>
<pre><code class="language-cpp">  /*부모클래스 Person*/
  class Person {
          private:
                  int age;
                  char name[50];
          public:
                  Person(int myage, char* myname) : age(myage) {
                          strcpy(name, myname);
                  }
                  void ShowInfo() const {
                          cout&lt;&lt;&quot;Age: &quot;&lt;&lt;age&lt;&lt;endl;
                          cout&lt;&lt;&quot;Name: &quot;&lt;&lt;name&lt;&lt;endl;
                  }
  };</code></pre>
<pre><code class="language-cpp">  /*자식클래스 Student*/
  class Student : public Person {
          private:
                  char major[50];
          public:
                  Student(int myage, char* myname, char* mymajor) : Person(myage, myname) {
                          strcpy(major, mymajor);
                  }
                  void ShowInfo_std() const {
                          ShowInfo();
                          cout&lt;&lt;&quot;Major: &quot;&lt;&lt;major&lt;&lt;endl;
                  }
  };</code></pre>
</li>
<li><p>상속받은 클래스의 객체가 가지는 멤버</p>
<ul>
<li>자식클래스를 정의한 코드만 보면 <code>major</code>라는 멤버 변수와 <code>ShowInfo_std()</code>라는 멤버메소드만 가지고 있는 것 같지만, 실제로는 자기자신의 멤버 + <strong>부모의 멤버</strong>(<code>age</code>, <code>name</code>, <code>ShowInfo()</code>)를 모두 멤버로 가지고 있다.</li>
<li>따라서 자식클래스안에서 부모클래스의 멤버함수를 호출할 수 있었던 것이다.</li>
</ul>
</li>
</ul>
<br>

<h3 id="03-자식클래스의-생성자-정의">03-자식클래스의 생성자 정의</h3>
<ul>
<li><p><U>자식클래스의 멤버 초기화</U></p>
<ul>
<li><p>자식클래스의 생성자에서는 <strong>부모클래스의 멤버변수까지 모두 초기화 해야할 의무</strong>가 있다.</p>
</li>
<li><p>클래스의 멤버를 초기화 할 때는 멤버의 초기화를 목적으로 정의되었던 <strong>해당 클래스의 생성자</strong>를 호출하여 초기화하는 것이 정석이다.</p>
<p>  ⇒ 따라서 자식클래스의 생성자는 <U>자신이 상속한 부모클래스의 멤버를 초기화하기 위해 부모클래스의 생성자를 자기자신의 생성자에서 호출한다.</U></p>
</li>
</ul>
</li>
<li><p>생성자 구성</p>
<ul>
<li><p>자식클래스의 생성자에서는 부모클래스의 멤버를 초기화하기위한 인자의 전달까지 요구한다.</p>
</li>
<li><p>이니셜라이저가 의미하는 바는 부모클래스의 생성자의 호출이다.</p>
<pre><code class="language-cpp">  Student(int myage, char* myname, char* mymajor) //부모멤버 초기화를 위한 인자요구
          : Person(myage, myname) //부모생성자의 호출
          {
                  strcpy(major, mymajor);  //자기자신의 멤버의 초기화
          }</code></pre>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="04-자식클래스의-객체-생성-및-소멸">04-자식클래스의 객체 생성 및 소멸</h3>
<p><strong>자식클래스의 객체 생성</strong></p>
<ul>
<li><p><U>자식 클래스 객체 생성과정</U></p>
<ol>
<li><p>클래스를 생성하기 위해 메모리 공간이 할당된다. </p>
</li>
<li><p>이후 객체 생성 명령문에 의해 인자가 전달되면서 생성자가 호출된다.</p>
</li>
<li><p>먼저 <strong>부모 클래스</strong>의 생성자 호출을 위해 이니셜 라이저를 찾고,   </p>
<p>a. 부모클래스의 생성자가 명시되어있으면 명시된 부모클래스의 생성자를 호출한다.  </p>
<p>b. <strong>명시되어있지 않다면</strong> <em>void 생성자</em>를 호출한다.</p>
</li>
</ol>
<p>  *void 생성자 → 전달받는 인자가 없는 생성자. (default 생성자 or 전달받는 인자없이 초기화하는 생성자)</p>
<ol start="4">
<li>부모 클래스의 생성자 호출이 완료되어 부모 클래스의 멤버변수가 먼저 초기화된다.</li>
<li>부모 클래스의 생성자 호출을 위해 실행되지 않았던 자식 클래스의 생성자 실행이 마저 진행되면서 자식 클래스의 멤버변수도 초기화된다. </li>
</ol>
</li>
</ul>
<ul>
<li><U>자식 클래스 객체 생성 특징</U><ul>
<li>자식 클래스의 객체 생성 과정에서 부모 클래스의 생성자는 무조건 호출된다.    </li>
</ul>
</li>
</ul>
<pre><code>- 자식 클래스의 생성자에서 만약 부모 클래스의 생성자 호출을 명시하지 않았다면, 부모 클래스의 default 생성자가 호출된다.  

***부모 클래스의 생성자 정의에 따른 결과***

  - 부모 클래스에서 어떤 생성자도 정의하지 않았을 때  

  defalt 생성자가 사용된다. 따라서 생성만 했을 뿐 초기화를 위한 어떤 작업도 해주지 않았기 때문에 부모 클래스의 멤버변수에는 쓰레기 값이 들어있다.

  - 부모 클래스에 void생성자가 아닌 다른 생성자(=인자를 전달받는)를 정의했을 때
      - 자식 클래스의 default 생성자를 사용할 수 없다.
      - 반드시 자식 클래스 뒤에 정의해 둔 부모 클래스의 생성자를 명시해야한다. (명시하지 않으면 에러 발생)</code></pre><br>

<p><strong>자식클래스의 객체 소멸</strong></p>
<ul>
<li><p>자식 클래스의 객체 생성과정에서 생성자가 2번 호출된 것처럼, 자식 클래스의 객체가 소멸할 때는 소멸자가 2번 호출된다.</p>
</li>
<li><p><U>자식 클래스 객체 소멸 특징</U></p>
<ul>
<li><p>자식 클래스의 객체가 소멸될 때는, 다음 순서를 따른다. (생성자 호출순서와 <strong>역순</strong>)</p>
<ol>
<li><p><strong>자식 클래스</strong>의 소멸자 실행</p>
</li>
<li><p>부모 클래스의 소멸자 실행</p>
<p> ⇒ 스택에 생성된 객체의 소멸순서는 생성순서와 반대이다.</p>
</li>
</ol>
</li>
<li><p>따라서 상속과 연관된 클래스에서는 <strong>생성자</strong>에서 동적할당한 메모리는 <strong>소멸자</strong>에서 해제하도록 정의해야한다.</p>
</li>
</ul>
</li>
</ul>
<h3 id="-용어정리">+ 용어정리</h3>
<table>
<thead>
<tr>
<th>Person</th>
<th>Student</th>
</tr>
</thead>
<tbody><tr>
<td>상위클래스</td>
<td>하위클래스</td>
</tr>
<tr>
<td>기초(base)클래스</td>
<td>유도(derived)클래스</td>
</tr>
<tr>
<td>슈퍼(super)클래스</td>
<td>서브(sub)클래스</td>
</tr>
<tr>
<td>부모클래스</td>
<td>자식클래스</td>
</tr>
</tbody></table>
<br>

<h1 id="2상속의-세-가지-형태">2.상속의 세 가지 형태</h1>
<h3 id="01-protected-선언의-접근-범위">01-protected 선언의 접근 범위</h3>
<blockquote>
<p><em>private &lt; protected &lt; public</em></p>
</blockquote>
<ul>
<li><p><code>private</code>와 <code>protected</code>는 모두 해당 클래스의 외부에서는 접근이 불가능하지만 내부에서는 접근이 가능하다.</p>
</li>
<li><p>그러나 <strong>상속</strong>에서는 이 2가지 키워드의 차이점을 한눈에 알 수 있다!</p>
<ul>
<li><p><code>private</code> : 자식클래스는 부모클래스의 <strong>외부</strong>이기 때문에 <code>private</code>로 선언된 부모 클래스의 멤버에 접근할 수 없다.</p>
<p>  → 상속과정에서는 어떤 접근제한범위로 선언된 멤버든 <strong>모두 상속</strong>된다.(<code>private</code> 멤버도 상속됨) 그러나 접근제한의 기준은 객체가 아니라 <strong>클래스</strong>이기 때문에, <U>부모 클래스의 외부인 자식 클래스에서는 <code>private</code> 멤버에 직접접근은 할 수 없다.</U></p>
</li>
<li><p><code>protected</code> : 그러나 <code>private</code>와 다르게 <code>protected</code>로 선언된 부모 클래스의 멤버는 부모 클래스의 뫼부인 <strong>자식 클래스 안에서 접근할 수 있다!</strong></p>
<blockquote>
<p>자식클래스에게만 제한적으로 접근을 허용한다.</p>
</blockquote>
</li>
</ul>
</li>
<li><p><em>소스코드</em></p>
<pre><code class="language-cpp">  /*부모 클래스*/
  class Base {
          private:
                  int num1;
          protected:
                  int num2;
          public:
                  int num3;
  };</code></pre>
<pre><code class="language-cpp">  /*자식 클래스*/
  class Derived : public Base {
          public:
                  void Show(){
                          cout&lt;&lt;&quot;private number&quot;&lt;&lt;num1;     // 컴파일 에러
                          cout&lt;&lt;&quot;protected number&quot;&lt;&lt;num2;   // 접근 가능!
                          cout&lt;&lt;&quot;public number&quot;&lt;&lt;num3;      // 접근 가능!
                  }
  };</code></pre>
</li>
</ul>
<br>

<h3 id="02-3가지-형태의-상속">02-3가지 형태의 상속</h3>
<blockquote>
<p>자식 클래스에서 상속을 명시하는데 있어서 3가지의 접근제한자를 모두 사용할 수 있다. [상속의 형태를 명시]</p>
<p><code>class 자식클래스 :</code><strong><code>접근제한자</code></strong><code>부모클래스 {};</code></p>
</blockquote>
<br>

<h3 id="03-protected-상속">03-protected 상속</h3>
<blockquote>
<p>protected보다 접근의 범위가 넓은 멤버(=public)는 protected로 변경시켜서 상속한다.</p>
</blockquote>
<p>→ 따라서 protected 상속을 하게 되면, 기존에 클래스 밖에서 접근이 가능하던 멤버도 밖에서 접근할 수 없도록 보호된다. </p>
<ul>
<li><code>private</code> 멤버 → <strong>직접 접근 불가능한</strong> 멤버</li>
<li><code>protected</code> 멤버 → <code>protected</code> 멤버</li>
<li><code>public</code> 멤버 → <code>public</code> 멤버</li>
</ul>
<br>

<h3 id="04-private-상속">04-private 상속</h3>
<blockquote>
<p>private보다 접근의 범위가 넓은 멤버(=public, protected)는 private로 변경시켜서 상속한다.</p>
</blockquote>
<p>→ 따라서 private 상속을 한 클래스를 다시 한번 더 상속하게되면 <strong>모든 멤버</strong>(변수,함수)가 private이기 때문에, 자식클래스에서는 부모클래스의 모든 멤버에 직접접근할 수 없게된다. (사실상 의미없는 상속)</p>
<ul>
<li><code>private</code> 멤버 → <strong>직접 접근 불가능한</strong> 멤버</li>
<li><code>protected</code> 멤버 → <code>private</code> 멤버</li>
<li><code>public</code> 멤버 → <code>private</code> 멤버</li>
</ul>
<br>

<h3 id="05-public-상속">05-public 상속</h3>
<blockquote>
<p>public보다 접근의 범위가 넓은 멤버(=없음)는 public으로 변경시켜서 상속한다.</p>
<p>⇒ private를 제외한 나머지 멤버는 모두 그냥 그대로 상속한다. </p>
</blockquote>
<ul>
<li><code>private</code> 멤버 → <strong>직접 접근 불가능한</strong> 멤버</li>
<li><code>protected</code> 멤버 → <code>protected</code> 멤버</li>
<li><code>public</code> 멤버 → <code>public</code> 멤버</li>
</ul>
<p><em>*실제로는 public 이외의 상속은 다중상속과 같이 특별한 케이스가 아니라면 사용하지 않는다.</em></p>
<br>

<h1 id="3상속을-위한-조건">3.상속을 위한 조건</h1>
<h3 id="01-상속을-위한-기본조건--is-a-관계">01-상속을 위한 기본조건 : IS-A 관계</h3>
<blockquote>
<p>상속관계가 성립하기 위해서는 자식 클래스와 부모클래스 간에 IS-A 관계가 성립해야한다.</p>
<p><em>자식클래스 is a 부모클래스</em></p>
</blockquote>
<ul>
<li><p>스마트폰은 일종의 전화기이다.</p>
<p>  → smart phone <strong>is a</strong> phone.</p>
</li>
<li><p>노트북은 일종의 컴퓨터이다.</p>
<p>  → notebook <strong>is a</strong> computer</p>
</li>
</ul>
<br>

<h3 id="02-has-a-관계-소유의-관계">02-HAS-A 관계 (소유의 관계)</h3>
<blockquote>
<p>자식클래스는 부모 클래스가 가지는 모든 멤버를 소유하기 때문에 소유의 관계도 상속으로 표현할 수 있다.</p>
<p><em>자식클래스 has a 부모클래스</em></p>
</blockquote>
<p>(단, 소유의 관계는 상속이 아니라 가지고 있는 객체를 생성해서 사용하는 등의 방법을 사용하여 표현할 수 있다. )</p>
<ul>
<li><p>경찰이 총을 가지고 있다.</p>
<p>  → police <strong>has a</strong> gun</p>
</li>
</ul>
<ul>
<li><p>상속관계로 표현하기 힘든 소유 관계</p>
<ul>
<li><p>총을 가지고 있지 않은 경찰의 표현</p>
</li>
<li><p>총 만이 아니라 다른 도구도 소유하고 있는 경찰의 표현</p>
<p>  → 상속은 묶인 두 클래스는 강한 연관성을 띠기 때문에, 다양한 조건을 가질 수 있는 소유관계는 다른 복합 관계로 대신하는 것이 일반적이다.</p>
</li>
</ul>
</li>
</ul>
<br>

<p><em>본문은 ⟪열혈 C++ 프로그래밍, 윤성우⟫ 도서에 기반하여 정리한 내용입니다.</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[선형대수학] Rank]]></title>
            <link>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Rank</link>
            <guid>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Rank</guid>
            <pubDate>Fri, 12 Aug 2022 13:43:25 GMT</pubDate>
            <description><![CDATA[<h1 id="rank-of-a-matrix">Rank of a Matrix</h1>
<h3 id="definition-of-rank">Definition of Rank</h3>
<blockquote>
<p>The rank of a matrix $r(A)$ is <strong>the number of pivots</strong></p>
</blockquote>
<ul>
<li><p>행렬의 rank는 <strong>pivot의 개수</strong>를 의미한다.    </p>
</li>
<li><p><U>rank의 의미</U><br>$m\times n$ 행렬 $A$가 $r$개의 rank를 가질 때,</p>
<ul>
<li>$A\bold x = \bold 0$은 $m$개의 linear equation을 가진다.</li>
<li>$m$개의 linear equation중에서 $m-r$개의 equation은 다른 equaion으로부터 유도될 수 있다. <strong>[종속]</strong></li>
<li>따라서 실제로는 rank의 개수인 $r$개의 equation이 존재하는 것이나 다름없다.<br>⇒ rank는 행렬의 진짜 크기를 나타낸다.</li>
</ul>
</li>
</ul>
<h3 id="rank의-응용">Rank의 응용</h3>
<p>전체 행렬을 저장하는 것보다, 행렬의 정보(Rank, pivot)만을 저장한 뒤에 복원하는 방식으로 저장용량을 줄알 수 있다. </p>
<br>

<h1 id="full-rank">Full Rank</h1>
<h3 id="full-rank의-의미">Full Rank의 의미</h3>
<blockquote>
<p>$m\times n$ 행렬 $A$의 rank의 갯수 $r(A)$는 행렬의 행($m$)이나 열($n$)의 갯수를 넘어설 수 없다.</p>
<p>→ 각각의 column은 <strong>최대 1개</strong>의 pivot을 가지기 때문이다.</p>
</blockquote>
<p>$$
r(A) ≤ min{m,n}
$$</p>
<h3 id="full-column-rank"><strong>Full Column Rank</strong></h3>
<blockquote>
<p>$m\times n$ 행렬 $A$의 <strong>rank의 갯수 $r(A)$가 column의 갯수($n$)와 같을 때</strong>, $A$는 Full Column Rank를 가진다.</p>
<p>→ 각 column이 모두 pivot으로 가득 차있다는 의미</p>
</blockquote>
<p>$$
r(A) = n
$$</p>
<ul>
<li><p><U>Full Column Rank $m\times n$ 행렬 $A$의 특징</U>. </p>
<ul>
<li><p>$n$개의 pivot column을 가진다. ↔ <strong>free column/variable을 가지지 않는다.</strong></p>
</li>
<li><p>free variable로 다른 pivot vatiable을 표현하기 때문에 free variable이 없으면 표현자체를 할 수 없기에 Null Space는 영벡터만을 가진다.</p>
<p>  $$
  N(A) = { \bold0}
  $$</p>
</li>
<li><p>$A\bold x = \bold b$는 <strong>해를 아예 가지지 않거나 1개의 해만을 가진다.</strong>  </p>
</li>
</ul>
</li>
</ul>
<pre><code>   &gt;  💡 아이디어) $A\bold x = \bold b$의 complete solution은 $A\bold x= \bold 0$의 special solution과 $A\bold x = \bold b$의 particular solution의 합이다.


    1. Full Column Rank 행렬의 NullSpace는 영벡터만을 가지기 때문에 special solution이 존재하지 않는다.  

    2. 따라서 complete Solution이 $A\bold x= \bold b$의 particular solution과 동일하다. 
    3. *해를 가지는 경우*
        - particular solution가 존재하면 1개의 complete solution을 가짐
        - particular solution가 존재하면 0개의 complete solution을 가짐</code></pre><ul>
<li>$A\bold x = \bold b$에서<ul>
<li>$\bold b$가 $A$의 column Space($C(A)$)에 존재하면 complete solution을 가진다.</li>
<li>$\bold b$가 $A$의 column Space($C(A)$)에 존재하지 않으면 complete solution을 가지지 않는다.</li>
</ul>
</li>
<li>정사각형 or 아래로 긴 직사각형 형태의 행렬</li>
</ul>
<br>

<h3 id="full-row-rank"><strong>Full Row Rank</strong></h3>
<blockquote>
<p>$m\times n$ 행렬 $A$의 <strong>rank의 갯수 $r(A)$가 row의 갯수</strong>($<strong>m</strong>$)<strong>와 같을 때</strong>, $A$는 Full Row Rank를 가진다.</p>
<p>→ 각 row가 모두 pivot으로 가득 차있다는 의미</p>
</blockquote>
<p>$$
r(A) = m
$$</p>
<ul>
<li><p><U>Full Row Rank $m\times n$ 행렬 $A$의 특징</U></p>
<ul>
<li><p>$A$의 Column Space는 $\mathbb R^m$과 같다.</p>
<p>  $$
  C(A) = \mathbb R^m 
  $$</p>
</li>
<li><p>$A\bold x = \bold b$ 는 <strong>항상 해를 가진다.</strong><br>→ full row rank 행렬의 <strong>각 행은 모두 pivot을 가지기 때문에 solution이 항상 존재한다.</strong><br>↔ 어떤 벡터 $\bold b$가 오더라도 $A\bold x = \bold b$가 항상 해를 가지면 $\bold b$는 $C(A)$에 포함관계이다. </p>
</li>
<li><p>$n-m$개(=free variable의 개수)의 special solution을 가진다.</p>
</li>
</ul>
</li>
<li><p>정사각형 or 옆으로 긴 직사각형 형태의 행렬</p>
</li>
</ul>
<br>

<h1 id="rank와-ax--b의-관계">Rank와 Ax = b의 관계</h1>
<h3 id="rank와-special-solution의-관계">Rank와 special solution의 관계</h3>
<p>$m\times n$ 행렬 $A$를 가정하자.</p>
<ul>
<li>pivot column의 수 : $r(A)$</li>
<li>free column의 수 : $n - r(A)$<br>→ $A\bold x = \bold 0$은 $n-r(A)$개의 special solution을 가진다는 것을 알 수 있다.</li>
</ul>
<h3 id="rank의-개수에-따른-solution의-개수">Rank의 개수에 따른 solution의 개수</h3>
<ul>
<li><p>$r(A) &lt; n$ 이면 해가 무수히 많다.</p>
</li>
<li><p>$r(A) = n$이면 special solution을 가지지 않는다. ($n-n=0$)</p>
<p>  <em>→ full column rank</em></p>
</li>
<li><p>$r(A) = m$이면 solution은 무조건 존재한다.</p>
<p>  <em>→ full row rank</em></p>
</li>
<li><p>$r(A) &lt; m$이면 solution이 존재하지 않을 수도 있다.</p>
</li>
</ul>
<br>

<h3 id="관계정리-표">관계정리 (표)</h3>
<p><img src="https://velog.velcdn.com/images/webb-c/post/f7661e7b-5df4-4c36-87d9-0096ad106511/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C++] 클래스 키워드]]></title>
            <link>https://velog.io/@webb-c/C-%ED%81%B4%EB%9E%98%EC%8A%A4-%ED%82%A4%EC%9B%8C%EB%93%9C</link>
            <guid>https://velog.io/@webb-c/C-%ED%81%B4%EB%9E%98%EC%8A%A4-%ED%82%A4%EC%9B%8C%EB%93%9C</guid>
            <pubDate>Wed, 10 Aug 2022 02:29:10 GMT</pubDate>
            <description><![CDATA[<h1 id="1-const-키워드">1. const 키워드</h1>
<h3 id="01-const-객체">01-const 객체</h3>
<p>const 키워드를 이용하여 변수를 상수화 하듯, <strong>객체도 상수화 할 수 있다.</strong></p>
<ul>
<li><U>const 객체의 의미</U><ul>
<li>const 선언과 함께 만들어진 객체를 대상으로는 const 멤버 함수만 호출할 수 있다.</li>
<li>객체의 데이터 변경을 허용하지 않기 때문이다.<br>→ 객체 데이터값을 변경시킬 능력이 있는 함수(<em>≠const 함수</em>)는 아예 호출할 수 없도록 한다.</li>
</ul>
</li>
</ul>
<ul>
<li><p><em>const 객체 선언예시</em></p>
<pre><code class="language-cpp">  #include &lt;iostream&gt;
  using namespace std;

  class Simple{
          private:
                  int num;
          public:
                  Simple(int n) : num(n) {}
                  void ShowData() const {
                          cout&lt;&lt;&quot;num: &quot;&lt;&lt;num&lt;&lt;endl;
                  }
          };

  int main(){
          const Simple obj(5);     //const 객체
          obj.ShowData();          //const 멤버함수 호출
          return 0;
  }</code></pre>
</li>
</ul>
<h3 id="02-함수-오버로딩에서-const">02-함수 오버로딩에서 const</h3>
<ul>
<li><p>기본적으로 함수를 오버로딩 하려면 함수 호출시 확인하는 매개변수의 개수나 그 자료형이 달라야 한다.</p>
</li>
<li><p>함수 오버로딩에서는, 함수가 정의될 때 const 키워드의 유무로도 함수를 구분한다.<br><em>아래 두 함수는 서로 다른 함수이다!</em></p>
<ul>
<li><code>void SimpleFunc() { . . . }</code></li>
<li><code>void SimpleFunc() **const** { . . . }</code></li>
</ul>
</li>
</ul>
<br>

<h1 id="2friend-선언">2.friend 선언</h1>
<blockquote>
<p><em>친구</em> !</p>
</blockquote>
<h3 id="01-클래스의-friend-선언">01-클래스의 friend 선언</h3>
<ul>
<li><p><strong>friend 선언의 의미</strong></p>
<ul>
<li><p>어떤 A클래스가 B클래스를 대상으로 friend선언을 하면, B클래스는 A클래스의 private 멤버에 직접 접근이 가능하다.<br>→ <U>private 멤버의 접근을 허용하는 선언</U>  </p>
<ul>
<li>단, A클래스도 B클래스의 private멤버에 직접 접근하기위해서는 B클래스가 A클래스를 대상으로 friend선언을 해야한다.<br>→ <U>friend선언은 일방적인 선언이다.</U></li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>friend 선언방법</strong></p>
<ul>
<li><p>friend 선언은 클래스를 생성할 때, friend선언을 하고자하는 클래스를 클래스 안의 멤버로 선언하면 된다.</p>
</li>
<li><p>friend선언은 클래스 내의 private, public 영역 어디에 존재하든지 상관없다.</p>
</li>
<li><p><em>friend선언 예시코드</em></p>
<pre><code class="language-cpp">  #include &lt;iostream&gt;
  using namespace std;

  class B;     //클래스 원형
  class A {
          private: 
                  int num;
                  friend class B; //A클래스가 B클래스를 대상으로 friend선언을 함.
          public:
                  A(int num) : num(num) {}
  }</code></pre>
</li>
</ul>
</li>
</ul>
<h3 id="02-friend-선언이-존재하는-이유">02-friend 선언이 존재하는 이유</h3>
<ul>
<li>friend선언은 객체지향의 기본 원리 중 하나인 ‘정보은닉&#39;을 무너뜨리는 문법이다.</li>
<li>따라서 클래스를 사용할 때 freind선언을 가급적 사용하지 말자.</li>
<li>friend선언은 주로 연산자 오버로딩에 사용된다.</li>
</ul>
<h3 id="03-함수의-friend-선언">03-함수의 friend 선언</h3>
<ul>
<li>전역함수, 클래스의 멤버함수를 대상으로 friend선언이 가능하다.</li>
<li>클래스 안에서 friend선언된 함수는 자신이 선언된 클래스의 private영역에 접근할 수 있다.</li>
</ul>
<br>

<h1 id="3-static-키워드">3. static 키워드</h1>
<h3 id="01-c언어에서-static">01-C언어에서 static</h3>
<ul>
<li>전역변수에 선언된 static : 선언된 파일 내에서만 참조를 허용한다.</li>
<li>함수 내에 선언된 static : 딱 한번만 초기화되고, 일반적인 지역변수와 달리 함수를 빠져나가도 소멸되지 않는다.</li>
</ul>
<h3 id="02-static-멤버변수-클래스변수">02-static 멤버변수: 클래스변수</h3>
<blockquote>
<p>c++에서는 각각의 클래스별로 전역변수를 사용하고자하는 상황이 발생할 수 있다. 그러나 그냥 전역변수를 사용하면 그 변수에 대해 제한을 시켜줄 장치가 존재하지 않기 때문에, <strong>static멤버</strong>를 사용하여 그 역할을 대신한다.</p>
</blockquote>
<ul>
<li><p>static 멤버변수는 그 클래스의 객체를 몇개를 생성하건 아니면 아예 생성하지 않건, 메모리 공간에 딱 하나만 할당되어 <strong>공유되는 변수</strong>이다.</p>
</li>
<li><p>static 멤버변수는 객체안에 존재하지 않으며, 객체에게는 단지 해당 멤버변수에 접근할 수 있는 권한만을 주었을 뿐이다.</p>
<ul>
<li><p>따라서 생성자를 이용해 초기화 하면 안된다. (static 멤버변수는 객체 생성과 상관없이 이미 메모리 할당이 이루어진 변수이기 떄문이다)</p>
</li>
<li><p><strong>static 멤버변수의 초기화</strong></p>
<pre><code class="language-cpp">  /* 자료형 클래스이름::클래스변수이름 = 초기화값 */
  int SoSimple::simObjCnt = 0;</code></pre>
</li>
</ul>
</li>
<li><p>생성 및 소멸의 시점 또한 전역변수와 동일하다.</p>
</li>
<li><p><em>static 멤버변수 사용예시</em></p>
<ul>
<li><p>객체가 생성될 때마다 몇번째로 생성된 객체인지를 알려주는 프로그램</p>
</li>
<li><p>객체 생성될 때마다 해당객체의 클래스변수값을 증가시켜 그 클래스의 객체끼리 공유하는 변수로서 기능을 구현해냈다.</p>
<pre><code class="language-cpp">#include &lt;iostram&gt;
using namespace std;

class SoSimple {
      private:
              static in simObjCnt;
      public:
              SoSimple(){
                      simObjCnt++;
                      cout&lt;&lt;simObjCnt&lt;&lt;&quot;번째 SoSimple 객체&quot;&lt;&lt;endl;
              }
};
int SoSimple::simObjCnt = 0;

class SoSimple2 {
      private:
              static in sim2ObjCnt;
      public:
              SoSimple2(){
                      sim2ObjCnt++;
                      cout&lt;&lt;sim2ObjCnt&lt;&lt;&quot;번째 SoSimple2 객체&quot;&lt;&lt;endl;
              }
};
int SoSimple2::sim2ObjCnt = 0;

int main(){
      SoSimple sim1;
      SoSimple sim2;

      SoSimple2 sim21;
      SoSimple2 sim22;
      SoSimple2();
      return 0;
}</code></pre>
</li>
</ul>
</li>
</ul>
<h3 id="03-static-멤버변수의-접근방법">03-static 멤버변수의 접근방법</h3>
<ol>
<li><p>객체이름을 이용한 접근 (<code>.</code>)</p>
<p> ex) <code>obj1.simObjCnt</code></p>
</li>
<li><p>클래스 자체를 이용한 접근 (<code>::</code>) → 단 이런 접근은 <code>public static</code> 멤버인 경우에만 가능하다. </p>
<p> ex) <code>SimClass::simObjCnt</code></p>
</li>
</ol>
<h3 id="04-static-멤버함수">04-static 멤버함수</h3>
<p>static 멤버함수 또한 static 멤버변수와 동일한 특징을 가진다.</p>
<ul>
<li>선언된 클래스의 모든 객체가 공유</li>
<li>public으로 선언되었으면, 클래스의 이름을 통해 접근할 수 있다.</li>
<li><U>객체의 멤버로 존재하지 않는다.</U><ul>
<li>객체의 멤버가 아니기 때문에, static 멤버함수에서는 <strong>객체의 일반적인 멤버변수에 접근할 수 없다</strong>. (아직 만들어지기 전이니까)</li>
<li>따라서 static 멤버함수 안에서는 <strong>static 멤버변수와 static멤버함수만 호출</strong>할 수 있다.</li>
</ul>
</li>
</ul>
<h3 id="05-const-static">05-const static</h3>
<p>const static으로 선언되는 멤버변수는 상수라는 의미의 const키워드가 추가되었기 때문에, 따로 초기화해주지 않고 선언과 동시에 초기화가 가능하다.</p>
<ul>
<li><p>일반적인 static변수의 초기화<br><code>int SoSimple::simObjCnt = 0;</code></p>
</li>
<li><p>const static 변수(<strong>상수</strong>)의 초기화<br><code>const static int SIMOBJCNT = 0;</code></p>
</li>
</ul>
<br>

<h1 id="4값의-변경에-대한-키워드">4.값의 변경에 대한 키워드</h1>
<h3 id="01-const와-explicit">01-const와 explicit</h3>
<ul>
<li>const : 값과 주소를 변경할 수 없도록 한다.</li>
<li>explicit : 자동 형변환이 일어나지 않도록 한다.</li>
</ul>
<h3 id="02-mutable">02-mutable*</h3>
<ul>
<li>거의 사용하지 않아야한다.</li>
<li><U>const 함수 내에서 값의 변경을 예외적으로 허용한다.</U></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[선형대수학] Solvability of Ax = b]]></title>
            <link>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Solvability-of-Ax-b</link>
            <guid>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Solvability-of-Ax-b</guid>
            <pubDate>Wed, 10 Aug 2022 01:31:43 GMT</pubDate>
            <description><![CDATA[<h1 id="a-bold-xbold-b">$A \bold x=\bold b$</h1>
<h3 id="abold-x-bold-b의-의미">$A\bold x= \bold b$의 의미</h3>
<p>$m\times n$ 행렬 $A$에 대해서 $A\bold x$는 아래와 같이 표현할 수 있다.</p>
<p>$$
A\bold x = \begin{bmatrix}\bold{a_1}\ \ \bold{a_2}\ \ \cdots \ \ \bold{a_n}\end{bmatrix} \begin{bmatrix} x_1 \ x_2 \ \vdots \ x_n \end{bmatrix} = x_1\bold{a_1} + x_2\bold{a_2} + \cdots + x_n\bold{a_n}
$$</p>
<ul>
<li><U>$n$개의 열벡터($\bold{a_i}$)로 이루어진 행렬 $A$</U>와 <U>$n$개의 미지수로 이루어진 벡터 $\bold x$</U>의 곱</li>
<li>각 열벡터($\bold{a_i}$)와  벡터 $\bold x$의 요소들($x_i$)의 <strong>선형결합</strong> → $\bold b$<br>=  $A$<strong>의 column들의 liner combination이다.</strong></li>
</ul>
<blockquote>
<p><strong>따라서 $A\bold x=\bold b$ 방정식은 벡터 $\bold b$가 $A$의 Column space 안에 들어있다면 해를 가진다.</strong> (if and only if)</p>
</blockquote>
<p>$$
\bold x \text{ is exist, }\ \text{if and only if }\bold b ∈ C(A)
$$</p>
<br>

<h3 id="some-terminology--용어">Some Terminology : 용어</h3>
<p>elimination이 진행된 행렬 $A$에 대해, $A\bold x = 0$ 에서 </p>
<ul>
<li><strong>Pivot</strong> column: 행렬 $A$에서 pivot을 가지는 column</li>
<li>Free column: 행렬 $A$에서 pivot을 가지지 않는 column</li>
<li>Pivot variable: 벡터 $\bold x$에서 행렬 $A$의 pivot column에 곱해지는 변수 (요소)</li>
<li>Free variable: 벡터 $\bold x$에서 행렬 $A$의 free column에 곱해지는 변수 (요소)</li>
</ul>
<p><em>예시</em> : 아래 행렬에서 pivot/free column과 pivot/free variable은?</p>
<p>$$
\begin{bmatrix} 
1 &amp; 2 &amp; 1 &amp; 0 \
0 &amp; 1 &amp; 4 &amp; -1 \
0 &amp; 0 &amp; 0 &amp; 0
\end{bmatrix} 
\begin{bmatrix} 
x_1 \
x_2 \
x_3 \
x_4
\end{bmatrix} = \begin{bmatrix} 
0 \
0 \
0\
\end{bmatrix}
$$</p>
<ul>
<li><p>pivot column : $[1\ \ 0 \ \ 0]^T$, $[2\ \ 1 \ \ 0]^T$</p>
<p>  (<em>pivot</em> : $1, 1$)</p>
</li>
<li><p>free column : $[1\ \ 4 \ \ 0]^T$, $[0\ \ -1 \ \ 0]^T$</p>
</li>
<li><p>pivot variable : $x_1, x_2$</p>
</li>
<li><p>free variable : $x_3, x_4$</p>
</li>
</ul>
<br>

<h1 id="nullspace-구하기--special-solution"><strong>NullSpace 구하기 : special solution</strong></h1>
<h3 id="method-1">method 1</h3>
<blockquote>
<p><strong>각각의 pivot variable을 free variable를 이용해서 표현하고 벡터 $\bold x$에 대입한다.</strong></p>
</blockquote>
<ol>
<li><p>$A\bold x = \bold 0$ 꼴로 행렬을 표현한다.</p>
</li>
<li><p>$A$에 대하여 Gauss Elimination을 진행한다.</p>
</li>
<li><p>이후 $\bold x$의 pivot variable을 free variable로 표현한다.</p>
<p> → fv의 선형결합으로 표현된 pc를 각각의 표현으로 분리한다. </p>
</li>
<li><p>그렇게 free variable로 표현된 변수들을 벡터 $\bold x$에 대입한다.</p>
</li>
<li><p>벡터 $\bold x$를 <U>각각의 free variable과 <strong>벡터*</strong>의 linear combination 으로 표현한다.</U> ⇒ <em>solution to</em> $A\bold x= \bold 0$, $N(A)$</p>
<p> 이때, 각각의 벡터를 <strong>special solution</strong>이라고 부른다.</p>
</li>
</ol>
<br>


<ul>
<li><p>표현 예시</p>
<ol>
<li><p>variable에 대해 다음 두 방정식이 주어졌다. (fv : $x_2, x_4, x_5$ 일 때)</p>
<ul>
<li>$x_1 = -2x_2 + 2x_5$</li>
<li>$x_3 = -x_4-2x_5$</li>
</ul>
</li>
<li><p>식을 활용하여 벡터 $\bold x$에 대입한다.</p>
<p> $$
 \bold x = 
 \begin{bmatrix}
 x_1\x_2\x_3\x_4\x_5</p>
<h1 id="endbmatrix"> \end{bmatrix}</h1>
<p> \begin{bmatrix}
 -2x_2 + 2x_5\x_2\-x_4-2x_5\x_4\x_5
 \end{bmatrix}
 $$</p>
</li>
<li><p>각각의 free variable에 대한 선형결합으로 표현한다. </p>
<p> $$
 \bold x = 
 x_2 \begin{bmatrix}
 -2\1\0\0\0
 \end{bmatrix}+x_4 \begin{bmatrix}
 0\0\-1\1\0
 \end{bmatrix}+x_5 \begin{bmatrix}
 2\0\-2\0\1
 \end{bmatrix},\ \ \ x_2,x_4,x_5\in \mathbb R
 $$</p>
</li>
</ol>
</li>
</ul>
<h3 id="method-2">method 2</h3>
<blockquote>
<p><strong>free variable중 하나의 변수에는 1을 대입하고 나머지에는 0을 대입하는 과정을 반복한다.</strong></p>
</blockquote>
<ol>
<li><p>$A\bold x = \bold 0$ 꼴로 행렬을 표현한다.  </p>
</li>
<li><p>$A$에 대하여 Gauss Elimination을 진행한다.  </p>
</li>
<li><p><U>여러개의 free variable중 <strong>하나를 1로 하고 다른 free variale들은 0을 대입</strong>하여 표현한다.</U></p>
</li>
<li><p>3번 과정을 거쳐 이제 pivot variable의 값만 알아내면 되는 벡터 $\bold x$에 대해 $A\bold x = \bold 0$ 을 풀어 벡터: <strong>special solution</strong>를 구한다.</p>
</li>
<li><p>각각의 모든 free variable에 해당 과정을 반복해서(1인 variable을 변경해줌) 적용하여 모든 special solution들을 구한다.</p>
</li>
<li><p>이렇게 구한 <U>special colution들의 linear combination</U> ⇒ <em>solution to</em> $A\bold x= \bold 0$, $N(A)$</p>
<br>



</li>
</ol>
<ul>
<li><p>표현 예시<br>fv : $x_2, x_4, x_5$ 일 때</p>
<ol>
<li><p>variable에 대해 다음 두 방정식이 주어졌다. (fv : $x_2, x_4, x_5$ 일 때)</p>
<ul>
<li>$x_1 = -2x_2 + 2x_5$</li>
<li>$x_3 = -x_4-2x_5$</li>
</ul>
</li>
<li><p><em>각 case별 Special solution</em></p>
<ul>
<li><p>$x_2 = 1, x_4 = 0, x_5 = 0$</p>
<p>  $$
  \bold x = 
  \begin{bmatrix}
  -2x_2 + 2x_5\1\-x_4-2x_5\0\0</p>
<h1 id="endbmatrix-1">  \end{bmatrix}</h1>
<p>  \begin{bmatrix}
  -2 \1\0\0\0
  \end{bmatrix}
  $$</p>
</li>
<li><p>$x_2 = 0, x_4 = 1, x_5 = 0$</p>
<p>  $$
  \bold x = 
  \begin{bmatrix}
  -2x_2 + 2x_5\0\-x_4-2x_5\1\0</p>
<h1 id="endbmatrix-2">  \end{bmatrix}</h1>
<p>  \begin{bmatrix}
  0 \0\-1\1\0
  \end{bmatrix}
  $$</p>
</li>
<li><p>$x_2 = 0, x_4 = 0, x_5 = 1$</p>
<p>  $$
  \bold x = 
  \begin{bmatrix}
  -2x_2 + 2x_5\0\-x_4-2x_5\0\1</p>
<h1 id="endbmatrix-3">  \end{bmatrix}</h1>
<p>  \begin{bmatrix}
  2 \0\-2\0\1
  \end{bmatrix}
  $$</p>
</li>
</ul>
</li>
<li><p>Special solution들의 linear combination</p>
<p> $$
 \bold x = 
 x_2 \begin{bmatrix}
 -2\1\0\0\0
 \end{bmatrix}+x_4 \begin{bmatrix}
 0\0\-1\1\0
 \end{bmatrix}+x_5 \begin{bmatrix}
 2\0\-2\0\1
 \end{bmatrix},\ \ \ x_2,x_4,x_5\in \mathbb R
 $$</p>
</li>
</ol>
</li>
</ul>
<br>

<h3 id="special-solution">special solution?</h3>
<ul>
<li>NullSpace를 이루는 vector</li>
<li>special solution은 free variable(=free column)의 개수와 동일하다.</li>
<li>free variable의 개수 = <code>전체 column의 갯수 - pivot의 개수</code> ($n-r$)</li>
</ul>
<br>

<h1 id="complete-solution">Complete Solution</h1>
<h3 id="theorem"><strong>Theorem</strong></h3>
<p>벡터 $\bold w$가 $A\bold x= \bold b$의 임의의 solution이라고 가정하자. <em>Then,</em></p>
<ul>
<li><p>$A\bold x= \bold b$ 의 solution이 $\bold y$이면 $\bold y = \bold w+\bold z$ 이다. ($\bold z \in N(A)$)<br><em>pf)</em></p>
<ol>
<li><p>$\text{if }\ A\bold y = \bold b$ 이라면,</p>
<p> $$
 A\bold y -  A\bold w = \bold b - \bold b =0\\ \A(\bold y - \bold w) = 0
 $$</p>
</li>
<li><p>따라서 벡터 $\bold y - \bold w$는 NullSpace에 속하는 vector이다.</p>
<p> $$
 \bold y - \bold w \in N(A)
 $$</p>
</li>
<li><p>벡터 $\bold z$를 NullSpace에 속하는 또다른 vector라고 하면, linear combination 성질에 의해</p>
<p> $$
 \bold y-\bold w = \bold z\ \ (\bold z \in N(A))\\ \ \bold y = \bold w + \bold z
 $$</p>
</li>
</ol>
</li>
<li><p>↔  $\bold y = \bold w+\bold z$ ($\bold z \in N(A)$) 이면 $\bold y$는 $A\bold x= \bold b$의 solution이다.<br><em>pf)</em></p>
<ol>
<li><p>$\text{if }\ \bold y = \bold w+\bold z$ 이라면,</p>
<p> $$
 A\bold y =  A(\bold w + \bold z)= A\bold w + A\bold z
 $$</p>
</li>
<li><p>이때, 처음 Theorem의 가정에 따라 $A\bold w = \bold b$이고 $\bold z$는 NullSpace에 속하는 벡터이므로 $A\bold z = \bold 0$</p>
<p> $$
 \bold b + \bold 0 = \bold b
 $$</p>
</li>
<li><p>따라서 $\bold y$는 $A\bold x= \bold b$의 solution이다.</p>
<p> $$
 A\bold y = \bold b
 $$</p>
</li>
</ol>
</li>
</ul>
<blockquote>
<p>$\bold y = \bold w + \bold z$ 를 이용하여 모든 solution을 표현할 수 있다.</p>
<p>→ 즉, NullSpace를 구하여 그 벡터 ($\bold z \in N(A)$)에 임의의 solution $\bold w$를 더하면 complete solution을 표현할 수 있다. </p>
</blockquote>
<br>

<h3 id="기하학적-의미">기하학적 의미</h3>
<ul>
<li>임의의 solution과 NullSpace의 vector(special solution)을 더한 vector의 종점은 여전히 $A\bold x = \bold b$ 안에 들어있다.</li>
<li>따라서 NullSpace의 어떤 solution과 임의의 solution의 합으로 $A\bold x = \bold b$의 모든 solution을 표현할 수 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/webb-c/post/63059aa3-4052-404e-a9dd-689840af495b/image.png" alt=""></p>
<br>

<h3 id="과정"><strong>과정</strong></h3>
<ol>
<li><p>$A\bold x = \bold b$의 아무 solution을 찾는다. $(=x_p)$</p>
<ul>
<li>임의의 <strong>어떤 solution이던간에 관계없음</strong></li>
<li>따라서 가장 쉽게 solution을 찾을 수 있도록 <U><strong>fv를 0으로 가정</U>하고</strong> $A\bold x = \bold b$를 풀어서 particular solution을 구한다.</li>
</ul>
</li>
<li><p>$A\bold x = \bold 0$의 solution을 찾는다. → Null Space를 찾는다. $(N(A) = x_n)$</p>
</li>
<li><p>$x_p + x_n$이 $A\bold x = \bold b$의 complete solution이 된다.</p>
<p> (NullSpace의 모든 vector에 대해 진행하여 새로운 벡터 공간을 정의함)</p>
</li>
</ol>
<blockquote>
<p>완전해(complete solution)은 <strong>특수해들의 선형조합</strong>이다.</p>
</blockquote>
<ul>
<li><em>특수헤?</em><ul>
<li>$A\bold x = \bold 0$ 의 해 (=Special solution) : NullSpace의 벡터</li>
<li>$A\bold x = \bold b$의 임의의 solution (=particular solution)</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[선형대수학] Subspace]]></title>
            <link>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Subspace</link>
            <guid>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Subspace</guid>
            <pubDate>Tue, 09 Aug 2022 14:40:44 GMT</pubDate>
            <description><![CDATA[<h1 id="subspace">Subspace</h1>
<h3 id="definition-vector-space">Definition Vector Space</h3>
<blockquote>
<p>벡터들을 모아둔 <strong>집합</strong>이 다음 공리들을 만족할 때 이를 벡터공간: vector space이라고 부른다.</p>
</blockquote>
<ul>
<li><p>$V$에 속하는 모든 벡터에 대해 교환법칙이 만족</p>
<p>  $$
  \bold u + \bold v = \bold v + \bold u\ \  ∀\bold u, \bold v ∈ V
  $$</p>
</li>
<li><p>$V$에 속하는 모든 벡터에 대해 결합법칙이 만족</p>
<p>  $$
  (\bold u + \bold v) + \bold w = \bold u + (\bold v + \bold w)\ \ ∀\bold u, \bold v, \bold w ∈ V
  $$</p>
</li>
<li><p>$V$에 속하는 모든 벡터에 대해 0벡터가 존재<br>→ There exists a vector $\bold 0 ∈ V$ , called the <strong>zero vector.</strong> <em>such that</em></p>
<p> $$
 \bold v + \bold 0 = \bold v\ \ ∀\bold v ∈ V
 $$</p>
</li>
<li><p>$V$에 속하는 모든 벡터에 대하여 그 벡터의 음의 벡터와의 합은 0벡터를 만족<br>→ For every $\bold v ∈ V$ , there exists a vector $−\bold v ∈ V$ <em>such that</em> </p>
<p> $$
 \bold v + (−\bold v) = 0\ \ \forall \bold v\in V
 $$</p>
</li>
<li><p>$V$에 속하는 모든 벡터에 대해 분배법칙이 만족 ($c$는 상수)</p>
<p>  $$
  c(\bold u + \bold v) = c\bold u + c\bold v\ \ ∀\bold u, \bold v ∈ V
  $$</p>
</li>
<li><p>$V$에 속하는 모든 벡터에 대해 다음을 만족</p>
<p>  $$
  1 · \bold v = \bold v\ \ \forall \bold v \in V
  $$</p>
</li>
<li><p>$V$에 속하는 모든 벡터의 상수곱에 대해 결합법칙이 만족</p>
<p>  $$
  (c_1c_2)\bold v = c_1(c_2\bold v)\ \ \forall \bold v \in V
  $$</p>
</li>
<li><p>$V$에 속하는 모든 벡터의 상수연산에 대해 분배법칙이 만족</p>
<p>  $$
  (c_1 + c_2)\bold v = c_1\bold v + c_2\bold v\ \ \forall \bold v \in V
  $$</p>
</li>
</ul>
<br>

<h3 id="definition-of-subspace">Definition of Subspace</h3>
<blockquote>
<p><strong>vector space</strong> $V$의 부분공간(집합*) $S$가 다음 2개의 조건을 만족할 때, $S$를 Subspace라고 한다.</p>
</blockquote>
<p>$S$에 속하는 벡터 $\bold v, \bold w$ 에 대해 다음을 만족 ($c$는 상수)</p>
<ol>
<li><p>더하기 연산에 대해 “닫혀있다.”*</p>
<p> $$
 \bold v + \bold w ∈ S
 $$</p>
</li>
<li><p>scailing 연산에 대해 “닫혀있다.”</p>
<p> $$
 c \bold v ∈ S
 $$</p>
</li>
</ol>
<p>→ 즉, <strong>subspace</strong> $S$는 linear combination*에 대하여 닫혀있다.(closed under)</p>
<ul>
<li>닫혀있다? (closed under)<br>$S$에 속하는 벡터에 연산을 진행하더라도, 연산을 진행한 결과 벡터가 여전히 부분공간 $S$안에 존재한다. </li>
</ul>
<ul>
<li><p>liner combination : 선형결합</p>
<p>  $$
  \forall \bold{v, w}\in S\ \rightarrow \ \ c\bold v+ d \bold w \in S\ \ (\forall c, d\in \mathbb R)
  $$</p>
</li>
</ul>
<ul>
<li>subspace와 subset의 차이점<ul>
<li>subset : 단순히 전체집합의 일정 원소를 갖는 부분집합</li>
<li>subspace : subset이 어떤 <strong>특정 조건을 만족</strong>해야함</li>
</ul>
</li>
</ul>
<br>

<h3 id="subspace인지-아닌지-확인하는-방법"><strong>Subspace인지 아닌지 확인하는 방법</strong></h3>
<ul>
<li><p>정의를 이용해서 공간 $S$에 속하는 임의의 벡터 $\bold v$와 $\bold w$를 정한뒤, liner combination의 결과가 여전히 $S$ 안에 존재하는 것을 보인다.</p>
</li>
<li><p>이때, 어떤 벡터공간의 subspace인지를 정하는 것은 벡터의 차원이 결정한다.  </p>
</li>
<li><p>ex)* 2차원 벡터이면 2차원 벡터공간($\mathbb R^2$)의 subspace</p>
<p>  $$
  \begin{bmatrix} 1 \ 1 \end{bmatrix} \rightarrow \mathbb R^2
  $$</p>
</li>
<li><p><em>예시</em></p>
</li>
</ul>
<ol>
<li><p>다음 집합이 어떤 벡터공간의 Subspace인지를 확인하여라.</p>
<p>  $$</p>
<pre><code> \left\{ c  \begin{bmatrix} 1 \\1    \end{bmatrix},\ \forall c\in\mathbb R \right\}</code></pre><p> $$</p>
<p>  → 위 집합은 $[1,\ 1]^T$ 벡터의 모든 scalar multiplication(=scailing)들의 집합을 의미한다.<br> a. 어떤 벡터 $\forall \bold{v, w}\in S$를 정의</p>
<p>  $$</p>
<pre><code>     \forall \bold v, \bold w \in S,\ \ \forall a,b\in\mathbb R\\\ \\\bold v=a\begin{bmatrix} 1 \\1    \end{bmatrix},\bold w=\ b\begin{bmatrix} 1 \\1    \end{bmatrix}</code></pre><p>   $$</p>
<p>  b. liner combination의 결과가 여전히 $S$ 안에 존재함을 보임</p>
<p>  $$</p>
<pre><code>     c\bold v + d \bold w =ca\begin{bmatrix} 1 \\1    \end{bmatrix} + d b\begin{bmatrix} 1 \\1    \end{bmatrix}\\\ \\ = (ca+db)\begin{bmatrix} 1 \\1    \end{bmatrix} \in S</code></pre><p>   $$</p>
</li>
</ol>
<p>  따라서 $S$는 $\mathbb R^2$의 subspace이다.  </p>
<ol start="2">
<li><p>다음 집합이 어떤 벡터공간의 Subspace인지를 확인하여라.</p>
<pre><code>$$
 \left\{ c  \begin{bmatrix} 1 \\1    \end{bmatrix} +  d  \begin{bmatrix} 2 \\3    \end{bmatrix},\ \forall c,d\in\mathbb R \right\}
$$

→ 위 집합은 $[1,\ 1]^T$ 벡터와 $[2,\ 3]^T$벡터의 모든 linear combination들의 집합을 의미한다.
 a. 어떤 벡터 $\forall \bold{v, w}\in S$를 정의</code></pre><p>   $$</p>
<pre><code>     \forall \bold v, \bold w \in S,\ \ \forall a_1,a_2,b_1,b_2\in\mathbb R\\\ \\\bold v=a_1\begin{bmatrix} 1 \\1    \end{bmatrix}+a_2\begin{bmatrix} 2 \\3    \end{bmatrix},\bold w=\ b_1\begin{bmatrix} 1 \\1    \end{bmatrix}+ b_2\begin{bmatrix} 2 \\3   \end{bmatrix}
     $$</code></pre><p>   b. liner combination의 결과가 여전히 $S$ 안에 존재함을 보임</p>
<p>   $$</p>
<pre><code>     c\bold v + d \bold w =ca_1\begin{bmatrix} 1 \\1    \end{bmatrix}+ca_2\begin{bmatrix} 2 \\3    \end{bmatrix}+d b_1\begin{bmatrix} 1 \\1    \end{bmatrix}+ db_2\begin{bmatrix} 2 \\3   \end{bmatrix}\\\ \\ = (ca_1+db_1)\begin{bmatrix} 1 \\1    \end{bmatrix}+(ca_2+db_2)\begin{bmatrix} 2 \\3 \end{bmatrix} \in S
     $$</code></pre></li>
</ol>
<pre><code>따라서 $S$는 $\mathbb R^2$의 subspace이다.</code></pre><br>


<h3 id="properties-of-subspace">Properties of Subspace</h3>
<ol>
<li><p>subspace에는 0벡터가 반드시 포함되어야한다.</p>
<p> $$
 0 ∈ S
 $$</p>
</li>
<li><p><strong>원점을 지나는 직선은 subspace이다.</strong></p>
<p> (원점을 지난다는 것은 0벡터를 가진다는 의미이기 때문이다.)</p>
</li>
<li><p>$\mathbb R^n$은 자기자신의 subspace이다..</p>
<p> (부분집합 개념이랑 동일함)</p>
</li>
<li><p>$\mathbb R^3$ 공간에서 가능한 subspace는 ${0}$,  $0$을 지나는 직선, $0$을 지나는 평면이다.</p>
</li>
</ol>
<br>

<h1 id="space-of-matrix">Space of Matrix</h1>
<p><em>행렬에 대해 정의되는 4개의 space</em></p>
<h3 id="column-space-ca">Column Space $$C(A)$$</h3>
<blockquote>
<p>행렬 $A$에 있는 모든 <strong>column</strong>에 대한 liner combination의 집합</p>
</blockquote>
<p>$$
C(A) = {A \bold x : ∀ \bold x}
$$</p>
<p> <em>x벡터의 각 요소가 A의 column에 곱해지는 <strong>상수값</strong>(scailing)으로 생각</em></p>
<ul>
<li><p>column space의 표현 예시</p>
<p>  $$
  \bold x = \begin{bmatrix} x_1 \ x_2 \end{bmatrix},\ \ A=\begin{bmatrix} 1 &amp; 0 \ 0 &amp; 1\end{bmatrix}= \begin{bmatrix} \bold{a_1}\ \ \bold{a_2}\end{bmatrix}
  $$</p>
<p>  $$
  A\bold x= x_1\bold{a_1} + x_2\bold {a_2}\\ \ =\left{   \begin{bmatrix} x_1 \x_2    \end{bmatrix} ,\ \forall \bold x \right} = \mathbb R^2
  $$</p>
<p>  → 2차원 벡터공간</p>
<p>  $$
  \bold x = \begin{bmatrix} x_1 \ x_2  \ x_3\end{bmatrix},\ B=\begin{bmatrix} 1 &amp; 2 &amp; 3 \ 1 &amp; 2 &amp; 3\end{bmatrix}= \begin{bmatrix} \bold{b_1}\ \ \bold{b_2}\ \ \bold{b_3}\end{bmatrix}
  $$</p>
<p>  $$
  B\bold x= x_1\bold{b_1} + x_2\bold {b_2}+x_3\bold {b_3}\\ \ =\left{   (x_1+2x_2+3x_3)\begin{bmatrix}1 \1    \end{bmatrix} ,\ \forall \bold x \right} \in \mathbb R^2
  $$</p>
<p>  → 2차원 공간에서 원점을 지나는 한 <strong>직선</strong></p>
</li>
<li><p><em>subspace?</em></p>
<ul>
<li><p>$A$가 $m\times n$ 행렬일 때, $A\bold x$는 $m\times1$인 $m$차원 벡터를 의미한다.</p>
</li>
<li><p>벡터  $\bold x$가 $A$의 오른쪽에 곱해지기 위해서 $\bold x$는 $n$차원 벡터여야만 한다.</p>
<p>  $$
  C(A)=\left{ A\bold x,\ \ \forall \bold x \in \mathbb R^n \right} \sube \mathbb R^m
  $$</p>
</li>
<li><p>따라서 $C(A)$는 $\mathbb R^m$의 subspace이다.</p>
</li>
</ul>
</li>
</ul>
<h3 id="row-space-cat">Row Space $C(A^T)$</h3>
<blockquote>
<p>행렬 $A$에 있는 모든 행에 대한 liner combination 을 모아둔 공간</p>
<p> ↔ $A$의 transpose matrix의 Column space</p>
</blockquote>
<p> <em>x벡터의 각 요소가 A의 row에 곱해지는 <strong>상수값</strong>(scailing)으로 생각</em></p>
<p>$$
R(A) =C(A^{T}) = {A^Tx : ∀ x}
$$</p>
<h3 id="null-space-na-💫">Null Space $$N(A)$$ 💫</h3>
<blockquote>
<p>$A\bold x = 0$을 만족하는 모든 solution vector $\bold x$들을 모아둔 공간</p>
</blockquote>
<p>$$
N(A) = {\bold x : \ A\bold x=0}
$$</p>
<p><em>x벡터의 각 요소가 A의 column에 곱해지는 상수값(scailing)으로 생각</em></p>
<ul>
<li><p><strong>$A$의 역행렬과 Null Space의 관계</strong></p>
<p>  $$
  \exist\ A^{-1} \rightarrow\ N(A) = \left{ \bold 0 \right }
  $$</p>
<p>  → invertible matrix $A$의 Null space는 <strong>0벡터 뿐이다.</strong><br>  <em>Pf)</em></p>
<p>  $$
  A\bold x = 0
  $$</p>
<p>  양변에 $A$의 역행렬을 곱한다. </p>
<p>  $$
  A^{-1}A\bold x = 0
  $$</p>
<p>  역행렬에 정의에 따라 역행렬과 기존행렬의 곱은 항등행렬로 사라지므로,</p>
<p>  $$
  \bold {x}=0
  $$</p>
</li>
<li><p><em>subspace?</em></p>
<ul>
<li><p>$A$가 $m\times n$ 행렬일 때, $A\bold x$는 $m\times1$인 $m$차원 벡터를 의미한다.</p>
</li>
<li><p>벡터  $\bold x$가 $A$의 오른쪽에 곱해지기 위해서 $\bold x$는 $n$차원 벡터여야만 한다.</p>
<p>  $$
  N(A)=\left{ \bold x,\ \ A\bold x =0 \right} \sube \mathbb R^n
  $$</p>
</li>
<li><p>따라서 $\bold x$를 원소로 갖는 집합 $N(A)$는 $\mathbb R^n$의 subspace이다.</p>
</li>
</ul>
</li>
</ul>
<p>+여기에 $A$의 transpose matrix에 대한 NullSpace $N(A^T)$까지 포함하여 4개의 space를 갖는다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[선형대수학] Inverse Matrix & Gauss-Jordan Elimination]]></title>
            <link>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Inverse-Matrix-Gauss-Jordan-Elimination</link>
            <guid>https://velog.io/@webb-c/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Inverse-Matrix-Gauss-Jordan-Elimination</guid>
            <pubDate>Thu, 04 Aug 2022 06:03:46 GMT</pubDate>
            <description><![CDATA[<h1 id="inverse-matrix">Inverse Matrix</h1>
<h3 id="definition-of-inverse-matrix">Definition of Inverse Matrix</h3>
<blockquote>
<p>행렬의 앞/뒤 어디에 곱하든 그 결과가 항등행렬 $I$가 되는 행렬</p>
</blockquote>
<p><em>용어</em></p>
<ul>
<li>invertible, non-singular : 역행렬이 존재하는 행렬</li>
<li>singular : 역행렬이 존재하지 않는 행렬</li>
</ul>
<h3 id="properties-of-inverse-matrix">Properties of Inverse Matrix</h3>
<ol>
<li><p><U>Inverse Matrix는 유일하다. (1개이다)</U>
 <em>증명</em>
a. 만약 행렬 $A$가 역행렬 $B$와 $C$를 가진다고 가정하자.
$$
AB = BA = I,\ \ AC=CA=I
$$</p>
<p>b. $CA=I$의 양변에 $B$를 곱하면,
$$
CAB = B 
$$</p>
<p>c. 이때, a에서 한 가정때문에 $AB=I$이다.
$$
C = B 
$$</p>
<p>d. 역행렬 $B$와 $C$는 동일한 행렬일 수 밖에 없다. 따라서 Inverse Matrix는 유일하다.</p>
</li>
<li><p><U>$n\times n$ 행렬 $A$가 invertible하면 $A$는 $n$개의 <strong>pivot</strong>을 가진다.</U><br>↔️  $n\times n$ 행렬 $A$가 $n$개의 <strong>pivot</strong>을 가지면 $A$는 invertible matrix이다.
<em>증명</em>
a. $n\times n$ 행렬 $A$가 $n$개의 <strong>pivot</strong>을 가지면, Gauss Elimination을 이용하여 $A$를 row echelon form matrix으로 나타낼 수 있다.</p>
<pre><code> *ex)* $2\times2$ 행렬을 G.E하여 pivot $1, -4$ 2개를 가지는 row echelon form으로 변환했다.</code></pre><p>$$
\begin{bmatrix}
1 &amp; 2 \
3 &amp; 2
\end{bmatrix} \rightarrow^{G.E} \begin{bmatrix}
\color{blue}1 &amp; 2 \
0 &amp; \color{blue}-4
\end{bmatrix}
$$</p>
<p>b. 따라서 $Ax=b$는 <U>무조건 해을 가지므로</U> 해를 구하기 위해서 수식을 변형시키면 다음과 같다.
$$
x = A^{-1}b
$$
c. 따라서 행렬 $A$는 invertible matrix이다.  </p>
</li>
</ol>
<ol start="3">
<li><p><U>$L$: Low transform matrix(or $U$: Upper transform matrix)이 invertible matrix라면, 대각성분에 0이 존재하지 않는다.</U><br>↔  대각성분에 0이 없다면 $L$or$U$ 행렬은 invertible matrix이다.   </p>
<p>: pivot이 n개 존재하기 위해서는 0인 성분을 가져서는 안된다. (2번 성질과 동일한 의미)</p>
</li>
<li><p><U>Digonal Matrix: 대각행렬 $A$의 대각성분 중에서 0이 1개라도 존재한다면, $A$는 singular matrix이다.</U>
↔️  singular matrix인 Digonal Matirx $A$의 대각성분에는 적어도 0이 1개 이상존재한다.  </p>
<p>: $0$인 원소를 대각성분에 가진다면 <strong>pivot</strong>은 0이 될 수 없기 때문에 $n\times n$ 행렬이 $n$개의 pivot을 가지지 않게 된다. (2번 성질과 동일한 의미)</p>
</li>
<li><p><U>$A$가 역행렬을 가지면 선형방정식 $Ax = b$는  $x = A^{-1}b$인 유일한 해를 가진다.</U> (2번 성질과 동일한 의미)</p>
</li>
<li><p><U>선형방정식 $Ax = 0$에서 $x$가 영벡터가 아니라면, $A$는 singular matrix이다.</U></p>
</li>
</ol>
<p><em>증명</em><br>  a. 일반적인 선형방정식을 풀 때처럼<em>(</em>3번)* 양변에 $A$의 inverse matrix를 곱한다.
$$
x=A^{-1}0
$$<br>  b. $0$이 곱해졌기 떄문에 우변의 결과는 $0$이고, 따라서 좌변은 다음과 같다. 
  $$
  x=0
  $$</p>
<p>  c.  따라서 $A$가 역행렬을 가지면(<strong>a</strong>) $Ax = 0$의 유일한 해는 $x=0$ (영벡터) 이다.
   ↔️   $x≠0$이면, $A$는 역행렬을 가지지 않는다.</p>
<ol start="7">
<li><p>(드모르간의 정리) <U>$n\times n$ 행렬 $A$, $B$가 invertible matrix이면 다음의 식이 만족한다.</U></p>
<p> $$
 (AB)^{-1} = B^{-1}A^{-1}
 $$</p>
<p> <em>증명</em><br> a. 우변에 $AB$를 곱하여 정리한다.</p>
<p>   $$
   AB(B^{-1}A^{-1})=AIA^{-1} = I
   $$</p>
<p> b. 정리한 결과가 항등행렬이므로, inverse matrix의 definition에 따라 성질이 참임을 보일 수 있다.  </p>
</li>
<li><p><U>$2\times 2$ 행렬이 invertible이기 위한 조건 (필요충분)</U></p>
<ul>
<li><p>조건 : <em>행렬식*</em>이 $0$이 아니다.</p>
<p>  $$
  \text{if and only if}\ \ ad-bc \neq 0
  $$</p>
</li>
<li><p>역행렬을 구하는 방법<br>$$
  \begin{bmatrix} a &amp; b \ c &amp; d \end{bmatrix}^{-1} = \frac{1}{ad-bc}\begin{bmatrix} d &amp; -b \ -c &amp; a \end{bmatrix}$$</p>
</li>
</ul>
</li>
</ol>
<pre><code>- *증명*  
  a. $a=0$ 이면, Gauss Elimination 과정에서 1행과 2행을 바꾸면서 $c$와 $b$가 pivot이 된다. pivot과 invertible의 관계에 의해 invertible 이려면 $c≠0, b≠0$  
$$</code></pre><p>  \begin{bmatrix} 0 &amp; b \ c &amp; d \end{bmatrix} \rightarrow^{G.E} \begin{bmatrix}  \color{blue}c &amp; d \  0 &amp; \color{blue}b\end{bmatrix}$$<br>  $$
 \text{if}\ a=0,\ \ c\neq0 \text{ and } b\neq 0$$</p>
<p>   b. $a\neq0$ 이면, Gauss Elimination의 결과에 따라  $a$와 $d-{cb\over a}$가 pivot이 된다. pivot과 invertible의 관계에 의해 invertible이려면 $d-{cb\over a}\neq0 \rightarrow ad-cb \neq0$<br>   $$
    \begin{bmatrix} a &amp; b \ c &amp; d \end{bmatrix} \rightarrow^{G.E} \begin{bmatrix}  \color{blue}a &amp; b\  0 &amp; \color{blue}{d-\frac{cb}{a}}\end{bmatrix}$$
  $$
      \text{if}\ a\neq0,\ \ ad-cb \neq0
  $$</p>
<br>

<h1 id="gauss-jordan-elimination">Gauss-Jordan Elimination</h1>
<h3 id="gauss-elimination의-한계">Gauss Elimination의 한계</h3>
<blockquote>
<p>Inverse matrix의 성질에 따라, $<strong>n\times n$ 행렬이 $n$개의 pivot을 가지면 Invertible</strong>하다는 것을 알 수 있다.</p>
</blockquote>
<p>따라서 Gauss Elimination을 이용하여 행렬을 row echelon form으로 변환하고 pivot의 수를 세서 Invertible한지 아닌지를 알아낼 수 있다. 그러나 inverse matrix를 구하기 위해서 Gauss Elimination을 진행하기에는 <strong>계산량이 너무 과하다. $O(n^2)$</strong></p>
<h3 id="gauss-jordan-elimination-1">Gauss-Jordan elimination</h3>
<p>Gauss-Jordan elimination은 일반적인 Gauss elimination과 크게 다르지 않지만, 행렬의 inverse matrix를 더 쉽게 구할 수 있도록 해준다.</p>
<blockquote>
<p>행렬과 inverse matrix를 곱한 결과인 <U>항등행렬 $I$의 각 열을 만드는 inverse matrix의 각 열 벡터</U>를 계산하는 아이디어.</p>
</blockquote>
<p><em>과정 (in $3\times 3$ matrix)</em></p>
<p>$$
AA^{-1} = I
$$</p>
<ol>
<li><p>inverse matrix를 모르는 상태이므로 임의의 요소로 행렬을 만든다.</p>
</li>
<li><p>inverse matrix의 각 열을 <strong>하나의 열 벡터</strong>로 취급하여 표현한다. </p>
<p> $$
 A^{-1} = \begin{bmatrix} x_1 &amp; y_1 &amp; z_1 \ x_2 &amp; y_2 &amp; z_2\ x_3 &amp; y_3 &amp; z_3 \end{bmatrix} = \begin{bmatrix} \bold{x} &amp; \bold{y} &amp; \bold{z} \end{bmatrix}
 $$</p>
</li>
<li><p>이렇게 표현한 행렬을 이용하면, $AA^{-1}$을 다음과 같은 수식으로 표현할 수 있다.</p>
<p> $$
 AA^{-1} = \begin{bmatrix} A\bold{x} &amp; A\bold{y} &amp; A\bold{z} \end{bmatrix}=I
 $$</p>
</li>
<li><p>항등행렬의 각 열을 $\bold{e_1, e_2, e_3}$으로 두면, 다래와 같은 3개의 방정식을 만들어낼 수 있다.</p>
<p> $$
 I = \begin{bmatrix} 1 &amp; 0 &amp; 0 \ 0&amp; 1 &amp; 0\ 0 &amp; 0 &amp; 1 \end{bmatrix} = \begin{bmatrix} \bold{e_1} &amp; \bold{e_2} &amp; \bold{e_3} \end{bmatrix}
 $$</p>
<p> $$
  A\bold{x} = \bold{e_1}\
  A\bold{y} = \bold{e_2}\
  A\bold{z} = \bold{e_3}\
 $$</p>
</li>
<li><p>이는 연립방정식의 형태와 크게 다르지 않기에, 3개의 방정식을 한번에 표현하여 Gauss Elimintation을 진행하여 <strong>Digonal Matrix</strong>를 만든다. </p>
<p> *일반적인 Gauss Elimination과 다른점은 위로도 행 소거연산이 가능하다.<br> $$
 \left[\begin{array}{c|ccc}A &amp; \bold{e_1} &amp; \bold{e_2} &amp; \bold{e_3} \end{array}\right]
 $$</p>
</li>
<li><p>elimination이 끝나면 <strong>$A$가 항등행렬로 표현될 수 있게</strong> pivot이 1이 되도록 행마다 상수곱을 해준다.</p>
<p> → 즉, Elimination을 끝낸 $A$행렬이 항등행렬이 된다. </p>
</li>
<li><p>$A\bold{x} = \bold{e_1}$가 $I\bold{x} = A^{-1}$의 첫번째 열이 된다.</p>
<p> → 즉, Elimination을 끝낸 $\begin{bmatrix} \bold{e_1} &amp; \bold{e_2} &amp; \bold{e_3} \end{bmatrix}$ 행렬이 Inverse matrix가 된다.</p>
<p> $$
 [A|I] \rightarrow^{G-J} [I|A^{-1}]
 $$</p>
</li>
</ol>
<p><em>G-J</em> 과정을 거쳐 $A$를 항등행렬로 표현하는 과정은, 역행렬 $A^{-1}$을 곱한 결과와 동일하기 때문에 $A$와 함께 표현된 항등행렬$I$에 $A^{-1}$이 곱해졌다고 생각하면 $A^{-1}$을 얻을 수 있다. </p>
<h3 id="gauss-jordan-elimination-example">Gauss-Jordan elimination Example.</h3>
<p>$$
A=\begin{bmatrix}2 &amp; -1 &amp; 0 \ -1 &amp; 2 &amp; -1 \ 0 &amp; -1 &amp; 2 \end{bmatrix}
$$</p>
<ol>
<li><p><em>augmentend matrix form</em></p>
<p> $$
 \left[\begin{array}{ccc|ccc}2 &amp; -1 &amp; 0 &amp; 1 &amp; 0 &amp; 0 \ -1 &amp; 2 &amp; -1 &amp; 0 &amp; 1 &amp; 0 \ 0 &amp; -1 &amp; 2  &amp; 0 &amp; 0 &amp; 1 \end{array}\right] 
 $$</p>
</li>
<li><p>Gauss-Jordan Elimination</p>
<p> $$
 \rightarrow^{G.E}\left[\begin{array}{ccc|ccc}2 &amp; -1 &amp; 0 &amp; 1 &amp; 0 &amp; 0 \ 0 &amp; \frac{3}{2} &amp; -1 &amp; \frac{1}{2} &amp; 1 &amp; 0 \ 0 &amp; -1 &amp; 2  &amp; 0 &amp; 0 &amp; 1 \end{array}\right]\ \rightarrow^{G.E}\left[\begin{array}{ccc|ccc}2 &amp; -1 &amp; 0 &amp; 1 &amp; 0 &amp; 0 \ 0 &amp; \frac{3}{2} &amp; -1 &amp; \frac{1}{2} &amp; 1 &amp; 0 \ 0 &amp; 0 &amp; \frac{4}{3}  &amp; \frac{1}{3} &amp; \frac{2}{3} &amp; 1 \end{array}\right]
 $$</p>
<p> <strong>G.E <em>*upward</em></strong></p>
<p> $$
 \rightarrow^{G.E\ up}\left[\begin{array}{ccc|ccc}2 &amp; -1 &amp; 0 &amp; 1 &amp; 0 &amp; 0 \ 0 &amp; \frac{3}{2} &amp; 0 &amp; \frac{3}{4} &amp; \frac{3}{2} &amp; \frac{3}{4} \ 0 &amp; 0 &amp; \frac{4}{3}  &amp; \frac{1}{3} &amp; \frac{2}{3} &amp; 1 \end{array}\right]\ \rightarrow^{G.E\ up}\left[\begin{array}{ccc|ccc}2 &amp; 0 &amp; 0 &amp; \frac{2}{3} &amp; 1 &amp; \frac{1}{2} \ 0 &amp; \frac{3}{2} &amp; 0 &amp; \frac{3}{4} &amp; \frac{3}{2} &amp; \frac{3}{4} \ 0 &amp; 0 &amp; \frac{4}{3}  &amp; \frac{1}{3} &amp; \frac{2}{3} &amp; 1 \end{array}\right]
 $$</p>
</li>
<li><p>Scaliling</p>
<p> $$
 \left[\begin{array}{ccc|ccc}1 &amp; 0 &amp; 0 &amp; \frac{3}{4} &amp; \frac{1}{2} &amp; \frac{1}{4} \ 0 &amp; 1 &amp; 0 &amp; \frac{1}{2} &amp; 1 &amp; \frac{1}{2} \ 0 &amp; 0 &amp; 1  &amp; \frac{1}{4} &amp; \frac{1}{2} &amp; \frac{3}{4} \end{array}\right]
 $$</p>
</li>
</ol>
<p>역행렬을 갖지 않는 행렬에 Gauss-Jordan elimination을 적용하면 <strong>breakdown</strong>이 일어나서 해가 존재하지 않는다.</p>
<p>→ 역행렬이 존재하지 않음을 알 수 있다.</p>
]]></description>
        </item>
    </channel>
</rss>