<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>No regret Just Lesson</title>
    <link>https://ahnjg.tistory.com/</link>
    <description>어떤 이가 열등감 때문에 우물쭈물하고 있는 동안, 다른 이는 실수를 저지르며 점점 우등한 사람이 되어간다.  -Henry C. Link-</description>
    <language>ko</language>
    <pubDate>Fri, 3 Jul 2026 09:40:48 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>JG Ahn</managingEditor>
    <image>
      <title>No regret Just Lesson</title>
      <url>https://tistory1.daumcdn.net/tistory/3388399/attach/a6cb0865034b4d69b606faf136f29ac8</url>
      <link>https://ahnjg.tistory.com</link>
    </image>
    <item>
      <title>머신러닝 용어 정리</title>
      <link>https://ahnjg.tistory.com/89</link>
      <description>&lt;h1&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;NLP(Natural Language Processing, 자연어 처리)&lt;/b&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;h2&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;MODEL&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;RNN&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;순서가 있는 데이터를 처리하는데 강점을 가진 신경망이다.&lt;/li&gt;
&lt;li&gt;앞이나 뒤의 정보에 따라 전체의 의미가 달라지거나, 앞의 정보로 다음에 나올 정보를 추측하려는 경우 사용한다&lt;/li&gt;
&lt;li&gt;번역, 단어 자동완성 등에 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;LSTM&lt;/h3&gt;
&lt;h3&gt;GRU&lt;/h3&gt;
&lt;h3&gt;Seq2Seq&lt;/h3&gt;
&lt;h3&gt;Attention&lt;/h3&gt;
&lt;h3&gt;Transformer&lt;/h3&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h1&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Foundation&lt;/b&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;h2&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Norm&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Norm은 벡터의 길이 혹은 크기를 측정하는 방법(함수)이다&lt;/li&gt;
&lt;li&gt;Norm이 측정한 벡터의 크기는 원점에서 벡터 좌표까지의 거리, 혹은 Magnitude라고 한다.&lt;/li&gt;
&lt;li&gt;$$L_p = (\sum_{i}^{n}\left | x_i \right |^p)^\frac{1}{p}$$&lt;/li&gt;
&lt;li&gt;p는 Norm의 차수를 의미한다. p가 1이면 L1 Norm, p가 2이면 L2 Norm이다.&lt;/li&gt;
&lt;li&gt;n은 대상 벡터의 element 개수이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;L1 Norm&lt;/h3&gt;
&lt;p&gt;$$L_1 = (\sum_{i}^{n}\left | x_i \right |) = \left | x_1 \right | + \left | x_2 \right | + \left | x_3 \right | + ... + \left | x_n \right |$$&lt;/p&gt;
&lt;p&gt;$$x = [1, 2, 3, 4, 5] \\ \left \| x \right \|_1 = (\left | 1 \right | + \left | 2 \right | + \left | 3 \right | + \left | 4 \right | + \left | 5 \right |) = 15$$&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;L1 Norm은 &lt;b&gt;각 요소 절댓값 크기의 합이다. &lt;span style=&quot;color: #333333;&quot;&gt;요소의 값 변화를 정확하게 파악할 수 있다&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Taxicab Norm혹은 맨허튼 노름(Manhattan norm)이라고도 한다.&lt;/li&gt;
&lt;li&gt;L1 Norm은 L1 Regularization, Computer Vision과 같은 영역에서 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;L2 Norm&lt;/h3&gt;
&lt;p&gt;$$L_2 = \sqrt{\sum_{i}^{n}x_i^2} = \sqrt{x_1^2 + x_2^2 + ... + x_n^2}$$&lt;/p&gt;
&lt;p&gt;$$L_2 = \sqrt{\sum_{i}^{n}x_i^2} = \sqrt{x\cdot x}=\sqrt{x^T x} = \sqrt{x_1*x_1 + x_2*x_2 + ... + x_n*x_n}$$&lt;/p&gt;
&lt;p&gt;$$x=[1,2,3,4,5]\\ \left \| x \right \|_2 = \sqrt{(\left | 1 \right |^2 + \left | 2 \right |^2 + \left | 3 \right |^2 + \left | 4 \right |^2 + \left | 5 \right |^2)} = \sqrt{1+4+9+16+25} = \sqrt{55} = 7.4161$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;L2 Norm은 해당 차원의 &lt;b&gt;좌표평면에서 원점부터 벡터 좌표까지의 최단거리이다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;n치원 좌표평면(유클리드 공간)에서의 벡터의 크기를 계산하기 때문에 유클리드 노름(Euclidean Norm)이라고도 한다.&lt;/li&gt;
&lt;li&gt;피타고라스 정리는 2차원 좌표 평면상의 최단 거리를 계산하는 L2 Norm 이다.&lt;/li&gt;
&lt;li&gt;L2 Norm은 L2 Regularization, KNN, Kmean 알고리즘 등에서 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Maximum Norm&lt;/h3&gt;
&lt;p&gt;$$L_\infty = max(\left | x_1 \right |, \left | x_2 \right |, ..., \left | x_n \right |)$$&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;벡터 성분의 최댓값을 구한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;Train&lt;/h1&gt;
&lt;h3&gt;Batch Size&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한번에 계산(학습)되는 데이터의 개수이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Mini Batch&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체 데이터 셋을 batch size 크기로 쪼개어 학습한다. (전체 데이터 셋을 한번에 다 계산하면 너무 크기때문, 메모리 부족..)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Epoch&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체 데이터 셋을 한번 학습하는 것이다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Data&lt;/h1&gt;
&lt;h2&gt;데이터 불균형(Data Imbalanced)&lt;/h2&gt;
&lt;p&gt;클래스간 데이터가 불균형 할 때 UnderSampling 또는 OverSampling을 통해 문제를 해결한다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hwiyong.tistory.com/266&quot;&gt;https://hwiyong.tistory.com/266&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Over Fitting&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델이 너무 학습 데이터에 맞게 학습되어 처음 보는 데이터는 제대로 예측하지 못하는 현상이다&lt;/li&gt;
&lt;li&gt;train_loss는 줄어들지만 val_loss는 증가한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Term&lt;/h1&gt;
&lt;h3&gt;Ground Truth&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정답, 실제 관측 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Ref&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/machine-learning/glossary&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ML Glossary_Google&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://taewan.kim/post/norm/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;딥러닝을 위한 Norm, 노름&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Machine Learning/Basics</category>
      <author>JG Ahn</author>
      <guid isPermaLink="true">https://ahnjg.tistory.com/89</guid>
      <comments>https://ahnjg.tistory.com/89#entry89comment</comments>
      <pubDate>Sat, 18 Jul 2020 03:37:51 +0900</pubDate>
    </item>
    <item>
      <title>[Attention] Bahdanau Attention이란?</title>
      <link>https://ahnjg.tistory.com/96</link>
      <description>&lt;p&gt;본 게시글은 Hyungcheol Noh님의 &lt;a href=&quot;https://hcnoh.github.io/2018-12-11-bahdanau-attention&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Attention] Bahdanau Attention 개념 정리&lt;/a&gt; 글을 바탕으로 작성되었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Neural Machine Translation&lt;/h1&gt;
&lt;p&gt;기계 번역은 이전부터 확률적인 접근 방법을 통해서 수행이 되어왔다. 간단히 설명하면 소스 문장 \(x\)를 Conditioning하여 조건부 확률 \(P(y\mid x)\)를 최대화하는 타겟 문장 \(y\)를 찾는 것이다. 수식으로 정리하면 아래와 같다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;$$\hat{y} = \underset{y}{argmax} \: p(y\mid x)$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;최근 딥러닝을 이용한 연구가 활발히 진행되면서 뉴럴 네트워크를 통한 언어 번역을 시도해 보려는 NMT(Neural Machine Translation)에 관한 연구가 각광을 받게 되었다. NMT는 딥러닝 모델 \(f_\theta(x)\)를 확습시키기 위해서 Loss \(L\)을 다음과 같이 사용하게 된다&lt;/p&gt;
&lt;p&gt;$$L = -p(f_\theta(x)\mid x) $$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;즉, Loss를 이용하여 모델 파라미터 \(\theta\)를 다음과 같은 최적화를 통해서 학습을 시키면 된다.&lt;/p&gt;
&lt;p&gt;$$\hat{\theta} = \underset{\theta}{argmax}\: p(f_\theta(x)\mid x)$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;기존의 NMT연구는 RNN Encoder-Decoder를 이용하는 방식으로 많이 수행이 되었는데 이번에 소개하려는 논문에서는 이러한 RNN Encoder-Decoder 모델을 Attention Mechanism을 통해서 많은 개선을 이루어냈다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;논문에서 주장하는 개선 사항은 다음과 같다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;기존 RNN Encoder-Decoder는 소스 문장을 고정된 길이의 벡터로 인코딩&lt;/span&gt;을 하였지만 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;제안된 모델에서는 벡터들의 Sequence로 인코딩&lt;/span&gt;을 하여 소스 문장의 정보가 Sequence에 쫙 펼쳐지게 되고 이것을 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;디코더가 스스로 어떤 벡터에 중점을 둬서 정보를 취할지 선택&lt;/span&gt;할 수 있게 하였다. 이 과정이 &lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;Attention Mechanism&lt;/span&gt;&lt;/b&gt;이며 이것을 제안한 논문이 바로 이 논문이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Notation&lt;/h1&gt;
&lt;p&gt;포스팅에서 다음의 Notation을 사용할 것이다.&lt;/p&gt;
&lt;p&gt;$$X=(x_t)_{t=1}^{T_x} \in \mathbb{R}^{n\times T_x} : 소스\: 문장의\: 단어\: One-Hot\: 인코딩\: 시퀀스$$&lt;/p&gt;
&lt;p&gt;$$Y=(y_t)_{t=1}^{T_y} \in \mathbb{R}^{m\times T_y} : 타겟\: 문장의\: 단어\: One-Hot\: 인코딩\: 시퀀스$$&lt;/p&gt;
&lt;p&gt;$$T_x, T_y: 각각\: X, Y의\: 시퀀스\: 길이$$&lt;/p&gt;
&lt;p&gt;$$x_t, y_t: 각각 \:t 번째 \: 타임 \: 스텝 \: 단어의 \: One-Hot \: 인코딩$$&lt;/p&gt;
&lt;p&gt;$$\hat{Y}=(\hat{y}_t)_{t=1}^{T_y}:모델이\: 타겟\: 문장의\: 단어\: One-Hot\: 인코딩\: 시퀀스를\: 추정하기\: 위해서\: 사용하는\: 확률\: 모델\: \hat{y_t}의\: 시퀀스$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;RNN Encoder-Decoder&lt;/h1&gt;
&lt;p&gt;NMT의 가장 기본적인 접근은 RNN Encoder-Decoder 모델을 이용하는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;RNN Encoder-Decoder 모델&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RNN 셀을 이용하여 인코더 및 디코더를 구성&lt;/li&gt;
&lt;li&gt;인코더는 번역을 하고자 하는 소스 문장을 특정 임베딩 벡터로 인코딩&lt;/li&gt;
&lt;li&gt;디코더는 임베딩된 벡터를 타겟 언어로 번역을 하여 타겟 문장을 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Encoder-Decoder 모델은 기본적으로 다음의 역할을 수행&lt;/b&gt;하게 된다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;모델이 현재 타임 스텝의 디코더 아웃풋 단어 One-Hot 인코딩 \(y_t\)를 추정하기 위해&lt;/span&gt;서 인코더에 입력되는 소스 문장 \(X\)와 이전 타임 스텝 디코더 아웃풋 단어 One-Hot 인코딩들인 \({y_0, ..., y_{t-1}}\)이 Conditioning이 된 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;조건부 확률 모델 \(\hat{Y}=p(y_t\mid y_0,...,y_{t-1}, X)\)를 모델링&lt;/span&gt;해야 하며 이것은 아래와 같이 기본 RNN 연산을 이용하여 모델링 될 수 있다.&lt;/p&gt;
&lt;p&gt;$$\hat{y_t}=p(y_t\mid y_0,...,y_{t-1},X)=softmax(W_ys_t+b_y)$$&lt;/p&gt;
&lt;p&gt;$$s_t=tanh(W_{ys}y_{t-1}+W_{ss}s_{t-1}+b_s)$$&lt;/p&gt;
&lt;p&gt;$$where\: y_0=Enc(X)$$&lt;/p&gt;
&lt;p&gt;$$s_0=h_{T_x}$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;\(s_t\)는 \(t\)번째 타임 스텝의 디코더 RNN Hidden State Vector이며 \(y_0\)는 인코더가 최종적으로 생성한 문장 임베딩이다. 즉, 디코더 RNN은 입력으로 이전 타임 스텝의 인코더 출력을 받는 구조라고 할 수 있다. 위의 모델을 그림으로 그리면 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;02 (1).png&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GIEIn/btqFIM3tiYV/mpw6ekvFsXyEqjfmGvsPn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GIEIn/btqFIM3tiYV/mpw6ekvFsXyEqjfmGvsPn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GIEIn/btqFIM3tiYV/mpw6ekvFsXyEqjfmGvsPn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGIEIn%2FbtqFIM3tiYV%2Fmpw6ekvFsXyEqjfmGvsPn0%2Fimg.png&quot; data-filename=&quot;02 (1).png&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;디코더의 역할&lt;/b&gt;&lt;/span&gt;은 인코더가 생성한 소스 문장의 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;임베딩 벡터를 이용하여 타겟 언어의 문장으로 번역된 타겟 문장을 생성하는 것&lt;/span&gt;이다. 그렇다면 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;인코더의 역할&lt;/b&gt;&lt;/span&gt;은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;소스 문장을 적절한 임베딩 벡터로 변환하는 것&lt;/span&gt;이라고 할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;인코더&lt;/b&gt;&lt;/span&gt;도 마찬가지로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;RNN 구조&lt;/span&gt;를 가지고 있으며 기본적으로 문장 임베딩은 소스 문장의 마지막 입력인 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&amp;lt;EOS&amp;gt;(End of Sequence)가 입력된 마지막 출력 벡터를 &lt;b&gt;문장 임베딩 벡터로 사용&lt;/b&gt;&lt;/span&gt;하게 된다. 또한 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;마지막 타임 스텝의 인코더 RNN Hidden State Vector \(h_{T_x}\)는 디코더의 첫번째 타임 스텝의 Hidden State Vector \(s_0\)&lt;/span&gt;로 들어가게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;기존 Encoder-Decoder 모델의 단점: Attention Mechanism으로 극복&lt;/h1&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;기존 모델의 단점&lt;/span&gt;은 Bahdanau Attention 논문에서 주장하는 대로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;문장 임베딩을 고정된 길이로만 해야 한다&lt;/span&gt;는 점이다. 이 경우 짧은 문장에서는 큰 문제가 없을 수도 있지만 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;문장이 길어질수록 더 많은 정보를 고정된 길이로 더 많이 압축해야 하기 때문에 정보의 손실이 있다&lt;/span&gt;는 점이 가장 큰 문제라고 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;추가적으로 RNN 특유의 Long Term Dependency 문제가 발생할 수도 있겠지만 이건 인코더 RNN을 Bidirectional로 구성하면 해결할 수 있는 문제라 따로 언급하지 않겠다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;결과적으로 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;Attention 메커니즘을 통한 보완이 가능하다고 주장&lt;/span&gt;한다. Attention 메커니즘을 이용하면 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;인코더가 고정된 길이의 문장을 임베딩 할 필요가 없으며 소스 문장의 벡터의 시퀀스를 이용하여 디코더가 디코딩이 가능하게 된다&lt;/span&gt;. 따라서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;문장의 길이에 관계없이 Dynamic하게 정보를 인코딩이 가능&lt;/span&gt;하게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Attention 메커니즘을 이용하여 확률 모델 \(hat{y}\)를 기본 RNN 모델을 이용하여 모델링하면 아래와 같다.&lt;/p&gt;
&lt;p&gt;$$\hat{Y}=p(y_t\mid y_0,...,y_{t-1}, X)=softmax(W_ys_t+b_y)$$&lt;/p&gt;
&lt;p&gt;$$s_t=tanh(W_{ys}y_{t-1}+W_{ss}s_{t-1}+W_{cs}c_t+b_s)$$&lt;/p&gt;
&lt;p&gt;$$where\:y_0=&amp;lt;Go&amp;gt;Token$$&lt;/p&gt;
&lt;p&gt;$$s_0=0$$&lt;/p&gt;
&lt;p&gt;$$c_t=Attn(s_{t-1}, H)$$&lt;/p&gt;
&lt;p&gt;$$H=[h_1;,...;h_{T_x}]\in \mathbb{R}^{d\times T_x}$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;\(d\)는 인코더 RNN Hidden State Vector의 Dimension이다.&lt;/li&gt;
&lt;li&gt;달라진 점은 \(y_0\)와 \(s_0\), Context Vector \(c_t\)가 추가된 것들을 확인할 수 있다.&lt;/li&gt;
&lt;li&gt;\(y_0\)는 기존과 다르게 문장 임베딩을 사용하지 않고 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;문장의 시작점을 나타내는 새로운 &amp;lt;Go&amp;gt;토큰을 사용&lt;/span&gt;한다&lt;/li&gt;
&lt;li&gt;\(s_0\)는 평범한 RNN처럼 Zero Vector를 사용하게 된다.&lt;/li&gt;
&lt;li&gt;핵심은 \(c_t\)를 어떻게 구하고 활용할 것이냐가 될 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;설명을 그림으로 정리하면 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;03 (1).png&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;489&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVkC4k/btqFKCS9oZy/tASK5023AlkZ9PtPO2T4R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVkC4k/btqFKCS9oZy/tASK5023AlkZ9PtPO2T4R0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVkC4k/btqFKCS9oZy/tASK5023AlkZ9PtPO2T4R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVkC4k%2FbtqFKCS9oZy%2FtASK5023AlkZ9PtPO2T4R0%2Fimg.png&quot; data-filename=&quot;03 (1).png&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;489&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Bahdanau Attention&lt;/h1&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;\(c_t\)를 구하는 연산이 바로 Attention 메커니즘이 수행하는 일&lt;/span&gt;이 될 것이다. Bahdanau Attention에서 \(c_t\)는 다음과 같이 구할 수 있다.&lt;/p&gt;
&lt;p&gt;$$c_t=\sum_{j=1}^{T_x}a_{tj}h_j=Ha_t$$&lt;/p&gt;
&lt;p&gt;$$a_t=Softmax((Score(s_{t-1}, h_j))_{j=1}^{T_x})\in \mathbb{R}^{T_x}$$&lt;/p&gt;
&lt;p&gt;$$Score(s_{t-1}, h_j)=v^Ttanh(W_{a}s_{t-1}+U_{a}h_j)$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;\(a_t\)는 Alignment Vector라고 정의한다.&lt;/li&gt;
&lt;li&gt;\(a_t\)의 각 성분 \(a_{t1}, ..., a_{tT_x}\)를 이용하여 \(h_1, ..., h_{T_x}\)를 Weighted Sum을 한 것이 Context Vector \(c_t\)가 되는 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;여기서 주의깊게 살펴봐야 하는 것이 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;\(a_t\)의 각 성분 \(a_{tj}\)는 \(s_{t-1}\)과 \(h_j\)사이의 연관성을 Scoring한 결과&lt;/span&gt;라고 볼 수 있다. 즉,&lt;span style=&quot;background-color: #f6e199;&quot;&gt; \(s_{t-1}\)와 모든 \(h_1,...,h_{T_x}\)사이의 연관성을 Weight로 하여 \(h_1,...,h_{T_x}\)의 Weighted Sum을 구하는 방식으로 Context Vector를 구하는 것&lt;/span&gt;이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;또 주의깊게 봐야 할 부분은 Score Function의 형태이다. 두 벡터 \(s_{t-1}\)과 \(h_j\)사이의 Similarity를 구한다는 관점에서 봤을 경우 \(W_{a}s_{t-1}-U_{a}h_j\)라고 쓰는 것이 더 직관적일 것 같다. \(W_a\)와 \(U_a\)라는 두 Linear Transformation을 통해서 임베딩 공간에 뿌려진 두 벡터 \(W_{a}s_{t-1}\)과 \(U_{a}h_j\) 사이의 거리를 \(W_{a}s_{t-1}-U_{a}h_j\)&lt;span style=&quot;color: #333333;&quot;&gt;라고 정의할 수도 있기 때문이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Score Function에 관해서는 Luong Attention에 대한 &lt;a href=&quot;https://hcnoh.github.io/2019-01-01-luong-attention&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;포스팅&lt;/a&gt;을 참조하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;span style=&quot;color: #333333;&quot;&gt;GRU 모델에서의 Attention 메커니즘 활용&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;위에서 기본 RNN 모델을 이용하여 확률 모댈 \(\hat{y}_t\)를 모델링 한 결과를 보였다. 하지만 최근에는 LSTM, GRU등의 RNN 모델들을 활용하는 경우가 많으며 이에 따라 논문 Appendix에는 GRU에 대한 Attention 메커니즘의 활용이 잘 정리가 되어있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;GRU의 기본 연산은 아래와 같이 정리할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$\hat{y}_t = Softmax(W_ys_t+b_y)$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$s_t=z_t\odot s_{t-1}+(1-z_t)\odot \tilde{s}_t$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$z_t=\sigma(W_zy_{t-1}+U_zs_{t-1}+b_z)$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$r_t=\sigma(W_ry_{t-1}+U_rs_{t-1}+b_r)$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$\tilde{s}_t=\tanh(W_sy_{t-1}+U_s(r_t\odot s_{t-1})+b_s)$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;\(\sigma\)는 Sigmoid Function을 나타낸 것이다. Attention 메커니즘을 활용하여 위의 연산들을 재정의하면 아래와 같이 정리할 수 있다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$\hat{y}_t=Softmax(W_ys_t+b_y)$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$s_t=z_t\odot s_{t-1}+(1-z_t)\odot \tilde{s}_t$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$z_t=\sigma(W_zy_{t-1}+U_zs_{t-1}+C_zc_t+b_z)$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$r_t=\sigma(W_ry_{t-1}+U_rs_{t-1}+C_rc_t+b_r)$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$\tilde{s}_t=\tanh(W_sy_{t-1}+U_s(r_t\odot s_{t-1})+C_sc_t+b_s)$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;GRU모델 및 기본 RNN 모델에서의 Context Vector의 활용을 살펴보면 다음의 특징을 파악할 수 있다&lt;/span&gt;. Context Vector\(c_t\)는 RNN의 입력으로 사용되는 \(y_{t-1}\)과 함께 등장하며 임베딩 공간에 뿌려져서 더해지는 방식으로 활용된다. 즉, 간단하게 정리하면 \(Wy_{t-1}\)대신 \(Wy_{t-1}+Cc_t\)가 된다는 것이다. 이건 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;RNN입력을 \(y_{t-1}\)단독으로 사용하는 것이 아니라 Context Vector \(c_t\)와 Concatenation하여 사용&lt;/span&gt;하는 것과 같은 의미이다. 이걸 수식으로 정리하면 다음과 같다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$[W;C][y_{t-1}^T;c_t^T]^T=Wy_{t-1}+Cc_t$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이 부분은 Tensorflow의 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;AttentionWrapper&lt;/span&gt; 모듈에서도 확인할 수 있는 부분이다. &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;AttentionWrapper&lt;/span&gt; 모듈은 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;cell_input_fn&lt;/span&gt;을 인자로 받아 RNN의 입력 및 Attention을 어떻게 받게 할지를 설정할 수 있다. 이때 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;cell_input_fn&lt;/span&gt;의 디폴트를 살펴보면 아래와 같음을 알 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1595006707800&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class AttentionWrapper(rnn_cell_impl.RNNCell):
  &quot;&quot;&quot;Wraps another `RNNCell` with attention.
  &quot;&quot;&quot;

  def __init__(
      self,
      cell,
      attention_mechanism,
      attention_layer_size=None,
      alignment_history=False,
      cell_input_fn=None,
      output_attention=True,
      initial_cell_state=None,
      name=None,
      attention_layer=None
  ):
... (생략)
    Args:
... (생략)
      cell_input_fn: (optional) A `callable`.  The default is:
        `lambda inputs, attention: array_ops.concat([inputs, attention], -1)`.
... (생략)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;즉, &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;현재 입력 및 Attention 여기서는 Context Vector \(c_t\)가 Concatenation되어서 입력으로 사용된다&lt;/span&gt;는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Tensorflow에서의 Bahdanau Attention의 활용&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이 부분은 Bahdanau Attention뿐 아니라 Luong Attention 등의 여러 다른 Attention 메커니즘들에도 동일하게 적용될 수 있는 부분이다. 기본적으로 Tensorflow에서는 Bahdanau Attention등의 잘 알려져있는 Attention 메커니즘을 위한 모듈을 제공한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아래의 코드는 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;아주 기본적으로 활용될 수 있는 Attention 메커니즘 구현 예제&lt;/span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1595007023797&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf
import hyparams as hp

enc_outs = encoder(inputs)

cell = tf.nn.rnn_cell.GRUCell(num_units=hp.attention_units)
attn_mechanism = tf.contrib.seq2seq.BahdanauAttention(
    num_units=hp.attention_depth, memory=enc_outs)
attn_cell = tf.contrib.seq2seq.AttentionWrapper(
    cell=attn_cell, attention_mechanism=attention_mechanism,
    alignment_history=True, output_attention=False)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;예제에서는 인코더의 RNN Hidden State Vector가 아닌 단순하게 인코더의 출력을 Attention의 입력인 Attention Memory로 설정하였다. 따라서 인코더의 출력인 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;enc_outs&lt;/span&gt;가 미리 준비되어 있어야 한다. 이제 Attention을 위한 GRU 셀을 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;tf.nn.rnn_cell.GRUCell&lt;/span&gt;을 이용하여 선언해 준다. 예제에서는 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;cell&lt;/span&gt;이 그 역할을 하게 될 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다음으로 Attention 메커니즘을 선언해야 한다. 여기서는 Bahdanau Attention을 사용하기 위하여 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;tf.contrib.seq2seq.BahdanauAttention&lt;/span&gt;모듈을 이용하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;마지막으로 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;cell&lt;/span&gt;과 Attention 메커니즘을 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;attn_mechanism&lt;/span&gt;을 이용하여 Attention셀로 묶어줘야 한다. 이 역할은 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;tf.contrib.seq2seq.AttentionWrapper&lt;/span&gt;가 담당하게 된다. 이런식으로 선언된 AttentionWrapper는 위에서 확인할 수 있듯이 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;rnn_cell_impl.RNNCell&lt;/span&gt;을 상속받는 클래스이다. 따라서 이제 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;attn_cell&lt;/span&gt;은 기존 GRU셀처럼 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;dynamic_rnn&lt;/span&gt;, &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;dynamic_decode&lt;/span&gt;등에 활용할 수 있게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;span style=&quot;color: #333333;&quot;&gt;실험 및 성능 검증&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;논문에서는 여러 실험을 통해 성능을 검증하였지만 여기서는 한가지만 소개하겠다. 실험은 기계 번역 성능을 확인하는 방식으로 진행됐다. 기본적으로 영어에서 불어로 번역하는 기능을 학습시켰는데 학습에 사용한 데이터는 ACL WMT 14에서 제공하는 데이터셋을 이용하였다. 이 데이터셋의 특징은 Bilingual(두 개의 언어를 사용할 수 있는)하고 Parallel한 코퍼스라는 특징이있다. 다음은 실험 결과 그래프이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;01 (1).png&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;334&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QtDj1/btqFNr49M0l/zfjqKl3ckA3hl7jvt7KTY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QtDj1/btqFNr49M0l/zfjqKl3ckA3hl7jvt7KTY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QtDj1/btqFNr49M0l/zfjqKl3ckA3hl7jvt7KTY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQtDj1%2FbtqFNr49M0l%2FzfjqKl3ckA3hl7jvt7KTY1%2Fimg.png&quot; data-filename=&quot;01 (1).png&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;334&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;기본적으로 BLEU 스코어를 이용하여 성능을 검증하였다. Attention 메커니즘을 활용한 모델인 RNNsearch-50, RNNsearch-30이 그렇지 않은 모델인 RNNenc-50, RNNenc-30 보다 성능적으로 우수하다는 점을 확인할 수 있다. RNNsearch-50, RNNenc-50은 문장 길이가 50정도 되는 코퍼스에 학습시킨 모델이고 RNNsearch-30, RNNenc-30은 문장 길이가 30정도 되는 코퍼스에 학습시킨 모델이다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;문장 길이가 길어질수록 성능이 떨어지는 점도 추가적으로 확인할 수 있다&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;02 (2).png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;1024&quot; width=&quot;572&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oTIa0/btqFNabIkIa/zFRBwj4sJGkhrQOS691nu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oTIa0/btqFNabIkIa/zFRBwj4sJGkhrQOS691nu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oTIa0/btqFNabIkIa/zFRBwj4sJGkhrQOS691nu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoTIa0%2FbtqFNabIkIa%2FzFRBwj4sJGkhrQOS691nu1%2Fimg.png&quot; data-filename=&quot;02 (2).png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;1024&quot; width=&quot;572&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위 그림은 Attnention Alignment를 시각화한 그림이다. 특정 단어를 번역하기 위해서는 그 단어에 가장 눈에 띄는 Alignment가 있어야 하며 잘 동작하는 것을 확인할 수 있다.&lt;/p&gt;</description>
      <category>NLP/Basics</category>
      <author>JG Ahn</author>
      <guid isPermaLink="true">https://ahnjg.tistory.com/96</guid>
      <comments>https://ahnjg.tistory.com/96#entry96comment</comments>
      <pubDate>Fri, 17 Jul 2020 01:34:26 +0900</pubDate>
    </item>
    <item>
      <title>Tacotron이란?</title>
      <link>https://ahnjg.tistory.com/95</link>
      <description>&lt;p&gt;본 게시글은 Hyungcheol Noh님의 &lt;a href=&quot;https://hcnoh.github.io/2018-12-11-tacotron&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Speech Synthesis] Tacotron 논문 정리&lt;/a&gt;를 바탕으로 작성된 글입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Tacotron?&lt;/h1&gt;
&lt;p&gt;2018년 구글에서 새로운 TTS 모델인 &lt;a href=&quot;https://ai.googleblog.com/2017/12/tacotron-2-generating-human-like-speech.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Tacotron 2&lt;/a&gt;를 발표하였다.&lt;/p&gt;
&lt;p&gt;사람이 직접 내는 음성과 비슷한 퀄리티의 음성을 생성할 수 있는 모델이라고 홍보하고 있는데 실제로 Tacotron 2가 생성한 음성 샘플을 들어보면 사람의 목소리인지 구분하기 힘들 정도다. Tacotron 2의 음성 샘플은 &lt;a href=&quot;https://google.github.io/tacotron/publications/tacotron2/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;를 통해서 들어볼 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tacotron 2에 앞서서 먼저 발표된 모델이 2017년에 발표된 Tacotron이다.&lt;/p&gt;
&lt;p&gt;저자들은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Tacotron&lt;/b&gt;&lt;/span&gt;은 이전 TTS 모델들과 비교해서 다음과 같은 장점&lt;/span&gt;이 있다고 주장한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;텍스트를 입력으로 받아서 Raw Spectrogram을 바로 생성할 수 있다&lt;/li&gt;
&lt;li&gt;간단하게 &amp;lt;text, audio&amp;gt; 페어를 이용하여 End-to-End 학습이 가능하다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;01.png&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;507&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vYu6u/btqFKlpYeQg/yzZIMAYsCkzV6IXmkuF791/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vYu6u/btqFKlpYeQg/yzZIMAYsCkzV6IXmkuF791/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vYu6u/btqFKlpYeQg/yzZIMAYsCkzV6IXmkuF791/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvYu6u%2FbtqFKlpYeQg%2FyzZIMAYsCkzV6IXmkuF791%2Fimg.png&quot; data-filename=&quot;01.png&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;507&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;특히 이러한 End-to-End로 학습할 수 있다는 점은 여러 측면에서 좋은 장점을 가질 수 있다.&lt;/p&gt;
&lt;p&gt;먼저 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;End-to-End가 아닌 경우에는 다음과 같은 문제점&lt;/span&gt;이 있을 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;방대한 Domain 전문 지식, 여기서는 음성에 대한 전문 지식들이 필요하다&lt;/li&gt;
&lt;li&gt;디자인에 어려움이 있을 수 있다&lt;/li&gt;
&lt;li&gt;트레이닝이 파이프라인 별로 따로 되면서 에러가 누적될 수 있고 복잡하다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;결과적으로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;End-to-End로 학습하는 경우의 장점&lt;/span&gt;은 다음과 같이 정리할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lt;text, audio&amp;gt;페어로만 가지고 학습이 가능하다&lt;/li&gt;
&lt;li&gt;Feature Engineering이 간단하다. 즉, 어떤 Feature를 뽑아서 넘겨주고 해야 할지에 대한 디자인이 간단하다&lt;/li&gt;
&lt;li&gt;발화자, 언저, 감정 등의 Feature 등을 손쉽게 조절이 가능하다.&lt;/li&gt;
&lt;li&gt;새로운 데이터에 더 Adaptable하다&lt;/li&gt;
&lt;li&gt;노이즈에 더 강하다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;위와 같은 주장들이 타당성이 있는 이유를 살펴보기 위해서 기존 모델들의 특징을 한 번 살펴볼 필요가 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;기존의 TTS 모델&lt;/h1&gt;
&lt;h3&gt;WaveNet(2016)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매우 강력한 오디오 생성 모델이다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;성능이 매우 좋아서 Tacotron의 Vocoder로 사용&lt;/span&gt;된다&lt;/li&gt;
&lt;li&gt;샘플 수준의 Autoregressive Model이라는 이유로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;너무 느리다는 단점&lt;/span&gt;이 있다&lt;/li&gt;
&lt;li&gt;TTS로 바로 활용할 수 없으며 TTS-Frontend로부터 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Linguistic Feature를 입력으로 넣어줘야 하는 단점&lt;/span&gt;이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;DeepVoice(2017)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각각의 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;TTS 파이프라인을 뉴럴넷 모델로 대체&lt;/span&gt;하였다&lt;/li&gt;
&lt;li&gt;학습이&lt;span style=&quot;background-color: #f6e199;&quot;&gt; End-to-End로 되지 않는다는 단점&lt;/span&gt;이 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;또한 기계 번역에서 사용되었던 Encoder-Decoder 모델을 이용하여 음성 합성을 시도하는 연구들이 있었다.&lt;/p&gt;
&lt;p&gt;2016년에 나온 모델에서는 Attention Mechanism을 이용하고 있으나 미리 학습된 HMM 모델이 Attention Mechanism으로 존재해야 하며 출력이 Audio 자체가 아닌 Vocoder 파라미터를 예측하는 방식이다. 따라서 Vocoder의 성능에 따라 결과가 달라지게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;또한 Char2Wav 모델은 End-to-End로 학습하게 하였으나 여전히 Vocoder 파라미터를 예측하는 모델이라는 한계점이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Encoder-Decoder 모델&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;02.png&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEBk44/btqFKCrxhCi/k9IL0cWcBKxWCV3fH9REj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEBk44/btqFKCrxhCi/k9IL0cWcBKxWCV3fH9REj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEBk44/btqFKCrxhCi/k9IL0cWcBKxWCV3fH9REj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEBk44%2FbtqFKCrxhCi%2Fk9IL0cWcBKxWCV3fH9REj1%2Fimg.png&quot; data-filename=&quot;02.png&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그림은 기본적인 Encoder-Decoder 모델을 나타낸 것이다. Encoder-Decoder 모델은 기계 번역에서 처음으로 사용하기 시작한 모델로 Encoder와 Docder를 각각 RNN셀로 구성한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;Encoder&lt;/span&gt;는 순차적으로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;번역하고자 하는 문장의 시퀀스를 입력으로 받게 되고 문장을 고정된 길이의 벡터로 임베딩을&lt;/span&gt; 하게 된다. RNN 인코더의 경우 입력 시퀀스의 마지막 타임 스텝의 입력&lt;span style=&quot;background-color: #f6e199;&quot;&gt;(EOS, End of Sequence)을 입력으로 넣었을 때 나오는 RNN셀의 출력 임베딩을 입력 문장의 임베딩으로 사용&lt;/span&gt;하게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이렇게 생성된 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;문장 임베딩&lt;/span&gt;은 다시 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;RNN 디코더의 첫 번째 타임 스텝의 입력&lt;/span&gt;으로 들어가게 되고 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;인코더의 마지막 타임 스텝의 RNN Hidden State Vector&lt;/span&gt;는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;RNN 디코더의 첫번째 타임 스텝의 Hidden Sate Vector로&lt;/span&gt; 들어가게 된다. 이렇게 입력 문장 임베딩 및 Hidden State Vector를 받은 디코더는 순차적으로 문장을 생성하여 결국 번역된 문장을 완성하게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;간단하게 정리하면 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;현재 타임 스텝의 디코더 출력 \(y_i\)를 생성하기 위해서&lt;/span&gt;는 인코더에 입력되는 문장 시퀀스 \(X\)와 이전 타임 스텝들의 디코더 출력 시퀀스 \({y_1, ..., y_{i-1}}\)및 첫 번째 타임 스텝의 입력 \(y_0\) 가 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Conditioning 되는 조건부 확률 \(p(y_i\mid y_0, ..., y_{i-1}, X)\)는 RNN Encoder-Decoder 모델에서 다음과 같이 모델링&lt;/span&gt; 될 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;$$p(y_i\mid y_0, ..., y_{i-1}, X)=g(y_{i-1}, s_i)$$&lt;/p&gt;
&lt;p&gt;$$s_i = f(y_{i-1}, s_{i-1})$$&lt;/p&gt;
&lt;p&gt;$$where \:\: y_0=Enc(X)$$&lt;/p&gt;
&lt;p&gt;$$s_0=h_{T_x}$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Attension Mechanism&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;03.png&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;489&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmYRBr/btqFJrKSItv/TbuT3wEq842H8mvGLV8uM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmYRBr/btqFJrKSItv/TbuT3wEq842H8mvGLV8uM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmYRBr/btqFJrKSItv/TbuT3wEq842H8mvGLV8uM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmYRBr%2FbtqFJrKSItv%2FTbuT3wEq842H8mvGLV8uM0%2Fimg.png&quot; data-filename=&quot;03.png&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;489&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위의 그림은 기본 Encoder-Decoder 모델에 Attention Mechanism을 추가한 것을 나타낸다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;Attension Mechanism&lt;/b&gt;&lt;/span&gt;은 문장을 하나의 고정된 길이의 벡터로 임베딩 하는 것을 부정하는 과정에서 연구가 시작된 모델이다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;모델을 구성하는 모든 단어들을 각각 임베딩 하여 디코더가 특정 타임 스텝에서 어떤 단어에 더 집중하여 현재 타임 스텝의 출력을 생성할지에 Attention Mechanism이 도움&lt;/span&gt;을 주게 된다. Tacotron은 Attention Mechanism으로 Bahdanau Attention을 사용하였으며 Bahdanau Attention에 대한 정리는 다음의 &lt;a href=&quot;https://hcnoh.github.io/2018-12-11-bahdanau-attention&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;에서 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;간단하게 정리하자면 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;Bahdanau Attention 같은&lt;/span&gt; 경우는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;이전 타임 스텝의 디코더 Hidden Sate Vector와 인코더의 Hidden State Vector 시퀀스를 입력으로 받아 다음 현재 타임 스텝에서의 Context Vector를 생성&lt;/span&gt;한다. 이렇게 생성된 Context Vector는 이전 타임 스텝의 Hidden State Vector와 함께 사용되어 디코더가 현재 타임 스텝의 출력을 생성하게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Attention Mechanism을 적용하는 경우 조건부 확률 \(p(y_i\mid y_0, ..., y_{i-1}, X)\)는 RNN Encoder-Decoder 모델에서 다음과 같이 모델링 될 수 있다.&lt;/p&gt;
&lt;p&gt;$$p(y_i\mid y_0, ..., y_{i-1}, X) = g(y_{i-1}, s_i, c_i)$$&lt;/p&gt;
&lt;p&gt;$$s_i=f(y_{i-1}, s_{i-1}, c_i)$$&lt;/p&gt;
&lt;p&gt;$$where \:\:y_0=&amp;lt;Go&amp;gt;Token$$&lt;/p&gt;
&lt;p&gt;$$s_0=0$$&lt;/p&gt;
&lt;p&gt;$$c_i=Attn(s_{i-1}, [h_1, ..., h_T]])$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;참고로 아래 그림처럼 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Attention Mechanism의 Menory로 인코더 Hidden State Vector 시퀀스가 아닌 인코더 출력 Vector 시퀀스를 사용할 수도 있다&lt;/span&gt;. Tacotron이 바로 그러한 사용의 예라고 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;04.png&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;489&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDCdsN/btqFKmihMVz/v7FqmKDrorQ4oskr6d2ndK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDCdsN/btqFKmihMVz/v7FqmKDrorQ4oskr6d2ndK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDCdsN/btqFKmihMVz/v7FqmKDrorQ4oskr6d2ndK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDCdsN%2FbtqFKmihMVz%2Fv7FqmKDrorQ4oskr6d2ndK%2Fimg.png&quot; data-filename=&quot;04.png&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;489&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;Tacotron 모델 구조&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;847&quot; data-filename=&quot;05.png&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BDTLf/btqFHqsRQxJ/moijyeHMrMIdJoRh6LNr2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BDTLf/btqFHqsRQxJ/moijyeHMrMIdJoRh6LNr2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BDTLf/btqFHqsRQxJ/moijyeHMrMIdJoRh6LNr2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBDTLf%2FbtqFHqsRQxJ%2FmoijyeHMrMIdJoRh6LNr2K%2Fimg.png&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;847&quot; data-filename=&quot;05.png&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Tacotron&lt;/b&gt;&lt;/span&gt;의 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;모델 구조는 기본적으로 Attention Mechanism을 적용한 Encoder-Decoder 구조&lt;/span&gt;이다. 전체적인 모델의 구조는 위 그림과 같다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;인코더&lt;/span&gt;는 입력 텍스트를 문자 단위로 임베딩 한 문자 임베딩 (Character Embedding)을 받게 되고 이렇게 입력된 문자 임베딩 Fully-Connected와 Dropout 레이어로 구성된 Pre-net을 거치게 된다. 그 이후에 CBHG라는 모델을 거치고 나서 생성된 시퀀스를 Attention에 사용하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;06.png&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;827&quot; width=&quot;563&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cadiFl/btqFHqGsbk1/PP8yxQ1u9ooUBgeIKkyoc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cadiFl/btqFHqGsbk1/PP8yxQ1u9ooUBgeIKkyoc1/img.png&quot; data-alt=&quot;CBHG 모델&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cadiFl/btqFHqGsbk1/PP8yxQ1u9ooUBgeIKkyoc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcadiFl%2FbtqFHqGsbk1%2FPP8yxQ1u9ooUBgeIKkyoc1%2Fimg.png&quot; data-filename=&quot;06.png&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;827&quot; width=&quot;563&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CBHG 모델&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위 그림은 CBHG 모델을 나타낸 것이다. &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;CBHG&lt;/b&gt;&lt;/span&gt;는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Convolution Bank + Highway + GRU&lt;/span&gt;의 약어이며 1D Convolution Bank와 Highway 네트워크, 그리고 Bidirectional GRU로 이루어져 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;CBHG에 입력&lt;/b&gt;&lt;/span&gt;으로 들어가게 되면 시퀀스 타임 스텝 축을 따라서 1D Convolution이 이루어지는데 이때 Convolution Kernel이 여러 사이즈를 가진 여러 종류가 사용되게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;Convolution Bank&lt;/b&gt;&lt;/span&gt;에 대해서 추가적인 예시를 들어보면, 먼저 인코더의 경우 Kernel 사이즈를 1부터 16까지 16개를 사용하게 되고 디코더의 PostNet에 사용되는 CBHG의 경우 Kernel 사이즈를 1부터 8까지 8개를 사용하게 된다. 각각의 Kernel을 이용하여 1D Convolution을 수행한 후에 그 결과들을 Concat 하여 다음 단계로 넘기게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;Convolution Bank를 거친 후&lt;/span&gt;&lt;/b&gt;에는 다시 타임 스텝의 축을 따라 Max Pooling이 수행되게 된다. 그다음 다시 1D Convolution을 거친 이후에 입력 레이어와 Residual Connection을 만들고 Highway 레이어로 넘어간다. 참고로 논문에서는 각각의 1D Convolution 이후에 Batch Normalization을 수행하였다고 한다. Batch Normalization에 대해서는 다음의 &lt;a href=&quot;https://hcnoh.github.io/2018-11-27-batch-normalization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;를 참조하면 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;Highway Network&lt;/b&gt;&lt;/span&gt;는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Gating 구조를 사용하는 Residual 네트워크&lt;/span&gt;이다. Residual 네트워크는 간단하게 다음과 같이 표현할 수 있다.&lt;/p&gt;
&lt;p&gt;$$Residual(x) = R(x) + x$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;입력 \(x\)와 출력 \(R(x)\)를 더함으로써 Residual 네트워크를 구성할 수 있다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;입력과 출력을 더하는 방식&lt;/span&gt;의 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;Residual 구조&lt;/b&gt;&lt;/span&gt;는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Vanishing Gradient 문제를 해결하기 위하여 고안된 구조&lt;/span&gt;인데 Residual 네트워크의 Backpropagation을 구하게 되면 \(R(x)\)를 생략하여 입력으로 바로 Backpropagation을 전달할 수 있기 때문에 이런 구조가 고안되었다고 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다만 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;Highway 네트워크&lt;/b&gt;에서는 이러한 Residual을 좀 다르게 구성&lt;/span&gt;하게 된다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Gating을 통해서 현재 Residual의 비율을 모델이 자동으로 어느 정도로 할지 결정하게끔 구성&lt;/span&gt;한다.&lt;/p&gt;
&lt;p&gt;$$Highway(x)=T(x)*H(x)+(1-T(x))*x$$&lt;/p&gt;
&lt;p&gt;이때 \(T(x)\)를 Transform Gate라고 하는데 여기서 중요한 점은 \(T(x)\)의 Bias는 무조건 -1과 같이 음수로 초기화를 해야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;Highway 네트워크&lt;/b&gt;를 거친 이후&lt;/span&gt;에는 &lt;b&gt;Bidirection GRU&lt;/b&gt;를 거치게 된다. 여기서 Forward 시퀀스와 Backward 시퀀스를 Concat 하여 출력하게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;디코더&lt;/b&gt;&lt;/span&gt;는 인코더와 마찬가지로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;입력에 대해서 Pre-net을 지난 후에 Attention RNN 셀과 Decoder RNN셀들을 거치게 된다&lt;/span&gt;. Attention RNN 셀은 GRU 셀로 구성되고 Decoder RNN 셀은 Residual GRU Cell이 두 층으로 쌓여있는 구조이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;디코더&lt;/b&gt;는 최종적으로 Mel-Spectrogram을 출력&lt;/span&gt;하게 되는데 여기서 저자들이 중요하다고 강조한 점이 있다. 바로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Reduction Factor \(r\)을 이용하여 여러 프레임을 동시에 생성한다&lt;/span&gt;는 것이다. 그림에서는 Reduction Factor가 3으로 설정되어 있다. 즉, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;디코더는 한 타임 스텝에서의 3개의 프레임에 해당하는 Mel-Spectrogram을 생성한다&lt;/span&gt;는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이렇게 해도 되는 이유는 바로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;음성 신호의 연속성&lt;/span&gt; 때문이다. 음성 신호는 여러 프레임에 거쳐서 하나의 발음이 수행되기 때문에 이러한 가정이 유의미한 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이렇게 생성된 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;Mel-Spectrogram&lt;/b&gt;&lt;/span&gt;은 PostNet에 해당하는 CBHG를 거치게 되며 최종적으로 Linear-Spectrogram을 생성하게 된다. &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;Linear-Spectrogram은&lt;/b&gt;&lt;/span&gt; Griffin-Lim Algorithm이라는 음성 재구성 알고리즘을 통해서 음성으로 변환되게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Tacotron의 트레이닝 및 생성&lt;/h1&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;Tacotron&lt;/span&gt;&lt;/b&gt;은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Attention Mechanism을 포함한 Encoder-Decoder 구조&lt;/span&gt;이기 때문에 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;트레이닝 및 생성 방식은 일반 Encoder-Decoder 모델과 같다&lt;/span&gt;. 먼저 트레이닝의 경우에는 입력 텍스트 및 타겟 오디오를 전처리하여 Mel-Spectrogram과 Linear-Spectrogram을 준비해놔야 한다. 정리하자면 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;입력은 텍스트, 타겟은 Mel-Spectrogram과 Linear-Spectrogram을 필요&lt;/span&gt;로 하게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;Loss 구성&lt;/span&gt;&lt;/b&gt;은 다음과 같다. 먼저 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;디코더의 출력인 Mel-Spectrogram 출력과 타겟 Mel-Spectrogram과의 L1 Distance를 구한다&lt;/span&gt;. Mel-Spectrogram은 2차원 Feature라는 것에 주의하면서 L1 Distance를 구해야 할 것이다. 이렇게 구한 Distance를 Mel-Loss로 정의한다. Mel_Loss를 Tensorflow 코드를 통해서 구현하면 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1594889936507&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mel_loss = tf.reduce_mean(tf.abs(mel_outs - mel_targets))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;마찬가지 방법으로 Linear-Spectrogram 출력과 타겟 Linear-Spectrogram과의 L1 Distance를 구한다. 마찬가지로 Linear_Loss를 정의한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1594890010313&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lin_loss = tf.reduce_mean(tf.abs(lin_outs - lin_targets))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;최종적인 Tacotron의 Loss&lt;/span&gt;&lt;/b&gt;는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Mel-Loss와 Linear_Loss를 더한 값&lt;/span&gt;을 사용하게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1594890061158&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;loss = mel_loss + lin_loss&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;트레이닝과 생성 과정에서의 중요한 차이&lt;/span&gt;&lt;/b&gt;로는&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 모델 인퍼런스 방식&lt;/span&gt;에 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;트레이닝&lt;/span&gt;&lt;/b&gt;은 디코더의 인퍼런스 과정에서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;디코더의 입력으로 타겟 Mel-Spectrogram을 넣는다&lt;/span&gt;. 정확하게는 Reduction Factor가 3이므로 타켓 Mel-Spectrogram 3개 프레임마다 잘라서 마지막 프레임만을 입력으로 넣어줘야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;생성&lt;/b&gt;&lt;/span&gt;은 원래 디코더의 의도와 같이 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;이전 타임 스텝에서 생성한 프레임 3개 중 마지막 프레임을 현재 타임 스텝의 디코더 입력으로 사용&lt;/span&gt;해야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;Optimizer&lt;/span&gt;&lt;/b&gt;는 간단하게 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Adam Optimizer를 사용&lt;/span&gt;했다. Learning Rate는 Decaying 할 필요는 없으며 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Learning Rate를 특정 트레이닝 스텝마다 순차적으로 줄여나가는 방식&lt;/span&gt;으로 진행했다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Tacotron의 성능&lt;/h1&gt;
&lt;p&gt;아래의 그림은 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;모델 성능을 비교하기 위해 Alignments그래프&lt;/span&gt;를 보여준다. 비교를 위해 사용된 모델은 Vanilla Seq2Seq + Scheduled Sampling 모델과 GRU Encoder를 사용한 모델이다. Tacotron의 Alignments가 더 뚜렷하게 잘 나오는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;07.png&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;862&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kSfKm/btqFKMHMN6C/YTpKPlMqPEhK3R4bqZJZK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kSfKm/btqFKMHMN6C/YTpKPlMqPEhK3R4bqZJZK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kSfKm/btqFKMHMN6C/YTpKPlMqPEhK3R4bqZJZK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkSfKm%2FbtqFKMHMN6C%2FYTpKPlMqPEhK3R4bqZJZK1%2Fimg.png&quot; data-filename=&quot;07.png&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;862&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;다음으로 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;디코더와 PostNet을 나눠서 Mel-Spectrogram과 Linear-Spectrogram을 따로 생성하는 이유&lt;/span&gt;이다. 아래 그림에서 (a)는 PostNet 없이 바로 Linear-Spectrogram을 생성하는 모델이고, (b)는 제안된 모델이며 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;두 모델의 차이는 Linear-Spectrogram을 생성하는 경우에 중간 과정으로 Mel-Spectrogram을 생성하느냐 아니냐&lt;/span&gt; 라고 말할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;모델 (b)가 DFT bin이 100~400인 구간에서 더 많은 Harmonic을 생성하고 있다고 주장하며 이것이 성능 차이를 만든다고 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;08.png&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;889&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NCeUp/btqFJb9zAB3/oHPOwKuyFVj8Ej1RJDhy50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NCeUp/btqFJb9zAB3/oHPOwKuyFVj8Ej1RJDhy50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NCeUp/btqFJb9zAB3/oHPOwKuyFVj8Ej1RJDhy50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNCeUp%2FbtqFJb9zAB3%2FoHPOwKuyFVj8Ej1RJDhy50%2Fimg.png&quot; data-filename=&quot;08.png&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;889&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음의 결과는 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;이전 TTS 모델들과의 MOS 스코어 비교&lt;/span&gt;이다. MOS 스코어는 음성 합성의 특성상 많이 사용되는 지표이다. 크라우드 소싱을 통하여 생성된 음성이 얼마나 사람 목소리에 가까운지를 1에서 5점 사이로 매겨서 구하는 점수이다. 여기서&lt;span style=&quot;background-color: #f6e199;&quot;&gt; Concatenative 보다는 성능이 떨어지지만 Parametric은 상회하는 성능을 보인다&lt;/span&gt;는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;09.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;159&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pxRJ2/btqFJrLdBpg/cstScdxVw4QQ7YGgLzolwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pxRJ2/btqFJrLdBpg/cstScdxVw4QQ7YGgLzolwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pxRJ2/btqFJrLdBpg/cstScdxVw4QQ7YGgLzolwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpxRJ2%2FbtqFJrLdBpg%2FcstScdxVw4QQ7YGgLzolwK%2Fimg.png&quot; data-filename=&quot;09.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;159&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Audio Signal Processing/Basics</category>
      <author>JG Ahn</author>
      <guid isPermaLink="true">https://ahnjg.tistory.com/95</guid>
      <comments>https://ahnjg.tistory.com/95#entry95comment</comments>
      <pubDate>Thu, 16 Jul 2020 19:37:36 +0900</pubDate>
    </item>
    <item>
      <title>WaveNet이란?</title>
      <link>https://ahnjg.tistory.com/94</link>
      <description>&lt;p&gt;본 게시글은 choyi0521님의 &lt;a href=&quot;http://www.secmem.org/blog/2019/08/18/wavenet/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WAVENET: A GENERATIVE MODEL FOR RAW AUDIO&lt;/a&gt;를 정리한 글입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;소개&lt;/h1&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;2016년 구글 딥마인드&lt;/b&gt;에서 오디오 생성 모델인 wavenet에 관한 논문을 공개했습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;당시 대부분의 TTS 모델&lt;/b&gt;은 녹음된 음성 데이터를 쪼개고 조합해서 음성을 생성하는 방식인 &lt;b&gt;Concatenative TTS를 기반으로 구현&lt;/b&gt;되었습니다. 이 방식은 기본적으로 많은 양의 데이터를 필요로 했고, 화자나 톤을 바꾸는 등의 변형을 할 때마다 새로운 데이터가 필요했습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이에 따른 대안으로 통계적인 방법으로 음성을 생성하는 prarametric TTS 방식이 주목받았지만 Concatenative TTS에 비해 생성된 음성이 덜 자연스러웠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;Wavenet&lt;/span&gt;&lt;/b&gt;은 기존의 방식과 다르게 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;오디오의 파형을 직접 모델링하여 훨씬 자연스러운 음성을 생성하는 데&lt;/span&gt; 성공했고, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;컨디션 모델링을 통해 다양한 음성을 생성&lt;/span&gt;할 수 있었습니다. 또한, Wavenet은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;음악 생성을 포함한 다양한 오디오 생성 분야에도 응용&lt;/span&gt;될 수 있음을 보여주었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;WaveNet&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Wavenet&lt;/b&gt;&lt;/span&gt;은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;오디오 파형 데이터를 직접 사용해서 새로운 파형을 모델링합니다&lt;/span&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;파형 \(x=x_1, x_2,..., x_n\)는 조건부 확률을 이용하여 다음과 같이 나타냅니다.&lt;/p&gt;
&lt;p&gt;$$p(x) = \prod _{t=1}^{T}p(x_t\mid x_1, x_2, ..., x_{t-1})$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;즉, 각 샘플\(x_i\)의 확률 분포는 미래의 샘플 \(x_{i+1},x_{i+2},...,x_{T}\)에 의존하지 않고 오직 이전 샘플에만 의존해서 결정됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Dilated Causal Convolutions&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Wavenet&lt;/b&gt;&lt;/span&gt;에서는 아래 그림과 같이 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;오직 과거의 파형 정보만 접근할 수 있도록 Causal Convolutional Layer를 여러 겹 쌓았습니다.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실제 구현할 때는 단순히 이전 층의 결과를 쉬프팅 하면서 1d Convolutional Layer를 쌓으면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;ccl.png&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;250&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cx4XUt/btqFGMPQSAh/GjHVj89aEZzLvQAEOWkIr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cx4XUt/btqFGMPQSAh/GjHVj89aEZzLvQAEOWkIr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cx4XUt/btqFGMPQSAh/GjHVj89aEZzLvQAEOWkIr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcx4XUt%2FbtqFGMPQSAh%2FGjHVj89aEZzLvQAEOWkIr0%2Fimg.png&quot; data-filename=&quot;ccl.png&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;250&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;학습 시&lt;/span&gt;에는 Ground Truth를 모두 알고 있기 때문에 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;모든 스탭에 대한 예측을 동시에 진행&lt;/span&gt;할 수 있습니다. (Teacher Forcing)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;음성을 생성할 때&lt;/span&gt;는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;예측을 한 스탭씩 진행&lt;/span&gt;하게 되고 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;매 스탭마다 결과 값을 다음 스탭의 입력값으로&lt;/span&gt; 주어지게 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;이런 식으로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;긴 시계열을 다룰 때 RNN을 사용하지 않고 Causal Convolutional Layer를 사용하면 모델을 빠르게 학습할 수 있습니다&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;하지만&lt;/b&gt;, 동일한 Dilation의 Convolutional Layer를 쌓으면 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;Receptive Field를 넓히기 위해 많은 층이 필요하다는 &lt;b&gt;단점&lt;/b&gt;&lt;/span&gt;이 있습니다.&lt;/p&gt;
&lt;p&gt;예를 들어, 위 그림에서는 4개의 층을 쌓았지만 Receptive Field가 5(=#layers + filter length - 1)밖에 되지 않습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;이 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;문제를 해결하기 위해&lt;/span&gt; &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Wavenet&lt;/b&gt;&lt;/span&gt;은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;일정 스탭(Dilation)을 건너뛰면서 Filter를 적용하는 Dilated Convolution을 사용&lt;/span&gt;합니다. Dilated Convolution은 적은 층 수의 Layer로도 Receptive Field를 효과적으로 넓힐 수 있게 만듭니다. 예를 들어, 아래 그림은 Dilation이 각각 1, 2, 4, 8인 Dilated Causal Convolution Layer를 차례로 쌓은 모습을 나타냅니다. 이때, Receptive Field는 16이 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;unnamed.gif&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;262&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7mIvp/btqFJcl0GE5/hmM9P73RfUFu4w8sD4GMSk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7mIvp/btqFJcl0GE5/hmM9P73RfUFu4w8sD4GMSk/img.gif&quot; data-alt=&quot;출처: https://deepmind.com/blog/article/wavenet-generative-model-raw-audio&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7mIvp/btqFJcl0GE5/hmM9P73RfUFu4w8sD4GMSk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/c7mIvp/btqFJcl0GE5/hmM9P73RfUFu4w8sD4GMSk/img.gif&quot; data-filename=&quot;unnamed.gif&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;262&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://deepmind.com/blog/article/wavenet-generative-model-raw-audio&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;논문에서는&lt;/span&gt; &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Dilation을 일정 제한까지 두 배씩 증가시키고 이를 반복(1, 2, 4, ..., 512, 1, 2, 4, ..., 512, 1, 2, 4, ..., 512)하며 층을 쌓아 올렸습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Softmax Distributions&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;논문에서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Conditional Distribution을 모델링할 때 Softmax Distribution을 사용&lt;/span&gt;했습니다. 일반적으로 오디오는 16-bit 정수 값으로 저장하기 때문에 그대로 사용하면 스탭마다 총 65536개의 확률을 다뤄야 합니다. 이 수를 줄이기 위해서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;오디오 데이터에 \(\mu\)-law Companding을 적용해서 256개 중 하나의 값으로 양자화시켜 사용&lt;/span&gt;했습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;\(\mu\)-law Companding:&lt;/p&gt;
&lt;p&gt;$$f(x_t) = sign(x_t)\frac{\ln(1+\mu\mid x_t\mid)}{\ln(1+\mu)} $$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;이러한 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Non-Linear 한 양자화 방식이 Linear한 양자화 방식보다 더 좋은 성능&lt;/span&gt;을 보였다고 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Gated Activation Units&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Wavenet&lt;/b&gt;&lt;/span&gt;은 PixelCNN에서 사용된 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Gated Activation Unit을 사용&lt;/span&gt;합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Gated Activation Unit:&lt;/p&gt;
&lt;p&gt;$$z = \tanh(W_{f, k}*x) \odot \sigma (W_{g,k}*x)$$&lt;/p&gt;
&lt;p&gt;$$*: Convolution 연산\\ \odot :Element-wise 곱셈 \\ \sigma() : Sigmoid\:Function\\ W:학습 가능한 Convolution Filter \\ f: filter \\ g:gate\\k:layer 번호$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;매 층마다 입력 값이 주어지면 Filter와 Gate에 대한 Convolution을 각각 구한 뒤 Element-Wise 곱을 구합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Residual and Skip Connections&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Wavenet&lt;/b&gt;&lt;/span&gt;은 학습 시 수렴 속도를 높이고 깊은 모델을 만들기 위해 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;매 층마다 Residual, Skip Connection을 사용&lt;/span&gt;합니다.&lt;/p&gt;
&lt;p&gt;Wavenet의 전체 구조는 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;arch.png&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;365&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bheclr/btqFJq5qoT9/q4yLKMIvWy0Vg0ImR8cro1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bheclr/btqFJq5qoT9/q4yLKMIvWy0Vg0ImR8cro1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bheclr/btqFJq5qoT9/q4yLKMIvWy0Vg0ImR8cro1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbheclr%2FbtqFJq5qoT9%2Fq4yLKMIvWy0Vg0ImR8cro1%2Fimg.png&quot; data-filename=&quot;arch.png&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;365&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;논문에서는 Residual, Skip Connection을 어떻게 구현했는지 자세히 묘사하지는 않았습니다. 그림으로 봐서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Gated Activation Unit을 적용한 뒤 Residual에 대한 1x1 Convolution과 Skip Connection에 대한 1x1 Convolution을 따로 구했을 것으로 보입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Conditional WaveNets&lt;/h3&gt;
&lt;p&gt;Wavenet은 조건 h가 주어졌을 때의 조건부 확률인 \(p(x\mid h)\)를 다음과 같이 모델링할 수 있습니다.&lt;/p&gt;
&lt;p&gt;$$p(x\mid h)=\prod _{t=1}^{T}p(x_t\mid x_1, x_2, ..., x_{t-1}, h)$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;이렇게 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;모델에 조건을 추가함으로써 Wavenet은 특별한 성질을 가진 오디오를 생성할 수 있습니다&lt;/span&gt;. 예를 들어서, 여러 명의 화자에 대한 음성 데이터가 주어졌다면 화자에 대한 정보를 조건으로 설정하여 각 화자에 대한 음성을 생성할 수 있게 만들 수 있습니다. TTS의 경우에는 텍스트에 대한 정보가 필요하기 때문에 이를 조건으로 설정해서 모델을 학습하면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Wavenet의 조건을 설정하는 방식에는 전역적인 방법(Global Conditioning)과 지역적인 방법(Local Conditioning)이 있습니다&lt;/span&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이름에서 유추할 수 있듯이, &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;전역적인 방법&lt;/span&gt;을 사용하면 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;주어진 조건 정보가 모든 스탭에 동일한 영향을 주게 됩니다&lt;/span&gt;. (ex. 화자에 대한 정보)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이때 앞에서 설명한 Activation Function이 다음과 같이 변하게 됩니다.&lt;/p&gt;
&lt;p&gt;$$z = \tanh(W_{f, k}*x+V_{f,k}^{T}h) \odot \sigma (W_{g,k}*x+V_{g,k}^{T}h)$$&lt;/p&gt;
&lt;p&gt;V는 학습 가능한 Linear Projection을 나타냅니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;지역적인 방법&lt;/span&gt;은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;조건이 시계열 \(h_t\)로 주어졌을 때 사용할 수 있습니다&lt;/span&gt;.(ex. TTS모델에서 Linguistic Features)&lt;/p&gt;
&lt;p&gt;\(h_t\)를 Activation Function에 적용하기 위해서 \(h_t\)의 타임 스탭 수를 오디오의 타임 스탭 수와 똑같게 맞춰줘야 합니다.&lt;/p&gt;
&lt;p&gt;이를 위해 Transposed Convolution을 사용하거나 단순히 각 스탭을 복제해서 맞춰줄 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;스탭 수를 맞춰준 조건 정보를 \(y=f(h)\)라고 할 때 Activation Function은 다음과 같이 변하게 됩니다.&lt;/p&gt;
&lt;p&gt;$$z = \tanh(W_{f, k}*x+V_{f,k}*y) \odot \sigma (W_{g,k}*x+V_{g,k}*y)$$&lt;/p&gt;
&lt;p&gt;\(V_{f,,k}*y\)는 1x1 Convolution을 나타냅니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;예제&lt;/h2&gt;
&lt;p&gt;딥마인드 블로그에서 Wavenet으로 생성한 음성, 음악을 들을 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a href=&quot;https://deepmind.com/blog/article/wavenet-generative-model-raw-audio&quot;&gt;https://deepmind.com/blog/article/wavenet-generative-model-raw-audio&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;구현&lt;/h2&gt;
&lt;p&gt;본 게시글의 원저자분이 Pytorch로 Spectrogram Conditional Wavenet을 구현한 코드입니다.&lt;/p&gt;
&lt;p&gt;데이터 셋으로 LJspeech를 사용하고, log mel spectrogram을 구한 뒤 타임 스탭 수를 맞추어 조건으로 사용했다고 합니다.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a href=&quot;https://github.com/choyi0521/wavenet-pytorch&quot;&gt;https://github.com/choyi0521/wavenet-pytorch&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Audio Signal Processing/Basics</category>
      <category>wavenet</category>
      <author>JG Ahn</author>
      <guid isPermaLink="true">https://ahnjg.tistory.com/94</guid>
      <comments>https://ahnjg.tistory.com/94#entry94comment</comments>
      <pubDate>Thu, 16 Jul 2020 00:32:59 +0900</pubDate>
    </item>
    <item>
      <title>[Pytorch] 음성 신호 전처리 (spectrogram, melspectrogram)</title>
      <link>https://ahnjg.tistory.com/93</link>
      <description>&lt;p&gt;본 게시글은 Dacon에서 JunhoSun님이 공유해주신 &lt;a href=&quot;https://dacon.io/competitions/official/235616/codeshare/1305?page=1&amp;amp;dtype=recent&amp;amp;ptype=pub&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;음성 신호 기본 정보&lt;/a&gt;를 바탕으로 작성되었습니다.&lt;/p&gt;
&lt;p&gt;모든 코드와 음성 파일은 &lt;a href=&quot;https://github.com/AhnJG/AI-Project/tree/master/Colab/Audio&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Github&lt;/a&gt;에서 확인하실 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;목차&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Intro&lt;/li&gt;
&lt;li&gt;Import&lt;/li&gt;
&lt;li&gt;Data Load&lt;/li&gt;
&lt;li&gt;Spectrogram, Melspectrogram 변환
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;주요 개념
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;푸리에 변환&lt;/li&gt;
&lt;li&gt;STFT&lt;/li&gt;
&lt;li&gt;Melspectrogram&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Function and Option
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;win_length&lt;/li&gt;
&lt;li&gt;n_fft&lt;/li&gt;
&lt;li&gt;hop_length&lt;/li&gt;
&lt;li&gt;n_mels&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Spectrogram, Melspectrogram 구하기&lt;/li&gt;
&lt;li&gt;해상력&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Intro&lt;/h1&gt;
&lt;p&gt;음성 신호에 대한 기본적인 내용을 설명하고 torchaudio를 사용하여 spectrogram과 melspectrogram feature를 만드는 과정에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Import&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-07-15 오전 2.33.32.png&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;264&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wspk1/btqFDv1GDoL/RBBKBCWoFXsTfPKg53JfbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wspk1/btqFDv1GDoL/RBBKBCWoFXsTfPKg53JfbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wspk1/btqFDv1GDoL/RBBKBCWoFXsTfPKg53JfbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwspk1%2FbtqFDv1GDoL%2FRBBKBCWoFXsTfPKg53JfbK%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-07-15 오전 2.33.32.png&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;264&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Data Load&lt;/h1&gt;
&lt;p&gt;음성 파일(wav)을 torchaudio로 읽겠습니다. &lt;b&gt;음성 파일&lt;/b&gt;은 일정한 시간 간격을 가지고 어떤 지점의 음압을 측정한 것을 말합니다.&lt;/p&gt;
&lt;p&gt;이때 일정한 시간 간격으로 음압을 측정하는 주파수를 &lt;b&gt;sampling rate&lt;/b&gt;이라고 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;torchaudio를 사용해 음성을 읽으면 음성 데이터와 sampling rate을 반환하는데, 아래의 음성에서는 sampling rate가 22050Hz임을 알 수 있습니다. &lt;b&gt;음성 데이터의 크기&lt;/b&gt;를 보면 [1, &lt;span&gt;661794]으로 나와 있는데 1은 &lt;b&gt;채널의 개수&lt;/b&gt;(녹음한 마이크의 개수)를 의미하고 &lt;span&gt;661794는 &lt;b&gt;데이터의 길이&lt;/b&gt;를 의미합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;데이터의 길이를 sampling rate으로 나누어 주면 &lt;b&gt;음성 파일의 시간&lt;/b&gt;을 알 수 있습니다.(아래의 데이터는 30초)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-07-15 오전 2.40.24.png&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;144&quot; width=&quot;475&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE2P3m/btqFFTU1Zpn/iOddCTAYZbGbAL5X2bGSA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE2P3m/btqFFTU1Zpn/iOddCTAYZbGbAL5X2bGSA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE2P3m/btqFFTU1Zpn/iOddCTAYZbGbAL5X2bGSA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE2P3m%2FbtqFFTU1Zpn%2FiOddCTAYZbGbAL5X2bGSA0%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-07-15 오전 2.40.24.png&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;144&quot; width=&quot;475&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;아래는 &lt;b&gt;음성 데이터를 시각화한&lt;/b&gt; 것입니다. &lt;b&gt;가로축은 시간, 세로축은 음압&lt;/b&gt;을 나타냅니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;음압이 큰 부분&lt;/b&gt;에 어떤 목소리, 큰 소리가 있음을 추측할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-07-15 오전 2.42.57.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;266&quot; width=&quot;564&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3uEuz/btqFD59xYTB/0tOLP8woGW4OXJP8YFmJC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3uEuz/btqFD59xYTB/0tOLP8woGW4OXJP8YFmJC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3uEuz/btqFD59xYTB/0tOLP8woGW4OXJP8YFmJC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3uEuz%2FbtqFD59xYTB%2F0tOLP8woGW4OXJP8YFmJC1%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-07-15 오전 2.42.57.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;266&quot; width=&quot;564&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Spectrogram, Mel_Spectrogram 변환&lt;/h1&gt;
&lt;p&gt;음성 데이터를 Spectrogram이나 Melspectrogram으로 변환하는 방법에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;간단히 중요한 개념들을 설명하고 넘어가겠습니다.&lt;/p&gt;
&lt;h2&gt;주요 개념&lt;/h2&gt;
&lt;h3&gt;1. 푸리에 변환&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;음성 신호에 푸리에 변환을 적용하면 각 진동수 성분이 그 음성에 얼마나 들어있는지 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;쉽게 설명하면 &lt;b&gt;음성 신호에 저음이 얼마나 있고, 고음이 얼마나 있는지를 정량적으로 구할 수 있습니다&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;2. STFT(Short Time Fourier Transform)&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;음성을 작게(0.01초 수준) 잘라서 각 작은 조각에 푸리에 변환을 적용&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;p&gt;이것을 STFT라고 부르고 일반적으로 이 결과의 L2 norm을 &lt;b&gt;Spectrogram&lt;/b&gt;이라고 부릅니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;3. Melspectrogram&lt;/h3&gt;
&lt;p&gt;Melspectrogram은 &lt;b&gt;Spectrogram에 mel-filter라는 필터를 적용&lt;/b&gt;해서 얻어집니다. 이는 &lt;b&gt;사람의 청각 기관&lt;/b&gt;이 저음에서 주파수 변화에 민감하고 고음에서는 주파수의 변화에 덜 민감한 특징을 반영하고 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;딥러닝과 사람의 청각 반응은 관련 없어 보일 수 있으나 음성 처리나 자연어 처리 분야에서도 Melspectrogram은 널리 사용되고 있으며 좋은 성능을 보여줍니다. 또한, Melspectrogram은 &lt;b&gt;Spectrogram보다 크기가 작아서 학습 속도 등에서 유리&lt;/b&gt;한 점이 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Function and Option&lt;/h2&gt;
&lt;p&gt;torchaudio에서는 다음과 같이 Spectrogram과 Melspectrogram을 얻을 수 있는 프로세스를 정의할 수 있습니다.&lt;/p&gt;
&lt;p&gt;AmplitudeToDB는 power단위의 Spectrogram 또는 Melspectrogram을 dB(로그) 단위로 변환해 줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;1. win_length&lt;/h3&gt;
&lt;p&gt;음성을 작은 조각으로 &lt;b&gt;자를 때 작은 조각의 크기&lt;/b&gt;를 의미합니다.&lt;/p&gt;
&lt;p&gt;자연어 처리 분야에서는 25ms의 크기를 기본으로 하고 있으며 16000Hz인 음성에서는 400에 해당하는 값입니다. (16000/40)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;22050Hz의 파일이기 때문에 552로 설정하겠습니다. (22050/40, 소수점 올림)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;2. n_fft&lt;/h3&gt;
&lt;p&gt;win_length의 크기로 &lt;b&gt;잘린 음성의 작은 조각은 0으로 Padding 되어서 n_fft로 크기가 맞춰집니다&lt;/b&gt;. 그렇게 padding 된 조각에 푸리에 변환이 적용됩니다. 따라서 n_fft는 win_length보다 크거나 같아야 하고 일반적으로 속도를 위해서 \(2^n\) 값으로 설정합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;win_length의 크기가 552이기 때문에 512는 될 수 없고, 1024는 너무 크다고 생각하여 win_length와 똑같이 552로 설정하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;3. hop_length&lt;/h3&gt;
&lt;p&gt;음성을 작은 조각으로 자를 때, &lt;b&gt;자르는 간격&lt;/b&gt;을 의미합니다. 즉, 이 길이만큼 옆으로 밀면서 작은 조각을 얻습니다.&lt;/p&gt;
&lt;p&gt;일반 적으로 10ms의 크기를 기본으로 하고 있으며 16000Hz인 음성에서는 160에 해당하는 값입니다. (16000/100)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;22050Hz의 파일이기 때문에 221로 설정하겠습니다. (22050/100)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;4. n_mels&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;적용할 &lt;b&gt;mel filter의 개수&lt;/b&gt;를 의미합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Spectrogram, Melspectrogram 구하기&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-07-15 오후 7.01.35.png&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;406&quot; width=&quot;385&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ue4QD/btqFHaCKVwo/7RsE0DVie1TnQkxKXIXlg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ue4QD/btqFHaCKVwo/7RsE0DVie1TnQkxKXIXlg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ue4QD/btqFHaCKVwo/7RsE0DVie1TnQkxKXIXlg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUe4QD%2FbtqFHaCKVwo%2F7RsE0DVie1TnQkxKXIXlg1%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-07-15 오후 7.01.35.png&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;406&quot; width=&quot;385&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;587&quot; height=&quot;NaN&quot; data-filename=&quot;스크린샷 2020-07-15 오후 7.02.51.png&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;81&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doM2fE/btqFIj62ojI/mEermzJDQupkKqFO8tPPXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doM2fE/btqFIj62ojI/mEermzJDQupkKqFO8tPPXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doM2fE/btqFIj62ojI/mEermzJDQupkKqFO8tPPXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoM2fE%2FbtqFIj62ojI%2FmEermzJDQupkKqFO8tPPXK%2Fimg.png&quot; width=&quot;587&quot; height=&quot;NaN&quot; data-filename=&quot;스크린샷 2020-07-15 오후 7.02.51.png&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;81&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;음성 데이터로부터 Spectrogram과 Melspectrogram을 얻어 보겠습니다.&lt;/p&gt;
&lt;p&gt;각각의 크기는 채널을 무시하면 [277, 2995], [80, 2995]인데 2995는 &lt;b&gt;시간축 방향 성분 수&lt;/b&gt;, 277과 80은 &lt;b&gt;주파수 방향 성분 수&lt;/b&gt;를 의미합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;n_mel이 80이었으므로 &lt;b&gt;Melspectrogram&lt;/b&gt;의 주파수 방향 성분 수는 80인 것입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Spectrogram&lt;/b&gt;의 경우 \(\frac{n_fft}{2}+1\)개의 주파수 방향 성분이 얻어지게 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;주파수 성분&lt;/b&gt;은 0Hz부터 Sampling rate의 절반까지를 나타내게 됩니다. Sampling rate의 절반까지 밖에 표현하지 못하는 이유는 Nyquist Frequency에 대해 알아보시면 이해할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;해상력&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-07-15 오후 7.13.23.png&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;287&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llezv/btqFFUHl67X/T6J4H07PPlNFPxUyyM9fxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llezv/btqFFUHl67X/T6J4H07PPlNFPxUyyM9fxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llezv/btqFFUHl67X/T6J4H07PPlNFPxUyyM9fxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fllezv%2FbtqFFUHl67X%2FT6J4H07PPlNFPxUyyM9fxk%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-07-15 오후 7.13.23.png&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;287&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;마지막으로 Spectrogram과 Melspectrogram의 해상력에 대해 설명하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;win_length가 커질수록&lt;/b&gt; 주파수 성분에 대한 해상력은 높아지지만(정밀해진다) 시간 성분에 대한 해상력은 낮아지게 됩니다.&lt;/p&gt;
&lt;p&gt;즉, 더 정밀한 주파수 분포를 얻을 수 있으나 시간에 따른 주파수 변화를 관찰하기가 어려워집니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;반대로 &lt;b&gt;win_length가 작은 경우&lt;/b&gt;에는 주파수 성분에 대한 해상력은 낮아지지만, 시간 성분에 대한 해상력은 높아지게 됩니다.&lt;/p&gt;
&lt;p&gt;따라서 적절한 값을 찾는 것이 중요합니다.&lt;/p&gt;
&lt;p&gt;또한 &lt;b&gt;n_fft를 키우는 경우&lt;/b&gt; 주파수 성분의 수는 증가할지 몰라도 실제 주파수의 해상력은 증가하지 않습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Audio Signal Processing/Practice</category>
      <author>JG Ahn</author>
      <guid isPermaLink="true">https://ahnjg.tistory.com/93</guid>
      <comments>https://ahnjg.tistory.com/93#entry93comment</comments>
      <pubDate>Wed, 15 Jul 2020 03:16:36 +0900</pubDate>
    </item>
    <item>
      <title>[Statistics 110] 3강 - Birthday Problem과 확률의 특성 (Birthday Problem, Properties of Probability)</title>
      <link>https://ahnjg.tistory.com/92</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;본 게시글은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.edwith.org/harvardprobability/lecture/30895/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[하버드] 확률론 기초: Statistics 110, 3강 - Birthday Problem과 확률의 특성&lt;/a&gt;을&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;보고 정리한 글입니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1 data-ke-size=&quot;size26&quot;&gt;학습 목표&lt;/h1&gt;
&lt;p&gt;확률의 non-naive한 정의의 공리(규칙)을 이용하여 확률의 특성을 증명할 수 있으며, 포함배제의 원리를 이해한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-ke-size=&quot;size26&quot;&gt;핵심 키워드&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Birthday Problem&lt;/li&gt;
&lt;li&gt;확률의 non-naive한 정의의 공리&lt;/li&gt;
&lt;li&gt;확률의 특성&lt;/li&gt;
&lt;li&gt;포함배제의 원리&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;학습 내용&lt;/h1&gt;
&lt;h2&gt;생일 문제 (Birthday Problem)&lt;/h2&gt;
&lt;p&gt;생일 문제는 k명 중에 2명 이상이 같은 생일을 가질 확률을 뜻한다.&lt;/p&gt;
&lt;p&gt;일별 출생 확률은 동일하고 각각의 사건은 독립적으로 발생한다고 가정한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;K가 몇 명 이상이어야 같은 생일을 가진 사람들이 있을 확률이 50% 일까?&lt;/h3&gt;
&lt;p&gt;k &amp;gt; 365 일 때&amp;nbsp; 확률은 1이다&lt;/p&gt;
&lt;p&gt;k &amp;lt;= 365 라 할 때, 여사건을 이용하여 확률을 계산해보자&lt;/p&gt;
&lt;p&gt;P(no match : 두 명의 생일이 같지 않은 경우)를 구하고 1에서 해당 확률을 빼면 최소한 한 쌍의 생일이 일치하는 확률을 구할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이런 방법은 자주 사용되는 방법으로, 사건의 확률을 직접 찾는 것이 쉬울지 여사건을 계산하는 것이 쉬운지 생각해봐야 합니다.&lt;/p&gt;
&lt;p&gt;이 경우에는 여사건을 게산하는것이 더 쉽습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;확률의 naive한 정의를 사용해서 모두 동일한 확률이라고 가정하면 분모는 \(365^k\)가 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;분자의 경우 각각의 ID를 가지는 사람들을 생각해봅시다. ID의 순서대로 한 명씩 파티에 들어온다고 해봅시다.&lt;/p&gt;
&lt;p&gt;첫 번째 사람은 365일 중 아무 때나 생일이 될 수 있습니다 : &lt;span style=&quot;color: #333333;&quot;&gt;365&lt;/span&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;두 번째 사람은 첫 번째 사람과는 다른 생일을 아무 때나 가질 수 있습니다 : \(365 \times 364\).&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음 사람은 이 두 사람을 제외하고 아무 때나 생일을 가질 수 있습니다 : \(365 \times 364 \times 363\)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이렇게 계속 곱해집니다. 따라서 다음과 같은 식으로 표현할 수 있죠.&lt;/p&gt;
&lt;p&gt;$$\frac{365 \times 364 \times 363 \times ... \times (365-k+1)}{365^k}$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;참고로 P(match: 두 명의 생일이 같은 경우)의 확률을 보면 k가 23일 때 50.7%, k가 50일 때 97%, k가 100일 때 99.999%의 확률을 가집니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;직관적으로 생각해보면&amp;nbsp;가장 중요한 값은 k가 아닌 k에서 2개를 고르는 경우의 수입니다. k명이 있을 때 k명 중에서 각 2명씩을 골라야 하기 때문입니다.&lt;/p&gt;
&lt;p&gt;$$\binom{k}{2} = \frac{k\times(k-1)}{2}, \binom{23}{2} = \frac{23 \times 22}{2} = 253$$&lt;/p&gt;
&lt;p&gt;따라서 23명의 경우 253쌍을 만들 수 있고 큰 확률을 가질 것 같습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;확률의 non naive 한 정의&lt;/h2&gt;
&lt;h3&gt;공리(자명한 이치)&lt;/h3&gt;
&lt;h4&gt;1. \(P(\varnothing) = 0, P(S) = 1\)&lt;/h4&gt;
&lt;p&gt;아무것도 일어나지 않는 경우는 없다&lt;/p&gt;
&lt;p&gt;확실한 사건에 대해서는 항상 1의 확률을 가진다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;2. \(P(\cup_{n=1}^{\infty}A_n)=\sum_{n=1}^{\infty}P(A_n)\quad (A_1, A_2, ..., A_n disjoint)\)&lt;/h4&gt;
&lt;p&gt;[합사건의 확률에 대한 정리]&lt;/p&gt;
&lt;p&gt;n이 1부터 m또는 무한대가 되더라도 유한사건이 된다&lt;/p&gt;
&lt;p&gt;\(P(\cup_{n=1}^{\infty}A_n)\) 값은 n이 1부터 무한대일 때 P(An) 값의 합이 됩니다.&lt;/p&gt;
&lt;p&gt;A1, A2, ...가 모두 겹치지 않는 서로소여야 한다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;확률의 특징&lt;/h2&gt;
&lt;h3&gt;1. \(P(A^c) = 1 - P(A)\)&lt;/h3&gt;
&lt;h4&gt;&amp;nbsp;Proof&lt;/h4&gt;
&lt;p&gt;$$1 = P(S) = P(A \cup A^c) = P(A) + P(A^c), since A \cap A^c = \varnothing$$&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;\(P(A \cup A^c)\)에서 \(A\)와 \(A^c\)는 서로소 이기 때문에 \(P(A)&amp;nbsp;+&amp;nbsp;P(A^c)\)&lt;span style=&quot;color: #333333;&quot;&gt;이다 (공리 1)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;2.\(if\: A\subseteq B, then \: P(A) \leq P(B)\)&lt;/h3&gt;
&lt;h4&gt;Proof&lt;/h4&gt;
&lt;p&gt;$$B = A \cup(B\cap A^c)$$&lt;/p&gt;
&lt;p&gt;$$P(B) = P(A) + P(B\cap A^c) \geq P(A)$$&lt;/p&gt;
&lt;p&gt;확률은 항상 0~1 사이의 값을 가지기 때문에 음수를 가질 수 없다.&lt;/p&gt;
&lt;p&gt;따라서 \(P(A) + P(B\cap A^c)\)&lt;span style=&quot;color: #333333;&quot;&gt;는 \(P(A)\)보다 크거나 같아야 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. \(P(A\cup B) = P(A) + P(B) - P(A\cap B)\)&lt;/span&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Proof&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;$$P(A\cup B) = P(A\cup (B\cap A^c))= P(A) + P(B\cap A^c)$$&lt;/p&gt;
&lt;p&gt;이 때, \(P(B) - P(A\cap B) = P(B\cap A^c)\)인 경우 등식 성립&lt;/p&gt;
&lt;p&gt;\(P(A\cap B) + P(A^c\cap B) = P(B)\) 이므로 성립한다 (공리2)&lt;/p&gt;
&lt;p&gt;\(A\)와 \(A^c\)는 서로소 이기 때문에 위 두 집합은 서로소 이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;span style=&quot;color: #333333;&quot;&gt;포함배제의 원리 (Inclusion-Exclusion Principle)&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$P(A_1\cup A_2\cup ... \cup A_n)=\sum_{j=1}^{n}P(A_j)-\sum_{i&amp;lt;j}P(A_i\cap A_j) + \sum_{i&amp;lt;j&amp;lt;k}P(A_i\cap A_j \cap A_k) - ... + (-1)^{n+1}P(A_1\cap A_2\cap ...\cap A_n)$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;예제) deMontmort's Problem(1713): 카드가 놓인 위치(첫번째, 두번째, ...)와 카드에 쓰여있는 숫자가 일치할 확률은 얼마인가?&lt;/h4&gt;
&lt;p&gt;무작위로 섞여 있는 카드 1, 2, ... n 중에서, 카드 j가 j번째 순서에 놓이는 사건을 \(A_j\) 라고 할 때,&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;\(P(A_1\cup A_2 \cup ... \cup A_n)\) 이것이 최소 한 장의 카드가 매칭되는 확률의 수학적 표현이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;\(P(A_j)\)는 j번째 카드가 숫자 j가 써져있을 확률입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;$$P(A_j)=\frac{1}{n}$$&lt;/p&gt;
&lt;p&gt;모든 위치에 대한 확률이 같은 확률이라고 할 때 \(\frac{1}{n}\)&lt;span style=&quot;color: #333333;&quot;&gt;이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;$$P(A_1\cap A_2) = \frac{(n-2)!}{n!}=\frac{1}{n(n-1)} --&amp;gt; \binom{n}{2} = \frac{n(n-1)}{2}$$&lt;/p&gt;
&lt;p&gt;$$...$$&lt;/p&gt;
&lt;p&gt;$$P(A_1\cap A_2 \cap ... \cap A_k) = \frac{(n-k)!}{n!}$$&lt;/p&gt;
&lt;p&gt;카드 뭉치의 순서는 \(n!\)가지가 가능합니다. \(A_1\cap A_2\)는 첫번째 카드가 1이고, 2번째 카드가 2인경우로 나머지 n-2장의 카드는 어떠한 순서도 가능합니다. 따라서 &lt;span style=&quot;color: #333333;&quot;&gt;\(P(A_1\cap A_2) = \frac{(n-2)!}{n!}\)이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이것을 계속하면 &lt;span style=&quot;color: #333333;&quot;&gt;\(P(A_1\cap A_2 \cap ... \cap A_k) = \frac{(n-k)!}{n!}\)이것은 맨 위부터 k장의 카드가 정확히 1부터 k까지인 상황이죠. 나머지 n-k장의 카드는 어떤 순서가 되든지 상관없습니다. 따라서 &lt;span style=&quot;color: #333333;&quot;&gt;\(P(A_1\cap A_2 \cap ... \cap A_k) = \frac{(n-k)!}{n!}\)이 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이제 포함배제의 원리를 적용시켜보겠습니다. 포함배제의 원리에 따라 위에서 구한 값들을 대입해보면 &lt;span style=&quot;color: #333333;&quot;&gt;\(n\times \frac{1}{n}-\frac{n(n-1)}{2!}\times \frac{1}{n(n-1)}+\frac{n(n-1)(n-2)}{3!}\times \frac{1}{n(n-1)(n-2)}-...\)와 같은 형태를 발견 할 수 있고 정리해보면 &lt;span style=&quot;color: #333333;&quot;&gt;\(1-\frac{1}{2!}+\frac{1}{3!}-...+(-1)^{n+1}\frac{1}{n!}\)이렇게나옵니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;\(1-\frac{1}{2!}+\frac{1}{3!}-...+(-1)^{n+1}\frac{1}{n!}\) 이 식이 \(e^x\)의 테일러 급수라는 것을 기억해내야 합니다. 따라서 근사적으로 \(\approx 1-\frac{1}{e}\)&lt;span style=&quot;color: #333333;&quot;&gt;의 값을 가집니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그러므로 구하고자 하는 확률인 \(P(A_1\cup A_2 \cup ... \cup A_n)\)는&lt;/p&gt;
&lt;p&gt;$$= P(A_1) + P(A_2) + ... + (P_n) - P(A_1\cup A_2) - ... +P(A_1\cup A_2\cup A_3)+...$$&lt;/p&gt;
&lt;p&gt;$$=n\times \frac{1}{n}-\frac{n(n-1)}{2!}\times \frac{1}{n(n-1)}+\frac{n(n-1)(n-2)}{3!}\times \frac{1}{n(n-1)(n-2)}-...$$&lt;/p&gt;
&lt;p&gt;$$=1-\frac{1}{2!}+\frac{1}{3!}-...+(-1)^{n+1}\frac{1}{n!} \quad --&amp;gt; 테일러 시리즈$$&lt;/p&gt;
&lt;p&gt;$$\approx 1-\frac{1}{e} $$&lt;/p&gt;</description>
      <category>Mathematics/Harvard Statistics 110</category>
      <author>JG Ahn</author>
      <guid isPermaLink="true">https://ahnjg.tistory.com/92</guid>
      <comments>https://ahnjg.tistory.com/92#entry92comment</comments>
      <pubDate>Mon, 13 Jul 2020 21:12:20 +0900</pubDate>
    </item>
    <item>
      <title>[Statistics 110] 2강 - 해석을 통한 문제풀이 및 확률의 공리 (Story Proofs, Axioms of Probability)</title>
      <link>https://ahnjg.tistory.com/91</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;본 게시글은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.edwith.org/harvardprobability/lecture/30894/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[하버드] 확률론 기초: Statistics 110, 2강 - 해석을 통한 문제풀이 및 확률의 공리&lt;/a&gt;를&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;보고 정리한 글입니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;학습 목표&lt;/h2&gt;
&lt;p&gt;확률의 naive한 정의로 접근하기 어려운 경우를 알아내고, story proof를 통한 접근을 할 수 있다. 또한 확률의 non-naive한 정의를 위한 공리 2가지를 이해하고 적용할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 키워드&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;확률의 naive한 정의&lt;/li&gt;
&lt;li&gt;Story proof&lt;/li&gt;
&lt;li&gt;확률의 non-naive한 정의의 공리&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;과제에 대한 조언&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;상식적인 부분을 고려하라 
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;답안이 말이 되도록 쓰는 것뿐 아니라 합리적인 이유가 있어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;답을 항상 다시 확인해라
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적인, 극단적인, 계산하기 간단하지만 유의미한 값을 시도해본다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n=0, n=1, n=2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;추가 설명을 표시하는 것은 매우 유용하다. (사람, 물체)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사람 : 1...n&lt;/li&gt;
&lt;li&gt;빨간공 : 1..r, 파란공 : r+1...r+b&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;학습 내용&lt;/h2&gt;
&lt;p&gt;$$\binom{10}{4} =\binom{10}{6}$$&lt;/p&gt;
&lt;p&gt;10명에서 4명을 뽑으면 6명이 남기때문에 10명에서 4명을 뽑는것이나 6명을 뽑는것이나 같은 경우의 수를 가진다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;$$\frac{\binom{10}{5}}{2}$$&lt;/p&gt;
&lt;p&gt;10명이 있을때 5명의 2팀을 뽑는것이 문제라면 &lt;span style=&quot;color: #333333;&quot;&gt;중복했기 때문에 &lt;/span&gt;10명에서 5명을 뽑는 경우의 수를 2로 나눠줘야한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;순서는 상관하지 않고 중복이 가능한 경우 증명&lt;/h3&gt;
&lt;p&gt;$$\binom{n+k-1}{k}$$&lt;/p&gt;
&lt;p&gt;n개에서 k개를 순서 상관 없이, 중복하여 뽑는 경우의 수는 위와 같다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;숫자를 대입해서 확인해보기&lt;/h4&gt;
&lt;p&gt;k = 0 =&amp;gt; \(\binom{n-1}{0}&amp;nbsp;=&amp;nbsp;1\)&lt;/p&gt;
&lt;p&gt;k = 1 =&amp;gt; \(\binom{n}{1}&amp;nbsp;=&amp;nbsp;n\)&lt;/p&gt;
&lt;p&gt;n = 2 =&amp;gt; \(\binom{k+1}{k} = k+1\)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-07-12 오후 5.56.35.png&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;244&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yTcU2/btqFBMnl27o/c0LdKIP99oC8vYshDGnYo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yTcU2/btqFBMnl27o/c0LdKIP99oC8vYshDGnYo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yTcU2/btqFBMnl27o/c0LdKIP99oC8vYshDGnYo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyTcU2%2FbtqFBMnl27o%2Fc0LdKIP99oC8vYshDGnYo0%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-07-12 오후 5.56.35.png&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;244&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;일반화 : n개의 상자에 k개의 구별 불가능한 object들을 넣을 수 있는 경우의 수는 얼마인가?&lt;/h4&gt;
&lt;p&gt;n(=4)개에서 k(=6)개를 순서 상관 없이, 중복을 하며 뽑을 수 있는 경우의 수는 몇 가지인가?&lt;/p&gt;
&lt;p&gt;==&amp;gt; k개의 구슬을 n개의 상자에 넣는 경우의 수는 몇가지 인가?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;270&quot; width=&quot;703&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpuB2S/btqFBLoslAu/obNTJnJpFLFwBCykMaIHK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpuB2S/btqFBLoslAu/obNTJnJpFLFwBCykMaIHK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpuB2S/btqFBLoslAu/obNTJnJpFLFwBCykMaIHK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpuB2S%2FbtqFBLoslAu%2FobNTJnJpFLFwBCykMaIHK0%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;270&quot; width=&quot;703&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;i&gt;구슬과 같이 실물이 있는 물체는 labeling이 가능하며 서로 구별이 가능하다. 따라서 확률의 naive한 정의로 접근이 가능하다. 하지만 물리학, counting problem에서의 경우에는 object들이 항상 구별 가능한 것이 아니기 때문에 이와 같은 접근이 어렵다.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;k개의 원 사이에 n-1개의 구분선을 넣는 경우의 수는 몇 가지 인가? (박스를 구분선으로 바꿔서 표기한다)&lt;i&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-07-12 오후 6.03.53.png&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;224&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RZT8u/btqFBfDjWJo/29efkXD4RBHTqIADIXWMk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RZT8u/btqFBfDjWJo/29efkXD4RBHTqIADIXWMk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RZT8u/btqFBfDjWJo/29efkXD4RBHTqIADIXWMk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRZT8u%2FbtqFBfDjWJo%2F29efkXD4RBHTqIADIXWMk0%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-07-12 오후 6.03.53.png&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;224&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위 문제는 n+k-1개의 위치에 원과 구분선을 배열하는 것과 같다. 원의 위치를 먼저 정하면 구분선의 위치도 결정되고, 그 반대도 성립하기 때문에 다음과 같은 등십이 성립함을 알 수 있다.&lt;/p&gt;
&lt;p&gt;$$\binom{n+k-1}{n-1}=\binom{n+k-1}{k}$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Story Proof : 상황 해석을 통한 증명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황 해석을 통해 증명 하는것이 대수적 방법으로 접근하는 것보다 훨씬 쉬울 때가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. \(\binom{n}{k}&amp;nbsp;=&amp;nbsp;\binom{n}{n-k}\)&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. \(n\binom{n-1}{k-1}&amp;nbsp;=&amp;nbsp;k\binom{n}{k}\)&lt;/h4&gt;
&lt;p&gt;n명 중에서 k명을 뽑고, k명 중에서 한 명을 회장으로 뽑는 문제를 생각해보자. 답을 구하기 위한 두 가지 방법이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;한 가지 방법은 동아리에 들어갈 k명을 먼저 선택하고 그 중에서 회장을 뽑는 것이다. k명중 한명은 반드시 대표가 되어야한다&lt;/p&gt;
&lt;p&gt;따라서 곱의 법칙에 의해 k를 곱하는 것이다. \(k\binom{n}{k}\)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;두 번째 방법은 대표를 먼저 뽑는것이다. 대표를 먼저 뽑은 뒤에 k-1명의 동아리원을 더 뽑아야 한다. n-1명중에서 선택하는 것이 되겠죠. 그리고 다시 곱의 법칙이 적용됩니다. 따라서 \(n\binom{n-1}{k-1}\)와 같습니다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. \(\binom{m+n}{k}&amp;nbsp;=&amp;nbsp;\sum_{j=0}^{k}{\binom{m}{j}\binom{n}{k-j}}\)&lt;/h4&gt;
&lt;p&gt;VanderMonde 항등식이라고 불리는 이식은 수학에서 유명한 항등식입니다.&lt;/p&gt;
&lt;p&gt;확률 이외의 다른 분야에서도 많이 사용됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-07-12 오후 6.14.20.png&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;816&quot; width=&quot;498&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bW4WeL/btqFzHHZmyT/AZSeWpOIbkdnN1lMPKltWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bW4WeL/btqFzHHZmyT/AZSeWpOIbkdnN1lMPKltWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bW4WeL/btqFzHHZmyT/AZSeWpOIbkdnN1lMPKltWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbW4WeL%2FbtqFzHHZmyT%2FAZSeWpOIbkdnN1lMPKltWk%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-07-12 오후 6.14.20.png&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;816&quot; width=&quot;498&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;m+n개에서 k개를 뽑는것은 m개 원소가 있는 상자와 n개의 원소가 있는 상자에서 j개와 k-j개를 뽑는것으로 생각할 수 있다. 이 때 j는 0부터 k까지 가면서 모든 경우를 다 더하면 동일한 값을 구할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Non-naive definition of probability (단순하지 않은 정의)&lt;/h3&gt;
&lt;p&gt;확률 공간 (Probability space)은 S와 P로 구성된다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;350&quot; data-filename=&quot;스크린샷 2020-07-12 오후 6.18.54.png&quot; width=&quot;302&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9M4o9/btqFzAPUBdN/axMKFAzBheoerNuT4kXZuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9M4o9/btqFzAPUBdN/axMKFAzBheoerNuT4kXZuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9M4o9/btqFzAPUBdN/axMKFAzBheoerNuT4kXZuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9M4o9%2FbtqFzAPUBdN%2FaxMKFAzBheoerNuT4kXZuK%2Fimg.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;350&quot; data-filename=&quot;스크린샷 2020-07-12 오후 6.18.54.png&quot; width=&quot;302&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;S : 표본 공간&lt;/p&gt;
&lt;p&gt;P : 함수, P의 정의역은 S의 부분집합이다. 어떤 사건을 입력으로 하는 함수이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;$$A\subseteq S, P(A) \in [0, 1]$$&lt;/p&gt;
&lt;p&gt;입력은 사건이 되고 출력은 0과 1 사이의 수가 됩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;첫 번째 규칙&lt;/h4&gt;
&lt;p&gt;$$P(\varnothing)=0, P(S)=1$$&lt;/p&gt;
&lt;p&gt;공집합에 대한 확률은 0이고 전체 집합에 대한 확률은 1이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;두 번째 규칙&lt;/h4&gt;
&lt;p&gt;$$P(\bigcup_{n=1}^{\infty}A_n) = \sum_{n=1}^{\infty}{P(A_n)}$$&lt;/p&gt;
&lt;p&gt;합사건에 대한 것인데 \(\bigcup_{n=1}^{\infty}A_n\)이것을 가산 무한 합사건이라고 한다.&lt;/p&gt;
&lt;p&gt;합사건의 확률은 모든 확률의 합과 같다. 중요한 조건이 있는데 A1, A2 ..가 모두 서로서 일 때만 가능하다 (즉, 중복되는 것이 없다)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위의 두 가지 규칙으로 확률에 대한 모든 정리들을 유도할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Mathematics/Harvard Statistics 110</category>
      <author>JG Ahn</author>
      <guid isPermaLink="true">https://ahnjg.tistory.com/91</guid>
      <comments>https://ahnjg.tistory.com/91#entry91comment</comments>
      <pubDate>Sun, 12 Jul 2020 18:25:13 +0900</pubDate>
    </item>
    <item>
      <title>RMSLE (Root Mean Squared Log Error)</title>
      <link>https://ahnjg.tistory.com/90</link>
      <description>&lt;p&gt;회귀의 평가를 위한 지표는 실제 값과 회귀 예측값의 차이를 기반으로 합니다. 회귀 평가지표 중에 RMSLE가 있는데 값이 작을수록 회귀 성능이 좋은 것입니다. 예측값과 실제값의 차이가 없다는 뜻이기 때문입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;$$RMSLE = \sqrt{\frac{1}{N}\sum_{i=1}^{N}{(\log(p_i+1)-\log(a_i+1))^2}}$$&lt;/p&gt;
&lt;p&gt;$$p=Predicted, \: a=Actual$$&lt;/p&gt;
&lt;p&gt;RMSLE는 위와 같은 식을 가지는데 RMSE와 비교해 3가지의 차이점을 보입니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;RMSE와 비교해 RMSLE의 3가지 장점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 아웃라이어에 강건해진다&lt;/h3&gt;
&lt;p&gt;RMSLE는 아웃라이어에 강건(Robust)합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xpdYO/btqFzuICNkE/6cjaHCRgEXZTomenqhziE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xpdYO/btqFzuICNkE/6cjaHCRgEXZTomenqhziE0/img.png&quot; data-filename=&quot;스크린샷 2020-07-11 오후 5.54.43.png&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;646&quot; width=&quot;473&quot; height=&quot;NaN&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xpdYO/btqFzuICNkE/6cjaHCRgEXZTomenqhziE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxpdYO%2FbtqFzuICNkE%2F6cjaHCRgEXZTomenqhziE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1646&quot; height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfQ0hp/btqFA58cyrp/e7wlYfiEzPpI0GLpg8hCHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfQ0hp/btqFA58cyrp/e7wlYfiEzPpI0GLpg8hCHk/img.png&quot; data-filename=&quot;스크린샷 2020-07-11 오후 5.57.47.png&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;646&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfQ0hp/btqFA58cyrp/e7wlYfiEzPpI0GLpg8hCHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfQ0hp%2FbtqFA58cyrp%2Fe7wlYfiEzPpI0GLpg8hCHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1646&quot; height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;실제값 = [60, 80, 90], &lt;/span&gt;예측값 = [67, 78, 91] 일 때, RMSE = 4.242, RMSLE = 0.6466이고&lt;/p&gt;
&lt;p&gt;실제값 = [60, 80, 90, 750], 예측값 = [67. 78. 91. 102] 일 때, RMSE = 324.02, RMSLE = 0.994입니다.&lt;/p&gt;
&lt;p&gt;750이라는 아웃라이어 때문에 RMSE는 굉장히 증가했지만 RMSLE의 증가는 미미합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;RMSLE는 아웃라이어가 있더라도 값의 변동폭이 크지 않습니다. 따라서 RMSLE는 아웃라이어에 강건하다고 말할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 상대적 Error를 측정해준다.&lt;/h3&gt;
&lt;p&gt;예측값과 실제값에 로그를 취해주면 로그 공식에 의해 아래와 같이 상대적 비율을 구할 수 있습니다.&lt;/p&gt;
&lt;p&gt;$$\log(p_i+1)-log(a_i+1)=\log(\frac{p_i+1}{a_i+1})$$&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pRLL3/btqFzc9dUF4/XZCqHDQrJy8OkufQWMFs4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pRLL3/btqFzc9dUF4/XZCqHDQrJy8OkufQWMFs4K/img.png&quot; data-filename=&quot;스크린샷 2020-07-11 오후 6.05.01.png&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;498&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pRLL3/btqFzc9dUF4/XZCqHDQrJy8OkufQWMFs4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpRLL3%2FbtqFzc9dUF4%2FXZCqHDQrJy8OkufQWMFs4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1310&quot; height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KigmE/btqFApTBt5G/LK8dXm5shNkywK0iI5R3xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KigmE/btqFApTBt5G/LK8dXm5shNkywK0iI5R3xk/img.png&quot; data-filename=&quot;스크린샷 2020-07-11 오후 6.06.01.png&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;498&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KigmE/btqFApTBt5G/LK8dXm5shNkywK0iI5R3xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKigmE%2FbtqFApTBt5G%2FLK8dXm5shNkywK0iI5R3xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1310&quot; height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위의 코드를 보면 값의 절대적 크기가 변하더라도 상대적 크기가 동일하다면 RMSE값은 변합니다. 따라서 RMSE와 달리 RMSLE는 예측값과 실제값의 상대적 Error를 측정해줍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ref [RMSLE의 한계]라는 글을 보시면 RMSLE의 상대적 Error 측정이 오히려 독이 되는 경우를 확인하실 수 있습니다.&lt;/p&gt;
&lt;p&gt;금전적인 부분을 예측하는 문제인데, RMSLE의 특성 때문에 큰 금액을 비슷하게 예측하는 것보다 적은 금액을 큰 차이 없이 예측하는 것이 더 좋게 나옵니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1억을 100억으로 잘못 예측하면 절대적으로는 99억이 차이나지만 error는 \(\log(10000000000+1)-\log(100000000+1)&amp;nbsp;=&amp;nbsp;\log(100)\)입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;0원을 99원으로 잘못 예측하면 99원이 차이나지만 error는 \(\log(99+1)-\log(0+1)&amp;nbsp;=&amp;nbsp;\log(100)\)입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위의 계산 결과를 보면 1억과 100억의 error가 0원과 99원의 error와 같다는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;상대적인 Error를 측정해주는 것이 장점도 있겠지만 이렇게 금전적인 부분의 Error 계산에선 좋지 않을 수도 있겠다는 생각이 듭니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Under Estimation에 큰 페널티를 부여한다.&lt;/h3&gt;
&lt;p&gt;RMSLE는 Over Estimation보다 Under Estimation에 더 큰 페널티를 부여합니다. 즉 예측값이 실제값보다 클 때보다 &lt;b&gt;예측값이 실제보다 작을 때 더 큰 페널티를 부여&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kOv3T/btqFAPLiEN3/1fhefLzmiUr3OzNRChYWfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kOv3T/btqFAPLiEN3/1fhefLzmiUr3OzNRChYWfK/img.png&quot; data-filename=&quot;스크린샷 2020-07-11 오후 6.16.14.png&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;512&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kOv3T/btqFAPLiEN3/1fhefLzmiUr3OzNRChYWfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkOv3T%2FbtqFAPLiEN3%2F1fhefLzmiUr3OzNRChYWfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1310&quot; height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3QL3f/btqFz3coWUd/WbhkxF1BKNOzmBCtJNXhkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3QL3f/btqFz3coWUd/WbhkxF1BKNOzmBCtJNXhkK/img.png&quot; data-filename=&quot;스크린샷 2020-07-11 오후 6.16.23.png&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;512&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3QL3f/btqFz3coWUd/WbhkxF1BKNOzmBCtJNXhkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3QL3f%2FbtqFz3coWUd%2FWbhkxF1BKNOzmBCtJNXhkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1310&quot; height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위의 코드와 같이 예측값과 실제값의 차이는 둘 다 400입니다. Over Estimation이든 Under Estimation이든 RMSE 값은 동일합니다. 하지만 RMSLE는 Under Estimation일 때 (즉 , 예측값이 실제값보다 작을 때) 더 높은 페널티가 주어집니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;배달 음식을 시킬 때 30분이 걸린다고 했는데 실제로 20분이 걸리는 건 큰 문제가 되지 않지만, 20분이 걸린다고 했는데 30분이 걸리면 고객이 화가 날 수가 있습니다. 이럴 때 RMSLE를 적용할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Ref&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dacon.io/forum/401171&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RMSLE의 한계&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bkshin.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-17-%ED%9A%8C%EA%B7%80-%ED%8F%89%EA%B0%80-%EC%A7%80%ED%91%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;머신러닝 - 17. 회귀 평가 지표&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Machine Learning/Basics</category>
      <author>JG Ahn</author>
      <guid isPermaLink="true">https://ahnjg.tistory.com/90</guid>
      <comments>https://ahnjg.tistory.com/90#entry90comment</comments>
      <pubDate>Sat, 11 Jul 2020 19:06:09 +0900</pubDate>
    </item>
    <item>
      <title>sparse_categorical_crossentropy와 categorical_crossentropy 비교</title>
      <link>https://ahnjg.tistory.com/88</link>
      <description>&lt;p&gt;categorical 문제를 풀기 위해 loss설정을 할 때 sparse_categorical_crossentropy와 categorical_crossentropy 중에서 고민이 될 수 있습니다. 본 게시글에서는 두 loss function이 어떤 차이점과 공통점을 가지는지 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Sparse_Categorical과 Categorical의 코드상 비교&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6uudp/btqFzbPWYd4/yICmZ1EcPHHLsiKGkvYng1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6uudp/btqFzbPWYd4/yICmZ1EcPHHLsiKGkvYng1/img.png&quot; data-filename=&quot;스크린샷 2020-07-11 오후 4.53.31.png&quot; data-origin-width=&quot;1644&quot; data-origin-height=&quot;366&quot; style=&quot;width: 51.3229%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6uudp/btqFzbPWYd4/yICmZ1EcPHHLsiKGkvYng1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6uudp%2FbtqFzbPWYd4%2FyICmZ1EcPHHLsiKGkvYng1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1644&quot; height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cElShN/btqFzzJCe41/CJkAAf73ldhkvWikX09pBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cElShN/btqFzzJCe41/CJkAAf73ldhkvWikX09pBk/img.png&quot; data-filename=&quot;스크린샷 2020-07-11 오후 4.53.55.png&quot; data-origin-width=&quot;1522&quot; data-origin-height=&quot;366&quot; style=&quot;width: 47.5143%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cElShN/btqFzzJCe41/CJkAAf73ldhkvWikX09pBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcElShN%2FbtqFzzJCe41%2FCJkAAf73ldhkvWikX09pBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;[좌] Sparse Categorical, [우] Categorical&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;두 코드를 보면 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;y_true의 입력이 다르다&lt;/span&gt;는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;Sparse Categorical에서 y_true는 일반 정수가 입력인 반면, Categorical에서 y_true는 one-hot vector인 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Loss 계산 결과를 보면 매우 유사&lt;/span&gt;한 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;실제로 계산 수식에 차이가 없기 때문에 정확도에 영향을 끼치지 않습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Sparse_Categorical_Crossentropy는 각 샘플이 오직 하나의 class에 속할 때 사용하고&lt;/p&gt;
&lt;p&gt;Categorical_Crossentropy는 각 샘플이 여러개의 class에 속할 수 있거나 label이 soft probablities 일 때 사용하는 것이 좋습니다. (e.g. [0.5, 0.3, 0.2)]&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Ref&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://datascience.stackexchange.com/questions/41921/sparse-categorical-crossentropy-vs-categorical-crossentropy-keras-accuracy&quot;&gt;Sparse_categorical_crossentropy vs categorical_crossentropy (keras, accuracy)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tensorflow.org/api_docs/python/tf/keras/losses/sparse_categorical_crossentropy&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;tf.keras.losses.sparse_categorical_crossentropy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tensorflow.org/api_docs/python/tf/keras/losses/categorical_crossentropy&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;tf.keras.losses.categorical_crossentropy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Machine Learning/Basics</category>
      <author>JG Ahn</author>
      <guid isPermaLink="true">https://ahnjg.tistory.com/88</guid>
      <comments>https://ahnjg.tistory.com/88#entry88comment</comments>
      <pubDate>Sat, 11 Jul 2020 17:03:44 +0900</pubDate>
    </item>
    <item>
      <title>[Statistics 110] Strategic Pratice 1 (ing)</title>
      <link>https://ahnjg.tistory.com/87</link>
      <description>&lt;p&gt;본 게시글의 원문은 &lt;a href=&quot;https://projects.iq.harvard.edu/files/stat110/files/strategic_practice_and_homework_1.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이곳&lt;/a&gt;에서 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Naive Definition of Probability&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. For each part, decide whether the blank should be filled in with =, &amp;lt;, or &amp;gt;, and give a short but clear explanation.&lt;/h3&gt;
&lt;p&gt;각 부분의 빈칸이 =, &amp;lt;, &amp;gt;중 어떤 것인지 결정하세요. 그리고 짧고 명료하게 설명하세요&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(a) (probability that the total after rolling 4 fair dice is 21) &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&amp;gt;&lt;/span&gt; (probability that the total after rolling 4 fair dice is 22)&lt;/h4&gt;
&lt;p&gt;4개의 주사위를 던진 후 합이 21일 확률, 4개의 주사위를 던진 후 합이 22일 확률&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;풀이&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4개의 주사위로 21이 나오는 경우는 (3, 6, 6, 6) -&amp;gt; 4, (4, 5, 6, 6) -&amp;gt; &lt;span style=&quot;color: #333333;&quot;&gt;\(&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4! / 2\) &lt;/span&gt;= 12, (5, 5, 5, 6) -&amp;gt; 4, 총 20입니다.&lt;/p&gt;
&lt;p&gt;4개의 주사위로 22가 나오는 경우는 (4, 6, 6, 6) -&amp;gt; 4, (5, 5, 6, 6) -&amp;gt; \(4! / 2^2\) = 6, 총 10입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;따라서 합이 21일 확률이 더 큽니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(b) (probability that a random 2 letter word is a palindrome) &lt;span style=&quot;background-color: #f6e199;&quot;&gt;=&lt;/span&gt; (probability that a random 3 letter word is a palindrome)&lt;/h4&gt;
&lt;p&gt;임의의 2개의 문자가 palindrome일 확률, 임의의 3개의 문자가 palinedrome일 확률&lt;/p&gt;
&lt;p&gt;(palindrome : 회문이라는 뜻으로 'eye', 'madam'처럼 역순으로 읽어도 같은 말이나 구절 또는 숫자를 말한다)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;임의의 2개의 문자가 회문일 경우의 수는 두 개의 문자가 모두 같은 경우로 26이 나옵니다. 여기에 두개의 문자가 나타낼 수 있는 모든 경우의 수 \(26 \times 26\)을 나눠주면 1/26이 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;임의의 3개의 문자가 회문일 경우의 수는 우선 첫 번째 문자와 세 번째 문자가 모두 같은 경우로 26이 나옵니다. 이때 2번째 문자가 어떤 것이 와도 회문이 되기 때문에 모든 경우의 수는 \(26^2\)가 됩니다. 여기에 세 개의 문자가 나타낼 수 있는 모든 경우의 수 \(26^3\)을 나눠주면 1/26이 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;두 경우 모두 1/26이 나오기 때문에 두 경우의 확률은 같습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;원본 풀이&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;2, 3개의 문자가 있을 때 회문은 첫 번째와 마지막 문자가 같으면 되기 때문에 확률이 같다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. A random 5 card poker hand is dealt from a standard deck of cards. Find the probability of each of the following (in terms of binomial coecients).&lt;/h3&gt;
&lt;p&gt;표준 카드덱에서 임의의 5장의 포커 패가 나옵니다. 다음 각 확률을 구합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(a) A flush (all 5 cards being of the same suit; do not count a royal flush, which is a flush with an Ace, King, Queen, Jack, and 10)&lt;/h4&gt;
&lt;p&gt;Flush가 나올 확률(5장의 카드가 모두 같은 모양, ace, king, queen, jack, 10으로 이루어진 flush인 royal flush는 카운트하지 않는다)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;모양의 종류는 총 4가지가 있고, 숫자카드 13개 중에서 5개를 뽑는데&amp;nbsp; 한 가지의 경우를 빼야 한다.&lt;/p&gt;
&lt;p&gt;$$\frac{4 \times (\binom{13}{5} - 1) }{\binom{52}{5}}$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(b) Two pair (e.g., two 3&amp;rsquo;s, two 7&amp;rsquo;s, and an Ace)&lt;/h4&gt;
&lt;p&gt;Two pair일 확률(One pair가 2개)&lt;/p&gt;
&lt;p&gt;13개의 숫자 중에서 2개의 숫자를 골라야 하고 각각의 숫자는 4개의 모양중 2개를 가져야 한다. 그러면 한자리가 남는데 나머지 한자리는 11가지 숫자에서 하나를 고르고, 4개의 모양중 하나를 고를 수 있다.&lt;/p&gt;
&lt;p&gt;$$\frac{\binom{13}{2}\times\binom{4}{2}^2\times\binom{11}{1}\times\binom{4}{1}}{\binom{52}{5}}$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(a) How many paths are there from the point (0, 0) to the point (110, 111) in the plane such that each step either consists of going one unit up or one unit to the right?&lt;/h4&gt;
&lt;p&gt;(0, 0)에서 (110, 111)로 가는 경로가 얼마나 있나요? 각 단계는 한 칸 오른쪽으로 가거나 위로 올라갈 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;(110, 111)까지 가는 경로를 U(up)과 R(right)의 시퀀스로 표현해보겠습니다. 시퀀스는 반드시 110개의 R과 111개의 U로 구성됩니다. 시퀀스를 결정하기 위해 R이 언제 올지만 생각하면 됩니다. 따라서 모든 가능한 경로는 221개에서 110개를 선택하는 경우입니다. (같은 방식으로 221개에서 111개를 선택하는 경우도 같습니다.)&lt;/p&gt;
&lt;p&gt;$$\binom{221}{110}$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(b) How many paths are there from (0, 0) to (210, 211), where each step consists of going one unit up or one unit to the right, and the path has to go through (110, 111)?&lt;/h4&gt;
&lt;p&gt;(0, 0)에서 (210, 211)로 가는 경로가 얼마나 있나요? 각 단계는 한 칸 오른쪽으로 가거나 위로 갈 수 있습니다. 그리고 (110, 111)을 지나야 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(0, 0)에서 출발하여 (110, 111)을 거쳐 (210, 211)로 가는 경우의 수는 (0, 0)에서 (110, 111)로 가는 경우의 수와 (110, 111)에서 (210, 211)으로 가는 경우의 수를 곱하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(0, 0)에서 (110, 111)로 가는 경우의 수는 위에서 계산한 바와 같이 \(&lt;span style=&quot;color: #333333;&quot;&gt;\binom{221}{110}&lt;/span&gt;\) 입니다.그리고 (110, 111)에서 (210, 211)로 가는 경우를 보면 100개의 U와 100개의 R이 있습니다. 따라서 (110, 111)에서 (210, 211)로 가는 경우의 수는 \(&lt;span style=&quot;color: #333333;&quot;&gt;\binom{200}{100}&lt;/span&gt;\) 입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;$$\binom{221}{110} \times \binom{200}{100}$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;4. A norepeatword is a sequence of at least one (and possibly all) of the usual 26 letters a,b,c,. . . ,z, with repetitions not allowed. For example, &amp;ldquo;course&amp;rdquo; is a norepeatword, but &amp;ldquo;statistics&amp;rdquo; is not. Order matters, e.g., &amp;ldquo;course&amp;rdquo; is not the same as &amp;ldquo;source&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;norepeatword는 a~z까지 26개 문자중 적어도 하나의 sequence이다. 문자는 반복되어서는 안된다.&lt;/p&gt;
&lt;p&gt;예를 들어, &quot;course&quot;는 norepeatword 이다. 하지만 &quot;statistics&quot;는 norepeatword가 아니다. (&quot;course&quot;는 &quot;source&quot;와 같지않다)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;A norepeatword is chosen randomly, with all norepeatwords equally likely. Show that the probability that it uses all 26 letters is very close to 1/e.&lt;/h4&gt;
&lt;p&gt;norepeatword는 &lt;span style=&quot;color: #333333;&quot;&gt;임의로 선택되며 모든 norepeatword는 동일한 가능성이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;26글자 norepeatword를 만들 확률이 1/e와 매우 근사하다는 것을 보이세요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;26글자를 모두 사용하는 norepeatword가 나올 확률은 26글자 norepeatword가 나오는 경우의 수를 1개~26개의 글자로 norepeatword를 만드는 모든 경우의 수로 나누어 주면 된다.&lt;/p&gt;
&lt;p&gt;$$P(26글자 \: norepeatword \: 나올 \:확률) = \frac{26글자를 \: 가지는 \: norepeatword \: 개수}{norepeatword \: 개수}$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(분자)26개의 문자를 가진 norepeatword의 수는 26개의 문자가 순서대로 배열된 것입니다. 따라서 \(26!)\입니다.&lt;/p&gt;
&lt;p&gt;(분모)1~26개의 문자를 가진 norepeatword의 수를 구하기 위해선 먼저 각 문자 개수별로 뽑힐 경우를 구하고 해당 개수의 문자들이 배열될 경우를 구해야합니다. 따라서 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;$$\sum_{k=1}^{26}{\binom{26}{k}}k!$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;분자와 분모를 다시 작성해보면 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;$$ \frac{26!}{\sum_{k=1}^{26}{\binom{26}{k}}k!} $$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;식을 조금 더 풀어보겠습니다. 아래의 식을 보면 26!과 1!~26!을 제거할 수 있다는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;$$\frac{26!}{\sum_{k=1}^{26}{\binom{26}{k}}k!} = \frac{26!}{\frac{26!}{25!1!}1!+\frac{26!}{24!2!}2!+...+\frac{26!}{1!25!}25!+\frac{26!}{0!26!}26!}$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;식에서 항들을 최대한 소거하면 아래와 같이 나옵니다.&lt;/p&gt;
&lt;p&gt;$$\frac{26!}{\frac{26!}{25!1!}1!+\frac{26!}{24!2!}2!+...+\frac{26!}{1!25!}25!+\frac{26!}{0!26!}26!} = \frac{1}{\frac{1}{25!}+\frac{1}{24!}+...+\frac{1}{1!}+1}$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;\(e^x\)가 어떤 식을 가지는지 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;$$e^x = \sum_{n=0}^{\infty}{\frac{x^n}{n!}}$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;\(e^x\)&lt;/span&gt;는 위와 같은 식을 가지는데 자연상수 e는 위의 식에 x=1을 넣은것과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$e^1&amp;nbsp;=&amp;nbsp;\sum_{n=0}^{\infty}{\frac{1^n}{n!}}&amp;nbsp;=&amp;nbsp;\sum_{n=0}^{\infty}{\frac{1}{n!}}&amp;nbsp;=&amp;nbsp;1&amp;nbsp;+&amp;nbsp;\frac{1}{1!}+\frac{1}{2!}+...$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;e의 값을 보면 위에서 구한 분모와 매우 유사하다는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;따라서 26글자의 norepeatword가 나올 확률은 1/e와 매우 근사합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. Story Proof&lt;/span&gt;&lt;/h1&gt;
&lt;h3&gt;&lt;span style=&quot;color: #333333;&quot;&gt;5. Give a story proof that \(\sum_{k=0}^{n}\binom{n}{k} = 2^n\)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;풀이&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;n명에서 k개의 부분집합을 구하는 경우다. k가 0~n까지 가기 때문에 &lt;b&gt;n개의 원소가 있는 집합에서 부분집합의 개수를 구한다&lt;/b&gt;고 볼 수 있다. 따라서 답은 \(2^n\)이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6. Give a story proof that \(\frac{(2n)!}{2^nn!}=(2n-1)(2n-3)...3\times 1\)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;color: #333333;&quot;&gt;7. Show that all positive integers n and k with n\(\ge\)k,&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$\binom{n}{k}+\binom{n}{k-1}=\binom{n+1}{k}$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Doing this two ways: (a) algebraically and (b) with a &quot;story&quot;, giving an integer-pretation for why both sides count the same thing. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$Hint\: for\: the\: &quot;Story&quot;\: proof: imagine\: n+1\: people,\: with\: one\: of\: them\:pre-designated\:as\:&quot;president&quot;$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Algebraically 풀이&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$\binom{n}{k}+\binom{n}{k-1}=\frac{n!}{(n-k)!k!}+\frac{n!}{(n-k+1)!(k-1)!}=\frac{n!}{(n-k)!(k-1)!}\left ( \frac{1}{k}+\frac{1}{(n-k+1)} \right)$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$\frac{n!}{(n-k)!(k-1)!}\left ( \frac{1}{k}+\frac{1}{(n-k+1)} \right)=\frac{n!}{(n-k)!(k-1)!}\left ( \frac{n+1}{k(n-k+1)} \right )=\frac{(n+1)!}{(n-k+1)!k!}$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$$\frac{(n+1)!}{(n-k+1)!k!}=\binom{n+1}{k}$$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Story Proof 풀이&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Mathematics/Harvard Statistics 110</category>
      <author>JG Ahn</author>
      <guid isPermaLink="true">https://ahnjg.tistory.com/87</guid>
      <comments>https://ahnjg.tistory.com/87#entry87comment</comments>
      <pubDate>Thu, 9 Jul 2020 02:22:03 +0900</pubDate>
    </item>
  </channel>
</rss>