<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>투빅스 텍스트 세미나</title>
        <link>https://velog.io/</link>
        <description>2020 투빅스 텍스트 세미나</description>
        <lastBuildDate>Wed, 20 Jan 2021 08:23:07 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>투빅스 텍스트 세미나</title>
            <url>https://images.velog.io/images/tobigs-text1314/profile/d6c3756a-55de-426b-bda0-61d30a9ec8bb/투빅스로고_정사각형.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 투빅스 텍스트 세미나. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/tobigs-text1314" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[CS224n] Lecture 18 - Constituency Parsing TreeRNNS]]></title>
            <link>https://velog.io/@tobigs-text1314/CS224n-Lecture-18-Constituency-Parsing-TreeRNNS</link>
            <guid>https://velog.io/@tobigs-text1314/CS224n-Lecture-18-Constituency-Parsing-TreeRNNS</guid>
            <pubDate>Wed, 20 Jan 2021 08:23:07 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 투빅스 13기 <a href="https://github.com/minjoong507">정민준</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Constituency Parsing </li>
<li>Simple TreeRNN </li>
<li>Syntactically-United RNN</li>
<li>Matrix-Vector RNN</li>
<li>Recursive Neural Tensor Network</li>
</ol>
<hr>
<h1 id="1constituency-parsing">1.Constituency Parsing</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/bb3759cc-c91a-4484-b2ca-1ecabf879888/image.png" alt="">
문장을 이해하고 단어를 잘 표현하기 위하여 여러 임베딩, 파싱 기법들이 이전 강의에서 소개되었습니다. 이번 강의에서는 TreeRNN을 활용하여 문장을 구조적으로 나누어 분석하는 방법들에 대해서 소개하겠습니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/81f1846f-0684-408a-88bb-a48be30c27c1/image.png" alt="">
먼저 Compositionality라는 용어를 살펴보겠습니다. 예를들어 10개의 단어를 통해 한 문장이 만들어 진다면 각 단어의 조합을 통해 새로운 의미를 나타내고 이 말인 즉슨 단어의 조합으로 부터 문장의 의미를 파악할 수 있다는 말으로 해석됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/9a3135db-ae9b-42b7-88cb-5ce0e8055770/image.png" alt="">
다음 그림을 통해 두 문장의 박스내 단어를 살펴보겠습니다. &#39;A person on a snowboard&#39;의미와 &#39;snowboarder&#39;의 의미는 동일합니다. 이렇게 &#39;A person on a snowboard&#39;에서 다섯 단어의 조합으로 snowboarder를 표현할 수 있게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/59bc7699-351c-4bf2-935e-1c305876712f/image.png" alt="">
다음 그림과 같이 구조적으로 문장을 나누고 각 단어의 조합이 나타내는 의미를 찾아 문장 전체의 의미를 파악하는게 목표입니다. 어떻게 의미를 찾아나가는지 이어서 보겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/ba2733de-6b60-48e3-9f98-6428755de751/image.png" alt="">
더 큰 구절은 어떻게 벡터 스페이스에 매핑시켜야 할까요? &#39;the country of my birth&#39;, &#39;the place where i was born&#39;을 예를들어 보겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c40b72c0-f349-4b41-9a88-fb0ccdfe49e9/image.png" alt="">
먼저 &#39;the country of my birth&#39; 문장에서 각 단어의 조합을 TreeRNN을 통해 추출한 값을 저장하고 일정한 규칙을 통하여 문장의 의미 벡터를 추출하게 됩니다. 다음 그림에서는 규칙에 의해 &#39;the&#39;와 &#39;country&#39;, &#39;my&#39;와 &#39;birth&#39;가 먼저 조합이 되었고 이후 &#39;of&#39;그리고 전체 의미 벡터를 얻게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/3645e15c-b82a-422e-a705-511927445d8e/image.png" alt="">
TreeRNN을 알아보기전에 RNN을 통해 문장을 분석하는 경우를 살펴보겠습니다. 다음과 같이 문장의 의미를 얻을 경우 인접 단어를 합친 단어의 의미는 충분히 반영하지 못합니다. 또한 마지막 단어 벡터를 주목하는 경향이 있기에 RNN보다 TreeRNN이 문장의 의미를 파악하는데 유용하다고 볼 수 있습니다.</p>
<h1 id="2-simple-treernn">2. Simple TreeRNN</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/27fec291-bc8d-421d-9967-0e6aa2fc6b71/image.png" alt="">
먼저 다음과 같이 &#39;on the mat&#39; 문장의 의미 벡터를 얻기 위해 &#39;the&#39;와 &#39;mat&#39;조합 단어 벡터를 계산 후 나머지 &#39;on&#39;와 조합하는 과정을 거쳤습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/dc83183a-62e0-4670-9fdd-2ba61a1591f8/image.png" alt="">
여기서 먼저 봐야할 벡터는 부모 벡터값입니다. 그림의 수식을 통해 벡터값을 계산하게 되며 여기서 사용하는 W 행렬은 모든 TreeRNN에서 동일합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/17b64d75-bd5a-4c45-bce2-9db0f9d12428/image.png" alt="">
다음은 Score 입니다. Score은 조합할 단어를 선택할 때 반영되는 값입니다. 해당 단어가 얼마나 그럴듯 한지를 의미합니다. 이후 Score값을 통해 문장의 단어들을 조합해가는 과정을 통해 자세히 알아보겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/26c023e1-fa5f-4e6a-b843-e5591d3c9650/image.png" alt="">
해당 단어들의 조합으로 부모 단어의 벡터와 Score값을 얻었습니다. 여기서는 <strong>Greedy</strong> 알고리즘을 통해 다음 단어를 조합하게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/a791a150-054f-4215-9250-70cb3ede5844/image.png" alt="">
다음과 같이 <strong>Greedy</strong>하게 인접한 단어의 Score가 높은 조합으로 다음 부모 단어의 벡터와 Score값을 계산하게 됩니다. 이어서 다음 과정을 보겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/58d6b8ab-1a35-4a1f-bdd5-437848a26244/image.png" alt="">
이전 선택된 단어의 조합으로 부모 단어의 벡터와 Score을 계산하였습니다. 이어서 오른쪽 부분도 계산하게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c3b797a2-f6c3-4307-8bf4-acf00cb550e7/image.png" alt="">
이렇게 계산되면 다음 연산은 어떻게 될까요? Score값이 0.1, 3.6인 단어 벡터의 조합으로 부모 단어의 벡터와 Score를 계산하고 좌측의 단어와의 조합을 통해 문장의 의미를 파악하게 됩니다. 여기서 <strong>Greedy</strong>하게 조합을 이어나간다고 설명했는데 여기서 쓰이는 <strong>Beam Search Algorithm</strong>을 간단히 알아보고 가겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/79b548d6-8bcb-452c-9bed-28b03df350d3/image.png" alt="">
<strong>Beam Search Algorithm</strong>은 BFS 알고리즘에 탐욕법을 더한 알고리즘으로 볼 수 있습니다. BFS 알고리즘이 적용된다면 다음 단계로 가기위해서 넓이 우선적으로 탐색을 진행합니다. 그러면 해당 노드들과 이어진 모든 간선을 순차적으로 검사해야 합니다. 분명 비효율적인 면이 있으며 해당 속도로는 문장 분석을 시간내에 할 수 없을지도 모릅니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/921905d1-927c-4bb6-9425-6669e8fd4638/image.png" alt="">
이때까지 Simple TreeRNN에 대해서 알아보았습니다. Simple TreeRNN은 다음과 같은 한계점을 보입니다.</p>
<h1 id="3-syntactically-united-rnn">3. Syntactically-United RNN</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/7e735d49-8f6a-4371-90ca-e2ef9589544d/image.png" alt="">
해당 모델은 Simple RNN의 한계점을 개선한 모델입니다. 모든 조합에 똑같이 사용되었던 행렬 W를 각기 다른 행렬로 설정합니다.</p>
<h2 id="1-probabilistic-context-free-grammarpcfg">1. Probabilistic Context Free Grammar(PCFG)</h2>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/3d7045d2-247d-423e-bf8f-595ecfddd428/image.png" alt="">
각 규칙은 생성 확률을 가지고 있으며 해당 Non-terminal로 부터 생성하는 규칙들의 확률의 합은 1입니다. 다음 그림을 통해 더 자세히 보겠습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/05c63db4-a233-4e18-a348-706f85853664/image.png" alt="">
이렇게 조합될 단어의 확률을 계산하고 TreeRNN에 적용한 모델이 <strong>Syntactically-United RNN</strong> 입니다.</p>
<h1 id="4-matrix-vector-rnn">4. Matrix-Vector RNN</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/421abd78-e01c-4ae1-80d7-4e8a7202ceaa/image.png" alt="">
다음 모델은 이전 모델들과 다르게 단어들이 벡터정보만 가지고 있는게 아닌 행렬에 대한 정보까지 같이 가지고 있습니다. 해당 모델에서는 단어가 지니는 정보를 하나 더 가지게 함으로써 문장의 의미를 더욱 잘 파악할 수 있도록 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/48e9aeb7-7b99-457a-8b3f-1312c0f43ba0/image.png" alt="">
연산은 다음과 같이 &#39;very&#39;의 단어벡터와 &#39;good&#39;의 행렬 반대로 &#39;good&#39;의 단어벡터와 &#39;very&#39;의 행렬이 곱연산 되어 부모 노드로 전달됩니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/7ab3c5b2-76ef-4d34-8a13-83dd5576529b/image.png" alt="">
전달된 값은 다음과 같이 계산됩니다.</p>
<h1 id="5-recursive-neural-tensor-network">5. Recursive Neural Tensor Network</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/f1332b7f-ea27-44d4-835a-1bc9024de73f/image.png" alt="">
오래전부터 단어의 감정을 분석하는 태스크는 꾸준히 연구되어 왔습니다. 굳이 TreeRNN을 통해 단어, 문장을 분석하지 않고 Bag of Words를 통해서 임베딩하여 문장을 분석하여도 90%정도의 성능을 보인다고 합니다. 하지만 다음과 같은 경우는 모델이 단어의 감정을 분석하기 힘듭니다. 후회와 긍정은 부정을 의미하기에 이를 분석하기 위한 또 다른 무언가가 필요합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/11d3d3c4-0290-4103-a592-ac50c74a4ec0/image.png" alt="">
해당 모델은 MV-RNN보다 적은 파라미터를 가집니다. MV-RNN은 모든 결합에 대하여 각 노드마다 행렬을 생성하고 계속 연산을 진행해야 함으로 cost가 높아질 수 밖에 없습니다. 해당 모델에서는 파라미터수를 확연히 줄임으로써 MV-RNN보다 cost를 낮추었고 단어의 채널을 통해서 의미를 분석하는데 사용합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/e8dbdc7e-d4dd-43e2-95be-c2900d8cf7ff/image.png" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/589b9f9a-300f-4ef9-92f3-92f84d82dac2/image.png" alt="">
다음 긍/부정을 분석한 결과를 보겠습니다. RNTN이 다른 모델에 비해 높은 성능을 보입니다. 결과를 통해 또 다른 정보를 얻을 수 있었습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/1edc49a8-4709-4cd3-ac1d-9778535d7750/image.png" alt="">
Treebank 데이터는 구조적 분석에서 각 단어에 모두 라벨링이 되어있습니다. 해당 데이터를 사용했더니 제일 간단한 Bi NB 모델의 성능이 RNN, MV-RNN보다 높음을 볼 수 있습니다. 이는 결국 데이터셋의 중요성을 보여주는 지표이기도 하다는 생각이 들었습니다.</p>
<h1 id="결론">결론</h1>
<p>이전까지 TreeRNN에 관한 여러 모델을 살펴보았습니다. 현실적으로 TreeRNN은 사용하기 힘들다고 합니다. 이유는 GPU 연산이 힘듭니다. 병렬적으로 연산이 진행되어야 하는데 모든 task 마다 연산 구조가 동일하지 않고 Tree 모양이 다르기 때문이라 합니다. 또한 데이터에 라벨링을 모두 거쳐야 하는데 이 데이터를 구축하는데에 어려움이 있습니다.</p>
<h1 id="references">References</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/5ea63c3e-3599-41b4-a482-e1f074936fbc/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS224n] Lecture 15 - Natural Language Generation]]></title>
            <link>https://velog.io/@tobigs-text1314/CS224n-Lecture-15-Natural-Language-Generation</link>
            <guid>https://velog.io/@tobigs-text1314/CS224n-Lecture-15-Natural-Language-Generation</guid>
            <pubDate>Wed, 20 Jan 2021 08:21:11 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 투빅스 13기 <a href="https://github.com/kmmnjng528">김민정</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Decoding Algorithm</li>
<li>Neural Summarization</li>
<li>Copy Mechanisms</li>
<li>NLG Using Unpaired Corpus</li>
</ol>
<hr>
<h1 id="1-decoding-algorithm">1. Decoding Algorithm</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/ed52a8c8-4c5b-4dd2-b844-7246a8f594e6/image.png" alt="">
시작하기 전에 NLG가 무엇인지 살펴보겠습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/863dea55-59d9-466d-a2f3-63230e92a5fa/image.png" alt="">
NLG란 주어진 input x에 대해 새로운 text를 생성해내는 작업입니다.
기계 번역, 요약, 채팅, 스토리텔링, QA 등이 있습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/450a7559-bcc7-4525-9465-b117a26b65c1/image.png" alt="">
적절성, 유창성, 가독성, 다양성을 골고루 만족하는 경우 자연어를 잘 생성한다고 말할 수 있습니다.</p>
<ul>
<li><strong>적절성</strong>
생성된 문장이 모호하지 않고 원래의 input text의 의미와 일치</li>
<li><strong>유창성</strong>
문법이 정확하며 어휘를 적절하게 사용해야 함
사람이 하는 것처럼 유창하게 말해야 한다는 것</li>
<li><strong>가독성</strong>
적절한 지시어, 접속사 등을 사용하여 문장의 논리 관계를 고려하여 생성해야 함
자연어를 생성할 때 대표적으로 어려운 부분 중 하나</li>
<li><strong>다양성</strong>
상황에 따라 혹은 대상에 따라 표현을 다르게 생성해야 함</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/90bc38e2-7f1f-44e9-9e8a-3f9e86d344df/image.png" alt="">
지금까지 공부했던 LM을 학습한 후에 어떻게 NLG에 적용할 수 있냐는 질문의 답변으로 Decoding Algorithm을 제시할 수 있습니다.
이때, 가장 가능성이 높은 출력 시퀀스를 디코딩하는 것이 아니라, 최대한 가능성이 높은 출력 시퀀스를 디코딩하는 것입니다. vocab의 크기가 어마어마하게 큰 경우에는 완전 탐색을 하는 것이 어렵기 때문에 휴리스틱한 탐색 방법인 Decoding Algorithm을 사용하자는 것입니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/db578aa7-dbe2-41cf-a1cc-003d0da21e72/image.png" alt="">
<strong>1) Greedy Decoding</strong>
첫 번째로, Greedy Decoding입니다. Greedy Decoding은 각 출력을 예측하는데 매 스텝에서 가장 가능성이 높은 단어 한 개를 선택합니다. 이때, argmax를 사용합니다. 매 스탭마다 한 개만 선택하면 되기 때문에 탐색하는데 매우 빠릅니다. 하지만 어떤 스텝에서 실수를 하는 경우에 그 실수가 해당 스텝 이후의 단어를 선택하는데 까지 영향을 미치기 때문에 최종 출력 결과가 좋지 않을 수 있다는 단점이 있습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/5b838a02-df91-414c-8941-3e2e0bc898fe/image.png" alt="">
<strong>2) Beam Search</strong>
두 번째로, Beam Search입니다. Beam Search는 k개의 가능한 가설들을 두고 가장 높은 확률을 갖는 문장을 찾아 나가는 방식입니다. 이때 k는 beam size를 의미하는 하이퍼 파라미터이며, k=1인 경우 Greedy Decoding과 동일하기 때문에 Greedy Decoding의 확장된 형태라고 볼 수 있습니다.
위의 예시에서는 k=2인 경우로, 각 스텝에서 가장 확률이 높은 2개씩만 고려했습니다. 누적 확률을 크게 하는 단어들을 따라서 문장이 생성됩니다. 파란색 숫자는 확률(0과 1 사이)에 로그 값을 취한 형태이기 때문에 음수 값을 가지며, 절댓값이 작은 단어를 따라서 문장이 생성됩니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/076023ce-aa53-470a-9f04-46b48f054314/image.png" alt="">
그렇다면 Beam Search에서는 k(beam size)를 어떻게 고를까요? k(beam size)에 따른 결과를 살펴봅시다.</p>
<ul>
<li><strong>Low beam size</strong>
beam size가 너무 작으면 주제에 더 가깝지만 말이 안되는 답변을 뱉음</li>
<li><strong>High beam size</strong>
beam size가 너무 크면 너무 일반적이고 짧은 답변을 뱉음
BLEU score를 떻어뜨릴 수 있음</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/2afc46fc-fddd-40bc-88d2-eecfe1665256/image.png" alt="">
<strong>3) Sampling-based decoding</strong>
세 번째로, Sampling-based decoding입니다. Beam Search에서 큰 k(beam size)를 가지더라도 너무 일반적인 답변을 얻지 않기 위한 방법입니다.
Pure Sampling과 Top-n Sampling이 있습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/c0215365-ce18-44d9-8109-c763bf8de4d8/image.png" alt="">
Pure Sampling은 Greedy Decoding과 비슷하지만, argmax 대신 sampling을 사용합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/54cce6c2-7d74-4bae-96e4-12dd8a84f8dc/image.png" alt="">
Top-n Sampling은 Pure Sampling처럼 완전하게 랜덤 샘플링을 하는 것이 아니라 확률이 가장 큰 n개의 단어들 중에서 랜덤 샘플링을 하는 것입니다.</p>
<hr>
<h1 id="2-neural-summarization">2. Neural Summarization</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/640f1b77-b7e4-4d38-8d88-09f9bd31a6de/image.png" alt="">
요약(Summarization)이란 주어진 input x에 대해, x의 주요 정보를 포함하는 요약된 y를 생성해내는 작업입니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/6c0f015a-0a54-4d6a-867f-d421bfa8b4fd/image.png" alt="">
크게 Extractive Summarization과 Abstractive Summarization이 있습니다.
Extractive Summarization이란 문서 내에서 핵심이 되는 문장을 추출하는 것으로, 비교적 쉽지만 제한적인 요약 결과를 얻게 됩니다.
Abstractive Summarization이란 문서의 중요한 내용을 담은 새로운 문장을 생성하는 것으로, 보다 유연한 결과를 얻을 수 있지만 비교적 어렵습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/20199a9c-3932-499e-914e-5f43490ad16b/image.png" alt="">
이후에 다룰 Neural을 적용한 요약(Summarization)은 Abstractive Summarization입니다.
왼쪽 예시를 보면 원문에서 요약된 결과가 문장 그대로를 추출하는 것이 아닌, 새로운 문장을 생성해냄을 확인할 수 있습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/fe3e905c-dd21-4ebf-939a-8b6e72954ac6/image.png" alt="">
평가 지표인 ROUGE를 BLEU score와 비교하여 살펴보겠습니다.</p>
<ul>
<li><strong>BLEU score</strong>
주로 기계 번역(Machine Translation) 평가에 사용
Precision 기반
Brevity Penalty를 줌</li>
<li><strong>ROUGE score</strong>
주로 요약(Summarization) 평가에 사용
Recall 기반
Brevity Penalty를 주지 않음</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/9b631259-4bc4-46ae-b1f8-27eab2a9fe32/image.png" alt="">
Neural 이전의 요약 시스템은 대부분 추출(extractive)방식입니다.</p>
<ul>
<li><strong>1. Content Selection</strong>
포함할 중요 문장을 선택합니다. 중요 문장은 topic이 해당 문장에 존재하는지, 문장의 위치는 어디에 있는지 등으로 선택합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/3a87eecd-f18f-4821-afa0-b5960bdfebd9/image.png" alt=""></li>
<li><strong>2. Information Ordering</strong>
1 에서 선택한 문장들을 중요도에 따라 순서대로 나열합니다.</li>
<li><strong>3. Content Selection</strong>
요약문을 생성합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/2eaba4af-42c9-4374-b3db-2f368d8250f0/image.png" alt="">
신경망(Neural)을 이용한 요약(Summarization)은 Seq2seq과 Attention을 사용해 요약문을 생성하고자 했습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/cefd3a05-0b71-4ecc-b54a-fadb7b95ffb6/image.png" alt="">
하지만 Seq2seq과 Attention만을 적용한 모델은 디테일을 잡아내기에 한계점이 있습니다.
예를 들어 &#39;안녕 난 투빅이야&#39;라는 문장에 대한 대답으로 사람은 &#39;안녕 반가워 투빅아&#39;라고 대답을 할 수 있습니다. 그러나 모델(Seq2seq+Attention)은 &#39;안녕 반가워&#39;와 같은 대답은 할 수 있지만, &#39;투빅아&#39;와 같은 고유 명사를 사용하지는 못하는 문제가 있습니다.</li>
</ul>
<hr>
<h1 id="3-copy-mechanisms">3. Copy Mechanisms</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/95273f33-b7d4-4c3c-b478-efbc84ef5e43/image.png" alt="">
Copy Mechanisms을 seq2seq과 함께 사용해서 디테일을 잡아내고자 했습니다. Attention에서 copy를 더 잘할 수 있도록 처리한 것입니다.</p>
<ul>
<li>P_gen은 단어를 copy할지 생성할지 결정지어주는 것이 generation probability입니다. Context vector와 디코더 상에서의 타임 스텝의 히든 스테이트를 입력 받고 디코더 상에서의 input을 입력 받아서 시그모이드를 통해 계산할 수 있습니다.</li>
<li>P_vocab은 Context vector와 디코더 상에서의 타임 스텝의 히든 스테이트를 가지고 소프트 맥스를 취해 계산할 수 있습니다.</li>
<li>attention 분포는 입력된 단어들로부터 얼마나 copy할건지에 대한 분포를 가지고 있는 것입니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/f28e8683-4154-441a-ad7e-f2b000a7a91f/image.png" alt="">
기존의 pre-neural summarization은 중요 문장을 선택하는 부분인 content selection과 요약을 하는 부분인 surface realization으로 나누어 동작합니다. 하지만 neural approach는 그런 것 없이 하나로 묶어져 나오기 때문에 전체적인 것을 보지 못하는 문제가 발생합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/6bc36807-dc25-40fc-8b0f-98f300865304/image.png" alt="">
이러한 점을 보완하기 위해 등장한 방법이 Bottom-up summarization입니다. word가 포함되었는지, 포함되지 않았는지에 따라 0과 1을 태깅하며 모델은 word가 포함되지 않은 부분에는 집중하지 않습니다. 간단하지만 매우 효과적인 방법이라고 합니다.</li>
</ul>
<hr>
<h1 id="4-nlg-using-unpaired-corpus">4. NLG Using Unpaired Corpus</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/95279b07-e18f-4252-9fd4-692f8819e17c/image.png" alt="">
지금까지는 input에 대응하는 output을 미리 준비한 후에 학습시키는 지도 학습에 기반하고 있습니다. 예를 들어 &#39;오늘 날씨 알려줘&#39;에 대응한 출력 문장인 &#39;오늘 비가 올 것 같아요&#39;와 같은 쌍을 준비하여 학습합니다.
그러나 이러한 방법의 문제는 입력-출력 쌍의 데이터를 대량으로 요구한다는 것입니다. 고성능의 자연어 생성 시스템을 만들기 위해 그 훈련에 필요한 말뭉치의 확보부터가 현실적으로 매우 어렵습니다.
따라서 이러한 한계점을 돌파하기 위해 Unpaired corpus를 활용한 비지도 학습이 등장합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/de41b702-d6b9-4d40-bd8a-29dbf094767f/image.png" alt="">
인공신경망이 반드시 학습해야 하는 핵심적인 포인트들을 정리해보겠습니다.</p>
<p>1) 어떤 스타일의 문장이 들어오더라도 그 스타일에 의존적이지 않는 본질적인 의미를 Latent vectors의 형태로 인코딩해야 한다.
2) 인코딩된 Latent vectors가 주어졌을 때, 각 스타일에 해당되는 디코더는 해당 스타일의 문장을 생성할 수 있어야 한다.
<img src="https://images.velog.io/images/tobigs-text1314/post/fec26f47-087f-41a2-8612-a609f41024a6/image.png" alt="">
인공 신경망은 Autoencoder loss와 Cycle loss를 최소화하는 방향으로 학습합니다.</p>
<ul>
<li>Autoencoder loss
X 스타일의 문장 x를 latent vectors로 변환한 후, 이를 다시 X 디코더를 이용해 문장 x’가 생성되었을 때, x’과 원래의 문장 x와 얼마나 다른지</li>
<li>Cycle loss
X 스타일 문장 x를 변환 과정을 통해 Y 스타일의 문장 y로 변환하였을 때, 이 문장 y를 다시 X 스타일로 변환한 문장 x’’과 원래의 문장 x는 얼마나 다른지
<img src="https://images.velog.io/images/tobigs-text1314/post/669a0b74-de48-4553-a75b-470397e4d6b5/image.png" alt=""></li>
</ul>
<hr>
<h4 id="참고자료">참고자료</h4>
<ul>
<li>CS224n Lecture15 강의 &amp; 강의 자료</li>
<li><a href="https://velog.io/@nawnoes/%EC%9E%90%EC%97%B0%EC%96%B4%EC%B2%98%EB%A6%AC-Beam-Search">https://velog.io/@nawnoes/%EC%9E%90%EC%97%B0%EC%96%B4%EC%B2%98%EB%A6%AC-Beam-Search</a></li>
<li><a href="https://jeongukjae.github.io/posts/cs224n-lecture-15-natural-language-generation/">https://jeongukjae.github.io/posts/cs224n-lecture-15-natural-language-generation/</a></li>
<li><a href="https://www.slideshare.net/ThoPhan27/abstractive-text-summarization">https://www.slideshare.net/ThoPhan27/abstractive-text-summarization</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS224n] Lecture 14 - Transformer and Self-Attention]]></title>
            <link>https://velog.io/@tobigs-text1314/CS224n-Lecture-14-Transformer-and-Self-Attention</link>
            <guid>https://velog.io/@tobigs-text1314/CS224n-Lecture-14-Transformer-and-Self-Attention</guid>
            <pubDate>Wed, 20 Jan 2021 08:19:14 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/tobigs-text1314/post/ddf6eb9f-66bf-4749-af96-52c32e80199f/image.png" alt=""></p>
<p>작성자 : 투빅스 13기 <a href="https://github.com/Bbom02">정주원</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>RNN, CNN, and Self-Attention </li>
<li>Transformer</li>
<li>Image Transformer</li>
<li>Music Transformer</li>
</ol>
<hr>
<h1 id="1-rnn-cnn-and-self-attention">1. RNN, CNN, and Self-Attention</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/1b6ffc30-a816-4569-b221-2171014b29a4/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/ee394bba-7a0b-4fa1-ab5f-961539dd0b8e/image.png" alt=""></p>
<p>RNN 계열의 LSTM을 생각해보면 데이터 즉, 시퀀스의 길이를 맞춰야 매 단계마다 빠르게 계산할 수 있기 때문입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/7862b9b5-96f6-4069-827c-fe3327e40fcd/image.png" alt=""></p>
<p>하지만 RNN 계열의 모델은 parallelization이 불가능하고 long-term dependency를 잘 반영하지 못한다는 단점이 있습니다. 이때 Parallelization이 불가능한 이유는 the 이전에 kicked가 계산되어 hidden state로 kicked에 대한 값이 넘어가야지만 the에 대한 계산이 가능하기 때문입니다. </p>
<p>또한 RNN 모델은 Vanilla RNN보다 dependency에 강한 편이지만 I의 영향력이 ball에 가서는 옅어진다는 long-term dependency 문제를 여전히 안고 있습니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/06ee9c7d-7254-4e86-9d2c-144aec62fbb9/image.png" alt=""></p>
<p>또한 CNN 모델은 병렬 처리가 가능하지만 long-term dependency를 위해 다수의 layer가 필요하다는 단점이 있습니다. 예를 들어 kernel size가 3인 경우 1개의 convolution layer로는 I와 ball을 연결할 수 없기 때문에 I와 ball을 연결하기 위해서는 그림과 같이 convolution layer를 더 쌓아야만 합니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/4cabbde3-5dd7-461c-84a5-e0e527876b67/image.png" alt=""></p>
<p>하지만 self-attention은 병렬화가 가능하면서 동시에 long-term dependency의 문제를 해결해 RNN와 CNN을 대체할 수 있는 learning mechanism으로 등장하게 되었습니다.</p>
<p>self-attention에서 예를 들어 kicked의 경우 모든 시퀀스의 임베딩 벡터와 dot product, softmax 과정을 거쳐 구한 attention score에 weighted sum을 하여 문맥을 고려한 새로운 임베딩 벡터를 만들 수 있습니다. 즉,self-attention은 각 token을 sequence 내 모든 token과의 연관성을 기반으로 재표현하는 과정으로 이해할 수 있습니다.</p>
<hr>
<h1 id="2-transformer">2. Transformer</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/632fc4e8-0957-4e36-a170-266f3a92b400/image.png" alt=""></p>
<p>이러한 self-attention 메커니즘을 극대화한 모델이 바로 transformer라고 할 수 있습니다. transformer의 가장 큰 특징은 self-attention을 사용해 sequential한 토큰을 sequential하게 처리하지 않아 병렬처리를 가능하게 한 점입니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/9d20c98f-e76d-4d69-8123-9a507239b196/image.png" alt=""></p>
<p>machine translation task를 처리할 수 있는 transformer는 자세히 보면 인코더 블록과 디코더 블록으로 구성되어 있습니다. 인코더 블록에는 6개의 인코더가 스택처럼 쌓여 있으며 논문에 의하면 그 개수는 6개라고 합니다. 참고로, 6이라는 값이 최적값은 아니라고 합니다. 또한 디코더 블록에도 마찬가지로 인코더와 같은 개수의 디코더가 쌓여 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c14fe9bd-64b3-47d4-9dba-25040121c078/image.png" alt=""></p>
<p>인코딩 블록과 디코딩 블록의 큰 차이점은 구조에 있습니다.</p>
<p>인코딩 블록의 경우 512개의 토큰 중 입력에 해당하지 않아 비어있는 토큰을 패딩으로 두고 
시퀀스 단위가 4일 때 4개의 토큰을 self-attention과 feed forward neural network에 한번에 전달해 새롭게 표현된 임베딩 벡터를 출력하는 2단 구조로 구성되어 있습니다.</p>
<p>반면 디코딩 블록의 경우 인코딩 블록의 아웃풋과 masked self-attention의 벡터를 입력으로 받아 self-attention을 진행하기 때문에 2단 구조가 아닌 3단 구조로 구성되어 있습니다. 또한 인코딩 블록과 달리 디코더 블록의 output은 sequential하게 생성되기 때문에 만약 5번째 토큰이 생성되어야 하면 5번째 토큰을 마스킹하는 추가적인 작업이 필요한다는 차이점이 있습니다. </p>
<p><strong>이제 transformer의 구조에 대해 살펴보겠습니다.</strong></p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/766c0a4d-ac63-4b5b-a584-5de6d4658ad5/image.png" alt=""></p>
<p>첫 번째 인코더 이후의 입력은 아랫단 인코더의 아웃풋이 되어 입력의 size는 512로 유지됩니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/3d84fdcb-0645-4638-b8d5-3e5944f33c6a/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/06112828-8025-4f7c-8d35-0ccdbd0e1927/image.png" alt=""></p>
<p><strong>Multi-Head attention을 알아보기 전 self-attention에 대해 먼저 짚고 넘어가겠습니다.</strong></p>
<p>self-attention까지는 NXN 형태로 벡터들이 서로 영향을 끼치지만 Feed Forward Neural Network는 각 벡터마다 하나씩 존재해서 하나의 입력을 받아 하나의 아웃풋을 내놓습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/f7339a42-f2b1-4591-bc05-bdd73d05890a/image.png" alt=""></p>
<p>self-attention이란 정확히, 한 토큰을 처리할 때 그 토큰을 제외한 나머지 다른 토큰을 얼마나 중요하게 볼 것인가를 정하는 레이어를 가리킵니다. </p>
<p>즉, self-attention는 dependency를 가지기 때문에 &quot;The animal didn&#39;t cross the street because <strong>it</strong> was too tired.&quot;에서 it과 연관된 단어를 찾기 위해 The부터 시작해서 because, was, too, tired까지 모든 단어를 이해할 수 있습니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/7a84fe0d-f863-4a63-8fcf-5f000623854e/image.png" alt=""></p>
<p>가장 먼저, self-attention은 인코더의 입력 벡터로부터 세 개의 벡터를 만듭니다. 그 벡터는 각각 query, key, value를 말합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/e7627287-c4b9-4334-8688-1df498f5ebc0/image.png" alt=""></p>
<p>구체적으로 말하자면, input embedding에 query matrix를 곱해 query를 만들고, key matrix를 곱해 key를 만들고, value matrix를 곱해 value를 만들게 됩니다. 이때 각각의 matrix는 미지수로, 학습을 통해 도출된다고 합니다.  </p>
<p>특히 인코더의 입출력 벡터가 512 차원인 것에 비해 query, key, value의 dimension은 각 64 밖에 되지 않는데, 이는 후에 multi-head attention을 8개를 사용해 dimension을 concat하여 사이즈를 맞추게 될 것을 의미하기도 합니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/0e010586-502b-4724-90ba-ea324981b934/image.png" alt=""></p>
<p>self-attention의 두 번째 단계는 query와 문장의 어느 부분이 연관성이 높은지를 수치화하는 것입니다. 그림으로 비유하자면, query vector와 key vector를 곱해 각각의 &quot;폴더&quot;에 대해 score를 계산하는 것이 self-attention의 두 번째 단계라고 할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c119fb52-94aa-43db-b012-1fa7d36fa9a1/image.png" alt=""></p>
<p>다음으로 각 score를 dimension의 제곱근으로 나누고 softmax operation을 통과시킵니다. 이때 scaling을 하는 이유는 attention score를 다양한 vector에 분산시켜 gradient의 stability에 도움이 되기 때문입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/bd33122b-d1c2-4ab6-8829-c9c73555e178/image.png" alt=""></p>
<p>다음으로 각 토큰의 softmax 값과 value를 곱합니다. 이 경우 Thinking의 softmax 값이 커 Thinking의 weighted value가 Machines의 weighted value보다 크게 됩니다. 즉, Thinking이라는 단어에 Thinking이라는 단어의 영향력이 크다는 것을 의미합니다.</p>
<p>이어서 모든 value vector를 더하면 Thinking이 query일 때 self-attention output을 구할 수 있습니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/edd7d554-cbb2-45f8-af0b-defaffe1b20a/image.png" alt=""></p>
<p><strong>다시 Multi-Head attention으로 돌아와서,</strong> 한 문장 내에서는 누가? 무엇을? 누구에게? 등 다양한 정보가 존재하는데 이러한 정보를 한 번의 attention으로 적절히 반영하는 것은 어렵습니다. 하지만, 하나의 어텐션이 문장 내에서 존재하는 한가지 정보에 집중하게 된다면 8개의 head를 가진 attention을 사용해 정보를 적절히 attention score에 반영할 수 있습니다.</p>
<p>더불어 Multi-Head Attention에서 FFNN의 input size(=4)를 맞춰주기 위해 추가적인 작업이 필요합니다. 각각의 attention에서 나온 score를 concat한 attention score의 길이와 같은 column의 수를 가진 matrix를 곱해 (row는 input의 개수인 4) attention score를 FFNN의 input dimension과 일치시켜줘야 합니다. 이때 곱하는 matrix는 모델의 학습 과정에서 학습되는 matrix 입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/e9db0f84-809a-4308-b4bd-9eaf26bfc01c/image.png" alt=""></p>
<p>Multi-Head Attention 이후에는 attention output과 vector를 더해 layer normarlization 과정을 거친 후 각각의 row를 feed forward neural network에 전달합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/3fc25b7d-d4f7-4465-b9d4-c3a1cc58731f/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/1aaacfda-8567-42a0-8045-ea610397ade5/image.png" alt=""></p>
<p>앞서서 언급한 Masked랑 같은 의미인데, 디코더는 현 query 앞 token의 attention score만 볼 수 있기 때문에 만약 현재 query가 Thinking이라면 Machines의 attention score 값은 아주 작은 -inf 값으로 설정 후 계산하게 됩니다. </p>
<p>이를 통해 토큰들 사이에 인과관계를 부여할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/f3875325-7d75-443c-a437-37278e504932/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/44658a99-34dc-4e51-9aac-8a13ca4f86a1/image.png" alt=""></p>
<p>Linear layer는 FFNN의 일종으로 vector를 펼치는 역할을 하며, Softmax layer는 attention score를 probability로 바꿔줘 대응하는 단어를 return합니다.</p>
<hr>
<h1 id="3-image-transformer">3. Image Transformer</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/385cec42-6597-4670-a47f-ec85c5762510/image.png" alt=""></p>
<p>이미지 트랜스포머의 첫 번째 태스크는, Unconditional Image Generation은 대규모의 데이터로 특정한 이미지를 제작하는 태스크를 의미합니다.</p>
<p>두 번째 태스크는, Class Conditional Image Generation은 클래스 각각의 임베딩 벡터를 입력으로 받아 이미지를 제작하는 태스크를 의미합니다.</p>
<p>마지막 태스크는, Super Resolution은 저화질의 이미지를 입력으로 받아 고화질의 이미지를 출력하는 태스크를 의미합니다.</p>
<p>첫 번째 두 번째 태스크는 디코더만을 사용하며, 마지막 태스크는 인코더와 디코더를 모두 사용하는 것을 확인할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/217c6aa8-cbe6-42a5-9ab1-ea17e306f0ef/image.png" alt=""></p>
<p>앞서서 self-attention의 장점으로 적은 연산량을 들었습니다. 하지만 이미지의 경우 dimension보다 sequence length 즉 pixel의 길이 n이 커져 self-attention이 비효율적이게 됩니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/4f15f39c-8ef9-4dc8-815c-2c59ffe17324/image.png" alt=""></p>
<p>그래서 Image Transformer는 <strong>Local Self-attention</strong>을 사용합니다. Local self-attention은 sequence 내 일정 부분 안에서만 self-attention을 적용하는 방법을 의미합니다.</p>
<p>Super Resolution Task를 예로 들어보면, input을 겹치지 않은 block으로 구분했을 때 이 사진에서 현재 query는 q이고 target pixel은 그 옆에 있는 칸임을 알 수 있습니다. 그리고 하나의 블록을 둘러싸는 만큼을 memory block이라고 합니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/2eab0401-325c-47be-8fc2-e626388e50d1/image.png" alt=""></p>
<p>memory block 내 pixel을 key와 value로, query pixel을 query로 하는 self-attention은 Linear Projection, Dot-Product, Softmax 과정을 거쳐 구현할 수 있습니다. 그리고 encoder-decoder의 attention과 FFNN를 거쳐 output이 생성되고 Query block과 memory block을 재지정하고 과정을 반복함으로써 pixel by pixel로 Image를 generation 할 수 있습니다.</p>
<hr>
<h1 id="4-music-transformer">4. Music Transformer</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/241ca6b5-ed3d-4657-b55e-6b1cd8955e20/image.png" alt=""></p>
<p>뮤직 트랜스포머의 태스크는 다음과 같습니다. </p>
<ol>
<li>input sequence 없이 다양한 데이터를 통해 음악을 생성하는 것</li>
<li>음악의 앞 부분을 입력으로 받아 그 뒷부분을 생성하는 것</li>
</ol>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/20ccfea5-899f-4f3d-a315-6e80f4f2378a/image.png" alt=""></p>
<p>Music Transformer는 <strong>Relative Positional Self-Attention</strong>을 사용합니다. 즉, 일반적인 Self-attention에 Relative Positional Vector를 더해 query와 key의 sequence 내 거리를 attention weight에 반영합니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/dd954680-5bb0-455d-bc75-6aeff0b542e8/image.png" alt=""></p>
<p>Relative Positional Self-Attention은 가장 먼저 Relative Positional Embedding Matrix를 만들어야 합니다. </p>
<p>다음으로 Query와 Matrix를 곱합니다. 이때 q2는 0, 1, 2번째 query인 the의 2 token 이전의 positional attention score를 의미합니다.</p>
<p>그리고 각 row 기준 값이 없는 것들은 Masking을 해줍니다. I는 이전의 key가 없으므로 다 마스킹 됩니다. </p>
<p>이 방식은 query에 따라 positional attention score가 달라지므로 positional encoding보다 풍부한 표현을 할 수 있다는 장점이 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/9dc61604-5dc3-4b83-8acc-f66fe12e25f2/image.png" alt=""></p>
<p>그리고 기존의 attention score와 더할 수 있도록 즉, 마스킹한 모양이 저런 삼각형이 되도록 위와 같은 과정을 거쳐 score를 reshape 해주어야 합니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/36665af0-04dd-44e3-b729-540baa65a1d1/image.png" alt=""></p>
<p>마지막으로 기존 attention score에 relative positional attention score를 더하여 output을 산출합니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/facd7d53-5531-433f-8351-c78849657494/image.png" alt=""></p>
<p>Relative self-attention이 적용된 music transformer는 다양하고 반복적인 곡을 생성함과 동시에 training data보다 2배나 긴 sequence에 대한 generation 또한 가능하다는 것을 확인할 수 있었습니다. </p>
<hr>
<h1 id="references">References</h1>
<ol start="0">
<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>고려대학교 산업경영공학과 강필성교수님 2020-1학기 &#39;비정형데이터분석&#39; 수업 (Graduate) 중 
08-2_Transformer 강의자료와 강의 영상</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS224n] Lecture 13 - Contextual Word Embeddings]]></title>
            <link>https://velog.io/@tobigs-text1314/CS224n-Lecture-13-Contextual-Word-Embeddings</link>
            <guid>https://velog.io/@tobigs-text1314/CS224n-Lecture-13-Contextual-Word-Embeddings</guid>
            <pubDate>Tue, 19 Jan 2021 17:37:48 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 투빅스 13기 <a href="https://github.com/jinseock95">오진석</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Reflections on word representations</li>
<li>Pre-ELMo and ELMo</li>
<li>ULMfit and onward</li>
<li>Transformer archietectures</li>
<li>BERT</li>
</ol>
<hr>
<p>CS224n의 13번째 강의는 단어(word)를 컴퓨터가 이해할 수 있도록 표현하는 방법인 워드 임베딩(word embedding)에 대해 보다 자세히 다룹니다. 단어의 의미를 보다 정확하게 표현하기 위해서는 문장의 문맥을 고려하고 반영해야함의 중요성을 언급하고 있으며, pre-trained Model을 사용함으로써 보다 풍부한 의미의 워드 임베딩을 얻을 수 있다고 말합니다.</p>
<p>첫번째 목파에서는 단어를 표현하는 것의 중요성과 고려해야하는 부분에 대해 간단히 소개하며, 그 이후로는 word embedding 모델을 발전 순서에 따라 설명합니다.</p>
<h1 id="1-reflections-on-word-representations">1. Reflections on word representations</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/216e9c72-b5cd-48d4-9815-bfe5e73328ae/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B34.jpeg" alt=""></p>
<p>단어(word)를 표현(representation)한다는 것은 <strong>워드 임베딩(word embedding)</strong>이라는 방법을 통해, 단어를 벡터로 표현함으로써 컴퓨터가 이해할 수 있도록 자연어를 적절히 변환해주는 방법을 말합니다. 이렇게 단어를 어떠한 벡터로 표현하는 방법으로는 우리는 앞선 강의에서 Word2vec, GloVe, fastText 등을 학습했습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/9e9b034e-5a5b-4918-8bf3-216fc96c0090/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B35.jpeg" alt=""></p>
<p>2012년 전까지에는 &#39;POS tag&#39; task와 &#39;NER&#39; tast에서 다음과 같은 성능을 보였습니다.
이 때, 가장 성능이 높다고 보이는 State-of-the-art는 딥러닝 모델이 아닌 rule-based 혹은 일반적인 머신러닝 방법론을 의미합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/37c2da7c-15de-4857-bf0d-e34a82215830/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B36.jpeg" alt=""></p>
<p>세번째 모델은 word2vec과 같은 unsupervied NN를 supervised NN 방법론과 결합한 방법으로 피처 엔지니어링과 같은 전처리 작업을 조금 거치게 되면 보다 성능이 상승함을 볼 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/e8c09ff3-95dd-455e-bc92-7f5fe02b8db7/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B37.jpeg" alt=""></p>
<p>2014년 이후 단어를 표현하는 방법으로는 pre-trained된 word vector를 사용하는 방법이 일반적인 random initialize된 word vector보다 성능이 좋음을 보여줍니다. 이 때, pre-trained된 word vector가 성능이 더 좋은 이유는 보다 가지고 있는 데이터보다 방대한 양의 데이터로 학습된 결과를 활용하기 때문에 성능 향상에 도움이 된다고 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/f5d61f24-c59d-4616-b542-f10a830759e7/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B310.jpeg" alt=""></p>
<p>pre-trained된 word vector를 사용하는 것은 또한 <strong>unk</strong> 토큰을 처리할 때 보다 효과적이라고 합니다. unk 토큰은 보통 데이터 셋에서 잘 나타나지 않는 단어를 일컫거나, test 데이터 셋에만 존재하는 단어를 unk 토큰으로 분류하게 됩니다. 하지만 단순히 횟수로 단어를 unk로 분류하게 되면 unk 토큰이 가지는 의미가 모호해지며 중요한 의미를 가지는 단어를 놓칠 수 있게 됩니다. 이 강의에서는 이러한 unk 토큰을 처리하는 방법으로 3가지를 제시하는데, 그 중 pre-trained word vector를 사용하는 방법이 가장 효과적이라고 말합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/b5a862fd-9511-400d-85f7-9047b51bcd56/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B312.jpeg" alt=""></p>
<p>다시 돌아와서 단어를 표현하는 함에 있어서 word embedding이라는 방법을 사용할 때도 고려해야할 문제가 있습니다. 바로 1개의 단어를 1개의 vector로 표현하는 것은 동음이의어와 같은 문제를 발생시킬 수 있기 때문입니다. 여기서는 1개의 단어를 1개의 vector로만 표현하게 된다면, vector가 문맥에 따라 달라지는 단어의 type을 고려하지 못하는 문제와 단어의 언어적/사회적 의미에 따라 달라지는 측면을 고려하지 못하는 문제가 있다고 언급합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/8577e3b5-b216-401c-9fc1-abebbd134d6f/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B313.jpeg" alt=""></p>
<p>바로 이러한 context, 문맥을 고려하여 word vector를 생성할 수 있는 방법으로 Neural Language Model을 제시할 수 있다고 합니다. LSTM 구조가 적용된 해당 language model은 문장의 sequence를 고려하여 다음 단어를 예측하는 모델로 sequence의 학습을 통해 문맥을 어느정도 유지할 수 있다고 합니다. 그리고 이러한 특징을 활용한 모델의 대표적인 사례가 ELMo 모델입니다.</p>
<h1 id="2-pre-elmo-and-elmo">2. Pre-ELMo and ELMo</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/4cc741f8-3afe-4607-984e-881c842fbd8c/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B315.jpeg" alt=""></p>
<p>두 번째 목차에서는 Pre-ELmo와 ELMo 모델의 구조와 특징에 대해 설명합니다. 먼저 해당 강의에서는 ELMo를 발표한 저자가 ELMo를 발표 이전에 제시했던 TagLM을 Pre-ELMo라고 지칭합니다. Pre-ELMo는 ELMo의 기본적인 구조가 굉장히 유사하며 RNN을 통해 context가 유지되는 word vector를 찾기 위한 가정이 적용되어 있습니다. 또한 Neural Language Model로 word vector를 pre-trained한 뒤에 추가로 학습이 진행되는 Semi-supervied 접근법이 활용되었습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/e72df5d0-1040-4690-b4a5-73494987fb8d/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B318.jpeg" alt=""></p>
<p>Pre-ELMo의 전체적인 구조는 다음과 같습니다. 어떠한 input이 들어오게 되면 2가지 다른 방법으로 parallel하게 단어가 임베딩됩니다. 한 쪽으로는 Word2vec과 같은 conventional word embedding 모델, 다른 한쪽으로는 bi-LSTM과 같은 RNN이 적용된 word embedding 모델을 통과하게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/ff6e4d8f-b2a1-43ab-8964-9e31bdae68a5/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B319.jpeg" alt=""></p>
<p>그렇게 2가지 접근법으로 만들어진 word vector를 NER과 같은 small task-labeled에 사용하게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/0e5a8af0-cb04-4773-bc13-9fb799ad17c5/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B320.jpeg" alt=""></p>
<p>즉, context가 아닌 특징 자체를 고려한 word vector와 데이터의 문맥(context)를 고려한 word vector를 모두 사용하였고 의미를 반영했다고 볼 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/4b493319-c8ac-4ce3-a360-304fe6f03104/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B322.jpeg" alt=""></p>
<p>전체적인 구조를 다시 보게 되면 우측에 존재하는 pre-trained model로 학습한 word vector와 char-CNN model로 학습한 word vector를 concat하는 과정을 수식을 통해 확인할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/1592c052-200a-4ea9-91a4-5c4a4b9543da/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B323.jpeg" alt=""></p>
<p>여기서 강의 도중에 한 학생이 질문으로 교수님이 답을 해주게 됩니다. 질문이 정확하게 들리지는 않지만 우측에 존재하는 pre-trianed bi-LM에서 &#39;pre-trained&#39;의 의미에 대해서 물어보는 것 같았고 교수님께서는 위와 같이 답변해줍니다. 여기서 말하는 pre-trained라는 의미는 한번 학습을 통해서 고정된(fixed)된 word vector라는 의미입니다. 그렇다면 char-CNN과 같은 다른 방법으로 word vector가 생성되는 방법에서는 이 word vector가 backpropagation을 통해 계속해서 학습 및 업데이터 됨을 의미하는 것 같습니다.(정확하지는 않습니다 ㅠ)</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/bf20c05f-5194-4d54-88b1-72c2ed069eb1/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B325.jpeg" alt=""></p>
<p>Pre-ElMo의 저자가 해당 방법론을 보다 일반화하여 새롭게 제시한 모델이 ELMo입니다. ELMo의 특징은 모든 문장 전체를 사용해서 문맥이 반영된 word vector를 학습하는 모델입니다. 이는 보통 window를 지정함으로써 주변 단어를 통해서만 문맥을 고려하게 되는 기존 모델과의 차이를 보입니다. 전체적인 흐름으로는 char-CNN과 같은 모델로 단어의 특징을 고려한 word vector를 구하고 해당 vector를 LSTM의 Input으로 사용해서 최종 word embedding 결과를 도출하는 과정을 가집니다. 이러한 과정을 거치게 되면 &#39;present&#39;라는 동일한 단어임에도 문장에 따라 &#39;선물&#39;과 &#39;현재&#39;라는 다른 word vector로 표현될 수 있게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/8eb8dbaf-d105-4dbf-9349-43ae4ba47cc3/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B327.jpeg" alt=""></p>
<p>ELMo의 전체적인 구조는 순방향 Language Model과 역방향 Language Model이 모두 적용된 bidirectional Language Model이라고 볼 수 있습니다. 순방향 모델은 문장 sequence에 따라 다음 단어를 예측하도록 학습되며 역뱡향 모델은 뒤에 있는 단어를 통해 앞 단어를 예측하도록 학습됩니다. ELMo는 모든 layer의 출력값을 활용해서 최종 word vector를 임베딩하는데 이는 최종 layer의 값들로만 word vector로 사용했던 이전 모델들과의 차이점을 보입니다. 해당 내용은 뒤에서 보다 자세하게 설명할 예정입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/a0c498c1-b0ec-45c4-98f8-252fc677abb6/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B329.jpeg" alt=""></p>
<p>순방향 모델이 학습되는 과정에 대해서 알아보겠습니다. 먼저 input으로 들어오는 문장과 단어는 char-CNN을 통해 임베딩이 됩니다. 여기서 char-CNN이 사용되는 이유는 최초 임베딩은 context의 영향보다는 단어 자체의 특징을 찾기를 원했고, word2vec 혹은 glove와 같은 pre-trained word embedding 모델과 비교를 위해서입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c45385f4-e928-4acc-bdce-561c2b231630/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B331.jpeg" alt=""></p>
<p>첫번째 layer는 문맥으로부터 영향을 받지 않도록 설계하였지만 이후 layer인 LSTM layer에서는 문맥을 반영하도록 하였습니다. 첫번째 LSTM layer에서는 char-CNN의 결과에residual connection을 적용하였습니다. residual connection을 적용함으로써, char-CNN으로 반영된 단어의 특징을 잃지않고 유지할 수 있고, 학습 시 역전파를 통한 gradient vanishing 문제를 완화시킬 수 잇었습니다. 그렇게 첫번째 layer에서 얻은 결과로 다음 단어를 예측하는 LSTM layer를 통과하게 됩니다.</p>
<p>이 때, &#39;I read a book yesterday&#39; 문장에서 &#39;I&#39; 다음으로 예측할 &#39;read&#39;는 현재형과 과거형이 같기 때문에 모델은 &#39;read&#39;를 현재형과 과거형을 구분할 수 없으며, 보통 현재형으로 임베딩을 출력할 가능성이 높다고 합니다. 하지만 역방향 모델을 같이 활용함으로써, 뒤에서 발견되는 &#39;yesterday&#39;로 &#39;read&#39;가 과거형임으로 알 수 있고 보다 정확한 임베딩을 뽑아낼 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/fe630899-bd7c-4e0e-ba05-ea106f06e606/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B332.jpeg" alt=""></p>
<p>그렇게 순방향 모델과 역방향 모델이 각각 그 다음과 그 전의 단어를 예측하기 위해 학습된 layer 정보다 다음과 같이 표시할 수 있습니다. 해당 그림은 &#39;read&#39;의 다음 단어를 예측하는 순방향 모델, 그리고 &#39;read&#39;의 전 단어를 예측하는 역방향 모델의 &#39;read&#39; 부분만을 추출한 결과입니다. 즉, &#39;read&#39;에 대한 각 layer별 출력값이 존재하며 확인할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/ab10d80b-069a-457f-a80c-ae56f2ad2a85/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B333.jpeg" alt=""></p>
<p>다음과 같이 &#39;read&#39;에 대한 각 layer의 출력값만 추출하고 두 모델의 데이터를 모두 활용하기 위해 concat할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/90fbedc6-aad3-4886-908b-1addaa4a485e/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B335.jpeg" alt=""></p>
<p>그렇게 concat된 layer별 출력에 정규화된 가중치를 곱해주며 학습을 통해 최적화합니다. 최종적으로는 모든 layer의 벡터를 더해 하나의 임베딩 벡터라는 word vector를 만들게 됩니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/63a579db-55d9-429a-9f28-8f1313f1076c/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B336.jpeg" alt=""></p>
<p>이렇게 되면, syntax 특징을 고려한 하위 layer의 정보와 semantics 특징을 고려한 상위 layer의 정보를 모두 활용함으로 효과적인 word vector라고 할 수 있습니다. syntax 정보는 tagging, NER 등과 같은 단어 자체가 가지고 있는 특징을 의미하고 semantics 정보는 문맥이 고려된 특징을 의미합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/ec6fe44e-b3ec-4e1b-be0e-ae250844bdf2/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B337.jpeg" alt=""></p>
<p>ELMo의 등장이 NLP 분야에서 굉장히 놀라움을 선사했는데, NER뿐만 아니라 대부분의 task에서 SOTA의 성능을 보여주었기 때문입니다.</p>
<h1 id="3-ulmfit-and-onward">3. ULMfit and onward</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/ebb70b15-e646-48d8-8b3e-b7e6ad45724d/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B339.jpeg" alt=""></p>
<p>ELMo를 시작으로 contextual word representaion에 대한 관심이 증가하게 되면서 ULMfit이 등장하게 됩니다. ULMfit에서는 NLP에서 본격적으 transfer learning이 도입되게 된 시점이라고 소개합니다. 여기서 transfer learning이란 대량의 다른 데이터로 일반적인 학습을 진행한 뒤에, 목적에 맞게 다시 튜닝을 통해 성능을 개선해 나가는 것을 의미합니다. 여기서 ULMfit은 text classification이라는 목적을 가지게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c697b916-1b9c-45d5-8c9f-e663b6d1a4e9/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B341.jpeg" alt=""></p>
<p>ULMfit의 전체적인 구조는 다음과 같으며 구조에 따른 학습 과정을 구분할 수 있습니다. 먼저 앞서 언급한 transfer learning부분으로, Language Model이 대량의 corpus를 기반으로 학습하게 됩니다. 다음으로 기학습된 언어 모델을 토대로 주어진 task에 맞게 추가 학습되면서 업데이트를 진행하게 됩니다. 마지막으로는 최종적으로 classifier가 출력되는 부분으로 word vector가 결국 분류기로 출력됨을 의미합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/116657fa-35a5-4b99-bd27-916e74d17fc8/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B342.jpeg" alt=""></p>
<p>각 과정에 대해서 보다 구체적이게 알아보겠습니다. transfer learning을 의미하는 일반 언어 모델이 학습되는 부분입니다. 논문에서는 Wikipedia의 정제된 28,595개의 article과 word를 기반으로 언어 모델을 학습(pre-trained)했다고 말합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/92e8697b-92a8-479b-a68a-8098c470252a/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B343.jpeg" alt=""></p>
<p>두번째 과정은 주어진 task에 맞추어 다시 언어 모델을 튜닝하는 부분입니다. 예를 들어, 주어진 task에서 100개의 텍스트와 그에 따른 label이 있다면, 해당 데이터만을 가지고 다시 학습 및 업데이트 과정을 거치게 됩니다.</p>
<p>이 때, 튜닝 시 사용하는 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>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/238a8a9b-9a84-4de9-bd51-831cd4298861/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B345.jpeg" alt=""></p>
<p>ULMfit의 결과는 다음과 같습니다. 좌측 그래프를 보게 되면 pre-trained의 중요성을 볼 수 있습니다. train 데이터셋이 굉장히 부족함에도 불구하고 pre-trained된 ULMfit 모델을 사용하게 되면 error rate가 굉장히 낮음을 알 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/db72ae30-8e2b-40cb-b237-f4c3296830d4/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B348.jpeg" alt=""></p>
<p>ULMfit 이후로는 모델의 parameter를 늘리고 pre-trained할 데이터양을 늘려 기하급수적으로 리소스가 필요한 모델들이 등장하게 됩니다. GPT, BERT, GPT2와 같은 모델은 글로벌 기업에서 엄청난 양의 데이터를 기반으로 학습한 pre-trained 모델을 제공합니다. 또 해당 모델들은 LSTM 모델이 아닌 모두 Transformer 기반의 모델임을 알 수 있습니다.</p>
<h1 id="4-transformer-archietectures">4. Transformer archietectures</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/dbe98cfd-2e02-4729-a691-45a09b6970fe/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B351.jpeg" alt=""></p>
<p>Transformer기반 모델이 등장하게 된 계기는 LSTM 모델에도 발견되는 <strong>RNN의 태생적인 한계</strong>가 여전히 존재하기 때문입니다. 먼저 RNN은 sequential한 특징을 고려하기 때문에 병렬적 계산이 불가능하여 매우 느린 속도를 보입니다. 또한 입력 데이터의 sequential한 특징으로 긴 입력에 대한 Long-term Dependency 문제가 항상 존재했었고 LSTM, GRU로 해당 문제를 어느정도 해결할 수 있었지만 완전히는 불가능했습니다.</p>
<p>이 때, 모든 state를 참조할 수 있기 때문에 sequential한 특징에서 자유로운 Attention 매커니즘만을 활용한다면 RNN 계열의 모델의 한계를 해결할 수 있다고 생각했기에 Transformer 기반 모델들이 등장하게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/1763c814-6770-4171-9f43-43e146acccf5/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B352.jpeg" alt=""></p>
<p>Transformer는 기계 번역을 위해 존재하는 input과 output이 encoder와 decoder로 구분되어 진행되는 seq2seq 모델입니다. 이 때, decoder의 어떤 step과 encoder의 전체 step 중 가장 연관성 있는 한 step을 찾아가면서 보다 효과적인 seq2seq 과정을 거치게 됩니다.</p>
<p>Attention이 모든 state를 참조할 수 있다는 의미는 decoder에서 output으로 나오는 매 step마다, encoder의 전체 step을 참고하기 때문입니다. 이 때, decoder가 encoder를 참고하는 과정에 있어 decoder의 단어와 step에 따라 attention value가 달라지게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/09ba223b-dc8c-48c2-90e4-e19b252c1abd/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B353.jpeg" alt=""></p>
<p>Tranformer 모델의 구조를 알아보기 전에 Attention 매커니즘에 대해서 아주 간단히 알아보겠습니다. 보통 Attention의 구조에는 query, key, value가 존재하며 3가지 특성을 가지고 attention value를 도출하게 됩니다.</p>
<blockquote>
<p>Attention(Q, K, V) = Attention Value</p>
</blockquote>
<p>Attention 매커니즘은 주어진 &#39;쿼리(Query)&#39;에 대해서 모든 &#39;키(Key)&#39;와의 유사도를 각각 구합니다. 그리고 구해낸 이 유사도를 키와 맵핑되어있는 각각의 &#39;값(Value)&#39;에 반영해줍니다. 그리고 유사도가 반영된 &#39;값(Value)&#39;을 모두 더해서 반환합니다. 여기서는 이 값을 Attention Value이라고 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/2902a878-45da-43e1-84af-6b6863b4ea32/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B354.jpeg" alt=""></p>
<p>또 등장하는 개념은 self-attention 입니다. self-attention이란 자기 자신의 query로 attention value를 구하는 것으로, 그림과 같이 특정 단어가 자신의 문장에서 다른 단어와의 attention value를 구함으로써 dependency와 같은 value의 높고 낮음을 구할 수 있게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/5275b177-aa44-4129-b878-b72ca5bd2431/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B355.jpeg" alt=""></p>
<p>이렇게 self-attention이 일어나느 부분을 논문에서는 &#39;Scaled Dot Product Attention&#39;이라고 하는데, 마지막 softmax를 통해 어떤 step? 단어?와의 값을 뽑아낼 수있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/806ad288-7d4e-4cf6-8727-25c51b180829/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B357.jpeg" alt=""></p>
<p>Transformer의 전체적인 구조는 다음과 같습니다. Encoder와 Decoder로 구성되어 있는 transformer의 구조에는 Multi-Head Attention을 또 확인할 수 있습니다. 여기서 보이는 Multi-Head Attetion 부분이 바로 self-attention이 발생되는 지점입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/0b04c493-d943-42c1-8469-131b6c5b7900/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B358.jpeg" alt=""></p>
<p>Multi-Head Attention이란 새로운 개념이라기 보다는 앞서 설명한 attention 매커니즘이 여러번 적용된 개념입니다. Multi-Head가 의미하는 것은 다양한 관점에서 바라볼 때, 보다 풍부한 정보를 얻을 수 있다는 것에 착안하여, attention을 다수로 진행함으로써 보다 많은 정보를 가져와 projection하여 다음 layer에 전달하는 과정을 말합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/b0a1fead-de90-42e2-a1a2-1434735662df/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B359.jpeg" alt=""></p>
<p>Multi-Head Attention이 이뤄지는 과정을 간단하게 시각화하게 되면 다음과 같습니다. 각 Head는 하나의 attention 과정을 의미하며, Scaled Dot Product Attention 과정이 각각 발생합니다. 그렇게 발생한 Head별 output은 concat되어 다음 layer로 전달되게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/4b3235cc-2191-4ad3-bd4d-aac0981576af/image.png" alt=""></p>
<p>이러한 과정을 거치는 Transformer 모델을 예시로 보게 되면 다음과 같습니다. 본래 모든 과정을 살펴보게 되면 Embedding 과정과 Feed Forward 등의 과정이 있지만 이번 내용에서는 attention 과정이 이뤄지는 부분에 보다 집중하였습니다.</p>
<p>&#39;I love you&#39;라는 문장이 Encoder에 들어오게 되면 임베딩을 거친 후에 Multi-Head Attention 과정을 거칩니다. 여기서는 &#39;I love you&#39;의 각 단어가 문장 안에 존재하는 단어들과의 attention value를 통해 dependency를 확인할 수 있습니다.(여기서 언급한 dependency는 CS224n 5장의 dependeny를 의미하는 것이 아닌, 단어와 단어와의 연관도 정도로 표현하였습니다.) 반대로 Decoder 부분에서도 번역된 문장이 self attention 과정을 거칩니다. 다음으로 self-attention을 거친 두 문장은 Multi-Head Attention 과정을 거치면서(정확하게는 self-attention이라고 표현할 수는 없을 것 같습니다.) 보다 정확한 번역을 가능하게 해주는 것으로 이해했습니다.</p>
<h1 id="5-bert">5. BERT</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/1df6a88c-f673-4927-9eb5-e13fd8113335/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B364.jpeg" alt=""></p>
<p>드디어 BERT 입니다. 앞서 살펴본 Transformer는 기계번역을 위한 seq2seq translation을 의미합니다. 하지만 BERT는 Transformer의 encoder부분을 차용하여 Bi-directional Language Model을 구축한 모델입니다.</p>
<p>BERT가 발견한 language model의 한계점은 기존에 가지고 있던 bi-direction의 문제점입니다. 보통 bi-direction은 ELMo에서도 확인할 수 있듯이, 순방향과 역방향이 모두 적용된 의미를 가집니다. 하지만 이러한 bi-direction의 순방향과 역방향은 각각 독립적으로 적용되기 때문에 순방향 혹은 역방향이라는 sequence를 가지게 됩니다. 즉, 다음 단어 혹은 전 단어를 예측할 때에도, 그 때까지 존재하는 단어만을 기반으로 예측에 활용할 수 있다는 의미입니다. 결국 순방향과 역방향 모델을 모두 적용함에도 불구하고 단어를 예측함에 있어 전체 단어를 모두 활용할 수는 없다는 것을 말합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/779b6f78-cb65-432c-b796-abf8fe54a1cd/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B365.jpeg" alt=""></p>
<p>앞서 언급한 기존의 bi-direction은 순방향, 역방향 모델을 같이 활용한다고 해도 결국은 각 모델은 단방향 예측만 가능함을 알 수 있습니다. 하지만 위와 같은 양방향 예측이 한번에 가능하다면 가운데 들어갈 어떤 단어를 예측함에 있어 보다 많은 정보를 기반하여 가능하게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/48434a63-ec82-4dc9-a3e0-ab1a4665c255/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B366.jpeg" alt=""></p>
<p>BERT는 이러한 문제를 Masked Language Model을 적용함으로써 해결할 수 있었습니다. 문장에 존재하는 단어 중 일부를 masked 처리한 뒤에, maksed 처리된 단어를 나머지 모든 단어로 예측하는 과정을 말합니다. 이렇게 되면 masked된 단어를 제외한 모든 단어를 활용할 수 있게 되면서 순방향과 역방향의 모든 문맥을 한번에 고려할 수 있게 됩니다.</p>
<p>BERT는 2가지 목적 함수를 가집니다. 첫번째는 앞서 언급한 masked된 단어를 예측하는 mask prediction이며 두번째는 문장과 문장간의 연속성 여부에 대한 정보를 학습하는 Next sentence prediction입니다.</p>
<h3 id="참고자료">참고자료</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=DI_8PRAOttU">KoreaUniv DSBA, [CS224N]-13. Contextual Word Representation and Pretraining, 이정훈</a></li>
<li><a href="https://jeongukjae.github.io/posts/cs224n-lecture-13-modeling-contexts-of-use/">Jeong Ukjae, CS224n Lecture 13 Modeling contexts of use: Contextual Representations and Pretraining</a></li>
<li><a href="https://wikidocs.net/33930">wikidocs, 딥 러닝을 이용한 자연어 처리 입문 – 07) 엘모(Embeddings from Language Model, ELMo)</a></li>
<li><a href="https://www.youtube.com/watch?v=YZerhaFMPTw">Minsuk Heo 허민석, ELMo (Deep contextualized word representations)</a></li>
<li><a href="https://brunch.co.kr/@learning/13">전이 학습 기반 NLP (2): ULMFiT, 박성준</a></li>
<li><a href="https://wikidocs.net/22893">wikidocs, 딥 러닝을 이용한 자연어 처리 입문 – 01) 어텐션 메커니즘 (Attetion Mechanism)</a></li>
<li><a href="https://medium.com/platfarm/%EC%96%B4%ED%85%90%EC%85%98-%EB%A9%94%EC%BB%A4%EB%8B%88%EC%A6%98%EA%B3%BC-transfomer-self-attention-842498fd3225">Platfarm tech team, 어텐션 메커니즘과 transfomer(self-attention)</a></li>
<li><a href="https://pozalabs.github.io/transformer/">포자랩스의 기술 블로그, Attention is all you need paper 뽀개기</a></li>
<li><a href="https://www.youtube.com/watch?v=xhY7m8QVKjo">KoreaUniv DSBA, Transformer &amp; BERT, 김동화</a></li>
<li><a href="https://www.youtube.com/watch?v=PKYVHGrSO2U&amp;t=2473s">KoreaUniv DSBA, BERT4REC, 이정호</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS224n] Lecture 12 - Subwords]]></title>
            <link>https://velog.io/@tobigs-text1314/CS224n-Lecture-12-Subwords</link>
            <guid>https://velog.io/@tobigs-text1314/CS224n-Lecture-12-Subwords</guid>
            <pubDate>Mon, 18 Jan 2021 17:04:50 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/tobigs-text1314/post/555e3f74-8227-4f2b-9713-36286e03cd07/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C1.PNG" alt="">
작성자 : 투빅스 14기 <a href="https://github.com/Annie-Yeeun-Jang">장예은</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Purely Character-Level Models</li>
<li>Subword-Models</li>
<li>Hybrid Models</li>
</ol>
<hr>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/4d044535-5c01-461a-a2f4-dda13ac970b8/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C3.PNG" alt=""></p>
<p>Cs224n 강의에서 언어학 관련 용어가 많이 등장하여 자주 등장하는 용어를 정리해보았습니다. 강의를 들으시면서 참고하시면 좋을 것 같습니다. :)</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c6103da9-0398-49a9-ab2c-22139ad20c9f/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C4.PNG" alt=""></p>
<p> 오늘 소개할 3가지 종류의 모델 중 첫번째인 Purely character level 모델입니다.
 Purely-character level model의 필요성은 두 가지입니다. 첫째로, 언어마다 단어 표현 방법이 다르기 때문에 character level로 접근하는 것이 더 효과적인 경우가 있기 때문입니다. 둘째로, 말 그대로 ‘large’하고 ‘open’한 어휘를 다룰 수 있어야 하기 때문입니다. 이어서 두 가지 이유에 대해 더 자세히 살펴보겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/a50c651b-c85e-44ac-a17b-e7c8f3a5ca5d/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C5.PNG" alt=""></p>
<p> Purely character level model이 필요한 첫 번째 이유, 언어별로 특성이 상이하다는 점은 이러한 예시를 통해 명확하게 알 수 있습니다.  중국어의 경우에는 띄어쓰기가 없고, 프랑스어와는 달리 아랍어의 경우에는 의미가 추가될 때 하나의 단어처럼 결합됩니다. </p>
<p> 독일어 Lebensversicherungsgesellschaftsangestellter와 영어 life insurance company employee는 같은 의미입니다. 이처럼 같은 내용이라도 언어마다 표기 방식이 상이하기 때문에 일부 언어에서는 character level의 접근이 더 효과적입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/64d30456-8a7d-4fa7-9a0a-8e202be83fe6/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C6.PNG" alt=""></p>
<p> 두번째 이유, large, open vocabulary를 다룰 필요성은 체코어와 같이 풍부한 형태학 (morphology)를 가진 언어와 외래어 표기와 같은 음역 (transliteration) , sns등에서 자주 볼 수 있는 맞춤법에 맞지 않는 철자 표기 등의 문제점 때문에 주목받고 있습니다. Sns에서 자주 사용하는 good vibeeeees, idc와 같은 표기는 그 의미가 명확하게 전달되지만, 모델은 이 표기를 good vibes, i don’t care와 완전히 동일하게 인식하지 못할 수 있기 때문입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c414f61d-b319-4e0d-b1e7-28154d5cf209/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C7.PNG" alt=""></p>
<p> Purely character level model은 특히 체코어 번역에서 우수한 성능을 보입니다. 2015년에 발표된 Pure character level seq2seq system은 character level model로 영어-체코어 번역을 했지만 학습시간이 3주나 되었고, BLEU(성능 측정 메트릭)가 15.9에 불과하다는 단점이 있었습니다. 예시에서 볼 수 있듯이 word level 모델에 비해 사람 이름을 잘 번역하는 경향이 나타났습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/dda0e83d-afa8-4052-bf31-2678a4bf58c7/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C8.PNG" alt=""></p>
<p> 2017년에 나온 또 다른 character level 번역 모델은 앞선 모델보다 더 나은 성능을 보였습니다. 이 모델의 인코더의 구조는 먼저 character 단위의 input을 주고, convolution layer를 거친 다음, max pooling과 single layer GRU를 거치는 구조입니다. 앞선 모델의 BLEU 15.9보다 더 나은 성능을 보여주고 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/7b5b4cc2-9ee4-424c-bf7f-43cff6b3fb4c/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C9.PNG" alt=""></p>
<p> 앞서 살펴본 그림의 구조는 모델의 인코더에 해당하는 부분의 구조였습니다. 모델의 전체적인 구조는 왼쪽 table 1과 같이 인코더 외에 2 layer GRU 디코더가 추가되어 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/d73b9cbf-a2fb-41ea-8af0-6a533e03d7fe/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C10.PNG" alt=""></p>
<p> character level의 seq2seq 모델과 word level의 BPE 모델의 성능을 비교한 그래프입니다. 왼쪽의 두 그래프를 보면 영어 -&gt; 프랑스어 번역에서는 두 모델의 성능이 크게 차이가 나지 않지만, 체코어 -&gt; 영어 번역에서는 character based 모델인 BPE가 훨씬 우수한 성능을 보이고 있음을 알 수 있습니다. 
 이를 통해 언어의 특성에 따라 word level 모델과 character level 모델의 성능에 차이가 있음을 알 수 있습니다. 오른쪽의 그래프는 두 모델의 연산량 차이를 비교하고 있는데, character level 모델의 연산량이 훨씬 더 많습니다.</p>
<hr>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/2bbc4841-10bf-4a31-98d3-71453cd63ad6/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C11.PNG" alt=""></p>
<p> 오늘 소개할 두번째 모델 종류는 Subword model입니다. 
Subword 모델은 word level 모델과 동일하지만, 더 작은 word인 word pieces를 이용합니다. Subword모델의 대표적인 예시인 BPE 모델은 딥러닝과 무관한 간단한 아이디어를 사용하고 있습니다. 이 모델은 자주 나오는 byte pair(n gram)를 새로운 byte(a new gram)로 clustering하여 추가하는 방식입니다. 예시를 통해 살펴보겠습니다. 왼쪽 그림과 같은 딕셔너리가 있을 때, es, est, lo가 자주 등장합니다. 따라서 이 단어들을 새로 추가하여 각각 하나의 단어로 취급합니다. 지정된 최대 길이를 넘으면 이러한 추가 과정을 중단합니다. 
 이러한 점에서 시스템의 vocabulary를 자동적으로 결정한다고 할 수 있습니다. BPE모델은 효과적인 성능이 검증되어 널리 응용되고 있습니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/9707e54a-c424-4835-a350-cf9aefd6b3fc/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C12.PNG" alt=""></p>
<p> Wordpiece와 sentencepiece에 대해 강의에서 나온 부분 이외에 추가적으로 더 살펴보겠습니다. Word piece 모델은 BPE를 변형한 알고리즘입니다. BPE는 앞서 언급했던 것과 같이 빈도수에 기반해서 가장 많이 등장한 쌍을 병합합니다. 하지만 Word piece모델은 가장 많이 등장한 쌍이 아닌 병합되었을 때 코퍼스의 우도를 가장 높이는 쌍을 병합합니다. BPE와의 유사점은 자주 등장하는 piece는 unit으로 묶고, 자주 등장하지 않는 것은 분리한다는 점입니다. 
 예시를 참고하면 이해하기가 수월할 것입니다. Word piece 모델을 수행한 결과에서 자주 나오지 않는 단어 Jet와 feud는 J, et  fe, ud로 나누어졌습니다. 원래의 문장에서 띄어쓰기가 있던 부분은 언더바 ( _ )로 대체하는데, 이는 수행 결과를 수행 전의 결과로 복원하는 과정을 위함입니다. 원래의 문장으로 복원하는 방법은 수행 결과의 모든 띄어쓰기를 제거하고, 언더바를 띄어쓰기로 바꾸는 것입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/0e6b346e-8618-4556-977c-8a3bf5f4a9a1/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C13.PNG" alt=""></p>
<p> Sentencepiece는 word piece 토큰화를 수행하는 패키지입니다. 구글에서 2018년에 공개한 비지도학습 기반 형태소 분석 패키지로, 사용하려면 pip install sentencepiece 명령을 통해 설치해야 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/8b7357b2-52b5-4efd-8049-24aa90bc254e/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C14.PNG" alt=""></p>
<p> 이외에도 다른 word piece, sentence piece 모델이 있습니다. BERT도 하나의 예시인데요, BERT는 vocab size가 크지만, 엄청 크지는 않기 때문에 word piece를 사용할 필요가 있습니다. 따라서 상대적으로 등장 빈도가 높은 단어들과 더불어 wordpiece를 사용합니다. 예를 들면 사전에 없는(등장 빈도가 높지 않은) Hypatia 라는 단어의 경우 H yp ati a 처럼 4개의 word vector piece로 쪼개집니다. </p>
<hr>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/a449b3c5-cedb-426e-94ca-0f19567e7478/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C15.PNG" alt=""></p>
<p> 오늘 소개할 마지막, 세번째 모델의 종류는 Hybrid 모델입니다.
 Hybrid 모델은 기본적으로 단어를 word 단위로 취급하고, 몇몇만 character 단위로 취급하는 모델입니다. character 모델과 word 모델의 방식을 혼용한 것이라 할 수 있습니다. 주로 고유명사나 사전에 없는 단어를 character 단위로 취급합니다. Hybrid 모델의 일종인 character-based LSTM의 구조는 오른쪽의 그림과 같습니다. 처음의 input 단어를 character level로 다루고, 이것을 합친 output이 더 높은 레벨의 모델의 input이 되는 구조입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/d8f80d3c-8958-49ea-8ae2-9b78a1a2169b/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C16.PNG" alt=""></p>
<p> Hybrid 모델의 두번째 예시인 Character Aware Neural Language Model은 subword의 관계성을 인코딩하는 모델입니다. 세 단어 eventful, eventfully, uneventful 처럼 공통된 subword에 의해 의미적인 관계가 존재하는 경우에 유용합니다. 이 모델은 다른 모델이 가진 rare-word problem을 해결하고, 더 적은 파라미터 수로 비슷한 성능을 낸다는 장점이 있습니다. 모델의 전체적인 구조는 오른쪽의 그림과 같습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/84c2fa15-8afd-4f28-b622-0eabd27169a4/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C17.PNG" alt=""></p>
<p> 모델의 구조에 대해 더 자세히 살펴보겠습니다. 먼저 input값에 해당하는 단어를 character 단위로 구분한 상태에서 시작합니다. character 단위로 구분된 단어가 convolutional layer를 거쳐 feature representation 단계로 넘어갑니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/b1cf0d23-4c9b-4da2-ba7e-753fd390fea5/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C18.PNG" alt="">
생성된 feature representation은 highway network를 거칩니다. 이 과정은 LSTM과 유사한 기능을 합니다.  Highway network의 output은 Word level LSTM을 거쳐 최종 output을 출력합니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/10118012-a314-468a-a476-2ad5268ece04/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C19.PNG" alt="">
이 모델의 실험 결과를 보면 앞서 언급했던 것처럼 다른 모델(size: 52m)보다 훨씬 더 적은 수의 파라미터 수로 (size: 19m) 비슷한 성능을 내는 것을 알 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/0fa59d0c-f735-40f9-bbca-832023a9c866/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C20.PNG" alt=""></p>
<p>이 모델에서 볼 수 있는 흥미로운 점은 highway network 부분의 역할입니다. Richard 라는 사람 이름은 input으로 주었을 때, highway block 부분 이전에는 Richard와 의미가 아닌 철자만 유사한 hard, rich 등의 단어들이 가장 유사한 단어로 출력되었습니다. 단어의 철자의 유사도만 파악하고, 단어의 의미를 파악하지 못한 것입니다.하지만, highway block 부분을 거친 이후에는 이 단어의 의미를 파악하여 Edward, Carl 등 다른 사람 이름을 유사한 단어로 출력하고 있음을 볼 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/3ad9352d-f0f8-4931-81db-241a120371fa/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C21.PNG" alt=""> </p>
<p>Hybrid 모델의 세번째 예시인 Hybrid NMT의 구조는 오른쪽의 그림과 같습니다. 이 모델은 대부분 word level에서 접근하고, 필요할때만 character level로 접근합니다. 모델 예시를 나타낸 그림에서 cute와 joli 단어 부분만 character level로 접근하고, 나머지 단어들에 대해서는 word level로 접근하고 있는 것을 볼 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/b9843c35-5b0c-4665-9614-2a5445fca4f5/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C22.PNG" alt=""></p>
<p>지금까지 살펴보았던 Hybrid모델의 우수성은 다음 예시에서도 확인해볼 수 있는데요, Word level 모델은 diagnosis라는 단어를 아예 잃어버려 unknown으로 출력하거나 po라는 직전에 등장한 단어를 그대로 출력한 것을 볼 수 있습니다. 반면에, hybrid 모델은 이 단어도 놓치지 않고 정확하게 번역한 것을 볼 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/8780ff58-935a-4ed5-8c12-6c20108ca49a/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C23.PNG" alt=""></p>
<p>강의에서 짧게 FastText Embedding이 언급되었는데요, word2vec과 같은 차세대 word vector learning library로 주목받고 있는 임베딩 방법입니다. 한 단어의 n gram과 원래의 단어를 모두 학습에 사용한다는 특징이 있습니다. 예시를 통해 사려보면, where이라는 단어가 있을 때 원래의 단어인 where와 이 단어의 n gram인 wh, whe, her, ere, re를 모두 학습에 사용합니다. N gram인 her는 기존에 존재하는 단어인 ‘her’와 다르듯, 이러한 점을 반영한다는 점에서 효과적입니다. </p>
<hr>
<h3 id="참고자료">참고자료</h3>
<p>CS224n 12강 subword
<a href="https://wikidocs.net/22592">https://wikidocs.net/22592</a>
<a href="https://lovit.github.io/nlp/2018/04/02/wpm/">https://lovit.github.io/nlp/2018/04/02/wpm/</a>
<a href="https://arxiv.org/pdf/1607.04606.pdf">https://arxiv.org/pdf/1607.04606.pdf</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS224n] Lecture 11 - ConvNets for NLP]]></title>
            <link>https://velog.io/@tobigs-text1314/CS224n-Lecture-11-ConvNets-for-NLP</link>
            <guid>https://velog.io/@tobigs-text1314/CS224n-Lecture-11-ConvNets-for-NLP</guid>
            <pubDate>Mon, 18 Jan 2021 17:03:41 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 투빅스 13기 <a href="https://github.com/cryingjin">이예진</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Intro </li>
<li>1d Convolution for Text </li>
<li>CNN for Classification</li>
<li>추가 &amp; 정리</li>
<li>Deep CNN for Text</li>
</ol>
<hr>
<h1 id="1-intro">1. Intro</h1>
<h2 id="기존-rnn의-문제와-cnn">기존 RNN의 문제와 CNN</h2>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/0a720090-3b16-4312-8120-338382b10373/CS224n_11_ConvNets_for_NLP-03.png" alt="">
기존 RNN계열의 모델은 the, of,..등의 필요 없는 단어들을 포함하고 마지막 단어(벡터)의 영향을 많이 받는 문제가 있었습니다. 이를 해결하고자 CNN의 개념을 text에도 도입했습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/8c0d75c1-6902-4345-ac74-83fd9f199595/CS224n_11_ConvNets_for_NLP-04.png" alt="">
CNN을 텍스트에 도입하면 위와 같은 장단점이 있습니다.</p>
<h1 id="2-1d-convolution-for-text">2. 1d Convolution for Text</h1>
<h2 id="1d-convolution-계산">1d Convolution 계산</h2>
<p>filter의 이동 방향이 위아래 밖에 없기 때문에 1d convolution 이라고 부릅니다.
다음과 같이 &#39;tentative deal reached to keep government open&#39; 이라는 문장을 계산해보겠습니다.</p>
<h4 id="convolution-계산">convolution 계산</h4>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/dd352d01-8556-490e-a407-1127017403fd/CS224n_11_ConvNets_for_NLP-05.png" alt="">
각 단어는 4차원으로 임베딩 되어있는 벡터이고 필터 사이즈(kernel_size)는 3을 사용한다고 가정했을 때, filter 가 움직이면서 dot product(내적) 값을 계산하면 오른쪽 표와 같이 <strong>7*4</strong>의 문장이 <strong>5*1</strong>로 계산됩니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/b07e3048-d4e4-480e-9ed3-ea80f4428a82/CS224n_11_ConvNets_for_NLP-06.png" alt="">
필터 갯수 : 이 때 크기3의 필터를 3개 사용한다면 <strong>5*3</strong> 의 matrix로 계산됩니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/49806890-ca33-49b2-9340-287a35786c0d/CS224n_11_ConvNets_for_NLP-07.png" alt="">
필터 크기 : 필터 크기를 조정해서 n-gram의 다양한 feature를 만들 수 있습니다.
다양하고 많은 filter를 사용해서 output의 차원을 늘릴수록, feature를 많이 사용할 수록, 기존 문장에 대한 정보량이 커지게 됩니다.</p>
<h4 id="pooling-계산">pooling 계산</h4>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/4f600d1f-f680-46fb-b1ec-8bea90639e09/CS224n_11_ConvNets_for_NLP-08.png" alt="">
pooling은 다음과 같이 Max pooling, average pooling, k-max pooling 등을 사용할 수 있습니다. 다만 NLP에서는 max pooling을 선호합니다. 정보가 모든 token에 골고루 있는 것이 아니라 sparse하게 있기 때문입니다.</p>
<h4 id="stride-local-max-pooling-dilation-계산">stride, local max pooling, dilation 계산</h4>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/af685a2d-0d31-4848-8002-fd8ffd91d64e/CS224n_11_ConvNets_for_NLP-09.png" alt="">
<strong>stride</strong>는 기존 이미지에서 사용되는 CNN의 개념과 동일하게 건너뛰는 칸의 크기 입니다. 
이 때 stride=2와 <strong>local max pooling</strong>을 같이 사용하면, 2개씩 보면서(striding) pooling을 하는 것입니다. 하지만 이 방법은 NLP에서 잘 사용하지 않습니다. 
<strong>dilation</strong> 에 대한 내용은 이해를 돕기 위한 움직이는 이미지가 잘 첨부되어 있는 링크를 첨부합니다. 
<a href="https://zzsza.github.io/data/2018/02/23/introduction-convolution/">https://zzsza.github.io/data/2018/02/23/introduction-convolution/</a></p>
<h1 id="3-cnn-for-classification">3. CNN for Classification</h1>
<p><strong>classification을</strong> 위한 CNN에 대한 설명으로는 <em>Yoon Kim_의 논문 _Convolution Neural Networks for Sentence Classification</em> 을 살보겠습니다. 
<img src="https://images.velog.io/images/tobigs-text1314/post/dc965eaa-0e67-4bf3-8026-087f1fb0bcf0/CS224n_11_ConvNets_for_NLP-10.png" alt="">
전체적인 convolution layer와 pooling layer의 구조입니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/364c840f-eb2a-45b4-a3de-0100f37a9f4b/CS224n_11_ConvNets_for_NLP-11.png" alt="">
파라미터 및 표현은 위와 같습니다. convolustion 연산에서는 각 단어들을 matrix 구조가 아니라 단어 벡터를 단순히 <strong>concat</strong> 해서 연산한다고 합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/2b2da132-8e13-4e61-846e-614cdd669b1b/CS224n_11_ConvNets_for_NLP-12.png" alt="">
따라서 식으로 나타내면 다음 <strong>C_i</strong> 와 같이 표현 할 수 있습니다.
피쳐맵 결과는 <strong>c</strong>로 <strong>n-h+1</strong>의 차원이 됩니다. 이는 n개의 단어로 이루어진 문장이 있고 h 크기의 window 를 가질 때의 결과입니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/adeeb9d1-b4ef-4dfe-896d-ebfe5ef2f6c0/CS224n_11_ConvNets_for_NLP-13.png" alt="">
pooling 연산에서는 피쳐맵 결과인 c를 max pooling 합니다. 
max pooling을 함으로써 filter 들의 변화와 다양한 문장 길이에 대해 대처 가능합니다. 본문에서는 filter size 3,4,5 의 필터를 각각 100개씩 feature map 으로 사용했다고 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/7e2e10d0-d01d-4f68-844d-3cc8fa42dff7/CS224n_11_ConvNets_for_NLP-14.png" alt="">
input으로 넣는 것은 워드 임베딩으로 임베딩 된 벡터를 넣었습니다. 기존의 <strong>pre-trained word vectors</strong>(word2vec of GloVe) 로 초기화 시켰고, <strong>fine tunning</strong> 한 것(static)과 fine tunning 하지 않은 것(non-static)을 둘 다 사용했습니다.</p>
<p>CNN layer를 통과시킨 후 pooling한 최종 벡터(z)를 soft max 를 통해 classification을 수행했습니다. 이 전반적인 과정이 이해가 안가신다면 다시 위의 아키텍처 이미지를 보시면 이해가 수월하실 듯 합니다.</p>
<h1 id="4-추가--정리">4. 추가 &amp; 정리</h1>
<h2 id="gated-units-used-vertically">Gated units used vertically</h2>
<p>cs224n 이번 강의에서는 전반적인 text cnn 내용뿐만 아니라 다음과 같은 추가내용(some toolkit)들이 나옵니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/1f2181ac-2edc-429f-b109-e8b7cef190de/CS224n_11_ConvNets_for_NLP-16.png" alt=""></p>
<h3 id="residual-block--highway-block">Residual block &amp; Highway block</h3>
<p>ResNet에서 나온 Residual block과 Highway block을 비교하며 소개합니다. 두 가지 모두 Shortcut Connection의 개념입니다. 즉 결국 <strong>같은 역할</strong>로 <em>x에 대한 정보를 얼마나 넘겨줄지</em> 의 개념입니다. 
Residual block에서는 <strong>F(x) + x</strong> 를 사용하고, Highway block은 <strong>F(x)T(X) + x.C(x)</strong>를 사용하는 점만 차이가 있습니다. 
Highway block 식의 T는 transform gate를 의미하고, C는 carry gate를 의미합니다.</p>
<h2 id="batch-normalization-batchnorm--1x1-convolutions">Batch Normalization (BatchNorm) &amp; 1x1 Convolutions</h2>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/3ed0639e-40a4-4fa9-96a4-bf653d3bb375/CS224n_11_ConvNets_for_NLP-17.png" alt="">
Batch Norm 이라고 불리는 Batch Normalization과 1x1 convolustion을 소개합니다. 각 방법은 위와 같은 이유로 사용한다고 합니다.</p>
<h2 id="cnn-for-nlp">CNN for NLP</h2>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/11e57bc4-ce5b-4ac5-baf8-7df08e0729e2/CS224n_11_ConvNets_for_NLP-18.png" alt="">
자연어처리, NLP에서의 CNN을 정리하면 위와 같습니다. </p>
<ul>
<li>뉴럴네트워크가 피쳐를 포착하는 순서는 tokens -&gt; multi-word -&gt; expressions -&gt; phrases -&gt; sentence 순입니다. (Captures k-grams hierarchically) 
오른쪽 그림과 같이 문장에 대해 CNN layer를 여러 층으로 쌓을 경우를 생각해보면 알 수 있습니다. 
즉 &#39;열심히 공부하는 투빅스 입니다&#39;를 CNN layer를 통과하면서 포착한다고 했을 때, 처음에는 <strong>열심히</strong> 를 포착하고, 다음에는 <strong>열심히 공부하는</strong> 까지, 그리고 다음에는 <strong>열심히 입니다</strong> 까지 포착할 수 있습니다.</li>
<li>CNN의 최대 장점은 <strong>구현</strong>이 굉장이 잘 되어 있어서 사용하기 편하다는 것입니다. 다양한 분야에서 사용되기 때문에 이미 구현체가 많이 존재합니다. 따라서 가져다가 사용하기만 하면 됩니다.</li>
<li>하지만 CNN으로만 레이어를 쌓고자 한다면 첫 단어와 마지막 단어를 잘 포착하기 뒤해서 많은 convolution layer가 필요합니다. </li>
<li>그리고 너무 전체를 보는 RN(Realation Network)과 너무 local하게 포착하는 CNN의 장점을 합쳐서 나오게 된 것이 Self Attention입니다.</li>
</ul>
<h2 id="모델-분류">모델 분류</h2>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/1e26d6e5-db50-4925-a23a-0bab321e83de/CS224n_11_ConvNets_for_NLP-19.png" alt="">
NLP모델은 위와 같이 분류됩니다.</p>
<h1 id="5-deep-cnn-for-nlp">5. Deep CNN for NLP</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/6f643320-9928-4885-9aa5-46adb9df386f/CS224n_11_ConvNets_for_NLP-20.png" alt="">
이미지나 다른 분야에서는 레이어를 정말 &#39;Deep&#39;하게 쌓고는 합니다. 따라서 이 강의에서도 NLP 분야에도 깊은 모델이 있다는 것을 소개합니다. 
<strong>VD-CNN</strong>은 Text Classificaion을 위해 깊은 CNN 네트워크를 사용한 논문입니다.</p>
<p>회색 박스와 같이 구성된 block을 쌓아서 오른쪽 그림의 아키텍처로 이루어져 있습니다. 이미지 분야의 VGG-Net 이나 ResNet을 닮았지만 그렇게 깊지 않습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/efe9392c-294b-403f-925d-9fdf54139c12/CS224n_11_ConvNets_for_NLP-21.png" alt="">
VD-CNN의 다양한 데이터에 대한 실험 결과를 보여줍니다. 대체로 29 layer 이상의 깊이로 쌓은 것에서 성능이 좋아진 모습을 볼 수 있습니다.</p>
<hr>
<h1 id="reference">Reference</h1>
<blockquote>
<ul>
<li>CS224N : Natural Language Processing with Deep Learning Stanford, Winter 2019</li>
</ul>
</blockquote>
<ul>
<li>DSBA 연구실 CS224N 세미나 강의 자료</li>
<li>건국대학교 컴퓨터공학부 인공지능 수업</li>
<li>조경현 교수님의 딥러닝을 이용한 자연어처리</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS224n] Lecture10 - Question Answering]]></title>
            <link>https://velog.io/@tobigs-text1314/CS224n-Lecture10-Question-Answering</link>
            <guid>https://velog.io/@tobigs-text1314/CS224n-Lecture10-Question-Answering</guid>
            <pubDate>Mon, 18 Jan 2021 09:20:13 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 투빅스 13기 <a href="https://github.com/MiSungKim">김미성</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Motivation &amp; History </li>
<li>Standford Question Answering Dataset(SQuAD)</li>
<li>QA model</li>
</ol>
<hr>
<h1 id="1-motivation--history">1. Motivation &amp; History</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/a7144a8e-ff2d-4f28-a699-a6b49beb38c7/image.png" alt="">
우리는 종종 질문에 대한 답을 원합니다. 그래서 구글에 우리나라 대통령은 누구인가? 투빅스는 무슨 활동을 하는 동아리인지? 등을 검색하곤 합니다. 
그랬을 때, 구글은 우리에게 2가지 정도의 형식으로 답을 해줍니다.</p>
<ol>
<li>Finding documents that contain an answer (정답을 포함하고 있는 문서 찾기)<ul>
<li>기존의 정보 검색 (information retrieval = IR) IR)/ 웹 검색으로 처리할 수 있는 사항</li>
</ul>
</li>
</ol>
<ol start="2">
<li>Finding an answer in a paragraph or a document (문서에서 정답 찾기)<ul>
<li>이 문제를 흔히 읽기 이해 (machine reading comprehension = MRC) 라고 한다.</li>
<li>오늘날 우리가 중심적으로 다룰 사항</li>
</ul>
</li>
</ol>
<p>이렇게 질문에 대한 답의 유형을 분류할 수 있고, 지금부터는 MRC(machine reading comprehension) 에 대해서 더 알아보도록 하겠습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/6ca8fb3a-a688-411e-b369-0539855c3287/image.png" alt=""></p>
<hr>

<h1 id="2-stanford-question-answering-datasetsquad">2. Stanford Question Answering Dataset(SQuAD)</h1>
<h3 id="1-types-of-questions">1. Types of questions</h3>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/55f48568-c933-4dec-87d1-03cf77b58790/image.png" alt=""></p>
<p>먼저 질문은 다음과 같이 분류할 수 있습니다. SQuAD는 이중에서 1번인 Factoid type questions 에 해당합니다. </p>
<hr>

<h3 id="2-squad11">2. SQuAD(1.1)</h3>
<p>QA dataset은 어떻게 구성되어있을까요? QA data는 다음과 같이 3가지 부분으로 구성되어있습니다. 
<img src="https://images.velog.io/images/tobigs-text1314/post/b6beee04-2ade-4526-8d59-6f707d64fbf1/image.png" alt=""> </p>
<p>QA model의 발전에 큰 영향을 미친 SQuAD dataset(1.1)도 다음과 같은 형태로 되어있는데요, 이때 알아둘 점은 질문에 대한 Answer은 항상 Passage 속 하위 sequence로 구성이 되어있다는것입니다. 
<img src="https://images.velog.io/images/tobigs-text1314/post/d8f04eeb-7980-401c-94fb-660c5e989341/image.png" alt=""></p>
<p>그렇다면 이 데이터셋의 answer(=gold answer)은 누가 작성한걸까요? SQuAD dataset은 위키피디아 문서를 바탕으로 크라우드소싱 인력들이 해당하는 질문과 답변을 생성했다고 합니다. 그리고 그림에서 볼 수 있듯이 한 질문에 대해 3가지 답변을 sampling 합니다. </p>
<p>그럼 데이터의 평가 방법에 대해서도 궁금하실 것 같은데요, 이런 SQuAD dataset을 이용한 평가 방법으로는 exact match 방법과, f1 score를 이용하는 방법이 있습니다.</p>
<ul>
<li>exact match : 예측한 답과 실제 답이 정확히 일치하면 1, 그렇지 않으면 0.</li>
<li>f1 score : 예측된 답과 실제 답의 중첩토큰을 계산. 더 안정적인 평가방법.</li>
</ul>
<hr>

<h3 id="3-squad20">3. SQuAD(2.0)</h3>
<p>현재 SQuAD dataset은 2.0 까지 나온상태 입니다. 그럼 1.1 에서 2.0 으로 데이터셋이 발전하면서 어떤 부분이 바뀌었는지 살펴보겠습니다.</p>
<p>바로 <strong>added unanswerable question</strong> 입니다. SQuAD 2.0 에서는 답이 없는 질문들이 추가 되었습니다! </p>
<p>현존하는 reading comprehension 데이터셋들은 주로 ‘answerable(대답 가능한)’ 질문들에 초점을 맞추거나 쉽게 판별이 가능한 가짜 ‘unanswerable(대답 불가능한)’ 질문들을 자동 생성해 왔습니다. SQuAD 2.0에서는 이런 약점을 보완하게 됩니다.</p>
<ul>
<li>기존 데이터셋(SQuAD 1.1)에 새로운 5만 개 이상의 unanswerable questions(응답 불가능한 질문)를 병합</li>
<li>unanswerable question은 온라인의 crowd worker들이 직접 생성(즉, 기계적으로 생성된 것이 아니라 진짜 인간이 생성했으므로 질이 더 높음)</li>
<li>worker들에 의해 생성된 unanswerable question은 응답 가능한 질문들과 유사하여 기계적으로 판별이 어려움</li>
</ul>
<br>

<h4 id="그렇다면--no-answer-을-모델은-어떻게-처리할수-있을까요">그렇다면  No answer 을 모델은 어떻게 처리할수 있을까요?</h4>
<ol>
<li><p>임계값을 사용한다.
 : 임계값 이상의 결과에 대해서만 answer을 예측하고, 임계값 이하의 결과에 대해서는 no answer 로 예측하는 방식.</p>
</li>
<li><p>Machine Reading Comprehension with Unanswerable Questions (2019 AAAI) </p>
<ol>
<li><p>Read then verify 시스템을 제안</p>
</li>
<li><p>Passage 에 대한 question 에 대한 정답과 no answer 확률을 각각 도출함</p>
</li>
<li><p>이렇게 도출한 정답이 적절한지 확인을 한다</p>
<p>ex ) 질문 : 프랑스는 어떤 지역입니까
  답변 : 노르망디는 프랑스의 지역입니다</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/5d9be826-b294-4dcf-81c9-df463ce02b47/image.png" alt=""> </p>
</li>
</ol>
</li>
</ol>
<hr>

<h3 id="4-squad-limitations">4. SQuAD Limitations</h3>
<ol>
<li>span-based answers 만 존재</li>
<li>passages 내에서만 정답을 찾도록 하는 질문 구성<ul>
<li>여러 문서들을 비교하여, 진짜 정답을 찾아낼 필요가 없음.</li>
<li>실제 마주하게 될 질문 - 답변  보다 잘 정립된 문법구조</li>
</ul>
</li>
<li>동일 지시어 문제를 제외하고는 Multi fact 문제, 문장 추론문제가 거의 없음.</li>
</ol>
<p><strong>그럼에도 불구하고, SQuAD is well-targeted , well-structured, clean dataset</strong></p>
<ul>
<li>QA 문제를 푸는데 있어 가장 많이 사용되고, 경쟁하고 있는 데이터셋</li>
<li>실제 시스템을 개발하기 위한 유용한 start point 이다. </li>
</ul>
<hr>

<h3 id="5-squad-leader-board">5. SQuAD leader board</h3>
<p> <img src="https://images.velog.io/images/tobigs-text1314/post/f0f06152-4328-49c5-bcec-593d7ea44c79/image.png" alt=""> </p>
<hr>

<h3 id="6-korquad-20👍">6. KorQuAD (2.0)👍</h3>
<ul>
<li>한국어 위키백과를 대상으로 대규모 MRC 데이터 구축</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/b8f8e819-c46d-4e57-99a9-bbbadac18ca4/image.png" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/e1bd46a3-1545-46bc-9b96-e911dd67108c/image.png" alt=""></p>
<p>KorQuAD dataset 내부를 보게되면 다름과 같이 구성되어있습니다.
이를 보면 answer_start 라고 해서 정답의 sequence가 시작되는 위치 정보도 제공하고 있음을 알수 있습니다.</p>
<hr>

<h1 id="3-qa-model">3. QA model</h1>
<h3 id="1-standford-attentive-reader">1. Standford Attentive Reader</h3>
<ul>
<li><p>질의에 대한 응답을 찾는 모델을 구축하는데 Bi LSTM with attention을 적용함.
<img src="https://images.velog.io/images/tobigs-text1314/post/7114991d-ac45-49e4-832f-1d81e4f1d8ef/image.png" alt=""> </p>
</li>
<li><p>standford attentive model 은 다음과 같이 세 부분으로 나누어져 있습니다. 한부분씩 살펴보도록 하겠습니다.</p>
<ol>
<li>Question vector 생성</li>
<li>Passage vector 생성</li>
<li>Attention</li>
</ol>
</li>
</ul>
<br>

<p><strong>1. Question vector 생성</strong>
먼저 question 에 대한 vector 를 생성하는 부분인데요,
주어진 문장에 있는 단어들의 embedding을 사전에 학습된 glove 에서 가져와 one-layer BiLSTM 에 넣습니다.
BiLSTM의 각 방향 마지막 hidden state를 concat 하여 question vector를 얻습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/fcc5e441-c201-4291-973c-821904cfed34/image.png" alt=""></p>
<p><strong>2. Passage vector 생성</strong>
두번째로는 passage 에 대한 vector를 생성하는 부분인데요,
여기서도 마찬가지로 주어진 문장에 있는 단어들의 embedding을 사전에 학습된 glove 에서 가져와 one-layer BiLSTM에 넣습니다.
그리고 각각의 포지션에서 BiLSTM의 hidden state를 concat 하여 문장 내 단어 개수 만큼의 passage vector를 생성합니다. 
<img src="https://images.velog.io/images/tobigs-text1314/post/b368def0-4a79-4dad-a995-5589edec81cf/image.png" alt=""></p>
<p><strong>3. Attention</strong> </p>
<ul>
<li>𝛼𝑖: i 개의 p 벡터와 한 개의 q 벡터를 이용하여 어텐션을 적용한 후 소프트맥스를 취함.</li>
<li>𝑜𝑠: 𝛼𝑖와 pi 벡터를 곱하여 모두 더함 </li>
<li>𝑎𝑠: 𝑜𝑠에 linear transform 을 취함</li>
</ul>
<p>-&gt; 이렇게 start token 과 end token 을 구합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/ade7c5d0-a285-4934-a504-ff46637b46da/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>🙋‍*<em>참고 *</em>
attention 의 계산 과정
<img src="https://images.velog.io/images/tobigs-text1314/post/5b5ada57-fe63-4a4d-a091-8ab674b29f9b/image.png" alt=""></p>
<hr>

<h3 id="2-standford-attentive-reader">2. Standford Attentive Reader++</h3>
<ul>
<li><p>앞서 살펴본 Stanford attentive reader 과 차이점을 살펴보면, Standford Attentive Reader++ 에서는 one layer BiLSTM 이 아닌 3 layer BiLSTM을 사용하게 되었습니다. </p>
</li>
<li><p>또한 Question vector를 구성할때, 각 방향 마지막 hidden state를 concat이 아닌, BiLSTM state를 포지션별로 concat 후 weighted sum을 하여 구성합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/875210b7-9dcd-4352-b47e-cc08d5c96d8a/image.png" alt=""></p>
</li>
<li><p>Passage vector를 구성할때의 차이점도 발생하는데요, 단어의 embedding 값만 사용하지 않고, extra feature 들을 더 추가하여 passage vector를 구성합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/414118e3-4b15-4034-9805-9a0a6eb60aa4/image.png" alt=""></p>
</li>
<li><p>이때 추가되는 extra feature 에는 다음과 같은것들이 있습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/428ba625-b180-43c2-a976-797213faa4a2/image.png" alt=""></p>
</li>
</ul>
<hr>

<h3 id="3-bidaf--bi-directional-attention-flow-for-machine-comprehesive">3. BiDAF : Bi-Directional Attention Flow for Machine Comprehesive</h3>
<ul>
<li>이 모델은 Question 에서 Passage 로 한 방향으로만 진행되는  Standford Attentive reader 와 달리  <strong>attention 이 양방향</strong> 으로 적용된 모델입니다.</li>
<li>Question &lt;-&gt; Passage </li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/12d5a7b7-2138-4380-a12d-6d647ea624c4/image.png" alt=""></p>
<ul>
<li>이 모델은 총 6단계로 이루어져 있는데요, 하나씩 살펴보겠습니다.<ol>
<li>Character Embedding Layer</li>
<li>Word Embedding Layer</li>
<li>Contextual Embedding Layer</li>
<li>Attention Flow Layer</li>
<li>Modeling Layer</li>
<li>Output Layer</li>
</ol>
</li>
</ul>
<hr>

<p>먼저 Character Embedding Layer 에서는 charCNN 을 사용하여 각 단어를 vector space 에 mapping합니다.  그리고 Word Embedding Layer 에서는 pre-trained word embedding model을 사용하여 각 단어를 vector space 에 mapping 하게 됩니다. </p>
<p>이 두 결과를  concat(그림속 빨간 네모) 하고 BiLSTM 에 넣기전, two-layer highway-network 를 거쳐 d-dimension vector로 만들어줍니다. 
그리고 BiLSTM 에 넣어 2d-dimension vector를 생성하게 됩니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/2974bdd0-c4d5-4cdc-ad01-e4514e88d960/image.png" alt=""></p>
<hr>
그러면 Attention 을 하기위한 준비는 다 마쳤습니다!
이제 attention layer 에 대해 살펴보겠습니다.

<p>Attention layer 에서는 Query to Context, Context to Query 이렇게 양방향으로 attention 이 일어나게 됩니다. 즉, Query와 Context 를 쌍으로 묶어서 Attention 을 학습하는곳입니다.</p>
<ul>
<li>Query to Context : Context의 어떤 정보다 Query 와 관련이 있는지</li>
<li>Context to Query : Query 의 어떤 정보가 Context 와 관련이 있는지</li>
</ul>
<br>

<p>이전에 본 Stanford Attentive reader 와 달리, query 와 context(=passage) 를  single feature vector로 요약하지 않고, <strong>query 와 context 를 연결시킨다</strong>는 특징이 있습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/57353156-fa9b-4c4b-9f39-e5d9199ab6f6/image.png" alt=""></p>
<p>그렇다면 이 attention은 어떻게 양방향으로 일어날수 있을까요? 이 양방향 attention을 위해 <strong>shared matrix S</strong>를 이용합니다. shared matrix는 Ht 와 Uj에 α라는 function 거쳐 계산됩니다. 
<img src="https://images.velog.io/images/tobigs-text1314/post/af740172-60d5-4b6e-bb90-8c0f839156fa/image.png" alt=""></p>
<ol>
<li>Context2Query Attention</li>
</ol>
<ul>
<li>St 에 대해 softmax 를 취하고, 이렇게 나온 at와 U를 이용해 t번째 context word 입장에서 유사성이 높은 query 의 특성을 알게됩니다. 
<img src="https://images.velog.io/images/tobigs-text1314/post/6f6d624e-da13-403f-bf8d-eabc8551efb0/image.png" alt=""></li>
<li><img src="https://images.velog.io/images/tobigs-text1314/post/6b10cc9d-f3ad-43ed-a9a5-19f293463f54/image.png" alt=""></li>
</ul>
<ol start="2">
<li>Query2Context Attention</li>
</ol>
<ul>
<li>S에서 maxcol을 통해 가장 큰 값을뽑아 softmax를 취하고, 이렇게 나온 b 와 H 를 이용하여 query 입장에서 중요한 word를 알게됩니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/e7ebb796-db3e-49ae-be1e-b3e4902462af/image.png" alt=""></li>
<li><img src="https://images.velog.io/images/tobigs-text1314/post/7f3d82d0-bd7c-4050-8395-65b6a7ac4231/image.png" alt=""></li>
</ul>
<hr>
마지막으로 modeling 과 output layer 입니다.

<p>앞서구한 G(H와 U를 이용하여 구함)를 2-layer BiLSTM을 거쳐 M을 만들고, M과 G를 concat 하여 linear transform과 softmax를 취해 start, end token을 예측합니다. </p>
<p>최종적으로 sum of negative log probabilities 의 average를 최소화 하는 방향으로 학습이 이루어집니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/dc3fd151-0880-413e-b689-40992d69f2a6/image.png" alt=""></p>
<hr>

<h4 id="참고자료">참고자료</h4>
<ul>
<li><p>CS224n 강의</p>
</li>
<li><p><a href="https://hwkim94.github.io/deeplearning/rnn/lstm/attention/nlp/paperreview/2018/02/23/BiDAF1.html">https://hwkim94.github.io/deeplearning/rnn/lstm/attention/nlp/paperreview/2018/02/23/BiDAF1.html</a></p>
</li>
<li><p><a href="https://www.youtube.com/watch?v=yIdF-17HwSk&amp;list=PLoROMvodv4rOhcuXMZkNm7j3fVwBBY42z&amp;index=10">https://www.youtube.com/watch?v=yIdF-17HwSk&amp;list=PLoROMvodv4rOhcuXMZkNm7j3fVwBBY42z&amp;index=10</a></p>
</li>
<li><p><a href="https://www.youtube.com/watch?v=7u6Ys7I0z2E&amp;list=PLetSlH8YjIfVdobI2IkAQnNTb1Bt5Ji9U&amp;index=8">https://www.youtube.com/watch?v=7u6Ys7I0z2E&amp;list=PLetSlH8YjIfVdobI2IkAQnNTb1Bt5Ji9U&amp;index=8</a></p>
</li>
<li><p><a href="https://hwkim94.github.io/deeplearning/rnn/lstm/attention/nlp/paperreview/2018/02/23/BiDAF1.html">https://hwkim94.github.io/deeplearning/rnn/lstm/attention/nlp/paperreview/2018/02/23/BiDAF1.html</a> </p>
</li>
<li><p><a href="https://www.quantumdl.com/entry/10%EC%A3%BC%EC%B0%A82-Bidirectional-Attention-Flow-for-Machine-Comprehension-BiDAF">https://www.quantumdl.com/entry/10%EC%A3%BC%EC%B0%A82-Bidirectional-Attention-Flow-for-Machine-Comprehension-BiDAF</a> </p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS224n] Lecture 9 - Practical Tips for Final Projects]]></title>
            <link>https://velog.io/@tobigs-text1314/CS224n-Lecture-9-Practical-Tips-for-Final-Projects</link>
            <guid>https://velog.io/@tobigs-text1314/CS224n-Lecture-9-Practical-Tips-for-Final-Projects</guid>
            <pubDate>Thu, 31 Dec 2020 14:09:37 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 투빅스 14기 <a href="https://github.com/placidmoon1">민거홍</a></p>
<blockquote>
<h2 id="contents">Contents</h2>
<p>*<em>_Lecture 9는 NLP 연구 전반과 CS224n 최종 프로젝트에 대해 다룹니다. _ 
*</em>1. Starting Research
2. Review of Gated Neural Sequence Models 
3. MT Topics
4. Research Evaluation, others
5. References</p>
</blockquote>
<hr>
<h2 id="1-starting-research">1. Starting Research</h2>
<h3 id="cs224n-최종-프로젝트">CS224n 최종 프로젝트</h3>
<p>*<em>CS224n 프로젝트는 1) <a href="https://rajpurkar.github.io/SQuAD-explorer/">SQuAD Q&amp;A 프로젝트</a>나 2) 자유 주제 중 하나를 골라 진행합니다. 
*</em>!</p>
<p><a href="https://images.velog.io/images/tobigs-text1314/post/5a47b9bc-8c90-4641-a104-22713287f4ee/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_04.jpg"></a>
<img src="https://images.velog.io/images/tobigs-text1314/post/c9cb0c4b-6619-4c00-86f4-e19364c95436/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_05.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/daa590f9-a7e2-4555-ac82-60f035ab91f7/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_06.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/6fde4fa4-e0bf-4121-bde9-098cd8725d6e/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_07.jpg" alt=""></p>
<h3 id="좋은-연구란">좋은 연구란?</h3>
<p><strong>연구는 새로운 지식을 차출하고 그 지식을 효과적으로 전달하는 행위입니다!</strong> 
연구는 매우 중요합니다! </p>
<ul>
<li>새로운 지식을 만듭니다!!</li>
<li>인류의 삶의 질을 높입니다!!</li>
<li>중요한 문제에 대한 관심을 끌어 모읍니다. (예시: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7310678/">COVID-19 논문</a>) 
좋은 연구는 4가지 요소를 충족합니다: </li>
<li>Novel (새로운 주제를 다루고)</li>
<li>Generalizable (일반화 될 수 있어야하고)</li>
<li>Valuable (새로운, non-trivial한 관점을 제시해야 하고)</li>
<li>Valid (논문을 토대로 내용을 검증할 수 있도록 empirical하고 quatitative하고 작성해야 합니다)
<img src="https://images.velog.io/images/tobigs-text1314/post/0fce0ba2-cef3-4a76-bed6-3ab04aadee74/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_08.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/fef8d6dd-c57c-4c69-9327-5a39278857eb/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_09.jpg" alt=""><h3 id="nlp-연구-예시">NLP 연구 예시</h3>
NLP 연구는 몇가지 대분야로 나눌 수 있습니다.</li>
<li>모델의 application을 찾아보고 어떻게 효율적으로 적용할 지 찾는 <a href="https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1174/reports/2762063.pdf"><strong>연구</strong></a></li>
<li>복잡한 neural architecture을 구현해보고 특정 데이터에 대한 성능을 측정하는 <a href="https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1174/reports/2753780.pdf"><strong>연구</strong></a></li>
<li>새롭거나 기존의 NN 모델을 구상 후 구현하여 실험적인 데이터를 토대로 성능 향상을 보여주는 <a href="https://cs224d.stanford.edu/reports/InanKhosravi.pdf"><strong>연구</strong></a></li>
<li>그냥 새로운 <a href="https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1184/reports/997.pdf"><strong>연구</strong></a>! </li>
<li>State of the Art 모델들 도장깨는 연구 
<img src="https://images.velog.io/images/tobigs-text1314/post/0a2d820d-a78b-49f9-a706-4f3701405df0/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_12.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/b8d235a1-6ea5-4f5f-bfba-2e6b0949f8fd/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_13.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/2a08230e-5bbb-49a8-950a-eff83a97e55f/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_14.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/c324ef59-f3dd-4673-af4f-f8b3f96d1d7a/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_15.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/7eba0598-1a9b-4df3-971a-20d49e59a0f9/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_16.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/bd89f487-335f-4a21-888e-a693bd7f3a10/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_17.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/bc201318-1d0a-48f2-8923-eba247a0f46f/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_18.jpg" alt=""><h3 id="nlp-연구에서-데이터는-매우매우-중요합니다">NLP 연구에서 &#39;데이터&#39;는 매우매우 중요합니다.</h3>
</li>
<li><em>연구에 적절한 데이터를 찾는 건 매우 중요합니다. 성능, testing등을 위해 최소 만개의 레이블 된 데이터가 필요합니다. *</em></li>
</ul>
<p>데이터를 찾는 방법은 다양하지만 크게 3가지 방법으로 나눠질 수 있습니다.</p>
<ul>
<li>직접 데이터를 구한 후 전처리 하고 레이블링 하기</li>
<li>기존의 프로젝트에서 구한 데이터 / 기업에서 갖고 있는 데이터</li>
<li>(가능하다면 제일 편한 방법) 공개되고, 잘 관리된 dataset 활용하기 (예시: 캐글, <a href="https://www.aihub.or.kr/">AIHub</a>, AI데이터가공바우처사업, 등등)
<img src="https://images.velog.io/images/tobigs-text1314/post/155786e1-0b00-48a2-9d72-0539eed513dc/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_19.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/907ecc13-5e86-47eb-b1ec-dc201e202a22/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_20.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/bb955aef-d6b1-4cfb-b14a-54d6ed75ff3c/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_21.jpg" alt=""></li>
</ul>
<h2 id="2-review-of-gated-neural-sequence-models">2. Review of Gated Neural Sequence Models</h2>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/e5cbbd8c-68d6-4c1c-8371-4512cabb021e/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_23.jpg" alt=""></p>
<h2 id="3-mt-topics">3. MT Topics</h2>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/ea500375-2a8d-4b8a-9cd7-897b8ac5ee88/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_25.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/3a79db64-dd9a-4b0c-8460-f90efeecce32/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_26.jpg" alt=""></p>
<h3 id="bleu-mt-메트릭">BLEU MT 메트릭</h3>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/7c4f7668-41f9-4fae-93cc-a7c883934a9b/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_27.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/9f267a8e-5be8-4f1e-a0d4-8e03f3f0e266/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_28.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/1e1d7f8a-d7ce-436e-946a-72641ab0cf1a/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_29.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/c9d319c8-3bdc-4052-92a3-300d0b3228a7/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_30.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/1da2384c-8115-4a0e-8836-fffb044bc0c6/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_31.jpg" alt=""></p>
<h2 id="4-research-evaluation-others">4. Research Evaluation, others</h2>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c6311a64-b8e7-4dba-9bee-3635a3413f0a/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_33.jpg" alt=""></p>
<h3 id="데이터셋-분류-traindevtest">데이터셋 분류 (train/dev/test)</h3>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/f6a9cc43-4082-4f84-8be9-d87db06ee52c/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_34.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/a3dc38b4-75f2-41f5-b425-cac7edcc51bc/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_35.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/49f09b1e-5a2e-44eb-8872-be9d224eed30/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_36.jpg" alt=""></p>
<h3 id="연구-방법론">연구 방법론</h3>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/e91f6ea1-7d06-46d1-90f9-ff8e28ce257e/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_37.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/911c2e68-4924-4444-bba0-b0147c77f8f6/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_38.jpg" alt="">
<img src="https://images.velog.io/images/tobigs-text1314/post/4bff2370-5693-4d24-a090-7b32c8367c95/CS224n_Lecture9_%ED%8E%98%EC%9D%B4%EC%A7%80_39.jpg" alt=""></p>
<h2 id="5-references">5. References</h2>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/91b5bcb8-e215-4d65-8e2f-8f7651b6ed66/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS224n] Lecture 8 - Machine Translation, Sequence-to-sequence and Attention]]></title>
            <link>https://velog.io/@tobigs-text1314/CS224n-Lecture-8-Machine-Translation-Sequence-to-sequence-and-Attention</link>
            <guid>https://velog.io/@tobigs-text1314/CS224n-Lecture-8-Machine-Translation-Sequence-to-sequence-and-Attention</guid>
            <pubDate>Thu, 31 Dec 2020 14:05:48 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 투빅스 14기 <a href="https://github.com/kogang97">고경태</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Machine Translation</li>
<li>Sequence to sequence</li>
<li>Neural technique: Attention</li>
</ol>
<hr>
<p> <img src="https://images.velog.io/images/tobigs-text1314/post/e3e18632-f7b6-4d84-b3aa-e346118b6104/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>목차의 흐름은 전 목차 주제에서의 한계점을 극복하고 발전하는 방향으로 진행됩니다. 즉, 기계 번역의 한계를 RNN을 이용한 sequence to sequenc모델이 극복 해주고, sequence to sequenc의 가장 큰 한계점인 병목현상을 극복 해주는 방법인 Attention모델을 설명하는 방식으로 강의가 진행됩니다.</p>
<h1 id="1-machine-translation">1. Machine Translation</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/b28f3852-eef1-4d67-b64e-9f9c752723b6/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>Machine translation 이란 말 그대로 기계를 통해 번역을 하는 문제입니다. 정확히 말하면 어떤 언어의 input sentence를 다른 언어의 output sentence로 만드는 task입니다. 기계번역은 시대에 따라서 번역을 하는 방법이 계속해서 바뀌어 왔는데, 어떤 방식으로 진행해 왔는지 알아보겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/41c22010-1da8-40a0-89b6-d4ed62514a9f/%EC%BA%A1%EC%B2%98.PNG" alt="">
Machine Translation이 처음 나온 것은 1950년대입니다. 시대적으로 기계번역이 나온 역사적 이유가 있습니다. 이 시기는 냉전 시기로 소련과 미국은 항상 서로의 통신이나 기밀 문서들을 자동으로 번역해서 해석하기를 원했는데, 이를 위해 Machine Translation이 처음 도입된 것입니다. 따라서 이 당시의 machine translation은 주로 영어, 러시아어 번역이 대부분이었습니다.
그리고 이 당시의 번역은 주로 rule-based 방식이었습니다. 즉 두 개의 언어의 사전을 통해 각 단어가 대응되는 것을 찾아서 번역하는 가장 단순한 방식이라고 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/98f13586-d42f-4bb3-b669-48e592436c25/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>기존의 rule-based 방식이 아닌 data를 통해서 번역하는 방식이 처음으로 사용되었습니다. 이때의 방식을 통계적 기계번역이라 부르는데, 데이터를 통해 확률 분포를 학습하는 방법입니다. 데이터를 통해 확률을 가장 높이는 방법으로 번역합니다. 즉 특정 언어 input sentnece x에 대해서 또 다른 언어 output sentence인 y로 번역할 때 다음의 확률이 가장 높은 sentence를 선택하게 됩니다. 그리고 실제로 사용할 때는 위의 수식을 bayes theorem을 사용해 다음과 같이 번형 해서 두 개의 부분을 계산하는 방식으로 수행합니다.</p>
<p>위 식을 보면 P(x|y)P(x|y)와 P(y)P(y)로 두 개의 부분으로 나뉘는데, 앞부분은 Translation Model이라 부르고 parallel 데이터를 통해서 확률을 계산하고 뒷부분은 Language Model으로 monolingual 데이터를 통해서 계산 합니다. 즉 일종의 분업인 형태인데, 왼쪽 translation model은 작은 단어나 구를 번역하는 역할을 하고 오른쪽에 있는 언어 모델은 좋은 문장이나 좋은 구조를 뽑아내는 역할을 합니다. 왼쪽 transtation model은 병렬데이터 즉, 문장들이 두 개의 언어 모두로 표현되어 있는 데이터입니다. 따라서 한 문장에 대해 두가지 언어표현을 통해 한 언어에 대한 다른 언어로 바꿨을 때의 확률을 계산할 수 있게 합니다. 그리고 단일 언어 데이터란 하나의 언어만 있는 데이터로 이 데이터를 통해 언어의 특성을 확률 값으로 계산합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/2419b0ad-27db-40cc-9bef-2f6dde9e4c61/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>그럼 우선 많은 양의 병렬 데이터가 필요합니다. 왼쪽 그림과 같이 고대 고대 이집트 언어를 병렬처리하듯 병렬 데이터를 얻는 것이 중요하게 됩니다.  또한 그 p(x|y) 즉 조건부확률을 만들어주는 translationmodel을 어떻게 학습시키는가도 중요한데, 이때 필요한 방법이 바로 정렬입니다. 어떻게 영어 문장과 프랑스 문장에 어떤 대응을 하는지 정렬을 통해 알아보겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/e7554d5a-5b61-4993-94c7-398328f629bb/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>정렬은 우선, 두 문장 병렬처리된 문장에서 특정 단어쌍들의 대응 관계를 말합니다. 하지만, 정렬에서 가장 큰 문제는 두 개의 언어는 각각 특성이 달라서 단어들의 순서나 품사의 순서가 다르고 1대1대응이 어려울 수 있다는 것이 문제입니다. 한번 살펴보겠습니다. 첫 번째는 한 단어가 하나의 단어로 왼쪽을 보면 japan이 오른쪽에서 LE라는 가짜 단어가 추가되며 1 대 1 대응이 안되는 것을 볼 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/3f7c4df7-a342-4853-8292-e88a24989e34/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>정렬 문제는 큰데, 왼쪽그림을 보면, 정렬이 many to one 즉, 여러 단어가 하나의 단어로 정렬될 수도 있습니다. 오른쪽 그림을 보면, one to many 정렬이 하나의 단어가 여러 단어로 정렬될 수도 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/fb833c54-16c4-4286-87d5-0c3d5ca00da0/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>물론 many- to – many 즉 많은 단어가 많은 단어로 정렬되는, 계속 혼잡한 상황이 발생하고 1대1로 잘 정렬이 되지 않는 경우가 문장에서 많이 존재합니다. 이렇게 많은 혼란스러운 상황에서 정렬을 어떻게 학습시킬 수 있을까요?</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/72eb4a07-1928-4457-a193-85f87351add9/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>첫번째 방법은 무차별 대입 솔루션입니다. 가능한 모든 y를 열거해서 모든 확률을 계산해 보는 것입니다. 하지만 이 방법은 느낌으로도 굉장히 오래 걸리며 비용이 많이 소모될 것 같습니다. 또다른 방법은 Heuristic 알고리즘으로 너무 낮은 확률들은 계산하지 않고 높은 확률 위주의 가지들로 다른 가지들은 쳐내면서 가는 방식입니다. 이게 process를 decoding이라고 부른다 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/6d81e69d-e05e-4dcb-8a3e-69219454247b/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>Heuristic 알고리즘이 어떻게 진행되는지 알아보면, 우선 왼쪽에서 hause로 써져있는 단어를 여러 개의 단어들로 분류를 합니다. 그중 가장 확률이 높은 home을 선택하겠죠. 그다음 모든 구문을 유지하면서 가는게 아니라, 확률이 너무 낮은 것은 제거하며 갑니다. 다양한 가설들을 세우고 나무를 가지 치는 것처럼 너무 낮은 확률을 가지는 버리면서 높은 확률로 가는 형식입니다. Decoding 후반부에 더 자세하게 설명을 드리겠고, 디코딩이 이따가 나올 신경 기계번역에서(seq to seq)에서 어떻게 사용되는지 설명드리겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/d923fea3-0906-43f0-a660-c827700dbdf6/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<hr>
<h1 id="2neural-machine-translation-sequence-to-sequence">2.Neural Machine Translation (Sequence to Sequence)</h1>
<p>위에서의 한계점을 극복하게 된 방법은 바로 신경 기계 번역입니다. 딥러닝이 nlp 분야에서 굉장히 기여를 많이 하는  직접적인 계기가 된 신경 기계번역 즉 sequence to sequence를 알아보겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/bf29d885-27c9-4018-bf36-19ac2daaa2ec/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>신 경기계번역은 단일 신경망으로 기계번역을 하는 방법입니다. 시퀀스 투 시퀀스의 신경망 아키텍처는 두 개의 RNN 즉 인코더 RNN과 디코더 RNN을 포함합니다. 한 시퀀스를 다른 시퀀스로 매핑하는 방법으로, 왼쪽 그림과 함께 설명드리겠습니다.</p>
<p>먼저 왼쪽 그림에서 소스 문장을 마지막에 encoding시켜 decoder rnn에 넘겨줍니다. 그는 파이로 나를 때렸다는 문장이 소스 문장이며 이를 encoder rnn에 우선 넣었습니다. Rnn은 단방향, 양방향, lstm등 다 될 수 있다고 합니다. 인코더 rnn에 넣고, 일종의 인코딩을 생성해서 디코더 rnn으로 전해집니다. 디코더 rnn은 조건부 언어 모델이라고 합니다. 인코딩에 따라 첫번째 출력을 얻고 다음에 나올 단어의 확률분포 argmax를 취합니다. 다음 단계에서 디코더에 전 단계에서 단어를 넣고 다시 피드백하여 argmax를 취하고 단어를 맞춥니다. </p>
<p>이런 방법을 계속 반복을 하며 목표 문장을 찾습니다. 디코더가 종료 토큰을 생성하면 중단합니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/5e8c5981-0352-4f0d-98f4-60e689a8b819/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>시퀀스 투 시퀀스는 기존 기계번역보다 훨씬더 유용합니다. 첫 번째는 긴 텍스트를 짧은 텍스트로 요약이 가능하다는점, 두 번째는 전의 단어가 다음 단어로 이어지며 문맥적인 것을 파악할 수 있다는 점, 세 번째는 자연어를 코드로 생성할 수도 있는 등 다양한 유용한 점을 제공한다고 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/dc1e3caf-5bcf-428d-bb88-6240188b3a5f/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>시퀀스 투 시퀀스 모델을 요약하자면 한마디로 조건부 언어 모델입니다. 디코더가 다음 타깃을 계측하는 조건부 언어 모델로 확률을 직접 계상합니다. X가 주어지면 y를 뽑아내고 그 첫 번째 y를 x와 다시 input으로 넣고 계속 반복하며 conditioning을 겁니다. 이제 드는 궁금증은 어떻게 NMT 모델을 학습하느냐인데 답은 바로 아까 우리가 배웠던 병렬 말뭉치로 학습을 시키는 것입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/24be5cdd-8671-408b-8940-5da91eaa4205/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>학습을 하는 방법은 시스템을 전반적으로 최적화한다는 것으로 요약됩니다. 우선 인코더 RNN에 문장을 넣고, 디코더 RNN의 모든 단계에서 다음에 올 확률분포 Y HAT의 손실을 계산합니다. 손실은 교차 엔트로피 등으로 계산할 수 있겠습니다. 그렇게 손실들을 모두 얻고 더해 단계 수로 나누어 최종 LOSS 값을 구합니다. 역전파는 전체 시스템에 걸쳐 흐릅니다. 시스템을 전체적으로 최적화하는 것이 학습의 포인트입니다. 개별적으로 학습하는 것은 좋지 않고 END-TO-END 방식으로 학습하는 것이 문장 요소를 모두 고려해 좋은 결과물을 도출한다고 합니다. 미리 정의된 최대길이 에서 최대한 짧은 문장을 채우는 방법으로 진행된다고 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c39ea6c8-678e-49c9-9169-79e53dfd330b/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>여기서도 문제점이 발생하는데, 바로 greedy decoding 문제가 발생한다는 것입니다. 가장 확률이 높은 단어를 각 단계에서 도출하다 보니 결정을 수정할 수 없다는 것입니다. 각 단계에서 목표 단어를 선택하게 되면 다시 수정할 수 없으며 돌아갈 수 없다는 것입니다. He hit me with a pie라는 문장이 정답인데, hit 다음에 a 가 나오게 되면 틀린 문장임에도 불구하고 돌아가서 수정하지 못한다는 것이며 계속 a 다음으로 문장을 써 내려가야 한다는 뜻입니다. 어떻게 이를 해결할 수 있을까요?</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c22f49cf-9c5e-4a1f-85d3-9b620c1a5c92/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>첫 번째 방법은, 철저하게 가능한 모든 언어 번역 공간을 검색하는 방법입니다. 모든 개별 확률 분포의 곱으로 나타내며, 디코더의 각 단계 t에서 가능한 부분 번역의 거듭제곱으로 v를 취적해야 합니다. V는 어휘의 크기이며, v 복잡도의 지수는 너무 커서 굉장히 비용이 많이 듭니다. 한마디로 모든 경우의 수를 다 게산한다는 것입니다. </p>
<p>그래서 두 번째 방법 일종의 검색 알고리즘인 빔 검색 디코딩 방법이 대안이 되게 됩니다. 디코더의 각 단계에서 k 개의 가장 가능성이 높은 부분 번역을 선택하여 가지치기 하는 방식으로 진행이 됩니다. K는 빔의 크기가 되며 k를 증가시킬수록 각 단계에서 더 많은 것을 고려하게 됩니다. 간단하게, k 개의 가장 가능성이 높은 번역, 가설의 점수가 가장 높은 번역을 찾는 것이 핵심입니다. 빔 검색 방법이 최적의 솔루션을 찾아주는 것은 보장하진 못하지만, 전부 다 계산하는 것보다는 훨씬 효율적입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/9be41f1d-49af-4222-819a-72b9a9e9ebc5/%EC%BA%A1%EC%B2%98.PNG" alt="">
여기 beam search decoding의 예시가 있습니다. K=2이며 start에서 he 와 I 두개로 출발했습니다. 그 두개 에서 또 2개의 가지를 뽑아냈습니다. He 에서는 hit과 struck, i에선 was와 got 그럼 경우의 수가 4개가 되는데 이 4개에서 다시 2개를 선택해야합니다. 그럼 어떤 가지를 선택하게 될까요?
당연히 확률 값이 높은, he hit 가지와 I was가지를 선택하게 되겠죠? (-1.7,-1.6)</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/25ba1b3e-2c01-48fe-bb2f-36536926863c/%EC%BA%A1%EC%B2%98.PNG" alt="">
이런 식으로 k=2임을 생각하며 반복을 하면 최종적으로 확률 값이 가장 높은 줄기인 he hit me with a pie 가지가 나오게 될 것입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/f8a59d99-d39c-46df-8d96-8fe652d4ddbd/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>Greedy decoding 과 beam search decoding을 비교해보면, greedy decoding은 모델 이 end token을 생성할 때까지 decode를 진행합니다. 
하지만 beam search decoding은 한 가설이 end 토큰을 생성하고 끝이 나면 그것은 따로 두고, 다시 다른 가설들을 탐색하기 시작합니다. 그렇게 다시 돌아올 수 없어 수정할 수 없는 문제를 해결하는 것입니다. 
Beam search도 무한정 가설을 세울 수 없기에 한계를 정해줘야 하는데 방법은 두 가지 입니다. 첫 번째는 미리 정한 시간 단계 t에 도달하면 멈추기 하는 법, 두번 째는 n 개의 완료된 가설을 만들면 중지하는 방법입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/aac887fe-7289-47e1-8b3a-e38d2c9a7298/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>이렇게 완성된 가설 모음 중 가장 높은 점수를 받은 것을 선택합니다. 문제는 긴 가설일수록 낮은 점수를 받게 되어서 기준이 애매하다는 것입니다. 설명을 드리면 앞에서 오른쪽으로 갈수록, 가설이 길수록 –값을 계속 더하기 때문에 어쩔 수 없이 정확하지 않더라도 짧은 가설을 채택하는 경우가 생깁니다. 이를 해결하는 방법은 간단하게 t(time step) 수로 나누어 평균을 구하여 최상위를 선택하면 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/2d43e397-51bf-4e3b-be12-0d428fbcaa4b/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>NMT의 장단점을 정리해보면, NMT의 장점으로는 더 나은 성능을 제공한다는 것입니다. 기존 기계번역보다 sequence를 고려하기 때문에 좀 더 유차하고 문맥을 고려하며 단어와 구 사이의 유사성을 잘 이용한다는 특징이 있습니다.
두 번째는 single neural network가 처음부터 끝까지 전반적인 시스템을 가지고 optimized된다는 것입니다. 하부구조가 개별적으로 optimized 되어야 하는 기존 기계번역과 달리 아까 말씀드렸듯이 역전파가 전 시스템을 거쳐서 진행되기 때문에 단순하고 편리합니다. 
세 번째는 인간 공학적 노력이 덜 필요하다는 것입니다. Feature 엔지니어링이 필요가 없으며, 모든 언어쌍에 같은 방법으로 동일한 아키텍쳐로 적용이 가능합니다. 그저 병렬 말뭉치만 찾으면 됩니다.</p>
<p>단점도 존재합니다.
단점으로는 NMT가  debug 즉 어디서 오류가 발생했는지 오류를 표시하는 것이 어렵다는 것입니다. 기존 기계번역은 하위 구조가 있기 때문에 디버그가 가능합니다. 하지만 NMT는 하부구조가 없고 쭉 흘러가는 형태이기 때문에 가능합니다. 두 번째는 제어하기 어렵다는 것입니다. 특정 오류를 하고 발견했을 때 이를 수정하고 제어할 사후규칙을 만들기가 어렵다는 것입니다. 만약 글을 번역하다가, 번역에 나쁜 말을 집어넣지 않도록 컨트롤하고자 했는데, 이것만을 못하도록 전반적으로 제어하기가 어렵다는 것입니다. 기존 기계번역은 하부구조가 있다면 그 부분만 따로 떼어와서 제어하게끔 만들 수 있는데 NMT 같은 경우에는 FLOW가 전반적으로 흘러가기 때문에 특정 부분만을 수정하기가 어렵기 때문입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/44c44d68-9015-4630-b32e-21088d3e93f3/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>machine translation이 제대로 이뤄졌는지 확인하는 대표적인 지표는 ‘BLUE’ 점수입니다. 이 방법 외에도 다양한 방법이 있지만 아직까지는 대부분 BLUE 점수를 통해서 모델을 평가합니다. BLUE(Bilingual Evaluation Understudy)란 기계에 의해 번역된 문장과 사람이 작성한 문장을 비교해서 유사도를 측정해서 성능을 측정하는 지표입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/2bb26fc7-d4b5-4cbd-9013-a5f75fe834a8/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>Bleu에 대한 설명보다는 다음 그래프가 중요한데, NMT의 성능이 굉장히 가파르게 증가했다는 것이 중요합니다. 기존 SMT 기계번역은 3년 동안 그 증가 추세의 기울기가 완만했지만, NMT 즉 신경망 기계번역은 그 점수 추세가 가파르게 증가했다는 것입니다. NMT의 성능은 연구를 진행할수록 가파르게 증가함을 보여주고 현재까지도 연구가 진행 중이라고 합니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/f43d6079-4f59-4cd3-94e4-2bd814b8d67f/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>현재까지도 NMT는 NLP 분야에서 딥러닝이 적용된 가장 큰 성공 사례 입니다. 그 예시로, 구글이 번역 시스템을 2년 만에 SMT에서 NMT로 전환하여, 지난 수년간 수백 명의 엔지니어가 한 작업들을 NMT로는 소수의 엔지니어로 몇 달 만에 더 나은 성과를 냈습니다. 하지만 기계번역의 모든 한계점이 없어진 것은 아닙니다.
한계 점으로는, 단어의 범위를 초과하면 그 목표 단어를 만들어 낼 수가 없다는 것입니다. 즉 학습을 시킬 때 없었던 단어는 만들어 낼 수가 없다는 것입니다. 두 번째는 학습데이터와 test데이터 사이에 domain이 일치하지 않으며 성능이 떨어진다는 것입니다. 세 번째는 한 문장을 encoding하는 것이기 때문에 긴 text의 경우 context를 계속 유지하여 오류가 생길 수 있으며 네 번째는 리소스가 부족한 언어 쌍의 경우, 성능이 떨어질 수 있다는 문제가 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/5d8ecdb8-4100-408b-b303-5e04ccc39a33/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>더 많은 문제점이 존재합니다. 왼쪽 그림을 보시면 paper jam은 종이가 프린트기에 끼였다는 의미인데, 이를 직역하여 종이가 들어있는 jam으로 번역을 하게 됩니다. 즉, 관습적인 언어, 상식에 대한 개념이 없다는 것입니다. 두 번째는 굉장히 편향되게 번역을 할 수 있다는 것입니다. 왼쪽 문장에서는 어떠한 성별도 문장에 들어있지 않지만, 오른쪽에서는 간호사의 주어를 she(여성) 프로그래머의 주어를 he(남성)으로 자기 마음대로 할당하였습니다. 여성 간호사와 남성 프로그래머의 학습이 많았기에 발생한 결과인데, 소스 문장에는 없는 정보를 구성하여 성 역할을 전파하는 문제가 생겼습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/d377c1fc-9706-45df-8515-47fcfedf1e56/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>이렇게 단순하게 ag를 반복한 문장을 멋대로 해석하는 문제가 발생하기도 합니다. 이는 학습 데이터 때문에 그저 반복하는 문장을 자기 멋대로 해석한 결과입니다. 이렇듯 시퀀스 투 시퀀스도 한계점을 드러내게 되고 이를 보완하기 위해 나온 방법이 마지막으로 배울 Attention 이라는 개념입니다. </p>
<h1 id="3-attention">3. ATTENTION</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/2d241002-2575-49f4-a9b2-cf90b4580600/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>Seq to seq에서는 소스 문장의 인코딩이 중요합니다. 여기서 문제는 단일 벡터 전체가 소스 문장 전체의 인코딩이라는 문제이며, 문장의 정보가 끝에서 다 인코딩 되어버리는 즉, 정보가 쏠려버리는 병목현상이 나타나게 됩니다. 소스 문장에 대한 모든 정보를 끝에서 다 캡처하도록 강조하며, 여기서 너무 많은 압력이 가해집니다. Attention은 단계별로 집중을 하게 만들어 한꺼번에 집중이 가해지는 이 병목현상을 해결해 줍니다. 디코더의 각 단계에서 인코더에 직접 연결을 하여 소스 시퀀스의 특정 부분마다 집중을 하게 만드는 작업을 하는데 다음에서 더 자세하게 설명을 드리겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/982362ce-85cb-45bd-99ca-b5ab94fac496/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>디코더의 첫 단계에서 인코더의 첫 단계와 내적을 시켜서 스칼라 값을 뽑아 attention score를 구합니다. 어텐션 스코어란 현재 디코더의 시점 t에서 단어를 예측하기 위해, 인코더의 모든 은닉 상태 각각이 디코더의 현시점의 은닉 상태 states와 얼마나 유사한지를 판단하는 스코어 값입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/8267ab1c-38d3-4570-8d05-0820329e10f0/%EC%BA%A1%EC%B2%98.PNG" alt="">
그렇게 4개의 attention score를 가져와서 소프트맥스에 넣고 확률 분포를 얻습니다. Barchart로 알아본 결과, 대부분의 확률 질량이 첫번째 단어로 갔음을 알 수 있습니다. 그렇게 he라는 단어를 먼저 만들게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/d10c5eb6-3b66-42bf-a085-0a1a9670548c/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>그렇게 얻은 attention 분포는 인코더의 hidden states의 가중치가 됩니다. Attention 분포와 인코더의 hidden states를 가중 합하여 attention output을 뽑고,  그리고 그 attention output과 디코더의 hidden state를 결합하여 y1(hat)이라는 결과 he를 도출하게 됩니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/d2768fac-c3be-4ba4-b4c5-ec59a15be177/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>Attention 출력을 사용하여 다음 단어에 영향을 주고 그런 식으로 두 번째 디코더에서도, 세 번째 디코더에서도 같은 것을 반복합니다. 각 단어에는 분포가 있으며, 기존 NMT보다 훨씬 더 유연하고 부드러운 정렬과 사고를 하게 됩니다. 기존 인코딩 방법으로는 마지막에 압력을 가해서 정보의 병목현상이 일어났는데, ATTENTION을 사용하여 각 인코딩의 각 단계마다 집중을 해주어 정보의 흐름을 마지막에 집중시키지 않고 각 단계마다 부드럽게 풀어준다고 생각하시면 쉬울 것 같습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/d6d87eff-d123-4621-9fe2-233dc8b23da3/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>방정식은 지금까지 그림으로 봤던 것을 식으로 풀어내면 방정식은 끝이 납니다. 아까 봤듯 인코더 hidden states와 디코더 hidden states를 결합하여 attention score 값을 뽑고, 여기에 softmax적용해서 attention 확률분포 뽑고, 여기다가 encoder hidden states의 가중 합을 구해 attention output 값을 뽑고, 이 output 값과 decode의 hidden state와 결합하여 최종 y hat을 구하는 과정입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/2d44b3b0-ee4a-4d9f-a098-11481b75c21e/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>Attention의 효과는 놀라웠습니다. 
첫 번째는 attention은 기존 신경망 기계 번역의 성능을 훨씬 향상시켰습니다. Decoder가 소스 문장 부분마다 집중을 하여  가능해진 일입니다. 두번째는 병목현상을 해결하였습니다. 아까 그 이유를 설명드렸습니다. 세 번째는 기울기 소실 문제를 해결하였다는 것입니다. 문장이 길어질수록 뭔가 길이가 길어질수록 기울기 소실 문제가 발생하는데, attention은 각 단계마다 집중을 할 수 있어 소실문제를 해결하였습니다. 네 번째는 추적 가능성입니다. NMT는 하부구조가 없고 flow가 전반적으로 진행되기 때문에 어디서 오류가 발생했는지 추적하기 어렵지만 attention은 encoding의 각 단계마다 집중하여 보면서 어디서 오류가 발생했는지 확인할 수 있습니다. 이렇게 NMT의 문제점들을 효과적으로 해결했습니다.</p>
<h3 id="참고자료">참고자료</h3>
<ul>
<li><a href="https://donghwa-kim.github.io/BLEU.html">https://donghwa-kim.github.io/BLEU.html</a></li>
<li><a href="https://www.programmersought.com/article/89135232797/">https://www.programmersought.com/article/89135232797/</a></li>
<li><a href="https://jeongukjae.github.io/posts/cs224n-lecture-8-machine-translation,seq2seq,-attention/">https://jeongukjae.github.io/posts/cs224n-lecture-8-machine-translation,seq2seq,-attention/</a></li>
<li><a href="https://pongdangstory.tistory.com/424">https://pongdangstory.tistory.com/424</a></li>
<li><a href="https://wikidocs.net/22893">https://wikidocs.net/22893</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS224n] Lecture 7 - Vanishing Gradients And Fancy RNNs]]></title>
            <link>https://velog.io/@tobigs-text1314/CS224n-Lecture-7-Vanishing-Gradients-And-Fancy-RNNs</link>
            <guid>https://velog.io/@tobigs-text1314/CS224n-Lecture-7-Vanishing-Gradients-And-Fancy-RNNs</guid>
            <pubDate>Thu, 31 Dec 2020 14:04:21 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 투빅스 13기 <a href="https://github.com/lilly9117">최혜빈</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Vanishing gradient problem</li>
<li>LSTM</li>
<li>GRU</li>
<li>More fancy RNN variants</li>
</ol>
<hr>
<h1 id="vanishing-gradient-problem">Vanishing gradient problem</h1>
<h3 id="remark-backpropagation-for-rnns">Remark) Backpropagation for RNNs</h3>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c88064c4-fa48-476d-916e-d3b7f157d6ca/image.png" alt="">
RNN 네트워크를 학습하는 것은 기존의 backpropagation과는 살짝 다른 <strong>BPTT</strong>를 사용합니다.
RNN의 recurrent한 부분을 시간에 대해 펼쳐서 forward pass로 activation 값을 내고, target과의 차이로 error를 계산하고, 이 error를 각 node로 편미분함으로써 backpropagation을 진행합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/f553f556-0fe9-44e7-8793-1a715dc6f5eb/image.png" alt="">
BPTT에서 중요한 점은 각 레이어마다의 weight가 동일한 weight이어야 하므로 모든 update가 동일하게 이루어져야 한다는 점입니다. 
다시 말해, 각 레이어마다 동일한 위치의 weight에 해당하는 모든 error 미분값을 다 더한 다음, 그 값을 backpropagation하여 weight를 한 번 업데이는 하는 방법이 RNN에서의 BPTT라고 합니다. </p>
<h2 id="1-vanishing-gradient-intuition">1. Vanishing gradient intuition</h2>
<ul>
<li><strong>Gradient Problem</strong> : RNN backpropagation 시 gradient가 너무 작아지거나, 반대로 너무 커져서 학습이 제대로 이뤄지지 않는 문제</li>
</ul>
<p>수식으로 자세히 살펴보겠습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/5f1f47b3-23f5-4c3f-a5db-ce1432671133/image.png" alt="">
RNN cell의 t번째 시점의 hidden state는 직전 시점의 hidden state와 t시점의 입력값 x값을 받아 갱신이 됩니다.
위 그림의 오른쪽 부분을 보면, 4번째 시점의 loss값에 대한 h1의 gradient는 chain rule에 의해 계산됩니다. 즉, 파란색 화살표에 해당하는 gradient를 순차적으로 곱한 값이 됩니다.
이 식을 일반화하여 i번째 시점의 손실에 대한 j번째 hidden state의 gradient를 표현하면 다음과 같이 되고, 노란색 박스 부분이 우리가 주목해야 할 부분입니다.
<strong>chain rule에 의해 graient가 &quot;계속 곱해지면서 이 값(노란색 부분)이 커지는가 작아지는가&quot;가 중요한 문제가 됩니다.</strong> 
<img src="https://images.velog.io/images/tobigs-text1314/post/c18d2727-8e7b-4101-ac30-460180f839ad/image.png" alt="">
t번째 시점에서의 hidden state의 정의를 이용해서 t번째 hidden sate에 대한 t-1번째 hidden state의 gradient를 정의하면 다음과 같습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/5ec782cd-e6d9-423f-85f4-894c8b5e745a/image.png" alt="">
위에서 구한 정의를 이용하여 대입하면 다음과 같이 되고, 이 식은 norm의 성질에 의해 부등식이 성립하게 됩니다.
부등식의 의미 : $\mathbf{W}_h$ matrix의 L2 norm이 결국 $\mathbf{W}_h$의 가장 큰 eigenvalue값이라는 것</p>
<ul>
<li>부등식을 통해, RNN 역전파 시 chain rule에 의해 지속적으로 곱해짐으로써 완성되는 <strong>i번째 시점에서의 손실에 대한 hidden state의 gradient의 L2 norm은 절대적으로 $\mathbf{W}_h$의 L2 norm의 크기</strong>에 달려있다는 것을 확인할 수 있습니다</li>
<li>$\mathbf{W}_h$의 가장 큰 고유값이 1보다 작다면, 1보다 작은 값이 계속해서 곱해지는 것이기 때문에 gradient가 빠르게 사라져버리는 문제가 발생하는 것입니다. = Vanishing gradient problem !!</li>
</ul>
<p>+) backpropagation과 관련한 gradient 문제와 별개로 activation function의 종류에 따라 vanishing gradient문제가 발생하기도 합니다</p>
<h2 id="2-why-is-vanishing-gradient-a-problem">2. Why is vanishing gradient a problem?</h2>
<p>gradient의 값이 매우 작아지는 현상이 RNN에 어떤 문제를 발생시킬까요?</p>
<p>1) <U>파라미터들이 가까이 위치한 dependency에 맞게 학습을 하고, 멀리 떨어진 dependency에 대해서는 학습을 하지 못하게 됩니다.</U></p>
<ul>
<li>다시말해, weight는 long-term effects보다 near effects에 관해 update됩니다. 
<img src="https://images.velog.io/images/tobigs-text1314/post/26997333-e0ac-4e96-8882-53a60b6e66a9/image.png" alt=""></li>
</ul>
<p>2) <U>Gradient는 미래에 과거가 얼마나 영향을 미치는지에 대한 척도.</U></p>
<ul>
<li>gradient값이 너무 작아져서 0에 가까워져 소실되어 버리는 경우, 결과적으로 판단하기에 이 값이 &lt;정말로 미래에 과거가 영향을 미치지 않아서 gradient값이 0이 된건지&gt;, &lt;파라미터 값이 잘못 설정되어서 gradient가 0으로 소실되어 버린건지&gt; 구분할 수 없습니다.<h2 id="3-effect-of-vanishing-gradient-on-rnn-lm">3. Effect of vanishing gradient on RNN-LM</h2>
강의자료에 있던 실제 language model task에 적용하는 경우 발생하는 문제의 예시를 살펴보면,
Ex 1)
<img src="https://images.velog.io/images/tobigs-text1314/post/da11d911-dd11-476a-bad5-7ea256a525ea/image.png" alt="">
긴 문장이 input으로 들어왔을 때, 마지막에 올 단어가 ticket이라는 것을 첫번 째 줄의 ticket으로 유추할 수 있지만, &quot;vanishing gradient&quot; 문제로 멀리 떨어진 단어들과의 dependency를 학습하지 못하게 되고, ticket이 아닌 가까이 있는 printer로 잘못 유추해버리는 예시입니다.
Ex 2)
<img src="https://images.velog.io/images/tobigs-text1314/post/df8333cc-c37a-4146-aa34-59fa9a0cbb70/image.png" alt="">
이 예시도 역시, writer와의 dependency를 학습하지 못하고 are이라는 잘못된 결과를 제공하는 예시입니다.<h2 id="-exploding-gradient-problem">+ Exploding gradient problem</h2>
vanishing gradient 문제 말고도, exploding gradient 문제도 존재합니다.</li>
</ul>
<p>이 문제를 Gradient clipping이라는 방법으로 간단히 해결할 수 있습니다.</p>
<h3 id="gradient-clipping">Gradient Clipping</h3>
<ul>
<li>gradient가 일정 threshold를 넘어가면 gradient값의 L2 norm값으로 나눠주는 방식</li>
<li>쉽게 말해, 파라미터를 update할 때, gradient가 정상적인 값보다 너무 크다고 판단되었을 때, scale down을 해주는 방법
<img src="https://images.velog.io/images/tobigs-text1314/post/64cd4f35-0f6a-4fa2-828c-f3e7bbfa6d1c/image.png" alt=""></li>
</ul>
<h2 id="-is-vanishingexploding-gradient-just-a-rnn-problem">+ Is vanishing/exploding gradient just a RNN problem?</h2>
<p>Q. RNN에서의 gradient문제는 RNN만의 문제일까요?</p>
<p>A. 당연히 아닙니다. 이 문제는 feed-forward, convolutional을 포함한 모든 NN에서의 문제로, 대부분의 domain에서, backpropagation을 할 때 점점 gradient가 작아져 lower layer에서는 update가 잘 되지 않아 학습하기 어려운 문제가 발생합니다.</p>
<p>gradient vanishing 문제를 해결하는 몇몇 방법을 살펴보면, </p>
<p>1) Residual connections &quot;ResNet&quot;
<img src="https://images.velog.io/images/tobigs-text1314/post/902105e3-9442-4749-901c-3c461229ec84/image.png" alt=""></p>
<ul>
<li>=skip-connections</li>
<li>input x 에 convolutional layer을 지나고 나온 결과를 더해줌으로써, 과거의 내용을 기억할 수 있도록 합니다.</li>
<li>과거의 학습 내용 보존 + 추가적으로 학습하는 정보 =&gt; gradient 사라지는 문제 해결</li>
</ul>
<p>2) Dense connections &quot;DenseNet&quot;
<img src="https://images.velog.io/images/tobigs-text1314/post/1885c177-41a8-4252-87b6-b8163fcfff93/image.png" alt=""></p>
<ul>
<li>이전 layer들의 feature map을 계속해서 다음 layer의 입력과 연결하는 방식</li>
<li>+) ResNet과 비교
ResNet : feature map끼리 <U>&#39;더하기&#39;</U>를 해주는 방식
DenseNet: feature map끼리 <U>&#39;Concatenation&#39;</U> 시키는 방식</li>
</ul>
<p>3) Highway connections &quot;HighwayNet&quot;</p>
<ul>
<li>Residual connections과 비슷</li>
<li>T: transform gate, C: carry gate =&gt; output이 input에 대해 얼마나 변환되고 옮겨졌는지 표현함으로써 해결하는 방식 (LSTM에서 영감을 받은 모델!)</li>
</ul>
<p>이처럼 Vanishing gradient문제는 여러 분야에서 매우 general한 문제이지만, 특히 RNN과 같이 동일한 weight matrix를 반복적으로 곱하는 모델은 특히 더 불안정하므로, 더욱 심각한 문제라고 할 수 있습니다. 다음으로 이를 해결하기 위해 제시된 모델인 LSTM, GRU 모델을 살펴보겠습니다.</p>
<h1 id="lstm">LSTM</h1>
<p><strong>LSTM(Long Short-Term Memory)</strong> 
: RNN의 vanishing gradient문제로 발생하는 장기 의존성 문제를 해결하기 위해 RNN에서 메모리를 분리하여 따로 정보를 저장함으로써 한참 전의 데이터도 함께 고려하여 output을 만들어내는 모델
<img src="https://images.velog.io/images/tobigs-text1314/post/d79b5ff7-af7f-4164-8a68-3f7635fdfe01/image.png" alt="">
<strong>LSTM의 핵심 아이디어</strong></p>
<ul>
<li>이전 단계의 정보를 <U>memory cell</U>에 저장해서 흘려보내는 것 =&gt; cell state</li>
<li>현재 시점의 정보를 바탕으로 <strong>과거의 내용을 얼마나 잊을 지 곱해주고</strong>, 그 결과에 <strong>현재 정보를 더해서</strong> 다음 시점으로 정보를 전달하는 것</li>
</ul>
<h3 id="cell-state">Cell state</h3>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/3d942906-5693-41f8-af23-fee77db647d7/image.png" alt=""></p>
<ul>
<li>LSTM의 핵심적인 부분</li>
<li>cell state는 input, forget, output 세 개의 gate들을 이용하여 정보의 반영여부를 결정합니다.</li>
</ul>
<p>각각 세개의 gate는 어느 정보를 쓰고, 읽고, 잊을 것인지를 결정하는데, 이를 단계별로 살펴보겠습니다.</p>
<h2 id="lstm-단계">LSTM 단계</h2>
<h3 id="1-forget-gate-layer">1) Forget gate layer</h3>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/b02a88a2-4a88-49a3-bdd9-3e9229aa304b/image.png" alt="">
forget gate : 어떤 정보를 잊고 어떤 정보를 반영할지에 대한 결정을 하는 gate</p>
<ul>
<li>t번째 시점에서의 x값과 t-1시점에서의 hidden state를 입력값으로 받아 sigmoid activation function을 통해 0에서 1사이의 값을 출력합니다.</li>
<li>출력한 값이 만약 0에 가깝게 나온다면 불필요한 정보들을 다 지워버린다는 것이고, 1에 가까울수록 이 정보에 대해 반영을 많이 한다는 의미입니다.</li>
</ul>
<h3 id="2-input-gate-layer">2) input gate layer</h3>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/71df8be2-1e51-463d-b51f-50bccab44115/image.png" alt="">
input gate: 새로운 정보가 cell state에 저장될지를 결정하는 gate</p>
<ul>
<li>forget gate와 마찬가지로, input으로 $\mathbf{h}_(t-1)$와 $\mathbf{x}_t$를 받습니다.</li>
<li>두 layer가 존재하는데,<ol>
<li>input gate : sigmoid 함수에 의해 0에서 1사이의 값으로 출력하는 부분 -&gt; 현재의 정보를 반영할 지를 결정합니다</li>
<li>update gate: cell state에 더해질 후보값들의 벡터를 만드는 layer 
결국은, 이 두 gate에서의 output값이 곱해짐으로써 현재의 정보를 반영할 것인지를 결정합니다.</li>
</ol>
</li>
</ul>
<h3 id="3-update-cell-state">3) Update Cell state</h3>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/8b0cb1e0-a750-4c7b-b4e9-d81eecc4615e/image.png" alt="">
최종적으로는 과거의 정보는 삭제될 것인지, 유지될 것인지를 <strong>forget gate</strong>를 통해 결정하고, 현재 input 값이 반영되는지 안되는지는 <strong>input gate</strong>에서 결정이 됩니다.
이 두 값이 더해져서 다음 cell state의 입력값으로 들어가게 되고, 이렇게 cell state가 update 됩니다.</p>
<h3 id="4-output-gate-layer">4) Output Gate Layer</h3>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/6234444a-b4e0-4b8d-8758-5573ada743a4/image.png" alt="">
마지막으로, 출력값을 반환하는 Output gate가 존재하고, 최종 output은 cell state를 바탕으로 필터링을 한 값이 됩니다.</p>
<ul>
<li>먼저 sigmoid 함수에 input들이 들어가 0에서 1사이의 값을 출력합니다 -&gt; cell state의 어느 부분을 output으로 내보낼지를 결정합니다</li>
<li>다음, cell state가 tanh에 들어가서 나온 출력값과 output gate에서 나온 값이 곱해져서 t시점에서의 hidden state가 나오게 됩니다. -&gt; 최종 output 값 &amp; 다음 state의 input값!</li>
</ul>
<p>=&gt; LSTM
<img src="https://images.velog.io/images/tobigs-text1314/post/9d59d61d-f60c-4459-8b0e-60108e2ef8aa/image.png" alt="">
정리된 그림을 살펴보면 다음과 같습니다.
이 때, 1) 모든 state와 gate는 길이가 n인 벡터이고, 2) 모든 gate는 sigmoid를 통과해서 0과 1사이의 숫자로 나오고, 3) lstm은 전 hidden state와 현재 input context를 기반으로 계산되므로 dynamic한 모델입니다.</p>
<h3 id="how-does-lstm-solve-vanishing-gradients">How does LSTM solve vanishing gradients?</h3>
<p> 이 LSTM이 어떻게 gradient vanishing 문제를 해결했는지를 간단하게 수식으로 생각해보면, 
<img src="https://images.velog.io/images/tobigs-text1314/post/a926df1f-ac2d-4844-a6a0-ea094d40ac51/image.png" alt="">
만약 forget gate가 1로 설정, input gate가 0으로 설정하면, t시점에서의 cell state는 이전의 정보가 완전히 보존되는 채로 hidden state를 update하기 때문에 cell의 정보가 완전하게 보존될 것입니다. =&gt; 장기 의존성 문제 해결!!</p>
<p>+) 하지만, LSTM도 vanishing/exploding gradient문제가 아예 없다고 보장할 수 는 없다고 합니다.😥</p>
<h1 id="gru">GRU</h1>
<p><strong>GRU(Gated Recurrent Units)</strong>
: LSTM의 강점을 가져오되, 불필요한 복잡성을 제거한 모델
<img src="https://images.velog.io/images/tobigs-text1314/post/51646948-037a-410c-879f-0029625bba93/image.png" alt=""></p>
<ul>
<li>매 time step t마다 input $\mathbf{x}_t$과 hidden state $\mathbf{h}_t$는 있지만, cell state는 존재하지 않고, 사실상 hidden state에 합쳐집니다. </li>
<li>이 모델도 LSTM처럼 gate들을 통해서 정보의 흐름을 통제하는데, update gate와 reset gate가 있습니다. 각각을 수식과 함께 살펴보면 다음과 같습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/beccdc3d-bb87-4c59-8c57-391f79218cbe/image.png" alt=""></li>
</ul>
<h3 id="gru-단계">GRU 단계</h3>
<p>전체적인 수식으로 순서를 이해해보면, 
<img src="https://images.velog.io/images/tobigs-text1314/post/a81c0913-e932-4e5d-af71-81b36a0af171/image.png" alt=""></p>
<ol>
<li>먼저 reset gate를 통해 임시적인 hidden state를 만들고,</li>
</ol>
<p>-&gt;직전의 hidden state에 곱함으로써 직전의 hidden state값을 그대로 이용하지 않고 reset을 해서 이 값과, 현시점의 x값을 통해 현시점의 candidate를 계산합니다
2. update gate를 통해 구한 현시점과 과거 시점의 정보양 비율을 결정하고,
3. $1-z_t$에 이전 hidden state값을 곱하고 $z_t$에 현시점의 candidate값을 곱해서 최종 hidden state를 계산합니다.</p>
<p>+) GRU도 LSTM과 비슷한 방식으로 확인해보면, update gate로부터 나온 값을 0으로 설정하면 이전 hidden state state의 값이 계속 보존된다는 의미로, gradient vanishing 문제를 어느정도 해결했다고 볼 수 있습니다.</p>
<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/tobigs-text1314/post/e42dfd0e-adec-4437-bc90-7f64ace63274/image.png" alt="">
Bidirectional RNN : left, right 두 방향으로 모두 정보를 이용하기 위한 방법</p>
<ul>
<li>분리된 weight를 가지고 있는 forward RNN과 backward RNN을 학습한 후 각 hidden state를 concat해서 최종적인 representation을 형성합니다.</li>
<li>forward RNN : 정방향으로 입력받아 hidden state 생성 / backward RNN: 역방향으로 입력받아 hidden state 생성 -&gt; 두 hidden state 연결해서 전체 모델의 hidden state로 사용!
<img src="https://images.velog.io/images/tobigs-text1314/post/2d4a4976-8d0b-4e2f-b874-4b7f4f04721b/image.png" alt=""></li>
</ul>
<h2 id="multi-layer-rnns">Multi-layer RNNS</h2>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/606754f2-cc60-42ec-b025-e26d128fe5e9/image.png" alt="">
Multi-layer RNN : RNN을 여러층으로 사용한 모델</p>
<ul>
<li>여러 개의 층으로 구성된 RNN은 더 복잡한 특성을 학습할 수 있습니다</li>
<li>lower RNN에서는 lower level의 feature들을, higher RNN에서는 higher level의 feature들을 학습할 수 있습니다</li>
<li>) 보통 2~4개 정도의 layer을 쌓는다고 합니다. </li>
</ul>
<blockquote>
<p>Reference</p>
</blockquote>
<ul>
<li>Stanford CS224n Lecture 7 강의 &amp; 강의자료</li>
<li>13-14기 정규세션 13기 이예지님 모델심화2 강의자료</li>
<li><a href="https://excelsior-cjh.tistory.com/89">https://excelsior-cjh.tistory.com/89</a></li>
<li><a href="https://ratsgo.github.io/deep%20learning/2017/10/10/RNNsty/">https://ratsgo.github.io/deep%20learning/2017/10/10/RNNsty/</a></li>
<li><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></li>
<li><a href="https://yjjo.tistory.com/18?category=881892">https://yjjo.tistory.com/18?category=881892</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS224n] Lecture 6 - Language Models and Recurrent Neural Network]]></title>
            <link>https://velog.io/@tobigs-text1314/CS224n-Lecture-6-Language-Models-and-Recurrent-Neural-Network</link>
            <guid>https://velog.io/@tobigs-text1314/CS224n-Lecture-6-Language-Models-and-Recurrent-Neural-Network</guid>
            <pubDate>Thu, 31 Dec 2020 14:02:41 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 투빅스 13기 <a href="https://github.com/kmmnjng528">김민정</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Language Modeling</li>
<li>N-gram Language Model</li>
<li>Neural Language Model</li>
<li>RNN Language Model</li>
<li>Perplexity</li>
</ol>
<hr>
<h1 id="1-language-modeling">1. Language Modeling</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/56a5008b-ca61-40a3-a392-0be1f692c0f6/image.png" alt="">
많은 사람들이 자동완성 기능, 인터넷 검색 등의 Language Model을 일상생활에서 사용합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/555ac552-9e02-49c0-b4af-29857e221672/image.png" alt="">
자동완성, 인터넷 검색 기능처럼 현재까지 주어진 문장의 다음 단어를 예측하는 것은 Language Modeling이라고 하며, 이러한 일을 수행하는 모델을 Language Model이라고 합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/ef551acf-cd36-42cb-9002-8aeb6e256bd3/image.png" alt="">
조금 더 formal하게 표현을 하자면, 특정 문장에 확률을 할당한다고 말할 수 있습니다. 문장의 이미 주어진 단어 x(1)부터 x(t)가 주어졌을 때, 다음에 올 단어 x(t+1)의 확률을 위와 같이 나타낼 수 있습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/5f308aaf-d28e-4fbc-aaa0-07268800c063/image.png" alt="">
확률을 차례로 곱해 나가면서, 좌변에 있는 특정 문장의 확률을 식의 우변과 같이 연속된 조건부확률로 풀어 쓴 이후에 확률을 계산할 수 있습니다.</p>
<hr>
<h1 id="2-n-gram-language-model">2. N-gram Language Model</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/03585883-46cd-4ba3-9fd3-1ce939d416f8/image.png" alt="">
N-gram Language Model은 딥러닝을 도입하기 전에 주로 사용된 방법입니다. N-gram은 연속된 N개의 단어 덩어리를 의미합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/7cfda2ba-dee8-40b9-9cef-1357ba069949/image.png" alt="">
어떤 단어가 올 확률은 큰 corpus에서 counting을 통해 구할 수 있습니다. 다만 그 전에 &#39;다음 단어는 오직 직전의 n-1개의 단어에만 영향을 받는다.&#39;라는 가정을 합니다. 즉, n-2번째와 같은 그 이전의 단어는 다음에 오게 될 단어와 전혀 상관이 없다는 뜻입니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/62945401-0bae-4cb3-a310-0786f0df61c2/image.png" alt="">
N-gram 문장이 나타날 확률과 (N-1)-gram이 나타날 확률을 이용하면, 현재 문장이 주어졌을 때 다음 단어가 올 확률을 계산할 수 있게 됩니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/ef164f7d-c8a1-4612-9819-b7f51887782c/image.png" alt="">
N-gram을 이용한 간단한 예시입니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/6a4c9d9e-c70e-4b31-9a70-85d2aa685698/image.png" alt="">
<strong>1) Sparsity problems</strong>
N-gram은 N개의 이전 단어만 가지고 보기 때문에 문장의 문맥을 담기에는 한계가 있습니다. 그렇다고 N을 늘리기에는 문제가 있습니다. 
첫 번째로, 특정 N-gram의 corpus 내 출현 빈도가 낮을 때 발생하는 Sparsity 문제입니다. corpus에 N-gram이 한번도 등장하지 않으면 확률에 0을 주기 때문에 예측해야 하는 단어까지 포함된 N-gram이 하나도 없어서 분자가 0이 될 수도 있고, 예측해야 하는 단어 이전의 (N-1)-gram이 하나도 없어서 분모가 0이 되는 경우가 생길 수도 있습니다.
이에 대한 해결책으로 최소한의 확률을 부여해 0이 되는 것을 막는 스무딩과 N-gram 대신 (N-1)-gram으로 줄이는 backoff가 있습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/ad526635-8704-42e2-9cb6-0d9699cbd321/image.png" alt="">
<strong>2) Storage problems</strong>
두 번째로, Storage 문제입니다. N-gram의 count 정보를 저장하기 위해 model의 크기가 지나치게 커지는 문제가 발생하게 됩니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/b0c3c8a7-a4e4-4c26-b876-40643694efe5/image.png" alt="">
<strong>3) Incoherence problems</strong>
세 번째로, Incoherence 문제입니다. N-gram model이 문맥을 충분히 반영하지 못하는 문제입니다. 앞서 언급한 &#39;다음 단어는 오직 직전의 n-1개의 단어에만 영향을 받는다.&#39;라는 가정 때문에 이전 문맥을 충분히 반영하지 못하기 때문에 중요한 정보를 놓칠 수 있습니다. N의 크기를 늘리면 이러한 문제를 어느정도 해결할 수 있겠지만 동시에 Sparsity 문제가 심해지게 됩니다.</p>
<hr>
<h1 id="3-neural-language-model">3. Neural Language Model</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/20a61f1c-b452-49c6-9598-a2c12795d2ee/image.png" alt="">
N-gram mpdel의 고질적인 문제를 해결하기 위해 도입한 것이 Neural Network입니다. Lecture3의 NER에 적용했던 window-based Neueal Network는 center의 앞뒤로 window를 정했다면, 여기서는 N-gram처럼 예측할 단어 이전에 window를 고정한다고 생각하면 됩니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/9365f8d4-0822-473a-a524-1ae0e92bae04/image.png" alt="">
다음 단어를 예측하기 위해 특정 개수의 단어를 입력으로 받습니다. 여기서는 the/students/opened/their 이렇게 4개의 단어를 입력 받았고, 적절히 embedding해준 후에 Neural Network를 통해 다음 단어의 확률을 찾아냅니다. 이와 같이 특정 개수의 단어를 Neural Network의 input으로 입력 받는 model을 Fixed-window Neural Language Model이라고 합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/569a5671-cf13-4a48-a665-177209627337/image.png" alt="">
N-gram Language Model과 비교하여 Neural Language Model의 장단점을 살펴보겠습니다.</p>
<ul>
<li><strong>장점</strong></li>
</ul>
<ol>
<li>Softmax 덕분에 Sparsity 문제를 해소할 수 있음</li>
<li>Counting 값을 저장할 필요가 없음</li>
</ol>
<ul>
<li><strong>단점</strong></li>
</ul>
<ol>
<li>N-gram과 같이 문맥을 반영하지 못함 (window size가 작기 때문)</li>
<li>단어의 위치에 따라 곱해지는 가중치가 다르기 때문에 Neural Model이 비슷한 내용을 여러 번 학습하는 비효율성을 가짐</li>
</ol>
<hr>
<h1 id="4-rnn-language-model">4. RNN Language Model</h1>
<p>RNN의 핵심 아이디어는 각 input마다 다른 가중치를 부여한 Neural Language Model과 다르게, <strong>동일한 가중치를 반복적으로 사용</strong>한다는 것입니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/843f13f1-19a7-4472-a10a-e9c6cb3d65d1/image.png" alt="">
그리고 RNN의 이름에서도 알 수 있듯이, 순차적인(Recurrent) 정보를 처리하는 것이 기본적인 아이디어입니다.
기존의 신경망 구조에서는 모든 입력이 각각 독립적이라고 가정했는데, 많은 경우에 이런 방법은 옳지 않을 수 있습니다. 한 예로, 문장에서 다음에 나올 단어를 추측하고 싶다면 이전에 나온 단어들의 연속성을 아는 것 자체가 큰 도움이 될 수도 있습니다.
RNN이 recurrent하다고 불리는 이유는 동일한 태스크를 한 시퀀스의 모든 요소마다 적용하고, 출력 결과는 이전의 계산 결과에 영향을 받기 때문입니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/a3905f77-3745-4704-8f58-fba8ba765ab2/image.png" alt="">
RNN의 구조를 간단하게 살펴보겠습니다. 입력 값은 단어들의 시퀀스이고, output은 추측된 단어들의 시퀀스입니다. 매 시퀀스마다 같은 가중치를 적용하는 왼쪽의 RNN의 recurrent한 구조를 오른쪽과 같이 표현할 수 있습니다. 그리고 네트워크를 학습할 때에는 시간 스텝 에서의 출력 값이 실제로 다음 입력 단어가 되도록 Ot = X(t+1) 과 같이 설정해줍니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/9d283dee-3f81-48a2-8681-ae6a4c1a6e4a/image.png" alt=""><img src="https://images.velog.io/images/tobigs-text1314/post/3ffed734-582d-43f0-abe2-4f70d95199ed/image.png" alt=""><img src="https://images.velog.io/images/tobigs-text1314/post/48aaf43e-8c7d-46a6-8ea2-f06abac42f7c/image.png" alt="">
RNN의 장단점을 살펴보겠습니다.</p>
<ul>
<li><strong>장점</strong></li>
</ul>
<ol>
<li>이론 상으로는 Input length에 상관없이 다음 단어를 예측할 수 있음</li>
<li>먼 곳에 위치한 단어도 고려할 수 있어 context를 반영할 수 있음</li>
<li>input이 길어져도 model size가 증가하지 않음</li>
</ol>
<ul>
<li><strong>단점</strong></li>
</ul>
<ol>
<li>다음 단계로 진행하기 위해서는 이전 단계의 계산이 완료되어야 하므로 계산이 병렬적으로 진행되지 않아 느림</li>
<li>이론적으로는 먼 곳의 단어를 반영할 수 있지만 실제로는 vanishing gradient problem등의 문제가 있어 context가 반영되지 않는 경우도 있음</li>
</ol>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/b864e7d0-b3fb-498d-8cf1-b7477f438264/image.png" alt="">
RNN의 학습은 어떻게 진행되는지 살펴보겠습니다.</p>
<p>1) 각 단어를 RNN model에 input으로 주고, 모든 단계에서 예상되는 다음 단어를 계산합니다.
2) 모든 단계에서 예상되는 다음 단어와 실제 다음 단어의 차이의 cross-entropy를 통해 loss를 구합니다.
3) 모든 단계에서의 loss의 평균을 통해 전체 loss를 구합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/fd3c45c8-1c56-403f-abc7-2ba36b3e4fe5/image.png" alt="">
다만 실제 RNN-model을 학습할 때 이와 같이 학습하면 지나치게 많은 계산이 필요하기 때문에 실제로는 단어 단위가 아니라 문장 혹은 문서 단위로 입력을 주기도 합니다. SGD를 통해 optimize하는 것도 좋은 방법이라고 합니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/65a22f34-0dc1-4157-8639-46e137609204/image.png" alt="">
RNN을 학습하는 것은 기존의 신경망 모델을 학습하는 것과 매우 유사합니다. 그러나 네트워크의 각 시간 스텝마다 파라미터들이 공유되기 때문에 기존의 backpropagation을 그대로 사용하지는 못하고, <strong>Backpropagation Through Time (BPTT)</strong> 이라는 약간 변형된 알고리즘을 사용합니다. 각 출력 부분에서의 gradient가 현재 시간 스텝에만 의존하지 않고 이전 시간 스텝들에도 의존하기 때문입니다.</p>
<hr>
<h1 id="5-perplexity">5. Perplexity</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/3d42ac6f-84af-49f0-bc7c-7972496dad20/image.png" alt="">
Perplexity는 Language Model의 성능을 측정하는 척도입니다. Language model을 통해 예측한 corpus의 inverse를 corpus 길이로 normalize해준 값입니다. cross-entropy에다가 로그 씌우고 exponential을 씌어서 구할 수 있으며, perplexity가 낮을 수록 좋은 Language Model이라고 할 수 있습니다.</p>
<hr>
<h4 id="참고자료">참고자료</h4>
<ul>
<li>CS224n Lecture6 강의 &amp; 강의 자료</li>
<li><a href="https://misconstructed.tistory.com/36">https://misconstructed.tistory.com/36</a></li>
<li><a href="https://aikorea.org/blog/rnn-tutorial-1/">https://aikorea.org/blog/rnn-tutorial-1/</a></li>
<li><a href="http://dsba.korea.ac.kr/seminar/?category1=Lecture%20Review&amp;mod=document&amp;pageid=1&amp;uid=42">http://dsba.korea.ac.kr/seminar/?category1=Lecture%20Review&amp;mod=document&amp;pageid=1&amp;uid=42</a></li>
<li><a href="https://heiwais25.github.io/nlp/2019/10/06/Language-model-2/">https://heiwais25.github.io/nlp/2019/10/06/Language-model-2/</a></li>
<li><a href="https://jiho-ml.com/weekly-nlp-18/">https://jiho-ml.com/weekly-nlp-18/</a></li>
<li><a href="https://pakalguksu.github.io/2020/03/01/CS224n-6%EA%B0%95-Language-Models-and-Recurrent-Neural-Networks/">https://pakalguksu.github.io/2020/03/01/CS224n-6%EA%B0%95-Language-Models-and-Recurrent-Neural-Networks/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS224n] Lecture 5 - Linguistic Structure: Dependency Parsing]]></title>
            <link>https://velog.io/@tobigs-text1314/CS224n-Lecture-5-Linguistic-Structure-Dependency-Parsing</link>
            <guid>https://velog.io/@tobigs-text1314/CS224n-Lecture-5-Linguistic-Structure-Dependency-Parsing</guid>
            <pubDate>Tue, 29 Dec 2020 07:21:48 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 투빅스 13기 <a href="https://github.com/jinseock95">오진석</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Syntactic Structure: Consitituency and Dependency</li>
<li>Dependency Grammar and Treebanks</li>
<li>Transition-based dependency parsing</li>
<li>Neural Denpendency parsing</li>
</ol>
<hr>
<p>CS224n의 5번째 강의는 문장의 정확한 이해를 위한 분석 방법인 <strong>parsing</strong>에 대해 다루고 있습니다. 특히 parsing의 방법 중 <strong>Dependency parsing</strong>을 통해 문장 구조를 분석하고 이해하는 방법을 주로 소개하고 있습니다.</p>
<p>첫번째 목차에서는 문장 구조를 분석하는 방법인 Consitituency parsing과 Dependency parsing의 개념에 대해서 간단히 다루고 두번째 목차에서는 Dependency parsing에 대해서 보다 자세하게 다룹니다. 세번째 목차에서는 Dependency parsing의 전통적인 방법인 transition-based dependency parsing의 개념과 parsing 과정에 대해서 소개하며 마지막 목차에서는 neural network가 적용된 방법인 neural dependency parsing이 어떻게 문장 구조를 분석하는 지에 대해 설명합니다.</p>
<h1 id="1-syntactic-structure-consitituency-and-dependency">1. Syntactic Structure: Consitituency and Dependency</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/344c4ef1-ac34-41d0-adec-bf3bcddda481/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B34.jpeg" alt=""></p>
<p><strong>Parsing</strong>이란 각 문장의 문법적인 구성 또는 구문을 분석하는 과정이라고 할 수 있습니다. 주어진 문장을 이루는 단어 혹은 구성 요소의 관계를 결정하는 방법으로, parsing의 목적에 따라 <strong>Consitituency parsing</strong>과 <strong>Dependency parsing</strong>으로 구분할 수 있습니다.</p>
<p>Consitituency parsing은 문장의 구성요소를 파악하여 구조를 분석하는 방법이며, Dependency parsing은 단어간 의존 관계를 파악하여 구조를 분석하는 방법입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/819543df-921c-4120-91df-056c983e8886/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B35.jpeg" alt=""></p>
<p><strong>Consitituency parsing</strong>은 문장을 구성하고 있는 구(phrase)를 파악하여 문장 구조를 분석하는 방법입니다. 보통 각 단어들은 해당 단어의 문법적 의미를 가지고 있습니다.&#39;the&#39;는 &#39;관형사(Det)&#39;, &#39;cat&#39;은 &#39;명사(N) 등을 예로 들 수 있습니다.</p>
<p>이렇게 각 문법적 의미를 가지고 있는 단어들은 단어끼리 결합해서 어떠한 구(phrase)를 구성할 수 있습니다. 그리고 구성된 구는 구와 또 결합할 수 있으며, 이는 곧 문장이 될 수 있음을 의미합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/b965b7f0-a444-495f-9d33-053d9ba8cea6/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B36.jpeg" 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/tobigs-text1314/post/f20bfb73-7fcc-4741-8744-07a2879b54a0/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B37.jpeg" alt=""></p>
<p><strong>Dependency parsing</strong>은 문장에 존재하는 단어 간 의존 또는 수식 방향으로 관계를 파악하여 문장 구조를 분석하는 방법입니다. 이는 문장을 이루는 단어 사이에 서로 영향을 미치는 어떠한 관계가 있음을 전제합니다.</p>
<p>단어 간 존재하는 관계를 의존 관계 혹은 수식 관계로 표현할 수 있으며, 수식을 하는 단어는 &#39;head&#39; 혹은 &#39;governor&#39;, 수식을 받는 단어를 &#39;dependent&#39; 혹은 &#39;modifier&#39;이라고 합니다.</p>
<p>이렇게 단어 간 관계를 정립하게 되면 우측과 같이 문장을 트리 구조로 표현할 수 있게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/d0850d2e-cc30-40fc-8e26-2cc508dd6df7/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B38.jpeg" alt=""></p>
<p>이렇게 문장 구조를 parsing이라는 방법을 통해 분석해야하는 이유는 문장의 의미를 보다 정확하게 파악하기 위해서입니다.</p>
<p>의사소통은 보통 단어의 복잡한 구성을 통해 이루어지기 때문에 보다 정확하게 해석 및 이해하기 위해서는 문장 구조의 연결 구조를 파악할 필요가 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/46b8695a-d3cc-4c2e-a0c3-d4617892f8b5/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B39.jpeg" alt=""></p>
<p>문장 구조를 분석해야하는 이유로 해당 강의에서는 문장에서 발생하는 2가지 모호성(ambiguity)을 소개합니다.</p>
<p>먼저 Phrase Attachment Ambiguity는 형용사구, 동사구, 전치사구 등이 어떤 단어를 수식하는지에 따라 의미가 달라지는 모호성을 말합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/336934c6-ffdd-47b7-bd8b-c019b46fad7c/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B310.jpeg" alt=""></p>
<p>Coordination Scope Ambiguity는 특정 단어가 작용(수식)하는 대상의 범위가 달라짐에 따라 의미가 변하는 모호성을 말합니다.</p>
<p>즉, 정리하자면 문장은 많은 단어가 복잡한 관계로 이루어져 있기 때문에 올바르게 이해하기 위해서는 문장의 구성요소에 대한 분석과 이해가 요구됩니다.</p>
<h1 id="2-dependency-grammar-and-treebanks">2. Dependency Grammar and Treebanks</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/1a42fe5a-aa2c-4b66-b655-fa28f79a48e4/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B312.jpeg" alt=""></p>
<p>Dependency parsing에 대해서 보다 구체적이게 알아보겠습니다. 해당 parsing 방법은 sequence 형태와 tree 형태로 표현할 수 있으며, 2가지 형태의 결과는 정확히 동일한 output을 가져야 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/1e37219d-e930-43dc-94f7-d39fb4d96c65/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B315.jpeg" alt=""></p>
<p>Dependency parsing의 특징은 다음과 같습니다.</p>
<p>먼저 &#39;ROOT&#39;라는 가상의 노드를 문장의 맨 처음에 추가함으로써, 최종 head를 &#39;ROOT&#39;를 설정하고 모든 단어가 1개의 dependent(의존 관계)를 가지도록 설정합니다.</p>
<p>수식을 하는 head와 수식을 받는 dependent는 화살표로 표현하며 문법적 관계 또한 같이 적어줍니다. 마지막으로 수식 관계인 화살표는 순환하지 않으며 중복 관계는 형성되지 않는다고 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/fb522e7c-753a-490a-ad8d-25cf53718f38/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B316.jpeg" alt=""></p>
<p>Dependecy parsing에서 고려되는 보편적인 특징은 다음과 같습니다.</p>
<p>이는 항상 정답이라고 할 수는 없지만 parsing 과정과 결과에서 발생하는 전형적인 특징들을 정리해 놓은 것으로 생각됩니다.</p>
<h1 id="3-transition-based-dependency-parsing">3. Transition-based dependency parsing</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c9311070-ee27-465a-8e0c-159f3e3dfdfa/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B319.jpeg" alt=""></p>
<p>Dependecy parsing의 방법으로 강의에서는 4가지 방법이 있다고 소개합니다. 하지만 이번 강의와 목차에서는 <strong>Transition-based</strong> 방법에 대해서 보다 구체적이게 다루고자 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/5a4031b3-fc92-4fca-b1f1-8663e0df3523/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B320.jpeg" alt=""></p>
<p>Transition-based dependency parsing은 두 단어의 의존 여부를 차례대로 결정해나가면서 점진적으로 dependency structure를 구성해나가는 방법입니다.</p>
<p>이 방법은 문장에 존재하는 sequence를 차례대로 입력하게 되면서 각 단어 사이에 존재하는 dependency를 결정해나가는 방법으로 &#39;Deterministic dependecy parsing&#39;이라고도 불립니다.</p>
<p>문장의 sequence라는 한 방향으로 분석이 이루어지기 때문에 모든 경우를 고려하지는 못합니다. 그렇기 때문에 분석 속도는 보다 빠를 수 있겠지만 낮은 정확도를 보이기도 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/0cf7a604-3821-4d73-872f-ef7f42e14d87/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B321.jpeg" alt=""></p>
<p>Transition-based dependency parsing이 진행되는 과정에 대해서 살펴보겠습니다. 먼저, parsing 과정에는 <strong>BUFFER</strong>, <strong>STACK</strong>, <strong>Set of Arcs</strong>라는 3가지 구조를 가지고 있습니다.</p>
<p>input으로 문장이 입력되면, 위 3가지 구조를 거침으로써 output이 도출되는 parsing 과정입니다. parsing 초기 상태에서 BUFFER에는 주어진 문장이 토큰 형태로 모두 입력되어 있는 상태이며, STACK에는 ROOT만이 존재하고 Set of Arcs에는 parsing의 결과물이 담기게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/4d7f3365-ed20-4cff-8f58-d4374ec929ff/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B322.jpeg" alt=""></p>
<p>parsing 과정에 대해서 간단하게 설명하면 다음과 같습니다. BUFFER에 존재하는 문장의 토큰이 STACK으로 이동하게 되면서 어떠한 state를 형성하게 됩니다. 그리고 해당 state를 기반으로 Decision이라는 결정을 내리게 되고 output으로 결과가 이동하게 됩니다.</p>
<p>먼저 BUFFER에서 STACK으로 토큰이 이동하는 과정은 문장의 sequence를 따릅니다. 즉 BUFFER(&#39;Joe&#39;, &#39;ate&#39;, &#39;the&#39;, &#39;cake&#39;)가 존재한다면 문장의 첫번째 토큰인 &#39;Joe&#39;가 먼저 STACK으로 이동하게 됩니다.</p>
<p>그렇게 되면 STACK에는 &#39;ROOT&#39;와 &#39;Joe&#39;가 존재하게 되면서 어떠한 state를 형성하게 됩니다. 그 때, 이 state를 통해 Decision이라는 결정을 내리게 됩니다. Decision을 결정하는 방법으로는 단순히 함수와 같은 역할이라고 볼 수 있으며 강의에서는 SVM, Neural Network등의 모델이 적용될 수 있습니다.</p>
<p>STACK에서 토큰과 토큰의 존재로 다양한 state가 형성되겠지만 결정되는 Decision은 여기서 3가지를 소개합니다.</p>
<ul>
<li>Shift: BUFFER에서 STACK으로 이동하는 경우</li>
<li>Right-Arc: 우측으로 dependency가 결정되는 경우</li>
<li>Left-Arc: 좌측으로 dependency가 결정되는 경우</li>
</ul>
<p>정리하자면, STACK에서 발생하는 state가 정해진 모델을 통해 3가지 Decision이 결정되는 과정을 가진다로 이해하면 될 것 같습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/f1ddc852-e8f7-4b75-babb-a2e79eaa5450/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B324.jpeg" alt=""></p>
<p>실제로 &#39;Joe ate the cake.&#39; 문장이 Transition-based 방법을 통해 parsing되는 과정을 알아보겠습니다.</p>
<p>초기 상태는 위에서 언급한대로 BUFFER에는 주어진 문장이 토큰 형태로 입력되어 있으며 STACK에는 ROOT만이 존재합니다.</p>
<p>(1) STACK에 ROOT만이 존재하는 state는 &#39;shift&#39;라는 decision이 내려지게 되면서 &#39;Joe&#39;가 BUFFER에서 STACK으로 이동하게 됩니다.</p>
<p>(2) STACK에는 ROOT, Joe라는 state가 &#39;shift&#39;라는 decision이 내려지게 되고 &#39;ate&#39;이 BUFFER에서 STACK으로 이동하게 됩니다.</p>
<p>(3) STACK에는 ROOT, Joe, ate라는 state는 &#39;ate&#39;이 &#39;joe&#39;를 수식하는 &#39;Left-Arc&#39;라는 decision이 내려지게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/6a0e3e95-687b-49f3-8baa-4463f39f504c/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B325.jpeg" alt=""></p>
<p>이 때, &#39;ate&#39;과 &#39;Joe&#39;가 관계가 형성되었기 때문에 해당 결과는 Set of Arcs로 이동하게 됩니다. 또한 dependent가 되는 단어(Joe)는 STACK에서 사라지게 됩니다.</p>
<p>(4) STACK에는 ROOT, ate라는 state가 &#39;shift&#39;라는 decision이 내려지게 되면서 &#39;the&#39;가 BUFFER에서 STACK으로 이동하게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/1d1c47fc-cc1d-4948-8eec-da2908dcbbfd/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B326.jpeg" alt=""></p>
<p>(5) STACK에는 ROOT, ate, the라는 state에서도 어떠한 관계가 형성되지 않는다고 판단했기에 &#39;shift&#39;라는 decision이 내려지게 되고 &#39;cake&#39;가 BUFFER에서 STACK으로 이동하게 됩니다.</p>
<p>(6) STACK에는 ROOT, ate, the, cake라는 state에서 &#39;cake&#39;가 &#39;the&#39; 수식하는 &#39;Left-Arc&#39;라는 decision이 내려지게 되고 해당 결과(cake, det, the)는 Set of Arcs로 이동하게 됩니다.</p>
<p>(7) STACK에는 ROOT, ate, cake라는 state에서 &#39;ate&#39;가 &#39;cake&#39;를 수식하는 &#39;Right-Arc&#39;라는 decision이 내려지게 되고 해당 결과(ate, dobj, cake)는 이동합니다.</p>
<p>(8) STACK에는 ROOT, ate라는 state에서 BUFFER에 토큰이 존재하지 않기 때문에 &#39;shift&#39;가 발생할 수 없습니다. 하지만 모든 토큰은 하나의 dependent를 가진다는 dependency parsing의 특징으로 &#39;ROOT&#39;가 &#39;ate&#39;를 수식하는 &#39;Right-Arc&#39;라는 decision이 내려지게 되고 해당 결과(Root, root, ate)는 이동합니다.</p>
<p>이렇게 문장의 모든 토큰이 BUFFER와 STACK을 통해 어떠한 관계가 결정되고 형성됨으로써 output으로 트리 형태로 표현이 가능해집니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/a7f43e51-05c7-4c62-9584-1287d8d198e4/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B328.jpeg" alt=""></p>
<p>앞서 언급했듯이, STACK에서 발생하는 어떠한 state를 기반으로 Decision을 결정하기 위해서는 SVM, NN, maxnet과 같은 모델이 적용됩니다. 이 과정에서 state를 모델이 input으로 받기 위한 state 임베딩 과정이 필요하게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/0b4d3e01-2ad4-4426-8105-37cc608f4dde/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B330.jpeg" 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><img src="https://images.velog.io/images/tobigs-text1314/post/1dc465a6-5ddc-4c53-a82a-ec847622cdf8/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B331.jpeg" alt=""></p>
<p>해당 state에 알맞은 notation 결과를 다음처럼 확인할 수 있습니다. 보여지는 notation은 일부분을 예시로 보여준 것으로, STACK의 두번째 단어 &#39;ate&#39;과 같은 notation을 추가적으로 뽑아낼 수 있습니다.</p>
<p>그리고 해당 notation의 결과를 찾아볼 수 없을 때에는 그냥 NULL을 부여하게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/97ed4fe0-6d4d-49b0-967a-f49079e271d7/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B332.jpeg" 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>해당 과정에서 indicator features에 설정되는 조건이 어떠한 기준으로 정해지는 것인지 여전히 이해하지 못하고 있는 부분입니다. 개인적으로는, 발생할 수 있는 notation의 모든 조합 혹은 조합들로 조건을 동일하게 구성하는 것으로 이해하였습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/791fd57e-970f-4415-a757-fed1292519d6/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B333.jpeg" alt=""></p>
<p>이렇게 state를 임베딩하는 방법은 1과 0인 binary로 표현되게 됩니다. 그렇기 때문에 sparse한 형태의 특징을 가지게 됩니다.</p>
<p>강의를 보게 되면 &#39;Feature templates: usually a combination of 1<del>3 elements from the configuration&#39;이라고 말하는데, notation의 1</del>3개의 조합으로 indicator feature의 조건을 설정하는 것으로 이해하였습니다.</p>
<p>어쨌든, $10^6 ~ 10^7$ 차원을 모두 계산하여야 하기 때문에 해당 과정에서는 feature 연산이 대부분을 차지하고 단어 또는 단어의 태그의 의미를 반영하지는 못하는 단점이 있습니다.</p>
<h1 id="4-neural-denpendency-parsing">4. Neural Denpendency parsing</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/8010bf39-4a1f-4734-a6d2-c37b53b5020c/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B335.jpeg" alt=""></p>
<p>최근에는 신경망 기반의 방법론들이 발전하게 되면서 neural network가 적용된 Dependency Parsing에 대한 방법론도 제기되었습니다. 모델 구조는 기본적인 neural network 형태를 가지고 있습니다.</p>
<p>이 때, input으로 들어가는 state를 representation하는 방법에 대해서 보다 구체적이게 다루도록 하겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c226f0be-8253-41b3-b494-bbe95d12c1f4/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B336.jpeg" alt=""></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 (8개)</li>
</ul>
<p>다음 POS tags feature로 들어가게 되는 데이터는 words feature에서 들어가는 데이터의 태그를 의미하기 때문에 똑같이 18개가 됩니다.</p>
<p>마지막으로 arc labels에서는 STACK과 BUFFER의 TOP 3 words 6개를 제외한 12개의 label(dependent 관계 표시) 데이터로 구성되게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/7499b28d-76cb-469e-8e83-f345132f466b/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B337.jpeg" alt=""></p>
<p>(4)의 state일 때의 input layer의 데이터를 확인하게 되면 각 feature별로 다음과 같이 확인할 수 있습니다. 이 feature에 해당하는 데이터들을 원핫으로 표현할 수 있게 됩니다.</p>
<p>words feature는 (18 x 단어의 총 개수)
POS tag feature는 (18 x POS tag 총 개수)
Arc-label feauture는 (12 x label 총 개수)</p>
<p>이 때, 일반적으로 POS tag의 개수는 45개 정도라고 말합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/82f948f2-8f40-464b-b5ac-42003055b5e0/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B339.jpeg" alt=""></p>
<p>이렇게 포함된 데이터를 원핫으로 표현한 후에 word embedding matrix를 참고하여 해당 토큰의 벡터를 가져올 수 있습니다. 그렇다면 각 토큰별로 벡터가 있는 상태에서 모두 concat한 뒤에 input layer에 들어가게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/3889f16c-512d-44d0-b286-4057e5134096/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B342.jpeg" alt=""></p>
<p>각 feautre별로 임베딩된 벡터가 input layer를 입력된 이후에 hidden layer에서는 일반적인 feed forward network의 계산이 진행됩니다.</p>
<p>이 때, 신경망에서 보통 쓰이는 ReLU, Sigmoid, Tanh과 같은 activation function을 사용하지 않고 cube function을 사용하게 됩니다. (논문에서는 위 처럼 cube function을 적용했다고 했지만 강의에서는 그냥 ReLU를 적용한 것으로 보아 activation function의 차이가 그렇게 크지 않는 것으로 이해했습니다.)</p>
<p>논문에서 cube function을 적용하게 되면 input으로 들어가는 3개의 feature인 word, POS tag, arc-label의 조합이 계산되면서 feature간의 상호관계를 파악할 수 있다고 말합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c7b4ab4d-1f1e-4b16-8c51-144a5ed7e507/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B344.jpeg" alt=""></p>
<p>마지막으로 output layer에서 Decision이 결정되는 과정은 다음과 같습니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/52891a11-3943-45ad-a69f-79adf33af781/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B345.jpeg" alt=""></p>
<p>hidden layer를 통과하고 나서는 softmax()를 통해 Decision으로 나타날 수 있는 모든 경우의 수의 확률을 구하게 됩니다. 다음 가장 높은 확률로 분류될 Decision이 선택되게 되며 해당 state에서는 conj의 관계를 가지는 Left-Arc의 경우가 Decision으로 선택되게 됩니다. (해당 결과는 (4)의 state와는 관계 없습니다. (4)의 state에서는 Shift Decision이 가장 높은 확률을 가질 것으로 예측됩니다.)</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/07ff09fe-6ed6-4256-9d7c-b110b4062bab/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B346.jpeg" 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를 적용함으로써 Graph-based parser보다 빠르고 좋은 성능을 이끌 수 있게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/f21d7860-5078-4f3d-a974-3975880ff5c9/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B347.jpeg" alt=""></p>
<p>이후로는 greedy algorithms이 적용된 parser과 beam search가 적용된 parser가 발표되었고 최근에 Graph-based에 Neural Network가 적용된 parser가 굉장히 성능이 좋은 것을 확인할 수 있습니다.</p>
<h3 id="참고자료">참고자료</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=sIYGbz8LztY">KoreaUniv DSBA,[DSBA]CS224N-05.Linguistic Structure: Dependency Parsing, 노영빈</a></li>
<li>dongtta’s Blog, [CS224n] 5강 - Dependency Parsing</li>
<li><a href="https://gnoej671.tistory.com/5">제이의 블로그, [cs224n]Lecture 6. Dependency parsing</a></li>
<li><a href="https://www.emnlp2014.org/papers/pdf/EMNLP2014082.pdf">A Fast and Accurate Dependency Parser using Neural Networks, Chen &amp; Manning, 2014</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS224n] Lecture 4 - Backpropagation and Computation Graph]]></title>
            <link>https://velog.io/@tobigs-text1314/CS224n-Lecture-4-Backpropagation-and-Computation-Graph</link>
            <guid>https://velog.io/@tobigs-text1314/CS224n-Lecture-4-Backpropagation-and-Computation-Graph</guid>
            <pubDate>Mon, 28 Dec 2020 11:34:44 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 투빅스 13기 <a href="https://github.com/jbeen2">이재빈</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Matrix Gradients for Neural Nets </li>
<li>Computation Graphs and Backpropagation </li>
<li>Tips and Tricks for Neural Networks </li>
</ol>
<hr>
<h1 id="1-matrix-gradients-for-neural-nets">1. Matrix Gradients for Neural Nets</h1>
<p><img src="https://images.velog.io/images/jbeen2/post/22d6a296-b216-4043-93e4-63b1ecf90aea/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B36.jpeg" alt=""></p>
<p>Neural Network 과정은 다음과 같이 진행됩니다. </p>
<ol>
<li><strong>FeedForward</strong> : x vector 가 Weight Matrix 와 곱해져서, output vector를 만들어 냅니다. </li>
<li><strong>BackPropagation</strong> : output vector 를 Weight matrix 에 대해 미분합니다. FeedForward 과정을 통해 나온 predict 값과 실제 값을 통해, error signal vector를 만들고, Chain Rule 을 이용해 가중치를 업데이트 합니다. </li>
</ol>
<p><img src="https://images.velog.io/images/jbeen2/post/fbe9a6e9-e11d-4c2b-9dfe-1ecce9506aa5/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B38.jpeg" alt=""></p>
<p>Backpropagation 과정에서 미분 계산 시, 도움이 되는 팁은 위와 같습니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/c00f79a5-a937-468c-8bd2-d8260f19130d/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B39.jpeg" alt=""></p>
<p>softmax 미분 계산 시, correct class와 incorrect class를 구분하여 계산하라는 의미는 위와 같습니다. 
i번째 class에 대한 softmax 출력값은 $p_{i} = {e^{x_i} \over {e^{x_1} + e^{x_2} + ... + e^{x_k}}}$가 됩니다. 
softmax 미분값인 ${\partial p_i} \over {\partial x_j}$는 $i=j$ 일 때와 $i \neq j$ 일 때 달라지므로 (노란색 말풍선), 이 점을 주의해 계산해야 합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/d251cb38-dbe0-4651-96dc-cf02e072eb21/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B310.jpeg" alt=""></p>
<p>NLP task 에서는, window 내에 등장한 단어들이 input vector가 됩니다. input vector가 Neural Network의 FeedForward, Backpropagation 과정을 거쳐 가중치를 업데이트 하게 됩니다. 
향후 수행할 Task (=우리가 풀고 싶은 자연어 처리의 구체적인 문제들)에 맞추어 가중치 업데이트를 진행하게 되는데, 이를 <strong>Downstream Task</strong>라고 합니다. 
다운스트림 테스크의 대표적인 예시로는 품사 판별(POS, Part-Of-Speech Tagging), 개체명 인식(NER, Named Entity Recognition) 등이 있습니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/0a9d9a04-5291-4700-9589-9a93c5ba79c7/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B311.jpeg" alt=""></p>
<p>강의에서는 데이터를 함부로 re-training 시키는 것은 좋지 않다고 말합니다. 
pre-trained 된 데이터에서는 TV, telly, television 단어들이 모두 뭉쳐 있어서 비슷한 의미를 지니지만, re-training 시키게 되면 가지고 있는 데이터에 따라 이 세 단어의 임베딩 벡터가 달라질 수 있기 때문입니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/fa8ed701-08aa-424b-9d95-df6d57cf0d92/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B312.jpeg" alt=""></p>
<p>따라서 NLP task는 대부분 <strong>pre-trained 되어 있는 모델을 가져와서, 주어진 목적에 맞게 fine-tuning 하는 방향</strong>으로 진행합니다. </p>
<ol>
<li><strong>pre-trained</strong> : 대규모 말뭉치 &amp; 컴퓨팅 파워를 통해 embedding 값을 만듭니다. 해당 embedding 에는 말뭉치의 의미적, 문법적 맥락이 모두 포함되어 있습니다. </li>
<li><strong>fine-tuning</strong> : 이후 embedding을 입력으로 하는 새로운 딥러닝 모델을 만듭니다. 우리가 풀고 싶은 구체적인 task와, 가지고 있는 소규모 데이터에 맞추어, embedding을 포함한 모델 전체를 update 합니다. </li>
</ol>
<p><img src="https://images.velog.io/images/jbeen2/post/28215ffe-c7aa-4952-918f-148569afb206/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B315.jpeg" alt=""></p>
<p>pre-trained : 학습된 모델을 불러옵니다.   </p>
<p><code>pytorch code</code></p>
<pre><code class="language-python"># 적절한 BERT model 로딩
bert_base, vocabulary = nlp.model.get_model(&#39;bert_12_768_12&#39;,
                                             dataset_name=&#39;wiki_multilingual_cased&#39;,
                                             pretrained=True, ctx=ctx, use_pooler=True,
                                             use_decoder=False, use_classifier=False)</code></pre>
<pre><code class="language-python"># dataset을 불러오고, tokenizing 진행 
ds = gluon.data.SimpleDataset([[&#39;나 보기가 역겨워&#39;, &#39;김소월&#39;]])
tok = nlp.data.BERTTokenizer(vocab=vocabulary, lower=False)
trans = nlp.data.BERTSentenceTransform(tok, max_seq_length=10)</code></pre>
<pre><code class="language-python"># BERT model의 input에 맞게 Data Preprocessing 
class BERTDataset(Dataset):
    def __init__(self, dataset, sent_idx, label_idx, bert_tokenizer, max_len,
                 pad, pair):
        transform = nlp.data.BERTSentenceTransform(
            bert_tokenizer, max_seq_length=max_len, pad=pad, pair=pair)
        sent_dataset = gluon.data.SimpleDataset([[
            i[sent_idx],
        ] for i in dataset])
        self.sentences = sent_dataset.transform(transform)
        self.labels = gluon.data.SimpleDataset(
            [np.array(np.int32(i[label_idx])) for i in dataset])

    def __getitem__(self, i):
        return (self.sentences[i] + (self.labels[i], ))

    def __len__(self):
        return (len(self.labels))</code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/d4ca4f20-fd53-43db-aece-b99ae97f852d/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B316.jpeg" alt=""></p>
<p>fine-tuning : 기존의 학습된 layer에 데이터를 추가로 학습시켜서, parameter를 업데이트 해 task를 수행합니다. </p>
<pre><code class="language-python"># Classifier Task에 맞추어 Fine-Tuning 
class BERTClassifier(nn.Block):
    def __init__(self,
                 bert,
                 num_classes=2,
                 dropout=None,
                 prefix=None,
                 params=None):
        super(BERTClassifier, self).__init__(prefix=prefix, params=params)
        self.bert = bert
        with self.name_scope():
            self.classifier = nn.HybridSequential(prefix=prefix)
            if dropout:
                self.classifier.add(nn.Dropout(rate=dropout))
            self.classifier.add(nn.Dense(units=num_classes))

    def forward(self, inputs, token_types, valid_length=None):
        _, pooler_out = self.bert(inputs, token_types, valid_length)
        return self.classifier(pooler_out)</code></pre>
<br>


<p>강의에서는, </p>
<ol>
<li>웬만하면 pre-trained word vector를 이용하도록 권하고 있습니다. 
사람들이 방대한 데이터에 대해 학습을 시켜 놓은 데이터이기 때문에, 단어 간의 관계가 어느 정도 잘 형성되어 있기 때문입니다. </li>
<li>그러나 100만개 이상의 데이터가 있다면, re-training이 성능에 도움이 될 것이라고 합니다. </li>
</ol>
<p><img src="https://images.velog.io/images/jbeen2/post/e3967d8c-49ba-4ffc-8dac-ca898017cdd6/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B318.jpeg" alt=""></p>
<p>가지고 있는 데이터에 특성에 따라 진행되는 fine-tuning 방법론은 위와 같습니다. </p>
<hr>
<h1 id="2-computation-graphs-and-backpropagation">2. Computation Graphs and Backpropagation</h1>
<p><img src="https://images.velog.io/images/jbeen2/post/169c1935-0cdd-493f-9603-4077d55e0075/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B322.jpeg" alt=""></p>
<p>Backpropagation 과정에서, 주목해야 할 부분은 
<strong>Local Gradient</strong>와 <strong>Downstream Gradient</strong> 입니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/105ae1ff-acd3-4df5-9d49-8e8c0bd809f5/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B323.jpeg" alt=""></p>
<p><strong>Downstream Gradient = Local Gradient * Upstream Gradient</strong> 이므로, 
역전파를 분해하면 위와 같습니다. </p>
<br>


<h3 id="주요-연산에-대한-역전파-분해">주요 연산에 대한 역전파 분해</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/fb83173e-c192-4204-af9e-5980a1617c29/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B324.jpeg" alt=""></p>
<p><img src="https://images.velog.io/images/jbeen2/post/5b53dce6-b851-488e-96ce-daf2f4da37fb/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B325.jpeg" alt=""></p>
<p><img src="https://images.velog.io/images/jbeen2/post/3969a4f0-d100-4f89-84cd-3d1a6cc879be/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B326.jpeg" alt=""></p>
<p><img src="https://images.velog.io/images/jbeen2/post/f2373e33-3e57-4b01-91a1-8b1b7c8bda71/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B327.jpeg" alt=""></p>
<p>주요 연산에 대한 분해 과정을 고려해 계산해 보면, Gradient는 다음과 같이 흐르게 됩니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/a03299d6-6baa-4a77-b4f8-81bf6cb39bd7/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B329.jpeg" alt=""></p>
<h3 id="computation-graph">Computation Graph</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/305dd973-d99d-4403-a13e-f8c8885f55d9/CS224n_Lecture4.jpg" alt=""></p>
<p><strong>Computation Graph</strong>는, &#39;값을 그래프 노드 위에 위치시킨다&#39;는 의미입니다. 
tensorflow 1.0 사용 시에 설정하는 tf.placeholder 와 PyTorch에서 Dataset class에서 변수를 선언하는 것이 Computation Graph의 대표적인 예시입니다. 
DeepLearning Framework들은 그래프 기반으로 연산을 진행하게 됩니다. 그래프에 위치시켜 연산을 진행하면 Forward 과정과 Backward 과정의 시간복잡도가 동일하게 되므로, 효율적으로 연산을 진행할 수 있습니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/c8caf4b9-69f9-42c8-be88-0f2c9032cd2d/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B332.jpeg" alt=""></p>
<p>Numerical Gradient는 h에 아주 작은 값을 대입하여 순간 기울기를 구하는 것을 말하며, 이를 통해 Gradient를 잘 구했는지 체크할 수 있습니다. </p>
<p>Neural Network 과정에서는 Numerical Gradient 방법으로 연산을 진행하지 않는데, 계산 과정이 기하급수적으로 매우 많아져 비효율적으로 연산이 진행되기 때문입니다. 
참고로, Numerical Gradient 방법으로 Neural Network를 진행하게 되면, Forward 과정에서는 $O(W)$, Backward 과정에서는 $O(W^2)$의 계산 비용이 소요됩니다. </p>
<hr>
<h1 id="3tips-and-tricks-for-neural-networks">3.Tips and Tricks for Neural Networks</h1>
<p><img src="https://images.velog.io/images/jbeen2/post/a69aa0ff-9607-4bbf-813d-8a88dcc5cc6b/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B335.jpeg" alt=""></p>
<p>Backpropagation을 그냥 진행하게 되면, 위와 같은 문제가 발생하게 됩니다. </p>
<ul>
<li>Vanishing Gradient
sigmoid 함수의 미분값의 범위가 (0, 1/4] 가 되어, 작은 값이 계속적으로 곱해지는 것이기 때문에 gradient 값이 0으로 사라지게 됩니다. 
  -&gt; Activation Function, Weight Initialization 으로 해결합니다.  </li>
<li>Dying ReLU 
input으로 음수가 들어오게 되면, Backpropagation 진행 시 0 값이 곱해지게 되어 사라져 버리는 문제가 발생합니다.
  -&gt; BatchNormalization, Optimization 으로 해결합니다.  </li>
<li>Overfitting 
가지고 있는 데이터에 지나치게 맞추어 학습하여, 새로운 데이터셋에 대해 제대로 예측하지 못하게 됩니다. 
  -&gt; Regularization, Dropout 으로 해결합니다. </li>
</ul>
<br>



<p>따라서 강의에서는 이와 같은 문제를 방지하기 위한 여러가지 Neural Network Tip을 소개해 주고 있습니다. 
<img src="https://images.velog.io/images/jbeen2/post/1d9daf5f-5a6d-4f0a-834e-afdc1a9fbad5/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B337.jpeg" alt=""></p>
<p>Loss를 구할 때에는 LSE(Least Squared Error)가 최소가 되는 값, 즉 unbiased estimator를 찾는 것이 이상적입니다. 하지만 이를 위해서는 parameter가 증가할 수 밖에 없으므로, 모델이 복잡해지게 됩니다. 
따라서 목적함수에 항을 하나 더 추가하여, 모델이 복잡해질수록 penalty를 부여합니다. 이를 통해, biased 하지만 smaller estimator 인 Loss값을 찾는 것이 regularization 입니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/fbbfef53-64e5-4f89-83d5-cfe4457e4910/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B338.jpeg" alt=""></p>
<p>word vector를 개별적으로 실행하는 것 보다 한 개의 matrix를 만들어서 실행하는 것이 빠르며, 이 과정을 vectorization 이라 부릅니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/7a9df490-1d46-4266-858c-cdd8fb9e78d0/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B340.jpeg" alt=""></p>
<p>activation function 은 ReLU를 가장 먼저 고려하는 것이 이상적인데, 간단하면서 성능이 괜찮기 때문입니다. 
ReLU를 조금씩 변화시킨 activation function 등 다양한 활성함수가 등장하고 있는 추세입니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/9722f9f1-9f93-48b5-8b38-4afd6838e1c3/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B341.jpeg" alt=""></p>
<p>학습 전 가중치를 초기화하여, Gradient Vanishing 이나 Gradient Exploding 현상을 방지합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/589de285-fe28-46c9-8340-42154f7c3051/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B342.jpeg" alt=""></p>
<p>적절한 Optimizer를 사용하여 최적 값을 찾아갑니다.  </p>
<p><img src="https://images.velog.io/images/jbeen2/post/0e6b89c8-330e-4db5-89e4-cc3ce8194767/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B343.jpeg" alt=""></p>
<p>학습시킬 때 적절한 learning rate를 설정하는 것이 중요합니다. 
Learning Rate Scheduling 을 통해 상황에 따라 변환시키면서 학습을 진행하기도 합니다. </p>
<pre><code class="language-python"># Learning Rate Scheduling 
ReduceLROnPlateau(monitor=&#39;loss&#39;, mode=&quot;auto&quot;, factor=0.25, min_delta=0.0001, cooldown=0, min_lr=0.00001)</code></pre>
<pre><code class="language-python"># Cyclic Learning Rate 
cyclic_learning_rate( global_step,   # Epoch 
                      learning_rate=0.01,
                      max_lr=0.1,    # 최대 learning rate 
                      step_size=20.,     
                      gamma=0.99994, # 작게 할수록 진폭이 더 크게 변한다
                      mode=&#39;triangular&#39;, 
                      name=None):</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS224n] Lecture 3  - Word Window Classification, Neural Networks, and Matrix Calculus]]></title>
            <link>https://velog.io/@tobigs-text1314/CS224n-Lecture-3-Word-Window-Classification-Neural-Networks-and-Matrix-Calculus</link>
            <guid>https://velog.io/@tobigs-text1314/CS224n-Lecture-3-Word-Window-Classification-Neural-Networks-and-Matrix-Calculus</guid>
            <pubDate>Mon, 28 Dec 2020 11:27:30 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 투빅스 14기 <a href="https://github.com/kogang97">고경태</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Classification review/introduction</li>
<li>Neural Networks introduction</li>
<li>Neural Networks in NLP!</li>
<li>Matrix calculus!</li>
</ol>
<hr>
<h1 id="1-classification-reviewintroduction">1. Classification review/introduction</h1>
<h3 id="classification-setup-and-notation"><strong>Classification setup and notation</strong></h3>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/598640c4-8189-476c-af88-89691a7cde6b/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>Classification을 하기위해선 보통 x input에 따른 labeling된 값 y를 하나의 표본으로 가진 데이터셋을 여러 개  학습을 시킵니다.</p>
<p>NLP에서는 INPUT인 XI는 단어나 문장, 문서들을 의미하며 목표값인 yi는 class일 수도 단어일수도 있지만 공통적으로 분류된 값들을 의미합니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/68c7d074-6ff5-4f50-8263-9382db9e3de7/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>Classification에 대한 대략적인 설명을 드리면, 우리는 항상 어떤 데이터가 주어지면 이를 올바르게 분류하는 방법을 머신러닝이든지 딥러닝이든지 방법들로 찾게 됩니다.</p>
<p>분류는 위 그림처럼 같은 output끼리 모이도록 경계를 긋는 것을 의미하며 nlp에서 classification또한 고유명사끼리 또는 동사끼리 아니면 같은 의미의 단어끼리 모이도록 할 수가 있겠습니다.</p>
<p>Softmax logistic regression을 이용해서 output의 class를 구분할 경계선을 찾는 과정을 의미한다는 말 또한 같은 의미가 될 것입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/52fb5c81-7cc0-43c8-958a-8b95468a5fae/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>Softmax란,  Xi가 들어오면 이를 pi 확률로 바꾸는 것을 의미합니다. 그리고 분류하고 싶은 클래스의 수만큼 확률값을 구성하며, 모든 클래스의 확률값을 더하면 1이 된다는 특징을 가지고 있습니다. 
다음 그림을 보시면 두 가지 step으로 구성되어 있습니다. 첫 번째 식은, 모든 클래스 c에 대해서 선형결합으로 이루어진 fy를 만들고 두번째 식에서 각각의 클래스에 대해 이를 계산하고 0에서 1로 정규화 하면 됩니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/3adebb40-dd56-4d00-8d68-143d4681cd5c/%EC%BA%A1%EC%B2%98.PNG" alt="">
Softmax활성화를 통해 구한 확률값에 log 씌우고 –부호를 붙이면 negative한 값이 되고, 이를 최소화하도록 학습을 진행하는 것입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/951aeb75-63e4-4d18-9c3f-710358c34768/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>Softmax 뒤에 cross entropy loss를 붙여서 사용하므로 참고로 cross entropy loss/error에 대해서 알아보겠습니다. 강의에서는 cross_entropy loss를 사용하지 않고 설명하지만 우선을 알아보고 넘어가겠습니다. 우선 cross entropy는 정보이론으로부터 나온 개념입니다. 실제 확률 분포를 p라고 하고, 예측한 확률 분포를 q라고 하였을 때, cross entropy는 위와 같이 계산됩니다. </p>
<p>p = [0,...,0,1,0,...,0] 의 값을 가지고 q = [ 0.01,...,0.02, 0.8,0.01...,0]의 값을 가지면, 잘못 분류한 확률들은 0으로 사라지고 실제 클래스의 음의 로그 확률값만을 가지게 됩니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/59d00915-7e93-4f59-bba6-1b1833c79c62/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>전체 데이터 셋으로 확장하면 아래의 공식과 같습니다. I = 1 부터 N까지의 평균으로 loss부분을 업데이트 해주었습니다. </p>
<p>하지만, 단순한 Softmax ( logistic regression ) 하나만으로는 좋은 성능을 낼 수 없습니다. 그 이유는 위의 그림처럼 class를 구분하는 경계선이 선형의 형태이기 때문입니다. 빨간색 동그라미를 구분 지어야 하는 면에 초록색이 bias처럼 섞여 있는 것을 알 수 있습니다. </p>
<p>이를 통해 단순한 선형 분류기가 아닌 새로운 방법이 필요했고 그 해결책이 바로 Neural Network가 됩니다.</p>
<hr>
<h1 id="2-neural-networks-introduction">2. Neural Networks introduction</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/362d609a-51d5-4fd6-8144-ddb051fd9301/%EC%BA%A1%EC%B2%98.PNG" alt="">
아까와 같은 단순 선형 분류기로 분류를 하였을 때 bias가 나타나는 문제점이 있었습니다. 
이를 해결하기 위해서 비 선형적인 방법을 도입하는데 그게 바로 Neural Network입니다. NLP에서 딥러닝은 오른쪽 그림과 같이 가중치 W와 word vectors X에 대해 학습을 진행합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/cee0aa03-5fed-421d-80ba-3e3a110dbf51/%EC%BA%A1%EC%B2%98.PNG" alt="">
뉴럴 네크워크는 생물학의 신경망에서 영감을 얻은 통계학적 기계학습 알고리즘입니다. 원래 심리학에서 많이 연구되었고 오래전부터 연구되었습니다. 뉴럴 네트워크가 어떻게 발전하게 되었고, 어떤 방식으로 한계점을 극복하며 발전하게 되었는지 배웠던 내용이므로 빠르게 알아보겠습니다.</p>
<h3 id="neural-network-history"><strong>Neural Network history</strong></h3>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/5ea0ca6f-6383-4bd2-b8ec-8d25b26b1f2f/%EC%BA%A1%EC%B2%98.PNG" alt="">
첫 번째는 퍼셉트론입니다. Input이 x1부터 xn까지 있고, 가중치를 곱한 후 바이어스를 더하여 선형 결합을 한 후 activation function 거쳐서 값을 뽑아냅니다. 주어진 정보에 따라 단층 신경망의 가중치를 갱신하는 규칙으로 만듭니다. 하지만, 선형 분류기인 퍼셉트론 한계가 나타납니다. </p>
<p>바로 선형으로 분류할 수 없는 문제들이 생겨난 것인데, 그중 가장 대표적인 문제가 xor문제를 해결할 수 없다는 문제입니다. XOR 문제는 둘 중 하나만 1일 때 1일 출력되는 형태인데요, 이는 다층 퍼셉트론과 오차 역전파 개념으로 해결되었습니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/9f3a531d-fd70-429a-9f2b-f19acd400899/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>다층 퍼셉트론이 많이 얘기가 됐지만, WEIGTH를 어떻게 계산하는가가 문제였습니다. 이를 해결한 방법이 은닉층을 추가시켜 오류 역전파라는 방법을 통해서 WEIGHT를 계산을 쉽게 할 수 있는 방법을 고안해 냅니다.</p>
<p>다층 퍼셉트론은 히든 레이어가 추가되었다는 것입니다. 이 그림에서 input에서는 3개의 x 값이 있고 거기에 bias 항 역할을 하는 +1이 추가됩니다. 각각의 노드들이 input에서 weight를 받고 값을 갖게 되고 hidden layer에 있는 노드들을 가지고 다시 계산을 해서 output이 나오게 됩니다. X input에 d 개의 노드가 있으면 d+1개의 입력 노드가 되고 은닉충도 h+1 c 개의 출력 노드가 나오게 됩니다. 이를 모두 곱하면 가중치의 개수 즉 파라미터의 개수가 나오게 됩니다.</p>
<p>각각의 파라미터들의 값들을 모두 업데이트해주는 것이 이 다층 퍼셉트론의 핵심입니다.
<img src="https://images.velog.io/images/tobigs-text1314/post/7d11dc4e-fafd-4b66-a4bb-a56401491e04/%EC%BA%A1%EC%B2%98.PNG" alt="">
Multilayer Perceptron을 행렬로 표현하면 다음과 같습니다. 첫 번째 wi는 행벡터가 전치되어 열벡터로 나타나 있는 것을 알 수 있습니다. 그 열벡터들의 모임을 다시 전치시킨 것이 바로 Wk입니다. 이를 x 벡터와 곱하고 bias를 더해주면 맨 아래와 같이 한 줄의 식으로 나타낼 수 있습니다.  이 그림이 중요한데 후에 window classifier에서 내용을 설명할 때 이 그림과 연관되므로 그때 nlp와 연관 지어 다시 설명을 드리겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/3b0af3b3-1b0b-4e0d-a37a-5b99f53235d7/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>하지만  이 또한 문제가 있었는데, 다층 퍼셉트론을 이제 업데이트하는 방법을 고안해냈지만, 기울기 소실 문제가 발생합니다. 층이 깊어질수록 기울기 소실 문제가 발생하며, 과적합 문제도 발생합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/7a4ea92b-1935-4e37-810c-a5e5352215d0/%EC%BA%A1%EC%B2%98.PNG" alt="">
레이어가 많아질수록 기울기가 소실 문제가 발생합니다. 하지만 relu 함수를 사용하면 이를 해결할 수 있어서, 아주 깊은 신경망을 사용하더라도 gradient vanishing 문제를 해결하였습니다.  또한 dropout기능을 통해 과적합을 방지하여 깊은 신경망인 딥러닝으로 발전할 수 있었습니다. </p>
<p>이제 다시 뉴럴넷에 대한 설명으로 넘어와서, 자연어 처리에 대한 뉴럴 넷에 대한 설명으로 넘어오겠습니다.</p>
<hr>
<h1 id="3neural-networks-in-nlp">3.Neural Networks in NLP</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/f776fa4a-d9cf-4e57-9dd8-51b0527459f1/%EC%BA%A1%EC%B2%98.PNG" alt="">
강의에서 Neural network을 이용한 NLP 방법으로는 3가지 단계로 나누어서 설명하였습니다. 먼저 NER 즉 개체명 인식이라는 방법론입니다. 인명, 지명 등 고유명사를 분류하는 방법론입니다. Named Entity Recognition 을 위하여 Conditional Random Field (CRF) 나 Recurrent Neural Network (RNN) 과 같은 연속적인 모델이 이용될 수 있습니다. 하지만 본 강의에서는 winddow classification 강의를 진행하였고, softmax를 이용하여 window classification을 하는 알고리즘을 설멍하였습니다. 저도 이에 맞추어 설명을 드리겠습니다.</p>
<p>우선 NER이 자연어 처리에서 어떤 목적으로 필요한지를 알아야 합니다. NER은 아까 설명드렸다시피 문장에서 인명, 지명 등 고유명사를 파악하기 위해 사용됩니다. 문장 내에서 고유명사를 파악하는 것이 중요한 이유는, 문맥들이 모두 고유명사를 기준으로 동사와 기타 단어들이 관계를 맺는 구조이기 때문입니다. 예를 들어 어떤 하나의 글이 있고 문맥에 따라 글이 전개될 때, 한 사람의 이름이 나오면 그의 성격, 그의 묘사들이 일정하게 진행되고 사건 또한 그 인물을 중심으로 전개되게 됩니다. </p>
<p>따라서 자연어처리에 있어 그 문맥을 파악하고 글을 해석하는 데 있어 고유명사 즉 인명을 파악하는 것이 중요하게 됩니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/fbd3bb8f-81af-41da-a4fd-5baa5f246dea/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>분류기를 실행하고 클래스를 할당하는 모습을 볼 수 있습니다. 첫 번째 단어가 조직 두 번째 단어도 조직 세 번째는 고유명사가 아니며, 네 번째 단어는 사람으로 다섯 번째 단어는 사람으로 계속 아래로 내려가서 단어 분류를 실행합니다. 주위에 단어가 표시되도록 텍스트에 위치를 지정하여 분류합니다.  </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/ede2a1b5-b85b-44d7-a3e6-0f067a768906/%EC%BA%A1%EC%B2%98.PNG" alt="">
하지만 NER은 한계가 있는 기술입니다. 그 이유는, 
첫 번째, Entity(개체)의 경계를 정하기 어렵습니다. 왼쪽 문장에서 첫 번째 고유명사를 First National Bank로 or National Bank로 잡을지부터 이슈가 생깁니다. 
두 번째, 개체인지 아닌지 알기가 어렵습니다. 위에서 Future School이 의미하는 게 school을 &quot;Future School&quot; 이라고 부르는지 혹은 미래의 학교라는 의미인지 알 수 없습니다.
세 번째, 개체 분류가 모호하며 문맥에 의존합니다. 오른쪽 문장에서 charles로 시작하는 저 단어가 사람인지 조직인지 문맥에 따라 다르며 절대적인 기준은 존재하지 않습니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/5a2d9e57-27f2-4898-8e50-d1016fd5fff1/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>우리가 해결해야 하는 것은 문맥상 사람이 될 수도 있고, 조직이 될 수도 있는, 그 분류가 애매모호한 단어들이며 이를 해결하기 위해서는 문맥을 고려해야 합니다. </p>
<p>그래서 문맥까지 고려하는 window classification 방법론이 나오게 됩니다. Window classification은 문맥상에서 애매모호하게 일어나는 것들에 대한 분류를 도와주는 방법론입니다. 예를 들어, 반의어 관계에 있는 다음과 같은 단어들이 있습니다. 제재하다 라는 단어가 무언가를 허락하는 경계선을 주는 건지 아니면 벌을 주는 건지 문맥에 맞게 둘 중 하나를 선택해야 하는 문제들이 생기며 이를 window classification이 도와줄 수 있습니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/cb06ba63-42f2-407a-82e9-f86f51b4e26a/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>window classification의 기본적인 생각은 중심 단어와 주변 단어들 (context)를 함께 분류 문제에 활용하는 방법입니다. </p>
<p>예를 들어, 다음과 같은 문장에서 중심 단어인 파리가 이름인지 지명인지 분류해내기 위해서 파리 주변의 주변 단어를 사용하는 것입니다. 파리를 window 길이를 2로 분류하기 위해서, 먼저 주변 단어와 중심 단어를 합쳐 벡터로 만들어야 합니다. 파리의 +-2 총 다섯 개의 word vectors을 합쳐서(concatenation) 5d 크기의 vector를 형성합니다. 그리고 이 vector를 활용해 classifer를 제작합니다.
문장을 보면 앞에 전치사가 있는 것을 보니 여기서 파리는 지명일 확률이 높아 보입니다. </p>
<p>이를 가능하게 하는 가장 간단한 방법으로는 contex t내 단어를 분류하기 위해 window안의 word vectors를 평균 내고, 이 평균 vector를 분류하는 방법이 있습니다. (하지만 이럴 경우, 단순 평균이며 많은 word vector 중에 어떤 word vector를 분류하려 했는지 잊어버리기 때문에 위치정보를 잃어버리는 단점이 있습니다.)</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/d9a85f6d-5ca8-4481-939b-016325ce1e64/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>이를 해결하기 위해 방법이 아까 설명드렸던 다층퍼 셉트론과 Softmax함수를 사용하는 방법입니다. 
아까 다층 퍼셉트론을 설명할 때 사용했던 그림을 가져와보면 x window 벡터를 저렇게 5개의 행으로 만들어 이를 전치시키면 5*1의 열벡터가 나옵니다. 저 열벡터가 오른쪽 그림 네모에 해당되는 부분 즉 input이라고 생각하면 쉬울 것 같습니다. 그리고 가중치를 곱한 후 bias를 더해 값을 뽑고 거기에 softmax 활성화 함수를 입히면 우리가 찾고 싶은 output 확률이 나올 것입니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/93ca6674-5615-44bd-89be-4b778c752125/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>다시 말해서, x 대신에 x window 를 input으로 줬다고 생각하면 쉽게 이해할 수 있을 것 같습니다. word2vec에서는 corpus내 모든 위치에 대해서 학습을 진행하였지만, 이번에는 높은 score를 가지는 위치에 대해서만 집중적으로 학습을 진행한다고 생각하시면 쉬울 것 같습니다. </p>
<p>그 후 과정은 뉴럴넷 기본에서 배웠던 방식으로 똑같이 계산해 주면 output 확률 값과 cross entropy error을 이용하여 loss 부분을 업데이트하는 과정까지 이해할 수 있을 것 같습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/3355f872-3bb8-4c79-9083-8e858efd30c8/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>좀 더 구체적으로 살펴보겠습니다. &#39;Not all museums in Paris&#39;는 location entity를 중앙에 가지고 있지 않고, 그에 반해 &#39;museums in Paris are amazing&#39; location entity를 중앙에 가지고 있습니다. 이때 장소 고유명사인 Paris가 중앙에 오는 window는 true window로 표현하고, 그 이외의 다른 window는 부정으로 표현합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/da382a93-5e2f-47ac-9f78-69968f189450/%EC%BA%A1%EC%B2%98.PNG" alt="">
지금까지 내용을 토대로, 이제 이 과정을 3개의 층을 가진 multilayer perceptron으로 이해하면 쉬울 것입니다. 먼저 가장 아래 20x1벡터를 가진 x가 input이 되며 8x20을 가진 가중치 w를 곱하고 bias를 더하여 활성화 함수(소프트맥스)를 거치면 8x1벡터가 나옵니다. 이제 이 벡터에 u를 곱하면 전치가 되니까 1x8 과 8x1 내적 하면 1x1 스칼라 값이 나오게 되고 score 값을 뽑게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/ae9c1ab5-c55c-451a-9ad6-7f6073428eb6/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>Neural networ의 손실 함수는 일반적으로 softmax를 사용할 경우 값을 확률 비율로 변경했기 때문에 비율 간의 차이를 계산하는 cross-entropy 를 사용하는 것이 일반적입니다. 하지만 위에서 score 함수를 우리가 직접 정의했으므로 여기에서는 이에 걸맞은 max-margin loss를 사용합니다. 강의에서는 설명하지 않고 넘어가셨지만 이해를 돕기 위해 설명을 진행하고 넘어가겠습니다. </p>
<p>Max margin loss는 우리가 예전에 배웠던 svm에서 많이 사용되는 개념입니다. 여기서 margin 이란 개념은 이진 분류에서 그 결정 경계와 서포트 벡터 즉 결정 경계와 가장 가까이에 있는 데이터 포인트 사이의 거리를 의미한다고 배웠었습니다. 그림으로 다시 확인해보면,  </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/20d356b1-b7f5-4c25-a034-bdef3a847c13/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>다음 여섯 가지 그래프에서 어떤 결정 경계가 가장 적절해 보이는지는 당연히 F라고 말할 수 있습니다. 결정 경계를 기준으로 파란색 점들과 빨간색 점들이 가장 멀리 떨어져 있기 때문입니다. 오른쪽 그림을 보시면, 가운데 실선이 하나 그어져있는데, 이게 바로 ‘결정 경계’가 됩니다. 그리고 그 실선으로부터 검은 테두리가 있는 빨간 점 1개, 파란 점 2개까지 영역을 두고 점선을 그어놓았습니다 점선으로부터 결정 경계까지의 거리가 바로 ‘마진(margin)’이며 이 마진을 최대화하는 것이 svm의 목적입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/2be6a29a-1d40-40ee-9ec4-ddef80a07a12/%EC%BA%A1%EC%B2%98.PNG" alt="">
여기서도 똑같이 적용된다고 보시면 됩니다. 보시면 s가 정답, s(c)가 부정입니다. 그 차이를 최대화하는 margin을 찾는 것이 바로 svm에서 사용된 개념과 같습니다. 주어진 input x에 대하여 정답 class와 오답 class간의 차이를 max로 만들어 주는 손실 함수입니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/8a4a8ead-14da-4b0c-8a99-11d732ee8d0d/%EC%BA%A1%EC%B2%98.PNG" alt="">
우리는 앞서 작성한 max-margin 손실 함수를 통해 손실 값을 구했습니다. 이제 이 손실값 에 각 파라미터 W, U, b, X가 손실 값에 얼마나 많은 기여를 했는지 알아보고 해당 기여도에 따라 각 parameter 값을 조정해는 것이 그다음 단계일 것입니다.</p>
<hr>
<h1 id="4-matrix-calculus">4. Matrix calculus</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/d47b8725-9fe3-4f24-89d2-ac12f40c85c0/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>왼쪽 상단은 하나의 함수를 미분 한 것인데, x1부터 x(n)까지 n 개의 input을 짚어 넣으면 한 개의 outpu을 줍니다. 이를 미분하면 아래 그림과 같이 n 개의 각각의 input으로 미분을 하여 하나의 벡터로 만들어 주게 됩니다.</p>
<p>이를 응용해보면, matrix에서도 미분이 쉽고 빠르게 진행됩니다. F(x)가 왼쪽 상단과 오른쪽 상단을 비교해보면 input은 n으로 같지만, outpu이 m으로 드러났습니다. 그렇다면 당연히 미분을 한 matrixs도 이렇게 한 행은 왼쪽과 같겠지만, m으로 outpu이 늘어났기 때문에 행으로 이렇게 f1부터 fm까지 쌓이게 되겠죠? 이게 바로 matrix에서 미분을 한 값입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/30c0d354-0ae9-4863-a4c9-63fb51067ed2/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>Chain Rule 도 다시 살펴보면, 왼쪽 그림은 우리가 자주 봤었던 한 변수에 대한 chain rule입니다. 이를 오른쪽 그림에서 복수의 변수에 대한 식에서도 chain rule이 적용됨을 알 수 있습니다. H 식을 x에 대해 미분하면 우선 매개변수인 z로 미분을 하고 z 식을 다시 x로 미분하면 되겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c3d281dc-bcc3-4715-b82d-d18f19a93b9b/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>지금까지의 개념들로, 이제 아까 봤었던, 역전파를 이용하여 손실 함수를 최소화하는 방법을 설명드리려 합니다. H는 z를 input으로 집어넣어 활성화함수를 적용해 나온 식입니다. 이를 z로 미분한다면 우리가 아까 봤던 매트릭스와 비슷한 형태로 nxn의 매트릭스 형태로 나오게 됩니다. 아까 봤었던 매트릭스에서의 미분과 비교해보면 이해가 쉬울 것 같습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/f7dec739-b724-4153-8f5e-1610d6d93011/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>이제 미분한 식을 알아보면 hi는 f(zi)로 나타낼 수 있고, zi 와 zj가 I = j 가 같을 때 즉, 변수가 같을 때 미분했을 때 값이 나오게 되고, 다른 경우는 0으로 값이 나오게 됩니다. 이를 행렬로 표현하면 다음 그림과 같이 대각 행렬이 나오게 됩니다. 이 계산은 우리가 window classification에서 손실 함수를 최소화하기 위한 미분 과정에 부분으로 들어가게 됩니다. 지금 나온 값을 후의 계산 과정에 대입해보겠습니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/09e129fe-1ff8-4c2d-a9ea-458570bfe831/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>첫 번째는 wx + b를 x로 미분한 값 가중치가 나옵니다. 두 번째는 b로 미분한 값 항등행렬이 나옵니다. 세 번째는 u로 미분한 값 h를 전치한 값이 나옵니다. 이 세 가지 식과 전에서 봤던 식 모두 우리가 아까 보았던 window classification의 손실 함수를 최소화하기 위해 미분하는 과정에서 사용되는 식들입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/7ff2bf97-6378-480f-9833-11a42178bc45/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>이제 다시 우리의 뉴럴넷으로 돌아와서 손실함수의 gradient를 계산하려 합니다. 원래는 우리의 손실 함수였던 max-margin loss를 계산해야 하지만, 이해를 쉽게 돕기 위해 원래 강의에서도 우리가 구했던 scor e함수의 gradient를 계산하였습니다. 
이 score 함수의 gradient를 계산하는 설명을 진행해보겠습니다. 지금까지의 chain rule과 우리가 계산했던 4가지 식들을 단순하게 조합하면 끝이 납니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/ff87ba3c-af46-4ba9-ab04-eb6b6a49f56a/%EC%BA%A1%EC%B2%98.PNG" alt="">
Chain rule을 수행하기 전에 우선 h 식에서 wx+b를 z로 치환하여 매개변수를 하나 만듭니다.
s를 b로 미분하기 위해서는 h에 해당하는 식을 매개변수를 이용하여 미분해주어야 하기 때문에 wx+b =  z로 치환하게 됩니다. 그리고 s를 최종적으로 h,z, 그리고 b 세 개의 변수로 미분을 하게 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/72e6f5f8-5ae3-4a5e-9538-7ce61a58c3a8/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>미분 과정을 한꺼번에 살펴보면 우선 첫 번째 s를 h로 미분합니다. 두 번째, h를 z로 미분합니다. 세 번째 z를 b로 미분합니다 이 미분 값들을 모두 곱하면 최종적으로 s를 b로 미분한 값이 나오게 됩니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/ab66ac5d-a68b-41f8-9c48-403a4dda3110/%EC%BA%A1%EC%B2%98.PNG" alt="">
자 이제 지금까지 미분한 계산 과정을 대입하면 계산이 끝이 납니다. S를 h로 미분한 값은 u transpose 한 값이므로 대입해 주고, 
H 즉 f(z)를 z로 미분한 값은 아까 우리가 했었던 대각행렬이 나오므로 이를 집어넣어 주고, Z 즉 wx+b를 b로 미분한 값은 항등 행렬이므로 이를 집어넣어 주면 최종적으로 다음과 같은 식이 나오게 됩니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/910a75b8-16ad-4f68-b04d-e266b5a5d955/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>지금까지는 bias로 미분하여 업데이트를 시켰지만 아까 말했듯 모든 파라미터에 대해서 역전파를 수행하여 파라미터 값들을 업데이트해야 합니다. W에 대해서도 미분을 해줘야겠죠. S를 w로 미분하면 체인룰로 다음과 같이 식을 뽑아낼 수 있을 것입니다</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/bfddfd8d-f63c-49f7-9578-f341ddc23155/%EC%BA%A1%EC%B2%98.PNG" alt="">
우리가 bias로 미분했던 식과 비교해보면 오른쪽 끝에 z를 w로 미분하거나 b로 미분하거나 둘의 차이만 있지, 그 앞 과정인 s를 h로 미분한 식과 h를 z로 미분한 식은 값이 같은 것을 볼 수 있습니다. 이렇듯 오차 역전파는 계산했던 지난 과정들이 다시 사용됨으로써 다시 계산하여 계산량을 늘리는 문제를 막을 수가 있는 것이 장점입니다.</p>
<p>저 파란색에 해당하는 부분은 델타라고 합니다. 델타는 오류 신호 입니다. 편도함수를 계산하는 매개변수라고 생각하면 쉬울 것 같고, 아까 말했듯 이 델타 값은 한 번만 계산하여 효율성을 늘려야 합니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/0c8c5d90-42d4-4dc0-95df-86e1c60d4f71/%EC%BA%A1%EC%B2%98.PNG" alt="">
지금까지 했던 계산들을 matrix로 확장하는 것은 어렵지 않을 것입니다. S를 w matrix로  미분을 하게 되면 우리가 앞에서 계속 봐왔던 matrix로 값이 도출되게 됩니다. 
아까 계산했던 s를 w로 미분하면 델타 곱하기 z를 w로 미분한 식이 다음과 같고 w로 미분한 과정까지 생각을 하게 되면 결국 델타 곱하기 x로 결괏값이 도출됩니다. 전치는 행렬의 모양을 왼쪽 그림과 같이 matrix로 만들기 위해 수행한 과정이라고 저는 이해를 했습니다. 다음에서 구체적으로 설명드리겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/20d24a47-e55f-42c8-8f40-f98e9cdd7433/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>델타를 열벡터로 만들고 x를 행벡터로 만들어 계산을 하게 되면, nx1 1xm으로 계산이 되므로 외적이 되게 됩니다. 그래서 nxm matrix로 나오게 되며 가중치를 업데이트할 수 있는 행렬이 되게 됩니다. 이렇게 Neural net이 NLP에서 어떻게 이용되는지 그리고 역전파를 들어가기 전, 기본적인 계산에 대한 내용을 끝으로 3강을 마치겠습니다. 감사합니다.</p>
<hr>
<h3 id="참고자료">참고자료</h3>
<ul>
<li><a href="https://gnoej671.tistory.com/4?category=1034944">https://gnoej671.tistory.com/4?category=1034944</a></li>
<li><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></li>
<li><a href="https://happyzipsa.tistory.com/4">https://happyzipsa.tistory.com/4</a></li>
<li><a href="http://hleecaster.com/ml-svm-concept/">http://hleecaster.com/ml-svm-concept/</a></li>
<li><a href="https://www.youtube.com/watch?v=8CWyBNX6eDo&amp;list=PLoROMvodv4rOhcuXMZkNm7j3fVwBBY42z&amp;index=3">https://www.youtube.com/watch?v=8CWyBNX6eDo&amp;list=PLoROMvodv4rOhcuXMZkNm7j3fVwBBY42z&amp;index=3</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS224n] Lecture 2 - Word Vectors and Word Senses ]]></title>
            <link>https://velog.io/@tobigs-text1314/CS224n-Lecture-2-Word-Vectors-and-Word-Senses</link>
            <guid>https://velog.io/@tobigs-text1314/CS224n-Lecture-2-Word-Vectors-and-Word-Senses</guid>
            <pubDate>Sun, 20 Dec 2020 06:51:16 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 투빅스 14기 <a href="https://github.com/hyerin0113">이혜린</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Word2vec</li>
<li>Co-occurrence matrix</li>
<li>GloVe</li>
<li>Evaluation</li>
</ol>
<hr>
<h3 id="1-word2vec">1. Word2Vec</h3>
<p>텍스트 모델의 핵심은 텍스트를 컴퓨터가 인식할 수 있도록 <strong>숫자 형태의 벡터 또는 행렬로 변환</strong>하는 것입니다. 이 과정은 대표적으로 두 가지 방식으로 이루어집니다.</p>
<ul>
<li>One Hot Encoding (Sparse representation)</li>
<li>Word Embedding (Dense representation)</li>
</ul>
<p>One Hot Encoding은 단어 벡터가 0 또는 1의 값으로 구성되어 과정이 단순하다는 장점이 있지만, 텍스트 분석에서 중요한 부분 중 하나인 단어 간의 유사성을 반영하지 못한다는 단점이 존재했습니다. 
이를 보완하는 방법으로 Word Embedding이 등장하게 되었고, 현대의 대부분의 자연어 처리 기법들은 (ex. Word2vec, GloVe, FastText…) Word Embedding 방식을 기반으로 발전하였습니다. </p>
<p>본 강의에서는 앞 강의에서 다뤘던 단어 임베딩 방식을 기반으로 한 자연어 처리 기법인 <strong>Word2vec</strong>을 간단하게 리뷰한 후, 강의를 이어나갈 예정입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/0a9e9752-4c09-459c-a9f1-093f49de078c/image.png" alt=""></p>
<p>위 그림은 Word2vec의 전체적인 과정을 잘 보여주는 그림입니다. 주요 feature로는 중심 단어(center word), 맥락 단어(context word), 그리고 윈도우(window)가 있습니다. 의미적으로 유사성을 가진 단어들은 서로 가까운 위치에 존재한다는 아이디어를 이용하여, 중심 단어를 기준으로 양쪽으로 윈도우 크기만큼의 단어를 맥락 단어로 설정합니다. 그리고 원-핫 인코딩을 이용해 중심 단어 벡터와 맥락 단어 벡터를 생성한 후, 이를 입력 벡터와 출력 벡터로 사용합니다. 맥락 벡터는 기본적으로 윈도우 개수의 2배만큼 생성됩니다. 
이 때 <strong>맥락 벡터가 입력, 중심 벡터가 출력</strong>인 경우를 <strong>CBOW</strong> 방식, 그리고 <strong>중심 벡터가 입력, 맥락 벡터가 출력</strong>인 경우를 <strong>Skip-gram</strong> 방식이라고 합니다. </p>
<h4 id="1-cbow-continuous-bag-of-words">1) CBOW (Continuous Bag of Words)</h4>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/4841591e-3623-4c0d-8f70-7fbaba348807/image.png" alt=""></p>
<p>CBOW 방식은 입력 벡터가 맥락 벡터, 출력 벡터가 중심 벡터입니다. 여기서 입력 벡터는 맥락 벡터이기 때문에 입력 벡터의 수도 윈도우 크기의 2배입니다. 
맥락 벡터와 hidden layer 사이에 있는 가중치 $U$와 입력 벡터인 맥락 벡터를 곱하면 여러 개의 결과 벡터가 생성되게 되는데, hidden layer에선 이 결과들을 요소별로 평균 내어 hidden layer의 값으로 사용합니다.
또한 중심 벡터 사이에 있는 가중치 $V$와 hidden layer의 벡터를 곱하여 만든 output layer의 벡터에 softmax함수를 적용하여 이 값을 확률 값으로 만든 후, 중심 벡터와 비교하여 모델의 Loss를 계산합니다. Loss를 최소화하는 모델을 구하기 위해 Gradient Descent를 이용하여 가중치를 계속적으로 업데이트 합니다.</p>
<h4 id="2-skip-gram">2) Skip-gram</h4>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/63c79b56-9eac-4fdb-89d6-b7b7456a1eaa/image.png" alt=""></p>
<p>Skip-gram 방식은 입력 벡터가 맥락 벡터, 출력 벡터가 중심 벡터입니다. 여기서 출력 벡터는 맥락 벡터이기 때문에 출력 벡터의 수도 윈도우 크기의 2배입니다. 본 게시물에서는 Word2vec Skip-gram을 기반으로 설명을 이어나가도록 하겠습니다. </p>
<h4 id="3-word2vec의-효율성을-높이는-법">3) Word2vec의 효율성을 높이는 법</h4>
<ul>
<li><strong>Stochastic Gradient Descent</strong></li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/f8e1399c-44f4-473e-bebd-b0ddf9106fad/image.png" alt=""></p>
<p>앞서 Loss를 최소화하는 Parameter($W$, $V$)를 찾기 위해 Gradient Descent를 사용한다고 말씀드렸습니다. 허나 Gradient Descent는 전체 데이터에 대해 계산이 이루어지기 때문에 계산량이 너무 많다는 단점이 있습니다. 그래서 많은 사람들은 대신 <strong>Stochastic Gradient Descent</strong> (또는 mini-batch) 를 사용하기도 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c85f00dc-fdbc-4a60-9ae2-cc166a850a2b/image.png" alt=""></p>
<p>하지만 One-Hot Encoding, 혹은 Word2vec의 입·출력 벡터로 사용되는 0과 1으로 이루어진 Sparse한 vector는 이처럼 stochastic gradient descent를 사용했을 때 문제가 발생합니다. 0에 해당되는 위치에서는 계산이 이루어지더라도 계속해서 0이기 때문에 실제로 gradient가 update되지 않는데, 불필요하게 계산이 이루어지기 때문입니다. </p>
<ul>
<li><strong>Negative Sampling</strong></li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/3af69d7f-7dc7-4ade-a8b5-ee51787fbd0f/image.png" alt=""></p>
<p>Skip-gram을 예시로 Negative Sampling을 설명하도록 하겠습니다. 앞서 말씀드렸던 것처럼 word2vec을 사용할 때 sparsity로 인한 문제는 계속해서 발생합니다. Negative Sampling은 이를 해결하기 위해 실제로 등장한 (=값이 0이 아닌) 행에 대해서만 gradient 계산하고 sparse한 matrix를 add, subtract 함으로써 gradient를 update하는 방식을 채택합니다. 이는 기존의 다중분류를 이진분류로 근사시켜 모델을 효율적으로 만드는 데에 기여합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/f33800f4-ef9f-4fde-9dee-917b65e5a580/image.png" alt=""></p>
<p>다음은 negative sampling의 목적함수 입니다.</p>
<p>$c$ : 중심 벡터
$o$ : 맥락 벡터
$k$ : 노이즈 벡터 (랜덤하게 선택된 벡터. 실제 맥락벡터가 아님.)
$u$ : 중심 벡터와 hidden layer 사이의 가중치
$v$ : 맥락 벡터와 hidden layer 사이의 가중치</p>
<p>$u^{T}v$는 중심 벡터와 맥락 벡터간 코사인 유사도를 의미합니다. 이를 이용하여 위 목적함수를 해석해보면 True pair (중심 벡터, 맥락 벡터)의 경우 코사인 유사도가 클수록 확률이 높고, Noise pair (중심 벡터, 맥락 벡터)의 경우 코사인 유사도가 작을수록 확률이 높다고 해석할 수 있습니다. 
즉 True pair는 중심 벡터와 맥락 벡터가 가까이 있을수록(코사인 유사도가 클수록) 손실이 0에 가깝고, Noise pair는 중심 벡터와 노이즈 벡터가 멀리 있을수록(코사인 유사도가 작을수록) 손실이 0에 가까움을 의미합니다. 이는 이치에 맞는 해석이라고 판단할 수 있습니다.</p>
<ul>
<li><strong>Subsampling Frequent words</strong></li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/53a001c7-42a0-4a03-ba61-d3f12aa20514/image.png" alt=""></p>
<p>Subsampling frequent words는 등장빈도가 클수록 업데이트 될 기회가 많으므로, 말뭉치에서 자주 등장하는 단어는 학습량을 확률적으로 감소시키는 기법입니다. 여기서 $f(w_{i})$는 해당 단어 빈도 / 전체 단어 수 , 즉 단어가 corpus에 등장한 비율을 의미합니다.</p>
<h3 id="2-co-occurrence-matrix">2. Co-occurrence matrix</h3>
<p>Skip-gram은 중심 단어를 기준으로 맥락 단어가 등장할 확률을 계산합니다. 그러므로 윈도우 개수를 아무리 크게 늘려도, global co-occurrence statistics (ex. 전체 단어의 동반출현 빈도수)와 같은 통계 정보는 내포할 수 없습니다. 벡터의 값들은 중심 단어가 given일 때 각 값의 개별적인 등장 확률을 의미하기 때문입니다. 그래서 등장한 것이 count-based의 Co-occurrence matrix입니다.</p>
<h4 id="1-window-based-co-occurrence-matrix-단어-문맥-행렬">1) Window based co-occurrence matrix (단어-문맥 행렬)</h4>
<p>word2vec과 비슷한 방식입니다. 한 <strong>문장을 기준</strong>으로 윈도우에 각 단어가 몇 번 등장하는 지를 세어 구성합니다. Syntatic (POS; post (noun) post office (noun) other synonyms), semantic 정보를 얻을 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c70be717-65ab-4d38-9402-a03b03427edf/image.png" alt=""></p>
<h4 id="2-word-document-matrix-단어-문서-행렬">2) Word-Document matrix (단어-문서 행렬)</h4>
<p>한 <strong>문서를 기준</strong>으로 각 단어가 몇 번 등장하는 지를 세어 구성합니다. 문서에 있는 많은 단어들 중 빈번하게 등장하는 특정 단어가 존재한다는 것을 전제합니다. LSA (Latent Semantic Analysis; 잠재적 의미 분석)를 가능하게 하는 기법입니다. (ex. 문서 간 유사도 측정 등)</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/dba259e7-c105-4078-ad8a-5c3ef32d8189/image.png" alt=""></p>
<p>그러나 이와 같은 count-based matrix는 단어의 개수가 증가할수록 차원이 폭발적으로 증가합니다. 그래서 <strong>SVD</strong> 또는 <strong>LSA</strong> 등을 이용하여 차원을 축소시킨 후 사용합니다. 이는 대부분의 정보를 작은 차원의 행렬안에 포함시킬 수 있는 결과를 낳습니다.</p>
<h4 id="3-svd-singular-value-decomposition-특이값-분해">3) SVD (Singular Value Decomposition; 특이값 분해)</h4>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/35a3d198-556e-436e-b888-7cd807e9f5ad/image.png" alt=""></p>
<p>특이값 분해는 다음과 같이 행렬을 분해합니다. 고유값 분해와 비슷해보이지만 다른 점은 특이값 분해는 분해할 행렬이 정방 행렬이 아니여도 분해 가능하다는 점에서 차이점을 가집니다.</p>
<p>특이값 분해를 실제 데이터에 적용해봄으로써 분해 후 정보를 어떻게 활용할 수 있는지 확인해보겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/2392b4ca-a250-41b8-9c76-2f77880fee08/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/96fe0859-a510-4d4f-a339-639fedb91584/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/cc48a9a1-2e50-406f-84b0-d058df0edcd4/image.png" alt=""></p>
<p>특이값 분해를 적용한 후, $UU^{T}$에서 상위 2개의 열벡터만을 선택하여 새로운 $U^{&#39;}U^{&#39;T}$를 만들어내고 본 데이터인 $A$를 $A^{&#39;}$를 만들어낸 것을 truncated SVD라고 합니다. 이 결과를 통해 문서(열)를 기준으로 한 새로운 벡터 $X_{1}^{&#39;}$와 단어(행)을 기준으로 한 새로운 벡터 $X_{2}^{&#39;}$를 생성할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/7d3af97d-f78a-4d89-987f-718837c8d4c5/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/1afae2ff-40a8-45b2-9fa3-1bfd78f31561/image.png" alt=""></p>
<p>이렇게 동시등장행렬(co-occurrence matrix)를 단어 또는 문서를 기준으로 차원을 축소한 후 각 기준별로 잠재적인 의미를 분석하는 방법을 LSA라고 합니다. 이렇게 동시등장행렬을 SVD, LSA 등의 기법을 통해 차원축소 한 후 분석하는 방법을 실제 데이터를 이용하여 확인해볼 수 있었습니다.</p>
<h3 id="3-glove-global-vectors-for-word-representation">3. GloVe (Global Vectors for Word Representation)</h3>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/7b3f9410-210c-4a83-92e1-6eed501d780a/image.png" alt=""></p>
<p>지금까지 Count-based 기법과 Direct prediction 기법에 해당되는 여러가지 방법들을 살펴보았습니다. 각 방법은 뚜렷한 장단점이 존재하였고, 각 기법들의 장점만을 갖춘 새로운 방법이 등장하였는데 이것이 바로 <strong>GloVe</strong>입니다.</p>
<p>Glove의 기본 아이디어는 다음과 같습니다.</p>
<ul>
<li>임베딩된 단어벡터 간 <strong>유사도</strong> 측정을 수월하게 하면서 (word2vec의 장점)</li>
<li>말뭉치 전체의 <strong>통계 정보</strong>를 반영하자! (co-occurrence matrix의 장점!)</li>
</ul>
<p>또한 GloVe의 목적함수를 도출하기 위한 주요 인사이트는 다음과 같습니다.</p>
<ul>
<li>임베딩된 <strong>두 단어벡터의 내적</strong>이 말뭉치 전체에서의 <strong>동시 등장확률 로그값</strong>이 되도록 목적함수를 정의</li>
</ul>
<p>$X_{ik}$; 전체 말뭉치 중 사용자가 정한 window 내에, $i$번째 단어와 $k$번째 단어가 동시에 등장하는 횟수
$𝑋<em>{𝑖}$  =  $∑_k𝑋</em>{𝑖k}$    ; 전체 말뭉치 중 사용자가 정한 window 내에, i번째 단어가 등장하는 횟수
$𝑃<em>{𝑖𝑘}$  = 𝑃(𝑘│𝑖)  =  $𝑋</em>{𝑖𝑘}/𝑋_{𝑖}$    ; $i$번째 단어 (context word) 주변에 $k$번째 단어가 등장할 조건부 확률</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/140b20f8-c7f9-4e86-a48b-5bb3d7dd972e/image.png" alt=""></p>
<p>위처럼 계산한 동시 발생 확률들을 가지고 목적함수를 도출해보도록 하겠습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/2f6c8ad2-ea14-4a74-ada8-ba1005b91d18/ff.jpg" alt=""></p>
<p>동시 발생 확률의 비를 $F$라는 함수의 결과값이라고 생각하면 다음과 같이 표현할 수 있습니다. 이 때 input은 단어 벡터 3개로 구성되어 있지만, 두 단어벡터의 내적이 input으로 들어가야 하므로 다음과 같이 식을 정의합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/b67b2e5a-2e10-4247-8d28-4439cc10726d/3.jpg" alt=""></p>
<p>이처럼 동시 발생 확률의 비를 두 맥락 단어벡터의 차와 중심 벡터의 내적값으로 변환하여 단어 벡터 스페이스 내에 선형으로 표현하게 되었습니다. 즉 우리가 첫번째로 해내야했던 조건인 <strong>&quot;input은 두 단어벡터의 내적&quot;</strong>을 만족하게 된 것입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/3fbe7233-1326-4aa8-821c-c017ad6b70a8/4.jpg" alt=""></p>
<p>동시 발생 확률을 $F$함수에 대한 식으로 다시 정의했을 때 함수 $F$의 조건식을 도출할 수 있고, 이 조건에 맞는 함수 $F$는 $exp$ 지수함수임을 알 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/d1379882-5f4a-4283-ae88-6e8d1d332efe/5.jpg" alt=""></p>
<p>위 식의 좌변을 두 단어벡터의 내적값으로 두면 우변은 $logX_{ik} - logX_{i}$가 됩니다. 그리고 처음 input값이었던 co-occurrence matrix가 준동형($A = A^{T}$)형을 만족하기 때문에 함수 F의 결과 또한 준동형을 만족해야 하는데, 실제 값을 계산해보면 그렇지 않으므로 이를 보정하기 위해 상수항 $b$ 을 더해줍니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/82c667ae-085e-4568-9c3b-ac2e897bb2f9/6.jpg" alt=""></p>
<p>그 결과 $w_{i}^{T}w_{k} + b_{i} + b_{k} = logX_{ik}$ 라는 식을 도출할 수 있고 이 때 좌변은 unknown parameter로 이루어진 추정값, 그리고 우변은 실제값이라고 할 수 있습니다. 즉 좌변과 우변의 차이에 제곱을 취한 값이 바로 GloVe의 손실함수입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/97822586-c995-45bb-adc6-3f5aee835597/7.jpg" alt=""></p>
<p>또한 특정 단어가 지나치게 빈도수가 높아 $X_{ij}$가 튀는 현상을 방지하기 위해 $f(X_{ij})$ 함수를 손실에 곱함으로써 최종적으로 손실 함수를 완성시켰습니다.</p>
<p>GloVe는 속도가 빠르며, 말뭉치 크기가 성능에 미치는 영향을 제한할 수 있으며, 그렇기 때문에 작은 말뭉치나 작은 벡터에서도 좋은 성능을 가진다는 장점이 있습니다.</p>
<h4 id="results">Results</h4>
<p>GloVe 모델을 여러 데이터에 적용한 결과를 보여드리도록 하겠습니다.</p>
<ul>
<li>Frog
<img src="https://images.velog.io/images/tobigs-text1314/post/37aaa4d7-549b-434e-af41-8ff5ccc1834e/image.png" alt=""></li>
</ul>
<p>이처럼 frog와 형태적으로 또는 의미적으로 비슷한 단어를 잘 선택합니다.</p>
<ul>
<li>opposite
<img src="https://images.velog.io/images/tobigs-text1314/post/7a14d4e7-c090-4dc2-af5c-1f26b2de910f/image.png" alt=""></li>
</ul>
<p>반의어 관계에 있는 여러 단어쌍들이 비슷한 간격으로 2차원의 공간 내에 위치하고 있음을 볼 수 있습니다. (brother와 sister간 거리, 그리고 uncle과 aunt간 거리가 비슷합니다.)</p>
<ul>
<li>company - CEO</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/b1a7d341-b24f-4710-b3ac-3fb04ec64829/image.png" alt=""></p>
<p>company 집단에 속하는 단어는 좌측에, CEO 집단에 속하는 단어는 우측에 몰려있음을 볼 수 있습니다. 또한 company단어와 CEO단어의 거리는 각 쌍마다 비슷합니다.</p>
<ul>
<li>superlatives
<img src="https://images.velog.io/images/tobigs-text1314/post/61462d1f-1192-4bec-af68-c5f8f09f8770/image.png" alt=""></li>
</ul>
<p>단어의 원형 - 비교급 - 최상급을 2차원 공간에 표현한 후 선을 그어 이었을 때의 형태는 유사합니다.</p>
<h4 id="-fasttext-elmo">+ FastText, ELMo</h4>
<p>추가적으로 Word2vec, GloVe 외의 단어 임베딩 모델을 소개해드리도록 하겠습니다.</p>
<p>1) FastText (2016)</p>
<ul>
<li>word2vec과 유사합니다. But 그러나 단어를 부분 단어(subword)로 표현한다는 차이가 존재합니다.</li>
<li>word2vec은 단어를 쪼갤 수 없는 것으로 생각하지만, FastText는 하나의 단어도 부분 단어로 쪼갤 수 있다고 생각합니다.</li>
<li>학습하지 않은 단어에 대해서 유사한 단어를 찾아낼 수 있습니다.</li>
</ul>
<p>2) ELMo (2018)</p>
<ul>
<li>단어의 의미는 전에 오는지, 후에 오는지에 따라서도 변화한다는 특성을 반영한 모델입니다.</li>
<li>전체 문장을 한 번 훑고, 문장 전체를 고려한 word embedding을 진행
같은 단어라도 문맥에 따라 뜻이 달라지는 동적인 모델입니다.</li>
<li>다의어로 인한 어려움을 해결할 수 있습니다.</li>
</ul>
<h3 id="4-word-embedding-evaluation">4. Word embedding Evaluation</h3>
<p>단어 임베딩 모델에 대한 설명은 끝났습니다. 이제는 이런 단어 임베딩 모델들을 어떤 방식으로 평가할 수 있는지 설명하려 합니다.
우선 내적 평가와 외적 평가의 정의와 내용은 다음과 같습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/426e7ad1-27da-4c9f-9c51-43a45600fc54/image.png" alt=""></p>
<h4 id="1-extrinsic-evaluation">1) Extrinsic Evaluation</h4>
<p>실제 현실 문제 (real task)에 직접 적용하여 성능을 평가하는 방식입니다. Glove는 외적 평가에서 좋은 성능을 보입니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/a1eb2848-1d7c-456b-83b5-9f46770e34e8/image.png" alt=""></p>
<h4 id="2-intrinsic-evaluation--word-analogy">2) Intrinsic Evaluation : word analogy</h4>
<p>analogy는 유사를 의미합니다. 즉 a:b :: c:? 에서 ?에 들어갈 단어를 유추하는 문제입니다. ex. man:woman :: king:?
<img src="https://images.velog.io/images/tobigs-text1314/post/325dafb0-f2c3-4fe1-88d9-e362595ec159/image.png" alt=""></p>
<p>식으로 표현하면 다음식을 만족하는 d를 찾는 문제라고 얘기할 수 있습니다.
내적 평가의 예는 다음과 같습니다.</p>
<ul>
<li>Semantic examples : city-state
<img src="https://images.velog.io/images/tobigs-text1314/post/c1169580-a93b-4cdb-8bc1-e940554b3a3a/image.png" alt=""></li>
</ul>
<p>하나의 도시가 여러 개의 이름을 갖는 경우 적절히 임베딩하기 어렵습니다. (semantic은 단어의 의미적인 부분을 의미합니다.)</p>
<ul>
<li>Syntactic examples : gram4-supelative
<img src="https://images.velog.io/images/tobigs-text1314/post/1a2512f7-7b15-44c5-baeb-da505c9523da/image.png" alt=""></li>
</ul>
<p>syntatic은 단어의 순서적인 부분을 의미합니다.</p>
<ul>
<li>several models
<img src="https://images.velog.io/images/tobigs-text1314/post/dc139a26-497f-4f98-abe8-37fd07ce25e3/image.png" alt=""></li>
</ul>
<p>Dimension, corpus size 등을 다르게 하면서 여러 임베딩 모델에 대해서 analogy 분석을 진행해본 결과, GloVe는 좋은 성능을 보였습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/a2f16b2b-7c62-4812-8dbd-9845fa9c1ce7/image.png" alt=""></p>
<p>a. symmetric : window가 양방향 ; asymmetric : window가 중심단어 기준 왼쪽
b. window size가 10개일 때, dimension은 300으로 두는 게 accuracy가 best입니다.
c. 맥락 단어를 중심 단어기준 양방향에서 찾았을 때 성능이 더 좋습니다. (왼쪽에서만 찾으면 성능이 좋지 않습니다.)
d. (b) (c) : dimension이 100일 때, window size는 8개가 best입니다.</p>
<ul>
<li>over-parametrization
<img src="https://images.velog.io/images/tobigs-text1314/post/4c278ab7-3202-4d1b-9448-34bf267c695b/image.png" alt=""></li>
</ul>
<p>GloVe는 dimension이 크게 증가해도 모델 성능이 크게 떨어지지 않는다는 장점이 존재했습니다.</p>
<ul>
<li>bias-variance trade-off in dimensionality
<img src="https://images.velog.io/images/tobigs-text1314/post/d16c32e6-ba19-4efc-b505-dbdb51001e4c/image.png" alt=""></li>
</ul>
<p>a. PIP Loss : 단어 임베딩 사이의 dissimilarity를 나타내는 지표
b. p% sub-optimal interval : dimension이 k이고, k가 interval 안에 존재하면, k차원 임베딩의 PIP loss는 최적 임베딩에 비해 p% 커지는 것을 의미합니다.</p>
<ul>
<li>Training Time
<img src="https://images.velog.io/images/tobigs-text1314/post/78ff3b6c-69ff-4f38-8a37-dddab8b4d35a/image.png" alt=""></li>
</ul>
<p>훈련을 오래시킬수록 성능이 향상했습니다.</p>
<ul>
<li>Informations in Text
<img src="https://images.velog.io/images/tobigs-text1314/post/bb11a84b-3ed1-47cb-8e43-fb88b913ca3c/image.png" alt=""></li>
</ul>
<p>a. Gigawords는 article, Wiki는 일종의 dictionary입니다.
b. 텍스트 내에 정보가 많은 Wiki data를 활용했을 때 성능이 좋음</p>
<h4 id="3-intrinsic-evaluation--correlation">3) Intrinsic Evaluation : Correlation</h4>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/9f272722-c44f-4ce7-bdc3-2f313e424153/image.png" alt=""></p>
<p>일련의 단어 쌍을 미리 구성한 후에 사람이 평가한 점수와, 단어 벡터 간 코사인 유사도 사이의 상관관계를 계산해 단어 임베딩의 품질을 평가하는 방식입니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/23462663-7e42-42c2-8363-310273c1b0da/image.png" alt=""></p>
<p>이 때 GloVe는 좋은 성능을 가집니다.</p>
<h4 id="4-word-senses-and-word-sense-ambiguity">4) Word senses and word sense ambiguity</h4>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/fc2b0ff9-d781-47ab-8fc7-ea696a9fc13b/image.png" alt=""></p>
<p>다의어를 해결하는 방법은 다음과 같습니다.</p>
<p>Sol1. Improving Word Representations Via Global Context And Multiple Word Prototypes (Huang et al. 2012)
Sol2. Linear Algebraic Structure of Word Senses, with Applications to Polysemy (Arora, …, Ma, …, TACL 2018)</p>
<p><strong>- Sol1. Improving Word Representations Via Global Context And Multiple Word Prototypes (Huang et al. 2012)</strong>
<img src="https://images.velog.io/images/tobigs-text1314/post/2ea5f6c3-8440-4efd-a245-6ffd362f6c2a/image.png" alt=""></p>
<p>특정 단어의 윈도우들을 클러스터링 (ex. bank1, bank2, bank3 …) 한 후, 단어들을 bank1, bank2, bank3 를 중심으로 다시 임베딩합니다.</p>
<p><strong>- Sol2. Linear Algebraic Structure of Word Senses, with Applications to Polysemy (Arora, …, Ma, …, TACL 2018)</strong>
<img src="https://images.velog.io/images/tobigs-text1314/post/0f3f1dae-5bf0-477d-ad82-48ba889c30d5/image.png" alt=""></p>
<p>각 의미에 가중치를 부여하고 선형결합을 통해 새로운 단어 벡터를 생성합니다. 이 단어벡터를 가지고 유사 단어들 끼리 clstering 했을 때 상당히 결과가 좋았습니다. 즉 내적인 의미까지 잘 파악해서 분류했음을 의미합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS224n] Lecture 1 - Introduction and Word Vector]]></title>
            <link>https://velog.io/@tobigs-text1314/CS224n-Lecture-1-Introduction-and-Word-Vector</link>
            <guid>https://velog.io/@tobigs-text1314/CS224n-Lecture-1-Introduction-and-Word-Vector</guid>
            <pubDate>Sun, 20 Dec 2020 06:49:15 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 투빅스 13기 <a href="https://github.com/hyewon2116">조혜원</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>How to represent Words&#39; Meaning </li>
<li>Word2Vec</li>
<li>Derivations of Gradient</li>
</ol>
<hr>
<h1 id="how-to-represent-words-meaning">How to represent Words&#39; Meaning</h1>
<h2 id="1-wordnet">1. WordNet</h2>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/e1d4eed0-e496-4743-a55e-64e027574576/image.png" alt=""></p>
<p>1) WordNet은 동의어, 상하관계 언어의 집합입니다.
2) 단어 의미 간의 유사도와 관계를 얻기 어렵습니다.
3) 주관적인 판단 기준, 뉘앙스를 파악하기 어렵습니다.
4) 신조어 생성, 관리에 지속적 인력 투입이 필요합니다.</p>
<h2 id="2-one-hot-vector">2. One-Hot Vector</h2>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/89a07455-74ce-4503-a442-fec0e83f18a9/image.png" alt=""></p>
<p>1) 단어의 개수가 곧 Vector의 차원으로, Vector의 차원이 아주 많이 필요합니다.
2) 이 역시 단어 간의 관계를 파악하려면 차원이 제곱이 되며 어려워집니다</p>
<h2 id="3-distributional-semantics">3. Distributional Semantics</h2>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/1232e0ce-77a1-4a61-b96e-c712347cdc19/image.png" alt=""></p>
<p>1) 위 두가지의 문제점을 해결한 것으로, 단어의 문맥을 고려한 방법입니다.
2) fixed size window를 통해 단어를 표현할 때 주위(context)를 살펴, 비슷한 문맥에서 나타나는 비슷한 단어들끼리 유사한 벡터를 가집니다.
3) Word Embeddings, Word Representations 라고도 불립니다. </p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/189da622-1e10-4611-be57-4c743689e22c/image.png" alt=""></p>
<p>4) Vector space: 각 vector들의 배치를 2D 공간에 투영한 것. 정확히 투영되지는 않지만 유사한 단어가 유사한 위치에 있음을 확인할 수 있습니다. </p>
<h1 id="word2vec">Word2Vec</h1>
<ol>
<li>개념</li>
</ol>
<p>1) Word Vector을 학습에 쓰이는 프레임워크입니다. 
2) 충분한 양의 corpus를 바탕으로, Random Vector에서부터 시작하여 각 단어를 잘 표현하는 Vector 값을 찾습니다. 
3) 단어 벡터간의 유사도를 이용해 맥락에서 특정 단어가 나타날 확률을 계산합니다. </p>
<ol start="2">
<li>과정</li>
</ol>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/ac99757f-3e52-4af5-a5cc-526048421191/image.png" alt=""></p>
<p>1) 현재 위치 t에 있는 단어를 $$W_t$$, 주변에 있는 단어를 $$W_t+n$$, $$W_t-n$$ 이라고 할 때 $$P(W_t+n|W_t)$$, $$P(W_t-n|W_t)$$ 를 구합니다.
2) $$P(W_t+n|W_t)$$, $$P(W_t-n|W_t)$$를 최대화하는 vector를 찾습니다.
3) corpus 안의 모든 단어에 대해 1~2를 거칩니다.</p>
<ol start="3">
<li>계산법</li>
</ol>
<p>1) <strong>L(𝜽)</strong>, Likelihood</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/f2c90f4e-097d-4d76-94ef-5d448d98a618/image.png" alt=""></p>
<p>word vector 𝜽(parameter)가 주어졌을 때, window 내의 context word가 해당 위치에 나타날 확률의 곱입니다.</p>
<p>2) <strong>J(𝜽)</strong>, Objective function</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/7e9752b2-3271-4155-8116-0bb33ebceb7e/image.png" alt=""></p>
<p>negative log likelihood 를 거쳐 objective function을 만든 후, 이를 최소화 하는 𝜽(parameter)를 구합니다. 이처럼 objective function을 최소화 하는 과정을 통해 predictive accuracy를 최대화할 수 있습니다.  </p>
<p>3) <strong>P(o|c)</strong></p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/ff926370-b294-44d4-bdc8-a0d63041d713/Objective_function.jpg" alt=""><img src="https://images.velog.io/images/tobigs-text1314/post/083ef83b-b6f8-4b6a-a9c0-8f9b13613f5b/image.png" alt=""></p>
<p>word마다 두개의 vector를 학습하는데 이때 $$V_x$$는 x가 center word인 것을 $$u_x$$는 x가 context word인 것을 의미합니다. 내적을 통해 유사도를 측정하며, 이후 Softmax 과정을 거쳐 P(o|c)를 구합니다. </p>
<ol start="4">
<li>Optimization</li>
</ol>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/4548e55c-6a45-4df9-90dd-4089063650ad/image.png" alt=""></p>
<p>Optimization을 통해 목적함수를 최소화 하는 파라미터 𝜽, 즉 u와 v (word를 나타내는 두 vector)를 찾습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/00279469-2251-4f9b-9151-c0a5f021f673/image.png" alt=""></p>
<p>V개의 단어가 존재하고 𝜽가 d-dimension vector일 때, word vector는 u, v를 포함하므로 2dV 차원을 갖습니다.</p>
<ol start="5">
<li>종류</li>
</ol>
<p>1) Skip Gram: center word로 context word를 예측합니다.
2) CBOW: context word로 center word를 예측합니다.</p>
<h1 id="derivations-of-gradient">Derivations of Gradient</h1>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/9e828728-3886-4e66-aa7c-0b075676fac8/image.png" alt=""></p>
<p>목적함수의 최소값을 구하기 위해</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/9ec09dc0-6bf1-4ed8-b61d-ec0a4f0ea0a2/image.png" alt=""></p>
<p>이 식을 center word, context word로 각각 미분합니다.
아래는 미분 과정입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/81822e74-bedd-4494-aa19-841ac4be5093/Derivation1.jpg" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/dd79801f-68d4-4e07-baa3-25514097a376/Derivation2.jpg" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/c46c48c4-3ee4-400f-8435-5634cacb23e8/Derivation3.jpg" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/b286a9c9-83cd-4408-a095-8728bb4ed550/Derivation4.jpg" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs-text1314/post/347cab1a-87f1-46f9-8d26-3ef59518a7f8/Derivation5.jpg" alt=""></p>
<p>이처럼 목적함수를 편미분한 것은 실제 단어와 예측한 단어와의 차이와 같습니다. 따라서 gradient descent를 통해 실제에 더 가깝게 예측할 수 있음을 알 수 있습니다.</p>
<p>자료 출처: CS224n 2019 - lecture01(wordvec1) 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>