-
Notifications
You must be signed in to change notification settings - Fork 0
/
rss2.xml
416 lines (233 loc) · 371 KB
/
rss2.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>뚝딱수달 - 수달의 뚝딱뚝딱 개발 블로그.</title>
<link>http://techbless.github.io/</link>
<atom:link href="/rss2.xml" rel="self" type="application/rss+xml"/>
<description>TypeScript, Node.js, 알고리즘, 자료구조, 데이터베이스, 개발 팁, 각종 문제 해결 방법 등을 공유합니다.</description>
<pubDate>Tue, 12 Nov 2024 07:30:13 GMT</pubDate>
<generator>http://hexo.io/</generator>
<item>
<title>[Computer History Museum] ENIAC은 진정한 최초의 컴퓨터인가?</title>
<link>http://techbless.github.io/2024/11/05/ENIAC-ABC/</link>
<guid>http://techbless.github.io/2024/11/05/ENIAC-ABC/</guid>
<pubDate>Tue, 05 Nov 2024 14:33:22 GMT</pubDate>
<description>
<h2 id="1-Introduction"><a href="#1-Introduction" class="headerlink" title="1. Introduction"></a>1. Introduction</h2><p>이번에 아시아나와 대한항공의 합병을
</description>
<content:encoded><![CDATA[<h2 id="1-Introduction"><a href="#1-Introduction" class="headerlink" title="1. Introduction"></a>1. Introduction</h2><p>이번에 아시아나와 대한항공의 합병을 앞두고 남은 아시아나 마일리지를 소진할 겸 잠시 샌프란시스코 베이 지역으로 혼자 여행을 다녀왔다. 여행 중 들르게 된 곳은 마운틴 뷰(Mountain View)에 위치한 컴퓨터 <strong>역사 박물관(Computer History Museum)</strong> 이었다. 이 박물관은 기술의 발전사를 포괄적으로 보여주는 희귀하고 중요한 소장품들을 보유하고 있어, 평소 IT와 기술 역사에 관심이 많은 나에게 큰 흥미를 끌었다. 개인적으로 마운틴뷰와 이 근처 동네는 너무 깨끗하고 조용한 동네라서 너무 마음에 든다. 만약에 San Francisco 주변에서 출발하고 운전을 좋아한다면, US101 타고 바로 오는것 보다는 SR 1 국도를 타고 84번 국도(La Honda Rd)를 타고 넘어오면 낭만 있는 경치와 와인딩을 즐길 수 있다.</p><p><img src="/img/ABC_ENIAC/chm.jpg" alt="ABC"></p><p>사실 그동안 박물관을 3시간 넘게 정독하며 둘러본 적이 없었는데, 이번엔 정말 처음부터 끝까지 꼼꼼히 살펴볼 만큼 흥미로웠다. 귀국 후 이 내용에 대해 더 조사하였고,이곳에서 알게 된, 잘 알려지지 않은 ‘최초의 컴퓨터’에 대한 흥미로운 이야기를 공유하고자 한다.</p><h2 id="2-진정한-최초의-컴퓨터는-ABC와-ENIAC의-이야기"><a href="#2-진정한-최초의-컴퓨터는-ABC와-ENIAC의-이야기" class="headerlink" title="2. 진정한 최초의 컴퓨터는? ABC와 ENIAC의 이야기"></a>2. 진정한 최초의 컴퓨터는? ABC와 ENIAC의 이야기</h2><p><img src="/img/ABC_ENIAC/abc2.jpg" alt="ABC"></p><p>많은 사람들이 “최초의 컴퓨터”라 하면 <strong>ENIAC(Electronic Numerical Integrator and Computer)</strong> 을 떠올린다. 1940년대에 개발된 ENIAC은 방 하나를 가득 채울 만큼 거대한 크기와 엄청난 전력 소비량으로 유명하다. 하지만 ENIAC이 아닌, 잘 알려지지 않은 다른 컴퓨터가 최초의 컴퓨터 타이틀을 주장하고 있다. 그 이름은 <strong>아타나소프-베리 컴퓨터(Atanasoff–Berry Computer, ABC)</strong> 이다. ABC가 최초의 컴퓨터로 인정받는 과정은 과학적 성과뿐만 아니라 법적 분쟁과 특허, 그리고 기업의 영향력에 의해 역사적 서사가 어떻게 형성되는지를 보여준다.</p><h3 id="아타나소프-베리-컴퓨터의-탄생"><a href="#아타나소프-베리-컴퓨터의-탄생" class="headerlink" title="아타나소프-베리 컴퓨터의 탄생"></a>아타나소프-베리 컴퓨터의 탄생</h3><p>1930년대 후반, 존 빈센트 아타나소프라는 수학자이자 물리학자는 아이오와 주립대에서 복잡한 수학 계산을 자동으로 처리할 방법을 찾고 있었다. 그는 1937년 어느 날, 머리를 식히기 위해 들른 도로변 카페에서 컴퓨팅 장치의 기본 아이디어를 냅킨에 간단히 메모하기 시작했다. 이때의 메모는 전자식 계산 장치의 핵심 요소를 담고 있었고, 이후 컴퓨터 과학의 큰 진보로 이어졌다.</p><p><img src="/img/ABC_ENIAC/abc.jpg" alt="ABC"></p><p>아타나소프는 그의 대학원생 클리포드 베리와 함께 ABC를 개발했고, 이 장치는 동시에 여러 개의 연립방정식을 풀 수 있는 능력을 갖추고 있었다. ABC는 데이터를 2진법으로 표현하고 진공관을 사용한 전자 스위칭을 구현했는데, 이는 이후 컴퓨터들의 기초가 되는 중요한 개념이다. 다만 ABC는 완전한 프로그래밍이 가능한 기계는 아니었고, 특정 계산에 특화된 계산기로 제한적인 기능만 수행할 수 있었다. 하지만 당시로서는 매우 혁신적인 발명이었다.</p><p><a href="https://www.computerhistory.org/revolution/birth-of-the-computer/4/99">Atanasoff-Berry Computer (Computer History Museum)</a></p><h3 id="ENIAC과-“최초”-타이틀을-둘러싼-법적-논쟁"><a href="#ENIAC과-“최초”-타이틀을-둘러싼-법적-논쟁" class="headerlink" title="ENIAC과 “최초” 타이틀을 둘러싼 법적 논쟁"></a>ENIAC과 “최초” 타이틀을 둘러싼 법적 논쟁</h3><p>ENIAC은 그보다 약간 뒤인 1940년대에 펜실베이니아 대학교에서 존 모클리와 프레스퍼 에커트에 의해 개발되었다. ENIAC은 ABC와 달리 다양한 문제를 해결할 수 있는 범용 프로그래밍이 가능한 컴퓨터로, 전자식 대형 컴퓨터로서 그 위용을 자랑하며 군사와 원자 연구 등 여러 분야에 큰 영향을 미쳤다.</p><p><img src="/img/ABC_ENIAC/patent.jpg" alt="ABC"></p><p>ENIAC 발명자들은 1947년에 특허를 신청하여 독점적인 권리를 확보하려 했고, 이후 스페리 랜드(Sperry Rand)라는 회사가 ENIAC의 특허를 통해 다른 기업들에게 라이선스 비용을 요구하기 시작했다. 그러나 허니웰과 <strong>컨트롤 데이터 코퍼레이션(CDC)</strong> 이 ENIAC의 특허가 무효임을 주장하며 이의를 제기했다. 그 이유는 ENIAC의 공동 발명자인 존 모클리가 1941년에 아타나소프의 실험실을 방문해 ABC를 직접 보고 여러 개념을 논의했기 때문입니다. ENIAC이 ABC의 중요한 아이디어를 빌려왔다고 주장한 것이다.</p><p><a href="https://www.computerhistory.org/revolution/birth-of-the-computer/4/99">ENIAC: The First Electronic Computer. Until it Wasn’t. (Computer History Museum)</a></p><p>AD_HERE</p><h3 id="법원-판결-아타나소프-베리-컴퓨터의-공로-인정"><a href="#법원-판결-아타나소프-베리-컴퓨터의-공로-인정" class="headerlink" title="법원 판결: 아타나소프-베리 컴퓨터의 공로 인정"></a>법원 판결: 아타나소프-베리 컴퓨터의 공로 인정</h3><p><img src="/img/ABC_ENIAC/eniac.jpg" alt="ABC"></p><p>1973년, 이 복잡한 법적 분쟁은 “honeywell, Inc. v. Sperry Rand Corp” 소송으로 법원에 다다랐다. 법원은 허니웰 측의 손을 들어주며, ENIAC이 아타나소프와 베리가 개발한 ABC의 아이디어에 기반하고 있음을 인정했다. 결과적으로 ENIAC의 특허는 무효화됐고, ABC가 전자식 컴퓨터의 진정한 시작점으로 인정받게 됐다. 이 판결은 20세기의 중요한 발명 중 하나가 특정 기업의 소유가 아닌 “아무도 소유하지 않은” 것으로 남게 되었다는 점에서 큰 의미가 있다.</p><p><a href="https://www.nytimes.com/1973/04/13/archives/a-basic-computer-patent-at-sperry-rand-annulledd-reason-for-ruling.html?searchResultPosition=47">(1973 Newyork Times Archives) A Basic Computer Patent At Sperry Rand Annulled</a></p><h3 id="아타나소프-베리-컴퓨터가-덜-알려진-이유"><a href="#아타나소프-베리-컴퓨터가-덜-알려진-이유" class="headerlink" title="아타나소프-베리 컴퓨터가 덜 알려진 이유"></a>아타나소프-베리 컴퓨터가 덜 알려진 이유</h3><p>법원의 판결에도 불구하고, 여전히 많은 사람들이 ENIAC을 최초의 컴퓨터로 기억하는 데는 몇 가지 이유가 있다.</p><ol><li>규모와 대중성: ENIAC은 ABC에 비해 훨씬 크고 범용성이 뛰어났으며, 대중의 상상력을 자극하며 많은 언론의 주목을 받았다.</li><li>프로그래밍 기능: ENIAC은 범용 프로그래밍이 가능한 컴퓨터였고, ABC는 특정 연산에 특화된 계산기여서 오늘날 우리가 아는 컴퓨터에 더 가까웠다.</li><li>기업의 영향력: 스페리 랜드는 ENIAC의 성과를 알리고 특허를 방어하는 데 막대한 자원을 투입하며 ENIAC의 인지도를 높였다.</li><li>물리적 유산: ENIAC은 현재까지 보존 및 전시된 반면, ABC는 대부분 해체되어 잊혀졌고, 이후에야 원본을 기반으로 한 복제본이 제작되었다.</li></ol><p>ABC가 진정한 최초의 전자 컴퓨터로 인정받게 된 것은 단순한 발명이나 특허 이상의 의미를 담고 있다. 아타나소프와 베리가 도입한 2진법 계산과 전자 처리 방식은 이후 모든 컴퓨터의 기초가 되었으며, 그들의 아이디어는 오늘날의 스마트폰에 이르기까지 모든 컴퓨팅 장치에 큰 영향을 미쳤다. 비록 ABC는 ENIAC만큼 큰 주목을 받지 못했지만, 컴퓨터 과학의 기초를 다진 이들의 노력은 혁신의 중요성을 상기시켜준다. 이 외에도 Computer History Museum에는 컴퓨터를 좋아하는 사람이라면 좋아 할만한 다양한 소장품이 많으니 한번 쯤 가보는 것을 추천한다.</p><iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d93033.35617481785!2d-122.11131548445108!3d37.37978605370617!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x808fb7569249b39b%3A0xea8071641d7ef4f2!2z7Lu07ZOo7YSwIO2eiOyKpO2GoOumrCDrrqTsp4Dsl4Q!5e0!3m2!1sko!2skr!4v1731395757913!5m2!1sko!2skr" height="300" style="border:0; width: 100%" allowfullscreen="" loading="lazy" referrerpolicy="no-referrer-when-downgrade"></iframe>]]></content:encoded>
<comments>http://techbless.github.io/2024/11/05/ENIAC-ABC/#disqus_thread</comments>
</item>
<item>
<title>[논문 리뷰] A Style-Based Generator Architecture for Generative Adversarial Networks</title>
<link>http://techbless.github.io/2023/12/08/style-gan/</link>
<guid>http://techbless.github.io/2023/12/08/style-gan/</guid>
<pubDate>Fri, 08 Dec 2023 04:16:09 GMT</pubDate>
<description>
<p>링크: <a href="https://arxiv.org/abs/1812.04948">https://arxiv.org/abs/1812.04948</a><br>저널|학회: CVPR 2019<br>연구목적: ProGAN의 개선, Disentanglme
</description>
<content:encoded><![CDATA[<p>링크: <a href="https://arxiv.org/abs/1812.04948">https://arxiv.org/abs/1812.04948</a><br>저널|학회: CVPR 2019<br>연구목적: ProGAN의 개선, Disentanglment 개선<br>데이터셋: N/A<br>주요결과: 고해상도 이미지 생성, FFHQ 데이터셋, Disentanglement<br>저자: Tero Karras et al.</p><h2 id="1-Introduction"><a href="#1-Introduction" class="headerlink" title="1. Introduction"></a>1. Introduction</h2><p>StyleGAN으로 알려진 이 논문은 Progressive Growing의 아이디어와 함께 Style transfer의 아키텍처로 부터 영감을 받아 혁신적인 Generator를 고안하였다. 논문에서 제안된 style-based generator만으로 기본적인 discriminator나 loss에도 robust하다. 이 논문 이후로 StyleGAN의 여러 버전이나오고 있으나 전반적인 연구 흐름을 따라가기 위해 이해하고 넘어가면 좋을 것같다. 본 연구의 주요 Contribution은 다음과 같다.</p><ol><li>style-based Generator로 고해상도, 고퀄리티 이미지를 생성한다.</li><li>기존 GAN구조의 entanglement할 수밖에 없음을 재확인하였다.</li><li>Disentanglemen를 재정의 하고 좋은 퀄리티의 이미지를 생성하는 것에 초점을 둔다.</li><li>FFHQ데이터셋을 제시한다.</li></ol><h2 id="2-Style-based-Generator"><a href="#2-Style-based-Generator" class="headerlink" title="2. Style-based Generator"></a>2. Style-based Generator</h2><p>StyleGAN은 앞서 말한 바와 같이 Generator의 아키텍처에 초점을 두고 있다. 이 구조에서 주목할만한 부분은 다음과 같다.</p><ol><li>Mapping Network</li><li>AdaIN</li><li>Noise Injection</li></ol><p><img src="/img/stylegan/img1.png" alt="Untitled"><br>Fig. 1. baseline과 styleGAN 아키텍처 비교</p><h3 id="2-1-Mapping-Network"><a href="#2-1-Mapping-Network" class="headerlink" title="2.1 Mapping Network"></a>2.1 Mapping Network</h3><p>Mapping Network의 경우 Mapping Network을 이해하기 위해 먼저 disentanglement가 무엇인지 알아야할 필요가 있다.<br>Entanglement를 직역하면 ‘얽혀있다’라는 의미로, 반대로 Disentanglement는 ‘잘 분리되어있다’ 정도로 해석할 수 잇다. GAN에서는 1) 어떤 attribute를 잘 나눌수 있다는 것, 2)latent space가 linear subspace로 구성된다는 것을 의미한다.</p><p><img src="/img/stylegan/img2.png" alt="Untitled"><br>Fig. 2. Entanglement의 시각적 설명</p><p>Fig. 2a를 실제 데이터의 분포라고 하고 가로축은 성별, 세로축은 머리길이에 대한 축이라고 할때, 머리가 짧은 남성에서 머리가 긴 여성으로 interpolation을 수행한다면, Fig. 2a와 같이 중간 과정의 데이터셋이 존재 하지 않는다고 가정할때 interpolation 중간에 급격한 변화(성별과 머리길이에 상관없는 feature)가 나타난다. 이를 space가 linear하지 않다는 것을 의미한다.</p><p>Fig. 2b는 PGGAN의 경우로 데이터 분포를 Gaussian으로 가정하기 때문에 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.636ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 723 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D44D" d="M58 8Q58 23 64 35Q64 36 329 334T596 635L586 637Q575 637 512 637H500H476Q442 637 420 635T365 624T311 598T266 548T228 469Q227 466 226 463T224 458T223 453T222 450L221 448Q218 443 202 443Q185 443 182 453L214 561Q228 606 241 651Q249 679 253 681Q256 683 487 683H718Q723 678 723 675Q723 673 717 649Q189 54 188 52L185 49H274Q369 50 377 51Q452 60 500 100T579 247Q587 272 590 277T603 282H607Q628 282 628 271Q547 5 541 2Q538 0 300 0H124Q58 0 58 8Z"></path></g></g></g></svg></mjx-container> space는 원래 분포가 Gaussian에 맞춰 뒤틀린다. 따라서 이 경우 entangle할수 밖에 없다.</p><p>Fig. 2c는 entanglment를 방지하기 위해 mapping network를 통해 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.636ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 723 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D44D" d="M58 8Q58 23 64 35Q64 36 329 334T596 635L586 637Q575 637 512 637H500H476Q442 637 420 635T365 624T311 598T266 548T228 469Q227 466 226 463T224 458T223 453T222 450L221 448Q218 443 202 443Q185 443 182 453L214 561Q228 606 241 651Q249 679 253 681Q256 683 487 683H718Q723 678 723 675Q723 673 717 649Q189 54 188 52L185 49H274Q369 50 377 51Q452 60 500 100T579 247Q587 272 590 277T603 282H607Q628 282 628 271Q547 5 541 2Q538 0 300 0H124Q58 0 58 8Z"></path></g></g></g></svg></mjx-container> space를 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.05ex;" xmlns="http://www.w3.org/2000/svg" width="2.371ex" height="1.595ex" role="img" focusable="false" viewBox="0 -683 1048 705"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D44A" d="M436 683Q450 683 486 682T553 680Q604 680 638 681T677 682Q695 682 695 674Q695 670 692 659Q687 641 683 639T661 637Q636 636 621 632T600 624T597 615Q597 603 613 377T629 138L631 141Q633 144 637 151T649 170T666 200T690 241T720 295T759 362Q863 546 877 572T892 604Q892 619 873 628T831 637Q817 637 817 647Q817 650 819 660Q823 676 825 679T839 682Q842 682 856 682T895 682T949 681Q1015 681 1034 683Q1048 683 1048 672Q1048 666 1045 655T1038 640T1028 637Q1006 637 988 631T958 617T939 600T927 584L923 578L754 282Q586 -14 585 -15Q579 -22 561 -22Q546 -22 542 -17Q539 -14 523 229T506 480L494 462Q472 425 366 239Q222 -13 220 -15T215 -19Q210 -22 197 -22Q178 -22 176 -15Q176 -12 154 304T131 622Q129 631 121 633T82 637H58Q51 644 51 648Q52 671 64 683H76Q118 680 176 680Q301 680 313 683H323Q329 677 329 674T327 656Q322 641 318 637H297Q236 634 232 620Q262 160 266 136L501 550L499 587Q496 629 489 632Q483 636 447 637Q428 637 422 639T416 648Q416 650 418 660Q419 664 420 669T421 676T424 680T428 682T436 683Z"></path></g></g></g></svg></mjx-container> space로 맵핑하여 less entangle하게 만든다. 따라서 interpolation과정에서 더 linear하게 동작할 수 있다. </p><p>mapping network를 통해 smpling한 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.052ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 465 453"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D467" d="M347 338Q337 338 294 349T231 360Q211 360 197 356T174 346T162 335T155 324L153 320Q150 317 138 317Q117 317 117 325Q117 330 120 339Q133 378 163 406T229 440Q241 442 246 442Q271 442 291 425T329 392T367 375Q389 375 411 408T434 441Q435 442 449 442H462Q468 436 468 434Q468 430 463 420T449 399T432 377T418 358L411 349Q368 298 275 214T160 106L148 94L163 93Q185 93 227 82T290 71Q328 71 360 90T402 140Q406 149 409 151T424 153Q443 153 443 143Q443 138 442 134Q425 72 376 31T278 -11Q252 -11 232 6T193 40T155 57Q111 57 76 -3Q70 -11 59 -11H54H41Q35 -5 35 -2Q35 13 93 84Q132 129 225 214T340 322Q352 338 347 338Z"></path></g></g></g></svg></mjx-container> vector를 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.62ex" height="1.027ex" role="img" focusable="false" viewBox="0 -443 716 454"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z"></path></g></g></g></svg></mjx-container> vector로 변환하였고, synthesis network에서 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.052ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 465 453"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D467" d="M347 338Q337 338 294 349T231 360Q211 360 197 356T174 346T162 335T155 324L153 320Q150 317 138 317Q117 317 117 325Q117 330 120 339Q133 378 163 406T229 440Q241 442 246 442Q271 442 291 425T329 392T367 375Q389 375 411 408T434 441Q435 442 449 442H462Q468 436 468 434Q468 430 463 420T449 399T432 377T418 358L411 349Q368 298 275 214T160 106L148 94L163 93Q185 93 227 82T290 71Q328 71 360 90T402 140Q406 149 409 151T424 153Q443 153 443 143Q443 138 442 134Q425 72 376 31T278 -11Q252 -11 232 6T193 40T155 57Q111 57 76 -3Q70 -11 59 -11H54H41Q35 -5 35 -2Q35 13 93 84Q132 129 225 214T340 322Q352 338 347 338Z"></path></g></g></g></svg></mjx-container>대신 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.62ex" height="1.027ex" role="img" focusable="false" viewBox="0 -443 716 454"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z"></path></g></g></g></svg></mjx-container>를 사용해 이미지를 생성한다.</p><h3 id="2-3-AdaIN"><a href="#2-3-AdaIN" class="headerlink" title="2.3 AdaIN"></a>2.3 AdaIN</h3><p>AdaIN (Adaptive Instance Normalization)은 Style Transfer에 사용되는 기술로, 콘텐츠 이미지에 스타일 이미지의 특성을 적용하는 데 사용된다. 이 과정은 다음과 같은 단계로 구성된다:</p><ol><li>콘텐츠 이미지의 정규화: 콘텐츠 이미지 x는 인스턴스 정규화를 통해 정규화됩니다. 이는 각 이미지(인스턴스)와 채널별로 평균을 0으로, 분산을 1로 조정하는 과정입니다. 여기서 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="4.419ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1953 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D707" d="M58 -216Q44 -216 34 -208T23 -186Q23 -176 96 116T173 414Q186 442 219 442Q231 441 239 435T249 423T251 413Q251 401 220 279T187 142Q185 131 185 107V99Q185 26 252 26Q261 26 270 27T287 31T302 38T315 45T327 55T338 65T348 77T356 88T365 100L372 110L408 253Q444 395 448 404Q461 431 491 431Q504 431 512 424T523 412T525 402L449 84Q448 79 448 68Q448 43 455 35T476 26Q485 27 496 35Q517 55 537 131Q543 151 547 152Q549 153 557 153H561Q580 153 580 144Q580 138 575 117T555 63T523 13Q510 0 491 -8Q483 -10 467 -10Q446 -10 429 -4T402 11T385 29T376 44T374 51L368 45Q362 39 350 30T324 12T288 -4T246 -11Q199 -11 153 12L129 -85Q108 -167 104 -180T92 -202Q76 -216 58 -216Z"></path></g><g data-mml-node="mo" transform="translate(603,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(992,0)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(1564,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>는 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.294ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 572 453"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g></g></g></svg></mjx-container>의 평균, <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="4.346ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1921 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D70E" d="M184 -11Q116 -11 74 34T31 147Q31 247 104 333T274 430Q275 431 414 431H552Q553 430 555 429T559 427T562 425T565 422T567 420T569 416T570 412T571 407T572 401Q572 357 507 357Q500 357 490 357T476 358H416L421 348Q439 310 439 263Q439 153 359 71T184 -11ZM361 278Q361 358 276 358Q152 358 115 184Q114 180 114 178Q106 141 106 117Q106 67 131 47T188 26Q242 26 287 73Q316 103 334 153T356 233T361 278Z"></path></g><g data-mml-node="mo" transform="translate(571,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(960,0)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(1532,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>는 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.294ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 572 453"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g></g></g></svg></mjx-container>의 표준편차이다.</li></ol><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -2.172ex;" xmlns="http://www.w3.org/2000/svg" width="13.785ex" height="5.475ex" role="img" focusable="false" viewBox="0 -1460 6093 2420"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(313.8,16) translate(-250 0)"><path data-c="5E" d="M112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560Z"></path></g></g></g><g data-mml-node="mo" transform="translate(849.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mfrac" transform="translate(1905.6,0)"><g data-mml-node="mrow" transform="translate(220,710)"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(794.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mi" transform="translate(1794.4,0)"><path data-c="1D707" d="M58 -216Q44 -216 34 -208T23 -186Q23 -176 96 116T173 414Q186 442 219 442Q231 441 239 435T249 423T251 413Q251 401 220 279T187 142Q185 131 185 107V99Q185 26 252 26Q261 26 270 27T287 31T302 38T315 45T327 55T338 65T348 77T356 88T365 100L372 110L408 253Q444 395 448 404Q461 431 491 431Q504 431 512 424T523 412T525 402L449 84Q448 79 448 68Q448 43 455 35T476 26Q485 27 496 35Q517 55 537 131Q543 151 547 152Q549 153 557 153H561Q580 153 580 144Q580 138 575 117T555 63T523 13Q510 0 491 -8Q483 -10 467 -10Q446 -10 429 -4T402 11T385 29T376 44T374 51L368 45Q362 39 350 30T324 12T288 -4T246 -11Q199 -11 153 12L129 -85Q108 -167 104 -180T92 -202Q76 -216 58 -216Z"></path></g><g data-mml-node="mo" transform="translate(2397.4,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(2786.4,0)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(3358.4,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g><g data-mml-node="mrow" transform="translate(1133.2,-710)"><g data-mml-node="mi"><path data-c="1D70E" d="M184 -11Q116 -11 74 34T31 147Q31 247 104 333T274 430Q275 431 414 431H552Q553 430 555 429T559 427T562 425T565 422T567 420T569 416T570 412T571 407T572 401Q572 357 507 357Q500 357 490 357T476 358H416L421 348Q439 310 439 263Q439 153 359 71T184 -11ZM361 278Q361 358 276 358Q152 358 115 184Q114 180 114 178Q106 141 106 117Q106 67 131 47T188 26Q242 26 287 73Q316 103 334 153T356 233T361 278Z"></path></g><g data-mml-node="mo" transform="translate(571,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(960,0)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(1532,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g><rect width="3947.4" height="60" x="120" y="220"></rect></g></g></g></svg></mjx-container></p><ol start="2"><li><p>스타일 이미지의 Affine 변환: 스타일 이미지 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.464ex;" xmlns="http://www.w3.org/2000/svg" width="1.109ex" height="1.464ex" role="img" focusable="false" viewBox="0 -442 490 647"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g></g></svg></mjx-container>는 Affine 변환을 통해 스타일 스케일링 인자 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="4.161ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1839 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D70E" d="M184 -11Q116 -11 74 34T31 147Q31 247 104 333T274 430Q275 431 414 431H552Q553 430 555 429T559 427T562 425T565 422T567 420T569 416T570 412T571 407T572 401Q572 357 507 357Q500 357 490 357T476 358H416L421 348Q439 310 439 263Q439 153 359 71T184 -11ZM361 278Q361 358 276 358Q152 358 115 184Q114 180 114 178Q106 141 106 117Q106 67 131 47T188 26Q242 26 287 73Q316 103 334 153T356 233T361 278Z"></path></g><g data-mml-node="mo" transform="translate(571,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(960,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(1450,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>와 스타일 바이어스 인자 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="4.233ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1871 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D707" d="M58 -216Q44 -216 34 -208T23 -186Q23 -176 96 116T173 414Q186 442 219 442Q231 441 239 435T249 423T251 413Q251 401 220 279T187 142Q185 131 185 107V99Q185 26 252 26Q261 26 270 27T287 31T302 38T315 45T327 55T338 65T348 77T356 88T365 100L372 110L408 253Q444 395 448 404Q461 431 491 431Q504 431 512 424T523 412T525 402L449 84Q448 79 448 68Q448 43 455 35T476 26Q485 27 496 35Q517 55 537 131Q543 151 547 152Q549 153 557 153H561Q580 153 580 144Q580 138 575 117T555 63T523 13Q510 0 491 -8Q483 -10 467 -10Q446 -10 429 -4T402 11T385 29T376 44T374 51L368 45Q362 39 350 30T324 12T288 -4T246 -11Q199 -11 153 12L129 -85Q108 -167 104 -180T92 -202Q76 -216 58 -216Z"></path></g><g data-mml-node="mo" transform="translate(603,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(992,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(1482,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>를 생성한다. 이 변환은 신경망을 통해 학습되며, 스타일 이미지의 특징을 캡처하는 데 사용된다.</p></li><li><p>정규화된 콘텐츠 이미지 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.294ex" height="1.857ex" role="img" focusable="false" viewBox="0 -810 572 821"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(313.8,16) translate(-250 0)"><path data-c="5E" d="M112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560Z"></path></g></g></g></g></g></svg></mjx-container>는 스타일 이미지에서 추출된 스케일링 인자와 바이어스 인자를 사용하여 조정된다. 이는 콘텐츠 이미지에 스타일 특성을 입히는 과정이다.</p></li></ol><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="27.239ex" height="2.398ex" role="img" focusable="false" viewBox="0 -810 12039.7 1060"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mtext"><path data-c="41" d="M255 0Q240 3 140 3Q48 3 39 0H32V46H47Q119 49 139 88Q140 91 192 245T295 553T348 708Q351 716 366 716H376Q396 715 400 709Q402 707 508 390L617 67Q624 54 636 51T687 46H717V0H708Q699 3 581 3Q458 3 437 0H427V46H440Q510 46 510 64Q510 66 486 138L462 209H229L209 150Q189 91 189 85Q189 72 209 59T259 46H264V0H255ZM447 255L345 557L244 256Q244 255 345 255H447Z"></path><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" transform="translate(750,0)"></path><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(1306,0)"></path><path data-c="49" d="M328 0Q307 3 180 3T32 0H21V46H43Q92 46 106 49T126 60Q128 63 128 342Q128 620 126 623Q122 628 118 630T96 635T43 637H21V683H32Q53 680 180 680T328 683H339V637H317Q268 637 254 634T234 623Q232 620 232 342Q232 63 234 60Q238 55 242 53T264 48T317 46H339V0H328Z" transform="translate(1806,0)"></path><path data-c="4E" d="M42 46Q74 48 94 56T118 69T128 86V634H124Q114 637 52 637H25V683H232L235 680Q237 679 322 554T493 303L578 178V598Q572 608 568 613T544 627T492 637H475V683H483Q498 680 600 680Q706 680 715 683H724V637H707Q634 633 622 598L621 302V6L614 0H600Q585 0 582 3T481 150T282 443T171 605V345L172 86Q183 50 257 46H274V0H265Q250 3 150 3Q48 3 33 0H25V46H42Z" transform="translate(2167,0)"></path></g><g data-mml-node="mo" transform="translate(2917,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(3306,0)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(3878,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(4322.7,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(4812.7,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(5479.4,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mi" transform="translate(6535.2,0)"><path data-c="1D70E" d="M184 -11Q116 -11 74 34T31 147Q31 247 104 333T274 430Q275 431 414 431H552Q553 430 555 429T559 427T562 425T565 422T567 420T569 416T570 412T571 407T572 401Q572 357 507 357Q500 357 490 357T476 358H416L421 348Q439 310 439 263Q439 153 359 71T184 -11ZM361 278Q361 358 276 358Q152 358 115 184Q114 180 114 178Q106 141 106 117Q106 67 131 47T188 26Q242 26 287 73Q316 103 334 153T356 233T361 278Z"></path></g><g data-mml-node="mo" transform="translate(7106.2,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(7495.2,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(7985.2,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(8374.2,0)"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(313.8,16) translate(-250 0)"><path data-c="5E" d="M112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560Z"></path></g></g></g><g data-mml-node="mo" transform="translate(9168.4,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="mi" transform="translate(10168.7,0)"><path data-c="1D707" d="M58 -216Q44 -216 34 -208T23 -186Q23 -176 96 116T173 414Q186 442 219 442Q231 441 239 435T249 423T251 413Q251 401 220 279T187 142Q185 131 185 107V99Q185 26 252 26Q261 26 270 27T287 31T302 38T315 45T327 55T338 65T348 77T356 88T365 100L372 110L408 253Q444 395 448 404Q461 431 491 431Q504 431 512 424T523 412T525 402L449 84Q448 79 448 68Q448 43 455 35T476 26Q485 27 496 35Q517 55 537 131Q543 151 547 152Q549 153 557 153H561Q580 153 580 144Q580 138 575 117T555 63T523 13Q510 0 491 -8Q483 -10 467 -10Q446 -10 429 -4T402 11T385 29T376 44T374 51L368 45Q362 39 350 30T324 12T288 -4T246 -11Q199 -11 153 12L129 -85Q108 -167 104 -180T92 -202Q76 -216 58 -216Z"></path></g><g data-mml-node="mo" transform="translate(10771.7,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(11160.7,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(11650.7,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container></p><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -2.172ex;" xmlns="http://www.w3.org/2000/svg" width="38.974ex" height="5.475ex" role="img" focusable="false" viewBox="0 -1460 17226.7 2420"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mtext"><path data-c="41" d="M255 0Q240 3 140 3Q48 3 39 0H32V46H47Q119 49 139 88Q140 91 192 245T295 553T348 708Q351 716 366 716H376Q396 715 400 709Q402 707 508 390L617 67Q624 54 636 51T687 46H717V0H708Q699 3 581 3Q458 3 437 0H427V46H440Q510 46 510 64Q510 66 486 138L462 209H229L209 150Q189 91 189 85Q189 72 209 59T259 46H264V0H255ZM447 255L345 557L244 256Q244 255 345 255H447Z"></path><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" transform="translate(750,0)"></path><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(1306,0)"></path><path data-c="49" d="M328 0Q307 3 180 3T32 0H21V46H43Q92 46 106 49T126 60Q128 63 128 342Q128 620 126 623Q122 628 118 630T96 635T43 637H21V683H32Q53 680 180 680T328 683H339V637H317Q268 637 254 634T234 623Q232 620 232 342Q232 63 234 60Q238 55 242 53T264 48T317 46H339V0H328Z" transform="translate(1806,0)"></path><path data-c="4E" d="M42 46Q74 48 94 56T118 69T128 86V634H124Q114 637 52 637H25V683H232L235 680Q237 679 322 554T493 303L578 178V598Q572 608 568 613T544 627T492 637H475V683H483Q498 680 600 680Q706 680 715 683H724V637H707Q634 633 622 598L621 302V6L614 0H600Q585 0 582 3T481 150T282 443T171 605V345L172 86Q183 50 257 46H274V0H265Q250 3 150 3Q48 3 33 0H25V46H42Z" transform="translate(2167,0)"></path></g><g data-mml-node="mo" transform="translate(2917,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="msub" transform="translate(3306,0)"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(4205,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(4649.6,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(5139.6,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(5806.4,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="msub" transform="translate(6862.2,0)"><g data-mml-node="mi"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="TeXAtom" transform="translate(523,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path></g><g data-mml-node="mo" transform="translate(469,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(747,0)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g></g><g data-mml-node="mrow" transform="translate(8374,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="28" d="M701 -940Q701 -943 695 -949H664Q662 -947 636 -922T591 -879T537 -818T475 -737T412 -636T350 -511T295 -362T250 -186T221 17T209 251Q209 962 573 1361Q596 1386 616 1405T649 1437T664 1450H695Q701 1444 701 1441Q701 1436 681 1415T629 1356T557 1261T476 1118T400 927T340 675T308 359Q306 321 306 250Q306 -139 400 -430T690 -924Q701 -936 701 -940Z"></path></g><g data-mml-node="mfrac" transform="translate(736,0)"><g data-mml-node="mrow" transform="translate(220,710)"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(1121.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mi" transform="translate(2121.4,0)"><path data-c="1D707" d="M58 -216Q44 -216 34 -208T23 -186Q23 -176 96 116T173 414Q186 442 219 442Q231 441 239 435T249 423T251 413Q251 401 220 279T187 142Q185 131 185 107V99Q185 26 252 26Q261 26 270 27T287 31T302 38T315 45T327 55T338 65T348 77T356 88T365 100L372 110L408 253Q444 395 448 404Q461 431 491 431Q504 431 512 424T523 412T525 402L449 84Q448 79 448 68Q448 43 455 35T476 26Q485 27 496 35Q517 55 537 131Q543 151 547 152Q549 153 557 153H561Q580 153 580 144Q580 138 575 117T555 63T523 13Q510 0 491 -8Q483 -10 467 -10Q446 -10 429 -4T402 11T385 29T376 44T374 51L368 45Q362 39 350 30T324 12T288 -4T246 -11Q199 -11 153 12L129 -85Q108 -167 104 -180T92 -202Q76 -216 58 -216Z"></path></g><g data-mml-node="mo" transform="translate(2724.4,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="msub" transform="translate(3113.4,0)"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(4012.3,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g><g data-mml-node="mrow" transform="translate(1296.7,-710)"><g data-mml-node="mi"><path data-c="1D70E" d="M184 -11Q116 -11 74 34T31 147Q31 247 104 333T274 430Q275 431 414 431H552Q553 430 555 429T559 427T562 425T565 422T567 420T569 416T570 412T571 407T572 401Q572 357 507 357Q500 357 490 357T476 358H416L421 348Q439 310 439 263Q439 153 359 71T184 -11ZM361 278Q361 358 276 358Q152 358 115 184Q114 180 114 178Q106 141 106 117Q106 67 131 47T188 26Q242 26 287 73Q316 103 334 153T356 233T361 278Z"></path></g><g data-mml-node="mo" transform="translate(571,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="msub" transform="translate(960,0)"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(1859,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g><rect width="4601.3" height="60" x="120" y="220"></rect></g><g data-mml-node="mo" transform="translate(5577.3,0) translate(0 -0.5)"><path data-c="29" d="M34 1438Q34 1446 37 1448T50 1450H56H71Q73 1448 99 1423T144 1380T198 1319T260 1238T323 1137T385 1013T440 864T485 688T514 485T526 251Q526 134 519 53Q472 -519 162 -860Q139 -885 119 -904T86 -936T71 -949H56Q43 -949 39 -947T34 -937Q88 -883 140 -813Q428 -430 428 251Q428 453 402 628T338 922T245 1146T145 1309T46 1425Q44 1427 42 1429T39 1433T36 1436L34 1438Z"></path></g></g><g data-mml-node="mo" transform="translate(14909.6,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="msub" transform="translate(15909.8,0)"><g data-mml-node="mi"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="TeXAtom" transform="translate(523,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z"></path></g><g data-mml-node="mo" transform="translate(429,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(707,0)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g></g></g></g></svg></mjx-container><br>AdaIN은 Instance Normalization을 기반으로 하며, 각 인스턴스와 채널별로 스타일 인자들이 적용된다. 이를 통해 콘텐츠 이미지는 원래의 구조를 유지하면서 스타일 이미지의 특성을 획득한다. 학습 가능한 Affine 변환은 스타일 이미지로부터 복잡한 스타일 특징을 추출하고, 이를 콘텐츠 이미지에 효과적으로 적용할 수 있게 한다. 이 과정은 신경망을 통해 자동으로 이루어지며, 다양한 스타일의 이미지에 대해 유연하게 적용될 수 있다.</p><p>Fig. 1b에서 AdaIN에 주어지는 style은 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.62ex" height="1.027ex" role="img" focusable="false" viewBox="0 -443 716 454"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z"></path></g></g></g></svg></mjx-container>를 Affine 변환을 통해 style 정보인 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="10.921ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 4827.2 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(767.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mo" transform="translate(1823.6,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="msub" transform="translate(2212.6,0)"><g data-mml-node="mi"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(523,-150) scale(0.707)"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path></g></g><g data-mml-node="mo" transform="translate(3117.2,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="msub" transform="translate(3561.9,0)"><g data-mml-node="mi"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(523,-150) scale(0.707)"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z"></path></g></g><g data-mml-node="mo" transform="translate(4438.2,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>로 변환되어 scaling factor와 bias factor로 주어진다.</p><p>AD_HERE</p><h3 id="2-4-Constant-Input"><a href="#2-4-Constant-Input" class="headerlink" title="2.4 Constant Input"></a>2.4 Constant Input</h3><p>style-based generator는 w를 입력으로 받기 때문에, 더이상 PGGAN이나 다른 GAN과 같이 z에서 convolution연산을 하지 않아도 된다. 때문에 synthesis network는 4x4x512 contant tensor에서 부터 시작한다.</p><p>기존처럼 randome noise에서부터 바로 네트워크를 통해 이미지를 생성하는것은 비교적으로 학습하기 어려워, 학습된 초기 4x4영상의 constant를 사용하면 더 쉽게 수렴할 수 있다.</p><h3 id="2-5-Noise-Injection-Stochastic-Variation"><a href="#2-5-Noise-Injection-Stochastic-Variation" class="headerlink" title="2.5 Noise Injection (Stochastic Variation)"></a>2.5 Noise Injection (Stochastic Variation)</h3><p><img src="/img/stylegan/img3.png" alt="Untitled"><br>Fig. 3. Results of Noise Injection</p><p>생성된 이미지가 사실적이면서도 다채로운(다양한) 이미미지를 생성하기 위해 특정 noise를 주입한다. 이 noise는 예를들어 사람 얼굴에서 머리카락이나 수염, 모공등과 같이 stochastic한 특성을 가지는 부분들이 다양하게 나타날 수 있도록 다양성을 증대시키는데 도움을 준다. Fig. 1b의 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.717ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 759 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D435" d="M231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229Z"></path></g></g></g></svg></mjx-container> 영역이 Noise Injection에 해당한다.</p><p>Fig. 3b, Fig.3c와 같이 Fiig. 3a이미지에 대해 다양한 noise를 주입한 결과로 높은 다양성을 가지는것을 확인할 수 있다.</p><h2 id="3-Disentanglement-Measure"><a href="#3-Disentanglement-Measure" class="headerlink" title="3. Disentanglement Measure"></a>3. Disentanglement Measure</h2><blockquote><p>추후 업데이트 예정입니다.</p></blockquote>]]></content:encoded>
<comments>http://techbless.github.io/2023/12/08/style-gan/#disqus_thread</comments>
</item>
<item>
<title>[논문 리뷰] Progressive Growing of GANs for Improved Quality, Stability, and Variation</title>
<link>http://techbless.github.io/2023/11/19/progressive-growing-of-gans-%EC%9A%94%EC%95%BD/</link>
<guid>http://techbless.github.io/2023/11/19/progressive-growing-of-gans-%EC%9A%94%EC%95%BD/</guid>
<pubDate>Sun, 19 Nov 2023 14:33:22 GMT</pubDate>
<description>
<p>링크: <a href="https://arxiv.org/pdf/1710.10196.pdf">https://arxiv.org/pdf/1710.10196.pdf</a><br>저널|학회: ICLR 2018<br>연구목적: 고해상도 이미지 생성, 안정적
</description>
<content:encoded><![CDATA[<p>링크: <a href="https://arxiv.org/pdf/1710.10196.pdf">https://arxiv.org/pdf/1710.10196.pdf</a><br>저널|학회: ICLR 2018<br>연구목적: 고해상도 이미지 생성, 안정적 학습<br>연구방법: 저해상도의 레이어부터 점진적으로 쌓아 고해상도 생성<br>데이터셋: CELEB A HQ<br>주요결과: high resolution, x2–6 Faster converge,CelebA HQ 데이터셋 제시<br>저자: Tero Karras et al.</p><h2 id="1-Introduction"><a href="#1-Introduction" class="headerlink" title="1. Introduction"></a>1. Introduction</h2><blockquote><p>이 연구는 proGAN혹은 PG-GAN으로 더 잘 알려져 있습니다.</p></blockquote><p>GAN을 이용하여 <strong>고해상도의 이미지를 생성하는 것은 아주 어려운 태스크이다.</strong> 고해상도의 이미지를 생성하도록 generator를 학습시키는 경우 학습 이미지의 <strong>distribution과 학습 결과 생성된 이미지의 distribution의 차이가 커진다</strong>. 또한 고해상도의 이미지는 같은 자원에서 저해상도의 이미지보다 <strong>적은 배치사이즈를 가져가게 하는데, 이는 불안정한 학습을 야기한</strong>다. 이러한 상황에서 본 논문에서는 generator와 discriminator를 저해상도의 이미지로부터 고해상도의 이미지로까지 layer들을 추가하면서 점진적으로 커지게 한다. 이를 통해 학습 속도를 향상시키고 고해상도에서도 안정적인 학습을 가능하게 한다.</p><h2 id="2-Progressive-Growing-of-GANs"><a href="#2-Progressive-Growing-of-GANs" class="headerlink" title="2. Progressive Growing of GANs"></a>2. Progressive Growing of GANs</h2><p><img src="/img/progan/Untitled.png" alt="Untitled"></p><p>GAN을 학습시킬때 저해상도의 이미지부터 고해상도의 이미지까지 점진적으로 레이어를 추가하며 학습해 최종적으로 고해상도까지 도달한다. 저해상도에서는 전체적인(large-scale) 구조를, 고해상도로 갈수록 더 디테일한(finer scale detail) 구조를 학습한다. 이러한 구조는 1) 학습 초기의 더 높은 안정성 2) 훨씬 단순한 질문을 지속적으로 제시 3) 훈련시간 감소의 이점을 가진다. 그 이유는 다음과 같다.</p><ol><li>학습 초기의 더 높은 안정성<ol><li>초기에는 클래스 정보가 적고 모드(mode)가 적기 때문에 작은 이미지를 생성하는 것이 훨씬 더 안정적이다.</li></ol></li><li>훨씬 단순한 질문을 지속적으로 제시<ol><li>해상도를 조금씩 높임으로써 예를 들어 잠재 벡터에서 높은 해상도의 이미지로의 매핑을 발견하는 최종 목표와 비교해 훨씬 간단한 질문을 제시한다.</li></ol></li><li>훈련시간 감소<ol><li>대부분의 반복 작업이 낮은 해상도에서 수행되며 점진적으로 세밀한 디테일로 초점을 옮기기 때문에, 종종 최종 출력 해상도에 따라 2~6배 더 빠른 속도로 비슷한 결과 품질을 얻을 수 있다.</li></ol></li></ol><h3 id="Doubling-the-resolution-of-the-G"><a href="#Doubling-the-resolution-of-the-G" class="headerlink" title="Doubling the resolution of the G"></a>Doubling the resolution of the G</h3><p><img src="/img/progan/Untitled%201.png" alt="Untitled"></p><p>G와 D의 해상도를 증가시키는 과정에서 잘 학습된 레이어에 새로운 레이어가 추가되면서 갑작스러운 변화로 인해 충격이 생겨 이전 layer까지 안좋은 영향을 줄 수 있기 때문에 부드럽게 레이어를 추가하는 방법이 필요하다.</p><p>새로운 레이어가 부드럽게 추가될 수 있도록 하기 위해 전환 과정에서 위 그림의 (b)가 나타내듯이, Residual Block처럼 구성해 16x16 레이어가 만든 이미지를 2배(D에서는 0.5배)로 키운 것과 interpolate한다. 어느정도 형태를 가진 이미지를 보여주어 저해상도 레이어가 학습된 방향을 잘 유지하면서 새로운 레이어를 추가한다. 합쳐지는 두 이미지에는 α와 1−α가 곱해져 더해지며, 학습이 진행되면서 α가 0에서 부터 1까지 커지면서 이전 layer의 영향을 점차 줄여간다. 이 방법으로 새로운 레이어가 추가되는 과정에서의 충격을 완화할 수 있다.</p><p>여기서 fromRGB와 toRGB는 1x1 conv레이어를 이용하여 feature 채널을 RGB 채널로 projection하는 부수적인 layer이다.</p><blockquote><p>이러한 구조는 StyleGAN2 부터는 사용하지 않는다.</p></blockquote><p>AD_HERE</p><h2 id="Increasing-Variation-using-Minibatch-Standard-Deviation"><a href="#Increasing-Variation-using-Minibatch-Standard-Deviation" class="headerlink" title="Increasing Variation using Minibatch Standard Deviation"></a>Increasing Variation using Minibatch Standard Deviation</h2><p>GAN은 training data에서 subset of the variation만 포착하는 경향이 있는데, 그 해결책이 Salimans et al.이 제안하는 <code>mini-batch discrimination</code>이다 PGGAN에서는 모드 붕괴(mode collapse)를 완화하기 위해 <code>mini-batch discrimination</code>을 사용한다. 이를 통해 feature statistics를 개별 이미지 뿐만이 아니라 mini-batch에서도 계산하여 generated/training image minibatch의 statistics가 비슷하게 가지도록 한다. </p><ol><li>각 mini-batch의 각 spatial location에서 각각의 feature들의 standard deviation을 계산한다. (Input: NxCxHxW) -> (Output: CxHxW)</li><li>모든 feature들과 spatial location에 대한 평균을 추정하고 하나의 값으로 표현한다. (Input: CxHxW) -> (Output: 1xHxW)</li></ol><ol start="3"><li>이 값을 복제하여 mini-batch들에 대응하는 모든 spatial location들에 추가적인 constant feature map을 생성한 것을 concat한다.</li></ol><p><img src="/img/progan/Untitled%202.png" alt="Untitled"></p><blockquote><p>이 값을 discriminator 어디에나 추가해도 되지만 보통은 맨 뒤에 추가한다<br>이 방식은 learnable parameter나 새로운 hyperparameter가 필요하지 않다. (단순함)</p></blockquote><h2 id="Normalization-in-Generator-and-Discriminator"><a href="#Normalization-in-Generator-and-Discriminator" class="headerlink" title="Normalization in Generator and Discriminator"></a><strong>Normalization in Generator and Discriminator</strong></h2><p>GAN은 G와 D의 비정상적인(G와 D의 학습속도가 다른) 경쟁에 의해 발생하는 gradient에 취약하다. 기존에는 batch normalization을 추가하는 등의 방법을 사용하였지만, 본 논문에서는 이러한 signal을 직접적으로 규제하는 방법을 제안한다. 그 방법은 아래와 같다.</p><h2 id="Equalized-Learning"><a href="#Equalized-Learning" class="headerlink" title="Equalized Learning"></a>Equalized Learning</h2><p><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="0.98ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 433 453"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D450" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z"></path></g></g></g></svg></mjx-container>는 He’s initializer에서 제안된 per-layer normalization constant이다. Gaussian Distributaion <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="7.038ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 3110.7 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g><g data-mml-node="mo" transform="translate(888,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(1277,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"></path></g><g data-mml-node="mo" transform="translate(1777,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mn" transform="translate(2221.7,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(2721.7,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>으로 초기화 한후, runtime에서 weight를 스케일링한다.</p><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -1.577ex;" xmlns="http://www.w3.org/2000/svg" width="8.732ex" height="4.109ex" role="img" focusable="false" viewBox="0 -1119 3859.5 1816"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z"></path></g><g data-mml-node="mo" transform="translate(441.3,17) translate(-250 0)"><path data-c="5E" d="M112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560Z"></path></g></g></g><g data-mml-node="mi" transform="translate(749,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(1320.7,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mfrac" transform="translate(2376.5,0)"><g data-mml-node="msub" transform="translate(220,676)"><g data-mml-node="mi"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z"></path></g><g data-mml-node="mi" transform="translate(749,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mi" transform="translate(525,-686)"><path data-c="1D450" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z"></path></g><rect width="1243" height="60" x="120" y="220"></rect></g></g></g></svg></mjx-container></p><p>기존의 RMSProp이나 Adam과 같은 adaptive SGD 방식은 scale에 불변한 상태로 추정 표준 편차를 이용하여 gradient를 업데이트하는데, 그 결과 상대적으로 큰 dynamic range를 가지는 일부 파라미터들에 대해 적응하는데 더 많은 시간이 필요하다. 즉, 동일한 dynamic range를 가질 수 있도록 weights를 수정하여 동일한 학습 속도를 보장한다.</p><blockquote><p>모든 weights들이 동일한 dynamic range를 가짐 -> 동일한 learning speed를 보장</p></blockquote><h2 id="Pixelwise-Feature-Vector-Normalization-in-Generator"><a href="#Pixelwise-Feature-Vector-Normalization-in-Generator" class="headerlink" title="Pixelwise Feature Vector Normalization in Generator"></a>Pixelwise Feature Vector Normalization in Generator</h2><p>G와 D 간의 경쟁으로 두 네트워크의 magnitude가 통제 불능의 상태가 되는 시나리오를 막기 위해 G에서 conv이후에 pixel 마다의 feature vector를 unit length로 normalize한다. 이걸 Local Response Normalization을 통해 하였고, 그 식은 아래와 같다.</p><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -4.118ex;" xmlns="http://www.w3.org/2000/svg" width="27.035ex" height="6.823ex" role="img" focusable="false" viewBox="0 -1196 11949.4 3016"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z"></path></g><g data-mml-node="TeXAtom" transform="translate(462,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(572,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(850,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g></g><g data-mml-node="mo" transform="translate(1737.3,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mfrac" transform="translate(2793.1,0)"><g data-mml-node="msub" transform="translate(3798.4,755)"><g data-mml-node="mi"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path></g><g data-mml-node="TeXAtom" transform="translate(562,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(572,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(850,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g></g><g data-mml-node="msqrt" transform="translate(220,-1354.3)"><g transform="translate(1020,0)"><g data-mml-node="mfrac"><g data-mml-node="mn" transform="translate(357.2,394) scale(0.707)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mi" transform="translate(220,-345) scale(0.707)"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g><rect width="827.9" height="60" x="120" y="220"></rect></g><g data-mml-node="munderover" transform="translate(1234.6,0)"><g data-mml-node="mo"><path data-c="2211" d="M61 748Q64 750 489 750H913L954 640Q965 609 976 579T993 533T999 516H979L959 517Q936 579 886 621T777 682Q724 700 655 705T436 710H319Q183 710 183 709Q186 706 348 484T511 259Q517 250 513 244L490 216Q466 188 420 134T330 27L149 -187Q149 -188 362 -188Q388 -188 436 -188T506 -189Q679 -189 778 -162T936 -43Q946 -27 959 6H999L913 -249L489 -250Q65 -250 62 -248Q56 -246 56 -239Q56 -234 118 -161Q186 -81 245 -11L428 206Q428 207 242 462L57 717L56 728Q56 744 61 748Z"></path></g><g data-mml-node="TeXAtom" transform="translate(1089,477.1) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g><g data-mml-node="mo" transform="translate(888,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mn" transform="translate(1666,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g></g><g data-mml-node="TeXAtom" transform="translate(1089,-285.4) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z"></path></g><g data-mml-node="mo" transform="translate(412,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mn" transform="translate(1190,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"></path></g></g></g><g data-mml-node="msup" transform="translate(4071.8,0)"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="msubsup"><g data-mml-node="mi"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path></g><g data-mml-node="mi" transform="translate(562,497.8) scale(0.707)"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z"></path></g><g data-mml-node="TeXAtom" transform="translate(562,-138.9) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(572,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(850,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g></g></g><g data-mml-node="mn" transform="translate(1592.5,692.3) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g></g><g data-mml-node="mo" transform="translate(6290.1,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="mi" transform="translate(7290.4,0)"><path data-c="1D716" d="M227 -11Q149 -11 95 41T40 174Q40 262 87 322Q121 367 173 396T287 430Q289 431 329 431H367Q382 426 382 411Q382 385 341 385H325H312Q191 385 154 277L150 265H327Q340 256 340 246Q340 228 320 219H138V217Q128 187 128 143Q128 77 160 52T231 26Q258 26 284 36T326 57T343 68Q350 68 354 58T358 39Q358 36 357 35Q354 31 337 21T289 0T227 -11Z"></path></g></g><g data-mml-node="mo" transform="translate(0,184.3)"><path data-c="221A" d="M1001 1150Q1017 1150 1020 1132Q1020 1127 741 244L460 -643Q453 -650 436 -650H424Q423 -647 423 -645T421 -640T419 -631T415 -617T408 -594T399 -560T385 -512T367 -448T343 -364T312 -259L203 119L138 41L111 67L212 188L264 248L472 -474L983 1140Q988 1150 1001 1150Z"></path></g><rect width="7696.4" height="60" x="1020" y="1274.3"></rect></g><rect width="8916.4" height="60" x="120" y="220"></rect></g></g></g></svg></mjx-container></p><ul><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="2.009ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 888 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g></g></g></svg></mjx-container>: feature map의 개수</li><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.667ex;" xmlns="http://www.w3.org/2000/svg" width="3.528ex" height="1.665ex" role="img" focusable="false" viewBox="0 -441 1559.5 736"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path></g><g data-mml-node="TeXAtom" transform="translate(562,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(572,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(850,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g></g></g></g></svg></mjx-container>: pixel<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="5.169ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 2284.7 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(389,0)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(961,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(1405.7,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(1895.7,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>의 원래 feature vector</li><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.667ex;" xmlns="http://www.w3.org/2000/svg" width="3.302ex" height="2.237ex" role="img" focusable="false" viewBox="0 -694 1459.5 989"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z"></path></g><g data-mml-node="TeXAtom" transform="translate(462,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(572,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(850,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g></g></g></g></svg></mjx-container>: normalized된 feature vector</li></ul><blockquote><p>이 방식은 G에 해로워 보이지 않았고, 오히려 효과적으로 signal magnitude 상승을 방지한다.</p></blockquote><p>AD_HERE</p><h2 id="Multi-scale-Statistical-Similarity-for-Assessing-GAN-Results"><a href="#Multi-scale-Statistical-Similarity-for-Assessing-GAN-Results" class="headerlink" title="Multi-scale Statistical Similarity for Assessing GAN Results"></a>Multi-scale Statistical Similarity for Assessing GAN Results</h2><p>GAN을 평가할때 사용되던 MS-SSIM은 큰 규모의 mode collapse는 잘 포착하지만 색상이나 질감의 변화 손실과 같은 더 작은 변화는 잘 포착하지 못한다고 한다. 따라서 본 논문에서는 G는 training set이 모든 scale에서 유사한 샘플을 생성해야한다는 영감하에 Laplacian pyramid로 부터 뽑힌 local image patch 분포들 간의 멀티 스케일 통계적 유사성을 고려하는 연구 방법을 제안한다.</p><ol><li>Training set과 Generated set으로 부터 각각 local image patch를 얻는다.</li><li>각 색 채널별 평균과 표준편차로 normalize한다.</li><li>이후 sliced Wasserstein distance(SWD)를 통해 계산한 통계적 유사성을 추정한다.</li></ol><p>작은 Wasserstein distance는 패치들간 유사도가 높다는 것을 의미한다.</p><h2 id="Experiments"><a href="#Experiments" class="headerlink" title="Experiments"></a>Experiments</h2><h3 id="Importance-of-Individual-Contributions-in-terms-of-Statistical-Similarity"><a href="#Importance-of-Individual-Contributions-in-terms-of-Statistical-Similarity" class="headerlink" title="Importance of Individual Contributions in terms of Statistical Similarity"></a>Importance of Individual Contributions in terms of Statistical Similarity</h3><p>본 논문에서는 SWD와 MS-SSIM을 성능을 측정하기 위해 사용하였다.<br><img src="/img/progan/Untitled%204.png" alt="Untitled"><br><img src="/img/progan/Untitled%205.png" alt="Untitled"></p><p>(a)는 (h)보다 더 나쁜 이미지를 생성하고 있지만, MS-SSIM을 사용한 측정 결과 두 이미지 간에 큰 차이가 없었다. 반면에 SWD는 두 이미지 간에 큰 차이를 보여주었다. 이는 SWD가 MS-SSIM과 달리 색상, 질감, 시점 등의 다양성을 잘 포착하고 있음을 나타낸다.</p><p>고해상도 이미지를 처리하기 위해 (c)에서는 배치 크기를 64에서 16으로 줄였다. 그 결과 생성된 이미지가 매우 불안정해졌으나, (d)에서 BatchNorm이나 LinearNorm을 제거하는 등 훈련 매개변수를 수정한 후에는 학습이 안정적으로 진행되었다. (e*)에서는 Salimans et al.의 미니배치 차별화를 적용했으나 성능 향상은 보이지 않았고, (e)에서는 본 논문의 미니배치 표준 편차를 적용하자 SWD에서 성능이 향상되었다. (f), (g)에서도 성능 향상이 나타났다. 마지막으로 (h)에서는 학습을 충분히 시켜 결과를 수렴시켰다.</p><h3 id="Convergence-and-Training-Speed"><a href="#Convergence-and-Training-Speed" class="headerlink" title="Convergence and Training Speed"></a>Convergence and Training Speed</h3><p><img src="/img/progan/Untitled%203.png" alt="Untitled"><br>위 그림(a)와 (b)는 훈련 시간(가로 축)과 SWD의 수치 (세로 축), 그림 (c)는 훈련 시간(가로 축)과 Discriminator에게 보여준 진짜 이미지의 숫자(세로 축)이다. (a)는 Gulrajani et al. (2017)의 학습 구성에서의 결과이다. 그러나 (a)는 단계적으로 학습 (층을 서서히 추가시켜가며 학습)의 네트워크가 아니며 (제일 처음부터 모든 층을 네트워크에 넣어 둔 것), (b)는 점진적 학습 (층을 서서히 추가시켜 학습)의 네트워크이다.</p><p>점진적인 학습은 2개의 메리트가 있다.</p><ol><li>매우 우수한 최적치에 수렴한다.</li><li>학습 수렴 시간을 획기적으로 줄였다.</li></ol><h2 id="CelebA-HQ"><a href="#CelebA-HQ" class="headerlink" title="CelebA-HQ"></a>CelebA-HQ</h2><p>본 연구에서 고해상도의 이미지 출력의 의미있는 평가를 위해 CELEBA-HQ라는 데이터셋을 생성하여 제시하였다. 이는 1024x1024 해상도의 30,000장의 이미지를 포함하고 있다.</p><h2 id="Official-Demo"><a href="#Official-Demo" class="headerlink" title="Official Demo"></a>Official Demo</h2><iframe style="width: 100%; height: 420px" width="560" height="315" src="https://www.youtube.com/embed/G06dEcZ-QTg?si=co5CHTe6oHP7NI2I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>]]></content:encoded>
<comments>http://techbless.github.io/2023/11/19/progressive-growing-of-gans-%EC%9A%94%EC%95%BD/#disqus_thread</comments>
</item>
<item>
<title>[논문 리뷰] Attention Is All You Need</title>
<link>http://techbless.github.io/2023/10/29/attention-is-all-you-need/</link>
<guid>http://techbless.github.io/2023/10/29/attention-is-all-you-need/</guid>
<pubDate>Sun, 29 Oct 2023 14:33:22 GMT</pubDate>
<description>
<p>링크: <a href="https://arxiv.org/abs/1706.03762">https://arxiv.org/abs/1706.03762</a><br>저널|학회: NIPS 2017<br>연구목적: 장거리 의존성 해결, 병목해결<br>데이터셋
</description>
<content:encoded><![CDATA[<p>링크: <a href="https://arxiv.org/abs/1706.03762">https://arxiv.org/abs/1706.03762</a><br>저널|학회: NIPS 2017<br>연구목적: 장거리 의존성 해결, 병목해결<br>데이터셋: N/A<br>주요결과: 병렬 처리 가능하게함, 장거리 의존성 해결, 신경망의 작동 시각화<br>저자: Ashish Vaswani et al.</p><h2 id="1-Introduction"><a href="#1-Introduction" class="headerlink" title="1. Introduction"></a>1. Introduction</h2><p>2014년에 처음 소개된 Seq2Seq 모델은 인코더와 디코더 구조를 가진 모델로, 둘 다 RNN 기반 네트워크를 사용한다. 이 모델은 번역 작업을 수행할 때, 인코더를 통해 요약된 컨텍스트 벡터로 변환하고, 디코더가 이 벡터를 사용하여 원래의 정보를 잃지 않고 복원한다. RNN 기반 네트워크는 문장이 연속적인 특성을 가지고 있기 때문에 중요하다. 즉, 단어의 순서와 위치가 문장의 의미를 형성하는 데 중요하다. RNN은 텍스트의 정보를 잘 포착할 수 있지만, Seq2Seq 모델은 고정된 크기의 컨텍스트 벡터를 사용하기 때문에 긴 문장에서는 정보를 완전히 포착하기 어렵다는 한계가 있다. 이러한 한계를 극복하기 위해 제안된 것이 바로 Attention 메커니즘이다. 이 메커니즘은 Seq2Seq 모델에 적용되어 디코더가 인코더의 모든 출력에 접근할 수 있도록 해, 고정된 길이의 벡터의 제한을 넘어서서 긴 문장의 번역 성능을 크게 향상시켰다. 이는 획기적인 발전이었지만, RNN 네트워크가 여전히 단어를 순차적으로 처리해야 하므로 시간과 컴퓨팅 파워의 많은 소모라는 한계가 남아있다.</p><p>이러한 한계를 극복하기 위한 구글 리서치팀의 혁신적인 접근법이 바로 RNN을 전혀 사용하지 않는 Transformer 모델이다. Transformer는 인코더-디코더 구조를 유지하면서, RNN 대신 Attention 메커니즘만을 사용하여 소스 언어의 문장에서 중요한 정보를 추출한다.</p><h2 id="2-Transformer-아키텍처"><a href="#2-Transformer-아키텍처" class="headerlink" title="2. Transformer 아키텍처"></a>2. Transformer 아키텍처</h2><p>기본적으로 Seq2Seq와 같이 인코더-디코더 구조의 모델이다. 인코더는 두개의 서브 레이어를, 디코더는 세개의 서브 레이어로 구성되어 있다. 여기서 중요한 점은 RNN이나 CNN을 사용하는 대신 Attention을 사용한다는 것이다.</p><p><img src="/img/transformer/transformer.png" alt="Untitled"><br>Fig. 1: Transformer 아키텍처</p><p>Fig. 1은 Transformer의 모델 구조를 나타낸 것인데, 인코더와 디코더 모두에 적층된 Self-attention 및 Point-wise, 완전 연결층을 사용한다. 이는 Fig. 1에서 왼쪽, 오른쪽에 각각 나타낸다. </p><h3 id="2-1-Encoder"><a href="#2-1-Encoder" class="headerlink" title="2.1 Encoder"></a>2.1 Encoder</h3><p>인코더는 N = 6개의 동일한 층으로 구성되어 있고 각 층은 두개의 하위 층을 가지고 있다. 첫번째는 Self-attention 메커니즘, 두번째는 위치별 완전 연결 feed-forward 네트워크이다. 각 하위 층에는 Residual 연결을 적용하고 Layer 정규화를 따른다. 각 하위 층의 출력은 LayerNorm(x\ +\ Sublayer(x))이며, 여기서 Sublayer(x)는 하위 층 자체에 의해 구현된 기능이다.</p><h3 id="2-2-Decoder"><a href="#2-2-Decoder" class="headerlink" title="2.2 Decoder"></a>2.2 Decoder</h3><p>디코더 부분은 인코더와 마찬가지로 6개의 동일한 층으로 이루어져 있다. 인코더의 두 개의 하위 층 외에도, 디코더는 추가적인 세 번째 하위 층을 포함하는데, 이는 인코더의 출력에 대해 다중 헤드 어텐션을 실행하는 역할을 한다. 인코더와 마찬가지로, 각 하위 층에는 잔여 연결이 적용되며 층 정규화가 이루어진다. 또한, 디코더 스택의 자체 주의(self-attention) 하위 층은 후속 위치에 대한 주의를 방지하도록 조정되었다. 이러한 마스킹과 출력 임베딩이 한 칸씩 옮겨진 것은, 위치 i에서의 예측이 i보다 앞선 위치의 알려진 출력에만 의존하게 만드는데, 이는 중요한 설계 요소이다.</p><h2 id="3-Attention"><a href="#3-Attention" class="headerlink" title="3. Attention"></a>3. Attention</h2><p>Attention은 Q (Query), K (Key)-V (Value)쌍 집합을 출력에 매핑하는 것으로 설명할 수 있다. 여기서 출력은 값의 가중합으로 계산되며 각 값에 할당된 가중치는 대응되는 K의 Q의 compatibility함수에 의해 계산된다. Q는 물어보는 주체, K는 Q와 비교가 되는 대상이다.</p><p><img src="/img/transformer/multihead.png" alt="Untitled"></p><p>Multi-Head Attention 내부는 Scaled Dot-Product Attention으로 구성되어 있으며, 여기서 각 query는 key와 value에 대해 attention을 수행한다. Query와 Key의 행렬곱을 진행한 뒤, softmax를 적용하기 전에 각각을 \sqrt{d_k}로 나눈 다음 Softmax함수를 적용하여 값에 대한 가중치를 얻는다. Multi-Head Attention에서는 value, key, query를 복제하여 사용하고, 임베딩 차원 (d_{model})을 V, K, Q의 차원으로 바꿔주기 위해 linear layer를 거친다. 임베딩 차원이 512라 하고, # of head가 8이면 linear layer는 64차원으로 만들어 주는 것이다. 다만 실제 implementation에서는 차원을 나누지 않고, 512*512의 병렬적 형태로 계산한 뒤 그 결과값을 나누어 사용하기도 한다. 그리고 각 Head에서 Scaled Dot-Product Attention을 수행하고 이를 합쳐서 linear layer를 거친다.</p><h2 id="4-Transformer에서-Attention의-종류"><a href="#4-Transformer에서-Attention의-종류" class="headerlink" title="4. Transformer에서 Attention의 종류"></a>4. Transformer에서 Attention의 종류</h2><ol><li> Encoder-decoder attention. Query를 decoder, key와 value를 encoder 파트에서 가져온다. 이것은 입력 시퀀스의 모든 위치에서 디코더를 거쳐 메모리 키와 값에 주의를 기울일 수 있게 해주며, 시퀀스-투-시퀀스 모델에서 흔히 볼 수 있는 전형적인 인코더-디코더 주의 메커니즘을 모방한다.</li><li> 인코더는 자기 주의 레이어를 포함한다. 자기 주의 레이어에서 모든 키, 값, 쿼리는 같은 장소, 이 경우 인코더의 이전 레이어의 출력에서 온다. 인코더의 각 위치는 이전 레이어의 모든 위치에 주의를 기울일 수 있다.</li><li> 디코더의 자기 주의 레이어는 디코더의 모든 위치가 해당 위치를 포함하여 주의 를 기울일 수 있게 한다.</li></ol><h2 id="5-Embeddings-and-Softmax"><a href="#5-Embeddings-and-Softmax" class="headerlink" title="5. Embeddings and Softmax"></a>5. Embeddings and Softmax</h2><p>주의 하위 층에 추가하여, 우리의 인코더와 디코더의 각 층은 각 위치에 개별적으로 동일하게 적용되는 완전 연결 feed-forward 네트워크를 포함한다. 이것은 ReLU 활성화 함수를 사이에 둔 두 개의 선형 변환으로 구성된다.</p><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="36.574ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 16165.7 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="46" d="M128 619Q121 626 117 628T101 631T58 634H25V680H582V676Q584 670 596 560T610 444V440H570V444Q563 493 561 501Q555 538 543 563T516 601T477 622T431 631T374 633H334H286Q252 633 244 631T233 621Q232 619 232 490V363H284Q287 363 303 363T327 364T349 367T372 373T389 385Q407 403 410 459V480H450V200H410V221Q407 276 389 296Q381 303 371 307T348 313T327 316T303 317T284 317H232V189L233 61Q240 54 245 52T270 48T333 46H360V0H348Q324 3 182 3Q51 3 36 0H25V46H58Q100 47 109 49T128 61V619Z"></path><path data-c="46" d="M128 619Q121 626 117 628T101 631T58 634H25V680H582V676Q584 670 596 560T610 444V440H570V444Q563 493 561 501Q555 538 543 563T516 601T477 622T431 631T374 633H334H286Q252 633 244 631T233 621Q232 619 232 490V363H284Q287 363 303 363T327 364T349 367T372 373T389 385Q407 403 410 459V480H450V200H410V221Q407 276 389 296Q381 303 371 307T348 313T327 316T303 317T284 317H232V189L233 61Q240 54 245 52T270 48T333 46H360V0H348Q324 3 182 3Q51 3 36 0H25V46H58Q100 47 109 49T128 61V619Z" transform="translate(653,0)"></path><path data-c="4E" d="M42 46Q74 48 94 56T118 69T128 86V634H124Q114 637 52 637H25V683H232L235 680Q237 679 322 554T493 303L578 178V598Q572 608 568 613T544 627T492 637H475V683H483Q498 680 600 680Q706 680 715 683H724V637H707Q634 633 622 598L621 302V6L614 0H600Q585 0 582 3T481 150T282 443T171 605V345L172 86Q183 50 257 46H274V0H265Q250 3 150 3Q48 3 33 0H25V46H42Z" transform="translate(1306,0)"></path></g></g><g data-mml-node="mrow" transform="translate(2222.7,0)"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(389,0)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(961,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g><g data-mml-node="mo" transform="translate(3850.4,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mo" transform="translate(4906.2,0)"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z"></path><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(833,0)"></path><path data-c="78" d="M201 0Q189 3 102 3Q26 3 17 0H11V46H25Q48 47 67 52T96 61T121 78T139 96T160 122T180 150L226 210L168 288Q159 301 149 315T133 336T122 351T113 363T107 370T100 376T94 379T88 381T80 383Q74 383 44 385H16V431H23Q59 429 126 429Q219 429 229 431H237V385Q201 381 201 369Q201 367 211 353T239 315T268 274L272 270L297 304Q329 345 329 358Q329 364 327 369T322 376T317 380T310 384L307 385H302V431H309Q324 428 408 428Q487 428 493 431H499V385H492Q443 385 411 368Q394 360 377 341T312 257L296 236L358 151Q424 61 429 57T446 50Q464 46 499 46H516V0H510H502Q494 1 482 1T457 2T432 2T414 3Q403 3 377 3T327 1L304 0H295V46H298Q309 46 320 51T331 63Q331 65 291 120L250 175Q249 174 219 133T185 88Q181 83 181 74Q181 63 188 55T206 46Q208 46 208 23V0H201Z" transform="translate(1333,0)"></path></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(6933.9,0)"><g data-mml-node="mrow"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(389,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"></path></g><g data-mml-node="mo" transform="translate(889,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(1333.7,0)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="msub" transform="translate(1905.7,0)"><g data-mml-node="mi"><path data-c="1D44A" d="M436 683Q450 683 486 682T553 680Q604 680 638 681T677 682Q695 682 695 674Q695 670 692 659Q687 641 683 639T661 637Q636 636 621 632T600 624T597 615Q597 603 613 377T629 138L631 141Q633 144 637 151T649 170T666 200T690 241T720 295T759 362Q863 546 877 572T892 604Q892 619 873 628T831 637Q817 637 817 647Q817 650 819 660Q823 676 825 679T839 682Q842 682 856 682T895 682T949 681Q1015 681 1034 683Q1048 683 1048 672Q1048 666 1045 655T1038 640T1028 637Q1006 637 988 631T958 617T939 600T927 584L923 578L754 282Q586 -14 585 -15Q579 -22 561 -22Q546 -22 542 -17Q539 -14 523 229T506 480L494 462Q472 425 366 239Q222 -13 220 -15T215 -19Q210 -22 197 -22Q178 -22 176 -15Q176 -12 154 304T131 622Q129 631 121 633T82 637H58Q51 644 51 648Q52 671 64 683H76Q118 680 176 680Q301 680 313 683H323Q329 677 329 674T327 656Q322 641 318 637H297Q236 634 232 620Q262 160 266 136L501 550L499 587Q496 629 489 632Q483 636 447 637Q428 637 422 639T416 648Q416 650 418 660Q419 664 420 669T421 676T424 680T428 682T436 683Z"></path></g><g data-mml-node="mn" transform="translate(977,-150) scale(0.707)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g></g><g data-mml-node="mo" transform="translate(3508.4,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="msub" transform="translate(4508.7,0)"><g data-mml-node="mi"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z"></path></g><g data-mml-node="mn" transform="translate(462,-150) scale(0.707)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g></g><g data-mml-node="mo" transform="translate(5374.2,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g><g data-mml-node="msub" transform="translate(12697.1,0)"><g data-mml-node="mi"><path data-c="1D44A" d="M436 683Q450 683 486 682T553 680Q604 680 638 681T677 682Q695 682 695 674Q695 670 692 659Q687 641 683 639T661 637Q636 636 621 632T600 624T597 615Q597 603 613 377T629 138L631 141Q633 144 637 151T649 170T666 200T690 241T720 295T759 362Q863 546 877 572T892 604Q892 619 873 628T831 637Q817 637 817 647Q817 650 819 660Q823 676 825 679T839 682Q842 682 856 682T895 682T949 681Q1015 681 1034 683Q1048 683 1048 672Q1048 666 1045 655T1038 640T1028 637Q1006 637 988 631T958 617T939 600T927 584L923 578L754 282Q586 -14 585 -15Q579 -22 561 -22Q546 -22 542 -17Q539 -14 523 229T506 480L494 462Q472 425 366 239Q222 -13 220 -15T215 -19Q210 -22 197 -22Q178 -22 176 -15Q176 -12 154 304T131 622Q129 631 121 633T82 637H58Q51 644 51 648Q52 671 64 683H76Q118 680 176 680Q301 680 313 683H323Q329 677 329 674T327 656Q322 641 318 637H297Q236 634 232 620Q262 160 266 136L501 550L499 587Q496 629 489 632Q483 636 447 637Q428 637 422 639T416 648Q416 650 418 660Q419 664 420 669T421 676T424 680T428 682T436 683Z"></path></g><g data-mml-node="mn" transform="translate(977,-150) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g></g><g data-mml-node="mo" transform="translate(14299.9,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="msub" transform="translate(15300.1,0)"><g data-mml-node="mi"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z"></path></g><g data-mml-node="mn" transform="translate(462,-150) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g></g></g></g></svg></mjx-container></p><p>선형 변환은 다른 위치에 걸쳐 동일하지만, 층마다 다른 매개변수를 사용한다. 이것을 설 명하는 또 다른 방법은 커널 크기가 1인 두 개의 합성곱으로 보는 것이다. 입력과 출력의 차원은 d_{model} = 512이고, 내부 층은 d_{ff}= 2048의 차원을 가진다.</p><h2 id="6-Positional-Encoding"><a href="#6-Positional-Encoding" class="headerlink" title="6. Positional Encoding"></a>6. Positional Encoding</h2><p>우리 모델에는 순환도 없고, 합성곱도 없기 때문에, 모델이 시퀀스의 순서나 토큰들의 상대적 또는 절대적 위치에 대한 정보를 사용할 수 있도록 일부 정보를 주입해야 한다.</p><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -2.148ex;" xmlns="http://www.w3.org/2000/svg" width="33.814ex" height="5.428ex" role="img" focusable="false" viewBox="0 -1449.5 14945.8 2399"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D443" d="M287 628Q287 635 230 637Q206 637 199 638T192 648Q192 649 194 659Q200 679 203 681T397 683Q587 682 600 680Q664 669 707 631T751 530Q751 453 685 389Q616 321 507 303Q500 302 402 301H307L277 182Q247 66 247 59Q247 55 248 54T255 50T272 48T305 46H336Q342 37 342 35Q342 19 335 5Q330 0 319 0Q316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597T609 619T560 635Q553 636 480 637Q463 637 445 637T416 636T404 636Q391 635 386 627Q384 621 367 550T332 412T314 344Q314 342 395 342H407H430Q542 342 590 392Q617 419 631 471T645 554Z"></path></g><g data-mml-node="mi" transform="translate(751,0)"><path data-c="1D438" d="M492 213Q472 213 472 226Q472 230 477 250T482 285Q482 316 461 323T364 330H312Q311 328 277 192T243 52Q243 48 254 48T334 46Q428 46 458 48T518 61Q567 77 599 117T670 248Q680 270 683 272Q690 274 698 274Q718 274 718 261Q613 7 608 2Q605 0 322 0H133Q31 0 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H757Q764 676 764 669Q764 664 751 557T737 447Q735 440 717 440H705Q698 445 698 453L701 476Q704 500 704 528Q704 558 697 578T678 609T643 625T596 632T532 634H485Q397 633 392 631Q388 629 386 622Q385 619 355 499T324 377Q347 376 372 376H398Q464 376 489 391T534 472Q538 488 540 490T557 493Q562 493 565 493T570 492T572 491T574 487T577 483L544 351Q511 218 508 216Q505 213 492 213Z"></path></g><g data-mml-node="mo" transform="translate(1515,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(1904,0)"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"></path></g><g data-mml-node="mi" transform="translate(2407,0)"><path data-c="1D45C" d="M201 -11Q126 -11 80 38T34 156Q34 221 64 279T146 380Q222 441 301 441Q333 441 341 440Q354 437 367 433T402 417T438 387T464 338T476 268Q476 161 390 75T201 -11ZM121 120Q121 70 147 48T206 26Q250 26 289 58T351 142Q360 163 374 216T388 308Q388 352 370 375Q346 405 306 405Q243 405 195 347Q158 303 140 230T121 120Z"></path></g><g data-mml-node="mi" transform="translate(2892,0)"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path></g><g data-mml-node="mo" transform="translate(3361,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mn" transform="translate(3805.7,0)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g><g data-mml-node="mi" transform="translate(4305.7,0)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(4650.7,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(5317.4,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mi" transform="translate(6373.2,0)"><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z"></path><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(394,0)"></path><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(672,0)"></path></g><g data-mml-node="mo" transform="translate(7601.2,0)"><path data-c="2061" d=""></path></g><g data-mml-node="mrow" transform="translate(7767.9,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="28" d="M701 -940Q701 -943 695 -949H664Q662 -947 636 -922T591 -879T537 -818T475 -737T412 -636T350 -511T295 -362T250 -186T221 17T209 251Q209 962 573 1361Q596 1386 616 1405T649 1437T664 1450H695Q701 1444 701 1441Q701 1436 681 1415T629 1356T557 1261T476 1118T400 927T340 675T308 359Q306 321 306 250Q306 -139 400 -430T690 -924Q701 -936 701 -940Z"></path></g><g data-mml-node="mfrac" transform="translate(736,0)"><g data-mml-node="mrow" transform="translate(2124.5,676)"><g data-mml-node="mi"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"></path></g><g data-mml-node="mi" transform="translate(503,0)"><path data-c="1D45C" d="M201 -11Q126 -11 80 38T34 156Q34 221 64 279T146 380Q222 441 301 441Q333 441 341 440Q354 437 367 433T402 417T438 387T464 338T476 268Q476 161 390 75T201 -11ZM121 120Q121 70 147 48T206 26Q250 26 289 58T351 142Q360 163 374 216T388 308Q388 352 370 375Q346 405 306 405Q243 405 195 347Q158 303 140 230T121 120Z"></path></g><g data-mml-node="mi" transform="translate(988,0)"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path></g></g><g data-mml-node="msup" transform="translate(220,-883.4)"><g data-mml-node="mn"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(500,0)"></path><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1000,0)"></path><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1500,0)"></path><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(2000,0)"></path></g><g data-mml-node="TeXAtom" transform="translate(2533,393.1) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g><g data-mml-node="mi" transform="translate(500,0)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(845,0)"><g data-mml-node="mo"><path data-c="2F" d="M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z"></path></g></g><g data-mml-node="msub" transform="translate(1345,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path></g><g data-mml-node="TeXAtom" transform="translate(553,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mtext"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z"></path><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(833,0)"></path><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" transform="translate(1333,0)"></path><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1889,0)"></path><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" transform="translate(2333,0)"></path></g></g></g></g></g><rect width="5465.9" height="60" x="120" y="220"></rect></g><g data-mml-node="mo" transform="translate(6441.9,0) translate(0 -0.5)"><path data-c="29" d="M34 1438Q34 1446 37 1448T50 1450H56H71Q73 1448 99 1423T144 1380T198 1319T260 1238T323 1137T385 1013T440 864T485 688T514 485T526 251Q526 134 519 53Q472 -519 162 -860Q139 -885 119 -904T86 -936T71 -949H56Q43 -949 39 -947T34 -937Q88 -883 140 -813Q428 -430 428 251Q428 453 402 628T338 922T245 1146T145 1309T46 1425Q44 1427 42 1429T39 1433T36 1436L34 1438Z"></path></g></g></g></g></svg></mjx-container></p><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -2.148ex;" xmlns="http://www.w3.org/2000/svg" width="37.96ex" height="5.428ex" role="img" focusable="false" viewBox="0 -1449.5 16778.3 2399"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D443" d="M287 628Q287 635 230 637Q206 637 199 638T192 648Q192 649 194 659Q200 679 203 681T397 683Q587 682 600 680Q664 669 707 631T751 530Q751 453 685 389Q616 321 507 303Q500 302 402 301H307L277 182Q247 66 247 59Q247 55 248 54T255 50T272 48T305 46H336Q342 37 342 35Q342 19 335 5Q330 0 319 0Q316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597T609 619T560 635Q553 636 480 637Q463 637 445 637T416 636T404 636Q391 635 386 627Q384 621 367 550T332 412T314 344Q314 342 395 342H407H430Q542 342 590 392Q617 419 631 471T645 554Z"></path></g><g data-mml-node="mi" transform="translate(751,0)"><path data-c="1D438" d="M492 213Q472 213 472 226Q472 230 477 250T482 285Q482 316 461 323T364 330H312Q311 328 277 192T243 52Q243 48 254 48T334 46Q428 46 458 48T518 61Q567 77 599 117T670 248Q680 270 683 272Q690 274 698 274Q718 274 718 261Q613 7 608 2Q605 0 322 0H133Q31 0 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H757Q764 676 764 669Q764 664 751 557T737 447Q735 440 717 440H705Q698 445 698 453L701 476Q704 500 704 528Q704 558 697 578T678 609T643 625T596 632T532 634H485Q397 633 392 631Q388 629 386 622Q385 619 355 499T324 377Q347 376 372 376H398Q464 376 489 391T534 472Q538 488 540 490T557 493Q562 493 565 493T570 492T572 491T574 487T577 483L544 351Q511 218 508 216Q505 213 492 213Z"></path></g><g data-mml-node="mo" transform="translate(1515,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(1904,0)"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"></path></g><g data-mml-node="mi" transform="translate(2407,0)"><path data-c="1D45C" d="M201 -11Q126 -11 80 38T34 156Q34 221 64 279T146 380Q222 441 301 441Q333 441 341 440Q354 437 367 433T402 417T438 387T464 338T476 268Q476 161 390 75T201 -11ZM121 120Q121 70 147 48T206 26Q250 26 289 58T351 142Q360 163 374 216T388 308Q388 352 370 375Q346 405 306 405Q243 405 195 347Q158 303 140 230T121 120Z"></path></g><g data-mml-node="mi" transform="translate(2892,0)"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path></g><g data-mml-node="mo" transform="translate(3361,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mn" transform="translate(3805.7,0)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g><g data-mml-node="mi" transform="translate(4305.7,0)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(4872.9,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="mn" transform="translate(5873.1,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(6373.1,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(7039.9,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mi" transform="translate(8095.7,0)"><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z"></path><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(444,0)"></path><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(944,0)"></path></g><g data-mml-node="mo" transform="translate(9433.7,0)"><path data-c="2061" d=""></path></g><g data-mml-node="mrow" transform="translate(9600.3,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="28" d="M701 -940Q701 -943 695 -949H664Q662 -947 636 -922T591 -879T537 -818T475 -737T412 -636T350 -511T295 -362T250 -186T221 17T209 251Q209 962 573 1361Q596 1386 616 1405T649 1437T664 1450H695Q701 1444 701 1441Q701 1436 681 1415T629 1356T557 1261T476 1118T400 927T340 675T308 359Q306 321 306 250Q306 -139 400 -430T690 -924Q701 -936 701 -940Z"></path></g><g data-mml-node="mfrac" transform="translate(736,0)"><g data-mml-node="mrow" transform="translate(2124.5,676)"><g data-mml-node="mi"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"></path></g><g data-mml-node="mi" transform="translate(503,0)"><path data-c="1D45C" d="M201 -11Q126 -11 80 38T34 156Q34 221 64 279T146 380Q222 441 301 441Q333 441 341 440Q354 437 367 433T402 417T438 387T464 338T476 268Q476 161 390 75T201 -11ZM121 120Q121 70 147 48T206 26Q250 26 289 58T351 142Q360 163 374 216T388 308Q388 352 370 375Q346 405 306 405Q243 405 195 347Q158 303 140 230T121 120Z"></path></g><g data-mml-node="mi" transform="translate(988,0)"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path></g></g><g data-mml-node="msup" transform="translate(220,-883.4)"><g data-mml-node="mn"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(500,0)"></path><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1000,0)"></path><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1500,0)"></path><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(2000,0)"></path></g><g data-mml-node="TeXAtom" transform="translate(2533,393.1) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g><g data-mml-node="mi" transform="translate(500,0)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(845,0)"><g data-mml-node="mo"><path data-c="2F" d="M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z"></path></g></g><g data-mml-node="msub" transform="translate(1345,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path></g><g data-mml-node="TeXAtom" transform="translate(553,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mtext"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z"></path><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(833,0)"></path><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" transform="translate(1333,0)"></path><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1889,0)"></path><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" transform="translate(2333,0)"></path></g></g></g></g></g><rect width="5465.9" height="60" x="120" y="220"></rect></g><g data-mml-node="mo" transform="translate(6441.9,0) translate(0 -0.5)"><path data-c="29" d="M34 1438Q34 1446 37 1448T50 1450H56H71Q73 1448 99 1423T144 1380T198 1319T260 1238T323 1137T385 1013T440 864T485 688T514 485T526 251Q526 134 519 53Q472 -519 162 -860Q139 -885 119 -904T86 -936T71 -949H56Q43 -949 39 -947T34 -937Q88 -883 140 -813Q428 -430 428 251Q428 453 402 628T338 922T245 1146T145 1309T46 1425Q44 1427 42 1429T39 1433T36 1436L34 1438Z"></path></g></g></g></g></svg></mjx-container></p><p>이 작업에서, 다양한 선택지 중에, 다양한 주파수의 사인 함수와 코사인 함수를 사용합니다. 여기서 pos는 위치이고 i는 차원이다. 즉, 위치 인코딩의 각 차원은 사인 곡선에 해당한다.</p><h2 id="7-결론"><a href="#7-결론" class="headerlink" title="7. 결론"></a>7. 결론</h2><p>Transformer 모델은 순환 과정을 제거함으로써 병렬 처리를 가능하게 하고 장거리 의존성을 효과적으로 다룰 수 있으며, Attention 메커니즘은 신경망의 작동을 시각적으로 나타내어 어떤 단어가 소스 문장에서 가장 영향력 있는지 보여준다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2023/10/29/attention-is-all-you-need/#disqus_thread</comments>
</item>
<item>
<title>국가 우수 장학금(이공계) 선발 후기</title>
<link>http://techbless.github.io/2023/05/09/%EA%B5%AD%EA%B0%80%EC%9A%B0%EC%88%98%EC%9E%A5%ED%95%99%EC%83%9D-%ED%95%A9%EA%B2%A9-%ED%9B%84%EA%B8%B0/</link>
<guid>http://techbless.github.io/2023/05/09/%EA%B5%AD%EA%B0%80%EC%9A%B0%EC%88%98%EC%9E%A5%ED%95%99%EC%83%9D-%ED%95%A9%EA%B2%A9-%ED%9B%84%EA%B8%B0/</guid>
<pubDate>Tue, 09 May 2023 22:38:12 GMT</pubDate>
<description>
<h1 id="국가-우수장학생-선발-후기"><a href="#국가-우수장학생-선발-후기" class="headerlink" title="국가 우수장학생 선발 후기"></a>국가 우수장학생 선발 후기</h1><p><img src="/img/%EA%B5%
</description>
<content:encoded><![CDATA[<h1 id="국가-우수장학생-선발-후기"><a href="#국가-우수장학생-선발-후기" class="headerlink" title="국가 우수장학생 선발 후기"></a>국가 우수장학생 선발 후기</h1><p><img src="/img/%EA%B5%AD%EA%B0%80%EC%9A%B0%EC%88%98%EC%9E%A5%ED%95%99%EA%B8%88-%EC%86%8C%EA%B0%9C.png" alt="국가우수장학금 소개"></p><p>학교의 추천을 받아 3학년 1학기부터 국가 우수 장학생으로 선발되어 앞으로 지원할 다른 분들에게 도움이 될 내용과 후기를 써보려고 합니다. 저는 <code>재학중우수자</code> 전형을 통해 선발되었으므로 이 전형에 관한 내용만 작성해보려고 합니다.</p><h2 id="신청-자격"><a href="#신청-자격" class="headerlink" title="신청 자격"></a>신청 자격</h2><p>먼저 한국장학재단의 신청 자격은 아래와 같이 안내하고 있습니다. 학교마다 추천할 수 있는 인원에 차이가 있으니 다니고 있는 학교에 문의하는게 가장 정확할 것 같습니다.</p><blockquote><p>2년 지원 유형 : 국가우수장학생(이공계)으로 선발된 이력이 없는 자연과학 및 공학계열 학과(부) 3학년 학생 중 대학의 추천을 받은 자</p></blockquote><p>제가 다니고 있는 학교는 공지 후 지원을 받아 학교의 종합 평가후 최종 선발을 진행하는 방식으로 진행되었습니다. 평가는 성적과 면접 평가를 종합해 최종선발을 진행하였고 당시 성적은 79학점 이수 전체 평점 4.27, 전공 4.43이었습니다. 성적 이외에 면접과 참고 자료가 되는 전인적 인재 성장 계획서에 대해서는 이후 말씀드리겠습니다.</p><h2 id="지원-내용"><a href="#지원-내용" class="headerlink" title="지원 내용"></a>지원 내용</h2><ol><li>등록금, 생활비를 지원</li></ol><ul><li>등록금 : 장학생 선정 후 매학기별 등록금 전액 지원</li><li>생활비 : 계속지원기준을 충족하는 기초생활수급자는 학기당 250만원 추가 지원</li></ul><ol start="2"><li>지원기간</li></ol><ul><li>재학중우수자(2년 지원 유형) 및 과학기술전문사관 후보생 지원 유형 : 선발 해당 학기를 포함하여 최대 2년 (정규 4학기) 지원</li></ul><h2 id="선발-과정"><a href="#선발-과정" class="headerlink" title="선발 과정"></a>선발 과정</h2><blockquote><p>선발인원 배정 → 대학추천 및 학생신청 → 최종심사 → 장학금 지급</p></blockquote><p>중간고사 2주전, 학생장학팀으로 아래와 같은 문자를 받았습니다.</p><p><img src="/img/%EA%B5%AD%EA%B0%80%EC%9A%B0%EC%88%98%EC%9E%A5%ED%95%99%EA%B8%88-%EC%95%88%EB%82%B4-%EB%AC%B8%EC%9E%90.jpeg" alt="국가우수장학금 안내 문자"></p><p>이후 말씀드릴 전인적 인재 성장 계획서와 신청서를 작성하고 면접 대상자로 선발되었다는 안내를 받고 그 다음주에 면접을 보았습니다. 면접 내용은 성장 계획서 내용의 간단한 면접이었고 일부 공통 질문의 경우는 학교 공지사항에 안내해주었습니다. 이후 최종 선발안내와 한국장학재단에 최종 등록을 하라는 안내를 받고 한국장학재단에 등록하면 마무리됩니다. 등록은 본인인증 후 작성하였던 전인적 인재 성장 계획서를 업로드하면 끝날정도로 간단하였습니다. 하지만 중간고사 기간동안 짧은 시간내에 진행된 일이라 너무 정신없이 지나간 주였습니다</p><h2 id="전인적-인재-성장-계획서"><a href="#전인적-인재-성장-계획서" class="headerlink" title="전인적 인재 성장 계획서"></a>전인적 인재 성장 계획서</h2><p>전인적 인재 성장 계획서는 모든 과정에서 제일 시간이 많이 들었고 어려웠던 부분이었습니다. 여기에 작성해야하는 항목은 아래 4개가 있습니다. 처음에 작성할 때는 사회 공헌에 대한 내용을 쓰라하여 뭔가 대단한 것을 써야하지 않을까? 라는 생각에 사로 잡혀있었습니다. 지금까지 해왔던 활동들을 사회 공헌의 관점에서 풀어 작성하면 가장 솔찍한 답변이 되지 않을까 싶어 과거의 활동들과 사회 공헌을 최대한 연관저어 작성했습니다. 너무 대단한 걸 쓰려고 하지 않아도 경험을 연관만 잘지어 쓰면 될 것 같다고 생각합니다.</p><ol><li>사회공헌 노력 및 활동</li><li>대학 생활 중 사회 공헌 등 활동 계획</li><li>사회 기여·환원 계획</li><li>이공계열 활동 계획</li></ol><p>제가 컴퓨터공확과인 만큼 정부에서 진행하였던 여러 해커톤에 참여하여 개발하고 수상하였던 것들을 사회공헌의 관점에서 쓰려고 노력했습니다. 제가 작성한 내용들은 아래와 같은데 이 경험들을 사회 공헌과 성과로 녹여 작성하였습니다.</p><ul><li><p>개인 맞춤 추천을 통한 군장병 자개계발 플랫폼<br>사회 단절로 인한 전역 군인의 취업 실패 경험을 개인 맞춤형 자기계발을 통한 극복을 통해 이에 따른 군 기피 현상을 개선하려고 노력하였다. 이런 장병들의 심적 부담감을 덜어 군 전체의 사기를 증진하려 노력하였다.</p></li><li><p>LSTM 모델을 활용해 미래의 따릉이 재고수 예측을 통한 불편점 개선<br>재고가 얼마 남지 않은경우 막상 재고가 없어 시간을 낭비하게 되는 불편함을 미래 따릉이 재고수를 예측하여 서울 시민의 불편함을 해소하려는 노력을 하였고 개발을 위해 재고 관련 실시간 데이터를 얻기 위해 담당 공무원과 지속적 연락하는등 공헌에 대한 노력하였다.</p></li><li><p>위치기반 실시간 반려동물 찾기 플랫폼<br>실종 전단지를 보고 고양이를 주인에게 찾아준 경험을 찾는 과정에서의 불편한 점을 여쭤보아 불편한 점을 개선하는 방향으로 확장하여 전단지 제작부터 배포, 회수 과정에 들어가는 시간 때문에 골든 타임을 놓칠까 싶은 불안감, 회수가 되지 않은 경우 환경오염에 대한 부담감을 해소하기 위해 이 플랫폼을 개발하였다.</p></li></ul><p>그리고 위의 활동을 통해 장관상등 각종 수상을 받은 내용을 더해 노력에 대한 성과가 앞으로 사회공헌에 대한 동기부여가 되었다고 작성했습니다. 처음에는 사회 공헌에 대한 내용을 뭘써야 하나 고민을 많이 하였는데 지금까지 경험하셨던 활동들을 뒤돌아 살펴보면 사회 공헌과 연결지을 수 있는 방향은 분명 있을 것이라고 생각합니다.</p><p>미래의 계획을 작성하는 부분은 소수의 사람들이 겪고 있는 어려운 점을 찾아 내가 활용할 수 있는 기술들을 활용해 소외받지 않도록 하고 싶다. 이런식으로 작성하였는데 1번처럼 과거의 경험을 쓰는 것 보다 미래의 계획을 쓰는게 더 어려웠습니다. 쓰면서 너무 막연한 내용을 쓰는게 아닐까 싶었지만 그냥 적당히 잘 쓰면 될 것 같습니다.</p><h2 id="후기"><a href="#후기" class="headerlink" title="후기"></a>후기</h2><p>중간 고사 기간에 갑작스럽게 계획서 작성과 면접을 보려하니 심리적 부담감을 갖고 있었습니다. 기존에는 학기마다 성적 우수장학금을 수여하였는데 이전보다는 부담감이 줄어 학교 과목 외의 내가 하고 싶은 공부를 더 하거나 새로운 도전을 할 수 있는 여유를 조금 찾은 것 같습니다. 대학 4년 모두 전액 장학금을 받게 되어 너무 뿌듯하고 앞으로 좀더 챌린징한 것들을 도전해보려고 합니다.</p><p>현재는 학교를 다니며 자율출퇴근제를 이용해 웹 개발자로 회사를 다니고 있는데 늘 새로운 길을 가보고 싶다는 생각만 하다 이제야 곧 퇴사하고 학부연구생으로써 새로운 영역에 도전해보려 합니다. 6월에 총장실에서 장학증서 수여식이 있다고 하니 이후에 근황에 대해 후기를 남기도록 하겠습니다. 이 글이 첫 개인적인 포스트인거 같은데 지금을 기록해두면 좋을 것 같아 틈틈히 작성해보려고 합니다.</p><p><img src="/img/%EA%B5%AD%EA%B0%80%EC%9A%B0%EC%88%98%EC%9E%A5%ED%95%99%EA%B8%88-%EC%84%A0%EB%B0%9C-%EB%AC%B8%EC%9E%90.jpeg" alt="국가우수장학금 최종 선발"></p>]]></content:encoded>
<comments>http://techbless.github.io/2023/05/09/%EA%B5%AD%EA%B0%80%EC%9A%B0%EC%88%98%EC%9E%A5%ED%95%99%EC%83%9D-%ED%95%A9%EA%B2%A9-%ED%9B%84%EA%B8%B0/#disqus_thread</comments>
</item>
<item>
<title>[ModelCtor] Sequelize Model의 Generic 타입 정의 방법</title>
<link>http://techbless.github.io/2023/04/08/sequelize-modelctor/</link>
<guid>http://techbless.github.io/2023/04/08/sequelize-modelctor/</guid>
<pubDate>Sat, 08 Apr 2023 19:20:11 GMT</pubDate>
<description>
<h1 id="Sequelize-Model-제네릭-타입-정의"><a href="#Sequelize-Model-제네릭-타입-정의" class="headerlink" title="Sequelize Model 제네릭 타입 정의"></a>Sequelize M
</description>
<content:encoded><![CDATA[<h1 id="Sequelize-Model-제네릭-타입-정의"><a href="#Sequelize-Model-제네릭-타입-정의" class="headerlink" title="Sequelize Model 제네릭 타입 정의"></a>Sequelize Model 제네릭 타입 정의</h1><p><code>Sequelize</code>의 <code>Model</code>을 메서드의 매개변수등으로 전달 받거나 할때 특정한 하나의 <code>Model</code>이 아닌 여러 <code>Model</code>을 받아야 하는 경우가 있을 수 있습니다. 이 요구사항을 만족시키기 위해 <code>Generic</code> 타입을 지정하는 것은 보편적인 해결 방법입니다. 그렇다면 <code>Sequelize Model</code>의 타입은 어떻게 <code>Generic Type</code>으로 지정할 수 있는지 알아보겠습니다.</p><h2 id="ModelCtor-타입"><a href="#ModelCtor-타입" class="headerlink" title="ModelCtor 타입"></a>ModelCtor 타입</h2><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> <span class="title class_">ModelCtor</span><M <span class="keyword">extends</span> <span class="title class_">Model</span> = <span class="title class_">Model</span>> = <span class="title class_">Repository</span><M>;</span><br></pre></td></tr></table></figure><p>앞서 말한 케이스 같은 경우 <code>ModelCtor</code> 타입을 토대로 <code>Generic</code> 타입을 지정할 수 있습니다.<br><code>ModelCtor</code> 타입의 정의는 위와 같고 “sequelize-typescript”에 정의되어있습니다.</p><p>AD_HERE</p><h2 id="예시를-통한-사용방법"><a href="#예시를-통한-사용방법" class="headerlink" title="예시를 통한 사용방법"></a>예시를 통한 사용방법</h2><p>아래와 같은 요구사항이 있다고 가정하고 예시 코드를 살펴 보겠습니다.</p><h3 id="요구사항"><a href="#요구사항" class="headerlink" title="요구사항"></a>요구사항</h3><ul><li>여러 Model과 Service에서 Pagination 기능을 포함하여야 한다.</li><li>결과 값과 조건에 해당하는 총 rows의 수를 반환한다.</li></ul><h3 id="해결-방법"><a href="#해결-방법" class="headerlink" title="해결 방법"></a>해결 방법</h3><p>메서드에서 <code><T extends Model></code> 제네릭 타입을 선언한 후, 매개변수의 <code>model</code>의 타입을 <code>ModelCtor<T></code>로 정의합니다.</p><p>코드의 재사용성을 높이기 위해 <code>BaseService</code>라는 <code>Class</code>를 작성하였습니다.<br>어떤 모델이던 아래의 코드를 통해 API 호출시 <code>filter</code>를 위한 쿼리 스트링을 <code>sequelize where</code> 객체로 변경하거나 페이지네이션을 위한 <code>Offset</code>을 매번 계산할 필요가 없습니다.</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> { <span class="title class_">Model</span>, <span class="title class_">ModelCtor</span> } <span class="keyword">from</span> <span class="string">"sequelize-typescript"</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="title class_">QueryBuilder</span> <span class="keyword">from</span> <span class="string">"./common/query.builder"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">class</span> <span class="title class_">BaseService</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">async</span> findAllAndCountWithPage<T <span class="keyword">extends</span> <span class="title class_">Model</span>>(</span><br><span class="line"> <span class="attr">model</span>: <span class="title class_">ModelCtor</span><T>,</span><br><span class="line"> <span class="attr">searchQuery</span>: { query; sort; page; pageSize }</span><br><span class="line"> ): <span class="title class_">Promise</span><{ <span class="attr">rows</span>: T[]; <span class="attr">count</span>: <span class="built_in">number</span> }> {</span><br><span class="line"> <span class="keyword">const</span> { page, pageSize, sort, query } = searchQuery;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">const</span> offset = <span class="variable language_">this</span>.<span class="title function_">getPaginationOffset</span>(page, pageSize);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> model.<span class="title function_">findAndCountAll</span>({</span><br><span class="line"> <span class="attr">where</span>: query,</span><br><span class="line"> <span class="attr">order</span>: sort,</span><br><span class="line"> <span class="attr">offset</span>: +offset,</span><br><span class="line"> <span class="attr">limit</span>: +pageSize,</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">buildSequelizeQuery</span>(<span class="params">validKey, reqQuery</span>) {</span><br><span class="line"> <span class="keyword">const</span> query = <span class="title class_">QueryBuilder</span>.<span class="title function_">buildFilterQuery</span>(validKey, reqQuery);</span><br><span class="line"> <span class="keyword">const</span> sort = <span class="title class_">QueryBuilder</span>.<span class="title function_">buildSortQuery</span>(reqQuery.<span class="property">sort</span>);</span><br><span class="line"> <span class="keyword">const</span> page = reqQuery.<span class="property">page</span> || <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">const</span> pageSize = reqQuery.<span class="property">pageSize</span> || <span class="number">10</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> { query, sort, page, pageSize };</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="title function_">getPaginationOffset</span>(<span class="params">page, pageSize</span>) {</span><br><span class="line"> <span class="keyword">let</span> offset = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (page > <span class="number">1</span>) {</span><br><span class="line"> offset = pageSize * (page - <span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> offset;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>AD_HERE</p><p>요구사항을 만족하는 기능이 필요한 <code>Service</code>에서 <code>BaseService</code>를 상속받아 사용합니다.</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> { <span class="title class_">Injectable</span> } <span class="keyword">from</span> <span class="string">"@nestjs/common"</span>;</span><br><span class="line"><span class="keyword">import</span> { <span class="title class_">BaseService</span> } <span class="keyword">from</span> <span class="string">"../common/service"</span>;</span><br><span class="line"><span class="keyword">import</span> { <span class="title class_">InjectModel</span> } <span class="keyword">from</span> <span class="string">"@nestjs/sequelize"</span>;</span><br><span class="line"><span class="keyword">import</span> { <span class="title class_">Book</span> } <span class="keyword">from</span> <span class="string">"./boook.model"</span>;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Injectable</span>()</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">class</span> <span class="title class_">BooksService</span> <span class="keyword">extends</span> <span class="title class_ inherited__">BaseService</span> {</span><br><span class="line"> <span class="title function_">constructor</span>(<span class="params"><span class="meta">@InjectModel</span>(Book) <span class="keyword">private</span> <span class="attr">bookModel</span>: <span class="keyword">typeof</span> <span class="title class_">Book</span></span>) {</span><br><span class="line"> <span class="variable language_">super</span>();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">async</span> <span class="title function_">getBooks</span>(<span class="params">reqQuery</span>) {</span><br><span class="line"> <span class="keyword">const</span> <span class="variable constant_">VALID_KEY</span> = [<span class="string">"title"</span>, <span class="string">"description"</span>]; <span class="comment">// 검색 가능한 column 필터링</span></span><br><span class="line"> <span class="keyword">const</span> { query, sort, page, pageSize } = <span class="variable language_">super</span>.<span class="title function_">buildSequelizeQuery</span>(<span class="variable constant_">VALID_KEY</span>, reqQuery);</span><br><span class="line"> <span class="keyword">return</span> <span class="variable language_">super</span>.<span class="title function_">findAllAndCountWithPage</span>(<span class="variable language_">this</span>.<span class="property">bookModel</span>, { query, sort, page, pageSize });</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> { <span class="title class_">Controller</span>, <span class="title class_">Get</span>, <span class="title class_">Query</span> } <span class="keyword">from</span> <span class="string">"@nestjs/common"</span>;</span><br><span class="line"><span class="keyword">import</span> { <span class="title class_">BooksService</span> } <span class="keyword">from</span> <span class="string">"./books.service"</span>;</span><br><span class="line"><span class="keyword">import</span> { <span class="title class_">BaseController</span> } <span class="keyword">from</span> <span class="string">"../common/controller"</span>;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Controller</span>(<span class="string">"books"</span>)</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">class</span> <span class="title class_">BooksController</span> <span class="keyword">extends</span> <span class="title class_ inherited__">BaseController</span> {</span><br><span class="line"> <span class="title function_">constructor</span>(<span class="params"><span class="keyword">private</span> <span class="attr">booksService</span>: <span class="title class_">BooksService</span></span>) {</span><br><span class="line"> <span class="variable language_">super</span>();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Get</span>()</span><br><span class="line"> <span class="keyword">async</span> <span class="title function_">getUsers</span>(<span class="params"><span class="meta">@Query</span>() query</span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="property">booksService</span>.<span class="title function_">getBooks</span>(query);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content:encoded>
<comments>http://techbless.github.io/2023/04/08/sequelize-modelctor/#disqus_thread</comments>
</item>
<item>
<title>express-session에서 Redis사용을 위한 connect-redis v7 변경 사항 및 오류 해결 방법</title>
<link>http://techbless.github.io/2023/04/01/express-session%EC%97%90%EC%84%9C-redis%EC%82%AC%EC%9A%A9%EC%9D%84-%EC%9C%84%ED%95%9C-connect-redis-v7-%EB%B3%80%EA%B2%BD-%EC%82%AC%ED%95%AD/</link>
<guid>http://techbless.github.io/2023/04/01/express-session%EC%97%90%EC%84%9C-redis%EC%82%AC%EC%9A%A9%EC%9D%84-%EC%9C%84%ED%95%9C-connect-redis-v7-%EB%B3%80%EA%B2%BD-%EC%82%AC%ED%95%AD/</guid>
<pubDate>Sat, 01 Apr 2023 05:22:19 GMT</pubDate>
<description>
<h1 id="connect-redis"><a href="#connect-redis" class="headerlink" title="connect-redis"></a>connect-redis</h1><p><code>connect-redis</code>
</description>
<content:encoded><![CDATA[<h1 id="connect-redis"><a href="#connect-redis" class="headerlink" title="connect-redis"></a>connect-redis</h1><p><code>connect-redis</code>는 <code>Express</code>에서 <code>redis</code>를 <code>session storage</code>로 제공하는 라이브러리 입니다.<br>프로덕션 배포시 메모리를 세션 스토리지로 사용하지 않고 <code>Scalability</code>와 안정성을 위해 사용됩니다.</p><p>최근에 새로 시작하는 프로젝트에서 <code>redis session</code>을 설정하는데 문제가 있어 찾아보던 중 최근 2023년 3월 1일에 <code>connect-redis</code>의 버전 업데이트이 있어 기존과 달라진 부분을 공유하고자 합니다.</p><p><a href="https://github.com/tj/connect-redis/pull/377">업데이트 로그 바로가기</a></p><h2 id="Breaking-changes"><a href="#Breaking-changes" class="headerlink" title="Breaking changes"></a>Breaking changes</h2><p>제일 큰 변경사항은 아래의 1번과 2번입니다.</p><ol><li>더이상 redis client의 lagacy 모드를 지원하지 않습니다.</li><li>타입스크립트 코드 기반으로 재작성되어 더이상 기존 <code>@types/connect-redis</code>를 사용하지 않습니다.</li><li>빌드는 이제 CJS와 ESM을 모두 지원합니다. 노드 14에 대한 지원이 제거되었습니다.</li></ol><p>AD_HERE</p><h2 id="버전-6-x에서의-마이그레이션"><a href="#버전-6-x에서의-마이그레이션" class="headerlink" title="버전 6.x에서의 마이그레이션"></a>버전 6.x에서의 마이그레이션</h2><blockquote><p>redis 패키지에 대해 regacyMode: true 설정을 사용한 경우 이 패키지를 실행하는 데 레거시 모드가 더 이상 필요하지 않으며 더 이상 지원되지 않으므로 이 설정을 제거해주세요.</p></blockquote><p><code>@types/connect-redis</code> 타입정의를 사용중이라면 제거해주세요.</p><blockquote><p><code>@types/connect-redis</code>의 버전이 아직 업데이트 되지 않아 타입 오류가 발생합니다. <code>connect-redis</code> 패키지에 타입을 포함하고 있으니 제거해주세요.</p></blockquote><p>RedisStore 초기화는 더 이상 express-session을 사용하지 않습니다.</p><blockquote><p>별도의 RedisStore 초기화 과정없이 바로 import된 RedisStore를 사용하면 됩니다.</p></blockquote><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 기존</span></span><br><span class="line"><span class="keyword">import</span> connectRedis <span class="keyword">from</span> <span class="string">"connect-redis"</span>;</span><br><span class="line"><span class="keyword">import</span> session <span class="keyword">from</span> <span class="string">"express-session"</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="title class_">RedisStore</span> = <span class="title function_">connectRedis</span>(seession);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 현재</span></span><br><span class="line"><span class="keyword">import</span> <span class="title class_">RedisStore</span> <span class="keyword">from</span> <span class="string">"connect-redis"</span>;</span><br></pre></td></tr></table></figure><p>CommonJS(require) 모듈을 사용하는 경우. 기본 export를 가져와야 합니다.</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 기존</span></span><br><span class="line"><span class="keyword">const</span> <span class="title class_">RedisStore</span> = <span class="built_in">require</span>(<span class="string">"connect-redis"</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 현재</span></span><br><span class="line"><span class="keyword">const</span> <span class="title class_">RedisStore</span> = <span class="built_in">require</span>(<span class="string">"connect-redis"</span>).<span class="property">default</span>;</span><br></pre></td></tr></table></figure><p>아래에 예시코드를 작성하여 두었으니 참고해주세요.</p><p>AD_HERE</p><h2 id="예시"><a href="#예시" class="headerlink" title="예시"></a>예시</h2><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> { <span class="title class_">NestFactory</span> } <span class="keyword">from</span> <span class="string">"@nestjs/core"</span>;</span><br><span class="line"><span class="keyword">import</span> { <span class="title class_">AppModule</span> } <span class="keyword">from</span> <span class="string">"./app.module"</span>;</span><br><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> session <span class="keyword">from</span> <span class="string">"express-session"</span>;</span><br><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> passport <span class="keyword">from</span> <span class="string">"passport"</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="title class_">RedisClient</span> <span class="keyword">from</span> <span class="string">"./common/redis"</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="title class_">RedisStore</span> <span class="keyword">from</span> <span class="string">"connect-redis"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">bootstrap</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="keyword">const</span> app = <span class="keyword">await</span> <span class="title class_">NestFactory</span>.<span class="title function_">create</span>(<span class="title class_">AppModule</span>, {</span><br><span class="line"> <span class="attr">logger</span>: [<span class="string">"error"</span>, <span class="string">"warn"</span>],</span><br><span class="line"> });</span><br><span class="line"></span><br><span class="line"> <span class="keyword">const</span> redisClient = <span class="keyword">await</span> <span class="title class_">RedisClient</span>.<span class="title function_">getRedisClient</span>();</span><br><span class="line"> <span class="keyword">const</span> redisStore = <span class="keyword">new</span> <span class="title class_">RedisStore</span>({ <span class="attr">client</span>: redisClient });</span><br><span class="line"></span><br><span class="line"> app.<span class="title function_">use</span>(</span><br><span class="line"> <span class="title function_">session</span>({</span><br><span class="line"> <span class="attr">store</span>: redisStore,</span><br><span class="line"> <span class="attr">secret</span>: process.<span class="property">env</span>.<span class="property">SESSION_SECRET</span>,</span><br><span class="line"> <span class="attr">resave</span>: <span class="literal">false</span>,</span><br><span class="line"> <span class="attr">saveUninitialized</span>: <span class="literal">false</span>,</span><br><span class="line"> })</span><br><span class="line"> );</span><br><span class="line"></span><br><span class="line"> app.<span class="title function_">use</span>(passport.<span class="title function_">initialize</span>());</span><br><span class="line"> app.<span class="title function_">use</span>(passport.<span class="title function_">session</span>());</span><br><span class="line"></span><br><span class="line"> <span class="keyword">await</span> app.<span class="title function_">listen</span>(<span class="number">3000</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="title function_">bootstrap</span>();</span><br></pre></td></tr></table></figure>]]></content:encoded>
<comments>http://techbless.github.io/2023/04/01/express-session%EC%97%90%EC%84%9C-redis%EC%82%AC%EC%9A%A9%EC%9D%84-%EC%9C%84%ED%95%9C-connect-redis-v7-%EB%B3%80%EA%B2%BD-%EC%82%AC%ED%95%AD/#disqus_thread</comments>
</item>
<item>
<title>[Sequelize Hook] Getter에서 async를 못 쓰니 Hook를 사용해보자</title>
<link>http://techbless.github.io/2023/01/08/sequelize-async-getter/</link>
<guid>http://techbless.github.io/2023/01/08/sequelize-async-getter/</guid>
<pubDate>Sun, 08 Jan 2023 21:37:41 GMT</pubDate>
<description>
<h1 id="Sequelize-Getter"><a href="#Sequelize-Getter" class="headerlink" title="Sequelize Getter"></a>Sequelize Getter</h1><p><code>Sequeliz
</description>
<content:encoded><![CDATA[<h1 id="Sequelize-Getter"><a href="#Sequelize-Getter" class="headerlink" title="Sequelize Getter"></a>Sequelize Getter</h1><p><code>Sequelize</code>에서 아래와 같이 모델의 컬럼별로 <code>getter</code>를 사용할 수 있습니다.<br>예를 들어, username을 항상 대문자로 보고싶다면 username컬럼의 <code>getter</code>에서 대문자로 변환할수 있습니다.</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="title class_">User</span> = sequelize.<span class="title function_">define</span>(<span class="string">"user"</span>, {</span><br><span class="line"> <span class="comment">// Let's say we wanted to see every username in uppercase, even</span></span><br><span class="line"> <span class="comment">// though they are not necessarily uppercase in the database itself</span></span><br><span class="line"> <span class="attr">username</span>: {</span><br><span class="line"> <span class="attr">type</span>: <span class="title class_">DataTypes</span>.<span class="property">STRING</span>,</span><br><span class="line"> <span class="title function_">get</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="keyword">const</span> rawValue = <span class="variable language_">this</span>.<span class="title function_">getDataValue</span>(<span class="string">"username"</span>);</span><br><span class="line"> <span class="keyword">return</span> rawValue ? rawValue.<span class="title function_">toUpperCase</span>() : <span class="literal">null</span>;</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">});</span><br></pre></td></tr></table></figure><h2 id="Sequelize-Getter-Async-사용-불가"><a href="#Sequelize-Getter-Async-사용-불가" class="headerlink" title="Sequelize Getter Async 사용 불가"></a>Sequelize Getter Async 사용 불가</h2><p>안타깝게도 <code>getter</code>를 <code>async</code>로 지정할 수 없고 당연하게도 <code>async</code> 메서드를 호출하여 정상적으로 사용할 수 없습니다.</p><p>그래도 <code>getter</code>에서 <code>async</code>메서드를 호출해야 한다면 <code>getter</code>의 기능을 하면서도 <code>async</code>를 사용할 수 있는 아래에서 소개할 <code>hook</code>를 사용하는 걸 고려해 볼 수 있습니다.</p><p>AD_HERE</p><h2 id="Sequelize-Hook로-대체"><a href="#Sequelize-Hook로-대체" class="headerlink" title="Sequelize Hook로 대체"></a>Sequelize Hook로 대체</h2><p><code>Sequelize</code>에서 제공하는 <code>Hook</code>을 통해 <code>async</code>메서드를 포함하면서도 <code>getter</code>의 기능하는 아주 간단한 예제를 수행해보도록 하겟습니다.</p><p>만약에 “판매가는 무조건 공급가에 설정한 마진율을 곱한 가격이다.” 라는 정책이 있는 경우 해당 요구사항을 충족할 수 있도록 <code>getter</code>에서 설정을 가져와 공급가에 마진율을 곱해준 값을 판매가로 설정한다는 <code>getter</code>를 만들수 있습니다. 하지만 아래의 코드처럼 마진율 설정값을 가져오는 메서드가 <code>async</code>라면 <code>getter</code>를 사용할 수 없습니다.</p><p>따라서 <code>afterFind</code>라는 <code>hook</code>를 지정하여 <code>findOne</code>, <code>findAll</code> 혹은 <code>findByPk</code>등의 메서드를 호출한 경우 <code>hook</code>를 실행하여 해당 요구사항을 만족시킬 수 있습니다.</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="title class_">Sequelize</span>, { <span class="title class_">DataTypes</span> } <span class="keyword">from</span> <span class="string">"sequelize"</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="title class_">ConfigService</span> <span class="keyword">from</span> <span class="string">"../services/config.js"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Product</span> <span class="keyword">extends</span> <span class="title class_ inherited__">Sequelize.Model</span> {</span><br><span class="line"> <span class="keyword">static</span> <span class="title function_">init</span>(<span class="params">sequelize</span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="variable language_">super</span>.<span class="title function_">init</span>(</span><br><span class="line"> {</span><br><span class="line"> <span class="attr">productNo</span>: {</span><br><span class="line"> <span class="attr">type</span>: <span class="title class_">DataTypes</span>.<span class="property">INTEGER</span>,</span><br><span class="line"> <span class="attr">primaryKey</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="attr">allowNull</span>: <span class="literal">false</span>,</span><br><span class="line"> <span class="attr">autoIncrement</span>: <span class="literal">true</span>,</span><br><span class="line"> },</span><br><span class="line"> <span class="attr">supplyPrice</span>: {</span><br><span class="line"> <span class="attr">type</span>: <span class="title class_">DataTypes</span>.<span class="title function_">DECIMAL</span>(<span class="number">17</span>, <span class="number">2</span>)</span><br><span class="line"> }</span><br><span class="line"> <span class="attr">price</span>: {</span><br><span class="line"> <span class="attr">type</span>: <span class="title class_">DataTypes</span>.<span class="property">VIRTUAL</span></span><br><span class="line"> },</span><br><span class="line"> ...</span><br><span class="line"> },</span><br><span class="line"> {</span><br><span class="line"> sequelize,</span><br><span class="line"> <span class="attr">charset</span>: <span class="string">"utf8mb4"</span>,</span><br><span class="line"> <span class="attr">collate</span>: <span class="string">"utf8mb4_unicode_ci"</span>,</span><br><span class="line"> <span class="attr">hooks</span>: {</span><br><span class="line"> <span class="attr">afterFind</span>: <span class="title function_">async</span> (record, options) => {</span><br><span class="line"> <span class="keyword">if</span> (!record) {</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">const</span> marginRatio = <span class="keyword">await</span> <span class="title class_">ConfigService</span>.<span class="title function_">getConfig</span>(<span class="string">"MARGIN_RATIO"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (<span class="title class_">Array</span>.<span class="title function_">isArray</span>(record)) {</span><br><span class="line"> record.<span class="title function_">forEach</span>(<span class="function">(<span class="params">each</span>) =></span> {</span><br><span class="line"> <span class="keyword">const</span> supplyPrice = each.<span class="property">dataValues</span>.<span class="property">supplyPrice</span>;</span><br><span class="line"> each.<span class="property">dataValues</span>.<span class="property">price</span> = <span class="title class_">Math</span>.<span class="title function_">floor</span>(<span class="title class_">Math</span>.<span class="title function_">floor</span>(supplyPrice * marginRatio) / <span class="number">10</span>) * <span class="number">10</span>;</span><br><span class="line"> });</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">const</span> supplyPrice = record.<span class="property">dataValues</span>.<span class="property">supplyPrice</span>;</span><br><span class="line"> record.<span class="property">dataValues</span>.<span class="property">price</span> = <span class="title class_">Math</span>.<span class="title function_">floor</span>(<span class="title class_">Math</span>.<span class="title function_">floor</span>(supplyPrice * marginRatio) / <span class="number">10</span>) * <span class="number">10</span>;</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line"> );</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">static</span> <span class="title function_">associate</span>(<span class="params">db</span>) {</span><br><span class="line"> <span class="comment">// Association</span></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title class_">Product</span>;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="Array-isArray-record"><a href="#Array-isArray-record" class="headerlink" title="Array.isArray(record)"></a>Array.isArray(record)</h3><p>위의 코드 중간에 있는 배열 여부에 관한 분기를 통해 단일 레코드와 배열을 모두 처리할 수 있습니다. 만약 이 조건을 빠뜨린다면 오류가 발생할 수 있으니 주의 바랍니다.</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (<span class="title class_">Array</span>.<span class="title function_">isArray</span>(record)) {</span><br><span class="line"> record.<span class="title function_">forEach</span>(<span class="function">(<span class="params">each</span>) =></span> {</span><br><span class="line"> <span class="comment">// find의 결과가 배열인 경우 ex) findAll()</span></span><br><span class="line"> });</span><br><span class="line">} <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">// 단일 레코드인 경우 ex) findOne()</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>AD_HERE</p><h3 id="Sequelize-Hook의-종류"><a href="#Sequelize-Hook의-종류" class="headerlink" title="Sequelize Hook의 종류"></a>Sequelize Hook의 종류</h3><p><code>afterFind</code>이외에 다양한 <code>Hook</code>가 존재하니 <a href="https://sequelize.org/docs/v6/other-topics/hooks/">Sequelize 문서</a>를 참고하시면 좋겠습니다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2023/01/08/sequelize-async-getter/#disqus_thread</comments>
</item>
<item>
<title>TypeScript 런타임 타입 체크 Type Guard의 필요성</title>
<link>http://techbless.github.io/2022/12/04/TypeScript-%EB%9F%B0%ED%83%80%EC%9E%84-%ED%83%80%EC%9E%85-%EC%B2%B4%ED%81%AC-Type-Guard%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1/</link>
<guid>http://techbless.github.io/2022/12/04/TypeScript-%EB%9F%B0%ED%83%80%EC%9E%84-%ED%83%80%EC%9E%85-%EC%B2%B4%ED%81%AC-Type-Guard%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1/</guid>
<pubDate>Sun, 04 Dec 2022 00:07:41 GMT</pubDate>
<description>
<h1 id="TypeScript의-자료형-및-타입-표명"><a href="#TypeScript의-자료형-및-타입-표명" class="headerlink" title="TypeScript의 자료형 및 타입 표명"></a>TypeScript의 자료형 및
</description>
<content:encoded><![CDATA[<h1 id="TypeScript의-자료형-및-타입-표명"><a href="#TypeScript의-자료형-및-타입-표명" class="headerlink" title="TypeScript의 자료형 및 타입 표명"></a>TypeScript의 자료형 및 타입 표명</h1><p><code>TypeScript</code>로 작성된 코드는 코드가 실행되기 전 <code>Compile Time</code>에 타입을 강제합니다. 여기서 중요하게 봐야할 부분은 컴파일 시간에 타입을 강제한다는 점입니다. 런타임 시에는 실제로는 외부에서 들어오는 데이터나 Parse된 JSON과 같이 동적으로 입력되는 데이터는 타입에 대해 <code>Cast</code>하거나 오류를 발생시키지 않습니다. 즉 타입스크립트의 타입 표명은 런타임의 <code>Type Casting</code>이 아니라는 점을 꼭 상기해야합니다. 타입 표명은 컴파일 시간을 위한 것이고 어떤식으로 분석되길 원하는지 컴파일러에게 제공하는 힌트일 뿐입니다.</p><h2 id="런타임에-타입-체크가-필요한-이유"><a href="#런타임에-타입-체크가-필요한-이유" class="headerlink" title="런타임에 타입 체크가 필요한 이유"></a>런타임에 타입 체크가 필요한 이유</h2><p>앞서 말했듯이 타입스크립트는 런타임에서 동적 데이터의 자료형을 보장하지는 않습니다. 예를 들면 아래의 간단한 경우들을 살펴보도록 하겠습니다.</p><ol><li>Front-End에서 잘못된 타입으로 API 호출하는 경우</li><li>API가 잘못된 타입으로 반환하는 경우</li></ol><p>1번과 2번 모두 내가 정의한 타입 그대로 지켜질지 아닐지 모르는 런타임에 외부에서 들어오는 데이터인 경우입니다.</p><p>이처럼 늘 휴먼에러가 발생할 수 있다는 점을 가정하고 안전한 코드를 작성해야 합니다.<br>따라서 런타임에도 타입스크립트가 자료형을 지켜줄 것이라고 믿거나 휴먼 에러가 발생하지 않을 것이라고 믿는 것은 어리석은 행동이다. 이경우 자바스크립트의 특성상 치명적인 오류를 초례할 가능성이 있습니다.</p><p>AD_HERE</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">interface</span> <span class="title class_">ExpectedUserInput</span> {</span><br><span class="line"> <span class="attr">message</span>: <span class="built_in">string</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">EchoController</span> <span class="keyword">extends</span> <span class="title class_ inherited__">Controller</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">echo</span>(<span class="params"><span class="attr">req</span>: <span class="title class_">Request</span>, <span class="attr">res</span>: <span class="title class_">Response</span></span>) {</span><br><span class="line"> <span class="keyword">const</span> body = req.<span class="property">body</span> <span class="keyword">as</span> <span class="title class_">ExpectedUserInput</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="keyword">typeof</span> body.<span class="property">message</span>, body);</span><br><span class="line"> res.<span class="title function_">json</span>({ <span class="attr">yourMessage</span>: body.<span class="property">message</span> });</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>위처럼 간단한 Echo API를 살펴보겠습니다. <code>body.message</code>의 자료형은 <code>string</code>으로 보장될 것이라 예상할 수 있습니다.</p><p>API Request Body</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"message"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure><p>하지만 <code>string</code>일 것이라는 예상과 달리 실제 호출시 입력한 값의 자료형으로 그대로 들어가게 됩니다.</p><p>Console Result</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">number { message: 0 }</span><br></pre></td></tr></table></figure><p>AD_HERE</p><p>타입스크립트의 장점만을 바라고 이부분을 놓친채로 사용한다면 실제 타입스크립트의 장점을 온전히 누리지 못한 채로 생산성만 낮추며 두마리 토끼를 다 잃을 수 있다고 생각합니다.<br>적절한 <code>Type Guard</code> 없이 타입을 정의해 사용한다면 오히려 개발자들에게 있어 해당 데이터의 타입의 혼란과 실수만을 야기할 수도 있습니다.<br>따라서 컴파일 시간에 데이터의 타입을 특정할 수 없는 경우 <code>TypeGuard</code>를 통해 타입스크립트의 장점을 온전히 가져야 하지 않을까 싶습니다.</p><h2 id="TypeGuard"><a href="#TypeGuard" class="headerlink" title="TypeGuard"></a>TypeGuard</h2><p>따라서 런타임시에 <code>typeof</code> 혹은 <code>instanceof</code> 등의 적절한 <code>Type Guard</code>로 타입을 보장해야합니다. 타입 가드에 대한 내용과 라이브러리들은 다음 포스트에서 조금 더 자세히 다루도록 하겠습니다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2022/12/04/TypeScript-%EB%9F%B0%ED%83%80%EC%9E%84-%ED%83%80%EC%9E%85-%EC%B2%B4%ED%81%AC-Type-Guard%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1/#disqus_thread</comments>
</item>
<item>
<title>Github Action에서 npm관련 command not found 오류 해결 방법</title>
<link>http://techbless.github.io/2022/11/07/Github-Action%EC%97%90%EC%84%9C-npm%EA%B4%80%EB%A0%A8-command-not-found-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95/</link>
<guid>http://techbless.github.io/2022/11/07/Github-Action%EC%97%90%EC%84%9C-npm%EA%B4%80%EB%A0%A8-command-not-found-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95/</guid>
<pubDate>Mon, 07 Nov 2022 21:58:27 GMT</pubDate>
<description>
<h1 id="Github-Action으로-배포시-npm-Command-Not-Found"><a href="#Github-Action으로-배포시-npm-Command-Not-Found" class="headerlink" title="Github Act
</description>
<content:encoded><![CDATA[<h1 id="Github-Action으로-배포시-npm-Command-Not-Found"><a href="#Github-Action으로-배포시-npm-Command-Not-Found" class="headerlink" title="Github Action으로 배포시 npm: Command Not Found"></a>Github Action으로 배포시 npm: Command Not Found</h1><h2 id="NVM"><a href="#NVM" class="headerlink" title="NVM"></a>NVM</h2><p><code>nvm</code>은 Node Version Manager의 줄임말로 <code>Node.js</code>의 버전을 쉽게 변경하고 관리할 수 있도록 도와주는 도구입니다.</p><h2 id="이슈"><a href="#이슈" class="headerlink" title="이슈"></a>이슈</h2><p>만약 <code>nvm</code>으로 <code>Node.js</code>를 설치하고 실 서버에 <code>Github Action</code>을 통해 배포를 하는 경우 아래의 오류들이 발생할 수 있습니다.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">bash: line x: node: command not found</span><br><span class="line"></span><br><span class="line">bash: line x: npm: command not found</span><br><span class="line"></span><br><span class="line">bash: line x: npx: command not found</span><br><span class="line"></span><br><span class="line">bash: line x: pm2: command not found</span><br><span class="line"></span><br><span class="line">bash: line x: yarn: command not found</span><br></pre></td></tr></table></figure><p>AD_HERE</p><h2 id="해결-방법"><a href="#해결-방법" class="headerlink" title="해결 방법"></a>해결 방법</h2><p>아래와 같이 <code>/usr/local/bin</code> 디렉터리 아래에 심볼링 링크를 만들어 오류를 해결할 수 있습니다.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">sudo ln -s "$NVM_DIR/versions/node/$(node 버전)/bin/node" "/usr/local/bin/node"</span><br><span class="line">버전</span><br><span class="line">sudo ln -s "$NVM_DIR/versions/node/$(node 버전)/bin/npm" "/usr/local/bin/npm"</span><br><span class="line"></span><br><span class="line">sudo ln -s "$NVM_DIR/versions/node/$(node 버전)/bin/pm2" "/usr/local/bin/pm2"</span><br><span class="line"></span><br><span class="line">sudo ln -s "$NVM_DIR/versions/node/$(node 버전)/bin/yarn" "/usr/local/bin/yarn"</span><br><span class="line"></span><br><span class="line">sudo ln -s "$NVM_DIR/versions/node/$(node 버전)/bin/npx" "/usr/local/bin/npx"</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content:encoded>
<comments>http://techbless.github.io/2022/11/07/Github-Action%EC%97%90%EC%84%9C-npm%EA%B4%80%EB%A0%A8-command-not-found-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95/#disqus_thread</comments>
</item>
<item>
<title>Git 계정정보를 저장하는 방법</title>
<link>http://techbless.github.io/2022/11/06/Git-%EA%B3%84%EC%A0%95%EC%A0%95%EB%B3%B4%EB%A5%BC-%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95/</link>
<guid>http://techbless.github.io/2022/11/06/Git-%EA%B3%84%EC%A0%95%EC%A0%95%EB%B3%B4%EB%A5%BC-%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95/</guid>
<pubDate>Sun, 06 Nov 2022 12:58:27 GMT</pubDate>
<description>
<h1 id="Git-계정-정보를-저장하는-방법"><a href="#Git-계정-정보를-저장하는-방법" class="headerlink" title="Git 계정 정보를 저장하는 방법"></a>Git 계정 정보를 저장하는 방법</h1><p>깃허브 비밀
</description>
<content:encoded><![CDATA[<h1 id="Git-계정-정보를-저장하는-방법"><a href="#Git-계정-정보를-저장하는-방법" class="headerlink" title="Git 계정 정보를 저장하는 방법"></a>Git 계정 정보를 저장하는 방법</h1><p>깃허브 비밀번호로 로그인할 수 없고 토큰을 발급하여 로그인 하여야 합니다.<br>아래의 명령어를 입력하면 앞으로 아이디와 비밀번호 인증 없이 사용할 수 있습니다.</p><p><code>git config credential.helper store --global</code></p><p>맨날 까먹어서 기록합니다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2022/11/06/Git-%EA%B3%84%EC%A0%95%EC%A0%95%EB%B3%B4%EB%A5%BC-%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95/#disqus_thread</comments>
</item>
<item>
<title>Ubuntu에서 nvm과 node.js 설치 및 버전 변경 방법</title>
<link>http://techbless.github.io/2022/10/20/Ubuntu%EC%97%90%EC%84%9C-nvm%EA%B3%BC-node-js-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EB%B2%84%EC%A0%84-%EB%B3%80%EA%B2%BD-%EB%B0%A9%EB%B2%95/</link>
<guid>http://techbless.github.io/2022/10/20/Ubuntu%EC%97%90%EC%84%9C-nvm%EA%B3%BC-node-js-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EB%B2%84%EC%A0%84-%EB%B3%80%EA%B2%BD-%EB%B0%A9%EB%B2%95/</guid>
<pubDate>Thu, 20 Oct 2022 12:58:27 GMT</pubDate>
<description>
<h1 id="NVM"><a href="#NVM" class="headerlink" title="NVM"></a>NVM</h1><p><code>nvm</code>은 Node Version Manager의 줄임말로 <code>Node.js</code>의
</description>
<content:encoded><![CDATA[<h1 id="NVM"><a href="#NVM" class="headerlink" title="NVM"></a>NVM</h1><p><code>nvm</code>은 Node Version Manager의 줄임말로 <code>Node.js</code>의 버전을 쉽게 변경하고 관리할 수 있도록 도와주는 도구입니다.<br>개발환경과 실 서버의 버전이 다른 경우 배포시 다양한 이슈가 발생할 수 있습니다. 하지만 여러서버들의 버전이 다르다면 개발환경을 통일화하기 어렵습니다.<br>이때 사용하면 유용한 것이 <code>nvm</code>입니다.</p><p>AD_HERE</p><h2 id="설치-방법"><a href="#설치-방법" class="headerlink" title="설치 방법"></a>설치 방법</h2><p>설치 방법은 우분투를 기준으로 설명하겠습니다. <code>ssh</code>를 통해 서버에 접근하여 아래의 명령어로 설치하실 수 있습니다.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash</span><br><span class="line">. ~/.nvm/nvm.sh</span><br><span class="line">nvm install node</span><br><span class="line">nvm install 버전</span><br></pre></td></tr></table></figure><p>매번 찾아보기 번거로워 오랫만에 글도 쓸겸해서 메모로 남깁니다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2022/10/20/Ubuntu%EC%97%90%EC%84%9C-nvm%EA%B3%BC-node-js-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EB%B2%84%EC%A0%84-%EB%B3%80%EA%B2%BD-%EB%B0%A9%EB%B2%95/#disqus_thread</comments>
</item>
<item>
<title>중첩 조건문을 Guard Clause로 가독성 높은 코드를 작성하는 방법</title>
<link>http://techbless.github.io/2021/06/16/%EC%A4%91%EC%B2%A9-%EC%A1%B0%EA%B1%B4%EB%AC%B8%EC%9D%84-Guard-Clause%EB%A1%9C-%EA%B0%80%EB%8F%85%EC%84%B1-%EB%86%92%EC%9D%80-%EC%BD%94%EB%93%9C%EB%A5%BC-%EC%9E%91%EC%84%B1%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95/</link>
<guid>http://techbless.github.io/2021/06/16/%EC%A4%91%EC%B2%A9-%EC%A1%B0%EA%B1%B4%EB%AC%B8%EC%9D%84-Guard-Clause%EB%A1%9C-%EA%B0%80%EB%8F%85%EC%84%B1-%EB%86%92%EC%9D%80-%EC%BD%94%EB%93%9C%EB%A5%BC-%EC%9E%91%EC%84%B1%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95/</guid>
<pubDate>Wed, 16 Jun 2021 00:42:18 GMT</pubDate>
<description>
<h1 id="Guard-Clause란-무엇일까"><a href="#Guard-Clause란-무엇일까" class="headerlink" title="Guard Clause란 무엇일까"></a>Guard Clause란 무엇일까</h1><p><code>
</description>
<content:encoded><![CDATA[<h1 id="Guard-Clause란-무엇일까"><a href="#Guard-Clause란-무엇일까" class="headerlink" title="Guard Clause란 무엇일까"></a>Guard Clause란 무엇일까</h1><p><code>if/else</code> 분기는 프로그래밍을 처음 배울때 가장 먼저 접하는 컨셉중 하나입니다. 조건 분기가 필요한 부분에서 가장 흔하게 사용되는 <code>statement</code> 이기도 한데요, 이 간단한 <code>if/else</code>가 복잡해지고 중첩되면 부담이 되고 가독성을 크게 해칠 수 있습니다. 쉽게 복잡해질 수 있는 중첩의 수준, 즉, 코드의 <code>depth</code>가 깊어지는 것을 막을 수 있는 방법으로 <code>Guard Clause</code>를 고려해 볼 수 있습니다. 이 <code>Code Clause</code>를 통해 중첩된 조건문을 평탄화(flattening)시켜 코드의 가독성을 향상시킬 수 있습니다.</p><p>AD_HERE</p><h2 id="일단-Guard가-뭔지-알아보자"><a href="#일단-Guard가-뭔지-알아보자" class="headerlink" title="일단 Guard가 뭔지 알아보자"></a>일단 Guard가 뭔지 알아보자</h2><blockquote><p><em>“In computer programming, a guard is a boolean expression that must evaluate to true if the program execution is to continue in the branch in question. Regardless of which programming language is used, guard code or a guard clause is a check of integrity preconditions used to avoid errors during execution.” —</em> <a href="https://en.wikipedia.org/wiki/Guard_(computer_science)"><em>Wikipedia</em></a></p></blockquote><p>쉽게 생각하면, <code>null</code> 체크와 같이 조건분기에서 계속 실행되기 위해 <code>true</code>여야 하는 <code>boolean expression</code>을 의미합니다. </p><h2 id="Concept"><a href="#Concept" class="headerlink" title="Concept"></a>Concept</h2><p>다음과 같은 기존의 코드가 있습니다.</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (guard) {</span><br><span class="line"> ...</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>이 코드를 <code>not guard</code>의 조건으로 바꾸고 조기에 <code>return</code>합니다 (return early). 그 다음, 기존의 <code>guard</code> 조건을 가진 분기의 코드 블락을 아래와 같이 <code>not guard</code>이후에 작성하면 됩니다. 이제 위의 분기 코드를 아래와 같이 표현할 수 있습니다. </p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span>(not guard) {</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line">}</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>여기까지만 보면 오히려 멀쩡한 조건문에 <code>not</code>을 씌워 가독성을 해치는 것으로 보일 수 있습니다. 하지만 실제로 중첩 조건문에서 적용하여 중첩 조건문을 평탄화 하여 코드의 깊이를 줄이는 것을 보여드리겠습니다.</p><p>AD_HERE</p><h2 id="중첩-조건문에-적용"><a href="#중첩-조건문에-적용" class="headerlink" title="중첩 조건문에 적용"></a>중첩 조건문에 적용</h2><p>예시로 아래와 같이 <code>token</code>을 인증하는 가상의 코드가 있다고 했을 때, <code>user</code>가 존재 하는지 확인하고 해당 <code>token</code>을 가져와 존재하는지 확인한 후, <code>token</code>의 <code>purpose</code>가 <code>reset</code>인지를 확인해서 이경우 <code>true</code>를 반환합니다.</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">async</span> <span class="title function_">verifyToken</span>(<span class="params"><span class="attr">email</span>: <span class="built_in">string</span>, <span class="attr">token</span>: <span class="built_in">string</span>, <span class="attr">purpose</span>: <span class="built_in">string</span></span>) {</span><br><span class="line"> <span class="keyword">const</span> user = <span class="keyword">await</span> <span class="title class_">UserService</span>.<span class="title function_">getUserByEmail</span>(email);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span>(user) {</span><br><span class="line"> <span class="keyword">const</span> token = <span class="keyword">await</span> user.<span class="title function_">getToken</span>({...});</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> (token) {</span><br><span class="line"> <span class="keyword">if</span>(token.<span class="property">purpose</span> === <span class="string">'reset'</span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>이런 간단한 코드의 경우에도 이미 중첩 조건문이 3번 중첩됩니다. 코드가 더 복잡해지면 쉽게 코드의 <code>depth</code>가 깊어져 가독성을 해치고 코드를 이해하는데 어려움을 겪게 됩니다. 이 코드에서는 <code>if(user)</code>, <code>if(token)</code> 그리고 <code>if(token.purpose === 'reset')</code>가 <code>Guard</code>가 됩니다.</p><p>AD_HERE</p><h3 id="Guard-Clause-적용"><a href="#Guard-Clause-적용" class="headerlink" title="Guard Clause 적용"></a>Guard Clause 적용</h3><p>앞서 말한대로 코드를 <code>refactor</code>해보도록 하겠습니다. <code>Guard</code>조건들을 <code>Not Guard</code>로 바꾸고 <code>early return</code>해줍니다.</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">async</span> <span class="title function_">verifyToken</span>(<span class="params"><span class="attr">email</span>: <span class="built_in">string</span>, <span class="attr">token</span>: <span class="built_in">string</span>, <span class="attr">purpose</span>: <span class="built_in">string</span></span>) {</span><br><span class="line"> <span class="keyword">const</span> user = <span class="keyword">await</span> <span class="title class_">UserService</span>.<span class="title function_">getUserByEmail</span>(email);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 아래의 조건문 이후로, user가 존재한다는 것이 보장됩니다.</span></span><br><span class="line"> <span class="keyword">if</span>(!user) {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">const</span> token = <span class="keyword">await</span> user.<span class="title function_">getToken</span>({...}); </span><br><span class="line"> <span class="keyword">if</span> (!token || token.<span class="property">purpose</span> !== <span class="string">'reset'</span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 여기까지 온 경우, true가 반환되기 위한 조건을 모두 갖췄다고 볼 수 있습니다.</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><code>Guard Clause</code>를 토대로 <code>refactor</code>를 마친 코드를 보면 중첩된 조건문이 사라진건 알 수 있습니다. 이렇게 복잡한 조건문을 쉽고 가독성 높은 코드로 풀어낼 수 있는 <code>Guard Clause</code>에 대해 알아 봤습니다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2021/06/16/%EC%A4%91%EC%B2%A9-%EC%A1%B0%EA%B1%B4%EB%AC%B8%EC%9D%84-Guard-Clause%EB%A1%9C-%EA%B0%80%EB%8F%85%EC%84%B1-%EB%86%92%EC%9D%80-%EC%BD%94%EB%93%9C%EB%A5%BC-%EC%9E%91%EC%84%B1%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95/#disqus_thread</comments>
</item>
<item>
<title>C++ 플로이드 알고리즘 구현과 플로이드 와샬 경로 추적 방법</title>
<link>http://techbless.github.io/2020/11/11/C-%ED%94%8C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B5%AC%ED%98%84%EA%B3%BC-%ED%94%8C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%99%80%EC%83%AC-%EA%B2%BD%EB%A1%9C-%EC%B6%9C%EB%A0%A5-%EB%B0%A9%EB%B2%95/</link>
<guid>http://techbless.github.io/2020/11/11/C-%ED%94%8C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B5%AC%ED%98%84%EA%B3%BC-%ED%94%8C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%99%80%EC%83%AC-%EA%B2%BD%EB%A1%9C-%EC%B6%9C%EB%A0%A5-%EB%B0%A9%EB%B2%95/</guid>
<pubDate>Wed, 11 Nov 2020 01:27:14 GMT</pubDate>
<description>
<h1 id="플로이드-와샬-알고리즘"><a href="#플로이드-와샬-알고리즘" class="headerlink" title="플로이드 와샬 알고리즘"></a>플로이드 와샬 알고리즘</h1><p>플로이드 와샬 알고리즘에 대한 개념은 쉽게 많은 정보를
</description>
<content:encoded><![CDATA[<h1 id="플로이드-와샬-알고리즘"><a href="#플로이드-와샬-알고리즘" class="headerlink" title="플로이드 와샬 알고리즘"></a>플로이드 와샬 알고리즘</h1><p>플로이드 와샬 알고리즘에 대한 개념은 쉽게 많은 정보를 찾을 수 있으니 구현과 최단 거리가 아닌 최단 경로를 구하는 방법에 대해 알아보겠습니다.</p><h2 id="플로이드-와샬-요약"><a href="#플로이드-와샬-요약" class="headerlink" title="플로이드 와샬 요약"></a>플로이드 와샬 요약</h2><p>하나의 정점에서 다른 모든 정점까지의 거리를 구하는 다익스트라 알고리즘과 달리 플로이드-워셜(Floyd Warshall) 알고리즘은 그래프 내의 모든 정점에서 모든 각 정점까지의 최단 거리를 구하는 알고리즘 입니다. 반복문 3개로 비교적 쉽게 구할 수 있으며 O(n^3)의 시간 복잡도를 갖습니다. </p><ol><li>k : 경유 정점</li><li>i : 출발 정점</li><li>j : 도착 정점</li></ol><p>의 순서로 반복문 3개로 아래와 같이 i에서 출발해 정점 k를 경유하여 j 까지 가는 경우가 더 가깝다면 A를 더 가까운 정점으로 업데이트 합니다. 즉, 간단히 말해 아래와 같이 기존의 <code>A[i][j]</code> 와 <code>A[i][k] + A[k][j]</code> 중 더 작은 값이 <code>A[i][j]</code>의 값이 됩니다.</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">A[i][j] = <span class="built_in">min</span>(A[i][k] + A[k][j], A[i][j])</span><br></pre></td></tr></table></figure><p>AD_HERE</p><h2 id="최단경로-추적-구현"><a href="#최단경로-추적-구현" class="headerlink" title="최단경로 추적 구현"></a>최단경로 추적 구현</h2><p>플로이드 와샬 알고리즘을 이용하면 최단 거리는 <code>A</code>배열에 저장되어 있어 <code>A[i][j]</code>의 형태로 정점 i부터 j까지의 최단 경로를 쉽게 구할 수 있습니다. </p><p>하지만 최단 거리가 아니라 최단 경로를 구하려면 경로를 따로 기록해두어야 합니다. 아래의 <code>C++</code>로 구현한 코드를 보면 최단 경로가 업데이트 될 때 마다 <code>next</code> 배열을 업데이트 하는 것을 볼 수 있습니다. <code>next</code> 배열은 현재 정점 i에서 도착 정점 j까지 가기위한 정점 i다음에 방문할 정점을 의미합니다. 따라서 <code>next</code> 배열에 <code>A</code>배열의 값이 업데이트 될때마다 기록을 해두어야 합니다.</p><p>예를 들어, <code>next[5][3]</code>은 정점 5에서 정점 3까지 가기 위해 정점 5 다음에 방문해야할 정점의 정점 번호를 의미합니다.</p><p>따라서 출발지에서 도착지까지 재귀함수를 이용해 출력하면 쉽게 최단 경로를 구할 수 있습니다. 경로 출력에 관한 함수는 <code>trace_path()</code>와 <code>print_path()</code>입니다.</p><p>쉽게 이해할 수 있도록 최대한 주석을 달아 두었으니 주석을 참고해주세요.</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><bits/stdc++.h></span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> pii = pair<<span class="type">int</span>, <span class="type">int</span>>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Graph</span> {</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="type">int</span> n;</span><br><span class="line"> <span class="comment">// 인접 정점</span></span><br><span class="line"> <span class="comment">// first: 정점, second: 가중치</span></span><br><span class="line"> vector<pii>* adj;</span><br><span class="line"></span><br><span class="line"> <span class="built_in">Graph</span>(<span class="type">int</span> n) {</span><br><span class="line"> <span class="keyword">this</span>->n = n;</span><br><span class="line"> adj = <span class="keyword">new</span> vector<pii>[n];</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 간선 추가</span></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">insertEdge</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> v, <span class="type">int</span> w)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>->adj[u].<span class="built_in">push_back</span>(<span class="built_in">make_pair</span>(v, w));</span><br><span class="line"> <span class="keyword">this</span>->adj[v].<span class="built_in">push_back</span>(<span class="built_in">make_pair</span>(u, w));</span><br><span class="line"> }</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">// Floyd</span></span><br><span class="line">vector<vector<<span class="type">int</span>>>* <span class="built_in">floyd</span>(Graph* g) {</span><br><span class="line"> vector<vector<<span class="type">int</span>>> <span class="built_in">A</span>(g->n, <span class="built_in">vector</span><<span class="type">int</span>>(g->n, INT_MAX));</span><br><span class="line"></span><br><span class="line"> <span class="comment">// next[i][j] : 정점 j까지 가기위한 정점 i다음에 방문할 정점</span></span><br><span class="line"> vector<vector<<span class="type">int</span>>>* next = <span class="keyword">new</span> vector<vector<<span class="type">int</span>>>(g->n, <span class="built_in">vector</span><<span class="type">int</span>>(g->n));</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 주어진 그래프의 초기 A와 next 행렬의 값 업데이트</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < g->n; i++) {</span><br><span class="line"> A[i][i] = <span class="number">0</span>; <span class="comment">// 자신까지의 최단경로 = 0</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> (pii a : g->adj[i]) {</span><br><span class="line"> A[i][a.first] = a.second;</span><br><span class="line"> (*next)[i][a.first] = a.first;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// i: 출발 노드, j: 도착 노드, k: 경유 노드</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> k = <span class="number">0</span>; k < g->n; k++) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < g->n; i++) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j < g->n; j++) {</span><br><span class="line"> <span class="comment">// (i -> k) 나 (k -> j) 까지 도달할 수 없는 경우</span></span><br><span class="line"> <span class="keyword">if</span> (A[i][k] == INT_MAX || A[k][j] == INT_MAX) {</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// k정점을 거쳐가는 경로가 더 가깝다면 업데이트</span></span><br><span class="line"> <span class="keyword">if</span> (A[i][k] + A[k][j] < A[i][j]) {</span><br><span class="line"> A[i][j] = A[i][k] + A[k][j];</span><br><span class="line"></span><br><span class="line"> <span class="comment">// A가 업데이트 될때 next도 업데이트</span></span><br><span class="line"> (*next)[i][j] = (*next)[i][k];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> next;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 정점 u에서 v까지 갈때 다음번에 방문해야할 정점을 출력 </span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">trace_path</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> v, vector<vector<<span class="type">int</span>>>* next)</span> </span>{</span><br><span class="line"> <span class="comment">// 출발지와 도착지가 같다면 멈춘다. </span></span><br><span class="line"> <span class="keyword">if</span> (u != v) {</span><br><span class="line"> <span class="comment">// 정점 u 이후에 방문해야할 정점으로 u업데이트 후, </span></span><br><span class="line"> u = (*next)[u][v];</span><br><span class="line"> cout << <span class="string">" -> "</span> << u;</span><br><span class="line"> <span class="comment">// 재귀를 통해 반복 </span></span><br><span class="line"> <span class="built_in">trace_path</span>(u, v, next);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 시작정점도 출력해주기 위해 따로 분리 </span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">print_path</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> v, vector<vector<<span class="type">int</span>>>* next)</span> </span>{</span><br><span class="line"> cout << u;</span><br><span class="line"> <span class="built_in">trace_path</span>(u, v, next); <span class="comment">//위의 함수를 이용해 경로 출력 </span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">(<span class="type">void</span>)</span> </span>{</span><br><span class="line"> Graph* g = <span class="keyword">new</span> <span class="built_in">Graph</span>(<span class="number">7</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">0</span>, <span class="number">1</span>, <span class="number">7</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">1</span>, <span class="number">0</span>, <span class="number">7</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">0</span>, <span class="number">4</span>, <span class="number">3</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">4</span>, <span class="number">0</span>, <span class="number">3</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">0</span>, <span class="number">5</span>, <span class="number">10</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">5</span>, <span class="number">0</span>, <span class="number">10</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">1</span>, <span class="number">4</span>, <span class="number">2</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">4</span>, <span class="number">1</span>, <span class="number">2</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">1</span>, <span class="number">5</span>, <span class="number">6</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">5</span>, <span class="number">1</span>, <span class="number">6</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">1</span>, <span class="number">2</span>, <span class="number">4</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">2</span>, <span class="number">1</span>, <span class="number">4</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">1</span>, <span class="number">3</span>, <span class="number">10</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">3</span>, <span class="number">1</span>, <span class="number">10</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">3</span>, <span class="number">2</span>, <span class="number">2</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">4</span>, <span class="number">3</span>, <span class="number">11</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">3</span>, <span class="number">4</span>, <span class="number">11</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">4</span>, <span class="number">6</span>, <span class="number">5</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">6</span>, <span class="number">4</span>, <span class="number">5</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">6</span>, <span class="number">3</span>, <span class="number">4</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">3</span>, <span class="number">6</span>, <span class="number">4</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">3</span>, <span class="number">5</span>, <span class="number">9</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">5</span>, <span class="number">3</span>, <span class="number">9</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 최단 경로를 구한다.</span></span><br><span class="line"> <span class="keyword">auto</span> next = <span class="built_in">floyd</span>(g);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 모든 정점부터 각 정점까지의 경로 출력</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < g->n; i++) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j < g->n; j++) {</span><br><span class="line"> cout << <span class="string">"["</span><< i << <span class="string">" -> "</span> << j << <span class="string">"] : "</span>;</span><br><span class="line"> <span class="built_in">print_path</span>(i, j, next);</span><br><span class="line"> cout << <span class="string">"\n"</span>;</span><br><span class="line"> }</span><br><span class="line"> cout << <span class="string">"\n"</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="실행-결과"><a href="#실행-결과" class="headerlink" title="실행 결과"></a>실행 결과</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line">[0 -> 0] : 0</span><br><span class="line">[0 -> 1] : 0 -> 4 -> 1</span><br><span class="line">[0 -> 2] : 0 -> 4 -> 1 -> 2</span><br><span class="line">[0 -> 3] : 0 -> 4 -> 1 -> 2 -> 3</span><br><span class="line">[0 -> 4] : 0 -> 4</span><br><span class="line">[0 -> 5] : 0 -> 5</span><br><span class="line">[0 -> 6] : 0 -> 4 -> 6</span><br><span class="line"></span><br><span class="line">[1 -> 0] : 1 -> 4 -> 0</span><br><span class="line">[1 -> 1] : 1</span><br><span class="line">[1 -> 2] : 1 -> 2</span><br><span class="line">[1 -> 3] : 1 -> 2 -> 3</span><br><span class="line">[1 -> 4] : 1 -> 4</span><br><span class="line">[1 -> 5] : 1 -> 5</span><br><span class="line">[1 -> 6] : 1 -> 4 -> 6</span><br><span class="line"></span><br><span class="line">[2 -> 0] : 2 -> 1 -> 4 -> 0</span><br><span class="line">[2 -> 1] : 2 -> 1</span><br><span class="line">[2 -> 2] : 2</span><br><span class="line">[2 -> 3] : 2 -> 3</span><br><span class="line">[2 -> 4] : 2 -> 1 -> 4</span><br><span class="line">[2 -> 5] : 2 -> 1 -> 5</span><br><span class="line">[2 -> 6] : 2 -> 3 -> 6</span><br><span class="line"></span><br><span class="line">[3 -> 0] : 3 -> 2 -> 1 -> 4 -> 0</span><br><span class="line">[3 -> 1] : 3 -> 2 -> 1</span><br><span class="line">[3 -> 2] : 3 -> 2</span><br><span class="line">[3 -> 3] : 3</span><br><span class="line">[3 -> 4] : 3 -> 2 -> 1 -> 4</span><br><span class="line">[3 -> 5] : 3 -> 5</span><br><span class="line">[3 -> 6] : 3 -> 6</span><br><span class="line"></span><br><span class="line">[4 -> 0] : 4 -> 0</span><br><span class="line">[4 -> 1] : 4 -> 1</span><br><span class="line">[4 -> 2] : 4 -> 1 -> 2</span><br><span class="line">[4 -> 3] : 4 -> 1 -> 2 -> 3</span><br><span class="line">[4 -> 4] : 4</span><br><span class="line">[4 -> 5] : 4 -> 1 -> 5</span><br><span class="line">[4 -> 6] : 4 -> 6</span><br><span class="line"></span><br><span class="line">[5 -> 0] : 5 -> 0</span><br><span class="line">[5 -> 1] : 5 -> 1</span><br><span class="line">[5 -> 2] : 5 -> 1 -> 2</span><br><span class="line">[5 -> 3] : 5 -> 3</span><br><span class="line">[5 -> 4] : 5 -> 1 -> 4</span><br><span class="line">[5 -> 5] : 5</span><br><span class="line">[5 -> 6] : 5 -> 3 -> 6</span><br><span class="line"></span><br><span class="line">[6 -> 0] : 6 -> 4 -> 0</span><br><span class="line">[6 -> 1] : 6 -> 4 -> 1</span><br><span class="line">[6 -> 2] : 6 -> 3 -> 2</span><br><span class="line">[6 -> 3] : 6 -> 3</span><br><span class="line">[6 -> 4] : 6 -> 4</span><br><span class="line">[6 -> 5] : 6 -> 3 -> 5</span><br><span class="line">[6 -> 6] : 6</span><br></pre></td></tr></table></figure>]]></content:encoded>
<comments>http://techbless.github.io/2020/11/11/C-%ED%94%8C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B5%AC%ED%98%84%EA%B3%BC-%ED%94%8C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%99%80%EC%83%AC-%EA%B2%BD%EB%A1%9C-%EC%B6%9C%EB%A0%A5-%EB%B0%A9%EB%B2%95/#disqus_thread</comments>
</item>
<item>
<title>비주얼 스튜디오(Visual Studio)에서 동적할당한 배열 디버깅 하는 방법 (다차원 배열 포함)</title>
<link>http://techbless.github.io/2020/11/07/%EB%B9%84%EC%A3%BC%EC%96%BC-%EC%8A%A4%ED%8A%9C%EB%94%94%EC%98%A4-Visual-Studio-%EC%97%90%EC%84%9C-%EB%8F%99%EC%A0%81%ED%95%A0%EB%8B%B9%ED%95%9C-%EB%B0%B0%EC%97%B4-%EB%94%94%EB%B2%84%EA%B9%85-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EB%8B%A4%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-%ED%8F%AC%ED%95%A8/</link>
<guid>http://techbless.github.io/2020/11/07/%EB%B9%84%EC%A3%BC%EC%96%BC-%EC%8A%A4%ED%8A%9C%EB%94%94%EC%98%A4-Visual-Studio-%EC%97%90%EC%84%9C-%EB%8F%99%EC%A0%81%ED%95%A0%EB%8B%B9%ED%95%9C-%EB%B0%B0%EC%97%B4-%EB%94%94%EB%B2%84%EA%B9%85-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EB%8B%A4%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-%ED%8F%AC%ED%95%A8/</guid>
<pubDate>Sat, 07 Nov 2020 09:43:45 GMT</pubDate>
<description>
<h1 id="동적할당-배열-디버그"><a href="#동적할당-배열-디버그" class="headerlink" title="동적할당 배열 디버그"></a>동적할당 배열 디버그</h1><p>비주얼스튜디오에서 아래의 코드와 같이 동적할당한 배열은 디버깅
</description>
<content:encoded><![CDATA[<h1 id="동적할당-배열-디버그"><a href="#동적할당-배열-디버그" class="headerlink" title="동적할당 배열 디버그"></a>동적할당 배열 디버그</h1><p>비주얼스튜디오에서 아래의 코드와 같이 동적할당한 배열은 디버깅을 하기에는 애로사항이 많습니다. <code>a</code> 배열은 사실상 포인터 변수로 비주얼 스튜디오는 우리가 의도한대로 배열인지, 배열이라면 배열의 크기는 몇인지 알지 못합니다. 따라서 디버깅시에 메모리 창을 보면 <code>a</code> 포인터가 가리키고 있는 데이터를 출력합니다.</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">(<span class="type">void</span>)</span> </span>{</span><br><span class="line"> <span class="type">int</span>* a = <span class="keyword">new</span> <span class="type">int</span>[<span class="number">10</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < <span class="number">10</span>; i++) {</span><br><span class="line"> a[i] = i;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><img src="/img/%EB%B9%84%EC%A3%BC%EC%96%BC-%EC%8A%A4%ED%8A%9C%EB%94%94%EC%98%A4-Visual-Studio-%EC%97%90%EC%84%9C-%EB%8F%99%EC%A0%81%ED%95%A0%EB%8B%B9%ED%95%9C-%EB%B0%B0%EC%97%B4-%EB%94%94%EB%B2%84%EA%B9%85-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EB%8B%A4%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-%ED%8F%AC%ED%95%A8/debug1.png" alt="디버깅 화면 1"></p><p>하지만 우리는 <code>a</code>포인터가 배열이기를 의도하였으니, 디버깅시에도 배열의 상태이 궁금할 것입니다. 그렇다면, 동적할당한 배열의 메모리 상태를 알고자 한다면 어떻게 해야하는지 알아보겠습니다. </p><p>이를 가능하게 하기 위해선 단순히 <code>Visual Studio</code> 디버거에게 <code>a</code> 포인터가 해당하는 배열의 범위를 알려주면 됩니다. <code>a</code> 배열에서 배열의 크기는 10임으로 메모리 조사식에 <code>a, 10</code>을 입력하게 되면 <code>a</code>의 주소를 시작으로 10칸의 메모리 상태를 보여줍니다.</p><p><img src="/img/%EB%B9%84%EC%A3%BC%EC%96%BC-%EC%8A%A4%ED%8A%9C%EB%94%94%EC%98%A4-Visual-Studio-%EC%97%90%EC%84%9C-%EB%8F%99%EC%A0%81%ED%95%A0%EB%8B%B9%ED%95%9C-%EB%B0%B0%EC%97%B4-%EB%94%94%EB%B2%84%EA%B9%85-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EB%8B%A4%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-%ED%8F%AC%ED%95%A8/debug2.png" alt="디버깅 화면 2"></p><p>AD_HERE</p><h2 id="2차원-배열의-경우"><a href="#2차원-배열의-경우" class="headerlink" title="2차원 배열의 경우"></a>2차원 배열의 경우</h2><p>코드를 먼저 살펴보겠습니다. 10x10 형태의 2차원 배열을 만든후, 0 ~ 99까지의 값을 대입합니다. 동적할당한 2차원배열도 마찬가지입니다.</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">(<span class="type">void</span>)</span> </span>{</span><br><span class="line"> <span class="type">int</span>** a = <span class="keyword">new</span> <span class="type">int</span>*[<span class="number">10</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < <span class="number">10</span>; i++) {</span><br><span class="line"> a[i] = <span class="keyword">new</span> <span class="type">int</span>[<span class="number">10</span>];</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="type">int</span> v = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < <span class="number">10</span>; i++) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j < <span class="number">10</span>; j++) {</span><br><span class="line"> a[i][j] = v++;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>이러한 경우라면 아래와 같이 각 인덱스마다 범위를 지정해주면 됩니다.</p><p><img src="/img/%EB%B9%84%EC%A3%BC%EC%96%BC-%EC%8A%A4%ED%8A%9C%EB%94%94%EC%98%A4-Visual-Studio-%EC%97%90%EC%84%9C-%EB%8F%99%EC%A0%81%ED%95%A0%EB%8B%B9%ED%95%9C-%EB%B0%B0%EC%97%B4-%EB%94%94%EB%B2%84%EA%B9%85-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EB%8B%A4%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-%ED%8F%AC%ED%95%A8/debug3.png" alt="디버깅 화면 3"></p>]]></content:encoded>
<comments>http://techbless.github.io/2020/11/07/%EB%B9%84%EC%A3%BC%EC%96%BC-%EC%8A%A4%ED%8A%9C%EB%94%94%EC%98%A4-Visual-Studio-%EC%97%90%EC%84%9C-%EB%8F%99%EC%A0%81%ED%95%A0%EB%8B%B9%ED%95%9C-%EB%B0%B0%EC%97%B4-%EB%94%94%EB%B2%84%EA%B9%85-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EB%8B%A4%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-%ED%8F%AC%ED%95%A8/#disqus_thread</comments>
</item>
<item>
<title>C++ 다익스트라 알고리즘 구현과 다익스트라 경로 추적 방법</title>
<link>http://techbless.github.io/2020/11/05/C-%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B5%AC%ED%98%84%EA%B3%BC-%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EA%B2%BD%EB%A1%9C-%EC%B6%9C%EB%A0%A5-%EB%B0%A9%EB%B2%95/</link>
<guid>http://techbless.github.io/2020/11/05/C-%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B5%AC%ED%98%84%EA%B3%BC-%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EA%B2%BD%EB%A1%9C-%EC%B6%9C%EB%A0%A5-%EB%B0%A9%EB%B2%95/</guid>
<pubDate>Thu, 05 Nov 2020 23:49:47 GMT</pubDate>
<description>
<h1 id="다익스트라-알고리즘"><a href="#다익스트라-알고리즘" class="headerlink" title="다익스트라 알고리즘"></a>다익스트라 알고리즘</h1><p>다익스트라 알고리즘에 대한 개념은 쉽게 많은 정보를 찾을 수 있으니
</description>
<content:encoded><![CDATA[<h1 id="다익스트라-알고리즘"><a href="#다익스트라-알고리즘" class="headerlink" title="다익스트라 알고리즘"></a>다익스트라 알고리즘</h1><p>다익스트라 알고리즘에 대한 개념은 쉽게 많은 정보를 찾을 수 있으니 구현과 최단 거리가 아닌 최단 경로를 구하는 방법에 대해 알아보겠습니다.</p><h2 id="다익스트라-요약"><a href="#다익스트라-요약" class="headerlink" title="다익스트라 요약"></a>다익스트라 요약</h2><p>최단경로를 발견한 정점의 집합을 <code>S</code>라고 할때 다익스트라 알고리즘의 매 단계에서 집합 <code>S</code>에 있지 않은 정점중 가장 <code>distance</code>값이 가장 적은, 즉 가장 가까운 정점을 집합 <code>S</code>에 추가하고 그 다음, 다른 정점들의 <code>distance</code>값을 업데이트 합니다. 새로 가장 까운 정점으로 정점 u가 뽑혔다면 정점 <code>u</code>를 거쳐 다른 정점까지 가는 거리와 기존에 해당 정점까지의 거리를 비교해 거리가 더 가까운 값을 기준으로 업데이트 합니다.</p><p>아래의 식을 보면 더 쉽게 이해할 수 있습니다. 아래의 식은 위에서 설명한 것을 식으로 나타낸 것입니다.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">distance[w] = min(distance[w], distance[u] + weight[u][w])</span><br></pre></td></tr></table></figure><p>AD_HERE</p><h2 id="최단경로-추적-구현"><a href="#최단경로-추적-구현" class="headerlink" title="최단경로 추적 구현"></a>최단경로 추적 구현</h2><p>다익스트라 알고리즘을 이용하면 최단 거리는 <code>distance</code> 배열에 저장되어 있어 쉽게 구할 수 있습니다. 하지만 거리가 아니라 최단 경로를 구하려 한다면, 시작 정점에서부터 해당 정점까지 지나온 경로를 기록해두어야 합니다. </p><p>아래의 <code>C++</code>로 구현한 코드를 보면 최단 경로가 업데이트 될 때마다 <code>from</code> 배열을 업데이트 하는 것을 볼 수 있습니다. <code>from</code> 배열은 해당 정점까지의 최단 거리가 업데이트 될때 해당 정점까지 의 거리를 업데이트시킨 바로 이전에 방문하게 되는 정점을 의미합니다. 예를 들어, <code>from[5]</code>는 정점 5까지의 최단 경로에서 정점 5 바로 이전에 방문하는 정점을 의미합니다. </p><p> 따라서 도착지에서 출발지까지 역순으로 재귀함수를 이용해 출력하면 쉽게 최단 경로를 구할 수 있습니다. 경로 출력에 관한 함수는 <code>trace_path()</code>와 <code>print_path()</code>입니다.</p><p>쉽게 이해할 수 있도록 최대한 주석을 달아 두었으니 주석을 참고해주세요.</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><bits/stdc++.h></span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> pii = pair<<span class="type">int</span>, <span class="type">int</span>>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Graph</span> {</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="type">int</span> n;</span><br><span class="line"> <span class="comment">// 인접 정점</span></span><br><span class="line"> <span class="comment">// first: 정점, second: 가중치</span></span><br><span class="line"> vector<pii>* adj;</span><br><span class="line"></span><br><span class="line"> <span class="built_in">Graph</span>(<span class="type">int</span> n) {</span><br><span class="line"> <span class="keyword">this</span>->n = n;</span><br><span class="line"> adj = <span class="keyword">new</span> vector<pii>[n];</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 간선 추가</span></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">insertEdge</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> v, <span class="type">int</span> w)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>->adj[u].<span class="built_in">push_back</span>(<span class="built_in">make_pair</span>(v, w));</span><br><span class="line"> <span class="keyword">this</span>->adj[v].<span class="built_in">push_back</span>(<span class="built_in">make_pair</span>(u, w));</span><br><span class="line"> }</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Compare</span> {</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="comment">// 우선순위 큐를 위한 비교 함수</span></span><br><span class="line"> <span class="function"><span class="type">bool</span> <span class="title">operator</span><span class="params">()</span> <span class="params">(pii a, pii b)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> a.second > b.second;</span><br><span class="line"> }</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="function">vector<<span class="type">int</span>>* <span class="title">dijkstra</span><span class="params">(Graph* g, <span class="type">int</span> start)</span> </span>{</span><br><span class="line"> <span class="comment">// 최단 거리가 발견되면 true</span></span><br><span class="line"> <span class="function">vector<<span class="type">bool</span>> <span class="title">found</span><span class="params">(g->n, <span class="literal">false</span>)</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 해당 정점까지의 거리 (default : 무한)</span></span><br><span class="line"> <span class="function">vector<<span class="type">int</span>> <span class="title">distance</span><span class="params">(g->n, INT_MAX)</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 최단거리가 업데이트 될때 바로 이전에 방문하게 되는 정점 </span></span><br><span class="line"> vector<<span class="type">int</span>>* from = <span class="keyword">new</span> <span class="built_in">vector</span><<span class="type">int</span>>(g->n);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 가장 가까운 정점을 찾기 위한 우선순위 큐</span></span><br><span class="line"> <span class="comment">// first: 정점 번호, second: 정점까지의 거리</span></span><br><span class="line"> priority_queue<pii, vector<pii>, Compare> pq;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 출발지의 최단거리 발견</span></span><br><span class="line"> found[start] = <span class="literal">true</span>;</span><br><span class="line"> <span class="comment">// 출발지까지 거리 0</span></span><br><span class="line"> distance[start] = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 우선순위 큐에 넣는다.</span></span><br><span class="line"> pq.<span class="built_in">push</span>(<span class="built_in">make_pair</span>(start, <span class="number">0</span>));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//for (int i = 0; i < g->n; i++) {</span></span><br><span class="line"> <span class="keyword">while</span>(!pq.<span class="built_in">empty</span>()) {</span><br><span class="line"> <span class="comment">// 가장 가까운 정점을 우선순위 큐에서 꺼낸다.</span></span><br><span class="line"> <span class="type">int</span> u = pq.<span class="built_in">top</span>().first;</span><br><span class="line"> pq.<span class="built_in">pop</span>();</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 최단거리 발견</span></span><br><span class="line"> found[u] = <span class="literal">true</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j < g->adj[u].<span class="built_in">size</span>(); j++) {</span><br><span class="line"> <span class="comment">// 정점 u의 인접정점의 최단거리 업데이트</span></span><br><span class="line"> pii v = g->adj[u][j];</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (!found[v.first]) {</span><br><span class="line"> <span class="keyword">if</span> (distance[u] + v.second < distance[v.first]) {</span><br><span class="line"> distance[v.first] = distance[u] + v.second;</span><br><span class="line"> (*from)[v.first] = u;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 우선순위 큐에 추가</span></span><br><span class="line"> pq.<span class="built_in">push</span>(<span class="built_in">make_pair</span>(v.first, distance[v.first]));</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> from;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// from[n]에서 목적지까지의 정점을 재귀적으로 출력한다. </span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">trace_path</span><span class="params">(<span class="type">int</span> s, <span class="type">int</span> e, vector<<span class="type">int</span>>* from)</span> </span>{</span><br><span class="line"> <span class="comment">// 기저 조건 : 시작점과 목적지가 같은 경우 </span></span><br><span class="line"> <span class="keyword">if</span> ((*from)[e] == s) {</span><br><span class="line"> cout << s << <span class="string">" -> "</span>;</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 재귀호출을 통해 정점 e전의 정점에 대한 경로를 출력한다.. </span></span><br><span class="line"> <span class="built_in">trace_path</span>(s, (*from)[e], from);</span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 최단경로에서 정점 e 바로 이전의 정점를 화면에 출력한다. </span></span><br><span class="line"> cout << (*from)[e] << <span class="string">" - > "</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 마지막 목적지를 간편하게 화면의 출력하기 위해 함수 분리 </span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">print_path</span><span class="params">(<span class="type">int</span> s, <span class="type">int</span> e, vector<<span class="type">int</span>>* from)</span> </span>{</span><br><span class="line"> <span class="comment">// 위의 trace_path를 호출하여 최단 경로를 출력한후, </span></span><br><span class="line"> <span class="built_in">trace_path</span>(s, e, from);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 목적지의 정점 번호도 출력한다. </span></span><br><span class="line"> cout << e;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">(<span class="type">void</span>)</span> </span>{</span><br><span class="line"> Graph* g = <span class="keyword">new</span> <span class="built_in">Graph</span>(<span class="number">7</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">0</span>, <span class="number">1</span>, <span class="number">7</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">1</span>, <span class="number">0</span>, <span class="number">7</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">0</span>, <span class="number">4</span>, <span class="number">3</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">4</span>, <span class="number">0</span>, <span class="number">3</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">0</span>, <span class="number">5</span>, <span class="number">10</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">5</span>, <span class="number">0</span>, <span class="number">10</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">1</span>, <span class="number">4</span>, <span class="number">2</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">4</span>, <span class="number">1</span>, <span class="number">2</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">1</span>, <span class="number">5</span>, <span class="number">6</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">5</span>, <span class="number">1</span>, <span class="number">6</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">1</span>, <span class="number">2</span>, <span class="number">4</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">2</span>, <span class="number">1</span>, <span class="number">4</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">1</span>, <span class="number">3</span>, <span class="number">10</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">3</span>, <span class="number">1</span>, <span class="number">10</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">3</span>, <span class="number">2</span>, <span class="number">2</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">4</span>, <span class="number">3</span>, <span class="number">11</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">3</span>, <span class="number">4</span>, <span class="number">11</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">4</span>, <span class="number">6</span>, <span class="number">5</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">6</span>, <span class="number">4</span>, <span class="number">5</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">6</span>, <span class="number">3</span>, <span class="number">4</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">3</span>, <span class="number">6</span>, <span class="number">4</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">3</span>, <span class="number">5</span>, <span class="number">9</span>);</span><br><span class="line"> g-><span class="built_in">insertEdge</span>(<span class="number">5</span>, <span class="number">3</span>, <span class="number">9</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">// 최단 경로를 구한다.</span></span><br><span class="line"> <span class="keyword">auto</span> from = <span class="built_in">dijkstra</span>(g, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 0부터 각 정점까지의 경로 출력</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < g->n; i++) {</span><br><span class="line"> cout << <span class="string">"0 -> "</span> << i << <span class="string">" : "</span>;</span><br><span class="line"> <span class="built_in">print_path</span>(<span class="number">0</span>, i, from);</span><br><span class="line"> cout << <span class="string">"\n"</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="실행-결과"><a href="#실행-결과" class="headerlink" title="실행 결과"></a>실행 결과</h3><p><img src="/img/C-%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B5%AC%ED%98%84%EA%B3%BC-%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EA%B2%BD%EB%A1%9C-%EC%B6%9C%EB%A0%A5-%EB%B0%A9%EB%B2%95/result.png" alt="다익스트라 최단 경로"></p>]]></content:encoded>
<comments>http://techbless.github.io/2020/11/05/C-%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B5%AC%ED%98%84%EA%B3%BC-%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EA%B2%BD%EB%A1%9C-%EC%B6%9C%EB%A0%A5-%EB%B0%A9%EB%B2%95/#disqus_thread</comments>
</item>
<item>
<title>[C++] STL 컨테이너 요약 정리</title>
<link>http://techbless.github.io/2020/11/04/C-STL-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%9A%94%EC%95%BD-%EC%A0%95%EB%A6%AC/</link>
<guid>http://techbless.github.io/2020/11/04/C-STL-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%9A%94%EC%95%BD-%EC%A0%95%EB%A6%AC/</guid>
<pubDate>Wed, 04 Nov 2020 00:57:41 GMT</pubDate>
<description>
<h1 id="STL-컨테이너"><a href="#STL-컨테이너" class="headerlink" title="STL 컨테이너"></a>STL 컨테이너</h1><p>STL은 <code>Standard Template Library</code>의 약
</description>
<content:encoded><![CDATA[<h1 id="STL-컨테이너"><a href="#STL-컨테이너" class="headerlink" title="STL 컨테이너"></a>STL 컨테이너</h1><p>STL은 <code>Standard Template Library</code>의 약자로 <code>C++</code> 에서 자료구조와 알고리즘의 <code>Generic Programming</code> (일반화 프로그래밍) 개념을 구현하기 위해 개발 된 <code>C++</code> 라이브러리입니다. 이러한 <code>STL</code> 라이브러리의 종류와 컨데이너의 특성 및 사용법등을 정리해두려 합니다.</p><p> </p><h2 id="구성요소"><a href="#구성요소" class="headerlink" title="구성요소"></a>구성요소</h2><ul><li>반복자 : STL 컨테이너의 원소들을 가리키는 포인터</li><li>컨테이너: 데이터를 저장 및 관리를하는 클래스</li><li>알고리즘 : STL에서 제공하는 함수</li></ul><p> </p><h2 id="STL-컨테이너-종류"><a href="#STL-컨테이너-종류" class="headerlink" title="STL 컨테이너 종류"></a>STL 컨테이너 종류</h2><ol><li>시퀀스 컨테이너<ol><li>데이터를 선형적으로 저장합니다.</li><li>vector, list, dequeue …</li></ol></li><li>연관 컨테이너<ol><li>일정 규칙에 따라 조직화된 컨테이너입니다.</li><li>set, multiset, map …</li></ol></li><li>어뎁터 컨테이너<ol><li>시퀀스나 연관 컨테이너를 변형하여 정해진 방식으로 관리합니다.</li><li>stack, queue …</li></ol></li></ol><p> </p><p>AD_HERE</p><h3 id="시퀀스-컨테이너"><a href="#시퀀스-컨테이너" class="headerlink" title="시퀀스 컨테이너"></a>시퀀스 컨테이너</h3><p>시퀀스 컨테이너는 데이터를 선형적으로 저장하고 삽입된 요소의 순서가 그대로 유지됩니다.</p><p> </p><h4 id="벡터-vector"><a href="#벡터-vector" class="headerlink" title="벡터 (vector)"></a>벡터 (vector)</h4><p>일반적인 배열은 배열의 길이가 정적인 특징의 단점을 극복하기 위한 컨테이너로 요소가 추가되거나 삭제될때 자동으로 메모리를 재할당 하고 크기를 동적으로 바꿉니다. </p><h5 id="문법"><a href="#문법" class="headerlink" title="문법"></a>문법</h5><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><vector></span></span></span><br><span class="line"><span class="function">vector<Type> <span class="title">name</span><span class="params">(초기크기)</span></span>;</span><br></pre></td></tr></table></figure><p><code>vector</code>의 초기 크기를 지정하지 않으면 빈 백터를 생성합니다.</p><h5 id="함수"><a href="#함수" class="headerlink" title="함수"></a>함수</h5><ol><li>size() : 컨테이너에 저장된 요소의 개수를 반환</li><li>push_front() : 맨 처음에 원소를 추가</li><li>push_back() : 맨 끝에 원소를 추가</li><li>pop_front() : 첫번째 원소를 제거</li><li>pop_back() : 마지막 원소를 제거</li><li>begin() : 컨테이너의 첫 요소를 가리키는 반복자를 반환</li><li>end() : 컨테이너의 마지막 요소 바로 다음을 가리키는 반복자를 반환</li><li>empty() : 컨테이너가 비었는지 확인</li></ol><p> </p><h4 id="데크-deque"><a href="#데크-deque" class="headerlink" title="데크(deque)"></a>데크(deque)</h4><p><code>dequeue</code>는 양방향 큐를 의미하며, 양쪽에 끝이 있는 큐입니다. 이 컨테이너를 이용하면 양끝에서 삽입과 삭제를 빠르게 할 수 있습니다. <code>vector</code>와 마찬가지로 동적길이를 갖습니다.</p><h5 id="문법-1"><a href="#문법-1" class="headerlink" title="문법"></a>문법</h5><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><deque></span></span></span><br><span class="line"><span class="function">deque<Type> <span class="title">name</span><span class="params">(초기크기)</span></span>;</span><br></pre></td></tr></table></figure><h5 id="함수-1"><a href="#함수-1" class="headerlink" title="함수"></a>함수</h5><ol><li>size() : 컨테이너에 저장된 요소의 개수를 반환</li><li>front() : 첫번째 원소에 접근</li><li>back() : 마지막 원소에 접근</li><li>push_front() : 맨 처음에 원소를 추가</li><li>push_back() : 맨 끝에 원소를 추가</li><li>pop_front() : 첫번째 원소를 제거</li><li>pop_back() : 마지막 원소를 제거</li><li>begin() : 컨테이너의 첫 요소를 가리키는 반복자를 반환</li><li>end() : 컨테이너의 마지막 요소 바로 다음을 가리키는 반복자를 반환</li><li>empty() : 컨테이너가 비었는지 확인</li></ol><p> </p><h4 id="리스트-list"><a href="#리스트-list" class="headerlink" title="리스트(list)"></a>리스트(list)</h4><p>리스트 컨테이너는 이중연결 리스트를 구현한 클래스 입니다. </p><h5 id="문법-2"><a href="#문법-2" class="headerlink" title="문법"></a>문법</h5><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><list></span></span></span><br><span class="line">list<Type> name;</span><br></pre></td></tr></table></figure><h5 id="함수-2"><a href="#함수-2" class="headerlink" title="함수"></a>함수</h5><ol><li>size() : 컨테이너에 저장된 요소의 개수를 반환</li><li>front() : 첫번째 원소에 접근</li><li>back() : 마지막 원소에 접근</li><li>push_front() : 맨 처음에 원소를 추가</li><li>push_back() : 맨 끝에 원소를 추가</li><li>pop_front() : 첫번째 원소를 제거</li><li>pop_back() : 마지막 원소를 제거</li><li>begin() : 컨테이너의 첫 요소를 가리키는 반복자를 반환</li><li>end() : 컨테이너의 마지막 요소 바로 다음을 가리키는 반복자를 반환</li><li>empty() : 컨테이너가 비었는지 확인</li></ol><p> </p><p>AD_HERE</p><h3 id="연관-컨테이너"><a href="#연관-컨테이너" class="headerlink" title="연관 컨테이너"></a>연관 컨테이너</h3><p>연관 컨테이너는 Key, Value 와 같이 관련있는 데이터를 하나의 쌍으로 저장하는 컨테이너 입니다. 연관 컨테이너는 보통 균형 이진 트리나 해시 테이블을 사용하여 구현됩니다. 아래의 컨테이너들은 균형 이진 트리중 하나인 레드블랙 트리를 이용합니다.</p><p> </p><h4 id="집합-set-멀티-집합-multiset"><a href="#집합-set-멀티-집합-multiset" class="headerlink" title="집합(set) / 멀티 집합(multiset)"></a>집합(set) / 멀티 집합(multiset)</h4><p>집합 컨테이너는 저장하는 데이터 그 자체를 키로 사용하는 연관 컨테이너 입니다. 내부적으로 정렬되어 있어 빠른 검색속도를 가집니다. </p><p><code>set</code>은 중복을 허용하지 않지만, <code>multiset</code>은 중복을 허용합니다.</p><h5 id="문법-3"><a href="#문법-3" class="headerlink" title="문법"></a>문법</h5><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><set></span></span></span><br><span class="line">set<Type> name;</span><br></pre></td></tr></table></figure><h5 id="함수-3"><a href="#함수-3" class="headerlink" title="함수"></a>함수</h5><ol><li>find() : 해당 요소를 가리키는 반복자를 반환</li><li>size() : 컨테이너에 저장된 요소의 개수를 반환</li><li>insert() : 요소를 컨테이너에 추가</li><li>erase() : 요소를 컨테이너에서 제거</li><li>begin() : 컨테이너의 첫 요소를 가리키는 반복자를 반환</li><li>end() : 컨테이너의 마지막 요소 바로 다음을 가리키는 반복자를 반환</li><li>empty() : 컨테이너가 비었는지 확인</li></ol><p> </p><h4 id="맵-map-멀티맵-multimap"><a href="#맵-map-멀티맵-multimap" class="headerlink" title="맵(map) / 멀티맵(multimap)"></a>맵(map) / 멀티맵(multimap)</h4><p>맵 컨테이너는 Key와 Value의 쌍으로 데이터를 관리하는 연관 컨테이너 입니다. 맵 컨테이너도 빠른 검색 속도를 가집니다. <code>map</code>은 중복을 허용하지 않지만, <code>multimap</code>은 중복을 허용합니다.</p><h5 id="문법-4"><a href="#문법-4" class="headerlink" title="문법"></a>문법</h5><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><map></span></span></span><br><span class="line">map<KType, VType> name;</span><br></pre></td></tr></table></figure><h5 id="함수-4"><a href="#함수-4" class="headerlink" title="함수"></a>함수</h5><ol><li>find() : 해당 요소를 가리키는 반복자를 반환</li><li>size() : 컨테이너에 저장된 요소의 개수를 반환</li><li>insert() : 요소를 컨테이너에 추가</li><li>erase() : 요소를 컨테이너에서 제거</li><li>begin() : 컨테이너의 첫 요소를 가리키는 반복자를 반환</li><li>end() : 컨테이너의 마지막 요소 바로 다음을 가리키는 반복자를 반환</li><li>empty() : 컨테이너가 비었는지 확인</li></ol><p> </p><p>AD_HERE</p><h3 id="어댑터-컨테이너"><a href="#어댑터-컨테이너" class="headerlink" title="어댑터 컨테이너"></a>어댑터 컨테이너</h3><p>어댑터 컨테이너는 기존 컨테이너의 인터페이스를 제한하거나 변형하여 만든 컨테이너 입니다. 하지만 반복자를 지원하지 않아 STL 알고리즘을 이용할 수 없습니다.</p><p> </p><h4 id="스택-stack"><a href="#스택-stack" class="headerlink" title="스택(stack)"></a>스택(stack)</h4><p><code>vector</code>클래스의 인터페이스를 제한해 구현한 스택 구조를 가지는 클래스 입니다.</p><h5 id="문법-5"><a href="#문법-5" class="headerlink" title="문법"></a>문법</h5><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><stack></span></span></span><br><span class="line">stack<Type> name;</span><br></pre></td></tr></table></figure><h5 id="함수-5"><a href="#함수-5" class="headerlink" title="함수"></a>함수</h5><ol><li>size() : 컨테이너에 저장된 요소의 개수를 반환</li><li>top() : 스택의 최 상단의 요소의 참조를 반환</li><li>push() : 스택 최상단에 요소 추가</li><li>pop() : 스택 최상단에서 요소를 제거</li><li>empty() : 컨테이너가 비었는지 확인</li></ol><p> </p><h4 id="큐-queue"><a href="#큐-queue" class="headerlink" title="큐(queue)"></a>큐(queue)</h4><p>큐는 <code>deque</code>클래스를 이용하여 큐를 구현한 클래스 입니다.</p><h5 id="문법-6"><a href="#문법-6" class="headerlink" title="문법"></a>문법</h5><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><queue></span></span></span><br><span class="line">queue<Type> name;</span><br></pre></td></tr></table></figure><h5 id="함수-6"><a href="#함수-6" class="headerlink" title="함수"></a>함수</h5><ol><li>size() : 컨테이너에 저장된 요소의 개수를 반환</li><li>front() : 첫번째 원소에 접근</li><li>back() : 마지막 원소에 접근</li><li>push() : 큐에 맨 마지막에 요소를 추가</li><li>pop() : 큐의 맨 앞의 요소를 제거</li><li>empty() : 컨테이너가 비었는지 확인</li></ol><p> </p><h4 id="우선순위-큐-priority-queue"><a href="#우선순위-큐-priority-queue" class="headerlink" title="우선순위 큐(priority_queue)"></a>우선순위 큐(priority_queue)</h4><p>우선순위 큐는 <code>vector</code>클래스를 이용하여 힙을 구현해 우선순위큐를 구현한 클래스 입니다.</p><h5 id="문법-7"><a href="#문법-7" class="headerlink" title="문법"></a>문법</h5><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><queue></span></span></span><br><span class="line">priority_queue<Type> name;</span><br></pre></td></tr></table></figure><h5 id="함수-7"><a href="#함수-7" class="headerlink" title="함수"></a>함수</h5><ol><li>size() : 컨테이너에 저장된 요소의 개수를 반환</li><li>push() : 우선순위 큐에 요소를 추가</li><li>top() : 우선순위 큐에서 맨위의 요소에 접근</li><li>pop() : 우선순위 큐에서 맨위의 요소 제거</li><li>empty() : 컨테이너가 비었는지 확인</li></ol>]]></content:encoded>
<comments>http://techbless.github.io/2020/11/04/C-STL-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%9A%94%EC%95%BD-%EC%A0%95%EB%A6%AC/#disqus_thread</comments>
</item>
<item>
<title>bits/stdc++.h 헤더파일로 알고리즘 문제 풀이 시간을 단축하는 방법</title>
<link>http://techbless.github.io/2020/11/01/bits-stdc++h-%ED%97%A4%EB%8D%94%ED%8C%8C%EC%9D%BC%EB%A1%9C-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-%EC%8B%9C%EA%B0%84%EC%9D%84-%EB%8B%A8%EC%B6%95%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95/</link>
<guid>http://techbless.github.io/2020/11/01/bits-stdc++h-%ED%97%A4%EB%8D%94%ED%8C%8C%EC%9D%BC%EB%A1%9C-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-%EC%8B%9C%EA%B0%84%EC%9D%84-%EB%8B%A8%EC%B6%95%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95/</guid>
<pubDate>Sun, 01 Nov 2020 12:58:27 GMT</pubDate>
<description>
<h1 id="bits-stdc-h"><a href="#bits-stdc-h" class="headerlink" title="bits&#x2F;stdc++.h"></a>bits&#x2F;stdc++.h</h1><p><code>bits/stdc++.h<
</description>
<content:encoded><![CDATA[<h1 id="bits-stdc-h"><a href="#bits-stdc-h" class="headerlink" title="bits/stdc++.h"></a>bits/stdc++.h</h1><p><code>bits/stdc++.h</code> 헤더파일에는 표준 라이브러리가 모두 포함되어 있습니다. 또한 백준과 같은 온라인 Judge 에서는 해당 헤더파일을 지원합니다. 따라서 문제 풀이에서</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><vector></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><algorithm></span></span></span><br><span class="line"><span class="comment">// ...</span></span><br></pre></td></tr></table></figure><p>등을 작성하는 반복작업의 낭비되는 시간을 줄여 문제풀이 시간을 조금이나마 늘릴 수 있습니다. 하지만 사용하지 않는 헤더파일도 모두 <code>include</code>하게 되므로 컴파일 시간이 길어 질 수 있습니다. 그럼에도 알고리즘 문제 풀이에 있어서는 풀이에 집중할 수 있고 시간을 절약할 수 있어 꽤 매력적이라고 봅니다. 알고리즘 문제 풀이에서 유용하게 사용될 지라도 앞서 말한 것과 같이 컴파일 시간이 길어지고 프로그램의 크기가 커질 수 있으므로 개발환경과 프로덕션 환경에서는 사용하지 말아야합니다.</p><p>AD_HERE</p><h2 id="Visual-Studio-에서-사용하기"><a href="#Visual-Studio-에서-사용하기" class="headerlink" title="Visual Studio 에서 사용하기"></a>Visual Studio 에서 사용하기</h2><p><code>bits/stdc++.h</code> 헤더파일은 GNU C++ 라이브러리의 표준이 아니기 떄문에 GCC 가 아닌 경우, 예를 들어 비주얼 스튜디오같은 경우에서는 컴파일이 불가능합니다. 따라서 비주얼 스튜디오에서도 사용하고자 한다면 초기에 일련의 작업을 해주어야 합니다.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\include</span><br></pre></td></tr></table></figure><p><em>14.27.29110 부분은 본인의 컴퓨터에 맞게 이동하면 됩니다.</em></p><ol><li>위의 경로로 이동합니다. </li><li>위의 경로에서 <code>bits</code>의 이름으로 하위폴더를 생성합니다.</li><li>아래의 stdc++.h를 다운받습니다.</li><li>다운 받은 헤더파일일을 <code>bits</code> 폴더에 복사합니다.</li></ol><p><a href="https://drive.google.com/file/d/1YA5oKtjiEE89E69V1VJGnDudAgtdUBuD/view?usp=sharing">stdc++.h 구글드라이브 바로가기</a></p><p>이제 비주얼 스튜디오에서도 <code>#include <bits/stdc++.h</code>를 사용할 수 있게 되었습니다. </p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><bits/stdc++.h></span></span></span><br></pre></td></tr></table></figure><p>위와 같이 헤더파일을 include 하면 표준 라이브러리의 경우 따로 <code>include</code> 하지 않아도 사용할 수 있게 되었습니다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2020/11/01/bits-stdc++h-%ED%97%A4%EB%8D%94%ED%8C%8C%EC%9D%BC%EB%A1%9C-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-%EC%8B%9C%EA%B0%84%EC%9D%84-%EB%8B%A8%EC%B6%95%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95/#disqus_thread</comments>
</item>
<item>
<title>[자료구조] Trie 구조 (트라이)의 개념과 구현방법을 알아보자 (접두사 트리)</title>
<link>http://techbless.github.io/2020/10/30/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-Trie-%ED%8A%B8%EB%9D%BC%EC%9D%B4-%EA%B0%9C%EB%85%90%EA%B3%BC-%EA%B5%AC%ED%98%84%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90/</link>
<guid>http://techbless.github.io/2020/10/30/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-Trie-%ED%8A%B8%EB%9D%BC%EC%9D%B4-%EA%B0%9C%EB%85%90%EA%B3%BC-%EA%B5%AC%ED%98%84%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90/</guid>
<pubDate>Fri, 30 Oct 2020 02:35:44 GMT</pubDate>
<description>
<h1 id="트라이-Trie"><a href="#트라이-Trie" class="headerlink" title="트라이(Trie)"></a>트라이(Trie)</h1><p><code>Trie</code>는 문자열 집합을 표현과 검색에 특화된 트리 구조
</description>
<content:encoded><![CDATA[<h1 id="트라이-Trie"><a href="#트라이-Trie" class="headerlink" title="트라이(Trie)"></a>트라이(Trie)</h1><p><code>Trie</code>는 문자열 집합을 표현과 검색에 특화된 트리 구조의 자료구조입니다. <code>Trie</code>를 이용하면 검색하려는 문자열의 길이를 <code>M</code>이라 할때 문자열을 <code>O(M)</code>시간에 검색할 수 있습니다. 만약 배열에서 특정 문자열을 찾고자 한다면 <code>O(N)</code>만큼의 시간이, 이진 탐색을 하더라도 <code>O(logN)</code>시간이 필요합니다. 이에 비하면 <code>Trie</code> 구조는 문자열 검색에 있어 문자열의 길이만큼 소모 되므로 문자열 검색에 매우 특화되어 있음을 알 수 있습니다.</p><h2 id="구조"><a href="#구조" class="headerlink" title="구조"></a>구조</h2><p>구현을 하기전에 개념부터 알아보겠습니다. 루트 노드는 어떠한 단어도 가지지 않고 루트 노드의 아래부터 문자열의 접두사(prefix) 가 하나씩 이어지게 됩니다. 이러한 특징때문에 <code>Trie</code>는 <code>접두사 트리(Prefix Tree)</code>라고 불리기도 합니다.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">{ </span><br><span class="line"> "ABSORB", </span><br><span class="line"> "ABSORBED" , </span><br><span class="line"> "ABSTRACT", </span><br><span class="line"> "ABSTENTION", </span><br><span class="line"> "ACCESS", </span><br><span class="line"> "ACCESSIBLE", </span><br><span class="line"> "GOOD", </span><br><span class="line"> "GOODNESS", </span><br><span class="line"> "GOOGLE"</span><br><span class="line">} </span><br></pre></td></tr></table></figure><p> 위의 문자열 집합을 가지고 있다고 가정할 때 아래의 그림은 <code>Trie</code>를 시각화한 것입니다. 아래에 그림에서 연두색 노드는 문자열의 말단을 의미합니다. 즉, 루트 노드의 자식노드 부터 연두색의 노드까지의 접두사들이 모여 하나의 단어를 이루게 되는 것입니다.</p><p><img src="/img/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-Trie-%ED%8A%B8%EB%9D%BC%EC%9D%B4-%EA%B0%9C%EB%85%90%EA%B3%BC-%EA%B5%AC%ED%98%84%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90/trie.png" alt="Trie 시각화"></p><p>AD_HERE</p><h2 id="구현"><a href="#구현" class="headerlink" title="구현"></a>구현</h2><p>개념을 알아보았으니 구현을 해보도록 하겠습니다. <code>Trie</code>구조에 노드가 되는 부분 부터 정의하도록 합시다.</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">define</span> N_ALPHABATS 26</span></span><br><span class="line">-----------------------------</span><br><span class="line">TrieNode* child[N_ALPHABATS];</span><br><span class="line"><span class="type">bool</span> isTerm;</span><br></pre></td></tr></table></figure><p>앞서 설명한 개념과 같이 위의 두개의 맴버 변수만 가지면 됩니다. 자식노드를 담고 있는 <code>child</code> 배열은 26의 길이를 가지며 이는 알파벳의 개수로 숫자 집합의 문자열을 가진다면 0~9까지 길이 10과 같이 적절한 길이를 주면 됩니다. <code>isTerm</code>은 <code>bool</code> 타입으로 단어의 말단여부를 나타내고 <code>true</code>라면 단어의 끝이 됩니다. 위의 그림에서 초록색 노드가 <code>true</code>인 경우입니다. 따라서 위의 그림에서도 <code>ABSTEN</code>이 <code>Trie</code>에 포함되지만 <code>ABSTEN</code>의 말단인 <code>N</code>이 Trie의 말단이 아니기때문에 단어가 아니라는 것을 의미합니다.</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">define</span> N_ALPHABATS 26</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">TrieNode</span> {</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> TrieNode* child[N_ALPHABATS];</span><br><span class="line"> <span class="type">bool</span> isTerm;</span><br><span class="line"></span><br><span class="line"> <span class="built_in">TrieNode</span>() {</span><br><span class="line"> isTerm = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < N_ALPHABATS; i++) {</span><br><span class="line"> child[i] = <span class="literal">NULL</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> ~<span class="built_in">TrieNode</span>() {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < N_ALPHABATS; i++) {</span><br><span class="line"> <span class="keyword">if</span> (child[i] != <span class="literal">NULL</span>) {</span><br><span class="line"> <span class="keyword">delete</span> child[i];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">int</span> <span class="title">toNum</span><span class="params">(<span class="type">char</span> c)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">tolower</span>(c) - <span class="string">'a'</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">insert</span><span class="params">(<span class="type">const</span> <span class="type">char</span>* words)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span> (*words == <span class="string">'\0'</span>) {</span><br><span class="line"> isTerm = <span class="literal">true</span>;</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="type">int</span> next = <span class="built_in">toNum</span>(*words);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (child[next] == <span class="literal">NULL</span>) {</span><br><span class="line"> child[next] = <span class="keyword">new</span> TrieNode;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> child[next]-><span class="built_in">insert</span>(words + <span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">bool</span> <span class="title">find</span><span class="params">(<span class="type">const</span> <span class="type">char</span>* words)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span> (*words == <span class="string">'\0'</span>) {</span><br><span class="line"> <span class="keyword">return</span> isTerm;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="type">int</span> next = <span class="built_in">toNum</span>(*words);</span><br><span class="line"> <span class="keyword">if</span> (child[next] == <span class="literal">NULL</span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> child[next]-><span class="built_in">find</span>(words + <span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure><p>생성자에서 <code>isTerm</code>을 <code>false</code>로, <code>child</code>는 모두 <code>NULL</code>로 초기화 합니다. 소멸자에서는 동적할당한 메모리를 해제합니다. <code>toNum(char c)</code> 메서드는 A~Z 까지 대소문자를 구분하지 않고 0 ~ 25로 대응시킵니다. 이 메서드는 각 알파벳의 자식 노드가 있는 배열의 인덱스를 찾기 위해 필요합니다. </p><p><code>void insert(const char* words)</code> 메서드는 단어의 각 접두사를 자식노드에 하나씩 추가하고 단어의 말단 부분에서는 <code>isTerm</code>을 <code>true</code>로 표시하여 단어의 끝임을 나타냅니다. 접두사에 해당되는 자식노드가 <code>NULL</code>이라면 새로 할당합니다. <code>word + 1</code>은 포인터로 현재 <code>word</code>다음의 접두사인 문자를 가리케 됩니다. 예를 들면 <code>GOOD</code>에서 <code>word</code>가 가리키는 부분이 <code>G</code>라면 <code>word + 1</code>은 <code>char</code> 사이즈 만큼 다음 주소를 가리키므로 <code>O</code>가 됩니다. 이를 반복하면 <code>Trie</code>에 새로운 단어를 추가할 수 있습니다.</p><p><code>bool find(const char* words)</code> 메서드는 <code>Trie</code>가 해당 문자열을 갖고 있는지 여부를 확인하여 반환합니다. 문자열 접두사를 하나씩 따라 자식노드로 이동하고 문자열의 말단 <code>\0</code>에서 <code>Trie</code> 노드의 <code>isTerm</code>을 반환합니다. 이는 <code>isTerm</code>이 <code>true</code>인 경우, <code>Trie</code>가 해당 문자열을 갖고 있다고 판단 할 수 있고 따라서 <code>true</code>를 반환합니다.</p><p>AD_HERE</p><h2 id="테스트"><a href="#테스트" class="headerlink" title="테스트"></a>테스트</h2><p>아래의 테스트 코드를 통해 위에서 구현한 <code>Trie</code>가 잘 작동하는지 확인하도록 하겠습니다. </p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">(<span class="type">void</span>)</span> </span>{</span><br><span class="line"> TrieNode root;</span><br><span class="line"></span><br><span class="line"> string words[<span class="number">18</span>];</span><br><span class="line"></span><br><span class="line"> words[<span class="number">0</span>] = <span class="string">"ABSORB"</span>;</span><br><span class="line"> words[<span class="number">1</span>] = <span class="string">"ABSORBED"</span>;</span><br><span class="line"> words[<span class="number">2</span>] = <span class="string">"ABSTRACT"</span>;</span><br><span class="line"> words[<span class="number">3</span>] = <span class="string">"ABSTENTION"</span>;</span><br><span class="line"> words[<span class="number">4</span>] = <span class="string">"ACCESS"</span>;</span><br><span class="line"> words[<span class="number">5</span>] = <span class="string">"ACCESSIBLE"</span>;</span><br><span class="line"> words[<span class="number">6</span>] = <span class="string">"GOOD"</span>;</span><br><span class="line"> words[<span class="number">7</span>] = <span class="string">"GOODNESS"</span>;</span><br><span class="line"> words[<span class="number">8</span>] = <span class="string">"GOOGLE"</span>;</span><br><span class="line"> words[<span class="number">9</span>] = <span class="string">"ABSO"</span>;</span><br><span class="line"> words[<span class="number">10</span>] = <span class="string">"ABSOR"</span>;</span><br><span class="line"> words[<span class="number">11</span>] = <span class="string">"ABST"</span>;</span><br><span class="line"> words[<span class="number">12</span>] = <span class="string">"ABSTENT"</span>;</span><br><span class="line"> words[<span class="number">13</span>] = <span class="string">"ACCE"</span>;</span><br><span class="line"> words[<span class="number">14</span>] = <span class="string">"ACCESSIE"</span>;</span><br><span class="line"> words[<span class="number">15</span>] = <span class="string">"OD"</span>;</span><br><span class="line"> words[<span class="number">16</span>] = <span class="string">"NESS"</span>;</span><br><span class="line"> words[<span class="number">17</span>] = <span class="string">"GOGLE"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i <= <span class="number">8</span>; i++) {</span><br><span class="line"> root.<span class="built_in">insert</span>(words[i].<span class="built_in">c_str</span>());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i <= <span class="number">17</span>; i++) {</span><br><span class="line"> <span class="keyword">if</span> (root.<span class="built_in">find</span>(words[i].<span class="built_in">c_str</span>())) {</span><br><span class="line"> cout << words[i] << <span class="string">"가 존재합니다."</span> << endl;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> {</span><br><span class="line"> cout << words[i] << <span class="string">"가 존재하지 않습니다."</span> << endl;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="결과"><a href="#결과" class="headerlink" title="결과"></a>결과</h3><p><img src="/img/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-Trie-%ED%8A%B8%EB%9D%BC%EC%9D%B4-%EA%B0%9C%EB%85%90%EA%B3%BC-%EA%B5%AC%ED%98%84%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90/result.png" alt="실행 결과"></p><h2 id="단점"><a href="#단점" class="headerlink" title="단점"></a>단점</h2><p><code>Trie</code>는 문자열 탐색에 있어 매우 빠른 속도를 가지지만 공간복잡도에 있어서는 접두사를 나타내는 모든 노드에서 포인터 배열을 가지므로 <code>O(포인터 크기 * 자식 노드 배열 길이 * 트라이 노드의 총 개수)</code>가 됩니다. 이를 감안하고 빠른 문자열 탐색이 필요한 경우 좋은 선택이 될 수 있습니다.</p><h2 id="Trie-활용"><a href="#Trie-활용" class="headerlink" title="Trie 활용"></a>Trie 활용</h2><p><code>Trie</code>는 문자열의 <code>Prefix</code>를 판단하거나 탐색할때 매우 빠른 속도로 이용할 수 있습니다. 알고리즘 문제를 해결하기 위해서 사용되는 경우도 종종 있습니다. 예를 들어 아래의 백준 5052번 [전화번호 목록]에서 이용될 수 있습니다.</p><p><a href="https://www.acmicpc.net/problem/5052">전화번호 목록</a> <- 백준 문제로 바로 가기</p><p>위 문제에서 <code>Trie</code>를 이용한 풀이가 궁금하다면 제 <code>Github</code>의 <a href="https://github.com/techbless/algorithm-playground/blob/master/challenges/BOJ5052.md">풀이</a>를 참고해주세요.</p>]]></content:encoded>
<comments>http://techbless.github.io/2020/10/30/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-Trie-%ED%8A%B8%EB%9D%BC%EC%9D%B4-%EA%B0%9C%EB%85%90%EA%B3%BC-%EA%B5%AC%ED%98%84%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90/#disqus_thread</comments>
</item>
<item>
<title>C++에서 CRT라이브러리로 메모리 누수확인하여 누수 없는 코드를 만들자</title>
<link>http://techbless.github.io/2020/10/08/C-%EC%97%90%EC%84%9C-CRT%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EB%A1%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98%ED%99%95%EC%9D%B8%ED%95%98%EC%97%AC-%EB%88%84%EC%88%98-%EC%97%86%EB%8A%94-%EC%BD%94%EB%93%9C%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%9E%90/</link>
<guid>http://techbless.github.io/2020/10/08/C-%EC%97%90%EC%84%9C-CRT%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EB%A1%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98%ED%99%95%EC%9D%B8%ED%95%98%EC%97%AC-%EB%88%84%EC%88%98-%EC%97%86%EB%8A%94-%EC%BD%94%EB%93%9C%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%9E%90/</guid>
<pubDate>Thu, 08 Oct 2020 13:12:23 GMT</pubDate>
<description>
<h1 id="메모리-누수"><a href="#메모리-누수" class="headerlink" title="메모리 누수"></a>메모리 누수</h1><p>메모리 누수는 <code>new</code>등으로 동적할당한 메모리를 올바르게 할당 해제 하지 않
</description>
<content:encoded><![CDATA[<h1 id="메모리-누수"><a href="#메모리-누수" class="headerlink" title="메모리 누수"></a>메모리 누수</h1><p>메모리 누수는 <code>new</code>등으로 동적할당한 메모리를 올바르게 할당 해제 하지 않는 경우 발생합니다. 적은 메모리 누수는 초반에 알아차리기 힘들지만 시간이 흐르고 나서 메모리가 부족해 지고, 성능 저하에서 치명적인 오류까지 발생할 수 있습니다.</p><h2 id="C-에서-메모리-누수-확인"><a href="#C-에서-메모리-누수-확인" class="headerlink" title="C++에서 메모리 누수 확인"></a>C++에서 메모리 누수 확인</h2><p>따라서 메모리 누수를 확인하고 올바르게 할당을 해제하여 위와 같은 문제를 방지할 수 있습니다. <code>Visual Studio</code>와 <code>CRT 라이브러리</code>(C 런타임 라이브러리)를 이용하여 메모리 누수를 감지할 수 있습니다.</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">define</span> _CRTDBG_MAP_ALLOC</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><stdlib.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><crtdbg.h></span></span></span><br></pre></td></tr></table></figure><p>코드 상단에 위의 코드를 작성하여 디버그 힙 함수를 사용하도록 설정한후 프로그램 종료지점에서 <code>CrtDumpMemoryLeaks</code>를 호출하면 메모리 누수에 대한 보고서를 확인할 수 있습니다.</p><p>AD_HERE</p><h2 id="예시-1"><a href="#예시-1" class="headerlink" title="예시 1"></a>예시 1</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">define</span> _CRTDBG_MAP_ALLOC</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><stdlib.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><crtdbg.h></span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">(<span class="type">void</span>)</span> </span>{</span><br><span class="line"> <span class="type">char</span>* a = <span class="keyword">new</span> <span class="type">char</span>[<span class="number">1024</span>];</span><br><span class="line"></span><br><span class="line"> _CrtDumpMemoryLeaks();</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>위에 코드에서 <code>char</code>형의 1024바이트의 배열을 생성한 후, 할당 해제하지 않았으므로 메모리 누수가 발생합니다. 비쥬얼 스튜디오에서 <code>F5</code>를 눌러 디버깅을 시작하면 종료후에 <code>출력창</code>에서 결과를 확인할 수 있습니다.</p><p><img src="/img/C-%EC%97%90%EC%84%9C-CRT%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EB%A1%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98%ED%99%95%EC%9D%B8%ED%95%98%EC%97%AC-%EB%88%84%EC%88%98-%EC%97%86%EB%8A%94-%EC%BD%94%EB%93%9C%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%9E%90/ex1.png" alt="예시 화면 1"></p><h3 id="보고서-분석"><a href="#보고서-분석" class="headerlink" title="보고서 분석"></a>보고서 분석</h3><ul><li>메모리 할당 번호(81)</li><li>블록 형식(normal).</li><li>16진수 메모리 위치(0x015908C0).</li><li>블록 크기(1024 bytes).</li><li>블록 내 데이터의 처음 16바이트(16진수 형식)</li></ul><h2 id="예시-2"><a href="#예시-2" class="headerlink" title="예시 2"></a>예시 2</h2><p>위의 예시에서는 메모리 누수가 발생한 위치를 알려주지 않습니다. 메모리 누수가 발생하는 위치를 알고싶다면, <code>new</code>연산자의 <code>블록 형식</code>, <code>파일</code>, <code>줄번호</code>를 매개변수로 사용하는 오버로드를 사용해야합니다.</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifdef</span> _DEBUG</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> new new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br></pre></td></tr></table></figure><p>위의 코드를 배치하여 <code>new</code>연산자를 위의 오버로드로 정의합니다.</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">define</span> _CRTDBG_MAP_ALLOC</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><stdlib.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><crtdbg.h></span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span> _DEBUG</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> new new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">(<span class="type">void</span>)</span> </span>{</span><br><span class="line"> <span class="type">char</span>* a = <span class="keyword">new</span> <span class="type">char</span>[<span class="number">1024</span>];</span><br><span class="line"></span><br><span class="line"> _CrtDumpMemoryLeaks();</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><img src="/img/C-%EC%97%90%EC%84%9C-CRT%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EB%A1%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98%ED%99%95%EC%9D%B8%ED%95%98%EC%97%AC-%EB%88%84%EC%88%98-%EC%97%86%EB%8A%94-%EC%BD%94%EB%93%9C%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%9E%90/ex2.png" alt="예시 화면 1"></p><p>이제 메모리 누수에 대한 파일과 코드의 라인수등과 같이 더 자세한 정보를 보여주는 보고서를 확인할 수 있습니다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2020/10/08/C-%EC%97%90%EC%84%9C-CRT%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EB%A1%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98%ED%99%95%EC%9D%B8%ED%95%98%EC%97%AC-%EB%88%84%EC%88%98-%EC%97%86%EB%8A%94-%EC%BD%94%EB%93%9C%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%9E%90/#disqus_thread</comments>
</item>
</channel>
</rss>