blog/public/2022/12/vae의-손실-함수/index.html

302 lines
18 KiB
HTML

<!DOCTYPE html>
<html lang="en" dir="auto">
<head><meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="robots" content="index, follow">
<meta name="apple-mobile-web-app-capable" content="yes">
<title>VAE의 손실 함수 | Morgan&#39;s Blog</title>
<meta name="keywords" content="">
<meta name="description" content="VAE의 손실 함수는 Variational Lower Bound(VLB)라고도 불리는데, 이 함수는 VAE에서 사용되는 정보량을 측정하는데 사용됩니다. 이 함수는 두 부분으로 나뉘어져 있으며, 이를 분리하여 계산하는 것이 일반적입니다. 이 때, reparametrization trick이란 기법을 사용하면 VAE의 손실 함수의 그래디언트를 계산하는 데 도움이 될 수 있습니다.
먼저, VAE의 손실 함수는 아래와 같이 정의됩니다.
$$L = \mathbb{E}{q(z|x)}[\log p(x|z)] - D{KL}(q(z|x)||p(z))$$
여기서 $p(x|z)$는 인코더의 출력을 디코더의 입력으로 넣었을 때 생성되는 값을 의미하고, $p(z)$는 잠재 변수의 확률 분포를 의미합니다.">
<meta name="author" content="Me">
<link rel="canonical" href="http://blog.morgan.kr/2022/12/vae%EC%9D%98-%EC%86%90%EC%8B%A4-%ED%95%A8%EC%88%98/">
<script type="text/javascript">
let vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`);
</script>
<link crossorigin="anonymous" href="/assets/css/stylesheet.dde9171333af37b8e856933e0deb815c09f761bbd3ee0e6826d3a1309b808533.css" integrity="sha256-3ekXEzOvN7joVpM&#43;DeuBXAn3YbvT7g5oJtOhMJuAhTM=" rel="preload stylesheet" as="style">
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG&#43;9vmJ0cTS&#43;ovo0FeA="
onload="hljs.initHighlightingOnLoad();"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js" onload="renderMathInElement(document.body);"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
renderMathInElement(document.body, {
delimiters: [
{left: "$$", right: "$$", display: true},
{left: "$", right: "$", display: false}
]
});
});
</script>
<link rel="icon" href="https://blog.morgan.kr/favicon.ico">
<meta name="theme-color" content="#2e2e33">
<meta name="msapplication-TileColor" content="#2e2e33">
<noscript>
<style>
#theme-toggle,
.top-link {
display: none;
}
</style>
</noscript><meta property="og:title" content="VAE의 손실 함수" />
<meta property="og:description" content="VAE의 손실 함수는 Variational Lower Bound(VLB)라고도 불리는데, 이 함수는 VAE에서 사용되는 정보량을 측정하는데 사용됩니다. 이 함수는 두 부분으로 나뉘어져 있으며, 이를 분리하여 계산하는 것이 일반적입니다. 이 때, reparametrization trick이란 기법을 사용하면 VAE의 손실 함수의 그래디언트를 계산하는 데 도움이 될 수 있습니다.
먼저, VAE의 손실 함수는 아래와 같이 정의됩니다.
$$L = \mathbb{E}{q(z|x)}[\log p(x|z)] - D{KL}(q(z|x)||p(z))$$
여기서 $p(x|z)$는 인코더의 출력을 디코더의 입력으로 넣었을 때 생성되는 값을 의미하고, $p(z)$는 잠재 변수의 확률 분포를 의미합니다." />
<meta property="og:type" content="article" />
<meta property="og:url" content="http://blog.morgan.kr/2022/12/vae%EC%9D%98-%EC%86%90%EC%8B%A4-%ED%95%A8%EC%88%98/" /><meta property="article:section" content="posts" />
<meta property="article:published_time" content="2022-12-15T11:21:46+00:00" />
<meta property="article:modified_time" content="2022-12-15T11:21:46+00:00" /><meta property="og:site_name" content="Morgan&#39;s Blog" />
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="VAE의 손실 함수"/>
<meta name="twitter:description" content="VAE의 손실 함수는 Variational Lower Bound(VLB)라고도 불리는데, 이 함수는 VAE에서 사용되는 정보량을 측정하는데 사용됩니다. 이 함수는 두 부분으로 나뉘어져 있으며, 이를 분리하여 계산하는 것이 일반적입니다. 이 때, reparametrization trick이란 기법을 사용하면 VAE의 손실 함수의 그래디언트를 계산하는 데 도움이 될 수 있습니다.
먼저, VAE의 손실 함수는 아래와 같이 정의됩니다.
$$L = \mathbb{E}{q(z|x)}[\log p(x|z)] - D{KL}(q(z|x)||p(z))$$
여기서 $p(x|z)$는 인코더의 출력을 디코더의 입력으로 넣었을 때 생성되는 값을 의미하고, $p(z)$는 잠재 변수의 확률 분포를 의미합니다."/>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [,
{
"@type": "ListItem",
"position": 2 ,
"name": "Posts",
"item": "http://blog.morgan.kr/posts/"
},
{
"@type": "ListItem",
"position": 3 ,
"name": "VAE의 손실 함수",
"item": "http://blog.morgan.kr/2022/12/vae%EC%9D%98-%EC%86%90%EC%8B%A4-%ED%95%A8%EC%88%98/"
}
]
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "VAE의 손실 함수",
"name": "VAE의 손실 함수",
"description": "VAE의 손실 함수는 Variational Lower Bound(VLB)라고도 불리는데, 이 함수는 VAE에서 사용되는 정보량을 측정하는데 사용됩니다. 이 함수는 두 부분으로 나뉘어져 있으며, 이를 분리하여 계산하는 것이 일반적입니다. 이 때, reparametrization trick이란 기법을 사용하면 VAE의 손실 함수의 그래디언트를 계산하는 데 도움이 될 수 있습니다.\n먼저, VAE의 손실 함수는 아래와 같이 정의됩니다.\n$$L = \\mathbb{E}{q(z|x)}[\\log p(x|z)] - D{KL}(q(z|x)||p(z))$$\n여기서 $p(x|z)$는 인코더의 출력을 디코더의 입력으로 넣었을 때 생성되는 값을 의미하고, $p(z)$는 잠재 변수의 확률 분포를 의미합니다.",
"keywords": [
],
"articleBody": "VAE의 손실 함수는 Variational Lower Bound(VLB)라고도 불리는데, 이 함수는 VAE에서 사용되는 정보량을 측정하는데 사용됩니다. 이 함수는 두 부분으로 나뉘어져 있으며, 이를 분리하여 계산하는 것이 일반적입니다. 이 때, reparametrization trick이란 기법을 사용하면 VAE의 손실 함수의 그래디언트를 계산하는 데 도움이 될 수 있습니다.\n먼저, VAE의 손실 함수는 아래와 같이 정의됩니다.\n$$L = \\mathbb{E}{q(z|x)}[\\log p(x|z)] - D{KL}(q(z|x)||p(z))$$\n여기서 $p(x|z)$는 인코더의 출력을 디코더의 입력으로 넣었을 때 생성되는 값을 의미하고, $p(z)$는 잠재 변수의 확률 분포를 의미합니다. $q(z|x)$는 인코더의 출력을 잠재 변수의 확률 분포로 추정한 것을 의미하며, $D_{KL}$은 클로저-라이브러리 발산을 의미합니다.\n이를 분리하여 계산하면 아래와 같이 나뉩니다.\n$$L = \\mathbb{E}{q(z|x)}[\\log p(x|z)] - D{KL}(q(z|x)||p(z))$$\n$$= \\mathbb{E}{q(z|x)}[\\log p(x|z)] - \\mathbb{E}{q(z|x)}[\\log \\frac{q(z|x)}{p(z)}]$$\n이때, reparametrization trick을 이용하면 손실 함수의 그래디언트를 쉽게 계산할 수 있습니다. 이 기법은 잠재 변수의 확률 분포를 정의할 때, 정규 분포의 모수를 함수로 표현하는 것을 의미합니다. 이렇게 하면 잠재 변수의 확률 분포를 명시적으로 정의할 수 있어 그래디언트를 계산하기 쉬워집니다.\n예를 들어, $q(z|x)$를 아래와 같이 정의할 수 있습니다.\n$$q(z|x) = \\mathcal{N}(\\mu(x), \\sigma^2(x))$$\n여기서 $\\mu(x)$와 $\\sigma^2(x)$는 인코더의 출력을 이용해 계산된 정규 분포의 모수입니다. 이렇게 정의된 $q(z|x)$를 이용하면 손실 함수의 그래디언트를 아래와 같이 계산할 수 있습니다.\n$$\\frac{\\partial L}{\\partial \\theta} = \\frac{\\partial}{\\partial \\theta}\\mathbb{E}{q(z|x)}[\\log p(x|z)] - \\frac{\\partial}{\\partial \\theta}\\mathbb{E}{q(z|x)}[\\log \\frac{q(z|x)}{p(z)}]$$\n$$= \\mathbb{E}{q(z|x)}\\left[\\frac{\\partial}{\\partial \\theta}\\log p(x|z)\\right] - \\mathbb{E}{q(z|x)}\\left[\\frac{\\partial}{\\partial \\theta}\\log \\frac{q(z|x)}{p(z)}\\right]$$\n이때, 위 식의 첫 번째 항을 전개하면 다음과 같습니다.\n$$\\mathbb{E}_{q(z|x)}\\left[\\frac{\\partial}{\\partial \\theta}\\log p(x|z)\\right] = \\int q(z|x)\\frac{\\partial}{\\partial \\theta}\\log p(x|z) dz$$\n여기서 $\\theta$는 VAE에서 사용되는 모든 매개변수를 의미합니다. 따라서 이 식을 이용하면 VAE의 손실 함수의 그래디언트를 계산할 수 있습니다.\n예를 들어, 손실 함수가 $L = \\mathbb{E}{q(z|x)}[\\log p(x|z)] - D{KL}(q(z|x)||p(z))$인 경우에는 첫 번째 항의 그래디언트는 다음과 같이 계산할 수 있습니다.\n$$\\frac{\\partial}{\\partial \\theta}\\mathbb{E}{q(z|x)}[\\log p(x|z)] = \\mathbb{E}{q(z|x)}\\left[\\frac{\\partial}{\\partial \\theta}\\log p(x|z)\\right]$$\n",
"wordCount" : "258",
"inLanguage": "en",
"datePublished": "2022-12-15T11:21:46.836Z",
"dateModified": "2022-12-15T11:21:46.836Z",
"author":{
"@type": "Person",
"name": "Me"
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "http://blog.morgan.kr/2022/12/vae%EC%9D%98-%EC%86%90%EC%8B%A4-%ED%95%A8%EC%88%98/"
},
"publisher": {
"@type": "Organization",
"name": "Morgan's Blog",
"logo": {
"@type": "ImageObject",
"url": "https://blog.morgan.kr/favicon.ico"
}
}
}
</script>
</head>
<body class=" dark" id="top"><header class="header">
</header>
<script>
if (localStorage.getItem("pref-theme") === "light") {
document.body.classList.remove('dark')
document.getElementById('main-logo').src = "\/favicon-inv.png";
}
</script>
<main class="main">
<article class="post-single">
<header class="post-header">
<h1 class="post-title">
VAE의 손실 함수
</h1>
<div class="post-meta"><span title='2022-12-15 11:21:46.836 &#43;0000 UTC'>
Dec 15, 2022
</span>
</div>
</header>
<div class="post-divider"></div>
<div class="post-content"><p>VAE의 손실 함수는 Variational Lower Bound(VLB)라고도 불리는데, 이 함수는 VAE에서 사용되는 정보량을 측정하는데 사용됩니다. 이 함수는 두 부분으로 나뉘어져 있으며, 이를 분리하여 계산하는 것이 일반적입니다. 이 때, reparametrization trick이란 기법을 사용하면 VAE의 손실 함수의 그래디언트를 계산하는 데 도움이 될 수 있습니다.</p>
<p>먼저, VAE의 손실 함수는 아래와 같이 정의됩니다.</p>
<p>$$L = \mathbb{E}{q(z|x)}[\log p(x|z)] - D{KL}(q(z|x)||p(z))$$</p>
<p>여기서 $p(x|z)$는 인코더의 출력을 디코더의 입력으로 넣었을 때 생성되는 값을 의미하고, $p(z)$는 잠재 변수의 확률 분포를 의미합니다. $q(z|x)$는 인코더의 출력을 잠재 변수의 확률 분포로 추정한 것을 의미하며, $D_{KL}$은 클로저-라이브러리 발산을 의미합니다.</p>
<p>이를 분리하여 계산하면 아래와 같이 나뉩니다.</p>
<p>$$L = \mathbb{E}{q(z|x)}[\log p(x|z)] - D{KL}(q(z|x)||p(z))$$</p>
<p>$$= \mathbb{E}{q(z|x)}[\log p(x|z)] - \mathbb{E}{q(z|x)}[\log \frac{q(z|x)}{p(z)}]$$</p>
<p>이때, reparametrization trick을 이용하면 손실 함수의 그래디언트를 쉽게 계산할 수 있습니다. 이 기법은 잠재 변수의 확률 분포를 정의할 때, 정규 분포의 모수를 함수로 표현하는 것을 의미합니다. 이렇게 하면 잠재 변수의 확률 분포를 명시적으로 정의할 수 있어 그래디언트를 계산하기 쉬워집니다.</p>
<p>예를 들어, $q(z|x)$를 아래와 같이 정의할 수 있습니다.</p>
<p>$$q(z|x) = \mathcal{N}(\mu(x), \sigma^2(x))$$</p>
<p>여기서 $\mu(x)$와 $\sigma^2(x)$는 인코더의 출력을 이용해 계산된 정규 분포의 모수입니다. 이렇게 정의된 $q(z|x)$를 이용하면 손실 함수의 그래디언트를 아래와 같이 계산할 수 있습니다.</p>
<p>$$\frac{\partial L}{\partial \theta} = \frac{\partial}{\partial \theta}\mathbb{E}{q(z|x)}[\log p(x|z)] - \frac{\partial}{\partial \theta}\mathbb{E}{q(z|x)}[\log \frac{q(z|x)}{p(z)}]$$</p>
<p>$$= \mathbb{E}{q(z|x)}\left[\frac{\partial}{\partial \theta}\log p(x|z)\right] - \mathbb{E}{q(z|x)}\left[\frac{\partial}{\partial \theta}\log \frac{q(z|x)}{p(z)}\right]$$</p>
<p>이때, 위 식의 첫 번째 항을 전개하면 다음과 같습니다.</p>
<p>$$\mathbb{E}_{q(z|x)}\left[\frac{\partial}{\partial \theta}\log p(x|z)\right] = \int q(z|x)\frac{\partial}{\partial \theta}\log p(x|z) dz$$</p>
<p>여기서 $\theta$는 VAE에서 사용되는 모든 매개변수를 의미합니다. 따라서 이 식을 이용하면 VAE의 손실 함수의 그래디언트를 계산할 수 있습니다.</p>
<p>예를 들어, 손실 함수가 $L = \mathbb{E}{q(z|x)}[\log p(x|z)] - D{KL}(q(z|x)||p(z))$인 경우에는 첫 번째 항의 그래디언트는 다음과 같이 계산할 수 있습니다.</p>
<p>$$\frac{\partial}{\partial \theta}\mathbb{E}{q(z|x)}[\log p(x|z)] = \mathbb{E}{q(z|x)}\left[\frac{\partial}{\partial \theta}\log p(x|z)\right]$$</p>
</div>
<footer class="post-footer">
<ul class="post-tags">
</ul>
<nav class="pag-back">
<a href="#back" onclick="window.history.back()">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" focusable="false" style="pointer-events: none; display: block; width: 100%; height: 100%;fill: var(--primary);stroke: var(--primary);" stroke-width="1"><polygon points="11.65,3.50 3.80,11.35 11.65,19.20 12.36,18.50 5.71,11.85 20.15,11.85 20.15,10.85 5.71,10.85 12.36,4.20"></polygon></svg>
</a>
</nav>
<br/>
</footer>
</article>
</main>
<footer class="footer">
<a href="/admin/" style="text-decoration: none;">&copy;</a> <span><a href="http://blog.morgan.kr">Morgan</a> · PaperMod</span>
<br/>
<span style="">Ver.11081623 </span>
<a href="#" id="theme-toggle">Toggle Dark Mode</a>
</footer>
<button id="top-link" class="top-link" onclick="window.scrollTo({top: 0, behavior: 'smooth'})">
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24" focusable="false" style="pointer-events: none; display: block; width: 100%; height: 100%;" fill="currentColor" stroke="white" stroke-width="1"><polygon points="19.35,11.5 11.5,3.65 3.65,11.5 4.35,12.21 11,5.56 11,20 12,20 12,5.56 18.65,12.21"></polygon></svg>
</button>
<script>
let menu = document.getElementById('menu')
if (menu) {
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
menu.onscroll = function () {
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
}
}
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener("click", function (e) {
e.preventDefault();
var id = this.getAttribute("href").substr(1);
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
behavior: "smooth"
});
} else {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
}
if (id === "top") {
history.replaceState(null, null, " ");
} else {
history.pushState(null, null, `#${id}`);
}
});
});
</script>
<script>
var mybutton = document.getElementById("top-link");
window.onscroll = function () {
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
mybutton.style.visibility = "visible";
mybutton.style.opacity = "1";
} else {
mybutton.style.visibility = "hidden";
mybutton.style.opacity = "0";
}
};
</script>
<script>
document.getElementById("theme-toggle").addEventListener("click", () => {
if (document.body.className.includes("dark")) {
document.body.classList.remove('dark');
localStorage.setItem("pref-theme", 'light');
document.getElementById('main-logo').src = "\/favicon-inv.png";
} else {
document.body.classList.add('dark');
localStorage.setItem("pref-theme", 'dark');
document.getElementById('main-logo').src = "\/favicon.png";
}
})
</script>
<script>
document.querySelectorAll('pre > code').forEach((codeblock) => {
const container = codeblock.parentNode.parentNode;
const copybutton = document.createElement('button');
copybutton.classList.add('copy-code');
copybutton.innerHTML = 'copy';
function copyingDone() {
copybutton.innerHTML = 'copied!';
setTimeout(() => {
copybutton.innerHTML = 'copy';
}, 2000);
}
copybutton.addEventListener('click', (cb) => {
if ('clipboard' in navigator) {
navigator.clipboard.writeText(codeblock.textContent);
copyingDone();
return;
}
const range = document.createRange();
range.selectNodeContents(codeblock);
const selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
try {
document.execCommand('copy');
copyingDone();
} catch (e) { };
selection.removeRange(range);
});
if (container.classList.contains("highlight")) {
container.appendChild(copybutton);
} else if (container.parentNode.firstChild == container) {
} else if (codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.nodeName == "TABLE") {
codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(copybutton);
} else {
codeblock.parentNode.appendChild(copybutton);
}
});
</script>
</body>
</html>