<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>d.yeon</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 12 Aug 2026 03:11:04 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>d.yeon</title>
            <url>https://velog.velcdn.com/images/d_yeon819/profile/ed09bb22-3310-4801-b06e-390142bee091/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. d.yeon. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/d_yeon819" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[오류 없이 파일이 사라진다 — Obsidian LiveSync 동기화 결함 8개를 추적한 하루]]></title>
            <link>https://velog.io/@d_yeon819/%EC%98%A4%EB%A5%98-%EC%97%86%EC%9D%B4-%ED%8C%8C%EC%9D%BC%EC%9D%B4-%EC%82%AC%EB%9D%BC%EC%A7%84%EB%8B%A4-Obsidian-LiveSync-%EB%8F%99%EA%B8%B0%ED%99%94-%EA%B2%B0%ED%95%A8-8%EA%B0%9C%EB%A5%BC-%EC%B6%94%EC%A0%81%ED%95%9C-%ED%95%98%EB%A3%A8</link>
            <guid>https://velog.io/@d_yeon819/%EC%98%A4%EB%A5%98-%EC%97%86%EC%9D%B4-%ED%8C%8C%EC%9D%BC%EC%9D%B4-%EC%82%AC%EB%9D%BC%EC%A7%84%EB%8B%A4-Obsidian-LiveSync-%EB%8F%99%EA%B8%B0%ED%99%94-%EA%B2%B0%ED%95%A8-8%EA%B0%9C%EB%A5%BC-%EC%B6%94%EC%A0%81%ED%95%9C-%ED%95%98%EB%A3%A8</guid>
            <pubDate>Wed, 12 Aug 2026 03:11:04 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>사내 지식플랫폼에 문서를 올리면 Obsidian에 뜨도록 만드는 작업이었다. 아침에 시작해 저녁까지 붙들었고, 그 사이 결함 8개를 찾았다. 전부 <strong>오류 메시지 없이 조용히 실패</strong>하는 종류였다.</p>
</blockquote>
<h2 id="무엇을-만들고-있었나">무엇을 만들고 있었나</h2>
<p>회의록 같은 문서를 웹에 올리면 LLM이 인물·조직·주제를 뽑아 지식그래프(Neo4j)에 넣는 파이프라인이다. 중간에 사람이 검토하는 단계가 있고, 그 검토를 <strong>Obsidian에서</strong> 할 수 있게 하려 했다.</p>
<pre><code>웹 업로드 → 텍스트 추출 → LLM 구조화 → .md 초안 → [사람 검토] → 승인 → Neo4j
                                            ↑
                                    여기를 Obsidian으로</code></pre><p>구조는 이랬다. 서버(Docker 컨테이너)가 vault 폴더에 파일을 쓰고, LiveSync Bridge가 CouchDB에 올리고, Obsidian 플러그인이 받아간다.</p>
<pre><code>RAGFlow 컨테이너 → 서버 vault → Bridge → CouchDB → Obsidian</code></pre><p>파일을 올렸다. Obsidian에는 뜨지 않았다. 여기서부터 시작이다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/3d7329a2-f8bf-4f8f-b4d4-dd4571f11040/image.png" alt=""></p>
<p><em>왼쪽 웹에는 올린 파일이 다 보인다. 오른쪽 Obsidian에는 없다. 같은 폴더를 보고 있는데도.</em></p>
<hr>
<h2 id="1-파일은-있는데-앱이-모른다">1. 파일은 있는데 앱이 모른다</h2>
<p>먼저 확인한 건 단순했다. 파일이 실제로 있는가?</p>
<pre><code class="language-bash">$ ls ~/kothea-vault/Inbox/
0714 projectJ 부회장님_미팅_회의록.docx    ← 있다</code></pre>
<p>있다. Obsidian은 이 폴더를 직접 열고 있었고, <code>showUnsupportedFiles: true</code>도 켜져 있었다. 그런데 사이드바에 없다.</p>
<p>판별용 파일을 두 개 만들어봤다. 하나는 터미널에서, 하나는 컨테이너에서.</p>
<table>
<thead>
<tr>
<th>파일</th>
<th>만든 주체</th>
<th>Obsidian</th>
</tr>
</thead>
<tbody><tr>
<td><code>zz_판별_docx.docx</code></td>
<td>호스트(터미널)</td>
<td><strong>즉시 표시</strong></td>
</tr>
<tr>
<td>같은 파일</td>
<td>컨테이너</td>
<td>표시 안 됨</td>
</tr>
</tbody></table>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/6a4257a7-1d9f-4b21-9567-b4069847676b/image.png" alt=""></p>
<p><em>터미널에서 만든 두 파일은 확장자와 무관하게 즉시 떴다. 같은 폴더에 컨테이너가 쓴 docx는 여전히 없다.</em></p>
<p><strong>Docker Desktop for Mac의 바인드 마운트는 컨테이너가 쓴 파일에 대해 호스트로 FSEvents를 발생시키지 않는다.</strong> 파일은 분명히 폴더에 생기는데, 호스트에서 도는 앱은 그 사실을 통보받지 못한다.</p>
<p>사실 이 함정은 이미 한 번 밟았었다. 우리 코드의 파일 감시자에 이런 주석이 있다.</p>
<pre><code class="language-python"># inotify/FSEvent 대신 폴링을 쓴다. 컨테이너 바인드 마운트에서
# 파일 이벤트가 유실되는 사례가 있어서다.</code></pre>
<p>서버 쪽은 폴링으로 우회했지만, Obsidian은 우리가 만든 프로그램이 아니다.</p>
<p>그래서 우회로를 택했다. Obsidian이 서버 폴더를 직접 보는 대신, <strong>CouchDB를 거쳐 네트워크로 받게</strong> 하는 것이다. 컨테이너끼리는 이벤트가 정상 전달되니 Bridge는 파일을 잘 감지한다. 팀원들이 원격에서 쓸 환경과 같아진다는 이점도 있었다.</p>
<p>이 결정이 이후 네 시간을 만들었다.</p>
<hr>
<h2 id="2-한-번도-동작한-적-없는-pull">2. 한 번도 동작한 적 없는 pull</h2>
<p>vault를 분리하고 연결했다. 여전히 안 온다. Bridge 로그를 봤다.</p>
<pre><code>WATCH: START: (since:0)
WATCH: CONNECTION HAS BEEN CLOSED, RECONNECTING...
WATCH: START: (since:0)
WATCH: CONNECTION HAS BEEN CLOSED, RECONNECTING...</code></pre><p>10초마다 재접속만 반복하고 있었다. 코드를 열어보니 Bridge는 CouchDB의 변경사항을 이렇게 받는다.</p>
<pre><code class="language-ts">const response = await this._fetch([&quot;_changes&quot;], {
    filter: &quot;replicate/pull&quot;,   // ← 이것
    feed: &quot;continuous&quot;,
    ...</code></pre>
<p><code>replicate/pull</code>은 CouchDB의 design document다. 있는지 확인했다.</p>
<pre><code class="language-bash">$ curl &#39;.../_changes?filter=replicate/pull&#39;
{&quot;error&quot;:&quot;not_found&quot;,&quot;reason&quot;:&quot;missing&quot;}</code></pre>
<p>없다. CouchDB는 존재하지 않는 필터를 요청받으면 <code>_changes</code> 스트림을 즉시 끊는다. 그래서 Bridge는 영원히 재접속만 하고 있었다.</p>
<p><strong>즉 CouchDB → 서버 방향 동기화가 한 번도 동작한 적이 없었다.</strong> push는 정상이라 겉보기에는 아무 문제가 없었다. 파일을 올리면 CouchDB에 잘 들어갔으니까.</p>
<p>이건 단순한 버그가 아니다. 설계의 핵심이 죽어 있었다는 뜻이다 — &quot;초안을 Obsidian에서 수정하면 승인할 때 그 내용이 반영된다&quot;가 작동한 적이 없었다.</p>
<p>재미있는 건, <strong>그 필터를 만드는 함수가 Bridge 자신의 코드에 있다</strong>는 점이다.</p>
<pre><code class="language-ts">// utils_couchdb.ts
const design = {
    &quot;_id&quot;: &quot;_design/replicate&quot;,
    &quot;ver&quot;: 2,
    &quot;filters&quot;: {
        &quot;pull&quot;: function (doc, req) { return !(doc.type &amp;&amp; doc.type == &quot;leaf&quot;) }.toString(),
        ...</code></pre>
<p>다만 Bridge가 실제로 쓰는 경로(<code>DirectFileManipulator</code>)에서는 이 함수가 호출되지 않는다. 아무도 만들지 않은 채 남아 있었다.</p>
<p>직접 만들어 넣으니 즉시 회복됐다.</p>
<blockquote>
<p><strong>교훈</strong>: 단방향만 되는 동기화가 가장 발견하기 어렵다. 화면상 아무 이상이 없다.</p>
</blockquote>
<hr>
<h2 id="3-언더스코어-하나가-파일을-삼킨다">3. 언더스코어 하나가 파일을 삼킨다</h2>
<p>pull이 살아나자 파일이 오가기 시작했다. 그런데 CouchDB를 들여다보다 이상한 걸 봤다.</p>
<pre><code>서버 폴더:  _drafts/회의록.md
CouchDB:     drafts/회의록.md    ← 언더스코어가 없다</code></pre><p>Bridge 코드를 뒤졌다.</p>
<pre><code class="language-ts">// Peer.ts:22
const ret = (relative.startsWith(&quot;_&quot;)) ? (&quot;/&quot; + relative) : relative;

// Peer.ts:27
let path = pathSrc.startsWith(&quot;_&quot;) ? pathSrc.substring(1) : pathSrc;</code></pre>
<p>22행은 맞다. LiveSync 규칙대로 <code>_</code>로 시작하는 경로에 <code>/</code>를 붙인다(<code>_drafts/x.md</code> → <code>/_drafts/x.md</code>).</p>
<p>27행이 그 역변환인데, <strong><code>startsWith(&quot;/&quot;)</code>를 검사해야 할 자리에 <code>&quot;_&quot;</code>를 검사한다.</strong> 그래서 <code>/</code>를 떼는 게 아니라 언더스코어 자체를 잘라낸다.</p>
<p>결과는 이렇다.</p>
<table>
<thead>
<tr>
<th></th>
<th>경로</th>
</tr>
</thead>
<tbody><tr>
<td>서버</td>
<td><code>_drafts/x.md</code></td>
</tr>
<tr>
<td>Obsidian</td>
<td><code>drafts/x.md</code></td>
</tr>
</tbody></table>
<p>서버는 <code>_drafts/</code>를 읽는데 Obsidian은 <code>drafts/</code>에 쓴다. <strong>Obsidian에서 고친 초안이 승인 시 반영되지 않고 조용히 사라진다.</strong></p>
<p>vendored 라이브러리는 고칠 수 없으니 폴더 이름에서 언더스코어를 뺐다. 정렬 목적이었을 뿐 기능상 필요가 없었다.</p>
<hr>
<h2 id="4-콜론도-삼킨다">4. 콜론도 삼킨다</h2>
<p>며칠 전 회의록 파일을 올렸다. <code>3:31 회의록_품질책임자_챗봇_ProjectJ.docx</code>. 안 온다.</p>
<p>로그를 봤더니 이렇게 찍혀 있었다.</p>
<pre><code>deleteDB By path:31 ProjectJ_회의록_상세.docx
Entry removed: [DEL] 31 ProjectJ_회의록_상세.docx</code></pre><p>원래 이름은 <code>Attachments/3:31 ProjectJ_회의록_상세.docx</code>다. <strong><code>Attachments/3:</code>가 통째로 사라졌다.</strong></p>
<p>플러그인 코드에서 찾았다.</p>
<pre><code class="language-js">function stripPrefix(prefixedPath){
    const [prefix, body] = prefixedPath.split(&quot;:&quot;, 2);
    return body || prefix
}</code></pre>
<p>LiveSync는 문서 ID를 <code>prefix:경로</code> 형태로 인코딩한다. 파일명에 콜론이 있으면 그 구분자와 충돌해 앞이 잘린다. 그리고 깨진 경로로 처리가 이어지다 삭제까지 간다.</p>
<p><strong>언더스코어(3장)와 콜론(4장)이 같은 뿌리다.</strong> 경로를 문자열로 인코딩하면서 구분자를 이스케이프하지 않았다. 경로에 구분자와 같은 문자가 들어오면 파싱이 어긋나는데, 오류를 내지 않고 잘린 경로로 계속 진행한다.</p>
<p>우리가 고칠 수 있는 건 라이브러리가 아니라 <strong>입력</strong>이다.</p>
<pre><code class="language-python"># &#39;:&#39;  LiveSync가 &#39;prefix:경로&#39; 구분자로 오인해 앞부분을 잘라먹는다.
# &#39;#^[]|&#39;  Obsidian 링크 문법 문자. 파일명에 있으면 위키링크가 깨진다.
_UNSAFE_IN_FILENAME = re.compile(r&#39;[:/\\|#^\[\]*?&lt;&gt;&quot;]&#39;)

def safe_filename(name: str) -&gt; str:
    &quot;&quot;&quot;확장자는 두고 이름 부분의 위험 문자만 밑줄로 바꾼다.&quot;&quot;&quot;</code></pre>
<p>회의 시각이 들어간 파일명(<code>3:31</code>, <code>10:00</code>)은 앞으로도 계속 올라온다. 저장 시점에 막는 것이 유일하게 확실한 방법이다.</p>
<hr>
<h2 id="5-증상을-보고-설정을-바꾸면-안-된다">5. 증상을 보고 설정을 바꾸면 안 된다</h2>
<p>CouchDB를 살펴보다 같은 파일이 두 벌씩 있는 걸 발견했다.</p>
<pre><code>Inbox/0804 project J 내부 회의.pdf
inbox/0804 project j 내부 회의.pdf    ← 소문자</code></pre><p>Bridge는 원본 대소문자로 쓰고, 플러그인은 <code>handleFilenameCaseSensitive: false</code> 설정 때문에 소문자로 정규화한다. 두 시스템이 같은 파일에 다른 ID를 부여하고 있었다.</p>
<p>그래서 그 설정을 <code>true</code>로 바꿨다. 결과는 동기화 정지였다.</p>
<pre><code>Rule violation: handleFilenameCaseSensitive is true but should be false</code></pre><p><img src="https://velog.velcdn.com/images/d_yeon819/post/810b2448-91f6-48f9-ad1c-f07e93032241/image.png" alt=""></p>
<p><em>뒤에 또 만난 같은 종류의 화면. 이 기기와 원격의 값이 다르면 플러그인이 결정을 요구한다. &quot;이 기기에 설정 적용&quot;이 정답이다 — 원격이 기준이다.</em></p>
<p><strong>이 값은 개별 기기의 취향 설정이 아니라 같은 원격 DB를 쓰는 모든 기기가 공유해야 하는 계약이다.</strong> 어긋나면 플러그인이 사고를 막으려 동기화를 중단한다.</p>
<p>증상(중복 문서)을 보고 처방했는데, 그 증상은 두 시스템이 규칙을 달리 해석한 <em>결과</em>였지 설정 문제가 아니었다. 원격이 정한 값에 기기를 맞췄어야 했다.</p>
<p>역설적으로 이건 이날 <strong>LiveSync가 유일하게 명확한 오류 메시지를 남긴</strong> 사례다. 나머지는 전부 침묵했다.</p>
<hr>
<h2 id="6-진단이-시스템을-망가뜨렸다">6. 진단이 시스템을 망가뜨렸다</h2>
<p>문제를 좁히려고 CouchDB에서 문서를 여러 번 지웠다. 콜론 문서 3건, 소문자 중복 6건, 설정 파일 10건, 테스트 잔재 7건.</p>
<p>그 삭제가 클라이언트에 전파됐다. 로컬 DB에 &quot;이 경로는 삭제됨&quot;이 tombstone으로 남았고, <strong>이후 서버가 같은 이름으로 새 문서를 올려도 클라이언트는 자기 삭제 기록을 더 최신으로 판단해 무시했다.</strong></p>
<p>전체 재수신을 걸어도 소용없다. 리비전 비교에서 삭제가 이긴다.</p>
<blockquote>
<p><strong>교훈</strong>: 진단 대상 시스템의 상태를 직접 고치면, 진단하려던 것을 진단 불가능하게 만들 수 있다. 손대야 한다면 클라이언트를 먼저 멈추고, 끝나면 클라이언트를 새로 만드는 편이 빠르다.</p>
</blockquote>
<hr>
<h2 id="7-서버-로그에-없는-답">7. 서버 로그에 없는 답</h2>
<p>여기까지 오는 데 세 시간이 걸렸다. 결함을 여섯 개 고쳤는데도 파일이 오지 않았다.</p>
<p>서버 쪽은 모든 층에서 정상이었다.</p>
<ul>
<li>CouchDB: 문서 6개 + 청크 690개, 참조 깨짐 0건</li>
<li>설정: Rule 위반 0건</li>
<li>Bridge: 양방향 모두 동작</li>
</ul>
<p>CouchDB 접근 로그를 요청 종류별로 세어봤다.</p>
<pre><code>159  GET _all_docs      ← 대부분 내 진단용 curl
  1  GET _changes
  0  청크(h:) 다운로드   ← ?</code></pre><p>LiveSync는 파일을 받을 때 <code>_changes</code>로 변경 목록을 읽고 → 청크를 내려받아 → 파일을 조립한다. <strong>청크 요청이 0건이다.</strong> 연결은 살아 있는데 데이터를 받지 않는다.</p>
<p>플러그인 로그도 계속 들여다봤지만, 여기에도 &quot;왜 멈췄는지&quot;는 없었다. 파일을 처리했다는 줄만 반복될 뿐이었다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/42602703-bf08-42ae-9b88-e6cbb6226c1a/image.png" alt=""></p>
<p>포기하기 직전에 vault를 새로 만들어봤다. 그러자 대화상자가 떴다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/0c829507-5b53-4aa2-a4a9-e9aadf430417/image.png" alt=""></p>
<p><code>Review compatibility details</code>를 눌렀다. <strong>이날 처음으로 LiveSync가 &quot;내가 왜 멈춰 있는지&quot;를 스스로 말해준 화면이다.</strong></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/0af326ec-22f2-4f5e-b25c-91d5b8dbaea5/image.png" alt=""></p>
<blockquote>
<p><strong>Synchronisation paused for compatibility review</strong></p>
<p>No previously acknowledged internal database version was found for this existing Vault. This can happen when a Vault is copied or restored, or when it is opened with a new Obsidian profile.</p>
<p><strong>Remote replication is blocked before work begins.</strong></p>
</blockquote>
<p>LiveSync는 &quot;이 기기가 원격 DB의 내부 버전을 승인한 적이 있는가&quot;를 확인하고, 기록이 없으면 <strong>replication을 시작 자체를 차단한다.</strong> vault를 복사했거나 새 프로필로 열면 발생하고, 사용자가 명시적으로 Resume을 눌러야 풀린다. 대화상자를 닫으면 차단이 유지된다.</p>
<p>이것 하나로 증상이 전부 설명된다.</p>
<table>
<thead>
<tr>
<th>증상</th>
<th>이유</th>
</tr>
</thead>
<tbody><tr>
<td>청크 GET 0건</td>
<td>데이터 전송이 시작 전에 차단됨</td>
</tr>
<tr>
<td><code>Processing ... Done</code>인데 파일 없음</td>
<td>메타만 처리, 본문은 못 받음</td>
</tr>
<tr>
<td><code>possibly deleted</code></td>
<td>본문이 없으니 삭제로 판정</td>
</tr>
<tr>
<td><code>_changes</code>는 오가는데 파일은 안 옴</td>
<td>변경 감지는 되지만 전송이 막힘</td>
</tr>
</tbody></table>
<p><strong>서버 로그를 아무리 뒤져도 찾을 수 없었던 이유가 여기 있다.</strong> 막힌 지점이 클라이언트 안이라 CouchDB에는 정상 요청만 찍힌다.</p>
<p>그 사이 나는 서버 설정만 계속 바꾸고 있었다.</p>
<hr>
<h2 id="8-30줄이면-됐다">8. 30줄이면 됐다</h2>
<p>Resume을 눌렀지만 파일은 여전히 오지 않았다. 여덟 번째 결함이 있었던 것이고, 나는 여기서 멈췄다.</p>
<p>대신 처음 질문으로 돌아갔다. <strong>막힌 게 정확히 무엇이었나?</strong></p>
<p>&quot;컨테이너가 쓴 파일에 대해 호스트가 파일 이벤트를 받지 못한다&quot; — 이것 하나였다. CouchDB도 Bridge도 그걸 우회하려고 끌어들인 것이다.</p>
<p>그런데 이벤트가 안 오면, 만들면 된다.</p>
<pre><code class="language-python">def _rewrite(path: Path) -&gt; bool:
    &quot;&quot;&quot;경로를 잠깐 비웠다 되돌려 호스트 쪽 &#39;생성&#39; 이벤트를 만든다.&quot;&quot;&quot;
    tmp = path.with_name(path.name + &quot;.notify-tmp&quot;)
    path.rename(tmp)
    time.sleep(GAP)
    tmp.rename(path)</code></pre>
<p>폴더를 주기적으로 훑어 처음 보는 파일의 이름을 잠깐 바꿨다 되돌린다. 그러면 호스트 쪽에서 파일 생성 이벤트가 발생하고, Obsidian이 인식한다.</p>
<p>이 30줄을 만드는 데도 네 번 고쳤다.</p>
<table>
<thead>
<tr>
<th>시도</th>
<th>무엇이 틀렸나</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>내용을 덮어썼다 → macOS는 <strong>수정</strong> 이벤트로 전달, Obsidian은 무시</td>
</tr>
<tr>
<td>2</td>
<td>rename 2회로 <strong>생성</strong> 이벤트를 만들었다 → 여전히 안 됨</td>
</tr>
<tr>
<td>3</td>
<td>파일 생성 직후에 건드렸다 → 한 박자 쉬도록</td>
</tr>
<tr>
<td>4</td>
<td>두 rename을 연속 실행했다 → FSEvents가 하나로 <strong>병합</strong></td>
</tr>
</tbody></table>
<p>4번이 특히 얄궂었다. 내가 손으로 검증할 때는 이렇게 했다.</p>
<pre><code class="language-bash">mv &quot;$F&quot; &quot;$F.x&quot; &amp;&amp; sleep 1 &amp;&amp; mv &quot;$F.x&quot; &quot;$F&quot;</code></pre>
<p><code>sleep 1</code>이 있었다. 코드에는 없었다. macOS FSEvents는 짧은 간격의 이벤트를 하나로 합치기 때문에, 삭제와 생성이 즉시 이어지면 &quot;이름 변경&quot;으로 병합되어 Obsidian이 새 파일로 볼 기회가 없다. <strong>경로가 실제로 비어 있는 시간이 필요했다.</strong></p>
<p>네 번 모두 수동 검증은 통과하고 코드는 실패했다. 손으로 한 것과 코드가 미묘하게 달랐던 것이다.</p>
<hr>
<h2 id="결국-어떻게-됐나">결국 어떻게 됐나</h2>
<p><code>.md</code> 파일은 자동으로 뜬다. <code>.docx</code> 원본은 끝내 안 됐다.</p>
<p>그런데 파이프라인에서 Obsidian이 실제로 다루는 건 <code>.md</code> 초안이다. <code>.docx</code>는 Obsidian에서 열 수도 없는 파일이라 목록에 이름이 있든 없든 하는 일이 없다.</p>
<p><strong>즉 가장 오래 붙들었던 문제가 가장 덜 중요한 문제였다.</strong> 이 판단을 훨씬 일찍 했어야 했다.</p>
<p>같은 날 한 다른 작업 — LLM이 회의록에서 아무것도 못 뽑던 문제 — 은 두 시간 만에 해결됐고 효과가 훨씬 컸다.</p>
<table>
<thead>
<tr>
<th></th>
<th>전</th>
<th>후</th>
</tr>
</thead>
<tbody><tr>
<td>처리</td>
<td>폴백 (54초 쓰고 실패)</td>
<td>LLM (23초)</td>
</tr>
<tr>
<td>제목</td>
<td>파일명 그대로</td>
<td>부회장님 미팅 회의록</td>
</tr>
<tr>
<td>날짜</td>
<td>없음</td>
<td>2026-07-14</td>
</tr>
<tr>
<td>인물·조직·주제</td>
<td>3 / 0 / 0</td>
<td>5 / 6 / 5</td>
</tr>
<tr>
<td>관계</td>
<td><strong>0건</strong></td>
<td><strong>7건</strong></td>
</tr>
</tbody></table>
<p>원인은 두 가지였다. 출력 형식을 프롬프트로 <em>부탁</em>만 하고 있었던 것(→ JSON Schema로 강제), 그리고 모델이 한국어 문서에 맞지 않았던 것(qwen2.5:7b는 중국어로 답하고 날짜를 지어내고 없는 인물을 만들어냈다 → gemma3:4b).</p>
<p>파라미터가 절반도 안 되는 모델이 이겼다. <strong>크기보다 언어 적합성이 결정적이었다.</strong></p>
<hr>
<h2 id="남는-것">남는 것</h2>
<p>이날 만난 결함은 성격이 하나로 모인다. <strong>전부 오류 없이 실패했다.</strong></p>
<ul>
<li>Bridge의 pull은 재접속 로그만 남기고</li>
<li>경로의 언더스코어와 콜론은 말없이 잘려나가고</li>
<li>설정 플래그 하나는 아무 안내 없이 동기화를 잠재우고</li>
<li>클라이언트 게이트는 <code>_changes</code>까지만 읽고 멈춘다</li>
</ul>
<p>화면에는 어느 것도 오류로 나타나지 않는다. &quot;파일이 그냥 안 온다&quot;로만 보인다.</p>
<p>이런 시스템을 다룰 때 배운 것 세 가지를 적어둔다.</p>
<p><strong>1. 조용한 실패를 만들지 말 것.</strong> 우리 코드에도 같은 게 있었다.</p>
<pre><code class="language-python">try:
    parsed = parse_json_response(call_llm(prompt))
except Exception:
    return None          # ← 왜 폴백됐는지 아무 데도 안 남는다</code></pre>
<p>이걸 고친 게 그날 가장 값어치 있는 변경일지도 모른다.</p>
<p><strong>2. 우회로를 설계하기 전에, 막힌 것 하나만 직접 풀 수 없는지 먼저 묻기.</strong> 나는 파일 이벤트 하나 때문에 3계층 동기화 구조를 끌어들였고, 결국 30줄짜리 스크립트로 돌아왔다.</p>
<p><strong>3. 가장 오래 붙드는 문제가 가장 중요한 문제인지 수시로 되묻기.</strong> 네 시간을 쓴 것은 파이프라인에서 가장 덜 중요한 부분이었다.</p>
<p>물론 그 시간이 완전히 헛되지는 않았다. 팀원 원격 접속이 필요해지면 CouchDB 경로를 다시 써야 하는데, 그때 밟게 될 지뢰가 전부 문서로 남았다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Obsidian Self-hosted LiveSync로 팀 지식베이스 실시간 동기화하기]]></title>
            <link>https://velog.io/@d_yeon819/Obsidian-Self-hosted-LiveSync%EB%A1%9C-%ED%8C%80-%EC%A7%80%EC%8B%9D%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EB%8F%99%EA%B8%B0%ED%99%94%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@d_yeon819/Obsidian-Self-hosted-LiveSync%EB%A1%9C-%ED%8C%80-%EC%A7%80%EC%8B%9D%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EB%8F%99%EA%B8%B0%ED%99%94%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 07 Aug 2026 05:02:07 GMT</pubDate>
            <description><![CDATA[<h2 id="들어가며">들어가며</h2>
<p><strong>서버에 띄워둔 Obsidian과 내 로컬 Obsidian이 항상 같은 상태로 동기화</strong>되어야 했다. 서버에서 관리되는 노트를 로컬에서도 그대로 열어 보고 편집하고, 반대로 로컬에서 고친 것도 서버에 바로 반영되는 구조가 필요했다. 이걸 self-hosted 방식(데이터를 우리가 직접 들고 있는)으로 구현하는 방법을 찾다가 <strong>Self-hosted LiveSync</strong> 플러그인에 도달했다.</p>
<p>결론부터 말하면 잘 된다. 다만 처음 세팅할 때 <strong>똑같은 화면에서 5번은 막혔다.</strong> 대부분 &quot;에러처럼 보이지만 사실은 정상인 화면&quot;을 잘못 처리해서였다. 이 글은 그 삽질 포인트까지 포함한 전체 설치 기록이다.</p>
<h3 id="전체-구성">전체 구성</h3>
<pre><code>        [CouchDB 서버]  ←  노트를 저장·중계하는 동기화 허브
             ↑↓ 실시간 양방향 동기화
[서버의 Obsidian vault]      [내 로컬 Obsidian]</code></pre><ul>
<li><strong>CouchDB</strong>: 노트를 저장·중계하는 데이터베이스 서버 (Docker로 띄움)</li>
<li><strong>Self-hosted LiveSync</strong>: 각 Obsidian에 설치하는 커뮤니티 플러그인</li>
<li>한쪽에서 노트를 고치면 CouchDB를 거쳐 몇 초 안에 다른 쪽에도 반영된다. (기기가 더 늘어도 같은 방식으로 붙는다.)</li>
</ul>
<hr>
<h2 id="1-couchdb-서버-준비-docker">1. CouchDB 서버 준비 (Docker)</h2>
<p>먼저 노트를 담을 CouchDB를 띄운다. 상시 켜져 있는 서버(또는 사내 PC)에서 실행하면 된다.</p>
<pre><code class="language-bash">docker run -d --name couchdb-livesync --restart unless-stopped \
  -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=your-strong-password \
  -v ~/couchdb-livesync/data:/opt/couchdb/data \
  -v ~/couchdb-livesync/etc:/opt/couchdb/etc/local.d \
  -p 5984:5984 couchdb:latest</code></pre>
<p>여기서 <strong>컨테이너를 띄우는 것만으로는 부족하다.</strong> CouchDB는 기본적으로 CORS가 꺼져 있어서, Obsidian 앱(<code>app://obsidian.md</code>이라는 출처)의 요청을 거부한다. 이게 나중에 &quot;연결은 되는데 계속 실패하는&quot; 증상의 원흉이다. 그래서 시스템 DB 초기화 + CORS 허용을 넣어준다. (<code>$C</code>는 <code>http://admin:비번@서버주소:5984</code>)</p>
<pre><code class="language-bash"># 시스템 DB 초기화 (_users, _replicator, _global_changes)
curl -X POST $C/_cluster_setup -H &quot;Content-Type: application/json&quot; \
     -d &#39;{&quot;action&quot;:&quot;finish_cluster&quot;}&#39;

# Obsidian 접속 허용 (CORS)
curl -X PUT $C/_node/_local/_config/chttpd/enable_cors -d &#39;&quot;true&quot;&#39;
curl -X PUT $C/_node/_local/_config/cors/origins \
     -d &#39;&quot;app://obsidian.md,capacitor://localhost,http://localhost&quot;&#39;
curl -X PUT $C/_node/_local/_config/cors/credentials -d &#39;&quot;true&quot;&#39;
curl -X PUT $C/_node/_local/_config/cors/methods -d &#39;&quot;GET, PUT, POST, HEAD, DELETE&quot;&#39;
curl -X PUT $C/_node/_local/_config/cors/headers \
     -d &#39;&quot;accept, authorization, content-type, origin, referer&quot;&#39;
curl -X PUT $C/_node/_local/_config/chttpd/require_valid_user -d &#39;&quot;true&quot;&#39;</code></pre>
<blockquote>
<p>💡 설정이 잘 들어갔는지는 프리플라이트로 확인할 수 있다.</p>
<pre><code class="language-bash">curl -I -X OPTIONS $C/ -H &quot;Origin: app://obsidian.md&quot; \
     -H &quot;Access-Control-Request-Method: GET&quot;</code></pre>
<p>응답에 <code>Access-Control-Allow-Origin: app://obsidian.md</code>가 보이면 성공.</p>
</blockquote>
<blockquote>
<p>⚠️ <strong>외부/인터넷에 공개한다면</strong> HTTPS(유효한 SSL 인증서)가 필수이고, 비밀번호도 반드시 강력하게. 사내망 전용이면 위 설정 그대로도 충분하다.</p>
</blockquote>
<hr>
<h2 id="2-obsidian-플러그인-설치--서버-연결">2. Obsidian 플러그인 설치 &amp; 서버 연결</h2>
<h3 id="플러그인-설치">플러그인 설치</h3>
<p>Obsidian 설정(<code>Cmd/Ctrl + ,</code>) → <strong>커뮤니티 플러그인</strong> → 제한 모드 해제 → <strong>탐색</strong>에서 <code>Self-hosted LiveSync</code> 검색 → 설치 → 활성화. 활성화하면 설정 마법사가 자동으로 시작된다.</p>
<h3 id="연결-방법-선택">연결 방법 선택</h3>
<p>연결 방법을 물어보면 <strong>「서버 정보를 수동으로 입력」</strong>을 고른다. (다른 기기에서 만든 Setup URI가 있으면 위쪽 옵션으로 더 간단히 끝낼 수 있는데, 그건 뒤에서 다룬다.)</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/466fd3c7-e991-4cb7-b875-d68840efab93/image.jpg" alt="">
<em>연결 방법은 「서버 정보를 수동으로 입력」</em></p>
<h3 id="종단-간-암호화e2ee">종단 간 암호화(E2EE)</h3>
<p>서버에 노트가 암호화되어 저장되도록 E2EE를 켜고 passphrase를 정한다. <strong>이 passphrase는 모든 기기에서 동일하게</strong> 입력해야 하니 팀 공통값으로 정해두자. (테스트만 할 거라면 꺼도 되지만, 실사용이면 켜는 걸 권장한다.)</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/418ba5a8-8ae3-415d-bde5-d07cb04fed53/image.jpg" alt="">
<em>E2EE를 켜고 공통 passphrase 입력</em></p>
<h3 id="서버-유형과-접속-정보">서버 유형과 접속 정보</h3>
<p>서버 유형은 <strong>CouchDB</strong>를 선택한다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/e074f281-f89e-4029-88d6-6917133c2704/image.jpg" alt="">
<em>맨 위 CouchDB</em></p>
<p>이어서 접속 정보(URI, 아이디, 비밀번호, DB 이름)를 입력한다. <code>Use Internal API</code>는 체크하지 않는다. 그리고 <strong>Check server requirements</strong>로 서버 상태를 점검한다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/a37ed6d5-8c9a-458f-af87-49d22b39c9bb/image.jpg" alt="">
<em>정보 입력 후 Check server requirements로 점검</em></p>
<blockquote>
<p>점검 결과에 빨간 줄이 있으면 그 줄의 <strong>Fix</strong> 버튼을 누르면 CouchDB에 설정을 자동으로 넣어준다. 1번에서 CORS를 미리 넣었다면 대부분 초록불이다. 모두 초록이면 <strong>Create or connect to database and continue</strong>.</p>
</blockquote>
<hr>
<h2 id="3-삽질-포인트--여기서-5번-막혔다">3. 삽질 포인트 — 여기서 5번 막혔다</h2>
<h3 id="삽질-①-fetch-remote-configuration-failed">삽질 ① &quot;Fetch Remote Configuration Failed&quot;</h3>
<p>설정 도중 이 빨간 제목의 창이 뜬다. 처음엔 에러인 줄 알고 파란색 <strong>Retry</strong>를 계속 눌렀다. 몇 번을 눌러도 똑같이 실패한다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/d07363ee-faa6-4572-8bf5-dc4719cf7f0f/image.jpg" alt="">
<em>이 화면에서 Retry는 함정이다</em></p>
<p>사실 이건 <strong>에러가 아니라 정상 안내</strong>다. 서버(DB)에 아직 저장된 LiveSync 설정이 없어서 &quot;가져올 게 없다&quot;고 알려주는 것뿐. 방금 내가 직접 설정을 넣는 중이니 당연하다.</p>
<blockquote>
<p>✅ <strong>파란 Retry가 아니라 회색 <code>Skip and proceed</code>를 누른다.</strong> 그러면 설정이 새로 만들어진다.</p>
</blockquote>
<h3 id="초기화--서버에-첫-업로드">초기화 &amp; 서버에 첫 업로드</h3>
<p>첫 설정자(서버를 처음 채우는 사람)라면, 이 기기의 노트를 서버에 원본으로 올린다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/89658baf-ea4d-4e5a-80fe-dfd47687ec66/image.jpg" alt="">
<em>Restart and Initialise Server</em></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/7905e4fb-d1f0-49d0-ba8d-8befb4414192/image.jpg" alt="">
<em>확인 3개 체크 후 Overwrite Server (빈 서버라 안전하다)</em></p>
<h3 id="삽질-②-synchronisation-paused">삽질 ② &quot;Synchronisation paused&quot;</h3>
<p>동기화가 호환성 확인 때문에 잠시 멈췄다는 창. 여기서도 보라색으로 강조된 버튼(<code>Keep synchronisation paused</code>)을 무심코 누르면 동기화가 멈춘 채로 남는다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/84948f01-f74a-4858-a435-9c1ee1631a95/image.jpg" alt="">
<em>가운데 Resume synchronisation을 눌러야 한다</em></p>
<blockquote>
<p>✅ 가운데 <strong><code>Resume synchronisation</code></strong>을 누른다.</p>
</blockquote>
<hr>
<h2 id="4-실시간-자동-동기화-켜기">4. 실시간 자동 동기화 켜기</h2>
<p>여기까지 하면 동기화가 <strong>수동</strong>으로만 된다. 노트를 고쳐도 자동으로 안 올라가고, 화면 우하단 동기화 아이콘이 빨간색이면 실시간 모드가 꺼진 상태다. (이게 삽질 ③이었다 — &quot;왜 저장해도 반영이 안 되지?&quot;)</p>
<p>플러그인 설정으로 들어간다. 설정 → 커뮤니티 플러그인 → Self-hosted LiveSync → <strong>옵션</strong>.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/7b17c012-2bc8-415c-a844-923c943a1a7f/image.jpg" alt="">
<em>플러그인 정보 화면의 「옵션」 버튼</em></p>
<p><strong>동기화 설정 → 동기화 방법</strong>에서 <strong>Sync Mode를 <code>LiveSync</code>로</strong> 바꾼다. 그러면 저장하는 즉시 양방향으로 자동 동기화된다. (<code>Keep replication active in the background</code>도 켜두면 창이 백그라운드일 때도 동기화가 유지된다.)
<img src="https://velog.velcdn.com/images/d_yeon819/post/8cefa613-9f67-49fe-9a3f-20ac7ba7febc/image.jpg" alt="">
<em>Sync Mode → LiveSync</em></p>
<blockquote>
<p>Sync Mode를 LiveSync로 바꾸면 <code>Sync on Save</code> 같은 개별 토글이 사라지는데, 정상이다. 실시간 모드는 항상 붙어 있어서 개별 설정이 필요 없다.</p>
</blockquote>
<hr>
<h2 id="5-두-번째-기기에서-받기">5. 두 번째 기기에서 받기</h2>
<p>이제 다른 기기(내 로컬, 또는 함께 쓰는 팀원)가 같은 서버에 붙어 노트를 받아오는 과정이다. 빈 vault에서 플러그인을 설치하고 서버에 연결하면, 상황을 묻는 화면이 나온다.</p>
<p><strong>두 번째 항목 「My remote server is already set up. I want to join this device.」</strong>를 선택한다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/1c4de1eb-16a4-43ec-875d-bafd8012d340/image.jpg" alt="">
<em>서버는 이미 있고, 이 기기를 참여시킴</em></p>
<blockquote>
<p>⚠️ 첫 번째 항목(새 서버 설정/리셋)을 고르면 <strong>내 빈 vault로 서버를 덮어써서 공용 노트가 전부 날아간다.</strong> 반드시 두 번째다.</p>
</blockquote>
<p>이어서 서버 데이터를 내려받는다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/30165e29-8bec-4805-a84c-5b30316ecd71/image.jpg" alt="">
<em>Restart and Fetch Data</em></p>
<p>데이터 처리 방식은 <strong>Overwrite all with remote files</strong>(서버 것을 그대로 받기)를 선택하고,</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/e6c75e38-64b2-4e15-bbde-72412f0d7869/image.jpg" alt=""></p>
<p>여분 로컬 파일은 <strong>Delete local files if not on remote</strong>(서버와 똑같이 맞추기)를 선택한다. 빈 vault라 삭제될 것이 없어 안전하다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/4dd084d4-c00f-448a-8b76-2af3f117ec4c/image.jpg" alt="">
재시작하면 서버의 노트가 이 vault로 쏟아져 내려온다. 🎉</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/b7455a67-8624-4f48-b6f1-84d391beb1fe/image.jpg" alt="">
<em>빈 vault에 공용 노트가 자동으로 나타났다</em></p>
<blockquote>
<p>참여자도 마지막에 <strong>Sync Mode를 LiveSync로</strong> 바꿔야 실시간이 된다. (4번 과정과 동일)</p>
</blockquote>
<hr>
<h2 id="정리--삽질-방지-체크리스트">정리 — 삽질 방지 체크리스트</h2>
<p>처음 세팅할 때 막히기 쉬운 지점만 추리면:</p>
<table>
<thead>
<tr>
<th>상황</th>
<th>정답</th>
</tr>
</thead>
<tbody><tr>
<td><code>Fetch Remote Configuration Failed</code></td>
<td><strong>Skip and proceed</strong> (Retry ❌)</td>
</tr>
<tr>
<td><code>Synchronisation paused</code></td>
<td><strong>Resume synchronisation</strong> (Keep paused ❌)</td>
</tr>
<tr>
<td>저장해도 동기화 안 됨 / 우하단 빨간 아이콘</td>
<td><strong>Sync Mode를 LiveSync로</strong></td>
</tr>
<tr>
<td>두 번째 기기 연결</td>
<td><strong>join this device</strong> (new server/reset ❌)</td>
</tr>
<tr>
<td><code>docker run couchdb</code>만 하고 CORS 미설정</td>
<td>연결 계속 실패 → <strong>CORS 설정 필수</strong></td>
</tr>
</tbody></table>
<h3 id="setup-uri로-팀-배포를-더-쉽게">Setup URI로 팀 배포를 더 쉽게</h3>
<p>팀원마다 접속 정보를 일일이 입력하게 하는 대신, 첫 설정자가 명령 팔레트(<code>Cmd/Ctrl + P</code>) → <strong><code>Copy settings as a new setup URI</code></strong>로 설정을 문자열 하나로 만들어 공유하면, 팀원은 그 URI를 붙여넣는 것만으로 접속 설정이 끝난다. (단, 실시간 모드는 각 기기에서 한 번씩 켜야 한다.)</p>
<p>CouchDB의 CORS만 제대로 잡아두면 나머지는 대부분 &quot;정상인데 에러처럼 보이는 화면&quot;을 침착하게 넘기는 일이다. 같은 곳에서 막힌 사람에게 이 글이 시간을 아껴주길.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[맥북 배터리가 미친 듯이 닳는다 — macOS File Provider와 Spotlight의 무한 루프 추적기]]></title>
            <link>https://velog.io/@d_yeon819/fileproviderdsuggestd</link>
            <guid>https://velog.io/@d_yeon819/fileproviderdsuggestd</guid>
            <pubDate>Thu, 06 Aug 2026 10:24:53 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>CPU 343% → 30%. 원인은 클라우드에 올라간 <code>.pyc</code> 15만 개였다.</p>
</blockquote>
<p>어느 날부터 맥북이 이상했다. 부팅하자마자 앱이 우르르 열리고, 아무것도 안 하는데 배터리가 눈에 띄게 빨리 닳았다. &quot;부팅할 때 프로그램이 다 켜져서 그런가?&quot; 싶어 시작한 추적이 전혀 다른 곳으로 이어졌다.</p>
<p>이 글은 그 과정을 <strong>막다른 길과 오판까지 포함해</strong> 그대로 기록한 것이다. 결론만 보면 세 줄이지만, 그 세 줄에 도달하기까지 몇 번이나 틀렸다.</p>
<p><strong>환경</strong>: MacBook (Apple Silicon) / macOS 26 / Nextcloud · OneDrive · iCloud Drive 동시 사용</p>
<hr>
<h2 id="1-증상--두-가지-문제-사실은-별개였다">1. 증상 — 두 가지 문제, 사실은 별개였다</h2>
<ul>
<li><strong>A.</strong> 부팅하자마자 앱 10개 이상이 한꺼번에 열림</li>
<li><strong>B.</strong> 배터리가 비정상적으로 빨리 닳음</li>
</ul>
<p>처음엔 A 때문에 B가 생긴 줄 알았다. <strong>결론부터 말하면 둘은 관계가 없었다.</strong> 이걸 구분하는 데 시간이 좀 걸렸다.</p>
<hr>
<h2 id="2-첫-번째-오해--로그인-항목이-아니었다">2. 첫 번째 오해 — &quot;로그인 항목&quot;이 아니었다</h2>
<p>앱이 자동으로 열리니 당연히 로그인 항목을 의심했다.</p>
<pre><code class="language-bash">osascript -e &#39;tell application &quot;System Events&quot; to get the name of every login item&#39;
# → Nextcloud</code></pre>
<p><strong>등록된 앱이 하나뿐이었다.</strong> 시스템 설정을 아무리 뒤져도 나머지 앱은 없다. 다른 경로가 있다는 뜻이다.</p>
<p>macOS에서 앱이 자동 실행되는 경로는 <strong>세 가지</strong>로 나뉜다.</p>
<table>
<thead>
<tr>
<th>경로</th>
<th>저장 위치</th>
<th>성격</th>
</tr>
</thead>
<tbody><tr>
<td>로그인 항목</td>
<td><code>BTM</code> (백그라운드 작업 관리자)</td>
<td>사용자가 명시적으로 등록</td>
</tr>
<tr>
<td>LaunchAgents</td>
<td><code>~/Library/LaunchAgents/</code></td>
<td>백그라운드 데몬·스크립트</td>
</tr>
<tr>
<td><strong>TAL 세션 복원</strong></td>
<td><code>~/Library/Preferences/ByHost/com.apple.loginwindow.&lt;UUID&gt;.plist</code></td>
<td><strong>종료 시 열려 있던 앱을 통째로 기록</strong></td>
</tr>
</tbody></table>
<p>범인은 세 번째였다.</p>
<pre><code class="language-bash">plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.*.plist | grep -A2 TALApps</code></pre>
<pre><code>&quot;TALAppsToRelaunchAtLogin&quot; =&gt; [
    &quot;BundleID&quot; =&gt; &quot;com.apple.systempreferences&quot;
    &quot;BundleID&quot; =&gt; &quot;com.kakao.kakaotalkmac&quot;
    &quot;BundleID&quot; =&gt; &quot;ru.keepcoder.telegram&quot;
    &quot;BundleID&quot; =&gt; &quot;com.hnc.discord&quot;
    &quot;BundleID&quot; =&gt; &quot;com.google.chrome&quot;
    ... 총 13개
]</code></pre><p><strong>TAL(Transparent App Lifecycle)</strong> — 시스템 종료 대화상자의 그 체크박스, &quot;<strong>다시 로그인할 때 창 다시 열기</strong>&quot;가 이 목록을 만든다. 무서운 건 이게 <strong>무차별</strong>이라는 점이다. 어제 잠깐 열어본 텍스트 편집기, 설정 확인하려고 연 시스템 설정까지 전부 기록된다.</p>
<p>이 목록은 <strong>로그인 후 앱을 복원하면 스스로 비워진다.</strong> 그래서 부팅 후에 확인하면 비어 있고, 다음 종료 때 다시 채워진다. 범인을 잡기 어려운 이유다.</p>
<h3 id="조치">조치</h3>
<pre><code class="language-bash">defaults write com.apple.loginwindow TALLogoutSavesState -bool false
defaults write com.apple.loginwindow LoginwindowLaunchesRelaunchApps -bool false</code></pre>
<p>다만 이 키만으로 확실히 막힌다는 보장은 없었다. <strong>확실한 건 종료 대화상자에서 체크박스를 한 번 해제하는 것</strong>이다(상태가 기억되므로 1회면 된다).</p>
<p>그리고 정말 필요한 앱만 골라 로그인 항목에 등록했다. 13개 → 3개.</p>
<blockquote>
<p><strong>주의</strong>: TAL을 끄면 Chrome 탭도 함께 날아간다. Chrome이 부팅 후 탭을 복원해주던 건 Chrome이 잘해서가 아니라 <strong>macOS가 Chrome을 통째로 되살려주고 있었기 때문</strong>이다. <code>chrome://settings/onStartup</code>에서 &quot;중단한 위치에서 계속하기&quot;를 켜서 Chrome 자체 복원으로 넘겨야 한다. 프로필별로 따로 설정해야 한다는 점도 함정.</p>
</blockquote>
<p>여기까지가 문제 A. <strong>이제 진짜 문제로 넘어간다.</strong></p>
<hr>
<h2 id="3-배터리-진단--하드웨어는-멀쩡했다">3. 배터리 진단 — 하드웨어는 멀쩡했다</h2>
<pre><code class="language-bash">system_profiler SPPowerDataType | grep -A4 &quot;Health Information&quot;</code></pre>
<pre><code>Cycle Count: 53
Condition: Normal
Maximum Capacity: 100%</code></pre><p>사이클 53회, 최대 용량 100%. <strong>배터리는 새것이나 다름없었다.</strong> 그럼 소프트웨어가 CPU를 태우고 있다는 뜻이다.</p>
<pre><code class="language-bash">ps -Aceo pid,pcpu,pmem,rss,etime,comm -r | head -10</code></pre>
<pre><code>  PID  %CPU %MEM    RSS ELAPSED COMM
 1296 111.8  0.7 187664   04:00 FileProviderExt
  695  49.8  0.6 156160   05:18 fileproviderd
  721  37.8  1.7 422368   05:18 corespotlightd
  494  23.3  0.2  39104   05:21 syspolicyd
  826   5.0  0.8 195824   05:16 mediaanalysisd</code></pre><blockquote>
<p><code>%CPU</code>가 100을 넘는 건 멀티코어 합산 기준이다. 111.8%는 코어 하나를 다 쓰고도 남는다는 뜻.</p>
</blockquote>
<p><code>FileProviderExt</code>의 정체를 확인해보니:</p>
<pre><code class="language-bash">ps -p 1296 -o args=
# /Applications/Nextcloud.app/Contents/PlugIns/FileProviderExt.appex/...</code></pre>
<p><strong>Nextcloud였다.</strong> 그리고 <code>fileproviderd</code>(macOS 파일 동기화 데몬)와 Spotlight 관련 프로세스들이 줄줄이 따라붙어 있었다. 합계 <strong>343%</strong>.</p>
<p>메모리도 확인했지만 여유 78%, 스왑 0바이트. 메모리 문제는 아니었다.</p>
<hr>
<h2 id="4-첫-번째-실험--nextcloud를-꺼봤다">4. 첫 번째 실험 — Nextcloud를 꺼봤다</h2>
<p>가장 단순한 검증. 껐다 켜서 CPU가 어떻게 변하는지 본다.</p>
<table>
<thead>
<tr>
<th>프로세스</th>
<th align="right">종료 전</th>
<th align="right">종료 후</th>
</tr>
</thead>
<tbody><tr>
<td>FileProviderExt</td>
<td align="right">90.9%</td>
<td align="right"><strong>사라짐</strong></td>
</tr>
<tr>
<td>corespotlightd</td>
<td align="right">96.7%</td>
<td align="right"><strong>26.8%</strong></td>
</tr>
<tr>
<td>mds</td>
<td align="right">19.2%</td>
<td align="right"><strong>6.3%</strong></td>
</tr>
<tr>
<td>suggestd</td>
<td align="right">11.2%</td>
<td align="right">5.3%</td>
</tr>
<tr>
<td><strong>fileproviderd</strong></td>
<td align="right">108.5%</td>
<td align="right"><strong>125.8%</strong> ❌</td>
</tr>
<tr>
<td><strong>합계</strong></td>
<td align="right"><strong>343%</strong></td>
<td align="right"><strong>180%</strong></td>
</tr>
</tbody></table>
<p>절반은 잡혔는데 <strong><code>fileproviderd</code>만 오히려 올라갔다.</strong> Nextcloud 탓이 아니었다는 뜻이다.</p>
<h3 id="여기서-첫-번째-교훈">여기서 첫 번째 교훈</h3>
<p>처음에 나는 <strong>합계만 보고</strong> &quot;안 줄었네&quot;라고 판단할 뻔했다. 실제로 뒤에서 한 번 그 실수를 한다. <strong>프로세스별로 뜯어봐야 한다.</strong></p>
<hr>
<h2 id="5-fileproviderctl-dump--26시간짜리-무한-재시도">5. <code>fileproviderctl dump</code> — 26시간짜리 무한 재시도</h2>
<p>macOS에는 File Provider 상태를 통째로 덤프하는 명령이 있다.</p>
<pre><code class="language-bash">fileproviderctl dump &gt; dump.txt</code></pre>
<p>이게 <strong>280MB에 112만 줄</strong>이 나왔다. 이 크기 자체가 이미 단서다. 안에서 이런 걸 발견했다.</p>
<pre><code>i:docID(691592) create-item: 🔶 last:&#39;-7h10min&#39; expired:&#39;never&#39; count:1
  error: NSFileProviderErrorDomain -2010
  └ BRCloudDocsErrorDomain:83 &quot;Excluded From Sync Due To Filename&quot;

i:docID(691567) create-item: 🔶 last:&#39;-25h42min&#39; expired:&#39;never&#39;
i:docID(691563) create-item: 🔶 last:&#39;-25h59min&#39; expired:&#39;never&#39;</code></pre><p><code>BRCloudDocsErrorDomain</code>은 <strong>iCloud Drive</strong>의 에러 도메인이다. Nextcloud가 아니라 iCloud였다.</p>
<p><strong><code>expired: &#39;never&#39;</code></strong> — 이게 핵심이다. <strong>만료되지 않는 재시도.</strong> &quot;파일 이름 때문에 동기화할 수 없다&quot;는 파일을 26시간 동안 쉬지 않고 다시 올리려 하고 있었다. 성공할 리 없는데도.</p>
<h3 id="조치-데몬-재시작">조치: 데몬 재시작</h3>
<pre><code class="language-bash">killall fileproviderd   # launchd가 즉시 자동 재시작</code></pre>
<p>결과는 극적이었다.</p>
<pre><code>fileproviderd        183%  →  0.0%
corespotlightd      96.7%  →  0.0%
mds / suggestd / spotlightknowledged  →  전부 0.0%</code></pre><p><strong>343% → 0%.</strong> 해결한 줄 알았다.</p>
<hr>
<h2 id="6-두-번째-교훈--재시작은-증상만-없앤다">6. 두 번째 교훈 — 재시작은 증상만 없앤다</h2>
<p>Nextcloud를 다시 켜고 2분 만에:</p>
<pre><code>FileProviderExt   86.6%
spotlightknowledged 38.9%
fileproviderd     35.8%</code></pre><p><strong>전부 돌아왔다.</strong> <code>killall</code>이 해결한 건 &quot;재시도 루프에 갇힌 상태&quot; 하나뿐이었고, <strong>왜 그런 상태가 되는지</strong>는 그대로였다.</p>
<blockquote>
<p>재부팅이나 데몬 재시작으로 고쳐지는 문제는, 대개 고쳐진 게 아니라 <strong>타이머가 리셋된 것</strong>이다.</p>
</blockquote>
<hr>
<h2 id="7-진짜-원인--클라우드에-개발-환경이-통째로-올라가-있었다">7. 진짜 원인 — 클라우드에 개발 환경이 통째로 올라가 있었다</h2>
<p>덤프에서 확장자별로 집계해봤다.</p>
<pre><code class="language-bash">grep -oE &#39;/[A-Za-z0-9_{}]+\.[a-z0-9]{1,10} cver&#39; dump.txt \
  | grep -oE &#39;\.[a-z0-9]{1,10} cver&#39; | sed &#39;s/ cver//&#39; \
  | sort | uniq -c | sort -rn | head -12</code></pre>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/0a35c4fb-bde3-4feb-914f-60523473be3a/image.png" alt=""></p>
<pre><code>176410 .jpg
156548 .py
152718 .pyc      ← Python 바이트코드 캐시
 80752 .h        ← C 헤더 (패키지 내부)
 56916 .parquet
 48712 .json
 46482 .hpp
 41524 .js</code></pre><p><strong>총 100만 개 이상.</strong> 그리고 실제 경로를 추적하니:</p>
<pre><code>OneDrive/프로그램/eclipse-jee-2023-03-R-win32-x86_64/
    └ Windows용 Eclipse IDE 전체 (node_modules 다수)

OneDrive/프로그램/cli-11.0.0-pre.1/node_modules/
    └ npm CLI 소스 전체

OneDrive/Study/&lt;강의명&gt;/&lt;venv&gt;/lib/python3.11/site-packages/
    └ Python 가상환경 전체 — torch 포함</code></pre><p><code>eclipse-...-win32-x86_64</code>. <strong>맥에서는 실행조차 안 되는 Windows 전용 빌드</strong>가 수만 개 파일로 동기화되고 있었다.</p>
<h3 id="여기서-가장-중요한-통찰">여기서 가장 중요한 통찰</h3>
<p><strong>폴더 용량은 93MB밖에 안 됐다.</strong></p>
<pre><code class="language-bash">du -sh ~/Library/CloudStorage/*
#  93M  Nextcloud-...
#  16M  OneDrive-...
# 3.5M  iCloud Drive</code></pre>
<p>용량만 보면 아무 문제 없어 보인다. 왜냐하면 <strong>File Provider 방식은 파일 실체를 내려받지 않고 목록만 관리</strong>하기 때문이다.</p>
<blockquote>
<p><strong>부하의 실체는 용량이 아니라 항목 수다.</strong>
100만 개 파일의 &quot;변경됐는지&quot;를 계속 추적하는 것 자체가 비용이다. 파일이 0바이트여도 마찬가지다.</p>
</blockquote>
<h3 id="그리고-연쇄가-일어난다">그리고 연쇄가 일어난다</h3>
<pre><code>클라우드가 파일 상태 갱신
   ↓
Spotlight가 &quot;새 파일이네?&quot; 하고 색인하려 함
   ↓
색인하려면 내용을 읽어야 하니 다운로드 요청
   ↓
File Provider가 서버에서 받아옴 → 파일이 새로 생김
   ↓
Spotlight가 또 색인 ... (무한 반복)</code></pre><p><code>corespotlightd</code>, <code>mds</code>, <code>suggestd</code>, <code>spotlightknowledged</code>가 <strong>함께</strong> 폭주하고 있었던 이유가 이것이다. Nextcloud 하나가 시스템 데몬 5개를 끌고 다니고 있었다.</p>
<hr>
<h2 id="8-조치-두-가지">8. 조치 두 가지</h2>
<h3 id="①-onedrive-선택적-동기화-해제">① OneDrive 선택적 동기화 해제</h3>
<p><code>프로그램</code> 폴더(Windows Eclipse + npm CLI) 동기화 해제. <strong>서버에는 그대로 남고 이 맥에서만 안 받는다.</strong></p>
<h3 id="②-spotlight-색인에서-클라우드-폴더-제외">② Spotlight 색인에서 클라우드 폴더 제외</h3>
<p><code>시스템 설정 &gt; Spotlight &gt; 검색 개인 정보 보호</code>에 <code>~/Library/CloudStorage</code> 추가.</p>
<blockquote>
<p><code>~/Library</code>는 숨김 폴더라 파일 선택창에서 <code>⌘⇧G</code>로 경로를 직접 입력해야 한다.</p>
</blockquote>
<p>검증:</p>
<pre><code class="language-bash">mdfind -onlyin ~/Library/CloudStorage &quot;kMDItemFSName == &#39;*&#39;&quot; | wc -l
# → 0    (색인에서 완전히 빠짐)</code></pre>
<hr>
<h2 id="9-세-번째-교훈--부하-증가가-성공의-신호일-때가-있다">9. 세 번째 교훈 — 부하 증가가 성공의 신호일 때가 있다</h2>
<p>조치 직후 CPU가 <strong>590%까지 치솟았다.</strong></p>
<pre><code>OneDrive                    127.7%
fileproviderd               117.6%
Finder                      103.0%
suggestd                     98.4%
spotlightknowledged.updater  62.2%</code></pre><p>실패한 줄 알고 되돌릴 뻔했다. 하지만 이건 <strong>100만 개 항목을 인덱스에서 걷어내는 일회성 청소 비용</strong>이었다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/a4ad492e-e3c2-4329-9b4d-076944188fc2/image.png" alt=""></p>
<blockquote>
<p>대규모 정리 작업은 <strong>서서히 줄지 않는다.</strong> 100% 근처를 유지하다가 어느 순간 한 번에 떨어진다. 중간에 조급해져서 개입하면 오히려 처음부터 다시 시작한다.</p>
</blockquote>
<hr>
<h2 id="10-suggestd의-정체--sample로-스택을-뜬다">10. <code>suggestd</code>의 정체 — <code>sample</code>로 스택을 뜬다</h2>
<p>청소가 끝나도 <code>suggestd</code> 하나만 99%를 유지했다. 나는 이걸 <strong>&quot;오늘 문제와 무관한 별개 건&quot;이라고 두 번이나 판단했다. 틀렸다.</strong></p>
<p>이 프로세스는 로그를 전혀 남기지 않았다.</p>
<pre><code class="language-bash">log stream --predicate &#39;process == &quot;suggestd&quot;&#39; --style compact
# (출력 없음)</code></pre>
<p>이럴 때 쓰는 게 <code>sample</code>이다. <strong>프로세스가 지금 어떤 함수에서 CPU를 쓰는지</strong> 스택을 떠준다.</p>
<pre><code class="language-bash">sample $(pgrep -x suggestd) 5 -file out.txt</code></pre>
<pre><code>HVQueues informObserversToDeleteWithRequest:
 └ HVConsumerCoordinator deleteContentWithRequest:
   └ HVSpotlightDeletionRequest              ← Spotlight 삭제 요청
     └ PPLocalNamedEntityStore deleteAllNamedEntities...
       └ PPLocalTopicStore deleteAllTopics...
         └ PPRecordStorageHelper deleteAllRecordsSourcedFromBundleId:</code></pre><p><strong><code>HVSpotlightDeletionRequest</code>.</strong> 내가 Spotlight에서 클라우드를 제외한 바로 그 작업의 <strong>후속 처리</strong>였다.</p>
<p>macOS는 파일을 색인할 때 목록만 만드는 게 아니라, <strong>&quot;개인화 프로필&quot;(Personalization Portrait)</strong> DB에 그 파일의 주제·인물·개체를 뽑아 저장한다. Siri 제안이 똑똑해지는 원리다. 그래서 색인 100만 개가 사라지면 <strong>거기 딸린 개인화 데이터 100만 건도 SQLite에서 하나씩 지워야</strong> 한다.</p>
<p>메모리 32MB에 CPU만 100%였던 것도 이걸로 설명된다. 대용량 로딩이 아니라 <strong>작은 레코드를 끝없이 지우는 작업</strong>이니까.</p>
<p>그리고 예상대로, 40분쯤 뒤 <strong>한 번에</strong> 0%가 됐다.</p>
<hr>
<h2 id="11-결과">11. 결과</h2>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/05f49259-2bba-4fc8-9cee-bdfa7d8163d4/image.png" alt=""></p>
<table>
<thead>
<tr>
<th>프로세스</th>
<th align="right">조치 전</th>
<th align="right">조치 후</th>
</tr>
</thead>
<tbody><tr>
<td>fileproviderd</td>
<td align="right">108.5%</td>
<td align="right"><strong>0.0%</strong></td>
</tr>
<tr>
<td>suggestd</td>
<td align="right">98.8%</td>
<td align="right"><strong>0.0%</strong></td>
</tr>
<tr>
<td>corespotlightd</td>
<td align="right">96.7%</td>
<td align="right"><strong>0.0%</strong></td>
</tr>
<tr>
<td>mds / mds_stores</td>
<td align="right">19.2%</td>
<td align="right"><strong>0.0%</strong></td>
</tr>
<tr>
<td>spotlightknowledged</td>
<td align="right">16.5%</td>
<td align="right"><strong>0.0%</strong></td>
</tr>
<tr>
<td>FileProviderExt</td>
<td align="right">90.9%</td>
<td align="right">29.1%</td>
</tr>
<tr>
<td><strong>합계</strong></td>
<td align="right"><strong>343%</strong></td>
<td align="right"><strong>~30%</strong></td>
</tr>
</tbody></table>
<p><code>FileProviderExt</code>가 남은 29%도 의미가 있다. <strong>Nextcloud는 똑같이 켜져 있는데 3분의 1로 줄었다.</strong> 연쇄가 끊겼기 때문이다. 예전엔 파일을 건드릴 때마다 Spotlight 4개가 따라붙었지만, 이제 혼자 조용히 돈다.</p>
<hr>
<h2 id="12-시행착오-기록--안-통한-것들">12. 시행착오 기록 — 안 통한 것들</h2>
<p>성공한 것만 적으면 다음에 또 같은 길로 들어간다.</p>
<h3 id="❌-dsdontwritenetworkstores">❌ <code>DSDontWriteNetworkStores</code></h3>
<p><code>.DS_Store</code> 생성을 막는 Apple 공식 설정. 실패 항목 샘플 3건이 전부 <code>.DS_Store</code>여서 이게 범인인 줄 알았다.</p>
<pre><code class="language-bash">defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true</code></pre>
<p>결과: <code>update-item</code> 실패 <strong>1,243 → 1,247건</strong>. 변화 없음.</p>
<p>원인은 두 가지였다. 이 설정은 원래 <strong>SMB/AFP 네트워크 드라이브용</strong>이라 File Provider엔 통하지 않고, 무엇보다 <strong><code>.DS_Store</code>는 전체 1,247건 중 41건뿐</strong>이었다. 샘플 3건을 보고 전체를 단정한 게 잘못이었다.</p>
<h3 id="❌-클라우드-폴더를-findls로-탐색">❌ 클라우드 폴더를 <code>find</code>/<code>ls</code>로 탐색</h3>
<pre><code class="language-bash">find ~/Library/CloudStorage/Nextcloud-* -name &quot;.DS_Store&quot;
# → 2분 타임아웃

ls ~/Library/CloudStorage/Nextcloud-*/어떤폴더/
# → 4초 타임아웃</code></pre>
<p><strong>File Provider 폴더는 디렉터리 목록조차 서버에 물어봐야 한다.</strong> 로컬 디스크처럼 즉시 답이 오지 않는다. 게다가 탐색 자체가 파일 다운로드를 유발해서 <strong>문제를 악화시킨다.</strong></p>
<p><code>mdfind</code>(Spotlight 색인 조회)는 파일에 접근하지 않아 안전하지만, <strong>색인에서 제외한 뒤에는 당연히 0건</strong>이 나온다. 실제로 나는 이것 때문에 &quot;Nextcloud엔 <code>.pyc</code>가 없다&quot;고 잘못 판단했다가, 덤프를 보고 3만 개가 있다는 걸 뒤늦게 알았다.</p>
<h3 id="❌-합계-cpu만-보고-판단">❌ 합계 CPU만 보고 판단</h3>
<p>10분 추적 로그에서 합계가 386% → 423%로 오히려 늘어난 것처럼 보였다. 그런데 프로세스별로 보니:</p>
<pre><code>OneDrive File Provider   30.8% → 0.6%   ▼ 98%
corespotlightd           80.7% → 5.2%   ▼ 94%
suggestd                 98.8% → 99.3%  변화 없음  ← 이게 다 가리고 있었다</code></pre><p><strong>한 프로세스가 100%를 붙들고 있으면 나머지의 개선이 통째로 묻힌다.</strong></p>
<h3 id="❌-남은-시간-추정">❌ 남은 시간 추정</h3>
<p>&quot;5~15분이면 끝날 것&quot;이라고 말했다가 틀렸다. 감소 추세를 가정했는데 실제로는 등락이었다. <strong>macOS는 이런 정리 작업의 진행률을 어디에도 노출하지 않는다.</strong> 근거 없는 추정은 하지 않는 게 낫다.</p>
<hr>
<h2 id="13-재사용-가능한-진단-레시피">13. 재사용 가능한 진단 레시피</h2>
<pre><code class="language-bash"># 1. CPU 상위 프로세스 — 합계 말고 개별로 본다
ps -Aceo pid,pcpu,pmem,rss,etime,comm -r | head -15

# 2. 프로세스 정체 확인
ps -p &lt;PID&gt; -o args=

# 3. 배터리 하드웨어 상태 (사이클/최대용량)
system_profiler SPPowerDataType | grep -A4 &quot;Health Information&quot;

# 4. 잠자기 방지 요인
pmset -g assertions

# 5. 자동 실행 3종 경로
osascript -e &#39;tell application &quot;System Events&quot; to get the name of every login item&#39;
ls ~/Library/LaunchAgents/ /Library/LaunchAgents/
plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.*.plist

# 6. File Provider 상태 덤프 (280MB+, 2분 이상 걸림)
fileproviderctl dump &gt; dump.txt
grep -c &quot;🔶&quot; dump.txt                      # 실패 항목 수
grep &quot;expired:&#39;never&#39;&quot; dump.txt | head     # 무한 재시도 탐지

# 7. 로그를 안 남기는 프로세스의 스택 추적 ★
sample &lt;PID&gt; 5 -file out.txt

# 8. Spotlight 색인 조회 (파일 접근 없음 — 안전)
mdfind -onlyin &lt;path&gt; &quot;kMDItemFSName == &#39;*.pyc&#39;&quot; | wc -l

# 9. 데몬 재시작 (launchd가 자동 복구)
killall fileproviderd
killall suggestd</code></pre>
<p>특히 <strong>7번 <code>sample</code></strong>은 이번에 가장 큰 도움이 됐다. 로그도 없고 이름만 봐선 뭘 하는지 알 수 없는 시스템 데몬의 정체를, 스택 한 번으로 확인할 수 있다.</p>
<hr>
<h2 id="14-정리--배운-것">14. 정리 — 배운 것</h2>
<p><strong>1. macOS의 앱 자동 실행은 세 갈래다.</strong> 로그인 항목만 봐서는 절대 못 찾는다. TAL 세션 복원은 무차별로 기록하고, 복원 후 스스로 목록을 비운다.</p>
<p><strong>2. File Provider의 부하는 용량이 아니라 항목 수에 비례한다.</strong> 93MB 폴더가 코어 3개를 태울 수 있다. <code>du -sh</code>로 판단하면 안 된다.</p>
<p><strong>3. 클라우드에 개발 환경을 올리지 말자.</strong> <code>.pyc</code>, <code>node_modules</code>, <code>venv</code>, <code>site-packages</code>는 전부 재생성 가능한 산출물이다. <code>.gitignore</code>에 넣는 것들은 클라우드 동기화에서도 빼는 게 맞다.</p>
<p><strong>4. 데몬 재시작으로 고쳐진 건 대개 안 고쳐진 것이다.</strong> 원인이 남아 있으면 반드시 돌아온다.</p>
<p><strong>5. 조치 직후의 부하 급증은 성공의 신호일 수 있다.</strong> 대규모 정리는 서서히가 아니라 한 번에 끝난다.</p>
<p><strong>6. 합계가 아니라 개별 프로세스를 봐라.</strong> 하나가 나머지를 다 가린다.</p>
<p><strong>7. 진행률이 없는 작업의 남은 시간을 추정하지 말자.</strong> 근거 없이 말하면 틀린다.</p>
<hr>
<h2 id="마지막으로">마지막으로</h2>
<p>가장 아이러니한 건, 이 모든 게 <strong>&quot;클라우드를 편하게 쓰려고&quot; 한 선택의 결과</strong>였다는 점이다. 프로젝트 폴더를 통째로 동기화 폴더에 넣어두면 어디서든 이어서 작업할 수 있으니까. 그런데 그 안에 <code>venv</code>와 <code>node_modules</code>가 딸려 들어가는 순간, 파일 개수가 만 단위로 뛴다.</p>
<p><strong>동기화 폴더에도 <code>.gitignore</code>가 필요하다.</strong> 이번에 얻은 가장 실용적인 결론이다.</p>
<p>Nextcloud에도 여전히 개발 파일 13만 개가 남아 있지만, 이건 의도적으로 두기로 했다. 폴더 접근성을 해치면서까지 남은 29%를 줄일 이유는 없었다. 필요해지면 <code>sync-exclude.lst</code>에 규칙을 추가하면 된다.</p>
<pre><code>]*.pyc
]__pycache__
]venv
].venv
]site-packages
]node_modules</code></pre><p>이러면 폴더 구조는 그대로 두고 재생성 가능한 파일만 빠진다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[『Machine Learning 개론』 Part 3. Recent Progress of Large Language Models]]></title>
            <link>https://velog.io/@d_yeon819/%E3%80%8EMachine-Learning-%EA%B0%9C%EB%A1%A0%E3%80%8F-Part-3.-Recent-Progress-of-Large-Language-Models</link>
            <guid>https://velog.io/@d_yeon819/%E3%80%8EMachine-Learning-%EA%B0%9C%EB%A1%A0%E3%80%8F-Part-3.-Recent-Progress-of-Large-Language-Models</guid>
            <pubDate>Wed, 24 Jul 2024 09:17:19 GMT</pubDate>
            <description><![CDATA[<h2 id="개요">개요</h2>
<p>이번 3강에서는 현재 가장 많은 관심을 받고 있는 초거대 언어모델에 대해 다룰 예정입니다. 특히, 오픈AI의 GPT 시리즈와 그 이후의 다양한 라지 랭귀지 모델(LLM)들에 대해 살펴보고, 이들 모델이 인공지능 연구와 개발에 어떤 영향을 미치고 있는지 논의할 것입니다.</p>
<h2 id="gpt-3와-그-이후">GPT-3와 그 이후</h2>
<h3 id="gpt-3">GPT-3</h3>
<p>GPT-3 (Generative Pre-trained Transformer 3)는 오픈AI에서 개발한 모델로, 1,750억 개의 파라미터를 가진 초거대 언어모델입니다. GPT-3는 다양한 태스크에 대해 놀라운 성능을 보이며, 번역, 요약, 코딩 등 다양한 작업을 수행할 수 있습니다. GPT-3의 등장은 기존의 특정 태스크에만 집중된 인공지능 모델과 달리, 범용 인공지능의 가능성을 열었습니다.</p>
<h3 id="인스트럭트-gpt-gpt-35">인스트럭트 GPT (GPT-3.5)</h3>
<p>GPT-3 이후, 오픈AI는 인스트럭트 GPT라는 모델을 개발했습니다. 이 모델은 사용자의 지시를 더욱 잘 이해하고 따를 수 있도록 강화 학습(특히 RLHF, Reinforcement Learning from Human Feedback)을 통해 학습되었습니다. 인스트럭트 GPT는 GPT-3의 언어 이해 능력을 바탕으로, 사용자가 제공하는 지시를 유용하고 안전하게 수행할 수 있도록 설계되었습니다.</p>
<h3 id="chatgpt">ChatGPT</h3>
<p>ChatGPT는 인스트럭트 GPT에 대화형 사용자 인터페이스를 결합한 모델입니다. 2022년 11월에 출시되었으며, 일반 사용자들도 쉽게 접근할 수 있게 되었습니다. ChatGPT는 출시 두 달 만에 월간 활성 사용자 수(MAU) 1억 명을 돌파하며, 매우 빠른 성장세를 보였습니다.</p>
<h3 id="gpt-4">GPT-4</h3>
<p>GPT-4는 두 가지 주요 특징을 강조합니다: 멀티모달 처리와 인간 시험에서의 뛰어난 성능입니다. 멀티모달 처리란 텍스트뿐만 아니라 이미지를 함께 이해하고 처리할 수 있는 능력을 의미합니다. 또한 GPT-4는 변호사 시험, 대학 입학 시험 등에서 상위 20%의 성적을 기록할 정도로 높은 성능을 보입니다.</p>
<h2 id="다른-초거대-언어모델들">다른 초거대 언어모델들</h2>
<h3 id="anthropic의-claude">Anthropic의 Claude</h3>
<p>Claude는 2021년에 오픈AI를 떠난 연구진이 설립한 Anthropic에서 개발한 모델입니다. Claude는 GPT와 유사한 성능을 보이며, 지속적으로 개선되고 있습니다.</p>
<h3 id="구글의-bard">구글의 Bard</h3>
<p>구글은 GPT에 대응하기 위해 Bard라는 모델을 개발했습니다. Bard는 구글 검색과 연동되어 사용자에게 더욱 편리한 검색 경험을 제공합니다. 구글의 팜(PaLM) 모델을 기반으로 하며, 5천억 개의 파라미터를 가진 대규모 모델입니다.</p>
<h3 id="메타의-llama">메타의 LLaMA</h3>
<p>메타는 오픈소스 전략을 통해 LLaMA 모델을 공개했습니다. 이 모델은 다양한 사이즈로 제공되며, 학계와 산업계에서 널리 활용되고 있습니다. 메타는 이를 통해 많은 사용자 기반을 확보하고, 다양한 응용 분야에서 사용될 수 있도록 하고 있습니다.</p>
<h2 id="셀프-인스트럭션-튜닝">셀프 인스트럭션 튜닝</h2>
<p>스탠포드 대학 연구진은 메타의 LLaMA 모델을 가져와 셀프 인스트럭션 튜닝을 통해 성능을 향상시켰습니다. 이를 통해 GPT와 유사한 성능을 저렴하게 얻을 수 있으며, 다양한 응용 분야에 활용할 수 있습니다.</p>
<h3 id="vicuna">Vicuna</h3>
<p>Vicuna는 LLaMA 모델을 기반으로 개발된 모델입니다. ShareGPT.com에서 수집한 50만 개의 데이터셋을 활용해 학습되었으며, 약 300달러의 비용으로 개발되었습니다. Vicuna는 높은 성능을 저렴한 비용으로 제공하는 예시로 주목받고 있습니다.</p>
<h2 id="결론">결론</h2>
<p>초거대 언어모델의 발전은 데이터 중심의 인공지능을 더욱 강화하고 있습니다. 오픈AI의 GPT 시리즈뿐만 아니라, 구글, 메타, Anthropic 등 다양한 회사들이 경쟁하며 이 분야를 발전시키고 있습니다. 초거대 언어모델은 앞으로도 빠르게 발전할 것이며, 연구자와 개발자들에게 많은 기회를 제공할 것입니다.</p>
<p>지속적인 관심과 연구를 통해 초거대 언어모델의 발전과 함께할 수 있기를 바랍니다. </p>
<p>이 요약본은 LG Aimers Academy의 교육 내용을 바탕으로 작성되었습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[『Machine Learning 개론』 Part 2. Bias and Variance]]></title>
            <link>https://velog.io/@d_yeon819/%E3%80%8EMachine-Learning-%EA%B0%9C%EB%A1%A0%E3%80%8F-Part-2.-Bias-and-Variance</link>
            <guid>https://velog.io/@d_yeon819/%E3%80%8EMachine-Learning-%EA%B0%9C%EB%A1%A0%E3%80%8F-Part-2.-Bias-and-Variance</guid>
            <pubDate>Wed, 24 Jul 2024 03:59:17 GMT</pubDate>
            <description><![CDATA[<h2 id="개요">개요</h2>
<p>이번 강의에서는 오버피팅과 언더피팅의 개념에 대해 살펴볼 예정입니다. 이 두 개념은 기계학습의 목표인 일반화와 밀접한 관계가 있으며, 바이어스와 배리언스와도 깊게 연관되어 있습니다. 이를 이해하는 것이 적절한 기계학습 모델을 선택하는 데 필수적입니다.</p>
<h2 id="기계학습의-포멀한-정의">기계학습의 포멀한 정의</h2>
<p>기계학습에서 학습 데이터는 주어진 입력(x)과 그에 대응하는 출력(y)의 쌍으로 구성됩니다. 예를 들어, D차원의 벡터 형태의 입력과 이진 분류를 위한 출력(y)이 플러스 1 또는 마이너스 1로 주어질 수 있습니다.</p>
<h3 id="모델-클래스-정의">모델 클래스 정의</h3>
<p>모델 클래스는 학습 데이터에 대한 예측을 수행하기 위한 함수 형태로 정의됩니다. 예를 들어, 선형 모델을 사용할 경우, 모델은 선형 함수로 정의됩니다. 학습을 통해 모델의 파라미터가 결정되며, 이 파라미터는 학습 데이터에 대한 예측 성능을 최적화합니다.</p>
<h3 id="손실-함수-loss-function">손실 함수 (Loss Function)</h3>
<p>손실 함수는 모델의 예측값과 실제값 사이의 차이를 수치적으로 나타내는 함수입니다. 예를 들어, 회귀 문제에서는 예측값과 실제값의 차이의 제곱을 손실로 정의할 수 있고, 분류 문제에서는 예측이 틀린 경우 손실을 1로 정의할 수 있습니다. 학습 과정에서 이 손실을 최소화하는 방향으로 모델 파라미터가 조정됩니다.</p>
<h2 id="일반화의-중요성">일반화의 중요성</h2>
<p>일반화는 모델이 학습 데이터 외의 새로운 데이터에서도 좋은 성능을 보이는 능력입니다. 기계학습의 궁극적인 목표는 학습 데이터에 대한 성능이 아니라, 새로운 데이터에 대한 성능을 높이는 것입니다. 이는 오버피팅과 언더피팅과 관련이 있습니다.</p>
<h3 id="오버피팅과-언더피팅">오버피팅과 언더피팅</h3>
<blockquote>
</blockquote>
<p>•    <strong>오버피팅</strong>: 모델이 학습 데이터에 너무 맞춰져서 새로운 데이터에 대해 성능이 떨어지는 현상입니다. 학습 데이터의 노이즈까지 학습하여 복잡한 모델이 되는 경우입니다.
•    <strong>언더피팅</strong>: 모델이 학습 데이터에 충분히 맞춰지지 않아 성능이 떨어지는 현상입니다. 모델의 복잡도가 너무 낮아 데이터를 잘 설명하지 못하는 경우입니다.</p>
<h2 id="일반화-오류">일반화 오류</h2>
<p>기계학습의 목적은 일반화 오류(Generalization Error)를 최소화하는 것입니다. 이는 모델이 보지 못한 새로운 데이터에 대해 얼마나 잘 예측하는지를 나타내는 지표입니다.</p>
<h3 id="트레이닝-에러와-테스트-에러">트레이닝 에러와 테스트 에러</h3>
<blockquote>
</blockquote>
<p>•    <strong>트레이닝 에러</strong>: 학습 데이터에 대한 오류입니다.
•    <strong>테스트 에러</strong>: 보지 못한 새로운 데이터에 대한 오류입니다.</p>
<p>오버피팅은 트레이닝 에러는 낮지만 테스트 에러는 높은 상황이며, 언더피팅은 트레이닝 에러와 테스트 에러 모두 높은 상황입니다.</p>
<h2 id="bias와-variance">Bias와 Variance</h2>
<p>Bias와 Variance는 모델의 성능을 평가하는 중요한 개념입니다.</p>
<blockquote>
</blockquote>
<p>•    <strong>Bias</strong>: 모델이 실제값과 얼마나 떨어져 있는지를 나타내는 지표입니다. 높은 바이어스는 모델이 단순하여 데이터의 복잡성을 잘 반영하지 못하는 경우입니다.
•    <strong>Variance</strong>: 모델이 얼마나 불안정하게 예측하는지를 나타내는 지표입니다. 높은 배리언스는 모델이 학습 데이터의 노이즈까지 학습하여 새로운 데이터에 대해 성능이 불안정한 경우입니다.</p>
<h3 id="bias-variance-trade-off">Bias-Variance Trade-off</h3>
<p>Bias와 Variance는 서로 트레이드오프 관계에 있습니다. 모델의 복잡도를 높이면 Bias는 낮아지지만 Variance는 높아지고, 반대로 모델의 복잡도를 낮추면 Bias는 높아지지만 Variance는 낮아집니다.</p>
<h3 id="앙상블-러닝">앙상블 러닝</h3>
<p>앙상블 러닝은 여러 개의 모델을 결합하여 바이어스와 배리언스를 모두 낮추는 방법입니다. 이를 통해 보다 안정적이고 성능이 높은 모델을 만들 수 있습니다.</p>
<h2 id="정리">정리</h2>
<p>이번 강의에서는 오버피팅, 언더피팅, 바이어스, 배리언스의 개념과 이들 사이의 관계를 살펴보았습니다. 기계학습의 목표는 일반화 오류를 최소화하는 것이며, 이를 위해 바이어스와 배리언스를 적절히 조절하는 것이 중요합니다. 이를 위해 모델의 복잡도를 조절하고, 필요에 따라 레귤러라이제이션을 사용하는 등의 방법을 사용할 수 있습니다.</p>
<p>이 요약본은 LG Aimers Academy의 교육 내용을 바탕으로 작성되었습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[『Machine Learning 개론』 Part 1. Introduction to Machine Learning]]></title>
            <link>https://velog.io/@d_yeon819/%E3%80%8EMachine-Learning-%EA%B0%9C%EB%A1%A0%E3%80%8F-Part-1.-Introduction-to-Machine-Learning</link>
            <guid>https://velog.io/@d_yeon819/%E3%80%8EMachine-Learning-%EA%B0%9C%EB%A1%A0%E3%80%8F-Part-1.-Introduction-to-Machine-Learning</guid>
            <pubDate>Wed, 24 Jul 2024 03:38:42 GMT</pubDate>
            <description><![CDATA[<h2 id="기계학습의-정의-및-역사">기계학습의 정의 및 역사</h2>
<h3 id="기계학습의-정의">기계학습의 정의</h3>
<p>기계학습은 인공지능의 한 분야로, 실험적으로 얻은 데이터로부터 점점 개선되는 알고리즘을 설계하고 개발하는 학문입니다. 기계학습의 목표는 데이터로부터 학습하여 성능을 향상시키는 것입니다. 이를 통해 기계학습 시스템은 주어진 작업(T)을 통해 성능 지표(P)를 개선할 수 있습니다.</p>
<blockquote>
</blockquote>
<p>•    <strong>인공지능</strong>: 사람과 같은 지능을 만들기 위한 학문.
•    <strong>기계학습</strong>: 데이터로부터 스스로 개선되는 알고리즘을 다루는 학문.
•    <strong>딥러닝</strong>: 신경망 기반의 기계학습의 한 분야로, 특히 깊은 신경망(Deep Neural Networks)을 사용.</p>
<h3 id="기계학습의-역사">기계학습의 역사</h3>
<blockquote>
</blockquote>
<ol>
<li><strong>허벌트 사이먼 (Herbert Simon)</strong>: 기계학습을 경험을 통해 성능을 높이는 시스템이라고 정의.</li>
<li><strong>Arthur Samuel</strong>: 체스 프로그램을 개발하면서 기계가 직접 프로그래밍 없이 학습할 수 있는 능력을 강조.</li>
<li><strong>탐 미첼 (Tom Mitchell)</strong>: 기계학습을 T(작업), P(성능 지표), E(경험 데이터)로 정의. 이는 작업, 성능 지표, 학습 데이터를 명확히 정의함으로써 기계학습 문제를 설정.</li>
</ol>
<h2 id="기계학습과-전통적-프로그래밍의-비교">기계학습과 전통적 프로그래밍의 비교</h2>
<blockquote>
</blockquote>
<p>•    <strong>전통적 프로그래밍</strong>: 코드와 입력을 컴퓨터에 주어 결과를 도출.
•    <strong>기계학습</strong>: 입력과 원하는 출력을 컴퓨터에 주어 프로그램을 생성.</p>
<h3 id="예시-스펠체킹-프로그램">예시: 스펠체킹 프로그램</h3>
<blockquote>
</blockquote>
<p>•    <strong>전통적 방식</strong>: 규칙과 예외를 일일이 코드로 작성.
•    <strong>기계학습 방식</strong>: 올바른 입력-출력 쌍을 학습 데이터로 주어 알고리즘이 규칙을 학습.</p>
<h2 id="기계학습의-중요한-개념-일반화">기계학습의 중요한 개념: 일반화</h2>
<p>일반화란, 학습된 모델이 학습 데이터 외의 새로운 데이터에서도 좋은 성능을 보이는 능력입니다. 이는 기계학습의 핵심 목표입니다.</p>
<h3 id="일반화의-예시">일반화의 예시</h3>
<p>아이들은 다양한 나무를 보면서 공통된 특성을 파악하여 ‘나무’라는 일반적인 개념을 형성합니다. 이와 마찬가지로 기계학습 모델은 학습 데이터를 통해 패턴을 파악하여 새로운 데이터에 적용할 수 있습니다.</p>
<h2 id="기계학습의-종류">기계학습의 종류</h2>
<blockquote>
</blockquote>
<ol>
<li><strong>Supervised Learning (지도학습)</strong>: 입력(X)과 그에 대응하는 출력(Y)의 쌍을 학습하여 모델을 구축. 주로 분류(Classification)와 회귀(Regression) 작업에 사용.</li>
<li><strong>Unsupervised Learning (비지도학습)</strong>: 레이블이 없는 데이터(X)만을 사용하여 모델을 학습. 주로 클러스터링(Clustering)과 이상 탐지(Anomaly Detection) 작업에 사용.</li>
<li><strong>Semi-Supervised Learning (반지도학습)</strong>: 일부 데이터는 레이블이 있고, 일부는 레이블이 없는 데이터를 사용하여 학습.</li>
<li><strong>Reinforcement Learning (강화학습)</strong>: 에이전트가 환경과 상호작용하며 보상을 통해 학습.</li>
</ol>
<h3 id="supervised-learning-지도학습">Supervised Learning (지도학습)</h3>
<blockquote>
</blockquote>
<p>•    <strong>입력(X)</strong>: 예측하려는 데이터.
•    <strong>출력(Y)</strong>: 예측 대상 데이터.
•    <strong>대표 작업</strong>: 분류(Classification), 회귀(Regression).</p>
<h3 id="unsupervised-learning-비지도학습">Unsupervised Learning (비지도학습)</h3>
<blockquote>
</blockquote>
<p>•    <strong>입력(X)</strong>: 레이블이 없는 데이터.
•    <strong>대표 작업</strong>: 클러스터링(Clustering), 이상 탐지(Anomaly Detection), 밀도 추정(Dense Estimation).</p>
<h3 id="semi-supervised-learning-반지도학습">Semi-Supervised Learning (반지도학습)</h3>
<blockquote>
</blockquote>
<p>•    <strong>입력(X)</strong>: 일부는 레이블이 있고, 일부는 레이블이 없는 데이터.
•    <strong>레이블링</strong>: 비용과 시간 절약을 위해 일부 데이터만 레이블링.</p>
<h3 id="reinforcement-learning-강화학습">Reinforcement Learning (강화학습)</h3>
<blockquote>
</blockquote>
<p>•    <strong>에이전트와 환경</strong>: 에이전트가 환경과 상호작용하며 학습.
•    <strong>보상(Reward)</strong>: 에이전트의 행동에 대한 피드백으로 학습.
•    <strong>예시</strong>: 바둑, 체스 등.</p>
<h2 id="참고-도서">참고 도서</h2>
<p>기계학습을 공부하는 데 유용한 책들을 소개합니다. 많은 책들이 온라인 튜토리얼이나 오픈소스 코드를 제공하므로 이를 활용하여 공부할 수 있습니다.</p>
<blockquote>
</blockquote>
<p>•    <strong>초보자용</strong>: 기초부터 시작하는 R 또는 Python 기반의 예제를 제공.
•    <strong>심화용</strong>: 기계학습 이론과 알고리즘을 깊이 있게 다룸.</p>
<p>이상으로 기계학습의 정의와 종류, 기계학습과 전통적 프로그래밍의 차이, 일반화의 중요성, 기계학습의 다양한 종류, 참고 도서에 대해 살펴보았습니다. 다음 강의에서는 기계학습의 구체적인 알고리즘과 응용에 대해 다룰 예정입니다.</p>
<p>이 요약본은 LG Aimers Academy의 교육 내용을 바탕으로 작성되었습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[『Mathmatics for ML』 Part 3. PCA]]></title>
            <link>https://velog.io/@d_yeon819/%E3%80%8EMathmatics-for-ML%E3%80%8F-Part-3.-PCA</link>
            <guid>https://velog.io/@d_yeon819/%E3%80%8EMathmatics-for-ML%E3%80%8F-Part-3.-PCA</guid>
            <pubDate>Wed, 24 Jul 2024 03:07:08 GMT</pubDate>
            <description><![CDATA[<p>이번 강의에서는 Principal Component Analysis (PCA)에 대해 다룹니다. PCA는 데이터 차원 축소 기법으로, 데이터 분석과 시각화, 머신러닝 모델의 성능 향상에 매우 유용합니다. 특히, Part 1의 매트릭스 분해(Matrix Decomposition)와 Part 2의 볼록 최적화(Convex Optimization)와 연관지어 PCA의 수학적 원리를 설명합니다.</p>
<h2 id="pca의-동기">PCA의 동기</h2>
<h3 id="차원-축소의-필요성">차원 축소의 필요성</h3>
<p>고차원 데이터는 분석, 시각화, 모델링에 어려움을 줄 수 있습니다. 예를 들어, 2차원 데이터에서 두 번째 차원(X2)은 거의 0에 가깝고 의미가 없는 경우, 이를 무시하고 차원을 줄여 분석하는 것이 효율적입니다. PCA는 이러한 고차원 데이터를 저차원으로 축소하여 의미 있는 정보만을 남기고 분석하는 데 유용합니다.</p>
<h4 id="예시">예시</h4>
<p>예를 들어, 집을 구매할 때 고려하는 다섯 가지 요소(집의 크기, 방의 개수, 화장실의 개수, 학교 근처 여부, 우범지역 여부)를 두 가지 요소(사이즈와 위치)로 축소하여 쉽게 결정할 수 있게 해줍니다.</p>
<h2 id="pca-알고리즘">PCA 알고리즘</h2>
<ol>
<li>센터링(Centering): 각 데이터에서 평균을 빼서 데이터의 중심을 원점으로 이동시킵니다.</li>
<li>스탠다드 데비에이션(Normalization): 각 차원의 분산이 1이 되도록 데이터를 정규화합니다.</li>
<li>데이터 공분산 행렬(Covariance Matrix): 공분산 행렬을 계산하고, 이 행렬의 고유값(Eigenvalue)과 고유벡터(Eigenvector)를 구합니다.</li>
<li>차원 축소(Target Dimension Reduction): 원하는 차원(M개)만큼 가장 큰 고유값에 해당하는 고유벡터를 선택하여 데이터를 축소합니다.</li>
<li>프로젝션(Projection): 선택된 고유벡터 공간으로 데이터를 투영하여 저차원 데이터를 얻습니다.</li>
</ol>
<h2 id="데이터-공분산-행렬">데이터 공분산 행렬</h2>
<p>데이터 공분산 행렬 ( S )는 데이터 매트릭스  X 를 이용하여 다음과 같이 정의됩니다:</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/355b5b32-4117-436c-8027-29d992dceca2/image.png" alt=""></p>
<p> S = \frac{1}{n} X X^T </p>
<p>이 행렬은 항상 대칭(symmetric)이고 양의 정부호(positive definite)입니다. PCA는 이 공분산 행렬의 고유값과 고유벡터를 이용하여 차원을 축소합니다.</p>
<h2 id="pca의-수학적-원리">PCA의 수학적 원리</h2>
<h3 id="variance-maximization">Variance Maximization</h3>
<p>PCA의 목표는 데이터를 저차원 공간으로 투영했을 때 분산(variance)을 최대화하는 방향을 찾는 것입니다. 이를 위해 공분산 행렬의 고유값과 고유벡터를 사용합니다. 가장 큰 고유값에 해당하는 고유벡터가 가장 중요한 주성분(principal component) 방향이 됩니다.</p>
<h4 id="증명-과정">증명 과정</h4>
<ol>
<li>기본 개념 정리: X는 원본 데이터, B는 투영 행렬, Z는 저차원 공간의 데이터입니다. Z의 분산을 최대화하는 방향을 찾는 것이 목표입니다.</li>
<li>Optimization: 주어진 공분산 행렬 S에서 가장 큰 고유값과 이에 대응하는 고유벡터를 찾습니다.</li>
<li>수학적 증명: Lagrangian 함수와 KKT 조건을 이용하여 가장 큰 고유값과 고유벡터를 찾고, 이를 통해 최적의 투영 방향을 구합니다.</li>
</ol>
<h2 id="low-rank-approximation">Low-Rank Approximation</h2>
<p>PCA는 로우랭크 매트릭스 근사(low-rank matrix approximation)와 밀접한 관련이 있습니다. 에카르트-영 정리에 따르면, PCA는 주어진 데이터 매트릭스를 저차원 공간에서 가장 잘 근사하는 방법을 제공합니다.</p>
<h2 id="효율적인-pca-계산">효율적인 PCA 계산</h2>
<p>데이터 차원이 데이터 개수보다 큰 경우, 공분산 행렬의 고유값 분해 대신 SVD(Singular Value Decomposition)를 사용하여 효율적으로 PCA를 계산할 수 있습니다. SVD는 다음과 같이 표현됩니다:</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/eb48b49b-37d8-4aa8-86d6-713297c46cda/image.png" alt=""></p>
<p> X = U \Sigma V^T </p>
<p>여기서 U와 V는 각각 좌우 고유벡터, \Sigma는 고유값 행렬입니다. 이를 이용하여 공분산 행렬의 고유값과 고유벡터를 효율적으로 구할 수 있습니다.</p>
<h2 id="결론">결론</h2>
<p>PCA는 고차원 데이터를 저차원으로 축소하여 중요한 정보를 유지하면서 분석을 용이하게 합니다. 이를 통해 데이터의 시각화, 분석, 머신러닝 모델의 성능을 향상시킬 수 있습니다. 이번 강의에서는 PCA의 기본 개념, 알고리즘, 수학적 원리 및 효율적인 계산 방법을 다루었습니다.</p>
<p>다음 강의에서는 PCA의 응용과 더 발전된 차원 축소 기법에 대해 다룰 예정입니다.
이 요약본은 LG Aimers Academy의 교육 내용을 바탕으로 작성되었습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[『Mathmatics for ML』 Part 2. Convex Optimization]]></title>
            <link>https://velog.io/@d_yeon819/%E3%80%8EMathmatics-for-ML%E3%80%8F-Part-2.-Convex-Optimization</link>
            <guid>https://velog.io/@d_yeon819/%E3%80%8EMathmatics-for-ML%E3%80%8F-Part-2.-Convex-Optimization</guid>
            <pubDate>Mon, 22 Jul 2024 06:04:10 GMT</pubDate>
            <description><![CDATA[<p>이번 강의에서는 Convex Optimization(볼록 최적화)에 대해 다룹니다. Convex Optimization은 머신러닝 모델 학습에서 매우 중요한 주제로, 모델의 최적 파라미터를 찾는 과정과 밀접한 관련이 있습니다. 이 강의에서는 Convex Optimization의 기본 개념, KKT 조건, 라그랑주 함수 등을 설명하며, 이를 이해하는 데 필요한 핵심 내용을 다룹니다.</p>
<h2 id="최적화-문제의-개요">최적화 문제의 개요</h2>
<p>머신러닝 모델을 학습할 때, 우리는 보통 특정 목적 함수를 최소화하는 최적화 문제를 해결하게 됩니다. 이러한 최적화 문제는 크게 두 가지로 나눌 수 있습니다:</p>
<ol>
<li><strong>Unconstrained Optimization (무제약 최적화)</strong>: 제약 조건이 없는 최적화 문제</li>
<li><strong>Constrained Optimization (제약 최적화)</strong>: 특정 제약 조건을 만족하면서 최적화하는 문제</li>
</ol>
<p>Convex Optimization은 제약 조건이 있는 최적화 문제의 한 유형으로, 목적 함수와 제약 조건이 모두 볼록 함수인 경우를 말합니다.</p>
<h2 id="gradient-descent">Gradient Descent</h2>
<p>Gradient Descent는 최적화 문제를 해결하기 위한 기본적인 방법 중 하나입니다. 이 방법은 목적 함수의 기울기를 따라 내려가며 최소값을 찾는 방식입니다. 기본 알고리즘은 다음과 같습니다:</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/a1198807-0d09-47f2-9e6d-50ee33336ad8/image.png" alt=""></p>
<p>[ \mathbf{x}_{k+1} = \mathbf{x}_k - \gamma_k \nabla f(\mathbf{x}_k) ]</p>
<p>여기서 (\gamma_k)는 학습률(스텝 사이즈)이고, (\nabla f(\mathbf{x}_k))는 함수 (f)의 기울기입니다. Gradient Descent는 스텝 사이즈를 잘 조절하면 함수의 로컬 옵티마로 수렴하게 됩니다.</p>
<h3 id="stochastic-gradient-descent-sgd">Stochastic Gradient Descent (SGD)</h3>
<p>SGD는 데이터의 전체 배치 대신 무작위로 선택된 작은 배치로 Gradient Descent를 수행하는 방법입니다. 이는 계산 비용을 줄이고, 큰 데이터셋에서 효율적으로 동작합니다. Mini-batch Gradient Descent는 이와 유사한 방식으로, 작은 배치를 사용하여 업데이트를 수행합니다.</p>
<h3 id="momentum-gradient-descent">Momentum Gradient Descent</h3>
<p>Momentum Gradient Descent는 이전 업데이트 방향을 고려하여 업데이트를 가속화하는 방법입니다. 기본 아이디어는 이전 단계의 기울기 방향을 현재 단계에서도 일정 부분 반영하는 것입니다. 이를 통해 수렴 속도를 높일 수 있습니다.</p>
<h2 id="constrained-optimization">Constrained Optimization</h2>
<p>제약 조건이 있는 최적화 문제를 해결하기 위해 라그랑주 함수를 사용합니다. 라그랑주 함수는 다음과 같이 정의됩니다:</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/0c484966-13ce-4677-babf-0f63ac7a78ff/image.png" alt=""></p>
<p>[ \mathcal{L}(\mathbf{x}, \lambda, \mu) = f(\mathbf{x}) + \sum_{i} \lambda_i g_i(\mathbf{x}) + \sum_{j} \mu_j h_j(\mathbf{x}) ]</p>
<p>여기서 (\lambda_i)와 (\mu_j)는 라그랑주 승수이며, 각각의 제약 조건 (g_i)와 (h_j)에 해당합니다. 이 함수는 원래의 최적화 문제를 변형하여 제약 조건을 포함한 형태로 만듭니다.</p>
<h3 id="kkt-조건">KKT 조건</h3>
<p>KKT 조건은 제약 최적화 문제의 최적성을 확인하는 데 사용됩니다. 이 조건을 만족하면 해당 해가 최적 해임을 보장합니다. KKT 조건은 다음과 같습니다:</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/01d1a1bd-4110-4dc1-a432-7dc9ec2c10d1/image.png" alt=""></p>
<ol>
<li><strong>Primal feasibility</strong>: (g_i(\mathbf{x}) \leq 0), (h_j(\mathbf{x}) = 0)</li>
<li><strong>Dual feasibility</strong>: (\lambda_i \geq 0)</li>
<li><strong>Stationarity</strong>: (\nabla f(\mathbf{x}) + \sum_{i} \lambda_i \nabla g_i(\mathbf{x}) + \sum_{j} \mu_j \nabla h_j(\mathbf{x}) = 0)</li>
<li><strong>Complementary slackness</strong>: (\lambda_i g_i(\mathbf{x}) = 0)</li>
</ol>
<p>KKT 조건은 모든 제약 최적화 문제에 대해 필요 조건이며, Convex Optimization 문제에서는 충분 조건이기도 합니다.</p>
<h2 id="convex-optimization">Convex Optimization</h2>
<h3 id="convex-set-and-convex-function">Convex Set and Convex Function</h3>
<p>Convex Optimization 문제는 볼록 집합(convex set)과 볼록 함수(convex function)에서 정의됩니다.</p>
<ul>
<li><strong>Convex Set</strong>: 집합 내의 두 점을 잇는 선분이 항상 집합 내에 포함되는 경우</li>
<li><strong>Convex Function</strong>: 함수의 두 점을 잇는 선분의 함수값이 항상 함수의 그래프 위에 있는 경우</li>
</ul>
<h3 id="convex-optimization-problem">Convex Optimization Problem</h3>
<p>볼록 최적화 문제는 다음과 같이 정의됩니다:</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/5a3a8d4f-50c2-4685-a8c9-8f692c7cb2cb/image.png" alt=""></p>
<p>[ \min_{\mathbf{x}} f(\mathbf{x}) \quad \text{subject to} \quad \mathbf{x} \in \mathcal{C} ]</p>
<p>여기서 (f(\mathbf{x}))는 볼록 함수이고, (\mathcal{C})는 볼록 집합입니다.</p>
<h3 id="strong-duality">Strong Duality</h3>
<p>Strong Duality는 Convex Optimization 문제에서 프라이멀 문제와 듀얼 문제의 최적값이 같음을 의미합니다. 이를 통해 듀얼 문제를 풀어 프라이멀 문제의 최적값을 쉽게 찾을 수 있습니다.</p>
<h2 id="결론">결론</h2>
<p>이번 강의에서는 Convex Optimization의 기본 개념과 이를 해결하기 위한 다양한 방법에 대해 정리하였습니다. Gradient Descent, Stochastic Gradient Descent, Momentum Gradient Descent 등 다양한 최적화 기법을 다루었고, 제약 조건이 있는 최적화 문제를 해결하기 위한 라그랑주 함수와 KKT 조건을 설명했습니다. Convex Optimization은 머신러닝 모델 학습에서 중요한 역할을 하며, 이를 이해하는 것이 좋은 모델을 만드는 데 큰 도움이 됩니다.</p>
<p>다음 강의에서는 Convex Optimization의 응용과 더 발전된 최적화 기법에 대해 다룰 예정입니다.
이 요약본은 LG Aimers Academy의 교육 내용을 바탕으로 작성되었습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[『Mathmatics for ML』 Part 1. Matrix Decomposition]]></title>
            <link>https://velog.io/@d_yeon819/%E3%80%8EMathmatics-for-ML%E3%80%8F-Part-1.-Matrix-Decomposition</link>
            <guid>https://velog.io/@d_yeon819/%E3%80%8EMathmatics-for-ML%E3%80%8F-Part-1.-Matrix-Decomposition</guid>
            <pubDate>Sun, 21 Jul 2024 11:57:33 GMT</pubDate>
            <description><![CDATA[<p>이번 강의 시리즈에서는 &quot;Math for ML&quot;이라는 주제로 세 가지 파트를 소개합니다. 첫 번째 파트에서는 매트릭스 디컴포지션(Matrix Decomposition)을 다룰 예정입니다. 이번 강의에서는 행렬의 기본 개념인 디터미넌트(Determinant), 트레이스(Trace), 그리고 다양한 행렬 분해 방법인 초월스키 디컴포지션(Cholesky Decomposition), 아이겐 디컴포지션(Eigen Decomposition), LU 분해, 그리고 싱글러 밸류 디컴포지션(SVD)에 대해 정리합니다.</p>
<h2 id="디터미넌트와-트레이스">디터미넌트와 트레이스</h2>
<h3 id="디터미넌트">디터미넌트</h3>
<p>디터미넌트는 행렬의 성질을 나타내는 중요한 값 중 하나입니다. 예를 들어, 2x2 행렬의 디터미넌트는 다음과 같이 계산됩니다:</p>
<p>det(𝐴) = 𝑎𝑑−𝑏𝑐</p>
<p>이 값이 0이 아니면 행렬 A는 역행렬을 가지며, 0이면 역행렬이 존재하지 않습니다.</p>
<h3 id="트레이스">트레이스</h3>
<p>트레이스는 행렬의 주대각선 요소들의 합을 의미합니다. 예를 들어, 2x2 행렬의 트레이스는 다음과 같이 계산됩니다:</p>
<p>tr(𝐴)=𝑎+𝑑</p>
<p>트레이스는 주로 행렬의 성질을 파악하거나, 행렬의 대각화 과정에서 중요한 역할을 합니다.</p>
<h2 id="아이겐-디컴포지션">아이겐 디컴포지션</h2>
<h3 id="아이겐밸류와-아이겐벡터">아이겐밸류와 아이겐벡터</h3>
<p>아이겐밸류(고유값)와 아이겐벡터(고유벡터)는 행렬의 중요한 성질을 나타냅니다. 행렬 𝐴가 주어졌을 때, 다음 조건을 만족하는 𝜆와 𝑥를 각각 아이겐밸류와 아이겐벡터라고 합니다:</p>
<p>𝐴𝑥 = 𝜆𝑥</p>
<p>아이겐 디컴포지션은 행렬을 고유값과 고유벡터로 분해하는 방법으로, 주어진 행렬 𝐴를 다음과 같이 표현합니다:</p>
<p>𝐴 = 𝑃Λ𝑃 −1 </p>
<p>여기서 𝑃는 고유벡터들로 이루어진 행렬이고, Λ는 고유값들이 대각선에 위치한 대각 행렬입니다.</p>
<h2 id="초월스키-디컴포지션">초월스키 디컴포지션</h2>
<p>초월스키 디컴포지션은 대칭 행렬을 두 개의 하삼각 행렬로 분해하는 방법입니다. 대칭 양의 정부호 행렬 𝐴는 다음과 같이 분해할 수 있습니다:</p>
<p>𝐴 = 𝐿𝐿^𝑇</p>
<p>여기서 𝐿은 하삼각 행렬입니다. 초월스키 디컴포지션을 사용하면 역행렬 계산, 행렬식 계산 등이 간단해집니다.</p>
<h2 id="싱글러-밸류-디컴포지션-svd">싱글러 밸류 디컴포지션 (SVD)</h2>
<h3 id="svd의-정의">SVD의 정의</h3>
<p>SVD는 임의의 행렬을 세 개의 행렬로 분해하는 방법입니다. 행렬 𝐴는 다음과 같이 분해됩니다:</p>
<p>𝐴 = 𝑈Σ𝑉^𝑇</p>
<p>여기서 𝑈와 𝑉는 각각 직교 행렬이고, Σ는 대각 행렬입니다. SVD는 모든 행렬에 대해 존재하며, 데이터 압축, 잡음 제거 등 다양한 응용 분야에서 사용됩니다.</p>
<h3 id="svd와-아이겐-디컴포지션의-관계">SVD와 아이겐 디컴포지션의 관계</h3>
<p>SVD는 아이겐 디컴포지션의 일반화된 형태입니다. 아이겐 디컴포지션이 대칭 행렬에만 적용되는 반면, SVD는 모든 행렬에 적용될 수 있습니다. 따라서, SVD는 더 넓은 범위의 문제에 대해 사용될 수 있습니다.</p>
<h2 id="정리-및-결론">정리 및 결론</h2>
<p>이번 강의에서는 매트릭스 디컴포지션의 기본 개념과 다양한 방법에 대해 알아보았습니다. 디터미넌트와 트레이스, 아이겐 디컴포지션, 초월스키 디컴포지션, 그리고 싱글러 밸류 디컴포지션에 대해 다루었으며, 각각의 방법이 어떤 상황에서 유용한지에 대해 정리해보았습니다. </p>
<p>이 요약본은 LG Aimers Academy의 교육 내용을 바탕으로 작성되었습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[『AI 윤리』 Part 3. 세계적인 데이터 과학자가 되는 방법]]></title>
            <link>https://velog.io/@d_yeon819/%E3%80%8EAI-%EC%9C%A4%EB%A6%AC%E3%80%8F-Part-3.-%EC%84%B8%EA%B3%84%EC%A0%81%EC%9D%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B3%BC%ED%95%99%EC%9E%90%EA%B0%80-%EB%90%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@d_yeon819/%E3%80%8EAI-%EC%9C%A4%EB%A6%AC%E3%80%8F-Part-3.-%EC%84%B8%EA%B3%84%EC%A0%81%EC%9D%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B3%BC%ED%95%99%EC%9E%90%EA%B0%80-%EB%90%98%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Sun, 21 Jul 2024 11:38:01 GMT</pubDate>
            <description><![CDATA[<p>이번 강의에서는 카이스트 차미영 교수님께서 데이터 사이언티스트로 전 세계 여러 기관에서 유명한 분들과 함께 일하면서 얻은 경험과 그들이 어떻게 성공적인 데이터 과학자가 되었는지에 대해 이야기합니다. 특히, 데이터 과학자로서 실천할 수 있는 일상적인 루틴과 태도에 대해 소개합니다.</p>
<h2 id="데이터-과학의-중요성과-성공-사례">데이터 과학의 중요성과 성공 사례</h2>
<h3 id="데이터-과학의-역할">데이터 과학의 역할</h3>
<p>데이터 과학은 디지털 전환을 성공적으로 이끄는 핵심 요소입니다. 데이터 과학자들은 다양한 데이터를 분석하고 이를 통해 유의미한 통찰을 얻어내며, 이를 바탕으로 사회적 문제를 해결하고 새로운 기회를 창출합니다.</p>
<ul>
<li>예시: 서울시의 야간 버스 노선 개선은 통신사와의 협업을 통해 이루어졌습니다. 휴대전화 기지국 데이터를 활용하여 이동 인구를 분석하고 최적의 버스 노선을 설계했습니다.</li>
</ul>
<h3 id="데이터-과학자의-호기심과-상상력">데이터 과학자의 호기심과 상상력</h3>
<p>세계적인 데이터 과학자들이 공통적으로 가지고 있는 특징은 바로 데이터에 대한 호기심과 이종 데이터를 결합하는 능력입니다.</p>
<ul>
<li>뉴욕시 소통 패턴 분석: 인터넷과 전화 소통 데이터를 지리 정보와 결합하여 지역 간 소통 패턴을 분석했습니다.</li>
<li>소셜 네트워크 분석: 소셜 네트워크의 모양을 통해 사용자의 정치 성향, 선호 브랜드, 커플의 지속 가능성 등을 예측할 수 있습니다.</li>
</ul>
<h2 id="데이터-과학자로서의-실천-방법">데이터 과학자로서의 실천 방법</h2>
<h3 id="끊임없는-학습과-도전">끊임없는 학습과 도전</h3>
<p>데이터 과학자는 끊임없이 변화하는 트렌드와 기술을 따라잡기 위해 지속적인 학습과 도전을 해야 합니다.</p>
<ul>
<li>실리콘밸리의 사례: 구글, 아마존, 페이스북 등의 기업은 기존의 산업을 재정의하며 다양한 분야에 도전하고 있습니다. 이러한 도전 정신이 데이터 과학자에게도 필요합니다.</li>
</ul>
<h3 id="높은-목표-설정">높은 목표 설정</h3>
<p>페이스북에서의 경험을 바탕으로 목표 설정 방법을 공유합니다. 50%만 달성 가능성이 있는 높은 목표를 설정함으로써 더 큰 진전을 이루는 방법입니다.</p>
<ul>
<li>목표 설정: 높은 목표를 세우고, 50%만 달성하더라도 성공으로 간주하는 방식으로 더 큰 성과를 이루도록 노력합니다.</li>
</ul>
<h3 id="협업과-멘토십">협업과 멘토십</h3>
<p>큰 성공을 위해서는 멘토와 협업할 팀을 찾는 것이 중요합니다. 다양한 관점을 가진 사람들과 함께 일함으로써 더 나은 결과를 도출할 수 있습니다.</p>
<ul>
<li>레이 달리오의 성공 원칙: 목표 설정, 문제 발견, 근본 원인 분석, 극복 계획 수립, 실행의 반복을 통해 성공을 이루는 방법을 강조합니다.</li>
</ul>
<h2 id="데이터-과학의-사회적-기여">데이터 과학의 사회적 기여</h2>
<h3 id="개발도상국의-물가-예측">개발도상국의 물가 예측</h3>
<p>UN과 협력하여 인도네시아의 물가 예측 프로그램을 개발했습니다. 소셜미디어 데이터를 활용하여 실시간 시장 가격을 예측함으로써 빈곤 문제 해결에 기여했습니다.</p>
<h3 id="가짜뉴스-탐지">가짜뉴스 탐지</h3>
<p>빅데이터와 인공지능을 활용하여 가짜뉴스를 탐지하는 방법을 연구했습니다. 네트워크에서 퍼지는 모양을 분석하여 진짜 뉴스와 가짜 뉴스를 구분합니다.</p>
<h3 id="우주-항공-분야">우주 항공 분야</h3>
<p>미성 영상의 처리 기술을 통해 고해상도 주간 영상을 분석하고, 최빈국의 경제 상황이나 도시의 녹지양을 분석하는 등의 연구를 수행했습니다.</p>
<h2 id="결론">결론</h2>
<p>데이터 과학자는 데이터에 대한 호기심과 상상력을 바탕으로 끊임없이 학습하고 도전해야 합니다. 높은 목표를 설정하고, 협업과 멘토십을 통해 더 나은 결과를 이루어낼 수 있습니다. 데이터 과학은 사회적 문제를 해결하고 새로운 기회를 창출하는 데 중요한 역할을 합니다. 여러분 모두가 데이터 과학자로서 큰 비전과 열정을 가지고 활동하길 바랍니다.</p>
<p>이 요약본은 LG Aimers Academy의 교육 내용을 바탕으로 작성되었습니다. 데이터 과학의 중요성과 윤리적 문제를 깊이 이해하고, 기술 발전과 함께 윤리적, 사회적 책임을 다하는 멋진 데이터 과학자가 되길 바랍니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[『AI 윤리』 Part 2. AI Ethics]]></title>
            <link>https://velog.io/@d_yeon819/%E3%80%8EAI-%EC%9C%A4%EB%A6%AC%E3%80%8F-Part-2.-AI-Ethics</link>
            <guid>https://velog.io/@d_yeon819/%E3%80%8EAI-%EC%9C%A4%EB%A6%AC%E3%80%8F-Part-2.-AI-Ethics</guid>
            <pubDate>Sun, 21 Jul 2024 11:33:50 GMT</pubDate>
            <description><![CDATA[<p>이번 강의에서는 AI 알고리즘이 우리 사회에 가져오는 다양한 영향과 특히 AI가 창작자로서 활동하면서 발생하는 여러 윤리적 이슈들을 다루어 보겠습니다. 또한, AI의 결정이 인간의 윤리와 다를 때 어떻게 대처해야 할지에 대해 논의하겠습니다.</p>
<h2 id="ai와-창작의-만남">AI와 창작의 만남</h2>
<h3 id="ai와-예술의-융합">AI와 예술의 융합</h3>
<p>AI는 주어진 문제에 대한 답을 잘 찾는 것으로 알려져 있습니다. 많은 직업들이 AI로 인해 대체될 가능성이 높지만, 예술과 창작 활동은 여전히 인간 고유의 영역으로 여겨졌습니다. 그러나 AI의 발전으로 이제는 예술 작품도 AI가 창작할 수 있는 시대가 되었습니다.</p>
<ul>
<li><p>음악 창작: 스페인 말라가 대학에서 개발된 AI ‘IAMUS’는 단 6분 만에 교향곡을 작곡했습니다. 이 곡은 런던 심포니 오케스트라에 의해 연주되었으며, AI가 창작하고 인간이 연주하는 형태를 보여주었습니다.</p>
</li>
<li><p>문학 창작: 일본 호카이도 대학에서 개발한 AI는 SF 소설을 작성하여 호시 신이치 문학상 1차 예선을 통과하기도 했습니다.</p>
</li>
<li><p>시각 예술: AI 알고리즘으로 생성된 작품들이 고액에 판매되면서 예술 시장에서 큰 주목을 받고 있습니다. 예를 들어, AI가 생성한 작품을 3D 프린터로 출력하여 판매하는 등의 사례가 있습니다.</p>
</li>
</ul>
<h3 id="ai-창작의-윤리적-문제">AI 창작의 윤리적 문제</h3>
<p>AI가 창작한 작품에 대한 저작권 문제는 복잡한 윤리적, 법적 문제를 야기합니다. AI 작품의 저작권을 누구에게 부여할지, 학습에 사용된 데이터 제공자에게 어떤 권리를 줄지 등에 대한 논의가 필요합니다.</p>
<ul>
<li><p>저작권 문제: AI가 생성한 작품에 대해 프로그래머, 데이터 제공자, 기획자 등 다양한 주체 간의 저작권 분배 문제가 발생합니다.</p>
</li>
<li><p>학습 데이터의 기여: 학습에 사용된 데이터의 기여도를 평가하고, 원 제작자에게 적절한 보상을 제공하는 방안 마련이 필요합니다.</p>
</li>
<li><p>법적 제도 부재: 현재 법적 제도는 인간만이 저작권을 가질 수 있도록 되어 있어, AI에게 저작권을 부여하는 것은 법적으로 인정되지 않습니다.</p>
</li>
<li><p>윤리적 문제: AI가 생성한 작품이 폭력을 조장하거나 차별을 조장하는 등의 윤리적 문제가 발생할 수 있습니다.</p>
</li>
</ul>
<h2 id="ai의-결정과-인간-윤리">AI의 결정과 인간 윤리</h2>
<h3 id="로봇-3원칙과-자율주행-자동차">로봇 3원칙과 자율주행 자동차</h3>
<p>아시모프의 로봇 3원칙은 AI와 로봇의 윤리적 문제를 다루는 데 중요한 기준을 제공합니다. 그러나 자율주행 자동차와 같은 실제 사례에서는 여전히 많은 윤리적, 법적 문제가 남아 있습니다.</p>
<ul>
<li><p>로봇 3원칙:</p>
<ol>
<li>로봇은 인간을 다치게 해서는 안 되며, 인간이 해를 입는 것조차 방관해서는 안 된다.</li>
<li>로봇은 인간의 명령에 복종해야 한다. 단, 첫 번째 원칙에 위배되지 않는 한에서다.</li>
<li>로봇은 스스로를 보호해야 한다. 단, 첫 번째 및 두 번째 원칙에 위배되지 않는 한에서다.</li>
</ol>
</li>
<li><p>자율주행 자동차: 자율주행 차량으로 인한 사고 발생 시, 법적 책임이 누구에게 있는지에 대한 명확한 기준이 필요합니다. 예를 들어, 자율주행 차량이 보행자를 치어 사망하게 한 사건에서 법적 책임이 운전자, 개발자, 차량 소유자 중 누구에게 있는지가 논란이 되었습니다.</p>
</li>
</ul>
<h3 id="moral-machine-experiment">Moral Machine Experiment</h3>
<p>MIT의 Moral Machine Experiment는 자율주행 자동차의 윤리적 문제를 다루는 연구로, 다양한 윤리적 딜레마 상황에서 AI의 결정을 평가합니다.</p>
<ul>
<li><p>트롤리 문제: 빠르게 다가오는 기차나 자동차가 멈출 수 없는 상황에서 A나 B 둘 중 하나의 길을 선택해야 하는 딜레마를 다룹니다.</p>
</li>
<li><p>연구 결과: 다양한 상황에서 사람들이 선택하는 윤리적 결정을 수집하여 AI의 윤리적 판단 기준을 마련하고자 했습니다.</p>
</li>
</ul>
<h2 id="결론">결론</h2>
<p>AI의 발전은 우리의 삶을 혁신적으로 변화시키고 있습니다. 그러나 AI가 창작자로서 활동하고, 자율주행 자동차와 같은 윤리적 딜레마에 직면하게 되면서, 우리는 새로운 윤리적, 법적 문제에 직면하고 있습니다.</p>
<ul>
<li><p>저작권과 법적 제도: AI의 창작물에 대한 저작권 문제와 법적 제도의 개선이 필요합니다.</p>
</li>
<li><p>윤리적 기준 마련: AI의 결정이 인간의 윤리와 충돌하지 않도록 윤리적 기준을 마련해야 합니다.</p>
</li>
<li><p>사회적 책임: AI가 인간의 삶에 미치는 영향을 고려하여, 기술 발전과 함께 윤리적, 사회적 책임을 다하는 것이 중요합니다.</p>
</li>
</ul>
<p>이 요약본은 LG Aimers Academy의 교육 내용을 바탕으로 작성되었습니다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[『AI 윤리』 Part 1. 데이터 분석과 AI학습에서 유의할 점]]></title>
            <link>https://velog.io/@d_yeon819/%E3%80%8EAI-%EC%9C%A4%EB%A6%AC%E3%80%8F-Part-1.-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D%EA%B3%BC-AI%ED%95%99%EC%8A%B5%EC%97%90%EC%84%9C-%EC%9C%A0%EC%9D%98%ED%95%A0-%EC%A0%90</link>
            <guid>https://velog.io/@d_yeon819/%E3%80%8EAI-%EC%9C%A4%EB%A6%AC%E3%80%8F-Part-1.-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D%EA%B3%BC-AI%ED%95%99%EC%8A%B5%EC%97%90%EC%84%9C-%EC%9C%A0%EC%9D%98%ED%95%A0-%EC%A0%90</guid>
            <pubDate>Sun, 21 Jul 2024 11:27:10 GMT</pubDate>
            <description><![CDATA[<h2 id="1-데이터-해석의-중요성">1. 데이터 해석의 중요성</h2>
<h3 id="상관관계와-인과관계-구분">상관관계와 인과관계 구분</h3>
<p>상관관계: 두 변수 간의 연관성.
인과관계: 하나의 변수가 다른 변수에 직접적인 영향을 미침.
예시: 초콜릿 소비와 노벨상 수상자 수의 상관관계는 있지만, 인과관계를 의미하지는 않음.
유의점: 상관관계는 반드시 인과관계를 의미하지 않음. 데이터 분석 시, 이를 명확히 구분해야 하며, 잘못된 결론을 도출하지 않도록 주의해야 함.</p>
<h3 id="에러-바의-중요성">에러 바의 중요성</h3>
<p>에러 바: 데이터의 신뢰도를 나타내는 시각적 가이드.
통계적 유의미성을 판단할 때 에러 바를 활용해 정확한 해석 필요.
유의점: 에러 바를 통해 데이터의 변동성을 이해하고, 이를 반영하여 신뢰할 수 있는 결론을 도출해야 함.</p>
<h2 id="2-데이터-전처리와-정제">2. 데이터 전처리와 정제</h2>
<h3 id="데이터-정규화-및-아웃라이어-제거">데이터 정규화 및 아웃라이어 제거</h3>
<p>비정상적으로 큰 값이나 작은 값을 제거해 데이터의 품질을 높임.
EDA(탐색적 데이터 분석) 과정을 통해 데이터의 이상치를 찾아내고 정제함.
유의점: 데이터 정제 과정에서 발생할 수 있는 손실을 최소화하고, 분석의 정확성을 높이기 위해 데이터를 세심하게 다루어야 함.</p>
<h3 id="학습-데이터의-양">학습 데이터의 양</h3>
<p>언더피팅: 모델이 너무 단순해 충분히 학습되지 않은 상태.
오버피팅: 모델이 너무 복잡해 특정 데이터에만 특화된 상태.
적절한 데이터 양과 모델 복잡성을 유지해야 함.
유의점: 모델의 성능을 최적화하기 위해 데이터 양과 모델 복잡성의 균형을 맞추는 것이 중요함.</p>
<h2 id="3-블랙박스-모델의-문제점">3. 블랙박스 모델의 문제점</h2>
<h3 id="설명력-부족">설명력 부족</h3>
<p>AI 모델의 내부 작동 방식을 이해하기 어려움.
예시: WCO의 탈세범 잡는 알고리즘에서 설명력이 부족해 세관원들이 신뢰하지 못했던 사례.
유의점: 블랙박스 모델의 한계를 극복하기 위해 설명력을 높이는 노력이 필요함.</p>
<h3 id="설명력-향상-노력">설명력 향상 노력</h3>
<p>사후 설명력: 모델의 결정 과정을 시각화해 제공.
해석 가능한 모델: 처음부터 설명 가능한 형태로 설계된 모델.
유의점: 설명 가능한 AI 모델을 통해 사용자 신뢰를 높이고, 더 나은 의사결정을 지원할 수 있음.</p>
<h2 id="4-데이터-편향-문제">4. 데이터 편향 문제</h2>
<h3 id="인터넷-데이터-분석의-주의점">인터넷 데이터 분석의 주의점</h3>
<p>스파이럴 오브 사이런스: 소수의 강한 의견이 다수의 의견처럼 보이는 편향 현상.
오정보의 빠른 확산과 인포데믹 문제.
유의점: 데이터의 대표성과 진실성을 확보하기 위해 편향된 정보를 걸러내는 노력이 필요함.</p>
<h3 id="개인정보-보호와-잊혀질-권리">개인정보 보호와 잊혀질 권리</h3>
<p>개인 정보의 안전한 보관과 필요 최소한의 정보 요청.
과거의 정보가 계속 노출되지 않도록 검색 결과에서 제거하는 법적 권리.
유의점: 데이터의 보안과 개인 정보 보호를 위해 최신 법률과 규정을 준수해야 함.</p>
<h2 id="5-알고리즘의-편향-문제">5. 알고리즘의 편향 문제</h2>
<h3 id="콤파스-제도와-인종차별">콤파스 제도와 인종차별</h3>
<p>피고의 재범률을 예측하는 콤파스 알고리즘의 인종적 편향 사례.
유의점: 알고리즘이 사회적 편향을 반영하지 않도록 데이터의 편향을 제거하고, 공정성을 확보해야 함.</p>
<h3 id="채용-알고리즘의-성차별">채용 알고리즘의 성차별</h3>
<p>아마존의 채용 알고리즘이 남성 중심의 데이터를 학습해 여성 지원자를 차별한 사례.
유의점: 채용 과정에서의 성차별 문제를 해결하기 위해 알고리즘의 편향을 주의 깊게 점검해야 함.
챗봇의 편향 문제
MS의 챗봇 테이가 사용자들에게 편향된 데이터를 학습해 차별적 발언을 한 사례.
유의점: 챗봇 등의 AI 서비스가 편향된 정보를 학습하지 않도록 지속적으로 모니터링하고 관리해야 함.</p>
<h2 id="결론">결론</h2>
<h3 id="데이터-품질-관리">데이터 품질 관리</h3>
<p>데이터 확보, 전처리, 분석, 해석의 전 과정에서 주의해야 함. 데이터의 품질이 바로 알고리즘의 학습 품질을 결정하기 때문에 데이터에 대한 많은 노력을 드려야 함. 특히 오차 범위, 특이점, 대표성 문제를 항상 고민해야 함.</p>
<h3 id="알고리즘의-설명력과-신뢰성">알고리즘의 설명력과 신뢰성</h3>
<p>성능만 높은 것이 아니라 설명력과 신뢰성을 겸비한 알고리즘이 필요함. AI가 인간의 결정을 돕거나 대체하는 경우, 윤리적이고 사회적 규범에 맞는 의사결정을 지원할 수 있도록 노력해야 함.</p>
<h3 id="편향에-대한-경각심">편향에 대한 경각심</h3>
<p>알고리즘이 사회적 편향을 조장하지 않도록 주의해야 함. 이를 위해 데이터의 편향을 제거하고, 공정성을 유지하는 것이 중요함.</p>
<p>이 요약본은 LG Aimers Academy의 교육 내용을 바탕으로 작성되었습니다. 데이터 과학과 AI 학습에서 윤리적 소양을 중요하게 여기는 모든 분들에게 도움이 되길 바랍니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Chemical Process Anomaly Detection | 화학 공정 이상 탐지]]></title>
            <link>https://velog.io/@d_yeon819/Chemical-Process-Anomaly-Detection-%ED%99%94%ED%95%99-%EA%B3%B5%EC%A0%95-%EC%9D%B4%EC%83%81-%ED%83%90%EC%A7%80-8ayvnf7a</link>
            <guid>https://velog.io/@d_yeon819/Chemical-Process-Anomaly-Detection-%ED%99%94%ED%95%99-%EA%B3%B5%EC%A0%95-%EC%9D%B4%EC%83%81-%ED%83%90%EC%A7%80-8ayvnf7a</guid>
            <pubDate>Tue, 07 May 2024 02:03:36 GMT</pubDate>
            <description><![CDATA[<pre><code>팀명 : EOC-VCP</code></pre><p><em>벌써 패스트캠퍼스 AI 부트캠프 과정의 마지막 프로젝트 회고 시간이 왔다. 이 많은 프로젝트를 어떻게 쳐냈는지, 어떻게 여기까지 버텨왔는지 생각만해도 꿈만 같다. 마지막 프로젝트에서는 팀원도 한 명 더 늘었고 마지막이기도 해서 2개의 프로젝트에 참여하기로 하였다.<del>(인간의 욕심은 끝이 없고 같은 실수를 반복하지..ㅋ)</del> 그래도 프로젝트 기간이 4주 정도 되어서 프로젝트를 2개 참여하여도 무리 없을 거라고 생각하였다.</em></p>
<h3 id="1-프로젝트-개요">1. 프로젝트 개요</h3>
<p><strong>A. 개요</strong></p>
<p>24시간 내내 운영되는 화학 공정은 이상이 발생하면 막대한 금전적 피해를 입을 수 있다. 공정 상태를 예측하고 대비책을 마련하는 것이 중요한 과제인데, 이를 위해서는 공정 데이터를 이해하고 이상 징후를 파악하는 것이 필수적이다.</p>
<p>본 대회는 화학 공정 데이터를 이용한 이상 탐지(anomaly detection)를 수행하여, 공정 데이터에서 비정상적인 동작을 탐지하는 것을 목표로 한다. 이를 통해 공정에서 발생할 수 있는 문제를 예측하고 대비할 수 있다.</p>
<p>본 대회에서 사용되는 입력 데이터와 출력 데이터는 모두 CSV 파일 형태로 제공된다. 입력 데이터로는 약 25만 개의 화학 공정 데이터가 제공되며, 이에 대응하는 약 7만 2천 개의 출력 데이터가 제공된다.</p>
<p>이상 탐지를 위한 알고리즘 개발은 화학 공정 분야에서 매우 중요한 과제이며, 이를 통해 공정의 안정성을 높이고 예기치 않은 문제를 예방할 수 있다는 점에서 큰 의미가 있다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/439f3b99-ee38-43da-8999-07b742f68fd9/image.png" alt=""></p>
<h4 id="제공된-데이터셋"><strong>제공된 데이터셋</strong></h4>
<blockquote>
<ol>
<li>train data 250,000</li>
<li>test data 72,000</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/516462d4-9c43-450d-a733-39bd2bf2f572/image.png" alt=""></p>
<p>데이터셋 설명</p>
<p>학습 데이터는 csv 파일 형태로 제공된다. 학습 데이터에는 모두 정상 가동인 상태의 화학 공정 데이터만 포함 되어있다.</p>
<p>학습 데이터는 250000 개의 row와 55개의 column 으로 구성되어 있고, column 의 데이터 타입은 float 형태이다.</p>
<p>각 column의 의미는 다음과 같다.</p>
<ul>
<li><p>faultNumber : 
정상인지, 비정상인지 나타내는 Label. 
정상일 경우 &#39;0&#39;, 비정상일 경우 &#39;1&#39; </p>
</li>
<li><p>simulationRun : 
시뮬레이션이 실행된 Run 의 번호
동일한 하나의 simulationRun 이 정상일 경우 faultNumber 가 모두 &#39;0&#39;.
반대로 하나의 simulationRun 이 비정상일 경우 faultNumber 가 모두 &#39;1&#39;.
학습 데이터에는 정상 데이터만 존재. 따라서 faultNumber 가 모두 &#39;0&#39;.
테스트 데이터에는 정상/비정상 데이터가 모두 존재. 따라서 faultNumber 가 모두 &#39;0&#39;인 simulationRun도 있고, faultNumber 모두 &#39;1&#39;인 simulationRun도 있다.</p>
</li>
<li><p>sample : 
하나의 Run 안의 sample 번호를 의미한다. 학습 데이터는 한 Run 당 500 sample 이 있다.</p>
</li>
<li><p>xmeas_* : measurement 의 약자로, 화학 공정에서 측정된 센서 값.</p>
</li>
<li><p>xmv_* : manipulated variable 의 약자로, 화학 공정에서 제어되는 값.</p>
</li>
<li><p>summary : 해당 대화를 바탕으로 작성된 요약문.</p>
</li>
</ul>
<p><strong>B. 환경</strong></p>
<ul>
<li><p>팀 구성 및 컴퓨팅 환경</p>
<p>  7인 1팀, 인당 RTX 3090ti 서버를 VSCode와 SSH로 연결하여 사용</p>
</li>
<li><p>협업 환경</p>
<p>  Notion, GitHub</p>
</li>
<li><p>의사 소통</p>
<p>  KakaoTalk, Zoom, Slack, Discord</p>
</li>
</ul>
<h3 id="2-프로젝트-팀-구성-및-역할">2. 프로젝트 팀 구성 및 역할</h3>
<ul>
<li><p><strong>팀 구성</strong>
  이번 프로젝트 팀원으로 배정된 인원은 7명 이었다. <del>매니저님 말씀으로는 우리 팀이 안정된 팀이고 잘 운영되고 있는 팀이라 계속 팀원을 한 명씩 추가하는 것이라고 하셨다.</del> 나는 팀원이 좀 더 늘면 할 수 있는 Task 가 많아질 것이라 생각하였고 좋은 방향이라는 생각을 하였다.</p>
<p>  <img src="https://velog.velcdn.com/images/d_yeon819/post/5d83d4d0-f2c7-4e4f-a44d-492266c64b4a/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><strong>역할</strong></li>
</ul>
<pre><code>Task 목록은 다음과 같다.
&gt; 데이터 이해 및 시각화(Data understanding and visualization)
&gt; 통계기반 이상탐지(Statistical-based anomaly detection)
&gt; 1인 1모델링 및 파라미터 튜닝(Individualized modeling and hyperparameter tuning)
&gt; 결과 정리 및 보고서 작성(Summarization of Results and Report Writing)


이번 프로젝트에서는 간트차트를 적극 활용하였다. 팀원 중 한 분과 나는 간트차트 제작을 담당하기로 하였다. 처음 만들어보는 간트차트에 막막하기도 하고 구성이 잘 되지 않았었는데 우여곡절 끝에 하루를 통째로 투자한 결과 아주 만족스러운 결과가 나왔다. 막상 만들어놓으니 프로젝트 진행상황을 파악하기도 편했고 그 때, 그 때 회의록 작성하기도 좋았다. 회의에 참여하지 못한 사람이 이 간트차트의 내용만 파악해도 이해가 될 수 있도록 구성하려고 노력했던 것 같다.</code></pre><h3 id="3-프로젝트-수행-절차-및-방법">3. 프로젝트 수행 절차 및 방법</h3>
<p><strong>A. 팀 목표 설정</strong></p>
<blockquote>
<p><strong>1주차</strong> : 주어진 Upstage 강의 다 듣기, train 데이터 및 test 데이터 패턴 파악하기, base line code 이해하기
<strong>2주차</strong> : 통계 기반 이상탐지, Model 탐색 및 baseline code 작성
<strong>3주차</strong> : 모델링, 모델 튜닝, 최종 모델 완성, 모델 고도화
<strong>4주차</strong> : Dash Board 작성, Report 작성, PPT 제작, GitHub 관리</p>
</blockquote>
<p><strong>B. 프로젝트 사전 기획</strong></p>
<p>(1) 협업 문화</p>
<blockquote>
<ol>
<li>특별한 일을 제외하고는 항상 모여서 의논하면서 Task 진행할 것(Zoom, Discord)</li>
<li>오프라인 모임이 가능할 경우 오프라인 만남을 적극 활용할 것(소통 Skill Up)</li>
<li>논의 사항 및 오류 사항이 있을 경우 즉각 팀원들과 상의할 것</li>
<li>New 아이디어 발생 시 Team Notion에 작성 후 팀원 호출하여 해당 아이디어에 대해 공유할 것</li>
<li>말하지 않아도 각자 중간 진행 상황에 대해 틈틈이 보고할 것</li>
</ol>
</blockquote>
<p>우리팀의 좋았던 점은 별 일 없으면 항상 온라인 소통 플랫폼에 항상 접속해 있는 것이었다. 문제가 생기면 언제든 소통이 가능했고 좋은 아이디어가 생겨도 실시간으로 바로바로 소통이 가능했다. 이 점이 팀 프로젝트 결과물을 뽑아내는 데 중요한 요소였던 것 같다. 이번에 새로 합류한 팀원께도 플랫폼 초대 링크를 보내어 참석할 수 있도록 하였다. <del>우리 팀은 기존의 Zoom 플랫폼 보다 Discord 활용을 더 많이 한 것 같다.</del>
팀원이 많았기 때문에 다양한 시도를 해볼 수 있었다. 항상 매일 Meeting을 통해 그 날 그 날 할 일에 대해 계획을 수립하였고 수립한 계획을 Notion에 작성하였다. 그리고 다 진행된 내용에 대해서는 check 표시를 하여 모두가 진행 상황을 알 수 있도록 기록으로 남겨두었다. 우리 팀은 1인 1모델링을 하기로 했었으므로 7가지의 모델 중 1가지의 모델을 심도있게 공부하여 팀원들과 공유하는 시간을 가지기도 하였다. </p>
<h3 id="4-프로젝트-수행-결과">4. 프로젝트 수행 결과</h3>
<p>Public - Final Result(F1 score : 0.9204)</p>
<p>Private -Final Result(F1 score : 0.9091)</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/0357ae29-68f6-47fb-884f-f20a5de5cef9/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/2855da3f-a1d2-4631-96dd-1884c4d7483d/image.png" alt=""></p>
<p>결론적으로 K-Means 모델링 결과가 가장 좋게 나왔다. 나는 DBSCAN을 담당하였는데, 모델을 공부할 당시 DBSCAN은 K-Means 모델의 단점을 개선한 모델이라 더 명확한 구분이 가능하다는 장점을 소개한 내용을 확인했었다. 하지만 막상 모델링을 해보니 그렇지 않았다. DBSCAN은 밀도 기반 클러스터링이므로 애초에 화학공정 이상 탐지 데이터와는 특성이 맞지 않은 모델이었던 것 같다. </p>
<h3 id="5-자체-평가-의견">5. 자체 평가 의견</h3>
<p><strong>A. 잘했던 점</strong></p>
<ul>
<li>각자 하나의 모델을 심도있게 파보는 시간을 가졌다. 모델 고도화에 초점을 맞췄던 점이 좋았다.</li>
<li>각자의 다양한 관점을 실시간으로 공유하여 함께 진행하는 프로젝트 분위기를 만들고자 하였다.</li>
<li>간트차트를 활용하여 프로젝트 진행 상황을 보기 좋게 정리하고자 하였다.</li>
</ul>
<p><strong>B. 시도 했으나 잘 되지 않았던 것들</strong></p>
<ul>
<li>DBSCAN 모델을 고도화 시키기 위해 정말 많은 방법을 시도해보았다. DBSCAN의 Hyperparameter는 epsilon과 Minpts 로 2가지가 있다. 나는 elbow point를 고려하여 epsilon 값을 설정하고 강의에서 MinPts는 주로 4이하의 값으로 쓴다는 이야기를 반영하여 Hyperparameter 설정을 해보았지만 결과는 크게 달라지지 않았다. Hyperparameter 값을 수정하면서 Clustering 수를 늘려보아도 이상치들이 너무 많이 검출되었고, 완벽하게 clustering 되지 않는 결과를 보였다. </li>
</ul>
<p><strong>C. 아쉬웠던 점들</strong></p>
<ul>
<li>1인 1모델을 담당했던 점이 좋기도 하면서 아쉬운 점이기도 했다. 우리는 대회를 2개를 참여하는 팀이었기에 한 대회에만 목을 맬 수 없는 상황이었다. 하지만 각자의 모델을 지정하고 해당 모델을 고도화 시키는 방법을 선택하니 그 모델 이외에 다른 모델을 도전해볼 시간이 부족하였다. 데이터를 먼저 확인하고 데이터에 맞는 모델을 선택하여 고도화 시키는 방법을 선택했으면 더 좋은 결과를 산출할 수 있지 않았을까 하는 아쉬움이 남는다.</li>
</ul>
<p><strong>D. 프로젝트를 통해 배운 점 또는 시사점</strong></p>
<ul>
<li>멘토링 해주신 멘토님의 말씀이 기억에 남는다. &quot;아무 근거 없이 모델을 선택하여 그 모델을 바탕으로 데이터를 분석하기 보다는 먼저 데이터 분석을 완벽히한 후 해당 데이터에 맞는 모델을 선택하는 과정이 필요하며, 그 과정이 굉장히 중요하다&quot;는 말씀을 하셨다. 이번 대회를 통해서 모델을 세부적으로 공부하는 시간을 가졌으니 다음 대회에서는 데이터 파악에 좀 더 힘을 실어야겠다는 생각을 하게 되었다. </li>
</ul>
<h3 id="마무리">마무리</h3>
<p>드디어 길고 길었던 AI 부트캠프 과정이 끝이 났다. 마지막 대회여서 시원 섭섭하기도 하고 뿌듯하기도 하고 그렇지만 아쉬운 부분이 굉장히 많이 남는다. 여기서 배웠던 모든 과정들 그리고 훌륭하신 멘토님과 강사님께서 해주신 말씀들을 잘 새겨 담아 실무에서 유능하게 써먹을 수 있는 사람이 되도록 노력할 것이다. </p>
<p>#패스트캠퍼스 #UpstageAILab #Upstage #부트캠프 #AI #데이터분석 #데이터사이언스 #인공지능개발자 #ML #머신러닝 #경진대회 #딥러닝 #NLP</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Scientific Knowledge Question Answering | 과학 지식 질의 응답 시스템 구축]]></title>
            <link>https://velog.io/@d_yeon819/Scientific-Knowledge-Question-Answering-%EA%B3%BC%ED%95%99-%EC%A7%80%EC%8B%9D-%EC%A7%88%EC%9D%98-%EC%9D%91%EB%8B%B5-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B5%AC%EC%B6%95</link>
            <guid>https://velog.io/@d_yeon819/Scientific-Knowledge-Question-Answering-%EA%B3%BC%ED%95%99-%EC%A7%80%EC%8B%9D-%EC%A7%88%EC%9D%98-%EC%9D%91%EB%8B%B5-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B5%AC%EC%B6%95</guid>
            <pubDate>Mon, 06 May 2024 16:08:50 GMT</pubDate>
            <description><![CDATA[<pre><code>팀명 : GBE-SK</code></pre><p><del>앞서 작성한 Anomaly Detection과 겹치는 내용이 많기에 상당 부분 생략될 수 있음을 미리 말씀 드리고자 한다.</del></p>
<h3 id="1-프로젝트-개요">1. 프로젝트 개요</h3>
<p><strong>A. 개요</strong></p>
<p>LLM의 등장 이후 여러 산업 분야에서 지식을 다루는 업무들이 점점 고도화되고 있다.</p>
<p>특히 정보를 찾기 위해 검색엔진의 입력창에 키워드를 입력하고 결과를 확인하고 원하는 정보가 없으면 다른 키워드로 다시 검색하기를 반복하는 번거로운 과정을 이제 더이상 자주 할 필요가 없어졌다.</p>
<p>이제 LLM한테 물어보면 질문의 의도까지 파악해서 필요한 내용만 잘 정리해서 알려 준다.
<img src="https://velog.velcdn.com/images/d_yeon819/post/3b14e212-ae50-4fae-a65d-0e9e8f08cb74/image.png" alt=""></p>
<p>그렇지만 LLM이 가진 근본적인 한계도 있다.</p>
<p>먼저, 정보라는 것은 의미나 가치가 시간에 따라 계속 변하기 때문에 모델이 이를 실시간으로 학습하기 힘들고 이 때문에 아래 예시처럼 knowledge cutoff 가 자연스럽게 발생한다.
<img src="https://velog.velcdn.com/images/d_yeon819/post/2730db07-0330-41f1-900d-8f758bc1f868/image.png" alt=""></p>
<p>그리고 LLM이 알려주는 지식이 항상 사실에 기반한 것이 아닌 경우가 종종 있다. 특히 특정 도메인이나 문제 영역은 매우 심각한 거짓 정보들을 생성해 내곤 한다. 아래 예시에서 추천하는 맛집들은 모두 실재하지 않는 장소들이다.
<img src="https://velog.velcdn.com/images/d_yeon819/post/178863f5-7757-4847-876d-914421e54fb6/image.png" alt=""></p>
<p>이러한 환각 현상은 메타인지를 학습하지 않은 LLM의 근본적인 한계라 볼 수 있다.</p>
<p>모델은 학습 과정에서 정보를 압축해서 저장하기 때문에 정보의 손실이 발생할 수밖에 없고, 이 때문에 특정 입력 조건에 대해서는 사실 여부보다는 지식를 표현하는 국소적인 패턴이 더 큰 영향을 주면서 답변이 생성될 수 있기 때문이다.</p>
<p>이러한 문제를 극복하기 위해서는 RAG(Retrieval Augmented Generation) 기술이 필수이다.</p>
<p>RAG는 질문에 적합한 레퍼런스 추출을 위해 검색엔진을 활용하고 답변 생성을 위해 LLM(Large Language Model)을 활용한다.</p>
<p>이때 LLM은 스스로 알고 있는 지식을 출력하기보다는 언어 추론 능력을 극대화하는 것에 방점을 둔다.</p>
<p>이렇게 사실에 기반한 지식 정보를 토대로 질문에 답을 하고 출처 정보도 같이 줄 수 있기 때문에 사용자는 훨씬 더 안심하고 정보를 소비할 수 있게 된다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/bc6aef00-31ac-4bf2-99a7-0203c2f2161f/image.png" alt=""></p>
<p>이번 대회에서는 과학 상식을 질문하는 시나리오를 가정하고 과학 상식 문서 4200여개를 미리 검색엔진에 색인해 둔다.</p>
<p>대화 메시지 또는 질문이 들어오면 과학 상식에 대한 질문 의도인지 그렇지 않은 지 판단 후에 과학 상식 질문이라면 검색엔진으로부터 적합한 문서들을 추출하고 이를 기반으로 답변을 생성한다. </p>
<p>만일 과학 상식 이외의 질문이라면 검색엔진을 활용할 필요 없이 적절한 답을 바로 생성한다.</p>
<p>마지막으로, 본 프로젝트는 모델링에 중점을 둔 대회가 아니라 RAG(Retrieval Augmented Generation) 시스템의 개발에 집중하고 있다. 이 대회는 여러 모델과 다양한 기법, 그리고 앙상블을 활용하여 모델의 성능을 향상시키는 일반적인 모델링 대회와는 다르다. 대신에 검색 엔진이 올바른 문서를 색인했는지, 그리고 생성된 답변이 적절한지 직접 확인하는 것이 중요한 대회이다.</p>
<p>따라서, 참가자들은 작은 규모의 토이 데이터셋(10개 미만)을 사용하여 초기 실험을 진행한 후에 전체 데이터셋에 대한 평가를 진행하는 것을 권장한다. 실제로 RAG 시스템을 구축할 때에도 이러한 방식이 일반적으로 적용되며, 이를 통해 실험을 더욱 효율적으로 진행할 수 있다. 따라서 이번 대회는 2주간 진행되며, 하루에 제출할 수 있는 횟수가 5회로 제한된다.</p>
<p>자, 이제 여러분만의 RAG 시스템을 구축하러 가보실까~?</p>
<p>출처: Upstage(AI Stages)</p>
<h4 id="제공된-데이터셋"><strong>제공된 데이터셋</strong></h4>
<blockquote>
<p>과학 상식 정보를 담고 있는 순수 색인 대상 문서 4200여개(학습 데이터 별도 제공 X)</p>
</blockquote>
<p>파일 포맷은 각 line이 json 데이터인 jsonl 파일이다.
<img src="https://velog.velcdn.com/images/d_yeon819/post/d2167f8c-d150-411d-b926-ce3f59944deb/image.png" alt=""></p>
<p>학습 데이터 설명</p>
<p>이번 대회는 머신러닝 모델을 학습하는 것 보다는 임베딩 생성 모델, 검색엔진, LLM 등을 활용하여 레퍼런스를 잘 추출하고 이를 토대로 얼마나 답변을 잘 생성하는지 판단하는 대회이다.</p>
<p>따라서 모델 학습을 위한 학습데이터를 별도로 제공하지 않고, 과학 상식 정보를 담고 있는 순수 색인 대상 문서 4200여개가 제공된다. </p>
<p>문서의 예시는 아래와 같다. &#39;doc_id&#39;에는 uuid로 문서별 id가 부여되어 있고 &#39;src&#39;는 출처를 나타내는 필드이다. 그리고 실제 RAG에서 레퍼런스로 참고할 지식 정보는 &#39;content&#39; 필드에 저장되어 있다.</p>
<p>참고로  데이터를 Open Ko LLM Leaderboard에 들어가는 Ko-H4 데이터 중 MMLU, ARC 데이터를 기반으로 생성했기 때문에 출처도 두가지 카테고리를 가진다.</p>
<p><strong>B. 환경</strong></p>
<ul>
<li><p>팀 구성 및 컴퓨팅 환경</p>
<p>  7인 1팀, 인당 RTX 3090ti 서버를 VSCode와 SSH로 연결하여 사용</p>
</li>
<li><p>협업 환경</p>
<p>  Notion, GitHub</p>
</li>
<li><p>의사 소통</p>
<p>  KakaoTalk, Zoom, Slack, Discord</p>
</li>
</ul>
<h3 id="2-프로젝트-팀-구성-및-역할">2. 프로젝트 팀 구성 및 역할</h3>
<ul>
<li><p><strong>팀 구성</strong>
  IR 대회도 AD 대회와 마찬가지로 7명이서 진행하였다. 공식적으로 등록된 건 AD 3명, IR 4명 이었지만 모두가 함께 2개의 대회에 참여하였다. 이 중 나는 공식적으로는 IR 팀에 배정되어 대회에 참여하게 되었다.
  IR도 AD와 동일하게 간트차트를 작성하여 Task 구성을 한 눈에 보기 좋게 구성하였다. 나는 IR 간트차트를 담당하게 되었었는데 처음 간트차트를 접하고 구성하느라 하루를 통째로 투자하였던 것 같다. 덕분에 결과물은 보기 좋게 나온 것 같아 만족스러웠다. </p>
<p>  <img src="https://velog.velcdn.com/images/d_yeon819/post/11eb4e4e-bcf2-4523-8698-235c277f7699/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><strong>역할</strong></li>
</ul>
<pre><code>Task 목록은 다음과 같다.
&gt; Information Retrieval 공부하기 및 강의 듣기
&gt; 데이터 확인 및 분류(Data Verification)
&gt; 프롬프트 엔지니어링(Prompt Engineering)
&gt; 모델링 및 파라미터 튜닝(Modeling and Parameter Tuning)
&gt; 결과 정리 및 보고서 작성(Summarization of Results and Report Writing)


IR은 모두가 처음 접해보는 분야기도 하고 아직 다른 교육 과정에서 쉽게 접할 수 없는 내용이어서 개인적으로 공부하는 시간을 오래가졌다. 이 분야는 RAG 실습만 짜여진대로 잘 따라하고 짜여진 baseline code만 잘 이해해도 반 이상은 얻어가는 분야라는 이야기가 많았다. 처음 나의 목표는 &#39;짜여진 Baseline code라도 잘 이해해서 얻어가자&#39; 였다. </code></pre><h3 id="3-프로젝트-수행-절차-및-방법">3. 프로젝트 수행 절차 및 방법</h3>
<p><strong>A. 팀 목표 설정</strong></p>
<blockquote>
<p><strong>1주차</strong> : 주어진 Upstage 강의 다 듣기, Data 구성 확인하기, base line code 이해하기
<strong>2주차</strong> : Prompt engineering 고도화
<strong>3주차</strong> : 모델링, 모델 튜닝, prompt 수정, 최종 모델 완성
<strong>4주차</strong> : 보고서 작성, PPT 제작, GIT 관리</p>
</blockquote>
<p><strong>B. 프로젝트 사전 기획</strong></p>
<p>(1) 협업 문화</p>
<blockquote>
<ol>
<li>특별한 일을 제외하고는 항상 모여서 의논하면서 Task 진행할 것(Zoom, Discord)</li>
<li>오프라인 모임이 가능할 경우 오프라인 만남을 적극 활용할 것(소통 Skill Up)</li>
<li>논의 사항 및 오류 사항이 있을 경우 즉각 팀원들과 상의할 것</li>
<li>New 아이디어 발생 시 Team Notion에 작성 후 팀원 호출하여 해당 아이디어에 대해 공유할 것</li>
<li>말하지 않아도 각자 중간 진행 상황에 대해 틈틈이 보고할 것</li>
</ol>
</blockquote>
<p>이번 대회에서는 정말 많은 플랫폼을 활용하였다. Notion부터 시작해서 Discord, Zoom, GitHub 등등 좀 더 활용하고 있는 플랫폼을 극대화 시키고자 노력했던 것 같다. 나는 Meeting을 진행할 때마다 꼭 회의록을 작성하여 Notion에 남겨두는 습관을 들였다. 나중에 회의에 불참한 사람이든, 집중하지 못한 사람이든 누가봐도 어떤 회의를 진행하였는지 확인하기 위함이었다.</p>
<h3 id="4-프로젝트-수행-결과">4. 프로젝트 수행 결과</h3>
<p>팀 최고 점수
Public - Final Result(MAP : 0.9045)
개인 점수
Public - Final Result(MAP : 0.7121)</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/82f2119f-c7b0-4224-8811-90b14df2e00a/image.png" alt=""></p>
<p>팀 최고 점수
Private -Final Result(MAP : 0.8652)
개인 점수
Private - Final Result(MAP : 0.7227)</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/1294c023-a1f0-4f2e-b5be-7fc7f18e02d4/image.png" alt=""></p>
<p>우리 팀에서는 총 5가지의 관점으로 이 대회에 접근하였다. </p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/84d3f4a2-3696-4ecb-8328-7f52a2e895bd/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/9b6c4baa-2bf9-44ff-a624-4a0e6c2d7641/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/88a6ba11-a542-49ed-9374-5d7e8364f412/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/610ccc6d-e8fe-4f57-8887-35a03e859028/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/86751d09-92b8-4bbb-b5f0-94e5d838dbc8/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/7dc30633-4d53-4943-a3c3-763de980ace5/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/4f8fda2d-3638-4c46-8f1d-597bb5c8ad03/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/b5665326-d15a-41c6-9a7d-f2d6d66358f2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/df517931-281c-4cb1-9d5e-b3d2fbc23d3b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/b979aac2-04a7-4116-a245-8a058580de69/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/b836485b-8c43-4119-bd92-8d705333fab6/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/c2c32347-4ad7-46a1-8c8d-8b2ca5b72eab/image.png" alt=""></p>
<p>나는 이 중에서 Hybrid retrieval(Sparse + Dense)와 HyDE(Hypothetical Document Embeddings), Prompt engineering에 집중하였다. </p>
<p>참고 자료로 PPT 링크를 첨부하도록 하겠다. <a href="https://docs.google.com/presentation/d/1mjfruR3dbH1T0Uw-ifn6qpIbkh_5tFiU/edit#slide=id.p1">참고자료 : PPT</a></p>
<h3 id="5-자체-평가-의견">5. 자체 평가 의견</h3>
<p><strong>A. 잘했던 점</strong></p>
<ul>
<li>새로운 관점으로 접근하기 위해 HyDE 기법을 추가하였다.</li>
<li>대회 방향에 알맞은 문서 색인을 할 수 있도록 Prompt 수정을 끊임없이 하였다.</li>
</ul>
<p><strong>B. 시도 했으나 잘 되지 않았던 것들</strong></p>
<ul>
<li>Hybrid retrieve(Sparse + Dense)를 적용하기 위해 나름대로 코드를 작성했으나 적용이 되지 않고 있었다는 것을 대회 마무리 때 알게 되었다. 급한대로 Hybrid 적용을 한 코드로 여러가지 프롬프트 실험을 많이 해보았지만 이상하게 나만 성능이 잘 나오지 않았다. 이후에 대회가 끝나고 코드 탐색을 다시 해보았는데 Sparse와 Dense의 score를 맞추는 작업이 이루어 지지 않고 있던 문제를 발견하게 되었다.</li>
</ul>
<p><strong>C. 아쉬웠던 점들</strong></p>
<ul>
<li>실제로 HyDE 기법은 성능 향상에 효과가 있었다. 비록 잘못된 코드(Sparse + Dense score 작업이 이루어지지 않은)로 돌렸지만 12.55% 성능 향상이 결과적으로 확인 되었다. 하지만 Prompt 수정에 너무 많은 시간을 썼었고, HyDE 기법을 대회 마무리 쯤 알게 되어 많은 시도를 해보지 못한 것이 아쉬웠다. 팀원들에게 이 기법을 공유하여 적용할 수 있는 시간이 없어서 나 혼자 시도 해보고 마무리 했던 점이 굉장히 아쉬웠다. </li>
</ul>
<p><strong>D. 프로젝트를 통해 배운 점 또는 시사점</strong></p>
<ul>
<li>접하기 어려운 RAG 시스템을 직접 공부하고 경험할 수 있어서 정말 값진 경험이었다고 생각한다. 실제로 Open AI API Credit 까지 일정 금액 제공해주셔서 실제로 GPT 를 사용하여 모델을 학습시킬 수 있었던 것이 정말 좋았다. LLM의 발전은 무궁무진하다. 이 분야로 뛰어들기 위해서는 정말 많은 공부를 해야겠다는 다짐을 하게 된 계기였던 것 같다. </li>
</ul>
<h3 id="마무리">마무리</h3>
<p>Information Retrieval 대회까지 모두 마무리하였다. 패스트 캠퍼스 부트캠프를 참여하며 정말 상상도 못할 정도로 많은 성장이 있었다는 생각이 든다. 코드 한 줄 칠 줄 몰랐던 내가 조금씩이나마 코드를 칠 줄 알게 되었다는 점, 코드를 읽고 이해할 수 있게 되었다는 점, 컴퓨터 프로그램 언어를 활용하여 데이터를 분석할 수 있게 되었다는 점, 이 모든 게 패스트캠퍼스가 아니었으면 불가능 했을 것 같다. 이 값진 경험들을 잊지 않고 계속 활용할 수 있도록 앞으로도 많은 노력을 할 것이다 !</p>
<p>#패스트캠퍼스 #UpstageAILab #Upstage #부트캠프 #AI #데이터분석 #데이터사이언스 #인공지능개발자 #ML #머신러닝 #경진대회 #딥러닝 #NLP</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Anomaly Detection | [업스테이지] AI 실전 학습_강의개요]]></title>
            <link>https://velog.io/@d_yeon819/Anomaly-Detection-%EC%97%85%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80-AI-%EC%8B%A4%EC%A0%84-%ED%95%99%EC%8A%B5%EA%B0%95%EC%9D%98%EA%B0%9C%EC%9A%94</link>
            <guid>https://velog.io/@d_yeon819/Anomaly-Detection-%EC%97%85%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80-AI-%EC%8B%A4%EC%A0%84-%ED%95%99%EC%8A%B5%EA%B0%95%EC%9D%98%EA%B0%9C%EC%9A%94</guid>
            <pubDate>Sun, 14 Apr 2024 16:36:14 GMT</pubDate>
            <description><![CDATA[<h3 id="오리엔테이션ot">오리엔테이션(OT)</h3>
<p>CH01 - 이상 탐지 개요</p>
<ul>
<li>차원 축소 기술</li>
<li>EDA</li>
<li>데이터 시각화</li>
</ul>
<p>CH02 - ML 기반 이상 탐지</p>
<ul>
<li><p>본격적인 이상 탐지 학습</p>
</li>
<li><p>D/L이 아닌 조금 더 전통적인 방식의 머신러닝 기술에 대해 학습</p>
<ul>
<li>통계 기반</li>
<li>분류 기반</li>
<li>군집 기반</li>
</ul>
</li>
<li><p>D/L is not all you need!</p>
</li>
</ul>
<p>CH03 - DL 기반 이상 탐지</p>
<ul>
<li>딥러닝을 사용하는 이상 탐지 기술에 대해 알아보는 시간</li>
<li>모든 경우에 딥러닝이 적잘하지는 않지만, 여전히 가장 강력한 AI 기술</li>
<li>비 선형적인 데이터에 적용하기 적절</li>
</ul>
<p>CH04 - 이상 탐지 Case study</p>
<ul>
<li>공개된 데이터 셋으로 이상탐지에 대해 구체적으로 알아보는 시간</li>
<li>2개의 kaggle case study</li>
</ul>
<h3 id="이상탐지-개요">이상탐지 개요</h3>
<ol>
<li><p>이상 탐지?</p>
<ul>
<li>데이터의 대다수와 현저히 다르며 정상 범위에서 벗어나서 드물게 발생하는 항목, 사건, 관측치를 찾아내는 과정</li>
</ul>
</li>
<li><p>이상 탐지 use-case</p>
<ul>
<li>이상탐지 기술이 활용되는 예시</li>
</ul>
<ol>
<li>Image 이상 탐지            <pre><code> - 촬영된 이미지
 - 의료 도메인, 산업용 공정 등에서 활용</code></pre></li>
<li>Text 이상 탐지</li>
</ol>
<ul>
<li>문자로 표현되는 데이터의 의미를 파악하는 이상 탐지</li>
</ul>
<ol start="3">
<li>Tabular data 이상 탐지</li>
</ol>
<ul>
<li>테이블(표) 형태로 표현 가능한 데이터의 이상 탐지</li>
<li>수치적, 통계적 특성을 주로 활용</li>
</ul>
<ol start="4">
<li>Time-series data 이상 탐지</li>
</ol>
<ul>
<li>일정한 시간 정보를 포함한 데이터의 이상 탐지</li>
<li>사이버 공격 방어, 실시간 금융 거래 모니터링</li>
</ul>
</li>
<li><p>이번 강의에서는!</p>
<ul>
<li>Tabular + Time-series + a</li>
<li>전통적인 방식의 머신 러닝 알고리즘에 대해 학습</li>
</ul>
</li>
</ol>
<h3 id="데이터-특성의-이해">데이터 특성의 이해</h3>
<ol>
<li><p>데이터 종류
[데이터 정보]
정량적 vs 정성적 정보
=&gt; 정량적 : 수치, 도형, 기호 등 바로 측정할 수 있는 정보
=&gt; 정성적 : 언어나 문자 등 &#39;설명&#39;이 필요한 정보
[데이터 유형]
정형 데이터(Structured data)
=&gt; 행과 열로 구성되어 있는 테이블 형태의 데이터
시계열 데이터(Time Series Data)
=&gt; 시간 정보가 존재하는 tabular data
비정형 데이터(Unstructured data)
=&gt; 정해진 구조가 없이 저장된 데이터
반정형 데이터(Semi-Structured data)
=&gt; 데이터 내용 안에 구조에 대한 설명이 함께 존재함
=&gt; tabular data와 다르게 고정된 스키마가 없음
=&gt; XML, HTML, Json 등</p>
</li>
<li><p>EDA(Exploratory Data Analysis)</p>
</li>
</ol>
<ul>
<li><p>EDA란?
=&gt; 시각화, 통계적 기법 적용 등을 통해 데이터를 탐색하는 과정</p>
</li>
<li><p>EDA의 핵심 요소
=&gt; 데이터의 각 column의 의미를 파악하고 상관 관계를 파악
=&gt; 결측치 처리 및 데이터 필터링
=&gt; 직관적이고 쉽게 이해할 수 있는 데이터 시각화</p>
</li>
<li><p>Dataset 이해</p>
</li>
<li><p>결측치 파악</p>
</li>
<li><p>데이터 시각화 </p>
<ul>
<li>hourly / daily / weekly</li>
<li>Value Distribution (Day &amp; Hour)</li>
<li>Hour &amp; Day: Demand by Hour</li>
</ul>
</li>
</ul>
<h3 id="차원-축소">차원 축소</h3>
<ol>
<li>고차원 데이터와 차원 축소</li>
</ol>
<ul>
<li><p>고차원 데이터
=&gt; 고차원 데이터 : 많은 수의 변수나 특성을 가진 데이터
=&gt; 차원의 저주(The Curse of Dimensionality) : 데이터의 차원이 증가함에 따라 필요한 데이터 샘플의 양이 기하급수 적으로 증가하여 모델 학습과 일반화에 어려움을 초래하는 현상
=&gt; 시각화 문제 : 차원이 높은(복잡한) 데이터는 직관적으로 이해하기 힘듦</p>
</li>
<li><p>차원 축소
=&gt; 데이터의 특성(Feature)을 줄여서 데이터를 간결하게 만드는 기술</p>
</li>
</ul>
<ol start="2">
<li>차원 축소 방법</li>
</ol>
<ul>
<li><p>차원 축소 유형
=&gt; Feature Selection : 분석 목적에 부합하는 소수의 특징만을 선택
=&gt; Feature Extraction : 기존 특징의 변환을 통해 새로운 특징 추출</p>
</li>
<li><p>PCA(Principal Component Analysis; 주 성분 분석)
=&gt; 여러 변수간 존재하는 상관관계를 이용해 이를 대표하는 주성분을 추출해 차원을 축소하는 방법</p>
</li>
<li><p>t-SNE(t-distributed Stochastic Neighbor Embedding)
=&gt; 고차원 데이터를 저차원에 t-확률 분포로 표현하는 비선형 차원축소 방법</p>
</li>
<li><p>PCA vs t-SNE
=&gt; 데이터가 비 선형적인 관계를 가진다면 t-SNE 활용
=&gt; 데이터가 선형적인 관계를 가진다고 PCA가 더 좋은 것은 아님</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Dialogue Summarization | 일상 대화 요약]]></title>
            <link>https://velog.io/@d_yeon819/Dialogue-Summarization-%EC%9D%BC%EC%83%81-%EB%8C%80%ED%99%94-%EC%9A%94%EC%95%BD</link>
            <guid>https://velog.io/@d_yeon819/Dialogue-Summarization-%EC%9D%BC%EC%83%81-%EB%8C%80%ED%99%94-%EC%9A%94%EC%95%BD</guid>
            <pubDate>Mon, 25 Mar 2024 03:31:43 GMT</pubDate>
            <description><![CDATA[<pre><code>팀명 : 버블리그(Bobble League)</code></pre><p><del><em>딥러닝 프로젝트 중 2번째 프로젝트인 NLP 프로젝트가 끝났다. NLP 프로젝트 회고를 작성해보고자 한다.</em></del></p>
<h3 id="1-프로젝트-개요">1. 프로젝트 개요</h3>
<p><strong>A. 개요</strong></p>
<p>Dialogue Summarization 경진대회는 주어진 데이터를 활용하여 일상 대화에 대한 요약을 효과적으로 생성하는 모델을 개발하는 대회이다. </p>
<p>일상생활에서 &#39;대화&#39;는 항상 이루어지고 있다. 회의나 토의는 물론이고, 사소한 일상 대화 중에도 서로 다양한 주제와 입장들을 주고 받는다. 나누는 대화를 녹음해두더라도 대화 전체를 항상 다시 들을 수는 없기 때문에 요약이 필요하고, 이를 위한 통화 비서와 같은 서비스들도 등장하고 있다.</p>
<p>그러나 하나의 대화에서도 관점, 주제별로 정리하면 수 많은 요약을 만들 수 있다. 대화를 하는 도중에 이를 요약하게 되면 대화에 집중할 수 없으며, 대화 이후에 기억에 의존해 요약하게 되면 오해나 누락이 추가되어 주관이 많이 개입되게 된다.</p>
<p>이를 돕기 위해, 우리는 이번 대회에서 일상 대화를 바탕으로 요약문을 생성하는 모델을 구축하려고 한다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/769c21ce-7ce2-4ba1-93fb-d31a0d44fdd7/image.png" alt=""></p>
<h4 id="제공된-데이터셋"><strong>제공된 데이터셋</strong></h4>
<blockquote>
<ol>
<li>train data 12,457</li>
<li>dev 499</li>
<li>hidden-test 249</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/34e858c5-8866-49e2-8eda-b4bf82e00e6f/image.png" alt=""></p>
<p>주어진 데이터는 다음과 같았으며, 각 column의 설명은 다음과 같다.
frame : 대화 고유 번호. 중복되는 번호가 없음.
dialogue : 최소 2명에서 최대 7명이 등장하여 나누는 대화 내용이다. 각각의 발화자를 구분하기 위해 #Person”N”#: 을 사용하며, 발화자의 대화가 끝나면 &#39;\n&#39; 으로 구분한다. 이 구분자를 기준으로 하여 대화에 몇 명의 사람이 등장하는지 확인해보는 부분은 EDA 에서 다루고 있다.</p>
<p>summary : 해당 대화를 바탕으로 작성된 요약문.</p>
<p><strong>B. 환경</strong></p>
<ul>
<li><p>팀 구성 및 컴퓨팅 환경</p>
<p>  6인 1팀, 인당 RTX 3090ti 서버를 VSCode와 SSH로 연결하여 사용</p>
</li>
<li><p>협업 환경</p>
<p>  Notion, GitHub</p>
</li>
<li><p>의사 소통</p>
<p>  KakaoTalk, Zoom, Slack, Discord</p>
</li>
</ul>
<h3 id="2-프로젝트-팀-구성-및-역할">2. 프로젝트 팀 구성 및 역할</h3>
<ul>
<li><p><strong>팀 구성</strong>
  이번 프로젝트 팀원으로 배정된 인원은 6명 이었다. 늘 함께하던 4명, 그리고 이전 Computer Vision 대회에서 새로 추가된 1명을 제외하고 또 한 분이 새로 들어오게 되었다. 역시나 이번에도 또래여서 큰 불화 없이 프로젝트를 잘 마무리 하였다.  </p>
</li>
<li><p><strong>역할</strong></p>
</li>
</ul>
<pre><code>Task 목록은 다음과 같다.
&gt; 데이터 확인 및 분류(Data Verification and Classification)
&gt; 데이터 전처리 및 EDA(Data Preprocessing and Exploratory Data Analysis)
&gt; 모델링 및 파라미터 튜닝(Modeling and Parameter Tuning)
&gt; 결과 정리 및 보고서 작성(Summarization of Results and Report Writing)


모두가 함께 모든 Task 에 참여했다. 하지만 우리 팀에 Deep Learning 쪽으로 연구를 오래 진행하셨던 분이 두 분이나 계셔 그 분들의 지식과 인사이트를 바탕으로 프로젝트를 진행하였다. ~~그 분들도 NLP Project 는 처음이라 하셨지만 Deep Learning에 이제 막 발을 담근 나보다는 더 잘할 것이라 생각했고, 현실적으로 그게 맞았다.~~</code></pre><h3 id="3-프로젝트-수행-절차-및-방법">3. 프로젝트 수행 절차 및 방법</h3>
<p><strong>A. 팀 목표 설정</strong></p>
<blockquote>
<p><strong>1주차</strong> : 주어진 Upstage 강의 다 듣기, train 데이터 및 test 데이터 패턴 파악하기, base line code 이해하기
<strong>2주차</strong> : 기존 데이터 탐색 및 파악하기(EDA 및 전처리), 데이터 증강하기(Data Augmentation, EDA + AEDA)
<strong>3주차</strong> : 모델링, 모델 튜닝, 최종 모델 완성</p>
</blockquote>
<p><strong>B. 프로젝트 사전 기획</strong></p>
<p>(1) 협업 문화</p>
<blockquote>
<ol>
<li>특별한 일을 제외하고는 항상 모여서 의논하면서 Task 진행할 것(Zoom, Discord)</li>
<li>오프라인 모임이 가능할 경우 오프라인 만남을 적극 활용할 것(소통 Skill Up)</li>
<li>논의 사항 및 오류 사항이 있을 경우 즉각 팀원들과 상의할 것</li>
<li>New 아이디어 발생 시 Team Notion에 작성 후 팀원 호출하여 해당 아이디어에 대해 공유할 것</li>
<li>말하지 않아도 각자 중간 진행 상황에 대해 틈틈이 보고할 것</li>
</ol>
</blockquote>
<p>우리팀의 좋았던 점은 별 일 없으면 항상 온라인 소통 플랫폼에 항상 접속해 있는 것이었다. 문제가 생기면 언제든 소통이 가능했고 좋은 아이디어가 생겨도 실시간으로 바로바로 소통이 가능했다. 이 점이 팀 프로젝트 결과물을 뽑아내는 데 중요한 요소였던 것 같다. 이번에 새로 합류한 팀원께도 플랫폼 초대 링크를 보내어 참석할 수 있도록 하였다. <del>우리 팀은 기존의 Zoom 플랫폼 보다 Discord 활용을 더 많이 한 것 같다.</del>
다른 팀 보다 늘 다양한 과정과 관점, 다양한 결과물을 완성시켰던 것 같다. 이번 발표회에서도 강사님께서 이 부분을 우리팀의 장점이라 높이 칭찬하셨다. EDA 프로젝트부터 Machine Learning 프로젝트, Machine Learning 대회, Deep Learning(CV), Deep Learning(NLP) 대회까지 동일한 팀원들과 프로젝트를 진행 중인데 변하지 않고 이런 협업 분위기가 지속되고 있어 개인적으로 너무 만족스럽다. 새로 팀에 합류하신 또 다른 한 분도 우리의 팀 분위기에 자연스럽게 녹아들어 임해주셔서 너무 감사한 마음이 들었다. </p>
<h3 id="4-프로젝트-수행-결과">4. 프로젝트 수행 결과</h3>
<p>Public - Final Result(F1 score : 42.5474)</p>
<p>Private -Final Result(F1 score : 39.3707)</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/8834137f-1140-4bb2-97c4-caaab8803552/image.png" alt=""></p>
<p>우리 팀은 8가지 Tokenizer 를 사용하여 다양한 시도를 해보았다. Hugging Face에 업로드 되어있는 각기 다른 8가지의 Tokenizer를 활용하여 다른 적용을 시도하려 했다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/1c586c13-d45d-45d1-811d-3fe14b9b2617/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/951cbc01-5b4a-487f-9d9b-df87285974b9/image.png" alt=""></p>
<p>이후에는 EDA 를 통해 Data 를 증강하고자 했다. 데이터 증강 기법에 대한 기술은 PPT에 자세히 기술해두었으니 참고하면 될 것 같다. <a href="https://docs.google.com/presentation/d/15cafHlTN6UNRAf8-hrg2hwa0m6lNMWFO/edit?usp=sharing&amp;ouid=112740872612879476638&amp;rtpof=true&amp;sd=true">PPT링크</a></p>
<h3 id="5-자체-평가-의견">5. 자체 평가 의견</h3>
<p><strong>A. 잘했던 점</strong></p>
<ul>
<li>다양한 Tokenizer를 사용해보고 다양한 EDA(데이터 증강)을 진행하였다.</li>
<li>각자의 다양한 관점을 실시간으로 공유하여 함께 진행하는 프로젝트 분위기를 만들고자 하였다.</li>
<li>wandb 를 통해 팀원들의 모델 학습 결과를 실시간으로 확인하며 피드백하는 방식으로 진행하였다.</li>
</ul>
<p><strong>B. 시도 했으나 잘 되지 않았던 것들</strong></p>
<ul>
<li>큰 모델을 돌려보고 싶었으나 서버 용량 이슈로 인해 중간에 서버가 여러번 끊기는 현상이 발생하였다. T5만 돌리려고 해도 GPU 용량 문제로 오류가 발생하였다. 좀 더 큰 용량의 서버였다면 T5와 같은 큰 모델도 잘 돌아가지 않았을까 싶다.</li>
</ul>
<p><strong>C. 아쉬웠던 점들</strong></p>
<ul>
<li>저번 CV 대회 때와 동일하게 팀원 간의 수준 차이가 상당히 컸다. 나를 비롯한 4명의 사람들은 딥러닝 실전에 경험이 없는 사람이었으며, 나머지 2명은 딥러닝에 경험이 있는 사람들이었다. 그 분들과 대화를 하는 과정에서 의견 교류가 원활하게 되지 않았던 것 같다. <del>CV 때도 버벅이며 따라가기 벅찼는데 이어서 NLP 까지 진행하려니 여간 힘든 게 아니었다. 아마 그 분들이 엄청 답답했을 것 같다.</del>그래도 관련 도서를 구매하여 개인적으로 공부를 시작하기로 다짐하는 계기가 되었다.</li>
</ul>
<p><strong>D. 프로젝트를 통해 배운 점 또는 시사점</strong></p>
<ul>
<li>자연어 처리를 어떻게 하는 건지에 대해 대략적으로 알 수 있게 되었다. </li>
<li>자연어 처리 중 &#39;요약&#39;이 어떤 모델과 과정을 통해 진행되는지 파악할 수 있던 시간이었다.</li>
</ul>
<h3 id="마무리">마무리</h3>
<p>Computer Vision 대회에 이어서 NLP 대회를 마무리하게 되었다. 모든 게 다 처음인 딥러닝 대회는 초심자에게 쉬운 대회는 아니었던 것 같다. 그래도 팀원 중 두 분이 어느 정도 경험이 있어 어깨 너머로 단어 하나하나 접해가며 천천히 배워가는 과정을 겪었던 시간이었다. NLP는 지금 현재 중요하게 뜨고 있는 분야이다. 정말 열심히 기초부터 잘 채워서 실무에 바로 적용할 수 있는 정도까지의 실력을 키워야겠다는 생각을 하게 되었다. NLP 교재 또한 2권 정도 구매하여, 복습할 겸 부족한 지식을 채워나가야 겠다.</p>
<p>#패스트캠퍼스 #UpstageAILab #Upstage #부트캠프 #AI #데이터분석 #데이터사이언스 #인공지능개발자 #ML #머신러닝 #경진대회 #딥러닝 #NLP</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Document Type Classification | 문서 타입 분류]]></title>
            <link>https://velog.io/@d_yeon819/Document-Type-Classification-%EB%AC%B8%EC%84%9C-%ED%83%80%EC%9E%85-%EB%B6%84%EB%A5%98</link>
            <guid>https://velog.io/@d_yeon819/Document-Type-Classification-%EB%AC%B8%EC%84%9C-%ED%83%80%EC%9E%85-%EB%B6%84%EB%A5%98</guid>
            <pubDate>Thu, 22 Feb 2024 09:26:55 GMT</pubDate>
            <description><![CDATA[<pre><code>팀명 : 플러스</code></pre><p><del><em>우여곡절 길고 길었던 CV 프로젝트가 끝났다. 처음 접해보는 Deep Learning 프로젝트여서 순탄하게 진행되지 않았던 것 같지만 그래도 열심히 참여했던 CV 프로젝트 회고를 작성해보고자 한다.</em></del></p>
<h3 id="1-프로젝트-개요">1. 프로젝트 개요</h3>
<p><strong>A. 개요</strong></p>
<p>이번 대회는 computer vision domain에서 가장 중요한 태스크인 이미지 분류 대회이다.</p>
<p>이미지 분류란 주어진 이미지를 여러 클래스 중 하나로 분류하는 작업이다. 이러한 이미지 분류는 의료, 패션, 보안 등 여러 현업에서 기초적으로 활용되는 태스크이다. 딥러닝과 컴퓨터 비전 기술의 발전으로 인한 뛰어난 성능을 통해 현업에서 많은 가치를 창출하고 있다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/ac20e913-2b31-4b80-889a-edb995cd77e1/image.png" alt=""></p>
<p>그 중, 이번 대회는 문서 타입 분류를 위한 이미지 분류 대회였다. 문서 데이터는 금융, 의료, 보험, 물류 등 산업 전반에 가장 많은 데이터이며, 많은 대기업에서 디지털 혁신을 위해 문서 유형을 분류하고자 한다. 이러한 문서 타입 분류는 의료, 금융 등 여러 비즈니스 분야에서 대량의 문서 이미지를 식별하고 자동화 처리를 가능케 할 수 있다.</p>
<h4 id="제공된-데이터셋"><strong>제공된 데이터셋</strong></h4>
<blockquote>
<ol>
<li>총 17개 종의 문서로 분류되어 있는 1570장의 train data</li>
<li>총 17개 종의 문서로 분류해야 하는 3140장의 test data</li>
</ol>
</blockquote>
<p>주어진 데이터는 다음과 같았으며, 이번 대회는 test data 가 train data 보다 많다는 점이 의아한 점이었다. 또한 이번 data는 현업에서 사용하는 실 데이터를 기반으로 대회를 제작했다고 하여 기대감이 컸다.</p>
<p><strong>B. 환경</strong></p>
<ul>
<li><p>팀 구성 및 컴퓨팅 환경</p>
<p>  5인 1팀, 인당 RTX 3090ti 서버를 VSCode와 SSH로 연결하여 사용</p>
</li>
<li><p>협업 환경</p>
<p>  Notion, GitHub</p>
</li>
<li><p>의사 소통</p>
<p>  KakaoTalk, Zoom, Slack, Discord</p>
</li>
</ul>
<h3 id="2-프로젝트-팀-구성-및-역할">2. 프로젝트 팀 구성 및 역할</h3>
<ul>
<li><p><strong>팀 구성</strong>
  프로젝트 팀원으로 배정된 인원은 5명 이었다. 늘 함께하던 4명을 제외하고 한 분이 새로 들어오게 되었는데 이번에 들어오신 분은 참여도가 높으셔서 개인적으로 만족스러운 팀워크를 형성할 수 있어 좋았다. </p>
</li>
<li><p><strong>역할</strong></p>
</li>
</ul>
<pre><code>Task 목록은 다음과 같다.
&gt; 데이터 확인 및 분류(Data Verification and Classification)
&gt; 데이터 전처리 및 EDA(Data Preprocessing and Exploratory Data Analysis)
&gt; 모델링 및 파라미터 튜닝(Modeling and Parameter Tuning)
&gt; 결과 정리 및 보고서 작성(Summarization of Results and Report Writing)


모두가 함께 모든 Task 에 참여했다. 하지만 우리 팀에 Computer Vision 쪽으로 연구를 오래 진행하셨던 분이 두 분이나 계셔 그 분들의 지식과 인사이트를 바탕으로 프로젝트를 진행하였다.</code></pre><h3 id="3-프로젝트-수행-절차-및-방법">3. 프로젝트 수행 절차 및 방법</h3>
<p><strong>A. 팀 목표 설정</strong></p>
<blockquote>
<p><strong>1주차</strong> : 주어진 Upstage 강의 다 듣기, test 데이터 패턴 파악하기, base line code 이해하기
<strong>2주차</strong> : Human Classification, 기존 데이터 탐색 및 파악하기(EDA 및 전처리)
<strong>3주차</strong> : 모델링, 모델 튜닝, 최종 모델 완성</p>
</blockquote>
<p><strong>B. 프로젝트 사전 기획</strong></p>
<p>(1) 협업 문화</p>
<blockquote>
<ol>
<li>특별한 일을 제외하고는 항상 모여서 의논하면서 Task 진행할 것(Zoom, Discord)</li>
<li>오프라인 모임이 가능할 경우 오프라인 만남을 적극 활용할 것(소통 Skill Up)</li>
<li>논의 사항 및 오류 사항이 있을 경우 즉각 팀원들과 상의할 것</li>
<li>New 아이디어 발생 시 Team Notion에 작성 후 팀원 호출하여 해당 아이디어에 대해 공유할 것</li>
<li>말하지 않아도 각자 중간 진행 상황에 대해 틈틈이 보고할 것</li>
</ol>
</blockquote>
<p>우리팀의 좋았던 점은 별 일 없으면 항상 온라인 소통 플랫폼에 항상 접속해 있는 것이었다. 문제가 생기면 언제든 소통이 가능했고 좋은 아이디어가 생겨도 실시간으로 바로바로 소통이 가능했다. 이 점이 팀 프로젝트 결과물을 뽑아내는 데 중요한 요소였던 것 같다. 다른 팀 보다 늘 다양한 과정과 관점, 다양한 결과물을 완성시켰던 것 같다. EDA 프로젝트부터 Machine Learning 프로젝트, Machine Learning 대회, Deep Learning(CV) 대회까지 동일한 팀원들과 프로젝트를 진행 중인데 변하지 않고 이런 협업 분위기가 지속되고 있어 개인적으로 너무 만족스럽다. 새로 팀에 합류하신 분도 우리의 팀 분위기에 자연스럽게 녹아들어 임해주셔서 너무 감사한 마음이 들었다. </p>
<h3 id="4-프로젝트-수행-결과">4. 프로젝트 수행 결과</h3>
<p>Public - Human Classification(F1 score : 0.9885)</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/3928d75c-99a3-451c-a03e-a964a6b74411/image.png" alt=""></p>
<p>Private - Efficientnet-b4 (F1 score : 0.9061)</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/8fe8af7f-0667-4bd3-92ef-8f71e1acfc7b/image.png" alt=""></p>
<p>우리 팀은 Model 을 사용하여 학습 시키는 방법과 직접 우리가 분류하는 Human Classification 방법 2가지를 사용하였다. 자세한 Code 및 PPT 자료는 <a href="https://github.com/UpstageAILab/upstage-ml-regression-01/tree/main">Github</a> 에서 확인할 수 있다. 프로젝트를 진행하며 작성했던 회의록들도 <a href="https://quickest-asterisk-75d.notion.site/1-e1916b7fb9b94e948381794c3b824036?pvs=23">Notion_FastCampus</a> &amp; <a href="https://www.notion.so/Document-Type-Classification-b01886bae17c4dd9b2d3244429f56fee?pvs=4">Notion_Plus</a>를 통해 확인할 수 있다.</p>
<p><strong>[Human Classification]</strong></p>
<p>데이터를 받고 모델 학습을 진행하기 전에 test data를 확인해보자 하는 의견이 나와 data의 형태를 파악하고자 하나하나 확인하던 과정 중에 &#39;직접 분류해보는 게 어떨까?&#39; 하는 생각이 들었다. 팀원 모두 비슷한 생각을 하고 있었고 우리는 우리가 직접 분류를 해보기로 하였다. 이 결과물을 제출하여 1등 해야겠다! 라는 마음보다는 human 분류를 하였을 때 정확도가 얼마나 나오는지 궁금했다. 그리고 직접 분류한 결과물을 활용하여 모델 학습 시킨 결과와 비교할 때도 유용하게 쓰일 것 같아 일단 분류를 직접하기 시작했다. </p>
<p><strong>[Model 학습]</strong></p>
<p>우리 팀은 다양한 모델을 활용하였다. CV에서 쓸 수 있는 모델은 다 써본 것 같다. 각 모델의 자세한 결과는 Notion 및 PPT에 자세히 기록해 뒀다.
<img src="https://velog.velcdn.com/images/d_yeon819/post/41fe689b-7281-44b9-b237-4292790d906f/image.png" alt=""></p>
<p>위의 모델을 사용하여 학습 된 결과를 Human Classification 한 결과와 비교하여 어떤 class에서 예측을 잘하고 못하는지 확인해보는 과정도 거쳤다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/a660c232-9513-4776-986d-d886c0daed4b/image.png" alt=""></p>
<h3 id="5-자체-평가-의견">5. 자체 평가 의견</h3>
<p><strong>A. 잘했던 점</strong></p>
<ul>
<li>다양한 방법으로 Augmentation을 진행하였다.</li>
<li>각자의 다양한 관점을 실시간으로 공유하여 함께 진행하는 프로젝트 분위기를 만들고자 하였다.</li>
</ul>
<p><strong>B. 시도 했으나 잘 되지 않았던 것들</strong></p>
<ul>
<li>강사님의 Feed back 을 통해 이 대회는 Augmentation이 중요한 대회임을 캐치하였다. 하지만 과도한 Augmentation으로 인해 서버가 터지는 이슈가 빈번하게 발생하였고, 모델 학습 시 1 epoch 을 돌리는데 2시간이 넘게 걸렸다. 결국 1500분을 투자하여 약 30 epoch 까지 학습을 시켰지만 결론적으로 서버가 터져 해당 모델을 사용할 수 없었다.</li>
</ul>
<p><strong>C. 아쉬웠던 점들</strong></p>
<ul>
<li>팀원 간의 수준 차이가 상당히 컸다. 나를 비롯한 3명의 사람들은 딥러닝 실전에 경험이 없는 사람이었으며, 나머지 2명은 딥러닝에 경험이 있는 사람들이었다. 그 분들과 대화를 하는 과정에서 의견 교류가 원활하게 되지 않았던 것 같다. <del>아마 그 분들이 엄청 답답했을 것 같다.</del></li>
</ul>
<p><strong>D. 프로젝트를 통해 배운 점 또는 시사점</strong></p>
<ul>
<li>이미지 분류를 어떻게 하는 건지에 대해 대략적으로 알 수 있게 되었다. </li>
<li>딥러닝 시스템이 어떻게 돌아가는 지에 대해 파악할 수 있던 시간이었다.</li>
</ul>
<h3 id="마무리">마무리</h3>
<p>딥러닝은 강의도 처음이고 대회도 처음이고 모든 것이 처음이었던 분야라 사실 우왕좌왕 많이 했던 것 같다. 팀원 중 두 분이 어느 정도 경험이 있어 어깨 너머로 단어 하나하나 접해가며 천천히 배워과는 과정을 겪었던 시간이었던 것 같다. 이제는 어느 분야를 중점적으로 더 파고 들어야 하고 더 공부해야 하는 지 알게 되어 앞으로 그 부분을 중점적으로 더 공부해보고자 한다. 의료 AI 에 관심이 많기에 Computer Vision에 대해 더 열심히 공부해야 할 것 같다는 생각을 하였다. </p>
<p>#패스트캠퍼스 #UpstageAILab #Upstage #부트캠프 #AI #데이터분석 #데이터사이언스 #인공지능개발자 #ML #머신러닝 #경진대회 #딥러닝 #Computer Vision</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[House Price Prediction | 아파트 실거래가 예측 Report]]></title>
            <link>https://velog.io/@d_yeon819/House-Price-Prediction-%EC%95%84%ED%8C%8C%ED%8A%B8-%EC%8B%A4%EA%B1%B0%EB%9E%98%EA%B0%80-%EC%98%88%EC%B8%A1-Report</link>
            <guid>https://velog.io/@d_yeon819/House-Price-Prediction-%EC%95%84%ED%8C%8C%ED%8A%B8-%EC%8B%A4%EA%B1%B0%EB%9E%98%EA%B0%80-%EC%98%88%EC%B8%A1-Report</guid>
            <pubDate>Tue, 30 Jan 2024 09:55:09 GMT</pubDate>
            <description><![CDATA[<pre><code>팀명 : 마이너스(Data Miners &amp; Minus Loss)</code></pre><p><del><em>벌써 몇 번째 프로젝트인지 모르겠다. 정신없이 달리다보니 여기까지 와 버렸다. 앞서 진행된 프로젝트 정리도 채 끝나지 않은 채 이번 Machine Learning 대회 개인 회고를 작성해보고자 한다.</em></del></p>
<h3 id="1-프로젝트-개요">1. 프로젝트 개요</h3>
<p><strong>A. 개요</strong></p>
<p>본 대회는 House Price Prediction 경진대회는 주어진 데이터를 활용하여 서울의 아파트 실거래가를 효과적으로 예측하는 모델을 개발하는 대회이다. </p>
<p>부동산은 의식주에서의 주로 중요한 요소 중 하나인데, 이런 부동산은 아파트 자체의 가치도 중요하고, 주변 요소(강, 공원, 백화점 등)에 의해서도 영향을 받아 시간에 따라 가격이 많이 변동하기도 한다. 개인의 입장에서는 더 싼 가격에 좋은 집을 찾고 싶고, 판매자의 입장에서는 적절한 가격에 집을 판매하기를 원한다. 부동산 실거래가의 예측은 이러한 시세를 예측하여 적정한 가격에 구매와 판매를 도와주게 한다. 정부의 입장에서는 비정상적으로 시세가 이상한 부분을 체크하여 이상 신호를 파악하거나 업거래, 다운거래 등 부정한 거래를 하는 사람들을 잡아낼 수도 있다. </p>
<h4 id="제공된-총-4가지의-데이터셋"><strong>제공된 총 4가지의 데이터셋</strong></h4>
<blockquote>
<ol>
<li>국토교통부에서 제공하는 <strong>아파트 실거래가 데이터</strong>(아파트 위치, 크기, 건축년도, 주변시설 및 교통 편의성 등)</li>
<li>서울시에서 제공하는 <strong>지하철역 데이터</strong></li>
<li>서울시에서 제공하는 <strong>버스정류장 데이터</strong></li>
<li><strong>평가 데이터</strong>(최종 모델 성능에 대한 검증을 위해 사용)<ul>
<li>input : 9,272개의 아파트 특징 및 거래정보</li>
<li>output : 9,272개의 input에 대한 예상 아파트 거래금액</li>
</ul>
</li>
</ol>
</blockquote>
<p>주어진 데이터는 다음과 같았으나 외부 데이터에 대한 제한 사항이 규칙에 없어 다양한 외부 데이터를 끌어다 대회에 응용시킬 수 있었다.</p>
<p><strong>B. 환경</strong></p>
<ul>
<li><p>팀 구성 및 컴퓨팅 환경</p>
<p>  5인 1팀, 인당 RTX 3090ti 서버를 VSCode와 SSH로 연결하여 사용</p>
</li>
<li><p>협업 환경</p>
<p>  Notion, GitHub</p>
</li>
<li><p>의사 소통</p>
<p>  KakaoTalk, Zoom, Slack, Discord</p>
</li>
</ul>
<h3 id="2-프로젝트-팀-구성-및-역할">2. 프로젝트 팀 구성 및 역할</h3>
<ul>
<li><p><strong>팀 구성</strong>
  프로젝트 팀원으로 배정된 인원은 5명 이었으나 한 분은 재직자 신분이어 개인 업무로 인해 프로젝트에 거의 참여하지 못하셨다. 결과적으로 4명이서 프로젝트를 진행하게 되었고 나눠지는 Task 또한 4명으로 나뉘어지게 되었다. </p>
</li>
<li><p><strong>역할</strong></p>
</li>
</ul>
<pre><code>Task 목록은 다음과 같다.
&gt; 데이터 확인 및 수집(Data Verification and Collection)
&gt; 데이터 전처리 및 EDA(Data Preprocessing and Exploratory Data Analysis)
&gt; 모델링 및 파라미터 튜닝(Modeling and Parameter Tuning)
&gt; 결과 정리 및 보고서 작성(Summarization of Results and Report Writing)


모두가 함께 모든 Task 에 참여하긴 했지만 각자 중점적으로 두고 진행했던 Task 는 각기 달랐다. 아래의 표에서 표시되어 보여지겠지만, 나는 데이터 확인 및 수집(Data Verification and Collection)과 모델링 및 파라미터 튜닝(Modeling and Parameter Tuning)에 비중을 크게 두고 프로젝트를 참여하였다. </code></pre><h3 id="3-프로젝트-수행-절차-및-방법">3. 프로젝트 수행 절차 및 방법</h3>
<p><strong>A. 팀 목표 설정</strong></p>
<blockquote>
<p><strong>1주차</strong> : 주어진 Upstage 강의 다 듣기, 사전에 주어진 참고 대회 자료 <a href="https://dacon.io/competitions/official/21265/overview/description">데이콘</a>, <a href="https://www.kaggle.com/competitions/house-prices-advanced-regression-techniques">캐글</a> 활용하여 코드 미리 파악하고 데이터 패턴 파악하기
<strong>2주차</strong> : 외부 데이터 수집하기, 기존 데이터 탐색 및 파악하기(EDA 및 전처리)
<strong>3주차</strong> : 모델링, 모델 튜닝, 최종 모델 완성, 앙상블 전략 사용</p>
</blockquote>
<p><strong>B. 프로젝트 사전 기획</strong></p>
<p>(1) Time-Line 수립
<img src="https://velog.velcdn.com/images/d_yeon819/post/da749300-45d0-4847-9eef-6625f068bed3/image.png" alt=""></p>
<p>(2) 협업 문화</p>
<blockquote>
<ol>
<li>특별한 일을 제외하고는 항상 모여서 의논하면서 Task 진행할 것(Zoom, Discord)</li>
<li>오프라인 모임이 가능할 경우 오프라인 만남을 적극 활용할 것(소통 Skill Up)</li>
<li>논의 사항 및 오류 사항이 있을 경우 즉각 팀원들과 상의할 것</li>
<li>New 아이디어 발생 시 Team Notion에 작성 후 팀원 호출하여 해당 아이디어에 대해 공유할 것</li>
<li>말하지 않아도 각자 중간 진행 상황에 대해 틈틈이 보고할 것</li>
</ol>
</blockquote>
<p>우리팀의 좋았던 점은 별 일 없으면 항상 온라인 소통 플랫폼에 항상 접속해 있는 것이었다. 문제가 생기면 언제든 소통이 가능했고 좋은 아이디어가 생겨도 실시간으로 바로바로 소통이 가능했다. 이 점이 팀 프로젝트 결과물을 뽑아내는 데 중요한 요소였던 것 같다. 다른 팀 보다 늘 다양한 과정과 관점, 다양한 결과물을 완성시켰던 것 같다. EDA 프로젝트부터 Machine Learning 프로젝트, Machine Learning 대회까지 동일한 팀원들과 프로젝트를 진행 중인데 변하지 않고 이런 협업 분위기가 지속되고 있어 개인적으로 너무 만족스럽다. <del>프로젝트를 진행할 수록 여러 Fast Campus 매니저님들과 여러 강사님들께 인정 받고 있어 뿌듯하기도 하다.</del> 이번 프로젝트에서는 &#39;EDA 장인들&#39; 이라는 극찬까지 받기도 했다. </p>
<h3 id="4-프로젝트-수행-결과">4. 프로젝트 수행 결과</h3>
<p>Public 4등(RMSE : 18590.4353), Private 3등(RMSE : 14283.4856)
<img src="https://velog.velcdn.com/images/d_yeon819/post/968e95b8-48a7-4639-b317-63e689975e5e/image.png" alt=""></p>
<p>우리 팀은 Strategy I, Strategy II 2가지의 전략을 이용하였다. 자세한 Code 및 PPT 자료는 <a href="https://github.com/UpstageAILab/upstage-ml-regression-01/tree/main">Github</a> 에서 확인할 수 있다. 프로젝트를 진행하며 작성했던 회의록들도 <a href="https://www.notion.so/House-Price-Prediction-3d53a652e0ab494992aa3d4f0af9d75b?pvs=4">Notion</a> 을 통해 확인할 수 있다.</p>
<p><strong>[Strategy I]</strong></p>
<blockquote>
<p><strong>활용 데이터(외부 데이터)</strong></p>
</blockquote>
<ul>
<li>금리(한국 은행)</li>
<li>GDP(한국 은행)</li>
<li>대통령 득표율</li>
<li>아파트 정보 크롤링(네이버 페이 부동산)</li>
<li>역세권(버스, 지하철)</li>
<li>한강 대교 거리(하버 사인)</li>
<li>학군(서울시 학군 정보)</li>
<li>전세가율(KB 부동산)</li>
</ul>
<blockquote>
<p><strong>사용 모델</strong>
<img src="https://velog.velcdn.com/images/d_yeon819/post/8d879024-79f3-42c6-b123-8d09ba4bdbe8/image.jpg" alt=""></p>
</blockquote>
<p><strong>[Strategy II]</strong></p>
<blockquote>
<p><strong>활용 데이터(외부 데이터)</strong></p>
</blockquote>
<ul>
<li>금리(한국 은행)</li>
</ul>
<blockquote>
<p><strong>사용 모델</strong>
<img src="https://velog.velcdn.com/images/d_yeon819/post/a39adb90-ee82-464a-a4aa-09269ed49e0d/image.jpg" alt=""></p>
</blockquote>
<p>Strategy I은 다양한 외부 데이터를 활용하여 아파트 집 값과 관련이 높은 Feature 들을 생성하여 각각의 Model(CatBoost, XGBoost, LightGBM)을 돌려 Ensemble 하는 전략이었고, Strategy II는 외부 데이터를 다양하게 활용하기보다는 기존의 데이터를 활용하여 새로운 Feature 를 만들어내는 Feature Engineering 에 Focus 를 맞춘 전략이었다. </p>
<p>여기서 Strategy II 부분이 내가 집중적으로 파고 들었던 전략이다. 우선 Categorical 한 아파트명 변수를 Numerical 하게 변경하여 각각의 아파트에 키 값을 부여하였고, 아파트 거래 값이 최근 거래에 영향을 많이 받을 것이라 생각하여 아파트 최근 거래 가격(recent_price), 아파트 최근 거래량(transaction_cnt) 의 feature 를 생성하였다. 그 후 금리 데이터를 추가하여 Modeling(Random Forest, XGBoost, LightGBM)을 하여 Ensemble 하였다. </p>
<p>본 대회의 리더보드에 오류가 있어 오류 발생 전에는 Strategy II 전략이 상대적으로 높은 것으로 나타났으나, 오류 수정 후 Strategy I 의 결과가 더 좋게 나오게 되었다. 리더보드에 오류가 없었다면 Score를 눈으로 확인하며 모델의 성능을 더 좋은 방향으로 변경시키며 수정할 수 있었겠지만 치명적인 오류로 인하여 그러지 못했던 것이 아쉬웠던 부분이었다.</p>
<p>결과적으로 <del>개고생 하며</del> 열심히 수집하고 만들었던 많은 외부 데이터들을 활용한 Strategy I 의 성능이 좋게 평가되어 다행이라고 생각한다. <del>역시 노력은 배신하지 않아ㅋ</del></p>
<h3 id="5-자체-평가-의견">5. 자체 평가 의견</h3>
<p><strong>A. 잘했던 점</strong></p>
<ul>
<li>무작정 Modeling 에 뛰어들지 않고 데이터 확인, 수집에 시간을 많이 투자하여 여러가지 Data를 활용하고자 하였다.</li>
<li>EDA 에 많은 시간을 투자하여 Data를 완벽하게 파악하고자 하였다.</li>
<li>Auto ML을 사용하지 않고 직접 Modeling 을 하여 각 Model 의 장단점을 파악하려고 하였다.</li>
<li>각자의 다양한 관점을 실시간으로 공유하여 함께 진행하는 프로젝트 분위기를 만들고자 하였다.</li>
</ul>
<p><strong>B. 시도 했으나 잘 되지 않았던 것들</strong></p>
<ul>
<li>Data 크롤링에 많은 시간을 투자하였으나 시간이 부족하여 크롤링한 Data를 활용하여 Modeling 을 다양하게 해보지 못하였다.</li>
<li>각자의 Task 가 너무 많아 각자 좋은 관점으로 만들어진 Feature 들을 합쳐서 Modeling 해보지 못하였다. </li>
<li>수집해 온 외부 Data들을 적합하게(Model의 성능에 도움이 되도록) 적용시킬 방법에 대해 구상하지 못했던 것 같다.</li>
</ul>
<p><strong>C. 아쉬웠던 점들</strong></p>
<ul>
<li>대회 주최 측의 오류가 너무나도 많았다. 서버가 끊기는 경우도 많았고, 제일 큰 오류는 리더보드 오류. 대회를 진행하면서도 의문을 품은 사람들이 많았으나 빠르게 개선되지 않았던 점이 아쉬웠다. <del>더 좋은 결과를 낼 수 있었는데...ㅠ</del></li>
</ul>
<p><strong>D. 프로젝트를 통해 배운 점 또는 시사점</strong></p>
<ul>
<li>Auto ML 을 사용하지 않고 Modeling 을 할 수 있게 되었다.</li>
<li>EDA 실력이 한층 더 향상 되었다.</li>
<li>협업 스킬이 더 향상 되었다.</li>
<li>프로젝트 진행에 있어 시간 배분을 잘하는 것이 중요하다는 것을 깨닫게 되었다.</li>
</ul>
<h3 id="마무리">마무리</h3>
<p>정말 좋은 팀을 만났다. 현재까지 고등학교, 대학교, 대학원 때 했던 모든 조별 과제 및 프로젝트를 통틀어 가장 열정적인 팀을 만난 것 같다. 한 명도 빠짐없이 모두가 다 한 마음, 한 뜻인 경우는 이번 팀이 처음이었다. <del>(보통 조에서 한 두명은 무임승차하는 경우가 대부분이었는데... 나 혼자 밤 새가며 발표 자료 만들었던 때가 생각난다..)</del> 또 신기한 건 내가 부족한 부분은 다른 팀원이 강점으로 가지고 있는 부분이고, 다른 팀원이 부족한 부분은 내가 강점으로 가지고 있는 부분이라는 것이다. 서로서로 그런 부분들을 채워줄 수 있는 팀원들인 것이 우리 팀의 최대 강점이다. EDA 프로젝트 때 부터 만나 지금까지 프로젝트를 진행하며 모두가 빠르게 성장하고 있는 모습이 보여 이 시간이 정말 값지고 의미있는 시간이라 생각한다. 이제 ML 은 완전히 끝났고! DL 프로젝트, 대회 열심히 참여해야겠다!! 우리 팀 끝까지 화이팅 하자! </p>
<p>#패스트캠퍼스 #UpstageAILab #Upstage #부트캠프 #AI #데이터분석 #데이터사이언스 #인공지능개발자 #ML #머신러닝 #경진대회</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Upstage] AI 기초 학습 : 딥러닝 | Part 1. Deep Learning]]></title>
            <link>https://velog.io/@d_yeon819/Upstage-AI-%EA%B8%B0%EC%B4%88-%ED%95%99%EC%8A%B5-%EB%94%A5%EB%9F%AC%EB%8B%9D-Part-1.-Deep-Learning</link>
            <guid>https://velog.io/@d_yeon819/Upstage-AI-%EA%B8%B0%EC%B4%88-%ED%95%99%EC%8A%B5-%EB%94%A5%EB%9F%AC%EB%8B%9D-Part-1.-Deep-Learning</guid>
            <pubDate>Tue, 02 Jan 2024 02:22:00 GMT</pubDate>
            <description><![CDATA[<h2 id="deep-learning-basic">[Deep Learning Basic]</h2>
<h3 id="chapter-1-1--1-2-딥러닝의-발전-5단계-1--1단계--5단계">Chapter 1-1 &amp; 1-2. 딥러닝의 발전 5단계 1 : 1단계 ~ 5단계</h3>
<p><strong>딥러닝의 발전 5단계 | DL Development in 5 Steps</strong></p>
<ul>
<li><p>AI/ML/DL 관점에서 크게 5단계로 개발 방법론이 진화(세 단계로 SW 1.0, SW 2.0, SW 3.0 으로도 나뉨)</p>
<p>  <code>[단계 별 특징]</code></p>
<ol>
<li>Rule based programming(SW 1.0 방식)<ol>
<li>목표 달성에 필요한 연산 방법을 사람이 전부 고안</li>
</ol>
</li>
<li>Conventional machine learning(SW 1.5 방식)<ol>
<li>특징 값을 뽑는 방식은 사람이, 특징 값을 판별하는 로직은 기계가 고안</li>
</ol>
</li>
<li>Deep Learning(SW 2.0 방식)<ol>
<li>모든 연산들을 기계가 고안</li>
</ol>
</li>
<li>Pre-training &amp;Fine-tuning<ol>
<li>전체 특징을 구별하는 모델을 고정 시켜둔 후(Pre-training) mapping 부분만 해당 Task에 대한 Data로 미세 조정(Fine-tuning)하는 방식</li>
</ol>
</li>
<li>Big Model &amp; zero/few shot<ol>
<li>in-context learning</li>
<li>입력된 문장을 보고 기계가 스스로 해야 할 Task를 찾아서 진행</li>
</ol>
</li>
</ol>
</li>
</ul>
<h3 id="chapter-1-3--1-4-딥러닝-기술-종류들--학습-방식-데이터-형식-태스크-종류에-의한-구분">Chapter 1-3 &amp; 1-4. 딥러닝 기술 종류들 : 학습 방식, 데이터 형식, 태스크 종류에 의한 구분</h3>
<p><strong>AI 구분법</strong></p>
<ul>
<li>데이터 Data<ul>
<li>정형 데이터 / 이미지, 동영상 / 텍스트 / 음성</li>
</ul>
</li>
<li>학습 Learning<ul>
<li>Supervised Learning / Un-Supervised Learning / Reinforcement Learning</li>
</ul>
</li>
<li>태스크 Task<ul>
<li>인식 / 생성</li>
</ul>
</li>
</ul>
<p>AI = 모델 = 연산의 집합 = 프로그램</p>
<ul>
<li>컴퓨터는 숫자만 이해하므로, 입/출력 모두 숫자</li>
</ul>
<p>학습 방식에 의한 구분</p>
<p><code>교사 학습(Supervised Learning)</code></p>
<ul>
<li>정답이 필요함</li>
<li>라벨링 데이터</li>
<li>직접 피드백</li>
<li>교사 학습으로 학습된 모델은 분류(Classification) 태스크 혹은 회귀(Regression) 태스크를 수행<ul>
<li><code>분류(Classification)</code> : 분류는 기정의된 클래스들 중 입력이 어느 클래스에 해당하는지 맞추는 태스크</li>
<li><code>회귀(Regression)</code>: 회귀는 입력 데이터에 대한 실수 혹은 실수의 집합을 (벡터) 출력으로 맵핑 해주는 (Mapping) 태스크</li>
</ul>
</li>
<li>라벨링 노이즈(Labeling Noise)<ul>
<li>라벨링 결과에 대한 노이즈 = 라벨링 작업에 대해 일관되지 않음의 정도</li>
</ul>
</li>
</ul>
<p><code>비교사 학습(Un-Supervised Learning)</code></p>
<ul>
<li><p>정답이 없음</p>
</li>
<li><p>라벨링 데이터 X</p>
</li>
<li><p>피드백 X</p>
</li>
<li><p>숨은 구조 찾기</p>
</li>
<li><p>비교사 학습으로 학습된 모델은 차원 축소(Dimension Reduction) 혹은 클러스터링 (Clustering) 태스크를 수행</p>
<ul>
<li><p>클러스터링(Clustering)</p>
<ol>
<li>임의의 두 점을 정하고 클래스 부여(클래스의 중심점)</li>
<li>나머지 점들은 가장 가까운 쪽의 클래스 중심점의 클래스 부여</li>
<li>클래스별 중심점 재 계산 후 2번 과정 반복</li>
</ol>
</li>
<li><p>차원 축소(Dimension Reduction)</p>
<ul>
<li><p>N차원 입력을 N&gt;n 차원 출력으로 변경하는 태스크</p>
</li>
<li><p>차원 축소를 하는 이유</p>
<p>  1) 정보 압축: 이미지/비디오/오디오 압축</p>
<p>  2) 정보 시각화: 사람이 눈으로 확인할 수 있는 것은 3차원 까지</p>
<p>  3) 정보 특징: 중요한 특징을 추출하여 분석에 사용</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><code>강화 학습(Re-Inforcement Learning)</code></p>
<ul>
<li>라벨링 데이터 X</li>
<li>지연 피드백</li>
<li>보상 신호(정답과 유사한)</li>
<li>강화학습의 4가지 구성요소 : 에이전트(Agent), 보상(Reward), 행동(Action), 환경(Environment)<ul>
<li>예시<ol>
<li>자전거 배우는 예제<ol>
<li>Agent: 어린 아이</li>
<li>Action: 핸들/브레이크/페달 조정</li>
<li>Environment: 학교 운동장</li>
<li>Reward: 자전거 넘어지지 않고 이동하는 시간</li>
<li>State: 시각/청각/촉각</li>
</ol>
</li>
<li>아타리 비디오 게임 예제<ol>
<li>Agent: 게이머</li>
<li>Action: Up/Down</li>
<li>Environment: 아타리 게임 시스템</li>
<li>Reward: 게임 점수</li>
<li>State: 게임 화면</li>
</ol>
</li>
</ol>
</li>
</ul>
</li>
<li>Model-Free 강화학습에서는 정책/가치 함수에 해당하는 두 가지 AI가 필요</li>
</ul>
<p>학습 방식에 의한 구분</p>
<p><code>정형 데이터(Tabular Data)</code></p>
<ul>
<li>구조화된 정보롤 저장되어 있는 것</li>
<li>딥러닝을 통해서 비정형 데이터를 구조화된 정보로 바꿀 수 있음</li>
</ul>
<p><code>컴퓨터 비전(Computer Vision)</code></p>
<ul>
<li>입력으로 이미지나 동영상 데이터를 받는 AI</li>
</ul>
<p><code>자연어 처리(Natural Language Processing)</code></p>
<ul>
<li>입력으로 텍스트 데이터를 받는 AI</li>
<li>LLM(Large Language Model)</li>
</ul>
<p><code>음성 인식/생성 (Speech Recognition/Generation)</code></p>
<ul>
<li>입/출력으로 음성 데이터가 활용되는 AI<ul>
<li>음성 인식(Speech Recognition) : 입력 = 음성</li>
<li>음성 생성(Speech Generation) : 출력 = 음성</li>
</ul>
</li>
</ul>
<p>태스크 종류에 의한 구분</p>
<p><code>인식 및 생성(Recognition &amp; Generation)</code></p>
<ul>
<li>비정형 데이터와 정보의 입출력 관계에 따라 인식 혹은 생성으로 구분됨<ul>
<li>인식(Recognition) : 비정형 데이터 입력에 정보가 출력</li>
<li>생성(Generation) : 출력이 비정형 데이터인 경우</li>
</ul>
</li>
<li>인식 기술이 어려울까 생성 기술이 어려울까?<ul>
<li>“What I cannot create, I do not understand.” - Richard Feynman</li>
</ul>
</li>
</ul>
<p><code>생성 모델의 역사(History of Generative Models)</code></p>
<ul>
<li>이미지 생성<ul>
<li>2014년의 GAN(Generative Adversarial Network)</li>
<li>2021년도에 공개한 DALL-E<ul>
<li>입력을 텍스트로 받아서 통제력 문제를 해결</li>
</ul>
</li>
<li>2023년도에 Stability AI의 Stable Diffusion이 상업적으로 이용 가능하게 됨</li>
</ul>
</li>
<li>텍스트 생성<ul>
<li>2023년도의 OpenAI가 내놓은 ChatGPT</li>
</ul>
</li>
</ul>
<hr>
<p>[참고 자료]
<a href="https://kdt.fastcampus.co.kr/classroom/234515">https://kdt.fastcampus.co.kr/classroom/234515</a></p>
<p>#패스트캠퍼스 #UpstageAILab #Upstage #부트캠프 #AI #데이터사이언스 #무료교육 #국비지원</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[딥러닝 기초 | CHAPTER 1. 딥러닝 개론]]></title>
            <link>https://velog.io/@d_yeon819/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EA%B8%B0%EC%B4%88-CHAPTER-1.-%EB%94%A5%EB%9F%AC%EB%8B%9D-%EA%B0%9C%EB%A1%A0-ho5wsv34</link>
            <guid>https://velog.io/@d_yeon819/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EA%B8%B0%EC%B4%88-CHAPTER-1.-%EB%94%A5%EB%9F%AC%EB%8B%9D-%EA%B0%9C%EB%A1%A0-ho5wsv34</guid>
            <pubDate>Mon, 04 Dec 2023 11:25:43 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="신경망neural-networks">신경망(neural networks)</h3>
</blockquote>
<ul>
<li>인간의 뇌를 모방하여 만든 알고리즘으로, 데이터를 처리하고 패턴을 학습하는 데 사용</li>
<li>여러 층(layer)과 노드(node)로 구성되어 있으며, 각 노드는 입력 데이터를 가중치와 결합하여 출력을 생성함
<img src="https://velog.velcdn.com/images/d_yeon819/post/3e981c0c-b87b-4bef-9b6c-f5696837e0b0/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/a5694854-5e02-4b82-a70e-f1871b83dfcb/image.png" alt=""></p>
<ul>
<li>선형 회귀구조를 이용해서 하나의 특성을 만들어냄</li>
<li>몇 개의 특성을 만들어내는 지는 설정하기 나름</li>
<li>더 많은 노드, 레이어 얼마든지 생성 가능 -&gt; 레이어가 깊어지면 &quot;딥러닝&quot;</li>
</ul>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/e552a598-4bfe-4b54-a535-906e384151af/image.png" alt=""></p>
<ul>
<li>신경망을 깊이 쌓으면 쌓을 수록 어떤 데이터에 대한 정보는 많이 학습됨 -&gt; 많은 특성을 추출 가능 =&gt; &quot;정확한 예측&quot;</li>
<li>주의점: 지나치게 복잡한 모델 사용으로 성능을 끌어올리는 경우 -&gt; &quot;과적합 문제&quot; 발생</li>
<li>수많은 선형 변환이 여러 개로 이어져있더라도 결국 한 번에 가는 선형 변환이 존재함 =&gt; 따라서 &quot;비선형 변환이 필요함&quot;</li>
</ul>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/6bbde030-6387-46b9-aca3-e81fcebdbe9a/image.png" alt=""></p>
<h3 id="선형변환-linear-transformation">선형변환 (Linear Transformation)</h3>
<ul>
<li>선형변환은 입력 데이터에 가중치를 곱하고 편향을 더하는 과정</li>
<li>수학적으로는 y = Wx + b 형태로 표현<ul>
<li>여기서 W는 가중치(weight), x는 입력(input), b는 편향(bias)입니다.</li>
</ul>
</li>
<li>선형 변환은 데이터의 크기만 조정하거나 회전시키는 등의 단순한 변환을 수행</li>
</ul>
<h4 id="중요성">[중요성]</h4>
<ul>
<li>선형 변환은 데이터를 다루는 가장 기본적인 방법<ul>
<li>하지만 혼자서는 복잡한 데이터의 패턴이나 특성을 충분히 표현하지 못함</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/75f82722-3898-4736-b48b-0df1d0b6c209/image.png" alt=""></p>
<h3 id="비선형변환-non-linear-transformation">비선형변환 (Non-linear Transformation)</h3>
<p>[Sigmoid 함수]</p>
<ul>
<li>Sigmoid 함수는 대표적인 비선형 활성화 함수</li>
<li>함수 형태는 σ(x) = 1 / (1 + e^(-x))로 표현</li>
<li>이 함수는 입력값을 0과 1 사이의 값으로 변환함, 이는 확률과 같은 형태로 해석될 수 있음</li>
</ul>
<h4 id="중요성-1">[중요성]</h4>
<ul>
<li>비선형 변환은 딥러닝 모델이 복잡한 데이터의 특성을 학습할 수 있게 해줌</li>
<li>Sigmoid 함수와 같은 활성화 함수는 선형 변환된 데이터에 적용되어 모델에 비선형성을 부여함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/60862be1-7892-4e0d-9acf-c57e22c29759/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/be0dfada-5d99-42d3-81d8-0fd8556e59df/image.png" alt=""></p>
<h3 id="활성화-함수-activation-functions">활성화 함수 (Activation Functions)</h3>
<ul>
<li>딥러닝 모델에서 활성화 함수는 매우 중요한 역할을 함</li>
<li>이 함수들은 인공신경망에서 입력 데이터를 받아 처리한 뒤, 출력을 결정하는 데 사용 </li>
<li>주로 Sigmoid와 ReLU 함수가 널리 사용</li>
</ul>
<h4 id="1-sigmoid-활성화-함수">1. Sigmoid 활성화 함수</h4>
<ul>
<li>Sigmoid 함수는 σ(x) = 1 / (1 + e^(-x))로 정의</li>
<li>이 함수는 모든 입력값을 0과 1 사이의 값으로 변환</li>
</ul>
<h4 id="특징">[특징]</h4>
<ul>
<li>출력이 0과 1 사이로 제한되기 때문에, 이진 분류 문제에서 유용</li>
<li>Sigmoid는 곡선의 형태를 띄기 때문에, 입력값에 따른 출력의 변화가 부드러움</li>
</ul>
<h4 id="단점">[단점]</h4>
<ul>
<li>그라디언트 소실(Vanishing Gradient) 문제가 발생할 수 있음 <ul>
<li>신경망이 깊어질수록 학습이 어려워진다는 것을 의미</li>
</ul>
</li>
<li>출력이 0에 가까울 때와 1에 가까울 때 Gradient가 매우 작아져, 학습 속도가 느려질 수 있음</li>
</ul>
<h4 id="2-relu-rectified-linear-unit-활성화-함수">2. ReLU (Rectified Linear Unit) 활성화 함수</h4>
<ul>
<li>ReLU 함수는 f(x) = max(0, x)로 정의</li>
<li>입력이 0 이상이면 그 입력을 그대로 출력하고, 0 미만이면 0을 출력</li>
</ul>
<h4 id="특징-1">[특징]</h4>
<ul>
<li>ReLU는 간단하고 계산 효율성이 뛰어나 대규모 신경망에서 널리 사용</li>
<li>그라디언트 소실 문제를 상당 부분 해결해주어 깊은 네트워크에서도 효과적으로 학습할 수 있음</li>
</ul>
<h4 id="단점-1">[단점]</h4>
<ul>
<li>&#39;죽은 ReLU&#39; 문제<ul>
<li>즉, 네트워크의 일부 뉴런이 0 이하의 값만 받게 되면, 항상 0만 출력하게 되어 해당 뉴런이 더 이상 학습에 기여하지 못하는 문제가 발생</li>
</ul>
</li>
</ul>
<p>일반적으로, Sigmoid는 출력층에서 이진 분류 문제에 자주 사용, ReLU는 은닉층에서 널리 사용</p>
<blockquote>
<h3 id="가중치-행렬weight-matrix">가중치 행렬(weight matrix)</h3>
</blockquote>
<ul>
<li>신경망에서 입력과 출력 사이의 관계를 결정하는 매개변수. </li>
<li>각 노드의 입력값에 곱해지는 가중치들의 집합으로, 학습 과정에서 최적화됨.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/52522482-b841-41c1-99c9-53d82e868736/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/24b62d83-3ad9-406c-bf0c-890dcd8dff68/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/48bea1a9-b19f-4c22-982a-ce68067039ce/image.png" alt=""></p>
<blockquote>
<h4 id="경사-하강법gradient-descent">경사 하강법(gradient descent)</h4>
</blockquote>
<ul>
<li>최적화 알고리즘의 일종으로, 손실 함수(loss function)의 최소값을 찾기 위해 가중치를 조정함</li>
<li>손실 함수의 기울기(gradient)를 계산하여 오차를 줄이는 방향으로 가중치를 업데이트함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/e43806cb-f0de-4ad1-a194-9fc0429cc265/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/ac78f141-6f26-4b5f-9958-c3e91b15ebba/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/c8dc104a-100d-4c6a-8d99-58ec3c0586b7/image.png" alt=""></p>
<h3 id="학습률learning-rate">학습률(Learning Rate)</h3>
<ul>
<li>딥러닝에서 매우 중요한 hyperparameter</li>
<li>이는 모델이 데이터로부터 학습하는 속도와 방식을 결정짓는 역할을 함</li>
</ul>
<h4 id="학습률learning-rate이란">학습률(Learning Rate)이란?</h4>
<ul>
<li>학습률은 모델이 학습하는 동안 가중치(weight)를 얼마나 조정할지를 결정하는 값</li>
<li>가중치의 업데이트는 &quot;가중치 = 가중치 - 학습률 * 손실 함수의 기울기&quot;로 계산</li>
<li>즉, 학습률이 크면 가중치 조정이 크고, 학습률이 작으면 가중치 조정이 작음</li>
</ul>
<blockquote>
<h4 id="optimizer의-종류">Optimizer의 종류</h4>
</blockquote>
<p>경사 하강법을 개선한 다양한 알고리즘들이 있습니다. 대표적인 예로는 SGD(Stochastic Gradient Descent), Adam, RMSprop 등이 있으며, 각각의 알고리즘은 특정 상황에서 더 효과적일 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/c4823e60-28ab-4efd-ad8d-67dd4b75c412/image.png" alt=""></p>
<h4 id="sgdstochastic-gradient-descent">SGD(Stochastic Gradient Descent)</h4>
<ul>
<li>작동 방식: 각 단계에서 무작위로 선택된 하나의 데이터 샘플에 대해 Gradient(기울기)를 계산하고, 이를 사용해 모델의 가중치를 업데이트함</li>
<li>장점: 메모리 효율적이며, 대규모 데이터셋에서도 잘 작동함</li>
<li>단점: 수렴 속도가 비교적 느리고, 최적점에 도달하기까지 불안정할 수 있음</li>
</ul>
<h5 id="batch-gdbatch-gradient-descent">Batch GD(Batch Gradient Descent)</h5>
<ul>
<li>작동 방식: 전체 데이터셋을 사용하여 한 번에 그라디언트를 계산함</li>
<li>장점: 안정적인 그라디언트 추정과 수렴을 제공함</li>
<li>단점: 매우 큰 데이터셋에 대해서는 계산 비용이 많이 들고, 메모리 요구량이 높음</li>
</ul>
<h5 id="mini-batch-gd--single-sample-gd">Mini-batch GD / Single sample GD</h5>
<ul>
<li>작동 방식: 데이터셋을 작은 배치로 나누고, 각 배치에 대해 Graident를 계산</li>
<li>장점: SGD와 Batch GD의 장점을 결합하여 더 빠른 수렴과 효율적인 메모리 사용을 가능하게 함</li>
<li>단점: 배치 크기 선택이 중요하며, 잘못된 크기는 성능에 영향을 미칠 수 있음</li>
</ul>
<h4 id="momentum">Momentum</h4>
<ul>
<li>작동 방식: 이전 Gradient의 방향을 고려하여 현재 업데이트에 &#39;관성&#39;을 추가함</li>
<li>장점: 지역 최소값에서 벗어나기 쉽고, 수렴 속도가 빨라짐</li>
<li>단점: 관성 때문에 최적점을 지나칠 수 있으며, 파라미터 조정이 필요함</li>
</ul>
<h4 id="adagrad">AdaGrad</h4>
<ul>
<li>작동 방식: 각 매개변수에 대해 개별적인 학습률을 적용</li>
<li>장점: 간단한 문제에서 잘 작동하며, 희소한 데이터에서 유용</li>
<li>단점: 학습률이 지속적으로 감소하여 장기적으로는 학습이 멈출 수 있음</li>
</ul>
<h5 id="rmsprop">RMSprop</h5>
<ul>
<li>작동 방식: AdaGrad의 단점을 개선하기 위해 과거 모든 Gradient를 똑같이 고려하지 않고, 최근 Gradient에 더 큰 가중치를 둠</li>
<li>장점: 비교적 새로운 데이터에 잘 반응하며, 다양한 종류의 문제에 잘 작동</li>
<li>단점: 여전히 하이퍼파라미터의 조정이 필요함</li>
</ul>
<h4 id="adamadaptive-moment-estimation">Adam(Adaptive Moment Estimation)</h4>
<ul>
<li>작동 방식: Momentum과 RMSprop의 아이디어를 결합하여, 모멘텀과 스케일링된 Gradient 모두를 고려함</li>
<li>장점: 다양한 조건에서 잘 작동하며, 특히 높은 차원의 데이터셋이나 매개변수가 많은 모델에서 효과적임</li>
<li>단점: 상대적으로 많은 메모리를 사용하며, 하이퍼파라미터 조정이 중요함</li>
</ul>
<blockquote>
<h4 id="역전파backpropagation">역전파(backpropagation)</h4>
</blockquote>
<ul>
<li>신경망에서 출력 오차를 입력 층으로 전파하여 가중치를 조정하는 방법</li>
<li>출력층에서 발생한 오차를 역방향으로 전파하며, 각 노드의 가중치를 최적화함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/22bd49ef-3be6-4805-815f-e65f05e6b1d1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/5c01c566-9d7e-4d88-bc27-c246181b8e63/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/946ec11e-2230-4e68-91d2-6fad6570868f/image.png" alt=""></p>
<p>[정의]</p>
<ul>
<li>역전파는 딥러닝 모델을 훈련시키는 기본적인 알고리즘으로, 오차를 출력층에서 입력층으로 거슬러 올라가며 전파하는 방식</li>
<li>이 과정에서 각 층의 가중치는 오차에 기여하는 정도에 따라 조정됨</li>
</ul>
<p>[작동 원리]</p>
<ol>
<li>먼저, 신경망은 입력 데이터에 대한 예측을 수행</li>
<li>예측값과 실제값 사이의 오차를 계산</li>
<li>이 오차를 기반으로, 출력층에서 시작하여 각 층의 가중치를 손실 함수의 그라디언트(기울기)에 따라 조정</li>
</ol>
<ul>
<li>이 과정은 신경망이 오차를 최소화하는 방향으로 학습하도록 함</li>
</ul>
<blockquote>
<p>소프트맥스(softmax) </p>
</blockquote>
<ul>
<li>다중 클래스 분류 문제에서 출력 레이어에 주로 사용되는 함수</li>
<li>소프트맥스 함수는 각 클래스에 대한 예측 확률을 계산하여, 가장 높은 확률을 가진 클래스를 모델의 예측으로 선택함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/3ec45164-4438-4953-ba54-00d900f338bd/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/35429f6c-9735-4887-b1d4-abac7129e943/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/8acf26ff-27da-4173-a511-c5c9587e58c4/image.png" alt=""></p>
<p>[작동 원리]</p>
<ol>
<li>각 클래스에 대한 신경망의 출력(일반적으로 로짓이라고 함)을 받아, 이를 정규화하여 각 클래스에 속할 확률로 변환함</li>
<li>결과적으로, 모든 클래스에 대한 확률의 합이 1이 되도록 함</li>
</ol>
<blockquote>
<p>크로스 엔트로피(cross-entropy) </p>
</blockquote>
<ul>
<li>분류 문제에서 손실 함수로 널리 사용됨</li>
<li>모델의 예측 확률 분포와 실제 레이블의 분포 사이의 차이를 측정함</li>
<li>낮은 크로스 엔트로피 값은 모델의 예측이 정확함을 의미함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/8f89314f-69be-44a3-b037-e375584e0ae9/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/2d108dcb-8f2a-4d47-bf1d-ed469590704b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/375a0f72-f290-4516-9d82-86710792d50f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d_yeon819/post/d5e0ec25-a3ed-48ab-9c9a-0c70bbaf397e/image.png" alt=""></p>
<blockquote>
<p>역전파 / 소프트맥스 함수 / 크로스 엔트로피 정리</p>
</blockquote>
<ul>
<li>역전파는 신경망이 오차를 줄이는 방향으로 학습하도록 도와줌</li>
<li>소프트맥스 함수는 다중 클래스 분류에서 모델의 출력을 확률로 변환함</li>
<li>크로스 엔트로피 손실은 모델의 예측이 얼마나 실제 레이블과 일치하는지를 측정함</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>