<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Deep Learning from Scratch 2 on Jiho Kim</title><link>https://blog.wlgh7407.com/posts/books/deep-learning-from-scratch-2/</link><description>Recent content in Deep Learning from Scratch 2 on Jiho Kim</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>© 2026 Jiho Kim</copyright><lastBuildDate>Tue, 03 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.wlgh7407.com/posts/books/deep-learning-from-scratch-2/index.xml" rel="self" type="application/rss+xml"/><item><title>밑바닥부터 시작하는 딥러닝 2 5장</title><link>https://blog.wlgh7407.com/posts/books/deep-learning-from-scratch-2/260203_til_%EB%B0%91%EB%B0%94%EB%8B%A5%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EB%94%A5%EB%9F%AC%EB%8B%9D-2-5%EC%9E%A5/</link><pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate><guid>https://blog.wlgh7407.com/posts/books/deep-learning-from-scratch-2/260203_til_%EB%B0%91%EB%B0%94%EB%8B%A5%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EB%94%A5%EB%9F%AC%EB%8B%9D-2-5%EC%9E%A5/</guid><description>&lt;h2 class="relative group"&gt;📝 상세 정리
 &lt;div id="-상세-정리" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#-%ec%83%81%ec%84%b8-%ec%a0%95%eb%a6%ac" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;지금까지 살펴본 신경망은 &lt;strong&gt;피드포워드&lt;/strong&gt; 유형의 신경망이다.
&lt;ul&gt;
&lt;li&gt;이는 흐름이 단방향인 신경망을 말한다.&lt;/li&gt;
&lt;li&gt;하지만 이에는 시계열 데이터를 잘 다루지 못한다는 단점이 있는데&amp;hellip;&lt;/li&gt;
&lt;li&gt;따라서 여기서 &lt;strong&gt;순환 신경망&lt;/strong&gt;이 등장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;5.1 확률과 언어 모델
 &lt;div id="51-확률과-언어-모델" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#51-%ed%99%95%eb%a5%a0%ea%b3%bc-%ec%96%b8%ec%96%b4-%eb%aa%a8%eb%8d%b8" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;5.1.1 word2vec을 확률 관점에서 바라보다
&lt;ul&gt;
&lt;li&gt;$t$번째 단어를 타깃으로, 그 전후 단어를 맥락으로 취급해보자.&lt;/li&gt;
&lt;li&gt;CBOW모델은 $w_{t-1}, w_{t+1}$로부터 $w_t$를 추측하는 일을 수행할 것이다.&lt;/li&gt;
&lt;li&gt;이 확률을 수식으로, $P(w_t | w_{t-1}, w_{t+1})$ 로 나타낼 수 있겠다.&lt;/li&gt;
&lt;li&gt;그런데, 맥락이 좌우대칭이 아니어도 되지 않나? $P(w_t | w_{t-1}, w_{t-2})$같은걸 생각해보자.
&lt;ul&gt;
&lt;li&gt;이걸 어따 써먹지?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;5.1.2 언어 모델
&lt;ul&gt;
&lt;li&gt;언어 모델은 단어 나열에 확률을 부여한다.&lt;/li&gt;
&lt;li&gt;단어 $w_1, w_2, \cdots , w_m$이 있다고 해보자.
&lt;ul&gt;
&lt;li&gt;이들이 순서대로 출연할 확률은 $P(w_1, \cdots, w_m)$이다.&lt;/li&gt;
&lt;li&gt;이는 분해해서 다음과 같이 쓸 수 있다.&lt;/li&gt;
&lt;li&gt;$P(w_1, \cdots, w_m) = P(w_m | w_1, \cdots, w_{m-1}) \cdots P(w_2 | w_1) P(w_1)$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;5.1.3 CBOW 모델을 언어 모델로?
&lt;ul&gt;
&lt;li&gt;$P(w_1, \cdots, w_m) = \prod\limits_{t = 1}^mP(w_t|w_1, \cdots, w_{t-1} \approx \prod\limits_{t = 1}^mP(w_t | w_{t-2}, w_{t-1})$
&lt;ul&gt;
&lt;li&gt;맥락을 두개 단어로 한정!&lt;/li&gt;
&lt;li&gt;이를 2층 마르코프 연쇄라고도 볼 수 있겠다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하지만 고정 길이의 한계로, 대답하기 곤란한 문장들이 생긴다.
&lt;ul&gt;
&lt;li&gt;Tom was watching TV in his room. Mary came in to the room. Mary saind hi to $w$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;또한, 은닉층에서 평균내는 특징상 단어 순서가 무시된다.
&lt;ul&gt;
&lt;li&gt;그렇다면 평균내지 말고 은닉층에서 연결해볼까&amp;hellip;?
&lt;ul&gt;
&lt;li&gt;그러면 맥락의 크기에 비례해 매개변수가 너무 커진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;5.2 RNN이란
 &lt;div id="52-rnn이란" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#52-rnn%ec%9d%b4%eb%9e%80" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Recurrent Neural Network
&lt;ul&gt;
&lt;li&gt;재발하다 / 주기적으로 일어나다 / 순환하다라는 뜻&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;5.2.1 순환하는 신경망
&lt;ul&gt;
&lt;li&gt;순환하다? 반복해서 되돌아가다?
&lt;ul&gt;
&lt;li&gt;이를 위해선 어떤 닫힌 경로가 필요하다.&lt;/li&gt;
&lt;li&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Image Description"
 src="https://blog.wlgh7407.com/images/Pasted%20image%2020260203151615.png"
 &gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;이때 $x_t$를 입력 받는데, $t$는 시각을 의미한다.&lt;/li&gt;
&lt;li&gt;$x_t$는 벡터이다. 예를 들어 문장 (단어 순서)를 다루는 경우 각 단어의 분산 표현(단어 벡터)가 $x_t$가 된다. 이것이 순서대로 하나씩 RNN에 입력되는 것.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;위의 순환 과정을 펼치면 다음과 같다.
&lt;ul&gt;
&lt;li&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Image Description"
 src="https://blog.wlgh7407.com/images/Pasted%20image%2020260203151754.png"
 &gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;이제 여태까지의 피드포워드 신경망과 비슷하게 보인다!
&lt;ul&gt;
&lt;li&gt;하지만, 이제는 다수의 RNN계층 모두가 실제로는 같은 계층이라는 차이가 있다.&lt;/li&gt;
&lt;li&gt;이 계산의 수식은 다음고 같다. $h_t = tanh(h_{t-1}W_h + x_t W_x + b)$
&lt;ul&gt;
&lt;li&gt;$x$를 $h$로 변환하기 위한 가중치 $W_x$&lt;/li&gt;
&lt;li&gt;RNN 출력을 다음 시각의 출력으로 변환하기 위한 가중치 $W_h$&lt;/li&gt;
&lt;li&gt;편향 $b$&lt;/li&gt;
&lt;li&gt;세가지가 존재한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;행렬 곱을 계산하고, 그 합을 계산해서 쌍곡탄젠트함수를 먹인다. 그 결과가 시각 $t$의 출력 $h_t$가 된다. 이는 다른 계층을 향해 위쪽으로 출력되는 동시에, 다음 시각의 RNN계층을 향해 오른쪽으로도 출력된다.
&lt;ul&gt;
&lt;li&gt;$h_t$는 $h_{t-1}$에 의해 계산되므로, RNN 계층을 &lt;strong&gt;상태&lt;/strong&gt;를 가지는 계층, 혹은 메모리가 있는 계층이라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;5.2.3 BPTT
&lt;ul&gt;
&lt;li&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Image Description"
 src="https://blog.wlgh7407.com/images/Pasted%20image%2020260203152426.png"
 &gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;순환 구조에서도 똑같이 오차역전파법을 수행할 수 있다.&lt;/li&gt;
&lt;li&gt;이를 시간 방향으로 펼친 신경망의 오차역 전파법이란 뜻으로
&lt;ul&gt;
&lt;li&gt;BPTT(BackPropagation Through Time) 라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하지만 시계열 데이터의 시간 크기가 커지는것에 비례해서 BPTT가 소비하는 컴퓨팅 자원이 늘어난다는 단점이 있다&amp;hellip;
&lt;ul&gt;
&lt;li&gt;기울기도 불안정해지고&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;5.2.4 Truncated BPTT
&lt;ul&gt;
&lt;li&gt;큰 시계열 데이터를 처리할때는 신경망 연결을 적당한 길이로 &lt;strong&gt;끊자.&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;작은 신경망 여러개로 만들자!&lt;/li&gt;
&lt;li&gt;이것을 Truncated BPTT라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;사실 제대로 구현하려면, 순전파는 그대로 두고 역전파만 끊어야 한다.
&lt;ul&gt;
&lt;li&gt;그리고 그 잘린 단위로 학습&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Image Description"
 src="https://blog.wlgh7407.com/images/Pasted%20image%2020260203153224.png"
 &gt;&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;1000개 깊이의 RNN계층이라도 10개단위로 학습하도록 이렇게 자를 수 있다!
&lt;ul&gt;
&lt;li&gt;이 하나의 단위를 블록이라고 하자.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;5.2.5 Truncated BPTT의 미니배치 학습
&lt;ul&gt;
&lt;li&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Image Description"
 src="https://blog.wlgh7407.com/images/Pasted%20image%2020260203153906.png"
 &gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;두번째 미니배치를 학습 넣을 때 데이터를 시작 위치로 옮겨서 다시 순서대로 데이터를 제공해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;5.3 RNN 구현
 &lt;div id="53-rnn-구현" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#53-rnn-%ea%b5%ac%ed%98%84" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;구현구현&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;5.4 시계열 데이터 처리 계층 구현
 &lt;div id="54-시계열-데이터-처리-계층-구현" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#54-%ec%8b%9c%ea%b3%84%ec%97%b4-%eb%8d%b0%ec%9d%b4%ed%84%b0-%ec%b2%98%eb%a6%ac-%ea%b3%84%ec%b8%b5-%ea%b5%ac%ed%98%84" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;구현구현&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;5.5 RNNLM 학습과 평가
 &lt;div id="55-rnnlm-학습과-평가" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#55-rnnlm-%ed%95%99%ec%8a%b5%ea%b3%bc-%ed%8f%89%ea%b0%80" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;5.5.1 RNNLM 구현&lt;/li&gt;
&lt;li&gt;5.5.2 언어 모델의 평가
&lt;ul&gt;
&lt;li&gt;언어 모델의 예측 성능을 평가하는 척도로 &lt;strong&gt;퍼플렉서타&lt;/strong&gt;를 이용한다.
&lt;ul&gt;
&lt;li&gt;Perplexity, 혼란도&lt;/li&gt;
&lt;li&gt;이는 확률의 역수값
&lt;ul&gt;
&lt;li&gt;이는 직관적으로 &lt;strong&gt;분기 수&lt;/strong&gt;로 해석할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;입력데이터가 여러개라면?
&lt;ul&gt;
&lt;li&gt;$L = -\frac{1}{N}\sum\limits_{n}\sum\limits_{k}t_{nk}\log y_{nk}$&lt;/li&gt;
&lt;li&gt;$\text{perplexity} = e^L$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;5.6 정리
 &lt;div id="56-정리" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#56-%ec%a0%95%eb%a6%ac" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;이번 장의 주제는 순환 신경망
&lt;ul&gt;
&lt;li&gt;이를 이용해 데이터를 순환시켜서, 과거 -&amp;gt; 현재 -&amp;gt; 미래로 데이터를 흘려보낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이를 이용해서 언어 모델을 만들었고, 이는 단어 시퀀스에 확률을 부여하고 다음에 출연할 단어의 확률을 계산한다.
&lt;ul&gt;
&lt;li&gt;이론적으로는 아무리 긴 시계열 데이터라도 RNN의 은닉상태에 정보를 기억하게 할 수 있지만, 실제로는 잘 학습하지 못하는 경우가 많다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;다음장에서 LSTM, GRU등을 알아보겠다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;❔질문 사항
 &lt;div id="질문-사항" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ec%a7%88%eb%ac%b8-%ec%82%ac%ed%95%ad" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;미니배치를 만들 때, 문장의 시작이 아닐 때도 있지 않을까? 그러니까, 미니배치에 넣기 좋게 문장이 생긴 데이터가 아닐 경우가 더 많을 것 같은데&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;🔗 참고 자료
 &lt;div id="-참고-자료" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#-%ec%b0%b8%ea%b3%a0-%ec%9e%90%eb%a3%8c" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>밑바닥부터 시작하는 딥러닝 2 4장 word2vec 속도 개선</title><link>https://blog.wlgh7407.com/posts/books/deep-learning-from-scratch-2/260127_til_%EB%B0%91%EB%B0%94%EB%8B%A5%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EB%94%A5%EB%9F%AC%EB%8B%9D-2-4%EC%9E%A5-word2vec-%EC%86%8D%EB%8F%84-%EA%B0%9C%EC%84%A0/</link><pubDate>Tue, 27 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.wlgh7407.com/posts/books/deep-learning-from-scratch-2/260127_til_%EB%B0%91%EB%B0%94%EB%8B%A5%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EB%94%A5%EB%9F%AC%EB%8B%9D-2-4%EC%9E%A5-word2vec-%EC%86%8D%EB%8F%84-%EA%B0%9C%EC%84%A0/</guid><description>&lt;h2 class="relative group"&gt;📝 상세 정리
 &lt;div id="-상세-정리" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#-%ec%83%81%ec%84%b8-%ec%a0%95%eb%a6%ac" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;기존의 CBOW모델은 말뭉치에 포함된 어휘 수가 많아지면 계산량도 커진다는 단점이 있었다.&lt;/li&gt;
&lt;li&gt;이를 Embedding 계층과 네거티브샘플링이라는 새로운 손힐함수를 이용하여 개선할 것이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;4.1 word2vec 개선 1
 &lt;div id="41-word2vec-개선-1" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#41-word2vec-%ea%b0%9c%ec%84%a0-1" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;기존의 CBOW모델에서 어휘가 100만개가 된다고 가정해보자.
&lt;ul&gt;
&lt;li&gt;그렇다면 입력층은 $W_{in} = 1000000 * 100, W_{out} = 100 * 1000000$의 행렬이 된다.
&lt;ul&gt;
&lt;li&gt;심지어 원핫 벡터라 상당히 sparse한데..&lt;/li&gt;
&lt;li&gt;이를 Embedding 계층 도입으로 해결해보자.&lt;/li&gt;
&lt;li&gt;$W_{in}$은 Embedding으로, $W_{out}$은 네거티브 샘플링으로 해결할 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.1.1 Embedding 계층
&lt;ul&gt;
&lt;li&gt;다시한번 어휘 수가 100만개인 상황을 상상해보자.
&lt;ul&gt;
&lt;li&gt;단어의 원핫벡터는 100만차원..&lt;/li&gt;
&lt;li&gt;그런데, 이 연산이 무엇을 의미하는걸까?&lt;/li&gt;
&lt;li&gt;이는 그저 행렬의 특정 행을 추출하는 것뿐이다!&lt;/li&gt;
&lt;li&gt;다시말해, 원핫표현으로의 변환가 행렬 곱연산은 사실 큰 필요가 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;가중치 매개변수로부터 &lt;strong&gt;단어 ID에 해당하는 행&lt;/strong&gt;을 추출하기만 하면 된다.
&lt;ul&gt;
&lt;li&gt;해당 계층을 만들어보자.&lt;/li&gt;
&lt;li&gt;이를 Embedding 계층이라고 하고, 단어 임베딩이라는 용어에서 유래했다.
&lt;ul&gt;
&lt;li&gt;Embedding 계층에 단어의 분산 표현을 저장할 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.1.2 Embedding 계층 구현
&lt;ul&gt;
&lt;li&gt;행렬에서 특정 행을 추출하는것은 꽤나 쉽다.
&lt;ul&gt;
&lt;li&gt;$W$가 2차원 numpy 배열이라면, W[2]처럼 원하는 행을 명시하면 끝
&lt;ul&gt;
&lt;li&gt;입력층 단어가 일때도 쉽게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;따라서 구현에서도 W[idx]로 인덱싱만 진행하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;역전파에서도 똑같이 전해진 기울기를 idx번째 행에 전달하면 된다.
&lt;ul&gt;
&lt;li&gt;그런데 여기서 문제가 발생한다.&lt;/li&gt;
&lt;li&gt;idx의 원소가 중복된다면? 예를 들어 입력층에서 넣은 단어인덱스 배열이 [0, 2, 0, 4]라면?&lt;/li&gt;
&lt;li&gt;이 문제를 해결하기 위해 구현 시 dW의 층을 0으로 초기화하고 각 인덱스에 대해 더해주자.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;4.2 word2vec 개선 2
 &lt;div id="42-word2vec-개선-2" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#42-word2vec-%ea%b0%9c%ec%84%a0-2" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;여기서는 은닉층 이후의 처리, 즉 행렬곱과 Softmax계층의 계산 파트의 병목을 해소할 것
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;네거티브 샘플링&lt;/strong&gt;을 이용할 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.2.1 은닉층 이후 계산의 문제점
&lt;ul&gt;
&lt;li&gt;언제나 그랬듯 어휘가 100만개, 은닉층 뉴런이 100개라고 생각해보자.
&lt;ol&gt;
&lt;li&gt;$W_{out} = 100 * 1000000$ 의 행렬 연산을 해서 100만 길이의 출력층을 만들고&lt;/li&gt;
&lt;li&gt;이에 softmax 함수를 적용해서 확률을 얻어내야 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.2.2 다중 분류에서 이진 분류로
&lt;ul&gt;
&lt;li&gt;이 기법의 핵심 아이디어는 다중 분류(multi-class classification)을 이중 분류(binary classification)으로 근사하는데 있다.
&lt;ul&gt;
&lt;li&gt;100만개의 단어 중 옳은 단어 하나를 고르는 문제를, 맥락이 주어졌을 때 &lt;strong&gt;타깃 단어는 say 입니까?&lt;/strong&gt; 라는 이진 분류, 즉 &lt;strong&gt;결정 문제&lt;/strong&gt;로 바꿀 수 있다.&lt;/li&gt;
&lt;li&gt;그렇다면 출력층에는 뉴런을 하나만 준비하면 된다!&lt;/li&gt;
&lt;li&gt;따라서 연산은 $W_{out}[idx] = 100 * 1$ 로 바뀌게 되고, 길이 1의 출력층만 sigmoid를 적용하면 되게 되었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.2.3 시그모이드 함수와 교차 엔트로피 오차
&lt;ul&gt;
&lt;li&gt;이진 분류 문제를 신경망으로 풀 때에는
&lt;ul&gt;
&lt;li&gt;점수에 시그모이드 함수를 적용해 확률로 변환하고&lt;/li&gt;
&lt;li&gt;손실을 구할 때에는 손실 함수로 교차 엔트로피 오차를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시그모이드 함수는 앞에서 배운것과 같이 다음과 같고,
&lt;ul&gt;
&lt;li&gt;$y = \frac{1}{1+e^{-x}}$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;교차 엔트로피 오차는 다음과 같다.
&lt;ul&gt;
&lt;li&gt;$L = -(t\log y + (1-t)\log (1-y))$&lt;/li&gt;
&lt;li&gt;$y$는 시그모이드 함수의 출력, $t$는 정답 레이블
&lt;ul&gt;
&lt;li&gt;$t = 1$일 때 Yes, $t = 0$일때 No&lt;/li&gt;
&lt;li&gt;따라서 $t = 1$일때 $-\log y$가, $t = 0$일 때 $-\log (1-y)$가 출력된다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이때 역전파 계산 결과, Chain Rule로 계산을 완료하면 전달되는 오차(기울기)가 $y-t$가 된다.
&lt;ul&gt;
&lt;li&gt;$t = 0$일때는 $y$가 크면 크게 학습하고, $y$가 작으면 작게 학습한다는 의미도 된다!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.2.4 다중 분류에서 이진 분류로
&lt;ul&gt;
&lt;li&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Image Description"
 src="https://blog.wlgh7407.com/images/Pasted%20image%2020260127170240.png"
 &gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;위의 모든 최적화를 거친 그림은 위와 같다.
&lt;ul&gt;
&lt;li&gt;여기서 출력층의 Embedding 계층과 내적 연산을 합쳐서 Embedding dot 계층으로 표현하면 조금 더 간단하게도 그릴 수 있다.&lt;/li&gt;
&lt;li&gt;Embedding dot 계층은 $h, idx$를 입력받아서 점수를 반환한다.
&lt;ul&gt;
&lt;li&gt;내적은 $\text{Score} = \sum\limits_{i=1}^d{h_i \cdot w_i} = h \cdot w_{target}$ 이라고 생각할 수 있고,&lt;/li&gt;
&lt;li&gt;곱의 결과로 나온 벡터가 실제 정답과 얼마나 유사한지에 대한 값이라고 생각할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.2.5 네거티브 샘플링
&lt;ul&gt;
&lt;li&gt;위는 정답의 예만 신경썼고, 오답의 예를 신경쓰지 않았다.
&lt;ul&gt;
&lt;li&gt;이를 어떻게 학습시키면 좋을까?&lt;/li&gt;
&lt;li&gt;모든 오답에 대해서 이진 분류를 학습시키면 어떨까?
&lt;ul&gt;
&lt;li&gt;그렇다면 다시 어휘의 수에 연산량이 비례하게 된다&amp;hellip;.&lt;/li&gt;
&lt;li&gt;따라서 근사적인 해법으로, 부정적인 예를 조금만 선택하자!
&lt;ul&gt;
&lt;li&gt;이를 &lt;strong&gt;네거티브 샘플링&lt;/strong&gt;이라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.2.6 네거티브 샘플링의 샘플링 기법
&lt;ul&gt;
&lt;li&gt;샘플링을 단순히 무작위로 할 것인가?
&lt;ul&gt;
&lt;li&gt;더 좋은 방법이 있다.&lt;/li&gt;
&lt;li&gt;말뭉치의 통계 데이터를 기초로 샘플링하자!
&lt;ul&gt;
&lt;li&gt;자주 등장하는 단어를 많이 추출하고, 드물게 등장하는 단어를 적게 추출하자.&lt;/li&gt;
&lt;li&gt;단어의 출현 횟수를 확률분포로 나타내고, 그 확률분포대로 단어를 샘플링하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그런데, word2vec의 네거티브 샘플링에서는 각 확률분포에 0.75승을 하라고 권장한다.
&lt;ul&gt;
&lt;li&gt;이는 출현확률이 낮은 단어를 버리지 않게하기 위함으로, 낮은 출현율의 단어의 확률을 조금 끌어올릴 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.2.7 네거티브 샘플링 구현
&lt;ul&gt;
&lt;li&gt;앞과 크게 다르지 않다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;4.3 개선판 word2vec 학습
 &lt;div id="43-개선판-word2vec-학습" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#43-%ea%b0%9c%ec%84%a0%ed%8c%90-word2vec-%ed%95%99%ec%8a%b5" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PTB 데이터셋으로 학습해보자.&lt;/li&gt;
&lt;li&gt;4.3.1 CBOW 모델 구현&lt;/li&gt;
&lt;li&gt;4.3.2 CBOW 모델 학습 코드&lt;/li&gt;
&lt;li&gt;4.3.3 CBOW 모델 평가&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;4.4 word2vec 남은 주제
 &lt;div id="44-word2vec-남은-주제" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#44-word2vec-%eb%82%a8%ec%9d%80-%ec%a3%bc%ec%a0%9c" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;4.4.1 word2vec을 사용한 애플리케이션의 예
&lt;ul&gt;
&lt;li&gt;전이 학습
&lt;ul&gt;
&lt;li&gt;한 분야에서 배운 지식을 다른 분야에 적용하는 기법&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;자연어 문제를 풀 때, 처음부터 학습하는 것이 아니라 위키백과나 구글 뉴스등의 큰 말뭉치로 학습을 끝낸 후, 우리가 원하는 작업에 돌입하자.&lt;/li&gt;
&lt;li&gt;문장을 고정크기 벡터로 변환할 때에는 단어 벡터들의 합을 이용하자.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.4.2 단어 벡터 평가 방법
&lt;ul&gt;
&lt;li&gt;우리가 얻어낸 분산 표현이 좋은지는 어떻게 평가할 수 있을까?&lt;/li&gt;
&lt;li&gt;단어의 &lt;strong&gt;유사성&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;사람이 작성한 단어 유사도를 검증 세트로 사용해 평가하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;유추 문제&lt;/strong&gt;를 이용한 평가
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;king : queen = man : ?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;과 같은 문제를 출제해서 정답률로 측정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;4.5 정리
 &lt;div id="45-정리" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#45-%ec%a0%95%eb%a6%ac" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CBOW모델은 말뭉치의 어휘 수 증가에 비례해 계산량이 증가하는 문제가 있었다.
&lt;ul&gt;
&lt;li&gt;이를 Embedding계층 구현, 네거티브 샘플링 두가지 방법을 도입해서 해결하였다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;핵심은 어휘 &lt;strong&gt;모두&lt;/strong&gt;를 처리하는 것이 아니라 &lt;strong&gt;일부&lt;/strong&gt; 단어만을 대상으로 하는 것이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;❔질문 사항
 &lt;div id="질문-사항" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ec%a7%88%eb%ac%b8-%ec%82%ac%ed%95%ad" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;yes / no 결정문제로 만들면 no가 나오면 yes가 나올때까지 돌리는건가? 근데 그러면 똑같이 시간복잡도가 $O(N)$인거 아닌가?&lt;/li&gt;
&lt;li&gt;아하, 위는 학습에서나 나오는 이야기고, 결국 나중에 디코딩할때는 = 단어를 찾을 때는 어떤 벡터의 결과값으로 가장 가까운 단어를 찾아가는건가? 그건 어떻게 이루어지지? 벡터공간에서 가장 가까운 점 찾기가 쉽나?
&lt;ul&gt;
&lt;li&gt;-&amp;gt; 근사 최근접 이웃 (Approximate Nearest Neighbor, ANN) 알고리즘을 이용한다.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.wlgh7407.com/posts/algorithm/topics/260127_til_approximate-nearest-nighbor-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98/" &gt;Approximate Nearest Nighbor 알고리즘&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;🔗 참고 자료
 &lt;div id="-참고-자료" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#-%ec%b0%b8%ea%b3%a0-%ec%9e%90%eb%a3%8c" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://word2vec.kr/search/" target="_blank" rel="noreferrer"&gt;https://word2vec.kr/search/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>밑바닥부터 시작하는 딥러닝 2 3장 word2vec</title><link>https://blog.wlgh7407.com/posts/books/deep-learning-from-scratch-2/260126_til_%EB%B0%91%EB%B0%94%EB%8B%A5%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EB%94%A5%EB%9F%AC%EB%8B%9D-2-3%EC%9E%A5-word2vec/</link><pubDate>Mon, 26 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.wlgh7407.com/posts/books/deep-learning-from-scratch-2/260126_til_%EB%B0%91%EB%B0%94%EB%8B%A5%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EB%94%A5%EB%9F%AC%EB%8B%9D-2-3%EC%9E%A5-word2vec/</guid><description>&lt;h2 class="relative group"&gt;📝 상세 정리
 &lt;div id="-상세-정리" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#-%ec%83%81%ec%84%b8-%ec%a0%95%eb%a6%ac" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;이번 장도 단어의 분산 표현&lt;/li&gt;
&lt;li&gt;앞 장에서 &lt;strong&gt;통계 기반 기법&lt;/strong&gt;을 이용했다면, 이번에는 &lt;strong&gt;추론 기반 기법&lt;/strong&gt;을 이용하겟다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;3.1 추론 기반 기법과 신경망
 &lt;div id="31-추론-기반-기법과-신경망" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#31-%ec%b6%94%eb%a1%a0-%ea%b8%b0%eb%b0%98-%ea%b8%b0%eb%b2%95%ea%b3%bc-%ec%8b%a0%ea%b2%bd%eb%a7%9d" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;3.1.1 통계 기반 기법의 문제점
&lt;ul&gt;
&lt;li&gt;결국 동시발생 행렬을 만들고 SVD를 적용해야하는데, 이는 큰 말뭉치에서 너무 어렵다&lt;/li&gt;
&lt;li&gt;동시발생행렬의 크기는 $O(N^2)$ SVD 연산 시간은 $O(N^3)$ 이라 어휘가 100만개 단위로 되면 현실적으로 불가능해진다&lt;/li&gt;
&lt;li&gt;추론 기반 기법에서는 소량(미니배치)씩 학습해서 가중치를 갱신한다.
&lt;ul&gt;
&lt;li&gt;어휘량이 많아도 가능하고&lt;/li&gt;
&lt;li&gt;여러 GPU를 이용한 병렬 계산도 가능하다!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3.1.2 추론 기반 기법 개요
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;추론&lt;/strong&gt;: 주변 단어(맥락)이 주어졌을때 빈칸에 무슨 단어가 들어가는지를 추측하는 작업&lt;/li&gt;
&lt;li&gt;추론을 통해 신경망으로 각 단어의 출현 확률을 만들자.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3.1.3. 신경망에서의 단어 처리
&lt;ul&gt;
&lt;li&gt;신경망은 단어를 그대로 처리할 수 없으니, &lt;strong&gt;원핫 벡터&lt;/strong&gt;로 변환하자.
&lt;ul&gt;
&lt;li&gt;원핫벡터: 벡터의 원소중 하나만 1이고 나머지는 모두 0인 벡터&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;3.2 단순한 word2vec
 &lt;div id="32-단순한-word2vec" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#32-%eb%8b%a8%ec%88%9c%ed%95%9c-word2vec" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;3.2.1 CBOW모델의 추론 처리
&lt;ul&gt;
&lt;li&gt;CBOW모델은 맥락으로부터 타겟을 추측하는 용도의 신경망
&lt;ul&gt;
&lt;li&gt;타겟은 중앙 단어, 맥락은 주변 단어&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;N개의 단어를 맥락으로 사용하기로 결정했다면, N개의 원핫벡터가 입력층이 된다.
&lt;ul&gt;
&lt;li&gt;은닉층에 들어갈 값은 여러개의 입력층의 결과의 평균이다.&lt;/li&gt;
&lt;li&gt;첫번째 입력층의 결과가 $h_1$, 두번째 입력층의 결과가 $h_2$라면 은닉층의 뉴런은 $\frac{1}{2}(h_1 + h_2)$ 이 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;출력층의 뉴런 하나하나는 각각의 단어에 대응되고, 해당 단어의 점수가 나온다.
&lt;ul&gt;
&lt;li&gt;점수는 확률로 해석되기 전의 값으로, softmax함수로 확률을 얻어낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;은닉층의 뉴런수를 입력층의 뉴런수보다 적게 하는것이 중요하다.
&lt;ul&gt;
&lt;li&gt;이렇게 해야 은닉층이 단어 예측에 필요한 정보를 간결하게 담게 되며, 결과적으로 밀집벡터 표현을 얻을 수 있다.&lt;/li&gt;
&lt;li&gt;단어 벡터를 은닉층에 넣어서 사람이 알아보지 못하게 되는걸 &lt;strong&gt;인코딩&lt;/strong&gt;, 반대로 은닉층의 정보를 사람이 알아볼 수 있는 결과로 만드는 작업을 &lt;strong&gt;디코딩&lt;/strong&gt;이라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CBOW모델은 활성화 함수를 사용하지 않는 간단한 신경망이다.&lt;/li&gt;
&lt;li&gt;여러개의 입력층은 같은 가중치를 공유한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3.2.2 CBOW 모델의 학습
&lt;ul&gt;
&lt;li&gt;위에서 구한 점수에 softmax함수를 적용하면 &lt;strong&gt;확률&lt;/strong&gt;을 얻을 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3.2.3 word2vec의 가중치와 분산 표현
&lt;ul&gt;
&lt;li&gt;$W_{in}$의 가중치의 각 행은 각 단어의 분산표현에 해당하고, $W_{out}$에서는 각 단어의 분산 표현이 열 방향으로 저장된다.
&lt;ul&gt;
&lt;li&gt;행렬의 차원중 어디가 각 단어에 대응되는지 알면 직관적인듯&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;3.3 학습 데이터 준비
 &lt;div id="33-학습-데이터-준비" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#33-%ed%95%99%ec%8a%b5-%eb%8d%b0%ec%9d%b4%ed%84%b0-%ec%a4%80%eb%b9%84" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;3.3.1 맥락과 타깃
&lt;ul&gt;
&lt;li&gt;이전에 말한대로 맥락은 주변단어, 타깃은 중앙 한단어
&lt;ul&gt;
&lt;li&gt;맥락은 여러개가 될수 있으므로 contexts라고 복수형 표현을 권장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이전에 했던것과 같이 텍스트를 단어 ID로 바꾸고, 이를 배열로 저장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3.3.2 원핫 표현으로 변환
&lt;ul&gt;
&lt;li&gt;학습에 사용하기 위해 이를 원핫 벡터로 바꾼다.
&lt;ul&gt;
&lt;li&gt;8개짜리, 7종류 단어의 문장이어서 (6, 2 )의 단어 ID 벡터가있었다면 이는 단어 ID가 원핫 베겉로 바뀌며 (6, 2, 7 )의 벡터가 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;3.4 CBOW 모델 구현
 &lt;div id="34-cbow-모델-구현" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#34-cbow-%eb%aa%a8%eb%8d%b8-%ea%b5%ac%ed%98%84" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;간단하게 두개의 맥락을 $W_{in}$ 을 통과켜서 평균을 내고, $W_{out}$을 거쳐서 softmax를 통해 Loss를 얻어내는 모델을 구상해보자.&lt;/li&gt;
&lt;li&gt;3.4.1 학습 코드 구현
&lt;ul&gt;
&lt;li&gt;일반적인 신경망 학습과 완전히 같다! (1장 참조)&lt;/li&gt;
&lt;li&gt;입력층의 가중치, 즉 $W_{in}$을 꺼내봄으로 단어 ID의 분산표현을 잘 확인할 수 있다.&lt;/li&gt;
&lt;li&gt;하지만 아직 큰 맒룽치에서는 처리속도가 느리다는 문제점이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;3.5 word2vec 보충
 &lt;div id="35-word2vec-보충" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#35-word2vec-%eb%b3%b4%ec%b6%a9" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;3.5.1 CBOW 모델과 확률
&lt;ul&gt;
&lt;li&gt;CBOW모델을 확률 표기법으로 기술해봦.&lt;/li&gt;
&lt;li&gt;맥락이 두개인 경우, 조건부 확률 식으로 $P(w_t | w_{t-1}, w_{t+1})$ 과 같이 나타낼 수 있다.
&lt;ul&gt;
&lt;li&gt;이를 이용해 손실함수도 간결하게 표현할 수 있다.&lt;/li&gt;
&lt;li&gt;$L = -\log P(w_t | w_{t-1}, w_{t+1})$&lt;/li&gt;
&lt;li&gt;$L = -\frac{1}{T} \sum\limits_{t = 1}^{T}\log P(w_t | w_{t-1}, w_{t+1})$
&lt;ul&gt;
&lt;li&gt;말뭉치 전체에 대한 식&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3.5.2 skip-gram 모델
&lt;ul&gt;
&lt;li&gt;CBOW모델과 맥락과 타깃을 역전시킨 모델
&lt;ul&gt;
&lt;li&gt;중앙 단어 하나로 주변 단어를 예측하자&lt;/li&gt;
&lt;li&gt;$P(w_{t-1}, w_{t+1} | w_t) = P(w_{t-1}| w_t) P(w_{t+1} | w_t)$&lt;/li&gt;
&lt;li&gt;$L = -(\log P(w_{t-1}| w_t) + \log P(w_{t+1} | w_t))$&lt;/li&gt;
&lt;li&gt;$L = -\frac{1}{T} \sum\limits_{t = 1}^{T}(\log P(w_{t-1}| w_t) + \log P(w_{t+1} | w_t))$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단어 분산의 정밀도 면에서 skip-gram 모델이 CBOW모델보다 더 좋을 때가 많다.
&lt;ul&gt;
&lt;li&gt;하지만 학습 면에서는 cbow 모델이 더 빠르다.
&lt;ul&gt;
&lt;li&gt;손실을 맥락의 수만큼 구해야하기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3.5.3 통계 기반 vs 추론 기반
&lt;ul&gt;
&lt;li&gt;통계 기반은 전체를 보면서 1회, 추론 기반은 미니배치를 보면서 일부씩 여러번 학습했다.&lt;/li&gt;
&lt;li&gt;여러가지 추가 상황들을 생각해보자.
&lt;ul&gt;
&lt;li&gt;어휘에 추가할 새 단어가 생겨난 경우
&lt;ul&gt;
&lt;li&gt;통계기반 방법은 계산을 처음부터 다시 해야함&lt;/li&gt;
&lt;li&gt;추론기반 방법은 학습된 가중치를 초깃값으로 추가 학습을진행하면 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;얻게되는 분산표현의 성격이나 정밀도
&lt;ul&gt;
&lt;li&gt;의외로 단어의 유사성을 정량평가한 결과, 둘 사이에 우열은 없었음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;skip-gram과 네거티브 샘플링을 이용한 모델은 동시발생행렬에서 특수한 행렬 분해를 적용한 결과와 같았다!!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;❔질문 사항
 &lt;div id="질문-사항" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ec%a7%88%eb%ac%b8-%ec%82%ac%ed%95%ad" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;🔗 참고 자료
 &lt;div id="-참고-자료" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#-%ec%b0%b8%ea%b3%a0-%ec%9e%90%eb%a3%8c" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>밑바닥부터 시작하는 딥러닝 2 2장</title><link>https://blog.wlgh7407.com/posts/books/deep-learning-from-scratch-2/260120-%EB%B0%91%EB%B0%94%EB%8B%A5%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EB%94%A5%EB%9F%AC%EB%8B%9D-2-2%EC%9E%A5/</link><pubDate>Tue, 20 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.wlgh7407.com/posts/books/deep-learning-from-scratch-2/260120-%EB%B0%91%EB%B0%94%EB%8B%A5%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EB%94%A5%EB%9F%AC%EB%8B%9D-2-2%EC%9E%A5/</guid><description>&lt;h2 class="relative group"&gt;📝 상세 정리
 &lt;div id="-상세-정리" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#-%ec%83%81%ec%84%b8-%ec%a0%95%eb%a6%ac" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;야호! 자연어처리의 세계로 들어왔다!
&lt;ul&gt;
&lt;li&gt;문제의 본질은 컴퓨터가 우리의 말을 이해하게 만드는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.1 자연어 처리란
&lt;ul&gt;
&lt;li&gt;우리가 평소에 쓰는 말을 &lt;strong&gt;자연어&lt;/strong&gt;라고 한다.&lt;/li&gt;
&lt;li&gt;자연어 처리 (NLP)는 이 자연어를 처리하는 분야.
&lt;ul&gt;
&lt;li&gt;컴퓨터가 우리말을 이해하게 만들자&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;우리의 말은 문자로 구성되며, 말의 의미는 단어로 구성된다.
&lt;ul&gt;
&lt;li&gt;단어는 의미의 최소단위이다.&lt;/li&gt;
&lt;li&gt;따라서 컴퓨터에게 단어의 의미를 이해시키는게 중요하다.&lt;/li&gt;
&lt;li&gt;그 방법으로는
&lt;ul&gt;
&lt;li&gt;시소러스를 활용한 기법&lt;/li&gt;
&lt;li&gt;통계 기반 기법&lt;/li&gt;
&lt;li&gt;추론 기반 기법 (word2vec)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.2 시소러스
&lt;ul&gt;
&lt;li&gt;단어의 의미를 나타내기 위해, 사람이 직접 단어의 의미를 정의해보자.
&lt;ul&gt;
&lt;li&gt;표준국어 대사전처럼 각각의 단어에 그 의미를 설명해 넣을 수 있을까?
&lt;ul&gt;
&lt;li&gt;EX) 자동차
&lt;ul&gt;
&lt;li&gt;원동기를 장치하여 그 동력으로 어쩌구&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시소러스는 유의어 사전으로, 뜻이 같은 단어나 비슷한 단어를 한 그룹으로 묶은 것
&lt;ul&gt;
&lt;li&gt;동의어 / 유의어&lt;/li&gt;
&lt;li&gt;상위와 하위, 전체와 부분 등 더 세세한 관계까지 정의해둔 경우도 있다.&lt;/li&gt;
&lt;li&gt;이 그래프 구조를 단어 네트워크라고 생각하고, 컴퓨터한테 가르칠 수 있지 않을까?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WordNet
&lt;ul&gt;
&lt;li&gt;자연어 처리에서 가장 유명한 시소러스&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그런데 이런 시소러스에도 문제가 있는데..
&lt;ul&gt;
&lt;li&gt;시대 변화에 대응하기 어렵다&lt;/li&gt;
&lt;li&gt;사람을 쓰는 비용은 크다&lt;/li&gt;
&lt;li&gt;단어의 미묘한 차이를 표현할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.3 통계 기반 기법
&lt;ul&gt;
&lt;li&gt;이제부터는 &lt;strong&gt;말뭉치(corpus)&lt;/strong&gt; 를 이용할 것
&lt;ul&gt;
&lt;li&gt;대량의 텍스트 데이터
&lt;ul&gt;
&lt;li&gt;맹목적으로 수집한거 말고, 연구나 어플리케이션을 위해 수집한 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;말뭉치 안에는 자연어에 대한 사람의 지식이 충분히 담겨있다고 볼 수 있다!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;자연어 처리에는 다양한 말뭉치가 이용되는데
&lt;ul&gt;
&lt;li&gt;위키백과나 구글뉴스등도 되고&lt;/li&gt;
&lt;li&gt;셰익스피어나 나츠메소세키씨 작품이라던지&lt;/li&gt;
&lt;li&gt;일단 한번 연습을 해보자.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;전처리
&lt;ul&gt;
&lt;li&gt;텍스트 데이터를 단어로 분할하고 그 분할된 단어들을 단어 ID 목록으로 변환하는 일&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단어의 분산 표현
&lt;ul&gt;
&lt;li&gt;색을 코발트블루/싱크레드처럼 이름붙일수도 있지만, RGB기호로 나타낼 수도 있을 것이다
&lt;ul&gt;
&lt;li&gt;심지어 그쪽이 색을 더 정확하게 명시할수도 있고, 3개의 성분으로 간결한 표현도 된다&lt;/li&gt;
&lt;li&gt;관련성 여부도, 정량화하기도 쉽다!!&lt;/li&gt;
&lt;li&gt;그렇다면 단어도 이렇게 벡터로 표현할 수 있을까?
&lt;ul&gt;
&lt;li&gt;이를 단어의 &lt;strong&gt;분산 표현&lt;/strong&gt; 이라고 하자&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;분포 가설
&lt;ul&gt;
&lt;li&gt;많은 연구들과 기법들이 있었는데, 그 뿌리는 다음과 같다.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;단어의 의미는 주변 단어에 의해 형성된다&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;이를 분포 가설이라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이는 단어 자체에는 의미가 없고, 그 단어가 사용된 맥락이 의미를 형성한다는 것을 내포한다.
&lt;ul&gt;
&lt;li&gt;앞으로 &lt;strong&gt;맥락&lt;/strong&gt;이란 주변에 놓인 단어들을 가리킬 것이다.
&lt;ul&gt;
&lt;li&gt;윈도우 크기가 k라면 좌우 k단어씩, v[idx-k:idx+k+1] 을 의미한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;일단 먼저 주변 단어를 세어보는 방법이 자연스럽게 떠오른다!
&lt;ul&gt;
&lt;li&gt;이를 통계 기반 기법이라고 하자.&lt;/li&gt;
&lt;li&gt;id값의 종류를 크기로 하는 벡터를 id에 대해 연결해서, $N^2$ 행렬을 만들 수 있다.
&lt;ul&gt;
&lt;li&gt;이를 동시발생 행렬이라고 하자.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이제 벡터 사이 유사도를 측정하자.
&lt;ul&gt;
&lt;li&gt;내적.. 유클리드거리.. 등등 모두 쓸 수 있겠지만&lt;/li&gt;
&lt;li&gt;우리는 &lt;strong&gt;코사인 유사도&lt;/strong&gt;를 이용하자.
&lt;ul&gt;
&lt;li&gt;$\text{similarity}(\mathbf{x}, \mathbf{y}) = \frac{\mathbf{x} \cdot \mathbf{y}}{||\mathbf{x}|| \, ||\mathbf{y}||} = \frac{x_1 y_1 + \cdots + x_n y_n}{\sqrt{x_1^2 + \cdots + x_n^2} \sqrt{y_1^2 + \cdots + y_n^2}}$
&lt;ul&gt;
&lt;li&gt;이때 ${||\mathbf{x}||}$는 노름이다.&lt;/li&gt;
&lt;li&gt;값은 -1에서 1 사이가 나온다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이걸로 내림차순을 하든 뭘하든 해서 유사도를 계산할 수 는 있지만&amp;hellip; 말뭉치가 작으면 문제가 많다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.4 통계 기반 기법 개선하기
&lt;ul&gt;
&lt;li&gt;두 단어를 그냥 이렇게 생으로 하면.. 문제가 깊다
&lt;ul&gt;
&lt;li&gt;the car의 the같이 괘씸한 놈이 존재함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;점별 상호정보량 (PMI)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;$\text{PMI}(x, y) = \log_2 \frac{P(x, y)}{P(x)P(y)}$
&lt;ul&gt;
&lt;li&gt;$P(x), P(y), P(x, y)$ 는 각각 x가 일어날 확률, y가 일어날 확률, 동시에 일어날 확률&lt;/li&gt;
&lt;li&gt;이 PMI값이 높을수록 관련성이 높다&lt;/li&gt;
&lt;li&gt;이는 동시발생 행렬을 이용해서 다시 쓸 수 있는데&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;$= \log_2 \frac{\frac{C(x, y)}{N}}{\frac{C(x)}{N} \frac{C(y)}{N}} = \log_2 \frac{C(x, y) \cdot N}{C(x) C(y)}$
&lt;ul&gt;
&lt;li&gt;하지만 이때 동시발생횟수가 0이면 $log_2 0$ 을 계산해야한다는 문제가 있다&amp;hellip;
&lt;ul&gt;
&lt;li&gt;따라서 &lt;strong&gt;양의 상호정보량&lt;/strong&gt;을 사용하자.
&lt;ul&gt;
&lt;li&gt;$= \text{PPMI}(x, y) = \max(0, \text{PMI}(x, y))$&lt;/li&gt;
&lt;li&gt;0 이상의 실수로 표현하는게 가능해졌다!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;거대한 문제가 생겼다
&lt;ul&gt;
&lt;li&gt;단어가 $N$개면 차원 또한 $N$개가 된다!!!
&lt;ul&gt;
&lt;li&gt;심지어 대부분은 0이다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;차원 감소
&lt;ul&gt;
&lt;li&gt;물론 중요한 정보는 최대한 유지하면서 차원을 줄여야한다.&lt;/li&gt;
&lt;li&gt;sparse한 행렬/벡터를 중요한 축을 잘 찾아서 dense한 행렬/벡터로 만들어야 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;특잇값분해(SVD)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;임의의 행렬을 세 행렬의 곱으로 분해&lt;/li&gt;
&lt;li&gt;$\mathbf{X} = \mathbf{U}\mathbf{S}\mathbf{V}^T$
&lt;ul&gt;
&lt;li&gt;$\mathbf{U}, \mathbf{V}$는 직교행렬&lt;/li&gt;
&lt;li&gt;$\mathbf{S}$는 대각행렬&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;근데 이게 시간복잡도가 $O(N^3)$이라서, Truncated SVD같은걸 이용하기도 한다.
&lt;ul&gt;
&lt;li&gt;특잇값이 작은걸 버리는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PTB 데이터셋
&lt;ul&gt;
&lt;li&gt;본격적인 적당한 말뭉치를 이용해보자!&lt;/li&gt;
&lt;li&gt;여러가지 전처리는 좀 해두셨다
&lt;ul&gt;
&lt;li&gt;희소한 단어를 &amp;lt;unknown&amp;gt;으로 바꾸기&lt;/li&gt;
&lt;li&gt;구체적인 숫자르 N으로 수정하기&lt;/li&gt;
&lt;li&gt;각 문장의 끝에 &amp;lt;eos&amp;gt; (end of sentence) 추가하기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;결과가 재밌다! 신기하네&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.5 정리
&lt;ul&gt;
&lt;li&gt;우리는 단어의 의미를 벡터로 인코딩하는데 성공했다! 와!&lt;/li&gt;
&lt;li&gt;심지어 SVD를 이용해서 차원을 감소시키고 더 좋은 벡터를 얻어냈다! 와!!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;❔질문 사항
 &lt;div id="질문-사항" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ec%a7%88%eb%ac%b8-%ec%82%ac%ed%95%ad" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;윈도우를 이용해서 하면, 문법적인것 (굴절어, 교착어 등)에 대한 정보가 손실되지 않나?
&lt;ul&gt;
&lt;li&gt;I say hello와 hello say I가 같은 의미를 가지게 되니까.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;직교행렬을 공부하자
&lt;ul&gt;
&lt;li&gt;선형대수를 공부해야한다 ㅁㄴㅇㄹㅁㄴㅇㄹ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;🔗 참고 자료
 &lt;div id="-참고-자료" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#-%ec%b0%b8%ea%b3%a0-%ec%9e%90%eb%a3%8c" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;</description></item></channel></rss>