<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>numver_se.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Mon, 17 Jul 2023 14:44:09 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>numver_se.log</title>
            <url>https://images.velog.io/images/numver_se/profile/9508b298-de65-49f1-9da7-3b53f0ff4a21/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. numver_se.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/numver_se" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[SQL 첫걸음 #1]]></title>
            <link>https://velog.io/@numver_se/SQL-%EC%B2%AB%EA%B1%B8%EC%9D%8C-1</link>
            <guid>https://velog.io/@numver_se/SQL-%EC%B2%AB%EA%B1%B8%EC%9D%8C-1</guid>
            <pubDate>Mon, 17 Jul 2023 14:44:09 GMT</pubDate>
            <description><![CDATA[<h2 id="1강-데이터베이스">1강. 데이터베이스</h2>
<p>DBMS는 <strong>데이터베이스를 관리하는 소프트웨어</strong>로, 사용 목적은 <strong>생산성 향상과 기능성, 신뢰성 확보</strong>에 있음</p>
<ul>
<li>생산성: DBMS가 데이터 검색, 추가, 삭제, 갱신과 같은 기본 기능을 제공</li>
<li>기능성: 복수 유저의 요청에 대응하거나 대용량의 데이터를 저장하고, 고속으로 검색하는 기능을 제공</li>
<li>신뢰성: 많은 요청에 대응 가능하도록 만들어져 있음. 일부는 컴퓨터 여러 대를 두고, 소프트웨어를 통해 확장성과 부하 분산을 구현. 이를 클러스터 구성 또는 스케일 아웃이라고 부름. </li>
</ul>
<h2 id="2강-다양한-데이터베이스">2강. 다양한 데이터베이스</h2>
<ol>
<li>계층형 데이터베이스</li>
<li>관계형 데이터베이스: <strong>관계대수</strong>에서 착안하여 고안한 데이터베이스. 표 형식 데이터를 저장하는 형태의 데이터 베이스</li>
<li>객체지향 데이터베이스: ‘가능하면 객체 그대로의 데이터베이스를 데이터로 저장하는 것’</li>
<li>XML 데이터베이스</li>
<li>KVS(키-밸류 스토어)</li>
</ol>
<h2 id="3강-데이터베이스-서버">3강. 데이터베이스 서버</h2>
<p>많은 RDBMS가 클라이언트/서버 모델을 채택에 가동 중</p>
<h2 id="4강-hello-world-실행하기">4강. Hello World 실행하기</h2>
<ul>
<li>예약어와 데이터베이스 객체명은 대소문자를 구분하지 않음</li>
<li>데이터는 자료형으로 분류 가능</li>
<li>열은 하나의 자료형만 가질 수 있음</li>
</ul>
<h2 id="5강-테이블-구조-참조하기">5강. 테이블 구조 참조하기</h2>
<ul>
<li>INTEGER</li>
<li>CHAR: 고정 길이 문자열</li>
<li>VARCHAR: 가변 길이 문자열</li>
<li>DATE</li>
<li>TIME</li>
</ul>
<h2 id="6강-검색-조건-지정하기">6강. 검색 조건 지정하기</h2>
<p>행을 선택할 때는 WHERE 구를 사용하며, 열을 선택할 때는 SELECT 구를 사용</p>
<h2 id="7강-조건-조합하기">7강. 조건 조합하기</h2>
<ul>
<li>AND는 OR에 비해 우선 순위가 높음</li>
</ul>
<h2 id="8강-패턴-매칭에-의한-검색">8강. 패턴 매칭에 의한 검색</h2>
<ul>
<li>LIKE 술어를 사용하여 패턴 매칭으로 검색 가능</li>
<li>패턴을 정의할 때 사용할 수 있는 메타문자로는 %와 _가 있음</li>
<li>LIKE로 %나 _를 검색하기 위해서는 ‘%’, ‘_’와 같이 \를 앞에 붙임</li>
<li>‘의 이스케이프 : It’s &gt; ‘It’’s’, ‘ &gt; ‘’’’</li>
</ul>
<h2 id="9강-정렬---order-by">9강. 정렬 - ORDER BY</h2>
<p>검색 결과의 행 순서를 변경 가능</p>
<h2 id="10강-복수의-열을-지정해-정렬하기">10강. 복수의 열을 지정해 정렬하기</h2>
<p>ORDER BY 구를 사용하지 않을 시, 같은 값을 가진 행의 순서는 데이터베이스 서버의 당시 상황에 따라 어떤 순서로 행을 반환할지 결정함. 따라서, 언제나 같은 순서로 결과를 얻고 싶다면 반드시 ORDER BY 구로 순서를 지정해야 함.</p>
<h2 id="11강-결과-행-제한하기---limit">11강. 결과 행 제한하기 - LIMIT</h2>
<p>SELECT 열명 FROM 테이블명 LIMIT 행수 OFFSET 위치</p>
<h2 id="12강-수치-연산">12강. 수치 연산</h2>
<ul>
<li>이름에 ASCII 문자 이외의 것을 포함할 경우 더블쿼트로 둘러싸서 지정</li>
<li>더블쿼트로 둘러싸면 명령 구문을 분석할 때 데이터베이스 객체의 이름이라고 간주하며, 싱글쿼트로 둘러싸면 문자열 상수라고 간주함</li>
<li>WHERE 구 &gt; SELECT 구 순서로 처리. 이에 따라 SELECT 구에서 지정한 별명은 WHERE 구 안에서 사용 불가</li>
<li>ORDER BY는 서버에서 가장 나중에 처리되므로 SELECT에서 사용한 별명을 ORDER BY에서도 사용 가능</li>
</ul>
<h2 id="13강-문자열-연산">13강. 문자열 연산</h2>
<ul>
<li>CHAR_LENGTH: 문자열 길이를 계산해 돌려주는 함수</li>
<li>OCTET_LENGTH: 문자열의 길이를 바이트 단위로 계산해 돌려주는 함수</li>
<li>문자열 데이터의 길이는 문자세트에 따라 달라짐(문자세트별로 바이트 계산 기준이 다르기 때문)</li>
</ul>
<h2 id="14강-날짜-연산">14강. 날짜 연산</h2>
<ul>
<li>날짜 데이터는 서식 지정 가능</li>
</ul>
<h2 id="15강-case-문으로-데이터-변환하기">15강. CASE 문으로 데이터 변환하기</h2>
<ul>
<li>COALESCE:  주어진 인수 가운데 NULL이 아닌 값에 대해서는 가장 먼저 지정된 인수의 값을 반환하고, NULL 값은 두번 째 지정된 인수의 값을 반환함</li>
<li>검색 CASE 문
<img src="https://velog.velcdn.com/images/numver_se/post/4a7753e6-a0c0-4833-aa9e-6ae097f519eb/image.png" alt=""></li>
<li>단순 CASE 문
<img src="https://velog.velcdn.com/images/numver_se/post/eb23a1ec-f127-49c8-8632-780670fb0275/image.png" alt=""></li>
<li>단순 CASE 문은 특성상 = 연산자로만 비교 가능하여 NULL 값이 비교 불가능함</li>
<li>CASE 문에서 ELSE를 생략할 경우, ELSE NULL이 됨. ELSE를 생략하면 상정한 것 이외의 데이터가 왔을 때 NULL이 반환되므로 ELSE를 생략하지 않고 지정하는 편이 나음</li>
</ul>
<h2 id="16강-행-추가하기---insert">16강. 행 추가하기 - INSERT</h2>
<p>INSERT INTO 테이블명 VALUES (값1, 값2, …)</p>
<h2 id="17강-삭제하기---delete">17강. 삭제하기 - DELETE</h2>
<p>DELETE FROM 테이블명 WHERE 조건식</p>
<h2 id="18-데이터-갱신하기---update">18. 데이터 갱신하기 - UPDATE</h2>
<p>UPDATE 테이블명 SET 열1 = 값1, 열2 = 값2, … WHERE 조건식</p>
<ul>
<li>ORACLE에서는 SET 구에 기술한 식의 순서가 처리에 영향을 주지 않지만, MySQL에서는 SET 구에 기술된 순서로 갱신 처리가 일어나므로 MySQL의 경우, 갱신식 안에서 열을 참조할 때는 처리 순서를 고려할 필요가 있음</li>
</ul>
<h2 id="19강-물리삭제와-논리삭제">19강. 물리삭제와 논리삭제</h2>
<ul>
<li>물리삭제: SQL의 DELETE 명령을 사용해 직접 데이터를 삭제하자는 사고방식</li>
<li>논리삭제: 테이블에서 실제로 행을 삭제하는 대신, UPDATE 명령을 이용해 ‘삭제플래그’의 값을 유효하게 갱신해두자는 발상에 의한 삭제방법</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Question Answering]]></title>
            <link>https://velog.io/@numver_se/d</link>
            <guid>https://velog.io/@numver_se/d</guid>
            <pubDate>Sun, 29 May 2022 04:54:46 GMT</pubDate>
            <description><![CDATA[<h2 id="goal-of-qa">Goal of QA</h2>
<blockquote>
<p><em>질문에 natural language로 자동으로 답하는 시스템 구축하는 것</em></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/numver_se/post/53a41800-bb36-45bc-b8a6-99571f577180/image.png" alt=""></p>
<p>문제에는 굉장히 다양한 유형이 있으며, QA를 통해 우리는 실생활에서 굉장히 유용한 어플리케이션을 사용할 수 있습니다.</p>
<p>예를 들어, 구글에 세계에서 가장 깊은 호수가 무엇인가요?를 검색하면 단답형으로 호수의 이름이 나옵니다.
<img src="https://velog.velcdn.com/images/numver_se/post/cc38adcd-5322-4c8b-bdee-f53e31ecda84/image.png" alt="">
그러나 만약, 코로나19로 부터 나를 어떻게 보호할 수 있죠?를 검색하면 CDC 기사를 요약하여 단락으로 어떻게 해야하는 지 방법을 알려줍니다.
<img src="https://velog.velcdn.com/images/numver_se/post/b0acee89-a7bd-44a5-8c66-359e72ac08a4/image.png" alt=""></p>
<h3 id="reading-comprehension">Reading Comprehension</h3>
<p><img src="https://velog.velcdn.com/images/numver_se/post/5d37ffd3-dd47-41d4-978e-166f1c973eca/image.png" alt="">
reading comprehension이 중요한 이유</p>
<ul>
<li>컴퓨터 시스템이 인간의 언어를 얼마나 잘 이해하는지 평가하기 위한 매우 중요한 테스트 베드</li>
<li>다른 NLP task도 reading comprehension 문제로 단순화 가능
<img src="https://velog.velcdn.com/images/numver_se/post/bb4ebbe9-c6a8-4dec-a57a-e08cbc26f7f3/image.png" alt=""></li>
<li>정보추출: 텍스트의 모든 부분의 relevant 계산하여 정답 추출</li>
<li>Semantic Role Labling: 한 문장 내에서의 단어의 역할 식별. 의미론적 역할 관계를 모두 구하여 독해력 상승.</li>
</ul>
<h3 id="squad-stanford-question-answering-dataset">SQuAD (Stanford Question Answering Dataset)</h3>
<p><strong><em>&quot;답은 지문에 있어. 찾아봐&quot;</em></strong></p>
<p>SQuAD: 100k annotated (passage, question, answer) triples
<img src="https://velog.velcdn.com/images/numver_se/post/42f2585d-d4ba-4332-b862-2467098503e6/image.png" alt=""></p>
<ul>
<li><p>Passage는 영어 위키피디아에서 가져온 것으로, 100~150 단어로 구성되어 있습니다.</p>
</li>
<li><p>Questions는 크라우드소싱 인력들이 만들었으며,</p>
</li>
<li><p>Answer은 Passage 속 하위 시퀀스로 구성되었습니다.</p>
</li>
<li><p>Evaluation
exact match : 3개 중 하나로 나왔으면 1, 아니면 0으로 binaray accuracy.
f1 score : 단어 단위로 구한 F1-score 3개 중 max one 을 per-question F1-scroe로 두고 전체 macro average</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/numver_se/post/fb45d607-b9d2-4a5e-8787-3bab6fe8b0af/image.png" alt=""></p>
<h2 id="neaural-models-for-reading-comprehension">Neaural Models for reading comprehension</h2>
<p><img src="https://velog.velcdn.com/images/numver_se/post/51a8c0d3-8aaa-4fbd-81f1-caf897345580/image.png" alt=""></p>
<h3 id="1-bidaf">1. BiDAF</h3>
<h4 id="01-character-embedding-layer">01. Character Embedding Layer</h4>
<p>Character Embedding Layer 에서는 charCNN 을 사용하여 각 단어를 vector space에 mapping합니다.</p>
<ul>
<li>character에 ID vector를 부여하고 CNN에 넣어서 word를 예측하는 방식으로 학습</li>
<li>CNN output을 pooling으로 차원을 줄여 embedding으로 사용</li>
<li>$$d$$ dimension으로 embedding</li>
</ul>
<h4 id="02-word-embedding-layer">02. Word Embedding Layer</h4>
<p>pre-trained word embedding model(GloVe)로 word를 vector로 만들어줍니다.</p>
<ul>
<li>$$d$$ dimension으로 embedding</li>
</ul>
<h4 id="03-contextual-embedding-layer">03. Contextual Embedding Layer</h4>
<p>char embedding과 word embedding을 concatenate한 후 2 layer highway network를 통과시켜 양 방향의 문맥이 모두 고려된 contextualized representation이 나오고, 어텐션 레이어에 넣기위한 준비가 완료됩니다.</p>
<ul>
<li><p>word 주변의 contextual cues(문맥적 단서)를 사용하여 단어의 embedding을 재정의</p>
</li>
<li><p>BiLSTM을 통해 주변 문맥을 파악할 수 있게 함</p>
</li>
<li><p>forward, backward output을 concatenate하므로 dimension = $$2d$$</p>
<blockquote>
<p>$$i$$ = context words, $$j$$ = query words
$$c$$ = Context의 context matrix, $$q$$ = Query의 context matrix where $$c,q \in {R^{2d \times i}},{R^{2d \times j}}$$</p>
</blockquote>
</li>
<li><p>matrix에 vector가 행으로 쌓인 것이 아니라 열로 쌓인 것을 주의, 즉 $$m$$번째 열 = $$m$$번째 단어</p>
</li>
</ul>
<h4 id="04-attention-flow-layer">04. Attention Flow Layer</h4>
<p>Attention layer 에서는 Query to Context, Context to Query 이렇게 양방향으로 attention 이 일어나게 됩니다. 즉, Query와 Context 를 쌍으로 묶어서 Attention 을 학습하는곳입니다.</p>
<ul>
<li>Query to Context : Context의 어떤 정보다 Query 와 관련이 있는지</li>
<li>Context to Query : Query 의 어떤 정보가 Context 와 관련이 있는지</li>
</ul>
<p>query 와 context(=passage) 를 single feature vector로 요약하지 않고, query 와 context 를 연결시킨다는 특징이 있습니다.</p>
<p>그렇다면 이 attention은 어떻게 양방향으로 일어날수 있을까요? </p>
<p>** similarity matrix **
이 양방향 attention을 위해 shared matrix S를 이용하며, $$S_ij$$는 i-th context word와 j-th query word의 similarity를 의미합니다.</p>
<ul>
<li>Shared matrix S 의 element 값은 &#39;알파&#39; 라는 function을 거쳐서 나옴</li>
<li>알파 function은 c와 q, c와 q를 element-wise 곱해서 나온 세개의 벡터를 concat 한 후 linear transform 해서 구함</li>
</ul>
<blockquote>
<p>similarity matrix $${S_{tj}}$$ = $$\alpha ({c_{:i}},{q_{:j}})$$ where $$S \in {R^{i \times j}}$$</p>
<ul>
<li>$${S_{tj}} \in R$$ 는 t-th context word와 j-th query word의 similarity 의미</li>
<li>$${c_{:i}}$$ = context의 i번째 word vector, $${q_{:j}}$$ = query의 j번째 word vector</li>
<li>$$\alpha (c, q)$$ = $${w_{S}^{T}} [h; u; h \odot u]$$</li>
<li>$$\alpha$$ = a trainable scalar function, similarity를 encoding하는 역할</li>
<li>$${w_{S}^{T}}$$ = trainable weight vector, where $${w_{S}^{T}} \in {R^{6d}}$$</li>
</ul>
</blockquote>
<p>** Context2Query Attention **
<img src="https://velog.velcdn.com/images/numver_se/post/cf7f900d-02c0-4c67-8b95-64aba01c7e92/image.png" alt=""></p>
<p>query words 중에서 어떤 query word가 각각의 context word와 가장 관계가 있는지 signify</p>
<blockquote>
<p>$${a_{t}}$$ = $$softmax({S_{t:}}) \in {R^{J}}$$
$${S_{t:}}$$ = t-th context word와 query word들의 similarity를 의미
t-th context word와 query word의 attention weight
$$\sum {a_{tj}} = 1$$ for all t
similarity $${S_{tj}}$$에 softmax를 취해줬으므로 유사성이 큰 weight만 값이 커지게 됨
attended query vector $$\widetilde{U_{:t}}$$ = $$\sum {a_{tj}}{U_{:j}}$$, where $${U_{:j}} \in {R^{2d \times 1}}$$</p>
</blockquote>
<p>j-th query word에 t-th context와의 attention weight를 곱하는 것
context가 총 개의 단어이므로, $$\widetilde{U} \in {R^{2d \times T}}$$
$${a_{t}}$$는 유사성이 큰 것만 값이 크므로, 모든 쿼리의 단어들에 weight를 곱해서 더할 경우 $$\widetilde{U_{:t}}$$는 유사성이 큰 query의 단어들만 반영이 됨
즉, t-th context word 입장에서 유사성이 높은 query의 특성을 알게 됨
따라서, $$\widetilde{U}$$는 context 전체의 attended query vector를 담고 있음
t-th context word가 어떤 query word와 가까운지를 알려줌
t-th context word를 유사성이 높은 query word로 표현함</p>
<p><strong>Query2Context Attention</strong>
<img src="https://velog.velcdn.com/images/numver_se/post/d439c9ef-3882-403d-839e-1774a4e92b62/image.png" alt=""></p>
<p>context words 중에서 어떤 것이 각각의 query word와 가장 관계 있는지 signify</p>
<p>따라서, query에 대답하는 것에서 중요한 역할
$$b$$ = $$softmax({max_{col}}(S))$$, where $$b \in {R^{T}}$$</p>
<p>$${max_{col}}$$ : 각 row에서 가장 큰 값을 뽑아냄
softmax를 취해줬으므로 $$b = (b_{1}, b_{2}, ..., b_{T})$$에서 값이 큰 $$b_{t}$$만 살아남음
attended context vector $$\widetilde{h}$$ = $$\sum {b_{t}}{H_{:t}} \in {R^{2d \times 1}}$$</p>
<p>weight $$b_{t}$$를 곱해서 값이 더해지면, similarity가 큰 t-th context word만 값이 더해짐
즉, similarity가 큰 context word만 살아남게 되므로 query 입장에서 중요한 word만 살아남게 됨
context에서 가장 중요한 vector의 가중합을 의미
$$h$$를 $$T$$개 나열하여 $$\widetilde{H} \in {R^{2d \times T}}$$</p>
<p>3.4.3 query-aware representation of each context word
$${G_{:t}}$$ = $$\beta ({H_{:t}}, \widetilde{U_{:t}}, \widetilde{H_{:t}})$$
$${G_{:t}} \in {R^{8d}}$$ = t-th context vector
$$G \in {R^{8d \times T}}$$ .
$$\beta(h, \widetilde{u}, \widetilde{h})$$ = $$[h;\widetilde{u};h \odot \widetilde{u};h \odot \widetilde{h}]$$</p>
<h4 id="05-modeling-layer">05. Modeling Layer</h4>
<p>Query와 Context간의 Interaction을 학습하기 위해 Bi-LSTM을 사용한다. </p>
<ul>
<li>RNN을 통하여 context scan</li>
<li>위에서 구한 $$G$$가 input</li>
<li>query와 context word의 interaction을 파악
BLSTM 사용</li>
</ul>
<h4 id="006-output-layer">006. Output Layer</h4>
<p>마지막으로 Output을 Predict하는 과정이다. Context 내 어떤 문장이 정답이 포함된 문장인가를 찾아야 하므로, 이 정답을 표기하기 위해 Start(정답 문장의 시작 단어)와 End(정답 문장의 마지막 단어)를 찾는다. 다시말해, Output에서는 Modeling Layer에서의 Forward Output과 Backward Output을 Input으로 받아 Start 토큰과 End 토큰을 찾게 된다.</p>
<ul>
<li>query에 대한 answer을 output</li>
<li>질문에 대한 대답으로 paragraph의 sub-phrase를 찾아야함</li>
<li>paragraph안에 있는 start, end의 indices 를 predict 해서 phrase를 찾음<blockquote>
<p>$${p_{1}}$$ = $$softmax({w_{p_{1}}^{T}}[G;{M^{1}}])$$
$${p_{2}}$$ = $$softmax({w_{p_{2}}^{T}}[G;{M^{2}}])$$
$${M^{1}}, {M^{2}} \in {R^{2d \times T}}$$는 각각 LSTM의 forward, backward output</p>
</blockquote>
</li>
</ul>
<h3 id="2-bert">2. BERT</h3>
<p>BERT에서는 Transformer구조 중 Encoder만 사용하고 있다. (Base모델: 12개, Large모델: 24개) 조금 더 자세하게 설명하자면, Input으로 Word-piece Model을 사용하여 Encoding을 한다. 이러한 Word-piece encoding은 Transformer에 그대로 입력으로 들어가게 되고, Encoder를 이용해서 Context와 연관이 있는 정보만 남기고자 하는 의도이다.</p>
<p>NLP의 많은 Task들은 이후 출현하는 단어의 확률을 이전 단어에 기반하여 순차적으로 예측해야 하는 특성을 가지고 있다. 따라서 Statistical LM은 Bidirectional하게 구축할 수 없다는 특성을 가지게 되는데, BERT에서는 이를 다른 형태로 전환해서 Bidirectional이 가능하게 한다.</p>
<p>MLM(Masked Laguage Model)
기존 Language Model의 경우 주어진 단어 시퀀스를 통해 그 다음 단어를 예측하는 Task로 학습합니다. 하지만 이때 현재 입력 단어 이후의 단어들의 정보를 모델에게 알려줄 수 없습니다.(left-to-right, 단방향)</p>
<p>그에 반해 MLM(Masked Laguage Model)은 문장에서 무작위 토큰에 빈칸(MASK)을 해놓으면 빈칸(Mask)에 맞는 단어를 찾는 것이 목표로 합니다. Transformer encoder에 특정 토큰에 MASK 처리를 한 문장을 한번에 넣고 MASK 단어의 정답을 찾게 하도록 합니다. 이는 Mask 단어의 left, right context를 모두 활용해야 하므로 deep-bidirectional 학습을 가능하게 합니다.</p>
<p>MLM에 필요한 학습 데이터를 만드는 절차는 아래와 같습니다.</p>
<p>전체 학습 데이터 토큰의 15%을 마스킹 대상 토큰으로 선정합니다.
마스킹 대상 토큰 가운데 80%는 [Mask] 토큰으로 만듭니다. (my dog is hairy -&gt; my dog is [MASK])
마스킹 대상 토큰 가운데 10%는 토큰을 그대로 둡니다. (my dog is hairy -&gt; my dog is hairy)
마스킹 대상 토큰 가운데 10%는 토큰을 랜덤으로 다른 토큰으로 대체합니다. (my dog is hairy -&gt; my dog is apple)
MLM은 마스킹 대상 토큰을 예측하는 pre-training task를 수행하게 됩니다.</p>
<p>Q. 왜 모든 마스킹 대상 토큰을 마스킹하지 않고 일부는 그대로 두거나 다른 단어로 바꾸나요?
A. [Mask] 토큰은 pre-train 과정에서만 사용하고, fine-tuning 과정에서는 사용하지 않습니다. 이는 두 과정 사이의 불일치(mismatch)를 유발하여 downstream task를 수행할 때 문제가 생길 수 있습니다. 따라서 마스킹 대상 토큰을 랜덤으로 두거나 그대로 둬서 모델이 모든 단어 사이의 의미적, 문법적 관계를 세밀히 살필 수 있게 합니다.</p>
<p>NSP(Next Sentence Prediction)
두 개의 문장이 이어지는 문장인지 모델이 맞추도록 하는 Task입니다. </p>
<p>Question Answering(QA)나 Natural Language Infrence(NLI)와 같은 Task에서는 두 문장 사이의 관계(Relationship)을 이해하는 것이 중요합니다. 하지만 기존 Languauge Model에서는 문장 사이의 관계를 학습시키기 어려웠습니다. 이를 해결하고자 BERT는 NSP를 통해 문장 사이의 관계를 모델이 이해할 수 있도록 합니다.</p>
<p>NSP에 필요한 학습 데이터를 만드는 절차는 아래와 같습니다.</p>
<p>모든 학습 데이터는 1건당 문장 두개로 구성된 문장 쌍으로 구성합니다.
학습 문장쌍 데이터 중 50%는 동일한 문서에서 실제 이어지는 문장쌍을 선정합니다. 정답 Label로는 참(IsNext)를 부여합니다.
나머지 50%는 서로 다른 문서에서 랜덤으로 뽑아 문장쌍을 구성합니다. (관계가 없는 문장 만들기) 정답 Label로는 거짓(NotNext)를 부여합니다.
이제 모델에서는 문장 쌍이 참(IsNext)인지 판별하는 Task를 수행하게 됩니다.
앞서 살펴본 BERT 구조를 보면, 맨 앞의 출력 토큰이 C입니다. 해당 C 토큰으로 문장 쌍이 참인지 판별하는 NSP Task를 수행하는 것입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Neural Collaborative Filtering]]></title>
            <link>https://velog.io/@numver_se/Neural-Collaborative-Filtering-qd37719c</link>
            <guid>https://velog.io/@numver_se/Neural-Collaborative-Filtering-qd37719c</guid>
            <pubDate>Wed, 29 Sep 2021 12:47:45 GMT</pubDate>
            <description><![CDATA[<h2 id="abstract">Abstract</h2>
<p>collaborative filtering을 모델링하기 위해서 user와 item의 상호작용이 필요하며, user-item 공간의 latent feature들의 내적곱을 통해 두 관계를 표현하고 추천시스템에서 널리 사용되는 MF에 의존한다. 그러나 MF는 linear 방식으로, user와 item의 관계를 학습함에 있어 한계를 가진다. 
비선형적인 특징을 모델에서 학습하기 위해, user과 item 간의 interaction을 학습할 수 있는 ㅂ방법론을 제안한다. 다시말해, 뉴럴넷 기반의 Neural Collaborative Filtering(NCF)를 사용하여 실제 데이터 셋에서 좋은 성능을 보인 일반화된 MF 모델을 제안한다.</p>
<h2 id="preliminaries">Preliminaries</h2>
<p>neural collaborative filtering의 배경 설명은 다음과 같다. </p>
<h3 id="leaning-from-implicit-data">Leaning from implicit data</h3>
<p>user과 item의 상호작용이 있을 경우 $$y_{u,i} = 1$$로 설정하고, 없으면 $$y_{u,i} = 0$$으로 설정한다. 상호작용은 user가 item을 열람했거나 구매했거나 등의 암시적인 정보를 의미하며, 이는 명시적인 선호를 의미하지는 않는다. 다시말해, $$y_{u,i}$$의 값은 user가 item을 선호한다거나 비선호한다는 의미가 아니다. u따라서 추천은 $$y_{u,i}$$가 1이 될 확률, 다시말해 user와 item의 관련 정도를 예측하는 문제라고 할 수 있다. </p>
<p>θ를 학습시키기 위한 방법은 크게 두가지가 존재한다.</p>
<ul>
<li>Pointwise learning($$L_1$$)</li>
<li>Pairwise learning($$L_2$$)</li>
</ul>
<blockquote>
<h4 id="pointwise-learning">pointwise learning</h4>
<p>regression 문제에 활용되고 실제값과 예측값의 차이를 최소화</p>
</blockquote>
<blockquote>
<h4 id="pairwise-learning">pairwise learning</h4>
<p>관측값이 관측되지 않은 값보다는 큰 값을 갖도록 하여 두 값의 마진을 최대화</p>
</blockquote>
<p>본 논문에서 제안하는 Neural Collborative Filtering는 뉴럴 넷 기반이므로 두가지 방법을 모두 사용함</p>
<h3 id="matrix-factorization">Matrix factorization</h3>
<p><img src="https://images.velog.io/images/numver_se/post/0d6cbf24-a879-4373-aec1-9281f2bf4978/image.png" alt="">
MF는 ranking loss가 커지는 결과를 초래하기에, 단순히 fixed inner product를 사용하면 복잡한 user와 item 간의 상호작용을 latent space에서 측정할 때 문제가 발생한다.</p>
<h2 id="neural-collborative-filtering">Neural Collborative Filtering</h2>
<h3 id="general-framework">general framework</h3>
<p>GMF는 MF와 크게 다르지 않으나 내적이 아닌 element-wise product가 이뤄지고, edge weights와 활성화함수를 사용했다는 점에서 차이를 갖는다. 다시말해, GMF는 user와 item의 latent feature에 element-wise product를 한 후, Linear layer와 활성화 함수를 거쳐 기존의 MF보다 비선형성이 강해져 더욱 다양한 관계를 표현할 수 있다.</p>
<p>NCF 모델에서는 2가지 벡터(user, item)를 입력으로 받아 두 벡터를 concat하여 입력 벡터를 구성한다. user와 item간의 복잡한 상호작용 관계를 학습하기 위해 hidden layer를 여러개를 거쳐 비선형적인 딥러닝의 장점이 모델에 반영된다.</p>
<p>NeuMF는 GMF와 MLP 기반의 MF의 output을 서로 concat 한 후, Linear Layer와 활성화 함수를 거치는 방식으로 학습이 진행된다. 이 결과로 MF의 선형성과 DNN의 비선형성을 결합함으로써 유저와 아이템의 관계를 더욱 풍부하게 표현할 수 있다.</p>
<p><img src="https://images.velog.io/images/numver_se/post/a052eb10-f088-422f-aa6b-2354cae521e9/image.png" alt=""></p>
<h2 id="experiments">Experiments</h2>
<h3 id="performance-comparison">Performance Comparison</h3>
<p><img src="https://images.velog.io/images/numver_se/post/5212c0db-5829-435e-80c7-3dc454586c03/image.png" alt="">
각 성능 지표의 Top-K를 의미하며, 이 때에도 NeuMF가 가장 좋은 성능을 보입니다.</p>
<h3 id="log-loss-with-negative-sampling">Log Loss with Negative Sampling</h3>
<p><img src="https://images.velog.io/images/numver_se/post/611dd3ba-7896-48c9-baa3-d604332f60ad/image.png" alt="">
Iteration에 따른 각 history와 negative sampling ratio에 대한 성능 평가표입니다.</p>
<h3 id="is-deep-learning-helpful">Is Deep Learning Helpful?</h3>
<p><img src="https://images.velog.io/images/numver_se/post/527c6d95-b00c-49e4-a174-b193782521d9/image.png" alt="">
해당 성능 평가표는 마지막 hidden layer의 capacity인 factor와 layer-depth에 따른 각 성능 지표를 보여주며, layer가 깊어질수록 높은 성능을 보이고 있음을 알 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SVM]]></title>
            <link>https://velog.io/@numver_se/SVM</link>
            <guid>https://velog.io/@numver_se/SVM</guid>
            <pubDate>Sat, 31 Jul 2021 00:34:48 GMT</pubDate>
            <description><![CDATA[<h3 id="🎉-introduction">🎉 Introduction</h3>
<p><strong>SVM</strong>: 매우 강력하고 비선형 분류, 회귀, 이상치 탐색에도 사용할 수 있는 다목적 머신러닝 모델</p>
<h4 id="51-선형-svm-분류">5.1 선형 SVM 분류</h4>
<ul>
<li><strong>SVM Classification</strong>는 클래스 사이에서 가장 폭이 넓은 도로를 찾는 것으로 생각 할 수 있음.</li>
<li>라지 마진 분류(large margin classification) 이라고도 불림.</li>
</ul>
<p><img src="https://images.velog.io/images/numver_se/post/79b58e5c-a5c8-4e58-ad69-9a9681ec0e53/image.png" alt=""></p>
<ul>
<li><p>도로의 폭은 도로 경계에 위치한 샘플에 의해 전적으로 결정되며, 이 샘플을 서포트 벡터(Support Vector)라고 함</p>
</li>
<li><p>SVM은 특성의 스케일에 민감하기에, 특성의 스케일을 조정하면(StandardScaler를 사용하면) 결정 경계가 훨씬 좋아짐.</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/numver_se/post/f83898c1-6864-4232-9bdb-d97146c1e5d5/image.png" alt=""></p>
<h4 id="511-소프트-마진-분류">5.1.1 소프트 마진 분류</h4>
<blockquote>
<p><strong>하드 마진 분류(Hard Margin Classification)</strong>: 모든 샘플이 도로 바깥쪽으로 올바르게 분류되어 있는 것</p>
</blockquote>
<ul>
<li>데이터가 선형적으로 구분되어 있어야 함</li>
<li>이상치에 민감함
<img src="https://images.velog.io/images/numver_se/post/8cfa6eaa-7128-4509-b2fa-842e297e88d1/image.png" alt=""></li>
</ul>
<p>🧨 위 그림과 같은 문제를 피하려면 <strong>유연한 모델</strong>이 필요!</p>
<p>👉 즉, <strong>라지 마진 (도로의 폭을 가능한 한 넓게 유지하는 것) 과 마진 오류(margin violation : 샘플이 도로 중간이나 심지어 반대쪽에 있는 경우) 사이에 적절한 균형을 잡아야 함</strong>.</p>
<blockquote>
<p>💥 소프트 마진 분류(Soft Margin Classification)</p>
</blockquote>
<ul>
<li>사이킷런의 SVM모델에서는 C하이퍼파라미터를 사용해 이 균형을 조절할 수 있음 </li>
<li>C값을 줄이면 도로의 폭이 넓어지지만, 마진 오류도 커집니다.</li>
</ul>
<h4 id="52-비선형-svm분류">5.2 비선형 SVM분류</h4>
<p>일반적으로 선형적으로 분류할 수 없는 데이터 셋이 더 많음. </p>
<ul>
<li>비선형 데이터 셋을 다루는 한가지 방법은 <strong>다항 특성</strong>과 같은 특성을 더 추가하는 것</li>
</ul>
<p><img src="https://images.velog.io/images/numver_se/post/66353318-c755-4ab8-8676-ddd11de85f9b/image.png" alt=""></p>
<p>왼쪽 그림은 선형적으로 구분이 안되지만 $x_2 = {(x_1)}^2$을 추가하여 만들어진 2차원 데이터셋은 선형적으로 구분이 가능해짐.</p>
<h4 id="521-다항식-커널">5.2.1 다항식 커널</h4>
<p>다항식 특성을 추가하는 것은 간단하지만, 한계가 있음. </p>
<ul>
<li>낮은 차수의 다항식은 매우 복잡한 데이터셋을 잘 표현하지 못함</li>
<li>높은 차수의 다항식은 굉장히 많은 특성을 추가하므로 모델을 느리게 함 </li>
</ul>
<h4 id="522-유사도-특성-추가">5.2.2 유사도 특성 추가</h4>
<p>비선형 특성을 다루는 또 다른 기법은, 각 샘플이 특정 랜드마크(landmark) 와 얼마나 닮았는지 측정하는 <strong>유사도 함수</strong>(similarity function) 로 계산한 특성을 추가하는 것</p>
<blockquote>
<p>Gaussian RBF
$$ϕγ(x,ℓ)=exp(−γ∥x−ℓ∥2)$$</p>
</blockquote>
<ul>
<li>이 함수의 값은 0부터 1까지 변화하며 종모양을 가짐</li>
<li>gamma는 0보다 커야 되며, 값이 작을수록 폭이 넓은 종 모양이 나타남</li>
</ul>
<p><img src="https://images.velog.io/images/numver_se/post/8b951865-d450-440e-aae4-a35de48ff6dc/image.png" alt=""></p>
<h4 id="523-가우시안-rbf-커널">5.2.3 가우시안 RBF 커널</h4>
<p>유사도 특성도 머신러닝 알고리즘에 유용하게 사용될 수 있음. </p>
<ul>
<li>그러나 추가 특성을 모두 계산하려면 연상 비용이 많이드는데, 특히 훈련 세트가 클 경우 더욱 그러함 </li>
<li>가우시안 RBF 커널을 추가 하는 것으로 같은 효과를 얻을 수 있음
<img src="https://images.velog.io/images/numver_se/post/b04793cb-8f94-451a-ae7a-c2e0a425265e/image.png" alt=""></li>
</ul>
<blockquote>
<p>🔔 가우시안 RBF 커널</p>
</blockquote>
<ul>
<li>gamma가 높아지면? 
종 모양 그래프가 좁아져서 각 샘플의 영향 범위가 줄어, 경계가 데이터들을 따라 구불구불해짐</li>
<li>gamma가 낮아지면? 
샘플이 넓은 범위에 걸쳐 영향을 주므로 결정경계가 부드러워짐<blockquote>
<p>✔ 따라서, 모델이 과대적합일 경우엔 감소시켜야 되고 과소적합일 경우에는 증가시켜야 함</p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] git]]></title>
            <link>https://velog.io/@numver_se/git</link>
            <guid>https://velog.io/@numver_se/git</guid>
            <pubDate>Wed, 21 Jul 2021 17:23:23 GMT</pubDate>
            <description><![CDATA[<h2 id="💡-깃git이란">💡 깃(git)이란?</h2>
<blockquote>
<p>컴퓨터 파일의 변경사항을 추적하고 여러 명의 사용자들 간에 해당 파일들의 작업을 조율하기 위한 분산 버전 관리 시스템</p>
</blockquote>
<h3 id="왜-필요할까">왜 필요할까?</h3>
<p>Git은 <code>버전 관리 시스템(VCS)</code> 이다. 그렇다면 버전 관리 시스템을 왜 써야할까? </p>
<p><img src="https://images.velog.io/images/numver_se/post/940d6640-f129-4ea3-8d9a-abab6224fcf7/image.png" alt="">
과제를 하다보면 완성, 진짜 완성, 진짜진짜 완성, 최종 등으로 다양한 파일들이 만들어진다. 이런 식으로 파일들이 늘어나다 보면 어떤 내용이 수정되었는지 확인하기 어렵고, 변경되기 전 자신이 원하는 부분을 되돌리기도 힘들다. </p>
<p>이런 문제를 해결하는 것이 바로 <strong>버전 관리 시스템(VCS)</strong>이다. </p>
<blockquote>
<p><strong>버전 관리 시스템</strong>이란, 시간에 따라 파일의 변화를 기록하여 필요한 순간에 특정 시점의 버전을 다시 꺼내올 수 있도록 하는 시스템을 말한다.</p>
</blockquote>
<p>이를 통해 우리는 최종본을 만들기까지 어떤 과정을 거쳤는지 지난 과정들을 확인할 수 있고, 과정 도중 오류가 생기면 이전 버전으로 돌아갈 수 있다.</p>
<p>또한, git은 <strong>여러 개발자들이 협업할 수 있도록 돕는 기능</strong>을 가지고 있다. 개발할 때는 보통 프로그램을 기능별로 나누고 각 기능마다 여러 개발자들이 나누어 개발을 진행하는데, git을 이용하면 이렇게 나누어 작성된 코드를 하나로 모을 수 있다.</p>
<h3 id="👉-git-구조">👉 git 구조</h3>
<p><img src="https://images.velog.io/images/numver_se/post/505d2394-58a8-4c29-92ed-4069b9cfddc7/image.png" alt=""></p>
<ol>
<li><p><code>working directory</code> : 작업을 하는 프로젝트 디렉토리</p>
</li>
<li><p><code>staging area</code> : git add를 한 파일들이 존재하는 곳으로, 커밋을 하게 되면 staging area에 있는 파일들만 커밋에 반영</p>
<blockquote>
<p><strong>staging area가 필요한 이유는 무엇일까?</strong></p>
</blockquote>
<p>만약 <code>staging area</code> 가 없다면 원하는 것들만 선별적으로 커밋에 반영할 수 없음. </p>
<blockquote>
</blockquote>
<p>다음 커밋에 반영하고 싶지 않은 파일이 있을 수 있으므로, <strong>세밀한 버전 관리</strong>를 하기 위해 필요함.</p>
</li>
<li><p><code>repository</code> : working directory의 변경 이력들이 저장되어 있는 곳</p>
</li>
</ol>
<blockquote>
<p><strong>다시 정리하자면,</strong>
<img src="https://images.velog.io/images/numver_se/post/ec607ecd-3df5-475c-b048-cc10e1869438/image.png" alt=""></p>
</blockquote>
<ul>
<li>처음 코드 작성 시에는 파일이 working directory에 위치함.</li>
<li>git add 실행 시 staging area로 이동함</li>
<li>git commit -m &quot;커밋메시지&quot; 실행 시 로컬 레포지토리로 커밋</li>
<li>git reset 실행 시 저장된 기록으로 수정</li>
</ul>
<h3 id="👉-git-practice">👉 git-practice</h3>
<blockquote>
<p><strong>VSCode</strong> 단축키
터미널 보기 및 켜기 : <code>Ctrl+`</code></p>
</blockquote>
<h4 id="📌-git-기본-커맨드">📌 Git 기본 커맨드</h4>
<ol>
<li><p><code>git init</code> : 현재 디렉토리를 Git이 관리하는 프로젝트 디렉토리(working directory)로 설정하고 그 안에 레포지토리(.git 디렉토리)를 생성하는 커맨드</p>
</li>
<li><p><code>git config --global user.name &quot;사용자이름&quot;</code> : 현재 사용자 이름을 설정하는 커맨드</p>
</li>
<li><p><code>git config --global user.email &quot;사용자이름&quot;</code> : 현재 사용자의 이메일 주소를 설정하는 커맨드</p>
</li>
<li><p><code>git add [파일 이름]</code> : 수정 사항이 있는 특정 파일을 staging area에 올리는 커맨드. </p>
<blockquote>
<h4 id="git-add-">git add ~</h4>
<p><code>git add 디렉토리명</code> : add 뒤에 디렉토리명이 들어가면 해당 디렉토리 내에서 수정 사항이 있는 모든 파일들을 staging area에 올림
<code>git add .</code> : working directory 내의 수정 사항이 있는 모든 파일들을 staging area에 올림</p>
</blockquote>
</li>
<li><p><code>git reset [파일 이름]</code> : staging area에 올렸던 파일을 다시 내리는 커맨드</p>
</li>
<li><p><code>git status</code> : Git이 현재 인식하고 있는 프로젝트 관련 내용들을 출력하는 커맨드</p>
</li>
<li><p><code>git commit -m &quot;커밋 메시지&quot;</code> : 현재 staging area에 올라와 있는 것들을 커밋으로 남기는 커맨드</p>
</li>
</ol>
<h3 id="👉-branch">👉 Branch</h3>
<p>독립적으로 어떤 작업을 진행하기 위한 개념 </p>
<blockquote>
<h4 id="📌-왜-branch를-써야할까">📌 왜 Branch를 써야할까?</h4>
<p><img src="https://images.velog.io/images/numver_se/post/be1378d3-884d-4d35-8c5a-ab6154d75f37/image.png" alt=""></p>
</blockquote>
<ul>
<li><code>master</code> : 레포지토리를 만들고 커밋을 하면 자동으로 생기는 브랜치<blockquote>
</blockquote>
프로젝트를 진행하다 보면 <strong>딱 하나의 코드 관리 흐름으로만 순조롭게 진행할 수 있는 경우는 드물다</strong>. 대개는 여러 버전(새로운 기능 추가한 A 버전, 버그 수정한 B 버전…)으로 개발이 진행된다. <blockquote>
</blockquote>
이 경우, 두 개의 서로 다른 프로젝트를 진행하기 보다는 <strong>하나의 프로젝트 내에서 브랜치 두 개를 만드는 것이 효율적</strong>이다. 즉, 하나의 프로젝트에 두 개의 버전을 만드는 것이다. <blockquote>
</blockquote>
필요에 의해 만들어지는 <strong>각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행</strong>할 수 있다.</li>
</ul>
<h4 id="📌-branch-관련-커맨드">📌 Branch 관련 커맨드</h4>
<ol>
<li><p><code>git branch [새 브랜치 이름]</code> : 새로운 브랜치를 생성하는 커맨드</p>
</li>
<li><p><code>git branch -d [기존 브랜치 이름]</code> : 브랜치를 삭제하는 커맨드</p>
</li>
<li><p><code>git checkout -b [새 브랜치 이름]</code> : 새로운 브랜치를 생성하고 그 브랜치로 바로 이동하는 커맨드</p>
<blockquote>
<p>새 브랜치 이름 대신 기존 브랜치 이름이 들어가면 해당 브랜치로 이동</p>
</blockquote>
</li>
<li><p><code>git merge [기존 브랜치 이름]</code> : 현재 브랜치에 다른 브랜치를 merge(병합)하는 커맨드</p>
<blockquote>
<p>--abort 옵션을 붙이면 merge를 하다가 CONFLICT가 발생했을 때, 일단 merge 작업을 취소하고 이전 상태로 돌아감</p>
</blockquote>
</li>
</ol>
<hr>
<h3 id="👉-github-협업">👉 github 협업</h3>
<ol>
<li>github에서 repository 생성</li>
<li><img src="https://images.velog.io/images/numver_se/post/878afdec-1f9f-4b6b-8146-e914cdff99c2/image.png" alt=""></li>
<li>빨간 박스 안의 코드 입력 후 github 계정 연계
<img src="https://images.velog.io/images/numver_se/post/21d375c9-f777-40b4-bbdd-6ffccec10f06/image.png" alt="">
<img src="https://images.velog.io/images/numver_se/post/49c929ae-0418-4172-ada9-7cf3c674affd/image.png" alt=""></li>
<li>로컬로부터 push한 파일이 github에 올라와 있으며, 해당 커밋에서 어떤 변화들이 있었는지도 확인 가능
<img src="https://images.velog.io/images/numver_se/post/d50e3ebe-8680-45de-9fcb-e31f2daae51b/image.png" alt="">
<img src="https://images.velog.io/images/numver_se/post/f2c28e42-7503-4517-ae82-4789125344c5/image.png" alt=""></li>
</ol>
<h4 id="📌-github-관련-커맨드">📌 github 관련 커맨드</h4>
<ol>
<li><p><code>git push -u(or --set-upstream) origin master</code> : 로컬 레포지토리의 내용을 처음으로 리모트 레포지토리에 올릴 때 사용하는 커맨드</p>
</li>
<li><p><code>git push</code> : 로컬 레포지토리의 내용을 리모트 레포지토리에 올리는 커맨드</p>
</li>
<li><p><code>git pull</code> : 리모트 레포지토리의 내용을 로컬 레포지토리로 가져오는 커맨드</p>
</li>
<li><p><code>git clone</code> : [프로젝트 GitHub 상 주소]는 GitHub에 있는 프로젝트를 내 컴퓨터로 가져오는 커맨드</p>
</li>
</ol>
<hr>
<h4 id="reference">reference</h4>
<ol>
<li><a href="https://velog.io/@tataki26/Git-%EC%B4%9D-%EC%A0%95%EB%A6%AC">https://velog.io/@tataki26/Git-%EC%B4%9D-%EC%A0%95%EB%A6%AC</a></li>
<li><a href="https://backlog.com/git-tutorial/kr/stepup/stepup1_5.html">https://backlog.com/git-tutorial/kr/stepup/stepup1_5.html</a></li>
<li><a href="https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80">https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80</a></li>
<li><a href="https://m.blog.naver.com/khu94/221936184230">https://m.blog.naver.com/khu94/221936184230</a></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Wa]]></title>
            <link>https://velog.io/@numver_se/Wa</link>
            <guid>https://velog.io/@numver_se/Wa</guid>
            <pubDate>Mon, 21 Jun 2021 03:51:12 GMT</pubDate>
            <description><![CDATA[<p><strong>텍스트</strong>items = document.querySelectorAll(&#39;div.pf5lIe&#39;)</p>
<p>댓글내용 </p>
<p>Array.prototype.map.call(items, function(x) {return x.parentNode.parentNode.parentNode.parentNode.parentNode.children[1].innerText })</p>
<p>아이디</p>
<p>Array.prototype.map.call(items, function(x) {return x.parentNode.parentNode.parentNode.parentNode.children[0].children[0].textContent })</p>
<p>날짜</p>
<p>Array.prototype.map.call(items, function(x) {return x.parentNode.parentNode.innerText })</p>
<p>별점</p>
<p>Array.prototype.map.call(items, function(x) {return x.children[0].ariaLabel })</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[R-Transformer]]></title>
            <link>https://velog.io/@numver_se/R-Transformer</link>
            <guid>https://velog.io/@numver_se/R-Transformer</guid>
            <pubDate>Wed, 19 May 2021 16:34:19 GMT</pubDate>
            <description><![CDATA[<h2 id="rnn">RNN</h2>
<p><img src="https://images.velog.io/images/numver_se/post/2d1d0197-53d0-4cbd-b641-578b74960179/image.png" alt=""></p>
<blockquote>
<p>RNN은 그림처럼 순환하며 출력을 다시 입력으로 받는 모델입니다. RNN은 이런 순환성 때문에 기억을 가지는 모델이라고도 부르는데요, 문장을 이해하기 위해서는 맥락을 이해해야 하고 맥락을 이해하기 위해서는 이전의 결과가 다음의 결과에 영향을 미쳐야 합니다.  RNN은 다양한 곳에 유용하게 사용되는 모델이지만, 큰 문제를 가지고 있습니다.</p>
</blockquote>
<ul>
<li>첫번재 문제점은 장기의존성 문제입니다. RNN은 시점이 포함된 모델이고, RNN모델 학습시 백프로파게이션은 시점마다 이루어져야 합니다. 이로인해 RNN은 gradient vanishing and exploding problems이 쉽게 일어납니다. 이렇게 긴 문장에 대해서 RNN이 학습이 제대로 이루어지지 않는 문제를 장기의존성 문제라고 합니다. 즉, RNN은 시점이 길어질 수록 앞에 정보가 뒤로 충분히 전달되지 못합니다. <blockquote>
</blockquote>
</li>
<li>두번째 문제점은 병렬화가 불가능하다는 점입니다. 이전 분석 결과가 이번 분석에 영향을 미치기에, 순차적(직렬적)으로 연산을 실행해야하기 때문에 병렬화가 불가능합니다.</li>
</ul>
<p>이런 문제들 때문에 non-recurrent sequence모델이 많이 제안되어 왔습니다. 특히, multi-head attention을 가진 트랜스포머 모델 같은 모델이 장기의존성 문제를 capture하는 데에 효과적인 것으로 나타났습니다. 트랜스포머 모델이 장기의존성 문제에 효과적인 이유는 바로 Transformer의 multi-head attention 메커니즘을 통해 모든 위치를 시퀀스의 다른 위치에 직접 연결할 수 있어 정보가 중간 손실 없이 전달되기 때문입니다.</p>
<h2 id="transformer">Transformer</h2>
<blockquote>
<p>그러나 Transformer 역시 문제점이 있습니다. </p>
</blockquote>
<ul>
<li>Positional Embedding : 
효과가 제한적이고 상당한 설계 노력이 필요한 position embeddings 에 크게 의존합니다. </li>
<li>local structure :
저자는 자연어 모델과 같은 sequence 모델에서는 local structure가 중요하다고 말하는데요, 그러나 트랜스포머의 경우 local structures in sequences로 모델링하는 데 필요한 구성 요소가 부족합니다. 이러한 Transformer의 문제점은 (Dehghani et al., 2018; Al-Rfou et al., 2018)의 논문에서 다루고 있다고 하니, 궁금하신 분들은 이 논문들을 참고하시면 좋을 것 같습니다. </li>
</ul>
<h2 id="r-transformer">R-transformer</h2>
<p>이러한 RNN과 트랜스포머의 문제들 때문에 본 논문에서는 두 모델의 장점을 모두 누리며 단점들은 피하는 R-Transformer를 제안하였습니다. 즉, 이 모델은 position embeddings 을 사용하지 않고, 시퀀스에서 local structures와 global longterm dependencies in sequences을 효과적으로 capture할 수 있습니다. 어떤 구조를 가지고 있다는 건지 조금 더 자세히 살펴보겠습니다. </p>
<p><img src="https://images.velog.io/images/numver_se/post/e21a6505-9da7-482a-88c5-c499939fb238/image.png" alt=""></p>
<p>제안된 R-Transformer는 3개의 레이어로 구성됩니다. 첫번째 레이어는 Local RNN, 두번째 레이어는 Multi-head Attention, 세번째 레이어는 FeedForward입니다. 이 모델에서 새롭게 도입된 Local RNN에 대해서 설명드리겠습니다. </p>
<p>Local RNN입니다. 
sequencial data는 본질적으로 강한 local structure를 가지고 있습니다. 따라서 locaity를 모델링하는 구성요소를 설계하는 것이 바람직합니다. 이를 달성하기 위해 저자는 RNN 을 활용하고 있습니다. </p>
<p><img src="https://images.velog.io/images/numver_se/post/1ae88be5-b70d-4d2c-bf6a-80c1f0454210/image.png" alt="">
RNN이 전체 시퀀스에 작용되는 이전 모델들과 다르게, 우리는 original long sequence를 local information만을 포함하는 많은 short sequences로 재구성합니다. 그리고 RNN을 동일하게 독립적으로 적용시킵니다. </p>
<p><img src="https://images.velog.io/images/numver_se/post/f4534171-ab11-4334-a075-b56929961a37/image.png" alt=""></p>
<p>local window가 M개의 consecutive positions을 포함하고 target position에서 끝나도록 각 대상 위치에 대해 M 크기의 local window을 구성하는데요, 패딩을 통해서 개수를 맞춰준 것을 확인 할 수 있습니다. 따라서 각 local window의 position은 local short sequence를 형성합니다. 원래 RNN 비교했을 때, LocalRNN은 장기 종속성을 고려하지 않고 local short-term dependency에만 집중하는 것을 확인할 수 있습니다. </p>
<p><img src="https://images.velog.io/images/numver_se/post/9674bfae-40af-4302-bf17-743aef9487c3/image.png" alt="">
LocalRNN은 각 window 내에서 sequencial information을 완전히 캡처 할 수 있습니다. 또한 슬라이딩 윈도우 방식이기 때문에 자연적으로 global sequential information을 가지고 있다는 장점이 있습니다. </p>
<h2 id="성능비교">성능비교</h2>
<p><img src="https://images.velog.io/images/numver_se/post/c2e0c3cb-a171-4225-8210-104cf8707146/image.png" alt="">
<img src="https://images.velog.io/images/numver_se/post/ad6c25ec-0018-483e-bd5b-230b32c413be/image.png" alt="">
<img src="https://images.velog.io/images/numver_se/post/4d4dfaed-66d6-45f9-8ae7-680159f342f7/image.png" alt="">
<img src="https://images.velog.io/images/numver_se/post/4cb807a7-5902-401c-bc77-400e7c38f9cc/image.png" alt="">
낮은 수준의 로컬 RNN과 높은 수준의 multi-head attention을 결합한 제안된 R-Transformer는 대부분의 작업에서 일관되게 TCN과 트랜스포머 모두를 큰 폭으로 능가함을 확인할 수 있었습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 발표]Efficient Estimation of Word Representations in Vector Space]]></title>
            <link>https://velog.io/@numver_se/Word2vec%EB%85%BC%EB%AC%B8%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@numver_se/Word2vec%EB%85%BC%EB%AC%B8%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 17 Mar 2021 14:42:08 GMT</pubDate>
            <description><![CDATA[<h2 id="💡-논문-발표">💡 논문 발표</h2>
<p><a href="https://arxiv.org/abs/1301.3781">Efficient Estimation of Word Representations in Vector Space</a></p>
<p><img src="https://images.velog.io/images/numver_se/post/d6aedfc5-9d67-4535-a06a-1563945add13/image.png" alt="">
위 그림처럼 동물들이 있다고 할 때, 컴퓨터는 이를 이해할 수 없습니다. 컴퓨터가 이해할 수 있게 하기 위해서는 이 동물들이 <strong>수치적인 방식</strong>으로 표현되어야 합니다. 이러한 문제는 언어에도 똑같이 적용되는데요. 그러면 <em>어떻게 수치적인 방식으로 표현할 수 있을까요?</em>
<img src="https://images.velog.io/images/numver_se/post/65b87be1-1b61-4adb-8618-9a174ece8abf/image.png" alt="">
이 그래프처럼, 어떠한 기준을 가지고 좌표평면에 표현한다면 우리는 동물들을 수치화하여 표현할 수 있습니다. 그러면 우리가 궁금한 언어에 이를 적용시킬 때, <strong>무엇을 기준으로</strong> 하여 좌표평면으로 표현할 수 있을까요?
<img src="https://images.velog.io/images/numver_se/post/1c7d7104-e12c-4dda-96f1-8986fea94d9d/image.png" alt="">
가장 간단한 방법은 <strong>one-hot encoding</strong>일 것입니다. &#39;세상, 모든, 사람&#39;으로 이루어진 사전(Dictionary)가 있다고 가정해보겠습니다. 이때 우리는 길이 3짜리 벡터를 만들고, 그 단어가 해당되는 자리에 1을 넣고 나머지 자리들에 0을 넣어 단어를 표현할 수 있습니다. 지금은 단어가 3개밖에 없기 때문에 그래프로 나타내도 알아볼 수 있는 형태지만, 단어가 십만개가 주어진다고 생각해봅시다. 단어가 십만개라면, 벡터의 차원도 십만개가 됩니다. 즉, n개의 단어를 표현하기 위해서는 n차원의 벡터가 필요한 것이죠. </p>
<p>차원수가 높으면 훈련 데이터를 많이 필요로 하게 되는데다가, 메모리 사용이 늘어나고, 계산 복잡도가 매우 늘어나게 되는 &#39;차원의 저주&#39;에 빠질 수 있습니다. 또한, 단 하나의 값만 1을 가지고 9만 9999개의 값은 0을 가지는 희소행렬 문제를 갖게 되기에, 저장 공간 측면에서도 매우 비효율적인 방법입니다. one-hot encoding은 각각이 독립적인 축을 가지고 있기에 단어 간 유사성을 알 수 없는데, 현실에서는 단어들이 서로 의미적인 관계를 갖고 있습니다. 이러한 문제들을 해결하기 위해 등장한 개념이 바로 <strong>Distributed Representation</strong>이며, 앞으로 이를 분산표현이라고 부르겠습니다. 
<img src="https://images.velog.io/images/numver_se/post/1f2707d7-fdd0-42b8-b435-88a046d1b8d6/image.png" alt="">
분산표현은 기본적으로 <strong>distributional hypothesis</strong>라는 가정 하에서 나온 방법입니다. </p>
<blockquote>
<p><strong>💡 distributional hypothesis</strong>
A word&#39;s meaning is give by the words that frequently appear close-by(비슷한 위치에서 자주 등장하는 단어들은 비슷한 의미를 가진다)</p>
</blockquote>
<p>예를 들어, 강아지라는 단어는 귀엽다, 사랑스럽다, 예쁘다 등의 단어와 함께 등장하는 경우가 잦기 때문에, distributional hypothesis에 따라서 저 단어들은 의미적으로 가까운 단어가 됩니다.
<img src="https://images.velog.io/images/numver_se/post/5ca19ba5-41cc-46aa-ba07-02e2f00c1a93/image.png" alt="">
분산표현은 이 가설에 따라 단어들을 학습하고, 벡터에 <strong>단어의 의미를 여러 차원에 분산하여 표현</strong>합니다.  다시말해, one-hot encoding은 각각의 속성을 독립적인 차원에 나타냈던 것과 다르게 분산 표현은 우리가 정한 차원(여기서는 차원이 5입니다)에 대응하여 표시됩니다. 그림에서 볼 수 있듯이 대상을 대응시켜 여러 차원에 분산하여 표현한다는 것입니다. 아까의 원핫인코딩 처럼 하나의 차원이 하나의 속성을 명시적으로 표현하는 것이 아니라, 여러 차원들이 조합되어 나타내고자 하는 속성들을 표현하는 것을 확인할 수 있습니다.
<img src="https://images.velog.io/images/numver_se/post/d5c38dd4-7431-461f-916d-f9721d59144b/image.png" alt="">
분산표현을 사용하면 1) <strong>데이터의 차원 수를 줄일 수 있습니다</strong>. 또한, 단어의 의미 자체를 벡터화할 수 있게 되었기 때문에,  2) <strong>단어의 유사도를 계산</strong>할 수 있습니다. 또한 3) <strong>벡터 연산</strong>이 가능해지기 때문에 이를 통해 단어 추론이 가능해진다는 점도 큰 장점입니다.
<img src="https://images.velog.io/images/numver_se/post/dad861af-0062-4a0d-a670-1717c18e0732/image.png" alt="">
그렇다면 이제는 <strong>&#39;어떻게 각 단어를 벡터화해야 하는가&#39;</strong> 가 화두가 될 것입니다. 사실 단어를 벡터화하는 방법 자체는 예전부터 이야기되어왔던 문제입니다. 따라서 본 논문에서는 먼저, 매우 큰 데이터에서 퀄리티 높은 단어 벡터를 학습할 수 있는 기술들로 이야기 되어 왔던 NNLM, RNNLM 에 대해 소개합니다. 그 후, 본 논문에서 제안하는 모델 구조인 CBOW와 Skip-gram을 소개하고, 마지막으로 훈련 시간과 정확도가 단어 벡터의 차원과 training 데이터의 양에 얼마나 의존하는지 설명합니다.
<img src="https://images.velog.io/images/numver_se/post/038857a3-05ca-4610-971b-3415484a726a/image.png" alt="">
그러면 본격적으로 모델 구조에 대해 설명드리겠습니다. 본 논문에서 가장 먼저 소개하는 모델은 <strong>NNLM</strong>입니다. NNLM은 n-1 개의 단어를 가지고 n번째 단어를 예측하는 n-gram 언어 모델입니다. 즉, 어휘 집합이 주어지고 다음 단어가 무엇인지 맞추는 과정에서 학습을 합니다. NNLM은 Input layer, Projection layer, Output later로 이루어진 신경망 구조를 가지고 있습니다.
<img src="https://images.velog.io/images/numver_se/post/074aa8e7-a5d5-48fc-89a4-dfeee6cfa32d/image.png" alt="">
보다 모델 구조를 알기 쉽게 설명하기 위해, 어휘 집합에 속한 단어가 5개라고 합시다. 우리는 window size=4로 설정하여, 4개의 단어를 가지고 마지막 단어를 예측할 것입니다. 이 때, 어휘집합은 [&#39;나는&#39;, &#39;귀여운&#39;, &#39;강아지를&#39;, &#39;정말&#39;, &#39;좋아해&#39;]라고 하겠습니다. $W_t$가 네번째 단어라고 하면, $W_t$는 &#39;정말&#39;이 될 것입니다. Input layer에서 정말은 one-hot vector로 바뀌어 [0,0,0,1,0]으로 입력됩니다. 이 때, projection layer에서는 행렬 $C$를 만듭니다. $C$행렬의 크기는 $N$(단어의 수) x $D$(projection layer의 크기)이며, 행렬의 초기 값은 랜덤으로 초기화 됩니다. 즉, 단어의 수는 5이고, projection layer의 크기는 3이기 때문에 5x3의 크기인 행렬 $C$가 $W_t$([0,0,0,1,0])에곱해집니다. 이 때, one-hot vector의 특성 때문에 $W_t$와 $C$의 곱은 사실 $C$행렬의 $t$번째 행을 그대로 참조해오는 것과 같습니다. 이 참조작업을 거치면 one-hot vector의 차원수는 5에서 3으로 줄어들게 됩니다. 이 벡터들은 초기에 랜덤한 값([23, 5, 7])을 가지지만 학습과정에서 값이 계속 변경됩니다. 이렇게 학습된 벡터는 output layer에서 softmax 함수가 적용되어, 각 원소는 0과 1 사이의 실수값을 가지며 총합이 1이 되는 상태로 바뀝니다. 
<img src="https://images.velog.io/images/numver_se/post/ee2cb05c-b155-48f3-a27e-724fddfde8b7/image.png" alt="">
NNLM은 단어의 유사도를 표현할 수 있으며, 희소행렬 문제가 해결되는 장점을 가집니다. 그러나 <strong>고정된 개수의 단어만을 입력</strong>받을 수 있으며, 미래 시점의 단어들을 고려하지 않는다는 단점을 가지고 있습니다. 
<img src="https://images.velog.io/images/numver_se/post/5a258073-e039-4644-965a-96c2f213387c/image.png" alt="">
이러한 문제를 해결하기 위해 도입된 모델이 바로 RNNLM입니다. RNNLM은 <strong>시점</strong>이라는 개념이 도입되어, 입력의 길이를 고정하지 않고 학습할 수 있어 기존의 문제가 해결됩니다. RNNLM은 기본적으로 예측 과정에서 <strong>이전 시점의 출력을 현재 시점의 입력</strong>으로 합니다. 예를 들어, &quot;what will the fat cat sit on&quot;이라는 문장이 있을 때, RNNLM은 what을 입력받으면, will을 예측하고 이 will은 다음 시점의 입력이 되어 the를 예측합니다.
<img src="https://images.velog.io/images/numver_se/post/30df2d48-893f-45eb-a01c-a0109a483baa/image.png" alt="">
그런데 저는 이 모델 그림을 보고 의문이 들었는데, 어떤 그림에는 되풀이 화살표가 있기도 하더라구요. 그런데 제가 들고온 이 그림에는 화살표가 없어서 이에 대해 찾아보니 아마도 <strong>&#39;teacher forcing&#39;</strong> 때문인 것 같다는 결론을 내렸습니다.
<img src="https://images.velog.io/images/numver_se/post/05609f0f-3b58-47a9-9ce2-8eec3dbd0cee/image.png" alt="">
만약 what을 입력받았을 때 a라는 값을 예측했다고 합시다. 그러면 다음 입력층에는 a라는 단어가 들어갈까요? 아닙니다. teacher forcing이라는 RNN 훈련 기법을 사용하면 예측된 값과 상관없이 원래 정답인 값이 다음 입력층에 들어갑니다. 물론, 이전 시점의 출력을 다음 시점의 입력으로 사용하며 훈련시킬 수도 있지만, 한 번 잘못 예측하면 뒤까지 영향을 줄 수 있기 때문에 보다 효율적인 학습을 위해 teacher forcing을 사용한다고 합니다.</p>
<p><img src="https://images.velog.io/images/numver_se/post/bb44c90b-5086-4742-a46e-cc3d3d1fc646/image.png" alt="">
그럼 여기까지 NNLM과 RNNLM의 설명을 마치고, Distbelief에 대해 설명드리겠습니다. NNLM이 이제 큰 데이터를 계산하기 위해 도입된 방법인데, NNLM 모델 등의 딥러닝 모델이 발전하며, 계산량이 많아지고 메모리 요구량이 커져 한 대의 컴퓨터로는 모델이 돌아가지 않는 상황이 발생할 수 있습니다. 이때문에 다수의 컴퓨터가 이를 효율적으로 나누어 처리하기 위한 분산 처리 기술이 제안되었습니다. Distbelief는 구글의 1세대 분산 시스템으로, 수 십억 개의 파라미터를 가지는 대규모 딥 뉴럴 네트워크를 수천대의 컴퓨터에서 분산 트레이닝 할 목적으로 개발되었습니다. 5개의 계층으로 구성된 딥 뉴럴 네트워크를 4개의 모델로 분할하여 머신 1, 2, 3, 4에서 각기 실행합니다.  분할되지 않았다면 계산의 반복만으로 처리된 수 있지만, 뉴런 연결이 분할되었기에 뉴런은 그와 연결된 이전 뉴런으로부터 데이터와 가중치를 입력받아 계산한 결과를 연결된 다음 뉴런으로 전달해야 합니다. 그 때문에 굵은 검은색 선으로 머신 간 통신이 표시된 것을 확인할 수 있습니다. 왼쪽 그림을 설명해보면, 같은 모델이 쓰이기에 모델 레플리카를 만들고, 이를 공유되는 파라미터 서버를 통해 계속 파라미터가 업데이트 된다는 것을 의미합니다. Distbelief를 사용하면 100개 이상의 서로 다른 CPU에서 동시에 학습이 가능하다고 합니다.
<img src="https://images.velog.io/images/numver_se/post/9797f573-46ec-4f96-8b2d-5c4556d11226/image.png" alt="">
이제 본 논문에서 제안한 두가지 모델을 소개해드리고자 합니다. 본 논문은 계산 비용을 최소화하면서 distributed word vector를 학습할 수 있는 2가지 모델을 제안했는데요. 이 모델들이 가지는 이점은 크게 두가지입니다. 먼저 <strong>계산 복잡도</strong>에 대해 말씀드리면, 아까 살펴봤던 NNLM는 input, projection, hidden, output layer로 이루어져 있었고, 대부분의 비용이 non-linear hidden layer에서 발생했습니다. 본 논문에서는 이 문제를 해결하기 위해서 new log-linear model로 CBow와 skip-gram을 제안했는데요. Cbow와 skip gram은 비용이 많이 발생했던 non-linear hidden layer를 없애고, projection matrix 뿐만 아닌 layer까지 모든 단어들이 공유하게 한 모델입니다.
그리고 두번째 장점은 아까 두 모델은 history word, 즉 과거 단어들만 고려했지만, 이제는 <strong>future word도 고려가 가능</strong>하다는 점입니다.
<img src="https://images.velog.io/images/numver_se/post/bd270ef4-6cf0-46df-a3b3-5a17fb4bb095/image.png" alt="">
<img src="https://images.velog.io/images/numver_se/post/74f09732-296b-4fb7-8e50-51e984d7f727/image.png" alt="">
CBOW는 <strong>주변 문맥 단어(context word)로 타깃 단어(target word)를 맞추는 과정 학습</strong>하고, Skip-gram은 <strong>타깃 단어(target word)로 주변 문맥 단어(context word) 맞추는 과정 학습</strong>합니다. 이 두 모델은 아주 비슷한 구조를 가지고 있습니다. 먼저 Cbow먼저 설명하겠습니다.
<img src="https://images.velog.io/images/numver_se/post/54a8500a-3c6e-40ed-a79b-315a2353baa4/image.png" alt="">
예를 들어 &quot;The fat cat sat on the mat&quot;라는 문장이 있다고 합시다. Cbow는 주변단어를 가지고 중심단어를 예측하는 모델입니다. 중심 단어를 예측하기 위해서 앞, 뒤로 몇 개의 단어를 볼지를 결정했다면 이 범위를 윈도우(window)라고 합니다. 예를 들어서 윈도우 크기가 2이고, 예측하고자 하는 중심 단어가 sat이라고 한다면 앞의 두 단어인 fat와 cat, 그리고 뒤의 두 단어인 on, the를 참고합니다. 윈도우 크기가 n이라고 한다면, 실제 중심 단어를 예측하기 위해 참고하려고 하는 주변 단어의 개수는 2n이 될 것입니다. 윈도우 크기를 정했다면, 윈도우를 계속 움직여서 주변 단어와 중심 단어 선택을 바꿔가며 학습을 위한 데이터 셋을 만들 수 있는데, 이 방법을 슬라이딩 윈도우(sliding window)라고 합니다. 그럼 예를 들어서 설명해드리겠습니다. 먼저 윈도우를 1로 정했다면, 주변단어인 cat과 on이 input layer에 원핫벡터로 들어갑니다. 이 때, 행렬 $W$의 크기는 단어의 개수 x 투사층의 크기입니다. 아까 NNLM에서 살펴봤던 것 처럼, 원핫벡터의 성질 때문에 이는 $W$행렬의 $i$번째 행을 그대로 참조해오는 것과 같습니다. 그래서 이 작업을 룩업 테이블이라고도 합니다.
<img src="https://images.velog.io/images/numver_se/post/e92e104c-4eb2-44e8-9da0-1308c88c5fdd/image.png" alt="">
이렇게 각 주변 단어의 원-핫 벡터에 대해서 가중치 $W$가 곱해서 생겨진 결과 벡터들은 투사층에서 만나 이 벡터들의 평균인 벡터를 구하게 됩니다. 이제 우리가 구하고 싶은건 중심 단어 하나이기 때문에 2xwindow size로 벡터의 합을 나누어 평균을 구합니다.
<img src="https://images.velog.io/images/numver_se/post/e3debbde-6dcc-4c87-8bca-152fdbd274de/image.png" alt="">
이렇게 구해진 평균 벡터에 softmax를 취해서 0,1의 실수로 바꿔줍니다. 이렇게 나온 벡터를 스코어 벡터라고 하고, 이 스코어 벡터는 중심단어의 원핫벡터의 값에 가까워져야 합니다. 이 오차를 줄이기 위해 loss function으로 cross entrophy 함수를 사용합니다. 
<img src="https://images.velog.io/images/numver_se/post/54a8500a-3c6e-40ed-a79b-315a2353baa4/image.png" alt="">
근데 여기서 혹시, 제일 앞에서 one hot encoding이랑 분산 표현 설명드렸던거 기억나시나요? 사실 아까 nnlm할 때부터 계속 원핫벡터 이야기만 엄청 했는데 그럼 분산 표현을 왜 설명했는지 궁금하신 분이 있을 거에요. 
사실, 여기서 <strong>가중치의 각 행이 곧 분산표현</strong>입니다. 그렇기 때문에 가중치를 잘 학습시키는게 굉장히 중요하고, 이 W벡터의 뉴런 수를 입력 층의 뉴런 수보다 적게하는게 굉장히  중요해요. 원핫인코딩보다 분산표현이 차원이 적어서 좋다했는데, W의 여기서의 M수를 V보다 크게 만들면 안되겠죠? 이 가중치 값의 학습을 통해 우리는 단어의 정보를 간결하게 담을 수 있게 됩니다.
<img src="https://images.velog.io/images/numver_se/post/15de43a0-4307-4a9b-863e-15f79c0e79cf/image.png" alt="">
이제 skip gram을 설명드리겠습니다. skip-gram은 중심단어를 넣어서 주변단어를 예측한다는 점만이 다른데요. 아까랑 다 같은 구조지만, 다른 것은 중심 단어 하나만 들어가기 때문에 <strong>평균을 구하는 과정이 없다</strong>는 것입니다. 평균을 구하는 과정 없이 주변 단어에 대해 모델을 돌려주면 되고, 안의 로직은 cbow와 동일합니다.
<img src="https://images.velog.io/images/numver_se/post/6a7f4491-ed08-4d1c-a605-9df714c4bd09/image.png" alt="">
그럼 앞서 소개드렸던 모델들의 계산 복잡도를 정리해드리겠습니다. 계산 복잡도를 구해보면 NNLM은 250만으로 굉장히 높은데에 비해서, CBow와 Skip-gram은 낮은 걸 볼 수 있습니다. 아까 NNLM과 RNNLM이 non-linear hidden layer에서 계산 비용이 많이 발생했다고 했는데요, 보면 nxmxh, hxh가 hidden layer로 넘어갈 때 발생하는 계산 비용입니다. CBow와 Skip-gram은 hidden layer로 넘어가는 과정이 없어지면서 계산 비용이 확 줄어든 것을 확인할 수 있고, 본 논문에서 말하고자 한 <strong>효율적인 학습</strong>이 이뤄지는 것을 볼 수 있습니다.
<img src="https://images.velog.io/images/numver_se/post/5a788d0f-74c0-4e42-b146-a308eaff4cc0/image.png" alt="">
그럼 이제 결과를 소개해드리겠습니다. 모델 간 비교를 위해 <strong>analogy reasoning task</strong>를 이용합니다. Analogy Reasoning Task는 어떤 단어의 Pair, 예를 들어 (Athens, Greece) 라는 Pair가 주어졌을 때, 다른 단어 Oslo를 주면 이 관계에 상응하는 다른 단어를 제시하는 방식의 시험입니다. 이 관계에는 semantic, 즉 문맥적인 관계 5가지와 문법적인 관계 9가지로 이루어져 있습니다. 벡터를 잘 학습했다면  vector(Greece) – vector(Athens) + vector(Oslo)를 한 후 이 벡터에 가장 가까운 벡터를 찾으면 노르웨이가 나올 것입니다. 
<img src="https://images.velog.io/images/numver_se/post/4be5666c-276f-4c0e-9bd7-03516d2f351f/image.png" alt="">
위는 단어 벡터 길이를 640으로 하고 다양한 모델을 이용하여 학습시켰을 때의 결과입니다. 보다시피 RNNLM과 NNLM에 비해 CBow와 Skip-gram이 Semantic, Syntactic 문제에 대해 훨씬 더 좋은 결과를 내는 것을 알 수 있습니다. 또한 CBow와 Skip-gram을 비교해보았을 때, Skip-gram이 Syntactic 문제의 정확도는 조금 떨어지기는 하지만 두 문제 모두에서 전반적으로 높은 정확도를 보였습니다.
<img src="https://images.velog.io/images/numver_se/post/2fdb2028-e630-43fb-a3f2-7564a8c4ccb7/image.png" alt="">
또한, 상대적으로 적은 데이터를 여러번의 epoch 를 통해 학습하는 것보다, 많은 데이터를 이용해 1번의 epoch만 학습하는 것이 더 좋은 성능을 제공한다는 것을 알 수 있었습니다.</p>
<h2 id="reference">reference</h2>
<p><a href="https://wikidocs.net/45609">https://wikidocs.net/45609</a>
<a href="https://reniew.github.io/21/">https://reniew.github.io/21/</a>
<a href="https://wikidocs.net/46496">https://wikidocs.net/46496</a>
<a href="https://wikidocs.net/45609">https://wikidocs.net/45609</a>
<a href="https://wikidocs.net/22660">https://wikidocs.net/22660</a>
<a href="https://soobarkbar.tistory.com/8">https://soobarkbar.tistory.com/8</a>
<a href="https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/03/30/word2vec/">https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/03/30/word2vec/</a>
<a href="https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/03/29/NNLM/">https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/03/29/NNLM/</a>
<a href="https://shuuki4.wordpress.com/2016/01/27/word2vec-%EA%B4%80%EB%A0%A8-%EC%9D%B4%EB%A1%A0-%EC%A0%95%EB%A6%AC/">https://shuuki4.wordpress.com/2016/01/27/word2vec-%EA%B4%80%EB%A0%A8-%EC%9D%B4%EB%A1%A0-%EC%A0%95%EB%A6%AC/</a>
<a href="https://needjarvis.tistory.com/664">https://needjarvis.tistory.com/664</a>
<a href="https://jeongukjae.github.io/posts/1word2vec-paper/">https://jeongukjae.github.io/posts/1word2vec-paper/</a>
<a href="https://velog.io/@dscwinterstudy/2020-02-02-0002-%EC%9E%91%EC%84%B1%EB%90%A8-pwk63r14ez">https://velog.io/@dscwinterstudy/2020-02-02-0002-%EC%9E%91%EC%84%B1%EB%90%A8-pwk63r14ez</a>
<a href="https://ettrends.etri.re.kr/ettrends/172/0905172001/33-4_1-13.pdf">딥러닝 모델 병렬 처리, 한국전자통신연구원</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 해석]Efficient Estimation of Word Representations in Vector Space]]></title>
            <link>https://velog.io/@numver_se/Efficient-Estimation-of-Word-Representations-in-Vector-Space</link>
            <guid>https://velog.io/@numver_se/Efficient-Estimation-of-Word-Representations-in-Vector-Space</guid>
            <pubDate>Fri, 12 Mar 2021 19:06:20 GMT</pubDate>
            <description><![CDATA[<h2 id="💡-0-abstract">💡 0. Abstract</h2>
<p>본고는 대량의 데이터로 부터 단어의 연속적인 벡터표현을 계산하기 위한 두 개의 새로운 모델 구조를 제안한다. 이 표현들의 성능은 단어 유사도로 측정되며, 이 결과는 이전에 가장 좋은 성능을 냈던 다른 유형의 신경망구조를 기반으로한 기술과 비교한다. 본고는 매우 작은 계산 복잡도로 큰 성능 향상을 보여준다. 다시말해, 1.6 billion 개의 단어 데이터셋으로 부터 높은 품질의 단어 벡터를 배우는 데에 하루가 채 걸리지 않는다. 더욱이, 구문 유사도와 의미 유사도를 측정하기 위해 이 벡터들이 최첨단의 테스트셋을 제공한다는 것을 보여준다.</p>
<h2 id="💡-1-introduction">💡 1. Introduction</h2>
<p>많은 NLP systems and techniques들이 단어를 atomic unit(원자 요소)로 다룬다. 즉, <strong>단어 간의 유사성</strong>에 대한 개념이 없다는 것이다. 이러한 방식은 단순하고, robust하며, &#39;많은 데이터를 가지고 훈련된 단순한 모델&#39;이 &#39;적은 데이터를 가지고 훈련된 복잡한 모델&#39;보다 뛰어난 것이 관찰되는 등의 다양한 장점들때문에 자주 사용된다. 그 예로 N-gram model을 말할 수 있는데, 오늘날의 N-Gram은 사실상 모든 데이터에 대해 훈련이 가능하다. 그러나 많은 면에서 제약을 가진다.</p>
<blockquote>
<h3 id="n-gram-model">N-Gram model</h3>
<p>n-gram은 <strong>n개의 연속적인 단어 나열을 의미</strong>한다. 다시 말해, 갖고 있는 코퍼스에서 n개의 단어 뭉치 단위로 끊은 것을 하나의 토큰으로 간주한다. 
#####
📌 &quot;An adorable little boy is spreading smiles&quot;라는 문장이 있을 때, 각 n에 대해서 n-gram을 전부 구해보면 다음과 같다.</p>
</blockquote>
<ul>
<li>unigrams : an, adorable, little, boy, is, spreading, smiles</li>
<li>bigrams : an adorable, adorable little, little boy, boy is, is spreading, spreading smiles</li>
<li>trigrams : an adorable little, adorable little boy, little boy is, boy is spreading, is spreading smiles</li>
<li>4-grams : an adorable little boy, adorable little boy is, little boy is spreading, boy is spreading smiles<h4 id=""></h4>
n이 <strong>1</strong>일 때는 <strong>유니그램(unigram)</strong>, <strong>2</strong>일 때는 <strong>바이그램(bigram)</strong>, <strong>3</strong>일 때는 <strong>트라이그램(trigram)</strong>이라고 명명하고 n이 <strong>4 이상</strong>일 때는 <strong>gram 앞에 그대로 숫자를 붙여서 명명</strong>한다.</li>
</ul>
<p>최근, 머신러닝 기술의 진보와 함께 매우 큰 데이터셋에 더욱 복잡한 모델을 훈련시키는 것이 가능해졌고, 이는 단순한 모델들의 성능을 뛰어넘었다. 아마 가장 성공적인 concept은 단어의 <strong>distributed representation</strong>을 사용 한 것이다. 예를 들어, 언어 모델에 기반한 Neural Network(인공신경망)는 N-gram model을 능가하는 성능을 보여줬다.  </p>
<blockquote>
<h3 id="distributed-representation">Distributed Representation</h3>
<p>각각의 속성을 독립적인 차원으로 나타내지 않고, <strong>우리가 정한 차원으로 대상을 대응</strong>시켜서 표현한다. 예를 들어, 해당 속성을 5차원으로 표현할 것이라고 정하면 그 속성을 5차원 벡터에 대응(embedding)시키는 것이다. 
<img src="https://images.velog.io/images/numver_se/post/1abe5b8c-9f03-4c2c-aba1-5f383f162be7/image.png" alt="">
임베딩된 벡터는 더이상 sparse하지 않다. One-hot encoding처럼 대부분이 0인 벡터가 아니라, 모든 차원이 값을 갖고 있는 벡터로 표현이 된다. ‘<strong>Distributed</strong>’라는 말이 붙는 이유는 하나의 정보가 <strong>여러 차원에 분산</strong>되어 표현되기 때문이다. Sparse representation에서는 각각의 차원이 각각의 독립적인 정보를 갖고 있지만, Distribution representation에서는 하나의 차원이 여러 속성들이 버무려진 정보를 들고 있다. 즉, 하나의 차원이 하나의 속성을 명시적으로 표현하는 것이 아니라 <strong>여러 차원들이 조합되어 나타내고자 하는 속성들을 표현</strong>하는 것이다.</p>
</blockquote>
<h3 id="1-goals-of-the-paper">1. Goals of the Paper</h3>
<p>논문의 주 목적은 <strong>수 억개의 단어로 구성된 매우 큰 데이터에서 퀄리티 높은 단어 벡터를 학습할 수 있는 기술</strong>들을 소개하는 데에 있다. 이제껏 제안된 architecture 중에 어떤 것도 수백만개 단어를 학습하는 것에 성공하지 못했으며, 벡터의 크기도 50~100 정도밖에 사용하지 못했다. 
#####
본고는 비슷한 단어들은 가까이에 있고, <strong>multiple degrees of similarity</strong>를 갖는다는 가정 하에서 vector representations의 퀄리티를 측정하는 기술을 제안한다. 이는 굴절어(라틴어 등)의 문맥에서 먼저 관측되었다. 예를 들어 유사한 단어를 찾을 때, 명사는 다양한 어미를 가지는데 원래의 벡터 공간의 subspace에서 비슷한 어미를 갖는 단어들을 찾을 수 있다. 놀랍게도, word representation의 유사도는 단순한 synatactic regularities(구문 규칙)을 넘어선다. 단어 벡터에서 대수적 연산으로 word offset technique을 사용하면 $$vector(&quot;King&quot;)-vector(&quot;Man&quot;)+vector(&quot;Woman&quot;)$$은 $$vector(&quot;Queen&quot;)$$이라는 결과가 나온다. 
#####
이 논문에서는 단어 사이의 선형 규칙을 보존하는 새로운 모델 구조를 만들어서 vector representation 연산의 정확도를 극대화 시킬 것이다. 구문 규칙과 의미 규칙을 측정하기 위해 이해하기 쉬운 새로운 테스트셋을 만들었고, 높은 정확도로 규칙들이 학습되는 것을 보였다. 또한, 훈련 시간과 정확도가 단어 벡터의 차원과 training 데이터의 양에 얼마나 의존하는지에 대해 이야기 하고자 한다. </p>
<h3 id="2-previous-work">2. Previous Work</h3>
<p>이전에도 단어를 연속적인 벡터로 표현하는 방법을 사용했으며, 그 중에서도 <strong>NNLM(neural network language model)</strong>에 관한 논문에서 제안한 것들이 잘 알려져 있다.<a href="https://www.jmlr.org/papers/volume3/bengio03a/bengio03a.pdf">A neural probabilistic language model</a> 논문에서 제시된 모델은 Linear Projection Layer와 Non-Linear Hidden Layer 를 기반으로 Feedforward Neural Network를 통해 단어 벡터 표현과 통계학적인 언어 모델의 결합을 학습하는데 사용된다. 
또 다른 흥미로운 구조인 NNLM은 <a href="https://dspace.cuni.cz/bitstream/handle/20.500.11956/3235/RPTX_2005_2_11320_NRZK001_230830_0_43987.pdf?sequence=1">Language Modeling for Speech Recognition in Czech</a>, <a href="http://www.fit.vutbr.cz/research/groups/speech/publi/2009/mikolov_ic2009_nnlm_4.pdf">Neural network based language models for higly inflective languages</a> 논문에서 제시한다. 먼저, 단어 벡터들은 single hidden layer를 갖는 Neural network에 의해 학습 된다. 그 단어 벡터들은 NNLM을 학습하는데 사용되므로 단어 벡터들은 비록 전체 NNLM을 구성하지 않아도 학습된다. 이 작업을 통해 직접적으로 구조를 확장하여, 단어 벡터가 간단한 모델에 의해 학습되어지는 첫번째 단계에 주목한다.
이 단어 벡터들은 많은 NLP program의 엄청난 향상과 단순화에 사용될 수 있을 것이다. 단어 벡터의 예측은 다른 모델 구조을 사용하는데 실행되고, 다양한 단어 corpora를 학습한다. 단어 벡터 결과의 일부는 미래 연구와 비교를 위해 사용 가능하게 된다. 하지만 이 구조들은 학습을 하기 위해 매우 계산 복잡도가 커지며 비용이 많이 든다. </p>
<h2 id="💡-2-model-architectures">💡 2. Model Architectures</h2>
<p>LSA와 LDA를 포함한 많은 다양한 종류의 모델들이 단어의 계속적인 표현을 위해 제안되었다. 본고에서는 인공신경망을 통해 학습된 단어의 <strong>distributed representation</strong>에 주목할 것이다. <a href="https://www.microsoft.com/en-us/research/wp-content/uploads/2011/12/ASRU-2011.pdf">Strategies for Training Large Scale Neural Network Language Models</a>와 비슷하게, <del>모델의 계산 복잡성을 모델을 완전히 훈련시키기 위해 액세스 해야 하는 매개 변수의 수로 정의한다.</del> 다음으로, <del>정확도를 극대화하기 위해 계산 복잡도를 최소화 시킨다.</del></p>
<blockquote>
<p><strong>Training comprexity는 다음과 같이 정의한다.</strong> 
$$
O = E × T × Q$$ 
$$O$$는 training epochs의 수, $$T$$는 training set의 단어 수, $$Q$$는 각 모델에 따라 다르게 정의됨</p>
</blockquote>
<ul>
<li>일반적으로 E = 3~50, T는 10억개 이상으로 정의됨</li>
<li>모든 모델은 stochastic gradient descent와 backpropagation을 이용하여 학습</li>
</ul>
<h3 id="1-feedforward-neural-net-language-modelnnlm">1. Feedforward Neural Net Language Model(NNLM)</h3>
<p><a href="https://www.jmlr.org/papers/volume3/bengio03a/bengio03a.pdf">A neural probabilistic language model</a>에서 제안된 NNLM 모델은 Input, Projection, Hidden, Output layer 로 구성되어 있다. Input layer에서, $$N$$개의 선행 단어들이 1-of-$$V$$ coding으로 인코딩되며, 전체 vocabulary의 크기가 $$V$$ 인 경우 $$V$$ 크기의 벡터가 주어진다. $$N × D$$ 벡터 크기를 가진 projection layer가 Input layer가 된다. 
NNLM 구조는 projection layer가 촘촘할수록 projection layer와 hidden layer 간의 계산이 복잡하다. $$N=10$$일 때, $$P$$는 500~2000이며, $$H$$는 500에서 1000개이다. 게다가 hidden layer가 모든 단어의 확률 분포를 계산하는 데에 사용되기에 output layer의 차원은 $$V$$가 된다. 따라서, 매 training example마다 계산 복잡도는 다음과 같다. </p>
<blockquote>
<p>$$
Q=N×D+N×D×H+H×V $$</p>
</blockquote>
<ul>
<li>dominating term은 $$H×V$$</li>
</ul>
<p>이를 피하기 위한 몇 가지 실용적인 해결책이 있다(Hierarchical version of softmax, avoiding normalized models). 단어의 이진분류 representation과 함께, output units의 수를 $$log_2(V)$$까지 낮출 수 있다. 이에 따라 대부분의 복잡도가 $$N×D×H$$에 의해 발생된다. 
본고에서는 Hierachical softmax를 사용하는데, 이는 단어가 Huffman binary tree로 나타나는 방법이다. 단어의 빈도 수가 NNLM에서 class를 얻기위해 잘 작동한다는 이전의 관측들을 따른다. Huffman trees는 빈도 높은 단어들에 짧은 이진 코드를 할당하고, 이는 평가되어야 하는 output unit의 수를 낮춰준다. 균형잡힌 이진 트리는 평가되어야 하는 $$log_2(V)$$의 output을 요구하는 반면, Hierachical softmax에 기반한 huffman tree는 $$log_2(Unigram-perplexity(V))$$에 대해서만을 요구한다. 예를 들어 단어 사이즈가 백만개의 단어라면, 이 결과는 평가에 있어서 속도를 두 배 더 빠르게 한다. $$N×D×H$$ 식에서 계산의 병목현상이 일어나는 NNLM에서는 중요한 문제가 아닐지라도, 본고는 hidden layer가 없고 softmax normalization의 효율성에 주로 의존하는 architectures를 제안할 것이다. </p>
<h3 id="2-recurrent-net-language-modelrnnlm">2. Recurrent Net Language Model(RNNLM)</h3>
<p>Recurrent Neural Net Language Model(RNNLM)은 문맥의 길이(the order of the model N)를 명시해야하는 것과 같은 NNLM의 한계를 극복하기 위해서 생겨났다. 이론적으로 RNN은 더 복잡한 패턴들을 얕은 인공신경망을 이용해서 효율적으로 표현할 수 있다. RNN 모델은 projection layer가 없고, input, hidden, output layer만 있다. 이 모델에 특별한 점은 recurrent matrix가 hidden layer 그 자체와 시간의 흐름의 연결을 갖고 연결되어 있다는 것이다. 이것은 recurrent model이 short term memory를 생성하는 것을 가능하게 하고, 과거의 정보는 이전 단계의 hidden layer의 상태와 현재의 input에 기반하여 업데이트 된 hidden layer의 state로 표현될 수 있다. 
RNN model의 훈련 당 복잡도는 다음과 같다.</p>
<blockquote>
<p>$$
Q = H×H+H×V$$
word represatation $$D$$는 hidden layer $$H$$와 같은 차원을 갖고, $$H X V$$ 는 계층적 소프트맥스를 사용해서 $$H X log_2(V)$$로 축소될 수 있다. 대부분의 복잡도는 $$H X H$$에서 나온다.</p>
</blockquote>
<h3 id="3-parallel-training-of-neural-networks">3. Parallel Training of Neural Networks</h3>
<p>거대한 data set에 대해 NNLM과 이 논문에서 제안된 새로운 모델들을 포함하여 DistBelief라고 불리는 top of large-scale distributed framework인 몇몇 모델들을 실행했다. 이 framework는 우리가 Parallel하게 같은 모델을 반복해서 실행할 수 있게 했고, 모든 파라미터를 유지하는 centralized server가 통해 각 replica들은 그것의 gradient의 update와 같았다. 이 parallel train에서, 우리는 Adagrad를 사용한 미니배치 경사하강법을 사용했다. 이 framework에서 100개, 또는 몇백개의 replica를 사용하는 것이 일반적이며, 이는 data center의 다른 기계들의 많은 CPU core를 사용한다.</p>
<h2 id="💡-3-new-log-linear-model">💡 3. New Log-linear Model</h2>
<p>이 섹션에서는 computational complexity를 최소화하면서 distributed representation을 학습하기 위한 두가지 모델 구조를 제안한다. 이전 섹션에서의 main observation은 대부분의 복잡도가 non-linear hidden layer에 의해 생긴다는 것이다.</p>
<h3 id="1-continuous-bag-of-words-model">1. Continuous Bag-of-Words Model</h3>
<p>첫번째 제안된 아키텍쳐는 non-linear hidden layer가 제거되고 projection layer가 모든 단어를 위해 공유되는 feedforward NNLM과 비슷하다. 우리는 단어의 순서가 projection에 영향을 끼지치 않기 때문에 이 구조를 bag-of-word 모델이라고 부른다. 게다가, 우리는 미래로부터 단어를 사용한다. 즉, 우리는 input으로 4 future and 4 history words로 log-linear classifier을 구축하여 다음 section에서 소개할 task에서 가장 좋은 성능을 얻을 수 있었다. 훈련의 복잡도는 다음과 같다.
$$
Q=N×D+D×log_2(V)
$$
우리는 이 모델을 앞으로 CBOW라고 부를 것이다. 보통의 bag-of-word 모델과는 다르게, 이것은 context의 continuous distributed representation를 사용한다. input과 projection layer 사이의 가중치 매트릭스는 NNLM과 같은 방식으로 모든 단어 위치를 위해 공유된다.</p>
<h3 id="2-continuous-skip-gram-model">2. Continuous Skip-gram Model</h3>
<p>두번째 아키텍쳐는 CBOW와 비슷하지만, context에 기반해 현재 단어를 예측하는 대신에 같은 문장의 다른 단어에 기반한 단어의 분류를 극대화한다. 더 정확히 말하자면, 우리는 각 현재의 단어를 continuous projection layer와 함께  log-linear classifier에 사용하고, 현재 단어 앞뒤의 특정 범위안의 단어를 예측한다. range를 증가시키면 단어 벡터의 quality을 향상시키는 것을 발견했으나, 이는 계산 복잡도를 증가시킨다. 거리가 먼 단어는 가까운 단어보다 현재 단어와 연관성이 떨어질 것이므로 훈련 세트에서 이런 단어들은 샘플링을 적게 함으로써 가중치를 줄였다. 이 아키텍쳐의 훈련 복잡도는 다음의 식에 비례한다.</p>
<blockquote>
<p>$$
Q = C×(D+D×log_2(V))$$
$$C$$: 단어의 최대 거리</p>
</blockquote>
<h2 id="💡-4-result">💡 4. Result</h2>
<ul>
<li>Semantic acc : Skip-gram &gt; CBOW &gt; NNLM &lt; RNNLM</li>
<li>Syntactic acc : CBOW &gt; Skip-gram &gt; NNLM &lt; RNNLM</li>
<li>Total acc : Skip-gram &gt; CBOW &gt; NNLM</li>
</ul>
<h3 id="-1"></h3>
<h2 id="reference">Reference</h2>
<p><a href="https://wikidocs.net/21692">https://wikidocs.net/21692</a>
<a href="https://dreamgonfly.github.io/blog/word2vec-explained/">https://dreamgonfly.github.io/blog/word2vec-explained/</a></p>
]]></description>
        </item>
    </channel>
</rss>