<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>minsing-jin.log</title>
        <link>https://velog.io/</link>
        <description>존나 재밌는것을 맨듭니다.</description>
        <lastBuildDate>Mon, 03 Nov 2025 11:25:43 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>minsing-jin.log</title>
            <url>https://velog.velcdn.com/images/minsing-jin/profile/a81f0e4d-f816-48b3-afa9-11f9dd834b4f/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. minsing-jin.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/minsing-jin" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[HalluLens 논문리뷰]]></title>
            <link>https://velog.io/@minsing-jin/HalluLens-%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@minsing-jin/HalluLens-%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Mon, 03 Nov 2025 11:25:43 GMT</pubDate>
            <description><![CDATA[<h3 id="🇰🇷-kohallulens로-벤치마크-직접-돌려보기"><a href="https://github.com/NomaDamas/KoHalluLens">🇰🇷 KoHalluLens로 벤치마크 직접 돌려보기!</a></h3>
<h1 id="🤷-motivation">🤷 Motivation</h1>
<ul>
<li><p>통일된 계층과 같은 할루시네이션을 분류할 프레임워크 부족</p>
</li>
<li><p>Hallucination에 대한 용어와 범위의 모호함</p>
<ul>
<li>“사실과 다른 말하기”(Factuality issue)</li>
<li>“모르는데 아는 척하기”(Hallucination)</li>
</ul>
</li>
<li><p>Factuality와 real-world의 불일치</p>
<ul>
<li>ex) 22년산 한동건(수염이 존재하는 카더가든처럼 생긴)을 train한 LLM 모델<ul>
<li>한동건의 얼굴에 대해서 묘사해달라고 하면 수염달린 카더가든 한동건이라고 함</li>
<li>내부 지식에 한에서는 llm이 충실했지만 2025년 real-world 한동건은 수염이 없는 나폴리맛피아 닮은 한동건임</li>
</ul>
</li>
</ul>
</li>
<li><p>기존 hallucination eval dataset들은 Data saturation or Leakage문제 발생</p>
<ul>
<li><p>data saturation:</p>
<p>  모델들이 성능들이 모두 좋아져서  성능 향상이 미미해지는 현상</p>
</li>
</ul>
</li>
</ul>
<h1 id="🤷-definition">🤷 Definition</h1>
<ul>
<li><p>Hallucination</p>
<ul>
<li>훈련한대로 말하지 않거나 prompt(input context)대로 답변하지 않는것</li>
</ul>
</li>
<li><p>Claim</p>
<ul>
<li>longform answer에서 검증가능한 작은 정보단위 or 사실적 진술</li>
<li>유형<ul>
<li>True: 생성된 claim의 개수</li>
<li>Flase: 생성되지 않는 claim의 개수</li>
<li>Positive: supported</li>
<li>Negative: unsupported, refuted, unverifiable</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="🧮-실험-setting">🧮 실험 Setting</h1>
<ul>
<li>엄선된 Wiki활용<ol>
<li>goodWiki: wikipedia Editors가 따봉한 Wiki로 필터링 - (2023/9/4)까지의 위키를 가져옴</li>
<li>WikiRank 2024: Harmonic centrality score 기준으로 10개의 구간을 나눠서 각 문서의 난이도 분류<ul>
<li>h-score란?<ul>
<li>그래프 이론에서 노드의 중요성과 영향력을 측정하는 지표임.</li>
<li>높을수록  더 접근성이 좋고, 언급이 많이 되고 많이 알려져있다는 것</li>
<li>문서 중요도와 대중성의 프록시로 활용</li>
</ul>
</li>
<li>각 extrinsic hallucination에는 위키 문서 기준으로 난이도 분류함</li>
</ul>
</li>
</ol>
<ul>
<li>어려움의 기준<ul>
<li>h-score</li>
<li>longtail knowledge</li>
</ul>
</li>
</ul>
</li>
<li>NonEntity를 만드는법<ul>
<li>Mixed Entities - 각도메인당 2000개씩 총 8000개 sample<ul>
<li>동물, 식물, 박테리아 분류, 의약품과 같은 이름들을 무작위로 섞어서 새로운 용어를 만듦</li>
<li>실제 의학, 분류학 데이터베이스(ITIS)에서 있는지 Validation → 검색 검증 x</li>
</ul>
</li>
<li>Generated Entities - 1950개의 Sample<ul>
<li>LLM이 다양한 도메인(비즈니스, 이벤트, 제품브랜드)에서 허구적인 Entity 이름 생성</li>
<li>Round-Robin<ul>
<li>단일 llm이 자신이 만든 가상의 엔티티에 정보를 제공하려는 bias 존재가능</li>
<li>두가지 모델로 허구의 Enitity를 생성, 세번째모델이 이름들을 조합하여 query를 만듦.<ul>
<li>Llama-3.1-405B-Instruct, GPT-4o, Mistral-Nemo-Instruct-2407</li>
</ul>
</li>
</ul>
</li>
<li>Brave Search API로 검색엔진으로 존재여부 검증</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="🤗-taxonomy">🤗 Taxonomy</h1>
<p><img src="https://velog.velcdn.com/images/minsing-jin/post/e2f7b77d-49df-46cf-9a8e-6af6fa3230b1/image.png" alt=""></p>
<h1 id="👾-extrinsic-hallucination">👾 Extrinsic Hallucination</h1>
<ul>
<li>정의: 생성된 내용이 training data와 일치 x</li>
<li>평가 방식:<ul>
<li>한번 evaluation run할때마다 데이터가 생성되고, 평가까지 완료함.<ul>
<li>wiki 문서를 보고 dynamic하게 query-gt pair를 생성함</li>
<li>LLM-as-Judge를 활용해서 각 Metric에 따라 Performance 측정</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="1-precisewikiqa">1. PreciseWikiQA</h3>
<ul>
<li>단답형 query-gt 500개</li>
</ul>
<p><strong>[Metric]</strong></p>
<ul>
<li><p>False refusal rate</p>
</li>
<li><p>Hallucination rate</p>
</li>
<li><p>Correct answer rate</p>
</li>
<li><p>[Eval 결과]</p>
<p>  <img src="https://velog.velcdn.com/images/minsing-jin/post/174ae3b8-e750-4e08-9a12-1008430e684f/image.png" alt=""></p>
<ul>
<li>라마 3.1 405b-instruct 는 난이도 수준에 걸쳐 일관된 Hallucination 비율을 보여줌</li>
<li>Gpt-4o와 claud-3.5-sonnet는 어려울수록 hallucination비율이 높아짐</li>
</ul>
</li>
</ul>
<h3 id="2-longwiki">2. LongWiki</h3>
<ul>
<li>Longform</li>
<li>서술형 query-gt - (250개 sampled + 50개 레벨 고려 샘플링)</li>
<li><strong>[Metric]</strong><ul>
<li>False refusal rate</li>
<li>Precision<ul>
<li>생성된 답변에서 나온 전체 claim 중 supported claim의 평균 비율</li>
<li>$\text{Precision} = \frac{\text{supported claims}}{\text{all extracted claims}}$</li>
</ul>
</li>
<li>Recall@K<ul>
<li>$\text{Recall@}K = \frac{\min(\text{supported claims},,K)}{K}$</li>
<li>Detail<ul>
<li>Precision에서 짧게 말한것에 대해서 점수를 많이 받을수도 있기에 조정</li>
<li>FN은 어떻게 아나?<ul>
<li>몰라서 K를 32개로 적당히 두고 32개가 모든</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>F1@K<ul>
<li>$\text{F1@}K = \frac{2 \cdot \text{Precision} \cdot \text{Recall@}K}{\text{Precision} + \text{Recall@}K}$</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>[Eval 결과]</strong></p>
<p><img src="https://velog.velcdn.com/images/minsing-jin/post/6af17806-4800-402f-8486-9afa33c05cdf/image.png" alt=""></p>
<h3 id="3-nonexistentrefusal">3. NonExistentRefusal</h3>
<ul>
<li>training하지 않은 상상의 Entitiy를 섞어서 질문하면 거부하는가?<ul>
<li>관련성 없지만 넣었을때 그럴듯해보이는 entity를 프롬프트에 넣음</li>
</ul>
</li>
<li>존재하지 않는 엔티티 1950개 생성후 query를 날림.</li>
<li>생성법<ul>
<li>Entity 생성후 Benchmark → 모델은 모릅니다유를 시전해야함<ul>
<li>Mixed Entity생성<ul>
<li>동물, 의약품, 식물, 박테리아 분류 이름 섞기</li>
<li>검증 - db검색</li>
</ul>
</li>
<li>GeneratedEntities<ul>
<li>Round Robin 방식 활용<ul>
<li>2개의 모델이 개체를 생성하고, 하나의 모델이 조합함</li>
</ul>
</li>
<li>검증 - 웹검색</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>[Metric]</strong></p>
<ul>
<li>False Acceptance Rate</li>
</ul>
<p><strong>[Eval 결과]</strong></p>
<p><img src="https://velog.velcdn.com/images/minsing-jin/post/8e63c231-c549-430f-83c3-e105cb71db82/image.png" alt=""></p>
<h1 id="🪐-intrinsic-hallucination">🪐 Intrinsic Hallucination</h1>
<ul>
<li>정의: 생성된 내용이 input context와 일치하지 않는 생성</li>
</ul>
<h2 id="기존-벤치마크-활용-static">기존 벤치마크 활용 <strong>(Static)</strong></h2>
<ul>
<li>조건:<ul>
<li>기존의 잘알려지지 않으면서(Data leakage 문제 방지)</li>
<li>data saturation의 문제가 없는 데이터셋 사용</li>
</ul>
</li>
<li>선정된 벤치마크<ul>
<li><a href="https://github.com/vectara/hallucination-leaderboard?tab=readme-ov-file">HHEM(Hughes Hallucination Evaluation Model)</a> → 매년 업데이트<ul>
<li>text summarization → 7B미만 모델은 유용</li>
<li>실험 디테일<ul>
<li>testset<ul>
<li><a href="https://huggingface.co/datasets/abisee/cnn_dailymail/viewer/1.0.0/test?views%5B%5D=_100_test">CNN/Daily Mail corpus 활용</a></li>
</ul>
</li>
<li>factual consistency 데이터셋으로 Train한 hallucination detection <strong>모델</strong>을 사용<ul>
<li>각 LLM이 생성한 요약이 <strong>원문 내용과 사실적으로 일치하는지</strong> 평가</li>
<li>모델별 factual consistency <strong>비율 = 환각이 없는 비율</strong></li>
<li><strong>환각률 = 100 -</strong> factual consistency <strong>비율</strong></li>
<li>응답 거부율은 별도로 ‘Answer Rate’로 기록.</li>
</ul>
</li>
</ul>
</li>
<li>실험 세팅<ul>
<li>temperature = 0</li>
<li>프롬프트세팅<ul>
<li>깃허브 나와있는대로 ㄱㄱ</li>
</ul>
</li>
<li>사용모델:  <strong>HHEM-2.1-Open</strong><ul>
<li>context length 제한은 없다고 Hugging에 나오긴했는데 한번 써보고 이상하면 github 설명대로 1000개 짧은 Corpus로 샘플링</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><a href="https://github.com/open-compass/ANAH">ANAH 2.0 - with reference set-up</a><ul>
<li><a href="https://huggingface.co/datasets/opencompass/anah">ANAH dataset</a></li>
<li>ANAH v2 model</li>
</ul>
</li>
<li><a href="https://github.com/SalesforceAIResearch/FaithEval">FaithEval</a><ul>
<li>FaithEval Benchmark dataset<ul>
<li><a href="https://huggingface.co/collections/Salesforce/faitheval-benchmark-66ff102cda291ca0875212d4">https://huggingface.co/collections/Salesforce/faitheval-benchmark-66ff102cda291ca0875212d4</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>이유<ul>
<li>benchmark set을 extrinsic처럼 Dynamic하게 하면 좋지만 llm as judge 자체에서도 할루시네이션이 생길 수 있음.</li>
</ul>
</li>
</ul>
<h3 id="1-hhem">1. HHEM</h3>
<ul>
<li>매년 업데이트 되는 Text summarization 벤치마크</li>
<li>7B 미만의 모델을 평가하는데에는 유용하다고 판단해서 넣음</li>
</ul>
<h3 id="2-anah20">2. ANAH2.0</h3>
<ul>
<li>input context로 사실적으로 정확한 정보를 주었을때 생성된 콘텐츠와 입력 context 간의 일관성 평가</li>
<li>llm as judge</li>
</ul>
<h3 id="3-faitheval">3. FaithEval</h3>
<ul>
<li>입력 Context에 노이즈를 넣거나 모순된 지식을 섞어도 잘 대답하는지 평가</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[pyimage1 doesn't exist error]]></title>
            <link>https://velog.io/@minsing-jin/pyimage1-doesnt-exist-error</link>
            <guid>https://velog.io/@minsing-jin/pyimage1-doesnt-exist-error</guid>
            <pubDate>Sun, 20 Jul 2025 06:32:26 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/8e217767-0d3b-4860-82a0-47e205e87bc5/image.png" alt=""></p>
<p>문제 요약:</p>
<ul>
<li><code>main.py</code>에서 <code>AutoComplete.autocomplete()</code>을 실행하면 PostgreSQL 연결은 성공 메시지가 뜨지만 실제 데이터 조회 (<code>User.get_random_meme()</code>)에서 동작하지 않거나, GUI가 에러 (<code>pyimage1 doesn&#39;t exist</code>)를 발생시킴.</li>
<li>같은 코드를 단독으로 실행하면 정상 동작함.</li>
<li>Messagebox에 글자가 잘 안뜨거나 Messagebox자체가 안나오는 문제</li>
</ul>
<hr>
<h2 id="🔎-원인-분석">🔎 원인 분석</h2>
<ol>
<li><p><strong><code>pyimage1</code> doesn&#39;t exist</strong> 에러는 <code>Tkinter</code> 이미지 객체가 생성되었는데, <code>mainloop</code> 중간에 소멸되어 Tkinter가 그걸 참조할 수 없게 되는 대표적인 에러입니다.</p>
<ul>
<li>이는 <code>PhotoImage</code>나 <code>Label</code> 등에 설정된 이미지가 <code>local variable</code>로 만들어지고, 참조 없이 사라질 때 발생합니다.</li>
<li>GUI에서 이미지 보여줄 때 <code>self.image = tk.PhotoImage(...)</code>처럼 <strong>인스턴스 변수로 유지해야 합니다.</strong></li>
</ul>
</li>
<li><p><strong>PostgreSQL이 동작하지 않는 것처럼 보이는 이유</strong></p>
<ul>
<li>실제로 연결은 되었고 로그도 출력되지만, GUI 창이 뜨기 전에 <code>mainloop()</code>가 잘못 종료되어 DB 동작까지 마무리되지 않을 수 있습니다.</li>
<li>특히 GUI 내부에서 발생한 예외나 잘못된 흐름으로 인해 <code>mainloop()</code>가 조기 종료되면 이후 코드가 실행되지 않을 수 있습니다.</li>
</ul>
</li>
</ol>
<hr>
<h2 id="🛠-해결-방법">🛠 해결 방법</h2>
<h3 id="✅-2-tktk를-mainthreadexecutor의-root가-아닌-autocomplete에서-다시-생성해서-충돌-가능성">✅ 2. <code>tk.Tk()</code>를 <code>MainThreadExecutor</code>의 root가 아닌 <code>AutoComplete</code>에서 다시 생성해서 충돌 가능성</h3>
<p><code>MainThreadExecutor</code>는 <code>self.root.mainloop()</code>로 메인 이벤트 루프를 이미 돌리고 있습니다. 그런데 <code>AutoComplete.display_meme_gui()</code>에서 다시 <code>tk.Tk()</code>를 호출하는 건 <strong>중복 Tk root 생성으로 비정상 동작</strong>의 원인이 됩니다.</p>
<p><strong>해결책:</strong> <code>AutoComplete</code>에서는 새 <code>Tk()</code>를 만들지 말고 <code>Toplevel()</code>으로 만들어야 합니다.</p>
<pre><code class="language-python">self.root = tk.Toplevel()</code></pre>
<hr>
<h2 id="✅-정리된-체크리스트">✅ 정리된 체크리스트</h2>
<ul>
<li><input checked="" disabled="" type="checkbox"> <code>tk.Tk()</code> → <code>tk.Toplevel()</code>으로 바꾸기 (중복 루트 방지)</li>
</ul>
<hr>
<h2 id="🔚-결론">🔚 결론</h2>
<p>코드 구조상 동작은 맞지만, <strong>Tkinter의 이미지 관리</strong>, <strong>중복 <code>Tk()</code> 루트 생성</strong>, 그리고 <strong>DB 연결의 암시적 종료 시점</strong>이 문제를 일으키고 있습니다.</p>
<p>위 3가지를 고치면 <code>main.py</code>에서도 정상적으로 <code>autocomplete()</code>과 DB 조회가 작동할 것입니다. 원하시면 <code>MemeSelectionGUI</code> 쪽 예시 코드까지 보여드릴게요.</p>
<h4 id=""></h4>
<hr>
<h2 id="깨달음">깨달음</h2>
<p>역시 알기 위해서는 수단과 방법을 가리지 말아야한다. perplexity가 못한걸 chatgpt가 해냈다. 그리고 알기 위해서는 pyimage2 error로 검색했으면 알았을것이다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[What is daemon?]]></title>
            <link>https://velog.io/@minsing-jin/What-is-daemon</link>
            <guid>https://velog.io/@minsing-jin/What-is-daemon</guid>
            <pubDate>Sat, 19 Jul 2025 06:33:52 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/8744bd87-3cb4-4a95-aaf1-0788fc9b9528/image.png" alt=""></p>
<p>In computing, a daemon is a program that runs as a background process, rather than being under the direct control of an interactive user. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[POMDP가 뭐야?]]></title>
            <link>https://velog.io/@minsing-jin/POMDP%EA%B0%80-%EB%AD%90%EC%95%BC</link>
            <guid>https://velog.io/@minsing-jin/POMDP%EA%B0%80-%EB%AD%90%EC%95%BC</guid>
            <pubDate>Sun, 29 Jun 2025 06:20:11 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/7eb01fe5-2570-49d1-8271-1c71ebf71e10/image.png" alt=""></p>
<h2 id="📌-pomdp-구성요소-수식-기반">📌 POMDP 구성요소 (수식 기반)</h2>
<p>POMDP는 다음 7개의 요소로 정의됩니다:</p>
<p>$$
\text{POMDP} = \langle S, A, T, R, O, Z, \gamma \rangle
$$</p>
<table>
<thead>
<tr>
<th>기호</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td>$S$</td>
<td>상태(state)들의 집합</td>
</tr>
<tr>
<td>$A$</td>
<td>행동(action)들의 집합</td>
</tr>
<tr>
<td>$T(s&#39; \mid s, a)$</td>
<td>상태 전이 확률: 행동 $a$를 취했을 때, 상태 $s$에서 $s&#39;$로 전이할 확률</td>
</tr>
<tr>
<td>$R(s, a)$</td>
<td>보상 함수: 상태 $s$에서 행동 $a$를 했을 때의 기대 보상</td>
</tr>
<tr>
<td>$O$</td>
<td>관측값(observation)들의 집합</td>
</tr>
<tr>
<td>$Z(o \mid s&#39;, a)$</td>
<td>관측 확률: $a$를 했을 때 $s&#39;$에 도달한 뒤, 관측값 $o$를 얻을 확률</td>
</tr>
<tr>
<td>$\gamma$</td>
<td>할인율 (0 ≤ $\gamma$ ≤ 1)</td>
</tr>
</tbody></table>
<hr>
<h2 id="📌-1-belief-state-신념-상태">📌 1. <strong>belief state</strong> (신념 상태)</h2>
<p>에이전트는 현재 상태를 직접 알 수 없으므로, 다음과 같이 상태에 대한 확률 분포를 유지합니다:</p>
<p>$$
b(s) = P(\text{현재 상태가 } s)
$$</p>
<p>이를 <strong>belief state</strong>라고 부릅니다.
즉, 상태 공간 $S$에 대해 다음과 같은 확률 분포를 가집니다:</p>
<p>$$
b: S \rightarrow [0, 1], \quad \sum_{s \in S} b(s) = 1
$$</p>
<hr>
<h2 id="📌-2-belief-업데이트-수식-bayes-필터">📌 2. <strong>Belief 업데이트 수식 (Bayes 필터)</strong></h2>
<p>행동 $a$ 후 관측 $o$를 받았을 때 belief를 업데이트하는 수식은:</p>
<p>$$
b&#39;(s&#39;) = \eta \cdot Z(o \mid s&#39;, a) \cdot \sum_{s \in S} T(s&#39; \mid s, a) \cdot b(s)
$$</p>
<p>여기서:</p>
<ul>
<li>$b(s)$: 기존 신념</li>
<li>$T(s&#39; \mid s, a)$: 상태 전이 확률</li>
<li>$Z(o \mid s&#39;, a)$: 관측 확률</li>
<li>$\eta$: 정규화 상수 (전체 합이 1이 되도록)</li>
</ul>
<hr>
<h2 id="📌-3-가치-함수-value-function">📌 3. <strong>가치 함수 (Value Function)</strong></h2>
<p>belief에 기반한 가치 함수는 다음과 같이 정의됩니다:</p>
<p>$$
V(b) = \max_{a \in A} \left[ \sum_{s \in S} b(s) R(s, a) + \gamma \sum_{o \in O} P(o \mid b, a) V(b_{a,o}) \right]
$$</p>
<p>여기서:</p>
<ul>
<li>$P(o \mid b, a)$: belief 상태 $b$에서 행동 $a$ 후 관측 $o$가 나올 확률</li>
<li>$b_{a,o}$: 행동 $a$ 후 관측 $o$에 대한 belief 업데이트 결과</li>
<li>$V(b_{a,o})$: 업데이트된 belief에 대한 가치</li>
</ul>
<hr>
<h2 id="📌-4-관측-확률-계산">📌 4. <strong>관측 확률 계산</strong></h2>
<p>$$
P(o \mid b, a) = \sum_{s&#39;} Z(o \mid s&#39;, a) \sum_{s} T(s&#39; \mid s, a) b(s)
$$</p>
<hr>
<h2 id="🧠-핵심-요약">🧠 핵심 요약</h2>
<table>
<thead>
<tr>
<th>개념</th>
<th>수식</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td>Belief $b(s)$</td>
<td>상태 $s$에 있을 확률</td>
<td></td>
<td></td>
</tr>
<tr>
<td>업데이트</td>
<td>(b&#39;(s&#39;) = \eta Z(o</td>
<td>s&#39;,a) \sum_s T(s&#39;</td>
<td>s,a) b(s))</td>
</tr>
<tr>
<td>가치함수</td>
<td>(V(b) = \max_a [ \sum_s b(s) R(s,a) + \gamma \sum_o P(o</td>
<td>b,a) V(b_{a,o}) ])</td>
<td></td>
</tr>
</tbody></table>
<hr>
<h2 id="❗-어려운-점">❗ 어려운 점</h2>
<ul>
<li><strong>Belief space</strong>는 연속적인 고차원 확률 분포 → 계산량이 매우 큼</li>
<li>그래서 <strong>근사 알고리즘</strong> (예: Particle Filter, Point-based Value Iteration)이 자주 사용됨</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[batch vs batch size]]></title>
            <link>https://velog.io/@minsing-jin/batch-vs-batch-size</link>
            <guid>https://velog.io/@minsing-jin/batch-vs-batch-size</guid>
            <pubDate>Sun, 25 May 2025 05:32:21 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/e29aa75e-bffc-4fd9-a757-7031628e26e2/image.png" alt=""></p>
<h1 id="batch">batch</h1>
<ul>
<li>데이터 Sample 묶음</li>
</ul>
<h1 id="batch-size">batch size</h1>
<ul>
<li>batch 1 묶음에 들어가는 sample의 개수</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[임베딩과 tokenize개념]]></title>
            <link>https://velog.io/@minsing-jin/%EC%9E%84%EB%B2%A0%EB%94%A9%EA%B3%BC-tokenize%EA%B0%9C%EB%85%90</link>
            <guid>https://velog.io/@minsing-jin/%EC%9E%84%EB%B2%A0%EB%94%A9%EA%B3%BC-tokenize%EA%B0%9C%EB%85%90</guid>
            <pubDate>Mon, 12 May 2025 12:24:31 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/8ff55e53-a944-492c-8ad0-db7584523849/image.png" alt=""></p>
<h1 id="tokenize">tokenize</h1>
<ul>
<li>sequence(text, frame으로 나뉘어진 f0음성등)을 token으로 나눠서 수치화한것, 인덱싱으로 매핑한것</li>
</ul>
<h1 id="embedding">embedding</h1>
<ul>
<li>token들에 대해서 의미적인 연관성을 기반으로 배치한것</li>
<li>nn.Embedding 레이어를 통과하던 이미 만들어진 word2vec과 같은 임베딩 모델을 통과하든 첫번째 개념이 상통하면 어떤방식으로든 임베딩이라는 행위를 한것</li>
</ul>
<p><img src="https://velog.velcdn.com/images/minsing-jin/post/f3299e12-8829-44b7-a049-9fd4fa7873e1/image.png" alt=""></p>
<p><a href="https://wikidocs.net/64779">https://wikidocs.net/64779</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[텐서 조작 팁 - unsqueeze는 뭐냐?]]></title>
            <link>https://velog.io/@minsing-jin/%ED%85%90%EC%84%9C-%EC%A1%B0%EC%9E%91-%ED%8C%81-unsqueeze%EB%8A%94-%EB%AD%90%EB%83%90</link>
            <guid>https://velog.io/@minsing-jin/%ED%85%90%EC%84%9C-%EC%A1%B0%EC%9E%91-%ED%8C%81-unsqueeze%EB%8A%94-%EB%AD%90%EB%83%90</guid>
            <pubDate>Mon, 12 May 2025 11:54:15 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/97025a0e-50e2-46fb-a606-eef1704ef249/image.png" alt=""></p>
<h1 id="텐서-조작-팁">텐서 조작 팁</h1>
<p><a href="https://sputnik-kr.tistory.com/229">https://sputnik-kr.tistory.com/229</a></p>
<h1 id="unsqueeze는-뭐냐">unsqueeze는 뭐냐?</h1>
<p><code>unsqueeze</code>는 PyTorch에서 <strong>텐서에 새로운 차원(길이 1인 축)을 추가하는 함수</strong>입니다.<br>예를 들어,  </p>
<ul>
<li><code>quantized_f0</code>의 shape이 <code>(1703,)</code>라면,  </li>
<li><code>quantized_f0.unsqueeze(0)</code>을 하면 shape이 <code>(1, 1703)</code>이 됩니다[2][3][4][7].</li>
</ul>
<p>이렇게 하면 기존에 없던 batch 차원이 생겨서,  </p>
<ul>
<li><code>[1703]</code> → <code>[1][1703]</code><br>즉, <strong>배치가 1개인 시퀀스</strong>처럼 사용할 수 있습니다.</li>
</ul>
<h3 id="왜-쓰나">왜 쓰나?</h3>
<ul>
<li>딥러닝 모델(특히 Conv1d, RNN 등)은 입력에 batch 차원이 있기를 기대합니다.</li>
<li>데이터의 차원을 맞추거나, 연산(broadcasting)이나 네트워크 입력을 위해 자주 사용합니다[4][5][7].</li>
</ul>
<h3 id="예시">예시</h3>
<pre><code class="language-python">import torch
x = torch.tensor([1, 2, 3, 4])       # shape: (4,)
x1 = x.unsqueeze(0)                  # shape: (1, 4)
x2 = x.unsqueeze(1)                  # shape: (4, 1)</code></pre>
<ul>
<li><code>unsqueeze(0)</code>은 맨 앞에 차원을 추가,  </li>
<li><code>unsqueeze(1)</code>은 두 번째 위치에 차원을 추가합니다.</li>
</ul>
<hr>
<p><strong>정리:</strong><br><code>unsqueeze</code>는 텐서에 새로운 차원을 추가해 shape을 바꿔주는 함수입니다.<br>딥러닝에서 배치 차원 등을 맞출 때 필수적으로 사용합니다[2][3][4][5][7].</p>
<p>Citations:
[1] <a href="https://pplx-res.cloudinary.com/image/private/user_uploads/35150927/dcfdae12-8bbe-4f0b-89ae-d9a629d4a871/image.jpg">https://pplx-res.cloudinary.com/image/private/user_uploads/35150927/dcfdae12-8bbe-4f0b-89ae-d9a629d4a871/image.jpg</a>
[2] <a href="https://pplx-res.cloudinary.com/image/private/user_uploads/35150927/dcfdae12-8bbe-4f0b-89ae-d9a629d4a871/image.jpg">https://pplx-res.cloudinary.com/image/private/user_uploads/35150927/dcfdae12-8bbe-4f0b-89ae-d9a629d4a871/image.jpg</a>
[3] <a href="https://pytorch.org/docs/stable/generated/torch.unsqueeze.html">https://pytorch.org/docs/stable/generated/torch.unsqueeze.html</a>
[4] <a href="https://stackoverflow.com/questions/57237352/what-does-unsqueeze-do-in-pytorch">https://stackoverflow.com/questions/57237352/what-does-unsqueeze-do-in-pytorch</a>
[5] <a href="https://www.codecademy.com/resources/docs/pytorch/tensors/unsqueeze">https://www.codecademy.com/resources/docs/pytorch/tensors/unsqueeze</a>
[6] <a href="https://www.codecademy.com/resources/docs/pytorch/tensor-operations/unsqueeze">https://www.codecademy.com/resources/docs/pytorch/tensor-operations/unsqueeze</a>
[7] <a href="https://www.datasciencebyexample.com/2023/05/19/squeeze-and-unsqueeze-in-pytorch/">https://www.datasciencebyexample.com/2023/05/19/squeeze-and-unsqueeze-in-pytorch/</a>
[8] <a href="https://dnmtechs.com/understanding-the-unsqueeze-function-in-pytorch/">https://dnmtechs.com/understanding-the-unsqueeze-function-in-pytorch/</a>
[9] <a href="https://www.projectpro.io/recipes/unsqueeze-torch-tensor">https://www.projectpro.io/recipes/unsqueeze-torch-tensor</a>
[10] <a href="https://blog.naver.com/je_un/222297587260">https://blog.naver.com/je_un/222297587260</a>
[11] <a href="https://codemax.app/snippet/what-does-unsqueeze-do-in-pytorch-in-python/">https://codemax.app/snippet/what-does-unsqueeze-do-in-pytorch-in-python/</a>
[12] <a href="https://stackoverflow.com/questions/57237352/what-does-unsqueeze-do-in-pytorch/57237378">https://stackoverflow.com/questions/57237352/what-does-unsqueeze-do-in-pytorch/57237378</a>
[13] <a href="https://www.tutorialspoint.com/how-to-squeeze-and-unsqueeze-a-tensor-in-pytorch">https://www.tutorialspoint.com/how-to-squeeze-and-unsqueeze-a-tensor-in-pytorch</a>
[14] <a href="https://iifx.dev/en/articles/332257550">https://iifx.dev/en/articles/332257550</a>
[15] <a href="https://sanghyu.tistory.com/86">https://sanghyu.tistory.com/86</a>
[16] <a href="https://www.slingacademy.com/article/pytorch-squeezing-and-unsqueezing-tensors/">https://www.slingacademy.com/article/pytorch-squeezing-and-unsqueezing-tensors/</a>
[17] <a href="https://stackoverflow.com/questions/57237352/what-does-unsqueeze-do-in-pytorch/65831759">https://stackoverflow.com/questions/57237352/what-does-unsqueeze-do-in-pytorch/65831759</a>
[18] <a href="https://www.youtube.com/watch?v=VTryujXrMOs">https://www.youtube.com/watch?v=VTryujXrMOs</a>
[19] <a href="https://blog.csdn.net/chengyq116/article/details/106962842">https://blog.csdn.net/chengyq116/article/details/106962842</a>
[20] <a href="https://researchdatapod.com/understanding-unsqueeze-in-pytorch-a-beginner-friendly-guide/">https://researchdatapod.com/understanding-unsqueeze-in-pytorch-a-beginner-friendly-guide/</a>
[21] <a href="https://myscale.com/blog/mastering-tensor-manipulation-pytorch-guide-torch-unsqueeze/">https://myscale.com/blog/mastering-tensor-manipulation-pytorch-guide-torch-unsqueeze/</a>
[22] <a href="https://pytorch.org/docs/stable/generated/torch.Tensor.unsqueeze.html">https://pytorch.org/docs/stable/generated/torch.Tensor.unsqueeze.html</a></p>
<hr>
<p>Answer from Perplexity: pplx.ai/share</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[nn.Embedding이란]]></title>
            <link>https://velog.io/@minsing-jin/nn.Embedding%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@minsing-jin/nn.Embedding%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Mon, 12 May 2025 11:40:56 GMT</pubDate>
            <description><![CDATA[<h1 id="동기">동기</h1>
<p>내가 아는 embedding의 개념은 자연어 혹은 entity들을 사용자가 원하는 의미적 유사도대로 임베딩 space에 수치화 해서 배치하는것으로 알고 있다. </p>
<p>근데 자연어인 lyrics를 바로 nn.Embedding에 통과 시키는것이 아닌 Lyrics가 이미 vector화 되어있는 텐서 상태로 통과 시키는것일까?</p>
<h1 id="lexical-embedding-방법">lexical embedding 방법</h1>
<p><a href="https://tutorials.pytorch.kr/beginner/nlp/word_embeddings_tutorial.html?_gl=1*ety1mu*_ga*NTA5MzY4Nzc3LjE3NDY0MjkxMTg.*_ga_L5NC8SBFPY*czE3NDcwMzQ3MzMkbzEkZzAkdDE3NDcwMzQ3MzMkajYwJGwwJGgw*_ga_LEHG248408*czE3NDcwMzQ3MzQkbzEkZzAkdDE3NDcwMzQ3MzQkajYwJGwwJGgw">embedding의 과정 - Embedding layer 방식의 embedding</a></p>
<h1 id="background">Background</h1>
<h3 id="embedding이란">Embedding이란</h3>
<h3 id="tokenization이란">tokenization이란</h3>
<h3 id="nnembedding의-작동원리">nn.Embedding의 작동원리</h3>
<ul>
<li>&quot;인덱스&quot;에 대해서 lookup table로 만들어주는것</li>
<li>토큰들(수치화가 되었든 안되었든)에 대해서 인덱스에 대해 아무무 tensor 수치로 L</li>
</ul>
<p>Lyrics 는 토크나이저 -&gt; 일반적인게 아닌 g2p 포니밈용 토크나이저
f0 는 128개의 level이고</p>
<p>Frame -&gt; 시간
128개의 Level은 음의 높낮이로 embedding
애초에 시간으로 하는게 아님 잘못된 접근</p>
<p>임베딩과정
[멜로디]</p>
<ol>
<li>프레임(시간)별로 descrete하게 나뉘어진 128 종류의 Level(음의 높낮이)를 토큰화 시킴</li>
</ol>
<p>ex) 20ms로 나뉘어진 f0</p>
<table>
<thead>
<tr>
<th>단계</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>원본 시퀀스</td>
<td>도   레   미   미   시   파   도</td>
</tr>
<tr>
<td>토큰화</td>
<td>0    1    2    2    4    5    0   → 정수 인덱스로 변환됨</td>
</tr>
<tr>
<td>임베딩 통과</td>
<td>각 토큰 인덱스가 임베딩 벡터로 변환됨 (예: vec1, vec2, ..., vecN)</td>
</tr>
<tr>
<td>임베딩 결과</td>
<td>vec0 vec1 vec2 vec2 vec4 vec5 vec0 → 각 토큰별 의미 벡터</td>
</tr>
<tr>
<td>Mean Pooling</td>
<td>전체 시퀀스의 임베딩 벡터 평균을 계산하여 길이 1의 벡터로 축소됨</td>
</tr>
<tr>
<td>최종 출력</td>
<td>평균 임베딩 벡터 (예: mean(vec0, vec1, vec2, vec2, vec4, vec5, vec0))</td>
</tr>
</tbody></table>
<ul>
<li>결과물은 도 레 미 미 시 파 도의 representation이 만들어짐</li>
<li>각각의 Vector들로 나오는것은 수치화된 도, 레, 미, 미, 시, 파, 도와 매핑이 되어있음.</li>
</ul>
<h3 id="lookup-table이란">Lookup table이란</h3>
<ul>
<li>token들의 &quot;인덱스&quot;별 vector representation</li>
</ul>
<p><img src="https://velog.velcdn.com/images/minsing-jin/post/de38bb5b-3de9-4dc7-8c95-a3b7331fae83/image.png" alt=""></p>
<pre><code class="language-python">CONTEXT_SIZE = 2
EMBEDDING_DIM = 10
# 셰익스피어 소네트(Sonnet) 2를 사용하겠습니다.
test_sentence = &quot;&quot;&quot;When forty winters shall besiege thy brow,
And dig deep trenches in thy beauty&#39;s field,
Thy youth&#39;s proud livery so gazed on now,
Will be a totter&#39;d weed of small worth held:
Then being asked, where all thy beauty lies,
Where all the treasure of thy lusty days;
To say, within thine own deep sunken eyes,
Were an all-eating shame, and thriftless praise.
How much more praise deserv&#39;d thy beauty&#39;s use,
If thou couldst answer &#39;This fair child of mine
Shall sum my count, and make my old excuse,&#39;
Proving his beauty by succession thine!
This were to be new made when thou art old,
And see thy blood warm when thou feel&#39;st it cold.&quot;&quot;&quot;.split()
# 원래는 입력을 제대로 토큰화(tokenize) 해야하지만 이번엔 간소화하여 진행하겠습니다.
# 튜플로 이루어진 리스트를 만들겠습니다. 각 튜플은 ([ i-CONTEXT_SIZE 번째 단어, ..., i-1 번째 단어 ], 목표 단어)입니다.
ngrams = [
    (
        [test_sentence[i - j - 1] for j in range(CONTEXT_SIZE)],
        test_sentence[i]
    )
    for i in range(CONTEXT_SIZE, len(test_sentence))
]
# 첫 3개의 튜플을 출력하여 데이터가 어떻게 생겼는지 보겠습니다.
print(ngrams[:3])

vocab = set(test_sentence)
word_to_ix = {word: i for i, word in enumerate(vocab)}


class NGramLanguageModeler(nn.Module):

    def __init__(self, vocab_size, embedding_dim, context_size):
        super(NGramLanguageModeler, self).__init__()
        self.embeddings = nn.Embedding(vocab_size, embedding_dim)
        self.linear1 = nn.Linear(context_size * embedding_dim, 128)
        self.linear2 = nn.Linear(128, vocab_size)

    def forward(self, inputs):
        embeds = self.embeddings(inputs).view((1, -1))
        out = F.relu(self.linear1(embeds))
        out = self.linear2(out)
        log_probs = F.log_softmax(out, dim=1)
        return log_probs


losses = []
loss_function = nn.NLLLoss()
model = NGramLanguageModeler(len(vocab), EMBEDDING_DIM, CONTEXT_SIZE)
optimizer = optim.SGD(model.parameters(), lr=0.001)

for epoch in range(10):
    total_loss = 0
    for context, target in ngrams:

        # 첫번째. 모델에 넣어줄 입력값을 준비합니다. (i.e, 단어를 정수 인덱스로
        # 바꾸고 파이토치 텐서로 감싸줍시다.)
        context_idxs = torch.tensor([word_to_ix[w] for w in context], dtype=torch.long)

        # 두번째. 토치는 기울기가 *누적* 됩니다. 새 인스턴스를 넣어주기 전에
        # 기울기를 초기화합니다.
        model.zero_grad()

        # 세번째. 순전파를 통해 다음에 올 단어에 대한 로그 확률을 구합니다.
        log_probs = model(context_idxs)

        # 네번째. 손실함수를 계산합니다. (파이토치에서는 목표 단어를 텐서로 감싸줘야 합니다.)
        loss = loss_function(log_probs, torch.tensor([word_to_ix[target]], dtype=torch.long))

        # 다섯번째. 역전파를 통해 기울기를 업데이트 해줍니다.
        loss.backward()
        optimizer.step()

        # tensor.item()을 호출하여 단일원소 텐서에서 숫자를 반환받습니다.
        total_loss += loss.item()
    losses.append(total_loss)
print(losses)  # 반복할 때마다 손실이 줄어드는 것을 봅시다!

# &quot;beauty&quot;와 같이 특정 단어에 대한 임베딩을 확인하려면,
print(model.embeddings.weight[word_to_ix[&quot;beauty&quot;]])</code></pre>
<blockquote>
<p><a href="https://tutorials.pytorch.kr/beginner/nlp/word_embeddings_tutorial.html?_gl=1*ety1mu*_ga*NTA5MzY4Nzc3LjE3NDY0MjkxMTg.*_ga_L5NC8SBFPY*czE3NDcwMzQ3MzMkbzEkZzAkdDE3NDcwMzQ3MzMkajYwJGwwJGgw*_ga_LEHG248408*czE3NDcwMzQ3MzQkbzEkZzAkdDE3NDcwMzQ3MzQkajYwJGwwJGgw">파이토치 한국어 갤러리 코드 참고</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[왜 nn.Embedding을 하면 transpose를 하는걸까?]]></title>
            <link>https://velog.io/@minsing-jin/%EC%99%9C-nn.Embedding%EC%9D%84-%ED%95%98%EB%A9%B4-transpose%EB%A5%BC-%ED%95%98%EB%8A%94%EA%B1%B8%EA%B9%8C</link>
            <guid>https://velog.io/@minsing-jin/%EC%99%9C-nn.Embedding%EC%9D%84-%ED%95%98%EB%A9%B4-transpose%EB%A5%BC-%ED%95%98%EB%8A%94%EA%B1%B8%EA%B9%8C</guid>
            <pubDate>Mon, 12 May 2025 11:34:32 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/32d7307b-960f-4501-a8a2-46078a49898f/image.png" alt=""></p>
<h1 id="동기">동기</h1>
<p>lyrics encoder과 melodyU encoder를 Summation한 뒤의 shape는 (1, 192, 1) - (b, h, time(seq_len))이다. 요녀석들은 enhanced condition encoder에서 다시 FFT 연산을 하는데 동일하게 nn.Embedding과 transpose를 해주었더니 시원하게 오류가 나온다.</p>
<h1 id="문제정의-및-해결-요약">문제정의 및 해결 요약</h1>
<ol>
<li><p>임베딩된 산출물은 nn.Embedding layer를 통과할 필요가 없음. + nn.Embedding의 정의</p>
<ul>
<li>nn.Embedding은 token별 인덱스를 기반으로 lookup table을 만드는 녀석이다. 고로 lyrics representation과 melodyU representation의 summation은 이미 Embedding의 결과물끼리 더한것이므로 float에다가 인덱스도 없으므로 nn.Embedding을 할수 없다.</li>
</ul>
</li>
</ol>
<ol start="2">
<li>transpose는 nn.Embedding layer를 통과해서 다시 정상화 시키기 위한 녀석<ul>
<li>[b,h,t]가 nn.Embedding layer를 통과하면 [b,t,h]가 되어서 다시 정상화 시키기 위해서 transpose를 시킨다.<ul>
<li>transformer encoder의 ffn이 통과할때는 [b,h,t]로 되어야함.</li>
</ul>
</li>
</ul>
</li>
</ol>
<h1 id="세부설명">세부설명</h1>
<p>PyTorch의 <code>nn.Conv1d</code> 레이어는 입력 텐서의 shape이 <strong>[batch, channels, length]</strong> 형태이길 기대합니다.<br>하지만 자연어 처리 등에서 임베딩을 거친 텐서는 보통 <strong>[batch, length, embedding_dim]</strong> (즉, [배치, 시퀀스 길이, 임베딩 차원]) 형태로 나옵니다.</p>
<p>예를 들어,  </p>
<ul>
<li>임베딩 후 텐서: <code>[batch, time, hidden]</code>  </li>
<li>Conv1d 기대 입력: <code>[batch, hidden, time]</code></li>
</ul>
<p>따라서, <strong>Conv1d에 입력하기 전에 <code>transpose</code> 또는 <code>permute</code>를 사용해 두 차원의 순서를 바꿔줘야 합니다</strong>.  
이렇게 해야만 Conv1d가 임베딩 차원을 채널로 인식하고, 시퀀스 길이를 커널이 따라가며 합성곱 연산을 올바르게 수행할 수 있습니다[6][8].</p>
<blockquote>
<p>&quot;In pytorch your input shape of[6] should actually be[6] where the feature length is represented by the channel dimension and sequence length is the length dimension. Then you can define your conv1d with in/out channels of 768 and 100 respectively to get an output of[6].<br>... you can convert it to the correct shape with Tensor.transpose.&quot;[6]</p>
</blockquote>
<p>즉,  </p>
<ul>
<li><strong>transpose는 임베딩 결과([batch, seq_len, hidden])를 Conv1d가 기대하는 입력([batch, hidden, seq_len])으로 맞추기 위해 반드시 필요합니다.</strong></li>
</ul>
<p>이것이 바로 Conv1d 앞에서 transpose를 하는 이유입니다.</p>
<p>Citations:
[1] <a href="https://cumulu-s.tistory.com/29">https://cumulu-s.tistory.com/29</a>
[2] <a href="https://pytorch.org/docs/stable/generated/torch.nn.ConvTranspose1d.html">https://pytorch.org/docs/stable/generated/torch.nn.ConvTranspose1d.html</a>
[3] <a href="https://velog.io/@gilson/View-and-Reshape-VS-permute-and-transpose">https://velog.io/@gilson/View-and-Reshape-VS-permute-and-transpose</a>
[4] <a href="https://jisuhan.tistory.com/128">https://jisuhan.tistory.com/128</a>
[5] <a href="https://westlife0615.tistory.com/257">https://westlife0615.tistory.com/257</a>
[6] <a href="https://stackoverflow.com/questions/62372938/understanding-input-shape-to-pytorch-conv1d">https://stackoverflow.com/questions/62372938/understanding-input-shape-to-pytorch-conv1d</a>
[7] <a href="https://dacon.io/forum/406022">https://dacon.io/forum/406022</a>
[8] <a href="https://discuss.pytorch.org/t/understanding-input-shape-to-pytorch-conv1d/85429">https://discuss.pytorch.org/t/understanding-input-shape-to-pytorch-conv1d/85429</a>
[9] <a href="https://www.thespacemoon.com/2021/03/03/pytorch-view-reshape-transpose/">https://www.thespacemoon.com/2021/03/03/pytorch-view-reshape-transpose/</a>
[10] <a href="https://sksdudtjs.tistory.com/50">https://sksdudtjs.tistory.com/50</a>
[11] <a href="https://iamseungjun.tistory.com/15">https://iamseungjun.tistory.com/15</a>
[12] <a href="https://jimmy-ai.tistory.com/378">https://jimmy-ai.tistory.com/378</a>
[13] <a href="https://stackoverflow.com/questions/69915792/pytorch-conv1d-gives-different-size-to-convtranspose1d">https://stackoverflow.com/questions/69915792/pytorch-conv1d-gives-different-size-to-convtranspose1d</a>
[14] <a href="https://wikidocs.net/64779">https://wikidocs.net/64779</a>
[15] <a href="https://imlim0813.tistory.com/58">https://imlim0813.tistory.com/58</a>
[16] <a href="https://velog.io/@workhard/lstm-9.-pytorch-%EC%82%AC%EC%9A%A9%EB%B2%95">https://velog.io/@workhard/lstm-9.-pytorch-%EC%82%AC%EC%9A%A9%EB%B2%95</a>
[17] <a href="https://wikidocs.net/217064">https://wikidocs.net/217064</a>
[18] <a href="https://leeejihyun.tistory.com/37">https://leeejihyun.tistory.com/37</a></p>
<hr>
<p>Answer from Perplexity: pplx.ai/share</p>
<hr>
<h1 id="embedding하면-shape가-달라지는-근거">embedding하면 shape가 달라지는 근거</h1>
<p>임베딩 레이어(Embedding Layer)를 거친 텐서의 shape이 <code>[batch, length, embedding_dim]</code>이 되는 이유는 임베딩 레이어의 동작 방식과 자연어 처리 데이터의 구조 때문입니다.</p>
<h3 id="1-임베딩-레이어의-입력과-출력-구조">1. 임베딩 레이어의 입력과 출력 구조</h3>
<ul>
<li><p>임베딩 레이어는 <strong>정수 인덱스 시퀀스</strong>(예: 단어 인덱스)를 입력으로 받습니다.</p>
</li>
<li><p>입력 shape: <code>(batch_size, sequence_length)</code>  </p>
<ul>
<li><code>batch_size</code>: 한 번에 처리하는 문장(또는 샘플)의 개수  </li>
<li><code>sequence_length</code>: 각 문장의 토큰(단어) 수</li>
</ul>
</li>
<li><p>임베딩 레이어는 각 인덱스를 임베딩 테이블에서 벡터로 변환합니다.</p>
</li>
<li><p>출력 shape: <code>(batch_size, sequence_length, embedding_dim)</code>  </p>
<ul>
<li><code>embedding_dim</code>: 각 단어를 표현하는 벡터의 차원</li>
</ul>
</li>
</ul>
<blockquote>
<p>&quot;Embedding()은 (number of samples, input_length)인 2D 정수 텐서를 입력받습니다. 이 때 각 sample은 정수 인코딩이 된 결과로, 정수의 시퀀스입니다. Embedding()은 워드 임베딩 작업을 수행하고 (number of samples, input_length, embedding word dimentionality)인 3D 실수 텐서를 리턴합니다.&quot;  </p>
<ul>
<li>[위키독스, 케라스 임베딩 층 설명][5][6]</li>
</ul>
</blockquote>
<h3 id="2-자연어-처리에서-임베딩-레이어-사용-예시">2. 자연어 처리에서 임베딩 레이어 사용 예시</h3>
<p>예를 들어,  </p>
<ul>
<li>입력: <code>[[1,[2][3], [4, 5,6]]</code> (batch_size=2, sequence_length=3)</li>
<li>임베딩 차원(embedding_dim)=8이라면  </li>
<li>출력: <code>(2, 3, 8)</code>  <ul>
<li>각 단어 인덱스가 8차원 벡터로 변환됨</li>
</ul>
</li>
</ul>
<h3 id="3-왜-이런-구조가-되는가">3. 왜 이런 구조가 되는가?</h3>
<ul>
<li><strong>각 문장(샘플)은 여러 단어(토큰)로 구성</strong>  </li>
<li><strong>각 단어는 하나의 임베딩 벡터로 변환</strong>  </li>
<li>따라서,  <ul>
<li>첫 번째 차원: 배치(문장)  </li>
<li>두 번째 차원: 시퀀스 길이(토큰 수)  </li>
<li>세 번째 차원: 임베딩 벡터 차원</li>
</ul>
</li>
</ul>
<h3 id="4-공식-문서-및-교재-근거">4. 공식 문서 및 교재 근거</h3>
<ul>
<li>&quot;Embedding 층은 크기가 (samples, sequence_length, embedding_dimensionality)인 3D 실수형 텐서를 반환한다.&quot;<br>[위키독스][5][6]</li>
<li>&quot;임베딩 레이어는 입력 시퀀스의 각 인덱스를 임베딩 테이블에서 벡터로 변환하여 (배치, 시퀀스 길이, 임베딩 차원) 형태로 출력한다.&quot;<br>[simling.tistory][3][5]</li>
</ul>
<hr>
<p><strong>정리:</strong><br>임베딩 레이어는 입력이 <code>[batch, sequence_length]</code>일 때, 각 인덱스를 임베딩 벡터로 변환해 <code>[batch, sequence_length, embedding_dim]</code> 형태의 텐서를 반환합니다. 이 구조는 자연어 처리에서 각 문장(배치), 각 단어(시퀀스), 각 임베딩 벡터(임베딩 차원)로 구성되기 때문입니다[5][6][3].</p>
<p>Citations:
[1] <a href="https://tech.kakao.com/posts/585">https://tech.kakao.com/posts/585</a>
[2] <a href="https://wikidocs.net/31379">https://wikidocs.net/31379</a>
[3] <a href="https://simpling.tistory.com/1">https://simpling.tistory.com/1</a>
[4] <a href="https://ebbnflow.tistory.com/154">https://ebbnflow.tistory.com/154</a>
[5] <a href="https://ingu627.github.io/keras/keras_ch6_org_1/">https://ingu627.github.io/keras/keras_ch6_org_1/</a>
[6] <a href="https://wikidocs.net/33793">https://wikidocs.net/33793</a>
[7] <a href="https://wikidocs.net/37001">https://wikidocs.net/37001</a>
[8] <a href="https://velog.io/@oilyhand_01/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EA%B8%B0%EC%B4%88-14">https://velog.io/@oilyhand_01/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EA%B8%B0%EC%B4%88-14</a>
[9] <a href="https://velog.io/@yenaryu/%EC%9E%90%EC%97%B0%EC%96%B4%EC%B2%98%EB%A6%AC-%EC%9E%91%EC%82%AC%EA%B0%80-%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%EB%A7%8C%EB%93%A4%EA%B8%B0">https://velog.io/@yenaryu/%EC%9E%90%EC%97%B0%EC%96%B4%EC%B2%98%EB%A6%AC-%EC%9E%91%EC%82%AC%EA%B0%80-%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%EB%A7%8C%EB%93%A4%EA%B8%B0</a>
[10] <a href="https://heeya-stupidbutstudying.tistory.com/entry/DL-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC%EC%97%90%EC%84%9C%EC%9D%98-%EB%8B%A8%EC%96%B4-%ED%91%9C%ED%98%84-Word-Embedding">https://heeya-stupidbutstudying.tistory.com/entry/DL-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC%EC%97%90%EC%84%9C%EC%9D%98-%EB%8B%A8%EC%96%B4-%ED%91%9C%ED%98%84-Word-Embedding</a>
[11] <a href="https://blog.naver.com/iwin1203/222010971529">https://blog.naver.com/iwin1203/222010971529</a>
[12] <a href="https://aigaeddo.tistory.com/37">https://aigaeddo.tistory.com/37</a>
[13] <a href="https://www.youtube.com/watch?v=BbBCLPl0x_U">https://www.youtube.com/watch?v=BbBCLPl0x_U</a>
[14] <a href="https://www.ibm.com/kr-ko/think/topics/vector-embedding">https://www.ibm.com/kr-ko/think/topics/vector-embedding</a>
[15] <a href="https://sjh9708.tistory.com/231">https://sjh9708.tistory.com/231</a>
[16] <a href="https://dusanbaek.tistory.com/99">https://dusanbaek.tistory.com/99</a>
[17] <a href="https://wikidocs.net/22660">https://wikidocs.net/22660</a>
[18] <a href="https://cumulu-s.tistory.com/4">https://cumulu-s.tistory.com/4</a>
[19] <a href="https://soyoung-new-challenge.tistory.com/32">https://soyoung-new-challenge.tistory.com/32</a></p>
<hr>
<p>Answer from Perplexity: pplx.ai/share</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[딥러닝 용어 정리]]></title>
            <link>https://velog.io/@minsing-jin/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EC%9A%A9%EC%96%B4-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@minsing-jin/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EC%9A%A9%EC%96%B4-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 11 May 2025 13:22:56 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/dadeec1a-6a7d-4313-9c7d-e2a088820873/image.png" alt=""></p>
<h1 id="b-h-timeseq_len">[b, h, time(seq_len)]</h1>
<ul>
<li><p>Batch size</p>
</li>
<li><p>hidden channel</p>
</li>
<li><p>sequence length</p>
</li>
</ul>
<h1 id="임베딩-차원">임베딩 차원</h1>
<ul>
<li>데이터가 표현되는백터 공간의 차원수=</li>
</ul>
<h1 id="nnembedding">nn.Embedding</h1>
<h1 id="input-channel">input channel</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[Mean pooling - 임베딩 차원 맞춰보자이]]></title>
            <link>https://velog.io/@minsing-jin/Mean-pooling-%EC%9E%84%EB%B2%A0%EB%94%A9-%EC%B0%A8%EC%9B%90-%EB%A7%9E%EC%B6%B0%EB%B3%B4%EC%9E%90%EC%9D%B4</link>
            <guid>https://velog.io/@minsing-jin/Mean-pooling-%EC%9E%84%EB%B2%A0%EB%94%A9-%EC%B0%A8%EC%9B%90-%EB%A7%9E%EC%B6%B0%EB%B3%B4%EC%9E%90%EC%9D%B4</guid>
            <pubDate>Sat, 10 May 2025 14:33:50 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/fdb95cb6-e315-4a89-ba47-67e99cbb6794/image.png" alt=""></p>
<h1 id="문제">문제</h1>
<p>Lyrics와 quantized f0된 melody를 FFT encoding을 하면 [batch size, hidden channel, time(seq_len)-&gt; 시퀀스 Length]가 나온다.
sequence length가 다를 수도 있지 않누??</p>
<h1 id="해결">해결</h1>
<p>mean pooling을 하세유~~</p>
<p>hidden channel의 각 feature마다 Mean을 때려서 seq len을 1로 맞춤 -&gt; melody도 마찬가지</p>
<p>ex)</p>
<pre><code class="language-python">  ------hidden channel---------
김  
민
재
짜
스
  mean mean mean mean mean mean ....
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 getter -> __getitem__이란?]]></title>
            <link>https://velog.io/@minsing-jin/%ED%8C%8C%EC%9D%B4%EC%8D%AC-getter-getitem%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@minsing-jin/%ED%8C%8C%EC%9D%B4%EC%8D%AC-getter-getitem%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Mon, 05 May 2025 07:19:35 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/e8e51565-53b0-490a-966b-bf7fb019bcb9/image.png" alt=""></p>
<p><code>__getitem__</code>은 파이썬에서 <strong>객체가 인덱싱(<code>obj[key]</code>) 또는 슬라이싱(<code>obj[start:stop]</code>)될 때 호출되는 메서드</strong>입니다. 이 메서드를 클래스 안에 정의하면, 해당 클래스의 인스턴스를 리스트나 딕셔너리처럼 사용할 수 있습니다.</p>
<hr>
<h3 id="📌-기본-사용법">📌 기본 사용법</h3>
<pre><code class="language-python">class MyList:
    def __init__(self, data):
        self.data = data

    def __getitem__(self, index):
        print(f&quot;Called with index: {index}&quot;)
        return self.data[index]

my_list = MyList([10, 20, 30])
print(my_list[1])  # =&gt; Called with index: 1
                   # =&gt; 20</code></pre>
<hr>
<h3 id="🎯-주요-특징">🎯 주요 특징</h3>
<ul>
<li><code>obj[key]</code>가 호출되면 <code>obj.__getitem__(key)</code>가 자동으로 호출됩니다.</li>
<li><code>key</code>는 정수뿐만 아니라 슬라이스(slice), 튜플, 문자열 등도 될 수 있습니다.</li>
</ul>
<hr>
<h3 id="✅-슬라이싱도-지원-가능">✅ 슬라이싱도 지원 가능</h3>
<pre><code class="language-python">class MyList:
    def __init__(self, data):
        self.data = data

    def __getitem__(self, index):
        print(f&quot;Index received: {index}&quot;)
        return self.data[index]

lst = MyList([1, 2, 3, 4, 5])
print(lst[1:4])  # 슬라이스 객체(slice(1,4,None))가 전달됨</code></pre>
<hr>
<h3 id="📦-예제-2차원-배열-흉내내기">📦 예제: 2차원 배열 흉내내기</h3>
<pre><code class="language-python">class Matrix:
    def __init__(self, rows):
        self.rows = rows

    def __getitem__(self, index):
        return self.rows[index]

m = Matrix([[1, 2], [3, 4]])
print(m[0][1])  # 2</code></pre>
<hr>
<h3 id="⚠️-주의사항">⚠️ 주의사항</h3>
<ul>
<li><code>__getitem__</code>은 <strong>읽기 전용</strong>입니다. 쓰기를 하려면 <code>__setitem__</code>을 정의해야 합니다.</li>
<li><code>KeyError</code>, <code>IndexError</code> 등을 적절히 처리해주는 것이 좋습니다.</li>
</ul>
<hr>
<p>궁금하다면 <code>__setitem__</code>, <code>__delitem__</code> 도 함께 설명해줄 수 있어요. 추가로 알려드릴까요?</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[중첩된 여러 자료구조의 Element에 Func mapping하는법]]></title>
            <link>https://velog.io/@minsing-jin/%EC%A4%91%EC%B2%A9%EB%90%9C-%EC%97%AC%EB%9F%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%9D%98-Element%EC%97%90-Func-mapping%ED%95%98%EB%8A%94%EB%B2%95</link>
            <guid>https://velog.io/@minsing-jin/%EC%A4%91%EC%B2%A9%EB%90%9C-%EC%97%AC%EB%9F%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%9D%98-Element%EC%97%90-Func-mapping%ED%95%98%EB%8A%94%EB%B2%95</guid>
            <pubDate>Sun, 04 May 2025 14:41:35 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/28c8fdd6-980e-4ad8-bd68-f32f5f3613c5/image.png" alt=""></p>
<p>nest_map을 만드세유</p>
<pre><code class="language-python">def nested_map(struct, map_fn):
    if isinstance(struct, tuple):
        return tuple(nested_map(x, map_fn) for x in struct)
    if isinstance(struct, list):
        return [nested_map(x, map_fn) for x in struct]
    if isinstance(struct, dict):
        return {k: nested_map(v, map_fn) for k, v in struct.items()}
    return map_fn(struct)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Stack -> Min value구하기]]></title>
            <link>https://velog.io/@minsing-jin/Stack-Min-value%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@minsing-jin/Stack-Min-value%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 28 Mar 2025 08:15:33 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/40d5cf2a-99dd-4a15-899b-3b1f6fa5e747/image.png" alt=""></p>
<h1 id="직관">직관</h1>
<h2 id="sol-1-두개의-arr">Sol 1. 두개의 arr</h2>
<ol>
<li>arr 2개</li>
</ol>
<ul>
<li>stack</li>
<li>min_stack</li>
</ul>
<ol start="2">
<li>stack은 그대로 구현</li>
<li>min_stack은 stack이 반복될때마다 계속 반복적으로 최소값을 각각의 idx로 할당</li>
</ol>
<p>top이라는 Int idx를 Cursor로 활용해서 stack을 구현</p>
<h2 id="sol-2-하나의-arr로-수학적-트릭">Sol 2. 하나의 arr로 수학적 트릭</h2>
<p>홀수번째 Idx는 stack
짝수번째 idx는 min_stack</p>
<h2 id="sol-2-하나의-arr-수학적-트릭-2---아직-70">Sol 2. 하나의 arr 수학적 트릭 2 -&gt; 아직 70%</h2>
<ul>
<li><p>오직 min stack만 꺼낼 수 있는 수학적 트릭임!!</p>
</li>
<li><p>Push 연산</p>
</li>
<li><blockquote>
<p>2x - minElem</p>
</blockquote>
</li>
<li><blockquote>
<p>새로운 input x보다 작은지 큰지를 판별 -&gt; 나중에 pop 할때 min value를 복원해야할지에 대한 여부를 결정해줌
단, 새로 Push된 값이 min value보다 크다면 stack에 그냥 넣어줌</p>
</blockquote>
</li>
<li><p>Pop 연산</p>
</li>
<li><blockquote>
<p>2x-prevMinEle(stack의 이전값)</p>
</blockquote>
</li>
<li><blockquote>
<p>새로운 최소값은 2<em>minEle - y = 2</em>x - (2*x - prevMinEle) = prevMinEle로 계산됩니다.
단, pop된 값이 min value보다 크다면 그대로 진행</p>
</blockquote>
</li>
</ul>
<pre><code class="language-//">// all operations in O(1) time and O(1) extra space.

#include &lt;iostream&gt;
#include &lt;stack&gt;
using namespace std;

// A user defined stack that supports getMin() in
// addition to push(), pop() and peek()
class SpecialStack {
  private:
    stack&lt;int&gt; s;
    int minEle;

  public:
    SpecialStack() {
        minEle = -1;
    }

    // Add an element to the top of Stack
    void push(int x) {
        if (s.empty()) {
            minEle = x;
            s.push(x);
        }

        // If new number is less than minEle
        else if (x &lt; minEle) {
            s.push(2 * x - minEle);
            minEle = x;
        }

        else {
            s.push(x);
        }
    }

    // Remove the top element from the Stack
    void pop() {
        if (s.empty()) {
            return ;
        }

        int top = s.top();
        s.pop();

        // Minimum will change, if the minimum element
        // of the stack is being removed.
        if (top &lt; minEle) {
            minEle = 2 * minEle - top;
        }
    }

    // Returns top element of the Stack
    int peek() {
        if (s.empty()) {
            return -1;
        }

        int top = s.top();

        // If minEle &gt; top means minEle stores value of top.
        return (minEle &gt; top) ? minEle : top;
    }

    // Finds minimum element of Stack
    int getMin() {
        if (s.empty())
            return -1;

        // variable minEle stores the minimum element
        // in the stack.
        return minEle;
    }
};

int main() {
    SpecialStack ss;

    // Function calls
    ss.push(2);
    ss.push(3);
    cout &lt;&lt; ss.peek() &lt;&lt; &quot; &quot;;
    ss.pop();
    cout &lt;&lt; ss.getMin() &lt;&lt; &quot; &quot;;
    ss.push(1);
    cout &lt;&lt; ss.getMin() &lt;&lt; &quot; &quot;;
}</code></pre>
<h3 id="push가-동작하는-원리">push가 동작하는 원리</h3>
<pre><code>How 2*x – minEle is less than x in push()? 


x &lt; minEle which means x – minEle &lt; 0 


// Adding x on both sides
x – minEle + x &lt; 0 + x 
2*x – minEle &lt; x 
We can conclude 2*x – minEle &lt; new minEle </code></pre><h3 id="pop이-복원되는-이유">pop이 복원되는 이유</h3>
<pre><code>How previous minimum element, prevMinEle is, 2*minEle – y
in pop() is y the popped element?


 // We pushed y as 2x – prevMinEle. Here 
// prevMinEle is minEle before y was inserted


y = 2*x – prevMinEle  


// Value of minEle was made equal to x
minEle = x 


new minEle = 2 * minEle – y 
                   = 2*x – (2*x – prevMinEle)
                   = prevMinEle // This is what we wanted
</code></pre><p><a href="https://www.geeksforgeeks.org/design-a-stack-that-supports-getmin-in-o1-time-and-o1-extra-space/">https://www.geeksforgeeks.org/design-a-stack-that-supports-getmin-in-o1-time-and-o1-extra-space/</a></p>
<h2 id="sol-3-linked-list">Sol 3. Linked list</h2>
<h2 id="sol4-stack-std사용사용">Sol4. stack std사용사용</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[베이즈 정리의 해석]]></title>
            <link>https://velog.io/@minsing-jin/%EB%B2%A0%EC%9D%B4%EC%A6%88-%EC%A0%95%EB%A6%AC%EC%9D%98-%ED%95%B4%EC%84%9D</link>
            <guid>https://velog.io/@minsing-jin/%EB%B2%A0%EC%9D%B4%EC%A6%88-%EC%A0%95%EB%A6%AC%EC%9D%98-%ED%95%B4%EC%84%9D</guid>
            <pubDate>Mon, 03 Mar 2025 07:22:20 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/ca3bedce-1ee0-4516-af38-81a9ec7d55cb/image.png" alt=""></p>
<h1 id="핵심-내용">핵심 내용</h1>
<p>필자의 해석이므로 틀린부분이 있다면 지적해주세요!</p>
<ul>
<li><p>베이지안 관점의 확률: 기존의 evidence(이미 일어난 단서들, 확률로 표현)와 hypothesis()를 기반으로 미래의 &#39;가능성&#39;, 즉 미래의 불확실성을 <strong>예측</strong>하는 개념이다. (귀납)</p>
</li>
<li><blockquote>
<p>기존: 특정 사건들에 대한 관측값의 빈도 기반으로 현상을 <strong>해석</strong>(연역)</p>
</blockquote>
</li>
<li><p>Evidence: 새로운 정보, <strong>단서</strong></p>
</li>
<li><p>Hypothesis(prior, 사전확률): 어떤 사건이 발생했다는 주장</p>
</li>
<li><p>posterior(사후 확률): E(새로운 정보)가 들어왔을때 H가 업데이트 되는 확률(이것으로 미래를 예측한다)</p>
</li>
</ul>
<p>-&gt; evidence를 관측하기 전후의 내주장에 대한 신뢰도</p>
<p><img src="https://velog.velcdn.com/images/minsing-jin/post/e7e99f58-be72-4626-85de-403ceaa5907e/image.png" alt=""></p>
<h1 id="베이즈정리의-정의">베이즈정리의 정의</h1>
<ul>
<li>베이즈 정리: 새로운 정보를 토대로 어떤 사건이 발생했다는 주장에 대한 신뢰도(예측할 미래에 대한 가능성)를 <strong>갱신</strong>해 나가는 방법</li>
</ul>
<p><a href="https://angeloyeo.github.io/2020/01/09/Bayes_rule.html">공돌이의 수학노트 고트 해석</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[기댓값 vs 평균, 왜 llm paper에서는 기댓값을 사용할까?]]></title>
            <link>https://velog.io/@minsing-jin/%EA%B8%B0%EB%8C%93%EA%B0%92-vs-%ED%8F%89%EA%B7%A0-%EC%99%9C-llm-paper%EC%97%90%EC%84%9C%EB%8A%94-%EA%B8%B0%EB%8C%93%EA%B0%92%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C</link>
            <guid>https://velog.io/@minsing-jin/%EA%B8%B0%EB%8C%93%EA%B0%92-vs-%ED%8F%89%EA%B7%A0-%EC%99%9C-llm-paper%EC%97%90%EC%84%9C%EB%8A%94-%EA%B8%B0%EB%8C%93%EA%B0%92%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C</guid>
            <pubDate>Mon, 03 Mar 2025 07:01:54 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/d82896c8-70f9-4d82-9e17-b98a54cd1ec7/image.png" alt=""></p>
<h1 id="기댓값-vs-평균">기댓값 vs 평균</h1>
<ul>
<li><p>기댓값: 미래를 예측하기 위해서 확률들을 기반으로 구한값, 미래 가능한 결과에 대한 예측값(귀납-경험/관찰/증거에 기반한 미래 예측 판단)</p>
</li>
<li><p>평균: 빈도주의 관점으로 기존 데이터들을 가지고 구한값, 이미 관측된 데이터를 가지고 확실한 값(연역-이미 알고있는 데이터 가지고 판단)</p>
</li>
</ul>
<p>왜 twist smc, llm에서는 기댓값을 쓰는가? 평균이랑 기댓값은 똑같은거 아니누?
llm은 사전 정보들을 기반으로 불확실한 수치를 계속해서 prior를 업데이트하는 베이지안 관점이기 때문에 기댓값을 사용한다. </p>
<h1 id="이것이-가우시안-베이지안의-관점-차이">이것이 가우시안 베이지안의 관점 차이?!</h1>
<p>가우시안: 빈도와 같은 관측값으로부터 현상 분석 및 결론(정규분포)
베이지안: 경험적인 확률들 기반으로 미래 예측(확률)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[여러분은 AI 답변을 어떻게 신뢰하시나요?]]></title>
            <link>https://velog.io/@minsing-jin/%EC%97%AC%EB%9F%AC%EB%B6%84%EC%9D%80-AI-%EB%8B%B5%EB%B3%80%EC%9D%84-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A0%EB%A2%B0%ED%95%98%EC%8B%9C%EB%82%98%EC%9A%94</link>
            <guid>https://velog.io/@minsing-jin/%EC%97%AC%EB%9F%AC%EB%B6%84%EC%9D%80-AI-%EB%8B%B5%EB%B3%80%EC%9D%84-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A0%EB%A2%B0%ED%95%98%EC%8B%9C%EB%82%98%EC%9A%94</guid>
            <pubDate>Mon, 10 Feb 2025 07:03:43 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/f50715c8-f80f-4f95-9c01-5f600ca1bc5b/image.png" alt=""></p>
<p>기존에는 Perplexity나 ChatGPT 같은 AI 챗봇을 활용할 때, 답변의 신뢰성을 확인하려면 출처 링크를 일일이 클릭하고 내용을 직접 찾아야 했습니다. 환각현상(Hallucination)으로 인한 잘못된 정보까지 검증하려면 추가적인 시간과 에너지가 필요했죠.
그러던중 ai가 참고했다는 원문출처를 클릭하면 답변에서 참고한부분을 자동으로 찾아주는 툴이 필요하다고 생각했습니다.</p>
<p>이에 저희는 ClueHunter는 AI가 참고한 출처를 단번에 검증할 수 있도록 도와주는 크롬 익스텐션을 개발했습니다. </p>
<p>기존에는 Perplexity에서 제공하는 출처 링크를 하나씩 클릭하고, 내용을 직접 찾아야 했다면, 이제는 ClueHunter가 출처 페이지를 자동 스크롤 &amp; 핵심 내용 강조 표시까지 해줍니다!
<img src="https://velog.velcdn.com/images/minsing-jin/post/9f628aa9-f7a7-4035-89f1-f924e228e1e2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/minsing-jin/post/89ae3e45-c1e0-422b-96d0-c1f9cab19e45/image.png" alt=""></p>
<p>현재는 Perplexity 전용 크롬 익스텐션으로 제공되지만, 앞으로 ChatGPT, Claude AI 등 다양한 AI 챗봇에서도 활용할 수 있도록 확장할 예정입니다.</p>
<p>🛠 ClueHunter는 오픈소스 프로젝트로, 여러분의 피드백을 환영합니다!</p>
<ul>
<li><a href="https://chromewebstore.google.com/detail/cluehunter-perplexity/mhkmlamlmdlkgpmfgbdnhohbggldekjf?hl=ko">ClueHunter 크롬 익스텐션</a></li>
<li><a href="https://github.com/RiceBobb/ClueHunter.js">ClueHunter.js</a></li>
<li><a href="https://github.com/RiceBobb/ClueHunter-Perplexity">ClueHunter-Perpelxity</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[모델이 학습한다는 의미]]></title>
            <link>https://velog.io/@minsing-jin/%EB%AA%A8%EB%8D%B8%EC%9D%B4-%ED%95%99%EC%8A%B5%ED%95%9C%EB%8B%A4%EB%8A%94-%EC%9D%98%EB%AF%B8</link>
            <guid>https://velog.io/@minsing-jin/%EB%AA%A8%EB%8D%B8%EC%9D%B4-%ED%95%99%EC%8A%B5%ED%95%9C%EB%8B%A4%EB%8A%94-%EC%9D%98%EB%AF%B8</guid>
            <pubDate>Fri, 31 Jan 2025 09:15:56 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/5bfafa4a-5316-49bf-bca9-0490d45646dc/image.png" alt=""></p>
<p>아직 처음 배운거라 오류가 있다면 알려주세용</p>
<h1 id="ml-넓은-의미로써의-학습">ML, 넓은 의미로써의 학습</h1>
<p>모델의 가중치값을 조정해나아가는 일련의 과정</p>
<h1 id="llm에서의-학습">LLM에서의 학습</h1>
<p>모델의 단어들의 관계나 문장의 의미를 백터로 변환하는 &quot;방법&quot;을 배운 상태</p>
<h1 id="dae-denosing-autoencoder">DAE (Denosing AutoEncoder)</h1>
<ol>
<li>transformer가 문장들을 임베딩하여 백터화하고 단어들의 관계를 학습함. </li>
<li>그리고 마스킹과 복원하는 작업을 통해 각 단어의 문맥적 의미를 배우고 문장의 의미를 백터화 하는 능력 향상</li>
<li>학습된 모델은 문장의 임베딩 백터로 변환</li>
</ol>
<p>-&gt; Chatgpt피셜이라 교차검증 필요
-&gt; 백터화하는 과정과 denosing하는 과정은 따로 있는것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[베이즈정리]]></title>
            <link>https://velog.io/@minsing-jin/%EB%B2%A0%EC%9D%B4%EC%A6%88%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@minsing-jin/%EB%B2%A0%EC%9D%B4%EC%A6%88%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Thu, 30 Jan 2025 07:27:06 GMT</pubDate>
            <description><![CDATA[<h3 id="베이즈-정리-bayes-theorem란"><strong>베이즈 정리 (Bayes&#39; Theorem)란?</strong></h3>
<p>베이즈 정리는 <strong>사건이 발생한 후에 원인을 추론</strong>하는 데 사용하는 확률 법칙입니다.<br>즉, <strong>이미 발생한 사건을 바탕으로 다른 사건이 일어날 확률을 업데이트</strong>하는 방법을 제공합니다.</p>
<hr>
<h2 id="1-베이즈-정리의-공식"><strong>1. 베이즈 정리의 공식</strong></h2>
<p>베이즈 정리는 조건부 확률을 이용하여 다음과 같이 표현됩니다:</p>
<p><img src="https://velog.velcdn.com/images/minsing-jin/post/c2ebf9bc-3895-4369-877d-138bcde49b80/image.png" alt=""></p>
<ul>
<li>P(A | B): <strong>B가 발생한 후 A가 발생했을 확률</strong> (<strong>사후 확률, Posterior Probability</strong>)  </li>
<li>P(B | A): <strong>A가 발생한 경우 B가 발생할 확률</strong> (<strong>우도, Likelihood</strong>)  </li>
<li>P(A): <strong>A가 발생할 확률</strong> (<strong>사전 확률, Prior Probability</strong>)  </li>
<li>P(B): <strong>B가 발생할 확률</strong> (모든 가능한 경우에서 B가 발생할 확률)  </li>
</ul>
<hr>
<h2 id="2-베이즈-정리가-왜-중요한가"><strong>2. 베이즈 정리가 왜 중요한가?</strong></h2>
<p>베이즈 정리는 <strong>새로운 정보가 주어졌을 때 확률을 업데이트</strong>하는 과정입니다.<br>즉, <strong>기존 확률(사전 확률)을 새로운 정보(우도)를 통해 수정하여 사후 확률을 계산</strong>합니다.</p>
<ul>
<li><strong>의학적 진단:</strong> 질병이 있을 확률을 검사 결과를 기반으로 업데이트</li>
<li><strong>기계 학습:</strong> 새로운 데이터가 주어질 때 모델이 확률을 업데이트하는 과정</li>
<li><strong>범죄 수사:</strong> 주어진 증거를 바탕으로 용의자가 범인일 확률 계산</li>
</ul>
<hr>
<h2 id="3-예제-질병-진단"><strong>3. 예제: 질병 진단</strong></h2>
<p>어떤 병(예: 독감)에 걸릴 확률이 <strong>1%</strong>라고 가정하겠습니다.<br>이 병을 진단하는 검사에서 <strong>양성(positive)이 나올 확률은 다음과 같습니다</strong>:
<img src="https://velog.velcdn.com/images/minsing-jin/post/6adf7d6c-2ffb-48cd-a80d-59af87288046/image.png" alt=""></p>
<p>여기서:
<img src="https://velog.velcdn.com/images/minsing-jin/post/e104f022-ce7d-4be5-bb90-ad2c7e6cf3cc/image.png" alt=""></p>
<p>우리는 <strong>&quot;검사 결과가 양성일 때 실제로 병에 걸렸을 확률&quot;</strong> P(D | T^+)을 구해야 합니다.</p>
<h3 id="베이즈-정리-적용"><strong>베이즈 정리 적용</strong></h3>
<p><img src="https://velog.velcdn.com/images/minsing-jin/post/f0569143-ca65-423b-bfea-bbb2fdf121a8/image.png" alt=""></p>
<p>먼저, P(T^+)를 구해야 합니다. 전체적으로 <strong>검사에서 양성이 나올 확률</strong>은 다음과 같이 계산됩니다:</p>
<p><img src="https://velog.velcdn.com/images/minsing-jin/post/63ea5745-6e0c-4480-9e79-a3b5312d4235/image.png" alt=""></p>
<p>대입하면:</p>
<p><img src="https://velog.velcdn.com/images/minsing-jin/post/31240e28-f0c1-417b-bc3e-e607069ee184/image.png" alt=""></p>
<p>이제, 베이즈 정리를 사용하여 P(D | T^+)을 구합니다:</p>
<p><img src="https://velog.velcdn.com/images/minsing-jin/post/3a7320bd-84fa-4b0e-bb33-030779e438a3/image.png" alt=""></p>
<p>즉, <strong>검사에서 양성이 나왔다고 해서 실제로 병에 걸렸을 확률은 약 16.1%</strong>입니다.<br><strong>(검사 결과만 믿으면 안 되는 이유!)</strong></p>
<hr>
<h2 id="4-확장-여러-개의-원인-전확률-정리-활용"><strong>4. 확장: 여러 개의 원인 (전확률 정리 활용)</strong></h2>
<p>베이즈 정리는 <strong>하나의 원인(A)이 아니라 여러 원인들이 있을 때도 사용</strong>됩니다.  </p>
<p>만약 B가 여러 개의 가능한 원인 A_1, A_2, ..., A_n 중 하나로 인해 발생했다면:</p>
<p><img src="https://velog.velcdn.com/images/minsing-jin/post/a6e43bf2-1476-4a7b-9aea-41ebf4390578/image.png" alt=""></p>
<p>이것을 <strong>전확률 정리 (Law of Total Probability)</strong>라고 합니다.</p>
<hr>
<h2 id="5-결론"><strong>5. 결론</strong></h2>
<ul>
<li><p>베이즈 정리는 <strong>새로운 정보가 주어졌을 때 확률을 업데이트하는 방법</strong>입니다.</p>
</li>
<li><p><strong>조건부 확률을 활용</strong>하여 원인을 추론할 수 있습니다.</p>
</li>
<li><p><strong>의학, 인공지능, 금융, 범죄 수사</strong> 등에서 널리 사용됩니다.</p>
</li>
<li><p><strong>기본 공식</strong>:  
<img src="https://velog.velcdn.com/images/minsing-jin/post/37353a45-9525-40a6-930c-ae7259e9fdcb/image.png" alt=""></p>
</li>
<li><p><strong>응용 예제</strong>: 검사 결과가 양성일 때 실제 질병 확률을 구하는 문제</p>
</li>
</ul>
<p>혹시 더 궁금한 점 있으면 질문해주세요! 😊</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[문제에서 A와 B가 종속적이라는 정보만 있고, 교집합 확률이나 조건부 확률이 주어지지 않았다면]]></title>
            <link>https://velog.io/@minsing-jin/%EB%AC%B8%EC%A0%9C%EC%97%90%EC%84%9C-A%EC%99%80-B%EA%B0%80-%EC%A2%85%EC%86%8D%EC%A0%81%EC%9D%B4%EB%9D%BC%EB%8A%94-%EC%A0%95%EB%B3%B4%EB%A7%8C-%EC%9E%88%EA%B3%A0-%EA%B5%90%EC%A7%91%ED%95%A9-%ED%99%95%EB%A5%A0%EC%9D%B4%EB%82%98-%EC%A1%B0%EA%B1%B4%EB%B6%80-%ED%99%95%EB%A5%A0%EC%9D%B4-%EC%A3%BC%EC%96%B4%EC%A7%80%EC%A7%80-%EC%95%8A%EC%95%98%EB%8B%A4%EB%A9%B4</link>
            <guid>https://velog.io/@minsing-jin/%EB%AC%B8%EC%A0%9C%EC%97%90%EC%84%9C-A%EC%99%80-B%EA%B0%80-%EC%A2%85%EC%86%8D%EC%A0%81%EC%9D%B4%EB%9D%BC%EB%8A%94-%EC%A0%95%EB%B3%B4%EB%A7%8C-%EC%9E%88%EA%B3%A0-%EA%B5%90%EC%A7%91%ED%95%A9-%ED%99%95%EB%A5%A0%EC%9D%B4%EB%82%98-%EC%A1%B0%EA%B1%B4%EB%B6%80-%ED%99%95%EB%A5%A0%EC%9D%B4-%EC%A3%BC%EC%96%B4%EC%A7%80%EC%A7%80-%EC%95%8A%EC%95%98%EB%8B%A4%EB%A9%B4</guid>
            <pubDate>Thu, 30 Jan 2025 07:06:42 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minsing-jin/post/014d5ced-3e85-45fd-af96-4b53ca4fab72/image.png" alt=""></p>
<h2 id="문제-상황">문제 상황</h2>
<p>LLM시대이전 내가 고등학교에서 의문을 품었지만 질문을 구체화하지 못해서 미궁으로 빠졌었다. 문제에서 교집합 확률이나 조건부확률을 주지 않았고, 문제에서 A와 B가 종속적이라는 정보만 있고 조건부 확률도 직접 주어지지 않았다면 어떻게 해야하지? </p>
<h3 id="추가적인-정보-없이-종속-사건의-교집합-확률을-구할-수-있을까"><strong>추가적인 정보 없이 종속 사건의 교집합 확률을 구할 수 있을까?</strong></h3>
<p>좋은 질문이에요! <strong>문제에서 A와 B가 종속적이라는 정보만 있고, 교집합 확률이나 조건부 확률이 주어지지 않았다면 어떻게 해야 하는지</strong> 알아보죠.  </p>
<hr>
<h3 id="1-기본적인-문제-상황"><strong>1. 기본적인 문제 상황</strong></h3>
<p>문제에서 다음 조건만 주어졌다고 가정해 봅시다.<br><img src="https://velog.velcdn.com/images/minsing-jin/post/54062327-0b15-4317-80c7-fd7b9e3e27ce/image.png" alt=""></p>
<p>이때, <strong>교집합 확률 P(A ∩ B)을 구할 수 있을까?</strong>  </p>
<hr>
<h3 id="2-추가적인-정보-없이-pa-∩-b을-구할-수-없는-이유"><strong>2. 추가적인 정보 없이 P(A ∩ B)을 구할 수 없는 이유</strong></h3>
<p>우리가 사용할 수 있는 공식은:</p>
<p><img src="https://velog.velcdn.com/images/minsing-jin/post/6af70650-cd8f-408b-bd05-55f7e2fd54a7/image.png" alt=""></p>
<p>그런데 <strong>P(A | B) 또는 P(B | A)가 없으면 이 공식을 사용할 수 없습니다.</strong><br>즉, <strong>추가적인 정보 없이 P(A ∩ B)을 계산하는 것은 불가능합니다.</strong>  </p>
<p>💡 <strong>비유하자면</strong><br>이것은 &quot;<strong>어떤 사람이 A고, 다른 사람이 B일 때, 두 사람이 친구일 확률</strong>&quot;을 계산하는 것과 비슷합니다.<br>A와 B가 서로 영향을 주는(종속적인) 관계라는 건 알지만, <strong>얼마나 영향을 주는지(조건부 확률)</strong>가 없으면 정확한 확률을 구할 수 없어요.</p>
<hr>
<h3 id="3-해결-방법-추가-정보를-찾아야-함"><strong>3. 해결 방법: 추가 정보를 찾아야 함</strong></h3>
<p>그럼 이런 경우 어떻게 해야 할까요?<br>다음과 같은 <strong>추가적인 정보를 얻어야 합니다.</strong>  </p>
<h4 id="1-문제에서-조건부-확률을-유도할-수-있는-단서-찾기"><strong>(1) 문제에서 조건부 확률을 유도할 수 있는 단서 찾기</strong></h4>
<ul>
<li>어떤 경우에는 <strong>문제에 숨겨진 정보가 있을 수도 있습니다.</strong>  </li>
<li>예를 들어, 문제에서 <strong>&quot;A가 발생하면 B가 발생할 확률이 두 배 높다&quot;</strong> 같은 단서가 있다면, 이를 조건부 확률로 변환할 수 있습니다.  </li>
</ul>
<h4 id="2-실험-데이터-또는-통계-자료-활용"><strong>(2) 실험 데이터 또는 통계 자료 활용</strong></h4>
<ul>
<li>현실에서는 교집합 확률을 직접 계산하기 어려운 경우가 많습니다.  </li>
<li>따라서 <strong>실험을 통해 데이터를 수집한 후, 경험적인 확률을 사용하여 조건부 확률을 추정</strong>할 수 있습니다.  </li>
<li>예를 들어, 두 이벤트 A와 B에 대한 과거 데이터를 분석해서 P(A | B) 또는 P(B | A)를 근사할 수 있습니다.  </li>
</ul>
<h4 id="3-베이즈-정리를-활용"><strong>(3) 베이즈 정리를 활용</strong></h4>
<ul>
<li><p>만약 <strong>B의 사전 확률 P(B)과 A가 발생했을 때 B가 발생할 확률 P(B | A)을 알고 있다면</strong>,  
<img src="https://velog.velcdn.com/images/minsing-jin/post/49c4716e-0f66-495f-9bc9-1458124b30c0/image.png" alt=""></p>
<p>공식을 이용해서 <strong>필요한 조건부 확률을 구한 후, 이를 이용해 교집합 확률을 찾을 수도 있습니다.</strong>  </p>
</li>
</ul>
<hr>
<h3 id="4-결론-추가-정보-없이-확률을-구할-수-없음"><strong>4. 결론: 추가 정보 없이 확률을 구할 수 없음</strong></h3>
<p>✔ <strong>A와 B가 종속적이라는 정보만으로는 P(A ∩ B)을 구할 수 없다.</strong><br>✔ <strong>추가적으로 P(A | B) 또는 P(B | A) 같은 조건부 확률이 필요하다.</strong><br>✔ <strong>문제에서 숨겨진 단서를 찾아야 하며, 실험 데이터나 베이즈 정리를 활용할 수도 있다.</strong>  </p>
<p>이제 확실히 이해되셨나요? 😊<br>추가 질문이 있으면 언제든지 물어보세요!</p>
]]></description>
        </item>
    </channel>
</rss>