<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Develog</title>
    <link>https://arainablog.tistory.com/</link>
    <description>LUX MUNDI</description>
    <language>ko</language>
    <pubDate>Sat, 11 Jul 2026 10:49:16 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Priv</managingEditor>
    <image>
      <title>Develog</title>
      <url>https://tistory1.daumcdn.net/tistory/3171130/attach/f6d7faff7ea348da93e474bc2c144238</url>
      <link>https://arainablog.tistory.com</link>
    </image>
    <item>
      <title>Autoencoder</title>
      <link>https://arainablog.tistory.com/768</link>
      <description>&lt;h1&gt;Non-Variational Autoencoder&lt;/h1&gt;
&lt;h2&gt;MNIST를 사용한 오토인코더 훈련&lt;/h2&gt;
&lt;p&gt;MNIST는 인공지능 훈련용으로 준비된 가장 기초적인 데이터 세트이다. &lt;/p&gt;
&lt;p&gt;MNIST에는 손 글씨로 작성한 흑백 숫자 이미지 784개가 포함되어 있다. MNIST를 활용한 훈련을 통해 오토인코더의 목적이 입력값과 출력값을 최대한 동일하게 만드는 것임을 알 수 있다. 이를 평가할 때는 MSE(평균 제곱 오차) 손실 함수가 사용된다.&lt;/p&gt;
&lt;p&gt;MNIST가 오토인코더를 통과하는 과정을 단계별로 표현하면 아래와 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;인코더:&lt;/strong&gt; 데이터 압축하기. 784차원으로 구성된 복잡한 MNIST의 이미지 데이터가 2 ~ 10개가량의 작은 핵심 데이터로 압축된다. 압축된 결과물은 잠재 변수($Z$)가 된다. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;잠재 공간:&lt;/strong&gt; 인코더에 의해 데이터가 가장 작게 압축되면 만들어지는 결과물. 데이터의 가장 본질적인 특징만 남게 된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;디코더:&lt;/strong&gt; 데이터 복원 및 재구성하기. 잠재 공간 정보를 활용해 입력된 데이터로 재복원한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;잠재 공간 시각화&lt;/h2&gt;
&lt;p&gt;잠재 공간을 시각화하면 학습할 수 있는 특성을 평가하는 것이 가능하다. 오토인코더는 입력 데이터에서 핵심적인 특징만 압축(인코더)하고 이를 바탕으로 잠재 공간을 형성한다. 이 잠재 공간을 시각화하면 인코더를 통해 추출한 특징에 따라 데이터가 잠재 공간 속에서 어떤 군집을 어디에 이루고 있는지 확인할 수 있다.&lt;/p&gt;
&lt;h2&gt;디코딩&lt;/h2&gt;
&lt;p&gt;CNN(합성곱 신경망)을 활용하는 오토인코더를 생성할 때는 입력 데이터의 중요한 특성만 남기고 나머지는 삭제하는 인코딩 작업을 수행해야 한다. 그렇다면 한 번 압축된 데이터를 원래 크기로 복원(디코딩)하기 위해서는 어떻게 해야 하는가?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;최근접 이웃법(Nearest Neighbour):&lt;/strong&gt; 입력이 2 x 2 사이즈라면, 출력을 4 x 4 사이즈로 그대로 복사해 확장하는 방법. 주변의 값을 그대로 복사해 사용하므로 결과물 제작 속도는 빠르지만, 품질은 떨어지기 쉽다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이선형 보간법(Bilinear):&lt;/strong&gt; 보간법을 사용하여 A값과 B값 사이의 중간값을 채운다. 수학적으로 연산하는 방법이기 때문에 최근접 이웃법보다 결과물 품질이 더 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;라벨 없이 어떻게 학습할 것인가?&lt;/h2&gt;
&lt;p&gt;라벨은 머신러닝 과정에서 제대로 학습한 것인지 알려주는 정답지 역할을 한다. 즉, 사용자가 고양이 사진을 넣으면 라벨은 이 사진이 고양이 사진이라는 것을 알려준다. &lt;/p&gt;
&lt;p&gt;오토인코더의 목표는 입력받은 데이터를 최대한 똑같이 다시 그려내는 &amp;#39;&lt;strong&gt;입력값의 복원&lt;/strong&gt;&amp;#39;이다. 이 오토인코더는 입력 데이터 그 자체를 라벨(정답지)로 취급하는 비지도 학습 방식을 통해 라벨을 따로 제공하지 않아도 스스로 학습이 가능한 &amp;#39;&lt;strong&gt;비지도 학습&lt;/strong&gt;&amp;#39; 방식을 사용한다.&lt;/p&gt;
&lt;p&gt;오토인코더는 입력 데이터에서 유용한 정보를 추출(인코딩)하고, 이 추출된 정보는 다른 데이터의 분류 작업에 활용한다. 인코더를 사용하면 유용한 정보를 추출할 수 있기 때문에 인코더는 라벨 없는 학습의 필수 요소에 해당한다. 인코더에 의해 압축된 데이터의 특징 데이터를 $Z$라고 표현하며, 오토 인코더는 디코딩을 수행할 때 이 $Z$를 활용해 원본 데이터로 복원해야 한다.&lt;/p&gt;
&lt;p&gt;원본 데이터를 압축하여 데이터의 핵심 특징만 남기기 때문에 복원(디코딩) 과정을 거치면 원본 데이터와 100% 동일하게 나올 수 없다. &amp;#39;&lt;strong&gt;손실 함수&lt;/strong&gt;&amp;#39;는 이 원본 데이터 $X$와 복원 데이터 $X&amp;#39;$ 사이의 차이를 계산하는 함수이며 손실 함수의 값이 작을수록 더 정확하게 복원했음을 의미한다.&lt;/p&gt;
&lt;h2&gt;소프트맥스 함수 (Softmax function)&lt;/h2&gt;
&lt;p&gt;오토인코더 학습을 진행하고 나면 인코더가 추출한 특징 Z를 활용해 분류 작업을 수행해야 한다. 이진 분류가 두 개의 답 중에 하나를 고르는 문제를 푸는 것이었다면, 다중 클래스 분류는 3개 이상의 답 중에 하나를 고르는 문제를 푸는 것과 같다. 소프트맥스 함수는 이러한 다중 클래스 분류 문제를 풀기 위해 사용되는 함수이다.&lt;/p&gt;
&lt;p&gt;소프트맥스 함수는 분류해야 하는 정답지(클래스)의 총 개수를 $K$라고 할 때, $K$차원의 벡터를 입력받아 각 클래스에 대한 확률을 추정한다. 확률 추정이 완료되면 그중에서 값이 가장 큰 항목을 정답으로 지목한다. 이때 소프트맥스 함수가 계산하는 확률의 총합은 항상 1이다.&lt;/p&gt;
&lt;h2&gt;Non-Variational Autoencoder의 한계&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;새로운 Z 생성이 새로운 X 생성보다 훨씬 어렵다.&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;일반적인 NVAE(Non-Variational Autoencoder)는 데이터 $X$를 $Z$로 압축할 뿐, $Z$에 어떠한 규칙을 요구하지는 않는다. 이 때문에 잠재 공간($Z$) 속에 점이 흩어져있는데, 임의로 어떤 지점을 찍어야 의미가 있는 데이터가 저장된 곳인지 파악할 방법이 없다. 그러므로 규칙 없이 퍼져있는 잠재 공간 속에 유효한 의미를 지닌 새로운 점($Z$)을 생성하는 것도 매우 어렵다.&lt;/p&gt;
&lt;h1&gt;Variational Autoencoder&lt;/h1&gt;
&lt;p&gt;NVAE의 한계를 극복하기 위해 개량된 오토인코더이다.&lt;/p&gt;
&lt;p&gt;VAE는 모든 $Z$가 그래프의 가운데가 산처럼 볼록 튀어나온 형태의 정규 분포(가우시안 분포) 속에 모이도록 강제하기 때문에 분포 중앙 근처에 아무 $Z$나 찍어도 디코더가 그럴싸한 결과물을 만들어낼 것임을 기대할 수 있다.&lt;/p&gt;
&lt;p&gt;VAE는 데이터의 학습과 더불어 학습된 모델로부터 샘플링을 통해 새로운 데이터를 생성하는 것을 목표로 한다. 또한 완성된 이미지, $X$는 눈에 보이지 않는 특징을 정의하는 속성, 잠재 표현($Z$)으로부터 생성되었다고 가정한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$Z$: 이미지 속 물체의 색상, 크기, 방향 등에 대한 값&lt;/li&gt;
&lt;li&gt;$X$: $Z$를 통해 만들어진 이미지&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;VAE는 입력값을 통해 학습을 수행하고 나면 사전 분포($p(z)$)에서 $Z$를 추출한다. 추출된 $Z$는 조건부 분포($p(x \mid z)$)의 입력이 되어 새로운 데이터 $X$를 얻는다.&lt;/p&gt;
&lt;h2&gt;VAE 훈련시키기&lt;/h2&gt;
&lt;p&gt;VAE는 학습시키기가 까다롭다고 알려져 있다.&lt;/p&gt;
&lt;p&gt;VAE 모델을 학습시키기 위해서는 데이터가 나타날 확률($pθ​(x)$)을 최대화해야 한다. 우리는 $Z$를 관측할 수 없어서 모든 가능한 $Z$에 대해서 적분을 수행해야 하지만, 현실적으로 모든 $Z$를 적분하는 것은 불가능하다.&lt;/p&gt;
&lt;p&gt;어떠한 데이터 $X$는 반드시 어떠한 원인 $Z$ 때문에 만들어진 결과물이다. 따라서 $X$의 등장 원인을 추적하기 위해서는 세상에 존재하는 모든 $Z$에 대해 아래와 같은 연산을 수행해야 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;어떤 특징 $Z$가 선택될 확률:&lt;/strong&gt; $p(z)$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;특징 $Z$가 주어졌을 때 데이터 $X$가 만들어질 확률:&lt;/strong&gt; $p(x \mid z)$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;위의 두 확률을 곱한 뒤에 모든 가능한 $Z$를 더해야 데이터 $X$가 나올 하나의 전체 확률이 완성된다. 이때 잠재 공간 속 $Z$는 연속적인 숫자로 이루어져 있기 때문에 아래와 같이 더하기(적분)를 수행해야 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$pθ​(x)=∫pθ​(x \mid z)pθ​(z)dz$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;적분의 결과인 $p(x)$는 &lt;strong&gt;한계 가능도&lt;/strong&gt; 또는 &lt;strong&gt;증거&lt;/strong&gt;라고 부르며, 모든 가능한 $Z$에 대한 연산을 마쳤을 때 데이터 $X$가 나올 확률을 의미한다. 또한 사후 확률($p(z \mid x)$)은 데이터 $X$가 주어졌을 때, 이 데이터를 만들어 낸 $Z$를 역추적하는 확률을 의미한다. 다만, 잠재변수 $Z$는 무한히 많은 값을 가질 수 있는 연속적인 공간이기 때문에 위의 적분을 실제로 연산하는 것은 현실적으로 불가능하다.&lt;/p&gt;
&lt;p&gt;베이즈 정리($p(x)=p(z \mid x)/p(x \mid z)p(z)​$)로 이러한 문제를 해결하려고 시도해도 적분 결과($p(x)$)를 모르기 때문에 사후 확률($p(z \mid x)$)을 모르고, 사후 확률을 모르기 때문에 적분 결과도 모른다. 이 때문에 적분을 수행할 수 없다면 베이즈 정리 또한 VAE 학습에 도움이 되지 않는다.&lt;/p&gt;
&lt;h2&gt;인코더 네트워크 &amp;amp; 디코더 네트워크&lt;/h2&gt;
&lt;p&gt;온전한 사후 확률은 현실적으로 연산할 수 없으므로, 정답 대신 근삿값을 연산하는 &amp;#39;&lt;strong&gt;확률 분포&lt;/strong&gt;&amp;#39;를 사용해야 한다. 이 확률 분포는 평균과 표준 편차를 이용하여 추측된 결괏값을 의미한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;인코더 네트워크($qϕ​(z \mid x)$):&lt;/strong&gt; 입력 데이터 $X$를 받아서 잠재 코드 $Z$의 분포를 출력한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;디코더 네트워크($pθ​(x \mid z)$):&lt;/strong&gt; 잠재 코드 $Z$를 받아서 복원 데이터 $X&amp;#39;$의 평균을 출력한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;인코더의 출력은 데이터 $X$가 잠재 공간 어디에 위치할 것인지 평균($μz \mid x$​)과 표준 편차($Σz \mid x​$)로 연산된다. 즉, &amp;#39;진짜 정답&amp;#39;에 해당하는 온전한 사후 확률값은 구할 수 없으므로 &amp;#39;가짜 정답&amp;#39;을 이용하여 인코더를 학습시킨다. 이렇게 학습된 인코더는 데이터 $X$를 넣으면 그럴듯한 $Z$의 분포(평균과 분산)를 내뱉는다.&lt;/p&gt;
&lt;p&gt;디코더의 출력은 특정한 값(숫자)이 아닌 분포이다. NVAE는 복원된 데이터 $X&amp;#39;$를 출력하지만, VAE의 디코더는 출력 데이터 $X$에 대한 확률 분포(정규 분포; 가우시안 분포)를 정의한다. 즉, VAE 디코더의 출력은 가우시안 분포의 평균값일 뿐이다.&lt;/p&gt;
&lt;p&gt;VAE가 결괏값을 출력하는 &amp;#39;근사&amp;#39; 과정은 인코더가 학습을 반복하며 엉터리 $Z$를 출력하다가 서서히 진짜 사후 확률 $p$에 최대한 비슷해지도록 차이를 줄여나가는 과정을 의미한다. 여기서 인코더와 디코더가 얼마나 닮았는지를 계산하는 수식을 &lt;strong&gt;ELBO&lt;/strong&gt;라고 부른다.&lt;/p&gt;
&lt;h2&gt;로그 가능도&lt;/h2&gt;
&lt;p&gt;수학적으로 로그 가능도($log\ pθ​(x \mid z)$)를 최대화하는 것은 원본 데이터 $X$와 네트워크 출력값 $μ$ 사이의 거리를 의미하는 $L2$ 거리를 최소화하는 것과 동일한 의미를 지닌다. 즉, 복원을 최대한 잘하기 위해 MSE(Mean Squared Error)를 줄이는 행동은 수학적으로 정답이 나올 확률을 높이는 행동과 같다.&lt;/p&gt;
&lt;h2&gt;Disentangling&lt;/h2&gt;
&lt;p&gt;데이터의 특징을 학습할 때 서로 복잡하게 얽혀있는 특징들을 독립적인 요소로 분리해 내는 것.&lt;/p&gt;
&lt;p&gt;사람의 얼굴처럼 복합적인 특징(안경의 유무, 얼굴의 각도 등)이 섞인 데이터는 특징들이 한꺼번에 뭉뚱그려서 학습된다. Disentangling 처리가 이루어진다면 복합적인 특징들을 개별적으로 분리하여 조절할 수 있게 된다. 이를 위해 VAE는 잠재 변수($Z$)가 서로 독립적인 표준 정규 분포를 따르도록 강제하여 각 차원($Z_1, Z_2, ...$)이 서로 상관관계를 가지지 않도록 각 차원에 서로 겹치지 않는 특징을 분리해서 저장하도록 유도한다.&lt;/p&gt;
&lt;p&gt;Disentangling을 활용하면 아래와 같은 장점을 기대할 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;제어 가능성:&lt;/strong&gt; 숫자 5를 유지하면서 오른쪽으로 15도 눕히라는 명령처럼 원하는 특징만 선택해서 변형할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;해석 가능성:&lt;/strong&gt; 블랙박스처럼 기능과 역할을 인지하기 어려운 잠재 변수들이 어떤 의미를 지니는 것인지 해석할 수 있게 된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;학습 효율 강화:&lt;/strong&gt; 특징들을 개별적으로 다룰 수 있다면 데이터가 적어도 모델이 입력 데이터의 규칙을 더 빨리 학습할 수 있게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Variational Autoencoder의 한계&lt;/h2&gt;
&lt;p&gt;VAE로 이미지를 복원하면 흐릿한 형태가 된다. 이는 VAE가 가우시안 분포의 형태를 따르도록 강제하는 특성 때문이다.&lt;/p&gt;
&lt;p&gt;입력된 이미지를 최대한 똑같이 복원하는 것에만 집중한다면 입력된 데이터마다 잠재 공간 속 점이 분포를 이루지 않고 불규칙적으로 확산된다. 이 경우, 임의의 값을 이용해 새로운 이미지를 생성하고자 명령한다면 잠재 공간 속 비어 있는 공간이 너무 많아져서 예측할 수 없는 결과물이 나오게 된다. 이러한 문제를 방지하기 위해 VAE는 모든 데이터를 원점 근처에 모여서 종 모양을 가지는 가우시안 분포를 형성하도록 유도한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;재구성의 오차:&lt;/strong&gt; 똑같이 복원하는 것을 최우선시한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KL 발산:&lt;/strong&gt; 가우시안 분포를 형성하도록 만드는 것을 최우선시한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;KL 발산의 영향력이 재구성의 오차보다 강하게 적용되면, 서로 다른 사진(숫자 1과 숫자 7)의 $Z$ 값이 서로 겹치게 된다. 디코더 입장에서 이 문제를 바라보면 숫자 1과 숫자 7 중에서 무엇을 그려야 하는지 혼란에 빠지게 된다. 이 경우 오차를 최소화하기 위해 디코더는 1과 7을 겹친 듯한 중간 지점의 흐릿한 이미지를 그리게 된다.&lt;/p&gt;
&lt;p&gt;이러한 한계 때문에 VAE는 단독으로 이미지 생성 용도로 활용되지 않는다. 그 대신, 차원을 축소(인코딩)하고 복원(디코딩)하여 방대한 계산량을 지닌 이미지도 효율적으로 다룰 수 있도록 하는 용도로 사용된다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Latent Diffusion Model:&lt;/strong&gt; VAE의 인코더로 이미지를 아주 작은 잠재 공간으로 압축한 뒤, 복잡한 연산을 다른 모델(디퓨전)로 처리하고 VAE의 디코더로 압축된 이미지를 복원한다. &lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;생성 모델의 삼각관계&lt;/h1&gt;
&lt;p&gt;VAE, GAN, Diffusion 모델은 &amp;#39;고품질, &amp;#39;빠른 속도&amp;#39;, &amp;#39;다양성&amp;#39;이라는 세 가지 요소에서 삼각관계를 이루고 있다. 이러한 삼각관계 때문에 현재 VAE는 데이터를 효율적으로 압축하여 디퓨전 모델이 작업을 빠르게 처리할 수 있도록 보조하는 역할로 주로 사용된다. VAE를 통해 느린 연산 속도를 보강한 디퓨전 모델은 GAN을 완전히 대체할 수 있어 현재 대세가 되었다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GAN (높은 품질, 낮은 다양성, 빠른 속도):&lt;/strong&gt; 데이터가 있는 지점을 날카롭게 찾아서 아주 선명한 이미지를 만들 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VAE (낮은 품질, 높은 다양성, 빠른 속도):&lt;/strong&gt; 데이터가 있는 곳과 없는 곳을 모두 학습한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diffusion (높은 품질, 높은 다양성, 느린 속도):&lt;/strong&gt; 데이터의 분포를 가장 정확하게 따라가기 때문에 품질이 가장 좋다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Technology/AI (2026)</category>
      <author>Priv</author>
      <guid isPermaLink="true">https://arainablog.tistory.com/768</guid>
      <comments>https://arainablog.tistory.com/768#entry768comment</comments>
      <pubDate>Sat, 11 Apr 2026 01:25:19 +0900</pubDate>
    </item>
    <item>
      <title>Optimization</title>
      <link>https://arainablog.tistory.com/767</link>
      <description>&lt;h1&gt;판별 모델과 생성 모델&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZikhP/dJMcadIjPpL/vtots4VJ8UbkIBhfZW7Q70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZikhP/dJMcadIjPpL/vtots4VJ8UbkIBhfZW7Q70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZikhP/dJMcadIjPpL/vtots4VJ8UbkIBhfZW7Q70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZikhP%2FdJMcadIjPpL%2Fvtots4VJ8UbkIBhfZW7Q70%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;판별 모델 (Discriminative Model)&lt;/h2&gt;
&lt;p&gt;판별 모델은 Many-to-One을 목표로 한다. 사용자가 여러 이미지를 제공하면 하나의 라벨을 생성한다.&lt;/p&gt;
&lt;p&gt;사용자를 통해 제공받은 샘플 데이터를 학습하여 함수를 정의하고, 해당 이미지에 맞는 라벨을 생성한다. 이후 유사한 이미지가 다시 유입되면 학습한 이미지를 분류한다. 생성형 모델과 다르게 새로운 값을 생성하는 것은 불가능하다. 새로 유입된 이미지가 어떤 라벨에 더 적합한지 확률을 이용해 판별하며, 더 높은 확률을 지닌 라벨을 반환한다.&lt;/p&gt;
&lt;p&gt;판별 모델은 유입된 이미지 하나에 대한 라벨끼리만 확률은 나누므로, &amp;#39;이미지 간의 경쟁&amp;#39; 관계가 구축되지 않는다. 즉, 사진 A에서 라벨이 개일 확률이 1.0이더라도 사진 B에 대한 분류에 영향을 미치지 않는다. 학습되지 않은(분류할 수 있는 라벨과 무관한) 형태의 데이터가 유입되더라도 확률을 통해 결과를 반환해야 하므로 부정확한 결과를 무조건 내놓는다. 이 때문에 학습된 범위를 벗어나면 판별 모델은 신뢰성을 잃는다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;개와 고양이를 분류할 수 있는 판별 모델에 원숭이 사진을 제공하면 고양이로 분류한다. (분류 자체는 수행함)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;생성 모델 (Generative Model)&lt;/h2&gt;
&lt;p&gt;생성 모델은 One-to-Many를 목표로 한다. 사용자가 하나의 라벨을 제공하면 여러 이미지를 생성한다.&lt;/p&gt;
&lt;p&gt;학습용 샘플(강아지 사진 등) 데이터를 제공하면 모델은 학습을 통해 샘플 데이터의 특징을 알아내 함수를 정의한다. 학습이 완료된 생성형 모델은 사용자가 입력한 명령에 따라 새로운 데이터를 생성해 낼 수 있게 된다. 즉, 생성 모델을 생성할 때의 목표는 샘플 데이터를 통해 일반화할 수 있는 함수를 정의하고, 이를 통해 새로운 데이터를 생성할 수 있도록 학습시키는 것이다. &lt;/p&gt;
&lt;p&gt;생성형 모델에서는 &amp;#39;진짜 같은 이미지를 만들려는 생성자&amp;#39;와 &amp;#39;가짜를 잡아내려는 판별자&amp;#39;가 서로 경쟁하는 구조를 지닌다. 즉, 한정된 자원(확률 100%)을 이미지들이 최대한 많이 확보하기 위해 서로 경쟁하는 방식이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;개 이미지에 대한 특징을 학습하여 일반화된 함수를 생성하고, 명령에 따라 새로운 개 이미지를 생성한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;조건부 생성 모델 (Conditional Generative Model)&lt;/h2&gt;
&lt;p&gt;조건부가 아닌 기본적인 생성 모델은 &amp;#39;아무 이미지&amp;#39;를 제작하는 모델이다. 조건을 지정하지 않고 무작위로 이미지를 생성하기 때문에 어떤 결과가 나올 것인지 예상하기 어렵다. &lt;/p&gt;
&lt;p&gt;조건부 생성 모델은 사용자가 &amp;#39;안경을 쓴 남성의 이미지&amp;#39;처럼 특정 조건을 지정하여 해당 조건에 맞는 이미지를 생성하는 모델이다. 현재 사용되는 대부분의 생성형 모델(Text-to-Image, Image-to-Text 등)이 조건부 생성 모델 방식이다.&lt;/p&gt;
&lt;h2&gt;잠재 변수 모델 (Latent Variable Model)&lt;/h2&gt;
&lt;p&gt;관찰할 수 있는 데이터 $X$에 숨겨진 관찰되지 않은 원인 $Z$가 있다고 가정하는 통계적 모델. 여기서 $Z$는 매우 복잡하고 높은 차원의 데이터 $X$와 달리 훨씬 단순하고 낮은 차원의 개념으로 가정한다.&lt;/p&gt;
&lt;p&gt;수천 명의 얼굴 사진($X$)에는 성별, 나이, 머리색, 눈동자 색 등 다양한 특징($Z$)가 존재한다. 잠재 변수 모델은 이러한 특징들을 잠재 변수와 비지도 학습을 통해 파악한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;관찰 변수($X$):&lt;/strong&gt; 실제로 수집한 데이터 (수천 명의 얼굴 사진)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;잠재 변수(Z):&lt;/strong&gt; 데이터 내부에 숨겨진 본질적인 특징 (얼굴의 각도, 웃음 정도, 성별 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;잠재 변수 모델에서는 잠재 변수를 어떻게 모델링할 것인지에 집중해야 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;데이터 생성하기:&lt;/strong&gt; 숨겨진 특징($Z$)을 바꾸면 그에 대응하는 새로운 데이터가 생성된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;차원 축소:&lt;/strong&gt; 수만 개의 픽셀 데이터를 몇 개의 핵심 숫자로 압축하여 데이터 본질을 파악한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 이해:&lt;/strong&gt; 겉으로 드러난 데이터 사이의 복잡한 관계를 잠재 변수라는 공통의 원인으로 명확히 설명한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;잠재 변수 모델의 구조는 조건부 확률로 설명될 수 있다.&lt;br&gt;&lt;strong&gt;$P(X) = \int{P(X \mid Z) P(Z) dZ}$&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$P(Z)$:&lt;/strong&gt; 데이터를 보기 전, 잠재 변수가 어떤 분포를 가질 것이라는 가정.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$P(X \mid Z)$:&lt;/strong&gt; 특정한 잠재 변수 $Z$가 주어졌을 때, 실제 데이터 $X$가 어떻게 나타날 것인지 결정하는 확률.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$P(X)$:&lt;/strong&gt; 전체 데이터 분포. 모든 가능한 $Z$에 대한 확률을 더해야 하므로 적분으로 계산된다.&lt;br&gt;단, 인간이 직접 잠재 변수로부터 복잡한 데이터를 만들어내는 수학 공식을 산출하는 것은 연산량이 기하급수적으로 늘어나기 때문에 불가능에 가깝다. &lt;/li&gt;
&lt;li&gt;웃음 수치가 0.1 올라갔을 때, 2000개가 넘는 픽셀값들이 어떻게 변해야 자연스럽게 웃는 얼굴을 만들어낼 수 있는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이를 극복하기 위해 직접 연산하는 것 대신 신경망을 사용한다. 즉, 함수를 직접 설계하는 대신 수많은 데이터를 제공하여 Z에서 X로 가는 복잡한 규칙을 찾도록 모델을 학습시킨다.&lt;/p&gt;
&lt;h2&gt;연속 잠재 변수 표현&lt;/h2&gt;
&lt;p&gt;데이터의 숨겨진 특징($Z$)은 디지털 값처럼 끊어지는 값이 아니라 아날로그값처럼 연속적으로 이어지는 숫자의 나열로 표현되는 방식이다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;데이터의 본질적인 특징을 실수로 표현하여 그 값을 조절함에 따라 데이터가 어떻게 변하는지 모델링하는 것.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;데이터를 분류할 때는 보통 개 또는 고양이처럼 이산적 표현으로 생각하기 쉽다. 하지만 연속 잠재 변수는 웃음의 정도를 실수로 표현하는 것처럼 데이터의 특징을 나타내는 값의 변화를 연속적으로 표현한다. 즉, 잠재 변수 $Z$를 조금만 바꾸면 출력되는 데이터 $X$도 조금만 바뀐다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;압축의 효율성:&lt;/strong&gt; 수만 개의 픽셀($X$)을 단 몇 개의 핵심적인 숫자($Z$)로 요약할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;무한한 생성:&lt;/strong&gt; $Z$가 실수이기 때문에 무한히 많은 조합이 만들어질 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;구조 파악:&lt;/strong&gt; 비슷한 데이터끼리는 잠재 공간상에서도 가까운 곳에 모인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;최적화&lt;/h1&gt;
&lt;p&gt;우리는 훈련할 수 있는 파라미터를 가지고 함수의 형태를 정의한다. 여기서 모델의 성능을 결정하는 파라미터들의 값은 이미 알고 있다. 그렇다면 입력된 새로운 데이터에 가장 적합한 파라미터 값은 어떻게 훈련해야 하는가?&lt;/p&gt;
&lt;p&gt;최적화는 어떠한 문제를 한정된 자원과 비용을 이용해 최대 효율로 해결하기 위한 최적의 방안을 찾는 것이다.&lt;br&gt;AI 분야에서 최적화는 모델이 가장 적게 틀리도록 정답에 최대한 가까운 파라미터를 찾아가는 과정을 말한다. 최적화는 모델의 타입에 따라서 형태와 구성이 조금씩 달라진다.&lt;/p&gt;
&lt;p&gt;최적화를 진행하기 위해서는 아래와 같은 구성요소가 요구된다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;목적 함수/손실 함수:&lt;/strong&gt; 모델이 얼마나 틀렸는지를 측정하기 위한 함수. 점수가 낮을수록 정확도가 높다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;파라미터:&lt;/strong&gt; 모델의 결과를 변화시키는 변수. 선형 모델의 경우 기울기와 절편이 이에 해당한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;최적화 알고리즘:&lt;/strong&gt; 파라미터를 어떻게 조정할 것인지를 결정하는 알고리즘.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;최적화 과정을 단계별로 정의하면 아래와 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1차 학습:&lt;/strong&gt; 모델이 입력된 새로운 데이터에 대해 일차적으로 무작위 파라미터를 이용해 값을 내놓는다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;손실함수($L$):&lt;/strong&gt; 통해 모델이 내놓은 결과가 얼마나 신뢰할 수 있는 값인지 수치화한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;역전파:&lt;/strong&gt; 파라미터값을 바꿀 때 전체 오차가 어떻게 변화하는지 파악하기 위해 미분(역전파)을 진행한다. 손실 함수를 각 파라미터로 미분하면 오차를 줄이기 위해 파라미터를 어디로 조정해야 하는지 파악할 수 있게 된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;경사하강법:&lt;/strong&gt; 역전파로 알아낸 방향을 바탕으로 파라미터값을 학습률에 따라 점진적으로 갱신한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;선형 모델 최적화&lt;/h2&gt;
&lt;p&gt;선형 모델은 &amp;#39;형태&amp;#39;에 집중한 1차 방정식($y = Wx + b$) 구조의 모델이다. 여기서는 데이터들 사이의 관계가 직선 또는 평면 형태라고 가정한다. 즉, 입력이 커지면 출력도 일정한 비율로 커진다고 가정하므로 선형 모델의 최적화란, 실제 데이터와 모델의 예측값 사이 거리를 최소화하는 $W$와 $b$를 찾는 것에 해당한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;경사 하강법:&lt;/strong&gt; 현재 $W$, $b$로 예측값을 구하고, 실제 값과의 오차를 계산한다. 오차 함수를 $W$와 $b$로 미분하여 기울기를 파악한 뒤, 오차가 줄어드는 방향을 향해 점진적으로 파라미터를 조정한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;정규 방정식:&lt;/strong&gt; 데이터가 방대하지 않을 때 사용되며, 점진적으로 파라미터를 조정하지 않고 한 번의 행렬 계산으로 처리한다. 데이터가 적을 때만 유효하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;선형 모델은 1차 방정식 구조이기 때문에 다룰 수 있는 파라미터의 수가 데이터의 수와 무관하게 항상 2개($W, b$) 뿐이다. 이 때문에 데이터를 통해 모델이 학습한 지식을 모두 저장하기 위해서는 정해진 개수의 파라미터에 모두 압축해서 담는 &amp;#39;&lt;strong&gt;파라미터 모델&lt;/strong&gt;&amp;#39; 구조를 활용해야 한다. 이는 수많은 데이터로 학습을 끝낸 뒤 핵심 요소만 남겨서 저장하는 방식이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;수천 명의 관상을 통해 학습한 &amp;#39;코가 높으면 재물복이 있다&amp;#39;는 한 문장의 규칙만 저장한다. (수천 명의 얼굴에 대한 기억은 불필요)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;비선형 모델 최적화&lt;/h2&gt;
&lt;p&gt;비선형 모델은 데이터가 선형적으로 구분할 수 없을 정도로 복잡한 관계를 가질 때 사용된다. 단순히 비례하는 관계를 넘어 데이터 분포가 꺾이거나, 휘거나, 특정 구간에서만 반응하는 등 복잡한 패턴을 지니고 있다. 이러한 복잡한 패턴에 대응하기 위해서는 선형 모델 사이에 활성화 함수(ReLU, Sigmoid 등)를 적용하여 모델이 &amp;#39;휘게&amp;#39; 만들어야 한다. AI가 사람의 얼굴처럼 복잡한 대상을 이해하기 위해서는 비선형 모델이 필수적이다.&lt;/p&gt;
&lt;p&gt;비선형 모델을 최적화할 때는 데이터의 복잡한 관계를 풀기 위해 만들어진 &lt;strong&gt;비선형 함수&lt;/strong&gt;를 사용한다. 이 비선형 함수의 오차를 최소화하는 과정이 비선형 모델의 최적화 과정이 된다. 비선형 모델은 선형 모델과 다르게 일직선 경가 아니라 굴곡이 있는 경로를 다루기 때문에 &amp;#39;비볼록 함수&amp;#39;의 구조로 인해 발생할 수 있는 문제에 경계해야 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;n개의 지역 최소 점:&lt;/strong&gt; 해당 지점은 주변보다 낮지만, 전체에서 가장 낮은 점이 아님.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;안장점:&lt;/strong&gt; 어떤 방향으로는 내려가고 다른 방향으로는 올라가는 지점. (겉보기에는 기울기가 작아 보여도 최저점이 아님)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;경사하강법과 같은 선형 모델 최적화에서 흔히 쓰이는 기울기 기반 최적화 방법은 현재 위치 근처의 기울기만 가지고 판단하기 때문에 이러한 비볼록 함수의 특징에 유연히 대응할 수 없다. 이 때문에 비선형 모델을 최적화할 때는 절대적인 최적화보다는 상대적인 최적화에 더 집중해야 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;모멘텀:&lt;/strong&gt; 이전 단계의 이동 방향을 누적해 관성을 부여하는 최적화 기법. 단계마다 현재 기울기만 따르는 대신 과거 이동 방향을 함께 반영한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;적응형 학습률:&lt;/strong&gt; 경사도 방향과 가파른 수준을 알려주는 벡터, 그래디언트의 평균(1차)과 분산(2차)을 동시에 추적하여 파라미터별 학습률을 자동으로 조절한다. 현재 경사와 더불어 지금까지 얼마나 빠르게 움직였는지, 지면이 얼마나 불안정했는지 동시에 고려해 보폭을 조절한다. 최근의 속도 흐름을 유지하면서도 때에 따라 자동으로 속도를 줄여 안정적으로 경사를 내려올 수 있도록 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;인공신경망의 딥러닝&lt;/h1&gt;
&lt;p&gt;딥러닝은 선형 함수로 공간을 정리하고, 비선형 함수로 그 공간을 휘게 만들어서 데이터의 복잡한 패턴에 최적화된 형태를 찾아가는 과정이다. 즉, 선형 함수와 비선형 함수를 겹겹이 쌓아 올린 구조이다. &lt;/p&gt;
&lt;p&gt;선형 레이어만 반복적으로 쌓으면 결국 하나의 거대한 선형 함수가 되어 복잡한 데이터를 표현할 수 없게 되므로, 선형 레이어 사이에 비선형 함수를 추가한다. 이를 통해 얼굴의 곡선처럼 복잡한 비선형 데이터에도 대응할 수 있게 된다.&lt;/p&gt;
&lt;p&gt;딥러닝을 구축할 때 무작정 레이어를 늘리면 되는 것은 아니다. 레이어를 너무 많이 쌓게 되면 역전파 단계를 수행할 때 마지막 층에서 계산한 오차 정보(기울기)가 앞 층까지 전달되지 못하고 중간에 증발하는 &amp;#39;&lt;strong&gt;기울기 소실&lt;/strong&gt;&amp;#39; 현상이 발생할 수 있다. 역전파를 수행할 때 연쇄 법칙을 사용하여 뒤에서부터 앞으로 미분값을 곱하며 나아간다. 이때 &lt;strong&gt;시그모이드 활성화 함수&lt;/strong&gt;가 적용된다면 아래와 같이 문제가 발생한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;시그모이드 함수의 미분값은 아무리 커도 1보다 작다.&lt;/li&gt;
&lt;li&gt;미분값이 0.25, 층이 10층이라고 가정한다.&lt;/li&gt;
&lt;li&gt;맨 앞 층의 오차 정보 값: $0.25^{10}$&lt;br&gt;즉, 역전파를 거치며 앞쪽으로 나아가는 거리가 길수록 오차 정보 값이 너무 미미하여 무엇이 문제였는지 피드백을 전혀 받을 수 없게 되어버린다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ReLU 함수&lt;/strong&gt;는 이러한 기울기 소실 현상을 해결하기 위한 함수이다. ReLU 함수는 미분해도 값이 작아지지 않는 함수이다. ReLU 함수는 입력이 0보다 크면 미분값이 항상 1이다. 1은 여러 번 곱해도 값이 변하지 않기 때문에 층이 깊어져도 오차 정보에 손실이 없다.&lt;/p&gt;
&lt;h1&gt;합성곱 (Convolution)&lt;/h1&gt;
&lt;p&gt;딥러닝 중에서 이미지 처리를 위해 사용되는 핵심 연산법 중 하나. 커다란 이미지 위를 필터를 이용해 스캔하듯이 훑으며 중요한 특징만 추출하는 형태로 동작한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;필터/커널:&lt;/strong&gt; 이미지에서 특징을 찾는 도구. 이미지 위를 훑으며 스캐너처럼 동작한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;스트라이드:&lt;/strong&gt; 필터가 한 번에 이동하는 칸수. 값이 클수록 결과 이미지 크기가 작아진다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;패딩:&lt;/strong&gt; 이미지 가장자리를 0으로 채우는 작업. 가장자리 정보 손실 방지 및 출력 크기 유지를 위해 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이미지 데이터는 숫자로 채워진 거대한 격자판과 같다. 여기에 작은 크기의 필터를 올려두고 옆으로 한 칸씩 이동시키며 필터의 숫자와 이미지의 숫자를 각각 곱한 뒤, 그 결과를 모두 더해 하나의 숫자로 만든다. 이 연산을 옆으로 한 칸씩 이동하며 반복한다. 연산이 모두 끝나면 나오는 결과물을 특성 맵(Feature Map)이라고 부르며, 원본 이미지에서 필터가 찾고자 했던 특징이 어디에 있는지 알 수 있는 축약된 지도가 된다.&lt;/p&gt;
&lt;p&gt;일반적인 선형 레이어 방식을 이미지처럼 2D 형태의 데이터에 그대로 적용할 경우, 이미지를 한 줄로 길게 펴서 입력 데이터로 제공해야 한다. 이렇게 되면 &amp;#39;눈 옆에 코가 있다&amp;#39;처럼 공간 정보를 모두 무시하게 된다. &lt;/p&gt;
&lt;p&gt;합성곱 방식을 사용하면 이미지를 한 줄로 펴는 작업 없이 그대로 사용할 수 있기 때문에 공간 정보를 보존할 수 있다. 또한 고해상도 컬러 이미지를 선형 레이어 방식에 적용한다면 파라미터 폭발 문제가 발생할 위험이 기하급수적으로 올라간다. 합성곱 방식은 이미지를 스캔하기 위한 작은 필터 하나를 공유해서 쓰는 &amp;#39;가중치 공유(Weight sharing)&amp;#39; 방식을 사용하기 때문에 이러한 문제에서 자유롭다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;새의 움직임을 연속적으로 촬영한 사진을 여러 장 입력한다고 가정한다. 개별 사진 속에 있는 새는 사진 속 위치는 모두 다르지만 모두 동일한 새이다. &lt;/li&gt;
&lt;li&gt;모델이 이를 이해하기 위해서는 사진 속 새에 대한 특징을 추출하여 새의 위치가 바뀌더라도 이해할 수 있도록 신경망을 설계해야 한다. 이때 이미지를 1차원 데이터로 펴게 되면 공간 정보가 파괴되므로 적합하지 않다. &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;필터링&lt;/h2&gt;
&lt;p&gt;합성곱 연산이 일어나는 과정 그 자체.&lt;/p&gt;
&lt;p&gt;이미지 처리에서 필터링은 원본 이미지에 특정한 수학적 규칙이 담긴 필터를 이용해 원하는 정보만 걸러내거나 강조하는 작업을 말한다. 즉, 필터링은 이미지에서 필요한 핵심 패턴만 남기고 나머지를 가리는 작업이다. 여기서 사용되는 필터의 종류에 따라서 용도와 기능이 달라진다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;소벨 필터:&lt;/strong&gt; 윤곽선을 검출하는 필터.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;가우시안 필터:&lt;/strong&gt; 이미지의 노이즈를 제거하거나 이미지를 부드럽게 만드는 필터.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;적합한 커널을 선택하기 위해서는 알맞은 커널을 설계하는 것이 아니라, 데이터로부터 커널을 학습하는 접근법을 사용하면 된다. 즉, 딥러닝 프레임워크를 사용하여 데이터로부터 적합한 특징 추출기(필터)가 무엇인지를 알아내도록 학습시키는 것이다.&lt;/p&gt;
&lt;p&gt;전통적인 필터링은 인간이 필터를 직접 설계하여 사용해야 했기 때문에 필터를 구성하는 값이 고정되어 있었다. 하지만 딥러닝에서 다루는 필터는 모델의 최적화 과정을 통해 스스로 목적을 달성하기 위한 가장 적합한 필터의 값을 찾아내는 것이 가능하다. &lt;/p&gt;
&lt;p&gt;이처럼 딥러닝에서 학습을 수행한다는 것은 데이터의 특징을 가장 잘 뽑을 수 있는 필터의 값(가중치)을 찾는 것과 동일한 의미를 지닌다.&lt;/p&gt;</description>
      <category>Technology/AI (2026)</category>
      <author>Priv</author>
      <guid isPermaLink="true">https://arainablog.tistory.com/767</guid>
      <comments>https://arainablog.tistory.com/767#entry767comment</comments>
      <pubDate>Fri, 10 Apr 2026 01:21:28 +0900</pubDate>
    </item>
    <item>
      <title>Probabilistic Modeling</title>
      <link>https://arainablog.tistory.com/766</link>
      <description>&lt;h1&gt;생성형 모델 학습시키기&lt;/h1&gt;
&lt;p&gt;우리는 강아지를 찍은 이미지 $x$에 대한 확률 분포 $p(x)$를 학습하고자 한다. 이를 위해서는 어떻게 확률 분포를 대표할 것인지를 알아야 한다.&lt;/p&gt;
&lt;p&gt;생성형 모델을 학습시키기 위해서는 먼저 학습을 위한 훈련용 데이터 세트(Training Set)가 필요하며, 이 데이터 세트를 활용해 일반화할 수 있는 특징을 찾아야 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;강아지 이미지 1만 개 &amp;gt; 귀의 형태와 수, 꼬리의 유무, 색상, 코의 위치와 크기 등 특징 이해&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;생성형 모델에 제공하는 개별적인 데이터는 실제 세계에 존재하는 미지의 확률 분포에서 추출된 샘플($p_{data})$이라고 가정한다.&lt;/p&gt;
&lt;p&gt;생성형 모델을 최적화하기 위해 사용되는 파라미터 $\theta$의 집합을 모델 패밀리($M$)라고 부른다. 이 파라미터는 모델이 정의하는 확률 분포($p(\theta)$)를 결정하는 역할을 한다. 모델 패밀리와 사용자의 입력 데이터는 $d(p_{data}, p_{\theta})$만큼 떨어져 있으며, 최적화 단계를 거쳐 이 거리를 최소화해야 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;KL-Divergence:&lt;/strong&gt; 두 확률 분포가 얼마나 다른지 측정하는 지표&lt;/li&gt;
&lt;li&gt;KL-Divergence를 최소화하는 것은 모델에서 실제 데이터가 나타날 확률을 최대화하는 것과 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;모델 최적화&lt;/h1&gt;
&lt;p&gt;모델을 최적화한다는 것은 가장 효율적으로(확률은 최대로, 오류는 최소로) 작동하도록 모델의 파라미터를 조정하는 반복 작업을 의미한다. 즉, 생성 모델의 학습은 결국 실제 데이터라는 정답지에 모델을 가장 완벽하게 밀착시키기 위한 최적화 작업이라고 말할 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;최대화:&lt;/strong&gt; 정답(데이터)이 나타날 확률을 가장 높게 만든다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;최소화:&lt;/strong&gt; 정답과 모델 사이의 오차를 가장 낮게 만든다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;최적화의 목표는 &amp;#39;거대한 산맥에서 가장 높은 봉우리 찾기&amp;#39; 작업과 동일하다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;목적 함수:&lt;/strong&gt; 산의 지형.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;파라미터:&lt;/strong&gt; 현재 위치를 나타내는 좌표. 조금씩 움직이며 가장 높은 봉우리를 찾아야 한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;최적화 알고리즘:&lt;/strong&gt; 산을 어떻게 오를 것인지 결정하는 방법. (경사 하강법, Adam 등)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;처음 시작할 때는 산의 지형 아무 곳에서 시작한다. (랜덤 가중치)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;현재 위치가 얼마나 높은지(확률이 높은지) 확인한다. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;조금 더 높은 방향을 탐색해 그곳으로 이동한다. (경사로를 따라 가중치 갱신)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;더 이상 올라갈 곳이 없을 때(최대치에 도달했을 때) 학습이 완료되었음을 선언한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;확률&lt;/h1&gt;
&lt;p&gt;확률은 특징에 따라 종류가 아래와 같이 달라진다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;결합 확률 ($P(X, Y)$):&lt;/strong&gt; 여러 확률이 동시에 일어날 확률. 가로축($X$)과 세로축($Y$)이 교차하는 특정한 칸 하나의 값을 의미한다. (&amp;quot;오늘 비가 오고($X$) 기온이 20도 이상($Y$)일 확률&amp;quot;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;주변 확률 ($p(X)$ or $p(Y)$):&lt;/strong&gt; 특정 변수 하나에 집중하기 위해서 나머지 변수를 합친 확률. (&amp;quot;기온과 무관하게 오늘 비가 올 확률&amp;quot;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;조건부 확률 ($p(X \mid Y)$):&lt;/strong&gt; 어떤 사건($Y$)이 일어났다는 정보를 이미 알고 있을 때, 다른 사건($X$)이 일어날 확률. (&amp;quot;기온이 20도라고 확정했을 때, 비가 올 확률&amp;quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;VAE(Variational Autoencoder)가 사용하는 인코더와 디코더는 모두 조건부 확률 모델에 해당한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;인코더:&lt;/strong&gt; 입력 데이터가 주어졌을 때, 잠재 변수가 무엇일지 추론한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;디코더:&lt;/strong&gt; 잠재 변수가 주어졌을 때, 입력 데이터를 복원할 확률을 추론한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;확률 변수&lt;/h2&gt;
&lt;p&gt;확률에 따라 값이 바뀌는 변수.&lt;/p&gt;
&lt;p&gt;확률 변수 $X$가 특정 값 $a$를 가질 확률은 $p(X = a)$ 또는 $p(a)$로 표기한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;어떤 상황에서도 확률은 0보다 작을 수 없다. ($P(a) &amp;gt;= 0$)&lt;/li&gt;
&lt;li&gt;일어날 수 있는 모든 경우의 수를 합치면 반드시 100이 된다. ($\sum_{ }  ( ) = 1$)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;확률 변수는 데이터의 형태에 따라 2가지 종류로 구분된다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;이산 확률 변수 ($\sum_{x}xp(x)$):&lt;/strong&gt; 주사위, 동전 등 값이 끊어진다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;연속 확률 변수 ($\int_xp(x)dx$):&lt;/strong&gt; 이미지의 픽셀값, 몸무게 등 값이 연속적으로 이어진다.&lt;br&gt;이산 확률 변수는 끊어지는 &amp;#39;&lt;strong&gt;값을 더하는&lt;/strong&gt;&amp;#39; 방식이기 때문에 시그마를 사용하지만, 연속 확률 변수는 연속적으로 이어진 값으로 형성된 &amp;#39;&lt;strong&gt;면적을 더하는&lt;/strong&gt;&amp;#39; 방식이기 때문에 적분을 사용한다. &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;표본 평균&lt;/h2&gt;
&lt;p&gt;$E[x]=∑​_{x}x⋅1/m​$&lt;/p&gt;
&lt;p&gt;모든 데이터가 나타날 확률이 동일한 균등 분포(Uniform distribution) 상황에서 기대할 수 있는 값.&lt;br&gt;데이터 $m$개를 모두 더한 뒤, $1/m$를 곱하면 모든 데이터에 균등한 확률 가중치를 곱해 합산한 값이 된다. 이는 일반적인 산술 평균과 같은 의미를 지닌다.&lt;/p&gt;
&lt;h2&gt;분산&lt;/h2&gt;
&lt;p&gt;$var[x]=E[(x−E[x])^2]$&lt;/p&gt;
&lt;p&gt;데이터들이 평균($E[x]$)으로부터 얼마나 멀리 퍼졌는지 측정하는 지표.&lt;br&gt;분산을 계산하기 위한 수식은 아래와 같이 구성된다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;제곱 편차:&lt;/strong&gt; 개별 데이터가 평균에서 떨어진 거리를 구한 뒤 제곱하면 제곱 편차를 구할 수 있게 된다. 이 제곱 편차는 거리가 음수로 계산되지 않도록 막아주며, 평균에서 아주 멀리 떨어진 &amp;#39;튀는 값&amp;#39;에 더 큰 비중을 두기 위해서 사용된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;평균:&lt;/strong&gt; 제곱 편차로 계산된 거릿값을 이용해 평균을 계산한다. 이를 계산하면 데이터가 평균적으로 얼마나 넓게 퍼진 것인지 파악할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;차원의 저주&lt;/h1&gt;
&lt;p&gt;기본적인 형태의 이산 확률 분포를 다룬다고 가정하면 데이터를 생성할 때 가장 많이 사용되는 두 가지 이산 분포는 아래와 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;베르누이 분포:&lt;/strong&gt; 결과가 앞/뒤처럼 2가지만 있는 경우를 다룬다. 앞면이 나올 확률이 $p$라면 뒷면이 나올 확률은 $1-p$이다. 즉, 필요한 파라미터의 수는 1개뿐이다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;카테고리컬 분포:&lt;/strong&gt; 주사위처럼 결과가 $m$개인 경우를 다룬다. 모든 확률의 합은 반드시 1이며, 마지막 하나의 확률은 자동으로 결정된다. 즉, 필요한 파라미터의 수는 $m-1$개이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이처럼 이산 확률 특성을 보이는 데이터를 다룰 때는 큰 문제가 되지 않는다.&lt;/p&gt;
&lt;p&gt;만약 이미지처럼 다차원 데이터를 다룬다고 가정하면 이미지 픽셀 1개는 RGB 색상을 표현할 수 있다. 또한 각 채널은 255단계의 값을 가질 수 있다. 이를 바탕으로 픽셀이 표현할 수 있는 모든 색상 조합을 확률로 나타내면 $256 * 256 * 256 - 1$개이다. 만약, $28 * 28$ 사이즈의 아주 작은 흑백 이미지를 표현하더라도 모든 경우의 수를 확률로 나타낸다면 $2^{784}-1$개의 파라미터라는 결과가 나온다. &lt;/p&gt;
&lt;p&gt;이처럼 매우 작은 데이터임에도 다차원 데이터가 사용되기 시작하면 비현실적으로 많은 수의 파라미터가 요구되기 때문에 이를 단순한 확률표로 관리한다는 것은 불가능하다. 또한 각 변수가 독립된 관계라고 가정하더라도 픽셀 간의 연관성을 무시하게 되므로 모델의 성능이 떨어진다는 문제가 발생한다. &lt;/p&gt;
&lt;p&gt;이를 &amp;#39;&lt;strong&gt;차원의 저주&lt;/strong&gt;&amp;#39;라고 부른다.&lt;/p&gt;
&lt;h2&gt;연쇄 법칙&lt;/h2&gt;
&lt;p&gt;차원의 저주를 풀기 위해 전체 상황을 한꺼번에 보지 말고, 사건이 하나씩 차례대로 일어난다고 가정하는 &lt;strong&gt;연쇄 법칙&lt;/strong&gt;을 시도해 볼 수 있다. 하지만 이를 적용하더라도 파라미터의 수 자체가 줄어들지는 않기 때문에 문제를 완전히 해결할 수는 없다.&lt;/p&gt;
&lt;p&gt;단, 연쇄 법칙을 적용하게 되면 &amp;#39;&lt;strong&gt;$X_3$은 $X_1$과 무관하며, $X_2$에만 영향을 받는다&lt;/strong&gt;&amp;#39;는 가정을 세울 수 있게 된다.&lt;/p&gt;
&lt;h2&gt;조건부 독립&lt;/h2&gt;
&lt;p&gt;모든 변수가 연결된 것이 아니라, &amp;#39;부모 노드&amp;#39;에만 의존한다고 가정하여 파라미터 수를 줄인다. 이 조건부 독립을 활용하면 차원의 저주를 유발한 파라미터의 수를 줄일 수 있게 된다.&lt;/p&gt;
&lt;p&gt;두 확률 변수 $X$와 $Y$가 있을 때 제3의 변수 $Z$가 새로 주어졌다고 가정한다. 만약, $Y$를 아는 것이 $X$를 예측하는 데 아무런 도움이 되지 않는다면 $X$와 $Y$는 $Z$에 대해 &lt;strong&gt;조건부 독립&lt;/strong&gt;이다.&lt;/p&gt;
&lt;p&gt;조건부 독립은 일반 독립과 달리 원래는 관련이 있었으나, 공통의 원인을 알고 나서 관련성이 사라진 것을 의미한다. 즉, 조건이 성립되면 독립성을 보이게 됨을 의미한다.&lt;/p&gt;
&lt;h2&gt;베이즈 정리 (Bayes&amp;#39; rule)&lt;/h2&gt;
&lt;p&gt;조건부 확률을 역으로 나타내는 수학적 규칙으로 새로운 데이터나 정보 등 결과가 주어졌을 때 원인이 발생할 확률을 구할 수 있게 해준다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;그룹의 40%는 남성, 60%는 여성이다. 그중 남성의 50%는 흡연자, 여성의 30%는 흡연자이다. 만약 길거리에서 흡연자를 발견했을 때, 그 흡연자가 남성일 확률은 몇%인가?&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;베이즈 네트워크 (Bayesian Networks)&lt;/h2&gt;
&lt;p&gt;여러 개의 확률 변수가 서로 어떤 영향을 주고받는지 방향성이 있는 그래프로 표현된 모델로 베이즈 정리와 조건부 독립 가정을 바탕으로 한다.&lt;/p&gt;
&lt;p&gt;베이즈 네트워크에서는 각 변수를 하나의 노드로 두고, 변수 간의 인과관계를 연결하여 하나의 트리 구조를 형성한다. 이를 통해 모든 변수를 한꺼번에 계산하는 대신 각 변수가 자신의 부모 노드에만 의존한다는 조건부 독립 가정을 통해 계산량을 줄일 수 있다.&lt;/p&gt;
&lt;p&gt;이처럼 조건부 독립을 적용해 계산량을 줄이게 되면 파라미터의 수가 전체 변수의 수에 따라 기하급수적으로 늘어나지 않고, 각 노드의 부모 수에만 영향을 받게 된다. 부모 노드의 개수를 적게 유지할 수 있다면 그만큼 파라미터의 수도 억제할 수 있음을 의미하기 때문에 훨씬 경제적이다.&lt;/p&gt;
&lt;h1&gt;나이브 베이즈 알고리즘 (Naive Bayes)&lt;/h1&gt;
&lt;p&gt;복잡한 관계를 모두 버리고, 클래스별 특징만 따로 곱해서 계산한다.&lt;/p&gt;
&lt;p&gt;가장 일반적인 생성형 분류 알고리즘 중 하나로, 모든 특징은 라벨이 주어졌을 때 서로 독립적이라는 조건부 독립 가정을 바탕으로 한다.&lt;/p&gt;
&lt;p&gt;이메일 클라이언트 앱이 스팸인지 아닌지 분류한다고 가정할 때, 스팸 메일이면 $Y=1$, 스팸 메일이 아니면 $Y=0$이 된다. 여기서 나이브 베이즈 알고리즘은 단순히 분류만 하는 것을 넘어 스팸 메일은 보통 이런 단어들로 구성된다는 데이터 생성 원리를 학습할 수 있다. 단, 스팸 메일을 구성하는 &amp;#39;광고&amp;#39;, &amp;#39;대출&amp;#39;, &amp;#39;클릭&amp;#39; 등과 같은 단어들이 등장할 확률을 각각 따로 계산한다. 즉, 스팸 메일을 구성하는 특징($X_n$)은 모두 별개의 노드로 구성되는 것이다.&lt;/p&gt;
&lt;p&gt;나이브 베이즈는 계산이 매우 빠르고 파라미터 및 데이터가 적어도 적당한 성능을 보여준다는 장점이 있다. 하지만 은행이나 계좌처럼 강하게 연결된 단어들이 나와도 이를 독립적으로 판단하여 가중치가 중복으로 연산 되므로 때에 따라 정확도가 떨어질 수 있다.&lt;/p&gt;
&lt;h1&gt;판별 모델 (Discriminative Models)&lt;/h1&gt;
&lt;p&gt;데이터 $X$가 주어졌을 때 그 데이터의 라벨 $Y$가 무엇인지 예측하는 모델.&lt;br&gt;입력 데이터에 대한 정답의 조건부 확률을 직접 추정한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;메일 내용이 주어졌을 때, 이것이 스팸인지 아닌지 그 확률을 계산한다.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;판별 모델은 데이터 $X$가 주어졌을 때 데이터 라벨 $Y$를 분류하는 작업에만 효과가 있기 때문에 입력 데이터 $X$에 대한 확률 분포 $p(x)$에 대해서는 학습할 필요가 없다.&lt;/p&gt;
&lt;h2&gt;로지스틱 회귀 (Logistic Regression)&lt;/h2&gt;
&lt;p&gt;확률표를 만들지 않고, 입력값 $x$를 넣으면 결과 확률이 출력값으로 나오는 수학 함수를 사용한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;데이터가 이런 상황일 때 수학 함수에 데이터를 대입하면 계산되는 확률은 몇인가?&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 수학 함수의 출력값은 언제나 0 ~ 1 사이의 값이어야 한다. 이를 가능하게 만들기 위해 아무리 크거나 작은 숫자가 들어와도 0 ~ 1 사이의 값으로 반환해 주는 &amp;#39;&lt;strong&gt;시그모이드 함수&lt;/strong&gt;&amp;#39;를 활용한다. 또한 로지스틱 회귀에서는 각 특징에 가중치를 곱해서 모두 더하는 선형 결합 방식을 사용한다. 각 특징에 가중치가 더해지기 때문에 나이브 베이즈 방식보다 좀 더 상식적인 결과를 기대할 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;스팸 메일 여부 = ($x_1$ * &amp;#39;광고&amp;#39; 단어 가중치) + ($x_2$ * &amp;#39;대출&amp;#39; 단어 가중치) + ...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;로지스틱 회귀로 확률 모델을 정의할 때는 파라미터가 $n+1$개만 있으면 된다.&lt;br&gt;차원의 저주를 언급할 때 다루었던 것처럼 확률표 방식으로 이미지를 정의하면 픽셀의 수가 784개일 때 파라미터는 $2^{784}-1$개 필요했다. 하지만 로지스틱 회귀 방식을 사용하면 각 픽셀의 가중치 784개와 기본 편향 1개로 총 785개의 파라미터만 있으면 된다. &lt;/p&gt;
&lt;p&gt;기본 편향은 일차함수의 절편과 같은 역할을 하며, 데이터가 아무리 복잡해도 입력값만으로 설명할 수 없는 기본적인 성향을 모델에 부여하는 역할을 한다. 만약 기본 편향이 없다면 모든 입력값이 0일 때 결괏값도 무조건 0이 되어야 한다. 하지만 시그모이드 함수에서 $z = 0$은 확률 0.5(50%)를 의미하므로 &amp;#39;입력이 아무것도 없으면 무조건 확률이 50%이다&amp;#39;라는 제약적인 모델이 되어버린다.&lt;/p&gt;
&lt;h1&gt;신경망 모델&lt;/h1&gt;
&lt;p&gt;확률 모델을 구현할 때, 복잡한 확률 관계를 표로 표현하지 않고 인공신경망이라는 함수를 사용해 표현하는 방식의 모델. 인간 뇌의 뉴런 연결 구조를 모방하여 데이터 내의 복잡한 비선형 패턴을 학습하고 예측하도록 설계되었다. 신경망 모델은 &lt;strong&gt;입력층, 은닉층, 출력층&lt;/strong&gt;으로 구성되어 있다. 뉴런 모델의 기본 단위는 &lt;strong&gt;뉴런&lt;/strong&gt;이며 &lt;strong&gt;레이어&lt;/strong&gt;로 조직된다. &lt;/p&gt;
&lt;p&gt;이산 분포처럼 모든 경우의 수에 대한 레시피를 적는 &amp;#39;표 방식&amp;#39;으로는 차원의 저주에서 자유롭지 못하다. 그 반면에 신경망 모델 방식은 비선형 패턴을 학습하여 만들어진 함수를 사용하기 때문에 학습이 완료되면 완전히 새로운 데이터가 유입되어도 일정한 결과를 기대할 수 있다.&lt;/p&gt;
&lt;p&gt;신경망 모델은 가중치 조정과 반복 수행을 통해 정확한 출력을 만들어내기 위한 최적화 과정을 수행한다. 처음에는 무의미한 랜덤 가중치를 적용하여 결과를 내놓고, 실제 정답과 이를 비교하며 가중치를 반복적으로 조정한다. 이 과정은 안정적인 결과물이 나올 때까지 수없이 반복된다.&lt;/p&gt;
&lt;p&gt;신경망 모델의 각 레이어는 계산 결과가 일정 수준을 넘으면 다음 단계로 중요한 정보를 넘긴다. 표가 아닌 연결의 힘을 기준으로 정답을 찾기 때문에 방대한 양의 파라미터 표가 없어도 복잡한 이미지나 영상도 반복 훈련을 통해 처리할 수 있게 된다.&lt;/p&gt;
&lt;h1&gt;경험적 최대 우도 추정 (Empirical Maximum Likelihood)&lt;/h1&gt;
&lt;p&gt;가지고 있는 실제 데이터를 바탕으로 모델이 그 데이터를 생성했을 확률이 가장 높도록 모델의 파라미터를 찾아내는 수학적 방법론. &lt;/p&gt;
&lt;p&gt;KL-Divergence 값(실제 데이터 분포와 모델 분포 사이의 거리)을 최소화하는 목표를 실천하는 구체적인 계산법 중 하나에 해당한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;최대 우도:&lt;/strong&gt; &amp;quot;어떤 파라미터를 사용해야 지금 보고 있는 데이터들이 나타날 확률이 가장 높은가?&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;경험적:&lt;/strong&gt; 세상의 모든 데이터를 알 수는 없으므로, 실제로 수집한 경험(데이터 세트)에 의존하여 확률을 계산해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$m$개의 데이터 ${x^{(1)}, x^{(2)}, \dots, x^{(m)}}$가 있다고 가정했을 때, 이 데이터들이 동시에 나타날 확률을 최대화하는 파라미터를 찾아야 한다. 여기서 확률은 0 ~ 1 사이의 작은 값을 사용하기 때문에 곱셈을 반복하면 숫자가 과도하게 작아지므로, 로그를 사용하여 곱셈을 덧셈으로 바뀌어 계산될 수 있도록 설정해 사용한다.&lt;/p&gt;
&lt;p&gt;강아지를 그리는 로봇을 제작한다고 가정한다면 먼저 로봇에게 실제 강아지 사진을 제공해야 할 것이다. 이 강아지 사진은 &amp;#39;&lt;strong&gt;실증적 데이터&lt;/strong&gt;&amp;#39;가 된다. 로봇은 설정값을 조금씩 바꿔가면서 &amp;#39;어떤 설정일 때 이 100장의 강아지 사진이 나올 법한가&amp;#39;를 분석해 나간다. 이 분석 과정은 &amp;#39;&lt;strong&gt;최적화&lt;/strong&gt;&amp;#39;가 된다. 최종적으로 100장의 강아지 사진이 나올 확률이 가장 높은 설정값을 로봇이 선정해 출력한다. 이 출력은 &amp;#39;&lt;strong&gt;최대 우도 추정&lt;/strong&gt;&amp;#39;의 결과물이 된다. 즉, 여기서 강아지를 그리는 로봇은 &amp;#39;처음 제공한 실증적 데이터가 모두 정답이라고 믿고, 그 정답이 나올 확률이 가장 높은 모델의 가중치를 찾으라&amp;#39;는 명령을 수행한 것과 같다.&lt;/p&gt;
&lt;h2&gt;베지안 네트워크에 MLE(최대 우도 추정) 적용하기&lt;/h2&gt;
&lt;p&gt;전체 시스템의 확률을 최적화하기 위해서 개별 노드에 대한 최적화를 독립적으로 진행하는 방법으로, 로그의 성질을 적용하여 전체 확률을 곱셈이 아닌 덧셈으로 바꾸는 방식을 사용한다.&lt;/p&gt;
&lt;p&gt;전체 확률은 원래 노드 간의 곱셈으로 연결되어 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$p(X_1​,…,X_n​) = p(X_1​ \mid P_{a1}​) × p(X_2​ \mid P_{a2}​) × ⋯ × p(X_n​ \mid P_{an}​)$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;여기에 로그를 적용하여 노드 간의 덧셈으로 변환한다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$log\ p(X_1​, … ,X_n​) = \sum_{i = 1}^nlog\ p(X_i​ \mid P_{ai}​)$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이제 정답이 나올 가장 높은 확률을 찾는 최적화 작업(현재 데이터들을 가장 잘 설명할 수 있는 최적의 파라미터를 찾는 작업)을 수행하기 위해 각 노드의 파라미터를 개별적으로 조절할 수 있게 되었다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$max_{\theta}​ \sum log\ p(X_i​ \mid P_ai​,\theta_i​) = \sum​ max_{\theta_i}\ log\ p(X_i​ \mid P_ai​,\theta_i​)$&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;가우시안 분포(정규 분포)에서의 MLE(최대 우도 추정)&lt;/h2&gt;
&lt;p&gt;가우시안 분포에서의 MLE를 적용한다는 것은 데이터의 평균과 분산을 계산하는 것과 수학적으로 동일한 의미를 가진다. 가우시안 분포에서는 평균($\mu$)과 분산($\sigma$)을 조정하여 데이터가 나타날 확률을 최대화하는 값을 찾는 것이 목표이다.&lt;/p&gt;
&lt;p&gt;가우시안 분포의 확률 밀도 함수를 보면 지수 함수가 포함되어 있어 계산이 복잡하다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$p(x \mid \mu,\sigma^2) = 1/\sqrt{2\pi\sigma^2}\ exp(-(x-\mu)^2/2\sigma^2)$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;자연로그를 사용해 지수를 내리면서 간단한 덧셈 형태로 변환하면 아래와 같이 식이 변한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\ln \ p(x \mid \mu,\sigma^2) = -1/2\ln(2\pi\sigma^2) - (x - \mu)^2/2\sigma^2$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;자연로그를 적용한 상태에서 로그 우도를 합산하면 식의 결괏값 최대화를 위해 오차 제곱($\sum(x_i - \mu)^2$)을 최소화해야 함을 알 수 있다. 이는 데이터와 평균 사이의 거리 제곱(오차)을 최소로 만드는 &lt;strong&gt;최소제곱법&lt;/strong&gt;의 원리에 해당한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\sum\ln p(x_i \mid \mu,\sigma^2) = (constant) - \sum(x_i - \mu)^2/2\sigma^2$&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Q. 표준편차를 구할 때 왜 제곱을 사용하는가?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;출처: &lt;a href=&quot;https://brunch.co.kr/@gimmesilver/85&quot;&gt;https://brunch.co.kr/@gimmesilver/85&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;표준편차는 데이터가 평균에서 얼마나 흩어져 있는지를 정량적으로 구한 값을 말한다.&lt;br&gt;일반적으로 표준편차를 계산하기 위해 데이터와 평균 사이의 거리를 구할 때 음수값이 생기지 않도록 평균과의 거리에 제곱을 취한다. 표준편차의 공식은 각 데이터를 &amp;#39;어떤 기준이 되는 값&amp;#39;으로 뺀 값의 제곱 값 평균을 구한 뒤 그 값에 제곱근을 취하는 방식이다. 만약 어떤 기준이 되는 값을 모른다면, 평균 대신 다양한 값을 대입해 표준편차 결과가 최소가 되는 값을 찾아야 할 것이다. 이 값을 실제로 연산해 보면 &lt;strong&gt;평균&lt;/strong&gt;이 나온다. &lt;/p&gt;
&lt;p&gt;즉, 평균은 &amp;#39;&lt;strong&gt;편차를 제곱하는 방식으로 데이터들의 거리를 계산할 때 전체 합이 최소가 되는 기준값&lt;/strong&gt;&amp;#39;이라고 정의할 수 있다.&lt;/p&gt;
&lt;p&gt;절댓값을 사용해서 표준편차(평균과의 편차)를 계산할 경우, 결괏값은 거리의 총합이 최소가 되는 값이 아니다. 즉, 흩어진 정도를 공정하게 측정하는 것이 불가능해진다. 절댓값을 이용해 거리를 구한 총합이 최소가 되게 하는 기준점은 중앙값이기 때문에 절댓값을 이용해 데이터의 흩어진 정도를 구한다면 각 데이터에서 평균 대신 중앙값을 빼야 한다. 이렇게 구한 편차를 &lt;strong&gt;절대편차&lt;/strong&gt;라고 부른다.&lt;/p&gt;
&lt;p&gt;최소제곱법은 $y$와 $y&amp;#39;$의 차이에 제곱한 값들의 합이 최소가 되도록 $y&amp;#39;$를 만드는 회귀식을 찾는 방법이다. 표준편차를 최소로 하는 기준값이 평균이었으므로, 최소제곱법을 통해 구한 회귀식은 &amp;#39;&lt;strong&gt;조건부 평균&lt;/strong&gt;&amp;#39;임을 알 수 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;MLE 원칙을 신경망 모델로 확장하기&lt;/h2&gt;
&lt;p&gt;데이터를 가장 잘 설명하는 확률 분포의 파라미터를 신경망이 스스로 계산하고, 그 신경망이 내놓은 값이 실제 데이터와 최대한 비슷해지도록(확률이 높아지도록) 가중치를 조정하는 작업. 즉, MLE 원칙을 뉴럴 모델로 확장한다는 것은 확률 분포의 매개변수를 고정된 숫자가 아닌, 함수를 이용해 상황에 맞게 연산한다는 것을 의미한다. &lt;/p&gt;
&lt;p&gt;가우시안 MLE는 데이터 전체를 가장 잘 설명하는 하나의 평균($\mu$)를 찾는 것을 목표로 하지만 뉴럴 모델 MLE는 입력에 따라 항상 달라지는 평균을 내뱉는 함수($f_\theta$)를 찾는 것을 목표로 한다. 이 때문에 가우시안 MLE는 결과물이 숫자이지만, 뉴럴 모델 MLE는 결과물이 신경망의 가중치이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;가우시안 MLE:&lt;/strong&gt; 모든 학생에게 동일한 평균 점수 부여&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;신경망 MLE:&lt;/strong&gt; 학생의 공부 시간을 보고 예상 점수를 계산하는 함수 제작&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;편향-분산 트레이드 오프&lt;/h1&gt;
&lt;p&gt;모델이 학습을 수행할 때, 학습용 데이터 세트(Training Set)의 범위를 넘어 지나친 일반화를 막기 위해 두 종류의 오차(편향과 분산)를 최소화할 때 겪는 문제.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;편향:&lt;/strong&gt; 잘못된 가정을 했을 때 발생하는 오차. 편향 값이 높으면 데이터의 특징과 결과물 간의 적절한 관계를 놓치는 과소 적합 문제가 발생한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;분산:&lt;/strong&gt; 트레이닝 세트에 내재한 작은 변동 때문에 발생하는 오차. 분산 값이 높으면 큰 노이즈까지 모델링에 포함되는 과적합 문제가 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;모델을 선택할 때는 학습용 데이터 세트의 규칙을 정확하게 포착하는 것을 넘어 보이지 않는 범위에 대한 일반화까지 고려하는 것이 이상적이다. 하지만, 이 둘을 완벽하게 달성하는 것은 현실적으로 불가능하다. 학습용 데이터 세트의 규칙을 정확하게 포착하는 것에 성공하면 유연성이 떨어져서 일반화 성능이 떨어지고(과적합), 모델이 너무 단순하면 트레이닝 데이터에서 중요한 규칙을 포착하지 못하는 문제(과소 적합)가 발생한다. &lt;/p&gt;
&lt;h2&gt;과적합(Overfitting) 피하기&lt;/h2&gt;
&lt;p&gt;과적합을 피하기 위한 방법으로는 &lt;strong&gt;데이터, 모델 구조, 학습 과정&lt;/strong&gt;으로 측면을 나눠서 고려해 볼 수 있다.&lt;br&gt;별도의 검증 데이터 세트을 사용하여 일반화 성능을 평가하는 방법을 사용할 수도 있다. 과적합이 발생하지 않는다면 (판별 모델링에서처럼) 로그 우도 값은 훈련 세트와 검증 세트 모두와 유사해야 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;데이터양 늘리기:&lt;/strong&gt; 가장 확실한 방법이다. 데이터가 많아지면 모델은 특정 점보다는 전체적인 흐름에 집중하게 된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 증강하기:&lt;/strong&gt; 데이터가 부족하면 기존의 데이터를 변형(노이즈 강화, 이미지 회전, 색 변경 등)해서 새로운 데이터처럼 활용하는 방법이다. 모델이 본질에 집중하게 만드는 데 효과적이다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;모델의 복잡도 줄이기:&lt;/strong&gt; 신경망의 층을 줄이거나, 뉴런의 개수를 줄여서 모델의 표현력을 의도적으로 낮추는 방법이다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;드롭아웃:&lt;/strong&gt; 학습할 때마다 신경망의 뉴런을 무작위로 몇 개씩 죽이는 방법이다. 특정 뉴런에만 의존할 수 없게 만들어 모델이 일반화에 더 특화되도록 유도한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;가중치 규제:&lt;/strong&gt; 가중치 값이 너무 커지면 모델이 예민해지므로 가중치 크기를 손실 함수에 더하여 과도하게 가중치가 커지지 않도록 조절한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;조기 종료:&lt;/strong&gt; 학습을 반복하면 훈련 오차는 줄지만, 검증 오차가 올라가는 시점이 발생한다. 이 순간이 오면 학습 자체를 조기 종료시킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;조건부 생성 모델&lt;/h1&gt;
&lt;p&gt;데이터를 만들 때 조건을 지정하여 해당 조건을 만족하는 결과물을 만들도록 제한하는 모델.&lt;/p&gt;
&lt;p&gt;조건부 생성 모델은 조건에 맞는 생성, 조건에 맞는 분류에 대한 것만 알고 있으면 충분한 성능을 기대할 수 있다. 즉, 조건부 생성 모델에서는 더 적은 파라미터로도 정확한 정답을 맞힐 수 있음을 기대할 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;텍스트로 된 프롬프트를 이용해 이미지 생성하기 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;조건부이기 때문에 여기서는 결합 분포($p(X, Y)$)가 아닌 조건부 분포($p(Y \mid X)$)를 사용한다. 즉, 질문($X$)가 무엇인지 보다는 질문($X$)에 가장 적합한 응답($Y$)가 무엇인지에 집중한다. &lt;/p&gt;
&lt;p&gt;조건부 손실함수에 해당하는 $−log\ p_\theta​(y \mid x)$는 MLE(최대 우도 추정)을 조건부 환경으로 변형한 것이다. 조건부 생성 모델의 목표는 모델이 내놓은 정답 확률을 최대화하는 것이다. 그러므로 손실함수의 결괏값은 최소가 되어야 한다. 여기서 조건부 손실함수는 &amp;#39;&lt;strong&gt;조건 $X$가 주어졌을 때, 정답 $Y$를 맞추지 못하면 페널티를 부여한다&lt;/strong&gt;&amp;#39;는 의미를 담고 있다. 즉, 조건부 생성 모델은 입력 데이터($p(X)$) 그 자체를 이해하지 않고, 입력이 주어졌을 때의 결과가 나올 확률($p(Y \mid X)$)을 높이는 데만 집중하므로, 사용되는 손실함수도 오직 조건부 확률에만 의존하는 것이다.&lt;/p&gt;</description>
      <category>Technology/AI (2026)</category>
      <author>Priv</author>
      <guid isPermaLink="true">https://arainablog.tistory.com/766</guid>
      <comments>https://arainablog.tistory.com/766#entry766comment</comments>
      <pubDate>Thu, 9 Apr 2026 00:39:14 +0900</pubDate>
    </item>
    <item>
      <title>Data &amp;amp; AI</title>
      <link>https://arainablog.tistory.com/765</link>
      <description>&lt;h1&gt;데이터 (Data)&lt;/h1&gt;
&lt;p&gt;AI가 예측과 결정을 내리는 데 사용하는 자원(materials).&lt;br&gt;이미지, 텍스트, 비디오, 오디오 등 기계가 읽을 수 있다면 뭐든지 데이터가 될 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;개는 데이터가 아니지만, 개를 찍은 사진은 데이터가 될 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;인공 지능 (AI)&lt;/h1&gt;
&lt;p&gt;기계로 구현된 &amp;#39;인공 지능&amp;#39;.&lt;br&gt;컴퓨터 시스템을 활용하여 인간의 지능을 요구하는 작업을 수행할 수 있도록 만드는 연구 분야이기도 하다.&lt;/p&gt;
&lt;h2&gt;머신 러닝 (Machine Learning)&lt;/h2&gt;
&lt;p&gt;데이터로부터 패턴을 학습하고, 입력된 적 없는 데이터를 일반화하여 명시적인 지시 없이도 작업을 수행할 수 있도록 만드는 통계 알고리즘 연구 분야.&lt;/p&gt;
&lt;h2&gt;딥 러닝 (Deep Learning)&lt;/h2&gt;
&lt;p&gt;머신러닝의 하위 분야로, 신경망을 활용하여 작업을 수행하는 데 중점을 둔다.&lt;/p&gt;
&lt;h2&gt;판별 모델 (Discriminative models)&lt;/h2&gt;
&lt;p&gt;데이터 분류하기&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Many - to - One Mapping (다수의 입력으로 한 가지 결과물을 생성한다)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;데이터 $X$가 주어졌을 때, 그것이 어떤 클래스 $Y$에 속하는지 경계를 찾는 것에 집중하는 모델.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;이 이미지는 고양이 이미지인가, 강아지 이미지인가?&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;클래스 간의 차이를 학습하고, 객관식 형태의 정답을 고르는 형태로 동작한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이미지 입력 &amp;gt; 판별 &amp;gt; 라벨 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;생성 모델 (Generative models)&lt;/h2&gt;
&lt;p&gt;데이터 분류 &amp;amp; 데이터 생성 원리 학습하기&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One - to - Many Mapping (하나의 입력으로 다수의 결과물을 생성한다)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;결합 확률 또는 데이터의 확률 분포를 모델링한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;개는 보통 어떻게 생겼는가?&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;학습 데이터의 분포를 모방하면 그와 유사한 새로운 데이터를 생성할 수 있게 된다. 즉, 무엇이 개인지 알 수 있다면, 개 이미지를 그릴 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;라벨 입력 &amp;gt; 생성 &amp;gt; 이미지 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;생성 모델은 판별 모델이 수행할 수 있는 모든 일을 수행할 수 있다. 또한 라벨을 이용해 없던 데이터를 새로 생성하거나, 기존의 데이터 중 손상된 일부분을 생성(복원)하는 등의 새로운 작업도 수행할 수 있다.&lt;/p&gt;
&lt;h1&gt;확률적 모델 (그래픽 엔진)&lt;/h1&gt;
&lt;p&gt;그래픽 엔진은 프로그래밍 언어로 정의된 규칙에 따라 정형화된 3D 모델을 렌더링한다. &lt;/p&gt;
&lt;p&gt;프로그래밍 언어를 사용하여 추상적으로 표현된 명령어는 그래픽 엔진에 의해 형성된 3D 모델과 1:1로 매칭되는 형태이다. 정해진 수치와 규칙에 따라 똑같은 결과가 나오기 때문에 &amp;#39;&lt;strong&gt;결정론적&lt;/strong&gt;&amp;#39; 과정을 생각하기 쉽지만, 생성 모델의 관점에서는 &amp;#39;&lt;strong&gt;확률적 접근&lt;/strong&gt;&amp;#39;으로 해석한다.&lt;/p&gt;
&lt;p&gt;렌더링 결과물에 영향을 미치는 파라미터는 &amp;#39;&lt;strong&gt;확률 변수&lt;/strong&gt;&amp;#39;이다.&lt;br&gt;&amp;#39;&lt;strong&gt;잠재 변수&lt;/strong&gt;&amp;#39; $Z$는 물체의 종류, 크기, 회전 각도, 위치, 조명의 밝기 등을 의미한다. 30도 회전한 의자를 코드로 정의한다고 가정하면 30도, 의자 등의 값이 선정된 $Z$에 해당한다. $Z$는 무한한 가능성을 가지고 있다. 또한 $Z$에 의해 어떠한 특정 이미지가 렌더링 될 확률은 그 이미지를 구성하는 요소($Z$)가 선택될 확률 분포에 기반한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;잠재 변수 $Z$가 주어졌을 때, 이미지 $X$가 나타날 확률&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;코드는 고정되어 있으나, 입력값을 확률 분포상 무작위로 샘플링하여 넣는 순간, 출력되는 이미지 $X$ 역시 확률적으로 결정되는 결과물이라고 볼 수 있다.&lt;/p&gt;
&lt;h1&gt;통계적 모델 (생성형 AI)&lt;/h1&gt;
&lt;p&gt;생성형 AI는 입력된 데이터를 학습하여 규칙을 정의하고, 이를 바탕으로 결과물을 생성한다.&lt;/p&gt;
&lt;p&gt;&amp;#39;침대가 있는 방&amp;#39;에 대한 수많은 이미지 데이터를 학습시키면 모델은 무엇이 침대가 있는 방인지 일반적인 규칙인 &amp;#39;침대가 있는 방의 생성 원리&amp;#39;를 수식으로 정의한다. 왜 데이터 $X$가 하필 이러한 결과물로 나오게 되었는지를 정의하게 되면 침대가 있는 방 이미지를 생성하라는 명령에 맞는 다양한 이미지를 생성할 수 있게 된다.&lt;/p&gt;
&lt;p&gt;이는 세상의 데이터는 항상 그 데이터를 만들어내는 규칙이 존재한다고 가정했을 때 성립한다. 수많은 관측 데이터 $X$로부터 그 $X$를 만들어내는 통계적 파라미터($\theta$), 잠재적 원인($Z$)을 찾아내는 과정이 모델링의 과정이 된다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;수만 장의 필기체 a 사진을 보고, a라는 문자의 형태와 특징을 통계적으로 분석해 공식화하는 것.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;머신러닝 알고리즘 3대 구성요소&lt;/h1&gt;
&lt;h2&gt;모델 (Model)&lt;/h2&gt;
&lt;p&gt;데이터가 어떻게 생겼으리라는 것을 의미하는 수학적인 가정.&lt;br&gt;관찰된 데이터 $X$를 설명하기 위해 어떤 수학적 틀(함수 또는 분포)을 사용할 것인지 결정한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;이 데이터의 분포는 평균을 중심으로 종 모양의 그래프(가우시안)를 그릴 것이다.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;학습 목표 (Learning Objective)&lt;/h2&gt;
&lt;p&gt;모델이 데이터를 얼마나 잘 설명하는지 측정하는 척도.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;원하는 데이터가 나오기 위한 확률(가능도)을 극대화하는 방법은 무엇인가?&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;확률은 6면체 주사위를 던졌을 때(원인), 숫자 1(결과)이 나올 가능성을 다룬다.&lt;br&gt;가능도는 숫자 1(결과)이 나왔을 때, 6면체 주사위가 정상(원인)일 가능성을 다룬다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;내가 보고 있는 지금 이 데이터 $X$가 나오려면 모델 $A$는 어떤 형태여야 하는가?&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;원하는 데이터가 나오기 위한 확률을 극대화한다는 것은 모델의 파라미터($\theta$)를 계속 수정하여 실제 데이터와 모델이 예측하는 분포를 최대한 일치하게 만든다는 것을 의미한다. 즉, 모델이 결과를 정확하게 설명할 수 있도록 파라미터를 조정하는 것이다.&lt;/p&gt;
&lt;h2&gt;최적화 알고리즘 (Optimization Algorithm)&lt;/h2&gt;
&lt;p&gt;목표를 달성하기 위해 모델의 파라미터를 (반복적으로) 수정해 나가는 방법.&lt;br&gt;모델을 학습 목표에 맞게 파라미터를 구체적인 연산 절차를 통해 조정하면서 가능도를 극대화한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;변분 추론 (Variational Inference; VI)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;#39;비슷한 모양을 골라서 최적화&amp;#39;하는 방식으로 동작하며, 속도가 매우 빨라 딥러닝에 적합하다.&lt;/li&gt;
&lt;li&gt;정해진 틀 안에서만 파라미터를 탐색하기 때문에 복잡한 분포를 사용하면 정확도가 떨어지기 쉽다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;마코프 연쇄 몬테카를로 (Markov Chain Monte Carlo; MCMC)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;#39;수만 번 점을 찍으면서 생긴 분포도로 최적화&amp;#39;하는 방식으로 동작하며, 속도가 매우 느리지만 이론적으로 가장 정확하다.&lt;/li&gt;
&lt;li&gt;잠재 공간 $Z$를 무작위로 돌아다니면서 점을 찍는다. 확률이 높은 곳은 오래 점이 머물기 때문에 찍힌 점의 밀도가 정답 분포의 모양이 된다.&lt;/li&gt;
&lt;li&gt;시간만 충분하다면 어떤 복잡한 분포라도 이론적으로 완벽한 정답을 찾을 수 있지만 계산량이 기하급수적으로 늘어나기 때문에 대용량 데이터 분석에는 적합하지 않다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;딥러닝 분야에서는 수백만 개가 넘는 대용량 데이터를 빠르게 처리하는 성능을 요구하기 때문에 MCM보다는 변분 추론을 선호한다고 한다.&lt;/p&gt;</description>
      <category>Technology/AI (2026)</category>
      <author>Priv</author>
      <guid isPermaLink="true">https://arainablog.tistory.com/765</guid>
      <comments>https://arainablog.tistory.com/765#entry765comment</comments>
      <pubDate>Wed, 8 Apr 2026 23:57:41 +0900</pubDate>
    </item>
    <item>
      <title>repr( )과 str( )</title>
      <link>https://arainablog.tistory.com/758</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Python Logo.jpg&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be4ujs/dJMcahwlD15/yxpBuOJraDTCTukLLT7uGk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be4ujs/dJMcahwlD15/yxpBuOJraDTCTukLLT7uGk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be4ujs/dJMcahwlD15/yxpBuOJraDTCTukLLT7uGk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe4ujs%2FdJMcahwlD15%2FyxpBuOJraDTCTukLLT7uGk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;203&quot; data-filename=&quot;Python Logo.jpg&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;203&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 문자열&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Python은 문자열을 다룰 때 정말 강력한 성능을 발휘하는 언어 중 하나입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;문자열을 자르고, 붙이고, 곱하고, 더하는 등 직관적이고 사고공학적(?)인 구조를 지니고 있어 유연하게 활용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;문자열을 가공할 때는 물론, 문자열을 출력할 때도 이러한 Python의 장점이 발휘됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;repr( )과 str( )이 그것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. repr( )&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;문자열로 객체를 다시 생성하고자 할 때 사용됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1767946337077&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import datetime

a = datetime.datetime(2017, 9, 27)
str(a)
&amp;gt;&amp;gt;&amp;gt; '2017-09-27 00:00:00'

a = datetime.datetime(2017, 9, 27)
repr(a)
&amp;gt;&amp;gt;&amp;gt; 'datetime.datetime(2017, 9, 27, 0, 0)'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;문자열로 출력하더라도, repr( )은 객체 타입에 대한 정보가 유실되지 않기 때문에 개발자가 해당 문자열을 다루기가 쉽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. str( )&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;문자열을 단순히 출력하기 위해서 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;str( )을 사용해 문자열을 출력하게 되면 출력 결과물로써 남을 뿐, repr( )처럼 객체 타입에 대한 정보를 온전하게 저장하지는 않습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1767946515055&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import datetime

a = datetime.datetime(2017, 9, 27)
str(a)
&amp;gt;&amp;gt;&amp;gt; '2017-09-27 00:00:00'

a = datetime.datetime(2017, 9, 27)
repr(a)
&amp;gt;&amp;gt;&amp;gt; 'datetime.datetime(2017, 9, 27, 0, 0)'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;수고하셨습니다!&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;</description>
      <category>Technology/Python</category>
      <author>Priv</author>
      <guid isPermaLink="true">https://arainablog.tistory.com/758</guid>
      <comments>https://arainablog.tistory.com/758#entry758comment</comments>
      <pubDate>Fri, 9 Jan 2026 17:15:42 +0900</pubDate>
    </item>
    <item>
      <title>catch2, Undefined symbols for architecture 에러 극복기</title>
      <link>https://arainablog.tistory.com/750</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;C++ Logo.png&quot; data-origin-width=&quot;1822&quot; data-origin-height=&quot;2048&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuxf3f/btszYlPop9j/xcYefYjh264KZ0uqIQ9ZGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuxf3f/btszYlPop9j/xcYefYjh264KZ0uqIQ9ZGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuxf3f/btszYlPop9j/xcYefYjh264KZ0uqIQ9ZGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcuxf3f%2FbtszYlPop9j%2FxcYefYjh264KZ0uqIQ9ZGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;337&quot; data-filename=&quot;C++ Logo.png&quot; data-origin-width=&quot;1822&quot; data-origin-height=&quot;2048&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. C++ 진짜 싫다&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;아니 대체 이런 언어를 왜 쓰는 거죠.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;프레임워크를 설치하든, 코드를 짜든, 문법 배운 거 실습을 하든 도통 뭘 하든 간에 제대로 돌아가는 꼴을 못 봤습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;버전은 어마어마하고, 책임은 몽땅 프로그래머한테 떠넘기고, OS마다 컴파일러마다 파편화는 아찔한 수준이고, 패키지든 프레임워크든 뭐 하나 설치만 하면 에러부터 뿜어대고...&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;Catch2요?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;아니 유닛 테스트를 위해서 쓸 수 있는 좋은 프레임워크라고 소개하면 뭐 합니까, 설치해서 쓸려고 해도 에러만 토해내는데!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;초보자 입장인 저에게는 C++이 너무나도 싫습니다. 문법 괴팍하다고 한동한 멀리하던 Python이 선녀로 보이는 수준입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;아니 패키지 설치하라고 할 때마다, 새로운 문법을 하나씩 배울 때마다 늘 새롭고 재밌지가 않아요. 겁부터 난다고요. 이게 맞아요, 진짜?!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style2&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Catch2&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Catch2는 C++에서 사용할 수 있는 유닛 테스트용 프레임워크입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;책에서 그렇게 말하더군요. 설치했죠. 샘플 코드가 깃허브에 있길래 그대로 받아 적었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1756106839701&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define CATCH_CONFIG_MAIN
#include &amp;lt;catch2/catch_test_macros.hpp&amp;gt;

#include &amp;lt;cstdint&amp;gt;

uint32_t factorial( uint32_t number ) {
    return number &amp;lt;= 1 ? number : factorial(number-1) * number;
}

TEST_CASE( &quot;Factorials are computed&quot;, &quot;[factorial]&quot; ) {
    REQUIRE( factorial( 1) == 1 );
    REQUIRE( factorial( 2) == 2 );
    REQUIRE( factorial( 3) == 6 );
    REQUIRE( factorial(10) == 3'628'800 );
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1756106728574&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;====================[ Build | C_pp_Study | Debug ]==============================
/Applications/CLion.app/Contents/bin/cmake/mac/aarch64/bin/cmake --build /Users/___/Documents/GitHub/___/C-pp-Study/cmake-build-debug --target C_pp_Study -j 6
[2/2] Linking CXX executable C_pp_Study
FAILED: C_pp_Study&amp;nbsp;
: &amp;amp;&amp;amp; /usr/bin/c++ -g -arch arm64 -Wl,-search_paths_first -Wl,-headerpad_max_install_names &amp;nbsp;CMakeFiles/C_pp_Study.dir/main.cpp.o -o C_pp_Study &amp;nbsp; &amp;amp;&amp;amp; :
Undefined symbols for architecture arm64:
&amp;nbsp; &quot;Catch::makeTestInvoker(void (*)())&quot;, referenced from:
&amp;nbsp; &amp;nbsp; &amp;nbsp; ___cxx_global_var_init in main.cpp.o
&amp;nbsp; &quot;Catch::AutoReg::AutoReg(Catch::Detail::unique_ptr&amp;lt;Catch::ITestInvoker&amp;gt;, Catch::SourceLineInfo const&amp;amp;, Catch::StringRef, Catch::NameAndTags const&amp;amp;)&quot;, referenced from:
&amp;nbsp; &amp;nbsp; &amp;nbsp; ___cxx_global_var_init in main.cpp.o
&amp;nbsp; &quot;Catch::StringRef::StringRef(char const*)&quot;, referenced from:
&amp;nbsp; &amp;nbsp; &amp;nbsp; ___cxx_global_var_init in main.cpp.o
&amp;nbsp; &quot;_main&quot;, referenced from:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;initial-undefines&amp;gt;
ld: symbol(s) not found for architecture arm64
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;완벽하게도 에러를 뱉습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;조금 검색을 해보니 심볼 링크가 제대로 안 돼서 그렇다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이때부터 억울해졌습니다. homebrew에서 패키지 형태로 설치하고, 샘플 코드를 그대로 복사해 실행한 게 다였다고요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;chatGPT는 신기하게 C++ 관련 질문을 던지면 바보가 되어버립니다. 처음부터 포기하고 Gemini를 열심히 괴롭혔죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그랬더니 설치된 패키지를 찾을 수 있도록 CMAKE 텍스트를 수정해야 한다면서 아래와 같은 코드를 적어줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1756106995988&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.10)
project(프로젝트이름)

set(CMAKE_CXX_STANDARD 17)

# Homebrew로 설치된 Catch2를 찾습니다.
# Catch2가 설치되어 있지 않으면 오류가 발생할 수 있습니다.
find_package(Catch2 REQUIRED)

add_executable(프로젝트이름 
    main.cpp
)

# Catch2 라이브러리를 실행 파일에 연결합니다.
# Catch2::Catch2WithMain은 main() 함수가 포함된 라이브러리입니다.
target_link_libraries(프로젝트이름 PRIVATE Catch2::Catch2WithMain)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그랬더니 세상에, 진짜 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;혹시나 싶어서 프로젝트 이름 부분만 바꿔 처음 시도했던 'AutoBrake' 부분에도 적용해 보았습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1756107105518&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/Users/____/Documents/GitHub/____/C-pp-Study/cmake-build-debug/C_pp_Study -r xml -d yes --order lex AutoBrake
Testing started at 16:31 ...
Run with rng-seed=2448172018
Process finished with exit code 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;...되네요. AI 없었으면 진작에 &quot;이런 미친!&quot; 하면서 때려치웠을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 진짜?&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1756107355474&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Catch2/docs/cmake-integration.md at devel &amp;middot; catchorg/Catch2&quot; data-og-description=&quot;A modern, C++-native, test framework for unit-tests, TDD and BDD - using C++14, C++17 and later (C++11 support is in v2.x branch, and C++03 on the Catch1.x branch) - catchorg/Catch2&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/catchorg/Catch2/blob/devel/docs/cmake-integration.md#catchcmake-and-catchaddtestscmake&quot; data-og-url=&quot;https://github.com/catchorg/Catch2/blob/devel/docs/cmake-integration.md&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgVM37/hyZC9bRMYR/oIJxZ6vkBMWk57mF1YZcH1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bg4H5e/hyZCXid1BB/n2ooUli4bqDwQ61brZmPik/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/catchorg/Catch2/blob/devel/docs/cmake-integration.md#catchcmake-and-catchaddtestscmake&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/catchorg/Catch2/blob/devel/docs/cmake-integration.md#catchcmake-and-catchaddtestscmake&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgVM37/hyZC9bRMYR/oIJxZ6vkBMWk57mF1YZcH1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bg4H5e/hyZCXid1BB/n2ooUli4bqDwQ61brZmPik/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Catch2/docs/cmake-integration.md at devel &amp;middot; catchorg/Catch2&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A modern, C++-native, test framework for unit-tests, TDD and BDD - using C++14, C++17 and later (C++11 support is in v2.x branch, and C++03 on the Catch1.x branch) - catchorg/Catch2&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;설마요. 진짜 때려치웠다가는 CS 전공생 주제에 C++도 못 다루는 허접이 되어버립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;나중에 알았습니다. Catch2 도큐먼트를 다시 자세히 찾아보니까 Gemini가 답변해 준 사항과 동일한 코드를 정리해 둔 페이지가 있더군요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;뭐가 됐든 AI 없이도 답은 찾았겠지만, 여태 접해본 언어 중에서 C++가 가장 피곤하고 어려운 언어라는 생각은 변함없을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style7&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;수고하셨습니다!&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style7&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;</description>
      <category>Technology/C++</category>
      <author>Priv</author>
      <guid isPermaLink="true">https://arainablog.tistory.com/750</guid>
      <comments>https://arainablog.tistory.com/750#entry750comment</comments>
      <pubDate>Mon, 25 Aug 2025 16:44:33 +0900</pubDate>
    </item>
    <item>
      <title>가정법 표현</title>
      <link>https://arainablog.tistory.com/749</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;language_17048392.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ps7PX/btsOrpj69iB/nM1HEXHmwZDQmq4QGl4OG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ps7PX/btsOrpj69iB/nM1HEXHmwZDQmq4QGl4OG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ps7PX/btsOrpj69iB/nM1HEXHmwZDQmq4QGl4OG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fps7PX%2FbtsOrpj69iB%2FnM1HEXHmwZDQmq4QGl4OG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;200&quot; height=&quot;200&quot; data-filename=&quot;language_17048392.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 가정법 과거완료&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;과거의 일은 미련이 남기 마련입니다. &quot;그때 조금만 더 ~를 했다면 ~했을 텐데!&quot;처럼요.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;사실 지난 일을 되돌리는 건 불가능합니다. 하지만 묘사는 가능하죠.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;가정법 표현은 이러한 경우에 주로 사용됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;현재 벌어진 결과에 대해 아쉬움과 미련 등을 묘사하기 위해 특정 조건을 가정하여 말합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&quot;과거에 있었던 일에 대해 그보다 더 과거가 되는 시점에서 '무언가'를 행한다면 달라졌을 텐데!&quot;라는 표현을 사용할 때는 가정법 과거완료를 사용합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;여기서 독특하게도, 조건(IF)과 결과(Result)의 순서를 바꾸는 것도 가능합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;If I hadn't been ill, I would have gone to the party.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;I would have gone to the party if I hadn't been ill.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;시제를 살펴보면 조건이 되는 If ~ 문장은 과거완료, 결과 부분의 문장은 현재완료임을 알 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;아쉬움이 현재까지 이어지고 있으므로 현재완료(영국 영어)를 사용했다고 볼 수 있을 것 같습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;또한, 실제로 벌어진 일이 아니라 말 그대로 '가정'이기 때문에 would도 함께 사용했음을 알 수 있죠.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;이처럼, 가정법 과거완료는&amp;nbsp;&lt;b&gt;이미 지나간 과거의 '또 다른 과거'를 상상할 때&lt;/b&gt;&amp;nbsp;사용합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;즉,&amp;nbsp;&lt;b&gt;이러한 조건(IF)이었다면, 지나간 과거가 이러한 결과(Result)로 변화했을 것이다&lt;/b&gt;를 상상하는 겁니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;여기서 시제를 살펴보면 앞서 언급한 것처럼 &lt;b&gt;조건도 과거, 결과도 과거&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;대신 조건이 결과보다 현재를 시점으로 봤을 때 '더 오래된 과거'가 되겠죠.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;If I had understood the instructions properly, I would have passed the exam.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;We wouldn't have got lost if my phone hadn't run out of battery.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style2&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 혼합 가정법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;언제나 가정법이 과거에 머물러야 한다는 법은 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;과거의 조건과 현재의 결과, 현재의 조건과 과거의 결과가 뒤섞이는 것도 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1. 과거의 조건과 현재의 결과&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'과거에 이러한 조건(IF)이 만족했다면/만족하지 못했다면, 현재는 이러한 결과(Result) 일 거야'와 같은 표현이 대표적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 경우에도 가정법이기 때문에 would는 동일하게 사용되지만, 가정은 과거이고 결과는 현재이므로, 가정(IF)에서만 과거형 표현을 사용해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;If I hadn't got the job in Tokyo, I wouldn't be with my current partner.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;결과가 현재 시점이 되었다고 해서 조건의 시제가 과거완료에서 과거로 '앞당겨지지'는 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2. 현재의 조건과 과거의 결과&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'현재 이러한 조건(IF)이라면/이 아니라면, 과거는 이러한 결과(Result)였을 거야/가 아니었을 거야'와 같은 표현이 대표적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;현재 시점에서 조건을 걸기 때문에 아까와 정반대로 시제가 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;It's really important. If it wasn't, I wouldn't have called you on your holiday.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;자료 출처&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1755754587401&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Conditionals: third and mixed&quot; data-og-description=&quot;Do you know how to use third conditionals and mixed conditionals?&amp;nbsp;Test what you know with interactive exercises and read the explanation to help you.&quot; data-og-host=&quot;learnenglish.britishcouncil.org&quot; data-og-source-url=&quot;https://learnenglish.britishcouncil.org/grammar/b1-b2-grammar/conditionals-third-mixed&quot; data-og-url=&quot;https://learnenglish.britishcouncil.org/grammar/b1-b2-grammar/conditionals-third-mixed&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TyD1a/hyZDVcstii/uUgLsRuEWcYHOTiQM1OSu0/img.jpg?width=722&amp;amp;height=482&amp;amp;face=0_0_722_482,https://scrap.kakaocdn.net/dn/BFPQo/hyZCYm2Vkj/MmOfoXjLD2doOJ6xtkKqX1/img.jpg?width=325&amp;amp;height=217&amp;amp;face=0_0_325_217&quot;&gt;&lt;a href=&quot;https://learnenglish.britishcouncil.org/grammar/b1-b2-grammar/conditionals-third-mixed&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learnenglish.britishcouncil.org/grammar/b1-b2-grammar/conditionals-third-mixed&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/TyD1a/hyZDVcstii/uUgLsRuEWcYHOTiQM1OSu0/img.jpg?width=722&amp;amp;height=482&amp;amp;face=0_0_722_482,https://scrap.kakaocdn.net/dn/BFPQo/hyZCYm2Vkj/MmOfoXjLD2doOJ6xtkKqX1/img.jpg?width=325&amp;amp;height=217&amp;amp;face=0_0_325_217');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Conditionals: third and mixed&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Do you know how to use third conditionals and mixed conditionals?&amp;nbsp;Test what you know with interactive exercises and read the explanation to help you.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learnenglish.britishcouncil.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style7&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;수고하셨습니다!&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style7&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;</description>
      <category>English Grammer Basic</category>
      <author>Priv</author>
      <guid isPermaLink="true">https://arainablog.tistory.com/749</guid>
      <comments>https://arainablog.tistory.com/749#entry749comment</comments>
      <pubDate>Thu, 21 Aug 2025 14:50:27 +0900</pubDate>
    </item>
    <item>
      <title>템플릿 클래스의 람다식 형식 추론</title>
      <link>https://arainablog.tistory.com/748</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;C++ Logo.png&quot; data-origin-width=&quot;1822&quot; data-origin-height=&quot;2048&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuxf3f/btszYlPop9j/xcYefYjh264KZ0uqIQ9ZGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuxf3f/btszYlPop9j/xcYefYjh264KZ0uqIQ9ZGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuxf3f/btszYlPop9j/xcYefYjh264KZ0uqIQ9ZGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcuxf3f%2FbtszYlPop9j%2FxcYefYjh264KZ0uqIQ9ZGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;337&quot; data-filename=&quot;C++ Logo.png&quot; data-origin-width=&quot;1822&quot; data-origin-height=&quot;2048&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 템플릿&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;템플릿은 C++에서 제네릭을 구현하기 위해 사용되는 문법입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;타입을 고정시키지 않고 경우에 따라 다양한 타입의 값을 받아 동작시킬 수 있기 때문에 보다 유연하고, 재사용성이 높은 코드를 작성하는 것이 가능해집니다.&lt;/p&gt;
&lt;pre id=&quot;code_1755675970759&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;template &amp;lt;typename T&amp;gt;
struct AutoBrake {
    AutoBrake(const T&amp;amp; publish) : publish{ publish } {}

    void observe(const SpeedUpdate&amp;amp; cd) {}
    void observe(const CarDetected&amp;amp; cd) {}

    void set_collision_threshold_s(double x) {
        collision_threshold_s = x;
    }

    double get_speed_mps() const {
        return speed_mps;
    }

private:
    double collision_threshold_s;
    double speed_mps;
    const T&amp;amp; publish;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style2&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 타입 추론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;템플릿으로 구현된 제네릭 클래스, 제네릭 함수 등을 사용할 때는 &amp;lt; &amp;gt; 기호를 사용하여 현재 사용하고자 하는 타입을 명시해 주는 것이 일반적입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;하지만 C++도 업데이트를 거치며 해당 타입을 따로 명시하지 않아도 추론을 통해 자동으로 타입을 대입해 사용하는 것이 가능해졌습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;다만 타입 추론의 허용 범위가 버전이 업데이트되면서 조금씩 바뀌었기 때문에 자신의 컴파일러 버전에 맞게 문법을 확인할 필요가 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;figure id=&quot;og_1755676924053&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;#19. [모던 C++] 개선된 템플릿(C++11, C++14, C++17, C++20)&quot; data-og-description=&quot;(C++11~) extern으로 템플릿 선언을 할 수 있으며, 템플릿 인스턴스 중복 생성을 없앨 수 있습니다. (C++11~) 템플릿 오른쪽 꺽쇠 괄호 파싱을 개선하여 템플릿 인스턴스화시 &amp;gt;가 중첩되어 &amp;gt;&amp;gt;와 같이 되&quot; data-og-host=&quot;tango1202.github.io&quot; data-og-source-url=&quot;https://tango1202.github.io/cpp/modern-cpp-template/&quot; data-og-url=&quot;https://tango1202.github.io/cpp/modern-cpp-template/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://tango1202.github.io/cpp/modern-cpp-template/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tango1202.github.io/cpp/modern-cpp-template/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;#19. [모던 C++] 개선된 템플릿(C++11, C++14, C++17, C++20)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;(C++11~) extern으로 템플릿 선언을 할 수 있으며, 템플릿 인스턴스 중복 생성을 없앨 수 있습니다. (C++11~) 템플릿 오른쪽 꺽쇠 괄호 파싱을 개선하여 템플릿 인스턴스화시 &amp;gt;가 중첩되어 &amp;gt;&amp;gt;와 같이 되&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tango1202.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1. C++ 17 이전&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1755676685104&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void initial_speed_is_zero() {
    AutoBrake&amp;lt;std::function&amp;lt;void(const BrakeCommand&amp;amp;)&amp;gt;&amp;gt; auto_brake{ [](const BrakeCommand&amp;amp;) {} };
    assert_that(auto_brake.get_speed_mps() == 0L, &quot;speed not equal 0&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;함수 템플릿만 인수를 추론할 수 있고, 클래스 템플릿은 인수를 추론할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 때문에 위 코드와 같이 AutoBrake 클래스를 사용할 때 타입을 명시적으로 작성해주어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2. C++ 17 이후&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1755676830711&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void initial_speed_is_zero() {
    AutoBrake auto_brake{ [](const BrakeCommand&amp;amp;) {} };
    assert_that(auto_brake.get_speed_mps() == 0L, &quot;speed not equal 0&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;C++ 17 이후부터는 인수 추론이 가능해지므로 위와 같이 타입을 따로 명시하지 않아도 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(다만 Apple Clang 17 버전을 사용하고 있음에도 컴파일러가 위와 같은 코드에 대해 타입을 명시해야 한다는 에러를 발생시켰기 때문에 플랫폼마다 또 차이가 발생하는 것으로 보입니다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style7&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;수고하셨습니다!&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style7&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;</description>
      <category>Technology/C++</category>
      <author>Priv</author>
      <guid isPermaLink="true">https://arainablog.tistory.com/748</guid>
      <comments>https://arainablog.tistory.com/748#entry748comment</comments>
      <pubDate>Wed, 20 Aug 2025 17:02:39 +0900</pubDate>
    </item>
    <item>
      <title>대문자와 아포스트로피 활용하기</title>
      <link>https://arainablog.tistory.com/747</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;language_17048392.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ps7PX/btsOrpj69iB/nM1HEXHmwZDQmq4QGl4OG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ps7PX/btsOrpj69iB/nM1HEXHmwZDQmq4QGl4OG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ps7PX/btsOrpj69iB/nM1HEXHmwZDQmq4QGl4OG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fps7PX%2FbtsOrpj69iB%2FnM1HEXHmwZDQmq4QGl4OG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;200&quot; height=&quot;200&quot; data-filename=&quot;language_17048392.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 대문자 활용법&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;대문자를 활용하는 방법을 논한다면 문장의 첫 글자를 대부분 떠올릴 것입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;물론 그것도 맞지만 의외로 더 많은, 다양한 활용법이 존재합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.1. 날, 달, 휴일 등을 나타낼 때&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;주(week), 달(month), 행사가 있는 날 등을 표기하고자 할 때 대문자로 표기합니다. 단, 계절을 표기할 때는 사용하지 않습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;His birthday party is on Thursday.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;It rains a lot in April and May, but the summer is very dry.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.2. 사람 또는 장소의 이름을 나타낼 때&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;사람의 이름, 장소의 명칭 등을 나타낼 때도 대문자로 표기합니다. 거리, 행성, 국가, 대륙도 이에 포함됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;Bea Jankowski has lived on Church Street in Manchester for 20 years.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;The Earth is the third planet from the Sun.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;장소 이름에서 나온 단어(언어, 국적, 국가, 지역, 도시의 사람, 사물을 가리키는 형용사 등)도 대문자로 표기합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;또한 종교의 이름에서 나온 명사와 형용사도 대문자로 표기합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;Some Canadians speak French.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;Londoners eat a lot of Indian food.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.3. 제목, 기관의 이름을 나타낼 때&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;조직이나 기관의 이름, 작품의 제목 등을 나타낼 때도 대문자로 표기합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;사람의 직업을 이름 앞에 표기할 때도 대문자로 표기합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;만약 제목이 이름과 별개인 경우에는 이름만 대문자로 표기합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;The chief executive officer lives in New York.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;We are reading&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;War and Peace&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;with Ms Ioana, our teacher.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style2&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 아포스트로피&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;축약 표현을 사용할 때 주로 등장하는 아포스트로피( ' )의 사용법도 함께 알아봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1. 축약 표현&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아포스트로피를 가장 많이, 흔하게 볼 수 있는 경우가 축약 표현입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;It's raining. (It's == It is)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;Don't worry, it won't rain (Don't == Do not / won't == will not)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서 It's는 It is와 더불어 It has의 축약 표현으로도 쓰일 수 있으므로 혼동하지 않도록 주의해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;It's rained a lot this week. (It's == It has)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2. 소유물 표현&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;가리키는 대상이 소유물임을 나타낼 때도 아포스트로피가 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일반적으로 사람, 동물, 조직 등과 같은 소유자를 먼저 작성하고, 그 뒤에 s를 붙여서 표현합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;My cat's favourite toy is a small, red ball.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;Sadiq's parents live in Liverpool.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.3. 단수형 표현, 복수형 표현&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;소유자가 단수형일 때는 소유자 명사 뒤에 &lt;i&gt;'s&lt;/i&gt;를 붙여서 표현합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;Marie's mother is going to Hong Kong.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;소유자가 복수형이며, s로 끝나지 않는 명사일 때도 동일합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;My cousin writes children's books.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;만약 소유자가 복수형이며, s로 끝나는 명사인 경우에는 아포스트로피만 s 뒤에 붙입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;This is a picture of my parents' house.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;만약 소유자가 단수형인데 s로 끝나는 명사인 경우에는 's를 붙입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;James's brother-in-law is German.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;자료 출처&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1755601646559&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Capital letters and apostrophes&quot; data-og-description=&quot;Do you know how to use capital letters and apostrophes correctly?&amp;nbsp;Test what you know with interactive exercises and read the explanation to help you.&quot; data-og-host=&quot;learnenglish.britishcouncil.org&quot; data-og-source-url=&quot;https://learnenglish.britishcouncil.org/grammar/b1-b2-grammar/capital-letters-apostrophes&quot; data-og-url=&quot;https://learnenglish.britishcouncil.org/grammar/b1-b2-grammar/capital-letters-apostrophes&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bKByNX/hyZDb0Kkyj/j7LWCDbuVoEUycUAVjJBc0/img.jpg?width=1200&amp;amp;height=800&amp;amp;face=378_172_550_361,https://scrap.kakaocdn.net/dn/NN0md/hyZzAHtVZx/rkT2GmeXLnlsRwM9fNNSGk/img.jpg?width=325&amp;amp;height=217&amp;amp;face=103_49_148_98&quot;&gt;&lt;a href=&quot;https://learnenglish.britishcouncil.org/grammar/b1-b2-grammar/capital-letters-apostrophes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learnenglish.britishcouncil.org/grammar/b1-b2-grammar/capital-letters-apostrophes&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bKByNX/hyZDb0Kkyj/j7LWCDbuVoEUycUAVjJBc0/img.jpg?width=1200&amp;amp;height=800&amp;amp;face=378_172_550_361,https://scrap.kakaocdn.net/dn/NN0md/hyZzAHtVZx/rkT2GmeXLnlsRwM9fNNSGk/img.jpg?width=325&amp;amp;height=217&amp;amp;face=103_49_148_98');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Capital letters and apostrophes&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Do you know how to use capital letters and apostrophes correctly?&amp;nbsp;Test what you know with interactive exercises and read the explanation to help you.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learnenglish.britishcouncil.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style7&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;수고하셨습니다!&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style7&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;</description>
      <category>English Grammer Basic</category>
      <author>Priv</author>
      <guid isPermaLink="true">https://arainablog.tistory.com/747</guid>
      <comments>https://arainablog.tistory.com/747#entry747comment</comments>
      <pubDate>Tue, 19 Aug 2025 20:07:50 +0900</pubDate>
    </item>
    <item>
      <title>영국 영어와 미국 영어</title>
      <link>https://arainablog.tistory.com/746</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;language_17048392.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ps7PX/btsOrpj69iB/nM1HEXHmwZDQmq4QGl4OG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ps7PX/btsOrpj69iB/nM1HEXHmwZDQmq4QGl4OG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ps7PX/btsOrpj69iB/nM1HEXHmwZDQmq4QGl4OG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fps7PX%2FbtsOrpj69iB%2FnM1HEXHmwZDQmq4QGl4OG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;200&quot; height=&quot;200&quot; data-filename=&quot;language_17048392.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 영국어, 미국어&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;사실 외국인 입장에서 보면 뭐가 뭔지 구분이 잘 안 갑니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;영국인 미국인이 한국어랑 조선어랑 같이 놓고 본다고 해서 제대로 구분할 수 있을까 싶긴 하지만, 생각해 보니 그거랑 좀 다른 성격 같으니까 없던 일로 하고 넘어갑시다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;아무튼, 그럼에도 유심히 잘 살펴보면 생각보다 차이가 나는 편입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;lt;블랙 호크 다운&amp;gt; 영화에서도 나온 대사인 &quot;Shall we?&quot;가 영국 영어였다는 걸 알고서 충격받은 건 덤입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style2&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 현재완료 시제와 단순 과거 시제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;저는 시제가 매우 싫습니다. 하지만 매일같이 사용되는 문법이기 때문에 절대 피할 수 없죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;역설적이게도 그 덕분에 영국 영어와 미국 영어를 쉽게 구분할 수 있는 힌트가 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;영국 영어에서는 현재에 영향을 미치는 과거의 사건/행동을 표현할 때 현재완료 시제를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;미국 영어에서는 현재 시점에서 보았을 때 이미 완료된/끝난 사건/행동의 경우 단순 과거 시제를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이러한 표현을 사용할 때는 &lt;i&gt;already, just, yet &lt;/i&gt;등과 같은 형용사가 주로 함께 사용되죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 영국 영어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;He isn't hungry. He has already had lunch.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;Have you done your homework yet? / Yes, I've just finished it.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 미국 영어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;He isn't hungry. He already had lunch.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;Did you do your homework yet? / Yes, I just finished it.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. get - got - got / get - got - gotten&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;영국 영어에서 사용되는&lt;i&gt; get&lt;/i&gt; 동사의 과거 분사는 &lt;i&gt;got&lt;/i&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;미국 영어에서는 &lt;i&gt;gotten&lt;/i&gt;이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;have got&lt;/i&gt;은 영국과 미국 모두 구어체 또는 필요에 따라서는 자연스럽게 쓰인다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하지만&amp;nbsp;&lt;i&gt;have gotten&lt;/i&gt;을 어느 쪽에서도 쓰지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 영국 영어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;You could have got hurt!&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;He's got very thin.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;Have you got any money?&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 미국 영어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;You could have gotten hurt!&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;He's gotten very thin.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;Have you got any money?&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 집합 명사와 함께 쓰이는 동사의 형태 변화&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;집합 명사는 말 그대로 '집합'의 개념을 다루는 명사입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;가족, 팀, 경찰 등과 같이 집합으로 다룰 수 있는 대상은 주변에서도 쉽게 찾아볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이러한 집합 명사를 다룰 때 영국 영어에서는 단수/복수형 동사를 모두 허용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하지만 미국 영어에서는 단수형 동사만 허용하죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;물론, 경찰처럼 복수형 동사만 허용하는 예외도 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 영국 영어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;My family is/are visiting from Korea.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;My team is/are winning the match.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;The police are investigating the crime.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 미국 영어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;My family is visiting from Korea.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;My team is winning the match.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;The police are invesitgating the crime.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. have와 take&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;영국 영어에서는 have와 take를 bath, shower, wash, break, holiday, rest 등과 같은 명사와 함께 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;즉, ~한 행동을 '취하다', '가지다' 등과 같이 표현할 수 있는 대상을 나타낼 때 have와 take를 모두 사용할 수 있다고 이해하면 알기 쉽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;반면에 미국 영어에서는 take만 허용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 영국 영어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;I'm going to have/take a shower.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;Let's have/take a break, have a Kit Kat!&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 미국 영어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;I'm going to take a shower.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Let's take a break.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. shall&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;영국 영어에서는 상대방에게 무언가를 제안할 때 &lt;i&gt;Shall I...?&lt;/i&gt; 또는 &lt;i&gt;Shall We...?&lt;/i&gt;라는 표현을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하지만 미국 영어에서는 &lt;i&gt;Shall&lt;/i&gt;이라는 표현 자체가 잘 쓰이지 않는다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그 대신 &lt;i&gt;Should/Can I...?&lt;/i&gt; 또는 &lt;i&gt;Do you want/Would you like...?&lt;/i&gt; 또는&lt;i&gt; How about...?&lt;/i&gt; 등의 표현이 주로 쓰인다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 영국 영어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;It's hot in here. Shall I open the window?&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;Shall we meet in the cafe at 5?&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 미국 영어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;It's hot in here. Can I open the window?&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;Do you want to meet in the cafe at 5?&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;자료 출처&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1754903085147&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;British English and American English&quot; data-og-description=&quot;Do you know any differences between British and American English?&amp;nbsp;Test what you know with interactive exercises and read the explanation to help you.&quot; data-og-host=&quot;learnenglish.britishcouncil.org&quot; data-og-source-url=&quot;https://learnenglish.britishcouncil.org/grammar/b1-b2-grammar/british-english-american-english&quot; data-og-url=&quot;https://learnenglish.britishcouncil.org/grammar/b1-b2-grammar/british-english-american-english&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/WScjO/hyZyn1hC63/HnY2eYqBcbc2nrhHBfTbZK/img.jpg?width=1200&amp;amp;height=800&amp;amp;face=0_0_1200_800,https://scrap.kakaocdn.net/dn/XxJ80/hyZuIzeVfG/pXu0pLznn7KDAn8xDNKUK0/img.jpg?width=325&amp;amp;height=217&amp;amp;face=0_0_325_217&quot;&gt;&lt;a href=&quot;https://learnenglish.britishcouncil.org/grammar/b1-b2-grammar/british-english-american-english&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learnenglish.britishcouncil.org/grammar/b1-b2-grammar/british-english-american-english&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/WScjO/hyZyn1hC63/HnY2eYqBcbc2nrhHBfTbZK/img.jpg?width=1200&amp;amp;height=800&amp;amp;face=0_0_1200_800,https://scrap.kakaocdn.net/dn/XxJ80/hyZuIzeVfG/pXu0pLznn7KDAn8xDNKUK0/img.jpg?width=325&amp;amp;height=217&amp;amp;face=0_0_325_217');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;British English and American English&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Do you know any differences between British and American English?&amp;nbsp;Test what you know with interactive exercises and read the explanation to help you.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learnenglish.britishcouncil.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style7&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;수고하셨습니다!&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style7&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;</description>
      <category>English Grammer Basic</category>
      <author>Priv</author>
      <guid isPermaLink="true">https://arainablog.tistory.com/746</guid>
      <comments>https://arainablog.tistory.com/746#entry746comment</comments>
      <pubDate>Mon, 11 Aug 2025 18:35:11 +0900</pubDate>
    </item>
  </channel>
</rss>