<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>tobigs-text1415.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 23 Jun 2021 10:33:57 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>tobigs-text1415.log</title>
            <url>https://images.velog.io/images/tobigs-text1415/profile/71f89628-c7fe-4f6f-8e49-9563b1a064e4/tobigs 로고.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. tobigs-text1415.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/tobigs-text1415" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Lecture 22 - BERT and Other Pre-trained Language Models]]></title>
            <link>https://velog.io/@tobigs-text1415/Lecture-22-BERT-and-Other-Pre-trained-Language-Models</link>
            <guid>https://velog.io/@tobigs-text1415/Lecture-22-BERT-and-Other-Pre-trained-Language-Models</guid>
            <pubDate>Wed, 23 Jun 2021 10:33:57 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 서울시립대학교 경제학부 박준영</p>
<pre><code>목차
1. Contextual representation
2. History of Contextual Representation
   2-1) semi-supervised sequence learning, Google, 2015
   2-2) Elmo(Deep contextual word embedding)
   2-3) GPT-1
       * Transformer VS LSTM

3. BERT
   3-1) problem with previous methods
      문제1) 잘 수행하는 확률 분포를 만들기 위해 방향성이 필요했다.
      문제2) 단어의 &#39;See themselves&#39;문제
   3-2) 문제를 해결한 BERT
      해결방법 : Masked LM(language model)
      * Bert vs GPT vs ELMO
   3-3) Bert pretraining
      3-3-1) Bert pretraining 방법
         방법1) masked language model
         방법2) Next sentence prediction
      3-3-2) Bert pretraining의 input
         -Token Embedding
            *WordPiece
         -segment Embedding
         -Position Embedding
      3-3-3) Bert pretraining procedure
   3-4) Bert fine tuning
      a) Sentence Pair Classification Tasks
      b) single sentence Classification Tasks
      c) Question Answering Tasks
      d) single Sentence Tagging Tasks
   3-5) Experiment            
4. Post-Bert pre-training Advancement
   4-1) ROBERTA
   4-2) XLNET
   4-3) ALBERT
   4-4) T5
   4-5) ElecTra
5. Distillation
   5-1) Distillation
   5-2) Distillation의 기술
   5-3) Distillation이 성능이 좋은 이유
6.conclusion
reference</code></pre><p><br><br></p>
<h2 id="1-contextual-representation">1. Contextual representation</h2>
<p>이전 강의에서 word2vec, FastText, Glove와 같은 워드 임베딩 방법들을 배웠다.
위의 임베딩 방법들의 문제는 하나의 단어가 하나의 벡터로 mapping되어 context을 고려하지 못한다는 점이다.
<img src="https://user-images.githubusercontent.com/63804074/122996170-822eaa80-d3e5-11eb-9bed-df1e4bd02f7d.PNG" alt="bank사진">
위의 problem을 보면</p>
<ul>
<li>open a bank account</li>
<li>on the river bank
위의 bank가 [0.3, 0.2, -0.8,....]으로 문맥을 고려하지 못하고 동음의의어를 구분하지 못하는 문제점이 있었다. EX) 사과하다, 사과를 먹다의 &quot;사과&quot;라는 단어 벡터로 mapping되어 의미 구별이 힘들다.</li>
</ul>
<p>그래서 이를 해결하기 위해 텍스트 corpus 문맥상의 표현을 학습하는 <strong>Train contextual representation on corpus</strong>가 제안되었다.
<br></p>
<h2 id="2-history-of-contextual-representation">2. History of Contextual Representation</h2>
<p>문맥상의 표현을 학습하기 위한 <strong>Train contextual representation on corpus</strong>는 어떻게 발전했을까????
<br></p>
<h3 id="2-1-semi-supervised-sequence-learning-google-2015">2-1) semi-supervised sequence learning, Google, 2015</h3>
<p><a href="https://arxiv.org/pdf/1511.01432.pdf">https://arxiv.org/pdf/1511.01432.pdf</a>
<br>
2015년도 구글에서 발표한 semi-supervised sequence learning 논문이다. 
<img src="https://user-images.githubusercontent.com/63804074/122996185-88248b80-d3e5-11eb-806f-5c63e24b9944.png" alt="semi-supervised"></p>
<p>이 논문은 전체 모델을 pretrain한 뒤에 classification을 위해 fine tuning을 진행하는 방식으로 영화 리뷰데이터 감성분석을 진행하였다.
이 논문으로 충분한 데이터가 없기 때문에 좋은 결과를 얻지 못했다는 것을 알게되었다.</p>
<h3 id="2-2-elmodeep-contextualized-word-representations">2-2) ELMO(Deep contextualized word representations)</h3>
<p><a href="https://arxiv.org/pdf/1802.05365.pdf">https://arxiv.org/pdf/1802.05365.pdf</a>
그 후 ELMO가 등장한다. 
<img src="https://user-images.githubusercontent.com/63804074/122996201-8eb30300-d3e5-11eb-8f6b-95949a3fde8b.png" alt="ELMO"></p>
<p>ELMO는 큰 언어 corpus를 순방향 역방향 LSTM으로 학습하는 양방향 모델이다. 역방향 언어 모델도 사용함으로써 기존의 GLOVE 등에 있던 워드 임베딩 문제점을 해결하였다.</p>
<h3 id="2-3-gpt-1improving-language-understanding-by-generative-pre-training-openai-2018">2-3) GPT-1(improving language understanding by generative pre-training, openAI, 2018)</h3>
<p><a href="https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf">https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf</a></p>
<p>Transformer(attention is all you need): <a href="https://arxiv.org/pdf/1706.03762.pdf">https://arxiv.org/pdf/1706.03762.pdf</a></p>
<p>Transformer가 등장하게 되고 언어 모델 학습시 Transformer를 이용한 연구가 이루어지게 되었다. <br></p>
<h4 id="--transformer-vs-lstm-기법-비교-">** * Transformer VS LSTM 기법 비교 **</h4>
<p><img src="https://user-images.githubusercontent.com/63804074/122996246-9bcff200-d3e5-11eb-9398-58899a1f5c79.PNG" alt="LSTM_transformer"></p>
<ul>
<li><strong>self-attention == no locality bias</strong></li>
</ul>
<p>LSTM은 단어를 순차적으로 입력 받아서 처리하기때문에 각 단어의 위치 정보를 가질 수 있었고 멀리 있는 단어보다 가까이 있는 단어가 관련성이 높다고 판단하는 <strong>locality bias</strong> 문제가 발생한다. </p>
<p>그러나 transformer은 단어 입력을 순차적으로 받는 것이 아니라 각 단어의 embedding벡터에 <strong>positional encoding</strong>을 통해 위치정보를 더하여 <strong>locality bias</strong>문제를 해결한다.</p>
<p>self-attention에선 맥락을 concatenate함으로써 long-distance context가 &quot;equal opportunity&quot;를 가지도록한다. <br><br></p>
<ul>
<li><strong>single multiplication per layer == efficiency on TPU</strong>
LSTM은 문장(몇개의 과거 데이터를 볼지)를 이용하고 Transformer는 단어 임베딩을 사용한다. 만약 500개의 단어와 32개의 sentence가 있다면 Transformer는 512*32개의 batch 사이즈를 사용하면 된다. 따라서 TPU와 GPU를 효율적으로 사용할 수 있다.</li>
</ul>
<p><strong>GPT-1</strong>은 표준 Transformer의 Encoder는 사용하지 않고 Decoder만 사용하므로 Decoder에서 Encoder의 출력과 Attention을 하는 부분인 Encoder-Decoder Multi-Head attention 부분을 제거하였다.
그리고 12개의 transformer 층을 쌓은 후 방대한 텍스트 데이터를 이용하여 GPT-1 모델을 만들었다.</p>
<p><img src="https://user-images.githubusercontent.com/63804074/122996261-a094a600-d3e5-11eb-80f7-15e9566a90ff.png" alt="GPT"></p>
<p><img src="https://user-images.githubusercontent.com/63804074/123052203-8a1a3900-d43d-11eb-9bdd-41486b1e0764.png" alt="image"></p>
<p><strong>GPT-1</strong>은</p>
<p>1) 큰 말뭉치에서 대용량의 언어모델 학습
2) 분류 데이터를 써서 과제에 맞춰 모델을 fine-tuning하는 방식으로 진행된다.
<strong>GPT-1</strong>은 12개 중 9개의 nlp task에서 sota(state of art)를 달성
<br><br><br></p>
<h2 id="3-bert">3. BERT</h2>
<h3 id="3-1-problem-with-previous-methods">3-1) problem with previous methods</h3>
<p><img src="https://user-images.githubusercontent.com/63804074/122996363-c15cfb80-d3e5-11eb-8656-ff9f0292ac8e.PNG" alt="bert_이전의 문제">
<strong>problem:</strong> LM(언어 모델)은 left, right 맥락으로만 사용되었다. 그러나 언어는 양방향 이해가 필요하다.
<br>
<strong>LM(언어 모델)이 단방향이었던 이유</strong>
<br>
<img src="https://user-images.githubusercontent.com/63804074/122996377-c4f08280-d3e5-11eb-8071-2550301caac4.png" alt="단방향-양방향"></p>
<ul>
<li>확률 분포를 잘 형성하기 위해서 방향성이 필요했다.</li>
<li>양방향 encoder에서는 단어가 자기를 볼 수 있다.<br>
기존의 단반향 LM은 <SOS>가 들어가면 다음 단어를 예측하는 방식이었다. 양방향 LM이 am을 예측할때 순방향 모델의 정보(<SOS>, I)와 역방향 모델의 정보(a, am, i)를 가지고 있다. ** 즉, am을 예측하기 위해 am의 정보를 가지고 있는 상황이 발생한다**
<br>
#### ??? : 아까 ELMO도 양방향이라면서요? 그건 단어가 자기자신을 보는게 아닌가요?
-> 위 질문에 대한 답은 뒤에서 서술하겠습니다.

</li>
</ul>
<h3 id="3-2-problem-with-previous-methods">3-2) problem with previous methods</h3>
<h4 id="--masked-lm">- <strong>Masked LM</strong></h4>
<p> <img src="https://user-images.githubusercontent.com/63804074/122996408-cae66380-d3e5-11eb-8303-5e1dbba9a562.PNG" alt="maskedmodel">
  양방향 학습의 문제를 해결하기 위해서 <strong>Masked LM</strong>이 탄생했다. 
  <strong>Masked LM</strong>이란 입력 텍스트 단어 집합의 15%의 단어를 랜덤으로 masking하고 masking된 단어를 예측하는 방법이다.
이때 masking 개수가 적으면 학습하는데 많은 비용이 들고, 너무 많다면 맥락의 수가 적어져 예측이 어렵다.</p>
<h4 id="masked-lm-을-통한-양방향-학습을-사용하는-모델이-bert이다"><strong>Masked LM</strong> 을 통한 양방향 학습을 사용하는 모델이 Bert이다.</h4>
<p><img src="https://user-images.githubusercontent.com/63804074/122996419-ce79ea80-d3e5-11eb-9256-b2acfaf33940.png" alt="bert_model"></p>
<p>  <img src="https://user-images.githubusercontent.com/63804074/123053104-833ff600-d43e-11eb-8e44-968e714b05de.png" alt="image"></p>
<p>  Bert는 transformer에서 디코더를 제외하고 인코더만 사용한다.
Bert의 작동구조는 Bert를 이용하여 pretrained-model에 분류를 위해 fined tuning을 하는 구조이다.
    <br></p>
<h4 id="--bert-vs-gpt-vs-elmo-">- *<em>Bert VS GPT vs ELMO *</em></h4>
<p>  <img src="https://user-images.githubusercontent.com/63804074/122996439-d5a0f880-d3e5-11eb-9e8e-b084ccf7e9d4.png" alt="다른모델과 비교"></p>
<ul>
<li>ELMO는 정방향/역방향 LSTM을 각각 훈련시키고 합쳐 양방향 언어 모델을 만들었다. <ul>
<li>GPT-1은 transformer의 decoder를 이전 단어로 다음 단어를 예측하는 단방향 언어모델을 만들었다.</li>
<li>Bert는 GPT와 달리 Masked LM을 사용하여 양방향 학습을 사용하는 모델이다.</li>
</ul>
</li>
</ul>
<h3 id="3-3-bert-pretraining">3-3) Bert pretraining</h3>
<h4 id="3-3-1-bert-pretraining-방법">3-3-1) Bert pretraining 방법</h4>
<p>   Bert pretraining 방법은 *<em>Masked LM(MLM)/Next sentence prediction(NSP) *</em> 2가지로 나뉜다.
    <br>
   ** 방법1) Masked LM(MLM) **
    <img src="https://user-images.githubusercontent.com/63804074/122996458-da65ac80-d3e5-11eb-89b6-33aaee88feb4.PNG" alt="masked_LM_데이터마스킹">
      Bert는 사전 훈련을 위해 신경망 input으로 들어가는 입력 text의 15%를 랜덤으로 masking하고 masking을 예측한다.</p>
<p><img src="https://user-images.githubusercontent.com/63804074/122996500-e5b8d800-d3e5-11eb-96fd-a905e170f423.png" alt="masking예시"></p>
<p>위의 예시처럼 My dog is cute. He likes playing이라는 문장에 대해 masked language 모델을 학습하려고 할 때 [my, dog, is, cute, he, likes, play, ##ing]로 토큰화가 되어 bert에 입력으로 사용된다. 
여기서 dog가 [mask]되었는데 Bert 모델이 [mask]된 단어를 맞추려고 하고 이때 dog 위치의 출력층 벡터만 사용한다.</p>
<p>위 사진 처럼 <strong>[Mask]</strong> 토큰만 사용하면 mask token이 파인튜닝 단계에서 나타나지 않는다. 이를 해결하기 위해 
      15%의 80%는 [mask]로 EX) went to the store -&gt; went to the [mask]
      15%의 10%는 랜덤으로 단어 변경 EX) went to the store -&gt; went to the running
      15%의 10%는 동일하게 EX) went to the store -&gt; went to the store</p>
<p><img src="https://user-images.githubusercontent.com/63804074/122996535-efdad680-d3e5-11eb-923a-08da8708e55f.png" alt="마스킹예시2"></p>
<p>여기서는 He -&gt; king / play를 play 그대로 사용한다. [mask], &#39;king&#39;, &#39;play&#39;에서도 원래 단어를 예측한다.</p>
<p><img src="https://user-images.githubusercontent.com/63804074/122996579-fbc69880-d3e5-11eb-8836-97398540fefe.png" alt="maskedLM"></p>
<p>따라서, Bert에서는 input과 masked된 token을 Transformer encoder에 넣고 token을 예측하므로 양방향 학습을 한다.</p>
<p>  ** 방법2) Next sentence prediction(NSP) **
  Next sentence prediction(NSP)는 QA나 Natureal language inference와 같이 두 문장 사이의 관계를 이해하도록 두 문장을 이어서 맞추는 것이다.</p>
<p><img src="https://user-images.githubusercontent.com/63804074/122996510-e81b3200-d3e5-11eb-97be-2f46f8ea0e62.png" alt="NSP"></p>
<p>  pre-training 시에는 50:50 비율로 실제 이어지는 문장과 랜덤한 문장을 넣어서 Bert가 맞추도록 한다.</p>
<p><img src="https://user-images.githubusercontent.com/63804074/122996614-084af100-d3e6-11eb-8163-d7d3206e0a4f.PNG" alt="NSI"></p>
<p>Bert의 입력에 [Sep]라는 토큰을 넣어 문장을 구분한다. 문장 분류 문제를 위해 [CLS] 토큰을 추가하여 [CLS]의 출력층에서 NSP 분류 문제를 푼다. 
 이때 NSP와 MLM은 loss를 합하여 학습이 이루어진다.</p>
<h4 id="3-3-2-bert-pretraining의-input">3-3-2) Bert pretraining의 input</h4>
<p><img src="https://user-images.githubusercontent.com/63804074/122996714-26b0ec80-d3e6-11eb-8668-2c8e99dfecf3.png" alt="bert-input-representation">
Bert의 input은 3가지 embedding 값의 합으로 이루어짐</p>
<ul>
<li><p><strong>Token Embedding</strong> : WordPiece Embedding 사용. Embedding 벡터의 종류는 단어 집합의 크기</p>
<br></li>
<li><p><strong>WordPiece</strong> : <strong>단어보다 더 작은 단위로 쪼개는 tokenizer</strong>
자주 등장하는 단어는 단어집합에 추가하고 자주 등장하지 않는 단어는 더 작은 단위의 서브워드로 분리되어 서브 워드들이 단어집합에 추가된다. 
해당 토큰의 첫번째 서브워드를 제외한 나머지 서브워드들은 앞에 ##을 붙인 것을 토큰으로 한다. 
위의 예시인 Playing의 경우 Play, ####ing로 분리 되었다. 이때 ###은 단어의 중간부터 등장하는 <strong>서브워드</strong>라는 것을 알리기위해 표시해둔 기호. 단어 집합을 기반으로 토큰화를 수행한다. </p>
<br></li>
<li><p><strong>segment Embedding</strong> : QA 등과 같은 두개의 문장 입력이 필요한 task를 풀 때 segment embedding 사용한다. <strong>만약 문장이 하나면?? Sentece A embedding만 사용</strong></p>
<br>
</li>
<li><p><strong>position Embedding</strong> : 위치 정보를 학습하기 위한 Embedding이다. Embedding 벡터의종류는 문장의 최대 길이인 512개, Transformer에서 positional encoding 방법과 같다. </p>
<br>
</li>
<li><p>모든 sentence의 첫번째 token은 언제나 [CLS](special classification token)이다. 이 token이 transformer층을 통과하고 나면 token sequence의 결합된 의미를 가지게 된다. 이때 [CLS]에 classifier을 붙이면 classification을 쉽게 할 수 있다. Classification task가 아니면 [CLS]무시.</p>
</li>
</ul>
<h4 id="3-3-3-bert-pretraining-procedure">3-3-3) Bert pretraining procedure</h4>
<p>   1단계 : 위키피디아, book corpus 데이터 이용</p>
<p>   2단계 : NSP를 위해 sentence를 뽑아서 <strong>Sentence embedding</strong>을 넣는다(이때, 50%는 진짜 sentence, 나머지는 random sentence)</p>
<p>   3단계: <strong>masking</strong> 작업을 하고 masking 예측</p>
<p>   ** -pretraing hyper parameter**
<img src="https://user-images.githubusercontent.com/63804074/122996736-2c0e3700-d3e6-11eb-88de-f7295a9e68f7.PNG" alt="bert_detail"></p>
<p>이제 pre-train 과정이 끝났으니 task를 위한 fine tuning에 대해 알아보자</p>
<h3 id="3-4-bert-fine-tuning">3-4) Bert fine tuning</h3>
<p><img src="https://user-images.githubusercontent.com/63804074/122996745-2fa1be00-d3e6-11eb-9277-e852a13aa9fe.png" alt="bert_fine_tuning">
    ** a,b는 sequence-level task / c,d는 token-level task다.**</p>
<p>  <strong>a) Sentence Pair Classification Tasks: 텍스트의 쌍에 대한 분류 문제</strong>
<img src="https://user-images.githubusercontent.com/63804074/122996774-36c8cc00-d3e6-11eb-9421-7c0df3b699df.png" alt="fine_tuning_a">
       <strong>task:</strong> NLI(자연어 추론) - 두문장이 주어졌을때 하나의 문장이 다른 문장과 어떤 관계가 있는지 추론
       입력텍스트가 1개가 아니므로 text 사이에 [sep]토큰을 넣고 두 종류의 <strong>segment embedding</strong> 사용</p>
<p>  *<em>b) single sentence Classification Tasks: 하나의 텍스트에 대한 텍스트 분류 유형 *</em>
<img src="https://user-images.githubusercontent.com/63804074/122996777-37616280-d3e6-11eb-9315-f98c24fd2c81.png" alt="fine_tuning_b">
    영화 리뷰 감성분류, 뉴스 분류 등 입력한 문서에 대해서 분류를 하는 유형으로 [CLS] 토큰을 사용하여 토큰의 위치 출력층에서 Dense layer또는 FC layer를 추가하여 분류에 대한 예측 실행</p>
<ul>
<li>a,b는 <strong>Sequnce-level task</strong>이고 이 task에 대한 BERT-fine tuning과정은</li>
</ul>
<ol>
<li>[CLS] token의 output값을 사용하고</li>
<li>이때 [CLS] token의 벡터는 H차원(hidden size)</li>
<li>classify하고 싶은 K에 따라 classification layer를 붙여 K*H의 classification layer를 만듦</li>
<li>softmax를 통과하여 label probabilities 도출하는 과정이다.</li>
</ol>
<p><strong>c) Question Answering Tasks : 질의응답 **
<img src="https://user-images.githubusercontent.com/63804074/122996780-37f9f900-d3e6-11eb-9c05-5122eacd125f.png" alt="fine_tuning_c">
      **task:</strong> 텍스트의 쌍을 입력 받는 QA
      질문과 본문을 입력 받으면 분문의 일부를 추출해서 질문에 답변하는 것이다. token들에서 Stand/end span을 찾아낸다.</p>
<p>  <strong>d)single Sentence Tagging Tasks : 하나의 텍스트에 대한 태깅 작업</strong>
<img src="https://user-images.githubusercontent.com/63804074/122996781-37f9f900-d3e6-11eb-9316-f8cc3895bbec.png" alt="fine_tuning_d">
        Named entity Recognition(NER)이나 형태소 분석과 같이 single sentence에서 각 토큰이 어떤 class를 갖는지 모두 classifier적용
        <br>
        <br></p>
<h3 id="3-5-experiment">3-5) Experiment</h3>
<p><img src="https://user-images.githubusercontent.com/63804074/122996792-3c261680-d3e6-11eb-8ea2-6ef03f40475a.png" alt="bert_result">
        모든 NLP task에서 sota 달성
     <br>
** - Effect of pre-training Task**
<img src="https://user-images.githubusercontent.com/63804074/122996810-421bf780-d3e6-11eb-881d-d200797884bb.PNG" alt="effect of pretrained model">
       Pre-training task를 하나라도 제거하면 성능이 떨어진다. 
       NSP가 문장간의 논리적구조 파악에 중요한 역할을 하고 있기때문에 NO NSP의 경우에는 NLI(자연어 추론)에서 성능이 떨어지는 것을 볼 수 있다.
MLM대신 LTR(left to right)을 사용하면 BI-LSTM을 사용하더라도 성능이 많이 떨어진다. MLM이 더 Bidirectional한 것을 볼 수 있다.
<br>
 <strong>- Effect of directionality and training Time</strong>
<img src="https://user-images.githubusercontent.com/63804074/122996816-45af7e80-d3e6-11eb-9ac9-121fb0fb3b9c.PNG" alt="effect of training time">
       MLM은 수렴까지 시간이 좀 걸리지만 결과는 훨씬 좋다.
       <br></p>
<p>   <strong>- Effect of model size</strong>
<img src="https://user-images.githubusercontent.com/63804074/122996828-49430580-d3e6-11eb-9dbb-98e15159227d.PNG" alt="effect of model size">
       모델이 커질수록 정확도가 올라감 그러나 그렇게 눈에 띄는 변화는 아니다.
   <br>
  <br></p>
<h2 id="4-post-bert-pre-training-advancement---------br">4. Post-Bert pre-training Advancement         <br></h2>
<h4 id="4-1-robertaa-robustly-optimized-bert-pretraining-approach"><strong>4-1) ROBERTA(A Robustly Optimized BERT Pretraining Approach)</strong></h4>
<h6 id="httpsarxivorgpdf190711692pdf"><a href="https://arxiv.org/pdf/1907.11692.pdf">https://arxiv.org/pdf/1907.11692.pdf</a></h6>
<p>   Bert가 underfit한 상황으로 생각하여 모델을 더 오래 학습하고 더 많은 데이터를 넣어서 성능을 높임</p>
<ul>
<li><p>학습데이터 : Bert에 비해 더 많은 데이터로 더 오래 더 큰 배치로 학습진행
pre-training에 이용하는 데이터(BERT:16GB -&gt; Robert:160GB) </p>
</li>
<li><p>결과 : 데이터의 양과 다양성이 중요하고 오래학습해도 overfitting이 보이지 않았다. </p>
 <br>
####  **4-2) XLNET(Generalized Autoregressive Pretraining for Language Understanding)**
###### <https://arxiv.org/pdf/1906.08237.pdf>

<p>임베딩의 모델의 흐름은 2가지</p>
</li>
<li><p><em>1. AR(autoregressive)모델 :*</em> 데이터를 순차적으로 처리하는 기법
EX) ELMO, GPT
EX) 나는 사과를 먹는다 : 나는 → 사과를 → 먹는다</p>
</li>
<li><p><em>단점:*</em> 문맥을 양방향으로 볼 수 없다는 문제</p>
</li>
<li><p><em>2. AE(AutoEncoding) 모델 :*</em> 입력값을 복원하는 기법들
EX) BERT-masking기법(masking 토큰을 예측)
EX) 나는 [mask] 먹는다 : 나는 → [mask] ← 먹는다.</p>
</li>
<li><p><em>단점:*</em> masking한 토큰을 서로 독립으로 가정하여 token들 사이의 의존관계(dependency) 고려할 수 없다.</p>
<p>AR, AE 모델의 한계를 극복하기위해 permuation language model인 XLNET을 제안했다.</p>
<p><img src="https://user-images.githubusercontent.com/63804074/123059803-1b40de00-d445-11eb-9320-813fa1c06caa.png" alt="image"></p>
<p>input sequence index의 모든 permuation(순열)을 고려한 AR방식.
Zt는 index의 permuation 조합을 사용하여 다양한 sequence 고려 
EX) input sequence가 4면 Zt는 4!
각 순열에 AR Language model의 objective fuction 적용하여 특정 token에 양방향 context 고려</p>
<p>EX)<img src="https://user-images.githubusercontent.com/63804074/123063602-8a6c0180-d448-11eb-938b-494a438474a0.png" alt="image">
발 없는 말이 천리 간다 -&gt; permuation하여 발, 없는, 천리, 이, 말, 간다 집합이 아왔고 천리를 예측할때의 입력 시퀀스는 발, 없는이 된다.</p>
</li>
<li><ul>
<li>시퀀스를 순차적으로 학습하는 AR 모델이지만 permuation을 통해 문장의 양방향 문맥을 고려하게 된다.**<br></li>
</ul>
</li>
<li><p>[3,2,4,1]에서 3을 학습할때
<img src="https://user-images.githubusercontent.com/63804074/123064019-e171d680-d448-11eb-9067-d0d8d912af5b.png" alt="image"></p>
</li>
<li><p>[2, 4, 3, 1]에서 3을 학습할때 2, 4로 3을 예측
<img src="https://user-images.githubusercontent.com/63804074/123064222-0cf4c100-d449-11eb-8359-20b9feef9dc7.png" alt="image"></p>
<p><img src="https://user-images.githubusercontent.com/63804074/123064518-4d543f00-d449-11eb-9e00-731ef875da26.png" alt="image"></p>
<p>permutation은 attetion mask로 실현한다.</p>
<p>3번 단어를 맞추기 위해서는 정보를 사용할 수 없고, 2번을 맞출땐 3번 단어 정보를 이용하는 방식으로 사용된다. </p>
</li>
<li><p><em>하지만 위 방법은 학습시 permuation 하기때문에 예측할 token이 명확하지 않아 Standard Transformer에서 작동하지 않는다.*</em></p>
<p>따라서 Transformer에 XLNET의 object function을 적용하기 위해 Two-stram self-attention 제안.</p>
</li>
<li><p><em>Two-stram self-attention*</em>은 쿼리 스트림과 컨텐트 스트림을 합하여하여 2개의 hidden representation를 가진고 업데이트하는 기법.
** * 컨텐트 스트림 :** t 시점과 t이전 시점의 token정보(transformer와 같은 연산)
[3, 2, 4, 1]인 경우
<img src="https://user-images.githubusercontent.com/63804074/123067192-bb9a0100-d44b-11eb-9e3b-3cf1a0808344.png" alt="image">
x: 토큰 임베딩
h: 컨텐트 스트림 벡터</p>
<p>** * 쿼리 스트림 :** 토큰과 위치 정보를 활용한 self-attention 기법(t 이전 시점의 token정보 + t시점의 정보)
[3, 2, 4, 1]
<img src="https://user-images.githubusercontent.com/63804074/123067789-411db100-d44c-11eb-958d-6388ee697a10.png" alt="image"></p>
</li>
</ul>
<h4 id="-4-3-albertalbert-a-lite-bert-for-self-supervised-learning-of-language-representations">** 4-3) ALBERT(ALBERT: A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS)**</h4>
<h6 id="httpsarxivorgpdf190911942pdf"><a href="https://arxiv.org/pdf/1909.11942.pdf">https://arxiv.org/pdf/1909.11942.pdf</a></h6>
<p>  -워드 임베딩을 embedding size로 설정해서 파라미터수를 줄였다.
  -attention과 FFNN 레이어 간 파라미터를 공유하는 Cross-layer parameter sharing기법을 사용하여 파라미터 수를 줄이고, 학습도 안정적으로 가능하였다.</p>
<p>  Bert에 비해 param 수도 적고 Training speed가 빠르다
  <img src="https://user-images.githubusercontent.com/63804074/123062913-e71aec80-d447-11eb-8bb2-76a8225cb4c1.png" alt="image"></p>
<h4 id="-4-4-t5exploring-the-limits-of-transfer-learning-with-a-unified-text-to-text-transformer">** 4-4) T5(Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer)**</h4>
<h5 id="httpsarxivorgpdf191010683pdf"><a href="https://arxiv.org/pdf/1910.10683.pdf">https://arxiv.org/pdf/1910.10683.pdf</a></h5>
<p>  <img src="https://user-images.githubusercontent.com/63804074/123061975-12e9a280-d447-11eb-807b-e31e18085488.png" alt="image">
  모든 NLP task를 통합할 수 있도록 Text-to-Text 프레임 워크 사용
  모든 NLP task에서 T5라는 동일한 모델, loss, hyperparameter 사용가능
  파라미터 수가 Bert의 2배이므로 Expensive한 모델이다.</p>
<h4 id="-4-5-electraelectra-pre-training-text-encoders-as-discriminators-rather-than-generators">** 4-5) ElecTra(ELECTRA: PRE-TRAINING TEXT ENCODERS AS DISCRIMINATORS RATHER THAN GENERATORS)**</h4>
<h5 id="httpsarxivorgpdf200310555pdf"><a href="https://arxiv.org/pdf/2003.10555.pdf">https://arxiv.org/pdf/2003.10555.pdf</a></h5>
<p>  <img src="https://user-images.githubusercontent.com/63804074/123060363-a02bf780-d445-11eb-8ca8-ef60d6becdbd.png" alt="image">
  <strong>Generator G</strong> : Bert MLM
  <strong>Discriminatior D</strong>: 입력 토큰 sequnce에서 토큰이 original인지 replaced인지 분류</p>
<p>  대용량 corpus에서 Generator loss와 discriminator loss 합을 최소화 하도록 학습한다.</p>
<h2 id="5-distillation">5. Distillation</h2>
<h3 id="5-1-distillation">5-1) Distillation</h3>
<p> 제품에 모델을 적용할 때, Bert와 다른 pretrained language models는 매우 크고 비용이 많이 드는 모델이다. -&gt; Distillation을 통해 <strong>model compression</strong></p>
<h3 id="5-2-distillation의-기술">5-2) Distillation의 기술</h3>
<p>  <img src="https://user-images.githubusercontent.com/63804074/123073414-5a752c00-d451-11eb-9648-ed848401adc6.png" alt="image"></p>
<ul>
<li>Train Teacher : Traing set으로 sota pre-training + fine-tuning하여 모델 정확성 극대화(large model 학습)</li>
<li>Label a large amount of unlabeled input examples with teacher</li>
<li>Train student : Teacher output을 흉내내는 작은 모델 훈련</li>
<li>MSE, CE로 loss를 최소화</li>
</ul>
<p><img src="https://user-images.githubusercontent.com/63804074/123072999-fd797600-d450-11eb-8297-0c0634a8f12b.PNG" alt="distillation">
  Distillation의 목표는 성능을 유지하면서 model을 압축하고자함. </p>
<h3 id="5-3-distillation이-성능이-좋은-이유">5-3) Distillation이 성능이 좋은 이유</h3>
<ol>
<li>거대한 language model을 학습하는 것은 다른 NLPtask에도 유용하다.</li>
<li>Fine-tuning은 대부분 존재하는 latent feature를 조정한다.</li>
<li>기능중 일부만 지정된 작업에 유용하기 때문에 distillation이 일부 feature만 집중하게 해준다. </li>
</ol>
<p>Q. Distillation을 이용해서 만들어낸 모델에 추가 학습을 시키고 싶다면 다시 큰 모델에 추가 학습을 시켜서 압축하는 방식인가요? 아니면 작은 모델에 추가로 학습을 진행하나요??</p>
<p>A. 정확도를 극대화 시키는부분은 Teacher 파트이므로 큰 모델에 추가 학습을 진행한다.
  &lt;참고&gt;: <a href="https://blog.est.ai/2020/03/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%AA%A8%EB%8D%B8-%EC%95%95%EC%B6%95-%EB%B0%A9%EB%B2%95%EB%A1%A0%EA%B3%BC-bert-%EC%95%95%EC%B6%95/">https://blog.est.ai/2020/03/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%AA%A8%EB%8D%B8-%EC%95%95%EC%B6%95-%EB%B0%A9%EB%B2%95%EB%A1%A0%EA%B3%BC-bert-%EC%95%95%EC%B6%95/</a></p>
<h2 id="6conclusion">6.conclusion</h2>
<p>   <strong>-Pre-trained된 양방향 language models은 성능이 좋다. 하지만 매우 expensive하고 성능을 개선하려면 더 expensive한 모델과 더 많은 data가 요구된다.</strong></p>
<p>   <strong>-위 모델을 servivng/inference에 사용하기 위해서는 distillation을 통해서 해결해야한다.</strong></p>
<h2 id="reference">reference</h2>
<p><a href="https://tmaxai.github.io/post/BERT/#4-experiments">https://tmaxai.github.io/post/BERT/#4-experiments</a>
<a href="https://wikidocs.net/115055">https://wikidocs.net/115055</a>
<a href="https://www.youtube.com/watch?v=knTc-NQSjKA&amp;t=1049s">https://www.youtube.com/watch?v=knTc-NQSjKA&amp;t=1049s</a>
<a href="https://arxiv.org/pdf/1810.04805.pdf">https://arxiv.org/pdf/1810.04805.pdf</a>
<a href="https://baekyeongmin.github.io/paper-review/roberta-review/">https://baekyeongmin.github.io/paper-review/roberta-review/</a>
  XLNET:<a href="https://ratsgo.github.io/natural%20language%20processing/2019/09/11/xlnet">https://ratsgo.github.io/natural%20language%20processing/2019/09/11/xlnet</a>
  ElecTra:<a href="https://blog.pingpong.us/electra-review/">https://blog.pingpong.us/electra-review/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Lecture 18 - Constituency Parsing and Tree Recursive Neural Networks]]></title>
            <link>https://velog.io/@tobigs-text1415/Lecture-18-Constituency-Parsing-and-Tree-Recursive-Neural-Networks</link>
            <guid>https://velog.io/@tobigs-text1415/Lecture-18-Constituency-Parsing-and-Tree-Recursive-Neural-Networks</guid>
            <pubDate>Wed, 23 Jun 2021 10:01:17 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 건국대학교 응용통계학과 정재윤</p>
<h1 id="constituency-parsing">Constituency Parsing</h1>
<p><img src="https://user-images.githubusercontent.com/68625698/122896011-9e016480-d383-11eb-9075-e9506300683a.PNG" alt="그림 1"></p>
<p>컴퓨터가 자연어를 이해하기 위해 필요한 과정인 parsing은 이미 이전의 강의에서 여러번 다뤘으니 깊게 설명하지는 않겠습니다. 위의 이미지는 parsing의 종류에 대해서 직관적으로 이해할 수 있게 cs224n에서 제공하는 이미지입니다. 왼쪽이 Bag of word를 표현하는 것입니다. 오른쪽은 언어학자들이 표현하는 parsing 방식으로 오늘 다룰 내용입니다.</p>
<p><img src="https://user-images.githubusercontent.com/68625698/122897278-cfc6fb00-d384-11eb-8f47-850387e718de.PNG" alt="그림 2"></p>
<p>본격적으로 설명하기에 앞서 Compositionality의 의미에 대해서 먼저 알아보겠습니다. 사전적인 뜻으로는 &#39;구성&#39;을 의미합니다. 그림과 같이 작은 부품들이 모여서 하나의 새로운 것을 만든다는 것을 내포하는 단어인거죠. 이는 언어적인 측면에서도 보입니다. 즉, 여러 개의 단어들을 이용하여 하나의 문장 혹은 새로운 단어로 표현 가능하게 됩니다. 반대로 생각한다면 컴퓨터는 모르는 단어를 자신이 아는 단어로 표현하여 읽어낼 수 있다로 볼 수 있습니다.</p>
<p><img src="https://user-images.githubusercontent.com/68625698/122898922-44e70000-d386-11eb-97a7-a3c33b9ead00.PNG" alt="그림 3"></p>
<p>대표적인 예시가 위의 그림인데요. snowboarder와 A person on a snowboard는 같은 의미임에도 불구하고 후자는 여러개의 단어들을 사용해서 하나의 단어로 표현한 것을 알 수 있습니다. </p>
<p><img src="https://user-images.githubusercontent.com/68625698/122901364-71038080-d388-11eb-842d-611f667996be.PNG" alt="그림 4"></p>
<p>즉, 언어를 단어의 조각들로 파악하고 이러한 구조를 세워 그 의미를 찾아보자는 것이 이번 강의의 주내용인 것입니다. (사족으로 하나 알아두셨으면 하는 점은 언어가 재귀적으로 가능하냐에 대한 것인데요. 인간의 언어라고 하는 것이 무한할 수 없기에 불가능하다 가능하다로 이야기가 많다고 합니다.)</p>
<p><img src="https://user-images.githubusercontent.com/68625698/122902655-a0ff5380-d389-11eb-94a2-dde8ce136d8b.PNG" alt="그림 5"></p>
<p>이제 구체적으로 어떻게 문장을 vector space에 맵핑하는지 알아봅시다. 각 단어들을 Tree RNN에 넣어서 일련의 과정을 통해 문장의 의미를 추출하여 최종 벡터를 구하게 됩니다. 규칙은 그림과 같습니다. 이러한 Tree RNN 구조는 RNN구조보다 의미파악에 있어서 훨씬 유용합니다.</p>
<p><img src="https://user-images.githubusercontent.com/68625698/122904349-36e7ae00-d38b-11eb-9bca-03fd05bccdd5.PNG" alt="그림 6"></p>
<p>RNN의 경우, Tree RNN과는 달리 단어들을 합친 문장의 의미를 파악하는데에는 한계를 가집니다. RNN은 여러 layer를 거친 뒤, 최종 벡터를 파악하는 데에 중점을 두고 있기 때문이죠. 반면 Tree RNN의 구조는 마지막에 집중하는 것이 아닌 관계에 집중하고 있는 구조입니다.</p>
<h1 id="simple-tree-rnn">Simple Tree RNN</h1>
<p>구체적으로 Tree RNN에 대해서 이야기해보겠습니다. 우선 Tree RNN을 진행하기 위해서는 크게 2가지가 선행되어야 합니다. 첫 째로 단어의 의미를 알고 있어야하고, 둘 째로 단어들이 결합하는 방식에 대해서 알아야 합니다. </p>
<p><img src="https://user-images.githubusercontent.com/68625698/122908065-b165fd00-d38e-11eb-89bb-2b7d400a497b.PNG" alt="그림 8"></p>
<p>단어를 모두 안다는 가정하에 규칙에 대해서 알아봅시다. 우선 두 벡터를 NN에 태워서 (8,3)이라는 부모 벡터와 1.3이라는 score를 구합니다. 여기서 부모 벡터는 c1과 c2를 concat하여 공식과 같은 방식으로 구하게 됩니다. 이 때 중요한 건 어떤 부모 벡터를 구하든 모두 같은 W를 사용한다는 점입니다. </p>
<p>score는 조합할 단어를 선택할 때 반영하는 값입니다. 즉, 단어를 선택하는 기준으로 해당 단어가 얼마나 말이 되는지를 평가합니다.
<img src="https://user-images.githubusercontent.com/68625698/122908720-6a2c3c00-d38f-11eb-92cf-5a0c8c70e98f.PNG" alt="그림 9">
우선 인접한 단어들의 조합을 통해 부모 벡터와 score를 greedily하게 모두 구합니다. 그리고 score가 높은 단어들로 다음 부모 벡터와 score값을 계산합니다. 이렇게 되면 아래와 같은 그림이 나오게 됩니다. 
<img src="https://user-images.githubusercontent.com/68625698/122909127-d5760e00-d38f-11eb-87d2-511fd6ff8f27.PNG" alt="그림 10">
이 과정을 부모벡터가 가장 위에 하나만 남을 때까지 계속해서 반복하게 됩니다. 즉, 아래의 그림과 같이 나올 때까지 계속 진행하는 것입니다.
<img src="https://user-images.githubusercontent.com/68625698/122909319-0c4c2400-d390-11eb-8cf5-a8152e2c5559.PNG" alt="그림 11">
이러한 모델의 backpropagation은 일반적인 backpropagation과 크게 차이가 없습니다. 이런 과정을 거치면 simple Tree RNN은 그렇게 성능이 떨어지지는 않지만, 앞서 W가 모든 노드에서 동일하다는 단점을 가집니다. 즉, 언어가 복잡하고 고차 구성이며 긴 문장으로 들어오면 적절하지 못하다는 것이죠. 또한 인풋 단어간 상호작용이 없다는 점과 조합 함수가 모든 경우에 대해서 동일 하기 때문에 다양성이 떨어지게 됩니다.</p>
<h1 id="syntactically-united-rnn">Syntactically-United RNN</h1>
<p>simple Tree RNN은 이러한 단점을 가지기에 사람들은 더 나은 모델을 고안했습니다. 그 모델이 바로 Syntactically-United RNN이라는 모델입니다. 이전의 simple Tree RNN과 가장 큰 차이점은 모든 조합에서 똑같이 사용되었던 행렬 W를 각기 다르게 설정한다는 점입니다.
<img src="https://user-images.githubusercontent.com/68625698/122983050-8acbb480-d3d6-11eb-97f6-623c569f6532.PNG" alt="그림 12">
그러나 이런 방식으로 진행할 때의 문제는 바로 speed입니다. 아무래도 각 matrix를 찾아야하기에 학습에 시간이 오래걸리게 됩니다. 이에 대한 해결법으로 나온 것이 바로 PCFG방식입니다. PCFG란 한 문장에 k개의 문장 구조를 만들고 적절한 문장 구조를 바탕으로 학습을 진행하는 방식입니다. 즉, 만든 문장 구조를 바탕으로 Tree RNN에 적용하는 방식입니다.</p>
<h1 id="recursive-matrix---vector-rnn">Recursive Matrix - Vector RNN</h1>
<p><img src="https://user-images.githubusercontent.com/68625698/122987678-d2087400-d3db-11eb-9ca7-8e667b3fa051.PNG" alt="그림 14"></p>
<p>그림과 같이 연산을 진행하는 모델이 바로 MV-RNN이다. MV-RNN에서 중요한 점은 단어에 대한 정보를 단순히 벡터에 국한하지 않았다는 점입니다. 단어의 Matrix를 만들어 정보의 손실을 줄이는 방법을 선택하여 문장의 의미를 더 담을 수 있게 만들었습니다.</p>
<p>과정은 이러합니다. 우선 각 단어의 벡터와 행렬을 준비합니다. 한 단어의 벡터와 다른 단어의 행렬을 연산을 통해 값을 구해줍니다. 그리고 나온 벡터값을 일련의 함수처리를 통해 최종값을 구해줍니다. </p>
<h1 id="rntn">RNTN</h1>
<p>RNTN에 대해서 설명하려면 감성분석에 대해서 잠깐 언급해야 합니다. 전통적으로 감성분석은 꾸준히 발전했습니다. 따라서 굳이 새로운 모델을 만들지 않아도 love, great과 같은 단어를 찾아서 의미를 부여하면 꽤나 높은 성능을 갖기 때문입니다. 하지만 아래와 같이 조롱이 섞인 문장의 경우, 그 안의 감성을 잘못 찾았습니다. </p>
<p><img src="https://user-images.githubusercontent.com/68625698/122988557-d6815c80-d3dc-11eb-9d79-8fb6d7c8e811.PNG" alt="그림 15"></p>
<p>이러한 문제는 MV-RNN에서도 계속해서 발견되면서 이를 분석하기 위한 새로운 모델이 필요했습니다. 그래서 제시된 모델이 바로 RNTN입니다. </p>
<p><img src="https://user-images.githubusercontent.com/68625698/122989640-011fe500-d3de-11eb-98b9-9325924d1989.PNG" alt="그림 16"></p>
<p>오른쪽의 그림이 RNTN의 구조입니다. 즉, 핵심은 계속된 행렬의 계산이 아닌 Tensor(3차원)으로 연산을 진행하면서 정보의 양은 동일하면서 파라미터를 줄여 연산 속도를 줄이는 것입니다. </p>
<p><img src="https://user-images.githubusercontent.com/68625698/122990667-311bb800-d3df-11eb-9ef6-0a775c9107da.PNG" alt="그림 17"></p>
<p>이렇게 만들어진 RNTN은 일반적인 데이터셋에서는 큰 효과를 못 얻었지만 TreeBank에 관한 데이터셋에서는 큰 Accuracy를 얻었습니다.</p>
<h1 id="limitation">Limitation</h1>
<p>지금까지 여러 TreeRNN에 대해서 알아봤습니다. 굉장히 좋은 것 같으나 현재 저희들의 인식에서는 조금 생소한 개념이었던 것 같습니다. 그 이유는 현실적으로 TreeRNN을 사용하기 어렵기 때문입니다. 대표적인 이유는 GPU연산이 힘들기 때문입니다. 동일하게 병렬적 연산이 진행되는 것이 아닌 연산의 구조나 Tree모델이 다르다는 점 때문입니다. 또한 데이터 구축이 일반 데이터보다 훨씬 어렵기 때문입니다.</p>
<h1 id="reference">Reference</h1>
<ol>
<li>CS224n lecture 18</li>
<li><a href="https://www.youtube.com/watch?v=TcNvkPoaXas">https://www.youtube.com/watch?v=TcNvkPoaXas</a></li>
<li><a href="https://ratsgo.github.io/deep%20learning/2017/06/24/RNTN/">https://ratsgo.github.io/deep%20learning/2017/06/24/RNTN/</a></li>
<li><a href="https://velog.io/@tobigs-text1314/CS224n-Lecture-18-Constituency-Parsing-TreeRNNS">https://velog.io/@tobigs-text1314/CS224n-Lecture-18-Constituency-Parsing-TreeRNNS</a></li>
<li><a href="https://jeongukjae.github.io/posts/cs224n-lecture-18-constituency-parsing-and-tree-recursion-neural-networks/">https://jeongukjae.github.io/posts/cs224n-lecture-18-constituency-parsing-and-tree-recursion-neural-networks/</a></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Lecture 15 - Natural Language Generation ]]></title>
            <link>https://velog.io/@tobigs-text1415/Lecture-15-Natural-Language-Generation</link>
            <guid>https://velog.io/@tobigs-text1415/Lecture-15-Natural-Language-Generation</guid>
            <pubDate>Wed, 02 Jun 2021 09:32:59 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 건국대학교 응용통계학과 정재윤</p>
<h1 id="recap--lms-and-decoding-algorithms">Recap : LMs and Decoding Algorithms</h1>
<h2 id="nlg">NLG?</h2>
<p><img src="https://user-images.githubusercontent.com/68625698/120350322-db04a900-c339-11eb-8200-413d4b4f9d01.jpg" alt="nlg 그림"></p>
<blockquote>
<p>Natural Language Understanding (NLU) : 자연어 형태의 문장을 기계가 이해할 수 있게 만드는 기술
Natural Language Generation (NLG) : 학습 결과로 기계가 자연어 문장을 생성하는 기술
Natural Language Processing (NLP) : 자연어의 의미를 분석해 컴퓨터가 처리할 수 있도록 하는 일. 즉, NLG + NLU</p>
</blockquote>
<p>대표적인 Task에는 Machine Translation, Summarization, Dialogue, Creative Writing 등이 있다.</p>
<h2 id="lm-and-conditional-lm">LM and Conditional LM</h2>
<p><img src="https://user-images.githubusercontent.com/68625698/120365822-de079580-c349-11eb-8ff6-7afff592a76b.PNG" alt="수식 2">
LM : 언어 모델링이란 지금까지 주어진 단어를 바탕으로 다음에 나올 단어를 예측하는 작업입니다. 그 대표적인 예시들이 우리가 앞서 배웠던 RNN-LM입니다. 
<img src="https://user-images.githubusercontent.com/68625698/120365828-dfd15900-c349-11eb-8c9e-7987c7328850.PNG" alt="수식 1">
<img src="https://user-images.githubusercontent.com/68625698/120366585-ca106380-c34a-11eb-8a29-0746df634eb1.PNG" alt="예시 1">
Conditional LM : 주어진 단어들과 <strong>어떠한 입력으로부터</strong> 다음 단어를 예측하는 모델입니다. 어떻게 보면 지금까지 저희가 지금까지 배웠던 과정의 대부분은 이 과정이었습니다. 예시로 Machine Translation의 경우, source sentence를 x로, Target sentence를 y로 받는 것이죠. </p>
<p><img src="https://user-images.githubusercontent.com/68625698/120367076-663a6a80-c34b-11eb-8292-b0315f48fd5e.PNG" alt="사진 1"></p>
<p>이러한 Conditional LM을 학습시키는 방법 중에서 강의에서는 Teacher Forcing을 언급합니다. 그림을 보면 알 수 있듯, Teacher Forcing이란, Encoder의 input으로 Source sentence를 넣고, Decoder의 input으로는 Decoder를 빠져나온 output이 아닌 Target sentence를 그대로 넣어서 학습시키는 것입니다. </p>
<h2 id="decoding-algorithms">Decoding Algorithms</h2>
<p>그렇다면 위의 LM이나 Conditional LM을 학습시키고 나선 어떻게 문장을 생성할 수 있을까요? 바로 Decoding Algorithm을 사용하는 것입니다. 우리가 앞서 배운 Decoding Algorithm에서는 Greedy와 Beam search가 있었습니다.</p>
<ol>
<li><p>Greedy Algorithm
우선 Greedy Decoding입니다. Greedy Decoding은 각 출력을 예측하는데 매 스텝에서 가장 가능성이 높은 단어 한 개를 선택합니다. 매 스텝마다 최적값 하나만 찾기 때문에 속도는 월등하죠. 하지만 한 번 단어를 잘못 산출하게 되면 그 이후의 값들 역시 영향을 받기 때문에 결과가 좋지 않을 수 있습니다. 
<img src="https://user-images.githubusercontent.com/68625698/120370085-1b225680-c34f-11eb-97f2-372bb54cbe8c.PNG" alt="사진 2"></p>
</li>
<li><p>Beam search
두 번째로 Beam search 방식입니다. Beam Search는 k개의 가능한 가설들을 두고 가장 높은 확률을 갖는 문장을 찾아 나가는 방식입니다. 이때 k는 beam size를 의미하며, k = 1 이라면 greedy algorithm과 같은 방식이 됩니다. 
<img src="https://user-images.githubusercontent.com/68625698/120370648-d34fff00-c34f-11eb-96d0-c03489953c01.PNG" alt="사진 3">
이 때 최적의 K를 찾는 것이 가장 중요합니다. beam size가 너무 작으면 주제에 맞는 대답은 하지만 말이 안되는 답변을 하게 되고, 반대로 beam size가 너무 크면 일반적이고, 짧은 답변을 산출하지만 BLEU score가 낮을 위험성이 있습니다. </p>
</li>
<li><p>Sampling based decoding
이러한 Beam search의 단점을 보완하기 위해 나온 방식입니다. 즉, 큰 k를 가지더라도 너무 일반적인 답안을 얻지 않게 하기 위해 나온 방식입니다. 
 1) Pure sampling : Greedy Decoding과 비슷하지만 argmax 대신에 랜덤 샘플링을 사용합니다.
 2) Top-n sampling : Pure sampling과는 다르게 확률이 가장 큰 n개의 단어들 중에서 랜덤 샘플링을 진행하는 것입니다. n이 커질수록 다양하지만 적절하지 않은 문장이 생성되고, n이 작을수록 일반적이면서 평범한 문장이 나오게 됩니다. </p>
</li>
</ol>
<p><img src="https://user-images.githubusercontent.com/68625698/120374949-27111700-c355-11eb-8e64-f62598f9bb52.PNG" alt="사진 4"></p>
<h1 id="nlg-tasks-and-neural-approaches-to-them---text-summarization">NLG tasks and neural approaches to them - text summarization</h1>
<h2 id="text-summarization">text summarization?</h2>
<p>text summarization이란 입력 텍스트 x를 바탕으로 중요한 정보만을 정제해서 요약문인 y를 생성하는 작업을 의미합니다. Summarization은 single-document와 multi-document로 나눌 수 있습니다. 하나의 문서에 대해서 요약을 하면 single, 여러 개의 문서에 대한 요약이라면 multi-document가 됩니다. 
<img src="https://user-images.githubusercontent.com/68625698/120417423-c1934980-c399-11eb-975f-1f43f86ee3de.PNG" alt="사진 7"></p>
<p>그리고 summarization은 다른 기준으로 Extractive summarization과 Abstractive summarization으로 나눌 수 있습니다. 강의에서는 형광펜과 만년필로 비유하면서 소개했습니다. Extracitve summarization은 문서의 원본 문장을 그대로 추출하는 방식으로 쉽지만 제한적이고, Abstractive summarization은 중요한 내용을 추출하고 아예 새로운 문장을 만드는 방식으로 더 어렵지만 더 다양한 결과를 얻을 수 있습니다.</p>
<p><img src="https://user-images.githubusercontent.com/68625698/120418912-59923280-c39c-11eb-9169-b5442bc952f4.PNG" alt="사진 9"></p>
<h2 id="pre-neural-summarization">Pre-neural summarization</h2>
<p>Neural Nerwork 기반의 연구가 진행되기 전에는 Extractive summarization을 연구해왔습니다. 그리고 Extracitve summarization은 전형적인 pipeline을 가지는데요. 아래의 그림과 같습니다. 
<img src="https://user-images.githubusercontent.com/68625698/120419436-6c593700-c39d-11eb-9a2e-7570294717e4.PNG" alt="사진 8"></p>
<blockquote>
<p>content selection : 포함할 중요한 문장을 선택
Information ordering : 선택한 문장들을 중요도에 따라 정렬
Sentence realization : 요약 문장을 구성하는 단계</p>
</blockquote>
<h2 id="rouge">ROUGE?</h2>
<p>ROUGE란 Recall Oriented Understudy for Gisting Evaluation의 줄인 말로 텍스트 요약 모델의 성능 평가 지표입니다. 모델이 생성한 요약본을 사람이 미리 만들어 놓은 요약본과 대조하여 성능 점수를 계산하죠. 구체적인 예시를 통해 알아보겠습니다.</p>
<blockquote>
<p>시스템 요약 :
the cat was found under the bed.</p>
</blockquote>
<blockquote>
<p>참조 요약 : 
the cat was under the bed.</p>
</blockquote>
<p><img src="https://user-images.githubusercontent.com/68625698/120426152-83525600-c3aa-11eb-937f-1d675799b0c2.PNG" alt="수식 3"></p>
<p>ROUGE는 recall과 precision을 모두 구할 수 있습니다. 먼저 Recall은 위의 수식처럼 참조요약본을 구성하는 단어 중 몇 개의 단어가 시스템 요약본과 겹치는지 보는 점수입니다. 예시를 보면 1이란 값이 나올 겁니다. 이 값은 정말 좋은 점수이지만 모델 성능을 모두 나타내지는 못합니다. 생성된 문장이 엄청 긴 문장이라면 높은 점수를 얻을 가능성이 존재하기 때문입니다. </p>
<p>이런 문제를 해결하기 위해서 Precision을 계산하는 것입니다. Precision은 Recall과는 반대로 모델이 생성한 시스템 요약본 중 참조 요약본과 겹치는 단어들이 얼마나 많이 존재하는지를 파악하는 지표입니다. 즉, Recall보다는 값이 떨어지게 됩니다. 시스템 요약문의 길이가 길어지면 길어질수록 값은 줄어들게 될 겁니다.</p>
<p><img src="https://user-images.githubusercontent.com/68625698/120427795-8b5fc500-c3ad-11eb-9e21-6088122062dd.PNG" alt="수식 4"></p>
<p>따라서 정확하게 성능 평가를 하기 위해서는 Precision과 Recall을 모두 계산해야하며 F-measure를 구한다면 더 바람직할 것입니다. </p>
<h2 id="neural-summarization-2015---present">Neural summarization (2015 - present)</h2>
<p>2015년, Rush et al 등은 single document abstractive summarization은 번역과 다를 바 없다는 가설을 바탕으로 seq2seq + attention을 적용했습니다. 하지만 seq2seq과 attention만을 적용한 모델은 디테일에 제대로 잡히지 않는 문제점을 가지고 있었습니다. 즉, OOV문제나 고유명사들을 출력하는 성능은 떨어지는 것이죠. </p>
<p><img src="https://user-images.githubusercontent.com/68625698/120429800-fc54ac00-c3b0-11eb-8fa0-f2d954e9cd07.PNG" alt="사진 10"></p>
<p>그래서 이러한 문제점을 보완하고자 summarization에 copy mechanism을 적용했습니다. copy mechanism이란 input으로 들어오는 문장에서 output 생성에 필요한 단어나 구문을 복사해오는 방법입니다. 즉, copy와 generation을 모두 쓰는 방식으로 extractive approach와 abstractive appoarch를 모두 고려하여 디테일을 잡아내고자 한 것입니다. </p>
<p><img src="https://user-images.githubusercontent.com/68625698/120433511-47bd8900-c3b6-11eb-8067-fe6aad8078b3.PNG" alt="사진 11">
<img src="https://user-images.githubusercontent.com/68625698/120433589-5efc7680-c3b6-11eb-9912-968c41b6577e.PNG" alt="수식 5"></p>
<p>그러나 이 copy mechanism에도 너무 많이 copy를 진행해 결국 hybrid가 아닌 extractive 형태가 된다는 점과 전반적으로 좋은 content selection을 하지 못하는 문제가 발생했습니다. 이에 대한 해결책으로 bottom up summarization이 나왔습니다. 단어가 포함되었는지 아닌지를 0과 1로 태깅하여 모델은 단어가 포함되지 않은 부분에는 집중하지 않게 만든 것입니다. </p>
<p><img src="https://user-images.githubusercontent.com/68625698/120437034-a1c04d80-c3ba-11eb-8e59-366d4cb4910b.PNG" alt="사진 12"></p>
<h2 id="dialogue">Dialogue</h2>
<p>Dialogue란 대화 시스템으로 task-oriented dialogue와 social dialogue로 구분지을 수 있습니다. Neural dialogue 이전에는 predefined template 기반으로 시스템을 구축하거나 responses 코퍼스에서 검색하는 방식을 사용했습니다. 그리고 2015년 이후, seq2seq 방식이 도입되면서 open-ended freeform 대화시스템을 만들게 됐습니다. 하지만 seq2seq based dialogue는 심각한 결함들을 가지고 있습니다. </p>
<blockquote>
<p>Genericness
Irrelevant responses
Repetition
Lack of context
Lack of consistent persona</p>
</blockquote>
<h1 id="nlg-evaluation">NLG evaluation</h1>
<p>우선 NLP task에서는 BLEU, ROUGE, F1 등 굉장히 다양한 평가지표들이 있습니다. 그러나 그 어느 하나 명확히 이상적인 지표는 아닙니다. </p>
<p><img src="https://user-images.githubusercontent.com/68625698/120442297-6759af00-c3c0-11eb-8ca5-eab34c721ebd.PNG" alt="사진 13"></p>
<p>모델을 평가하는 방법으로 perplexity도 존재합니다. 이 값이 낮으면 낮을수록 토픽 모델은 실제 문헌 결과를 잘 반영한다는 뜻이므로 학습이 잘 되었다고 평가를 할 수 있겠습니다. 하지만 이 값이 generation을 평가하지는 않습니다. </p>
<p>즉, Fluency, Diversity, Relevance 등 NLG의 각 측면을 평가하는 지표는 있으나 전반적인 NLG 성능을 평가하는 지표는 없는 것이죠.</p>
<p>가장 이상적인 기준에 가까운 지표는 바로 Human Judgement입니다. 사람이 직접 평가하는 것이죠. 그러나 사람이 하는 평가는 너무 오래걸리고 비용이 많이 나간다는 단점이 있습니다. 뿐만 아니라 집중력을 잃거나 일관적이지 않거나 하는 등의 문제들도 있다는 점을 유의하여야 합니다. </p>
<p>특히 chatbot의 경우, 다른 평가 지표들에 비해 사람이 평가하는 것이 굉장히 유의하지만 그렇기에 더 조심스럽게 사용해야한다고 강의에서는 언급하고 있습니다. </p>
<p><a href="https://arxiv.org/pdf/1603.08023.pdf">https://arxiv.org/pdf/1603.08023.pdf</a></p>
<h1 id="nlg-using-unpaired-corpus">NLG Using Unpaired Corpus</h1>
<p><img src="https://user-images.githubusercontent.com/68625698/120447997-1482f600-c3c6-11eb-9e10-bff99a804203.jpg" alt="그림"></p>
<p>지금까지 저희가 배워왔던 자연어 생성 문제 해결 방법들은 입력 정보에 대응하는 출력문장을 준비시켜 학습시키는 Supervised Training에 기반했습니다. 즉, Paired Corpus로 학습을 진행하는 것입니다. 그러나 문제는 이런 데이터가 대량으로 필요하다는 점과 현실적으로 이런 데이터를 구축하는 것은 굉장히 어려운 점이라는 것입니다.</p>
<p>그리고 최근 이 문제점을 돌파하기 위해 Unsupervised training을 연구하고 있습니다. 한 사례를 찾아서 이야기를 해보겠습니다. 중요한 점은 아래와 같습니다. </p>
<blockquote>
<ul>
<li>어떤 스타일의 문장이 들어오더라도 본질적인 Latent vector 형태로 인코딩한다.</li>
</ul>
</blockquote>
<ul>
<li>인코딩된 Latent vectors가 주어졌을 때, 각 스타일에 해당되는 디코더는 해당 스타일의 문장을 생성할 수 있어야 한다.</li>
<li>위의 포인트들을 학습하기 위해 인공 신경망은 Autoencoder loss, Cycle loss를 최소화하는 방향으로 학습하게 됩니다.</li>
</ul>
<p>여기서, Autoencoder loss: X 스타일의 문장 x를 latent vectors로 변환한 후, 이를 다시 X 디코더를 이용해 문장 x’가 생성되었을 때, x’과 원래의 문장 x와 얼마나 다른지, Cycle loss: X 스타일 문장 x를 변환 과정을 통해 Y 스타일의 문장 y로 변환하였을 때, 이 문장 y를 다시 X 스타일로 변환한 문장 x’’과 원래의 문장 x는 얼마나 다른지 입니다.</p>
<p><img src="https://user-images.githubusercontent.com/68625698/120453349-eb666380-c3cd-11eb-8416-4a291e92a5c5.jpg" alt="그림2"></p>
<h1 id="reference">Reference</h1>
<ul>
<li>CS224n Lecture 15 강의 및 강의자료</li>
<li>DSBA CS224n Seminar Lecture 15 발표 및 발표자료</li>
<li><a href="https://velog.io/@tobigs-text1314/CS224n-Lecture-15-Natural-Language-Generation">https://velog.io/@tobigs-text1314/CS224n-Lecture-15-Natural-Language-Generation</a></li>
<li><a href="https://blog.ncsoft.com/%EC%BB%A4%EB%AE%A4%EB%8B%88%EC%BC%80%EC%9D%B4%EC%85%98%EA%B3%BC-ai-4-%EC%82%AC%EB%9E%8C%EC%9D%98-%EB%A7%90%EB%A1%9C-%ED%91%9C%ED%98%84%ED%95%98%EB%8A%94-%ED%8E%98%EC%9D%B4%EC%A7%80paige/">https://blog.ncsoft.com/%EC%BB%A4%EB%AE%A4%EB%8B%88%EC%BC%80%EC%9D%B4%EC%85%98%EA%B3%BC-ai-4-%EC%82%AC%EB%9E%8C%EC%9D%98-%EB%A7%90%EB%A1%9C-%ED%91%9C%ED%98%84%ED%95%98%EB%8A%94-%ED%8E%98%EC%9D%B4%EC%A7%80paige/</a></li>
<li><a href="https://misconstructed.tistory.com/64">https://misconstructed.tistory.com/64</a></li>
<li><a href="https://bab2min.tistory.com/587">https://bab2min.tistory.com/587</a></li>
<li><a href="https://huffon.github.io/2019/12/07/rouge/">https://huffon.github.io/2019/12/07/rouge/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Lecture 14 - Transformer and Self-Attention]]></title>
            <link>https://velog.io/@tobigs-text1415/Lecture-14-Transformer-and-Self-Attention</link>
            <guid>https://velog.io/@tobigs-text1415/Lecture-14-Transformer-and-Self-Attention</guid>
            <pubDate>Wed, 02 Jun 2021 09:32:19 GMT</pubDate>
            <description><![CDATA[<p>작성자: 고려대학교 언어학과 <a href="https://github.com/hyyoka">조효원</a></p>
<blockquote>
<h3 id="contents">Contents</h3>
</blockquote>
<ol>
<li>Introduction</li>
<li>Self-Attention and Transformer</li>
<li>Local self-attention and Image Transformer</li>
<li>Relative Positional self-attentoin and Music Transformer</li>
</ol>
<h2 id="1-introduction">1. Introduction</h2>
<h3 id="1-1--rnn-cnn-and-self-attention">1-1.  RNN, CNN, and Self-Attention</h3>
<h4 id="rnn">RNN</h4>
<p><img src="https://i.imgur.com/21PCIiK.png" alt="스크린샷 2021-05-27 오후 10.46.43"></p>
<ul>
<li>순차적으로 계산되므로 병렬화가 불가능</li>
<li>Long-term dependency 처리에 약하다</li>
<li>계층 구조를 모델링할 수 없다</li>
</ul>
<h4 id="cnn">CNN</h4>
<p><img src="https://i.imgur.com/9TkCebz.png" alt="스크린샷 2021-05-27 오후 10.56.18"></p>
<ul>
<li>병렬화 가능</li>
<li>Local dependency에는 강하지만, Long-term dependency를 표현하기 위해서는 많은 계층이 필요</li>
</ul>
<h4 id="self-attention">Self-Attention</h4>
<p><img src="https://i.imgur.com/aSijprn.png" alt="스크린샷 2021-05-27 오후 10.58.53"></p>
<ul>
<li>병렬화 가능</li>
<li>각 token이 최단거리로 연결되어 long-term dependency 문제도 해결</li>
</ul>
<h4 id="complexity">Complexity</h4>
<p><img src="https://i.imgur.com/Hm8fCuQ.png" alt="스크린샷 2021-05-27 오후 11.04.36"></p>
<h2 id="2-self-attention-and-transformer">2. Self-Attention and Transformer</h2>
<ul>
<li>Seq2seq model with self-attention</li>
</ul>
<h3 id="2-1-self-attention-details">2-1. Self-Attention Details</h3>
<table>
<thead>
<tr>
<th></th>
<th>Attention</th>
<th>Self-Attention</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Definition</strong></td>
<td>Input과 Target 토큰 사이의 관계</td>
<td>Input 내 모든 토큰들의 관계</td>
</tr>
<tr>
<td><strong>Q,K,V</strong></td>
<td>Q = t시점의 Decoder output </br> K = 모든 시점의 Encoder output </br> V = 모든 시점의 Encoder output</td>
<td>Q = 입력 문장의 모든 단어 vector</br> K = 입력 문장의 모든 단어 vector </br> V = 입력 문장의 모든 단어 vector</td>
</tr>
<tr>
<td><strong>Procedure</strong></td>
<td>1. Q에 대해 모든 K와의 유사도를 구한다. </br> 2. 유사도를 K와 매핑되어있는 V에 반영한다. </br> 3. 유사도가 반영된 V를 모두 더해 반환한다.</td>
<td>1. 독립적인 Q,K,V 벡터를 얻는다. </br> 2. Scaled dot-product Attention을 수행한다. </br> 3. Head들을 연결한다. </br> 4. Fc-layer를 통과한다.</td>
</tr>
</tbody></table>
<h4 id="0-transformer-hyperparameters">0) Transformer Hyperparameters</h4>
<p><img src="https://i.imgur.com/GcK5Lci.png" alt="스크린샷 2021-05-27 오후 11.34.59"></p>
<ol>
<li>$d_{model} = 512$
 Encoder와 Decoder의 입출력 크기</li>
<li>$num_layers = 6$
 Encoder Stack과 Decoder Stack의 층 개수</li>
<li>$num_head = 8$
 Attention의 병렬화 수</li>
<li>$d_{ff} = 2048$
 Feed Forward 계층의 은닉층 크기</li>
</ol>
<h4 id="1-qkv-벡터-얻기">1) Q,K,V 벡터 얻기</h4>
<ul>
<li>Self-Attention은 Encoder의 입력 단어 벡터를 사용하지 않는다</li>
<li>우선, 각 단어 벡터로부터 Q벡터, K벡터, V벡터를 얻는다. <ul>
<li>이 벡터들은 ${d_{model} \over num_head}$의 크기를 가진다. </li>
</ul>
</li>
</ul>
<p><img src="https://i.imgur.com/CjhYN7V.jpg" alt="겨울학교 버트-24"></p>
<h4 id="2-scaled-dot-product-attention-수행">2) Scaled dot-product Attention 수행</h4>
<p><img src="https://i.imgur.com/0sfIIFi.jpg" alt="all about attention-12"></p>
<ul>
<li>Scaling 하는 이유<ul>
<li>dot product 값이 상당히 커지기 때문에! Q 와 K 의 차원이 커질 수록 QK(T) 값이 커지기에 softmax 시 큰 값은 매우 커지고 작은 값은 매우 작아지는 문제 발생</li>
<li>임의로 Q와 K가 평균이 0이고 분산이 1인 i.i.d normal distribution을 따른다고 가정해보면, 분산은 $d_k$가 된다.</li>
<li>Q 와 K 의 곱해지는 값들이 모두 독립이라 가정하면 이상적인 분산은 1이다.</li>
</ul>
</li>
</ul>
<h4 id="3-head-통합하기">3) Head 통합하기</h4>
<ul>
<li>앞서 구한 n번째 head 의 Attention Value Matrix를 Attention head라고 부른다. </li>
<li>모든 head를 합쳐서 최종 Attention Value를 구한다.  </li>
<li>각 head는 동시다발적으로 구해진다. (병렬 처리)</li>
</ul>
<p><img src="https://i.imgur.com/h46qqew.jpg" alt="겨울학교 버트-30"></p>
<ul>
<li>한 문장 내에도 다양한 정보가 존재하며, 한 번의 attention으로는 모든 정보를 적절하게 반영하기 어렵다. </li>
</ul>
<p><img src="https://i.imgur.com/0yOjeta.png" alt="스크린샷 2021-05-27 오후 11.35.51"></p>
<ul>
<li>각 head는 하나의 시점 및 시각으로 기능한다. 즉, multihead attention을 통해 여러 시점 및 시각으로 정보를 수집할 수 있다. </li>
</ul>
<p><img src="https://i.imgur.com/LgvKb9f.png" alt="스크린샷 2021-05-27 오후 11.35.19"></p>
<h4 id="4-fc-layer-통과하기">4) Fc layer 통과하기</h4>
<ul>
<li>가중치를 곱해 Multihead Attention을 구한다.</li>
</ul>
<p><img src="https://i.imgur.com/APnRcVL.jpg" alt="겨울학교 버트-29"></p>
<h3 id="2-2-transformer">2-2. Transformer</h3>
<p><img src="https://i.imgur.com/GcK5Lci.png" alt="스크린샷 2021-05-27 오후 11.34.59"></p>
<h4 id="1-3가지-attention-block">1) 3가지 Attention block</h4>
<ul>
<li><p>Encoder Self attention</p>
<ul>
<li>Encoder는 하나의 특정한 단어를 &#39;잘 표현(encode)&#39;하기 위해 input sequence 내 모든 단어들과의 관계를 살펴 learned representation을 산출한다. </br></li>
</ul>
</li>
<li><p>Decoder Self attention</p>
<ul>
<li>Decoder는 input sequence에 대해 잘 표현하기 위해 multihead attention을 수행한다. </li>
<li>이때, Look ahead mask를 씌운 상태로 진행한다. </li>
<li>Look ahead mask란, 문장을 생성할 때 뒤의 단어를 참고하는 것을 방지하기 위한 마스크이다. 시점 t 이후 모든 key에 대한 masking이 되어있다.</li>
<li><img src="https://miro.medium.com/max/1400/1*cawtdZLjT9hp7ByG2vcKOQ.png" alt=""></br></li>
</ul>
</li>
<li><p>Encoder-Decoder Attention</p>
<ul>
<li><p>Encoder의 output과 Decoder의 input 사이의 다리를 놓아주는 역할을 합니다. </p>
</li>
<li><p>Q = Decoder 벡터, K,V = Encoder의 마지막 층 벡터</p>
<p><img src="https://miro.medium.com/max/1400/1*OYi49Pkg-Vl3D4HleEuu7g.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<h4 id="2-positional-encoding">2) Positional Encoding</h4>
<p><img src="https://d33wubrfki0l68.cloudfront.net/a76be57763d942798f8081b77edf8f078720cd45/bd31a/img/transformer_architecture_positional_encoding/model_arc.jpg" alt=""></p>
<p>단어의 위치와 순서는 모든 언어의 필수 부분이다. RNN (Recurrent Neural Networks)은 단어별로 문장을 순차적으로 구문 분석하기에 본질적으로 단어의 순서를 고려한다. 하지만  Transformer 아키텍처는 recurrent 메커니즘을 버렸기에 단어의 위치 정보를 활용하지 못한다. 문장의 각 단어가 Transformer의 인코더 / 디코더 스택을 동시에 통과하기 때문에 모델 자체에는 각 단어의 위치/순서에 대한 감각이 없다. </p>
<p><strong>Positional Encoding</strong>은 RNN 계열의 &#39;순서/위치 정보 반영&#39;이라는 장점을 유지하기 위해 고안된 방법으로, 문장에서의 위치에 대한 정보를 각 단어에 추가한다. 이때, 각 단어의 위치는 cos, sin 함수를 통해 표현된다. </p>
<p><img src="https://i.imgur.com/HbfBN3N.jpg" alt="겨울학교 버트-33"></p>
<h5 id="why-cos--sin-not-int">Why cos &amp; sin, not int</h5>
<ul>
<li>정수를 사용하면?<ul>
<li>정수값 위치 표현은 값이 모델에 미치는 영향이 너무 크다</li>
<li>따라서 모델의 robustness가 떨어진다</li>
</ul>
</li>
<li>cos, sin 함수는 다음의 조건을 충족하므로 위치를 표현하기에 좋다.<ol>
<li>각 토큰의 위치값은 고유해야 한다. </li>
<li>서로 다른 두 토큰이 떨어져있는 거리가 일정해야한다. </li>
<li>긴 길이의 문장도 표현할 수 있어야한다.</li>
<li>함수에 따른 결과로 토큰의 위치값을 예측할 수 있어야한다. </li>
</ol>
</li>
<li>짝수에 sin, 홀수에 cos를 사용하면 위치가 커질 때마다 값이 다시 작아져 특정 두 토큰의 위치값이 겹치는 것을 방지할 수 있다. </li>
</ul>
<h4 id="3-feed-forward-nn">3) Feed Forward NN</h4>
<p>$FFNN(x) = Max(0, x \cdot W_1 +b_1  ) \cdot W_2 + b_2$</p>
<ul>
<li>즉, Relu activation function을 거치는 nn</li>
<li>$x$는 multihead self-attention의 결과인 $(seq_len, d_{model})$ 크기의 벡터</li>
<li>$W_1 = (d_{model}, d_{ff})$, $W_2 = (d_{ff}, d_{model})$</li>
</ul>
<h4 id="4-add--norm">4) Add &amp; Norm</h4>
<p><img src="https://i.imgur.com/cWS4B0z.jpg" alt="ADD&amp;NORM"></p>
<h2 id="3-local-self-attention-and-image-transformer">3. Local self-attention and Image Transformer</h2>
<h3 id="3-1-using-self-attention-for-image-tasks">3-1. Using Self-attention for Image tasks</h3>
<ul>
<li><p>Self-Similarity in Image
<img src="https://i.imgur.com/eM8rWuL.png" alt="스크린샷 2021-05-30 오후 2.23.33"></p>
</li>
<li><p>Image Transformer Tasks
<img src="https://i.imgur.com/9XeGnmR.png" alt="스크린샷 2021-05-30 오후 2.22.48"></p>
<ul>
<li>Unconditional Image Generation 
  대규모의 데이터로 특정한 이미지를 제작하는 태스크</li>
<li>Conditional Image Generation 
  클래스 각각의 임베딩 벡터를 입력으로 받거나, seed 이미지를 받아 이미지를 제작하는 태스크</li>
<li>Super Resolution 
  저화질의 이미지를 입력으로 받아 고화질의 이미지를 출력하는 태스크</li>
</ul>
</li>
</ul>
<p>강의에서 초점을 둔 것은 Original Transfomer와 완전히 같은 구조를 사용하는 마지막 Super Resolution Task이다. </p>
<p>Transformer에서 입력은 문장에서 사진으로 전환되며, 따라서 처리 단위도 토큰에서 픽셀로 바뀐다. 그런데, 여기서 Complexity에 문제가 생긴다. </p>
<p><img src="https://i.imgur.com/Hm8fCuQ.png" alt="스크린샷 2021-05-27 오후 11.04.36"></p>
<p>앞서 Self-Attention이 효율적인 이유는 model dimension보다 sequence length가 작기 때문이었다. 하지만 이미지 처리를 픽셀 단위로 한다면 sequence length는 픽셀을 나열한 크기가 된다. 이미지 픽셀의 길이는 일반적으로 32x32x3=3072이므로, self-attention을 적용하는 것이 굉장히 비용이 커지게 된다. </p>
<h3 id="3-2-local-self-attention">3-2. Local Self-Attention</h3>
<p>이러한 배경을 바탕으로 Local self-attention이 등장한다. 말 그대로, attention window를 전체가 아닌 근처의 픽셀들로만 설정해 어텐션을 수행한다. </p>
<p>이때, Sequence 내 일정 부분을 Memory block이라고 하며, memory block 내에서만 self-attention 적용한다. </p>
<p><img src="https://i.imgur.com/YCm5Z7Z.png" alt="스크린샷 2021-05-30 오후 2.39.59"></p>
<p>Super Resolution에서의 decoder가 이미지를 생성하는 순서는</p>
<ol>
<li>Input을 겹치지 않는 Block으로 구분, 마지막으로 생성된 픽셀을 포함하는 block을 Query block이라고 한다. 이때 마지막으로 생성된 픽셀을 Current Query pixel, 그 다음 생성되야할 픽셀을 Target pixel이라고 한다. </li>
<li>위쪽 방향으로 $h_{m}$ 픽셀, 양 옆으로 $w_{m}$ 픽셀만큼을 둘러싸는 Memory block을 지정한다. 이는 Key와 Value의 역할을 한다. </li>
<li>Memory block 내 픽셀을 key, value로, Current Query pixel을 query로 하는 self-attention 수행(Transformer Decoder의 Multihead self attention)</li>
<li>Encoder-Decoder Attention, FFNN을 거쳐 output 생성
<img src="https://i.imgur.com/99o8Hcj.png" alt="스크린샷 2021-05-30 오후 3.28.05"></li>
</ol>
<h3 id="results">Results</h3>
<ul>
<li>Super Resolution
  <img src="https://i.imgur.com/26s5mlZ.png" alt="스크린샷 2021-05-30 오후 3.30.34"></li>
<li>Conditional Image Completion
  <img src="https://i.imgur.com/doXejVR.png" alt="스크린샷 2021-05-30 오후 3.31.04"></li>
</ul>
<h2 id="4-relative-positional-self-attentoin-and-music-transformer">4. Relative Positional self-attentoin and Music Transformer</h2>
<h3 id="4-1-using-self-attention-for-music-generation-tasks">4-1. Using Self-attention for Music generation tasks</h3>
<ul>
<li><p>Self-Similarity
<img src="https://i.imgur.com/ZZ2SLp3.png" alt="스크린샷 2021-05-30 오후 3.40.23"></p>
</li>
<li><p>Music Transformer Tasks
  <img src="https://i.imgur.com/KtjN6S9.png" alt="스크린샷 2021-05-30 오후 3.44.21"></p>
<ul>
<li>Unconditional Music Generation
  대규모의 데이터로 특정한 음악을 제작하는 태스크</li>
<li>Conditional Music Generation
  클래스 각각의 임베딩 벡터를 입력으로 받거나, seed 음악을 받아 음악을 제작하는 태스크</li>
</ul>
</li>
</ul>
<h3 id="4-2-relative-positional-self-attention">4-2. Relative Positional Self-Attention</h3>
<h4 id="attention--convolution">Attention + Convolution</h4>
<p><img src="https://i.imgur.com/G3ixjR1.png" alt="스크린샷 2021-05-30 오후 4.27.09"></p>
<p>어텐션을 통해 우리는 지나간 정보들에 대한 weighted average를 알 수 있다. 또한, 어텐션의 큰 강점 중 하나는 어떤 토큰이든 직접적인 접근을 할 수 있다는 것이다. 그러나 이는 다르게 이야기하면 모든 토큰들이 마치 bag of words처럼 여겨져 한 토큰과 다른 토큰의 거리는 알 수 없다는 것이다. </p>
<p>여기에 Convolution의 장점을 결합한 것이 Relative Positional Self-Attention이다. convolution은 이동하는 고정된 크기의 필터가 있고 이것은 각 토큰 사이의 상대적인 거리를 잡아낸다. 즉, self attention에 거리라는 요소를 추가한 것이다. </p>
<h4 id="relative-positional-self-attention">Relative Positional Self-Attention</h4>
<p>거리 정보를 고려해야 했던 이유는 무엇일까. 살펴보았듯이 음악은 특정 주기를 가지고 비슷한 음들이 반복된다. 흔히 듣는 음악의 훅만 생각해보아도 그렇다. Music Transformer의 Relative Positional Self-Attention은 각 단위의 내용뿐만 아니라 그 단위가 한 스텝 떨어져있는지 두 스텝 떨어져 있는지 등을 함께 고려한다. 즉 주기성을 고려하는 것이다. </p>
<p>Relative Positional Self-Attention는 단순히 일반적인 Self-attention에 Relative Positional Vector를 더해 query와 key의 sequence 내 거리를 attention weight에 반영하는 형태다. </p>
<p><img src="https://i.imgur.com/6nPZQtZ.png" alt="스크린샷 2021-05-30 오후 4.58.38"></p>
<p>Relative Positional Self-Attention에서 $S^{rel}$을 만드는 순서는 다음과 같다:</p>
<ol>
<li>Relative Positon Embedding Matrix($E^T)$를 만든다. 
<img src="https://i.imgur.com/Ibdg81z.png" alt="스크린샷 2021-05-31 오전 11.02.48"></li>
<li>Relative Positon Embedding Matrix($E^T)$를 Query Vector를 곱한다. 
<img src="https://i.imgur.com/U9ubMyb.png" alt="스크린샷 2021-05-31 오전 11.04.08"></li>
<li>기존 attention과 더할 수 있도록 모양을 변형한다. (Skewing)
<img src="https://i.imgur.com/GwjUzh4.png" alt="스크린샷 2021-05-31 오전 11.05.38"></li>
<li>기존 attention score와 relative positional attention score를 더하여 output을 산출한다.</li>
</ol>
<h3 id="results-1">Results</h3>
<p><img src="https://i.imgur.com/5W2QXnb.png" alt="스크린샷 2021-05-31 오전 11.13.23"></p>
<p>Relative self-attention이 적용된 music transformer는 다양하고 반복적인 곡을 생성함과 동시에 training data보다 2배나 긴 sequence에 대한 generation 또한 가능했다. </p>
<h2 id="reference">Reference</h2>
<ul>
<li>CS224n: Natural Language Processing with Deep Learning in Stanford / Winter 2019 중
Transformers and Self-Attention For Generative Models (guest lecture by Ashish Vaswani and Anna Huang)</li>
<li>고려대학교 산업경영공학과 DSBA 연구실 CS224n Winter 2019 세미나 중 14. Transformers and Self-Attention For Generative Models 강의자료와 강의 영상 (노영빈님)</li>
<li><a href="https://wikidocs.net/31379">https://wikidocs.net/31379</a></li>
<li><a href="https://jalammar.github.io/illustrated-transformer/">https://jalammar.github.io/illustrated-transformer/</a></li>
<li><a href="https://towardsdatascience.com/transformers-explained-visually-part-3-multi-head-attention-deep-dive-1c1ff1024853">https://towardsdatascience.com/transformers-explained-visually-part-3-multi-head-attention-deep-dive-1c1ff1024853</a></li>
<li><a href="https://velog.io/@tobigs-text1314/CS224n-Lecture-14-Transformer-and-Self-Attention#3-image-transformer">https://velog.io/@tobigs-text1314/CS224n-Lecture-14-Transformer-and-Self-Attention#3-image-transformer</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Lecture 13 – Contextual Word Embeddings]]></title>
            <link>https://velog.io/@tobigs-text1415/Lecture-13-Contextual-Word-Embeddings</link>
            <guid>https://velog.io/@tobigs-text1415/Lecture-13-Contextual-Word-Embeddings</guid>
            <pubDate>Wed, 26 May 2021 07:47:14 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 동국대학교 통계학과 <a href="https://github.com/yoonj98">이윤정</a></p>
<blockquote>
<h3 id="contents">Contents</h3>
</blockquote>
<ol>
<li>Reflections on word representations</li>
<li>Pre-ELMo and ELMO</li>
<li>ULMFit and onward</li>
<li>Transformer architectures</li>
<li>BERT</li>
</ol>
<hr>
<h1 id="contextual-word-embeddings">Contextual Word Embeddings</h1>
<p>이번 강의에서는 문맥을 반영한 Word Embedding과 관련 Model에 대해 배웁니다. </p>
<h2 id="reflections-on-word-representations">Reflections on word representations</h2>
<h3 id="1-representations-for-a-word">1. Representations for a word</h3>
<p>컴퓨터는 어떻게 자연어를 이해하고 효율적으로 처리하고 있을까요? 컴퓨터는 Word Embedding을 통해 단어를 벡터로 표현함으로써 자연어를 이해합니다. 우리가 앞선 강의에서 배운 Word2Vec, GloVe, fastText 역시 단어를 벡터로 표현하는 방법들입니다. </p>
<h3 id="2-pre-trained-word-vectors">2. Pre-trained word vectors</h3>
<p>** Until 2011 ** 
<img src="https://images.velog.io/images/yoonj98/post/f9a4e3d8-86cc-4297-a45d-a19ad37dac62/image.png" alt="">2011년까지 POS tag 및 NER task에 대한 성능 비교표입니다. 
1번째 방법론인 State-of-the-art은 Rule-based 방법론으로 Word Representation (Word2Vec, GloVe 등)을 사용하지 않습니다. 3번째 방법론인 Unsupervised pre-training followed by supervised NN은 2번째 방법론과 Word Representation를 함께 사용한 방법으로 Rule-based보다 성능은 뒤쳐지지만, 성장 가능성을 확인할 수 있습니다. 
<br>
** After 2014 **
<img src="https://images.velog.io/images/yoonj98/post/1bbcb189-0242-4057-bf63-2ccec3a33aea/image.png" alt="">Random initialization word vector와 Pre-trained word vector에 대한 그래프로 pre-trained word vector를 사용하는 것이 성능 향상에 도움이 되는 것을 알 수 있습니다. pre-trained word vector의 경우 task에 쓰이는 labeled 데이터보다 훨씬 더 많은 unlabeled 데이터에 의해 학습되기 때문에 성능 향상에 도움이 됩니다. </p>
<h3 id="3-usefulness-of-pre-trained-word-vector">3. Usefulness of Pre-trained word vector</h3>
<p>Pre-trained word vector는 성능 향상 뿐만 아니라 <strong>Unknown word vector</strong>, 통칭 UNK Token을 처리하는 데에도 효과적입니다. </p>
<p>일반적으로 train 시 약 5회 이하로 등장하는 단어는 UNK로 처리를 하며, test 시 Out-Of-Vocabulary(OOV) 단어를 UNK로 매칭합니다. 그러나, UNK로 매칭된 단어가 중요한 의미를 지니고 있어도 이를 고려하지 못한다는 문제점이 발생합니다. 본 강의에서는 이러한 문제점을 해결하기 위해 다음과 같은 해결책을 제시합니다. </p>
<ul>
<li>Character level의 embedding model을 이용하여 word vector 생성</li>
<li>Pre-trained word vector 사용 → 가장 많이 사용되는 방법</li>
<li>Random vector을 부여하여 vocabulary에 추가 → 각 단어가 고유한 정체성을 가지는 효과 </li>
</ul>
<h3 id="4-problem-of-having-one-representation-of-words">4. Problem of having one representation of words</h3>
<p>Star라는 단어가 하늘에 있는 별을 의미하기도 하지만 할리우드 스타와 같은 연예인을 의미하듯 하나의 단어도 여러 의미가 존재합니다. 하지만, 하나의 단어를 하나의 word vector로 표현하는 경우 한 문맥의 word vector로 매칭되기 때문에 동음이의어 혹은 문맥에 따라 단어의 type이 달라지는 측면을 고려하지 못하게 됩니다. 이러한 문제점을 해결하기 위해 Contextual Word Vector의 필요성이 대두됩니다. </p>
<p><img src="https://images.velog.io/images/yoonj98/post/1c29b8ad-9adc-4ae6-9d72-5e1d53a794cd/image.png" alt="">본 강의에서는 Neural Language Model을 통해 contextual word vector를 생성하는 방법을 소개합니다.  LSTM layer의 경우 문장의 Sequence를 고려하여 다음 단어를 예측할 수 있으므로 Context-specific word representation 역시 예측할 수 있을 것입니다. 이러한 아이디어를 활용한 대표적인 모델로는 ELMo가 있습니다. </p>
<h2 id="pre-elmo-and-elmo">Pre-ELMo and ELMo</h2>
<h3 id="1-taglm--pre-elmo">1. TagLM -&quot;Pre-ELMo&quot;</h3>
<p>본 강의에서 TagLM 혹은 Pre-ELMo라고 지칭되는 해당 모델은 ELMo 발표 저자가 ELMo 이전에 발표한 모델로 ELMo와 아주 유사한 형태의 구조를 지닙니다. Pre-ELMo는 small-task labeled data를 학습에 주로 사용하기 때문에 RNN을 통해 Context 속 의미를 학습하기 어렵다는 문제점을 Large Unlabeled Corpus로 먼저 학습을 시키는 <strong>Semi-supervised approach</strong>를 적용하여 해결하였습니다. 이러한 Pre-ELMo의 구조는 크게 3단계로 구분할 수 있습니다.</p>
<h4 id="step1">STEP1<img src="https://images.velog.io/images/yoonj98/post/a459e86c-3182-422c-ba56-9cdfd5a4d8a0/image.png" alt=""></h4>
<p>Pre-trained Bi-LM은 Input String을 순방향 LM, 역방향 LM에 별도로 들어오게 됩니다. 이때, 각 LM에서의 output은 concat되며 수식으로 표현 시 다음과 같습니다. $$( = h_{k}^{LM})$$</p>
<h4 id="step2">STEP2<img src="https://images.velog.io/images/yoonj98/post/4a02d757-485c-46c5-ae11-523b8b271ba8/image.png" alt=""></h4>
<p>Pre-trained model이 훈련하는 동안 모델은 현재 입력 단어가 주어지면 다음 단어를 예측합니다. 이때, Input String은 Token embedding(word2Vec)과 Char CNN으로 표현할 수 있습니다. 이후 해당 단계에서의 output은 concat되어 2-layer Bi-LSTM의 1st layer의 input으로 들어갑니다.</p>
<h4 id="step3">STEP3<img src="https://images.velog.io/images/yoonj98/post/f6c45d31-eb7d-408f-9402-f9d7aa1d33cb/image.png" alt=""></h4>
<p>Bi-LSTM의 1st layer의 output은 Pre-trained LM에서의 최종 output $$h_{k}^{LM}$$와 concat되어 2nd layer로 공급되며 수식으로 표현 시 다음과 같습니다. $$(= h_{k,1}=[\overrightarrow{h}<em>{k,1} ; \overleftarrow{h}</em>{k,1} ; h_{k}^{LM}])$$</p>
<h3 id="2-elmo">2. ELMo</h3>
<p>ELMo는 Pre-ELMo를 일반화한 모델로 기존 방법들과 2가지 차이점이 존재합니다. 첫번째로 window를 통해 주변 context만 사용하는 기존 embedding 방법과 달리 모든 문장을 사용하여 Contextualized word vector를 학습합니다. 두번째는 최종 layer의 값들로 word vector를 사용한 이전 모델과 달리 2-layer 양방향 언어모델인 ELMo는 순방향과 역방향 layer를 통해 특정 단어 및 해당 단어의 앞쪽/뒷쪽 정보를 포함한 단어에 대한 각 layer 별 출력 값이 존재하며 모든 layer의 출력값을 활용하여 최종 word vector를 embedding합니다. </p>
<h4 id="구조">구조<img src="https://images.velog.io/images/yoonj98/post/0d93065c-01ad-46cc-af91-3d200bc95da8/image.png" alt=""></h4>
<p>우선, Input String은 Char-CNN에 의해 word vector로 변환되어 Bi-LM의 1st layer에 공급됩니다. 이때, 1st layer는 residual connection을 통해 Char-CNN으로 반영된 단어의 특징을 유지합니다. 1st layer의 output인 중간 word vector는 Bi-LM의 2nd layer에 공급됩니다. 이후, 2nd layer 역시 output으로 중간 word vector를 출력합니다. </p>
<p><img src="https://images.velog.io/images/yoonj98/post/2a38db65-c61b-42e7-9fc4-2e70a44fc551/image.png" alt=""> 2nd layer의 중간 word vector까지 출력되면, 각 layer로부터 출력된 중간 word vector와 raw word vector를 각각 concat한 후 가중치를 통해 선형 결합하여 ELMo Representation 도출합니다. 일종의 가중합 과정으로 볼 수 있으며, LSTM의 top layer만 사용하던 이전 모델들과 달리 각 layer의 결과를 선형 결합하여 모두 사용하게 됩니다. 해당 과정을 수식으로 나타내면 다음과 같습니다.
<img src="https://images.velog.io/images/yoonj98/post/016dd595-b624-4887-9a4d-36355a20c14e/image.png" alt=""> 최종적으로 모든 layer의 벡터를 더해 하나의 임베딩 벡터라는 word vector를 생성하므로써 단어 자체가 가지고 있는 특징인 Syntax 정보와 문맥이 고려된 특징인 Semantics 정보를 모두 활용할 수 있습니다. </p>
<ul>
<li>1st layer : Better for lower-level Syntax</li>
<li>2nd layer : Better for higher-level Semantics</li>
</ul>
<blockquote>
<p><strong>ELMo의 트릭</strong>
Fine-Tuning 단계에서는 양방향 LSTM 레이어가 동일한 단어 시퀀스를 입력받지만, Pre-Training 단계에서는 순방향, 역방향 네트워크를 별개의 모델로 보고 서로 다른 학습 데이터를 입력하게 된다. 즉, 손실 레이어에서는 순방향, 역방향 LSTM 출력 히든 벡터를 더하거나 합치지 않고 각각의 히든 벡터로 각각의 레이블 (순방향, 역방향 단어 시퀀스)를 맞추는 것을 독립적으로 학습한다. 
-이기창 저. 한국어 임베딩</p>
</blockquote>
<h4 id="performance">Performance<img src="https://images.velog.io/images/yoonj98/post/204f837e-590c-4f79-8125-7959f18a1870/image.png" alt=""></h4>
<p>NER 뿐만 아니라 다른 Task에서도 모두 SOTA를 기록하였습니다. 이를 통해 ELMo가 모든 Task에서 우수한 성능을 지녔음을 알 수 있습니다. </p>
<h2 id="ulmfit-and-onward">ULMFit and onward</h2>
<p>ULMFit 모델은 NLP에서 본격적으로 <strong>Transfer Learning</strong>을 도입한 첫 사례입니다. </p>
<blockquote>
<p>Transfer Learning이란?
큰 Dataset으로 학습 후 특정 Task에 대한 fine-tuning을 통해 성능을 개선하는 일</p>
</blockquote>
<p>1개의 GPU로 학습할 수 있을 정도의 사이즈이며, 언어 모델을 통해 Text Classification을 목적으로 한다는 특징을 지닙니다. ULMFit 모델의 구조는 크게 3단계로 나눌 수 있습니다. </p>
<p><img src="https://images.velog.io/images/yoonj98/post/1326ac62-ca11-4888-ba3c-dc376062aa32/image.png" alt=""></p>
<h3 id="step1-일반-언어-모델-학습-a">STEP1. 일반 언어 모델 학습 (A)</h3>
<p>첫번째 단계는 Transfer Learning에 해당하는 부분입니다. 논문에서 사용된 일반 언어 모델은 LSTM 언어 모델에 다양한 정규화(regularization) 방법을 적용한 AWD-LSTM 모델입니다. 3-layer Bi-LSTM 언어 모델이며, 논문에서는 Wekipedia 영어 버전 전체에 대해 Pre-trained했습니다. </p>
<h3 id="step2-과제-맞춤형-언어-모델-튜닝-b">STEP2. 과제 맞춤형 언어 모델 튜닝 (B)</h3>
<p>두번째 단계는 Task에 맞추어 일반 언어 모델을 추가 학습하는 부분입니다. 이때, 튜닝 시 사용하는 2가지 기법으로 Discriminative Fine-tuning과 Slanted triangular learning rates가 있습니다.</p>
<ul>
<li>Discriminative Fine-tuning : 언어 모델 튜닝 시 각 layer별 학습율(learning rate)을 서로 다르게 조정하는 방법입니다. 깊은 layer에 대해서는 상위 layer에 비해 더 작은 학습율을 부여합니다.</li>
<li>Slanted triangular learning rates : 튜닝 횟수에 따라 학습율을 적용하는 방법입니다. 초반에 작은 학습율로 시작해서 점점 학습율을 증가하다가 약 200번의 학습 후 다시 학습율을 점진적으로 감소시킵니다.</li>
</ul>
<h3 id="step3-과제-분류기-튜닝-c">STEP3. 과제 분류기 튜닝 (C)</h3>
<p>classifier를 학습하기 위해 언어 모델 과제에서 사용된 다음 단어 예측을 위한 레이어(softmax)를 제거하고, 주어진 텍스트가 어떤 클래스에 속할 지 확률을 계산하는 새로운 분류 레이어(softmax)를 추가합니다. 즉, 기존 언어 모델에서 마지막 레이어만 제거하고 나머지는 그대로 둔 후 새로운 분류 레이어 하나만을 추가하여 학습합니다.</p>
<h3 id="performance-1">Performance</h3>
<p><img src="https://images.velog.io/images/yoonj98/post/6d533df4-875b-4d4e-bb29-b42eafc1893b/image.png" alt="">ULMFit을 사용한 경우 에러율이 현저히 낮은 것을 확인할 수 있습니다. 이처럼 ULMFit을 사용하면 더 적은 양의 데이터만으로 자연어 처리를 효과적으로 수행할 수 있음을 알 수 있습니다. </p>
<h3 id="lets-scale-it-up">Let&#39;s scale it up!</h3>
<p><img src="https://images.velog.io/images/yoonj98/post/69e3816b-cf48-4ab6-905d-7c0fdb6df65e/image.png" alt=""> ULMFit 이후 모델의 파라미터를 늘려 pre-trained LM이 많이 등장하였으나, GPU 1개로 학습이 가능했던 ULMFit과 달리 필요한 리소스가 급증하였습니다. 추가적으로 표에 등장한 모델 중 ULMFit을 제외한 모든 모델은 Transformer 기반의 모델입니다. </p>
<h2 id="transformer-architectures">Transformer architectures</h2>
<p>Transformer와  Self-Attention의 경우 CS224n Lecture 14강에서 배우기 때문에 간단하게 언급하겠습니다. </p>
<h3 id="1-the-motivation-for-transformer">1. The Motivation for Transformer</h3>
<p>RNN은 병렬적 계산이 불가능하며 매우 느린 속도를 보입니다. 이러한 한계점을 해결하기 위해 LSTM과 GRU가 등장하였으나 완벽하게 해결할 수 없었습니다. Transformer 기반의 모델은 Attention을 통해 time stamp를 참조할 수 있다면 RNN의 한계점을 극복할 수 있다는 아이디어에서 출발하였습니다. </p>
<h3 id="2-transformer-overview">2. Transformer Overview</h3>
<p><img src="https://images.velog.io/images/yoonj98/post/1d70c75f-bc9e-49ab-af95-a1500f6828f5/image.png" alt="">Transformer는 RNN을 사용하지 않지만 Attention을 통해 Seq2Seq 모델처럼 encoder에서 token sequence를 입력받아 임베딩을 하고, decoder에서 출력할 token sequence를 예측하는 encoder-decoder 구조를 유지하고 있습니다.  </p>
<h3 id="3-dot-product-attention">3. Dot-Product Attention</h3>
<p>Transformer 구조를 알기 전에 Attention 매커니즘을 살펴보겠습니다. Attention의 Input으로는 Query, Key, Value가 존재합니다. 
<img src="https://images.velog.io/images/yoonj98/post/51e6de12-a78a-4b6a-b1b2-c4c3d92c62a4/image.png" alt="">
Query, Key, Value를 input으로 갖는 Attention 함수는 다음과 같은 구조로 표현할 수 있습니다. Attention 함수는 주어진 &#39;Query&#39;에 대해서 내적을 통해 모든 &#39;Key&#39;와의 유사도를 각각 구합니다. 그리고 구해낸 이 유사도를 키와 맵핑되어있는 각각의 &#39;Value&#39;에 반영한 다음 모두 더해서 출력합니다. 여기서 이를 Attention Value이라고 합니다. 즉, 유사도가 일종의 가중치 역할을 한다고 볼 수 있으며, 결국 Query와 비슷할 수록 높은 가중치를 주어 출력을 주는 것입니다.<br><img src="https://images.velog.io/images/yoonj98/post/4a0f57ab-5844-44b1-84f9-df67799993ac/image.png" alt=""></p>
<h3 id="4-scaled-dot-product-attention">4. Scaled Dot-Product Attention</h3>
<p><img src="https://images.velog.io/images/yoonj98/post/d45deb68-62f8-4418-8073-62804c8f3631/image.png" alt="">Transformer 구조에서 이러한 Attention 매커니즘을 Scaled Dot-Product Attention이라고 합니다. 벡터 차원 수가 클수록 Query와 Key의 내적 값의 차이가 증가하고 이는 softmax 값의 증가로 이어져 학습에 악영향을 초래할 수 있습니다. 그러므로, 학습 시 그래디언트를 최적화하기 위해서 모든 Query와 Key에 대해 Dot-Product를 계산 후 벡터 차원 수의 제곱근 $$\sqrt{d_k}$$로 scaling 해주는 방식입니다. 
<img src="https://images.velog.io/images/yoonj98/post/1b0b2d49-c825-4c51-8674-f878b7396e2f/image.png" alt=""></p>
<h3 id="5-self-attention">5. Self-Attention</h3>
<p>Self-Attention은 입력 데이터 Query가 있을 때, 검색 대상이 되는 Key-Value pair 데이터 테이블이 입력 데이터 Query 자기 자신인 경우를 의미합니다. 즉, 자기 자신의 Query로 Attention Value를 구하는 것으로 Self-Attention을 통해 문장 안에서 단어들 간의 관계를 파악할 수 있게 됩니다.</p>
<h3 id="6-multi-head-attention">6. Multi-head attention</h3>
<p><img src="https://images.velog.io/images/yoonj98/post/985cb37a-1809-4517-b05a-1be4c2094958/image.png" alt="">
 Multi-head-attention은 Scaled Dot-Product Attention을 여러 개 만들어 다양한 특징에 대한 어텐션을 볼 수 있게 한 방법입니다. 즉, 입력받은 Query, Key, Value를 헤드 수만큼 나누어 병렬적으로 계산해주는 것이 핵심입니다. 각 Head에서는 Scaled Dot-Product Attention 과정이 발생하며, 그렇게 발생한 Head별 Attention Value는 concat되어 다음 layer로 전달됩니다.</p>
<h3 id="7-full-architecture">7. Full Architecture</h3>
<p><img src="https://images.velog.io/images/yoonj98/post/7154a039-41de-487a-855d-93becd345438/image.png" alt="">
위 그림에서 빨간색 블록은 Encoder, 파란색 블록은 Decoder이며 자세한 내용은 다음과 같습니다. 노란색 블록은 Encoder에서 Self-Attention이 발생하는 부분, 자주색 블록은 Decoder에서 Self-Attention이 발생하는 부분, 초록색 블록은 Encoder와 Decoder에서 Attention이 일어나는 부분입니다. </p>
<p>문장이 Encoder로 들어오면 임베딩을 거친 후 Multi-Head Attention 과정을 거칩니다. Decoder 부분에서도 번역된 문장이 Self-Attention 과정을 거칩니다. 다음으로 Self-Attention을 거친 두 문장은 Multi-Head Attention 과정을 거치게 됩니다. </p>
<h1 id="bert">BERT</h1>
<p>BERT는 2018년 11월 구글이 공개한 언어모델로 Transformer에서 encoder만 사용한 모델입니다. BERT 모델의 구조는 크게 2단계로 나눌 수 있습니다. 첫 번째 단계는 대량의 텍스트 데이터에 대한 semi-supervised 과정인 Pre-Training이며, 두 번째 단계는 target task에 대한 supervised 과정인 Fine-Tuning입니다.</p>
<p>첫 번째 단계는 BookCorpus와 영문 위키피디아에 대하여 semi-supervised를 통해 언어의 패턴을 학습하는 과정입니다. 이때, Pre-training을 위한 Objective Function은 2가지입니다. 
<img src="https://images.velog.io/images/yoonj98/post/b3e76697-7681-492a-8058-f86a72eb0289/image.png" alt=""></p>
<blockquote>
<ol>
<li>Masked Language Modeling (MLM)
위 그림과 같이 [MASK]된 부분의 단어를 예측하는 것을 MLM이라 합니다. 전체 단어의 15%를 선택한 후 그 중 80%는 [MASK], 10%는 현재 단어 유지, 10%는 임의의 단어로 대체 합니다.</li>
<li>Next Sentence Prediction (NSP)
위 그림과 같이 첫 번째([CLS]) Token으로 문장 A와 문장 B의 관계를 예측하는 것을 NSP라 합니다. A 다음문장이 B가 맞을 경우는 True, A 다음문장이 B가 아닐 경우 False로 예측하도록 합니다.</li>
</ol>
</blockquote>
<p><img src="https://images.velog.io/images/yoonj98/post/41ba622b-2416-4a59-9581-de3e63d8bf8b/image.png" alt="">기존 양방향 모델의 경우 순방향과 역방향이 독립적으로 사용되어 각각 순방향과 역방향 시퀀스를 가지게 됩니다. 이는 단어를 예측할 때 그때까지 존재한 단어를 기반으로 예측에 사용한다는 의미입니다. 즉, 순방향 모델의 경우 target을 예측하기 위해 앞에 오는 시퀀스(Jamie walks into a)만 보고, 역방향 모델은 뒤에 오는 시퀀스(and orders a cocktail)만 보고 예측하게 됩니다. 결국 순방향과 역방향 모델을 모두 사용하여도 전체 단어를 모두 활용하여 단어를 예측할 수 없음을 의미합니다. </p>
<p>BERT는 MLM을 적용하여 단어 앞뒤 시퀀스를 동시에 보는 완벽한 양방향 모델을 구축하였습니다. 주어진 시퀀스 다음 단어를 맞추는 것에서 벗어나 문장 전체를 모델에 알려주고, MLM 과정을 통해 학습하게 됩니다. 이러한 경우 Mask Token을 제외한 모든 단어를 활용할 수 있게 되면서 순방향과 역방향의 모든 문맥을 한번에 고려할 수 있게 됩니다. 동시에 NSP를 학습하는데, 이는 모델에 두 개의 문장을 입력하여 두 번째로 입력된 문장이 첫 번째 문장 다음에 오는 문장인지 판별하는 과정으로 모델은 문장 간의 관계를 학습하게 됩니다. </p>
<p><img src="https://images.velog.io/images/yoonj98/post/85c609da-1128-414c-ac1e-391f9723e8b8/image.png" alt="">두 번째 단계는 첫 번째 단계에서 사전학습을 마친 모델을 Target Task에 대해 Fine-tuning하는 단계로 Pre-trained model 위에 task에 맞는 classifier를 붙여 학습하게 됩니다. </p>
<h2 id="performance-2">Performance<img src="https://images.velog.io/images/yoonj98/post/3fae0e39-5f11-40bc-99c6-8de1017b9878/image.png" alt=""></h2>
<p>NLP와 관련된 모든 분야에서 SOTA를 기록한 만큼 매우 우수한 성능을 지녔음을 알 수 있습니다. </p>
<h1 id="참고문헌">참고문헌</h1>
<p><a href="https://medium.com/analytics-vidhya/contextual-word-embeddings-part1-20d84787c65">https://medium.com/analytics-vidhya/contextual-word-embeddings-part1-20d84787c65</a>
<a href="http://dsba.korea.ac.kr/seminar/?mod=document&amp;uid=42">http://dsba.korea.ac.kr/seminar/?mod=document&amp;uid=42</a>
<a href="https://mhmdsmdi.github.io/posts/2019/07/elmo/">https://mhmdsmdi.github.io/posts/2019/07/elmo/</a>
<a href="https://omicro03.medium.com/%EC%9E%90%EC%97%B0%EC%96%B4%EC%B2%98%EB%A6%AC-nlp-16%EC%9D%BC%EC%B0%A8-elmo-a22ca5c287c2">https://omicro03.medium.com/%EC%9E%90%EC%97%B0%EC%96%B4%EC%B2%98%EB%A6%AC-nlp-16%EC%9D%BC%EC%B0%A8-elmo-a22ca5c287c2</a>
<a href="https://misconstructed.tistory.com/42">https://misconstructed.tistory.com/42</a>
<a href="https://brunch.co.kr/@learning/13">https://brunch.co.kr/@learning/13</a>
<a href="http://jalammar.github.io/illustrated-bert/">http://jalammar.github.io/illustrated-bert/</a>
<a href="https://medium.com/@abhisht85/elmo-embedding-3c7bd0df20d2">https://medium.com/@abhisht85/elmo-embedding-3c7bd0df20d2</a>
<a href="https://www.kakaobrain.com/blog/118">https://www.kakaobrain.com/blog/118</a>
<a href="https://paul-hyun.github.io/bert-01/">https://paul-hyun.github.io/bert-01/</a>
이기창 저. 한국어 임베딩  </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Lecture 12 – Subword Models]]></title>
            <link>https://velog.io/@tobigs-text1415/Lecture-12-Subword-Models</link>
            <guid>https://velog.io/@tobigs-text1415/Lecture-12-Subword-Models</guid>
            <pubDate>Wed, 26 May 2021 07:40:01 GMT</pubDate>
            <description><![CDATA[<p>작성자: 숭실대학교 산업정보시스템공학과 이수민</p>
<h2 id="linguistics-언어학">Linguistics (언어학)</h2>
<h3 id="human-language-sounds-phonetics-and-phonology">Human language sounds: phonetics and phonology</h3>
<p><strong>Phonetics 음성학</strong>
사람의 말소리를 연구하는 학문</p>
<p><strong>Phonology 음운론</strong></p>
<ul>
<li>언어학의 첫 번째 단계</li>
<li>사람은 입으로 무한의 소리를 만들어낼 수 있지만, 언어로 표현될 때는 이 연속적인 소리가 범주형으로 나눠져서 인식됨.</li>
<li>ex) <em>caught</em> and <em>cot</em></li>
</ul>
<blockquote>
<p><strong>※ 범주적 지각 (Categorical perception)</strong>
사전적 의미는 연속체를 따라 변수에 점진적인 변화가 있을 경우의 구별 범주에 대한 지각 현상
광범위한 음향 신호를 제한된 수의 소리 범주로 지각되는 결과를 낳을 때, 즉 우리에게 실제로 들리는 말소리는 소리 주파의 연속적인 변화인데도 우리가 이를 &#39;말소리 범주&#39;로 지각하는 것을 말합니다.</p>
</blockquote>
<ul>
<li>범주 내의 차이 (differences within the categories) 축소</li>
<li>범주 간의 차이 (differences across the categories) 확대</li>
</ul>
<h3 id="morphology">Morphology</h3>
<p><strong>Morphology 형태론</strong></p>
<ul>
<li>최소한의 의미를 가지는 구조</li>
</ul>
<p><strong>voice started time</strong></p>
<p>의미를 갖지 않고 소리만 나는 &quot;pah&quot;나 &quot;bah&quot;, 또는 &quot;a&quot;와 &quot;e&quot; 보다는, 다음 level인 형태소(morpheme)가 의미를 갖는 최소 단위라고 여겨집니다. 그래서 많은 단어들이 복잡한 조각들(parts of words)로 구성되지만 하나하나 의미를 가지고 있게 되는 것입니다.</p>
<p><img src="https://images.velog.io/images/ltnalsxl/post/7568e245-a8bb-4bab-90d1-e3a0b62c0363/image.png" alt=""></p>
<p>Unfortunately라는 단어를 쪼개서 살펴보면</p>
<ul>
<li>&quot;fortune&quot; : 운이 좋은</li>
<li>&quot;un&quot; : 부정/반대의 의미</li>
<li>&quot;ly&quot; : 부사 형태</li>
</ul>
<p>이렇게 단어 조각들과 작은 단위들이 모두 의미를 갖게 되는 것.</p>
<p><strong>하지만 이런 형태소 단위의 단어들을 딥러닝에 사용하는 경우는 거의 없습니다</strong>. 단어를 또 의미 있는 단어(형태소)들로 쪼개는 과정 자체가 어렵고, 굳이 이 방법을 사용하지 않고 <em>character n-grams</em>를 사용하더라도 중요한 의미 요소들을 충분히 잘 잡아낼 수 있고, 결과적으로 좋은 결과를 낼 수 있기 때문.</p>
<p><a href="https://dl.acm.org/doi/10.5555/21935.42475">[논문] On learning the past tenses of English verbs</a></p>
<ul>
<li>영어의 과거형(past tense) 형태를 생성해내는 모델</li>
<li>&quot;영어 동사의 과거 형태를 학습할 수 있는 시스템을 만들 수 있을까?&quot;에 대한 일종의 인지심리학(psy-cog) 실험</li>
<li>&quot;-ed&quot;로 끝나는 규칙적인 동사들도 있지만 그만큼 많은 불규칙적인 동사들의 패턴을 학습해야 한다는 것이 어려운 부분</li>
<li>당시(sequence model 초기)에는 단어를 정확하게 표현하기 위해서 character trigrams로 표현</li>
<li>공학적인 문제 해결 방법으로서는 좋은 평가를 받았지만 언어학자들과 철학자들을 비롯한 많은 사람들 사이에서는 논쟁거리
<img src="https://images.velog.io/images/ltnalsxl/post/639eb743-324d-4108-84b4-3c54b22126ff/image.png" alt=""></li>
</ul>
<h3 id="words-in-writing-systems">Words in writing systems</h3>
<p><strong>Writing system</strong>
사람의 언어 표기 체계 (writing system) 는 나라마다 다르고, 하나로 통일되어 있지 않다.</p>
<p>1) No word segmentation: 단어에 대한 segmentation, 즉 띄어쓰기 없이 붙여 쓰는 경우가 있다는 것</p>
<p>중국어: 美国关岛国际机场及其办公室均接获
프랑스어: <em>Je vous ai apporté  des bonbons</em>
아랍어: فقالناھا</p>
<p>2) Compound Nouns</p>
<ul>
<li><p>영어
합성어를 사용할 때 각 명사 사이에 공백을 두기 때문에 <strong>white board</strong>, <strong>high school</strong>같이, 띄어쓰기가 되어 있음에도 불구하고 하나의 명사로 인식됩니다. </p>
</li>
<li><p>독일어
합성어가 띄어쓰기 없이 한 단어로 표현되기 때문에 만약 여기서 띄어쓰기를 하게 되면 다른 단어로 인식됩니다. 
ex) <strong>Lebensversicherungsgesellschaftsangestellter</strong> = life insurance company employee</p>
</li>
</ul>
<h3 id="word-level-models단어-기반-모델">Word-Level Models(단어 기반 모델)</h3>
<p>word-level models를 만들게 되면 커버해야할 단어가 너무 많기 때문에 무한한 단어 공간이 필요하고 비효율적입니다. </p>
<ul>
<li>Rich morphology</li>
<li><em>(체코어) nejneobhospodařovávatelnějšímu = (영어) to the worst farmable one”)*</em></li>
<li>Transliteration (음역)</li>
<li><em>Christopher -&gt; Kryštof*</em></li>
<li>Informal spelling: 신조어/축약어
<img src="https://images.velog.io/images/ltnalsxl/post/be732255-2505-4e11-8bf3-7444ac73f701/image.png" alt=""></li>
</ul>
<h3 id="character-level-models-문자-기반-모델">Character-Level Models (문자 기반 모델)</h3>
<p>character-level model (문자 기반 모델)은 단어가 가지고 있는 <strong>의미 정보</strong>를 포기하는 대신 두 가지 이점을 제공합니다.</p>
<p>1) 단어 임베딩은 문자 임베딩으로부터 구성할 수 있다. 즉, 어떤 문자 시퀀스에 대해서도 단어 표현 생성이 가능해집니다.</p>
<ul>
<li>OOV 문제 해결 
OOV problem: NLP에서 빈번히 발생하는 데이터 문제로 input language가 database 혹은 input of embedding에 없어서 처리를 못 하는 문제</li>
</ul>
<p>2) sequence of characters 기반으로만 언어를 처리하기 때문에 합성어와 같은 connected language에 대해서도 분석이 가능합니다. </p>
<h2 id="purely-character-level-nmt-models">Purely Character-Level NMT Models</h2>
<p><strong>Machine Translation</strong>
초기에 character 기반으로 구축한 기계번역 시스템은, word 기반 모델 뿐만 아니라 neural network 등장 이전보다도 못한 성능을 보였지만, 발전된 연구가 이루어지기 시작하면서 점차 성공적인 문자 기반 디코더를 만들 수 있게 되었습니다.</p>
<p><strong>English-Czech WMT 2015</strong> <a href="https://nlp.stanford.edu/projects/nmt/">Stanford NLP group</a></p>
<ul>
<li>영어를 체코어로 번역하는 연구에서 우수한 결과 도출</li>
<li>실제로 영어를 체코어로 번역하는 연구가 진행되었지만, 제대로 된 훈련에 어려움을 겪으며 학습 시간이 3주가 소요되었습니다. 결과적으로 unknown words 번역에 효과적이었지만 성능이 word-level model에 비해 크게 향상되지 않았습니다 (word-level model BLEU 15.7 -&gt; character-level model BLEU 15.9). </li>
</ul>
<p><strong>이후 연구 (2017)
Fully Character-Level Neural Machine Translation without Explicit Segmentation</strong>
<a href="https://www.aclweb.org/anthology/Q17-1026.pdf">논문</a>
앞선 모델보다 더 나은 성능을 보이는 character-level  model이 등장했습니다. 이 모델에서는 character 단위의 input을 받아 convolution layer를 거쳐 max pooling과 single layer GRU를 거치는 구조를 가집니다. 구조 자체는 더 복잡하지만, 앞선 모델보다 나은 성능을 보였습니다.
<img src="https://images.velog.io/images/ltnalsxl/post/cbddd3d6-1e05-4fb2-9a70-74773379c0bb/image.png" alt=""></p>
<p>Encoder: 단어에서 시작하는 게 아닌 문장 전체에서 바로 character-level 임베딩을 진행하는 방식으로, 필터 사이즈를 다르게 해서 convolution 연산을 진행하게 됩니다. Max pooling을 stride 5로 주고 진행하게 되고, 각각의 컨볼루션에 대해서 max-pulled representation을 얻게 됩니다. 해당하는 각각의 임베딩에 대해서 highway network를 통과하고, bidirectional GRU를 통해 source representation을 얻을 수 있게 됩니다. </p>
<p>Decoder: 일반적인 character level sequence model
<img src="https://images.velog.io/images/ltnalsxl/post/701444ef-a9ad-4d89-8845-45947afa7eb8/image.png" alt="">
결과적으로 앞선 모델보다 BLEU score가 더 높은 것을 확인할 수 있습니다.</p>
<p><strong>highway network</strong>
깊이가 증가할수록 최적화가 어려워지기 때문에 모델을 깊게 만들면서도 정보의 흐름을 통제하고 학습 가능성을 극대화할 수 있도록 해주는 역할</p>
<p><strong>이후 연구 (2018)
Stronger character results with depth in LSTM seq2seq model</strong>
<a href="https://www.aclweb.org/anthology/D18-1461.pdf">논문</a>
Bi-LSTM Sequence-to-sequence 모델을 적용한 결과
<img src="https://images.velog.io/images/ltnalsxl/post/e9142bd8-7b7d-42ce-a71a-0ec1979116af/image.png" alt=""></p>
<ul>
<li>영어 → 프랑스어 번역: layer를 깊에 쌓을수록 word-level 모델의 성능을 character-level model이 능가</li>
<li>체코어 → 영어 번역: 마찬가지로 가장 깊게 layer를 쌓은 경우에는 character-level model이 BPE의 성능을 능가. character-level model을 깊게 쌓을수록 성능이 급격하게 증가.</li>
<li>언어의 특성에 따라 모델 type 별 성능과 효과가 다르다는 것을 알 수 있습니다. 
<img src="https://images.velog.io/images/ltnalsxl/post/7e0d4066-1712-47a8-9125-23c64b795ebd/image.png" alt="">
관련 연구가 계속해서 발전해왔지만, 2015년부터 겪었던 문제점은 여전히 남아있습니다. Word-level model은 속도가 빠르기 때문에 짧은 시간 내에 번역 태스크를 해낼 수 있는 반면, characeter-level model은 word pieces를 이용하기 때문에 연산량이 word-level model보다 시간과 비용이 훨씬 많이 들게 됩니다.</li>
</ul>
<h2 id="subword-models">Subword Models</h2>
<p><strong>두 가지 방법</strong></p>
<ul>
<li><strong>Same architecture as for word-level model</strong>: word-level model과 동일한 구조, 하지만 word가 아닌 <strong>word-pieces</strong></li>
<li><strong>Hybrid architectures</strong>: main model은 word로 나타나지만 unknown word를 다른 표현 방법으로 나타내는 방법 (characters는 다르게 표현됨)</li>
</ul>
<h3 id="byte-pair-encoding-bpe">Byte Pair Encoding (BPE)</h3>
<p>딥러닝과는 거리가 먼 간단한 아이디어임에도 성공적인 방법론</p>
<p><strong>compression algorithm</strong></p>
<ul>
<li>Data compression 관련 연구 선행 <a href="https://www.derczynski.com/papers/archive/BPE_Gage.pdf">[논문] A New Algorithm for Data Compression</a>: </li>
<li>looking for the most frequent sequence of two bytes</li>
</ul>
<p>해당 아이디어를 기반으로 BPE 알고리즘 등장
<a href="https://www.aclweb.org/anthology/P16-1162.pdf">[논문] Neural Machine Translation of Rare Words with Subword Units</a></p>
<ul>
<li>bytes가 아닌 character ngrams를 사용. 즉, 가장 빈번하게 발생되는 pair를 byte가 아닌 character 단위로</li>
<li>데이터에 대해서 다 적용할 수 있고, multi-lingual</li>
</ul>
<p><strong>작동 방식</strong></p>
<ul>
<li>A word segmentation algorithm: 짧은 시퀀스의 bottom-up clustering</li>
<li>unigram 어휘에서 시작</li>
<li>&quot;what&#39;s the most frequent ngram? &quot;* -&gt; bigram pair -&gt; add it to our &quot;Vocabulary&quot; (a new ngram)
<img src="https://images.velog.io/images/ltnalsxl/post/e9bbe470-d20b-477b-b0ab-28f8762fa49f/image.png" alt="">
<img src="https://images.velog.io/images/ltnalsxl/post/0c99b3fd-cbf6-4a68-88aa-fd3a13a6abbd/image.png" alt="">
<img src="https://images.velog.io/images/ltnalsxl/post/bb1de3bf-9b0b-4f95-853c-49f2dc64e6d8/image.png" alt="">
<img src="https://images.velog.io/images/ltnalsxl/post/627e090f-3863-4f68-81ae-6d9c83c10382/image.png" alt=""></li>
</ul>
<p>결과적으로 이 vocabulary 안에는 모든 single letter들과, &#39;ES&#39;와 &#39;EST&#39;같은 문자 시퀀스, 그리고 &#39;THAT&#39;,&#39;TO&#39;와 &#39;WITH&#39;와 같은 평범한 단어들도 우리의 vocabulary에 들어오게 됩니다.</p>
<h3 id="wordpiecesentencepiece-model">Wordpiece/Sentencepiece model</h3>
<p><strong>Google&#39;s neural machine translation (GNMT)</strong></p>
<ul>
<li>BPE의 variants: wordpiece model과 sentencepiece model</li>
<li>앞선 알고리즘은 frequency를 순수하게 등장 횟수로 따졌다면, 여기서는 clumping (군집화)를 통해 perpelexity 감소</li>
</ul>
<h4 id="1-wordpiece-model">1) wordpiece model</h4>
<p>pre-segmentation을 통해서 단어의 출현 빈도수를 기반으로 단어를 추가해준 뒤 BPE를 적용하는 기법. <em>Transformer, ELMo, BERT, GPT-2</em>가 모두 word piece model에 해당됩니다. </p>
<p><strong>BERT</strong></p>
<ul>
<li>WordPiece Tokenizer 사용</li>
<li>자주 등장하는 단어는 그대로 단어 집합에 추가</li>
<li>unknown word 등장 시 다음과 같이 word pieces로 분할</li>
</ul>
<p>BERT에서는 non-initial word pieces가 ##로 표현되면서 <strong>hypatia = h ##yp #ati #a</strong> 로 분리해서 hypatia라는 단어를 표현합니다. </p>
<h4 id="2-sentencepiece-model">2) sentencepiece model</h4>
<p>Google (2018) 
<a href="https://arxiv.org/pdf/1804.10959.pdf">[논문] Subword Regularization: Improving Neural Network Translation Models with Multiple Subword Candidates</a> 
<a href="https://github.com/google/sentencepiece">github 코드</a>
단어로 구분이 어려운 언어가 있기 때문에 (ex. 중국어), 이 모델의 경우에는 raw text에서 바로 character-level로 나눠집니다. 공백에 대해서 token을 따로 지정해줘서 (_) BPE와 유사한 방식을 수행하게 됩니다. 다만 완전히 같은 방식으로 진행되지는 않고 BPE 방식이 변형되어 진행됩니다.</p>
<ul>
<li>BPE: frequency 기반으로 가장 빈번하게 등장하는 것 추가</li>
<li>sentence piece model: bigram 각각에 대해서 co-occurence 확률을 계산 후 가장 높은 값을 가지는 것 추가</li>
</ul>
<h2 id="hybrid-models">Hybrid Models</h2>
<h4 id="character-level-representations">Character-level Representations</h4>
<p><a href="http://proceedings.mlr.press/v32/santos14.pdf">[논문] Learning Character-level Representations for Part-of-Speech Tagging</a>
<img src="https://images.velog.io/images/ltnalsxl/post/1d60b412-70ef-40ac-8d96-2fdb463df7dd/image.png" alt=""></p>
<h4 id="character-based-lstm">Character-based LSTM</h4>
<p>Bi-LSTM builds word representations
<strong>Purely character-level NMT models</strong>
2015년도에 순수하게 character 단위로 NMT task를 진행한 모델을 살펴보겠습니다. <a href="https://www.aclweb.org/anthology/D15-1176.pdf">논문</a>
<img src="https://images.velog.io/images/ltnalsxl/post/6a00a530-7e83-4574-96b9-6870450d5ecf/image.png" alt=""></p>
<ul>
<li>Bi-LSTM을 통해 word embedding</li>
<li>final state를 concat해서 임베딩된 단어의 벡터로 사용</li>
<li>임베딩된 단어 벡터들을 그 윗 단계의 LSTM에 최종적인 task를 진행하게 되고, </li>
<li>language model과 pos tagging을 사용</li>
</ul>
<h4 id="character-aware-neural-language-models-논문">Character-Aware Neural Language Models <a href="https://arxiv.org/pdf/1508.06615.pdf">[논문]</a></h4>
<p>Can we build a good language model by starting out from characters?
<img src="https://images.velog.io/images/ltnalsxl/post/17122244-0893-4954-9694-fe1a5f52f252/image.png" alt="">
가장 먼저 input 단어에 대해서 character embedding을 진행합니다. 이후 filter size 여러 개를 사용해서 convolution을 진행하고 각각에 대해 max pooling을 진행해서 feature를 뽑습니다. 즉, 어떤 ngram들이 단어의 뜻을 가장 잘 나타내는지 고르는 과정이며, 이 과정이 끝나면 output representation을 얻게 됩니다. Output representation은 highway network를 거치게 되고, 최종적으로 임베딩 벡터 값이 나오면 word-level LSTM network를 통해 예측 task를 수행하게 됩니다. 결과적으로 앞서 살펴본 모델들보다도 perplexity를 최소화하면서 비슷한 성능을 낼 수 있게 됩니다.</p>
<p><strong>Quantitative Results</strong>
<img src="https://images.velog.io/images/ltnalsxl/post/6edfa8c7-f860-49ac-975f-f231fe58512d/image.png" alt="">
Highway network를 통과하기 전에 character-level로 진행한 모델에서는 character 단위로 진행하다보니까 낸 결과들이 의미가 아닌 철자가 유사한 단어들</p>
<p>Highway network를 통과한 후에는 사람 이름들을 결과값으로 내는 것을 볼 수 있습니다. 즉, semantic을 반영해서 조금 더 의미있는 단어들을 학습하게 되는 것입니다.</p>
<p><img src="https://images.velog.io/images/ltnalsxl/post/2bab1999-2cd6-4654-92da-ef474b54830b/image.png" alt=""></p>
<h4 id="hybrid-nmt-논문">Hybrid NMT <a href="https://www.aclweb.org/anthology/P16-1100.pdf">[논문]</a></h4>
<p>대부분의 경우 word level model을 사용하고, 필요 시에 character level model을 사용합니다.</p>
<p><img src="https://images.velog.io/images/ltnalsxl/post/0072591d-e67d-4035-aa53-f3aeb5814d39/image.png" alt=""></p>
<ul>
<li>16,000개의 vocabulary size를 이용</li>
<li>기본적으로 seq2seq으로 word-level model 진행</li>
<li>unknown word -&gt; character-level model</li>
<li>4개의 layer를 사용</li>
</ul>
<p><strong>2-stage Decoding</strong></p>
<ul>
<li>일반적으로 NMT의 decoder는 beam search 사용 </li>
<li>이 모델에서는 보다 복잡한 버전의 beam search인 word-level beam search와 character-level beam search 사용</li>
</ul>
<p>즉, Hybrid NMT의 경우에는 모델의 기본 구조에 따라 decoder에서도 기본적으로 word level beam search를 사용하고 unknown word에 대해서만 character-level beam search를 사용하게 되는 것입니다. </p>
<p><img src="https://images.velog.io/images/ltnalsxl/post/6d7fb54c-5bb9-423b-80aa-fc34c72ce3d2/image.png" alt="">
위 결과를 보면, word-level model 사용 시 unknown word를 copy 기법으로 처리했을 때, 이름은 문제없이 옮기지만 나이 같은 경우 번역이 안 된 상태로 들어가서 제대로 번역이 되지 않은 문장이 만들어진다는 것을 알 수 있습니다.</p>
<p>반면 hybrid에서는 나이는 정확하게 번역을 하지만 이름 번역 과정에서 오류가 생기는 걸 볼 수 있습니다. </p>
<h3 id="chars-for-word-embeddings">Chars for word embeddings</h3>
<p><a href="https://www.aclweb.org/anthology/W16-1603.pdf">논문 A Joint Model for Word Embedding and Word Morphology</a></p>
<ul>
<li>문자 시퀀스(character sequence)에서 시작</li>
<li>Bidirectional LSTM을 통해 복잡한 모델을 효과적으로 훈련</li>
<li>character embedding과 LSTM parameter를 학습하여 word representation을 제공</li>
</ul>
<h3 id="fasttext-embeddings">FastText Embeddings</h3>
<p><a href="https://www.aclweb.org/anthology/Q17-1010.pdf">논문 Enriching Word Vectors with Subword Information</a></p>
<ul>
<li>a next generation efficient word2vec-like word representation library</li>
<li>형태소가 풍부한 언어나 희귀한 단어들을 다룰 때 더 좋은 성능을 보이는 모델</li>
<li>word2vec skip-gram 모델의 확장: character n-grams 사용</li>
</ul>
<h2 id="reference">Reference</h2>
<p><a href="https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1194/slides/cs224n-2019-lecture12-subwords.pdf">https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1194/slides/cs224n-2019-lecture12-subwords.pdf</a>
<a href="https://wikidocs.net/22592">https://wikidocs.net/22592</a>
<a href="https://velog.io/@tobigs-text1314/CS224n-Lecture-12-Subwords">https://velog.io/@tobigs-text1314/CS224n-Lecture-12-Subwords</a>
<a href="https://youtu.be/64FxDORoHm0">https://youtu.be/64FxDORoHm0</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Lecture 11 – Convolutional Networks for NLP]]></title>
            <link>https://velog.io/@tobigs-text1415/Lecture-11-Convolutional-Networks-for-NLP</link>
            <guid>https://velog.io/@tobigs-text1415/Lecture-11-Convolutional-Networks-for-NLP</guid>
            <pubDate>Wed, 19 May 2021 09:54:33 GMT</pubDate>
            <description><![CDATA[<p>작성자: 세종대학교 데이터사이언스학과 이정은</p>
<h1 id="convnets-for-nlp">ConvNets for NLP</h1>
<p>이번 강의에서는 CNN을 사용한 Text Classification에 대해 설명합니다.</p>
<h2 id="1-why-cnn">1. Why CNN?</h2>
<h3 id="rnn의-단점">RNN의 단점</h3>
<p><img src="https://user-images.githubusercontent.com/55127132/118787776-17fa8580-b8ce-11eb-8050-62fc14c71f41.png" alt="RNN단점">
기존 RNN은 prefix context없이 phrase를 잡아낼 수 없고, 마지막 단어 벡터의 영향을 많이 받는 문제를 가지고 있었습니다.</p>
<h3 id="cnn-for-text">CNN for text</h3>
<p><img src="https://user-images.githubusercontent.com/55127132/118787755-1466fe80-b8ce-11eb-97de-ee9135c37b5a.png" alt="CNNfortext">
CNN을 텍스트 처리에 사용하고자 한 메인 아이디어는 &quot;문장 내 가능한 모든 단어 subsequence의 representation을 계산하면 어떨까?&quot;였습니다.
이 방법은 해당 구문이 문법적으로 옳은지 판단할 수 없고, linguistically하지 않은 것 같다는 단점이 있습니다.</p>
<h2 id="2-1d-convolution-for-text">2. 1D Convolution for text</h2>
<p>일반적으로 CNN은 이미지 처리에서 주로 쓰이며 2D convolution을 사용하지만, 텍스트 처리에서는 filter가 위아래 한 방향으로만 이동하는 1D Convolution을 사용합니다.</p>
<h3 id="1d-convolution-연산">1D Convolution 연산</h3>
<p><img src="https://user-images.githubusercontent.com/55127132/118787742-116c0e00-b8ce-11eb-90b7-05ee7db63ef4.png" alt="1DConv">
Input은 문장 내 각 단어를 나타내는 dense word vector입니다. (one-hot vector도 가능합니다.) Input의 크기는 단어 개수 x word vector의 차원, Filter의 크기는 한번에 보고자 하는 단어의 개수 x word vector의 차원입니다.</p>
<h4 id="filter">Filter</h4>
<p><img src="https://user-images.githubusercontent.com/55127132/118787770-16c95880-b8ce-11eb-8c7a-c9b4578dfbaf.png" alt="filter">
Filter는 polite/non-polite, about food/non about food 등의 특징을 나타냅니다.
한 개의 Filter가 위에서 아래로 이동하며 내적을 진행하면 output은 single vector인 5x1이 됩니다. 3개의 filter를 사용하면 output의 크기는 5x3으로 filter의 개수만큼 늘어납니다. 
이때, 문장 내 단어의 개수는 7개에서 5개로 줄어들어 문장이 shrunk됩니다. 이를 해결하기 위해 padding을 사용합니다.</p>
<h4 id="padding">Padding</h4>
<p><img src="https://user-images.githubusercontent.com/55127132/118787772-16c95880-b8ce-11eb-9e9e-64794687ad81.png" alt="padding">
padding=1을 적용하면, input과 동일한 길이의 output을 얻을 수 있습니다.</p>
<h4 id="pooling">Pooling</h4>
<p><img src="https://user-images.githubusercontent.com/55127132/118787773-1761ef00-b8ce-11eb-8640-5b028b424794.png" alt="pooling">
Pooling은 특징들을 요약하는 역할을 합니다. Pooling에는 최대값을 가져오는 Max pooling과 평균값을 사용하는 Average pooling이 있습니다. 더 많이 사용되는 것은 max pooling인데, 그 이유는 자연어 처리에서 특징이 나타나는 경우는 매우 sparse하기 때문입니다. 예를 들어, polite라는 특징은 접속사, 관사 등에서는 나타날 수 없고, 그 외의 특정 단어에서 polite함이 드러날 것 입니다. 이때 이 특징을 max pooling이 더 잘 포착할 수 있다고 합니다.</p>
<h4 id="stride-local-max-pooling--k-max-pooling">Stride, Local Max Pooling / K-Max Pooling</h4>
<p><img src="https://user-images.githubusercontent.com/55127132/118787765-1630c200-b8ce-11eb-93a6-d3ac73ef0a39.png" alt="etc">
Stride는 filter가 한번에 이동하는 거리를 나타냅니다. Stride=2와 Stride=2 &amp; local max pooling은 둘 다 representation을 압축하여 생성하지만, 다른 결과값을 가집니다. 실제 텍스트 처리에서는 많이 사용되지 않습니다.
K-Max Pooling은 각 열에서 max값 k개를 선정하는 방법으로, 해당 값은 정렬 시키지 않고 위 열의 동일하게 가져옵니다.</p>
<h4 id="dilation">Dilation</h4>
<p><img src="https://user-images.githubusercontent.com/55127132/118787763-15982b80-b8ce-11eb-9050-c4ac6eecce12.png" alt="dilation">
Dilation rate는 filter 사이의 간격을 의미합니다. 즉, dilation=2인 3x3 filter는 dilation만큼 건너 뛰어 연산을 진행합니다. NLP에서의 dilated convolution은 적은 parameter로 더 넓은 범위를 볼 수 있게 합니다. </p>
<blockquote>
<p>이미지 처리에서의 Dilation
<a href="https://zzsza.github.io/data/2018/02/23/introduction-convolution/">https://zzsza.github.io/data/2018/02/23/introduction-convolution/</a></p>
</blockquote>
<p>문장 자체의 의미를 중점적으로 이해하고 싶다면, filter의 크기를 증가시키거나 dilated convolution을 사용하여 한번에 보는 범위를 늘릴 수 있습니다. 혹은 CNN의 depth를 증가시키면 됩니다.</p>
<h2 id="3-single-layer-cnn-for-sentence-classification">3. Single Layer CNN for Sentence Classification</h2>
<p><em><strong>&quot;Yoon Kim(2014): Convolutional Neural Networks for Sentence Classification. EMNLP 2014.&quot;</strong></em></p>
<p>해당 논문의 목적은 Sentence classification입니다. </p>
<h3 id="model-architecture">Model Architecture</h3>
<p><img src="https://user-images.githubusercontent.com/55127132/118787781-18931c00-b8ce-11eb-9e41-7dde7b5d06ed.png" alt="single_model">
Convolution 연산은 word vectors을 concatenate하여 진행합니다. 한 채널에 대한 연산 결과는 c_i로 나타낼 수 있고, feature map c는 n개의 단어와 window size=h일 때 n-h+1 차원을 가지게 됩니다.
<img src="https://user-images.githubusercontent.com/55127132/118787782-18931c00-b8ce-11eb-8e04-7d33293f927f.png" alt="single_model1">
feature map c를 max pooling하여 각 channel마다 하나의 값을 얻습니다. max pooling을 하면 filter weight와 window size, 문장 길이의 변화에 강해집니다.
Max pooling 이후 나온 feature vector에 softmax를 취하여 클래스 분류를 진행합니다.</p>
<h3 id="experiments">Experiments</h3>
<p><img src="https://user-images.githubusercontent.com/55127132/118787779-17fa8580-b8ce-11eb-9318-3ebe0fa32035.png" alt="single_experiment">
실제 모델에서는 filter size=2,3,4인 filter를 feature map으로 각 100개씩 사용하였습니다. pre-trained word vector를 사용하여 초기화하고, fine-tuning과 frozen을 모두 사용했습니다. 그리고 Dropout과 각 클래스의 softmax weight를 L2 normalize했습니다. 
해당 모델은 간단한 single layer CNN으로 유의미한 분류 결과를 낸 것에 의의가 있습니다.</p>
<h2 id="4-toolkits">4. Toolkits</h2>
<h3 id="gates-units-used-vertically">Gates units used vertically</h3>
<p><img src="https://user-images.githubusercontent.com/55127132/118787753-13ce6800-b8ce-11eb-8ee5-f9ad573d65e9.png" alt="block"></p>
<p>Residual Block과 Highway Block 모두 Shorcut connection의 개념으로 convolution layer를 지나 나온 결과에  x에 대한 정보를 더해줍니다. Highway Block에서의 T(x)는 Transform gate, C(x)는 Carry gate를 의미하는데, 이는 output이 input에 대하여 얼마나 변환되고 옮겨졌는지를 표현합니다.</p>
<h3 id="batch-normalization">Batch Normalization</h3>
<p>Batch Normalization은 CNN에서 주로 사용며, 배치별로 평균=0, 분산=1로 정규화시키는 작업입니다. 이를 수행하면 Convolution block이 항상 같은 scale을 가지기 때문에 안정적인 학습이 가능해집니다. 또한, parameter initialization에 덜 예민해지고 learning rate tuning이 한결 쉬워집니다.</p>
<blockquote>
<p>Batch Nomralization / Layer Normalization
<a href="https://yonghyuc.wordpress.com/2020/03/04/batch-norm-vs-layer-norm/">https://yonghyuc.wordpress.com/2020/03/04/batch-norm-vs-layer-norm/</a></p>
</blockquote>
<h3 id="1-convolution">1 Convolution</h3>
<p>1x1 크기의 filter로, 적은 parameter 개수로 channel의 수를 줄일 수 있습니다. </p>
<h3 id="cnn-translation">CNN Translation</h3>
<p><img src="https://user-images.githubusercontent.com/55127132/118788925-38770f80-b8cf-11eb-97a5-fa9f948848f8.png" alt="translation">
seq2seq 이전에 나온 translation 모델로, encode로 CNN &amp; decoder로 RNN을 사용한 모델입니다.</p>
<h2 id="5-deep-cnn-for-text-classification">5. Deep CNN for Text Classification</h2>
<p><em><strong>&quot;Conneau, Schwenk, Lecun, Barrault(2017): Very Deep Convolutional Networks for Text Classification. EACL 2017.&quot;</strong></em>
해당 논문에서는 text classification을 위한 deep한 CNN 모델을 제안합니다.</p>
<h3 id="vd-cnn-architecture">VD-CNN architecture</h3>
<p><img src="https://user-images.githubusercontent.com/55127132/118787761-15982b80-b8ce-11eb-8f5f-20179890edd6.png" alt="deep_model">
VD-CNN의 모델 구조는 다음과 같습니다. VGGnet, ResNet과 비슷한 구조를 가집니다.</p>
<h3 id="experiments-1">Experiments</h3>
<p><img src="https://user-images.githubusercontent.com/55127132/118787758-14ff9500-b8ce-11eb-89ec-7ce1175798a9.png" alt="deep_experiment">
실험에는 large text classification dataset들을 사용하였고, layer가 깊을수록 error값이 낮은 것을 확인할 수 있습니다. 해당 표에는 기재되어 있지 않지만 depth=47이 depth=29보다 낮은 성능을 보였다고 합니다. 즉, NLP 분야는 depth=34가 minimum인 이미지 분야처럼 deep한 모델을 사용하기는 어렵다는 것을 의미합니다.</p>
<h2 id="6-quasi-recurrent-nueral-network">6. Quasi-Recurrent Nueral Network</h2>
<p><img src="https://user-images.githubusercontent.com/55127132/118787775-1761ef00-b8ce-11eb-932c-67232d8862ab.png" alt="quasi">
RNN은 parallelize가 어려워 느리다는 단점을 가집니다. 이를 개선하기 위해 parallelize가 쉬운 CNN과 결합한 모델이 Quasi-Recurrent Neural Network입니다. 두 모델의 장점만을 가져와 Convolution과 Pooling을 통해 sequencial data를 parell로 처리합니다. 해당 모델은Sentiment classification을 진행했을 때, LSTM과 비슷한 성능을 내지만 3배 빠른 속도를 보였다고 합니다.</p>
<h2 id="reference">Reference</h2>
<p><a href="https://www.youtube.com/watch?v=EAJoRA0KX7I&amp;list=PLoROMvodv4rOhcuXMZkNm7j3fVwBBY42z&amp;index=12">https://www.youtube.com/watch?v=EAJoRA0KX7I&amp;list=PLoROMvodv4rOhcuXMZkNm7j3fVwBBY42z&amp;index=12</a>
<a href="https://zzsza.github.io/data/2018/02/23/introduction-convolution/">https://zzsza.github.io/data/2018/02/23/introduction-convolution/</a>
<a href="https://velog.io/@tobigs-text1314/CS224n-Lecture-11-ConvNets-for-NLP">https://velog.io/@tobigs-text1314/CS224n-Lecture-11-ConvNets-for-NLP</a>
<a href="https://arxiv.org/pdf/1408.5882.pdf">https://arxiv.org/pdf/1408.5882.pdf</a>
<a href="https://ratsgo.github.io/deep%20learning/2017/10/09/CNNs/">https://ratsgo.github.io/deep%20learning/2017/10/09/CNNs/</a>
<a href="https://yonghyuc.wordpress.com/2020/03/04/batch-norm-vs-layer-norm/">https://yonghyuc.wordpress.com/2020/03/04/batch-norm-vs-layer-norm/</a>
<a href="https://arxiv.org/pdf/1606.01781.pdf">https://arxiv.org/pdf/1606.01781.pdf</a>
<a href="https://arxiv.org/pdf/1611.01576.pdf">https://arxiv.org/pdf/1611.01576.pdf</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Lecture 10 – Question Answering]]></title>
            <link>https://velog.io/@tobigs-text1415/Lecture-10-Question-Answering</link>
            <guid>https://velog.io/@tobigs-text1415/Lecture-10-Question-Answering</guid>
            <pubDate>Wed, 19 May 2021 09:28:16 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 성신여자대학교 통계학과 <a href="https://github.com/Seyoung-Jung">정세영</a></p>
<h3 id="우리가-매일같이-사용하는-question-answering-예시-구글링">우리가 매일같이 사용하는 Question Answering 예시: 구글링</h3>
<p><img src="https://images.velog.io/images/seyoungjung/post/b3a01665-4e97-41e5-b21e-541f005303e0/image.png" alt=""></p>
<h2 id="motivation">Motivation</h2>
<p>과거에는 수많은 웹문서 중에 관련 있는 문서 리스트를 반환해주는 정도였음
내 question에 더 구체화된 answer를 반환해줬으면 좋겠다 : Question Answering!</p>
<p><strong>Question Answering의 기본적인 두 단계</strong></p>
<blockquote>
<p>Finding documents that contain an answer
: 기존의 검색 기반 시스템으로 굉장히 큰 데이터에 확장 가능
Finding an answer in the documents (Reading Comprehension)
: 위 검색 기반으로 좁혀진 document candidates에서 정답 search </p>
</blockquote>
</br>

<h4 id="reading-comprehension의-역사">Reading Comprehension의 역사</h4>
<p>Machine Comprehension (Burge 2013) : MCTest corpus를 가지고 &quot;답은 지문에 있어. 찾아봐&quot; 하는 task (진전은 없었음)
<img src="https://media.vlpt.us/images/tobigs-text1314/post/b6beee04-2ade-4526-8d59-6f707d64fbf1/image.png" alt="MCTest"> 이후 매우 크게 구축한 train corpus와 신경망 구조를 통해 성능이 향상됨. 특히 <strong>SQuAD dataset</strong>이 굉장히 정교하게 구축되어 크게 기여하였고 지금까지 널리 사용되고 있음.</p>
<p>※ 과거 QA 모델은 주로 NER 기반으로 접근, 수작업이 굉장히 많이 들어가고 복잡함
<img src="https://user-images.githubusercontent.com/55081331/118459535-cbc90d00-b736-11eb-9f04-ba45b523cd5e.png" alt="image">
</br></p>
<h2 id="squad-stanford-question-answering-dataset">SQuAD (Stanford Question Answering Dataset)</h2>
<p>&quot;답은 지문에 있어. 찾아봐&quot; <img src="https://media.vlpt.us/images/tobigs-text1314/post/d8f04eeb-7980-401c-94fb-660c5e989341/image.png" alt="SQuAD"> </p>
<h3 id="v11">(v1.1)</h3>
<ul>
<li>3 gold answers : answer의 변형에도 모델을 견고히 하기 위해 세 사람에게 답변을 얻음</li>
<li>평가 지표<ul>
<li>Exact match : 3개 중에 하나로 나왔으면 1, 아니면 0으로 binary accuracy</li>
<li>F1 : 단어 단위로 구한 F1-score 3개 중에 max one을 per-question F1-score로 두고 전체 macro average</li>
<li>punctuation과 a, an, the는 무시</li>
</ul>
</li>
</ul>
<h3 id="v20">(v2.0)</h3>
<ul>
<li>v1.1에서는 모든 question에 항상 answer가 존재하다보니 passage 안에서 문맥을 이해하지 않고 단순히 ranking task로 작동하는 문제점을 발견</li>
<li><strong>v2.0에서는 dev/test 데이터 절반은 passage에 answer가 포함되어 있고 절반은 포함되어있지 않음</strong></li>
<li>평가 시 no answer를 no answer라고 해야 맞게 예측한 것</li>
<li>threshold를 두고 그 이하일 때는 예측한 answer를 뱉지 않음 (no answer)</li>
<li>leaderboard를 보면 v1.1때보다 평가수치는 떨어졌지만 v1.1보다 더 정교하게 맥락을 파악하고 있다는 결과</li>
</ul>
<p><a href="https://arxiv.org/pdf/1806.03822.pdf">https://arxiv.org/pdf/1806.03822.pdf</a>
<a href="https://dos-tacos.github.io/paper%20review/SQUAD-2.0/">https://dos-tacos.github.io/paper%20review/SQUAD-2.0/</a>
온라인의 crowd worker들이 unanswerable question 직접 생성(즉, 기계적으로 생성된 것이 아니라 진짜 인간이 생성했으므로 질이 더 높음)
 SQuAD 1.1에 자동 생성된 응답 불가능 질문들을 병합해 테스트한 결과 SQuAD 2.0의 dev셋보다 약 20% 가량 성능이 높아져, 상대적으로 SQuAD 2.0의 task가 더 어려운 것임을 확인
 <img src="https://dos-tacos.github.io/images/lynn/181229/5.PNG" alt="자동 생성 비교"></p>
</br>

<h3 id="squad의-한계">SQuAD의 한계</h3>
<ul>
<li>only span-based answers</li>
<li>현실의 본문-질문 (실제 마주하게 될 데이터)보다 쉽게 답변을 찾을 수 있는 구조 (우리가 현실에서 생각하는 질문과 구글링할 때 검색하는 질의문이 다른 것처럼)</li>
<li>하지만 그럼에도 지금까지 QA 모델에 가장 많이 사용된 well-structured, clean dataset</li>
</ul>
</br>

<h3 id="korquad-20">KorQuAD (2.0)</h3>
<p>한국어 위키백과로 데이터 구축
<img src="https://media.vlpt.us/images/tobigs-text1314/post/b8f8e819-c46d-4e57-99a9-bbbadac18ca4/image.png" alt="KorQuAD 설명"><a href="https://www.slideshare.net/LGCNSairesearch/korquad-v20?ref=https://www.slideshare.net/LGCNSairesearch/slideshelf">https://www.slideshare.net/LGCNSairesearch/korquad-v20?ref=https://www.slideshare.net/LGCNSairesearch/slideshelf</a>
</br></p>
<hr>
</br>

<h2 id="stanford-attentive-reader">Stanford Attentive Reader</h2>
<ul>
<li><p>simplest neural question answering system</p>
</li>
<li><p>Bi-LSTM 구조를 사용하여 각 방향의 최종 hidden state 둘을 concat하여 question vector로 사용
<img src="https://jeongukjae.github.io/images/cs224n/10-1.png" alt="question vector"></p>
</li>
<li><p>passage의 각 단어 vector들도 똑같이 Bi-LSTM을 사용하여 각 단어 시점의 두 방향 hidden state를 concat하여 passage word vector로 사용
<img src="https://jeongukjae.github.io/images/cs224n/10-2.png" alt="passage vector"></p>
</li>
<li><p>question vector를 모든 시점의 passage word vector와 attention을 구해서 <strong>passage에서 어디가 answer의 시작이고 끝인지를 학습하는 방식</strong> (start token attention과 end token attention의 식이 학습시키는 가중치행렬만 다르고 구조가 똑같은 걸 볼 수 있는데, 이는 일반적으로 RNN에서 식의 구조는 똑같지만 forget gate나 input gate가 서로 다른 역할을 하는 것과 같은 이치라고 이해하면 된다.)</p>
</li>
</ul>
<p></br></br></p>
<h2 id="stanford-attentive-reader-1">Stanford Attentive Reader++</h2>
<p>$$L =  -\sum logP^{(start)}(a_{start}) -\sum logP^{(end)}(a_{end})$$
</br></p>
<ul>
<li>아까는 최종 hidden state만 가져왔던 걸 지금은 question의 모든 단어 시점 hidden state의 attention을 구해서 그 가중합을 question vector로 사용
<img src="https://user-images.githubusercontent.com/55081331/118512621-ef5b7a00-b76d-11eb-92ca-55fe3344bc87.png" alt="image"></li>
<li>3 layer Bi-LSTM 사용</li>
<li>passage word vector는 [기존 embedding vector + POS &amp; NER tag one-hot encoding + frequency + question에 등장 여부, 단어간의 유사도] concat</li>
</ul>
<p></br></br></p>
<h2 id="bidaf-bi-directional-attention-flow-for-machine-comprehension">BiDAF (Bi-Directional Attention Flow for Machine Comprehension)</h2>
<ul>
<li>Query(question)과 Context(passage) 사이에 attention flow layer가 bi-directional(양방향)으로 동작하는 게 핵심
각각의 question word와 passage word 서로 간의 유사도 기반
<img src="https://media.vlpt.us/images/tobigs-text1314/post/12d5a7b7-2138-4380-a12d-6d647ea624c4/image.png" alt="BiDAF"></br>
### $$S_{ij} = w^T_{sim}[c_i;q_j;c_i○q_j]$$
#### : context word(i)와 query word(j)의 유사도 matrix

</li>
</ul>
</br>

<blockquote>
<p>Context-to-Question attention : context word에 가장 관련있는 question word는?
$$\alpha^i = softmax(S_{i,:})$$
$$a_i = \sum_{j=1}^Ma^i_jq_j$$
<img src="https://media.vlpt.us/images/tobigs-text1314/post/6b10cc9d-f3ad-43ed-a9a5-19f293463f54/image.png" alt="C2Q"></p>
</blockquote>
<blockquote>
<p>Question-to-Context attention : question word에 가장 관련 있는 context word는?
$$m_i = max_jS_{ij}$$
$$\beta = softmax(m)$$
$$c&#39; = \sum_{i=1}^N\beta_ic_i$$
<img src="https://media.vlpt.us/images/tobigs-text1314/post/7f3d82d0-bd7c-4050-8395-65b6a7ac4231/image.png" alt="Q2C">
<strong>유사도가 큰 context word만 살아남게 되므로 question 입장에서 관련있는 context word 정보만 모은 것</strong></p>
</blockquote>
</br>

<h4 id="output-of-this-layer">output of this layer</h4>
<h3 id="-b_i--c_ia_ic_i○a_ic_i○c">: $$b_i = [c_i;a_i;c_i○a_i;c_i○c&#39;]$$</h3>
<p></br></br></p>
<h3 id="reference">Reference</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=yIdF-17HwSk&amp;list=PLoROMvodv4rOhcuXMZkNm7j3fVwBBY42z&amp;index=12">https://www.youtube.com/watch?v=yIdF-17HwSk&amp;list=PLoROMvodv4rOhcuXMZkNm7j3fVwBBY42z&amp;index=12</a></li>
<li><a href="https://web.stanford.edu/class/cs224n/slides/cs224n-2019-lecture10-QA.pdf">https://web.stanford.edu/class/cs224n/slides/cs224n-2019-lecture10-QA.pdf</a></li>
<li><a href="https://velog.io/@tobigs-text1314/CS224n-Lecture10-Question-Answering">https://velog.io/@tobigs-text1314/CS224n-Lecture10-Question-Answering</a></li>
<li><a href="https://jeongukjae.github.io/posts/cs224n-lecture-10-question-and-answering/">https://jeongukjae.github.io/posts/cs224n-lecture-10-question-and-answering/</a></li>
<li><a href="https://arxiv.org/pdf/1806.03822.pdf">https://arxiv.org/pdf/1806.03822.pdf</a></li>
<li><a href="https://dos-tacos.github.io/paper%20review/SQUAD-2.0/">https://dos-tacos.github.io/paper%20review/SQUAD-2.0/</a></li>
<li><a href="https://www.slideshare.net/LGCNSairesearch/korquad-v20?ref=https://www.slideshare.net/LGCNSairesearch/slideshelf">https://www.slideshare.net/LGCNSairesearch/korquad-v20?ref=https://www.slideshare.net/LGCNSairesearch/slideshelf</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Lecture 8 – Translation, Seq2Seq, Attention]]></title>
            <link>https://velog.io/@tobigs-text1415/Lecture-8-Translation-Seq2Seq-Attention</link>
            <guid>https://velog.io/@tobigs-text1415/Lecture-8-Translation-Seq2Seq-Attention</guid>
            <pubDate>Wed, 12 May 2021 09:29:24 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 성균관대학교 소비자학과 김재희</p>
<h1 id="pre-neural-machine-translation">Pre-Neural Machine Translation</h1>
<ul>
<li>기계번역(Machine Translation): 특정 언어의 문장을 다른 언어의 문장으로 번역하는 태스크. </li>
</ul>
<h2 id="1-rule-based1950s">1. Rule Based(1950s)</h2>
<p>최초의 시도는 1950년대 초반 러시아어를 영어로 번역하여 냉전에서 우위를 점하려던 영국에서 시작되었습니다. 이때의 시스템은 원시적으로 구성되었습니다. 단순한 규칙 기반 방법론으로, 러시아어-영어 사전을 구축하고, 이를 이용해 러시아어에 매칭되는 영어 단어를 찾는 방식이었습니다. 이후에도 문법을 중심으로 번역하는 규칙 기반 방법론이 개발되었지만, 어마무시한 비용이 투입되어야 했습니다. </p>
<h2 id="2-statistical-machine-translation1990s--2010s">2. Statistical Machine Translation(1990s ~ 2010s)</h2>
<p>딥러닝이 발전하기 전의 기계번역은 주로 통계기반 기계 번역이 주를 이루었습니다. 프랑스어 -&gt; 영어 번역을 예시로 들어봅시다. 
우리가 모델을 통해 달성하고자 하는 것을 영어 문장(y), 프랑스어 문장(x)를 이용해 식으로 표현해보면 다음과 같습니다. </p>
<p>$argmax_yP(y \mid x)$</p>
<p>즉, 프랑스어 문장이 주어지면, 이에 가장 적절하고 그럴듯한 영어 문장 y를 찾는 것입니다. 그리고 위의 식을 베이지안 룰을 이용해 풀어보면 다음과 같이 바뀌게 됩니다. </p>
<p>$argmax_yP(x \mid y)P(y)$</p>
<p>위 식은 두 항으로 이루어져 있습니다. </p>
<ul>
<li>$P(x \mid y)$(Translation Model): 이 항은 영어 문장이 주어졌을 때, 프랑스어 문장의 확률분포를 생성하는 번역 모델을 이루는 항입니다. 이때, y는 기존의 영어 문장에 비해 짧은 단위로 구나 절, 혹은 단어로 되어 있습니다. 번역 모델은 동일한 뜻의 영어와 프랑스어 문장이 짝을 이루고 있는 병렬 말뭉치(pharallel data)를 통해 학습시킬 수 있습니다. </li>
<li>$P(y)$(Language Model): 이 부분은 우리가 이전의 강의들에서 배웠던 Langage Model을 통해 표현되는 항입니다. 즉, 현재 y의 문장이 얼마나 영어 문장으로서 자연스러운지 확률분포를 통해 표현하게 됩니다. Language Model은 이전에도 배웠듯이, 단일 언어 데이터로 학습시킬 수 있습니다. </li>
</ul>
<p>우리가 이전에 Language Model을 배웠으니 $P(y)$ 항은 어떻게 학습시킬 수 있는지 알고 있습니다. 그런데 어떻게 $P(x \mid y)$ 항을 학습시킬 수 있을까요?</p>
<h3 id="2-1-learning-for-smt">2-1. Learning for SMT</h3>
<p>번역 모델을 학습시키기 위해선 병렬 데이터가 필요하다고 했습니다. 병렬 말뭉치는 사람이 직접 작성한 동일 내용에 대한 두 언어의 문장 대 문장 혹은 문단 대 문단의 데이터입니다. </p>
<p><img src="https://images.velog.io/images/stapers/post/d19e4f34-5ba5-467b-a757-b4bc0b519b2e/image.png" alt=""></p>
<p>그리고 이를 이용할 때, 한가지 개념이 더 추가됩니다. &quot;정렬&quot;입니다. 정렬은 단어 단위의 두 언어 간의 동치 관계를 의미합니다. 
정렬을 식에 삽입하면, 다음과 같습니다. </p>
<p>$P(x, a \mid y)$: y 문장이 주어졌을 때, x가 a의 정렬로 되어 있을 확률을 의미합니다. </p>
<h4 id="2-1-1-alignment">2-1-1. Alignment</h4>
<p><img src="https://images.velog.io/images/stapers/post/f22ebed4-a86d-4322-88dc-cb907ffe309d/image.png" alt=""></p>
<p>프랑스어 -&gt; 영어 예시로 돌아오자면, 영어 문장과 프랑스어 단어는 위와 같이 거의 1대 1 대응 관계를 보이고 있습니다. 그래서 오른쪽 표에서 한칸씩 아래로 내려가며 정렬된 것을 알 수 있습니다. 여기서 프랑스어 Le는 영어에 대응되는 단어가 없습니다. 이를 가짜(spurious) 단어라고 합니다. </p>
<p>하지만 모든 번역이 이렇게 1대 1 대응관계를 통해 이루어지지 않습니다.</p>
<h5 id="many-to-one">Many to One</h5>
<p><img src="https://images.velog.io/images/stapers/post/c560fa3f-7c4f-4613-8b17-4c27c9cd9d99/image.png" alt="">
 위에서 여러 영어 단어가 하나의 프랑스어 단어에 대응되는 모습을 보이고 있습니다. 이러한 경우를 many-to-one이라고 합니다. </p>
<h5 id="one-to-many">One to Many</h5>
<p><img src="https://images.velog.io/images/stapers/post/b1528033-5ee7-41bc-b53b-27b5c5a3ec69/image.png" alt="">
반대로 하나의 프랑스어가 여러 영단어의 뜻을 내포하고 있을 때도 있습니다. entarte라는 단어는 &quot;파이로 어떤 사람을 때리다&quot;라는 뜻이라고 합니다. 하지만 이를 뜻하는 영어 단어는 없고, &quot;hit with a pie&quot;라는 구로 대체되어야 합니다. 이럴 때, one에 해당하는 단어를 번역 시 여러 단어로 나눠진다는 의미에서 fertile word라고 합니다. </p>
<h5 id="many-to-many">Many-to-Many</h5>
<p><img src="https://images.velog.io/images/stapers/post/c7947bfb-5571-4aef-bc44-e9e82903b448/image.png" alt="">
영어의 여러 단어가 프랑스어의 여러 단어와 대응되는 경우도 있습니다. </p>
<p>이처럼 번역은 단순히 단어끼리의 매칭으로 해결할 수 없습니다. 단어의 위치와 다른 단어와의 관계도 살펴야 합니다. 조금 상상해봐도 쉽게 모델이 학습할 수 있지 않아 보입니다. 어떻게 이러한 정렬 관계를 학습시키는 걸까요?</p>
<p>다시 식으로 돌아오면 
<img src="https://images.velog.io/images/stapers/post/762dfd9c-fc42-4022-86d0-4a62148468ee/image.png" alt="">
우리가 프랑스어에서 영어로 번역할 때, 영어의 어떠한 단어들이 등장해야 그럴듯한 번역문이 될지 계산하는 것이 위의 식입니다. </p>
<p>가장 단순한 방법은, 모든 경우의 수를 모두 계산하는 것입니다. 100만개의 영어 단어가 있다면, 매 시점마다 100만개의 단어가 나타날 조합을 계산합니다. 하지만 이렇게 된다면 정말정말 계산량이 많아지고 비효율적일 수 밖에 없습니다.</p>
<p>다른 방법으론 휴리스틱 알고리즘을 사용하는 것이 있습니다. 시점마다 확률이 너무 낮은 단어들은 제외하고 경우의 수를 계산하게 됩니다. 그리고 이를 decoding이라고 합니다. </p>
<p>decoding은 나중에 좀 더 자세히 설명하기로 하고, 단순하게 설명하자면 다음과 같습니다. 
<img src="https://images.velog.io/images/stapers/post/1fe62679-bf28-46d9-88df-cc68250ea6fb/image.png" alt="">
독일어 -&gt; 영어 번역 태스크에서 위와 같이 번역되어야 할때, 
<img src="https://images.velog.io/images/stapers/post/c1a921d6-7c4d-4add-a975-830030ff4d4a/image.png" alt=""></p>
<p>각 독일어 단어는 위와 같은 영어 단어로 번역될 수 있습니다. 가장 오른쪽의 hause는 house, home, chamber, at home으로 번역 될 수 있습니다. 이 중에, 가장 확률이 높은 house를 선택합니다. 그렇다면, 이제 house 외에 home, chamber, at home으로 번역될 가능성은 계산하지 않습니다. 트리구조로 생각하면, house 외의 노드를 prunning하는 것으로 볼 수 있습니다. 그리고 nach와 house의 뜻으로 사용될 경우의 hause를 고려하면 home이 가장 확률이 높으므로 나머지 영어 단어 후보들은 계산에서 제외합니다. </p>
<p>이 방식을 반복하여 사용하게 됩니다. </p>
<h4 id="2-1-2-summary">2-1-2. Summary</h4>
<p>통계기반 기계 번역을 요약하면 다음과 같습니다. </p>
<ul>
<li>2010년대까지 기계 번역에서 주류를 이루던 연구 분야였습니다. </li>
<li>가장 좋은 성능을 보였지만 너무 복잡한 구조를 가지고 있었습니다. </li>
<li>수많은 요소들이 사용되었습니다. </li>
<li>사람이 직접 feature engineering을 하여 자원이 많이 투입될 수 밖에 없었습니다. </li>
<li>유지 보수에 있어서도 각각의 언어 짝(영어-프랑스어, 영어-독일어, 한국어-영어)마다 다르게 적용되기 때문에 많은 자원이 투입될 수 밖에 없었습니다. </li>
</ul>
<h1 id="nerual-machine-translation">Nerual Machine Translation</h1>
<p>신경망 기계 번역이 2014년 등장하게 됩니다. 이는 하나의 신경망 네트워크를 이용해 번역 작업을 수행해보려는 시도였습니다. 이때 사용했던 모델은 seq2seq으로 불립니다. seq2seq은 입력된 시퀀스와 다른 도메인의 시퀀스를 출력하는 태스크에 사용되는 모델입니다. 자연어 처리에선 문장을 입력받아 다른 문장을 생성하는 태스크라고 볼 수 있을 것 같습니다. </p>
<p>당시 사용된 모델 구조는 인코더 단의 rnn 하나, 디코더 단의 rnn 하나로 아주 단순한 모델이었습니다. </p>
<h2 id="1-model-architecture">1. Model Architecture</h2>
<p>모델 구조는 다음과 같습니다. 프랑스어 -&gt; 영어 번역을 예시로 하겠습니다.
<img src="https://images.velog.io/images/stapers/post/fc11fe9c-a9c6-40f7-95b0-1ba1121c7644/image.png" alt=""></p>
<h3 id="1-1-encoder">1-1. Encoder</h3>
<p>왼쪽의 인코더 단에는 번역에 사용될 프랑스어 문장이 입력됩니다. 이때, 각 단어의 임베딩 벡터가 각 시점마다 입력값으로 사용되게 됩니다. 이는 bidrectional rnn, LSTM, GRU등 rnn류의 모델이면 무엇이든 사용할 수 있습니다. 마지막 시점의 hidden state는 프랑스어 문장의 정보를 담고 있는 벡터가 되어 디코더 단의 hidden state로 정보를 전달하게 됩니다. </p>
<h3 id="1-2-decoder">1-2. Decoder</h3>
<p>오른쪽의 디코더 단의 첫번째 입력값은 문장의 시작을 의미하는 start 토큰입니다. 인코더의 마지막 hidden state에서 넘어온 프랑스어 정보와 문장의 시작을 의미하는 입력값을 받아 디코더는 첫번째 번역 단어인 he를 내놓게 됩니다. 그리고 번역 태스크는 문장 생성 태스크이므로, 다음에 올 단어를 예측하기 위해, 첫번째 시점의 예측값인 he가 두번째 시점의 입력값으로 사용되게 됩니다. 이런 식으로 이전 시점의 예측값이 현재 시점의 입력값으로 반복하여 사용되게 됩니다. 만약 디코더가 문장의 마지막을 의미하는 end 토큰을 출력한다면, 예측은 끝나게 됩니다. </p>
<p><img src="https://images.velog.io/images/stapers/post/5f58d380-e2e0-478a-bc00-3bbd97a9aa06/image.png" alt=""></p>
<p>이를 식으로 표현하면 위와 같이 표현할 수 있습니다. 번역하고자 하는 문장이 인코딩된 벡터 x가 주어졌을 때 우리가 생성하고자 하는 y y의 확률분포는 x와 이전 시점까지 생성된 $y_1, ..., y_{t-1}$가 주어졌을 때 해당 시점의 토큰 $y_t$ 확률의 곱입니다. 
이는 디코더가 인코딩이라는 조건을 가지고 있는 언어 모델임을 의미합니다. 즉, 디코더는 인코딩을 조건으로 가지는 조건부 언어모델입니다. </p>
<p>위의 내용은 예측 과정을 보여주고 있습니다. NMT의 훈련 과정은 예측과 다른 과정으로 진행됩니다. 이는 나중에 보여드리도록 하겠습니다. </p>
<blockquote>
<p>Application
seq2seq은 단순히 기계 번역 태스크에만 사용되지 않습니다. 다음 태스크를 포함하여 매우 다양한 분야에서 사용되고 있습니다.</p>
</blockquote>
<ul>
<li>요약 : 긴 텍스트를 입력받아 내용은 유지하되 길이가 짧은 텍스트를 생성하는 태스크입니다. </li>
<li>대화 : 맥락을 파악하여 입력받은 말과 자연스레 이어지는 말을 생성하는 태스크입니다. </li>
<li>파싱 : 이전에 배웠던 파싱입니다. 파싱을 하나의 시퀀스로 보고 생성하게 됩니다. </li>
<li>코드 생성 : 우리가 자연어로 원하는 과정을 입력하면, 자동으로 코드를 만들어주는 태스크입니다. </li>
</ul>
<h3 id="1-3-conditional-language-model">1-3. Conditional Language Model</h3>
<p>위에서 디코더는 인코더를 조건으로 가지는 조건부 언어 모델이라고 했습니다. 이를 좀더 생각해보면 다음과 같습니다. </p>
<ul>
<li>디코더는 이전에 생성한 단어를 기반으로 다음에 나타날 단어 분포를 생성하는 언어 모델입니다. </li>
<li>디코더는 시작 언어의 인코딩을 조건으로 단어를 생성하는 조건부 모델입니다. </li>
</ul>
<h2 id="2-training-a-nmt-system">2. Training a NMT system</h2>
<p>위에서 본 예시는 NMT의 예측 과정이라고 했습니다. 그렇다면 어떻게 학습을 시킬까요? 
<img src="https://images.velog.io/images/stapers/post/8dad9429-14f2-4808-877e-79f22938926e/image.png" alt=""></p>
<h3 id="2-1-forward-propagation">2-1. Forward Propagation</h3>
<p>모델 훈련의 순전파 시 예측과 다른 점은, 디코더에도 고정된 입력값이 있다는 것입니다. 예측에서는 직전 시점의 예측 단어가 현재 시점의 입력값으로 사용되었습니다. 하지만, 훈련 과정에선 정확하게 각 시점의 단어를 알고 있어야 학습이 가능해집니다. 랜덤한 초기 파라미터에서 제대로 된 단어를 예측할 수 없기 때문입니다. 그래서 위와 같이 start 토큰부터 pie에 이르기까지 본래 병렬 말뭉치에 존재하는 이전 시점의 영어 단어를 입력값으로 넣어주게 됩니다. 또한, 출력의 마지막 단어는 무조건 end 토큰이어야 합니다. </p>
<h3 id="2-2-backward-propagation">2-2. Backward Propagation</h3>
<p>역전파 과정은 기존의 언어 모델과 비슷합니다. 각 시점의 예측값과 실제값 사이의 손실함수를 계산하고, 이를 평균내어 최종 손실값으로 사용합니다. 이를 인코더 단까지 역전파하여 파라미터를 업데이트 하게 됩니다. </p>
<p>이와 같이 손실값부터 모델의 입력값까지 한번에 역전파가 일어나는 방식을 end-to-end 방식이라고 합니다. end-to-end는 우리가 원하는 태스크의 입력부터 출력까지 하나의 모델로 구성하는 것을 의미합니다. end-to-end 방식을 이용하게 되면, 인코더와 디코더가 해당 태스크에 적합하도록 학습시킬 수 있다는 장점이 있습니다. 다만, 우리가 구축할 인코더 혹은 디코더보다 기존에 사전학습된 언어 모델이 더욱 좋다면 이를 모델에 붙이고 freeze하거나 fine-tuning하여 사용할 수도 있습니다.</p>
<h2 id="3-generation">3. Generation</h2>
<p>모델 구조와 학습 방법까지 살펴봤습니다. 이제 실제로 모델이 번역하는 과정을 살펴보도록 하겠습니다. 이때, 인코더 단에서 발생하는 것은 RNN류의 모델이 hidden state를 전달하는 과정과 다를 것이 없습니다. 그래서 디코더 단에서 발생하는 일에 집중해보도록 하겠습니다. </p>
<h3 id="3-1-greedy-decoding">3-1. Greedy Decoding</h3>
<p>이전에 디코더를 설명하면서 이전 시점의 예측 단어가 현재 시점의 입력값으로 사용된다고 이야기 했습니다. 이는 아직 전체 문장의 확률분포를 알고 있지 않음에도 이전 시점에 가장 확률이 높은 단어가 최적의 선택지라고 가정하고 다음 단어를 예측하는 과정입니다. 탐욕 알고리즘이 디코더에 적용된 것이라고 볼 수 있을 것 같습니다. 그래서 이를 greedy decoding이라고 부릅니다. </p>
<blockquote>
<p>I&#39;d like to see the world on the giant&#39;s shoulder
난 <strong>_
난 거인의 _</strong>
난 거인의 어깨 <strong>_
난 거인의 어깨 위에 있는 _</strong>
난 거인의 어깨 위에 있는 세상이다.</p>
</blockquote>
<p>하지만 탐욕 알고리즘의 한계로 인해 greedy decoding은 문제점을 가지고 있습니다. 이전에 예측한 단어가 틀렸을 경우 이후의 예측은 전혀 엉뚱한 결과물을 내게 됩니다. 위의 문장은 &quot;난 거인의 어깨 위에서 세상을 보고 싶다&quot;라고 번역되어야 합니다. 하지만 &quot;어깨 위에서&quot; 대신에 &quot;어깨 위에 있는&quot;이라고 단어를 예측하여 이후 문장이 어색하게 되었습니다. </p>
<p>특히 문장 생성은 이전 시점의 정보만 이용해서 생성되기 때문에 한가지 문장의 경우만 생성하게 되면 의미가 이상해질 위험에 있습니다. 여러 후보 문장을 생성한 다음, 후보 문장들의 완성도를 확인하고 최적의 문장을 선택할 필요가 있습니다. </p>
<h4 id="exhaustive-search">exhaustive search</h4>
<p><img src="https://images.velog.io/images/stapers/post/922206df-4fba-45a0-91c9-b2806122caa0/image.png" alt=""></p>
<p>디코딩은 위와 같은 식으로 표현될 수 있다고 이야기했습니다. greedy decoding의 문제점을 해결하기 위해서는 정해진 시퀀스 길이 T에 대해 각 시점마다 모든 토큰 조합의 확률을 계산하고 이 중 최대값을 가지는 토큰 조합을 최종 생성 문장으로 선택해야 합니다. 하지만 이는 시간복잡도가 너무 커지게 되어 비효율적입니다. 번역 시 인간이 일부 단어 조합만 고려하여 번역한다는 것을 생각하면 더욱 그렇습니다. </p>
<h3 id="3-2-beam-search-decoding">3-2. Beam Search Decoding</h3>
<p>그래서 beam search decoding은 beam search algorighm을 이용하여 greedy decoding을 개선하면서 적절한 문장 후보를 고려하고자 고안되었습니다. 
beam search decoding은 각 시점마다 가장 그럴듯한 k개의 문장 후보를 탐색합니다. 이 떄 k를 beam size라고 합니다. 각 문장 후보(hypothesis)는 위의 디코딩 식을 이용한 스코어를 가지게 됩니다. </p>
<p><img src="https://images.velog.io/images/stapers/post/c412c8e2-4ed7-43b6-9d62-fc8f47c5ca0d/image.png" alt=""></p>
<p>t 시점까지 생성된 문장 후보 y의 스코어는 Language 모델을 이용해 계산한 조건부 확률의 로그 값입니다. 로그 값이기 때문에 그럴듯한 문장일 수록 높은 값(0에 가까운 값)을 가지게 됩니다. </p>
<h4 id="3-2-1-process">3-2-1. Process</h4>
<p>Beam Search Decoding의 과정을 설명하면 다음과 같습니다. 이때 k = 2입니다. 
<img src="https://images.velog.io/images/stapers/post/aa43bae7-8cd3-4a7f-bb6b-7a6db884490c/image.png" alt="">
우선 시작 토큰과 인코딩된 hidden state만 이용하여 첫번째 시점의 두가지 가설을 생성합니다. 그리고 이 가설의 스코어를 계산합니다.  이때 he는 -0.7, I는 -0.9로 he가 좀 더 그럴듯해 보입니다. </p>
<p><img src="https://images.velog.io/images/stapers/post/06106e78-db6c-424c-8538-1fca20e05a55/image.png" alt="">
<img src="https://images.velog.io/images/stapers/post/2174c3bd-d329-492b-9528-651f22e1bf03/image.png" alt=""> 
앞서 만든 두 가지 가설에 각각 두 개씩 토큰을 예측하고 스코어를 계산합니다. 이때는 현재 생성된 토큰의 스코어와 이전에 생성된 토큰의 스코어를 더하여 사용하게 됩니다. 그리고 총 네개의 가설 중 k개의 가설만 유지해야 하기 때문에 스코어가 높은 2개의 가설만 남깁니다. 위의 사진에서는 he hit과 I was가 -1.7과 -1.6으로 가설로 살아남았습니다. </p>
<p>위의 과정을 다시 반복해 두 가지 가설에 다시 두 개씩 토큰을 예측하고 스코어를 계산합니다. 
<img src="https://images.velog.io/images/stapers/post/df1565aa-12f9-4bd8-8605-4709022bcd8e/image.png" alt="">
<img src="https://images.velog.io/images/stapers/post/67ab4142-254b-4ea6-b41c-55d17efe7686/image.png" alt="">
<img src="https://images.velog.io/images/stapers/post/694a55eb-967e-4f97-ad66-1f02bdbb8cd2/image.png" alt="">
<img src="https://images.velog.io/images/stapers/post/ed568a9e-9cb6-4d11-bd59-c437c9b317b0/image.png" alt="">
<img src="https://images.velog.io/images/stapers/post/4ca9a896-8f5a-400d-bf69-f672c689e967/image.png" alt="">
<img src="https://images.velog.io/images/stapers/post/db55cf77-1441-4c03-85d7-a0d2b8307beb/image.png" alt="">
모든 생성이 종료되면 마지막 시점에 가장 스코어가 큰 노드의 경로를 다시 거슬러 올라가면서 문장을 생성하게 됩니다. </p>
<p>greedy encoding에선 모델이 end 토큰을 생성하면 문장 생성을 멈췄습니다. 하지만 beam search decoding에선 하나의 가설이 end 토큰을 생성하더라도 다른 가설이 계속 탐색을 이어가게 되기 때문에 문장 생성이 종료되지 않습니다. 그렇다면 어떻게 문장 생성을 멈추게 할까요? 다음과 같은 두가지 방법이 있습니다. </p>
<ul>
<li>최대 문장 길이 T를 설정하여 T만큼의 깊이만 탐색하고 문장을 선택합니다. </li>
<li>n개의 문장이 end 토큰을 생성하면 생성을 종료하고 end 토큰을 생성한 문장 중에 최종 문장을 선택합니다. </li>
</ul>
<p>하지만 이렇게 할 경우 문제가 발생합니다. end 토큰이 생성된 시점이 다르기 때문에 각 가설의 길이는 모두 다를 수 밖에 없습니다. 그리고 스코어는 계속해서 더해지기 때문에 문장의 길이가 길어질수록 스코어가 작아질 수 밖에 없습니다. 이로인해 문장의 길이가 짧은 문장이 자주 선택되는 편향이 발생하게 됩니다. 이는 문장이 그럴듯한 정도와 관계 없이 문장의 길이로 인해 발생하는 편향입니다. </p>
<p>이를 해결하는 방법은 간단합니다. 스코어를 문장의 길이로 나눠주어 nomalize하면 됩니다. 이를 이용하여 최종적인 스코어 식은 다음과 같습니다. 
<img src="https://images.velog.io/images/stapers/post/3396c4ce-9f91-4627-ad50-0ee02035427d/image.png" alt=""></p>
<h2 id="4-advantages-and-disadvantages">4. Advantages and Disadvantages</h2>
<p>NMT가 SMT에 비해 가지는 장점과 단점은 무엇일까요? 
장점은 다음과 같습니다. </p>
<ul>
<li>성능이 훨씬 좋다. : NMT는 SMT에 비해 훨씬 자연스러운 문장을 만들어 줍니다. 이는 RNN을 이용하기 때문에 문맥을 고려하고, 단어가 조금 달라진다하더라도 의미적으로 비슷한 문장이라면 비슷하게 해석할 수 있기 때문입니다. </li>
<li>관리하기 쉽다. : end-to-end 모델의 특징은 관리가 편리하다는 점입니다. 데이터를 꾸리고 모델을 학습시키면 feature engineering이나 번역을 위한 사소한 일에 투입되는 자원을 줄일 수 있습니다. </li>
</ul>
<p>단점은 다음과 같습니다. </p>
<ul>
<li>블랙박스 모델이다. : 모든 단점은 블랙박스 모델이라는 점에 기인합니다. 어떠한 원리로 이렇게 번역했는지 알 수 없기 때문에 문제가 발생해도 수정하기 쉽지 않고, 사회적 물의를 일으킬 수 있는 혐오 표현이나 욕설 등의 번역을 관리하는 것이 쉽지 않습니다. </li>
</ul>
<h2 id="4-bleubilingual-evaluation-understudy-score">4. BLEU(Bilingual Evaluation Understudy Score)</h2>
<p>번역 태스크를 평가할 수 있는 지표로는 BLEU가 있습니다. BLEU는 인간이 번역한 문장과 기계 번역의 문장이 얼마나 유사한지 평가하는 지표입니다. BLEU는 높을수록 성능이 좋습니다. BLEU는 동일한 문장에 대해 여러 사람이 번역한 문장을 이용해 평가할 수 있습니다. 이때 모델이 생성한 문장을 candidate/ca, 사람이 번역한 문장을 reference/ref라고 하겠습니다. BLEU의 계산 방식을 차례대로 살펴보도록 하겠습니다. </p>
<h3 id="4-1-n-gram-precision">4-1. n-gram precision</h3>
<p>우선 가장 간단하게는 cadidate에 등장한 단어들이 reference에도 등장했다면, candidate은 정확히 예측했다고 볼 수 있을 것입니다.
n-gram을 이용하여 candidate의 단어가 reference에 얼마나 등장했는지 측정하는 방식입니다. </p>
<p>$n-gram precision = {ref에;있는;ca의;n-gram의 수 \over ca의;n-gram의;수}$</p>
<ul>
<li>candidate : I am a boy who likes summer</li>
<li>reference 1 : I am just a boy who love sunny days</li>
<li>reference 2 : I like hot days </li>
</ul>
<p>위와 같은 candidate과 reference가 있을 때, cadidate의 단어들이 reference에서 등장했다면 이는 옳바른 번역이라고 볼 수 있을 것 입니다. unigram의 경우 summer를 제외한 모든 단어가 reference에 등장했으므로 다음과 같이 계산될 수 있습니다. 
$unigram;precision = {6 \over 7}$</p>
<p>하지만 이렇게 계산하면 다음과 같은 문제가 발생합니다. </p>
<ul>
<li>candidate : am am am am am am am</li>
<li>reference 1 : I am just a boy who love sunny days</li>
</ul>
<p>candidate은 말도 안되는 문장이지만 unigram precision은 referece에 am가 등장했으므로 1이 나와 버립니다. 이를 해결하기 위해서는 candidate과 reference에서 중복을 고려하여 계산할 필요가 있습니다. </p>
<h3 id="4-2-modified-n-gram-precision">4-2. modified n-gram precision</h3>
<p>이를 위해 이전 n-gram precision 식에서 분자를 수정해야 합니다. 이때 각 n-gram에 대해 다음과 같은 작업을 수행한다고 합니다. </p>
<p>$count_{clip} = min(n-gram이;ca에 등장한;횟수, n-gram이; ref에 ;등장한;횟수)$</p>
<p>$modified ; n-gram precision = {\sum_{ca} count_{clip} \over \sum_{ca} count}$ </p>
<p>이를 통해 uni-gram이 ca나 ref에 중복하여 등장하여도 이를 어느정도 완화할 수 있게 됩니다. ref에 자주 등장하지 않은 n-gram인데 ca에 자주 등장했다면, 이는 잘못 번역한 것이라 볼 수 있기 때문에 precision을 낮게 주어야 합니다. 위의 식은 이를 수행하고 있습니다. </p>
<p>하지만 여기서도 문제가 생깁니다. </p>
<p>ref : I don&#39;t know how to make BLEU equation.
ca1 : I don&#39;t equation how make BLEU to know.
ca2 : make BLEU equation I don&#39;t tell how to.</p>
<p>ca1과 ca2 모두 ref의 단어의 순서만 뒤바꾸어 놓았습니다. 이때 n이 얼마이냐에 따라 두 ca에 대한 평가가 달라지게 됩니다. </p>
<ul>
<li>unigram : ca1 - 1 / ca2 - ${7 \over 8}$</li>
<li>bi-gram : ca1 - ${2 \over 7}$ ca2 - ${4 \over 7}$</li>
</ul>
<p>즉, n의 크기에 따라 같은 문장이라도 점수가 판이하게 달라질 수 있습니다. 이를 고려해서 BLEU가 만들어집니다. </p>
<h3 id="4-3-bleu">4-3. BLEU</h3>
<p>$BLEU = exp(\sum_{n = 1}^{N} (w_nlogp_n))$</p>
<p>$w_n$: n-gram에 대한 가중치
$p_n$: modified n-gam precision</p>
<p>위의 식을 통해 다양한 n에 대한 n-gram precision을 종합할 수 있습니다. 하지만 여전히 문제는 있습니다. 위와 같은 경우 만약 ca의 문장이 짧다면 점수가 높게 나오는 경향이 있기 때문입니다. precision에서 분모가 ca의 count이기 때문입니다. 문장이 짧을 수록 패널티를 주는 항이 필요합니다. </p>
<h3 id="4-4-brevity-penalty">4-4. Brevity Penalty</h3>
<p>$$
BP = 
\begin{cases}
1; &amp; \text{if c $\geq$ r}\
e^{(1-r/c)} ; &amp; \text{if c $\le$ r}
\end{cases}
$$</p>
<p>c : cadidate의 길이 
r : cadidate과 길이가 가장 비슷한 reference의 길이 </p>
<p>$BLEU = BP \times exp(\sum_{n = 1}^{N} (w_nlogp_n))$
ca가 ref보다 길이가 길다면 정상적으로 번역된 길이일 수도 있기 때문에 패널티를 주지 않습니다. 하지만 ca가 길이가 비슷한 ref보다 짧다면 번역이 미완성된 상태일 수 있기 때문에 패널티를 주어 BLEU 점수를 낮춥니다. </p>
<h3 id="4-5-advantages--disadvantages">4-5. Advantages &amp; Disadvantages</h3>
<p>BLEU는 계산 속도도 빠르고 비교적 성능을 잘 대표하는 지표로 사용되고 있습니다. 특히 BLEU는 병렬 데이터를 정렬하는데 사용될 수 있어 활용성이 높습니다. 
하지만 실제 번역은 동일한 단어를 사용하지 않아도 좋은 번역이 될 수 있습니다. 병렬 코퍼스의 경우 번역의 표준화 등을 이유로 직역을 기본으로 합니다. 하지만 초월번역 등 우수한 번역의 경우 단순히 단어 단위로 번역하기 보다 그 맥락을 파악하여 전혀 엉뚱한 단어가 등장할 수도 있습니다. BLEU는 이러한 경우 그 성능을 제대로 측정할 수 없다는 단점을 가지고 있습니다. </p>
<h2 id="5-conclusion">5. Conclusion</h2>
<p><img src="https://images.velog.io/images/stapers/post/dc272747-e1e5-4f59-81f5-9da38e5ba091/image.png" alt=""></p>
<p>RNN을 이용한 NMT는 기계 번역 분야에서 엄청난 발전을 이뤄냈습니다. SMT가 수많은 feature engineering이 필요하여 장시간 축적된 기술임에도 NMT가 등장한지 2년 만에 SMT의 성능을 넘어섰습니다. </p>
<p>그럼에도 불구하고 NMT는 여전히 문제점이 많았습니다. </p>
<ul>
<li><p>Out of Vocabulary : 만약 학습 데이터에 존재하지 않는 단어가 입력될 경우 이를 적절히 처리하지 못했습니다. </p>
</li>
<li><p>Domain mismatch : 학습 데이터가 위키피디아, 논문, 신문 기사 등 문어체가 주를 이룰 경우 문어체 번역에 애를 먹었습니다. </p>
</li>
<li><p>Context : NMT는 맥락을 저장하고 이를 활용하는데 애를 먹습니다. 기사 전문이나 책을 번역하려고 한다면 정말 긴 시간의 정보가 문장 단위를 넘어서 전달되어야 하지만 그렇지 못했습니다. </p>
</li>
<li><p>Low Resource Language pairs : NMT 학습을 위해선 방대한 병렬 코퍼스가 필요하지만 이를 구축하는 것은 쉬운 일이 아닙니다. </p>
</li>
<li><p>Common Sense is not trained well 
<img src="https://images.velog.io/images/stapers/post/1274fd31-d441-4c55-a805-dd280f0d5c44/image.png" alt="">
프린터가 종이를 먹다 라는 표현은 프린터가 종이에 막혔을 경우에 사용되지만, 이러한 관용적인 표현은 문장에 드러나 있지 않습니다. 사회적 관습이나 활용을 학습해야 하지만 NMT는 이러한 학습이 쉽지 않습니다. </p>
</li>
<li><p>Social bias
<img src="https://images.velog.io/images/stapers/post/881ad1ed-c819-4402-950e-ff4770a64e4e/image.png" alt="">
인터넷 상에 존재하는 수많은 문서에는 암묵적인 사회적 편향이 담겨 있습니다. 이는 그대로 NMT에도 학습되게 됩니다. 프로그래머는 주로 남자이고, 간호사는 주로 여자이기 때문에, 이를 학습한 NMT는 성별 중립적인 표현을 입력하여도 자연스레 성별이 편향된 표현으로 번역하게 됩니다. </p>
</li>
</ul>
<p>하지만 NMT는 상당히 어려운 작업이며 NMT를 구축하는 과정에서 새로운 모델이 많이 탄생하게 됩니다. 이제 배울 Attention 역시 이 과정에서 탄생했습니다. </p>
<h1 id="attention">Attention</h1>
<p><img src="https://images.velog.io/images/stapers/post/f5ae69bd-baa0-4311-83e5-53a2d7fdecde/image.png" alt="">
seq2seq의 구조는 위와 같다고 했습니다. 인코더의 마지막 hidden state는 번역하고자 하는 문장의 인코딩입니다. 이는 번역하고자 하는 문장의 정보가 인코더의 마지막 hidden state에 담겨있다고 했습니다. 
하지만 정말 그렇게 될까요? 만약 인코더의 길이가 50이 된다고 해봅시다. 그렇다면 초기 시점의 정보가 마지막 시점까지 잘 전달되지 못할 것입니다. 이는 초기 시점의 단어들을 번역하는데 어려움을 겪게 합니다. 이를 타게할 방안은 무엇일까요?</p>
<p><img src="https://images.velog.io/images/stapers/post/b1528033-5ee7-41bc-b53b-27b5c5a3ec69/image.png" alt=""></p>
<p>SMT에서 alignment가 각 단어간 대응관계를 표현한다고 했습니다. 그리고 SMT는 이 대응 관계를 이용해 번역합니다. 이를 NMT에 활용할 수 없을까요? 그래서 attention 번역된 문장을 생성할 때, 각 문장과 대응되는 원래 단어를 찾아서 활용하는 방안을 고안했습니다.</p>
<h2 id="1-model-architecture-1">1. Model Architecture</h2>
<p>attention 알고리즘은 다음과 같은 순서로 진행됩니다. 
<img src="https://images.velog.io/images/stapers/post/8ec252dd-d3d3-453d-ac31-1d7386cffb14/image.png" alt=""></p>
<p>우선 디코더의 hidden state와 인코더의 hidden state를 내적하여 attention score라는 것을 구합니다. 내적은 두 벡터 간 유사도를 구할 때 사용됩니다. 즉, attention score는 현재 시점의 디코더의 정보와 인코더의 매 시점의 정보의 유사도를 의미하고 있습니다. </p>
<p><img src="https://images.velog.io/images/stapers/post/e86fa6fa-4551-4b10-9826-9cd341e7c44f/image.png" alt=""></p>
<p>attention score는 인코더의 매 시점마다 계산되게 됩니다. </p>
<p><img src="https://images.velog.io/images/stapers/post/aea63088-0d39-41bc-a26a-e7e6a8e34401/image.png" alt=""></p>
<p>이렇게 구한 attention score를 softmax 함수에 통과시켜 확률 분포를 생성합니다. 이 시점에선 il이라는 단어에 가장 집중하고 있는 것을 볼 수 있습니다. 문장의 시작에선 il이라는 단어가 가장 유사한 정보를 가지고 있는 것입니다. </p>
<p><img src="https://images.velog.io/images/stapers/post/0f3c433b-061d-4990-9dd7-21a8da65c3fb/image.png" alt=""></p>
<p>위에서 구한 확률 분포를 가중치로 하여 인코더 각 시점의 hidden state를 가중합해줍니다. 이를 attention output이라고 합니다. 이는 SMT의 aligment와 유사하면서 보다 유연한 사용이 될 수 있습니다. SMT의 aligment는 대응관계를 이진 분류로 표현하기 때문에 완전히 대응되거나, 완전히 고려할 필요가 없다고 여기지만, attention score는 디코더의 정보에 활용될만한 정도를 고려하여 인코더의 정보를 취합했기 때문입니다. </p>
<p><img src="https://images.velog.io/images/stapers/post/c88e46c0-af7e-4af2-953a-dd559b22fbd8/image.png" alt=""></p>
<p>attention output은 디코더의 hidden state와 concat되어 예측값을 산출할 때 사용됩니다. 이때 DNN, softmax 등의 구조를 사용하게 됩니다. </p>
<p><img src="https://images.velog.io/images/stapers/post/471c5313-f7cf-43e4-9576-74a4cd46c9c5/image.png" alt=""></p>
<p>위의 attention 과정은 디코더의 매 시점마다 반복되어 실행됩니다.</p>
<h2 id="2-equation">2. Equation</h2>
<ul>
<li>encoder hidden state
<img src="https://images.velog.io/images/stapers/post/7d82fd2b-ac92-4b50-9f34-d64c66ba50ba/image.png" alt=""></li>
<li>t 시점의 decoder hidden state
<img src="https://images.velog.io/images/stapers/post/b8ad53f4-3023-4067-a730-54c4789bf1d2/image.png" alt=""></li>
<li>attention score
<img src="https://images.velog.io/images/stapers/post/0ea2b5fc-e250-40ba-b2f8-ca98924a118c/image.png" alt=""></li>
<li>attention dist.
<img src="https://images.velog.io/images/stapers/post/e3927791-f9a4-4d68-a5e0-bfeb7a28811f/image.png" alt=""></li>
<li>attention output
<img src="https://images.velog.io/images/stapers/post/735573bd-2973-4729-a8f4-ffad551a9149/image.png" alt=""></li>
<li>t 시점의 예측을 위해 사용되는 벡터
<img src="https://images.velog.io/images/stapers/post/5dc4de40-266a-4b63-8f43-dcbd8498a71f/image.png" alt=""></li>
</ul>
<h2 id="3-advantages">3. Advantages</h2>
<ul>
<li>NMT 성능을 비약적으로 향상시켰습니다. </li>
<li>병목현상을 해결했습니다. seq2seq에선 인코더의 정보가 마지막 hidden state에 집중되어 제대로 전달되지 못하는 병목현상이 발생했지만, attention은 디코더가 직접 인코더의 모든 시점에서 정보를 가져오게 함으로써 이를 해결했습니다. </li>
<li>vanishing gradient problem을 완화했습니다. attention은 디코더와 인코더를 직접 연결한 구조입니다. 이는 그래디언트가 인코더의 마지막 시점과 디코더의 첫 시점의 연결 뿐 아니라 인코더와 디코더의 각 시점으로 직접 흘러가도록 만들어 vanishing gradient problem을 완화했습니다. </li>
<li>모델을 어느정도 해설할 수 있게 만들어줍니다. attention score를 분석하면 모델이 각 시점마다 어디에 집중하고 있는지 알 수 있습니다. 
<img src="https://images.velog.io/images/stapers/post/969b8d49-17b7-40a0-b5d8-a0c1f57e32da/image.png" alt=""></li>
</ul>
<p><img src="https://images.velog.io/images/stapers/post/efc0fdf2-ad9e-4051-9e9e-e59d8dc52a4f/image.png" alt=""></p>
<p>위 사진은 seq2seq with attention에서 attention score를 시각화 한것입니다. 아래 사진은 본래 alignment입니다. 두 도표는 매우 유사한 것을 볼 수 있습니다. SMT의 alignment는 직접 사람이 작성해야 하는 수고가 발생하는 것에 비해 attention은 모델이 직접 구축하고, 보다 유연한 형태라는 점에서 더 우수하다고 할 수 있습니다. </p>
<h2 id="4-generalization">4. Generalization</h2>
<p>attention은 단순히 seq2seq에만 사용되지 않고, 많은 모델에서 사용됩니다. 그래서 좀 더 확장된 버전의 attention 정의가 필요합니다. 원문을 가져오자면 </p>
<blockquote>
<p>Given a set of vector values, and a vector query, attention is a technique to compute a weighted sum of the values,dependent on the query.</p>
</blockquote>
<p>즉, 벡터인 value들의 집합과 하나의 벡터인 query가 있을 때, attention은 query를 이용해 value들의 가중합을 구하는 방법론입니다. </p>
<p>그리고 종종 논문 등에서 query attends to the values 와 같은 표현을 볼 수 있는데, 이것이 바로 attention 메커니즘을 설명하고 있는 것입니다. </p>
<p>이렇게 확장할 경우 attention을 다음과 같이 해석할 수 있습니다. </p>
<ul>
<li>attention output은 query가 집중하고자 하는 value의 요약된 정보입니다. </li>
<li>attention은 고정된 벡터 사이즈를 통해 query가 value들의 정보에 접근하는 방식입니다. </li>
</ul>
<hr>
<p><img src="https://images.velog.io/images/stapers/post/e4e5ad26-f678-4d69-ada6-778139a08217/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/stapers/post/f2b4d145-1132-4f62-8d3b-423ca25333a9/image.png" alt=""></p>
<hr>
<h4 id="참고">참고</h4>
<p><a href="https://blog.naver.com/PostView.nhn?blogId=sooftware&amp;logNo=221809101199&amp;from=search&amp;redirect=Log&amp;widgetTypeCall=true&amp;directAccess=false">https://blog.naver.com/PostView.nhn?blogId=sooftware&amp;logNo=221809101199&amp;from=search&amp;redirect=Log&amp;widgetTypeCall=true&amp;directAccess=false</a>
<a href="https://wikidocs.net/31695">https://wikidocs.net/31695</a>
<a href="https://en.wikipedia.org/wiki/BLEU">https://en.wikipedia.org/wiki/BLEU</a>
<a href="https://tech.kakaoenterprise.com/50">https://tech.kakaoenterprise.com/50</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Lecture 7 – Vanishing Gradients, Fancy RNNs]]></title>
            <link>https://velog.io/@tobigs-text1415/Lecture-7-Vanishing-Gradients-Fancy-RNNs</link>
            <guid>https://velog.io/@tobigs-text1415/Lecture-7-Vanishing-Gradients-Fancy-RNNs</guid>
            <pubDate>Wed, 12 May 2021 06:13:02 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 건국대학교 응용통계학과 강재영</p>
<h1 id="1-vanishing-gradient">1. Vanishing Gradient</h1>
<h4 id="backpropagation-for-rnns">Backpropagation for RNNs</h4>
<p><img src="https://images.velog.io/images/jaeyoung-kang/post/aa3b0fb1-4dbc-4907-8451-c621ebe92479/image.png" alt=""></p>
<p>이전에 저희는 기존의 Backpropagation과 조금 다른 RNN의 <strong>BPTT(Backpropagation through time)</strong>에 대해 배웠습니다. 
이처럼 순환하는 과정을 펼친 후에 편미분을 취해서 에러를 구하게 됩니다. 이 때 실제로는 하나의 Edge를 편의상 펼친 것이므로 모두 같은 가중치를 가져야 한다는 것을 잊으면 안됩니다. 
따라서 모든 update가 동일하게 이루어져야 하고 이를 위해 각 레이어마다 동일한 위치의 weight에 해당하는 모든 error 미분값을 다 더한 다음, 그 값을 backpropagation하여 weight를 한 번 업데이는 하는 방법이 <strong>BPTT</strong>입니다.<img src="https://images.velog.io/images/jaeyoung-kang/post/5546b67e-ab9a-4bfb-a4ee-a0c5bf8a2ea0/image.png" alt="">
(동일한 위치의 Weight에 해당하는 모든 미분값을 더한다는 의미를 처음에 이해하지 못해서 제가 이해한 그림을 추가로 넣어드립니다. 이해가 안가시는 분 참고하면 좋을듯해요.)</p>
<blockquote>
<p>그림출처 : <a href="https://m.blog.naver.com/infoefficien/221210061511">https://m.blog.naver.com/infoefficien/221210061511</a></p>
</blockquote>
<h2 id="1-vanishing-gradient-intuition">1. Vanishing Gradient intuition</h2>
<p><img src="https://images.velog.io/images/jaeyoung-kang/post/5b69dfc1-794b-480e-b2ae-a0d8f0bdbc52/image.png" alt="">
위 그림은 RNN의 t시점의 히든스테이트와 t시점의 히든스테이트를 이전 히든스테이트로 편미분한 결과입니다. 위 식을 토대로 아래와 같이 그래디언트를 일반화할 수 있습니다.
<img src="https://images.velog.io/images/jaeyoung-kang/post/c6ce0446-226b-4d23-ac37-ea9aa07ba75e/image.png" alt="">
이 때 보라색으로 상자가 그려진 부분이 가중치행렬 W_h를 의미하며 가중치 행렬이 작아지면 항 전체가 작아지게 됩니다. 가중치 행렬이 작아지는 때를 고려해보면, i와 j의 차이가 클수록 작아진다는 것을 확인할 수 있습니다. 
( Sequence 간의 거리가 멀수록 ) 이를 좀더 수식으로 확인해보면,
<img src="https://images.velog.io/images/jaeyoung-kang/post/548b2312-470a-405a-b4fb-630be3def0e7/image.png" alt=""></p>
<blockquote>
<p><img src="https://images.velog.io/images/jaeyoung-kang/post/7ed4c186-2ed9-4d9f-96cb-9a21425bcd46/image.png" alt="">
(증명 :<a href="https://imgur.com/zcuKkv2">https://imgur.com/zcuKkv2</a>)</p>
</blockquote>
<p>Norm의 성질에 의해서 W_h 의 L2 norm은 W_h의 가장 큰 고유값(eigenvalue)이라는 것을 확인할 수 있습니다. </p>
<p>저희는 <strong>RNN 역전파시 체인룰에 의해 Hidden state의 Gradient를 지속적으로 곱</strong>해주어야 합니다. 
그런데 위 수식을 보면 Hidden state의 Gradient의 L2 norm은 절대적으로 W_h의 L2 norm 크기에 달려 있습니다. 
(L2 norm을 &#39;크기&#39;라고 바꿔서 보면 이해가 더 쉽습니다.)
따라서, 가장 큰 고유값(L2 norm)이 1보다 작다면, Gradient가 기하급수적으로 감소하게 되고(Gradient Vanishing), 가장 큰 고유값(L2 norm)이 1보다 크다면, Gradient가 폭발적으로 증가하게 됩니다.(Gradient exploding)</p>
<h2 id="2-why-is-vanishing-gradient-a-problem">2. Why is vanishing gradient a problem?</h2>
<p>그렇다면 Gradient Vanishing이 발생하는 이유는 이해했는데, 그게 왜 문제라는걸까요?</p>
<ul>
<li>1) 모델이 가까운 Gradient의 효과만 반영하고 멀리서 온 Gradient는 무시하게 되는 현상이 나타납니다.
즉, Near-effects만 반영되고, Long-term effects는 무시하게 되는거죠
<img src="https://images.velog.io/images/jaeyoung-kang/post/8534db19-e950-4336-aac0-402ae0faeba9/image.png" alt=""></li>
<li>2) 그리고 Gradient는 미래에 과거가 얼마나 영향을 미치는지에 대한 척도인데 Gradient가 소실되버리면, 결과를 해석할 때  &quot;Step_t 와 Step_t+n 사이에 의존성이 없어서 Gradient가 0이 된건지&quot; / &quot;Parameter를 잘못구해서 Gradient가 0이 된건지&quot; 구분할 수가 없게 됩니다.</li>
</ul>
<h2 id="3-effect-of-vanishing-gradient-on-rnn-lm">3. Effect of vanishing gradient on RNN-LM</h2>
<p>Vanishing Gradient가 실제 Language Model에서 발생시키는 문제들을 확인해보겠습니다.
<img src="https://images.velog.io/images/jaeyoung-kang/post/680e9b91-8e46-4578-9b47-d8d9d18ad012/image.png" alt=""></p>
<ul>
<li>빈칸에 들어가야할 단어는 첫 줄에 나왔던 tickets 입니다. 하지만 첫줄에 나온 tickets과 빈칸 사이에는 많은 Sequence들이 존재하기 때문에 Gradient가 소실될 가능성이 큽니다. 그렇게 되면 LM Model은 멀리 있는 단어 간의 의존성을 학습하지 못하기 때문에 ticket 예측에 실패하게 됩니다.</li>
</ul>
<p>또 다른 예시를 확인해보겠습니다.
<img src="https://images.velog.io/images/jaeyoung-kang/post/b9c896d5-3c4a-40ba-95ce-898bf698aaeb/image.png" alt=""></p>
<ul>
<li>문법적으로 is가 옳은 정답이지만, 가까이있는 Gradient의 영향력이 더욱 크게 반영되는(Near effect, Not Long-term effect) 현상이 나타나면서 are로 예측을 하게 되는 예시입니다.</li>
</ul>
<blockquote>
<ul>
<li>Gradient Cliping
이전에 Gradient Vanishing 외에 Gradient가 기하급수적으로 커지는 Gradient exploding이 있었는데, 이를 해결하기 위한 방법으로 Gradient Cliping이 있습니다.
<img src="https://images.velog.io/images/jaeyoung-kang/post/cb335d1c-f6d7-4aa0-92cc-471b1b18f369/image.png" alt="">
만약에 Gradient의 Norm 값이 임계값보다 크다면, Scale down을 적용하는 간단한 알고리즘입니다.</li>
</ul>
</blockquote>
<h1 id="lstmlong-short-term-memory">LSTM(Long Short-Term Memory)</h1>
<p>Gradient Exploding을 Cliping으로 해결할 수 있었는데 Vanishing은 어떻게 해결할 수 있을까요?
<strong>LSTM의 Main idea</strong>
&quot; Gradient가 레이어를 지날수록 0에 가까워지는게 문제라면, 정보를 Save하는 메모리를 따로둬서 Gradient를 살릴 수 있지 않을까? &quot; </p>
<p><img src="https://images.velog.io/images/jaeyoung-kang/post/dac71ee4-2011-4204-bbb6-a31b346cbceb/image.png" alt=""></p>
<ul>
<li>LSTM에는 RNN과 다르게 이전 정보를 지속해서 흘려주는** Cell State<strong>와 불필요한 정보를 걸러주는 **Gate</strong>가 존재</li>
</ul>
<h3 id="lstm-과정">LSTM 과정</h3>
<h4 id="1-forget-gate-layer">1) Forget gate layer</h4>
<p><strong>Forget gate</strong> : 어떤 정보를 잊고 어떤 정보를 Cell State에 흘려넣을지 결정하는 Gate</p>
<ul>
<li>t번째 시점에서의 x값과 t-1시점에서의 hidden state를 입력값으로 받아 sigmoid activation function을 통해 0에서 1사이의 값을 출력하여, 0에 가까울수록 완전히 잊고, 1에 가까울수록 많이 흘려넣게 된다.
<img src="https://images.velog.io/images/jaeyoung-kang/post/87e0789d-b5ef-46e4-82f7-49ddc64a318e/image.png" alt=""><h4 id="2-input-gate-layer">2) input gate layer</h4>
</li>
</ul>
<p><strong>input gate</strong>: 새로운 정보가 Cell State에 저장될지를 결정하는 Gate</p>
<ul>
<li>C_t-1에 새로운 input x_t와 h_t-1를 보고 새로운 정보를 생성합니다.</li>
<li>여기서 i_t는 Gate로 0 ~ 1 값을 내며, 1에 가까울수록 새롭게 만들어진 정보를 완전히 반영하고, 0에 가까울수록 잊습니다.
<img src="https://images.velog.io/images/jaeyoung-kang/post/c706c7de-a681-4459-8f3a-1335fc5d8460/image.png" alt=""><h4 id="3-update-cell-state">3) Update Cell State</h4>
Cell State를 업데이트 하는 과정을 살펴보면, </li>
<li><strong>과거의 정보를 반영할지의 유무는 Forget Gate</strong> </li>
<li><strong>새롭게 발생한 현재의 정보를 반영할지의 유무는 input Gate를 통해 결정</strong></li>
</ul>
<p><strong>이 두 값이 더해져서 다음 cell state의 입력값으로 들어가게 된다.(Update)</strong>
<img src="https://images.velog.io/images/jaeyoung-kang/post/6a2e2dc5-4886-421b-92d2-c28e83e283b5/image.png" alt=""></p>
<h4 id="4-ouput-gate-layer">4) Ouput gate layer</h4>
<p><strong>Output gate</strong>
마지막으로, 최종적으로 Cell State 정보를 tanh를 통해 가공하고, 이를 다음 hidden State 얼마나 반영할지에 대해 Output gate를 통해 결정하게 됩니다.
<strong>최종 아웃풋은 Ot * tanh(Ct)</strong>
<img src="https://images.velog.io/images/jaeyoung-kang/post/2410f43b-1d1a-4c75-ad2b-2c365fe0eed6/image.png" alt=""></p>
<h2 id="how-does-lstm-solve-vanishing-gradients">How does LSTM solve vanishing gradients?</h2>
<p><img src="https://images.velog.io/images/jaeyoung-kang/post/6876a570-5a46-4262-92a0-ebca32c7fcd5/image.png" alt="">
수식을 살펴보면, forget gate가 1이고, input gate가 0 일때 Cell의 정보가 완전하게 보존되서 장기의존성 문제를 해결할 수 있게됨을 확인할 수 있다. 하지만 여전히 Gradient Vanishing의 완전한 해결을 보장하지는 않는다.</p>
<h1 id="grugated-recurrent-units">GRU(Gated Recurrent Units)</h1>
<p><strong>GRU의 Main idea</strong> 
&quot; LSTM은 좋긴 좋은데 구조가 복잡하기 때문에 조금 더 단순화할수 없을까? &quot;
<img src="https://images.velog.io/images/jaeyoung-kang/post/9a74891d-783e-4b16-968d-13d372a193de/image.png" alt="">
<strong>GRU는 LSTM의 변형으로,</strong></p>
<ul>
<li>GRU는 Reset Gate(rt)와 Update Gate(zt) 2개의 게이트로 이루어져있다.</li>
<li>LSTM에서 forget gate와 input gate를 GRU에서는 update gate(zt)로 합쳐 주었다.</li>
<li>LSTM에서 forget gate역할이 rt와 zt 둘 다에 나눠졌다고 볼 수 있다.</li>
<li>출력값(ht)를 계산할 때 추가적인 비선형(nonlinearity) 함수를 적용하지 않는다.</li>
</ul>
<p>다음과 같은 특징들이 있다.</p>
<h3 id="gru-과정">GRU 과정</h3>
<p><img src="https://images.velog.io/images/jaeyoung-kang/post/0f139603-118e-4b70-b046-dd4dd829f67b/image.png" alt=""></p>
<ul>
<li>여기서 Gate는 Reset gate와 Update gate 두가지가 존재하며, 다음과 같은 역할을 한다.</li>
<li><strong>Reset gate</strong> : 이전 정보를 어느정도 반영할지 결정</li>
<li><strong>Update gate</strong> : 과거와 현재의 정보 반영 비중을 결정</li>
</ul>
<h2 id="lstm-vs-gru">LSTM VS GRU</h2>
<ul>
<li>둘 모두 장기기억에 좋다</li>
<li>현재는 다른모델도 많지만 당시에는 종종 SOTA</li>
<li>GRU는 파라미터가 보다 적기 때문에 빨라서 학습하기 좋고, LSTM은 그냥 기본적으로 선택하기 좋다.</li>
<li>Rule of thumb에 따라서 LSTM으로 시작해본 후 efficient함을 원하면 GRU를 시도해보길 권한다.</li>
</ul>
<h1 id="is-vanishingexploding-gradient-just-a-rnn-problem">Is vanishing/exploding gradient just a RNN problem?</h1>
<p>Vanishing gradient 문제가 RNN만의 문제는 아니다. 다른모델에서 어떻게 이를 극복하려 했는지 확인해보자</p>
<ul>
<li><p>1) Residual connections &quot;ResNet&quot;의 Skip connection
<img src="https://images.velog.io/images/jaeyoung-kang/post/343d6cd3-f599-485c-a443-ed72946328dc/image.png" alt="">
Convolutional Layer를 지나고 나온 결과에 input x를 다시 더해줘서 기존 정보 + 새로운 학습정보를 모두 고려할 수 있도록 했다.</p>
</li>
<li><p>2) Dense connections &quot;DenseNet&quot;의 Dense connectivity
<img src="https://images.velog.io/images/jaeyoung-kang/post/4927bed6-e0aa-403b-b7a8-e70159d299f9/image.png" alt="">
<img src="https://images.velog.io/images/jaeyoung-kang/post/bddc7aaf-5883-4a2a-96d8-361ce97e9210/image.png" alt="">
위 기존 모델들과 비교한 그림을 보면 이해가 더 쉬운데, ResNet이 이전 레이어의 정보만 다시 더해준다면, Dense connectivity는 이전 모든 레이어 정보를 쌓는다고 생각하면 된다.</p>
</li>
</ul>
<h1 id="more-fancy-rnn-variants">More fancy RNN variants</h1>
<h2 id="bidirectional-rnns">Bidirectional RNNs</h2>
<p><img src="https://images.velog.io/images/jaeyoung-kang/post/7ab5e00e-bea6-4578-bde1-2fa2f09af6e0/image.png" alt=""></p>
<h3 id="bidirectional-rnns--양-방향-정보를-모두-이용하기-위한-rnn-구조"><strong>Bidirectional RNNs : 양 방향 정보를 모두 이용하기 위한 RNN 구조</strong></h3>
<p><img src="https://images.velog.io/images/jaeyoung-kang/post/6a32aa1b-1769-4fa5-9b03-3ca8b7bca9ee/image.png" alt=""></p>
<ul>
<li><strong>Bidirectional RNNS 과정</strong>
1) forward RNN : 정방향으로 입력받아 hidden state 생성 
2) backward RNN: 역방향으로 입력받아 hidden state 생성 
3) 두 개의 hidden state 연결(Concat)해서 전체 모델의 hidden state로 사용</li>
</ul>
<p><strong>추가그림 및 수식</strong>
<img src="https://images.velog.io/images/jaeyoung-kang/post/f542fc66-56a6-48a0-8f24-ac810b810c4c/image.png" alt=""></p>
<h2 id="multi-layer-rnns">Multi-layer RNNS</h2>
<p><img src="https://images.velog.io/images/jaeyoung-kang/post/5886e5af-0f5b-4929-8fb4-1f027231378b/image.png" alt=""></p>
<p><strong>Multi-layer RNN</strong> : RNN을 여러층으로 사용한 모델</p>
<ul>
<li>여러 개의 층으로 구성된 Multi-layer RNN은 더 복잡한 특성을 학습할 수 있도록 만들어준 모델이다. 조금 더 고차원의 패턴, 복잡한 표현을 잡아낼 수 있다. </li>
<li>일반적으로 2~4개 정도의 layer을 쌓아서 사용한다. 그 이상 쌓으면 Gradient vanishing 을 해결하기 위한 Skip connection과 같은 테크닉이 필요하다.</li>
</ul>
<h2 id="qa">Q&amp;A</h2>
<p><strong>Q1. LSTM에서 왜 forget gate에서 previous cell state가 아니라 previous hidden state와 input에 대해서만 고려하여 계산되는지?</strong></p>
<ul>
<li>저도 많이 찾아보고 강의를 들어봤는데, 추가적인 자료는 찾지 못했고 강의에서는  Previous hidden State가 Previous Cell State에 대한 정보를 내포하고 있다고 대답했습니다. 
따라서 굳이 추가적으로 Previous Cell State를 고려할 필요가 없었을 것 같습니다.</li>
</ul>
<p><strong>Q2. HighwayNet에 대한 설명이 부족한거같아요.</strong></p>
<h4 id="highwaynet">HighwayNet</h4>
<p><img src="https://images.velog.io/images/jaeyoung-kang/post/0e878f07-0c67-4f3d-949b-753682b3354b/image.png" alt=""><img src="https://images.velog.io/images/jaeyoung-kang/post/eebf3270-9c1b-487a-8ad8-276ebfc9e24a/image.png" alt=""><img src="https://images.velog.io/images/jaeyoung-kang/post/9b723dc0-d6f6-491e-925b-d4d4834be8d4/image.png" alt=""></p>
<ul>
<li>H : Plain Layer 를 의미</li>
<li>Transform gate(T): Plain Layer의 결과를 어느정도 반영할지 결정</li>
<li>Carry gate(C): input 정보를 어느정도 반영할지 결정(논문에서 C = 1-T로 정의되었다.)</li>
</ul>
<p>HighwayNet은 이처럼 Layer 결과값과 input x 값의 반영비를 조절하면서 학습하여 ResNet처럼 기존정보(input) + 새로운 학습정보(H)를 모두 고려할 수 있도록 하였다.</p>
<ul>
<li>다른 질문들은 위에서 반영되도록 하였습니다.</li>
</ul>
<blockquote>
<p>Reference
Stanford CS224n Lecture 7 강의 &amp; 강의자료
13-14기 정규세션 13기 이예지님 모델심화2 강의자료
<a href="https://excelsior-cjh.tistory.com/89">https://excelsior-cjh.tistory.com/89</a>
<a href="https://ratsgo.github.io/deep%20learning/2017/10/10/RNNsty/">https://ratsgo.github.io/deep%20learning/2017/10/10/RNNsty/</a>
<a href="https://jeongukjae.github.io/posts/cs224n-lecture-7-vanishing-gradients-fancy-rnns/">https://jeongukjae.github.io/posts/cs224n-lecture-7-vanishing-gradients-fancy-rnns/</a>
<a href="https://yjjo.tistory.com/18?category=881892">https://yjjo.tistory.com/18?category=881892</a>
<a href="https://velog.io/@tobigs-text1314/CS224n-Lecture-7-Vanishing-Gradients-And-Fancy-RNNs#multi-layer-rnns">https://velog.io/@tobigs-text1314/CS224n-Lecture-7-Vanishing-Gradients-And-Fancy-RNNs#multi-layer-rnns</a> 투빅스 13-14기 텍스트 세미나 자료
<a href="https://jayhey.github.io/deep%20learning/2017/10/13/DenseNet_1/">https://jayhey.github.io/deep%20learning/2017/10/13/DenseNet_1/</a>
<a href="https://lazyer.tistory.com/8">https://lazyer.tistory.com/8</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Lecture 6 - Natural Language Processing with Deep Learning]]></title>
            <link>https://velog.io/@tobigs-text1415/Natural-Language-Processing-with-Deep-Learning</link>
            <guid>https://velog.io/@tobigs-text1415/Natural-Language-Processing-with-Deep-Learning</guid>
            <pubDate>Wed, 05 May 2021 10:01:31 GMT</pubDate>
            <description><![CDATA[<h3 id="발표자--tobigs-13기-이혜민">발표자 : Tobig&#39;s 13기 이혜민</h3>
<p><img src="https://images.velog.io/images/hm1lee/post/900ebb6f-0545-425b-a789-97eeb7d67ed5/image.png" alt=""></p>
<blockquote>
<h2 id="contents">Contents</h2>
</blockquote>
<h3 id="1language-modeling">1.Language Modeling</h3>
<h3 id="2n-gram-language-model">2.N-gram Language Model</h3>
<h3 id="3neural-language-model">3.Neural Language Model</h3>
<h3 id="4rnn-language-model">4.RNN Language Model</h3>
<h3 id="5perplexity">5.Perplexity</h3>
<hr>
<h1 id="1-language-modeling">1. Language Modeling</h1>
<p>많은 사람들이 자동완성 기능, 인터넷 검색과 같은 <strong>Language Model</strong>을 일상생활에서 사용합니다.</p>
<p><img src="https://images.velog.io/images/hm1lee/post/a6d199a2-f1c5-43a5-b60b-2923b3387f7e/image.png" alt=""></p>
<ul>
<li><strong>Language Modeling</strong> : 현재까지 주어진 문장의 다음 단어를 예측하는 것</li>
<li><strong>Language Model</strong> :  주어진 문장의 다음 단어를 예측하는 것을 수행하는 모델</li>
</ul>
<p><img src="https://images.velog.io/images/hm1lee/post/be8d21a8-df0a-4e6f-bd24-63ce8be9676c/image.png" alt=""></p>
<ul>
<li>문장에 이미 주어진 단어 x<sup>(1)</sup>부터 x<sup>(t)</sup>가 주어졌을 때, 다음에 올 단어 x<sup>(t+1)</sup>의 확률을 나타낼 수 있습니다. =&gt; 특정 문장에 확률 할당 가능</li>
</ul>
<ul>
<li>특정 문장의 확률(좌변)을 식의 우변과 같이 연속된 조건부확률로 풀어 쓴 이후에, LM을 통해서 알아낼 수 있는 값들(두번째 줄)을 통해서 확률을 계산할 수 있습니다.</li>
</ul>
<hr>
<h1 id="2-n-gram-language-model">2. N-gram Language Model</h1>
<h3 id="1-definition">(1) Definition</h3>
<p>Q : How to learn a Language Model? 
A : <strong>(pre-deep learning)</strong> Learn n-gream Language Model</p>
<blockquote>
<p><strong>n-gram : a chunck n consecutive words (연이은 단어들의 덩어리)</strong>
n-gram 모델은 카운트에 기반한 통계적 접근을 사용하고 있기 때문에 SLM의 일종입니다. 하지만 <strong>이전에 등장한 모든 단어를 고려하는 것</strong>이 아니라, <strong>일부 단어만 고려하는 접근 방법을 사용</strong>합니다.
<strong>&#39;일부 단어를 몇 개 보느냐&#39;</strong>를 결정하는 것이 n-gram에서의 <strong>n이 가지는 의미</strong>입니다.</p>
</blockquote>
<p><strong>IDEA</strong> : Collect statistics about how frequent diffrent n-grams are, and use these to predict next word    (n-그램의 빈도에 대한 통계를 수집하고 이를 다음 단어를 예측하는데 사용)</p>
<h4 id="예-the-students-opened-their-__">예) The students opened their <strong>__</strong></h4>
<blockquote>
<ul>
<li>unigrams : the, students, opened, theirs</li>
</ul>
</blockquote>
<ul>
<li>bigrams : the students, students opened, opened their</li>
<li>trigrams : the students opened, students opened their</li>
<li>4-grams : the students opened their</li>
</ul>
<p><strong>Markov Assumption</strong> : <strong>X(t+1)은 n-1개의 단어에만 영향을 받는다</strong>라는 가정
-&gt; 다음 단어를 예측하기 위해서 확률을 계산하는 것이 아니라 여기서는 some large corpus of text에서 count해서 근사화하는 값을 계산합니다.</p>
<p><img src="https://images.velog.io/images/hm1lee/post/32aef639-9a82-4200-8979-f57b9c0c2bdd/image.png" alt=""></p>
<h3 id="2-problems">(2) Problems</h3>
<blockquote>
<h4 id="ex-4-gram-language-model로-다음-단어-예측하기">ex) 4-gram Language Model로 다음 단어 예측하기</h4>
<p>As the proctor started the clock, the students opened their <strong>__</strong></p>
</blockquote>
<p>n-gram 언어 모델은 언어 모델링에 바로 앞의 n-1개의 단어만 참고합니다. 
4-gram 언어 모델이라고 가정하여 위 문장을 가지고 앞서 배운 n-gram 언어 모델링을 하는 방법을 알아보겠습니다. 모델은 바로 앞 3개의 단어만 참고하며 더 앞의 단어들은 무시합니다. 
위 예제에서 <strong>다음 단어 예측에 사용되는 단어는 students, opened, their</strong>입니다.</p>
<blockquote>
<p>P(w|boy is spreading)=count(boy is spreading w)count(boy is spreading)</p>
</blockquote>
<p>그 후에는 훈련 코퍼스에서 (n-1)-gram을 카운트한 것을 분모로, n-gram을 카운트한 것을 분자로 하여 다음 단어가 등장 확률을 예측했습니다. 예를 들어 갖고있는 코퍼스에서 students opened their가 1,000번, students opened their books가 400번, students opened their exams가 100번 등장했다면 각 확률은 아래와 같습니다.</p>
<blockquote>
<p>P(books|students opened their=0.4
P(exams|students opened their)=0.1</p>
</blockquote>
<h3 id="1-희소-문제-sparsity-problems">1. 희소 문제 (Sparsity problems)</h3>
<p>문장에 존재하는 앞에 나온 단어를 모두 보는 것보다 일부 단어만을 보는 것으로 현실적으로 코퍼스에서 카운트 할 수 있는 확률을 높일 수는 있었지만, 여전히 n-gram 모델에 대한 희소 문제가 존재합니다.</p>
<ul>
<li>훈련 코퍼스에 &#39;students opened their &#39;라는 단어 시퀀스가 존재하지 않으면 n-gram 언어 모델에서 해당 단어 시퀀스의 확률 P(students opened their exams)는 0이 되버립니다.</li>
<li>언어 모델이 예측하기에 students opened their 다음에는 books이란 단어가 나올 수 없다는 의미이지만 해당 단어 시퀀스는 현실에서 실제로는 많이 사용되므로 제대로 된 모델링이 아닙니다.</li>
</ul>
<p><strong>n을 작게 선택하면,</strong> 훈련 코퍼스에서 카운트는 잘 되겠지만 근사의 정확도는 현실의 확률분포와 멀어집니다. 그렇기 때문에 적절한 n을 선택해야 합니다. 앞서 언급한 trade-off 문제로 인해 정확도를 높이려면 n은 최대 5를 넘게 잡아서는 안 된다고 권장되고 있습니다.</p>
<h3 id="2-저장-문제-storage-problems">2. 저장 문제 (Storage Problems)</h3>
<p><img src="https://images.velog.io/images/hm1lee/post/f07fe13a-e8b5-46a1-849e-6ba44f174d7c/image.png" alt="">
<strong>n이 커지거나 corpus가 증가하면,</strong> 모델 사이즈가 커진다는 문제점도 있습니다. 기본적으로 코퍼스의 모든 n-gram에 대해서 카운트를 해야 하기 때문입니다.</p>
<hr>
<h3 id="3-process">(3) Process</h3>
<p>앞의 개념을 통해서 예시로 n-gram 동장 방식을 알아보겠습니다.</p>
<p><img src="https://images.velog.io/images/hm1lee/post/fa64e822-4aae-4ccb-b100-4a74d8ea5d28/image.png" alt=""></p>
<ul>
<li>3-gram으로 정하면 n-1인 2개의 단어(today, the)만 남게 됩니다.</li>
<li>해당 단어들을 기반으로 확률 분포를 얻어내면, 가능성이 있는 단어들이 분포로 나오게 됩니다. </li>
<li>분명히 희소성의 문제가 보이지만 이를 무시하고 본다면 나쁘지 않은 결과입니다.</li>
</ul>
<p><img src="https://images.velog.io/images/hm1lee/post/437e2b9d-1e89-4abf-ac90-921e92bd4fc3/image.png" alt=""></p>
<ul>
<li>이전의 과정과 같이 codition (조건 선택) -&gt; sampling (확률 분포에서 제일 확률이 높은 단어를 선택하는 것) -&gt; condition (조건 선택) -&gt; ... -&gt; 새로운 확률 분포를 얻고 샘플링하는 과정을 반복하면서 해당 텍스트를 생성해 낼 수 있습니다.</li>
<li>생각보다 문법적인 결과입니다. 하지만, 전체적인 의미에서 일관성이 없고 n을 늘리게 되면 우려되는 희소성 때문에 n-gram의 한계점을 볼 수 있습니다.</li>
</ul>
<hr>
<h1 id="3-neural-language-model">3. Neural Language Model</h1>
<p>이전 n-gram Language Model 문제점에 대한 대안으로 대체적으로 성능이 우수한 인공 신경망을 이용한 언어 모델이 많이 사용되고 있습니다.</p>
<p>n-gram 언어 모델은 충분한 데이터를 관측하지 못하면 언어를 정확히 모델링하지 못하는 <strong>희소 문제(sparsity problem)</strong>가 있었습니다. 희소 문제는 기계가 단어 간 유사도를 알수 있다면 해결할 수 있는 문제입니다. </p>
<p>언어 모델 또한 단어의 유사도를 학습할 수 있도록 설계한다면, 훈련 코퍼스에 없는 단어 시퀀스에 대한 예측이라도 유사한 단어가 사용된 단어 시퀀스를 참고하여 보다 정확한 예측을 할 수 있을 겁니다. 이런 아이디어를 가지고 탄생한 언어 모델이 신경망 언어 모델 NNLM입니다.</p>
<h3 id="window-based-neural-network-language-model-nnlm">Window-based Neural Network Language Model (NNLM)</h3>
<ul>
<li>&quot;Curse of dimensionality (차원의 저주)&quot;를 해결하기 위해 제안된 신경 기반 Language Model</li>
<li>Language Model이면서 동시에 단어의 &quot;distributed representation&quot;을 학습</li>
<li>NNLM은 n-gram 언어 모델과 유사하게 다음 단어를 예측할 때, 앞의 모든 단어를 참고하는 것이 아니라 <strong>정해진 n개의 단어만을 참고</strong>합니다. 이 범위를 <strong>윈도우(window)</strong>라고 합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/hm1lee/post/ebfbed94-728b-48e9-9c77-6f22dcf25251/image.png" alt=""></p>
<p>-&gt; window size : 4</p>
<ul>
<li>input : 단어들의 시퀀스</li>
<li>output : 다음 단어에 대한 확률 분포</li>
</ul>
<hr>
<p><img src="https://images.velog.io/images/hm1lee/post/ada49d9e-0cc9-4a3a-ab2b-df25e1da83b9/image.png" alt=""></p>
<p>Input 단어 x의 시퀀스를 window 사이즈 만큼 입력하여, one-hot vector를 거쳐 임베딩 합니다.
임베딩 한 벡터 값들을 concatenate하여 가중치 값과 연산하여 hidden layer를 거치게 됩니다. 최종적으로 softmax 함수를 통해 확률 분포를 output 할 수 있으며 해당 분포를 통해서 제일 가능성이 높은 다음 단어를 예측하게 됩니다.</p>
<h3 id="improvements">&lt; Improvements &gt;</h3>
<ul>
<li>단어의 embedding을 통해 n-gram이 없을 확률에 대한 희소성 문제가 없습니다.</li>
<li>관측된 모든 n-gram을 저장할 필요가 없습니다.</li>
</ul>
<h3 id="problems">&lt; Problems &gt;</h3>
<ul>
<li>Fixed window is <strong>too small</strong></li>
<li>Window가 커질수록 가중치 W도 커집니다. (Window 크기의 한계)</li>
</ul>
<p><img src="https://images.velog.io/images/hm1lee/post/e0b062e4-8bef-4b1a-977a-366a385031cf/image.png" alt=""></p>
<ul>
<li><strong>룩업 테이블(lookup table)</strong> : 원-핫 벡터의 특성으로 인해 i번째 인덱스에 1이라는 값을 가지고 그 외의 0의 값을 가지는 원-핫 벡터와 가중치 W 행렬의 곱은 사실 W행렬의 i번째 행을 그대로 읽어오는 것과(lookup) 동일하다는 개념입니다.</li>
<li>룩업 테이블 작업을 거치면 V의 차원을 가지는 원-핫 벡터는 이보다 더 차원이 작은 M차원의 단어 벡터로 맵핑됩니다. 테이블 룩업 과정을 거친 후의 이 단어 벡터를 <strong>임베딩 벡터(embedding vector)</strong>라고 합니다.</li>
<li>해당 벡터와 가중치 metrix에서의 연산에서는 <strong>각각의 벡터들이 각각 다른 W 가중치 섹션을 곱하게 되면서 단어와 단어 간의 &#39;No Symmetry&#39;하게 되는 문제점</strong>을 가지게 됩니다.</li>
</ul>
<hr>
<h1 id="4-recurrent-neural-networkrnn-language-model">4. Recurrent Neural Network(RNN) Language Model</h1>
<h3 id="1-recurrent-neural-networkrnn">(1) Recurrent Neural Network(RNN)</h3>
<p>기존의 뉴럴 네트워크 알고리즘은 고정된 크기의 입력을 다루는 데는 탁월하지만, 가변적인 크기의 데이터를 모델링하기에는 적합하지 않습니다. </p>
<p>RNN(Recurrent Neural Network, 순환신경망)은 시퀀스 데이터를 모델링 하기 위해 등장으며, 기존의 뉴럴 네트워크와 다른 점은 ‘기억’(hidden state)을 갖고 있다는 점입니다.</p>
<p><img src="https://images.velog.io/images/hm1lee/post/8103f1ce-44f6-4b4c-be2f-6c078946c14f/image.png" alt=""></p>
<ul>
<li>위 다이어그램에서 <strong>빨간색 사각형은 입력, 노란색 사각형은 기억, 파란색 사각형은 출력</strong>을 나타냅니다. </li>
<li>첫번째 입력이 들어오면 첫번째 기억이 만들어집니다. 두번째 입력이 들어오면 기존의 기억과 새로운 입력을 참고하여 새 기억을 만듭니다. </li>
<li>입력의 길이만큼 이 과정을 얼마든지 반복할 수 있으며, RNN은 이 요약된 정보를 바탕으로 출력을 만들어 냅니다.</li>
</ul>
<p><img src="https://images.velog.io/images/hm1lee/post/3aa499a7-b79d-4943-aa00-0e39d6bcc7fd/image.png" alt=""> </br></p>
<p>$x_t$는 t 시간 스텝에서의 입력 벡터, $h_t$는 t 시간 스텝에서 RNN의 기억을 담당하는 hidden state, $o$는 출력 벡터입니다. U, W, V는 모델의 파라미터입니다. 
첫 다이어그램에 없던 $h_0$은 hidden state의 초기값으로, 구현을 위해 필요한 부분이며 일반적으로 0으로 초기화 합니다.</p>
<p><img src="https://images.velog.io/images/hm1lee/post/8471f32d-3070-4bf2-a5db-110017248bce/image.png" alt=""></p>
<blockquote>
<p>*<em>은닉층 : $s_t = tanh(x_tU + s_{t−1}W)$ *</em></p>
</blockquote>
<p>네트워크의 기억에 해당하는 <strong>hidden state</strong> $s_t$는 입력 x와 과거의 기억 $s_{t-1}$을 조합하여 만들어집니다. 조합하는 방식은 파라미터 U와 W에 의해 결정됩니다. U는 새로운 입력이 새로운 기억에 영향을 미치는 정도를, W는 과거의 기억이 새로운 기억에 영향을 미치는 정도를 결정한다고 볼 수 있습니다. 비선형함수로는 tanh나 ReLU가 주로 사용됩니다. 여기에서는 tanh를 쓰겠습니다.</p></p>
<blockquote>
<p>*<em>출력층: $o = softmax(s_tV)$  *</em></p>
</blockquote>
<p>출력, 즉 예측값은 마지막 <strong>hidden state</strong> $s_t$로부터 계산됩니다. $s_t$와 V를 곱하는데, 여기서 V는 hidden state와 출력을 연결시켜주며 출력 벡터의 크기를 맞춰주는 역할을 합니다. 마지막으로 출력을 확률값으로 변환하기 위해 softmax 함수를 적용합니다. softmax 함수는 모든 출력값을 0 ~ 1 사이로 변환하고, 출력값의 합이 1이 되도록 합니다.</p></p>
<hr>
<h3 id="rnn의-핵심--반복적으로-같은-가중치-w를-적용하는-것"><strong>RNN의 핵심</strong> : 반복적으로 같은 가중치 W를 적용하는 것</h3>
<ul>
<li>은닉상태 h<sup>(t)</sup>는 이전 은닉 상태 h<sup>(t-1)</sup>와 해당 단계의 입력 x<sup>(t)</sup>의 구성이다.</li>
</ul>
<p><img src="https://images.velog.io/images/hm1lee/post/6e60ce0c-c7be-43b6-a9a4-e16289b6ae59/image.png" alt=""></p>
<pre><code class="language-python">#python code
hidden_state_t = 0 # 초기 은닉 상태를 0(벡터)로 초기화
for input_t in input_length: # 각 시점마다 입력을 받는다.
    output_t = tanh(input_t, hidden_state_t) # 각 시점에 대해서 입력과 은닉 상태를 가지고 연산
    hidden_state_t = output_t # 계산 결과는 현재 시점의 은닉 상태가 된다.</code></pre>
<p><img src="https://images.velog.io/images/hm1lee/post/03a2c6af-74ba-47c4-a703-1ffe21107fde/image.png" alt=""></p>
<hr>
<p><img src="https://images.velog.io/images/hm1lee/post/b4dbad05-acb0-479c-ae82-7485d0993161/image.png" alt=""></p>
<blockquote>
<p>**&lt;각 벡터와 행렬의 크기&gt; **
X<sup>t</sup> : (d×1)
W<sup>x</sup> : (D<sub>h</sub>×d)
W<sup>h</sup> : (D<sub>h</sub>×D<sub>h</sub>)
h<sup>t−1</sup> : (D<sub>h</sub>×1)
b : (D<sub>h</sub>×1)
단어 벡터의 차원 : d, 은닉 상태의 크기 : Dh  </p>
</blockquote>
<hr>
<h3 id="2-improvements--disadvantages">(2) Improvements &amp; Disadvantages</h3>
<h4 id="improvements-1">&lt; Improvements &gt;</h4>
<ul>
<li>모든 길이의 입력을 처리할 수 있다.</li>
<li>단계 t는 이론적으로 여러 이전 단계의 정보를 사용할 수 있다.</li>
<li>아무리 입력이 길어도 모델의 크기가 증가하지 않는다. (모델의 크기는 WH와 WE로 고정되어 있다.)</li>
<li>모든 time step에 동일한 가중치를 적용한다.</li>
<li>각 입력에 동일한 변환을 적용한다. 따라서 하나의 입력을 처리하는 좋은 방법을 배우면 시퀀스의 모든 입력에 적용된다.</li>
</ul>
<h4 id="disadvantages">&lt; Disadvantages &gt;</h4>
<ul>
<li>이전 은닉 상태를 기반으로 다음 은닉 상태를 계산해야 하기 때문에 순차적인 계산이 필요하다. 따라서, 반복하는 과정에서 매우 계산이 느립니다.</li>
<li>여러 단계에서 정보에 액세스하는 것이 매우 어렵습니다.</li>
<li>큰 단점은 <strong>시퀀스 중 중요한 입력과 출력 단계 사이의 거리가 멀어질 수록 그 관계를 학습하기 어려워진다는 점</strong>입니다. </li>
<li>신경망이 깊어질수록 <strong>Vanishing gradient</strong>로 인해, 문장 초반부의 단어가 결과에 미치는 영향이 적어집니다. </li>
<li>) 이점을 극복하기 위해 RNN의 여러 변형 모델들이 제안되고 있으며, 대표적인 변형 모델로는 <strong>LSTM, attention</strong> 기반 모델이 있습니다. </br></li>
</ul>
<hr>
<h3 id="3-training-a-rnn-language-model">(3) Training a RNN Language Model</h3>
<ul>
<li>x<sup>1</sup>에서 x<sup>T</sup>까지의 단어 시퀀스가 있는 텍스트 코퍼스 모음을 얻습니다.</li>
<li>RNN 모델에 단어 시퀀스를 입력한 다음, <strong>모든 단계 T</strong>에 대한 출력 분포인 <strong>Y<sup>(T)</sup></strong>를 계산합니다. (모든 단계에서의 다음 단계에 대한 확률을 계산합니다.)</li>
<li><strong>예측 확률 분포 Y<sup>(T)</sup>와 사실 두 벡터 사이에 대한 교차 엔트로피를 이용하여에 손실 함수를 정의</strong>합니다.
<img src="https://images.velog.io/images/hm1lee/post/d30bcc36-2c0b-4f56-bf4b-9cbbdb8d332c/image.png" alt=""></li>
<li>최종적으로, 모든 단계에서의 loss 평균으로 T의 모든 훈련 셋의 전체 loss를 구합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/hm1lee/post/418fcb71-667a-4245-9b3c-20add8af3387/image.png" alt=""></p>
<ul>
<li>다만 실제 RNN-model을 학습할 경우, 위의 그림과 같이 계산을 하게 되면 많은 양의 계산이 필요하기 때문에 문장 혹은 문서 단위로 입력을 주게 되며, SGD를 통해서 Optimize하는 것도 하나의 방법이라고 합니다.</li>
</ul>
<hr>
<h3 id="4-backpropagation-for-rnns">(4) Backpropagation for RNNs</h3>
<p><img src="https://images.velog.io/images/hm1lee/post/3464a54e-3ac5-444b-aa68-e5c5ea1b8941/image.png" alt=""></p>
<ul>
<li>RNN을 학습하는 것은 기존의 신경망 모델을 학습하는 것과 매우 유사합니다. 그러나 기존의 backpropagation과 다르게 순환 신경망은 계산에 사용된 시간, 시점의 수가 영향을 주어Backpropagation Through Time (BPTT) &#39;시간에 따른 역전파&#39;라는 약간 변형된 알고리즘을 사용합니다. </li>
<li>각 출력 부분에서의 gradient가 현재 시간 스텝에만 의존하지 않고 이전 시간 스텝들에도 의존합니다.</li>
<li>만약, 예시로 t=2의 시점에서 발생한 손실을 역전파 하려면 손실을 입력과 은닉층 사이의 가중치로 미분하여 손실에 대한 각각의 비중을 구해서 업데이트 해야 합니다. 이 연산 과정에서 은닉층의 &#39;이전 시점의 값들&#39;이 연산에 포함되는데 이전 시점의 값은 세부적으로 (가중치, 입력값, 이전 시점의 값들의 조합)으로 이루어져 있다. 순환 신경망은 각 위치별로 같은 가중치를 공유하기 때문에 t=2 시점의 손실을 역전파 하기 위해서는 t=0 시점의 노드 값들에도 &#39;모두 영향을 주어야&#39; 한다.</li>
</ul>
<p><img src="https://images.velog.io/images/hm1lee/post/1a93acca-326b-4095-b6c1-fc17890f37a0/image.png" alt=""></p>
<blockquote>
<p><strong>BPTT(Backpropagation Through Time)</strong> : 각 레이어마다의 weight는 실제론 동일한 웨이트여야 하므로 모든 업데이트도 동일하게 이루어져야 한다. 따라서 각 layer마다 동일한 위치의 weight에 해당하는 모든 derivative error를 다 더한다음 (더하는 거나 평균 내는거나 사실상 같은 의미) weight를 1번 업데이트 해준다.
(어차피 edge하나를 펼친거니까 k스텝으로 펼쳐서 k개의 에러를 구한다음, 에러를 하나로 합치고 이 edge에 대해 업데이트 해주면 끝) 사실상 이것이 BPTT의 핵심적인 부분이다.</p>
</blockquote>
<hr>
<h3 id="5-what-can-rnns-do">(5) what can RNNs do?</h3>
<h4 id="rnn의-입력과-출력은-우리가-네트워크에게-시키고-싶은-것이-무엇이냐에-따라-얼마든지-달라질-수-있습니다">RNN의 입력과 출력은 우리가 네트워크에게 시키고 싶은 것이 무엇이냐에 따라 얼마든지 달라질 수 있습니다.</h4>
<p><img src="https://images.velog.io/images/hm1lee/post/b0551d27-ed81-417b-8a5f-fbd00f407151/image.png" alt=""></p>
<ol>
<li>고정크기 입력 , 고정크기 출력</li>
</ol>
<p>-&gt; 순환적인 부분이 없기 때문에 RNN이 아닙니다.</br>
2. 고정크기 입력 &amp; 시퀀스 출력
-&gt; 예)이미지를 입력해서 이미지에 대한 설명을 문장으로 출력하는 이미지 캡션 생성 </br>
3. 시퀀스 입력 &amp; 고정크기 출력
-&gt; 예) 문장을 입력해서 긍부정 정도를 출력하는 감성 분석기 </br>
4. 시퀀스 입력 &amp; 시퀀스 출력
-&gt; 예) 영어를 한국으로 번역하는 자동 번역기</br>
5. 동기화된 시퀀스 입력 &amp; 시퀀스 출력
예) 문장에서 다음에 나올 단어를 예측하는 언어 모델</br></p>
<h3 id="다양한-rnn-활용">다양한 RNN 활용</h3>
<p><img src="https://images.velog.io/images/hm1lee/post/1c13d46f-6b7b-40d7-9917-166f71835de1/image.png" alt=""></p>
<ul>
<li>RNN은 Tagging, Sentence classification, Encoder Module에도 활용이 많이 되고 있습니다.</li>
</ul>
<hr>
<h1 id="5-perplexity">5. Perplexity</h1>
<h3 id="evaluating-language-models--perplexity">Evaluating Language Models : Perplexity</h3>
<p>언어 모델의 성능을 평가하는 척도인 <strong>perplexity(PPL)를 측정하는 방법</strong>은 <strong>정량 평가/extrinsic evaluation</strong> 방법의 하나입니다. PPL은 문장의 길이를 반영하여 확률값을 정규화한 값이라고 할 수 있습니다. PPL을 이용하여 언어 모델에서 테스트 문장들의 점수를 구하고, 이를 기반으로 언어 모델의 성능을 측정합니다.</p>
<p><img src="https://images.velog.io/images/hm1lee/post/3570260b-8466-43d9-b47d-a741f30a548e/image.png" alt=""></p>
<ul>
<li>Perplexity는 Language Model의 성능을 측정하는 척도입니다. </li>
<li>Language model을 통해 예측한 corpus의 inverse를 corpus 길이로 normalize 해준 값 입니다. </li>
<li>cross-entropy에다가 로그 씌우고 exponential을 씌어서 구할 수 있으며, perplexity가 낮을 수록 좋은 Language Model이라고 할 수 있습니다.</li>
</ul>
<p>최근 Perplexity가 감소하고 있음을 확인할 수 있는데, 해당 값이 낮을 수록 좋습니다.</p>
<hr>
<h1 id="6-출처">6. 출처</h1>
<ul>
<li><a href="https://www.youtube.com/watch?v=iWea12EAu6U&amp;list=PLoROMvodv4rOhcuXMZkNm7j3fVwBBY42z&amp;index=6">https://www.youtube.com/watch?v=iWea12EAu6U&amp;list=PLoROMvodv4rOhcuXMZkNm7j3fVwBBY42z&amp;index=6</a> 
(강의 자료 : 2019 Winter CS224N - Lecture 6)</li>
<li><a href="https://wikidocs.net/21692">https://wikidocs.net/21692</a> (n-gram language model)</li>
<li><a href="https://blog.naver.com/dmsquf3015/222055564808">https://blog.naver.com/dmsquf3015/222055564808</a></li>
<li><a href="https://mystudyplace.tistory.com/22">https://mystudyplace.tistory.com/22</a> (NNLM model)</li>
<li><a href="https://wikidocs.net/22886">https://wikidocs.net/22886</a> (RNN model)</li>
<li><a href="https://newsight.tistory.com/94">https://newsight.tistory.com/94</a> (backpropagation vs BPTT)</li>
<li><a href="https://kh-kim.gitbook.io/natural-language-processing-with-pytorch/00-cover-8/03-perpexity#perplexity">https://kh-kim.gitbook.io/natural-language-processing-with-pytorch/00-cover-8/03-perpexity#perplexity</a> (perplexity)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Lecture 5 - Linguistic Structure: Dependency Parsing]]></title>
            <link>https://velog.io/@tobigs-text1415/Lecture-5-Linguistic-Structure-Dependency-Parsing</link>
            <guid>https://velog.io/@tobigs-text1415/Lecture-5-Linguistic-Structure-Dependency-Parsing</guid>
            <pubDate>Wed, 05 May 2021 09:48:29 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 국민대학교 경영정보학과 &amp; 빅데이터경영통계학과 김동현</p>
<p>CS224n의 5번째 강의는 Linguistic Structure: Dependency Parsing이라는 주제로 각 문장의 문법적인 구성이나 구문을 분석하는 과정인 parsing에 대해 다루고 있습니다. parsing 중에서 Constituency parsing과 Dependency parsing을 소개하고, 강의에서는 Dependency parsing을 위주로 문장 구조를 분석하고 이해하는 방법을 설명합니다.</p>
<p>먼저 Constituency and Dependency parsing의 개념에 대해서 간략하게 보고 이 중에서 Dependency parsing에 대해서 자세히 알아보겠습니다. 그리고, Dependency parsing의 전통적인 방법인 transition-based dependency parsing의 개념과 parsing 과정에 대해서 자세하게 소개하며 마지막 목차에서는 neural network가 적용된 방법인 neural dependency parsing이 어떻게 문장 구조를 분석하는 지에 대해 설명합니다.</p>
<h2 id="1-syntactic-structure-consitituency-and-dependency">1. Syntactic Structure: Consitituency and Dependency</h2>
<p><img src="https://images.velog.io/images/uti5348/post/3c3d4693-b592-4d98-b537-5a3800017772/image.png" alt=""></p>
<p>Parsing이란 각 문장의 문법적인 구성 또는 구문을 분석하는 과정이라고 할 수 있습니다. 주어진 문장을 이루는 단어 혹은 구성 요소의 관계를 결정하는 방법으로, parsing의 목적에 따라 Consitituency parsing과 Dependency parsing으로 구분할 수 있습니다.</p>
<p>Consitituency parsing은 문장의 구성요소를 파악하여 구조를 분석하는 방법이며, Dependency parsing은 단어간 의존 관계를 파악하여 구조를 분석하는 방법입니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/9ac12134-24e8-427e-9564-84c71d6d5e77/image.png" alt=""></p>
<p>Consitituency parsing은 문장을 중첩된 성분으로 나누어 문장의 구조를 파악하는 방법으로 영어와 같이 어순이 비교적 고정적인 언어에서 주로 사용합니다. 구성하고 있는 구(phrase)를 파악하여 문장 구조를 분석하며, 보통 각 단어들은 해당 단어의 문법적 의미를 가지고 있습니다.&#39;the&#39;는 &#39;관형사(Det)&#39;, &#39;cat&#39;은 &#39;명사(N) 등을 예로 들 수 있습니다.</p>
<p>이렇게 각 문법적 의미를 가지고 있는 단어들은 단어끼리 결합해서 어떠한 구(phrase)를 구성할 수 있습니다. 그리고 구성된 구는 구와 또 결합하여 문장을 구성합니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/0051d026-f781-4efa-af64-acba14ab8118/image.png" alt=""></p>
<p>문장의 관점에서 보면 문장을 이루는 구(phrase)를 파악할 수 있으며, 구를 이루는 구, 혹은 구를 이루는 단어들을 최종적으로 분류할 수 있습니다.</p>
<p>&#39;The cuddly cat by the door&#39;에서는 명사구(Noun Phrase)인 &#39;The cuddly cat&#39;과 전치사구(Preprositional Phrase)인 &#39;by the door&#39;로 먼저 구분할 수 있으며 최종적으로는 각 단어가 가지는 문법적 의미까지 분해할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/476896ac-be1a-4872-be6e-283a2bcefe32/image.png" alt=""></p>
<p>Dependency parsing은 문장보다는 문장에 존재하는 개별 단어 간 의존 또는 수식 방향으로 관계를 파악하여 문장 구조를 분석하는 방법입니다. 이는 문장을 이루는 단어 사이에 서로 영향을 미치는 어떠한 관계가 있음을 전제합니다. 한국어와 같이 자유 어순을 가지거나 문장성분이 생략 가능한 언어에서 선호하고 있습니다.</p>
<p>단어 간 존재하는 관계를 의존 관계 혹은 수식 관계로 표현할 수 있으며, 수식을 하는 단어는 &#39;head&#39; 혹은 &#39;governor&#39;, 수식을 받는 단어를 &#39;dependent&#39; 혹은 &#39;modifier&#39;이라고 합니다.</p>
<p>이렇게 단어 간 관계를 정립하게 되면 우측과 같이 문장을 트리 구조로 표현해서 어떻게 화살표가 이동하고 어떤 단어가 수식을 받는지, 안받는지 파악할 수 있습니다.</p>
<p>정리하면 Consitituency parsing은 문장의 구조를 파악하는 것이 주목적이며, Dependency parsing은 단어간 관계를 파악하는 것이 주목적입니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/be5a89d5-c95d-4ebb-b257-abff7d16c45f/image.png" alt=""></p>
<p>이렇게 문장 구조를 parsing이라는 방법을 통해 분석해야하는 이유는 문장의 의미를 보다 정확하게 파악하기 위해서입니다. 인간은 복잡한 의미를 전달하기 위해 단어를 더 큰 단위로 조합하여 생각을 전달하기 때문에 우리는 단어끼리 어떻게 연결되어 있는지 파악해야 합니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/e6b8485e-5e1f-443a-abda-7c25d66a09e9/image.png" alt=""></p>
<p>문장 구조를 분석해야하는 이유로 해당 강의에서는 문장에서 발생하는 2가지 모호성(ambiguity)을 소개합니다.</p>
<p>먼저 Phrase Attachment Ambiguity는 형용사구, 동사구, 전치사구 등이 어떤 단어를 수식하는지에 따라 의미가 달라지는 모호성을 말합니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/159bbfa8-76fc-41fd-aa9a-54e1942d6893/image.png" alt=""></p>
<p>Coordination Scope Ambiguity는 특정 단어가 작용(수식)하는 대상의 범위가 달라짐에 따라 의미가 변하는 모호성을 말하며, 한국어에서는 &#39;작용역 중의성&#39;이라고 합니다.</p>
<p>정리하자면 문장은 많은 단어가 복잡한 관계로 이루어져 있기 때문에 앞서 본 것 처럼 모호한 해석을 올바르게 이해하기 위해서는 문장의 구성요소에 대한 분석과 이해가 요구됩니다. 즉, 무엇과 무엇이 연결되어 있는지에 대한 이해가 필요합니다.</p>
<h2 id="2-dependency-grammar-and-treebanks">2. Dependency Grammar and Treebanks</h2>
<p><img src="https://images.velog.io/images/uti5348/post/0571d51b-bc00-4520-b342-9ace60b9c11c/image.png" alt=""></p>
<p>Dependency parsing에 대해서 자세히 알아보겠습니다. 먼저 &#39;ROOT&#39;라는 가상의 노드를 문장의 맨 처음에 추가함으로써, 최종 head를 &#39;ROOT&#39;를 설정하고 모든 단어가 1개의 dependent(의존 관계)를 가지도록 설정합니다.</p>
<ul>
<li>Dependency Structure는 sequence 형태와 tree 형태로 표현할 수 있으며, 2가지 형태의 결과는 정확히 동일한 output을 가져야 합니다.</li>
<li>화살표는 head(수식을 받는 단어)에서 dependent(수식을 하는 단어)로 향합니다.</li>
<li>화살표 위 라벨은 단어간 문법적 관계를 의미하며 수식 관계인 화살표는 순환하지 않습니다. 즉, 중복 관계는 형성되지 않습니다.</li>
</ul>
<p><img src="https://images.velog.io/images/uti5348/post/2aa9068d-7d5f-4b16-b4ae-aa69bf7b81d5/image.png" alt=""></p>
<p>Dependecy parsing에서 고려되는 보편적인 특징은 다음과 같습니다.</p>
<ul>
<li>두 단어 사이의 실제 의미가 드러나는 관계</li>
<li>dependency의 거리는 주로 가까운 위치에서 dependent 관계가 형성</li>
<li>마침표, 세미콜론과 같은 구두점을 넘어 dependent 관계가 형성되지는 않음</li>
<li>head의 좌우측에 몇 개의 dependents를 가질 것인가에 대한 특성</li>
</ul>
<h2 id="3-transition-based-dependency-parsing">3. Transition-based dependency parsing</h2>
<p><img src="https://images.velog.io/images/uti5348/post/2fc1a43b-6642-4752-9adb-18b571af4571/image.png" alt=""></p>
<p>Dependecy parsing의 방법으로 강의에서는 4가지 방법이 있다고 소개합니다. 하지만 이번 강의와 목차에서는 Transition-based 방법에 대해서 보다 구체적이게 다루고자 합니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/09a3649b-262c-49a9-9007-dc0421bb3dc0/image.png" alt=""></p>
<p>Dynamic programming은 동적 계획법 개념을 사용하는데 긴문장이 있으면 그 문장들을 몇 개로 나누어서 하위 문자열에 대한 하위 트리를 만들고 최종적으로 그것들을 다시 합치는 방법으로 parsing을 진행합니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/3aa56eac-55cc-43da-9f75-d7989f18b6b5/image.png" alt=""></p>
<p>Constraint Satisfaction은 문법적 제한 조건을 초기에 설정하고 그 조건을 만족하면 남기고, 만족하지 못하면 제거하여, 조건을 만족시키는 단어들만 parsing하는 방법이라고 합니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/81ae32d5-106e-417f-b393-32311ea299c8/image.png" alt=""></p>
<p>Transition-based dependency parsing은 두 단어의 의존 여부를 차례대로 결정해나가면서 점진적으로 dependency structure를 구성해나가는 방법입니다. 이와 달리 Graph-based는 가능한 의존 관계를 모두 고려한 뒤 가장 확률이 높은 구문 분석 트리를 선택하는 방법입니다. </p>
<p><img src="https://images.velog.io/images/uti5348/post/7175bf63-4306-4956-9dc3-8b1fc1e70e72/image.png" alt=""></p>
<p>Transition-based dependency parsing은 문장에 존재하는 sequence를 차례대로 입력하게 되면서 각 단어 사이에 존재하는 dependency를 결정해나가는 방법으로 &#39;Deterministic dependecy parsing&#39;이라고도 불립니다.</p>
<p>문장의 sequence라는 한 방향으로 분석이 이루어지기 때문에 모든 경우를 고려하지는 못합니다. 그렇기 때문에 분석 속도는 보다 빠를 수 있겠지만 낮은 정확도를 보이기도 합니다. 앞서 소개한 Graph-based는 모든 경우의 수를 다 고려해서 속도는 느리지만 정확도는 높다고 합니다.</p>
<p>그러나 2014년에 발표한 논문에 따르면 dense feature를 사용한 신경망 기반 transition-based parser를 제안하여 속도와 성능 모두를 향상 시켰다고 합니다. 하지만 이는 Graph-based parser에 비하면 낮은 성능을 기록하고 있습니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/21ee5e74-081f-4b35-80c5-5843e793031c/image.png" alt=""></p>
<p>Transition-based dependency parsing이 진행되는 과정에 대해서 살펴보겠습니다. 먼저, parsing 과정에는 BUFFER, STACK, Set of Arcs라는 3가지 구조를 가지고 있습니다.</p>
<p>input으로 문장이 입력되면, 위 3가지 구조를 거침으로써 output이 도출되는 parsing 과정입니다. parsing 초기 상태에서 BUFFER에는 주어진 문장이 토큰 형태로 모두 입력되어 있는 상태이며, STACK에는 ROOT만이 존재하고 Set of Arcs에는 parsing의 결과물이 담기게 되어 현재는 공집합 상태입니다.</p>
<p>parsing 과정에 대해서 간단하게 설명하면 다음과 같습니다. BUFFER에 존재하는 문장의 토큰이 STACK으로 이동하게 되면서 어떠한 state를 형성하게 됩니다. 그리고 해당 state를 기반으로 Decision이라는 결정을 내리게 되고 output으로 결과가 이동하게 됩니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/452ae786-19ef-4e4c-bb90-216544f32f7f/image.png" alt=""></p>
<p>먼저 BUFFER에서 STACK으로 토큰이 이동하는 과정은 문장의 sequence를 따릅니다. 즉 BUFFER(&#39;John&#39;, &#39;hit&#39;, &#39;the&#39;, &#39;ball&#39;)가 존재한다면 문장의 첫번째 토큰인 &#39;John&#39;가 먼저 STACK으로 이동하게 됩니다.</p>
<p>그렇게 되면 STACK에는 &#39;ROOT&#39;와 &#39;John&#39;이 존재하게 되면서 어떠한 state를 형성하게 됩니다. 그 때, 이 state를 통해 Decision이라는 결정을 내리게 됩니다. Decision을 결정하는 방법으로는 단순히 함수와 같은 역할이라고 볼 수 있으며 강의에서는 SVM, Neural Network등의 모델이 적용될 수 있습니다.</p>
<p>STACK에서 토큰과 토큰의 존재로 다양한 state가 형성되겠지만 결정되는 Decision은 여기서 3가지를 소개합니다.</p>
<p>Shift: BUFFER에서 STACK으로 이동하는 경우
Right-Arc: 우측으로 dependency가 결정되는 경우
Left-Arc: 좌측으로 dependency가 결정되는 경우</p>
<p>STACK이라는 자료구조를 통해서 shift를 할지 left-arc나 right arc를 할지를 결정하는데 도와주기 때문에 사용하는 것 같습니다.</p>
<p>보통 Arc의 라벨 개수를 17개 또는 45개로 정하며, 이에 따라 총 경우의 수는 (2 x 17 + 1) or (2 x 45 + 1) = 35 or 91개 입니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/2fdb1909-7626-4e21-a032-a10cca147734/image.png" alt=""></p>
<p>실제로 &#39;John hit the ball.&#39; 문장이 Transition-based 방법을 통해 parsing되는 과정을 알아보겠습니다.</p>
<p>초기 상태는 위에서 언급한대로 BUFFER에는 주어진 문장이 토큰 형태로 입력되어 있으며 STACK에는 ROOT만이 존재합니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/450b526f-4ea6-4097-8b22-2988c2701db9/image.png" alt=""></p>
<p>(1) STACK에 ROOT만이 존재하는 state는 &#39;shift&#39;라는 decision이 내려지게 되면서 &#39;John&#39;가 BUFFER에서 STACK으로 이동하게 됩니다.</p>
<p>(2) STACK에는 ROOT와 John 밖에 없기 때문에 Arc를 결정할 수 없어 state가 &#39;shift&#39;라는 decision이 내려지게 되고 &#39;hit&#39;가 BUFFER에서 STACK으로 이동하게 됩니다.</p>
<p>(3) STACK에는 ROOT, John, hit라는 state는 &#39;hit&#39;가 &#39;John&#39;를 수식하는 &#39;Left-Arc&#39;라는 decision이 내려지게 됩니다. 여기서 John의 위치를 2로 hit의 위치를 1로 생각해서 1에서 2로 왼쪽으로 가기 때문에 &#39;Left-Arc&#39;라고 생각하면 이해하기 쉽습니다.</p>
<p>이 때, &#39;hit&#39;와 &#39;John&#39;이 관계가 형성되었기 때문에 해당 결과는 Set of Arcs로 이동하게 됩니다. 또한 dependent가 되는 단어(John)는 STACK에서 사라지게 됩니다.</p>
<p>(4) STACK에는 ROOT, hit라는 state가 Arc를 결정할 수 없는 상태이기 때문에 &#39;shift&#39;라는 decision이 내려지게 되면서 &#39;the&#39;가 BUFFER에서 STACK으로 이동하게 됩니다.</p>
<p>(5) STACK에는 ROOT, hit, the라는 state에서도 어떠한 관계가 형성되지 않는다고 판단했기에 &#39;shift&#39;라는 decision이 내려지게 되고 &#39;ball&#39;이 BUFFER에서 STACK으로 이동하게 됩니다.</p>
<p>(6) STACK에는 ROOT, hit, the, ball이라는 state에서 &#39;ball&#39;이 &#39;the&#39; 수식하는 &#39;Left-Arc&#39;라는 decision이 내려지게 되고 해당 결과(ball, det, the)는 Set of Arcs로 이동하게 됩니다. 이때도 위에서 처럼 오른쪽부터 순서를 매기면 hit(3), the(2), ball(1)로 1에서 2로 왼쪽으로 수식하기 때문에 &#39;Left-Arc&#39;라고 생각하면 됩니다.</p>
<p>(7) STACK에는 ROOT, hit, ball이라는 state에서 &#39;hit&#39;가 &#39;ball&#39;을 수식하는 &#39;Right-Arc&#39;라는 decision이 내려지게 되고 해당 결과(hit, dobj, ball)는 이동합니다. 이때도 hit(2), ball(1)로 2에서 1로 오른쪽으로 수식하기 때문에 &#39;Right-Arc&#39;라고 생각하면 됩니다.</p>
<p>(8) STACK에는 ROOT, hit라는 state에서 BUFFER에 토큰이 존재하지 않기 때문에 &#39;shift&#39;가 발생할 수 없습니다. 하지만 모든 토큰은 하나의 dependent를 가진다는 dependency parsing의 특징으로 &#39;ROOT&#39;가 &#39;hit&#39;를 수식하는 &#39;Right-Arc&#39;라는 decision이 내려지게 되고 해당 결과(Root, root, hit)는 이동합니다.</p>
<p>이렇게 문장의 모든 토큰이 BUFFER와 STACK을 통해 어떠한 관계가 결정되고 형성됨으로써 output으로 트리 형태로 표현이 가능해집니다.</p>
<p>앞서 언급했듯이, STACK에서 발생하는 어떠한 state를 기반으로 Decision을 결정하기 위해서는 SVM, NN, maxnet과 같은 모델이 적용됩니다. 이 과정에서 state를 모델이 input으로 받기 위한 state 임베딩 과정이 필요하게 됩니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/1a01b9e7-8f7a-4996-a5aa-1261fba66d9a/image.png" alt=""></p>
<p>state를 임베딩하는 방법으로 2005년에 발표된 Nivre and Hall의 논문인 MaltParser: A Data-Driven Parser-Generator for Dependency Parsing의 feature representation을 살펴볼 수 있습니다.</p>
<p>먼저 (4)와 같은 state일 때, 해당 state가 임베딩되는 과정에 대해서 설명하겠습니다. 임베딩 과정을 알아보기에 앞서 임베딩을 위한 feature를 표현하기 위해서 notation을 확인할 수 있습니다. 이 때, 각 토큰의 tag를 활용하기도 합니다.</p>
<p>해당 state에 알맞은 notation 결과는 다음과 같습니다. s1xW는 the, b1xW는 ball, s1xt는 DT, lc(s2)xW는 John, rc(s1)xW는 Null로, 보여지는 notation은 일부분을 예시로 보여준 것으로 STACK의 두번째 단어 &#39;hit&#39;와 같은 notation을 추가적으로 뽑아낼 수 있습니다. 그리고 해당 notation의 결과를 찾아볼 수 없을 때에는 그냥 NULL을 부여하게 됩니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/b1617393-fcce-4b3c-94c1-badc265af940/image.png" alt=""></p>
<p>그렇다면 이러한 notation 기반으로 indicator features라는 조건을 설정함으로써 state를 임베딩할 수 있습니다.</p>
<p>예시를 보게 되면 STACK의 첫번째 단어가 &#39;the&#39;이고 STACK의 첫번째 태그가 &#39;DT&#39;면 1 아니면 0 이라는 값이 부여지게 됩니다. 이러한 조건들로 하여금 해당 state를 10^6, 10^7 차원의 벡터로 표현하게 되는 것이 state를 임베딩하는 방법이라고 합니다.</p>
<p>이렇게 state를 임베딩하는 방법은 1과 0인 binary로 표현되게 됩니다. 그렇기 때문에 sparse한 형태의 특징을 가지게 됩니다.</p>
<p>일반적으로 notation의 1~3개의 조합으로 indicator feature의 조건을 설정하며, 차원을 모두 계산해야 하기 때문에 Parsing 소요시간 중 95% 이상을 feature 연산이 차지하여 계산 비용이 높습니다. 이 과정에서 단어 또는 단어의 태그의 의미를 반영하지 못하는 단점이 있습니다.</p>
<h2 id="4-neural-denpendency-parsing">4. Neural Denpendency parsing</h2>
<p><img src="https://images.velog.io/images/uti5348/post/7788792a-ed9a-44f0-b571-25e6d2aecba0/image.png" alt=""></p>
<p>최근에는 신경망 기반의 방법론들이 발전하게 되면서 neural network가 적용된 Dependency Parsing에 대한 방법론도 제기되었습니다. 모델 구조는 기본적인 neural network 형태를 가지고 있습니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/ec708245-5cf0-45fc-bb1d-65bc992fd7ce/image.png" alt=""></p>
<p>이 때, input으로 들어가는 state를 representation하는 방법에 대해서 보다 구체적이게 다루도록 하겠습니다.</p>
<p>input으로 들어가는 feature는 words 부분, POS tag(태그), arc labels 부분 3가지로 구분할 수 있습니다.</p>
<p>먼저 words feature로 들어가게 되는 데이터는 총 18개로 구성되어 있습니다.</p>
<ul>
<li>STACK과 BUFFER의 TOP 3 words (6개)</li>
<li>STACK TOP 1, 2 words의 첫번째, 두번째 left &amp; right child word (8개)</li>
<li>STACK TOP 1,2 words의 left of left &amp; right of right child word (4개)</li>
</ul>
<p>다음 POS tags feature로 들어가게 되는 데이터는 words feature에서 들어가는 데이터의 태그를 의미하기 때문에 똑같이 18개가 됩니다.</p>
<p>마지막으로 arc labels에서는 STACK과 BUFFER의 TOP 3 words 6개를 제외한 12개의 label(dependent 관계 표시) 데이터로 구성되게 됩니다.</p>
<p>(4)의 state일 때의 input layer의 데이터를 확인하게 되면 각 feature별로 다음과 같이 확인할 수 있습니다. 이 feature에 해당하는 데이터들을 원핫으로 표현할 수 있게 됩니다.</p>
<ul>
<li>words feature는 (18 x 단어의 총 개수)</li>
<li>POS tag feature는 (18 x POS tag 총 개수)</li>
<li>Arc-label feauture는 (12 x label 총 개수)</li>
</ul>
<p>이 때, 일반적으로 POS tag의 개수는 45개 정도라고 말합니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/499fd2f8-3e00-4288-beec-05287daaeb56/image.png" alt=""></p>
<p>이렇게 포함된 데이터를 원핫으로 표현한 후에 word embedding matrix를 참고하여 해당 토큰의 벡터를 가져올 수 있습니다. 그렇다면 각 토큰별로 벡터가 있는 상태에서 모두 concat한 뒤에 input layer에 들어가게 됩니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/25408f5b-6dd1-445e-b82a-9e759c0c7548/image.png" alt=""></p>
<p>각 feautre별로 임베딩된 벡터가 input layer를 입력된 이후에 hidden layer에서는 Embedding Vector와 weight matrix를 곱한 뒤 bias vector를 더하는 일반적인 feed forward network의 계산이 진행됩니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/778c1e42-11c4-4ecb-804f-5be7fa037eca/image.png" alt=""></p>
<p>이 때, 신경망에서 보통 쓰이는 ReLU, Sigmoid, Tanh과 같은 activation function을 사용하지 않고 word, POS tag, arc-label간 상호작용을 반영할 수 있는 cube function을 사용하게 됩니다. 엄밀한 수학적 증명을 하지는 않았으나 실험 결과 다른 비선형 함수 대비 우수한 성능을 기록한다고 합니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/181486e0-d963-4041-a6f6-a968d1b7a55c/image.png" alt=""></p>
<p>마지막으로 output layer에서 Decision이 결정되는 과정은 다음과 같습니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/65a0ffa7-f778-4d25-8337-48a9dd0a0cd2/image.png" alt=""></p>
<p>Input layer에서 입력 받은 vector를 Hidden layer에서 ReLU 함수를 통해 Hidden vector를 생성합니다. 그리고 만들어진 Hidden vector를 Softmax layer에서 Softmax 함수를 통해서 Output을 만들게 됩니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/cc66b539-2d69-4bcd-9397-1f310e4cf3f6/image.png" alt=""></p>
<p>Hidden layer를 거친 feature vector를 linear projection(이동) 후 softmax 함수를 적용하여 Deicision으로 나타날 수 있는 모든 경우의 수의 확률을 구하게 됩니다. Shift, Left-Arc, Right-Arc 중 가장 확률값이 높은 경우의 수를 output으로 산출합니다. 위의 예시에서 해당 state에서는 nsubj의 관계를 가지는 Left-Arc의 경우가 Decision으로 선택되게 됩니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/99dc05a1-2330-46ce-a844-b8607bf38fa0/image.png" alt=""></p>
<p>Neural Dependency parsing을 evaluation하는 방법으로는 Arc 방향만을 예측하는 UAS evaluation과 Arc 방향과 관계 label까지 예측하는 LAS가 있습니다.</p>
<p>각 parsing 방법에 따른 성능을 비교해보자면 목차 3에서 다뤘던 conventional features representation이 적용된 Transition-based parser(첫번째 parser)의 경우 모든 경우의 수를 체크하는 Graph-based parser보다 훨씬 빠르지만 성능이 조금 낮은 것을 확인할 수 있습니다. 하지만 Neural Network를 적용함으로써 Transition-based parser와 Graph-based parser보다 빠르고 좋은 성능을 이끌 수 있게 됩니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/c25c3b35-a7ed-4d3c-b28b-517f32977533/image.png" alt=""></p>
<p>이후로는 greedy algorithms(Weiss et al. 2015)이 적용된 parser와 beam search(Andor et al. 2016)가 적용된 parser가 발표되었고 최근에 Graph-based와 Neural Network가 결합한 Neural graph-absed(Dozat &amp; Manning 2017)가 적용된 parser가 굉장히 성능이 좋은 것을 확인할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/uti5348/post/2fc8d9ae-4dc1-43e7-9c73-ee5b37fb8050/image.png" alt=""></p>
<p>long-term dependeny에 관한 문제점은 다양한 결합 방법이 시도되고 있는데 Graph-based와 Transition-based parser를 결합하여 long-term dependency 문제를 어느 정도 해결할 수 있다고 합니다.</p>
<p>&lt;요약&gt;</p>
<p><img src="https://images.velog.io/images/uti5348/post/211b2424-bd8b-48fa-837d-85d17ecb8e8c/image.png" alt=""></p>
<p>참고자료</p>
<ul>
<li><a href="http://dsba.korea.ac.kr/seminar/?mod=document&amp;uid=42">http://dsba.korea.ac.kr/seminar/?mod=document&amp;uid=42</a></li>
<li><a href="https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1194/slides/cs224n-2019-lecture05-dep-parsing.pdf">https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1194/slides/cs224n-2019-lecture05-dep-parsing.pdf</a></li>
<li><a href="https://gnoej671.tistory.com/5">https://gnoej671.tistory.com/5</a></li>
<li><a href="https://velog.io/@tobigs-text1314/CS224n-Lecture-5-Linguistic-Structure-Dependency-Parsing">https://velog.io/@tobigs-text1314/CS224n-Lecture-5-Linguistic-Structure-Dependency-Parsing</a></li>
<li>A Fast and Accurate Dependency Parser using Neural Networks, Chen &amp; Manning, 2014</li>
<li>Integrating Graph-Based and Transition-Based Dependency Parsers, Joakim Nivre &amp; Ryan McDonald, 2008. (<a href="https://www.aclweb.org/anthology/P08-1108.pdf">https://www.aclweb.org/anthology/P08-1108.pdf</a>)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Lecture 4 - Backpropagation and Computation Graphs]]></title>
            <link>https://velog.io/@tobigs-text1415/Lecture-4-Backpropagation-and-Computation-Graphs</link>
            <guid>https://velog.io/@tobigs-text1415/Lecture-4-Backpropagation-and-Computation-Graphs</guid>
            <pubDate>Wed, 28 Apr 2021 08:47:59 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 세종대학교 응용통계학과 <a href="https://github.com/Junhyeok1015">조준혁</a></p>
<h1 id="1-derivative-wrt-a-weight-matrix">1. Derivative wrt a weight matrix</h1>
<h2 id="1-chain-rule">1) Chain Rule?</h2>
<p>chain rule은 연쇄법칙으로 합성함수의 미분법을 의미합니다.
<img src="https://images.velog.io/images/junhyeok1015/post/ebe572b6-7b63-4955-b592-ace28b8d939d/%ED%99%94%EB%A9%B4%20%EC%BA%A1%EC%B2%98%202021-04-21%20180726.jpg" alt=""></p>
<p>Neural Network에서는 이러한 합성함수의 미분법인 chain rule을 이용하여 최종 scalar 값을 weight로 미분해가며 가중치를 업데이트 하는 방식으로 학습이 진행됩니다.
<img src="https://images.velog.io/images/junhyeok1015/post/fc07297e-ca15-4599-9589-11afb7b92bc0/image.png" alt=""></p>
<h1 id="2-deriving-gradients-tips">2. Deriving gradients: Tips</h1>
<h3 id="1-carefully-define-your-variables-and-keep-track-of-their-dimensionality">1) Carefully define your variables and keep track of their dimensionality!</h3>
<h5 id="-변수를-잘-정의하고-차원을-계속-숙지할-것">* (변수를 잘 정의하고 차원을 계속 숙지할 것)</h5>
<h3 id="2-chain-rule---keep-straight-what-variables-feed-into-what-computations">2) Chain rule! - Keep straight what variables feed into what computations</h3>
<h5 id="-연쇄법칙을-잘-알고-사용할-것">* (연쇄법칙을 잘 알고 사용할 것)</h5>
<p><img src="https://images.velog.io/images/junhyeok1015/post/23e4aa23-f0cd-4bf4-b059-3fa8cf7980ce/image.png" alt=""></p>
<h3 id="3-for-the-top-softmax-part-of-a-model">3) For the top softmax part of a model</h3>
<h4 id="first-consider-the-derivative-wrt-f_csoftmax-when-c--y-the-correct-class">First consider the derivative wrt $f_{c}$(softmax) when $c = y$ (the correct class)</h4>
<h4 id="then-consider-derivative-wrt-f_csoftmax-when-c-neq-yall-the-incorrect-classes">Then, consider derivative wrt $f_{c}$(softmax) when $c \neq y$(all the incorrect classes)</h4>
<h5 id="-마지막-softmax-값에-대해-correct-class--incorrect-class를-따로따로-미분해줄-것">* (마지막 softmax 값에 대해 correct class / incorrect class를 따로따로 미분해줄 것)</h5>
<h3 id="4-work-out-element-wise-partial-derivatives-if-youre-getting-confused-by-matrix-calculus">4) Work out element-wise partial derivatives if you&#39;re getting confused by matrix calculus!</h3>
<h5 id="-행렬-미분-방법이-헷갈린다면-성분별-부분-미분을-연습할-것">* (행렬 미분 방법이 헷갈린다면 성분별 부분 미분을 연습할 것)</h5>
<h3 id="5-use-shape-convention">5) Use Shape Convention.</h3>
<h4 id="the-error-message-delta-that-arrives-at-a-hidden-layer-has-the-same-dimensionality-as-that-hidden-layer">The error message $\delta$ that arrives at a hidden layer has the same dimensionality as that hidden layer</h4>
<h5 id="-shape-convention을-이용하자-hidden-layer에-도착하는-error-메세지-delta는-그-은닉층의-차원과-같다">* (Shape Convention을 이용하자. hidden layer에 도착하는 error 메세지 $\delta$는 그 은닉층의 차원과 같다.)</h5>
<p><img src="https://images.velog.io/images/junhyeok1015/post/066e6734-1ecf-42e0-82d5-fd5a851002cd/image.png" alt=""></p>
<h1 id="3-deriving-gradients-wrt-words-for-window-model">3. Deriving gradients wrt words for window model</h1>
<p>지금까지 앞서 x와 W의 선형결합으로 이루어진 matrix에 대한 미분값을 살펴보았는데, Word들에 대해서는 어떻게 미분이 적용될지 알아보겠습니다.</p>
<p><img src="https://images.velog.io/images/junhyeok1015/post/7c57a63e-106d-4d68-a6ab-98572ce28a80/image.png" alt=""></p>
<p>NLP는 말 그대로 &quot;언어&quot;를 입력받아 특정 task를 수행하게 됩니다. 이때 각각의 word들은 고유의 vector 값을 가지게 되는데, 이 벡터들을 결합한 행렬 전체를 task를 수행하기 위한 input으로 넘겨주는것이 아닌 window 단위로 넘겨주게 됩니다. 위에서 제시된 예시는 5개의 단어가 있고 각 단어는 d차원의 벡터입니다. 따라서 5xd 차원의 word window vector이며 window 단위로 가중치를 업데이트 하며 각 단어 벡터들이 task에 도움이 되는 방향으로 업데이트를 진행합니다.</p>
<h1 id="4-a-pitfall-when-retraining-word-vectors">4. A pitfall when retraining word vectors</h1>
<p>하지만 위와 같은 방법으로 특정 task를 위해 word vector를 학습시키고 노드의 가중치와 워드 벡터를 업데이트 시키는 것이 항상 좋은 결과를 야기하는 것은 아닙니다.</p>
<p>다음의 예시를 살펴보겠습니다.</p>
<p><img src="https://images.velog.io/images/junhyeok1015/post/199498f6-66ec-4265-b455-8266f34c2d70/image.png" alt=""></p>
<p><strong>TV</strong>, <strong>telly</strong>, <strong>television</strong> 는 기본적인 의미가 같기 때문에 glove 등을 통해 워드 임베딩을 한다면 vector space 상의 세 단어는 매우 가깝게 위치할 것입니다. </p>
<p>하지만 만약 학습시키고자 하는 데이터셋에 <strong>TV</strong>, <strong>telly</strong>가 있고 <strong>television</strong>은 없다고 가정해보겠습니다.</p>
<p>학습 데이터를 이용해 모델을 학습시킨다면 <strong>TV</strong>와 <strong>telly</strong>는 모델의 목적(ex. movie review sentiment classification)에 맞게 가중치를 업데이트하며 움직이게 됩니다.
<img src="https://images.velog.io/images/junhyeok1015/post/b2562ddd-969c-4ced-a96d-2071868dd40b/image.png" alt=""></p>
<p>하지만 <strong>television</strong>의 경우에는 어떻게 될까요?
TV와 telly와 비슷한 의미를 지님에도 학습 데이터 셋에 포함되지 않는다는 이유로 가중치가 업데이트 되지 못해 모델로 하여금 다른 의미를 지닌 단어로 분류되게 됩니다.</p>
<h4 id="q-이러한-부분은-어떻게-해결할-수-있나요">Q. 이러한 부분은 어떻게 해결할 수 있나요?</h4>
<h4 id="a-대부분의-경우-pre-trained된-모델을-사용하면-됩니다">A. 대부분의 경우 Pre-trained된 모델을 사용하면 됩니다.</h4>
<h5 id="pre-trained-모델이란">Pre-trained 모델이란?</h5>
<ul>
<li>사전에 학습된 모델로 내가 풀고자 하는 문제와 비슷하면서 규모가 큰 데이터셋에 이미 학습이 되어있는 모델입니다.</li>
</ul>
<p>지난 강의에서 소개되었던 Word2Vec, Glove 모두 Pre-trained 모델입니다.
Pre-trained 모델의 경우 이미 방대한 양의 데이터에 대해 학습을 마친 상태이므로, 위와 같이 TV, telly, television과 같이 비슷한 단어의 경우 훈련 데이터 셋 포함 유무에 관계없이 일정 수준의 유사 관계가 형성이 됩니다.</p>
<p>하지만 데이터의 양이 100만개 이상이라면(거의 불가능), 랜덤 워드 벡터로부터 시작해서 모델을 학습시켜도 괜찮습니다.</p>
<h4 id="q-fine-tuning을-해야하나요">Q. Fine Tuning을 해야하나요?</h4>
<h4 id="a-가지고-있는-데이터-셋의-규모에-따라-달라집니다">A. 가지고 있는 데이터 셋의 규모에 따라 달라집니다.</h4>
<h5 id="fine-tuning-이란">Fine Tuning 이란?</h5>
<ul>
<li>기존에 학습되어져 있는 모델을 기반으로 모델의 구조를 목적 task에 맞게 변형하고 이미 학습된 weight로 부터 학습을 업데이트 하는 방법</li>
</ul>
<h4 id="1-training-dataset이-적은-경우-100-thousands">1. Training dataset이 적은 경우(&lt; 100 thousands)</h4>
<ul>
<li>그냥 사전 학습된 word vector를 사용할 것(fine-tuning 하지 않기)</li>
</ul>
<h4 id="2-training-dataset이-많은-경우-1-million">2. Training Dataset이 많은 경우(&gt; 1 million)</h4>
<ul>
<li>word vector를 학습시키는 것이 성능이 좋아질 것(fine-tuning 하기)</li>
</ul>
<h1 id="5-computation-graphs-and-backpropagation">5. Computation Graphs and Backpropagation</h1>
<h2 id="1-computation-graph">1) Computation Graph?</h2>
<p>Computation Graph이란 &quot;계산 그래프&quot;를 의미합니다. 계산 그래프란 말 그대로 계산 과정을 그래프로 나타낸 것입니다. 그래프는 여러개의 node와 그 노드를 잇는 선(edge)로 표현이 됩니다.</p>
<p><img src="https://images.velog.io/images/junhyeok1015/post/fdc12c95-437b-4e78-b0b0-bd43511e5dc9/image.png" alt=""></p>
<h2 id="2-forward-propagation순전파">2) Forward Propagation(순전파)</h2>
<p><img src="https://images.velog.io/images/junhyeok1015/post/f634a7df-54e8-4d4e-aebf-86602709acb5/image.png" alt=""></p>
<p>위의 수식을 얻기위해 계산 그래프의 왼쪽부터 차례대로 연산을 해나가 결괏값을 얻는 것을 Forward Propagation이라고 합니다.</p>
<h2 id="3-back-propagation역전파">3) Back Propagation(역전파)</h2>
<p>Neural Network는 Forward Propagation을 통해 얻어진 결과와 실제값을 비교해 계산된 오차를 미분하며 가중치를 업데이트하는 방식으로 학습이 진행됩니다.</p>
<h3 id="3-1-single-nodesingle-input">3-1) Single Node(Single Input)</h3>
<p>이해를 돕기위해 먼저 하나의 input과 하나의 output으로 이루어진 계산 그래프를 생각해보겠습니다.</p>
<p>$h = f(z)$</p>
<p><img src="https://images.velog.io/images/junhyeok1015/post/25634963-375d-4706-a6ff-c1a8468c7307/image.png" alt=""></p>
<p>Back propagation의 진행 방향을 생각해볼 때 Upstream gradient와 Downstream gradient의 순서로 미분값을 계산하게 됩니다.</p>
<p>하지만 Downstream gradient를 수행할 때 s는 z로 이루어지지 않아 적절히 미분을 수행할 수 없습니다.</p>
<p><img src="https://images.velog.io/images/junhyeok1015/post/61cf90d2-6187-4a8c-b8ea-5fb6c5c83756/image.png" alt=""></p>
<p>이를 해결하기 위해 Forward Propagation 수행 시의 output을 input으로 미분한 Local gradient를 이용해 Downstream gradient를 계산할 수 있게 됩니다.</p>
<p>$Downstream Gradient = Local Gradient * Upstream Gradient$</p>
<p>결론적으로는 Chain Rule을 이용한 것과 같은 결과입니다.</p>
<p><img src="https://images.velog.io/images/junhyeok1015/post/32d1a518-fe2d-4842-80e9-3feea20bfd3e/image.png" alt=""></p>
<h3 id="3-2-single-nodemultiple-input">3-2) Single Node(Multiple Input)</h3>
<p>조금 더 일반화를 하기 위해 더 많은 Input이 있을 경우에는 어떻게 Back Propagation을 살펴보겠습니다.</p>
<p>$z = Wx, (x, z : vector, W : matrix)$</p>
<p><img src="https://images.velog.io/images/junhyeok1015/post/cbfdeb6a-7673-48b2-aaef-7bdce8b9b747/image.png" alt=""></p>
<p>간단히 말하면 위에서 소개해드린 방법을 여러번 수행한다고 생각하시면 됩니다.</p>
<p><img src="https://images.velog.io/images/junhyeok1015/post/cc7206d0-af77-4676-9a2b-6c87d407e6e8/image.png" alt=""></p>
<p>동일하게 Upstream gradient에 각각의 Input에 대한 Local gradient를 계산해 곱해주어 각 Input에 대한 미분을 수행하며 Back Propagation을 수행합니다.</p>
<h3 id="3-3-efficiency">3-3) Efficiency</h3>
<p>다음은 계산 그래프를 통해 back propagation을 수행할 때 효율적으로 미분값을 얻는 방법을 소개하겠습니다.</p>
<p><img src="https://images.velog.io/images/junhyeok1015/post/bec25f5f-3500-4832-8971-7050a0090962/image.png" alt=""></p>
<p>방법은 간단합니다.
미분을 계산할 때 한번에 다 계산을 하라는 것입니다.
각 노드의 미분 계산 값을 잘 가지고 있다가 원하는 값을 계산하고자 할 때 간단히 chain rule을 설계해 값을 대입하며 빠르게 값을 얻을 수 있을것 입니다.
(값을 저장해 추후에 local gradient 등을 다시 계산하지 않는다.)</p>
<h3 id="3-4-back-propagation-in-general-computation-graph">3-4) Back propagation in General Computation Graph</h3>
<p><img src="https://images.velog.io/images/junhyeok1015/post/4589f1aa-fabf-4e61-abc5-862643825bcb/image.png" alt=""></p>
<p>Compuation Graph의 일반적인 모습입니다.
위의 검정색 화살표 색깔로 Forward Propagation(순전파)가 진행되고 순전파가 진행된 최종 값을 바탕으로 보라색 선 방향으로 오류를 전파하며 값을 업데이트 해가는 Back propagation(역전파) 과정을 보여줍니다.</p>
<h3 id="3-5-big-o-complexity">3-5) big O() complexity</h3>
<p>순전파의 계산량을 생각해보면 각각의 Input들이 노드를 타고 연산을 거치며 최종 Scalar값까지 관여하게 됩니다.</p>
<p>역전파의 경우도 마찬가지로 Scalar 값으로 부터 순전파시 거쳐 지나갔던 노드를 지나며 Gradient를 구하게 됩니다. 이때, 앞선 3-3) efficiency 부분처럼 Local Gradient 등의 연산을 잘 저장해두었다가 필요시에 활용하게 되므로 추가적인 연산이 필요가 없게됩니다.</p>
<p>따라서, 순전파와 역전파의 시간복잡도는 동일하게 됩니다.</p>
<h3 id="3-6-gradient-checking-numeric-gradient">3-6) Gradient checking: Numeric Gradient</h3>
<p>Pytorch나 Tensorflow 등의 딥러닝 프레임워크가 잘 발달되기 이전 딥러닝 초기의 데이터 과학자들은 Neural Network의 학습을 위해 직접 손으로 Gradient를 계산하며 Weight를 업데이트 하는 방식으로 학습을 진행했습니다.</p>
<p>정확한 Gradient 계산은 성공적인 네트워크 학습의 핵심이었으며 Gradient를 잘 계산했는지 여부를 엄격하게 체크했다고 합니다.</p>
<p>Gradient를 계산하는 방법에는 2가지가 존재합니다.</p>
<ol>
<li>Analytic Gradient(해석적 방법)</li>
<li>Numerical Gradient(수치적 방법)</li>
</ol>
<p>1번의 Analytic Gradient 방법은 이 강의의 주된 내용인 계산 그래프를 통한 연산시 활용되는 Chain Rule을 이용하여 Gradient를 계산하는 방식입니다.</p>
<p>Numerical Gradient 방식에 대해 소개해드리겠습니다.</p>
<p><img src="https://images.velog.io/images/junhyeok1015/post/27a4f4a7-46c1-446e-9de9-c78d84bcfdac/image.png" alt=""></p>
<p>수치적인 방법은 해당 파라미터의 미분을 구하기 위해 미분의 공식을 이용해 계산을 하는 방법입니다.</p>
<p>다른 강의이지만 CS231N(2017) 강의에서 제시된 예시를 살펴보겠습니다.</p>
<p><img src="https://images.velog.io/images/junhyeok1015/post/e2bb6c6c-775b-4bac-986d-22d7c0a30a5f/image.png" alt=""></p>
<p>현재 위와 같은 Weight를 가지고 계산된 Loss가 주어졌습니다.</p>
<p><img src="https://images.velog.io/images/junhyeok1015/post/3bab367e-0018-403a-bce0-38781e2e2048/image.png" alt=""></p>
<p>첫번째 Weight에 대해서 굉장히 작고 0에 가까운 값을 더해 살짝 이동시켜보니 Loss가 감소했음을 알 수 있습니다.</p>
<p><img src="https://images.velog.io/images/junhyeok1015/post/1e0d0d48-9ef0-4969-9cf3-9242fabc2ab6/image.png" alt=""></p>
<p>이 Loss를 바탕으로 미분값을 계산합니다.</p>
<p><img src="https://images.velog.io/images/junhyeok1015/post/8a38f78a-56e7-45f4-a6dc-cbb748e2f56d/image.png" alt=""></p>
<p>다음 Weight를 h만큼 이동시킨 Loss가 증가했습니다.</p>
<p><img src="https://images.velog.io/images/junhyeok1015/post/e29074cf-318e-441f-bd47-f908a4ddda85/image.png" alt=""></p>
<p>마찬가지로 Loss 값을 이용해 gradient를 계산해주게 됩니다.</p>
<p>위와같은 방식을 거치며 Gradient를 계산하는 방법을 <strong>Numerical Gradient</strong> 라고 합니다.</p>
<p>Numerical Gradient는 쉽게 미분값을 얻을 수 있다는 장점이 있지만 하나의 gradient를 계산하기 위해서 f의 값을 계속해서 계산을 해주어야 해서 연산량이 매우 많다는 단점이 존재합니다.</p>
<p>반면 우리가 주로 사용하는 Chain Rule을 이용한 Analytic Gradient 계산 방법은 정확하고 빠르지만 계산 과정에서 실수가 있을 수 있다는 단점이 존재합니다.</p>
<p>이러한 단점을 보완하기 위해, 특정 Weight에 대한 미분이 잘 계산이 되었는가를 확인하기 위한 방법으로 Numerical Gradient 방법을 통해 미분을 계산해보는 Numeric Gradient Check 방식을 활용합니다.</p>
<h1 id="6-tips-and-tricks-for-neural-networks">6. Tips and Tricks for Neural Networks</h1>
<h2 id="1-regularization">1) Regularization</h2>
<p><img src="https://images.velog.io/images/junhyeok1015/post/bfccce9f-c126-4d56-a440-0c6584804228/image.png" alt=""></p>
<p>학습시키는 모델은 굉장히 많은 파라미터들을 가지고 있습니다.</p>
<p>손실함수만을 이용해 모델을 학습시키게 된다면, 모델이 학습 데이터는 잘 적합시키지만 테스트 데이터 셋은 잘 적합시키지 못하는 Overfitting(과적합)을 야기할 수 있습니다.</p>
<p>따라서 $\theta$를 감소시켜야 하는 손실함수에 $\theta$를 증가시키는 규제항을 추가하며 과적합을 방지할 수 있습니다.
주로 R2 규제항을 많이 사용하며 feature 들이 많을수록 효과적이라고 합니다.</p>
<h2 id="2-vectorization">2) Vectorization</h2>
<p><img src="https://images.velog.io/images/junhyeok1015/post/83b5064f-ee0f-4814-9aff-b99115ccac9d/image.png" alt=""></p>
<p>word vector들을 각각 돌며 Weight matrix와 행렬곱을 수행할때의 시간과 word vector들을 하나의 matrix로 합친 뒤 W와 곱연산을 했을때의 시간 차이는 10배 이상 납니다.</p>
<p>따라서 반복문을 사용하기보다는 matrix 연산을 사용하는것이 학습의 시간을 감소시키는데 효과적일것 입니다.</p>
<h2 id="3-non-linearities">3) Non-Linearities</h2>
<p><img src="https://images.velog.io/images/junhyeok1015/post/f9b2fdae-b181-4085-8222-9c77c1c9b1b7/image.png" alt=""></p>
<p>딥러닝 초기의 비선형 활성함수로는 logistic, tanh 함수가 자주 사용되었습니다.</p>
<p>하지만 두 함수 모두 exponential(지수) 연산이 필요해 연산량이 많아 Deep Learning에는 적합하지 않습니다.</p>
<p><img src="https://images.velog.io/images/junhyeok1015/post/8bc62732-5125-448c-98ce-95a9ad96a964/image.png" alt=""></p>
<p>딥러닝을 설계할때 가장 먼저 고려해야할 비선형 함수는 좌측의 ReLU입니다. 
ReLU는 가장 간단한 비선형 함수이면서도 좋은 성능을 자랑합니다.</p>
<p>ReLU는 음수값에 대한 Gradient를 0으로 취급하기 때문에 이를 보완하고자 Leaky ReLU, Parametric ReLU 등의 ReLU가 변형된 비선형 함수가 제안되고 있습니다.</p>
<h2 id="4-parameter-initialization">4) Parameter Initialization</h2>
<ol>
<li>Weight를 Small Random Value로 초기화 해야한다.</li>
<li>Hidden Layer &amp; Output의 Bias들은 0으로 초기화한다.(실제 Weight가 0이었을때 최적의 값을 얻기 위함)</li>
<li>다른 Weight들은 너무 크지도, 작지도 않은 범위 내의 Uniform distribution에서 임의로 추출한다.</li>
<li>이전 layer의 크기와 다음 layer의 크기를 고려해 가중치의 분산을 조절해주는 Xavier Initialization 방법도 많이 사용된다.
<img src="https://images.velog.io/images/junhyeok1015/post/04e847da-cb5c-4e46-847a-3b458d4c54e6/image.png" alt=""></li>
</ol>
<h2 id="5-optimizers">5) Optimizers</h2>
<p>보통의 경우 일반 SGD를 사용해도 좋은 결과 성능을 예상할 수 있습니다.
하지만 더 좋은 결과를 기대한다면 learning-rate를 적절히 조절해주는것이 필요합니다.</p>
<p>더 복잡한 신경망일 설계할 때는 &quot;Adaptive&quot; Optimizers를 사용하는 것이 더 좋습니다.
Adaptive Optimizer는 계산된 Gradient에 대한 정보를 축적하며 파라미터를 조절해가는 방식을 사용합니다.
ex) Adagrad, RMSprop, Adam, SparseAdam...</p>
<h2 id="6-learning-rates">6) Learning Rates</h2>
<p>0.001 정도의 Learning Rate로 학습을 진행할 수 있습니다.</p>
<p>Learning Rate가 너무 클때는 모델이 발산할 가능성이 있고 너무 작으면 업데이트양이 작아 학습을 느리게 합니다.</p>
<p>대부분의 경우 학습을 진행시키며 learning rate를 감소시키는것이 성능 향상에 도움이 됩니다.</p>
<h1 id="7-reference">7. Reference</h1>
<ul>
<li><a href="https://www.youtube.com/watch?v=yLYHDSv-288">https://www.youtube.com/watch?v=yLYHDSv-288</a></li>
<li><a href="https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1194/slides/cs224n-2019-lecture04-backprop.pdf">https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1194/slides/cs224n-2019-lecture04-backprop.pdf</a></li>
<li><a href="https://22-22.tistory.com/17">https://22-22.tistory.com/17</a></li>
<li><a href="https://wikidocs.net/91065">https://wikidocs.net/91065</a></li>
<li><a href="https://winixsite.wordpress.com/category/ai-ml-dl/">https://winixsite.wordpress.com/category/ai-ml-dl/</a></li>
<li><a href="https://velog.io/@tobigs-text1314/CS224n-Lecture-4-Backpropagation-and-Computation-Graph">https://velog.io/@tobigs-text1314/CS224n-Lecture-4-Backpropagation-and-Computation-Graph</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Lecture 3 - Word Window Classification, Neural Networks, and Matrix Calculus]]></title>
            <link>https://velog.io/@tobigs-text1415/Lecture-3-Word-Window-Classification-Neural-Networks-and-Matrix-Calculus</link>
            <guid>https://velog.io/@tobigs-text1415/Lecture-3-Word-Window-Classification-Neural-Networks-and-Matrix-Calculus</guid>
            <pubDate>Wed, 28 Apr 2021 08:43:04 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 동덕여자대학교 정보통계학과 <a href="https://github.com/Yu-Jin22">한유진</a></p>
<h1 id="1-classification">1. Classification</h1>
<p><img src="https://user-images.githubusercontent.com/77143767/115134702-6efe0800-a04d-11eb-9535-c5c0958dd087.png" alt="image"></p>
<ul>
<li><p>Training dataset을 i=1부터 N까지 $x_i$라는 inputs과 $y_i$라는 output(label or class)에 대해 가지고 있습니다.  </p>
<p>  <strong>input data($x_i$)</strong> : Word, Sentence, Document .. 
  <strong>output data($y_i$)</strong> : 예측하려고 하는 labels, classes
  (class에는 sentiment, named entities, buy/sell decision 또는 other words와 multi-word sequences가 올 수 있음)</p>
</li>
</ul>
<p><img src="https://user-images.githubusercontent.com/77143767/115135060-69ee8800-a050-11eb-831e-711cf87038f6.png" alt="image"></p>
<ul>
<li>이 데이터를 가지고 ML/ Deep Learning 방법으로 분류(그림과 같이 비슷한 Output끼리 모이도록 경계를 긋는 것)하는것이 Classificaiton입니다. </li>
<li>전통적인 ML접근에서는 softmax/logistic regression을 이용해서 output의 class를 구분할 decision boundary(hyperplane)를 결정하는 것을 의미합니다.  </li>
</ul>
<h3 id="softmax-classifier">&lt; Softmax classifier &gt;</h3>
<p><img src="https://user-images.githubusercontent.com/77143767/115135281-6b20b480-a052-11eb-9734-46ff5f0b43f0.png" alt="image"></p>
<ul>
<li>Softmax : $xi$가 들어오면 이를 $pi$로 바꾸고, 분류하고 싶은 class의 수 만큼 확률값을 구성하며, 모든 class의 확률값을 더하면 1이 된다는 특징을 가지고 있습니다. <blockquote>
<p> <strong>Step 1</strong>. 모든 클래스 c에 대해서 선형결합으로 이루어진 $f_y$를 만든다
  (wieght matrix W에는 각 클래스에 해당하는 열이 존재 -&gt; W의 y번째 row 와 x의 row 를 multiply -&gt; class에 관련된 score나옴)    <img src="https://user-images.githubusercontent.com/77143767/115135992-b4273780-a057-11eb-935f-bcaec6a89b57.png" alt="image">
  <strong>Step 2.</strong> 각각의 class에 대해 이를 계산하고 0~1로 정규화한다
  (step1에서 나온 score를 softmax function($\frac{e^{y_i}}{\sum_{j} e^{y_j}}$)에 집어넣음 -&gt; softmax는 이 숫자들을 확률분포로 탈바꿈)
  <img src="https://user-images.githubusercontent.com/77143767/115136007-ca34f800-a057-11eb-9b38-2c435797b591.png" alt="image"></p>
</blockquote>
</li>
</ul>
<p><img src="https://user-images.githubusercontent.com/77143767/115136165-f0a76300-a058-11eb-9db3-ceec657a450b.png" alt="image"></p>
<ul>
<li>이제 이 값을 학습할 때, 올바르게 class y값을 예측하도록 확률을 maximize하기 위해, 그 class의 negative log probability를 minimize하는 방향으로 학습을 하게 됩니다. </li>
</ul>
<h3 id="cross-entropy-loss">&lt; Cross entropy loss &gt;</h3>
<p><img src="https://user-images.githubusercontent.com/77143767/115136680-56491e80-a05c-11eb-9dc0-d6b10079a022.png" alt="image"></p>
<ul>
<li>softmax 값을 토대로 cost function을 구하는 방식</li>
<li>Concept of &quot;cross entropy&quot; is from information theory</li>
<li>실제 확률 분포를 $p$라고 하고, 예측한 확률 분포를 $q$라고 하였을 때, cross entropy는 위와 같이 정의할 수 있습니다. </li>
<li>옳은 class에만 1을 부여한다면 $p$ = [0,...,0,1,0,...0], $q$= [ 0.01,...,0.02,0.8,0.01,...,0]이기에 잘못 분류한 확률들은 0으로 사라지고 cross entropy에 남는 항은 true class의 negative log probability입니다.
( $\because p$가 one-hot)
<img src="https://user-images.githubusercontent.com/77143767/115136945-17b46380-a05e-11eb-9474-8936d7bee1f1.png" alt="image"></li>
<li>위의 식을 전체 데이터 셋으로 확장하면 다음과 같은 공식이 산출됩니다.</li>
<li>$i$ = 1 부터 $N$까지의 평균으로 loss부분을 업데이트 해주었습니다. </li>
</ul>
<p><img src="https://user-images.githubusercontent.com/77143767/115137191-98c02a80-a05f-11eb-9bf2-efdd6e364479.png" alt="image"></p>
<ul>
<li><p>하지만 단순한 Softmax/logistic regression만을 사용한 전통적인 접근 방법은 좋은 성능을 낼 수 없습니다. 그 이유는 class를 구분하는 boundary가 linear하기에 위의 그림과 같은 데이터를 잘 분류할 수 없는 경우들이 생기기 때문입니다. 이를 해결하기 위해서 비선형적인 방법을 도입하는데 그게 바로 Neural Network입니다. </p>
<h1 id="2-neural-network-in-nlp">2. Neural Network in NLP</h1>
</li>
<li><p>NLP를 위한 neural network를 사용하여 advanced된 classification 결과를 낼 수 있는 2가지 방법이 있습니다. </p>
<ol>
<li><strong>Word vector도 학습</strong> - 전통적 방법에서는 $W$만을 학습했지만 NLP에서는 word vector $x$도 한번에 학습
<img src="https://user-images.githubusercontent.com/77143767/115138575-053f2780-a068-11eb-87e2-9bb48cf04ddf.png" alt="image"></li>
<li><strong>Deeper MLP</strong> - 깊게 Layer들을 쌓으면서 효율적인 학습이 가능
<img src="https://user-images.githubusercontent.com/77143767/115138774-176d9580-a069-11eb-8535-906d3db25369.png" alt="image"></li>
</ol>
</li>
</ul>
<h2 id="named-entity-recognitionner">&lt; Named Entity Recognition(NER) &gt;</h2>
<p><img src="https://user-images.githubusercontent.com/77143767/115340555-d947b180-a1e1-11eb-94c1-9b6165159633.png" alt="image"></p>
<ul>
<li>개체명 인식(NER)은 인명, 지명 등 고유명사를 분류하는 방법론입니다. </li>
<li>NER을 위해 전통적으로 많이 이용되는 모델은 Conditional Random Field (CRF)이고, Recurrent Neural Network(RNN)모델도 많이 쓰인다고 합니다.</li>
<li>Possible uses<ol>
<li>문서에서 특정한 entity(인명, 지명 등)에 대한 언급을 추적</li>
<li>질문 답변의 경우, 답변은 주로 named entity(사람이름, 영화이름 등)</li>
<li>얻고 싶은 정보들 중의 많은 부분은 named entites간의 관계에 대한 것인 경우도 많다</li>
<li>동일한 기술들이 다른 slot-filling classifications으로 확장될 수 있다
<img src="https://user-images.githubusercontent.com/77143767/116019289-dd128280-a67e-11eb-8884-759924c8f445.png" alt="image"></li>
</ol>
</li>
<li>이를 위해 BIO인코딩을 사용합니다. B는 Begin의 약자로 개체명이 시작되는 부분, I는 Inside의 약자로 개체명의 내부 부분을 의미하며, O는 Outside의 약자로 개체명이 아닌 부분을 의미합니다.</li>
</ul>
<h4 id="ner의-한계">NER의 한계</h4>
<blockquote>
<p><strong>ex 1)</strong> First National Bank Donates 2 Vans To Future School Of Fort Smith
  <strong>ex 2)</strong> To find out more about Zig Ziglar and read features by other Creators Syndicate writers and
  <strong>ex 3)</strong> where Larry Ellison and Charles Schwab can live discreetly amongst wooded estates.</p>
</blockquote>
<ol>
<li><p><strong>entity(개체)의 경계</strong>를 정하기 어렵다
(ex1의 첫번째 entity를 First National Bank로? National Bank로?)</p>
</li>
<li><p><strong>entity(개체)인지 아닌지</strong> 알기가 어렵다
(ex1의 Future School을 entity로 볼 것인가? &#39;미래의 학교&#39; 라는 일반적인 단어로 볼 것인가)</p>
</li>
<li><p><strong>모르는 entity(개체)</strong>에 대해 <strong>class</strong>를 알기 힘들다
(ex2의 Zig Ziglar가 사람임에도 class를 알기 어렵)</p>
</li>
<li><p>Entity class는 <strong>모호</strong>하고 <strong>문맥에 의존</strong>한다
(ex3의 Charles Schwab은 보통 organization name으로 사용되나 이 문장에서는 person으로 사용됨)</p>
<p><small> ※ 참고하면 좋을듯한 NER 자료 ※
<a href="https://lovit.github.io/nlp/2019/02/16/logistic_w2v_ner/">https://lovit.github.io/nlp/2019/02/16/logistic_w2v_ner/</a>
<a href="https://lovit.github.io/nlp/2018/06/22/crf_based_ner/">https://lovit.github.io/nlp/2018/06/22/crf_based_ner/</a>
<a href="http://oak.go.kr/central/journallist/journaldetail.do?article_seq=10192">http://oak.go.kr/central/journallist/journaldetail.do?article_seq=10192</a> </small></p>
</li>
</ol>
<h2 id="binary-word-window-classification">&lt; Binary word window classification &gt;</h2>
<ul>
<li>word classification은 single word만 갖고 이루어지는 경우는 상당히 드물고, 보통 context 내에서 이루어집니다. </li>
<li>하지만, context 상에도 여러 문제가 발생할 수 있습니다. 
ex) auto-antonyms(자동-반의어)
  &quot;To sanction&quot; can mean &quot;to permit&quot; or &quot;to punish”
  &quot;To seed&quot; can mean &quot;to place seeds&quot; or &quot;to remove seeds&quot;</li>
<li>이처럼 문맥상에서 애매모호하게 일어나는 것들에 대한 분류를 도와주는 방법론이 window classification입니다.<h2 id="window-classification">&lt; Window classification &gt;</h2>
</li>
<li>Idea : <strong>중심 단어와 주변 단어들(context)를 함께 분류문제에 활용</strong>하는 방법</li>
<li>가장 간단한 방법으로는 context내 단어를 분류하기위해 window내의 word vectors를 average하고, 그 average vector를 분류하는 것입니다. 하지만 position information을 잃어버리는 단점이 있습니다.</li>
<li>그렇다면! <strong>window 내에서 word vector와 그 neighbor들을 concatenate한 후 softmax classifier를 훈련하여 분류를 해보자!</strong>
<img src="https://user-images.githubusercontent.com/77143767/115349347-b53e9d00-a1ee-11eb-9437-55eca71e5d0f.png" alt="image"></li>
<li>$Paris$를 분류하고 싶다고하면, 이때 $Paris$의 +-2 총 다섯개의 word vectors을 합쳐 5d 크기의 vector를 형성하고 이 vector를 활용해 classifer를 제작합니다. </li>
</ul>
<h3 id="window-classification--softmax">Window classification : Softmax</h3>
<ul>
<li>이제 위의 vector에 대해서 $w$를 학습하고 softmax classifier를 통해 분류해보겠습니다. 
<img src="https://user-images.githubusercontent.com/77143767/115355606-c9d26380-a1f5-11eb-9c32-ae34dcf5ea27.png" alt="image"></li>
<li>$x$대신 $x_{window}$를 input으로 주어 위에서 봤던 softmax를 적용합니다.</li>
<li>Word2Vec과 유사하게 corpus내의 모든 위치에 대해서 학습할것이지만, 이번에는 high score을 가지는 위치에 대해서만 집중적으로 학습을 진행합니다. 
<img src="https://user-images.githubusercontent.com/77143767/115359492-b0cbb180-a1f9-11eb-912b-a32cba228cfe.png" alt="image"></li>
<li>예를 들어 $X_{Paris}$가 &#39;Location&#39;으로 분류될 수 있는지를 알고 싶습니다. </li>
<li>오직 &#39;museums in Paris are amazing&#39; 이라는 하나의 window만이 Paris가 center에 있기 때문에 ‘True’ window로 표현하고, 그 외의(Not all museums in Pares와 같은) window들은 모두 &#39;Corrupt&#39; window로 표현됩니다.</li>
<li>이때 우리는 score를 return하는 시스템을 원하기 때문에, 중앙에 Location name이 있으면 높은 점수를, 없으면 낮은 점수를 return합니다.</li>
<li>3-layer NN으로 window&#39;s score를 계산합니다. 
<img src="https://user-images.githubusercontent.com/77143767/115364563-7a446580-a1fe-11eb-9bba-1421a89f7170.png" alt="image"></li>
<li>input으로 20x1 vector를 가진 $x$가 들어가면 hidden layer는 20차원을 받아 8개의 노드를 생성하게 됩니다(비선형 함수 통과). 마지막 layer에서는 8개노드를 받아 1개의 score를 산출하게 됩니다. 이 score값을 확률로 만들기 위해 위에서 보았던 softmax를 취해주고 negative log probability의 합으로 계산해서 $W$를 업데이트 시켜주면 됩니다.</li>
</ul>
<h3 id="the-max-margin-loss">The max-margin loss</h3>
<ul>
<li>일반적으로 softmax를 사용할 경우, 값을 확률 비율로 변경했기 때문에 비율간의 차이를 계산하는 Cross-entropy를 사용합니다. 하지만, 위에서 score함수를 직접 정의했으므로 여기에서는 이에 걸맞는 max-margin loss(hinge loss)를 이용합니다.
<img src="https://user-images.githubusercontent.com/77143767/115379729-c3031b00-a20c-11eb-9d68-82c53c5c9682.png" alt="image"></li>
<li>max margin loss는 SVM에서 많이 사용되는데, 그 의미가 정답과 오답 사이의 거리를 최대로 만들어주는 margin을 찾는 것입니다. 쉽게 말하면 주어진 input X에 대하여 정답 class와 오답 class 간의 차이를 max로 만들어주는 손실함수입니다.  <blockquote>
<p>*<em>margin이란? *</em>
binary 분류에서 결정 경계와 서포트 벡터(결정 경계와 가장 가까이에 있는 데이터) 사이의 거리를 뜻함
margin을 최대화 하는 것이 SVM의 목적
<img src="https://user-images.githubusercontent.com/77143767/115381023-20e43280-a20e-11eb-8b53-4377b25a6e69.png" alt="image"></p>
</blockquote>
</li>
</ul>
<p><img src="https://user-images.githubusercontent.com/77143767/115382964-3a867980-a210-11eb-8817-9f0ef5ced0ac.png" alt="image"></p>
<ul>
<li>우리는 max-margin 손실함수를 통해 손실값을 구했습니다. 이제 이 손실값에 각 파라미터 $W$, $U$, $b$, $X$가 손실값에 얼마나 많은 기여를 했는지 알아보고 해당 기여도에 따라 각 parameter 값을 조정할 수 있겠습니다.<h1 id="3-matrix-calculus">3. Matrix calculus</h1>
<h2 id="jacobian-matrix">&lt; Jacobian Matrix &gt;</h2>
<img src="https://user-images.githubusercontent.com/77143767/115482068-cb00a080-a288-11eb-9eac-5e3f1e8484b4.png" alt="image"></li>
<li>왼쪽은 함수 한개를 미분한 예입니다. n개의 input을 넣으면 한개의 output을 받게됩니다. 이를 미분하면 $f(x)$는 n개의 input으로 각각 미분되어 하나의 벡터로 만들어지게 됩니다.</li>
<li>왼쪽과 같이 한개의 함수안에 n개의 input이 들어가고, 이러한 함수가 m개 있다고 가정했을때, 이를 미분하면 n*m matrix가 되고 이 matrix를 Jacobian Matrix라고 합니다. <h2 id="chain-rule">&lt; Chain Rule &gt;</h2>
<img src="https://user-images.githubusercontent.com/77143767/115484068-09985a00-a28d-11eb-8250-f25005ee1db3.png" alt="image"></li>
<li>합성함수의 도함수에 대한 공식입니다.</li>
<li>one-variable뿐 아니라 multiple variable에 대해서도 chain rule이 적용됨을 알 수 있습니다. </li>
<li>Jacobian Matrix와 chain rule의 개념 + 앞으로 나올 4개의 식이 위에서 보았던 window classification의 손실 함수를 최소화하기 위해 미분하는 과정에서 사용되는 식들입니다.</li>
</ul>
<h3 id="계산-start">계산 Start~</h3>
<p><img src="https://user-images.githubusercontent.com/77143767/115493775-56852c00-a29f-11eb-9ec3-94d66330c9ca.png" alt="image"></p>
<ul>
<li>첫번째 식입니다. $h$는 $z(Wx+b)$를 input으로 집어넣어 활성화함수를 적용해 나온 식입니다. 이를 $z$로 미분하면 nxn의 matrix형태로 나오게 됩니다.</li>
</ul>
<p><img src="https://user-images.githubusercontent.com/77143767/115493674-1f167f80-a29f-11eb-8e0d-4ac3872d0a4f.png" alt="image"></p>
<ul>
<li>nxn의 matrix형태를 미분해보면, $h_i$는 $f(z_i)$로 나타낼 수 있다고 강의에서 언급했습니다. 계속보면, $i$ = $j$일때 $f&#39;(z_i)$라는 값이 나오게되고,  다른 경우는 미분값이 0이됩니다. 이를 행렬로 표현하면 대각 행렬이 나오게 됩니다.</li>
</ul>
<p><img src="https://user-images.githubusercontent.com/77143767/115493987-b54aa580-a29f-11eb-9a49-d0b3f13e303d.png" alt="image"></p>
<ul>
<li>두번째 식은 $Wx+b$를 $x$로 미분하면 $W$가 나온다는 의미이고, 세번째 식은 $b$로 미분하면 항등행렬이 나오고, 마지막 식은 $u^Th$를 $u$로 미분하면 $h$를 전치한 값이 나오게됩니다. </li>
</ul>
<p><img src="https://user-images.githubusercontent.com/77143767/115494514-c942d700-a2a0-11eb-92d9-489caa2669fc.png" alt="image"></p>
<ul>
<li>이제 적용해봅시다! Jacobian Matrix와 chain rule의 개념 + 지금까지 나온 4개의 식을 이용하여 우리가 정의했던 score함수의 gradient를 계산해보겠습니다.</li>
<li>우리가 구하고자 하는 것은 <strong>$\frac{\partial s}{\partial W}$ &amp; $\frac{\partial s}{\partial b}$</strong> 입니다.</li>
</ul>
<p><img src="https://user-images.githubusercontent.com/77143767/115495864-81717f00-a2a3-11eb-82f7-148e2a3959d4.png" alt="image"></p>
<ul>
<li>chain rule을 적용하여 위의 그림과 같이 각각 미분하여 곱하면 $\frac{\partial s}{\partial b}$가 나오게 됩니다.</li>
</ul>
<p><img src="https://user-images.githubusercontent.com/77143767/115496619-04dfa000-a2a5-11eb-8bf9-8941cf42a5bf.png" alt="image"></p>
<ul>
<li><p>위에서 구했었던 계산식 4개를 대입해주면 최종적인 식이 도출되게 됩니다.</p>
</li>
<li><p>이번엔 $\frac{\partial s}{\partial W}$를 계산해보겠습니다.</p>
</li>
<li><p>bias로 미분하여 업데이트를 시킬뿐아니라 모든 파라미터에 대해서도 역전파를 수행하여 파라미터 값들을 업데이트해줘야합니다. 
<img src="https://user-images.githubusercontent.com/77143767/115497377-7ff58600-a2a6-11eb-9e7b-2e2e37ee6092.png" alt="image"></p>
</li>
<li><p>똑같이 chain rule을 적용하면 사진과 같은 식이 만들어집니다.</p>
</li>
</ul>
<p><img src="https://user-images.githubusercontent.com/77143767/115497779-45d8b400-a2a7-11eb-8e06-c3ff4b2960e7.png" alt="image"></p>
<ul>
<li><p>$\frac{\partial s}{\partial W}$와 $\frac{\partial s}{\partial b}$식을 보면 파란색 부분이 동일한 것을 볼 수 있습니다. 그 파란색 부분은 $\delta$라고 합니다. 이렇듯 오차 역전파는 계산했던 지난 과정들이 다시 사용됨으로써 다시 계산하여 계산량을 늘리는 문제를 막을 수가 있는 것이 장점입니다.</p>
</li>
<li><p>그렇다면 $s$를 $W$ matrix로 미분하게 되면 어떻게 될까요?
<img src="https://user-images.githubusercontent.com/77143767/115499679-cb119800-a2aa-11eb-8e4f-fe3b4ed08a4c.png" alt="image"></p>
</li>
<li><p>$W$ matrix면 n*m matrix로 값이 나오고, 위에서 계산했던 초록색박스를 사용하면 $\delta x$라는 값이 도출되게 됩니다. </p>
</li>
</ul>
<p><img src="https://user-images.githubusercontent.com/77143767/115500541-70793b80-a2ac-11eb-947b-29db79ee17b6.png" alt="image"></p>
<ul>
<li>도출된 값에 전치를 한 이유는 위의 n*m matrix와 같은 dimesion을 갖추기 위해서 전치라는 trick을 주었다고 이해했습니다.</li>
</ul>
<hr>
<h4 id="reference">Reference</h4>
<p><a href="http://web.stanford.edu/class/cs224n/slides/cs224n-2021-lecture03-neuralnets.pdf">http://web.stanford.edu/class/cs224n/slides/cs224n-2021-lecture03-neuralnets.pdf</a>
<a href="https://eda-ai-lab.tistory.com/123?category=706160">https://eda-ai-lab.tistory.com/123?category=706160</a>
<a href="https://happyzipsa.tistory.com/4">https://happyzipsa.tistory.com/4</a>
<a href="https://data-weirdo.github.io/data/2020/10/09/data-nlp-03.Wwc/">https://data-weirdo.github.io/data/2020/10/09/data-nlp-03.Wwc/</a>
<a href="http://dsba.korea.ac.kr/seminar/?mod=document&amp;uid=42">http://dsba.korea.ac.kr/seminar/?mod=document&amp;uid=42</a>
<a href="https://velog.io/@tobigs-text1314/CS224n-Lecture-3-Word-Window-Classification-Neural-Networks-and-Matrix-Calculus#4-matrix-calculus">https://velog.io/@tobigs-text1314/CS224n-Lecture-3-Word-Window-Classification-Neural-Networks-and-Matrix-Calculus#4-matrix-calculus</a>
<a href="https://wikidocs.net/30682">https://wikidocs.net/30682</a>
<a href="https://stellarway.tistory.com/29">https://stellarway.tistory.com/29</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Lecture 2 - Word Vectors and Word Senses]]></title>
            <link>https://velog.io/@tobigs-text1415/Lecture-2-Word-Vectors-and-Word-Senses</link>
            <guid>https://velog.io/@tobigs-text1415/Lecture-2-Word-Vectors-and-Word-Senses</guid>
            <pubDate>Wed, 14 Apr 2021 09:56:03 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 동덕여자대학교 정보통계학과 <a href="https://github.com/Yu-Jin22">한유진</a></p>
<h1 id="1-word2vec">1. Word2Vec</h1>
<ul>
<li><p>one-hot encoding의 단점(각 단어 간의 유사도 계산X)을 극복하기 위해 나온 개념입니다.</p>
</li>
<li><p><strong>main idea</strong> : 비슷한 위치에서 등장하는 단어들은 비슷한 의미를 가집니다.
<img src="https://user-images.githubusercontent.com/77143767/114328198-c7796500-9b76-11eb-8d45-8edd8eb0c9a8.png" alt="image"></p>
</li>
<li><p>CBOW 방식 : context word(맥락 단어)의 one-hot vector가 입력, 중심 단어의 on-hot vector가 출력인 경우</p>
</li>
<li><p>Skip-gram 방식 : 중심 단어의 on-hot vector가 입력, context word(맥락 단어)의 one-hot vector가 출력인 경우
<img src="https://user-images.githubusercontent.com/77143767/114329536-8f742100-9b7a-11eb-9d5f-8093393aa6e0.png" alt="image"></p>
</li>
<li><p>이러한 모델들의 Loss를 최소화 시키기 위해 Gradient Descent를 이용하여 가중치를 계속적으로 업데이트합니다.</p>
</li>
<li><p>하지만 Gradient Descent는 loss를 계산할때 전체 train set을 사용하기에 많은 계산량이 필요합니다. 본강의에서는 이를 보완하고 Word2Vec의 효율성을 높이기 위한 3가지 방법을 소개합니다.</p>
</li>
</ul>
<h2 id="1-1-word2vec의-효율성을-높이는-방법">1-1 Word2Vec의 효율성을 높이는 방법</h2>
<h3 id="1-stochastic-gradient-descentsgd">1) Stochastic Gradient Descent(SGD)</h3>
<p><img src="https://user-images.githubusercontent.com/77143767/114330156-11187e80-9b7c-11eb-8d19-83274a534693.png" alt="image"></p>
<ul>
<li>학습 데이터 중에서 랜덤하게 샘플을 한개씩 뽑아 gradient를 계산한 후에 업데이트하는 방식입니다.</li>
<li>장점 : 계산량이 적고 학습이 빠르고 local minimum에 빠지지 않고 학습될 수 있습니다.</li>
<li>단점 : 성능이 좋지 못하고, wore vector가 매우 sparse해집니다.(벡터나 행렬이 sparse하다는 것은 벡터나 행렬의 값 중 대부분이 0이고 몇몇 개만 값을 갖고 있다는 것을 뜻함. one-hot encoding으로 만들어진 벡터는 0이 대부분이기 때문에 sparse한 벡터가 되는 것)
<img src="https://user-images.githubusercontent.com/77143767/114330819-85075680-9b7d-11eb-965a-67990d5ab0fd.png" alt="image"></li>
<li>이렇게 Sparse한 vector는 0에 해당되는 위치에서 계산을 해도 계속해서 0이기에 gradient가 update되지 않습니다. -&gt; 불필요한 계산이 일어나 SGD에서 문제가 발생합니다. </li>
</ul>
<h3 id="2-negative-sampling">2) Negative Sampling</h3>
<p><img src="https://user-images.githubusercontent.com/77143767/114389156-9bd69900-9bcf-11eb-8529-1ebfd627695d.png" alt="image">
(본강의에서 Skip-gram을 예시로 설명하였습니다)</p>
<ul>
<li>Word2Vec은 출력층이 내놓는 스코어값에 softmax를 적용해 확률값으로 변환한 후 이를 정답과 비교해 backpropa하는 구조 -&gt; 계산량 매우 많습니다.</li>
<li>negative sampling는 말그대로 parameter을 update시킬 negative sample을 뽑는것입니다. 단어에 대한 어떤 노이즈 분포 $P(w)$를 가정하고, 분석 대상이된 corpus외에 가정한 분포로 부터 random sampling with probability방식으로 학습할 단어 몇개를 추출하여 목적함수를 근사하는 방법입니다. 논문에 따르면 다음의 식과 같이 unigram model의 3/4 power를 적용한것이 실험결과가 가장 좋다고 합니다 
$P(w) = \frac{U(w)^{3/4}}{Z}$</li>
</ul>
<h4 id="objective-function">objective function</h4>
<ul>
<li><p><strong>main idea</strong> : true pair와 noise pair에 대해 binary logistic regression을 훈련
<img src="https://user-images.githubusercontent.com/77143767/114388837-32568a80-9bcf-11eb-8895-dfbd6eb3327a.png" alt="image"></p>
<p> $c$ : 중심 벡터
 $o$ : 맥락 벡터
 $k$ : 노이즈 벡터 (랜덤하게 선택된 벡터. 실제 맥락벡터 아님)
 $u$ : 중심 벡터와 hidden layer 사이의 가중치
 $v$ : 맥락 벡터와 hidden layer 사이의 가중치 </p>
</li>
<li><p>negative sample의 목적함수를 작아지게 만들어야합니다. $u^Tv$는 중심 벡터와 맥락 벡터간 코사인 유사도를 의미하기 때문에 앞에 term은 실제이니까 커지길 원하고, 뒤에 term은 negative sample을 분류하기 위한식이기 때문에 작아지길 원합니다. 즉 True pair는 중심 벡터와 맥락 벡터가 가까이 있을수록(코사인 유사도가 클수록) 손실이 0에 가깝고, Noise pair는 중심 벡터와 노이즈 벡터가 멀리 있을수록(코사인 유사도가 작을수록) 손실이 0에 가까움을 의미합니다. </p>
</li>
</ul>
<h3 id="3-subsampling-frequent-words">3) Subsampling Frequent words</h3>
<ul>
<li>자주 등장하는 단어는 적게 등장하는 단어들 보다 정보의 가치가 떨어집니다. 그렇기에 말뭉치에서 자주 등장하는 단어는 학습량을 확률적으로 감소시키는 기법입니다. </li>
<li>subsampling은 특정 단어 몇개를 분석에서 제외하는 점이 매 iteration마다 몇개의 단어만 학습하는 negative sampling과 구분되어집니다.</li>
<li>i번째 단어(𝑤𝑖)를 학습에서 제외시키기 위한 확률은 아래와 같습니다.
<img src="https://user-images.githubusercontent.com/77143767/114335807-7d997a80-9b88-11eb-84bb-98b0c06aabb4.png" alt="image"></li>
<li>𝑓(𝑤𝑖)는 해당 단어가 말뭉치에 등장한 비율(해당 단어 빈도/전체 단어수)를 말합니다. 𝑡는 하이퍼파라미터로 연구팀에선 0.00001을 권하고 있습니다.</li>
<li>만일 𝑓(𝑤𝑖)가 0.01로 나타나는 빈도 높은 단어(&#39;은/는&#39;)는 위 식으로 계산한 𝑃(𝑤𝑖)가 0.9684나 되어서 100번의 학습 기회 가운데 96번 정도는 학습에서 제외하게 됩니다. 반대로 등장 비율이 적어 𝑃(𝑤𝑖)가 0에 가깝다면 해당 단어가 나올 때마다 빼놓지 않고 학습을 시키는 구조입니다. 
cf) subsampling과 negative sampling에 쓰이는 확률값들은 고정된 값이기 때문에 학습을 시작할 때 미리 구해놓게 됩니다. <h1 id="2-count-based--co-occurrence-matrix동시발생행렬">2. Count Based : Co-occurrence matrix(동시발생행렬)</h1>
</li>
<li>word prediction methods에는 <strong>count based</strong>와 <strong>direct prediction</strong>, 크게 두가지 범주로 나눌 수 있습니다. </li>
<li>Skip-gram은 중심 단어를 기준으로 맥락 단어가 등장할 확률을 계산하기 때문에 window size를 늘려도 전체 단어의 동반출현 빈도수와 같은 통계정보를 내포하지 못합니다. 이러한 정보를 global co-occurrence statistics라고 합니다.이를 위해 count-based의 Co-occurrence matrix가 등장하게 되었습니다.
<img src="https://user-images.githubusercontent.com/77143767/114342599-0ddebc00-9b97-11eb-8375-7268e285fbdc.png" alt="image"></li>
</ul>
<h3 id="1-window-based-co-occurrence-matrix-단어-문맥-행렬">1) Window based co-occurrence matrix (단어-문맥 행렬)</h3>
<ul>
<li>아래 그림은 문장들을 window size가 1인 co-occurrence matrix로 표현한 예제입니다.</li>
<li>Word2Vec과 매우 유사하며 한 문장을 기준으로 window에 각 단어가 몇 번 등장하는 지를 세어 구성합니다. syntatic(구문분석),semantic(의미분석)한 정보를 얻을 수 있습니다.</li>
<li>co-occurrence matrix가 대각을 기준으로 대칭하기 때문에 좌우측 어디서 등장하는지는 고려하지 않습니다.
<img src="https://user-images.githubusercontent.com/77143767/114344745-58face00-9b9b-11eb-94ac-d5be9bf9bfc9.png" alt="image"></li>
</ul>
<h3 id="2-word-document-matrix-단어-문서-행렬">2) Word-Document matrix (단어-문서 행렬)</h3>
<ul>
<li>한 문서를 기준으로 단어의 등장 횟수를 행렬로 나타내는 방법입니다. Word-Document matrix는 관계가 있는 단어가 같은 문서에서 빈번하게 등장할 것이라는 전제에서 출발합니다. LSA(잠재적 의미 분석)를 가능하게 하는 기법입니다.
<img src="https://user-images.githubusercontent.com/77143767/114345832-63b66280-9b9d-11eb-918b-8375d5c5a226.png" alt="image"></li>
<li>하지만 단어의 개수가 증가함에 따라 차원이 커지게 되고, 저장공간을 많이 필요로 하는 문제들이 발생하기 때문에 차원을 low하게 만들어주어야 합니다. </li>
<li>주로 해당 matrix를 만든 뒤 SVD, LSA, HAL, LSI등의 방법을 통해서 차원을 축소해서 사용합니다. <h1 id="3-gloveglobal-vectors-for-word-representation">3. GloVe(Global Vectors for Word Representation)</h1>
</li>
<li>count based와 direct prediction의 장점을 동시에 가진 GloVe가 등장하게 됩니다. </li>
<li>corpus 전체의 통계정보 사용(co-occurrence matrix 장점) + 임베딩된 단어벡터 간의 유사도 측정 가능(Word2Vec 장점)
<img src="https://user-images.githubusercontent.com/77143767/114342599-0ddebc00-9b97-11eb-8375-7268e285fbdc.png" alt="image"></li>
</ul>
<h2 id="3-1-objective-function">3-1 objective function</h2>
<ul>
<li>GloVe의 목적함수를 설계하기 전에 다음 표를 확인해봅시다.
$X$ : 단어간의 co-occurrence matrix 
$X_{ik}$ : $k$번째단어가 $i$번째 단어와 같은 context 내에 등장한 빈도수 
$X_{i} = \sum_{k} X_{ik}$ : $i$번째 단어와 같은 context 내에 등장한 모든 단어들의 빈도수의 총합 
$P_{ik}=p(k|i) = \frac{X_{ik}}{X_{i}}$ : $i$번째 단어 주변(윈도우 크기는 사용자 지정)에 $k$번째 단어가 등장할 조건부확률
<img src="https://user-images.githubusercontent.com/77143767/114349697-379de000-9ba3-11eb-991e-4c4ea84acfa0.png" alt="image"></li>
<li>두 개의 단어 $i = ice$, $j = steam$ 이라고 가정했을때, 이 두 단어의 관계는 새로운 다른 단어 $k$ 와의 co-occurrence 확률을 이용해서 구할 수 있습니다.(두 단어의 차이점을 분석하기 위해서 $k$와 어떤 관계인지를 먼저 분석하는 것)</li>
<li>$solid$ -&gt; $steam$보다는 $ice$와 자주등장
$gas$ -&gt; $ice$보다는 $steam$과 자주등장
$water, fashion$ -&gt; 둘다 관련있거나 없어서 1에 가까움</li>
</ul>
<h3 id="objective-function-유도">objective function 유도</h3>
<ul>
<li><p>crucial insight : <strong>임베딩 된 중심 단어와 주변 단어 벡터의 내적이 전체 corpus에서의 동시 등장 확률이 되도록 만드는 것</strong></p>
</li>
<li><p>아래의 식을 만족하는 $F$를 찾는것입니다.<br>
$F(w_i,w_j,\tilde{w}<em>k) = \frac{P</em>{ik}}{P_{jk}}$   - (1) 
$F(w_{ice},w_{steam},w_{solid}) = \frac{P_{ice,solid}}{P_{steam,solid}} = \frac{P(solid|ice)}{P(solid|steam)} = \frac{1.9 \times 10^{-4}}{2.2 \times 10^{-5}} = 8.9$ <br><br></p>
</li>
<li><p>하지만 단어 벡터 공간은 Linear structure를 가지고, 단어 $i,j$가 각각 단어 $k$와 동시 등장할 확률의 차이를 보는것이 목적이기 때문에 아래와 같이 $F$를 수정해줍니다.<br>
$F(w_i - w_j,\tilde{w}<em>k) = \frac{P</em>{ik}}{P_{jk}}$   - (2)<br><br></p>
</li>
<li><p>좌변은 벡터, 우변은 스칼라 값을 가지기 때문에 단위를 맞춰줍니다.<br> 
$F((w_i - w_j)^T\tilde{w}<em>k) = \frac{P</em>{ik}}{P_{jk}}$   - (3)</p>
</li>
</ul>
<blockquote>
<p>&lt;$F$는 다음 3가지 조건을 충족시켜야합니다&gt;
    1. 중심 단어는 context word로도 등장할 수 있기 때문에 단어 벡터간의 교환법칙 성립 
       $w \leftrightarrow \tilde{w}$  <br>
    2. co-occurrence matrix X는 대칭행렬(symmetric matrix)
        $X \leftrightarrow X^T$<br>
    3. homomorphism(준동형) 조건 만족<br>        $F(X-Y) = \frac{F(X)}{F(Y)}$<br>        cf) <a href="https://wikidocs.net/22885">homomorphism(준동형)</a> ... $F(X+Y) = F(X)F(Y), \forall a, b \in \mathbb{R}$</p>
</blockquote>
<ul>
<li><p>이러한 조건을 만족시키는 함수는 지수함수이기 때문에 적용시키면 (4)와 같은 식이 만들어집니다. ($e^{x-y} = \frac{e^x}{e^y}$) <br>
$F((w_i - w_j)^T\tilde{w}_k) = F(w_i^T\tilde{w}_k - w_j^T\tilde{w}_k) = \frac{F(w_i^T\tilde{w}_k)}{F(w_j^T\tilde{w}_k)}$  - (4) <br><br></p>
</li>
<li><p>(4)번 식에 (3)번 식을 적용하면 (5)번과 같은 식을 도출할 수 있습니다.<br>
$F((w_i - w_j)^T\tilde{w}<em>k) = \frac{P</em>{ik}}{P_{jk}}$ - (3)<br>
$F((w_i - w_j)^T\tilde{w}<em>k) = F(w_i^T\tilde{w}_k - w_j^T\tilde{w}_k) = \frac{F(w_i^T\tilde{w}_k)}{F(w_j^T\tilde{w}_k)}$  - (4) <br>
$F(w_i^T\tilde{w}_k) = P</em>{ik} = \frac{X_{ik}}{X_i}$   -(5)<br><br></p>
</li>
<li><p>$F$는 지수함수이기 때문에 $log$를 취할 수 있게 됩니다.<br>
$w_i^T\tilde{w}<em>k = log(P</em>{ik}) = log(X_{ik}) - log(X_i)$ - (6)<br>
$w_k^T\tilde{w}<em>i = log(P</em>{ki}) = log(X_{ki}) - log(X_k)$ - (6)<br><br></p>
</li>
<li><p>(6)식에서 교환법칙 성립을 위해서 고정값인 $log(X_i)$를 $bias$ $term$으로 대체하였습니다.<br>
$w_i^T\tilde{w}<em>k = log(X</em>{ik}) - b_i - \tilde{b}<em>k$ <br>
$w_i^T\tilde{w}_k + b_i + \tilde{b}_k = log(X</em>{ik})$ - (7) <br><br></p>
</li>
<li><p>지금까지 유도한 GloVe의 손실함수입니다.
<img src="https://user-images.githubusercontent.com/77143767/114646719-be26fe80-9d16-11eb-835a-a0e4818cf1be.png" alt="image"></p>
</li>
<li><p>하지만, $X_{ij} = 0$이면 $log(X_{ij}) \to \infty$ 이런 문제 때문에 손실함수에 weighting funtion을 함께 사용했습니다. $f(0) = 0$</p>
</li>
<li><p>또한, 사용될 가능성이 적은 단어들은 overweight되지 않아야하고, 특정단어의 빈도수가 매우 높아 $X_{ij}$값이 튀는 현상을 방지하기 위해서도 weighting funtion이 사용되었습니다. </p>
</li>
<li><p>$x_{max} = 100, \alpha = \frac{3}{4}$</p>
</li>
<li><p>최종 Glove의 손실함수입니다.
<img src="https://user-images.githubusercontent.com/77143767/114646782-dac33680-9d16-11eb-884f-8853fd1fa8c7.png" alt="image"></p>
</li>
<li><p>GloVe는 학습속도가 빠르며, Huge corpora에 대해서도 확장성을 가지기 때문에 small corpus나 small vector size에서도 좋은 성능을 보입니다. </p>
</li>
</ul>
<h2 id="3-2-result">3-2 Result</h2>
<ul>
<li><p>frog와 형태적으로 또는 의미적으로 비슷한 단어를 잘 선택합니다.(rare한 단어들에 대해서도 성능 good)
<img src="https://user-images.githubusercontent.com/77143767/114372865-fc100f80-9bbc-11eb-9c2d-f26999a9349a.png" alt="image"></p>
</li>
<li><p>반의어 관계에 있는 단어쌍들이 비슷한 간격으로 2차원의 공간 내에 위치하고 있습니다. 
<img src="https://user-images.githubusercontent.com/77143767/114373711-d5060d80-9bbd-11eb-924c-c684327accfa.png" alt="image"></p>
<h1 id="4-how-to-evaluate-word-vector">4. How to evaluate word vector?</h1>
</li>
</ul>
<p>word embedding모델의 평가방법에 대해서 소개하겠습니다. 크게 <strong>외적(extrinsic)</strong>평가와 <strong>내적(intrinsic)</strong>평가로 나눌 수 있습니다.</p>
<h2 id="1-extrinsic-evaluation">1) Extrinsic Evaluation</h2>
<ul>
<li><strong>현실 문제에 직접 적용</strong>했을때의 성능을 평가하는 방식입니다. </li>
<li>각종 자연어처리 system에 embedding을 직접 사용하여 시스템의 성능을 측정합니다. 대표적으로 NER(개체명 인식기)가 있습니다. </li>
<li>계산속도가 느립니다. </li>
<li>어떤 시스템이 문제인지, 아니면 시스템간의 교호작용 때문인지 평가하기가 어렵습니다.</li>
<li>밑에 평가표를 보면, 다른모델들에 비해 GloVE가 좋은 성능을 내는 것을 알 수 있습니다.
<img src="https://user-images.githubusercontent.com/77143767/114305651-1641e300-9b14-11eb-8d2c-d2b5dd07bc5e.png" alt="image"></li>
</ul>
<h2 id="2-intrinsic-evaluation">2) Intrinsic Evaluation</h2>
<ul>
<li><strong>word embedding 자체의 성능</strong>을 측정하기 위해 specific/intermediate subtask를 통해 성능을 평가합니다.</li>
<li>계산속도가 빠릅니다. </li>
<li>현실 문제와의 상관관계가 확립되지 않는 한 실제로 도움이 되는지 판단하기 어렵습니다. </li>
</ul>
<h3 id="2-1-intrinsic-evaluation---word-analogies">2-1) Intrinsic Evaluation - word analogies</h3>
<ul>
<li>A:B :: C:? 에서 물음표에 들어갈 단어를 유추하는 문제입니다.(ex.man:woman :: king:?)
<img src="https://user-images.githubusercontent.com/77143767/114306125-ce23c000-9b15-11eb-9743-1fbbc1e3bd87.png" alt="image"></li>
<li>?를 d라고 했을때, 다음식을 만족하는 d값을 찾는 것이라고 할 수 있습니다.
<img src="https://user-images.githubusercontent.com/77143767/114306214-2955b280-9b16-11eb-8b26-256bb9c492e2.png" alt="image"></li>
<li>GloVe는 Semantic Word Analogies(의미론적 유추), Syntactic Word Analogies(구문적 유추) 모두에서 좋은성능을 보이는 것을 알 수 있습니다. 
<img src="https://user-images.githubusercontent.com/77143767/114306363-c1539c00-9b16-11eb-95fc-934d9f314f68.png" alt="image"></li>
</ul>
<h3 id="2-2-intrinsic-evaluation---correlation-evaluation">2-2) Intrinsic Evaluation - correlation evaluation</h3>
<ul>
<li>사전에 만들어 놓은 단어 쌍을 사람이 평가한 점수와, word vector간 거리 사이의 상관관계를 계산하여 word embedding이 잘되었는지를 평가하는 방식입니다. </li>
<li>GloVe가 좋은 성능을 보이는 것을 알 수 있습니다. 
<img src="https://user-images.githubusercontent.com/77143767/114306939-805c8700-9b18-11eb-9f0f-d166946e1928.png" alt="image"></li>
</ul>
<h1 id="5-word-senses-and-word-sense-ambiguity">5. Word senses and word sense ambiguity</h1>
<ul>
<li>&#39;pike&#39;와 같이 다양한 의미를 가지고 있는 단어들은 굉장히 많습니다. 이를 하나의 word embedding으로 고정해버리면 제대로된 의미표현이 불가능합니다. </li>
<li>따라서, 이를 해결하기 위한 2가지 방법을 강의에서 소개하고 있습니다. 
<img src="https://user-images.githubusercontent.com/77143767/114307094-1a243400-9b19-11eb-9432-0039c9946ad4.png" alt="image"></li>
</ul>
<h3 id="5-1-improving-word-representations-via-global-context-and-multiple-word-prototypes-huang-et-al-2012">5-1 Improving Word Representations Via Global Context And Multiple Word Prototypes (Huang et al. 2012)</h3>
<ul>
<li>하나의 단어가 벡터 공간에서 서로 다른 cluster를 형성하는 경우, 해당 단어를 여러개로 분류해서 벡터를 생성합니다.
(bank1 = 은행, bank2 = 둑, ...)
<img src="https://user-images.githubusercontent.com/77143767/114307239-b9492b80-9b19-11eb-9448-2928cb6d35db.png" alt="image"></li>
</ul>
<h3 id="5-2-linear-algebraic-structure-of-word-senses-with-applications-to-polysemy-arora--ma--tacl-2018">5-2 Linear Algebraic Structure of Word Senses, with Applications to Polysemy (Arora, …, Ma, …, TACL 2018))</h3>
<ul>
<li>한 단어의 서로 다른 의미를 나타내는 벡터들에 가중치를 부여하고 선형결합을 통해 새로운 word vector를 생성합니다. 이 단어벡터를 가지고 clstering했을때 이 단어가 어떤의미로 쓰였는지 내적인 의미까지 잘 파악하여 분류했습니다.
<img src="https://user-images.githubusercontent.com/77143767/114307348-2d83cf00-9b1a-11eb-8cfb-369a775abb98.png" alt="image"></li>
</ul>
<hr>
<h4 id="reference">Reference</h4>
<p><a href="https://web.stanford.edu/class/cs224n/slides/cs224n-2020-lecture02-wordvecs2.pdf">https://web.stanford.edu/class/cs224n/slides/cs224n-2020-lecture02-wordvecs2.pdf</a>
<a href="http://dsba.korea.ac.kr/seminar/?mod=document&amp;uid=42">http://dsba.korea.ac.kr/seminar/?mod=document&amp;uid=42</a>
<a href="https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/04/09/glove/">https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/04/09/glove/</a>
<a href="https://wikidocs.net/22885">https://wikidocs.net/22885</a>
<a href="https://velog.io/@tobigs-text1314/CS224n-Lecture-2-Word-Vectors-and-Word-Senses#4-word-embedding-evaluation">https://velog.io/@tobigs-text1314/CS224n-Lecture-2-Word-Vectors-and-Word-Senses#4-word-embedding-evaluation</a>
<a href="https://jeongukjae.github.io/posts/2cs224n-lecture-2-word-vectors-and-word-senses/">https://jeongukjae.github.io/posts/2cs224n-lecture-2-word-vectors-and-word-senses/</a>
<a href="https://eda-ai-lab.tistory.com/122">https://eda-ai-lab.tistory.com/122</a>
<a href="https://web.stanford.edu/class/cs224n/slides/cs224n-2020-lecture02-wordvecs2.pdf">https://web.stanford.edu/class/cs224n/slides/cs224n-2020-lecture02-wordvecs2.pdf</a>
<a href="https://velog.io/@skaurl/U-Week-4-Day-16">https://velog.io/@skaurl/U-Week-4-Day-16</a>
<a href="https://misconstructed.tistory.com/40">https://misconstructed.tistory.com/40</a>
<a href="https://www.sallys.space/blog/2018/04/30/glove/">https://www.sallys.space/blog/2018/04/30/glove/</a>
<a href="http://yonghee.io/glove/">http://yonghee.io/glove/</a>
<a href="https://wikidocs.net/24559">https://wikidocs.net/24559</a>
<a href="https://reniew.github.io/22/">https://reniew.github.io/22/</a>
<a href="https://yjjo.tistory.com/14">https://yjjo.tistory.com/14</a>
<a href="https://yngie-c.github.io/nlp/2020/05/28/nlp_word2vec/">https://yngie-c.github.io/nlp/2020/05/28/nlp_word2vec/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Lecture 1 - Introduction and Word Vectors]]></title>
            <link>https://velog.io/@tobigs-text1415/Lecture-1-Introduction-and-Word-Vectors</link>
            <guid>https://velog.io/@tobigs-text1415/Lecture-1-Introduction-and-Word-Vectors</guid>
            <pubDate>Wed, 14 Apr 2021 09:53:04 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 서울여자대학교 정보보호학과 강의정</p>
<h1 id="cs224n">CS224n</h1>
<h1 id="lecture-1---introduction-and-word-vectors">Lecture 1 - Introduction and Word Vectors</h1>
<h2 id="lecture-plan">Lecture Plan</h2>
<ol>
<li>The course</li>
<li>Human language and word meaning</li>
<li>Word2vec introduction</li>
<li>Word2vec objective function gradients</li>
<li>Optimization basics</li>
<li>Looking at word vectors</li>
</ol>
<h2 id="human-language">Human Language</h2>
<p><img src="https://images.velog.io/images/uijeng4225/post/c016fc63-02d0-4ba6-b9e5-c969b9b12dd7/_2021-04-13__5.13.09.png" alt=""></p>
<ul>
<li>언어는 불확실한 시스템이며 담고 있는 의미도 많지만 우리는 어느정도 의사소통을 잘 할 수 있다.</li>
<li>Yann Le Cun, &quot;오랑우탄과 인간의 지능은 비슷하다&quot;<ul>
<li>하지만 오랑우탄은 인간처럼 행동할 수 없다.</li>
<li>인간에게는 Language가 있다.</li>
</ul>
</li>
<li>Language는 약 100,000년전 발명된 것으로 예측되고 있다.</li>
<li>Writing은 약 5,000년 전에 발명된 것으로 예측되고 있다.</li>
<li>Language는 우리의 뇌에 압축되어 들어갈 수 있다.</li>
</ul>
<p><strong>So that&#39;s why language is good!!</strong></p>
<h2 id="how-do-we-represent-the-meaning-of-a-word">How do we represent the meaning of a word</h2>
<p><strong>meaning</strong></p>
<ul>
<li>the idea that is represented by a word, phrase, etc</li>
<li>the idea that a person wants to express by using
words, signs, etc</li>
<li>the idea that is expressed in a work of writing, art, etc.</li>
</ul>
<p>Commonest linguistic way of thinking of meaning:
<strong>denotational semantics</strong></p>
<p>signifier (symbol) ⟺ signified (idea or thing)</p>
<h2 id="how-do-we-have-usable-meaning-in-a-computer">How do we have usable meaning in a computer?</h2>
<h3 id="wordnet">WordNet</h3>
<p>: a thesaurus containing lists of <strong>synonym sets</strong> and <strong>hypernyms</strong></p>
<ul>
<li>synonym sets containing &quot;good&quot;
<img src="https://images.velog.io/images/uijeng4225/post/374ec953-f32e-4da4-ab98-194e2f9ff26b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-04-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.18.19.png" alt=""></li>
</ul>
<ul>
<li>hypernyms of &quot;panda&quot;
<img src="https://images.velog.io/images/uijeng4225/post/2f6c6d55-48f9-4511-89e5-fd19bbf80324/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-04-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.18.27.png" alt=""></li>
</ul>
<h3 id="problems-with-resources-like-wordnet">Problems with resources like WordNet</h3>
<ul>
<li>Great as a resource but missing nuance<ul>
<li>e.g. &quot;proficient&quot; is listed as a synonym for &quot;good&quot;.
This is only correct in some contexts.</li>
</ul>
</li>
<li>Missing new meanings of words<ul>
<li>e.g., wicked, badass, nifty, wizard, genius, ninja, bombest</li>
<li>Impossible to keep up-to-date!</li>
</ul>
</li>
<li>Subjective</li>
<li>Requires human labor to create and adapt</li>
<li>Can’t compute accurate word similarity </li>
</ul>
<h3 id="one-hot-vector">One Hot Vector</h3>
<ul>
<li>Traditional NLP (약 2012년까지)
<img src="https://images.velog.io/images/uijeng4225/post/adcd9b22-5421-4942-bd1c-0bf016a42ea1/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-04-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.40.05.png" alt="">
Vector dimension = number of words in vocabulary (e.g., 500,000)</li>
</ul>
<p>Problem:</p>
<ul>
<li>Vector Dimension</li>
<li>similarity</li>
</ul>
<p>Solution:</p>
<ul>
<li>Could try to rely on WordNet’s list of synonyms to get similarity?<ul>
<li>But it is well-known to fail badly: incompleteness, etc.</li>
</ul>
</li>
<li>Instead: learn to encode similarity in the vectors themselves</li>
</ul>
<h3 id="distributional-semantics">Distributional Semantics</h3>
<ul>
<li>One of the most successful ideas of modern statistical NLP</li>
<li>When a word w appears in a text, its context is the set of words that appear nearby (within a fixed-size window)
<img src="https://images.velog.io/images/uijeng4225/post/ee5bc9da-ed83-458e-8d0d-fa4d70a5bfb3/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-04-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.00.30.png" alt=""></li>
</ul>
<p>Word Vector
<img src="https://images.velog.io/images/uijeng4225/post/7918aa40-a936-43a9-ab18-6b062858a1e3/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-04-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.12.26.png" alt=""></p>
<ul>
<li>word embeddings or word representations</li>
<li>Vector의 크기는 최소 30이며 크게는 1,000 ~ 4,000 정도이다.</li>
<li>vector space :  word를 배치한 공간</li>
</ul>
<h2 id="word2vec">Word2Vec</h2>
<p>: Word2vec (Mikolov et al. 2013) is a framework for learning word vectors</p>
<p>Idea</p>
<ul>
<li>We have a large corpus of text</li>
<li>Every word in a fixed vocabulary is represented by a vector</li>
<li>Go through each position t in the text, which has a center word c and context (&quot;outside&quot;) words o</li>
<li>Use the similarity of the word vectors for c and o to calculate the probability of o given c (or vice versa)</li>
<li>Keep adjusting the word vectors to maximize this probability</li>
</ul>
<p>Example    windows    and    process    for    computing $$P(W_{t+j} | W_t)$$
<img src="https://images.velog.io/images/uijeng4225/post/ca5bec8a-ee27-46f4-ada3-a49114a03585/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-04-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.21.33.png" alt=""></p>
<p>Next..</p>
<p><img src="https://images.velog.io/images/uijeng4225/post/a4372a17-4775-42b5-abf4-70540b2b54dc/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-04-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.29.55.png" alt=""></p>
<h3 id="likelihood">Likelihood</h3>
<p><img src="https://images.velog.io/images/uijeng4225/post/c859d6a6-44b1-419b-8e2b-595383cc13c3/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-04-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.37.01.png" alt=""></p>
<ul>
<li>For each position t = 1, … , T, predict context words within a window of fixed size m, given center word Wj</li>
<li>유일한 매개 변수는 단어들의 벡터이다.</li>
</ul>
<h3 id="objective-function">Objective function</h3>
<p>: objective function is the (average) negative log likelihood
<img src="https://images.velog.io/images/uijeng4225/post/b46b4ee1-1523-4cbc-9bd6-b4685220063e/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-04-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.37.21.png" alt=""></p>
<ul>
<li>마이너스를 붙여 Minimize하는 방향으로 바꾼다.</li>
<li>1/T를 곱하여 평균을 계산한다.</li>
<li>추후 곱셈을 덧셈으로 바꾸기 위해 log를 붙인다.</li>
</ul>
<p>Minimizing objective function ⟺ Maximizing predictive accuracy</p>
<h3 id="pw_tjw_ttheta-계산">$$P(W_{t+j}|W_t;\theta)$$ 계산</h3>
<p><img src="https://images.velog.io/images/uijeng4225/post/3bb1fdd5-d433-442f-9fdd-0d641af6763a/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-04-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.56.59.png" alt=""></p>
<ul>
<li>중심 단어를 기준으로 해당 맥락에서 예측될 확률을 구합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/uijeng4225/post/64787ff2-f4f4-49bf-a668-1790a354860b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-04-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.52.54.png" alt=""></p>
<ul>
<li>C : Center Word, O : context Word</li>
<li>exponential을 사용하여 양수 표현</li>
<li>Vector 간의 dot product로,두 Vector 간의 유사도 측정</li>
</ul>
<h3 id="optimization">Optimization</h3>
<p>Object Function을 최소화 하는 $$\theta인 (u, v)$$를 찾는다.</p>
<p><img src="https://images.velog.io/images/uijeng4225/post/0cc8b54c-ebe5-4e65-b1cf-e9d3e0b284d2/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-04-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.37.21.png" alt=""></p>
<p> 𝜽 </p>
<ul>
<li>V개의 단어, d차원, u와 v를 갖으므로 2dV차원이다.</li>
<li>각 벡터들은 Random Value로 시작한다.</li>
</ul>
<p><img src="https://images.velog.io/images/uijeng4225/post/64ccf148-7437-4f31-9de6-05d898de8eb2/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-04-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.12.04.png" alt=""></p>
<h2 id="word2vec-derivations-of-gradient">Word2vec derivations of gradient</h2>
<p>Object Function 최소화를 위해 center word, context word로 각각 미분
<img src="https://images.velog.io/images/uijeng4225/post/14b04549-bf1c-49d9-9069-1581e29ca175/KakaoTalk_Photo_2021-04-14-17-59-25.jpeg" alt=""></p>
<p>gradient descent를 활용하여 예측율을 올릴 수 있다!</p>
<Br>
  <Br>
    <Br>
      <Br>
        <Br>
Reference    

<p>CS224n 2019 - lecture01. Introduction and Word Vector (slides)(<a href="https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1194/slides/cs224n-2019-lecture01-wordvecs1.pdf">https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1194/slides/cs224n-2019-lecture01-wordvecs1.pdf</a>)</p>
]]></description>
        </item>
    </channel>
</rss>