<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bellla.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 02 Jan 2025 05:42:03 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. bellla.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/u_sol" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[설명 가능한 추천을 구현하려면]]></title>
            <link>https://velog.io/@u_sol/%EC%84%A4%EB%AA%85%EA%B0%80%EB%8A%A5%ED%95%9C%EC%B6%94%EC%B2%9C%EC%9D%84%EA%B5%AC%ED%98%84%ED%95%98%EB%A0%A4%EB%A9%B4</link>
            <guid>https://velog.io/@u_sol/%EC%84%A4%EB%AA%85%EA%B0%80%EB%8A%A5%ED%95%9C%EC%B6%94%EC%B2%9C%EC%9D%84%EA%B5%AC%ED%98%84%ED%95%98%EB%A0%A4%EB%A9%B4</guid>
            <pubDate>Thu, 02 Jan 2025 05:42:03 GMT</pubDate>
            <description><![CDATA[<h2 id="먼저-설명-가능한-추천이란-무엇일까"><strong>먼저, 설명 가능한 추천이란 무엇일까?</strong></h2>
<ul>
<li>추천 시스템이 특정 항목을 추천할 때, <strong>추천 이유</strong>를 함께 제공하는 방식</li>
<li>예를 들자면 &quot;이 작품은 당신이 자주 본 장르와 관련이 있어 추천합니다.&quot; 이런 식이다
<br><br><br></li>
</ul>
<hr>
<h2 id="추천-이유를-왜-제공해야할까"><strong>추천 이유를 왜 제공해야할까?</strong></h2>
<p>이건 추천 서비스를 제공하는 사람(개발자)과 이용하는 사람(유저), 2개의 관점으로 나눠 살펴볼 수 있는데: </p>
<ul>
<li><strong>서비스 공급자 관점</strong>: <ul>
<li>&quot;디버깅&quot;을 위해 필요하다 </li>
<li>즉, 추천 시스템이 왜 특정 결과를 제공했는지 이해해야 문제를 개선할 수 있는 것 </li>
</ul>
</li>
<li><strong>사용자 관점</strong>:<ul>
<li>추천 결과에 만족하지 않으면 서비스 사용을 그냥 중단해버릴 가능성이 높은데,</li>
<li>같은 추천을 제공해도 추천 이유를 함께 제공하면 신뢰와 만족도를 높일 수 있아 잔여할 확률이 높아진다고 한다
<br><br><br></li>
</ul>
</li>
</ul>
<hr>
<h2 id="그렇다면-추천-이유는-어떻게-만들-수-있는가post-hoc"><strong>그렇다면 추천 이유는 어떻게 만들 수 있는가?(Post-Hoc)</strong></h2>
<br>

<h3 id="추천-이유를-만드는-방법은-크게-2가지">추천 이유를 만드는 방법은 크게 2가지</h3>
<ol>
<li><del>알고리즘 자체가 설명 가능한 모델 사용</del> ⇒ 고차원 모델을 사용하는 이상 불가능이다</li>
<li><em><strong>Post-Hoc: 추천 결과에 추천 이유 생성</strong></em> (블랙 박스 모델에도 적용 가능) ⇒ ✔️
<br><br><h3 id="post-hoc-어떻게-구현할까">Post-Hoc, 어떻게 구현할까?</h3>
</li>
</ol>
<ul>
<li>카카오에서는 추천 이유를 두 가지 범주로 나누었다. &#39;관련성&#39;과 &#39;인기도&#39;</li>
<li>그리고 관련성과 인기도 각각에서도 다음과 같이 세부 라벨을 나누었다<ol>
<li><strong>관련성(Relevant)</strong>: <ul>
<li><strong>Seen</strong>: 이전에 본 작품과 유사</li>
<li><strong>Co-occurrence</strong>: 다른 사용자가 함께 본 작품</li>
<li><strong>Preference</strong>: 선호도 기반</li>
<li><strong>Interest-meta</strong>: 자주 보는 카테고리 기반</li>
</ul>
</li>
<li><strong>인기도(Popularity)</strong>:<ul>
<li><strong>High-conversion</strong>: 전환율이 높은 작품</li>
<li><strong>Popular</strong>: 전체적으로 인기 있는 작품
<br><br><h3 id="그래서-이-라벨들을-어떻게-구분한다는-걸까">그래서 이 라벨들을 어떻게 구분한다는 걸까?</h3>
다음 이미지를 참고하자(출처: 카카오 웹툰) <img src="https://velog.velcdn.com/images/u_sol/post/a0c5bbaa-8911-4408-b60e-3ee7a2dce790/image.png" alt=""></li>
</ul>
</li>
</ol>
</li>
</ul>
<p><strong>여기서 헷갈렸던 게 있는데,</strong> </p>
<ol>
<li><del>추천 모델을 여러개 만들고 어떤 모델을 통해 얘를 추천하게 되었는지 말해주는 건가?</del></li>
<li><strong>아니면 모델은 1개만 쓰고 생성된 추천 결과를 이전 상호작용 이력과 비교(메트릭 계산 등)한다는 건가?</strong>
⇒ 다른 내용을 더 읽고 이 포스팅에서 말하는 건 2번 방법임을 알게되었다. 
즉, <em><strong>추천 이유 생성은 추천 모델과 별개로 작동하는 것!</strong></em><br></li>
</ol>
<p><strong>준비물로 2가지 데이터가 필요하다</strong> </p>
<ol>
<li>사용자의 상호작용 이력 데이터</li>
<li>상품에 대한 메타 데이터<br>

</li>
</ol>
<p><strong>구체적으로는 다음의 방식으로 작동한다</strong>
위의 데이터셋을 사용해 우리가 잘 알고있는 추천시스템 모델을 <strong>하나</strong> 개발한다.
CF일수도 있고, DeepFM일 수도 있고, .. 이 부분은 개발자 나름대로 구현하겠지? 
그런 다음 그 모델이 생성한 추천 결과를 사용자 소비 이력과 비교하여 왜 특정 항목이 추천되었는지를 분석하는 것. 
이 때 <em><strong>다양한 메트릭을 사용한다</strong></em>. 이 부분에 대해서는 라벨별로 다음과 같이 정의할 수 있다 
(참고로 High-conversion, Popular한 아이템은 사용자 이력 데이터가 아닌 아이템의 정보만을 사용하기에 따로 메트릭이랄게 없다) </p>
<table>
<thead>
<tr>
<th><strong>추천 이유</strong></th>
<th><strong>기준</strong></th>
<th><strong>적용 방법 및 메트릭</strong></th>
<th><strong>예시</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>Seen</strong></td>
<td>사용자가 이전에 소비한 항목</td>
<td>- 소비 이력과 정확히 매칭(<code>exactly match</code>)</td>
<td><code>item_A</code>를 본 적이 있으면 &quot;다시보기&quot; 추천</td>
</tr>
<tr>
<td><strong>Co-occurrence</strong></td>
<td>다른 사용자들과 함께 소비된 항목</td>
<td>- <strong>NPMI (Normalized Pointwise Mutual Information)</strong>: 두 항목의 동시 소비 확률 측정<br> - <strong>CF-W2V (Collaborative Filtering - Word2Vec)</strong>: 유사 소비 패턴 사용자 기반 추천</td>
<td><code>item_A</code>와 함께 소비된 <code>item_Y</code> 추천</td>
</tr>
<tr>
<td><strong>Preference</strong></td>
<td>사용자가 선호할 가능성이 높은 항목</td>
<td>- 사용자의 선호 장르, 태그, 작가 기반 추천<br> - 유사도 계산(Cosine Similarity, Word2Vec)</td>
<td>&quot;로맨스&quot; 장르를 자주 보면 새로운 로맨스 작품 추천</td>
</tr>
<tr>
<td><strong>Interest-meta</strong></td>
<td>사용자가 자주 소비하는 메타 정보(장르, 태그, 작가 등)와 관련된 항목</td>
<td>- 콘텐츠 메타 데이터와 사용자의 소비 패턴 비교<br> - 유사도 임계값 이상 항목 추천</td>
<td>&quot;환생물&quot; 태그를 선호하면 관련 항목 추천</td>
</tr>
<tr>
<td><strong>High-conversion</strong></td>
<td>다른 사용자들에게 전환율(CTR)이 높은 항목</td>
<td>- 전환율 ( \text{CTR} = \frac{\text{Clicks}}{\text{Impressions}} ) 활용<br> - 특정 항목의 전환율이 평균보다 높으면 추천</td>
<td>클릭률이 높은 작품을 추천</td>
</tr>
<tr>
<td><strong>Popular</strong></td>
<td>전체적으로 많이 소비된 항목</td>
<td>- 상위 ( N )개의 인기 항목 정렬 후 추천</td>
<td>인기 순위 1~10위 항목 추천</td>
</tr>
<tr>
<td><br></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<p>*<em>암튼 그러면 결과로 다음과 같은 <code>reason</code>, <code>keyword</code> 정보를 생성할 수 있고, *</em> <img src="https://velog.velcdn.com/images/u_sol/post/5b7bda8b-987e-43e2-af1c-c6f0307e0785/image.png" alt=""></p>
<p><strong>추천과 함께 이유를 다음과 같이 띄울 수 있다</strong><img src="https://velog.velcdn.com/images/u_sol/post/cb94a844-7f41-407c-9ef1-0d1a571b619e/image.png" alt=""></p>
<p><br><br><br></p>
<hr>
<h2 id="ab-테스트-결과"><strong>AB 테스트 결과</strong></h2>
<ul>
<li>추천 이유를 표시한 실험군이:<ul>
<li><strong>작품 열람수</strong>: +20% 증가</li>
<li><strong>열람 전환율</strong>: +19% 증가</li>
</ul>
</li>
</ul>
<p><br><br><br></p>
<hr>
<h2 id="결과-분석-eda"><strong>결과 분석 EDA</strong></h2>
<p>이 주제를 수행할 경 <strong>대시보드</strong>를 만들어 우리가 만든 추천 시스템을 트래킹하고, 해석하기 좋아보인다 
<strong>Tableau</strong>같은 BI 툴을 사용하는 것도 고려하기 </p>
<p>예를 들면 이런 거: </p>
<ul>
<li><p>추천 이유와 사용자 활동성<img src="https://velog.velcdn.com/images/u_sol/post/57732bcf-f4e4-452b-a120-271086fd4d70/image.png" alt=""></p>
<ul>
<li><strong>활동성이 높은 사용자</strong>: 개인화된 추천(seen, co-occurrence)에 더 반응</li>
<li><strong>콜드 사용자</strong>: 인기 작품(popular)이나 다시보기(seen) 추천에 반응</li>
<li><strong>추천 작품의 관련성(Relevant)</strong>은 열람 전환율에 중요한 영향을 미침
<br><br><br></li>
</ul>
</li>
<li><p>아니면 이런 거:<img src="https://velog.velcdn.com/images/u_sol/post/fd979d8f-b626-432c-a6c8-eb99bcd37b23/image.png" alt=""></p>
<ul>
<li>사용자의 작품 열람수를 기준으로 Lv1(낮음) ~ Lv7(높음) 7단계로 사용자 활동성을 구분</li>
<li>사용자 활동성이 높아질수록 추천구좌의 열람 전환율이 지수적으로 높아진다.</li>
</ul>
</li>
<li><p>아니면 이런 것도:<img src="https://velog.velcdn.com/images/u_sol/post/1a69553d-8f59-4111-ba4d-c151d9614d2c/image.png" alt=""></p>
<ul>
<li>콜드 사용자일수록 비 개인화 추천 작품(■popular)이 많이 추천되고, ■None(추천이유모름)의 비율이 높다.</li>
<li>활성 사용자일수록 개인화 추천 작품(■seen, ■co-occurrence)의 노출 비중이 높아진다.
<br><br><br></li>
</ul>
</li>
</ul>
<hr>
<h2 id="더-적용해볼만한-것"><strong>더 적용해볼만한 것</strong></h2>
<h3 id="사용자-유형에-따른-추천-라벨-분석">사용자 유형에 따른 추천 라벨 분석</h3>
<ul>
<li><strong>콜드 스타트 유저와 이력이 충분한 유저</strong>는 각기 다른 <strong>라벨 선호 패턴</strong>을 보일 가능성이 크다<ul>
<li>예를 들어, 콜드 스타트 유저는 개인화된 추천보다는 열람수가 많은 인기 작품을 더 선호할 수 있다</li>
</ul>
</li>
<li>이걸 <strong>개인화</strong> 하기 위해서는 다음을 고려할 수 있겠다: </li>
</ul>
<ol>
<li><strong>사용자 유형에 따른 선호 추천 라벨 분석</strong>: 단순하지만 구현이 쉬움</li>
<li><strong>MAB를 활용한 실시간 최적화</strong>: 고도화된 알고리즘이지만 구현이 어려움<br>
### MAB를 활용한 실시간 최적화  </li>
</ol>
<ul>
<li>카카오는 토픽 모델링과 MAB를 융합해 토픽별로 상품을 나누고 배치를 최적화하는 방식을 사용했다<ul>
<li><a href="https://tech.kakao.com/posts/486">https://tech.kakao.com/posts/486</a></li>
</ul>
</li>
<li>이를 변형하면 <strong>사용자 유형별 추천 라벨 배치를 최적화</strong>할 수 있다</li>
<li>스포티파이 역시 유사한 방식으로 추천 시스템을 운영 중이다<br>
### MAB 구현 시 고려 사항  
다만, MAB를 구현하려면 몇 가지 조건이 필요하다</li>
</ul>
<ol>
<li>첫째, <strong>실제 유저가 웹사이트에서 상호작용하며 데이터를 누적</strong>시키는 환경이 필요하다. </li>
<li>둘째, <strong>실시간 처리</strong>를 할 수 있어야 한다 → _이 부분은 추가 리서치를 해봐야한다 _
<br><br><br></li>
</ol>
<hr>
<p>카카오웹툰의 <strong>설명 가능한 추천 시스템(Explainable Recommender System)</strong> 개발과정을 참고하여 작성함. </p>
<ul>
<li>출처: <a href="https://speakerdeck.com/kakao/explainable-recommender-system-in-kakaowebtun?slide=24">설명 가능한 추천 시스템 - 카카오웹툰</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[EASER(Embarrassingly Shallow Autoencoders = EASE for Recommendations)]]></title>
            <link>https://velog.io/@u_sol/EASEREmbarrassingly-Shallow-Autoencoders-EASE-for-Recommendations</link>
            <guid>https://velog.io/@u_sol/EASEREmbarrassingly-Shallow-Autoencoders-EASE-for-Recommendations</guid>
            <pubDate>Fri, 29 Nov 2024 02:44:48 GMT</pubDate>
            <description><![CDATA[<h3 id="✦-easer-어떤-모델인가"><strong>✦ EASER, 어떤 모델인가?</strong></h3>
<blockquote>
<p>🔑 KEYWORD:  선형, Closed Form Solution, Item-Item Similarity</p>
</blockquote>
<p><br><strong>EASER는 선형 모델인 EASE를 발전시킨 모델이다.</strong> </p>
<p>최근 추천시스템에 딥러닝을 적용한 많은 모델들이 좋은 성능을 보여왔다. 그러나 타 AI분야(NLP, CV 등)와는 다르게 추천시스템에서는 적은 은닉층을 가진 모델이 더 좋은 성능을 보이는 경우가 많다. EASER는 그 중에서도 극단적으로 <strong>은닉층이 없는 선형 모델이다.</strong> 
<br>
선형모델이기에 <strong>closed form solution</strong>을 가진다. 다시말해 ‘수식으로 표현할 수 있는’ 해를 가지며, 이를 ‘analytic 한 해를 가진다’ 고 표현하기도 한다. 
<br>
전체적인 아이디어는 <strong>아이템과 아이템간의 유사도</strong>를 학습하여 사용자가 <strong>지금까지 소비한 아이템를 바탕으로 유사한 아이템을 추천</strong>해주는 것이다. item-item 쌍사이의 관계를 고려하여 사용자의 이전 상호작용 기록에서 두 아이템 이상의 조합이 더 높은 관련성을 갖는 경우를 식별한다. 때문에 CF같은 Neighbor Based 방법으로 볼 수도 있겠다. 이 때 아이템이 자기 스스로와 유사해지지 않도록 규제하여 일반화 성능을 올린다. 즉 <strong>weight matrix의 대각 성분 제로화</strong>하는 것. 아이템이 자기 자신과의 유사도가 과도하게 반영되면 다른 아이템들과의 상관관계를 제대로 학습하지 못할 수 있다. 따라서 이 규제는 모델이 다양한 상호작용 패턴을 학습하게 도와준다. 
<br>
엄밀히 말하자면 이름에 나와있는 AE가 쓰이지는 않는다. AE처럼 유저 벡터를 압축하기 위해서 Dense Layer 가 존재하는가? 라고 묻는다면 그렇지 않다. 그렇기에 여타 딥러닝 기반의 추천시스템에 비해 상당히 간단한 모델이라고 할 수 있겠다. 대신, 출력 레이어의 B의 가중치를 저장한다.</p>
<p><br><br><br><br></p>
<h3 id="✦-ease-와는-어떻게-다를까"><strong>✦ EASE 와는 어떻게 다를까?</strong></h3>
<p>Explicit FeedBack을 반영할 수 있는 EASER는 
<br>
1️⃣ 먼저, 고차(Higher-order) 상호작용을 고려할 수 있다. 단순한 아이템 간의 쌍 관계만 학습하는 EASE와 다르게, 삼중(Triplet) 관계같은 고차  상호작용까지 학습하여 더욱 정밀한 추천을 제공할 수 있다. 2️⃣ 또한 네거티브(Negative)상호작용을 고려할 수 있다. 이는 사용자의 부정적인 선호도나 관심 부족을 표현하는 데 유용하다. 
<br>
이를 통해 보다 복잡한 사용자 행동 양식과 선호도를 포착할 수 있다. 
<br><br><br><br></p>
<h3 id="✦-easer의-장점은"><strong>✦ EASER의 장점은?</strong></h3>
<br>
선형 모델이기에 비교적 견고하고 계산적으로 효율적이며 간단하다. gradient descent 나 chain rule 을 사용하지 않아도 된다. 선형 계산위주라고 생각하면 된다. 그런데도 딥러닝이 판치는 추천시스템에서 SOTA를 달성했었다는 게 신기하다. 

<p>그리고 논문 제목에서도 알 수 있듯이 Sparse 한 데이터에 강하다. 
<br>
그 외의 장점은, </p>
<p>1️⃣ 하이퍼 파라미터는 람다 하나이며 그 값에 따른 성능차이가 미미하다는 것 </p>
<p>2️⃣ 그리고 빠르다 것(몇 시간/일이 걸리던 것을 몇 분 만에 훈련한다)</p>
<p>3️⃣ 흔하지 않은 고유한 항목 추천할 수 있기에 ‘발견’을 중시하는 추천분야에서 좋게 작용할 수 있겠다. </p>
<p>4️⃣ implicit, explicit 데이터 모두에 사용 가능하다고 한다 
<br><br><br><br></p>
<h3 id="✦-그래서-어떻게-작동할까"><strong>✦ 그래서 어떻게 작동할까?</strong></h3>
<ul>
<li>수식에 등장하는 주요 인자는 다음 3가지이다.
<img src="https://velog.velcdn.com/images/u_sol/post/ebc0edee-6904-4109-913c-3fd51ff765c9/image.png" alt=""><blockquote>
<p>X(인풋행렬) → U X I (input data, binary)</p>
<p>B(가중치행렬) → I X I (model, weight, closed-form으로 훈련하는 모델)</p>
<pre><code>⇒ 모델의 parameter, weight 이자 학습 대상이다. 
⇒ diag(B)는 0으로 제한되는 것이 특징이다</code></pre><p>S(예측행렬) → U X I (<em>X</em>⋅<em>B</em>해서 나온 predict)</p>
<pre><code>⇒ 우리의 최종 예측 타깃으로, user *u*가 아이템 *i*에 관심이 있을 확률 정보를 가진다 </code></pre></blockquote>
</li>
</ul>
<br>

<ul>
<li>그럼 B를 구하려면(학습시키려면) 어떤 목적함수를 두어야할까? 수식은 다음과 같다.
<img src="https://velog.velcdn.com/images/u_sol/post/c28b103e-bb8d-4add-b061-c6bd0fd85cf7/image.png" alt="">
목적식에서 L1이 아닌 L2, 즉 square loss 를 사용한 이유는 앞서 언급했던 closed form solution 을 구할 수 있도록 하기 위함이다. 여기서 등장하는 람다가 아까 언급한 정규화 파라미터(모델의 유일한 파라미터..!)이다. 
<br><br></li>
<li>그럼 위의 목적함수를 만족하는 B에 대한 Closed Solution은 어떻게 구해질까? 증명은 생략하고 그 구체적인 프로세스만 정리해보았다. <h1 id=""><img src="https://velog.velcdn.com/images/u_sol/post/4c9fc6d6-3eac-4536-8fd1-3c773ed98d78/image.png" alt=""></h1>
</li>
</ul>
<ol>
<li>그램 행렬을 작성 → G = X.t() * X</li>
<li>G의 대각선을 따라 정규화 값(람다)을 추가</li>
<li>P = G.inverse()</li>
<li>B = -P/diagonals(P)</li>
<li>B의 대각선을 0으로 설정</li>
</ol>
<p>(여기서 G는 gram matrix로, co-occurence matrix이다. 
예전에 강의에서 배웠던 A가 선택됐을 때 B, C가 선택되는 빈도를 item-item꼴로 나타낸 행렬)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[RNN, GRU, LSTM, Seq2Seq]]></title>
            <link>https://velog.io/@u_sol/RNN-GRU-LSTM</link>
            <guid>https://velog.io/@u_sol/RNN-GRU-LSTM</guid>
            <pubDate>Fri, 16 Aug 2024 07:37:27 GMT</pubDate>
            <description><![CDATA[<h2 id="1-rnn과-gradient-flow-문제">[1] RNN과 Gradient Flow 문제</h2>
<h3 id="rnn-왜-필요할까">RNN, 왜 필요할까?</h3>
<p>기본적으로 RNN은 시계열 데이터를 처리하기 위한 모델이다. 기존의 다른 딥러닝 모델들은 독립적인 입력값에 대한 예측값을 반환한다. 따라서 Sequence 데이터의 처리를 위해 RNN이 고안되었다. </p>
<h3 id="rnn은-어떻게-작동하는가">RNN은 어떻게 작동하는가?</h3>
<p><img src="https://velog.velcdn.com/images/u_sol/post/3e3d2784-b804-47a2-ade8-7ed67980023a/image.png" alt=""></p>
<ul>
<li>핵심은 이전시점의 output이 다시 현재시점의 input으로 사용된다는 건데,</li>
<li><strong>순전파에서는,</strong>
인풋과 전 단계의 hidden state에 각각의 가중치를 곱한다. 
그리고 그걸 더해서 activation function(tanh)에 넣는다. 
그 값을 다음 단계의 hidden state로 내보낸다.</li>
<li><strong>역전파에서는,</strong>
현재의 hidden state를 전단계의 hidden state에 대해 미분한다.  <h3 id="vanilla-rnn은-왜-현업에서-잘-안쓰일까">Vanilla RNN은 왜 현업에서 잘 안쓰일까?</h3>
</li>
</ul>
<p>RNN은 고정되지 않은 길이의 Input Sequence 처리 가능하며, 특정 시점에서 여러 단계 이전의 정보를 사용할 수 있다는 장점이 있다. 추가로 input x_t에 관계 없이 항상 같은 weight parameter를 이용하기 때문에 문장 기억에 효과적이기도 하다.</p>
<p>하지만 우리가 주목할 것은 단점이다. RNN은 단점이 매우 확실하고 치명적인데,</p>
<p><strong>첫째, 병렬화가 불가능하며 Computation이 비싸다</strong>. 마치 재귀함수처럼 자신의 output을 다시 input으로 받는 Recurrent 구조를 가지기 때문이다. </p>
<p><strong>둘째, Vanishing gradient/exploding 문제가 존재한다.</strong></p>
<p><strong>셋째, RNN의 Many-to-Many구조는 현실 데이터 모델링에 부적절하다</strong>
(예시) &quot;I am Yusol&quot;은 &quot;나는 유솔이야&quot;로 번역 가능하다. 이렇게 간단한 문장인데도 벌써 입력과 아웃풋 길이가 각각 2, 3으로 다르다.(인풋과 아웃풋은 1:1 대응관계를 이루기 힘들다)
      * 해결책: Seq2Seq </p>
<h3 id="vanilla-rnn의-기울기-문제">Vanilla RNN의 기울기 문제</h3>
<p><img src="https://velog.velcdn.com/images/u_sol/post/0cb5f68e-b7f1-4df8-a013-8bc1e1a30ba7/image.png" alt="">
h_t(t시점의 hidden state)에서 h_t-1로 역전파를 수행할 때에 아래 수식에서 볼 수 있는 W_hh가 곱해진다. 근데 역전파를 계속 수행함에 따라 이 W_hh가 입력 sequence의 길이만큼 곱해지게 된다. 이렇게 <strong>동일한 행렬이 반복적으로 multiplication</strong>되는 경우 <strong>다음 두가지 문제가 생긴다</strong>.<img src="https://velog.velcdn.com/images/u_sol/post/534b008f-077b-4f83-b069-f79dbe3d79f0/image.png" alt=""></p>
<h4 id="1-exploding-gradient-문제">1. Exploding Gradient 문제</h4>
<p>가장 큰 특이값 &gt; 1 인 경우 누적하여 곱해짐에 따라 Gradient는  Explode한다. 즉, 큰 가중치는 극단값으로 발산한다.<img src="https://velog.velcdn.com/images/u_sol/post/f79455a7-229f-41e7-b8a0-5050f6037adc/image.png" alt=""></p>
<h4 id="2-vanishing-gradient-문제">2. Vanishing Gradient 문제</h4>
<p>가장 큰 특이값 &lt; 1 인 경우 누적하여 곱해짐에 따라 Gradient는  소멸된다. 즉, 작은 가중치는 0으로 수렴한다.<img src="https://velog.velcdn.com/images/u_sol/post/89b4a3bb-8dbe-4e87-b19d-bd5bcbba52bf/image.png" alt=""></p>
<blockquote>
<p>정리) 
<em><strong>RNN의 Backpropagation에서 FC</strong>(fully connected layer)<strong>를 통과하면서 같은 weight parameter가 입력 sequence만큼 곱해지기에 gradient vanishing/exploding 문제가 발생한다.</strong></em></p>
</blockquote>
<h4 id="그게-왜-문제일까">그게 왜 문제일까??</h4>
<p>: 시퀀스 내 장거리 의존성<strong>(long-term dependency)</strong>를 모델링하는데 실패 → 여러 단계 이전의 정보에 접근하기 매우 힘들다. </p>
<h4 id="해결책은-없나">해결책은 없나?</h4>
<p><img src="https://velog.velcdn.com/images/u_sol/post/7cb06678-492d-4fbd-83bb-9924f927f3db/image.png" alt="">
<strong>Solution 1. Gradient Clipping
*<em>큰 Gradient는 최대값(threshold)으로 클리핑되며, 각 Dimension은 기울기 방향을 유지하기 위해 비례적으로 축소된다. Exploding만 해결할 수 있는 줄 알았는데 Vanishing Gradient도 해결 가능하다고 한다. 
*</em>Solution 2. LSTM, GRU</strong></p>
<h2 id="2-lstm">[2] LSTM</h2>
<p><img src="https://velog.velcdn.com/images/u_sol/post/ee88c29c-777c-4ef6-a8e0-e6f4fb16bf07/image.png" alt=""><strong>Hidden State</strong>
이전 타임 스텝의 정보를 현재 타임 스텝의 입력과 함께 보유하는 내부 메모리</p>
<p><strong>Cell State</strong>
FC를 우회하는 highway</p>
<p><strong>Input Gate</strong>
현재 입력된 새로운 정보를 얼마나 사용할거야? 를 결정하며 0-1값을 가진다 </p>
<p><strong>Forget Gate</strong> 
이전의 Cell State 정보를 얼마나 잊을거야? 를 결정하며 0-1값을 가진다</p>
<p><strong>Output Gate</strong> 
다음 층으로 전달할 Hidden State를 만든다</p>
<p>→ 셀 상태를 업데이트할 때나 출력 게이트를 통해 최종 출력을 계산할 때 tanh 함수가 적용</p>
<h2 id="3-gru">[3] GRU</h2>
<p><img src="https://velog.velcdn.com/images/u_sol/post/cd3ae949-20d0-43fc-9981-10276301522a/image.png" alt="">일단, 선은 잊고 component 들만 보자. LSTM과의 차이는 Cell State가 없다는 것이다. 그만큼 parameter가 적고 연산량이 적다. </p>
<h2 id="4-seq2seq">[4] Seq2Seq</h2>
<p>각 입력토큰마다 출력 토큰을 생성하는 거, 가능한가? 불가능할 때도, 가능은 하지만 효과적이지 않을 때도 있다. So, Many-to-Many가 아닌 
&quot;Many-to-One(Encoder)&quot;, &quot;One-to-Many(Decoder)&quot;를 사용하는 Seq2Seq 모델이 고안되었다.</p>
<p>상세내용을 다이어그램으로 그려봤당!<img src="https://velog.velcdn.com/images/u_sol/post/f23a0553-4b43-4c53-b9f6-7bb30ec0d44d/image.png" alt=""></p>
<p><strong>📌오해했던 것: Context Vector와 y_t를 사용해서 y_t+1을 예측?</strong>
<em><strong>NO!!</strong></em>
context vector가 업데이트된 decoder의 hidden state s_t와 h_t를 사용해 y_t+1를 예측한다. 즉, context vector는 디코더 첫 부분에만 쓰이고 끝</p>
<h3 id="💻-모델코드">💻 모델코드</h3>
<p><strong>Encoder</strong><img src="https://velog.velcdn.com/images/u_sol/post/c61bf618-53a9-40ce-9c7a-6a0e382a0c2f/image.png" alt="">
<strong>Decoder</strong><img src="https://velog.velcdn.com/images/u_sol/post/4a20cead-5cfd-4ff1-8fc8-06e6ab68bbd4/image.png" alt="">
*<em>빈칸: self.dropout(self.embedding(x)) *</em></p>
<ul>
<li>Dropout: 과적합 방지용 정규화 기법이다. 특정 뉴런에 의존하지 않도록 일부 뉴런을 무작위로 비활성화(0으로 설정)한다. 시퀀스를 임베딩 공간으로 전환하는 Encoder와 Decoder 모두에 Dropout을 적용하면 다음가 같은 장점이 있다. <ul>
<li>일관성: 임베딩 벡터에 동일한 정규화 기법 적용한다.</li>
<li>일반화 성능: 임베딩 벡터에 노이즈를 추가</li>
</ul>
</li>
</ul>
<p><strong>Interface</strong>
<img src="https://velog.velcdn.com/images/u_sol/post/2486d9b4-d09e-4679-aaf8-30a3624320b2/image.png" alt=""><strong>(A) source.shape[1], (B) target.shape[0]</strong>
(B): 변수의 이름에서 언급된 target의 길이 = 출력 문장의 길이
(A): num_sentences = 한 배치(batch) 안에 있는 문장의 개수 = 배치 크기(batch size)를 나타냄</p>
<ul>
<li>출처
<a href="https://colah.github.io/posts/2015-08-Understanding-LSTMs/">https://colah.github.io/posts/2015-08-Understanding-LSTMs/</a>
<a href="https://cs231n.stanford.edu/slides/2020/lecture_10.pdf">https://cs231n.stanford.edu/slides/2020/lecture_10.pdf</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Data Preprocessing & Augmentation]]></title>
            <link>https://velog.io/@u_sol/NN-%EC%9D%B4%EC%96%B4%E3%85%93%EC%84%9C</link>
            <guid>https://velog.io/@u_sol/NN-%EC%9D%B4%EC%96%B4%E3%85%93%EC%84%9C</guid>
            <pubDate>Thu, 15 Aug 2024 06:05:20 GMT</pubDate>
            <description><![CDATA[<p>Image classification위주의 내용이다. </p>
<p><br><br></p>
<h2 id="데이터-전처리data-preprocessing">데이터 전처리(Data Preprocessing)</h2>
<h3 id="zero-centering--normalization">Zero-centering &amp; Normalization</h3>
<ul>
<li>모든 입력값이 양수인 데이터에서 sigoid activation function을 사용하는 경우: upstream gradient의 부호가 바뀌지 않고 downstream gradient에 그대로 반영된다는 문제가 있음 </li>
</ul>
<p><br><br><br><br></p>
<h3 id="why-zero-centering">Why Zero-centering</h3>
<p>*<em>(1)Weight의 작은 변화에 덜 민감해진다 *</em>
<img src="https://velog.velcdn.com/images/u_sol/post/26789970-d12d-4834-8829-b97d68c28d7d/image.png" alt="">*출처: <a href="https://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture7.pdf">https://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture7.pdf</a></p>
<p><strong>(2)효율적인 Optimization을 위해 필요하다</strong></p>
<ul>
<li><p>1.1에 제시한 상황의 경우 gradient descent가 굉장히 비효율적으로 업데이트 된다</p>
<ul>
<li>optimal path를 따라가지 않고 아래처럼 됨
<img src="https://velog.velcdn.com/images/u_sol/post/026db4f2-2989-4f4e-bf04-e52516fa1e49/image.png" alt="">*출처:<a href="https://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture6.pdf">https://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture6.pdf</a></li>
</ul>
</li>
<li><p><strong>data distribution의 center는 0이 되도록 하는 것을 권장함(<em>zero centering</em>)</strong></p>
<ul>
<li><strong>어떻게 해결해야하는가?</strong>
: 모든 데이터포인트에서 데이터의 평균값을 빼주면 된다.</li>
</ul>
</li>
</ul>
<p><strong>NN, Normalize는 필수</strong>
또한 NN이라는 모델 자체가 데이터의 정규성을 기본 전제로 하기에 normalize도 해주어야한다. computer vision 데이터도 예외가 아님
<img src="https://velog.velcdn.com/images/u_sol/post/68599744-6cee-4412-ae24-39fe82418742/image.png" alt="">*출처: <a href="https://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture6.pdf">https://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture6.pdf</a></p>
<p><br><br><br><br></p>
<h3 id="pca--whitening">PCA &amp; Whitening</h3>
<ul>
<li>data compression 메서드 중 하나 </li>
<li>PCA: 데이터 분포에서 가장 분산이 넓은 축을 중심으로 rotate</li>
<li>Whitening 그걸 variance로 나누어줌 </li>
</ul>
<p><br><br><br><br></p>
<p><br><br><br><br></p>
<h2 id="데이터-증강data-augmentation">데이터 증강(Data Augmentation)</h2>
<ul>
<li>실제 데이터셋은 적다. 레이블링 해야하기 때문이다. </li>
<li>데이터의 의미에 영향을 주지 않고 각각의 데이터를 수정할 필요가 있다. </li>
<li>그렇게 늘린 데이터로 training 을 진행한다.</li>
<li>약간 노가다스럽지만 Robust한 모델을 만드는 데에 굉장히 효과적이며 현업에서 매우 자주 쓰이는 방법들이다.</li>
<li>어려운 내용은 없어서 설명은 생략하였다. </li>
</ul>
<p><br><br></p>
<h3 id="horizontal-flips">Horizontal Flips</h3>
<p><img src="https://velog.velcdn.com/images/u_sol/post/236b9bbb-a0fb-40c8-93f2-f3169df37248/image.png" alt="">
*출처:<a href="https://cs231n.stanford.edu/slides/2020/lecture_8.pdf">https://cs231n.stanford.edu/slides/2020/lecture_8.pdf</a>
<br><br></p>
<h3 id="random-crops">Random Crops</h3>
<p><img src="https://velog.velcdn.com/images/u_sol/post/4e27d48c-0a91-4ff2-b74a-05b1e001b96a/image.png" alt="">
<em>출처:<a href="https://cs231n.stanford.edu/slides/2020/lecture_8.pdf">https://cs231n.stanford.edu/slides/2020/lecture_8.pdf</a>
<br><br>
*</em>Translation in Variance**</p>
<h3 id="color-jitter">Color Jitter</h3>
<p><img src="https://velog.velcdn.com/images/u_sol/post/49a26ec2-5b38-4891-9d72-eac72825887c/image.png" alt=""></p>
<ul>
<li>그 외 Scaling, Random Crops, Scaling도 있다. 원리는 간단하지만 생각보다 효과가 좋으니, CV 쪽 건드릴 때 써먹어보면 좋을듯!!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MLLifeCycle] Linear Classifier & Softmax Classifier ]]></title>
            <link>https://velog.io/@u_sol/MLLifeCycle</link>
            <guid>https://velog.io/@u_sol/MLLifeCycle</guid>
            <pubDate>Wed, 14 Aug 2024 01:12:27 GMT</pubDate>
            <description><![CDATA[<h1 id="linear-classifier">Linear Classifier</h1>
<ul>
<li><strong>등장 배경</strong>: NN Classifier(가장 가까운 학습 데이터를 찾아 예측을 수행하는 알고리즘)의 한계를 극복하고자 <em>parametric approach</em> 사용. </li>
<li>이미지를 10개의 카테고리 중 하나로 분류하는 Task가 있다고 가정해보자.</li>
<li>_<strong>y=Wx+b</strong>_라는 간단한 선형함수를 세워두자.</li>
<li>여기서 각 레이블이 올바른 이미지에 대해 가장 높은 점수를 받도록 W(Weigth Parameter)가 정해져야 한다. </li>
</ul>
<p><strong>차원 계산하기</strong></p>
<ul>
<li><p>각 term의 차원을 계산해보자<img src="https://velog.velcdn.com/images/u_sol/post/2841ffed-2e42-46d4-840f-dd7be6c15cc1/image.png" alt="">_<strong>f(x,W) = Wx+b</strong> _</p>
</li>
<li><p>이미지 크기 = 32x32x3 (3072)</p>
</li>
<li><p><code>x</code>: 3072 x 1로, 이미지를 1차원을 flatten한 것이다. </p>
</li>
<li><p><code>output</code>: 10 x 1(10개의 클래스를 분류)</p>
</li>
<li><p><code>W</code>: 10x3072(행렬곱 규칙에 따라) </p>
</li>
<li><p><code>b</code>: 3072x1(bias term; input에 영향을 주지 않고 output에 영향 미침)</p>
<ul>
<li><strong>편향의 역할</strong>:
  데이터 레이블이 이분하게 분포하지 않고, <strong>하나의 클래스에 치중</strong>되어 있는 경우가 있다(skewed distribution). 이럴 경우 나머지 parameter가 데이터 분포가 아닌 <strong>데이터 본연의 특성에 집중</strong>할 수 있도록 돕는 것이 bias term이다. <ul>
<li>예를 들어, training 데이터에 고양이가 많은 경우 데이터를 보지 않고도 &#39;일단은&#39; 고양이라고 예측하는 방향으로 작용한다. <img src="https://velog.velcdn.com/images/u_sol/post/c12164f7-2d58-4520-a5da-d2a1321ae868/image.png" alt="">→ W라는 행렬의 각 row는 각 레이블(클래스)의 weight라고 해석 가능 </li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="softmax-classifier">Softmax Classifier</h1>
<ul>
<li><strong>등장 배경</strong> : y는 점수. 근데 이 점수는 해석이 어렵다. 따라서 0과 1 사이의 경계 점수를 얻어서 확률로 해석할 수 있다면 더 좋을 것. 크게 2가지의 activation function이 있다. </li>
<li><strong>시그모이드</strong> : binary classification에 쓰임
<img src="https://velog.velcdn.com/images/u_sol/post/c542f6e1-85d5-4503-bbf5-92803799710a/image.png" alt=""></li>
<li><strong>softmax</strong> : multi-label classification에 쓰임
<img src="https://velog.velcdn.com/images/u_sol/post/392f026b-2712-401c-ad63-ee0fb8dd908f/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/u_sol/post/dff991cb-adfc-473f-a6f6-2eacb327529c/image.png" alt=""></p>
<h3 id="softmax-classifier-출력-확률의-수치적-불안정성-방지를-위한-방법">Softmax Classifier 출력 확률의 수치적 불안정성 방지를 위한 방법</h3>
<p>[문제] 소프트맥스 함수에서 지수화를 할 때 큰 수를 다루게 되면 수치적 불안정성이 발생할 수 있음 
[해결] 입력 값의 최대값을 계산하여 모든 입력 값에서 이를 빼는 것입니다. (가장 큰 값이 0이 됨)</p>
<h2 id="loss-function">Loss Function</h2>
<h3 id="discrete-loss-function"><strong>Discrete Loss Function</strong></h3>
<p> 몇 가지 단점이 있어 주로 사용되지는 않음</p>
<ol>
<li><p><strong>마진 기반 손실 (Margin-Based Loss):</strong>  </p>
<ul>
<li>모델이 잘못된 예측을 했을 때 일정한 손실 값을 부여</li>
<li>올바른 예측을 했을 때는 손실이 0</li>
<li>따라서 이로 인해 미분 불가능하다는 단점이 존재 → 최적화 과정에서 제약으로 작용</li>
</ul>
</li>
<li><p><strong>로그 손실 (Log Loss):</strong>  </p>
<ul>
<li>모델의 예측이 정확할수록 손실 값이 낮아지고 미분 가능 → 최적화에 용이</li>
</ul>
</li>
<li><p><strong>지수 손실 (Exponential Loss):</strong>  </p>
<ul>
<li>로그 손실과 유사 잘못된 예측에 대해 더 큰 손실(페널티)을 부여(올바른 예측에 대해서는 반대)</li>
</ul>
</li>
<li><p><strong>힌지 손실 (Hinge Loss):</strong>  </p>
<ul>
<li>오류에 대한 loss가 선형적으로 증가</li>
<li>정답에 가까운 예측에도 약간의 페널티 부여</li>
<li>SVM에서 사용(결정 경계에 가까운 데이터 포인트를 더욱 신중하게 다루는 것)</li>
</ul>
</li>
</ol>
<h3 id="cross-entropy-loss"><strong>Cross Entropy Loss</strong></h3>
<p>사실 ML에서는 주로 <strong>확률적 손실 함수</strong>를 사용.</p>
<p><strong>크로스 엔트로피</strong> 
→ 모델의 예측 확률과 실제 라벨 간의 차이를 측정
→ 활성화 함수와 결합되어 사용됨<img src="https://velog.velcdn.com/images/u_sol/post/aa3d8e75-b742-4c65-82eb-07b8fcce9600/image.png" alt=""></p>
<h3 id="kl-divergence"><strong>KL Divergence</strong></h3>
<p><img src="https://velog.velcdn.com/images/u_sol/post/75bdc9b8-5e1e-46b8-a99e-61dfe18cd8ee/image.png" alt=""><strong>KL Divergence</strong>는 두 확률 분포 사이의 차이를 측정하는 데 사용됩니다. 이 값이 작을수록 두 분포가 유사함을 나타내며, 이는 모델이 실제 데이터 분포를 얼마나 잘 따라가고 있는지를 평가하는 데 유용합니다.</p>
<h2 id="최적화optimization"><strong>최적화(Optimization)</strong></h2>
<p>: loss function(cost function, J())값을 이용해 parameter의 값을 update 하는 방법</p>
<ol>
<li><p>완전탐색, 랜덤탐색 → 잘 안됨</p>
</li>
<li><p>그리디 탐색 → 나머지 weight parameter는 고정, 하나의 weight parameter 바꿔가면서 optimize → 두개 이상의 파라미터가 동시에 바뀌는 경우를 고려하지 않기에 잘 안된다고 함 </p>
</li>
<li><p><strong>Gradient Descent와 SGD</strong>
Gradient Descent는 산의 최정상으로 올라가기 위해서, 현재 위치에서 가장 가파른 방향으로 발을 디디는 것과 같다.BUT 몇가지 한계를 가진다. </p>
<ul>
<li>볼록하지 않은 표면: 로컬최적점/새들 포인트에 빠질 수 있음</li>
<li>미분 가능성: cost function이 미분 가능한 경우에만 적용 가능</li>
<li>수렴 속도: 국부 최솟값으로 수렴하는 것의 속도가 느리다 (모든 방향에 대해 발을 디디는 것이니까)</li>
</ul>
</li>
</ol>
<p>그래서 사실 주로 <strong>확률적 경사 하강법(SGD, Stochastic Gradient Descent)</strong>을 사용. </p>
<ul>
<li>일부 데이터에 대해서만 gradient descent 수행해서 속도 UP</li>
</ul>
<h1 id="linear-classifier가-잘-안쓰이는-이유">Linear Classifier가 잘 안쓰이는 이유?</h1>
<p>성능이 별로 좋지 않음</p>
<ul>
<li>시각적으로 해석하자면, 각 클래스당 하나의 템플릿(weight parameter)만 학습이 가능하다</li>
<li>기하학적으로 해석하자면, linear한 decision boundary 만 생성할 수 있다 </li>
</ul>
<h3 id="featurization-linear-boundary로는-해결못하는-분류-task-수행-가능">Featurization: linear boundary로는 해결못하는 분류 task 수행 가능</h3>
<h3 id="featurization-선형-경계로-해결할-수-없는-분류-작업"><strong>Featurization: 선형 경계로 해결할 수 없는 분류 작업</strong></h3>
<p><img src="https://velog.velcdn.com/images/u_sol/post/9cbca33b-90e1-4ce6-be5d-024358a1afd8/image.png" alt="">*출처: <a href="https://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture3.pdf">https://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture3.pdf</a>
원본 feature space를 조작해 선형경계로 해결 불가능한 classification을 수행 </p>
<ol>
<li><strong>고차원 매핑:</strong> ex) 2차원 → 3차원</li>
<li><strong>비선형 변환:</strong> </li>
<li><strong>커널 트릭:</strong> SVM에서 사용 </li>
<li><strong>rule based featurization</strong>: 도메인 지식을 이용해 손으로 한땀한땀하는 rule based 특성화과정. 요즘엔 안쓰임. </li>
</ol>
<p>💬
아무리 featurization을 해도 여전히 구리다 linear classification은! 
Activation Function이랑 Loss Function 헷갈리지 말기</p>
]]></description>
        </item>
    </channel>
</rss>