<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>meo_sun.log</title>
        <link>https://velog.io/</link>
        <description>데이터와 AI를 잘 활용하는 Backend Developer가 되자</description>
        <lastBuildDate>Thu, 17 Apr 2025 07:00:19 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>meo_sun.log</title>
            <url>https://velog.velcdn.com/images/meo_sun/profile/0adfd50b-3d29-4da7-ab45-8b1187344baa/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. meo_sun.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/meo_sun" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[내일의 나를 설계하는 6개월, 성장 로드맵 ✨
]]></title>
            <link>https://velog.io/@meo_sun/%EB%82%B4%EC%9D%BC%EC%9D%98-%EB%82%98%EB%A5%BC-%EC%84%A4%EA%B3%84%ED%95%98%EB%8A%94-6%EA%B0%9C%EC%9B%94-%EC%84%B1%EC%9E%A5-%EB%A1%9C%EB%93%9C%EB%A7%B5</link>
            <guid>https://velog.io/@meo_sun/%EB%82%B4%EC%9D%BC%EC%9D%98-%EB%82%98%EB%A5%BC-%EC%84%A4%EA%B3%84%ED%95%98%EB%8A%94-6%EA%B0%9C%EC%9B%94-%EC%84%B1%EC%9E%A5-%EB%A1%9C%EB%93%9C%EB%A7%B5</guid>
            <pubDate>Thu, 17 Apr 2025 07:00:19 GMT</pubDate>
            <description><![CDATA[<p>| GPT와 함께 나의 채팅이력을 바탕으로 앞으로의 로드맵 작성! 25년도 달려보자</p>
<h1 id="🌟-성공적인-백엔드-개발자를-위한-6개월-성장-로드맵">🌟 성공적인 백엔드 개발자를 위한 6개월 성장 로드맵</h1>
<hr>
<h1 id="1-5년-비전-vision-blueprint">1. 5년 비전 (VISION BLUEPRINT)</h1>
<h2 id="🎯-5년-후-나의-모습">🎯 5년 후 나의 모습</h2>
<ul>
<li>대규모 트래픽을 처리하는 <strong>시스템 아키텍트</strong></li>
<li>복잡한 비즈니스 로직을 명쾌하게 설계하는 <strong>기술 리더</strong></li>
<li>빠른 실행과 구조적 사고, 감성적 소통까지 갖춘 <strong>완성형 전략가</strong></li>
<li>3개 이상의 고성능 프로젝트 포트폴리오 보유</li>
<li>LinkedIn, GitHub, 기술 블로그에서 퍼스널 브랜드 구축</li>
</ul>
<h2 id="🎯-도달할-목표">🎯 도달할 목표</h2>
<ul>
<li>백엔드 시니어 → 테크 리드 → 시스템 아키텍트로 성장</li>
<li>Kafka, AWS, Kubernetes, ETL 파이프라인 기술 숙련</li>
<li>매년 대외 발표/기여 경험 쌓기</li>
</ul>
<h2 id="🎯-필요한-기술-스택">🎯 필요한 기술 스택</h2>
<ul>
<li><strong>백엔드:</strong> Java(Spring), Python(FastAPI), Go</li>
<li><strong>대규모 처리:</strong> Kafka, Redis, PostgreSQL</li>
<li><strong>클라우드/DevOps:</strong> AWS, Docker, Kubernetes</li>
<li><strong>데이터 파이프라인:</strong> Airflow, Kafka Connect, Streams</li>
</ul>
<hr>
<h1 id="2-1개월-실행-계획-first-step-plan">2. 1개월 실행 계획 (First Step Plan)</h1>
<h2 id="✅-달성-목표">✅ 달성 목표</h2>
<ul>
<li>Kafka + FastAPI 기반 이벤트 서비스 프로토타입 구축</li>
<li>GitHub 퍼블리싱 및 퍼스널 브랜딩 시작</li>
<li>하루 30분 러프 초안 작성 습관화</li>
</ul>
<h2 id="📅-주차별-플랜">📅 주차별 플랜</h2>
<h3 id="week-1">Week 1</h3>
<ul>
<li>Kafka 기초 이해</li>
<li>FastAPI로 CRUD API 서버 구축</li>
<li>GitHub 리포지토리 정리 시작</li>
</ul>
<h3 id="week-2">Week 2</h3>
<ul>
<li>Kafka + FastAPI 연동</li>
<li>이벤트 데이터 저장 및 DB 연동</li>
</ul>
<h3 id="week-3">Week 3</h3>
<ul>
<li>전체 시스템 Docker Compose 구성</li>
<li>코드 정리 및 README 작성</li>
</ul>
<h3 id="week-4">Week 4</h3>
<ul>
<li>최종 점검</li>
<li>다음 사이드 프로젝트 아이디어 구상</li>
</ul>
<h2 id="🛠-매일-할-것">🛠 매일 할 것</h2>
<ul>
<li>하루 목표 1개 설정</li>
<li>러프 초안 작업</li>
<li>진척도 기록</li>
<li>개선 아이디어 메모</li>
</ul>
<hr>
<h1 id="3-26개월-장기-성장-플랜">3. 2~6개월 장기 성장 플랜</h1>
<h2 id="📆-2개월차-58주차">📆 2개월차 (5~8주차)</h2>
<p><strong>주제: Kafka 고급화 &amp; Event Driven Microservice 프로토타입</strong></p>
<table>
<thead>
<tr>
<th align="left">주차</th>
<th align="left">주제</th>
<th align="left">미션</th>
<th align="left">체크포인트 질문</th>
</tr>
</thead>
<tbody><tr>
<td align="left">5주차</td>
<td align="left">Kafka 고급 기능 이해</td>
<td align="left">Kafka Topic Partition, Consumer Group 심화 학습</td>
<td align="left">&quot;Consumer Group의 리밸런싱이 언제 발생하는가?&quot;</td>
</tr>
<tr>
<td align="left">6주차</td>
<td align="left">Kafka Stream 처리 실습</td>
<td align="left">Kafka Streams로 데이터 변환하는 미니앱 작성</td>
<td align="left">&quot;Stream 처리 중 장애 발생 시 어떻게 복구할까?&quot;</td>
</tr>
<tr>
<td align="left">7주차</td>
<td align="left">EDA 기본 서비스 설계</td>
<td align="left">FastAPI + Kafka로 마이크로서비스 연결</td>
<td align="left">&quot;내 서비스는 어떤 이벤트를 주고받아야 하는가?&quot;</td>
</tr>
<tr>
<td align="left">8주차</td>
<td align="left">미니 서비스 배포</td>
<td align="left">Docker Compose로 전체 시스템 컨테이너화</td>
<td align="left">&quot;컨테이너 환경에서 내 시스템은 정상 작동하는가?&quot;</td>
</tr>
</tbody></table>
<hr>
<h2 id="📆-3개월차-912주차">📆 3개월차 (9~12주차)</h2>
<p><strong>주제: Cloud 환경 + Container화 (AWS, Docker, Kubernetes)</strong></p>
<table>
<thead>
<tr>
<th align="left">주차</th>
<th align="left">주제</th>
<th align="left">미션</th>
<th align="left">체크포인트 질문</th>
</tr>
</thead>
<tbody><tr>
<td align="left">9주차</td>
<td align="left">AWS 기초 세팅</td>
<td align="left">EC2, RDS, S3 기본 세팅 실습</td>
<td align="left">&quot;AWS IAM 권한을 어떻게 최소화할 수 있을까?&quot;</td>
</tr>
<tr>
<td align="left">10주차</td>
<td align="left">Docker Compose 고급화</td>
<td align="left">멀티서비스 의존성 관리하기</td>
<td align="left">&quot;서비스 간 네트워크 연결이 적절히 설정되었는가?&quot;</td>
</tr>
<tr>
<td align="left">11주차</td>
<td align="left">Kubernetes 기초 실습</td>
<td align="left">Minikube로 로컬 클러스터 구성</td>
<td align="left">&quot;Pod가 죽었을 때, 자동 복구가 되는가?&quot;</td>
</tr>
<tr>
<td align="left">12주차</td>
<td align="left">모니터링 구축</td>
<td align="left">Prometheus + Grafana 설치</td>
<td align="left">&quot;시스템 병목은 어디에서 발생하는가?&quot;</td>
</tr>
</tbody></table>
<hr>
<h2 id="📆-4개월차-1316주차">📆 4개월차 (13~16주차)</h2>
<p><strong>주제: 시스템 설계 심화 &amp; 부하 테스트</strong></p>
<table>
<thead>
<tr>
<th align="left">주차</th>
<th align="left">주제</th>
<th align="left">미션</th>
<th align="left">체크포인트 질문</th>
</tr>
</thead>
<tbody><tr>
<td align="left">13주차</td>
<td align="left">시스템 아키텍처 설계</td>
<td align="left">MSA 설계 문서화</td>
<td align="left">&quot;내 설계는 확장성과 내결함성을 갖췄는가?&quot;</td>
</tr>
<tr>
<td align="left">14주차</td>
<td align="left">Event Storming 워크샵</td>
<td align="left">이벤트 흐름 설계</td>
<td align="left">&quot;핵심 이벤트는 무엇인가?&quot;</td>
</tr>
<tr>
<td align="left">15주차</td>
<td align="left">부하 테스트 준비</td>
<td align="left">JMeter 스크립트 작성</td>
<td align="left">&quot;가장 취약한 지점은 어디인가?&quot;</td>
</tr>
<tr>
<td align="left">16주차</td>
<td align="left">병목 튜닝 실습</td>
<td align="left">DB 인덱싱/캐시 적용</td>
<td align="left">&quot;튜닝 전후 성능 차이는?&quot;</td>
</tr>
</tbody></table>
<hr>
<h2 id="📆-5개월차-1720주차">📆 5개월차 (17~20주차)</h2>
<p><strong>주제: 실시간 데이터 흐름 구축 &amp; Data Engineering 시작</strong></p>
<table>
<thead>
<tr>
<th align="left">주차</th>
<th align="left">주제</th>
<th align="left">미션</th>
<th align="left">체크포인트 질문</th>
</tr>
</thead>
<tbody><tr>
<td align="left">17주차</td>
<td align="left">Kafka Connect 실습</td>
<td align="left">외부 DB 연동 실습</td>
<td align="left">&quot;Source Connector 설정 시 주의점은?&quot;</td>
</tr>
<tr>
<td align="left">18주차</td>
<td align="left">이벤트 저장소 구축</td>
<td align="left">Sink Connector로 DB 자동 저장</td>
<td align="left">&quot;이벤트 저장 실패 시 처리 전략은?&quot;</td>
</tr>
<tr>
<td align="left">19주차</td>
<td align="left">실시간 데이터 변환</td>
<td align="left">Kafka Streams 전처리 로직 구현</td>
<td align="left">&quot;지연을 최소화하려면?&quot;</td>
</tr>
<tr>
<td align="left">20주차</td>
<td align="left">ETL 파이프라인 설계</td>
<td align="left">End-to-End 흐름 설계</td>
<td align="left">&quot;실시간성과 정확성의 균형은?&quot;</td>
</tr>
</tbody></table>
<hr>
<h2 id="📆-6개월차-2124주차">📆 6개월차 (21~24주차)</h2>
<p><strong>주제: 종합 프로젝트 완성 &amp; 퍼스널 브랜딩 강화</strong></p>
<table>
<thead>
<tr>
<th align="left">주차</th>
<th align="left">주제</th>
<th align="left">미션</th>
<th align="left">체크포인트 질문</th>
</tr>
</thead>
<tbody><tr>
<td align="left">21주차</td>
<td align="left">종합 서비스 구축</td>
<td align="left">SaaS 서비스 종합 구축</td>
<td align="left">&quot;내 시스템은 프로덕션급인가?&quot;</td>
</tr>
<tr>
<td align="left">22주차</td>
<td align="left">CI/CD 파이프라인 구축</td>
<td align="left">GitHub Actions 자동 빌드/배포</td>
<td align="left">&quot;배포 실패시 롤백 전략은?&quot;</td>
</tr>
<tr>
<td align="left">23주차</td>
<td align="left">기술 블로그 연재</td>
<td align="left">6개월 회고 및 정리 글 3편 이상 작성</td>
<td align="left">&quot;내 경험을 어떻게 쉽게 전달할까?&quot;</td>
</tr>
<tr>
<td align="left">24주차</td>
<td align="left">포트폴리오/LinkedIn 정리</td>
<td align="left">퍼스널 브랜드 대폭 강화</td>
<td align="left">&quot;내 커리어 스토리는 매력적인가?&quot;</td>
</tr>
</tbody></table>
<hr>
<h1 id="🎯-최종-목표">🎯 최종 목표</h1>
<ul>
<li>Kafka + FastAPI 기반 실전 서비스 구축</li>
<li>AWS, Kubernetes 기반 클라우드 인프라 경험</li>
<li>데이터 흐름 설계 및 실시간 처리 경험</li>
<li>퍼스널 브랜딩 강화: GitHub, Blog, LinkedIn 업데이트</li>
<li><strong>6개월 후 시스템 아키텍트 후보급 실력 확보</strong></li>
</ul>
<hr>
<h1 id="🚀-지금-시작하자">🚀 지금 시작하자!</h1>
<p>&quot;<strong>작은 완성 → 빠른 피드백 → 지속적 개선</strong>&quot;  
이 루틴만 유지하면 6개월 후, 완전히 다른 레벨의 개발자가 되어 있을 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 번역] Cold-Start Recommendation based on Knowledge Graph and Meta-Learning under Positive and Negative Sampling `with GPT`]]></title>
            <link>https://velog.io/@meo_sun/%EB%85%BC%EB%AC%B8-%EB%B2%88%EC%97%AD-Cold-Start-Recommendation-based-on-Knowledge-Graph-and-Meta-Learning-under-Positive-and-Negative-Sampling-with-GPT</link>
            <guid>https://velog.io/@meo_sun/%EB%85%BC%EB%AC%B8-%EB%B2%88%EC%97%AD-Cold-Start-Recommendation-based-on-Knowledge-Graph-and-Meta-Learning-under-Positive-and-Negative-Sampling-with-GPT</guid>
            <pubDate>Sun, 26 Jan 2025 07:36:26 GMT</pubDate>
            <description><![CDATA[<h1 id="cold-start-recommendation-based-on-knowledge-graph-and-meta-learning-under-positive-and-negative-sampling">Cold-Start Recommendation based on Knowledge Graph and Meta-Learning under Positive and Negative Sampling</h1>
<p><strong>Cold-Start Recommendation based on Knowledge Graph and Meta-Learning under Positive and Negative Sampling</strong></p>
<p><strong>DI HAN</strong><br>광둥 금융대학교, 광저우, 중국  </p>
<p><strong>XIAOTIAN JING</strong><br>시안 교통대학교, 시안, 중국  </p>
<p><strong>YIJUN CHEN</strong><br>시안 항공대학교, 시안, 중국  </p>
<p><strong>JUNMIN LIU</strong><br>시안 교통대학교, 시안, 중국  </p>
<p><strong>KAI LIAO</strong><br>광둥 금융대학교, 광저우, 중국  </p>
<p><strong>WENTING LI</strong><br>구이저우 상업대학교, 구이양, 중국  </p>
<hr>
<p>본 논문은 <strong>CRKM(Cold-start Recommendation based on Knowledge Graph and Meta-learning)</strong>이라는 새로운 추천 프레임워크를 소개합니다.<br>이 프레임워크는 사용자 상호작용 데이터가 부족한 문제를 해결하고,<br>긍정 및 부정 샘플을 융합하여 콜드스타트 추천 성능을 향상시키는 것을 목표로 합니다.  </p>
<p>기존의 다른 콜드스타트 프레임워크와 달리, CRKM은 세 가지 주요 구성 요소로 나뉩니다:  </p>
<ol>
<li><p><strong>부정 샘플러(Negative Sampler)</strong>:  
본 논문에서 설계된 부정 샘플러는 지식 그래프와 아이템의 인기도 정보를 활용하여,<br>사용자 상호작용이 없는 아이템에서 부정 레이블을 샘플링합니다.<br>이를 통해 콜드스타트 훈련 데이터의 희소성을 완화합니다.  </p>
</li>
<li><p><strong>지식 그래프 기반 모델 아키텍처(Knowledge Graph-Based Model Architecture)</strong>:  
지식 그래프의 노드와 관계를 긍정 및 부정 샘플에 통합하며,<br>그래프 신경망(GNN)을 사용해 사용자와 아이템의 융합 표현을 더 효과적으로 학습하고,<br>예측 성능을 향상시킵니다.  </p>
</li>
<li><p><strong>메타러너(Meta-Learner)</strong>:  
메타러너는 효율적인 모델 초기화 및 매개변수 업데이트를 수행합니다.  </p>
</li>
</ol>
<hr>
<p>우리는 실제 데이터셋에서 사용자 및 아이템 추천을 위한 광범위한 실험을 수행했습니다.<br>CRKM은 리콜(Recall) 및 NDCG(Normalized Discounted Cumulative Gain) 측면에서<br>기존 최첨단 방법보다 뛰어난 성능을 보여, 제안된 접근법의 합리성과 효과성을 입증했습니다.  </p>
<p>소스 코드는 <a href="https://gitee.com/kyle-liao/crkm">https://gitee.com/kyle-liao/crkm</a>에서 공개되어 있습니다.  </p>
<hr>
<h2 id="ccs-concepts">CCS Concepts</h2>
<ul>
<li><strong>정보 시스템(Information Systems)</strong> → 추천 시스템(Recommender Systems); 검색 모델 및 랭킹(Retrieval Models and Ranking); 검색 결과 평가(Evaluation of Retrieval Results).</li>
</ul>
<hr>
<h2 id="추가-키워드keywords">추가 키워드(Keywords)</h2>
<p>콜드스타트 추천(Cold-start Recommendation); 지식 그래프(Knowledge Graph); 메타러닝(Meta-Learning); 부정 레이블(Negative Label).</p>
<hr>
<h2 id="1-서론-introduction">1. 서론 (Introduction)</h2>
<p>인터넷과 스마트 기기의 발전으로 인해, 다양한 웹사이트, 애플리케이션, 소셜 네트워킹 플랫폼에서<br>데이터 양이 폭발적으로 증가했습니다.  </p>
<p>이 방대한 데이터 속에서 추천 시스템이 등장하여,<br>사용자들에게 관심 있는 콘텐츠를 신속하고 정확하게 선택할 수 있도록 돕습니다.  </p>
<p>추천 시스템의 핵심은 아이템에 대한 피드백과 과거 사용자 행동 데이터를 활용해<br>사용자 선호도를 파악하고, 추천 아이템을 정렬하는 것입니다.  </p>
<p>추천 시스템은 방대한 데이터셋에서 정보를 필터링하여<br>사용자가 개인적인 관심사에 맞는 콘텐츠를 신속하게 찾을 수 있도록 지원하며,<br>정보 과부하 문제를 완화합니다.  </p>
<hr>
<p>비록 최근 다양한 추천 알고리즘이 등장했지만,<br>새로운 사용자나 상호작용이 적은 아이템과 같은 경우에는 여전히 <strong>콜드스타트 문제</strong>에 직면합니다.  </p>
<p>콜드스타트 문제는 연구자들에게 중요한 관심사가 되었으며,<br>이는 두 가지 측면에서 주로 다뤄집니다.  </p>
<ol>
<li><strong>사용자 콜드스타트(User Cold Start)</strong>:  
과거 상호작용이 거의 없는 새로운 사용자에게 적합한 아이템을 추천하는 문제.  </li>
<li><strong>아이템 콜드스타트(Item Cold Start)</strong>:  
시스템에 새롭게 추가된 아이템을 적합한 사용자에게 추천하는 문제.  </li>
</ol>
<p>콜드스타트 문제의 핵심 원인은 데이터의 제한된 가용성으로, 이는 추천 성능을 저하시킵니다.<br>성능 개선을 위해 더 많은 데이터를 확보해야 하며, 이를 해결하기 위해<br>연구자들은 다양한 방법을 제안했습니다.  </p>
<p>이 방법들은 크게 데이터 수준 접근법(Data-Level Methods)과 모델 수준 접근법(Model-Level Methods)으로 나뉩니다.  </p>
<hr>
<h3 id="데이터-수준-접근법-data-level-methods">데이터 수준 접근법 (Data-Level Methods)</h3>
<p>콜드스타트 문제의 주요 원인은 활용 가능한 데이터의 부족입니다.<br>따라서 데이터 수준에서 문제를 해결하는 것이 중요합니다.  </p>
<p>먼저, 기존 데이터를 효율적으로 활용하는 것이 필요합니다.<br>추천 시스템에서 관찰된 상호작용 데이터는 주로 <strong>암묵적 피드백(Implicit Feedback)</strong> 형태로 나타나며,<br>이는 사용자로부터 긍정적인 선호 정보만 제공합니다.  </p>
<p>그러나 관찰되지 않은 샘플에서 부정적인 선호 정보는 종종 간과됩니다.<br>현재, 사용자와 상호작용하지 않은 아이템에 부정 레이블을 추가하여 데이터를 확장하는<br>다양한 방법이 존재하며, 이는 모델 최적화를 용이하게 합니다.  </p>
<p>둘째로, 보조 정보를 효과적으로 활용하는 것도 중요합니다.<br>최근 <strong>지식 그래프(Knowledge Graph)</strong>는 추천 시스템에서 중요한 보조 정보의 출처로 주목받고 있습니다.<br>지식 그래프는 사용자와 아이템 간의 추가적인 정보를 발견하여,<br>역사적 상호작용 데이터의 희소성을 보완하고 추천 성능을 개선할 수 있습니다.  </p>
<p>이러한 방법들은 좋은 결과를 보여줬지만, 데이터 수준에서만 문제를 완화하며,<br>데이터의 가용성과 품질에 크게 의존합니다.  </p>
<p>본 논문에서는 [5]에서 영감을 받아, 지식 그래프를 활용하여 부정 레이블의 상호작용 정보를 개선하고,<br>주의 메커니즘(Attention Mechanism)을 통해 긍정 샘플의 잡음을 제거함으로써<br>콜드스타트 데이터를 더욱 풍부하게 만들고자 합니다.  </p>
<hr>
<h3 id="모델-수준-접근법-model-level-methods">모델 수준 접근법 (Model-Level Methods)</h3>
<p>데이터 수준 확장 외에도, 최근 몇 년 동안 간단하고 효율적인 콜드스타트 모델과 메타러닝 접근법이<br>콜드스타트 문제를 해결하기 위한 새로운 아이디어를 제공했습니다.  </p>
<p>메타러닝은 콜드스타트 추천에서 각 사용자의 선호 학습을 개별 태스크(Task)로 간주합니다.<br>메타러너(meta-learner)는 기존 사용자들의 태스크에서 강력한 일반화 능력을 가진 사전 지식을 학습하며,<br>이를 통해 희소한 상호작용 데이터를 가진 콜드스타트 태스크에<br>쉽고 빠르게 적응할 수 있도록 지원합니다.  </p>
<p>하지만 기존 모델에는 여전히 한계가 있으며 [3],<br>지식 그래프의 다면적 의미 정보를 메타러너와 더 잘 통합하는 방법에 대한 추가 탐구가 필요합니다.  </p>
<p>본 논문에서 설계된 콜드스타트 추천 프레임워크는 데이터 수준에서 샘플을 더 정확하게 구분할 수 있으며,<br>프레임워크 내 메타러너 [6]는 콜드스타트 태스크에 더 빠르게 적응할 수 있도록 설계되었습니다.  </p>
<hr>
<h3 id="우리의-기여-our-contributions">우리의 기여 (Our Contributions)</h3>
<p>추천 시스템에서 콜드스타트 상황에서 고품질 데이터를 확보하고,<br>사용 가능한 데이터를 보완하기 위해, 우리는 <strong>지식 그래프와 메타러닝</strong>을 기반으로<br>보다 효과적인 콜드스타트 추천 모델 <strong>CRKM</strong>을 제안합니다.  </p>
<ul>
<li><p><strong>데이터 수준</strong>:  
지식 그래프를 보조 정보로 활용하여 사용자와 아이템 표현을 풍부하게 만듭니다.  </p>
</li>
<li><p><strong>모델 수준</strong>:  
메타러너를 지식 그래프 기반 추천 모델에 통합하여 콜드스타트 문제를 완화하고,<br>추천 성능을 개선합니다.  </p>
</li>
</ul>
<p>본 연구의 주요 기여는 다음과 같이 요약됩니다:</p>
<ol>
<li><p><strong>지식 그래프 기반의 혁신적인 부정 샘플링 기법을 설계</strong><br>이 기법은 고품질 부정 레이블을 아이템에서 추출함으로써 데이터셋 활용성을 높입니다.<br>이 전략은 사용자와 아이템 간의 상호작용 정보를 보완하여<br>추천의 정확성과 효율성을 개선합니다.  </p>
</li>
<li><p><strong>지식 그래프 기반 모델 아키텍처를 구축</strong><br>그래프 신경망(GNN)을 활용하여 사용자와 아이템 간 숨겨진 고차원 관계를 학습합니다.<br>특히, <strong>게이트 주의 메커니즘(Gate Attention Layer)</strong>을 설계하여<br>의미적 관계를 구분하고 보다 정밀한 아이템 표현을 획득합니다.<br>또한, <strong>부정 주의 메커니즘(Negative Attention Mechanism)</strong>을 설계하여<br>긍정 샘플의 잡음을 효과적으로 제거하며, 사용자 표현을 강화합니다.<br>마지막으로, <strong>융합 레이어(Fusion Layer)</strong>를 도입하여 사용자와 아이템의<br>긍정 및 부정 표현 샘플에 가중치를 할당하여, 최종 표현을 예측 태스크에 활용합니다.  </p>
</li>
<li><p><strong>메타러너를 모델에 도입</strong><br>각 사용자의 선호 학습을 메타러닝 프레임워크 내의 태스크로 간주합니다.<br>기존 사용자의 태스크에서 높은 일반화 능력을 가진 사전 지식을 학습하여,<br>메타러너는 콜드스타트 태스크에 빠르게 적응하고 추천 성능을 향상시킵니다.  </p>
</li>
</ol>
<hr>
<h3 id="실험-및-성과-experiments-and-results">실험 및 성과 (Experiments and Results)</h3>
<p>콜드스타트 문제를 다양한 상황에서 해결하기 위해,<br>음악, 도서, 쇼핑 도메인에 대한 세 가지 공개 벤치마크 데이터셋에서 실험을 수행했습니다.<br>이 실험에서는 제안된 모델과 여러 기준선(Baseline) 모델을 비교하여 효과성을 검증했습니다.  </p>
<p>실험 결과, 제안된 모델이 다른 기준선 모델보다 뛰어난 성능을 보였습니다.  </p>
<hr>
<h3 id="논문의-구조-structure-of-the-paper">논문의 구조 (Structure of the Paper)</h3>
<p>이 논문의 나머지 구성은 다음과 같습니다:  </p>
<ul>
<li><strong>2장</strong>: 관련 연구 개요를 제공합니다.  </li>
<li><strong>3장</strong>: 제안된 방법을 자세히 설명합니다.  </li>
<li><strong>4장</strong>: 제안된 모델을 평가하기 위한 실험 결과를 제시합니다.  </li>
<li><strong>5장</strong>: 논문을 요약하고 잠재적인 향후 연구 방향을 논의합니다.</li>
</ul>
<h2 id="2-관련-연구-related-work">2. 관련 연구 (RELATED WORK)</h2>
<p>콜드스타트 문제에 대한 연구는 두 가지 주요 측면에 중점을 둡니다:<br>사용자 콜드스타트(User Cold-Start)와 아이템 콜드스타트(Item Cold-Start)입니다.<br>사용자 콜드스타트는 제한적이거나 전혀 상호작용 데이터가 없는 &quot;새로운&quot; 사용자에게 아이템을 추천하는 문제를 다룹니다.<br>아이템 콜드스타트는 시스템에 새롭게 추가된 &quot;새로운&quot; 아이템을 적합한 사용자에게 추천하는 문제를 다룹니다.  </p>
<p>콜드스타트 문제는 어느 측면에서든 추천 시스템의 효율성을 저하시킵니다.<br>따라서, 연구자들은 이 문제를 해결하기 위해 다양한 방법을 제시했습니다.<br>문제를 해결하려면 사용자 데이터와 아이템 정보를 효과적으로 활용해야 하며,<br>많은 제안된 솔루션은 부족한 정보를 보완하는 데 중점을 둡니다.</p>
<hr>
<h3 id="데이터-증강-활용">데이터 증강 활용</h3>
<p>최근 몇 년 동안 많은 연구자들이 사용자나 아이템 특징을 활용하여<br>데이터 증강을 통해 콜드스타트 문제를 해결하려고 했습니다.  </p>
<ul>
<li><p><strong>Anwaar 등 [1]</strong>은 암묵적 상호작용 데이터와 보조 아이템 정보를 결합하여<br>아이템 콜드스타트 문제를 해결했습니다.<br>이들은 Word2Vec [18]을 사용해 아이템 설명을 획득하고,<br>콘텐츠 임베딩을 협업 필터링에 통합하는 새로운 접근법을 제안했습니다.  </p>
</li>
<li><p><strong>Zhang 등 [35]</strong>은 행렬 분해(Matrix Factorization)와 마르코프 체인(Markov Chain)을 결합한<br>JPMC(Joint Personalized Markov Chains) 프레임워크를 제안했습니다.<br>이들은 node2vec [8] 알고리즘을 사용해 사용자 특징 표현을 사전 학습했으며,<br>네트워크 이웃을 활용해 새로운 사용자를 나타내고,<br>동적 및 정적 선호도를 공동으로 모델링하여 사용자 콜드스타트 문제를 해결했습니다.  </p>
</li>
<li><p>또한, 일부 방법은 <strong>의사 레이블(Pseudo-Labeling)</strong>을 도입하여 사용자 및 아이템 임베딩 학습을 지원했습니다.<br>예를 들어, <strong>Togashi 등 [24]</strong>은 지식 그래프를 활용한 샘플링 방법을 제안하여,<br>관찰되지 않은 샘플에 의사 레이블을 부여하고 데이터 증강을 통해 사용자와 아이템의 콜드스타트 문제를 완화했습니다.  </p>
</li>
<li><p><strong>Wu 등 [32]</strong>은 사용자 과거 상호작용 데이터를 모델링하기 위해<br>하이퍼그래프 표현을 도입했습니다.<br>이들은 하이퍼그래프를 긍정 하이퍼그래프와 부정 하이퍼그래프로 나누고,<br>부정 하이퍼그래프를 활용해 부정 임베딩을 학습함으로써<br>사용자와 아이템 표현 학습을 개선했습니다.  </p>
</li>
</ul>
<hr>
<h3 id="심층-신경망-모델-활용">심층 신경망 모델 활용</h3>
<p>최근에는 심층 신경망 모델을 활용해 다양한 보조 정보를 학습하고,<br>추천 시스템 성능을 향상시키는 연구가 활발히 이루어지고 있습니다.  </p>
<ul>
<li><p><strong>Wei 등 [29]</strong>은 협업 필터링과 신경망을 결합한 추천 모델을 제안했습니다.<br>이들은 Stacked Denoising Autoencoder(SDAE) [25]를 사용하여<br>아이템의 콘텐츠 특징을 추출했으며,<br>timeSVD++ [14] 모델에 콘텐츠 특징을 통합하여<br>아이템 콜드스타트 문제에서 사용자 선호와 아이템의 시간적 동태를 모델링했습니다.  </p>
</li>
<li><p><strong>Sun 등 [23]</strong>은 아이템 속성 정보를 활용한 새로운 콜드스타트 추천 모델을 제안했습니다.<br>이들은 생성적 적대 신경망(GAN)을 사용해,<br>특정 아이템에 관심이 있는 사용자의 표현을 직접 추출했습니다.  </p>
</li>
<li><p><strong>Li 등 [16]</strong>은 제로샷 학습(Zero-Shot Learning) 방법을 활용하여<br>콜드스타트 문제를 해결했습니다.<br>이들은 저차원 선형 오토인코더(Low-Rank Linear Autoencoder)를 제안했으며,<br>인코더는 사용자 행동을 사용자 속성으로 매핑하고,<br>디코더는 사용자 속성을 기반으로 사용자 행동을 재구성하여<br>사용자 속성 정보를 더 효과적으로 활용했습니다.  </p>
</li>
</ul>
<hr>
<h3 id="이질-데이터-활용">이질 데이터 활용</h3>
<p>아이템과 기타 엔터티 간의 풍부한 이질 데이터를 활용하는 연구도 주목받고 있습니다.  </p>
<ul>
<li><p><strong>Shi 등 [22]</strong>은 메타 경로 기반 이질 네트워크 임베딩 방법을 제안했으며,<br>이는 의미적 및 구조적 정보를 추출하여,<br>확장된 행렬 분해 모델에 활용하여 추천 성능을 향상시켰습니다.  </p>
</li>
<li><p><strong>Hu 등 [13]</strong>은 협업 주의 메커니즘(Collaborative Attention Mechanism)을 사용한<br>네트워크 모델을 도입했습니다.<br>이 모델은 사용자-아이템 상호작용 데이터를 기반으로,<br>메타 경로를 통해 컨텍스트 표현을 개선하고,<br>사용자와 아이템 표현을 더욱 향상시켰습니다.  </p>
</li>
<li><p><strong>Cai 등 [2]</strong>은 새로운 사용자, 아이템, 관련 멀티모달 정보를<br>모달리티 인식 이질 그래프로 변환하는<br>새로운 이질 그래프 신경망(Heterogeneous Graph Neural Network)을 제안했습니다.<br>이를 통해 새로운 사용자의 희소한 속성 정보를 풍부하게 만들었습니다.  </p>
</li>
</ul>
<hr>
<h3 id="메타러닝-활용">메타러닝 활용</h3>
<p>보조 정보를 사용하여 누락된 데이터를 채우는 방법은 좋은 성능을 보여줬지만,<br>데이터 가용성, 품질, 사용자 프라이버시 우려로 인해 효과가 제한될 수 있습니다.<br>따라서 연구자들은 <strong>메타러닝</strong>을 활용해 콜드스타트 문제를 해결하는 방법을 탐구하기 시작했습니다.  </p>
<ul>
<li><p><strong>MeLU (Meta-Learned User Preference Estimator)</strong> 모델 [15]은<br>MAML [6] 알고리즘을 기반으로 한 사용자 콜드스타트 추천 모델을 제안했습니다.<br>이 모델은 우수한 초기화 매개변수를 학습하여<br>새로운 사용자의 관심사와 선호에 신속히 적응할 수 있도록 합니다.  </p>
</li>
<li><p><strong>Wei 등 [30]</strong>은 MetaCF(Meta Collaborative Filtering)라는 새로운 학습 패러다임을 제안했습니다.<br>이는 사용자 보조 정보에 의존하지 않으며,<br>훈련 단계에서 사용자 중심의 서브그래프를 동적으로 샘플링하여<br>대표적인 훈련 태스크를 구성함으로써 모델 일반화를 촉진합니다.<br>이를 통해 상호작용 기록이 제한적인 새로운 사용자에 빠르게 적응할 수 있습니다.  </p>
</li>
<li><p><strong>Du 등 [5]</strong>은 지식 그래프를 결합한 새로운 메타러닝 프레임워크를 제안했습니다.<br>이 프레임워크는 두 개의 메타러너를 교대로 학습하며,<br>하나는 지식 그래프에서 의미적 관계를 학습하고,<br>다른 하나는 개별 사용자의 선호 표현을 학습합니다.  </p>
</li>
</ul>
<hr>
<h3 id="결론">결론</h3>
<p>추천 시스템의 콜드스타트 문제를 해결하기 위해 다양한 방법이 제안되었습니다.<br>여기에는 보조 정보 활용과 메타러닝 기술 도입이 포함됩니다.<br>그러나 이러한 방법에도 여전히 한계가 있으며,<br>콜드스타트 문제는 추천 시스템에서 가장 어려운 도전 과제 중 하나로 남아 있습니다.  </p>
<p>본 논문에서는 MetaKG [5]에서 영감을 받아,<br>상호작용 데이터를 풍부하게 만들기 위해 부정 레이블을 도입했습니다.<br>또한, 지식 그래프와 메타러닝을 보다 잘 결합하여<br>콜드스타트 문제를 해결하는 방법을 탐구하고,<br>콜드스타트 프레임워크의 전체 처리 과정을 최적화했습니다.  </p>
<h2 id="3-공식화-및-방법론-formulation-and-methodology">3. 공식화 및 방법론 (FORMULATION AND METHODOLOGY)</h2>
<p>본 장에서는 먼저 연구 문제를 상세히 설명하고, 제안된 모델의 개요를 제공합니다.<br>다음으로, 전체 모델의 네 가지 주요 구성 요소인 <strong>부정 샘플러(Negative Sampler)</strong>,  
<strong>지식 그래프 기반 모델 아키텍처(Knowledge Graph-Based Model Architecture)</strong>, <strong>메타러너(Meta-Learner)</strong>,  
그리고 <strong>모델 학습(Model Training)</strong>을 소개합니다.</p>
<hr>
<h3 id="31-문제-정의-problem-description">3.1 문제 정의 (Problem Description)</h3>
<p>본 논문의 초점은 지식 그래프와 메타러닝 접근법을 활용하여<br>콜드스타트 추천 성능을 향상시키는 데 있습니다.<br>연구 문제를 명확히 설명하기 위해, 본 연구와 관련된 개념을 먼저 소개하고 정의한 후,<br>해당 문제를 최적화해야 하는 동기를 설명합니다.</p>
<hr>
<h4 id="협업-지식-그래프-collaborative-knowledge-graph">협업 지식 그래프 (Collaborative Knowledge Graph)</h4>
<p>제안된 CRKM 프레임워크는 사용자-아이템 상호작용 이분 그래프와 지식 그래프를<br>결합한 <strong>협업 지식 그래프(Collaborative Knowledge Graph)</strong>를 중심으로 설계되었습니다.<br>CRKM의 특징 엔지니어링 설계는 다음과 같이 설명됩니다:</p>
<ol>
<li><p><strong>사용자-아이템 상호작용 이분 그래프 (User-Item Interaction Bipartite Graph)</strong><br>추천 시스템에서는 일반적으로 사용자 집합 $\mathcal{U} = {u_i}<em>{i=1}^M$,<br>아이템 집합 $\mathcal{I} = {v_j}</em>{j=1}^N$,<br>그리고 사용자-아이템 선호도를 나타내는 상호작용 행렬 $R \in \mathbb{R}^{M \times N}$이 주어집니다.  </p>
<p>사용자 $u$와 아이템 $v$ 간의 상호작용이 존재하면 $r_{u,v} = 1$,<br>그렇지 않으면 $r_{u,v} = 0$입니다.<br>사용자가 아이템과 상호작용하는 관계는 삼중항(triplet)으로 표현할 수 있습니다.<br>따라서, 사용자-아이템 상호작용 이분 그래프는 다음과 같이 정의됩니다:</p>
<p>$$\mathcal{G}<em>1 = {(u, r, v) | u \in \mathcal{U}, v \in \mathcal{I}, r</em>{u,v} \in R}$$</p>
</li>
<li><p><strong>지식 그래프 (Knowledge Graph)</strong><br>사용자-아이템 상호작용 외에도, 아이템의 보조 정보를 보완하고<br>사용자와 아이템 간 고차원 관계를 포착하기 위해 지식 그래프를 도입합니다.<br>지식 그래프는 일반적으로 삼중항으로 표현되며, 현실 세계의 사실을 설명합니다.<br>정의는 다음과 같습니다:</p>
<p>$$\mathcal{G}_2 = {(h, r, t) | h, t \in \mathcal{E}, r \in \mathcal{R}}$$</p>
<p>여기서 $(h, r, t)$는 헤드 엔터티 $h$와 테일 엔터티 $t$ 간의 관계 $r$을 나타냅니다.<br>$\mathcal{E}$는 엔터티 집합, $\mathcal{R}$은 관계 집합입니다.</p>
</li>
<li><p><strong>아이템-엔터티 정렬 (Item-Entity Alignment)</strong><br>사용자-아이템 상호작용 이분 그래프 $\mathcal{G}_1$과 지식 그래프 $\mathcal{G}_2$를 기반으로,<br>아이템과 엔터티의 정렬 집합 $\mathcal{A}$를 정의합니다.<br>$$\mathcal{A} = {(v, e) | v \in \mathcal{I}, e \in \mathcal{E}}$$<br>여기서 $(v, e)$는 아이템 $v$와 엔터티 $e$ 간의 정렬을 나타냅니다.<br>이는 모든 아이템이 지식 그래프의 엔터티에 포함됨을 의미합니다.</p>
</li>
<li><p><strong>협업 지식 그래프 정의 (Definition of Collaborative Knowledge Graph)</strong><br>사용자-아이템 상호작용 이분 그래프 $\mathcal{G}_1$과 지식 그래프 $\mathcal{G}_2$를<br>아이템-엔터티 정렬 집합 $\mathcal{A}$를 기반으로 결합하여 협업 지식 그래프를 정의합니다.  </p>
<p>$$\mathcal{G} = {(h, r, t) | h, t \in \mathcal{E}&#39;, r \in \mathcal{R}&#39;}$$  </p>
<p>여기서 $\mathcal{E}&#39; = \mathcal{E} \cup \mathcal{U}$는 엔터티와 사용자를 포함하고,<br>$\mathcal{R}&#39; = \mathcal{R} \cup \mathcal{I}$는 관계와 사용자-아이템 상호작용을 포함합니다.  </p>
<p><strong>긍정 협업 지식 그래프 ($\mathcal{G}^+$)</strong>는  
긍정 사용자-아이템 상호작용 이분 그래프 $\mathcal{G}_1^+$를 사용하여 구축되며,<br><strong>부정 협업 지식 그래프 ($\mathcal{G}^-$)</strong>는  
부정 샘플링을 통해 얻어진 부정 사용자-아이템 상호작용 이분 그래프 $\mathcal{G}_1^-$를 사용하여 구축됩니다.</p>
</li>
</ol>
<hr>
<h3 id="최적화-문제-정의-optimization-problem-definition">최적화 문제 정의 (Optimization Problem Definition)</h3>
<p>앞서 설명한 협업 지식 그래프(CKG)를 기반으로,<br>추천 시스템에서 콜드스타트 문제를 해결하기 위한 최적화 문제는 다음과 같이 정의됩니다:</p>
<ol>
<li><p><strong>입력(Input):</strong>  </p>
<ul>
<li>긍정 및 부정 협업 지식 그래프 $\mathcal{G}^+$와 $\mathcal{G}^-$  </li>
<li>이는 긍정 및 부정 사용자-아이템 상호작용 이분 그래프 $\mathcal{G}_1^+$와 $\mathcal{G}_1^-$,<br>그리고 지식 그래프 $\mathcal{G}_2$를 포함합니다.</li>
</ul>
</li>
<li><p><strong>출력(Output):</strong>  </p>
<ul>
<li>함수 $\hat{f}_{u,v}$는 사용자 $u$가 상호작용하지 않은 아이템 $v$에 대한 평점을 예측합니다.</li>
</ul>
</li>
</ol>
<hr>
<p>콜드스타트 문제는 다음 세 가지로 나뉩니다:</p>
<ol>
<li><strong>사용자 콜드스타트(UC):</strong> 새로운 사용자와 기존 아이템 간 상호작용 예측.  </li>
<li><strong>아이템 콜드스타트(IC):</strong> 기존 사용자와 새로운 아이템 간 상호작용 예측.  </li>
<li><strong>사용자-아이템 콜드스타트(UIC):</strong> 새로운 사용자와 새로운 아이템 간 상호작용 예측.  </li>
</ol>
<p>본 논문의 목표는 지식 그래프와 메타러닝을 기반으로 한 추천 모델을 구축하여,<br>위 세 가지 콜드스타트 문제(UC, IC, UIC)를 해결하는 것입니다.</p>
<h2 id="32-crkm-개요-overview-of-crkm">3.2 CRKM 개요 (Overview of CRKM)</h2>
<p>본 논문에서 제안한 CRKM 프레임워크의 전체 구조는 <strong>그림 1</strong>에 나와 있으며,<br>이 프레임워크는 <strong>부정 샘플러(Negative Sampler)</strong>, <strong>지식 그래프 기반 모델 아키텍처(Base Model)</strong>,  
<strong>메타러너(Meta-Learner)</strong>의 세 가지 구성 요소로 나뉩니다.</p>
<p><img src="https://velog.velcdn.com/images/meo_sun/post/36b173e2-28b4-47b2-a74a-a87e88417cfe/image.png" alt="Figure 1: CRKM Framework Overview"><br><strong>그림 1. CRKM 프레임워크 개요</strong></p>
<ul>
<li><p><strong>부정 샘플러</strong>는 지식 그래프와 아이템의 인기도 정보를 활용하여<br>사용자가 상호작용하지 않은 아이템에서 부정 레이블을 샘플링하여<br>콜드스타트 훈련 데이터의 희소성을 보완합니다.</p>
</li>
<li><p><strong>지식 그래프 기반 모델 아키텍처(Base Model)</strong>는  
그래프 신경망(GNN)을 사용하여 사용자와 아이템의 특징 표현을 생성하고,<br>선호도 점수를 예측합니다.<br>이 아키텍처는 <strong>임베딩 레이어(Embedding Layer)</strong>, <strong>주의 집계 레이어(Attention Aggregation Layer)</strong>,  
<strong>융합 레이어(Fusion Layer)</strong>, <strong>예측 레이어(Prediction Layer)</strong>로 구성됩니다.</p>
</li>
<li><p><strong>메타러너</strong>는 <strong>지역(Local) 업데이트</strong>와 <strong>글로벌(Global) 업데이트</strong>를 사용하여<br>모델의 초기 매개변수를 학습합니다.  </p>
<ul>
<li><strong>지역 업데이트(Local Update)</strong>는 그림 1의 주황색 선으로 표시되며,<br>각 태스크에서 사용자의 개인화된 선호도를 학습합니다.  </li>
<li><strong>글로벌 업데이트(Global Update)</strong>는 그림 1의 검은색 선으로 표시되며,<br>다양한 태스크에 걸쳐 지식 그래프의 공통 의미 표현을 학습합니다.<br>메타러너는 기존 사용자 태스크에서 강력한 일반화 능력을 가진 사전 지식을 학습함으로써<br>콜드스타트 태스크에 빠르게 적응하고 추천 성능을 향상시킵니다.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="33-부정-샘플러-negative-sampler">3.3 부정 샘플러 (Negative Sampler)</h2>
<p>추천 시스템의 회상(Recall) 과정에서 기존 데이터를 효율적으로 활용하는 것은<br>널리 사용되는 효과적인 접근 방식입니다.<br>따라서 본 논문에서는 사용자-아이템 상호작용 데이터를 활용하고,<br>부정적으로 샘플링된 데이터(상호작용 데이터의 보완 집합)를<br>전이하여 데이터 증강을 수행합니다 [32].</p>
<hr>
<h3 id="기존-부정-샘플링-기법">기존 부정 샘플링 기법</h3>
<p>일반적으로 사용되는 휴리스틱 부정 레이블 샘플링 방법에는<br><strong>랜덤 부정 샘플링(Random Negative Sampling)</strong>과  
<strong>인기도 기반 부정 샘플링(Popularity-Based Negative Sampling)</strong>이 있습니다.</p>
<ol>
<li><p><strong>랜덤 부정 샘플링(Random Negative Sampling)</strong>  </p>
<ul>
<li>이 방법은 샘플링 풀에 있는 모든 아이템을 동일하게 취급하며,<br>동일한 확률로 샘플링합니다 [20].  </li>
<li>이해하기 쉽고 구현이 간단하며 샘플링 효율이 높아,<br>현재까지 가장 널리 사용되는 샘플링 방법입니다.</li>
</ul>
</li>
<li><p><strong>인기도 기반 부정 샘플링(Popularity-Based Negative Sampling)</strong>  </p>
<ul>
<li>이 방법은 훈련 효율을 높이기 위해,<br>인기가 높은 아이템을 부정 샘플로 선택하는 방식입니다 [4].  </li>
<li>이는 롱테일(long-tail) 아이템(예: 콜드스타트 아이템)을 부정 샘플로 선택하는<br>빈도를 줄이며, 흥미로울 가능성이 있는 아이템이 부정 샘플로 오분류되는 것을 방지합니다.</li>
</ul>
</li>
</ol>
<p>인기도 기반 부정 샘플링은 랜덤 샘플링보다 더 많은 정보를 제공하며,<br>다양한 모델에서 부정 샘플링을 위해 널리 사용됩니다.</p>
<hr>
<h3 id="지식-그래프-기반-부정-샘플링-knowledge-graph-based-sampling">지식 그래프 기반 부정 샘플링 (Knowledge Graph-Based Sampling)</h3>
<p>본 논문에서는 <strong>지식 그래프 경로를 활용한 부정 샘플링</strong> 기법을 도입하여,<br>부정 레이블 샘플링의 범위를 좁히고, 보다 정확한 부정 샘플을 얻습니다.<br>이 방법은 다음 두 단계로 구성됩니다.</p>
<h4 id="1-지식-그래프-기반-샘플링">1. 지식 그래프 기반 샘플링</h4>
<p>지식 그래프에서는 인접 엔터티가 더 유사하며,<br>사용자는 상호작용한 아이템의 고차 이웃에 있는 아이템에<br>더 관심을 가질 가능성이 높습니다.<br>이에 따라 지식 그래프에서 <strong>너비 우선 탐색(Breadth-First Search, BFS)</strong> 알고리즘을 사용하여,<br>각 상호작용 아이템에서 비상호작용 아이템으로 이어지는 경로를 탐색합니다.<br>사용자를 루트 노드로 설정하고, 사용자가 상호작용한 모든 아이템을 탐색하며,<br>이 아이템들의 경로를 지식 그래프에서 순회합니다.<br>검색 경로 외부에 있는 아이템에서 부정 레이블을 추출합니다.  </p>
<p>특히, 각 사용자-아이템 상호작용 쌍 $(u, v)$에 대해<br>아이템 $v$를 루트 노드로 설정한 후, 지식 그래프 $\mathcal{G}_2$에서 경로를 탐색합니다.  </p>
<p>$$
h_0 \xrightarrow{r_1} h_1 \xrightarrow{r_2} \cdots \xrightarrow{r_k} h_k
$$</p>
<p>여기서 $h_0 \in \mathcal{E}$, $h_k \in \mathcal{E}$, $r_k \in \mathcal{R}$이며,<br>$k$는 탐색할 이웃 차수의 수를 나타내며, $k = 6$입니다.<br>즉, 상호작용 아이템의 6차 이웃을 초과하는 아이템에서 부정 레이블을 추출합니다.<br>이러한 아이템은 사용자의 관심에서 더 멀리 떨어져 있는 것으로 간주됩니다.</p>
<h4 id="2-인기도-기반-샘플링">2. 인기도 기반 샘플링</h4>
<p>지식 그래프 탐색을 통해 아이템의 고차 이웃을 얻은 후,<br>해당 아이템의 6차 이웃을 제외하고 <strong>인기도 기반 샘플링</strong>을 수행합니다.<br>아이템 인기도는 다양한 방법으로 정의될 수 있지만,<br>본 논문에서는 아이템의 과거 상호작용 횟수로 정의합니다.<br>구체적으로, 아이템이 선택된 횟수가 많을수록 인기도가 높아집니다.<br>특정 아이템의 인기도는 다음 공식으로 계산됩니다:</p>
<p>$$
P_i = \frac{c_i}{\sum_{j \in \mathcal{I}} c_j}
$$</p>
<p>여기서 $c_i$는 아이템 $i$가 사용자와 상호작용한 횟수를 나타내며,<br>$\sum_{j \in \mathcal{I}} c_j$는 모든 아이템의 총 상호작용 횟수입니다.</p>
<hr>
<h3 id="요약">요약</h3>
<p>본 논문에서 제안된 부정 샘플링의 최적화 동기는<br>지식 그래프를 기반으로 사용자 상호작용 아이템의 6차 이웃을 검색한 후,<br>인기도에 따라 확률적으로 샘플링하여 부정 협업 지식 그래프($\mathcal{G}^-$)를 구성하는 데 있습니다.</p>
<h2 id="34-지식-그래프-기반-모델-아키텍처-knowledge-graph-based-model-architecture">3.4 지식 그래프 기반 모델 아키텍처 (Knowledge Graph-Based Model Architecture)</h2>
<p>본 논문에서 제안한 <strong>지식 그래프 기반 모델 아키텍처(Base Model)</strong>는  
아이템 정보를 풍부하게 만들고, 지식 그래프 내 고차원 관계를<br>엔드투엔드 방식으로 학습하여, 추천 시스템에서 콜드스타트 문제를 해결합니다.  </p>
<p><strong>그림 2</strong>는 이 기본 모델의 구조를 보여주며, 네 가지 주요 구성 요소로 구성됩니다:</p>
<ol>
<li><p><strong>임베딩 레이어(Embedding Layer)</strong>:  
TransR 알고리즘 [17]을 사용하여 긍정 및 부정 협업 지식 그래프의 노드와 관계에 대한 임베딩 표현을 학습합니다.</p>
</li>
<li><p><strong>주의 집계 레이어(Attention Aggregation Layer)</strong>:  
게이트 주의 모듈(Gated Attention Module)과 부정 주의 모듈(Negative Attention Module)을 사용하여<br>아이템 및 사용자 노드 이웃의 임베딩 표현을 학습합니다.<br>이러한 표현은 집계 모듈에서 노드 자체의 임베딩과 통합됩니다.</p>
</li>
<li><p><strong>융합 레이어(Fusion Layer)</strong>:  
협업 지식 그래프에서 학습된 사용자 및 아이템의 긍정적, 부정적 노드 표현을 결합하여<br>노드의 최종 표현을 얻습니다.</p>
</li>
<li><p><strong>예측 레이어(Prediction Layer)</strong>:  
사용자의 아이템 선호도를 예측하기 위해 사용자와 아이템의 최종 표현을 사용합니다.
<img src="https://velog.velcdn.com/images/meo_sun/post/41544f22-8de8-40b5-9c13-4d68eb5599ae/image.png" alt=""></p>
</li>
</ol>
<hr>
<h3 id="341-임베딩-레이어-embedding-layer">3.4.1 임베딩 레이어 (Embedding Layer)</h3>
<p><img src="https://velog.velcdn.com/images/meo_sun/post/983cd05a-2afe-41c3-ad0f-0e95b9883f21/image.png" alt="">
지식 그래프의 엔터티와 관계 임베딩은 그래프의 구조적 정보를 보존합니다.<br>본 논문에서는 긍정 및 부정 협업 지식 그래프에서 TransR 알고리즘을 사용하여<br>엔터티와 관계에 대한 임베딩을 학습합니다.<br><strong>그림 3</strong>은 임베딩 레이어를 보여줍니다.  </p>
<p>긍정 협업 지식 그래프 내 삼중항 $(h, r, t)$에 대해,<br>해당 에너지 점수(energy score)는 다음과 같이 정의됩니다:</p>
<p>$$
E(h, r, t) = ||\mathbf{M}_r \mathbf{h}^+ + \mathbf{r}^+ - \mathbf{M}_r \mathbf{t}^+||_2^2
$$</p>
<p>여기서:</p>
<ul>
<li>$\mathbf{h}^+, \mathbf{t}^+ \in \mathbb{R}^d$는 초기 엔터티 임베딩,</li>
<li>$\mathbf{r}^+ \in \mathbb{R}^d$는 초기 관계 임베딩,</li>
<li>$\mathbf{M}_r \in \mathbb{R}^{d \times d}$는 엔터티 공간에서 관계 공간으로의 투영 행렬입니다.</li>
</ul>
<p>이 에너지 점수를 사용하여 훈련하며,<br>낮은 에너지 점수는 해당 삼중항이 참일 가능성이 높음을 나타냅니다.</p>
<hr>
<h3 id="342-주의-집계-레이어-attention-aggregation-layer">3.4.2 주의 집계 레이어 (Attention Aggregation Layer)</h3>
<p><img src="https://velog.velcdn.com/images/meo_sun/post/45833a5a-4532-4276-8423-61da4a53ae07/image.png" alt=""></p>
<p>이 레이어는 긍정 및 부정 협업 지식 그래프 모두에 대해 동일한 정보 전달 및 집계 연산을 수행합니다.<br>긍정 협업 지식 그래프를 예로 들어 설명하겠습니다.<br><strong>그림 4</strong>는 이 레이어가 게이트 주의 모듈(Gated Attention Module),<br>부정 주의 모듈(Negative Attention Module), 그리고 집계 모듈(Aggregation Module)로 구성됨을 보여줍니다.  </p>
<h4 id="게이트-주의-모듈-gated-attention-module">게이트 주의 모듈 (Gated Attention Module)</h4>
<p>협업 지식 그래프에서, 아이템 엔터티는 두 가지 유형의 이웃을 가집니다:</p>
<ul>
<li><strong>사용자 이웃(User Neighbors):</strong> 아이템의 잠재적 요구사항을 제공합니다.</li>
<li><strong>엔터티 이웃(Entity Neighbors):</strong> 보조 정보를 제공합니다.</li>
</ul>
<p>아이템 엔터티의 표현을 더 정확히 학습하기 위해,<br>이웃 표현 집계 과정에서 게이트 메커니즘을 도입하여<br>두 이웃 유형 간의 차이를 반영합니다.</p>
<p>사용자-아이템 삼중항은 다음과 같이 정의됩니다:
$$
\mathcal{T}_u = {(u, r, v) | (u, r, v) \in \mathcal{G}^+, u \in \mathcal{U} }
$$</p>
<p>엔터티-아이템 삼중항은 다음과 같이 정의됩니다:
$$
\mathcal{T}_e = {(v, r, h) | (v, r, h) \in \mathcal{G}^+, h \in \mathcal{E} }
$$</p>
<p>사용자-아이템 삼중항을 예로 들면, 정보 전달을 위한 이웃 가중치 집계 과정은 다음과 같이 표현됩니다:
$$
\mathbf{e}<em>{\text{user}}^+ = \sum</em>{(u, r, v) \in \mathcal{T}_u} \alpha(u, r, v) \mathbf{u}^+
$$</p>
<p>여기서:</p>
<ul>
<li>$\mathbf{u}^+$는 사용자 노드의 특징 표현,</li>
<li>$\mathbf{e}_{\text{user}}^+$는 아이템 노드의 사용자 이웃 집계 표현,</li>
<li>$\alpha(u, r, v)$는 주의 가중치로, 관계 $r$ 아래에서 사용자 $u$가 아이템 $v$에 미치는 중요도를 나타냅니다.</li>
</ul>
<p>주의 가중치는 다음과 같이 계산됩니다:
$$
\alpha&#39;(u, r, v) = \text{tanh}(\mathbf{M}<em>r \mathbf{u}^+ \cdot \mathbf{v}^+)
$$
$$
\alpha(u, r, v) = \frac{\exp(\alpha&#39;(u, r, v))}{\sum</em>{(u, r, v) \in \mathcal{T}_u} \exp(\alpha&#39;(u, r, v))}
$$</p>
<p>유사한 방식으로, 엔터티-아이템 삼중항에 대한 이웃 표현 집계는 $\mathbf{e}<em>{\text{entity}}^+$로 표현됩니다.<br>이 두 유형의 이웃 표현은 게이트 신호 $\mathbf{z}$를 사용하여 결합됩니다:
$$
\mathbf{z} = \sigma(\mathbf{W}_u \mathbf{e}</em>{\text{user}}^+ + \mathbf{W}<em>e \mathbf{e}</em>{\text{entity}}^+)
$$
$$
\mathbf{e}<em>v^+ = \mathbf{z} \cdot \mathbf{e}</em>{\text{user}}^+ + (1 - \mathbf{z}) \cdot \mathbf{e}_{\text{entity}}^+
$$</p>
<hr>
<h3 id="343-융합-레이어-fusion-layer">3.4.3 융합 레이어 (Fusion Layer)</h3>
<p><img src="https://velog.velcdn.com/images/meo_sun/post/2bdab7c1-6691-4138-bb90-9fc6e25993cf/image.png" alt=""></p>
<p>긍정적 및 부정적 노드 표현을 얻은 후,<br>이 레이어는 각 노드의 최종 표현을 계산하기 위해 서로 다른 가중치를 학습합니다:
$$
\mathbf{h} = \mathbf{w}^+ \cdot \mathbf{h}^+ + \mathbf{w}^- \cdot \mathbf{h}^-
$$</p>
<p>여기서 $\mathbf{h}^+, \mathbf{h}^-$는 각각 긍정적 및 부정적 노드 표현,<br>$\mathbf{w}^+, \mathbf{w}^-$는 학습 가능한 가중치입니다.</p>
<hr>
<h3 id="344-예측-레이어-prediction-layer">3.4.4 예측 레이어 (Prediction Layer)</h3>
<p><img src="https://velog.velcdn.com/images/meo_sun/post/9e3ed950-536a-4435-9f68-58d72d160940/image.png" alt=""></p>
<p>모든 레이어의 표현을 결합하여 사용자와 아이템의 최종 표현을 얻습니다:
$$
\mathbf{h}_u^* = \text{concat}(\mathbf{h}_u^1, \mathbf{h}_u^2, \ldots, \mathbf{h}_u^L)
$$
$$
\mathbf{h}_v^* = \text{concat}(\mathbf{h}_v^1, \mathbf{h}_v^2, \ldots, \mathbf{h}_v^L)
$$</p>
<p>최종적으로, 사용자와 아이템 표현 간 내적을 통해 선호 점수를 예측합니다:
$$
\hat{r}_{u,v} = \mathbf{h}_u^* \cdot \mathbf{h}_v^*
$$</p>
<h2 id="344-예측-레이어-prediction-layer-1">3.4.4 예측 레이어 (Prediction Layer)</h2>
<p>$L$개의 전파 및 집계 레이어를 거친 후,<br>사용자와 아이템에 대한 다층 표현을 각각 다음과 같이 얻습니다:
$$
\mathbf{h}_u^1, \mathbf{h}_u^2, \ldots, \mathbf{h}_u^L
$$
$$
\mathbf{h}_v^1, \mathbf{h}_v^2, \ldots, \mathbf{h}_v^L
$$</p>
<p>각 레이어의 표현은 하나의 벡터로 연결됩니다:
$$
\mathbf{h}_u^* = \text{concat}(\mathbf{h}_u^1, \mathbf{h}_u^2, \ldots, \mathbf{h}_u^L)
$$
$$
\mathbf{h}_v^* = \text{concat}(\mathbf{h}_v^1, \mathbf{h}_v^2, \ldots, \mathbf{h}_v^L)
$$</p>
<p>이 연결된 표현을 통해 사용자와 아이템의 특징 표현을 풍부하게 하고,<br>$L$의 값을 조정하여 전파 범위를 제어할 수 있습니다.</p>
<p>마지막으로, <strong>그림 6</strong>에 표시된 대로,<br>사용자와 아이템 표현 간의 내적을 수행하여 선호 점수를 예측합니다:
$$
\hat{r}_{u,v} = \mathbf{h}_u^* \cdot \mathbf{h}_v^*
$$</p>
<hr>
<h2 id="35-메타러너-meta-learner">3.5 메타러너 (Meta Learner)</h2>
<p>콜드스타트 시나리오에서 평점 예측을 위한 모델 초기화를 보다 잘 수행하기 위해,<br>CRKM 프레임워크는 MAML [6] 메타러닝 알고리즘을 도입하여<br>모델 매개변수 학습 과정을 최적화합니다.</p>
<p>특히, 각 사용자의 선호 학습을 메타러닝 태스크로 간주하며,<br>이를 $\mathcal{T}_u = (\mathcal{S}_u, \mathcal{Q}_u)$로 표시합니다.<br>여기서 $\mathcal{S}_u$는 <strong>지원 집합(Support Set)</strong>, $\mathcal{Q}_u$는 <strong>쿼리 집합(Query Set)</strong>을 나타냅니다.<br>학습 과정에서, 사용자 $u$의 상호작용 아이템 집합에서<br>지원 집합과 쿼리 집합을 샘플링하며, 이 두 집합은 상호 배타적입니다.</p>
<p>훈련 태스크 집합 $\mathcal{T}<em>{train}$ 내에서,<br>공유 초기 매개변수를 학습한 후 이를 새로운 태스크(테스트 태스크 $\mathcal{T}</em>{test}$)에 적용하여<br>아이템 평점을 예측합니다.</p>
<hr>
<h3 id="메타러너의-손실-함수">메타러너의 손실 함수</h3>
<p>CRKM의 메타러너 손실 함수는 두 부분으로 구성됩니다:</p>
<ol>
<li><p><strong>사용자 평점 예측을 위한 BPR 손실 (Bayesian Personalized Ranking, $L_{BPR}$):</strong><br>각 사용자의 선호도를 학습하기 위해 사용됩니다.</p>
</li>
<li><p><strong>지식 그래프 임베딩을 위한 쌍별 순위 손실 (Pairwise Ranking Loss, $L_{KGE}$):</strong><br>지식 그래프의 의미적 지식을 학습하기 위해 사용됩니다.</p>
</li>
</ol>
<p>손실 함수는 다음과 같이 정의됩니다:
$$
L = L_{BPR} + L_{KGE}
$$</p>
<h4 id="bpr-손실-l_bpr">BPR 손실 ($L_{BPR}$)</h4>
<p>사용자 평점 예측을 위한 BPR 손실은 다음과 같이 표현됩니다:
$$
L_{BPR} = - \sum_{(u, i, j) \in D} \ln \sigma(\hat{r}<em>{u,i} - \hat{r}</em>{u,j})
$$</p>
<p>여기서:</p>
<ul>
<li>$D = {(u, i, j) | (u, i) \in \mathcal{G}^+, (u, j) \in \mathcal{G}^-}$는<br>사용자 $u$가 상호작용한 긍정 아이템($\mathcal{G}^+$)과<br>상호작용하지 않은 부정 아이템($\mathcal{G}^-$)의 쌍입니다.</li>
<li>$\sigma(\cdot)$는 시그모이드 함수입니다.</li>
</ul>
<h4 id="쌍별-순위-손실-l_kge">쌍별 순위 손실 ($L_{KGE}$)</h4>
<p>지식 그래프 임베딩을 위한 쌍별 순위 손실은 다음과 같이 표현됩니다:
$$
L_{KGE} = - \sum_{(h, r, t, t&#39;) \in D_{KG}} \ln \sigma(f(h, r, t&#39;) - f(h, r, t))
$$</p>
<p>여기서:</p>
<ul>
<li>$D_{KG} = {(h, r, t, t&#39;) | (h, r, t) \in \mathcal{G}, (h, r, t&#39;) \notin \mathcal{G}}$는<br>지식 그래프의 삼중항 $(h, r, t)$과 잘못된 삼중항 $(h, r, t&#39;)$의 쌍입니다.</li>
<li>$f(h, r, t)$는 삼중항의 점수를 계산하는 함수입니다.</li>
<li>$\sigma(\cdot)$는 시그모이드 함수입니다.</li>
</ul>
<hr>
<h3 id="메타-학습-과정">메타 학습 과정</h3>
<p>모델의 매개변수 집합은 $\theta = {\phi, \psi}$로 정의되며:</p>
<ul>
<li>$\phi$는 <strong>임베딩 레이어</strong>의 매개변수,</li>
<li>$\psi$는 <strong>주의 집계 레이어</strong>와 <strong>융합 레이어</strong>의 매개변수를 나타냅니다.</li>
</ul>
<h4 id="지역-업데이트-local-update">지역 업데이트 (Local Update)</h4>
<p>주의 집계 레이어와 융합 레이어의 매개변수 $\psi$는<br>지원 집합에서 BPR 손실을 기반으로 다음과 같이 업데이트됩니다:
$$
\psi \leftarrow \psi - \alpha \nabla_{\psi} L_{BPR}(\psi, \mathcal{S}_u)
$$</p>
<p>여기서 $\alpha$는 학습률(learning rate)입니다.</p>
<h4 id="글로벌-업데이트-global-update">글로벌 업데이트 (Global Update)</h4>
<p>쿼리 집합에서 $\psi$를 최적화하여 업데이트를 수행합니다:
$$
\psi&#39; \leftarrow \psi - \beta \sum_{\mathcal{T}<em>u \in \mathcal{T}</em>{train}} \nabla_{\psi} L_{BPR}(\psi, \mathcal{Q}_u)
$$</p>
<p>또한, 임베딩 레이어의 매개변수 $\phi$는<br>지식 그래프 임베딩 손실 $L_{KGE}$를 사용하여 다음과 같이 업데이트됩니다:
$$
\phi&#39; \leftarrow \phi - \beta \nabla_{\phi} L_{KGE}(\phi)
$$</p>
<p>여기서 $\beta$는 글로벌 업데이트를 위한 학습률입니다.</p>
<hr>
<h3 id="메타-학습-알고리즘-algorithm-1">메타 학습 알고리즘 (Algorithm 1)</h3>
<p><strong>알고리즘 1: 메타 학습 과정</strong></p>
<ol>
<li><p><strong>입력:</strong>  </p>
<ul>
<li>긍정 및 부정 협업 지식 그래프 $\mathcal{G}^+$와 $\mathcal{G}^-$  </li>
<li>메타 학습 태스크 집합 $\mathcal{T}_{train}$  </li>
<li>초기 모델 매개변수 $\theta = {\phi, \psi}$  </li>
<li>학습률 $\alpha$, $\beta$</li>
</ul>
</li>
<li><p><strong>출력:</strong>  </p>
<ul>
<li>새로운 태스크에 대한 모델 매개변수 $\theta&#39; = {\phi&#39;, \psi&#39;}$</li>
</ul>
</li>
<li><p><strong>초기화:</strong>  </p>
<ul>
<li>모델 매개변수 $\theta$</li>
</ul>
</li>
<li><p><strong>반복:</strong>  </p>
<ul>
<li>$\mathcal{T}<em>u \in \mathcal{T}</em>{train}$에서 지원 및 쿼리 집합 샘플링  </li>
<li>지역 업데이트: $\psi \leftarrow \psi - \alpha \nabla_{\psi} L_{BPR}(\psi, \mathcal{S}_u)$  </li>
<li>글로벌 업데이트:<br>$\psi&#39; \leftarrow \psi - \beta \nabla_{\psi} L_{BPR}(\psi, \mathcal{Q}<em>u)$<br>$\phi&#39; \leftarrow \phi - \beta \nabla</em>{\phi} L_{KGE}(\phi)$</li>
</ul>
</li>
</ol>
<hr>
<h3 id="메타-학습-후-테스트">메타 학습 후 테스트</h3>
<p>훈련 후, 모델은 초기 매개변수 $\theta&#39;$를 얻습니다.<br>테스트 태스크 $\mathcal{T}<em>{test}$의 지원 집합에서 $\theta&#39;$를 미세 조정하여<br>다양한 콜드스타트 시나리오에 적응합니다:
$$
\min</em>{\theta&#39;} \sum_{\mathcal{T}<em>u \in \mathcal{T}</em>{test}} L_{BPR}(\theta&#39;, \mathcal{S}<em>u) + L</em>{KGE}(\theta&#39;)
$$</p>
<h2 id="4-실험-experiments">4. 실험 (EXPERIMENTS)</h2>
<p>이 장에서는 먼저 실험 환경을 설명한 후, 제안된 CRKM의 실험 결과를 제시하고, 결과의 합리성을 분석합니다.<br>실험은 다음 세 부분으로 구성됩니다:</p>
<ol>
<li>비교 실험(Comparative Experiments)  </li>
<li>제거 실험(Ablation Experiments)  </li>
<li>매개변수 설정 실험(Parameter Setting Experiments)</li>
</ol>
<p>주요 목표는 다음의 연구 질문(Research Questions, RQs)을 해결하는 것입니다:</p>
<ul>
<li><strong>RQ1</strong>: 본 논문에서 제안한 CRKM 프레임워크는 다양한 데이터셋 및 콜드스타트 시나리오에서<br>다른 기준선 모델보다 우수한가요?</li>
<li><strong>RQ2</strong>: CRKM 프레임워크의 부정 샘플러, 부정 주의 모듈, 융합 레이어, 메타러너와 같은<br>다양한 구성 요소가 모델 성능에 어떻게 영향을 미치나요?</li>
<li><strong>RQ3</strong>: CRKM 프레임워크에 대한 하이퍼파라미터 설정은 모델 성능에 어떻게 영향을 미치나요?</li>
</ul>
<hr>
<h3 id="41-실험-환경-experimental-setup">4.1 실험 환경 (Experimental Setup)</h3>
<h4 id="411-데이터셋-datasets">4.1.1 데이터셋 (Datasets)</h4>
<p>CRKM 프레임워크의 효과를 평가하기 위해, 다음 세 개의 벤치마크 데이터셋을 사용했습니다:</p>
<ol>
<li><p><strong>Amazon-book</strong>:  
Amazon Reviews 데이터셋은 널리 사용되는 추천 데이터셋입니다.<br>본 논문에서는 Amazon Books Reviews 데이터셋을 선택했으며,<br>이는 사용자 ID, 도서 ID, 사용자 평점, 타임스탬프를 포함합니다.<br>데이터 품질을 보장하기 위해, 사용자와 아이템 모두 최소 10회 이상의 상호작용이 있는 데이터를 사용했습니다.</p>
</li>
<li><p><strong>Last-FM</strong>:  
Last-FM 음악 플랫폼에서 제공된 데이터셋으로,<br>트랙에 대한 사용자 평점 없이 사용자 청취 기록을 포함합니다.<br>이 데이터셋은 암묵적 피드백을 다루는 추천 시스템에서 대표적인 데이터셋입니다.<br>데이터는 사용자 ID, 트랙 ID, 아티스트 및 앨범 정보, 트랙 청취 타임스탬프를 포함하며,<br>최소 10회 이상의 상호작용 데이터만 사용되었습니다.</p>
</li>
<li><p><strong>Yelp2018</strong>:  
Yelp 데이터셋은 다양한 비즈니스에 대한 사용자 평점을 포함합니다.<br>본 논문에서는 2018년 Yelp Challenge 데이터셋을 사용했으며,<br>사용자 ID, 비즈니스 ID, 비즈니스 평점, 평점 타임스탬프를 포함합니다.<br>사용자와 아이템 모두 최소 10회 이상의 상호작용이 있는 데이터를 사용했습니다.</p>
</li>
</ol>
<p>각 데이터셋에 대해 아이템 지식 그래프도 구축했습니다:</p>
<ul>
<li>Amazon-Book과 Last-FM 데이터셋의 지식 그래프는 Freebase를 기반으로 구축했으며,<br>KB4Rec [36]에서 설명된 전처리 방법을 사용해 아이템을 엔터티에 매핑했습니다.</li>
<li>Yelp2018 데이터셋의 경우, 지역 비즈니스 정보 네트워크에서 아이템 정보를 추출해<br>비즈니스 위치와 카테고리와 같은 세부 정보를 포함하는 지식 그래프를 생성했습니다.</li>
</ul>
<p><strong>표 1</strong>은 세 데이터셋의 통계 정보를 요약합니다.</p>
<table>
<thead>
<tr>
<th>Dataset</th>
<th>Users</th>
<th>Items</th>
<th>Interactions</th>
<th>Entities</th>
<th>Relations</th>
<th>Triplets</th>
</tr>
</thead>
<tbody><tr>
<td>Yelp2018</td>
<td>45919</td>
<td>45538</td>
<td>1185068</td>
<td>90961</td>
<td>42</td>
<td>1853704</td>
</tr>
<tr>
<td>Amazon-book</td>
<td>70679</td>
<td>24915</td>
<td>847733</td>
<td>88572</td>
<td>39</td>
<td>2557746</td>
</tr>
<tr>
<td>Last-FM</td>
<td>23566</td>
<td>48123</td>
<td>3034796</td>
<td>58266</td>
<td>9</td>
<td>464567</td>
</tr>
</tbody></table>
<hr>
<h4 id="412-비교-방법-compared-methods">4.1.2 비교 방법 (Compared Methods)</h4>
<p>CRKM 프레임워크는 세 가지 범주의 방법과 비교되었습니다:</p>
<ol>
<li><p><strong>전통적인 추천 알고리즘</strong>:  </p>
<ul>
<li><strong>FM (Factorization Machines)</strong> [19]:<br>이 알고리즘은 2차원 특징 상호작용을 모델링하고, 데이터 희소성 문제를 해결하기 위해 특징 관계를 학습합니다.</li>
<li><strong>NFM (Neural Factorization Machines)</strong> [12]:<br>FM의 확장 버전으로, 2차원 특징 상호작용을 다층 퍼셉트론(MLP)으로 대체하여<br>고차원 특징 상호작용을 학습하고 모델 표현력을 향상시킵니다.</li>
</ul>
</li>
<li><p><strong>지식 그래프 기반 추천 알고리즘</strong>:  </p>
<ul>
<li><strong>CKE (Collaborative Knowledge Embedding)</strong> [34]:<br>TransR 알고리즘을 사용하여 지식 그래프에서 아이템의 구조적 표현을 학습하고,<br>텍스트 및 시각적 지식에서 의미적 표현을 추출하여 최종 아이템 표현에 통합합니다.</li>
<li><strong>RippleNet</strong> [26]:<br>경로 기반 및 임베딩 기반 접근법을 결합하여 사용자 표현을 향상시키고,<br>아이템 지식 그래프 경로를 따라 사용자 선호 분포를 학습합니다.</li>
<li><strong>KGAT (Knowledge Graph Attention Network)</strong> [27]:<br>지식 그래프 컨볼루션에서 주의 메커니즘을 사용하여 다단계 이웃을 통해<br>엔터티 임베딩을 반복적으로 학습하며, 사용자와 아이템 간 고차원 관계를 캡처합니다.</li>
</ul>
</li>
<li><p><strong>메타러닝 기반 추천 알고리즘</strong>:  </p>
<ul>
<li><strong>MetaKG</strong> [5]:<br>메타러닝과 추천 시스템을 결합하여 콜드스타트 문제를 해결합니다.<br>두 개의 메타러너를 설계해 지식 그래프의 의미적 관계와 사용자의 선호를 교대로 학습합니다.</li>
</ul>
</li>
</ol>
<hr>
<h4 id="413-매개변수-설정-parameter-settings">4.1.3 매개변수 설정 (Parameter Settings)</h4>
<ul>
<li><strong>최적화 방법</strong>: Adam 옵티마이저와 Xavier 초기화를 사용했습니다.  </li>
<li><strong>임베딩 크기</strong>: 사용자, 엔터티, 관계의 임베딩 크기는 ${16, 32, 64, 128, 256}$에서 선택되며, 최종 크기는 64입니다.  </li>
<li><strong>규제 계수</strong>: $L_2$ 규제 계수는 $10^{-5}, 10^{-4}, \ldots, 10^{-1}$ 범위에서 설정하며, 최종 값은 $10^{-5}$입니다.  </li>
<li><strong>학습률</strong>: ${0.05, 0.01, 0.005, \ldots, 0.0001}$ 범위에서 설정하며, 글로벌 학습률은 0.0005, 로컬 학습률은 0.01로 설정되었습니다.  </li>
<li><strong>그래프 신경망 깊이</strong>: 고차 이웃 정보를 학습하기 위해 3 레이어로 설정했습니다.  </li>
<li><strong>평가 메트릭</strong>: Recall@K와 NDCG@K를 사용했으며, $K=20$으로 설정했습니다.<h2 id="42-비교-실험-comparative-experiment-rq1">4.2 비교 실험 (Comparative Experiment, RQ1)</h2>
</li>
</ul>
<p>CRKM 프레임워크를 세 가지 공개 데이터셋에서 다양한 콜드스타트 시나리오와<br>비콜드스타트 시나리오에서 기존 기준선 모델과 비교하였습니다.<br>실험 결과는 아래 표에 나와 있으며, <code>%Imp</code>는 제안된 방법이 가장 강력한 기준선과<br>비교했을 때의 상대적 향상을 나타냅니다.<br>최고 성능은 <strong>굵게 표시</strong>하였으며, 두 번째로 높은 성능은 _밑줄_로 표시하였습니다.</p>
<p>실험 결과는 CRKM 프레임워크가 세 데이터셋에서 대부분의 기준선 모델보다<br>더 나은 성능을 보임을 나타냅니다. 이는 CRKM의 합리성과 효과성을 증명합니다.<br>이러한 개선은 주로 다음 요인에 기인합니다:</p>
<ol>
<li><strong>지식 그래프 기반 샘플링</strong>과 <strong>인기도 기반 샘플링</strong>으로 구성된<br><strong>2단계 부정 샘플링 방식</strong>을 통해 더 나은 부정 샘플을 얻었습니다.<br>이러한 샘플은 네트워크 구조에 통합되어 제한된 상호작용 데이터를 확장하고<br>정보를 풍부하게 만듭니다. 반면, 기준선 모델은 단순히<br>랜덤 부정 샘플링만 수행하여 더 많은 노이즈가 발생합니다.</li>
<li>네트워크 구조에서 <strong>주의 집계 레이어(Attention Aggregation Layer)</strong>와  
<strong>융합 레이어(Fusion Layer)</strong>를 사용하여 지식 그래프에서 고차원 정보를 효과적으로 학습하고,<br>부정 샘플을 활용해 긍정 샘플에서 노이즈를 제거하며 사용자와 아이템 표현을 향상시켰습니다.<br>반면, 기준선 모델은 부정 샘플을 단순히 모델 학습 과정에만 활용할 뿐,<br>네트워크 구조에 통합하지 않았습니다.</li>
<li>모델 학습 중 메타러너를 사용하여 초기 매개변수를 학습하고,<br>새로운 태스크에 대해 모델을 훈련합니다.<br>메타러닝 접근법은 소량의 학습 데이터로도 효과적이며,<br>추천 시스템의 콜드스타트 문제 해결에 크게 기여합니다.<br>그러나 MetaKG를 제외한 다른 기준선 모델은 모델 학습 중 메타러너를 활용하지 않습니다.</li>
</ol>
<hr>
<h3 id="사용자-콜드스타트-시나리오-실험-결과">사용자 콜드스타트 시나리오 실험 결과</h3>
<table>
<thead>
<tr>
<th>Model</th>
<th>Amazon-book Recall</th>
<th>Amazon-book NDCG</th>
<th>Last-FM Recall</th>
<th>Last-FM NDCG</th>
<th>Yelp2018 Recall</th>
<th>Yelp2018 NDCG</th>
</tr>
</thead>
<tbody><tr>
<td>FM</td>
<td>0.0869</td>
<td>0.0749</td>
<td>0.1756</td>
<td>0.1635</td>
<td>0.0626</td>
<td>0.0693</td>
</tr>
<tr>
<td>NFM</td>
<td>0.1093</td>
<td>0.0924</td>
<td>0.2053</td>
<td>0.1921</td>
<td>0.0747</td>
<td>0.0702</td>
</tr>
<tr>
<td>CKE</td>
<td>0.1387</td>
<td>0.1333</td>
<td>0.2068</td>
<td>0.2027</td>
<td>0.0692</td>
<td>0.0793</td>
</tr>
<tr>
<td>RippleNet</td>
<td>0.1592</td>
<td>0.1778</td>
<td>0.1925</td>
<td>0.2032</td>
<td>0.0796</td>
<td>0.0731</td>
</tr>
<tr>
<td>KGAT</td>
<td>0.1919</td>
<td>0.2008</td>
<td>0.2321</td>
<td>0.2294</td>
<td>0.0854</td>
<td>0.0817</td>
</tr>
<tr>
<td>KGCL</td>
<td>0.2056</td>
<td>0.2120</td>
<td>0.2412</td>
<td>0.2378</td>
<td>0.0939</td>
<td>0.0955</td>
</tr>
<tr>
<td>KGIN</td>
<td>0.2068</td>
<td>0.2118</td>
<td>0.2428</td>
<td>0.2335</td>
<td>0.0894</td>
<td>0.0817</td>
</tr>
<tr>
<td>MetaKG</td>
<td>0.2073</td>
<td>0.2124</td>
<td>0.2451</td>
<td>0.2492</td>
<td>0.1044</td>
<td>0.0978</td>
</tr>
<tr>
<td><strong>CRKM</strong></td>
<td><strong>0.2164</strong></td>
<td><strong>0.2273</strong></td>
<td><strong>0.2652</strong></td>
<td><strong>0.2714</strong></td>
<td><strong>0.1125</strong></td>
<td><strong>0.1039</strong></td>
</tr>
<tr>
<td><strong>%Imp</strong></td>
<td><strong>7.5%</strong></td>
<td><strong>7.0%</strong></td>
<td><strong>8.2%</strong></td>
<td><strong>8.9%</strong></td>
<td><strong>7.7%</strong></td>
<td><strong>6.2%</strong></td>
</tr>
</tbody></table>
<hr>
<h3 id="아이템-콜드스타트-시나리오-실험-결과">아이템 콜드스타트 시나리오 실험 결과</h3>
<table>
<thead>
<tr>
<th>Model</th>
<th>Amazon-book Recall</th>
<th>Amazon-book NDCG</th>
<th>Last-FM Recall</th>
<th>Last-FM NDCG</th>
<th>Yelp2018 Recall</th>
<th>Yelp2018 NDCG</th>
</tr>
</thead>
<tbody><tr>
<td>FM</td>
<td>0.1621</td>
<td>0.1502</td>
<td>0.3386</td>
<td>0.3218</td>
<td>0.0738</td>
<td>0.0771</td>
</tr>
<tr>
<td>NFM</td>
<td>0.1655</td>
<td>0.1610</td>
<td>0.3442</td>
<td>0.3363</td>
<td>0.0856</td>
<td>0.0813</td>
</tr>
<tr>
<td>CKE</td>
<td>0.1707</td>
<td>0.1721</td>
<td>0.3564</td>
<td>0.3418</td>
<td>0.0897</td>
<td>0.0828</td>
</tr>
<tr>
<td>RippleNet</td>
<td>0.1674</td>
<td>0.1740</td>
<td>0.3701</td>
<td>0.3402</td>
<td>0.0915</td>
<td>0.0903</td>
</tr>
<tr>
<td>KGAT</td>
<td>0.1798</td>
<td>0.1782</td>
<td>0.3698</td>
<td>0.3567</td>
<td>0.0970</td>
<td>0.0932</td>
</tr>
<tr>
<td>MetaKG</td>
<td>0.1875</td>
<td>0.1823</td>
<td>0.3891</td>
<td>0.3996</td>
<td>0.1112</td>
<td>0.1184</td>
</tr>
<tr>
<td><strong>CRKM</strong></td>
<td><strong>0.1960</strong></td>
<td><strong>0.1954</strong></td>
<td><strong>0.4127</strong></td>
<td><strong>0.4244</strong></td>
<td><strong>0.1169</strong></td>
<td><strong>0.1235</strong></td>
</tr>
<tr>
<td><strong>%Imp</strong></td>
<td><strong>4.5%</strong></td>
<td><strong>7.2%</strong></td>
<td><strong>6.0%</strong></td>
<td><strong>6.2%</strong></td>
<td><strong>5.1%</strong></td>
<td><strong>4.3%</strong></td>
</tr>
</tbody></table>
<hr>
<h3 id="사용자-아이템-콜드스타트-시나리오-실험-결과">사용자-아이템 콜드스타트 시나리오 실험 결과</h3>
<table>
<thead>
<tr>
<th>Model</th>
<th>Amazon-book Recall</th>
<th>Amazon-book NDCG</th>
<th>Last-FM Recall</th>
<th>Last-FM NDCG</th>
<th>Yelp2018 Recall</th>
<th>Yelp2018 NDCG</th>
</tr>
</thead>
<tbody><tr>
<td>FM</td>
<td>0.2091</td>
<td>0.1742</td>
<td>0.3056</td>
<td>0.3078</td>
<td>0.0811</td>
<td>0.0760</td>
</tr>
<tr>
<td>NFM</td>
<td>0.2312</td>
<td>0.1985</td>
<td>0.3143</td>
<td>0.3191</td>
<td>0.0824</td>
<td>0.0796</td>
</tr>
<tr>
<td>MetaKG</td>
<td>0.2574</td>
<td>0.2357</td>
<td>0.3407</td>
<td>0.3436</td>
<td>0.1308</td>
<td>0.1214</td>
</tr>
<tr>
<td><strong>CRKM</strong></td>
<td><strong>0.2657</strong></td>
<td><strong>0.2471</strong></td>
<td><strong>0.3589</strong></td>
<td><strong>0.3697</strong></td>
<td><strong>0.1367</strong></td>
<td><strong>0.1170</strong></td>
</tr>
<tr>
<td><strong>%Imp</strong></td>
<td><strong>3.2%</strong></td>
<td><strong>4.8%</strong></td>
<td><strong>5.3%</strong></td>
<td><strong>7.5%</strong></td>
<td><strong>4.5%</strong></td>
<td><strong>-3.8%</strong></td>
</tr>
<tr>
<td>## CRKM 프레임워크 성능 요약</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<p>제안된 모델은 콜드스타트 및 비콜드스타트 시나리오 모두에서 일관되게 우수한 성능을 보였으며,<br>그 강건성을 다시 한번 확인할 수 있었습니다.  </p>
<p><strong>비콜드스타트 시나리오</strong>에서는 데이터셋이 매우 희소하더라도,<br>지식 그래프에서 풍부한 의미 정보를 결합하고 부정 샘플로 데이터를 증강하여<br>데이터 희소성 문제를 완화할 수 있음을 보여줍니다.<br>또한, 모델 학습에 메타러너를 포함하면 희소한 데이터 문제를 더 효과적으로 처리할 수 있습니다.</p>
<p><strong>콜드스타트 시나리오</strong> 중에서, 사용자 콜드스타트 시나리오에서 가장 큰 성능 향상이 나타났습니다.<br>이는 부정 주의 모듈(Negative Attention Module)에서 부정 샘플 정보를 활용하여<br>사용자 표현을 최적화한 결과일 가능성이 큽니다.  </p>
<p>세 데이터셋을 비교했을 때, Last-FM 데이터셋에서의 성능 향상이 더 두드러졌습니다.<br>이는 Last-FM 데이터셋이 다른 두 데이터셋에 비해 상호작용 정보가 더 조밀하기 때문일 수 있습니다.</p>
<hr>
<h2 id="기준선-모델-성능-분석">기준선 모델 성능 분석</h2>
<ol>
<li><p><strong>전통적인 방법 (FM, NFM)</strong>  </p>
<ul>
<li>FM과 NFM과 같은 전통적인 방법은 상대적으로 낮은 성능을 보였습니다.  </li>
<li>이는 지식 그래프를 활용하지 않아 추가 정보를 제공하지 못하기 때문입니다.</li>
</ul>
</li>
<li><p><strong>지식 그래프 기반 모델</strong>  </p>
<ul>
<li>CKE는 상대적으로 약한 성능을 보였습니다.<br>이는 CKE가 지식 그래프의 경로 정보와 고차원 연결성을 완전히 활용하지 못했기 때문입니다.</li>
<li>RippleNet과 KGAT은 지식 그래프에서 다단계 연결성을 엔드투엔드 방식으로 학습하며,<br>다중 의미 지식을 캡처하여 더 나은 성능을 보였습니다.</li>
</ul>
</li>
<li><p><strong>MetaKG</strong>  </p>
<ul>
<li>MetaKG는 메타러닝을 활용하여 콜드스타트 문제를 해결하는 데 있어 가장 강력한 기준선 모델이었습니다.  </li>
<li>그러나 MetaKG는 부정 샘플 정보를 활용하지 않았습니다.<br>반면, CRKM은 고품질 부정 샘플링을 수행하고 이를 활용하여 노이즈를 제거하며 추천 품질을 향상시켰습니다.</li>
</ul>
</li>
</ol>
<hr>
<h2 id="crkm-프레임워크의-계산-비용-분석">CRKM 프레임워크의 계산 비용 분석</h2>
<p>CRKM과 기타 모델에서 <strong>FLOPs (Floating Point Operations Per Second)</strong>와 같은 계산 복잡도 지표를 기록한 결과,<br>프레임워크의 성능 향상이 계산 비용 증가를 상회한다는 것을 발견했습니다.<br>따라서, CRKM 프레임워크는 높은 효용성을 가지고 있습니다.</p>
<h2 id="43-제거-실험-ablation-experiment-rq2">4.3 제거 실험 (Ablation Experiment, RQ2)</h2>
<p>CRKM 프레임워크의 핵심 구성 요소인 부정 샘플러(Negative Sampler),<br>부정 주의 모듈(Negative Attention Module),<br>긍정-부정 샘플 융합 레이어(Fusion Layer), 메타러너(Meta-Learner)가<br>추천 결과에 미치는 영향을 조사했습니다.<br>각 구성 요소의 효과를 평가하기 위해 다음과 같은 CRKM 프레임워크의 네 가지 변형을 생성했습니다:</p>
<ol>
<li><strong>CRKM</strong>: 완전한 모델</li>
<li><strong>CRKM-neg</strong>: 부정 샘플러를 제거한 CRKM</li>
<li><strong>CRKM-att</strong>: 부정 주의 모듈을 제거한 CRKM</li>
<li><strong>CRKM-fusion</strong>: 융합 레이어를 제거한 CRKM</li>
<li><strong>CRKM-meta</strong>: 메타러너를 제거한 CRKM</li>
</ol>
<p>실험 결과는 <strong>그림 7</strong>에 나와 있습니다.</p>
<hr>
<h3 id="crkm-구성-요소별-분석">CRKM 구성 요소별 분석</h3>
<ol>
<li><p><strong>CRKM-neg</strong><br>부정 샘플러를 설계된 방식 대신 랜덤 부정 샘플링으로 대체하여 효과를 검증했습니다.<br>실험 결과, Recall과 NDCG 지표 모두 감소했으며,<br>이는 지식 그래프와 인기도를 기반으로 한 2단계 부정 샘플링이<br>랜덤 부정 샘플링보다 높은 품질의 부정 샘플을 추출하고,<br>일부 노이즈 샘플을 필터링할 수 있음을 나타냅니다.</p>
</li>
<li><p><strong>CRKM-att</strong><br>사용자 표현 학습 시 부정 주의 모듈을 제거하고,<br>부정 샘플과 긍정 샘플 간의 유사도를 기반으로 가중치를 부여하는 대신<br>사용자-아이템 상호작용 행렬을 직접 사용했습니다.<br>그러나 부정 주의 모듈이 없는 경우 모델 성능이 하락했으며,<br>이는 부정 주의 모듈이 부정 샘플 정보를 활용해 노이즈를 제거하고<br>사용자 표현을 개선하는 데 중요한 역할을 한다는 것을 시사합니다.</p>
</li>
<li><p><strong>CRKM-fusion</strong><br>네트워크 구조에서 융합 레이어를 제거하여 성능을 비교했습니다.<br>융합 레이어가 없는 모델의 성능이 원래 모델보다 낮았으며,<br>이는 융합 레이어가 긍정 및 부정 샘플의 가중치 표현을 학습하여<br>사용자 및 아이템 표현을 향상시킴으로써 추천 성능을 개선한다는 것을 확인시켜줍니다.</p>
</li>
<li><p><strong>CRKM-meta</strong><br>메타러너를 제거한 CRKM의 성능을 검증했으며,<br>이 경우 글로벌 모델 학습이 로컬 업데이트 없이 수행되었습니다.<br>메타러닝이 없는 모델은 원래 모델보다 낮은 성능을 보였으며,<br>이는 메타러너를 도입함으로써 제한된 데이터(예: 새로운 사용자 및 아이템) 시나리오에<br>모델이 빠르게 적응할 수 있음을 나타냅니다.</p>
</li>
</ol>
<p><strong>결론</strong><br>실험 결과는 제안된 모델의 핵심 구성 요소(부정 샘플러, 부정 주의 메커니즘, 융합 레이어, 메타러너)의<br>효과성을 확인시켜줍니다. 각 구성 요소를 개별적으로 제거한 경우,<br>모델 성능은 완전한 CRKM 프레임워크보다 일관되게 낮은 결과를 보였습니다.</p>
<hr>
<h2 id="44-매개변수-설정-실험-parameter-setting-experiment-rq3">4.4 매개변수 설정 실험 (Parameter Setting Experiment, RQ3)</h2>
<p>마지막으로, 모델 매개변수(임베딩 차원 및 네트워크 레이어 수)가 추천 성능에 미치는 영향을 조사했습니다.<br>다른 시나리오에서도 유사한 결과를 얻을 수 있으므로,<br>이 실험은 사용자-아이템 콜드스타트(UIC) 시나리오에 초점을 맞췄습니다.</p>
<hr>
<h3 id="임베딩-차원-embedding-dimension">임베딩 차원 (Embedding Dimension)</h3>
<p>임베딩 차원이 모델 성능에 미치는 영향을 조사했으며,<br>{16, 32, 64, 128, 256} 차원을 탐구했습니다.<br>결과는 <strong>표 6</strong>에 제시되어 있으며,<br>CRKM 프레임워크는 임베딩 차원을 64로 설정했을 때 최고의 성능을 보였습니다.<br>또한, 임베딩 차원이 증가함에 따라 모델 성능이 안정화되었으며,<br>이는 모델이 임베딩 차원에 대해 높은 강건성을 가지고 있음을 보여줍니다.
<img src="https://velog.velcdn.com/images/meo_sun/post/05155fbf-b3d8-447b-bf25-2bd6735db591/image.png" alt=""></p>
<table>
<thead>
<tr>
<th>임베딩 차원</th>
<th>Amazon-book Recall</th>
<th>Amazon-book NDCG</th>
<th>Last-FM Recall</th>
<th>Last-FM NDCG</th>
<th>Yelp2018 Recall</th>
<th>Yelp2018 NDCG</th>
</tr>
</thead>
<tbody><tr>
<td>16</td>
<td>0.2621</td>
<td>0.2389</td>
<td>0.3536</td>
<td>0.3635</td>
<td>0.1327</td>
<td>0.1156</td>
</tr>
<tr>
<td>32</td>
<td>0.2665</td>
<td>0.2428</td>
<td>0.3542</td>
<td>0.3613</td>
<td>0.1341</td>
<td>0.1148</td>
</tr>
<tr>
<td>64</td>
<td><strong>0.2657</strong></td>
<td><strong>0.2471</strong></td>
<td><strong>0.3589</strong></td>
<td><strong>0.3697</strong></td>
<td><strong>0.1367</strong></td>
<td><strong>0.1170</strong></td>
</tr>
<tr>
<td>128</td>
<td>0.2648</td>
<td>0.2456</td>
<td>0.3585</td>
<td>0.3694</td>
<td>0.1364</td>
<td>0.1161</td>
</tr>
<tr>
<td>256</td>
<td>0.2652</td>
<td>0.2462</td>
<td>0.3574</td>
<td>0.3681</td>
<td>0.1355</td>
<td>0.1165</td>
</tr>
</tbody></table>
<hr>
<h3 id="네트워크-레이어-network-layers">네트워크 레이어 (Network Layers)</h3>
<p>네트워크 레이어 수가 모델 성능에 미치는 영향을 조사했으며,<br>CRKM-{1, 2, 3, 4}로 설정된 네트워크를 비교했습니다.<br>결과는 <strong>표 7</strong>에 제시되어 있으며, 레이어 수가 증가함에 따라<br>모델 성능이 점진적으로 향상되는 것을 보여줍니다.  </p>
<p>CRKM-2와 CRKM-3은 각 데이터셋에서 CRKM-1보다 더 나은 성능을 보였으며,<br>이는 사용자, 아이템, 엔터티 간의 고차원 관계를 모델링함으로써<br>지식 그래프에서 더 풍부한 구조적 정보를 캡처할 수 있음을 나타냅니다.<br>그러나 CRKM-3에 추가 레이어를 쌓아 CRKM-4로 확장해도 성능이 유의미하게 개선되지 않았습니다.<br>이는 엔터티 간 3-hop 관계를 고려하는 것이 그래프 내 다양한 의미 정보를 캡처하는 데 충분함을 시사합니다.</p>
<table>
<thead>
<tr>
<th>네트워크 레이어</th>
<th>Amazon-book Recall</th>
<th>Amazon-book NDCG</th>
<th>Last-FM Recall</th>
<th>Last-FM NDCG</th>
<th>Yelp2018 Recall</th>
<th>Yelp2018 NDCG</th>
</tr>
</thead>
<tbody><tr>
<td>CRKM-1</td>
<td>0.2594</td>
<td>0.2419</td>
<td>0.3524</td>
<td>0.3652</td>
<td>0.1294</td>
<td>0.1125</td>
</tr>
<tr>
<td>CRKM-2</td>
<td>0.2612</td>
<td>0.2436</td>
<td>0.3568</td>
<td>0.3685</td>
<td>0.1326</td>
<td>0.1181</td>
</tr>
<tr>
<td>CRKM-3</td>
<td><strong>0.2657</strong></td>
<td><strong>0.2471</strong></td>
<td><strong>0.3589</strong></td>
<td><strong>0.3697</strong></td>
<td><strong>0.1367</strong></td>
<td><strong>0.1170</strong></td>
</tr>
<tr>
<td>CRKM-4</td>
<td>0.2649</td>
<td>0.2467</td>
<td>0.3587</td>
<td>0.3712</td>
<td>0.1354</td>
<td>0.1164</td>
</tr>
<tr>
<td>## 5. 결론 및 미래 연구 (CONCLUSIONS AND FUTURE WORK)</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<p>본 논문은 추천 시스템에서의 콜드스타트 고품질 데이터 획득 문제를 해결하기 위해<br>새로운 CRKM 프레임워크를 제안하였습니다.<br>우리는 이 문제를 데이터와 모델 관점에서 접근했습니다.</p>
<ul>
<li><p><strong>데이터 관점:</strong><br>지식 그래프를 보조 정보로 활용하여 그래프 신경망 모델을 구축하였습니다.</p>
</li>
<li><p><strong>모델 관점:</strong><br>메타러너를 활용하여 모델을 훈련하고,<br>사용자와 아이템의 더 풍부한 표현을 학습함으로써 추천 성능을 향상시켰습니다.</p>
</li>
</ul>
<p>우리는 음악, 도서, 쇼핑 관련 세 가지 공개 데이터셋에서 비교 실험을 수행했습니다.<br>실험 결과, 제안된 CRKM 프레임워크는 콜드스타트 및 비콜드스타트 시나리오 모두에서<br>다른 기준선 모델보다 뛰어난 성능을 보였습니다.</p>
<hr>
<h3 id="연구-성과와-한계">연구 성과와 한계</h3>
<p>본 연구는 추천 시스템의 콜드스타트 문제 해결에 있어 진전을 이루었으나,<br>시간과 연구 제약으로 인해 여전히 몇 가지 도전 과제와 한계가 존재합니다.</p>
<ol>
<li><p><strong>동적 부정 샘플링 탐색:</strong><br>사용자-아이템 관계의 실시간 변화를 포착하여<br>의미 있는 부정 샘플을 식별하고 변화하는 동적 환경에 적응할 수 있는<br>동적 부정 샘플링 방법을 탐구할 수 있습니다.</p>
</li>
<li><p><strong>소셜 네트워크 통합:</strong><br>사용자 간의 관계를 소셜 네트워크에 포함시켜<br>사용자 정보를 더욱 풍부하게 하고 추천 정확도를 향상시킬 수 있습니다.</p>
</li>
</ol>
<hr>
<h3 id="감사의-말씀-acknowledgements">감사의 말씀 (ACKNOWLEDGEMENTS)</h3>
<p>본 연구는 아래의 지원을 받아 수행되었습니다:</p>
<ul>
<li><strong>중국 교육부 인문사회과학재단</strong> (23YJAZH046)  </li>
<li><strong>국가 자연과학 재단</strong> (12326607, 62276208, 11991023)  </li>
<li><strong>산시성 자연과학 기초 연구 프로그램</strong> (2024JC-JCQN-02)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 번역] Region or Global? A Principle for Negative Sampling in Graph-based Recommendation `with GPT`]]></title>
            <link>https://velog.io/@meo_sun/%EB%85%BC%EB%AC%B8-%EB%B2%88%EC%97%AD-Region-or-Global-A-Principle-for-Negative-Sampling-in-Graph-based-Recommendation-with-GPT</link>
            <guid>https://velog.io/@meo_sun/%EB%85%BC%EB%AC%B8-%EB%B2%88%EC%97%AD-Region-or-Global-A-Principle-for-Negative-Sampling-in-Graph-based-Recommendation-with-GPT</guid>
            <pubDate>Sat, 25 Jan 2025 17:12:59 GMT</pubDate>
            <description><![CDATA[<h1 id="지역-또는-글로벌-그래프-기반-추천에서의-네거티브-샘플링-원칙">지역 또는 글로벌? 그래프 기반 추천에서의 네거티브 샘플링 원칙</h1>
<h3 id="저자">저자</h3>
<p>Zhen Yang, Ming Ding, Xu Zou, Jie Tang, Bin Xu, Chang Zhou, Hongxia Yang</p>
<hr>
<h2 id="초록"><strong>초록</strong></h2>
<p>그래프 기반 추천 시스템은 최근 빠르게 발전하고 있으며, 사용자-아이템 상호작용을 사용자-아이템 그래프로 모델링하고 그래프 신경망(Graph Neural Networks, GNN)을 활용하여 사용자 및 아이템의 임베딩을 학습합니다. 그래프 기반 추천의 근본적인 도전 과제는 사용자-아이템 그래프에서 관찰 가능한 양성 사용자-아이템 쌍만 존재한다는 점입니다. 네거티브 샘플링(Negative Sampling)은 이러한 단일 클래스 문제를 해결하는 핵심 기술로, 다양한 추천 방법에서 널리 사용됩니다. 하지만 이전 연구들은 네거티브 샘플링 분포 설계에만 초점을 맞췄을 뿐, 네거티브 샘플링 영역에 대해서는 충분히 고려하지 않았습니다.</p>
<p>본 연구에서는 네거티브 샘플링을 가이드하기 위해 <strong>세 영역 원칙(Three-Region Principle)</strong>을 제안합니다. 이 원칙은 중간 영역에서 더 많은 아이템을 네거티브로 샘플링하고, 인접 및 먼 영역에서의 샘플링은 줄여야 한다고 제안합니다. 이 원칙을 기반으로, 우리는 두 가지 샘플링 전략(양성 보조 샘플링 및 노출 보강 샘플링)을 결합하여 설계된 일반적인 네거티브 샘플링 방법 <strong>RecNS</strong>를 제시합니다. 기존의 그래프 데이터에서 존재하는 네거티브 아이템을 샘플링하는 대신, 이 두 전략을 임베딩 공간에서 병합하여 네거티브 아이템 임베딩을 생성합니다.</p>
<p>광범위한 실험을 통해 RecNS 방법이 모든 네거티브 샘플링 기준치를 초과하는 성능을 보여준다는 것을 증명했습니다. 예를 들어 Alibaba 데이터셋에서 Recall@20 측면에서 PinSage는 10.47%, NGCF는 6.02%, LightGCN은 8.20%의 향상을 보였습니다.</p>
<p><strong>핵심 용어</strong>: 네거티브 샘플링, 세 영역 원칙, 임베딩 병합, 그래프 기반 추천</p>
<hr>
<h2 id="1-서론"><strong>1. 서론</strong></h2>
<p>최근 몇 년간 추천 시스템 연구의 주요 관심사는 협업 필터링(Collaborative Filtering, CF)에서 그래프 기반 추천으로의 발전입니다 [1], [2], [3], [4], [5]. 그래프 기반 추천은 사용자-아이템 상호작용을 사용자-아이템 그래프로 모델링하며, 그래프 신경망(GNN)을 활용하여 사용자와 아이템의 임베딩 학습 과정에 구조적 정보를 통합합니다.</p>
<p>그래프 기반 추천의 핵심 목표는 고품질의 임베딩을 학습하고 학습된 임베딩을 통해 사용자-아이템 상호작용 가능성을 추정하는 것입니다. 이는 온라인 쇼핑, 소셜 네트워크, 광고 등 다양한 분야에서 널리 활용됩니다. GNN의 급속한 발전은 그래프 기반 추천의 부상을 이끄는 근본적인 원동력으로 작용하고 있습니다. 특히, 그래프 기반 추천은 차세대 추천 기술의 핵심이 될 가능성을 보이며, 웹 스케일 애플리케이션을 지원할 수 있는 유망한 기술로 평가받고 있습니다.</p>
<p>그러나 사용자-아이템 그래프에서 양성 쌍(positive pair)만 관찰 가능하며, 다른 아이템은 사용자와 연결되지 않은 상태로 관찰되지 않는 쌍으로 간주된다는 점에서 중요한 도전 과제가 있습니다. 이 문제를 해결하기 위해 <strong>네거티브 샘플링(Negative Sampling)</strong>이 중요한 기술로 자리잡았습니다.</p>
<p>네거티브 샘플링은 이전 연구들에서 널리 채택되었으며 [9], [10], [11], [12], 샘플링 전략은 전역적으로 관찰되지 않은 아이템 영역에서 소수의 네거티브 아이템만 선택하여 양성 아이템과 구별하는 모델을 훈련하는 데 사용되었습니다. 네거티브 샘플링은 훈련 과정을 가속화하고 계산 복잡도를 줄이며 대규모 그래프 기반 추천이 가능하게 합니다. 또한, 여러 연구 결과는 네거티브 아이템의 품질이 사용자/아이템 임베딩의 품질 및 추천 작업의 효율성에 영향을 미친다는 것을 보여줍니다 [8], [13].</p>
<hr>
<p><img src="https://via.placeholder.com/800x600" alt="RecNS의 작동 원리"><br><em>그림 1. 임베딩 공간에서 양성 보조 샘플링과 노출 보강 샘플링을 병합하는 RecNS의 개요.</em></p>
<p>[14]에서는 유용한 표현 학습을 위해 어려운(hard) 네거티브 샘플의 상위 5%만 필요하며 충분하다는 것을 발견했습니다. 전통적으로, 네거티브 샘플링에 있어 가장 널리 사용되는 전략은 <strong>균일 분포(uniform distribution)</strong>를 사용하는 것입니다 [4], [15]. 네거티브 아이템의 품질을 향상시키기 위해, 여러 연구에서는 새로운 네거티브 샘플링 분포를 설계하려 시도해왔으며, 이는 현재 모델을 기반으로 어려운 네거티브 아이템(hard negative items)을 샘플링하는 방식입니다 [16], [17], [18]. 그래프 기반 추천에서 네거티브 샘플링 전략(예: MCNS [19] 및 PinSage [1])은 각각 자기대조(self-contrast) 근사 및 Metropolis-Hastings, 또는 PageRank 점수를 기반으로 네거티브 아이템을 샘플링합니다. 그러나 이와 같은 연구들은 그래프 신경망(GNN)의 정보 전파 메커니즘에서 샘플링 영역의 선택을 간과하고 네거티브 샘플링 분포 설계에만 초점을 맞추고 있습니다.</p>
<p>예를 들어, LightGCN [4]의 실험 결과는 레이어 수가 1에서 4로 증가할 때 대부분의 경우 레이어 2에서 성능이 정점을 찍은 후 감소하기 시작한다는 것을 보여줍니다. 이러한 결과에 대응하여, 저자들은 노드의 임베딩을 1차 및 2차 이웃과 함께 매끄럽게 처리하는 것이 매우 유용하지만, 더 높은 차수의 이웃을 사용할 경우 과도한 매끄러움(over-smoothing) 문제로 인해 성능이 저하된다고 주장합니다. 사실, 네트워크 레이어를 심화할 때 과도한 매끄러움 문제는 피할 수 없으나, 보다 효과적인 네거티브 샘플링 방법을 설계하여 추천 성능을 추가로 개선할 수 있습니다.</p>
<p>본 논문에서는 구조적 유사성에 따라 네거티브 아이템을 샘플링하기 위해 그래프 구조를 활용합니다. 사용자-아이템 그래프에서는 짧은 홉(hop)에 위치한 이웃들이 중심 노드와 더 높은 관련성을 가질 가능성이 높습니다. 이러한 짧은 홉 이웃들을 통한 정보 전파는 성능을 향상시킬 수 있으며, 중심 노드에 대해 더 긍정적인 정보를 전달할 가능성이 높습니다. 반면, 더 긴 홉 이웃들을 통한 정보 전파는 성능 저하를 초래하며, 이는 이웃의 정보가 추천 성능에 해로울 수 있음을 보여줍니다.</p>
<hr>
<h3 id="우리의-접근법"><strong>우리의 접근법</strong></h3>
<p>위와 같은 관찰을 바탕으로, 네거티브 아이템은 글로벌하게 관찰되지 않은 영역이 아닌 특정 영역에서 샘플링되어야 한다고 주장합니다. 따라서 본 연구에서는 중간 영역(intermediate region)에서 네거티브 아이템을 샘플링하기 위한 <strong>세 영역 원칙(Three-Region Principle)</strong>을 제안합니다. 이는 네거티브 샘플링에 있어 후보 네거티브 영역으로 고려해야 할 지역을 제시하는 원칙입니다. 이후, 우리는 후보 네거티브 영역에서 네거티브 아이템을 샘플링하기 위한 네거티브 샘플링 분포를 설계하는 <strong>RecNS</strong> 방법을 제안합니다.</p>
<hr>
<h2 id="기여"><strong>기여</strong></h2>
<p>본 논문의 주요 기여는 다음과 같습니다.</p>
<ol>
<li><p><strong>세 영역 원칙(Three-Region Principle)</strong>: 기존의 글로벌하게 관찰되지 않은 아이템 영역에서 샘플링하는 대신, 중간 영역에서 네거티브 아이템을 샘플링하여 보다 유익한 후보 네거티브 아이템을 탐색하도록 가이드하는 원칙을 제안합니다.</p>
</li>
<li><p><strong>RecNS 방법</strong>: 양성 보조 샘플링(positive-assisted sampling) 및 노출 보강 샘플링(exposure-augmented sampling)을 임베딩 공간에서 병합하여 최종 네거티브 아이템 임베딩을 생성하는 새로운 네거티브 샘플링 방법을 제안합니다. 이는 기존 그래프 기반 추천 모델에 손쉽게 통합할 수 있습니다.</p>
</li>
<li><p><strong>광범위한 실험</strong>: 실험 결과는 RecNS가 기존 네거티브 샘플링 전략보다 우수하다는 것을 보여줍니다. PinSage, NGCF, LightGCN을 사용한 실험에서 각각 10.47%, 6.02%, 8.20%의 Recall@20 성능 향상을 보였습니다.</p>
</li>
</ol>
<hr>
<h2 id="2-프레임워크"><strong>2. 프레임워크</strong></h2>
<p>본 섹션에서는 <strong>SampledRec</strong>이라는 제안된 프레임워크를 자세히 설명합니다. 이후 SampledRec의 전체적인 과정을 검토합니다. SampledRec 프레임워크의 일반적인 흐름은 그림 2에 나와 있습니다.</p>
<hr>
<p><img src="https://via.placeholder.com/800x600" alt="SampledRec 프레임워크"><br><em>그림 2. SampledRec 프레임워크의 일반적인 흐름.</em></p>
<h3 id="21-sampledrec-프레임워크"><strong>2.1 SampledRec 프레임워크</strong></h3>
<p>SampledRec은 사용자와 아이템의 임베딩을 학습하기 위해 그래프 신경망 기반의 인코더 $$E_{\theta}$$, 양성 샘플러 $$S_p$$, 그리고 네거티브 샘플러 $$S_n$$로 구성됩니다. 이는 각 사용자에 대해 양성 및 네거티브 아이템을 샘플링하며, 샘플링된 사용자-아이템 상호작용은 확률적 경사 하강법(SGD) 최적화를 통한 학습 데이터로 사용됩니다. 학습이 완료된 후, 추천 시스템은 특정 사용자를 위해 가장 큰 $$E_{\theta}(u) \cdot E_{\theta}(v)$$ 값을 가지는 상위 $$K$$개 아이템을 추천합니다.</p>
<h3 id="22-gnn-기반-인코더"><strong>2.2 GNN 기반 인코더</strong></h3>
<p>그래프 신경망 기반 인코더(GNN-based encoder)는 SampledRec에서 중요한 역할을 하며, 세 가지 모듈로 요약될 수 있습니다.</p>
<h4 id="1-집계-모듈-aggregation-module"><strong>(1) 집계 모듈 (Aggregation Module)</strong></h4>
<p>초기 아이템 및 사용자 임베딩 행렬 $$E_V \in \mathbb{R}^{N \times d}$$와 $$E_U \in \mathbb{R}^{M \times d}$$를 유지합니다. 여기서 $$N$$과 $$M$$은 각각 아이템 및 사용자 수를 나타내며, $$d$$는 임베딩 차원을 나타냅니다. 초기 임베딩 벡터 $$e_u \in \mathbb{R}^d$$와 $$e_v \in \mathbb{R}^d$$는 조회 연산(look-up operation)을 통해 생성됩니다. 직관적으로, 두 가지 유형의 집계 연산이 있습니다: 사용자 집계와 아이템 집계:</p>
<p>$$
h_u = \text{Agg}_{u \gets v}(e_v | v \in S(N_u)),
$$</p>
<p>$$
h_v = \text{Agg}_{v \gets u}(e_u | u \in S(N_v)).
$$</p>
<p>여기서 $$N_u$$와 $$N_v$$는 각각 중심 사용자 $$u$$와 아이템 $$v$$의 이웃을 나타내며, $$h_u$$와 $$h_v$$는 사용자 $$u$$와 아이템 $$v$$의 집계된 임베딩입니다. $$\text{Agg}<em>{u \gets v}$$와 $$\text{Agg}</em>{v \gets u}$$는 사용자 및 아이템 집계 함수입니다. $$S(\cdot)$$는 이웃 샘플러를 나타냅니다.</p>
<hr>
<h4 id="2-전파-모듈-propagation-module"><strong>(2) 전파 모듈 (Propagation Module)</strong></h4>
<p>사용자와 아이템 간의 더 높은 차수의 상호작용을 캡처하기 위해, 여러 전파 레이어를 쌓아 임베딩을 레이어별로 전파합니다. $$h_u^l$$와 $$h_v^l$$는 $$l$$-번째 레이어에서 사용자 및 아이템 임베딩을 나타냅니다. $$(l+1)$$-번째 레이어의 임베딩은 $$l$$-번째 레이어에서 이웃의 임베딩과 자신의 임베딩에 따라 결정됩니다. 수학적으로, $$(l+1)$$-번째 레이어의 사용자 임베딩 $$h_u^{l+1}$$는 다음과 같이 정의됩니다:</p>
<p>$$
h^{l+1} = \text{Agg}_{u \gets v}(e_v^l | v \in S(N_u)),
$$</p>
<p>$$
h_u^{l+1} = f(h^{l+1}, h_u^l).
$$</p>
<p>여기서 $$f(\cdot)$$는 업데이트 함수이며, 아이템 임베딩 벡터는 위에서 언급한 전파 모듈을 통해 동일한 방식으로 표현됩니다.</p>
<hr>
<h4 id="3-예측-모듈-prediction-module"><strong>(3) 예측 모듈 (Prediction Module)</strong></h4>
<p>$$L$$개의 레이어를 전파한 후, 사용자 $$u$$와 아이템 $$v$$에 대해 각 레이어의 표현 $${h_u^1, \cdots, h_u^L}$$ 및 $${h_v^1, \cdots, h_v^L}$$를 얻습니다. 이를 사용하여 최종 사용자 및 아이템 임베딩 $$e_u^<em>$$와 $$e_v^</em>$$를 다음과 같이 계산합니다:</p>
<p>$$
e_u^* = g(h_u^1, \cdots, h_u^L),
$$</p>
<p>$$
e_v^* = g(h_v^1, \cdots, h_v^L).
$$</p>
<p>여기서 $$g(\cdot)$$는 융합 함수(fusion function)를 나타냅니다. 최종적으로, 일반적으로 사용되는 내적(inner product)을 통해 사용자의 특정 아이템에 대한 선호도를 다음과 같이 추정합니다:</p>
<p>$$
\hat{r}_{uv} = e_u^* \cdot e_v^*.
$$</p>
<hr>
<h3 id="23-샘플러-samplers"><strong>2.3 샘플러 (Samplers)</strong></h3>
<h4 id="1-이웃-샘플러-s"><strong>(1) 이웃 샘플러 ($$S$$)</strong></h4>
<p>대규모 그래프에서 GNN을 적용하려면 중심 노드에 대한 이웃을 샘플링해야 합니다. GCN(Graph Convolutional Network)은 모든 이웃을 집계에 사용하며, PinSage는 고정된 크기의 이웃을 샘플링합니다. FastGCN [20]은 각 합성 계층에서 이웃을 샘플링할 것을 제안하며, AS-GCN [21]은 적응적 층별 이웃 샘플링 방법을 제안합니다. 이웃 샘플링은 원본 그래프 정보 전파와 계산 효율성의 균형을 맞추는 데 중요한 기술입니다.</p>
<hr>
<h4 id="2-양성-샘플러-s_p"><strong>(2) 양성 샘플러 ($$S_p$$)</strong></h4>
<p>SampledRec에서 사용자-아이템 그래프의 엣지는 양성 사용자-아이템 상호작용으로 가정할 수 있습니다. 따라서 양성 사용자-아이템 상호작용 집합 $$O^+$$는 다음과 같이 정의됩니다:</p>
<p>$$
O^+ = {(u, v) | u \in U, v \in V},
$$</p>
<p>여기서 $$U$$는 사용자 집합, $$V$$는 아이템 집합을 나타내며, $$(u, v)$$ 쌍은 사용자-아이템 그래프에서 연결된 엣지를 나타냅니다.</p>
<hr>
<h4 id="3-네거티브-샘플러-s_n"><strong>(3) 네거티브 샘플러 ($$S_n$$)</strong></h4>
<p>SampledRec에서는 네거티브 샘플러 $$S_n$$를 사용하여 네거티브 아이템 $$v_n \sim S_n(u, v)$$을 샘플링합니다. 네거티브 샘플링은 오랜 연구 역사를 가지고 있지만, 대부분의 연구는 네거티브 샘플링 분포 $$p_n$$ 설계에 초점을 맞추며 네거티브 샘플링 영역의 선택은 간과해왔습니다.</p>
<h3 id="24-최적화-optimization"><strong>2.4 최적화 (Optimization)</strong></h3>
<p>SampledRec에서는 GNN 기반 인코더의 매개변수를 최적화하기 위해 <strong>힌지 손실(Hinge Loss)</strong>을 사용합니다. 이 손실 함수는 한 쌍의 손실(one-pair loss)을 기반으로 정의됩니다. 여기서는 기존 힌지 손실을 $$k$$-쌍 손실로 확장하여 <strong>확장된 힌지 손실(Augmented Hinge Loss)</strong>을 정의하고, 그래프 기반 추천의 성능을 강화합니다. 특정 사용자 $$u$$와 해당 양성 아이템 $$v$$에 대해 $$k$$개의 네거티브 아이템 $$v_n$$을 샘플링하여 다음의 확장된 힌지 손실을 최적화합니다:</p>
<p>$$
L = 
\frac{1}{k} \sum_{(u,v) \in O^+} 
\Big[
\sigma\Big(\sum_{i=1}^k e_u^* \cdot e_{v_i^n}^* \Big) </p>
<ul>
<li>\sigma(k \cdot e_u^* \cdot e_v^*) </li>
<li>\gamma
\Big]_+.
$$</li>
</ul>
<p>여기서:</p>
<ul>
<li>$$v_n^1, \cdots, v_n^k$$는 샘플링된 $$k$$개의 네거티브 아이템을 나타냅니다.</li>
<li>$$\sigma(\cdot)$$는 시그모이드 함수(Sigmoid Function)입니다.</li>
<li>$$[z]_+ = \max(0, z)$$는 ReLU와 유사한 활성화 함수입니다.</li>
<li>$$\gamma$$는 사전 정의된 마진(margin)으로, $$\gamma &gt; 0$$을 만족합니다.</li>
<li>$$O^+$$는 양성 사용자-아이템 쌍의 집합을 나타냅니다.</li>
<li>$$S_n(u, v)$$는 설계된 네거티브 샘플러입니다.</li>
</ul>
<hr>
<h2 id="3-세-영역-원칙-the-three-region-principle"><strong>3. 세 영역 원칙 (The Three-Region Principle)</strong></h2>
<p>이 섹션에서는 먼저 네거티브 샘플링 문제를 소개하고 그래프 기반 추천에서의 네거티브 샘플링을 분석합니다. 이후 <strong>세 영역 원칙(Three-Region Principle)</strong>을 제안하여 네거티브 샘플링을 가이드하며, 영역 구분 기준을 제공합니다. 마지막으로, 제안된 세 영역 원칙에 대해 논의합니다.</p>
<hr>
<h3 id="31-네거티브-샘플링-문제"><strong>3.1 네거티브 샘플링 문제</strong></h3>
<p>확장된 힌지 손실 함수 (식 5)에서 볼 수 있듯이, 네거티브 샘플링은 모델 학습에서 중요한 역할을 합니다. 이는 모델이 양성 및 네거티브 상호작용을 구별할 적절한 경계를 학습할 수 있도록 도와줍니다. 구체적으로, 네거티브 샘플러 $$S_n$$은 설계된 분포 $$p_n$$에서 네거티브 아이템을 샘플링하며, 양성에 가까운(즉, 어려운 네거티브 아이템) 네거티브는 추천 모델의 성능을 크게 향상시킬 수 있습니다. </p>
<p>여러 연구에서는 추천 시스템의 성능을 개선하기 위해 더 복잡한 네거티브 샘플링 분포 $$p_n$$을 설계하려는 시도가 이루어졌습니다 [16], [19], [22], [23], [24]. 하지만 초기 연구들은 실제 그래프 데이터에서 추정 분산을 줄이는 데 초점을 맞췄으며, 네거티브 샘플링 영역 선택은 충분히 탐구되지 않았습니다. 본 연구에서는 네거티브 샘플링을 위한 적절한 영역 선택을 탐구합니다.</p>
<hr>
<h3 id="32-네거티브-샘플링-분석"><strong>3.2 네거티브 샘플링 분석</strong></h3>
<h4 id="1-반복적인-gnn-iterative-gnns"><strong>(1) 반복적인 GNN (Iterative GNNs)</strong></h4>
<p>반복적인 GNN은 사용자-아이템 그래프에서 정보를 레이어별로 전파하여 사용자와 아이템의 임베딩을 생성하는 아이디어입니다. 레이어 수는 성능에 큰 영향을 미치며, 이는 여러 연구 결과에서 확인되었습니다 [4], [15].</p>
<ul>
<li><p><strong>짧은 홉(Hop):</strong><br>1~3홉의 이웃은 양성 선호도를 나타내며, 그래프 기반 추천의 성능을 향상시킵니다. 이는 사회적 영향 이론(Social Influence Theory) [25], [26]에 의해 설명될 수 있습니다. 이 이론에 따르면, 소셜 네트워크에서 사용자는 서로에게 영향을 미쳐 비슷한 선호도를 가지게 됩니다. 마찬가지로, 동일한 아이템과 상호작용한 사용자들은 동일한 커뮤니티에 속하며 동일한 선호도를 가질 가능성이 높습니다.</p>
</li>
<li><p><strong>긴 홉(Hop):</strong><br>반면, 4홉 이상의 이웃은 네거티브 선호도를 나타내며, 이는 추천 성능을 저하시킬 수 있습니다. 따라서, 네거티브 샘플링 영역은 반복적인 GNN의 전파 메커니즘에 따라 분리되어야 합니다.</p>
</li>
</ul>
<hr>
<h4 id="2-분산-분석-variance"><strong>(2) 분산 분석 (Variance)</strong></h4>
<p>최근 연구 [19]에서는 그래프 표현 학습의 네거티브 샘플링에 대한 기대 위험(Expected Risk)을 다음과 같이 이론적으로 증명했습니다:</p>
<p>$$
E[||(\theta_T - \theta^*)_u||^2] = 
\frac{1}{T} 
\Bigg( 
\frac{1}{p_d(v|u)} - 1 </p>
<ul>
<li>\frac{1}{k \cdot p_n(v|u)} - \frac{1}{k} 
\Bigg),
$$</li>
</ul>
<p>여기서:</p>
<ul>
<li>$$p_d(v|u)$$와 $$p_n(v|u)$$는 각각 양성 및 네거티브 샘플링 분포를 나타냅니다.</li>
<li>$$T$$는 샘플링된 샘플 수를 나타냅니다.</li>
<li>$$k$$는 각 양성 사용자-아이템 쌍에 대해 샘플링된 네거티브 수입니다.</li>
</ul>
<p>위 식은 네거티브 샘플링 분포 $$p_n(v|u)$$가 양성 분포 $$p_d(v|u)$$와 양의 상관 관계를 가지되, 부분적으로($$0 &lt; \alpha &lt; 1$$) 비례해야 함을 시사합니다. 따라서 네거티브 샘플링 전략은 GNN의 전파 메커니즘과 기대 위험을 모두 충족해야 합니다.</p>
<h3 id="33-네거티브-샘플링을-위한-세-영역-원칙-the-three-region-principle"><strong>3.3 네거티브 샘플링을 위한 세 영역 원칙 (The Three-Region Principle)</strong></h3>
<p>그래프 기반 추천 작업에서 GNN의 전파 메커니즘 특성을 고려하여, 우리는 사용자 $$u$$와 관련된 네거티브 샘플링을 위한 <strong>세 영역 원칙(Three-Region Principle)</strong>을 제안합니다. 이 원칙에 따라 아이템을 세 가지 영역으로 나눌 수 있습니다(그림 3 참조).</p>
<h4 id="1-인접-영역-adjacent-region"><strong>(1) 인접 영역 (Adjacent Region)</strong></h4>
<p>인접 영역의 아이템은 그래프 기반 추천에서 중심 사용자 $$u$$를 위해 특징 정보를 전파하는 데 주로 사용됩니다. 따라서 이 영역의 아이템은 사용자의 양성 선호도를 나타내며 네거티브로 샘플링되지 않아야 합니다. 또한, 식 (6)에 따르면 $$p_n(v|u) &gt; 0$$을 유지해야 하며, 이는 최적 $$(e_u \cdot e_v)$$ 값을 보장합니다. 요약하면, 인접 영역의 아이템은 일반적으로 네거티브 샘플링에서 제외되며, 과도한 샘플링은 의미가 없습니다.</p>
<h4 id="2-중간-영역-intermediate-region"><strong>(2) 중간 영역 (Intermediate Region)</strong></h4>
<p>중간 영역의 아이템은 인접 아이템과 달리, 양성에 가까운 하드(hard) 네거티브 아이템으로 간주됩니다. 이 영역의 아이템은 모델 학습에 더 많은 정보를 제공할 수 있습니다. 중간 영역의 아이템은 중심 사용자 $$u$$에서 약간 떨어져 있으며, 이들을 인접 아이템으로 간주하고 정보 전파에 활용하면 성능이 저하되거나 약간만 향상될 수 있습니다. 또한, 중간 영역의 아이템을 중심 노드로 전파하면 노드 크기가 기하급수적으로 증가하여 메모리 소비가 커질 수 있습니다. 따라서 중간 영역의 아이템은 네거티브 샘플로 충분히 샘플링되어야 합니다.</p>
<h4 id="3-먼-영역-distant-region"><strong>(3) 먼 영역 (Distant Region)</strong></h4>
<p>먼 영역의 아이템은 $$p_d(v|u)$$ 값이 작고, 일반적으로 중심 사용자와의 관련성이 거의 없는 아이템입니다. 사용자는 일반적으로 이 영역의 아이템과 상호작용하지 않으므로 $$p_d(v|u)$$ 또는 $$(e_u \cdot e_v)$$ 값이 작습니다. 추천 시스템에서는 주로 $$(e_u \cdot e_v)$$ 값이 큰 상위 $$K$$개의 아이템에 관심을 갖기 때문에, 먼 영역의 아이템은 과도한 네거티브 샘플링이 무의미합니다. 결과적으로, 먼 영역의 아이템은 적게 샘플링되어야 합니다.</p>
<hr>
<h3 id="세-영역의-분리-기준-separating-criterion"><strong>세 영역의 분리 기준 (Separating Criterion)</strong></h3>
<p>세 영역 원칙에 따라, 사용자 $$u$$와 하위 그래프(subgraph)를 기반으로 모든 아이템을 세 영역으로 나누기 위한 분리 기준을 제안합니다(그림 3 참조). 구체적으로, 사용자 $$u$$와 하위 그래프의 구조를 활용하여 <strong>계층적 너비 우선 탐색(Layer-wise Breadth-First Search, LBFS)</strong> 알고리즘을 통해 개별화된 아이템 집합을 생성합니다.</p>
<ul>
<li>$$k$$-홉 내에 위치한 아이템은 인접 아이템으로 간주됩니다.</li>
<li>$$k$$-홉 외부에 위치한 아이템은 먼 아이템으로 간주됩니다.</li>
<li>$$k$$-홉 내의 중간에 위치한 아이템은 중간 영역의 아이템으로 간주됩니다.</li>
</ul>
<p>이러한 구조적 분리 기준은 사용자별로 개인화된 영역을 생성하며, 사용자-아이템 그래프의 구조를 반영하여 다양성과 개성을 나타냅니다. 중간 영역은 네거티브 샘플링에 결정적인 역할을 하기 때문에, 중간 아이템 생성에 초점을 맞추고 있습니다. 본 논문에서는 네거티브 샘플링이 글로벌 영역이 아닌 중간 영역에서 이루어져야 한다고 주장하며, 이 원칙은 이후 <strong>5.5 심화 연구</strong> 섹션에서 검증됩니다.</p>
<p>LBFS 알고리즘의 구체적인 과정은 아래 <strong>알고리즘 1</strong>에 설명되어 있으며, BFS를 사용하는 하위 알고리즘은 <strong>알고리즘 2</strong>에 나와 있습니다.</p>
<hr>
<h4 id="알고리즘-1-계층적-너비-우선-탐색-lbfs"><strong>알고리즘 1: 계층적 너비 우선 탐색 (LBFS)</strong></h4>
<p>입력: 사용자-아이템 그래프 $$G = (U + V, O^+)$$, $$k$$-홉<br>출력: 중간 영역 $$R_{\text{med}}$$</p>
<ol>
<li>모든 사용자 $$u$$에 대해:<ul>
<li><code>hop_num = 0, queue = [u]</code></li>
</ul>
</li>
<li>$$hop_num \leq k$$-홉일 때까지 반복:<ul>
<li>$$y = \text{BFS}(G, queue)$$</li>
<li>$$queue = y$$</li>
<li>$$hop_num += 1$$</li>
<li>$$hop_num == k$$-홉일 경우:<ul>
<li>$$R_{\text{med}} = y$$</li>
</ul>
</li>
</ul>
</li>
</ol>
<hr>
<h4 id="알고리즘-2-너비-우선-탐색-bfs"><strong>알고리즘 2: 너비 우선 탐색 (BFS)</strong></h4>
<p>입력: 사용자-아이템 그래프 $$G$$, $$queue$$<br>출력: 계층별 노드 집합 $$y$$</p>
<ol>
<li>$$queue$$의 모든 노드에 대해:<ul>
<li><code>temp = queue.pop(0)</code></li>
<li><code>nodes = G[temp]</code></li>
<li><code>nodes</code>를 $$y$$에 추가<h3 id="34-세-영역-원칙에-대한-논의-discussion-on-the-three-region-principle"><strong>3.4 세 영역 원칙에 대한 논의 (Discussion on The Three-Region Principle)</strong></h3>
</li>
</ul>
</li>
</ol>
<p>위에서 설명한 바와 같이, 세 영역 원칙은 네거티브 샘플링을 가이드하기 위한 일반적인 원칙으로 작용합니다. 글로벌하게 관찰되지 않은 아이템과 비교했을 때, 중간 영역의 아이템은 모델 학습에 더 유익한 후보 네거티브 아이템을 제공합니다. 세 영역 원칙은 비중간 아이템의 간섭을 제거하고, 중간 영역에서 정확하게 후보 네거티브 아이템을 샘플링할 수 있습니다. 요약하자면, 세 영역 원칙은 네거티브 샘플링을 위한 일반적인 원칙으로, 기존 네거티브 샘플링 전략에 글로벌 영역 대신 중간 영역을 대체하여 적용할 수 있습니다.</p>
<hr>
<h2 id="4-recns-방법-the-recns-method"><strong>4. RecNS 방법 (The RecNS Method)</strong></h2>
<p>이 섹션에서는 제안된 네거티브 샘플링 방법인 <strong>RecNS</strong>를 설명합니다. RecNS는 기존 그래프 기반 추천 모델에 직접 통합할 수 있는 일반적인 네거티브 샘플링 방법입니다. RecNS는 네거티브 샘플링을 위해 두 가지 전략을 설계합니다: <strong>양성 보조 샘플링(Positive-Assisted Sampling, RecNS-O)</strong>과 <strong>노출 보강 샘플링(Exposure-Augmented Sampling, RecNS-W)</strong>. 이 두 샘플링 전략을 병합하여 최종 네거티브 아이템 임베딩을 생성합니다. RecNS의 학습 흐름은 <strong>알고리즘 3</strong>에 나와 있습니다.</p>
<hr>
<h3 id="41-양성-보조-샘플링-positive-assisted-sampling-recns-o"><strong>4.1 양성 보조 샘플링 (Positive-Assisted Sampling, RecNS-O)</strong></h3>
<p>어려운 네거티브 아이템을 얻기 위해, 양성 아이템의 도움을 받아 네거티브 샘플링을 수행하는 양성 보조 샘플링 전략을 제안합니다. 구체적으로, 주어진 사용자 $$u$$와 해당 양성 아이템 $$v$$에 대해, 네거티브 샘플링 분포는 사용자 $$u$$뿐만 아니라 아이템 $$v$$에 의해서도 결정됩니다 [16], [19], [23]. 사용자 $$u$$의 관점에서 샘플링된 네거티브 아이템 $$v_n$$은 $$u$$의 네거티브 선호도를 반영합니다. 한편, 네거티브 아이템은 양성 및 네거티브 아이템을 구별할 충분한 분별력을 가져야 합니다 [24].</p>
<hr>
<h4 id="1-양성-보조-샘플링-분포"><strong>(1) 양성 보조 샘플링 분포</strong></h4>
<p>양성 아이템 정보를 네거티브 샘플링에 통합한다는 아이디어를 도입합니다. 먼저, 세 영역 원칙에 따라 생성된 중간 영역 $$R_{\text{med}}$$에서 $$M$$개의 후보 네거티브 아이템을 선택하여 후보 집합 $$C_u$$를 형성합니다. $$M$$은 그래프 데이터의 전체 아이템 수보다 훨씬 작습니다. 이후, 내적(inner product) 점수를 사용하여 양성 분포를 근사화하고, 추정된 네거티브 분포 $$p_n$$에서 후보 아이템 집합 $$C_u$$의 네거티브 아이템을 선택합니다.</p>
<p>네거티브 분포 $$p_n$$은 양성 분포 $$p_d$$와 비례 관계를 가지며, 이는 MCNS [19]에서 도출된 결과입니다. 양성 보조 샘플링 분포는 다음과 같이 계산됩니다:</p>
<p>$$
p_n(v_n^p | (u, v)) = 
\frac{
\sigma(\alpha(e_u^* \cdot e_{v_n^p}^<em>) + (1-\alpha)(e_v^</em> \cdot e_{v_n^p}^<em>))
}{
\sum_{v_i \in C_u} \sigma(\alpha(e_u^</em> \cdot e_{v_i}^<em>) + (1-\alpha)(e_v^</em> \cdot e_{v_i}^*))
},
$$</p>
<p>여기서:</p>
<ul>
<li>$$v_n^p$$: 샘플링된 네거티브 아이템</li>
<li>$$\alpha$$: 사용자 $$u$$와 양성 아이템 $$v$$ 간의 영향을 균형 있게 조정하는 보조 계수</li>
<li>$$\sigma(\cdot)$$: 시그모이드 함수</li>
<li>$$C_u$$: 중간 영역 $$R_{\text{med}}$$에서 선택된 $$M$$개의 후보 네거티브 아이템 집합</li>
</ul>
<p>$$\alpha$$는 하이퍼파라미터로 수동으로 튜닝할 수 있으며, 섹션 <strong>5.3 파라미터 분석</strong>에서 $$\alpha$$의 적합한 분포 선택을 논의합니다(예: 균일 분포 및 가우시안 분포).</p>
<p>요약하자면, 양성 보조 샘플링은 양성 정보를 네거티브 샘플링에 통합하여 결정적인 경계를 학습할 수 있도록 합니다. 확장된 힌지 손실(augmented hinge loss)을 사용하여 그래프 기반 추천 모델의 매개변수를 최적화하며, $$k$$개의 네거티브 아이템은 양성 보조 샘플링 분포 $$p_n$$에서 샘플링됩니다. 이 $$k$$개의 네거티브 아이템은 샘플링된 네거티브 집합 $$P_k = {v_n^p}$$을 형성합니다.</p>
<h3 id="42-노출-보강-샘플링-exposure-augmented-sampling-recns-w"><strong>4.2 노출 보강 샘플링 (Exposure-Augmented Sampling, RecNS-W)</strong></h3>
<p>우리는 노출 정보를 활용하여 네거티브 아이템을 샘플링하는 <strong>노출 보강 샘플링(RecNS-W)</strong> 전략을 제안합니다. E-commerce 플랫폼은 사용자가 추천받은 아이템이 노출되었는지 여부에 대한 정보를 수집할 수 있습니다. 이러한 노출 정보는 사용자의 네거티브 선호도를 설명하는 풍부한 정보를 포함하고 있습니다.</p>
<h4 id="1-노출-정보의-역할"><strong>(1) 노출 정보의 역할</strong></h4>
<p>노출되었으나 상호작용하지 않은 아이템(즉, 노출된 아이템)은 사용자의 글로벌 미관찰 아이템과 비교했을 때, 더 강한 네거티브 특성을 반영합니다. 또한, 노출 정보는 잘못된 네거티브 문제(false negative problem)를 완화하는 데 도움이 될 수 있습니다. 일부 연구는 노출된 아이템이 더 많은 네거티브 속성을 가지고 있기 때문에, 이들을 네거티브 샘플로 사용하는 것이 유리하다고 제안합니다. 하지만, 노출된 아이템 자체가 심각한 편향을 가질 가능성이 있기 때문에, 단순히 이들을 샘플링하는 것은 최적의 성능을 보장하지 못할 수 있습니다 [28].</p>
<hr>
<h4 id="2-노출-보강-샘플링의-구현"><strong>(2) 노출 보강 샘플링의 구현</strong></h4>
<p>구체적으로, 사용자 $$u$$와 해당 노출된 아이템 집합 $$E_u = {v_e}$$에 대해 다음 과정을 수행합니다:</p>
<ol>
<li>노출된 아이템 집합 $$E_u$$에서 균일 샘플링을 통해 $$M$$개의 노출된 아이템을 선택하여 후보 집합 $$M_u$$를 형성합니다.</li>
<li><strong>자체 증폭 계수(self-amplified factor)</strong> $$\beta$$를 도입하여 노출 정보의 영향을 증폭합니다.</li>
<li>후보 집합 $$M_u$$의 아이템에 대해 사용자 $$u$$의 선호도를 내적(inner product) 점수를 통해 추정하고, 가장 높은 점수를 가진 노출 네거티브 아이템 $$v_n^e$$를 선택합니다. 이는 <strong>하드 네거티브 샘플링(hard negative sampling)</strong> 전략과 유사합니다 [16], [19].</li>
</ol>
<p>노출 보강 샘플링은 다음과 같이 구현됩니다:</p>
<p>$$
v_n^e = \underset{v_i \in M_u}{\text{argmax}} \ \sigma(\beta \cdot (e_u^* \cdot e_{v_i}^*)),
$$</p>
<p>여기서:</p>
<ul>
<li>$$v_n^e$$: 샘플링된 노출 네거티브 아이템</li>
<li>$$\beta$$: 자체 증폭 계수</li>
<li>$$\sigma(\cdot)$$: 시그모이드 함수</li>
</ul>
<hr>
<h4 id="3-자체-증폭-계수-beta"><strong>(3) 자체 증폭 계수 $$\beta$$</strong></h4>
<p>$$\beta$$는 샘플링된 하드 네거티브 아이템을 활용하여 노출 아이템의 내적 점수를 수정하는 데 사용됩니다. $$\beta$$의 설계 목표는 노출된 아이템 중 후보 하드 네거티브 아이템에 속하는 아이템을 우선적으로 선택하도록 만드는 것입니다. 이로 인해 노출된 아이템 자체에서 발생할 수 있는 샘플링 편향 문제를 보정할 수 있습니다.</p>
<p>$$\beta$$는 다음과 같이 정의됩니다:</p>
<p>$$[
\beta =
\begin{cases}
1, &amp; \text{if } v_e \notin C_u, \
\text{노출된 아이템의 수}, &amp; \text{if } v_e \in C_u,
\end{cases}
]$$</p>
<p>여기서 $$C_u$$는 중간 영역에서 선택된 후보 아이템 집합입니다. $$\beta$$의 크기는 $$C_u$$에 속한 노출 아이템의 수에 따라 결정됩니다.</p>
<hr>
<h3 id="43-recns-병합-전략"><strong>4.3 RecNS: 병합 전략</strong></h3>
<p>RecNS에서 네거티브 아이템은 앞서 설명한 두 가지 샘플링 전략(양성 보조 샘플링 및 노출 보강 샘플링)을 기반으로 합니다. 이제 이 두 샘플링 전략을 결합하는 방법을 소개합니다.</p>
<p>본질적으로 그래프 기반 추천의 핵심 아이디어는 사용자-아이템 그래프에서 임베딩을 반복적으로 전파하는 것입니다. 따라서, 이 샘플링 전략들을 <strong>임베딩 공간에서 병합(merging in embedding space)</strong>합니다. 병합 연산은 다음과 같이 구현됩니다:</p>
<p>$$
e_{v_n}^* = \text{merge}\Big(e_{v_n^e}^<em>, e_{v_n^p}^</em>\Big),
$$</p>
<p>여기서:</p>
<ul>
<li>$$v_n^p$$: 양성 보조 샘플링에서 샘플링된 네거티브</li>
<li>$$v_n^e$$: 노출 보강 샘플링에서 선택된 네거티브</li>
</ul>
<p>병합 연산 $$\text{merge}(\cdot)$$는 추가적인 매개변수를 필요로 하지 않으며, GNN 기반 인코더에서 직접 얻은 임베딩을 병합합니다. 병합 연산은 다음과 같이 정의됩니다:</p>
<p>$$
\text{merge}(e_{v_n^e}^<em>, e_{v_n^p}^</em>) = \frac{1}{k} \cdot e_{v_n^e}^* + \Big(1 - \frac{1}{k}\Big) \cdot e_{v_n^p}^*,
$$</p>
<p>여기서 $$k$$는 네거티브 아이템의 수를 나타냅니다. 이는 매개변수를 추가하지 않는 비파라메트릭 병합 과정입니다.</p>
<hr>
<h3 id="44-recns에-대한-논의"><strong>4.4 RecNS에 대한 논의</strong></h3>
<h4 id="1-범용성-universality"><strong>(1) 범용성 (Universality)</strong></h4>
<p>RecNS는 그래프 기반 추천 모델에 플러그인 형태로 적용 가능한 범용적인 네거티브 샘플링 방법입니다. 양성 보조 샘플링은 네거티브 아이템의 품질을 향상시키며, 이는 다양한 그래프 기반 추천 모델에 널리 적용될 수 있습니다. 또한, 노출 보강 샘플링은 E-commerce 플랫폼에서 수집 가능한 노출 정보를 활용하여 네거티브 샘플링을 개선합니다.</p>
<hr>
<h4 id="2-임베딩-병합-embedding-mergence"><strong>(2) 임베딩 병합 (Embedding Mergence)</strong></h4>
<p>기존 네거티브 샘플링 방법은 사용자-아이템 그래프에서 단일 아이템을 샘플링하는 반면, RecNS는 양성 보조 샘플링과 노출 보강 샘플링 간 네거티브 임베딩을 병합합니다. 이러한 방법은 두 가지 후보 네거티브 아이템을 실제로 결합하여 네거티브 샘플의 품질을 향상시킵니다. 또한, 병합 연산은 <strong>다중 네거티브 샘플의 임베딩을 결합하여 복합 임베딩(compound embedding)</strong>으로 활용할 수 있는 새로운 방법을 제공합니다.</p>
<h3 id="45-시간-복잡도-time-complexity"><strong>4.5 시간 복잡도 (Time Complexity)</strong></h3>
<p>RecNS의 계산 복잡도는 두 부분으로 나뉩니다.</p>
<ol>
<li><p><strong>양성 보조 샘플링(Positive-Assisted Sampling):</strong></p>
<ul>
<li>$$M$$개의 후보 아이템을 $$C_u$$에서 샘플링하며, 계산 시간은 $$O(Md)$$입니다. 여기서 $$M$$은 샘플링된 후보 아이템의 수, $$d$$는 임베딩 차원을 나타냅니다.</li>
</ul>
</li>
<li><p><strong>노출 보강 샘플링(Exposure-Augmented Sampling):</strong></p>
<ul>
<li>이 전략의 계산 복잡도는 다음 두 부분으로 나뉩니다:<ol>
<li><strong>자체 증폭 계수 $$\beta$$</strong> 계산: 시간 복잡도는 $$O(M)$$입니다.</li>
<li><strong>노출된 네거티브 아이템 $$v_n^e$$ 샘플링:</strong> 이 과정의 계산 시간은 $$O(Md)$$입니다.</li>
</ol>
</li>
</ul>
</li>
</ol>
<p>따라서, 노출 보강 샘플링의 총 계산 복잡도는 $$O(M + Md)$$입니다.</p>
<p>결론적으로, RecNS의 전체 시간 복잡도는 $$O(Md)$$로 표현할 수 있습니다.</p>
<hr>
<h3 id="46-세-영역-원칙과-recns"><strong>4.6 세 영역 원칙과 RecNS</strong></h3>
<p>일반적으로 네거티브 샘플링은 두 가지 요소에 따라 달라집니다:</p>
<ol>
<li>그래프 구조(반복적인 GNN의 전파 메커니즘)</li>
<li>분산 이론(Variance Theory)</li>
</ol>
<p>세 영역 원칙(Three-Region Principle)은 네거티브 샘플링 영역을 선택하기 위한 일반적인 가이드라인으로 작용합니다. 반면, RecNS는 후보 네거티브 아이템 집합에서 효율적으로 네거티브 아이템을 샘플링하기 위한 범용적인 네거티브 샘플링 방법입니다. 세 영역 원칙은 정보성이 높은 후보 네거티브 아이템 집합을 제공하고, RecNS는 이 집합에서 네거티브 아이템을 샘플링할 수 있는 효율적인 샘플링 분포를 제공합니다.</p>
<hr>
<h2 id="5-실험-experiments"><strong>5. 실험 (Experiments)</strong></h2>
<p>RecNS의 효과와 적응성을 입증하기 위해, 두 개의 데이터셋과 세 가지 대표적인 그래프 기반 추천 모델(PinSage, NGCF, LightGCN)을 대상으로 광범위한 실험을 수행했습니다. 이후 다양한 파라미터 분석을 수행했으며, 심층 연구를 통해 RecNS가 우수한 네거티브 샘플링 성능을 가지는 이유를 설명합니다.</p>
<hr>
<h3 id="51-실험-설정-experimental-settings"><strong>5.1 실험 설정 (Experimental Settings)</strong></h3>
<h4 id="1-데이터셋"><strong>(1) 데이터셋</strong></h4>
<p>RecNS는 다음 두 데이터셋에서 평가되었습니다:</p>
<ul>
<li><strong>Zhihu:</strong> 대형 QA 플랫폼으로, 사용자가 관심 있는 기사를 클릭하는 데이터를 포함합니다. 본 논문에서는 CCIR-2018 Challenge에서 제공된 공개 데이터셋을 사용했으며, 이 데이터셋은 기사 노출 정보와 사용자 클릭 정보를 포함합니다.</li>
<li><strong>Alibaba:</strong> Taobao E-commerce 플랫폼에서 수집된 사용자 행동 데이터를 포함합니다. 이 데이터셋은 사용자의 역사적 상호작용(양성 상호작용 및 노출 정보 포함)을 샘플링한 하위 집합입니다.</li>
</ul>
<p>아래 표는 데이터셋의 통계를 요약한 것입니다.</p>
<table>
<thead>
<tr>
<th><strong>데이터셋</strong></th>
<th><strong>사용자 수</strong></th>
<th><strong>아이템 수</strong></th>
<th><strong>엣지 수</strong></th>
<th><strong>노출 수</strong></th>
<th><strong>밀도</strong></th>
</tr>
</thead>
<tbody><tr>
<td>Zhihu</td>
<td>16,015</td>
<td>44,175</td>
<td>3,284,734</td>
<td>3,796,551</td>
<td>0.00418</td>
</tr>
<tr>
<td>Alibaba</td>
<td>434,442</td>
<td>227,410</td>
<td>7,104,657</td>
<td>10,868,570</td>
<td>0.00006</td>
</tr>
</tbody></table>
<hr>
<h4 id="2-평가-지표"><strong>(2) 평가 지표</strong></h4>
<p>RecNS는 세 가지 널리 사용되는 Top-K 평가 지표로 평가되었습니다:</p>
<ol>
<li><strong>Recall</strong></li>
<li><strong>NDCG (Normalized Discounted Cumulative Gain)</strong></li>
<li><strong>HR (Hit Rate)</strong></li>
</ol>
<p>$$K$$는 20으로 설정되었습니다. 모든 테스트 사용자에 대해 평균 지표를 보고하며, 사용자가 상호작용하지 않은 모든 아이템을 대상으로 지표를 계산합니다. 또한, 효율적인 유사성 검색을 위해 Faiss 라이브러리(빠른 내적 계산을 지원)를 사용했습니다.</p>
<hr>
<h4 id="3-그래프-신경망-기반-인코더"><strong>(3) 그래프 신경망 기반 인코더</strong></h4>
<p>RecNS의 적응성을 확인하기 위해, 세 가지 일반적인 그래프 기반 추천 모델을 실험에 사용했습니다.</p>
<ol>
<li><p><strong>PinSage [1]:</strong></p>
<ul>
<li>웹 스케일 그래프에서 아이템 임베딩을 학습하기 위해 GraphSAGE의 핵심 아이디어를 활용합니다.</li>
<li>실험에서 두 개의 집계 계층을 쌓아 사용자 또는 아이템의 정보 전파 경로($$u \gets v \gets u$$, $$v \gets u \gets v$$)를 형성했으며, 평균 집계(mean-aggregator)를 사용했습니다.</li>
</ul>
</li>
<li><p><strong>NGCF [15]:</strong></p>
<ul>
<li>사용자가 연결된 아이템에 대한 정보를 전파함으로써 사용자와 아이템 간의 상호작용을 더욱 명확히 학습하는 새로운 프레임워크를 제안합니다. NGCF는 고차 연결성을 활용하여 협업 신호를 명시적으로 삽입합니다.</li>
</ul>
</li>
<li><p><strong>LightGCN [4]:</strong></p>
<ul>
<li>그래프 합성 네트워크(GCN)를 단순화하여 더 간결하고 추천에 적합하도록 설계되었습니다. LightGCN은 사용자와 아이템 임베딩을 선형적으로 전파하며, 모든 레이어에서 학습된 임베딩의 가중 합을 최종 임베딩으로 사용합니다.</li>
</ul>
</li>
</ol>
<hr>
<h3 id="52-성능-비교-performance-comparison"><strong>5.2 성능 비교 (Performance Comparison)</strong></h3>
<h4 id="1-최신-네거티브-샘플링-전략과의-비교"><strong>(1) 최신 네거티브 샘플링 전략과의 비교</strong></h4>
<p>모든 네거티브 샘플링 전략에 대한 성능 비교 결과는 아래 <strong>표 2</strong>에 요약되어 있습니다. 표에서는 가장 우수한 기준선(밑줄)과 RecNS(굵게 표시된 값)의 결과를 강조했습니다. 전반적으로, RecNS는 모든 데이터셋과 평가 지표에서 뚜렷한 성능 향상을 가져왔습니다. RecNS의 적응성을 입증하기 위해, PinSage, NGCF, LightGCN이라는 세 가지 대표적인 그래프 기반 추천 모델에 RecNS를 적용했습니다. 표 2의 결과를 통해 다음과 같은 관찰이 가능합니다:</p>
<ol>
<li><p><strong>RecNS의 우수성</strong><br>RecNS는 세 가지 GNN 기반 모델(PinSage, NGCF, LightGCN)에서 모든 기준선 대비 일관되게 우수한 성능을 보였습니다. 구체적으로, RecNS는 Zhihu와 Alibaba 데이터셋에서 각각 8.28%, 10.47%의 Recall@20 성능 향상을 PinSage 인코더에서 달성했습니다. 이러한 향상은 다음 요인들에 기인합니다:</p>
<ul>
<li><strong>세 영역 원칙(Three-Region Principle):</strong> RecNS는 글로벌하게 관찰되지 않은 아이템 집합 대신 중간 영역에서 더 많은 정보를 제공하는 네거티브 아이템을 탐색합니다.</li>
<li><strong>양성 보조 샘플링(Positive-Assisted Sampling):</strong> 사용자와 양성 아이템 간의 영향을 균형 있게 반영하여 네거티브 샘플링 분포를 설계함으로써, 양성과 네거티브를 더 명확히 구분할 수 있는 아이템을 샘플링합니다.</li>
<li><strong>노출 보강 샘플링(Exposure-Augmented Sampling):</strong> 노출된 아이템 정보를 활용하여 샘플링 편향을 줄이고, 네거티브 아이템 품질을 개선합니다.</li>
</ul>
</li>
<li><p><strong>기준선 전략의 성능</strong>  </p>
<ul>
<li>UniNS와 PopNS는 정적(static)이며 글로벌한 네거티브 샘플링 전략으로, 두 데이터셋에서 모두 낮은 성능을 보였습니다. 이는 이러한 전략이 일반적으로 최적의 결과를 보장하지 못함을 나타냅니다.</li>
<li>AdvNS는 UniNS 및 PopNS보다 우수한 성능을 보였습니다. 이는 샘플러가 사용자의 선호 분포를 학습하고, 모델 훈련을 혼란스럽게 만드는 어려운 아이템(hard item)을 생성하기 때문입니다.</li>
<li>DNS와 SimNS는 휴리스틱(heuristic) 네거티브 샘플링 전략으로, 현재 모델의 예측 점수를 기반으로 네거티브 아이템을 동적으로 샘플링하여 성능을 향상시켰습니다.</li>
</ul>
</li>
<li><p><strong>SRNS의 중요성</strong><br>SRNS는 세 가지 GNN 기반 모델에서 다른 기준선 전략보다 우수한 성능을 보였습니다. 이는 잘못된 네거티브 문제(false negative problem)가 중요한 요소임을 보여줍니다. SRNS는 높은 분산(variance)을 가진 아이템을 네거티브로 샘플링하여 참된 네거티브(true negative)를 효율적으로 샘플링합니다. 그러나 RecNS는 SRNS를 능가하는 성능을 보여줬으며, 이는 RecNS가 노출 정보를 활용하여 잘못된 네거티브 문제를 완화하고, 세 영역 원칙을 적용하여 더 유익한 후보 네거티브를 제공했기 때문입니다.</p>
</li>
</ol>
<hr>
<h4 id="2-노출-정보-기반-샘플링-전략과의-비교"><strong>(2) 노출 정보 기반 샘플링 전략과의 비교</strong></h4>
<p>노출 정보와 통합된 세 가지 네거티브 샘플링 방법(ExpNS, MixedNS, RNS-AS)과 RecNS를 비교한 결과는 <strong>표 3</strong>에 요약되어 있습니다. 결과를 통해 다음과 같은 관찰이 가능합니다:</p>
<ol>
<li><p><strong>ExpNS의 한계</strong><br>ExpNS는 노출된 아이템만을 네거티브로 샘플링하는 전략으로, 가장 낮은 추천 성능을 보였습니다. 이는 노출된 아이템의 출처를 명확히 알 수 없으며, 사용자가 단순히 무시했거나 실제로 싫어하는 아이템일 가능성이 있기 때문입니다.</p>
</li>
<li><p><strong>MixedNS와 RNS-AS의 개선</strong><br>MixedNS는 노출 아이템과 글로벌 미관찰 아이템 간의 샘플링 가중치 $$\omega$$를 조정하며, RNS-AS는 노출 데이터와 적대적 학습(adversarial learning)을 결합하여 더 나은 성능을 보였습니다.</p>
</li>
<li><p><strong>RecNS의 우수성</strong><br>RecNS는 노출 보강 샘플링 전략을 통해 노출 정보를 네거티브 샘플링에 통합합니다. 자체 증폭 계수(self-amplified factor)를 도입하여 노출 아이템의 영향을 증폭시키고, 가장 높은 내적 점수를 가진 노출 네거티브 아이템을 샘플링합니다. 또한, RecNS는 양성 보조 샘플링과 노출 보강 샘플링을 임베딩 공간에서 병합하여 네거티브 아이템 품질을 더욱 향상시킵니다.</p>
</li>
</ol>
<hr>
<table>
<thead>
<tr>
<th><strong>모델</strong></th>
<th><strong>Zhihu (Recall@20)</strong></th>
<th><strong>Alibaba (Recall@20)</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>PinSage+ExpNS</strong></td>
<td>0.30</td>
<td>0.35</td>
</tr>
<tr>
<td><strong>PinSage+MixedNS</strong></td>
<td>2.09</td>
<td>2.79</td>
</tr>
<tr>
<td><strong>PinSage+RNS-AS</strong></td>
<td>2.98</td>
<td>3.52</td>
</tr>
<tr>
<td><strong>PinSage+RecNS</strong></td>
<td><strong>3.53</strong></td>
<td><strong>4.01</strong></td>
</tr>
<tr>
<td>### <strong>5.3 파라미터 분석 (Parameter Analysis)</strong></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<h4 id="1-k-홉-khop-설정의-영향"><strong>(1) $$k$$-홉 (khop) 설정의 영향</strong></h4>
<p>세 영역 원칙에서 영역을 구분하는 기준인 $$k$$-홉의 선택이 RecNS 성능에 미치는 영향을 분석하기 위해 실험을 수행했습니다. $$k$$-홉 값을 $${3, 5, 7}$$로 설정하여 다양한 중간 영역을 생성하고, Zhihu 및 Alibaba 데이터셋에서 실험을 진행했습니다. 실험 결과는 아래 <strong>표 4</strong>에 요약되어 있습니다.</p>
<table>
<thead>
<tr>
<th><strong>모델</strong></th>
<th><strong>Zhihu</strong> ($$k$$-홉)</th>
<th><strong>Alibaba</strong> ($$k$$-홉)</th>
</tr>
</thead>
<tbody><tr>
<td><strong>PinSage</strong></td>
<td>3.53 ($$k=3$$)</td>
<td>4.01 ($$k=5$$)</td>
</tr>
<tr>
<td><strong>NGCF</strong></td>
<td>4.42 ($$k=3$$)</td>
<td>4.58 ($$k=5$$)</td>
</tr>
<tr>
<td><strong>LightGCN</strong></td>
<td>4.91 ($$k=3$$)</td>
<td>6.86 ($$k=5$$)</td>
</tr>
</tbody></table>
<p><strong>결론:</strong></p>
<ol>
<li>Zhihu 데이터셋에서는 $$k=3$$에서 최상의 성능을 보였으며, Alibaba 데이터셋에서는 $$k=5$$에서 최상의 성능을 보였습니다. 이는 데이터셋의 밀도 차이에 기인한 결과로 보입니다. 밀도가 높은 데이터셋에서는 짧은 전파 경로가 효과적이며, 밀도가 낮은 데이터셋에서는 더 긴 전파 경로가 성능 향상에 기여합니다.</li>
<li>$$k$$-홉 값의 선택은 데이터셋 밀도에 따라 조정해야 하며, 일반적으로 밀도가 높은 데이터셋에는 $$k=3$$, 밀도가 낮은 데이터셋에는 $$k=5$$를 권장합니다.</li>
</ol>
<hr>
<h4 id="2-전파-레이어-수-number-of-propagation-layers"><strong>(2) 전파 레이어 수 (Number of Propagation Layers)</strong></h4>
<p>전파 레이어 수 $$L$$이 RecNS의 성능에 미치는 영향을 분석하기 위해 $$L \in {1, 2, 3, 4}$$로 설정하여 NGCF와 LightGCN 모델에서 실험을 수행했습니다. 실험 결과는 아래 <strong>표 5</strong>에 요약되어 있습니다.</p>
<table>
<thead>
<tr>
<th><strong>모델</strong></th>
<th><strong>Zhihu (Recall@20)</strong></th>
<th><strong>Alibaba (Recall@20)</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>NGCF ($$L=1$$)</strong></td>
<td>4.26</td>
<td>3.97</td>
</tr>
<tr>
<td><strong>NGCF ($$L=3$$)</strong></td>
<td><strong>4.42</strong></td>
<td><strong>4.58</strong></td>
</tr>
<tr>
<td><strong>LightGCN ($$L=1$$)</strong></td>
<td>4.56</td>
<td>4.41</td>
</tr>
<tr>
<td><strong>LightGCN ($$L=3$$)</strong></td>
<td><strong>4.91</strong></td>
<td><strong>6.86</strong></td>
</tr>
</tbody></table>
<p><strong>결론:</strong></p>
<ol>
<li>레이어 수가 1에서 3으로 증가하면 성능이 개선되며, 대부분의 경우 $$L=3$$에서 최고 성능을 보입니다.</li>
<li>$$L=4$$에서는 성능이 다시 감소하며, 이는 GNN에서 과도한 전파로 인한 <strong>과도 매끄러움 문제(over-smoothing)</strong>로 설명할 수 있습니다. 이는 높은 차수의 이웃 정보가 노드의 임베딩을 과도하게 평탄화시켜 성능을 저하시키는 현상입니다.</li>
</ol>
<hr>
<h4 id="3-네거티브-아이템-수-number-of-negative-items"><strong>(3) 네거티브 아이템 수 (Number of Negative Items)</strong></h4>
<p>확장된 힌지 손실(augmented hinge loss)을 통해 네거티브 아이템 수 $$k$$가 RecNS 성능에 미치는 영향을 분석했습니다. $$k \in {5, 10, 15, 20}$$로 설정하여 PinSage+RecNS 모델에서 실험을 수행했으며, 결과는 아래 <strong>그림 4</strong>에 요약되어 있습니다.</p>
<p><strong>결론:</strong></p>
<ol>
<li>초기에는 $$k$$를 증가시킴에 따라 성능이 개선되며, $$k=15$$에서 최적의 성능에 도달했습니다.</li>
<li>$$k &gt; 15$$일 때는 성능이 약간 감소했으며, 이는 추가 샘플링이 모델의 학습 목적에 불필요한 편향을 추가했기 때문입니다.</li>
<li>$$k=15$$는 추천 성능과 훈련 시간을 균형 있게 유지할 수 있는 최적의 값으로 확인되었습니다.</li>
</ol>
<hr>
<h4 id="4-보조-계수-alpha의-영향"><strong>(4) 보조 계수 $$\alpha$$의 영향</strong></h4>
<p>양성 보조 샘플링에서 사용자와 양성 아이템 간의 영향을 조정하는 보조 계수 $$\alpha$$의 분포에 따른 성능을 분석했습니다. $$\alpha$$를 가우시안 분포($$N(0, 1)$$, $$N(0, 0.5)$$)와 균일 분포($$U(0, 1)$$, $$U(0, 0.5)$$)로 설정하고, PinSage+RecNS 모델에서 실험을 수행했습니다.</p>
<p><strong>결론:</strong></p>
<ul>
<li>균일 분포 $$U(0, 1)$$를 따르는 $$\alpha$$가 가장 우수한 성능을 보였습니다.</li>
<li>가우시안 분포 $$N(0, 0.5)$$도 Alibaba 데이터셋에서 유사한 성능을 보였으나, $$N(0, 1)$$은 다소 낮은 성능을 보였습니다.</li>
</ul>
<hr>
<h4 id="5-주요-하이퍼파라미터의-영향"><strong>(5) 주요 하이퍼파라미터의 영향</strong></h4>
<p>RecNS의 성능에 중요한 세 가지 하이퍼파라미터(마진 $$\gamma$$, 임베딩 차원 $$d$$, 후보 아이템 수 $$M$$)의 영향을 분석했습니다. Zhihu 데이터셋에서 실험 결과는 아래 <strong>그림 6</strong>에 요약되어 있습니다.</p>
<p><strong>결론:</strong></p>
<ol>
<li>마진 $$\gamma$$: $$\gamma &gt; 0$$일 때 성능이 향상되며, $$\gamma = 0.1$$에서 최적의 성능을 달성했습니다.</li>
<li>임베딩 차원 $$d$$: $$d=256$$이 성능과 시간 효율성 간의 균형을 유지하는 최적값으로 확인되었습니다.</li>
<li>후보 아이템 수 $$M$$: $$M=20$$이 추천 성능과 계산 비용을 균형 있게 유지하는 최적값으로 확인되었습니다.</li>
</ol>
<h3 id="54-심층-연구-deeper-study"><strong>5.4 심층 연구 (Deeper Study)</strong></h3>
<h4 id="1-세-영역-원칙이-네거티브-샘플링을-향상시키는가"><strong>(1) 세 영역 원칙이 네거티브 샘플링을 향상시키는가?</strong></h4>
<p>RecNS는 세 영역 원칙(Three-Region Principle)에 기반합니다. 그러나 이 원칙이 실제로 네거티브 샘플링에 도움이 되는지 확인하기 위해 확장된 실험을 설계했습니다. 이 실험에서는 세 가지 다른 영역(중간 영역, 먼 영역, 글로벌 미관찰 영역)에서 각각 $$M$$개의 후보 네거티브 아이템을 샘플링하는 세 가지 변형된 RecNS 전략(RecNS-Med, RecNS-Dis, RecNS-All)을 설계했습니다. 결과는 아래 <strong>그림 7</strong>에 요약되어 있습니다.</p>
<p><strong>결론:</strong></p>
<ol>
<li>먼 영역에서만 샘플링하는 경우(RecNS-Dis), 추천 성능이 급격히 저하되었습니다. 이는 먼 영역의 아이템이 추천 성능에 유의미한 기여를 하지 못함을 나타냅니다.</li>
<li>글로벌 미관찰 영역에서 샘플링하는 경우(RecNS-All), 중간 영역과 먼 영역을 명확히 구분하지 못해 성능이 저하되었습니다.</li>
<li>중간 영역에서 샘플링하는 경우(RecNS-Med), 가장 우수한 성능을 보였습니다. 이는 세 영역 원칙이 정보성이 높은 네거티브 후보를 제공한다는 것을 입증합니다.</li>
</ol>
<hr>
<h4 id="2-양성-보조-샘플링이-네거티브-샘플링을-강화하는가"><strong>(2) 양성 보조 샘플링이 네거티브 샘플링을 강화하는가?</strong></h4>
<p>양성 보조 샘플링이 네거티브 샘플링에 미치는 영향을 평가하기 위해 실험을 설계했습니다. 특정 사용자 $$u$$에 대해, 현재 모델에서 가장 높은 내적 점수를 가진 <strong>가장 어려운 네거티브(hardest negative)</strong>를 샘플링했습니다. 이 실험에서는 양성 보조 샘플링을 비활성화한 RecNS 변형(RecNSw/o p-a)을 사용했습니다. 결과는 Zhihu 및 Alibaba 데이터셋에서 아래 <strong>그림 8</strong>에 요약되어 있습니다.</p>
<p><strong>결론:</strong></p>
<ol>
<li>가장 어려운 네거티브 아이템을 샘플링하면 추천 성능이 저하되었습니다. 이는 잘못된 네거티브(false negative) 문제가 발생했기 때문입니다.</li>
<li>이전 연구 [1], [36]에서도 가장 어려운 네거티브 대신 <strong>큰 점수와 높은 분산(variance)을 가진 아이템</strong>을 샘플링하는 것이 추천 성능을 향상시키는 데 유리하다고 제안했습니다.</li>
<li>RecNS는 양성 보조 샘플링을 통해 양성과 네거티브 간의 경계를 보다 명확히 구분하며, 잘못된 네거티브 문제를 완화합니다.</li>
</ol>
<hr>
<h4 id="3-노출-보강-샘플링이-네거티브-샘플링을-강화하는가"><strong>(3) 노출 보강 샘플링이 네거티브 샘플링을 강화하는가?</strong></h4>
<p>노출 보강 샘플링의 효과를 검증하기 위해 두 가지 실험을 수행했습니다. 결과는 아래 <strong>그림 9</strong>에 요약되어 있습니다.</p>
<ol>
<li><p><strong>노출 보강 샘플링 비활성화(RecNSw/o e-a):</strong>
노출 보강 샘플링을 비활성화한 경우, 추천 성능이 감소했습니다. 이는 노출 정보를 활용함으로써 샘플링 편향을 줄이고, 참된 네거티브(true negative)를 샘플링할 수 있음을 보여줍니다.</p>
</li>
<li><p><strong>노출된 네거티브 아이템 수의 영향:</strong>
Zhihu 데이터셋에서 PinSage 인코더를 사용하여, 샘플링된 노출 네거티브 아이템의 수를 $${1, 5, 10, 15, 20}$$로 설정해 실험을 수행했습니다. 결과는 노출된 네거티브 아이템의 수를 증가시켜도 성능이 개선되지 않음을 보여줍니다. 이는 노출된 아이템이 편향된 정보를 포함하고 있기 때문입니다. 따라서 RecNS는 자체 증폭 계수(self-amplified factor)를 통해 가장 정보성이 높은 노출 네거티브 아이템을 선택하도록 설계되었습니다.</p>
</li>
</ol>
<hr>
<h2 id="6-관련-연구-related-work"><strong>6. 관련 연구 (Related Work)</strong></h2>
<h3 id="61-그래프-기반-추천-시스템"><strong>6.1 그래프 기반 추천 시스템</strong></h3>
<p>그래프 기반 추천 시스템은 전자상거래 및 소셜 미디어와 같은 다양한 애플리케이션에서 핵심 기술로 주목받고 있습니다. 기존의 협업 필터링(collaborative filtering) 및 행렬 분해(matrix factorization) 방법은 웹 스케일 애플리케이션에는 적합하지 않았습니다. 하지만 딥러닝 기술의 발전으로 그래프 기반 모델이 추천 시스템에 활용되고 있습니다.</p>
<ol>
<li><strong>PinSage [1]:</strong> 웹 스케일 그래프에서 아이템 임베딩을 학습하기 위해 그래프 합성 네트워크(GCN)를 사용합니다.</li>
<li><strong>LightGCN [4]:</strong> GCN을 단순화하여 사용자-아이템 상호작용 그래프에서 효율적으로 임베딩을 학습합니다.</li>
<li><strong>NGCF [15]:</strong> 고차 연결성을 활용하여 사용자-아이템 관계를 명시적으로 학습하는 새로운 프레임워크입니다.</li>
</ol>
<hr>
<h3 id="62-추천에서의-네거티브-샘플링"><strong>6.2 추천에서의 네거티브 샘플링</strong></h3>
<p>네거티브 샘플링은 추천 시스템에서 단일 클래스 문제를 해결하고 학습 속도를 가속화하기 위한 핵심 기술입니다. 기존의 네거티브 샘플링 방법은 다음과 같이 네 가지 범주로 나눌 수 있습니다:</p>
<ol>
<li><p><strong>정적 샘플러(Static Sampler):</strong></p>
<ul>
<li>균일 분포를 사용하는 Uniform Negative Sampling(UniNS) [9].</li>
<li>아이템의 인기도를 기반으로 샘플링하는 PopNS [29], [30].</li>
</ul>
</li>
<li><p><strong>어려운 네거티브 샘플러(Hard Negative Sampler):</strong></p>
<ul>
<li>현재 모델의 점수를 기반으로 하드 네거티브 아이템을 샘플링하는 DNS [16] 및 SimNS [24].</li>
</ul>
</li>
<li><p><strong>GAN 기반 샘플러(GAN-based Sampler):</strong></p>
<ul>
<li>적대적 학습(adversarial learning)을 활용하여 네거티브 아이템을 생성하는 IRGAN [17].</li>
</ul>
</li>
<li><p><strong>보조 정보 기반 샘플러(Auxiliary-based Sampler):</strong></p>
<ul>
<li>그래프 구조, 노출 정보 등 보조 정보를 활용하여 네거티브 아이템을 샘플링하는 MCNS [19] 및 RNS-AS [32].</li>
</ul>
</li>
</ol>
<hr>
<h2 id="7-결론-conclusion"><strong>7. 결론 (Conclusion)</strong></h2>
<p>본 연구에서는 그래프 기반 추천에서의 네거티브 샘플링 문제를 다루며, <strong>세 영역 원칙(Three-Region Principle)</strong>을 제안했습니다. 이 원칙은 중간 영역에서 더 많은 아이템을 네거티브로 샘플링하도록 가이드합니다. 또한, 우리는 <strong>RecNS</strong>라는 효과적인 네거티브 샘플링 방법을 제시했으며, 양성 보조 샘플링과 노출 보강 샘플링을 병합하여 최종 네거티브 임베딩을 생성합니다.</p>
<p>RecNS는 세 가지 대표적인 그래프 기반 추천 모델(PinSage, NGCF, LightGCN)에서 기존 네거티브 샘플링 전략을 대체하여 성능을 크게 향상시켰습니다. 추가적으로, RecNS는 광범위한 실험에서 다른 기존 방법들과 비교하여 우수한 성능을 보였습니다.</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[1번째 프로젝트] 협업을 위한 구조는 어떻게 할까?]]></title>
            <link>https://velog.io/@meo_sun/1%EB%B2%88%EC%A7%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%98%91%EC%97%85%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B5%AC%EC%A1%B0%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%95%A0%EA%B9%8C</link>
            <guid>https://velog.io/@meo_sun/1%EB%B2%88%EC%A7%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%98%91%EC%97%85%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B5%AC%EC%A1%B0%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%95%A0%EA%B9%8C</guid>
            <pubDate>Sun, 29 Sep 2024 15:08:47 GMT</pubDate>
            <description><![CDATA[<h1 id="시작하기-앞서">시작하기 앞서..</h1>
<p>이번에 부스트캠프 7기의 첫 프로젝트를 완료했다.
시계열 분류 예측 모델 만드는 것이 첫 목표였다.
여기서 가장 고민을 많이 했던 부분에 대해 정리하려고 한다.</p>
<h2 id="협업">협업...?</h2>
<p>우리는 <strong>GPU서버 여러대</strong>를 받았다.
<em>물론 이번 프로젝트는 데이터가 크지 않아 GPU 서버를 활용하지는 않았다.</em></p>
<p>이 과정에서 어떻게하면 효율적으로 프로젝트를 운용할 수 있을지 고민해봤다.
그래서 아래와 같은 구조를 만들었다.
<img src="https://velog.velcdn.com/images/meo_sun/post/ca6fb10f-3b0f-42da-9dce-d4d3460a2704/image.png" alt=""></p>
<h3 id="1-eda">1. EDA</h3>
<p><code>EDA</code>는 주로 <code>.ipynb</code> 주피터 노트북 파일을 가장 많이 사용한다.
여기서 데이터 <strong>시각화</strong>, <strong>전처리</strong>, <strong>모델링</strong>까지 말이다.
하지만 이것은 개인적인 파일이지, 협업을 위한 파일은 아니라고 생각이 들었다.</p>
<blockquote>
<p>그래서 <code>EDA</code>만 관리 할 수있는 <strong>디렉토리</strong>를 새로 만들기로 결정했다.</p>
</blockquote>
<h3 id="2-pre-process--model">2. Pre-Process &amp; Model</h3>
<p>그러면 데이터 처리나 모델링은 어떻게 할 수 있을까?
만약 개별적인 <code>.ipynb</code>로 처리하게 된다면, 수도 없이 많은 <strong>중복코드를 양산할 것</strong>이라고 생각이 들었다.
그래서 공통으로 사용할만한 <strong>전처리 기법</strong> 이나 <strong>모델</strong>을 별도로 저장하기로 생각했다.</p>
<blockquote>
<p>또한 위의 과정을 한번에 처리할 수 있는 <code>app.py</code>를 만들어서, 한번에 실행시킬 수 있게 만들었다.
이렇게 되면 <code>Feature-Engineering</code>내용을 <strong>Github</strong>을 통해 공유 할 수있고, 다른 팀원도 만들 수 있을 것 같았다.</p>
</blockquote>
<p>또한 다양한 <code>관련된.py</code>를 만들 수 있도록 추상화된 <code>Interface</code>를 만들었고, 적용시켜놓았다.</p>
<h3 id="3-hyper-parameter">3. Hyper-parameter</h3>
<p> 모델 작업까지 완료되면 <strong>하이퍼 파라미터 튜닝</strong>이 필요했다.</p>
<blockquote>
<p>하이퍼 파라미터는 <strong>자주 변경되는 값</strong>이었고, 매번 코드를 <strong>수정하게 만들면 안될 것</strong> 같았다.
따라서 <strong>별도의 파일로 관리해야한다</strong>라고 생각했고, 그 생각을 통해 <code>4.Config</code>를 만들었다.</p>
</blockquote>
<h3 id="4-config">4. Config</h3>
<p> 위의 방법대로 각각 <code>EDA</code>나 <code>전처리</code>, <code>모델</code> 관련해서 만들었는데, 이것을 어떻게하면 효율적으로 관리할지 고민했다.
 <strong>Config</strong>를 만들기 위한 목적은 <strong>효율성과 편리함</strong> 이다.
 그것을 바탕으로 아래의 4가지에 <strong>Focus</strong>를 두었다.</p>
<blockquote>
<ol>
<li>전처리 과정 선택<ol start="2">
<li>모델 선택</li>
<li>빠르고 다양한 하이퍼파라미터 수정</li>
<li>기타 서버 관리</li>
</ol>
</li>
</ol>
</blockquote>
<p> 위의 4가지를 가장 잘 이루어 낼 수있는 <code>config-sample.yaml</code>을 만들었고, 그것을 팀에게 공유했다.</p>
<h2 id="실패">실패...</h2>
<p> 이번 프로젝트에서 위의 구조는 실패했다.
 정확히는 <code>EDA</code>까지는 괜찮았다. 하지만 <code>모델</code> 및 <code>전처리</code>부분이 들어간 구조가  실패했다.
 내가 생각한 실패의 원인을 3가지로 정리해보았다.</p>
<blockquote>
<ol>
<li>복잡한 개발 방법<ol start="2">
<li>기존 AI 협업 프로젝트 경험의 부재</li>
<li>개발 방법 및 프로젝트 구조에 대해 <strong>팀</strong>에 잘 인지시키지 못한 부분</li>
</ol>
</li>
</ol>
</blockquote>
<p> 다른 원인도 많겠지만 가장 큰 것은 위의 3가지 이유라고 생각이 들었다.
 따라서 다음 프로젝트에서는 조금 더 <strong>개발이 편하고</strong>, <strong>이해하기 쉬우며</strong>, <strong>유지보수가 쉬운</strong>구조로 
 변경하려고한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[추천 시스템] Collaborative-Filtering-for-Implicit-Feedback-Datasets 논문 리뷰]]></title>
            <link>https://velog.io/@meo_sun/%EC%B6%94%EC%B2%9C-%EC%8B%9C%EC%8A%A4%ED%85%9C-Collaborative-Filtering-for-Implicit-Feedback-Datasets-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@meo_sun/%EC%B6%94%EC%B2%9C-%EC%8B%9C%EC%8A%A4%ED%85%9C-Collaborative-Filtering-for-Implicit-Feedback-Datasets-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Mon, 02 Sep 2024 08:07:51 GMT</pubDate>
            <description><![CDATA[<h2 id="추천시스템-collaborative-filtering-for-implicit-feedback-datasets">[추천시스템] Collaborative-Filtering-for-Implicit-Feedback-Datasets</h2>
<p>추천시스템의 논문중 하나인 <strong>Collaborative-Filtering-for-Implicit-Feedback-Datasets</strong>를 리뷰 하겠다.</p>
<h2 id="데이터-및-기타-설명">데이터 및 기타 설명</h2>
<h3 id="1-explicit-feedback명시적-피드백">1. Explicit Feedback(명시적 피드백)</h3>
<p>명시적 피드백은 직접적 피드백이라고도 한다.
이는 유저가 자신의 선호도(Preference)를 직접적으로 표현한 데이터이다.
<strong>예시)</strong></p>
<ul>
<li>리뷰 데이터</li>
<li>평점 데이터</li>
<li>기타</li>
</ul>
<h3 id="2-implicit-feedback간접적-피드백">2. Implicit Feedback(간접적 피드백)</h3>
<p>간접적 피드백은 <strong>EF(Explicit Feedback)</strong>과 달리 간접적으로 선호도(Preference)를 표현한 데이터이다.
<strong>예시)</strong></p>
<ul>
<li>페이지 방문 기록</li>
<li>페이지 방문 시간</li>
<li>기타 움직임</li>
</ul>
<p>해당 <strong>IF</strong>는 <strong>EF</strong>와 다른 점이 몇가지 있다.</p>
<blockquote>
<ol>
<li>부정적인 피드백이 없다.</li>
<li>데이터가 부정확할 수 있다.</li>
<li>수치는 신뢰도를 의미한다.</li>
<li>해당 데이터는 <strong>EF</strong>와 다른 평가 방법을 제시해야한다.</li>
</ol>
</blockquote>
<h3 id="3-r_ui">3. $r_{ui}$</h3>
<p>$r_{ui}$는 <code>관측값(Observation)</code>이라고 한다.
이것은 ${user}_u$가 $Item_i$에대한 표현이다.</p>
<p><strong>EF</strong>에서는 사용자(u)가 아이템(i)에 갖는 선호도를 의미 하며,
<strong>IF</strong>에서는 사용자(u)가 아이템(i)를 구매하거나, 아이템(i)에서 소비한 시간, 혹은 아이템(i)를 구매한 횟수 등을 의미한다.</p>
<p><strong>IF</strong>에서는 <code>관측된 것</code>이 없을 경우 $r_{ui}=0$으로 설정된다. </p>
<h3 id="4-c_ui">4. $c_{ui}$</h3>
<p>$c_{ui}$는 $p_{ui}$를 확인할때 <strong>신뢰도</strong>를 측정하는 변수다.</p>
<blockquote>
<p>$c_{ui}= 1+ar_{ui}$</p>
</blockquote>
<p>위의 식으로 표현되며, 신뢰도의 증가는 <strong>상수($a$)</strong>로 조절된다.
해당 논문에서는 $a = 40$일때 좋은 결과를 내었다.</p>
<h3 id="5-p_ui">5. $p_{ui}$</h3>
<p><strong>$p_{ui}$는 선호도(Prefrence)에 대한 이진 변수다.</strong>
이것은 $r_{ui}$로 부터 파생되며 식은 아래와 같다.</p>
<blockquote>
<p>$
p_{ui}= 1;r_{ui}&gt;0
$
$
p_{ui}= 0;r_{ui}=0
$</p>
</blockquote>
<p>$r_{ui}$가 항목 $i$에 대해 소비한 적 혹은 이용한 적이 있다면, $p_{ui}$는 $1$이 되며, 없을 경우 $p_{ui}$는 $0$이 된다.</p>
<h2 id="본론">본론</h2>
<h3 id="1-neighborhood-model">1. Neighborhood Model</h3>
<p>이웃 기반 모델은 협업 필터링에서 가장 흔한 접근 방식으로, 크게 두 가지 방법이 있습니다:</p>
<h4 id="사용자-중심-접근법user-oriented-approach">사용자 중심 접근법(User-oriented Approach)</h4>
<p>이 방법은 <strong>사용자 간의 유사성</strong>을 기반으로 한다. 
어떤 사용자가 좋아하는 항목의 평가를 바탕으로 비슷한 취향을 가진 다른 사용자들의 평가를 사용하여 예측을 한다.
초기 CF 시스템들은 대부분 이 사용자 중심 접근법을 사용했다.</p>
<h4 id="항목-중심-접근법item-oriented-approach">항목 중심 접근법(Item-oriented Approach)</h4>
<p>이 방법은 <strong>항목 간의 유사성</strong>을 기반으로 한다. <strong>사용자가 평가한 항목</strong> 중에서 <strong>유사한 항목</strong>들을 찾아 해당 항목들의 평가를 바탕으로 예측을 한다.</p>
<blockquote>
<p>흔히 Pearson 상관 계수를 사용.</p>
</blockquote>
<p><strong>장점</strong></p>
<ul>
<li>항목 중심 접근법은 확장성과 정확도가 더 우수함</li>
<li>예측의 근거 설명에 용이</li>
</ul>
<p><strong>단점</strong></p>
<ul>
<li><strong>IF</strong>에서는 이러한 방법이 사용자 선호와 그 신뢰도 간의 구별을 잘 해내지 못함<h3 id="2-svd-model">2. SVD Model</h3>
</li>
<li><em>특이값 분해(Singular Value Decomposition, SVD)*</em>모델 이라고 한다.</li>
</ul>
<p>해당 모델은 사용자 요인$x_u$와 아이템 요인 $y_i$로 표현한다. 
예측은 이 두 요인의 내적(inner product)을 통해 수행된다 </p>
<blockquote>
<p>$$𝑟^𝑢𝑖=𝑥𝑢𝑇𝑦𝑖$$</p>
</blockquote>
<p>파라미터 추정은 주로 정규화된 모델을 사용하여 수행된다.
<img src="https://velog.velcdn.com/images/meo_sun/post/ac02a1ba-68f2-46db-a094-0f9868df9e70/image.png" alt="">
<em><strong>λ는 정규화 파라미터</strong></em>
<em>이미지 출처 : <a href="http://yifanhu.net/PUB/cf.pdf">논문</a></em></p>
<h3 id="3-our-model">3. Our Model</h3>
<h2 id="결론">결론</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[[VAE] VAE 모델]]></title>
            <link>https://velog.io/@meo_sun/VAE-VAE-%EB%AA%A8%EB%8D%B8</link>
            <guid>https://velog.io/@meo_sun/VAE-VAE-%EB%AA%A8%EB%8D%B8</guid>
            <pubDate>Mon, 02 Sep 2024 01:18:39 GMT</pubDate>
            <description><![CDATA[<h2 id="vae">VAE</h2>
<p><strong>VAE(Variational Autoencoder, 변분 오토인코더)</strong>는 머신러닝과 딥러닝에서 많이 사용되는 생성 모델의 하나로, 주로 이미지, 텍스트 등의 데이터를 생성하거나 복원하는 데 활용된다.</p>
<p><strong>VAE</strong>는 일반적인 <strong>오토인코더(Autoencoder)</strong>와 비슷한 구조를 가지지만, 몇 가지 중요한 차이점이 있다.</p>
<h3 id="1-기본-구조">1. 기본 구조</h3>
<p><strong>VAE</strong>는 <strong>인코더(Encoder)</strong>와 <strong>디코더(Decoder)</strong>로 구성된 오토인코더와 유사한 구조를 가지고 있다. </p>
<ul>
<li><strong>인코더</strong>는 입력 데이터를 저차원 잠재 공간(Latent space)으로 압축 </li>
<li><strong>디코더</strong>는 이 잠재 공간의 벡터를 다시 원래의 데이터 공간으로 복원</li>
</ul>
<h3 id="2-확률적-모델링">2. 확률적 모델링</h3>
<p><strong>VAE</strong>의 핵심 차이점은 잠재 공간에서의 벡터가 단순한 값이 아니라 확률 분포로 표현된다는 것이다. </p>
<p><strong>인코더</strong>는 입력 데이터에서 잠재 공간의 평균과 분산을 추정하여, 잠재 벡터를 특정 분포(보통 정규 분포)를 따르는 랜덤 변수로 샘플링하며, 이로 인해 같은 입력 데이터로도 여러 가지 다양한 출력을 생성할 수 있게 된다.</p>
<h3 id="3-손실-함수">3. 손실 함수</h3>
<p><strong>VAE</strong>의 손실 함수는 두 가지 주요 요소로 구성된다.</p>
<ul>
<li><p><strong>재구성 손실(Reconstruction Loss)</strong>: 원래 입력과 디코더의 출력을 비교하여 계산되는 손실로, 일반적인 오토인코더의 손실 함수와 유사하다.</p>
</li>
<li><p><strong>쿨백-라이블러 발산(KL Divergence)</strong>: 잠재 공간에서 추정된 분포와 사전 정의된 분포(보통 정규 분포) 간의 차이를 최소화하려는 손실이다. 이를 통해 잠재 공간이 좀 더 의미 있는 방식으로 구성되도록 유도한다.</p>
</li>
</ul>
<h3 id="4-응용-분야">4. 응용 분야</h3>
<p><strong>VAE</strong>는 다음과 같은 다양한 분야에서 활용된다.</p>
<ul>
<li><p><strong>이미지 생성</strong>: 새로운 이미지를 생성하거나, 주어진 이미지와 유사한 이미지를 생성하는 데 사용</p>
</li>
<li><p><strong>데이터 복원</strong>: 손상된 데이터를 복원하거나, 노이즈가 있는 데이터를 제거하는 데 활용</p>
</li>
<li><p><strong>특징 학습</strong>: 데이터의 중요한 특징을 학습하는 데 사용되며, 이를 통해 다운스트림 작업(예: 분류, 군집화)에서 성능을 향상시킬 수 있다.</p>
</li>
</ul>
<p><strong>VAE</strong>는 <strong>GAN(Generative Adversarial Network)</strong>과 같은 다른 생성 모델과 비교했을 때, 학습이 안정적이고 해석 가능성이 높다는 장점이 있다. 
그러나 생성된 결과물이 다소 흐릿할 수 있는 단점이 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 시각화란?]]></title>
            <link>https://velog.io/@meo_sun/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%8B%9C%EA%B0%81%ED%99%94%EB%9E%80</link>
            <guid>https://velog.io/@meo_sun/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%8B%9C%EA%B0%81%ED%99%94%EB%9E%80</guid>
            <pubDate>Fri, 23 Aug 2024 09:30:41 GMT</pubDate>
            <description><![CDATA[<h1 id="데이터-시각화">데이터 시각화</h1>
<p>데이터 시각화란? 일반적으로 데이터를 미적으로 표현하는 방법을 말한다.
데이터 시각화를 하면 눈에 띄지 않던 부분이 더 눈에 띌 수 있고, 설명이나 설득할때 정보 전달력이 증가한다.</p>
<blockquote>
<p><em>물론 너무 남발하면 전달력이 줄어든다...</em></p>
</blockquote>
<h2 id="시각화는-왜-해야할까">시각화는 왜 해야할까?</h2>
<p>사실 정보를 가장 많이 담고 있는 것은 글 혹은 Text 이다.
책을 기준으로 보면 많은 내용을 담고 있는 것은 글이라는 것을 알 수 있다.
하지만 글로만 된 책을 보면 지루하고, 내용에 대한 집중이 안된다.
이때 시각화된 그래프 혹은 차트, 그림이 있다면 시각적 전환으로 인해 집중이 된다.
또한 시각화와 글을 같이 보면 인지 및 지각능력을 확 깨워, 효율적으로 글을 이해하기 쉬워진다. </p>
<h2 id="데이터-시각화의-핵심">데이터 시각화의 핵심?</h2>
<p>데이터 시각화의 핵심은 크게 두가지라고 할 수 있다.</p>
<pre><code>1. Expressiveness: 데이터가 가진 정보를 시각적 요소로 모두 표현
2. Effectiveness: 중요한 정보(데이터)는 부각되어야 한다.</code></pre><p>이 두가지를 모두 고려해서 시각화를 하는 것이 핵심이다.
이것을 <code>Visual Encoding</code>이라고 한다.</p>
<h3 id="시각화의-핵심을-잘-지킬-수-있는-방법">시각화의 핵심을 잘 지킬 수 있는 방법</h3>
<p>시각화의 핵심을 잘 지킬 수 있는 방법은 데이터간 특성에 차별성을 두어 표현 하는 것이 일반적이다.
그 방법으로는 다양한데, 두가지만 설명 하겠다.</p>
<pre><code>1. Mark - point/line/area
2. Channel - Mark를 디자인적으로 변경할 수 있는 요소</code></pre><h4 id="mark">Mark</h4>
<p>우리가 <code>matplotlib</code>을 사용하게 되면 <code>plt.scatter</code>를 많이 사용한다.
<code>plt.scatter</code>는 <code>line</code>으로도 <code>scatter</code>로도 또는 다른 것으로도 그릴 수 있다.
이때 표현하는 방식(Marking)을 변경할 수 있는 것이 <code>Mark</code>이다.</p>
<ul>
<li>point : 점</li>
<li>line : 선</li>
<li>area : 면</li>
</ul>
<p>으로 표현 가능하며, 필요에 따라 적절한 <code>mark</code>를 선정하는 것이 중요하다.</p>
<h4 id="channel">Channel</h4>
<p><strong>Channel</strong>은 <code>Mark</code>를 조금 더 디자인적, 미적 요소로 부각되게 표현하도록 도와주는 요소이다.</p>
<p><code>Channel</code>또한 다양한 방법이 존재한다.</p>
<ul>
<li>position : 위치</li>
<li>scale : 사이즈</li>
<li>lenght : 길이</li>
<li>Tilt / Angle : 각도 조정</li>
<li>Area </li>
<li>Depth : 깊이</li>
<li>Color : 색상</li>
<li>Curvature : 곡률</li>
<li>volume: 볼륨</li>
<li>spatial region</li>
<li>color hue</li>
<li>motion</li>
<li>shape : 모양</li>
</ul>
<p>위와 같은 다양한 요소를 변경함으로써 <code>시각화</code>에서 더욱 부각되는 요소를 만들 수 있다.</p>
<h2 id="효율적인-시각화를-위한-원칙">효율적인 시각화를 위한 원칙</h2>
<p>시각화를 효율적으로 하기 위해서 지켜야 하는 원칙들이 있다.</p>
<pre><code>1. Accuracy: 시각화의 정확도
2. Discriminablitiy: 시각화시 각각 구별 가능한지
3. Separability: 시각화 분리성
4. Popout: 시각적인 대비
5. Grouping: 시각화시 각각 그룹에 대한 그룹화</code></pre><p> 여기서 <code>Popout</code>이라는 개념이 등장하는데
 <strong>Popout</strong>은 <code>전주의적 속성</code>을 갖고 있어야한다.</p>
<blockquote>
<p>전주의적 속성(PreAttentive Attribute): 주의하지 않더라도 인지하게 되는 요소</p>
</blockquote>
<p> 단 이 <code>전주의적 속성</code>을 동시에 사용하게 만들면, 오히려 볼때 난잡하고 어려울 수 있으므로 잘 고려해서 사용해야한다.</p>
<h1 id="시각화의-종류">시각화의 종류</h1>
<p>시각화의 종류에는 많은 것들이 있다.
대표적으로 알려진 <code>Bar/Line/Scatter/etc..</code> 이것 외에도 많은 시각화 종류가 있는데, 이번에 저 3가지(<code>Bar/Line/Scatter</code>)의 특성에 대해 알아보겠다.</p>
<h2 id="bar-plot막대-그래프">Bar-plot(막대 그래프)</h2>
<p>막대그래프는 범주에 따른 수치값을 비교하기에 적합한 그래프이다.
여기서 범주란 개별 혹은 그룹을 의미하며, 두가지 모두 비교하기에 효과적이다.</p>
<h3 id="막대그래프-종류">막대그래프 종류</h3>
<p>막대그래프 종류도 다양 한 것이 있지만, 3가지를 소개한다.</p>
<h4 id="1-stacked-bar-plot">1. Stacked Bar Plot</h4>
<p>위로 쌓이는 Stack형 막대그래프이다.
대부분 <code>Count</code>된 수치형으로 그리지만, <code>Percent</code>로 표현할때는
<code>Percentage Bar Plot</code>을 이용하면 된다.</p>
<h4 id="2-overlapped-bar-plot">2. Overlapped Bar Plot</h4>
<p>겹쳐지는 형태의 막대그래프이다. 일반적으로 두개의 그룹비교에만 사용하고 그이상에는 잘 사용하지 않는다.
이유로는 겹쳐진 형태의 막대그래프 이기때문에, 비교하기 힘들고 시각적으로 구분하기 어렵기 때문이다.
또한 시각적 구분을 위해 <code>alpha(투명도)</code>를 조절해야만 한다.</p>
<h4 id="3groupped-bar-plot">3.Groupped Bar Plot</h4>
<p>많이 보이는 형태의 막대그래프로, 그룹끼리 이웃되게 그리는 <code>Bar Plot</code>이다.
범주에따라 그룹을 구분하기 편하므로 많이 사용되는 그래프이다.</p>
<blockquote>
<p>단 Matplotlib을 사용할때는 구현이 까다로우므로, 다른 Libary를 이용하는 것을 추천한다.</p>
</blockquote>
<h3 id="주의사항">주의사항</h3>
<p>막대 그래프를 그릴때는 주의사항이 있는데</p>
<pre><code>1. 실제 양(Size)와 그래픽 크기(Size)는 동일해야한다.
2. 반드시 X축 시작은 0으로 한다.
3. 데이터는 정렬해서 그려야한다.
4. 불필요한 복잡성은 배제해야한다.
5. 시각화 보는 Target을 선정해서, 목적에 맞도록 Barplot을 그려야한다.</code></pre><p>위의 주의사항을 지켜야 더 효율적으로 막대그래프를 해석 할 수 있다.</p>
<h2 id="line-plot선-그래프">Line Plot(선 그래프)</h2>
<p>선 그래프는 일반적으로 시계열 데이터를 표현할때 사용한다.
하지만 시계열 데이터는 <code>Noise</code>를 포함할때가 많은데, 이경우 <code>Smoothing</code>을 활용하면 부드럽게 표현 가능하다.</p>
<h3 id="주의사항-1">주의사항</h3>
<pre><code>1. Barplot과 다르게 축을 0에서 시작할 필요가 없다.
2. 너무 구체적인 시각화보다 조금 생략된(Smoothing) 시각화가 나을 수 있다.
3. 자세한 데이터는 표를 같이 동봉해주면 좋다.
4. 데이터가 너무 생략되지 않는 선에서 범위(limit)을 조절한다.
5. 선의 연결성을 주의해야 한다.
(**보간**으로 인해 데이터가 없음에도 각 점끼리 연결되어 데이터가 있는 것처럼 보일 수 있다.)</code></pre><h2 id="scatter-plot산점도">Scatter Plot(산점도)</h2>
<p>산점도는 두 Feature간의 인과관계를 알기 쉽게 만드는 시각화이다.</p>
<blockquote>
<p><em>인과관계 != 상관관계</em></p>
</blockquote>
<p>산점도를 효율적으로 표현하기 위한 방법으로는</p>
<pre><code>1. 투명도 조정
2. 지터링: 점위치 변경
3. 2D-Hist: Heatmap Style로 점을 2D-Hist로 표현
4. Contour Plot: 등고선 느낌으로 산점도로 표현
5. 색상 변경: 연속형 = Gradient / 이산형 = Each Color
--- 이하는 잘 사용하지 않는 방법 ---
6. Marker 변경
7. Bubble Chart</code></pre><p>위와같은 방법을 통해 산점도를 조금 더 효율적으로 표현 할 수 있다.</p>
<h3 id="주의사항-2">주의사항</h3>
<blockquote>
<p>산점도 표현시, <strong>Grid</strong>는 사용을 <strong>지양</strong>한다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[EDA] 탐색적 데이터 분석]]></title>
            <link>https://velog.io/@meo_sun/EDA-%ED%83%90%EC%83%89%EC%A0%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@meo_sun/EDA-%ED%83%90%EC%83%89%EC%A0%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Fri, 23 Aug 2024 05:53:52 GMT</pubDate>
            <description><![CDATA[<h1 id="eda">EDA</h1>
<p>현재 <strong>EDA(탐색적 데이터분석)</strong>은 AI 모델을 만들거나, 분석할때 빠질 수 없는 부분이다.
과거 데이터 분석은 통계적 데이터 분석에 기반하였는데, 통계적 데이터 분석은 <strong>추론(Inference)</strong>가 주요 핵심이었다.
현재는 추론 뿐만 아니라 시각화 및 각종 작업을 통한 데이터들의 형태를 낱낱이 파헤치는데 목적이있다.</p>
<p> 이작업이 제대로 이루어지지 않으면, 추후 <code>AI 모델 작업</code>이나 <code>데이터 관련 작업</code>시 문제가 생길 여지가 많으므로 꼼꼼히 이루어져야 한다.
 또한 데이터 처리 작업을 하면서도 지속적으로 <code>EDA</code>를 하여 데이터의 흐름을 파악하여야한다.</p>
<h2 id="왜-데이터에-초점이-맞춰져-있는가">왜 데이터에 초점이 맞춰져 있는가?</h2>
<p>데이터에 초점이 맞춰진 이유로 3가지를 이야기하려고한다.</p>
<h3 id="1-해석">1. 해석</h3>
<p>현재 문제 혹은 현재 발생된 상황에 대해 <strong>해석</strong>을 해야하는 일이 종종 있다.
경험 기반으로 추론하여 <strong>해석</strong>하기도 하지만, 요즘은 데이터 기반으로 해석을 한다.
<code>과거</code> 혹은 <code>현재</code> 데이터 기반으로 <code>현재 상태를 파악</code>하여 <code>패턴</code>과 같은 결과물을 만들어낸다.
또한 이러한 결과물을 바탕으로 <code>왜 발생했는지</code> 혹은 <code>왜 문제가 생겼는지</code>를 해석할 수 있게 된다.</p>
<h3 id="2-의사결정">2. 의사결정</h3>
<p>1번의 해석을 바탕으로 우리는 <code>데이터</code>에서 인사이트를 얻을 수 있었다.
이후 문제를 해결하기 위해서 <code>어떻게 진행할지</code>에 대해 <code>의사결정</code>을 해야한다.
그렇다면 이 <code>의사결정</code>을 위해 <code>해석</code>에서 활용된 <code>특정 데이터</code>를 기반 혹은 바탕으로 사용하게 된다.</p>
<p><code>데이터</code>는 의사결정에서도 빠질 수 없는 중요한 포인트가 된다.</p>
<h3 id="3-예측">3. 예측</h3>
<p>1번의 해석과 2번의 의사결정이 끝났다면, 그다음에 같은 <code>문제가 발생하지 않도록</code> 미리 파악해야한다.
이 과정이 예측이다. 
예측에서는 <strong>과거 데이터</strong>에서 <strong>패턴</strong>을 파악하고 예측하기도 하며,
<strong>통계 모델</strong> 및 <strong>AI/ML</strong>을 통한 다양한 모델 방법론을 활용하기도 한다.
또한 경험을 바탕으로 예측하기도 하는데, 요즘은 대부분 <code>데이터</code>를 기반으로한 예측 모델을 만들어 하기때문에 <code>데이터</code>는 예측에서도 빠질 수 없는 중요한 포인트이다.</p>
<h2 id="데이터관련-업계의-문제점">데이터관련 업계의 문제점?</h2>
<p>데이터로 모든 것이 예측 가능하고, 해석도 가능할 것으로 보인다.
하지만 이것은 잘 못되었다고 말할 수 있다.
데이터의 <strong>오남용</strong>으로 인해, 업계간에 문제도 생기고 개인간의 문제도 발생된다.</p>
<p>그렇다면 무엇때문에 데이터 업계에서 오남용 혹은 문제가 발생하는 걸까?</p>
<h3 id="1-명확한-목표의-부재-및-잘못된-target">1. 명확한 목표의 부재 및 잘못된 Target</h3>
<p>데이터를 활용할때는 내가 하고자하는 명확한 목표가 있어야한다.
하지만 몇몇 사람들은 내가 세운 목표가 명확하지 않음에도, 명확하다고 착각하는 경우가 있다.</p>
<p>예를 몇가지 들자면</p>
<ul>
<li>주식과 코인을 차트만으로 예측할 수 있다</li>
<li>지구의 미래는 현재 상황만으로 예측 가능하다</li>
<li>부동산 시장은 실 거래 현황만으로도 예측 가능하다.</li>
</ul>
<p>위의 Case가 어떻게 보면 가능한 것처럼 보이지만, 실제로 그것 외에도 많은 요인이 존재한다.
또한 <code>명확하게 어떠한 상황을 무엇을 가지고 예측하는지</code>가 아닌, 일부 데이터만을 가지고 <code>불명확한 미래</code>에 대해 예측하려고한다.
이러한 예측은 <strong>잘못된 예측</strong>이 될 확률이 높다.</p>
<h3 id="2-데이터와-리소스의-부족부재">2. 데이터와 리소스의 부족(부재)</h3>
<p>가끔 일을 하다보면, 데이터가 없음에도 AI 모델을 만들어 달라는 제안을 받는다.</p>
<p>실제로 들었던 이야기를 예로 들어 보겠다. </p>
<blockquote>
<ol>
<li>요즘 <code>GPT</code>가 유행이라는데 우리회사를 위해 하나 만들어줘
 : <code>데이터</code>도 없고 <code>GPU</code>는 없지만, 금방 하는 거 아니야?<ol start="2">
<li>우리 해외 업체에 물건을 납품해야하는데, 그 업체의 사정에 딱 맞게 동작하는 AI 모델을 만들어줘
: 마찬가지로 <code>데이터</code>도 없고 <code>GPU</code>는 없지만, 그냥 만들어서 넣어줘</li>
</ol>
</li>
</ol>
</blockquote>
<p>이뿐만 아니라 많은 이야기들이 있었지만, 대체적으로 보면 데이터가 한두개만 있어도 있다고 생각하는 사람들이 종종 있다.
<code>AI/ML</code>모델을 쓸 수 있을 정도로 만드려면, 생각 보다 많은 데이터와 리소스가 필요하다.</p>
<p>하지만 많은 사람들이 데이터 몇개만으로도 충분하고 GPU가 부족하더라도 가능할 것이라고 생각한다.
이러한 문제로 인해 데이터 업계에서 문제가 발생하기도 한다...</p>
<blockquote>
<p><em>개발자 살려...</em></p>
</blockquote>
<h3 id="3-데이터에-대한-잘못된-인식">3. 데이터에 대한 잘못된 인식</h3>
<p>가끔 데이터가 모든 것을 해결해 줄 것이라고<strong><em>(=만능)</em></strong> 생각하는 사람들이 있다.
과거 데이터를 적재를 잘해놓았다고, 많은 데이터가 있다고 하여 <code>데이터 분석</code>을 해달라는 의뢰를 받은 적이 있었다.</p>
<p>데이터가 정리된 상태로 적재가 잘되어 있을 것이라고 기대하고 간 나는...
실제로 그렇지 못한 환경에 부딪혔다.</p>
<p>적재가 되어있다던 데이터는 위치도 제각각에 저장되어 있으며, 일정한 규칙 또한 없었다.
또한 많다던 데이터는 일정한 패턴이나 정리 없이 무작정 적재만 되어있었다.</p>
<blockquote>
<p><em>또다시 눈물이...</em>
<em>의뢰인은 위의 데이터만 있어도 <strong>더이상의 처리 없이</strong> 분석이 빠르게 될 것이라고 생각했다.</em></p>
</blockquote>
<p>실제는 데이터 가공하고 적재하는 것을 정리하는데만 오래 걸렸다.
또한 분석할 수 있는 데이터는 실제로 많지 않았다..</p>
<p>이처럼 데이터만 있으면 모든 것이 될 것이라고 생각하는 사람들 또한 종종 있다.</p>
<h2 id="어떻게-하면-데이터를-잘-활용할-수-있을까">어떻게 하면 데이터를 잘 활용할 수 있을까?</h2>
<p>데이터를 잘 활용하기 위해서는 <code>데이터 문해력</code>이라는 것을 길러야 한다.</p>
<h3 id="데이터-문해력-이란">데이터 문해력 이란</h3>
<blockquote>
<p>데이터를 건전한 목적과 윤리적인 방법으로 사용한다는 전제하에,
현실 세상의 문제에 대한 끊임없는 탐구를 통해 질문하고 대답하는 능력</p>
</blockquote>
<h3 id="그렇다면-데이터-문해력은-어떻게-기를-수-있을까">그렇다면 데이터 문해력은 어떻게 기를 수 있을까?</h3>
<p>대표적으로 데이터 문해력을 기르는 방법은 아래와 같다.</p>
<pre><code>1. 좋은 질문을 할 수 있어야 한다.
2. 필요데이터를 선별하고 검증할 수 있어야한다.
3. 데이터 해석을 바탕으로 유의미한 결론을 낼 수 있어야 한다.
    (Modeling 포함)
4. 가설 기반 혹은 A/B 테스트 후, 결과를 판별할 수 있어야 한다.
    (Model간 비교/선택 포함)
5. 의사결정자들이 이해하기 쉽게 분석 결과를 표현할 수 있어야한다.
    (보기 좋은 시각화 혹은 정리)
6. 데이터 스토리 텔링을 통해 관리자가 전체 그림을 이해하고, 분석 결과에 따라 실행할 수 있도록 만들 수 있어야한다.</code></pre><p>위와 같은 방법을 통해 데이터 문해력을 기르고 더 나아가 목적에 맞는 <code>EDA</code>를 잘 진행할 수 있을 것이다.</p>
<h2 id="eda-진행-방법">EDA 진행 방법</h2>
<p>그렇다면 AI 모델 학습을 위한 <code>EDA</code>는 어떻게 진행하면 될까?
일반적인 AI 공모전 혹은 모델 학습을 예로 들어서 설명 하겠다.</p>
<pre><code>1. Input Data 파악
(데이터 유형 / 유사 데이터 파악)
2. 데이터 전처리
(Input Data를 어떻게 가공할 지)
3. 모델 후보 선정
(AI 모델과 학습 방법론 선정)
4. Target Data와 Metric 정보 파악
(Baseline 모델 / Baseline 점수 파악)</code></pre><p>위의 순서로 EDA를 진행하여 모델을 만드는 것이 일반적이다.</p>
<h2 id="데이터-선별-과정">데이터 선별 과정</h2>
<p><code>EDA</code>를 잘 진행하기 위해서, 데이터를 선별하는 과정 또한 중요하다.
데이터를 잘 선별하기 위해선 기준이 있어야 하는데, 그 기준은 아래와 같다.</p>
<pre><code>1. 데이터 수집이 올바르게 되었는지?
2. 이상치(Outlier)는 어떤 기준으로 선별 되는지?
3. 이상치(Outlier)는 이후 분석에서 어떻게 사용할지?
4. 결측치가 생긴 부분은 어느 부분인지?
5. 결측치가 있는 부분을 사용할 것인지?
6. 외부 데이터를 가져온 다면 어떤 것이 가장 큰 차이를 만들지?
7. 새로 만들거나 생길 데이터에서 고려하지 못한 부분이 어떤 것이 있을지?(Edge Case)</code></pre><h2 id="모델-선정-방법">모델 선정 방법</h2>
<p>AI 모델을 선정할때 가장 중요한 것은 <code>결과</code>이지만, 실제 Product를 만든다면 <code>배포</code> 또한 중요하게 고려해야한다.</p>
<p>결과만 중시한다면, 성능적인 부분만 고려해도 되지만
배포가 고려된다면 <code>시간</code>과 <code>비용</code>적인 측면 또한 고려를 해야한다.</p>
<p><code>배포</code>시 모델 선정 방법에 대해 간단하게 정리 해보겠다.</p>
<pre><code>1. 학습시간(Training Time)
2. 예측/추론 시간(Inference Time)
3. 비용(Cost)
4. 안정성과 보안(Stablility and Security)
5. 지속적 업데이트를 위한 비용 과 방법 (CI/CD)</code></pre><h2 id="결과물">결과물</h2>
<p>해당 <code>EDA</code>와 <code>모델작업</code>이 완료되면 결과물로써, 타인에게 공유를 해야한다.
이때 <code>EDA</code>에서는 해석을 도울 방법론을 고려해야하는데, 가장 많이 사용되는 것은 <strong>시각화</strong>이다.</p>
<p>결과를 시각화 하게되면 미적 요소로 인해 <code>보기 편하고</code> 해당 부분으로 인해
<code>파악해야하는 부분이 명확</code>해지며, <code>설득에 효과적</code>이게 된다.
여기에 부족한 부분은 <code>표</code> 나 <code>테이블</code>형태로 제공하게 되면, 더욱 적절한 <code>EDA</code>결과물이 만들어 지게 되는 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Data Preprocessing] 데이터 전처리 방법론]]></title>
            <link>https://velog.io/@meo_sun/Data-Preprocessing-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC-%EB%B0%A9%EB%B2%95%EB%A1%A0</link>
            <guid>https://velog.io/@meo_sun/Data-Preprocessing-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC-%EB%B0%A9%EB%B2%95%EB%A1%A0</guid>
            <pubDate>Thu, 22 Aug 2024 09:51:07 GMT</pubDate>
            <description><![CDATA[<h1 id="data-pre-processing">Data Pre-processing?</h1>
<blockquote>
<p>데이터 전처리란?</p>
</blockquote>
<p>데이터 전처리는 우리가 <code>AI 모델</code>을 학습시키거나, 추론등의 과정에서 데이터를 정제하는 방법이다.
여러가지 요소 혹은 원인에따라 <code>데이터 전처리</code>를 해야하는데, 그중 몇가지 방법에 대해 설명하고자 한다.</p>
<h2 id="1-zero-centered-and-normalization">1. Zero-Centered and Normalization</h2>
<p><code>0-중심화</code> 및 <code>정규화</code>라는 방법이다.
이것은 데이터를 학습시키기전에 사용하는 방법인데, 사용하는 이유는 다음과 같다. </p>
<ul>
<li>Fitting 적합성 증가</li>
<li>오차 감소</li>
</ul>
<p>왜 이렇게 되는지 의문이 들 수있다.
일단 분포가 널리 퍼져있으면 <code>가중치(weight)</code>값에 따라 큰 오차를 발생시킨다.
하지만 분포를 <code>0-중심</code>으로 맞추고 <code>정규화</code>를 하게되면 분포가 일정하게 가운데로 모이는데,
이때 <code>가중치</code>를 주게되면 오차가 줄어들게 되는 것이다. </p>
<p>따라서 이후 <code>최적화(Optimize)</code> 가 더 손쉽게 이루어지게 되는 것이다.</p>
<h2 id="2-pca">2. PCA</h2>
<blockquote>
<p>PCA는 주성분 분석이라고 한다.</p>
</blockquote>
<p>이 방법은 통계학 전공때 배웠던 내용이다.
상관계수가 높은 항목들을 <code>Linear</code> 예측을 하기위해 사용한 방법인데.
원래는 상관계수가 서로 높을 경우, <code>Linear 모델 학습</code>시 문제가 생기기 때문에 종종 <code>PCA</code>로 처리한다.</p>
<p><strong>PCA</strong>의 특징으로는 아래와 같다.</p>
<ol>
<li>데이터를 <strong>정규화</strong> 하고 <strong>0-Centered</strong> 한다.</li>
<li><strong>차원 축소</strong>가 가능하다.</li>
</ol>
<p>여기서 <code>차원 축소</code>가 좀 의아할텐데, <strong>PCA</strong>는 <code>n-features</code>의 다른 특징들을 받아 추출한다.
이를 통해 <strong>PCA Feature</strong>가 생성되게 되는데, 이중 일부를 사용하면 <code>축소</code>가 가능한 것이다.</p>
<p>여기서 <code>Whitening</code>이라는 기법이 있는데, 최대한 중복이 덜 되게 입력하는 방법이다.
간단하게 설명하면 <code>공분산 행렬</code>을 통해 각각의 축이 <code>같은 중요도</code>를 갖게하여 동일한 분산을 갖게 하는 방법이다.</p>
<h2 id="3-data-augmentation">3. Data Augmentation</h2>
<blockquote>
<p>데이터가 적을때, 데이터를 <strong>확장(증가)</strong> 시키는 기법</p>
</blockquote>
<p>예를 들어 이미지 데이터를 학습할 때, 많은 데이터를 구하는 것은 <strong>비용(Cost)</strong>적으로도 <strong>시간</strong>적으로도 많은 것을 소모해야한다.
이때 같은 데이터를 가지고, 효율적으로 증가 시키는 방법이 있는데 이것이 <code>Data Augmentation</code>이다.</p>
<p> 그렇다면 어떻게 증가시킬 수 있을까?</p>
<ol>
<li>데이터를 수정한다.</li>
<li><strong>분류값(Class)</strong>는 <strong>고정(불변)</strong>한다.</li>
</ol>
<p>위의 간단한 방법으로 할 수 있는데, 수정 방법은 아래와 같다</p>
<ul>
<li><strong>Box(Blur)</strong> 처리</li>
<li><strong>Image Shift</strong></li>
<li><strong>Tint(색조)</strong> 처리</li>
<li><strong>Horizontal Flip(좌우 반전)</strong> - <em>수직 반전은 데이터가 <strong>왜곡</strong> 될수 있으므로 유의</em></li>
<li><strong>Random Crop</strong> - 데이터를 일부만 잘라서 인식(<strong>Translation Invariance</strong> : Pixel을 옮기더라도 같은 Class로 인식)</li>
<li><strong>Scaling</strong> - Image Pixel 사이즈를 늘리거나 줄임</li>
<li><strong>Random Crop and Scaling</strong> - <em>하단 추가 설명</em></li>
<li><strong>Color Jitter</strong> - 색이나 빛 바램등의 처리를 통해 원본을 변형 시킨다.</li>
</ul>
<p><strong>기타 방법들</strong></p>
<ul>
<li>Translation</li>
<li>Rotation</li>
<li>Stretching</li>
<li>Shearing</li>
<li>Random Blocking</li>
<li>Add Noise</li>
<li>Mix two image</li>
<li>Apply filter</li>
</ul>
<p>위 방법으로 데이터를 수정해서, 같은 이미지로 중복 생산 가능하다.</p>
<blockquote>
<p><strong>주의!</strong> Image의 분류값(Class)은 절대 변해서는 안된다.
이경우 다른데이터로 인식하므로 학습시 불리하다.</p>
</blockquote>
<h3 id="random-crop-and-scaling-추가-설명">Random Crop and Scaling 추가 설명</h3>
<p>해당 방법은 <code>Random</code>하게 일부를 잘라 <code>Scaling</code> 하는 방법이다.
동작 예제는 아래와 같다.
<strong>학습(Train)</strong></p>
<ol>
<li>Image 범위(Shape)에서 L을 선택한다.
L은 <code>Shape중 작은 사이즈</code>가 L이된다.</li>
<li>해당 L로 <code>L x L</code>이 되도록 사이즈를 조정한다. (ex, $L=256$ 이면, $256 * 256$으로 조정)</li>
<li>L보다 작은 사이즈로 <code>Crop</code> 하여 <code>Sampling</code>한다. ($L=256,L_{crop} = 224,Size_{crop}=L_{crop}*L_{crop}$)</li>
</ol>
<p><strong>테스트(Test)</strong></p>
<ol>
<li>이미지 크기를 <code>Scaling</code> 하여 $L*L$의 사이즈로 만든다.</li>
<li>$L_{crop}*L_{crop}$의 사이즈로 Image를 <code>N</code>개 <code>Crop</code>하여 예측한다.</li>
<li>해당 결과들의 값을 <code>Avg</code>하거나 <code>Max</code>값을 기준으로 분류한다.</li>
</ol>
<p>위의 방법으로 비교적 적은 이미지로 학습시키고, 테스트하여 검증 할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Learning Rate] Optimize 학습률 설명 ]]></title>
            <link>https://velog.io/@meo_sun/Learning-Rate-Optimize-%ED%95%99%EC%8A%B5%EB%A5%A0-%EC%84%A4%EB%AA%85</link>
            <guid>https://velog.io/@meo_sun/Learning-Rate-Optimize-%ED%95%99%EC%8A%B5%EB%A5%A0-%EC%84%A4%EB%AA%85</guid>
            <pubDate>Wed, 21 Aug 2024 09:33:34 GMT</pubDate>
            <description><![CDATA[<h2 id="learning-rate">Learning Rate?</h2>
<p>일반적으로 <code>Optimizer</code>들은 <strong>Learning Rate</strong>들을 설정해야한다.
하지만 너무 높거나 낮게 설정하면 Model 학습에 문제가 생긴다.</p>
<ul>
<li>High LR(높은 학습률) : Loss가 급증하며, 수렴이 잘안된다.</li>
<li>Low LR(낮은 학습률) : Loss는 줄어들지만, 수렴 속도가 느리다.</li>
</ul>
<p>이처럼 Learning Rate를 설정하는 부분은 쉽지않은데, 일반적으로는 Engineer의 경험에따라 설정하게 된다.</p>
<p>그렇지만 조금 더 효율적으로 설정할 수  있는 방법 론이 있는데, <code>Learning Rate Decay</code>라는 방법이다.</p>
<h3 id="learning-rate-decay">Learning Rate Decay?</h3>
<p><strong>Learning Rate Decay</strong>는 초기에는 LR을 높이다가, 천천히 줄어드게 만드는 방법론이다.</p>
<blockquote>
<p>Low LR 설정 -&gt; LR 증가 -&gt; LR 감소-&gt; LR 감소 로도 진행가능 (<strong>Initial WarmUp</strong> - Linear)</p>
</blockquote>
<p>이 방법에는 여러가지가 있는데,
간단하게 정렬 하자면 4가지 방법론이 있다.</p>
<h4 id="1-step">1. Step</h4>
<blockquote>
<p>특정 <strong>Epoch</strong> 기준으로 LR를 감소시키는 방법론이다.</p>
</blockquote>
<p><strong>LR</strong> 감소 기준 및 <strong>Epoch</strong> 감소 위치 설정은 개인의 경험으로 설정하면 된다.
하지만 그만큼 조정해야할 <strong>HyperParameter</strong>가 증가하게되어, 경우의 수가 증가하게 된다.</p>
<h4 id="2-cosine">2. Cosine</h4>
<p>$$ 
LR_t(Learning Rate(T)) = \frac 1 2 LR_0(1+cos(\frac {epoch_{t}\pi} {n_epochs}))
$$</p>
<p>초기 설정한 <strong>LR</strong>에서 Epoch 마다 <strong>Cos</strong> 연산을 통해 <strong>LR</strong>을 업데이트하는 방법이다.</p>
<p>전체적인 흐름이 부드럽게 움직이기때문에 많이 사용한다.</p>
<h4 id="3-linear">3. Linear</h4>
<p>$$
LR_t = LR_0(1-\frac {epoch_{t}} {n_epochs})
$$
<strong>Linear Decay</strong>는 선형적으로 <strong>LR</strong>을 업데이트하는 방법으로, 수식은 위처럼 간단하게 표현 가능하다.</p>
<h4 id="4-inverse-sqrt">4. Inverse SQRT</h4>
<p>$$
LR_t = \frac {LR_0} {\sqrt {epoch_t}}
$$
마지막으로 <strong>Inverse SQRT Decay</strong>인데
흐름은 <strong>Cos Decay</strong>와 유사하지만, <strong>epoch</strong>의 역제곱근으로 곱해지는 방법이다.
하지만 시간이 지날수록 <strong>Cos Decay</strong>보다 <strong>LR</strong>이 빠르게 감소하므로, 실제로 <strong>Cos Decay</strong>가 조금 더 잘 수렴할 수 있을 것으로 보입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Weight Initialization] 가중치 초기화]]></title>
            <link>https://velog.io/@meo_sun/Weight-Initialization-%EA%B0%80%EC%A4%91%EC%B9%98-%EC%B4%88%EA%B8%B0%ED%99%94</link>
            <guid>https://velog.io/@meo_sun/Weight-Initialization-%EA%B0%80%EC%A4%91%EC%B9%98-%EC%B4%88%EA%B8%B0%ED%99%94</guid>
            <pubDate>Tue, 20 Aug 2024 10:15:13 GMT</pubDate>
            <description><![CDATA[<h2 id="가중치-초기화란">가중치 초기화란</h2>
<p><code>AI Model</code>을 작성할때 <code>bias</code>와 <code>weight</code>를 초기화 해야한다.
해당 초기화 값 기준으로 서서히 <code>model</code>에 맞게 <strong>fitting</strong> 되는데, 초기화 값을 잘못 설정할 경우</p>
<ul>
<li>수렴 실패</li>
<li>수렴 속도 느림</li>
</ul>
<p>등의 문제를 겪을 수 있다.
따라서 <strong>가중치 초기화</strong> 하는 방법에 대해 알아 보겠다.
<strong>Weight initialization(가중치 초기화)</strong> 방법 중 오늘은 3가지를 소개하겠다.</p>
<ol>
<li><strong>Small Gausssian Random</strong></li>
<li><strong>Large Gaussian Random</strong></li>
<li><strong>Xavier Initialization</strong></li>
</ol>
<h2 id="1-small-gaussian-random">1. Small Gaussian Random</h2>
<p><strong>Small Gaussian Random</strong>은 $N(Normal.Dist)$~$[d_in,d_out]$에서 데이터를 <strong>Sampling</strong> 하여 
작은 값(0.01)을 곱해 초기화 하는 방법이다.
하지만 $x=0$일때, 기울기 소실 우려가 있다.
$$
\frac {d(Tanh(wx+b))} {dw} = {Tanh(wx+b)^\prime}x
$$
이므로 $x=0$일때 <strong>Vanishing Gradient(기울기 소실)</strong>이 일어날 수 있다.</p>
<h2 id="2-large-gaussian-random">2. Large Gaussian Random</h2>
<p><strong>Large Gaussian Random</strong> 또한 <strong>Small Gaussian Random</strong>과 같이 $N(Normal.Dist)$~$[d_in,d_out]$에서 데이터를 <strong>Sampling</strong>한다.
하지만 해당 방법에도 문제가 있는데</p>
<ol>
<li>극단적으로 값이 $-1 || 1$로 수렴한다는 것</li>
<li>Output이 커질수록 <strong>Gradient Expording(기울기 폭발)</strong>이 된다는 것</li>
<li>$Tanh^2(wx+b) \approx 1$ 일때, <strong>Vaninshing Gradient(기울기 소실)</strong>이 된다는 것</li>
</ol>
<p>위와 같은 문제로 해당 방법론도 잘 쓰지 않게 되었다.
그렇다면 어떠한 방법을 많이 쓸까?</p>
<h2 id="3-xavier-initialization">3. Xavier Initialization</h2>
<p><strong>Xavier Initialization</strong>을 제일 많이 쓰는데
해당 방법도 위의 방법들과 같이 $N(Normal.Dist)$~$[d_in,d_out]$ 에서 <strong>Sampling</strong> 하지만
<strong>Sampling</strong>된 값에다 $\sqrt{d_in}$을 곱하여 처리한다.</p>
<p>이렇게 처리하게 되면 위에서 발생한 문제인
<strong>Gradient Expording(기울기 폭발)</strong> 및 <strong>Vanishing Gradient(기울기 소실)</strong>이 이루어지지 않게 되어
적절하게 가중치 초기화를 할 수 있다.</p>
<h2 id="기타-이야기">기타 이야기</h2>
<blockquote>
<p>위의 방법론들을 직접 구현 하려면 꽤나 귀찮은 일이다.
그래서 <strong>PyTorch</strong>에서는 자동 <strong>Implement</strong>되어 가중치 초기화 하는 함수만 호출해주면 자동으로 생성된다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Activation Function] 활성함수]]></title>
            <link>https://velog.io/@meo_sun/Activation-Function-%ED%99%9C%EC%84%B1%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@meo_sun/Activation-Function-%ED%99%9C%EC%84%B1%ED%95%A8%EC%88%98</guid>
            <pubDate>Tue, 20 Aug 2024 09:32:46 GMT</pubDate>
            <description><![CDATA[<h2 id="what-is-the-activation-function활성함수란">What is the Activation Function?(활성함수란?)</h2>
<ul>
<li>활성함수는 <strong>Non-Linear</strong>한 함수를 어떻게 활성화 시킬지에 대한 함수이다.</li>
</ul>
<p>활성함수의 종류에는 여러가지가 있는데</p>
<ol>
<li><code>sigmoid(x)</code></li>
<li><code>Tanh(x)</code></li>
<li><code>Relu</code></li>
<li><code>Leacky Relu</code></li>
<li><code>ELU(Exponential Linear Unit)</code>
순으로 설명하려고 한다.</li>
</ol>
<h2 id="1-sigmoid">1. Sigmoid</h2>
<p><code>시그모이드 함수</code>란 S자형 곡선 또는 시그모이드 곡선을 갖는 수학 함수이다
<code>시그모이드 함수</code>의 형태는 아래와 같다.
<img src="https://velog.velcdn.com/images/meo_sun/post/0781cfeb-8d3b-4c27-ab73-d5094e66ca81/image.png" alt=""></p>
<p>$$
sigmoid(x) = \sigma(x)=\frac 1 {1+e^{-x}}
$$
로 나타내어 진다.</p>
<p>특징과 단점은 아래와 같다.
<strong>특징</strong></p>
<ul>
<li>출력 값 범위(0,1)</li>
<li>가장 많이 사용되었던 함수</li>
</ul>
<p><strong>단점</strong></p>
<ul>
<li><strong>Vanishing Gradient(기울기 소실)</strong> : Input이작거나 클때 기울기가 0에 수렴하는 문제</li>
<li>출력값이 <strong>Zero-Centered</strong>하지 않음</li>
<li><strong>Exp</strong> 연산의 비용(Cost)가 Expensive</li>
</ul>
<p>위와 같은 특징으로 한때 많이 사용되었으나, 현재는 문제가 많아 잘 사용되지 않는 함수이다.</p>
<h2 id="2-tanhx">2. Tanh(x)</h2>
<p><strong>Tanh</strong> 함수란 <code>Sigmoid</code>의 대체제로 사용될 수 있는 활성화 함수이다.
<code>Sigmoid</code> 형태와 매우 유사하며, 실제로 <code>Sigmoid</code>의 확장 버전이라고 생각하면 된다.</p>
<p>함수의 형태는 아래와 같다.
<img src="https://velog.velcdn.com/images/meo_sun/post/626a565a-43ac-4fe4-9184-81c81184ec76/image.png" alt=""></p>
<p>$$
Tanh(x)=\frac {1-e^{-x}} {1+e^{-x}}=\frac {2}{1+e^{-2x}}-1 = 2sigmoid(2x)-1=2\sigma(2x)-1 
$$
sigmoid 함수로도 변형되어 나타낼 수 있다.</p>
<p>Tanh 함수의 특징과 단점은 아래와 같다.
<strong>특징</strong></p>
<ul>
<li>출력값 범위 [-1,1]</li>
<li><strong>zero-centered(0이 중심이다.)</strong> - Sigmoid 문제 해결</li>
</ul>
<p><strong>단점</strong></p>
<ul>
<li><strong>Vanishing Gradient</strong> - Sigmoid와 동일</li>
</ul>
<p>위와 같이 <code>Sigmoid</code>의 단점인 <strong>기울기 소실</strong> 문제를 동일하게 겪고있어, 잘 사용되지 않는다.</p>
<h2 id="3-relu">3. ReLu</h2>
<p><strong>Relu</strong> 함수는 양수는 유지하고, 음수는 0으로 만드는 함수이다.
함수의 형태는 아래와 같다.
<img src="https://velog.velcdn.com/images/meo_sun/post/c94adf6a-4fee-4ceb-8234-0c9bd007007f/image.png" alt=""></p>
<p>$$
Relu(x) = max(0,x)
$$</p>
<p><strong>Relu</strong> 의 특징과 단점은 아래와 같다.
<strong>특징</strong></p>
<ul>
<li><strong>Vanishing Gradient</strong>가 없음 - Sigmoid&amp;Tanh 문제 해결</li>
<li>+(양수) 영역에서 <strong>Not Saturate</strong>(발산)</li>
<li>Sigmoid&amp;Tanh 보다 <strong>빠르게 수렴함</strong> - <code>Exp 계산이 없으므로</code></li>
</ul>
<p><strong>단점</strong></p>
<ul>
<li><strong>Not zero-centered</strong></li>
<li><strong>Dead Relu Problem</strong> : 출력이 음수면 Saturate됨 (0으로 수렴)</li>
<li>x=0 일때, 미분이 불가능함</li>
</ul>
<p><strong>Relu</strong>는 0에서 미분이 안되는데, 이것은 <code>Back Propagation</code>시 문제가 된다.
0에서 미분이 안된다는 문제점이 있는 <strong>Relu</strong>를 해결하기위해 <code>4.Leaky Relu</code>가 나오게 되었다.</p>
<h2 id="4-leaky-relu">4. Leaky Relu</h2>
<p><strong>Leaky Relu</strong>는 <code>ReLu</code>의 <strong>Dead ReLu Problem</strong>을 해결하기 위해 만들어진 활성 함수이다.</p>
<p><strong>Leaky Relu</strong>의 함수는 아래와 같다.
<img src="https://velog.velcdn.com/images/meo_sun/post/2deeb3e3-ae99-4b4b-987e-dafa7de79f6d/image.png" alt=""></p>
<blockquote>
<p><code>a = 0.01</code> 일때의 그래프
$$
LeakyRelu(x) = max(ax,x) 
$$
위와 같이 표현되며 음수일때 0으로 수렴하던 문제를 <strong>작은 값을 곱하여</strong> 해결한다.
<strong>Leaky ReLu</strong>의 특징과 단점은 아래와 같다.</p>
</blockquote>
<p><strong>특징</strong></p>
<ul>
<li>모든 영역에서 Saturate 되지 않음 - Relu 문제 해결</li>
<li>연산에 효율적</li>
<li>Sigmoid &amp; Tanh 보다 빠름</li>
<li><strong>No Dead Relu Problem</strong> : 기울기 소실되는 문제 해결</li>
</ul>
<p><strong>단점</strong></p>
<ul>
<li>추가적인 하이퍼 파라미터<code>a(alpha)</code>가 필요하다.</li>
</ul>
<h2 id="5-eluexponential-linear-unit">5. ELU(Exponential Linear Unit)</h2>
<p><code>ReLu</code>와 거의 비슷한 형태를 가지며, 지수 함수를 이용해 음수일 경우 부드럽게 만들어 주는 함수이다.
함수의 형태는 아래와 같다.
<img src="https://velog.velcdn.com/images/meo_sun/post/9853cd5c-1769-41b5-bc31-25622fff7b3d/image.png" alt="">
$$
 x, x\geq0
$$
$$
a(\exp{(x)-1}), x&lt;0
$$
양수일때는 <code>x</code>가 그대로 출력되지만, 음수일 때는 <code>alpha * (exp(x)-1)</code>의 형태로 출력이 된다.
그래프에서 보다 시피, <code>Leaky Relu</code>에 비해 음수에서 출력이 부드럽게 이루어진다.</p>
<p><strong>ELU</strong>의 특징과 단점은 아래와 같다.
<strong>특징</strong></p>
<ul>
<li><code>Relu</code>의 모든 것 - <code>Relu</code>가 가지고 있는 장점은 모두 갖고있다.</li>
</ul>
<p><strong>단점</strong></p>
<ul>
<li><strong>Exp</strong> 계산 비용(cost)가 비싸다.</li>
</ul>
<h1 id="결론">결론</h1>
<blockquote>
<p>오늘 5가지 활성화 함수에 대해 정리 하였다.
그중 <strong>Sigmoid와 Tanh</strong> 함수는 잘 사용하지 않는 다는 것을 기억하며,
해당 함수를 사용할 경우 <strong>Only Last Layer</strong>에만 적용한다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Back Propagation] 역전파 이론 요약]]></title>
            <link>https://velog.io/@meo_sun/Back-Propagation-%EC%97%AD%EC%A0%84%ED%8C%8C-%EC%9D%B4%EB%A1%A0-%EC%9A%94%EC%95%BD</link>
            <guid>https://velog.io/@meo_sun/Back-Propagation-%EC%97%AD%EC%A0%84%ED%8C%8C-%EC%9D%B4%EB%A1%A0-%EC%9A%94%EC%95%BD</guid>
            <pubDate>Tue, 20 Aug 2024 08:41:38 GMT</pubDate>
            <description><![CDATA[<p><strong>Back Propagation</strong>이란?</p>
<blockquote>
<p><strong>Forward Pass</strong>를 역으로 계산(미분) 하는 것을 말한다.</p>
</blockquote>
<p>예를 들어 함수를 정의 해보자 
$$ f(x,y,z) = (x+y)z 
$$
<code>Forward Pass</code>는 
$$
q = x+y
이며, z(x+y) = z(q)
$$
순으로 계산된다.</p>
<p>이를 역으로 <code>q</code>에 대해서 미분하면
$$
\frac {df(x,y,z)} {dq} = \frac {z(q)} {dq} = z
$$
<code>q</code>노드는 역전파로 <code>z</code>가 된다.
뭔가 이해가 안될 수 있지만, 기본적으로 역전파 시 해당 값이 나온 node가 <strong>서로 반대로 나온 다</strong>는 것으로 알면된다.</p>
<p>이어서 <code>z</code>에 대해 미분하면
$$
\frac {df(x,y,z)} {dz} = \frac {z(q)} {dz} = q
$$
<code>z</code> node에서는 역전파로 <code>q</code> 값이 나오게된다.</p>
<p>마지막으로 x,y에 대해 각각 미분해야하는데
$$
\frac {df(x,y,z)} {dx} = \frac {dz<em>d(x+y)} {dx} =\frac {d(zq)} {dq}</em>\frac {d(x+y)} {dx} = z<em>1 
$$
$$
\frac {df(x,y,z)} {dy} = \frac {dz</em>d(x+y)} {dy} =\frac {d(zq)} {dq}<em>\frac {d(x+y)} {dy} = z</em>1 
$$
따라서 각각 <code>x</code>,<code>y</code>는 <code>z</code>가 된다.</p>
<p>역전파는 단순히 역으로 계산(미분) 하는 것 뿐만아니라, Node가 지나온 길을 반대로 지나기때문에 해당 부분을
감안하여 계산하여야 한다.</p>
<blockquote>
<p><strong>결론</strong> : 역전파시, 편미분을 해야하며 Node에서 값이 나오는 순서 혹은 방향이 바뀐다. </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linear Regression] 선형 회귀]]></title>
            <link>https://velog.io/@meo_sun/Linear-Regression-%EC%84%A0%ED%98%95-%ED%9A%8C%EA%B7%80</link>
            <guid>https://velog.io/@meo_sun/Linear-Regression-%EC%84%A0%ED%98%95-%ED%9A%8C%EA%B7%80</guid>
            <pubDate>Mon, 12 Aug 2024 05:35:26 GMT</pubDate>
            <description><![CDATA[<h1 id="선형-모형">선형 모형?</h1>
<h2 id="1-선형모형의-식">1. 선형모형의 식</h2>
<p>선형 모형은 아래와 같은 간단한 식으로 이루어져 있다. 
$$
y = ax + e
$$
대표적인 예로 부모의 키는 자식의 키에 연관이 되어있다는 예제가 있다. 
이것을 표현하면
$$
y(자식의 키) = ax(부모의키) + e(잔차 or 오류)
$$
위와 같다.</p>
<h2 id="2-선형모형-4가지-가정">2. 선형모형 4가지 가정</h2>
<p>그렇다면 선형 회귀모델은 어떻게하면 만들 수 있을까?
일단 선형 회귀 모델을 만들때에는 4가지 가정을 만족해야한다.</p>
<blockquote>
</blockquote>
<ul>
<li><strong>선형성</strong> : 종속 변수와 독립 변수 간의 관계가 선형적이어야 한다. - 가장 중요</li>
<li><strong>독립성</strong> : 관측 값들이 서로 독립적이어야 한다.
잔차들이 무작위어야 함.
잔차가 시간에 따라 특정 패턴을 보이면, 독립성 가정이 위배됨.</li>
<li><strong>등분산성</strong> : e(Error)의 분산이 일정해야 한다.
잔차들이 일정한 분포를 보여야 함.
특정 구간에서 분산이 커지거나 작아지면 가정이 위배됨.</li>
<li><strong>정규성</strong> : e(Error)가 정규분포를 따라야한다.</li>
</ul>
<h2 id="3-선형모형-최적-계산">3. 선형모형 최적 계산</h2>
<p>위의 4가지 가정을 통과(만족) 하면 모델을 만들 수 있는 최소 조건이 만족된 것이다. 
그렇다면 어떻게 <strong>최적의 값으로 찾아 갈 수 있을까?<em>(Tuning)</em></strong></p>
<p>여러가지 방법이 있다.</p>
<blockquote>
<ol>
<li><strong>(OLS 최소 제곱법)</strong></li>
<li>*<em>다중 선형 회귀 *</em></li>
</ol>
</blockquote>
<p>첫 번째로 <strong>OLS(최소 제곱법)</strong>으로 학습할 수 있다.</p>
<h2 id="4-모델-평가">4. 모델 평가</h2>
<p>마지막으로 모델을 평가 해야하는데 아래와 같은 항목으로 평가 할 수있다.
물론 다른 지표 또한 있지만 아래 4개로 설명하겠다.</p>
<blockquote>
<p><strong>MAE(평균 절대 오차)</strong>
<strong>MSE(평균 제곱 오차)</strong>
<strong>RMSE(제곱근 평균 제곱 오차)</strong>
<strong>$$R^2$$(결정 계수)</strong></p>
</blockquote>
<h3 id="41-mae평균-절대-오차">4.1 MAE(평균 절대 오차)</h3>
<p>MAE는 예측값이 실제 값과 얼마나 차이나는지 절대값으로 계산및 평균을 낸 지표이다.
모든 오차를 동일하게 고려해, 해석이 간단하다.
단위가 종속 변수와 동일 하며, 단순한 예측 성능 평가 및 쉽게 해석 가능한 경우 사용한다.
$$
MAE = \frac 1 n\sum_{{i=1}}^n({y_i}-{predict(y_i)})
$$</p>
<h3 id="42-mse평균-제곱-오차">4.2 MSE(평균 제곱 오차)</h3>
<p>실제 값과 예측 값 간의 차이의 제곱을 평균낸 값이다.
오차를 제곱하기때문에 오차에 더 큰 가중치를 준다고 할 수 있다.
큰오차에 민감하게 반응하므로, 모델의 큰 오차를 줄이는데 유용하다.</p>
<p>$$
MSE = \frac 1 n\sum_{{i=1}}^n({y_i}-{predict(y_i)})^2
$$</p>
<h3 id="43-rmse제곱근-평균-제곱-오차">4.3 RMSE(제곱근 평균 제곱 오차)</h3>
<p>MSE에 제곱근을 취한 값으로 오차를 원래 단위로 변환한다.
MSE와 같은 장점을 가지면서 단위가 맞지않던 문제를 해결한다.
해석이 쉽고, MSE의 장점인 큰오차에 민감하게 반응하는 동시에 실제 값과 같은 단위를 유지한다.
모델 평가시 일반적으로 많이 사용된다.</p>
<p>$$
RMSE = \sqrt{\frac 1 n\sum_{{i=1}}^n({y_i}-{predict(y_i)})^2}
$$</p>
<h3 id="44-r2결정계수">4.4 $$R^2$$(결정계수)</h3>
<p>모델이 종속변수의 변동성을 얼마나 설명하는지 나타내는 지표이다.
0~1사이의 값을 가지며, 1에 가까울수록 모델이 데이터를 잘 설명한다.
비교적 해석이 쉬우며 다른모델과 비교할때 유용하다.
또한 여러모델의 성능을 비교할때 많이 사용한다.</p>
<p>$$
R^2 = \frac {\frac 1 n\sum_{{i=1}}^n({y_i}-{predict(y_i)})^2}  {\frac 1 n\sum_{{i=1}}^n({y_i}-{mean(y_i)})^2}
$$</p>
<h2 id="5구현-with-numpy">5.구현 With Numpy</h2>
<p>그렇다면 scikit-learn등의 라이브러리 없이 Numpy로 구현한다면 어떻게 할 수 있을까?</p>
<pre><code class="language-python">import numpy as np

class LinearRegression:
    def __init__(self):
        self.weights = None
        self.bias = None
# 모델 Fitting Method
    def fit(self, X:np.ndarray, y:np.ndarray):
        X = np.hstack((np.ones((X.shape[0], 1)), X))
        # OLS
        self.weights = np.dot(np.linalg.inv(X.transpose().dot(X)),X.transpose().dot(y))
        self.bias = self.weights[0]
        self.weights = self.weights[1]

# 예측 메서드
    def predict(self, X):
        # X에 절편 항 추가
        X = np.hstack((np.ones((X.shape[0], 1)), X))
        y_pred = X.dot(np.hstack((self.bias, self.weights)))

        return y_pred</code></pre>
<p>위처럼 간단하게 구현할 수 있다.
OLS로 구현할 경우
$$
\hat{B} = (X^TX)^{-1}X^TY
$$
이므로 위의 식</p>
<pre><code class="language-python"> self.weights = np.dot(np.linalg.inv(X.transpose().dot(X)),X.transpose().dot(y))</code></pre>
<p>을 통해 Weight와 Bias를 구할 수 있게된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Pytorch] 유사도(유클리드, 맨해튼, 코사인) 계산을 해보자]]></title>
            <link>https://velog.io/@meo_sun/Pytorch-%EC%9C%A0%EC%82%AC%EB%8F%84%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C-%EB%A7%A8%ED%95%B4%ED%8A%BC-%EC%BD%94%EC%82%AC%EC%9D%B8-%EA%B3%84%EC%82%B0%EC%9D%84-%ED%95%B4%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@meo_sun/Pytorch-%EC%9C%A0%EC%82%AC%EB%8F%84%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C-%EB%A7%A8%ED%95%B4%ED%8A%BC-%EC%BD%94%EC%82%AC%EC%9D%B8-%EA%B3%84%EC%82%B0%EC%9D%84-%ED%95%B4%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Fri, 09 Aug 2024 05:50:09 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Tensor들간의 거리를 계산하는 방법에 대해 알아보자</p>
</blockquote>
<h1 id="1맨해튼-유사도">1.맨해튼 유사도</h1>
<p><strong>맨해튼 유사도(L1 노름)</strong>는 두 데이터간의 절대값 거리에 따른 유사도를 의미한다.
$$
\displaystyle\ distance(x,y) 
\displaystyle \displaystyle= \sum_{i=1}^{p}\vert{x_i-y_i}\vert
$$
$$
\displaystyle\ sim(x,y) 
\displaystyle \displaystyle= \frac 1 {distance(x,y)}
$$</p>
<p>이산형 데이터 및 이진형 데이터를 처리할때 사용이 많이된다.
그럼 Pytorch로 구현해보자</p>
<ul>
<li>Pytorch Code<pre><code class="language-python">import torch
dist = torch.norm(A - B, p = 2) #거리
similarity = 1 / (1 + dist) # 유사도</code></pre>
위와 같이 단순하게 구현 가능하다.</li>
</ul>
<h1 id="2유클리드-유사도">2.유클리드 유사도</h1>
<p><strong>유클리드 유사도(L2 노름)</strong>는 두 데이터간의 직선거리에 따른 유사도를 의미한다.
유클리드 거리를 사용하기 위해서는 데이터를 정규화 해야하며, 데이터 차원이 증가할수록 사용하기 쉽지 않다.
우리가 많이 보던 피타고라스 정의와 유사하다.
$$
\displaystyle\ distance(x,y) 
\displaystyle \displaystyle= \sum_{i=1}^{p}\sqrt{(x_i-y_i)^2}
$$
$$
\displaystyle\ sim(x,y) 
\displaystyle \displaystyle= \frac 1 {distance(x,y)}
$$
그럼 Pytorch로 구현해보자</p>
<ul>
<li>Pytorch Code<pre><code class="language-python">import torch
dist = torch.norm(A - B, p = 1) #거리
similarity = 1 / (1 + dist) # 유사도</code></pre>
맨해튼 유사도와 코드가 거의 유사하다. 오직<code>norm(p=1)</code>로 변경해주면 된다.</li>
</ul>
<h1 id="3코사인-유사도">3.코사인 유사도</h1>
<p><strong>코사인 유사도</strong>는 두개 벡터값에서 코사인 각도를 구한 방법으로 코사인 유사도가 1에 근접할 수록 두값은 유사한 것으로 본다.
$$
\displaystyle\ sim(x,y) 
\displaystyle \displaystyle= \frac {A*B} {\vert\vert{A}\vert\vert_2\vert\vert{B}\vert\vert_2}
= \frac {\sum_{i=1}^{p}{A_iB_i}} {\sqrt{\sum_{i=1}^{p}{A_i^2}}\sqrt{\sum_{i=1}^{p}{B_i^2}}}
$$
그럼 Pytorch로 구현해보자</p>
<ul>
<li>Pytorch Code<pre><code class="language-python">import torch
dot_AB = torch.dot(A, B) # A와B의 내적 구하기
norm_A = torch.norm(A, p = 2) #A 자체적인 L2노름(유클리드)
norm_B = torch.norm(B, p = 2) #B 자체적인 L2노름(유클리드)
cosine_similarity = dot_AB / (norm_A * norm_B)</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Pytorch] Tensor의 A-z 까지]]></title>
            <link>https://velog.io/@meo_sun/Pytorch-Tensor%EC%9D%98-A-z-%EA%B9%8C%EC%A7%80</link>
            <guid>https://velog.io/@meo_sun/Pytorch-Tensor%EC%9D%98-A-z-%EA%B9%8C%EC%A7%80</guid>
            <pubDate>Fri, 09 Aug 2024 05:15:56 GMT</pubDate>
            <description><![CDATA[<h1 id="1tensor란">1.Tensor란?</h1>
<p><code>Tensor</code>는 Pytorch의 핵심 데이터 구조이다.
<code>Numpy</code>와 유사한 형태로 N차원의 데이터를 표현하며, 다양한 방법으로 코드 표현이 가능하다.</p>
<h1 id="2tensor-생성">2.Tensor 생성</h1>
<p>Pytorch에서 Tensor의 생성방법은 여러가지가 있다.
일정 값으로 초기화된 Tensor 생성, 값이 초기화 되지 않은 Tensor의 생성, List나 Numpy로 생성하는 방법이 있다.</p>
<h2 id="2-1초기화된-tensor의-생성">2-1.초기화된 Tensor의 생성</h2>
<table>
<thead>
<tr>
<th align="center"><center>메서드</center></th>
<th align="center"><center>설명</center></th>
<th align="center"><center>Example</center></th>
</tr>
</thead>
<tbody><tr>
<td align="center">torch.zeros([...])</td>
<td align="center">...수만큼 dimension을 가진 Tensor를 생성함(Value = 0)</td>
<td align="center">torch.zeros([3,2]) #0차원 = 3 / 1차원 = 2로 생성</td>
</tr>
<tr>
<td align="center">torch.ones([...])</td>
<td align="center">...수만큼 dimension을 가진 Tensor를 생성함(Value = 1)</td>
<td align="center">torch.ones([3,2]) #0차원 = 3 / 1차원 = 2로 생성 [[[1,1],[1,1]],[[1,1],[1,1]]]</td>
</tr>
<tr>
<td align="center">torch.rand([...])</td>
<td align="center">...수만큼 dimension을 가진 Tensor를 생성함(Value = 균등분포로 0~1사이 난수)</td>
<td align="center">torch.rand([3,2]) #0차원 = 3 / 1차원 = 2로 생성</td>
</tr>
<tr>
<td align="center">torch.randn([...])</td>
<td align="center">...수만큼 dimension을 가진 Tensor를 생성함(Value = 정규분포의 난수)</td>
<td align="center">torch.randn([3,2]) #0차원 = 3 / 1차원 = 2로 생성</td>
</tr>
<tr>
<td align="center">torch.arange(start = n, end = m, step = s)</td>
<td align="center">n 부터 m 까지 s씩 증가하는 1-D Tensor 생성</td>
<td align="center">torch.arange(0,100,1)</td>
</tr>
</tbody></table>
<p>Tensor간 초기화된 값 변경하는 방법</p>
<table>
<thead>
<tr>
<th align="center"><center>메서드</center></th>
<th align="center"><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td align="center">B = torch.zeros_like(A)</td>
<td align="center">B에 A Tensor를 0으로 채운 값을 입력</td>
</tr>
<tr>
<td align="center">B = torch.ones_like(A)</td>
<td align="center">B에 A Tensor를 1로 채운 값을 입력</td>
</tr>
<tr>
<td align="center">B = torch.rand_like(A)</td>
<td align="center">B에 A Tensor를 균등분포의 0~1사이 난수로 채운 값을 입력</td>
</tr>
<tr>
<td align="center">B = torch.randn_like(A)</td>
<td align="center">B에 A Tensor를 정규분포의 난수로 채운 값을 입력</td>
</tr>
</tbody></table>
<h2 id="2-2초기화되지-않은-tensor-생성">2-2.초기화되지 않은 Tensor 생성</h2>
<blockquote>
<p><strong>성능 향상</strong> 및 <strong>메모리 사용</strong>에 최적화</p>
</blockquote>
<ul>
<li>불필요하게 Tensor를 바로 덮어쓰기 할때</li>
<li>불필요하게 Tensor를 바로 초기화 할때 </li>
</ul>
<table>
<thead>
<tr>
<th align="center"><center>메서드</center></th>
<th align="center"><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td align="center">B = torch.empty(n)</td>
<td align="center">n만큼 크기의 Random Value Tensor를 생성</td>
</tr>
<tr>
<td align="center">B = A.fill_(n)</td>
<td align="center">Empty Tensor를 n으로 채움</td>
</tr>
</tbody></table>
<h2 id="2-3list-or-numpy로-tensor-생성">2-3.List or Numpy로 Tensor 생성</h2>
<table>
<thead>
<tr>
<th align="center"><center>메서드</center></th>
<th align="center"><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td align="center">B = torch.tensor([...])</td>
<td align="center">[...] 배열을 Tensor로 변경</td>
</tr>
<tr>
<td align="center">B = torch.from_numpy(A)</td>
<td align="center">A-Numpy 배열을 Tensor로 생성</td>
</tr>
</tbody></table>
<h2 id="2-4cpu-tensor-생성">2-4.CPU Tensor 생성</h2>
<ol>
<li><code>torch.IntTensor([...])</code></li>
<li><code>torch.FloatTensor([...])</code></li>
<li><code>torch.ByteTensor([...])</code></li>
<li><code>torch.CharTensor([...])</code></li>
<li><code>torch.ShortTensor([...])</code></li>
<li><code>torch.LongTensor([...])</code></li>
<li><code>torch.DoubleTensor([...])</code></li>
<li>etc...</li>
</ol>
<h2 id="2-5cuda-tensor-생성">2-5.CUDA Tensor 생성</h2>
<blockquote>
<p><code>B = A.to(&#39;cuda&#39;)</code> # 혹은
<code>B = A.cuda()</code> #로 가능하다.
#기존 Cuda로 작성된 Tensor를 변경할때는 
<code>B = A.to(&#39;cpu&#39;)</code> #혹은
<code>B = A.cpu()</code> #로 가능하다.</p>
</blockquote>
<h2 id="2-6tensor-복제">2-6.Tensor 복제</h2>
<ul>
<li><code>B = A.clone()</code></li>
<li><code>B = A.detach()</code></li>
</ul>
<p><code>detach()</code>와 <code>clone()</code>의 차이점은 <code>detach</code>는 <strong>계산그래프에서 분리</strong>해서 Tensor를 복제한다는 점이다.</p>
<h1 id="3tensor의-datatype">3.Tensor의 DataType</h1>
<p><code>Tensor</code>의 DataType에는 여러가지가 있다.
보통 <code>dtype</code>이라고 부르며, Tensor가 저장하는 데이터의 유형을 말한다.</p>
<table>
<thead>
<tr>
<th align="center"><center>유형</center></th>
<th align="center"><center>설명</center></th>
<th align="center"><center>Size</center></th>
</tr>
</thead>
<tbody><tr>
<td align="center">uint8</td>
<td align="center">부호가 없는 8bit 정수형(<code>torch.uint8</code>)</td>
<td align="center">0 ~ 255</td>
</tr>
<tr>
<td align="center">uint16</td>
<td align="center">부호가 없는 16bit 정수형(<code>torch.uint16</code>)</td>
<td align="center">0 ~ 65,535</td>
</tr>
<tr>
<td align="center">uint32</td>
<td align="center">부호가 없는 32bit 정수형(<code>torch.uint32</code> or <code>torch.uint</code>)</td>
<td align="center">0 ~ 4,294,967,296</td>
</tr>
<tr>
<td align="center">uint64</td>
<td align="center">부호가 없는 64bit 정수형(<code>torch.uint64</code>)</td>
<td align="center">0~</td>
</tr>
<tr>
<td align="center">int8</td>
<td align="center">부호가 있는 8bit 정수형(<code>torch.int8</code> or <code>torch.char</code>)</td>
<td align="center">-128 ~ 127</td>
</tr>
<tr>
<td align="center">int16</td>
<td align="center">부호가 있는 16bit 정수형(<code>torch.int16</code> or <code>torch.short</code>)</td>
<td align="center">-32,768 ~ 32,767</td>
</tr>
<tr>
<td align="center">int32</td>
<td align="center">부호가 있는 32bit 정수형(<code>torch.int32</code> or <code>torch.int</code>)</td>
<td align="center">-2,148,483,648 ~ 2,147,483,647</td>
</tr>
<tr>
<td align="center">int64</td>
<td align="center">부호가 있는 64bit 정수형(<code>torch.int64</code> or <code>torch.long</code>)</td>
<td align="center">-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807</td>
</tr>
<tr>
<td align="center">float16</td>
<td align="center">16bit 실수형(<code>torch.float16</code>)</td>
<td align="center">-</td>
</tr>
<tr>
<td align="center">float32</td>
<td align="center">32bit 실수형(<code>torch.float32</code> or <code>torch.float</code>)</td>
<td align="center">-</td>
</tr>
<tr>
<td align="center">float64</td>
<td align="center">64bit 실수형(<code>torch.float64</code> or <code>torch.double</code>)</td>
<td align="center">-</td>
</tr>
</tbody></table>
<h2 id="3-1dtype-casting">3-1.Dtype Casting?</h2>
<blockquote>
<p><strong>Type Casting</strong>이란 먼저 선언한 dtype을 다른 dtype으로 변경하는 것을 말한다.
ex) <code>torch.int</code> -&gt; <code>torch.float</code> etc...</p>
</blockquote>
<ul>
<li>변경 방법
<code>test = torch.tensor([...],dtype = torch.int8)</code> 일때
<code>test2 = test.double()</code> 로 하게되면 test2에 <code>dtype = double</code>로 casting된 test가 들어가게 된다.</li>
</ul>
<h1 id="4tensor-indexing--slicing">4.Tensor Indexing &amp; Slicing</h1>
<blockquote>
<p><strong>Indexing</strong>이란 Tensor의 특정위치(Index)에 접근하는 것을 말한다.
<strong>Slicing</strong>이란 Tensor들 중 일부(부분집합)을 분리하여 새로운 Tensor를 생성하는 과정을 말한다.</p>
</blockquote>
<ul>
<li>Index 접근 방법 : <code>A[0,3] #0차원 = 0dim/ 1차원 = 3dim 인 곳에 접근한다. 0행3열 접근</code></li>
<li>Slicing 사용 법 : <code>A[n:m:s] #n부터 m까지 s씩 건너뛰며 선택</code></li>
</ul>
<h1 id="5tensor의-차원-변경">5.Tensor의 차원 변경</h1>
<p>Tensor의 차원변경 방법에는 여러가지가 있다.</p>
<table>
<thead>
<tr>
<th align="center"><center>메서드</center></th>
<th align="center"><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td align="center"><code>A.reshape(n,m...,z)</code></td>
<td align="center">Tensor A를 (n,m,..z)까지 차원의 수로 변경 한다. *<em>-1을 사용하면 자동으로 남은 Dim을 맞춰서 계산해줌 *</em></td>
</tr>
<tr>
<td align="center"><code>A.view(n,m...,z)</code></td>
<td align="center"><strong>reshape()</strong>과 동일하지만, 메모리의 연속성이 성립한 경우만 사용 가능하다.(등비수열 혹은 정렬)</td>
</tr>
<tr>
<td align="center"><code>A.flatten()</code></td>
<td align="center">Tensor A 1-D Tensor로 평탄화 한다. 혹은 <strong>(n,m)등의 값을 입력할 경우</strong> n부터 m차원까지 평탄화</td>
</tr>
<tr>
<td align="center"><code>A.transpose(n,m)</code></td>
<td align="center">n번째 차원과 m번째 차원의 dim을 치환</td>
</tr>
<tr>
<td align="center"><code>A.squeeze()</code></td>
<td align="center">차원의 축이 1인 것을 축소하는 메서드. <strong>argument로 dim=n으로 입력할 경우 n번째</strong> 차원의 축이 1인 것을 축소</td>
</tr>
<tr>
<td align="center"><code>A.unsqueeze(dim=n)</code></td>
<td align="center">Tensor A를 n번재 차원에 축을 추가(확장)함(축은 1)</td>
</tr>
</tbody></table>
<h1 id="6tensor간의-연결결합">6.Tensor간의 연결&amp;결합</h1>
<table>
<thead>
<tr>
<th align="center"><center>메서드</center></th>
<th align="center"><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td align="center"><code>torch.stack([A,B],dim =n)</code></td>
<td align="center">A와 B를 쌓는다. 단 둘의 Size가 동일해야만 사용가능하다. Tensor 행렬 값이 입력된 부분은 유지</td>
</tr>
<tr>
<td align="center"><code>torch.cat([A,B],dim=n)</code></td>
<td align="center">A와 B를 연결. n번째 차원에 연결한다.</td>
</tr>
</tbody></table>
<h1 id="7tensor-차원-확장">7.Tensor 차원 확장</h1>
<table>
<thead>
<tr>
<th align="center"><center>메서드</center></th>
<th align="center"><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td align="center"><code>A.expand(n,m)</code></td>
<td align="center">A-Tensor를 확장. m번째 차원(dim=1)을 n배 만큼 확장한다.</td>
</tr>
<tr>
<td align="center"><code>A.repeat(n,m,z...)</code></td>
<td align="center">A-Tensor를 0차원은 n배, 1차원은 m배, 2차원은 z배 ... 반복해서 확장한다.</td>
</tr>
</tbody></table>
<h1 id="8tensor간의-연산">8.Tensor간의 연산</h1>
<p>연산은 서로의 size가 어느정도 달라도 계산이 가능하다.
단 행렬의 기본 연산 방식과 동일하기때문에, 최소한의 조건은 맞춰서 계산해야한다.
계산하고자하는 행렬 갯수가 맞고, 일부 column이 부족한 부분에 대해서는 expand되어 계산된다</p>
<ul>
<li>산술연산</li>
</ul>
<table>
<thead>
<tr>
<th align="center"><center>메서드</center></th>
<th align="center"><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td align="center"><code>torch.add(A,B)</code></td>
<td align="center">A-Tensor와 B-Tensor(혹은 상수 B)간 합 계산(동일한 위치 기준)</td>
</tr>
<tr>
<td align="center"><code>torch.sub(A,B)</code></td>
<td align="center">A-Tensor와 B-Tensor(혹은 상수 B)간 차 계산(동일한 위치 기준)</td>
</tr>
<tr>
<td align="center"><code>torch.mul(A,B)</code></td>
<td align="center">A-Tensor와 B-Tensor(혹은 상수 B)간 곱 계산(동일한 위치 기준)</td>
</tr>
<tr>
<td align="center"><code>torch.div(A,B)</code></td>
<td align="center">A-Tensor와 B-Tensor(혹은 상수 B)간 나누기 계산(동일한 위치 기준)</td>
</tr>
<tr>
<td align="center"><code>torch.pow(A,B)</code></td>
<td align="center">A-Tensor와 B-Tensor(혹은 상수 B)간 제곱 계산(동일한 위치 기준)</td>
</tr>
<tr>
<td align="center">- 비교연산</td>
<td align="center"></td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th align="center"><center>메서드</center></th>
<th align="center"><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td align="center"><code>torch.eq(A,B)</code></td>
<td align="center">A=B  Equal</td>
</tr>
<tr>
<td align="center"><code>torch.ne(A,B)</code></td>
<td align="center">A≠B Not Equal</td>
</tr>
<tr>
<td align="center"><code>torch.gt(A,B)</code></td>
<td align="center">A&gt;B Greater</td>
</tr>
<tr>
<td align="center"><code>torch.ge(A,B)</code></td>
<td align="center">A≥B Greater or Equal</td>
</tr>
<tr>
<td align="center"><code>torch.lt(A,B)</code></td>
<td align="center">A&lt;B Lower</td>
</tr>
<tr>
<td align="center"><code>torch.le(A,B)</code></td>
<td align="center">A≤B Lower or Eqaul</td>
</tr>
<tr>
<td align="center">- 논리연산</td>
<td align="center"></td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th align="center"><center>메서드</center></th>
<th align="center"><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td align="center"><code>torch.logical_and()</code></td>
<td align="center">논리곱 AND 연산</td>
</tr>
<tr>
<td align="center"><code>torch.logical_or()</code></td>
<td align="center">논리합 OR 연산</td>
</tr>
<tr>
<td align="center"><code>torch.logical_xor()</code></td>
<td align="center">배타적 논리 합 XOR연산. <strong>Scalar가 동일하면 False / Scalar가 다르면 False</strong></td>
</tr>
</tbody></table>
<h1 id="9inpace-함수와-일반-torch-함수">9.Inpace 함수와 일반 Torch 함수</h1>
<blockquote>
<p><strong>Inplcae</strong> 함수란 무엇일까?</p>
</blockquote>
<p>Inplcae함수는 말그대로 내부 값을 수정시켜주는 함수이다.
예를 들어 <code>A.add</code>가 있고 <code>A.add_</code>라는 함수가 있다. 둘다 <strong>A-Tensor</strong>에 더해주는 함수이지만 차이가 있다.
<code>A.add</code>는 <strong>A-Tensor</strong>값은 그대로 두고 새로 객체를 생성한다.
<code>A.add_</code>는 <strong>A-Tensor</strong>의 값 자체를 변경하며, Return 객체로 <code>A</code>를 반환한다.</p>
<p>이처럼 A-Tensor 자체에 접근해서 사용이 필요할때는 Inplcae함수를 쓰면 된다.
단 <strong>Traning</strong>시에는 메모리 주소 혹은 값이 꼬일 수 있으니 <strong>사용시 유의!</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[네이버 부스트 캠프 AI Tech 7기 합격]]></title>
            <link>https://velog.io/@meo_sun/%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EC%8A%A4%ED%8A%B8-%EC%BA%A0%ED%94%84-AI-Tech-7%EA%B8%B0-%ED%95%A9%EA%B2%A9</link>
            <guid>https://velog.io/@meo_sun/%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EC%8A%A4%ED%8A%B8-%EC%BA%A0%ED%94%84-AI-Tech-7%EA%B8%B0-%ED%95%A9%EA%B2%A9</guid>
            <pubDate>Thu, 25 Jul 2024 07:39:21 GMT</pubDate>
            <description><![CDATA[<h1 id="시작하게된-이유">시작하게된 이유</h1>
<p>난 통계학 및 빅데이터 전공으로 원래 개발자가 아니었다.
AI 개발 혹은 데이터 분석을 하고자 취업을 했으나 어쩌다보니 개발자가 되어있었다.</p>
<p> 항상 <code>AI</code>에 대한 열망을 갖고 있었는데,실현하기는 쉽지 않았다.
 그나마 비슷한 업무를 할 수 있게 회사에서는 <code>데이터 엔지니어</code>로 일하게 해주었다.
 말이 <code>데이터 엔지니어</code>지 실제는 <code>백엔드 개발 및 데이터 처리</code> 업무가 대부분 이었다.
 항상 부족함을 느끼던 찰나 <code>AI Tech</code>라는 것을 알게 되었고 도전하게 되었다.</p>
<blockquote>
<p> <em>문제는 마감 <strong>1주일 전</strong>에 알았다는 사실..</em></p>
</blockquote>
<h1 id="ai-시험--코딩테스트">AI 시험 &amp; 코딩테스트</h1>
<p> 기초적인 알고리즘은 공부했기 때문에 <code>코딩테스트</code>는 많이 공부하지 않았다.
 (프로그래머스 기준 2레벨은 무난하게 풀고 3레벨은 쉬운건 풀수 있는 정도?)
문제는 <code>AI 시험</code>이었다. 대학교 학부시절 배웠던 AI 공부는 다 잊어버렸고...
시험을 봐야하는 입장에서는 쉽지 않았다.</p>
<p>그러던 중 네이버 커넥트에서 제공하는 PreCourse가 있었고, 그 강좌를 하루에 4시간씩 1회독을 했다.
그리고 나서 <strong><em>시험보기 전날 새벽 5시 까지</em></strong> 문제풀이를 틀린 오답 유형 및 해설까지 통째로 외웠다.</p>
<p> 다행히 시험문제는 어렵지 않게 나왔고, AI 문제 및 코딩테스트는 대부분 다 풀었다.
 코테 난이도는 <code>Lv1</code> 정도의 수준 이었던 것 같다.</p>
<h1 id="현재-상황">현재 상황</h1>
<p> 현재는 다니던 회사에 사직서를 냈다.
 교육전에 퇴사를 반드시 해야하므로, 교육전으로 사직일을 잡았다.
 아직 퇴사는 안했지만 벌써부터 교육 받을 생각에 두근거린다.</p>
<h1 id="계획">계획</h1>
<p> <code>데이터 엔지니어</code>의 삶에 사실 베이스는 대부분 <strong>독학</strong>이었다.</p>
<blockquote>
<p> Java, Python, Golang 등 신규 언어들을 대부분 독학했다.</p>
</blockquote>
<p>이제는 언어적인 공부가 아닌 <code>알고리즘</code> 적인 <code>AI</code> 관련 베이스를 더 쌓아 <code>ML Ops</code>나 
<code>AI를 위한 전문적인 데이터 엔지니어</code>가 되어보자고 한다.
앞으로 교육을 들으면 내용들을 매주 정리해서 게시하고, 부족한 부분에 대한 회고를 진행해야겠다.</p>
<blockquote>
<p><em><strong>화이팅 해보자!</strong></em></p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>