<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>KGG Studio</title>
	<atom:link href="https://blog.kggstudio.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.kggstudio.com</link>
	<description>개발자 테크 블로그</description>
	<lastBuildDate>Wed, 27 May 2026 05:18:13 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://blog.kggstudio.com/wp-content/uploads/2025/05/cropped-K-1-32x32.png</url>
	<title>KGG Studio</title>
	<link>https://blog.kggstudio.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">244941309</site>	<item>
		<title>RAG (1) &#8211; 2026년 5월 기준으로 작성</title>
		<link>https://blog.kggstudio.com/rag-1-2026%eb%85%84-5%ec%9b%94-%ea%b8%b0%ec%a4%80%ec%9c%bc%eb%a1%9c-%ec%9e%91%ec%84%b1/</link>
					<comments>https://blog.kggstudio.com/rag-1-2026%eb%85%84-5%ec%9b%94-%ea%b8%b0%ec%a4%80%ec%9c%bc%eb%a1%9c-%ec%9e%91%ec%84%b1/#respond</comments>
		
		<dc:creator><![CDATA[TimTam]]></dc:creator>
		<pubDate>Wed, 27 May 2026 05:18:12 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://blog.kggstudio.com/?p=695</guid>

					<description><![CDATA[RAG 요약 RAG란 (Retrieval-Augmented Generation = 검색 증강 생성) 이란 뜻으로, 언어모델이 특정 데이터를 검색하여 답변을 생성하는 방식을 말합니다. RAG의 장점 AI Model 자체 성능에 모든걸 의존하는건 비효율적이고 사실상 AI 자체 메모리(학습내용)가 커지면 커질수록 연산량은 기하급수적으로 증가하기때문에, 모델성능은 필요한 언어를 잘 이해하고 요약이나 생성 할수 있을정도면 충분하고, 답변을 생성할때 필요한 지식부분은 별도의 DATA에 의존하게 함으로써 ... <a title="RAG (1) &#8211; 2026년 5월 기준으로 작성" class="read-more" href="https://blog.kggstudio.com/rag-1-2026%eb%85%84-5%ec%9b%94-%ea%b8%b0%ec%a4%80%ec%9c%bc%eb%a1%9c-%ec%9e%91%ec%84%b1/" aria-label="RAG (1) &#8211; 2026년 5월 기준으로 작성에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">RAG 요약</h2>



<h4 class="wp-block-heading">RAG란 (Retrieval-Augmented Generation = 검색 증강 생성) 이란 뜻으로, 언어모델이 특정 데이터를 검색하여 답변을 생성하는 방식을 말합니다.</h4>



<h4 class="wp-block-heading">RAG의 장점</h4>



<p class="wp-block-paragraph">AI Model 자체 성능에 모든걸 의존하는건 비효율적이고 사실상 AI 자체 메모리(학습내용)가 커지면 커질수록 연산량은 기하급수적으로 증가하기때문에, 모델성능은 필요한 언어를 잘 이해하고 요약이나 생성 할수 있을정도면 충분하고, 답변을 생성할때 필요한 지식부분은 별도의 DATA에 의존하게 함으로써 모델의 성능(속도 퍼포먼스 측면)을 취할수있고 연산량도 최적화시킬수있고, 데이터의 정확성도 높일수있는 즉, 언어모델이 효율적으로 작동하게 할수있는 기법이라고 볼수있음.</p>



<h4 class="wp-block-heading">Fine-Tuning 과 차이점</h4>



<p class="wp-block-paragraph">Fine-Tuinng은 사전 학습모델을 살짝 변형시키는 구조로, 어떤 기능추가라거나 모델이 참고할 데이터(지식)를 추가해주는것이 가능하지만, 해당 데이터나 기능추가부분이 가중치의 일부로 흡수되는 방식이여서 RAG방식보다 새로운 데이터에 대한 명확성이 떨어질 수 있음.</p>



<h4 class="wp-block-heading">정리하면..</h4>



<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">graph TD;
A[Pretrained Model]
B[Fine Tuning]
C[RAG]</pre></div>



<ul class="wp-block-list">
<li>Pretrained Model(사전학습모델): 언어를 당담. 여러가지 언어를(용도에 필요한) 이해하고 번역이가능하고, 뜻을이해해서 유사문장을 가려낼수있고, 특정 의미를 담는 문장을 생성할수있음.</li>



<li>Fine Tuning(전이 학습): 사전학습모델이 특정 기능을 더 잘 할수있도록 업데이트함. (optional, 사전학습모델이 원하는기능을 할수 없을때만 하면 됨)</li>



<li>RAG(검색 증강 생성): 언어모델이 미리 구축된 DATABASE에서 <strong>쿼리</strong>를통해 필요한 정보를 <strong>검색</strong>해서 답변을 <strong>생성</strong>하는 방법.</li>
</ul>



<p class="wp-block-paragraph">요약하면 RAG를 적용할경우 언어모델은 <strong>지능</strong> 역할을 하고, RAG에서 사용되는 데이터는 <strong>지식</strong>의 역할을함.</p>



<p class="wp-block-paragraph">여기서 또 고려해야 하는점은 사전학습모델은 지능의 역할을 하는데, 학습방법이 지식을 통해서 지능을 높이기때문에 일정 지능을 갖추려면 지식도 많이 알려줘야 한다는점</p>



<p class="wp-block-paragraph">RAG 데이터는 지식 역할을 한다지만, 데이터가 RAW 데이터로 다 저장되기때문에 저장 용량을 많이 차지함.</p>



<p class="wp-block-paragraph">모델의 지능이 낮으면 RAG의 데이터를 활용할수없고 RAG데이터가 너무많아지면 가중치용량보다 더커질수있어서 밸런스를 맞추는게 필요함.</p>



<h2 class="wp-block-heading">기본 RAG 아키텍쳐</h2>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="602" data-attachment-id="696" data-permalink="https://blog.kggstudio.com/rag-1-2026%eb%85%84-5%ec%9b%94-%ea%b8%b0%ec%a4%80%ec%9c%bc%eb%a1%9c-%ec%9e%91%ec%84%b1/image-159/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-68.png" data-orig-size="1195,703" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-68-1024x602.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-68-1024x602.png" alt="" class="wp-image-696" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-68-1024x602.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-68-300x176.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-68-768x452.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-68.png 1195w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">RAG 역사</h2>



<ol class="wp-block-list">
<li>Naive RAG: 위 그림같은 구조로 검색하여 찾은 데이터를 제공함.</li>



<li>Advanced RAG: <strong>더 잘 검색</strong>하고, <strong>필터링</strong>한 후, <strong>정리해서 제공</strong>한다.</li>



<li>Modular RAG: 검색, 판단, 도구, 재검색, 검증 을 레고처럼 조립힌다.</li>



<li>Graph RAG: GraphRAG는 문서를 단순 chunk 목록으로 보지 않고, entity와 relationship 중심의 graph로 바꿔서 검색·요약하는 방식입니다. Microsoft Research는 GraphRAG를 텍스트 추출, 네트워크 분석, LLM prompting/summarization을 결합한 end-to-end 시스템으로 설명합니다.</li>



<li>Self-RAG: 모델이 <strong>언제 검색할지</strong>, <strong>검색 결과를 사용할지</strong>, <strong>답변이 근거에 맞는지</strong>를 스스로 판단하게 만드는 방향입니다.</li>



<li>CRAG (Corrective RAG): CRAG는 검색 결과가 나쁠 때 <strong>교정 행동</strong>을 넣는 방식입니다. 검색된 문서의 품질을 평가하는 lightweight retrieval evaluator를 두고, confidence에 따라 다른 retrieval action을 실행합니다</li>



<li>RAPTOR:</li>



<li>Contextual Retrival:</li>



<li>Late Chunking:</li>



<li>RAFT:</li>



<li>Agentic RAG:</li>
</ol>



<p class="wp-block-paragraph">4번~11번은 최신 변화중인 RAG 기법들</p>



<h3 class="wp-block-heading">1. Naive RAG (구현 쉬움, 검색결과가 안좋으면 답변 퀄리티도 안좋음)</h3>



<p class="wp-block-paragraph">사용자가 &#8220;회사 휴가 규정 알려줘&#8221; 라고 물으면 벡터 DB에서 휴가 관련 chunk를 몇개 가져와서 LLM에게 같이 넣어주는 방식.</p>



<pre class="wp-block-code"><code>문서 준비
→ chunk 분할
→ embedding
→ vector DB 저장
→ 사용자 질문 embedding
→ 유사 chunk 검색 top-k
→ LLM에게 context로 넣기
→ 답변 생성</code></pre>



<h4 class="wp-block-heading">검색 결과를 그대로 제공하기때문에, 관련 있어 보이지만, 실제로는 도움이 안되는 답변일 경우가 많음.</h4>



<h3 class="wp-block-heading">2. Advanced RAG</h3>



<p class="wp-block-paragraph">Naive RAG과 유사하지만, 검색 전후에 여러 개선 단계를 추가함</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>기법</th><th>설명</th></tr></thead><tbody><tr><td><strong>Hybrid Search</strong></td><td>벡터 검색 + BM25 키워드 검색을 같이 사용</td></tr><tr><td><strong>Reranking</strong></td><td>검색된 20~50개 문서 중 진짜 관련 높은 것만 다시 정렬</td></tr><tr><td><strong>Query Rewrite</strong></td><td>사용자의 질문을 검색하기 좋은 형태로 재작성</td></tr><tr><td><strong>Multi-query Retrieval</strong></td><td>질문을 여러 버전으로 바꿔서 검색</td></tr><tr><td><strong>Query Decomposition</strong></td><td>복잡한 질문을 작은 질문 여러 개로 분해</td></tr><tr><td><strong>Context Compression</strong></td><td>검색된 문서에서 답변에 필요한 부분만 압축</td></tr><tr><td><strong>Metadata Filtering</strong></td><td>날짜, 카테고리, 작성자, 문서 타입 등으로 필터링</td></tr><tr><td><strong>Parent-child Chunking</strong></td><td>작은 chunk로 검색하고, 실제 context는 더 큰 parent 문단을 사용</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">예를 들어 “2023년과 2024년 매출 차이와 원인을 알려줘”라는 질문은 한 번의 검색으로는 부족할 수 있습니다. Advanced RAG는 질문을 “2023년 매출”, “2024년 매출”, “매출 변화 원인”처럼 쪼개서 검색한 뒤, 결과를 합쳐 답하게 만들 수 있습니다.</p>



<h4 class="wp-block-heading">장점</h4>



<p class="wp-block-paragraph">Naive RAG보다 훨씬 실무적입니다.<br><strong>검색 실패율을 낮출</strong> 수 있습니다.<br>문서가 많아져도 어느 정도 대응 가능합니다.<br>회사 문서 검색, 기술문서 QA, 법률/계약서 분석 같은 곳에 적합합니다.</p>



<h4 class="wp-block-heading">단점</h4>



<p class="wp-block-paragraph">구성이 복잡해집니다.<br>검색, reranking, LLM 호출이 늘어나 <strong>비용과 latency가 증가</strong>합니다.<br>잘못 설계하면 “복잡한데 성능은 별로 안 좋아지는” 상태가 됩니다.</p>



<h3 class="wp-block-heading">3. Modular  RAG</h3>



<p class="wp-block-paragraph">Modular RAG는 단순히 “Advanced RAG보다 더 고급”이라기보다는, RAG 시스템을 <strong>모듈 단위로 분해해서 필요에 따라 조립하는 구조</strong>입니다. </p>



<p class="wp-block-paragraph">예를들면 이런식 입니다. 핵심은 <strong>질문에 따라 다른 경로를 선택한다는 것</strong>입니다.</p>



<pre class="wp-block-code"><code>Router
→ Query Analyzer
→ Retriever A: Vector DB
→ Retriever B: SQL DB
→ Retriever C: Web Search
→ Reranker
→ Verifier
→ Generator
→ Citation Checker</code></pre>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>질문</th><th>사용 모듈</th></tr></thead><tbody><tr><td>“이 문서 요약해줘”</td><td>문서 chunk retrieval + summarizer</td></tr><tr><td>“지난달 매출 알려줘”</td><td>SQL query generator + DB lookup</td></tr><tr><td>“최근 뉴스까지 반영해줘”</td><td>web search + retriever</td></tr><tr><td>“계약서 위험 조항 찾아줘”</td><td>legal retriever + reranker + verifier</td></tr><tr><td>“전체 문서의 주요 테마 알려줘”</td><td>GraphRAG 또는 hierarchical summarization</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">장점</h3>



<p class="wp-block-paragraph">확장성이 좋습니다.<br>문서 검색, DB 조회, API 호출, 웹 검색, 코드 실행 등을 하나의 RAG 시스템 안에 넣을 수 있습니다.<br>복잡한 업무 자동화에 적합합니다.<br>Agentic RAG와 결합하기 쉽습니다.</p>



<h3 class="wp-block-heading">단점</h3>



<p class="wp-block-paragraph">설계 난도가 높습니다.<br>모듈 간 데이터 형식, 실패 처리, 비용 관리, 평가 시스템이 필요합니다.<br>작은 프로젝트에는 과할 수 있습니다.</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<ol class="wp-block-list">
<li>Chunking 전략</li>



<li>Embedding 모델</li>



<li>Vector Database -&gt; Chroma DB Python 한 줄 설치, 디스크에 저장, 학습 프로토타입의 기본 선택</li>



<li>Retriever ( Similarity Search vs MMR &#8211; Maximal Marginal Relevance )</li>
</ol>



<h3 class="wp-block-heading">Deep Dive</h3>



<p class="wp-block-paragraph">PDF 깨지지않게</p>



<ul class="wp-block-list">
<li>OCR</li>



<li>PDF Parser</li>
</ul>



<p class="wp-block-paragraph">저장된 Chunk 는 json</p>



<p class="wp-block-paragraph">Parent-child Chunking (계층구조)</p>



<p class="wp-block-paragraph">Query Rewriting</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kggstudio.com/rag-1-2026%eb%85%84-5%ec%9b%94-%ea%b8%b0%ec%a4%80%ec%9c%bc%eb%a1%9c-%ec%9e%91%ec%84%b1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">695</post-id>	</item>
		<item>
		<title>HuggingFace 커스텀 프로젝트 만들기 [프로젝트]</title>
		<link>https://blog.kggstudio.com/huggingface-model-customize/</link>
					<comments>https://blog.kggstudio.com/huggingface-model-customize/#respond</comments>
		
		<dc:creator><![CDATA[TimTam]]></dc:creator>
		<pubDate>Thu, 21 May 2026 08:24:17 +0000</pubDate>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[LLM]]></category>
		<guid isPermaLink="false">https://blog.kggstudio.com/?p=641</guid>

					<description><![CDATA[프로젝트 설명 개요: 허깅페이스에서 직접 모델을 다운받아 Fine-Tuning을 시키고, 그동안 배운 테크닉들을 활용하여 모델 성능 (accuracy)를 올린다. 주제는 자유주제로 말씀해주셨지만 2.5일 짧은 프로젝트 기간을 감안해 단순하고 방금전에 배워서 시작하기 쉬운 &#8220;언어만 한국어로 바뀐 두문장 관계&#8221; 분석을하는 모델로 fine-tuning 해볼생각이다. (두문장 관계 평가란 두 문장이 같은의미를 지닌 문장인지 평가하는것을 말한다.) 모델학습을 통해 성능을 올리는것이 목표지만, 더 ... <a title="HuggingFace 커스텀 프로젝트 만들기 [프로젝트]" class="read-more" href="https://blog.kggstudio.com/huggingface-model-customize/" aria-label="HuggingFace 커스텀 프로젝트 만들기 [프로젝트]에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">프로젝트 설명</h2>



<p class="wp-block-paragraph">개요: 허깅페이스에서 직접 모델을 다운받아 Fine-Tuning을 시키고, 그동안 배운 테크닉들을 활용하여 모델 성능 (accuracy)를 올린다.</p>



<p class="wp-block-paragraph">주제는 자유주제로 말씀해주셨지만 2.5일 짧은 프로젝트 기간을 감안해 단순하고 방금전에 배워서 시작하기 쉬운 &#8220;언어만 한국어로 바뀐 두문장 관계&#8221; 분석을하는 모델로 fine-tuning 해볼생각이다. <em>(두문장 관계 평가란 두 문장이 같은의미를 지닌 문장인지 평가하는것을 말한다.)</em></p>



<p class="wp-block-paragraph">모델학습을 통해 성능을 올리는것이 목표지만, 더 중요한것은 성능을 올리기위해 어떤것을 해봤는지 경험하고 어떤차이가 있었는지 비교를통해 fine-tuning 할때 어떤방법으로 어느정도 개선을 했을때 어떤차이를 보이더라 하는 그런 감각을 체득하는것 등 이 더 중요하다고 생각한다. 따라서 가능하면 무언가 수정할때는, 꼭 평가를해보고 가능하면 실제로 문장을 집어 넣어 테스트를 해서 어떤지 비교도 해볼 생각이다.</p>



<p class="wp-block-paragraph">성능 개선과 더불어 모델 학습속도를 늘려줄수있는 최적화 기법도 중요하다.</p>



<h3 class="wp-block-heading">루브릭</h3>



<ul class="wp-block-list">
<li>klue/bert-base를 NSMC 데이터셋으로 fine-tuning 하여, 모델이 정상적으로 작동하는 것을 확인하였다.</li>



<li>Preprocessing을 개선하고, Validation accuracy를 90% 이상으로 개선하였다.</li>



<li>Bucketing을 성공적으로 적용하고, 연산 속도와, 모델 성능간 trade-off 관계가 발생하는지 여부를 확인하였다.</li>
</ul>



<h2 class="wp-block-heading">프로젝트 구조</h2>



<p class="wp-block-paragraph">평가기준에 klue/bert-base를 NSMC 데이터셋으로 fine-tuning 하라고 되어있다, 루브릭 크게 신경쓰지 말라는 말씀도 계셨지만 아무튼 나는 한국어 두 문장 관계도를 파악하는 모델로 훈련할 생각이기 때문에, 상관이 없긴하다. <em>(하지만 나중에 모델을 교체할수도 있긴하다)</em></p>



<h3 class="wp-block-heading">기본 구조</h3>



<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">graph LR;
a[데이터 분석 및 HF Dataset]
b[모델 및 tokenizer]
c[데이터셋 전처리 및 모델 학습]
d[FT로 모델 성능 향상]
e[Bucketing으로 학습 결과분석]
a-->b
b-->c
c-->d
d-->e</pre></div>



<h3 class="wp-block-heading">고려 사항</h3>



<p class="wp-block-paragraph">프로젝트 할때는 어느정도 리서치를 하면서 머리에 정리를하면서 해보면 좋겠죠?</p>



<h4 class="wp-block-heading">klue/bert-base 모델 사용시 mecab 사용금지.</h4>



<p class="wp-block-paragraph">리서치중 <code>klue/bert-base</code>는 학습될 때 형태소 분석기를 거치지 않고, 원본 텍스트를 바로 자체 토크나이저(WordPiece)로 쪼개어 학습되었습니다. 만약 억지로 <code>Mecab</code>으로 먼저 쪼갠 뒤 모델에 넣으면, 모델이 한 번도 본 적 없는 이상한 띄어쓰기와 토큰 조합이 입력되어 오히려 성능이 크게 떨어 진다는것을 알게되었음.</p>



<h4 class="wp-block-heading">STEP 1. 데이터 분석 및 전처리 (EDA &amp; Preprocessing)</h4>



<ul class="wp-block-list">
<li>중복 데이터 제거, pandas나 datasets의 기능을 이용해, 텍스트가 일치하는 중복 아이템 제거</li>



<li>정규식(Regex) 정제: *한글, 영문, 숫자, 기본 구두점만 남기고 의미없는 특수문자나 과도한 자음/모음 반복을 축소 (예: ㅋㅋ, ㅎㅎ 등 2개로 제한) 하는 전처리 적용.</li>



<li>최적의 max_length 찾기 (EDA 시각화):
<ul class="wp-block-list">
<li>리뷰 길의 분포를 히스토그램으로 그려보기. 보통 95%정도 데이터가 특정 길이에 들어옴. max_length를 무조건 크게잡으면 패딩 때문에 연산시간이 크게 나빠짐.</li>
</ul>
</li>
</ul>



<h4 class="wp-block-heading">STEP 2&amp;3. 토크나이저 및 학습 초기 설정</h4>



<ul class="wp-block-list">
<li>Dynamic Padding (동적 패딩)
<ul class="wp-block-list">
<li>DataCollatorWithPadding 을 사용하여 배치 내에서 가장 긴 문장을 기준으로만 패딩을 적용 (Step 5의 Bucketing과 결합을 하면 효과가 극대화)</li>
</ul>
</li>
</ul>



<h4 class="wp-block-heading">STEP 4. 90% 이상을 위한 하이퍼 파라미터 최적화 (Fine-tuning)</h4>



<ul class="wp-block-list">
<li><strong>학습률 스케줄러 변경:</strong> 기본값인 <code>linear</code> 대신 <strong><code>cosine_with_restarts</code></strong> 또는 <strong><code>cosine</code></strong> 스케줄러를 사용해 보세요. 모델이 지역 최소점(Local Minima)에 빠지는 것을 방지해 줍니다.</li>



<li><strong>Weight Decay 조정:</strong> 과적합(Overfitting)을 막기 위해 <code>weight_decay</code> 값을 0.01에서 0.1 사이로 미세 조정해 보세요.</li>



<li><strong>Early Stopping (조기 종료):</strong> <code>EarlyStoppingCallback</code>을 적용하여 Validation Loss가 더 이상 안 떨어지면 학습을 멈추고 가장 좋았던 체크포인트로 복원하도록 설정하세요.</li>



<li><strong>Optuna 융합 (고급):</strong> 하이퍼파라미터(Batch size, Learning rate 등)를 수동으로 찾기 힘들다면 <code>Optuna</code> 라이브러리를 Hugging Face <code>Trainer</code>에 연동하여 최적의 조합을 자동으로 찾게 만들 수 있습니다.</li>



<li>평가함수 compute_metrics() 를 numpy로직접 구현하는것보다 최적화된 scikit-learn 활용하면 성능잇점이 있다고함 코드에 주석확인.</li>
</ul>



<h4 class="wp-block-heading">STEP 5. 성능 vs 훈련 시간 분석 및 고도의 시각화 (결과분석)</h4>



<ul class="wp-block-list">
<li><strong>Weights &amp; Biases (W&amp;B) 도입:</strong> * <code>pip install wandb</code>를 설치하고 <code>TrainingArguments</code>에 <code>report_to="wandb"</code>를 추가해 보세요.
<ul class="wp-block-list">
<li>Bucketing을 켰을 때와 껐을 때의 <strong>Loss 하락 곡선</strong>, <strong>GPU 메모리 사용량</strong>, 학습 속도(Steps/sec)를 웹 대시보드에서 화려하고 직관적인 그래프로 겹쳐서 비교할 수 있습니다.</li>
</ul>
</li>



<li><strong>Confusion Matrix (혼동 행렬) 시각화:</strong>
<ul class="wp-block-list">
<li>단순히 Accuracy 숫자만 내지 말고, Validation 세트의 예측 결과를 뽑아 <code>scikit-learn</code>과 <code>seaborn</code>을 활용해 Confusion Matrix를 그려보세요.</li>



<li><em>&#8220;우리 모델은 긍정을 부정으로 착각하는 경우가 더 많을까? 아니면 부정을 긍정으로 착각하는 경우가 더 많을까?&#8221;</em> 같은 깊이 있는 인사이트를 도출할 수 있습니다.</li>
</ul>
</li>



<li><strong>오답 노트 (Error Analysis):</strong>
<ul class="wp-block-list">
<li>모델이 틀린 리뷰들만 따로 모아서 데이터프레임으로 출력해 보세요. &#8220;아, 비꼬는 반어법 리뷰(예: &#8216;참~~ 재밌네&#8217;)를 모델이 못 맞추는구나!&#8221; 같은 정성적인 분석이 가능합니다.</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">Projects Attempts</h2>



<h3 class="wp-block-heading">(1) 첫 번째 시도</h3>



<p class="wp-block-paragraph">첫번 째 시도는 튜토리얼에서 배운것을 한국어버전으로 만들기 위해 최소한의 수정만 거친 버전이다.</p>



<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">graph LR;
a[1.데이터 분석 및 HF Dataset]
b[2.모델 및 tokenizer]
c[3.데이터셋 전처리 모델학습]
d[4.FT로 모델 성능 향상]
e[5.Bucketing 학습 결과분석]
a-->b
b-->c
c-->d
d-->e
</pre></div>



<h4 class="wp-block-heading">(1)-1. EDA</h4>



<p class="wp-block-paragraph">한국어 두문장 관계 데이터셋인 KLUE-STS 사용</p>



<p class="wp-block-paragraph">train/evaluation/test 데이터로 분리: train:10501, evaluation:1167, test:519 | test가 STS자체에서 제공한 validation split.</p>



<p class="wp-block-paragraph">문자열 길이 분포도 확인. (추후 패딩용) 길이가120안에 다 들어가는것을 확인.</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="1021" height="554" data-attachment-id="642" data-permalink="https://blog.kggstudio.com/huggingface-model-customize/image-151/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-60.png" data-orig-size="1021,554" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-60.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-60.png" alt="" class="wp-image-642" style="width:852px;height:auto" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-60.png 1021w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-60-300x163.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-60-768x417.png 768w" sizes="(max-width: 1021px) 100vw, 1021px" /></figure>



<h4 class="wp-block-heading">(1)-2&amp;3. 토크나이저와 모델</h4>



<p class="wp-block-paragraph">라이브러리: transformer<br>언어 모델: klue/bert-base<br>토크나이저: transformer 내장 AutoTokenizer<br>패딩: 추후 동적패딩과 성능비교를 해보기위해 <strong>정적 패딩</strong> 사용. EDA에서 확인한 문자열길이를 기준으로 모든 데이터를 커버할수있는 <strong>MAX_LENGTH=128</strong><br>패딩 데이터 직접확인, 레이블도 앞부분 14개 확인해봤는데 1개뺴고 다 맞다고 판단 (신뢰도 90%+)<br>첫시도 특별한 전처리는 없이 바로 실행</p>



<h4 class="wp-block-heading">(1)-4. Train/Evaluation과 Test</h4>



<p class="wp-block-paragraph">best checkpoint는 <strong>f1</strong> 기준으로 선택.</p>



<h4 class="wp-block-heading">소스코드</h4>



<p class="wp-block-paragraph"><a href="https://github.com/ohmanbo/AIFFEL_quest_eng/blob/main/LLM_Application/LLM04/HF_korean_project.ipynb">https://github.com/ohmanbo/AIFFEL_quest_eng/blob/main/LLM_Application/LLM04/HF_korean_project.ipynb</a></p>



<h4 class="wp-block-heading">6. 결과</h4>



<p class="wp-block-paragraph">훈련시간: 196.7s </p>



<div>
<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-right" data-align="right">Training Loss</th><th class="has-text-align-right" data-align="right">Validation Loss</th><th class="has-text-align-right" data-align="right">Epoch</th><th class="has-text-align-right" data-align="right">Accuracy</th><th class="has-text-align-right" data-align="right">Precision</th><th class="has-text-align-right" data-align="right">Recall</th><th class="has-text-align-right" data-align="right">F1</th></tr></thead><tbody><tr><td>0.006817</td><td>0.855822</td><td>3</td><td>0.842004</td><td>0.751825</td><td>0.936364</td><td>0.834008</td></tr></tbody></table></figure>
</div>



<p class="wp-block-paragraph">Validation Accuracy <strong>83.0% &lt; 90% (부적격)</strong></p>



<h4 class="wp-block-heading">(1) tiral + 동적패딩 적용결과</h4>



<p class="wp-block-paragraph">훈련시간: 126s</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-right" data-align="right">Training Loss</th><th class="has-text-align-right" data-align="right">Validation Loss</th><th class="has-text-align-right" data-align="right">Epoch</th><th class="has-text-align-right" data-align="right">Accuracy</th><th class="has-text-align-right" data-align="right">Precision</th><th class="has-text-align-right" data-align="right">Recall</th><th class="has-text-align-right" data-align="right">F1</th></tr></thead><tbody><tr><td>0.034485</td><td>0.947046</td><td>3</td><td>0.816956</td><td>0.719298</td><td>0.931818</td><td>0.811881</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Validation Accuracy <strong>81.7% &lt; 90% (부적격)</strong></p>



<h4 class="wp-block-heading">훈련시간은 늘어나고 정확도는 줄어드는 상콤한 상황!</h4>



<p class="wp-block-paragraph">[최종 평가 지표]</p>



<p class="wp-block-paragraph">정적 패딩 평가 결과:<br>{&#8216;eval_loss&#8217;: 0.8487739562988281, <strong>&#8216;eval_accuracy&#8217;: 0.8304431599229287</strong>, &#8216;eval_precision&#8217;: 0.7408759124087592, &#8216;eval_recall&#8217;: 0.9227272727272727, &#8216;eval_f1&#8217;: 0.8218623481781376}<br>버키팅 동적 패딩 평가 결과:<br>{&#8216;eval_loss&#8217;: 0.9469589591026306, <strong>&#8216;eval_accuracy&#8217;: 0.8169556840077071,</strong> &#8216;eval_precision&#8217;: 0.7192982456140351, &#8216;eval_recall&#8217;: 0.9318181818181818, &#8216;eval_f1&#8217;: 0.8118811881188119}<br></p>



<h4 class="wp-block-heading">확실히 동적패딩이 학습 속도는 눈에띄게 빨라지지만, 정확도는 낮은 문제가 발생 (trade-off 확인)</h4>



<h3 class="wp-block-heading">2번째 시도 &#8211; 학습을 위한 전략</h3>



<p class="wp-block-paragraph">A. STS 데이터셋에 label (True or False) 말고, real-label이라고 회귀값이 존재하는데 이걸기준으로 threadhold 조정해서 positive , negative 비율 postive가 좀더 많이 나오도록 조절하기.</p>



<p class="wp-block-paragraph">&nbsp;KLUE-STS 점수 회귀 학습 후 threshold로 이진화하는 방식이 더 유력함</p>



<ul class="wp-block-list">
<li>현재: 문장쌍 -&gt; positive/negative</li>



<li>변경: 문장쌍 -&gt; 유사도 점수 -&gt; threshold로 positive/negative</li>
</ul>



<p class="wp-block-paragraph">B. 학습데이터가 크지않으니 evaluation으로 빼놨던 나머지 10%도 Train에 사용하기</p>



<p class="wp-block-paragraph">C. epoch를 3회돌렸는데 10회만 돌리기.</p>



<p class="wp-block-paragraph">D. 정적패딩 사용하기. 동적패딩이랑 속도차이가 몇배나는게아니고 30%정도만 빨라져서 그정도면 모델 성능을 위해 희생할만한 학습시간이라고 생각됨. 동적패딩 아예 코드도 넣지말기.</p>



<p class="wp-block-paragraph">E. Learning rate를 2e-5 에서 2e-5 부터 5e-5 4단계로 시도해보고 가장좋은값 사용.</p>



<p class="wp-block-paragraph">F. batch size 16으로 수정</p>



<p class="wp-block-paragraph">G. 모델변경 klue/roberta-base<br><br>H. wandb.init 에서 name을 2nd trial로 수정</p>



<h4 class="wp-block-heading">소스코드</h4>



<p class="wp-block-paragraph"><a href="https://github.com/ohmanbo/AIFFEL_quest_eng/blob/main/LLM_Application/LLM04/HF_korean_project_v2.ipynb">https://github.com/ohmanbo/AIFFEL_quest_eng/blob/main/LLM_Application/LLM04/HF_korean_project_v2.ipynb</a></p>



<h4 class="wp-block-heading">학습결과</h4>



<p class="wp-block-paragraph">lr=2e-05 accuracy=0.9383 f1=0.9498 threshold=2.25 pred_positive_ratio=0.6185 time=708.07s<br><strong>lr=3e-05 accuracy=0.9461 f1=0.9560 threshold=2.35 pred_positive_ratio=0.6146 time=788.65s</strong><br>lr=4e-05 accuracy=0.9383 f1=0.9511 threshold=2.15 pred_positive_ratio=0.6493 time=540.65s<br>lr=5e-05 accuracy=0.9345 f1=0.9459 threshold=2.45 pred_positive_ratio=0.5992 time=557.46s</p>



<p class="wp-block-paragraph">선택된 learning rate: 3e-05<br>선택된 prediction threshold: 2.35<br>선택된 모델 경로: transformers_klue_sts_regression_roberta_lr_3em05\best_model</p>



<h4 class="wp-block-heading">테스트셋 결과</h4>



<p class="wp-block-paragraph">{&#8216;eval_loss&#8217;: 0.33285850286483765, &#8216;eval_mse&#8217;: 0.3327992324688497, &#8216;eval_mae&#8217;: 0.4282605896357569, &#8216;eval_accuracy&#8217;: 0.9460500963391136, &#8216;eval_precision&#8217;: 0.9529780564263323, &#8216;eval_recall&#8217;: 0.9589905362776026, &#8216;eval_f1&#8217;: 0.9559748427672956, &#8216;eval_pred_positive_ratio&#8217;: 0.6146435452793835}</p>



<h4 class="wp-block-heading">직접 작성한 예문 테스트</h4>



<h5 class="wp-block-heading">1) 바쁘다 -&gt; 친절하다 로 바뀌면 유사도가 낮아서 negative -&gt; <strong>의도한 대로 작동 GOOD</strong></h5>



<figure class="wp-block-image size-full"><img decoding="async" width="896" height="535" data-attachment-id="645" data-permalink="https://blog.kggstudio.com/huggingface-model-customize/image-152/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-61.png" data-orig-size="896,535" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-61.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-61.png" alt="" class="wp-image-645" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-61.png 896w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-61-300x179.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-61-768x459.png 768w" sizes="(max-width: 896px) 100vw, 896px" /></figure>



<h5 class="wp-block-heading">2) (맥북, 스타벅스) -&gt; (노트북, 카페) 유사도 높음</h5>



<p class="wp-block-paragraph">and</p>



<h5 class="wp-block-heading">(맥북, 스타벅스) -&gt; (비싼시계, 카페) 유사도 낮음  <strong>-&gt; 의도한 대로 작동 GOOD</strong></h5>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="906" height="529" data-attachment-id="646" data-permalink="https://blog.kggstudio.com/huggingface-model-customize/image-153/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-62.png" data-orig-size="906,529" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-62.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-62.png" alt="" class="wp-image-646" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-62.png 906w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-62-300x175.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-62-768x448.png 768w" sizes="auto, (max-width: 906px) 100vw, 906px" /></figure>



<h5 class="wp-block-heading">3) 이건 예시가 좀 많이 바뀌어서 직관적이지 않은데, (AIFFEL 딥러닝) -&gt; (APPLE, 맥북) 유사도낮음.</h5>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="870" height="528" data-attachment-id="647" data-permalink="https://blog.kggstudio.com/huggingface-model-customize/image-154/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-63.png" data-orig-size="870,528" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-63.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-63.png" alt="" class="wp-image-647" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-63.png 870w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-63-300x182.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-63-768x466.png 768w" sizes="auto, (max-width: 870px) 100vw, 870px" /></figure>



<h3 class="wp-block-heading">3번째 (generate paraphrased sentences)</h3>



<p class="wp-block-paragraph">우선 두번째 학습결과가 지표로보나 실제 테스트결과로보나 너무 잘나와서 더 진행하지않아도 될것같다. 무얼 해볼까 계속 고민하던중 유사문장을 구분하는게아닌 유사문장을 만들어주는 기능을 만들어보면 어떨까 싶어서 decoder모델을 fine-tuning하기로 정했다.</p>



<p class="wp-block-paragraph">모델은 Qwen3.5-4B로 정했는데 추론성능만 생각하고 너무 쉽게 정한게 아닌가싶다 ㅠㅠ 학습시키는데 1epoch에  3시간이 넘게 소요된다. 이런이유로 아직 결과가 나오지않아서 프로젝트 제출은 2번째로 제출하였다.</p>



<h4 class="wp-block-heading">소스코드</h4>



<p class="wp-block-paragraph"><a href="https://github.com/ohmanbo/AIFFEL_quest_eng/blob/main/LLM_Application/LLM04/HF_korean_project_v3.ipynb">https://github.com/ohmanbo/AIFFEL_quest_eng/blob/main/LLM_Application/LLM04/HF_korean_project_v3.ipynb</a></p>



<p class="wp-block-paragraph">커널 재시작후 저장된 모델, lora 파일들을 불러와서 다시 실행할수있도록 만든 standalone 버전 (모델은 용량때문에 못올림)</p>



<p class="wp-block-paragraph"><a href="https://github.com/ohmanbo/AIFFEL_quest_eng/blob/main/LLM_Application/LLM04/HF_korean_project_v3_test.ipynb">https://github.com/ohmanbo/AIFFEL_quest_eng/blob/main/LLM_Application/LLM04/HF_korean_project_v3_test.ipynb</a></p>



<h4 class="wp-block-heading">프로젝트 구성 (기존방법에서 바뀐부분)</h4>



<ol class="wp-block-list">
<li>KLUE-STS 로드 (1~2번째에서 학습에 사용한 동일한 데이터)</li>



<li>real-label &gt;= 4.0 데이터만 paraphrase pair로 변환 </li>



<li>Qwen3.5-4B LoRA/QLoRA SFT </li>



<li>입력 문장으로 후보 30개 생성 </li>



<li>기존 STS regression 모델로 후보 점수 계산 </li>



<li>top 10 정렬 출력</li>
</ol>



<p class="wp-block-paragraph">구성을 보면 알겠지만, 학습한모델로 유사문장을 30개 생성후 top10를 출력해주는 프로젝트이다 아직 학습중인데 결과가 어떤지에따라 추가계획을 생각해볼생각.</p>



<h4 class="wp-block-heading">학습결과</h4>



<p class="wp-block-paragraph">학습시간 20314초 = 약 5시간 40분 (너무 오래걸려서 2epoch만 돌림)</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Epoch</th><th class="has-text-align-left" data-align="left">Training Loss</th><th class="has-text-align-left" data-align="left">Validation Loss</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left">1</td><td class="has-text-align-left" data-align="left">1.013295</td><td class="has-text-align-left" data-align="left">1.159228</td></tr><tr><td class="has-text-align-left" data-align="left">2</td><td class="has-text-align-left" data-align="left">0.723310</td><td class="has-text-align-left" data-align="left">1.156065</td></tr></tbody></table></figure>



<h4 class="wp-block-heading">테스트 1</h4>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="469" data-attachment-id="651" data-permalink="https://blog.kggstudio.com/huggingface-model-customize/image-155/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-64.png" data-orig-size="1110,508" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-64-1024x469.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-64-1024x469.png" alt="" class="wp-image-651" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-64-1024x469.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-64-300x137.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-64-768x351.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-64.png 1110w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">꽤 자연스스럽게 새로운 문장을 만들어내고, 07번째를 보면, 여자라고 입력하지않았는데도 여자라고 유추를 한건지 아무튼 그렇습니다.</p>



<h4 class="wp-block-heading">테스트 2</h4>



<p class="wp-block-paragraph">다음에는 복잡한 문장을 해봤는데요</p>



<ol class="wp-block-list">
<li>이건 대단한 기술이다</li>



<li>폴란드에는 이미수출했고, 여러나라에서 사고싶어 한다.</li>



<li>그 기술은 대한민국 방산 기술이다.</li>
</ol>



<p class="wp-block-paragraph">라는 2개의 단순문장과 1개의 복잡한문장 총 3개를 사용해서 모델이 어떻게 paraphrase하는지 확인해보았더니,</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="477" data-attachment-id="652" data-permalink="https://blog.kggstudio.com/huggingface-model-customize/image-156/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-65.png" data-orig-size="1127,525" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-65-1024x477.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-65-1024x477.png" alt="" class="wp-image-652" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-65-1024x477.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-65-300x140.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-65-768x358.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-65.png 1127w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">그럴듯 하지만, 대부분 맞지만 여러개의 오류도 쉽게 찾을수 있었습니다. 아무래도 학습한 예문이 복잡한문장이 많이 없어서 그런것 같습니다. 이런걸 개선하려면 더 복잡한 문장 또는 문단단위로 학습을하면 좋아질수도 있지않을까 생각해봅니다.</p>



<h4 class="wp-block-heading">테스트 3</h4>



<p class="wp-block-paragraph">다시 복잡한 문장 1개만 가지고 해보았더니 정말 자연스럽게 다시 만들어주는걸 확인할 수 있었습니다.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="471" data-attachment-id="653" data-permalink="https://blog.kggstudio.com/huggingface-model-customize/image-157/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-66.png" data-orig-size="1110,511" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-66-1024x471.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-66-1024x471.png" alt="" class="wp-image-653" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-66-1024x471.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-66-300x138.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-66-768x354.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-66.png 1110w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading">테스트 4</h4>



<p class="wp-block-paragraph">혹시 모델 자체가 성능이 좋아서 그런게 아닐까? 해서 영어문장도 테스트해보았는데,</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="380" data-attachment-id="654" data-permalink="https://blog.kggstudio.com/huggingface-model-customize/image-158/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-67.png" data-orig-size="1070,397" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-67-1024x380.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-67-1024x380.png" alt="" class="wp-image-654" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-67-1024x380.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-67-300x111.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-67-768x285.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-67.png 1070w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">영어문장은 자연스럽지 않고, 한국어로 번역을 하려고하는걸봐서 확실히 모델도 좋지만, fine-tuning 영향이 적지않다는걸 느꼇습니다. 애초에 qwen 한국어보다 영어를 더 잘하는데 이런결과가 나온걸 보면요.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kggstudio.com/huggingface-model-customize/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">641</post-id>	</item>
		<item>
		<title>Transformer (0) 강의 메모</title>
		<link>https://blog.kggstudio.com/transformer-0/</link>
					<comments>https://blog.kggstudio.com/transformer-0/#respond</comments>
		
		<dc:creator><![CDATA[TimTam]]></dc:creator>
		<pubDate>Mon, 11 May 2026 07:06:58 +0000</pubDate>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[LLM]]></category>
		<guid isPermaLink="false">https://blog.kggstudio.com/?p=620</guid>

					<description><![CDATA[트랜스포머는 왜 좋은가? Self-Attention Layer Feed Forward Neural Network 모델의 비선형성 추가 Input Embedding Positional Encoding Self-Attention Q, K, V Value 벡터가 softmax 결과값과 곱해져서 Attention 벡터가됨 원래 임베딩 테이블에는 &#8220;tower&#8221;라는 단어 하나에 벡터 하나만 있어. 이건 &#8220;타워&#8221;의 평균적인 의미라서, 건축물인지 중장비인지 구분되지 않아. Self-Attention을 거치면 같은 &#8220;tower&#8221;라도 주변 단어에 따라 다른 벡터가 돼. Self ... <a title="Transformer (0) 강의 메모" class="read-more" href="https://blog.kggstudio.com/transformer-0/" aria-label="Transformer (0) 강의 메모에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">트랜스포머는 왜 좋은가?</p>



<ul class="wp-block-list">
<li>병렬처리</li>



<li>모든 시퀀스를 한번에 처리</li>
</ul>



<p class="wp-block-paragraph">Self-Attention Layer</p>



<ul class="wp-block-list">
<li>하나의 정보를 처리할 때 input sequence의 다른 정보들의 영향력을 계산</li>
</ul>



<p class="wp-block-paragraph">Feed Forward Neural Network</p>



<p class="wp-block-paragraph">모델의 비선형성 추가</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="507" data-attachment-id="623" data-permalink="https://blog.kggstudio.com/transformer-0/image-140/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-49.png" data-orig-size="1113,551" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-49-1024x507.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-49-1024x507.png" alt="" class="wp-image-623" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-49-1024x507.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-49-300x149.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-49-768x380.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-49.png 1113w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="405" data-attachment-id="624" data-permalink="https://blog.kggstudio.com/transformer-0/image-141/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-50.png" data-orig-size="1234,488" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-50-1024x405.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-50-1024x405.png" alt="" class="wp-image-624" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-50-1024x405.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-50-300x119.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-50-768x304.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-50.png 1234w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="244" data-attachment-id="625" data-permalink="https://blog.kggstudio.com/transformer-0/image-142/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-51.png" data-orig-size="1109,264" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-51-1024x244.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-51-1024x244.png" alt="" class="wp-image-625" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-51-1024x244.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-51-300x71.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-51-768x183.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-51.png 1109w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Input Embedding</p>



<ul class="wp-block-list">
<li>Input -> embedding algorithm -> 토큰 벡터화</li>
</ul>



<p class="wp-block-paragraph">Positional Encoding</p>



<ul class="wp-block-list">
<li>추론시 필요한 순서정보를 보존하기 위해 (번역, 생성, 문맥 이해 등에 필요)</li>



<li>병렬처리를 가능하게함.</li>
</ul>



<ul class="wp-block-list">
<li>RNN은 토큰을 하나씩 입력하지만 Transformer는 한번에 모든 단어를 처리
<ul class="wp-block-list">
<li>위치 정보를 보존해야 할 필요성이 있다.</li>
</ul>
</li>



<li>Sin &amp; Cos 사용하는 이유
<ul class="wp-block-list">
<li>같은 위치 정보에 해당하는 위치 벡터 값이 같아야 한다. (주기성)</li>



<li>위치 벡터의 값이 너무 커지면 안된다. (-1 ~ 1)</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">Self-Attention</p>



<ul class="wp-block-list">
<li>하나의 정보를 처리할 때 input sequence의 다른 정보들의 영향력을 계산 -> <strong>Dependency가 존재</strong>한다.</li>



<li>Feed Forward Network에는 <strong>dependency가 존재하지 않는</strong>다.</li>
</ul>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="806" height="555" data-attachment-id="621" data-permalink="https://blog.kggstudio.com/transformer-0/image-138/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-47.png" data-orig-size="806,555" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-47.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-47.png" alt="" class="wp-image-621" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-47.png 806w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-47-300x207.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-47-768x529.png 768w" sizes="auto, (max-width: 806px) 100vw, 806px" /></figure>



<p class="wp-block-paragraph">Q, K, V</p>



<ul class="wp-block-list">
<li>3개의 vector 생성 -> Encoder의 input vector
<ul class="wp-block-list">
<li>Query : 현재 단어의 표현, “나는 지금 무엇을 찾고 있나?”</li>



<li>Key : 각 토큰이 “나는 이런 특징으로 검색될 수 있다”고 내놓는 검색용 특징</li>



<li>Value : 실제 단어의 표현 즉 실제 값, “쿼리와 키를 비교해서 나온 score”</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"><strong>Value 벡터가 softmax 결과값과 곱해져서 Attention 벡터가됨</strong></p>



<p class="wp-block-paragraph">원래 임베딩 테이블에는 &#8220;tower&#8221;라는 단어 하나에 <strong>벡터 하나</strong>만 있어. 이건 &#8220;타워&#8221;의 평균적인 의미라서, 건축물인지 중장비인지 구분되지 않아.</p>



<pre class="wp-block-code"><code>임베딩 테이블의 "tower":
&#91;0.5, -0.2, 0.8, ...]  ← 어떤 tower인지 모름</code></pre>



<p class="wp-block-paragraph">Self-Attention을 거치면 같은 &#8220;tower&#8221;라도 주변 단어에 따라 <strong>다른 벡터</strong>가 돼.</p>



<pre class="wp-block-code"><code>"Eiffel tower"에서의 tower:
α(Eiffel)=0.7, α(tower)=0.3
→ 새 벡터 = 0.7·V(Eiffel) + 0.3·V(tower)
→ 건축물/파리/높음 의미 쪽으로 이동

"crane tower"에서의 tower:
α(crane)=0.7, α(tower)=0.3
→ 새 벡터 = 0.7·V(crane) + 0.3·V(tower)
→ 중장비/건설/금속 의미 쪽으로 이동</code></pre>



<p class="wp-block-paragraph">Self Attention 재 정리</p>



<p class="wp-block-paragraph">Step 1: q, k, v 생성</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="765" height="438" data-attachment-id="622" data-permalink="https://blog.kggstudio.com/transformer-0/image-139/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-48.png" data-orig-size="765,438" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-48.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-48.png" alt="" class="wp-image-622" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-48.png 765w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-48-300x172.png 300w" sizes="auto, (max-width: 765px) 100vw, 765px" /></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Residual Connection</p>



<p class="wp-block-paragraph">Layer Normalization</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kggstudio.com/transformer-0/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">620</post-id>	</item>
		<item>
		<title>Transformer (2)</title>
		<link>https://blog.kggstudio.com/transformer-2/</link>
					<comments>https://blog.kggstudio.com/transformer-2/#respond</comments>
		
		<dc:creator><![CDATA[TimTam]]></dc:creator>
		<pubDate>Sat, 09 May 2026 18:12:22 +0000</pubDate>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[Transformer]]></category>
		<guid isPermaLink="false">https://blog.kggstudio.com/?p=561</guid>

					<description><![CDATA[이 글은 Stanford CME295 Transformers &#38; LLMs 클래스 유튜브영상을 보고 요약한 내용입니다. Transformer의 등장 배경, 특징등이 궁금하다면 이전 글을 참조해주세요. 1. 강의 소개 강의 목표 강의 대상 Textbook Super Study Guide 강의 링크 https://cme295.stanford.edu 치트 시트 출처: https://github.com/afshinea/stanford-cme-295-transformers-large-language-models 2. NLP tasks overview (자연어 처리 3가지 작업) Classification (분류) &#8220;Multi&#8221;-classification (다중분류) Generation (생성) Sentiment extraction (감정 ... <a title="Transformer (2)" class="read-more" href="https://blog.kggstudio.com/transformer-2/" aria-label="Transformer (2)에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">이 글은 Stanford CME295 Transformers &amp; LLMs 클래스 유튜브영상을 보고 요약한 내용입니다.</p>



<pre class="wp-block-code"><code>https:&#47;&#47;www.youtube.com/watch?v=Ub3GoFaUcds</code></pre>



<p class="wp-block-paragraph">Transformer의 등장 배경, 특징등이 궁금하다면 이전 글을 참조해주세요.</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-kgg-studio wp-block-embed-kgg-studio"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="C9QqtGbAaA"><a href="https://blog.kggstudio.com/transformer-1/">Transformer (1)</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;Transformer (1)&#8221; &#8212; KGG Studio" src="https://blog.kggstudio.com/transformer-1/embed/#?secret=90new3efua#?secret=C9QqtGbAaA" data-secret="C9QqtGbAaA" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<h2 class="wp-block-heading">1. 강의 소개</h2>



<h3 class="wp-block-heading">강의 목표</h3>



<ol class="wp-block-list">
<li>Transformer가 어떻게 작동하고, LLM과 어떤 연관성이 있는지 이해하기.</li>



<li>LLMs 이 어떻게 훈련되고 어떤 다양한 용도로 사용되는지 배운다.</li>
</ol>



<h3 class="wp-block-heading">강의 대상</h3>



<ul class="wp-block-list">
<li>머신러닝 기본을 이해 하는 자</li>



<li>선형 대수학을 이해 하는 자</li>



<li>LLM에 관심있는 자</li>
</ul>



<h3 class="wp-block-heading">Textbook</h3>



<p class="wp-block-paragraph"><a href="https://superstudy.guide/transformers-large-language-models/">Super Study Guide</a></p>



<h3 class="wp-block-heading">강의 링크</h3>



<p class="wp-block-paragraph"><a href="https://cme295.stanford.edu">https://cme295.stanford.edu</a></p>



<h3 class="wp-block-heading">치트 시트</h3>



<p class="wp-block-paragraph">출처: <a href="https://github.com/afshinea/stanford-cme-295-transformers-large-language-models">https://github.com/afshinea/stanford-cme-295-transformers-large-language-models</a></p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="791" data-attachment-id="562" data-permalink="https://blog.kggstudio.com/transformer-2/transformer-cheatsheet/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/transformer-cheatsheet.png" data-orig-size="1999,1545" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="transformer cheatsheet" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/transformer-cheatsheet-1024x791.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/transformer-cheatsheet-1024x791.png" alt="" class="wp-image-562" style="width:1132px;height:auto" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/transformer-cheatsheet-1024x791.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/05/transformer-cheatsheet-300x232.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/transformer-cheatsheet-768x594.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/transformer-cheatsheet-1536x1187.png 1536w, https://blog.kggstudio.com/wp-content/uploads/2026/05/transformer-cheatsheet.png 1999w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="834" height="1024" data-attachment-id="618" data-permalink="https://blog.kggstudio.com/transformer-2/image-137/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-46.png" data-orig-size="1000,1228" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-46-834x1024.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-46-834x1024.png" alt="" class="wp-image-618" style="width:857px;height:auto" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-46-834x1024.png 834w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-46-244x300.png 244w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-46-768x943.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-46.png 1000w" sizes="auto, (max-width: 834px) 100vw, 834px" /></figure>



<h2 class="wp-block-heading">2. NLP tasks overview (자연어 처리 3가지 작업)</h2>



<h3 class="wp-block-heading">Classification (분류)</h3>



<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">graph LR;
    A(Input Text) --> B[Model];
    B --> C(3);</pre></div>



<ul class="wp-block-list">
<li>Sentiment extraction (감정 추출): 스토리를 읽고, 슬픈지 기쁜지 등 감정을 추출함.</li>



<li>Intent detection(목적 감지): 프롬프트가 &#8220;6시에 알람 맞춰줘&#8221; 라면 알람을 설정하는게 목적인것을 파악해냄.</li>



<li>Language detection(언어 감지): 영어인지 한국어인지 판별.</li>



<li>Topic modeling</li>
</ul>



<h3 class="wp-block-heading">&#8220;Multi&#8221;-classification (다중분류)</h3>



<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">graph LR;
    A(Input Text) --> B[Model];
    B --> C(3:Input, 5:text);</pre></div>



<ul class="wp-block-list">
<li>Part of speech tagging</li>



<li>Named entity recognition (NER): 장소, 시간, 사물등 알려진 entity를 인식함.</li>



<li>Dependency parsing</li>



<li>Constituency parsing</li>
</ul>



<h3 class="wp-block-heading">Generation (생성)</h3>



<div>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">graph LR;
    A(Input text) --> B[Model];
    B --> C(Out text);</pre></div>
</div>



<ul class="wp-block-list">
<li>머신 번역 (언어 번역, 영어 -> 한국어)</li>



<li>질문에 답변</li>



<li>요약</li>



<li>텍스트 생성 (소설, code 등)</li>
</ul>



<h3 class="wp-block-heading">Sentiment extraction (감정 추출)</h3>



<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">graph LR;
A>This teddy bear is SO CUTE!] --> B[Model]
B --> C('+')</pre></div>



<h2 class="wp-block-heading">3. Tokenization (토큰화)</h2>



<p class="wp-block-paragraph">모델은 (컴퓨터는) text를 이해할수없어서 문자를 숫자데이터로 바꿔줘야한다.</p>



<p class="wp-block-paragraph">A cute teddy bear is reading.</p>



<p class="wp-block-paragraph">text는 복잡하고 무한이 많은 조합이 가능하기때문에 문장단위로 토큰화하는건 무한히 많은 메모리를 요구하므로 불가능하고 문장을 토큰단위로 쪼개어 컴퓨터가 이해할수 있도록 만들어야한다.</p>



<p class="wp-block-paragraph">토큰화 방식은 다양 한방법이 존재한다</p>



<h4 class="wp-block-heading">arbitrary (문법/띄어쓰기)</h4>



<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">graph TD;
A[A]
B[cute]
c[teddy bear]
d[is]
e[reading]
f[.]
</pre></div>



<h4 class="wp-block-heading">word (단어)</h4>



<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">graph TD;
A[A]
B[cute]
c[teddy]
d[bear]
e[is]
f[reading]
g[.]
</pre></div>



<h4 class="wp-block-heading">sub-word (하위 단어)</h4>



<p class="wp-block-paragraph">sub-word 는 하위단어 토큰화방식인데 한마디로 단어뿌리기반으로 분리해서 의미를 word 기반보다 더 작게 쪼개는것입니다.<br>car 와 cars 라는 단어가 있을때 이 둘은 비슷하지만 다릅니다 car는 a car, the car, your car 이런식으로만 등장이 가능하지만 cars는 a나 the 같은 관사 없이도 사용이 가능합니다.<br>이걸 분리해주지 않으면, 모델은 이부분을 학습하기가 매우 어려울것입니다. a cars 같은 틀린 문법이 번역 결과로 출력이 될수도 있겠죠.</p>



<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">graph TD;
A[A]
B[cute]
c<!-- Missing TED ID -->
d[##dy] 
e[bear]
f[is]
g[read]
h[##ing]
i[.]
</pre></div>



<p class="wp-block-paragraph">이 예제에서도 read 와 read+ing인 reading은  전혀 다른의미가 되는데, 이런식으로 분리해주면 모델이 prefix suffix개념도 이해 할수있게 된다.</p>



<h4 class="wp-block-heading">character-level (자소단위)</h4>



<p class="wp-block-paragraph">자소단위는 오타나, 대소문자 (영어의경우) 오류, 에 강해지는 장점이 있지만, 비현실적인 vocab(단어장) 사이즈에 처리속도가 매우느리고, 자소단위는 의미가없어서 모델이 의미를 이해하는게 거의 불가능하다. 물론 짧고 간단한 문장은 처리가 가능하기도 하지만. 현재 실제로는 쓰이지않는다.</p>



<h4 class="wp-block-heading">한국어의 subword</h4>



<p class="wp-block-paragraph">한국어도, 띄어쓰기, 단어, 글자, 자소, 하위단어 등 여러기준으로 토큰을 나눌수있고 현재 가장 많이 쓰이는건 &#8220;하위단어 기반 토크나이저&#8221; 이다.</p>



<p class="wp-block-paragraph">다시한번 강조하지만 토큰화를 시키는 이유는 메모리 한계 때문이기도 하지만, <strong>의미 단위로 쪼개</strong>져야 AI 모델이 토큰을 재조합해 새로운 글을 작성할수 있다.</p>



<h2 class="wp-block-heading">Word representation (단어 표현)</h2>



<h3 class="wp-block-heading">One hot encoding (OHE)</h3>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="981" data-attachment-id="565" data-permalink="https://blog.kggstudio.com/transformer-2/image-93/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-2.png" data-orig-size="1440,1380" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-2-1024x981.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-2-1024x981.png" alt="" class="wp-image-565" style="width:310px;height:auto" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-2-1024x981.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-2-300x288.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-2-768x736.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-2.png 1440w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">사람들이 주로 쓰는 유사도 측정방식으로는 Cosine Similarity가 존재하는데, 이 방식은 토큰마다 축을 따로만들어야함. 이렇게되면 vocab 수만큼 축이 생기는데, 모든토큰이 다른토큰벡터들로부터 직교를하게되어서 유사도 측정이 불가능함.</p>



<p class="wp-block-paragraph">사실 이런이유가 아니어도 LLM을만들기 위해서는 무수히 많은 단어를 여러언어로 학습시켜야하는데, 이 방식은 가중치 용량이 너무커져서 사실상 안씀. 못씀.</p>



<h3 class="wp-block-heading">Embedding 도입</h3>



<p class="wp-block-paragraph">임베딩은 토큰마다 축을 만드는게아님</p>



<h2 class="wp-block-heading">Lecture 2 &#8211; Transformer-Based Models &amp; Tricks</h2>



<pre class="wp-block-code"><code>https:&#47;&#47;www.youtube.com/watch?v=yT84Y5zCnaA&amp;list=PLoROMvodv4rOCXd21gf0CF4xr35yINeOy&amp;index=2</code></pre>



<h3 class="wp-block-heading">Transformer 전체 흐름을 정검</h3>



<p class="wp-block-paragraph">아래 플로우 차트에서 왼쪽은 <strong>Encoder</strong> 오른쪽은 <strong>Decoder</strong> Component이다.</p>



<p class="wp-block-paragraph">이 형태가 기본형인 이유는 Transformer가 처음에 머신러닝을 활용한 번역모델로 개발되었기 때문이다.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="300" height="442" data-attachment-id="571" data-permalink="https://blog.kggstudio.com/transformer-2/image-94/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-3.png" data-orig-size="300,442" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-3.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-3.png" alt="" class="wp-image-571" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-3.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-3-204x300.png 204w" sizes="auto, (max-width: 300px) 100vw, 300px" /></figure>



<h4 class="wp-block-heading">Multi-Head Attention Layer</h4>



<p class="wp-block-paragraph">이곳이 바로 self-attention 매커니즘이 작동하는 위치이다. 이 그림에서 Scaled Dot-Product Attention 부분에서 h의 갯수가 head의 갯수다. 이 갯수만큼 attention 매커니즘을 반복한다.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="313" height="407" data-attachment-id="578" data-permalink="https://blog.kggstudio.com/transformer-2/image-99/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-8.png" data-orig-size="313,407" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-8.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-8.png" alt="" class="wp-image-578" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-8.png 313w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-8-231x300.png 231w" sizes="auto, (max-width: 313px) 100vw, 313px" /></figure>



<h4 class="wp-block-heading">Attention Map</h4>



<p class="wp-block-paragraph">각 토큰(단어, Q)와 K를 내적해서 큰 값 (= 코사인 유사도가 큰값)에 매칭 시켜준다. <br>이 후 위에있는 softmax 함수처럼 Root dk로 나눠준다. (값이 너무 커지거나 작아지는걸 방지)</p>



<p class="wp-block-paragraph">스탠포드 교수는 각 header마다 서로다른 시각으로 단어가 무슨 의미를 갖는지 이해 할거라고(may) 한다</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="562" height="522" data-attachment-id="580" data-permalink="https://blog.kggstudio.com/transformer-2/image-101/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-10.png" data-orig-size="562,522" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-10.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-10.png" alt="" class="wp-image-580" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-10.png 562w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-10-300x279.png 300w" sizes="auto, (max-width: 562px) 100vw, 562px" /></figure>



<h4 class="wp-block-heading">Masked vs unmasked 차이 &#8211; 미래를 볼 수 있는지 차이</h4>



<figure class="wp-block-image size-large is-resized"><img decoding="async" data-attachment-id="574" data-permalink="https://blog.kggstudio.com/transformer-2/masked_vs_unmasked_attention/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/masked_vs_unmasked_attention.svg" data-orig-size="100,0" data-comments-opened="1" data-image-meta="[]" data-image-title="masked_vs_unmasked_attention" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/masked_vs_unmasked_attention.svg" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/masked_vs_unmasked_attention.svg" alt="" class="wp-image-574" style="aspect-ratio:1.4167532737476616;width:981px;height:auto"/></figure>



<h4 class="wp-block-heading">Decoder에서 masked &amp; unmasked 2중으로 처리하는 이유</h4>



<h4 class="wp-block-heading">두 Attention의 역할 분담</h4>



<p class="wp-block-paragraph">이렇게 비유해볼게. 통역사가 한국어로 통역할 때 머릿속에서 두 가지를 동시에 해야 해.</p>



<p class="wp-block-paragraph"><strong>Masked Self-Attention의 역할</strong> — &#8220;내가 방금까지 한국어로 뭐라고 말했더라?&#8221;</p>



<p class="wp-block-paragraph">지금까지 만든 한국어 문장의 흐름을 파악하는 거야. &#8220;나는 학교에서&#8221;까지 말했으면 다음에 동사가 와야 자연스럽다는 걸 한국어 문법 차원에서 판단해. 이건 영어 원문과는 무관한, <strong>출력 언어 자체의 일관성</strong>을 챙기는 단계.</p>



<p class="wp-block-paragraph"><strong>Encoder-Decoder Attention의 역할</strong> — &#8220;그런데 영어 원문은 뭐였지?&#8221;</p>



<p class="wp-block-paragraph">이제 영어 원문을 다시 들여다봐. &#8220;school&#8221; 다음 위치에 해당하는 의미를 찾아야 한다고 판단하면, 인코더 출력에서 &#8220;study&#8221; 토큰에 높은 가중치를 줘. 이건 <strong>소스 언어와 타겟 언어를 연결</strong>하는 단계.</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" data-attachment-id="575" data-permalink="https://blog.kggstudio.com/transformer-2/decoder_two_attentions_reason/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/decoder_two_attentions_reason.svg" data-orig-size="100,0" data-comments-opened="1" data-image-meta="[]" data-image-title="decoder_two_attentions_reason" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/decoder_two_attentions_reason.svg" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/decoder_two_attentions_reason.svg" alt="" class="wp-image-575" style="aspect-ratio:1.0303282093892812;width:997px;height:auto"/></figure>



<h3 class="wp-block-heading">Positional Embeddings</h3>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="433" height="321" data-attachment-id="581" data-permalink="https://blog.kggstudio.com/transformer-2/image-102/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-11.png" data-orig-size="433,321" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-11.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-11.png" alt="" class="wp-image-581" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-11.png 433w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-11-300x222.png 300w" sizes="auto, (max-width: 433px) 100vw, 433px" /></figure>



<p class="wp-block-paragraph">RNN에서는 단어를 순차적으로 처리했지만 트랜스포머는 그렇지 않다. 심지어병렬처리까지 한다.</p>



<p class="wp-block-paragraph">따라서 임베딩된 토큰에 해당 토큰의 위치정보를 주입시켜주는데 그게 바로 positional embedding 이라고 한다 </p>



<p class="wp-block-paragraph">(위치정보를 가진 임베딩 이라고 이해하면 쉽다.)</p>



<h4 class="wp-block-heading">Are the position embeddings static? or learned?</h4>



<p class="wp-block-paragraph">스탠포드 학생이 질문했다, 위치 임베딩이 고정되어있냐? 아니면 학습된거냐? 라는 질문이다.</p>



<h5 class="wp-block-heading">static (고정형) &#8211; sin/cos 방식</h5>



<p class="wp-block-paragraph">위치 벡터를 <strong>수학 공식으로 미리 계산해서 고정</strong>해놓는 방식이야. 우리가 앞서 얘기했던 sin/cos 방식이 바로 이거야.</p>



<p class="wp-block-paragraph">학습이 시작되기 전에 모든 위치의 벡터값이 <strong>이미 결정</strong>되어 있어. 학습 과정에서 이 값은 절대 바뀌지 않아. 모델이 만져볼 수 없는 &#8220;상수표&#8221;야.</p>



<pre class="wp-block-code"><code>PE(pos, 2i)   = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))</code></pre>



<h5 class="wp-block-heading">Learned (학습형) — 임베딩 테이블 방식</h5>



<p class="wp-block-paragraph">위치 벡터도 <strong>단어 임베딩처럼 학습 가능한 파라미터</strong>로 두는 방식이야.</p>



<p class="wp-block-paragraph">처음에는 랜덤 값으로 시작하고, 학습이 진행되면서 모델이 스스로 <strong>&#8220;각 위치를 어떻게 표현하는 게 좋을지&#8221;</strong> 를 데이터로부터 배우는 거야.</p>



<pre class="wp-block-code"><code>position_embedding = nn.Embedding(max_len, d_model)
# 위치 0, 1, 2, ... 마다 d_model 차원 벡터를 랜덤 초기화
# 학습하면서 backprop으로 업데이트됨</code></pre>



<h5 class="wp-block-heading">Answer</h5>



<p class="wp-block-paragraph">고정으로 시작하고, 학습하면서 수정되니까 <strong>둘 다</strong>임.</p>



<h4 class="wp-block-heading">Hardcoded Position Embeddings</h4>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="547" data-attachment-id="582" data-permalink="https://blog.kggstudio.com/transformer-2/image-103/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-12.png" data-orig-size="1068,571" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-12-1024x547.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-12-1024x547.png" alt="" class="wp-image-582" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-12-1024x547.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-12-300x160.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-12-768x411.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-12.png 1068w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="560" data-attachment-id="589" data-permalink="https://blog.kggstudio.com/transformer-2/image-110/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-19.png" data-orig-size="1065,582" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-19-1024x560.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-19-1024x560.png" alt="" class="wp-image-589" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-19-1024x560.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-19-300x164.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-19-768x420.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-19.png 1065w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">임베딩에 더해야 하므로, Position m 벡터는 d차원의 크기를 가지고있음. </p>



<p class="wp-block-paragraph">벡터의 각 인덱스는 위에 해당하는 방정식을 사용해서 계산된다.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="465" data-attachment-id="583" data-permalink="https://blog.kggstudio.com/transformer-2/image-104/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-13.png" data-orig-size="1423,646" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-13-1024x465.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-13-1024x465.png" alt="" class="wp-image-583" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-13-1024x465.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-13-300x136.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-13-768x349.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-13.png 1423w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1004" height="84" data-attachment-id="584" data-permalink="https://blog.kggstudio.com/transformer-2/image-105/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-14.png" data-orig-size="1004,84" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-14.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-14.png" alt="" class="wp-image-584" style="width:640px;height:auto" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-14.png 1004w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-14-300x25.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-14-768x64.png 768w" sizes="auto, (max-width: 1004px) 100vw, 1004px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="61" data-attachment-id="585" data-permalink="https://blog.kggstudio.com/transformer-2/image-106/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-15.png" data-orig-size="1471,88" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-15-1024x61.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-15-1024x61.png" alt="" class="wp-image-585" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-15-1024x61.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-15-300x18.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-15-768x46.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-15.png 1471w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="109" data-attachment-id="586" data-permalink="https://blog.kggstudio.com/transformer-2/image-107/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-16.png" data-orig-size="1063,113" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-16-1024x109.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-16-1024x109.png" alt="" class="wp-image-586" style="width:474px;height:auto" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-16-1024x109.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-16-300x32.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-16-768x82.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-16.png 1063w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">m과 n 사이의 상대 거리에 대한 함수인 코사인 값들의 합.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="672" height="122" data-attachment-id="587" data-permalink="https://blog.kggstudio.com/transformer-2/image-108/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-17.png" data-orig-size="672,122" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-17.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-17.png" alt="" class="wp-image-587" style="width:287px;height:auto" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-17.png 672w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-17-300x54.png 300w" sizes="auto, (max-width: 672px) 100vw, 672px" /></figure>



<p class="wp-block-paragraph">= m과 n의 상대거리 함수</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="623" height="98" data-attachment-id="588" data-permalink="https://blog.kggstudio.com/transformer-2/image-109/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-18.png" data-orig-size="623,98" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-18.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-18.png" alt="" class="wp-image-588" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-18.png 623w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-18-300x47.png 300w" sizes="auto, (max-width: 623px) 100vw, 623px" /></figure>



<p class="wp-block-paragraph">코사인 유사도 = 내적 / normalized 된 각 embeddings</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="291" data-attachment-id="590" data-permalink="https://blog.kggstudio.com/transformer-2/image-111/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-20.png" data-orig-size="1374,391" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-20-1024x291.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-20-1024x291.png" alt="" class="wp-image-590" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-20-1024x291.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-20-300x85.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-20-768x219.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-20.png 1374w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="755" height="85" data-attachment-id="591" data-permalink="https://blog.kggstudio.com/transformer-2/image-112/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-21.png" data-orig-size="755,85" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-21.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-21.png" alt="" class="wp-image-591" style="aspect-ratio:8.883944374209861;width:493px;height:auto" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-21.png 755w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-21-300x34.png 300w" sizes="auto, (max-width: 755px) 100vw, 755px" /></figure>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="600" height="141" data-attachment-id="592" data-permalink="https://blog.kggstudio.com/transformer-2/image-113/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-22.png" data-orig-size="600,141" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-22.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-22.png" alt="" class="wp-image-592" style="width:436px;height:auto" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-22.png 600w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-22-300x71.png 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /></figure>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="503" height="93" data-attachment-id="593" data-permalink="https://blog.kggstudio.com/transformer-2/image-114/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-23.png" data-orig-size="503,93" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-23.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-23.png" alt="" class="wp-image-593" style="width:387px;height:auto" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-23.png 503w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-23-300x55.png 300w" sizes="auto, (max-width: 503px) 100vw, 503px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="509" height="63" data-attachment-id="594" data-permalink="https://blog.kggstudio.com/transformer-2/image-115/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-24.png" data-orig-size="509,63" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-24.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-24.png" alt="" class="wp-image-594" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-24.png 509w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-24-300x37.png 300w" sizes="auto, (max-width: 509px) 100vw, 509px" /></figure>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="837" height="523" data-attachment-id="595" data-permalink="https://blog.kggstudio.com/transformer-2/image-116/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-25.png" data-orig-size="837,523" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-25.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-25.png" alt="" class="wp-image-595" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-25.png 837w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-25-300x187.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-25-768x480.png 768w" sizes="auto, (max-width: 837px) 100vw, 837px" /></figure>



<h4 class="wp-block-heading">RoPE (Rotary Positional Embedding)</h4>



<h5 class="wp-block-heading"><strong>핵심 아이디어</strong>: 회전 행렬을 사용하여 Q, V 벡터를 회전시킴</h5>



<p class="wp-block-paragraph">기존 PE는 위치 정보를 임베딩에 <strong>더했어</strong>. RoPE는 다르게 접근해 — <strong>벡터를 회전시켜서</strong> 위치를 표현해.</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" data-attachment-id="599" data-permalink="https://blog.kggstudio.com/transformer-2/rope_rotation_concept/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/rope_rotation_concept.svg" data-orig-size="100,0" data-comments-opened="1" data-image-meta="[]" data-image-title="rope_rotation_concept" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/rope_rotation_concept.svg" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/rope_rotation_concept.svg" alt="" class="wp-image-599" style="aspect-ratio:0.8948247078464107;width:1042px;height:auto"/></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="997" height="315" data-attachment-id="598" data-permalink="https://blog.kggstudio.com/transformer-2/image-119/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-28.png" data-orig-size="997,315" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-28.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-28.png" alt="" class="wp-image-598" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-28.png 997w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-28-300x95.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-28-768x243.png 768w" sizes="auto, (max-width: 997px) 100vw, 997px" /></figure>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1017" height="137" data-attachment-id="597" data-permalink="https://blog.kggstudio.com/transformer-2/image-118/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-27.png" data-orig-size="1017,137" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-27.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-27.png" alt="" class="wp-image-597" style="width:598px;height:auto" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-27.png 1017w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-27-300x40.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-27-768x103.png 768w" sizes="auto, (max-width: 1017px) 100vw, 1017px" /></figure>



<h4 class="wp-block-heading">작동 방식 — 어디에 적용되나?</h4>



<p class="wp-block-paragraph">기존 PE는 입력 임베딩 단계에서 한 번 더해지고 끝이야. RoPE는 다른 곳에 적용돼.</p>



<pre class="wp-block-code"><code>RoPE는 Attention 계산 직전, Q와 K에만 회전을 적용
V에는 적용 안 함</code></pre>



<p class="wp-block-paragraph">위치 m에 있는 Q와 위치 n에 있는 K가 있을 때, Q를 m각도만큼, K를 n각도만큼 회전시켜. 그 다음 내적(Q·Kᵀ)을 하면, 신기하게도 결과값이 <strong>두 위치의 차이 (m-n)에만 의존</strong>하는 형태가 돼.</p>



<p class="wp-block-paragraph">이게 RoPE의 진짜 마법이야. 절대 위치를 인코딩했는데도 내적 결과는 <strong>상대 위치</strong>만 반영하는 거야.</p>



<h4 class="wp-block-heading">벡터를 회전행렬로 회전시키지 않아도 두 벡터의 상대좌표는 구할 수 있지 않니?</h4>



<h5 class="wp-block-heading">네 의문이 맞아 — 좌표만 빼면 거리는 그냥 구해져</h5>



<p class="wp-block-paragraph">그냥 두 토큰의 위치 인덱스(예: <code>pos_q=3, pos_k=5</code>)를 빼면 거리가 나와. 그 자체로는 회전이 필요 없지.</p>



<p class="wp-block-paragraph"><strong>그럼 왜 회전을 쓰냐?</strong></p>



<p class="wp-block-paragraph">답은 — RoPE의 목표가 단순히 &#8220;거리를 구하는 것&#8221;이 아니라 **&#8221;Attention 점수에 거리 정보가 자동으로 녹아들게 하는 것&#8221;**이기 때문이야.</p>



<h4 class="wp-block-heading">핵심: Attention은 내적(Q·K)으로 작동한다는 점이 결정적</h4>



<p class="wp-block-paragraph">Transformer가 이미 정해놓은 연산 흐름이 있어.</p>



<pre class="wp-block-code"><code>score = Q · K (두 벡터의 내적)</code></pre>



<p class="wp-block-paragraph">이 연산은 절대 안 바꿔. Attention의 본질이니까. 그래서 위치 정보를 <strong>이 내적 결과 안에</strong> 어떻게든 녹여 넣어야 해.</p>



<p class="wp-block-paragraph">여기서 두 가지 선택지가 생겨.</p>



<p class="wp-block-paragraph"><strong>선택지 A</strong> — Attention 외부에서 거리를 따로 계산해서 score에 더하기</p>



<pre class="wp-block-code"><code>score = Q · K + f(pos_q - pos_k)</code></pre>



<p class="wp-block-paragraph">이게 실제로 존재하는 방식이고, 이름이 있어. <strong>&#8220;상대 위치 편향(relative position bias)&#8221;</strong> 또는 <strong>ALiBi</strong> 같은 방법들이야. 네가 말한 &#8220;그냥 좌표 빼서 쓰면 되잖아&#8221;가 정확히 이 방식이야.</p>



<p class="wp-block-paragraph"><strong>선택지 B</strong> — Q와 K 자체를 회전시켜서, 내적 결과에 거리가 자동으로 들어가게 하기</p>



<p class="wp-block-paragraph">이게 RoPE야.</p>



<h4 class="wp-block-heading">그럼 왜 굳이 B(RoPE)를 택했나?</h4>



<p class="wp-block-paragraph">회전이 가진 <strong>수학적으로 아름다운 성질</strong> 때문이야. 회전 행렬의 특성상,</p>



<pre class="wp-block-code"><code>(R_m · Q) · (R_n · K)  =  Q · R_(n-m) · K</code></pre>



<p class="wp-block-paragraph">위치 m으로 회전된 Q와 위치 n으로 회전된 K를 내적하면, <strong>결과가 자동으로 (n-m), 즉 상대 위치만의 함수</strong>가 돼. 절대 위치 m, n은 사라지고 차이만 남아.</p>



<p class="wp-block-paragraph">이게 가능한 이유는 회전 행렬이 <strong>직교 행렬</strong>이라는 특별한 성질을 가지기 때문이야. 더하기로는 이런 성질이 안 나와.</p>



<h4 class="wp-block-heading">A방식 (편향 더하기) vs B방식 (RoPE)</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>방식</th><th>어떻게</th><th>장단점</th></tr></thead><tbody><tr><td>선택지 A (편향 더하기)</td><td>score 계산 후 <code>f(pos_q-pos_k)</code> 추가</td><td>구현 단순, 하지만 추가 연산 필요</td></tr><tr><td>선택지 B (RoPE)</td><td>Q, K를 회전시켜 내적</td><td><strong>추가 연산 없이 거리 정보 자동 반영</strong></td></tr></tbody></table></figure>



<h4 class="wp-block-heading">RoPE 방식이 추가 연산이 필요 없는 이유? (증명)</h4>



<h4 class="wp-block-heading">Step 1 — 회전이 정확히 무슨 일을 하는지</h4>



<p class="wp-block-paragraph">위치 m에 있는 Q를 회전한다는 건 이런 뜻이야.</p>



<pre class="wp-block-code"><code>원래 Q = &#091;a, b]                  (2D 예시)
회전된 Q = R(mθ) · Q
       = &#091;a·cos(mθ) - b·sin(mθ), a·sin(mθ) + b·cos(mθ)]</code></pre>



<p class="wp-block-paragraph">여기서 <code>R(mθ)</code>는 각도 <code>mθ</code>만큼 돌리는 회전 행렬이야. <strong>위치 m이 클수록 더 많이 돌아가.</strong></p>



<p class="wp-block-paragraph">K도 마찬가지로 위치 n에서 <code>R(nθ)</code>만큼 회전돼.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading">Step 2 — 마법이 일어나는 지점: 내적</h4>



<p class="wp-block-paragraph">이제 회전된 Q와 K를 내적해봐.</p>



<pre class="wp-block-code"><code>회전된 Q · 회전된 K
= (R(mθ)·Q) · (R(nθ)·K)</code></pre>



<p class="wp-block-paragraph">여기서 회전 행렬의 <strong>수학적 특성</strong>이 발동해. 회전 행렬은 직교 행렬이라 다음이 성립해.</p>



<pre class="wp-block-code"><code>R(mθ)ᵀ · R(nθ) = R((n-m)θ)</code></pre>



<h3 class="wp-block-heading">Layer normalization</h3>



<p class="wp-block-paragraph">LN은 한마디로  Vector의 각 component (인덱스 값) 들을 임의의 값으로 정규화 시키는것. (예: -1.0 ~ 1.0 )</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="880" height="408" data-attachment-id="600" data-permalink="https://blog.kggstudio.com/transformer-2/image-120/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-29.png" data-orig-size="880,408" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-29.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-29.png" alt="" class="wp-image-600" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-29.png 880w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-29-300x139.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-29-768x356.png 768w" sizes="auto, (max-width: 880px) 100vw, 880px" /></figure>



<p class="wp-block-paragraph">벡터에서 계산된 평균값을 뺴주고 standard deviation으로 normalize 시킨다.</p>



<p class="wp-block-paragraph">감마: re-scailing factor</p>



<p class="wp-block-paragraph">베타: (앞으로 배울것 -_-)</p>



<h4 class="wp-block-heading">Post-Norm</h4>



<p class="wp-block-paragraph">2017년 트랜스포머 기본형태</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="447" height="423" data-attachment-id="601" data-permalink="https://blog.kggstudio.com/transformer-2/image-121/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-30.png" data-orig-size="447,423" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-30.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-30.png" alt="" class="wp-image-601" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-30.png 447w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-30-300x284.png 300w" sizes="auto, (max-width: 447px) 100vw, 447px" /></figure>



<h4 class="wp-block-heading">Pre-Norm</h4>



<p class="wp-block-paragraph">요즘 사용하는 방식, Layer Norm이 실행되는 위치가 다름.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="428" height="424" data-attachment-id="602" data-permalink="https://blog.kggstudio.com/transformer-2/image-122/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-31.png" data-orig-size="428,424" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-31.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-31.png" alt="" class="wp-image-602" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-31.png 428w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-31-300x297.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-31-150x150.png 150w" sizes="auto, (max-width: 428px) 100vw, 428px" /></figure>



<h4 class="wp-block-heading">Pre-Norm + RMSNorm</h4>



<p class="wp-block-paragraph">완전 최근 사용하는방식은 RMSNorm을 섞여주는건데, 기본적으로 빠름.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="382" height="358" data-attachment-id="603" data-permalink="https://blog.kggstudio.com/transformer-2/image-123/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-32.png" data-orig-size="382,358" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-32.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-32.png" alt="" class="wp-image-603" style="width:336px;height:auto" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-32.png 382w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-32-300x281.png 300w" sizes="auto, (max-width: 382px) 100vw, 382px" /></figure>



<h3 class="wp-block-heading">Attention approximation</h3>



<p class="wp-block-paragraph">기본적으로 Self-Attention 과정은 각각의 토큰이 다른 모든토큰과 상호작용을 하게 되어있습니다. 그러니까 입력된 문장에 토큰이 10개면 10의 제곱인 100번의 상호작용이 일어나고 토큰이 100개면 1만번의 상호작용이 일어납니다. 입력된 문장이 길면 길수록 연산량이 엄청나게 커집니다.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="475" height="449" data-attachment-id="604" data-permalink="https://blog.kggstudio.com/transformer-2/image-124/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-33.png" data-orig-size="475,449" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-33.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-33.png" alt="" class="wp-image-604" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-33.png 475w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-33-300x284.png 300w" sizes="auto, (max-width: 475px) 100vw, 475px" /></figure>



<p class="wp-block-paragraph">2020년에 Longformer라는 논문이 발표되었는데, 토큰이 모든토큰과 상호 작용하는대신 창문을 제어하여 이웃들하고만 상호작용하도록 효율을 높힌 방식이다.</p>



<p class="wp-block-paragraph">(아래 사진에서는 흰색부분이 연산에서 제외된것으로 보면 됨.)</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="483" height="461" data-attachment-id="605" data-permalink="https://blog.kggstudio.com/transformer-2/image-125/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-34.png" data-orig-size="483,461" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-34.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-34.png" alt="" class="wp-image-605" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-34.png 483w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-34-300x286.png 300w" sizes="auto, (max-width: 483px) 100vw, 483px" /></figure>



<h4 class="wp-block-heading">Leveraging local and global attention</h4>



<h5 class="wp-block-heading">SWA = Sliding Window Attention</h5>



<p class="wp-block-paragraph">최신에는 일부 layer는 global attention을 적용하고 나머지는 local attention을 적용하는 추세인데, 다양한 조합을 시도하고있음.</p>



<p class="wp-block-paragraph">그리고 이미지에서는 윈도우가 5&#215;5로 매우 작지만 실제로 local attention window를 이렇게 작게 쪼개는건아니고 수천x수천 단위로 엄청큼. 수만x수만 or 수십만x수십만 을 수천단위로 줄이는것임.</p>



<p class="wp-block-paragraph">CV과정을 공부할떄 convulution 벡터 layer가 보고있는 일부인 receptive field와 같은개념이라고 보면 이해하기 쉬움.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="904" height="410" data-attachment-id="607" data-permalink="https://blog.kggstudio.com/transformer-2/image-127/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-36.png" data-orig-size="904,410" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-36.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-36.png" alt="" class="wp-image-607" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-36.png 904w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-36-300x136.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-36-768x348.png 768w" sizes="auto, (max-width: 904px) 100vw, 904px" /></figure>



<h4 class="wp-block-heading">Sharing attention heads</h4>



<p class="wp-block-paragraph">head마다 각각의 projection matrix를 갖지않고 몇개의 축소된 행렬들을 공유하는개념 </p>



<p class="wp-block-paragraph">variation A: full attention 대신 그때 그때 local attention을 사용하는것</p>



<p class="wp-block-paragraph">variation B: (행렬) orthogonal to all of this heads</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="777" height="300" data-attachment-id="608" data-permalink="https://blog.kggstudio.com/transformer-2/image-128/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-37.png" data-orig-size="777,300" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-37.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-37.png" alt="" class="wp-image-608" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-37.png 777w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-37-300x116.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-37-768x297.png 768w" sizes="auto, (max-width: 777px) 100vw, 777px" /></figure>



<h5 class="wp-block-heading">왜 Projection matrix를 share하는데 V K만 쉐어하고 Q는 쉐어하지않을까?</h5>



<p class="wp-block-paragraph">KV cache : saves values of K and V.</p>



<p class="wp-block-paragraph">KV cache가있는데 이게 너무 커지지않도록하기위해 필요한 알고리즘.</p>



<h4 class="wp-block-heading">Sharing Matrcies to share</h4>



<p class="wp-block-paragraph">아래 그림에서 G는 Group의 수</p>



<h5 class="wp-block-heading">MQA</h5>



<p class="wp-block-paragraph">하나의 projection 행렬을 모든 head에 적용</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="679" height="148" data-attachment-id="609" data-permalink="https://blog.kggstudio.com/transformer-2/image-129/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-38.png" data-orig-size="679,148" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-38.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-38.png" alt="" class="wp-image-609" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-38.png 679w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-38-300x65.png 300w" sizes="auto, (max-width: 679px) 100vw, 679px" /></figure>



<h5 class="wp-block-heading">GQA</h5>



<p class="wp-block-paragraph">그룹을 나눠 각각 그룹에맞는 projection 행렬을 적용.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="694" height="150" data-attachment-id="610" data-permalink="https://blog.kggstudio.com/transformer-2/image-130/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-39.png" data-orig-size="694,150" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-39.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-39.png" alt="" class="wp-image-610" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-39.png 694w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-39-300x65.png 300w" sizes="auto, (max-width: 694px) 100vw, 694px" /></figure>



<h5 class="wp-block-heading">MHA</h5>



<p class="wp-block-paragraph">각 Head가 Query projection, key projection, and value projection 이 존재하는 standard방식.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="697" height="147" data-attachment-id="611" data-permalink="https://blog.kggstudio.com/transformer-2/image-131/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-40.png" data-orig-size="697,147" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-40.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-40.png" alt="" class="wp-image-611" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-40.png 697w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-40-300x63.png 300w" sizes="auto, (max-width: 697px) 100vw, 697px" /></figure>



<p class="wp-block-paragraph">3가지 케이스를보면 GQA가 가장 좋아보이지만, GQA가 모든 모델에 사용되는건 아니다. 라는것 기억하고 넘어가기 다른것도 필요하니까.</p>



<h4 class="wp-block-heading">Transformer-based models</h4>



<p class="wp-block-paragraph">Encoder-decoder 모델 </p>



<p class="wp-block-paragraph">T5 = Transformer의 like 바닐라 모델 (text to text)</p>



<p class="wp-block-paragraph">mT5 (m=multilingual) = </p>



<p class="wp-block-paragraph">ByT5 (By=Byte) = 바이트레벨 토크나이저 사용으로 사전크기가 작아짐.</p>



<p class="wp-block-paragraph">sentinel tokens in T5 family = a span of corrupted tokens</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="886" height="259" data-attachment-id="612" data-permalink="https://blog.kggstudio.com/transformer-2/image-132/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-41.png" data-orig-size="886,259" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-41.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-41.png" alt="" class="wp-image-612" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-41.png 886w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-41-300x88.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-41-768x225.png 768w" sizes="auto, (max-width: 886px) 100vw, 886px" /></figure>



<p class="wp-block-paragraph"><strong>Encoder-Only</strong></p>



<p class="wp-block-paragraph">decoder가 없어서 분류용으로 사용됨.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="908" height="292" data-attachment-id="613" data-permalink="https://blog.kggstudio.com/transformer-2/image-133/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-42.png" data-orig-size="908,292" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-42.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-42.png" alt="" class="wp-image-613" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-42.png 908w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-42-300x96.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-42-768x247.png 768w" sizes="auto, (max-width: 908px) 100vw, 908px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="923" height="379" data-attachment-id="614" data-permalink="https://blog.kggstudio.com/transformer-2/image-134/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-43.png" data-orig-size="923,379" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-43.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-43.png" alt="" class="wp-image-614" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-43.png 923w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-43-300x123.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-43-768x315.png 768w" sizes="auto, (max-width: 923px) 100vw, 923px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="892" height="225" data-attachment-id="615" data-permalink="https://blog.kggstudio.com/transformer-2/image-135/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-44.png" data-orig-size="892,225" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-44.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-44.png" alt="" class="wp-image-615" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-44.png 892w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-44-300x76.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-44-768x194.png 768w" sizes="auto, (max-width: 892px) 100vw, 892px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="895" height="124" data-attachment-id="616" data-permalink="https://blog.kggstudio.com/transformer-2/image-136/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-45.png" data-orig-size="895,124" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-45.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-45.png" alt="" class="wp-image-616" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image-45.png 895w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-45-300x42.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-45-768x106.png 768w" sizes="auto, (max-width: 895px) 100vw, 895px" /></figure>



<h4 class="wp-block-heading">왜 요즘 모델은 Decoder-only인데 번역을 잘하지?</h4>



<p class="wp-block-paragraph">첫<strong>째, 번역도 결국 &#8220;다음 토큰 예측&#8221; 문제로 환원될 수 있어.</strong> Decoder-only 모델한테 <code>"Translate to Korean: Hello world →"</code> 같은 입력을 주면, 그 다음에 자연스럽게 올 토큰은 &#8220;안녕&#8221;이지. 즉 번역이라는 별도의 작업이 아니라, 조건부로 다음 토큰을 예측하는 일반 문제의 특수한 경우가 되는 거야. 이게 GPT 계열의 핵심 철학이기도 해 — &#8220;모든 NLP 태스크는 결국 다음 토큰 예측&#8221;이라는 관점.</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" data-attachment-id="617" data-permalink="https://blog.kggstudio.com/transformer-2/encoder_decoder_vs_decoder_only_translation/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/encoder_decoder_vs_decoder_only_translation.svg" data-orig-size="100,0" data-comments-opened="1" data-image-meta="[]" data-image-title="encoder_decoder_vs_decoder_only_translation" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/encoder_decoder_vs_decoder_only_translation.svg" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/encoder_decoder_vs_decoder_only_translation.svg" alt="" class="wp-image-617" style="aspect-ratio:1.7896494156928213;width:1121px;height:auto"/></figure>



<p class="wp-block-paragraph"><strong>둘째, 스케일과 다국어 데이터의 힘이 커.</strong> GPT-4, Claude 같은 모델은 인터넷에 있는 어마어마한 양의 다국어 코퍼스 — 번역서, 위키피디아, 자막, 이중언어 웹사이트 등 — 로 학습돼. 데이터와 파라미터가 충분히 커지면, 아키텍처 차이가 만드는 이론적 우위는 점점 줄어들어. &#8220;scale은 모든 걸 이긴다&#8221;는 격언이 어느 정도 들어맞는 영역이지.</p>



<p class="wp-block-paragraph"><strong>셋째, Instruction tuning과 RLHF가 결정적이야.</strong> 사후 학습 단계에서 &#8220;사용자 지시를 따르도록&#8221; 훈련받기 때문에 &#8220;이걸 한국어로 번역해줘&#8221; 같은 자연어 명령을 이해하고 수행할 수 있어.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">그럼 encoder-decoder는 이제 안 쓰이냐? 그건 아니야. 순수 번역 전문 모델인 Meta의 <strong>NLLB</strong>, Google의 <strong>M2M-100</strong>, <strong>T5</strong> 같은 건 여전히 encoder-decoder를 써. 이론적 장점이 있거든:</p>



<ul class="wp-block-list">
<li>Encoder는 소스 문장을 <strong>양방향(bidirectional)</strong> 으로 한 번에 처리할 수 있어. &#8220;I saw the bank&#8221; 같은 문장에서 &#8220;bank&#8221;의 의미가 뒤에 나오는 단어로 정해질 때, 양방향이 유리해.</li>



<li>Decoder-only는 <strong>인과적(causal) 어텐션</strong> 이라 왼쪽에서 오른쪽으로만 봐. 그래서 소스를 읽을 때도 단방향이고, 같은 표현력을 얻으려면 더 많은 파라미터가 필요해.</li>



<li>순수 번역 태스크에서는 encoder-decoder가 같은 성능을 더 적은 파라미터로 낼 수 있는 경우가 많아.</li>
</ul>



<p class="wp-block-paragraph">정리하자면, 강의의 분류는 &#8220;<strong>원래 무엇을 위해 설계됐나</strong>&#8220;에 대한 답이고, 실제로 GPT/Claude가 번역을 잘하는 건 &#8220;<strong>충분히 크고 잘 학습된 decoder-only 모델은 거의 모든 NLP 태스크를 다음 토큰 예측이라는 하나의 형식으로 풀어낼 수 있다</strong>&#8220;는 사실 때문이야. 가장 효율적인 구조가 아닐 수는 있어도, 불가능한 건 전혀 아니지. 오히려 단순함과 범용성이라는 큰 장점이 있어서 범용 LLM의 주류가 된 거고.</p>



<p class="wp-block-paragraph">BERT deep dive</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kggstudio.com/transformer-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">561</post-id>	</item>
		<item>
		<title>Transformer (1)</title>
		<link>https://blog.kggstudio.com/transformer-1/</link>
					<comments>https://blog.kggstudio.com/transformer-1/#respond</comments>
		
		<dc:creator><![CDATA[TimTam]]></dc:creator>
		<pubDate>Fri, 08 May 2026 06:33:18 +0000</pubDate>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[Transformer]]></category>
		<guid isPermaLink="false">https://blog.kggstudio.com/?p=539</guid>

					<description><![CDATA[트랜스포머 학습용 플래시카드 20장. 등장 배경부터 핵심 메커니즘, 응용까지 단계별 카드. 카드를 클릭하면 답이 보이고, 난이도 평가로 진도를 추적할 수 있습니다. 🤖 트랜스포머 마스터 카드 (20장) 카드를 클릭해 답을 확인하세요. 답을 본 후 &#8220;쉬움/보통/어려움&#8221;으로 평가하면 진도가 기록돼요. 1단계 · 등장 배경 카드 1-5 2단계 · 핵심 개념 카드 6-14 3단계 · 구조와 응용 카드 15-20 ... <a title="Transformer (1)" class="read-more" href="https://blog.kggstudio.com/transformer-1/" aria-label="Transformer (1)에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[
<h2 class="sr-only">트랜스포머 학습용 플래시카드 20장. 등장 배경부터 핵심 메커니즘, 응용까지 단계별 카드. 카드를 클릭하면 답이 보이고, 난이도 평가로 진도를 추적할 수 있습니다.</h2>

<div style="padding: 1rem 0;">

<div style="margin-bottom: 1.5rem;">
  <h2 style="margin: 0 0 4px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f916.png" alt="🤖" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 트랜스포머 마스터 카드 (20장)</h2>
  <p style="font-size: 14px; color: var(--color-text-secondary); margin: 0;">카드를 클릭해 답을 확인하세요. 답을 본 후 &#8220;쉬움/보통/어려움&#8221;으로 평가하면 진도가 기록돼요.</p>
</div>

<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-bottom: 1rem;">
  <div style="background: #EEEDFE; padding: 10px; border-radius: var(--border-radius-md); text-align: center;">
    <div style="font-size: 11px; color: #3C3489; font-weight: 500;">1단계 · 등장 배경</div>
    <div style="font-size: 12px; color: #534AB7;">카드 1-5</div>
  </div>
  <div style="background: #E1F5EE; padding: 10px; border-radius: var(--border-radius-md); text-align: center;">
    <div style="font-size: 11px; color: #085041; font-weight: 500;">2단계 · 핵심 개념</div>
    <div style="font-size: 12px; color: #0F6E56;">카드 6-14</div>
  </div>
  <div style="background: #FAEEDA; padding: 10px; border-radius: var(--border-radius-md); text-align: center;">
    <div style="font-size: 11px; color: #633806; font-weight: 500;">3단계 · 구조와 응용</div>
    <div style="font-size: 12px; color: #854F0B;">카드 15-20</div>
  </div>
</div>

<div style="background: var(--color-background-secondary); border-radius: var(--border-radius-md); padding: 12px 16px; margin-bottom: 1.5rem; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 8px;">
  <div style="font-size: 13px; color: var(--color-text-secondary);">
    <span id="current-card" style="font-weight: 500; color: var(--color-text-primary);">1</span> / 20
  </div>
  <div style="display: flex; gap: 12px; font-size: 12px;">
    <span><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e2.png" alt="🟢" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 쉬움 <span id="easy-count">0</span></span>
    <span><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e1.png" alt="🟡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 보통 <span id="medium-count">0</span></span>
    <span><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f534.png" alt="🔴" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 어려움 <span id="hard-count">0</span></span>
  </div>
</div>

<div id="card-container" style="margin-bottom: 1.5rem;"></div>

<div style="display: flex; gap: 8px; justify-content: space-between; align-items: center; margin-bottom: 1rem;">
  <button onclick="prevCard()" id="prev-btn" style="font-size: 13px;">← 이전</button>
  <div id="rating-area" style="display: none; gap: 6px;">
    <button onclick="rate('easy')" style="font-size: 13px; background: #E1F5EE; border-color: #5DCAA5; color: #085041;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e2.png" alt="🟢" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 쉬움</button>
    <button onclick="rate('medium')" style="font-size: 13px; background: #FAEEDA; border-color: #EF9F27; color: #633806;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e1.png" alt="🟡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 보통</button>
    <button onclick="rate('hard')" style="font-size: 13px; background: #FCEBEB; border-color: #F09595; color: #791F1F;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f534.png" alt="🔴" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 어려움</button>
  </div>
  <button onclick="nextCard()" id="next-btn" style="font-size: 13px;">다음 →</button>
</div>

<div style="background: var(--color-background-secondary); border-radius: var(--border-radius-md); height: 6px; overflow: hidden; margin-bottom: 1.5rem;">
  <div id="progress-bar" style="height: 100%; background: #534AB7; width: 5%; transition: width 0.3s;"></div>
</div>

<div style="display: flex; gap: 8px; flex-wrap: wrap;">
  <button onclick="sendPrompt('Self-Attention 메커니즘을 수식과 함께 더 자세히 설명해줘')" style="font-size: 13px;">Self-Attention 깊이 보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
  <button onclick="sendPrompt('트랜스포머와 RNN/LSTM의 차이를 비교 다이어그램으로 보여줘')" style="font-size: 13px;">RNN과 비교 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
  <button onclick="sendPrompt('이 카드들로 어떻게 효과적으로 복습하면 좋을지 학습 계획을 짜줘')" style="font-size: 13px;">복습 계획 만들기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
</div>

</div>

<script>
const cards = [
  // 1단계: 등장 배경
  {stage: 1, q: "트랜스포머 이전에 시퀀스(문장) 처리에 주로 쓰이던 모델 두 가지는?", a: "RNN (순환신경망)과 LSTM (장단기 메모리)\n\n&#x1f4a1; 둘 다 단어를 '하나씩 순서대로' 처리하는 구조"},
  {stage: 1, q: "RNN/LSTM의 가장 큰 두 가지 한계는?", a: "1. 병렬 처리 불가 — 단어를 순서대로만 처리해서 느림\n2. 장거리 의존성 약함 — 문장이 길어지면 앞쪽 정보를 잊어버림\n\n&#x1f4a1; '나는 한국에서 태어났고... [긴 문장]... 그래서 ___를 잘한다' 에서 '한국어'를 예측하기 어려움"},
  {stage: 1, q: "트랜스포머는 언제, 어떤 논문에서 처음 제안되었나?", a: "2017년, Google의 「Attention Is All You Need」 논문\n\n&#x1f4a1; 제목 그대로 '어텐션만 있으면 된다' — RNN 없이도 가능함을 증명"},
  {stage: 1, q: "트랜스포머가 RNN의 두 한계를 어떻게 해결했나?", a: "1. 병렬 처리 → 모든 단어를 한 번에 처리\n2. 장거리 의존성 → Self-Attention으로 멀리 떨어진 단어와도 직접 연결\n\n&#x1f4a1; '한 번에 모든 단어가 서로를 본다'"},
  {stage: 1, q: "트랜스포머가 등장하면서 가능해진 대표적인 모델 3가지는?", a: "BERT (2018) - 이해 특화\nGPT (2018~) - 생성 특화\nT5, ViT 등 - 다양한 변형\n\n&#x1f4a1; ChatGPT, Claude도 모두 트랜스포머 기반"},

  // 2단계: 핵심 개념
  {stage: 2, q: "Self-Attention을 한 문장으로 표현하면?", a: "문장 안의 각 단어가 다른 모든 단어와 얼마나 관련 있는지 계산하는 메커니즘\n\n&#x1f4a1; 'The animal didn't cross the street because IT was tired'에서 'it'이 'animal'을 가리킴을 파악"},
  {stage: 2, q: "Self-Attention의 핵심 3요소 Q, K, V는 각각 무엇의 약자이고 역할은?", a: "Q (Query, 질의): '내가 찾고 싶은 것'\nK (Key, 키): '내가 가진 정보의 라벨'\nV (Value, 값): '실제 정보 내용'\n\n&#x1f4a1; 도서관 비유: Q='요리책 찾고싶어', K=책 제목들, V=책 내용"},
  {stage: 2, q: "Attention 점수를 구하는 핵심 수식은?", a: "Attention(Q,K,V) = softmax(QKᵀ / √d_k) × V\n\n&#x1f4a1; 1. Q와 K의 내적 → 유사도\n2. √d_k로 나누기 → 값이 너무 커지지 않게\n3. softmax → 확률로 변환\n4. V와 곱하기 → 가중합"},
  {stage: 2, q: "왜 √d_k로 나눠주는 (scaling) 걸까?", a: "차원(d_k)이 크면 QKᵀ 값이 너무 커져서 softmax가 극단적으로 쏠림 → 학습이 어려워짐\n\n&#x1f4a1; √d_k로 나누면 분산이 안정되어 gradient가 잘 흐름"},
  {stage: 2, q: "Multi-Head Attention이란? 왜 여러 개의 head를 쓸까?", a: "Self-Attention을 여러 개(보통 8개) 병렬로 수행한 것\n\n&#x1f4a1; 각 head가 서로 다른 관점을 학습:\n- head1: 문법 관계\n- head2: 의미 관계\n- head3: 위치 관계 ...\n사람이 한 문장을 여러 각도로 보는 것과 비슷"},
  {stage: 2, q: "트랜스포머는 단어 순서를 어떻게 인식할까? (RNN처럼 순차 처리하지 않는데도)", a: "Positional Encoding (위치 인코딩)을 입력 임베딩에 더해줌\n\n&#x1f4a1; sin, cos 함수로 각 위치마다 고유한 패턴 생성\n→ '나는 너를 좋아해'와 '너는 나를 좋아해'를 구분 가능"},
  {stage: 2, q: "Feed-Forward Network (FFN)는 트랜스포머에서 어떤 역할?", a: "각 위치별로 독립적으로 적용되는 2층 신경망. 어텐션이 모은 정보를 비선형 변환해 더 풍부한 표현으로 만듦\n\n&#x1f4a1; 보통 차원을 4배로 늘렸다가(예: 512→2048→512) 다시 줄임"},
  {stage: 2, q: "Residual Connection (잔차 연결)과 Layer Normalization의 역할은?", a: "Residual: 입력을 출력에 더해줌(x + f(x)) → 깊은 신경망의 gradient 소실 방지\nLayerNorm: 각 층 출력을 정규화 → 학습 안정화\n\n&#x1f4a1; 둘 다 '깊이 쌓아도 학습이 잘 되게' 해주는 장치"},
  {stage: 2, q: "Encoder와 Decoder의 핵심 차이 한 가지는?", a: "Decoder는 Masked Self-Attention을 사용\n\n&#x1f4a1; 생성 시 미래 단어를 미리 보면 안 되니까, 자기보다 뒤에 있는 단어는 가려서(mask) 못 보게 함 → 'I love ___'에서 ___ 예측할 때 ___ 다음 단어를 못 봄"},

  // 3단계: 구조와 응용
  {stage: 3, q: "원조 트랜스포머의 전체 구조는? (Encoder/Decoder 개수)", a: "Encoder 6개 + Decoder 6개 스택\n\n&#x1f4a1; 입력(영어) → Encoder×6 → 중간 표현\n중간 표현 + 이전 출력 → Decoder×6 → 출력(한국어)\n\n원래 기계 번역용으로 설계됨"},
  {stage: 3, q: "Encoder-only, Decoder-only, Encoder-Decoder 구조는 각각 어떤 모델의 예가 있고 무엇에 강한가?", a: "Encoder-only: BERT — 이해/분류에 강함\nDecoder-only: GPT, Claude — 생성에 강함\nEncoder-Decoder: T5, BART — 번역/요약에 강함\n\n&#x1f4a1; LLM 시대엔 Decoder-only가 주류"},
  {stage: 3, q: "Self-Attention의 시간 복잡도는? 왜 긴 문장에 약점이 될까?", a: "O(n²) — 시퀀스 길이 n의 제곱\n\n&#x1f4a1; 모든 단어 쌍의 관계를 계산하니까\n- 1,000 단어 → 100만 번 계산\n- 10,000 단어 → 1억 번 계산\n→ 긴 문서 처리에 메모리/시간 부담"},
  {stage: 3, q: "트랜스포머가 NLP를 넘어 적용된 대표 분야 3가지는?", a: "1. Vision (ViT) — 이미지 분류\n2. 음성 (Whisper) — 음성 인식\n3. 멀티모달 (CLIP, GPT-4V) — 텍스트+이미지\n\n&#x1f4a1; 단백질 구조 예측(AlphaFold2)에도 사용 — 시퀀스가 있는 거의 모든 분야"},
  {stage: 3, q: "'트랜스포머를 이해했다'고 말할 수 있으려면 설명할 수 있어야 할 5가지는?", a: "1. 왜 등장했나 (RNN의 한계)\n2. Self-Attention의 Q, K, V 작동 원리\n3. Multi-Head Attention의 의도\n4. Positional Encoding의 필요성\n5. Encoder/Decoder 구조와 차이\n\n&#x1f4a1; 이 5개를 자기 말로 설명할 수 있다면 합격!"},
  {stage: 3, q: "&#x1f393; 마지막 질문: 친구에게 1분 안에 트랜스포머를 설명한다면?", a: "예시 답안:\n\n'2017년 구글이 만든 신경망 구조야. 기존 RNN은 단어를 하나씩 처리해서 느리고 긴 문장을 잘 못 다뤘는데, 트랜스포머는 Self-Attention이라는 메커니즘으로 모든 단어가 동시에 서로를 참조해. 덕분에 병렬 처리가 가능하고 멀리 있는 단어 관계도 잘 잡아내. ChatGPT, Claude 같은 LLM이 다 이 구조 기반이야.'\n\n&#x1f4a1; 자기 언어로 다시 말해보세요!"}
];

let idx = 0;
let flipped = false;
const ratings = {};
let easyCount = 0, mediumCount = 0, hardCount = 0;

function render() {
  const card = cards[idx];
  const stageColors = {
    1: {bg: '#EEEDFE', border: '#7F77DD', text: '#3C3489', label: '1단계 · 등장 배경'},
    2: {bg: '#E1F5EE', border: '#5DCAA5', text: '#085041', label: '2단계 · 핵심 개념'},
    3: {bg: '#FAEEDA', border: '#EF9F27', text: '#633806', label: '3단계 · 구조와 응용'}
  };
  const c = stageColors[card.stage];
  
  document.getElementById('card-container').innerHTML = 
    '<div onclick="flip()" style="background: var(--color-background-primary); border: 0.5px solid ' + c.border + '; border-radius: var(--border-radius-lg); padding: 1.5rem 1.25rem; cursor: pointer; min-height: 220px; display: flex; flex-direction: column;">' +
      '<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;">' +
        '<span style="font-size: 11px; font-weight: 500; padding: 3px 10px; background: ' + c.bg + '; color: ' + c.text + '; border-radius: 999px;">' + c.label + '</span>' +
        '<span style="font-size: 11px; color: var(--color-text-tertiary);">카드 ' + (idx + 1) + '</span>' +
      '</div>' +
      '<div style="flex: 1; display: flex; align-items: center; justify-content: center; text-align: center; padding: 8px;">' +
        (flipped 
          ? '<div style="font-size: 14px; line-height: 1.7; white-space: pre-line; text-align: left; width: 100%;">' + card.a + '</div>'
          : '<div style="font-size: 17px; line-height: 1.5; font-weight: 500;">' + card.q + '</div>'
        ) +
      '</div>' +
      '<div style="text-align: center; margin-top: 12px; font-size: 12px; color: var(--color-text-tertiary);">' + 
        (flipped ? '↑ 다시 클릭하면 질문' : '클릭하면 답 보기 →') + 
      '</div>' +
    '</div>';
  
  document.getElementById('current-card').textContent = idx + 1;
  document.getElementById('progress-bar').style.width = ((idx + 1) / cards.length * 100) + '%';
  document.getElementById('rating-area').style.display = flipped ? 'flex' : 'none';
  document.getElementById('prev-btn').disabled = idx === 0;
  document.getElementById('next-btn').disabled = idx === cards.length - 1;
}

function flip() {
  flipped = !flipped;
  render();
}

function nextCard() {
  if (idx < cards.length - 1) {
    idx++;
    flipped = false;
    render();
  }
}

function prevCard() {
  if (idx > 0) {
    idx--;
    flipped = false;
    render();
  }
}

function rate(level) {
  if (ratings[idx] === level) return;
  if (ratings[idx]) {
    if (ratings[idx] === 'easy') easyCount--;
    if (ratings[idx] === 'medium') mediumCount--;
    if (ratings[idx] === 'hard') hardCount--;
  }
  ratings[idx] = level;
  if (level === 'easy') easyCount++;
  if (level === 'medium') mediumCount++;
  if (level === 'hard') hardCount++;
  document.getElementById('easy-count').textContent = easyCount;
  document.getElementById('medium-count').textContent = mediumCount;
  document.getElementById('hard-count').textContent = hardCount;
  setTimeout(nextCard, 300);
}

render();
</script>



<h3 class="wp-block-heading">Transformer의 등장 배경.</h3>



<h4 class="wp-block-heading">Attention으로 해결하지 못한것</h4>



<ul class="wp-block-list">
<li>장기 의존성 문제 (Long-term Dependency Problem): RNN의 순차적 정보 전달 구조, 문장이 길어질수록 앞쪽 정보가 뒤로 전달되는 과정에서 소실됨. LSTM으로 개선되었기는하나 여전히 이전 정보가 희석되고 한계가 있음. Attention은 디코더가 인코더의 모든 hidden state를 참조할수 있게 해주지만, <strong>hidden state 자체가 이미 RNN을 통해 만든 </strong>값들임.</li>



<li>병렬 처리의 어려움 (Parallelization Difficulty): RNN은 구조적으로 현재 스텝의 계산이 이전 스텝의 결과에 의존적임. Hidden state에서 h2를 계산하려면 h1이 필요하고 h3를 계산하려면 h2가 필요함. Attention 자체는 병렬계산이 가능한 알고리즘이지만, <strong>Transformer 이전의 attention은 RNN 위에서 쓰는 부가기능</strong>이었기때문에 한계가 존재했음.</li>
</ul>



<h3 class="wp-block-heading">Transformer의 핵심 개념들.</h3>



<ul class="wp-block-list">
<li>Positional Encoding</li>



<li>Attention
<ul class="wp-block-list">
<li>Scaled dot product Attention</li>



<li>Multihead Attention</li>
</ul>
</li>



<li>FFNN</li>



<li>Add&amp;Norm</li>
</ul>



<h4 class="wp-block-heading">Positional Encoding (PE): 위치기반 인코딩</h4>



<p class="wp-block-paragraph">PE가 없다면 아래 두 문장을 구분할수 있을까?</p>



<pre class="wp-block-code"><code>나는 학생 이다 / 이다 학생 나는</code></pre>



<p class="wp-block-paragraph">[답변] Transformer는 모든 토큰을 <strong>동시에</strong> 처리해. RNN처럼 순서대로 읽지 않기 때문에, Positional Encoding이 없으면 아래 두 문장은 <strong>완전히 동일하게</strong> 인식돼.</p>



<pre class="wp-block-code"><code>"나는 학생 이다"   →  {나는, 학생, 이다}  ← 그냥 단어 집합
"이다 학생 나는"   →  {이다, 학생, 나는}  ← 똑같은 단어 집합</code></pre>



<p class="wp-block-paragraph">PE가 하는 일: 각 토큰의 임베딩 벡터에 <strong>위치 정보를 담은 벡터를 더해줘.</strong></p>



<pre class="wp-block-code"><code>입력 = 단어 임베딩 + 위치 임베딩</code></pre>



<p class="wp-block-paragraph">예를 들면 이렇게 돼:</p>



<pre class="wp-block-code"><code>"나는 학생 이다"
나는  →  &#91;단어벡터] + &#91;위치1 벡터]
학생  →  &#91;단어벡터] + &#91;위치2 벡터]
이다  →  &#91;단어벡터] + &#91;위치3 벡터]

"이다 학생 나는"
이다  →  &#91;단어벡터] + &#91;위치1 벡터]  ← !!
학생  →  &#91;단어벡터] + &#91;위치2 벡터]
나는  →  &#91;단어벡터] + &#91;위치3 벡터]  ← !!</code></pre>



<h4 class="wp-block-heading">핵심 원리 한 줄 요약</h4>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">같은 단어라도 <strong>위치가 다르면 → 더해지는 벡터가 다르고 → 최종 입력값이 달라진다</strong></p>
</blockquote>



<p class="wp-block-paragraph">그래서 모델은 단순히 &#8220;어떤 단어가 있냐&#8221;가 아니라 <strong>&#8220;어떤 단어가 몇 번째에 있냐&#8221;</strong> 를 함께 인식할 수 있어.</p>



<h4 class="wp-block-heading">PE 설계에 반영된 전제들과 해소 방법</h4>



<h4 class="wp-block-heading">전제가 왜 필요한가?</h4>



<p class="wp-block-paragraph">위치 벡터를 단어 임베딩에 <strong>더하는(+)</strong> 방식을 쓰기 때문에, 잘못 설계하면 위치 정보가 단어 의미 정보를 <strong>덮어쓰거나 방해</strong>할 수 있어. 그래서 PE는 아래 3가지 전제를 만족해야 해.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading">전제 1. 위치마다 고유한 값이어야 한다 (Unique)</h4>



<p class="wp-block-paragraph"><strong>문제:</strong> 위치 벡터가 중복되면 모델이 두 위치를 구별할 수 없어.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">1번 위치 PE = 3번 위치 PE → 모델 입장에서 두 토큰이 같은 위치</p>
</blockquote>



<p class="wp-block-paragraph"><strong>해소:</strong> sin/cos 함수를 <strong>다양한 주파수</strong>로 조합해서 사용해. 각 차원마다 진동 속도가 다른 sin/cos 값을 쌓으면, 모든 위치가 고유한 벡터 패턴을 가지게 돼. 이진수에서 각 자릿수가 다른 속도로 바뀌는 것과 같은 원리야.</p>



<pre class="wp-block-code"><code>PE(pos, 2i)   = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading">전제 2. 값이 너무 커지면 안 된다 (Bounded)</h4>



<p class="wp-block-paragraph"><strong>문제:</strong> 위치 벡터의 값이 단어 임베딩보다 <strong>훨씬 크면</strong>, 모델은 위치 정보만 보고 단어 의미는 무시하게 돼.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">단어 임베딩 값: 0.3, 0.7, -0.2 &#8230; 위치 벡터 값: 1000, 5000, 3000 &#8230; → 임베딩 정보가 묻혀버림</p>
</blockquote>



<p class="wp-block-paragraph"><strong>해소:</strong> sin/cos 함수는 모든 값이 [-1, 1] 범위 안에 있어서, 위치 신호가 단어 임베딩을 압도하지 않아. 반면 단순히 위치 인덱스(1, 2, 3&#8230;)를 그대로 더하면 문장이 길어질수록 위치 값이 무한히 커지는 문제가 생겨. <a href="https://mesuvash.github.io/blog/2026/positional-encodings/" target="_blank" rel="noreferrer noopener">Mesuvash</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading">전제 3. 가까운 위치는 비슷한 벡터여야 한다 (Smooth)</h4>



<p class="wp-block-paragraph"><strong>문제:</strong> 인접한 위치의 PE가 완전히 다른 값이라면, 모델이 &#8220;1번과 2번 위치는 가깝다&#8221;는 것을 학습하기 어려워.</p>



<p class="wp-block-paragraph"><strong>해소:</strong> sin/cos의 주기적 특성 덕분에 가까운 위치는 비슷한 인코딩 값을 가지게 되어, 모델이 자연스럽게 위치 간 근접성을 학습할 수 있어. 또한 삼각함수의 덧셈정리 덕분에, <strong>임의의 위치 k만큼 떨어진 관계</strong>를 선형 변환으로 표현할 수 있어서 상대적 위치 관계도 파악 가능해. <a href="https://mesuvash.github.io/blog/2026/positional-encodings/" target="_blank" rel="noreferrer noopener">Mesuvash</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading">정리</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>전제</th><th>문제 상황</th><th>sin/cos로 해소한 방법</th></tr></thead><tbody><tr><td><strong>Unique</strong> (고유성)</td><td>위치 중복 → 구별 불가</td><td>다양한 주파수 조합으로 모든 위치가 고유한 패턴 가짐</td></tr><tr><td><strong>Bounded</strong> (유계성)</td><td>값이 너무 큼 → 임베딩 정보 훼손</td><td>sin/cos는 항상 [-1, 1] 이내</td></tr><tr><td><strong>Smooth</strong> (연속성)</td><td>인접 위치가 너무 다름 → 근접성 학습 불가</td><td>주기함수라 인접 위치 간 값 변화가 부드러움</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">이 세 조건을 동시에 만족하는 함수로 sin/cos가 선택된 거야. 실제로 Transformer 논문에서 learnable한 PE도 시도해봤지만 성능이 거의 동일했고, 입력 길이에 대한 일반화 측면에서 sinusoidal을 최종 선택했다고 해. </p>



<h3 class="wp-block-heading">Attention</h3>



<p class="wp-block-paragraph">트랜스포머 이전의 Dot proudct Attention의 과정.</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" data-attachment-id="545" data-permalink="https://blog.kggstudio.com/transformer-1/pre_transformer_attention_flow/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/pre_transformer_attention_flow.svg" data-orig-size="100,0" data-comments-opened="1" data-image-meta="[]" data-image-title="pre_transformer_attention_flow" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/pre_transformer_attention_flow.svg" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/pre_transformer_attention_flow.svg" alt="" class="wp-image-545" style="aspect-ratio:0.8293447591179851;width:669px;height:auto"/></figure>



<p class="wp-block-paragraph">전체 흐름을 3단계로 나눠서 보면 이해하기 쉬워.</p>



<p class="wp-block-paragraph"><strong>① 인코더</strong> — 입력 문장의 각 토큰을 RNN이 순서대로 처리해서 hidden state(h₁, h₂, h₃)를 생성해. 각 hᵢ는 해당 토큰까지의 문맥 정보를 담고 있어.</p>



<p class="wp-block-paragraph"><strong>② Attention</strong> — 디코더의 현재 상태(s)와 인코더의 각 hᵢ를 비교해서 점수를 계산하고, Softmax로 가중치(α)를 뽑아. 그 가중치로 hᵢ들을 가중합해서 <strong>context vector(c)</strong> 를 만들어. 선 굵기가 attention 가중치를 나타내는데, h₂가 가장 관련 있다고 판단된 예시야.</p>



<p class="wp-block-paragraph"><strong>③ 디코더</strong> — context vector와 이전 decoder state를 합쳐서 RNN이 다음 출력 토큰을 생성해.</p>



<p class="wp-block-paragraph">오른쪽 하단 점선 박스가 핵심인데, Attention을 썼어도 RNN 구조 자체는 그대로라서 순차 처리와 h₁ 손상 문제가 남아있는 게 Transformer 등장의 배경이야.</p>



<h4 class="wp-block-heading">Q, K, V가 뭔지 — 도서관 비유로 먼저 이해하기</h4>



<p class="wp-block-paragraph">Attention을 <strong>도서관 검색 시스템</strong>으로 생각해봐.</p>



<ul class="wp-block-list">
<li><strong>Q (Query)</strong> — &#8220;내가 지금 찾고 싶은 것&#8221;. 검색창에 입력하는 검색어야. 현재 처리 중인 토큰이 &#8220;나는 무엇에 집중해야 하지?&#8221;라고 던지는 질문.</li>



<li><strong>K (Key)</strong> — &#8220;각 책의 색인 태그&#8221;. 모든 토큰이 자신을 설명하는 라벨을 달고 있어. Query가 어떤 Key와 잘 맞는지를 비교해.</li>



<li><strong>V (Value)</strong> — &#8220;책의 실제 내용&#8221;. Key가 매칭됐을 때 실제로 가져오는 정보야.</li>
</ul>



<p class="wp-block-paragraph">그리고 <code>Q · Kᵀ</code>는 <strong>Query와 모든 Key를 내적(dot product)해서 유사도 점수를 계산하는 것</strong>이야. 두 벡터의 내적이 크다 = 방향이 비슷하다 = 관련이 높다는 뜻이야.</p>



<style>
.haha { max-width: 800px; margin: 0 auto; width: 100%; }
.tok { cursor:pointer; transition: all .2s; }
.tok:hover rect { opacity:.85; }
.score-bar { transition: width .35s ease; }
.step-label { font-size:11px; fill:var(--color-text-tertiary); }
</style>
<div class="haha">
<h2 class="sr-only">Q K V Attention 인터랙티브 도식 — 토큰을 클릭하면 해당 토큰의 Query가 다른 Key와 유사도를 계산하는 과정을 시각화합니다</h2>

<svg id="main-svg" width="100%" viewBox="0 0 680 540" role="img">
<title>Q K V Attention 인터랙티브 도식</title>
<desc>토큰을 클릭하면 Query·Key 내적으로 Attention 가중치를 계산하는 과정을 보여주는 인터랙티브 다이어그램</desc>
<defs>
  <marker id="arrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
    <path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  </marker>
</defs>

<!-- ── 안내 텍스트 ── -->
<text id="hint" class="ts" x="340" y="28" text-anchor="middle" fill="var(--color-text-tertiary)">토큰을 클릭하면 Q · K 계산 과정이 나타납니다</text>

<!-- ── 입력 토큰 행 ── -->
<!-- 나는 x=60 w=90 -->
<g class="tok node" id="tok0" onclick="selectToken(0)">
  <rect id="tr0" x="60" y="50" width="90" height="44" rx="8" stroke-width="0.5" fill="#EEEDFE" stroke="#534AB7"/>
  <text class="th" x="105" y="72" text-anchor="middle" dominant-baseline="central" fill="#3C3489">나는</text>
</g>
<!-- 어제 -->
<g class="tok node" id="tok1" onclick="selectToken(1)">
  <rect id="tr1" x="170" y="50" width="90" height="44" rx="8" stroke-width="0.5" fill="#EEEDFE" stroke="#534AB7"/>
  <text class="th" x="215" y="72" text-anchor="middle" dominant-baseline="central" fill="#3C3489">어제</text>
</g>
<!-- 학교 -->
<g class="tok node" id="tok2" onclick="selectToken(2)">
  <rect id="tr2" x="280" y="50" width="90" height="44" rx="8" stroke-width="0.5" fill="#EEEDFE" stroke="#534AB7"/>
  <text class="th" x="325" y="72" text-anchor="middle" dominant-baseline="central" fill="#3C3489">학교</text>
</g>
<!-- 에서 -->
<g class="tok node" id="tok3" onclick="selectToken(3)">
  <rect id="tr3" x="390" y="50" width="90" height="44" rx="8" stroke-width="0.5" fill="#EEEDFE" stroke="#534AB7"/>
  <text class="th" x="435" y="72" text-anchor="middle" dominant-baseline="central" fill="#3C3489">에서</text>
</g>
<!-- 공부했다 -->
<g class="tok node" id="tok4" onclick="selectToken(4)">
  <rect id="tr4" x="500" y="50" width="120" height="44" rx="8" stroke-width="0.5" fill="#EEEDFE" stroke="#534AB7"/>
  <text class="th" x="560" y="72" text-anchor="middle" dominant-baseline="central" fill="#3C3489">공부했다</text>
</g>

<!-- ── 선택된 토큰 표시 영역 ── -->
<!-- Q 박스 -->
<g id="q-group" opacity="0">
  <rect x="60" y="130" width="160" height="56" rx="8" stroke-width="0.5" fill="#E6F1FB" stroke="#185FA5"/>
  <text class="th" x="140" y="150" text-anchor="middle" dominant-baseline="central" fill="#0C447C">Q (Query)</text>
  <text id="q-label" class="ts" x="140" y="170" text-anchor="middle" dominant-baseline="central" fill="#185FA5">&#8220;나는&#8221; 의 질문 벡터</text>
</g>

<!-- Wq Wk Wv 설명 -->
<g id="w-group" opacity="0">
  <text class="ts" x="340" y="145" text-anchor="middle" fill="var(--color-text-secondary)">각 토큰의 임베딩에 Wq, Wk, Wv 행렬을 곱해서 Q, K, V 생성</text>
</g>

<!-- K 박스들 -->
<g id="k-group" opacity="0">
  <text class="ts" x="340" y="218" text-anchor="middle" fill="var(--color-text-tertiary)">K (Keys) — 모든 토큰의 색인 벡터</text>
  <rect id="kr0" x="60"  y="228" width="90" height="36" rx="6" stroke-width="0.5" fill="#E1F5EE" stroke="#0F6E56"/>
  <rect id="kr1" x="162" y="228" width="90" height="36" rx="6" stroke-width="0.5" fill="#E1F5EE" stroke="#0F6E56"/>
  <rect id="kr2" x="264" y="228" width="90" height="36" rx="6" stroke-width="0.5" fill="#E1F5EE" stroke="#0F6E56"/>
  <rect id="kr3" x="366" y="228" width="90" height="36" rx="6" stroke-width="0.5" fill="#E1F5EE" stroke="#0F6E56"/>
  <rect id="kr4" x="468" y="228" width="120" height="36" rx="6" stroke-width="0.5" fill="#E1F5EE" stroke="#0F6E56"/>
  <text id="kt0" class="ts" x="105"  y="246" text-anchor="middle" dominant-baseline="central" fill="#085041">K: 나는</text>
  <text id="kt1" class="ts" x="207"  y="246" text-anchor="middle" dominant-baseline="central" fill="#085041">K: 어제</text>
  <text id="kt2" class="ts" x="309"  y="246" text-anchor="middle" dominant-baseline="central" fill="#085041">K: 학교</text>
  <text id="kt3" class="ts" x="411"  y="246" text-anchor="middle" dominant-baseline="central" fill="#085041">K: 에서</text>
  <text id="kt4" class="ts" x="528"  y="246" text-anchor="middle" dominant-baseline="central" fill="#085041">K: 공부했다</text>
</g>

<!-- Q·Kᵀ 내적 결과 (Score) -->
<g id="score-group" opacity="0">
  <text class="ts" x="340" y="296" text-anchor="middle" fill="var(--color-text-tertiary)">Q · Kᵀ = 유사도 점수 (내적)</text>

  <!-- 막대 그래프 배경 -->
  <rect x="60"  y="306" width="140" height="22" rx="4" fill="var(--color-background-secondary)" stroke="var(--color-border-tertiary)" stroke-width="0.5"/>
  <rect x="60"  y="338" width="140" height="22" rx="4" fill="var(--color-background-secondary)" stroke="var(--color-border-tertiary)" stroke-width="0.5"/>
  <rect x="60"  y="370" width="140" height="22" rx="4" fill="var(--color-background-secondary)" stroke="var(--color-border-tertiary)" stroke-width="0.5"/>
  <rect x="60"  y="402" width="140" height="22" rx="4" fill="var(--color-background-secondary)" stroke="var(--color-border-tertiary)" stroke-width="0.5"/>
  <rect x="60"  y="434" width="140" height="22" rx="4" fill="var(--color-background-secondary)" stroke="var(--color-border-tertiary)" stroke-width="0.5"/>

  <!-- 막대 fill -->
  <rect id="sb0" class="score-bar" x="60" y="306" width="0" height="22" rx="4" fill="#EF9F27" opacity="0.85"/>
  <rect id="sb1" class="score-bar" x="60" y="338" width="0" height="22" rx="4" fill="#EF9F27" opacity="0.85"/>
  <rect id="sb2" class="score-bar" x="60" y="370" width="0" height="22" rx="4" fill="#EF9F27" opacity="0.85"/>
  <rect id="sb3" class="score-bar" x="60" y="402" width="0" height="22" rx="4" fill="#EF9F27" opacity="0.85"/>
  <rect id="sb4" class="score-bar" x="60" y="434" width="0" height="22" rx="4" fill="#EF9F27" opacity="0.85"/>

  <!-- 레이블 -->
  <text id="sl0" class="ts" x="212" y="317" dominant-baseline="central" fill="var(--color-text-secondary)"></text>
  <text id="sl1" class="ts" x="212" y="349" dominant-baseline="central" fill="var(--color-text-secondary)"></text>
  <text id="sl2" class="ts" x="212" y="381" dominant-baseline="central" fill="var(--color-text-secondary)"></text>
  <text id="sl3" class="ts" x="212" y="413" dominant-baseline="central" fill="var(--color-text-secondary)"></text>
  <text id="sl4" class="ts" x="212" y="445" dominant-baseline="central" fill="var(--color-text-secondary)"></text>

  <text id="sn0" class="ts" x="55" y="317" text-anchor="end" dominant-baseline="central" fill="var(--color-text-tertiary)">나는</text>
  <text id="sn1" class="ts" x="55" y="349" text-anchor="end" dominant-baseline="central" fill="var(--color-text-tertiary)">어제</text>
  <text id="sn2" class="ts" x="55" y="381" text-anchor="end" dominant-baseline="central" fill="var(--color-text-tertiary)">학교</text>
  <text id="sn3" class="ts" x="55" y="413" text-anchor="end" dominant-baseline="central" fill="var(--color-text-tertiary)">에서</text>
  <text id="sn4" class="ts" x="55" y="445" text-anchor="end" dominant-baseline="central" fill="var(--color-text-tertiary)">공부했다</text>
</g>

<!-- Softmax → Attention weight 안내 -->
<g id="softmax-group" opacity="0">
  <text class="ts" x="420" y="317" fill="var(--color-text-tertiary)">Softmax 적용</text>
  <text class="ts" x="420" y="337" fill="var(--color-text-tertiary)">→ 합이 1이 되는</text>
  <text class="ts" x="420" y="357" fill="var(--color-text-tertiary)">  가중치(α) 계산</text>
  <text class="ts" x="420" y="387" fill="var(--color-text-tertiary)">α들로 V 가중합</text>
  <text class="ts" x="420" y="407" fill="var(--color-text-tertiary)">→ context vector</text>

  <rect x="400" y="305" width="220" height="116" rx="8" fill="none" stroke="var(--color-border-tertiary)" stroke-width="0.5" stroke-dasharray="3 3"/>
</g>

<!-- 공식 -->
<g id="formula-group" opacity="0">
  <rect x="60" y="470" width="560" height="50" rx="8" fill="var(--color-background-secondary)" stroke="var(--color-border-tertiary)" stroke-width="0.5"/>
  <text class="ts" x="340" y="488" text-anchor="middle" dominant-baseline="central" fill="var(--color-text-secondary)">Attention(Q, K, V) = softmax( Q · Kᵀ / √dk ) · V</text>
  <text class="ts" x="340" y="508" text-anchor="middle" dominant-baseline="central" fill="var(--color-text-tertiary)">√dk 로 나누는 이유: 차원이 커질수록 내적값이 커져서 softmax가 포화되는 걸 방지</text>
</g>
</svg>
</div>

<script>
const tokens = ["나는", "어제", "학교", "에서", "공부했다"];

const rawScores = [
  [0.9, 0.3, 0.2, 0.2, 0.4],
  [0.3, 0.9, 0.4, 0.3, 0.6],
  [0.2, 0.4, 0.9, 0.5, 0.7],
  [0.2, 0.3, 0.5, 0.9, 0.5],
  [0.4, 0.6, 0.7, 0.5, 0.9],
];

let selected = -1;

function show(id, val=1) {
  document.getElementById(id).setAttribute('opacity', val);
}

function selectToken(idx) {
  selected = idx;
  document.getElementById('hint').setAttribute('opacity', 0);

  for(let i=0;i<5;i++){
    const r = document.getElementById('tr'+i);
    if(i===idx){
      r.setAttribute('fill','#7F77DD');
      r.setAttribute('stroke','#3C3489');
      document.querySelector('#tok'+i+' text').setAttribute('fill','#EEEDFE');
    } else {
      r.setAttribute('fill','#EEEDFE');
      r.setAttribute('stroke','#534AB7');
      document.querySelector('#tok'+i+' text').setAttribute('fill','#3C3489');
    }
  }

  document.getElementById('q-label').textContent = '"' + tokens[idx] + '" 의 질문 벡터';
  show('q-group');
  show('w-group');
  show('k-group');
  show('score-group');
  show('softmax-group');
  show('formula-group');

  const scores = rawScores[idx];
  const maxS = Math.max(...scores);

  setTimeout(() => {
    for(let i=0;i<5;i++){
      const barW = Math.round((scores[i] / 1.0) * 130);
      document.getElementById('sb'+i).setAttribute('width', barW);
      document.getElementById('sl'+i).textContent = 'score: ' + scores[i].toFixed(1);

      const kr = document.getElementById('kr'+i);
      if(scores[i] === maxS){
        kr.setAttribute('fill','#9FE1CB');
        kr.setAttribute('stroke','#1D9E75');
      } else {
        kr.setAttribute('fill','#E1F5EE');
        kr.setAttribute('stroke','#0F6E56');
      }
    }
  }, 80);
}
</script>



<p class="wp-block-paragraph">공식 맨 아래 <code>/ √dk</code>가 있는데, 이건 벡터 차원이 커질수록 내적값이 폭발적으로 커져서 Softmax가 한 값으로 쏠리는 걸 방지하기 위한 정규화야.</p>



<h3 class="wp-block-heading">Scaled dot product Attention (기존 attention과의 차이)</h3>



<p class="wp-block-paragraph">기존 Attention은 Q, K, V가 이렇게 나옴</p>



<ul class="wp-block-list">
<li>Q = 디코더의 현재 hidden state </li>



<li>K = 인코더의 각 hidden state </li>



<li>V = 인코더의 각 hidden state (K와 동일한 값)</li>
</ul>



<p class="wp-block-paragraph">즉 Q, K, V가 <strong>RNN이 만들어낸 hidden state 그 자체</strong>였어. 별도의 변환 없이 바로 사용한 거야.</p>



<p class="wp-block-paragraph">Scaled Dot-Product Attention(Transformer)에서는 근본적으로 달라져. 입력 토큰의 임베딩 벡터 하나에서 <strong>Wq, Wk, Wv 세 개의 별도 가중치 행렬을 곱해서</strong> Q, K, V를 각각 따로 만들어. 같은 토큰이라도 Q로 쓸 때와 K로 쓸 때, V로 쓸 때 서로 다른 벡터가 되는 거야.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading">2. 하나의 토큰이 3개로 나뉜다는 의미</h4>



<p class="wp-block-paragraph">토큰 임베딩 벡터 <code>x</code>가 있을 때:</p>



<pre class="wp-block-code"><code>Q = x · Wq   ← "나는 무엇을 찾고 있나?"  (질문자 역할)
K = x · Wk   ← "나는 어떤 정보를 갖고 있나?" (색인 역할)
V = x · Wv   ← "나의 실제 내용은 무엇인가?" (정보 역할)</code></pre>



<p class="wp-block-paragraph">같은 토큰 <code>x</code>에서 세 가지 <strong>역할</strong>이 분리되는 거야. Wq, Wk, Wv는 학습으로 최적화되는 파라미터이기 때문에, 모델이 "어떤 방식으로 질문하고, 어떤 방식으로 매칭하고, 어떤 정보를 전달할지"를 스스로 학습하게 돼.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading">3. Self-Attention vs Encoder-Decoder Attention</h4>



<figure class="wp-block-image size-large is-resized"><img decoding="async" data-attachment-id="549" data-permalink="https://blog.kggstudio.com/transformer-1/self_vs_cross_attention/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/self_vs_cross_attention.svg" data-orig-size="100,0" data-comments-opened="1" data-image-meta="[]" data-image-title="self_vs_cross_attention" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/self_vs_cross_attention.svg" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/self_vs_cross_attention.svg" alt="" class="wp-image-549" style="aspect-ratio:1.4783061075850588;width:1354px;height:auto"/></figure>



<p class="wp-block-paragraph">도식에서 핵심 차이가 보이지? Self-Attention은 Q, K, V가 전부 같은 시퀀스에서 나와서 "자기 문장 내부의 단어들이 서로를 참조"하는 거고, Encoder-Decoder Attention은 Q만 디코더에서, K와 V는 인코더에서 나와서 "번역 대상 문장을 보면서 출력을 생성"하는 구조야.</p>



<h4 class="wp-block-heading">4. Scaling(√dk로 나누기)의 의미</h4>



<figure class="wp-block-image size-large is-resized"><img decoding="async" data-attachment-id="552" data-permalink="https://blog.kggstudio.com/transformer-1/scaling_effect/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/scaling_effect.svg" data-orig-size="100,0" data-comments-opened="1" data-image-meta="[]" data-image-title="scaling_effect" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/scaling_effect.svg" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/scaling_effect.svg" alt="" class="wp-image-552" style="aspect-ratio:2.1937842778793417;width:1408px;height:auto"/></figure>



<p class="wp-block-paragraph">Scaling의 원리는 이래. 벡터의 차원(dk)이 커질수록 Q와 K의 내적값이 자연히 커지는데, 이 큰 값이 그대로 Softmax에 들어가면 지수함수 특성상 가장 큰 값 쪽으로 확률이 거의 1로 쏠려버려. 이 상태에서 역전파를 하면 기울기가 거의 0이 되어서(기울기 소실) 학습이 제대로 안 돼.</p>



<p class="wp-block-paragraph"><code>√dk</code>로 나누는 건 이 폭발적인 스케일을 내적 차원에 맞게 정규화해주는 거야. 예를 들어 dk=64이면 <code>√64 = 8</code>로 나눠서 점수를 안정된 범위로 가져오는 거지.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading">전체를 한 줄로 정리하면</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>항목</th><th>기존 Attention</th><th>Scaled Dot-Product</th></tr></thead><tbody><tr><td>Q, K, V 출처</td><td>RNN hidden state 그대로</td><td>임베딩에 Wq/Wk/Wv 곱해서 생성</td></tr><tr><td>토큰 → 3개 분리</td><td>없음</td><td>역할(질문/색인/정보)을 명시적 분리</td></tr><tr><td>Self vs Cross</td><td>Cross만 존재</td><td>둘 다 동일 연산, 입력만 다름</td></tr><tr><td>Scaling</td><td>없음</td><td>÷√dk 로 기울기 소실 방지</td></tr></tbody></table></figure>



<h4 class="wp-block-heading">self attention 하고, Encoder-Decoder Attention 둘다 transformer에서 사용하는거같은데, self attention 은 decoder only or encoder only 중에 하나인가?</h4>



<figure class="wp-block-image size-large is-resized"><img decoding="async" data-attachment-id="553" data-permalink="https://blog.kggstudio.com/transformer-1/transformer_attention_placement/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/transformer_attention_placement.svg" data-orig-size="100,0" data-comments-opened="1" data-image-meta="[]" data-image-title="transformer_attention_placement" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/transformer_attention_placement.svg" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/transformer_attention_placement.svg" alt="" class="wp-image-553" style="aspect-ratio:1.1724784011658167;width:1375px;height:auto"/></figure>



<h4 class="wp-block-heading">Single-Head Attention vs Multi-Head Attention</h4>



<figure class="wp-block-image size-large is-resized"><img decoding="async" data-attachment-id="554" data-permalink="https://blog.kggstudio.com/transformer-1/single_vs_multihead_attention/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/single_vs_multihead_attention.svg" data-orig-size="100,0" data-comments-opened="1" data-image-meta="[]" data-image-title="single_vs_multihead_attention" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/single_vs_multihead_attention.svg" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/single_vs_multihead_attention.svg" alt="" class="wp-image-554" style="aspect-ratio:1.0968009970918156;width:1316px;height:auto"/></figure>



<p class="wp-block-paragraph"><strong>Self-Attention은 "무엇을"</strong>, <strong>Multi-Head Attention은 "어떻게 더 잘"</strong> 하는지에 대한 개념이야.</p>



<p class="wp-block-paragraph">Self-Attention은 Q, K, V를 사용해서 토큰 간 관계를 계산하는 <strong>연산 방식</strong> 자체고, Multi-Head Attention은 그 Self-Attention을 <code>h</code>개의 헤드로 나눠서 <strong>병렬로 여러 번</strong> 돌린 뒤 결과를 합치는 <strong>구조적 확장</strong>이야.</p>



<p class="wp-block-paragraph">헤드를 여러 개 쓰는 이유는, 하나의 Attention만으로는 한 가지 관점밖에 못 배우기 때문이야. 예를 들어 "나는 어제 학교에서 공부했다"라는 문장에서 단 하나의 Attention은 문법 관계에 집중하거나 의미 관계에 집중하거나 둘 중 하나밖에 못 해. 헤드를 8개, 16개로 늘리면 각 헤드가 서로 다른 Wq, Wk, Wv를 학습해서 각자 다른 언어적 패턴을 담당하게 돼.</p>



<p class="wp-block-paragraph">그래서 Transformer에서 실제로 쓰이는 건 <strong>Multi-Head Self-Attention</strong>이야. Self-Attention(연산 방식) + Multi-Head(구조)가 합쳐진 형태인 거지.</p>



<h3 class="wp-block-heading">단일 토큰 벡터를 multihead로 구성하는 방법</h3>



<h4 class="wp-block-heading">차원 분할 방식(d_model -> h개로 나누기)</h4>



<p class="wp-block-paragraph">d</p>



<h4 class="wp-block-heading">독립적 학습 파라미터 방식 (각 head가 독립적 가중치 학습)</h4>



<p class="wp-block-paragraph">각 헤드가 <strong>원본 d_model 전체 차원</strong>에 접근하는 독립적인 Wq, Wk, Wv를 가져. 헤드가 h개면 파라미터 행렬도 h세트가 따로 존재.</p>



<pre class="wp-block-code"><code>입력 x (d_model=512)
  ↓
Head 1: x · Wq¹(512×512), x · Wk¹(512×512), x · Wv¹(512×512)
Head 2: x · Wq²(512×512), x · Wk²(512×512), x · Wv²(512×512)
...
Head 8: x · Wq⁸(512×512), x · Wk⁸(512×512), x · Wv⁸(512×512)</code></pre>



<p class="wp-block-paragraph">각 헤드가 전체 벡터를 보고 독립적으로 뭘 집중할지 결정해. 파라미터 수는 <code>h × 3 × d_model²</code>으로 헤드 수에 비례해서 증가해.</p>



<h4 class="wp-block-heading">차원 분할 방식 (Transformer 논문의 실제 선택)</h4>



<p class="wp-block-paragraph">d_model을 헤드 수로 <strong>쪼개서</strong> 각 헤드에 할당해. d_model=512, h=8이면 각 헤드는 dk=64 차원만 담당해.</p>



<pre class="wp-block-code"><code>입력 x (d_model=512)
  ↓
Head 1: x · Wq¹(512×64), x · Wk¹(512×64), x · Wv¹(512×64)
Head 2: x · Wq²(512×64), x · Wk²(512×64), x · Wv²(512×64)
...
Head 8: x · Wq⁸(512×64), x · Wk⁸(512×64), x · Wv⁸(512×64)</code></pre>



<p class="wp-block-paragraph">각 헤드가 더 작은 부분 공간에서 작동해. 파라미터 수는 <code>h × 3 × d_model × dk = 3 × d_model²</code>로 헤드 수에 무관하게 일정해.</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" data-attachment-id="555" data-permalink="https://blog.kggstudio.com/transformer-1/dimension_split_vs_independent_params/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/dimension_split_vs_independent_params.svg" data-orig-size="100,0" data-comments-opened="1" data-image-meta="[]" data-image-title="dimension_split_vs_independent_params" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/dimension_split_vs_independent_params.svg" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/dimension_split_vs_independent_params.svg" alt="" class="wp-image-555" style="aspect-ratio:1.0625456823639972;width:1146px;height:auto"/></figure>



<p class="wp-block-paragraph">핵심 차이를 한 문장으로 요약하면, <strong>독립 파라미터 방식은 헤드마다 각자 512차원 전체를 보고, 차원 분할 방식은 512차원을 헤드 수로 나눠서 각자 64차원씩 담당하는 것</strong>이야.</p>



<p class="wp-block-paragraph">Transformer 논문("Attention is All You Need")이 차원 분할을 선택한 이유는 파라미터 수가 헤드 수에 상관없이 일정하게 유지되기 때문이야. 독립 파라미터 방식으로 헤드를 8개 쓰면 파라미터가 8배로 늘어나지만, 차원 분할 방식은 헤드가 몇 개든 <code>3 × d_model²</code>로 고정돼. 계산량과 메모리를 효율적으로 유지하면서 다양한 관점을 동시에 학습할 수 있는 거지.</p>



<p class="wp-block-paragraph">다만 차원 분할도 완전히 독립적인 파라미터를 가지긴 해. 각 헤드의 Wq, Wk, Wv가 서로 다른 별개의 행렬이야. 차이는 그 행렬의 크기가 <code>d_model × dk</code>(작은 부분공간)냐, <code>d_model × d_model</code>(전체 공간)이냐인 거야.</p>



<h3 class="wp-block-heading">N21, N2N, N2M 정리</h3>



<figure class="wp-block-image size-large is-resized"><img decoding="async" data-attachment-id="559" data-permalink="https://blog.kggstudio.com/transformer-1/n21_n2n_n2m_explanation/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/n21_n2n_n2m_explanation.svg" data-orig-size="100,0" data-comments-opened="1" data-image-meta="[]" data-image-title="n21_n2n_n2m_explanation" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/n21_n2n_n2m_explanation.svg" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/n21_n2n_n2m_explanation.svg" alt="" class="wp-image-559" style="aspect-ratio:1.1724784011658167;width:1310px;height:auto"/></figure>



<p class="wp-block-paragraph"><strong>N21</strong> — 문장 전체를 보고 답 하나를 내는 것. "이 리뷰가 긍정이야 부정이야?" 처럼 전체 입력을 하나의 결론으로 압축하는 태스크야.</p>



<p class="wp-block-paragraph"><strong>N2N</strong> — 토큰 하나하나에 대응하는 답을 내는 것. "각 단어가 무슨 품사야?" 처럼 입력과 출력 개수가 딱 맞아. Transformer 인코더 내부의 Self-Attention이 이 방식이야.</p>



<p class="wp-block-paragraph"><strong>N2M</strong> — 입력과 출력 길이가 서로 달라도 되는 것. 번역이 대표적인 예야. 한국어 3단어를 넣었는데 영어로는 4단어가 나올 수도 있잖아. Transformer 전체 구조(인코더 + 디코더)가 이걸 가능하게 하는 거야.</p>



<p class="wp-block-paragraph">Transformer가 이전 RNN 기반 모델들보다 혁신적이었던 이유 중 하나가 N2M을 훨씬 잘 처리할 수 있게 된 거야. RNN은 길이가 길어질수록 앞쪽 정보가 흐려졌지만, Transformer는 Self-Attention으로 거리와 상관없이 모든 토큰을 직접 참조할 수 있으니까.</p>



<h3 class="wp-block-heading">트랜스포머 관련 링크 (3 가지)</h3>



<figure class="wp-block-embed is-type-rich"><div class="wp-block-embed__wrapper">
<a class="m-story" href="https://medium.com/@hugmanskj/transformer%EC%9D%98-%ED%81%B0-%EA%B7%B8%EB%A6%BC-%EC%9D%B4%ED%95%B4-%EA%B8%B0%EC%88%A0%EC%A0%81-%EB%B3%B5%EC%9E%A1%ED%95%A8-%EC%97%86%EC%9D%B4-%ED%95%B5%EC%8B%AC-%EC%95%84%EC%9D%B4%EB%94%94%EC%96%B4-%ED%8C%8C%EC%95%85%ED%95%98%EA%B8%B0-5e182a40459d" target="_blank" data-width="1500" data-border="1" data-collapsed="">Medium.com에서 보기</a>
</div></figure>



<p class="wp-block-paragraph"><a href="https://wikidocs.net/31379">https://wikidocs.net/31379</a></p>



<p class="wp-block-paragraph"><a href="https://cpm0722.github.io/pytorch-implementation/transformer">https://cpm0722.github.io/pytorch-implementation/transformer</a></p>



<h4 class="wp-block-heading">찾아봐야할 내용</h4>



<p class="wp-block-paragraph">PCA, 공분산 행렬</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kggstudio.com/transformer-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">539</post-id>	</item>
		<item>
		<title>NLP (1) &#8211; seq2seq</title>
		<link>https://blog.kggstudio.com/nlp-1-seq2seq/</link>
					<comments>https://blog.kggstudio.com/nlp-1-seq2seq/#respond</comments>
		
		<dc:creator><![CDATA[TimTam]]></dc:creator>
		<pubDate>Tue, 05 May 2026 22:51:59 +0000</pubDate>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[NLP]]></category>
		<category><![CDATA[seq2seq]]></category>
		<guid isPermaLink="false">https://blog.kggstudio.com/?p=530</guid>

					<description><![CDATA[seq2seq 이 수식을 기억하시나요? p(y1,…,yT′∣x1,…,xT)=Πt=1T′p(yt∣v,y1,…,yt−1)p(y1​,…,yT′​∣x1​,…,xT​)=Πt=1T′​p(yt​∣v,y1​,…,yt−1​) Encoder가 생성한 컨텍스트 벡터 v 를 Embedding 레이어를 거친 y 값에 Concatnate하여 위 수식을 비로소 만족하게 됩니다. 우리가 Seq2seq를 완성한 거죠! LSTM Encoder Embedding 레이어를 단어 사이즈와 Embedding 차원에 대해 선언을 한 후, 논문에서 소개한 대로 torch.nn.LSTM(enc_units)으로 LSTM을 정의합니다. Pytorch 속 LSTM 모듈의 기본 반환 값은 최종 State 값이므로 return_sequences ... <a title="NLP (1) &#8211; seq2seq" class="read-more" href="https://blog.kggstudio.com/nlp-1-seq2seq/" aria-label="NLP (1) &#8211; seq2seq에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">seq2seq</h2>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="490" height="600" data-attachment-id="531" data-permalink="https://blog.kggstudio.com/nlp-1-seq2seq/image-91/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image.png" data-orig-size="490,600" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/05/image.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/05/image.png" alt="" class="wp-image-531" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/05/image.png 490w, https://blog.kggstudio.com/wp-content/uploads/2026/05/image-245x300.png 245w" sizes="auto, (max-width: 490px) 100vw, 490px" /></figure>



<p class="wp-block-paragraph">이 수식을 기억하시나요?</p>



<p class="wp-block-paragraph"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mrow><mo fence="true">(</mo><msub><mi>y</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>y</mi><msup><mi>T</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></msub><mo>∣</mo><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>x</mi><mi>T</mi></msub><mo fence="true">)</mo></mrow><mo>=</mo><msubsup><mi mathvariant="normal">Π</mi><mrow><mi>t</mi><mo>=</mo><mn>1</mn></mrow><msup><mi>T</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></msubsup><mi>p</mi><mrow><mo fence="true">(</mo><msub><mi>y</mi><mi>t</mi></msub><mo>∣</mo><mi>v</mi><mo separator="true">,</mo><msub><mi>y</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>y</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo fence="true">)</mo></mrow></mrow></semantics></math><em>p</em>(<em>y</em>1​,…,<em>y</em><em>T</em>′​∣<em>x</em>1​,…,<em>x</em><em>T</em>​)=Π<em>t</em>=1<em>T</em>′​<em>p</em>(<em>y</em><em>t</em>​∣<em>v</em>,<em>y</em>1​,…,<em>y</em><em>t</em>−1​)</p>



<p class="wp-block-paragraph"><code>Encoder</code>가 생성한 컨텍스트 벡터 v 를 Embedding 레이어를 거친 y 값에 Concatnate하여 위 수식을 비로소 만족하게 됩니다. 우리가 Seq2seq를 완성한 거죠!</p>



<h3 class="wp-block-heading">LSTM Encoder</h3>



<pre class="wp-block-code"><code>import torch.nn as nn

class Encoder(nn.Module):
    def __init__(self, input_dim, emb_dim, hidden_dim):
        super().__init__()

        self.embedding = nn.Embedding(input_dim, emb_dim)
        self.rnn = nn.LSTM(emb_dim, hidden_dim, batch_first=True)

    def forward(self, src):
        print("입력 Shape:", src.size())

        embedded = self.embedding(src)
        print("Embedding Layer를 거친 Shape:", embedded.size())

        outputs, (h_0, c_0) = self.rnn(embedded)
        print("LSTM Layer의 Output Shape:", outputs.size())
        print("LSTM Layer의 Hidden State Shape:", h_0.size())
        print("LSTM Layer의 Cell State Shape:", c_0.size())

        return outputs, h_0, c_0</code></pre>



<p class="wp-block-paragraph">Embedding 레이어를 단어 사이즈와 Embedding 차원에 대해 선언을 한 후, 논문에서 소개한 대로 <code>torch.nn.LSTM(enc_units)</code>으로 LSTM을 정의합니다. <em>Pytorch</em> 속 LSTM 모듈의 기본 반환 값은 <strong>최종 State 값</strong>이므로 <code>return_sequences</code> 나 <code>return_state</code> 값은 따로 조정하지 않습니다 (기본: False). 즉, 우리가 정의해 준 <code>Encoder</code> 클래스의 반환 값이 곧 <strong>컨텍스트 벡터(Context Vector)</strong> 가 되는 겁니다. 추가적인 옵션이 궁금하시다면 아래의 Pytorch LSTM 공식 문서를 참조하시면 좋습니다.</p>



<pre class="wp-block-code"><code>vocab_size = 30000
emb_size = 256
lstm_size = 512
batch_size = 1
sample_seq_len = 3

print("Vocab Size: {0}".format(vocab_size))
print("Embedidng Size: {0}".format(emb_size))
print("LSTM Size: {0}".format(lstm_size))
print("Batch Size: {0}".format(batch_size))
print("Sample Sequence Length: {0}\n".format(sample_seq_len))</code></pre>



<pre class="wp-block-code"><code>Vocab Size: 30000
Embedidng Size: 256
LSTM Size: 512
Batch Size: 1
Sample Sequence Length: 3</code></pre>



<pre class="wp-block-code"><code>import torch

encoder = Encoder(vocab_size, emb_size, lstm_size)
sample_input = torch.randint(0, vocab_size, (batch_size, sample_seq_len))

sample_output, hidden, cell = encoder(sample_input)</code></pre>



<h3 class="wp-block-heading">LSTM Decoder</h3>



<p class="wp-block-paragraph">class Decoder(nn.Module):<br>def <strong>init</strong>(self, vocab_size, embedding_dim, hidden_dim):<br>super(Decoder, self).<strong>init</strong>()<br>self.embedding = nn.Embedding(vocab_size, embedding_dim)<br>self.lstm = nn.LSTM(embedding_dim + hidden_dim, hidden_dim, batch_first=True)<br>self.fc = nn.Linear(hidden_dim, vocab_size)</p>



<pre class="wp-block-code"><code>def forward(self, x, hidden, cell, context):
    print("입력 Shape:", x.size())

    embedded = self.embedding(x)
    print("Embedding Layer를 거친 Shape:", embedded.size())

    embedded = torch.cat((embedded, context), dim=2)
    print("Context Vector가 더해진 Shape:", embedded.size())

    output, (hidden, cell) = self.lstm(embedded, (hidden, cell))
    print("LSTM Layer의 Output Shape:", output.size())

    output = self.fc(output)
    print("Decoder 최종 Output Shape:", output.size())

    return output, hidden, cell</code></pre>



<p class="wp-block-paragraph"><code>Decoder</code>는 <code>Encoder</code>와 구조적으로 유사하지만 결과물을 생성해야 하므로 Fully Connected 레이어가 추가되었고, 출력값을 확률로 변환해 주는 Softmax 함수도 추가되었습니다 (Softmax는 모델 내부에 포함시키지 않아도 훈련 과정에서 포함시키는 방법도 있습니다). 그리고 <code>Decoder</code>가 매 스텝 생성하는 출력은 우리가 원하는 번역 결과에 해당하므로 LSTM 레이어의 <code>return_sequences</code> 변수를 <code>True</code>로 설정하여 State 값이 아닌 Sequence 값을 출력으로 받습니다.</p>



<pre class="wp-block-code"><code>print("Vocab Size: {0}".format(vocab_size))
print("Embedidng Size: {0}".format(emb_size))
print("LSTM Size: {0}".format(lstm_size))
print("Batch Size: {0}".format(batch_size))
print("Sample Sequence Length: {0}\n".format(sample_seq_len))</code></pre>



<pre class="wp-block-code"><code>decoder_input = torch.randint(0, vocab_size, (batch_size, sample_seq_len))  # (batch_size, seq_length)

decoder = Decoder(vocab_size, emb_size, lstm_size)

dec_output, hidden, cell = decoder(decoder_input, hidden, cell, sample_output)</code></pre>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kggstudio.com/nlp-1-seq2seq/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">530</post-id>	</item>
		<item>
		<title>Claude code 토큰 절약하는 10가지 방법</title>
		<link>https://blog.kggstudio.com/10-ways-to-save-claude-tokens/</link>
					<comments>https://blog.kggstudio.com/10-ways-to-save-claude-tokens/#respond</comments>
		
		<dc:creator><![CDATA[TimTam]]></dc:creator>
		<pubDate>Tue, 21 Apr 2026 12:34:36 +0000</pubDate>
				<category><![CDATA[AI-Tools]]></category>
		<category><![CDATA[Claude]]></category>
		<category><![CDATA[Dev]]></category>
		<guid isPermaLink="false">https://blog.kggstudio.com/?p=505</guid>

					<description><![CDATA[🔥 AI 토큰 소모를 60% 이상 절약하는 무료 방법 10가지를 모았습니다 Claude Code를 본격적으로 쓰기 시작하면 진짜 병목은 토큰 리밋입니다.세션 한 번에 리밋이 절반 이상 차는 경험도 부지기수입니다. 대부분의 Github repo 를 직접 살펴봤습니다.하지만 주목할만한 건 아래 10가지 방법뿐이었어요:이 방법만으로도 같은 작업에서 AI 지출을 확 줄일 수 있습니다: • RTK &#8211; 터미널 출력을 컨텍스트에 넣기 ... <a title="Claude code 토큰 절약하는 10가지 방법" class="read-more" href="https://blog.kggstudio.com/10-ways-to-save-claude-tokens/" aria-label="Claude code 토큰 절약하는 10가지 방법에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="899" data-attachment-id="506" data-permalink="https://blog.kggstudio.com/10-ways-to-save-claude-tokens/image-77/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/04/image-17.png" data-orig-size="1280,1124" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/04/image-17-1024x899.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/04/image-17-1024x899.png" alt="" class="wp-image-506" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/04/image-17-1024x899.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/04/image-17-300x263.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/04/image-17-768x674.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/04/image-17.png 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f525.png" alt="🔥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> AI 토큰 소모를 60% 이상 절약하는 무료 방법 10가지를 모았습니다</p>



<p class="wp-block-paragraph">Claude Code를 본격적으로 쓰기 시작하면 진짜 병목은 토큰 리밋입니다.<br>세션 한 번에 리밋이 절반 이상 차는 경험도 부지기수입니다.</p>



<p class="wp-block-paragraph">대부분의 Github repo 를 직접 살펴봤습니다.<br>하지만 주목할만한 건 아래 10가지 방법뿐이었어요:<br>이 방법만으로도 같은 작업에서 AI 지출을 확 줄일 수 있습니다:</p>



<p class="wp-block-paragraph">• RTK &#8211; 터미널 출력을 컨텍스트에 넣기 전에 필터링하는 CLI 프록시 → <a href="https://www.linkedin.com/safety/go/?url=https%3A%2F%2Flnkd%2Ein%2FgstbVEKb&amp;urlhash=OiKe&amp;mt=HA9QekEOx4ODSPz_dyOdP0MzhhpGccI5U7FKUdJreZRDpr3GdfIzvxDqB6ggNg2f0qBYRB-kOqwIqsk7X_dW1TJNm9pmYXaaPWFHd1_if9cskbD1Ofp-rxnBwQ&amp;isSdui=true" target="_blank" rel="noreferrer noopener"><strong>https://lnkd.in/gstbVEKb</strong></a></p>



<p class="wp-block-paragraph">• Context Mode &#8211; Playwright·GitHub·로그 등 raw 출력을 SQLite에 샌드박싱해서 깨끗한 요약만 대화에 넣어주는 Claude Code 플러그인 → <a href="https://www.linkedin.com/safety/go/?url=https%3A%2F%2Flnkd%2Ein%2FgHX7CJqS&amp;urlhash=D248&amp;mt=uQFilVVoT5JJ2bSHs3djrrAjMpF67wN8hg7lO6N0znM9upmU8y_dhGvXoa9q_Gur08b-LaUHXfi2HH5N1da-UnTKmMooXGsqAZRNjTmK6m116qostJuIqERvYg&amp;isSdui=true" target="_blank" rel="noreferrer noopener"><strong>https://lnkd.in/gHX7CJqS</strong></a></p>



<p class="wp-block-paragraph">• code-review-graph &#8211; Tree-sitter로 코드베이스를 로컬 지식 그래프로 매핑해서 필요한 부분만 읽게 해주는 MCP 서버 → <a href="https://www.linkedin.com/safety/go/?url=https%3A%2F%2Flnkd%2Ein%2FgQqUpqr2&amp;urlhash=SOKt&amp;mt=ZmGLtPtRh_fqlrPb41R-OyRcYYVWAXPDGN6j3XFTK08bCeN9tqIUemN_51Xk_H-fax16Z0UlSR4IOeQOb8ApfKGSDC3quZSZqt618UdKDrK9TmpB1T4SQZg8EQ&amp;isSdui=true" target="_blank" rel="noreferrer noopener"><strong>https://lnkd.in/gQqUpqr2</strong></a></p>



<p class="wp-block-paragraph">• Token Savior &#8211; 파일 전체 대신 심볼 단위로 코드를 탐색하는 MCP 서버. 69개 도구에 세션 간 메모리도 유지되고, 토큰 소모도 확 줄어듭니다 → <a href="https://www.linkedin.com/safety/go/?url=https%3A%2F%2Flnkd%2Ein%2FgMFTd2du&amp;urlhash=c01h&amp;mt=JHpbCTTQhrBwmBT2VfrGXArR9YqJ-mwQdLycmAowtifQRPBtKFUnlhZRf_FP9OdUHoXzi5u8NOR3zBfI5g42cCzaKdlRLxQDvONj8AxbO1jOCDO3j8VYfgNSCA&amp;isSdui=true" target="_blank" rel="noreferrer noopener"><strong>https://lnkd.in/gMFTd2du</strong></a></p>



<p class="wp-block-paragraph">• Caveman Claude &#8211; Claude 를 원시인처럼 말하게 해서 출력 토큰만 65-75% 깎아주는 스킬. 한 줄 설치에 결과물 정확도는 그대로입니다 → <a href="https://www.linkedin.com/safety/go/?url=https%3A%2F%2Flnkd%2Ein%2FgChQPymJ&amp;urlhash=UkmR&amp;mt=-Xnj1J7IaWvJi7hwnPsy89kSq8b3Wc0dAovhJguI5ak0jQDnWpgs0ieY_6BRAdngxyrZG2Fzf6_jXx7HD9Lnd5i1Wq0Qik4-5kFtry1cldKUSGMRSJnaa9mYEw&amp;isSdui=true" target="_blank" rel="noreferrer noopener"><strong>https://lnkd.in/gChQPymJ</strong></a></p>



<p class="wp-block-paragraph">• claude-token-efficient &#8211; <a href="https://www.linkedin.com/safety/go/?url=http%3A%2F%2FCLAUDE%2Emd&amp;urlhash=onXc&amp;mt=lCoI2iThkbIOdUCt5U0CeIj272n1Ij7ril_tmPgkBQgUuweixXlHQ_o-xXUP7EbWHrA0jdghNXveKfZ_2SraDmbdQxms06bH0Je-9KgvHhNmIZp95MLKmKhZ2g&amp;isSdui=true" target="_blank" rel="noreferrer noopener"><strong>CLAUDE.md</strong></a> 파일 하나로 응답을 간결하게 잡아주는 드롭인 설정. 코드 변경도 필요 없습니다 → <a href="https://www.linkedin.com/safety/go/?url=https%3A%2F%2Flnkd%2Ein%2Fg5VajJAG&amp;urlhash=EoxB&amp;mt=iZENfrrV7VKa8JVV0IP0AYwwDUaLWGJfv_SHaMPKEqTHc6tD5_LUVkN2YT9VJqoX_ou3uPtI72dQ0lqa7Pq7ffR4deS446elqqmKvCIuQGdxXjQeVPLHx6Y1Xg&amp;isSdui=true" target="_blank" rel="noreferrer noopener"><strong>https://lnkd.in/g5VajJAG</strong></a></p>



<p class="wp-block-paragraph">• token-optimizer-mcp &#8211; 캐싱·압축·스마트 도구 인텔리전스를 결합한 MCP 서버. 반복 출력을 압축해서 토큰을 절감해줍니다 → <a href="https://www.linkedin.com/safety/go/?url=https%3A%2F%2Flnkd%2Ein%2Fg5zQNeye&amp;urlhash=VJGv&amp;mt=jmpRsrJ0V-J9dXxh7SCrfBkJRzVE9zzxab3ieyF0DfrEW_JkG1bfUoztnaX1JbA5YkPMpE4OoOeKlfChMcKrcSsQcPG99bGJk-d7myM2pQv-7hBjnUGUNIqEgw&amp;isSdui=true" target="_blank" rel="noreferrer noopener"><strong>https://lnkd.in/g5zQNeye</strong></a></p>



<p class="wp-block-paragraph">• claude-token-optimizer &#8211; 어떤 프로젝트든 5분이면 적용 가능한 셋업 프롬프트 모음. 문서 토큰 소모가 대폭 줄어듭니다 → <a href="https://www.linkedin.com/safety/go/?url=https%3A%2F%2Flnkd%2Ein%2Fgwd3MV9Y&amp;urlhash=zVpb&amp;mt=azK2DaMy3etY5GmdC9qSBLGmo1g7HHlHEUZUhu0xDVGrVDsT8rgCU6_GTleFAbPrR2ECBCqx6I1jrDUh5UtYsiFWAsuyEzsdnqiXerXu1QWfReyf4Pm5sCw_hw&amp;isSdui=true" target="_blank" rel="noreferrer noopener"><strong>https://lnkd.in/gwd3MV9Y</strong></a></p>



<p class="wp-block-paragraph">• token-optimizer &#8211; 컨텍스트를 조용히 잡아먹는 고스트 토큰을 찾아내는 도구. 컴팩션 후에도 품질이 유지됩니다 → <a href="https://www.linkedin.com/safety/go/?url=https%3A%2F%2Flnkd%2Ein%2Fgfnj3m2Z&amp;urlhash=lvJK&amp;mt=KSV3Qlp4dvBNYlRZsdtxxyCW_He8UgRGvTYIoVnfonAtBzsrUjoZJ9BPFVx7quqXULy-2TsmeceXPNs6Om9EHtvRab7vLMdN_9xhbHMkhqFkTp_6_aIQ7YAHpA&amp;isSdui=true" target="_blank" rel="noreferrer noopener"><strong>https://lnkd.in/gfnj3m2Z</strong></a></p>



<p class="wp-block-paragraph">• claude-context by Zilliz &#8211; BM25 + 벡터 하이브리드 검색으로 코드베이스 전체를 컨텍스트로 만들어주는 코드 검색 MCP. → <a href="https://www.linkedin.com/safety/go/?url=https%3A%2F%2Flnkd%2Ein%2FgFJGE3_C&amp;urlhash=pdSy&amp;mt=Gp0sxOhHIEMYb8g1E30YhrVOb9aELNAovpsXJXUkxPqWQe5Rtpe6O8UFZ_nNFF6ZE9CMnynDAoA5L5jjhJ2oBZcjWPju3qc03z2PQPFgJOVMrZLqzdh0N9-cnA&amp;isSdui=true" target="_blank" rel="noreferrer noopener"><strong>https://lnkd.in/gFJGE3_C</strong></a></p>



<p class="wp-block-paragraph">10개를 다 설치하실 필요는 없습니다.<br>워크플로에 맞게 선택하세요:</p>



<p class="wp-block-paragraph">터미널 출력이 많다면 → RTK<br>큰 코드베이스라면 → code-review-graph + Token Savior<br>MCP 서버가 많다면 → Context Mode<br>당장 리밋을 아끼고 싶다면 → Caveman + claude-token-efficient</p>



<p class="wp-block-paragraph">10가지 방법 전부 무료입니다.<br>지금 Claude code 나 Codex 에 적용해보세요.<br>즉시 여러분의 지갑을 지킬 수 있습니다.</p>



<p class="wp-block-paragraph">출처: <a href="https://www.linkedin.com/feed/update/urn:li:activity:7452105881321725953/?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAADN6qvkBoCpZ2mDg6u0HK-Zg_GDF1ifPyc8">https://www.linkedin.com/feed/update/urn:li:activity:7452105881321725953/?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAADN6qvkBoCpZ2mDg6u0HK-Zg_GDF1ifPyc8</a></p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kggstudio.com/10-ways-to-save-claude-tokens/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">505</post-id>	</item>
		<item>
		<title>AI Paper 읽기</title>
		<link>https://blog.kggstudio.com/ai-paper/</link>
					<comments>https://blog.kggstudio.com/ai-paper/#respond</comments>
		
		<dc:creator><![CDATA[TimTam]]></dc:creator>
		<pubDate>Tue, 21 Apr 2026 01:08:01 +0000</pubDate>
				<category><![CDATA[AI-Paper]]></category>
		<category><![CDATA[Dev]]></category>
		<guid isPermaLink="false">https://blog.kggstudio.com/?p=500</guid>

					<description><![CDATA[일기 오늘은 일기로 글을 쓰기 시작 하겠다. 나는 C언어를 처음 배운게 2004년, 컴퓨터공학을 공부하고 게임개발 위해 투자한 시간만 2만시간이 넘는다. 비록 게임개발자로 일한것은 1년밖에 되지 않지만, 다른일 을 하면서도 중간 중간 코딩하는것을 잊은적이 없다. 코딩 실력을 유지하기위해서? 아니다 코딩자체가 재밌고, 무언가 만들었을때 사람들이 좋아해주면 그것으로 뿌듯하고 기분이 좋은일이라 계속 했던것 같다. 본격 AI시대에 들어서면서 머신러닝 ... <a title="AI Paper 읽기" class="read-more" href="https://blog.kggstudio.com/ai-paper/" aria-label="AI Paper 읽기에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">일기</h2>



<p class="wp-block-paragraph">오늘은 일기로 글을 쓰기 시작 하겠다.</p>



<p class="wp-block-paragraph"> 나는 C언어를 처음 배운게 2004년, 컴퓨터공학을 공부하고 게임개발 위해 투자한 시간만 2만시간이 넘는다. 비록 게임개발자로 일한것은 1년밖에 되지 않지만, 다른일 을 하면서도 중간 중간 코딩하는것을 잊은적이 없다. 코딩 실력을 유지하기위해서? 아니다 코딩자체가 재밌고, 무언가 만들었을때 사람들이 좋아해주면 그것으로 뿌듯하고 기분이 좋은일이라 계속 했던것 같다.</p>



<p class="wp-block-paragraph"> 본격 AI시대에 들어서면서 머신러닝 딥러닝을 공부한지 벌써 한달이 지났다. 정신없게 만드는 새로운 용어들이 하루에도 몇 개씩 계속 나타난다. 이제 딥러닝이 왜 딥러닝 인지 뉴럴네트워크는 왜 그렇게 불리는지 머신러닝, 딥러닝 모델 십여개를 학습시켜보면서 감이 오기 시작한다. 최근에는 CV를 배우면서 상용 모델을 몇가지 써보면서 문득 이런 고민에 빠졌다.</p>



<ul class="wp-block-list">
<li>&#8220;이렇게 많은 모델들 구조를 다 알아야 하나?&#8221;</li>



<li>&#8220;이 모델들의 특징을 모르면, 내가 필요한 모델이 뭔지 알고 사용할수 있을까?&#8221;</li>



<li>&#8220;연구를 해봐야한다면 논문을 다 읽어봐야하나? 구현만 해보면 충분한가?&#8221;</li>
</ul>



<p class="wp-block-paragraph">모든 사람이 알겠지만, AI의 발전은 미친듯이 빠르다. 그만큼 AI 머신러닝 관련 논문이 수도없이 나오고 있다. 그동안 인기있던 모델들을 100% 다 이해하면, 내가 스스로 모델을 만들어낼때 도움이 되겠지만, 너무나 시간이 많이 걸릴것 같다. 따라서 분야별로 논문을봐서 특징이나 사용기술에대한 개념을 이해하기위한 모델들을 정리하고 순서대로 공부를 해야겠다는 전략을 세우게 됨.</p>



<p class="wp-block-paragraph">공부법은 아래처럼 하고 매주 1-2개씩 모델을 깊게 공부하는 시간을 가져야할것같다.</p>



<div>
<h2 class="wp-block-heading">모델을 공부할 때 꼭 염두해야 할 점</h2>
</div>



<ol class="wp-block-list">
<li>각 모델이 어떤 문제를 해결하려 했는지를 이해하기. (<strong>이전 모델에서는 어떤 방법</strong>을 썼고, 왜 부족했는지 30분정도 알아보기)</li>



<li>전체를 한번에 이해하려 하지말고 특징이 뭔지 살펴보기 (논문의 Abstract, Figure, Experiment 순으로 읽어 <strong>전체 그림을 잡기</strong>)</li>



<li>수식은 나중에 완벽히 분석하고, 특징파악 끝났으면 <strong>PyTorch 사용해서 핵심 모듈만 구현</strong>부터 해보기 (전체모듈 다 안해봐도 됨, 반복이라서)</li>



<li><strong>공개된 코드를 읽고 논문과 대조</strong>해보기.</li>



<li>해당 모델을 인용한 논문 2-3개 찾아보고 <strong>어느 부분이 한계라고 지적</strong>했는지 보기</li>



<li>코드 구현 끝났으면 실제로 사용해서 대충 학습시간이나 추론시간등 감을 익혀보고 다른 모델과 비교해보기</li>



<li>70%만 이해한다는 생각으로 논문을 빠르게 습득하고 넘어가기 나머지 30%는 다른 모델을 공부하거나 실제 프로젝트를 진행하면서 채워나가기</li>
</ol>



<p class="wp-block-paragraph"><strong>분야 간 연결도 중요합니다.</strong> Transformer는 NLP에서 나왔지만 ViT(CV), Whisper(음성), DiT(이미지 생성)로 그대로 흘러들어갔습니다. CLIP은 이미지-텍스트 정렬이고 Stable Diffusion의 핵심 부품입니다. 분야를 별개로 공부하다 보면 이런 연결이 안 보이는데, &#8220;이 개념이 다른 분야에서는 어떻게 쓰이지?&#8221;라는 질문을 항상 갖고 있는 것만으로 이해의 깊이가 달라집니다</p>



<p class="wp-block-paragraph"><strong>논문 읽기 전에 필요한 수학 기초</strong>로는 선형대수(행렬 곱, 고유값), 확률·통계(베이즈 정리, KL divergence, 가우시안 분포), 미적분(편미분, 체인룰), 정보이론(엔트로피, cross-entropy)이 있습니다. 이걸 미리 다 공부하려 하지 말고, 논문 읽다가 막히는 수식이 나올 때 그 개념만 찾아보는 방식이 훨씬 효율적입니다.</p>



<h2 class="wp-block-heading">각 분야별로 공부해야 할 것들</h2>



<style>
/* 모든 텍스트 크기를 1단계씩 상향 조정 (약 1.25배) */
*{box-sizing:border-box;margin:0;padding:0}
h2.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}
.tabs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:1.5rem}
.tab{font-size:15px;font-weight:500;padding:6px 16px;border-radius:99px;border:0.5px solid var(--color-border-secondary);background:transparent;color:var(--color-text-secondary);cursor:pointer;transition:all .15s}
.tab.active{background:var(--color-text-primary);color:var(--color-background-primary);border-color:transparent}
.domain{display:none}.domain.active{display:block}
.timeline{position:relative;padding-left:32px}
.timeline::before{content:'';position:absolute;left:10px;top:6px;bottom:6px;width:1.5px;background:var(--color-border-tertiary)}
.item{position:relative;margin-bottom:18px}
.item::before{content:'';position:absolute;left:-27px;top:16px;width:12px;height:12px;border-radius:50%;border:2px solid var(--color-border-secondary);background:var(--color-background-primary)}
.item.key::before{background:var(--dot-color,#378ADD);border-color:var(--dot-color,#378ADD)}
.card{background:var(--color-background-primary);border:0.5px solid var(--color-border-tertiary);border-radius:var(--border-radius-lg);padding:14px 18px;cursor:pointer;transition:border-color .15s}
.card:hover{border-color:var(--color-border-secondary)}
.card.key{border-left:4px solid var(--dot-color,#378ADD)}
.card-top{display:flex;align-items:center;gap:10px;margin-bottom:8px}
.year-badge{font-size:13px;font-weight:500;padding:3px 10px;border-radius:99px;background:var(--color-background-secondary);color:var(--color-text-tertiary);white-space:nowrap}
.model-name{font-size:17px;font-weight:600;color:var(--color-text-primary);flex:1}
.must-badge{font-size:12px;font-weight:500;padding:3px 9px;border-radius:99px;white-space:nowrap}
.desc{font-size:15px;color:var(--color-text-secondary);line-height:1.6}
.key-idea{font-size:13.5px;color:var(--color-text-tertiary);margin-top:7px}
.key-idea b{font-weight:500;color:var(--color-text-secondary)}
.section-label{font-size:13px;font-weight:600;color:var(--color-text-tertiary);letter-spacing:.05em;text-transform:uppercase;margin:1.5rem 0 0.8rem;padding-left:2px}
.ask-btn{margin-top:10px;font-size:13px;padding:6px 14px;border-radius:99px;border:0.5px solid var(--color-border-secondary);background:transparent;color:var(--color-text-secondary);cursor:pointer}
.ask-btn:hover{background:var(--color-background-secondary)}
.tip-box{background:var(--color-background-secondary);border-radius:var(--border-radius-md);padding:14px 18px;margin-top:1.25rem;font-size:15px;color:var(--color-text-secondary);line-height:1.65}
.tip-box b{font-weight:600;color:var(--color-text-primary)}
</style>

<h2 class="sr-only">딥러닝·CV·NLP·음성 분야별 뼈대 모델 공부 순서 로드맵</h2>

<div class="tabs" id="tabs">
  <button class="tab active" data-domain="foundation">딥러닝 기반</button>
  <button class="tab" data-domain="cv">CV</button>
  <button class="tab" data-domain="nlp">NLP</button>
  <button class="tab" data-domain="diffusion">Diffusion</button>
  <button class="tab" data-domain="ocr">OCR</button>
  <button class="tab" data-domain="speech-rec">음성 인식</button>
  <button class="tab" data-domain="speech-gen">음성 생성</button>
</div>

<div id="foundation" class="domain active" style="--dot-color:#378ADD">
  <div class="tip-box"><b>먼저 이걸 잡아야 모든 분야가 열립니다.</b> 아래 개념들은 분야를 불문하고 모든 논문에서 당연한 것으로 전제합니다. 모델보다 개념 순서로 접근하세요.</div>
  <div class="section-label">개념 레이어 1 — 학습 원리</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">1986</span><span class="model-name">역전파 (Backpropagation)</span><span class="must-badge" style="background:#E6F1FB;color:#185FA5">필수</span></div>
        <div class="desc">Rumelhart et al. 모든 딥러닝의 학습 엔진. 체인룰로 gradient를 역방향 전파. 이걸 수식으로 직접 유도해보는 것이 가장 중요한 첫 단계.</div>
        <div class="key-idea"><b>핵심 개념:</b> Chain rule, computational graph, gradient flow</div>
        <button class="ask-btn" onclick="sendPrompt('역전파 알고리즘을 수식과 함께 직관적으로 설명해줘. 체인룰이 왜 필요한지도 포함해서')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2012~</span><span class="model-name">SGD / Adam / 최적화기</span><span class="must-badge" style="background:#E6F1FB;color:#185FA5">필수</span></div>
        <div class="desc">SGD, Momentum, RMSProp, Adam. 단순 경사하강법부터 적응형 학습률까지. Adam이 왜 대부분의 상황에서 기본값인지 이해.</div>
        <div class="key-idea"><b>핵심 개념:</b> Learning rate, momentum, adaptive LR, weight decay</div>
        <button class="ask-btn" onclick="sendPrompt('SGD부터 Adam까지 최적화기 발전 흐름을 각각의 핵심 아이디어 중심으로 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
  <div class="section-label">개념 레이어 2 — 안정화 기법</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2015</span><span class="model-name">Batch Normalization</span><span class="must-badge" style="background:#E6F1FB;color:#185FA5">필수</span></div>
        <div class="desc">Ioffe &#038; Szegedy. 레이어 입력 분포를 정규화해 학습을 안정화. 왜 없으면 깊은 네트워크가 학습이 안 되는지 이해가 핵심.</div>
        <div class="key-idea"><b>핵심 개념:</b> Internal covariate shift, running stats, train vs inference 차이</div>
        <button class="ask-btn" onclick="sendPrompt('Batch Normalization이 왜 필요한지, 내부 covariate shift 개념과 함께 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2015</span><span class="model-name">Residual Connection (ResNet)</span><span class="must-badge" style="background:#E6F1FB;color:#185FA5">필수</span></div>
        <div class="desc">He et al. F(x)+x 형태의 skip connection으로 gradient vanishing 해결. 이게 없으면 100층 이상 학습 불가. 현재 거의 모든 딥러닝 구조의 근간.</div>
        <div class="key-idea"><b>핵심 개념:</b> Gradient highway, identity mapping, depth scalability</div>
        <button class="ask-btn" onclick="sendPrompt('Residual connection이 gradient vanishing 문제를 어떻게 해결하는지 수식과 함께 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2017</span><span class="model-name">Attention / Transformer</span><span class="must-badge" style="background:#E6F1FB;color:#185FA5">필수</span></div>
        <div class="desc">Vaswani et al. &#8220;Attention is All You Need&#8221;. Query-Key-Value attention 메커니즘. NLP뿐 아니라 이후 CV, 음성, 이미지생성 모두의 기반. 논문 전체를 수식까지 이해하는 것을 목표로.</div>
        <div class="key-idea"><b>핵심 개념:</b> Scaled dot-product attention, multi-head, positional encoding</div>
        <button class="ask-btn" onclick="sendPrompt('Transformer의 Scaled Dot-Product Attention을 수식부터 직관까지 완전히 설명해줘. Multi-head가 왜 필요한지도.')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
  <div class="tip-box" style="margin-top:1rem"><b>공부 순서 원칙:</b> 역전파 → 최적화기 → BatchNorm/Dropout → ResNet → Attention. 이 순서가 무너지면 이후 모든 논문이 맥락 없이 읽힙니다. 각 개념마다 PyTorch로 미니 구현을 해보세요.</div>
</div>

<div id="cv" class="domain" style="--dot-color:#1D9E75">
  <div class="tip-box"><b>CV 공부 순서:</b> 분류 → 검출 → 분할 → Transformer 순으로. 각 단계가 이전 단계의 아이디어를 확장합니다.</div>
  <div class="section-label">1단계 — CNN 분류 기초</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2012</span><span class="model-name">AlexNet</span><span class="must-badge" style="background:#E1F5EE;color:#0F6E56">뼈대</span></div>
        <div class="desc">Krizhevsky et al. ImageNet을 처음 정복한 딥 CNN. ReLU, Dropout, GPU 학습을 도입. &#8220;딥러닝 르네상스&#8221;의 시작점.</div>
        <div class="key-idea"><b>핵심 개념:</b> ReLU 활성화, Dropout, GPU 병렬 학습, Data augmentation</div>
        <button class="ask-btn" onclick="sendPrompt('AlexNet이 이전 방법들과 무엇이 달랐는지, 각 혁신 요소를 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2015</span><span class="model-name">ResNet</span><span class="must-badge" style="background:#E1F5EE;color:#0F6E56">뼈대</span></div>
        <div class="desc">He et al. Residual block으로 152층까지 안정 학습. 현재까지도 CV 백본의 표준. ResNet-50/101은 수백 개 논문의 baseline.</div>
        <div class="key-idea"><b>핵심 개념:</b> Residual block, bottleneck, depth vs width tradeoff</div>
        <button class="ask-btn" onclick="sendPrompt('ResNet의 residual block 구조와 bottleneck 설계 이유를 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item">
      <div class="card">
        <div class="card-top"><span class="year-badge">2019</span><span class="model-name">EfficientNet</span></div>
        <div class="desc">Tan &#038; Le. 깊이·너비·해상도를 동시에 스케일하는 compound scaling. 같은 연산량에서 최고 정확도.</div>
        <div class="key-idea"><b>핵심 개념:</b> Compound scaling, NAS, MobileNet 계열</div>
        <button class="ask-btn" onclick="sendPrompt('EfficientNet의 compound scaling이 왜 기존 단순 스케일링보다 효율적인지 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
  <div class="section-label">2단계 — 객체 검출</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2015</span><span class="model-name">Faster R-CNN</span><span class="must-badge" style="background:#E1F5EE;color:#0F6E56">뼈대</span></div>
        <div class="desc">Ren et al. Region Proposal Network(RPN)으로 detection을 완전 end-to-end화. Two-stage detection의 표준 구조.</div>
        <div class="key-idea"><b>핵심 개념:</b> RPN, anchor box, RoI Pooling, two-stage pipeline</div>
        <button class="ask-btn" onclick="sendPrompt('Faster R-CNN의 RPN이 어떻게 작동하는지, anchor box 개념과 함께 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2016</span><span class="model-name">YOLO (v1~)</span><span class="must-badge" style="background:#E1F5EE;color:#0F6E56">뼈대</span></div>
        <div class="desc">Redmon et al. 이미지를 한 번에 처리하는 one-stage detection. 속도와 정확도의 트레이드오프를 이해하는 핵심 모델.</div>
        <div class="key-idea"><b>핵심 개념:</b> Grid cell, confidence score, one-stage vs two-stage</div>
        <button class="ask-btn" onclick="sendPrompt('YOLO v1의 grid cell 방식이 Faster R-CNN과 어떻게 다르고, 속도에서 왜 유리한지 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item">
      <div class="card">
        <div class="card-top"><span class="year-badge">2017</span><span class="model-name">FPN (Feature Pyramid Network)</span></div>
        <div class="desc">Lin et al. 다중 스케일 feature map을 계층적으로 결합. 작은 객체 검출 성능을 크게 향상. 거의 모든 최신 detector의 neck 구조.</div>
        <div class="key-idea"><b>핵심 개념:</b> Top-down pathway, lateral connection, multi-scale feature</div>
        <button class="ask-btn" onclick="sendPrompt('FPN이 다중 스케일 객체를 어떻게 처리하는지, top-down pathway 구조를 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
  <div class="section-label">3단계 — Vision Transformer</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2020</span><span class="model-name">ViT (Vision Transformer)</span><span class="must-badge" style="background:#E1F5EE;color:#0F6E56">뼈대</span></div>
        <div class="desc">Dosovitskiy et al. 이미지를 패치로 나눠 Transformer에 입력. &#8220;CNN 없이도 된다&#8221;는 것을 증명. 이후 CV Transformer의 원조.</div>
        <div class="key-idea"><b>핵심 개념:</b> Patch embedding, positional encoding, class token</div>
        <button class="ask-btn" onclick="sendPrompt('ViT가 이미지를 어떻게 패치로 처리하는지, CNN과의 귀납적 편향 차이를 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item">
      <div class="card">
        <div class="card-top"><span class="year-badge">2021</span><span class="model-name">Swin Transformer</span></div>
        <div class="desc">Liu et al. 계층적 구조 + shifted window attention으로 ViT의 고해상도 한계를 극복. 현재 CV Transformer 백본 표준.</div>
        <div class="key-idea"><b>핵심 개념:</b> Shifted window, hierarchical feature, linear complexity</div>
        <button class="ask-btn" onclick="sendPrompt('Swin Transformer의 shifted window attention이 ViT의 어떤 한계를 어떻게 해결했는지 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
</div>

<div id="nlp" class="domain" style="--dot-color:#7F77DD">
  <div class="tip-box"><b>NLP 공부 순서:</b> RNN의 한계 이해 → Attention 등장 배경 → Transformer → Pre-training 패러다임으로. 이 흐름이 &#8220;왜&#8221;를 설명합니다.</div>
  <div class="section-label">1단계 — 시퀀스 모델의 기원</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2014</span><span class="model-name">Seq2Seq + LSTM</span><span class="must-badge" style="background:#EEEDFE;color:#534AB7">뼈대</span></div>
        <div class="desc">Sutskever et al. 인코더-디코더 구조로 기계번역. LSTM이 왜 vanilla RNN보다 장기 의존성을 잘 처리하는지가 핵심.</div>
        <div class="key-idea"><b>핵심 개념:</b> LSTM gate (input/forget/output), hidden state, teacher forcing</div>
        <button class="ask-btn" onclick="sendPrompt('LSTM의 3가지 게이트가 각각 어떤 역할을 하는지, vanishing gradient와의 관계를 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2015</span><span class="model-name">Attention (Bahdanau)</span><span class="must-badge" style="background:#EEEDFE;color:#534AB7">뼈대</span></div>
        <div class="desc">Bahdanau et al. RNN의 bottleneck(context vector)을 깨는 attention. Transformer attention의 직접적 전신. 이 논문을 이해해야 Transformer가 왜 나왔는지 보인다.</div>
        <div class="key-idea"><b>핵심 개념:</b> Alignment score, soft attention, context vector per step</div>
        <button class="ask-btn" onclick="sendPrompt('Bahdanau attention이 seq2seq의 fixed context vector 문제를 어떻게 해결했는지 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
  <div class="section-label">2단계 — Transformer 시대</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2017</span><span class="model-name">Transformer</span><span class="must-badge" style="background:#EEEDFE;color:#534AB7">필수</span></div>
        <div class="desc">Vaswani et al. &#8220;Attention is All You Need&#8221;. 이 논문 하나가 NLP, CV, 음성, 이미지생성을 전부 바꿨다. 수식 하나하나를 직접 구현해보는 게 목표.</div>
        <div class="key-idea"><b>핵심 개념:</b> Multi-head attention, FFN, positional encoding, encoder-decoder</div>
        <button class="ask-btn" onclick="sendPrompt('Transformer 논문 Attention is All You Need의 핵심 구조를 encoder, decoder, attention 순서로 완전히 분석해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2018</span><span class="model-name">BERT</span><span class="must-badge" style="background:#EEEDFE;color:#534AB7">뼈대</span></div>
        <div class="desc">Devlin et al. (Google). Masked Language Model로 대규모 사전학습 후 fine-tuning. &#8220;Pre-train → Fine-tune&#8221; 패러다임의 정립.</div>
        <div class="key-idea"><b>핵심 개념:</b> MLM, NSP, bidirectional context, fine-tuning</div>
        <button class="ask-btn" onclick="sendPrompt('BERT의 Masked LM이 GPT의 causal LM과 어떻게 다르고, 각각 어떤 태스크에 유리한지 비교해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2018~</span><span class="model-name">GPT 시리즈</span><span class="must-badge" style="background:#EEEDFE;color:#534AB7">뼈대</span></div>
        <div class="desc">Radford et al. (OpenAI). Decoder-only, causal language modeling. GPT-1→2→3→4로 스케일이 곧 성능임을 증명. 현재 LLM의 주류 구조.</div>
        <div class="key-idea"><b>핵심 개념:</b> Causal masking, in-context learning, scaling law</div>
        <button class="ask-btn" onclick="sendPrompt('GPT 시리즈가 GPT-1부터 GPT-3까지 어떻게 발전했는지, scaling law 관점에서 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item">
      <div class="card">
        <div class="card-top"><span class="year-badge">2022</span><span class="model-name">InstructGPT / RLHF</span></div>
        <div class="desc">Ouyang et al. Reinforcement Learning from Human Feedback. 언어모델을 인간 의도에 align. ChatGPT의 직접 전신.</div>
        <div class="key-idea"><b>핵심 개념:</b> SFT, reward model, PPO, alignment</div>
        <button class="ask-btn" onclick="sendPrompt('RLHF가 무엇인지, SFT → Reward Model → PPO 세 단계를 순서대로 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
</div>

<div id="diffusion" class="domain" style="--dot-color:#D85A30">
  <div class="tip-box"><b>Diffusion 공부 순서:</b> VAE로 latent space 개념 → GAN으로 생성 학습 이해 → DDPM으로 diffusion 원리 → Stable Diffusion으로 실용화 흐름.</div>
  <div class="section-label">1단계 — 생성 모델 기초</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2013</span><span class="model-name">VAE (Variational Autoencoder)</span><span class="must-badge" style="background:#FAECE7;color:#993C1D">뼈대</span></div>
        <div class="desc">Kingma &#038; Welling. Encoder가 latent distribution을 출력하고 sampling으로 생성. ELBO, reparameterization trick이 핵심. Latent diffusion의 latent space 개념의 직접 전신.</div>
        <div class="key-idea"><b>핵심 개념:</b> ELBO, KL divergence, reparameterization trick, latent space</div>
        <button class="ask-btn" onclick="sendPrompt('VAE의 ELBO와 reparameterization trick을 수식과 함께 직관적으로 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2014</span><span class="model-name">GAN</span><span class="must-badge" style="background:#FAECE7;color:#993C1D">뼈대</span></div>
        <div class="desc">Goodfellow et al. Generator vs Discriminator의 minimax 게임. 이미지 생성 패러다임을 열었고, diffusion 이전까지 SOTA. 학습 불안정성이 왜 생기는지 이해 필수.</div>
        <div class="key-idea"><b>핵심 개념:</b> Minimax game, mode collapse, Wasserstein distance (WGAN)</div>
        <button class="ask-btn" onclick="sendPrompt('GAN의 학습 불안정성과 mode collapse 문제가 왜 생기는지, WGAN이 어떻게 해결했는지 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
  <div class="section-label">2단계 — Diffusion 본류</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2020</span><span class="model-name">DDPM</span><span class="must-badge" style="background:#FAECE7;color:#993C1D">필수</span></div>
        <div class="desc">Ho et al. Forward(노이즈 추가) → Reverse(노이즈 제거) 과정으로 이미지 생성. Diffusion의 수학적 기반. 이 논문의 수식을 이해하는 것이 이 분야 진입의 관문.</div>
        <div class="key-idea"><b>핵심 개념:</b> Forward/reverse process, noise schedule, ELBO 유도, epsilon prediction</div>
        <button class="ask-btn" onclick="sendPrompt('DDPM의 forward process와 reverse process를 수식과 함께 설명해줘. noise schedule이 왜 중요한지도.')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2021</span><span class="model-name">CLIP</span><span class="must-badge" style="background:#FAECE7;color:#993C1D">뼈대</span></div>
        <div class="desc">Radford et al. (OpenAI). 이미지-텍스트 쌍을 contrastive learning으로 학습. &#8220;텍스트로 이미지 검색/생성&#8221;의 기반. Stable Diffusion의 text encoder가 CLIP.</div>
        <div class="key-idea"><b>핵심 개념:</b> Contrastive learning, zero-shot transfer, image-text alignment</div>
        <button class="ask-btn" onclick="sendPrompt('CLIP이 contrastive learning으로 이미지-텍스트를 어떻게 정렬하는지, zero-shot 가능 이유와 함께 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2022</span><span class="model-name">Stable Diffusion (LDM)</span><span class="must-badge" style="background:#FAECE7;color:#993C1D">뼈대</span></div>
        <div class="desc">Rombach et al. VAE의 latent space에서 diffusion을 수행해 연산량을 획기적으로 절감. CLIP text encoder + U-Net denoiser + VAE 구조. 현재 이미지 생성 표준.</div>
        <div class="key-idea"><b>핵심 개념:</b> Latent diffusion, cross-attention for text conditioning, CFG</div>
        <button class="ask-btn" onclick="sendPrompt('Stable Diffusion(LDM)이 픽셀 공간 대신 latent 공간에서 diffusion을 하는 이유와 전체 구조를 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item">
      <div class="card">
        <div class="card-top"><span class="year-badge">2023</span><span class="model-name">DiT (Diffusion Transformer)</span></div>
        <div class="desc">Peebles &#038; Xie. U-Net 대신 Transformer를 denoiser로 사용. 스케일 법칙이 잘 적용됨. Sora 등 최신 video generation의 기반.</div>
        <div class="key-idea"><b>핵심 개념:</b> Patch-based latent, adaLN conditioning, scalable diffusion</div>
        <button class="ask-btn" onclick="sendPrompt('DiT가 기존 U-Net 기반 diffusion 대비 Transformer를 사용하는 장점과 구조를 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
</div>

<div id="ocr" class="domain" style="--dot-color:#BA7517">
  <div class="tip-box"><b>OCR 공부 순서:</b> CNN으로 feature 추출 → RNN/CTC로 시퀀스 인식 → Attention 기반 → Transformer 통합. OCR은 CV + NLP의 교차점입니다.</div>
  <div class="section-label">1단계 — 시퀀스 인식 기초</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2015</span><span class="model-name">CRNN + CTC</span><span class="must-badge" style="background:#FAEEDA;color:#854F0B">뼈대</span></div>
        <div class="desc">Shi et al. CNN(특징 추출) + RNN(시퀀스 모델링) + CTC(정렬 없는 학습). 문자 위치 어노테이션 없이 end-to-end 학습. OCR의 사실상 첫 딥러닝 표준.</div>
        <div class="key-idea"><b>핵심 개념:</b> CTC loss, blank token, 문자 정렬 문제, feature map to sequence</div>
        <button class="ask-btn" onclick="sendPrompt('CRNN의 CTC loss가 문자 위치 어노테이션 없이 어떻게 학습하는지 설명해줘. blank token 역할도 포함해서.')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
  <div class="section-label">2단계 — Attention 기반</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2016</span><span class="model-name">Attention OCR</span><span class="must-badge" style="background:#FAEEDA;color:#854F0B">뼈대</span></div>
        <div class="desc">Baek et al. 계열. Attention으로 어느 위치를 볼지 학습. CTC 대비 불규칙 레이아웃, 곡선 텍스트에 강함. STN(공간 변환 네트워크)과 조합되는 경우 많음.</div>
        <div class="key-idea"><b>핵심 개념:</b> Spatial attention, STN, irregular text recognition</div>
        <button class="ask-btn" onclick="sendPrompt('Attention 기반 OCR이 CTC 기반과 어떻게 다르고, 어떤 경우에 더 유리한지 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item">
      <div class="card">
        <div class="card-top"><span class="year-badge">2019</span><span class="model-name">CRAFT (텍스트 검출)</span></div>
        <div class="desc">Baek et al. 문자 단위 affinity로 텍스트 영역 검출. 곡선, 다방향 텍스트 검출에 강함. OCR 파이프라인의 검출(detection) 단계.</div>
        <div class="key-idea"><b>핵심 개념:</b> Character region score, affinity map, weakly supervised</div>
        <button class="ask-btn" onclick="sendPrompt('CRAFT의 character region score와 affinity map이 텍스트 검출에서 어떻게 작동하는지 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
  <div class="section-label">3단계 — Transformer 통합</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2021</span><span class="model-name">TrOCR</span><span class="must-badge" style="background:#FAEEDA;color:#854F0B">현대 표준</span></div>
        <div class="desc">Li et al. (Microsoft). ViT encoder + BART decoder. 사전학습된 Transformer를 OCR에 적용. 현재 문서 OCR 최고 성능 수준. Handwriting에도 강함.</div>
        <div class="key-idea"><b>핵심 개념:</b> Pre-trained ViT encoder, autoregressive decoding, transfer learning for OCR</div>
        <button class="ask-btn" onclick="sendPrompt('TrOCR이 ViT encoder와 BART decoder를 어떻게 조합해서 OCR을 수행하는지 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
</div>

<div id="speech-rec" class="domain" style="--dot-color:#1D9E75">
  <div class="tip-box"><b>음성 인식 공부 순서:</b> 음성 신호 기초(MFCC) → HMM-GMM 이해(딥러닝 왜 필요한지) → CTC 기반 → Attention → Whisper.</div>
  <div class="section-label">1단계 — 신호 처리 기초</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">기초</span><span class="model-name">MFCC / Spectrogram</span><span class="must-badge" style="background:#E1F5EE;color:#0F6E56">필수 개념</span></div>
        <div class="desc">모델이 아니지만 반드시 먼저 이해해야 하는 전처리. 음성 파형을 어떻게 주파수 표현으로 바꾸는지. 현재 mel spectrogram이 사실상 표준 입력 형식.</div>
        <div class="key-idea"><b>핵심 개념:</b> FFT, mel filterbank, MFCC, log mel spectrogram</div>
        <button class="ask-btn" onclick="sendPrompt('음성 인식에서 MFCC와 mel spectrogram이 무엇인지, 왜 raw waveform 대신 사용하는지 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
  <div class="section-label">2단계 — 딥러닝 ASR</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2014</span><span class="model-name">DeepSpeech (Baidu)</span><span class="must-badge" style="background:#E1F5EE;color:#0F6E56">뼈대</span></div>
        <div class="desc">Hannun et al. End-to-end 음성 인식의 선구자. RNN + CTC로 음소-문자 정렬 없이 학습. HMM 없이 딥러닝만으로 ASR 가능성을 증명.</div>
        <div class="key-idea"><b>핵심 개념:</b> End-to-end ASR, CTC loss, bidirectional RNN</div>
        <button class="ask-btn" onclick="sendPrompt('DeepSpeech가 기존 HMM-GMM 방식 대비 어떤 점이 혁신적이었는지 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2015</span><span class="model-name">Listen, Attend and Spell (LAS)</span><span class="must-badge" style="background:#E1F5EE;color:#0F6E56">뼈대</span></div>
        <div class="desc">Chan et al. Attention 기반 seq2seq ASR. 입력 음성의 어느 부분을 볼지 attention으로 결정. CTC의 조건부 독립 가정을 깸.</div>
        <div class="key-idea"><b>핵심 개념:</b> Listener encoder, speller decoder, content-based attention</div>
        <button class="ask-btn" onclick="sendPrompt('LAS의 Listen-Attend-Spell 구조가 DeepSpeech의 CTC 방식과 어떻게 다른지 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2020</span><span class="model-name">wav2vec 2.0</span><span class="must-badge" style="background:#E1F5EE;color:#0F6E56">뼈대</span></div>
        <div class="desc">Baevski et al. (Meta). 음성 자기지도학습(self-supervised). 대량의 레이블 없는 음성으로 사전학습 후 소량 레이블로 fine-tuning. ASR의 BERT.</div>
        <div class="key-idea"><b>핵심 개념:</b> Contrastive loss, quantized speech representations, self-supervised pretraining</div>
        <button class="ask-btn" onclick="sendPrompt('wav2vec 2.0의 self-supervised 학습 방식이 음성 인식에서 왜 중요한지 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2022</span><span class="model-name">Whisper</span><span class="must-badge" style="background:#E1F5EE;color:#0F6E56">현재 표준</span></div>
        <div class="desc">Radford et al. (OpenAI). 68만 시간 웹 데이터 대규모 학습. Encoder-decoder Transformer. 99개 언어 다국어, 번역 동시 지원. 현재 가장 널리 쓰이는 ASR.</div>
        <div class="key-idea"><b>핵심 개념:</b> Multitask training, log-mel input, timestamp prediction</div>
        <button class="ask-btn" onclick="sendPrompt('Whisper의 multitask training 방식과 대규모 weakly supervised 학습이 왜 효과적인지 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
</div>

<div id="speech-gen" class="domain" style="--dot-color:#D4537E">
  <div class="tip-box"><b>음성 생성 공부 순서:</b> Autoregressive(WaveNet) → non-autoregressive(FastSpeech) → Diffusion 기반(DiffWave) → 최신 대형 모델(VALL-E). 속도와 품질의 트레이드오프가 발전의 축입니다.</div>
  <div class="section-label">1단계 — Autoregressive TTS</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2016</span><span class="model-name">WaveNet</span><span class="must-badge" style="background:#FBEAF0;color:#993556">뼈대</span></div>
        <div class="desc">van den Oord et al. (DeepMind). Dilated causal convolution으로 고품질 음성 파형 생성. 처음으로 사람 수준 TTS 달성. 느리지만 품질의 기준을 세움.</div>
        <div class="key-idea"><b>핵심 개념:</b> Dilated causal conv, autoregressive waveform, μ-law encoding</div>
        <button class="ask-btn" onclick="sendPrompt('WaveNet의 dilated causal convolution이 음성 파형 생성에서 왜 효과적인지 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2018</span><span class="model-name">Tacotron 2</span><span class="must-badge" style="background:#FBEAF0;color:#993556">뼈대</span></div>
        <div class="desc">Wang et al. (Google). 텍스트 → mel spectrogram (seq2seq) + WaveNet vocoder 구조. 자연스러운 억양·리듬 학습. 현대 TTS 2단계 파이프라인의 표준.</div>
        <div class="key-idea"><b>핵심 개념:</b> Location-sensitive attention, stop token, mel 2단계 구조</div>
        <button class="ask-btn" onclick="sendPrompt('Tacotron 2의 텍스트→mel→waveform 2단계 구조와 location-sensitive attention을 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
  <div class="section-label">2단계 — Non-autoregressive / 빠른 생성</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2020</span><span class="model-name">FastSpeech 2</span><span class="must-badge" style="background:#FBEAF0;color:#993556">뼈대</span></div>
        <div class="desc">Ren et al. (Microsoft). 병렬 생성으로 Tacotron 대비 수십 배 빠름. Duration, pitch, energy predictor로 운율 명시적 제어. 실용적 TTS의 기준.</div>
        <div class="key-idea"><b>핵심 개념:</b> Non-autoregressive, duration predictor, pitch/energy control</div>
        <button class="ask-btn" onclick="sendPrompt('FastSpeech 2가 non-autoregressive 방식으로 어떻게 속도를 높이면서 품질을 유지하는지 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
    <div class="item">
      <div class="card">
        <div class="card-top"><span class="year-badge">2021</span><span class="model-name">VITS</span></div>
        <div class="desc">Kim et al. Variational Inference + GAN + flow 결합. 텍스트 → waveform 1단계 end-to-end. 고품질 + 실시간 속도 달성.</div>
        <div class="key-idea"><b>핵심 개념:</b> Normalizing flow, GAN discriminator, end-to-end TTS</div>
        <button class="ask-btn" onclick="sendPrompt('VITS가 기존 2단계 TTS 파이프라인을 어떻게 1단계로 통합했는지 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
  <div class="section-label">3단계 — 대형 모델 / 음성 복제</div>
  <div class="timeline">
    <div class="item key">
      <div class="card key">
        <div class="card-top"><span class="year-badge">2023</span><span class="model-name">VALL-E</span><span class="must-badge" style="background:#FBEAF0;color:#993556">최신 패러다임</span></div>
        <div class="desc">Wang et al. (Microsoft). 3초 음성 샘플만으로 화자 음성 복제. 언어모델처럼 audio codec token을 예측. 음성 생성의 GPT-3 모멘트.</div>
        <div class="key-idea"><b>핵심 개념:</b> Neural audio codec, in-context learning for speech, zero-shot voice cloning</div>
        <button class="ask-btn" onclick="sendPrompt('VALL-E가 3초 음성으로 zero-shot voice cloning을 어떻게 달성하는지, audio codec token 방식을 설명해줘')">자세히 물어보기 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
      </div>
    </div>
  </div>
</div>

<script>
// 탭 전환 로직
document.getElementById('tabs').addEventListener('click',function(e){
  const btn=e.target.closest('.tab');
  if(!btn)return;
  document.querySelectorAll('.tab').forEach(t=>t.classList.remove('active'));
  document.querySelectorAll('.domain').forEach(d=>d.classList.remove('active'));
  btn.classList.add('active');
  document.getElementById(btn.dataset.domain).classList.add('active');
});

// sendPrompt 함수: 문자열을 클립보드에 저장
function sendPrompt(text) {
  navigator.clipboard.writeText(text).then(() => {
    alert("프롬프트가 클립보드에 복사되었습니다.");
  }).catch(err => {
    console.error('클립보드 복사 실패:', err);
  });
}
</script>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kggstudio.com/ai-paper/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">500</post-id>	</item>
		<item>
		<title>CV (5) &#8211; Segmentation</title>
		<link>https://blog.kggstudio.com/cv-5-segmentation/</link>
					<comments>https://blog.kggstudio.com/cv-5-segmentation/#respond</comments>
		
		<dc:creator><![CDATA[TimTam]]></dc:creator>
		<pubDate>Mon, 20 Apr 2026 23:46:50 +0000</pubDate>
				<category><![CDATA[CV]]></category>
		<category><![CDATA[Dev]]></category>
		<category><![CDATA[cv segmentatino]]></category>
		<category><![CDATA[segmentation]]></category>
		<guid isPermaLink="false">https://blog.kggstudio.com/?p=496</guid>

					<description><![CDATA[Segmentation에는 두 종류가 있다 Class Segmentation Semantic Segmentation 주요 모델 요약 및 Instance Segmentation 추천 모델 Semantic Seg. FCN (Fully Convolutional Network) 2015 · Long et al. (UC Berkeley) Conv Layers Pooling ×5 FC→Conv 1×1 conv Bilinear Upsample ×32 Segmentation 픽셀 단위 분류를 위해 FC layer를 1×1 conv로 대체한 최초의 end-to-end segmentation 네트워크. 스킵 연결(FCN-8s/16s/32s)로 ... <a title="CV (5) &#8211; Segmentation" class="read-more" href="https://blog.kggstudio.com/cv-5-segmentation/" aria-label="CV (5) &#8211; Segmentation에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Segmentation에는 두 종류가 있다</p>



<ul class="wp-block-list">
<li>Semantic Segmentation: 이미지에서, 사람, 자전거, 동물 등 class <strong>분류 </strong>만 하는것.</li>



<li>Instance Segmentation: 이미지에서 사람, 자전거, 동물을 분류하는것 뿐만아니라, 사람마다, 자전거마다, 동물마다 서로 다른 <strong>Instance</strong>인지 아닌지를 구분하는것</li>
</ul>



<h2 class="wp-block-heading">Class Segmentation</h2>




<style>
  .model-card { background: var(--color-background-primary); border: 0.5px solid var(--color-border-tertiary); border-radius: var(--border-radius-lg); padding: 1.25rem; margin-bottom: 1rem; }
  .model-header { display: flex; align-items: center; gap: 12px; margin-bottom: 1rem; }
  .model-badge { font-size: 11px; font-weight: 500; padding: 3px 10px; border-radius: 99px; white-space: nowrap; }
  .badge-blue { background: #E6F1FB; color: #0C447C; }
  .badge-teal { background: #E1F5EE; color: #085041; }
  .badge-amber { background: #FAEEDA; color: #633806; }
  .badge-purple { background: #EEEDFE; color: #3C3489; }
  .badge-coral { background: #FAECE7; color: #712B13; }
  .badge-green { background: #EAF3DE; color: #27500A; }
  @media (prefers-color-scheme: dark) {
    .badge-blue { background: #0C447C; color: #B5D4F4; }
    .badge-teal { background: #085041; color: #9FE1CB; }
    .badge-amber { background: #633806; color: #FAC775; }
    .badge-purple { background: #3C3489; color: #CECBF6; }
    .badge-coral { background: #712B13; color: #F5C4B3; }
    .badge-green { background: #27500A; color: #C0DD97; }
  }
  .model-name { font-size: 17px; font-weight: 500; color: var(--color-text-primary); }
  .model-year { font-size: 12px; color: var(--color-text-tertiary); }
  .arch-diagram { width: 100%; overflow: hidden; margin: 0.75rem 0; }
  .detail-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-top: 0.75rem; }
  .detail-item { background: var(--color-background-secondary); border-radius: var(--border-radius-md); padding: 0.6rem 0.75rem; }
  .detail-label { font-size: 11px; color: var(--color-text-tertiary); margin-bottom: 2px; }
  .detail-value { font-size: 13px; color: var(--color-text-primary); line-height: 1.4; }
  .pros-cons { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-top: 8px; }
  .pro-box { background: #EAF3DE; border-radius: var(--border-radius-md); padding: 0.5rem 0.75rem; font-size: 12px; color: #27500A; }
  .con-box { background: #FCEBEB; border-radius: var(--border-radius-md); padding: 0.5rem 0.75rem; font-size: 12px; color: #791F1F; }
  @media (prefers-color-scheme: dark) {
    .pro-box { background: #173404; color: #C0DD97; }
    .con-box { background: #501313; color: #F7C1C1; }
  }
  .pro-box b, .con-box b { display: block; font-weight: 500; margin-bottom: 2px; }
  .section-title { font-size: 13px; font-weight: 500; color: var(--color-text-secondary); margin: 0.4rem 0 0.2rem; }
  .desc { font-size: 13px; color: var(--color-text-secondary); line-height: 1.6; }
  .instance-card { background: var(--color-background-primary); border: 2px solid #B5D4F4; border-radius: var(--border-radius-lg); padding: 1.25rem; margin-bottom: 0.75rem; }
  @media (prefers-color-scheme: dark) { .instance-card { border-color: #185FA5; } }
  .recommend-badge { display: inline-block; font-size: 11px; font-weight: 500; padding: 2px 10px; border-radius: 99px; background: #E6F1FB; color: #185FA5; margin-left: 8px; }
  @media (prefers-color-scheme: dark) { .recommend-badge { background: #0C447C; color: #85B7EB; } }
  h2.sec { font-size: 15px; font-weight: 500; color: var(--color-text-primary); margin: 1.5rem 0 0.75rem; padding-bottom: 6px; border-bottom: 0.5px solid var(--color-border-tertiary); }
</style>

<h2 class="sr-only" style="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)">Semantic Segmentation 주요 모델 요약 및 Instance Segmentation 추천 모델</h2>

<!-- FCN -->
<div class="model-card">
  <div class="model-header">
    <span class="model-badge badge-blue">Semantic Seg.</span>
    <div>
      <div class="model-name">FCN <span style="font-size:13px;font-weight:400;color:var(--color-text-tertiary)">(Fully Convolutional Network)</span></div>
      <div class="model-year">2015 · Long et al. (UC Berkeley)</div>
    </div>
  </div>
  <svg viewBox="0 0 640 60" width="100%" class="arch-diagram">
    <defs><marker id="a1" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="5" markerHeight="5" orient="auto-start-reverse"><path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></marker></defs>
    <rect x="10" y="12" width="90" height="36" rx="6" fill="#E6F1FB" stroke="#378ADD" stroke-width="0.5"/>
    <text x="55" y="34" text-anchor="middle" font-size="11" fill="#0C447C" font-family="sans-serif" dominant-baseline="central">Conv Layers</text>
    <line x1="100" y1="30" x2="128" y2="30" stroke="#73726c" stroke-width="1" marker-end="url(#a1)"/>
    <rect x="130" y="12" width="90" height="36" rx="6" fill="#E6F1FB" stroke="#378ADD" stroke-width="0.5"/>
    <text x="175" y="34" text-anchor="middle" font-size="11" fill="#0C447C" font-family="sans-serif" dominant-baseline="central">Pooling ×5</text>
    <line x1="220" y1="30" x2="248" y2="30" stroke="#73726c" stroke-width="1" marker-end="url(#a1)"/>
    <rect x="250" y="4" width="80" height="52" rx="6" fill="#EEEDFE" stroke="#7F77DD" stroke-width="0.5"/>
    <text x="290" y="26" text-anchor="middle" font-size="10" fill="#3C3489" font-family="sans-serif" dominant-baseline="central">FC→Conv</text>
    <text x="290" y="42" text-anchor="middle" font-size="10" fill="#3C3489" font-family="sans-serif" dominant-baseline="central">1×1 conv</text>
    <line x1="330" y1="30" x2="358" y2="30" stroke="#73726c" stroke-width="1" marker-end="url(#a1)"/>
    <rect x="360" y="4" width="100" height="52" rx="6" fill="#E1F5EE" stroke="#1D9E75" stroke-width="0.5"/>
    <text x="410" y="26" text-anchor="middle" font-size="10" fill="#085041" font-family="sans-serif" dominant-baseline="central">Bilinear</text>
    <text x="410" y="42" text-anchor="middle" font-size="10" fill="#085041" font-family="sans-serif" dominant-baseline="central">Upsample ×32</text>
    <line x1="460" y1="30" x2="488" y2="30" stroke="#73726c" stroke-width="1" marker-end="url(#a1)"/>
    <rect x="490" y="12" width="90" height="36" rx="6" fill="#EAF3DE" stroke="#639922" stroke-width="0.5"/>
    <text x="535" y="34" text-anchor="middle" font-size="11" fill="#27500A" font-family="sans-serif" dominant-baseline="central">Segmentation</text>
  </svg>
  <p class="desc">픽셀 단위 분류를 위해 FC layer를 1×1 conv로 대체한 최초의 end-to-end segmentation 네트워크. 스킵 연결(FCN-8s/16s/32s)로 coarse feature를 보완했으나 업샘플링이 단순해 경계 품질이 낮음.</p>
  <div class="detail-grid">
    <div class="detail-item"><div class="detail-label">핵심 아이디어</div><div class="detail-value">FC layer 제거 → 임의 해상도 입력 가능</div></div>
    <div class="detail-item"><div class="detail-label">업샘플링</div><div class="detail-value">Bilinear upsample (×32/16/8)</div></div>
    <div class="detail-item"><div class="detail-label">백본</div><div class="detail-value">VGG-16 (기본)</div></div>
    <div class="detail-item"><div class="detail-label">주요 한계</div><div class="detail-value">경계 불선명, 공간 정보 손실</div></div>
  </div>
  <div class="pros-cons">
    <div class="pro-box"><b>장점</b>End-to-end 학습 가능, 구조 단순</div>
    <div class="con-box"><b>단점</b>경계선 품질 낮음, 해상도 복원 부정확</div>
  </div>
</div>

<!-- SegNet -->
<div class="model-card">
  <div class="model-header">
    <span class="model-badge badge-teal">Semantic Seg.</span>
    <div>
      <div class="model-name">SegNet</div>
      <div class="model-year">2017 · Badrinarayanan et al. (Cambridge)</div>
    </div>
  </div>
  <svg viewBox="0 0 640 70" width="100%" class="arch-diagram">
    <defs><marker id="a2" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="5" markerHeight="5" orient="auto-start-reverse"><path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></marker></defs>
    <!-- Encoder -->
    <rect x="10" y="17" width="200" height="36" rx="6" fill="#E1F5EE" stroke="#1D9E75" stroke-width="0.5"/>
    <text x="110" y="31" text-anchor="middle" font-size="11" fill="#085041" font-family="sans-serif" dominant-baseline="central">Encoder (VGG blocks)</text>
    <text x="110" y="45" text-anchor="middle" font-size="10" fill="#085041" font-family="sans-serif" dominant-baseline="central">MaxPool → 저장 indices</text>
    <!-- Arrow -->
    <line x1="210" y1="35" x2="238" y2="35" stroke="#73726c" stroke-width="1" marker-end="url(#a2)"/>
    <!-- Bottleneck -->
    <rect x="240" y="9" width="80" height="52" rx="6" fill="#EEEDFE" stroke="#7F77DD" stroke-width="0.5"/>
    <text x="280" y="31" text-anchor="middle" font-size="10" fill="#3C3489" font-family="sans-serif" dominant-baseline="central">Feature</text>
    <text x="280" y="45" text-anchor="middle" font-size="10" fill="#3C3489" font-family="sans-serif" dominant-baseline="central">Map</text>
    <!-- Arrow -->
    <line x1="320" y1="35" x2="348" y2="35" stroke="#73726c" stroke-width="1" marker-end="url(#a2)"/>
    <!-- Decoder -->
    <rect x="350" y="17" width="220" height="36" rx="6" fill="#FAEEDA" stroke="#BA7517" stroke-width="0.5"/>
    <text x="460" y="31" text-anchor="middle" font-size="11" fill="#633806" font-family="sans-serif" dominant-baseline="central">Decoder</text>
    <text x="460" y="45" text-anchor="middle" font-size="10" fill="#633806" font-family="sans-serif" dominant-baseline="central">MaxUnpool (saved indices) → Conv</text>
  </svg>
  <p class="desc">인코더-디코더 대칭 구조. Max pooling 시 위치 인덱스(pooling indices)를 저장해 디코더에서 정확한 위치로 업샘플링. 추가 파라미터 없이 skip connection 효과를 냄.</p>
  <div class="detail-grid">
    <div class="detail-item"><div class="detail-label">핵심 아이디어</div><div class="detail-value">Pooling indices 저장 → 정밀 업샘플링</div></div>
    <div class="detail-item"><div class="detail-label">구조</div><div class="detail-value">대칭 인코더-디코더 (VGG 기반)</div></div>
    <div class="detail-item"><div class="detail-label">메모리</div><div class="detail-value">U-Net 대비 낮음 (feature 전달 X)</div></div>
    <div class="detail-item"><div class="detail-label">적합 분야</div><div class="detail-value">도로 장면, 실시간에 가까운 용도</div></div>
  </div>
  <div class="pros-cons">
    <div class="pro-box"><b>장점</b>메모리 효율, 경계 복원 개선</div>
    <div class="con-box"><b>단점</b>U-Net 대비 세밀한 정보 손실 가능</div>
  </div>
</div>

<!-- U-Net -->
<div class="model-card">
  <div class="model-header">
    <span class="model-badge badge-amber">Semantic Seg.</span>
    <div>
      <div class="model-name">U-Net</div>
      <div class="model-year">2015 · Ronneberger et al. (U Freiburg)</div>
    </div>
  </div>
  <svg viewBox="0 0 640 90" width="100%" class="arch-diagram">
    <defs><marker id="a3" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="5" markerHeight="5" orient="auto-start-reverse"><path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></marker></defs>
    <!-- Encoder blocks -->
    <rect x="10" y="10" width="80" height="28" rx="5" fill="#FAEEDA" stroke="#BA7517" stroke-width="0.5"/>
    <text x="50" y="28" text-anchor="middle" font-size="10" fill="#633806" font-family="sans-serif" dominant-baseline="central">Enc-1 (64ch)</text>
    <rect x="10" y="50" width="80" height="28" rx="5" fill="#FAEEDA" stroke="#BA7517" stroke-width="0.5"/>
    <text x="50" y="68" text-anchor="middle" font-size="10" fill="#633806" font-family="sans-serif" dominant-baseline="central">Enc-2 (128)</text>
    <!-- Bottleneck -->
    <rect x="270" y="30" width="100" height="30" rx="6" fill="#EEEDFE" stroke="#7F77DD" stroke-width="0.5"/>
    <text x="320" y="48" text-anchor="middle" font-size="10" fill="#3C3489" font-family="sans-serif" dominant-baseline="central">Bottleneck</text>
    <!-- Decoder blocks -->
    <rect x="550" y="10" width="80" height="28" rx="5" fill="#E1F5EE" stroke="#1D9E75" stroke-width="0.5"/>
    <text x="590" y="28" text-anchor="middle" font-size="10" fill="#085041" font-family="sans-serif" dominant-baseline="central">Dec-1 (64ch)</text>
    <rect x="550" y="50" width="80" height="28" rx="5" fill="#E1F5EE" stroke="#1D9E75" stroke-width="0.5"/>
    <text x="590" y="68" text-anchor="middle" font-size="10" fill="#085041" font-family="sans-serif" dominant-baseline="central">Dec-2 (128)</text>
    <!-- Skip connections (dashed) -->
    <path d="M90 24 Q320 6 550 24" fill="none" stroke="#EF9F27" stroke-width="1.5" stroke-dasharray="5 3"/>
    <path d="M90 64 Q320 80 550 64" fill="none" stroke="#EF9F27" stroke-width="1.5" stroke-dasharray="5 3"/>
    <!-- arrows enc to bottleneck -->
    <line x1="150" y1="24" x2="268" y2="40" stroke="#73726c" stroke-width="0.8" marker-end="url(#a3)"/>
    <line x1="150" y1="64" x2="268" y2="52" stroke="#73726c" stroke-width="0.8" marker-end="url(#a3)"/>
    <!-- arrows bottleneck to dec -->
    <line x1="370" y1="40" x2="548" y2="24" stroke="#73726c" stroke-width="0.8" marker-end="url(#a3)"/>
    <line x1="370" y1="52" x2="548" y2="64" stroke="#73726c" stroke-width="0.8" marker-end="url(#a3)"/>
    <!-- legend -->
    <line x1="250" y1="82" x2="274" y2="82" stroke="#EF9F27" stroke-width="1.5" stroke-dasharray="5 3"/>
    <text x="278" y="86" font-size="10" fill="#73726c" font-family="sans-serif" dominant-baseline="central">skip connection (feature concat)</text>
  </svg>
  <p class="desc">의료 영상용으로 개발된 인코더-디코더 구조. 인코더의 feature map을 디코더에 직접 연결(concatenation)하는 skip connection으로 공간 정보와 의미 정보를 동시에 보존. 소량 데이터에서도 강력한 성능.</p>
  <div class="detail-grid">
    <div class="detail-item"><div class="detail-label">핵심 아이디어</div><div class="detail-value">Feature map concat skip connection</div></div>
    <div class="detail-item"><div class="detail-label">강점</div><div class="detail-value">소량 데이터, 의료/위성 영상</div></div>
    <div class="detail-item"><div class="detail-label">변형</div><div class="detail-value">U-Net++, Attention U-Net, TransUNet</div></div>
    <div class="detail-item"><div class="detail-label">메모리</div><div class="detail-value">SegNet 대비 높음 (feature 전달)</div></div>
  </div>
  <div class="pros-cons">
    <div class="pro-box"><b>장점</b>경계 정밀, 소량 학습 데이터 OK, 확장 용이</div>
    <div class="con-box"><b>단점</b>메모리 사용량 높음</div>
  </div>
</div>

<!-- DeepLab -->
<div class="model-card">
  <div class="model-header">
    <span class="model-badge badge-purple">Semantic Seg.</span>
    <div>
      <div class="model-name">DeepLab <span style="font-size:13px;font-weight:400;color:var(--color-text-tertiary)">(v1→v2→v3→v3+)</span></div>
      <div class="model-year">2015–2018 · Chen et al. (Google)</div>
    </div>
  </div>
  <svg viewBox="0 0 640 72" width="100%" class="arch-diagram">
    <defs><marker id="a4" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="5" markerHeight="5" orient="auto-start-reverse"><path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></marker></defs>
    <!-- Backbone -->
    <rect x="10" y="18" width="90" height="36" rx="6" fill="#EEEDFE" stroke="#7F77DD" stroke-width="0.5"/>
    <text x="55" y="36" text-anchor="middle" font-size="10" fill="#3C3489" font-family="sans-serif" dominant-baseline="central">Backbone</text>
    <text x="55" y="48" text-anchor="middle" font-size="10" fill="#3C3489" font-family="sans-serif" dominant-baseline="central">(ResNet/Xception)</text>
    <line x1="100" y1="36" x2="128" y2="36" stroke="#73726c" stroke-width="1" marker-end="url(#a4)"/>
    <!-- ASPP -->
    <rect x="130" y="4" width="200" height="64" rx="6" fill="#FAECE7" stroke="#D85A30" stroke-width="0.5"/>
    <text x="230" y="20" text-anchor="middle" font-size="11" fill="#712B13" font-family="sans-serif" dominant-baseline="central" font-weight="500">ASPP</text>
    <text x="150" y="38" font-size="9" fill="#993C1D" font-family="sans-serif" dominant-baseline="central">rate=6</text>
    <text x="192" y="38" font-size="9" fill="#993C1D" font-family="sans-serif" dominant-baseline="central">rate=12</text>
    <text x="238" y="38" font-size="9" fill="#993C1D" font-family="sans-serif" dominant-baseline="central">rate=18</text>
    <text x="290" y="38" font-size="9" fill="#993C1D" font-family="sans-serif" dominant-baseline="central">1×1</text>
    <text x="230" y="56" text-anchor="middle" font-size="9" fill="#712B13" font-family="sans-serif" dominant-baseline="central">병렬 Dilated Conv</text>
    <line x1="330" y1="36" x2="358" y2="36" stroke="#73726c" stroke-width="1" marker-end="url(#a4)"/>
    <!-- CRF / Decoder -->
    <rect x="360" y="12" width="120" height="48" rx="6" fill="#E1F5EE" stroke="#1D9E75" stroke-width="0.5"/>
    <text x="420" y="30" text-anchor="middle" font-size="10" fill="#085041" font-family="sans-serif" dominant-baseline="central">Decoder</text>
    <text x="420" y="46" text-anchor="middle" font-size="9" fill="#085041" font-family="sans-serif" dominant-baseline="central">(+ CRF / Low-level feat)</text>
    <line x1="480" y1="36" x2="508" y2="36" stroke="#73726c" stroke-width="1" marker-end="url(#a4)"/>
    <rect x="510" y="18" width="90" height="36" rx="6" fill="#EAF3DE" stroke="#639922" stroke-width="0.5"/>
    <text x="555" y="36" text-anchor="middle" font-size="10" fill="#27500A" font-family="sans-serif" dominant-baseline="central">Segmentation</text>
  </svg>
  <p class="desc">Atrous(Dilated) Convolution으로 receptive field를 넓히면서 해상도를 유지하는 것이 핵심. ASPP(Atrous Spatial Pyramid Pooling)로 다양한 스케일의 문맥 정보를 동시에 포착. v3+에서 인코더-디코더 구조와 결합해 경계 정밀도 향상.</p>
  <div class="detail-grid">
    <div class="detail-item"><div class="detail-label">핵심 기술</div><div class="detail-value">Dilated Conv + ASPP 멀티스케일</div></div>
    <div class="detail-item"><div class="detail-label">버전별 발전</div><div class="detail-value">v1(CRF) → v2(ASPP) → v3(개선ASPP) → v3+(디코더)</div></div>
    <div class="detail-item"><div class="detail-label">백본</div><div class="detail-value">ResNet-101, Xception</div></div>
    <div class="detail-item"><div class="detail-label">강점</div><div class="detail-value">멀티스케일 의미 이해, 높은 mIoU</div></div>
  </div>
  <div class="pros-cons">
    <div class="pro-box"><b>장점</b>SOTA급 의미론 이해, 다양한 스케일 처리</div>
    <div class="con-box"><b>단점</b>연산량 큼, 실시간 어려움</div>
  </div>
</div>

<!-- Comparison table -->
<h2 class="sec">모델 한눈에 비교</h2>
<div style="overflow-x:auto">
<table style="width:100%;font-size:12px;border-collapse:collapse;">
  <thead>
    <tr style="background:var(--color-background-secondary);">
      <th style="padding:8px 10px;text-align:left;font-weight:500;border-bottom:0.5px solid var(--color-border-tertiary);">모델</th>
      <th style="padding:8px 10px;text-align:left;font-weight:500;border-bottom:0.5px solid var(--color-border-tertiary);">업샘플링 방식</th>
      <th style="padding:8px 10px;text-align:left;font-weight:500;border-bottom:0.5px solid var(--color-border-tertiary);">멀티스케일</th>
      <th style="padding:8px 10px;text-align:left;font-weight:500;border-bottom:0.5px solid var(--color-border-tertiary);">속도</th>
      <th style="padding:8px 10px;text-align:left;font-weight:500;border-bottom:0.5px solid var(--color-border-tertiary);">주요 강점</th>
    </tr>
  </thead>
  <tbody>
    <tr style="border-bottom:0.5px solid var(--color-border-tertiary);">
      <td style="padding:8px 10px;font-weight:500;color:#185FA5">FCN</td>
      <td style="padding:8px 10px;color:var(--color-text-secondary)">Bilinear (×32)</td>
      <td style="padding:8px 10px;color:var(--color-text-secondary)">Skip (낮음)</td>
      <td style="padding:8px 10px;color:var(--color-text-secondary)">빠름</td>
      <td style="padding:8px 10px;color:var(--color-text-secondary)">단순함, 선구자</td>
    </tr>
    <tr style="border-bottom:0.5px solid var(--color-border-tertiary);background:var(--color-background-secondary);">
      <td style="padding:8px 10px;font-weight:500;color:#0F6E56">SegNet</td>
      <td style="padding:8px 10px;color:var(--color-text-secondary)">MaxUnpool (indices)</td>
      <td style="padding:8px 10px;color:var(--color-text-secondary)">없음</td>
      <td style="padding:8px 10px;color:var(--color-text-secondary)">빠름</td>
      <td style="padding:8px 10px;color:var(--color-text-secondary)">메모리 효율</td>
    </tr>
    <tr style="border-bottom:0.5px solid var(--color-border-tertiary);">
      <td style="padding:8px 10px;font-weight:500;color:#854F0B">U-Net</td>
      <td style="padding:8px 10px;color:var(--color-text-secondary)">Transposed Conv</td>
      <td style="padding:8px 10px;color:var(--color-text-secondary)">Skip concat</td>
      <td style="padding:8px 10px;color:var(--color-text-secondary)">중간</td>
      <td style="padding:8px 10px;color:var(--color-text-secondary)">소량 데이터, 경계 정밀</td>
    </tr>
    <tr style="background:var(--color-background-secondary);">
      <td style="padding:8px 10px;font-weight:500;color:#534AB7">DeepLab v3+</td>
      <td style="padding:8px 10px;color:var(--color-text-secondary)">Dilated + Decoder</td>
      <td style="padding:8px 10px;color:var(--color-text-secondary)">ASPP (강함)</td>
      <td style="padding:8px 10px;color:var(--color-text-secondary)">느림</td>
      <td style="padding:8px 10px;color:var(--color-text-secondary)">최고 수준 의미 이해</td>
    </tr>
  </tbody>
</table>
</div>





<h2 class="wp-block-heading">Instance Segmentation</h2>



<style>
  .model-card { background: var(--color-background-primary); border: 0.5px solid var(--color-border-tertiary); border-radius: var(--border-radius-lg); padding: 1.25rem; margin-bottom: 1rem; }
  .model-header { display: flex; align-items: center; gap: 12px; margin-bottom: 1rem; }
  .model-badge { font-size: 11px; font-weight: 500; padding: 3px 10px; border-radius: 99px; white-space: nowrap; }
  .badge-blue { background: #E6F1FB; color: #0C447C; }
  .badge-teal { background: #E1F5EE; color: #085041; }
  .badge-amber { background: #FAEEDA; color: #633806; }
  .badge-purple { background: #EEEDFE; color: #3C3489; }
  .badge-coral { background: #FAECE7; color: #712B13; }
  .badge-green { background: #EAF3DE; color: #27500A; }
  @media (prefers-color-scheme: dark) {
    .badge-blue { background: #0C447C; color: #B5D4F4; }
    .badge-teal { background: #085041; color: #9FE1CB; }
    .badge-amber { background: #633806; color: #FAC775; }
    .badge-purple { background: #3C3489; color: #CECBF6; }
    .badge-coral { background: #712B13; color: #F5C4B3; }
    .badge-green { background: #27500A; color: #C0DD97; }
  }
  .model-name { font-size: 17px; font-weight: 500; color: var(--color-text-primary); }
  .model-year { font-size: 12px; color: var(--color-text-tertiary); }
  .arch-diagram { width: 100%; overflow: hidden; margin: 0.75rem 0; }
  .detail-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-top: 0.75rem; }
  .detail-item { background: var(--color-background-secondary); border-radius: var(--border-radius-md); padding: 0.6rem 0.75rem; }
  .detail-label { font-size: 11px; color: var(--color-text-tertiary); margin-bottom: 2px; }
  .detail-value { font-size: 13px; color: var(--color-text-primary); line-height: 1.4; }
  .pros-cons { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-top: 8px; }
  .pro-box { background: #EAF3DE; border-radius: var(--border-radius-md); padding: 0.5rem 0.75rem; font-size: 12px; color: #27500A; }
  .con-box { background: #FCEBEB; border-radius: var(--border-radius-md); padding: 0.5rem 0.75rem; font-size: 12px; color: #791F1F; }
  @media (prefers-color-scheme: dark) {
    .pro-box { background: #173404; color: #C0DD97; }
    .con-box { background: #501313; color: #F7C1C1; }
  }
  .pro-box b, .con-box b { display: block; font-weight: 500; margin-bottom: 2px; }
  .section-title { font-size: 13px; font-weight: 500; color: var(--color-text-secondary); margin: 0.4rem 0 0.2rem; }
  .desc { font-size: 13px; color: var(--color-text-secondary); line-height: 1.6; }
  .instance-card { background: var(--color-background-primary); border: 2px solid #B5D4F4; border-radius: var(--border-radius-lg); padding: 1.25rem; margin-bottom: 0.75rem; }
  @media (prefers-color-scheme: dark) { .instance-card { border-color: #185FA5; } }
  .recommend-badge { display: inline-block; font-size: 11px; font-weight: 500; padding: 2px 10px; border-radius: 99px; background: #E6F1FB; color: #185FA5; margin-left: 8px; }
  @media (prefers-color-scheme: dark) { .recommend-badge { background: #0C447C; color: #85B7EB; } }
  h2.sec { font-size: 15px; font-weight: 500; color: var(--color-text-primary); margin: 1.5rem 0 0.75rem; padding-bottom: 6px; border-bottom: 0.5px solid var(--color-border-tertiary); }
</style>
<!-- Instance Segmentation -->
<h2 class="sec">Instance Segmentation — 현재 많이 쓰는 모델</h2>

<div class="instance-card">
  <div class="model-header">
    <span class="model-badge badge-coral">Instance Seg.</span>
    <div>
      <div class="model-name">Mask R-CNN <span class="recommend-badge">산업 표준</span></div>
      <div class="model-year">2017 · He et al. (Meta AI / FAIR)</div>
    </div>
  </div>
  <p class="desc">Faster R-CNN + Mask Branch를 추가한 two-stage 모델. RoIAlign으로 경계 정합 문제를 해결. Detectron2 등 많은 프레임워크의 기반. 정확도 높고 생태계 성숙.</p>
  <div class="detail-grid">
    <div class="detail-item"><div class="detail-label">구조</div><div class="detail-value">Two-stage (RPN → RoIAlign → Mask head)</div></div>
    <div class="detail-item"><div class="detail-label">추천 용도</div><div class="detail-value">연구 베이스라인, 정밀도 우선 프로젝트</div></div>
  </div>
</div>

<div class="instance-card">
  <div class="model-header">
    <span class="model-badge badge-green">Instance Seg.</span>
    <div>
      <div class="model-name">YOLOv8-seg / YOLO11-seg <span class="recommend-badge">실시간 1순위</span></div>
      <div class="model-year">2023–2024 · Ultralytics</div>
    </div>
  </div>
  <p class="desc">One-stage 실시간 instance segmentation. 산업 현장, 엣지 디바이스, 빠른 프로토타이핑에 가장 많이 선택됨. API가 직관적이고 export(ONNX, TensorRT 등)가 쉬워 배포 친화적.</p>
  <div class="detail-grid">
    <div class="detail-item"><div class="detail-label">구조</div><div class="detail-value">One-stage, prototype mask 기반</div></div>
    <div class="detail-item"><div class="detail-label">추천 용도</div><div class="detail-value">실시간, 엣지 디바이스, 빠른 배포</div></div>
  </div>
</div>

<div class="instance-card">
  <div class="model-header">
    <span class="model-badge badge-purple">Instance Seg.</span>
    <div>
      <div class="model-name">SAM / SAM 2 <span class="recommend-badge">범용 분할</span></div>
      <div class="model-year">2023–2024 · Meta AI</div>
    </div>
  </div>
  <p class="desc">Segment Anything Model. 점·박스·텍스트 프롬프트로 임의 객체를 분할. 추가 학습 없이 zero-shot 적용 가능. SAM 2는 비디오 확장. 레이블 없는 환경이나 범용 파이프라인에 강함.</p>
  <div class="detail-grid">
    <div class="detail-item"><div class="detail-label">구조</div><div class="detail-value">Vision Transformer + Prompt Encoder</div></div>
    <div class="detail-item"><div class="detail-label">추천 용도</div><div class="detail-value">Zero-shot, 범용 도구, 데이터 레이블링</div></div>
  </div>
</div>

<div class="instance-card">
  <div class="model-header">
    <span class="model-badge badge-blue">Instance Seg.</span>
    <div>
      <div class="model-name">Mask2Former / OneFormer</div>
      <div class="model-year">2022 · Meta AI / SHI Labs</div>
    </div>
  </div>
  <p class="desc">Transformer 기반 통합 segmentation. Panoptic, Instance, Semantic을 단일 모델로 처리. COCO 등 벤치마크 최상위권. OneFormer는 단일 모델로 세 태스크를 동시 지원.</p>
  <div class="detail-grid">
    <div class="detail-item"><div class="detail-label">구조</div><div class="detail-value">Masked Attention Transformer</div></div>
    <div class="detail-item"><div class="detail-label">추천 용도</div><div class="detail-value">연구/정밀 분석, 다중 태스크</div></div>
  </div>
</div>

<div style="background:var(--color-background-secondary);border-radius:var(--border-radius-md);padding:0.75rem 1rem;margin-top:0.5rem;font-size:12px;color:var(--color-text-secondary);line-height:1.6;">
  <b style="color:var(--color-text-primary)">선택 가이드</b><br>
  실시간·엣지 → <b style="color:var(--color-text-primary)">YOLOv8/11-seg</b> · 정확도·연구 → <b style="color:var(--color-text-primary)">Mask R-CNN / Mask2Former</b> · 레이블 없는 범용 → <b style="color:var(--color-text-primary)">SAM 2</b> · 세 가지 seg 통합 → <b style="color:var(--color-text-primary)">OneFormer</b>
</div>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kggstudio.com/cv-5-segmentation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">496</post-id>	</item>
		<item>
		<title>CV (3) &#8211; Grad-CAM</title>
		<link>https://blog.kggstudio.com/cv-3-grad-cam/</link>
					<comments>https://blog.kggstudio.com/cv-3-grad-cam/#respond</comments>
		
		<dc:creator><![CDATA[TimTam]]></dc:creator>
		<pubDate>Fri, 17 Apr 2026 09:11:08 +0000</pubDate>
				<category><![CDATA[CV]]></category>
		<category><![CDATA[Dev]]></category>
		<guid isPermaLink="false">https://blog.kggstudio.com/?p=491</guid>

					<description><![CDATA[Gradient-weighted Class Activation Mapping (Grad-CAM)이란 설명 가능한 인공지능 (eXplainable Artifical Intelligence, XAI) 기술중 하나로, 딥러닝 내부 동작 원리를 시각화 하는 방법. CAM vs Grad-CAM 장단점 비교 구분 CAM (Class Activation Map) Grad-CAM (Gradient-weighted CAM) 구조 제약 매우 높음. (반드시 GAP 구조여야 함) 없음. (모든 CNN 기반 모델 가능) 재학습 여부 구조 변경 시 재학습 필요 ... <a title="CV (3) &#8211; Grad-CAM" class="read-more" href="https://blog.kggstudio.com/cv-3-grad-cam/" aria-label="CV (3) &#8211; Grad-CAM에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Gradient-weighted Class Activation Mapping (Grad-CAM)이란 설명 가능한 인공지능 (eXplainable Artifical Intelligence, XAI) 기술중 하나로, <strong>딥러닝 내부 동작 원리를 시각화</strong> 하는 방법.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="408" data-attachment-id="493" data-permalink="https://blog.kggstudio.com/cv-3-grad-cam/image-75/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/04/image-15.png" data-orig-size="1048,418" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/04/image-15-1024x408.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/04/image-15-1024x408.png" alt="" class="wp-image-493" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/04/image-15-1024x408.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/04/image-15-300x120.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/04/image-15-768x306.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/04/image-15.png 1048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>Class Activation Map (CAM): 딥러닝 모델에서 특정 클래스와 관련된 <strong>입력 이미지 영역</strong>을 시각화. <br>GAP을 통해 <strong>각 채널의 정보를 하나의 값으로 요약함.</strong><br>FC Layer를 통해 어떤채널이 중요했는지 판단함.</li>



<li>Grad-CAM: <br>GAP 구조가 없이 미분을 통해 어떤채널이 결정적이었는지 역으로 계산함.</li>
</ul>



<h2 class="wp-block-heading">CAM vs Grad-CAM 장단점 비교</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>구분</strong></td><td><strong>CAM (Class Activation Map)</strong></td><td><strong>Grad-CAM (Gradient-weighted CAM)</strong></td></tr></thead><tbody><tr><td><strong>구조 제약</strong></td><td><strong>매우 높음.</strong> (반드시 GAP 구조여야 함)</td><td><strong>없음.</strong> (모든 CNN 기반 모델 가능)</td></tr><tr><td><strong>재학습 여부</strong></td><td>구조 변경 시 재학습 필요</td><td>재학습 없이 기존 모델 그대로 사용 가능</td></tr><tr><td><strong>정교함</strong></td><td>히트맵이 비교적 단순하고 큼직함</td><td>CAM보다 더 세밀한 시각화가 가능함</td></tr><tr><td><strong>장점</strong></td><td>구조가 단순할 때 이론적으로 명확함</td><td>범용성이 압도적임 (YOLO, GAN 등에도 가능)</td></tr><tr><td><strong>단점</strong></td><td>모델 구조를 마음대로 바꿀 수 없음</td><td>미분 값을 계산해야 하므로 연산이 한 단계 더 필요</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Global Average Pooling(GAP, 전역 평균 풀링)</h2>



<p class="wp-block-paragraph">하나의 Feature Map(채널) 전체를 평균내어 하나의 숫자로 만드는 기술.각 픽셀에 대한 정보를 1차원으로 펴고 이를 출력으로 사용.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="594" data-attachment-id="492" data-permalink="https://blog.kggstudio.com/cv-3-grad-cam/image-74/#main" data-orig-file="https://blog.kggstudio.com/wp-content/uploads/2026/04/image-14.png" data-orig-size="1392,808" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://blog.kggstudio.com/wp-content/uploads/2026/04/image-14-1024x594.png" src="https://blog.kggstudio.com/wp-content/uploads/2026/04/image-14-1024x594.png" alt="" class="wp-image-492" style="width:507px;height:auto" srcset="https://blog.kggstudio.com/wp-content/uploads/2026/04/image-14-1024x594.png 1024w, https://blog.kggstudio.com/wp-content/uploads/2026/04/image-14-300x174.png 300w, https://blog.kggstudio.com/wp-content/uploads/2026/04/image-14-768x446.png 768w, https://blog.kggstudio.com/wp-content/uploads/2026/04/image-14.png 1392w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">FC Layer (완전 연결 계층)</h2>



<p class="wp-block-paragraph">CAM에서 FC는 1차원 정보 (예: 512개의 특징을 얼마나 강하게 나타내는지 숫자로 나타낸다면. 512길이의 1차원배열)를 가지고 그래서 이게 뭔데?</p>



<p class="wp-block-paragraph">고양이인가 강아지인가 판단하는 분류기(Classifier) 역할을 함.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kggstudio.com/cv-3-grad-cam/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">491</post-id>	</item>
	</channel>
</rss>
