<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dandelion_.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Mon, 11 Dec 2023 06:25:35 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dandelion_.log</title>
            <url>https://velog.velcdn.com/images/dandelion_26/profile/af1a39f6-8a63-4988-8c4b-916a18cbe44f/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dandelion_.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dandelion_26" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[ Very Deep Convolutional Networks for Large-Scale Image Recognition (VGG)]]></title>
            <link>https://velog.io/@dandelion_26/Very-Deep-Convolutional-Networks-for-Large-Scale-Image-Recognition-VGG</link>
            <guid>https://velog.io/@dandelion_26/Very-Deep-Convolutional-Networks-for-Large-Scale-Image-Recognition-VGG</guid>
            <pubDate>Mon, 11 Dec 2023 06:25:35 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/abs/1409.1556">https://arxiv.org/abs/1409.1556</a></p>
<h1 id="핵심-요약">핵심 요약</h1>
<ul>
<li>3x3 convolution filter를 가진 network을 이용해 깊이를 증가시킨 모델을 평가합니다.</li>
<li>깊이를 16-19 layer로 늘려 이전 모델들보다 개선됨을 보여줍니다.</li>
</ul>
<h1 id="1-introduction">1. Introduction</h1>
<ul>
<li>백서에서는 ConvNet 아키텍처 설계의 또 다른 중요한 측면인 깊이에 대해 설명합니다.</li>
<li>아키텍처의 다른 매개변수를 수정하고 더 많은 컨볼루션 레이어를 추가하여 네트워크의 depth를 꾸준히 증가 시킵니다. 이는 모든 레이어에서 매우 작은(3x3) 컨볼루션 필터를 사용하기 때문에 가능합니다.</li>
<li>LSVRC Classification 및 localisation task에서SOTA를 달성할 뿐만 아니라 다른 이미지 인식 데이터 세트에도  더 정확한 ConvNet 아키텍처를 제시하였습니다.</li>
</ul>
<h1 id="2-convnet-configurations">2. ConvNet Configurations</h1>
<h2 id="21-architecture">2.1 Architecture</h2>
<ul>
<li>ConvNet에 대한 입력은 고정 크기 224x224 RGB 이미지입니다.</li>
<li>이미지는 컨볼루션 레이어 스택을 통과하며 여기서 매우 작은 3x3 필드가 있는 필터를 사용합니다.</li>
<li>컨볼루션 stride은 1픽셀로 고정됩니다. 레이어 입력은 공간 해상도가 컨볼루션 후에 보존되도록 합니다. 즉, 3x3 conv 레이어의 경우 패딩은 1픽셀입니다.</li>
<li>Max pooling은 stride 2로 2x2 pixel window에서 수행됩니다.</li>
<li>컨볼루션 레이어 스택에는 3개의 완전 연결 레이어(fully connected layer)가 있습니다. 처음 두 개의 레이어는 각각 4096개의 채널을 갖고 세 번째 레이어는 1000 class에 대한 분류를 수행하므로 1000개의 채널을 갖습니다.</li>
<li>마지막 레이어는 soft-max 변환 레이어입니다.</li>
<li>마지막가 완전 연결 레이어를  제외한 모든 레이어에는 ReLU가 적용됩니다.</li>
</ul>
<h2 id="22-configurations">2.2 Configurations</h2>
<ul>
<li>논문에서 평가한 ConvNet 구성은 아래 테이블에 요약되어 있습니다.</li>
<li>A~E의 모든 구성은 섹션 2.1에 제시된 일반 설계를 따르며 depth만 다릅니다.</li>
<li>네트워크 A의 11개 가중치 레이어(8개의 컨볼루션 레이어 및 3개 FC 레이어)에서 네트워크 E의 19개 가중치 레이어(16개의 컨볼루션 및 3개 FC 레이어)까지 있습니다.</li>
<li>컨볼루션의 너비 레이어(채널 수)은 첫 번째 레이어 64개에서 시작하여 각각의 맥스 풀링 레이어 이후 2배씩 512에 도달할 때까지 증가합니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F8e20ac7c-3964-4588-8491-2a95ee03238c%2FUntitled.png?table=block&id=87c98af3-7d58-4bfa-ba94-3bee7855665d&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1060&userId=&cache=v2" alt="img"></p>
<p>Table: ConvNet Configuration</p>
<h2 id="23-discussion">2.3 Discussion</h2>
<ul>
<li>전체 네트워크에서 매우 작은 3x3 receptive field 사용하며 모든 픽셀에서 입력으로 컨볼루션됩니다(stride1).</li>
<li>한개의 7x7 컨볼루션 레이어 대신 3개의 3x3 컨볼루션 레이어를 사용함으로서 결정함수의 비선형성 증가하여 피처(feature)의 식별성 증가하였습니다.</li>
<li>3개의 3x3 컨볼루션 레이어 스택이 C개의 채널을 가지고 있다고 가정하면 스택은$3(3^2C^2 ) = 27C^2$ 가중치에 의해 파라미터화 되는데 단일 7x7 레이어는 $<em>72C^2 =49C^2</em>$ 매개변수가 필요해 거의 81%가 더 필요합니다.</li>
</ul>
<h1 id="3-classification-framework">3. Classification Framework</h1>
<h2 id="31-training">3.1 Training</h2>
<ul>
<li>학습은 역전파(back-propagation) 기반으로 미니 배치 경사하강법(gradient descent)을 사용하여 수행됩니다.<ul>
<li>Batch Size: 256</li>
<li>Momentum: 0.9</li>
<li>L2 regularization : $5 \times 10^{-4}$</li>
<li>학습률(Learning rate): $10^{-2}$, valiation에 대한 accuracy 향상되지 않으면 매번 학습률을 10배 감소, 370K 반복 이후 학습 중단(74 epoch)</li>
<li>Weight decay: $5\times10^{-4}$</li>
<li>Dropout: 0.5</li>
</ul>
</li>
<li>네트워크 가중치의 초기화는 매우 중요한데, 잘못된 초기화는 많은 수의 컷오프으로 인해 학습을 지연시키기 때문입니다. 학습 지연 막기 위해 무작위 초기화로 교육될 정도로 얕은 구성을 학습하는 것으로 시작했습니다. 그 후 깊은 architecture을 훈련할 때, 처음 4개의 컨볼루션 레이어와 마지막 3개의 FC 레이어를 네트워크의 레이어로 초기화 했습니다(중간 layer들은 무작위로 초기화 됨).224x224 크기의 ConvNet 입력 이미지를 얻기 위해 재조정된 학습 이미지(rescaled training image)를 무작위로 crop합니다.</li>
<li><strong>Multi-scale training</strong><ul>
<li>멀티 스케일 훈련의 또 다른 방법은 가장 작은 이미지 측면을 무작위로 샘플링하여 각 훈련 이미지를 개별적으로 다시 스케일링하는 것입니다.</li>
<li>$<em>[S_{min};S_{max}]</em>$ ($<em>S_{min} =256, S_{max} =512</em>$) 에서 무작위로 S 추출해 학습 이미지를 개별적으로 스케일 함으로써  훈련 세트 증강으로 볼 수 있습니다.</li>
</ul>
</li>
</ul>
<h2 id="32-testing">3.2 Testing</h2>
<ul>
<li>테스트 시 학습된 ConvNet과 입력 이미지가 주어지면 다음과 같은 방식으로 분류됩니다.<ul>
<li>가장 작은 면이 Q&gt;224와 같도록 등방성으로 재조정되며, 이는 반드시 S와 같지는 않습니다.</li>
<li>그런 다음 재조정된 테스트 이미지에 네트워크를 조밀하게 적용합니다(첫 번째 FC 레이어는 7x7 컨볼루션 레이어로, 마지막 두 FC 레이어는 1x1 컨볼루션 레이어로).</li>
<li>전체 크기(full-size) 입력으로 각 레이어의 필터를 컨벌루션하여 전체 이미지에 적용됩니다.</li>
<li>마지막으로 이미지에 대한 클래스 점수의 고정 크기 벡터를 얻기 위해 클래스 점수 맵이 공간적으로 평균화됩니다.</li>
</ul>
</li>
<li>또한 이미지를 수평으로 뒤집음으로써 테스트 세트 확대를 사용합니다.</li>
</ul>
<h2 id="33-implementation-details">3.3 Implementation Details</h2>
<ul>
<li>Multi-GPU 학습 은 각 GPU에서 병렬로 처리되는 여러 GPU 배치들로 각 학습 이미지를 분할하여 수행됩니다.</li>
<li>GPU 배치 gradient계산된 후 평균을 구하여 전체 배치의 gradient를 얻습니다. gradient 계산은 GPU 간에 동기화되므로 결과는 단일 GPU에서 훈련할 때와 정확히 동일합니다.</li>
<li>4-GPU 시스템에서 단일 GPU 시스템보다 속도가 3.75배 향상 시킨다는 것을 발견하였습니다.</li>
</ul>
<h1 id="4-classification-experiments">4. Classification Experiments</h1>
<ul>
<li><p>• ILSVRC-2012 dataset에 대해 설명된 ConvNet architecture가 이뤄낸 image classification 결과를 제시합니다.</p>
</li>
<li><p>데이터 세트에는 1000개 클래스의 이미지가 포함되어 있으며 세 개(학습 1.3m, 검증 50k, 테스트 100k images)의 집합으로 분할됩니다.</p>
</li>
<li><p>Classification performance는 2가지 오류척도로 평가합니다.</p>
<ul>
<li>top-1 error : 다중 클래스 분류 오류, 즉 잘못 분류된 image의 비율</li>
<li>top-5 error : 실측 범주가 상위 5개 카테고리들 밖에 있는 image의 비율</li>
</ul>
</li>
<li><p><strong>성능 평가</strong></p>
<ul>
<li>단일 테스트 스케일에서 ConvNet 성능<ul>
<li>로컬 response normalization(A-LRN 네트워크)을 사용해도 모델 A에서 개선되지 않습니다. 따라서 우리는 더 깊은 아키텍처 (B-E)에서 normalization을 사용하지 않습니다.</li>
<li>A의 11개 레이어에서 E의 19개 레이어로 ConvNet depth가 증가함에 따라 classification error가 감소하는 것을 볼 수 있습니다. 특히 동일한 depth에도 불구하고 구성 C(3개의 1 × 1 컨볼루션 레이어 포함)은 3 × 3 컨볼루션을 사용하는 구성 D보다 성능이 더 나쁩니다.</li>
</ul>
</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fcb14b5a3-3a2a-4f03-b681-06d18f2bbaac%2FUntitled.png?table=block&id=4b3fed2a-8db2-489b-8dfa-449583cea80e&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1440&userId=&cache=v2" alt="img"></p>
<ul>
<li>멀티 테스트 스케일에서 ConvNet 성능<ul>
<li>스케일 지터링의 영향을 평가합니다. 테스트 이미지의 여러 재조정 된 버전에 대해 모델을 실행하는 것으로 구성됩니다.</li>
<li>결과는 스케일 지터링이 더 나은 성능으로 이어진다는 것을 나타냅니다. 이전과 마찬가지로 가장 깊은 구성(D 및 E)이 가장 잘 수행되며 스케일 지터링은 고정된 가장 작은 면을 사용한 훈련보다 낫습니다.</li>
</ul>
</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F69ab779a-18d7-4b03-8b52-c716b9575cf1%2FUntitled.png?table=block&id=6dad1f26-7a6c-49cb-8dc3-ecb241215cd2&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1520&userId=&cache=v2" alt="img"></p>
<ul>
<li>여라 ConvNet 퓨전 결과<ul>
<li>이 부분에서는 soft-max 클래스 후방을 평균화하여 여러 모델의 출력을 결합합니다.</li>
<li>7개의 모델의 예측을 결합했음에도 불구하고 완전히 훈련된 2개의 다중 스케일 모델의 결합에 비해 정확도가 떨어집니다.</li>
</ul>
</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Ff487eb8c-5594-4d37-b700-a24a897495bb%2FUntitled.png?table=block&id=33a83ba6-49c4-4e93-ac75-fa48f7e75b69&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1640&userId=&cache=v2" alt="img"></p>
<h1 id="5-conclusion">5. Conclusion</h1>
<p>VGG-Net은 기존의 Convolutional 아키텍쳐보다 작은 receptive field 및 최대 19 depth의 레이어를 설계하여 좋은 성능을 만들었다고 볼 수 있습니다.이 결과는 시각적 표현에서 depth의 중요성을 다시 한 번 확인시켜 줍니다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Transformers: State-of-the-Art Natural Language Processing]]></title>
            <link>https://velog.io/@dandelion_26/Transformers-State-of-the-Art-Natural-Language-Processing</link>
            <guid>https://velog.io/@dandelion_26/Transformers-State-of-the-Art-Natural-Language-Processing</guid>
            <pubDate>Mon, 11 Dec 2023 06:25:05 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/pdf/1910.03771.pdf">https://arxiv.org/pdf/1910.03771.pdf</a></p>
<h1 id="핵심-요약">핵심 요약</h1>
<ul>
<li>Transformers는 자연어 처리 분야를 혁신적으로 발전시킨 오픈소스 라이브러리로, Transformer 아키텍처와 효과적인 사전 학습을 통해 다양한 작업을 위한 고용량 모델을 만들었습니다.</li>
<li>이 라이브러리는 최신 Transformer 아키텍처와 사전 학습된 모델을 통해 넓은 커뮤니티에 제공됩니다.</li>
<li>연구자들에게는 확장성을, 실무자들에게는 간편함을, 산업적 사용을 위해 신속하고 견고한 성능을 제공하는 것이 목표입니다.</li>
</ul>
<h1 id="1-introduction">1. Introduction</h1>
<ul>
<li>트랜스포머 아키텍처와 사전 학습된 모델은 자연어 처리 분야에서 큰 발전을 이루었습니다.</li>
<li>트랜스포머 아키텍처는 더 높은 용량의 모델을 구축하고, 사전 학습은 이 용량을 다양한 작업에 효과적으로 활용할 수 있게 만들었습니다.</li>
<li>Transformers는 이러한 발전을 더 넓은 머신 러닝 커뮤니티에 개방하기 위한 오픈 소스 라이브러리입니다.</li>
<li>이 라이브러리는 통일된 API 아래에서 신중하게 설계된 트랜스포머 아키텍처로 구성되어 있습니다. 또한, 커뮤니티에서 제작하고 제공하는 큐레이팅된 사전 학습된 모델 모음을 지원합니다.</li>
<li>Transformers는 연구원과 실무자 모두에게 도움이 되는 라이브러리입니다. 연구자는 새로운 트랜스포머 아키텍처를 개발하고, 실무자는 다양한 자연어 처리 작업에 사전 학습된 모델을 쉽게 활용할 수 있습니다.</li>
<li>Transformers는 다음과 같은 기능을 제공합니다.<ul>
<li>다양한 트랜스포머 아키텍처 구현</li>
<li>큐레이팅된 사전 학습된 모델 모음</li>
<li>통일된 API</li>
<li>연구 및 프로덕션 모두를 위한 지원</li>
</ul>
</li>
<li>Transformers는 Hugging Face의 엔지니어 및 연구원 팀에서 유지하고 있으며 400명 이상의 외부 기여자로 구성된 활발한 커뮤니티의 지원을 받고 있습니다.</li>
<li>Transformers는 자연어 처리 분야에서 발전을 이끌어갈 중요한 도구입니다.</li>
</ul>
<h1 id="2-related-work">2. Related Work</h1>
<ul>
<li>NLP 및 ML 커뮤니티는 오픈 소스 연구 도구를 구축하는 강력한 문화를 가지고 있습니다.</li>
<li>Transformers는 다음과 같은 라이브러리에서 영감을 받았습니다.<ul>
<li>tensor2tensor 라이브러리: 구글 연구소에서 개발한 트랜스포머 아키텍처 구현 라이브러리</li>
<li>BERT의 원래 소스 코드: 구글 연구소에서 개발한 BERT 모델의 원래 소스 코드</li>
<li>AllenNLP 라이브러리: 사전 학습된 모델을 쉽게 캐싱할 수 있는 기능을 제공하는 NLP 라이브러리</li>
<li>Fairseq, OpenNMT, Texar, Megatron-LM, Marian NMT 라이브러리: 신경망 번역 및 언어 모델링 시스템 라이브러리</li>
</ul>
</li>
<li>Transformers는 이러한 라이브러리의 기능을 바탕으로 모델을 쉽게 다운로드, 캐싱 및 미세 조정하고 프로덕션으로 원활하게 전환할 수 있도록 하는 추가 사용자 친화적 기능을 제공합니다.</li>
<li>또한, Marian NMT 및 Google의 BERT에서 모델을 사용하여 추론을 수행하는 도구를 제공합니다.</li>
<li>Transformers는 NLTK, Stanford CoreNLP, Spacy, AllenNLP, flair, Stanza와 같은 일반 용도의 쉽게 사용할 수 있는 사용자 친화적인 NLP 라이브러리와 유사한 기능을 제공합니다.</li>
<li>이러한 라이브러리는 모두 Transformers 라이브러리와 모델 허브를 저수준 프레임워크로 사용합니다.</li>
<li>Transformers는 NLP 모델의 허브를 제공하기 때문에 Torch Hub 및 TensorFlow Hub와 같은 인기 있는 모델 허브와도 관련이 있습니다. 이러한 허브는 쉽게 사용할 수 있도록 프레임워크 별 모델 매개변수를 수집합니다.</li>
<li>허브와 달리 Transformers는 도메인 별이므로 시스템은 모델 분석, 사용, 배포, 벤치마킹 및 쉬운 복제를 위한 자동 지원을 제공할 수 있습니다.</li>
</ul>
<h1 id="3-library-design">3. Library Design</h1>
<ul>
<li>트랜스포머 라이브러리는 표준 NLP 기계 학습 모델 파이프라인을 모방하는데 중점을 두며, 세 가지 주요 구성 요소(토크나이저, 트랜스포머, 헤드)로 구성됩니다.</li>
<li>각 모델은 이러한 구성 요소로 완전히 정의되며, 다양한 NLP 작업에 활용할 수 있습니다.</li>
<li>Transformers<ul>
<li>NLP에서 널리 사용되는 Transformer 아키텍처의 구현을 제공하며, 각각은 동일한 핵심을 공유하지만 다른 특징을 가지고 있습니다.</li>
<li>이러한 모델은 이해, 생성, 조건부 생성 및 다국어 응용과 같은 다양한 NLP 작업을 위해 설계되었습니다.</li>
</ul>
</li>
<li>Tokenizers<ul>
<li>각 모델을 사용하기 위해 필요한 토크나이저의 구현을 포함하며, 어휘 처리와 모델의 특정 토크나이제이션 프로세스를 다룹니다.</li>
<li>사용자는 이를 확장하거나 조정하여 특정 작업에 맞게 사용할 수 있습니다.</li>
</ul>
</li>
<li>Heads<ul>
<li>각 트랜스포머 모델에 적합한 다양한 작업에 대한 출력을 제공하며, 특정 손실 함수와 레이어를 추가하여 트랜스포머의 결과를 가공합니다.</li>
<li>라이브러리는 각 헤드를 실제 문제에 적용한 예제를 제공하여 사용자가 사전 학습된 모델을 다양한 NLP 작업에 활용하는 방법을 보여줍니다.</li>
</ul>
</li>
<li>모델은 여러 구현 아키텍처를 제공하며, 토크나이저는 빠른 처리를 위해 최적화된 라이브러리를 사용합니다.</li>
<li>또한 헤드는 다양한 작업에 대한 출력을 쉽게 조정할 수 있습니다.</li>
<li>이 모델은 다양한 NLP 작업에 적용 가능하며, 효과적인 사전 학습된 모델을 다른 작업에 적응하기 쉽도록 도와줍니다.</li>
</ul>
<h1 id="4-community-model-hub">4. Community Model Hub</h1>
<ul>
<li>Transformers 라이브러리는 사전 학습된 모델의 쉬운 사용과 배포를 촉진하기 위한 오픈 소스 라이브러리입니다.</li>
<li>이 라이브러리는 모델 허브를 통해 커뮤니티의 모든 이해 관계자가 사전 학습된 모델을 쉽게 검색, 다운로드 및 사용할 수 있도록 합니다.</li>
<li>모델 허브는 사용자가 계정에 가입하고 명령줄 인터페이스를 사용하여 Tokinizer, Transformer, Head로 구성된 아카이브를 생성하여 모델을 업로드할 수 있습니다.</li>
<li>이 번들에는 라이브러리를 통해 학습된 모델 또는 다른 인기 있는 학습 도구의 체크포인트에서 변환된 모델이 포함될 수 있습니다.</li>
<li>이러한 모델은 저장되고 표준 이름이 부여되므로 사용자가 모델을 미세 조정 또는 추론을 위해 두 줄의 코드로 다운로드, 캐싱 및 실행할 수 있습니다.</li>
<li>예를 들어, 프랑스어 학습 코퍼스에서 사전 학습된 BERT 모델인 FlauBERT를 로드하려면 다음과 같은 명령어를 사용합니다.</li>
</ul>
<pre><code class="language-python">tknzr = AutoTokenizer.from_pretrained(2 &quot;flaubert/flaubert_base_uncased&quot;)
3 model = AutoModel.from_pretrained(4 &quot;flaubert/flaubert_base_uncased&quot;)</code></pre>
<ul>
<li>모델 허브는 모델의 핵심 속성, 아키텍처 및 사용 사례를 설명하는 랜딩 페이지를 자동으로 생성합니다.</li>
<li>추가적인 모델 별 메타데이터는 모델 카드 Mitchell를 통해 제공될 수 있습니다.</li>
<li>이 카드에는 학습 속성, 연구에 대한 인용문, 사전 학습 중 사용된 데이터 셋 및 모델 및 예측의 알려진 편견에 대한 경고가 포함됩니다. 모델 카드의 예는 Figure 1(왼쪽)에 표시됩니다.</li>
<li>예를 들어, 업로드된 각 모델에는 구조에 대한 메타데이터가 포함되어 있으므로 모델 페이지에는 사용자가 실제 데이터에서 모델 출력을 실험할 수 있는 라이브 추론이 포함될 수 있습니다.</li>
<li>그림 1(오른쪽)은 라이브 추론이 포함된 모델 페이지의 예를 보여줍니다. 또한 모델 페이지에는 벤치마킹 및 시각화와 같은 기타 모델별 도구에 대한 링크가 포함됩니다.</li>
<li>예를 들어, 모델 페이지는 Transformer 시각화 라이브러리인 exBERT Hoover에 연결될 수 있습니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F94fce3a2-aa37-4936-b062-039f0fcc5cfb%2F8a95d856-1151-45ed-8f52-1a130914eedd%2FUntitled.png?table=block&id=8b7f3f86-f812-43da-abe9-04e4c085c43c&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1710&userId=&cache=v2" alt="img"></p>
<p>Figure 1: Transformers Model Hub</p>
<ul>
<li>Community Case Studies<ul>
<li>모델 허브는 Transformers가 다양한 방법으로 사용되고 있음을 보여줍니다.</li>
<li>Case 1: Model Architects<ul>
<li>모델 아키텍트는 새로운 사전 학습된 모델을 개발하여 커뮤니티와 공유합니다.</li>
<li>예를 들어, AllenAI는 생의학 텍스트에서 추출을 개선하기 위한 새로운 사전 학습된 모델인 SciBERT를 개발했습니다.</li>
<li>모델 허브를 사용하여 모델을 배포하고 CORD - COVID-19 챌린지의 일환으로 홍보했습니다.</li>
</ul>
</li>
<li>Case 2: Task Trainers<ul>
<li>작업 트레이너는 다양한 작업에 대한 트랜스포머의 성능을 테스트하기 위한 테스트 베드를 개발합니다.</li>
<li>예를 들어, NYU의 연구원들은 Jiant 프레임워크를 개발하여 다양한 방법으로 사전 학습된 모델을 미세 조정하고 그 출력을 비교할 수 있게 했습니다.</li>
</ul>
</li>
<li>Case 3: Application Users<ul>
<li>애플리케이션 사용자는 사전 학습된 모델을 사용하여 실제 세계 응용 프로그램을 구축합니다.</li>
<li>예를 들어, Plotly는 자동 문서 요약 모델을 배포하기 위해 모델 허브를 사용했습니다.</li>
<li>사전 학습된 및 미세 조정된 요약 모델인 DistilBART를 찾아서 허브에서 직접 모델을 실행하고 배포할 수 있었습니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="5-deployment">5. Deployment</h1>
<ul>
<li>Transformers 라이브러리는 다음과 같은 기능을 통해 모델을 프로덕션에 효율적으로 배포할 수 있도록 지원합니다.<ul>
<li>PyTorch와 TensorFlow 모두에서 사용할 수 있는 모델 제공<ul>
<li>모델을 학습한 프레임워크에 관계없이 프로덕션에 배포할 수 있습니다.</li>
</ul>
</li>
<li>TorchScript 및 ONNX와 같은 중간 형식으로 모델 내보내기<ul>
<li>이러한 형식으로 변환하면 모델을 표준화된 방식으로 실행하고 속도를 향상시킬 수 있습니다.</li>
</ul>
</li>
<li>iOS 및 Android 디바이스에 대한 지원<ul>
<li>에지 디바이스에 모델을 배포할 수 있습니다.</li>
</ul>
</li>
</ul>
</li>
<li>이러한 기능을 통해 사용자는 다양한 환경에서 모델을 효율적으로 배포할 수 있습니다.</li>
</ul>
<h1 id="6-conclusion">6. Conclusion</h1>
<ul>
<li>Transformers는 NLP 커뮤니티가 대규모 사전 학습된 모델을 쉽게 접근하고 사용할 수 있도록 지원하는 오픈 소스 라이브러리입니다.</li>
<li>Transformers는 NLP 연구 및 개발을 가속화하고 실제 세계 응용 프로그램 구축을 촉진하는 데 도움이 됩니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Training Language Models to Follow Instructions with Human Feedback]]></title>
            <link>https://velog.io/@dandelion_26/Training-Language-Models-to-Follow-Instructions-with-Human-Feedback</link>
            <guid>https://velog.io/@dandelion_26/Training-Language-Models-to-Follow-Instructions-with-Human-Feedback</guid>
            <pubDate>Mon, 11 Dec 2023 06:24:26 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/abs/2203.02155">https://arxiv.org/abs/2203.02155</a></p>
<h2 id="introduction">Introduction</h2>
<p>다양한 대형언어모델이 다양한 NLP task를 풀기 위해 모델에 prompt를 줄 수 있습니다. 특히, task에 대한 몇 개의 예제를 함께 주는 prompt가 흔하게 쓰입니다. 하지만, 이러한 모델들은 의도되지 않은 출력을 뱉거나 없는 사실을 만들어내거나, 편향된 혹은 혐오적인 표현을 내뱉을 수 있습니다. 이는 최신 언어 모델들의 목적함수(language model objective)가 단순히 인터넷 웹페이지의 다음 토큰을 예측하는 것이기 때문입니다. 이는 우리가 언어모델에게 기대하는 “유저의 지시(instruction)”을 안전하고 도움을 주는 방향으로 따르는 것과의 괴리가 있습니다.</p>
<p>이러한 괴리를 해결하기 위해, 저자들은 fine-tuning 방법을 제시합니다. 구체적으로, 사람들의 피드백을 통한 강화학습(Reinforcement Learning from Human Feedback; RLHF)을 사용하여 GPT3를 작성된 instruction들을 따르도록 fine-tuning합니다.</p>
<ol>
<li>(Supervised Fine-Tuning; SFT) 언어 모델 API에 제출된 prompt에 대한 원하는 출력 동작에 대한 사람이 작성한 demonstration들과, 레이블러가 작성한 prompt들을 수집했습니다. 이 데이터셋을 가지고 모델을 지도학습으로 fine-tuning합니다.</li>
<li>(Reward Model training; RM) 다음으로, 큰 개수의 API prompts에 대해 1번으로 학습된 모델이 생성한 출력들 사이에 사람이 평가한 레이블 또는 비교를 포함하는 데이터셋을 수집합니다. 이 데이터셋으로 레이블러가 어떤 모델출력을 더 선호하는지 예측하는 보상모델(reward model, RM)을 학습시킵니다.</li>
<li>(Proximal Policy Optimization; PPO) 학습된 RM을 보상함수로 사용하여 보상을 최대화 시키도록 모델을 학습합니다. 이때 PPO알고리즘을 사용합니다.</li>
</ol>
<p>이렇게 학습된 모델을 <strong>InstructGPT</strong>라고 부릅니다.</p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F72965d58-eab5-451d-b6ac-2b10b29fa5b1%2FUntitled.png?table=block&id=f7a25d06-a886-4465-b1a8-e21dc4354442&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=2000&userId=&cache=v2" alt="img"></p>
<p>저자들은 이렇게 InstructGPT를 평가하기 위해 레이블러가 테스트셋에 대한 모델 출력의 퀄리티를 채점하고 공개된 NLP 데이터셋들에 자동화된 평가를 진행했습니다. 저자들은 1.3B, 6B, 175B 모델을 학습했고 이들은 모두 GPT3 구조를 가지고 있습니다.</p>
<p>평가 결과를 통해 저자들은 다음과 같은 점들을 발견했습니다.</p>
<ul>
<li>레이블러는 GPT3가 생성한 출력보다 InstructGPT가 생성한 출력을 더 많이 선호합니다.</li>
<li>InstructGPT모델은 GPT3보다 향상된 진실성(truthfulness)을 보입니다.</li>
<li>InstructGPT는 GPT3보다 조금 해소된 유해성을 보이지만, 편향에 대해서는 해소되지 않았습니다.</li>
<li>제안된 RLHF fine-tuning 과정을 수정하면서 공개된 NLP 데이터셋들에 대한 성능 하락을 최소화할 수 있습니다. 특정 NLP 데이터셋에서 GPT3보다 성능이 하락된 것을 목격했는데, 이는 PPO 업데이트와 사전학습 분포의 log likelihood를 증가하는 업데이트와 섞어 성능하락을 크게 줄일 수 있습니다.</li>
<li>InstructGPT는 학습데이터를 만들지 않은 레이블러의 선호에도 일반화될 수 있습니다.</li>
<li>공개된 NLP 데이터셋은 InstructGPT가 어떻게 사용되는지를 반영하고 있지 않습니다. 즉, 이 연구에서 수집한 사람의 선호도를 반영한 데이터와, (FLAN, T0에 사용된) 공개된 NLP 데이터를 각각 GPT3에 fine-tuning했을 때 후자의 경우가 성능이 더 낮았고, 전자가 훨씬 좋은 평가를 얻었습니다.</li>
<li>InstructGPT는 RLHF fine-tuning 분포 외의 instruction에 대해서도 일반화되어 따를 수 있습니다.</li>
<li>하지만, InstructGPT는 여전히 실수를 하곤 합니다. 종종 지시를 따르지 못하거나, 없는 사실을 만들어내기도 합니다.</li>
</ul>
<h2 id="methods-and-experimental-details">Methods and Experimental Details</h2>
<h3 id="high-level-methodology">High-level methodology</h3>
<p>저자들의 메소드는 1) 사전학습된 언어모델, 2) 모델이 원하는 출력을 생성하게 지도하는 prompt들 3) 사람 레이블러들을 가지고 다음과 같은 세 단계를 거칩니다.</p>
<p><strong>Step1 : demonstration data를 수집하고, 지도 policy를 학습시킵니다.</strong></p>
<p>레이블러가 만든 demonstrations(prompt - 레이블러가 작성한, 원하는 출력물)을 가지고 사전학습된 GPT3를 지도학습으로 fine-tuning합니다.</p>
<p><strong>Step2 : comparison data를 수집하고, reward model을 학습시킵니다.</strong></p>
<p>한 prompt에 대한 두개의 모델 출력물들을 비교하여 레이블러가 더 선호하는 출력물을 선택하여 비교용 데이터를 구성하고, 이 데이터를 이용하여 모델이 사람이 선호하는 출력을 생성하는 방향으로 reward model을 학습합니다.</p>
<p><strong>Step3 : PPO를 이용하여 reward model에 대한 poilcy를 최적화합니다.</strong></p>
<p>reward model의 출력(실수값인 reward)을 사용하여 PPO 알고리즘으로 이 reward를 최적화하는 방향으로 policy를 fine-tuning합니다.</p>
<p>step2와 step3는 번갈아가며 반복가능합니다. comparison data는 현재 가장 좋은 policy위에서 추가적으로 수집될 수 있습니다.</p>
<h3 id="dataset">Dataset</h3>
<p>저자가 사용한 prompt dataset에는 언어모델 API에 제출한 prompt들과 더불어 적은 개수의 레이블러가 작성한 prompt를 포함되어있습니다. 또한 question answering, dialog, summarization 같은 다양한 task에 대한 prompt들로 구성되어 있습니다.</p>
<p>이러한 prompt dataset을 용도에 맞게 세가지 dataset으로 나눴습니다.</p>
<ul>
<li>SFT dataset = demonstration dataset : SFT(supervised fine-tuned) model을 학습시키기 위한 레이블러 demonstrations을 포함한 데이터</li>
<li>RM dataset = comparison dataset : RM을 학습시키기 위해, 모델이 생성한 출력들에 ranking을 레이블러가 매긴 데이터</li>
<li>PPO dataset : RLHF fine-tuning을 위한 API로만 수집한 prompt 데이터</li>
</ul>
<h3 id="human-data-collection">Human Data Collection</h3>
<p>demonstration data와 comparison data를 만들 약 40명의 레이블러를 고용하였습니다. 이 레이블러들은 70%대의 일치도를 가졌습니다.</p>
<h3 id="models">Models</h3>
<p>사전학습된 GPT3모델에서, 저자들은 3가지 다른 테크닉으로 학습을 시켰습니다.</p>
<ul>
<li>Supervised Fine-Tuning (SFT) : 지도학습으로 레이블러가 작성한 demonstration으로 GPT3를 fine-tuning한 모델입니다. 최종 SFT 모델은 validation set에서의 RM score이 가장 높은 checkpoint로 선택했습니다.</li>
<li>Reward Modeling (RM) : prompt와 그에 대한 출력을 입력으로 넣었을 때 실수값인 reward를 출력하도록 6B RM 모델을 fine-tuning합니다.</li>
<li>Reinforcement Learning (RL) : SFT model을 RM모델과 PPO알고리즘을 사용하여 fine-tuning합니다. 기본 셋팅에서 학습된 모델을 “PPO”, 공개된 NLP 데이터셋의 성능을 유지하기 위해 사전학습 gradient와 PPO gradient를 섞어 학습한 모델을 “PPO-ptx”라고 부릅니다. 이 모델들이 제안된 프레임워크를 적용한 InstructGPT입니다.</li>
<li>저자들은 PPO model을 SFT model, GPT3의 성능과 비교했고, 또한 few-shot prefix를 제공받아 지시를 따르게끔 유도한 GPT3-prompted와도 비교했습니다. 또한 GPT3를 FLAN,T0에 사용된 데이터를 이용해 fine-tuning했을때의 성능도 비교대상으로 삼았습니다.</li>
</ul>
<h3 id="evaluation">Evaluation</h3>
<p>모델에 대한 평가는 두가지를 이용했습니다.</p>
<ul>
<li>API distribution에서의 평가 : API로 만들고 학습에 사용되지 않았던 prompt들에 대한 사람의 선호도 ranking을 이용하여 모델을 평가했습니다.</li>
<li>공개된 NLP 데이터셋에서의 평가 : 언어 모델의 진실성, 유해성, 편향을 평가하는 안전성 관련 데이터셋들과, 질의응답, 독해, 요약 등의 전통적인 데이터셋들에 평가했습니다.</li>
</ul>
<h2 id="results">Results</h2>
<h3 id="results-on-the-api-distribution">Results on the API distribution</h3>
<p><strong>API distribution 테스트 데이터셋에서 레이블러들은 InstructGPT가 생성한 출력물을 다른 모델들의 출력물보다 선호했습니다.</strong></p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F1b4fc3c0-fe4c-42c3-bcd2-e6e456b84949%2FUntitled.png?table=block&id=cc5464d9-c30d-4196-8173-ab7c64a593ed&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=2000&userId=&cache=v2" alt="img"></p>
<p>기본 GPT3모델이 가장 낮은 선호도를 보였고, 잘 정제된 few-shot prompt를 제공받았을 때 큰 향상을 보였고 (GPT3-prompted), demonstration으로 fine-tuning했을 때(SFT), 그 모델을 PPO로 추가적으로 학습시켰을 때(PPO, PPO-ptx) 더 높은 선호도를 보였습니다.</p>
<p>아래 그림은 InstructGPT가 여러 구체적인 축에서도 사람의 선호를 잘 반영하고 있음을 보여줍니다.</p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F4d1b86f9-99d0-4f90-960d-6a193a708687%2FUntitled.png?table=block&id=b5d06960-7268-4f6d-8d37-d4fd8e223d24&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=2000&userId=&cache=v2" alt="img"></p>
<p>레이블러들은 InstructGPT가 customer assistant의 용도에 적합하다고 평가했고, 지시된 제약(예시 : 답을 두개의 문단 혹은 더 짧게 작성하라)에 더 잘 따른다고 평가했습니다. 또한 없는 사실을 지어내거나(hallucination), 정확한 지시를 따르지 못할 확률이 더 낮다고 평가했습니다.</p>
<p><strong>InstructGPT는 학습데이터를 만들지 않은 “held-out” 레이블러의 선호도에도 일반화될 수 있습니다.</strong></p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F587a9f0e-a021-4307-b477-c4f2554e99de%2FUntitled.png?table=block&id=19b4b618-6303-4c22-8f56-8961ad649ae0&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=2000&userId=&cache=v2" alt="img"></p>
<p>학습데이터를 만든 레이블러들과 held-out 레이블러들의 선호 ranking이 유사한 것을 위의 그림에서 확인할 수 있습니다. 특히 held-out 레이블러의 평가 결과에서 InstructGPT(PPO, PPO-ptx)가 다른 baseline을 크게 이긴 것으로 보아, held-out 레이블러 선호도에도 잘 일반화됨을 알 수 있습니다.</p>
<p><strong>공개된 NLP 데이터셋은 언어 모델이 어떻게 사용되는지에 대해 반영하고 있지 않습니다.</strong></p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fa7d115a9-f91c-4147-819a-2221c23df374%2FUntitled.png?table=block&id=1c88f9d6-6d97-4836-912d-1ddf135029b1&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=2000&userId=&cache=v2" alt="img" style="zoom:33%;" />

<p>InstructGPT와 공개된 데이터셋에 fine-tuning된 GPT3와 비교했을 때, 후자가 훨씬 낮은 Likert score을 얻은 것을 볼 수 있습니다. 또한, demonstration data를 학습한 SFT보다도 낮은 점수를 얻었습니다. 이러한 결과는 FLAN, T0 학습에 사용된 공개된 NLP 데이터셋의 prompt는 성능을 향상시키기에 충분하게 다양하지 않다는 것을 의미합니다. 저자들이 주장하기에 이는 학술적인 데이터셋은 성능을 쉽게 잴 수 있는 분류, 질의응답 같은 task만 집중하고 있는 반면, 저자들이 제공한 API distribution은 대부분 open-ended generation task을 포함하기 때문입니다.</p>
<h3 id="results-on-public-nlp-datasets">Results on public NLP datasets</h3>
<p><strong>InstructGPT는 더 향상된 진실성(truthfulness)를 보입니다</strong>. 아래 그림에서 색있는 bar은 진실성과 정보성(truthfulness and informativeness)를 의미하고, 회색 bar은 진실성만을 의미합니다.</p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F13489ade-66e9-4899-9f4b-9bd6dc9057c4%2FUntitled.png?table=block&id=ecfe0fec-91aa-424e-a5a3-c9eed87d4fae&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=2000&userId=&cache=v2" alt="img"></p>
<p>TruthfulQA 데이터셋에서 인간이 평가한 결과(”QA prompt”), 제안된 PPO 모델들이 진실성있고 정보력있는 출력물을 생성하는데에 있어 GPT보다 작지만 의미있는 향상을 보였습니다.</p>
<p>또한, “Instruction+QA prompt”을 제공했을 때, 즉 모델이 대답에 확신이 없을 때 “I have no comment”라고 출력하도록 지시를 주었을 때 PPO 모델들이 틀린 대답을 자신있게 말하는 것보다(hallucination), 진실성있지만 정보력이 없는 대답(”I have no comment”)을 하는 것을 알 수 있습니다.</p>
<p><strong>InstructGPT는 GPT3보다 조금 완화된 유해성을 보이지만, 편견에 대해서는 향상을 보이지 않았습니다.</strong></p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fc6fa3760-6861-4fcb-b268-9535d22a1c5e%2FUntitled.png?table=block&id=b24bad6d-abc3-4d46-aafa-7454f59b9cca&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=2000&userId=&cache=v2" alt="img"></p>
<p>RealToxicityPrompts 데이터셋으로 평가할 때, 모델ㄹ에게 안전하고 예의바른 출력물을 생성하도록 지시했을 때(”respectful”) InstructGPT는 GPT3 베이스라인보다 덜 위험한 출력물을 생성했습니다. 하지만, 이러한 지시를 주지 않았을 때(”none”), 이러한 효과가 없어지는 것을 볼 수 있습니다.</p>
<h3 id="qualitative-results">Qualitative results</h3>
<p><strong>InstructGPT는 RLHF fine-tuning distribution이외의 instruction에도 일반화될 수 있습니다.</strong></p>
<p>InstructGPT가 영어가 아닌 instruction에도 잘 따르는 것을 발견했습니다. 이것이 놀라운 이유는 코드나 영어가 아닌 데이터는 fine-tuning 데이터 중에서도 극히 일부이기 때문입니다. 제안된 프레임워크를 통해 사람이 직접적으로 지도하지 않아도 제안된 방법을 통해 원하는 행동을 따르도록 만들 수 있다는 것을 알 수 있습니다.</p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F4d794bad-d551-48fa-9a91-accbf587dd6a%2FUntitled.png?table=block&id=60428989-963f-4074-8eee-e9013e605bfd&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=2000&userId=&cache=v2" alt="img"></p>
<p><strong>InstructGPT는 여전히 간단한 실수를 합니다.</strong></p>
<p>제안된 175B PPO-ptx 모델을 ㄹ다루면서, 저자들은 이 모델이 실수를 하는 것을 확인했습니다. 다양한 언어 Task에서 뛰어난 성능을 보였지만, 1) 틀린 전제를 주었을 때 모델이 틀린전제가 맞다고 착각할 수 있으며, 2) 모델이 모호하게 행동하며 간단명료한 대답이 있음에도 여러개의 가능한 대답을 생성하거나, 3) 여러개의 제약을 instruction으로 주었을 때 모델의 성능이 떨어지는 경우도 있었습니다.</p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F978ddc45-c739-4f1c-a9dc-66816df81c2c%2FUntitled.png?table=block&id=896cf99c-6d92-4dfe-b4c4-b5d6541745f3&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=2000&userId=&cache=v2" alt="img"></p>
<h2 id="discussion">Discussion</h2>
<p>저자들이 제안한 framework는 AI 시스템을 사람의 의도에 맞게 align하는 연구라고 볼 수 있습니다.</p>
<p>model alignment 관점에서의 시사점을 제안했습니다.</p>
<ul>
<li>model alignment의 비용은 pretraining보다 훨씬 적게 든다.</li>
<li>InstructGPT가 지도학습에 사용되지 않은 “지시를 실제로 따르는” 일반화되는 행동을 저자들은 확인했다.</li>
<li>저자들이 제안한 fine-tuning framework로 대부분의 성능 하락을 완화할 수 있다.</li>
<li>저자들의 alignment techniques들이 real world에 적용될 수 있다는 것을 보였다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Temporal Fusion Transformers for Interpretable Multi-horizon Time Series Forecasting]]></title>
            <link>https://velog.io/@dandelion_26/Temporal-Fusion-Transformers-for-Interpretable-Multi-horizon-Time-Series-Forecasting</link>
            <guid>https://velog.io/@dandelion_26/Temporal-Fusion-Transformers-for-Interpretable-Multi-horizon-Time-Series-Forecasting</guid>
            <pubDate>Mon, 11 Dec 2023 06:23:58 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/pdf/1912.09363.pdf">https://arxiv.org/pdf/1912.09363.pdf</a></p>
<h1 id="abstract">Abstract</h1>
<p>여러 날을 예측하는 Multi-Horizon Forecasting 시계열 데이터는 복잡한 입력들을 포함하는데 그러한 것들에는 <strong>시간에 따라 변하지 않는 변수</strong>(이 논문에서는 Static Covariates라 표현), <strong>시간에 따라 변하는 관측가능한 변수</strong>(Time Varying Observable Input), 타겟과 어떠한 상호작용을 하는지 사전 정보가 없는 <strong>외인성 변수</strong>(Exogenous Variable) 등이 존재합니다.</p>
<p>현재까지 여러 딥러닝 모델들이 제안되었지만, 그들은 대표적인 Black Box 모델들로 실제 상황에서 전체 길이의 입력들이  어떻게 사용되는지, 모델은 어떠한 Time Step을 중요하게 고려하고 있는지에 대한 통찰을 제공하지는 못합니다. </p>
<p>따라서 본 논문에서는 <strong>Attention 기반 구조</strong>와 <strong>해석 가능한 인사이트를 제공</strong>할 수 있는 <strong>TFT(Temporal Fusion Transformer)</strong>를 제안하였습니다.</p>
<h1 id="1-introduction">1. Introduction</h1>
<p>미래의 여러 Time Step에 대해서 예측을 진행하는 <strong>Multi-Horizon Forecasting</strong>은 시계열 예측 분야에서 매우 중요한 문제입니다. 한 스텝 후만 예측하는 것과 달리 Multi-Horizon은 전체 시계열 데이터에 대한 접근을 가능하게 하고, 미래의 다양한 스텝들에 대한 예측 결과를 통해 활용할 수 있는 범위도 넓힐 수 있습니다. 미래에  대한 예측은 유통업, 헬스 케어, 금융 분야에서 중요하게 사용되고 있으며 시계열 예측의 성능 향상은 엄청난 잠재력을 가지고 있다고 볼 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images%2Fjhbale11%2Fpost%2Fac2b49ac-13a8-4a2b-b076-5051910c7dbf%2FTFT1.png" alt="img"></p>
<p>💡 <strong>실제 Multi-Horizon Forecasting은 위 그림과 같이 다양한 데이터 Input이 필요합니다.</strong> </p>
<p>(1) 현재에는 관측을 통해서 그 값을 알 수 있지만 미래의 값은 알 수 없는 <strong>Observed Input</strong>
 (2) 시간에 따라 달라지지만, 현재에도 그 값을 알 수 있으며 미래에도 그 값을 알 수 있는 <strong>Time Vary Known Input</strong>(week, weekofyear, holiday, quarter)
 (3) 시간과 관계 없이 변하지 않는 정적 공변량 <strong>Static Covariates</strong>(ex 상점의 위치)</p>
<p>과거에 <strong>Autoregressive Model</strong>이 사용되었으나, 이는 모든 외인성 입력들이  미래에도 알 수 있다는 가정을 하고 있다는 문제가 있었으며, 많은 모델이 Time-Dependent Feature 들과 단순하게  결합하는 방식으로 동적인 Covariates를 무시했던 등의 이유로 Multi-Horizon의 다양한 종류의 입력들을 고려하는데  실패하였습니다. 최근 많은 개선된 모델들이 데이터의 고유한 특성을 구조적으로 정렬함으로써 좋은 성과를 얻어냈으며, 현재 사용되는  대부분은 모델들은 <strong>&#39;Black Box&#39;모델</strong>들로 예측이 많은 파라미터 사이에 복잡한 비선형적인 상호작용에 의해 결정하게 됩니다.</p>
<p>모델이 한 예측에 대해서 왜 그런 결과가 나왔는지 이유를 제공해줄 수 없는 이러한 Black Box 모델은 유저들이 모델의  출력을 신뢰하거나 개발자가 모델의 구조를 디버깅하기 힘들게 합니다. 그리고 대부분은 DNN 모델들은 시계열에 적합하지 않다는  한계가 있습니다.</p>
<p>📌 <strong>현재까지 사용되던 모델들은 아래와 같은 문제가 있었습니다.</strong>
 (1) Convolution 기반의 <strong>Post-Hoc 기법</strong>인 <strong>LIME</strong>과 <strong>SHAP</strong>은 Input Feature의 시간 순서를 고려하지 않습니다. </p>
<ul>
<li>LIME은 매 데이터 포인트마다 독립적으로 모델들이 만들어지기에 매우 비효율적입니다. </li>
<li>SHAP의 경우 Feature들이 근접한 Time Step과 독립적으로 고려된다는 점에서 시계열에 적합하지 않습니다. </li>
</ul>
<p>이러한 <strong>Post-Hoc 접근들</strong>은 시계열 데이터에서 중요한 시간대에 따른 상관관계를 설명하는 능력이 매우 부족합니다.</p>
<p>(2) 반면 Language나 Speech에서 주로 사용되는 <strong>Attention 기반의 모델</strong>들은 Sequence 데이터에 대한 해석력이 매우 뛰어나다. Language나 Speech와 달리 시계열 데이터는 다양한 Feature를 가지고 있다는 것이 특징입니다.</p>
<p>이러한 방법론을 시계열 데이터에 적용했을 때 중요한 Time Step을 발견할 수는 있지만 Feature 간의 관계에서 어떤 Feature가 중요하게 고려되고 있는지, 주어진 Time Step에 따른 Feature들의 각각의 중요성을 구분하기는 힘들다는 한계가 있습니다. 따라서 새로운 기법은 이러한 예측이 해석가능하게 하는 것이 필수적일 것입니다.</p>
<p><strong>Attention 기반의 DNN 구조인 TFT</strong>는 새로운 해석력을 제공합니다. Attention Score를 통해 <strong>Time Step에서의 중요성을 해석</strong>할 수 있음은 물론, Static Variable에 대하여, Encoder Variable에 대하여, Decoder <strong>Variable에 대해서 Interpretation을 제공</strong>한다는 점에서 큰 장점을 가집니다.</p>
<h1 id="2-related-work">2. Related Work</h1>
<h4 id="1-multi-horizon-forecasting에-사용되던-dnn">(1) Multi-Horizon Forecasting에 사용되던 DNN</h4>
<p><strong>Autoregressive 모델들</strong>과 <strong>Seq2Seq 모델</strong>로 나뉘며 <strong>DeepAR</strong>과 같은 LSTM Network나 <strong>DSSM(Deep State Space Model)</strong> 등이 존재합니다. 최근에는 Transformer 기반의 구조들이 예측 시 receptive 영역을 늘리기 위해 지역적인 처리를 하는 convolution이나 sparse attention을 같이 사용하고 있습니다. (<strong>Conv-Transforemr, Informer</strong>)</p>
<p>과거 사용하던 대부분의 모델은 여러 Horizon에 대한 값을 한번에 출력하도록 훈련되었습니다. 이러한 모델들은 일반적으로  Seq2Seq 모델을 기반으로 하며, LSTM 인코더를 이용하여 과거의 입력을 요약하고 미래의 예측을 다양한 기법을 사용하여  만들어냈습니다. <strong>MQRNN(Multi-Horizon Quantile Recurrent Forecaster)</strong>는 LSTM이나 Conv 인코더를 이용하여 Context Vector를 만들고 이를 각각의 Horizon에 대하여 MLP에 feed하였습니다. <strong>Multi-Model Attention 기법</strong>은 LSTM 인코더를 이용하여 Context Vector를 만들고 Bi-directional LSTM을 디코더로 사용하여 이전 기법들에 비해서 좋은 성능을 가지고 있지만 해석력은 여전히 문제가 되었습니다.</p>
<p><strong>TFT</strong>는 이러한 문제를 정적 Feature들에 대하여 개별적인 <strong>Encoder-Decoder Attention</strong>을 사용함으로 해결하고자 하였습니다.</p>
<blockquote>
<p>Attention 기법은 번역, 이미지 분류, Tabular Learning 등에서 Attention의 가중치를 이용하여  각각의 입력의 영향력을 알 수 있게 해줍니다. 최근 시계열에서 해석력을 위해 사용하는데 이들은 정적 공변량(Static  Covariates)의 중요성은 고려하지 못한다는 한계가 있었습니다. </p>
</blockquote>
<blockquote>
<p>현재 Attention의 Explanability에 대한 많은 논의가 있지만 이 논문에서는 다루지 않도록 하겠습니다.</p>
</blockquote>
<h2 id="tft의-핵심-아이디어">TFT의 핵심 아이디어</h2>
<p><strong>(개인적인 생각)</strong></p>
<p><img src="https://velog.velcdn.com/images%2Fjhbale11%2Fpost%2F041549f4-ce9b-4e31-affe-334e3f0603a6%2Fimage5.gif" alt="img"></p>
<p>위의 그림이 <strong>TFT의 핵심 아이디어</strong>를 잘 보여준다고 생각합니다. 제가 생각하는 TFT의 핵심은 아래와 같습니다.</p>
<ul>
<li><strong>현재 시점에서 알 수 없는 미래의 관측 변수(Observed Input)</strong>과 <strong>현재 시점에서 미래 시점의 값을 알 수 있는 변수(Known Input)</strong>을 활용하면 Time Series Data에 대한 Prediction 성능을 높일 수 있다!</li>
<li>시간에 따라 변하지만 <strong>미래 시점의 값을 현재 시점에서도 알 수 있는 변수</strong>(Time Varying Known Input)과 <strong>시간에 따라 변하지 않는 변수인 정적 공변량</strong>(Static Covariates)이 함께 모델에 입력되어 <strong>다중 시점에 대한 예측</strong>(Multi-Horizon Forecasting) 시 활용될 수 있다!</li>
</ul>
<h1 id="3-multi-horizon-forecasting">3. Multi-Horizon Forecasting</h1>
<p>주어진 시계열 데이터셋에 대하여 고유한 객체 I가 존재한다고 하면, 각 객체 i는 정적 공변량의 집합과 연관되어 있습니다. (상점의 경우 I는 고객, 정적 공변량은 상점의 위치가 될 것입니다) 시간에 의존적인 입력 Feature들은 두 개로 나뉘는데 하나는 <strong>Observed Input</strong>이고 나머지는 <strong>Known Input</strong>입니다. (위의 핵심 아이디어 부분에서 설명한 바와 같습니다) </p>
<p>여러 상황에서 TFT는 <strong>Quantile Regression</strong>을 사용하여 예측을 진행하며, 각 Quantile 예측은 다음과 같은 형태를 보이게 됩니다.</p>
<p><img src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FThwhw%2Fbtq4Sl6dy9P%2FKTNMQnGZIs54FisGE5PM50%2Fimg.png" alt="img"></p>
<p>이 때, y는 q번째 Sample Quantile에 대하여 t 시점에서 <strong>τ번째 뒤에 해당하는 예측</strong>에 해당하며, f는 <strong>예측 모델</strong>입니다. k의 <strong>Look-back Window</strong>를 이용하여 시작하는 지점인 t로부터 k개 이전까지의 값들을 이용하는 식이라고 해석할 수 있습니다. x는 <strong>Known Input</strong>, s는 <strong>Static Covariate의 집합</strong>을 의미합니다.</p>
<h1 id="4-model-architecture">4. Model Architecture</h1>
<p>TFT의 모델의 구조는 아래와 같습니다.
 <img src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX08Yv%2Fbtq4OsSUmLc%2FwfrgYLSkHYMlQQjvrhSeWK%2Fimg.png" alt="img"></p>
<p> <strong>TFT의 주요 구성은 아래와 같습니다.</strong></p>
<p>(1) <strong>Gating Mechanism</strong>을 통해 불필요한 성분을 스킵하여 광범위한 데이터셋에 대하여 adaptive depth와 network complexity 감소를 통해 가능하게 합니다.</p>
<p>(2) <strong>Variable Selection Network</strong>를 통해 관련 있는 Input Variable만 선택합니다.</p>
<p>(3) <strong>Static Covariate Encoder</strong>를 통해 정적 공변량들을 Context Vector에 인코딩하고 네트워크에 결합합니다.</p>
<p>(4) <strong>Temporal Processing</strong>을 통해 Observed Input과 Known  Input 모두에 대해 장기 단기 시간 관계를 학습합니다. Local Processing을 위해 seq2seq layer를  사용하며, Interpretable Multi-Head Attention을 통해 장기 의존성을 알아냅니다.</p>
<p>(5) <strong>Prediction Intervals</strong>을 통해 Quantile을 이용하여 매 Prediction Horizon에 대하여 Target이 존재할 수 있는 범위를 제공합니다.</p>
<h2 id="41-gating-mechanisms">4.1 Gating Mechanisms</h2>
<p><strong>Exogenous Inpu</strong>t과 <strong>Target</strong> 사이의 관계는 종종  미리 알 수 없어 어떠한 변수들이 연관되어 있는지 예측하기 어렵게 합니다. (ex 금융 데이터를 예시로 들었을 때 코로나의 발생과 Target인 지수 데이터의 관계는 미리 알 수 없어 예측이 어려울 것입니다.) 더욱이 필요되는 비선형 처리의 길이를 결정하기  힘들며 단순한 모델들이 훨씬 효과적일 수 있는 작거나 잡음이 심한 데이터셋이 존재하기도 합니다.</p>
<p>TFT는 필요할 때만 비선형 처리를 하여 모델의 유연성을 높이고자 <strong>GRN(Gated Residual Network)</strong>를 제안합니다. 초기 입력 a와 선택적 context vector c를 받아 아래와 같이 처리합니다.</p>
<p>GRNω(a,c)=LayerNorm(a+GLUω(η1))...(1)</p>
<p>η1=W1,ωη2+b1,ω...(2)</p>
<p>η2=ELU(W2,ωa+W3,ωc+b2,ω)...(3)</p>
<p>여기서 <strong>ELU</strong>는 <strong>Exponential Linear Unit Activation Function</strong>을 의미하고, η 1, 2는 모두 중간 층에 해당하며, ω는 <strong>Weight Sharing Index</strong>를 의미합니다. 그 과정에서 Standard Layer Normalization을 사용하였습니다. ELU는 입력이 0보다 크면 Identify Function으로 동작하며, 0보다 작을 때는 일정한 출력을 내며, <strong>GLU(Gated Linear Units)</strong>을 사용하여 주어진 데이터셋에서 필요하지 않은 부분을 제거합니다. GLU의 수식은 다음과 같습니다.</p>
<p>GLUω(γ)=σ(W4,ωγ+b4,ω)⊙(W5,ωγ+b5,ω)</p>
<p><strong>시그모이드 함수</strong>를 활성화 함수로 사용하였으며 연산은 <strong>Elementwise Hadamard Product</strong>를 사용합니다. GLU는 TFT에서 Input a의 비선형 기여도를 바꿀 수 있는데 예를 들어 GLU의 출력이 모두 0이라면 비선형 기여도를 suppress하기 위해서 Layer를 Skip하는 것으로 취급합니다. Context Vector가 없다면 GRN은  Context Input을 0으로 취급합니다. (c=0) 학습 과정에서 gating layer와 normalization 이전에 <strong>dropout을 적용</strong>합니다.</p>
<h2 id="42-variable-selection-networks">4.2 Variable Selection Networks</h2>
<p>다양한 변수들이 사용가능한 반면, 출력에 대해서 그들의 연관성이나 명확한 기여도는 일반적으로 알기 어렵습니다. TFT는 <strong>Instance-wise 변수 선택</strong>을 통해 (즉 Static Covariate와 Time Dependent Covariate 모두에 대하여) 예측에 직결되는 성분을  골라내는 것은 물론, 불필요한 noisy 입력들을 줄일 수 있습니다. 대부분의 실제 시계열 데이터에는 예측과 관련없는 값들이  많으므로 이와 같은 Variable Selection을 통해 성능을 개선할 수 있습니다.</p>
<p><strong>Categorical Variables</strong>에 대해서는 Entity Embedding을, <strong>Continuous Variables</strong>에 대해서는 Linear Transformation을 진행합니다. 모든 Static Covariates, Past &amp; Future Input들에 대해 분리된 변수 선택 네트워크를 사용합니다. ξ을 <strong>각 시점에서의 변형된 입력</strong>이라 하고, Ξ를 <strong>모든 이전 시점 t에 대한 입력들의 flatten 벡터</strong>라 하면, 수식은 아래와 같습니다.</p>
<p>vχt=Softmax(GRNvχ(Ξt,cs))</p>
<p>vχt가 <strong>Variable Selection Weight의 Vector</strong>이며, c는 Static Covariate Encoder를 통해 얻을 수 있습니다. Static Variable에 대해서 Context Vector c는 Static Information을 담고 있다고 볼 수 있습니다.</p>
<p>매 시점마다, GRN을 통해 ξt(j)를 feeding하면서 비선형 처리를 위한 추가적인 Layer를 거치게 됩니다.</p>
<p>ξt(j)=GRNξ(j)(ξt(j))</p>
<p>ξt(j)는 <strong>Variable j에 대해 전처리된 Feature Vector</strong>이며, 우리는 각자의 GRN에 ξt(j)를 넣어줌을 통해 가중치를 모든 시점 t에 대해서 공유하는 가중합을 구할 수 있으며 그 식은 아래와 같습니다.</p>
<p>ξt=∑j=1mχvχt(j)ξt(j)</p>
<p>위의 식에서 vχt(j)는 <strong>Vector vχt의 j번째 element</strong>입니다.</p>
<h2 id="43-static-covariate-encoder">4.3 Static Covariate Encoder</h2>
<p>TFT는 정적인 메타데이터의 정보를 통합하기 위해서 설계되었습니다. 따라서 개별적인 GRN 인코더를 이용하여 4개의 서로 다른 <strong>Context Vector</strong>인 cs,ce,cc,ch를 만들게 됩니다. 이들은 Temporal Decoder에서 다양하게 사용되며 자세하게는 cs는 시간 변수를 선택하는 context, cc와 ch는 지역 처리를 위한 시간 변수, ce는 정적인 정보들에 대한 시간 변수들을 의미합니다.</p>
<p>예를 들어 ζ를 Static Variable Selction의 Output이라고 할 때, Temporal Variable Selction을 위한 Context cs는 아래와 같은 식을 통해 구할 수 있습니다. </p>
<p>cs=GRNcs(ζ)</p>
<h2 id="44-interpretable-multi-head-attention">4.4 Interpretable Multi-Head Attention</h2>
<p>TFT는 <strong>Self-Attention Mechanism</strong>을 통해 다른 시점에 대한  Long-Term Relation을 파악합니다. 구체적으로는 Transformer 기반의 Multi-Head Attention을  통해 해석력을 강화하였습니다. 일반적으로 Attention Mechanism의 Attention은 다음과 같이 계산됩니다.</p>
<p>Attention(Q,K,V)=A(Q,K)V</p>
<p>A()는 <strong>Normalization Function</strong>이며 N은 Attention Layer를 통과하는 <strong>time step의 개수</strong>이며 일반적으로는 <strong>Dot-product Attention</strong>을 사용합니다.</p>
<p>기본적인 Attention의 Learning Capacity를 개선하기 위해서 <strong>Multi-Head Attention</strong>을 제안하였으며, 이는 여러 Head에서 각기 다른 Representation Subspace를 사용함으로써 학습 효용성을 개선하는 방식이라고 볼 수 있습니다.</p>
<p>MultiHead(Q,K,V)=[H1,…,HmH]WH</p>
<p>Hh=Attention(QWQ(h),KWK(h),VWV(h))</p>
<p>다른 값들이 각각 다른 Head에서 사용되기 때문에 Attention의 가중치가 단독으로는 특정 Feature의 중요성을  나타내는 지표가 되기 어렵습니다. 따라서 다음과 같이 Multi-Head Attention을 수정하여 각 Head에서 값을 공유할 수 있도록 만들었습니다.</p>
<p>InterpretableMultiHead(Q,K,V)=HWH</p>
<p><img src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpo9ga%2Fbtq4NGYlhzc%2FjjzW7zJ6E2cP34RHYvWJiK%2Fimg.png" alt="img"></p>
<p>각 Head는 다른 시간 Pattern을 학습하고 이들이 입력으로 단순히 Ensemble 된 것이라고 생각할 수 있습니다. A(Q,K)와 비교하였을 때 증가된 Representation Capacity를 제공함은 물론, 하나의 Attention Weight Output을 제공함을 통해 <strong>Interpretability를 확보</strong>하였습니다.</p>
<h2 id="45-temporal-fusion-decoder">4.5 Temporal Fusion Decoder</h2>
<p>Temporal Fusion Decoder는 데이터셋에 존재하는 시간 간의 관계에 대해서 학습합니다.</p>
<h3 id="451-locality-enhancement-with-seq2seq-layer">4.5.1 Locality Enhancement with seq2seq layer</h3>
<p>시계열 데이터에서는 주위 값들 사이의 연관성을 통해 중요도가 결정되곤 합니다. Anomalies, Change-point,  Cyclical Pattern 등과 같은 Local Context를 끌어올리는 것은 따라서 Attention 기반 모델에서 성능  향상을 가능하게 합니다.</p>
<p>예를 들어 1개의 Conv 층을 이용하여 모든 시간대에 대하여 동일한 filter를 사용하고, 지역적 패턴을 추출하여  Locality를 추출할 수 있으나 Observed Data가 있는 경우에는 과거와 미래의 입력 숫자가 다르기 때문에 적합하지  않습니다. 이 차이를 해결하기 위해서 tk t를 인코더에 넣어 Context Vector를 생성하고 t+1 t+tmax를 디코더에 넣어줍니다.</p>
<p>TFT에서는 LSTM <strong>인코더와 디코더</strong>를 사용하였으며, 다른 모델 역시 사용할 수는 있습니다.  이와 같은 인코더 디코더는 Positional 인코딩을 대신하는 효과도 있는데 시간 순서에 대한 적절한 Inductive  Bias를 제공해주기 때문입니다. 추가적으로 Static Meta Data를 활용하기 위해 cc와 ch와 같은 context vector를 사용하는데 이는 Cell State와 Hidden State의 초기값이 됩니다. 아래와 같이 수식을 표현할 수 있습니다.</p>
<p>ϕ<del>(t,n)=LayerNorm(ζt+n+GLUϕ</del>(ϕ(t,n)))</p>
<p>위의 식에서 n은 <strong>Position Index</strong>를 의미합니다.</p>
<h3 id="452-static-enrichment-layer">4.5.2 Static Enrichment Layer</h3>
<p>Static Covariates는 Temporal Dynamics에서 큰 영향을 미칠 수 있습니다. (ex 특정 유전자의  질병 발생률에의 영향) 따라서 TFT는 Static Enrichment 층을 이용하여 이러한 Static 메타 데이터의 사간  Feature를 강화합니다. 각 위치 n에 대하여 아래와 같습니다.</p>
<p>θ(t,n)=GRNθ(ϕ~(t,n),ce)</p>
<p>GRNθ는 <strong>전체 Layer에서 공유되는 Weights</strong>이며, ce는 Static Covariate Encoder를 통해 나온 Context Vector입니다.</p>
<h3 id="453-temporal-self-attention-layer">4.5.3 Temporal Self-Attention Layer</h3>
<p>Static Enrichment에 이어서 Self-Attention을 적용합니다. 모든 Static Enriched된 시계열 Feature들은 하나의 Matrix로 그룹화 됩니다. </p>
<p>Θ(t)=[θ(t,−k),…,θ(t,τ)]T</p>
<p>위와 같이 그룹화되며 이후에 <strong>Interpretable Multi-Head Attention</strong>을 모든 예측하고자 하는 Time Step에 적용합니다. 수식은 아래와 같습니다.</p>
<p>B(t)=InterpretableMultiHead(Θ(t),Θ(t),Θ(t))</p>
<p><strong>Decoder Masking</strong>이 Multi-Head Attention에 적용되는데, 각각의  Temporal Dimension이 그에 해당하는 Feature에 상응할 수 있도록하기 위함입니다. Self-Attention  Layer는 TFT가 RNN으로는 잡아내기 어려운 Long-Range Dependency에 대하여 잡아낼 수 있도록 함은 물론,  추가적인 Gating Layer를 통해 학습을 촉진시킵니다.</p>
<p>δ(t,n)=LayerNorm(θ(t,n)+GLUδ(β(t,n)))</p>
<h3 id="454-position-wise-feed-forward-layer">4.5.4 Position-Wise Feed-Forward Layer</h3>
<p>Self-Attention Layer에 추가적인 비선형 처리를 합니다. Static Enrichment Layer와 유사하게 아래와 같이 GRN을 사용합니다.</p>
<p>ψ(t,n)=GRNψ(δ(t,n))</p>
<p>전과 마찬가지로 GRNψ의 Weight는 모든 Layer에 공유되며, Gated Residual Connection을 통해 전체 Transformer Block을 모두 Skip할 수 있도록 하였습니다. </p>
<p>ψ(t,n)=LayerNorm(ϕ~(t,n)+GLUψ(ψ(t,n)))</p>
<h3 id="46-quantile-outputs">4.6 Quantile Outputs</h3>
<p>예측하고자 하는 Time Step에 대해 다양한 Percentage 범위의 Output을 제공합니다.
 <img src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0HNbA%2Fbtq4NGYmts8%2FNoLQcOHbsvRVOYOKimu7kk%2Fimg.png" alt="img"></p>
<h1 id="5-loss-function">5. Loss Function</h1>
<p>TFT는 Quantile Loss Function을 최소화하는 방향으로 학습을 진행합니다.</p>
<h1 id="6-performance-evaluation">6. Performance Evaluation</h1>
<p>(Electricity, Traffic, Retail Forecasting 실험도 있으나, TFT의 특징을 가장 잘 보여주는 <strong>Volatility 실험</strong>만 구체적으로 리뷰하였습니다.)</p>
<h3 id="1-volatility">(1) Volatility</h3>
<ul>
<li><strong>Purpose</strong> : 31가지 Daily Index 데이터를 사용, 지난 252일(Intradays)의 데이터를 통해 다음주(5 Business Day)의 Volatility에 대한 예측 진행</li>
<li><strong>Duration</strong> : 2000-01-03 ~ 2019-06-28까지 데이터 사용</li>
<li><strong>Data Split</strong> : 2016년까지의 데이터를 Train, 2016-2017년 데이터를 Validation, 2018년 이후의 데이터를 Test Set으로 사용</li>
<li><strong>Regime Detection</strong> : S&amp;P 500 Index의 Attention  Vector에 Distance Metrics를 적용하여 Significant Regime Detection 이후, 해당  Regime에서의 Attention Value 값이 높음을 통해 Interpretability 검증</li>
</ul>
<h3 id="2-features">(2) Features</h3>
<ul>
<li><p><strong>Time Index :</strong> Dates</p>
</li>
<li><p><strong>Target :</strong> log of volatility(log of 5min sub-sampled realized volatility[rv5_ss])</p>
</li>
<li><p><strong>Observed Input :</strong> open to close(daily open-to-close returns)</p>
</li>
<li><p>Time Varying Known Input</p>
<p>- days_From_Start</p>
<ul>
<li>day_of_week</li>
<li>day_of_month</li>
<li>week_of_year</li>
<li>month</li>
</ul>
</li>
<li><p><strong>Static Covairates :</strong> Region</p>
</li>
</ul>
<h3 id="3-result">(3) Result</h3>
<p><img src="https://velog.velcdn.com/images%2Fjhbale11%2Fpost%2F8f319bd0-8efa-48a4-af24-2ba07ba4fc64%2F1-s2.0-S0169207021000637-gr5.jpg" alt="img"></p>
<ul>
<li>TFT 모델의 Volatility Forecasting 과정에서 Attention Value 값을 사용하여 <strong>Regime Shift Detection</strong> 및 <strong>Interpretability</strong>를 검증하고자 하였습니다.</li>
<li>위의 그림에서 Realized Vol(파란색)은 <strong>S&amp;P 500 Index의 Volatility</strong>를, dist(빨간색)은 2001년부터 2015년까지의 기간동안 TFT모델의 <strong>Attention Pattern Vector에 Distance Metrics를 적용</strong>한 결과입니다. Distance Metrics를 계산하는 수식은 아래와 같습니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jhbale11/post/d1e503d1-57de-4882-8e4a-ff21c396852b/image.png" alt="img"></p>
<h3 id="4-analysis">(4) Analysis</h3>
<ul>
<li><strong>2008년 경제 위기</strong>에서 dist 값이 가장 높은 것 확인할 수 있었습니다.</li>
<li><strong>Low Volatility Period(t1)</strong>에서 Attention의 변화는 크지 않으며, 전반적으로 모든 t에 대한 attention value 크기가 작은 것을 확인할 수 있습니다.</li>
<li><strong>High Volatility Period(t2)</strong>에서 Attention의 변화가 매우 크며, 2008년 financial crisis에 대해서 attention value가 높음을 확인할 수 있습니다.</li>
</ul>
<h1 id="7-conclusion">7. Conclusion</h1>
<ul>
<li>Time Series Forecasting에서 <strong>SOTA 알고리즘</strong>입니다.</li>
<li><strong>Time Varying Known Input</strong>을 <strong>Observed Input</strong>과 함께 학습시키면 예측 성능을 높일 수 있다는 개념을 제시하였습니다.</li>
<li>Static Variable 간, Encoder Variable 간, Decoder Variable 간 Feature Importance 제공하여 모델의 <strong>Interpretability 확보</strong>할 수 있다는 것이 TFT의 큰 장점입니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[PPT: Pre-trained Prompt Tuning for Few-shot Learning]]></title>
            <link>https://velog.io/@dandelion_26/PPT-Pre-trained-Prompt-Tuning-for-Few-shot-Learning</link>
            <guid>https://velog.io/@dandelion_26/PPT-Pre-trained-Prompt-Tuning-for-Few-shot-Learning</guid>
            <pubDate>Mon, 11 Dec 2023 06:23:20 GMT</pubDate>
            <description><![CDATA[<h2 id="introduction">Introduction</h2>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F1da52c36-b903-42ab-89c2-0f70c66f323d%2FUntitled.png?table=block&id=c1d3935d-663e-4ed2-b530-7f66ff9ec86d&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1820&userId=&cache=v2" alt="img"></p>
<p>사전학습된 언어 모델을 미세조정(fine-tuning; FT)하는 연구는 많은 발전을 이룩해왔고, 우수한 성능을 보여주었습니다. FT에는 크게 두가지 방법이 있는데, 첫번째로는 task-specific head가 사전학습된 모델 위에 추가되어 전체 모델을 task-specific objective에 따라 조정하는 task-oriented fine-tuning 방법이 있습니다. 두번째 방법으로는 prompt-oriented fine-tuning으로, 데이터 샘플들을 prompt token들을 포함한 시퀀스로 변환하고, downstream task를 사전학습 objective와 유사하게 학습합니다.</p>
<p>하지만, 각 downstream task마다 모델을 fine-tuning하고 저장하는 것은 많은 연산과 비용이 필요합니다. 따라서, 최근 제안된 prompt tuning(PT)는 전체 파라미터를 freeze한 후 soft prompt라고 하는 연속적인 embedding만을 학습합니다. PT는 soft prompt를 end-to-end로 학습할 수 있다는 장점과, downstream data가 충분하다면 FT성능과 유사한 성능을 가집니다. 하지만, 데이터가 적은 few-shot setting에서는 PT성능이 FT성능보다 크게 떨어집니다.</p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F00106ea2-7abc-44ea-92c0-ae87d671e9f6%2FUntitled.png?table=block&id=a98cee8c-d60d-462f-b505-060fc01c3376&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=770&userId=&cache=v2" alt="img" style="zoom: 50%;" />

<p>따라서 이 논문에서는 few-shot setting에서 사전학습된 언어 모델을 효율적, 효과적으로 prompt tuning하는 방법에 대해 탐구합니다. 특히, soft prompt을 unlabeled large corpora를 이용하여 사전학습시켜 PT를 위한 좋은 intialization을 만드는 framework인 PPT : Pre-trained Prompt Tuning framework를 제안했습니다.</p>
<h2 id="pilot-experiment">Pilot Experiment</h2>
<p>먼저 few-shot learning을 위한 PT의 pilot experiment를 진행했습니다. hybrid prompt tuning, verbalizer selection, real word initialization, 이 세가지 방법을 비교했습니다. T5-XXL 모델, 100개의 prompt token을 이용하여 실험을 진행했습니다.</p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fa1b4de31-3e8b-4ab1-91f9-e976b978390a%2FUntitled.png?table=block&id=444bd72a-0eb9-49f1-a6c1-c4576d431949&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=860&userId=&cache=v2" alt="img" style="zoom:50%;" />

<p>기존의 Hybrid prompt tuning은 hard와 soft prompt를 둘다 사용하고, soft prompt를 전체 모델과 함께 조정하는 방법입니다. 저자들이 실험에서 3개의 사람이 만든 hard prompt와 2개의 자동으로 생성된 hard prompt를 사용하고 soft prompt만 학습시켜 감성분석 task를 수행한 결과, hard prompt를 사용한 PT는 사용하지 않은 PT의 성능을 높이지만, FT보다는 성능이 낮은 것을 확인했습니다.</p>
<p>Verbalizer selection을 다양하게 하여 실험해본 결과, verbalizer에 따라 성능이 크게 변화하는 것을 확인했습니다. label과 대응하는 가장 흔한 단어들을 사용했을 때의 성능이 전체적으로 가장 좋았습니다.</p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fbb85f21a-3618-47b3-bbfc-6a81c340d1c1%2FUntitled.png?table=block&id=7fcdfcc2-9eb2-4f36-8dfe-111315528420&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=770&userId=&cache=v2" alt="img" style="zoom:50%;" />

<p>저자들은 실제 단어의 embedding을 soft prompt를 초기화하는데 사용했습니다. 이전 연구들에서 3B보다 작은 모델들에서 이 방법이 잘 작동한다는 것을 밝혀냈으나, 이 실험을 통해 11B 모델을 사용한 SST-2와 BoolQ 태스크(few-shot)에서는 real word initialization이 오히려 성능을 해치는 것을 보였습니다.</p>
<p>파일럿 실험을 통해서 저자들은 PT성능에 영향을 끼치는 중요한 요인들이 존재함을 확인할수 있었습니다.</p>
<h2 id="pre-trained-prompt-tuning-ppt">Pre-trained Prompt Tuning (PPT)</h2>
<h3 id="overview">Overview</h3>
<p>저자들은 few-shot 시나리오에서 효과적인 soft prompt를 학습하기 힘들다는 것을 보였습니다. soft prompt의 parameter initialization은 학습에 큰 영향을 끼치며, 기존 initialization 방식은 큰 언어모델의 성능에 미미한 향상 또는 큰 하락을 보여주었습니다.</p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F9e421d69-eae6-49c5-82b1-fef5a01aef2c%2FUntitled.png?table=block&id=4842d7aa-b73c-444a-b43b-c4d18b5e9ac1&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=960&userId=&cache=v2" alt="img" style="zoom:50%;" />

<p>반면 저자들은 soft prompt를 사전학습하여 좋은 intialization을 만드는 방법을 제안했습니다. 이는 몇몇 downstream task가 unlabeled pre-training corpora에서 사용된 self-supervised task와 관련이 있다는 것에 착안하였습니다.</p>
<h3 id="desigining-pattern-verablizer-pairs-for-pre-training">Desigining Pattern-Verablizer Pairs for Pre-training</h3>
<p>분류 태스크는 pattern mapping $f$, verbalizer $v$를 이용하여 pattern-verbalizer pair $PVP_i^{pre}=(f_i^{pre}, v_i^{pre})$로 나타낼 수 있습니다.</p>
<ul>
<li><p>sentence-pair classification</p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F0bc13ad6-a155-4d86-a8e7-e2b0a1489fbe%2FUntitled.png?table=block&id=b9572ab7-f01d-4b8a-8f26-f62af0e4d7ea&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=480&userId=&cache=v2" alt="img" style="zoom:50%;" />
</li>
<li><p>multiple-choice classification</p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F652bbd38-499c-4c2a-8e42-6933b37ec24c%2FUntitled.png?table=block&id=196e543e-132b-4018-9612-662ae118c36b&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=770&userId=&cache=v2" alt="img" style="zoom:50%;" />
</li>
<li><p>single-sentence classification</p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F0a5e8cc9-9f61-4497-af18-cc5fa7a871d8%2FUntitled.png?table=block&id=06d7d543-3c16-433b-9a82-1770416cb837&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=670&userId=&cache=v2" alt="img" style="zoom:50%;" />

<p>하지만, 이 방법은 다른 도메인의 다른 label개수가 있는 single-sentence classification으로 일반화될 수 없는 방법입니다.</p>
</li>
</ul>
<h3 id="unifying-task-formats">Unifying Task Formats</h3>
<p>앞에서 제안되었던 PVP들은 multiple-choice classification 포맷 하나로 통일될 수 있습니다.</p>
<p>downstream task마다 option개수와 길이가 다르므로, 개수가 2에서 16^2개, 길이가 50에서 20개로 다양한 pre-training sample을 포함하였습니다.</p>
<h2 id="experiments">Experiments</h2>
<h3 id="setup">Setup</h3>
<p>저자들은 영어와 중국어 task에 대해서 실험을 진행했는데, prompt pre-training시 영어의 경우 OpenWebText를 사용했으며, 중국어의 경우 WuDaoCorpora를 사용했습니다.</p>
<p>PT에서 영어 모델은 11B T5-XXL모델을 사용했으며, single-sentence classification에서는 RoBERTa-base를 사용했습니다. 중국어 모델은 11B CPM-2를 사용했습니다.</p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fa6397653-6a58-4dbf-ae3d-3258db52fc36%2FUntitled.png?table=block&id=ab383d90-eec9-48a2-926d-64a30a9a9853&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=860&userId=&cache=v2" alt="img" style="zoom:50%;" />

<p>downstream task에 대한 셋업은 위와 같습니다.</p>
<h3 id="main-results">Main Results</h3>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fcad05e82-724e-4007-ba12-0bb6220c5437%2FUntitled.png?table=block&id=d372251a-6cf0-48b9-82c9-f5d6fa2da6d2&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1730&userId=&cache=v2" alt="img" style="zoom:50%;" />

<p>FT성능은 다양한 사이즈의 모델의 결과를 기재했습니다.</p>
<p>위 결과에서 네개의 observation가 나타났습니다.</p>
<ul>
<li>모델 사이즈를 키울수록 few-shot setting 성능에 도움이 됩니다.</li>
<li>PPT가 Vanilla PT와 LM adaptation의 성능을 대부분의 데이터에서 능가합니다.</li>
<li>PPT는 FT의 성능을 모든 중국어 데이터셋, 대부분의 영어 데이터셋에서 능가합니다.</li>
<li>PPT는 대부분의 데이터셋에서 작은 편차를 가집니다.</li>
</ul>
<p>모든 포맷을 multiple choice classification포맷으로 통일하는 unified PPT는 PPT와 hybrid PPT와 비교할만한 수준의 성능을 달성했습니다. 하지만, 위의 표에서 고려된 데이터셋은 최대 5개의 label을 가진 데이터이므로, 추가적인 실험을 진행했습니다.</p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb47d4ac7-c78c-4a56-9abc-02202be3a230%2FUntitled.png?table=block&id=5f0b9b43-9e5b-4bac-9a23-842a84e58b52&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=580&userId=&cache=v2" alt="img" style="zoom:50%;" />

<p>더 많은 label 옵션을 가진 데이터셋에서 unified PPT가 가장 높은 성능을 내고, FT를 크게 향상시키는 것을 확인할 수 있습니다.</p>
<h3 id="sample-efficiency">Sample Efficiency</h3>
<p>학습데이터가 증가할수록 FT, PT, PPT의 성능의 변화를 분석했습니다.</p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb82f4fab-d921-4767-802a-b62539f17030%2FUntitled.png?table=block&id=9758715f-4ea0-4589-9587-acf9323bd170&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1060&userId=&cache=v2" alt="img" style="zoom:50%;" />

<p>CB, RACE-m데이터에서 비슷한 경향을 보이는 것을 확인했습니다. 적은 데이터 샘플에 대해서는 PPT가 PT보다 일관적으로 좋은 성능을 보이고, 샘플 개수가 어느정도 커지면 세 방법이 모두 비슷한 성능으로 수렴합니다.</p>
<p>전체 데이터가 주어졌을때의 FT, PT, PPT, unified PPT의 성능 비교도 해보았습니다.</p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F34033d5e-c6b0-403d-80a1-4e00d26ecde2%2FUntitled.png?table=block&id=59f5ce92-f832-40c7-ba91-53cd50ad4601&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1060&userId=&cache=v2" alt="img" style="zoom:50%;" />

<p>PPT와 unified PPT가 PT보다 대부분의 데이터셋에서 좋은 성능을 얻은 것을 볼 수 있습니다.</p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F97717eab-b970-4bc7-a8af-0d18fc740351%2FUntitled.png?table=block&id=9c78ae5d-2b36-43af-ae2d-3b52fa023b38&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1060&userId=&cache=v2" alt="img" style="zoom:50%;" />

<p>PT는 FT보다 한 최적화 step에서 훨씬 빠르지만, 수렴속도가 느려 더 많은 학습시간이 필요합니다. 그런 점에 있어서 PPT는 PT보다 학습시간 측면에서도 효율적입니다.</p>
<h2 id="conclusion">Conclusion</h2>
<p>이 논문에서는 few-shot setting에서 prompt tuning을 향상시킨 framework를 제안했습니다. 또한 task마다 다른 format을 하나의 format으로 통일하는 방법을 처음으로 제안했습니다. prompt를 사전학습시키는 self-supervised pre-training task를 디자인했고, pre-trained initialization을 기반으로 prompt tuning하였습니다. 해당 연구는 few-shot 시나리오에서 기존의 baseline보다 큰 성능향상을 이뤘고, 미래의 연구에 중요한 방향을 제시하였습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Language Models are Few-Shot Learners]]></title>
            <link>https://velog.io/@dandelion_26/Language-Models-are-Few-Shot-Learners</link>
            <guid>https://velog.io/@dandelion_26/Language-Models-are-Few-Shot-Learners</guid>
            <pubDate>Mon, 11 Dec 2023 06:22:46 GMT</pubDate>
            <description><![CDATA[<p><a href="https://proceedings.neurips.cc/paper/2020/file/1457c0d6bfcb4967418bfb8ac142f64a-Paper.pdf">https://proceedings.neurips.cc/paper/2020/file/1457c0d6bfcb4967418bfb8ac142f64a-Paper.pdf</a></p>
<h1 id="핵심-요약">핵심 요약</h1>
<ul>
<li>대규모 텍스트 코퍼스에서 사전 학습된 GPT-3 언어 모델을 사용하여, Few-shot 학습을 통해 NLP 작업에 대한 성능을 향상 시키는 것이 가능하다는 것을 보여줍니다.</li>
<li>GPT-3는 이전의 상태 최대의 세부 조정 방식과 경쟁할 만큼 강력한 성능을 보이며, 인간이 몇 가지 예제나 간단한 지시로 수행할 수 있는 언어 작업도 수행할 수 있습니다.</li>
<li>그러나 GPT-3의 Few-shot 학습이 여전히 어려운 데이터 세트도 있으며, 대규모의 웹 코퍼스 학습과 관련된 방법론적 문제도 있습니다.</li>
<li>GPT-3는 인간이 작성한 기사와 거의 구분할 수 없는 뉴스 기사 샘플을 생성할 수 있습니다.</li>
</ul>
<h1 id="1-introduction">1. Introduction</h1>
<ul>
<li>최근 NLP 시스템에서는 사전 학습 된 언어 표현을 사용하는 추세이며, task-specific한 모델 구조 대신 task-agnostic한 방식으로 적용되고 있습니다.</li>
<li>이러한 방식은 독해, 질의 응답, textual entailment, 등의 어려운 NLP task에서 발전을 이루고 있습니다.</li>
<li>하지만 이런 방식의 한계는 여전히 task-specific한 데이터 셋과 미세조정(fine-tuning) 과정이 필요하다는 것입니다. 따라서 이러한 한계를 극복하는 것은 매우 중요합니다.<ul>
<li>언어 모델의 활용성을 제한하는 것은 새 task마다 레이블링이 전부 되어 있는 큰  규모의 데이터 셋을 필요로 한다는 것이고 이를 구하는 것은 쉽지 않습니다.</li>
<li>학습 데이터에 존재하는 거짓 상관 관계를 활용할 수 있는 가능성이 모델의 표현력과 학습 분포의 협소함에 따라 크게 증가합니다. 따라서, 사전 학습-미세조정 패러다임은 일반화에 한계가 있습니다.</li>
<li>인간은 대부분의 언어 task를 배우기 위해 학습을 위한 대규모 데이터 셋이 필요하지 않고, 적은 수의 지시문이나 예시로도 새로운 task를 수행할 수 있습니다. 이러한 적응 능력은 NLP 시스템에서도 중요하며, 유동적이고 일반성을 갖도록 발전해야 합니다.</li>
</ul>
</li>
<li>이러한 문제들을 다루는 가능성 있는 방법은 meta-learning입니다. meta-learning은 언어 모델의 컨텍스트에서 모델이 학습하는 동안 여러 기술과 패턴 인식 능력을 키우고, 추론 시간에는 이를 원하는 task에 빠르게 적용 시키거나 인식 시키는 방법입니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb106aeeb-9957-4ae8-bb12-7d4e656a264c%2FUntitled.png?table=block&id=1e8279a6-1afe-44d8-898c-7d9394b7f7b3&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1650&userId=&cache=v2" alt="img"></p>
<p>그림 1 : 언어 모델 메타 학습</p>
<ul>
<li>언어 모델은 Unsupervised learning을 하는 동안 내부 반복 과정을 통해 기술과 패턴 인식 능력을 키우고, in-context learning을 통해 각 sequence 내에서 여러 하위 작업을 수행합니다.</li>
<li>최근 연구에서는 task specification을 사용하여 모델이 자연어 지시문과 task 설명에 따라 다음에 무엇이 올 것인지를 예측합니다.</li>
<li>하지만 이 방법은 여전히 미세조정에 비해 성능이 떨어지는 문제가 있습니다.</li>
<li>언어 모델의 크기가 증가함에 따라 텍스트 합성과 downstream NLP task에서 상당한 성능 개선이 있었으며, 이는 모델의  in-context learning 능력과 관련이 있다고 볼 수 있습니다. 따라서 in-context learning 능력은 모델의 scale이 증가함에 따라 증가할 것으로 기대됩니다.</li>
<li>논문에서는 1750억 개의 parameter를 가진 자기 회귀 언어 모델(GPT-3)을 사용하여 학습 셋에 포함되어 있지 않은 다양한 자연어처리 데이터 셋에 대해 평가하고, 모델이 few-shot learning, one-shot learning, zero-shot learning 조건에서 얼마나 잘 적응하는지를 측정합니다.</li>
<li>이를 통해 GPT-3의 in-context learning 능력을 평가합니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fa7ea2403-9e4f-4e73-8705-6b853e20436b%2FUntitled.png?table=block&id=ad18dee8-a217-45d8-a8ee-bfc6cd1449bd&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1670&userId=&cache=v2" alt="img"></p>
<p>그림 2 : 모델 크기에 따른 정확도</p>
<ul>
<li>그림 2는 few-shot learning 조건에서 모델의 성능이 문맥 내 예시의 수(K)와 모델 크기와 관련하여 어떻게 변화하는지 보여줍니다 .GPT-3는 zero-shot과 one-shot 조건에서 매우 우수한 성능을 보이며, few-shot 조건에서도 SOTA와 비슷하거나 더 나은 결과를 보입니다.</li>
<li>예를 들어, CoQA task에서 zero-shot에서는 81.5 F1을, few-shot에서는 85.0 F1을 달성하였습니다. TriviaQA task에서도 비슷한 경향을 보입니다.</li>
<li>GPT-3은 단어해독, 연산, 추론, 빠른 적응력 등 다양한 task에서 one-shot과 few-shot에서 우수한 성능을 보여주고, few-shot에서는 사람이 쓴 것과 구분하기 어려운 기사를 생성할 수 있다는 것을 보여줍니다.</li>
<li>하지만 ANLI, RACE, QuAC 등의 일부 task에서는 한계가 있어서, 이를 개선하기 위한 연구의 필요성을 제기하고 있습니다. 또한, 모델 크기, 문맥 내 예시의 수와 관련한 일반적인 경향성이 있어 큰 모델일수록 더 좋은 결과를 보여준다는 것도 밝혀졌습니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Ffe52f640-e48d-4021-932f-6c387f4925dd%2FUntitled.png?table=block&id=263c5791-0f87-4f35-85e2-56dae5420aea&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1400&userId=&cache=v2" alt="img"></p>
<p>그림 3 : 42개의 정확도로 표시된 모든 벤치마크의 총 성능</p>
<ul>
<li>논문에서는 GPT-3 모델의 성능과 관련된 여러 가지 요소들에 대해 연구되었습니다.</li>
<li>이 중에서는 데이터 오염(학습 데이터 셋과 테스트 데이터 셋이 겹치는 문제)에 대한 연구도 있었습니다.</li>
<li>또한, 작은 모델에서 부터 큰 모델까지 다양한 크기의 모델을 사용하여 zero, one, few-shot에서 GPT-3의 성능을 비교하였습니다. 성능은 모델 크기에 따라 증가하며, 이는 더 큰 모델은 더 능숙한 mera-learner임을 나타냅니다.</li>
</ul>
<h1 id="2-approach">2. Approach</h1>
<ul>
<li>논문에서는 GPT-2 모델의 기본 접근 방식과 유사하지만 모델의 크기, 데이터 셋의 크기와 다양성, 학습량을 대폭 늘렸습니다. 또한 in-context learning을 위해 새로운 체계적인 방법을 제안하였습니다.</li>
<li>이를 평가하기 위해 다양한 설정을 정의하고 대조하였는데, 이 설정은 task-specific한 데이터에 얼마나 의존하는지를 보는 것이 목적입니다. 이러한 설정은 총 4가지로 나눌 수 있습니다.<ul>
<li>Fine-Tuning (FT)<ul>
<li>사전학습된 모델의 가중치를 supervised learning 데이터 셋으로 학습시켜 원하는 task에 맞도록 업데이트하는 접근법입니다.</li>
<li>FT의 주요 장점은 많은 벤치마크에서 강력한 성능을 보인다는 것입니다. 주요 단점으로는 각 task마다 새로운 대규모 데이터 셋이 필요하고, 일반화 불가능성, 과도한 학습 등이 있습니다.</li>
<li>GPT-3는 task-agnostic 성능에 초점을 맞추어 FT를 사용하지 않았지만, 원칙적으로 FT가 가능하며 이는 미래의 연구 방향으로 유망합니다.</li>
</ul>
</li>
<li>Few-Shot (FS)<ul>
<li>모델이 가중치 업데이트를 허용하지 않으면서 추론 시간에 task에 대한 몇 가지 데모를 conditioning으로 제공 받는 설정을 말합니다.</li>
<li>일반적인 데이터 셋의 경우, few-shot은 context와 completion(예: 영어 문장과 프랑스어 번역)으로 구성된 예시에서 K개의 context와 completion 예시를 제공하고, 마지막 예시에서 모델이 completion을 제공해야 합니다.</li>
<li>장점은 task-specific 데이터의 필요성이 크게 줄어들고, 크고 좁은 fine-tuning 데이터 셋에서 지나치게 좁은 분포를 학습할 가능성이 줄어든다는 것입니다. 단점은 이 방법으로 얻은 결과 가 지금까지 최첨단의 fine-tuned 모델보다 훨씬 나쁘다는 것입니다. 또한, 소량의 task-specific 데이터가 여전히 필요합니다.</li>
</ul>
</li>
<li>One-Shot(1S)<ul>
<li>few-shot과 유사하지만, 하나의 데모만 허용되며, 자연어로 된 태스크 설명이 추가됩니다. 1S는 일부 태스크가 인간에게 전달되는 방식과 가장 일치하기 때문에 few-shot과 구분합니다.</li>
</ul>
</li>
<li>Zero-Shot<ul>
<li>학습은 One-Shot과 유사하지만 시연 없이 모델에게 작업을 설명하는 자연어 지침만 주어진다는 차이점이 있습니다. 이 방법은 최대한의 편의성과 견고성, 가능성을 제공하지만 가장 어려운 설정 중 하나이며, 일부 경우 없이 task 형식을 이해하는 데 어려움을 겪을 수 있습니다.</li>
<li>이러한 설정은 일부 경우 인간이 작업을 수행하는 방식과 가장 유사합니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fc189041d-b6e3-42ad-a304-fa11191ff03e%2FUntitled.png?table=block&id=b7a53962-73f5-433d-9322-6d14a737485e&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1510&userId=&cache=v2" alt="img"></p>
<p>그림 4 : 기존의 미세 조정과 대조되는 Zero-shot, one-shot 및 few-shot</p>
<ul>
<li>그림4는 4가지 번역 방법(Zero, One, Few-shot, Fine-tuned)을 비교하기 위해 제시되었으며, 이 논문은 zero-shot, one-shot, few-shot에 초점을 맞추고 있지만 경쟁 상대로 보는 것이 아닌 비교 상대로 보기 위해 사용됩니다.</li>
<li>목표는 다른 문제 세팅에서 효율적인 성능과 적은 샘플로도 효과적인 결과를 얻기 위한 균형을 찾는 것입니다. 최종 목표는 인간과 유사한 one-shot 또는 zero-shot에서의 성능을 개선하는 것입니다.</li>
</ul>
<h2 id="21-model-and-architectures">2.1 Model and Architectures</h2>
<ul>
<li>이 논문은 GPT-2와 동일한 구조를 가지지만, Sparse Transformer와 비슷한 방식으로 dense/sparse한 locally banded attention pattern을 번갈아 사용하는 모델을 소개합니다.</li>
<li>8가지 다른 크기의 모델을 학습시키고 가장 큰 것을 GPT-3라 부르며, 이를 통해 모델 크기와 기계 학습 성능의 관계를 분석하고 downstream 언어 과제를 해결하는 데에 유용하게 사용할 수 있다는 것을 보입니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F42376cbc-5e9b-4494-bfd0-527da204286a%2FUntitled.png?table=block&id=80398463-056e-4ce6-816c-20fae60348fa&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1770&userId=&cache=v2" alt="img"></p>
<p>테이블 1 : 학습한 모델의 크기, 아키텍처 및 학습 하이퍼 매개변수(토큰의 배치 크기 및 learning rate)</p>
<ul>
<li>테이블 1은 8가지 모델의 크기와 구조를 보여줍니다. $n_{params}$는 학습 가능한 parameter의 전체 개수, $n_{layers}$는 레이어 수, $d_{model}$은 각 bottleneck 레이어 안에 있는 unit의 수(이 논문에서는 항상 $d_{ff}=4×d_{model}$), $d_{head}$는 각 attention head의 차원입니다. 모든 모델은 $n_{ctx}$=2048 토큰을 가집니다.</li>
</ul>
<h2 id="22-training-dataset">2.2 Training Dataset</h2>
<ul>
<li>논문에서는 거의 1조 개의 단어로 구성된 Common Crawl 데이터 셋을 사용하여 언어 모델을 학습 시켰습니다. 하지만 Common Crawl 데이터 셋은 품질이 낮은 경우가 많기 때문에 고품질 출처와 연관성이 있는 데이터만을 받아 정제하고, 중복 제거 작업을 수행하며, 고품질 출처로 알려진 말뭉치를 추가하여 다양성을 증가 시켰습니다.</li>
<li>추가 데이터 셋으로는 WebText, Books1와 Books2, 영어 위키피디아가 사용되었습니다. 이러한 데이터 전처리 과정은 온전성을 보존하면서 과적합을 정확히 측정하기 위해 수행되었습니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F33417aec-6f3a-4bf8-965b-a5a9e60a4281%2FUntitled.png?table=block&id=349d00a3-b9ed-4aa8-b896-d665adf42532&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1380&userId=&cache=v2" alt="img"></p>
<p>테이블 2 : GPT-3 학습에 사용되는 데이터 세트</p>
<ul>
<li>테이블 2는 GPT-3 모델의 혼합된 데이터셋 구성을 보여주고 있습니다. 각각의 데이터셋은 다른 크기와 품질을 갖고 있습니다.</li>
<li>학습에서는 고품질 데이터 셋이 많이 선택되었으며, 데이터 셋의 크기와는 비례하지 않는 사용이 이루어졌습니다. 이를 통해 고품질과 과적합 사이에서 trade-off를 조절하였습니다.</li>
</ul>
<h2 id="23-training-process">2.3 Training Process</h2>
<ul>
<li>논문에서는 학습하는 동안 gradient noise scale을 측정하여 batch size를 선택하는 기준으로 사용하였습니다.</li>
<li>큰 모델일수록 더 큰 batch를 사용하되, learning rate는 더 작게 설정하였으며, 메모리 부족 없이 더 큰 모델을 학습 시키기 위해, 모델 병렬화와 네트워크의 레이어에서 모델 병렬화를 섞어 사용하였습니다.</li>
<li>모든 모델은 고대역 클러스터의 일부분으로 V100 GPU에서 학습되었다.</li>
</ul>
<h2 id="24-evaluation">2.4 Evaluation</h2>
<ul>
<li>Few-shot learning에서는 각 evaluation 예제마다 training set에서 K개의 샘플을 뽑아 평가하며, 이 때 K는 모델의 context window에 따라 0~$∞$가 될 수 있습니다.</li>
<li>LAMBADA와 StoryCloze에서는 supervised learning set이 없으므로 train-eval 대신 dev-test set을 사용하였고, Original Winograd는 set이 하나뿐이므로 같은 곳에서 뽑았습니다. 보통 10~ 100개의 샘플에 맞춰서 K를 선택하며, 큰 K가 항상 좋지는 않기 때문에 분리된 dev/test set이 있다면 적은 K를 dev set에 사용하여 최고의 값을 test set에서 사용합니다.</li>
<li>일부에서는 demonstration에 더해 자연어 지시(prompt)를 사용합니다. 각 모델 크기와 학습 세팅(zero, one, few-shot)에 따라 test set에서의 최종 결과가 나와 있으며, test set이 비공개인 경우 dev set으로 결과를 얻었습니다.</li>
</ul>
<h1 id="3-results">3. Results</h1>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F3f8b05e1-bbd2-44cd-8368-56a6981924bc%2FUntitled.png?table=block&id=00bab992-994d-4d49-a6e9-81c16cc74b13&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1260&userId=&cache=v2" alt="img"></p>
<p>그림 5 : 컴퓨팅을 통한 원활한 성능 확장</p>
<ul>
<li>그림 5에서는 Section 2에서 소개한 8개 모델(1750억 개 매개변수 GPT-3 및 7개 작은 모델)의 학습 곡선을 보여주며, 작은 모델 6개도 추가로 포함되어 있습니다.</li>
<li>효율적인 학습 컴퓨팅을 활용하면 언어 모델링 성능은 power-law를 따르는 것으로 관찰되었으며, cross-entropy loss의 개선이 자연어 태스크의 넓은 스펙트럼에서 일관된 성능 향상으로 이어짐을 확인할 수 있습니다.</li>
<li>9개의 범주로 그룹화 된 다양한 데이터 셋에서 8개 모델을 평가합니다.대략 로그-균등 간격으로 크기가 다른 네 개의 언어 모델을 훈련하고 벤치마크 하여 각 모델의 아키텍처와 특징을 비교하였습니다.</li>
</ul>
<h2 id="31-language-modeling-cloze-and-completion-tasks">3.1 Language Modeling, Cloze, and Completion Tasks</h2>
<ul>
<li>이 섹션에서는 GPT-3의 언어 모델링과 관련된 task, 즉 특정 단어 예측, 문장 또는 단락 완성, 텍스트 조각의 가능한 완성 중에서 선택하는 작업 등에 대한 성능을 테스트합니다.</li>
<li>Language Modeling<ul>
<li>Penn Tree Bank (PTB) 데이터 셋에서 제로샷 펄플렉서티를 측정하였습니다. PTB는 트레이닝 데이터에 포함되지 않은 데이터 셋으로, 위키피디아와 10억 단어 벤치마크는 제외되었습니다.</li>
<li>PTB에서 우리의 가장 큰 모델은 20.50의 펄플렉서티를 달성하여, 새로운 SOTA를 세웠습니다. PTB는 전통적인 언어 모델링 데이터셋으로, 원샷 또는 퓨샷 평가를 정의하는 뚜렷한 예제 구분이 없기 때문에 제로샷만 측정하였습니다.</li>
</ul>
</li>
<li>LAMBADA<ul>
<li>LAMBADA 데이터셋은 모델이 문맥을 읽는 것을 필요로하는 문장의 마지막 단어를 예측하도록 요구하며, 이는 텍스트에서 장거리 종속성 모델링을 테스트합니다.</li>
<li>제로샷 설정에서 GPT-3는 LAMBADA에서 76%의 결과를 얻으며, 이전 최고 성능 대비 8%의 향상을 이룹니다.</li>
<li>LAMBADA는 문장의 마지막 단어를 채우는 작업을 수행하므로 이를 cloze-test로 취급하여 학습시키는 few-shot learning 방법을 사용합니다.</li>
<li>다음과 같은 빈칸 채우기 형식을 사용합니다.<ul>
<li>Alice was friends with Bob. Alice went to visit her friend . → Bob</li>
<li>George bought some baseball equipment, a ball, a glove, and a . →</li>
</ul>
</li>
<li>GPT-3는  퓨샷 세팅에서 86.4%의 정확도를 달성하여 이전 최고 성능 대비 18% 이상 개선되었습니다.</li>
<li>원샷에서는 fill-in-the-blank 방식이 제로샷 세팅보다 성능이 낮으며, 이는 패턴을 인식하기 위해 여러 예제가 필요하기 때문일 수 있습니다.</li>
<li>LAMBADA 데이터 셋의 검증 집합에 오염이 있었지만, 성능에는 영향이 미미했습니다.</li>
</ul>
</li>
<li>HellaSwag<ul>
<li>HellaSwag 데이터 셋은 이야기나 지시 사항에서 최적의 끝맺음을 선택하는 것을 포함하며, 이는 인간에게는 쉽지만 언어 모델에게는 어렵게 구성되어 있습니다.</li>
<li>GPT-3는 이 데이터셋에서 78.1%의 정확도를 달성하여 이전의 언어 모델 대비 우수한 성능을 보였지만, 최적화된 멀티태스크 모델 ALUM 모델의 85.6%에는 미치지 못했습니다.</li>
</ul>
</li>
<li>StoryCloze<ul>
<li>GPT-3 모델이 다섯 문장으로 이루어진 이야기의 올바른 끝맺음을 선택하는 StoryCloze 2016 데이터 셋에서 평가하였습니다.</li>
<li>제로샷에서 83.2%의 정확도를 달성하였고, 퓨샷에서는 87.7%의 정확도를 달성하였습니다. 이전 제로샷 결과 대비 10% 정도 향상되었지만, 최적화된 BERT 모델보다는 여전히 4.1% 낮은 성능을 보입니다.</li>
</ul>
</li>
</ul>
<h2 id="32-closed-book-question-answering">3.2 Closed Book Question Answering</h2>
<ul>
<li>여기서는 GPT-3이 광범위한 사실 지식에 대한 질문에 대한 성능을 평가하는 것에 대해 설명합니다.</li>
<li>정보 검색 시스템을 사용하여 오픈북 또는 closed-book에서 GPT-3을 평가하였으며, 자연스러운 질문, WebQuestions, TriviaQA 데이터 세트에서 성능을 측정하였습니다.</li>
<li>GPT-3는 TriviaQ을 사용 했을 때, 제로샷에서 64.3%, 원샷에서 68.0%, 퓨샷에서 71.2%의 성능을 보여주었습니다. 이는 T5-11B 모델보다 우수한 결과를 보입니다.</li>
<li>WebQuestions 데이터 셋을 사용했을 때, GPT3는 제로샷에서 14.4%, 원샷에서 25.3%, 퓨샷에서 41.5%의 성능을 보였습니다. 이는 미세 조정된 T5-11B에서 37.4%, Q&amp;A 관련 사전 학습 절차를 사용하는 미세 조정된 T5-11B+SSM에서 44.7%와 비교해 볼만 합니다.</li>
<li>Natural Questions에서도 GPT-3는 제로샷에서 14.6%, 원샷에서 23.0%, 퓨샷에서 29.9%의 성능을 보여, 미세 조정된 T5-11B+SSM의 36.6%와 비교됩니다.</li>
<li>GPT-3의 원샷 성능은 하나의 데이터 셋에서 오픈 도메인 미세 조정 SOTA와 일치하며, 다른 두 데이터 셋에서는 closed-book SOTA의 성능에 근접합니다.</li>
<li>성능은 세 데이터 셋 모두에서 모델 크기에 따라 매우 원활하게 확장됩니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F7e2f6541-1abf-4b1c-82d9-3c72ae3a8dff%2FUntitled.png?table=block&id=171725f2-d2f4-4424-9535-7871561a3b4c&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1360&userId=&cache=v2" alt="img"></p>
<p>그림 6 : TriviaQA에서 GPT3의 성능</p>
<h2 id="33-translation">3.3 Translation</h2>
<ul>
<li>GPT-2에서는 용량 문제로 영어만 사용했지만, GPT-3에서는 크기가 훨씬 커져 다 언어 데이터 셋을 사용해 다 언어 역량을 가지게 되었습니다.</li>
<li>Common Crawl 데이터의 93%는 영어이지만 7%는 다른 언어를 포함합니다. GPT-3는 영어 이외에도 독일어와 루마니아어에 대해 학습하여 translation 능력을 향상 시켰습니다.</li>
<li>GPT-3은 다른 모델에 비해 좋지 않은 결과를 보여줄 수 있지만, 한 개의 예시에서는 성능이 향상되었으며 이전 연구와 유사한 성능을 보입니다.</li>
<li>GPT-3은 여러 언어들이 단어, 문장, 문서 단위로 자연스레 섞인 데이터를 그냥 학습하였습니다. 또한 어느 특별한 문제 만을 위해 특별 제작되지 않았습니다.</li>
<li>결과는 기존 NMT 모델에 비해 좋지 않지만, 단 한 개의 예시만이 주어지는 task에서는 7 BLEU score만큼 향상되었으며 이전 연구와 거의 근접한 성능을 보여줍니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fbe8c7381-b338-4ea6-bfa1-a8b7f1ea705c%2FUntitled.png?table=block&id=4441669b-eb32-4d78-89fa-092b639b0ec1&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1460&userId=&cache=v2" alt="img"></p>
<p>테이블 3 : Few-shot GPT-3</p>
<h2 id="34-winograd-style-tasks">3.4 Winograd-Style Tasks</h2>
<ul>
<li>Winograd 스키마 챌린지는 대명사가 문법적으로 모호하지만 의미상 인간에게 모호하지 않을 때 대명사가 참조하는 단어를 결정하는 것과 관련된 NLP의 고전적인 태스크입니다.</li>
<li>최근 미세 조정된 언어 모델은 원래 Winograd 데이터 세트에서 인간에 가까운 성능을 달성했지만 어려운 Winogrande 데이터 세트에서는 여전히 인간에 비해 성능이 낮습니다.</li>
<li>GPT-3는 제로샷, 원샷, 퓨샷에서 88.3%, 89.7%, 88.6%를 달성하여 모든 경우에 인간 성능에 몇 포인트 아래에서 강력한 결과를 달성합니다.</li>
<li>일부 훈련 데이터에서 오염된 Winograd 스키마를 찾았지만 결과에 미치는 영향은 적다는 점도 주목할 만 합니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F7438ea86-6161-4768-80e8-41fec3394d78%2FUntitled.png?table=block&id=e31f32bf-03b1-4f30-971c-901f7f83056e&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=940&userId=&cache=v2" alt="img"></p>
<p>테이블 4 : Winograd 스키마의 WSC273 버전과 Winogrande 데이터 세트에 대한 결과</p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F494a1ee7-faea-42c5-b4d2-06f7a7499025%2FUntitled.png?table=block&id=0dd4353c-9b81-4737-924b-5a6033e86f1b&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1380&userId=&cache=v2" alt="img"></p>
<p>그림 7 : 모델 용량 확장에 따른 Winogrande 데이터 세트의 제로, 원, 퓨샷의 성능</p>
<h2 id="35-common-sense-reasoning">3.5 Common Sense Reasoning</h2>
<ul>
<li>문장 완성, 독해 또는 광범위한 지식 질문 답변과 구별되는 물리적 또는 과학적 추론을 포착하려고 시도하는 세 가지 데이터 세트를 고려합니다.</li>
<li>GPT-3는 물리학적이거나 과학적 추론이 필요한 PhysicalQA (PIQA), ARC, OpenBookQA와 같은 세 가지 다른 데이터 셋에서 높은 정확도를 달성했습니다.</li>
<li>PIQA에서 GPT-3는 제로샷 81.0%, 원샷 80.5%, 퓨샷 82.8%의 정확도로 SOTA 모델인 미세 조정된 RoBERTa의  79.4% 능가했습니다.</li>
<li>ARC에서 GPT-3는 제로샷 51.4%, 원샷 53.2%, 퓨샷 51.5%의 정확도를 달성하여 SOTA 모델의 성능에 근접합니다.</li>
<li>OpenBookQA에서 GPT-3는 크게 개선되었지만 여전히 20점 이상 뒤쳐졌습니다.</li>
<li>GPT-3의 결과는 좋지만, 전반적인 최고 성능인 UnifiedQA가 달성한 성능보다 여전히 낮습니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F652959c7-296c-4194-98b4-8743375480d7%2FUntitled.png?table=block&id=aaa100cd-2a47-42c6-87ad-dc5fbf1b5c84&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1400&userId=&cache=v2" alt="img"></p>
<p>테이블 5 : 세 가지 상식적 추론 태스크에 대한 GPT-3 결과</p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F68cd6758-ee07-4f40-9cf6-6c35384a2bcb%2FUntitled.png?table=block&id=96876fc3-8c89-49ea-95fb-4e261ebeb3d2&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1490&userId=&cache=v2" alt="img"></p>
<p>그림 8 : 제로샷, 원샷, 퓨샷에서 PIQA에 대한 GPT-3의 결과</p>
<h2 id="36-reading-comprehension">3.6 Reading Comprehension</h2>
<ul>
<li>독해력 과제에 대해 GPT-3를 평가합니다. 대화 및 단일 질문에서 추상적, 객관식, 범위 기반 답변 형식을 포함하는 5개의 데이터 세트 모음을 사용하였습니다.</li>
<li>GPT-3는 이러한 다양한 응답 형식의 데이터 세트에서 성능이 크게 달랐습니다.</li>
<li>CoQA 데이터 세트에서는 인간 기준선과 거의 비슷한 성능을 보이지만 QuAC 데이터 세트에서는 ELMo 기준선보다 성능이 낮습니다.</li>
<li>DROP 데이터 세트에서는 BERT 기준선보다 뛰어난 성능을 보이지만 여전히 인간의 성능보다는 낮습니다.</li>
<li>SQuAD 2.0 데이터 세트에서는 제로샷에 비해 거의 10 F1(69.8로) 향상되는 퓨샷 학습 기능을 보여줍니다. 이를 통해 최상의 미세 조정 결과를 약간 능가할 수 있습니다.</li>
<li>RACE 데이터 세트에서는 성능이 상대적으로 약하며, 문맥 표현을 활용한 초기 작업에서만 경쟁력이 있습니다. 여전히 SOTA보다 45% 뒤떨어져 있습니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F4c2357b1-9267-4e33-ba10-00697d970474%2FUntitled.png?table=block&id=e122ce45-b1cf-45c7-8e2c-e8d09a199c54&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1380&userId=&cache=v2" alt="img"></p>
<p>그림 9 : CoQA 읽기 이해 작업에 대한 GPT-3 결과</p>
<h2 id="37-superglue">3.7 SuperGLUE</h2>
<ul>
<li>SuperBLUE 벤치마크 테스트를 통해 GPT-3의 결과를 BERT와 RoBERTa와 비교하고, few-shot에서는 32개의 예제를 사용했습니다.</li>
<li>GPT-3은 일부 데이터 셋에서 SOTA에 근접한 결과를 보였지만, WiC 데이터 셋에서는 49.4%의 성능만 보여주었습니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F4e00f0f1-d12c-47f1-9519-01096b04dde5%2FUntitled.png?table=block&id=90cf7ae8-c529-4aa3-8adb-2372a5f0323e&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1670&userId=&cache=v2" alt="img"></p>
<p>표 6 : 미세 조정된 기준선, SOTA와 비교한 SuperGLUE의 GPT-3 성능</p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F1bf61305-a53b-4bd5-9991-23c69c76a1ee%2FUntitled.png?table=block&id=d5183f35-5821-4993-9271-be4f0a1b6c60&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1920&userId=&cache=v2" alt="img"></p>
<p>그림 10 : 모델 크기와 컨텍스트 예제 수에 따른 SuperGLUE의 성능 증가</p>
<h2 id="38-nli">3.8 NLI</h2>
<ul>
<li>&#39;Natural Language Inference (NLI)은 두 문장 간의 관계를 이해하는 것을 측정합니다.</li>
<li>일반적으로 2~3개의 분류 문제로 모델은 두 번째 문장이 첫 번째 문장과 같은 논리를 따르는지, 모순되는지, 혹은 그럴지도 모를지(중립적)를 판별합니다.</li>
<li>SuperGLUE는 NLI dataset으로 이진 분류 RTE를 포함하며, GPT-3는 56%의 정확도를 기록하였으나 퓨샷에서는 single-task 미세조정 BERT Large와 비슷합니다.</li>
<li>ANLI 데이터 셋에서는 GPT-3보다 작은 모델은 전부 형편없는 결과를 보이며, 전체 결과는 그림 11에서 확인할 수 있습니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F460c4404-e471-4f43-adf4-4a30263dcbdd%2FUntitled.png?table=block&id=ba9dd4f3-11ef-46fd-beac-a98f9cb8f553&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1380&userId=&cache=v2" alt="img"></p>
<p>그림 11 : ANLI 라운드 3에서 GPT-3의 성능</p>
<h2 id="39-synthetic-and-qualitative-tasks">3.9 Synthetic and Qualitative Tasks</h2>
<ul>
<li><p>GPT-3의 퓨샷(또는 제로 및 원샷) 능력을 조사하기 위해 간단한 계산 추론, 단어 재정렬/스크램블링, SAT 스타일 유추 문제, 새 단어 사용, 영문법 수정, 뉴스 기사 생성 등의 작업을 생성하여 테스트하고자 합니다.</p>
</li>
<li><p><strong>Arithmetic</strong></p>
<ul>
<li>특정 태스크에 대한 학습 없이 간단한 산술 연산을 수행하는 GPT-3의 능력을 테스트하기 위해  GPT-3에게 자연어로 간단한 산술 문제를 묻는 10가지 테스트로 구성됩니다.</li>
<li>GPT-3는 2/3자리 계산에서 거의 100%에 가까운 정확도를 보여줬습니다. 하지만 자리수가 많아질수록 성능이 떨어지며, 2자리 곱셈에서는 29.2%, 1자리 복합 연산에서는 21.3%의 정확도를 보였습니다.</li>
<li>종합적으로는 GPT-3는 보통 수준의 복잡한 산술 연산에서 합리적인 성능을 보입니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F20025fb6-a72a-412f-ab65-edc36b13af74%2FUntitled.png?table=block&id=a4d9c6b0-b10b-4aa2-9d52-42deabcd2001&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1420&userId=&cache=v2" alt="img"></p>
<p>그림 12 : 다양한 크기의 모델의 퓨샷에 대한 10개의 모든 산술 태스크에 대한 결과</p>
</li>
<li><p><strong>Word Scrambling and Manipulation Tasks</strong></p>
<ul>
<li>GPT-3의 새로운 기호 조작(symbolic manipulation) 학습 능력을 테스트하기 위해 5개의 &quot;문자 조작&quot; 태스크를 구성합니다. 각 태스크에는 문자 뒤섞기, 추가 또는 삭제의 조합으로 왜곡된 단어를 모델에 제공하고 원래 단어를 복구하도록 요청하는 작업이 포함됩니다.</li>
<li>모델의 크기가 커질수록 성능도 조금씩 증가함을 확인하였지만 단어를 뒤집는 태스크에서는 모든 모델이 실패하였고, 원샷, 제로샷에서는 성능이 매우 떨어졌습니다.</li>
<li>여기서 “문맥 내 정보”는 큰 모델일수록 더 잘 활용한다는 것을 보였습니다. 이것은 BPE token 뿐 아니라 하부 구조를 잘 이해하고 분석하였음을 알 수 있습니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F99fc3c76-d6aa-4a0a-b40f-8e5ff8349f23%2FUntitled.png?table=block&id=43fd1c2d-6e46-4ada-9765-d3f5d40228a5&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1370&userId=&cache=v2" alt="img"></p>
<p>그림 13 : 다양한 크기의 모델에 대한 5개의 단어 스크램블링 작업에 대한 퓨샷 성능</p>
</li>
<li><p><strong>SAT Analogies</strong></p>
<ul>
<li>GPT-3는 SAT 유추 문제 세트를 포함한 다양한 태스크에서 테스트 되었습니다.</li>
<li>SAT 유추 문제에서는 대학 지원자 평균 점수보다 높은 정확도를 보여주었으며, 모델 크기가 커질수록 성능이 개선됨을 보였습니다.</li>
<li>이러한 결과는 GPT-3의 언어 이해 능력을 강조하며, 모델의 규모가 작은 태스크에서는 제한적인 성능을 보인다는 것을 시사합니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F4708fac7-1e2e-443d-9152-756a3873a2ab%2FUntitled.png?table=block&id=1f2d7d35-ea46-4b00-ae1d-b31c6028ae97&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1360&userId=&cache=v2" alt="img"></p>
<p>그림 14 : 다양한 크기의 모델에 대한 SAT 유추 태스크의 제로, 원, 퓨샷 성능.</p>
</li>
<li><p><strong>News Article Generation</strong></p>
<ul>
<li><p>생성적 언어모델인 GPT-3을 질적으로 평가하기 위해 뉴스기사의 첫 문장을 주고 이후 문장을 생성하는 방법을 사용합니다.  이를 위해 모델은 이전 3개의 뉴스기사를 학습에 포함시킵니다.</p>
</li>
<li><p>이렇게 생성된 기사를 사람들이 판별하여 기계가 쓴 것인지 사람이 쓴 것인지 구별합니다.</p>
</li>
<li><p>평가 지표는 정답률이며, 정답률이 50%에 가까워질수록 기계가 사람처럼 잘 썼다는 것을 의미합니다.</p>
</li>
<li><p>모델의 크기가 커질수록 기계와 사람의 구별이 점점 어려워진다.</p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F402e6d29-8e6a-4f7e-b947-2cefbfb1f113%2FUntitled.png?table=block&id=de590ef8-8728-4bfd-894a-1403715e5857&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1810&userId=&cache=v2" alt="img"></p>
<p>표 7 : 짧은(~200단어) 뉴스 기사가 생성된 모델인지 여부를 식별하는 사람의 정확도</p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb27e9506-f070-4247-9147-028ec3b17a79%2FUntitled.png?table=block&id=e64fb531-d2cc-47ee-9783-964377538bfb&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1880&userId=&cache=v2" alt="img"></p>
<p>그림 15 : 뉴스 기사가 모델 생성인지 여부를 식별하는 사람들의 능력</p>
</li>
</ul>
</li>
<li><p><strong>Learning and Using Novel Words</strong></p>
<ul>
<li><p>발달적 언어학에서 연구하는 한 태스크는 새로운 단어를 학습하고 사용하는 능력을 측정하는 것입니다. 이를 위해, 존재하지 않는 단어를 정의하고 이를 문장에서 사용해 보도록 합니다.</p>
</li>
<li><p>모든 정의는 사람이 직접 하였습니다. 첫 번째 답은 사람이 정의하고 나머지는 GPT-3이 정의했습니다.</p>
</li>
<li><p>실험 결과, GPT-3은 모든 경우에서 정확하거나 합리적인 수준으로 사용하였으며, 새로운 단어를 사용하는 능력이 꽤 수준이 있는 것으로 나타났습니다.</p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F0874afce-a6f4-475d-ae07-3adef0ccead5%2FUntitled.png?table=block&id=eb97716c-b697-4c87-9f7e-f8c573372002&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1890&userId=&cache=v2" alt="img"></p>
<p>그림 6 : 문장에서 새 단어를 사용하는 퓨샷의 태스크에 대한 대표적인 GPT-3 완성</p>
</li>
</ul>
</li>
<li><p><strong>Correcting English Grammar</strong></p>
<ul>
<li>영어 문법 교정은 퓨샷 학습에 적합한 또 다른 task입니다.</li>
<li>&quot;잘못된 영어 입력: &lt;문장&gt;\n 올바른 영어 출력: &lt;문장&gt;&quot; 형식의 프롬프트를 GPT-3에 제공하여 이를 퓨샷에서 테스트합니다.</li>
<li>GPT-3에 사람이 만든 교정을 하나 제공하고, 그 후 5개의 교정을 더 요청합니다.</li>
</ul>
</li>
</ul>
<h1 id="4-conclustion">4. Conclustion</h1>
<ul>
<li>제로샷, 원샷, 퓨샷에서 매우 강력한 성능을 보이는 1,750억 개의 매개변수 언어 모델을 제시하였고, 이 모델은 다양한 NLP 작업과 벤치마크에서 SOTA와 거의 일치하는 결과를 보였습니다.</li>
<li>모델은 미세 조정 없이도 예측 가능한 성능 확장 추세를 보여주며, 적응 가능한 일반 언어 시스템 개발에 중요한 요소가 될 수 있다는 가능성을 제시하였습니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Generating Text with Recurrent Neural Networks]]></title>
            <link>https://velog.io/@dandelion_26/Generating-Text-with-Recurrent-Neural-Networks</link>
            <guid>https://velog.io/@dandelion_26/Generating-Text-with-Recurrent-Neural-Networks</guid>
            <pubDate>Mon, 11 Dec 2023 06:22:18 GMT</pubDate>
            <description><![CDATA[<p><a href="https://web.archive.org/web/20211224075156id_/https://icml.cc/2011/papers/524_icmlpaper.pdf">https://web.archive.org/web/20211224075156id_/https://icml.cc/2011/papers/524_icmlpaper.pdf</a></p>
<h1 id="핵심-요약">핵심 요약</h1>
<ul>
<li>이 논문에서는 LSTM 기반 모델을 사용하여 단어 수준 언어 모델링 문제를 다루며, 순환 정규화와 최적화 전략에 대해 연구합니다.</li>
<li>&quot;weight-dropped LSTM&quot;을 제안하여 숨겨진 상태 간 가중치에 DropConnect를 적용하여 정규화를 수행합니다.</li>
<li>또한 &quot;NT-ASGD&quot;라는 평균 확률적 경사법의 변형을 도입하여 평균화 트리거를 자동으로 결정합니다.</li>
<li>이러한 정규화 전략을 사용하여 Penn Treebank와 WikiText-2에서 최첨단 단어 수준 퍼플렉서티를 달성합니다.</li>
</ul>
<h1 id="1-introduction">1. Introduction</h1>
<ul>
<li>논문은 LSTM 기반의 단어 수준 언어 모델링에 대한 효과적인 정규화 기법들을 연구합니다.</li>
<li>기존의 dropout과 batch normalization을 RNN에 적용하는 것은 잘 작동하지 않았지만, 이 논문에서는 hidden-to-hidden recurrent weights에 DropConnect 마스크를 사용하여 recurrent regularization을 제안합니다.</li>
<li>또한, NT-ASGD라는 새로운 평균 확률적 경사 하강법을 소개하며, 이는 non-monotonic 조건을 사용하여 평균화 트리거를 결정합니다.</li>
<li>이러한 정규화 전략들을 사용하여 두 데이터 셋(Penn Treebank와 WikiText-2)에서 STOTA 단어 수준 perplexities를 달성하며, 뉴럴 캐시와 함께 사용할 때 더 낮은 perplexity를 얻습니다.</li>
<li>Weight-dropped LSTM과 NT-ASGD와 같은 다양한 정규화 기법을 제안하고 이를 사용하여 두 데이터 셋에서 최상의 성능을 달성합니다.</li>
<li>또한 neural cache와 함께 사용하여 더 낮은 perplexity를 달성합니다.</li>
<li>정규화 전략은 기존 LSTM 구현에 수정이 필요 없으며 NVIDIA cuDNN과 같은 라이브러리와 호환되어 효율적인 학습이 가능합니다.</li>
<li>또한 SGD와 ASGD와 같은 최적화 방법을 비교하고, 동적인 non-monotonic 기준을 사용하는 ASGD 변형이 더 우수한 학습 결과를 보여줍니다.</li>
</ul>
<h1 id="2-weight-dropped-lstm">2. Weight-dropped LSTM</h1>
<ul>
<li>LSTM(Long Short-Term Memory) 기반 모델의 과적합 문제를 해결하기 위해 기존 방법은 드롭아웃 등이었지만, 이들은 블랙 박스 RNN 구현에 적용하기 어려웠습니다.</li>
<li>이에 제안된 방법은 DropConnect를 사용하여 순환 연결 가중치에 드롭아웃을 적용함으로써 과적합을 방지합니다.</li>
<li>DropConnect는 LSTM 구현을 변경하지 않고도 적용 가능하여, 기존 최적화된 블랙 박스 LSTM과 같은 구현에 적용할 수 있습니다.</li>
<li>이 방법은 LSTM의 순환 연결에 대한 과적합을 효과적으로 방지하는 동시에 학습 속도에 미치는 영향을 최소화합니다.</li>
</ul>
<h1 id="3-optimization">3. Optimization</h1>
<ul>
<li>SGD(Stochastic Gradient Descent)는 컴퓨터 비전, 자연어 처리, 강화 학습 등 다양한 분야에서 딥 러닝 모델을 학습하는 데 가장 인기 있는 방법 중 하나입니다.</li>
<li>딥 네트워크의 학습은 non-convex 최적화 문제로 표현할 수 있습니다.<ul>
<li>$min_w\frac{1}{N}\displaystyle\sum^N_{i=1}f_i(w)$</li>
</ul>
</li>
<li>주어진 데이터 포인트 <em>i</em>에 대한 손실 함수 $f_i$와 네트워크의 가중치 <em>w</em>, 그리고 데이터에 대한 기대값을 가정합니다.</li>
<li>주어진 학습률 시퀀스 γk에 따라 SGD는 다음과 같은 형태의 단계를 반복적으로 수행합니다.<ul>
<li>$w_{k+1} = w_k − γ_k\hat∇ f(w_k)$</li>
</ul>
</li>
<li>$\hat∇$는 미니배치 데이터 포인트에 대해 계산된 확률적 그래디언트를 나타냅니다.</li>
<li>SGD (Stochastic Gradient Descent)는 최적화 알고리즘으로, 가중치를 업데이트하여 손실 함수를 최소화하는데 사용됩니다.</li>
<li>SGD는 일반적으로 다른 알고리즘보다 빠르게 수렴하고 더 좋은 일반화 성능을 갖습니다. 따라서 neural language modeling과 같은 작업에서 효과적으로 사용됩니다.</li>
<li>이러한 이유로 논문은 평균 SGD (ASGD)를 조사하여 학습 프로세스를 개선하고자 합니다.</li>
<li>ASGD는 SGD와 유사하지만 최종 해답 대신 평균 값을 반환합니다.</li>
<li>ASGD는 딥 네트워크 학습에 많은 관심을 받고 있지만 실제로는 제한적으로 사용됩니다.</li>
<li>이는 학습률 스케줄과 평균화 트리거를 튜닝하기 어려워서 일어날 수 있습니다.</li>
<li>따라서 이 논문에서는 평균화 트리거를 자동으로 결정하는 비단조 트리거(non-monotonical trigger) 변형 ASGD(NT-ASGD)를 제안합니다.</li>
</ul>
<h1 id="4-extended-regularization-techniques">4. Extended regularization techniques</h1>
<h2 id="41-variable-length-backpropagation-sequences">4.1 Variable length backpropagation sequences</h2>
<ul>
<li>고정된 시퀀스 길이로 데이터 셋를 고정 길이 배치로 분할하면 데이터 효율성이 저하될 수 있습니다.</li>
<li>예를 들어, 100개의 요소가 주어진 경우 BPTT(Backpropagation Through Time) 윈도우가 10인 상황에서 10으로 나눌 수 있는 요소는 역전파할 데이터가 없으며, 나머지 90%의 요소는 부분적인 역전파 윈도우만 받을 수 있습니다.</li>
<li>이로 인해 데이터 효율성이 떨어지고 순환적인 개선이 어려워집니다.</li>
<li>학습 중에는 결과적인 시퀀스의 길이와 원래 지정된 시퀀스 길이를 비교하여 학습률을 재조정하며, 이는 데이터 효율성을 향상시키는 데 도움이 됩니다.</li>
<li>이러한 선형 스케일링 규칙은 큰 규모의 미니배치 SGD 학습과 절단된 시간 반복 역전파에 중요한 역할을 합니다.</li>
</ul>
<h2 id="42-variational-dropout">4.2 Variational dropout</h2>
<ul>
<li>Variational Dropout은 hidden-to-hidden transition를 규제하기 위해 드롭커넥트(DropConnect)를 사용하고, 다른 드롭아웃 연산에는 Variational Dropout을 사용하는 것을 제안합니다.</li>
<li>각 예제는 고유한 드롭아웃 마스크를 사용하여 드롭아웃의 다양성이 보장됩니다.</li>
</ul>
<h2 id="43-embedding-dropout">4.3 Embedding dropout</h2>
<ul>
<li>Gal &amp; Ghahramani(2016)의 방식을 따라서, 임베딩 드롭아웃을 사용합니다.</li>
<li>이는 단어 수준에서 임베딩 행렬에 드롭아웃을 수행하는 것으로, 드롭아웃이 모든 단어 벡터의 임베딩에 적용됩니다.</li>
<li>드롭아웃 되지 않은 단어 임베딩은 $\frac{1}{1-p_e}$로 스케일링 됩니다. $p_e$는 임베딩 드롭아웃의 확률입니다.</li>
<li>임베딩 행렬에 드롭아웃이 발생하므로 전체 전방향 및 역방향 패스에서 특정 단어의 모든 발생이 사라지며, 원-핫 인코딩과 임베딩 조회 사이의 연결에 Variational Dropout을 수행하는 것과 동등합니다.</li>
</ul>
<h2 id="44-weight-tying">4.4 Weight tying</h2>
<ul>
<li>웨이트 타잉(Weight tying)은 임베딩과 소프트맥스 레이어 사이의 가중치를 공유하는 기법으로, 총 파라미터 수를 줄이고 표준 LSTM 언어 모델의 성능을 향상 시킵니다.</li>
</ul>
<h2 id="45-independent-embedding-size-and-hidden-size">4.5 Independent embedding size and hidden size</h2>
<ul>
<li>단어 벡터의 차원을 LSTM의 은닉 상태와 일치 시키는 기존 방식과 달리, 단어 벡터의 크기를 줄여서 총 파라미터를 줄이는 방법을 사용하여 언어 모델의 과적합을 방지하고 성능을 향상 시킵니다.</li>
<li>이를 위해 첫 번째와 마지막 LSTM 레이어의 입력 및 출력 차원을 줄인 임베딩 크기와 일치 시킵니다.</li>
</ul>
<h2 id="46-activation-regularization-ar-and-temporal-activation-regularization-tar">4.6 Activation Regularization (AR) and Temporal Activation Regularization (TAR)</h2>
<ul>
<li>2-정규화는 네트워크의 가중치에 적용되어 모델의 norm을 조절하고 과적합을 감소 시키는 방법입니다.</li>
<li>또한, 개별 유닛의 활성화와 RNN의 서로 다른 시간 단계에서 출력의 차이에 L2 감쇠(decay)를 사용할 수 있으며, 이러한 전략은 각각 활성화 정규화(AR)와 시간 활성화 정규화(TAR)로 레이블되어 있습니다.</li>
<li>AR은 네트워크를 정규화 하는 방법으로 0보다 상당히 큰 활성화를 벌칙으로 부과합니다. 구체적으로, AR은 다음과 같이 정의됩니다.<ul>
<li>$α L_2(m ⊙ h_t)$</li>
</ul>
</li>
<li>TAR은 모델의 숨겨진 상태에서 큰 변화를 방지하기 위해 벌칙을 부과하는 둔감성 정규화 방법입니다.</li>
<li>이는 드롭아웃 마스크 <em>m</em>과 L2 정규화$(L2(·) = |·|_2)$를 활용하며, RNN의 출력 ht와 스케일링 계수 α를 사용하여 구현됩니다.</li>
<li>이러한 방법은 네트워크의 과적합을 줄이고 효과적인 학습을 돕습니다.</li>
<li>AR의 표기법을 사용하여 TAR은 다음과 같이 정의됩니다.<ul>
<li>$β L_2(h_t − h_{t+1})$</li>
</ul>
</li>
<li>β는 스케일링 계수입니다. AR 및 TAR 손실은 모든 레이어에 적용되는 것이 아니라 최종 RNN 레이어의 출력에만 적용됩니다.</li>
</ul>
<h1 id="5-experiment-details">5. Experiment Details</h1>
<ul>
<li>이 연구에서는 Penn Treebank (PTB)와 WikiText-2 (WT2) 데이터 셋에서 언어 모델링을 수행하여 다양한 접근 방법의 영향을 평가했습니다.</li>
<li>PTB 데이터 셋은 주로 언어 모델링 실험에 사용되는 데이터 셋으로, 전처리가 많이 되어 있으며 대문자, 숫자, 구두점이 없고 어휘 크기가 10,000개로 상대적으로 작습니다.</li>
<li>WT2 데이터 셋은 위키피디아 기사에서 가져온 것으로 PTB 데이터 셋의 약 두 배 크기이며, 어휘 크기가 30,000개 이상입니다.</li>
<li>이들 데이터 셋에서는 3층 LSTM 모델을 사용하고, 학습에는 NT-ASGD 알고리즘을 750 epoch 동안 사용했습니다. 또한 ASGD를 T = 0으로 실행하여 솔루션을 더 개선하는 세밀한 조정 단계를 추가로 수행했습니다.</li>
<li>여기서 BNN과 XNOR-Net처럼 AlexNet의 첫 번째와 마지막 레이어를 낮은 bitwidth로 양자화 하지 않았습니다.</li>
<li>실험에서는 모든 모델에 대해 최대 norm이 0.25인 gradient clipping을 적용하고, 초기 학습률은 30으로 설정했습니다.</li>
<li>또한, BPTT 길이에 대해서는 0.95의 확률로 N(70, 5), 0.05의 확률로 N(35, 5)를 사용했습니다.</li>
<li>단어 벡터, LSTM 레이어 사이의 출력, 최종 LSTM 레이어의 출력, 그리고 임베딩 dropout에 대해 각각 (0.4, 0.3, 0.4, 0.1)의 dropout 값을 사용했습니다.</li>
<li>weight-dropped LSTM에는 재귀적인 가중치 행렬에 대해 0.5의 dropout을 적용했습니다.</li>
<li>WT2 데이터 셋에 대해서는 단어 어휘 크기가 증가하므로 입력 dropout을 0.65로 증가 시켰습니다. 모든 실험에서 AR과 TAR의 값을 각각 2와 1로 설정하고, 임베딩과 소프트맥스 가중치를 공유하였습니다. 이러한 하이퍼파라미터는 시행착오를 통해 선택되었으며, 더 정교한 하이퍼파라미터 검색이 가능하다면 더 많은 개선이 가능할 것으로 기대됩니다.</li>
<li>결과에서는 이 접근법을 AWD-LSTM이라고 약칭 하였습니다.</li>
</ul>
<h1 id="6-experimental-analysis">6. Experimental Analysis</h1>
<ul>
<li>Table 1과 2에서 AWD-LSTM 모델과 다른 경쟁 모델들의 단일 모델 perplexity 결과를 제시하였습니다.</li>
<li>AWD-LSTM 모델은 PTB와 WT2 데이터 셋에서 최신 기술을 약 1 단위와 0.1 단위로 앞서는 SOTA를 기록했습니다.</li>
<li>다른 모델들과 비교하여 AWD-LSTM은 vanilla LSTM을 사용하며, 다른 모델들은 복잡한 RNN cell을 사용하는 등 더 복잡한 구조를 가지고 있습니다.</li>
<li>또한, Melis et al. (2017)의 연구와 비교하여, 우리의 연구에서는 하이퍼파라미터를 더욱 효율적으로 공유하여 더 적은 모델 파라미터를 사용하고 성능을 향상 시켰습니다.</li>
<li>우리의 연구와 Melis et al. (2017)의 접근 방식은 서로 보완적이며, 더욱 세밀한 하이퍼파라미터 탐색을 통해 추가적인 개선이 가능합니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F2102eaff-8b82-45c3-8bf9-dec87c78168c%2FUntitled.png?table=block&id=4bb1f258-7e8c-44dd-a10e-5ba13e5f496c&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1210&userId=&cache=v2" alt="Table 1: Penn Treebank 언어 모델링 작업에 대한 검증 및 테스트 셋에 대한 Single model perplexity"></p>
<p>Table 1: Penn Treebank 언어 모델링 작업에 대한 검증 및 테스트 셋에 대한 Single model perplexity</p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F35c97a29-5b55-48b3-9ba2-caa92c02b535%2FUntitled.png?table=block&id=67b55fd5-fb4e-498d-9e29-c3878d5f0f5a&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1240&userId=&cache=v2" alt="img"></p>
<p>Table 2: WikiText-2에 대한 Single model perplexity</p>
<h1 id="7-pointer-models">7. Pointer models</h1>
<ul>
<li>이전의 neural language model에 포인터 증강 기법이 효과적 인지에 대한 의문이 있었습니다.</li>
<li>Neural cache 모델을 추가로 적용하여 언어 모델의 perplexity를 개선하였으며, 특히 낮은 빈도의 단어들에 대해서 큰 도움이 되었습니다.</li>
<li>이러한 모델의 간단함과 학습 비용 부담이 적은 점이 장점이었습니다.</li>
<li>이러한 연구 결과는 기존의 neural language model이 아직도 기본적인 의존성을 잘 포착하지 못하거나 최근에 본 단어를 효과적으로 기억하지 못하는 한계를 보여주었습니다.</li>
<li>또한, 이러한 연구 결과는 neural cache 모델이 기존 복잡한 모델에 비해 간단하면서도 효과적인 것을 보여주며, 두 접근 방식은 서로 보완적일 수 있다는 점을 시사합니다.</li>
</ul>
<h1 id="8-model-ablation-analysis">8. Model Ablation Analysis</h1>
<ul>
<li><p>논문은 최상의 LSTM 모델의 다양한 변형을 검증하고 테스트하여 그 결과를 Table 3에 정리하였습니다. 이러한 변형들은 최적화나 정규화 방법을 제거한 것들입니다.</p>
<ul>
<li>SGD를 사용하여 학습률을 감소 시킨 모델은 성능 저하가 있었습니다.</li>
<li>모노토닉 기준을 사용하는 것도 성능을 저하 시켰습니다.</li>
<li>Fine-tuning 단계를 제거하는 것도 성능을 저하 시켰습니다.</li>
<li>정규화 전략을 제거하는 것도 성능을 저하 시켰습니다. 특히, hidden-to-hidden LSTM 정규화를 제거하면 성능이 크게 저하되었습니다.</li>
<li>정적 시퀀스 길이를 사용하는 것도 성능이 저하되었습니다.</li>
<li>임베딩 벡터와 은닉 상태의 크기를 일치 시키는 것도 성능이 저하되었습니다.</li>
<li>임베딩 dropout, AR/TAR 및 가중치 감쇠를 제거한 경우 모두 모델의 perplexity가 증가하였으며, 이는 모델의 부족한 정규화로 인한 것으로 추측됩니다.</li>
</ul>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F1e2568b8-9c80-4cf3-b133-5de0fb459c9b%2FUntitled.png?table=block&id=cd63480e-583a-4b59-aa26-1ccd1eeb9260&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=820&userId=&cache=v2" alt="img"></p>
<p>Table 3. Penn Treebank 및 WikiText-2에 대한 검증 및 테스트 셋에 대한 결과를 보고하는 최고의 LSTM 모델에 대한 모델 제거</p>
<h1 id="9-conclusion">9. Conclusion</h1>
</li>
<li><p>이 논문에서는 신경망 언어 모델의 정규화와 최적화 전략을 다룹니다.</p>
</li>
<li><p>논문은 가중치 드롭드(weight-dropped) LSTM을 제안하고, 평균화된 SGD와 비모노토닉 트리거를 사용하여 언어 모델의 학습에 적용함으로써 성능을 향상 시킵니다.</p>
</li>
<li><p>또한 변수 BPTT 길이와 neural cache 등의 다양한 정규화 전략을 조사하고, PTB와 WikiText-2 데이터 셋에서 새로운 최고의 perplexity를 달성합니다.</p>
</li>
<li><p>제안된 전략은 일반적으로 다른 시퀀스 학습 작업에도 적용 가능하며, 기존 방법보다 우수한 성능을 보여줍니다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Editing Factual Knowledge in Language Models]]></title>
            <link>https://velog.io/@dandelion_26/Editing-Factual-Knowledge-in-Language-Models</link>
            <guid>https://velog.io/@dandelion_26/Editing-Factual-Knowledge-in-Language-Models</guid>
            <pubDate>Mon, 11 Dec 2023 06:21:39 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/abs/2104.08164">https://arxiv.org/abs/2104.08164</a></p>
<p>언어 모델에 저장된 지식 중 일부를 수정하고 나머지 지식을 보존할 수 있는 KnowledgeEditor방법론을 제안했습니다. </p>
<h2 id="introduction">Introduction</h2>
<p>지식을 외부에 저장했던 기존의 Knowledge Bases (KBs)와는 달리, 신경망 모델이 파라미터에 지식을 저장하는 접근방법이 더 많이 사용되고 있습니다. 하지만, 이러한 방식으로 모델 내부에 저장된 지식을 수정하는 것은 매우 어렵습니다.</p>
<p>저자들은 이러한 문제를 해결하는데에 있어 세가지의 목표를 설정하였습니다.</p>
<ul>
<li>Generality (일반성) : 모델이 특별히 수정가능하도록 학습되지 않아도 수정가능한 방법이어야 합니다. 즉, 특수한 pre-training 방법을 쓸 필요가 없어야합니다.</li>
<li>Reliability (의존성) : 특정 사실을 성공적으로 업데이트할 수 있는 동시에 나머지 지식들에 영향이 가면 안됩니다.</li>
<li>Consistency (일관성) : 지식의 동등한 표현에 대해서 수정이 일관성 있어야 합니다. 즉, 한 질문에 대한 답변을 업데이트하라는 요청이 있을 때, 그 질문과 동일한 표현의 다른 문장들에 대한 답변도 그에 따라 변경되어야 함을 의미합니다.</li>
</ul>
<p>선행 연구들에서 이 세가지를 모두 만족하는 연구들은 없었습니다. 하지만 이 논문에서 제안된 방법은 기존 연구들의 한계점을 모두 극복하였습니다.</p>
<p>저자들은 모델에 저장되어있는 메모리를 수정하는 것을 “learning-to-update” (업데이트를 위한 학습)의 문제로 보았습니다. 언어 모델의 파라미터를 업데이트하기 위해 학습된 hyper-network에 효율적인 파라미터를 설정하였습니다. 또한 학습을 위해 constrained optimization을 사용하여 수정된 모델이 기존 모델과 동일한 예측을 유지할 수 있게 하였습니다.</p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F117823ee-a0ee-4855-9a90-10e795f0df32%2FUntitled.png?table=block&id=c04d98ed-6c4a-4593-8265-95092082ca19&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=960&userId=&cache=v2" alt="img" style="zoom:50%;" />



<p>제안된 hyper-network $g$는 네트워크의 어떤 부분이 지식을 조정하기 위해 변해야하는지 “probe”으로 간주됩니다.</p>
<p>이 논문의 기여점은 다음과 같습니다.</p>
<ul>
<li>저자들은 knowledge editing의 문제를 정의하고 다양한 평가지표를 제안했습니다.</li>
<li>저자들은 언어 모델의 기억을 효율적으로 수정함과 동시에 일관성 있는 예측을 유지하는 KnowledgeEditor을 제안했습니다.</li>
<li>저자들은 제안된 방법이 fact-checking과 open-domain question answer에서 그들이 정의한 목표들을 충족하는 것을 증명했습니다.</li>
</ul>
<h2 id="2-task">2. Task</h2>
<p>모델의 기억이 수정되었다면, 특정 입력이 주어졌을 때 출력이 수정된 정보를 반영하고 있어야합니다. 따라서, 저자들은 특정 입력에 대한 모델의 예측에 영향을 주는 파라미터들을 바꾸는 방향을 고려하였습니다.</p>
<h3 id="21-definition">2.1 Definition</h3>
<p>모델 $x \rightarrow f(x;\theta)$와 수정이 필요한 데이터셋 $&lt;x,y,a&gt;\in \mathcal{D}$이 있을 때, $y$가 $f(x,\theta)$의 예측이라면, $a$는 $x$에 대한 수정된 모델의 예측입니다. 여기서 모델 구조 $f$는 동일하게 두고 수정된 파라미터 $\theta&#39;$를 찾는 문제로 정의될 수 있습니다. 저자들은 예측이 변하면 안되는 입력,출력 pair $&lt;x&#39;, y&#39;&gt;$를 유한 데이터셋 $\mathcal{O}^x$로 근사했습니다. 또한, (출력을 수정해야하는) 입력 $x$와 의미적으로 동일한 입력들의 집합 $\mathcal{P}^x$에 대해서도 평가하였습니다.</p>
<h3 id="22-evaluation">2.2 Evaluation</h3>
<ul>
<li>success rate : $g$가 $\theta&#39;$의 지식을 얼마나 효과적으로 업데이트했는지 보여주는 지표입니다. $\mathcal{D}$의 입력 에 대한 수정된 예측값의 정확도로 계산합니다.</li>
<li>retain accuracy : $\theta&#39;$가 기존 $f$의 예측을 얼마나 잘 유지하고 있는지 보여주며, 데이터셋 $\mathcal{O}^x$의 정확도로 계산합니다.</li>
<li>equivalence accuracy : 의미적으로 동일한 입력에 대해 $\theta&#39;$의 예측이 얼마나 일관성이 있는지 보여주며, 전체 $\mathcal{P}^x$에  대한 수정된 예측의 정확도로 계산합니다.</li>
<li>performance deterioration : 업데이트된 모델의 성능이 전보다 얼마나 떨어졌는지 계산합니다.</li>
</ul>
<h3 id="3-method">3. Method</h3>
<p>모델에 저장된 메모리를 수정하기 위해서, 저자들은 수정을 하려는 사실에 조건화된 $\theta&#39;$를 예측하는 모델인 KnowledgeEditor을 학습하였습니다. KnowledgeEditor $g$는 $\phi$를 파라미터로 가진 hyper-netowkr로, 다른 네트워크의 파라미터를 예측합니다. 다른 예측에 대해서는 동일하게 유지하면서 특정 예측만 수정하기를 원하므로, constrained optimization 문제로 정의될 수 있습니다.</p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fa3fb6a08-81d8-4106-a398-5455fcba950f%2FUntitled.png?table=block&id=1eec76ec-3132-4c71-96b2-b6c3ef8d490c&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=670&userId=&cache=v2" alt="img" style="zoom:50%;" />

<p>여기서 \theta&#39;=\theta+g(x,y,a;\phi)이며, \mathcal{C}는 margin m을 하이퍼파라미터로 가지며, x&#39;들에 대해서는 모델을 수정하지 않게 하는 제약조건입니다. 여기서 이 제약식은 \theta와 \theta&#39;의 KL-Divergence로 계산됩니다. </p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Ff2b874bb-6746-4b6d-aad9-5f322a28c193%2FUntitled.png?table=block&id=35cc55f7-ca0b-4156-a3b3-e1cee15261b6&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=860&userId=&cache=v2" alt="img" style="zoom:50%;" />

<p>하지만 이러한 비선형 constrained optimization은 intractable하므로, Lagrangian relaxation을 도입하였습니다. 또한, 제약조건 계산에서 모든 데이터에 대해 KLD를 학습단계마다 계산하는 것은 너무 많은 계산을 필요로 하므로, Monte Carlo 샘플링을 통해 근사했습니다. 마지막으로, seq-to-seq 모델의 경우 한 데이터에 대해서도 KLD를 계산하는데 많은 비용이 드므로, 빔 서치를 통해 샘플 공간의 부분집합의 계산을 근사하는 방법을 택했습니다.</p>
<p>$\theta&#39;$의 파라미터를 직접적으로 예측하는 것 대신, hyper-parameter $g$는 shift $\Delta\theta$ ($\theta&#39;=\theta+\Delta\theta$)를 예측합니다. 또한 계산의 효율성을 위해 $g$는 gradient 정보 $\nabla \mathcal{L}(\theta;x,a)$를 이용합니다.</p>
<p>먼저 $&lt;x,y,a&gt;$를 인코딩한 후 특수 seperator와 concat후 bidirectional-LSTM에 입력합니다. 그리고, 마지막 LSTM의 hidden state를 Fully-connected layer에 넣어 하나의 벡터 $h$를 출력하도록 합니다.</p>
<p>$W^{n\times m}\in\theta$ 의 shift를 예측하기 위해서, 5개의 $h$에 조건화된 FCN를 사용하여 $\alpha, \beta \in\R^m, r,\delta \in \R^n, \eta\in\R$를 출력합니다.</p>
<img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F2a4ad9bc-5972-447b-aec7-e51e8a31817f%2FUntitled.png?table=block&id=19d0432c-787d-42d3-9c32-0b759912cf57&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=860&userId=&cache=v2" alt="img" style="zoom:50%;" />

<p>이러한 구조를 사용한다면, hyper-network $\phi$의 사이즈 증가는 $\theta$의 사이즈에 따라 선형적으로 증가합니다.</p>
<h2 id="4-experimental-setting">4. Experimental Setting</h2>
<p>본 연구에서는 두 가지 베이스라인인 fine-tuning과 Zhu et al (2020)의 방법을 비교하였습니다. Fine-tuning은 표준 경사 하강법을 사용하여 loss를 최소화하고, Zhu 등의 방법은 fine-tuning에 L∞ 제약 조건을 추가하는 방법입니다.</p>
<h3 id="42-models-and-data">4.2 Models and Data</h3>
<p>Fact-checking과 Closed-book question answering 태스크에서 BERT 및 BART 기반 모델을 fine-tune하여 평가하였습니다. Fact-checking은 FEVER 데이터셋을 사용하며, question answering은 Zero-Shot Relation Extraction 데이터셋을 사용하였습니다. 이 작업에서는 모델이 의미적으로 동일한 입력에 대해 robust한지 측정할 수 있도록, fact cheking에서는 label을 뒤집고, question answering에서는 빔 서치를 통해 상위 1개를 제외한 모든 가설을 선택하였습니다.</p>
<h1 id="5-result">5. Result</h1>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F4984d356-fbb8-4f85-b43d-07070ba2e865%2FUntitled.png?table=block&id=44514d42-4f7a-4b21-a484-0a5c2f3b48eb&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=2000&userId=&cache=v2" alt="img"></p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fa217058c-798d-46a3-b7d0-cb4a59753e98%2FUntitled.png?table=block&id=2be103e7-3aa1-4ba5-8670-a4ef07c9d8b6&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=2000&userId=&cache=v2" alt="img"></p>
<p>Table 1에서는 fact cheking 및 question answering 작업에 대한 주요 결과가 보고되었습니다. 전반적으로, Knowledge Editor은 모든 지표에서 높은 성능을 보입니다. 다른 몇 가지 방법들도 일부 지표에서 높은 정확도를 보이지만, 다른 지표에서 성능이 하락하는 것을 보입니다. FC와 QA 모두에서 제안된 전체 방법들이 다른 베이스라인을 능가할 확률이 매우 높다는 것을 보였습니다(각각 약 97%와 약 88%).</p>
<h3 id="61-success-rate">6.1 Success rate</h3>
<p>Knowledge Editor는 closed-book fact-checking과 question answering에서 모든 desiderata를 충족시키며 높은 성능을 보입니다. fine-tuning 방법은 QA에서 거의 완벽한 점수를 얻지만, retain accuracy가 희생되는 것이 문제입니다. 이는 sequence-to-sequence 모델이 작은 parameter shift에 민감하기 때문입니다. 하지만 Knowledge Editor는 이러한 문제를 성공적으로 해결하고 있습니다.</p>
<h3 id="62-retaining-previous-knowledge">6.2 Retaining previous knowledge</h3>
<p>Knowledge Editor는 뛰어난 성능을 보이며 파라미터 업데이트 방식 중 최적의 방법이라는 것을 입증하였습니다. $\mathcal{C}_{L_2}$방법과 fine-tuning 방법은 각각 성능 저하와 catastrophic forgetting 문제를 발생시켰습니다. 또한 fine-tuning all layers와 fine-tuning a single layer는 각각 장단점이 있으며, Zhu et al.의 방법은 retain accuracy를 높이지만 성공률이 낮은 문제가 있었습니다. FC에서 paraphrase에 대한 일반화 능력이 부족한 점도 지적되었습니다.</p>
<h3 id="63-accuracy-on-paraphrases">6.3 Accuracy on paraphrases</h3>
<p>Knowledge Editor을 생성된 paraphrase와 함께 사용하면, FC와 QA 모두에서 성능이 크게 향상됩니다. FC에서는 하나의 layer를 fine-tuning하는 것이 success rate와 retain accuracy면에서 성능이 높았지만, paraphrase 대해 약한 성능을 보입니다. QA에서도 Zhu et al.방법은 저자들의 방법이나 다른 방법과 비교하여 결과가 좋지 않았습니다. 다른 방법들이 저자들의 방법보다 성능이 좋거나 비슷할 때, retain accuracy가 좋지 않습니다.</p>
<h3 id="64-analysis-of-model-updates">6.4 Analysis of model updates</h3>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb08d76cc-a130-4f2d-9b86-7ed334059934%2FUntitled.png?table=block&id=22c3ef64-d374-4211-a011-5b887a6e630b&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=2000&userId=&cache=v2" alt="img"></p>
<p>그림 3에서는 서로 다른 방법에 대한 fact cheking(Logistic regression, Fine-tuning all layers, Fine-tuning single layer, Zhu et al., \mathcal{C}<em>{L_2}, Knowledge Editor) logit의 분포를 비교합니다. 그림에서 볼 수 있듯이, 모든 레이어를 finetuning하는 경우 많은 데이터 포인트가 의사 결정 경계를 넘어가고 원래 예측에서 확률이 변경되는 영향을 받습니다. \mathcal{C}</em>{L_2}의 실패는 이전 예측을 거의 보존하지 않기 때문에 그림 3b에서 확인할 수 있습니다. Knowledge Editor는 대부분의 예측 라벨과 해당 확률을 보존하기 때문에 (그림 3c) 대각선에 머무르는 데이터 포인트가 대부분입니다. </p>
<p><img src="https://separate-darkness-400.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb5c79b2d-561e-4320-802c-8f78abc429cd%2FUntitled.png?table=block&id=85c5187e-b989-4658-b94a-ed7b9d68121e&spaceId=94fce3a2-aa37-4936-b062-039f0fcc5cfb&width=1340&userId=&cache=v2" alt="img"></p>
<p>그림 4에서는 QA 실험을 위한 평균 가중치 업데이트의 시각화를 보고 있습니다. 첫 번째 인코더 레이어와 마지막 디코더 레이어에 대한 기울기가 주로 집중되며, fine-tuning은 gradient 크기를 보존하지 않고 전체 모델을 거의 균등하게 업데이트합니다. Knowledge Editor는 gradient를 의미 있는 방식으로 사용하는 것으로 보이며, 적극적으로 일부 방향을 무시하거나 그 크기를 조절함으로써 gradient를 조작합니다. 이를 통해 모델이 지식을 인코딩하는 메커니즘에 대한 통찰력을 제공할 수 있습니다.</p>
<h2 id="7-conclusions">7. Conclusions</h2>
<p>본 연구에서는 언어 모델 파라미터에 저장된 지식을 편집하는 태스크를 탐구했습니다. 이를 위해, 저자들은 목표와 여러 방법의 효과를 측정하기 위한 metric을 정의하고, closed-book fact-checking 및 question answering을 기반으로 하는 두 가지 벤치마크에서 구체적으로 평가했습니다. Knowledge Editor라는 hyper-network 기반의 방법을 제안하며, 이 방법은 LM 파라미터 내부에 저장된 지식을 효율적으로 수정하도록 학습합니다. 저자들은 모델을 다양한 fine-tuning 변형에 대해 종합적으로 평가하여 접근 방식의 이점을 입증하였습니다. 제안된 방법에서 예측된 업데이트의 크기를 통해 LM이 지식을 인코딩하는 메커니즘을 확인하였습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Deep Learning of Representations: Looking Forward]]></title>
            <link>https://velog.io/@dandelion_26/Deep-Learning-of-Representations-Looking-Forward</link>
            <guid>https://velog.io/@dandelion_26/Deep-Learning-of-Representations-Looking-Forward</guid>
            <pubDate>Mon, 11 Dec 2023 06:21:03 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/abs/1305.0445">https://arxiv.org/abs/1305.0445</a></p>
<h1 id="핵심-요약">핵심 요약</h1>
<ul>
<li>딥 러닝 알고리즘을 훨씬 더 큰 모델과 데이터 세트로 확장하고, 잘못된 컨디셔닝 또는 로컬 최소값으로 인한 최적화의 어려움을 줄입니다.</li>
<li>보다 효율적이고 강력한 추론 및 샘플링 절차를 설계하고 관찰된 데이터의 기저에 있는 변동 요소를 분리하는 방법을 학습합니다.</li>
<li>또한 이러한 과제를 극복하기위한 몇 가지 미래 지향적 인 연구 방향을 제안합니다.</li>
</ul>
<h1 id="1-background-on-deep-learning">1. Background on Deep Learning</h1>
<ul>
<li>딥 러닝은 기계 학습 연구 커뮤니티에서 새롭게 부상하는 접근 방식입니다. 그들은 컴퓨터 비전 및 자연어 처리와 같은 여러 전통적인 AI 응용 프로그램에서 중요한 경험적 성공을 거두었습니다.</li>
<li>많은 Machine learning 방법의 성능은 적용되는 데이터 표현(Representation)또는 Feature의 선택에 따라 크게 달라집니다. 이러한 이유로 Machine learning 알고리즘을 배포하는 실제 노력의 대부분은 효과적인 기계 학습을 지원할 수 있는 데이터의 수작업 표현을 생성하는 전처리 파이프라인 설계에 사용됩니다. 이러한 Feature 엔지니어링은 중요하지만 많은 기존 학습 알고리즘의 약점, 즉 데이터에서 차별적인 정보를 추출하고 구성할 수 없다는 점을 강조합니다.</li>
<li>Feature 엔지니어링은 인간의 독창성과 사전 지식을 활용하여 이러한 약점을 보완하는 방법입니다. 기계 학습의 범위와 적용 용이성을 확장하려면 학습 알고리즘을 Feature 엔지니어링에 덜 의존하도록 하여 새로운 애플리케이션을 더 빠르게 구축하고 작성자가 인공 지능(AI)으로 발전할 수 있도록 하는 것이 중요합니다.</li>
<li>Representation 학습 알고리즘은 설명 요소(factor) 또는 특징(feature)을 발견합니다. 딥러닝 알고리즘은 데이터의 보다 추상적인 측면을 나타내는 상위 레벨의 feature를 사용하여 여러 레벨의 표현을 발견하는 특정 종류의 Representation 학습 절차입니다. 처음에는 더 깊은 Representation을 얻기 위해 비지도 Representation 학습 알고리즘을 쌓는 데 중점을 두었습니다.</li>
<li>전이 학습(Transfer learning)은 통계적 강점을 공유하고 Task 간에 Knowledge를 전달하기 위해 서로 다른 학습 Task 간의 공통점을 활용하는 학습 알고리즘의 기능입니다.</li>
</ul>
<h1 id="2-quick-overview-of-deep-learning-algorithms">2. Quick Overview of Deep Learning Algorithms</h1>
<p>모든 딥 러닝 방법론의 중심 개념은 이미지, 비디오 및 오디오 신호와 같은 원시 데이터 보다 추상적인 표현(representation) 즉 데이터의 의미론적인 내용이 더 유용하다는 믿음과 함께 자동화 된 추상화의 발견입니다.  딥러닝 알고리즘은 여러 레벨의 표현을 학습하는 속성을 가진 표현 학습의 특별한 케이스입니다.</p>
<h2 id="21-deep-supervised-nets-convolutional-nets-dropout">2.1. Deep Supervised Nets, Convolutional Nets, Dropout</h2>
<ul>
<li>적절한 초기화를 통해 Deep Supervised Nets를 훈련 할 수 있으며, 그래디언트가 잘 흐르고 유용한 정보를 전달하기에 충분하다는 것을 발견하였습니다. Deep Nets에 대한 순전히 Supervised learning을 통한 이러한 좋은 결과는 대량의 레이블이 지정된 데이터를 사용할 수 있을 때 특히 명확 해 보이며 음성 인식에 큰 성공을 거두었습니다.</li>
<li>딥 러닝을 음성, 이미지 및 자연어 처리에 성공적으로 적용하기 위한 핵심 요소 중 하나가 컨볼 루션 아키텍처의 사용입니다. 컨벌루션 레이어과 풀링 레이어를 번갈아 가며 사용합니다. 컨벌루션 네트워크의 히든 계층에 있는 단위는 공간적 또는 시간적 위치와 연관되며 원시 입력 값의 특정 윈도우에 있는 값에만 의존합니다. 또한 컨볼루션 레이어의 유닛는 서로 다른 위치에 있는 동일한 타입의 다른 유닛과 매개 변수를 공유하는 반면 각 위치에서 서로 다른 타입의 유닛을 모두 찾습니다.</li>
<li>풀링 레이어의 유닛는 하위 레이어에서 유닛의 출력을 집계(aggregation)하여 서로 다른 인근의 공간 위치 또는 서로 다른 유닛 타입에 대해 집계합니다.</li>
<li>객체 인식 분야에서 성공에 대한 또 다른 핵심 요소는 드롭아웃에 대한 아이디어입니다. 히든 유닛의 너무 강한 공동 적응을 방지하는 확률적으로 꺼진(마스킹된) 경우에도 유용하게 feature를 계산해야 합니다. 매개 변수를 공유하는 기하 급수적으로 많은 수의 모델 (다른 마스킹 패턴, 즉 전체 네트워크의 하위 집합에 해당)에 대한 강력한 regularizer처럼 작동합니다.</li>
</ul>
<h2 id="22-unsupervised-or-supervised-layer-wise-pre-training">2.2. Unsupervised or Supervised Layer-wise Pre-Training</h2>
<p>딥 러닝 연구의 주요 결과 중 하나는 비선형성의 심층구성이 초기화에 매우 민감할 수 있다는 것입니다. 즉 일부 초기화는 학습 후 훨씬 더 좋거나 훨씬 더 나쁜 결과를 초래할 수 있다는 것입니다. 민감도를 줄이는 데 유용한 것으로 밝혀진 첫 번째 접근 방식은 greedy layer-wise pre-training을 기반으로 합니다.</p>
<p>아이디어는 하위 레이어(맨 위)에서 시작하여 한 번에 하나의 레이어를 학습하여 현재 추가된 레이어에 대한 명확한 학습 목표가 있도록 하는 것입니다(일반적으로 여러 비선형성 레이어을 통해 오류 그래디언트를 역전파를 할 필요가 없음). 비지도 사전 학습을 사용하면 각 레이어가 이전 계층의 출력으로 생성된 값의 분포를 모델링하도록 훈련됩니다. 다시 말하지만, 더 깊은 레이어에 대한 입력으로 재사용할 수 있는 새 표현을 얻습니다.</p>
<h2 id="23-directed-and-undirected-graphical-models-with-anonymous-latent-variables">2.3. Directed and Undirected Graphical Models with Anonymous Latent Variables</h2>
<p>Anonymous Latent Variables은 미리 정의된 해석 가능한 개념의 관점에서 미리 정의된 의미 체계가 없는 잠재 변수입니다. 대신 컴퓨터가 데이터에 존재하는 기본 설명 요소를 발견하는 수단으로 사용됩니다. 익명이 아닌 잠재 변수는 정의하기에 충분한 사전 지식이 있을 때 매우 유용할 수 있지만, 익명 잠재 변수는 복잡한 확률적 구조를 발견하도록 하는 데 매우 유용하다고 생각합니다.</p>
<p>섹션 3은 방향성(Direct) 또는 무방향성(Undirect) 그래픽 모델을 기반으로 한 표현 학습 절차를 검토합니다. 섹션 2.5에서는 희소 코딩에 대해 자세히 설명합니다.</p>
<p>명심해야 할 중요한 점은 Directed Graphical Model은 후반부를 계산할 때 서로 다른 요소가 서로 경쟁하는 경향이 있다는 것입니다. 불행히도 특별한 경우를 제외하고 이로 인해 계산 비용이 많이 드는 추론이 발생합니다.</p>
<h2 id="24-regularized-auto-encoders">2.4. Regularized Auto-Encoders</h2>
<p>오토 인코더는 학습 기준에 다음과 같은 재구성 오류의 형태를 포함합니다.</p>
<ul>
<li>$||r(x)-x||^{2}$</li>
<li>$r(\cdot)$: 학습된 재구성 함수, 다음과 같이 $r(x)=g(f(x))$ 분해 됨.</li>
<li>$f(\cdot)$: 인코딩 함수,  $g(\cdot)$: 디코딩 함수</li>
</ul>
<p>아이디어는 오토 인코더가 학습에서 재구성 오류가 적어야 하지만 입력의 다른 대부분의 구성에서 재구성 오류가 높아야 한다는 것입니다. 오토 인코더는 단순히 ID 기능을 학습하지 못하도록 정규화해야 합니다. 정규화 된 오토 인코더에는 입력보다 히든 유닛이 적은 오래된 bottleneck 오토 인코더(PCA)와 디노이즈 오토 인코더가 있습니다. 재구성 오류의 최소화와 정규화기(regularizer) 사이의 줄다리기는 중간 표현이 학습을 구별하는 데 필요한 변형, 즉 데이터 생성 분포가 집중되는 매니폴드(저차원 영역)의 변형 방향을 대부분 캡처해야 함을 의미합니다.</p>
<p>정규화 된 오토 인코더에 확률론적 해석을 부여하고 암시적으로 학습된 Dense 모델에서 샘플링하는 데 사용할 수 있습니다. 정규화된 오토 인코더에 대한 확률적 해석이 있지만 이 해석에는 중간 익명 잠재 변수의 정의가 포함되지 않습니다. 대신, 입력을 즉시 매핑하는 인코딩 함수의 구성을 기반으로 합니다. 결과적으로, 추론에서 다루기 쉬운 문제는 단일 레이어 오토 인코더를 적층하여 얻은 딥 오토 인코더를 사용하더라도 문제가 없습니다.</p>
<h2 id="25-parse-coding-and-psd">2.5. parse Coding and PSD</h2>
<ul>
<li>희소 코딩은 변수와 잠재 변수 사이의 선형 관계를 갖는 특정 종류의 방향성 그래픽 모델입니다. 희소 코딩은 실제로 생성 모델로는 그다지 좋지 않지만 Unsupervised Feature learning에는 성공적이었습니다. 하지만 희소 코딩은 RBM 및 희소 오토 인코더보다 더 나은 학습 알고리즘은 아닌 것으로 보여집니다. 또한 희소 코딩은 스파이크와 슬래브 희소 코딩 알고리즘으로 일반화 될 수 있습니다.</li>
<li>희소 코딩에 대한 또 다른 흥미로운 변형은 예측 스파스 코딩(PSD) 알고리즘과 희소 코딩과 오토 인코더의 속성을 결합한 변형입니다. 희소 코딩은 매개변수(parametric) &quot;생성&quot; 디코더(잠재 변수 값을 변수 값에 매핑)와 비모수(non-parametic) 인코더(재구성 오류를 최소화하고 잠재 변수의 로그 우선 순위를 빼는 잠재 변수 값 찾기)만 있는 것으로 볼 수 있습니다. PSD는 매개변수 인코더를 추가하고 생성 모델과 공동으로 학습하여 매개변수 인코더의 출력이 입력을 잘 재구성하는 잠재 변수 값에 가깝도록 합니다.</li>
</ul>
<h1 id="3-scaling-computations">3. Scaling Computations</h1>
<h2 id="31-scaling-computations-the-challenge">3.1. Scaling Computations: The Challenge</h2>
<p>지난 몇 년 동안 딥 러닝은 숫자에서 자연 이미지의 객체 인식으로 이동했으며 ImageNet 데이터 세트에서 SOTA를 달성하였습니다. 28x28 그레이 레벨 MNIST 이미지에서 256x256 RGB 이미지로        스케일링을 달성하기 위해 연구자들은 컨벌루션 아키텍처를 활용했습니다. 그리고 그 풀링 유닛은 더 낮은 레이어에서 더 높은 레이어로 이동할 때 공간 해상도를 줄입니다.  또한 GPU 기술을 활용하여 1~2배의 계산 속도를 높였습니다. GPU, 멀티코어 머신 및 클러스터에서 볼 수 있는 것과 같은 병렬 처리를 통해 컴퓨팅 성능은 계속 증가할 것입니다 . 잠재적으로 거대한 모델을 처리 할 수 있도록 허용합니다.</p>
<h2 id="32-scaling-computations-solution-paths">3.2. Scaling Computations: Solution Paths</h2>
<ul>
<li><strong>Parallel Updates: Asynchronous SGD</strong><ul>
<li>비동기식 SGD의 모델은 여러 버전을 병렬로 훈련하고 각각 다른 노드에서 실행하고 데이터의 다른 하위 집합을 확인하지만 서로 다른 노드를 유지하는 비동기식 잠금 없는 공유 메커니즘을 사용합니다. 동기식은 대부분의 노드가 공유가 완료될 때까지 시간을 보내고 가장 느린 노드를 기다리기 때문에 너무 비효율적입니다.</li>
</ul>
</li>
<li><strong>Sparse Updates</strong><ul>
<li>여기서 제안하는 한 가지 아이디어는 Sparse update를 얻기 위해 학습 알고리즘을 변경하는 것입니다. 업데이트의 희소성 양이 크면 노드 간에 교환해야 하는 매개변수가 훨씬 적습니다. 그라디언트가 매우 희소 한 경우  Sparse update를 얻을 수 있습니다. 이 그래디언트 희소성은 신경망에서 경로를 선택하는 접근 방식에서 발생할 수 있습니다. 이러한 방법은 충분한 희소성을 제공하지 않지만 두 가지 방법으로 이를 달성할 수 있습니다. 우선 그래디언트 벡터의 가장 큰 요소에만 주의를 기울이도록 선택할 수 있습니다. 그리고 제안 된 라인을 따라 아키텍처를 변경할 수 있습니다.</li>
</ul>
</li>
<li><strong>Conditional Computation</strong><ul>
<li>우리가 제안한 중심 아이디어는 조건부 계산의 아이디어입니다. 경로를 독립적으로 무작위로 삭제하는 대신 학습되고 최적화된 방식으로 삭제합니다. 높은 수준의 조건부 계산에서는 일부 매개변수는 자주 사용되는 반면 다른 매개변수는 매우 드물게 사용되므로 추정하는 데 더 많은 데이터가 필요합니다. 따라서 각 매개변수로 들어가는 학습 신호의 양에 따라 트레이드 오프 및 적절한 정규화가 설정되어야 합니다. 흥미롭게도, 조건부 계산은 희박한 그래디언트를 달성하는 데 도움이 되며 조건부 계산의 부수적인 이점이 더 쉽고 빠른 최적화라는  증거를 제공합니다.</li>
</ul>
</li>
</ul>
<h1 id="4-optimization">4. Optimization</h1>
<h2 id="41-optimization-the-challenge">4.1. Optimization: The Challenge</h2>
<p>점점 더 큰 데이터 세트를 고려할 때 학습 오류와 일반화 오류가 수렴됩니다. 또한 딥 러닝에 대한 실험 결과의 많은 증거는 딥 네트워크 학습에 어려운 최적화가 포함됨을 나타냅니다. 로컬 최소값으로 인한 어려움과 불량 조건으로 인한 어려움은 아직 명확하지 않습니다. 또한 더 나은 최적화는 스케일링 계산에 영향을 미칠 수도 있습니다.</p>
<h2 id="42-optimization-solution-paths">4.2. Optimization: Solution Paths</h2>
<ul>
<li><strong>Diminishing Returns with Larger Networks</strong><ul>
<li>더 큰 모델이 근본적으로 훈련하기 더 어려울 수 있습니다. 아마도 매개변수 사이에 더 많은 2차 상호작용이 있어 Hessian 행렬의 조건 수가 증가하기 때문일 것입니다. 딥 러닝을 위한 교육 및 최적화 절차의 확장 동작을 개선하기 위해 다양한 방법의 효과를 측정하는 유용한 지표를 제공할 수 있습니다.</li>
</ul>
</li>
<li><strong>Changing the learning procedure and the architecture</strong><ul>
<li>단일 딥 네트워크의 기본 최적화 난이도와 관련하여 세 가지 유형 솔루션을 고려해야 합니다.<ul>
<li>향상된 범용 최적화 알고리즘<ul>
<li>adaptive learning rates</li>
<li>online natural gradient</li>
<li>large-minibatch second order methods</li>
</ul>
</li>
<li>아키텍처 변경(changing) 또는 출력이 생성되는 방식<ul>
<li>전처리, 학습 목표 및 아키텍처의 변경</li>
<li>경사 하강법</li>
</ul>
</li>
<li>딥 지도(supervised) 네트워크를 위한 정류기(rectifier) 비선형성을 활용</li>
</ul>
</li>
<li>딥 네트워크의 학습 난이도를 이해하고 줄이는 데 유용한 관련 개념을 훈련 신호(역전파 기울기)가 집중된 방식으로 흐르도록 하는 것이 중요합니다.</li>
</ul>
</li>
</ul>
<h1 id="5-inference-and-sampling">5. Inference and Sampling</h1>
<p>추론과 관련된 과제는 샘플링이며, 잠재 변수가 있는 확률 모델, 에너지 기반 모델 또는 Markov Random Fields(무방향 그래픽 모델)에서 정규화된 지수가 확률을 제공하는 매개변수화 된 에너지 함수$P(x)$  또는 $(h,x)$로 정의됩니다.</p>
<h2 id="51-inference-and-sampling-the-challenge">5.1. Inference and Sampling: The Challenge</h2>
<p>이러한 모든 추론 및 샘플링 기술과 관련된 몇 가지 과제가 있습니다. 첫 번째 과제는 실용적이고 계산적인 것이고 이들 모두 학스 속도를 상당히 늦출 수 있는 반복적인 절차입니다.</p>
<ul>
<li><strong>Potential Huge Number of Modes</strong><ul>
<li>추론 및 샘플링에 대한 현재 알려진 모든 접근 방식은 관심 분포 및 형식에 대해 매우 강력한 명시적 또는 암시적 가정을 하고 있습니다. 예를 들어 모호한 속성 또는 카테고리를 가진 여러 개체의 존재를 포함하여 매우 모호한 원시 입력 장면의 많은 변수를 나타내 보겠습니다. 예를 들어 사람 5 명의 모호한 이진 속성 20 개의 옷차림 방식을 선택하고 100 사이의 각 요소(데이터 베이스 10000명)에 대한 카테고리 선택을 합니다. 그리고 인수 분해할 수 없다고 가정합니다. 하나의 옷을 입는 것을 결정해야 하는 경우, $P(y|x)=\sum_hP(y|h)P(h|x)$이고, $h$는 충분한 원시 입력 장면의 변수를 나타냅니다. 명백한 복잡성에도 불구하고 계산할 수 있고 예제를 통해 배울 수 있는 다루기 쉬운 함수가 있다고 가정합니다.</li>
</ul>
</li>
<li><strong>Mixing Between Modes</strong><ul>
<li>manifold hypothesis는 데이터에 존재하는 자연 클래스(예: 시각적 개체 범주)가 분포가 집중되는 저차원 영역17(즉, 매니폴드(manifolds))과 연관되어 있으며 다른 클래스 매니폴드는 밀도가 매우 낮은 영역으로 잘 분리되어 있음을 나타냅니다. 여기서 모드라고 생각하는 것은 단일 점 이상일 수 있으며 전체(저차원) 매니폴드 일 수 있습니다. 모드 간의 느린 혼합은 연속 샘플이 상관되는 경향이 있고(동일한 모드에 속함) 한 모드에서 다른 모드로 이동하는 데 매우 많은 연속 샘플링 단계가 필요하고 모든 모드를 커버하는 데 훨씬 더 많은 수의 샘플링 단계가 필요함을 의미합니다.</li>
</ul>
</li>
</ul>
<h2 id="52-inference-and-sampling-solution-paths">5.2. Inference and Sampling: Solution Paths</h2>
<ul>
<li>믹싱이 더 쉬운 공간으로 이동<ul>
<li>높은 수준의 계층: 더 깊은 표현 수준에서 모드 간의 혼합이 더 쉽습니다. 이것은 높은 수준의 표현 공간에서 실행한 다음 원시 입력 공간에서 다시 투영하여 해당 수준에서 샘플을 얻음으로써 달성 됩니다.</li>
</ul>
</li>
<li>근사 추론 학습 및 풍부한 사후 예측<ul>
<li>잠재(latent) 변수의 실제 값을 얻는 아이디어를 고수한다면, 유망한 경로는 대략적인 추론 학습, 즉 학습된 근사 추론 메커니즘을 최적화하여 수행합니다. 학습된 근사 추론은 예측 희소 코딩(PSD) 알고리즘에서도 중요합니다.</li>
<li>확률적 그래픽 모델의 전통적인 관점은 모델링(모델 정의), 최적화(매개변수 조정), 추론 및 샘플링 사이의 명확한 구분을 기반으로 합니다. 이 모듈화는 분명한 장점이 있지만 차선책일 수 있습니다. 학습을 추론으로 가져오고 근사 추론과 &quot;생성 모델&quot; 자체를 함께 학습함으로써 일반적인 목적보다 훨씬 더 효율적이고 정확할 수 있는 추론 메커니즘을 얻을 수 있습니다. 학습된 근사 추론의 아이디어는 추론과 관련하여 순전히 계산적인 문제를 처리하는 데 도움이 될 수 있습니다. 즉, 어느 정도 추론 속도를 높이는 데 도움이 될 수 있지만 일반적으로 근사 추론 매개변수는 모델 매개변수와 별도로 유지합니다.</li>
</ul>
</li>
<li>필요한 주변화를 수행하는 방법을 학습하여 추론을 완전히 피함<ul>
<li>잠재 변수가 있는 확률 모델에 관한 전통적인 생각에서 훨씬 더 급진적인 출발을 고려할 것을 논문은 제안합니다. 사후를 포착하기 위한 조건부 RBM과 같은 마지막 제안에서도 실제로 결정이나 예측을 내려야 할 때 최적의 의사 결정을 위해 잠재 변수를 무시하는 것이 필요하다는 관찰에 의해 동기가 부여됩니다.</li>
<li>문제를 해결하기 위해 잠재 변수의 실제 값을 샘플링, 열거 또는 나타내는 것을 피함으로써 명시적 추론을 완전히 피할 것을 논문은 제안합니다. 남은 유일한 근사 오차는 함수 근사로 인한 것입니다. 이는 근사 추론과 함수 근사의 합성이 매우 해로울 수 있기 때문에 중요할 수 있습니다. $Q_{\theta=f(x)}(h)$에 제안한 바와 같이  매개 변수 $\theta=f(x)$를 사용합니다. 그런 다음 직접 이동하는 대신 처리하기 어려운 합을 근사하고 건너뛰는 대략적인 결정 모델을 학습하는 것을 상상할 수 있습니다.</li>
<li>잠재 변수의 많은 구성을 명시적으로 거칠 필요 없이 확률 모델의 이점을 얻을 것을 논문은 제안합니다. 학습하는 동안 관찰된 각 하위 집합에 대해 중요한 요구 사항은 의 모든 선택에 대한 모든 예측을 모델링하는 데 동일한 매개변수가 사용된다는 것입니다. 이를 위해 모델 매개변수를 최대화에 해당하는 학습에 매핑하는 계산을 지정할 수 있습니다.</li>
<li>근사 추론은 더 이상 다른 것에 대한 근사가 아니라 모델 자체의 정의입니다. 이것은 대략적인 추론이 좋지 않을 수 있다는 문제를 제거하기 때문에 실제로 좋은 소식입니다. 우리가 걱정해야 할 유일한 것은 생성하는 매개 변수화 된 계산 그래프가 알 수 없는 데이터 생성 분포를 캡처하기에 충분히 풍부한지(또는 과적합 될 수 있는지), 그리고 매개변수를 최적화하는 것이 쉬운지 어려운지 여부입니다. 이러한 경우 학습된 근사 추론에 사용되는 &quot;템플릿&quot;에 동기를 부여하는 잠재 변수가 있지만 여기서 제안하는 것은 이러한 잠재 변수를 실제 잠재 요인으로 생각하는 것을 중단하는 것입니다.</li>
<li>조건부 RBM이 이미 연구되었지만 정규화 된 자동 인코더가 부트가 하는 조건부 분포는 여전히 연구해야 합니다.</li>
<li>요약하면, 여기서 제안하는 것은 근사 추론에 대한 이전 작업과 달리 학습된 근사 추론 메커니즘이 실제로 잠재 변수 분포, 모드 또는 예상 값을 근사한다는 주장을 삭제하는 것입니다. 대신 관찰된 변수에 대한 대략적인 추론만 고려하고 이 메커니즘 자체가 일부 근사가 아닌 모델이라고 생각하고 훈련합니다. 잠재 변수에 대한 대략적인 주변화 해석을 제거함으로써 우리는 강한 제약에서 벗어나 모든 질문/답변 하위 집합에서 매개변수를 공유할 수 있어야 한다는 요구 사항이 있는 매개 변수화 된 계산을 하게 됩니다.</li>
</ul>
</li>
</ul>
<h1 id="6-disentangling">6. Disentangling</h1>
<h2 id="61-disentangling-the-challenge">6.1. Disentangling: The Challenge</h2>
<ul>
<li>이미지는 하나 이상의 광원, 개체 모양 및 이미지에 있는 다양한 표면의 재료 속성 간의 상호 작용으로 구성됩니다. 불변의 피처 학습과 설명 요소를 분리하는 학습이 관련되지만 별개의 목표를 구별하는 것이 중요합니다. 핵심적인 차이점은 정보의 보존입니다. 불변 기능은 정의에 따라 불변 방향으로 민감도가 감소했습니다. 이것은 당면한 작업에 도움이 되지 않는 데이터의 변동에 둔감한 피처를 구축하는 목표입니다.</li>
<li>딥 러닝 방법의 맥락에서 자주 발생하는 것처럼 학습되는 피처(feature) 세트는 관련 피처의 고유한 하위 집합을 가질 수 있는 여러 작업에서 사용될 수 있습니다. 이와 같은 고려 사항은 피처 학습에 대한 가장 강력한 접근 방식이 가능한 한 많은 요소를 분리하고 데이터에 대한 정보를 최대한 적게 폐기하는 것이라는 결론에 도달합니다.</li>
<li>근본적인 변동 요인을 훨씬 더 잘 풀 수 있는 딥 러닝 알고리즘은 엄청난 영향을 미칠 것입니다. 예를 들어, 기본 요소가 학습된 표현의 간단한 변환, 이상적으로는 표현의 몇 가지 요소에만 의존하는 변환에서 &quot;추측&quot;될 수 있다고 가정합니다. 그것이 근본적인 요인을 풀어주는 표현으로 우리가 의미하는 것입니다. 지도 학습이 이러한 선형 요소를 빠르게 학습하고 관련 있는 표현 부분을 확대할 수 있기 때문에 새로운 지도 학습을 훨씬 쉽게 할 수 있습니다.</li>
</ul>
<h2 id="62-disentangling-solution-paths">6.2. Disentangling: Solution Paths</h2>
<ul>
<li>더 깊은 representation이 더 잘 풀림<ul>
<li>sparse convolutional RBM과 sparse denoising auto-encoder가 히든 유닛에서 입력보다 더 큰 분리 정도를 달성한다는 실험이 있습니다. 여기서 발견한 것은 일부 히든 유닛이 알려진 변동 요인에 특히 민감한 반면 다른 히든 유닛에는 다소 둔감하다는 것입니다.</li>
<li>또 다른 실험에서는 더 깊은 표현이 모드 간 빠른 혼합에 더 적합한 것으로 경험적으로 발견되었습니다.</li>
<li>일부 표현 알고리즘이 더 얽히지 않은 표현으로 이동하는 경향이 있는 이유에 대한 명확한 이해가 아직 없으며 이것이 충분하지 않다는 것을 시사하는 다른 실험적 관찰이 있습니다. 현재 알고리즘의 변형이 결국 작업에서 성공할 수도 있고 완전히 다른 비지도 학습 알고리즘이 필요할 수도 있습니다.</li>
</ul>
</li>
<li><strong>Disentangling Factors of Variation에 대한 Generic Priors</strong><ul>
<li>generic priors list<ul>
<li><strong>Smoothnes:</strong> 학습 되는 <strong>*<em>function $f$를 s.t. $x\approx y$로 가정하면 일반적으로 $f(x)\approx f(y)$를 의미합니다. *</em></strong></li>
<li><strong>Multiple explanatory factors:</strong> 데이터 생성 분포는 다양한 기본 요인에 의해 생성되며, 대부분 한 요인에 대해 학습한 내용은 다른 요인의 많은 구성에서 일반화됩니다. 목표는 이러한 기본 변동 요인을 복구하거나 최소한 풀어주는 것입니다. 이 가정은 <strong>분산 표현</strong>의 개념 뒤에 있습니다.</li>
<li><strong>A hierarchical organization of explanatory factors</strong>: 계층 구조에서 더 추상적인 개념은 더 높고 덜 추상적인 개념으로 정의됩니다. 이 가정은 깊은 표현으로 활용됩니다.</li>
<li><strong>Semi-supervised learning</strong>: 머신러닝의 한 범주로 목표 값이 표시된 데이터와 표시되지 않은 데이터를 모두 훈련에 사용하는 것을 말합니다.</li>
<li><strong>Shared factors across tasks:</strong> 일반적으로 많은 학습 작업이 있는 경우 Task는 다른 Task와 공유되는 요인으로 설명되므로 Task 간에 통계적 강점을 공유할 수 있습니다.</li>
<li><strong>Manifolds:</strong> 국소적으로 유클리드 공간으로 간주할 수 있는 위상 공간. 확률 질량은 데이터가 있는 원래 공간보다 차원이 훨씬 작은 영역 근처에 집중됩니다. 이것은 정규화 된 자동 인코더 알고리즘으로 이용되지만 정수 방향에서 질량 집중을 찾고 있다는 것을 명시적으로 고려하는 학습 기준이 개발되어야 합니다.</li>
<li><strong>Natural clustering:</strong> object 클래스와 같은 카테고리 변수의 다른 값은 별도의 매니폴드와 연결됩니다.</li>
<li><strong>Temporal and spatial coherence:</strong> 자연 클러스터링 가정과 유사하지만 관측 시퀀스와 관련이 있습니다. 연속 또는 공간적으로 가까운 관측은 서로 쉽게 예측할 수 있는 경향이 있습니다. 이는 시간 척도에 따라 서로 다른 요인을 서로 다른 범주로 분류하는 데 이용될 수 있습니다.</li>
<li><strong>Sparsity:</strong> 표현 측면에서 이는 종종 0인 특징 또는 더 일반적으로 대부분의 추출된 특징의 작은 변화에 둔감하다는 사실로 나타낼 수 있습니다.</li>
<li><strong>Simplicity of Factor Dependencies:</strong> 상위 수준 표현에서 요소는 단순하고 일반적으로 선형 종속성을 통해 서로 관련됩니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="7-conclusion">7. Conclusion</h1>
<p>딥 러닝과 보다 일반적으로 표현 학습은 머신 러닝에서 최근 몇 년간 의 연구를 통해 이러한 알고리즘의 성능이 인간의 성능에 근접하는 데 있어 몇 가지 주요 과제를 확인할 수 있었습니다. 이러한 과제를  ‘scaling computations’, ‘매개변수 최적화의 어려움 감소’, ‘비용이 많이 드는 추론 및 샘플링 설계’, ‘알려지지 않은 변동 요인을 더 잘 풀어주는 표현 학습 지원’ 네 가지 주요 영역으로 분류했습니다. 이러한 모든 문제를 해결하기 위한 많은 경로를 탐색할 여지가 있으며, 논문에서는 이러한 문제에 대한 몇 가지 매력적인 연구 방향을 제시하였습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Dropout: a simple way to prevent neural networks from overfitting]]></title>
            <link>https://velog.io/@dandelion_26/Dropout-a-simple-way-to-prevent-neural-networks-from-overfitting</link>
            <guid>https://velog.io/@dandelion_26/Dropout-a-simple-way-to-prevent-neural-networks-from-overfitting</guid>
            <pubDate>Sun, 10 Dec 2023 14:09:18 GMT</pubDate>
            <description><![CDATA[<h1 id="핵심-요약">핵심 요약</h1>
<ul>
<li>Deep Neural Network 의 Regularization 방법인 Dropout 을 제시한 논문입니다.</li>
<li>학습 과정에서 일부 Node 를 제외(Drop)하는 것 만으로 Overfitting 을 방지할 수 있는 단순한 방법을 제시했습니다.</li>
</ul>
<h1 id="introduction"><strong>Introduction</strong></h1>
<p>Dropout 이전에도 overfitting 을 해결하기 위한 다양한 방법이 제시되어 왔습니다.</p>
<p>Early Stopping : validation accuracy가 증가하지 않을 때까지 학습</p>
<p>L1/L2 정규화(regularization)</p>
<p>soft weight sharing</p>
<p>논문은 가능한 모든 파라미터의 조합에서 생성된 예측을 학습 데이터의 사후 확률로 가중 평균하였을 때, Bayesian Gold Standard 라 부르는 최고의 정규화 성능을 이룰 수 있다고 말합니다. 그러나 이는 크기가 작고 파라미터 수가 적은 모델이 아닌 경우 적용하기 어렵습니다.</p>
<p>모델을 일반화하기 위한 또다른 방법으로는 Model Combination 이 존재합니다. 구조가 다른 모델이나, 훈련 데이터가 다른 여러 모델의 결과를 종합하는 해당 방법은, 당연하게도 많은 연산량과 학습 시간을 요구합니다.</p>
<p>Dropout 은 신경망을 구성하는 각각의 뉴런을 확률적으로 제외하는 것만으로도, 과적합 해결 및 Model Combination 의 비효율성을 해결할 수 있음을 제시합니다.</p>
<p>(a)와 같이 n 개의 뉴런으로 이루어진 신경망 각각에 Dropout 을 적용한다면, (b)와 같은 subnet을 2^n 개 얻을 수 있습니다. 훈련과정에서 이러한 Dropout 을 수행함으로서, 2^n 개의 신경망을 동시에 학습하는 것과 같은 결과를 얻을 수 있게 됩니다.</p>
<p><img src="https://velog.velcdn.com/images/dandelion_26/post/75517274-884f-4411-8fcc-dc62bc900be4/image.png" alt=""></p>
<p>훈련이 끝나고 모델을 테스트하는 경우에는 모델 구조를 고정해서 사용해야 합니다. 이를 위해, Dropout 을 수행한 뉴론의 가중치에, Dropout 확률을 곱하여 사용합니다. 이 방법으로, 훈련 시기 뉴런의 expected output과 테스트 시기 뉴런의 output 을 일치시킬 수 있습니다.</p>
<h1 id="motivation"><strong>Motivation</strong></h1>
<p>Dropout 의 아이디어는 유성 생식에서 출발합니다. 무성 생식보다 복잡한 유성 생식이 우세한 이유에 대해, 유전 정보를 랜덤하게 섞어 생식을 수행하는 과정에서 유전자가 어떠한 경우에도 원활하게 작동하도록 Robust 하게 진화되었음을 주장합니다. Dropout 또한 학습 과정에서 뉴런이 스스로 Robust 해질 수 있도록 설계한 방법입니다.</p>
<h1 id="model-description"><strong>Model description</strong></h1>
<p>다음의 표기를 사용하여 모델을 설명합니다.</p>
<p>L : hidden layer 갯수</p>
<p>l: 임의의 hidden layer</p>
<p>z(l) : l 번째 layer 의 input vector</p>
<p>y(l) : l 번째 layer 의 output vector</p>
<p>W(l) : l 번째 layer 의 Weight</p>
<p>b(l) : l 번째 layer 의 bias</p>
<p>f : 활성 함수(activation function) : sigmoid, ReLU 등</p>
<p>이 때, Dropout 이 포함된 Feed Forward operation 은 아래와 같습니다.</p>
<p>Bernoulli(p)는 베르누이 이항 분포로, Dropout node 가 p의 확률로  켜짐을 의미합니다.</p>
<p><img src="https://velog.velcdn.com/images/dandelion_26/post/8be5ebe4-e90d-422b-9880-a10331bccd70/image.png" alt=""></p>
<p>앞서 언급했듯, Test시에는 dropout을 사용하지 않고 weight에 확률 p 를 곱하여 사용합니다.</p>
<p><strong>Learning Dropout Nets</strong></p>
<p><strong>Backpropagation</strong></p>
<p>일반적인 신경망과 같이 SGD 를 사용합니다. 단, mini batch 에서 thinned network 를 구성하는 요소에만 SGD 를 적용하며, 이 과정에서 gradient 가 평균화됩니다.</p>
<p>또한 SGD를 보완하기 위한 방법들인 momentum, annealed learning rate, L2 weight decay 등을 dropout 신경망에서 사용할 때도 좋은 결과를 보였음을 제시합니다.</p>
<p>논문은 특히 max norm regularization 이 가장 좋은 효과를 보였다고 합니다. max norm 을 제한된 크기의 가중치 구슬이 가중치 공간을 탐색하는 것으로 비유하며, Dropout 이 가중치 공간에 노이즈를 주어 더 많은 가중치 공간을 빠르게 탐색하는데 도움을 줄 수 있음을 제시합니다.</p>
<h1 id="experimental-results"><strong>Experimental Results</strong></h1>
<p><img src="https://velog.velcdn.com/images/dandelion_26/post/e2b7c480-acb3-42e8-a09f-27fd768e9c8a/image.png" alt=""></p>
<p>위와 같이 이미지, 음성, 자연어 등 다양한 데이터셋을 위한 인공 신경망에 Dropout 을 적용한 결과를 제시합니다.</p>
<p><img src="https://velog.velcdn.com/images/dandelion_26/post/2cc6d83d-57c5-4d14-b320-c1fb5840715f/image.png" alt=""></p>
<p>구조에 관계없이 Dropout 의 적용 여부 만으로 Test Error 가 확연하게 감소한 결과를 제시합니다.</p>
<p><img src="https://velog.velcdn.com/images/dandelion_26/post/61b7b582-4cda-4c93-a627-55965398c821/image.png" alt=""></p>
<p>또한, 다른 Regularization 방법에 비해서도 우수한 성능을 보임을 제시합니다. ReLU 활성 함수를 사용하고 SGD 로 학습하는 동일한 네트워크에서 Regularization 만을 다르게 수행하였을 때, Dropout 을 적용한 경우에 가장 적은 에러를 보입니다.</p>
<h2 id="salient-features"><strong>Salient Features</strong></h2>
<p>Dropout 이 신경망에 미치는 다양한 영향을 분석한 결과를 제시합니다.</p>
<h2 id="effect-on-features"><strong>Effect on Features</strong></h2>
<p>인공신경망의 가중치를 업데이트하는 과정에서 뉴런은 다른 뉴런의 영향이 주어진 상황에서 최적화를 진행합니다. 이렇게 여러 뉴런이 co-adaptation 되는 경우에 신경망은 데이터를 일반화하지 못하고 과적합을 발생시킵니다.</p>
<p><img src="https://velog.velcdn.com/images/dandelion_26/post/f948349f-4afd-41c7-9823-8f87f148e639/image.png" alt=""></p>
<p>(a)는 feature 가 뚜렷하게 관측되지 않고 co-adaptation 이 발생했음을 보입니다.</p>
<p>(b)는 dropout 을 통해 co-adaptation 을 억제하여, 가장자리/선 등 의미있는 feature 를 추출했음을 보입니다.</p>
<h2 id="effect-on-sparsity"><strong>Effect on Sparsity</strong></h2>
<p><img src="https://velog.velcdn.com/images/dandelion_26/post/87d9f81b-6064-4c82-8278-39f4b6a8e200/image.png" alt=""></p>
<p>Dropout 은 hidden unit 의 activation 을 대부분 0으로 만들어 sparse 하게 만듭니다. activation 이 0에 가깝고 high activation 의 비율이 낮은 경우 모델은 더 좋은 성능을 보입니다.</p>
<p>(a) Dropout 미적용시 activation 평균은 2.0이고, 0이 아닌 high activation 이 다수 존재합니다.</p>
<p>(b) Dropout 을 적용할 시 activation 의 평균은 0.7 로 0에 가까워졌고, 대부분 0으로 activation 됩니다.</p>
<h2 id="effect-on-dropout-rate"><strong>Effect on Dropout Rate</strong></h2>
<p><img src="https://velog.velcdn.com/images/dandelion_26/post/98778bdb-9fd5-4fb4-b499-5f7292147f41/image.png" alt=""></p>
<p>Dropout rate p 는 hyperparameter 로 유저에 의해 조정됩니다. 최적의 p 를 테스트하기 위해 진행한 실험과 결과를 제시합니다.</p>
<p>(a) hidden layer 의 뉴런 수 n 을 고정한 경우</p>
<p>p가 증가할수록 Test Error가 감소합니다.</p>
<p>0.4≤p≤0.8 범위에서는 비슷한 Test Error를 보이며 더 효과가 좋아지지는 않았습니다.</p>
<p>그 이상에서는 Underfitting 으로 예상되는 Test Error 증가를 보입니다.</p>
<p>(b) np 를 고정</p>
<p>낮은 p 에서 n 이 늘어나면서, n 을 고정했을 때 보다 더 낮은 Test Error 를 보입니다.</p>
<p>0.6 에서 가장 낮은 Test Error 를 보입니다.</p>
<p>종합했을 때 약 0.6이 최적의 p 이지만, 논문은 편의를 위해 최적에 가까운 0.5 를 사용하는 것을 제안합니다.</p>
<h2 id="effect-of-data-set-size"><strong>Effect of Data Set Size</strong></h2>
<p><img src="https://velog.velcdn.com/images/dandelion_26/post/3eb02016-705c-4b3f-bf41-b79ee4ad3ad2/image.png" alt=""></p>
<p>1000개 이하의 적은 데이터로는 Dropout 이 유의미한 결과를 보이지 못합니다. 이외에도 데이터셋의 크기가 커질 수록 Overfitting 의 가능성이 낮아지므로, Dropout 의 효과 또한 감소하는 것을 확인할 수 있습니다.</p>
<h2 id="monte-carlo-model-averaging-vs-weight-scaling"><strong>Monte-Carlo Model Averaging vs. Weight Scaling</strong></h2>
<p><img src="https://velog.velcdn.com/images/dandelion_26/post/542edc6c-54dc-4d3c-8856-61d416869784/image.png" alt=""></p>
<p>논문은  Test 상황에서도 Dropout 을 수행한 여러 결과를 얻어낸 뒤 이를 평균낸 것이 True modeling 에 가깝다고 말합니다.</p>
<p>이를 증명하기 위해, 서로 다른 Dropout 을 수행한 kk﻿ 개의 모델 출력을 종합한 Monte-Carlo 평균 결과와, weight 를 dropout rate 로 scaling 한 모델의 결과를 비교하여 제시합니다.</p>
<p>kk﻿ 의 갯수가 작으면 평균의 효과를 충분히 보지 못하여 오히려 큰 에러를 보이고, 충분히 큰 k 가 되었을 때에도 weight scaling 과 비슷한 결과를 보입니다.</p>
<p><strong>Dropout RBM</strong></p>
<p>Dropout 을 Feed-forward 신경망이 아닌 랜덤 볼츠만 머신(RBM)에 적용하였을 때도, 더 선명한 Feature 와 좋은 일반화 성능을 보임을 제시합니다.</p>
<p><strong>Marginalizing Dropout</strong></p>
<p>Dropout 은 신경망의 hidden unit 에 노이즈를 추가하는 것으로 볼 수 있습니다. 따라서, Dropout 을 사용한 모델은 stochastic 한 성질을 보입니다.</p>
<p>논문은 이러한 노이즈를 marginalize 하여 dropout 을 deterministic 하게 모델링하는 방법을 제시합니다.</p>
<p>이를 통해, 가장 간단한 Linear Regression 에서 Dropout 은 L2 Regularization 을 수행한 것과 동일하다는 결과를 보입니다.</p>
<h1 id="conclusion"><strong>Conclusion</strong></h1>
<p>Dropout 은 신경망을 구성하는 노드를 임의로 학습에 제거하는 방법만으로 과적합을 방지합니다.</p>
<p>이는 Co-adaptation 을 방지하며 Feature 를 선명하게 만들어줍니다.</p>
<p>이러한 Dropout 은 논문 당시 기준으로 SVHN, ImageNet, CIFAR-100, MNIST 데이터셋에서 State-of-the-art 를 달성하였습니다.</p>
<p>반면 Dropout 으로 인하여 학습 시간이 증가할 수도 있음을 제시하지만, 잡음을 통해서 오히려 신경망을 강건하게 만들어 줄 수 있음을 제시합니다.</p>
<p>이후 Dropout 은 Tensorflow, Keras, Pytorch 등의 딥러닝 라이브러리 등에서 필수적으로 포함된 중요한 기법이 되었습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자료구조_그래프실습]]></title>
            <link>https://velog.io/@dandelion_26/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EA%B7%B8%EB%9E%98%ED%94%84%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@dandelion_26/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EA%B7%B8%EB%9E%98%ED%94%84%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Wed, 09 Aug 2023 13:59:13 GMT</pubDate>
            <description><![CDATA[<h2 id="그래프-자료구조-실습">그래프 자료구조 실습</h2>
<ul>
<li><p>다음 트리의 자료구조 DFS를 탐색해 보시오</p>
<ul>
<li>실행 결과 예</li>
<li>node : A</li>
<li>방문지점 : [&quot;A&quot;]</li>
<li>node : B</li>
<li>방문지점 : [&quot;A&quot;, &quot;B&quot;]</li>
<li>node : C</li>
<li>방문지점 : [&quot;A&quot;, &quot;B&quot;, &quot;C&quot;]</li>
<li>node : D</li>
<li>방문지점 : [&quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;]</li>
<li>node : E</li>
<li>STOP</li>
</ul>
</li>
</ul>
<pre><code class="language-python">graph = {&quot;A&quot; : [&quot;B&quot;, &quot;C&quot;],
        &quot;B&quot; : [&quot;D&quot;, &quot;E&quot;],
        &quot;C&quot; : [&quot;F&quot;, &quot;G&quot;],
        &quot;D&quot; : [&quot;B&quot;],
        &quot;E&quot; : [&quot;B&quot;],
        &quot;F&quot; : [&quot;C&quot;],
        &quot;G&quot; : [&quot;C&quot;]}


def dfs_recursive(graph, start, visited=None):

    if visited is None:
        visited = []

    visited.append(start)
    print(f&quot;방문지점 : {visited}&quot;)

    for node in graph[start]:
        print(f&quot;node : {node}&quot;)

        if node not in visited:
            if node == &quot;C&quot;:
                print(&quot;STOP&quot;)
            else:
                dfs_result = dfs_recursive(graph, node, visited)
                if dfs_result is not None:
                    return dfs_result

    return None
</code></pre>
<ul>
<li>다음의 트리 자료구조를 이용하여 BFS를 탐색해 보시오.</li>
</ul>
<pre><code class="language-python">from collections import deque

def bfs(graph, start):
    visited = []
    queue = deque([start]) 

    while queue:
        node = queue.popleft()
        if node not in visited:

            if node == &quot;E&quot;:
                print(f&quot;node:{node}&quot;)
                print(&quot;STOP&quot;)
                break
            else:
                print(f&quot;node : {node}&quot;)
                visited.append(node)
                print(f&quot;방문지점 : {visited}&quot;)

            queue.extend(graph[node])  

    return None

graph = {&quot;A&quot; : [&quot;B&quot;, &quot;C&quot;],
        &quot;B&quot; : [&quot;D&quot;, &quot;E&quot;],
        &quot;C&quot; : [&quot;F&quot;, &quot;G&quot;],
        &quot;D&quot; : [&quot;B&quot;],
        &quot;E&quot; : [&quot;B&quot;],
        &quot;F&quot; : [&quot;C&quot;],
        &quot;G&quot; : [&quot;C&quot;]}

bfs_result = bfs(graph, &quot;A&quot;)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[자료구조_그래프]]></title>
            <link>https://velog.io/@dandelion_26/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EA%B7%B8%EB%9E%98%ED%94%84</link>
            <guid>https://velog.io/@dandelion_26/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EA%B7%B8%EB%9E%98%ED%94%84</guid>
            <pubDate>Wed, 09 Aug 2023 12:45:14 GMT</pubDate>
            <description><![CDATA[<h2 id="그래프-자료구조">그래프 자료구조</h2>
<ul>
<li>컴퓨터과학 분야에서는 데이터를 저장하는 자료구조에서 그래프 이론을 사용하였다.</li>
<li>그래프의 특칭과 규칙을 갖도록 데이터를 저장한 것이며, 데이터들의 관계를 저장할 때 함께 정의하여 저장할 방법</li>
<li>컴퓨터과학 분야에서는 그래프 자료구조를 표현할 때 노드로 표현한다.</li>
<li>노드의 이름이나　노드의 정의보다는 노드의 수가 중요</li>
<li>그래프 형태로 저장한다는 것은 노드와 간선이 정해진 모델에서 노드와 간선을 정의하여 저장한다는 것</li>
<li>그래프를 배열로 저장한다는 것은 노드 데이터를 배열 자료구조로 저장한다는 것, 간선을 데이터로 표현하여 배열 자료구조로 저장한다는 것</li>
</ul>
<blockquote>
<p>인접리스트로 표현
</br> graph_array = {A:[B, C], B:[A, E], C:[A,D,E], D:[C, E], E:[B,C,D]}</p>
</blockquote>
<blockquote>
<p>2차원 배열로 표현
</br> graph_array = [[0,1,1,0,0], [1,0,0,0,1], [1,0,0,1,1], [0,0,1,0,1], [0,1,1,0]]</p>
</blockquote>
<ul>
<li>연결 리스트에서는 간선에 대한 정보가 아니라 노드에 대한 정보로 간선의 정보를 저장하였으며 배열에서는 노드에 대한 정보가 아니라 간선에 대한 정보를 저장하여 표현한 것을 알 수 있음</li>
<li>그래프 자료구조를 이용하여 여러가지 문제를 쉽게 해결할 수 있음</li>
<li>최단 거리 문제를 해결한 알고리즘인 프림 알고리즘, 크러스컬 아록리점, 다익스트라 알고리즘 등은 데이터를 그래프 자료구조로 저장한 후 저장된 데이터들을 이용하여 최단거리를 찾는 알고리즘</li>
<li>탐색 문제 이외에도 깊이 우선 탐색인 DFS 알고리즘과 너비 우선 탐색인 BFS 탐색 알고리즘이 있다.</li>
</ul>
<h2 id="트리-자료구조">트리 자료구조</h2>
<ul>
<li><p>트리는 그래프의 일종으로 여러 노드가 한 노드를 가리킬 수 없는 구조를 말함</p>
</li>
<li><p>트리도 그래프의 일종이므로 노드와 간선으로 구성된다.</p>
</li>
<li><p>노드와 연결된 노드들 사이에는 부모와 자식 관계가 있으며, 한 방향으로만 연결되어있고, 자식 노드는 반드시 하나의 부모만 갖도록 하는 규칙이 있다.</p>
</li>
<li><p>트리에 여러 가지 규칙을 추가해 다양한 형태의 트리를 정의</p>
</li>
<li><p>자식 노드가 2개 이상을 정의할 수 있는 트리, 이진 트리는 자식 노드가 2개 이하인 트리, 완전 이진 트리는 자식 노드를 추가할 때 왼쪽부터 오른쪽으로 추가하는 규칙을 갖는 트리이고, 균형 이진 트리는 자식 노드의 추가 위치는 상관없지만 왼쪽과 오른쪽 레벨 차이가 1이하가 되도록 노드를 추가하는 트리 구조</p>
</li>
</ul>
<blockquote>
<p>트리에서 사용하는 용어
</br> 트리의 가장 위에 있는 노드 : 루트 노드
</br> 트리의 가장 마지막에 있는 노드 : 리프 노드
</br> 루트 노드와 리프 노드 사이의 노드들을 : 가지 노드
</br> 부모 노드에서 자식 노드가 생성될 때마다 레벨을 정의
</br> 한 부모 노드에서 생성된 노드들을 형제 노드로 정의
</br> 각 노드의 차수는 자식 노드의 개수를 의미</p>
</blockquote>
<ul>
<li>트리 자료구조는 트리의 특징과 규칙을 갖도록 데이터를 저장하는 자료구조</li>
<li>트리의 특징과 규칙으로 저장되지만 트리 자료구조도 기본 자료형과 기본 자료구조로 주기억장치에 저장됨</li>
<li>트리도 기본 자료구조인 연결 리스트와 배열을 이용하여 데이터를 저장할 수 있음</li>
<li>이때의 노드는 특정 값을 가지고 있으며, 하나의 자료구조로 저장된 노드들은 부모와 자식 관계를 갖는 간선임</li>
<li>연결 리스트 자료구조로 저장할 때 각 노드는 두 개의 주소값을 저장할 수 있는 영역을 갖도록 정의</li>
<li>왼족 주소값 영역에는 왼쪽 자식 노드 데이터가 저장된 주소값이 저장되며, 오른쪽 주소값 영역에는 오른쪽 자식 노드 데이터가 저장된 주소값이 저장되도록 정의</li>
<li>2차원 배열 자료구조로 저장할 때는 부모 노드와 자식 노드를 연결 리스트로 연결, 자식 노드를 배열로 표현할 수 있음</li>
<li>이때 인덱스 0에 저장된 데이터는 왼쪽 자식 노드이고, 인덱스 1에 저장된 데이터는 오른쪽 자식 노드로 정의</li>
</ul>
<hr>
<ul>
<li>트리 자료구조는 효율적인 데이터의 삽입과 삭제 방법을 제공</li>
<li>트리 자료구조를 이욯나 문제 해결 알고리즘의 예의 경우, 이진 탐색 알고리즘, 정렬 문제를 트리 자료구조를 이용하여 해결한 힙 정렬 알고리즘 등이 있음</li>
<li>트리는 그래프의 일종으로 컴퓨터과학에서 많이 사용하는 자료구조 중 하나</li>
</ul>
<table>
<thead>
<tr>
<th align="center"></th>
<th align="center">그래프</th>
<th align="center">트리</th>
</tr>
</thead>
<tbody><tr>
<td align="center">정의</td>
<td align="center">노드와 그 노드를 연결하는 간선을 하나로 모아놓은 자료구조</td>
<td align="center">그래프의 한 종류</td>
</tr>
<tr>
<td align="center">방향성</td>
<td align="center">방향/무방향 그래프 모두 존재</td>
<td align="center">방향 그래프</td>
</tr>
<tr>
<td align="center">사이클</td>
<td align="center">사이클 가능</br> 순환/비순환 그래프 모두 가능</td>
<td align="center">사이클 불가능</br> 비순환 그래프</td>
</tr>
<tr>
<td align="center">루트 노드</td>
<td align="center">루트 노드 개념이 없음</td>
<td align="center">한 개의 루트 노드만 존재</td>
</tr>
<tr>
<td align="center">부모-자식</td>
<td align="center">부모-자식 개념이 없음</td>
<td align="center">부모-자식 관계</td>
</tr>
<tr>
<td align="center">모델</td>
<td align="center">네트워크 모델</td>
<td align="center">계층 모델</td>
</tr>
<tr>
<td align="center">간선의 수</td>
<td align="center">그래프에 따라 간선의 수가 다름</br> 간선이 없을 수도 있음</td>
<td align="center">노드가 n인 트리는 항성 n-1의 간선을 가짐</td>
</tr>
</tbody></table>
<h2 id="그래프-순회">그래프 순회</h2>
<ul>
<li><p>순회는 그래프 또는 트리와 같은 연결 구조에서 모든 노드를 순차적으로 탐색하는 방법</p>
</li>
<li><p>하나의 노드로 시작하여 차례대로 모든 노드를 한 번씩 방문하는 방법</p>
</li>
<li><p>모든 노드 또는 특정 노드를 방문하는 방법을 찾기 위한 방법</p>
<blockquote>
<p>예) 도시와 도로를 그래프로 표현하는 경우 특정 도시에서 다른 도시로 갈 수 있는 길이 있는지 확인할 때 순회 방법을 사용할 수 있다.
</br>     전자회로에서 단자와 연결선을 그래프로 표현하는 경우 특정 단자와 연결되어 있는지 확인할 때 순회 방법을 사용할 수 있음</p>
</blockquote>
</li>
<li><p>이와 같이 순회는 그래프 자료구조를 바탕으로 여러 가지 문제를 해결하기 위해 정의, 탐색 알고리즘으로 알려저 있다</p>
</li>
<li><p>깊이 우선 순회 (DSF: Depth First Search), 너비 우선 순회(BSF: Breadth First Search)</p>
</li>
</ul>
<h3 id="깊이-우선-순회">깊이 우선 순회</h3>
<ul>
<li>깊이 우선 순회(DSF)는 시작 노드를 정하고 방문하지 않은 노드가 존재할 때까지 방문하는 방법</li>
</ul>
<blockquote>
<p>규칙</p>
<ul>
<li>현재 노드의 인접 노드 중 방문하지 않은 노드를 방문</li>
<li>방문한 노드의 인접 노드 중 더 이상 방문하지 않은 인접 노드가 존재하지 않으면 방문했던 경로로 되돌아간다</li>
<li>방문하지 않은 노드가 더 이상 존재하지 않으면 종료한다.</li>
</ul>
</blockquote>
<ul>
<li>그래프의 노드를 방문하는 순회를 하기 위해서는 시작 노드를 반드시 정해야 한다</li>
<li>시작 노드를 정하고, 다음 방문 노드는 조건없이 무작위 선택으로 한다고 가정</li>
<li>깊이 우선 순회 규칙에 따라 인접 노드 중 더 이상 방문하지 않은 인접 노드가 존재하지 않으면 방문했던 경로를 되돌아 간다. 계속해서 이 방법을 반복하며, 최초에 선택된 노드로 되돌아 가며 방문하지 않은 인접노드가 없고 시작 노드로 되돌아오고 모든 노드의 순회를 마치고 돌아옴을 알 수 있음</li>
<li>깊이 우선 순회 방법은 시작 노드에서 한 방향으로 마지막 노드까지 방문하고, 방문 경로를 되돌아가면서 방문하지 않은 노드를 확인 후 방문</li>
</ul>
<h3 id="너비-우선-순회">너비 우선 순회</h3>
<ul>
<li>너비 우선 순회(BSF)는 시작 노드를 정하고 인접한 노드를 모두 방문하는 순회 방법</li>
</ul>
<blockquote>
<p>규칙</p>
<ul>
<li>현재 노드의 인접 노드를 모두 방문</li>
<li>인접 노드 중 더 이상 방문하지 않은 인접 노드가 존재하지 않으면 방문했던 경로를 되돌아간다</li>
<li>방문하지 않은 노드가 더 이상 존재하지 않으면 종료</li>
</ul>
</blockquote>
<ul>
<li>너비 우선 순회 방법은 시작 노드와 가까운 노드부터 방문하고 멀리 떨어진 노드를 나중에 방문하는 순회 방법</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[확장형자료구조실습]]></title>
            <link>https://velog.io/@dandelion_26/%ED%99%95%EC%9E%A5%ED%98%95%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@dandelion_26/%ED%99%95%EC%9E%A5%ED%98%95%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Mon, 31 Jul 2023 12:25:24 GMT</pubDate>
            <description><![CDATA[<h1 id="스택">스택</h1>
<ul>
<li>스택은 기본 자료구조에 규칙을 포함한 확장형 자료구조</li>
<li>스택의 규칙은 새로운 데이터를 저장할 때 항상 가장 마지막에 저장하며 이러한 저장 동작을 push, 저장된 데이터를 불러올 때 pop 동작이라고 정의</li>
</ul>
<h2 id="실습-예제">실습 예제</h2>
<h3 id="간단한-스택-추가-및-삭제">간단한 스택 추가 및 삭제</h3>
<pre><code class="language-python">stk = [10, 20, 30]
print(stk)
stk.append(40)
print(stk)
stk.pop()
print(stk)</code></pre>
<h3 id="빈-스택에-데이터-추가-삭제하기">빈 스택에 데이터 추가, 삭제하기</h3>
<ul>
<li>빈스택에 시작해 데이터를 하나씩 추가</li>
<li>1:삽입, 2:삭제, 3:종료</li>
<li>만약 더이상 삭제할 데이터가 없으면 매시지 표시</li>
</ul>
<pre><code class="language-python">stack = []

while True:
    a = int(input(&quot;1 : 삽입, 2 : 삭제, 3 : 종료&quot;))
    if a == 1:
        input_data = input()
        stack.append(input_data)
        print(stack)
    elif a == 2:
        if len(stack) == 0:
            print(&quot;데이터가 없습니다&quot;)
        else:
            del_data = stack.pop()
            print(del_data)
    else:
        break</code></pre>
<h3 id="후기-표기법을-사용한-우선순위-연산">후기 표기법을 사용한 우선순위 연산</h3>
<ul>
<li>push(): 스택 가장 마지막에 데이터 삽입</li>
<li>pop() : 스택의 가장 마지막 데이터 읽음, 스택의 가장 마지막 데이터 삭제</li>
</ul>
<pre><code class="language-python">stack = []

a = list(input().split(&quot;,&quot;))

def push(input_data):
    stack.append(input_data)

def pop():
    del_data = stack[-1]
    stack.remove(stack[-1])
    return del_data

for i in a:
    if i == &quot;+&quot; or i == &quot;-&quot; or i == &quot;*&quot; or i == &quot;/&quot;:
        pop_data = pop()
        pop_data2 = pop()

        if i == &quot;+&quot;:
            push(pop_data2 + pop_data)
        elif i == &quot;-&quot;:
            push(pop_data2 - pop_data)
        elif i == &quot;*&quot;:
            push(pop_data2 * pop_data)
        else:
            push(pop_data2 / pop_data)
    else:
        push(i)</code></pre>
<h1 id="큐">큐</h1>
<ul>
<li>큐는 기본 자료구조에 규칙을 포함한 확장형 자료구조</li>
<li>새로운 데이터를 저장할 때 항상 가장 마지막에 저장하는데, 이 저장 동작을 Enqueue라고 하며, 저장된 데이터를 불러올 때 가장 처음에 저장된 데이터를 불러오며 Dequeue라고 함</li>
</ul>
<h2 id="실습-예제-1">실습 예제</h2>
<h3 id="간단하게-큐-구성하기">간단하게 큐 구성하기</h3>
<pre><code class="language-python">queue = [1, 2, 3]
print(queue)

queue.append(4)
queue.append(5)
print(queue)

print(queue.pop())
print(queue)</code></pre>
<h3 id="은행-업무-프로그램">은행 업무 프로그램</h3>
<pre><code class="language-python">w_no = 100
queue = []

def enqueue(data):
    queue.append(data)

def dequeue(data):
    deq_ob = None
    if len(queue) ==0:
        print(&quot;queue is empty&quot;)
    else:
        deq_ob = queue[0]
        queue.remove(queue[0])

    return deq_ob

while True:

    a = int(input(&quot;1 : 뽑기, 2: 업무처리, 3:종료&quot;))

    if a == 1:
        enqueue(w_no):
        w_no += 1
        print(w_no)
    elif a == 2:
        b == dequeue()
        print(b)
    else:
        break</code></pre>
<h3 id="queue-라이브러리-이용하기">queue 라이브러리 이용하기</h3>
<pre><code class="language-python">import queue

data = [1,2,3,4,5]
que = queue.Queue()

# que에 data값 입력
for i in data:
    que.put(i)
    print(que.qsize())

# que에서 값 출력
for i in range(que.qsize()):
    print(que.get())
    print(que.qsize())</code></pre>
<ul>
<li>데크(deque)를 이용해서 표현<ul>
<li>데크(deque : double-ended queue)는 덱이라고도 읽는다.</li>
<li>큐는 큐이지만 스택과 큐의 기능을 모두 가지고 있어 데이터를 양방향에서 추가하고 제거할 수 있는 자료구조<blockquote>
<p>deque.append() : deque의 오른쪽 끝에 삽입
</br> deque.appendleft() : 덱의 왼쪽 끝에 삽입 </br>
deque.insert() : 특정 인덱스 값을 삽입 </br>
deque.extent() : 주어진 값(배열 포함) 덱 오른쪽에 추가 </br>
deque.pop() : deque의 오른쪽 끝값을 제거 및 반환 </br>
deque.poplist() : deque의 왼쪽 끝값을 제거 및 반환 </br>
deque.remove() : 삭제하고 싶은 값을 deque에서 찾으며, 삭제</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<h3 id="deque-라이브러리-이용하기">deque 라이브러리 이용하기</h3>
<pre><code class="language-python">from collections import deque

que = deque([1,2,3])
que.append(4)
que.append(5)
print(que)

que.appendleft(0)
print(que)

que.insert(2,7)
print(que)

arr = [8,9]
que.extend(arr)
print(que)

print(que.pop())
print(que)

print(que.popleft())
print(que)

que.remove(7)
print(que)</code></pre>
<h2 id="연습문제-1">연습문제 1</h2>
<ul>
<li>스택과 큐를 이용한 문제 해결방법, 회문 찾기 문제를 풀어보자</li>
<li>Palindrome이란 거꾸로 읽어도 제대로 읽는 것과 같은 문장이나 단어, 숫자, 문자열을 말한다</li>
<li>기러기 등등</li>
<li>큐와 스택에 문자열을 저장</li>
</ul>
<pre><code class="language-python">def palindrome(data):

    stack = []
    q = []
    for word in data:
        stack.append(word)
        q.append(word)
    for word in data:
        if stack.pop() == q.pop(0):
            print(&quot;True&quot;)
        else:
            print(&quot;False&quot;)

data = input()</code></pre>
<h2 id="연습문제-2">연습문제 2</h2>
<ul>
<li>출력문에서 괄호를 확인하는 스택문제</li>
</ul>
<pre><code class="language-python">stack = []
cnt = 0

for i in a:
    if i == &quot;(&quot;:
        stack.append(i)
        print(stack)
        cnt += 1
    elif i == &quot;)&quot;:
        stack.pop()
        print(stack)
        cnt -= 1
    else:
        pass
if cnt == 0:
    print(&quot;OK&quot;)
else:
    print(&quot;error&quot;)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[확장형 자료구조]]></title>
            <link>https://velog.io/@dandelion_26/%ED%99%95%EC%9E%A5%ED%98%95-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@dandelion_26/%ED%99%95%EC%9E%A5%ED%98%95-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Mon, 31 Jul 2023 11:38:00 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>자료구조란 주기억장치에 데이터를 저장하는 방식을 구조적으로 정의하는 것을 말하고, 알고리즘은 문제를 해결하는 방식을 말한다.</p>
</li>
<li><p>이때 자료구조인 데이터를 저장하는 방식에 특별한 문제를 해결하기 위하여 문제 해결의 절차, 즉 알고리즘을 포함한 자료구조가 존재</p>
</li>
<li><p>기본 자료구조에 문제 해결을 위한 특정한 규칙을 포함시킨 자료구조로써 확장형 자료구조라 정의하였음</p>
</li>
<li><p>스택, 큐, 트리, 그래프를 포함시켜 설명함</p>
</li>
<li><p>스택과 큐는 선형 자료구조에 속해 데이터가 저장될 때 순서를 가지고 저장되는 구조를 가지므로, 순서에 맞추어 데이터에 접근하고 수정, 삭제할 수 있다</p>
</li>
<li><p>스택과 큐는 알고리즘을 포함한 자료구조라 정의할 수 있음</p>
</li>
</ul>
<h2 id="스택">스택</h2>
<ul>
<li><p>스택은 기본 자료구조에 규칙을 포함한 확장형 자료구조, 규칙은 데이터를 저장하는 규칙을 말한다</p>
</li>
<li><p>새로운 데이터를 저장할 때 항상 가장 마지막에 저장하며, 이러한 저장 동작을 <strong>push</strong>라고 부름</p>
</li>
<li><p>스택은 저장된 데이터를 불러올 때 가장 마지막에 저장된 데이터를 읽어오며, 이러한 동작을 <strong>pop</strong>이라고 부름</p>
</li>
<li><p>스택은 이와 같은 규칙을 갖고 있어서 데이터가 들어가고 나오는 출구가 하나인 자료구조라고 하기도 하고, LIFO(Last In First Out)구조라 함</p>
</li>
<li><p>기본 자료구조의 경우 순서가 상관이 없고, 배열이나 연결 리스트의 경우 인덱스를 알아야 한다. 하지만 스택의 경우 무조건 가장 마지막에 젖아한 데이터를 불러온다.</p>
</li>
<li><p>스택의 경우, 기본 자료구조, 배열 자료구조, 연결 리스트 자료구조등 다양하게 구현이 가능하다.</p>
</li>
</ul>
<h3 id="스택을-이용한-문제-해결-예">스택을 이용한 문제 해결 예</h3>
<blockquote>
<p>괄호 확인 문제
프로그래밍할 때 열린 괄호의 수와 닫힌 괄호의 수가 다르면 프로그램 오류가 발생한다. 이때 오류 발생 프로그램은 괄호 확인 문제를 해결한 프로그램</p>
</blockquote>
<pre><code class="language-python">print(&quot;계산결과는 {0}입니다.&quot;.format((int(a)+int(b))))</code></pre>
<ul>
<li>예문을 본다면 열린 괄호의 수는 5개이고, 닫힌 괄호 수도 5개이다.</li>
<li>열린 괄호의 수와 닫힌 괄호의 수를 확인하는 프로그램은 스택 자료구조를 이용하면 쉽게 프로그래밍할 수 있다.</li>
</ul>
<h4 id="괄호개수-저장-문제">괄호개수 저장 문제</h4>
<ul>
<li>괄호의 개수를 저장하는 변수를 하나 정의한 후 왼쪽 괄호를 만나면 괄호 개수 저장변수를 하나 저장시키고, 오른쪽 괄호를 만나면 괄호 개수 저장변수를 하나 감소시킨다.</li>
<li>입력된 문자열을 모둔 확인하고 난 후 괄호 개수 저장변수의 값을 확인하면, 괄호 개수가 맞는지 틀리는지 확인할 수 있다</li>
</ul>
<pre><code class="language-python">a = input()
cnt = 0
for i in a:
    if i == &quot;(&quot;:
        cnt += 1
    elif i == &quot;)&quot;:
        cnt -= 1
if cnt == 0:
    print(&quot;ok&quot;)
else:
    print(&quot;error&quot;)</code></pre>
<ul>
<li>일반 알고리즘을 이용하여 푸는 방법</li>
</ul>
<pre><code class="language-python">cnt = []

def push(push_data):
    cnt.append(int(push_data))

def pop():
    cnt.remove(cnt[-1])

a = input()

for i in a:
    if i == &quot;(&quot;:
        push(i)
    elif i == &quot;)&quot;:
        pop(i)
if len(cnt) == 0:
    print(&quot;ok&quot;)
else:
    print(&quot;error&quot;)</code></pre>
<ul>
<li>스택 자료구조를 이용한 괄호 문제 해결</li>
</ul>
<h4 id="우선순위-연산-문제">우선순위 연산 문제</h4>
<ul>
<li>컴퓨터에서는 산술 연산자마다 우선순위가 있다.</li>
<li>우선순위에 따른 연산을 하는 문제</li>
<li>컴퓨터에 연산자와 피연산자를 표현하는 방법에는 후위 표기법, 전위 표기법, 중위 표기법의 세가지가 존재<ul>
<li>중위 표기법은 기본 표기법으로 피연산자를 연산자들 중간에 표현하는 표기법</li>
<li>전위 표기법과 후위 표기법은 연산자와 피연산자를 분리하여 표기하는 방법<ul>
<li>전위 표기법은 연산자를 피연산자 앞에 두는것, 후위 표기법은 피연산자를 연ㅅ나자들 뒤에 표기하는 법</li>
</ul>
</li>
</ul>
</li>
</ul>
<blockquote>
<p>우선순위 연산(후위 표기법 사용)
A<em>B-C/D 연산 -&gt; ((AB)\</em>(CD)/) -&gt; AB*CD/-</p>
</blockquote>
<ul>
<li>스택자료구조로 해결 하는 방법 : 피연산자는 스택에 push하고 연산자이면 스택에 저장된 데이터를 pop하여 연산후 다시 결과 데이터를 push한다.</li>
<li>연산식을 마치면 마지막 스택에 저장된 데이터를 pop하여 결과로 출력한다.</li>
</ul>
<pre><code class="language-python">stack = []

def push(push_data):
    stack.append(int(push_data))

def pop():
    a = 0
    a = stack[-1]
    stack.remove(stack[-1])
    return a

a = list(input().split(&quot;,&quot;))

for i in a:
    if i == &quot;+&quot; or i == &quot;-&quot; or i == &quot;*&quot; or i == &quot;/&quot;:
        pop_data = pop()
        pop_data2 = pop()

        if i == &quot;+&quot;:
            push(pop_data2 + pop_data) # 스택이기에 순서 필수

        elif i == &quot;-&quot;:
            push(pop_data2 - pop_data)

        elif i == &quot;*&quot;:
            push(pop_data2 * pop_data)

        elif i == &quot;/&quot;:
            push(pop_data2 / pop_data)

    else:
        push(i)
print(pop())</code></pre>
<ul>
<li>스택을 정의하고 스택의 동작인 push와 pop을 정의한다.</li>
</ul>
<h2 id="큐">큐</h2>
<ul>
<li><p>큐(Queue)는 기본 자료구조에 규칙을 포함한 확장형 자료구조</p>
</li>
<li><p>규칙은 데이터를 저장하는 규칙을 말한다</p>
</li>
<li><p>큐의 규칙은 매우 간단</p>
<ul>
<li>새로운 데이터를 저장할 때 항상 가장 마지막에 저장하며, 이러한 저장 동작의 경우 일반적으로 Enqueue 동작이라고 함</li>
<li>큐는 저장된 데이터를 불러올 때 가장 처음에 저장된 데이터를 읽어오며, 이러한 불러오기 동작을 Dequeue 동작이라고 함</li>
</ul>
</li>
<li><p>큐를 데이터가 들어가고 나오는 출구가 다른 자료구조라고 하기도하고, 가장 빨리 저장된 데이터를 가장 빨리 불러올 수 있는 의미로 FIFO(Fisrt In First Out) 구조라고 함</p>
</li>
<li><p>큐는 기본 자료구조에 규칙을 포함시킨 자료구조, 실질적으로 주기억장치에 데이터가 저장되는 구조는 기본 자료구조인 배열이나 연결 리스트로 저장됨</p>
</li>
<li><p>큐도 배열 자료규조를 이용하여 구현할 수 있고, 연결 리스트 자료구조를 이용하여 구현할 수 있다.</p>
</li>
</ul>
<h3 id="큐를-이용하여-해결하는-문제">큐를 이용하여 해결하는 문제</h3>
<h4 id="대기자-명단">대기자 명단</h4>
<ul>
<li>대기자 명단등을 큐라고 한다.</li>
<li>큐는 일반적인 순서를 정하는 프로그램에 많이 사용</li>
<li>은행 업무 프로그램에서 대기표 관리 프로그램은 큐로 해결한 대표적인 문제</li>
</ul>
<pre><code class="language-python">w_no = 100
queue = []

def enqueue(data):
    queue.append(data)

def dequeue(data):
    deq_ob = None
    if len(queue) ==0:
        print(&quot;queue is empty&quot;)
    else:
        deq_ob = queue[0]
        queue.remove(queue[0])

    return deq_ob

while True:

    a = int(input(&quot;1 : 뽑기, 2: 업무처리, 3:종료&quot;))

    if a == 1:
        enqueue(w_no):
        w_no += 1
        print(w_no)
    elif a == 2:
        b == dequeue()
        print(b)
    else:
        break</code></pre>
<ul>
<li>큐는 시스템 프로그램에서 우선쉰위가 같은 작업을 예약하는 데 사용되며, 특히 운영체제에서 프로세스 관리 시스템을 개발할 때 사용되는 자료구조</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[기본자료구조 실습]]></title>
            <link>https://velog.io/@dandelion_26/%EA%B8%B0%EB%B3%B8%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@dandelion_26/%EA%B8%B0%EB%B3%B8%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Wed, 26 Jul 2023 10:19:28 GMT</pubDate>
            <description><![CDATA[<h2 id="배열">배열</h2>
<ul>
<li>리스트와 배열의 차이점</li>
</ul>
<table>
<thead>
<tr>
<th align="center">리스트</th>
<th align="center">배열</th>
</tr>
</thead>
<tbody><tr>
<td align="center">다양한종류의 데이터를 담을 수 있다</br> 반복문을 사용하여 연산을 수행하기에 상대적으로 수행하는 속도가 느리다. </br> 연산 처리 시 전체 리스트로 연산한다</td>
<td align="center">동일한 종류의 데이터만 담을 수 있다 </br> 연속된 메모리에 데이터를 저장한다. </br> 간단한 연산 처리가 가능하고 수행하는 속도가 빠르다 </br> 연산 처리시 각 요소별로 연산한다.</td>
</tr>
</tbody></table>
<ul>
<li>파이썬에서는 numpy 라이브러리를 통하여 쉽게 구현가능</li>
</ul>
<pre><code class="language-python"># 리스트
list_1 = [1,&quot;가&quot;,3.14,[&quot;a&quot;,&quot;신호등&quot;,&quot;3&quot;]]
print(list_1, type(list_1))

# 리스트로 1차원 배열 표현하기 : for 문 사용
list_1 = []
for i in range(1, 7):
    list_1.appned(i)
print(list_1, type(list_1))

# 하나의 리스트로 2차원 배열 표현하기 for 문 사용
list_1 = []
for i in range(2):
    list_1.append([0]*3)
print(list_1, type(list_1))

# 하나의 리스트로 2차원 배열 표현하기 for 문 사용
list_1 = [[0]*3 for i in range(3)] # list comprehension
print(list_1, type(list_1))

# 배열(1)
# 방법 1: 1차원 배열
import numpy as np
arr=np.arange(1, 7)
print(arr, type(arr))

# 방법 2: 1차원 배열
import numpy as np
arr=np.array([1,2,3,4,5,6])
print(arr, type(arr))

# 방법 3: 2차원 배열
import numpy as np
arr=np.array([[1,2],[3,4],[5,6]])</code></pre>
<h3 id="리스트와-배열의-차이점">리스트와 배열의 차이점</h3>
<pre><code class="language-python"># 방법 1 : for 문을 1번 사용해서 2차원 배열 만들기
arr1 = [[1,2],[3,4],[5,6]]
for i in arr1:
    print(i)
# 방법 2: for 문을 1번 사용해 2차원 배열 만들기
arr1=[[1,2],[3,4],[5,6]]
for i,j in arr1:
    print(i,j)
# 방법 3: while 문을 1번 사용해 2차원 배열 만들기
arr1=[[1,2],[3,4],[5,6]]
n=0
while n &lt; len(arr1):
    i=arr1[n]
    print(i)
    n+= 1
# 방법 4: 중첩 반목분(2중 for문) 사용해 2차원 배열 만들기
arr1=[[1,2],[3,4],[5,6]]
for i in arr1:
    for j in i:
        print(j, end=&quot; &quot;)
    print(&#39;&#39;)</code></pre>
<h3 id="2차원-배열값-변경하기">2차원 배열값 변경하기</h3>
<pre><code class="language-python">arr1=[[1,2],[3,4],[5,6]]
for i in arr1:
    print(i)
print(arr1[1][1]) # arr[1,1]
arr1[1][1] = 10
arr1</code></pre>
<h3 id="1차원-배열값-추가하기">1차원 배열값 추가하기</h3>
<pre><code class="language-python"># 숫자 8,4,9,10을 arr2에 추가
arr2=[]

# 삽입1
for i in range(4):
    arr2.append(int(input()))
print(arr2)

# 삽입2
while True:
    i2 = int(input())

    if i2 = &quot; &quot;: # 스페이스 입력시 종료
        print(&quot;종료&quot;)
        break

    add_arr=int(input())

    arr2.insert(int(i2), add_arr)
    print(arr2)</code></pre>
<h3 id="1차원-배열값-삭제하기">1차원 배열값 삭제하기</h3>
<pre><code class="language-python">arr3=[8,4,9,10]

while True:
    mode=int(input()) # 1: pop, 2:del, 3:remove
    if mode==1:
        t1=int(input())
        result=arr3.pop(t1)
        print(result)
        break
    elif model==2:
        t1=int(input())
        del(arr3[t1])
        print(arr3)
        break
    else:
        print(arr3)
        t1=int(input())
        arr3.remove(t1)
        print(arr3)
        break</code></pre>
<h2 id="연결-리스트">연결 리스트</h2>
<ul>
<li>연결 리스트(Linked List)는 리스트들이 연결되어 있다는 의미</li>
<li>리스트들이 한 줄로 연결된 방식의 선형 자료 구조</li>
<li>연결 리스트의 각 원소를 노드(node)라고 하고, 이 노드는 데이터와 뒤쪽 노드를 각리키는 주소(포인터)를 가지고 있다</li>
<li>이때 바로 앞에 있는 노드를 앞쪽 노드, 뒤에 있는 노드를 뒤쪽 노드라고 한다</li>
<li>시작 노드는 헤드(head)라고 한다.</li>
</ul>
<pre><code class="language-python">A = {8:[65, 4], 4:[54, 9], 9:[12, None]}
print(A)

A[8][0]=65
A[8][1]=4 # 다음 데이터의 키
# 생략
A[9][1]=None

def SinglyLinkedList(A,root):
    head=root
    node_next=head

    while node_next!=None:
        node_value=A[node_next][0]
        node_next=A[node_next][1]
        print(f&#39;value : {node_value}&#39;)

SingllyLinkedList(A, 8)</code></pre>
<ul>
<li>연결리스트 2</li>
</ul>
<pre><code class="language-python">a={&quot;h&quot;:[8,&quot;t&quot;],&quot;t&quot;:[4,&quot;u&quot;],&quot;u&quot;:[9, None]}

# 노드 순회
def test1(a, root_key):
    head=root_key
    node_next=head
    while True:
        node_value = a[node_next][0]
        node_next = a[node_next][1]
        print(f&quot;vlaue : {node_value}&quot;)

        if node_ndex == None:
            break
test1(a, &quot;h&quot;)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[기본 자료구조 - 배열, 연결 리스트]]></title>
            <link>https://velog.io/@dandelion_26/5.-%EA%B8%B0%EB%B3%B8-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EB%B0%B0%EC%97%B4-%EC%97%B0%EA%B2%B0-%EB%A6%AC%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@dandelion_26/5.-%EA%B8%B0%EB%B3%B8-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EB%B0%B0%EC%97%B4-%EC%97%B0%EA%B2%B0-%EB%A6%AC%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Wed, 26 Jul 2023 08:36:24 GMT</pubDate>
            <description><![CDATA[<h2 id="기본-자료구조와-확장형-자료구조">기본 자료구조와 확장형 자료구조</h2>
<ul>
<li><p>자료구조는 데이터를 주기억 장치에 저장하는 것에 중점을 두고 만들어진 방법</p>
</li>
<li><p>데이터를 주기억 정치에 저장하는 것이 가장 큰 문제였음</p>
<ul>
<li>데이터를 어덯게 주기억 장치에 저장해야 주기억 장치를 효율적으로 사용하고 저장된 데이터를 빨리 찾을 수 있을 까의 문제였음</li>
<li>주기억장치에 어떤 데이터를　저장할지　연구하여　정의된　것이　자료구조</li>
</ul>
</li>
<li><p>지금까지 정의된 자료구조에는 배열, 연결 리스트, 스택, 큐, 트리, 그래프가 있다.</p>
</li>
<li><p>정의된 자료구조들은 함께 저장하는 방식에 따라 선형 자료구조와 비선형 자료구조로 나누어진다.</p>
</li>
</ul>
<h3 id="선형-자료구조">선형 자료구조</h3>
<ul>
<li>배열, 연결 리스트, 스택, 큐는 순서가 정해져 있는 자료구조</li>
<li>데이터를 정해진 자료형으로 순서대로 저장하는 것을 말하며, 저장된 여러 개의 데이터 중에서 특정 데이터에 순차적으로 접근할 수 있고, 접근 방법을 제시</li>
</ul>
<h3 id="비선형-자료구조">비선형 자료구조</h3>
<ul>
<li>트리, 그래프는 순서가 정해지지 않은 자료구조</li>
<li>데이터를 정해진 자료형으로 순서와 상관없이 저장한다</li>
<li>기본 자료구조를 하나가 아닌 다양하게 적용하여 표현한다.</li>
<li>저장된 여러 개의 데이터 중에 특정 데이터에 접근하려면 저장된 규칙을 잘 이해하고 알아야 접근할 수 있음</li>
</ul>
<hr>
<ul>
<li><p>기본 자료구조는 실제 주기억장치에 저장되는 방법을 말함</p>
</li>
<li><p>스택, 큐, 트리, 그래프는 추상적 자료구조로, 기본 자료구조에 추상적으로 특정한 규칙을 포함시킨 자료구조</p>
</li>
<li><p>특정한 규칙을 가지고 저장하였으므로, 저장된 데이터를 찾아올 때도 특정한 규칙에 맞추어 찾아올 수 있다.</p>
</li>
<li><p>기본 자료구조에 특정한 규칙을 포함시켰다는 것은 다음과 같이 설명할 수 있다.</p>
</li>
<li><p>스택, 큐, 트리, 그래프를 실제 구현할 때는 다음과 같이 각각의 자료 규칙에 맞게 기본 자료구조로 저장하는 것을 말함</p>
</li>
<li><p>기본 자료구조를 바탕으로 특정한 규칙을 프로그래밍으로 구현 가능</p>
</li>
</ul>
<blockquote>
<p>배열로 구현한 스택 / 연결 리스트로 구현한 스택 </br>
배열로 구현한 큐 / 연결 리스트로 구현한 큐 </br>
배열과 연결 리스트로 구현한 트리 </br>
배열과 연결 리스트로 구현한 그래프 </br></p>
</blockquote>
<ul>
<li>배열로 구현한 스택은 스택 자료구조가 갖는 특정한 규칙으로 데이터를 저장하는데, 이때 배열 기본 자료구조로 저장하는 것을 말함</li>
<li>특정한 규칙이라는 것은 그 규칙에 맞게 저장하도록 프로그래밍하는 것</li>
<li>특정한 규칙을 알고리즘이라 표현 -&gt; 자료구조를 학습하면 알고리즘과 자연스럽게 맞물린다</li>
</ul>
<p><strong>데이터를 저장하는 것에 중점을 둔 규칙은 자료구조, 일반 문제를 해결하는 것에 중점을 둔 규칙은 알고리즘</strong></p>
<h2 id="기본-자료구조">기본 자료구조</h2>
<ul>
<li>배열과 연결리스트 (C 언어에서 제공하는 자료 구조)</li>
</ul>
<h3 id="배열">배열</h3>
<ul>
<li>Array(배열)은 번호와 번호에 대응하는 데이터들로 이루어진 자료구조</li>
<li>데이터를 순차적으로 저장하며, 개념이 쉽고, 사용하기 편하지만 메모리 사용 효율성이 낮다</li>
<li>배열의 가장 큰 장점은 개념이 단순하고 쉬워 사용하기 쉽고, 저장된 데이터에 빨리 접근할 수 있다는 점</li>
<li>변수도 데이터형으로 변형되어 주기억장치에 저장되는데, 변수는 변수 이름 데이터가 저장되는 공간 이외에 주소 저장 공간까지 할당</li>
<li>이 주소 공간에는 데이터가 저장된 주소가 저장된다</li>
<li>하지만 우리가 저장하고자 하는 데이터는 자기 자신이 저장된 위치를 알지 못하며 알필요가 없고 우리는 반드시 변수로 접근해야 함</li>
</ul>
<hr>
<ul>
<li>하나의 변수에 여러 개의 데이터를 배열 자료구조 방식으로 저장하면, 데이터 개수만큼 주기억장치 공간이 확보된 상태에서 데이터를 연달아 저장하게 된다.</li>
<li>이는 첫 번째 데이터가 저장된 주소의 다음 주소에 두 번째 데이터가 저장된다는 의미, 그 다음 데이터는 이전 데이터가 저장된 주소의 다움 주소에 저장된다는 의미</li>
<li>데이터가 저장된 위치인 주소를 살펴보면, 변수 이름 옆에 저장된 주소는 첫 번째 데이터가 저장된 주소이므로 첫 번째 데이터가 저장된 위치의 주소는 변수로 접근했을 때 주소 변동이 없다.</li>
<li>하지만 두 번째 데이터는 첫 번째 데이터가 저장된 주소의 다음 주소이므로 1 증가된 주소인 것을 알 수 있다. 세 번째 데이터는 첫 번째 데이터가 저장된 주소의 2 증가된 주소에 저장되는 것을 알 수 있다</li>
</ul>
<hr>
<ul>
<li>배열 자료구조는 주기억장치에 데이터가 일정 공간 확보된 상태에서 주소값이 일정하게 변화되는 형태로 연달아 저장되는 구조</li>
<li>배열 자료구조를 이용하여 데이터를 저장하면, 저장된 데이터를 찾을 때 인덱스 값으로 바로 위치에 접근할 수 있기 때문에 빨리 찾을 수 있다</li>
<li>하지만 데이터 삽입 또는 삭제 시 효율적이지 않음</li>
<li>주기억장치 공간을 미리 확보하지 않으면 새로운 데이터를 삽입하기 위하여 공간을 다시 확보해야 하며, 삭제되었을 때도 사용하지 않는 공간이 지속적으로 할당될 수 있어 주 기억장치의 효율성이 떨어질 수 있다.</li>
<li>또한 새로운 데이터를 두번째에 삽입하기 위해서는 두 번째 주소 위치를 확보하기 위하여 데이터 2와 데이터 3의 위치를 모두 변환시켜야 한다.</li>
<li>또 두 번째 데이터를 삭제하고자 하면, 삽입과 마찬가지로 다음 위치에 저장된 모든 데이터 위치를 변화시켜야 한다.</li>
<li>이처럼 배열 자료구조는 저장된 데이터를 찾기 쉽지만, 삽입 또는 삭제 연산의 효율성이 떨어지는 것을 알 수 있다.</li>
</ul>
<blockquote>
<p>파이썬의 리스트형은 파이썬에서만 제공하는 특 자료구조로 실제 주기억장치에 배열로 저장되는지 알 수 없음 </br>
하지만 저장된 데이터 접근을 인덱스로 사용하는 방법이 배열과 유사</p>
</blockquote>
<pre><code class="language-python">a = [8, 4, 9]

a[0] = 8
a[1] = 4
a[2] = 9

a[0] + a[1] = 12
a[1] / 2 = 4
a[2] * 3 = 27

a.append(10) # 10삽입
a.[1] = 5 # 1번 인덱스의 데이터를 5로 수정
del a[2] # 세번째 데이터 삭제</code></pre>
<h3 id="연결-리스트">연결 리스트</h3>
<ul>
<li>연결 리스트(Linked List)는 영문 그대로 번역하면 연결된 리스트를 말한다.</li>
<li>리스트들이 연결되어 있다는 의미를 용어에서도 알 수 있듯이, 리스트가 한 줄로 연결된 방식의 자료구조</li>
<li>리스트는 데이터 저장 공간과 주소 저장 공간으로 구성되는데, 이것을 C프로그래밍 언어에서는 노드라고 한다</li>
<li>이 때 주소 저장 공간에는 다음에 저장되는 데이터가 저장되는 주소를 저장한다.</li>
<li>C 프로그래밍 언어에서 이 주소 저장 공간을 포인터라고 명명하여, 연결 리스트를 공부하다보면 노드와 포인터라는 단어를 많이 사용</li>
<li>연결 리스트는 개념이 배열보다 복잡, C 프로그래밍 언어를 사용하여 구현할 때 포인터를 함께 정의해야 하기에 배열보다 구현이 까다롭다</li>
</ul>
<hr>
<ul>
<li>연결 리스트는 메모리 사용 효율성이 높아 많은 데이터를 저장할 때 유리</li>
<li>삽입, 삭제 연산이 효율적인 장점을 가지고 있지만, 데이터 접근이 느린 단점을 보유</li>
<li>단일 연결 리스트, 이중 연결 리스트, 원형 연결 리스트 등으로 구현이 가능</li>
</ul>
<hr>
<ul>
<li>연결 리스트 자료구조로 저장되는 데이터는 변수처럼 각각 다른 데이터가 저장된 주소를 저장할 공간을 함께 할당 받아 저장</li>
<li>주기억장치에서 하나의 변수 이름에 저장될 때도 데이터들이 주기억장치의 여러 주소 공간에 독립적으로 저장, 각각 연결되어 있다는 것을 저장된 주소값으로 정의</li>
</ul>
<pre><code class="language-C">typedef struct Node{

  int data;
  struct Node* next;

} Node;</code></pre>
<ul>
<li>데이터의 주소를 저장하는 위치를 포인터로 정의하기 때문에 항상 데이터와 포인터가 함께 정의된다.</li>
<li>C로 구현한 연결 리스트에서 노드(Node)를 정의한 코드를 살펴보면, 정수형 데이터와 별을 표시하여 next라는 값은 다음 데이터 주소를 저장한 공간으로 정의</li>
<li>데이터들을 연결 리스트로 저장했을 때 데이터에 접근하는 방식과 데이터 삽입, 삭제 연산을 볼때, 데이터 100개가 연결 리스트로 저장되어 있고, 90번째 데이터에 접근하여 찾아오고 싶을 때는?<ul>
<li>첫 번째 데이터부터 차례대로 89번째 까지 찾아 들어가야 한다</li>
</ul>
</li>
<li>배열은 인덱스값 자체가 저장된 주소의 위치를 의미하므로 바로 찾을 수 있지만, 연결 리스트는 그렇지 않다 </br></li>
<li><strong>연결리스트는 데이터 접근 효율성이 떨어짐</strong></li>
<li>지정된 곳에 새로운 데이터를 삽입하고자 하면, 연결 리스트는 지정된 위치의 이전 데이터와 함께 저장된 주소를 새로운 데이터가 저장된 주소로 바꾸고, 새로 저장되는 데이터와  함께 저장되는 주소는 이전 데이터와 저장되어 있던 주소를 저장하면 다음 데이터 주소가 저장되므로 연결 된다</li>
<li>모든 리스트의 주소를 변경할 필요가 없어 배열보다 삽입 연산이 효율적</li>
<li>삭제도 삭제델 위치의 이전 데이터가 가지고 있는 주소를 삭제되는 데이터가 가지고 있었던 주소로 바꾸어 주기만 하면 된다</li>
<li><strong>삭제 연산또한 배열처럼 모든 데이터의 주소를 바꿀 필요가 없어 효율적</strong></li>
<li><strong>메모리 사용 효율성을 살펴볼 때, 모든 데이터의 경우 따로 저장되기 때문에 많은 데이터를 저장할 때도 주기억장치의 작은 공간들만 있으면 저장할 수 있어 메모리 효율성이 높다</strong></li>
</ul>
<hr>
<ul>
<li>연결리스트의 경우 파이썬의 딕셔너리 자료형을 이용해 구현 가능<pre><code class="language-python">a = {&#39;h&#39; : [8, t], &#39;t&#39; : [4, &#39;u&#39;], &#39;u&#39; : [9, null]}
</code></pre>
</li>
</ul>
<p>a[&#39;h&#39;][0] = 8
a[&#39;h&#39;][1] = &#39;t&#39; # 다음 데이터의 키
a[&#39;t&#39;][0] = 4
a[&#39;t&#39;][1] = &#39;u&#39; # 다음 데이터의 키
a[&#39;u&#39;][0] = 4
a[&#39;u&#39;][1] = null # 다음 데이터의 키</p>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[추천 시스템 평가]]></title>
            <link>https://velog.io/@dandelion_26/%EC%B6%94%EC%B2%9C-%EC%8B%9C%EC%8A%A4%ED%85%9C-%ED%8F%89%EA%B0%80</link>
            <guid>https://velog.io/@dandelion_26/%EC%B6%94%EC%B2%9C-%EC%8B%9C%EC%8A%A4%ED%85%9C-%ED%8F%89%EA%B0%80</guid>
            <pubDate>Sat, 22 Jul 2023 09:27:31 GMT</pubDate>
            <description><![CDATA[<ul>
<li>추천 시스템을 활용해 서비스각 성장하려면 반드시 평가가 실행되어야 한다.</li>
<li>추천 시스템 평가에는 크게 온라인 평가와 오프라인 평가, 사용자 스터디가 있다.</li>
</ul>
<h2 id="3가지-평가-방법">3가지 평가 방법</h2>
<ol>
<li>오프라인 평가</li>
</ol>
<ul>
<li>실제 서비스상에서의 열람, 구매 등 사용자 행동 이력에서 얻은 과거의 로그(서비스 로그)를 사용해 모델의 예측 정밀도 등을 평가한다.</li>
<li>서비스 로그를 사용하는 온라인 평가의 장점은 평가 비용이 낮고 데이터양이 풍부하기 때문에 평가 결과의 분산이 적다</li>
<li>오프라인 평가의 경우 실제 비즈니스 목표인 사용자 만족도나 매출에 기여하지 않는 경우도 존재</li>
<li>오프라인 평가에서는 비즈니스 목적의 대체 지표인 오프라인 평가 지표를 적절히 설정해야 한다.</li>
</ul>
<ol start="2">
<li>온라인 평가</li>
</ol>
<ul>
<li>온라인 평가는 새로운 테스트 대상으 추천 모델이나 새로운 사용자 인터페이스를 일부 사용자에게 실제로 표시함으로써 평가를 수행한다.</li>
<li>따라서 매출 등 비즈니스 목표에 얼마나 기여했는지 직접 알 수 있어 오프라인 평가보다 정확한 평가를 수행하기 쉽다.</li>
<li>출시까지 수행하는 구현 비용이 높고 아직 신규 추천 모델의 성능이 좋지 않은 경우 사용자 만족도를 떨어뜨릴 위험이 있다.</li>
</ul>
<ol start="3">
<li>사용자 스터디</li>
</ol>
<ul>
<li>사용자 스터디에 의한 평가는 사용자에게 인터뷰나 설문을 하는 것으로 추천 모델이나 사용자 인터페이스의 정성적인 성질을 조사한다.</li>
<li>추천 모델의 예측 정도뿐 아니라 아이템 제공 방법이나 사용성 등 사용자 경험에 관한 피드백을 직접 얻을 수 있어 서비스 로그만으로는 알 수 없는 개선점을 발견할 수 있다.</li>
<li>하지만 설문이나 인터뷰 조사로 얻은 대답은 주관에 기반한 경우가 많기에 개인 취향에 따른 대답의 분산이 크고 데이터의 양을 충분히 얻기 어려워 재현성이 떨어진다는 문제도 있다.</li>
</ul>
<table>
<thead>
<tr>
<th align="center">오프라인평가</th>
<th align="center">온라인평가</th>
<th align="center">사용자스터디</th>
</tr>
</thead>
<tbody><tr>
<td align="center">평가항목 </br> -RMSE </br> -nDCG</td>
<td align="center">평가항목 </br> - 클릭률 </br> - 매출 </br> - 지속률</td>
<td align="center">평가항목 </br> - 만족도 </br> - 유용성 </br> - 신선함</td>
</tr>
<tr>
<td align="center">평가방법 </br> - 시뮬레이션</td>
<td align="center">평가방법 </br> - A/B 테스트 </br> - 인터리빙</td>
<td align="center">평가방법 </br> - 인터뷰 </br> - 설문조사</td>
</tr>
</tbody></table>
<h5 id="3가지-평가-방법의-장점과-단점">3가지 평가 방법의 장점과 단점</h5>
<table>
<thead>
<tr>
<th align="left"></th>
<th align="left">장점</th>
<th align="left">단점</th>
</tr>
</thead>
<tbody><tr>
<td align="left">오프라인 평가</td>
<td align="left">구현 비용이 낮다.</td>
<td align="left">비즈니스 지표와의 정합성이 없는 경우가 있다.</td>
</tr>
<tr>
<td align="left">온라인 평가</td>
<td align="left">비즈니스 지표를 직접 평가할 수 있다.</td>
<td align="left">구현 비용이 높다. 사용자 만족도를 떨어뜨릴 위험이 있다.</td>
</tr>
<tr>
<td align="left">사용자 스터디</td>
<td align="left">사용자 만족도를 직접 조사할 수 있다.</td>
<td align="left">조사 결과의 재현성을 보장하기 어렵다.</td>
</tr>
</tbody></table>
<h2 id="오프라인-평가">오프라인 평가</h2>
<h4 id="모델-정밀도-평가">모델 정밀도 평가</h4>
<ul>
<li>추천 시스템에서 모델의 주요 목적은 과거의 사용자 행동을 학습하고 미지의 사용자 행동에 대해 높은 정밀도로 예측을 수행하는 것</li>
<li>미지의 데이터에 대한 예측 능력은 모델의 일반화 성능이라고 불린다.</li>
</ul>
<h4 id="모델-밸리데이션">모델 밸리데이션</h4>
<ul>
<li>추천 시스템의 서비스 형태에 따라서는 아이템 소비에 관한 시계열 정보가 추천 정밀도에 기여하기도 한다.</li>
<li>예) 뉴스나 SNS 등의 서비스에서는 시간에 관한 정보가 학습에 중요하다.</li>
<li>실제 서비스를 운영할 때는 모델 학습 시 얻을 수 없는 미래 정보를 사용하는 학습을 피해야 한다.(데이터 누수)</li>
</ul>
<h4 id="모델-튜닝">모델 튜닝</h4>
<ul>
<li><p>모델 튜닝이란 예측 성능이 높아지도록 모델이 가진 파라미터를 조정하는 것이다.</p>
</li>
<li><p>검증 데이터에 대한 벨리데이션을 통해 수행하며 테스트 데이터만 가지고 수행하지 않도록 주의해야 한다.</p>
</li>
<li><p>테스트 데이터로 튜닝을 수행하면 원래 목적인 &#39;미지의 데이터에 대한&#39; 일반화 성능을 평가할 수 없기 때문</p>
</li>
<li><p>그리드 서치, 베이즈 최적화를 통하여 수행할 수 있음</p>
</li>
</ul>
<h4 id="평가지표">평가지표</h4>
<table>
<thead>
<tr>
<th align="center">지표 분류</th>
<th align="center">사용 목적</th>
<th align="center">대표적인 지표</th>
</tr>
</thead>
<tbody><tr>
<td align="center">예측 오차 지표</td>
<td align="center">학습 모델이 얼마나 테스트 데이터 평갓값에 가깝게 예측할 수 있는지</td>
<td align="center">-MAE </br>-MSE,RMSE</td>
</tr>
<tr>
<td align="center">집합 평가 지표</td>
<td align="center">모델이 출력한 높은 점수의 아이템 집합 K개에 관한 추출 능력을 측정한다.</br> 클릭이나 구매 유뮤등 이진 분류에 대한 평가나 추천범위를 측정하기 위해 사용</td>
<td align="center">-Precision </br> -Recall </br> -F1-measure</td>
</tr>
<tr>
<td align="center">순위 평가 지표</td>
<td align="center">아이템 순서를 고려한 순위 평가에 사용, </br> 모델이 출력한 높은 점수의 아이템 k개가 얼마나 올바르게 나열됬는지 측정</td>
<td align="center">-nDCG </br> -MAP </br> -MRR</td>
</tr>
<tr>
<td align="center">기타 평가 지표</td>
<td align="center">클릭 유뮤와 같은 예측 정밀도 외에 사용자 만족도를 직접 측정</td>
<td align="center">-커러비지 </br>-다양성 </br>-신규성 </br>-흥밀움(세렌디피티)</td>
</tr>
</tbody></table>
<h2 id="온라인-평가">온라인 평가</h2>
<h3 id="ab-테스트">A/B 테스트</h3>
<ul>
<li>대표적인 온라인 검증은 A/B 테스트 이다.</li>
<li>실험군과 대조군의 2개의 그룹으로 나눈 후 평가를 수행하는 방법.</li>
</ul>
<h4 id="가설">가설</h4>
<ul>
<li>A/B 테스트를 할 시에 테스트 대상의 효과에 대해 가설을 세우는 것이 좋다.</li>
</ul>
<table>
<thead>
<tr>
<th align="left">항목</th>
<th align="left">예</th>
</tr>
</thead>
<tbody><tr>
<td align="left">콘텍스트</td>
<td align="left">유행하는 숙소를 쉽게 찾지 못하는 사용자가 있다.</td>
</tr>
<tr>
<td align="left">변경점</td>
<td align="left">새로운 추천 알고리즘을 도입한다.</td>
</tr>
<tr>
<td align="left">대상</td>
<td align="left">유럽 지역에서 독일어를 쓰는 사용자</td>
</tr>
<tr>
<td align="left">지표 목표</td>
<td align="left">숙박 예약률을 1% 향상시킨다</td>
</tr>
<tr>
<td align="left">비즈니스 목표</td>
<td align="left">숙박 예약을 통한 매출을 향상시킨다.</td>
</tr>
</tbody></table>
<ul>
<li>콘텍스트 : 실험 배경은 무엇인가?</li>
<li>변경점 : 무엇을 어떻게 바뀌는가?</li>
<li>대상 : 대상 사용자는 누구인가?</li>
<li>지표 영향 : 변경점이 지표에 어떤 영향을 미치는가?</li>
<li>비즈니스 목표 : 이니셔티브를 통해 달성하고 싶은 최종 비즈니스 목표는 무엇인가?</li>
</ul>
<blockquote>
<p>템플릿을 미리 지정하고 비즈니스 목표와의 연결을 명확하게 하도록 하여야한다.
 형태를 갖춰 문서로 남겨 이니셔티브의 효과를 확인할 때 커뮤니케이션 부하를 낮추는 효과도 기대할 수 있다.</p>
</blockquote>
<ul>
<li><p>진행 방법</p>
<ul>
<li>A/B 테스트의 경우 실제로 사용자에게 변경점을 보여주므로 사용자 만족도를 저하시킬 수 있다.</li>
<li>적은 수의 사용자에게 실시할 내용이 의도대로 동작하는지 확인하는 것이 좋다.</li>
</ul>
</li>
<li><p>주의점</p>
<ul>
<li><p>한쪽 사용자 그룹이 평소에도 극단적으로 클릭을 많이 하는 사용자로만 구성된다면 클릭 수 측정은 A/B 테스트로 올바르게 수행할 수 없다</p>
</li>
<li><p>그룹 편향이 생길수 있음</p>
</li>
<li><p>학습 데이터 부족등의 원인으로 뒤섞인 행동 로그에 따라 학습해야 할 때도 있기에 로그 혼합또한 주의를 해야함</p>
</li>
<li><p>사용자는 새로운 변화에 과도하게 반응하는 경우가 있는데 이런 경우 단기간 테스트와 장기간 테스트의 결과가 달라지기 때문에 집계 기간또한 고려해야한다.</p>
</li>
</ul>
</li>
</ul>
<h4 id="oec-지표">OEC 지표</h4>
<ul>
<li><p>A/B 테스트의 성공과 실패를 최종적으로 판단하는 지표를 OEC 지표라고 한다.</p>
</li>
<li><p>OEC 지표는 서비스/비즈니스의 성공을 위해 시스템을 움직이는 것을 돕기 위하여 정의된 지표이다.</p>
</li>
<li><p>OEC 지표는 장기적인 서비스 KPI와 연관되어야 하며 동시에 단기간에는 팀이 행동할 때 충분히 공감해야함</p>
</li>
<li><p>또한 팀 단위뿐 아니라 조직 전체가 OEC 지표에 대해 합의하는 것이 바람직함</p>
<ul>
<li>Happiness : 서비스에 대한 사용자의 감각, 만족도, 시각적 매력, 쉬운 사용성등 사용자의 주관적인 측면과 관계가 있다. 행동 로그만으로 추정하기 어려운 경우 설문을 추가해 실시할 수 있다.</li>
<li>Engagement : 상품에 대한 사용자의 관여 수준, 어떤 기간동안 서비스의 실행 빈도나 인터랙션 깊이</li>
<li>Adoption : 어떤 기간에 새로 상품을 사용하기 시작한 신규 사용자</li>
<li>Retention : 어떤 기간의 사용자 중 몇 명이 그 뒤의 기간까지 여전히 서비스 사용을 지속하고 있는가</li>
<li>Task success :  효율성(태스크 종료까지의 기간). 유효성(태스크 완료율), 에러율 등 기존 사용자의 만족도</li>
</ul>
</li>
</ul>
<h4 id="가드레일-지표">가드레일 지표</h4>
<ul>
<li><p>가드레일 지표는 저하되어서는 안 되는 제약을 표시한다.</p>
</li>
<li><p>가드레일 지표는 페이지 열람 수, 서비스 기동률, 응답 속도, 주간 액티브 사용자 수, 수익금 등이 있다.</p>
</li>
<li><p>응답 속도의 경우 매우 중요한 부분</p>
</li>
<li><p>마이크로소프트 상의 bing 검색에서는 100ms의 차이가 0.6%의 수익금 차이로 이어진다는 보도도 존재</p>
</li>
<li><p>사용자 행동의 경우 다양한 트레이드 오프가 존재한다.</p>
</li>
<li><p>서비스 내 개인화 모듈의 클릭 정밀도가 향상된 결과로 연관 아이템 모듈의 클릭 수가 감소하는 일 등은 자주 발생</p>
</li>
<li><p>A/B 테스트에서는 최종적인 어떤 이니셔티브의 효용을 OEC 지표로 측정하면서 서비스 전체의 트레이드오프를 고려해 가드레일 지표를 설계하는 것이 중요</p>
</li>
</ul>
<h3 id="지표-설계-방침">지표 설계 방침</h3>
<h4 id="감도-senstivity">감도 (Senstivity)</h4>
<ul>
<li>지표는 감도가 좋아야 한다. 감도는 2개의 요소로 이루어진다.</li>
</ul>
<ol>
<li>이동 확률 : 업데이트에 대해 지표가 얼마나 빈번하게 변동하는가를 나타냄<ul>
<li>좋은 지표는 크게 변화할 확률이 적고 안정적으로 측정할 수 있다.</li>
</ul>
</li>
<li>통계력 : 효과에 변동이 있을 때 그것을 얼마나 정확하게 특정할 수 있는가<ul>
<li>검출력이라고도 불리며, A/B 테스트는 80%를 최소량으로 요구함</li>
</ul>
</li>
</ol>
<h4 id="신뢰성-trustworthiness">신뢰성 (Trustworthiness)</h4>
<ul>
<li>지표는 신뢰성이 높아야 한다. 지표값을 얻는 것은 쉽지만 신뢰할 수 있는 지표를 얻는 것은 녹록지 않다.</li>
<li>서버 문제등으로 수치가 결손되는 경우도 존재</li>
<li>&#39;흥미로우며 차이가 명확한 데이터는 대부분 오류다&#39; -&gt; 트위만의 법칙</li>
<li>구체적으로 강한 결과가 나타났을 경우 먼저 어떤 외적 원인이나 측정 실수를 의심하고 신뢰성을 확인해야 함</li>
</ul>
<h4 id="효율성-efficiency">효율성 (Efficiency)</h4>
<ul>
<li>효율이 좋은 의사결정으로 연결되어야 한다.</li>
<li>성숙한 조직이고 실험 체제가 정리되어 있으면 수행하는 테스트의 수도 증가</li>
<li>효율에는 시간, 복잡성, 비용 총 3가지가 있다.</li>
<li>넷플릭스는 재생 시간을 1개월 지속할 확률의 대리 변수로 사용하고 있으며 코세라는 과정 자료의 인터랙션과 퀴즈 사용률을 과정 완주율의 대리 지표로 사용</li>
<li>대략적으로 보다 빠르게 결과를 얻을 수 있는 변수를 찾는 것이 중요</li>
</ul>
<h4 id="디버깅-가능성debuggability과-액션-가능성actionability">디버깅 가능성(Debuggability)과 액션 가능성(Actionability)</h4>
<ul>
<li>디버그와 관련된 지표또한 필요하다.</li>
<li>테스트에 이상이 있을 때 그 이상의 원인을 추적해 수정하는 것과 연결디는 지표도 준비해야 한다.</li>
<li>온라인 실험을 수행할 때 어쩔 수 없이 버그가 발생하는 경우가 존재</li>
<li>버그나 크래시를 감지할 수 있는 구조를 지표로 설계해야한다</li>
<li>숫자가 크게 변동했을 때는 버그일 가능성이 있다.</li>
</ul>
<h4 id="해석-가능성interpretability과-방향성directionality">해석 가능성(Interpretability)과 방향성(Directionality)</h4>
<ul>
<li><p>쉽게 해석할 수 있어야 한다.</p>
</li>
<li><p>사용자의 불만을 집계하고 싶은 경우 만족도를 5단계로 평가했을 때 5단계 평가의 평균을 구하는 행위는 해석이 어렵다.</p>
</li>
<li><p>이런 경우 불만이 있다고 대답한 사용자의 비율을 집계하는 편이 해석하기 쉽다.</p>
</li>
<li><p>방향성은 해당 변수가 개선되었을 때 비즈니스 목표가 달성되는가를 나타낸다.</p>
</li>
<li><p>뉴스 어플리케이션에서 사용자 참여 향상을 목적으로 하는 기능을 테스트할 때 어떤 한 기능의 클릭률이 향상돼도 전체 클릭률이 저하된다면 목적을 달성했다고 할 수 있다.</p>
</li>
</ul>
<h3 id="인터리빙">인터리빙</h3>
<ul>
<li><p>온라인 평가의 또 다른 방법으로 인터리빙이 있다. A/B 테스트에서는 테스트 대상의 수만큼 사용자 그룹을 나눠야 한다.</p>
</li>
<li><p>결국 테스트 대상이 늘어남에 따라 테스트 사용자 수도 선형적으로 늘어나 평가 효율이 문제될 수 있다.</p>
</li>
<li><p>인터리빙은 A/B 테스트보다 10배 ~ 100배 더 효율적인 방법으로 알려져있다.</p>
</li>
<li><p>인터리빙은 평가 시 A/B 테스트처럼 사용자 그룹을 나누지 않는다. 그 대신 평가 대상의 각 순위를 하나의 순위로 섞어 사용자에게 제시한다.</p>
</li>
<li><p>뒤섞인 순위에 대한 클릭으로 원래 순위끼리 평가한다.
2개의 순위를 섞어 평가하는 방법을 인터리빙이라고 하고 3개 이상의 순위를 섞어 평가하는 방법을 멀티리빙이라 한다.</p>
</li>
<li><p>멀티리빙은 많은 모델이나 파라미터를 동시에 테스트하고 싶을 때 A/B 테스트 실시 전 테스트 대상의 필터링에 사용되기도 한다.</p>
</li>
</ul>
<h4 id="team-draft-multileavingtdm">Team Draft Multileaving(TDM)</h4>
<ul>
<li>2개의 검토 결과를 선택할 때마다 선공/후공을 무작위로 결정하면서 양 순위에서 하나씩 아직 사용되지 않은 검색 결과를 상위 부터 선택</li>
</ul>
<h4 id="probabilistic-multileavingpm">Probabilistic Multileaving(PM)</h4>
<ul>
<li>가능한 한 각 순위 안의 검토 결과 순서를 유지하면서 상대적으로 낮은 확률로 임의의 순서에서 검토 결과를 선택하도록 허용한다.</li>
</ul>
<h4 id="optimized-multileavningom">Optimized Multileavning(OM)</h4>
<ul>
<li>먼저 출력 후보가 되는 순위를 다수 준비한다.최적화 문제를 풀어냄으로써 출력 후보의 순위 출력 확률을 조정한다.</li>
</ul>
<h4 id="pairwise-prreference-multilearvningppm">Pairwise Prreference Multilearvning(PPM)</h4>
<ul>
<li>속도가 빠르면서 Considerateness, Fidelity라는 이론적 보증이 가능한 방법</li>
<li>Considerateness : 섞어서 만든 순위는 원래의 입력 순위보다 품질이 나쁘지 않다., 테스트 시 입력 순위 이상으로는 사용자 만족도를 저하시키지 않는 다는 것을 보증한다는 의미</li>
<li>Fidelity : 무작위로 클릭을 모든 순위 점수의 기댓값이 같아지고 동시에 보다 우수한 순위의 점수의 기댓값은 더 높아진다는 성질</li>
</ul>
<table>
<thead>
<tr>
<th align="center"></th>
<th align="center">Considerateness</th>
<th align="center">Fidelity</th>
<th align="center">구현 용이성</th>
</tr>
</thead>
<tbody><tr>
<td align="center">TDM</td>
<td align="center">o</td>
<td align="center"></td>
<td align="center">o</td>
</tr>
<tr>
<td align="center">PM</td>
<td align="center"></td>
<td align="center">o</td>
<td align="center">o</td>
</tr>
<tr>
<td align="center">OM</td>
<td align="center">o</td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">PPM</td>
<td align="center">o</td>
<td align="center">o</td>
<td align="center"></td>
</tr>
</tbody></table>
<ul>
<li><p>OOM은 속도가 빠르면서도 이론적으로 보증하는 한편 구현이나 집계가 상당히 복잡하므로 먼저 인터리빙을 시험할 때는 TDM부터 도입하는 것을 권장</p>
<blockquote>
<p>참고
<a href="https://github.com/mpkato/interleaving/">https://github.com/mpkato/interleaving/</a></p>
</blockquote>
</li>
<li><p>A/B 테스트와 인터리빙의 장단점</p>
</li>
</ul>
<table>
<thead>
<tr>
<th align="left"></th>
<th align="left">A/B 테스트</th>
<th align="left">인터리빙</th>
</tr>
</thead>
<tbody><tr>
<td align="left">평가 대상</td>
<td align="left">추천 모델, UI포함</td>
<td align="left">추천 모델을 사용해 생성한 순위</td>
</tr>
<tr>
<td align="left">평가 효율</td>
<td align="left">많은 사용자가 필요</td>
<td align="left">적은 사용자로 평가 가능</td>
</tr>
<tr>
<td align="left">구현 비용</td>
<td align="left">낮음</td>
<td align="left">높음</td>
</tr>
</tbody></table>
<h2 id="사용자-스터디를-통한-평가">사용자 스터디를 통한 평가</h2>
<h3 id="조사-설계">조사 설계</h3>
<h4 id="참가자-선정">참가자 선정</h4>
<ul>
<li>사용자 스터디의 대상의 경우 기본적으로 가급적 실제 사용자에 가까운 사람을 선택하는 것이 좋음</li>
<li>전자상거래 사이트 추천 시스템의 사용자의 경우 사용자 스터디를 할때 가급적 그 전자상거래 사이트를 이용하고 있는 사람 또는 다른 전자상거래 사이트를 이용하고 있는 사람이 좋음</li>
<li>일반 사용자가 아닌 개발자를 조사하면 자사 서비스에 부족한 기능이나 화면 개선점등이 파악되는 경우도 존재</li>
</ul>
<blockquote>
<p>다양한 유형의 사용자를 대상으로 할때
테스트 대상의 전문 지식 수준(초급, 중급, 상급)
서비스 사용 빈도(서비스의 합계 사용 횟수, 특정 기간의 사용 횟수)
사용자 속성 정보(성별, 나이, 거주 지역, 가족 구성)</p>
</blockquote>
<ul>
<li>또한 샘플링을 적절하게 활용하여야 한다<ul>
<li>단순 무작위 추출법, 계통적 추출법, 층화 추출법, 임의 추출법</li>
</ul>
</li>
</ul>
<h4 id="참가자-수">참가자 수</h4>
<ul>
<li>사용자 스터디의 참가자 수는 조사 목적과 오차 허용 정도에 따라 결정된다.</li>
<li>사용성에 관한 오류를 발견하는 것이 목적이라면 5명 정도의 사용자가 80% 이상의 문제를 발견할 수 있다는 주장이 존재</li>
<li>시스템의 다양한 측면에 대해 피드백을 얻고자 할 때나 조사 태스크가 매우 많은 경우에는 소수의 의견을 누락시키지 않기 위해 가급적 많은 사람들을 조사해야 함</li>
<li>일반적으로 시스템 초기 단계에서는 소수의 참가자를 모아 비교적 중요한 문제를 발견하고 시스템이 완성에 가까워지면 더 많은 참가자를 모아 남아 있는 작은 문제를 발견하는 것이 이상적인 방법</li>
</ul>
<h4 id="조사-시점">조사 시점</h4>
<ul>
<li>스사트업 등에서 신규 서비스 수요를 미리 예측하는 경우 서비스 기능을 최소한으로 구현한 후 또는 서비스의 전체 기능이 완성된 후 등을 들 수 있다.</li>
<li>규모가 큰 기업의 성숙하다고 생각되는 서비스에 대해서도 1년에 1회정도는 정성적인 사용자 조사를 수행하는 것이 좋다.</li>
<li>단기적인 개선 이니셔티브를 다양하게 실행한 결과, 눈치채지 못한 사이에 서비스 전체의 사용자 만족도가 낮은 상품으로 바뀌어 버리는 경우가 많기 때문</li>
</ul>
<h4 id="피험자-내-측정피험자-간-측정">피험자 내 측정/피험자 간 측정</h4>
<ul>
<li>피험자 내 측정은 참가자 사이의 특성 차이를 고려할 필요가 없어 비교적 소규모 샘플로도 충분한 경우가 많음</li>
<li>참가자가 여러 평가를 순서대로 수행하기 때문에 평과 과정에서 학습이 진행되거나 피로에 따라 수행 능력 및 감각이 달라지는 캐리오버 효과가 발생할 수 있음</li>
<li>이러한 캐리오버 효과를 줄이기 위해 카운터 밸런스를 활용한다.</li>
<li>가장 단순한 카운터 밸런스는 각 참가자가 태스크를 수행하기 전에 태스크의 순서를 무작위로 뒤섞는 것</li>
<li>이를 통해 특정 평가가 항상 특정한 순서로 대답되는 것 처럼 순서로 인해 발생하는 영향을 피험자 전체 관점에서 줄일 수 있다.</li>
</ul>
<p><strong>1개의 정확한 측정이 1000명의 전문가 의견보다 가치가 있다</strong>라는 말을 통해서라도 추천 시스템의 성숙도에 대하여 적절한 평가를 하는 것이 중요</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Chapter 5 - (3)]]></title>
            <link>https://velog.io/@dandelion_26/Chapter-5-3</link>
            <guid>https://velog.io/@dandelion_26/Chapter-5-3</guid>
            <pubDate>Thu, 20 Jul 2023 15:45:08 GMT</pubDate>
            <description><![CDATA[<h2 id="행렬-분해">행렬 분해</h2>
<h3 id="행렬-분해-1">행렬 분해</h3>
<ul>
<li>메모리 기반 협조 필터링에 비해 구현 관점에서 다소 복잡하지만 추천 성능은 좋다</li>
<li>행렬 분해라는 용어는 넓은 범위를 나타내며 문헌에 따라 행렬 분해라는 용어가 전혀 다른 바법을 가리키는 경우도 존재</li>
<li>추천 시스템에서의 행렬분해는 넓은 의미에서 평갓값 행렬을 저차원의 사용자 인자 행렬과 아이템 인자 행렬로 분해하는 것을  나타낸다.</li>
<li>사용자와 아이템을 100차원 정도의 저차원 벡터로 표현하고 그 벡터의 내적값을 사용자와 아이템의 상성으로 한다</li>
<li>SVD, NMF, MF, IMF, BPR, FM 행렬 분해등이 있다.</li>
<li>행렬 분해 방법을 실무에서 사용할 때는 &#39;결손값 취급&#39;, &#39;평갓값이 명시적인가 암묵적인가&#39;라는 관점이 중요</li>
</ul>
<blockquote>
<p>평갓값이 명시적인 경우</p>
</blockquote>
<ul>
<li><p>평갓값이 명시적이라는 것은 Movielens 데이터와 같이 사용자가 아이템에 대해 명싲적으로 평가한 데이터를 말한다.</p>
</li>
<li><p>이런 구조로부터 얻은 데이터의 경우 사용자가 명시적으로 평가를 한것이기 때문에 품질이 높다</p>
</li>
<li><p>평갓값 행렬이 주어졌을 때, 영화를 XY 좌표의 2차원 벡터로 표현을 한다면, X 축을 액션 정도, Y축을 판타지 정도라는 축으로 한다면 액션과 판타지에 적합한 영화들은 오른쪽 위에 위치할 것이다.</p>
</li>
<li><p>사용자의 경우에도 액션 정도가 높은 판타지 영화를 좋아하는 경우 오른쪽 위에 위치할 것이다.</p>
</li>
<li><p>하지만 예시처럼 사람이 각 차원에 의미를 부여하는 것이 아니고 데이터를 통해 자동으로 축을 구축한다.</p>
</li>
<li><p>또한 차원이 사람이 이해하기 쉬운 축이 되는 경우도 있지만 사람이 해석하기 어려운 축이 만들어 질 수도 있다.</p>
</li>
</ul>
<h3 id="특잇값-분해">특잇값 분해</h3>
<ul>
<li><strong>특잇값 분해(SVD)</strong> Singular Value Decomposition</li>
<li>결손된 부분에 0또는 평균값을 대입하고 특잇값 분해를 통하여 차원을 줄일 수 있다.</li>
</ul>
<blockquote>
<p>평갓값 행렬 R을 다음과 같이 P,S,Q로 분해한다
$R = PSQ^T = \hat{P}\hat{Q}^T$
사용자의 행렬 $\hat{P}$와 아이템의 행렬 $\hat{Q}$를 얻을 수 있다.</p>
</blockquote>
<pre><code>- 특잇값 분해의 경우 추가로 설명을 할 예정</code></pre><ul>
<li><p>특잇값 분해의 경우 결손값을 0으로 채우기 때문에 추천 서능이 나쁘다. 0을 대입하는 것은 사용자가 그 아이템에 대해 싫어한다고 의사 표시한 것과 같다.</p>
</li>
<li><p>하지만 평갓값이 결손되있는 것은 사용자가 아직 평가를 하지 않은 것이지 해당 아이템을 좋아할 수도 있다.</p>
</li>
<li><p>또한 Sparse한 행렬이기 때문에 RMSE등의 지표도 나빠질 수 도 있다.</p>
</li>
<li><p>예측 평갓값의 상대적인 값에는 의미가 있으며 무작위로 추천할 때보다 성능이 좋다.</p>
</li>
<li><p>또한 SVD에는 잠재 인자 수라는 중요한 파라미터가 있으며 이를 변화시키면 예측 정확도가 바뀌니다.</p>
</li>
<li><p>잠재 인자수가 높을 수록 원래 행렬을 복구할 때 충분한 표현력을 갖기 때문에 예측 정확도가 좋아진다.</p>
</li>
<li><p>한편 잠재인자수가 너무 높을 경우 오버피팅될 가능성 존재</p>
</li>
<li><p>일반적으로 잠재 인자수 는 수십~수배으로 설정한다.</p>
</li>
</ul>
<h3 id="비음수-행렬-분해">비음수 행렬 분해</h3>
<ul>
<li><p><strong>비음수 행렬 분해(NMF)</strong> Nonnegative Matrix Factorization</p>
</li>
<li><p>SVD는 행렬 분해 후 행렬에 대한 음수값을 취하는 경우가 있지만 NMF는 행렬 분해 시 사용자와 아이템 각 벡터의 요소가 0 이상이 되는 제약을 추가한다.</p>
</li>
<li><p>그 제약에 따라 각 사용자나 아이템의 벡터 해석 특성이 향상된다. 하지만 결손값을 0으로 채워서 적용하는 경우가 많아 일반적으로 추천 성능이 좋지않다.</p>
</li>
<li><p>예측 정확도 관점에서 SVD나 NMF는 피하고 다음 알고리즘 사용을 권장</p>
</li>
</ul>
<h3 id="명시적인-평갓값에-대한-행렬-분해">명시적인 평갓값에 대한 행렬 분해</h3>
<ul>
<li>행렬 분해 (MF) Matrix Factorrization는 SVD와 달리 결손값을 메꾸지 않고 관측된 평갓값만 사용해 행렬 분해하는 바법을 나타내는 경우가 많다.</li>
<li>넷플릭스사가 개최한 평갓값을 예측하는 대회에서 MF를 사용하는 방법으로 좋은 성과를 거뒀음</li>
<li>MF는 대규모 데이터에서도 고속으로 계산할 수 있는 개선된 방법이 존재하여 스파크나 빅쿼리 등에서도 구현되고 있다.</li>
<li>Surprise 라이브러이에서는 SVD라는 이름으로 MF가 구현되어 있다.</li>
<li>MF 에서는 SVD나 NMF에 비해 관측된 평갓값만 사용하므로 해당 영화에 부여된 평가수가 적더라도 평갓값이 높으면 해당 영화를 추천하는 경향이 존재</li>
<li>Surprise에서는 biased라는 파라미터가 있으며 사용자와 아이템의 편향함 포함여부를 선택할 수 있고 하이퍼파라미터 튜닝을 통하여 찾아갈 수 있다.</li>
</ul>
<h3 id="암묵적인-평갓값에-대한-행렬-분해">암묵적인 평갓값에 대한 행렬 분해</h3>
<blockquote>
<p>암묵적인 평갓값이란 상품 상세 페이지 클릭이나 동영상 시청 등 사용자가 명시적으로 평가하지 않은 사용자 행동 이력을 의미한다.</p>
</blockquote>
<ul>
<li><p>실무에서 추천 시스템을 만들 때는 명시적인 평갓값보다 암묵적인 평갓값 데이터를 얻기 쉬우므로 암묵적인 평갓값이 자주 사용된다.</p>
</li>
<li><p>명시적인 평갓값에는 별 1개나 별 5개와 같이 평갓값이 한쪽으로 쏠리는 편향도 있어 학습이 잘안되는 경우도 많아 암묵적인 평갓값을 많이 사용</p>
</li>
<li><p>암묵적인 평가의 특징의 경우 &#39;음수의 예가 없다&#39;,&#39;클릭 수 등과 같이 평갓값을 가질 수 있는 범위가 넓다&#39;, &#39;노이즈가 많다&#39;등을 들 수 있음</p>
</li>
</ul>
<h3 id="bpr">BPR</h3>
<ul>
<li><p>암묵적이 평갓값을 사용한 다른 방법으로 Bayesian Personalized Ranking (BPR)이 있다.</p>
</li>
<li><p>BPR에서는 사용자 u, 암묵적으로 평가한 아이템 i, 관측되지 않은 아이템 j라는 3가지 데이터를 기반으로 학습해 나간다.</p>
</li>
<li><p>실무에서 사용할 때는 관측되지 않은 아이템이 많아 이들을 모두 사용하는 것은 어려우므로 관측되지 않은 아이템 j의 샘플링 방법을 잘 선택해야 한다.</p>
<ul>
<li>단순히 모든 아이템에서 동일하게 샘플링하는 방법, 출현 횟수에 따라 샘플링하는 방법, 클릭했지만 구입하지 않은 아이템으로 필터링해서 샘플링하는 방법등 여러가지 샘플링 방법이 있음</li>
</ul>
</li>
</ul>
<h3 id="fm">FM</h3>
<ul>
<li><p>지금까지의 방법은 평갓값만 사용하는 방법이다. 하지만 평갓값뿐 아니라 사용자나 아이템의 속성정보를 사용해 추천 시스템의 성능을 향상시킬 수 있다.</p>
</li>
<li><p>이 방법은 사용자나 아이템의 속성 정보를 사용함으로써 신규 아이템이나 사용자에 대해 추천이 불가능한 콜드 스타트 문제에도 대응할 수 있다는 장점이 존재</p>
</li>
<li><p>Factorization Machines FM은 매우 유명하며 널리 사용됨</p>
</li>
<li><p>FM에서 입력 데이터 형식은 지금까지와 다르다</p>
</li>
<li><p>FM에서는 1개의 평가를 1행으로 표시한다.</p>
</li>
<li><p>행렬은 평갓값 X 특징량 수가 된다.</p>
</li>
<li><p>특직량은 사용자 ID를 원-핫 인코딩한것과 아이템 ID를 원-핫-인코딩한 것, 사용자와 아이템의 속성 정보등의 보조 정보를 연결한 것이된다.</p>
</li>
<li><p>FM의 좋은 점은 특징량끼리의 조합도 고려할 수 있다.</p>
<ul>
<li>예를 들어 영화 추천의 경우 사용자 나이와 성별의 조합은 중요한 특징량이 될 수 있다.</li>
<li>FM의 경우 나이와 성별을 나타내는 예를 넣어두는 것만으로 해당 조합을 고려할 수 있다.</li>
</ul>
</li>
</ul>
<h2 id="자연어-처리-방법에-대한-추천-시스템의-응용">자연어 처리 방법에 대한 추천 시스템의 응용</h2>
<ul>
<li>토픽 모델 LDA나 word2vec 등 자여녀어 처리 분야에서 제안된 부분을 추천 시스템에 응용할 수 있다.</li>
<li>자연어 처리 분야에서 제안된 것으로 상품 설명문이나 사용자 리뷰를 분석함으로써 콘텐츠 기반 추천으로 비슷한 상품을 찾을 수 있다.</li>
<li>이 방법들을 사용자의 행동 이력에 적용함으로써 협조 필터링 기반 추천도 가능</li>
</ul>
<h3 id="토픽-모델">토픽 모델</h3>
<ul>
<li>&#39;야구&#39;, &#39;축구&#39;등의 단어는 스포츠 관련 기사에 자주 사용되고 &#39;선거&#39;, &#39;세금&#39;등의 단어는 정치 기사에서 자주 사용된다.</li>
<li>문장 토픽에 따라 사용되는 빈도가 다르다.</li>
<li>토픽 모델에서 하나의 문장은 여러 토픽으로 구성되며 각 토픽에서 단어가 선택되어 문장이 구성되는 것을 모델화 한다.</li>
<li>잠재 디리클레 할당 모델은 토픽 할당에 디리클레 분포를 사전 분포로 가정해 베이즈 추정을 한 모델이다.</li>
</ul>
<h3 id="lda를-사용한-콘텐츠-기반-추천">LDA를 사용한 콘텐츠 기반 추천</h3>
<ul>
<li>LDA를 사용하여 콘텐츠 기반 추천을 하려면 줄거리 문장을 LDA에 입력하여, 공포, 연애와 같은 주제가 나타나고 각 문장에 토픽의 벡터가 할당된다.</li>
<li>벡터를 사용하여 코사인 유사도 등의 거리 계산을 함으로써 각 서저 사이의 유사도를 측정할 수 있다.</li>
<li>이를 활용하여 고나련 아이템 추천 시스템을 만들 수 있다.</li>
</ul>
<h3 id="lda를-사용한-협조-필터링-추천">LDA를 사용한 협조 필터링 추천</h3>
<ul>
<li><p>사용자의 구입 이력이나 열림 이력 등의 행동 이력 데이터는 다음처럼 표현 가능</p>
<blockquote>
<p>User1 : [item1, item41, item23, item4]
User2 : [item52, item3, item1, item9]</p>
</blockquote>
</li>
<li><p>각 아이템을 단어로 보고 사용자가 행동한 아이템의 집합을 문장으로 보면 LDA를 적용할 수 있다.</p>
</li>
<li><p>출력된 결과는 각 토픽별 아이템 분포와 각 사용자별 주제가 된다.</p>
</li>
<li><p>&#39;토픽 1은 item23이 0.3, item4가 0.2&#39;와 같은 아이템 분포와 &#39;User1은 토픽 1 : 0.8, 토픽 2: 0.1&#39; 같은 결과가 나옴</p>
</li>
<li><p>이 벡터를 통하여 User1은 토픽 1의 성분이 강하므로 토픽 1에서 나오기 쉬운 아이템을 추천할 수 있다.</p>
</li>
<li><p>아이템에 대해서도 각 토피에서의 출현 확률을 나열한 벡터를 만들어 코사인 유사도 등을 사용해 유사도를 계산할 수 있으므로 관련 아이템을 추천할 수 있다.</p>
</li>
<li><p>행동 이력에 LDA를 적용해 얻을 수 있는 장점은 추천 시스템을 만드는 목적 외에도 탐색적 데이터 분석(EDA)로 사용자나 아이템에 대한 이해도를 높일 수 있다.</p>
</li>
<li><p>행동 이력을 기반으로 각 아이템을 모아주기 때문에 상품의 설명문만 언뜻 보면 다른 것처럼 보여도 사실 함께 구입되기 쉬운 아이템을 알 수 있다.</p>
</li>
<li><p>마케팅이나 상품 개발에도 도움이 될 수 있다.</p>
</li>
</ul>
<h3 id="word2vec">word2vec</h3>
<ul>
<li>&#39;단어의 의미는 그 주변 단어에 따라 결정된다&#39;라는 가설이 있다. -&gt; 분포가설<blockquote>
<p>&#39;서점에서 산 OO를 읽어보니 재미있었다&#39;
&#39;책&#39;, &#39;단어&#39;, &#39;서적&#39;등이 있다
이 단어들은 같은 문맥에서 나오는 경우가 많고 단어의 의미도 비슷하다.</p>
</blockquote>
</li>
<li>이러한 분포 가설을 기반으로 단어의 의미를 벡터로 표현하는 방법 중 하나가 word2vec이다.</li>
</ul>
<h3 id="word2vec을-사용한-콘텐츠-기반-추천">word2vec을 사용한 콘텐츠 기반 추천</h3>
<ul>
<li>온라인 쇼핑 사이트에서 서적을 추천하는 것에 대해 생각할 때, 서적의 줄거리에 나오는 단어의 벡터 평균을 해당 서적의 벡터로 간주한다.</li>
<li>각 서적들의 벡터간 유사도를 계산함으로써 관련 아이템을 추천할 수 있다.</li>
<li>단어의 평균만 구한다면 자주 나오는 단어와 특징적인 단어가 동등하게 취급되므로 특징적인 단어의 영향도가 희박한 벡터가 되어버린다.</li>
<li>tf-idf와 같은 방법을 사용해 해당 문제에 특징적인 단어만 추출해서 평균 벡터를 얻는 방법, tf-idf의 가중치를 사용해 벡터를 계산하는 방법 등을 사용한다. 이 밖에도 <strong>SWEM</strong>이라는 방법에서는 단어의 평균 벡터가 아니라 각 차원의 최댓값과 최솟값을 추출한 최대 벡터나 최소 벡터를 결합하여 문자의 벡터로 간주한다.</li>
<li>word2vec을 발전시킨 것으로 doc2vec이라는 방법이 있다.</li>
<li>doc2vec은 단어를 벡터화할 뿐아니라 문장 자체에도 벡터를 부여하기에 하이퍼 파라미터를 적절하게 조정한다면 word2vec보다 여러 태스크에서 높은 성능을 발휘한다.</li>
</ul>
<h3 id="word2vec을-사용한-협조-필터링-추천item2vec">word2vec을 사용한 협조 필터링 추천(item2vec)</h3>
<ul>
<li><p>사용자가 열람하거나 구매하는 등의 행동 이력을 word2vec에 적용하는 방법에 관해 설명하겠다.</p>
</li>
<li><p>이 방법은 item2vec, prod2vec이라 불리며 구현이 간단하고 추천 성능이 높아 야후, 에어비앤비 등의 기업에서 사용됨</p>
</li>
<li><p>LDA의 경우와 마찬가지로 사용자의 행동 이력을 단어의 집합으로 간주하고 word2vec을 적용한다.</p>
</li>
<li><p>사용자의 행동한 순서대로 아이템을 나열하는 것이 중요하고, window_size라는 파라미터를 통하여 액션 순서까지 고려해 학습 시킨다.</p>
</li>
<li><p>이 벡터를 사용하면 아이템 간 유사도를 계산할 수 있으며 관련 아이템 추천을 구현한다.</p>
</li>
<li><p>아이템의 벡터를 사용하면 사용자에게 간단히 추천할 수 있다.</p>
</li>
<li><p>아이템의 벡터를 유지하기만 함녀 사용자의 벡터는 벡터의 사칙연산으로 계산이 가능하기 때문에 실시간 온라인 추천등에서 사용된다.</p>
</li>
<li><p>아이템을 단어, 사용자의 행동 이력을 문장으로 간주함으로써 자연어 처리 방법을 협조 필터링 형태의 추천으로 적용할 수 있다, BERT 모델을 사용자읭 행동이력에 적용한 사례도 존재</p>
</li>
</ul>
<h2 id="딥러닝">딥러닝</h2>
<ul>
<li>&quot;Deep Learning for Recommender System&quot; 워큿뵤을 통하여 추천시스템에서 활용되고있다.</li>
</ul>
<h3 id="딥러닝을-활용한-추천-시스템">딥러닝을 활용한 추천 시스템</h3>
<ul>
<li>이미지나 문장 등 비구조 데이터의 특징량 추출기로 활용</li>
<li>복잡한 사용자 행동과 아이템 특징량 모델링</li>
</ul>
<h4 id="이미지나-문장등-비구조-데이터의-특징량-추출기로-활용">이미지나 문장등 비구조 데이터의 특징량 추출기로 활용</h4>
<ul>
<li>딥러닝은 이미지 분석이나 자연어 처리 분야에서 많은 모델이 제안되었고 큰 성과를 남겼다.</li>
<li>지금까지 콘텐츠 기반 추천 시스템에서는 이미지, 음악, 동영상, 텍스트에 관해 카테고리 정보나 태그 정보를 기반으로 추천을 수앵하여서 추천 시스템의 정확도가 좋지 않았음</li>
<li>스포티파이에서는 곡조가 비슷한 음악을 추천하고, 인스타그램에서는 분위기가 비슷한 이미지를 추천한다.</li>
<li>딥러닝을 사용하면 콜드 스타트 문제를 해결할 수 있다.</li>
</ul>
<h4 id="복잡한-사용자-행동과-아이템-특징량-모델링">복잡한 사용자 행동과 아이템 특징량 모델링</h4>
<blockquote>
<p>추천 시스템에서 딥러닝의 장점</p>
<ul>
<li>비선형 데이터 모델링</li>
<li>시계열 데이터 모델링</li>
</ul>
</blockquote>
<h5 id="비선형-데이터-모델링">비선형 데이터 모델링</h5>
<ul>
<li>행렬 분해를 딥러닝화 한  Neural Collaborative Filtering
<img src="https://velog.velcdn.com/images/dandelion_26/post/49a1aa72-9e40-4c70-a472-1871b873605d/image.png" alt=""></li>
</ul>
<ul>
<li><p>신경망이 여러층으로 구성되어 있어 사용자와 아이템의 복잡한 데이터를 학습할 수 있으며 기존 행렬 분해보다 높은 예측 정확도를 얻을 수 있다.</p>
</li>
<li><p>DeepFM은 Factorization Machines를 딥러닝화한 방법</p>
</li>
<li><p>아이템이나 사용자의 특징량에 대해 특징량 엔지니어링이 필요없으며 그대로 모델에 입력할 수 있다.</p>
</li>
<li><p>모델 안에서는 고차원의 각 특징량 조합도 학습해준다.</p>
</li>
<li><p><img src="https://velog.velcdn.com/images/dandelion_26/post/d81e1da2-570a-4332-a73c-27437349e5ff/image.png" alt=""></p>
</li>
<li><p>Wide and Deep</p>
</li>
<li><p>Wide 부분과 Deep 부분의 2개로 구성되어 있다.</p>
</li>
<li><p>Wide 부분에서는 아이템이나 사용자의 특징량을 입력으로 하여 1층의 선형 모델을 거친다</p>
</li>
<li><p>Deep 부분에서는 Embedding층을 내장해 다층으로 함으로써 보다 일반화된 추상적인 표현을 얻을 수 있다.</p>
</li>
<li><p>이 2개를 조합하면 예측 정확도를 높이면서도 다양하게 추천할 수 있다.</p>
</li>
<li><p><img src="https://velog.velcdn.com/images/dandelion_26/post/c655d867-74db-4712-bf7b-9540f601f82e/image.png" alt=""></p>
</li>
</ul>
<h4 id="시계열-데이터-모델링">시계열 데이터 모델링</h4>
<ul>
<li>RNN이나 LSTM을 시작으로 하는 시계열 정보를 다루는데 뛰어난 방법들이 제안되었음</li>
</ul>
<table>
<thead>
<tr>
<th align="left">자연어 처리 방법</th>
<th align="left">추천 알고리즘</th>
</tr>
</thead>
<tbody><tr>
<td align="left">RNN</td>
<td align="left">Session-based recommendations with recurrent neural networks</td>
</tr>
<tr>
<td align="left">word2vec</td>
<td align="left">item2vec: neural item embedding fo collaborative filtering </br> E-commerce in Your Inbox: Product Recommendations at Scale</td>
</tr>
<tr>
<td align="left">BERT</td>
<td align="left">BERT4REC : Sequential recommendation with bidirectional encoder representations from transformer</td>
</tr>
</tbody></table>
<h3 id="구현">구현</h3>
<table>
<thead>
<tr>
<th align="left">라이브러리명</th>
<th align="left">URL</th>
<th align="left">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="left">Recommenders</td>
<td align="left"><a href="https://github.com/microsoft/recommenders">https://github.com/microsoft/recommenders</a></td>
<td align="left">마이크로소프트사 개발한 추천알고리즘 </br> MF나 BPR등 고전적인 방법 부터 최신 딥러닝 추천알고리즘 구현,</br> GPU나 스파크를 사용한 모델까지 제공</td>
</tr>
<tr>
<td align="left">Spotlight</td>
<td align="left"><a href="https://github.com/maciejkula/spotlight">https://github.com/maciejkula/spotlight</a></td>
<td align="left">파이토치 기반의 추천 알고리즘 라이브러리 </br>딥러닝 뿐아니라 얕은(Shallow)모델도 구축 </br> 프로토타입을 작성하기 용이</td>
</tr>
<tr>
<td align="left">RecBole</td>
<td align="left"><a href="https://recbole.jo/">https://recbole.jo/</a></td>
<td align="left">파이토치 기반의 추천 알고리즘 라이브러리, 70개 넘개 구현</td>
</tr>
</tbody></table>
<h3 id="실무에서의-딥러닝-활용">실무에서의 딥러닝 활용</h3>
<h4 id="특징량-추출기로-활용">특징량 추출기로 활용</h4>
<ul>
<li>학습 완료 모델을 찾아 자사의 아이템에 적용하고 특징량을 추출한다.</li>
<li>각 아이템 이미지에 대해 수백 차원의 벡터를 얻을 수 있고 해당 벡터를 그대로 사용해 비슷한 아이템을 찾아낼 수 있으며 해당 벡터를 아이템의 특징량 중 하나로 사용해 회귀 모델을 적용할 수 있음</li>
</ul>
<h4 id="예측-모델로-활용">예측 모델로 활용</h4>
<ul>
<li>&quot;Are We Really Making Much Progress? A Worrying Analysis of Recent Neural Recommendation Approaches&quot; 논문에서 단순한 k-nearest 추천 시스템이 최근 딥러닝 추천 시시템의 대부분 보다 성능이 좋다라는 내용이 있음</li>
<li>추천시스템을 도입할 때 먼저 고전적인 방법을 검증한 뒤 딥러닝 사용을 검토해야한다</li>
<li>일반적으로 딥러닝으로 설명하기 어려운 과제들도 있으므로 고전적이고 단순한 방법이 오히려 실무에서 활용하기 좋을 수 있음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Chapter 5 - (2)]]></title>
            <link>https://velog.io/@dandelion_26/Chapter-5-2</link>
            <guid>https://velog.io/@dandelion_26/Chapter-5-2</guid>
            <pubDate>Thu, 20 Jul 2023 14:28:19 GMT</pubDate>
            <description><![CDATA[<h2 id="연관-규칙">연관 규칙</h2>
<ul>
<li>연관 규칙의 경우 협조 필터링 추천 중에서도 과거부터 지금까지 폭넓게 업계에서 활용되고 있다.</li>
<li>연관 규칙에서는 대량의 구매 이력 데이터로부터 &#39;아이템 A와 아이템 B는 동시에 구입하는 경우가 많다&#39;는 규칙을 발견</li>
<li>&#39;기저귀와 맥주&#39;를 통하여 알 수 있다.</li>
<li>SQL로도 구현 가능할정도로 계산 방법 자체는 간단</li>
</ul>
<table>
<thead>
<tr>
<th align="left"></th>
<th align="left">아이템A</th>
<th align="left">아이템B</th>
<th align="left">아이템C</th>
</tr>
</thead>
<tbody><tr>
<td align="left">사용자1</td>
<td align="left">o</td>
<td align="left">o</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">사용자2</td>
<td align="left">o</td>
<td align="left">o</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">사용자3</td>
<td align="left"></td>
<td align="left"></td>
<td align="left">o</td>
</tr>
<tr>
<td align="left">사용자4</td>
<td align="left">o</td>
<td align="left">o</td>
<td align="left">o</td>
</tr>
</tbody></table>
<h3 id="지지도">지지도</h3>
<ul>
<li>지지도란 어떤 아이템이 전체 중에서 출현한 비율.<blockquote>
<p>지지도(A) = (A의 출현 수) / 전체 데이터 수 3/4 = 0.75
지지도(B) = (B의 출현수) / 전체 데이터 수 3/4 = 0.75
지지도(C) = (C의 출현수) / 전체 데이터 수 2/4 = 0.5
지지도(A and B) = (A와 B의 동시 출현 수) / 전체 데이터 수 = 3/4 = 0.75</p>
</blockquote>
</li>
</ul>
<h3 id="확신도">확신도</h3>
<ul>
<li>아이템 A가 나타났을 때 아이템 B가 나타날 비율<blockquote>
<p>확신도(A -&gt; B) = (A와 B의 동시 출현 수) / (A의 출현수) = 3/3 = 1.0</p>
</blockquote>
</li>
</ul>
<h3 id="리프트값">리프트값</h3>
<ul>
<li>리프트값이란 아이템 A와 아이템 B의 출현이 어느 정도 상관관계를 갖는지 나타내는 것</li>
</ul>
<blockquote>
<p>리프트(A -&gt; B) = 지지도(A and B) / (지지도(A) * 지지도(B)) = 0.75 / (0.75 * 0.75) = 1.333</p>
</blockquote>
<ul>
<li><p>서로 독립적인 아이템이라면 리프트값은 1이 된다.</p>
</li>
<li><p>각 아이템의 양의 상관관계가 존재하면 리프트 값은 1보다 커지며 음의 상관관계의 경우 리프트 값은 1보다 작아진다.</p>
</li>
<li><p>또한 이러한 리프트 값에 로그를 취하면 <strong>점별 상호정보량(PMI)</strong>(Point Mutual Information)이 된다.</p>
</li>
<li><p>추천시스템의 경우 리프트 값이 높을 수록 아이템 A 출현과 아이템 B의 출현의 상관관계가 높으므로 아이템 A를 구입한 사용자에게 아이템 B를 추천하면 구입 확률이 높아질 가능성이 있다.</p>
</li>
<li><p>엄밀하게는 인과 관계가 아니기 때문에 실제 추천을 통하여 검증해야한다.</p>
</li>
<li><p>mlxtend 라이브러리의 apriori를 통하여 구현가능</p>
</li>
</ul>
<h2 id="사용자-사용자-메모리-기반-방법-협조-필터링">사용자-사용자 메모리 기반 방법 협조 필터링</h2>
<ul>
<li>메모리 기반 방법에서는 추천 시스템이 사용될 때까지 시스템 내의 사용자 데이터를 축적하기만 하고 계산은 수행하지 않으며 추천하는 시점에서 축적된 데이터 중 필요한 것을 모두 사용하여 예측 계산을 수행</li>
<li>예측 계산시 다른 알고리즘에 비해 시간이 걸리는 경우가 많다</li>
</ul>
<ol>
<li>미리 얻은 평갓값을 사용해 사용자 사이의 유사도를 계산하고 추천받을 사용자와 기호 경향이 비슷한 사용자를 찾는다</li>
<li>기호 경향이 비슷한 사용자의 평갓값으로 추천받을 사용자의 미지의 아이템에 대한 예측 평갓값을 계산</li>
<li>예측 평갓값이 높은 아이템을 사용자에게 추천한다.</li>
</ol>
<ul>
<li>Surprise 라이브러리를 활용하여 구현이 가능</li>
</ul>
<h2 id="회귀-모델">회귀 모델</h2>
<ul>
<li>미지의 아이템에 대한 평갓값을 회귀문제로 정식화함으로써 예측을 할 수 있다.</li>
<li>사용자-사용자 메모리 기반 방법 협조 필터링에 비하면 성능이 떨어질 수 있다.</li>
<li>무작위 추천과 비슷한 정확도를 보이는데, 평가 수에 일정한 임계값을 설정하면 이러한 현상을 피할 수 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Chapter 5 - (1)]]></title>
            <link>https://velog.io/@dandelion_26/Chapter-5</link>
            <guid>https://velog.io/@dandelion_26/Chapter-5</guid>
            <pubDate>Tue, 18 Jul 2023 09:29:53 GMT</pubDate>
            <description><![CDATA[<h1 id="chapter-5-추천-알고리즘-상세">Chapter 5. 추천 알고리즘 상세</h1>
<ul>
<li>구체적인 추천 시스템 알고리즘을 소개</li>
<li>MovieLens라는 영화 데이터셋을 통하여 실습</li>
</ul>
<h2 id="알고리즘-비교">알고리즘 비교</h2>
<ul>
<li>간단한 추천 모델을 시험해보고 싶다면 인기도 추천이나 연관 규칙을 선택 정확도를 높이고 싶다면 LDA 혹은 word2vec 또는 머신러닝 방법을 시험, 협조 필터링에서 정확도를 높이고 싶다면 행렬 분해 계열이나 머신러닝 방법을 하이브리드로 보다 정확도를 높이고 싶다면 회귀 모델이나 FM 또는 머신러닝 방법을 활용할 수 있다.</li>
</ul>
<table>
<thead>
<tr>
<th align="left">알고리즘명</th>
<th align="left">설명</th>
<th align="center">예측정확도</th>
<th align="center">계산속도(대규모데이터에서계산)</th>
<th align="center">콜드스타드 문제 대응</th>
</tr>
</thead>
<tbody><tr>
<td align="left">무작위 추천</td>
<td align="left">무작위로 아이템을 추천한다.</br>베이스라인으로 사용하기도 함</td>
<td align="center">X</td>
<td align="center">◎</td>
<td align="center">O</td>
</tr>
<tr>
<td align="left">통계 정보나 특정 규칙</br>을 기반으로 추천</br>(인기도 추천등)</td>
<td align="left">베이스라인으로 자주 사용한다</td>
<td align="center">X</td>
<td align="center">◎</td>
<td align="center">O</td>
</tr>
<tr>
<td align="left">연관 규칙</td>
<td align="left">간단한 계산 방법이고 SQL로도 구현할</br>수 있어 예전부터 널리 활용되고 있다.</td>
<td align="center">O</td>
<td align="center">O</td>
<td align="center">X</td>
</tr>
<tr>
<td align="left">사용자-사용자 메모리</br>기반 방법 협조 필터링</td>
<td align="left">위와 같음</td>
<td align="center">O</td>
<td align="center">O</td>
<td align="center">X</td>
</tr>
<tr>
<td align="left">회귀 모델</td>
<td align="left">회구 문제로서 추천 태스크를 정식화하여</br>다양한 머신러닝 방법을 적용한다.</td>
<td align="center">O</td>
<td align="center">O</td>
<td align="center">O</td>
</tr>
<tr>
<td align="left">SVD(특잇값 분해)</td>
<td align="left">간단한 행렬분해 방법</td>
<td align="center">△</td>
<td align="center">△</td>
<td align="center">X</td>
</tr>
<tr>
<td align="left">NFM(비음수 행렬 분해)</td>
<td align="left">비음수 제약을 추가한 행렬 분석 방법</td>
<td align="center">△</td>
<td align="center">△</td>
<td align="center">X</td>
</tr>
<tr>
<td align="left">MF(Matrix</br>Factorization)</td>
<td align="left">넷플릭스 프라이즈(Netfilix Prize)에서 좋</br>은 성적을 거둔 행렬 분해 방법</td>
<td align="center">O</td>
<td align="center">O</td>
<td align="center">X</td>
</tr>
<tr>
<td align="left">IMF(Implicit Matrix</br>Factorization)</td>
<td align="left">암묵적 평가값에 대응하는 행렬 분해 방법</td>
<td align="center">O</td>
<td align="center">O</td>
<td align="center">X</td>
</tr>
<tr>
<td align="left">BRP(Bayesian</br>Personalized</br>Ranking</td>
<td align="left">암묵적 평갓값에 대응하며 순위를 고려한</br> 행렬 분해 방법</td>
<td align="center">O</td>
<td align="center">O</td>
<td align="center">X</td>
</tr>
<tr>
<td align="left">FM(Factorization</br>Machines)</td>
<td align="left">평갓값 외에도 아이템과 사용자의 정보를</br>가미할 수 있는 방법</td>
<td align="center">O</td>
<td align="center">O</td>
<td align="center">O</td>
</tr>
<tr>
<td align="left">LDA(콘텐츠 기반)</td>
<td align="left">아이템의 콘텐츠 정보에 토픽 모델을 적용해</br> 추천하는 방법</td>
<td align="center">△</td>
<td align="center">△</td>
<td align="center">O</td>
</tr>
<tr>
<td align="left">LDA(협조 필터링)</td>
<td align="left">사용자의 행동 이력에 토픽 모델을 적용해</br> 추천하는 방법</td>
<td align="center">O</td>
<td align="center">△</td>
<td align="center">X</td>
</tr>
<tr>
<td align="left">word2vec(콘텐츠 기반)</td>
<td align="left">아이템의 콘텐츠 정보에 word2vec을 적</br>용해 추천하는 방법</td>
<td align="center">△</td>
<td align="center">O</td>
<td align="center">X</td>
</tr>
<tr>
<td align="left">item3vec(협조 필터링)</td>
<td align="left">사용자의 행동 이력에 word2vec을 적용</br>해 추천하는 방법</td>
<td align="center">O</td>
<td align="center">O</td>
<td align="center">X</td>
</tr>
<tr>
<td align="left">머신러닝</td>
<td align="left">머신러닝 추천 방법</td>
<td align="center">O</td>
<td align="center">△</td>
<td align="center">O</td>
</tr>
</tbody></table>
<h2 id="movielens-데이터셋">MovieLens 데이터셋</h2>
<ul>
<li>MoviesLens 데이터셋은 미네소타 대학의 그룹렌즈 연구소가 구축한 영화 평가 데이터셋</li>
<li>여러 데이터 셋 중 MovieLens 10M Dataset사용</li>
<li>1000만 건의 영화 평갓값이 있으며 사용자가 각 영화에 자유 형식의 특스트로 부여한 &#39;지브리&#39;, &#39;어린이용&#39;, &#39;무서워&#39;등의 태그 정보도 포함하고 있다</li>
</ul>
<table>
<thead>
<tr>
<th align="left">파일명</th>
<th align="left">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="left">movies.dat</td>
<td align="left">영화의 제목, 공개 연도, 장르 등의 정보, 이번 장에서는 id, title, genre만 사용한다</td>
</tr>
<tr>
<td align="left">tags.dat</td>
<td align="left">사용자가 각 영화에 부여한 태그 정보(사용자 ID, 영화 ID, 태그, 타임스탬프) 형식</td>
</tr>
<tr>
<td align="left">ratings.dat</td>
<td align="left">사용자가 각 영화에 부여한 평갓값 데이터(사용자 ID, 영화 ID, 평갓값, 타임스탬프) 형식</td>
</tr>
</tbody></table>
<h2 id="무작위-추천">무작위 추천</h2>
<ul>
<li>베이스라인으로 무작위 추천 시 얼마나 성능이 나오는지 확인</li>
<li>평갓값은 0.5 ~ 5.0이므로 0.5 ~ 5.0으로 우선 난수를 발생시키고 그것을 예측 평갓값으로 한다</li>
<li>학습용 데이터에 나타난 사용자와 아이템으로 사용자 X 아이템 행렬을 만들고 각 셀에 난수를 저장한다.</li>
<li>다음에 순위 지표 계산용으로 pred_user2items라는 딕셔너리를 작성하고 key에 user_id, value에 아직 사용자가 평가하지 않은 영화부터 무작위로 10개의 영화를 저장한다.</li>
</ul>
<pre><code class="language-python">from util.models import RecommendResult, Dataset
from src.base_recommender import BaseRecommender
from collections import defaultdict
import numpy as np

np.random.seed(0)


class RandomRecommender(BaseRecommender):
    def recommend(self, dataset: Dataset, **kwargs) -&gt; RecommendResult:
        # 사용자 ID와 아이템 ID에 대해 0부터 시작하는 인덱스를 할당한다
        unique_user_ids = sorted(dataset.train.user_id.unique())
        unique_movie_ids = sorted(dataset.train.movie_id.unique())
        user_id2index = dict(zip(unique_user_ids, range(len(unique_user_ids))))
        movie_id2index = dict(zip(unique_movie_ids, range(len(unique_movie_ids))))

        # 사용자 x 아이템의 행렬에서 각 셀의 예측 평갓값은 0.5~5.0의 균등 난수로 한다
        pred_matrix = np.random.uniform(0.5, 5.0, (len(unique_user_ids), len(unique_movie_ids)))

        # rmse 평가용으로 테스트 데이터에 나오는 사용자와 아이템의 예측 평갓값을 저장한다
        movie_rating_predict = dataset.test.copy()
        pred_results = []
        for i, row in dataset.test.iterrows():
            user_id = row[&quot;user_id&quot;]
            # 테스트 데이터의 아이템 ID가 학습용으로 등장하지 않는 경우도 난수를 저장한다
            if row[&quot;movie_id&quot;] not in movie_id2index:
                pred_results.append(np.random.uniform(0.5, 5.0))
                continue
            # 테스트 데이터에 나타나는 사용자 ID와 아이템 ID의 인덱스를 얻어, 평갓값 행렬값을 얻는다
            user_index = user_id2index[row[&quot;user_id&quot;]]
            movie_index = movie_id2index[row[&quot;movie_id&quot;]]
            pred_score = pred_matrix[user_index, movie_index]
            pred_results.append(pred_score)
        movie_rating_predict[&quot;rating_pred&quot;] = pred_results

        # 순위 평가용 데이터 작성
        # 각 사용자에 대한 추천 영화는, 해당 사용자가 아직 평가하지 않은 영화 중에서 무작위로 10개 작품으로 한다
        # 키는 사용자 ID, 값은 추천 아이템의 ID 리스트
        pred_user2items = defaultdict(list)
        # 사용자가 이미 평가한 영화를 저장한다
        user_evaluated_movies = dataset.train.groupby(&quot;user_id&quot;).agg({&quot;movie_id&quot;: list})[&quot;movie_id&quot;].to_dict()
        for user_id in unique_user_ids:
            user_index = user_id2index[user_id]
            movie_indexes = np.argsort(-pred_matrix[user_index, :])
            for movie_index in movie_indexes:
                movie_id = unique_movie_ids[movie_index]
                if movie_id not in user_evaluated_movies[user_id]:
                    pred_user2items[user_id].append(movie_id)
                if len(pred_user2items[user_id]) == 10:
                    break
        return RecommendResult(movie_rating_predict.rating_pred, pred_user2items)


if __name__ == &quot;__main__&quot;:
    RandomRecommender().run_sample()</code></pre>
<hr>
<h2 id="통계-정보나-특정-규칙에-기반한-추천">통계 정보나 특정 규칙에 기반한 추천</h2>
<ul>
<li><p>다음과 같은 통계 정보나 규칙에 기반해 추천하는 것을 생각한다</p>
<ul>
<li>직전 1개월의 총 매출 수, 열람 수, 사용자에 따른 평갓값의 평균 등 서비스의 데이터 통계 정보를 사용해 아이템을 나열해서 사용자에게 추천</li>
<li>아이템 가격이나 크기와 같이 특정 속성 순서로 나열해 사용자에게 추천</li>
<li>사용자의 나이 등과 같은 특정 속성 정보에 기반해 다른 아이템 추천</li>
</ul>
</li>
<li><p>서비스의 데이터 통계 정보나 아이템 속성 정보에 기반해 나열하는 추천은 특정 사용자에게 의존하지 않는 정보에 기반해 아이템을 나열하여 추천하므로 기본적으로 개인화를 수행하지 않는 알고리즘</p>
</li>
<li><p>기본적인 통계 데이터나 아이템 속성 정보는 추천 시스템의 콘텍스트에 관계없이 시스템이 갖고 있는 것이 많으며 다루기 쉬운 데이터이므로 구현하기가 비교적 쉽다고 할 수 있다.</p>
</li>
<li><p>비교적 단순한 알고리즘을 사용한 추천은 해당 아이템이 어떤 구조로 추천되는지 사용자가 알기 쉽다는 특징이 있다</p>
</li>
<li><p>예) &#39;지난달 판매 순위&#39; 라고 했을 때 가장 위에 추천된 아이템은 지난달 가장 많이 판매된 아이템일 것</p>
</li>
<li><p>사용자가 추천 이유를 쉽게 알 수 있도록 했을 때 사용자의 구매 행동과 연결되는 경우가 많기에 고려해야함</p>
</li>
<li><p>사용자의 속성 정보를 기반으로 다른 아이템을 추천하는 경우, 사용자의 속성 정보를 기반으로 상요자를 몇 가지 세그먼트로 나눔으로써 각각의 사용자 세그먼트에 적합하게 추천을 진행</p>
</li>
<li><p>예) 전자상거래 사이트에서 프로필을 남성으로 선택한 사용자에게는 서비스 안에서도 마찬가지로 남성을 선택한 다른 사용자들이 자주 열람하는 순서대로 아이템을 추천한다.</p>
</li>
<li><blockquote>
<p>성별에 관계없이 모든 사용자가 잘 열람하는 순서로 아이템을 추천하는 것 보다 흥미가 있는 아이템을 추천할 수 있음</p>
</blockquote>
</li>
<li><p>사용자의 나이, 성별, 거주지 등의 인구 통계학적 데이터에 기반해 아이템을 추천하는 것을 <strong>데모그래픽 필터링</strong>(demographic filtering)이라고 한다.</p>
</li>
<li><p>데모그래픽 필터링에서는 사용자의 속성 정보별로 아이템을 추천하는 것만으로도 어느 정도 흥미가 있는 것을 추천할 가능성이 존재</p>
</li>
<li><p>주의점</p>
</li>
<li><p>서비스나 사용자의 성질에 따라 데모그래픽 정보를 일부러 입력하지 않거나 경우에 따라 잘못된 정보가 입력될 수도 있다</p>
</li>
<li><p>예) 아마존 등의 전자상거래 사이트에서 굳이 사용자가 자신의 성별이나 나이를 입력하는 일은 많지 않을 수 있다</p>
</li>
<li><p>매칭 서비스와 같이 비교적 능동적으로 프로필을 입력하는 경향이 있는 서비스라 하더라도 프로필을 잘 입력하지 않거나 자신을 보다 돋보이게 하기 위해 허위 정보를 입력하기도 함</p>
</li>
<li><p><strong>공평성</strong>관점에서 데모그래픽 데이터를 사용할 때 주의해야함</p>
</li>
<li><p>예) 사용자에게 성별 등을 묻는 것 자체가 문제될 수 있다</p>
</li>
<li><p>그리고 남성이니까 또는 여성이니까 같은 사고 방식은 설령 그것이 통계적인 경향을 갖고 있다하더라도 그 경향을 서비스 지표 개선 등의 목적으로 사용할 수는 없다</p>
</li>
<li><p>그리고 의도치 않게 그런 정보를 사용했다가 문제가 되기도 한다.</p>
</li>
<li><p>예) 아마존은 채용 과정에서 지원자의 프로필 정보가 회사와 얼마나 매치되는지 머신러닝으로 산출 후 스크리닝에 사용했다</p>
</li>
<li><p>하지만 후보자의 성별에 따라 채용 시험 합격률에 큰 차이가 있었다는 사실이 발각되어 문제가 되었다</p>
</li>
<li><p>사용자의 데모그래픽 정보라는 것은 개발자가 특정 정보를 사용하지 않았어도 공평성 관점에서 문제가 될 수 있어 사용 시 세심한 주의가 필요하다.</p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>