<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://ysr-plus-ultra.pages.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://ysr-plus-ultra.pages.dev/" rel="alternate" type="text/html" /><updated>2026-07-16T09:42:53+00:00</updated><id>https://ysr-plus-ultra.pages.dev/feed.xml</id><title type="html">Yoon, S</title><subtitle>Plus Ultra.</subtitle><author><name>Yoon, Suro</name></author><entry><title type="html">IPinside 무한 반복 오류</title><link href="https://ysr-plus-ultra.pages.dev/tech/2026/03/02/tech.html" rel="alternate" type="text/html" title="IPinside 무한 반복 오류" /><published>2026-03-02T00:00:00+00:00</published><updated>2026-03-02T00:00:00+00:00</updated><id>https://ysr-plus-ultra.pages.dev/tech/2026/03/02/tech</id><content type="html" xml:base="https://ysr-plus-ultra.pages.dev/tech/2026/03/02/tech.html"><![CDATA[<h1 id="이런-경우">이런 경우</h1>

<ul>
  <li>User data 폴더의 드라이브(D:)와 기본 Program Files 폴더가 있는 드라이브(C:)가 다른 경우</li>
</ul>

<h1 id="증상">증상</h1>

<ul>
  <li>
    <p>홈택스에서 IPinside 설치 했음에도 설치해달라고 뜸</p>
  </li>
  <li>
    <p>설치 확인 페이지에서는 ‘설치됨’으로 표시</p>
  </li>
  <li>
    <p>F12로 관리자 콘솔에서 웹소켓(wss) 21400 포트에서 에러 뜸</p>
  </li>
  <li>
    <p><strong>해결 : C드라이브에서 설치되는 장소에 심볼릭 링크로 Userdata가 있는 드라이브와 같은 장소에 바로가기 처리</strong></p>
  </li>
</ul>

<h1 id="어케했노">어케했노?</h1>

<ul>
  <li>
    <p>아니 홈택스에서 사업자 신고하려는데 자꾸 IPinside 설치해달라고 떠서 사실 한 2개월 전부터 다른 컴퓨터 쓰거나 해서 처리하고 있었음.</p>
  </li>
  <li>
    <p>근데 우연히 LocalLow 폴더에서 설치 로그가 있는데 Failed로 뜬 부분이 있어서 제미나이 한테 물어봄</p>
  </li>
</ul>

<blockquote>
  <p>rename failed [17] - 장치 다름 (ERROR_NOT_SAME_DEVICE)</p>

  <p>발생 지점: WorkCertsVer2 함수에서 인증서 파일(ik.opt 등)의 이름을 바꾸려 할 때</p>

  <p>내용: 오류코드 [17]이 발생했습니다.</p>

  <p>분석: 로그를 보면 원본은 C: 드라이브에 있고, 대상 경로는 D:{Userdata}...로 서로 다른 드라이브(파티션)입니다.</p>

  <p>Windows의 rename (또는 MoveFile) API는 서로 다른 볼륨 간의 이름 변경을 지원하지 않습니다.</p>
</blockquote>

<ul>
  <li>이걸로 눈치채고 C의 IPinside가 설치되는 지점에 D드라이브로 심볼릭 링크로 처리해서 성공!</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mklink /d "C:\Program Files (x86)\IPinside_LWS" "D드라이브경로"
</code></pre></div></div>

<p>이런식으로 처리해주면 된다.</p>]]></content><author><name>Yoon, Suro</name></author><category term="Tech" /><summary type="html"><![CDATA[홈택스 & 금융사 ipsinde 무한반복 뜰때]]></summary></entry><entry><title type="html">2026 신년 계획</title><link href="https://ysr-plus-ultra.pages.dev/diary/2026/02/17/post.html" rel="alternate" type="text/html" title="2026 신년 계획" /><published>2026-02-17T00:00:00+00:00</published><updated>2026-02-17T00:00:00+00:00</updated><id>https://ysr-plus-ultra.pages.dev/diary/2026/02/17/post</id><content type="html" xml:base="https://ysr-plus-ultra.pages.dev/diary/2026/02/17/post.html"><![CDATA[<hr />
<p>[1]</p>

<p>오랜만에 편집하면서 예전 글들을 읽어봤는데 얘는 대체 이불킥을 몇번이나 했을까?</p>

<p>[2]</p>

<p>2026년은 제가 하고 싶은걸 할 예정입니다.</p>

<p>법인 설립 절차에 관해선 나중에 한번에 업로드 할 예정!</p>]]></content><author><name>Yoon, Suro</name></author><category term="Diary" /><category term="diary" /><summary type="html"><![CDATA[[1] 오랜만에 편집하면서 예전 글들을 읽어봤는데 얘는 대체 이불킥을 몇번이나 했을까? [2] 2026년은 제가 하고 싶은걸 할 예정입니다. 법인 설립 절차에 관해선 나중에 한번에 업로드 할 예정!]]></summary></entry><entry><title type="html">2025 AWS Summit Seoul</title><link href="https://ysr-plus-ultra.pages.dev/tech/2025/05/19/aws.html" rel="alternate" type="text/html" title="2025 AWS Summit Seoul" /><published>2025-05-19T00:00:00+00:00</published><updated>2025-05-19T00:00:00+00:00</updated><id>https://ysr-plus-ultra.pages.dev/tech/2025/05/19/aws</id><content type="html" xml:base="https://ysr-plus-ultra.pages.dev/tech/2025/05/19/aws.html"><![CDATA[<h1 id="2025-05-19-aws-summit-seoul-2025">2025-05-19 AWS summit Seoul 2025</h1>

<h1 id="요약">요약</h1>

<ul>
  <li>1일째는 AWS의 주요 고객들이 본인들의 문제에 적용시킨 케이스 스터디에 가까웠다면, 2일째는 AWS에서 제공하는 기술들의 소개에 가까운 세션이었음.</li>
  <li>전체적으로 중·장기간 데이터의 수집이 완료된 기업들을 대상으로 수집된 데이터의 활용 방법과 차후에 입수되는 데이터들을 어떻게 효율적으로 관리할지 설명하는 내용이 많았으며, 데이터 입수를 담당하는 데이터 엔지니어부터 고객과 가장 가까운 마케팅까지 Python 혹은 SQL에 대한 이해를 가지고 있다는 전제가 깔려있었음.</li>
  <li>이하, 각 세션 내용 요약
    <ul>
      <li>첫 번째 세션은 새롭게 리뉴얼된 AWS의 SageMaker 기능을 설명하고, 데이터 분석 솔루션을 제공하는 고객사에서 어떻게 활용할 수 있을지 설명하였음.</li>
      <li>두 번째 세션은 최근 화제인 MCP에 대한 소개와 LLM이 웹사이트를 읽고 쓰는 등의 기능을 탑재한 MCP 앱을 이용한 실제 워크플로우에 대한 데모가 이어졌다. 추가적으로 구글에서 발표한 A2A와의 차이점 등이 다루어졌다.</li>
      <li>세 번째 세션에선 기존에 API로 서비스되고 있는 LLM 서비스에 비해 AWS를 이용한 로컬 LLM을 가짐으로써 안정적인 서비스와 모니터링이 가능해진다는 점을 언급하고, AWS에서 자체 개발한 easy-model-deploy를 이용해 신속하게 LLM 서비스를 생성하는 방법을 소개하였다.</li>
      <li>마지막 세션에선 LLM이 발전함에 따라 대용량 데이터를 가공하여 LLM에 데이터를 제공하기 위한 방법론에 대한 설명을 하였다.</li>
    </ul>
  </li>
</ul>

<hr />

<h1 id="데이터에서-대규모-성과로">데이터에서 대규모 성과로</h1>

<ul>
  <li>쌓아둔 데이터를 AI에 적용 시 고려해야 할 사항들</li>
</ul>

<h2 id="sagemaker">SageMaker</h2>

<ul>
  <li>Unified Studio 출시:
    <ul>
      <li>기존 모델 개발: Amazon SageMaker AI로 변경</li>
      <li>단일화된 서비스 페이지에서 데이터 및 AI 모델을 탐색</li>
    </ul>
  </li>
  <li>증가하는 데이터 용량에 따라 효율적으로 처리하기 위한 SageMaker를 이용한 데이터레이크 구성 방법</li>
  <li>특이사항: Iceberg의 OpenAPI 규격에 완벽하게 대응</li>
</ul>

<h2 id="데이터-분석">데이터 분석</h2>

<ul>
  <li>RAG, MCP 등 다양한 생성형 솔루션을 사용하기 위해선 데이터에 관한 설명 등 메타데이터(컨텍스트)가 중요해짐</li>
  <li>컨텍스트에는 단순히 데이터의 상세 정보뿐만 아니라 BM과 관련된 컨텍스트를 제공</li>
</ul>

<table>
  <thead>
    <tr>
      <th>구분</th>
      <th>데이터레이크 (Data Lake)</th>
      <th>데이터 웨어하우스 (Data Warehouse)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>데이터 형태</strong></td>
      <td>정형, 반정형, 비정형 모두 (예: 로그, JSON, 이미지, 동영상 등)</td>
      <td>주로 정형 데이터 (SQL 테이블 형식)</td>
    </tr>
    <tr>
      <td><strong>스키마 구조</strong></td>
      <td><strong>스키마 온 리드(Schema-on-read)</strong>→ 읽을 때 해석</td>
      <td><strong>스키마 온 라이트(Schema-on-write)</strong>→ 저장 전에 구조 정함</td>
    </tr>
    <tr>
      <td><strong>데이터 저장소</strong></td>
      <td>주로 저비용의 객체 스토리지 사용 (예: AWS S3)</td>
      <td>고성능 RDBMS 기반 스토리지</td>
    </tr>
    <tr>
      <td><strong>처리 속도</strong></td>
      <td>대용량 저장에 최적화, 실시간 분석은 상대적으로 느릴 수 있음</td>
      <td>빠른 질의 처리에 최적화</td>
    </tr>
    <tr>
      <td><strong>사용 목적</strong></td>
      <td>데이터 과학, 머신러닝, 원시 데이터 저장</td>
      <td>비즈니스 인텔리전스(BI), 리포팅</td>
    </tr>
    <tr>
      <td><strong>비용</strong></td>
      <td>저장 비용이 상대적으로 저렴</td>
      <td>저장/운영 비용이 높을 수 있음</td>
    </tr>
  </tbody>
</table>

<h2 id="데모">데모</h2>

<p>데이터 관련 직군 업무 구분</p>

<ul>
  <li>데이터 엔지니어: 데이터 소스를 다양하게 구비해서 팀원들이 쉽게 사용할 수 있도록 만드는 업무</li>
  <li>데이터 과학자: 데이터로부터 인사이트를 도출해서 AI 모델을 만드는 업무</li>
</ul>

<hr />

<h1 id="mcp로-진화하는-ai-기술의-게임체인저">MCP로 진화하는 AI 기술의 게임체인저</h1>

<h2 id="aws에서-mcp-활용하기">AWS에서 MCP 활용하기</h2>

<ul>
  <li>MCP는 외부 앱, 데이터 소스 등이 AI 모델과 연결 및 상호 작용하여 정보를 얻거나 기능을 수행하는 표준형 프로토콜</li>
  <li>앱을 MCP 서버와 연결하고 MCP 서버를 LLM과 연결</li>
  <li>장점
    <ul>
      <li>쉽고 원활한 통합</li>
      <li>실시간 데이터 접근 유리</li>
      <li>표준화된 워크플로우</li>
    </ul>
  </li>
  <li>단점
    <ul>
      <li>아키텍처 복잡성</li>
      <li>초기 개발 가중</li>
      <li>호환성 이슈</li>
    </ul>
  </li>
</ul>

<h2 id="데모-1">데모</h2>

<p><strong>주어진 URL들을 읽고 핵심 내용을 800자 이내로 요약해줘</strong></p>

<ul>
  <li>LLM이 요청에 대해서 MCP 등록된 Tool을 사용할지 결정</li>
  <li>사용하기로 한 툴 요청을 MCP 서버로 보냄</li>
  <li>MCP 서버가 연결된 앱을 실행하고, 결과를 사용자에게 보냄
    <ul>
      <li>툴 요청에 필요한 변수들의 설정 방법 등을 규정하여 원활한 상호 작용을 구현</li>
    </ul>
  </li>
</ul>

<h2 id="최근-트렌드mcp와-a2a">최근 트렌드(MCP와 A2A)</h2>

<h3 id="mcp와-a2a의-차이">MCP와 A2A의 차이</h3>

<ul>
  <li>A2A는 좀 더 에이전트 간의 커뮤니케이션에 집중</li>
  <li>상호 보완적으로 발전하리라 예상됨</li>
</ul>

<hr />

<h1 id="zero-to-hero-클릭-몇-번으로-완성하는-aiml-on-amazon-ecs">Zero to Hero: 클릭 몇 번으로 완성하는 AI/ML on Amazon ECS</h1>

<h2 id="인공지능과-머신러닝을-활용한-애플리케이션의-도전과제">인공지능과 머신러닝을 활용한 애플리케이션의 도전과제</h2>

<ul>
  <li>유연성: 다양한 모델을 선택 가능해야 하고, 태스크의 요구에 따라 라이브러리를 선택</li>
  <li>신뢰성: 고객이 원하는 일관된 답변</li>
  <li>성능: 태스크에서 충족하는 답변 속도를 만족시켜야 함</li>
  <li>확장성: 트래픽에 맞게 스케일링하면서 비용을 조절할 수 있어야 함</li>
  <li>관찰가능성: 로깅 및 모니터링을 통해서 리스크를 관리할 수 있어야 함</li>
  <li>비용</li>
</ul>

<h2 id="아키텍처-고려사항-ecs의-장점">아키텍처 고려사항: ECS의 장점</h2>

<ul>
  <li>모델 앱 분리
    <ul>
      <li>마이크로서비스와 같이 구성</li>
      <li>기술 선택의 유연성 확보, 독립적인 스케일링, 전문성 확보</li>
    </ul>
  </li>
  <li>모델 구성 방법
    <ul>
      <li>동기식
        <ul>
          <li>장점: 간단, fail fast</li>
          <li>단점: 쓰로틀링, 운영 복잡성, 탄력 회복성</li>
        </ul>
      </li>
      <li>비동기식
        <ul>
          <li>API Gateway → 로드 밸런싱</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Amazon ECS 기반 생성형 AI 애플리케이션 빌드</li>
  <li>데모
    <ul>
      <li>easy model deploy(<a href="https://github.com/aws-samples/easy-model-deployer">https://github.com/aws-samples/easy-model-deployer</a>)</li>
      <li>aws api키를 제공하는 것만으로 다양한 설정을 자동으로 해주고 openai api호환의 LLM서버를 생성해줌</li>
      <li>공짜 아님</li>
    </ul>
  </li>
</ul>

<hr />

<h1 id="생성형-ai-시대의-데이터-파운데이션-데이터에서-지능으로-혁신을-만드는-게임-체인저">생성형 AI 시대의 데이터 파운데이션: 데이터에서 지능으로, 혁신을 만드는 게임 체인저</h1>

<h2 id="데이터-파운데이션-이해">데이터 파운데이션 이해</h2>

<ul>
  <li>WHAT: 조직 차원의 데이터 전략</li>
  <li>WHO: 조직의 데이터와 데이터 실무자 중심</li>
  <li>WHY: 빠르고 신뢰할 수 있는 데이터 기반의 의사결정</li>
  <li>HOW: 포괄적, 통합적, 체계적으로 관리되는 도구와 솔루션</li>
</ul>

<h2 id="aws-데이터-파운데이션">AWS 데이터 파운데이션</h2>

<ul>
  <li>비즈니스
    <ul>
      <li>데이터 신뢰성</li>
      <li>데이터 수익화</li>
      <li>데이터 적용 가속화</li>
      <li>유연한 비즈니스 전환</li>
    </ul>
  </li>
  <li>기술
    <ul>
      <li>검색 발견 용이</li>
      <li>접근성 강화</li>
      <li>상호운용성 확대</li>
      <li>재사용성 증대</li>
    </ul>
  </li>
</ul>

<h2 id="생성형-ai와-aws의-데이터-파운데이션">생성형 AI와 AWS의 데이터 파운데이션</h2>

<ul>
  <li>생성형 AI
    <ul>
      <li>(어려움) → 자체 모델 사전 훈련 → 지속적인 사전 훈련 → 미세 조정 → RAG → (쉬움)</li>
    </ul>
  </li>
  <li>데이터 = 지속적인 차별화의 핵심 요소</li>
</ul>

<h2 id="데모-amazon-finance-automate">데모: Amazon Finance Automate</h2>

<ul>
  <li>FinOps
    <ul>
      <li>공급업체, 직원에게 대금 지급</li>
      <li>고객으로부터 적기에 대금 회수</li>
      <li>모든 금융 거래에 대한 통제 및 보안</li>
    </ul>
  </li>
  <li>진화하는 AWS 데이터 파운데이션
    <ul>
      <li>아마존 OpenSearch
        <ul>
          <li>재무 문서 데이터베이스화 (S3, OpenSearch) Knowledge Base 구성</li>
          <li>재무 문제에 대한 컨텍스트를 구현하여 LLM과의 상호 작용을 컨트롤할 수 있도록 구성</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>]]></content><author><name>Yoon, Suro</name></author><category term="Tech" /><summary type="html"><![CDATA[2025 AWS Summit Seoul 리뷰]]></summary></entry><entry><title type="html">gymnasium obs_space errors</title><link href="https://ysr-plus-ultra.pages.dev/tech/2024/07/27/diary.html" rel="alternate" type="text/html" title="gymnasium obs_space errors" /><published>2024-07-27T00:00:00+00:00</published><updated>2024-07-27T00:00:00+00:00</updated><id>https://ysr-plus-ultra.pages.dev/tech/2024/07/27/diary</id><content type="html" xml:base="https://ysr-plus-ultra.pages.dev/tech/2024/07/27/diary.html"><![CDATA[<h1 id="gymnasium-쓰기-어렵다-어려워">gymnasium 쓰기 어렵다 어려워</h1>

<ol>
  <li>
    <p>keyword</p>

    <p>gym, gymnasium, pytorch, ray, rllib</p>
  </li>
  <li>
    <p>싱글 에이전트 기준</p>

    <ul>
      <li>가위바위보나 스타크래프트 같은 맞짱까는 형태의 멀티 에이전트에선 어떻게 되는지 확인 안해봄</li>
    </ul>
  </li>
  <li>
    <p>사실 전부 RTFM 얘기라서 특별한 내용은 아니다.</p>
  </li>
</ol>

<h2 id="1-array123-dtypefloat32-은-array123-dtypefloat32-과-다르다">1. array(123, dtype=float32) 은 array([123], dtype=float32) 과 다르다</h2>

<p>당연한 얘기지만 array(123) 은 0d array (value only) 이고, array([123])은 1d array이다.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">array</span><span class="p">(</span><span class="mi">123</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="c1"># error
</span></code></pre></div></div>

<p>고로 gym(=gymnasium)에서 space를 설정할때에</p>

<p>Box(low=0.0, high=1.0, shape=(), dtype=np.float32)</p>

<p>Box(low=0.0, high=1.0, shape=(1,), dtype=np.float32) 는 다르다.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">__init__</span><span class="p">(...):</span>
<span class="n">observation_space</span> <span class="o">=</span> <span class="n">Box</span><span class="p">(</span><span class="n">low</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">high</span><span class="o">=</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="p">.</span><span class="n">float32</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">reset</span><span class="p">(...):</span>
    <span class="k">return</span> <span class="n">state</span><span class="p">,</span> <span class="n">info</span>
</code></pre></div></div>

<p>obs가 (1, ) 라면 state로는 array([123])을 받아야한다</p>

<p>obs가 () 라면 state는 array(123)을 받아야한다. (혹은 python float도 가능, 알아서 변환해준다)</p>

<p>이 경우 대충 다음과 같은 에러가 뜬다</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">ValueError</span><span class="p">:</span> <span class="n">Observation</span> <span class="p">()</span> <span class="n">outside</span> <span class="n">given</span> <span class="n">space</span> <span class="p">()</span><span class="err">!</span>
</code></pre></div></div>

<h2 id="2-reward는-0d로-주는게-좋다">2. reward는 0d로 주는게 좋다.</h2>

<p>Task가 멀티 태스크가 아닌경우 reward는 0d로 주는게 좋다. (반박시 내가 틀림)</p>

<p>다음과 같이 3가지 경우를 생각해볼수 있다.</p>

<ol>
  <li>
    <p>1d로 주는 경우</p>

    <ul>
      <li>
        <p>트레이닝시에 에러가 난다.</p>

        <p>대부분 [B, T] 로 배치가 들어오지만 이 경우 [B, T, 1] 으로 들어오는 경우가 생겨서 에러가 뜬다.</p>

        <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">assert</span> <span class="n">rho_rank</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">rewards</span><span class="p">.</span><span class="n">size</span><span class="p">())</span>
     
          <span class="o">^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</span>
     
<span class="nb">AssertionError</span>
</code></pre></div>        </div>
      </li>
    </ul>
  </li>
  <li>
    <p>1d, 0d 쓰까로 주는 경우</p>

    <ul>
      <li>
        <p>길이가 다른 list를 하나의 array로 합치는 경우 처럼 Value error가 뜬다.</p>

        <p>타입을 보면 [<strong>np.float64</strong>, <strong>np.float64</strong>, np.ndarray, np.ndarray, …]</p>

        <p>위와 같이 구성되어 있는 경우에 발생한다.</p>

        <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="n">cache_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">_to_float_np_array</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">.</span><span class="n">buffers</span><span class="p">[</span><span class="n">key</span><span class="p">]]</span>
     
 <span class="nb">ValueError</span><span class="p">:</span> <span class="n">setting</span> <span class="n">an</span> <span class="n">array</span> <span class="n">element</span> <span class="k">with</span> <span class="n">a</span> <span class="n">sequence</span><span class="p">.</span> <span class="n">The</span> <span class="n">requested</span> <span class="n">array</span> <span class="n">has</span> <span class="n">an</span> <span class="n">inhomogeneous</span> <span class="n">shape</span> <span class="n">after</span> <span class="mi">1</span> <span class="n">dimensions</span><span class="p">.</span> <span class="n">The</span> <span class="n">detected</span> <span class="n">shape</span> <span class="n">was</span> <span class="p">()</span> <span class="o">+</span> <span class="n">inhomogeneous</span> <span class="n">part</span><span class="p">.</span>
</code></pre></div>        </div>
      </li>
    </ul>
  </li>
  <li>
    <p>0d로 주는경우</p>

    <ul>
      <li>나는 능지가 후달려서 그냥 0d로 주기로 결정하였다.</li>
    </ul>
  </li>
</ol>]]></content><author><name>Yoon, Suro</name></author><category term="Tech" /><summary type="html"><![CDATA[gymnasium 개삽질]]></summary></entry><entry><title type="html">HP노트북 Windows 11 알림창 반복</title><link href="https://ysr-plus-ultra.pages.dev/tech/2024/05/07/hp_windows.html" rel="alternate" type="text/html" title="HP노트북 Windows 11 알림창 반복" /><published>2024-05-07T00:00:00+00:00</published><updated>2024-05-07T00:00:00+00:00</updated><id>https://ysr-plus-ultra.pages.dev/tech/2024/05/07/hp_windows</id><content type="html" xml:base="https://ysr-plus-ultra.pages.dev/tech/2024/05/07/hp_windows.html"><![CDATA[<p>HP 노트북에서 터치패드 쓰면서 알림창 꺼졌다 켜졌다 무한반복일때</p>

<p>터치패드 설정 -&gt; 세손가락, 네손가락 끄면 해결 됨</p>

<p><br /></p>]]></content><author><name>Yoon, Suro</name></author><category term="Tech" /><summary type="html"><![CDATA[HP 노트북에서 터치패드 쓰면서 알림창 꺼졌다 켜졌다 무한반복일때]]></summary></entry><entry><title type="html">인터뷰 리뷰1</title><link href="https://ysr-plus-ultra.pages.dev/tech/2024/04/25/interview_review.html" rel="alternate" type="text/html" title="인터뷰 리뷰1" /><published>2024-04-25T00:00:00+00:00</published><updated>2024-04-25T00:00:00+00:00</updated><id>https://ysr-plus-ultra.pages.dev/tech/2024/04/25/interview_review</id><content type="html" xml:base="https://ysr-plus-ultra.pages.dev/tech/2024/04/25/interview_review.html"><![CDATA[<p>면접 리뷰</p>

<ol>
  <li>
    <p>Off-policy vs On-policy</p>

    <p><a href="https://ai.stackexchange.com/questions/10450/can-q-learning-be-used-to-derive-a-stochastic-policy">Can Q-learning be used to derive a stochastic policy? - Artificial Intelligence Stack Exchange</a></p>

    <p>Off-policy의 대표적인 Q-Learning으로 확률적인 Policy를 학습할 수 있는가?</p>

    <p>ex) 확률적인 Policy: 가위바위보 -&gt; 최적 Policy [1/3, 1/3, 1/3]</p>

    <p>답: 불가능, Q러닝은 주어진 state에 대해서 최적의 Q밸류를 학습하기 때문에 항상 Q값을 최대로 하는 action을 선택하게 됨.</p>

    <p>Softmax 같은 방법으로 확률 분포로 변형할 수 있지만 이것이 최적의 Policy라고는 할 수 없음</p>
  </li>
</ol>

<p><br /></p>

<ol>
  <li>
    <p>포트폴리오 구성에 있어서 머신 러닝이 어떻게 활용될수 있는가?</p>

    <p>포트폴리오 구성 과정</p>

    <ol>
      <li>
        <p>유니버스 선정</p>
      </li>
      <li>
        <p>모델 포트폴리오 구성</p>
      </li>
      <li>
        <p>실제 포트폴리오 구성</p>
      </li>
      <li>
        <p>트레이딩</p>
      </li>
      <li>
        <p>평가 및 조정</p>
      </li>
    </ol>
  </li>
</ol>

<p><br /></p>

<ol>
  <li>
    <p>input의 significance에 대해서 어떻게 설명할것인가?</p>

    <p>ChatGPT야 도와줘!</p>

    <blockquote>
      <p>머신러닝에서 input의 significance를 검정하는 방법은 다양합니다. 이러한 방법들은 모델의 특성과 데이터의 특성에 따라 선택될 수 있습니다. 몇 가지 주요한 방법을 살펴보겠습니다:</p>

      <ol>
        <li>
          <p><strong>Feature Importance(특성 중요도) 분석</strong>: 많은 머신러닝 알고리즘에서는 각 특성의 중요도를 제공합니다. 이를 통해 각 특성이 예측에 얼마나 중요한지를 확인할 수 있습니다. 예를 들어, 랜덤 포레스트나 그래디언트 부스팅 모델은 특성 중요도를 제공합니다.</p>
        </li>
        <li>
          <p><strong>가설 검정</strong>: 특정 특성이 예측에 유의미한 영향을 미치는지를 검정할 수 있습니다. 이를 위해 t-test, ANOVA 등의 통계적 가설 검정 방법을 사용할 수 있습니다. 이 방법은 특성과 목표 변수 간의 관계를 검증하는 데 유용합니다.</p>
        </li>
        <li>
          <p><strong>피쳐 선택(Feature Selection)</strong>: 모델 학습 전에 특성 선택 알고리즘을 사용하여 가장 중요한 특성만을 선택할 수 있습니다. 이를 통해 모델의 복잡성을 줄이고, 예측 성능을 향상시킬 수 있습니다. 일반적으로, 순차적 특성 선택(Sequential Feature Selection)이나 L1 Regularization을 사용한 희소 모델을 통해 특성을 선택합니다.</p>
        </li>
        <li>
          <p><strong>Permutation Importance(순열 중요도)</strong>: 이 방법은 각 특성을 무작위로 섞어서 모델의 성능 변화를 관찰하는 것입니다. 특성이 중요할수록 이러한 섞음은 모델의 성능에 미치는 영향이 클 것입니다.</p>
        </li>
        <li>
          <p><strong>Shapley Values(쉐플리 값)</strong>: 이는 각 특성이 예측에 미치는 기여를 설명하는 방법입니다. 이 방법은 특히 복잡한 모델인 경우에 유용합니다.</p>
        </li>
      </ol>

      <p>이러한 방법들을 함께 사용하여 특성의 significance를 평가하고, 모델의 해석 가능성을 향상시킬 수 있습니다. 그러나 주의할 점은 특성의 significance만을 고려하는 것이 아니라, 그것이 실제로 의미 있는지와 모델의 성능 향상에 기여하는지를 함께 고려해야 한다는 것입니다.</p>
    </blockquote>
  </li>
</ol>]]></content><author><name>Yoon, Suro</name></author><category term="Tech" /><summary type="html"><![CDATA[면접 리뷰]]></summary></entry><entry><title type="html">면접준비용 이전 프로젝트 관련</title><link href="https://ysr-plus-ultra.pages.dev/tech/2024/04/20/interview_prep.html" rel="alternate" type="text/html" title="면접준비용 이전 프로젝트 관련" /><published>2024-04-20T00:00:00+00:00</published><updated>2024-04-20T00:00:00+00:00</updated><id>https://ysr-plus-ultra.pages.dev/tech/2024/04/20/interview_prep</id><content type="html" xml:base="https://ysr-plus-ultra.pages.dev/tech/2024/04/20/interview_prep.html"><![CDATA[<p>준비해둬야 될꺼 같아서 정리하는 프로젝트 했던거 내용</p>

<p>KDDI(au) / Softbank API마켓에 올라가는 API의 AP(Access Point) 구성</p>

<h1 id="requirements">Requirements</h1>

<ul>
  <li>
    <p>API 문서</p>
  </li>
  <li>
    <p>필수 기능</p>

    <ol>
      <li>
        <p>Account Create</p>
      </li>
      <li>
        <p>Login</p>
      </li>
      <li>
        <p>토큰 인증</p>
      </li>
      <li>
        <p>HealthCheck</p>
      </li>
    </ol>
  </li>
  <li>
    <p>우리 AI 엔진 기능 추가</p>
  </li>
  <li>
    <p>서버 자동화 부분</p>
  </li>
</ul>

<h3 id="해결했던-문제들">해결했던 문제들</h3>

<ul>
  <li>
    <p>뭘로 개발할까?</p>

    <p>할줄 하는게 Python 이랑 Django/Flask 정도 밖에 없었고 사수도 없으니 업무를 완료하는데엔 Python + Django 밖에 없었습니다.</p>
  </li>
  <li>
    <p>Healthcheck가 뭐고?</p>

    <p>서버에 돌아가고 있으면 200 OK</p>
  </li>
  <li>
    <p>계정 생성, 로그인, 토큰 인증</p>

    <ul>
      <li>
        <p>django-rest-framework</p>
      </li>
      <li>
        <p>djangorestframework-simplejwt</p>
      </li>
      <li>
        <p>TokenAuthentication</p>
      </li>
    </ul>

    <p>무슨 헤더에 Bearer 토큰으로 쏴야 한다는 요건이 있었는데 잘 기억안남</p>

    <p>유저 데이터는 AWS S3로 DB구성해서 참조</p>
  </li>
  <li>
    <p>그외 AI 자연어 처리 기능</p>

    <ul>
      <li>백엔드에 String 쏘면 Embed 해주는 백엔드 서버 사내에 있는걸로 리다이렉트</li>
    </ul>
  </li>
  <li>
    <p>AWS EC2에 어케 올려야되나?</p>

    <ul>
      <li>
        <p>Docker로 miniconda 이미지 깔고</p>
      </li>
      <li>
        <p>사내 Gitlab 인증정보 설치하고</p>
      </li>
      <li>
        <p>venv 설정하고</p>
      </li>
      <li>
        <p>Django에서 Serve</p>
      </li>
      <li>
        <p>CTO분이 추가로 얘기해준건</p>

        <ul>
          <li>
            <p>사용량 많을지도 모르니까 ELB로 오토 스케일링 설정</p>
          </li>
          <li>
            <p>방화벽 관련은 Route 53으로 설정</p>
          </li>
        </ul>
      </li>
    </ul>
  </li>
  <li>
    <p>Swagger API 관련 문서</p>

    <ul>
      <li>API Document 처음 써보는 거였는데 Swagger가 XML/Json 기반으로 쉽게 수정 가능하고 Postman처럼 Example도 쓸수 있어서 채택</li>
    </ul>
  </li>
</ul>]]></content><author><name>Yoon, Suro</name></author><category term="Tech" /><summary type="html"><![CDATA[준비해둬야 될꺼 같아서 정리하는 프로젝트 했던거 내용]]></summary></entry><entry><title type="html">RLlib Evaluation 부분 관련 파라미터</title><link href="https://ysr-plus-ultra.pages.dev/tech/2024/04/16/rllib.html" rel="alternate" type="text/html" title="RLlib Evaluation 부분 관련 파라미터" /><published>2024-04-16T00:00:00+00:00</published><updated>2024-04-16T00:00:00+00:00</updated><id>https://ysr-plus-ultra.pages.dev/tech/2024/04/16/rllib</id><content type="html" xml:base="https://ysr-plus-ultra.pages.dev/tech/2024/04/16/rllib.html"><![CDATA[<p>https://docs.ray.io/en/latest/rllib/rllib-training.html#rllib-config-evaluation</p>

<p>설명에 앞서서 RLLib evaluation에 사용되는 옵션들 중 테스트 해본 몇가지</p>

<ul>
  <li><strong>evaluation_config</strong> – Typical usage is to pass extra args to evaluation env creator and to disable exploration by computing deterministic actions. IMPORTANT NOTE: Policy gradient algorithms are able to find the optimal policy, even if this is a stochastic one. Setting “explore=False” here will result in the evaluation workers not using this optimal policy!</li>
</ul>

<p>기본적인 부분, 아무것도 안넣으면 기본 Algorithm 옵션을 복붙한다.</p>

<p>만약 test와 다른 Env 설정을 하고 싶다면</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">config</span> <span class="o">=</span> <span class="n">config</span><span class="p">.</span><span class="n">evaluation</span><span class="p">(</span><span class="n">evaluation_config</span> <span class="o">=</span> <span class="p">{</span><span class="s">"env"</span><span class="p">:</span> <span class="n">eval_env</span> <span class="p">,</span> <span class="s">"env_config"</span><span class="p">:</span><span class="n">eval_config</span><span class="p">})</span>
</code></pre></div></div>

<p>이런식으로 사용가능</p>

<p>여기서 부턴 묶어서 설명</p>

<blockquote>
  <ul>
    <li>
      <p><strong>evaluation_interval</strong> – Evaluate with every evaluation_interval training iterations. The evaluation stats will be reported under the “evaluation” metric key. Note that for Ape-X metrics are already only reported for the lowest epsilon workers (least random workers). Set to None (or 0) for no evaluation.</p>
    </li>
    <li>
      <p><strong>evaluation_duration</strong> – Duration for which to run evaluation each evaluation_interval. The unit for the duration can be set via evaluation_duration_unit to either “episodes” (default) or “timesteps”. If using multiple evaluation workers (evaluation_num_workers &gt; 1), the load to run will be split amongst these. If the value is “auto”: - For evaluation_parallel_to_training=True: Will run as many episodes/timesteps that fit into the (parallel) training step. - For evaluation_parallel_to_training=False: Error.</p>
    </li>
    <li>
      <p><strong>evaluation_duration_unit</strong> – The unit, with which to count the evaluation duration. Either “episodes” (default) or “timesteps”.</p>
    </li>
    <li>
      <p><strong>evaluation_num_workers</strong> – Number of parallel workers to use for evaluation. Note that this is set to zero by default, which means evaluation will be run in the algorithm process (only if evaluation_interval is not None). If you increase this, it will increase the Ray resource usage of the algorithm since evaluation workers are created separately from rollout workers (used to sample data for training).</p>
    </li>
  </ul>
</blockquote>

<p>Ray가 시작되고 알고리즘을 Build하면</p>

<ol>
  <li>
    <p>evaluation_num_workers = 0 인경우 Driver에 num_envs_per_worker 갯수 만큼 Rollout+Env가 생성된다.</p>
  </li>
  <li>
    <p>evaluation_num_workers &gt; 0 이라면 evaluation_num_workers 갯수 만큼 rollouts 옵션의 num_envs_per_worker 갯수 만큼의 Rollout+Env가 생성된다.</p>
  </li>
</ol>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">config</span> <span class="o">=</span> <span class="n">AlgorithmConfig</span><span class="p">()</span>
<span class="n">config</span> <span class="o">=</span> <span class="n">config</span><span class="p">.</span><span class="n">rollouts</span><span class="p">(</span><span class="n">num_envs_per_worker</span> <span class="o">=</span> <span class="mi">16</span><span class="p">)</span>
<span class="n">config</span> <span class="o">=</span> <span class="n">config</span><span class="p">.</span><span class="n">evaluation</span><span class="p">(</span><span class="n">evaluation_num_workers</span> <span class="o">=</span> <span class="mi">8</span><span class="p">)</span>

<span class="c1"># 생각해보니까, 혹시 evaluation_config에서 num_envs_per_worker를 수정하면 Eval Worker마다 생성되는 Env수를 바꿀수 있나? 아직 테스트 안해봄
</span></code></pre></div></div>

<p>이라면 Ray에서 8개의 Eval Worker를 생성하고, 각각에 16개의 Env가 로드된다.</p>

<p>아무튼 이렇게 로드가 되고 나면 <strong>evaluation_interval</strong> 횟수마다 Evaluation이 돌아가게 된다.</p>

<blockquote>
  <p><strong>evaluation_interval</strong></p>

  <p>episode step이 아니라 Algorithm.train()이 Call된 횟수이다.</p>

  <p>어디서 설정이 되어 있는진 모르겠는데 tune의 num_agent_steps_trained 와는 다른 값이다.</p>

  <p>무턱대고 1e6 (1 mil) 같은 값으로 설정하면 Evaluation이 돌아가는걸 못본다. 개인적으론 10정도가 적당하다고 생각한다.</p>
</blockquote>

<p>자 이제 어떻게 Evaluation이 돌아가느냐,</p>

<p>evaluation_duration_unit=”episodes” 로 설정했다면 evaluation_duration 의 숫자만큼 Eval Worker들이 나눠서 돌리게 된다.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">config</span> <span class="o">=</span> <span class="n">config</span><span class="p">.</span><span class="n">rollouts</span><span class="p">(</span><span class="n">num_envs_per_worker</span> <span class="o">=</span> <span class="mi">16</span><span class="p">)</span>
<span class="n">config</span> <span class="o">=</span> <span class="n">config</span><span class="p">.</span><span class="n">evaluation</span><span class="p">(</span><span class="n">evaluation_interval</span><span class="o">=</span> <span class="mi">10</span><span class="p">,</span>
                           <span class="n">evaluation_duration</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
                           <span class="n">evaluation_duration_unit</span> <span class="o">=</span> <span class="s">"episodes"</span>
                           <span class="n">evaluation_parallel_to_training</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span>
                           <span class="n">evaluation_num_workers</span> <span class="o">=</span> <span class="mi">8</span><span class="p">)</span>
</code></pre></div></div>

<p>위와 같은 경우엔 10회마다 돌아가고 Eval worker의 순서에 따른 큐가 있는것 같은데</p>

<blockquote>
  <p>train 10회 -&gt; 큐의 첫번째 Worker의 첫번째 Env에서 Episode 1회 실행 -&gt; train 10회 -&gt; 큐의 다음 순서 Eval Worker 에서 Episode 1회 돌리고 reset</p>
</blockquote>

<p>이런 식으로 돌아가게 된다. 즉 한번의 Evaluation에서 한 에피소드의 결과 밖에 얻을수 없다.</p>

<p>결과의 분산도 필요하다면</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">config</span> <span class="o">=</span> <span class="n">config</span><span class="p">.</span><span class="n">rollouts</span><span class="p">(</span><span class="n">num_envs_per_worker</span> <span class="o">=</span> <span class="mi">16</span><span class="p">)</span>
<span class="n">config</span> <span class="o">=</span> <span class="n">config</span><span class="p">.</span><span class="n">evaluation</span><span class="p">(</span><span class="n">evaluation_interval</span><span class="o">=</span> <span class="mi">10</span><span class="p">,</span>
                           <span class="n">evaluation_duration</span> <span class="o">=</span> <span class="mi">56</span><span class="p">,</span>
                           <span class="n">evaluation_duration_unit</span> <span class="o">=</span> <span class="s">"episodes"</span>
                           <span class="n">evaluation_parallel_to_training</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span>
                           <span class="n">evaluation_num_workers</span> <span class="o">=</span> <span class="mi">8</span><span class="p">)</span>
</code></pre></div></div>

<p>이해 하기 쉽도록 56이라는 숫자를 사용했는데, 위의 경우엔</p>

<blockquote>
  <p>train 10회 -&gt; 8개의 eval_worker가 7개씩 나누어 가지고 한번의 evaluation 마다 56개의 결과를 얻을 수 있다.</p>

  <p>num_envs_per_worker = 16 이니까 각 Worker 마다</p>

  <p>( 0 1 2 3 4 5 6 ) ( 7 8 9 10 11 12 13 ) ( 14 15 0 1 2 3 4 5 ) ( 6 7 …</p>

  <p>이런식으로 돌아가게 되더라</p>
</blockquote>

<ul>
  <li><strong>always_attach_evaluation_results</strong> – Make sure the latest available evaluation results are always attached to a step result dict. This may be useful if Tune or some other meta controller needs access to evaluation metrics all the time.</li>
</ul>

<p>이 옵션 쓰니까 Tensorboard에서 timestamp가 이상하게 찍혀 나옴.</p>

<p>일단은 안쓰는중</p>]]></content><author><name>Yoon, Suro</name></author><category term="Tech" /><summary type="html"><![CDATA[https://docs.ray.io/en/latest/rllib/rllib-training.html#rllib-config-evaluation]]></summary></entry><entry><title type="html">Multi-task Deep Reinforcement Learning with PopArt</title><link href="https://ysr-plus-ultra.pages.dev/tech/2019/09/21/paper004.html" rel="alternate" type="text/html" title="Multi-task Deep Reinforcement Learning with PopArt" /><published>2019-09-21T00:00:00+00:00</published><updated>2019-09-21T00:00:00+00:00</updated><id>https://ysr-plus-ultra.pages.dev/tech/2019/09/21/paper004</id><content type="html" xml:base="https://ysr-plus-ultra.pages.dev/tech/2019/09/21/paper004.html"><![CDATA[<p>부제: impala에 popart를 싸서 드셔보세요</p>

<p>Learning values across many orders of magnitude
https://arxiv.org/abs/1602.07714</p>

<p>Multi-task Deep Reinforcement Learning with PopArt
https://arxiv.org/abs/1809.04474</p>

<h1 id="소개">소개</h1>
<p>Atari 57과같이 여러 Task를 한 모델을 가지고 학습하는 경우를 multi-task learning이라고 한다.
각 environment 마다 입력이 다르고, 보상체계가 다르기 때문에 reward clipping을 이용하여 학습이 균일하게 이루어 지도록 하는 테크닉이 사용되고 있다.
그 방법중 하나는 reward를 z-score로 normalization 하는것인데, pop-art에서는 단순히 z-score로 바꾸는 것 뿐만 아니라,
$\mu, \Sigma$의 statistic가 바뀌었을 경우, state value/action value가 불안정해져 학습을 개선하지 못하고 단순히
복잡하게 만들수 있음을 인지하고,</p>

<ul>
  <li>ART: $\mu, \Sigma$의 통계치 수집
    <ul>
      <li>Adaptively Rescaling Targets</li>
    </ul>
  </li>
  <li>POP: unnormalized value가 수렴하도록 조정
    <ul>
      <li>Preserving Outputs Precisely</li>
    </ul>
  </li>
</ul>

<p>의 두가지 단계로 나누어 학습하는 알고리즘을 제시하였다.<br />
원 논문 “Learning values across many orders of magnitude”에서는 DQN에 적용하였고,<br />
새 논문 “Multi-task Deep Reinforcement Learning with PopArt”는 <br />
“IMPALA: Scalable Distributed Deep-RL with Importance Weighted Actor-Learner Architectures”에 적용된 IMPALA를 개선하여,
popart+impala를 이용한 알고리즘을 제시하였다.</p>

<h1 id="선행-연구와-비교한-장점">선행 연구와 비교한 장점</h1>
<ol>
  <li>전술 했듯 environment의 입력이 다르다는 multi-task learning 자체의 어려움</li>
  <li>reward가 전부 non-negative일 경우에 강화학습 알고리즘은 그 reward의 빈도(frequency)가 높아지도록 학습한다.
    <ul>
      <li>실제로 학습해야하는 것은 보상의 합(cumulative sum)임에도 불구하고, 쉽게 갈 수 있는 길을 선호하는 경향이 있음.</li>
    </ul>
  </li>
</ol>

<p>value를 normalization 할 경우, 비슷한 trajectory라도 절반은 negative feedback되므로, 전체적으로 optimum으로 향하도록 조정해 주는것으로 보임.
논문에 정리된 부분은</p>
<ol>
  <li>
    <p>scale of rewards<br />
각 environment마다 보상체계가 다르고, 스케일이 다름<br />
ex) 스테이지를 클리어하면 +1점/1000step vs 장애물을 격파할때마다 +1점/50step</p>
  </li>
  <li>
    <p>sparsity of rewards<br />
스테이지를 클리어 하는 빈도 « 장애물을 격파할때 reward를 받는 횟수</p>
  </li>
  <li>
    <p>competetance of agents<br />
unnormalized reward의 경우자주 들어오는 environment를 학습할 확률이 더 높다.
가끔 들어오는 다른 environment의 reward때문에 전체 학습이 non-stationary해지며 학습자체가 collapse할 수도 있다.</p>
  </li>
</ol>

<h1 id="제시-기술방법">제시 기술/방법</h1>
<p>state value는 impala와 동일하게 v-trace target을 이용한다.</p>

\[\begin{aligned}
G_t^{\text{v-trace}}&amp;=v(S_t)+\sum\limits_{k=t}^{t+n-1}\gamma^{k-t}\big(\prod\limits_{i=t}^{k}c_i\big)\delta_k,\\
\delta_k&amp;=(R_t+\gamma v(S_{t+1})-v(S_t))
\end{aligned}\]

<ul>
  <li>
    <p>Value Advantage ($G_t^v$)</p>

\[G_t^v = G_t^{\text{v-trace}}\]
  </li>
  <li>
    <p>Policy Advantage ($G_t^\pi$)</p>

\[G_t^\pi = R_{t+1}+\gamma G_{t+1}^{\text{v-trace}}\]
  </li>
</ul>

<p>unnormalized value estimate를 $v_{{\mu, \sigma, \theta}}(S)$,<br />
normalized value estimate를 $n_\theta(S)$라고 한다면,</p>

\[{\{\mu, \sigma, \theta\}}(S) = \sigma n_{\theta}(S)+\mu\]

<p>가 성립한다.</p>

<p>moving average를 적용하여</p>

\[\begin{align}
\mu_t &amp;= (1-\)\mu_{t-1}+\ G_t^v,\\
\nu_t &amp;= (1-\)\nu_{t-1}+\ (G_t^v)^2,\\
\sigma_t &amp;= \sqrt{\nu_t-\mu_t^2}
\end{align}\]

<p>이 식을 오랜만에 봐서 왜 그런지 5분동안 고민했는데,</p>

\[\text{Var(X)} = E(X^2)-[E(X)]^2\]

<p>란 사실을 통계책 보고 떠올렸다.</p>

<p>다음으로 normalized된 값을 이용하여 value, policy update는 다음과 같이 스케일링 할 수 있다.</p>

<ul>
  <li>
    <p>Actor-Critic Update<br />
  value parameter($\theta$)의 업데이트(Minimize)</p>

\[\left(\frac{G_t^v-\mu}{\sigma}-n_\theta(S_t) \right)\nabla_\theta n_\theta(S_t)\nabla_\theta V_\theta(x_s)\]

    <p>policy parameter($\omega$)의 업데이트(Maxmize)</p>

    <p>원서에는</p>

\[\Delta\omega \propto \left(\frac{G_t^\pi-\mu}{\sigma}-n_\theta(S_t) \right) \nabla_\omega \log\pi_\omega(A_t|S_t)\]

    <p>(IMPALA와의 통일성을 위해 $\eta$를 $\omega$로 변경)<br />
  라고 적혀있는데 impala는 importance weighted TD로 볼 수 있으니,</p>

\[\rho_s\left(\frac{G_t^\pi-\mu}{\sigma}-n_\theta(S_t) \right)\nabla_\omega\log\pi_\omega(a_s|x_s)\]

    <p>이렇게 바꿀수 있겠다.</p>
  </li>
  <li>
    <p>POP-ART<br />
이렇게 $n_\theta$를 갱신하여도 $\mu,\sigma$는 non-trainable variable이기 때문에<br />
학습 전후로 같은 입력이 주어지더라도 $\mu, \sigma$의 값이 변할경우 state value가 달라져 버린다.</p>

    <p>이것을 조정해 주는것이 POP부분이다.
평균, 분산 통계치가 각각 $\mu\rightarrow\mu^\prime,\quad \sigma\rightarrow\sigma^\prime$으로 수정되었다고 하자,
그러면</p>

\[y = wx +b\]

    <p>라고 하였을때,</p>

\[\begin{align}
w^\prime &amp;= \frac{\sigma}{\sigma^\prime}w,\\
b^\prime &amp;= \frac{\sigma b +\mu - \mu^\prime}{\sigma^\prime} 
\end{align}\]

    <p>으로 보정한다.</p>
  </li>
  <li>
    <p>순서가 메챠쿠챠!</p>

    <p><a href="https://arxiv.org/abs/1602.07714">오리지널 POPART</a>에서는 들어온 학습데이터를 이용하여,</p>
    <ol>
      <li>평균과 분산을 구하고(ART)</li>
      <li>마지막 q-value의 이동평균을 갱신 및 보정(POP)</li>
      <li>모델 파라미터 업데이트</li>
    </ol>

    <p>의 순서로 업데이트를 하고있다.</p>

    <p><a href="https://arxiv.org/abs/1809.04474">POPART-IMPALA</a>에서는 이 순서가 뒤바뀌어있다.</p>
    <ol>
      <li>평균과 분산을 구하고(ART)</li>
      <li>모델 파라미터 업데이트</li>
      <li>이동평균을 갱신 및 보정(POP)</li>
    </ol>
  </li>
  <li>
    <p>POPART-IMPALA에 따른 파라미터 업데이트 식을 Timeline에 맞게 다시 써보면</p>
    <ol>
      <li>
        <p>ART</p>

\[\begin{align}
 \mu_{\text{new}} &amp;= (1-\beta) \cdot \mu_{\text{old}}+\beta \cdot G_t^v,\\
 \nu_{\text{new}} &amp;= (1-\beta)\cdot\nu_{\text{old}}+\beta \cdot (G_t^v)^2,\\
 \sigma_{\text{new}} &amp;= \sqrt{\nu_{\text{new}}-\mu_{\text{new}}^2}
 \end{align}\]
      </li>
      <li>
        <p>Actor-critic update</p>

\[\begin{align}
\Delta\theta &amp;= \left(\frac{G_t^v-\mu_{\text{old}}}{\sigma_{\text{old}}}-n_\theta(S_t) \right)\nabla_\theta n_\theta(S_t)\nabla_\theta V_\theta(x_s),\\
\Delta\omega &amp;= \left(\frac{G_t^\pi-\mu}{\sigma}-n_\theta(S_t) \right)\nabla_\omega\log\pi_\omega(a_s|x_s)
\end{align}\]
      </li>
      <li>
        <p>POP</p>

\[\begin{align}
w^\prime &amp;= \frac{\sigma}{\sigma^\prime}w,\\
b^\prime &amp;= \frac{\sigma b +\mu - \mu^\prime}{\sigma^\prime} 
\end{align}\]
      </li>
    </ol>

    <p>1,2는 서로 독립적이기에 같은 session에서 실행시켜도 문제 없으나 3은 독립적으로 실행하여야 한다.</p>
  </li>
</ul>]]></content><author><name>Yoon, Suro</name></author><category term="Tech" /><summary type="html"><![CDATA[부제: impala에 popart를 싸서 드셔보세요]]></summary></entry><entry><title type="html">구간연산에 대해서</title><link href="https://ysr-plus-ultra.pages.dev/tech/2019/09/21/post006.html" rel="alternate" type="text/html" title="구간연산에 대해서" /><published>2019-09-21T00:00:00+00:00</published><updated>2019-09-21T00:00:00+00:00</updated><id>https://ysr-plus-ultra.pages.dev/tech/2019/09/21/post006</id><content type="html" xml:base="https://ysr-plus-ultra.pages.dev/tech/2019/09/21/post006.html"><![CDATA[<ul>
  <li><a href="#컴퓨터의-구조적-한계">컴퓨터의 구조적 한계</a></li>
  <li><a href="#컴퓨터의-구조적-한계2">컴퓨터의 구조적 한계2</a></li>
  <li><a href="#구간연산">구간연산</a></li>
</ul>

<h2 id="컴퓨터의-구조적-한계">컴퓨터의 구조적 한계</h2>
<p>컴퓨터는 기본적으로 2진연산을 다루고, 사람은 10진법을 사용하기 때문에 10진수를 2진수로 바꾸기 위한 규칙이 필요하다.
현용되는 컴퓨터의 소숫점 연산에 관한 규칙은 IEEE754에 정의되어 있고, 거의 모든 컴퓨터가 이를 따르게 되어있다.</p>

<p>현용 64비트 컴퓨터의 소숫점(double, float64)은<br />
부호(s,1 bit)+지수(e, 11 bits)+밑(b, 52 bits)  (밑? 이라고 하는게 맞는지 모르겠다)</p>

\[(-1)^{s}\left(1+\sum\limits_{i=1}^{52}b_{52-i}2^{-i}\right)\times 2^{e-1023}\]

<p>$2^{10}$ 은 대략 $10^3$정도 되기때문에 b로 표현 할 수 있는 약 $10^{-15}$ 까지는 수 사이의 간격보다<br />
컴퓨터가 표현할 수 있는 해상도가 더 높기 때문에 값을 신뢰할 수 있지만,<br />
그 아래로 내려갈 경우 10진수 소수 사이의 간격보다 컴퓨터의 간격이 더 크기 때문에 값을 정확하게 표현 할 수 없다.</p>

<p>숫자가 무작정 작은게 문제가 아니라, b로 표현할 수 있는 값이 문제가 된다.</p>

<p>예를 들면(보기 쉽게 소수 4자리씩 끊었다.)</p>
<ul>
  <li>5e-17
    <ul>
      <li>0.0000 0000 0000 0000 5000 0000 0000 0000 0000 0000 0000 00</li>
      <li>0.0000 0000 0000 0000 4999 9999 9999 9999 8954 8893 3620 17</li>
      <li>위가 10진수 표현, 아래가 그 수와 가장 가까운 float값을 나타낸다.</li>
      <li>오차: $(1.0451106637983)\times 10^{-16} \times 10^{-17}$</li>
    </ul>
  </li>
</ul>

<p>그러나<br />
2.0000 0000 0000 0000~<br />
2.0000 0000 0000 0009 사이의 값을 보면</p>

<p>2.0000 0000 0000 0000 -&gt; 2.0000 0000 0000 0000<br />
2.0000 0000 0000 0001 -&gt; 2.0000 0000 0000 0000<br />
2.0000 0000 0000 0002 -&gt; 2.0000 0000 0000 0000<br />
2.0000 0000 0000 0003 -&gt; 2.0000 0000 0000 0004 4408 9209 85006<br />
2.0000 0000 0000 0004 -&gt; 2.0000 0000 0000 0004 4408 9209 85006<br />
2.0000 0000 0000 0005 -&gt; 2.0000 0000 0000 0004 4408 9209 85006<br />
2.0000 0000 0000 0006 -&gt; 2.0000 0000 0000 0004 4408 9209 85006<br />
2.0000 0000 0000 0007 -&gt; 2.0000 0000 0000 0008 8817 8419 70013<br />
2.0000 0000 0000 0008 -&gt; 2.0000 0000 0000 0008 8817 8419 70013<br />
2.0000 0000 0000 0009 -&gt; 2.0000 0000 0000 0008 8817 8419 70013</p>

<p>각각의 숫자를 제대로 계산해내지 못하는걸 알 수 있다.</p>

<p>이 부분에 관한 더 자세한 설명은 Round-off error, Machine epsilon 등의 검색어로 검색하면 나온다.</p>

<h2 id="컴퓨터의-구조적-한계2">컴퓨터의 구조적 한계2</h2>
<p>그런데 수 자체엔 문제가 없는 경우도 있다.</p>

\[\begin{pmatrix}
64919121&amp; -159018721\\
41869520.5&amp;-102558961
\end{pmatrix}
\begin{pmatrix}
x\\
y
\end{pmatrix}=
\begin{pmatrix}
1\\
0
\end{pmatrix}.\]

<p>위 식을 python으로 풀어보면,</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="n">a</span> <span class="o">=</span> <span class="mi">64919121</span>
<span class="n">b</span> <span class="o">=</span> <span class="o">-</span><span class="mi">159018721</span>
<span class="n">c</span> <span class="o">=</span> <span class="mf">41869520.5</span>
<span class="n">d</span> <span class="o">=</span> <span class="o">-</span><span class="mi">102558961</span>
<span class="n">A</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">array</span><span class="p">([[</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">],[</span><span class="n">c</span><span class="p">,</span><span class="n">d</span><span class="p">]])</span>
<span class="n">B</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">],[</span><span class="mi">0</span><span class="p">]])</span>
<span class="n">answer1</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">linalg</span><span class="p">.</span><span class="n">solve</span><span class="p">(</span><span class="n">A</span><span class="p">,</span><span class="n">B</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">answer1</span><span class="p">)</span>
<span class="c1"># [[1.06018308e+08]
#  [4.32817930e+07]]
</span><span class="k">print</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">dot</span><span class="p">(</span><span class="n">A</span><span class="p">,</span><span class="n">answer1</span><span class="p">))</span>
<span class="c1"># [[1.]
#  [0.]]
</span></code></pre></div></div>

<p>값이 생략되어 있긴 한데 Matlab으로 소숫점을 전부 표현해보면
\(\begin{pmatrix}
x\\
y
\end{pmatrix}=\begin{pmatrix}
106018308.0071325\\
43281793.0017831
\end{pmatrix},\)</p>

<p>손계산 다 하고 계산한 경우
\(\begin{align}
x_1 &amp;= \frac{d}{ad-bc}\\
x_2 &amp;= \frac{-c}{ad-bc}
\end{align}\)</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">x1</span> <span class="o">=</span> <span class="n">d</span><span class="o">/</span><span class="p">(</span><span class="n">a</span><span class="o">*</span><span class="n">d</span><span class="o">-</span><span class="n">b</span><span class="o">*</span><span class="n">c</span><span class="p">)</span>
<span class="n">x2</span> <span class="o">=</span> <span class="o">-</span><span class="n">c</span><span class="o">/</span><span class="p">(</span><span class="n">a</span><span class="o">*</span><span class="n">d</span><span class="o">-</span><span class="n">b</span><span class="o">*</span><span class="n">c</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">x1</span><span class="p">,</span><span class="n">x2</span><span class="p">)</span>
<span class="c1"># (102558961.0, 41869520.5)
</span><span class="n">answer2</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">array</span><span class="p">([[</span><span class="n">x1</span><span class="p">],[</span><span class="n">x2</span><span class="p">]])</span>
<span class="k">print</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">dot</span><span class="p">(</span><span class="n">A</span><span class="p">,</span><span class="n">answer2</span><span class="p">))</span>
<span class="c1"># [[1.]
#  [0.]]
</span></code></pre></div></div>

<p>두 방법 모두 검산에도 문제가 없다.</p>

<p>정답은
\(\begin{pmatrix}
x\\
y
\end{pmatrix}=\begin{pmatrix}
205117922\\
83739041
\end{pmatrix},\)</p>

<p>혹시 진짜인가 싶은분은 손으로 계산해보시기 바란다.</p>

<h2 id="구간연산">구간연산</h2>
<p>이러한 문제를 해결 할 수 있는 방법 중 하나가 구간 연산(Interval Arithmetic)이다.</p>

<p>구간 연산에서는 값을 point로 저장하는 것이 아닌 $[\text{lower_bound},\text{upper_bound}]$의 형태로 저장한다.<br />
lower_bound와 upper_bound는 반드시 2진 소수 표현으로 표현 가능한 수이기 때문에 중간에 값이 오염되지 않는다.</p>

<p>계산 결과도 구간으로 출력되기 때문에, 우리는 이 값을 해석할 때에<br />
<strong>“정답(Real Solution)은 lower_bound와 upper_bound 사이에 반드시 존재한다.”</strong>라고 결론을 내릴 수 있다.</p>

<p>이전의 2x2행렬 연산을 Matlab의 구간연산 라이브러리인 INTLAB를 사용해서 연산할 경우<br />
$(x,y)=(\text{NaN},\text{NaN})$ 을 출력하기 때문에 사용자가 연산이 잘못되었음을 인식할 수 있다.</p>]]></content><author><name>Yoon, Suro</name></author><category term="Tech" /><summary type="html"><![CDATA[컴퓨터의 구조적 한계 컴퓨터의 구조적 한계2 구간연산]]></summary></entry></feed>