<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>REC_ord_ING</title>
    <link>https://binrec.tistory.com/</link>
    <description>코드 기록 중 ▶</description>
    <language>ko</language>
    <pubDate>Tue, 14 Jul 2026 15:19:47 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>빈이즈</managingEditor>
    <image>
      <title>REC_ord_ING</title>
      <url>https://tistory1.daumcdn.net/tistory/6922731/attach/8c0178733b6845a09053ed5c6b039868</url>
      <link>https://binrec.tistory.com</link>
    </image>
    <item>
      <title>[딥러닝을 이용한 자연어 처리 입문] Chapter 8. 순환 신경망 (Recurrent Neural Network) (2)</title>
      <link>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-8-%EC%88%9C%ED%99%98-%EC%8B%A0%EA%B2%BD%EB%A7%9D-Recurrent-Neural-Network-2</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1;&quot; href=&quot;https://wikidocs.net/48558&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;이 글은 [&lt;/span&gt;&lt;/a&gt;&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/6876&quot;&gt;유원준&lt;/a&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://wikidocs.net/48558&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #808080; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/13671&quot;&gt;상준&lt;/a&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://wikidocs.net/48558&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;]의 [딥러닝을 이용한 자영어 처리 입문]에서 가져온 내용이며, [크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스](&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot;&gt;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;)에 따라 사용되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wikidocs.net/48558&quot;&gt;https://wikidocs.net/48558&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743553698013&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;08. 순환 신경망(Recurrent Neural Network)&quot; data-og-description=&quot;앞서 배운 피드 포워드 신경망은 입력의 길이가 고정되어 있어 자연어 처리를 위한 신경망으로는 한계가 있었습니다. 결국 다양한 길이의 입력 시퀀스를 처리할 수 있는 인공 신경망이 &amp;hellip;&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/48558&quot; data-og-url=&quot;https://wikidocs.net/48558&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/N2AWF/hyYyQj7TMr/SQGiWkNIT0zolVf5U3X4jk/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130&quot;&gt;&lt;a href=&quot;https://wikidocs.net/48558&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/48558&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/N2AWF/hyYyQj7TMr/SQGiWkNIT0zolVf5U3X4jk/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;08. 순환 신경망(Recurrent Neural Network)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;앞서 배운 피드 포워드 신경망은 입력의 길이가 고정되어 있어 자연어 처리를 위한 신경망으로는 한계가 있었습니다. 결국 다양한 길이의 입력 시퀀스를 처리할 수 있는 인공 신경망이 &amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;08-05&amp;nbsp;RN&amp;nbsp;언어&amp;nbsp;모델&amp;nbsp;(Recurrent&amp;nbsp;Neural&amp;nbsp;Network&amp;nbsp;Language&amp;nbsp;Model,&amp;nbsp;RNNLM) &lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. RNN 언어 모델(Recurrent Neural Network Language Model, RNNLM)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;- n-gram, NNLM은 고정된 개수의 단어만을 입력으로 받아야 함 -&amp;gt; '시점'이라는 개념이 도입된 RNN은 입력의 길이를 고정하지 않을 수 있음! -&amp;gt; RNN으로 만든 언어모델을 RNNLM(Recurrent Neural Network Model)이라고 함 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;예문 : 'what will the fat cat sit on' &lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;- RNNLM은 &lt;b&gt;이전 시점의 출력을 현재 시점의 입력&lt;/b&gt;으로 함. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;- 예문으로 보면 RNNLM은 &lt;u&gt;what&lt;/u&gt;을 입력받으면 &lt;u&gt;will&lt;/u&gt;을 예측하고, 이 will은 다음 시점의 입력이 되어 &lt;u&gt;the&lt;/u&gt;를 예측. 결과적으로 세번째 시점에서 fat은 앞서 나온 what, will, the 라는 시퀀스로 인해 결정된 단어, 네번째 시점의 cat은 앞서 나온 what, wil, the, fat이라는 시퀀스로 인해 결정된 단어이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;- 위 과정은 훈련이 끝난 모델의 테스트 과정 동안(실제 사용할 때)의 이야기이고, 훈련 과정에서는 이전 시점의 예측 결과를 다음 시점의 입력으로 넣으면서 예측 X -&amp;gt; what will the fat cat is sit on라는 훈련 샘플이 있다면, what aill the fat cat sit 시퀀스를 모델의 입력으로 넣으면, will the fat cat sit on 을 예측하도록 훈련됨. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;-&amp;nbsp;이러한&amp;nbsp;RNN&amp;nbsp;훈련&amp;nbsp;기법을&amp;nbsp;&lt;b&gt;교사&amp;nbsp;강요&lt;/b&gt;(teacher&amp;nbsp;forcing)라고&amp;nbsp;함.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;- 교사 강요란 &lt;b&gt;테스트 과정&lt;/b&gt;에서 &lt;u&gt;t시점의 출력이 t+1 시점의 입력으로 사용되는 RNN 모델&lt;/u&gt;을 &lt;b&gt;훈련시킬 때 사용하는 훈련 기법&lt;/b&gt;으로, 모델이 t시점에서 예측한 값을 t+1 시점에 입력으로 사용하지 않고, t 시점의 레이블, 즉 실제 알고 있는 정답을 t+1 시점의 입력으로 사용.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;-&amp;nbsp;출력층에서&amp;nbsp;사용하는&amp;nbsp;&lt;b&gt;활성화&amp;nbsp;함수&lt;/b&gt;는&amp;nbsp;&lt;u&gt;소프트맥스&amp;nbsp;함수,&lt;/u&gt;&amp;nbsp;&lt;b&gt;손실함수&lt;/b&gt;는&amp;nbsp;&lt;u&gt;크로스&amp;nbsp;엔트로피&amp;nbsp;함수&lt;/u&gt;를&amp;nbsp;사용함. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;-&amp;nbsp;RNNLM은&amp;nbsp;총&amp;nbsp;4개의&amp;nbsp;층으로&amp;nbsp;이루어진&amp;nbsp;인공&amp;nbsp;신경망.&amp;nbsp;현&amp;nbsp;시점을&amp;nbsp;4로&amp;nbsp;가정.&amp;nbsp;4번째&amp;nbsp;입력&amp;nbsp;단어&amp;nbsp;fat의&amp;nbsp;원-핫&amp;nbsp;벡터가&amp;nbsp;입력이&amp;nbsp;됨. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;- 출력층을 보자. 모델이 예측해야하는 정답에 해당하는 단어 cat의 원-핫 벡터는 출력층에서 모델이 예측한 값의 오차를 구하기 위해 사용될 예정 =&amp;gt; 이 오차로부터 손실 함수를 사용해 인공 신경망 학습.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;- 현 시점의 입력 단어의 원-핫 벡터 xt를 입력 받은 RNNLM은 &lt;b&gt;임베딩층&lt;/b&gt;(embedding layer)을 지남. 이 임베딩층은 기본적으로 NNLM에서 배운 투사층. NNLM에서는 룩업 테이블을 수행하는 층을 투사층이라고 표현했지만, 이미 투사층의 결과로 얻는 벡터를 임베딩 벡터라고 부른다고 했으므로, 앞으로는 임베딩 벡터를 얻는 투사층을 임베딩층이라는 표현으로 사용. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;-&amp;nbsp;단어&amp;nbsp;집합의&amp;nbsp;크기가&amp;nbsp;V일&amp;nbsp;때,&amp;nbsp;임베딩&amp;nbsp;벡터의&amp;nbsp;크기를&amp;nbsp;M으로&amp;nbsp;설정하면,&amp;nbsp;각&amp;nbsp;입력&amp;nbsp;단어들은&amp;nbsp;임베딩층에서&amp;nbsp;&lt;u&gt;V&amp;nbsp;X&amp;nbsp;M&amp;nbsp;크기의&amp;nbsp;임베딩&amp;nbsp;행렬과&amp;nbsp;곱해짐.&lt;/u&gt;&amp;nbsp;여기서&amp;nbsp;&lt;b&gt;V는&amp;nbsp;단어&amp;nbsp;집합의&amp;nbsp;크기&lt;/b&gt;를&amp;nbsp;의미.&amp;nbsp;그리고&amp;nbsp;이&amp;nbsp;임베딩&amp;nbsp;행렬은&amp;nbsp;역전파&amp;nbsp;과정에서&amp;nbsp;다른&amp;nbsp;가중치들과&amp;nbsp;함께&amp;nbsp;학습됨. &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;임베딩층 : et = lookup(xt)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;-&amp;nbsp;이&amp;nbsp;임베딩&amp;nbsp;벡터는&amp;nbsp;은닉층에서&amp;nbsp;&lt;b&gt;이전&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태인&amp;nbsp;h_(t-1)과&amp;nbsp;함께&amp;nbsp;다음의&amp;nbsp;연산&lt;/b&gt;을&amp;nbsp;하여&amp;nbsp;&lt;u&gt;현재&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태&amp;nbsp;ht를&amp;nbsp;계산&lt;/u&gt;하게&amp;nbsp;됨.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;은닉층 : ht = tanh(Wxet + Whh_(t-1) + b) &lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;- 출력층에서는 활성화 함수를&lt;b&gt; 소프트맥스 함수&lt;/b&gt;를 사용하는데, V차원의 벡터는 소프트맥스 함수를 지나면서&lt;b&gt; 0과 1사이의 실수값&lt;/b&gt;을 가지며 총 합은 1이 되는 상태로 바뀜. 이렇게 나온 벡터를 RNNLM의 t시점의 예측값이라는 의미에서 yt hat이라고 하자.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;출력층 : yt hat&amp;nbsp;&amp;nbsp;= softmax(Wy ht + b) &lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;-&amp;nbsp;yt&amp;nbsp;hat의&amp;nbsp;각&amp;nbsp;차원&amp;nbsp;안에서의&amp;nbsp;값이&amp;nbsp;의미하는&amp;nbsp;것은&amp;nbsp;&lt;u&gt;j번째&amp;nbsp;인덱스가&amp;nbsp;가진&amp;nbsp;0과&amp;nbsp;1&amp;nbsp;사이의&amp;nbsp;값은&amp;nbsp;j번째&amp;nbsp;단어가&amp;nbsp;다음&amp;nbsp;단어일&amp;nbsp;확률&lt;/u&gt;을 나타냄. 그리고 &lt;u&gt;실제 정답에 해당하는 단어인 원-핫 벡터의 값에 가까워져야 함&lt;/u&gt;. &lt;b&gt;손실함수로 cross-entropy&lt;/b&gt;함수를 사용. 역전파가 이루어지면서 가중치 행렬들이 학습되는데 이 과정에서 임베딩 벡터값들도 학습됨. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;- 룩업 테이블의 대상이 되는 테이블인 임베딩 행렬은 E라고 하였을 때, 결과적으로 RNNLM에서 학습 과정에서 학습되는 가중치 행렬은 다음의 E, Wx, Wh, Wy이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;08-06&amp;nbsp;RNN을&amp;nbsp;이용한&amp;nbsp;텍스트&amp;nbsp;생성(Text&amp;nbsp;Generation&amp;nbsp;using&amp;nbsp;RNN)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다 대 일 (many-to-one) 구조의 RNN을 사용하여 문맥을 반영해서 텍스트를 생성하는 모델을 만들어보자. &lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;1.&amp;nbsp;RNN을&amp;nbsp;이용하여&amp;nbsp;텍스트&amp;nbsp;생성하기 &lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;예를&amp;nbsp;들어서&amp;nbsp;'경마장에&amp;nbsp;있는&amp;nbsp;말이&amp;nbsp;뛰고&amp;nbsp;있다'와&amp;nbsp;'그의&amp;nbsp;말이&amp;nbsp;법이다'와&amp;nbsp;'가는&amp;nbsp;말이&amp;nbsp;고와야&amp;nbsp;오는&amp;nbsp;말이&amp;nbsp;곱다'라는&amp;nbsp;세&amp;nbsp;가지&amp;nbsp;문장이&amp;nbsp;있다고&amp;nbsp;해보자.&amp;nbsp;모델이&amp;nbsp;문맥을&amp;nbsp;학습할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;전체&amp;nbsp;문장의&amp;nbsp;앞의&amp;nbsp;단어들을&amp;nbsp;전부&amp;nbsp;고려하여&amp;nbsp;학습하도록&amp;nbsp;데이터를&amp;nbsp;재구성한다면&amp;nbsp;아래와&amp;nbsp;같이&amp;nbsp;11개의&amp;nbsp;샘플이&amp;nbsp;구성됨.&amp;nbsp;(ex,&amp;nbsp;경마장에|있는,&amp;nbsp;경마장에&amp;nbsp;있는&amp;nbsp;|말이,&amp;nbsp;...) &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;1)&amp;nbsp;데이터에&amp;nbsp;대한&amp;nbsp;이해와&amp;nbsp;전처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743554683581&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
from tensorflow.keras.preprocessing. text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.utilis import to_categorical

# 세 문장 저장
text = &quot;&quot;&quot;경마장에 있는 말이 뛰고 있다\n
그의 말이 법이다\n
가는 말이 고와야 오는 말이 곱다\n&quot;&quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;단어&amp;nbsp;집합을&amp;nbsp;생성하고&amp;nbsp;크기를&amp;nbsp;확인해보자.&amp;nbsp;단어&amp;nbsp;집합의&amp;nbsp;크기를&amp;nbsp;저장할&amp;nbsp;때는&amp;nbsp;케라스&amp;nbsp;토크나이저의&amp;nbsp;정수&amp;nbsp;인코딩은&amp;nbsp;인덱스가&amp;nbsp;1부터&amp;nbsp;시작하지만,&amp;nbsp;패딩을&amp;nbsp;위한&amp;nbsp;0을&amp;nbsp;고려하여&amp;nbsp;+1을&amp;nbsp;해주기&lt;/p&gt;
&lt;pre id=&quot;code_1743554704864&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tokenizer = Tokenizer()
tokenizer.fit_on_texts([text])
vocab_size = len(tokenizer.word_index)+1
print('단어 집합의 크기 : %d' % vocab_size)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;출력&amp;nbsp; &lt;br /&gt;단어&amp;nbsp;집합의&amp;nbsp;크기&amp;nbsp;:&amp;nbsp;12 &lt;br /&gt;- 각 단어와 단어에 부여된 정수 인덱스 출력 &lt;/p&gt;
&lt;pre id=&quot;code_1743554718684&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(tokenizer.word_index)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 출력 &lt;br /&gt;{'말이':&amp;nbsp;1,&amp;nbsp;'경마장에':&amp;nbsp;2,&amp;nbsp;'있는':&amp;nbsp;3,&amp;nbsp;'뛰고':&amp;nbsp;4,&amp;nbsp;'있다':&amp;nbsp;5,&amp;nbsp;'그의':&amp;nbsp;6,&amp;nbsp;'법이다':&amp;nbsp;7,&amp;nbsp;'가는':&amp;nbsp;8,&amp;nbsp;'고와야':&amp;nbsp;9,&amp;nbsp;'오는':&amp;nbsp;10,&amp;nbsp;'곱다':&amp;nbsp;11} &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;훈련&amp;nbsp;데이터&amp;nbsp;만들기 &lt;/p&gt;
&lt;pre id=&quot;code_1743554729464&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sequences = list()
for line in text.split('\n'):  # 줄 바꿈 문자를 기준으로 문장 토큰화
   encoded = tokenizer.texts_to_sequences([line])[0]
   for i n range(1, len(encoded)):
      sequence = encoded[:i+1]
      sequences.append(sequence)
print('학습에 사용할 샘플의 개수 : %d' % len(sequences))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;학습에&amp;nbsp;사용할&amp;nbsp;샘플의&amp;nbsp;개수:&amp;nbsp;11 &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;샘플의&amp;nbsp;개수는&amp;nbsp;총&amp;nbsp;11개가&amp;nbsp;나옴 &lt;/p&gt;
&lt;pre id=&quot;code_1743554742568&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(sequences)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[[2, 3], [2, 3, 1], [2, 3, 1, 4], [2, 3, 1, 4, 5], [6, 1], [6, 1, 7], [8, 1], [8, 1, 9], [8, 1, 9, 10], [8, 1, 9, 10, 1], [8, 1, 9, 10, 1, 11]] &lt;br /&gt;&lt;br /&gt;- [2,3]은 [경마장에, 있는]에 해당되며 [2,3,1]은 [경마장에, 있는, 말이]에 해당 =&amp;gt; &lt;b&gt;맨 우측 단어를 레이블로 분리&lt;/b&gt;해야 함.&lt;br /&gt;-&amp;nbsp;우선&amp;nbsp;전체&amp;nbsp;샘플에&amp;nbsp;대해&amp;nbsp;길이를&amp;nbsp;일치시키기.&amp;nbsp;가장&amp;nbsp;긴&amp;nbsp;샘플&amp;nbsp;길이인&amp;nbsp;6을&amp;nbsp;기준으로. &lt;/p&gt;
&lt;pre id=&quot;code_1743554806438&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;max_len = max(len(1) for l in sequences) # 모든 샘플에서 길이가 가장 긴 샘플의 길이 출력
print('샘플의 최대 길이 : {}'.format(max_len))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;샘플의&amp;nbsp;최대&amp;nbsp;길이&amp;nbsp;:&amp;nbsp;6 &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;전체&amp;nbsp;샘플의&amp;nbsp;길이를&amp;nbsp;6으로&amp;nbsp;패딩.&amp;nbsp;'pre'로&amp;nbsp;padding함으로써&amp;nbsp;6보다&amp;nbsp;짧은&amp;nbsp;샘플의&amp;nbsp;앞을&amp;nbsp;0으로&amp;nbsp;채우기 &lt;/p&gt;
&lt;pre id=&quot;code_1743554820324&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sequences = pad_sequences(sequences, maxlen=max_len, padding ='pre')
print(sequences)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;[[&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;3] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;3&amp;nbsp;&amp;nbsp;1] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;3&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;4] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;3&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;4&amp;nbsp;&amp;nbsp;5] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;6&amp;nbsp;&amp;nbsp;1] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;6&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;7] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;8&amp;nbsp;&amp;nbsp;1] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;8&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;9] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;8&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;9&amp;nbsp;10] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;8&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;9&amp;nbsp;10&amp;nbsp;&amp;nbsp;1] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;8&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;9&amp;nbsp;10&amp;nbsp;&amp;nbsp;1&amp;nbsp;11]] &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;이제&amp;nbsp;각&amp;nbsp;샘플의&amp;nbsp;마지막&amp;nbsp;단어를&amp;nbsp;레이블로&amp;nbsp;분리. &lt;/p&gt;
&lt;pre id=&quot;code_1743554830873&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sequences = np.array(sequences)
X = sequences[:, :-1]
y = sequences[:, -1]
print(X)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;[[&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;2] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;3] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;3&amp;nbsp;&amp;nbsp;1] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;3&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;4] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;6] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;6&amp;nbsp;&amp;nbsp;1] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;8] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;8&amp;nbsp;&amp;nbsp;1] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;8&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;9] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;0&amp;nbsp;&amp;nbsp;8&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;9&amp;nbsp;10] &lt;br /&gt;&amp;nbsp;[&amp;nbsp;8&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;9&amp;nbsp;10&amp;nbsp;&amp;nbsp;1]] &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743554841013&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(y)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 출력: &lt;br /&gt;[&amp;nbsp;3&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;4&amp;nbsp;&amp;nbsp;5&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;7&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;9&amp;nbsp;10&amp;nbsp;&amp;nbsp;1&amp;nbsp;11] &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;훈련&amp;nbsp;전&amp;nbsp;레이블에&amp;nbsp;대해서&amp;nbsp;원-핫&amp;nbsp;인코딩&amp;nbsp;수행 &lt;/p&gt;
&lt;pre id=&quot;code_1743554852641&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;y = to_categorical(y, num_classes = vocab_size)
print(y)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;[[0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;1.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.]&amp;nbsp;#&amp;nbsp;3에&amp;nbsp;대한&amp;nbsp;원-핫&amp;nbsp;벡터 &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;1.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.]&amp;nbsp;#&amp;nbsp;1에&amp;nbsp;대한&amp;nbsp;원-핫&amp;nbsp;벡터 &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;1.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.]&amp;nbsp;#&amp;nbsp;4에&amp;nbsp;대한&amp;nbsp;원-핫&amp;nbsp;벡터 &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;1.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.]&amp;nbsp;#&amp;nbsp;5에&amp;nbsp;대한&amp;nbsp;원-핫&amp;nbsp;벡터 &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;1.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.]&amp;nbsp;#&amp;nbsp;1에&amp;nbsp;대한&amp;nbsp;원-핫&amp;nbsp;벡터 &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;1.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.]&amp;nbsp;#&amp;nbsp;7에&amp;nbsp;대한&amp;nbsp;원-핫&amp;nbsp;벡터 &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;1.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.]&amp;nbsp;#&amp;nbsp;1에&amp;nbsp;대한&amp;nbsp;원-핫&amp;nbsp;벡터 &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;1.&amp;nbsp;0.&amp;nbsp;0.]&amp;nbsp;#&amp;nbsp;9에&amp;nbsp;대한&amp;nbsp;원-핫&amp;nbsp;벡터 &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;1.&amp;nbsp;0.]&amp;nbsp;#&amp;nbsp;10에&amp;nbsp;대한&amp;nbsp;원-핫&amp;nbsp;벡터 &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;1.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.]&amp;nbsp;#&amp;nbsp;1에&amp;nbsp;대한&amp;nbsp;원-핫&amp;nbsp;벡터 &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;1.]]&amp;nbsp;#&amp;nbsp;11에&amp;nbsp;대한&amp;nbsp;원-핫&amp;nbsp;벡터 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;2)&amp;nbsp;모델&amp;nbsp;설계하기 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하이퍼 파라미터인 임베딩 벡터의 차원은 10, 은닉 상태의 크기는 32. 다 대 일 구조의 RNN을 사용. 전결합층을 출력층으로 단어 집합 크기만큼의 뉴런을 배치하여 모델을 설계.&amp;nbsp; &lt;br /&gt;- 해당 모델은 마지막 시점에서 모든 가능한 단어 중 하나의 단어를 예측하는 다중 클래스 분류 문제를 수행하는 모델 =&amp;gt; 출력층에 소프트맥스 회귀를 사용해야 하므로 활성화 함수로 &lt;b&gt;소프트맥스 함수&lt;/b&gt;, 손실 함수로 &lt;b&gt;크로스 엔트로피 함수&lt;/b&gt;를 사용하여 200에포크 수행 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743554872642&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, Dense, SimpleRNN

embdding_dim = 10
hidden_units = 32
model = Sequential()
model.add(Embedding(vocab_size, embedding_dim))
model.add(SimpleRNN(hidden_units))
model.add(Dense(vocab_Size, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer = 'adam', merics= ['accuracy'])
model.fit(X, y, epochs = 200, verbose=2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;문장을&amp;nbsp;정확하게&amp;nbsp;예측하고&amp;nbsp;있는지&amp;nbsp;문장을&amp;nbsp;생성하는&amp;nbsp;함수를&amp;nbsp;만들어서&amp;nbsp;출력해보자 &lt;/p&gt;
&lt;pre id=&quot;code_1743554915856&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def sentence_generation(modek, tokenizer, current_word, n) : # 모델, 토크나이저, 현재 단어, 반복활 횟수
   init_word = current_word
   sentence = ''
   # n번 반복
   for _ in range(n) :
      #현재 단어에 대한 정수 인코딩과 패딩
      encoded = tokinizer.texts_to_sequences({current_word])[0]
      encoded = pad_sequences({encoded], maxlen=5, padding = 'pre')
      # 입력한 x(현재 단어)에 대해서 Y를 예측하고 Y(예측한 단어)를 result에 저장
      result = model.predict(Encoded, verbose = 0
      result = np.argmax(result, axis = 1)
   
      for =word, index in tokenizer.word_index.items() :
         # 만약 예측한 단어와 인덱스와 동일한 단어가 있다면 break
         if index == result :
            break
      # 현재 단어 _ ' ' +예측 단어를 현재 단어로 변경
      current_word = current_word + ' ' + word
   
      # 예측 단어를 문장에 저장
      sentence = sentence + ' ' + word
   sentence = init_word+sentence
   return sentence&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;- 입력된 단어로부터 다음 단어를 예측해서 문장을 생성하는 함수를 만들었다. '경마장에'라는 단어 뒤에는 총 4개의 단어가 있으므로 4번 예측해봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743554951517&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(sentence_generation(mode, tokenizer, '경마장에', 4))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- 출력: &lt;br /&gt;경마장에&amp;nbsp;있는&amp;nbsp;말이&amp;nbsp;뛰고&amp;nbsp;있다 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743554970246&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(sentence_generation(model, tokenizer, '그의', 2))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;그의&amp;nbsp;말이&amp;nbsp;법이다 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743554979389&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(sentence_generation(model, tokenizer, '가는', 5))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;가는&amp;nbsp;말이&amp;nbsp;고와야&amp;nbsp;오는&amp;nbsp;말이&amp;nbsp;곱다 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;2.&amp;nbsp;LSTM을&amp;nbsp;이용한&amp;nbsp;텍스트&amp;nbsp;생성하기 &lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1)&amp;nbsp;데이터에&amp;nbsp;대한&amp;nbsp;이해와&amp;nbsp;전처리 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;사용할&amp;nbsp;데이터&amp;nbsp;:&amp;nbsp;뉴욕&amp;nbsp;타임즈&amp;nbsp;기사의&amp;nbsp;제목 &lt;/p&gt;
&lt;pre id=&quot;code_1743554998733&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd
improt numpy as np
from string import punctuation
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.utils import to_categorical

df = pd.read_csv('ArticlesApril2018.csv')
print('열의 개수: ', len(df.columns))
print(df.columns)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;열의&amp;nbsp;개수:&amp;nbsp;&amp;nbsp;15 &lt;br /&gt;Index(['articleID',&amp;nbsp;'articleWordCount',&amp;nbsp;'byline',&amp;nbsp;'documentType',&amp;nbsp;'headline', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'keywords',&amp;nbsp;'multimedia',&amp;nbsp;'newDesk',&amp;nbsp;'printPage',&amp;nbsp;'pubDate', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'sectionName',&amp;nbsp;'snippet',&amp;nbsp;'source',&amp;nbsp;'typeOfMaterial',&amp;nbsp;'webURL'],&amp;nbsp;dtype='object') &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;총&amp;nbsp;15개의&amp;nbsp;열이&amp;nbsp;있음.&amp;nbsp;여기서&amp;nbsp;사용할&amp;nbsp;열은&amp;nbsp;headline&amp;nbsp;열.&amp;nbsp;결측이&amp;nbsp;있는지&amp;nbsp;확인 &lt;/p&gt;
&lt;pre id=&quot;code_1743555011210&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(df['headline'].isnull().values.any())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;False &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743555022853&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;headline = []
headline.extend(list(Df.headline.values))
headline[:5]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;['Former&amp;nbsp;N.F.L.&amp;nbsp;Cheerleaders&amp;rsquo;&amp;nbsp;Settlement&amp;nbsp;Offer:&amp;nbsp;$1&amp;nbsp;and&amp;nbsp;a&amp;nbsp;Meeting&amp;nbsp;With&amp;nbsp;Goodell', &lt;br /&gt;&amp;nbsp;'E.P.A.&amp;nbsp;to&amp;nbsp;Unveil&amp;nbsp;a&amp;nbsp;New&amp;nbsp;Rule.&amp;nbsp;Its&amp;nbsp;Effect:&amp;nbsp;Less&amp;nbsp;Science&amp;nbsp;in&amp;nbsp;Policymaking.', &lt;br /&gt;&amp;nbsp;'The&amp;nbsp;New&amp;nbsp;Noma,&amp;nbsp;Explained', &lt;br /&gt;&amp;nbsp;'Unknown', &lt;br /&gt;&amp;nbsp;'Unknown'] &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;네번째와&amp;nbsp;다섯&amp;nbsp;번째&amp;nbsp;샘플에&lt;b&gt;&amp;nbsp;Unknown&amp;nbsp;값&lt;/b&gt;이&amp;nbsp;들어가&amp;nbsp;있음.&amp;nbsp;Null은&amp;nbsp;아니지만&amp;nbsp;실습에&amp;nbsp;도움이&amp;nbsp;되지&amp;nbsp;않는&amp;nbsp;노이즈&amp;nbsp;데이터이므로&amp;nbsp;&lt;b&gt;제거&lt;/b&gt;해줄&amp;nbsp;필요가&amp;nbsp;있음. &lt;/p&gt;
&lt;pre id=&quot;code_1743555039445&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;headline = [word for word in headline if word != &quot;Unknown&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;- 이제 데이터 전처리 중 &lt;b&gt;구두점 제거와 단어의 소문자화&lt;/b&gt;를 수행하자 &lt;/p&gt;
&lt;pre id=&quot;code_1743555055128&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def repreprocessing(rasw_sentence) :
   prtprocessed_sentence = rasw_sentence.encode(&quot;utf8&quot;),decode(&quot;ascii&quot;, 'ignore')
   # 구두점 제거와 동시에 소문자화
   return ' '.join(word for word in preprocessed_sentence if word in punctuation.lower()

preprocessed_headline = [repreprocessing(x) for x in headline]
preprocessed_headline[:5]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;['former&amp;nbsp;nfl&amp;nbsp;cheerleaders&amp;nbsp;settlement&amp;nbsp;offer&amp;nbsp;1&amp;nbsp;and&amp;nbsp;a&amp;nbsp;meeting&amp;nbsp;with&amp;nbsp;goodell', &lt;br /&gt;&amp;nbsp;'epa&amp;nbsp;to&amp;nbsp;unveil&amp;nbsp;a&amp;nbsp;new&amp;nbsp;rule&amp;nbsp;its&amp;nbsp;effect&amp;nbsp;less&amp;nbsp;science&amp;nbsp;in&amp;nbsp;policymaking', &lt;br /&gt;&amp;nbsp;'the&amp;nbsp;new&amp;nbsp;noma&amp;nbsp;explained', &lt;br /&gt;&amp;nbsp;'how&amp;nbsp;a&amp;nbsp;bag&amp;nbsp;of&amp;nbsp;texas&amp;nbsp;dirt&amp;nbsp;&amp;nbsp;became&amp;nbsp;a&amp;nbsp;times&amp;nbsp;tradition', &lt;br /&gt;&amp;nbsp;'is&amp;nbsp;school&amp;nbsp;a&amp;nbsp;place&amp;nbsp;for&amp;nbsp;selfexpression'] &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;이제&amp;nbsp;단어집합(vocabulary)을&amp;nbsp;만들고&amp;nbsp;크기&amp;nbsp;확인 &lt;/p&gt;
&lt;pre id=&quot;code_1743555095027&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tokenizer = Tokenizer()
tokenizer.fit_on_texts(preprocessed_headline)
vocab_size = len(tokenizer.word_index) + 1)
print('단어 집합의 크기 : %d' % vocab_size)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;단어&amp;nbsp;집합의&amp;nbsp;크기&amp;nbsp;:&amp;nbsp;3494 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743555105114&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 총 3494개 단어 존재. 정수 인코딩과 동시에 하나의 문장을 여러 줄로 분해하여 훈련데이터를 구성.
sequences = list()
for sentence in preprocessed_headline:
   # 각 샘플에 대한 정수 인코딩
   encoded = tokenizer.texts_to_sequences([sentence])[0]
   for i in range(1, len(Encoed):
      sequence = encoded[:i+1]
      sequences.append(sequence)
sequences[:11]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력:&amp;nbsp; &lt;br /&gt;[[99,&amp;nbsp;269],&amp;nbsp;#&amp;nbsp;former&amp;nbsp;nfl &lt;br /&gt;&amp;nbsp;[99,&amp;nbsp;269,&amp;nbsp;371],&amp;nbsp;#&amp;nbsp;former&amp;nbsp;nfl&amp;nbsp;cheerleaders &lt;br /&gt;&amp;nbsp;[99,&amp;nbsp;269,&amp;nbsp;371,&amp;nbsp;1115],&amp;nbsp;#&amp;nbsp;former&amp;nbsp;nfl&amp;nbsp;cheerleaders&amp;nbsp;settlement &lt;br /&gt;&amp;nbsp;[99,&amp;nbsp;269,&amp;nbsp;371,&amp;nbsp;1115,&amp;nbsp;582],&amp;nbsp;#&amp;nbsp;former&amp;nbsp;nfl&amp;nbsp;cheerleaders&amp;nbsp;settlement&amp;nbsp;offer &lt;br /&gt;&amp;nbsp;[99,&amp;nbsp;269,&amp;nbsp;371,&amp;nbsp;1115,&amp;nbsp;582,&amp;nbsp;52],&amp;nbsp;#&amp;nbsp;'former&amp;nbsp;nfl&amp;nbsp;cheerleaders&amp;nbsp;settlement&amp;nbsp;offer&amp;nbsp;1 &lt;br /&gt;&amp;nbsp;[99,&amp;nbsp;269,&amp;nbsp;371,&amp;nbsp;1115,&amp;nbsp;582,&amp;nbsp;52,&amp;nbsp;7],&amp;nbsp;#&amp;nbsp;former&amp;nbsp;nfl&amp;nbsp;cheerleaders&amp;nbsp;settlement&amp;nbsp;offer&amp;nbsp;1&amp;nbsp;and &lt;br /&gt;&amp;nbsp;[99,&amp;nbsp;269,&amp;nbsp;371,&amp;nbsp;1115,&amp;nbsp;582,&amp;nbsp;52,&amp;nbsp;7,&amp;nbsp;2],&amp;nbsp;#&amp;nbsp;...&amp;nbsp;이하&amp;nbsp;생략&amp;nbsp;... &lt;br /&gt;&amp;nbsp;[99,&amp;nbsp;269,&amp;nbsp;371,&amp;nbsp;1115,&amp;nbsp;582,&amp;nbsp;52,&amp;nbsp;7,&amp;nbsp;2,&amp;nbsp;372], &lt;br /&gt;&amp;nbsp;[99,&amp;nbsp;269,&amp;nbsp;371,&amp;nbsp;1115,&amp;nbsp;582,&amp;nbsp;52,&amp;nbsp;7,&amp;nbsp;2,&amp;nbsp;372,&amp;nbsp;10], &lt;br /&gt;&amp;nbsp;[99,&amp;nbsp;269,&amp;nbsp;371,&amp;nbsp;1115,&amp;nbsp;582,&amp;nbsp;52,&amp;nbsp;7,&amp;nbsp;2,&amp;nbsp;372,&amp;nbsp;10,&amp;nbsp;1116],&amp;nbsp;#&amp;nbsp;모든&amp;nbsp;단어가&amp;nbsp;사용된&amp;nbsp;완전한&amp;nbsp;첫번째&amp;nbsp;문장 &lt;br /&gt;&amp;nbsp;#&amp;nbsp;바로&amp;nbsp;위의&amp;nbsp;줄은&amp;nbsp;:&amp;nbsp;former&amp;nbsp;nfl&amp;nbsp;cheerleaders&amp;nbsp;settlement&amp;nbsp;offer&amp;nbsp;1&amp;nbsp;and&amp;nbsp;a&amp;nbsp;meeting&amp;nbsp;with&amp;nbsp;goodell &lt;br /&gt;&amp;nbsp;[100,&amp;nbsp;3]]&amp;nbsp;#&amp;nbsp;epa&amp;nbsp;to에&amp;nbsp;해당되며&amp;nbsp;두번째&amp;nbsp;문장이&amp;nbsp;시작됨. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;어떤&amp;nbsp;정수가&amp;nbsp;어떤&amp;nbsp;단어를&amp;nbsp;의미하는지&amp;nbsp;알아보기&amp;nbsp;위해&amp;nbsp;&lt;b&gt;인덱스로부터&amp;nbsp;단어를&amp;nbsp;찾는&amp;nbsp;index_to_word&lt;/b&gt;를&amp;nbsp;만들기 &lt;/p&gt;
&lt;pre id=&quot;code_1743555123878&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;index_to_word = {}
for key, value in tokenizer.word_index.items() # 인덱스를 단어로 바꾸기 위해 index_to_word를 생성
   index_to_Word[value] = key
print('빈도수 상위 582번 단어 : {}'.ormat(index_to_word[582]))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;빈도수&amp;nbsp;상위&amp;nbsp;582번&amp;nbsp;단어&amp;nbsp;:&amp;nbsp;offer &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;이제&amp;nbsp;전체&amp;nbsp;샘플의&amp;nbsp;길이를&amp;nbsp;동일하게&amp;nbsp;만드는&amp;nbsp;&lt;b&gt;패딩&amp;nbsp;작업&amp;nbsp;수행.&lt;/b&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1743555131504&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;max_len = max(len(1) for l in sequences)
print('샘플의 최대 길이 : {}'format(max_len))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;샘플의&amp;nbsp;최대&amp;nbsp;길이&amp;nbsp;:&amp;nbsp;24 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743555188056&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sequences = pad_sequences(sequences, maxlen = max_len, padding= 'pre')

sequences = np.array(sequences)
X = sequences [:, :-1]
y = sequences[:,-1]
# 레이블 데이터 y에 대해서 원-핫 인코딩 수행
y = to_Categorical(y, num_classes=vocab_size)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;2)&amp;nbsp;모델&amp;nbsp;설계하기 &lt;/p&gt;
&lt;pre id=&quot;code_1743555198297&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, Dense, LSTM&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- 벡터의 차원은 10, 은닉 상태의 크기는 128, 다 대 일 구조의 LSTM을 사용. 전결합층을 출력층으로 단어 집합 크기만큼의 뉴런을 배치하여 모델을 설계, 출력층 활성화 함수 소프트맥스 함수, 손실함수 크로스 엔트로피 함수 사용. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743555228735&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;embedding_dim = 10
hidden_units = 128

model = Sequential()
model.add(Embedding(vocab_size, embeddinf_dim))
model.add(LSTM(hidden_units))
model.add(Dense(vocab_Size, activation = 'softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
model.fit(X, y,epochs = 200, verbose = 2)

def sentence_generation(model, tokenizer, current_word, n): # 모델, 토크나이저, 현재 단어, 반복할 횟수
    init_word = current_word
    sentence = ''

    # n번 반복
    for _ in range(n):
        encoded = tokenizer.texts_to_sequences([current_word])[0]
        encoded = pad_sequences([encoded], maxlen=max_len-1, padding='pre')

        # 입력한 X(현재 단어)에 대해서 y를 예측하고 y(예측한 단어)를 result에 저장.
        result = model.predict(encoded, verbose=0)
        result = np.argmax(result, axis=1)

        for word, index in tokenizer.word_index.items(): 
            # 만약 예측한 단어와 인덱스와 동일한 단어가 있다면
            if index == result:
                break

        # 현재 단어 + ' ' + 예측 단어를 현재 단어로 변경
        current_word = current_word + ' '  + word

        # 예측 단어를 문장에 저장
        sentence = sentence + ' ' + word

    sentence = init_word + sentence
    return sentence&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;임의의&amp;nbsp;단어&amp;nbsp;'i'에&amp;nbsp;대해서&amp;nbsp;10개의&amp;nbsp;단어를&amp;nbsp;추가&amp;nbsp;생성해보자 &lt;/p&gt;
&lt;pre id=&quot;code_1743555240220&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(sentence_generatino(model, tokenizer, 'i', 10))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;i&amp;nbsp;disapprove&amp;nbsp;of&amp;nbsp;school&amp;nbsp;vouchers&amp;nbsp;can&amp;nbsp;i&amp;nbsp;still&amp;nbsp;apply&amp;nbsp;for&amp;nbsp;them &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;임의의&amp;nbsp;단어&amp;nbsp;'how'에&amp;nbsp;대해서&amp;nbsp;10개의&amp;nbsp;단어를&amp;nbsp;추가&amp;nbsp;생성&amp;nbsp;해보자 &lt;/p&gt;
&lt;pre id=&quot;code_1743555248750&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(sentence_generation(model, tokenizer, 'how', 10)))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-출력: &lt;br /&gt;how&amp;nbsp;to&amp;nbsp;make&amp;nbsp;facebook&amp;nbsp;more&amp;nbsp;accountable&amp;nbsp;will&amp;nbsp;so&amp;nbsp;your&amp;nbsp;neighbor&amp;nbsp;chasing &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;08-07&amp;nbsp;문자&amp;nbsp;단위&amp;nbsp;RNN&amp;nbsp;(Char&amp;nbsp;RNN) &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&amp;nbsp;입출력의&amp;nbsp;단위를&amp;nbsp;단어&amp;nbsp;레벨(word_level)&amp;nbsp;-&amp;gt;&amp;nbsp;문자&amp;nbsp;레벨(Character-level)로&amp;nbsp;변경하여&amp;nbsp;RNN&amp;nbsp;구현하기 &lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;1. 문자 단위 RNN 언어 모델 (Char RNNLM) &lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;단어가&amp;nbsp;아닌&amp;nbsp;문자&amp;nbsp;단위를&amp;nbsp;사용하기&amp;nbsp;때문에&amp;nbsp;ㅇ미베딩층을&amp;nbsp;여기서는&amp;nbsp;사용하지&amp;nbsp;않고&amp;nbsp;훈련과정과&amp;nbsp;테스트&amp;nbsp;과정의&amp;nbsp;차이를&amp;nbsp;이해하는데&amp;nbsp;집중 &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;1)&amp;nbsp;데이터에&amp;nbsp;대한&amp;nbsp;이해와&amp;nbsp;전처리 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;데이터를&amp;nbsp;로드,&amp;nbsp;특스문자&amp;nbsp;제거,&amp;nbsp;단어를&amp;nbsp;소문자화 &lt;/p&gt;
&lt;pre id=&quot;code_1743555265387&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
iomport urllib.request
from tensorflow.keras.utils import to_categorical

# 데이터 로드
urllib.request.urlretrieve(&quot;http://www.gutenberg.org/files/11/11-0.txt&quot;, filename=&quot;11-0.txt&quot;)

f  = open('11-0.txt', 'rb')
sentences = []
for sentence in f: # 데이터로부터 한 줄 씩 읽는다.
   sentence = sentence.strip() # strip()을 통해 \r, \n을 제거한다.
   sentence = sentence.lower() # 소문자화
   sentence = sentence.decode('ascii', 'ignore') # \xe2\x80\99 등과 같은 바이트 열 제거
   if len(sentence) &amp;gt; 0 :
      sentences.append(sentence)
f.close()

sentences[:5]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;['the&amp;nbsp;project&amp;nbsp;gutenberg&amp;nbsp;ebook&amp;nbsp;of&amp;nbsp;alices&amp;nbsp;adventures&amp;nbsp;in&amp;nbsp;wonderland,&amp;nbsp;by&amp;nbsp;lewis&amp;nbsp;carroll', &lt;br /&gt;&amp;nbsp;'this&amp;nbsp;ebook&amp;nbsp;is&amp;nbsp;for&amp;nbsp;the&amp;nbsp;use&amp;nbsp;of&amp;nbsp;anyone&amp;nbsp;anywhere&amp;nbsp;in&amp;nbsp;the&amp;nbsp;united&amp;nbsp;states&amp;nbsp;and', &lt;br /&gt;&amp;nbsp;'most&amp;nbsp;other&amp;nbsp;parts&amp;nbsp;of&amp;nbsp;the&amp;nbsp;world&amp;nbsp;at&amp;nbsp;no&amp;nbsp;cost&amp;nbsp;and&amp;nbsp;with&amp;nbsp;almost&amp;nbsp;no&amp;nbsp;restrictions', &lt;br /&gt;&amp;nbsp;'whatsoever.&amp;nbsp;you&amp;nbsp;may&amp;nbsp;copy&amp;nbsp;it,&amp;nbsp;give&amp;nbsp;it&amp;nbsp;away&amp;nbsp;or&amp;nbsp;re-use&amp;nbsp;it&amp;nbsp;under&amp;nbsp;the&amp;nbsp;terms', &lt;br /&gt;&amp;nbsp;'of&amp;nbsp;the&amp;nbsp;project&amp;nbsp;gutenberg&amp;nbsp;license&amp;nbsp;included&amp;nbsp;with&amp;nbsp;this&amp;nbsp;ebook&amp;nbsp;or&amp;nbsp;online&amp;nbsp;at'] &lt;br /&gt;&lt;br /&gt;- 아직 의미있게 문장 토큰화가 되진 않음.&amp;nbsp; =&amp;gt; 하나의 문자열로 통합&lt;/p&gt;
&lt;pre id=&quot;code_1743555280045&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;total_data = ' '.join(sentences)
print('문자열의 길이 또는 총 문자의 개수: %d' % len(total_data))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;문자열의&amp;nbsp;길이&amp;nbsp;또는&amp;nbsp;총&amp;nbsp;문자의&amp;nbsp;개수:&amp;nbsp;159484 &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;이&amp;nbsp;문자열로부터&amp;nbsp;문자&amp;nbsp;집합을&amp;nbsp;만들자.&amp;nbsp; &lt;/p&gt;
&lt;pre id=&quot;code_1743555312179&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char_vocab = sorted(list(set(Total_Data)))
vocab_size = len(char_vocab)
print('문자 집합의 크기 : {}'.format(vocab_size))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-출력: &lt;br /&gt;문자&amp;nbsp;집합의&amp;nbsp;크기&amp;nbsp;:&amp;nbsp;56 &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;영어가&amp;nbsp;훈련&amp;nbsp;데이터일&amp;nbsp;때&amp;nbsp;문자&amp;nbsp;집합의&amp;nbsp;크기는&amp;nbsp;단어&amp;nbsp;집합을&amp;nbsp;사용했을&amp;nbsp;경우보다&amp;nbsp;집합의&amp;nbsp;크기가&amp;nbsp;현저히&amp;nbsp;작음.&amp;nbsp;(영어&amp;nbsp;단어를&amp;nbsp;표현하기&amp;nbsp;위해&amp;nbsp;사용되는&amp;nbsp;문자는&amp;nbsp;26개의&amp;nbsp;알파벳뿐이기&amp;nbsp;때문.&amp;nbsp;-&amp;gt;&amp;nbsp;훈련&amp;nbsp;데이터가&amp;nbsp;대,&amp;nbsp;소문자&amp;nbsp;구분된&amp;nbsp;상태라고&amp;nbsp;하더라도&amp;nbsp;모든&amp;nbsp;영어&amp;nbsp;단어는&amp;nbsp;총&amp;nbsp;52개의&amp;nbsp;알파벳으로&amp;nbsp;표현가능) &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743555328044&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#문자에 고유한 정수 부여
char_to_index = dict((char, index) for index, char in enumerate(char_vocab))
print('문자 집합 :', char_to_index)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력&amp;nbsp;:&amp;nbsp; &lt;br /&gt;문자&amp;nbsp;집합&amp;nbsp;:&amp;nbsp;{'&amp;nbsp;':&amp;nbsp;0,&amp;nbsp;'!':&amp;nbsp;1,&amp;nbsp;'&quot;':&amp;nbsp;2,&amp;nbsp;'#':&amp;nbsp;3,&amp;nbsp;'$':&amp;nbsp;4,&amp;nbsp;'%':&amp;nbsp;5,&amp;nbsp;&quot;'&quot;:&amp;nbsp;6,&amp;nbsp;'(':&amp;nbsp;7,&amp;nbsp;')':&amp;nbsp;8,&amp;nbsp;'*':&amp;nbsp;9,&amp;nbsp;',':&amp;nbsp;10,&amp;nbsp;'-':&amp;nbsp;11,&amp;nbsp;'.':&amp;nbsp;12,&amp;nbsp;'/':&amp;nbsp;13,&amp;nbsp;'0':&amp;nbsp;14,&amp;nbsp;'1':&amp;nbsp;15,&amp;nbsp;'2':&amp;nbsp;16,&amp;nbsp;'3':&amp;nbsp;17,&amp;nbsp;'4':&amp;nbsp;18,&amp;nbsp;'5':&amp;nbsp;19,&amp;nbsp;'6':&amp;nbsp;20,&amp;nbsp;'7':&amp;nbsp;21,&amp;nbsp;'8':&amp;nbsp;22,&amp;nbsp;'9':&amp;nbsp;23,&amp;nbsp;':':&amp;nbsp;24,&amp;nbsp;';':&amp;nbsp;25,&amp;nbsp;'?':&amp;nbsp;26,&amp;nbsp;'[':&amp;nbsp;27,&amp;nbsp;']':&amp;nbsp;28,&amp;nbsp;'_':&amp;nbsp;29,&amp;nbsp;'a':&amp;nbsp;30,&amp;nbsp;'b':&amp;nbsp;31,&amp;nbsp;'c':&amp;nbsp;32,&amp;nbsp;'d':&amp;nbsp;33,&amp;nbsp;'e':&amp;nbsp;34,&amp;nbsp;'f':&amp;nbsp;35,&amp;nbsp;'g':&amp;nbsp;36,&amp;nbsp;'h':&amp;nbsp;37,&amp;nbsp;'i':&amp;nbsp;38,&amp;nbsp;'j':&amp;nbsp;39,&amp;nbsp;'k':&amp;nbsp;40,&amp;nbsp;'l':&amp;nbsp;41,&amp;nbsp;'m':&amp;nbsp;42,&amp;nbsp;'n':&amp;nbsp;43,&amp;nbsp;'o':&amp;nbsp;44,&amp;nbsp;'p':&amp;nbsp;45,&amp;nbsp;'q':&amp;nbsp;46,&amp;nbsp;'r':&amp;nbsp;47,&amp;nbsp;'s':&amp;nbsp;48,&amp;nbsp;'t':&amp;nbsp;49,&amp;nbsp;'u':&amp;nbsp;50,&amp;nbsp;'v':&amp;nbsp;51,&amp;nbsp;'w':&amp;nbsp;52,&amp;nbsp;'x':&amp;nbsp;53,&amp;nbsp;'y':&amp;nbsp;54,&amp;nbsp;'z':&amp;nbsp;55} &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743555336538&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#반대로 정수로부터 문자를 리턴하는 index_to_char
index_to_char = []
for key, value in char_to_index.items():
   index_to_char[value] = key&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;훈련&amp;nbsp;데이터&amp;nbsp;구성을&amp;nbsp;위한&amp;nbsp;간소화&amp;nbsp;된&amp;nbsp;예&amp;nbsp;:&amp;nbsp;훈련&amp;nbsp;데이터에&amp;nbsp;apple이라는&amp;nbsp;시퀀스가&amp;nbsp;있고&amp;nbsp;입력의&amp;nbsp;길이를&amp;nbsp;4라고&amp;nbsp;정했을&amp;nbsp;때,&amp;nbsp;입력의&amp;nbsp;길이가&amp;nbsp;4이므로&amp;nbsp;입력&amp;nbsp;시퀀스와&amp;nbsp;출력&amp;nbsp;시퀀스&amp;nbsp;모두&amp;nbsp;길이는&amp;nbsp;4가&amp;nbsp;됨.&amp;nbsp;(총&amp;nbsp;네번의&amp;nbsp;시점을&amp;nbsp;가질&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;의미)&amp;nbsp;=&amp;gt;&amp;nbsp;입력은&amp;nbsp;'appl'&amp;nbsp;출력은&amp;nbsp;'pple'으로&amp;nbsp;데이터가&amp;nbsp;구성됨. &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;위의&amp;nbsp;예제는&amp;nbsp;문장의&amp;nbsp;길이를&amp;nbsp;60으로&amp;nbsp;정해서&amp;nbsp;해보자.&amp;nbsp;=&amp;gt;&amp;nbsp;샘플의&amp;nbsp;수는&amp;nbsp;2658개가&amp;nbsp;됨. &lt;br /&gt;seq_length&amp;nbsp;=&amp;nbsp;60 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743555345371&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 문자열의 길이를 seq_length로 나누면 전처리 후 생겨날 샘플 수
n_samples = int(np.floor((len(total_data) - 1) / seq_length))
print ('샘플의 수 : {}'.format(n_samples))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;결과&amp;nbsp;: &lt;br /&gt;샘플의&amp;nbsp;수&amp;nbsp;:&amp;nbsp;2658 &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;전처리&amp;nbsp;코드: &lt;/p&gt;
&lt;pre id=&quot;code_1743555358001&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;train_X = []
train_y = []

for i in range(n_samples):
   # 0:60 -&amp;gt; 60:120 -&amp;gt; 120:!80로 loop를 돌면서 문장 샘플을 1개씩 pick
   X_sample = total_data[i * seq_length : (i+1) * seq_length]
   # 정수 인코딩
   X_encoded  = [char_to_index[c] for c in X_sample]
   train_X.append(X_encoded)
   # 오른쪽으로 1칸 쉬프트
   y_sample = total_data[i*seq_length + 1 : (i+1) * seq_length +1]
   y_encoded = [char_to_index[c] for c in y_sample]
   train_y.append(y_encoded)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;원핫&amp;nbsp;인코딩&amp;nbsp;수행&amp;nbsp;(문자&amp;nbsp;단위&amp;nbsp;RNN은&amp;nbsp;입력&amp;nbsp;시퀀스에&amp;nbsp;대해서&amp;nbsp;워드&amp;nbsp;임베딩을&amp;nbsp;하지&amp;nbsp;않음&amp;nbsp;-&amp;gt;&amp;nbsp;임베딩층&amp;nbsp;사용&amp;nbsp;X&amp;nbsp;-&amp;gt;&amp;nbsp;입력시퀀스인&amp;nbsp;train_X에&amp;nbsp;대해서도&amp;nbsp;원-핫&amp;nbsp;인코딩&amp;nbsp;수행) &lt;/p&gt;
&lt;pre id=&quot;code_1743555368300&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;train_X = to_categorical(train_X)
train_y = to_categorical(train_y)
print('train_X의 크기(shape) : {}'.format(train_X.shape)) # 원-핫 인코딩
print('train_y의 크기(shape) : {}'.format(train_y.shape)) # 원-핫 인코딩&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;train_X의&amp;nbsp;크기(shape)&amp;nbsp;:&amp;nbsp;(2658,&amp;nbsp;60,&amp;nbsp;56) &lt;br /&gt;train_y의&amp;nbsp;크기(shape)&amp;nbsp;:&amp;nbsp;(2658,&amp;nbsp;60,&amp;nbsp;56) &lt;br /&gt;-&amp;nbsp;이는&amp;nbsp;샘플의&amp;nbsp;수가&amp;nbsp;2,658개,&amp;nbsp;입력&amp;nbsp;시퀀스의&amp;nbsp;길이가&amp;nbsp;60,&amp;nbsp;각&amp;nbsp;벡터의&amp;nbsp;차원(input_dim)이&amp;nbsp;55임을&amp;nbsp;의미. &lt;br /&gt;-&amp;nbsp;원-핫&amp;nbsp;벡터의&amp;nbsp;차원은&amp;nbsp;문자&amp;nbsp;집합의&amp;nbsp;크기인&amp;nbsp;56이어야&amp;nbsp;하므로&amp;nbsp;원-핫&amp;nbsp;인코딩이&amp;nbsp;수행되었음을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있음 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;2)&amp;nbsp;모델&amp;nbsp;설계하기 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;하이퍼파라미터인&amp;nbsp;은닉&amp;nbsp;상태의&amp;nbsp;크기는&amp;nbsp;256.&amp;nbsp;모델은&amp;nbsp;다&amp;nbsp;대&amp;nbsp;다&amp;nbsp;구조의&amp;nbsp;LSTM을&amp;nbsp;사용하며&amp;nbsp;LSTM&amp;nbsp;은닉층은&amp;nbsp;두&amp;nbsp;개를&amp;nbsp;사용. &lt;br /&gt;-&amp;nbsp;전결합층을&amp;nbsp;출력층으로&amp;nbsp;문자&amp;nbsp;집합&amp;nbsp;크기만큼의&amp;nbsp;뉴런을&amp;nbsp;배치하여&amp;nbsp;모델을&amp;nbsp;설계 &lt;br /&gt;-&amp;nbsp;하나의&amp;nbsp;문자를&amp;nbsp;예측하는&amp;nbsp;다중&amp;nbsp;클래스&amp;nbsp;분류&amp;nbsp;문제이므로&amp;nbsp;활성화함수&amp;nbsp;소프트맥스&amp;nbsp;함수,&amp;nbsp;손실함수&amp;nbsp;크로스&amp;nbsp;엔트로피&amp;nbsp;함수&amp;nbsp;사용. &lt;/p&gt;
&lt;pre id=&quot;code_1743555382806&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM, TimeDistributed

hidden_units = 256
model = Sequential()
model.add(LSTM(hidden_units, input_shape(None, train_X.shape[2]], return_sequences = True))
model.add(LSTM(hidden_units, return_Sequences = True))
model.add(TimeDistributed(Dense(vocab_size, activation = 'softmax')))

model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
model.fit(train_X, train_y, epochs=80, verbose = 2)

# sentence_generation 함수 구현 : 특정 문자를 주면 다음 문자를 계속해서 생성해내는 함수
# 인자로 학습한 모델, 다음 문자를 생성할 횟수를 전달하면 다음 문자를 지속적으로 예측하여 문장을 생성
def sentence_generation(model, length):
   # 문자에 대한 랜덤한 정수 생성
   ix = [np.random.randint(vocab_size)]
   # 랜덤한 정수로부터 맵핑되는 문자 생성
   y_char = [index_to_char[ix[-1]]]
   print(ix[-1], '번 문자', y_char[-1],'로 예측을 시작!')
   # (1,length,55) 크기의 x 생성. 즉 LSTM의 입력 시퀀스 생성
   X = np.zeros((1, length, vocab_Size))

   for i in range(length) :
      # X[0][i][예측한 문자의 인덱스] = 1, 즉, 예측 문자를 다음 입력 시퀀스에 추가
      X[0][i][ix[-1]] = 1
      print(index_to_Char(ix[-1]], end=&quot;&quot;)
      ix = np.argmax(model.predict(X[:, :i+1,:])[0],1)
      y_char.append(index_to_Char[ix[-1]])
   return ('').join(y_char)
result = sentence_genreation(model, 100)
print(result)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-출력: &lt;br /&gt;49&amp;nbsp;번&amp;nbsp;문자&amp;nbsp;u&amp;nbsp;로&amp;nbsp;예측을&amp;nbsp;시작! &lt;br /&gt;ury-men&amp;nbsp;would&amp;nbsp;have&amp;nbsp;done&amp;nbsp;just&amp;nbsp;as&amp;nbsp;well.&amp;nbsp;the&amp;nbsp;twelve&amp;nbsp;jurors&amp;nbsp;were&amp;nbsp;to&amp;nbsp;say&amp;nbsp;in&amp;nbsp;that&amp;nbsp;dide.&amp;nbsp;he&amp;nbsp;went&amp;nbsp;on&amp;nbsp;in&amp;nbsp;a&amp;nbsp;di' &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;&lt;br /&gt;2.&amp;nbsp;문자&amp;nbsp;단위&amp;nbsp;RNN&amp;nbsp;(Char&amp;nbsp;RNN)으로&amp;nbsp;텍스트&amp;nbsp;생성하기 &lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;이번에는&amp;nbsp;다&amp;nbsp;대&amp;nbsp;일&amp;nbsp;구조의&amp;nbsp;rNN을&amp;nbsp;문자&amp;nbsp;단위로&amp;nbsp;학습시키고&amp;nbsp;텍스트&amp;nbsp;생성 &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;1)&amp;nbsp;데이터&amp;nbsp;이해와&amp;nbsp;전처리 &lt;/p&gt;
&lt;pre id=&quot;code_1743555401248&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
from tensorflow.keras.utils import to _categorical
raw_text = '''
I get on with life as a programmer,
I like to contemplate beer.
But when I start to daydream,
My mind turns straight to wine.

Do I love wine more than beer?

I like to use words about beer.
But when I stop my talking,
My mind turns straight to wine.

I hate bugs and errors.
But I just think back to wine,
And I'm happy once again.

I like to hang out with programming and deep learning.
But when left alone,
My mind turns straight to wine.
'''

# 단락 구분 없애기
tokens = raw_text.split()
raw_text = ' '.join(tokens)
print(raw_text)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;I&amp;nbsp;get&amp;nbsp;on&amp;nbsp;with&amp;nbsp;life&amp;nbsp;as&amp;nbsp;a&amp;nbsp;programmer,&amp;nbsp;I&amp;nbsp;like&amp;nbsp;to&amp;nbsp;contemplate&amp;nbsp;beer.&amp;nbsp;But&amp;nbsp;when&amp;nbsp;I&amp;nbsp;start&amp;nbsp;to&amp;nbsp;daydream,&amp;nbsp;My&amp;nbsp;mind&amp;nbsp;turns&amp;nbsp;straight&amp;nbsp;to&amp;nbsp;wine.&amp;nbsp;Do&amp;nbsp;I&amp;nbsp;love&amp;nbsp;wine&amp;nbsp;more&amp;nbsp;than&amp;nbsp;beer?&amp;nbsp;I&amp;nbsp;like&amp;nbsp;to&amp;nbsp;use&amp;nbsp;words&amp;nbsp;about&amp;nbsp;beer.&amp;nbsp;But&amp;nbsp;when&amp;nbsp;I&amp;nbsp;stop&amp;nbsp;my&amp;nbsp;talking,&amp;nbsp;My&amp;nbsp;mind&amp;nbsp;turns&amp;nbsp;straight&amp;nbsp;to&amp;nbsp;wine.&amp;nbsp;I&amp;nbsp;hate&amp;nbsp;bugs&amp;nbsp;and&amp;nbsp;errors.&amp;nbsp;But&amp;nbsp;I&amp;nbsp;just&amp;nbsp;think&amp;nbsp;back&amp;nbsp;to&amp;nbsp;wine,&amp;nbsp;And&amp;nbsp;I'm&amp;nbsp;happy&amp;nbsp;once&amp;nbsp;again.&amp;nbsp;I&amp;nbsp;like&amp;nbsp;to&amp;nbsp;hang&amp;nbsp;out&amp;nbsp;with&amp;nbsp;programming&amp;nbsp;and&amp;nbsp;deep&amp;nbsp;learning.&amp;nbsp;But&amp;nbsp;when&amp;nbsp;left&amp;nbsp;alone,&amp;nbsp;My&amp;nbsp;mind&amp;nbsp;turns&amp;nbsp;straight&amp;nbsp;to&amp;nbsp;wine. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743555415168&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 중복을 제거한 문자 집합 생성
char_vocab = sorted(list(set(raw_text)))
vocab_size = len(Char_vocab)
print('문자 집합 :', char_vocab)
print('문자 집합의 쿠기 : {}'.format(vocab_size))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;문자&amp;nbsp;집합&amp;nbsp;:&amp;nbsp;['&amp;nbsp;',&amp;nbsp;&quot;'&quot;,&amp;nbsp;',',&amp;nbsp;'.',&amp;nbsp;'?',&amp;nbsp;'A',&amp;nbsp;'B',&amp;nbsp;'D',&amp;nbsp;'I',&amp;nbsp;'M',&amp;nbsp;'a',&amp;nbsp;'b',&amp;nbsp;'c',&amp;nbsp;'d',&amp;nbsp;'e',&amp;nbsp;'f',&amp;nbsp;'g',&amp;nbsp;'h',&amp;nbsp;'i',&amp;nbsp;'j',&amp;nbsp;'k',&amp;nbsp;'l',&amp;nbsp;'m',&amp;nbsp;'n',&amp;nbsp;'o',&amp;nbsp;'p',&amp;nbsp;'r',&amp;nbsp;'s',&amp;nbsp;'t',&amp;nbsp;'u',&amp;nbsp;'v',&amp;nbsp;'w',&amp;nbsp;'y'] &lt;br /&gt;문자&amp;nbsp;집합의&amp;nbsp;크기&amp;nbsp;:&amp;nbsp;33 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743555424335&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char_to_index = dict((char, index) for index, char in enumerate(char_vocab)) # 문자에 고유한 정수 인덱스 부여&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;이번&amp;nbsp;실습은&amp;nbsp;대소문자&amp;nbsp;구분하고&amp;nbsp;구두점과&amp;nbsp;공백을&amp;nbsp;포함. &lt;br /&gt;-&amp;nbsp;예시.&amp;nbsp;입력&amp;nbsp;시퀀스의&amp;nbsp;길이를&amp;nbsp;5라고&amp;nbsp;하고(RNN의&amp;nbsp;시점timesteps이&amp;nbsp;5),&amp;nbsp;훈련&amp;nbsp;데이터에&amp;nbsp;student라는&amp;nbsp;단어가&amp;nbsp;있다면,&amp;nbsp;입력&amp;nbsp;시퀀스와&amp;nbsp;예측해야&amp;nbsp;하는&amp;nbsp;문자는&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;구성 &lt;br /&gt;stude&amp;nbsp;-&amp;gt;&amp;nbsp;n &lt;br /&gt;tuden&amp;nbsp;-&amp;gt;&amp;nbsp;t &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;이번&amp;nbsp;예제는&amp;nbsp;입력&amp;nbsp;시퀀스의&amp;nbsp;길이를&amp;nbsp;10으로&amp;nbsp;구성&amp;nbsp;(아래&amp;nbsp;코드는&amp;nbsp;예측&amp;nbsp;대상문자까지&amp;nbsp;해서&amp;nbsp;길이를&amp;nbsp;11로&amp;nbsp;함) &lt;/p&gt;
&lt;pre id=&quot;code_1743555435639&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;length = 11
sequences = []
for i in range(length, len(raw_text)):
   seq = raw_text[i-length:i] # 길이 11의 문자열을 지속적으로 만든다.
   sequences.append(seq)
print(;총 훈련 샘플의 수 : %d' % len(sequences))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;총&amp;nbsp;훈련&amp;nbsp;샘플의&amp;nbsp;수:&amp;nbsp;426 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743555446432&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 정수 인코딩
encoded_sequences = []
for sequence in sequences: ㄸ 전체 데이터에서 문장 샘플을 1개씩 꺼낸다.
   encoded_sequence = [char_to_index[char] for char in sequence] # 문장 샘플에서 각 문자에 대해서 정수 인코딩 수행
   encoded_sequences.append(encoded_sequence)

#  예측 대상 문자 분리
encoded_sequences = np.array(encoded_sequences)
# 맨 마지막 위치의 문자를 분리
X_data = encoded_sequences[:, :-1]
# 맨 마지막 위치의 문자를 저장
y_data = encoded_sequences[:, -1]

#원-핫 인코딩
X_data_one_hot = [to_categorical(encoded, num_classes=voab_size) for encoded in X_data]
X_data_one_hot = np.array(X_data_one_hot)
y_data_one_hot = to_categorical(y_data, num_classes=vocab_size)
print(X_data_one_hot.shape)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;(426,&amp;nbsp;10,&amp;nbsp;33) &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;샘플의&amp;nbsp;수(No.&amp;nbsp;of&amp;nbsp;samples)가&amp;nbsp;426개,&amp;nbsp;입력&amp;nbsp;시퀀스의&amp;nbsp;길이(input_length)가&amp;nbsp;10,&amp;nbsp;각&amp;nbsp;벡터의&amp;nbsp;차원(input_dim)이&amp;nbsp;33임을&amp;nbsp;의미 &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;2)&amp;nbsp;모델&amp;nbsp;설계하기 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;하이퍼파라미터인&amp;nbsp;은닉&amp;nbsp;상태의&amp;nbsp;크기는&amp;nbsp;64.&amp;nbsp;활성화함수&amp;nbsp;소프트맥스,&amp;nbsp;손실함수로&amp;nbsp;크로스&amp;nbsp;엔트로피&amp;nbsp;함수 &lt;/p&gt;
&lt;pre id=&quot;code_1743555465722&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
from tensorflow.keras.preprocessing.sequence import pad_sequences

hidden_units = 64

model = Sequential()
model.add(LSTM(hidden_units, input_shape=(X_data_one_hot.shape[1], X_data_one_hot.shape[2])))
model.add(Dense(vocab_size, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_data_one_hot, y_data_one_hot, epochs=100, verbose=2)

def sentence_generation(model, char_to_index, seq_length, seed_text, n):

    # 초기 시퀀스
    init_text = seed_text
    sentence = ''

    # 다음 문자 예측은 총 n번만 반복.
    for _ in range(n):
        encoded = [char_to_index[char] for char in seed_text] # 현재 시퀀스에 대한 정수 인코딩
        encoded = pad_sequences([encoded], maxlen=seq_length, padding='pre') # 데이터에 대한 패딩
        encoded = to_categorical(encoded, num_classes=len(char_to_index))

        # 입력한 X(현재 시퀀스)에 대해서 y를 예측하고 y(예측한 문자)를 result에 저장.
        result = model.predict(encoded, verbose=0)
        result = np.argmax(result, axis=1)

        for char, index in char_to_index.items():
            if index == result:
                break

        # 현재 시퀀스 + 예측 문자를 현재 시퀀스로 변경
        seed_text = seed_text + char

        # 예측 문자를 문장에 저장
        sentence = sentence + char

    # n번의 다음 문자 예측이 끝나면 최종 완성된 문장을 리턴.
    sentence = init_text + sentence
    return sentence

print(sentence_generation(model, char_to_index, 10, 'I get on w', 80))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;I&amp;nbsp;get&amp;nbsp;on&amp;nbsp;with&amp;nbsp;life&amp;nbsp;as&amp;nbsp;a&amp;nbsp;programmer,&amp;nbsp;I&amp;nbsp;like&amp;nbsp;to&amp;nbsp;hang&amp;nbsp;out&amp;nbsp;with&amp;nbsp;programming&amp;nbsp;and&amp;nbsp;deep&amp;nbsp;learning. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 10장으로 넘어가야지..!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/자연어 처리</category>
      <author>빈이즈</author>
      <guid isPermaLink="true">https://binrec.tistory.com/15</guid>
      <comments>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-8-%EC%88%9C%ED%99%98-%EC%8B%A0%EA%B2%BD%EB%A7%9D-Recurrent-Neural-Network-2#entry15comment</comments>
      <pubDate>Wed, 2 Apr 2025 09:59:03 +0900</pubDate>
    </item>
    <item>
      <title>[딥러닝을 이용한 자연어 처리 입문] Chapter 8. 순환 신경망 (Recurrent Neural Network) (1)</title>
      <link>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-8-%EC%88%9C%ED%99%98-%EC%8B%A0%EA%B2%BD%EB%A7%9D-Recurrent-Neural-Network</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wikidocs.net/48558&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt; &lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;이 글은 [&lt;/span&gt;&lt;/a&gt;&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/6876&quot;&gt;유원준&lt;/a&gt;&lt;a href=&quot;https://wikidocs.net/48558&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #808080; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/13671&quot;&gt;상준&lt;/a&gt;&lt;a href=&quot;https://wikidocs.net/48558&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;]의 [딥러닝을 이용한 자영어 처리 입문]에서 가져온 내용이며, [크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스](&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot;&gt;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;)에 따라 사용되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://wikidocs.net/48558&lt;/p&gt;
&lt;figure id=&quot;og_1743471162512&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;08. 순환 신경망(Recurrent Neural Network)&quot; data-og-description=&quot;앞서 배운 피드 포워드 신경망은 입력의 길이가 고정되어 있어 자연어 처리를 위한 신경망으로는 한계가 있었습니다. 결국 다양한 길이의 입력 시퀀스를 처리할 수 있는 인공 신경망이 &amp;hellip;&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/48558&quot; data-og-url=&quot;https://wikidocs.net/48558&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5bEC3/hyYyR33wjS/IuqoXXoXqlxQb4oS9EePdk/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130&quot;&gt;&lt;a href=&quot;https://wikidocs.net/48558&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/48558&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5bEC3/hyYyR33wjS/IuqoXXoXqlxQb4oS9EePdk/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;08. 순환 신경망(Recurrent Neural Network)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;앞서 배운 피드 포워드 신경망은 입력의 길이가 고정되어 있어 자연어 처리를 위한 신경망으로는 한계가 있었습니다. 결국 다양한 길이의 입력 시퀀스를 처리할 수 있는 인공 신경망이 &amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;08.&amp;nbsp;순환&amp;nbsp;신경망(Recurrent&amp;nbsp;Neural&amp;nbsp;Network)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 피드 포워드 신경망은 &lt;b&gt;입력의 길이가 고정&lt;/b&gt;되어 있어 자연어 처리를 위한 신경망으로는 한계가 있음 =&amp;gt; 다양한 길이의 입력 시퀀스를 처리할 수 있는 인공신경망이 필요. =&amp;gt; 대표적인 인공 신경망이 바로 &lt;u&gt;순환 신경망&lt;/u&gt;(REcurrent Neural Network, RNN) &lt;br /&gt;-&amp;nbsp;바닐라&amp;nbsp;RNN,&amp;nbsp;이를&amp;nbsp;개선한&amp;nbsp;LSTM,&amp;nbsp;GRU에&amp;nbsp;대해&amp;nbsp;학습해볼&amp;nbsp;예정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;08-01&amp;nbsp;순환&amp;nbsp;신경망&amp;nbsp;(Recurrent&amp;nbsp;Neural&amp;nbsp;Network,&amp;nbsp;RNN)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력과 출력을 시퀀스 단위로 처리하는 시퀀스 모델.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;1.&amp;nbsp;순환&amp;nbsp;신경망(Recurrent&amp;nbsp;Neural&amp;nbsp;Network,&amp;nbsp;RNN)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 은닉층의 노드에서 활성화 함수를 통해 나온 &lt;b&gt;결과값&lt;/b&gt;을&lt;u&gt; 출력층 방향으로도 보내면서&lt;/u&gt;, 다시 &lt;u&gt;은닉층 노드의 다음 계산의 입력으로 보내는&lt;/u&gt; 특징을 가짐. &lt;br /&gt;-&amp;nbsp;RNN에서&amp;nbsp;은닉층에서&amp;nbsp;활성화&amp;nbsp;함수를&amp;nbsp;통해&amp;nbsp;결과를&amp;nbsp;내보내는&amp;nbsp;역할을&amp;nbsp;하는&amp;nbsp;노드를&amp;nbsp;&lt;b&gt;셀&lt;/b&gt;(cell)이라&amp;nbsp;함.&amp;nbsp;이&amp;nbsp;셀은&amp;nbsp;이전의&amp;nbsp;값을&amp;nbsp;기억하려고&amp;nbsp;하는&amp;nbsp;일종의&amp;nbsp;메모리&amp;nbsp;역할을&amp;nbsp;수행하므로&amp;nbsp;이를&amp;nbsp;&lt;b&gt;메모리&amp;nbsp;셀&amp;nbsp;또는&amp;nbsp;RNN&amp;nbsp;셀&lt;/b&gt;이라고&amp;nbsp;표현. &lt;br /&gt;-&amp;nbsp;은닉층의&amp;nbsp;메모리&amp;nbsp;셀은&amp;nbsp;각각의&amp;nbsp;시점(time&amp;nbsp;step)에서&amp;nbsp;바로&amp;nbsp;&lt;b&gt;이전&amp;nbsp;시점에서의&amp;nbsp;은닉층의&amp;nbsp;메모리&amp;nbsp;셀에서&amp;nbsp;나온&amp;nbsp;값을&amp;nbsp;자신의&amp;nbsp;입력으로&amp;nbsp;사용하는&lt;/b&gt;&amp;nbsp;재귀적&amp;nbsp;활동을&amp;nbsp;함.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;현재시점을&amp;nbsp;t라고&amp;nbsp;하면,&amp;nbsp;메모리&amp;nbsp;셀이&amp;nbsp;출력층&amp;nbsp;방향&amp;nbsp;또는&amp;nbsp;다음&amp;nbsp;시점인&amp;nbsp;t+1의&amp;nbsp;자신에게&amp;nbsp;보내는&amp;nbsp;값을&amp;nbsp;&lt;u&gt;은닉&amp;nbsp;상태&lt;/u&gt;(hidden&amp;nbsp;state)라고&amp;nbsp;함.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;피드&amp;nbsp;포워드&amp;nbsp;신경망에서는&amp;nbsp;뉴런이라는&amp;nbsp;단어를&amp;nbsp;사용했지만&amp;nbsp;RNN에서&amp;nbsp;뉴런보다는&amp;nbsp;입력층과&amp;nbsp;출력층에서는&amp;nbsp;각각&amp;nbsp;입력벡터와&amp;nbsp;출력벡터,&amp;nbsp;은닉층에서는&amp;nbsp;은닉&amp;nbsp;상태라는&amp;nbsp;표현을&amp;nbsp;주로&amp;nbsp;사용함. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0801 순환신경망 그림.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsJk6j/btsM40K5vX7/cUeJomork3tyWxnuSnBFsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsJk6j/btsM40K5vX7/cUeJomork3tyWxnuSnBFsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsJk6j/btsM40K5vX7/cUeJomork3tyWxnuSnBFsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsJk6j%2FbtsM40K5vX7%2FcUeJomork3tyWxnuSnBFsK%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;500&quot; height=&quot;218&quot; data-filename=&quot;0801 순환신경망 그림.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;RNN은&amp;nbsp;입력과&amp;nbsp;출력의&amp;nbsp;길이를&amp;nbsp;다르게&amp;nbsp;설계할&amp;nbsp;수&amp;nbsp;있음.&amp;nbsp;RNN&amp;nbsp;셀의&amp;nbsp;각&amp;nbsp;시점의&amp;nbsp;입,출력의&amp;nbsp;단위는&amp;nbsp;사용자가&amp;nbsp;정의하기&amp;nbsp;나름이지만&amp;nbsp;가장&amp;nbsp;보편적인&amp;nbsp;단위는&amp;nbsp;'단어&amp;nbsp;벡터'.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0801 일대일 일대다 다대다.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WvVIp/btsM3Gz3XlW/Eyt2of5jtcaN80rNeWXZ70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WvVIp/btsM3Gz3XlW/Eyt2of5jtcaN80rNeWXZ70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WvVIp/btsM3Gz3XlW/Eyt2of5jtcaN80rNeWXZ70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWvVIp%2FbtsM3Gz3XlW%2FEyt2of5jtcaN80rNeWXZ70%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;500&quot; height=&quot;173&quot; data-filename=&quot;0801 일대일 일대다 다대다.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;203&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;예를 들어 하나의 입력에 대해서 여러 개의 출력을 의미하는 &lt;b&gt;일 대 다&lt;/b&gt; (one-to-many) 구조의 모델은 하나의 이미지 입력에 대해서 사진의 제목을 출력하는 이미지 캡셔닝(Image Captioning) 작업에 사용할 수 있음. 사진의 제목은 단어들의 나열이므로 시퀀스 출력임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0801 스팸메일분류.png&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sY4mp/btsM2bt6EuV/3cB9XcdAgT2J4x4ZukCyuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sY4mp/btsM2bt6EuV/3cB9XcdAgT2J4x4ZukCyuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sY4mp/btsM2bt6EuV/3cB9XcdAgT2J4x4ZukCyuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsY4mp%2FbtsM2bt6EuV%2F3cB9XcdAgT2J4x4ZukCyuK%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;300&quot; height=&quot;277&quot; data-filename=&quot;0801 스팸메일분류.png&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- 또한 단어 시퀀스에 대해서 하나의 출력을 하는 &lt;b&gt;다 대 일&lt;/b&gt; (many-to-one) 구조의 모델은 입력 문서가 긍정적인지 부정적인지 판별하는 &lt;u&gt;감성 분류&lt;/u&gt;(sentiment classification), 또는 메일이 정상 메일인지 스팸 메일인지 판별하는 &lt;u&gt;스팸 메일 분류&lt;/u&gt; (spam detection) 등에 사용할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0801 개체명인식.png&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ySXaU/btsM2IyzTva/uVe3PLR5chF8NJ4WhEKkI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ySXaU/btsM2IyzTva/uVe3PLR5chF8NJ4WhEKkI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ySXaU/btsM2IyzTva/uVe3PLR5chF8NJ4WhEKkI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FySXaU%2FbtsM2IyzTva%2FuVe3PLR5chF8NJ4WhEKkI0%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;300&quot; height=&quot;287&quot; data-filename=&quot;0801 개체명인식.png&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- 다 대 다 (many-to-many) 구조의 모델의 경우에는 사용자가 문장을 입력하면 대답 문장을 출력하는 &lt;u&gt;챗봇&lt;/u&gt;과 입력 문장으로부터 번역된 문장을 출력하는 &lt;u&gt;번역기&lt;/u&gt;, 또는 '&lt;u&gt;태깅 작업&lt;/u&gt;' 챕터에서 배우는 개체명 인식이나 품사 태깅과 같은 작업에 속함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0801 RNN 수식정리.png&quot; data-origin-width=&quot;235&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjRLMC/btsM3WvZEju/V94MqcVBHoAwzQHVx5WOu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjRLMC/btsM3WvZEju/V94MqcVBHoAwzQHVx5WOu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjRLMC/btsM3WvZEju/V94MqcVBHoAwzQHVx5WOu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjRLMC%2FbtsM3WvZEju%2FV94MqcVBHoAwzQHVx5WOu1%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;210&quot; height=&quot;256&quot; data-filename=&quot;0801 RNN 수식정리.png&quot; data-origin-width=&quot;235&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- 현재 시점 t에서의 &lt;u&gt;은닉 상태값을 ht&lt;/u&gt;라고 정의. 은닉층의 메모리 셀은 ht 계산을 위해 총 두 개의 가중치를 가짐. 하나는 &lt;u&gt;입력층을 위한 가중치 Wx&lt;/u&gt;이고, 하나는 이&lt;u&gt;전 시점 t-1의 은닉상태값인 ht-1을 위한 가중치 Wh&lt;/u&gt;임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0801 RNN 수식.png&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYYVfr/btsM1KjbbOV/Sq2Fd2kzW1mn9oFMNNPhak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYYVfr/btsM1KjbbOV/Sq2Fd2kzW1mn9oFMNNPhak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYYVfr/btsM1KjbbOV/Sq2Fd2kzW1mn9oFMNNPhak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYYVfr%2FbtsM1KjbbOV%2FSq2Fd2kzW1mn9oFMNNPhak%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;400&quot; height=&quot;96&quot; data-filename=&quot;0801 RNN 수식.png&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- 식으로 표현하면 다음과 같음 &lt;br /&gt;-&amp;nbsp;ht를&amp;nbsp;계산하기&amp;nbsp;위한&amp;nbsp;활성화&amp;nbsp;함수로는&amp;nbsp;주로&amp;nbsp;&lt;b&gt;하이퍼볼릭탄젠트&amp;nbsp;함수(tanh)가&amp;nbsp;사용&lt;/b&gt;됨.&amp;nbsp; &lt;br /&gt;&lt;br /&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;&lt;br /&gt;2.&amp;nbsp;케라스(Keras)로&amp;nbsp;RNN&amp;nbsp;구현하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 코드:&lt;/p&gt;
&lt;pre id=&quot;code_1743471644889&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.layers import SimpleRNN
model.add(SimpleRNN(hidden_units))
# 추가 인자를 사용할 때
model.add(SimpleRNN(hidden_units, input_shape=(timesteps, input_dim)))
# 다른 표기
model.add(SimpleRNN(hidden_units, input_length=M, input_dim=N))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;&lt;b&gt;hidden_units&lt;/b&gt;&amp;nbsp;=&amp;nbsp;&lt;u&gt;은닉&amp;nbsp;상태의&amp;nbsp;크기&lt;/u&gt;를 정의. 메모리 셀이 다음 시점의 메모리 셀과 출력층으로 보내는 값의 크기(output_dim)와도 동일. RNN의 용량을 늘린다고 보면 되며, 중소형 모델의 경우 &lt;u&gt;보통 128,256,512,1024 등의 값을 가짐&lt;/u&gt; &lt;br /&gt;-&amp;nbsp;&lt;b&gt;timesteps&amp;nbsp;&lt;/b&gt;=&amp;nbsp;입력&amp;nbsp;시퀀스의길이&amp;nbsp;(input_length)라고&amp;nbsp;표현하기도&amp;nbsp;함.&amp;nbsp;시점의&amp;nbsp;수 &lt;br /&gt;-&amp;nbsp;&lt;b&gt;input_dim&lt;/b&gt;&amp;nbsp;=&amp;nbsp;입력의&amp;nbsp;크기 &lt;br /&gt;-&amp;nbsp;RNN층은&lt;b&gt;&amp;nbsp;(batch_size,&amp;nbsp;timesteps,&amp;nbsp;input_dim)&amp;nbsp;&lt;/b&gt;크기의&amp;nbsp;3D&amp;nbsp;텐서를&amp;nbsp;입력으로&amp;nbsp;받음.&amp;nbsp;batch_size는&amp;nbsp;한&amp;nbsp;번에&amp;nbsp;학습하는&amp;nbsp;데이터의&amp;nbsp;개수를&amp;nbsp;말함. &lt;br /&gt;- RNN 층은 사용자의 설정에 따라 &lt;u&gt;두 가지 종류의 출력&lt;/u&gt;을 내보냄. 메모리 셀의&lt;b&gt; 최종 시점의 은닉 상태만을 리턴&lt;/b&gt;하고자 한다면&lt;u&gt; (batch_size, output_dim)&lt;/u&gt; 크기의 2D 텐서를 리턴. 하지만 &lt;b&gt;메모리 셀의 각 시점(time step)의 은닉 상태값들을 모아서 전체 시퀀스를 리턴&lt;/b&gt;하고자 한다면 (&lt;u&gt;batch_size, timesteps, output_dim)&lt;/u&gt; 크기의 3D 텐더를 리턴 =&amp;gt; 이는 RNN 층의 &lt;b&gt;return_Sequences 매개변수에 True&lt;/b&gt;를 입력하면 설정 가능. output_dime은 앞서 코드에서 정의한 hidden_units의 값으로 설정. &lt;br /&gt;-모델&amp;nbsp;내부적으로&amp;nbsp;출력&amp;nbsp;결과를&amp;nbsp;어떻게&amp;nbsp;정의하는지&amp;nbsp;코드&amp;nbsp;확인:&lt;/p&gt;
&lt;pre id=&quot;code_1743471743840&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import SimplrRNN
model = Sequential()
model.add(SimpleRNN(3, input_shape(2,10)))
# model.add(SimpleRNN(3, input_length=2, input_dim=10))와 동일
model.summary()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력&amp;nbsp;: &lt;br /&gt;_________________________________________________________________ &lt;br /&gt;Layer&amp;nbsp;(type)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Output&amp;nbsp;Shape&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Param&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;================================================================= &lt;br /&gt;simple_rnn_1&amp;nbsp;(SimpleRNN)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(None,&amp;nbsp;3)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;42&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;================================================================= &lt;br /&gt;Total&amp;nbsp;params:&amp;nbsp;42 &lt;br /&gt;Trainable&amp;nbsp;params:&amp;nbsp;42 &lt;br /&gt;Non-trainable&amp;nbsp;params:&amp;nbsp;0 &lt;br /&gt;_________________________________________________________________ &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;출력값이&amp;nbsp;(batch_size,&amp;nbsp;output_dim)의&amp;nbsp;크기의&amp;nbsp;2D&amp;nbsp;텐서일때,&amp;nbsp;output_dim은&amp;nbsp;hidden_units의&amp;nbsp;값인&amp;nbsp;3이&amp;nbsp;됨.&amp;nbsp;이&amp;nbsp;경우&amp;nbsp;batch_size를&amp;nbsp;현&amp;nbsp;단계에서&amp;nbsp;알&amp;nbsp;수&amp;nbsp;없으므로&amp;nbsp;(None,&amp;nbsp;3)이&amp;nbsp;됨.&amp;nbsp; &lt;br /&gt;-이번에는&amp;nbsp;batch_size를&amp;nbsp;미리&amp;nbsp;정의해보자&lt;/p&gt;
&lt;pre id=&quot;code_1743471764216&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model = Sequential()
model.add(SimplrRNN(3, batch_input_shape=(8,2,10)))
model.summary()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;_________________________________________________________________ &lt;br /&gt;Layer&amp;nbsp;(type)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Output&amp;nbsp;Shape&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Param&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;================================================================= &lt;br /&gt;simple_rnn_2&amp;nbsp;(SimpleRNN)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(8,&amp;nbsp;3)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;42&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;================================================================= &lt;br /&gt;Total&amp;nbsp;params:&amp;nbsp;42 &lt;br /&gt;Trainable&amp;nbsp;params:&amp;nbsp;42 &lt;br /&gt;Non-trainable&amp;nbsp;params:&amp;nbsp;0 &lt;br /&gt;_________________________________________________________________ &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;batch_size를&amp;nbsp;8로&amp;nbsp;기재하면&amp;nbsp;&lt;u&gt;출력의&amp;nbsp;크기가&amp;nbsp;(8,3)&lt;/u&gt;이&amp;nbsp;됨. &lt;br /&gt;-&amp;nbsp;이번에는&lt;b&gt;&amp;nbsp;return_sequences&amp;nbsp;매개변수에&amp;nbsp;True를&lt;/b&gt;&amp;nbsp;기재하여&amp;nbsp;출력값으로&amp;nbsp;(batch_size,&amp;nbsp;timesteps,&amp;nbsp;output_dim)&amp;nbsp;크기의&amp;nbsp;3D&amp;nbsp;텐서를&amp;nbsp;리턴하도록&amp;nbsp;만들어&amp;nbsp;보자. &lt;br /&gt;-&amp;nbsp;코드:&lt;/p&gt;
&lt;pre id=&quot;code_1743471790223&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model = sequential()
model.add(SimpleRNN(3, batch_input_shape=(8,2,10), return_sequences = True))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;_________________________________________________________________ &lt;br /&gt;Layer&amp;nbsp;(type)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Output&amp;nbsp;Shape&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Param&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;================================================================= &lt;br /&gt;simple_rnn_3&amp;nbsp;(SimpleRNN)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(8,&amp;nbsp;2,&amp;nbsp;3)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;42&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;================================================================= &lt;br /&gt;Total&amp;nbsp;params:&amp;nbsp;42 &lt;br /&gt;Trainable&amp;nbsp;params:&amp;nbsp;42 &lt;br /&gt;Non-trainable&amp;nbsp;params:&amp;nbsp;0 &lt;br /&gt;_________________________________________________________________ &lt;br /&gt;-&amp;nbsp;&lt;u&gt;출력의&amp;nbsp;크기가&amp;nbsp;(8,2,3)이&amp;nbsp;됨.&lt;/u&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;&lt;br /&gt;3.&amp;nbsp;파이썬으로&amp;nbsp;RNN&amp;nbsp;구현하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- numpy로 RNN 층 구현하기 &lt;br /&gt;ht&amp;nbsp;=&amp;nbsp;tanh(WxXt&amp;nbsp;+&amp;nbsp;Whht-1+b) &lt;br /&gt;&lt;br /&gt;- t 시점의 은닉상태 = hidden_state_t, 입력데이터의 길이 = input_length (=시점의 수 timesteps), &amp;nbsp;t시점의 입력값 = input_t라고 선언.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 메모리 셀은 각 시점마다 &lt;b&gt;input_t와 hidden_state_t(&lt;/b&gt;이전 상태의 은닉 상태)를 입력으로 활성화 함수인 &lt;u&gt;하이퍼볼릭탄젠트 함수&lt;/u&gt;를 통해 &lt;u&gt;현 시점의 hidden_state_t를 계산&lt;/u&gt; &lt;br /&gt;-&amp;nbsp;아래&amp;nbsp;코드는&amp;nbsp;이해를&amp;nbsp;돕기&amp;nbsp;위해&amp;nbsp;(timesteps,&amp;nbsp;input_dim)&amp;nbsp;크기의&amp;nbsp;2D&amp;nbsp;텐서를&amp;nbsp;입력으로&amp;nbsp;받았다고&amp;nbsp;가정했으나,&amp;nbsp;실제로&amp;nbsp;케라스에서는&amp;nbsp;(batch_size,&amp;nbsp;timesteps,&amp;nbsp;input_dim)의&amp;nbsp;크기의&amp;nbsp;3D&amp;nbsp;텐서를&amp;nbsp;입력으로&amp;nbsp;받는&amp;nbsp;것을&amp;nbsp;기억하자 &lt;br /&gt;-&amp;nbsp;timestpes는&amp;nbsp;시점의&amp;nbsp;수&amp;nbsp;=&amp;gt;&amp;nbsp;자연어&amp;nbsp;처리에서는&amp;nbsp;보통&amp;nbsp;문장의&amp;nbsp;길이. &lt;br /&gt;-&amp;nbsp;input_dim은&amp;nbsp;입력의&amp;nbsp;차원&amp;nbsp;=&amp;gt;&amp;nbsp;자연어처리에서는&amp;nbsp;보통&amp;nbsp;단어&amp;nbsp;벡터의&amp;nbsp;차원 &lt;br /&gt;-&amp;nbsp;hidden_units는&amp;nbsp;은닉&amp;nbsp;상태의&amp;nbsp;크기로&amp;nbsp;메모리&amp;nbsp;셀의&amp;nbsp;용량.&amp;nbsp;초기&amp;nbsp;은닉&amp;nbsp;상태는&amp;nbsp;0의&amp;nbsp;값을&amp;nbsp;가지는&amp;nbsp;벡터로&amp;nbsp;초기화함 &lt;br /&gt;-&amp;nbsp;코드&amp;nbsp;:&lt;/p&gt;
&lt;pre id=&quot;code_1743471966600&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
timesteps = 10
input_dim = 4
hidden_units = 8
#입력에 해당되는 2D 텐서
inputs = np.random.random((timesteps, input_dim))
# 초기 은닉 상태는 0(벡터)로 초기화
hidden_state_t = np.zeros((hidden_units,))
print('초기 은닉 상태 :', hidden_state_t)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;초기&amp;nbsp;은닉&amp;nbsp;상태&amp;nbsp;:&amp;nbsp;[0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;은닉&amp;nbsp;상태의&amp;nbsp;크기를&amp;nbsp;8로&amp;nbsp;정했으니,&amp;nbsp;&lt;b&gt;8의&amp;nbsp;차원을&amp;nbsp;가지는&amp;nbsp;0의&amp;nbsp;값으로&amp;nbsp;구성된&amp;nbsp;벡터가&amp;nbsp;출력&lt;/b&gt;됨. &lt;br /&gt;-&amp;nbsp;가중치와&amp;nbsp;편향을&amp;nbsp;각&amp;nbsp;크기에&amp;nbsp;맞게&amp;nbsp;정의하고&amp;nbsp;크기를&amp;nbsp;출력해보자&lt;/p&gt;
&lt;pre id=&quot;code_1743471984815&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Wx = np.random.random((hidden_units, input_dim))  # (8,4) 크기의 2D 텐서 생성, 입력에 대한 가중치
Wh = np.random.random((hidden_units, hidden_units)) # (8,8) 크기의 2D 텐서 생성. 은닉 상태에 대한 가중치
b = np.random.random((hidden_units,)) # (8, ) 크기의 1D 텐서 생성. 이 값은 편향&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;Wx는&amp;nbsp;(은닉&amp;nbsp;상태의&amp;nbsp;크기&amp;nbsp;X&amp;nbsp;입력의&amp;nbsp;차원),&amp;nbsp;Wh는&amp;nbsp;(은닉&amp;nbsp;상태의&amp;nbsp;크기&amp;nbsp;X&amp;nbsp;은닉&amp;nbsp;상태의&amp;nbsp;크기),&amp;nbsp;b는&amp;nbsp;(은닉&amp;nbsp;상태의&amp;nbsp;크기)의&amp;nbsp;크기를&amp;nbsp;가짐. &lt;br /&gt;-&amp;nbsp;RNN&amp;nbsp;층을&amp;nbsp;동작시켜보자&lt;/p&gt;
&lt;pre id=&quot;code_1743472003816&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;total_hidden_states = []
# 각 시점 별 입력값
   # Wx * Xt + Wh * Ht-1 + b(bias)
   output_t = np.tanh(np.dot(Wx, input_t) + np.dot(Wh, hidden_state_t) + b)
   # 각 시점 t별 메모리 셀의 출력의 크기는 (timestep t, output_dim)
   # 각 시점의 은닉 상태의 값을 계속해서 누적
   total_hidden_states.append(list(output_t))
   hidden_state_t = output_t
# 출력 시 값을 깔끔하게 해주는 용도
total_hiddne_states = np.stack(total_hidden_states, axis = 0)
# (timesteps, output_dim)
print('모든 시점의 은닉 상태 : ')
print(total_hidden_states)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;모든&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태&amp;nbsp;: &lt;br /&gt;[[0.85575076&amp;nbsp;0.71627213&amp;nbsp;0.87703694&amp;nbsp;0.83938496&amp;nbsp;0.81045543&amp;nbsp;0.86482715&amp;nbsp;0.76387233&amp;nbsp;0.60007514] &lt;br /&gt;&amp;nbsp;[0.99982366&amp;nbsp;0.99985897&amp;nbsp;0.99928638&amp;nbsp;0.99989791&amp;nbsp;0.99998252&amp;nbsp;0.99977656&amp;nbsp;0.99997677&amp;nbsp;0.9998397&amp;nbsp;] &lt;br /&gt;&amp;nbsp;[0.99997583&amp;nbsp;0.99996057&amp;nbsp;0.99972541&amp;nbsp;0.99997993&amp;nbsp;0.99998684&amp;nbsp;0.99954936&amp;nbsp;0.99997638&amp;nbsp;0.99993143] &lt;br /&gt;&amp;nbsp;[0.99997782&amp;nbsp;0.99996494&amp;nbsp;0.99966651&amp;nbsp;0.99997989&amp;nbsp;0.99999115&amp;nbsp;0.99980087&amp;nbsp;0.99999107&amp;nbsp;0.9999622&amp;nbsp;] &lt;br /&gt;&amp;nbsp;[0.99997231&amp;nbsp;0.99996091&amp;nbsp;0.99976218&amp;nbsp;0.99998483&amp;nbsp;0.9999955&amp;nbsp;&amp;nbsp;0.99989239&amp;nbsp;0.99999339&amp;nbsp;0.99997324] &lt;br /&gt;&amp;nbsp;[0.99997082&amp;nbsp;0.99998754&amp;nbsp;0.99962158&amp;nbsp;0.99996278&amp;nbsp;0.99999331&amp;nbsp;0.99978731&amp;nbsp;0.99998831&amp;nbsp;0.99993414] &lt;br /&gt;&amp;nbsp;[0.99997427&amp;nbsp;0.99998367&amp;nbsp;0.99978331&amp;nbsp;0.99998173&amp;nbsp;0.99999579&amp;nbsp;0.99983689&amp;nbsp;0.99999058&amp;nbsp;0.99995531] &lt;br /&gt;&amp;nbsp;[0.99992591&amp;nbsp;0.99996115&amp;nbsp;0.99941212&amp;nbsp;0.99991593&amp;nbsp;0.999986&amp;nbsp;&amp;nbsp;&amp;nbsp;0.99966571&amp;nbsp;0.99995842&amp;nbsp;0.99987795] &lt;br /&gt;&amp;nbsp;[0.99997139&amp;nbsp;0.99997192&amp;nbsp;0.99960794&amp;nbsp;0.99996751&amp;nbsp;0.99998795&amp;nbsp;0.9996674&amp;nbsp;0.99998177&amp;nbsp;0.99993016] &lt;br /&gt;&amp;nbsp;[0.99997659&amp;nbsp;0.99998915&amp;nbsp;0.99985392&amp;nbsp;0.99998726&amp;nbsp;0.99999773&amp;nbsp;0.99988295&amp;nbsp;0.99999316&amp;nbsp;0.99996326]] &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;4.&amp;nbsp;깊은&amp;nbsp;순환&amp;nbsp;신경망(Deep&amp;nbsp;Recurrent&amp;nbsp;Neural&amp;nbsp;Network)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;은닉층이 2개 이상&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;은닉층을&amp;nbsp;2개&amp;nbsp;추가하는&amp;nbsp;경우&amp;nbsp;코드:&lt;/p&gt;
&lt;pre id=&quot;code_1743472022399&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model = Sequential()
model.add(SimppeRNN(hidden_units, input_length=10 input_dim=5, return_sequences = True))
model.add(SimpleRNN(hidden_units, return_sequences = True))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;첫번째&amp;nbsp;은닉층은&amp;nbsp;다음&amp;nbsp;은닉층이&amp;nbsp;존재하므로&amp;nbsp;return_sequences=True를&amp;nbsp;설정하여&amp;nbsp;모든&amp;nbsp;시점에&amp;nbsp;대해서&amp;nbsp;은닉&amp;nbsp;상태&amp;nbsp;값을&amp;nbsp;다음&amp;nbsp;은닉층으로&amp;nbsp;보내주고&amp;nbsp;있음&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;5.&amp;nbsp;양방향&amp;nbsp;순환&amp;nbsp;신경망(Bidirectional&amp;nbsp;Recurrent&amp;nbsp;Neural&amp;nbsp;Network)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시점 t에서의 출려값을 예측할 때 이전 시점의 입력뿐만 아니라, &lt;u&gt;이후 시점의 입력 또한 예측에 기여&lt;/u&gt;할 수 있다는 아이디어에 기반함.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;ex.&amp;nbsp;'운동을&amp;nbsp;열심히&amp;nbsp;하는&amp;nbsp;것은&amp;nbsp;[&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]을&amp;nbsp;늘리는&amp;nbsp;데&amp;nbsp;효과적이다'의&amp;nbsp;빈칸을&amp;nbsp;예측하기&amp;nbsp;위해&amp;nbsp;앞문장인&amp;nbsp;'운동을&amp;nbsp;열심히&amp;nbsp;하는&amp;nbsp;것은'만으로&amp;nbsp;빈칸을&amp;nbsp;예측하기는&amp;nbsp;어렵다. &lt;br /&gt;-&amp;nbsp;기본적으로&amp;nbsp;두&amp;nbsp;개의&amp;nbsp;메모리&amp;nbsp;셀을&amp;nbsp;사용함.&amp;nbsp;첫번째&amp;nbsp;메모리&amp;nbsp;셀은&amp;nbsp;앞&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태(Forward&amp;nbsp;States)를&amp;nbsp;전달받아&amp;nbsp;현재의&amp;nbsp;은닉&amp;nbsp;상태를&amp;nbsp;계산.&amp;nbsp;두번째&amp;nbsp;메모리&amp;nbsp;뒤&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태(Backward&amp;nbsp;States)를&amp;nbsp;전달받아&amp;nbsp;현재의&amp;nbsp;은닉&amp;nbsp;상태를&amp;nbsp;계산. &lt;br /&gt;-&amp;nbsp;코드:&lt;/p&gt;
&lt;pre id=&quot;code_1743472055807&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.layers import Bidireactinoal
timesteps = 10
input_dim = 5
model = Sequential()
model.add(Bidireactional(SimpleRNN(hidden_units, return_Sequences = True), input_shape=(timesteps, input_dim)))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;양방향도&amp;nbsp;다수의&amp;nbsp;은닉층을&amp;nbsp;가질&amp;nbsp;수&amp;nbsp;있음 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;* 내가 생각한 개념 정리) &lt;br /&gt;timesteps&amp;nbsp;:&amp;nbsp;단어&amp;nbsp;개수 &lt;br /&gt;input_dim&amp;nbsp;:&amp;nbsp;단어&amp;nbsp;길이 &lt;br /&gt;hidden_units&amp;nbsp;:&amp;nbsp;은닉노드&amp;nbsp;(hidden&amp;nbsp;units와&amp;nbsp;출력층의&amp;nbsp;차원이&amp;nbsp;같음) &lt;br /&gt;batch_size&amp;nbsp;:&amp;nbsp;데이터&amp;nbsp;개수&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;br /&gt;08-02&amp;nbsp;장단기&amp;nbsp;메모리&amp;nbsp;(Long&amp;nbsp;Short-Term&amp;nbsp;Memory,&amp;nbsp;LSTM)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 08-01에서 배운 RNN을 가장 단순한 형태의 RNN이라고 하여 바닐라 RNN이라고 함. (케라스에서 SimpleRNN) &lt;br /&gt;-&amp;nbsp;바닐라&amp;nbsp;RNN의&amp;nbsp;한계를&amp;nbsp;극복하기&amp;nbsp;위해&amp;nbsp;다양한&amp;nbsp;RNN의&amp;nbsp;변형이&amp;nbsp;나옴&amp;nbsp;-&amp;gt;&amp;nbsp;&lt;b&gt;LSTM&lt;/b&gt;도&amp;nbsp;그&amp;nbsp;중&amp;nbsp;하나.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;1.&amp;nbsp;바닐라&amp;nbsp;RNN의&amp;nbsp;한계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 비교적&amp;nbsp;&lt;u&gt;짧은&amp;nbsp;시퀀스(sequence)에&amp;nbsp;대해서만&amp;nbsp;효과를&amp;nbsp;보이는&amp;nbsp;&lt;/u&gt;단점이&amp;nbsp;있음.&amp;nbsp;바닐라&amp;nbsp;RNN의&amp;nbsp;시점이&amp;nbsp;길어질&amp;nbsp;수록&amp;nbsp;앞의&amp;nbsp;정보가&amp;nbsp;뒤로&amp;nbsp;충분히&amp;nbsp;전달되지&amp;nbsp;못하는&amp;nbsp;현상이&amp;nbsp;발생&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;b&gt;장기&amp;nbsp;의존성&amp;nbsp;문제&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;2.&amp;nbsp;바닐라&amp;nbsp;RNN&amp;nbsp;내부&amp;nbsp;열어보기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- xt와 ht-1이라는 두 개의 입력이 각각의 가중치가 곱해져서 메모리 셀의 입력이 됨. 이를 하이퍼볼릭탄젠츠 함수의 입력으로 사용하고 이 값은 은닉층의 출력인 은닉 상태가 됨.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;3. LSTM(Long Short-Term Memory)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;은닉층의&amp;nbsp;메모리&amp;nbsp;셀에&amp;nbsp;&lt;u&gt;입력&amp;nbsp;게이트,&amp;nbsp;망각&amp;nbsp;게이트,&amp;nbsp;출력&amp;nbsp;게이트&lt;/u&gt;를&amp;nbsp;추가하여&amp;nbsp;불필요한&amp;nbsp;기억을&amp;nbsp;지우고,&amp;nbsp;기억해야&amp;nbsp;할&amp;nbsp;것들을&amp;nbsp;정함&amp;nbsp;=&amp;gt;&amp;nbsp;은닉&amp;nbsp;상태를&amp;nbsp;계산하는&amp;nbsp;식이&amp;nbsp;전통적인&amp;nbsp;RNN보다&amp;nbsp;조금&amp;nbsp;&lt;b&gt;더&amp;nbsp;복잡해지고&amp;nbsp;셀&amp;nbsp;상태(cell&amp;nbsp;state)라는&amp;nbsp;값을&amp;nbsp;추가함&lt;/b&gt;&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;u&gt;긴&amp;nbsp;시퀀스의&amp;nbsp;입력을&amp;nbsp;처리하는데&amp;nbsp;탁월한&amp;nbsp;성능&lt;/u&gt;을&amp;nbsp;보임. &lt;br /&gt;-&amp;nbsp;셀&amp;nbsp;상태&amp;nbsp;또한&amp;nbsp;이전에&amp;nbsp;배운&amp;nbsp;은닉&amp;nbsp;상태처럼&amp;nbsp;이전&amp;nbsp;시점의&amp;nbsp;셀&amp;nbsp;상태가&amp;nbsp;다음&amp;nbsp;시점의&amp;nbsp;셀&amp;nbsp;상태를&amp;nbsp;구하기&amp;nbsp;위한&amp;nbsp;입력으로서&amp;nbsp;사용됨.&amp;nbsp;은닉&amp;nbsp;상태의&amp;nbsp;값과&amp;nbsp;셀&amp;nbsp;상태의&amp;nbsp;값을&amp;nbsp;구하기&amp;nbsp;위해서&amp;nbsp;새로&amp;nbsp;추가된&amp;nbsp;3개의&amp;nbsp;게이트&amp;nbsp;사용&amp;nbsp;=&amp;gt;&amp;nbsp;삭제&amp;nbsp;게이트,&amp;nbsp;입력&amp;nbsp;게이트,&amp;nbsp;출력&amp;nbsp;게이트.&amp;nbsp;&lt;u&gt;게이트&amp;nbsp;모두&amp;nbsp;시그모이드&amp;nbsp;함수가&amp;nbsp;존재&lt;/u&gt;&amp;nbsp;=&amp;gt;&amp;nbsp;0~1&amp;nbsp;사이의&amp;nbsp;값이&amp;nbsp;나오게&amp;nbsp;되는데&amp;nbsp;이&amp;nbsp;값들을&amp;nbsp;가지고&amp;nbsp;게이트를&amp;nbsp;조절. &lt;br /&gt;-&amp;nbsp;xt와&amp;nbsp;각&amp;nbsp;게이트에서&amp;nbsp;사용되는&amp;nbsp;네개의&amp;nbsp;가중치가&amp;nbsp;존재,&amp;nbsp;ht-1과&amp;nbsp;각게이트에서&amp;nbsp;사용되는&amp;nbsp;4개의&amp;nbsp;가중치가&amp;nbsp;있고,&amp;nbsp;각&amp;nbsp;게이트에서&amp;nbsp;사용되는&amp;nbsp;4개의&amp;nbsp;편향이&amp;nbsp;있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;(1)&amp;nbsp;입력&amp;nbsp;게이트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재 정보를 기억하기 위한 게이트. 우선 현재 시점 t의 x값과 입력 게이트로 이어지는 가중치 Wx를 곱한 값과 이전 시점 &lt;b&gt;t-1의 은닉 상태와 입력 게이트로 이어지는 가중치 Wh를 곱한 값&lt;/b&gt;을 더하여 &lt;u&gt;시그모이드 함수를 지남&lt;/u&gt; =&amp;gt; 그 값을 &lt;b&gt;i_t&lt;/b&gt;라고 함. &lt;br /&gt;-&amp;nbsp;그리고&amp;nbsp;현재&amp;nbsp;시점&amp;nbsp;&lt;u&gt;t의&amp;nbsp;x값과입력&amp;nbsp;게이트로&amp;nbsp;이어지는&amp;nbsp;가중치&amp;nbsp;Wxg를&amp;nbsp;곱한&amp;nbsp;값&lt;/u&gt;과&amp;nbsp;이전&amp;nbsp;시점&lt;u&gt;&amp;nbsp;t-1의&amp;nbsp;은닉&amp;nbsp;상태가&amp;nbsp;입력&amp;nbsp;게이트로&amp;nbsp;이어지는&amp;nbsp;가중치&amp;nbsp;Whg를&amp;nbsp;곱한&amp;nbsp;값&lt;/u&gt;을&amp;nbsp;더하여&amp;nbsp;하이퍼볼릭탄젠트&amp;nbsp;함수를&amp;nbsp;지남&amp;nbsp;=&amp;gt;&amp;nbsp;이를&amp;nbsp;&lt;b&gt;gt&lt;/b&gt;라고&amp;nbsp;함. &lt;br /&gt;-&amp;nbsp;시그모이드&amp;nbsp;함수를&amp;nbsp;지나&amp;nbsp;0과&amp;nbsp;1&amp;nbsp;사이의&amp;nbsp;값을&amp;nbsp;가지는&amp;nbsp;i_t와&amp;nbsp;하이퍼볼릭탄젠트&amp;nbsp;함수를&amp;nbsp;지나&amp;nbsp;-1과&amp;nbsp;1&amp;nbsp;사이의&amp;nbsp;값을&amp;nbsp;가지는&amp;nbsp;gt.&amp;nbsp;이&amp;nbsp;두&amp;nbsp;개의&amp;nbsp;값을&amp;nbsp;가지고&amp;nbsp;이번에&amp;nbsp;선택된&amp;nbsp;기억할&amp;nbsp;정보의&amp;nbsp;양을&amp;nbsp;정하게&amp;nbsp;됨. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2)&amp;nbsp;삭제&amp;nbsp;게이트 &lt;/b&gt;&lt;br /&gt;-&amp;nbsp;기억을&amp;nbsp;삭제하기&amp;nbsp;위한&amp;nbsp;게이트. &lt;br /&gt;-&amp;nbsp;현재&amp;nbsp;시점&lt;u&gt;&amp;nbsp;t의&amp;nbsp;x값과&amp;nbsp;이전&amp;nbsp;시점&amp;nbsp;t-1의&amp;nbsp;은닉&amp;nbsp;상태&lt;/u&gt;가&amp;nbsp;시그모이드&amp;nbsp;함수를&amp;nbsp;지나게&amp;nbsp;되면서&amp;nbsp;0과&amp;nbsp;1&amp;nbsp;사이의&amp;nbsp;값이&amp;nbsp;나오는데,&amp;nbsp;이&amp;nbsp;값이&amp;nbsp;곧&amp;nbsp;삭제&amp;nbsp;과정을&amp;nbsp;거친&amp;nbsp;정보의&amp;nbsp;양. &lt;br /&gt;-&amp;nbsp;&lt;b&gt;0에&amp;nbsp;가까울&amp;nbsp;수록&amp;nbsp;정보가&amp;nbsp;많이&amp;nbsp;삭제된&amp;nbsp;것&lt;/b&gt;이고,&amp;nbsp;1에&amp;nbsp;가까울수록&amp;nbsp;정보를&amp;nbsp;온전히&amp;nbsp;기억한&amp;nbsp;것.&amp;nbsp;이를&amp;nbsp;가지고&amp;nbsp;셀&amp;nbsp;상태를&amp;nbsp;구하게&amp;nbsp;됨. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;(3)&amp;nbsp;셀&amp;nbsp;상태 &lt;/b&gt;&lt;br /&gt;-&amp;nbsp;셀&amp;nbsp;상태&amp;nbsp;&lt;b&gt;Ct&lt;/b&gt;를&amp;nbsp;구하는&amp;nbsp;방법을&amp;nbsp;알아보자.&amp;nbsp;(삭제&amp;nbsp;게이트에서&amp;nbsp;일부&amp;nbsp;기억을&amp;nbsp;잃은&amp;nbsp;상태) &lt;br /&gt;-&amp;nbsp;입력&amp;nbsp;게이트에서&amp;nbsp;구한&amp;nbsp;&lt;u&gt;i_t,&amp;nbsp;gt&amp;nbsp;두&amp;nbsp;개의&amp;nbsp;값에&amp;nbsp;대해서&amp;nbsp;원소별&amp;nbsp;곱을&amp;nbsp;진행&lt;/u&gt;.&amp;nbsp;=&amp;gt;&amp;nbsp;같은&amp;nbsp;크기의&amp;nbsp;두&amp;nbsp;행렬이&amp;nbsp;있을&amp;nbsp;때&amp;nbsp;같은&amp;nbsp;위치의&amp;nbsp;성분끼리&amp;nbsp;곱하는&amp;nbsp;것을&amp;nbsp;말함.&amp;nbsp;식으로는&amp;nbsp;○&amp;nbsp;이라고&amp;nbsp;표현.&amp;nbsp;이것이&amp;nbsp;이번에&amp;nbsp;선택된&amp;nbsp;기억할&amp;nbsp;값. &lt;br /&gt;-&amp;nbsp;입력&amp;nbsp;게이트에서&amp;nbsp;선택된&amp;nbsp;기억을&amp;nbsp;삭제&amp;nbsp;게이트의&amp;nbsp;결과값과&amp;nbsp;더하기.&amp;nbsp;이&amp;nbsp;값을&amp;nbsp;현재&amp;nbsp;시점&amp;nbsp;t의&amp;nbsp;셀&amp;nbsp;상태라고&amp;nbsp;하며,&amp;nbsp;이&amp;nbsp;값은&amp;nbsp;다음&amp;nbsp;시점&amp;nbsp;t+1&amp;nbsp;시점의&amp;nbsp;LSTM&amp;nbsp;셀로&amp;nbsp;넘겨짐. &lt;br /&gt;-&amp;nbsp;&lt;b&gt;삭제&amp;nbsp;게이트의&amp;nbsp;출력값인&amp;nbsp;ft가&amp;nbsp;0이&amp;nbsp;되면,&amp;nbsp;&lt;/b&gt;이전&amp;nbsp;시점의&amp;nbsp;셀&amp;nbsp;상태의&amp;nbsp;값인&amp;nbsp;&lt;u&gt;Ct-1은&amp;nbsp;현재&amp;nbsp;시점의&amp;nbsp;셀&amp;nbsp;상태의&amp;nbsp;값을&amp;nbsp;결정하기&amp;nbsp;위한&amp;nbsp;영향력이&amp;nbsp;0이&amp;nbsp;되면서&lt;/u&gt;,&amp;nbsp;오직&amp;nbsp;&lt;u&gt;입력&amp;nbsp;게이트의&amp;nbsp;결과만이&amp;nbsp;현재&amp;nbsp;시점의&amp;nbsp;셀&amp;nbsp;상태의&amp;nbsp;값&amp;nbsp;Ct를&amp;nbsp;결정할&amp;nbsp;수&amp;nbsp;있음&lt;/u&gt;&amp;nbsp;=&amp;gt;&amp;nbsp;삭제&amp;nbsp;게이트가&amp;nbsp;완전히&amp;nbsp;닫히고&amp;nbsp;입력&amp;nbsp;게이트를&amp;nbsp;연&amp;nbsp;상태를&amp;nbsp;의미. &lt;br /&gt;-&amp;nbsp;입력&amp;nbsp;게이트의&amp;nbsp;&lt;b&gt;i_t&amp;nbsp;값을&amp;nbsp;0이&lt;/b&gt;라고 한다면, 현재 시점의 셀 상태의 값 &lt;b&gt;Ct는 오직 이전 시점의 셀 상태의 값 Ct-1의 값에만 의존&lt;/b&gt; =&amp;gt; 이는 입력 게이트를 완전히 닫고 삭제 게이트만을 연 상태를 의미.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;결과적으로&amp;nbsp;삭제&amp;nbsp;게이트는&amp;nbsp;이전&amp;nbsp;시점의&amp;nbsp;입력을&amp;nbsp;얼마나&amp;nbsp;반영할지의&amp;nbsp;의미이고,&amp;nbsp;입력&amp;nbsp;게이트는&amp;nbsp;현재&amp;nbsp;시점의&amp;nbsp;입력을&amp;nbsp;얼마나&amp;nbsp;반영할지를&amp;nbsp;결정 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;(4)&amp;nbsp;출력&amp;nbsp;게이트와&amp;nbsp;은닉&amp;nbsp;상태 &lt;/b&gt;&lt;br /&gt;-&amp;nbsp;현재&amp;nbsp;시점의&lt;b&gt;&amp;nbsp;t의&amp;nbsp;x값과&amp;nbsp;이전&amp;nbsp;시점&amp;nbsp;t-1의&amp;nbsp;은닉&amp;nbsp;상태&lt;/b&gt;가&amp;nbsp;시그모이드&amp;nbsp;함수를&amp;nbsp;지난&amp;nbsp;값.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;해당&amp;nbsp;값은&amp;nbsp;&lt;u&gt;현재&amp;nbsp;시점&amp;nbsp;t의&amp;nbsp;은닉&amp;nbsp;상태를&amp;nbsp;결정&lt;/u&gt;하는&amp;nbsp;일에&amp;nbsp;쓰임.&amp;nbsp;셀&amp;nbsp;상태의&amp;nbsp;값이&amp;nbsp;하이퍼볼릭탄젠트&amp;nbsp;함수를&amp;nbsp;지나&amp;nbsp;-1과&amp;nbsp;1&amp;nbsp;사이의&amp;nbsp;값이&amp;nbsp;되고,&amp;nbsp;해당&amp;nbsp;값은&amp;nbsp;출력&amp;nbsp;게이트&amp;nbsp;값과&amp;nbsp;연산되면서&amp;nbsp;,&amp;nbsp;값이&amp;nbsp;걸러지는&amp;nbsp;효과가&amp;nbsp;발생하여&amp;nbsp;은닉&amp;nbsp;상태가&amp;nbsp;됨.&amp;nbsp;은닉&amp;nbsp;상태의&amp;nbsp;값은&amp;nbsp;또한&amp;nbsp;출력층으로도&amp;nbsp;향함. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;08-03&amp;nbsp;게이트&amp;nbsp;순환&amp;nbsp;유닛&amp;nbsp;(Gated&amp;nbsp;Recurrent&amp;nbsp;Unit,&amp;nbsp;GRU)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LSTM의 장기 의존성 문제에 대한 해결책을 유지하면서,&lt;b&gt; 은닉 상태를 업데이트하는 계산을 줄임&lt;/b&gt;. &lt;br /&gt;-&amp;nbsp;즉,&amp;nbsp;GPU&amp;nbsp;성능은&amp;nbsp;LSTM과&amp;nbsp;유사하면서&amp;nbsp;복잡한&amp;nbsp;LSTM&amp;nbsp;구조를&amp;nbsp;간단화&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;1.&amp;nbsp;GRU&amp;nbsp;(Gated&amp;nbsp;Recurrent&amp;nbsp;Unit)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;업데이트 게이트와 리셋 게이트&lt;/b&gt; 두 가지 게이트만 존재. &lt;br /&gt;-&amp;nbsp;LSTM과&amp;nbsp;비교하여&amp;nbsp;어떤&amp;nbsp;것이&amp;nbsp;성능이&amp;nbsp;낫다라고&amp;nbsp;단정지을&amp;nbsp;수&amp;nbsp;없지만,&amp;nbsp;경험적으로&amp;nbsp;&lt;u&gt;데이터&amp;nbsp;양이&amp;nbsp;적을&amp;nbsp;때&lt;/u&gt;는 매개 변수의 양이 적은 &lt;b&gt;GRU&lt;/b&gt;가 조금 더 낫고, &lt;u&gt;데이터 양이 더 많으면&lt;/u&gt; &lt;b&gt;LSTM&lt;/b&gt;이 더 낫다고도 함.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;2.&amp;nbsp;케라스에서의&amp;nbsp;GRU&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 코드:&lt;/p&gt;
&lt;pre id=&quot;code_1743472390094&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.add(GRU(hidden_size, input_shape=(timesteps, input_dim)))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;08-04&amp;nbsp;케라스의&amp;nbsp;SimpleRNN과&amp;nbsp;LSTM&amp;nbsp;이해하기&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 임의의 입력 생성하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 코드:&lt;/p&gt;
&lt;pre id=&quot;code_1743472416341&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import SimpleRNN, LSTM, Bidirectional
# 임의의 입력 생성
train_X = [[0.1, 4.2, 1.5, 1.1, 2.8], [1.0, 3.1, 2.5, 0.7, 1.1], [0.3, 2.1, 1.5, 2.1, 0.1], [2.2, 1.4, 0.5, 0.9, 1.1]]
print(np.shape(train_X))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;(4,&amp;nbsp;5) &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;벡터의&amp;nbsp;차원은&amp;nbsp;5이고,&amp;nbsp;문장의&amp;nbsp;길이가&amp;nbsp;4인&amp;nbsp;경우를&amp;nbsp;가정한&amp;nbsp;입력&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;b&gt;4번의&amp;nbsp;시점&lt;/b&gt;(timesteps),&amp;nbsp;각&amp;nbsp;시점마다&lt;b&gt;&amp;nbsp;5차원의&amp;nbsp;단어&amp;nbsp;벡터가&amp;nbsp;입력으로&amp;nbsp;사용&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;RNN은&amp;nbsp;2D&amp;nbsp;텐서가&amp;nbsp;아니라&amp;nbsp;3D&amp;nbsp;텐서를&amp;nbsp;입력으로&amp;nbsp;받으므로&amp;nbsp;2D&amp;nbsp;텐서를&amp;nbsp;3D&amp;nbsp;텐서로&amp;nbsp;변경&amp;nbsp;=&amp;gt;&amp;nbsp;배치&amp;nbsp;크기&amp;nbsp;1을&amp;nbsp;추가하기 &lt;br /&gt;-&amp;nbsp;코드&amp;nbsp;:&lt;/p&gt;
&lt;pre id=&quot;code_1743472437805&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;train_X = [[[0.1, 4.2, 1.5, 1.1, 2.8], [1.0, 3.1, 2.5, 0.7, 1.1], [0.3, 2.1, 1.5, 2.1, 0.1], [2.2, 1.4, 0.5, 0.9, 1.1]]]
train_X = np.array(train_X, dtype=np.float32)
print(train_X.shape)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;(1,&amp;nbsp;4,&amp;nbsp;5) &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;(batch_size,&amp;nbsp;timesteps,&amp;nbsp;input_dim)에&amp;nbsp;해당되는&amp;nbsp;(1,4,5)의&amp;nbsp;크기를&amp;nbsp;가지는&amp;nbsp;3D&amp;nbsp;텐서&amp;nbsp;생성.&amp;nbsp;batch_size는&amp;nbsp;한&amp;nbsp;번에&amp;nbsp;rNN이&amp;nbsp;학습하는&amp;nbsp;데이터의&amp;nbsp;양을&amp;nbsp;의미하지만,&amp;nbsp;여기서는&amp;nbsp;샘플이&amp;nbsp;하나밖에&amp;nbsp;없으므로&amp;nbsp;batch_size는&amp;nbsp;1이다.&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;&lt;br /&gt;2.&amp;nbsp;SimpleRNN&amp;nbsp;이해하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대표적인 인자로 return_sequences와 return_state가 있음. 기본값은 둘 다 False. 은닉 상태의 크기를 3으로 지정한 출력값을 확인해보자 &lt;br /&gt;-&amp;nbsp;코드:&lt;/p&gt;
&lt;pre id=&quot;code_1743472454847&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rnn = SimpleRNN(3)
# rnn = SimpleRNN(3, return_sequence=False, return_state = False)와 동일
hidden_state = rnn(train_X)
print('hidden state : {}, shape : {}'.format(hidden_state, hidden_state.shape))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;hidden&amp;nbsp;state&amp;nbsp;:&amp;nbsp;[[-0.866719&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.95010996&amp;nbsp;-0.99262357]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;3) &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;(1,3)&amp;nbsp;크기의&amp;nbsp;텐서가&amp;nbsp;출력되는데,&amp;nbsp;이는&amp;nbsp;마지막&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태.&amp;nbsp;&lt;b&gt;은닉&amp;nbsp;상태의&amp;nbsp;크기를&amp;nbsp;3으로&amp;nbsp;지정&lt;/b&gt;했음을&amp;nbsp;주목하자.&amp;nbsp;r&lt;u&gt;eturn_sequences가&amp;nbsp;False인&amp;nbsp;경우에는&amp;nbsp;&amp;nbsp;마지막&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태만&amp;nbsp;출력&lt;/u&gt;. &lt;br /&gt;-&amp;nbsp;return_sequences=True일때&amp;nbsp;코드:&lt;/p&gt;
&lt;pre id=&quot;code_1743472475740&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rnn = SimpleRNN(3, return_sequences = True)
hidden_states = rnn(train_X)
print('hidden state : {}, shape {}'.format(hidden_state, hidden_state.shape))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력&amp;nbsp;: &lt;br /&gt;hidden&amp;nbsp;states&amp;nbsp;:&amp;nbsp;[[[&amp;nbsp;0.92948604&amp;nbsp;-0.9985648&amp;nbsp;&amp;nbsp;&amp;nbsp;0.98355013] &lt;br /&gt;&amp;nbsp;&amp;nbsp;[&amp;nbsp;0.89172053&amp;nbsp;-0.9984244&amp;nbsp;&amp;nbsp;&amp;nbsp;0.191779&amp;nbsp;&amp;nbsp;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;[&amp;nbsp;0.6681082&amp;nbsp;&amp;nbsp;-0.96070355&amp;nbsp;&amp;nbsp;0.6493537&amp;nbsp;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;[&amp;nbsp;0.95280755&amp;nbsp;-0.98054564&amp;nbsp;&amp;nbsp;0.7224146&amp;nbsp;]]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;4,&amp;nbsp;3)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;(1,4,3)&amp;nbsp;크기의&amp;nbsp;텐서가&amp;nbsp;출력됨.&amp;nbsp;입력&amp;nbsp;데이터는&amp;nbsp;(1,4,5)&amp;nbsp;크기를&amp;nbsp;가지는&amp;nbsp;3D&amp;nbsp;텐서였고,&amp;nbsp;그&amp;nbsp;중&amp;nbsp;4가&amp;nbsp;시점에&amp;nbsp;해당하는&amp;nbsp;값이므로&amp;nbsp;모든&amp;nbsp;시점에&amp;nbsp;대해서&amp;nbsp;은닉&amp;nbsp;상태의&amp;nbsp;값을&amp;nbsp;출력하여&amp;nbsp;(1,4,3)&amp;nbsp;크기의&amp;nbsp;텐서를&amp;nbsp;출력. &lt;br /&gt;-&amp;nbsp;return_state가&amp;nbsp;True일&amp;nbsp;경우에는&amp;nbsp;return_sequences에&amp;nbsp;상관없이&amp;nbsp;마지막&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태를&amp;nbsp;출력. &lt;br /&gt;-&amp;nbsp;코드&amp;nbsp;:&lt;/p&gt;
&lt;pre id=&quot;code_1743472490416&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rnn = SimpleRNN(3, return_sequences = True, return_state = True)
hidden_states, last_state = rnn(train_X)

print('hidden state : {}, shape : {}'.format(hidden_states, hidden_states.shape))
print('last hidden state : {}, shape : {}'.format(last_state, last_states.shape))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력&amp;nbsp;: &lt;br /&gt;hidden&amp;nbsp;states&amp;nbsp;:&amp;nbsp;[[[&amp;nbsp;0.29839835&amp;nbsp;-0.99608386&amp;nbsp;&amp;nbsp;0.2994854&amp;nbsp;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;[&amp;nbsp;0.9160876&amp;nbsp;&amp;nbsp;&amp;nbsp;0.01154806&amp;nbsp;&amp;nbsp;0.86181474] &lt;br /&gt;&amp;nbsp;&amp;nbsp;[-0.20252597&amp;nbsp;-0.9270214&amp;nbsp;&amp;nbsp;&amp;nbsp;0.9696659&amp;nbsp;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;[-0.5144398&amp;nbsp;&amp;nbsp;-0.5037417&amp;nbsp;&amp;nbsp;&amp;nbsp;0.96605766]]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;4,&amp;nbsp;3) &lt;br /&gt;last&amp;nbsp;hidden&amp;nbsp;state&amp;nbsp;:&amp;nbsp;[[-0.5144398&amp;nbsp;&amp;nbsp;-0.5037417&amp;nbsp;&amp;nbsp;&amp;nbsp;0.96605766]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;3) &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;첫번째&amp;nbsp;출력은&amp;nbsp;return_sequences&amp;nbsp;=&amp;nbsp;True로&amp;nbsp;인한&amp;nbsp;출력으로&amp;nbsp;&lt;u&gt;모든&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태&lt;/u&gt; &lt;br /&gt;-&amp;nbsp;두번째&amp;nbsp;출력은&amp;nbsp;return_state&amp;nbsp;=&amp;nbsp;True로&amp;nbsp;인한&amp;nbsp;출력으로&amp;nbsp;&lt;u&gt;마지막&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태&lt;/u&gt;. &lt;br /&gt;-&amp;nbsp;이번에는&amp;nbsp;return_sequences가&amp;nbsp;False,&amp;nbsp;return_state&amp;nbsp;=True인&amp;nbsp;경우&amp;nbsp;코드&amp;nbsp;:&lt;/p&gt;
&lt;pre id=&quot;code_1743472519685&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rnn = SimpleRNN(3, return_sequences = False, return_state = True)
hidden_state, last_state = rnn(train_X)
print('hidden state : {}, shape : {}'.format(hidden_state, hidden_state.shape))
print('last hidden state : {}, shape: {}'.format(last_state, last_state.shape))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;hidden&amp;nbsp;state&amp;nbsp;:&amp;nbsp;[[0.07532981&amp;nbsp;0.97772664&amp;nbsp;0.97351676]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;3) &lt;br /&gt;last&amp;nbsp;hidden&amp;nbsp;state&amp;nbsp;:&amp;nbsp;[[0.07532981&amp;nbsp;0.97772664&amp;nbsp;0.97351676]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;3) &lt;br /&gt;-&amp;nbsp;두&amp;nbsp;개의&amp;nbsp;출력&amp;nbsp;모두&amp;nbsp;마지막&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태를&amp;nbsp;출력하게&amp;nbsp;됨&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;&lt;br /&gt;3.&amp;nbsp;LSTM&amp;nbsp;이해하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실제로 SimpleRNN이 사용되는 경우는 거의 없고,&lt;b&gt; LSTM이나 GRU를 주로 사용&lt;/b&gt;. 그 중 LSTM을 사용할 경우를 보자. &lt;br /&gt;-&amp;nbsp;코드&amp;nbsp;:&lt;/p&gt;
&lt;pre id=&quot;code_1743472537351&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lstm = LSTM(3, return_sequences = False, return_state = True)
hidden_state, last_state, last_cell_state = lstm(train_X)

print('hidden state : {}, shape : {}'.format(hidden_state, hidden_state.shape))
print('last hidden state : {}, shape: {}'.format(last_state, last_state.shape))
print('last cell state : {}, shape : {}'.format(last_cell_state, last_cell_state.shape))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;hidden&amp;nbsp;state&amp;nbsp;:&amp;nbsp;[[-0.00263056&amp;nbsp;&amp;nbsp;0.20051427&amp;nbsp;-0.22501363]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;3) &lt;br /&gt;last&amp;nbsp;hidden&amp;nbsp;state&amp;nbsp;:&amp;nbsp;[[-0.00263056&amp;nbsp;&amp;nbsp;0.20051427&amp;nbsp;-0.22501363]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;3) &lt;br /&gt;last&amp;nbsp;cell&amp;nbsp;state&amp;nbsp;:&amp;nbsp;[[-0.04346419&amp;nbsp;&amp;nbsp;0.44769213&amp;nbsp;-0.2644241&amp;nbsp;]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;3) &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;SimpleRNN과&amp;nbsp;달리&amp;nbsp;세&amp;nbsp;개의&amp;nbsp;결과를&amp;nbsp;반환.&amp;nbsp;return_sequences가&amp;nbsp;False이므로&amp;nbsp;우선&amp;nbsp;&lt;b&gt;첫번째&amp;nbsp;결과는&amp;nbsp;마지막&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태.&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;SimpleRNN과&amp;nbsp;다른&amp;nbsp;점은&amp;nbsp;return_state를&amp;nbsp;True로&amp;nbsp;둔&amp;nbsp;경우에는&amp;nbsp;마지막&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태뿐만&amp;nbsp;아니라&lt;b&gt;&amp;nbsp;셀&amp;nbsp;상태까지&amp;nbsp;반환한다는&amp;nbsp;점&lt;/b&gt;. &lt;br /&gt;-&amp;nbsp;return_sequences&amp;nbsp;=&amp;nbsp;True&amp;nbsp;코드:&lt;/p&gt;
&lt;pre id=&quot;code_1743472558789&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lstm = LSTM(3, return_sequences=True, return_state=True)
hidden_states, last_hidden_state, last_cell_state = lstm(train_X)
print('hidden states : {}, shape: {}'.format(hidden_states, hidden_states.shape))
print('last hidden state : {}, shape: {}'.format(last_hidden_state, last_hidden_state.shape))
print('last cell state : {}, shape: {}'.format(last_cell_state, last_cell_state.shape))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;hidden&amp;nbsp;states&amp;nbsp;:&amp;nbsp;[[[&amp;nbsp;0.1383949&amp;nbsp;&amp;nbsp;&amp;nbsp;0.01107763&amp;nbsp;-0.00315794] &lt;br /&gt;&amp;nbsp;&amp;nbsp;[&amp;nbsp;0.0859854&amp;nbsp;&amp;nbsp;&amp;nbsp;0.03685492&amp;nbsp;-0.01836833] &lt;br /&gt;&amp;nbsp;&amp;nbsp;[-0.02512104&amp;nbsp;&amp;nbsp;0.12305924&amp;nbsp;-0.0891041&amp;nbsp;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;[-0.27381724&amp;nbsp;&amp;nbsp;0.05733536&amp;nbsp;-0.04240693]]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;4,&amp;nbsp;3) &lt;br /&gt;last&amp;nbsp;hidden&amp;nbsp;state&amp;nbsp;:&amp;nbsp;[[-0.27381724&amp;nbsp;&amp;nbsp;0.05733536&amp;nbsp;-0.04240693]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;3) &lt;br /&gt;last&amp;nbsp;cell&amp;nbsp;state&amp;nbsp;:&amp;nbsp;[[-0.39230722&amp;nbsp;&amp;nbsp;1.5474017&amp;nbsp;&amp;nbsp;-0.6344505&amp;nbsp;]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;3) &lt;br /&gt;-&amp;nbsp;두번째&amp;nbsp;출력값은&amp;nbsp;마지막&amp;nbsp;은닉&amp;nbsp;상태,&amp;nbsp;세번째&amp;nbsp;출력값은&amp;nbsp;셀&amp;nbsp;상태인&amp;nbsp;것은&amp;nbsp;변함없지만,&amp;nbsp;return_state=True이므로&amp;nbsp;첫번째&amp;nbsp;출력값은&amp;nbsp;모든&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태가&amp;nbsp;출력&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;4. Bidirectional(LSTM) 이해하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;양방향&amp;nbsp;LSTM의&amp;nbsp;출력값을&amp;nbsp;확인해보자.&amp;nbsp;return_sequences가&amp;nbsp;True인&amp;nbsp;경우와&amp;nbsp;False인&amp;nbsp;경우에&amp;nbsp;대해서&amp;nbsp;은닉&amp;nbsp;상태의&amp;nbsp;값이&amp;nbsp;어떻게&amp;nbsp;바뀌는지&amp;nbsp;직접&amp;nbsp;비교하기&amp;nbsp;위해&amp;nbsp;이번에는&amp;nbsp;출력되는&amp;nbsp;은닉&amp;nbsp;상태의&amp;nbsp;값을&amp;nbsp;고정. &lt;br /&gt;-&amp;nbsp;코드&amp;nbsp;:&lt;/p&gt;
&lt;pre id=&quot;code_1743472577341&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;k_init = tf.keras.initializers.Constant(value = 0.1)
b_init = tf.keras.initializers.Constant(value=0)
r_init = tf.keras.initializers.Constant(value = 0.1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;return_sequences가&amp;nbsp;False이고,&amp;nbsp;return_State가&amp;nbsp;True인&amp;nbsp;경우&amp;nbsp;코드&amp;nbsp;:&lt;/p&gt;
&lt;pre id=&quot;code_1743472585324&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bilstm = Bidirectional(LSTM(3, return_sequences = False, return_state = True, kernel_initializer=k_init, 
                 bias_initializer = b_nit, recurrent_initializer = r_init)
hidden_states, forward_h, forward_c, backward_h, backward_c = bilstm(train_X)
print('hidden states : {}, shape: {}'.format(hidden_states, hidden_states.shape))
print('forward state : {}, shape: {}'.format(forward_h, forward_h.shape))
print('backward state : {}, shape: {}'.format(backward_h, backward_h.shape))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;출력: &lt;br /&gt;hidden&amp;nbsp;states&amp;nbsp;:&amp;nbsp;[[0.6303139&amp;nbsp;&amp;nbsp;0.6303139&amp;nbsp;&amp;nbsp;0.6303139&amp;nbsp;&amp;nbsp;0.70387346&amp;nbsp;0.70387346&amp;nbsp;0.70387346]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;6) &lt;br /&gt;forward&amp;nbsp;state&amp;nbsp;:&amp;nbsp;[[0.6303139&amp;nbsp;0.6303139&amp;nbsp;0.6303139]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;3) &lt;br /&gt;backward&amp;nbsp;state&amp;nbsp;:&amp;nbsp;[[0.70387346&amp;nbsp;0.70387346&amp;nbsp;0.70387346]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;3)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;&lt;b&gt;return_state&amp;nbsp;=&amp;nbsp;True&lt;/b&gt;인&amp;nbsp;경우에는&amp;nbsp;&lt;u&gt;정방향&amp;nbsp;LSTM의&amp;nbsp;은닉&amp;nbsp;상태와&amp;nbsp;셀&amp;nbsp;상태&lt;/u&gt;,&amp;nbsp;&lt;u&gt;역방향&amp;nbsp;LSTM의&amp;nbsp;은닉&amp;nbsp;상태와&amp;nbsp;셀&amp;nbsp;상태&lt;/u&gt;&amp;nbsp;4가지를&amp;nbsp;반환하기&amp;nbsp;때문에&amp;nbsp;은닉상태까지&amp;nbsp;총&amp;nbsp;5가지의&amp;nbsp;값을&amp;nbsp;반환.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;출력값의&amp;nbsp;크기가&amp;nbsp;(1,6)인&amp;nbsp;것에&amp;nbsp;주목해보자.&amp;nbsp;이는&lt;b&gt;&amp;nbsp;return_sequences가&amp;nbsp;False&lt;/b&gt;인&amp;nbsp;경우&amp;nbsp;정방향&amp;nbsp;&lt;u&gt;LSTM의&amp;nbsp;마지막&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태와&amp;nbsp;역방향&amp;nbsp;LSTM의&amp;nbsp;첫번째&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태가&amp;nbsp;연결된&amp;nbsp;채&amp;nbsp;반환&lt;/u&gt;되기&amp;nbsp;때문. &lt;br /&gt;-&amp;nbsp;return_state가&amp;nbsp;True인&amp;nbsp;경우에&amp;nbsp;반환한&amp;nbsp;은닉&amp;nbsp;상태의&amp;nbsp;값인&amp;nbsp;forward_h와&amp;nbsp;backward_h는&amp;nbsp;각각&amp;nbsp;정방향&amp;nbsp;LSTM의&amp;nbsp;마지막&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태와&amp;nbsp;역방향&amp;nbsp;LSTM의&amp;nbsp;첫번째&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태값.&amp;nbsp;이&amp;nbsp;두&amp;nbsp;값을&amp;nbsp;연결한&amp;nbsp;값이&amp;nbsp;hidden_states에&amp;nbsp;출력되는&amp;nbsp;값. &lt;br /&gt;&lt;br /&gt;-정방향&amp;nbsp;LSTM의&amp;nbsp;마지막&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태값과&amp;nbsp;역방향&amp;nbsp;LSTM의&amp;nbsp;첫번째&amp;nbsp;은닉&amp;nbsp;상태값을&amp;nbsp;기억하자. &lt;br /&gt;&amp;nbsp;&amp;nbsp;정방향&amp;nbsp;LSTM의&amp;nbsp;마지막&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태값&amp;nbsp;:&amp;nbsp;[0.6303139&amp;nbsp;0.6303139&amp;nbsp;0.6303139] &lt;br /&gt;&amp;nbsp;&amp;nbsp;역방향&amp;nbsp;LSTM의&amp;nbsp;첫번째&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태값&amp;nbsp;:&amp;nbsp;[0.70387346&amp;nbsp;0.70387346&amp;nbsp;0.70387346] &lt;br /&gt;-&amp;nbsp;현재&amp;nbsp;은닉&amp;nbsp;상태의&amp;nbsp;값을&amp;nbsp;고정시켜두었기&amp;nbsp;때문에&amp;nbsp;return_sequences를&amp;nbsp;True로&amp;nbsp;할&amp;nbsp;경우&amp;nbsp;출력이&amp;nbsp;어떻게&amp;nbsp;변하는지&amp;nbsp;비교가&amp;nbsp;가능함.&amp;nbsp;코드&amp;nbsp;:&lt;/p&gt;
&lt;pre id=&quot;code_1743472633893&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bilstm = Bidirectional(LSTM(3, return_sequences=True, return_state=True, \
                            kernel_initializer=k_init, bias_initializer=b_init, recurrent_initializer=r_init))
hidden_states, forward_h, forward_c, backward_h, backward_c = bilstm(train_X)
print('hidden states : {}, shape: {}'.format(hidden_states, hidden_states.shape))
print('forward state : {}, shape: {}'.format(forward_h, forward_h.shape))
print('backward state : {}, shape: {}'.format(backward_h, backward_h.shape))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-출력: &lt;br /&gt;hidden&amp;nbsp;states&amp;nbsp;:&amp;nbsp;[[[0.3590648&amp;nbsp;&amp;nbsp;0.3590648&amp;nbsp;&amp;nbsp;0.3590648&amp;nbsp;&amp;nbsp;0.70387346&amp;nbsp;0.70387346&amp;nbsp;0.70387346] &lt;br /&gt;&amp;nbsp;&amp;nbsp;[0.5511133&amp;nbsp;&amp;nbsp;0.5511133&amp;nbsp;&amp;nbsp;0.5511133&amp;nbsp;&amp;nbsp;0.5886358&amp;nbsp;&amp;nbsp;0.5886358&amp;nbsp;&amp;nbsp;0.5886358&amp;nbsp;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;[0.5911575&amp;nbsp;&amp;nbsp;0.5911575&amp;nbsp;&amp;nbsp;0.5911575&amp;nbsp;&amp;nbsp;0.39516988&amp;nbsp;0.39516988&amp;nbsp;0.39516988] &lt;br /&gt;&amp;nbsp;&amp;nbsp;[0.6303139&amp;nbsp;&amp;nbsp;0.6303139&amp;nbsp;&amp;nbsp;0.6303139&amp;nbsp;&amp;nbsp;0.21942243&amp;nbsp;0.21942243&amp;nbsp;0.21942243]]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;4,&amp;nbsp;6) &lt;br /&gt;forward&amp;nbsp;state&amp;nbsp;:&amp;nbsp;[[0.6303139&amp;nbsp;0.6303139&amp;nbsp;0.6303139]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;3) &lt;br /&gt;backward&amp;nbsp;state&amp;nbsp;:&amp;nbsp;[[0.70387346&amp;nbsp;0.70387346&amp;nbsp;0.70387346]],&amp;nbsp;shape:&amp;nbsp;(1,&amp;nbsp;3) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;hidden&amp;nbsp;states의&amp;nbsp;출력값에선는&amp;nbsp;이제&amp;nbsp;모든&amp;nbsp;시점의&amp;nbsp;은닉&amp;nbsp;상태가&amp;nbsp;출력됨.&amp;nbsp;역방향&amp;nbsp;LSTM의&amp;nbsp;첫번째&amp;nbsp;시점의&amp;nbsp;은닉상태는&amp;nbsp;더이상&amp;nbsp;정방향&amp;nbsp;LSTM의&amp;nbsp;마지막&amp;nbsp;시점의&amp;nbsp;은닉상태와&amp;nbsp;연결됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8장도 길어서 (2)편으로 이어서 써야 할듯..! 완벽히 이해되지는 않았지만 그래도 계속 하다보면 이해되지 않을까.. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;TodayToday'STheBigDayGaryGIF (2).gif&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7OcB0/btsM41caC0g/XO2XpM8w1DfrPIFp5g7ywK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7OcB0/btsM41caC0g/XO2XpM8w1DfrPIFp5g7ywK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7OcB0/btsM41caC0g/XO2XpM8w1DfrPIFp5g7ywK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/7OcB0/btsM41caC0g/XO2XpM8w1DfrPIFp5g7ywK/img.gif&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;400&quot; height=&quot;300&quot; data-filename=&quot;TodayToday'STheBigDayGaryGIF (2).gif&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/자연어 처리</category>
      <author>빈이즈</author>
      <guid isPermaLink="true">https://binrec.tistory.com/14</guid>
      <comments>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-8-%EC%88%9C%ED%99%98-%EC%8B%A0%EA%B2%BD%EB%A7%9D-Recurrent-Neural-Network#entry14comment</comments>
      <pubDate>Tue, 1 Apr 2025 11:00:36 +0900</pubDate>
    </item>
    <item>
      <title>[딥러닝을 이용한 자연어 처리 입문] Chapter 7. 딥 러닝(Deep Learning) 개요 (2)</title>
      <link>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-7-%EB%94%A5-%EB%9F%AC%EB%8B%9DDeep-Learning-%EA%B0%9C%EC%9A%94-2</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이 글은 [&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/6876&quot;&gt;유원준&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #808080; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/13671&quot;&gt;상준&lt;/a&gt;]의 [딥러닝을 이용한 자영어 처리 입문]에서 가져온 내용이며, [크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스](&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;a href=&quot;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot;&gt;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&lt;/a&gt;&lt;/span&gt;)에 따라 사용되었습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wikidocs.net/22882&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wikidocs.net/22882&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741068935503&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;07. 딥 러닝(Deep Learning) 개요&quot; data-og-description=&quot;딥 러닝(Deep Learning)은 머신 러닝(Machine Learning)의 특정한 한 분야로서 인공 신경망(Artificial Neural Network)의 층을 연속적으&amp;hellip;&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/22882&quot; data-og-url=&quot;https://wikidocs.net/22882&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ctlGH1/hyYna3KEEu/ViBntUmiw8g2CPToeWDrgk/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130&quot;&gt;&lt;a href=&quot;https://wikidocs.net/22882&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/22882&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ctlGH1/hyYna3KEEu/ViBntUmiw8g2CPToeWDrgk/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;07. 딥 러닝(Deep Learning) 개요&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딥 러닝(Deep Learning)은 머신 러닝(Machine Learning)의 특정한 한 분야로서 인공 신경망(Artificial Neural Network)의 층을 연속적으&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;07. 딥러닝(Dep LEarning)의 개요&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;머신러닝(Machine&amp;nbsp;Learning)의&amp;nbsp;특정한&amp;nbsp;한&amp;nbsp;분야로서&amp;nbsp;인공&amp;nbsp;신경망의&amp;nbsp;층을&amp;nbsp;연속적으로&amp;nbsp;깊게&amp;nbsp;쌓아올려&amp;nbsp;데이터를&amp;nbsp;학습하는&amp;nbsp;방식.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;07-07 기울기 소실 (Gradieny Vanishing)과 폭주(Exploding)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;깊은&amp;nbsp;인공&amp;nbsp;신경망을&amp;nbsp;학습하다보면&amp;nbsp;&lt;u&gt;역전파&amp;nbsp;과정에서&amp;nbsp;입력층으로&amp;nbsp;갈수록&amp;nbsp;기울기가&amp;nbsp;점차적으로&amp;nbsp;작아지는&amp;nbsp;현상&lt;/u&gt;(=기울기&amp;nbsp;소실)이&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있음 &lt;br /&gt;-&amp;nbsp;반대로&amp;nbsp;기울기가&amp;nbsp;점차&amp;nbsp;커지더니&amp;nbsp;가중치들이&amp;nbsp;비상식적으로&amp;nbsp;큰&amp;nbsp;값이&amp;nbsp;되면서&amp;nbsp;결국&amp;nbsp;발산되기도&amp;nbsp;함&amp;nbsp;(=기울기&amp;nbsp;폭주)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;1. ReLU와 ReLU의 변형들&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;b&gt;시그모이드&amp;nbsp;함수&lt;/b&gt;를&amp;nbsp;사용하면&amp;nbsp;입력의&amp;nbsp;절대값이&amp;nbsp;클&amp;nbsp;경우에&amp;nbsp;시그모이드&amp;nbsp;함수의&amp;nbsp;출력값이&amp;nbsp;0&amp;nbsp;또는&amp;nbsp;1에&amp;nbsp;수렴하면서&amp;nbsp;&lt;u&gt;기울기가&amp;nbsp;0에&amp;nbsp;가까워짐&lt;/u&gt;. -&amp;gt; 역전파 과정에서 기울기가 점차 사라져서 입력층으로 갈수록 제대로 역전파가 되지 않는 기울기 소실 문제가 발생할 수 있음 &lt;br /&gt;- &lt;u&gt;기울기 소실을 완화하는 가장 간단한 방법&lt;/u&gt;은 은닉층의 활성화 함수로 시그모이드나 하이퍼볼릭탄젠트 함수 대신에 &lt;b&gt;ReLU나 ReLU의 변형 함수와 같은 Leaky ReLU를 사용&lt;/b&gt;하는 것. &lt;br /&gt;-&amp;nbsp;&lt;b&gt;은닉층에서는&amp;nbsp;시그모이드&amp;nbsp;함수를&amp;nbsp;사용하지&amp;nbsp;말기&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;Leaky&amp;nbsp;ReLU를&amp;nbsp;사용하면&amp;nbsp;모든&amp;nbsp;입력값에&amp;nbsp;대해서&amp;nbsp;기울기가&amp;nbsp;0에&amp;nbsp;수렴하지&amp;nbsp;않아&amp;nbsp;죽은&amp;nbsp;ReLU&amp;nbsp;&amp;nbsp;문제를&amp;nbsp;해결함. &lt;br /&gt;-&amp;nbsp;은닉층에서는&amp;nbsp;ReLU나&amp;nbsp;Leaky&amp;nbsp;ReLU와&amp;nbsp;같은&amp;nbsp;ReLU&amp;nbsp;함수의&amp;nbsp;변형들을&amp;nbsp;사용하기 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;2. 그래디언트 클리핑 (Gradient Clipping)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;u&gt;기울기&amp;nbsp;값을&amp;nbsp;자르는&amp;nbsp;것&lt;/u&gt;을&amp;nbsp;의미함.&amp;nbsp;기울기&amp;nbsp;폭주를&amp;nbsp;막기&amp;nbsp;위해&amp;nbsp;&lt;u&gt;임계값을&amp;nbsp;넘지&amp;nbsp;않도록&amp;nbsp;값을&amp;nbsp;자름&lt;/u&gt;. &lt;br /&gt;=&amp;gt; 임계치만큼 크기를 감소시킴. (RNN에서 유용함. 역전파 과정에서 시점을 역행하면서 기울기를 구하는데, 이때 기울기가 너무 커질 수 있기 떄문)&lt;/p&gt;
&lt;pre id=&quot;code_1742540248848&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras import optimizers
Adam = optimizers.Adam(lr=0.0001, clipnorm=1.)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;br /&gt;3. 가중치 초기화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 가중치가 초기값에 따라 모델의 훈련 결과가 달라지기도 함. &lt;br /&gt;=&amp;gt; 가중치 초기화를 적절히 해준다면 기울기 소실 문제를 완화시킬 수도 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; 세이비어 초기화 (Xavier Initialization)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;2010년&amp;nbsp;세이비어&amp;nbsp;글로럿과&amp;nbsp;요슈아&amp;nbsp;벤지오는&amp;nbsp;&lt;u&gt;가중치&amp;nbsp;초기화가&amp;nbsp;모델에&amp;nbsp;미치는&amp;nbsp;영향을&amp;nbsp;분석&lt;/u&gt;하여&amp;nbsp;&lt;b&gt;새로운&amp;nbsp;초기화&amp;nbsp;방법을&amp;nbsp;제안&lt;/b&gt;&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;b&gt;세이비어&amp;nbsp;초기화&amp;nbsp;또는&amp;nbsp;글로럿&amp;nbsp;초기화&lt;/b&gt;라고&amp;nbsp;함. &lt;br /&gt;-&amp;nbsp;이&amp;nbsp;방법은&amp;nbsp;&lt;u&gt;균등&amp;nbsp;분포&amp;nbsp;또는&amp;nbsp;정규&amp;nbsp;분포로&amp;nbsp;초기화&lt;/u&gt;할&amp;nbsp;때&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;경우로&amp;nbsp;나뉘며,&amp;nbsp;&lt;u&gt;이전&amp;nbsp;층의&amp;nbsp;뉴런&amp;nbsp;개수와&amp;nbsp;다음&amp;nbsp;층의&amp;nbsp;뉴런&amp;nbsp;개수를&amp;nbsp;가지고&amp;nbsp;식을&amp;nbsp;세움&lt;/u&gt;. &lt;br /&gt;-&lt;b&gt;&amp;nbsp;여러&amp;nbsp;층의&amp;nbsp;기울기&amp;nbsp;분산&amp;nbsp;사이에&amp;nbsp;균형&lt;/b&gt;을&amp;nbsp;맞춰서&amp;nbsp;특정&amp;nbsp;층이&amp;nbsp;너무&amp;nbsp;주목을&amp;nbsp;받거나&amp;nbsp;다른&amp;nbsp;층이&amp;nbsp;뒤쳐지는&amp;nbsp;것을&amp;nbsp;막음.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;&lt;u&gt;시그모이드&amp;nbsp;함수나&amp;nbsp;하이퍼볼릭&amp;nbsp;탄젠트&amp;nbsp;함수&lt;/u&gt;와&amp;nbsp;같은&amp;nbsp;&lt;b&gt;S자&amp;nbsp;형태의&amp;nbsp;활성화&amp;nbsp;함수와&amp;nbsp;함께&amp;nbsp;사용할&amp;nbsp;때는&amp;nbsp;좋은&amp;nbsp;성능&lt;/b&gt;을&amp;nbsp;보이지만,&amp;nbsp;&lt;u&gt;ReLU&lt;/u&gt;&amp;nbsp;함께&amp;nbsp;사용할&amp;nbsp;경우&amp;nbsp;&lt;b&gt;성능이&amp;nbsp;좋지&amp;nbsp;않음&lt;/b&gt;.&amp;nbsp;=&amp;gt;&amp;nbsp;그&amp;nbsp;경우&lt;b&gt;&amp;nbsp;He&amp;nbsp;초기화&amp;nbsp;(He&amp;nbsp;initialization)을&amp;nbsp;사용하는&amp;nbsp;것이&amp;nbsp;좋음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; He 초기화 (He initialization)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;세이비어&amp;nbsp;초기화와&amp;nbsp;유사하게&amp;nbsp;정규&amp;nbsp;분포와&amp;nbsp;균등&amp;nbsp;분포&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;경우로&amp;nbsp;나뉨.&amp;nbsp;다만,&amp;nbsp;&lt;u&gt;다음&amp;nbsp;층의&amp;nbsp;뉴런의&amp;nbsp;수를&amp;nbsp;반영하지&amp;nbsp;않음&lt;/u&gt;. &lt;br /&gt;(&lt;b&gt;이전&amp;nbsp;층의&amp;nbsp;뉴런의&amp;nbsp;개수만&amp;nbsp;반영&lt;/b&gt;) &lt;br /&gt;-&amp;nbsp;&lt;u&gt;시그모이드&amp;nbsp;함수나&amp;nbsp;하이퍼볼릭탄젠트&amp;nbsp;함수를&amp;nbsp;사용할&amp;nbsp;경우에는&amp;nbsp;세이비어&amp;nbsp;초기화&amp;nbsp;방법&lt;/u&gt;이,&amp;nbsp;&lt;u&gt;ReLU&amp;nbsp;계열&amp;nbsp;함수를&amp;nbsp;사용할&amp;nbsp;경우에는&amp;nbsp;He&amp;nbsp;초기화&amp;nbsp;방법&lt;/u&gt;이&amp;nbsp;효율적.&amp;nbsp;(ReLU&amp;nbsp;+&amp;nbsp;He&amp;nbsp;초기화&amp;nbsp;방법이&amp;nbsp;좀&amp;nbsp;더&amp;nbsp;보편적임)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;4. 배치 정규화 (Batch Normalization)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;ReLU&amp;nbsp;계열의&amp;nbsp;함수와&amp;nbsp;He&amp;nbsp;초기화를&amp;nbsp;사용하는&amp;nbsp;것만으로도&amp;nbsp;어느&amp;nbsp;정도&amp;nbsp;기울기&amp;nbsp;소실과&amp;nbsp;폭주를&amp;nbsp;완화시킬&amp;nbsp;수&amp;nbsp;있지만,&amp;nbsp;또&amp;nbsp;다른&amp;nbsp;방법이&amp;nbsp;배치&amp;nbsp;정규화.&amp;nbsp;배치정규화는&amp;nbsp;인공&amp;nbsp;신경망의&amp;nbsp;&lt;u&gt;각&amp;nbsp;층에&amp;nbsp;들어가는&amp;nbsp;입력을&amp;nbsp;평균과&amp;nbsp;분산으로&amp;nbsp;정규화&lt;/u&gt;하여&amp;nbsp;학습을&amp;nbsp;효율적으로&amp;nbsp;만듦&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; 내부 공변량 변화 (Internal Covariate Shift)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;학습&amp;nbsp;과정에서&amp;nbsp;&lt;b&gt;층&amp;nbsp;별로&amp;nbsp;입력&amp;nbsp;데이터&amp;nbsp;분포가&amp;nbsp;달라지는&amp;nbsp;현상&lt;/b&gt;을&amp;nbsp;말함. &lt;br /&gt;-&amp;nbsp;이전&amp;nbsp;층들의&amp;nbsp;학습에&amp;nbsp;의해&amp;nbsp;이전&amp;nbsp;층의&amp;nbsp;가중치&amp;nbsp;값이&amp;nbsp;바뀌게&amp;nbsp;되면,&amp;nbsp;현재&amp;nbsp;층에&amp;nbsp;전달되는&amp;nbsp;입력&amp;nbsp;데이터의&amp;nbsp;분포가&amp;nbsp;현재&amp;nbsp;층이&amp;nbsp;학습했던&amp;nbsp;시점의&amp;nbsp;분포와&amp;nbsp;차이가&amp;nbsp;발생 &lt;br /&gt;-&amp;nbsp;(공변량&amp;nbsp;변화는&amp;nbsp;훈련&amp;nbsp;데이터와&amp;nbsp;테스트&amp;nbsp;데이터의&amp;nbsp;분포가&amp;nbsp;다른&amp;nbsp;경우를&amp;nbsp;의미) &lt;br /&gt;-&amp;nbsp;(내부&amp;nbsp;공변량&amp;nbsp;변화는&amp;nbsp;신경망&amp;nbsp;층&amp;nbsp;사이에서&amp;nbsp;발생하는&amp;nbsp;입력&amp;nbsp;데이터의&amp;nbsp;분포&amp;nbsp;변화를&amp;nbsp;의미)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; 배치 정규화 (Batch Normalization)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;b&gt;한&amp;nbsp;번에&amp;nbsp;들어오는&amp;nbsp;배치&amp;nbsp;단위로&amp;nbsp;정규화&lt;/b&gt;를&amp;nbsp;하는&amp;nbsp;것.&amp;nbsp;각&amp;nbsp;층에서&amp;nbsp;&lt;u&gt;활성화&amp;nbsp;함수를&amp;nbsp;통과하기&amp;nbsp;전에&amp;nbsp;수행&lt;/u&gt;됨. &lt;br /&gt;-&amp;nbsp;입력에&amp;nbsp;대해&amp;nbsp;평균을&amp;nbsp;0으로&amp;nbsp;만들고,&amp;nbsp;정규화를&amp;nbsp;함.&amp;nbsp;그리고&amp;nbsp;정규화&amp;nbsp;된&amp;nbsp;데이터에&amp;nbsp;대해서&amp;nbsp;스케일과&amp;nbsp;시프트를&amp;nbsp;수행.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;학습&amp;nbsp;시&amp;nbsp;배치&amp;nbsp;단위의&amp;nbsp;평균과&amp;nbsp;분산들을&amp;nbsp;차례대로&amp;nbsp;받아&amp;nbsp;이동&amp;nbsp;평균과&amp;nbsp;이동&amp;nbsp;분산을&amp;nbsp;저장해놓았다가&amp;nbsp;테스트&amp;nbsp;할&amp;nbsp;때는&amp;nbsp;해당&amp;nbsp;배치의&amp;nbsp;평균과&amp;nbsp;분산을&amp;nbsp;구하지&amp;nbsp;않고&amp;nbsp;구해놓았던&amp;nbsp;평균과&amp;nbsp;분산으로&amp;nbsp;정규화 &lt;br /&gt;-&amp;nbsp;(배치&amp;nbsp;정규화를&amp;nbsp;사용하면&amp;nbsp;시그모이드&amp;nbsp;함수나&amp;nbsp;하이퍼볼릭&amp;nbsp;탄젠트&amp;nbsp;함수를&amp;nbsp;사용하더라도&amp;nbsp;기울기&amp;nbsp;소실&amp;nbsp;문제가&amp;nbsp;크게&amp;nbsp;개선) &lt;br /&gt;-&amp;nbsp;(&lt;b&gt;가중치&amp;nbsp;초기화에&amp;nbsp;훨씬&amp;nbsp;덜&amp;nbsp;민감해짐&lt;/b&gt;) &lt;br /&gt;- (훨씬&lt;b&gt; 큰 학습률을 사용할 수 있어 학습 속도 개선&lt;/b&gt;) &lt;br /&gt;-&amp;nbsp;(미니&amp;nbsp;배치마다&amp;nbsp;평균과&amp;nbsp;표준편차를&amp;nbsp;계산하여&amp;nbsp;사용하므로&amp;nbsp;과적합을&amp;nbsp;방지하는&amp;nbsp;효과도&amp;nbsp;냄.&amp;nbsp;-&amp;gt;&amp;nbsp;드롭아웃과&amp;nbsp;비슷한&amp;nbsp;효과) &lt;br /&gt;-&amp;nbsp;(배치&amp;nbsp;정규화는&amp;nbsp;&lt;b&gt;모델을&amp;nbsp;복잡하게&lt;/b&gt;&amp;nbsp;함.&amp;nbsp;계산이&amp;nbsp;필요해서&amp;nbsp;&lt;u&gt;실행시간이&amp;nbsp;느려짐&lt;/u&gt;.&amp;nbsp;=&amp;gt;&amp;nbsp;서비스&amp;nbsp;속도&amp;nbsp;고려하여&amp;nbsp;꼭&amp;nbsp;필요한&amp;nbsp;작업인지&amp;nbsp;고민이&amp;nbsp;필요함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; 배치 정규화의 한계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;1)&amp;nbsp;미니&amp;nbsp;배치&amp;nbsp;크기에&amp;nbsp;의존적이다&amp;nbsp;:&amp;nbsp;너무&amp;nbsp;작은&amp;nbsp;배치&amp;nbsp;크기에서는&amp;nbsp;잘&amp;nbsp;동작하지&amp;nbsp;않을&amp;nbsp;수&amp;nbsp;있음. &lt;br /&gt;-&amp;nbsp;2)&amp;nbsp;&lt;b&gt;RNN에&amp;nbsp;적용하기&amp;nbsp;어렵다&lt;/b&gt;&amp;nbsp;:&amp;nbsp;RNN은&amp;nbsp;각&amp;nbsp;시점마다&amp;nbsp;다른&amp;nbsp;통계치를&amp;nbsp;가짐&amp;nbsp;=&amp;gt;&amp;nbsp;&amp;nbsp;배치&amp;nbsp;정규화를&amp;nbsp;적용하는&amp;nbsp;것이&amp;nbsp;어려움&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; 층 정규화 (Layer Normalization)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;b&gt;배치&amp;nbsp;크기에&amp;nbsp;의존적이지&amp;nbsp;않으며&amp;nbsp;RNN에도&amp;nbsp;적용하는&amp;nbsp;것이&amp;nbsp;수월&lt;/b&gt;함 &lt;br /&gt;-&amp;nbsp;배치&amp;nbsp;정규화가&amp;nbsp;특성에&amp;nbsp;다른&amp;nbsp;평균과&amp;nbsp;분산을&amp;nbsp;구하여&amp;nbsp;정규화를&amp;nbsp;해주는&amp;nbsp;거라면,&amp;nbsp;층&amp;nbsp;정규화는&amp;nbsp;&lt;u&gt;각각의&amp;nbsp;데이터&amp;nbsp;별로&amp;nbsp;평균과&amp;nbsp;표준편차를&amp;nbsp;구해&amp;nbsp;정규화를&amp;nbsp;수행하는&amp;nbsp;것&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;07-08 케라스(Keras) 훑어보기&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 전처리(Preprocessing)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;Tokenizer()&amp;nbsp;:&amp;nbsp;&lt;u&gt;토큰화&lt;/u&gt;와&amp;nbsp;&lt;u&gt;정수&amp;nbsp;인코딩&lt;/u&gt;을&amp;nbsp;위해&amp;nbsp;사용됨.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;(훈련&amp;nbsp;데이터로부터&amp;nbsp;단어&amp;nbsp;집합을&amp;nbsp;생성,&amp;nbsp;해당&amp;nbsp;단어&amp;nbsp;집합으로&amp;nbsp;임의의&amp;nbsp;문장을&amp;nbsp;정수&amp;nbsp;인코딩하는&amp;nbsp;코드)&lt;/p&gt;
&lt;pre id=&quot;code_1742540846070&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preporcessing.sequence import pad_sequences
tokenizer = Tokenizer()
train_text = &quot;The earth is an awesome place live&quot;
# 단어 집합 생성
tokenizer.fit_on_texts([train_text])
# 정수 인코딩
sub_text = &quot;The earth is an great place live&quot;
sequences = tokenizer.text_to_sequences([sub_text])[0]
print(&quot;정수 인코딩 : &quot;,sequences)
print(&quot;단어 집합 : &quot;,tokenizer.word_index)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;(출력&amp;nbsp;결과&amp;nbsp;:&amp;nbsp;) &lt;br /&gt;정수&amp;nbsp;인코딩&amp;nbsp;:&amp;nbsp;&amp;nbsp;[1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4,&amp;nbsp;6,&amp;nbsp;7] &lt;br /&gt;단어&amp;nbsp;집합&amp;nbsp;:&amp;nbsp;&amp;nbsp;{'the':&amp;nbsp;1,&amp;nbsp;'earth':&amp;nbsp;2,&amp;nbsp;'is':&amp;nbsp;3,&amp;nbsp;'an':&amp;nbsp;4,&amp;nbsp;'awesome':&amp;nbsp;5,&amp;nbsp;'place':&amp;nbsp;6,&amp;nbsp;'live':&amp;nbsp;7} &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;출력&amp;nbsp;결과&amp;nbsp;&lt;u&gt;great는&amp;nbsp;단어&amp;nbsp;집합(vocabulary)에&amp;nbsp;없으므로&amp;nbsp;출력되지&amp;nbsp;않음&lt;/u&gt; &lt;br /&gt;-전체&amp;nbsp;훈련&amp;nbsp;데이터에서&amp;nbsp;각&amp;nbsp;샘플의&amp;nbsp;길이는&amp;nbsp;서로&amp;nbsp;다를&amp;nbsp;수&amp;nbsp;있고&amp;nbsp;각&amp;nbsp;문서&amp;nbsp;또는&amp;nbsp;각&amp;nbsp;문장은&amp;nbsp;단어의&amp;nbsp;수가&amp;nbsp;제각각임&amp;nbsp;=&amp;gt;&amp;nbsp;모델의&amp;nbsp;입력으로&amp;nbsp;사용하려면&amp;nbsp;&lt;u&gt;모든&amp;nbsp;샘플의&amp;nbsp;길이를&amp;nbsp;동일하게&amp;nbsp;맞추어야&amp;nbsp;할&amp;nbsp;때가&amp;nbsp;있음&lt;/u&gt;.&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;b&gt;패딩&lt;/b&gt;(Padding) &lt;br /&gt;-&amp;nbsp;패딩은&amp;nbsp;보통&amp;nbsp;숫자&amp;nbsp;0을&amp;nbsp;넣어서&amp;nbsp;길이가&amp;nbsp;다른&amp;nbsp;샘플들의&amp;nbsp;길이를&amp;nbsp;맞춤.&amp;nbsp;케라스에서는&lt;b&gt;&amp;nbsp;pad_Sequence()&lt;/b&gt;를&amp;nbsp;사용.&amp;nbsp;정한&amp;nbsp;길이보다&amp;nbsp;길이가&amp;nbsp;긴&amp;nbsp;샘플의&amp;nbsp;값을&amp;nbsp;일부&amp;nbsp;자르고,&amp;nbsp;정한&amp;nbsp;길이보다&amp;nbsp;길이가&amp;nbsp;짧은&amp;nbsp;샘플은&amp;nbsp;값을&amp;nbsp;0으로&amp;nbsp;채움 &lt;br /&gt;-&amp;nbsp;코드&amp;nbsp;예시:&amp;nbsp;padding='pre'&amp;nbsp;(앞에&amp;nbsp;0을&amp;nbsp;채움)/'post'(뒤에&amp;nbsp;0을&amp;nbsp;채움)&lt;/p&gt;
&lt;pre id=&quot;code_1742540913655&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pad_sequences([[1,2,3], [3,4,5,6], [7,8]], maxlen=3, padding='pre')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- 출력 결과: &lt;br /&gt;array([[1,&amp;nbsp;2,&amp;nbsp;3], &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[4,&amp;nbsp;5,&amp;nbsp;6], &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[0,&amp;nbsp;7,&amp;nbsp;8]],&amp;nbsp;dtype=int32) &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;2. 워드 임베딩 (Word Embedding)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;텍스트&amp;nbsp;내의&amp;nbsp;단어들을&amp;nbsp;&lt;b&gt;밀집&amp;nbsp;벡터로&amp;nbsp;만드는&amp;nbsp;것&lt;/b&gt;.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;&lt;b&gt;원-핫&amp;nbsp;벡터&lt;/b&gt;는&amp;nbsp;&lt;u&gt;대부분이&amp;nbsp;0의&amp;nbsp;값&lt;/u&gt;을&amp;nbsp;가지고,&amp;nbsp;단&amp;nbsp;하나의&amp;nbsp;1의&amp;nbsp;값을&amp;nbsp;가지는&amp;nbsp;벡터로,&amp;nbsp;&lt;u&gt;차원이&amp;nbsp;대체적으로&amp;nbsp;크다&lt;/u&gt;는&amp;nbsp;성질을&amp;nbsp;가짐.&amp;nbsp;단어&amp;nbsp;집합의&amp;nbsp;크기&amp;nbsp;=&amp;nbsp;벡터의&amp;nbsp;크기.&amp;nbsp;단어&amp;nbsp;벡터&amp;nbsp;간의&amp;nbsp;유의미한&amp;nbsp;&lt;u&gt;유사도를&amp;nbsp;구할&amp;nbsp;수&amp;nbsp;없다&lt;/u&gt;는&amp;nbsp;단점이&amp;nbsp;있음.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;워드&amp;nbsp;임베딩으로부터&amp;nbsp;얻은&amp;nbsp;&lt;b&gt;임베딩&amp;nbsp;벡터&lt;/b&gt;는&amp;nbsp;상대적으로&amp;nbsp;&lt;u&gt;저차원을&amp;nbsp;가지며&amp;nbsp;모든&amp;nbsp;원소의&amp;nbsp;값이&amp;nbsp;실수를&amp;nbsp;가짐&lt;/u&gt;. &lt;br /&gt;-&amp;nbsp;원-핫&amp;nbsp;벡터의&amp;nbsp;차원이&amp;nbsp;주로&amp;nbsp;20,000&amp;nbsp;이상을&amp;nbsp;넘어가는&amp;nbsp;것과는&amp;nbsp;달리&amp;nbsp;임베딩&amp;nbsp;벡터는&amp;nbsp;주로&amp;nbsp;256,&amp;nbsp;512,&amp;nbsp;1024&amp;nbsp;등의&amp;nbsp;차원을&amp;nbsp;가짐. &lt;br /&gt;-&amp;nbsp;&lt;b&gt;Enbedding()&lt;/b&gt;&amp;nbsp;:&amp;nbsp;단어를&amp;nbsp;&lt;u&gt;밀집&amp;nbsp;벡터로&amp;nbsp;만드&lt;/u&gt;는&amp;nbsp;역할을&amp;nbsp;함&amp;nbsp;=&amp;nbsp;임베딩&amp;nbsp;층을&amp;nbsp;만드는&amp;nbsp;역할.&amp;nbsp;정수&amp;nbsp;인코딩이&amp;nbsp;된&amp;nbsp;단어들을&amp;nbsp;입력으로&amp;nbsp;받아서&amp;nbsp;임베딩을&amp;nbsp;수행함 &lt;br /&gt;-&amp;nbsp;embedding()은&lt;b&gt;&amp;nbsp;(number&amp;nbsp;of&amp;nbsp;samples,&amp;nbsp;input_length)&lt;/b&gt;인&amp;nbsp;2D&amp;nbsp;정수&amp;nbsp;텐서를&amp;nbsp;입력받고&amp;nbsp;&amp;nbsp;워드&amp;nbsp;임베딩&amp;nbsp;작업을&amp;nbsp;수행하고&lt;b&gt;&amp;nbsp;(number&amp;nbsp;of&amp;nbsp;samples,&amp;nbsp;input_length,&amp;nbsp;embedding&amp;nbsp;word&amp;nbsp;dimensionality)&lt;/b&gt;인&amp;nbsp;3D&amp;nbsp;텐서를&amp;nbsp;리턴함.&amp;nbsp;정수&amp;nbsp;인코딩이&amp;nbsp;완료된&amp;nbsp;sample을&amp;nbsp;입력으로&amp;nbsp;사용함 &lt;br /&gt;-&amp;nbsp;embedding의&amp;nbsp;인자&amp;nbsp;:&amp;nbsp;1)&lt;b&gt;&amp;nbsp;첫번째&amp;nbsp;인자&lt;/b&gt;&amp;nbsp;=&amp;nbsp;단어&amp;nbsp;집합의&amp;nbsp;크기&amp;nbsp;=&amp;nbsp;총&amp;nbsp;단어의&amp;nbsp;개수.&amp;nbsp;2)&amp;nbsp;&lt;b&gt;두번째&amp;nbsp;인자&lt;/b&gt;=&amp;nbsp;임베딩&amp;nbsp;벡터의&amp;nbsp;출력&amp;nbsp;차원&amp;nbsp;=&amp;nbsp;결과로서&amp;nbsp;나오는&amp;nbsp;임베딩&amp;nbsp;벡터의&amp;nbsp;크기.&amp;nbsp;3)&lt;b&gt;&amp;nbsp;input_length&lt;/b&gt;&amp;nbsp;=&amp;nbsp;입력&amp;nbsp;시퀀스의&amp;nbsp;길이&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;3. 모델링(Modeling)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;b&gt;&amp;nbsp;Sequential()&amp;nbsp;&lt;/b&gt;:&amp;nbsp;model로&amp;nbsp;선언한&amp;nbsp;뒤&amp;nbsp;model.add()라는&amp;nbsp;코드를&amp;nbsp;통해&amp;nbsp;층을&amp;nbsp;단계적으로&amp;nbsp;추가. &lt;br /&gt;-&amp;nbsp;Embedding()을&amp;nbsp;통해&amp;nbsp;생성하는&amp;nbsp;임베딩&amp;nbsp;층(Embedding&amp;nbsp;layer)을&amp;nbsp;추가하는&amp;nbsp;예시&amp;nbsp;코드&lt;/p&gt;
&lt;pre id=&quot;code_1742541096212&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model = Sequential()
model.add(Embedding(vacab_size, output_dim, input_length))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;전결합층(fully-connected&amp;nbsp;layer)을&amp;nbsp;추가하는&amp;nbsp;예시&amp;nbsp;코드&lt;/p&gt;
&lt;pre id=&quot;code_1742541105619&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model = Sequential()
model.add(Dense(1, input_dim=3, activation= 'relu'))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;dense()는&amp;nbsp;한&amp;nbsp;번&amp;nbsp;사용되었지만&amp;nbsp;더&amp;nbsp;많은&amp;nbsp;층의&amp;nbsp;추가가&amp;nbsp;가능.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Dens()의 대표 인자 : &lt;b&gt;1) 첫번째인자&lt;/b&gt; = 출력 뉴런의 수. &lt;b&gt;2) input_dim&lt;/b&gt; = 입력 뉴런의 수. &lt;b&gt;3) activation&lt;/b&gt; = 활성화 함수 (linear : 디폴트. 별도 활성화함수 없음. sigmoid : 이진분류 주로 사용. softmax : 다중 클래스 분류문제에서 주로 사용, relu : 은닉층에서 주로 사용)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;4. 컴파일(Compile)과 훈련(Training)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;b&gt;compile()&lt;/b&gt;&amp;nbsp;:&amp;nbsp;모델을&amp;nbsp;기계가&amp;nbsp;이해할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;컴파일.&amp;nbsp;&lt;u&gt;손실&amp;nbsp;함수와&amp;nbsp;옵티마이저,&amp;nbsp;메트릭&amp;nbsp;함수를&amp;nbsp;선택&lt;/u&gt;함 &lt;br /&gt;-&amp;nbsp;RNN을&amp;nbsp;이용하여&amp;nbsp;이진&amp;nbsp;분류를&amp;nbsp;하는&amp;nbsp;예시&amp;nbsp;코드&lt;/p&gt;
&lt;pre id=&quot;code_1742541176603&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.layers import SimpleRNN, Embedding, Dense
from tensorflow.keras.models import Sequential
vocab_size = 10000
embedding_Dim = 32
hidden_units = 32

model = Sequential()
model.add(Embedding(vocab_size, embedding_dim))
model.add(SimpleRNN(hidden_units))
model.add(Dense(1,activation = 'sigmoid'))
model.compile(optimizer = 'rmsprop', loss= 'binary_crossentropy', metrics= ['acc'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;&lt;b&gt;optimizer&amp;nbsp;&lt;/b&gt;=&amp;nbsp;훈련&amp;nbsp;과정을&amp;nbsp;설정하는&amp;nbsp;옵티마이저.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;&lt;b&gt;loss&amp;nbsp;&lt;/b&gt;=&amp;nbsp;훈련&amp;nbsp;과정에서&amp;nbsp;사용할&amp;nbsp;손실&amp;nbsp;함수&amp;nbsp;(loss&amp;nbsp;function)&amp;nbsp;설정 &lt;br /&gt;-&amp;nbsp;&lt;b&gt;metrics&amp;nbsp;&lt;/b&gt;=&amp;nbsp;훈련을&amp;nbsp;모니터링하기&amp;nbsp;위한&amp;nbsp;지표&amp;nbsp;선택 &lt;br /&gt;- 대표적으로 사용되는 손실 함수와 활성화함수의 조합 &lt;br /&gt;1)&amp;nbsp;&lt;b&gt;회귀문제&lt;/b&gt;&amp;nbsp;:&amp;nbsp;손실함수(&lt;u&gt;mean_squared_error&lt;/u&gt;)&amp;nbsp; &lt;br /&gt;2)&amp;nbsp;&lt;b&gt;다중&amp;nbsp;클래스&amp;nbsp;분류&lt;/b&gt;&amp;nbsp;:&amp;nbsp;손실함수(&lt;u&gt;categorical_crossentropy&lt;/u&gt;),&amp;nbsp;출력층&amp;nbsp;활성화함수(&lt;u&gt;소프트맥스&lt;/u&gt;) &lt;br /&gt;3)&amp;nbsp;&lt;b&gt;다중&amp;nbsp;클래스&amp;nbsp;분류&lt;/b&gt;&amp;nbsp;:&amp;nbsp;&amp;nbsp;손실함수(&lt;u&gt;sparse_categorical_crossentropy&lt;/u&gt;),&amp;nbsp;출력층&amp;nbsp;활성화함수(&lt;u&gt;소프트맥스&lt;/u&gt;) &lt;br /&gt;* sparse_categorical_crossentropy : categorical_crossentropy와 동일하게 다중 클래스 분류에서 사용되지만, 레이블을 원-핫 인코딩하지 않고 정수 인코딩 된 상태에서 수행 가능하다는 점이 다름.&lt;br /&gt;4)&amp;nbsp;&lt;b&gt;이진분류&amp;nbsp;&lt;/b&gt;:&amp;nbsp;손실함수(&lt;u&gt;binary_crossentropy&lt;/u&gt;),&amp;nbsp;출력층&amp;nbsp;활성화함수(&lt;u&gt;시그모이드&lt;/u&gt;) &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&lt;b&gt;fit()&lt;/b&gt;&amp;nbsp;:&amp;nbsp;모델&amp;nbsp;학습.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;예시&amp;nbsp;코드&lt;/p&gt;
&lt;pre id=&quot;code_1742541263187&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.fit(X_train, y_train, epochs=10, batch_size=32, verbose=0, validation_data(X_val, y_val))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- 첫번쨰인자 = 훈련데이터 &lt;br /&gt;- 두번째인자 = 지도학습에서 레이블 데이터 &lt;br /&gt;- epochs = 에포크. &lt;b&gt;에포크 1은 전체 데이터를 한 차례 훑고 지나간 것을 의미.&lt;/b&gt; 정수값 사용해야 함.&amp;nbsp; &lt;br /&gt;- &lt;b&gt;batch_size&lt;/b&gt; = 배치 크기. 기본값은 32, &lt;u&gt;미니 배치 경사 하강법을 사용하고 싶지 않을 때 None&lt;/u&gt;으로 기재 &lt;br /&gt;- validation_data(x_val, y_val) = 검증 데이터. 검증 데이터의 오차가 낮아지다 높아지기 시작하면 이는 과적합의 신호 &lt;br /&gt;-예시&amp;nbsp;코드&amp;nbsp;2&lt;/p&gt;
&lt;pre id=&quot;code_1742541432058&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.fit(X_train, y_train, epochs=10, batch_size=32, verbose=0, validation_split=0.2))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- validation_split = validation_data와 동일하게 검증 데이터를 사용하기 위한 용도.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;&lt;b&gt;verbose&amp;nbsp;&lt;/b&gt;=&amp;nbsp;학습&amp;nbsp;중&amp;nbsp;출력되는&amp;nbsp;문구&amp;nbsp;설정&amp;nbsp;(0&amp;nbsp;:&amp;nbsp;아무것도&amp;nbsp;출력하지&amp;nbsp;않음,&amp;nbsp;1:&amp;nbsp;훈련의&amp;nbsp;진행도를&amp;nbsp;나타내는&amp;nbsp;진행&amp;nbsp;막대&amp;nbsp;표시&amp;nbsp;2&amp;nbsp;:&amp;nbsp;미니&amp;nbsp;배치마다&amp;nbsp;손실&amp;nbsp;정보를&amp;nbsp;출력)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;5. 평가(Evaluatoin)와 예측{Prediction)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;b&gt;evaluate()&amp;nbsp;&lt;/b&gt;:&amp;nbsp;테스트&amp;nbsp;데이터를&amp;nbsp;통해&amp;nbsp;학습한&amp;nbsp;모델에&amp;nbsp;대한&amp;nbsp;정확도를&amp;nbsp;평가 &lt;br /&gt;-&amp;nbsp;코드&amp;nbsp;:&lt;/p&gt;
&lt;pre id=&quot;code_1742541473346&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.evaluate(X_test, y_test, batch_size = 32)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 첫번째인자 = 테스트 데이터 &lt;br /&gt;-&amp;nbsp;두번째인자&amp;nbsp;=&amp;nbsp;레이블&amp;nbsp;테스트&amp;nbsp;데이터 &lt;br /&gt;-&amp;nbsp;batch_size&amp;nbsp;=&amp;nbsp;배치&amp;nbsp;크기 &lt;br /&gt;-&amp;nbsp;&lt;b&gt;predict()&lt;/b&gt;&amp;nbsp;:&amp;nbsp;임의의&amp;nbsp;입력에&amp;nbsp;대한&amp;nbsp;모델의&amp;nbsp;출력값 &lt;br /&gt;-&amp;nbsp;코드&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1742541496130&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.predict(X_input, batch_size = 32)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;6. 모델의 저장(Save)와 로드(Load)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;학습이&amp;nbsp;끝난&amp;nbsp;신경망의&amp;nbsp;구조를&amp;nbsp;보존하고&amp;nbsp;계속해서&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;&lt;b&gt;모델을&amp;nbsp;저장&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;&lt;b&gt;save()&lt;/b&gt;&amp;nbsp;:&amp;nbsp;인공&amp;nbsp;신경망&amp;nbsp;모델을&amp;nbsp;hdf5파일에&amp;nbsp;저장&lt;/p&gt;
&lt;pre id=&quot;code_1742541550674&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.save(&quot;model_name.h5&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- &lt;b&gt;load_model()&lt;/b&gt; : 저장해둔 모델을 불러오기&lt;/p&gt;
&lt;pre id=&quot;code_1742541565042&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.models import load_model
model = load_model(&quot;model_name.h5&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;br /&gt;07-09 케라스의 함수형 API (Keras Functional API)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 여러 층을 공유하거나 다양한 종류의 입력과 출력을 사용하는 등의 복잡한 모델을 만드는 일에 한계가 있는 Sequential API =&amp;gt; 더욱 복잡한 모델을 생성할 수 있는 방식: &lt;b&gt;Functional API&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&lt;b&gt;Sequential&amp;nbsp;API&lt;/b&gt;로&amp;nbsp;만든&amp;nbsp;모델 &lt;br /&gt;-&amp;nbsp;&lt;u&gt;직관적이고&amp;nbsp;편리&lt;/u&gt;하지만&amp;nbsp;단순히&amp;nbsp;층을&amp;nbsp;쌓는&amp;nbsp;것만으로는&amp;nbsp;구현할&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;복&lt;u&gt;잡한&amp;nbsp;신경망을&amp;nbsp;구현할&amp;nbsp;수&amp;nbsp;없음&lt;/u&gt;. &lt;br /&gt;&lt;br /&gt;2.&lt;b&gt;&amp;nbsp;Functional&amp;nbsp;API&lt;/b&gt;로&amp;nbsp;만든&amp;nbsp;모델 &lt;br /&gt;-&amp;nbsp;&lt;u&gt;각&amp;nbsp;층을&amp;nbsp;일종의&amp;nbsp;함수(function)로서&amp;nbsp;정의&lt;/u&gt;함.&amp;nbsp;각&amp;nbsp;함수를&amp;nbsp;조합하기&amp;nbsp;위한&amp;nbsp;연산자들을&amp;nbsp;제공하는데,&amp;nbsp;이를&amp;nbsp;이용하여&amp;nbsp;신경망을&amp;nbsp;설계 &lt;br /&gt;-&amp;nbsp;&lt;u&gt;입력의&amp;nbsp;크기&amp;nbsp;(shape)를&amp;nbsp;명시한&amp;nbsp;입력층&lt;/u&gt;(Input&amp;nbsp;layer)을&amp;nbsp;모델의&amp;nbsp;앞단에&amp;nbsp;&lt;u&gt;정의해주어야&amp;nbsp;함&lt;/u&gt;. &lt;br /&gt;&lt;br /&gt;1)&amp;nbsp;&lt;b&gt;전결합&amp;nbsp;피드&amp;nbsp;포워드&amp;nbsp;신경망&amp;nbsp;(Fully-connected&amp;nbsp;FFNN)&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;입력데이터의&amp;nbsp;크기를&amp;nbsp;인자로&amp;nbsp;출력층을&amp;nbsp;정의해야&amp;nbsp;함.&amp;nbsp; &lt;br /&gt;- 코드: 10개의 입력을 받는 입력층&lt;/p&gt;
&lt;pre id=&quot;code_1742541648570&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
impurts = Input(Shape = (10,))
hidden1 = Dense(64, activation='relu')(inputs)
hidden2 = Dense(64, activation = 'relu')(hidden1)
output = Dense(1, activation = 'sigmoid')(hidden2)
model = Model(inputs = inputs, outputs = output)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Input()&lt;/b&gt;&amp;nbsp;함수에 &lt;u&gt;입력의 크기&lt;/u&gt; 정의 &lt;br /&gt;-&amp;nbsp;이전층을&amp;nbsp;다음층&amp;nbsp;함수의&amp;nbsp;입력으로&amp;nbsp;사용하고&amp;nbsp;변수에&amp;nbsp;할당 &lt;br /&gt;-&lt;b&gt;&amp;nbsp;Model()&amp;nbsp;&lt;/b&gt;함수에&amp;nbsp;입력과&amp;nbsp;출력을&amp;nbsp;정의 &lt;br /&gt;-&amp;nbsp;sequential&amp;nbsp;API와&amp;nbsp;마찬가지로&amp;nbsp;model.compile,&amp;nbsp;model.fit&amp;nbsp;등이&amp;nbsp;사용&amp;nbsp;가능. &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;다른&amp;nbsp;코드&amp;nbsp;예시&amp;nbsp;:&amp;nbsp;FFNN&lt;/p&gt;
&lt;pre id=&quot;code_1742541710564&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;inputs = Input(shape(10,))
x = Dense(8, activation=&quot;relu&quot;)(inputs)
x = Dense(4, activation = &quot;relu&quot;)(x)
x = Dense(1, activation = &quot;linear&quot;)(x)
model = Model (inputs, x)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;2)&amp;nbsp;&lt;b&gt;선형&amp;nbsp;회귀&lt;/b&gt;&amp;nbsp;(Linear&amp;nbsp;Regression) &lt;br /&gt;-&amp;nbsp;sequential&amp;nbsp;API로&amp;nbsp;구현했던&amp;nbsp;코드를&amp;nbsp;Functional&amp;nbsp;API로&amp;nbsp;구현&lt;/p&gt;
&lt;pre id=&quot;code_1742541729945&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.layers import Input, Dense
from tensorflow.keras import optimizers
from tensorflow.keras.models import Model
x = [1,2,3,4,5,6,7,8,9]
y = [11,22,33,44,53,66,77,87,95]
inputs = Input(shape(1,))
output = Dense(1, activation = 'linear')(inputs)
linear_model = Model(inputs, output)
sgd = optimizers.SGD(lr=0.01)
linear_model.compile(optimizer=sgd, loss='mse', metrics=['mse'])
linera_model.fit(X,y, epochs = 300)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;4)&amp;nbsp;&lt;b&gt;다중&amp;nbsp;입력&lt;/b&gt;을&amp;nbsp;받는&amp;nbsp;모델&amp;nbsp;(model&amp;nbsp;that&amp;nbsp;accepts&amp;nbsp;multiple&amp;nbsp;inputs) &lt;br /&gt;-&amp;nbsp;코드&lt;/p&gt;
&lt;pre id=&quot;code_1742541753713&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.kears.layers import Inputm Dense, concatenate
from tensorflow.kears.models import Model

# 두 개의 입력층을 정의
inputA = Input(shape=(64,))
inputB = Input(Shape=(128,))

# 첫번째 입력층으로부터 분기되어 진행되는 인공 신경망을 정의
x = Dense(16, activation = &quot;relu&quot;)(inputA)
x = Dense(8, activation = &quot;relu&quot;)(x)
x = model(inputs = inputA, outputs = x)

# 두 번째 입력층으로부터 분기되어 진행되는 인공신경망을 정의
y = Dense(64, activation = &quot;relu&quot;)(inputB)
y = Dense(32, activation = &quot;relu&quot;)(y)
y = Dense(8, activation = &quot;relu&quot;)(y)
y = Model(inputs=inputB, output = y)

# 두 개의 인공신경망의 출력을 연결 (concatenate)
result = concatenate([x.output, y.output])

z = Dense(2, activation =&quot;relu&quot;)(result)
z = Dense(1, activation = &quot;linera&quot;)(z)

model = Model(inputs = [x.input, y.input], output=z)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;07-10 케라스 서브클래싱 API (Keras Subclassing API)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.&amp;nbsp;서브클래싱&amp;nbsp;API&amp;nbsp;로&amp;nbsp;구현한&amp;nbsp;선형&amp;nbsp;회귀&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 코드 :&lt;/p&gt;
&lt;pre id=&quot;code_1742541778385&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

class LinearRegression(tf.keras.Model) :
   def f__init__(self) :
      super(LinearRegression, self).__init__()
      self.linear_layer = tf.keras.layers.Dense(1, input_dim = 1, activation = 'linear')
   def call(self, x) :
      y_pred = self.linear_layer(x)
      return y_pred

model = LinearRegression()
x = [1,2,3,4,5,6,7,8,9] 
y = [11,22,33,44,53,66,77,87,95]

sgd = tf.keras.optimizers.SGD(lr=0.01)
model.compile(optimizer = sgd, loss = 'mse', metrics = ['mse'])
model.fit(X, y, epochs = 300)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;클래스(class)&amp;nbsp;형태의&amp;nbsp;모델은&lt;u&gt;&amp;nbsp;tf.keras.Model을&amp;nbsp;상속&lt;/u&gt;받음.&lt;b&gt;&amp;nbsp;init()&lt;/b&gt;에서&amp;nbsp;모델의&amp;nbsp;구조와&amp;nbsp;동적을&amp;nbsp;정의하는&amp;nbsp;생성자를&amp;nbsp;정의.&amp;nbsp;파이썬에서&amp;nbsp;객체가&amp;nbsp;갖는&amp;nbsp;속성값을&amp;nbsp;&lt;u&gt;초기화하는&amp;nbsp;역할&lt;/u&gt;로&amp;nbsp;객체가&amp;nbsp;생성될&amp;nbsp;때&amp;nbsp;자동으로&amp;nbsp;호출됨.&amp;nbsp;&lt;b&gt;super()&lt;/b&gt;&amp;nbsp;함수를&amp;nbsp;부르면&amp;nbsp;여기서&amp;nbsp;만든&amp;nbsp;클래스는&amp;nbsp;&lt;u&gt;tf.keras.Model&amp;nbsp;클래스의&amp;nbsp;속성들을&amp;nbsp;가지고&amp;nbsp;초기화&amp;nbsp;&lt;/u&gt;됨.&amp;nbsp;&lt;b&gt;call()&amp;nbsp;&lt;/b&gt;함수는&amp;nbsp;모델이&amp;nbsp;데이터를&amp;nbsp;입력받아&amp;nbsp;예측&amp;nbsp;값을&amp;nbsp;리턴하는&amp;nbsp;포워드(forward)&amp;nbsp;연산을&amp;nbsp;진행시키는&amp;nbsp;함수.&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;&lt;br /&gt;2. 언제 서브클래싱 API를 써야 할 까?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;b&gt;Sequential&amp;nbsp;API&lt;/b&gt;&amp;nbsp;:&amp;nbsp;&lt;u&gt;간단한&amp;nbsp;모델&lt;/u&gt;을&amp;nbsp;구현하기에&amp;nbsp;적합 &lt;br /&gt;-&amp;nbsp;&lt;b&gt;Functional&amp;nbsp;API&lt;/b&gt;&amp;nbsp;:&amp;nbsp;Sequential&amp;nbsp;API로&amp;nbsp;구현할&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;&lt;u&gt;복잡한&amp;nbsp;모델들&amp;nbsp;구현&lt;/u&gt; 가능.&lt;br /&gt;-&amp;nbsp;&lt;b&gt;Subclassing&amp;nbsp;API&lt;/b&gt;&amp;nbsp;:&amp;nbsp;&lt;u&gt;Functional&amp;nbsp;API가&amp;nbsp;구현할&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;모델&lt;/u&gt;들조차&amp;nbsp;구현할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;경우가&amp;nbsp;있음.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;&lt;i&gt;Functional&amp;nbsp;API&lt;/i&gt;는&amp;nbsp;기본적으로&amp;nbsp;&lt;u&gt;딥러닝&amp;nbsp;모델을&amp;nbsp;DAG(directed&amp;nbsp;acyclic&amp;nbsp;graph)로&amp;nbsp;취급&lt;/u&gt;. 대부분의 딥러닝 모델이 이에 속하기는 하지만 항상 그런 것은 아님 (ex. 재귀 네트워크, 트리 RNN) =&amp;gt; 그런 일부를 제외하고 대부분의 딥 러닝 모델은 Functional API 수준에서도 전부 구현 가능. =&amp;gt; &lt;u&gt;Subclassing API&lt;/u&gt;는 밑바닥부터 새로운 수준의 아키텍처를 구현해야 하는 &lt;u&gt;실험적 연구를 하는 연구자들에게 적합&lt;/u&gt;함.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;3.&amp;nbsp;세&amp;nbsp;가지&amp;nbsp;구현&amp;nbsp;방식&amp;nbsp;비교&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1)&amp;nbsp;&lt;b&gt;Sequential&amp;nbsp;API&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 장점 : 단순하게 층을 쌓는 방식으로 쉽고 간단. &lt;br /&gt;-&amp;nbsp;단점&amp;nbsp;:&amp;nbsp;다수의&amp;nbsp;입력(multi-input),&amp;nbsp;다수의&amp;nbsp;출력(multi-output)을&amp;nbsp;가진&amp;nbsp;모델&amp;nbsp;또는&amp;nbsp;층&amp;nbsp;간의&amp;nbsp;연결(concatenate)이나&amp;nbsp;덧셈(Add)과&amp;nbsp;같은&amp;nbsp;연산을&amp;nbsp;하는&amp;nbsp;모델을&amp;nbsp;구현하기에는&amp;nbsp;적합하지&amp;nbsp;않음.&amp;nbsp;=&amp;gt;&amp;nbsp;이런&amp;nbsp;모델들의&amp;nbsp;구현은&amp;nbsp;Functional&amp;nbsp;API를&amp;nbsp;사용해야&amp;nbsp;함. &lt;br /&gt;&lt;br /&gt;2)&amp;nbsp;&lt;b&gt;Functional&amp;nbsp;API&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;장점&amp;nbsp;:&amp;nbsp;Seuquential&amp;nbsp;API로는&amp;nbsp;구현하기&amp;nbsp;어려운&amp;nbsp;복잡한&amp;nbsp;모델들을&amp;nbsp;구현할&amp;nbsp;수&amp;nbsp;있음. &lt;br /&gt;-&amp;nbsp;단점&amp;nbsp;:&amp;nbsp;&lt;u&gt;입력의&amp;nbsp;크기&lt;/u&gt;(Shape)를&amp;nbsp;명시한&amp;nbsp;입력층(Input&amp;nbsp;layer)을&amp;nbsp;모델의&amp;nbsp;&lt;u&gt;앞단에&amp;nbsp;정의해주어야&amp;nbsp;함&lt;/u&gt;.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;코드&amp;nbsp;예시&amp;nbsp;:&lt;/p&gt;
&lt;pre id=&quot;code_1742541997098&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  inputs = Input(shape=(1,))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) &lt;b&gt;Subcalssing API&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;장점&amp;nbsp;:&amp;nbsp;Functional&amp;nbsp;API로도&amp;nbsp;구현할&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;모델의&amp;nbsp;구현도&amp;nbsp;가능 &lt;br /&gt;-&amp;nbsp;단점&amp;nbsp;:&amp;nbsp;객체&amp;nbsp;지향&amp;nbsp;프로그래밍에&amp;nbsp;익숙해야하므로&amp;nbsp;코드&amp;nbsp;사용이&amp;nbsp;&lt;u&gt;가장&amp;nbsp;까다로움&lt;/u&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;07-11&amp;nbsp;다층&amp;nbsp;퍼셉트론&amp;nbsp;(MultiLayer&amp;nbsp;Perceptron,&amp;nbsp;MLP)으로&amp;nbsp;텍스트&amp;nbsp;분류하기&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 다층 퍼셉트론 (MultiLayer Perceptron, MLP)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;피드&amp;nbsp;포워드&amp;nbsp;신경망(Feed&amp;nbsp;Forward&amp;nbsp;Neural&amp;nbsp;Network,&amp;nbsp;FFNN)의&amp;nbsp;가장&amp;nbsp;기본적인&amp;nbsp;형태. &lt;br /&gt;-&amp;nbsp;피드&amp;nbsp;포워드&amp;nbsp;신경망은&amp;nbsp;&lt;u&gt;입력층에서&amp;nbsp;출력층으로&amp;nbsp;오직&amp;nbsp;한&amp;nbsp;방향으로만&amp;nbsp;연산&amp;nbsp;방향이&amp;nbsp;정해져&amp;nbsp;있는&amp;nbsp;신경망&lt;/u&gt;을&amp;nbsp;말함. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 케라스의 texts_to_matrix() 이해하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;케라스&amp;nbsp;&lt;b&gt;Tokenizer의&amp;nbsp;text_to_matrix()&lt;/b&gt;를&amp;nbsp;이해해보자 &lt;br /&gt;-&amp;nbsp;코드&amp;nbsp;:&lt;/p&gt;
&lt;pre id=&quot;code_1742542080712&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
from tensorflow.keras.proprocessing.text import Tokenizer
texts = ['먹고 싶은 사과', '먹고 싶은 바나나', '길고 노란 바나나 바나나', '저는 과일이 좋아요']
# 정수 인코딩 (1부터 시작)
tokenizer = Tokenizer()
tokenizer.fit_on_texts(texts)
print(tokenizer.word_index)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;gt;&amp;nbsp;출력&amp;nbsp;:&amp;nbsp;{'바나나'&amp;nbsp;:&amp;nbsp;1,&amp;nbsp;'먹고'&amp;nbsp;:&amp;nbsp;2,&amp;nbsp;'싶은'&amp;nbsp;:&amp;nbsp;3,&amp;nbsp;'사과':4,&amp;nbsp;'길고':5,&amp;nbsp;'노란':6,&amp;nbsp;'저는':7,&amp;nbsp;'과일이':8,&amp;nbsp;'좋아요':&amp;nbsp;9} &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&lt;b&gt;texts_to_matrix()&amp;nbsp;&lt;/b&gt;:&amp;nbsp;입력된&amp;nbsp;텍스트&amp;nbsp;데이터로부터&amp;nbsp;행렬(matrix)를&amp;nbsp;만드는&amp;nbsp;도구.&amp;nbsp;'binary',&amp;nbsp;'count',&amp;nbsp;'freq',&amp;nbsp;'tfidf'&amp;nbsp;총&amp;nbsp;4개의&amp;nbsp;모드를&amp;nbsp;지원함.&amp;nbsp;그&amp;nbsp;중&amp;nbsp;&lt;b&gt;'count'&lt;/b&gt;&amp;nbsp;모드를&amp;nbsp;사용한&amp;nbsp;코드를&amp;nbsp;보자.&lt;/p&gt;
&lt;pre id=&quot;code_1742542109664&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(tokenizer.texts_To_matrix(texts, mode = 'count'))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;gt; 출력 :&amp;nbsp; &lt;br /&gt;[[0.&amp;nbsp;0.&amp;nbsp;1.&amp;nbsp;1.&amp;nbsp;1.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.] &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;1.&amp;nbsp;1.&amp;nbsp;1.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.] &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;2.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;1.&amp;nbsp;1.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.] &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;1.&amp;nbsp;1.&amp;nbsp;1.]] &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&lt;b&gt;count&amp;nbsp;모드&lt;/b&gt;를&amp;nbsp;사용한&amp;nbsp;결과&lt;b&gt;&amp;nbsp;문서&amp;nbsp;단어&amp;nbsp;행렬(DTM)을&amp;nbsp;생성함&lt;/b&gt;.&amp;nbsp;DTM에서의&amp;nbsp;인덱스는&amp;nbsp;앞서&amp;nbsp;확인한&amp;nbsp;word_index의&amp;nbsp;결과. &lt;br /&gt;-&amp;nbsp;주의할&amp;nbsp;점은&lt;u&gt;&amp;nbsp;각&amp;nbsp;단어에&amp;nbsp;부여되는&amp;nbsp;인덱스는&amp;nbsp;1부터&amp;nbsp;시작&lt;/u&gt;하는&amp;nbsp;반면&amp;nbsp;&lt;u&gt;완성되는&amp;nbsp;행렬의&amp;nbsp;인덱스는&amp;nbsp;0부터&amp;nbsp;시작&lt;/u&gt;.&amp;nbsp;&amp;nbsp;=&amp;gt;&amp;nbsp;실제로&amp;nbsp;단어의&amp;nbsp;개수는&amp;nbsp;9개였지만&amp;nbsp;완성된&amp;nbsp;행렬의&amp;nbsp;열의&amp;nbsp;개수는&amp;nbsp;10개인&amp;nbsp;것과&amp;nbsp;첫번째&amp;nbsp;열은&amp;nbsp;모든&amp;nbsp;행에서&amp;nbsp;값이&amp;nbsp;0.&amp;nbsp;인덱스&amp;nbsp;0에는&amp;nbsp;그&amp;nbsp;어떤&amp;nbsp;단어도&amp;nbsp;할당되지&amp;nbsp;않았기&amp;nbsp;때문&amp;nbsp;(인덱스가&amp;nbsp;1부터&amp;nbsp;시작되니까) &lt;br /&gt;-&amp;nbsp;DTM은&amp;nbsp;bag&amp;nbsp;of&amp;nbsp;words를&amp;nbsp;기반으로&amp;nbsp;하기&amp;nbsp;때문에&amp;nbsp;단어&amp;nbsp;순서&amp;nbsp;정보는&amp;nbsp;보존되지&amp;nbsp;않음.&amp;nbsp;(구체적으로는&amp;nbsp;4개의&amp;nbsp;모든&amp;nbsp;모드에서&amp;nbsp;단어&amp;nbsp;순서&amp;nbsp;정보는&amp;nbsp;보존되지&amp;nbsp;않음.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;&lt;b&gt;'binary'&lt;/b&gt;&amp;nbsp;모드의&amp;nbsp;코드&amp;nbsp;:&lt;/p&gt;
&lt;pre id=&quot;code_1742542227562&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(tokenizer.texts_to_matrix(texts, mode = 'binary'))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;gt; 출력: &lt;br /&gt;[[0.&amp;nbsp;0.&amp;nbsp;1.&amp;nbsp;1.&amp;nbsp;1.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.] &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;1.&amp;nbsp;1.&amp;nbsp;1.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.] &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;1.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;1.&amp;nbsp;1.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.] &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;0.&amp;nbsp;1.&amp;nbsp;1.&amp;nbsp;1.]] &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;DTM의&amp;nbsp;결과와&amp;nbsp;매우&amp;nbsp;유사함.&amp;nbsp;다만&amp;nbsp;세번째&amp;nbsp;행,&amp;nbsp;두번째&amp;nbsp;열의&amp;nbsp;값이&amp;nbsp;DTM에서는&amp;nbsp;2였는데&amp;nbsp;여기선&amp;nbsp;1로&amp;nbsp;바뀜&amp;nbsp;-&amp;gt;&amp;nbsp;'binary'&amp;nbsp;모드는&amp;nbsp;해당&amp;nbsp;단어가&amp;nbsp;&lt;u&gt;존재하는지만&amp;nbsp;관심&lt;/u&gt;을&amp;nbsp;가지고&amp;nbsp;해당&amp;nbsp;단어가&amp;nbsp;&lt;u&gt;몇&amp;nbsp;개였는지는&amp;nbsp;무시&lt;/u&gt;하기&amp;nbsp;때문.&amp;nbsp;(&lt;b&gt;단어가&amp;nbsp;존재하면&amp;nbsp;1,&amp;nbsp;존재하지&amp;nbsp;않으면&amp;nbsp;&lt;/b&gt;0의&amp;nbsp;값을&amp;nbsp;가짐) &lt;br /&gt;&lt;br /&gt;-&lt;b&gt;&amp;nbsp;'tfidf'&amp;nbsp;&lt;/b&gt;모드의&amp;nbsp;코드:&lt;/p&gt;
&lt;pre id=&quot;code_1742542273882&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(tokenizer.texts_to_matrix(texts mode = 'tfidf').round(2))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;gt; 출력 :&amp;nbsp; &lt;br /&gt;[[0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.85&amp;nbsp;0.85&amp;nbsp;1.1&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;] &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.85&amp;nbsp;0.85&amp;nbsp;0.85&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;] &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;&amp;nbsp;&amp;nbsp;1.43&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;1.1&amp;nbsp;&amp;nbsp;1.1&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;] &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;1.1&amp;nbsp;&amp;nbsp;1.1&amp;nbsp;&amp;nbsp;1.1&amp;nbsp;]] &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;말&amp;nbsp;그대로&amp;nbsp;TF-IDF&amp;nbsp;행렬을&amp;nbsp;만듦.&amp;nbsp;다만,&amp;nbsp;앞서&amp;nbsp;배운&amp;nbsp;기본식에서&amp;nbsp;TF는&amp;nbsp;각&amp;nbsp;문서에서의&amp;nbsp;각&amp;nbsp;단어의&amp;nbsp;빈도였다면,&amp;nbsp;'tfidf'&amp;nbsp;모드에서&amp;nbsp;TF는&amp;nbsp;각&amp;nbsp;문서에서의&amp;nbsp;&lt;b&gt;각&amp;nbsp;단어의&amp;nbsp;빈도에&amp;nbsp;자연&amp;nbsp;로그를&amp;nbsp;씌우고&amp;nbsp;1을&amp;nbsp;더한&amp;nbsp;값&lt;/b&gt;으로 정의.&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&lt;b&gt;'freq'&lt;/b&gt;&amp;nbsp;모드의&amp;nbsp;코드:&lt;/p&gt;
&lt;pre id=&quot;code_1742542307955&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(tokenizer.texts_to_matrix(texts, mode = 'freq').round(2))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;gt; 출력 결과: &lt;br /&gt;[[0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.33&amp;nbsp;0.33&amp;nbsp;0.33&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;] &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.33&amp;nbsp;0.33&amp;nbsp;0.33&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;] &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.5&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.25&amp;nbsp;0.25&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;] &lt;br /&gt;&amp;nbsp;[0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.&amp;nbsp;&amp;nbsp;&amp;nbsp;0.33&amp;nbsp;0.33&amp;nbsp;0.33]] &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;각&amp;nbsp;문서에서의&amp;nbsp;각&amp;nbsp;단어의&lt;b&gt;&amp;nbsp;등장&amp;nbsp;횟수를&amp;nbsp;분자로,&amp;nbsp;각&amp;nbsp;문서의&amp;nbsp;크기&lt;/b&gt;(각&amp;nbsp;문서에서&amp;nbsp;등장한&amp;nbsp;모든&amp;nbsp;단어의&amp;nbsp;개수의&amp;nbsp;총&amp;nbsp;합)&lt;b&gt;를&amp;nbsp;분모&lt;/b&gt;로&amp;nbsp;하는&amp;nbsp;표현&amp;nbsp;방법.&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;&lt;br /&gt;3. 20개 뉴스 그룹(Twenty Newsprouts) 데이터에 대한 이해&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 코드 :&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1742542345833&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 라이브러리 불러오기
import pandas as pd
from sklearn.datasets import fetch_20newsgroups
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing. text import Tokenizer
from tensorflow.keras.utils import to_categorical

# 데이터 가져오기 (20개의 다른 주제를 가진 18,846개의 뉴스 그룹 이메일 데이터)
newsdata = fetch_20newgroups(subset = 'train') # 훈련 데이터만 입력 (all을 넣으면 전체데이터, test를 넣으면 테스트 데이터)

# 데이터의 속성 확인
print(newsdata.keys())
-&amp;gt; 출력 결과 : 이 중 target이 data와 메일이 어떤 주제인지 기재된 숫자 레이블로 실제 훈련에 사용할 속성임
dict_keys(['data', 'filenames', 'target_names', 'target', 'DESCR'])

# 주제의 개수 확인
print('총 주제의 개수 : {}'.format(len(newsdata.target_names)))
print(newsdata.target_names)
-&amp;gt; 출력 결과
총 주제의 개수 : 20
['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x', 'misc.forsale', 'rec.autos', 'rec.motorcycles', 'rec.sport.baseball', 'rec.sport.hockey', 'sci.crypt', 'sci.electronics', 'sci.med', 'sci.space', 'soc.religion.christian', 'talk.politics.guns', 'talk.politics.mideast', 'talk.politics.misc', 'talk.religion.misc']

# 첫번째 샘플
print('첫번째 샘플의 레이블 : {}'.format(newsdata.target[0]))
-&amp;gt; 첫번째 샘플의 레이블 : 7

# 숫자로는 20개의 주제중 어떤 주제인지 모름. 실제 어떤 주제인지 확인
print('7번 레이블이 의미하는 주제 : {}'.format(newsdata.target_names[7]))
-&amp;gt; 7번 레이블이 의미하는 주제 : rec.autos

# 첫번째 샘플 본문내용
print(newsdata.data[0])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;gt;&amp;nbsp;출력&amp;nbsp;결과&amp;nbsp;: &lt;br /&gt;From:&amp;nbsp;lerxst@wa&lt;a href=&quot;http://m.umd.edu&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://m.umd.edu&lt;/a&gt;&amp;nbsp;(where's&amp;nbsp;my&amp;nbsp;thing) &lt;br /&gt;Subject:&amp;nbsp;WHAT&amp;nbsp;car&amp;nbsp;is&amp;nbsp;this!? &lt;br /&gt;Nntp-Posting-Host:&amp;nbsp;rac3.wa&lt;a href=&quot;http://m.umd.edu&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://m.umd.edu&lt;/a&gt;&lt;br /&gt;Organization:&amp;nbsp;University&amp;nbsp;of&amp;nbsp;Maryland,&amp;nbsp;College&amp;nbsp;Park &lt;br /&gt;Lines:&amp;nbsp;15 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;I&amp;nbsp;was&amp;nbsp;wondering&amp;nbsp;if&amp;nbsp;anyone&amp;nbsp;out&amp;nbsp;there&amp;nbsp;could&amp;nbsp;enlighten&amp;nbsp;me&amp;nbsp;on&amp;nbsp;this&amp;nbsp;car&amp;nbsp;I&amp;nbsp;saw &lt;br /&gt;the&amp;nbsp;other&amp;nbsp;day.&amp;nbsp;It&amp;nbsp;was&amp;nbsp;a&amp;nbsp;2-door&amp;nbsp;sports&amp;nbsp;car,&amp;nbsp;looked&amp;nbsp;to&amp;nbsp;be&amp;nbsp;from&amp;nbsp;the&amp;nbsp;late&amp;nbsp;60s/ &lt;br /&gt;early&amp;nbsp;70s.&amp;nbsp;It&amp;nbsp;was&amp;nbsp;called&amp;nbsp;a&amp;nbsp;Bricklin.&amp;nbsp;The&amp;nbsp;doors&amp;nbsp;were&amp;nbsp;really&amp;nbsp;small.&amp;nbsp;In&amp;nbsp;addition, &lt;br /&gt;the&amp;nbsp;front&amp;nbsp;bumper&amp;nbsp;was&amp;nbsp;separate&amp;nbsp;from&amp;nbsp;the&amp;nbsp;rest&amp;nbsp;of&amp;nbsp;the&amp;nbsp;body.&amp;nbsp;This&amp;nbsp;is&amp;nbsp; &lt;br /&gt;all&amp;nbsp;I&amp;nbsp;know.&amp;nbsp;If&amp;nbsp;anyone&amp;nbsp;can&amp;nbsp;tellme&amp;nbsp;a&amp;nbsp;model&amp;nbsp;name,&amp;nbsp;engine&amp;nbsp;specs,&amp;nbsp;years &lt;br /&gt;of&amp;nbsp;production,&amp;nbsp;where&amp;nbsp;this&amp;nbsp;car&amp;nbsp;is&amp;nbsp;made,&amp;nbsp;history,&amp;nbsp;or&amp;nbsp;whatever&amp;nbsp;info&amp;nbsp;you &lt;br /&gt;have&amp;nbsp;on&amp;nbsp;this&amp;nbsp;funky&amp;nbsp;looking&amp;nbsp;car,&amp;nbsp;please&amp;nbsp;e-mail. &lt;br /&gt;&lt;br /&gt;Thanks, &lt;br /&gt;-&amp;nbsp;IL &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;----&amp;nbsp;brought&amp;nbsp;to&amp;nbsp;you&amp;nbsp;by&amp;nbsp;your&amp;nbsp;neighborhood&amp;nbsp;Lerxst&amp;nbsp;----&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;이메일의&amp;nbsp;내용을&amp;nbsp;보니&amp;nbsp;스포츠&amp;nbsp;카에&amp;nbsp;대한&amp;nbsp;글로&amp;nbsp;보임.&amp;nbsp;이&amp;nbsp;글의&amp;nbsp;레이블은&amp;nbsp;7이고,&amp;nbsp;7번&amp;nbsp;레이블은&amp;nbsp;rec.autos란&amp;nbsp;주제를&amp;nbsp;의미.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1742542371039&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# data로부터 데이터프레임을 생성하고, target열을 추가
data = pd.DataFrame(newsdata.data, columns = ['email'])
data['target'] = pd.Series(newsdata.target)

# 결측 확인
data.isnull().values.any()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;gt;&amp;nbsp;결과&amp;nbsp;:&amp;nbsp;False &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1742542379279&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# nunique() : 중복을 제거한 개수 확인
print('중복을 제외한 샘플의 수 : {}'.format(data['email'].nunique()))
print('중복을 제외한 주제의 수 : {}'.format(data['target'].nunique()))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 결과 : &lt;br /&gt;중복을&amp;nbsp;제외한&amp;nbsp;샘플의&amp;nbsp;수&amp;nbsp;:&amp;nbsp;11314 &lt;br /&gt;중복을&amp;nbsp;제외한&amp;nbsp;주제의&amp;nbsp;수&amp;nbsp;:&amp;nbsp;20 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1742542392866&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 레이블의 값 분포를 시각화
data['target'].value_counts().plot(kind='bar');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 10번 레이블의 수가 가장 많고, 19번의 레이블의 수가 가장 적으며 대체적으로 400-600개 사이의 분포를 보임. &lt;br /&gt;-&amp;nbsp;아래&amp;nbsp;코드를&amp;nbsp;통해&amp;nbsp;구체적은&amp;nbsp;수치&amp;nbsp;확인&lt;/p&gt;
&lt;pre id=&quot;code_1742542409768&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(data.groupby('target').size().reset_index(name='count'))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;gt; 결과 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;target&amp;nbsp;&amp;nbsp;count &lt;br /&gt;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;480 &lt;br /&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;584 &lt;br /&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;591 &lt;br /&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;590 &lt;br /&gt;4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;578 &lt;br /&gt;5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;593 &lt;br /&gt;6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;585 &lt;br /&gt;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;594 &lt;br /&gt;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;598 &lt;br /&gt;9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;597 &lt;br /&gt;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;600 &lt;br /&gt;11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;595 &lt;br /&gt;12&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;591 &lt;br /&gt;13&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;594 &lt;br /&gt;14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;593 &lt;br /&gt;15&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;599 &lt;br /&gt;16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;546 &lt;br /&gt;17&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;564 &lt;br /&gt;18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;465 &lt;br /&gt;19&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;377 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1742542438671&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 훈련 데이터와 테스트 데이터의 본문과 레이블을 각각 저장
newsdata_test = fetch_20newsgroups(subset='test', shuffle = True)
train_email = data['email]
train_label = data['target']
test_email = newsdata_test.data
test_label = newdata_test.target

# 케라스의 토크나이저 도구를 사용하여 전처리
vocab_size = 10000 #  최대 단어 개수 정의. 빈도수가 가장 높은 상위 vocal_size개수만큼의 단어를 사용
num_calsses = 20
def prepare_data (train_data, test_data, mode) : # 전처리 함수
   tokenizer = Tokenizer(num_words = vocab_size) # vocal_size 개수만큼의 단어만 사용
   tokenizer.fit_on_texts(train_data)
   X_train = tokenizer.texts_to_matrix(train_data, mode = mode) # 샘플 수 x vocab_size 크기의 행렬 생성
   X_test = tokenizer.texts_to_matrix(test_data, mode = mode) # 샘플 수 x vocab_size 크기의 행렬 생성
   return X_train, X_test, tokenizer.index_word

- prepare_data : 케라스 토크나이저로 전처리를 수행하는 함수. 해당 함수는 케라스 토크나이저를 통해 단어 토큰화를 수행하고, 앞서 배운 texts_to_matrix()를 사용하여 훈련 데이터와 테스트 데이터를 'binary', 'count', 'tfidf', 'freq' 4개의 모드 중 사용자가 정한 모드로 변환함.

# 메일 본문에 대해서 'binary' 모드로 변환하고 훈련 데이터와 테스트 데이터의 레이블은 원-핫 인코딩을 수행
X_train, X_test, index_to_word = prepare_data(train_email, test_email, 'binary') # binary 모드로 변환
y_train = to_categorical(train_label, num_classes) # 원-핫 인코딩
y_test = to_categorical(test_label, num_classes) # 원-핫 인코딩
print('훈련 샘플 본문의 크기 : {}'.format(X_train.shape))
print('훈련 샘플 레이블의 크기 : {}'.format(y_train.shape))
print('테스트 샘플 본문의 크기 : {}'.format(X_test.shape))
print('테스트 샘플 레이블의 크기 : {}'.format(y_test.shape))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;gt;&amp;nbsp;결과&amp;nbsp;: &lt;br /&gt;훈련&amp;nbsp;샘플&amp;nbsp;본문의&amp;nbsp;크기&amp;nbsp;:&amp;nbsp;(11314,&amp;nbsp;10000) &lt;br /&gt;훈련&amp;nbsp;샘플&amp;nbsp;레이블의&amp;nbsp;크기&amp;nbsp;:&amp;nbsp;(11314,&amp;nbsp;20) &lt;br /&gt;테스트&amp;nbsp;샘플&amp;nbsp;본문의&amp;nbsp;크기&amp;nbsp;:&amp;nbsp;(7532,&amp;nbsp;10000) &lt;br /&gt;테스트&amp;nbsp;샘플&amp;nbsp;레이블의&amp;nbsp;크기&amp;nbsp;:&amp;nbsp;(7532,&amp;nbsp;20) &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;훈련&amp;nbsp;데이터와&amp;nbsp;테스트&amp;nbsp;데이터&amp;nbsp;모두&amp;nbsp;메일&amp;nbsp;본문의&amp;nbsp;크기가&amp;nbsp;샘플의수&amp;nbsp;X&amp;nbsp;10,000의&amp;nbsp;행렬로&amp;nbsp;변환됨.&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;b&gt;열의&amp;nbsp;개수가&amp;nbsp;10,000인&amp;nbsp;것&lt;/b&gt;은&amp;nbsp;prepare_data&amp;nbsp;함수&amp;nbsp;내부에서&amp;nbsp;Tokenizer의&amp;nbsp;num_words의&amp;nbsp;인자로&amp;nbsp;vocab_size를&amp;nbsp;지정해주었기&amp;nbsp;때문.&amp;nbsp;단어의&amp;nbsp;정수&amp;nbsp;인덱스는&amp;nbsp;1부터&amp;nbsp;시작하지만,&amp;nbsp;행렬의&amp;nbsp;인덱스는0부터&amp;nbsp;시작하여&amp;nbsp;0번&amp;nbsp;인덱스는&amp;nbsp;사용되지&amp;nbsp;않으므로&amp;nbsp;실제로&amp;nbsp;행렬에는&amp;nbsp;빈도수&amp;nbsp;기준&amp;nbsp;상위&amp;nbsp;&lt;b&gt;9,999개의&amp;nbsp;단어&lt;/b&gt;가&amp;nbsp;표현된&amp;nbsp;셈. &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;빈도수&amp;nbsp;상위1번,&amp;nbsp;상위&amp;nbsp;999번&amp;nbsp;단어&amp;nbsp;확인:&lt;/p&gt;
&lt;pre id=&quot;code_1742542472970&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print('빈도수 상위 1번 단어 : {}'.format(index_to_word[1]))
print('빈도수 상위 9999번 단어 : {}'.format(index_to_word[9999]))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;gt;&amp;nbsp;결과 &lt;br /&gt;빈도수&amp;nbsp;상위&amp;nbsp;1번&amp;nbsp;단어&amp;nbsp;:&amp;nbsp;the &lt;br /&gt;빈도수&amp;nbsp;상위&amp;nbsp;9999번&amp;nbsp;단어&amp;nbsp;:&amp;nbsp;mic&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;&lt;br /&gt;4.&amp;nbsp;다층&amp;nbsp;퍼셉트론(Multilayer&amp;nbsp;Perceptron,&amp;nbsp;MLP)을&amp;nbsp;사용하여&amp;nbsp;텍스트&amp;nbsp;분류하기&lt;/h4&gt;
&lt;pre id=&quot;code_1742542494361&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 라이브러리 불러오기
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout

# 다층 퍼셉트론 설계
def fit_and_evaluate(X_train, y_trainn, X_test, y_test):
   model = Sequential()
   model.add(Dense(256, input_shape=(vocab_size,), activation = 'relu'))
   model.add(Dropout(0.5))  
   model.add(Dense(128, activation = 'relu'))
   model.add(Dropout(0.5))
   model.add(Dense(num_classes, activation = 'softmax'))
   model.compile(loss='categorical_crossentropy', optimizer = 'adam', metrics=['accuracy'])
   model.fit(X_train, y_train, batch_size = 128, epochs = 5, verbose = 1, validation_split = 0.1)
   score = model.evaluate(X_test, y_test, batch_size = 128, verbose = 0)
   return score{1]

- 위의 코드로 설계한 다층 퍼셉트론은 총 4개의 층을 가지고 있음. vocab_size의 크기를 가진 입력층, 256개의 뉴런을 가진 첫번째 은닉층, 128개의 뉴런을 가진 두 번째 은닉층, num_classes의 크기를 가진 출력층.
- 과적합을 피하기 위해 두번의 드롭아웃(Dropout)을 적용함. 이 문제는 다중 클래스 분류 문제이므로 출력층의 활성화함수로 소프트맥스 함수를 사용하고 손실함수로는 크로스 엔트로피(categorical_crossentropy) 함수를 사용.

# 모델 훈련
modes = ['binary', 'count', 'tfidf', 'freq'] # 네개의 모들를 저장
for mode in modes :
   X_train, X_test, __ = prepare_data(train_email, test_email, mode) # 모드에 따라 데이터 전처리
   score = fit_and_evaluate(X_train, y_train, X_test, y_test) 
   print(mode + '모드의 테스트 정확도 : ' , score)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;gt; 출력 &lt;br /&gt;binary&amp;nbsp;모드의&amp;nbsp;테스트&amp;nbsp;정확도:&amp;nbsp;0.8312533 &lt;br /&gt;count&amp;nbsp;모드의&amp;nbsp;테스트&amp;nbsp;정확도:&amp;nbsp;0.8239511 &lt;br /&gt;tfidf&amp;nbsp;모드의&amp;nbsp;테스트&amp;nbsp;정확도:&amp;nbsp;0.8381572 &lt;br /&gt;freq&amp;nbsp;모드의&amp;nbsp;테스트&amp;nbsp;정확도:&amp;nbsp;0.6902549 &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;대체적으로&amp;nbsp;82-83%의&amp;nbsp;정확도&amp;nbsp;보이는데,&amp;nbsp;'freq'&amp;nbsp;모드에서만&amp;nbsp;정확도가&amp;nbsp;69%가&amp;nbsp;나옴.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;07-12&amp;nbsp;피드&amp;nbsp;포워드&amp;nbsp;신경망&amp;nbsp;언어&amp;nbsp;모델(Neural&amp;nbsp;Network&amp;nbsp;Language&amp;nbsp;Model,&amp;nbsp;NNLM)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자연어는 많은 &lt;u&gt;예외 사항&lt;/u&gt;, 시간에 따른 언어의 변화, 중의성과 모호성 문제 등을 &lt;u&gt;전부 명세하기 어려움&lt;/u&gt;. 기계가 자연어를 표현하도록 규칙으로 명세하기 어려운 상황에서 대안은 &lt;u&gt;규칙 기반 접근이 아닌&lt;/u&gt; 기계가 &lt;b&gt;주어진 자연어 데이터를 학습하게 하는 것&lt;/b&gt;. &lt;br /&gt;-&amp;nbsp;과거에는&amp;nbsp;통계적인&amp;nbsp;접근을&amp;nbsp;사용했으나,&amp;nbsp;최근에는&amp;nbsp;인공&amp;nbsp;신경망을&amp;nbsp;사용하는&amp;nbsp;방법이&amp;nbsp;자연어&amp;nbsp;처리에&amp;nbsp;더&amp;nbsp;좋은&amp;nbsp;성능을&amp;nbsp;얻고&amp;nbsp;있음.&amp;nbsp;번역기,&amp;nbsp;음성&amp;nbsp;인식&amp;nbsp;등과&amp;nbsp;같은&amp;nbsp;자연어&amp;nbsp;생의&amp;nbsp;기반으로&amp;nbsp;사용되는&amp;nbsp;언어&amp;nbsp;모델도&amp;nbsp;마찬가지.&amp;nbsp; &lt;br /&gt;- 신경망 언어 모델의 시초인 피드 포워드 신경망 언어 모델 (Feed Forward Neural Network Language Model)에 대해 학습하자.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;1. 기존 N-gram 언어 모델의 한계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;언어&amp;nbsp;모델은&amp;nbsp;문장에&amp;nbsp;확률을&amp;nbsp;할당하는&amp;nbsp;모델로&amp;nbsp;&lt;u&gt;주어진&amp;nbsp;문맥으로부터&amp;nbsp;아직&amp;nbsp;모르는&amp;nbsp;단어를&amp;nbsp;예측하는&amp;nbsp;것&lt;/u&gt;을&amp;nbsp;언어&amp;nbsp;모델링이라고&amp;nbsp;함. &lt;br /&gt;-&amp;nbsp;n_gram&amp;nbsp;언어&amp;nbsp;모델은&amp;nbsp;언어&amp;nbsp;모델링에&amp;nbsp;&lt;b&gt;바로&amp;nbsp;앞&amp;nbsp;n-1개의&amp;nbsp;단어를&amp;nbsp;참고&lt;/b&gt;함.&amp;nbsp;4-gram&amp;nbsp;언어&amp;nbsp;모델이라면&amp;nbsp;앞의&amp;nbsp;3개의&amp;nbsp;단어만&amp;nbsp;참고하는&amp;nbsp;것. &lt;br /&gt;- 이러한 n_gram 언어 모델은 충분한 데이터를 관측하지 못하면 언어를 정확히 모델링하지 못하는 희소 문제가 있음.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;2. 단어의 의미적 유사성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;b&gt;희소문제&lt;/b&gt;는&amp;nbsp;기계가&amp;nbsp;단어의&amp;nbsp;&lt;u&gt;의미적&amp;nbsp;유사성을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있다면&amp;nbsp;해결할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;문제&lt;/u&gt;.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;'톺아보다'가&amp;nbsp;'샅샅이&amp;nbsp;살펴보다'와&amp;nbsp;유사한&amp;nbsp;의미일때,&amp;nbsp;'발표&amp;nbsp;자료를&amp;nbsp;살펴보다'라는&amp;nbsp;단어&amp;nbsp;시퀀스는&amp;nbsp;존재하지만,&amp;nbsp;'발표&amp;nbsp;자료를&amp;nbsp;톺아보다'라는&amp;nbsp;단어&amp;nbsp;시퀀스는&amp;nbsp;존재하지&amp;nbsp;않는&amp;nbsp;코퍼스를&amp;nbsp;학습한&amp;nbsp;언어&amp;nbsp;모델이&amp;nbsp;있다면,&amp;nbsp;&amp;nbsp;발표&amp;nbsp;자료를&amp;nbsp;다음에&amp;nbsp;톺아보다가&amp;nbsp;올&amp;nbsp;확률을&amp;nbsp;0으로&amp;nbsp;연산함.&amp;nbsp;(n-gram&amp;nbsp;언어&amp;nbsp;모델) &lt;br /&gt;- 만약 언어 모델이 &lt;b&gt;단어의 의미적 유사성을 학습&lt;/b&gt;할 수 있도록 설계한다면, 훈련 코퍼스에 없는 단어 시퀀스에 대한 예측이라도 &lt;u&gt;유사한 단어가 사용된 단어 시퀀스를 참고하여 보다 정확한 예측을 할 수 있음.&lt;/u&gt; -&amp;gt; 이러한 아이디어를 반영한 언어모델이 신경망 언어 모델&lt;b&gt; NNLM&lt;/b&gt;임. 단어 벡터간 유사도를 구할 수 있는 벡터를 얻어내는 워드 임베딩의 아이디어기도 함. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;3. 피드 포워드 신경망 언어 모델 (NNLM)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;NNLM이&amp;nbsp;언어&amp;nbsp;모델링을&amp;nbsp;학습하는&amp;nbsp;과정을&amp;nbsp;간소화된&amp;nbsp;형태로&amp;nbsp;설명해보자 &lt;br /&gt;-&amp;nbsp;예문&amp;nbsp;:&amp;nbsp;&quot;what&amp;nbsp;will&amp;nbsp;the&amp;nbsp;fat&amp;nbsp;cat&amp;nbsp;sit&amp;nbsp;on&quot; &lt;br /&gt;-&amp;nbsp;&amp;nbsp;언어&amp;nbsp;모델은&amp;nbsp;주어진&amp;nbsp;단어&amp;nbsp;시퀀스로부터&amp;nbsp;다음&amp;nbsp;단어를&amp;nbsp;예측.&amp;nbsp;훈련&amp;nbsp;과정에서는&amp;nbsp;'what&amp;nbsp;will&amp;nbsp;the&amp;nbsp;fat&amp;nbsp;cat'이라는&amp;nbsp;단어&amp;nbsp;시퀀스가&amp;nbsp;입력으로&amp;nbsp;주어지면,&amp;nbsp;다음&amp;nbsp;단어&amp;nbsp;'sit을&amp;nbsp;예측하는&amp;nbsp;방식으로&amp;nbsp;훈련됨. &lt;br /&gt;-&amp;nbsp;가장&amp;nbsp;먼저&amp;nbsp;해야&amp;nbsp;할&amp;nbsp;일은&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;&lt;b&gt;원-핫&amp;nbsp;인코딩&lt;/b&gt;. &lt;br /&gt;what&amp;nbsp;=&amp;nbsp;[1,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0] &lt;br /&gt;will&amp;nbsp;=&amp;nbsp;[0,&amp;nbsp;1,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0] &lt;br /&gt;the&amp;nbsp;=&amp;nbsp;[0,&amp;nbsp;0,&amp;nbsp;1,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0] &lt;br /&gt;fat&amp;nbsp;=&amp;nbsp;[0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;1,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0] &lt;br /&gt;cat&amp;nbsp;=&amp;nbsp;[0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;1,&amp;nbsp;0,&amp;nbsp;0] &lt;br /&gt;sit&amp;nbsp;=&amp;nbsp;[0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;1,&amp;nbsp;0] &lt;br /&gt;on&amp;nbsp;=&amp;nbsp;[0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;1] &lt;br /&gt;&lt;br /&gt;- n을 4라고 해보자. 이때, 언어 모델은 'what will the fat cat'이 주어졌을 때, 다음 단어를 예측하기 위해 앞의 4개 단어 'will the fat cat'까지만 참고함. 이 범위를 &lt;b&gt;윈도우(window)&lt;/b&gt;라고 하기도 함 (이때 윈도우 크기는 4)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력은 4개의 단어 (윈도우크기) 'will', 'the', 'fat', 'cat의 원-핫 벡터. 출력층(output layer)은 모델이 예측해야 하는 정답 해당되는 단어 sit의 원-핫 벡터는 모델이 예측한 값의 오차를 구하기 위해 레이블로서 사용됨. &lt;br /&gt;-&amp;nbsp;4개의&amp;nbsp;원-핫&amp;nbsp;벡터를&amp;nbsp;입력&amp;nbsp;받은&amp;nbsp;NNLM은&amp;nbsp;다음층인&amp;nbsp;&lt;b&gt;투사층(&lt;/b&gt;projection&amp;nbsp;layer)을&amp;nbsp;지나게&amp;nbsp;됨.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인공 신경망에서 입력층과 출력층 사이는 보통 은닉층이라고 부르는데, 여기서 투사층이라고 명명한 이 층은 &lt;u&gt;일반&amp;nbsp;은닉층과&amp;nbsp;다르게&lt;/u&gt;&amp;nbsp;가중치&amp;nbsp;행렬과의&amp;nbsp;곱셈은&amp;nbsp;이루어지지만&amp;nbsp;&lt;u&gt;활성화&amp;nbsp;함수가&amp;nbsp;존재하지&amp;nbsp;않음&lt;/u&gt;. &lt;br /&gt;-&amp;nbsp;&lt;b&gt;투사층의&amp;nbsp;크기를&amp;nbsp;M&lt;/b&gt;으로&amp;nbsp;설정하면,&amp;nbsp;각&amp;nbsp;입력&amp;nbsp;단어들은&amp;nbsp;&lt;b&gt;투사층에서&amp;nbsp;V&amp;nbsp;X&amp;nbsp;M&amp;nbsp;크기의&amp;nbsp;가중치&amp;nbsp;행렬과&amp;nbsp;곱해&lt;/b&gt;짐.&amp;nbsp;여기서&amp;nbsp;&lt;u&gt;V는&amp;nbsp;단어&amp;nbsp;집합의&amp;nbsp;크기를&amp;nbsp;의미&lt;/u&gt;.&lt;br /&gt;-원-핫&amp;nbsp;벡터의&amp;nbsp;특성으로&amp;nbsp;인해&lt;b&gt;&amp;nbsp;i번째&amp;nbsp;인덱스에&amp;nbsp;1이라는&amp;nbsp;값을&amp;nbsp;가지고&amp;nbsp;그&amp;nbsp;외는&amp;nbsp;0의&amp;nbsp;값&lt;/b&gt;을&amp;nbsp;가지므로&amp;nbsp;원-핫&amp;nbsp;벡터와&amp;nbsp;가중치&amp;nbsp;W행렬의&amp;nbsp;곱은&amp;nbsp;사실&lt;u&gt;&amp;nbsp;W행렬의&amp;nbsp;i번째&amp;nbsp;행을&amp;nbsp;그대로&amp;nbsp;읽어오는&amp;nbsp;것과&amp;nbsp;(lookup)&amp;nbsp;동일&lt;/u&gt;.&amp;nbsp;그래서&amp;nbsp;이&amp;nbsp;작업을&amp;nbsp;&lt;b&gt;룩업&amp;nbsp;테이블&lt;/b&gt;(lookup&amp;nbsp;table)이라고&amp;nbsp;함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- 룩업 테이블 이후에는&lt;b&gt; V차원을 가지는 원-핫 벡터&lt;/b&gt;는 이보다 더 차원이 작은&lt;i&gt; M차원의 벡터로 맵핑&lt;/i&gt;됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 벡터들은 초기에는 랜덤한 값을 가지지만 학습 과정에서 값이&amp;nbsp;&amp;nbsp;계속 변경되는데 이 단어 벡터를 &lt;b&gt;임베딩 벡터&lt;/b&gt;(Embedding vector)라고 함. &lt;br /&gt;- 각 단어가 테이블 룩업을 통해 임베딩 벡터로 변경되고, 투사층에서 모든 임베딩 벡터들의 값은 연결됨.&amp;nbsp;&lt;br /&gt;-&amp;nbsp;일반적인&amp;nbsp;은닉층이&amp;nbsp;활성화&amp;nbsp;함수를&amp;nbsp;사용하는&amp;nbsp;비선형층인&amp;nbsp;것과는&amp;nbsp;달리&amp;nbsp;투사층은&amp;nbsp;활성화&amp;nbsp;함수가&amp;nbsp;존재하지&amp;nbsp;않는&amp;nbsp;선형층이라는&amp;nbsp;점이&amp;nbsp;다소&amp;nbsp;생소하지만,&amp;nbsp;&lt;b&gt;이&amp;nbsp;다음은&amp;nbsp;다시&amp;nbsp;은닉층을&amp;nbsp;사용하는&amp;nbsp;일반적인&amp;nbsp;피드&amp;nbsp;포워드&amp;nbsp;신경망과&amp;nbsp;동일&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;&lt;u&gt;투사층의&amp;nbsp;결과는&amp;nbsp;h의&amp;nbsp;크기를&amp;nbsp;가지는&amp;nbsp;은닉층을&amp;nbsp;지남&lt;/u&gt;.&amp;nbsp;은닉층의&amp;nbsp;출력은&amp;nbsp;V의&amp;nbsp;크기를&amp;nbsp;&amp;nbsp;가지는&amp;nbsp;출력층으로&amp;nbsp;향함.&amp;nbsp;이&amp;nbsp;과정에서&amp;nbsp;다시&amp;nbsp;또&amp;nbsp;다른&amp;nbsp;가중치와&amp;nbsp;곱해지고&amp;nbsp;편향이&amp;nbsp;더해지면,&amp;nbsp;입력이었던&amp;nbsp;원-핫&amp;nbsp;벡터들과&amp;nbsp;동일하게&amp;nbsp;V차원의&amp;nbsp;벡터를&amp;nbsp;얻음.&amp;nbsp;출력층에서는&amp;nbsp;&lt;u&gt;활성화&amp;nbsp;함수로&amp;nbsp;소프트맥스&amp;nbsp;함수&lt;/u&gt;를&amp;nbsp;사용하는데,&amp;nbsp;V차원의&amp;nbsp;벡터는&amp;nbsp;소프트맥스&amp;nbsp;함수를&amp;nbsp;지나면서&amp;nbsp;벡터의&amp;nbsp;각&amp;nbsp;원소는&amp;nbsp;0과&amp;nbsp;1&amp;nbsp;사이의&amp;nbsp;실수값을&amp;nbsp;가지며&amp;nbsp;총&amp;nbsp;합은&amp;nbsp;1이&amp;nbsp;되는&amp;nbsp;상태로&amp;nbsp;바뀜.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;NNLM의&amp;nbsp;예측값&amp;nbsp;벡터의&amp;nbsp;각&amp;nbsp;차원&amp;nbsp;안에서의&amp;nbsp;값이&amp;nbsp;의미하는&amp;nbsp;것은&amp;nbsp;이와&amp;nbsp;같음.&amp;nbsp;j번째&amp;nbsp;인덱스가&amp;nbsp;가진&amp;nbsp;0과&amp;nbsp;1&amp;nbsp;사이의&amp;nbsp;값은&amp;nbsp;&lt;u&gt;j번째&amp;nbsp;단어가&amp;nbsp;다음&amp;nbsp;단어일&amp;nbsp;확률을&amp;nbsp;나타냄&lt;/u&gt;.&amp;nbsp;실제값과&amp;nbsp;가까워지기&amp;nbsp;위해서&amp;nbsp;NNLM은&amp;nbsp;&lt;b&gt;손실&amp;nbsp;함수로&amp;nbsp;크로스&amp;nbsp;엔트로피&lt;/b&gt;(cross-entropuy)를&amp;nbsp;사용. &lt;br /&gt;-&amp;nbsp;충분한&amp;nbsp;훈련&amp;nbsp;데이터가&amp;nbsp;있다면,&amp;nbsp;수많은&amp;nbsp;문장에서&amp;nbsp;유사한&amp;nbsp;목적으로&amp;nbsp;사용되는&amp;nbsp;단어들은&amp;nbsp;결국&amp;nbsp;유사한&amp;nbsp;임베딩&amp;nbsp;벡터값을&amp;nbsp;얻게&amp;nbsp;됨&amp;nbsp;-&amp;gt;&amp;nbsp;다음&amp;nbsp;단어를&amp;nbsp;예측하는&amp;nbsp;과정에서&amp;nbsp;훈련&amp;nbsp;코퍼스에서&amp;nbsp;없던&amp;nbsp;단어&amp;nbsp;시퀀스라&amp;nbsp;하더라도&amp;nbsp;다음&amp;nbsp;단어를&amp;nbsp;선택할&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;이점이&amp;nbsp;있음. &lt;br /&gt;-&amp;nbsp;단어간&amp;nbsp;유사도를&amp;nbsp;구할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;임베딩&amp;nbsp;벡터의&amp;nbsp;아이디어는&amp;nbsp;Word2Vec,&amp;nbsp;FastText,&amp;nbsp;Glove&amp;nbsp;등으로&amp;nbsp;발전됨.&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;&lt;br /&gt;4. NNLM의 이점과 한계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1)&amp;nbsp;기존&amp;nbsp;모델에서의&amp;nbsp;개선점 &lt;br /&gt;-&amp;nbsp;&lt;b&gt;단어의&amp;nbsp;유사도를&amp;nbsp;계산&lt;/b&gt;할&amp;nbsp;수&amp;nbsp;있음&amp;nbsp;-&amp;gt;&amp;nbsp;희소&amp;nbsp;문제를&amp;nbsp;해결 &lt;br /&gt;&lt;br /&gt;2)&amp;nbsp;고정된&amp;nbsp;길이의&amp;nbsp;입력(Fixed&amp;nbsp;-&amp;nbsp;length&amp;nbsp;input) &lt;br /&gt;- 다음 단어를 예측하기 위해 모든 이전 단어를 참고하는 것이 아니라 &lt;u&gt;정해진 n개의 단어만을 참고&lt;/u&gt;함 -&amp;gt; 이 한계를&amp;nbsp;&amp;nbsp;극복할 수 있는 언어 모델이 RNN을 사용한 &lt;b&gt;RNN 언어 모델&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;모르는 것만 정리해두고 싶은데, 다 몰라서 거의 다 쓰고 있는 중... 요약 정리를 좀 해봐야겠다  &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;HeartEyesGIF.gif&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj1zwb/btsMRwFCNOr/Jz0dwNMBzk7D2y92z3kwrK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj1zwb/btsMRwFCNOr/Jz0dwNMBzk7D2y92z3kwrK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj1zwb/btsMRwFCNOr/Jz0dwNMBzk7D2y92z3kwrK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bj1zwb/btsMRwFCNOr/Jz0dwNMBzk7D2y92z3kwrK/img.gif&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;220&quot; height=&quot;166&quot; data-filename=&quot;HeartEyesGIF.gif&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다들 좋은 주말보내세요 *^____^*&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/자연어 처리</category>
      <author>빈이즈</author>
      <guid isPermaLink="true">https://binrec.tistory.com/13</guid>
      <comments>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-7-%EB%94%A5-%EB%9F%AC%EB%8B%9DDeep-Learning-%EA%B0%9C%EC%9A%94-2#entry13comment</comments>
      <pubDate>Fri, 21 Mar 2025 16:46:53 +0900</pubDate>
    </item>
    <item>
      <title>[딥러닝을 이용한 자연어 처리 입문] Chapter 7. 딥 러닝(Deep Learning) 개요 (1)</title>
      <link>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-7-%EB%94%A5-%EB%9F%AC%EB%8B%9DDeep-Learning-%EA%B0%9C%EC%9A%94-1</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이 글은 [&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/6876&quot;&gt;유원준&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #808080; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/13671&quot;&gt;상준&lt;/a&gt;]의 [딥러닝을 이용한 자영어 처리 입문]에서 가져온 내용이며, [크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스](&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;a href=&quot;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot;&gt;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&lt;/a&gt;&lt;/span&gt;)에 따라 사용되었습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wikidocs.net/22882&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wikidocs.net/22882&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741068713475&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;07. 딥 러닝(Deep Learning) 개요&quot; data-og-description=&quot;딥 러닝(Deep Learning)은 머신 러닝(Machine Learning)의 특정한 한 분야로서 인공 신경망(Artificial Neural Network)의 층을 연속적으&amp;hellip;&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/22882&quot; data-og-url=&quot;https://wikidocs.net/22882&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ctlGH1/hyYna3KEEu/ViBntUmiw8g2CPToeWDrgk/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130&quot;&gt;&lt;a href=&quot;https://wikidocs.net/22882&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/22882&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ctlGH1/hyYna3KEEu/ViBntUmiw8g2CPToeWDrgk/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;07. 딥 러닝(Deep Learning) 개요&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딥 러닝(Deep Learning)은 머신 러닝(Machine Learning)의 특정한 한 분야로서 인공 신경망(Artificial Neural Network)의 층을 연속적으&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;07. 딥러닝(Dep LEarning)의 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;머신러닝(Machine&amp;nbsp;Learning)의&amp;nbsp;특정한&amp;nbsp;한&amp;nbsp;분야로서&amp;nbsp;인공&amp;nbsp;신경망의&amp;nbsp;층을&amp;nbsp;연속적으로&amp;nbsp;깊게&amp;nbsp;쌓아올려&amp;nbsp;데이터를&amp;nbsp;학습하는&amp;nbsp;방식.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;07-01&amp;nbsp;퍼셉트론&amp;nbsp;(Perceptron) &lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; 퍼셉트론 (Perceptron)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;초기&amp;nbsp;형태의&amp;nbsp;인공&amp;nbsp;신경망으로&amp;nbsp;&lt;u&gt;다수의&amp;nbsp;입력으로부터&amp;nbsp;하나의&amp;nbsp;결과&lt;/u&gt;를&amp;nbsp;내보내는&amp;nbsp;알고리즘.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;x:&amp;nbsp;입력값,&amp;nbsp;w:&amp;nbsp;가중치,&amp;nbsp;y:출력값 &lt;br /&gt;-&amp;nbsp;각각의&amp;nbsp;입력값에는&amp;nbsp;각각의&amp;nbsp;가중치가&amp;nbsp;존재하고&amp;nbsp;가중치&amp;nbsp;값이&amp;nbsp;클수록&amp;nbsp;입력&amp;nbsp;값이&amp;nbsp;중요하다는&amp;nbsp;의미. &lt;br /&gt;-&amp;nbsp;각&amp;nbsp;입력값과&amp;nbsp;가중치가&amp;nbsp;곱해져서&amp;nbsp;인공&amp;nbsp;뉴런에&amp;nbsp;보내지고,&amp;nbsp;각&amp;nbsp;입력값과&amp;nbsp;그에&amp;nbsp;해당하는&amp;nbsp;가중치의&amp;nbsp;곱의&amp;nbsp;전체&amp;nbsp;합이&amp;nbsp;임계치(threshole)를&amp;nbsp;넘으면&amp;nbsp;출력&amp;nbsp;신호로서&amp;nbsp;1을&amp;nbsp;출력,&amp;nbsp;그렇지&amp;nbsp;않은&amp;nbsp;경우&amp;nbsp;0을&amp;nbsp;출력함.&amp;nbsp;이러한&amp;nbsp;함수를&amp;nbsp;계단&amp;nbsp;함수(step&amp;nbsp;function)라고&amp;nbsp;함. &lt;br /&gt;- 활성화함수 : 출력값을 변형시키는 함수.&amp;nbsp; &amp;nbsp;ex. 계단함수, 시그모이드 함수, 소프트맥스 함수, ... &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; 단층 퍼셉트론(Single-Layer Perceptron)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;입력층과&amp;nbsp;출력층으로만&amp;nbsp;이루어짐. &lt;br /&gt;-&amp;nbsp;AND,&amp;nbsp;NAND,&amp;nbsp;OR&amp;nbsp;게이트는&amp;nbsp;구현&amp;nbsp;가능하지만&amp;nbsp;간단한&amp;nbsp;XOR&amp;nbsp;게이트조차도&amp;nbsp;구현할&amp;nbsp;수&amp;nbsp;없다는&amp;nbsp;지적을&amp;nbsp;받아옴. &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;다층&amp;nbsp;퍼셉트론(MultiLayer&amp;nbsp;Perceptron,&amp;nbsp;MLP)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- XOR 게이트는 기존의 AND, NAND, OR 게이트를 조합하면 만들 수 있음. -&amp;gt; 즉 층을 더 쌓으면 만들 수 있다는 것&lt;br /&gt;-&amp;nbsp;입력층,&amp;nbsp;출력층&amp;nbsp;그리고&amp;nbsp;1개&amp;nbsp;이상의&amp;nbsp;은닉층이&amp;nbsp;존재함.&amp;nbsp;(은닉층이&amp;nbsp;2개&amp;nbsp;이상인&amp;nbsp;신경망을&amp;nbsp;심층&amp;nbsp;신경망이라고&amp;nbsp;함.) &lt;br /&gt;-&amp;nbsp;심층&amp;nbsp;신경망을&amp;nbsp;학습시키는&amp;nbsp;것이&amp;nbsp;&lt;b&gt;딥러닝(Deep&amp;nbsp;Learning)&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;07-02&amp;nbsp;인공&amp;nbsp;신경망(Artificial&amp;nbsp;Neural&amp;nbsp;Network)&amp;nbsp;훑어보기 &lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; 피드 포워드 신경망(Feed-Forward Neural Network, FFNN)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;순방향&amp;nbsp;신경망이라고도&amp;nbsp;함. &lt;br /&gt;-&amp;nbsp;오직&amp;nbsp;입력층에서&amp;nbsp;출력층&amp;nbsp;방향으로&amp;nbsp;연산이&amp;nbsp;전개되는&amp;nbsp;신경망. &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;전결합층(Fully-connected&amp;nbsp;layer,&amp;nbsp;FC,&amp;nbsp;Dense&amp;nbsp;layer)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전결합층/완전연결층 : 어떤 층의 &lt;u&gt;모든 뉴런이 이전 층의 모든 뉴런과 연결&lt;/u&gt;돼 있는 층.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. 다층 퍼셉트론은 은닉층과 출력층에 있는 모든 뉴런은 바로 이전 층의 모든 뉴련과 연결돼 있음 -&amp;gt; 모든 은닉층과 출력층은 전결합층 (=밀집층, Dense layer) &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; 활성화 함수 (Activation Function)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;활성화함수&amp;nbsp;:&amp;nbsp;은닉층과&amp;nbsp;출력층의&amp;nbsp;뉴런에서&amp;nbsp;출력값을&amp;nbsp;결정하는&amp;nbsp;함수&amp;nbsp; &lt;br /&gt;-&amp;nbsp;&lt;b&gt;특징&amp;nbsp;1.&amp;nbsp;비선형&amp;nbsp;함수&amp;nbsp;&lt;/b&gt;:&amp;nbsp;선형&amp;nbsp;함수를&amp;nbsp;선택하면&amp;nbsp;은닉층을&amp;nbsp;쌓을&amp;nbsp;수&amp;nbsp;없음.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;활성화&amp;nbsp;함수가&amp;nbsp;존재하지&amp;nbsp;않는&amp;nbsp;선형&amp;nbsp;함수&amp;nbsp;층을&amp;nbsp;사용하지&amp;nbsp;않는다는&amp;nbsp;의미는&amp;nbsp;아님.&amp;nbsp;종종&amp;nbsp;일부&amp;nbsp;추가하는&amp;nbsp;경우도&amp;nbsp;있음&amp;nbsp;-&amp;gt;&amp;nbsp;학습&amp;nbsp;가능한&amp;nbsp;가중치가&amp;nbsp;새로&amp;nbsp;생긴다는&amp;nbsp;점에서&amp;nbsp;의미&amp;nbsp;있음 &lt;br /&gt;-&amp;nbsp;&lt;u&gt;선형&amp;nbsp;함수를&amp;nbsp;사용한&amp;nbsp;층&lt;/u&gt;을&amp;nbsp;활성화&amp;nbsp;함수를&amp;nbsp;사용하는&amp;nbsp;은닉층과&amp;nbsp;구분하기&amp;nbsp;위해&amp;nbsp;이&amp;nbsp;책에서는&amp;nbsp;&lt;u&gt;선형층(linear&amp;nbsp;layer)&amp;nbsp;혹은&amp;nbsp;투사층&lt;/u&gt;(projection&amp;nbsp;layer)&amp;nbsp;등의&amp;nbsp;다른&amp;nbsp;표현을&amp;nbsp;사용. &lt;br /&gt;-&amp;nbsp;&lt;b&gt;활성화함수&amp;nbsp;종류1.&amp;nbsp;계단함수&lt;/b&gt;&amp;nbsp;:&amp;nbsp;거의&amp;nbsp;사용되지&amp;nbsp;않음 &lt;br /&gt;-&amp;nbsp;&amp;nbsp;인공&amp;nbsp;신경망의&amp;nbsp;학습&amp;nbsp;과정&amp;nbsp;:&amp;nbsp;&lt;u&gt;입력에&amp;nbsp;대해&amp;nbsp;순전파&amp;nbsp;연산&lt;/u&gt; -&amp;gt;&amp;nbsp;연산을&amp;nbsp;통해&amp;nbsp;나온&amp;nbsp;예측값과&amp;nbsp;실제값의&amp;nbsp;&lt;u&gt;오차를&amp;nbsp;손실&amp;nbsp;함수 (loss&amp;nbsp;function)을&amp;nbsp;통해&amp;nbsp;계산&lt;/u&gt;&amp;nbsp;-&amp;gt;&amp;nbsp;이&amp;nbsp;손실(=오차)을&amp;nbsp;미분을&amp;nbsp;통해&amp;nbsp;기울기(gradient)&amp;nbsp;구함&amp;nbsp;-&amp;gt;&amp;nbsp;출력층에서&amp;nbsp;입력층&amp;nbsp;방향으로&amp;nbsp;가중치와&amp;nbsp;편향을&amp;nbsp;업데이트&amp;nbsp;(&lt;u&gt;역전파&amp;nbsp;수행&lt;/u&gt;&amp;nbsp;:&amp;nbsp;경사&amp;nbsp;하강법&amp;nbsp;사용) &lt;br /&gt;-&amp;nbsp;&lt;b&gt;활성화함수&amp;nbsp;종류2.&amp;nbsp;시그모이드&amp;nbsp;함수&lt;/b&gt;&amp;nbsp;(Sigmoid&amp;nbsp;function)&amp;nbsp;:&amp;nbsp;s자&amp;nbsp;곡선.&amp;nbsp;&lt;u&gt;출력값이&amp;nbsp;0&amp;nbsp;또는&amp;nbsp;1에&amp;nbsp;가까워지면,&amp;nbsp;그래프의&amp;nbsp;기울기가&amp;nbsp;완만해짐&lt;/u&gt;&amp;nbsp;-&amp;gt;&amp;nbsp;미분값이&amp;nbsp;0에&amp;nbsp;가까운&amp;nbsp;아주&amp;nbsp;작은&amp;nbsp;값.&amp;nbsp;&amp;nbsp;(0.5에서의&amp;nbsp;미분값은&amp;nbsp;0.25)&amp;nbsp;-&amp;gt;&amp;nbsp;미분값은&amp;nbsp;0.25이하의&amp;nbsp;값을&amp;nbsp;가짐&amp;nbsp;-&amp;gt;&amp;nbsp;시그모이드&amp;nbsp;함수를&amp;nbsp;활성화&amp;nbsp;함수로&amp;nbsp;하는&amp;nbsp;&lt;u&gt;인공&amp;nbsp;신경망의&amp;nbsp;층을&amp;nbsp;쌓으면&lt;/u&gt;,&amp;nbsp;가중치와&amp;nbsp;편향을&amp;nbsp;업데이트하는&lt;u&gt;&amp;nbsp;역전파&amp;nbsp;과정에서&amp;nbsp;0에&amp;nbsp;가까운&amp;nbsp;값이&amp;nbsp;누적해서&amp;nbsp;곱해지게&amp;nbsp;됨&amp;nbsp;&lt;/u&gt;-&amp;gt;&amp;nbsp;앞단(앞의&amp;nbsp;층)에는&amp;nbsp;기울기(미분값)가&amp;nbsp;잘&amp;nbsp;전달되자&amp;nbsp;않음&amp;nbsp;(=&lt;b&gt;기울기&amp;nbsp;소실&amp;nbsp;문제&lt;/b&gt;) &lt;br /&gt;=&amp;gt;&amp;nbsp;시그모이드&amp;nbsp;함수의&amp;nbsp;&lt;u&gt;은닉층에서의&amp;nbsp;사용은&amp;nbsp;지양&lt;/u&gt;됨.&amp;nbsp;주로&amp;nbsp;이&lt;b&gt;진&amp;nbsp;분류를&amp;nbsp;위해&amp;nbsp;출력층에서&amp;nbsp;사용&lt;/b&gt;함. &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&lt;b&gt;활성화함수&amp;nbsp;종류3.&amp;nbsp;하이퍼볼릭탄젠트&amp;nbsp;함수&lt;/b&gt;&amp;nbsp;(Hyperbolic&amp;nbsp;tangent&amp;nbsp;function)&amp;nbsp;:&amp;nbsp;함수(tanh)는&amp;nbsp;&lt;u&gt;입력값을&amp;nbsp;-1과&amp;nbsp;1&amp;nbsp;사이의&amp;nbsp;값&lt;/u&gt;으로&amp;nbsp;변환함.&amp;nbsp;-&amp;gt;&amp;nbsp;시그모이드와&amp;nbsp;비슷한&amp;nbsp;모양으로&amp;nbsp;-1과&amp;nbsp;1에&amp;nbsp;가까운&amp;nbsp;출력값은&amp;nbsp;기울기가&amp;nbsp;0에&amp;nbsp;가까움.&amp;nbsp;그러나&amp;nbsp;시그모이드&amp;nbsp;함수와&amp;nbsp;달리&amp;nbsp;0을&amp;nbsp;중심으로&amp;nbsp;하고&amp;nbsp;있으며,&amp;nbsp;하이퍼볼릭탄젠트&amp;nbsp;함수를&amp;nbsp;미분했을&amp;nbsp;때의&amp;nbsp;최대값을&amp;nbsp;1로&amp;nbsp;시그모이드&amp;nbsp;함수의&amp;nbsp;최대값&amp;nbsp;0.25보다는&amp;nbsp;큼.&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;u&gt;미분했을&amp;nbsp;때&amp;nbsp;시그모이드&amp;nbsp;함수보다는&amp;nbsp;전반적으로&amp;nbsp;큰&amp;nbsp;값이&amp;nbsp;나오게&amp;nbsp;됨.&lt;/u&gt;&amp;nbsp;=&amp;gt;&amp;nbsp;시그모이드&amp;nbsp;함수보다&amp;nbsp;기울기&amp;nbsp;소실&amp;nbsp;이&amp;nbsp;적은&amp;nbsp;편이고&amp;nbsp;&lt;u&gt;은닉층에서&amp;nbsp;시그모이드&amp;nbsp;함수보다는&amp;nbsp;선호됨&lt;/u&gt; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&lt;b&gt;활성화함수&amp;nbsp;종류4.&amp;nbsp;렐루&amp;nbsp;함수&amp;nbsp;(ReLU)&amp;nbsp;&lt;/b&gt;:&amp;nbsp;&lt;u&gt;은닉층에서&amp;nbsp;가장&amp;nbsp;인기있는&amp;nbsp;함수&lt;/u&gt;.&amp;nbsp;f(x)&amp;nbsp;=&amp;nbsp;&lt;b&gt;max(0,x)&amp;nbsp;&lt;/b&gt;수식&amp;nbsp;-&amp;gt;&lt;u&gt;&amp;nbsp;음수를&amp;nbsp;입력하면&amp;nbsp;0을,&amp;nbsp;양수를&amp;nbsp;입력하면&amp;nbsp;입력값&amp;nbsp;그대로를&amp;nbsp;출력&lt;/u&gt;하는&amp;nbsp;것이&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;특징.&lt;u&gt;&amp;nbsp;0&amp;nbsp;이상의&amp;nbsp;입력값의&amp;nbsp;경우&amp;nbsp;미분&amp;nbsp;값이&amp;nbsp;항상&amp;nbsp;1.&lt;/u&gt;&amp;nbsp;깊은&amp;nbsp;신경망의&amp;nbsp;은닉층에서&amp;nbsp;시그모이드&amp;nbsp;함수보다&amp;nbsp;훨씬&amp;nbsp;더&amp;nbsp;잘&amp;nbsp;작동함.&amp;nbsp;단순해서&amp;nbsp;연산&amp;nbsp;속도도&amp;nbsp;빠름.&amp;nbsp;BUT&amp;nbsp;문제점&amp;nbsp;:&amp;nbsp;&lt;b&gt;입력값이&amp;nbsp;음수면&amp;nbsp;기울기(=&amp;nbsp;미분값)도&amp;nbsp;0이&amp;nbsp;됨&lt;/b&gt;.&amp;nbsp;이&amp;nbsp;뉴런은&amp;nbsp;다시&amp;nbsp;회생하는&amp;nbsp;것이&amp;nbsp;매우&amp;nbsp;어려움.&amp;nbsp;-&amp;gt;&amp;nbsp;이&amp;nbsp;문제를&lt;b&gt;&amp;nbsp;죽은&amp;nbsp;렐루&lt;/b&gt;(dying&amp;nbsp;ReLU)라고&amp;nbsp;함. &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&lt;b&gt;활성화함수&amp;nbsp;종류&amp;nbsp;5.&amp;nbsp;리키&amp;nbsp;렐루(Leaky&amp;nbsp;ReLU)&amp;nbsp;&lt;/b&gt;:&amp;nbsp;죽은&amp;nbsp;렐루를&amp;nbsp;보완하기&amp;nbsp;위해&amp;nbsp;ReLU의&amp;nbsp;변형&amp;nbsp;함수들이&amp;nbsp;등장하기&amp;nbsp;시작.&amp;nbsp;그&amp;nbsp;중&amp;nbsp;하나가&amp;nbsp;Leaky&amp;nbsp;ReLU.&amp;nbsp;&lt;u&gt;입력값이&amp;nbsp;음수&amp;nbsp;일&amp;nbsp;경우에&amp;nbsp;0이&amp;nbsp;아니라&amp;nbsp;0.001과&amp;nbsp;같은&amp;nbsp;매우&amp;nbsp;작은&amp;nbsp;수를&amp;nbsp;반환&lt;/u&gt;하도록&amp;nbsp;되어있음.&amp;nbsp;수식은&amp;nbsp;f(x)&amp;nbsp;=&amp;nbsp;max(ax,&amp;nbsp;x).&lt;u&gt;&amp;nbsp;a는&amp;nbsp;하이퍼파라미터로&amp;nbsp;Leaky('새는')&amp;nbsp;정도&lt;/u&gt;를&amp;nbsp;결정하며&amp;nbsp;&lt;u&gt;일반적으로는&amp;nbsp;0.01&amp;nbsp;&lt;/u&gt;값을&amp;nbsp;가짐.&amp;nbsp;여기서&amp;nbsp;'새는&amp;nbsp;정도'는&amp;nbsp;입력값이&amp;nbsp;음수일&amp;nbsp;때의&amp;nbsp;기울기를&amp;nbsp;비유함.&amp;nbsp;=&amp;gt;&amp;nbsp;입력값이&amp;nbsp;음수라도&amp;nbsp;기울기가&amp;nbsp;0이&amp;nbsp;되지&amp;nbsp;않음 &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&lt;b&gt;활성화함수&amp;nbsp;종류&amp;nbsp;6.&amp;nbsp;소프트맥스&amp;nbsp;함수(softmax&amp;nbsp;function)&lt;/b&gt;&amp;nbsp;:&amp;nbsp;은닉층에서는&amp;nbsp;ReLU를&amp;nbsp;사용하는&amp;nbsp;것이&amp;nbsp;일반적고,&amp;nbsp;소프트맥스&amp;nbsp;함수는&amp;nbsp;시그모이드&amp;nbsp;함수처럼&amp;nbsp;&lt;u&gt;출력층에서&amp;nbsp;주로&amp;nbsp;쓰임&lt;/u&gt;.&amp;nbsp;시그모이드&amp;nbsp;함수가&amp;nbsp;이진&amp;nbsp;분류에&amp;nbsp;사용된다면&amp;nbsp;소프트맥스&amp;nbsp;함수는&amp;nbsp;세가지&amp;nbsp;이상의&amp;nbsp;상호&amp;nbsp;배타적인&amp;nbsp;선택지&amp;nbsp;중&amp;nbsp;하나를&amp;nbsp;고르는&amp;nbsp;&lt;b&gt;다중&amp;nbsp;클래스&amp;nbsp;분류문제에&amp;nbsp;주로&amp;nbsp;사용됨&lt;/b&gt;. &lt;br /&gt;=&amp;gt;&amp;nbsp;딥&amp;nbsp;러닝으로&lt;u&gt;&amp;nbsp;이진&amp;nbsp;분류를&amp;nbsp;할&amp;nbsp;때는&amp;nbsp;출력층에&amp;nbsp;앞서&amp;nbsp;배운&amp;nbsp;로지스틱&amp;nbsp;회귀를&lt;/u&gt;&amp;nbsp;사용하고,&amp;nbsp;딥러닝으로&lt;u&gt;&amp;nbsp;다중&amp;nbsp;클래스&amp;nbsp;분류&amp;nbsp;문제를&amp;nbsp;풀&amp;nbsp;때는&amp;nbsp;출력층에&amp;nbsp;소프트맥스&amp;nbsp;회귀를&lt;/u&gt; 사용한다고 생각할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;07-03 행렬곱으로 이해하는 신경망&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 신경망의 순전파는 결과적으로 행렬의 곱셈으로 이해할 수 있다는 것과 다층 퍼셉트론 내의 학습 가능한 &lt;b&gt;매개변수인 가중치 w와 편향 b의 개수를 추정&lt;/b&gt;하는 방법에 대해서 학습 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;nbsp;순전파(Forward&amp;nbsp;Propagation)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력값은 입력층, 은닉층을 지나면서 각 층에서의 가중치와 함께 연산되며 출력층으로 향함. 입력층에서 출력층 방향으로 예측값의 연산이 진행되는 과정을 순전파라고 함. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;nbsp;행렬곱으로&amp;nbsp;순전파&amp;nbsp;이해하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(코드예시 : 입력의 차원이 3, 출력의 차원이 2인 인공신경망 구현)&lt;/p&gt;
&lt;pre id=&quot;code_1741069832277&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential()
model.add(Dense(2, input_dim=3, activation = 'softmax'))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;u&gt;입력층의 뉴런이 3개, 출력층의 뉴런이 2개&lt;/u&gt;. 입력층에서 출력층으로 갈때 가중치&lt;u&gt; w의 개수는 6개&lt;/u&gt;가 됨. &lt;br /&gt;-&amp;nbsp;이를&amp;nbsp;행렬곱&amp;nbsp;관점에서는&amp;nbsp;3차원&amp;nbsp;벡터에서&amp;nbsp;2차원&amp;nbsp;벡터가&amp;nbsp;되기&amp;nbsp;위해서&amp;nbsp;3X2&amp;nbsp;행렬을&amp;nbsp;곱했다고&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있고,&amp;nbsp;각각의&amp;nbsp;원소가&amp;nbsp;각각의&amp;nbsp;w가&amp;nbsp;되는&amp;nbsp;것.&amp;nbsp;편향&amp;nbsp;b의&amp;nbsp;개수는&amp;nbsp;항상&amp;nbsp;출력의&amp;nbsp;차원을&amp;nbsp;기준으로&amp;nbsp;개수를&amp;nbsp;확인하면&amp;nbsp;됨&amp;nbsp;(=&amp;gt;&amp;nbsp;이&amp;nbsp;경우&amp;nbsp;2개) &lt;br /&gt;-&amp;nbsp;가중치&amp;nbsp;w가&amp;nbsp;6개,&amp;nbsp;편향&amp;nbsp;b가&amp;nbsp;2개&amp;nbsp;총&amp;nbsp;매개변수가&amp;nbsp;8개가&amp;nbsp;됨 &lt;br /&gt;-&amp;nbsp;&lt;b&gt;수식&amp;nbsp;:&amp;nbsp;Y&amp;nbsp;=&amp;nbsp;XW&amp;nbsp;+&amp;nbsp;B&lt;/b&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;행렬곱으로&amp;nbsp;병렬&amp;nbsp;연산&amp;nbsp;이해하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인공 신경망을 행렬곱으로 구현할 때 흥미로운 점은 병렬 연산도 가능하다는 점. (한번에 여러개의 샘플을 동시에 처리할 수 있음) &lt;br /&gt;-&amp;nbsp;여기서&amp;nbsp;혼동하지&amp;nbsp;말아야&amp;nbsp;할&amp;nbsp;점은&amp;nbsp;학습가능한&amp;nbsp;매개변수의&amp;nbsp;수는&amp;nbsp;여전히&amp;nbsp;8개라는&amp;nbsp;점. &lt;br /&gt;-&amp;nbsp;인공신경망이&amp;nbsp;&lt;u&gt;다수의&amp;nbsp;샘플을&amp;nbsp;동시에&amp;nbsp;처리&lt;/u&gt;하는&amp;nbsp;것을&lt;u&gt;&amp;nbsp;'배치&amp;nbsp;연산'&lt;/u&gt;이라고&amp;nbsp;함 &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;행렬곱으로&amp;nbsp;다층&amp;nbsp;퍼셉트론의&amp;nbsp;순전파&amp;nbsp;이해하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이런 인공신경망을 만들어보자 : 입력층(4개의 입력과 8개의 출력), 은닉층1(8개의 입력과 8개의 출력), 은닉층2(8개의 입력과 3개의 출력), 출력층(3개의 입력과 3개의 출력) &lt;br /&gt;- 코드 :&lt;/p&gt;
&lt;pre id=&quot;code_1741069974788&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential()
model.add(Dense(8, imput_dim=4,activaion='relu'))
model.add(Dense(8, activation = 'relu')
model.add(Dense(3, activation = 'softmax'))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 위의 정보를 가지고 층마다 생기는 가중치와 편향 행렬의 크기를 추정해보자. 단 배치 크기는 1을 가정함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;1)&amp;nbsp;입력층&amp;nbsp;=&amp;gt;&amp;nbsp;은닉층1&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&amp;nbsp;입력층(4개의&amp;nbsp;입력과&amp;nbsp;8개의&amp;nbsp;출력),&amp;nbsp;은닉층1(8개의&amp;nbsp;입력과&amp;nbsp;8개의&amp;nbsp;출력), &lt;br /&gt;-&amp;nbsp;XW&amp;nbsp;+&amp;nbsp;B&amp;nbsp;=&amp;nbsp;Y&amp;nbsp;&amp;nbsp;(X:&amp;nbsp;입력행렬,&amp;nbsp;W&amp;nbsp;:&amp;nbsp;가중치행렬,&amp;nbsp;B&amp;nbsp;:&amp;nbsp;편향행렬,&amp;nbsp;Y&amp;nbsp;:&amp;nbsp;출력행렬) &lt;br /&gt;- 입력행렬 &lt;u&gt;X의 크기는 1 X 4&lt;/u&gt;이고, 은닉층1의 출력은 8개 이므로, 출력행렬&lt;u&gt; Y의 크기는 1 X 8.&lt;/u&gt; &lt;br /&gt;- 편향 행렬 B의 크기는 출력행렬 Y의 크기와 같음 =&amp;gt; 1 X 8 &lt;br /&gt;- 가중치 행렬 W의 행의 크기는 X의 열의 크기와 같아야 하고, 열은 출력행렬과 같아야 함 =&amp;gt; 4 X 8. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;2)&amp;nbsp;은닉층1&amp;nbsp;=&amp;gt;&amp;nbsp;은닉층2&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&amp;nbsp;은닉층1(8개의&amp;nbsp;입력과&amp;nbsp;8개의&amp;nbsp;출력),&amp;nbsp;은닉층2(8개의&amp;nbsp;입력과&amp;nbsp;3개의&amp;nbsp;출력) &lt;br /&gt;-&amp;nbsp;위의&amp;nbsp;Y가&amp;nbsp;여기서는&amp;nbsp;X가&amp;nbsp;됨 &lt;br /&gt;-&amp;nbsp;X1x8&amp;nbsp;&amp;nbsp;X&amp;nbsp;&amp;nbsp;W8x8&amp;nbsp;+&amp;nbsp;B1x8&amp;nbsp;=&amp;nbsp;Y1x8 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;3)&amp;nbsp;은닉층2&amp;nbsp;=&amp;gt;&amp;nbsp;은닉층3 &lt;/b&gt;&lt;br /&gt;-&amp;nbsp;출력행렬&amp;nbsp;Y는&amp;nbsp;은닉층3에서는&amp;nbsp;입력행렬&amp;nbsp;X로&amp;nbsp;다시&amp;nbsp;명명. &lt;br /&gt;-&amp;nbsp;X1x8&amp;nbsp;&amp;nbsp;X&amp;nbsp;&amp;nbsp;W8x3&amp;nbsp;+&amp;nbsp;B1x3&amp;nbsp;=&amp;nbsp;Y1x3 &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;은닉층과&amp;nbsp;출력층에&amp;nbsp;활성화&amp;nbsp;함수&amp;nbsp;relu와&amp;nbsp;softmax가&amp;nbsp;존재하지만&amp;nbsp;행렬의&amp;nbsp;크기에&amp;nbsp;영향을&amp;nbsp;주지&amp;nbsp;않음 &lt;br /&gt;-&amp;nbsp;이와&amp;nbsp;같이&lt;u&gt;&amp;nbsp;순전파를&amp;nbsp;진행하고&amp;nbsp;예측값을&amp;nbsp;구하고&lt;/u&gt;나서&amp;nbsp;인공&amp;nbsp;신경망이&amp;nbsp;해야할&amp;nbsp;일은&amp;nbsp;예측값과&amp;nbsp;실제값으로부터&amp;nbsp;&lt;u&gt;오차를&amp;nbsp;계산&lt;/u&gt;하고,&amp;nbsp;&lt;u&gt;오차로부터&amp;nbsp;가중치와&amp;nbsp;편향을&amp;nbsp;업데이트&lt;/u&gt;&amp;nbsp;하는&amp;nbsp;일.&amp;nbsp;=&amp;gt;&amp;nbsp;인공신경망의&amp;nbsp;학습&amp;nbsp;단계 &lt;br /&gt;-&amp;nbsp;이때&amp;nbsp;인공신경망은&amp;nbsp;순전파와는&amp;nbsp;반대&amp;nbsp;방향으로&amp;nbsp;연산을&amp;nbsp;진행하며&amp;nbsp;가중치를&amp;nbsp;업데이트하는데&amp;nbsp;이&amp;nbsp;과정을&amp;nbsp;&lt;b&gt;역전파(BackPropagation)&lt;/b&gt;라고&amp;nbsp;함. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;07-04&amp;nbsp;딥&amp;nbsp;러닝의&amp;nbsp;학습&amp;nbsp;방법&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 손실 함수 (Loss function)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;u&gt;실제값과 예측값의 차이를 수치화해주는 함수&lt;/u&gt;. 오차가 클수록 손실 함수의 값은 커짐.&amp;nbsp; &lt;br /&gt;- &lt;b&gt;회귀에서는 평균 제곱 오차, 분류에서는 크로스 엔트로피&lt;/b&gt;를 주로 사용함. &lt;br /&gt;- 손실함수의 값을 최소화하는 두 개의 매개변수인 가중치 w와 편향 b를 찾는 것이 딥 러닝의 학습 과정이므로 손실 함수의 선정은 매우 중요함. &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; MSE( Mean Squared Error, MSE)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;평균&amp;nbsp;제곱&amp;nbsp;오차.&amp;nbsp;연속형&amp;nbsp;변수를&amp;nbsp;예측할&amp;nbsp;때&amp;nbsp;사용됨. &lt;br /&gt;-&amp;nbsp;compile의&amp;nbsp;loss에&amp;nbsp;문자열&amp;nbsp;'mse'라고&amp;nbsp;기재하거나&amp;nbsp;tf.keras.losses를&amp;nbsp;활용할&amp;nbsp;수도&amp;nbsp;있음 &lt;br /&gt;- 코드 :&lt;/p&gt;
&lt;pre id=&quot;code_1741074205128&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.compile(optimizer = 'adam', loss = 'mse', metrics = ['mse'])
model.compile(optimizer = 'adam', loss = tf.keras.losses.MeanSquareError(), metrics = ['mse'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;이진&amp;nbsp;크로스&amp;nbsp;엔트로피&amp;nbsp;(Binary&amp;nbsp;Cross-Entropy)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 출력층에서 &lt;b&gt;시그모이드 함수&lt;/b&gt;를 사용하는 &lt;b&gt;이진 분류&lt;/b&gt; (Binary Classification)의 경우 &lt;u&gt;binary_crossentropy&lt;/u&gt;를 사용. compile의 loss에 문자열로 'binary_crossentropy'를 기재하면 됨. &lt;br /&gt;- 코드:&lt;/p&gt;
&lt;pre id=&quot;code_1741074231443&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.compile(loss='binary_crossentropy', optimizer= 'adam', metrics = ['acc'])
model.compile(loss = tf.keras.losses.BinaryCrossentropy(), optiizer = 'adam', metrics = ['acc'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;카테고리칼&amp;nbsp;크소르&amp;nbsp;엔트로피&amp;nbsp;(Categorical&amp;nbsp;Cross-Entropy)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 출력층에서 소프트맥스 함수를 사용하는 다중 클래스 분류(Multi-Class Classification)일 경우 categorical_crossentropy'를 기재해주면 됨.&amp;nbsp;&amp;nbsp;compile의 loss에 문자열로 'categorical_crossentropy'를 기재해주면 됨. &lt;br /&gt;- 코드 :&lt;/p&gt;
&lt;pre id=&quot;code_1741074271578&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['acc'])
model.compile(loss=tf.keras.losses.CategoricalCrossentropy(), optimizer = 'adam', metrics=['acc'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;만약&amp;nbsp;레이블에&amp;nbsp;대해서&amp;nbsp;원-핫&amp;nbsp;인코딩&amp;nbsp;과정을&amp;nbsp;생략하고&amp;nbsp;&lt;u&gt;정수값을&amp;nbsp;가진&amp;nbsp;레이블에&amp;nbsp;대해서&amp;nbsp;다중&amp;nbsp;클래스&amp;nbsp;분류를&amp;nbsp;수행하고&amp;nbsp;싶다면&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;'sparse_categorical_crossentropy'&lt;/u&gt;를&amp;nbsp;사용 &lt;br /&gt;- 코드:&lt;/p&gt;
&lt;pre id=&quot;code_1741074294735&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['acc'])
model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(), optimizer='adam', metrics=['acc'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;2.&amp;nbsp;배치&amp;nbsp;크기(Batch&amp;nbsp;Size)에&amp;nbsp;따른&amp;nbsp;경사&amp;nbsp;하강법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 손실함수의 값을 줄여나가면서 학습하는 방법은 어떤 옵티마이저를 사용하느냐에 따라 달라짐. &lt;br /&gt;-&amp;nbsp;&lt;b&gt;배치&amp;nbsp;&lt;/b&gt;:&amp;nbsp;&amp;nbsp;가중치&amp;nbsp;등의&amp;nbsp;매개변수의&amp;nbsp;값을&amp;nbsp;조정하기&amp;nbsp;위해&amp;nbsp;사용하는&amp;nbsp;&lt;u&gt;데이터의&amp;nbsp;양&lt;/u&gt;을&amp;nbsp;말함. &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; &lt;b&gt;배치 경사 하강법&lt;/b&gt;(Batch Gradient Descent)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;옵티마이저&amp;nbsp;중&amp;nbsp;하나로&amp;nbsp;오차(loss)를&amp;nbsp;구할&amp;nbsp;때&amp;nbsp;전체&amp;nbsp;데이터를&amp;nbsp;고려&amp;nbsp;-&amp;gt;&amp;nbsp;한&amp;nbsp;번의&amp;nbsp;매개&amp;nbsp;변수&amp;nbsp;업데이트에&amp;nbsp;시간이&amp;nbsp;오래&amp;nbsp;걸리고&amp;nbsp;메모리를&amp;nbsp;크게&amp;nbsp;요구한다는&amp;nbsp;단점을&amp;nbsp;가짐. &lt;br /&gt;-&amp;nbsp;한&amp;nbsp;번의&amp;nbsp;훈련&amp;nbsp;횟수를&amp;nbsp;1&amp;nbsp;에포크라고&amp;nbsp;하는데,&amp;nbsp;배치&amp;nbsp;경사&amp;nbsp;하강법은&amp;nbsp;&lt;u&gt;한&amp;nbsp;번의&amp;nbsp;에포크에&amp;nbsp;모든&amp;nbsp;매개변수&amp;nbsp;업데이트를&amp;nbsp;단&amp;nbsp;한&amp;nbsp;번&amp;nbsp;수행&lt;/u&gt;.&amp;nbsp; &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;배치&amp;nbsp;크기가&amp;nbsp;1인 확률적 경사 하강법 (Stochastic Gradient Descent, SGD)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;매개&amp;nbsp;변수의&amp;nbsp;값을&amp;nbsp;조정&amp;nbsp;시&amp;nbsp;전체&amp;nbsp;데이터가&amp;nbsp;아닌&amp;nbsp;&lt;u&gt;랜덤으로&amp;nbsp;선택한&amp;nbsp;하나의&amp;nbsp;데이터에&amp;nbsp;대해서만&amp;nbsp;계산하는&amp;nbsp;방법&lt;/u&gt;. &lt;br /&gt;-&amp;nbsp;적은&amp;nbsp;데이터&amp;nbsp;사용&amp;nbsp;-&amp;gt;&amp;nbsp;빠른&amp;nbsp;계산 &lt;br /&gt;-&amp;nbsp;매개변수의&amp;nbsp;변경폭이&amp;nbsp;불안정하고&amp;nbsp;배치&amp;nbsp;경사&amp;nbsp;하강법보다&amp;nbsp;&lt;u&gt;정확도가&amp;nbsp;낮을&amp;nbsp;수도&amp;nbsp;있지만&lt;/u&gt;,&amp;nbsp;하나의&amp;nbsp;데이터에&amp;nbsp;대해서만&amp;nbsp;메모리에&amp;nbsp;저장하므로&amp;nbsp;&lt;u&gt;자원이&amp;nbsp;적은&amp;nbsp;컴퓨터에서도&amp;nbsp;쉽게&amp;nbsp;사용&amp;nbsp;가능&lt;/u&gt;. &lt;br /&gt;- 코드:&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741074478409&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.filt(trani_X, train_y, batch_size=1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;미니&amp;nbsp;배치&amp;nbsp;경사&amp;nbsp;하강법&amp;nbsp;(Mini-Batch&amp;nbsp;Gradient&amp;nbsp;Descent)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전체 데이터도, 1개의 데이터도 아닐 때, &lt;u&gt;배치 크기를 지정하여 해당 데이터 개수만큼에 대해서 계산하여 매개 변수의 값을 조정&lt;/u&gt;하는 경사 하강법. &lt;br /&gt;-&amp;nbsp;전체&amp;nbsp;데이터를&amp;nbsp;계산하는&amp;nbsp;것보다&amp;nbsp;빠르고,&amp;nbsp;SGD보다&amp;nbsp;안정적이라는&amp;nbsp;장점을&amp;nbsp;가짐. &lt;br /&gt;-&amp;nbsp;배치&amp;nbsp;크기는&amp;nbsp;일반적으로&amp;nbsp;&lt;u&gt;2의&amp;nbsp;n제곱에&amp;nbsp;해당하는&amp;nbsp;숫자로&amp;nbsp;선택하는&amp;nbsp;것이&amp;nbsp;보편적&lt;/u&gt;임. &lt;br /&gt;-&amp;nbsp;만약,&amp;nbsp;model_fit()에서&amp;nbsp;배치&amp;nbsp;크기를&amp;nbsp;별도로&amp;nbsp;지정해주지&amp;nbsp;않을&amp;nbsp;경우&amp;nbsp;&lt;u&gt;기본값은&amp;nbsp;2의&amp;nbsp;5제곱에&amp;nbsp;해당하는&amp;nbsp;숫자&amp;nbsp;32&lt;/u&gt;로&amp;nbsp;설정. &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;&lt;br /&gt;3. 옵티마이저(Optimizer)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; 모멘텀(Momentum)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;u&gt;관성&lt;/u&gt;이라는&amp;nbsp;물리학의&amp;nbsp;법칙을&amp;nbsp;응용한&amp;nbsp;방법.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;경사&amp;nbsp;하강법에서&amp;nbsp;계산된&amp;nbsp;접선의&amp;nbsp;기울기에&amp;nbsp;&lt;u&gt;한&amp;nbsp;시점&amp;nbsp;전의&amp;nbsp;접선의&amp;nbsp;기울기값을&amp;nbsp;일정한&amp;nbsp;비율만큼&amp;nbsp;반영&lt;/u&gt;&amp;nbsp;=&amp;gt;&amp;nbsp;마치&amp;nbsp;언덕에서&amp;nbsp;공이&amp;nbsp;내려올&amp;nbsp;때,&amp;nbsp;중간에&amp;nbsp;작은&amp;nbsp;웅덩이(ex.&amp;nbsp;극값)에&amp;nbsp;빠지더라도&amp;nbsp;관성의&amp;nbsp;힘으로&amp;nbsp;넘어서는&amp;nbsp;효과를&amp;nbsp;줄&amp;nbsp;수&amp;nbsp;있음.&amp;nbsp; &lt;br /&gt;- 코드:&lt;/p&gt;
&lt;pre id=&quot;code_1741074554969&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tf.keras.optimizers.SGD(lr=0.01, momentum=0.9)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; 아다그리드(Adagrard)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;u&gt;각&amp;nbsp;매개변수에&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;학습률을&amp;nbsp;적용&lt;/u&gt;시킴.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;변화가&amp;nbsp;많은&amp;nbsp;매개변수는&amp;nbsp;학습률이&amp;nbsp;작게&amp;nbsp;설정되고&amp;nbsp;변화가&amp;nbsp;적은&amp;nbsp;매개변수는&amp;nbsp;학습률을&amp;nbsp;높게&amp;nbsp;설정함. &lt;br /&gt;- 코드:&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741074576920&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tf.keras.optimizers.Adagrad(lr=0.01, epsilon=1e-6)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;알엠에스프롭(RMSprop)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;u&gt; Adagrad는 학습을 계속 진행한 경우에는 나중에 학습률이 지나치게 떨어진다는 단점&lt;/u&gt;이 있는데 &lt;b&gt;이를 다른 수식에 대체하여 이러한 단점을 개선.&lt;/b&gt; &lt;br /&gt;- 코드:&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741074608784&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tf.keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;nbsp;아담(Adam)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;b&gt;RMSprop과 Momentum 두 가지를 합친 듯한 방법&lt;/b&gt;으로 방&lt;u&gt;향과 학습률 두 가지를 모두 잡기 위한 방법&lt;/u&gt; &lt;br /&gt;- 코드:&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741074636208&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tf.keras.optimizers.Adam(lr= 0.001, beta_1=0.9, beta_2= 0.999, epsilon = None, decay=0.0, amsgrad = False)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;사용&amp;nbsp;방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 옵티마이저 인스턴스는 compile의 optimizer에서 호출. &lt;br /&gt;-&amp;nbsp;코드예시(adam) &lt;/p&gt;
&lt;pre id=&quot;code_1741074656133&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;adam = tf.keras.optimizers.Adam(lr=0.001, beta_1= 0.9, beta_2 = 0.999, epsilon = None, decay=0.0, amsgrad = False)
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['acc'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;(optimizer='adam'으로&amp;nbsp;작성해도&amp;nbsp;동일함) &lt;br /&gt;-&amp;nbsp;다른&amp;nbsp;옵티마이저들도&amp;nbsp;optimizer&amp;nbsp;=&amp;nbsp;'sgd',&amp;nbsp;'rmsprop'로&amp;nbsp;호출&amp;nbsp;가능. &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;&lt;br /&gt;4.&amp;nbsp;에포크와&amp;nbsp;배치&amp;nbsp;크기와&amp;nbsp;이터레이션&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; &lt;b&gt;에포크&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 인공 신경망에서&lt;u&gt; 전체 데이터에 대해서 순전파와 역전파가 끝난 상태&lt;/u&gt;. 전체 데이터를 하나의 문제지에 비유한다면 문제지의 모든 문제를 끝까지 다 풀고, 정답지로 채점을 하여 문제지에 대한 공부가 한 번 끝낸 상태. &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; &lt;b&gt;배치 크기&lt;/b&gt;(Batch Size)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;u&gt; 몇 개의 데이터 단위로 매개변수를 업데이트 하는지를 말함&lt;/u&gt;. 시험에 비유하면 문제지에서 몇 개씩 문제를 풀고나서 정답지를 확인하느냐의 문제. &lt;br /&gt;-&amp;nbsp;배치&amp;nbsp;크기와&amp;nbsp;배치의&amp;nbsp;수는&amp;nbsp;다른&amp;nbsp;개념.&amp;nbsp;전체&amp;nbsp;데이터가&amp;nbsp;2000일&amp;nbsp;때&amp;nbsp;배치&amp;nbsp;크기를&amp;nbsp;200으로&amp;nbsp;한다면&amp;nbsp;배치의&amp;nbsp;수는&amp;nbsp;10임.&amp;nbsp;이때&amp;nbsp;배치의&amp;nbsp;수를&amp;nbsp;이터레이션이라고&amp;nbsp;함 &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;이터레이션(Iteration)&amp;nbsp;또는&amp;nbsp;스템(Step)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 한 번의 에포크를 끝내기 위해서 필요한 배치의 수 = 한 번의 에포크 내에서 이루어지는 매개변수의 업데이트 횟수 &lt;br /&gt;-&amp;nbsp;&lt;b&gt;전체&amp;nbsp;데이터가&amp;nbsp;2000일&amp;nbsp;때&amp;nbsp;배치&amp;nbsp;크기를&amp;nbsp;200으로&amp;nbsp;한다면&amp;nbsp;이터레이션&amp;nbsp;수는&amp;nbsp;총&amp;nbsp;10&lt;/b&gt;임. &lt;br /&gt;-&amp;nbsp;이터레이션은&amp;nbsp;스텝(Step)이라고도&amp;nbsp;함. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;07-05&amp;nbsp;역전파(BackPropagation)&amp;nbsp;이해하기&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 인공 신경망의 이해(Neural Network Overview)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;u&gt;입력층,&amp;nbsp;은닉층1개,&amp;nbsp;출력층&lt;/u&gt;&amp;nbsp;총&amp;nbsp;3개의&amp;nbsp;층으로&amp;nbsp;이루어진&amp;nbsp;인공신경망을&amp;nbsp;가정. &lt;br /&gt;-&amp;nbsp;&lt;u&gt;두개의&amp;nbsp;입력&lt;/u&gt;과,&amp;nbsp;&lt;u&gt;두개의&amp;nbsp;은닉층&amp;nbsp;뉴런&lt;/u&gt;,&amp;nbsp;&lt;u&gt;두개의&amp;nbsp;출력층&amp;nbsp;뉴런&lt;/u&gt;을&amp;nbsp;사용. &lt;br /&gt;-&amp;nbsp;은닉층과&amp;nbsp;출력층의&amp;nbsp;모든&amp;nbsp;뉴런은&amp;nbsp;&lt;u&gt;활성화함수로&amp;nbsp;시그모이드&amp;nbsp;함수&lt;/u&gt;&amp;nbsp;사용 &lt;br /&gt;-&amp;nbsp;입력층&amp;nbsp;두개의&amp;nbsp;뉴런을&amp;nbsp;각각&amp;nbsp;x1,&amp;nbsp;x2.&amp;nbsp;2개의&amp;nbsp;은닉층의&amp;nbsp;뉴런을&amp;nbsp;z1/h1,&amp;nbsp;z2/h2.&amp;nbsp;출력층&amp;nbsp;2개의&amp;nbsp;뉴런을&amp;nbsp;z3/o1,&amp;nbsp;z4/o2라고하자. &lt;br /&gt;-&amp;nbsp;z1,z2,z3,z4는&amp;nbsp;이전층의&amp;nbsp;모든&amp;nbsp;입력이&amp;nbsp;각각의&amp;nbsp;가중치와&amp;nbsp;곱해진&amp;nbsp;값들의&amp;nbsp;합&amp;nbsp;=&amp;gt;&amp;nbsp;즉&amp;nbsp;가중합을&amp;nbsp;의미함 &lt;br /&gt;-&amp;nbsp;x1에서&amp;nbsp;첫번째&amp;nbsp;은닉&amp;nbsp;뉴런의&amp;nbsp;가중치를&amp;nbsp;w1,&amp;nbsp;x2에서&amp;nbsp;첫번째&amp;nbsp;은닉&amp;nbsp;뉴런의&amp;nbsp;가중치를&amp;nbsp;w2라고&amp;nbsp;하면,&amp;nbsp;z1=&amp;nbsp;x1*z1&amp;nbsp;+&amp;nbsp;x2*z2가&amp;nbsp;됨. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;2.&amp;nbsp;순전파(Forward&amp;nbsp;Propagaton)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- z1을 시그모이드 함수의 입력으로 사용하여 나온 출력을 h1이라고 함. &lt;br /&gt;-&amp;nbsp;다시&amp;nbsp;h1,&amp;nbsp;h2와&amp;nbsp;w5,w6,w7,w8과의&amp;nbsp;&lt;u&gt;가중합&lt;/u&gt;을&amp;nbsp;구하여&amp;nbsp;나온&amp;nbsp;&lt;u&gt;z3,z4&lt;/u&gt;를&amp;nbsp;&lt;u&gt;시그모이드&amp;nbsp;함수&lt;/u&gt;의&amp;nbsp;입력으로&amp;nbsp;하여&amp;nbsp;나온&amp;nbsp;&lt;u&gt;출력값&amp;nbsp;2개를&amp;nbsp;o1,o2&lt;/u&gt;라고&amp;nbsp;함. &lt;br /&gt;-&amp;nbsp;o1,&amp;nbsp;o2는&amp;nbsp;예측값. &lt;br /&gt;- 예측값과 실제값의 오차를 계산하기 위해 &lt;u&gt;손실함수로 평균제곱오차 MSE&lt;/u&gt;를 사용. &lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;3. 역전파 1단계 (BackPropagation Step 1)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 역전파는 출력층에서 입력층 방향으로 계산하면서 가중치를 업데이트.&lt;br /&gt;-&amp;nbsp;출력층&amp;nbsp;바로&amp;nbsp;이전의&amp;nbsp;은닉층을&amp;nbsp;N층이라고&amp;nbsp;하였을&amp;nbsp;때,&amp;nbsp;출력층과&amp;nbsp;N층&amp;nbsp;사이의&amp;nbsp;가중치를&amp;nbsp;업데이트하는&amp;nbsp;단계를&amp;nbsp;역전파&amp;nbsp;1단계,&amp;nbsp;그리고&amp;nbsp;N층과&amp;nbsp;N층의&amp;nbsp;이전층&amp;nbsp;사이의&amp;nbsp;가중치를&amp;nbsp;업데이트&amp;nbsp;하는&amp;nbsp;단계를&amp;nbsp;역전파&amp;nbsp;2단계라고&amp;nbsp;해보자. &lt;br /&gt;-&amp;nbsp;역전파&amp;nbsp;1단계에서&amp;nbsp;업데이트&amp;nbsp;해야&amp;nbsp;할&amp;nbsp;가중치는&amp;nbsp;w5,w6,w7,w8&amp;nbsp;총&amp;nbsp;4개.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;w5를&amp;nbsp;구하려면&amp;nbsp;총오차에서&amp;nbsp;w5에&amp;nbsp;대한&amp;nbsp;편미분을&amp;nbsp;계산해야&amp;nbsp;함. &lt;br /&gt;-&amp;nbsp;미분의&amp;nbsp;연쇄&amp;nbsp;법칙을&amp;nbsp;사용하면&amp;nbsp;이와&amp;nbsp;같이&amp;nbsp;풀어&amp;nbsp;쓸&amp;nbsp;수&amp;nbsp;있음 &lt;br /&gt;=&amp;gt;&amp;nbsp;&amp;nbsp;(총오차&amp;nbsp;(E_total)를&amp;nbsp;o1으로&amp;nbsp;편미분한&amp;nbsp;값)&amp;nbsp;*&amp;nbsp;(o1을&amp;nbsp;z3으로&amp;nbsp;편미분한값)&amp;nbsp;*&amp;nbsp;(z3을&amp;nbsp;w5로&amp;nbsp;편미분한값) &lt;br /&gt;-&amp;nbsp;시그모이드&amp;nbsp;함수의&amp;nbsp;미분은&amp;nbsp;f(x)&amp;nbsp;*&amp;nbsp;(1-f(x))임.&amp;nbsp; &lt;br /&gt;-(&amp;nbsp;&lt;a href=&quot;https://wikidocs.net/37406)&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wikidocs.net/37406)&lt;/a&gt;&amp;nbsp;자세한&amp;nbsp;계산은&amp;nbsp;이&amp;nbsp;링크&amp;nbsp;참고 &lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;역전파&amp;nbsp;2단계&amp;nbsp;(BackPropagation&amp;nbsp;Step&amp;nbsp;2) &lt;br /&gt;-&amp;nbsp;예시로&amp;nbsp;들고&amp;nbsp;있는&amp;nbsp;인공신경망은&amp;nbsp;은닉층이&amp;nbsp;1개이므로&amp;nbsp;이번단계가&amp;nbsp;마지막&amp;nbsp;단계. &lt;br /&gt;-&amp;nbsp;이&amp;nbsp;단계에서는&amp;nbsp;w1,w2,w3,w4를&amp;nbsp;계산할&amp;nbsp;것임. &lt;br /&gt;-&amp;nbsp;w1에&amp;nbsp;대해&amp;nbsp;진행하자면&amp;nbsp;마찬가지로&amp;nbsp;E_total을&amp;nbsp;w1으로&amp;nbsp;편미분한&amp;nbsp;값을&amp;nbsp;계산 &lt;br /&gt;&lt;br /&gt;=&amp;gt;&amp;nbsp;인공신경망의&amp;nbsp;학습은&lt;u&gt;&amp;nbsp;오차를&amp;nbsp;최소화하는&amp;nbsp;가중치를&amp;nbsp;찾는&amp;nbsp;목적&lt;/u&gt;으로&amp;nbsp;&lt;u&gt;순전파와&amp;nbsp;역전파를&amp;nbsp;반복&lt;/u&gt;하는&amp;nbsp;것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;07-06&amp;nbsp;과적합(Overfitting)을&amp;nbsp;막는&amp;nbsp;방법들&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 데이터의 양을 늘리기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;데이터의&amp;nbsp;양을&amp;nbsp;늘릴&amp;nbsp;수록&amp;nbsp;모델은&amp;nbsp;데이터의&amp;nbsp;일반적인&amp;nbsp;패턴을&amp;nbsp;학습하여&amp;nbsp;과적합&amp;nbsp;방지 &lt;br /&gt;-&amp;nbsp;데이터의&amp;nbsp;양이&amp;nbsp;적다면&amp;nbsp;데이터&amp;nbsp;증식을&amp;nbsp;해주기도&amp;nbsp;함. &lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;2.&amp;nbsp;모델의&amp;nbsp;복잡도&amp;nbsp;중요&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 복잡도는 은닉층의 수나 매개변수의 수 등으로 결정됨 &lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;3. 가중치 규제 (Regularization) 적용하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;복잡한&amp;nbsp;모델이&amp;nbsp;과적합될&amp;nbsp;가능성이&amp;nbsp;높음.&amp;nbsp;모델을&amp;nbsp;좀&amp;nbsp;더&amp;nbsp;간단하게&amp;nbsp;하는&amp;nbsp;방법으로&amp;nbsp;가중치&amp;nbsp;규제가&amp;nbsp;있음. &lt;br /&gt;-&amp;nbsp;&lt;b&gt;L1규제&lt;/b&gt;&amp;nbsp;:&amp;nbsp;&lt;u&gt;가중치&amp;nbsp;w들의&amp;nbsp;합계를&amp;nbsp;비용&amp;nbsp;함수에&amp;nbsp;추가&lt;/u&gt;함.&amp;nbsp;L1&amp;nbsp;노름이라고도&amp;nbsp;함 &lt;br /&gt;-&amp;nbsp;&lt;b&gt;L2규제&lt;/b&gt;&amp;nbsp;:&amp;nbsp;&lt;u&gt;모든&amp;nbsp;가중치&amp;nbsp;w들의&amp;nbsp;제곱합을&amp;nbsp;비용&amp;nbsp;함수에&amp;nbsp;추가&lt;/u&gt;.&amp;nbsp;L2노름이라고도&amp;nbsp;함. &lt;br /&gt;-&amp;nbsp;두&amp;nbsp;식&amp;nbsp;모두&amp;nbsp;비용&amp;nbsp;함수를&amp;nbsp;최소화하기&amp;nbsp;위해서는&amp;nbsp;&lt;u&gt;가중치&amp;nbsp;w들의&amp;nbsp;값이&amp;nbsp;작아져야&amp;nbsp;한다는&amp;nbsp;특징&lt;/u&gt;이&amp;nbsp;있음.&amp;nbsp;&amp;nbsp; &lt;br /&gt;-&amp;nbsp;&lt;u&gt;L1규제를&amp;nbsp;사용하면&lt;/u&gt;&amp;nbsp;비용&amp;nbsp;함수가&amp;nbsp;최소가&amp;nbsp;되게&amp;nbsp;하는&amp;nbsp;가중치와&amp;nbsp;편향을&amp;nbsp;찾는&amp;nbsp;동시에&amp;nbsp;가중치들의&amp;nbsp;절대값의&amp;nbsp;합도&amp;nbsp;최소가&amp;nbsp;되어야&amp;nbsp;함.&amp;nbsp;-&amp;gt;&amp;nbsp;가중치&amp;nbsp;&lt;u&gt;w의&amp;nbsp;값들은&amp;nbsp;0&amp;nbsp;또는&amp;nbsp;0에&amp;nbsp;가까이&amp;nbsp;작아져야&amp;nbsp;하므로&lt;/u&gt; &lt;b&gt;어떤 특성들은 모델을 만들 때 거의 사용되지 않게 됨&lt;/b&gt;. &lt;br /&gt;-&amp;nbsp;&lt;u&gt;L2규제는&lt;/u&gt;&amp;nbsp;L1&amp;nbsp;규제와는&amp;nbsp;달리&amp;nbsp;가중치들의&amp;nbsp;제곱을&amp;nbsp;최소화하므로&amp;nbsp;&lt;u&gt;w의&amp;nbsp;값이&amp;nbsp;완전히&amp;nbsp;0이&amp;nbsp;되기&amp;nbsp;보다는&amp;nbsp;0에&amp;nbsp;가까워지는&amp;nbsp;경향&lt;/u&gt;을&amp;nbsp;띔.&amp;nbsp;&amp;nbsp;&lt;b&gt;가중치&amp;nbsp;감쇠&lt;/b&gt;라고도&amp;nbsp;부름. &lt;br /&gt;- &lt;u&gt;L1규제는 어떤 특성들이 모델에 영향을 주고 있는지를 정확히 판단하고자 할 때 유용&lt;/u&gt;함. =&amp;gt; 이런 판단이 필요 없다면 경험적으로는 &lt;b&gt;L2규제가 더 잘 동작하므로 더 권장&lt;/b&gt;함.&amp;nbsp; &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;&lt;br /&gt;4. 드롭아웃(Dropout)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;학습&amp;nbsp;과정에서&amp;nbsp;&lt;u&gt;신경망의&amp;nbsp;일부를&amp;nbsp;사용하지&amp;nbsp;않는&amp;nbsp;방법&lt;/u&gt; &lt;br /&gt;-&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;드롭아웃의&amp;nbsp;비율을&amp;nbsp;0.5로&amp;nbsp;한다면&amp;nbsp;학습&amp;nbsp;과정마다&amp;nbsp;랜덤으로&amp;nbsp;절반의&amp;nbsp;뉴런을&amp;nbsp;사용하지&amp;nbsp;않고&amp;nbsp;절반의&amp;nbsp;뉴런만을&amp;nbsp;사용함. &lt;br /&gt;-&amp;nbsp;드롭아웃은&amp;nbsp;신경망&amp;nbsp;&lt;u&gt;학습&amp;nbsp;시에만&amp;nbsp;사용하고,&amp;nbsp;예측&amp;nbsp;시에는&amp;nbsp;사용하지&amp;nbsp;않는&amp;nbsp;것이&amp;nbsp;일반적&lt;/u&gt;.&amp;nbsp;학습&amp;nbsp;시에&amp;nbsp;인공&amp;nbsp;신경망이&amp;nbsp;특정&amp;nbsp;뉴런&amp;nbsp;또는&amp;nbsp;특정&amp;nbsp;조합에&amp;nbsp;너무&amp;nbsp;의존적이게&amp;nbsp;되는&amp;nbsp;것을&amp;nbsp;방지해주고,&amp;nbsp;매번&amp;nbsp;랜덤&amp;nbsp;선택으로&amp;nbsp;뉴런들을&amp;nbsp;사용하지&amp;nbsp;않으므로&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;신경망들을&amp;nbsp;앙상블하여&amp;nbsp;사용하는&amp;nbsp;것&amp;nbsp;같은&amp;nbsp;효과를&amp;nbsp;내어&amp;nbsp;&lt;b&gt;과적합을&amp;nbsp;방지&lt;/b&gt;함. &lt;br /&gt;- 코드:&lt;/p&gt;
&lt;pre id=&quot;code_1741075125534&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.models import Sequential
 from tensorflow.keras.layers import Dropout, Dense

max_wotds=10000
num_classes = 46

model_Sequential()
model.add(Dense(256,input_shape=(max_words,), activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(128, activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation = 'softmax'))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 올리는 자연어처리 공부노트!&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/자연어 처리</category>
      <author>빈이즈</author>
      <guid isPermaLink="true">https://binrec.tistory.com/12</guid>
      <comments>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-7-%EB%94%A5-%EB%9F%AC%EB%8B%9DDeep-Learning-%EA%B0%9C%EC%9A%94-1#entry12comment</comments>
      <pubDate>Tue, 4 Mar 2025 17:00:43 +0900</pubDate>
    </item>
    <item>
      <title>원인과 결과의 경제학 (나카무로 마키코, 쓰가와 유스케 지음)</title>
      <link>https://binrec.tistory.com/entry/%EC%9B%90%EC%9D%B8%EA%B3%BC-%EA%B2%B0%EA%B3%BC%EC%9D%98-%EA%B2%BD%EC%A0%9C%ED%95%99-%EB%82%98%EC%B9%B4%EB%AC%B4%EB%A1%9C-%EB%A7%88%ED%82%A4%EC%BD%94-%EC%93%B0%EA%B0%80%EC%99%80-%EC%9C%A0%EC%8A%A4%EC%BC%80-%EC%A7%80%EC%9D%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;원인과 결과의 경제학.jpeg&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;832&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqDotC/btsK64WlxwQ/eqTLDaJ61oaJBXwOVhiBuk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqDotC/btsK64WlxwQ/eqTLDaJ61oaJBXwOVhiBuk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqDotC/btsK64WlxwQ/eqTLDaJ61oaJBXwOVhiBuk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqDotC%2FbtsK64WlxwQ%2FeqTLDaJ61oaJBXwOVhiBuk%2Fimg.jpg&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;350&quot; height=&quot;500&quot; data-filename=&quot;원인과 결과의 경제학.jpeg&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;832&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;원인과 결과의 경제학&lt;/b&gt;&lt;/span&gt;_나카무로 마키코, 쓰가와 유스케 지음&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;: 넘치는 데이터 속에서 진짜 의미를 찾아내는 법&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 독서기간 : 2024-11-13 ~ 2024-12-03&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 책 내용 : 인과관계인지 상관관계인지 잘 따져봐야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 후기 : 상관관계와 인과관계의 차이에 대해 더 자세히 알게 됐고 조심해야 겠다는 생각이 들었고, 인과관계인지 확인하기 위한&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;'반사실', '이중차분법', 회귀 불연속 설계' 등 새로운 지식들을 배울 수 있어 유익한 책이었다&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;프롤로그&amp;nbsp;::&amp;nbsp;당신이&amp;nbsp;알고&amp;nbsp;있는&amp;nbsp;사실은&amp;nbsp;진실인가?&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; 인과관계와 상관관계 &lt;br /&gt;&quot;정말 인과관계가 존재하는가?&quot; -&amp;gt;&amp;nbsp;'인과&amp;nbsp;추론'&amp;nbsp;방법론을&amp;nbsp;이용하여&amp;nbsp;확인 &lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;빅데이터&amp;nbsp;시대에는&amp;nbsp;데이터&amp;nbsp;분석&amp;nbsp;기술뿐&amp;nbsp;아니라&amp;nbsp;데이터의&amp;nbsp;분석&amp;nbsp;결과를&amp;nbsp;해석하는&amp;nbsp;기술도&amp;nbsp;필요하다 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;제 1장 근어 없는 통설에 속지 않으려면 : 인과 추론의 본질&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Keyword&amp;nbsp;&lt;u&gt;제3의&amp;nbsp;변수&lt;/u&gt;&amp;nbsp;:&amp;nbsp;원인과&amp;nbsp;결과&amp;nbsp;모두에&amp;nbsp;영향을&amp;nbsp;주며,&amp;nbsp;상관관계에&amp;nbsp;지나지&amp;nbsp;않는&amp;nbsp;것을&amp;nbsp;마치&amp;nbsp;인과관계가&amp;nbsp;있는&amp;nbsp;것처럼&amp;nbsp;보이게&amp;nbsp;만드는&amp;nbsp;성가신&amp;nbsp;존재.&amp;nbsp;전문용어로는&amp;nbsp;&quot;&lt;i&gt;교란&amp;nbsp;요인&lt;/i&gt;&quot;이라고&amp;nbsp;부른다. &lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;두&amp;nbsp;변수의&amp;nbsp;관계가&amp;nbsp;&lt;u&gt;인과관계인지&amp;nbsp;아니면&amp;nbsp;상관관계인지&amp;nbsp;확인&lt;/u&gt;하기&amp;nbsp;위해&amp;nbsp;의심해 볼&amp;nbsp;세 가지 &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&lt;b&gt;'우연의&amp;nbsp;일치'는&amp;nbsp;아닌가&lt;/b&gt;?&amp;nbsp;-&amp;gt;&amp;nbsp;EX)&amp;nbsp;지구온난화가&amp;nbsp;진행되면&amp;nbsp;해적&amp;nbsp;수가&amp;nbsp;줄어든다,&amp;nbsp;&quot;미야자키&amp;nbsp;하야오&amp;nbsp;감독이&amp;nbsp;이끄는&amp;nbsp;스튜디오&amp;nbsp;지브리&amp;nbsp;영화가&amp;nbsp;일본&amp;nbsp;텔레비전에서&amp;nbsp;방영되면,&amp;nbsp;미국의&amp;nbsp;주가가&amp;nbsp;떨어진다&quot;는&amp;nbsp;&quot;지브라의&amp;nbsp;저주&quot; &lt;br /&gt;-&amp;nbsp;&lt;b&gt;'제3의&amp;nbsp;변수'는&amp;nbsp;없는가&lt;/b&gt;?&amp;nbsp;-&amp;gt;&amp;nbsp;EX)&amp;nbsp;체력이&amp;nbsp;좋은&amp;nbsp;아이들이&amp;nbsp;성적도&amp;nbsp;높다.&amp;nbsp;=&amp;gt; 아이들의&amp;nbsp;체력과,&amp;nbsp;성적에&amp;nbsp;모두&amp;nbsp;영향을&amp;nbsp;미치는&amp;nbsp;제3의&amp;nbsp;변수가&amp;nbsp;있는지&amp;nbsp;확인.&amp;nbsp;=&amp;gt;&amp;nbsp;'부모의&amp;nbsp;교육열'이&amp;nbsp;강할&amp;nbsp;경우&amp;nbsp;아이에게&amp;nbsp;스포츠를&amp;nbsp;배우게&amp;nbsp;하거나&amp;nbsp;식사에&amp;nbsp;신경 쓰고,&amp;nbsp;동시에&amp;nbsp;공부를&amp;nbsp;시킬&amp;nbsp;것이기&amp;nbsp;때문에&amp;nbsp;성적도&amp;nbsp;높은&amp;nbsp;경향이&amp;nbsp;있음&amp;nbsp;=&amp;gt;&amp;nbsp;이&amp;nbsp;경우&amp;nbsp;실제로&amp;nbsp;아이들의&amp;nbsp;성적을&amp;nbsp;향상시키는&amp;nbsp;것은&amp;nbsp;체력이&amp;nbsp;아닌&amp;nbsp;&amp;nbsp;'부모의&amp;nbsp;교육열'임. &lt;br /&gt;-&amp;nbsp;'&lt;b&gt;역의&amp;nbsp;인과관계'는&amp;nbsp;존재하지&amp;nbsp;않는가&lt;/b&gt;?&amp;nbsp;&amp;nbsp;-&amp;gt;&amp;nbsp;EX)&amp;nbsp;경찰관&amp;nbsp;수와&amp;nbsp;범죄의&amp;nbsp;관계에&amp;nbsp;대해&amp;nbsp;생각해&amp;nbsp;볼&amp;nbsp;때,&amp;nbsp;지역별&amp;nbsp;경찰관의&amp;nbsp;수가&amp;nbsp;많다는&amp;nbsp;것이&amp;nbsp;원인이&amp;nbsp;되어&amp;nbsp;범죄의&amp;nbsp;발생&amp;nbsp;건수가&amp;nbsp;많다는&amp;nbsp;결과를&amp;nbsp;발생시켰다고&amp;nbsp;보기&amp;nbsp;어려움&amp;nbsp;(경찰관&amp;nbsp;-&amp;gt;&amp;nbsp;범죄) &lt;br /&gt;=&amp;gt;&amp;nbsp;범죄가&amp;nbsp;많은&amp;nbsp;우범&amp;nbsp;지역이기&amp;nbsp;때문에&amp;nbsp;많은&amp;nbsp;경찰관을&amp;nbsp;배치한&amp;nbsp;것으로&amp;nbsp;보는&amp;nbsp;것이&amp;nbsp;타당&amp;nbsp;(범죄-&amp;gt;경찰관) &lt;br /&gt;=&amp;gt;&amp;nbsp;원인이라고&amp;nbsp;오해했던&amp;nbsp;것이&amp;nbsp;결과이고,&amp;nbsp;결과라고&amp;nbsp;생각했던&amp;nbsp;것이&amp;nbsp;원인인&amp;nbsp;상태를&amp;nbsp;&quot;역의&amp;nbsp;인과관계&quot;라고&amp;nbsp;부름. &lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;두&amp;nbsp;변수가&amp;nbsp;&lt;u&gt;인과관계에&amp;nbsp;있다면&amp;nbsp;다시&amp;nbsp;원인이&amp;nbsp;발생했을&amp;nbsp;때&amp;nbsp;같은&amp;nbsp;결과를&amp;nbsp;얻게&amp;nbsp;된다. &lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;'&lt;b&gt;반사실&lt;/b&gt;'로&amp;nbsp;증명 &lt;br /&gt;-&amp;nbsp;반사실&amp;nbsp;:&amp;nbsp;&quot;&lt;u&gt;만약에&amp;nbsp;-을&amp;nbsp;하지&amp;nbsp;않았더라면&amp;nbsp;결과는&amp;nbsp;어떻게&amp;nbsp;됐을까?&lt;/u&gt;&quot;라는&amp;nbsp;식으로&amp;nbsp;실제로&amp;nbsp;일어나지&amp;nbsp;않은&amp;nbsp;사실을&amp;nbsp;가정하는&amp;nbsp;시나리오. &lt;br /&gt;-&amp;nbsp;인과관계의&amp;nbsp;존재는&amp;nbsp;원인이&amp;nbsp;발생한&amp;nbsp;'사실'의&amp;nbsp;결과와&amp;nbsp;원인이&amp;nbsp;발생하지&amp;nbsp;않은&amp;nbsp;'반사실'의&amp;nbsp;결과를&amp;nbsp;비교하여&amp;nbsp;증명해야&amp;nbsp;함. &lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;크리스마스&amp;nbsp;시즌에&amp;nbsp;맞춰&amp;nbsp;12월&amp;nbsp;초에&amp;nbsp;광고를&amp;nbsp;만듦&amp;nbsp;-&amp;gt;&amp;nbsp;매출이&amp;nbsp;전년&amp;nbsp;동기&amp;nbsp;대비&amp;nbsp;30퍼센트&amp;nbsp;증가&amp;nbsp;-&amp;gt;&amp;nbsp;&quot;올해&amp;nbsp;매출의&amp;nbsp;증가는&amp;nbsp;다&amp;nbsp;신문&amp;nbsp;광고&amp;nbsp;덕분입니다&quot;&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있나? &lt;br /&gt;-&amp;nbsp;광고의&amp;nbsp;인과효과&amp;nbsp;:&amp;nbsp;광고를&amp;nbsp;냈을&amp;nbsp;때(사실)의&amp;nbsp;매출과,&amp;nbsp;똑같은&amp;nbsp;상황에서&amp;nbsp;광고를&amp;nbsp;내지&amp;nbsp;않았을&amp;nbsp;때(반사실)의&amp;nbsp;매출&amp;nbsp;차이를&amp;nbsp;말함 &lt;br /&gt;-&amp;nbsp;현실에서&amp;nbsp;반사실을&amp;nbsp;관찰할&amp;nbsp;수&amp;nbsp;없음&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;u&gt;반사실을&amp;nbsp;'타당한&amp;nbsp;값'으로&amp;nbsp;채운다&lt;/u&gt; &lt;br /&gt;EX)&amp;nbsp;지역&amp;nbsp;A-D&amp;nbsp;중&amp;nbsp;A,B는&amp;nbsp;광고를&amp;nbsp;하고&amp;nbsp;나머지&amp;nbsp;C, D은&amp;nbsp;광고를&amp;nbsp;하지&amp;nbsp;않았을&amp;nbsp;때,&amp;nbsp;A, B가&amp;nbsp;광고를&amp;nbsp;하지&amp;nbsp;않는&amp;nbsp;경우(반사실)의&amp;nbsp;매출은&amp;nbsp;알&amp;nbsp;수&amp;nbsp;없고,&amp;nbsp;마찬가지로&amp;nbsp;C, D가&amp;nbsp;광고를&amp;nbsp;한&amp;nbsp;경우(사실)의&amp;nbsp;매출도&amp;nbsp;알&amp;nbsp;수&amp;nbsp;없음.&amp;nbsp;(=&amp;gt;&amp;nbsp;반사실&amp;nbsp;관찰&amp;nbsp;불가) &lt;br /&gt;=&amp;gt;&amp;nbsp;반사실과&amp;nbsp;사실의&amp;nbsp;매출&amp;nbsp;차이로&amp;nbsp;광고의&amp;nbsp;인과효과를&amp;nbsp;확인하기&amp;nbsp;어려움.&amp;nbsp;=&amp;gt;&amp;nbsp;A,B&amp;nbsp;지역의&amp;nbsp;반사실&amp;nbsp;값을&amp;nbsp;C, D&amp;nbsp;지역의&amp;nbsp;매출로&amp;nbsp;채우는&amp;nbsp;방법이&amp;nbsp;있음 &lt;br /&gt;-&amp;nbsp;이&amp;nbsp;개념에는&amp;nbsp;조건이&amp;nbsp;하나&amp;nbsp;있음&amp;nbsp;:&amp;nbsp;광고를&amp;nbsp;낸&amp;nbsp;그룹과&amp;nbsp;광고를&amp;nbsp;내지&amp;nbsp;않는&amp;nbsp;그룹이&amp;nbsp;'비교&amp;nbsp;가능'해야&amp;nbsp;한다는&amp;nbsp;것.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;비교가능하다는&amp;nbsp;것은&amp;nbsp;매출에&amp;nbsp;영향을&amp;nbsp;미칠&amp;nbsp;만한&amp;nbsp;모든&amp;nbsp;특징이&amp;nbsp;매우&amp;nbsp;비슷하고&amp;nbsp;유일한&amp;nbsp;차이가&amp;nbsp;'광고의&amp;nbsp;유무'만일&amp;nbsp;경우를&amp;nbsp;말함. &lt;br /&gt;-&amp;nbsp;실제로는&amp;nbsp;그런&amp;nbsp;그룹은&amp;nbsp;존재하지&amp;nbsp;않음&amp;nbsp;=&amp;gt;&amp;nbsp;비교가능하도록&amp;nbsp;만들어야&amp;nbsp;함 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;제2장 건강검진을 받으면 오래 살 수 있다? :: 제대로 된 비교는 랜덤이 진리&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keyword &lt;u&gt;랜덤화 비교 실험&lt;/u&gt; : 동전 던지기나 난수표, 또는 제비뽑기 등을 이용해 연구 대상자를 랜덤으로 개입을 받는 그룹(실험군)과 그렇지 않은 그룹(대조군)으로 나눈다. 이렇게 두 그룹을 비교 가능하게 한 다음, '만약 실험군이 개입을 받지 않았다면 어떻게 됐을까?'라고 가정하는 반사실을 대조군의 결과로 채우는 방법을 말한다 &lt;br /&gt;&lt;br /&gt;-EX.&amp;nbsp;임상시험&amp;nbsp;:&amp;nbsp;신약의&amp;nbsp;효과와&amp;nbsp;안정성을&amp;nbsp;확인하기&amp;nbsp;위해&amp;nbsp;실시되는&amp;nbsp;테스트.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;실험용&amp;nbsp;쥐를&amp;nbsp;이용한&amp;nbsp;실험에서는&amp;nbsp;병에&amp;nbsp;걸린&amp;nbsp;쥐를&amp;nbsp;'랜덤 하게'&amp;nbsp;두&amp;nbsp;그룹으로&amp;nbsp;나누&amp;nbsp;다음,&amp;nbsp;투약한&amp;nbsp;쥐(실험군)와&amp;nbsp;투약하지&amp;nbsp;않은&amp;nbsp;쥐(대조군)를&amp;nbsp;비교한다.&amp;nbsp;만약&amp;nbsp;투약한&amp;nbsp;쥐가&amp;nbsp;치료율이&amp;nbsp;높았다면&amp;nbsp;약에&amp;nbsp;효과가&amp;nbsp;있었다고&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;통계적으로&amp;nbsp;유의미하지&amp;nbsp;않다:&amp;nbsp;실험군과&amp;nbsp;대조군의&amp;nbsp;차이가&amp;nbsp;우연에&amp;nbsp;의한&amp;nbsp;오차&amp;nbsp;범위&amp;nbsp;내에서&amp;nbsp;설명할&amp;nbsp;수&amp;nbsp;있다 &lt;br /&gt;-&amp;nbsp;통계적으로&amp;nbsp;유의미하다&amp;nbsp;:&amp;nbsp;관찰된&amp;nbsp;차이가&amp;nbsp;우연의&amp;nbsp;산물일&amp;nbsp;확률이&amp;nbsp;5퍼센트&amp;nbsp;이하이다.&amp;nbsp;(유의확률&amp;nbsp;5%일&amp;nbsp;경우) &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;제3장 남성 의사가 여성 의사보다 뛰어나다? :: 우연히 일어난 상황을 이용해 볼 수 있다면&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keyword &lt;u&gt;자연실험&lt;/u&gt; : 연구 대상자들이 법률이나 제도의 변경, 자연재해 등 '외생적 쇼크'에 의해 자연적으로 개입을 받는 그룹(실험군)과 그렇지 않은 그룹(대조군)으로 나뉜 상황을 이용, 인과관계를 검증하는 방법 &lt;br /&gt;&lt;br /&gt;EX)&amp;nbsp;100개&amp;nbsp;점포&amp;nbsp;대상으로&amp;nbsp;신문에&amp;nbsp;광고지를&amp;nbsp;끼어&amp;nbsp;넣기로&amp;nbsp;결정&amp;nbsp;-&amp;gt;&amp;nbsp;광고지&amp;nbsp;인쇄를&amp;nbsp;맡은&amp;nbsp;회사&amp;nbsp;중&amp;nbsp;한&amp;nbsp;곳에서&amp;nbsp;인쇄기&amp;nbsp;고장&amp;nbsp;-&amp;gt;&amp;nbsp;일부&amp;nbsp;점포만&amp;nbsp;광고지를&amp;nbsp;배포할&amp;nbsp;수&amp;nbsp;없음&amp;nbsp;-&amp;gt;&amp;nbsp;예정대로&amp;nbsp;광고지를&amp;nbsp;배포한&amp;nbsp;점포와&amp;nbsp;그렇지&amp;nbsp;않은&amp;nbsp;점포를&amp;nbsp;비교함으로써&amp;nbsp;광고가&amp;nbsp;매출에&amp;nbsp;미치는&amp;nbsp;인과관계를&amp;nbsp;밝힐&amp;nbsp;수&amp;nbsp;있지&amp;nbsp;않을까?라는&amp;nbsp;관점으로&amp;nbsp;접근 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;제4장 어린이집을 늘리면 여성 취업률이 올라갈까? :: '트렌드'에 속지 마라&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keyword &lt;u&gt;이중차분법&lt;/u&gt; : 개입을 받는 그룹(실험군)과 그렇지 않은 그룹(대조군)의 개입 전후 결과의 차이와 실험군과 대조군의 차이 이렇게 두 개의 차이로 효과를 추정하는 방법. 이를 위해서는 두 가지 전제조건이 성립해야 한다. 먼저 실험군과 대조군은 개입 전 결과의 '트렌드'가 같아야 한다. 즉 '트렌드'가 비교 가능해야 한다. 또 다른 하나는 개입과 같은 타이밍에 결과에 영향을 줄 만한 다른 변화가 실험군과 대조군에 별개로 발생하지 않아야 한다. &lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;&lt;b&gt;준&amp;nbsp;실험&lt;/b&gt;&amp;nbsp;:&amp;nbsp;실험을&amp;nbsp;'모방한다'는&amp;nbsp;의미에서&amp;nbsp;준실험이라&amp;nbsp;불림.&amp;nbsp;관찰&amp;nbsp;데이터와&amp;nbsp;통계적&amp;nbsp;기법을 이용해&amp;nbsp;마치&amp;nbsp;랜덤화&amp;nbsp;비교&amp;nbsp;시험을&amp;nbsp;실시하고&amp;nbsp;있는&amp;nbsp;것&amp;nbsp;같은&amp;nbsp;상황을&amp;nbsp;만들어내는&amp;nbsp;것.&amp;nbsp;그러한&amp;nbsp;통계적&amp;nbsp;기법으로&amp;nbsp;이&amp;nbsp;책에서는&amp;nbsp;1)&amp;nbsp;이중차분법&amp;nbsp;2)&amp;nbsp;조작변수법&amp;nbsp;3)&amp;nbsp;회귀&amp;nbsp;불연속&amp;nbsp;설계&amp;nbsp;4)&amp;nbsp;매칭법을&amp;nbsp;소개한다. &lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;&lt;b&gt;이중차분법&lt;/b&gt; &lt;br /&gt;개입을&amp;nbsp;받은&amp;nbsp;그룹의&amp;nbsp;개입&amp;nbsp;전&amp;nbsp;결과를&amp;nbsp;A1,&amp;nbsp;개입&amp;nbsp;후&amp;nbsp;결과를&amp;nbsp;A2라고&amp;nbsp;하자.&amp;nbsp;그리고&amp;nbsp;개입을&amp;nbsp;받지&amp;nbsp;않은&amp;nbsp;그룹(대조군)의&amp;nbsp;개입&amp;nbsp;전&amp;nbsp;결과를&amp;nbsp;B1,&amp;nbsp;개입&amp;nbsp;후&amp;nbsp;결과를&amp;nbsp;B2라고&amp;nbsp;한다.&amp;nbsp;실험군의&amp;nbsp;전후&amp;nbsp;비교(A2-A1)와&amp;nbsp;대조군의&amp;nbsp;전후&amp;nbsp;비교(B2-B1)의&amp;nbsp;차이인&amp;nbsp;{(A2-A1)-(B2-B1)}이&amp;nbsp;이중 차분에&amp;nbsp;의해&amp;nbsp;추정되는&amp;nbsp;개입&amp;nbsp;효과이다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;제5장 텔레비전을 많이 보면 아이들 머리가 나빠진다? :: 제3의 변수를 이용하라?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keyword &lt;u&gt;조작 변수법&lt;/u&gt; : '원인에게 영향을 주는 것을 통해서만 결과에 영향을 주는 조작 변수'를 이용해 개입을 받는 그룹(실험군)과 그렇지 않은 그룹(대조군)을 비교 가능한 상태로 만드는 방법. 이 방법이 효과적이기 위해서는 두 전제조건이 성립해야 한다. 먼저 조작 변수는 원인에는 영향을 미치지만 결과에는 직접 영향을 주지 않아야 하며, 또한 조작 변수와 결과 모두에 영향을 줄 만한 제4의 변수가 존재하지 않아야 한다는 점이 그것이다. &lt;br /&gt;&lt;br /&gt;&amp;gt; 조작변수법&amp;nbsp;예시 &lt;br /&gt;-매출에&amp;nbsp;광고의&amp;nbsp;인과&amp;nbsp;효과가&amp;nbsp;있는지&amp;nbsp;알아보고&amp;nbsp;싶음.&amp;nbsp; &lt;br /&gt;-&lt;u&gt;&amp;nbsp;조작변수&amp;nbsp;:&amp;nbsp;광고료&lt;/u&gt; &lt;br /&gt;-&amp;nbsp;광고료가&amp;nbsp;내려가면&amp;nbsp;그&amp;nbsp;지방에&amp;nbsp;있는&amp;nbsp;점포들이&amp;nbsp;광고를&amp;nbsp;낼&amp;nbsp;확률은&amp;nbsp;높아짐&amp;nbsp;=&amp;gt;&amp;nbsp;이&amp;nbsp;신문사의&amp;nbsp;광고료&amp;nbsp;할인&amp;nbsp;인벤트를&amp;nbsp;이용해&amp;nbsp;광고의&amp;nbsp;매출에&amp;nbsp;대한&amp;nbsp;인과&amp;nbsp;효과를&amp;nbsp;밝힐&amp;nbsp;수&amp;nbsp;없을까? &lt;br /&gt;-&amp;nbsp;&lt;u&gt;광고료&amp;nbsp;할인&amp;nbsp;이벤트&lt;/u&gt;를&amp;nbsp;하면&amp;nbsp;&lt;u&gt;광고를&amp;nbsp;내는&amp;nbsp;점포는&amp;nbsp;증가&lt;/u&gt;할&amp;nbsp;것이다.&amp;nbsp;그러나&amp;nbsp;이&amp;nbsp;이벤트는&amp;nbsp;&lt;u&gt;매출에는&amp;nbsp;직접&amp;nbsp;영향을&amp;nbsp;주지&amp;nbsp;않는다&lt;/u&gt;. &lt;br /&gt;-&amp;nbsp;광고와&amp;nbsp;매출&amp;nbsp;사이에&amp;nbsp;&lt;b&gt;인과관계가&amp;nbsp;있다면&lt;/b&gt;&amp;nbsp;:&amp;nbsp;이벤트로&amp;nbsp;광고를&amp;nbsp;내는&amp;nbsp;점포가&amp;nbsp;늘어&amp;nbsp;그&amp;nbsp;결과&amp;nbsp;&lt;u&gt;매출도&amp;nbsp;증가&lt;/u&gt;할&amp;nbsp;것이다. &lt;br /&gt;-&amp;nbsp;광고와&amp;nbsp;매출&amp;nbsp;사이에&amp;nbsp;&lt;b&gt;인과관계가&amp;nbsp;없다면&lt;/b&gt;&amp;nbsp;:&amp;nbsp;이벤트로&amp;nbsp;광고를&amp;nbsp;내는&amp;nbsp;점포가&amp;nbsp;늘어도&amp;nbsp;&lt;u&gt;매출은&amp;nbsp;증가하지&amp;nbsp;않을&amp;nbsp;것&lt;/u&gt;이다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;제 6장 공부 잘하는 친구와 사귀면 성적이 오를까? :: 갑자기 튀어나온 '점프'에 주목하라&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keyword &lt;u&gt;회귀 불연속 설계&lt;/u&gt; : 회귀 불연속 설계란 자의적으로 결정된 &lt;u&gt;컷오프&lt;/u&gt; 값을 중심으로 실험군과 대조군으로 갈리는 상황을 이용해 인과&amp;nbsp;&amp;nbsp;효과를 추정하는 방법이다. 이 기법이 성립하기 위한 전제조건은 컷오프 값 주변에서 결과에 영향을 줄 만한 다른 이벤트가 발생하지 않아야 한다는 것이다. &lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;49명과&amp;nbsp;50명의&amp;nbsp;차이 &lt;br /&gt;-&amp;nbsp;종업수가&amp;nbsp;50명&amp;nbsp;이상인&amp;nbsp;대형&amp;nbsp;점포에&amp;nbsp;한해&amp;nbsp;연말에&amp;nbsp;크리스마스&amp;nbsp;특수를&amp;nbsp;노린&amp;nbsp;광고를&amp;nbsp;낸다. &lt;br /&gt;-&amp;nbsp;종업원&amp;nbsp;수가&amp;nbsp;49명인&amp;nbsp;점포는&amp;nbsp;광고를&amp;nbsp;내지&amp;nbsp;않고&amp;nbsp;50명인&amp;nbsp;점포는&amp;nbsp;광고를&amp;nbsp;내게&amp;nbsp;된다는&amp;nbsp;소리&amp;nbsp;-&amp;gt;&amp;nbsp;49명인&amp;nbsp;점포와&amp;nbsp;50명인&amp;nbsp;점포는&amp;nbsp;고아고의&amp;nbsp;유무를&amp;nbsp;제외하고는&amp;nbsp;별반&amp;nbsp;다를&amp;nbsp;것이&amp;nbsp;없다.&amp;nbsp;-&amp;gt;&amp;nbsp;49명인&amp;nbsp;점포와&amp;nbsp;50명인&amp;nbsp;점포의&amp;nbsp;매출&amp;nbsp;비교를&amp;nbsp;통해&amp;nbsp;광고의&amp;nbsp;매출에&amp;nbsp;대한&amp;nbsp;인과&amp;nbsp;효과를&amp;nbsp;밝힐&amp;nbsp;수&amp;nbsp;있지&amp;nbsp;않을까? &lt;br /&gt;-&amp;nbsp;컷오프&amp;nbsp;값&amp;nbsp;부근에서&amp;nbsp;큰&amp;nbsp;매출의&amp;nbsp;격차가&amp;nbsp;발생&amp;nbsp;-&amp;gt;&lt;b&gt;&amp;nbsp;'점프'&lt;/b&gt;는&amp;nbsp;광고에&amp;nbsp;의해&amp;nbsp;발생한&amp;nbsp;것이기&amp;nbsp;때문에&amp;nbsp;그&amp;nbsp;크기야말로&amp;nbsp;광고가&amp;nbsp;매출에&amp;nbsp;미치는&amp;nbsp;&lt;b&gt;인과효과&lt;/b&gt;라&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;제 7장 명문대를 졸업하면 연봉이 높을까?:: 비슷한 대상들끼리의 조합을 찾아라&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keyword &lt;u&gt;매칭법&lt;/u&gt; : 결과에 영향을 줄 만한 공변량을 이용해 대조군에서 &lt;u&gt;실험군과 매우 흡사한 샘플을 찾아&lt;/u&gt;내 매칭시켜 비교하는 방법. 공변량이 복수일 때는 모두 종합해 점수화하여 이용하는 경우도 있다(성향 점수 매칭법). 매칭이 성립하기 위한 조건은 결과에 영향을 줄 만한 공변량이 모두 관찰 가능해야 한다는 것이다. &lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;'&lt;b&gt;짝'을&amp;nbsp;찾아낸다&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;총&amp;nbsp;점포&amp;nbsp;100개&amp;nbsp;가운데&amp;nbsp;30개는&amp;nbsp;광고를&amp;nbsp;낸&amp;nbsp;점포,&amp;nbsp;70개는&amp;nbsp;광고를&amp;nbsp;내지&amp;nbsp;않은&amp;nbsp;점포 &lt;br /&gt;-&amp;nbsp;광고를&amp;nbsp;내지&amp;nbsp;않은&lt;u&gt;&amp;nbsp;70개&amp;nbsp;점포&amp;nbsp;가운데&amp;nbsp;광고를&amp;nbsp;낸&amp;nbsp;30개&amp;nbsp;점포와&amp;nbsp;매우&amp;nbsp;비슷한&amp;nbsp;조건의&amp;nbsp;점포를&amp;nbsp;30개&amp;nbsp;추출&lt;/u&gt;해&amp;nbsp;광고를&amp;nbsp;낸&amp;nbsp;30개&amp;nbsp;점포와&amp;nbsp;비교하면&amp;nbsp;되지&amp;nbsp;않을까? &lt;br /&gt;-&amp;nbsp;광고를&amp;nbsp;낸&amp;nbsp;그룹&amp;nbsp;중&amp;nbsp;한&amp;nbsp;점포의&amp;nbsp;점장&amp;nbsp;연령이&amp;nbsp;45세라면,&amp;nbsp;광고를&amp;nbsp;내지&amp;nbsp;않은&amp;nbsp;그룹&amp;nbsp;중에서&amp;nbsp;점장의&amp;nbsp;연령이&amp;nbsp;45세인&amp;nbsp;점포를&amp;nbsp;골라&amp;nbsp;매칭.&amp;nbsp;55세면&amp;nbsp;55세를&amp;nbsp;골라&amp;nbsp;매칭 &lt;br /&gt;-&amp;nbsp;이렇게&amp;nbsp;하나씩&amp;nbsp;매칭시켜 나가면&amp;nbsp;결국&amp;nbsp;점장의&amp;nbsp;평균&amp;nbsp;연령이&amp;nbsp;같은&amp;nbsp;실험군과&amp;nbsp;대조군이&amp;nbsp;완성되고,&amp;nbsp;이&amp;nbsp;두&amp;nbsp;그룹은&amp;nbsp;비교&amp;nbsp;가능해진다. &lt;br /&gt;-&amp;nbsp;이때&amp;nbsp;점장의&amp;nbsp;'연령'에&amp;nbsp;해당하는&amp;nbsp;변수를&amp;nbsp;'공변량'이라고&amp;nbsp;한다. &lt;br /&gt;-&amp;nbsp;공변량은&amp;nbsp;하나&amp;nbsp;이상일&amp;nbsp;수&amp;nbsp;있음 &lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;&lt;b&gt;성향&amp;nbsp;점수&amp;nbsp;매칭법&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;성향&amp;nbsp;점수&amp;nbsp;:&amp;nbsp;&lt;u&gt;복수의&amp;nbsp;공변량을&amp;nbsp;종합해&amp;nbsp;점수화&lt;/u&gt;한&amp;nbsp;것.&amp;nbsp;'실험군으로&amp;nbsp;분류될&amp;nbsp;확률.을&amp;nbsp;의미함. &lt;br /&gt;-&amp;nbsp;EX)&amp;nbsp;다양한&amp;nbsp;공변량을&amp;nbsp;고려한&amp;nbsp;결과&amp;nbsp;광고를&amp;nbsp;낼&amp;nbsp;확률이&amp;nbsp;50%인&amp;nbsp;점포의&amp;nbsp;성향&amp;nbsp;점수는&amp;nbsp;0.5,&amp;nbsp;30%인&amp;nbsp;점포는&amp;nbsp;0.3이&amp;nbsp;된다. &lt;br /&gt;-&amp;nbsp;광고를&amp;nbsp;낸&amp;nbsp;점포(실험군)&amp;nbsp;중에서&amp;nbsp;성향&amp;nbsp;점수가&amp;nbsp;0.5인&amp;nbsp;점포가&amp;nbsp;있으면,&amp;nbsp;광고를&amp;nbsp;내지&amp;nbsp;않은&amp;nbsp;점포(대조군)에서&amp;nbsp;성향&amp;nbsp;점수가&amp;nbsp;0.5인&amp;nbsp;점포를&amp;nbsp;찾아&amp;nbsp;매칭한다. &lt;br /&gt;-&amp;nbsp;이렇게&amp;nbsp;완성된&amp;nbsp;두&amp;nbsp;개의&amp;nbsp;그룹을&amp;nbsp;비교하면&amp;nbsp;성향&amp;nbsp;점수&amp;nbsp;계산에&amp;nbsp;이용한&amp;nbsp;모든&amp;nbsp;공변량이&amp;nbsp;두&amp;nbsp;그룹&amp;nbsp;사이에서&amp;nbsp;비슷한&amp;nbsp;값을&amp;nbsp;취하게&amp;nbsp;된다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;제8장 어떻게 해도 도저히 예측이 불가능하다면 :: 기존 데이터를 다시 들여다보자&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keyword &lt;u&gt;최적선&lt;/u&gt; : 데이터 간의 거리 합계가 가장 작아지도록 그은 선.&amp;nbsp;&amp;nbsp;이 선의 기울기는 원인이 한 단위 증가했을 때 결과가 어느 정도 변화하는지 보여주는 것이며, 최적선의 기울기는 '인과 효과'를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;보론 1 분석의 타당성과 한계에 대해&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; &lt;u&gt;타당성 있는 것은 무엇인가&lt;/u&gt; &lt;br /&gt;-&amp;nbsp;&lt;b&gt;내적&amp;nbsp;타당성&lt;/b&gt;&amp;nbsp;:&amp;nbsp;두&amp;nbsp;변수&amp;nbsp;사이에&amp;nbsp;인과관계가&amp;nbsp;있을&amp;nbsp;확률.&amp;nbsp;즉&amp;nbsp;연구&amp;nbsp;대상이&amp;nbsp;된&amp;nbsp;집단에&amp;nbsp;재차&amp;nbsp;&lt;u&gt;동일한&amp;nbsp;개입을&amp;nbsp;했을&amp;nbsp;때&amp;nbsp;같은&amp;nbsp;결과&lt;/u&gt;가&amp;nbsp;재현되는&amp;nbsp;정도를&amp;nbsp;가리킨다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;&lt;b&gt;외적&amp;nbsp;타당성&lt;/b&gt; :&amp;nbsp;연구&amp;nbsp;대상과는&amp;nbsp;&lt;u&gt;다른&amp;nbsp;집단에 개입했을&amp;nbsp;때&amp;nbsp;같은&amp;nbsp;결과&lt;/u&gt;가&amp;nbsp;재현되는&amp;nbsp;정도를&amp;nbsp;말한다. &lt;br /&gt;-&amp;nbsp;EX)&amp;nbsp;&lt;b&gt;미국&lt;/b&gt;에서&amp;nbsp;실시된&amp;nbsp;랜덤화&amp;nbsp;비교&amp;nbsp;실험에서&amp;nbsp;혈압을&amp;nbsp;떨어뜨리면&amp;nbsp;심근경색에&amp;nbsp;걸릴&amp;nbsp;위험성이&amp;nbsp;낮아져&amp;nbsp;사망률이&amp;nbsp;하락한다는&amp;nbsp;인과관계가&amp;nbsp;증명됨&amp;nbsp;-&amp;gt;&amp;nbsp;랜덤화&amp;nbsp;비교&amp;nbsp;시험은&amp;nbsp;에비던스&amp;nbsp;수준이&amp;nbsp;높은&amp;nbsp;기법이기&amp;nbsp;때문에&amp;nbsp;내적&amp;nbsp;타당성이&amp;nbsp;높다고&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있다&amp;nbsp;-&amp;gt;&amp;nbsp;이&amp;nbsp;결과가&amp;nbsp;&lt;b&gt;다른&amp;nbsp;나라에도&amp;nbsp;해당되는지&lt;/b&gt;,&amp;nbsp;즉&amp;nbsp;&lt;u&gt;외적&amp;nbsp;타당성&lt;/u&gt;에&amp;nbsp;대해&amp;nbsp;신중하게&amp;nbsp;살펴볼&amp;nbsp;필요&amp;nbsp;있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;(짧은 후기)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;데이터 분석에 대한 더 많은 지식을 얻기 위하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;관련 독서를 시작!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;앞으로 더 다양한 책을 읽으며, 분석 공부를 해보려고 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ReadyToFightSnoopyGIF.gif&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7xh7z/btsK5a4Z2ah/hPa7i2rbVq4MMRk5lIEt11/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7xh7z/btsK5a4Z2ah/hPa7i2rbVq4MMRk5lIEt11/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7xh7z/btsK5a4Z2ah/hPa7i2rbVq4MMRk5lIEt11/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/7xh7z/btsK5a4Z2ah/hPa7i2rbVq4MMRk5lIEt11/img.gif&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;498&quot; height=&quot;281&quot; data-filename=&quot;ReadyToFightSnoopyGIF.gif&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;(●'◡'●)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>데이터 분석 관련 독서</category>
      <author>빈이즈</author>
      <guid isPermaLink="true">https://binrec.tistory.com/11</guid>
      <comments>https://binrec.tistory.com/entry/%EC%9B%90%EC%9D%B8%EA%B3%BC-%EA%B2%B0%EA%B3%BC%EC%9D%98-%EA%B2%BD%EC%A0%9C%ED%95%99-%EB%82%98%EC%B9%B4%EB%AC%B4%EB%A1%9C-%EB%A7%88%ED%82%A4%EC%BD%94-%EC%93%B0%EA%B0%80%EC%99%80-%EC%9C%A0%EC%8A%A4%EC%BC%80-%EC%A7%80%EC%9D%8C#entry11comment</comments>
      <pubDate>Wed, 4 Dec 2024 12:09:57 +0900</pubDate>
    </item>
    <item>
      <title>[딥러닝을 이용한 자연어 처리 입문] Chapter 9. 워드 임베딩 (Word Embedding)</title>
      <link>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-9-%EC%9B%8C%EB%93%9C-%EC%9E%84%EB%B2%A0%EB%94%A9-Word-Embedding</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 [&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/6876&quot;&gt;유원준&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #808080; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/13671&quot;&gt;상준&lt;/a&gt;]의 [딥러닝을 이용한 자영어 처리 입문]에서 가져온 내용이며, [크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스](&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;a href=&quot;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot;&gt;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&lt;/a&gt;&lt;/span&gt;)에 따라 사용되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wikidocs.net/22644&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wikidocs.net/22644&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722915101903&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;09. 워드 임베딩(Word Embedding)&quot; data-og-description=&quot;텍스트를 컴퓨터가 이해하고, 효율적으로 처리하게 하기 위해서는 컴퓨터가 이해할 수 있도록 텍스트를 적절히 숫자로 변환해야 합니다. 단어를 표현하는 방법에 따라서 자연어 처리의 성&amp;hellip;&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/22644&quot; data-og-url=&quot;https://wikidocs.net/22644&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bVHDbz/hyWKKMvgcX/CaircO0JaKBCRSSlQJppc0/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130&quot;&gt;&lt;a href=&quot;https://wikidocs.net/22644&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/22644&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bVHDbz/hyWKKMvgcX/CaircO0JaKBCRSSlQJppc0/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;09. 워드 임베딩(Word Embedding)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;텍스트를 컴퓨터가 이해하고, 효율적으로 처리하게 하기 위해서는 컴퓨터가 이해할 수 있도록 텍스트를 적절히 숫자로 변환해야 합니다. 단어를 표현하는 방법에 따라서 자연어 처리의 성&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;09.&amp;nbsp;워드&amp;nbsp;임베딩&amp;nbsp;(Word&amp;nbsp;Embedding)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;09-01&amp;nbsp;워드&amp;nbsp;임베딩&amp;nbsp;(Word&amp;nbsp;Embedding)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;nbsp;밀집&amp;nbsp;표현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;희소&amp;nbsp;표현과&amp;nbsp;반대되는&amp;nbsp;표현 &lt;br /&gt;-&amp;nbsp;벡터의&amp;nbsp;차원을&amp;nbsp;단어&amp;nbsp;집합의&amp;nbsp;크기로&amp;nbsp;상정하지&amp;nbsp;않고,&amp;nbsp;사용자가&amp;nbsp;설정한&amp;nbsp;값으로&amp;nbsp;모든&amp;nbsp;단어의&amp;nbsp;벡터&amp;nbsp;표현의&amp;nbsp;차원을&amp;nbsp;맞춤 &lt;br /&gt;-&amp;nbsp;0과&amp;nbsp;1&amp;nbsp;값만&amp;nbsp;가지지&amp;nbsp;않고&amp;nbsp;&lt;u&gt;실수값을&amp;nbsp;가지게&amp;nbsp;됨&lt;/u&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;nbsp;워드&amp;nbsp;임베딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단어를 밀집 벡터(dense vector)의 형태로 표현하는 방법을 말함 &lt;br /&gt;-&amp;nbsp;이&amp;nbsp;밀집&amp;nbsp;벡터를&amp;nbsp;워드&amp;nbsp;임베딩&amp;nbsp;과정을&amp;nbsp;통해&amp;nbsp;나온&amp;nbsp;결과라고&amp;nbsp;하여&amp;nbsp;임베딩&amp;nbsp;벡터라고도&amp;nbsp;함 &lt;br /&gt;- 워드 임베딩 방법론 예시 : &lt;b&gt;LSA, Word2Vec, FastText, Glove&lt;/b&gt; 등 &lt;br /&gt;-&amp;nbsp;케라스의&amp;nbsp;Embedding()&amp;nbsp;:&amp;nbsp;단어를&amp;nbsp;랜덤한&amp;nbsp;값을&amp;nbsp;가지는&amp;nbsp;밀집&amp;nbsp;벡터로&amp;nbsp;변환한&amp;nbsp;후,&amp;nbsp;인공&amp;nbsp;신경망의&amp;nbsp;가중치를&amp;nbsp;학습하는&amp;nbsp;것과&amp;nbsp;같은&amp;nbsp;방식으로&amp;nbsp;단어&amp;nbsp;벡터를&amp;nbsp;학습. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;09-02&amp;nbsp;워드투벡터(Word2Vec)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;nbsp;&amp;nbsp;분산&amp;nbsp;표현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 분산표현방법 : 분포 가설이라는 가정 하에 만들어진 표현 방법. 이 가정은 '비슷한 문맥에서 등장하는 단어들은 비슷한 의미를 가진다'라는 가정. &lt;br /&gt;-&amp;nbsp;단어의&amp;nbsp;의미를&amp;nbsp;여러&amp;nbsp;차원에다가&amp;nbsp;분산하여&amp;nbsp;표현.&amp;nbsp;=&amp;gt;&amp;nbsp;단어&amp;nbsp;벡터&amp;nbsp;간&amp;nbsp;유의미한&amp;nbsp;&lt;u&gt;유사도&amp;nbsp;계산&amp;nbsp;가능.&lt;/u&gt; &lt;br /&gt;- 분산 표현의 대표적인 학습 방법이 Word2Vec &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;nbsp;Word2Vec&amp;nbsp;학습&amp;nbsp;방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;CBOW와&amp;nbsp;Skip-Gram&amp;nbsp;두가지&amp;nbsp;방식이&amp;nbsp;있음 &lt;br /&gt;-&amp;nbsp;&lt;b&gt;CBOW&lt;/b&gt;&amp;nbsp;:&amp;nbsp;주변에&amp;nbsp;있는&amp;nbsp;단어들을&amp;nbsp;입력으로&amp;nbsp;&lt;u&gt;중간에&amp;nbsp;있는&amp;nbsp;단어들을&amp;nbsp;예측&lt;/u&gt;하는&amp;nbsp;방법 &lt;br /&gt;-&amp;nbsp;&lt;b&gt;Skip-Gram&lt;/b&gt;&amp;nbsp;:&amp;nbsp;중간에&amp;nbsp;있는&amp;nbsp;단어들을&amp;nbsp;입력으로&amp;nbsp;&lt;u&gt;주변&amp;nbsp;단어들을&amp;nbsp;예측&lt;/u&gt;하는&amp;nbsp;방법 &lt;br /&gt;-&amp;nbsp;CBOW&amp;nbsp;예시&amp;nbsp;:&amp;nbsp;'The&amp;nbsp;fat&amp;nbsp;cat&amp;nbsp;sat&amp;nbsp;on&amp;nbsp;the&amp;nbsp;mat'&amp;nbsp;같은&amp;nbsp;예문이&amp;nbsp;있는데,&amp;nbsp;['The',&amp;nbsp;'fat',&amp;nbsp;'cat',&amp;nbsp;'on',&amp;nbsp;'the',&amp;nbsp;'met']으로부터&amp;nbsp;sat을&amp;nbsp;예측하는&amp;nbsp;것.&amp;nbsp;이때&amp;nbsp;예측해야&amp;nbsp;하는&amp;nbsp;단어&amp;nbsp;sat을&amp;nbsp;중심단어(center&amp;nbsp;word)라고&amp;nbsp;하고,&amp;nbsp;예측에&amp;nbsp;사용되는&amp;nbsp;단어들을&amp;nbsp;주변&amp;nbsp;단어(context&amp;nbsp;word)라고&amp;nbsp;함. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;nbsp;Word2Vec&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;Word2Vec은&amp;nbsp;은닉층이&amp;nbsp;다수인&amp;nbsp;딥&amp;nbsp;러닝&amp;nbsp;모델이&amp;nbsp;아닌&amp;nbsp;&lt;u&gt;은닉층이&amp;nbsp;1개&lt;/u&gt;인&amp;nbsp;얕은&amp;nbsp;신경망&amp;nbsp;(shallow&amp;nbsp;neural&amp;nbsp;network)임.&amp;nbsp;또한&amp;nbsp;이&amp;nbsp;은닉층은&amp;nbsp;일반적인&amp;nbsp;은닉층과&amp;nbsp;달리&amp;nbsp;&lt;u&gt;활성화&amp;nbsp;함수가&amp;nbsp;존재하지&amp;nbsp;않으&lt;/u&gt;며&amp;nbsp;룩업&amp;nbsp;테이블이라는&amp;nbsp;연산을&amp;nbsp;담당하는&amp;nbsp;층으로&amp;nbsp;&lt;b&gt;투사층&lt;/b&gt;(projection&amp;nbsp;layer)이라고&amp;nbsp;부르기도&amp;nbsp;함. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;nbsp;CBOW&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 중심 단어를 예측하기 위해서 앞, 뒤로 몇 개의 단어를 볼지를 결정해야 하는데, 이 범위를 &lt;b&gt;윈도우&lt;/b&gt; (window)라고 함. &lt;br /&gt;-&amp;nbsp;슬라이딩&amp;nbsp;윈도우&amp;nbsp;:&amp;nbsp;윈도우&amp;nbsp;크기가&amp;nbsp;정해지면&amp;nbsp;윈도우를&amp;nbsp;옆으로&amp;nbsp;움직여서&amp;nbsp;주변&amp;nbsp;단어와&amp;nbsp;중심&amp;nbsp;단어의&amp;nbsp;선택츨&amp;nbsp;변경해가며&amp;nbsp;학습을&amp;nbsp;위한&amp;nbsp;데이터&amp;nbsp;셋을&amp;nbsp;만드는&amp;nbsp;방법 &lt;br /&gt;-&amp;nbsp;입력층의&amp;nbsp;입력으로&amp;nbsp;앞,&amp;nbsp;뒤로&amp;nbsp;사용자가&amp;nbsp;정한&amp;nbsp;윈도우&amp;nbsp;범위&amp;nbsp;안에&amp;nbsp;있는&amp;nbsp;주변&amp;nbsp;단어들의&amp;nbsp;원-핫&amp;nbsp;벡터가,&amp;nbsp;출력층에서는&amp;nbsp;예측하고자&amp;nbsp;하는&amp;nbsp;중간&amp;nbsp;단어의&amp;nbsp;원-핫&amp;nbsp;벡터가&amp;nbsp;레이블로&amp;nbsp;필요함. &lt;br /&gt;-&amp;nbsp;투사층의&amp;nbsp;크기가&amp;nbsp;M이면,&amp;nbsp;임베딩하고&amp;nbsp;난&amp;nbsp;벡터의&amp;nbsp;차원도&amp;nbsp;M.&amp;nbsp;&amp;nbsp; &lt;br /&gt;-&amp;nbsp;입력벡터가&amp;nbsp;원-핫&amp;nbsp;벡터이기&amp;nbsp;때문에&amp;nbsp;i번째&amp;nbsp;인덱스에만&amp;nbsp;1&amp;nbsp;값을&amp;nbsp;가짐.&amp;nbsp;-&amp;gt;&amp;nbsp;입력&amp;nbsp;벡터와&amp;nbsp;가중치&amp;nbsp;W&amp;nbsp;행렬의&amp;nbsp;곱은&amp;nbsp;사실&amp;nbsp;W행렬의&amp;nbsp;i번째&amp;nbsp;행을&amp;nbsp;그대로&amp;nbsp;읽어&amp;nbsp;오는&amp;nbsp;것과&amp;nbsp;(lookup)&amp;nbsp;동일.&amp;nbsp;-&amp;gt;&amp;nbsp;이&amp;nbsp;작업을&amp;nbsp;&lt;u&gt;룩업&amp;nbsp;테이블&lt;/u&gt;이라고&amp;nbsp;함. &lt;br /&gt;-&amp;nbsp;이렇게&amp;nbsp;주변단어의&amp;nbsp;원-핫&amp;nbsp;벡터에&amp;nbsp;대하여&amp;nbsp;가중치&amp;nbsp;W가&amp;nbsp;곱해져&amp;nbsp;생겨진&amp;nbsp;결과&amp;nbsp;벡터들은&amp;nbsp;투사층에서&amp;nbsp;만나&amp;nbsp;벡터들의&amp;nbsp;평균인&amp;nbsp;벡터를&amp;nbsp;구하게&amp;nbsp;됨.&amp;nbsp;(Skip-Gram과&amp;nbsp;차이점.&amp;nbsp;Skip-Gram은&amp;nbsp;중심&amp;nbsp;단어&amp;nbsp;하나이기에&amp;nbsp;투사층에서&amp;nbsp;벡터의&amp;nbsp;평균을&amp;nbsp;구하지&amp;nbsp;않음) &lt;br /&gt;-&amp;nbsp;이렇게&amp;nbsp;구해진&amp;nbsp;평균&amp;nbsp;벡터는&amp;nbsp;두번째&amp;nbsp;가중치&amp;nbsp;행렬&amp;nbsp;W'와&amp;nbsp;곱해짐.&amp;nbsp;곱셈의&amp;nbsp;결과로는&amp;nbsp;원-핫&amp;nbsp;벡터들ㅇ과&amp;nbsp;차원이&amp;nbsp;V로&amp;nbsp;동일한&amp;nbsp;벡터가&amp;nbsp;나옴. &lt;br /&gt;-&amp;nbsp;이&amp;nbsp;벡터는&amp;nbsp;소프트맥스&amp;nbsp;함수를&amp;nbsp;지나면서&amp;nbsp;각&amp;nbsp;원소의&amp;nbsp;값은&amp;nbsp;0과&amp;nbsp;1&amp;nbsp;사이의&amp;nbsp;실수로,&amp;nbsp;총&amp;nbsp;합은&amp;nbsp;1이&amp;nbsp;됨.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;오차를&amp;nbsp;줄이기&amp;nbsp;위해&amp;nbsp;&lt;u&gt;손실함수로&amp;nbsp;크로스&amp;nbsp;엔트로피&amp;nbsp;함수&lt;/u&gt;&amp;nbsp;사용. &lt;br /&gt;-&amp;nbsp;역전파를&amp;nbsp;수행하여&amp;nbsp;W와&amp;nbsp;W'가&amp;nbsp;학습됨.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;nbsp;Skip-Gram&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;중심&amp;nbsp;단어에&amp;nbsp;대해서&amp;nbsp;주변&amp;nbsp;단어를&amp;nbsp;예측하므로&amp;nbsp;투사층에서&amp;nbsp;벡터의&amp;nbsp;평균을&amp;nbsp;구하는&amp;nbsp;과정이&amp;nbsp;&amp;nbsp;없음&amp;nbsp;(입력이&amp;nbsp;하나였기&amp;nbsp;때문에&amp;nbsp;평균&amp;nbsp;구할&amp;nbsp;게&amp;nbsp;없음) &lt;br /&gt;-&amp;nbsp;전반적으로&amp;nbsp;&lt;u&gt;CBOW보다&amp;nbsp;성능이&amp;nbsp;좋다&lt;/u&gt;고&amp;nbsp;알려짐. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;NNLM&amp;nbsp;VS.&amp;nbsp;Word2Vec&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;NNLM은&amp;nbsp;단어&amp;nbsp;벡터&amp;nbsp;간&amp;nbsp;유사도를&amp;nbsp;구할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;워드&amp;nbsp;임베딩의&amp;nbsp;개념을&amp;nbsp;도입.&amp;nbsp;NNLM의&amp;nbsp;느린&amp;nbsp;학습&amp;nbsp;속도와&amp;nbsp;정확도를&amp;nbsp;개선하여&amp;nbsp;탄생한&amp;nbsp;것이&amp;nbsp;Word2Vec &lt;br /&gt;-&amp;nbsp;&lt;u&gt;NNLM은&amp;nbsp;다음&amp;nbsp;단어를&amp;nbsp;예측&lt;/u&gt;하는&amp;nbsp;것이&amp;nbsp;목적,&amp;nbsp;Word2Vec(CBOW)은&amp;nbsp;워드&amp;nbsp;임베딩&amp;nbsp;자체가&amp;nbsp;목적이므로&amp;nbsp;다음&amp;nbsp;단어가&amp;nbsp;아닌&amp;nbsp;중심&amp;nbsp;단어를&amp;nbsp;예측하게&amp;nbsp;하여&amp;nbsp;학습.&amp;nbsp;=&amp;gt;&amp;nbsp;예측&amp;nbsp;단어의&amp;nbsp;이전&amp;nbsp;단어들만을&amp;nbsp;참고하였던&amp;nbsp;NNLM과&amp;nbsp;달리&amp;nbsp;예측&amp;nbsp;단어의&amp;nbsp;전,&amp;nbsp;후&amp;nbsp;단어들을&amp;nbsp;모두&amp;nbsp;참고. &lt;br /&gt;-&amp;nbsp;Word2Vec은&amp;nbsp;우선&amp;nbsp;NNLM에&amp;nbsp;존재하던&amp;nbsp;활성화&amp;nbsp;함수가&amp;nbsp;있는&amp;nbsp;은닉층을&amp;nbsp;제거함.&amp;nbsp;=&amp;gt;&amp;nbsp;투사층&amp;nbsp;다음에&amp;nbsp;출력층&amp;nbsp;연결. &lt;br /&gt;-&amp;nbsp;Word2Vec가&amp;nbsp;NNLM보다&amp;nbsp;학습&amp;nbsp;속도가&amp;nbsp;좋은&amp;nbsp;이유는&amp;nbsp;은닉층을&amp;nbsp;제거한&amp;nbsp;것뿐&amp;nbsp;아니라&amp;nbsp;추가적으로&amp;nbsp;사용되는&amp;nbsp;기법&amp;nbsp;덕분.&amp;nbsp;대표적으로&amp;nbsp;계층적&amp;nbsp;소프트맥스와&amp;nbsp;네거티브&amp;nbsp;샘플링이&amp;nbsp;있음.&amp;nbsp;&amp;nbsp;(이&amp;nbsp;책에선&amp;nbsp;네거티브&amp;nbsp;사용)&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;&lt;br /&gt;&lt;b&gt;09-03&amp;nbsp;영어/한국어&amp;nbsp;Word2Vec&amp;nbsp;실습&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;파이썬의 gensim 패키지 &lt;b&gt;Word2Vec&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Word2Vec의 하이퍼파라미터값)&lt;br /&gt;-&amp;nbsp;vector_size&amp;nbsp;=&amp;nbsp;워드&amp;nbsp;벡터의&amp;nbsp;특징&amp;nbsp;값.&amp;nbsp;즉&amp;nbsp;임베딩&amp;nbsp;된&amp;nbsp;벡터의&amp;nbsp;차원. &lt;br /&gt;-&amp;nbsp;window&amp;nbsp;=&amp;nbsp;컨텍스트&amp;nbsp;윈도우&amp;nbsp;크기 &lt;br /&gt;-&amp;nbsp;min_count&amp;nbsp;=&amp;nbsp;단어&amp;nbsp;최소&amp;nbsp;빈도&amp;nbsp;수&amp;nbsp;제한 &lt;br /&gt;-&amp;nbsp;workers&amp;nbsp;=&amp;nbsp;학습을&amp;nbsp;위한&amp;nbsp;프로세스&amp;nbsp;수 &lt;br /&gt;-&amp;nbsp;sg&amp;nbsp;=&amp;nbsp;0은&amp;nbsp;CBOW,&amp;nbsp;1은&amp;nbsp;Skip-Gram &lt;br /&gt;-&amp;nbsp;model.wv.most_similar('단어')&amp;nbsp;:&amp;nbsp;입력한&amp;nbsp;단어와&amp;nbsp;유사한&amp;nbsp;단어들과&amp;nbsp;각&amp;nbsp;단어의&amp;nbsp;유사도도&amp;nbsp;알려줌. &lt;br /&gt;-&amp;nbsp;model.similarity('단어1',&amp;nbsp;'단어2')&amp;nbsp;:&amp;nbsp;단어1,&amp;nbsp;단어2의&amp;nbsp;유사도&amp;nbsp;알려줌.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;사전&amp;nbsp;훈련된&amp;nbsp;Word2Vec&amp;nbsp;임베딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;자연어&amp;nbsp;처리&amp;nbsp;작업을&amp;nbsp;할&amp;nbsp;때,&amp;nbsp;케라스의&amp;nbsp;Embedding()를&amp;nbsp;사용하여&amp;nbsp;갖고&amp;nbsp;있는&amp;nbsp;훈련&amp;nbsp;데이터로부터&amp;nbsp;처음부터&amp;nbsp;임베딩&amp;nbsp;벡터를&amp;nbsp;훈련시키기도&amp;nbsp;하지만,&amp;nbsp;방대한&amp;nbsp;데이터로&amp;nbsp;사전에&amp;nbsp;훈련된&amp;nbsp;워드&amp;nbsp;임베딩을&amp;nbsp;가져와&amp;nbsp;해당&amp;nbsp;벡터들의&amp;nbsp;값을&amp;nbsp;하는&amp;nbsp;작업에&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있음. &lt;br /&gt;-&amp;nbsp;예)&amp;nbsp;감성&amp;nbsp;분류&amp;nbsp;작업을&amp;nbsp;하는데&amp;nbsp;훈련&amp;nbsp;데이터의&amp;nbsp;양이&amp;nbsp;부족함&amp;nbsp;-&amp;gt;&amp;nbsp;다른&amp;nbsp;방대한&amp;nbsp;데이터를&amp;nbsp;Word2Vec이나&amp;nbsp;GLove&amp;nbsp;등으로&amp;nbsp;사전에&amp;nbsp;학습시켜놓은&amp;nbsp;임베딩&amp;nbsp;벡터들을&amp;nbsp;가지고&amp;nbsp;와서&amp;nbsp;모델의&amp;nbsp;입력으로&amp;nbsp;사용하는&amp;nbsp;것이&amp;nbsp;때로는&amp;nbsp;더&amp;nbsp;좋은&amp;nbsp;성능을&amp;nbsp;냄.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;b&gt;09-04&amp;nbsp;네거티브&amp;nbsp;샘플링을&amp;nbsp;이용한&amp;nbsp;Word2Vec&amp;nbsp;구현&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;nbsp;&lt;b&gt;네거티브&amp;nbsp;샘플링&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;Word2Vec이&amp;nbsp;학습&amp;nbsp;과정에서&amp;nbsp;전체&amp;nbsp;단어&amp;nbsp;집합이&amp;nbsp;아닌&amp;nbsp;일부&amp;nbsp;단어&amp;nbsp;집합에만&amp;nbsp;집중할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;하는&amp;nbsp;방법. &lt;br /&gt;-&amp;nbsp;현재&amp;nbsp;집중하고&amp;nbsp;있는&amp;nbsp;단어가&amp;nbsp;'고양이',&amp;nbsp;'귀여운'이라면,&amp;nbsp;여기에&amp;nbsp;'돈가스',&amp;nbsp;'컴퓨터',&amp;nbsp;'회의실'과&amp;nbsp;같은&amp;nbsp;단어&amp;nbsp;집합에서&amp;nbsp;무작위로&amp;nbsp;선택한&amp;nbsp;주변&amp;nbsp;단어가&amp;nbsp;아닌&amp;nbsp;단어들을&amp;nbsp;일부를&amp;nbsp;가져옴.&amp;nbsp;=&amp;gt;&amp;nbsp;전체&amp;nbsp;단어집합이&amp;nbsp;아닌&amp;nbsp;훨씬&amp;nbsp;작은&amp;nbsp;단어&amp;nbsp;집합을&amp;nbsp;만들어&amp;nbsp;두고&amp;nbsp;이진&amp;nbsp;분류&amp;nbsp;문제로&amp;nbsp;변환.&amp;nbsp;=&amp;gt;&amp;nbsp;주변&amp;nbsp;단어들을&amp;nbsp;긍정(positive),&amp;nbsp;랜덤으로&amp;nbsp;샘플링&amp;nbsp;된&amp;nbsp;단어들을&amp;nbsp;부정(negative)로&amp;nbsp;레이블링&amp;nbsp;한다면&amp;nbsp;이진&amp;nbsp;분류&amp;nbsp;문제를&amp;nbsp;위한&amp;nbsp;데이터셋이&amp;nbsp;됨.&amp;nbsp;=&amp;gt;&amp;nbsp;연산량에서&amp;nbsp;효율적임&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;네거티브&amp;nbsp;샘플링&amp;nbsp;Skip-Gram&amp;nbsp;(SGNS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;Skip-Gram이&amp;nbsp;중심단어를&amp;nbsp;입력으로,&amp;nbsp;주변단어를&amp;nbsp;출력이었다면,&amp;nbsp;SGNS는&amp;nbsp;중심&amp;nbsp;단어와&amp;nbsp;주변&amp;nbsp;단어가&amp;nbsp;모두&amp;nbsp;입력이고&amp;nbsp;이&amp;nbsp;두&amp;nbsp;단어가&amp;nbsp;실제로&amp;nbsp;윈도우&amp;nbsp;크기&amp;nbsp;내에&amp;nbsp;존재하는&amp;nbsp;이웃&amp;nbsp;관계인지&amp;nbsp;그&amp;nbsp;확률을&amp;nbsp;예측함. &lt;br /&gt;-&amp;nbsp;&lt;u&gt;중심단어와&amp;nbsp;주변&amp;nbsp;단어를&amp;nbsp;각각&amp;nbsp;입력1,&amp;nbsp;입력2로&amp;nbsp;두고&lt;/u&gt;,&amp;nbsp;이&amp;nbsp;둘은&amp;nbsp;실제로&amp;nbsp;윈도우&amp;nbsp;크기&amp;nbsp;내에서&amp;nbsp;이웃&amp;nbsp;관계였으므로&amp;nbsp;&lt;u&gt;레이블을&amp;nbsp;&lt;b&gt;1&lt;/b&gt;&lt;/u&gt;로&amp;nbsp;둠.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;실제로&lt;u&gt;&amp;nbsp;입력&amp;nbsp;1(중심단어)와&amp;nbsp;주변&amp;nbsp;단어&amp;nbsp;관계가&amp;nbsp;아닌&amp;nbsp;단어들을&amp;nbsp;입력2로&amp;nbsp;두고&lt;/u&gt;&amp;nbsp;(단어집합에서&amp;nbsp;랜덤으로&amp;nbsp;선택한&amp;nbsp;단어들)&amp;nbsp;레이블을&lt;b&gt;&amp;nbsp;0&lt;/b&gt;으로&amp;nbsp;함.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;중심&amp;nbsp;단어와&amp;nbsp;주변&amp;nbsp;단어의&amp;nbsp;내적값을&amp;nbsp;이&amp;nbsp;모델의&amp;nbsp;예측값으로&amp;nbsp;하고,&amp;nbsp;레이블과의&amp;nbsp;오차로부터&amp;nbsp;역전파하여&amp;nbsp;중심&amp;nbsp;단어와&amp;nbsp;주변&amp;nbsp;다넝의&amp;nbsp;임베딩&amp;nbsp;벡터값을&amp;nbsp;업데이트.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;네거티브&amp;nbsp;샘플링을&amp;nbsp;통한&amp;nbsp;데이터셋&amp;nbsp;구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;케라스의&amp;nbsp;skipgrams를&amp;nbsp;사용 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;09-05&amp;nbsp;&lt;b&gt;글로브&lt;/b&gt;(Glove;&amp;nbsp;Global&amp;nbsp;Vectors&amp;nbsp;for&amp;nbsp;Word&amp;nbsp;Representation)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;nbsp;글로브&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 카운트 기반과 예측 기반을 모두 사용하는 방법론으로, 기존의 카운트 기반의 LSA, 예측 기반의 Word2Vec의 단점을 지적하며 이를 보완한다는 목적으로 나옴. &lt;br /&gt;-&amp;nbsp;현재까지의&amp;nbsp;연구에&amp;nbsp;따르면&amp;nbsp;단정적으로&amp;nbsp;Word2Vec와&amp;nbsp;Glove&amp;nbsp;중&amp;nbsp;어떤&amp;nbsp;것이&amp;nbsp;더&amp;nbsp;뛰어나다고&amp;nbsp;말할&amp;nbsp;순&amp;nbsp;없고&amp;nbsp;두&amp;nbsp;가지를&amp;nbsp;사용해보고&amp;nbsp;성능이&amp;nbsp;더&amp;nbsp;좋은&amp;nbsp;것을&amp;nbsp;사용하면&amp;nbsp;됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;기존&amp;nbsp;방법론&amp;nbsp;비판&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;LSA는&amp;nbsp;카운트&amp;nbsp;기반으로&amp;nbsp;코퍼스의&amp;nbsp;전체적인&amp;nbsp;통계&amp;nbsp;정보를&amp;nbsp;고려하기는&amp;nbsp;하지만,&amp;nbsp;왕:남자&amp;nbsp;=&amp;nbsp;여왕:?&amp;nbsp;(정답은&amp;nbsp;여자)와&amp;nbsp;같은&amp;nbsp;단어&amp;nbsp;의미의&amp;nbsp;&lt;u&gt;유추&amp;nbsp;작업에는&amp;nbsp;성능이&amp;nbsp;떨어짐&lt;/u&gt;. &lt;br /&gt;-&amp;nbsp;&lt;b&gt;Word2Vec&lt;/b&gt;는&amp;nbsp;예측&amp;nbsp;기반으로&amp;nbsp;단어&amp;nbsp;간&amp;nbsp;유추&amp;nbsp;작업에는&amp;nbsp;뛰어나지만,&amp;nbsp;임베딩&amp;nbsp;벡터가&amp;nbsp;윈도우&amp;nbsp;크기&amp;nbsp;내에서만&amp;nbsp;주변&amp;nbsp;단어를&amp;nbsp;고려하기에&amp;nbsp;&lt;u&gt;코퍼스의&amp;nbsp;전체적은&amp;nbsp;통계정보를&amp;nbsp;반영하지&amp;nbsp;못함&lt;/u&gt;. &lt;br /&gt;-&amp;nbsp;GLoVe는&amp;nbsp;이러한&amp;nbsp;기존&amp;nbsp;방법론의&amp;nbsp;한계를&amp;nbsp;지적하며,&amp;nbsp;LSA의&amp;nbsp;매커니즘인&amp;nbsp;&lt;u&gt;카운트&amp;nbsp;기반의&amp;nbsp;방법&lt;/u&gt;과&amp;nbsp;Word2Vec의&amp;nbsp;메커니즘인&amp;nbsp;&lt;u&gt;예측&amp;nbsp;기반의&amp;nbsp;방법론&lt;/u&gt;을&amp;nbsp;모두&amp;nbsp;사용함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;윈도우&amp;nbsp;기반&amp;nbsp;동시&amp;nbsp;등장&amp;nbsp;행렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;단어의&amp;nbsp;동시&amp;nbsp;등장&amp;nbsp;행렬&amp;nbsp;:&amp;nbsp;행과&amp;nbsp;열을&amp;nbsp;전체&amp;nbsp;단어&amp;nbsp;집합의&amp;nbsp;단어로&amp;nbsp;구성하고,&amp;nbsp;i&amp;nbsp;단어의&amp;nbsp;윈도우&amp;nbsp;크기&amp;nbsp;내에서&amp;nbsp;k&amp;nbsp;단어가&amp;nbsp;등장한&amp;nbsp;횟수를&amp;nbsp;i행&amp;nbsp;k열에&amp;nbsp;기재한&amp;nbsp;행렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;동시&amp;nbsp;등장&amp;nbsp;확률&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;P(K|i)는&amp;nbsp;동시&amp;nbsp;등장&amp;nbsp;행렬로부터&amp;nbsp;특정&amp;nbsp;단어&amp;nbsp;i의&amp;nbsp;전체&amp;nbsp;등장&amp;nbsp;횟수를&amp;nbsp;카운트하고,&amp;nbsp;특정&amp;nbsp;단어&amp;nbsp;i가&amp;nbsp;등장했을&amp;nbsp;때&amp;nbsp; &lt;br /&gt;어떤&amp;nbsp;단어&amp;nbsp;k가&amp;nbsp;등장한&amp;nbsp;횟수를&amp;nbsp;카운트하여&amp;nbsp;계산한&amp;nbsp;조건부확률.&amp;nbsp;i가&amp;nbsp;중심단어,&amp;nbsp;k&amp;nbsp;주변단어.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;손실&amp;nbsp;함수&amp;nbsp;(Loss&amp;nbsp;Function)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;X&amp;nbsp;:&amp;nbsp;동시&amp;nbsp;등장&amp;nbsp;행렬 &lt;br /&gt;- X_ij : 중심 단어 i가 등장했을 때, 윈도우 내 주변 단어 j가 등장하는 횟수 &lt;br /&gt;-&amp;nbsp;X_i&amp;nbsp;:&amp;nbsp;동시&amp;nbsp;등장&amp;nbsp;행렬에서&amp;nbsp;i행의&amp;nbsp;값을&amp;nbsp;모두&amp;nbsp;더한&amp;nbsp;값 &lt;br /&gt;-&amp;nbsp;P_ik&amp;nbsp;=&amp;nbsp;P(k|i)&amp;nbsp;:&amp;nbsp;중심&amp;nbsp;단어&amp;nbsp;i가&amp;nbsp;등장했을&amp;nbsp;때,&amp;nbsp;윈도우&amp;nbsp;내&amp;nbsp;주변단어&amp;nbsp;k가&amp;nbsp;등장할&amp;nbsp;확률 &lt;br /&gt;-&amp;nbsp;w_i&amp;nbsp;:&amp;nbsp;중심&amp;nbsp;단어&amp;nbsp;i의&amp;nbsp;임베딩&amp;nbsp;벡터 &lt;br /&gt;-&amp;nbsp;~w_k&amp;nbsp;:&amp;nbsp;주변&amp;nbsp;단어&amp;nbsp;k의&amp;nbsp;임베딩&amp;nbsp;벡터 &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;GloVe의&amp;nbsp;아이디어&amp;nbsp;:&amp;nbsp;임베딩&amp;nbsp;된&lt;b&gt;&amp;nbsp;중심&amp;nbsp;단어와&amp;nbsp;주변&amp;nbsp;단어&amp;nbsp;벡터의&amp;nbsp;내적&lt;/b&gt;이&amp;nbsp;전체&amp;nbsp;코퍼스에서의&amp;nbsp;&lt;b&gt;동시&amp;nbsp;등장&amp;nbsp;확률&lt;/b&gt;이&amp;nbsp;되도록&amp;nbsp;만드는&amp;nbsp;것.&amp;nbsp;-&amp;gt;&amp;nbsp;이를&amp;nbsp;만족하도록&amp;nbsp;임베딩&amp;nbsp;벡터를&amp;nbsp;만드는&amp;nbsp;것이&amp;nbsp;목표 &lt;br /&gt;-&amp;nbsp;dot&amp;nbsp;product(w_i,&amp;nbsp;~w_k)가&amp;nbsp;P(k}i)와&amp;nbsp;비슷하도록&amp;nbsp;하기.&amp;nbsp;더&amp;nbsp;정확히는&amp;nbsp;&lt;b&gt;log&amp;nbsp;P(k|i)&lt;/b&gt;와&amp;nbsp;비슷하도록!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&lt;b&gt;09-06 패스트텍스트(FastText)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;Word2Vec의&amp;nbsp;확장이라고&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있으나,&amp;nbsp;차이점은&amp;nbsp;Word2Vec는&amp;nbsp;단어를&amp;nbsp;쪼개질&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;단위로&amp;nbsp;생각한다면,&amp;nbsp;FastText는&amp;nbsp;&lt;u&gt;하나의&amp;nbsp;단어&amp;nbsp;안에&amp;nbsp;여러&amp;nbsp;단어들이&amp;nbsp;존재하는&amp;nbsp;것&lt;/u&gt;으로&amp;nbsp;간주함.&amp;nbsp;내부&amp;nbsp;단어&amp;nbsp;즉&amp;nbsp;서브워드를&amp;nbsp;고려하여&amp;nbsp;학습.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; &lt;b&gt;내부 단어&lt;/b&gt;(subword)의 학습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;FastText에서는&amp;nbsp;각&amp;nbsp;단어는&amp;nbsp;글자&amp;nbsp;단위&amp;nbsp;n-gram의&amp;nbsp;구성으로&amp;nbsp;취급.&amp;nbsp;n을&amp;nbsp;몇으로&amp;nbsp;결정하는&amp;nbsp;지에&amp;nbsp;따라서&amp;nbsp;단어들이&amp;nbsp;얼마나&amp;nbsp;분리되는&amp;nbsp;지&amp;nbsp;결정.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;n을&amp;nbsp;3으로&amp;nbsp;잡은&amp;nbsp;트라이그램의&amp;nbsp;경우,&amp;nbsp;apple은&amp;nbsp;app,&amp;nbsp;ppl,&amp;nbsp;ple로&amp;nbsp;분리하고&amp;nbsp;이들을&amp;nbsp;벡터로&amp;nbsp;만듦.&amp;nbsp;더&amp;nbsp;정확히는&amp;nbsp;시작과&amp;nbsp;끝을&amp;nbsp;의미하는&amp;nbsp;&amp;lt;,&amp;gt;를&amp;nbsp;도입하여&amp;nbsp;아래의&amp;nbsp;5개&amp;nbsp;내부&amp;nbsp;단어&amp;nbsp;(subword)&amp;nbsp;토큰을&amp;nbsp;벡터로&amp;nbsp;만듦. &lt;br /&gt;-&amp;nbsp;n=3인&amp;nbsp;경우,&amp;nbsp;&amp;lt;ap,&amp;nbsp;app,&amp;nbsp;ppl,&amp;nbsp;ple,&amp;nbsp;le&amp;gt;&amp;nbsp;=&amp;gt;&amp;nbsp;내부단어&amp;nbsp;벡터.&amp;nbsp;여기에&amp;nbsp;추가적으로&amp;nbsp;기존&amp;nbsp;단어에&amp;nbsp;&amp;lt;와&amp;nbsp;&amp;gt;를&amp;nbsp;붙인&amp;lt;apple&amp;gt;&amp;nbsp;토큰을&amp;nbsp;벡터화함. &lt;br /&gt;-&amp;nbsp;&amp;nbsp;실제&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;n의&amp;nbsp;최소값과&amp;nbsp;최대값으로&amp;nbsp;범위를&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있는데,&amp;nbsp;기본값으로는&amp;nbsp;각각&amp;nbsp;3과&amp;nbsp;6으로&amp;nbsp;설정되어져&amp;nbsp;있음.&amp;nbsp;최소값&amp;nbsp;3,&amp;nbsp;최대값&amp;nbsp;6인&amp;nbsp;경우&amp;nbsp;단어&amp;nbsp;apple에&amp;nbsp;대해서&amp;nbsp;FastText가&amp;nbsp;벡터화한&amp;nbsp;내부단어&amp;nbsp;=&amp;gt;&amp;nbsp;&amp;lt;ap,&amp;nbsp;app,&amp;nbsp;ppl,&amp;nbsp;ple,&amp;nbsp;le&amp;gt;,&amp;nbsp;&amp;lt;app,&amp;nbsp;appl,&amp;nbsp;pple,&amp;nbsp;ple&amp;gt;,&amp;nbsp;&amp;lt;appl,&amp;nbsp;pple&amp;gt;,&amp;nbsp;...,&amp;nbsp;&amp;lt;apple&amp;gt; &lt;br /&gt;-&amp;nbsp;내부단어들을&amp;nbsp;벡터화한다는&amp;nbsp;것은&amp;nbsp;그&amp;nbsp;단어들에&amp;nbsp;대해&amp;nbsp;Word2Vec을&amp;nbsp;수행한다는&amp;nbsp;것.&amp;nbsp;위와&amp;nbsp;같이&amp;nbsp;내부단어들의&amp;nbsp;벡터값을&amp;nbsp;얻었다면,&amp;nbsp;단어&amp;nbsp;apple의&amp;nbsp;벡터값은&amp;nbsp;저&amp;nbsp;위&amp;nbsp;벡터값들의&amp;nbsp;총&amp;nbsp;합.&amp;nbsp;&amp;nbsp;=&amp;gt;&amp;nbsp;apple&amp;nbsp;=&amp;nbsp;&amp;lt;ap+app+ppl+ple+le&amp;gt;&amp;nbsp;+&amp;nbsp;&amp;lt;app+appl+pple+ple&amp;gt;&amp;nbsp;+&amp;nbsp;&amp;lt;appl+pple&amp;gt;&amp;nbsp;+,&amp;nbsp;...,&amp;nbsp;+&amp;nbsp;&amp;lt;apple&amp;gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;모르는&amp;nbsp;단어(Out&amp;nbsp;of&amp;nbsp;Vocabulary,&amp;nbsp;OOV)에&amp;nbsp;대한&amp;nbsp;대응 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&amp;nbsp;FastText의&amp;nbsp;인공&amp;nbsp;신경망을&amp;nbsp;학습한&amp;nbsp;후에는&amp;nbsp;데이터&amp;nbsp;셋의&amp;nbsp;모든&amp;nbsp;단어의&amp;nbsp;각&amp;nbsp;n-gram에&amp;nbsp;대해서&amp;nbsp;워드&amp;nbsp;임베딩이&amp;nbsp;됨.&amp;nbsp;&amp;nbsp;=&amp;gt;&amp;nbsp;데이터&amp;nbsp;셋이&amp;nbsp;충분하다면&amp;nbsp;내부&amp;nbsp;단어를&amp;nbsp;통해&amp;nbsp;모르는&amp;nbsp;단어에&amp;nbsp;대해서도&amp;nbsp;다른&amp;nbsp;단어와의&amp;nbsp;유사도를&amp;nbsp;계산할&amp;nbsp;수&amp;nbsp;있음. &lt;br /&gt;-&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;FastText에서&amp;nbsp;birthplace(출생지)란&amp;nbsp;단어를&amp;nbsp;학습하지&amp;nbsp;않은&amp;nbsp;상태인데,&amp;nbsp;다른&amp;nbsp;단어에서&amp;nbsp;birth와&amp;nbsp;place라는&amp;nbsp;내부&amp;nbsp;단어가&amp;nbsp;있었다면,&amp;nbsp;FastText는&amp;nbsp;birthplace의&amp;nbsp;벡터를&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있음.&amp;nbsp;이는&amp;nbsp;모르는&amp;nbsp;단어에&amp;nbsp;제대로&amp;nbsp;대처할&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;Word2Vec,&amp;nbsp;Glove와&amp;nbsp;다른&amp;nbsp;점. &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;단어&amp;nbsp;집합&amp;nbsp;내&amp;nbsp;빈도&amp;nbsp;수가&amp;nbsp;적었던&amp;nbsp;단어(Rare&amp;nbsp;Word)에&amp;nbsp;대한&amp;nbsp;대응 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;Word2Vec의&amp;nbsp;경우&amp;nbsp;등장&amp;nbsp;빈도&amp;nbsp;수가&amp;nbsp;적은&amp;nbsp;단어에&amp;nbsp;대해서&amp;nbsp;임베딩의&amp;nbsp;정확도가&amp;nbsp;높지&amp;nbsp;않다는&amp;nbsp;단점이&amp;nbsp;&amp;nbsp;있음. &lt;br /&gt;-&amp;nbsp;FastText의&amp;nbsp;경우,&amp;nbsp;희귀&amp;nbsp;단어라도&amp;nbsp;&lt;u&gt;그&amp;nbsp;단어의&amp;nbsp;n-gram이&amp;nbsp;다른&amp;nbsp;단어의&amp;nbsp;n-gram과&amp;nbsp;겹치는&amp;nbsp;경우&lt;/u&gt;라면&amp;nbsp;비교적&amp;nbsp;높은&amp;nbsp;임베딩&amp;nbsp;벡터값을&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있음&amp;nbsp; &lt;br /&gt;-&amp;nbsp;노이즈가&amp;nbsp;많은&amp;nbsp;코퍼스에서&amp;nbsp;강점을&amp;nbsp;가지는&amp;nbsp;것도&amp;nbsp;같은&amp;nbsp;이유.&amp;nbsp;실제&amp;nbsp;많은&amp;nbsp;비정형&amp;nbsp;데이터에는&amp;nbsp;&lt;u&gt;오타나&amp;nbsp;맞춤법이&amp;nbsp;틀린&amp;nbsp;단어&lt;/u&gt;가&amp;nbsp;섞여있는데,&amp;nbsp;이&amp;nbsp;단어는&amp;nbsp;&lt;u&gt;희귀&amp;nbsp;단어&lt;/u&gt;가&amp;nbsp;됨.&amp;nbsp;이런&amp;nbsp;단어의&amp;nbsp;경우&amp;nbsp;Word2Vec에서는&amp;nbsp;임베딩이&amp;nbsp;제대로&amp;nbsp;되지&amp;nbsp;않지만&amp;nbsp;&lt;u&gt;FastText는&amp;nbsp;이에&amp;nbsp;대해서도&amp;nbsp;일정&amp;nbsp;수준의&amp;nbsp;성능을&amp;nbsp;보임&lt;/u&gt; &lt;br /&gt;-&amp;nbsp;Word2Vec는&amp;nbsp;모르는&amp;nbsp;단어에&amp;nbsp;대해서는&amp;nbsp;임베딩&amp;nbsp;벡터가&amp;nbsp;존재하지&amp;nbsp;않기에&amp;nbsp;단어의&amp;nbsp;유사도를&amp;nbsp;계산할&amp;nbsp;수&amp;nbsp;없지만,&amp;nbsp;FastText는&amp;nbsp;유사한&amp;nbsp;단어를&amp;nbsp;계산하여&amp;nbsp;출력할&amp;nbsp;수도&amp;nbsp;있음. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;b&gt;09-08&amp;nbsp;사전&amp;nbsp;훈련된&amp;nbsp;워드&amp;nbsp;임베딩(Pre-trained&amp;nbsp;Word&amp;nbsp;Embedding)&lt;/b&gt; &lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; 케라스 임베딩 층&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;케라스&amp;nbsp;Embedding()&amp;nbsp;:&amp;nbsp;인공&amp;nbsp;신경망&amp;nbsp;구조&amp;nbsp;관점에서&amp;nbsp;임베딩&amp;nbsp;층을&amp;nbsp;구현함 &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&lt;b&gt;1)&amp;nbsp;임베딩&amp;nbsp;층은&amp;nbsp;룩업&amp;nbsp;테이블&lt;/b&gt;&amp;nbsp;:&amp;nbsp;임베딩&amp;nbsp;층의&amp;nbsp;입력으로&amp;nbsp;사용하기&amp;nbsp;위해서&amp;nbsp;입력&amp;nbsp;시퀀스의&amp;nbsp;각&amp;nbsp;단어들은&lt;u&gt;&amp;nbsp;모두&amp;nbsp;정수&amp;nbsp;인코딩이&amp;nbsp;되어&amp;nbsp;있어야&amp;nbsp;함.&amp;nbsp;&lt;/u&gt; &lt;br /&gt;-&amp;nbsp;어떤&amp;nbsp;단어&amp;nbsp;-&amp;gt;&amp;nbsp;단어에&amp;nbsp;부여된&amp;nbsp;고유한&amp;nbsp;정수값(ex.&amp;nbsp;1,&amp;nbsp;127,&amp;nbsp;298,...)&amp;nbsp;-&amp;gt;&amp;nbsp;임베딩&amp;nbsp;층&amp;nbsp;통과&amp;nbsp;-&amp;gt;&amp;nbsp;밀집&amp;nbsp;벡터&amp;nbsp;(ex.&amp;nbsp;[0.5,21,1.9,1.5]&amp;nbsp;&amp;lt;-임베딩&amp;nbsp;벡터의&amp;nbsp;차원이&amp;nbsp;4인&amp;nbsp;경우) &lt;br /&gt;-&amp;nbsp;NNLM이나&amp;nbsp;Word2Vec에서&amp;nbsp;룩업&amp;nbsp;테이블의&amp;nbsp;입력을&amp;nbsp;원-핫&amp;nbsp;벡터로&amp;nbsp;가정했는데,&amp;nbsp;케라스는&amp;nbsp;단어를&amp;nbsp;정수&amp;nbsp;인덱스로&amp;nbsp;바꾸고&amp;nbsp;원-핫&amp;nbsp;벡터&amp;nbsp;변환&amp;nbsp;없이&amp;nbsp;정수&amp;nbsp;인코딩까지만&amp;nbsp;진행&amp;nbsp;후&amp;nbsp;입력으로&amp;nbsp;사용함. &lt;br /&gt;-&amp;nbsp;vocab_size&amp;nbsp;=&amp;nbsp;텍스트&amp;nbsp;데이터의&amp;nbsp;전체&amp;nbsp;단어&amp;nbsp;집합&amp;nbsp;크기.&amp;nbsp;output_dim&amp;nbsp;=&amp;nbsp;워드&amp;nbsp;임베딩&amp;nbsp;후의&amp;nbsp;임베딩&amp;nbsp;벡터의&amp;nbsp;차원.&amp;nbsp;input_length&amp;nbsp;=&amp;nbsp;입력&amp;nbsp;시퀀스의&amp;nbsp;길이. &lt;br /&gt;-&amp;nbsp;Embedding()은&amp;nbsp;(number&amp;nbsp;of&amp;nbsp;samples,&amp;nbsp;input_length)인&amp;nbsp;2D&amp;nbsp;정수&amp;nbsp;텐서를&amp;nbsp;입력으로&amp;nbsp;받고,&amp;nbsp;(이때&amp;nbsp;각&amp;nbsp;sample은&amp;nbsp;정수&amp;nbsp;인코딩이&amp;nbsp;된&amp;nbsp;정수&amp;nbsp;시퀀스)&amp;nbsp;워드&amp;nbsp;임베딩&amp;nbsp;작업을&amp;nbsp;수행한&amp;nbsp;후&amp;nbsp;(number&amp;nbsp;of&amp;nbsp;samples,&amp;nbsp;input_length,&amp;nbsp;embedding&amp;nbsp;word&amp;nbsp;dimentionality)인&amp;nbsp;3D&amp;nbsp;실수&amp;nbsp;텐서를&amp;nbsp;리턴. &lt;br /&gt;-&amp;nbsp;&lt;b&gt;2)&amp;nbsp;임베딩&amp;nbsp;층&amp;nbsp;사용하기&lt;/b&gt;&amp;nbsp;:&amp;nbsp;문장의&amp;nbsp;긍,&amp;nbsp;부정을&amp;nbsp;판단하는&amp;nbsp;감성&amp;nbsp;분류&amp;nbsp;모델을&amp;nbsp;만들어보자.&amp;nbsp;긍정인&amp;nbsp;문장은&amp;nbsp;레이블이&amp;nbsp;1,&amp;nbsp;부정인&amp;nbsp;문장은&amp;nbsp;레이블이&amp;nbsp;0. &lt;br /&gt;-&amp;nbsp;이진분류&amp;nbsp;모델&amp;nbsp;설계.&amp;nbsp;출력층에&amp;nbsp;1개의&amp;nbsp;뉴런,&amp;nbsp;활성화&amp;nbsp;함수는&amp;nbsp;시그모이드&amp;nbsp;함수,&amp;nbsp;손실함수로&amp;nbsp;binary_crossentropy를&amp;nbsp;사용. &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; 사전 훈련된 워드 임베딩 사용하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;훈련&amp;nbsp;데이터가&amp;nbsp;적은&amp;nbsp;상황이라면&amp;nbsp;케라스의&amp;nbsp;Embedding()으로&amp;nbsp;문제를&amp;nbsp;풀기&amp;nbsp;어려움.&amp;nbsp;이&amp;nbsp;경우&amp;nbsp;해당&amp;nbsp;문제에&amp;nbsp;특화된&amp;nbsp;것은&amp;nbsp;아니지만&amp;nbsp;보다&amp;nbsp;많은&amp;nbsp;훈련&amp;nbsp;데이터로&amp;nbsp;이미&amp;nbsp;Word2Vec나&amp;nbsp;GloVe&amp;nbsp;등으로&amp;nbsp;학습되어&amp;nbsp;있는&amp;nbsp;임베딩&amp;nbsp;벡터들을&amp;nbsp;사용하는&amp;nbsp;것이&amp;nbsp;좋음. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;b&gt;1)&amp;nbsp;사전&amp;nbsp;훈련된&amp;nbsp;GloVe&amp;nbsp;사용하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1725603417436&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from urllib.request import urlretrieve, urlopen
import gzip
import zipfile
urlretrieve(&quot;http://nlp.stanford.edu/data/glove.6B.zip&quot;, filename=&quot;glove.6B.zip&quot;)
zf = zipfile.ZipFile('glove.6B.zip')
zf.extractall() 
zf.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2)&amp;nbsp;사전&amp;nbsp;훈련된&amp;nbsp;Word2Vec&amp;nbsp;사용하기 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1725603439298&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import gensim
!pip install gdown
!gdown https://drive.google.com/uc?id=1Av37IVBQAAntSe1X3MOAl5gvowQzd2_j
word2vec_model = gensim.models.KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin.gz', binary=True)
print('모델의 크기(shape) :',word2vec_model.vectors.shape) # 모델의 크기 확인&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;b&gt;09-09&amp;nbsp;옐모(Embeddings&amp;nbsp;from&amp;nbsp;Language&amp;nbsp;Model,&amp;nbsp;ELMo)&lt;/b&gt; &lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;언어&amp;nbsp;모델로&amp;nbsp;하는&amp;nbsp;임베딩.&amp;nbsp;=&amp;gt;&amp;nbsp;사전&amp;nbsp;훈련된&amp;nbsp;언어&amp;nbsp;모델을&amp;nbsp;사용한다는&amp;nbsp;것이&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;특징. &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; ELMo&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;Bank라는&amp;nbsp;단어가&amp;nbsp;Bank&amp;nbsp;Account&amp;nbsp;(은행&amp;nbsp;계좌)와&amp;nbsp;River&amp;nbsp;Bank&amp;nbsp;(강둑)에서&amp;nbsp;전혀&amp;nbsp;다른&amp;nbsp;의미를&amp;nbsp;가짐.&amp;nbsp;그러나&amp;nbsp;Word2Vec이나&amp;nbsp;Glove은&amp;nbsp;bank&amp;nbsp;단어를&amp;nbsp;두&amp;nbsp;경우&amp;nbsp;모두&amp;nbsp;같은&amp;nbsp;임베딩&amp;nbsp;벡터로&amp;nbsp;표현.&amp;nbsp;(ex.&amp;nbsp;[0.2,&amp;nbsp;0.8,&amp;nbsp;-1.2])&amp;nbsp; &lt;br /&gt;-&amp;nbsp;워드&amp;nbsp;임베딩&amp;nbsp;시&amp;nbsp;문맥을&amp;nbsp;고려해서&amp;nbsp;임베딩&amp;nbsp;하겠다는&amp;nbsp;이&amp;nbsp;아이디어&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;b&gt;문맥을&amp;nbsp;반영한&amp;nbsp;워드&amp;nbsp;임베딩&lt;/b&gt;(Contextualized&amp;nbsp;Word&amp;nbsp;Embedding). &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; &lt;b&gt;BiLM&lt;/b&gt; (Bidirectional Language Model)의 사전 훈련&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;ELMo는&lt;u&gt;&amp;nbsp;순방향&amp;nbsp;RNN과&amp;nbsp;역방향&amp;nbsp;RNN을&amp;nbsp;모두&amp;nbsp;학습&lt;/u&gt;하여&amp;nbsp;활용한다고&amp;nbsp;하여,&amp;nbsp;이&amp;nbsp;언어&amp;nbsp;모델을&amp;nbsp;biLM이라고&amp;nbsp;함. &lt;br /&gt;-&amp;nbsp;ELMO에서&amp;nbsp;말하는&amp;nbsp;biLM은&amp;nbsp;기본적으로&amp;nbsp;다층&amp;nbsp;구조(Multi-layer)를&amp;nbsp;전제로&amp;nbsp;함.&amp;nbsp;(은닉층이&amp;nbsp;2개&amp;nbsp;이상) &lt;br /&gt;-&amp;nbsp;각&amp;nbsp;시점의&amp;nbsp;입력이&amp;nbsp;되는&amp;nbsp;단어&amp;nbsp;벡터는&amp;nbsp;(이번&amp;nbsp;챕터에서&amp;nbsp;설명한)&amp;nbsp;임베딩&amp;nbsp;층을&amp;nbsp;사용해서&amp;nbsp;얻은&amp;nbsp;것이&amp;nbsp;아니라&amp;nbsp;합성곱&amp;nbsp;신경망을&amp;nbsp;이용한&amp;nbsp;문자&amp;nbsp;임베딩을&amp;nbsp;통해&amp;nbsp;얻은&amp;nbsp;단어&amp;nbsp;벡터. &lt;br /&gt;- 양방형 RNN과 ELMo에서의 biLM은 다름. 양방향 RNN은 순방향 RNN의 은닉 상태와 역방향 RNN의 은닉 상태를 연결하여 다음 층의 입력으로 사용하지만, &lt;u&gt;biLM은 순방향 언어모델과 역방향 언어모델이라는 두개의 언어모델을 별개의 모델로 보고 학습&lt;/u&gt;. &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; biLM의 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단어임베딩과정 : 해당 시점의 BiLM의 각 층의 출력값(첫번째는 임베딩 층, 나머지 층은 각 층의 은닉 상태)을 가져옴 &amp;rarr; 순방향 언어 모델과 역방향 언어 모델의 각 층의 출력값을 연결하고 추가 작업 진행. &lt;br /&gt;- ELMo의 직관적인 아이디어는 '&lt;b&gt;각 층의 출력값이 가진 정보는 전부 서로 다른 종류의 정보를 갖고 있을 것&lt;/b&gt;'이므로, 이들을 모두 활용한다는 점에 있음. &lt;br /&gt;- ELMo가 임베딩 벡터를 얻는 과정 : &lt;b&gt;1)&lt;/b&gt; 각 층의 출력값을 연결한다. &lt;b&gt;2)&lt;/b&gt; 각 층의 출력값 별로 가중치를 준다. (s1, s2, s3,...) &lt;b&gt;3)&lt;/b&gt; 각 층의 출력값을 모두 더한다. (가중합) &lt;b&gt;4)&lt;/b&gt; 벡터의 크기를 결정하는 스칼라 매개변수를 곱한다. =&amp;gt; 완성된 벡터를&lt;b&gt; ELMo 표현&lt;/b&gt;이라고 함. &lt;br /&gt;-&amp;nbsp;ELMo&amp;nbsp;표현을&amp;nbsp;기존의&amp;nbsp;임베딩&amp;nbsp;벡터와&amp;nbsp;함께&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있음.&amp;nbsp;텍스트&amp;nbsp;분류&amp;nbsp;작업을&amp;nbsp;위해서&amp;nbsp;GloVe와&amp;nbsp;같은&amp;nbsp;기존의&amp;nbsp;방법론을&amp;nbsp;사용한&amp;nbsp;임베딩&amp;nbsp;벡터를&amp;nbsp;준비했다고&amp;nbsp;하자.&amp;nbsp;이때,&amp;nbsp;GloVe를&amp;nbsp;사용한&amp;nbsp;임베딩&amp;nbsp;벡터만&amp;nbsp;텍스트&amp;nbsp;분류&amp;nbsp;작업에&amp;nbsp;사용하는&amp;nbsp;것이&amp;nbsp;아닌,&amp;nbsp;준비된&lt;u&gt;&amp;nbsp;ELMo&amp;nbsp;표현을&amp;nbsp;GloVe&amp;nbsp;임베딩&amp;nbsp;벡터와&amp;nbsp;연결해서&amp;nbsp;입력으로&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있음&lt;/u&gt;.&amp;nbsp;이때&amp;nbsp;biLM의&amp;nbsp;가중치는&amp;nbsp;고정하고&amp;nbsp;위에서&amp;nbsp;사용한&amp;nbsp;가중치(s1,s2,s3)와&amp;nbsp;스칼라&amp;nbsp;매개변수가&amp;nbsp;훈련과정에서&amp;nbsp;학습됨. &lt;br /&gt;&lt;br /&gt;&lt;br /&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;&lt;b&gt;09-10 임베딩 벡터의 시각화&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;구글은&amp;nbsp;&lt;b&gt;임베딩&amp;nbsp;프로젝터&lt;/b&gt;(Embedding&amp;nbsp;projetor)라는&amp;nbsp;데이터&amp;nbsp;시각화&amp;nbsp;도구&amp;nbsp;지원 &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; 워드 임베딩 모델로부터 2개의 tsv 파일 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;시각화를&amp;nbsp;위해서는&amp;nbsp;이미&amp;nbsp;모델을&amp;nbsp;학습하고,&amp;nbsp;파일로&amp;nbsp;저장되어져&amp;nbsp;있어야&amp;nbsp;함.&amp;nbsp;모델이&amp;nbsp;저장되어&amp;nbsp;있다면&amp;nbsp;아래&amp;nbsp;커맨드를&amp;nbsp;통해&amp;nbsp;시각화에&amp;nbsp;필요한&amp;nbsp;파일들을&amp;nbsp;생성할&amp;nbsp;수&amp;nbsp;있음.&amp;nbsp;-&amp;gt;&amp;nbsp;!python&amp;nbsp;-m&amp;nbsp;gensim.scripts.word2vec2tensor&amp;nbsp;--&amp;nbsp;input&amp;nbsp;모델이름&amp;nbsp;--output&amp;nbsp;모델이름 &lt;br /&gt;-&amp;nbsp;커맨드를&amp;nbsp;수행하면,&amp;nbsp;주피터&amp;nbsp;노트북이&amp;nbsp;시작되는&amp;nbsp;경로에&amp;nbsp;기존에&amp;nbsp;있던&amp;nbsp;언어모델&amp;nbsp;외에도&amp;nbsp;두&amp;nbsp;개의&amp;nbsp;파일이&amp;nbsp;생김.&amp;nbsp;(모델이름_metadata.tsv,&amp;nbsp;모델이름_tensor.tsv) &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;임베딩&amp;nbsp;프로젝터를&amp;nbsp;사용하여&amp;nbsp;시각화&amp;nbsp;(&lt;a href=&quot;https://projector.tensorflow.org/)&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://projector.tensorflow.org/)&lt;/a&gt;&lt;br /&gt;-&amp;nbsp;사이트의&amp;nbsp;좌측&amp;nbsp;상단을&amp;nbsp;보면&amp;nbsp;Lad라는&amp;nbsp;버튼이&amp;nbsp;있음.&amp;nbsp;거기에&amp;nbsp;만들어진&amp;nbsp;두&amp;nbsp;파일을&amp;nbsp;업로드하면,&amp;nbsp;워드&amp;nbsp;임베딩&amp;nbsp;모델이&amp;nbsp;시각화&amp;nbsp;됨. &lt;br /&gt;-&amp;nbsp;그&amp;nbsp;후&amp;nbsp;임베딩&amp;nbsp;프로젝터에서&amp;nbsp;&amp;nbsp;다양한&amp;nbsp;기능을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있음.&amp;nbsp;차원을&amp;nbsp;축소하여&amp;nbsp;시각화&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;도와주는&amp;nbsp;PCA,&amp;nbsp;t-SNE&amp;nbsp;등이&amp;nbsp;제공되고,&amp;nbsp;특정&amp;nbsp;단어의&amp;nbsp;코사인&amp;nbsp;유사도를&amp;nbsp;기준으로&amp;nbsp;가장&amp;nbsp;유사한&amp;nbsp;상위&amp;nbsp;n개의&amp;nbsp;벡터를&amp;nbsp;표시할&amp;nbsp;수도&amp;nbsp;있음. &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;&lt;br /&gt;&lt;b&gt;09-11 문서 벡터를 이용한 추천 시스템 (Recommendation System using Document Embedding)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;문서들을&amp;nbsp;고정된&amp;nbsp;길이의&amp;nbsp;벡터로&amp;nbsp;변환한다면,&amp;nbsp;벡터&amp;nbsp;간의&amp;nbsp;비교로&amp;nbsp;문서들을&amp;nbsp;서로&amp;nbsp;비교할&amp;nbsp;수&amp;nbsp;있음.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;각&amp;nbsp;문서를&amp;nbsp;문서&amp;nbsp;벡터로&amp;nbsp;변환하는&amp;nbsp;방법은&amp;nbsp;이미&amp;nbsp;구현된&amp;nbsp;패캐지인&amp;nbsp;Doc2Vec이나&amp;nbsp;Sent2Vec&amp;nbsp;등을&amp;nbsp;사용하여&amp;nbsp;학습할&amp;nbsp;수도&amp;nbsp;있지만&amp;nbsp;단어&amp;nbsp;벡터를&amp;nbsp;얻은&amp;nbsp;뒤&amp;nbsp;문서에&amp;nbsp;존재하는&amp;nbsp;단어&amp;nbsp;벡터들의&amp;nbsp;평균을&amp;nbsp;문서&amp;nbsp;벡터로&amp;nbsp;간주할&amp;nbsp;수도&amp;nbsp;있음.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;이번에는&amp;nbsp;문서&amp;nbsp;내&amp;nbsp;각&amp;nbsp;단어들을&amp;nbsp;WordVec을&amp;nbsp;통해&amp;nbsp;단어&amp;nbsp;벡터로&amp;nbsp;변환하고,&amp;nbsp;이들의&amp;nbsp;평균으로&amp;nbsp;문서&amp;nbsp;벡터를&amp;nbsp;얻어&amp;nbsp;선호하는&amp;nbsp;도서와&amp;nbsp;유사한&amp;nbsp;도서를&amp;nbsp;찾아주는&amp;nbsp;도서&amp;nbsp;추천&amp;nbsp;시스템을&amp;nbsp;만들어&amp;nbsp;보겠음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고한 논문이 많이 나와 있어서 그 논문들을 읽기 시도 중! 논문을 다 읽게 되면 리뷰 한 번 올려봐야지(&amp;oline;◡◝)&lt;/p&gt;</description>
      <category>공부/자연어 처리</category>
      <author>빈이즈</author>
      <guid isPermaLink="true">https://binrec.tistory.com/10</guid>
      <comments>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-9-%EC%9B%8C%EB%93%9C-%EC%9E%84%EB%B2%A0%EB%94%A9-Word-Embedding#entry10comment</comments>
      <pubDate>Tue, 6 Aug 2024 12:17:04 +0900</pubDate>
    </item>
    <item>
      <title>[딥러닝을 이용한 자연어 처리 입문] Chapter 6. 머신 러닝 개요</title>
      <link>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-6-%EB%A8%B8%EC%8B%A0-%EB%9F%AC%EB%8B%9D-%EA%B0%9C%EC%9A%94</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 [&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/6876&quot;&gt;유원준&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #808080; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/13671&quot;&gt;상준&lt;/a&gt;]의 [딥러닝을 이용한 자영어 처리 입문]에서 가져온 내용이며, [크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스](&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;a href=&quot;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot;&gt;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&lt;/a&gt;&lt;/span&gt;)에 따라 사용되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wikidocs.net/21669&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wikidocs.net/21669&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721953580999&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;06. 머신 러닝(Machine Learning) 개요&quot; data-og-description=&quot;머신 러닝은 영상 처리, 번역기, 음성 인식, 스팸 메일 탐지 등 굉장히 다양한 분야에서 응용되고 있습니다. 특히 머신 러닝의 한 갈래인 딥 러닝은 자연어 처리 엔지니어에게 필수&amp;hellip;&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/21669&quot; data-og-url=&quot;https://wikidocs.net/21669&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dh0F5j/hyWGRRPfTB/jO2eVB0j4NXJoEqsYj2cb1/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130&quot;&gt;&lt;a href=&quot;https://wikidocs.net/21669&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/21669&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dh0F5j/hyWGRRPfTB/jO2eVB0j4NXJoEqsYj2cb1/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;06. 머신 러닝(Machine Learning) 개요&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;머신 러닝은 영상 처리, 번역기, 음성 인식, 스팸 메일 탐지 등 굉장히 다양한 분야에서 응용되고 있습니다. 특히 머신 러닝의 한 갈래인 딥 러닝은 자연어 처리 엔지니어에게 필수&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;06. 머신 러닝 (Machine Learning) 개요&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;06-02. 머신 러닝 훑어보기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; 자기지도 학습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 레이블이 없는 데이터가 주어지면, 모델이 학습을 위해서 스스로 데이터로부터 레이블을 만들어서 학습하는 경우 &lt;br /&gt;-&amp;nbsp;EX)&amp;nbsp;Word2Vec&amp;nbsp;(워드&amp;nbsp;임베딩&amp;nbsp;알고리즘),&amp;nbsp;BERT&amp;nbsp;(언어&amp;nbsp;모델의&amp;nbsp;학습&amp;nbsp;방법)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;혼동&amp;nbsp;행렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- True Positive (TP) : 실제 True인 정답을 True라고 예측 (정답) &lt;br /&gt;-&amp;nbsp;False&amp;nbsp;Positive&amp;nbsp;(FP)&amp;nbsp;:&amp;nbsp;실제&amp;nbsp;False인&amp;nbsp;정답을&amp;nbsp;True라고&amp;nbsp;예측&amp;nbsp;(오답) &lt;br /&gt;-&amp;nbsp;False&amp;nbsp;Negative&amp;nbsp;(FN)&amp;nbsp;:&amp;nbsp;실제&amp;nbsp;True인&amp;nbsp;정답을&amp;nbsp;False라고&amp;nbsp;예측&amp;nbsp;(오답) &lt;br /&gt;-&amp;nbsp;True&amp;nbsp;Negative&amp;nbsp;(TN)&amp;nbsp;:&amp;nbsp;실제&amp;nbsp;False인&amp;nbsp;정답을&amp;nbsp;False라고&amp;nbsp;예측&amp;nbsp;(정답) &lt;br /&gt;-&amp;nbsp;정밀도&amp;nbsp;:&amp;nbsp;모델이&amp;nbsp;True라고&amp;nbsp;예측한&amp;nbsp;것&amp;nbsp;중&amp;nbsp;실제&amp;nbsp;True인&amp;nbsp;것의&amp;nbsp;비율 &lt;br /&gt;-&amp;nbsp;재현율&amp;nbsp;:&amp;nbsp;실제&amp;nbsp;True인&amp;nbsp;것&amp;nbsp;중&amp;nbsp;모델이&amp;nbsp;True라고&amp;nbsp;예측한&amp;nbsp;것의&amp;nbsp;비율 &lt;br /&gt;-&amp;nbsp;정확도&amp;nbsp;=&amp;nbsp;전체&amp;nbsp;예측&amp;nbsp;데이터&amp;nbsp;중&amp;nbsp;정답을&amp;nbsp;맞춘&amp;nbsp;것에&amp;nbsp;대한&amp;nbsp;비율 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;06-03&amp;nbsp;선형&amp;nbsp;회귀&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; 옵티마이저 : 경사하강법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 비용함수를 최소화하는 매개 변수를 찾기 위해 사용하는 알고리즘 &lt;br /&gt;-&amp;nbsp;접선의&amp;nbsp;기울기가&amp;nbsp;0이&amp;nbsp;되는&amp;nbsp;지점&amp;nbsp;(=미분값이&amp;nbsp;0이&amp;nbsp;되는&amp;nbsp;지점)을&amp;nbsp;찾는&amp;nbsp;것. &lt;br /&gt;-&amp;nbsp;learning&amp;nbsp;rate&amp;nbsp;(학습률)&amp;nbsp;:&amp;nbsp;가중치의&amp;nbsp;값을&amp;nbsp;변경할&amp;nbsp;때,&amp;nbsp;얼마나&amp;nbsp;크게&amp;nbsp;변경할지를&amp;nbsp;결정하며&amp;nbsp;0과&amp;nbsp;1&amp;nbsp;사이의&amp;nbsp;값을&amp;nbsp;가짐.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;06-08&amp;nbsp;벡터와&amp;nbsp;행렬&amp;nbsp;연산&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;텐서 (Tensor)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 0차원 텐서 (스칼라) : 하나의 실수값으로 이루어진 데이터 &lt;br /&gt;-&amp;nbsp;1차원&amp;nbsp;텐서&amp;nbsp;(벡터)&amp;nbsp;:&amp;nbsp;숫자를&amp;nbsp;배열한&amp;nbsp;것.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;2차원&amp;nbsp;텐서&amp;nbsp;(행렬)&amp;nbsp;:&amp;nbsp;행과&amp;nbsp;열이&amp;nbsp;존재하는&amp;nbsp;벡터의&amp;nbsp;배열. &lt;br /&gt;-&amp;nbsp;3차원&amp;nbsp;텐서&amp;nbsp;(다차원&amp;nbsp;배열)&amp;nbsp;:&amp;nbsp;행렬&amp;nbsp;또는&amp;nbsp;2차원&amp;nbsp;텐서를&amp;nbsp;단위로&amp;nbsp;한&amp;nbsp;번&amp;nbsp;더&amp;nbsp;배열하면&amp;nbsp;3차원&amp;nbsp;텐서라고&amp;nbsp;부름.&amp;nbsp;3차원&amp;nbsp;이상의&amp;nbsp;텐서부터&amp;nbsp;본격적으로&amp;nbsp;텐서라고&amp;nbsp;부름. &lt;br /&gt;시퀀스&amp;nbsp;데이터를&amp;nbsp;표현할&amp;nbsp;때&amp;nbsp;자주&amp;nbsp;사용됨.&amp;nbsp;여기서&amp;nbsp;시퀀스&amp;nbsp;데이터는&amp;nbsp;주로&amp;nbsp;단어의&amp;nbsp;시퀀스를&amp;nbsp;의미하며,&amp;nbsp;문장이나&amp;nbsp;문서&amp;nbsp;뉴스&amp;nbsp;기사&amp;nbsp;등의&amp;nbsp;텍스트가&amp;nbsp;될&amp;nbsp;수도&amp;nbsp;있음.&amp;nbsp;이&amp;nbsp;경우&amp;nbsp;3D&amp;nbsp;텐서는&amp;nbsp;(samples,&amp;nbsp;timesteps,&amp;nbsp;word_dim)이&amp;nbsp;됨.&amp;nbsp;&amp;nbsp;또는&amp;nbsp;일괄로&amp;nbsp;처리하기&amp;nbsp;위해&amp;nbsp;데이터를&amp;nbsp;묶는&amp;nbsp;단위인&amp;nbsp;배치의&amp;nbsp;개념을&amp;nbsp;사용하면&amp;nbsp;(batch_size,&amp;nbsp;timesteps,&amp;nbsp;word_dim)이라고&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;케라스에서의&amp;nbsp;텐서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- input_shape : 신경망의 층에 입력의 크기를 인자로 줄 때 사용. 배치크기를 제외하고 차원을 지정함. 예를 들어, input_shape(6,5)라는 인자값을 사용하면 텐서의 크기는 (?, 6,5)을 의미함. 배치크기는 지정하기 전까지 알 수 없음. 만약 배치 크기까지 지정해주고 싶다면, batch_input_shape = (8,2,10)과 같이 인자를 주면 텐서의 크기는 (8, 2, 10)을 의미함.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;br /&gt;06-09&amp;nbsp;소프트맥스&amp;nbsp;회귀&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;nbsp;&amp;nbsp;소프트맥스 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 선택해야 할 선택지의 개수가 k개라면, k차원의 벡터를 입력받아 각 클래스에 대한 확률을 추정함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;원-핫&amp;nbsp;벡터의&amp;nbsp;무작위성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대부분의 다중 클래스 분류 문제가 각 클래스 간의 관계가 균등하다는 점에서 원-핫 벡터가 적절한 표현 방식임. &lt;br /&gt;-&amp;nbsp;단어의&amp;nbsp;유사성을&amp;nbsp;구할&amp;nbsp;수&amp;nbsp;없다는&amp;nbsp;단점을&amp;nbsp;가짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;비용&amp;nbsp;함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 크로스 엔트로피 함수 : cost = -1/n * sigma(i=1-&amp;gt;n)*sigma(j=1 -&amp;gt; k) yj(i) * log(pj(i)) &lt;br /&gt;(n&amp;nbsp;:&amp;nbsp;데이터의&amp;nbsp;개수,&amp;nbsp;yj&amp;nbsp;:&amp;nbsp;j번째&amp;nbsp;실제값,&amp;nbsp;pj&amp;nbsp;:&amp;nbsp;j번째&amp;nbsp;클래스일&amp;nbsp;확률).&amp;nbsp;정확히&amp;nbsp;예측했을&amp;nbsp;경우&amp;nbsp;0이&amp;nbsp;됨.&amp;nbsp;이&amp;nbsp;값이&amp;nbsp;최소화되는&amp;nbsp;방향으로&amp;nbsp;학습해야&amp;nbsp;함. &lt;br /&gt;-&amp;nbsp;k=2로&amp;nbsp;둔다면,&amp;nbsp;로지스틱&amp;nbsp;회귀의&amp;nbsp;비용&amp;nbsp;함수와&amp;nbsp;같음 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/자연어 처리</category>
      <author>빈이즈</author>
      <guid isPermaLink="true">https://binrec.tistory.com/9</guid>
      <comments>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-6-%EB%A8%B8%EC%8B%A0-%EB%9F%AC%EB%8B%9D-%EA%B0%9C%EC%9A%94#entry9comment</comments>
      <pubDate>Fri, 26 Jul 2024 09:26:48 +0900</pubDate>
    </item>
    <item>
      <title>[딥러닝을 이용한 자연어 처리 입문] Chapter 4. 카운트 기반의 단어 표현 - Chapter 5. 벡터의 유사도</title>
      <link>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-4-%EC%B9%B4%EC%9A%B4%ED%8A%B8-%EA%B8%B0%EB%B0%98%EC%9D%98-%EB%8B%A8%EC%96%B4-%ED%91%9C%ED%98%84-Chapter-5-%EB%B2%A1%ED%84%B0%EC%9D%98-%EC%9C%A0%EC%82%AC%EB%8F%84</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 [&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/6876&quot;&gt;유원준&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #808080; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/13671&quot;&gt;상준&lt;/a&gt;]의 [딥러닝을 이용한 자영어 처리 입문]에서 가져온 내용이며, [크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스](&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;a href=&quot;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot;&gt;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&lt;/a&gt;&lt;/span&gt;)에 따라 사용되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wikidocs.net/24557&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wikidocs.net/24557&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721374733114&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;04. 카운트 기반의 단어 표현(Count based word Representation)&quot; data-og-description=&quot;자연어 처리에서 텍스트를 표현하는 방법으로는 여러가지 방법이 있습니다. 이번 챕터에서는 그 중 정보 검색과 텍스트 마이닝 분야에서 주로 사용되는 카운트 기반의 텍스트 표현 방법인&amp;hellip;&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/24557&quot; data-og-url=&quot;https://wikidocs.net/24557&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/twhsY/hyWztefPkm/Rrp0KBgRSKkMb0yzUDkV30/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130&quot;&gt;&lt;a href=&quot;https://wikidocs.net/24557&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/24557&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/twhsY/hyWztefPkm/Rrp0KBgRSKkMb0yzUDkV30/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;04. 카운트 기반의 단어 표현(Count based word Representation)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자연어 처리에서 텍스트를 표현하는 방법으로는 여러가지 방법이 있습니다. 이번 챕터에서는 그 중 정보 검색과 텍스트 마이닝 분야에서 주로 사용되는 카운트 기반의 텍스트 표현 방법인&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wikidocs.net/24602&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wikidocs.net/24602&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721374739732&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;05. 벡터의 유사도(Vector Similarity)&quot; data-og-description=&quot;문장이나 문서의 유사도를 구하는 작업은 자연어 처리의 주요 주제 중 하나입니다. 사람들이 인식하는 문서의 유사도는 주로 문서들 간에 동일한 단어 또는 비슷한 단어가 얼마나 공통적&amp;hellip;&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/24602&quot; data-og-url=&quot;https://wikidocs.net/24602&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zjzxB/hyWCLdfYqt/0MatjwX0Ekkyq5Nk9Yw1FK/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130&quot;&gt;&lt;a href=&quot;https://wikidocs.net/24602&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/24602&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zjzxB/hyWCLdfYqt/0MatjwX0Ekkyq5Nk9Yw1FK/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;05. 벡터의 유사도(Vector Similarity)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문장이나 문서의 유사도를 구하는 작업은 자연어 처리의 주요 주제 중 하나입니다. 사람들이 인식하는 문서의 유사도는 주로 문서들 간에 동일한 단어 또는 비슷한 단어가 얼마나 공통적&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;04.&amp;nbsp;카운트&amp;nbsp;기반의&amp;nbsp;단어&amp;nbsp;표현&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;04-01 다양한 단어의 표현 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; 단어의 표현 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 크게 국소 표현과 분산 표현 방법으로 나뉨 &lt;br /&gt;-&amp;nbsp;국소&amp;nbsp;표현&amp;nbsp;방법&amp;nbsp;:&amp;nbsp;해당&amp;nbsp;단어&amp;nbsp;그&amp;nbsp;자체만&amp;nbsp;보고&amp;nbsp;특정값을&amp;nbsp;맵핑하여&amp;nbsp;단어를&amp;nbsp;표현.&amp;nbsp;이산&amp;nbsp;표현이라고도&amp;nbsp;함. &lt;br /&gt;-&amp;nbsp;분산&amp;nbsp;표현&amp;nbsp;방법&amp;nbsp;:&amp;nbsp;그&amp;nbsp;단어를&amp;nbsp;표현하고자&amp;nbsp;주변을&amp;nbsp;참고하여&amp;nbsp;단어를&amp;nbsp;표현,&amp;nbsp;연속&amp;nbsp;표현이라고도&amp;nbsp;함. &lt;br /&gt;-&amp;nbsp;EX.&amp;nbsp;puppy,&amp;nbsp;cute,&amp;nbsp;lovely&amp;nbsp;=&amp;gt;&amp;nbsp;1,2,3으로&amp;nbsp;맵핑하는&amp;nbsp;것이&amp;nbsp;국소&amp;nbsp;표현&amp;nbsp;방법.&amp;nbsp;puppy라는&amp;nbsp;단어&amp;nbsp;근처에&amp;nbsp;주로&amp;nbsp;cute,&amp;nbsp;lovely한&amp;nbsp;느낌이다로&amp;nbsp;단어를&amp;nbsp;정의하는&amp;nbsp;것이&amp;nbsp;분산&amp;nbsp;표현&amp;nbsp;방식.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;04-02&amp;nbsp;Bag&amp;nbsp;of&amp;nbsp;Words&amp;nbsp;(BoW)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; &lt;u&gt;Bag of Words&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-단어들의 가방이라는 뜻으로, 가방에 텍스트 문서에 있는 단어들을 전부 넣고 흔들어 섞습니다. 만약, 해당 문서 내에서 특정 단어가 N번 등장했다면 이 가방에는 N개가 존재합니다. 섞었기 때문에 더이상 순서는 중요하지 않습니다. &lt;br /&gt;-&amp;nbsp;단어들의&lt;u&gt;&amp;nbsp;순서는&amp;nbsp;고려하지&amp;nbsp;않고,&amp;nbsp;단어들의&amp;nbsp;출현&amp;nbsp;빈도에만&amp;nbsp;집중&lt;/u&gt;하는&amp;nbsp;텍스트&amp;nbsp;데이터의&amp;nbsp;수치화&amp;nbsp;표현&amp;nbsp;방법.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;과정&amp;nbsp;:&amp;nbsp;1)&amp;nbsp;각&amp;nbsp;단어에&amp;nbsp;고유한&amp;nbsp;정수&amp;nbsp;인덱스&amp;nbsp;부여&amp;nbsp;2)&amp;nbsp;각&amp;nbsp;인덱스의&amp;nbsp;위치에&amp;nbsp;단어&amp;nbsp;토큰의&amp;nbsp;등장&amp;nbsp;횟수를&amp;nbsp;기록한&amp;nbsp;벡터&amp;nbsp;만듦 &lt;br /&gt;-&amp;nbsp;EX1.&amp;nbsp;&quot;정부가&amp;nbsp;발표하는&amp;nbsp;물가상승률과&amp;nbsp;소비자가&amp;nbsp;느끼는&amp;nbsp;물가상승률은&amp;nbsp;다르다. &lt;br /&gt;=&amp;gt;&amp;nbsp;'정부'&amp;nbsp;:&amp;nbsp;0,&amp;nbsp;'가'&amp;nbsp;:1,&amp;nbsp;'발표'&amp;nbsp;:&amp;nbsp;2,&amp;nbsp;...&amp;nbsp;이런식으로&amp;nbsp;인덱스를&amp;nbsp;매키고,&amp;nbsp;각&amp;nbsp;인덱스별&amp;nbsp;빈도수&amp;nbsp;{1,2,1,1,...}를&amp;nbsp;구함 &lt;br /&gt;-&amp;nbsp;주로&amp;nbsp;어떤&amp;nbsp;단어가&amp;nbsp;얼마나&amp;nbsp;등장했는지를&amp;nbsp;기준으로&amp;nbsp;문서가&amp;nbsp;어떤&amp;nbsp;성격의&amp;nbsp;문서인지를&amp;nbsp;판단하는&amp;nbsp;작업에&amp;nbsp;쓰임.&amp;nbsp;즉&amp;nbsp;분류&amp;nbsp;문제,&amp;nbsp;여러&amp;nbsp;문서&amp;nbsp;간의&amp;nbsp;유사도&amp;nbsp;구하는&amp;nbsp;문제에&amp;nbsp;주로&amp;nbsp;쓰임.&amp;nbsp;EX)&amp;nbsp;'달리기',&amp;nbsp;'체력',&amp;nbsp;'근력'과&amp;nbsp;같은&amp;nbsp;단어가&amp;nbsp;자주&amp;nbsp;등장하면&amp;nbsp;해당&amp;nbsp;문서를&amp;nbsp;체육&amp;nbsp;관련&amp;nbsp;문서로&amp;nbsp;분류할&amp;nbsp;수&amp;nbsp;있을&amp;nbsp;것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; 사이킷런 CountVectorizer 클래스로 BoW 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;b&gt;CountVectorizer&amp;nbsp;&lt;/b&gt;:&amp;nbsp;단어의&amp;nbsp;빈도를&amp;nbsp;Count하여&amp;nbsp;Vector로&amp;nbsp;만드는&amp;nbsp;클래스. &lt;br /&gt;-&amp;nbsp;기본적으로&amp;nbsp;길이가&amp;nbsp;2이상인&amp;nbsp;문자에&amp;nbsp;대해서만&amp;nbsp;토큰으로&amp;nbsp;인식.&amp;nbsp;(영어는&amp;nbsp;주로&amp;nbsp;짧으면&amp;nbsp;불용어로&amp;nbsp;취급하기&amp;nbsp;때문) &lt;br /&gt;-&amp;nbsp;띄어쓰기를&amp;nbsp;기준으로&amp;nbsp;단어를&amp;nbsp;자르기&amp;nbsp;때문에&amp;nbsp;한국어에&amp;nbsp;적용&amp;nbsp;X&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; 불용어를 제거한 BoW 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;CountVectorizer에서&amp;nbsp;stop_words&amp;nbsp;=&amp;nbsp;[]&amp;nbsp;라는&amp;nbsp;인수를&amp;nbsp;사용하여&amp;nbsp;불용어를&amp;nbsp;직접&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있음 &lt;br /&gt;-&amp;nbsp;stop_words&amp;nbsp;=&amp;nbsp;'english'를&amp;nbsp;사용하여&amp;nbsp;자체적으로&amp;nbsp;제공하는&amp;nbsp;불용어&amp;nbsp;사용&amp;nbsp;가능 &lt;br /&gt;- NLTK에서 지원하는 불용어 사용방법 : stopwords.words(&quot;english&quot;) &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;04-03 문서 단어 행렬(Document-Term Matrix, DTM)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 행과 열을 반대로 선택하면 TDM이라고 부르기도 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; 문서 단어 행렬(DTM) 표기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문서 단어 행렬 :&amp;nbsp;&amp;nbsp;다수의 문서에서 등장하는 각 단어들의 빈도를 행렬로 표현한 것.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;BoW&amp;nbsp;표현을&amp;nbsp;다수의&amp;nbsp;문서에&amp;nbsp;대해서&amp;nbsp;행렬로&amp;nbsp;표현하고&amp;nbsp;부르는&amp;nbsp;용어.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;DTM의&amp;nbsp;한계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;희소 표현&lt;/b&gt; : 전체 코퍼스가 방대한 데이터라면, 문서 벡터의 &lt;u&gt;차원은 수만 이상의 차원을 가질 수 있음&lt;/u&gt;. 또한 많은 문서 벡터가 &lt;u&gt;대부분의 값이 0이 될 수 있음&lt;/u&gt;. =&amp;gt; 구두점, 빈도수가 낮은 단어, 불용어 제거, 어간이나 표제어 추출을 통한 단어의 정규화를 통해 단어 집합의 크기를 줄이는 것이 중요.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;단순&amp;nbsp;빈도&amp;nbsp;수&amp;nbsp;기반&amp;nbsp;접근&amp;nbsp;:&amp;nbsp;영어의&amp;nbsp;불용어인&amp;nbsp;the는&amp;nbsp;어떤&amp;nbsp;문서든&amp;nbsp;자주&amp;nbsp;등장하는데,&amp;nbsp;똑같이&amp;nbsp;the의&amp;nbsp;빈도수가&amp;nbsp;높다고&amp;nbsp;해서&amp;nbsp;유사한&amp;nbsp;문서라고&amp;nbsp;판단해서는&amp;nbsp;안됨. &lt;br /&gt;-&amp;nbsp;불용와&amp;nbsp;중요한&amp;nbsp;단어에&amp;nbsp;대해서&amp;nbsp;가중치를&amp;nbsp;줄&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;방법&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;b&gt;TF-IDF&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;04-04 TF-IDF (Term Frequency-Inverse Document Frequency)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 각 단어에 대한 중요도를 계산할 수 있는 TF-IDF&amp;nbsp;&amp;nbsp;가중치.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;TF-IDF(단어&amp;nbsp;빈도-역&amp;nbsp;문서&amp;nbsp;빈도)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-TF-IDF :&lt;b&gt; 단어의 빈도와 역 문서 빈도&lt;/b&gt;(문서의 빈도에 특정 식을 취함)를 사용하여 DTM 내의 각 단어들마다 중요한 정도를 가중치로 주는 방법. &lt;br /&gt;-&amp;nbsp;TF와&amp;nbsp;IDF를&amp;nbsp;곱한&amp;nbsp;값을&amp;nbsp;의미. &lt;br /&gt;-&amp;nbsp;문서를&amp;nbsp;d,&amp;nbsp;단어를&amp;nbsp;t,&amp;nbsp;문서의&amp;nbsp;총&amp;nbsp;개수를&amp;nbsp;n이라고&amp;nbsp;표현할&amp;nbsp;때,&amp;nbsp;TF,&amp;nbsp;DF,&amp;nbsp;IDF는&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;정의&amp;nbsp;가능 &lt;br /&gt;-&amp;nbsp;&lt;b&gt;tf(d,f)&lt;/b&gt;&amp;nbsp;:&amp;nbsp;특정&amp;nbsp;문서&amp;nbsp;d에서의&amp;nbsp;특정&amp;nbsp;단어&amp;nbsp;t의&amp;nbsp;등장&amp;nbsp;횟수 &lt;br /&gt;-&amp;nbsp;&lt;b&gt;df(t)&amp;nbsp;&lt;/b&gt;:&amp;nbsp;특정&amp;nbsp;단어&amp;nbsp;t가&amp;nbsp;등장한&amp;nbsp;문서의&amp;nbsp;수 &lt;br /&gt;-&lt;b&gt;&amp;nbsp;idf(t)&amp;nbsp;&lt;/b&gt;:&amp;nbsp;df(t)에&amp;nbsp;반비례하는&amp;nbsp;수.&amp;nbsp;df(t)+1에&amp;nbsp;역수를&amp;nbsp;취하고&amp;nbsp;문서의&amp;nbsp;총개수&amp;nbsp;n을&amp;nbsp;곱한&amp;nbsp;값에&amp;nbsp;log를&amp;nbsp;취해줌 &lt;br /&gt;-&amp;nbsp;모든&amp;nbsp;문서에&amp;nbsp;자주&amp;nbsp;등장하는&amp;nbsp;단어는&amp;nbsp;중요도가&amp;nbsp;낮다고&amp;nbsp;판단,&amp;nbsp;특정&amp;nbsp;문서에만&amp;nbsp;자주&amp;nbsp;등장하는&amp;nbsp;단어는&amp;nbsp;중요도가&amp;nbsp;높다고&amp;nbsp;판단.&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;u&gt;TF-IDF&amp;nbsp;값이&amp;nbsp;클수록&amp;nbsp;중요도가&amp;nbsp;큰&amp;nbsp;것&lt;/u&gt;. &lt;br /&gt;-&amp;nbsp;전체&amp;nbsp;문서수&amp;nbsp;n이&amp;nbsp;4인데,&amp;nbsp;df(t)&amp;nbsp;값이&amp;nbsp;3인&amp;nbsp;경우,&amp;nbsp;df(t)에&amp;nbsp;1을&amp;nbsp;더한&amp;nbsp;값이&amp;nbsp;4가&amp;nbsp;되고,&amp;nbsp;4를&amp;nbsp;4로&amp;nbsp;나눈&amp;nbsp;값인&amp;nbsp;1에&amp;nbsp;log를&amp;nbsp;취하면&amp;nbsp;값이&amp;nbsp;0이&amp;nbsp;되면서&amp;nbsp;가중치&amp;nbsp;역할을&amp;nbsp;수행하지&amp;nbsp;못함.&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;u&gt;사이킷런의&amp;nbsp;TF-IDF는&amp;nbsp;조정된&amp;nbsp;식&amp;nbsp;사용&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;사이킷런&amp;nbsp;DTM,&amp;nbsp;TF-IDF&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CountVectorizer : DTM 만들기 &lt;br /&gt;-&amp;nbsp;TfidfVectorizer&amp;nbsp;:&amp;nbsp;TF-IDF&amp;nbsp;자동&amp;nbsp;계산.&amp;nbsp;조정된&amp;nbsp;식을&amp;nbsp;사용함.&amp;nbsp;IDF의&amp;nbsp;로그&amp;nbsp;항의&amp;nbsp;분자에&amp;nbsp;1을&amp;nbsp;더하고&amp;nbsp;로그항에&amp;nbsp;1을&amp;nbsp;더해주고,&amp;nbsp;TF-IDF에&amp;nbsp;L2&amp;nbsp;정규화라는&amp;nbsp;방법으로&amp;nbsp;값을&amp;nbsp;조정.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;05.&amp;nbsp;벡터의&amp;nbsp;유사도&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;05-01 코사인 유사도 (Cosine Similarity)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;nbsp;코사인&amp;nbsp;유사도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- -1이상 1 이하의 값을 가지며, &lt;u&gt;1에 가까울 수록 유사도가 높다&lt;/u&gt;고 판단 &lt;br /&gt;-&amp;nbsp;벡터의&amp;nbsp;방향(패턴)에&amp;nbsp;초점을&amp;nbsp;두므로,&amp;nbsp;문서의&amp;nbsp;길이가&amp;nbsp;다른&amp;nbsp;상황에서&amp;nbsp;비교적&amp;nbsp;공정한&amp;nbsp;비교를&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있음. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;05-02 여러가지 유사도 기법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;nbsp;유클리드&amp;nbsp;거리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문서의 유사도를 구할 때, 자카드 유사도나 코사인 유사도만큼 유용하지는 않음 &lt;br /&gt;-&amp;nbsp;직전상의&amp;nbsp;거리&amp;nbsp;구하는&amp;nbsp;공식&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;자카드&amp;nbsp;유사도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;u&gt;합집합에서 교집합의 비율&lt;/u&gt;을 사용하여 유사도를 구함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/자연어 처리</category>
      <author>빈이즈</author>
      <guid isPermaLink="true">https://binrec.tistory.com/8</guid>
      <comments>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-4-%EC%B9%B4%EC%9A%B4%ED%8A%B8-%EA%B8%B0%EB%B0%98%EC%9D%98-%EB%8B%A8%EC%96%B4-%ED%91%9C%ED%98%84-Chapter-5-%EB%B2%A1%ED%84%B0%EC%9D%98-%EC%9C%A0%EC%82%AC%EB%8F%84#entry8comment</comments>
      <pubDate>Mon, 22 Jul 2024 10:16:53 +0900</pubDate>
    </item>
    <item>
      <title>[딥러닝을 이용한 자연어 처리 입문] Chapter 3. 언어 모델 (Language Model)</title>
      <link>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-3-%EC%96%B8%EC%96%B4-%EB%AA%A8%EB%8D%B8-Language-Model</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 [&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/6876&quot;&gt;유원준&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #808080; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/13671&quot;&gt;상준&lt;/a&gt;]의 [딥러닝을 이용한 자영어 처리 입문]에서 가져온 내용이며, [크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스](&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;a href=&quot;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot;&gt;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&lt;/a&gt;&lt;/span&gt;)에 따라 사용되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wikidocs.net/21695&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wikidocs.net/21695&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721358732199&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;03. 언어 모델(Language Model)&quot; data-og-description=&quot;언어 모델(Languagel Model)이란 단어 시퀀스(문장)에 확률을 할당하는 모델을 말합니다. 어떤 문장들이 있을 때, 기계가 이 문장은 적절해! 이 문장은 말이 안 돼! &amp;hellip;&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/21695&quot; data-og-url=&quot;https://wikidocs.net/21695&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vsr1n/hyWCJfqFvf/Vk44Tfi5VKik2XMSMmbhE0/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130&quot;&gt;&lt;a href=&quot;https://wikidocs.net/21695&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/21695&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vsr1n/hyWCJfqFvf/Vk44Tfi5VKik2XMSMmbhE0/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;03. 언어 모델(Language Model)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;언어 모델(Languagel Model)이란 단어 시퀀스(문장)에 확률을 할당하는 모델을 말합니다. 어떤 문장들이 있을 때, 기계가 이 문장은 적절해! 이 문장은 말이 안 돼! &amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;03-01&amp;nbsp;언어모델(Language&amp;nbsp;Model)이란?&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt; 언어 모델을 만드는 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 통계를 이용하는 방법 &lt;br /&gt;2)&amp;nbsp;인공신경망을&amp;nbsp;이용하는&amp;nbsp;방법&amp;nbsp;:&amp;nbsp;더&amp;nbsp;좋은&amp;nbsp;성능을&amp;nbsp;보임&amp;nbsp;ex.&amp;nbsp;GPT,&amp;nbsp;BERT&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;언어&amp;nbsp;모델&amp;nbsp;(Language&amp;nbsp;Model)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단어 시퀀스(문장)에 확률을 할당하는 일을 하는 모델로 가장 자연스러운 단어 시퀀스를 찾아냄.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;보편적으로&amp;nbsp;사용되는&amp;nbsp;방법은&amp;nbsp;이전&amp;nbsp;단어들이&amp;nbsp;주어졌을&amp;nbsp;때&amp;nbsp;다음&amp;nbsp;단어를&amp;nbsp;예측하도록&amp;nbsp;하는&amp;nbsp;것이고,&amp;nbsp;그&amp;nbsp;외에도&amp;nbsp;양쪽의&amp;nbsp;단어로부터&amp;nbsp;가운데&amp;nbsp;비어있는&amp;nbsp;단어를&amp;nbsp;예측하는&amp;nbsp;언어&amp;nbsp;모델도&amp;nbsp;있음&amp;nbsp;(BERT)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;단어&amp;nbsp;시퀀스의&amp;nbsp;확률&amp;nbsp;할당&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(* P : 확률을 의미함)&lt;br /&gt;&lt;br /&gt;a.&amp;nbsp;&lt;b&gt;기계&amp;nbsp;번역&lt;/b&gt;(Machine&amp;nbsp;Translation)&amp;nbsp;: &lt;br /&gt;P(나는&amp;nbsp;버스를&amp;nbsp;탔다)&amp;nbsp;&amp;gt;&amp;nbsp;P(나는&amp;nbsp;버스를&amp;nbsp;태운다) &lt;br /&gt;:&amp;nbsp;언어&amp;nbsp;모델은&amp;nbsp;두&amp;nbsp;문장을&amp;nbsp;비교하여&amp;nbsp;좌측의&amp;nbsp;문장의&amp;nbsp;확률이&amp;nbsp;더&amp;nbsp;높다고&amp;nbsp;판단 &lt;br /&gt;b. &lt;b&gt;오타 교정&lt;/b&gt; (Spell Correction) &lt;br /&gt;선생님이&amp;nbsp;교실로&amp;nbsp;부리나케 &lt;br /&gt;P(달려갔다)&amp;nbsp;&amp;gt;&amp;nbsp;P(잘려갔다) &lt;br /&gt;:&amp;nbsp;언어&amp;nbsp;모델은&amp;nbsp;두&amp;nbsp;문장을&amp;nbsp;비교하여&amp;nbsp;좌측의&amp;nbsp;문장의&amp;nbsp;확률이&amp;nbsp;더&amp;nbsp;높다고&amp;nbsp;판단 &lt;br /&gt;c.&lt;b&gt; 음성 인식&lt;/b&gt;(Speech Recognition) &lt;br /&gt;P(나는&amp;nbsp;메롱을&amp;nbsp;먹는다)&amp;nbsp;&amp;lt;&amp;nbsp;P(나는&amp;nbsp;메론을&amp;nbsp;먹는다) &lt;br /&gt;:&amp;nbsp;언어&amp;nbsp;모델은&amp;nbsp;두&amp;nbsp;문장을&amp;nbsp;비교하여&amp;nbsp;우측의&amp;nbsp;문장의&amp;nbsp;확률이&amp;nbsp;더&amp;nbsp;높다고&amp;nbsp;판단 &lt;br /&gt;&lt;br /&gt;=&amp;gt;&amp;nbsp;언어&amp;nbsp;모델은&amp;nbsp;&lt;u&gt;확률을&amp;nbsp;통해&amp;nbsp;보다&amp;nbsp;적절한&amp;nbsp;문장을&amp;nbsp;판단&lt;/u&gt;한다 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;03-02&amp;nbsp;통계적&amp;nbsp;언어&amp;nbsp;모델(Statistical&amp;nbsp;Language&amp;nbsp;Model,&amp;nbsp;SLM)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt; 문장에 대한 확률&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 조건부 확률을 사용하여 구함 &lt;br /&gt;-&amp;nbsp;각&amp;nbsp;단어들이&amp;nbsp;이전&amp;nbsp;단어가&amp;nbsp;주어졌을&amp;nbsp;때&amp;nbsp;다음&amp;nbsp;단어로&amp;nbsp;등장할&amp;nbsp;확률의&amp;nbsp;곱&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;카운트&amp;nbsp;기반의&amp;nbsp;접근&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 예를 들어 An adorable little boy 다음에 is가 나올 확률을 카운트 기반으로 구한다면 An adorable little boy is의 빈도수를 An adorable little boy의 빈도수를 나누어서 구함 &lt;br /&gt;-&amp;nbsp;한계&amp;nbsp;:&amp;nbsp;방대한&amp;nbsp;양의&amp;nbsp;데이터가&amp;nbsp;필요함.&amp;nbsp;=&amp;gt;&amp;nbsp;충분한&amp;nbsp;데이터를&amp;nbsp;관측하지&amp;nbsp;못하여&amp;nbsp;언어를&amp;nbsp;정확히&amp;nbsp;모델링하지&amp;nbsp;못하는&amp;nbsp;'희소&amp;nbsp;문제(sparsity&amp;nbsp;problem)이&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있음. &lt;br /&gt;-&amp;nbsp;희소&amp;nbsp;문제를&amp;nbsp;완화하는&amp;nbsp;방법&amp;nbsp;:&amp;nbsp;n-gram&amp;nbsp;언어&amp;nbsp;모델,&amp;nbsp;스무딩,&amp;nbsp;백오프&amp;nbsp;(희소문제에&amp;nbsp;대한&amp;nbsp;근본적인&amp;nbsp;해결책X)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;03-03&amp;nbsp;N-grm&amp;nbsp;언어&amp;nbsp;모델&amp;nbsp;(N-gram&amp;nbsp;Language&amp;nbsp;Model)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: SLM의 일종. 일부 단어만 고려하는 접근 방법. 몇 개의 단어를 보느냐를 정해야 하는데, n-gram에서 n이 결정함.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&amp;gt;N-gram&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;nbsp;n=1일&amp;nbsp;때&amp;nbsp;유니그램(unigram),&amp;nbsp;2일&amp;nbsp;때,&amp;nbsp;바이그램(bigram),&amp;nbsp;3일&amp;nbsp;때,&amp;nbsp;트라이그램(trigram)이라고&amp;nbsp;하고&amp;nbsp;4&amp;nbsp;이상일&amp;nbsp;때는&amp;nbsp;4-gram,&amp;nbsp;5-gram,&amp;nbsp;...&amp;nbsp;라고&amp;nbsp;함. &lt;br /&gt;-&amp;nbsp;n-gram을&amp;nbsp;통한&amp;nbsp;언어&amp;nbsp;모델에서는&amp;nbsp;다음에&amp;nbsp;나올&amp;nbsp;단어를&amp;nbsp;예측할&amp;nbsp;때,&amp;nbsp;n-1개의&amp;nbsp;단어에만&amp;nbsp;의존.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;'An&amp;nbsp;adorable&amp;nbsp;little&amp;nbsp;boy&amp;nbsp;is&amp;nbsp;spreading'&amp;nbsp;다음에&amp;nbsp;올&amp;nbsp;단어를&amp;nbsp;예측하고자&amp;nbsp;하는데,&amp;nbsp;4-gram을&amp;nbsp;이용한&amp;nbsp;언어&amp;nbsp;모델을&amp;nbsp;사용한다면,&amp;nbsp;boy&amp;nbsp;is&amp;nbsp;spreading&amp;nbsp;(3개&amp;nbsp;단어)&amp;nbsp;만&amp;nbsp;고려.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;한계점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 희소문제(Sparsity problem) &lt;br /&gt;-&amp;nbsp;n을&amp;nbsp;선택하는&amp;nbsp;trade-off&amp;nbsp;문제&amp;nbsp;:&amp;nbsp;n이&amp;nbsp;클수록&amp;nbsp;대부분의&amp;nbsp;경우에서&amp;nbsp;성능이&amp;nbsp;높아짐.&amp;nbsp;하지만&amp;nbsp;n이&amp;nbsp;커질수록&amp;nbsp;n-gram에서&amp;nbsp;카운트할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;확률이&amp;nbsp;적어지므로&amp;nbsp;희소문제가&amp;nbsp;심각해지고,&amp;nbsp;모델&amp;nbsp;사이즈가&amp;nbsp;커짐.&amp;nbsp;n이&amp;nbsp;작을&amp;nbsp;수록&amp;nbsp;근사의&amp;nbsp;정확도는&amp;nbsp;현실의&amp;nbsp;확률분포와&amp;nbsp;멀어짐.&amp;nbsp;=&amp;gt;&amp;nbsp;n은&amp;nbsp;최대&amp;nbsp;5를&amp;nbsp;넘게&amp;nbsp;잡아서는&amp;nbsp;안&amp;nbsp;된다고&amp;nbsp;권장. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;03-04&amp;nbsp;한국어에서의&amp;nbsp;언어&amp;nbsp;모델&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 한국어는 어순이 중요하지 않음 &lt;br /&gt;2)&amp;nbsp;한국어는&amp;nbsp;교착어&amp;nbsp;=&amp;gt;접사나&amp;nbsp;조사&amp;nbsp;등을&amp;nbsp;분리해야&amp;nbsp;함 &lt;br /&gt;3)&amp;nbsp;띄어쓰기가&amp;nbsp;제대로&amp;nbsp;지켜지지&amp;nbsp;않음 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;03-05&amp;nbsp;펄플렉서티(Perplexity,&amp;nbsp;PPL)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;모델&amp;nbsp;내에서&amp;nbsp;자신의&amp;nbsp;성능을&amp;nbsp;수치화하여&amp;nbsp;결과를&amp;nbsp;내놓음&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;언어&amp;nbsp;모델의&amp;nbsp;평가방법&amp;nbsp;:&amp;nbsp;PPL&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 펄플렉서티(perplexity, PPL)는 '헷갈리는'과 유사한 의미를 가진 단어. PPL은 '헷갈리는 정도'로 이해하자. &lt;br /&gt;-&amp;nbsp;수치가&amp;nbsp;낮을수록&amp;nbsp;언어&amp;nbsp;모델의&amp;nbsp;성능이&amp;nbsp;좋음 &lt;br /&gt;-&amp;nbsp;PPL&amp;nbsp;=&amp;nbsp;선택할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;가능한&amp;nbsp;경우의&amp;nbsp;수를&amp;nbsp;의미하는&amp;nbsp;분기계수(branching&amp;nbsp;factor).&amp;nbsp;즉&amp;nbsp;이&amp;nbsp;언어&amp;nbsp;모델이&amp;nbsp;특정&amp;nbsp;시점에서&amp;nbsp;평균적으로&amp;nbsp;몇&amp;nbsp;개의&amp;nbsp;선택지를&amp;nbsp;가지고&amp;nbsp;고민하고&amp;nbsp;있는&amp;nbsp;지를&amp;nbsp;의미. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>공부/자연어 처리</category>
      <author>빈이즈</author>
      <guid isPermaLink="true">https://binrec.tistory.com/7</guid>
      <comments>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-3-%EC%96%B8%EC%96%B4-%EB%AA%A8%EB%8D%B8-Language-Model#entry7comment</comments>
      <pubDate>Fri, 19 Jul 2024 12:13:50 +0900</pubDate>
    </item>
    <item>
      <title>[딥러닝을 이용한 자연어 처리 입문] Chapter 2. 텍스트 전처리</title>
      <link>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-2-%ED%85%8D%EC%8A%A4%ED%8A%B8-%EC%A0%84%EC%B2%98%EB%A6%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;이 글은 [&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/6876&quot;&gt;유원준&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #808080; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #0c93e4; text-align: start;&quot; href=&quot;https://wikidocs.net/profile/info/book/13671&quot;&gt;상준&lt;/a&gt;]의 [&lt;span&gt;딥러닝을 이용한 자영어 처리 입문&lt;/span&gt;]에서 가져온 내용이며, [&lt;span&gt;크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/span&gt;](&lt;span&gt;&lt;a href=&quot;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot;&gt;https://creativecommons.org/licenses/by-nc-sa/2.0/kr/&lt;/a&gt;&lt;/span&gt;)에 따라 사용되었습니다.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wikidocs.net/21694&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wikidocs.net/21694&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721358868165&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;02. 텍스트 전처리(Text preprocessing)&quot; data-og-description=&quot;텍스트 전처리는 풀고자 하는 문제의 용도에 맞게 텍스트를 사전에 처리하는 작업입니다. 요리를 할 때 재료를 제대로 손질하지 않으면, 요리가 엉망이 되는 것처럼 텍스트에 제대로 전&amp;hellip;&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/21694&quot; data-og-url=&quot;https://wikidocs.net/21694&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cW4Adv/hyWCzw65wV/f53bEwk4omHcUdPhtBK32k/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130&quot;&gt;&lt;a href=&quot;https://wikidocs.net/21694&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/21694&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cW4Adv/hyWCzw65wV/f53bEwk4omHcUdPhtBK32k/img.png?width=98&amp;amp;height=130&amp;amp;face=0_0_98_130');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;02. 텍스트 전처리(Text preprocessing)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;텍스트 전처리는 풀고자 하는 문제의 용도에 맞게 텍스트를 사전에 처리하는 작업입니다. 요리를 할 때 재료를 제대로 손질하지 않으면, 요리가 엉망이 되는 것처럼 텍스트에 제대로 전&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 텍스트 전처리&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;02-01&amp;nbsp;토큰화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; Penn Treebank Tokenization&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 규칙 1. 하이푼으로 구성된 단어는 하나로 유지 &lt;br /&gt;-&amp;nbsp;규칙&amp;nbsp;2.&amp;nbsp;doesn't와&amp;nbsp;같이&amp;nbsp;아포스트로피로&amp;nbsp;'접어'가&amp;nbsp;함께하는&amp;nbsp;단어는&amp;nbsp;분리해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; 문장 토큰화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 영어 : NLTK (sent_tokenize) &lt;br /&gt;- 한국어 : kss.&lt;br /&gt;- 한국어는 교착어이기에 띄어쓰기 단위로 분류하기 어려움. =&amp;gt; 형태소 토큰화가 필요함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 또한 띄어쓰기가 제대로 지켜지지 않은 경우가 많음.&lt;br /&gt;- 언어는 품사에 따라 뜻이 달라짐 (fly: 날다, 파리/ 못 : 망치로 박을때 사용, 못 날다 못하다 의 못 =&amp;gt;&amp;nbsp;&lt;u&gt;품사태깅&lt;/u&gt;이&amp;nbsp;필요&amp;nbsp;(영어&amp;nbsp;:&amp;nbsp;penn&amp;nbsp;treebank&amp;nbsp;pog&amp;nbsp;tags,&amp;nbsp;한국어&amp;nbsp;:&amp;nbsp;KoNLPy&amp;nbsp;패키지의&amp;nbsp;Okt,&amp;nbsp;메캅(속도&amp;nbsp;빠름),&amp;nbsp;코모란,&amp;nbsp;한나눔,&amp;nbsp;꼬꼬마..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; KoNLPy 패키지의 형태소 분석기의 공통적인 메소드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- morphs : 형태소 추출 &lt;br /&gt;-&amp;nbsp;pos&amp;nbsp;:&amp;nbsp;품사&amp;nbsp;태깅 &lt;br /&gt;-&amp;nbsp;nouns&amp;nbsp;:&amp;nbsp;명사&amp;nbsp;추출&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;02-02 정제 and 정규화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; 불용어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대표적으로 빈도가 적은 단어, 길이가 짧은 단어를 불용어로 많이 지정.&lt;br /&gt;-&amp;nbsp;짧은&amp;nbsp;단어는&amp;nbsp;영어의&amp;nbsp;경우&amp;nbsp;불용어로&amp;nbsp;지정하는&amp;nbsp;게&amp;nbsp;많고,&amp;nbsp;한국어는&amp;nbsp;짧은&amp;nbsp;단어로&amp;nbsp;불용어로&amp;nbsp;지정하는&amp;nbsp;것을&amp;nbsp;추천&amp;nbsp;X&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;02-03&amp;nbsp;어간추출&amp;nbsp;and&amp;nbsp;표제어&amp;nbsp;추출&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; 표제어 추출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;형태학적&amp;nbsp;파싱&amp;nbsp;:&amp;nbsp;어간과&amp;nbsp;접사를&amp;nbsp;분리하는&amp;nbsp;작업 &lt;br /&gt;-&amp;nbsp;NLTK의&amp;nbsp;WordNetLemmatizer&amp;nbsp;:&amp;nbsp;품사정보를&amp;nbsp;알려준다면,&amp;nbsp;정확한&amp;nbsp;Lemma&amp;nbsp;출력&amp;nbsp; &lt;br /&gt;-&amp;nbsp;EX.&amp;nbsp;(품사정보&amp;nbsp;안 알려줄 때)&amp;nbsp;dies&amp;nbsp;-&amp;gt;&amp;nbsp;dy,&amp;nbsp;알려줄 때,&amp;nbsp;die&amp;nbsp;-&amp;gt;&amp;nbsp;die&amp;nbsp;(코드&amp;nbsp;:&amp;nbsp;lemmatizer.lemmatize('dies','v')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; 어간추출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;품사&amp;nbsp;정보가&amp;nbsp;보존되지&amp;nbsp;않음.&amp;nbsp;사전에&amp;nbsp;존재하지&amp;nbsp;않는&amp;nbsp;단어일&amp;nbsp;경우가&amp;nbsp;많은 &lt;br /&gt;- 알고리즘 : 포터 알고리즘 (PorterStemmer), 랭커스터 알고리즘(LancasterStemmer)&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;02-06&amp;nbsp;정수인코딩&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; 정수인코딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Counter, FreqDist를 이용하여 단어의 빈도수 구함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- enumerate를 이용하여 인덱스부여하면 쉬움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- most_common을 이용하여&amp;nbsp; 상위 빈도수를 가진 단어만을 리턴할 수 있음 (vocal.most_common(5) : 5개의 상위 단어만) &lt;br /&gt;- &lt;b&gt;keras.tokenizer&lt;/b&gt; : 빈도수 순으로 인덱스도 자동 부여됨.&lt;u&gt; word_index&lt;/u&gt;를 사용하여 인덱스 확인가능. &lt;u&gt;word_counts&lt;/u&gt;를 이용하여 빈도수 확인가능. &lt;u&gt;test_to_sequences()&lt;/u&gt;를 이용하면 입력된 코퍼스에 대해 각 단어를 이미 정해진 인덱스로 반환. &lt;u&gt;tokenizer = Tokenizer(num_words=n)&lt;/u&gt;와 같은 방법으로 빈도수가 높은 상위 n개의 단어만 사용 가능.&amp;nbsp; &lt;u&gt;oov_token = 'OOV'&lt;/u&gt;를 인자로 사용하면, 단어 집합에 없는 단어들을 OOV로 간주(인덱스 1) &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;02-07&amp;nbsp;패딩&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; 패딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가장 긴 길이를 가진 문서의 길이를 기준으로 패딩을 많이 하지만, 꼭 그럴 필요는 없음. ex. 한 개의 문서의 길이가 5000이고 나머지 문서 길이 평균이 20이라면, 굳이 5천으로 패딩을 하지 않아도 됨. &lt;br /&gt;-&amp;nbsp;케라스&amp;nbsp;&lt;b&gt;pad_sequences()&amp;nbsp;&lt;/b&gt;:&amp;nbsp;기본적으로&amp;nbsp;인자&amp;nbsp;앞에&amp;nbsp;0을&amp;nbsp;채워 넣음.&amp;nbsp;뒤에&amp;nbsp;0을&amp;nbsp;넣고&amp;nbsp;싶다면,&amp;nbsp;padding&amp;nbsp;=&amp;nbsp;'post'를&amp;nbsp;인자로&amp;nbsp;두면&amp;nbsp;됨. &lt;br /&gt;-&amp;nbsp;&lt;u&gt;maxlen&amp;nbsp;&lt;/u&gt;인자를 통해 모든 문서의 길이를 정할 수 있음. 기존의 길이가 maxlen 보다 길었던 문서들의 정보는 일부 손실됨.&amp;nbsp; 길이에 맞춰 앞의 단어들이 없어짐. 뒤에 단어가 삭제되도록 하려면 truncating = 'post' 인자 사용.&lt;br /&gt;-&amp;nbsp;value&amp;nbsp;인자를&amp;nbsp;통해&amp;nbsp;패딩의&amp;nbsp;숫자를&amp;nbsp;결정할&amp;nbsp;수&amp;nbsp;있음.&amp;nbsp;기본&amp;nbsp;값은&amp;nbsp;0&amp;nbsp;&amp;nbsp;(제로패딩)&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;&lt;br /&gt;02-08&amp;nbsp;원-핫&amp;nbsp;인코딩&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; 케라스 원핫인코딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;to_categorical()&amp;nbsp;사용 &lt;br /&gt;- 비효율적인 저장공간. 5000개의 단어가 있다면 5000개의 벡터가 필요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단어의 잠재 의미를 반영하여 다차원 공간에 벡터화하는 기법을 사용하는 것이 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 1) &lt;u&gt;카운트 기반&lt;/u&gt;의 벡터화 방법 : &lt;b&gt;LAS&lt;/b&gt;(잠재 의미 분석), &lt;b&gt;HAL&lt;/b&gt;. 2) &lt;u&gt;예측 기반&lt;/u&gt;의 벡터화 방법 : &lt;b&gt;NNLM, RNNLM, Word2Vec, FastText&lt;/b&gt;. 3) 카&lt;u&gt;운트 기반과 예측 기반&lt;/u&gt; 모두 사용하는 방법 : &lt;b&gt;GloVe&lt;/b&gt;&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;02-10&amp;nbsp;한국어&amp;nbsp;전처리&amp;nbsp;패키지&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 형태소와 문장 토크나이징 도구 : KoNLPy, KSS&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; PyKoSpacing&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 띄어쓰기가 되지 않은 문장을 띄어쓰기해줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; Py-Hanspell&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 맞춤법 검사. 띄어쓰기 또한 보정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;gt; SOYNLP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 품사 태깅, 단어 토큰화 등을 지원하는 단어 토크나이저.&amp;nbsp;&amp;nbsp;비지도 학습으로 단어 토큰화 수행. 내부적으로 단어 점수 표로 동작함. 이 점수는 &lt;u&gt;응집 확률과 브랜칭 엔트로피를 활용&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;1)&amp;nbsp;신조어&amp;nbsp;문제&amp;nbsp;해결 &lt;/b&gt;&lt;br /&gt;:&amp;nbsp;기존의&amp;nbsp;형태소&amp;nbsp;분석기는&amp;nbsp;신조어나&amp;nbsp;형태소&amp;nbsp;분석기에&amp;nbsp;등록되지&amp;nbsp;않은&amp;nbsp;단어를&amp;nbsp;제대로&amp;nbsp;구분&amp;nbsp;못함&amp;nbsp;-&amp;gt;&amp;nbsp;SOYNLP는&amp;nbsp;특정&amp;nbsp;문자&amp;nbsp;시퀀스가&amp;nbsp;빈도가&amp;nbsp;높고,&amp;nbsp;앞&amp;nbsp;뒤로&amp;nbsp;조사&amp;nbsp;또는&amp;nbsp;완전히&amp;nbsp;다른&amp;nbsp;단어가&amp;nbsp;등장한다면&amp;nbsp;한&amp;nbsp;단어로&amp;nbsp;취급함.&amp;nbsp;신조어를&amp;nbsp;그런&amp;nbsp;식으로&amp;nbsp;구분할&amp;nbsp;수도&amp;nbsp;있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;2)&amp;nbsp;학습 &lt;/b&gt;&lt;br /&gt;-&amp;nbsp;&lt;b&gt;WordExtractor()&amp;nbsp;&lt;/b&gt;:&amp;nbsp;&amp;nbsp;전체&amp;nbsp;코퍼스에&amp;nbsp;대해&amp;nbsp;단어&amp;nbsp;점수표를&amp;nbsp;계산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;3)&amp;nbsp;응집&amp;nbsp;확률&lt;/b&gt;&amp;nbsp;:&amp;nbsp;내부&amp;nbsp;문자열이&amp;nbsp;얼마나&amp;nbsp;응집하여&amp;nbsp;자주&amp;nbsp;등장하는&amp;nbsp;지를&amp;nbsp;판단하는&amp;nbsp;척도.&amp;nbsp;&amp;nbsp;각&amp;nbsp;문자열이&amp;nbsp;주어졌을&amp;nbsp;때&lt;u&gt;&amp;nbsp;그다음&amp;nbsp;문자가&amp;nbsp;나올&amp;nbsp;확률&lt;/u&gt;을&amp;nbsp;계산하여&amp;nbsp;누적곱을&amp;nbsp;한&amp;nbsp;것입니다.&amp;nbsp;이&amp;nbsp;값이&amp;nbsp;높을수록&amp;nbsp;전체&amp;nbsp;코퍼스에서&amp;nbsp;이&amp;nbsp;문자열&amp;nbsp;시퀀스는&amp;nbsp;하나의&amp;nbsp;단어로&amp;nbsp;등장할&amp;nbsp;확률이&amp;nbsp;높습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;4)&amp;nbsp;브랜칭&amp;nbsp;엔트로피&lt;/b&gt;&amp;nbsp;:&amp;nbsp;확률&amp;nbsp;분포에&amp;nbsp;엔트로피&amp;nbsp;값&amp;nbsp;사용.&amp;nbsp;주어진&amp;nbsp;문자&amp;nbsp;시퀀스에서&amp;nbsp;다음&amp;nbsp;문자&amp;nbsp;예측을&amp;nbsp;위해&amp;nbsp;헷갈리는&amp;nbsp;정도로&amp;nbsp;비유할&amp;nbsp;수도&amp;nbsp;있음.&lt;u&gt;&amp;nbsp;하나의&amp;nbsp;완성된&amp;nbsp;단어에&amp;nbsp;가까워질수록&amp;nbsp;점수가&amp;nbsp;점점&amp;nbsp;줄어드는&lt;/u&gt;&amp;nbsp;양상을&amp;nbsp;보임.&amp;nbsp;-&amp;gt;&amp;nbsp;이&amp;nbsp;값을&amp;nbsp;통해&amp;nbsp;단어를&amp;nbsp;판단할&amp;nbsp;수&amp;nbsp;있음 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;5)&amp;nbsp;L&amp;nbsp;tokenizer&amp;nbsp;&lt;/b&gt;:&amp;nbsp;띄어쓰기&amp;nbsp;단위로&amp;nbsp;나는&amp;nbsp;어절&amp;nbsp;토큰은&amp;nbsp;주로&amp;nbsp;L&amp;nbsp;토큰&amp;nbsp;+&amp;nbsp;R&amp;nbsp;토큰의&amp;nbsp;형식을&amp;nbsp;가질&amp;nbsp;때가&amp;nbsp;많음.&amp;nbsp;예를&amp;nbsp;들면&amp;nbsp;'공원에'는&amp;nbsp;공원&amp;nbsp;+&amp;nbsp;에.&amp;nbsp;L토크나이저는&amp;nbsp;L토큰&amp;nbsp;+&amp;nbsp;R토큰으로&amp;nbsp;나누되,&amp;nbsp;분리기준을&amp;nbsp;&lt;u&gt;가장&amp;nbsp;높은&amp;nbsp;L&amp;nbsp;토큰&lt;/u&gt;을&amp;nbsp;찾아내는&amp;nbsp;원리를&amp;nbsp;갖고&amp;nbsp;있음. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;6) 최대 점수 토크나이저 &lt;/b&gt;:&amp;nbsp;띄어쓰기가&amp;nbsp;되지&amp;nbsp;않은&amp;nbsp;문장에서&amp;nbsp;점수가&amp;nbsp;높은&amp;nbsp;글자&amp;nbsp;시퀀스를&amp;nbsp;순차적으로&amp;nbsp;찾아내는&amp;nbsp;토크나이저.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; Customized KoNLPY&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 형태소 분석기 &lt;b&gt;Twitter&lt;/b&gt;을 사용하여 단어 토큰화 &lt;br /&gt;-&amp;nbsp;Twitter에&amp;nbsp;&lt;u&gt;add_dictionary&lt;/u&gt;('단어',&amp;nbsp;'품사')와&amp;nbsp;같은&amp;nbsp;형식으로&amp;nbsp;사전을&amp;nbsp;추가할&amp;nbsp;수&amp;nbsp;있음. &lt;br /&gt;- EX) twitter.add_dictionary('은경이','Noun') -&amp;gt; 은경이를 하나의 토큰으로 인식함. 띄어쓰기할 때 은경이를 붙여서 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7월 말에 데이콘에 자연어 처리 질의 응답 공모전이 있어서 참가해 보고자 자연어 처리 공부 시작! 1-2일에 한 챕터씩 끝내보자. (●'◡'●)&lt;/p&gt;</description>
      <category>공부/자연어 처리</category>
      <author>빈이즈</author>
      <guid isPermaLink="true">https://binrec.tistory.com/6</guid>
      <comments>https://binrec.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%9E%85%EB%AC%B8-Chapter-2-%ED%85%8D%EC%8A%A4%ED%8A%B8-%EC%A0%84%EC%B2%98%EB%A6%AC#entry6comment</comments>
      <pubDate>Thu, 18 Jul 2024 20:38:04 +0900</pubDate>
    </item>
  </channel>
</rss>