<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>stella_y.log</title>
        <link>https://velog.io/</link>
        <description>data scientist</description>
        <lastBuildDate>Sun, 14 Apr 2024 14:42:03 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. stella_y.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/stella_y" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[paper review] Recommending What Video to Watch Next: A Multitask Ranking System]]></title>
            <link>https://velog.io/@stella_y/paper-review-Recommending-What-Video-to-Watch-Next-A-Multitask-Ranking-System</link>
            <guid>https://velog.io/@stella_y/paper-review-Recommending-What-Video-to-Watch-Next-A-Multitask-Ranking-System</guid>
            <pubDate>Sun, 14 Apr 2024 14:42:03 GMT</pubDate>
            <description><![CDATA[<h3 id="abstract">abstract</h3>
<ul>
<li>&#39;다음 볼 영상&#39;(youtube) 추천을 위한 large scale multi objective ranking system 제안함</li>
<li>multi task learning 방식을 제안했는데, ctr 뿐 아닌, 좋아요, 공유 등 multiple competing ranking objectives 가 동시에 존재하는 현실의 상황을 해결하기 위한 것임.</li>
<li>방식<ul>
<li>Multi-gate Mixture-of-Experts 방식을 Wide &amp; deep model 에 적용하고 selection bias 완화를 위한 shallow tower를 제시함.</li>
<li>soft-parameter sharing techniques(such as Multi-gate Mixture-of-Experts) 을 통해서 여러 objective를 고려한 ranking을 하는 방법을 제시함.</li>
</ul>
</li>
</ul>
<h3 id="introduction">Introduction</h3>
<ul>
<li>시장에서 자주 문제시 되는 &#39;상충 되는 목표에 대한 최적화&#39;를 달성하기 위해 multi task learning 을 이용함.<ul>
<li>상충되는 목표 최적화가 필요한 경우의 예 : 영상 재생율 뿐 아니라, 사용자들이 높게 평가하고 친구들과 공유하는 동영상을 추천하고 시청하기를 원하는 경우.</li>
</ul>
</li>
<li>시스템에 종종 존재하는 내재적인 편향을 &quot;shallow tower&quot; 라는 방식으로 제거하고자 함.<ul>
<li>내재적 편향의 예시 : 사용자가 비디오를 클릭하고 시청한 이유가 단순히 높은 순위에 있었기 때문이며, 사용자가 가장 좋아하는 것이 아니었을 수 있음.</li>
</ul>
</li>
<li>평가 방식<ul>
<li><ol>
<li>multitask learning 자체에 대한 평가</li>
</ol>
</li>
<li><ol start="2">
<li>position bias가 제거 되었는지 평가</li>
</ol>
</li>
</ul>
</li>
</ul>
<h3 id="model-architecture">Model architecture</h3>
<p><img src="https://velog.velcdn.com/images/stella_y/post/56015aa2-9003-495a-b5a5-a986fffc7c9d/image.png" alt=""></p>
<h4 id="ranking-objectives">Ranking objectives</h4>
<ul>
<li>유저의 행동을 아래의 두 가지 기준으로 나눠서 objective 로 설정함.</li>
<li><ol>
<li>Engagement objectives</li>
</ol>
<ul>
<li>e.g. 클릭, 시청</li>
<li>binary classification task(click) 나 regression task(시청 시간)으로 설정</li>
</ul>
</li>
<li><ol start="2">
<li>Satisfaction objectives</li>
</ol>
<ul>
<li>e.g. 좋아요 클릭, 별점</li>
<li>동일하게 objective 성격에 따라 binary classification task(좋아요 클릭) 나 regression task(별점 수)으로 설정</li>
</ul>
</li>
</ul>
<h4 id="modeling-task-relations-and-conficts-with-multi-gate-mixture-of-experts">Modeling Task Relations and Conficts with Multi-gate Mixture-of-Experts</h4>
<p><img src="https://velog.velcdn.com/images/stella_y/post/83af8962-b281-41c5-b7c0-dbd65831c31d/image.png" alt=""></p>
<ul>
<li>과거의 deep learning 을 이용한 multi task learning task 는 좌측과 같은 구조를 이용한다. 그런데 이때 자주 발견됐던 단점이, 두 objective 중 적어도 하나는 single task 로 학습시켰을 때보다 결과가 좋지 않았다. 아마도 서로 다른 objective 에만 기여할 feature 들이 간섭을 하게 되면서 오히려 성능이 떨어진 걸로 보인다.</li>
<li>최근 연구에서 이런 단점을 해결해 줄 방안으로 MMoE(Multi-gate Mixture of Experts) architecture 가 제시되었다. 이는 우측의 그림에서처럼  shared bottom layer 위에 expert layer 를 위치시키고, 이 expert layer 의 out connection 을 바로 task layer 로 연결시키지 않고, softmax gate 를 통해서 연결시킨다. 이를 통해 shared bottom을 이용할때 처럼 쓸데없는 정보가 서로 다른 objective에 관여하여 성능이 저하되는 현상을 막을 수 있게 한 것이다.</li>
</ul>
<h4 id="modeling-and-removing-position-and-selection-biases">Modeling and Removing Position and Selection Biases</h4>
<p><img src="https://velog.velcdn.com/images/stella_y/post/8ca80f54-351f-4c1b-809e-fe2fe26fc24f/image.png" alt=""></p>
<ul>
<li>Implicit feedback(e.g. click)은 랭킹 모델을 학습하는 데 널리 사용되지만(사용자 로그에서 추출된 대규모의 click feedback을 사용하여 모델을 학습), 이런 피드백들은 기존의 랭킹 시스템에서 생성되었기때문에 편향되어있을 수 밖에 없다.<ul>
<li>사용자가 실제 사용자 효용과 사용자 선호도와 관계없이 목록 상단에 표시된 비디오를 클릭하고 시청하는 경향이 있다는게 이런 position bias의 예시라고 볼 수 있고, 이로 인한 문제점들은 다수의 연구에서 이미 확인된 바 있다.</li>
</ul>
</li>
<li>이걸 해결하기 위해 shallow tower 를 사용하게 된다. 모델 예측을 두 부분을 figure1의 그림에서처럼 main tower 와 shallow tower로 나누고, main tower에서의 사용자 feature 로 학습하되, shallow tower 에서는 bias에 대한 요소를 학습하게 한다.</li>
<li>즉, shallow tower에서는 position bias 학습을 위한 position feature등의 같은 selection bias에 기여하는 피쳐로 shallow tower 를 학습시키고, 이를 main tower의 최종 logit에 추가하는 식으로 학습하게 된다.</li>
<li>학습 시에는 모든 위치를 사용하며, position feature에 과도하게 의존하지 않도록 10%의 피쳐 드롭아웃 비율을 적용한다.</li>
<li>단 serving 할때에는 position feature를 제거한다.</li>
</ul>
<h3 id="experiment">Experiment</h3>
<h4 id="multitask-ranking-with-mmoe">Multitask ranking with MMoE</h4>
<ul>
<li>live experiment<ul>
<li>baseline model 로는 shared bottom 형태로 만들고, 단 이때에 공평한 설계를 위해서 model architecture 내의 multiplication 수를 동일하게 한다.
<img src="https://velog.velcdn.com/images/stella_y/post/c76c13fa-358d-4483-89cb-4ac9aaf971aa/image.png" alt=""></li>
<li>MMoE를 썼을때에 모든 메트릭의 지표가 상승함</li>
</ul>
</li>
<li>Gating Network Distribution
<img src="https://velog.velcdn.com/images/stella_y/post/81d3b776-41d3-47a3-ab59-db50db9b900f/image.png" alt=""><ul>
<li>일부 expert들의 결과물이 다른 작업들에서 잘 공유되고 있단걸 볼 수 있음.</li>
</ul>
</li>
<li>Gating Network Stability.<ul>
<li>여러 개의 machine을 사용하여 모델을 학습시킬 때, distributed training strategy는 모델 발산을 자주 야기시키곤 한다.(e.g. Relu death)</li>
<li>MMoE에서는 softmax gating network가 불균형한 expert distiribution 문제를 가질 수 있다고 보고되었다. (즉, 대부분의 전문가에 대한 제로 활용으로 수렴되는 것)</li>
<li>distribution training을 통해 이 모델에서는 gate network 극성 문제가 발생할 가능성이 20%라는 것을 관찰했다.</li>
<li>이 문제를 해결하기 위해 gating network에 drop out을 적용했고, 10%의 확률로 expert의 활용도를 0으로 설정하고 softmax 출력을 다시 regularization해서 모든 gate network의 극성을 제거한다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Lecture review] openai api 마스터하기 - Sec1]]></title>
            <link>https://velog.io/@stella_y/Lecture-review-openai-api-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0-Sec1</link>
            <guid>https://velog.io/@stella_y/Lecture-review-openai-api-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0-Sec1</guid>
            <pubDate>Sun, 18 Feb 2024 14:41:44 GMT</pubDate>
            <description><![CDATA[<p>&quot;<a href="https://www.udemy.com/course/mastering-openai-korean/">OpenAI API 마스터하기: GPT-4의 무한한 창의성 끌어내기</a>&quot;
ChatGPT API, Whisper, 임베딩, DALL-E 에 대해 배우면서, 프롬프트 엔지니어링을 체험해 볼 수 있는 강의라기에 시도해보았다.
api를 활용한 다양한 예제들을 보여주고 있어서, <a href="https://github.com/openai/openai-python">open ai github readme</a>등을 읽으며 사용법을 익히는 것보다 활용에 대한 아이디어를 떠올려보는데에 많은 도움을 주고 있는 것 같다.</p>
<p>첫번째 섹션에서는 open ai 의 약력부터, gpt에 대한 간단한 개요, 트랜스포머에 대한 소개, 계정 생성하는 부분까지로 이어지는데, 여기까지 본 강의 내용을 요약해보았다.</p>
<h2 id="open-ai-약력">Open ai 약력</h2>
<p><img src="https://velog.velcdn.com/images/stella_y/post/6e88bc4c-cf18-44c5-b498-0efc54e504be/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/stella_y/post/77ef2afb-d406-4300-8eb0-7b4294b84c06/image.png" alt=""></p>
<p>2015년 연구만을 위한 비영리단체로, 일론머스크를 포함하여 아주 유명한, 몇몇 개인의 투자로 설립되었다. 처음 설립된 이래로 내 주변 사람들 모두 저 저 회사가 얼마나 오래 비영리 단체로 유지될 수 있을지 의심하고 있었는데, 일론머스크 이탈, 산하에 영리단체 신설, 2020년 gpt3 api 를 유료 형태로 open 등의 결국은 어느정도 수익화하는 모습이었고, 그 이후로 DALL-E(generate image from text), Codex(generate code based on language input), chat GPT 를 잇달아 공개했다.
일부 영리 프로젝트가 있기는 하지만, 여전히 open ai 자체는 비영리 단체로 유지되고 있다. 그러나 2021과 2023년에는 마이크로소프트에서 추가 투자를 받으면서 GPT-4 지적재산권 라이센스와 기타 제품 상용화 독점계약을 얻어서, GPT4까지는 마이크로 소프트 소유라고 생각해도 되지 않나 싶다.</p>
<h2 id="gpt와-prompt">GPT와 prompt</h2>
<ul>
<li>Generative Pre-Trained Transformer</li>
<li>생성형 language model 이라 initial text 를 주면 그 다음에 이어질 text들을 생성해내는 방식으로 사용할 수 있으며, 이때의 initial text를 prompt라고 부르고, 이 prompt를 잘 생성해내는 과정을 prompt engineering 이라고 한다.</li>
<li><img src="https://velog.velcdn.com/images/stella_y/post/933c1450-4ba4-4998-89b1-5a3de6b35346/image.png" alt=""></li>
<li>gpt 와 상호작용하는 방법은 크게 아래의 두 가지라고 볼 수 있다.<ul>
<li>completion : 하나의 text prompt를 주는 방식(Expects a single text prompt)<ul>
<li>(gpt4는 미지원)</li>
</ul>
</li>
<li>chat : chat based format 으로 message 의 list를 주는 방식(Expects a list of messages in a chat-based format)</li>
</ul>
</li>
</ul>
<h2 id="transformer-란">Transformer 란</h2>
<ul>
<li>Neural network 를 구분하는 방법이 여러가지가 있을텐데, 여기서는 CNN, RNN, Transformer 로 구분짓고, 있다.</li>
<li>Natural language 에 대한 연구가 처음 시작될때에는 RNN을 기반으로 했었는데, 여기엔 여러 단점이 있었는데,<ul>
<li>token을 하나씩 순차적으로 인식하다보니, 분량이 긴 텍스트는 분석이 어렵다는 점이 있었고,(gradient banishing)</li>
<li>속도가 느려서 많은 데이터를 학습시키기가 어렵고,</li>
<li>순차적으로 처리되다보니, 병렬화가 불가능했다.</li>
</ul>
</li>
<li>이런 단점을 극복하고자 transformer가 등장했는데, 이 경우<ul>
<li>전체 input을 순차 처리 하지 않다보니, (텍스트를 순차적으로 인식하는 대신 positional encoding을 이용한다) gradient banishing 문제가 사라졌고,</li>
<li>병렬화 또한 가능해졌다</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/stella_y/post/c6cbb78d-04b7-4009-a228-ce5fe33bcc50/image.png" alt=""></p>
<h3 id="positional-encoding">positional encoding</h3>
<ul>
<li>순차 처리할 필요가 없어지고(위치를 encoding 해서 이미 알고있기때문에!)</li>
<li>어순의 중요도를 파악하는 역할을 해줄 수 있다.</li>
</ul>
<h3 id="attention">attention</h3>
<ul>
<li>입력 데이터의 특정 부분에만 선택적으로 주의를 기울이는 방식으로, 입력 데이터 각 부분에 어텐션 점수를 매겨서 요소들의 가중치나 평균값을 구하게 된다.</li>
<li>이렇게 어디에 집중해야할지를 모델에 배우는게 가능지면서, 데이터가 충분하면 문법, 어순, 시제 동사 등의 언어 작동원리를 알아서 파악하는게 가능해졌다!</li>
<li>attention 자체는 이미 sequence to sequence model 에서 등장했던 바가 있고 (이건 large language model 이 나오기 이전의 일이다... ㅎㅎ 옛날 같지만 별로 안됐다ㅠ), 인코더가 해당 단어를 vector 화 한 결과는 디코더가 그 단어를 예측할때에 쓰는 vector 와 같을거라는 가정에서, 각 출력에 대응되는 입력상태를 더 많이 참조하도록 가중치를 주자는 컨셉에서 등장했다. (<a href="https://github.com/stella-y/TIL/blob/7daddfe4dd73a8fd4a42b90d84636b036ed60f3f/Deeplearning/attention.md">이전에 til 하면서 정리를 했었...</a>)</li>
<li><a href="https://www.phontron.com/class/nn4nlp2018/description.html">2018 년 cmu의 nlp 강의</a>를 들으면서 <a href="https://github.com/stella-y/TIL/blob/master/NeuralNetworks_for_NLP_Spring2018/20180706_attention.md">요약했던 자료</a>도 있는데,,, 이것도 꼭 다시 정리를 해놔야겠다... ㅎㅎ 과거의 업보가 많다...</li>
</ul>
<h2 id="open-ai-계정">open ai 계정</h2>
<ul>
<li>chat gpt 를 써봤어서, 이미 계정은 있었다.</li>
<li><a href="https://platform.openai.com/docs/overview">platform.openai.com의 document</a> 페이지에서 쓸 수 있는 api 들은 다 하나씩 찾아볼 수 있고</li>
<li><a href="https://platform.openai.com/api-keys">api key</a> 페이지에서 secret key 를 생성해야한다. 여기서의 key를 복사해서 보관하고 있어야 계속 쓸 수 있다.</li>
<li>api document 에서 pricing도 확인할 수 있는데, 무료인 api는 하나도 없다... 카드 등록해두고, 한달에 쓰는 돈의 limit 을 꼭 걸어놔야 한없이 빠져나가지 않는다 ㅎㅎㅎ</li>
</ul>
<h2 id="create-text-project">create text project</h2>
<ul>
<li>pip install openai 로 필요한 모듈을 설치할 수 있는데, 강의가 만들어진 이후에 업데이트가 꽤 많았던 건지,,, 강의에 나온 create text project예제로 나온 코드를 그냥 실행시키면 실행이 안된다. (pip 할때에 version을 1.0 이하로 지정해두거나, 아니면 새 버전 방식으로 콜해야한다)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[paper review] Bandit based Optimization of Multiple Objectives on a Music Streaming Platform]]></title>
            <link>https://velog.io/@stella_y/paper-review-Bandit-based-Optimization-of-Multiple-Objectives-on-a-Music-Streaming-Platform</link>
            <guid>https://velog.io/@stella_y/paper-review-Bandit-based-Optimization-of-Multiple-Objectives-on-a-Music-Streaming-Platform</guid>
            <pubDate>Sun, 21 Jan 2024 13:47:45 GMT</pubDate>
            <description><![CDATA[<p>본 글에서는 KDD 2020, 스포티파이에서 발표한 논문을 요약해보았다.</p>
<p>이 논문에서는 Bandit 알고리즘을 multi objective 문제 해결에 사용할 수 있는 방법을 제시하고 있다.
언제부터인가 추천 시스템에서 bandit을 활용한 논문들이 싹 사라져버렸다. ㅠ 그럼에도 bandit은 streaming 에 쉽게 활용할 수 있고, cold start 문제에 적용하기도 비교적 쉽기에, 이 연구를 발견했을때에 매우 반가웠다. :)</p>
<h3 id="abstract">Abstract</h3>
<p>온라인 추천시스템의 경우 multi-stakeholder 의 objective 를 만족시켜야 하는경우가 종종 있다. 예를들어 아래와 같은 경우를 들 수 있다. 
    - 구매자와 판매자를 모두 만족시켜야하는 amazon
    - guest 와 host 를 모두 만족시켜야하는 airbnb
    - rider 와 driver를 모두 만족시켜야하는 uber
    - listener와 artist를 모두 만족시켜야하는 spotify</p>
<p>이 논문에서는 contextual bandit 을 multi objective setting 으로 확장시켜서 multi-stakeholder를 만족시키는 추천 시스템을 만드는걸 목표로 한다.
기본적으로는 contextual bandit 세팅하에서 여러개의 objective 를 동시에 공정한 방식으로 학습하는데, 알고리즘 진행은 아래의 두 과정으로 요약할 수 있다.</p>
<ol>
<li>GGI(Generalized Gini Index) 라는 aggregation function이용해서, 여러개의 objective 를 결합함과 동시에 밸런싱한다.</li>
<li>online gradient ascent learning algorithm 사용해서, GGI 로 scalarise된 objective들에 대한 reward vector를 최대화 시킨다</li>
</ol>
<h3 id="introduction">Introduction</h3>
<details>
<summary>intro는 이 안에 있는 몇문장으로 요약이 가능하다.(어차피 내용이 뻔해서,,, 해석까지는 안해둬도 될듯 ㅎㅎ)</summary>

<blockquote>
<ul>
<li>We propose a multi-objective formulation of a contextual bandit based recommender system.</li>
</ul>
</blockquote>
<ul>
<li>We propose a multi-objective contextual bandit model based on Generalized Gini Index (GGI) by introducing a model that assimilates contextual information and optimizes for a number of different, including competing objectives</li>
<li>The goal of the proposed <strong>GGI based optimization</strong> is to be both efficient, i.e., <strong>minimize the cumulative cost for each objective</strong>, and fair, i.e., <strong>balance the different objectives</strong></li>
<li>We propose an online <strong>gradient ascent method</strong> to maximise a scalarisation of the accumulated reward over several objectives.</li>
<li>Experiments with multiple user-centric objectives suggest that optimizing for multiple interaction metrics performs better for each metric than optimizing single metric. Beyond multiple user-centric objectives, experiments around adding promotional objectives (e.g. gender promotion) demonstrate that the <strong>platform can obtain gain in such promotional-centric or supplier-centric objectives without severe loss in user centric objectives.</strong></details>

</li>
</ul>
<h3 id="background-and-related-work">Background and Related work</h3>
<h4 id="multi-objective-optimization">Multi objective Optimization</h4>
<ul>
<li>전통적인 MOO(Multi objective optimization) 방식은 Pareto front 를 바로 찾아내는걸 목표로 한다.(Pareto front line 을 그어서, 여러 objective 모두에서 손해를 보지는 않는 포인트를 찾아내는 방식)</li>
<li>이 외에는 aggregation function 등을 활용해서 vector 형태의 objective(여러 objective)를 scala 화 해서 최적화 시키는 방식 등이 있다.
(aggregation function 에는 weighted sum 이나 regularized maximin fairness policy 등이 있을 수 있음)</li>
<li>이 논문에서는 위에서의 두 번째 방식인 aggregation function을 이용하는 방식을 취하는데, 이때에 <strong>generalised Gini function</strong>을 이용하고, 이 방식은 total ordering과 선형적 우선순위 모두에 대해서 일반화를 잘 시킨다고한다.</li>
<li>MOO 를 supervised learning 방식으로 해결했던 과거 접근법과 달리 이 논문의 방식에선 <strong>더 interactive하고, user feedback 을 기반으로 adaptive 한 learning이 가능</strong>한 방식에 초점을 맞췄다.</li>
</ul>
<h4 id="moo-in-search--recommender-system">MOO in Search &amp; Recommender system</h4>
<ul>
<li>recommendation에서의 MOO를 시도했던 예시로 collaborative filtering의 확장 또한 포함될 수 있을 것이다.</li>
<li>기존 방식과 이 논문에서 소개한 접근 방식의 주요 차이점은 밴딧기반 세팅에 초점을 맞췄다는 점인데, 그런만큼 item 간의 유사성 정보가 불확실 하거나, 새로운 item 이 들어왔을때에 더 큰 힘을 발휘한다.</li>
</ul>
<h4 id="bandits--multi-objective-bandit">Bandits &amp; Multi-objective Bandit</h4>
<ul>
<li>Multi objective multi-armed bandit, multi-objective variants of contextual bandit들에 대한 연구는 최근 주목을 덜 받고 있는 편이다.</li>
<li>요즘 주목받는 연구들은 그 대신 item 간의 유사성 정보(item similarity)가 이미 있다거나, objective 가 여러개더라도 dominant 한 하나가 있는 상황을 가정한 경우가 많은데, 실제 비지니스 현장에서는 이런 상황들은 많지 않다.(특히 사용자 행동 데이터를 기반으로 reward를 도출해야하는 상황에서는 더 그렇다..)</li>
</ul>
<h3 id="objectives--stakeholders">Objectives &amp; stakeholders</h3>
<h4 id="objective-definitions">Objective Definitions</h4>
<ul>
<li>이 논문은 spotify에서 작성된 만큼, 유저의 음악 스트리밍 상황을 가정한다. 두 가지 objective를 목표로 둔다.</li>
</ul>
<ol>
<li>user centric objectives<ul>
<li>stream : 유저의 음악 스트리밍 시간</li>
<li>clicks : 플레이 리스트 클릭 수</li>
<li>songs played : 재생한 음악 수</li>
</ul>
</li>
<li>two artist and platform centric objectives<ul>
<li>Diversity : 추천된 set 에서의 gender 다양성</li>
<li>promotion : platform 에서 promotion 하고자 하는 아티스트의 음악의 수
<img src="https://velog.velcdn.com/images/stella_y/post/453e75e3-0c6b-478e-acf2-09e82e2851cf/image.png" alt=""></li>
</ul>
</li>
</ol>
<ul>
<li>위 objective 들을 보면 일부를 최적화 하는게, 다른 objective 에 좋지 않은 영향을 줄 수 있도록 설계되었음을 알수 있다.</li>
<li>이런 서로 상충되는 objective 들 간의 미묘한 밸런스를 맞추는 것에 이 알고리즘도 주안점을 둔다.</li>
</ul>
<h4 id="contextual-bandit-based-recommendation">Contextual Bandit based Recommendation</h4>
<p><img src="https://velog.velcdn.com/images/stella_y/post/f95957ae-30c7-480f-9d03-d1d6794cd15b/image.png" alt=""></p>
<ul>
<li><p>다른 여타 Contextual Bandit algorithm 처럼 이 알고리즘에서도</p>
<ol>
<li>context feature 들을 관찰하고</li>
<li>이 feature 들이 의해서 k개의 가능성들 중 a라는 action을 선택할 수 있게 되는데</li>
<li>주어진 context와 action에 대한 reward가 분포로서 주어지게 될 것이고, 이에 따라 action을 결정할 수 있게 될 것이다.</li>
</ol>
</li>
<li><p>위의 과정에서 이 논문에서는 아래의 feature 들을 활용했다.</p>
</li>
<li><p>Context feature:</p>
<ul>
<li>(i) user: 나이, 성별, 사는 지역, 장르 선호도</li>
<li>(ii) playlist: 아티스트, micro or macro 장르, diversity, 인기도 등</li>
<li>(iii) affinity between the user and the playlist: user와 playlist 사이의 과거 interaction 들(streams, skips, likes, saves)</li>
<li>(iv) 그 외... (the day of the week and the time of day)</li>
</ul>
</li>
<li><p>Actions: selecting a set to recommend to the user.</p>
<ul>
<li>사용자에게 playlist(a collection of tracks)를 제공하는 세트 기반 추천</li>
<li>각 트랙은 특정 아티스트로 구성</li>
</ul>
</li>
<li><p>Rewards:</p>
<ul>
<li>전통적인 user-centric system 이라면 user들이 얼마나 이 추천을 좋아했는지를 확인할테지만,</li>
<li>이 논문에선 multi- stakeholder recommender system을 지향하기에, reward function에서도 vectorial rewards에 대해서 최적화시킨 arm 이 선택되는 방식을 취한다. </li>
</ul>
</li>
</ul>
<h3 id="multi-objective-contextual-bandit">Multi-objective Contextual Bandit</h3>
<h4 id="arm-selection-strategy">arm selection strategy</h4>
<ul>
<li><p>다른 bandit 알고리즘이 그렇듯, 아래처럼 arm selection 함수를 정의할 수 있다.
<img src="https://velog.velcdn.com/images/stella_y/post/ff2ca6b8-157a-4efd-8ea5-9484548667d6/image.png" alt=""></p>
<ul>
<li>alpha : arm 선택여부 / 뮤 : k번째 arm 선택시의 reward</li>
<li>G : scalarisation function (여기서는 GGI 쓴 것이고, 이에 대한 설명은 아래에 있다!)</li>
</ul>
</li>
<li><p>GGI (Generalised Gini Index)</p>
<ul>
<li>(본인은 이 함수를 처음 봤는데, 대충 1981년에 쓰여진 <a href="https://www.sciencedirect.com/science/article/abs/pii/0165489681900184">논문</a>에 등장하고 있는걸로 확인했고, 그 특성에 대해서만 아래처럼 알고 있으면 될듯하다...)</li>
<li><img src="https://velog.velcdn.com/images/stella_y/post/e95b0ea5-06b9-45a6-a3d6-1be6c96ea1bb/image.png" alt=""></li>
<li>𝜎 permutes the elements of 𝒙 such that (𝒙𝜎 )𝑖 ≤ (𝒙𝜎 )𝑖+1</li>
<li>GGI 자체는 좀 생소하지만, 아래와 같은 속성을 갖는 인덱스이기때문에 여기서 활용이 가능하단걸 알 수 있다.<ul>
<li>GGF는 strictly monotonic하기때문에, 이 함수를 maximize시킨 지점이 pareto front(여러 objective 에 대한 최적의 해 중 하나에 해당하게 됨) 에 존재하되, weight 에 따라서 다른 지점의 점을 선택하게 된다.<ul>
<li>GGF exhibits afairness property under the Pigou-Daltontransfer: if 𝒙𝑖 &lt;𝒙𝑗, then 𝐺𝒘(𝒙′)&gt;𝐺𝒘(𝒙) for 𝒙𝑖′=𝒙𝑖+𝜖 and𝒙′𝑗 =𝒙𝑗−𝜖 where 𝜖&lt;𝒙𝑗−𝒙𝑖 and 𝒙𝑘′ =𝒙𝑘 for𝑘≠𝑖,𝑗.In other words, an equitable transfer of an arbitrarily small amount from a larger component to a smaller component is always preferable. </li>
</ul>
</li>
<li>-&gt; 이 말에 대해서 완벽히 해석하긴 좀 어려워서 일단 본문을 가져왔다... 그치만 대충만이라도 요약을 하자면 이 함수는 <strong>Loss 가 높은 objective에 더 weight를 많이 주어서 더 많이 고려하여 업데이트</strong> 하면서도, 전체 objective 들에 대해서 공평하게 aggregate 를 해준다는 의미 인것으로, 여러 objective를 공평하게 스칼라화할때에 이 function을 쓰는게 유효하다는걸 강조하는 내용인걸 알 수 있다 ㅎㅎ</li>
</ul>
</li>
</ul>
</li>
<li><p>Regret 을 정의하는 과정</p>
<ul>
<li>(arm selection strategy에서) 시점 t에 얻을 평균 reward 
<img src="https://velog.velcdn.com/images/stella_y/post/0787f3c9-d5c0-4d6e-bc47-b948bc13e33e/image.png" alt=""></li>
<li>T시점에서의 regret은 아래처럼 정의 가능함
<img src="https://velog.velcdn.com/images/stella_y/post/b46b7156-79bc-4697-81e9-964f47cf54c5/image.png" alt=""></li>
</ul>
</li>
<li><p>regression으로 풀수도 있겠으나, matrix 가 커지면 쉽지 않을 것</p>
<ul>
<li>First estimate parameter 𝜗∗ via 𝑙2-regularised least-squares regression with regularisation parameter 𝜆 &gt; 0 at each round 𝑡 ,:
<img src="https://velog.velcdn.com/images/stella_y/post/84007ac7-a02c-419a-9428-63bccc0500aa/image.png" alt=""></li>
</ul>
</li>
<li><p>Online gradient ascent</p>
<ul>
<li>아래를 최대화시킬 alpha를 찾는 방식으로 문제 해결
<img src="https://velog.velcdn.com/images/stella_y/post/9892de48-43e3-4475-8b03-bb7bda121b9b/image.png" alt=""></li>
<li>GGF의 concave 성질에 따라서 아래처럼 풀 수 있고,
<img src="https://velog.velcdn.com/images/stella_y/post/2a25d4bf-cfab-4342-b59e-9b2f9203a639/image.png" alt=""></li>
<li>이걸 optimize시켜도 되지만,
<img src="https://velog.velcdn.com/images/stella_y/post/0e36f45e-546b-4fa5-a711-e18ba2e679e2/image.png" alt=""></li>
<li>근데 위의 것을 linear programing으로 풀면 계산량이 많아서 아래처럼 gradient ascent로 풀 수 있음.
<img src="https://velog.velcdn.com/images/stella_y/post/7beaaf39-0d9e-4d92-9797-f3ed233d9a08/image.png" alt=""></li>
</ul>
</li>
</ul>
<h3 id="experimental-evaluation">Experimental evaluation</h3>
<p>(이 논문에서 실험 분석할때에 그래프 형태가 아주 신박하다. 실무에서 활용해볼 기회가 있길!)</p>
<h4 id="reward-base-evaluation">Reward base evaluation</h4>
<p><img src="https://velog.velcdn.com/images/stella_y/post/a2965bb2-9ca3-4ab2-bd28-62709ca9205e/image.png" alt=""></p>
<ul>
<li>이 실험에서는 다양한 bandit 알고리즘에 GGF 로 정의한 reward를 넣었을때에 어떤 알고리즘이 reward를 가장 잘 최적화 시키는지를 확인한다. 위의 그래프에서는 아래의 세가지를 확인할 수 있다.<ol>
<li>MO-OGDE(Non contextual bandit)와 random strategy 간 비교를 했을때엔 둘의 결과가 다르지 않았다는 걸로 봐서, context 가 중요한 역할을 한다는 걸 알 수 있다.</li>
<li>mixed strategy(아마도 thompson sampling 등 sampling 기반 선택을 하는 알고리즘?) 가 pure strategy(아마도 항상 max 값을 고르는 greedy 한 알고리즘?) 보다 항상 결과가 좋았던걸로 보아서, greedy 한 선택보다는 probability distribution을 바탕으로 선택하는게 더 좋다는 걸 알 수 있다.</li>
<li>여러 알고리즘 중 MO-LinCB에서 GGF가 가장 잘 최적화 된다.</li>
</ol>
</li>
</ul>
<h4 id="optimizing-for-multiple-user-metric">Optimizing for multiple user metric</h4>
<p><img src="https://velog.velcdn.com/images/stella_y/post/92f9d6a6-5b0e-4b46-b873-d200d529a3ea/image.png" alt=""></p>
<ul>
<li>유저 메트릭(clicks, stream, songs played)관점에서 봤을때에 각 알고리즘을 비교해보면 세가지를 알 수 있다.<ol>
<li>위 그래프에서 e-g(c), e-g(l), e-g(s)는 각각 click, length of stream, songs played의 한가지 메트릭만 최적화 시킨 single objective algorithm인데, 이 들 셋 중에서 비교를 해보면 click에 대해서 최적화시킨 알고리즘(e-g(c))이 세가지의 모든 메트릭에 대해서 다른 알고리즘에 비해 우위를 보인다는걸 알 수 있다. 이로써 click 이 feature 로서 강력하며, 다른 objective 들과의 상관성 또한 크게 있음을 알 수 있다.</li>
<li>모든 메트릭에서 single objective algorithm(e-g(c), e-g(l), e-g(s)) 보다 objective algorithm(e-g(MO), MO-LinCB)의 성능이 항상 더 좋았다.<ul>
<li>하나의 정보에만 집중해서 학습시키는 것 보다 여러가지의 정보를 혼합해서 좋았을때에 더 효과가 있음을 알 수 있었다!</li>
</ul>
</li>
<li>MO-LinCB 알고리즘의 성능이 가장 좋았다.</li>
</ol>
</li>
</ul>
<h4 id="impact-of-promotional-objective">Impact of Promotional Objective</h4>
<p><img src="https://velog.velcdn.com/images/stella_y/post/f696aec4-bbc8-4d6e-ba5c-98fe848f7553/image.png" alt=""></p>
<ul>
<li>promotional objective 는 다른 object 들과의 상관관계가 없음을 위의 히트맵으로 확인할 수 있었는데, 이건 objective 들간 competing이 생길 수 있다는 것을 의미하기도 한다.</li>
<li>그러나 promotional objective(여기서는 gender diversity) 를 포함시켰을때에, 다른 수치들이 떨어지지 않는다는게 보여서, 상반된 objective 간의 zerosum 게임이 아니라는 것을 확인할 수 있었다.</li>
</ul>
<h4 id="comparing-multi-optimization-methods">Comparing Multi-optimization Methods</h4>
<p><img src="https://velog.velcdn.com/images/stella_y/post/4df86b37-e56d-4e4d-9986-c09c5edd933b/image.png" alt=""></p>
<ul>
<li>아무 알고리즘에서나 MO 가 통하지 않음을 확인함</li>
<li>e-greedy 는 MO해도 성능이 나아지지 않음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Timeseries data anomaly detection] article 요약]]></title>
            <link>https://velog.io/@stella_y/Timeseries-data-anomaly-detection-article-%EC%9A%94%EC%95%BD</link>
            <guid>https://velog.io/@stella_y/Timeseries-data-anomaly-detection-article-%EC%9A%94%EC%95%BD</guid>
            <pubDate>Sun, 15 Jan 2023 12:58:41 GMT</pubDate>
            <description><![CDATA[<p><a href="https://towardsdatascience.com/effective-approaches-for-time-series-anomaly-detection-9485b40077f1">https://towardsdatascience.com/effective-approaches-for-time-series-anomaly-detection-9485b40077f1</a></p>
<h3 id="time-series-anomaly">Time series anomaly?</h3>
<ul>
<li>집단의 공통적인 trend, seasonality, cycle 형태를 따르지 않는 데이터</li>
<li>다른 데이터들과 ‘상당한 수준으로’ 다른 데이터
<img src="https://velog.velcdn.com/images/stella_y/post/e3a85372-0a17-49f0-b2e4-f54242db21cf/image.png" alt=""></li>
<li>위의 다섯개의 점이 전형적인 anomaly</li>
</ul>
<h3 id="왜-이게-중요한가">왜 이게 중요한가?</h3>
<ul>
<li>anomaly 의 발생은 “new normal”에 대한 새로운 정의, regroup, restructure business strategy, decision making process 가 필요한 시점임을 보여줄 수 있음</li>
<li>anomaly 를 항상 트래킹하고, 상세 특징에 대해서 연구해두는게 필요함.</li>
</ul>
<h3 id="어떻게-알아내지">어떻게 알아내지?</h3>
<ul>
<li>주로 아래 세가지 방법으로 알아낼 수 있음<ol>
<li>Predictive Confidence Level Approach</li>
<li>Statistical Profiling Approach</li>
<li>Clustering Based Unsupervised Approach</li>
</ol>
</li>
</ul>
<ol>
<li><p>Predictive Confidence Level Approach
<img src="https://velog.velcdn.com/images/stella_y/post/2438f988-fdc3-4794-8456-2f7ed88816cf/image.png" alt=""></p>
<ul>
<li>과거 데이터로부터 전체적인 트렌드, seasonality, cycle pattern 을 읽어와서 predictive model 을 만들어내는 것 부터 시작</li>
<li>이 predictive model 로부터 MAPE(Mean Absolute Percentage Error)를 찾아내는 것</li>
<li>신뢰 구간을 찾아내거나 predictive model 로부터의 신뢰 가능한 band 를 찾아내고, 이 band 밖으로 떨어지는 data point 들을 anomaly로 간주하는 것</li>
<li>Predictive model 만들어내는 유명한 방법들<ul>
<li>ARIMA, SARIMA, GARCH, VAR</li>
<li>이 외의 Regression, LSTM 등의 방법론 들</li>
</ul>
</li>
<li>장점<ul>
<li>local outlier 를 찾아내기 편하다</li>
</ul>
</li>
<li>단점<ul>
<li>predictive model 의 효과성에 지나치게 의존하는 경향이 생길 수 있음<ul>
<li>predictive model 의 어떤 loop hole 이 있어도, 잘못된 결과(false positive, false negative)를 낼 수 있음</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>Statistical Profiling Approach
 <img src="https://velog.velcdn.com/images/stella_y/post/6f0d93de-11cc-496f-9d23-8a1584ecef61/image.png" alt=""></p>
<ul>
<li>통계학자나 수학자가 가장 좋아하는 방법</li>
<li>경제학, 금융 섹터에서 효과가 좋다고 알려짐</li>
<li>통계적 모델이나 profile을 만들ㅇ어 내는게 가장 빠르고 효율적인 방법 → 이방법을 쓰면 통제되고, 설명 가능한 결과를 만들어낼 수 있다.</li>
<li>과거 데이터의 mean, median moving average 와 standard deviation을 이용해서 upper bound, 혹은 lower bound 를 만들어 주는 방식(즉, 통계적 값에 band 를 생성), 이 band 밖을 벗어나는 data point 를 anomaly 로 상정</li>
<li>장점<ul>
<li>편해서 복잡한 방법론 적용해보기 전에, baseline approach로 유용함</li>
<li>변덕이 심한 데이터에 효과적임(predictive model 알고리즘은, 이런 데이터에서는 실패하는 경향이 크다)</li>
</ul>
</li>
<li>단점<ul>
<li>local outlier 를 잘 못잡아낸다.(위의 그림상에 못잡아낸 세개의 포인트들)</li>
</ul>
</li>
</ul>
</li>
<li><p>Clustering Based Unsupervised Approach</p>
<ul>
<li>labeled data 가 필요하지 않아서 유용하다.</li>
<li>근데 위험성 혹은 bottleneck으로는 clustering 알고리즘을 적용할때에 몇개의 cluster를 만들어낼지를 직접 손으로 넣어야한다는 단점<ul>
<li>cluster 수를 추정하는 여러 테크닉들이 있지만, time series data 에서는 dynamic 하게 적용하기가 어렵다!</li>
</ul>
</li>
<li>→ DBSCAN<ul>
<li>cluster 수를 안넣어줘도 된다는 점에서 자주 쓰이는 알고리즘</li>
<li>(cluster 당 최소 data 수, cluster 간 distance만 넣어주면 됨)</li>
</ul>
</li>
<li>local anomaly 잡아내려면 rolling window based DBSCAN을 적용해줘야할 것.</li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spark executor 에 메모리가 부족해지는 경우]]></title>
            <link>https://velog.io/@stella_y/Spark-executor-%EC%97%90-%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B0%80-%EB%B6%80%EC%A1%B1%ED%95%B4%EC%A7%80%EB%8A%94-%EA%B2%BD%EC%9A%B0</link>
            <guid>https://velog.io/@stella_y/Spark-executor-%EC%97%90-%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B0%80-%EB%B6%80%EC%A1%B1%ED%95%B4%EC%A7%80%EB%8A%94-%EA%B2%BD%EC%9A%B0</guid>
            <pubDate>Tue, 20 Sep 2022 15:22:31 GMT</pubDate>
            <description><![CDATA[<h3 id="spark-executor-에-메모리가-부족해지는-경우-spark-executor-runs-out-of-memory">Spark executor 에 메모리가 부족해지는 경우 (Spark executor runs out of memory)</h3>
<p>Spark executor 에서 메모리가 부족할 경우 yarn 은 자동적으로 이 잡을 죽여버린다.
이때에 worker 의 log 를 보면 &quot;Container killed on request. Exit code is 137&quot; 이라는 메시지가 남게 되고, executor 의 stdout까지 잘 살펴보면 &quot;java.lang.OutOfMemoryError: Java heap space&quot; 이런 메시지가 있단걸 확인할 수 있다.</p>
<h3 id="해결방법">해결방법</h3>
<ol>
<li><p>driver 나 executor 의 메모리를 늘린다.</p>
<ul>
<li>어떤 container 가 이 에러를 발생시켰는지를 확인해서 <code>spark.executor.memory</code> 혹은 <code>spark.driver.memory</code>의 parameter 값을 튜닝한다.</li>
<li>emr 이라면 master node 에 접속해서, /etc/spark/conf/spark-defaults.conf 에서 해당 값들을 수정한다.</li>
<li>하나의 잡에 대해서만 늘리고 싶다면, 해당 잡을 spark submit 할때에 <code>spark.executor.memory</code> 혹은 <code>spark.driver.memory</code>의 값들을 수정한다.</li>
<li>근데 만약 node 에서 이미 maximizeResourceAllocation 등의 옵션을 쓰고 있다면 이런 조치를 취할 수 없다.</li>
</ul>
</li>
<li><p>Spark partition 을 늘린다.</p>
<ul>
<li>partition 의 수를 늘리면 하나의 spark task 에서 처리하는 데이터의 양이 줄어들게 되므로, 하나의 executor 가 소모하는 메모리의 양이 줄어들게 된다.</li>
<li>partition 의 수를 늘리고 그 수에 의해 repartition 하게 하면 된다.<pre><code>val numPartitions= 500
val newDF=df.repartition(numPartitions)</code></pre></li>
<li>만약 이 에러가 join, groupby 등의 wide transformation 과정에서 발생하는 것 이라면 shuffle partition 의 수를 늘린다. (default 값은 200이다)<ul>
<li>emr 이라면 master node 에 접속해서, /etc/spark/conf/spark-defaults.conf 에서 <code>spark.sql.shuffle.partitions</code>의 값을 200이상으로 바꿔주거나</li>
<li>spark submit 할때에 해당 parameter 를 바꿔주면 된다.</li>
</ul>
</li>
</ul>
</li>
<li><p>executor 의 core 수를 줄인다.</p>
<ul>
<li>executor 의 core 수를 줄이면 하나의 executor 에서 동시에 돌아가는 task 의 수가 줄어들기때문에 사용되는 메모리가 줄어들게 된다.<ul>
<li>emr 이라면 master node 에 접속해서, /etc/spark/conf/spark-defaults.conf 에서 <code>spark.executor.cores</code>의 값을 줄여주거나,</li>
<li>spark submit 할때에 해당 parameter 를 바꿔주면 된다.</li>
</ul>
</li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[ML system design 때의 유의할 점]]></title>
            <link>https://velog.io/@stella_y/ML-system-design-%EB%95%8C%EC%9D%98-%EC%9C%A0%EC%9D%98%ED%95%A0-%EC%A0%90</link>
            <guid>https://velog.io/@stella_y/ML-system-design-%EB%95%8C%EC%9D%98-%EC%9C%A0%EC%9D%98%ED%95%A0-%EC%A0%90</guid>
            <pubDate>Tue, 23 Aug 2022 18:26:11 GMT</pubDate>
            <description><![CDATA[<h2 id="data">[data]</h2>
<ul>
<li><p>time dependent 한 feature 라면 -&gt; 지금까지 user 가 click 을 몇번 했는가 등 -&gt; training time 동안 계산해서 넣는건 쉽지 않다(그 이전까지만의 값으로 잘 넣아야한다.)</p>
</li>
<li><p>데이터 수집 자체에 문제가 있을 수 있음 -&gt; 이들에 있어서 큰 변화가 없는지 모니터링하는 시스템이 있어야한다.</p>
</li>
</ul>
<h2 id="offline-evaluation">[offline evaluation]</h2>
<ul>
<li>baseline model(simplest possible model) - 과의 비교 필요<h3 id="데이터의-분리">데이터의 분리</h3>
</li>
<li>gold standard 는 데이터를 세개로 나누는 것<ul>
<li>training, evaluation, test</li>
</ul>
</li>
<li>교과서에서는 세개로 random하게 나눈 후 k-fold cross validation 하라고 나옴.</li>
<li>현실에서는 progressive evaluation을 많이 사용한다<ul>
<li>older data로 학습, newer data로 evauation, test</li>
</ul>
</li>
</ul>
<h3 id="evaluation">Evaluation</h3>
<p>뭘 위해 모델을 만드느냐에 따라서 evaluation 방법이 달라져야한다.</p>
<ul>
<li>first clicker를 위한 모델이라면<ul>
<li>training할때에 first clicker가 아닌사람들을 다 빼버리는거는 데이터 손실이 클 것</li>
<li>(small amount of specific data) vs (lots of non-specific data)</li>
<li><blockquote>
<p>이럴때는 실험을 통해 결정하자
e.g. training 에서는 다 쓰고, validation, test 할때에 first clicker에 대한 정보만 쓰기 와 training 부터 first clicker만 쓴 것을 비교해서 효과가 나은걸 쓴다!</p>
</blockquote>
</li>
</ul>
</li>
<li>만약 evaluation 결과가 통계적으로 유의하지 않다면 데이터의 양을 늘려야할텐데, 이때에 recent data를 쓰는건 여전해야함을 잊지 말것(online 에서도 유효하게 만들어야함)</li>
</ul>
<h4 id="calibration">calibration</h4>
<ul>
<li>calibration<ul>
<li>(sum of predictions/sum of labels)의 값이 training 결과, validation 결과, test 결과에서 계속 유지되는지 확인해야한다.</li>
<li>더 정확하게는 데이터를 특정 기준으로 나눈 후에도 계속 유지되는지까지 꼼꼼하게 확인하는게 좋다</li>
</ul>
</li>
<li>evaluation 자체를 (first clicker로 나눴던 것 처럼) 작은 그룹들로 나눠보는게 의미가 있을 수 있다! -&gt; 어디서 성과가 나오는지를 알아볼 수 있게될 것</li>
</ul>
<h2 id="feature">[feature]</h2>
<ul>
<li>output 에 대한 정보를 갖고있어서는 안된다 -&gt; feedback loop 에 빠질 수 있음(model 에 의해 영향받는 feature 가 될 수 있는 것), 다른 feature 들의 정확한 영향력을 계산할 수 없음</li>
<li>outlier 나 dramatic change 가 있는지에 대한 monitoring 이 있어야함</li>
<li>training때에 feature 마는 코드와 online testing 할때에 feature 마는 코드는 동일해야한다.</li>
<li>feature 의 semantic 은 어떻게 해도 변하지 않음.(ranking team 이 front team과 함께 일하는 그림이 좋은 그림)</li>
<li>뭔가 semantic 을 변화시키고 싶다면, 기존 feature 를 삭제하지 말고, 변화시킨 후 대신 적용해보고, 성능이 기존보다 좋을때 그때 deprecate한다.</li>
</ul>
<h3 id="feature-leakage">feature leakage</h3>
<p>training time 에는 사용한 feature 를 prediction time 에 사용할 수 없는 경우.</p>
<ul>
<li>prediction 할 당시에 모를만한 데이터는 제거한다</li>
<li>data cross validation을 할 것</li>
<li>leaky 하다고 여겨지는 변수가 있다면 빼고 다시 돌려봐라</li>
<li>near-perfect model accuracy 는 경고신호</li>
<li>과하게 feature importance가 높은 feature 가 있는지 확인하라</li>
</ul>
<h3 id="feature-coverage">feature coverage</h3>
<ul>
<li>특정 feature 가 corruption, noise가 있을 수 있을 것</li>
<li>이때 해당 feature 의 믿을 만한 정도를 feature coverage라고 함.</li>
<li>e.g. birth day 같은 feature 들</li>
</ul>
<h2 id="model">[model]</h2>
<h3 id="linear-model-에-대한-고려">linear model 에 대한 고려</h3>
<ul>
<li>linear 하지 않은 상황들이 막 생길 수 있지만 특정 조건을 미리 줘서 각 조건에 대한 linear model 들을 따로 만들수도 있다.</li>
<li>density feature 들을 decision tree로 만들고 나서 이걸 linear model 의 feature로 만들수도 있다.</li>
<li>object detection deep learning model 을 만든다음 마지막 layer 를 more specialized 된 형태로 만들수도 있음<h3 id="bias-variance-model">bias variance model</h3>
<ul>
<li>calibration 이 잘 된 것 같아도 데이터를 쪼개가면서 보다보면 특정 그룹에서는 calibration 이 잘 안맞게 마련. 여기서 뭐가 잘못됐는지를 확인해봐야한다.</li>
</ul>
</li>
</ul>
<h2 id="experiment">[Experiment]</h2>
<h3 id="1-minimize-the-time-to-first-online-experiment">1. Minimize the time to first online experiment</h3>
<ul>
<li>negative feedback 을 잘 예측하는 모델을 만들었어도 전체의 sentiment 가 어떻게 변했는지는 여기서 확인해야함</li>
</ul>
<h3 id="2-isolate-engineering-bugs-from-ml-performance-issues">2. Isolate engineering bugs from ml performance issues</h3>
<ul>
<li>코드를 바꿔서 생긴문제인가, 모델을 바꿔서 생긴 문제인가를 고려해봐야함.</li>
<li>identity transform 으로 비교해봐야한다.</li>
</ul>
<h3 id="3-test-model-in-the-presence-of-real-worldfeedback-loops">3. test model in the presence of real world(feedback loops)</h3>
<ul>
<li>어제는 이걸로 서빙하고, 오늘은 이걸로 서빙해서 발생하는 문제라면 backtest 를 해본다 (old test model 99%, new candidate 1%로 테스트(front test) 했다면 갈아치운 후에는 1% old model, 99% new model 로 테스트(back test)해볼것)</li>
</ul>
<h3 id="4-tips">4. Tips</h3>
<ul>
<li>be able to triangulate the cause of any changes<ul>
<li>한번에 하나만 테스트해서 뭐때문인지를 분명히 알 수 있게 해야한다.</li>
</ul>
</li>
<li>measure the right thing<ul>
<li>metric 이 제대로 작동하는지 확인해보자 (값에 무조건 1을 더했을때에 어떻게 변하는지 확인해보는 등)</li>
</ul>
</li>
<li>have a backup plan</li>
<li>calibrate<ul>
<li>average prediction 가 average response rate와 일치하는지 확인할 것</li>
<li>sanity checking performance</li>
<li>miscalibration means<ul>
<li>training time : hasn&#39;t learned properly</li>
<li>testing time : doesn&#39;t generalize well</li>
<li>online testing time: online/offline gap</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[파이썬클린코드]3장. 좋은코드의 일반적인 특징]]></title>
            <link>https://velog.io/@stella_y/%ED%8C%8C%EC%9D%B4%EC%8D%AC%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C3%EC%9E%A5.-%EC%A2%8B%EC%9D%80%EC%BD%94%EB%93%9C%EC%9D%98-%EC%9D%BC%EB%B0%98%EC%A0%81%EC%9D%B8-%ED%8A%B9%EC%A7%95</link>
            <guid>https://velog.io/@stella_y/%ED%8C%8C%EC%9D%B4%EC%8D%AC%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C3%EC%9E%A5.-%EC%A2%8B%EC%9D%80%EC%BD%94%EB%93%9C%EC%9D%98-%EC%9D%BC%EB%B0%98%EC%A0%81%EC%9D%B8-%ED%8A%B9%EC%A7%95</guid>
            <pubDate>Tue, 09 Aug 2022 17:57:06 GMT</pubDate>
            <description><![CDATA[<h3 id="파이썬-개발지침-약어">파이썬 개발지침 약어</h3>
<h4 id="중복금지-dry-oaoo">중복금지 (DRY, OAOO)</h4>
<ul>
<li><strong>Do not Repeat Yourself, Once only once</strong></li>
<li><strong>코드에 있는 지식은 단 한번, 단 한곳에 정의되어야한다.</strong></li>
<li>그렇지 않을경우<ul>
<li>오류 발생이 쉬워진다 (여러 반복중에 하나라도 빠트리면 버그발생)</li>
<li>비용이 비싸다 (변경에 더 많은 시간이 쓰이게 될 것)</li>
<li>신뢰성이 떨어진다 (여러 코드를 변경해야하는 경우 사람이 모든 인스턴스의 위치를 기억해야하게 됨)<h4 id="과잉-엔지니어링-금지-yagni-you-aint-gonna-need-it">과잉 엔지니어링 금지 (YAGNI: You ain’t gonna need it)</h4>
</li>
</ul>
</li>
<li>유지보수가 가능한 소프트웨어를 만드는 것은 미래의 요구사항을 예측하는 것이 아니다</li>
<li>오직 현재의 요구사항을 잘 해결하기 위한 소프트웨어를 작성하고 가능한 나중에 수정하기 쉽도록 작성하는 것이다.</li>
</ul>
<h4 id="kiskeep-it-simple">KIS(keep it simple)</h4>
<ul>
<li>디자인이 단순할수록 유지 관리가 쉽다.<h4 id="eafpeasier-to-ask-forgiveness-than-permession-vs-lbyllook-before-you-leap">EAFP(Easier to ask forgiveness than permession) vs LBYL(Look before you leap)</h4>
</li>
<li>실제로 동작하지 않을때 대응한다 vs 도약하기 전에 무엇을 사용하려고 하는지 확인한다.</li>
<li>파이썬은 EAFP 방식으로 만들어졌고, 그렇게 사용할 것을 권한다<pre><code class="language-python">#이것보단
if os.path.exists(filename):
with open(filename) as f:
  ...</code></pre>
<pre><code class="language-python">#이렇게 쓸 것.
try:
with open(filename) as f:
  ...
except FileNotFoundError as e:
logger.error(e)</code></pre>
</li>
</ul>
<h3 id="계약에-의한-디자인">계약에 의한 디자인</h3>
<ul>
<li>관계자가 기대하는 바를 암묵적으로 코드에 삽입하는 대신 양측이 동의하는 계약을 먼저 한 다음 계약을 어겼을 경우는 명시적으로 왜 계속할 수 없는지 예외를 발생시키라는 것.</li>
<li>계약 작성이 필요하고 단위테스트 추가해야할 수도 있으나 품질은 장기적으로 보장된다.</li>
</ul>
<h3 id="방어적-프로그래밍">방어적 프로그래밍</h3>
<ul>
<li>에러핸들링<ul>
<li>값대체</li>
<li>예외처리<ul>
<li>함수에 예외가 많을수록 호출자가 호출하는 함수에 대해 더 많은 것을 알아야만한다(호출할때마다 발생가능한 부작용을 염두에 두고 문맥을 유지해야하기 때문)</li>
<li>처리할 예외가 많다는건 응집력이 약하고 너무 많은 책임을 가지고 있다는 의미인 것. → 함수를 분리한다 (event connection 맺는 일과 send를 하면서 event parameter value 를 확인하는 함수)</li>
<li>The zen of python<ul>
<li>예외는 조용히 처리되어선 안된다, 보다 구체적 예외를 사용해야한다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="관심사의-분리">관심사의 분리</h3>
<ul>
<li>책임이 다르면 컴포넌트, 계층 또는 모듈로 분리되어야한다.</li>
<li>파급효과를 최소화하여 유지보수성을 향상시키기 위한 것.<ul>
<li>파급효과 : 어느 지점에서의 변화가 전체로 전파되는 것.</li>
</ul>
</li>
<li><strong>나머지 부분에 대한 영향성을 최소화하면서 코드를 수정하거나 리팩토링 하고싶다면 적절한 캡슐화가 필요하다</strong></li>
<li><strong>응집성과 결합성</strong><ul>
<li>응집성 : 객체가 작고 잘 정의된 목적을 가져야하며 가능하면 작아야한다.</li>
<li>결합성 : 두 개 이상의 객체가 어떻게 의존하는지를 나타냄. (객체 또는 메서드의 두 부분이 서로 너무 의존적이라면 바람직하지 않다)<ul>
<li>너무 의존적일경우의 부작용<ul>
<li>낮은 재사용성 : 만약 어떤 함수가 특정 객체에 지나치게 의존하는 경우 또는 너무 많은 파라미터를 가진 경우 이 함수는 해당 객체에 결합되게 된다. 즉 다른 상황에서는 이 함수를 사용하기가 매우 어렵다.</li>
<li>파급효과 : 너무 가깝게 붙어 있게 되면 두 부분 중 하나를 변경하면 다른 부분에도 영향을 미친다.</li>
<li>낮은 수준의 추상화 : 두 함수가 너무 가깝게 관련되어 있으면 서로 다른 추상화 레벨에서 문제를 해결하기 어렵기때문에 관심사가 분리되어있다고 보기 어렵다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MATOMO] javascript tracker 방식 vs image beacon 방식]]></title>
            <link>https://velog.io/@stella_y/MATOMO-javascript-tracker-%EB%B0%A9%EC%8B%9D-vs-image-beacon-%EB%B0%A9%EC%8B%9D</link>
            <guid>https://velog.io/@stella_y/MATOMO-javascript-tracker-%EB%B0%A9%EC%8B%9D-vs-image-beacon-%EB%B0%A9%EC%8B%9D</guid>
            <pubDate>Sat, 26 Mar 2022 09:25:43 GMT</pubDate>
            <description><![CDATA[<h2 id="javascript-tracker-방식에서의-한계">Javascript tracker 방식에서의 한계</h2>
<ul>
<li>MATOMO를 이용하여 Java script tracker 방식으로 로그를 수집하면 아래와 같은 경우에 대해서 로그 수집이 불가능해진다.<ul>
<li>JavaScript를 disable 해둔 사용자 로그</li>
<li>내가 제어하지 않는 웹사이트에서 페이지가 조회된 경우(타사 마켓 플레이스 등)</li>
<li>뉴스레터 이메일에 대한 접근 로그</li>
</ul>
</li>
</ul>
<p>이런 때에는 matomo image beacon 방식으로 방문자를 추적할 수 있다.
<img src="https://images.velog.io/images/stella_y/post/1f5bb284-2889-4c49-ad11-13e9d211040e/image.png" alt=""></p>
<h2 id="image-beacon-방식의-한계">image beacon 방식의 한계</h2>
<ul>
<li>단, 이방식을 활용하게 되면 java script를 사용하지 않으며 자사 쿠키를 생성할 수 가 없게 되어서, 방문자 로그 생성이 어려워질 수 있다.</li>
<li>아래와 같은 것들에 대해 tracking이 불가능해진다.<blockquote>
<ul>
<li>Referrers, including Search Engine Keyword, Referrer Website URL and Social network URL</li>
<li>Screen resolutions</li>
<li>Browser plugins</li>
<li>Page titles</li>
<li>Time in local user’s timezone</li>
<li>The image tracker code also does not create first party tracking cookies which results in some information being lost.</li>
<li>Files that were clicked and downloaded (Download)</li>
<li>Links to an outside domain that were clicked (Outlink)</li>
<li>Pages generation time (the time it takes for webpages to be generated by the webserver and then downloaded by the user)</li>
</ul>
</blockquote>
</li>
<li>그래도 아래와 같은 것들은 잘 트래킹 된다.<blockquote>
<ul>
<li>User IP address</li>
<li>Date and time of the request</li>
<li>URL of the page being viewed (Page URL)</li>
<li>Location of the user: country, region, city, approximate latitude and longitude (Geolocation)</li>
<li>Main Language of the browser being used (Accept-Language header)</li>
<li>Browser, operating system, device used (desktop, tablet, mobile, tv, cars, console, etc.), brand and model</li>
</ul>
</blockquote>
</li>
</ul>
<h2 id="참조">참조</h2>
<ol>
<li><a href="https://matomo.org/faq/how-to/faq_176/">https://matomo.org/faq/how-to/faq_176/</a></li>
<li><a href="https://matomo.org/faq/general/when-tracking-visitors-using-an-image-beacon-instead-of-the-javascript-tracker-what-are-the-differences/">https://matomo.org/faq/general/when-tracking-visitors-using-an-image-beacon-instead-of-the-javascript-tracker-what-are-the-differences/</a></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[MATOMO 기본 작동원리]]></title>
            <link>https://velog.io/@stella_y/MATOMO</link>
            <guid>https://velog.io/@stella_y/MATOMO</guid>
            <pubDate>Sat, 26 Mar 2022 04:57:58 GMT</pubDate>
            <description><![CDATA[<h2 id="matomo">MATOMO?</h2>
<ul>
<li>오픈 소스 웹 분석 플랫폼(유료 cloud버전도 있기는 함)</li>
<li>웹 사이트를 방문하는 모든 사용자의 행위를 평가 및 분석
(로그 데이터를 저장하고, 이에대한 보고서 제공)</li>
<li>즉 원하는 웹사이트에 matomo tracker script를 심어놓으면 그와 관련된 분석데이터(클릭 로그, 유저 행동데이터) 등에 대한 데이터를 수집, 저장하고, 이에 대한 보고서 또한 제공해준다.<blockquote>
<p>Visitant - 웹 사이트 방문자 수, 페이지 뷰, 방문기간 등의 정보 기록 및 분석
Behavior - 웹 사이트 방문자의 행위 기록 및 분석
Acquisition - 웹 사이트 유입 경로 기록 및 분석</p>
</blockquote>
</li>
<li>Apache 웹 서버에서 구동되며 2018년 6월 기준 약 1,455,000개 이상의 Web Site에서 사용되고 있음</li>
</ul>
<h3 id="matomo-작동-원리">MATOMO 작동 원리</h3>
<ul>
<li>website page에 javascript tracker를 포함시켜서 배포한다.</li>
<li>tracker 는 tracker가 포함돼있는 페이지에서 데이터를 모아다가 http 추적 api를 호출해서 matomo에 보낸다.</li>
<li>데이터 archiving task가 돌아가고, preprocessing이 on the flow 로 혹은 cron task로 실행된다.</li>
</ul>
<h3 id="plug-in-architecture">plug in architecture</h3>
<ul>
<li>matomo codebase<ul>
<li>Matomo core - extention point통해서 application base제공</li>
<li>Plugins - extention point를 사용자 행동이나 content를 application에 더하는데 사용<ul>
<li>두 가지 종류의 plugin 존재<ul>
<li>기본형 플러그인 : matomo 기본기능 (배포판에 있는 기능들</li>
<li>선택형 플러그인 : 사다 쓰는 것...(plugins 폴더에 복사해서 쓰거나, <a href="https://plugins.matomo.org/%EC%9D%B4%EB%9F%B0%EB%8D%B0%EC%84%9C">https://plugins.matomo.org/이런데서</a> 받을 수 있음)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="interface">Interface</h3>
<h4 id="user-interface">user interface</h4>
<ul>
<li>진입점은 index.php 이 파일이 모든걸 initialize 하고, FrontController class를 호출한다.</li>
<li>matomo의 user interface는 html, javascript로 돼있음</li>
<li>몇몇 파트는 php controller에 의해 돌아가는 html document지만, 몇몇 파트는 anguler js로 짜여짐(vue js로 바꾸는 중)<h4 id="controller">controller</h4>
</li>
<li>front controller 는 들어오는 http request를 url parameter를 바탕으로 plugin controller로 rounting 한다.</li>
<li><img src="https://images.velog.io/images/stella_y/post/c79d6d2c-e2a9-4e95-8e2e-f9b81dd9d442/image.png" alt=""></li>
<li>만약 위와같은 http request 가 오면 front controller는 CoreHome plugin의 action index를 호출한다. plugins/CoreHome/Controller.php의 index() method 가 호출됨</li>
<li>plugin controller는 http response에 보내질 string(보통은 html content)를 return 한다.</li>
</ul>
<h4 id="widgets-and-reports">Widgets and reports</h4>
<ul>
<li>request에 해당되는 controller action이 없으면, matomo는 매칭되는 widget 이나 report가 있는지 본다.</li>
<li>만약 있다면 widget이나 대체 report의 render method를 호출한다.(CoreHome.renderWidget, CoreHome.renderReportWidget)</li>
</ul>
<h3 id="http-reporting-api">Http Reporting API</h3>
<ul>
<li>reporting 역할하는 api</li>
<li>report 를 xml이나 json형식으로 serving 하는 역할(sites, user, goals,.. 같은 다양한 entity에 대한 정보를 제공함</li>
<li><img src="https://images.velog.io/images/stella_y/post/b9428fe4-088f-4be2-af55-e138e87e7ba7/image.png" alt=""></li>
<li>이런게 오면 plugin 이름은 api, action name 은 주어지지 않았으니 index로 돌아가게 될 것.<ul>
<li>Piwik\Plugin\APi\Controller class 가 호출되고, target api 에게 전달 할 것</li>
<li>즉, 여기서는 Piwik\Plugin\SEO\API::getRank()가 호출될 것.</li>
<li>api 는 token_auth url parameter를 통해서 인증될거고, force_api_session=1 parameter가 존재하지 않는 한 session 이 load 되지는 않을 것.</li>
</ul>
</li>
</ul>
<h3 id="http-tracking-api">HTTP Tracking API</h3>
<ul>
<li>JavaScript tracker가 Matomo(이전 Piwik)에 저장할 분석 데이터를 제출하게 해줌</li>
<li>Matomo&#39;s web application 이나 HTTP reporting API 는 달리, entry point가 matomo.php파일이다.(오래된 버전은 piwik.php)</li>
<li>tracking 되는 동안 모든 플러그인들이 load되지는 않고, 필요한것들만 loading된채로 진행된다.(속도 이슈)</li>
<li>tracking된 데이터들은 log_* table에 저장된다. 모든 raw데이터를 저장하고나서, 나중에 report archive로 집계되는 형식이다.(log_visit도 tracking 요청중에 업데이트 된다.)</li>
</ul>
<h2 id="데이터-모델-처리-저장">데이터 모델, 처리, 저장</h2>
<h3 id="log---raw-data">log - raw data</h3>
<ul>
<li>HTTP tracking API(Piwik\Tracker component)는 log data(raw data)를 수신함</li>
<li>로그 데이터는 PHP에서 Piwik\Tracker\Visit객체로 표시되며 아래 테이블에 저장된다.<blockquote>
<ul>
<li>log_visit : 방문당 하나씩 찍힘(재방문자)</li>
<li>log_action : 웹사이트에서 가능한 모든 유형의 action당 찍힘(예: 고유한 URL, 페이지 제목, 다운로드 URL 등).</li>
<li>log_link_visit_action : 방문자의 하나의 액션당 하나씩 찍힘(페이지 보기, …)</li>
<li>log_conversion : 방문 중에 발생한 전환당 찍힘(목표와 일치하는 액션)</li>
<li>log_conversion_item : 전자상거래 전환당 찍힘</li>
</ul>
</blockquote>
</li>
<li>자세한 matomo schema 는 <a href="https://developer.matomo.org/guides/database-schema#log-data-persistence">https://developer.matomo.org/guides/database-schema#log-data-persistence</a> 여기서 확인 가능함</li>
</ul>
<h3 id="archiving-process">Archiving process</h3>
<ul>
<li>log table 은 말 그대로 log table이기때문에 raw한 상태라 report를 위해서는 별도의 aggregation이 필요하다.</li>
<li>Aggregation process는 날것의 log data를 읽어서 archived data(report 가능한 상태)로 바꿔준다.</li>
<li>이 과정은 특정한 날에 report를 위해서 돌아가게 된다(리포트 직전에만 돌아가는 배치잡형태)<ul>
<li>기간을 너무 길게 설정하면 돌아갈때 시간이 너무 오래걸려서 모든 기간에 대해서 지원하지는 않음(unique visit, unique user등 몇가지 항목에 대해서만 제공)</li>
<li>e.g. 아래 쿼리 같은게 돌아가는 것<blockquote>
<p>select count(*) as nb_visits from log_visit where idsite = 1 and visit_last_action_time &gt;= &#39;2021-08-04 00:00:00&#39; and visit_last_action_time &lt; &#39;2021-08-05 00:00:00&#39;</p>
</blockquote>
</li>
<li>e.g. 아래같은 테이블이 생길 것<blockquote>
<p>archive_numeric_2021_10: 2021년 10월 측정항목
archive_blob_2021_10: 2021년 10월 보고서
archive_numeric_2021_11: 2021년 11월 측정항목
archive_blob_2021_11: 2021년 11월 보고서</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<h3 id="auto-archiving-vs-browser-archiving">Auto archiving VS. browser archiving</h3>
<ul>
<li>기본적으로 Matomo는 브라우저 또는 API를 통해 요청될 때마다 이러한 보고서를 &quot;요청 시&quot; 생성한다.(browser archiving)</li>
<li>이렇게 요청시마다 하는건, Matomo의 속도를 늦출 수 있으므로 cron을 통해 백그라운드에서 주기적으로 이러한 보고서를 생성하도록 구성할 수 있다.(auto archiving)<ul>
<li>archiving process참고 : <a href="https://developer.matomo.org/guides/archiving">https://developer.matomo.org/guides/archiving</a></li>
<li>archiving behavior 참고 : <a href="https://developer.matomo.org/guides/archiving-behavior-specification">https://developer.matomo.org/guides/archiving-behavior-specification</a></li>
</ul>
</li>
</ul>
<h3 id="from-archive-data-to-reports">From Archive data to reports</h3>
<ul>
<li>위와같이 테이블 형태로 데이터가 저장되고 나면, plugin 에서 정의된 api 클래스에 의해 제공된다. api 는 metric 혹은 record에 access하고 이걸 표시 가능한 report로 변환한다.</li>
<li>report 작성 방법: <a href="https://developer.matomo.org/guides/reports">https://developer.matomo.org/guides/reports</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Evaluation metric survey]]></title>
            <link>https://velog.io/@stella_y/Evaluation-metric-survey</link>
            <guid>https://velog.io/@stella_y/Evaluation-metric-survey</guid>
            <pubDate>Fri, 18 Mar 2022 15:40:48 GMT</pubDate>
            <description><![CDATA[<h2 id="요약">요약</h2>
<ul>
<li>imbalanced되어있으면서도, ranking이 중요한 데이터에 대해서(e.g. click이 잘 일어나지 않지만, ctr의 순위를 잘 결정하는것이 중요한 데이터에 대해서) 평가 지표를 찾는다.</li>
<li>accuracy, f1score, ROC AUC, PR AUC 등의 여러 지표를 탐구함.</li>
<li>결론<ul>
<li>일반적으로 imbalanced data 는 f1-score, pr auc 등의 지표를 쓰는게 좋다고 하지만, 지속적 모니터링을 위해서는 기준점이 명확한 것이 좋다는 점이 있었음(아래 상세 기술) 이런 이유로 이 지표들보다는 데이터의 balance를 맞춰준 후, roc auc 를 적용하는게 더 옳다고 판단함.</li>
</ul>
</li>
<li>pr auc vs roc auc<ul>
<li>pr auc<ul>
<li>imbalanced data 에서 성능평가를 할때에 유용함</li>
<li>recall 의 어느 시점에 precision 이 빠르게 떨어지기 시작하는지를 파악해서 threshold 지정</li>
<li>단, 데이터에 따라서 기준 score 가 변화함(random 분류의 경우 기댓값은 positive:negative=1:k 일때 1/(1+k)가 됨)</li>
</ul>
</li>
<li>roc auc<ul>
<li>imbalanced data 에 취약함</li>
<li>기준 score 변화가 전혀 없음(random 분류의 경우 데이터에 상관없이 score 값은 0.5)</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="evaluation-metric-recap">Evaluation metric recap</h2>
<h3 id="1-accuracy">1. Accuracy</h3>
<ul>
<li><p>imbalanced 된 상태에서는 절대 써선 안된다</p>
</li>
<li><p>대부분을 majority class로 분류해버리는 경우 accuracy 가 높게 측정될 수 있음</p>
</li>
<li><p>beta &gt;1 이면 커질수록 optimal threshold는 점점 낮아진다.
<img src="https://images.velog.io/images/stella_y/post/f1416596-2f74-48e2-a8bc-e66df6ecda82/image.png" alt=""></p>
</li>
<li><p>class 단위로 구분돼있을때 사용할 수 있는 지표라서, softlabel로 존재하는 경우 threshold 를 정하기 위해 위에서와 같은 차트를 그려볼 수도 있다.</p>
</li>
<li><p>언제 사용?</p>
<ul>
<li>balanced 돼 있을때</li>
<li>non-technical stakeholder 에게 설명할때</li>
<li>모든 class 가 중요할때</li>
</ul>
</li>
</ul>
<h3 id="2-f1-score">2. F1 score</h3>
<ul>
<li><p>precision, recall 을 조화평균한 것</p>
</li>
<li><p>recall 이 더 중요할 수록 beta 값을 올려야
<img src="https://images.velog.io/images/stella_y/post/a0086342-b665-4558-a809-b126c257dad8/image.png" alt=""></p>
</li>
<li><p>0&lt;beta&lt;1이면 precision 을 더 중시하는 것 → threshold 가 높을수록 f-beta score 도 올라감</p>
</li>
<li><p>beta &gt;1 이면 커질수록 optimal threshold는 점점 낮아진다.</p>
</li>
<li><p>class 단위로 구분돼있을때 사용할 수 있는 지표라서, softlabel로 존재하는 경우 threshold 를 정하기 위해 위에서와 같은 차트를 그려볼 수도 있다.</p>
</li>
<li><p>언제쓰나</p>
<ul>
<li>positive class 에 대해서 더 신경쓸때 많이 씀</li>
<li>easily explained to business stakeholders</li>
</ul>
</li>
</ul>
<h3 id="3-roc-auc">3. ROC AUC</h3>
<ul>
<li>(Receiver Operating Characteristics)</li>
<li>True positive rate(x축) 와 false positive rate(y축) 사이의 tradeoff 를 visualize 함</li>
<li>ranking 에 대해 focus<ul>
<li>prediction 과 target 의 rank 사이의 상관관계와 동치 → 해당 모델의 ranking prediction 이 얼마나 좋은지를 측정</li>
<li>임의로 고른 positive instance 가 임의로 고른 negative instance 보다 score 가 낮은지를 확인</li>
</ul>
</li>
<li>기준값이 명확<ul>
<li>랜덤상황을 가정하면 그 socre 값이 positive negative 와 상관없이 정확히 0.5가 된다.</li>
<li>0.5 : 랜덤 (전체집합에서 positive negative 와 상관없이)</li>
<li>0.7~ : 괜찮은 모델이라 판단 가능</li>
</ul>
</li>
<li>언제쓰나?<ul>
<li>정확한 확률값에 대한 것 보다 ranking 에 대한 prediction 을 할때에 사용해야함</li>
<li>데이터가 심하게 imbalanced 되어있으면 사용해선 안된다.<ul>
<li>true negative 가 많아서 false positive rate 가 내려갈 수도 있기 때문</li>
</ul>
</li>
<li>positive negative 둘 다에 대해서 동일하게 중요하게 생각할때 사용<ul>
<li>만약 true negative 만큼 true positive 가 중요하면 roc auc 를 쓰는게 말이 된다.
<img src="https://images.velog.io/images/stella_y/post/c12e0582-27b1-4fb2-8af2-feb87d797eaf/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="4-pr-aucaverage-precision">4. PR AUC(=Average Precision)</h3>
<p><img src="https://images.velog.io/images/stella_y/post/d0de2fa8-9894-4eab-aaf9-009f31aa2a3e/image.png" alt=""></p>
<ul>
<li>precision 과 recall 을 한방에 그리는 것<ul>
<li>recall 의 변화에 따른 precision 들을 다 모아서 평균을 낸다.</li>
</ul>
</li>
<li>y 축 값이 높을수록 좋은 모델인 것</li>
<li>recall 의 어느 시점에서 precision 이 빠르게 떨어지기 시작하는지를 파악해서 threshold 를 정해야함</li>
<li>recall 에 따른 평균이기때문에 랜덤하게 pick 했을때의 기댓값은 0.5가 아니고 초기 p:n=1:k 라고 할 때 1/(1+k) 가 됨. → threshold 이동하면서 그린 그림에서는 true label 안에서 p 와 n의 비율이 계속해서 변하기때문에 random 과의 관계를 표현할 수 있다면 괜찮지만, 그렇지 않다면 값 자체를 신뢰하기는 어려워질 수 있음</li>
<li>언제쓰나<ul>
<li>설득용</li>
<li>business 에 맞는 threshold 찾고자 할때</li>
<li>데이터가 매우 imbalanced 되어있을 때</li>
<li>positive class가 negative class 에 비해서 더 중요할 때<ul>
<li>pr auc 는 주로 positive class 에 주목하게 되므로, frequent negative class 에 대해서는 무시하게 되는 경향이 크다.(<a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/">https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/</a>)</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="5-others">5. others</h3>
<ul>
<li>micro macro<ul>
<li>micro : 평균을 계산할때 각 클래스의 샘플 수를 고려해서 평균을 취함(이전에 내가 balancing 을 한 것과 동일한 듯)<ul>
<li>클래스 불균형 등에 민감하게 반응 가능</li>
</ul>
</li>
<li>macro : 각 클래스의 샘플 수에 상관 없이 평균 취함<ul>
<li>모델의 전반적인 성능에 대해 평가 가능</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="evaluation-metrics-comparison">Evaluation metrics comparison</h2>
<h3 id="roc-auc-vs-pr-auc">ROC AUC vs PR AUC</h3>
<ul>
<li>roc auc 는 true positive rate(tp/(tp+fn)), false positive rate(1-tn/(fp+tn)를 보는 반면, pr auc 는 positive predictive value(tp/(tp+fp)), true positive rate(tp/(tp+fn))를 보게 됨</li>
<li>positive class 가 더 중요하다면 이것에 대해 더 민감한 pr auc 가 더 나음(tn 을 전혀 보지 않음, positive 에 더 민감함)<ul>
<li>e.g.) fraud detection 등에서처럼 데이터가 imbalanced 되어있고, positive 가 더 중요한 경우</li>
</ul>
</li>
<li>예시<ul>
<li>총 데이터: 1,000,000개, Positive 데이터: 100개</li>
<li>Model 1: <strong>100개를 P로 predict했는데, 90개가 맞음.</strong> -&gt; TP = 90, TN = 999890, FP = 10, FN = 10.</li>
<li>Model 2: <strong>2000개를 P로 predict했는데, 90개가 맞음.</strong> -&gt; TP = 90, TN = 997990, FP = 1910, FN = 10.</li>
<li><strong>Model 1이 더 뛰어난 model임을 알 수 있다.</strong> 하지만 ROC curve의 TPR, FPR은 이에 대한 차등을 두지 않는다.<ul>
<li>ROC curve<ul>
<li>Model 1: 0.9 TPR, 0.00001 FPR<ul>
<li>TPR = TP/(TP + FN) = 90/(90 + 10) = 0.9</li>
<li>FPR = FP/(FP + <strong>TN</strong>) = 10/(10 + <strong>999890</strong>) = 0.00001</li>
</ul>
</li>
<li>Model 2: 0.9 TPR, 0.00191 FPR <strong>(difference of 0.0019)</strong><ul>
<li>TPR = TP/(TP + FN) = 90/(90 + 10) = 0.9</li>
<li>FPR = FP/(FP + <strong>TN</strong>) = 1910/(1910 + <strong>997990</strong>) = 0.00191</li>
</ul>
</li>
<li>이때 랜덤일 경우 roc auc 값은 0.5 (데이터 분포에 상관없이 항상 일정함)</li>
</ul>
</li>
<li>PR curve<ul>
<li>Model 1: 0.9 precision, 0.9 recall<ul>
<li>Precision = TP/(TP + FP) = 90/(90 + 10) = 0.9</li>
<li>Recall = TP/(TP + FN) = 90/(90 + 10) = 0.9</li>
</ul>
</li>
<li>Model 2: 0.045 precision <strong>(difference of 0.855)</strong>, 0.9 recall<ul>
<li>Precision = TP/(TP + FP) = 90/(90 + 1910) = 0.045</li>
<li>Recall = TP/(TP + FN) = 90/(90 + 10) = 0.9</li>
</ul>
</li>
<li>랜덤일 경우 PR auc 값은 (100/1000000)*0.5</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>위의 두 지표를 비교해봤을때 PR curve의 경우, 랜덤일경우에 대한 기준이 정해져있지 않기때문에(데이터 분포에 따라서 변하기때문에) 데이터 분포에 대한 파악없이, 숫자만으로 어떤 insight를 얻는 것이 쉽지 않다.</li>
<li>즉, 주기적으로 매일매일 성능을 확인해야하는 경우에는 pr auc 로는 daily의 추세등을 한눈에 파악하기 어려워서 적절하지 않은 것으로 보인다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[책 리뷰]ADAPT -팀하포드]]></title>
            <link>https://velog.io/@stella_y/%EC%B1%85-%EB%A6%AC%EB%B7%B0ADAPT-%ED%8C%80%ED%95%98%ED%8F%AC%EB%93%9C</link>
            <guid>https://velog.io/@stella_y/%EC%B1%85-%EB%A6%AC%EB%B7%B0ADAPT-%ED%8C%80%ED%95%98%ED%8F%AC%EB%93%9C</guid>
            <pubDate>Mon, 14 Feb 2022 13:08:38 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/stella_y/post/0d0ef6e1-7744-4771-8552-fe346b6a8806/image.png" alt=""></p>
<h1 id="1장-불확실성은-어떻게-무기가-되는가">1장. 불확실성은 어떻게 무기가 되는가</h1>
<ul>
<li><p>세계는 복잡하고 빠르게 변화하며 그 안에 존재하는 문제들 또한 복잡하고 빠르게 변화한다. (기후변화에 대응할 수 있도록 경제체제를 변경하는 방법, 가난한 나라를 부유하게 만드는 방법, 투자은행들이 또다시 금융 시스템을 붕괴시키지 못하도록 제어하는 방법 등)</p>
</li>
<li><p>이런 문제들을 전문가들을 통해 해결할 수 있을까? → 없다!</p>
<ul>
<li>리더의 역량<ul>
<li>모든 대통령은 정치를 바꾸겠다는 공약을 내건 다음 당선이 되지만, 현실이 피부에 와닿기 시작하면서 지지율이 급락한다.</li>
<li>→ 리더를 계속 잘못 뽑아서가 아니다. 단지 현대 사회에서 리더십이 달성할 수 있는 업적의 범위를 과대평가하기 때문이다.</li>
</ul>
</li>
<li>전문가의 판단에 의문을 제기했던 경제학자(테틀록)<ul>
<li>계량화가 가능한 구체적 예측을 요구하고 실현되는지 지켜보는 형태로 실험</li>
<li>현실화 된 전망은 거의 없었음</li>
<li>학부생들로 이뤄진 대조군보다 살짝 나았지만 객관적으로 월등하지 못했음</li>
<li>전문성과 적중률이 비례하지도 않음</li>
<li>세부 영역에서의 깊은 전문성이 있어도 예측이 더 나아지지 못했음(러시아에 관한 예측을 캐나다 전문가가 더 잘맞춘다던가...)</li>
</ul>
</li>
<li>초우량 기업<ul>
<li>1912년 세계적으로 가장 규모가 컸던 기업들의 운명을 추적<ul>
<li>100대 기업 중 10개가 10년 안에 망했고 83년동안 절반이 없어짐</li>
</ul>
</li>
<li>1400년대 활판 인쇄술 발명<ul>
<li>최초의 활판 인쇄술 - 구텐베르크 성서 인쇄 직후 완전히 파산</li>
<li>이후 12개 회사 설립됐지만 그 중 9개가 3년안에 팧산</li>
</ul>
</li>
<li>자동차 산업 초창기<ul>
<li>미국에 2천개 회사가 있었으나 1%가 살아남음</li>
</ul>
</li>
<li>닷컴 버블</li>
<li>해마다 미국 기업의 10%가 사라짐</li>
<li>왜 그렇게 많은 기업이 파산 했느냐고 묻는 것은 왜 그렇게 소수의 선수만이 올림픽 금메달을 따느냐고 묻는 것과 같다. 시장경제체제는 각 부문마다 오직 소수의 승자만을 허용한다.</li>
<li>컴퓨터 산업<ul>
<li>팔로알토 연구소 - 최초의 개인용 컴퓨터 Alto 개발 / 그러나 이분야 강자가 되지는 못함</li>
<li>→ zx 스펙트럼, bbc마이크로, msx표준 등 Alto계승자 등장 했으나 다 망함</li>
<li>→ 현대 pc의 직접적 조상은 IBM이 개발</li>
<li>→ 근데 os 주도권을 micro soft에 뺏김</li>
<li>→(글이 쓰여질 당시에는) ms가 검색 주도권을 google 에 뺏기면서 인터넷 시장에서의 주도권 뺏겼고, 조만간 software 분야의 지배적 입지를 잃어버릴지도 모름.</li>
<li>이 시장의 변화무쌍한 내일을 예상할 수 있는 사람은 아무도 없다!<ul>
<li>현대 사회는 너무 복잡하며 빠르게 변화하기때문에, 리더의 힘, 전문가의 힘, 초우량 기업의 힘을 가졌다고해서 살아남지는 못한다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>성공적인 아이디어가 뜨고 그보다 덜 성공적인 아이디어가 소멸하는 가운데 시장은 더듬더듬 성공을 향해 나아간다. 우리는 이 프로세스의 생존자들을 바라볼 때 단순히 성공만을 보아서는 안된다. 그 이면에 끝까지 살아남지 못한 회사와 아이디어들, 즉 길고 뒤얽힌 실패의 역사를 함께 보아야 하는것이다.</p>
</li>
</ul>
<h3 id="진화">&quot;진화&quot;</h3>
<ul>
<li>생태학에서의 진화<ul>
<li>&#39;적자생존&#39; 상대적으로 부적합한 개체의 도태에 의해 주도되는 프로세스</li>
<li>이미 갖고 있는 것들의 몇 가지 이형을 시도해본 다음 실패작을 솎아내고 성공작을 모방하는 과정을 되풀이하는 단순한 프로세스로부터 믿기 힘든 복잡성이 등장한다. <strong>변이</strong>와 <strong>선택</strong>을 계속적으로 반복하는 것</li>
<li>단, 이 프로세스가 &quot;<strong>맹목적&quot;</strong>으로 일어남(계획성 없이 랜덤성에 의해서 변이가 발생(<strong>돌연변이</strong>))</li>
</ul>
</li>
<li>시장 경제<ul>
<li>동일하게 변이와 선택이 작용한다.</li>
<li>생태학에서의 변이와의 차이점 - &quot;<strong>계획성&quot;에 의한 변이</strong></li>
<li>과학자와 기술자, 대기업의 꼼꼼한 중간 관리자, 대담한 창업자들이 새로운 아이디어를 내놓으면(계획)</li>
<li><strong>좋은 아이디어는 그 아이디어를 가진 기업의 성장, 직원들의 창업, 경쟁사들의 모방을 통해 널리 확산된다.</strong></li>
<li><strong>나쁜 아이디어는 시장에서 오래 살아남지 못하기 때문에 자연도태된다.</strong></li>
</ul>
</li>
</ul>
<h3 id="우리는-생각보다-맹목적이다">우리는 생각보다 맹목적이다.</h3>
<ul>
<li>화석 분석 데이터(생물 진화 과정)와 기업 소멸 데이터를 비교</li>
<li>기업의 실제 생사 패턴은 계획이 허용된 모델과 완전히 상이한 반면, 계획이 허용되지 않은 모델과 묘하게 닮아있었다.<ul>
<li>만약 기업이 정말 성공적으로 계획을 세울 수 있다면, 기업의 소멸 특징은 생물의 멸종 특징과 완전히 다른 모습일 텐데, 실제로는 양쪽의 특징들이 매우 흡사했다.</li>
<li>추상적인 수학적 모델을 바탕으로 성급한 결론을 내려서는 안되지만 오머로드의 발견은 현대 경제에서 효과적인 계획이 보기 드물다는 사실을 강하게 함축한다.</li>
<li><strong><em>기업의 의사 결정이 성공적이지 않은 경우가 많으므로, 기업들은 끊임없이 나쁜 아이디어들을 도태시키고 그보다 나은 아이디어를 탐색해야한다.</em></strong></li>
</ul>
</li>
<li>우리는 생각보다 맹목적이다. 복잡하고 변화무쌍한 세계에서 시행착오 과정은 필수적이다. 의식적으로 그걸 이용하든 그저 나오는 결과에 몸을 맡기든 이 점은 사실이다.</li>
</ul>
<h3 id="변이와-선택을-허용하지-않으면-적응은-불가능해진다">변이와 선택을 허용하지 않으면 적응은 불가능해진다.</h3>
<ul>
<li>소비에트 연방의 실패 원인<ul>
<li>인상적인 초반 성과<ul>
<li>1950년대에는 많은 서구 전문가가 공산주의는 자본주의보다(반민주적이고 잔인하기는 하지만)효과적인 경제 운영방식이라고까지 결론을 내릴 정도였다.</li>
<li>비록 한때였지만 소비에트 경제가 얼마나 성공적이었는지를 쉽게 잊어버리곤 하며, <strong>계획경제의 붕괴 원인이 수익 동기라는 중요한 원동력과 민간 창업자들의 창의성 부족에 있다고 생각한다. → 말이 안 되는 소리다</strong><ul>
<li>소비에트연방에도 <strong>팔친스키</strong>를 비롯해서 창의력 넘치는 사람들은 많았다. 그들이 단지 국유기업에서 활동했다는 이유만으로 창의성을 잃었을 리는 없다.</li>
<li>소비에트연방의 동기부여 기법이 부족했던 것도 아니다. 사실 소비에트는 <strong>긍정적인 보상에서부터 끔찍할 정도로 부정적인 보상까지 역사상 어느 문명 못지않게 다양하고 폭넓은 보상 방식을 갖추고 적극적으로 활용</strong>했다.</li>
</ul>
</li>
</ul>
</li>
<li>소비에트의 실패 원인 -&gt; <strong><em>병리적 실험 불능성</em></strong><ul>
<li>진화 프로세스의 구성요소는 반복적인 변이와 선택. 소비에트는 이에 실패한 것. <strong>어떤 문제에 대해서도 실질적인 다양한 접근법들을 용납하지 못했고, 무엇이 효과가 있고 없는지 판단하기 어려워했다</strong>. 소비에트 <strong>경제가 발달할수록 입안자들이 참고할 만한 기준점이 줄어들었다</strong>. <strong>시스템 전체가 적응하지 못했다.</strong></li>
</ul>
</li>
<li>팔친스키<ul>
<li>공학자 - 탄광 상황 평가 보고서 작성(탄광 위험도 개선, 근무환경 개선 등 주장) / 무모한 토목공사를 자주 비판</li>
<li>팔친스키 3대원칙(현실의 문제점들이 생각보다 복잡하다는 사실을 알고 있었다.)<ol>
<li><strong><em>새로운 아이디어를 찾고 새로운 것을 시도해볼 것 (변이)</em></strong></li>
<li><strong><em>새로운 걸 시도할 때는 실패하더라도 살아남을 수 있는 규모로 시도할 것 (생존가능성의 중요성 - 6장)</em></strong></li>
<li><strong><em>피드백을 구하면서 실수로부터 교훈을 얻을 것 (선택)</em></strong></li>
</ol>
</li>
<li><strong><em>처형됨:</em></strong> 치명적인 기술적 문제의 발생 가능성을 지적하고 대안을 제시하는 사람은 누구든 &#39;파괴자&#39;로 고발되었다.</li>
</ul>
</li>
<li>소비에트 체제의 경제적 결함 - 변이와 선택을 허용하지 않음으로써 적응을 불가능하게 한다</li>
<li>중앙 계획 당국은 눈앞에 지도나 통계표를 펼쳐놓고 스스로 전지전능하다는 착각 속에서 무엇을 지을지 결정했다. 그런 탁상공론식 계획에서 현장의 복잡성이 고려되지 않는 것은 당연했고 허용되는 변이의 수도 턱없이 적었다.</li>
<li>어느 실험이 성공했고 어느 실험이 실패했는지를 결정하려면 피드백이 무엇보다 필수적이다. 그러나 소비에트 연방에서 피드백은 무자비하게 억제되었다.</li>
</ul>
</li>
</ul>
<h3 id="변이가-어려운-이유">변이가 어려운 이유</h3>
<ul>
<li>변이가 어려운 이유는 조직이 갖는 두 가지 자연스러운 성향때문<ol>
<li>과장성 - 정치가와 기업가는 국가 전체의 의료 시스템 개혁이라든지, 대규모의 기업 합병 같은 덩치 큰 프로젝트를 좋아한다.<ol>
<li>그래야만 이목을 끌 수 있고 자신들이 열심히 일하는 사람으로 비쳐지기 떄문이다.</li>
<li>그러나 그런 <strong>과시성 프로젝트들은 오류가 많고 적응의 여지가 거의 남아있지 않다는 점에서 팔친스키의 첫번째 원칙에 위배된다.</strong></li>
</ol>
</li>
<li><strong>일관성 없이 장소마다 바뀌는 기준을 사람들이 달가워하지 않기 때문</strong>이다.<ul>
<li>코카콜라식 문제<ul>
<li>어떤 환경에나 동일한 기준을 적용해도 되는 단순한 문제를 뜻함</li>
<li>코카콜라는 세계 어디를 가든 모든 사람이 좋아한다. 생산량에 대해서는 높은 기준을 적용해도 괜찮은 것</li>
<li>병원, 학교 운영은 완전히 다른 사안</li>
</ul>
</li>
<li><strong>보통의 사람들은 모든 것이 하나하나 동일하게 높은 품질을 실현해야 한다고 생각한다</strong>. 일종의 전국민적인 집착증. 우리는 모든 공공서비스가 코카콜라처럼 똑같이 우수하기를 원한다. 그러나 그건 <strong>불가능하다</strong>.</li>
<li>&#39;변이와 선택&#39;에서 변이를 진지하게 받아들인다면 한결같이 높은 기준은 불가능할 뿐 아니라 바람직하지도 않다.</li>
<li>문제가 해결되지 않거나 지속적으로 변할 때 거기 접근하는 최상의 방법은 다양한 접근법으로 실험을 해보는 것이다. 아무도 색다른 것을 시도해보지 않는다면 우리는 새롭고 더 나은 방법들을 찾아내는 데 애를 먹을 것이다. 그러나 <strong>변이를 수용하려면 이 새로운 접근법 중 일부는 별로 효과적이지 않을 거라는 사실도 받아들여야만 한다.</strong></li>
</ul>
</li>
</ol>
</li>
</ul>
<h3 id="전통적-조직의-한계">전통적 조직의 한계</h3>
<ul>
<li><strong>대부분의 리더가 정말 듣고 싶어하는 정직한 피드백의 양에는 한계가 있다</strong>.<ul>
<li>그리고 우리는 이 사실을 알고 있기 때문에 <strong>힘 있는 사람에게 보고할 때마다 의견을 듣기 좋게 꾸민다</strong>. <strong>계층 구조가 깊은 조직에서는 그런 프로세스가 여러 차례 반복되면서 진실이 두꺼운 사탕발림 안에 완전히 감추어지게 된다.</strong> 야심이 큰 사람일수록 &#39;예스맨&#39;이 될 가능성이 높다는 증거가 있다. 예스맨들에게 보상이 따르는 경우가 많음을 감안하면 충분히 그럴 만하다.</li>
</ul>
</li>
<li>리더와 관리자가 <strong>진심으로 원한다고 해도 솔직한 피드백을 받지 못하는 경우도 있다.</strong><ul>
<li>계획의 각 단계마다 하급 관리자나 말단 공무원들은 어떤 자원이 필요하고, 그 자원을 어떻게 쓰는 것이 좋을지 제안을 덧붙여 상사에게 보고해야 한다. 그 과정에서 그들은 성공에 대한 욕심으로 과도한 약속을 한다든지, 과제의 실현 불가능성을 강조한다든지, 성공에 필요한 자원을 부풀려 말하는 등 그럴싸한 거짓말을 하기로 마음먹을 수 있다. <strong>관료주의적 위계 내에서는 아무것도 덧바르지 않은 진실을 곧이곧대로 말하는 것은 최상의 전략이 아닐지도 모른다. 누군가가 진실을 말하더라도 팔친스키같이 정직한 의견과 예산 인상을 노린 냉소적인 항변을 어떻게 구분할 수 있겠는가.</strong></li>
</ul>
</li>
<li><strong>전통적인 조직은 시행착오라는 탈 중심적 프로세스를 활용할 준비가 전혀 되어있지 않다</strong>.<ul>
<li>그런 조직에는 이미 해결된 정적 문제들이 제격이다. 마찬가지로 업무에서도 일반화된 전문성이 현장 지식보다 훨씬 더 중요하게 취급된다. 그러나 <strong>급변하는 세계에서 &#39;코카콜라식 문제&#39;들은 갈수록 보기 힘들어지고 있다</strong>.</li>
<li><strong>많은 기업들이 탈집중화를 시도하면서 관리자들에게서 권한을 빼앗는 이유도 여기에 있다.</strong></li>
</ul>
</li>
<li>올바른 조직 설계보다 더 근본적인 문제 -&gt; <strong>실수를 인정하고 거기 적응하는 데 어려움을 느끼는 것</strong>은 조직만이 아니다. 개인도 대부분 똑같은 문제에 시달린다.<ul>
<li>시행착오를 수용한다는 건 오류를 용납하는 것이다. 또한 불운 때문이든 잘못된 판단 때문이든 어떤 결정이 효과가 없을 때 상황에 침착하게 대처하는 것이다. 하지만 인간의 뇌는 이런 일을 수월하게 해내지 못한다.</li>
</ul>
</li>
</ul>
<h3 id="왜-우리는-실수를-인정하지-않는가">왜 우리는 실수를 인정하지 않는가</h3>
<ul>
<li>포커에서 급작스러운 감정 상승에 극도로 취약해지는 순간 -&gt; 불운이나 나쁜 전략때문에 큰 돈을 잃고 난 직후<ul>
<li>그 손실은 선수를 &#39;on tilt&#39;상태로 만들어서 이미 잃은 돈을 아직도 자신의 돈이라고 착각하고 그걸 다시 따오기 위해 더욱 공격적인 베팅을 하게 한다. 뇌는 돈이 사라졌다는 사실을 받아들이지 않는다. 손실을 인정하고 전략을 재정비하는 것이 올바른 수수이겠지만 그러기는 너무 고통스럽다. 대신 선수는 무의식중에 그 상황을 일시적이라고 여기고 이를 바로잡기 위해 무리한 베팅을 하게 된다. 그를 파국으로 몰고 가는 것은 애초의 손실이 아니라 그런 손실이 일어난 사실을 거부하기 위해 그가 두는 무리수다.</li>
</ul>
</li>
<li>&quot;손실과 화해하지 않는 사람은 다른 때 같았으면 용납하지 않았을 도박을 받아들일 가능성이 높다.&quot;</li>
<li><strong>실수 또는 손실에 직면했을 때 올바른 대응법은 이를 인정하고 방향을 바꾸는 것</strong>이다. 그러나 우리의 본능적인 반응은 일단 부정이다. &quot;실수에서 교훈을 얻으라&quot;는 지혜로운 조언을 받아들이기 힘겨운 이유가 바로 여기에 있다.</li>
</ul>
<h3 id="새로운-도전의-레시피">새로운 도전의 레시피</h3>
<ul>
<li>이 책에서 우리는 성공적인 적응의 레시피를 배우게 될 것<ol>
<li><strong>새로운 것들을 시도해보되 그중 일부는 실패하리라는 사실을 예상하라</strong></li>
<li><strong>생존 가능한 범위 내에서 실패하라. 실패는 보편적인 일이다.</strong></li>
<li><strong>일단 실패했을 때 그 사실을 인정하라</strong></li>
</ol>
</li>
<li>사실 여기엔 만만찮은 <strong>장애물</strong>이 존재함<ul>
<li>새로운 아이디어를 내놓기 위해서는 주변 사람들과 보조를 맞추려는 성향을 극복하고 <strong>기득권층의 반대를 무릅써야한다.</strong></li>
<li><strong>생존 가능한 범위 내에서 실패한다는 것은 때로 한걸음 한걸음씩 착실하게 진행하라는 의미지만 항상 그런 것만은 아니다.</strong> 많은 혁신은 모험적인 도약으로부터 나타나며 그런 도약에서 살아남는 것은 쉬운 일이 아니다. 금융 시스템의 붕괴에서 살아남기도 쉽지 않다.</li>
<li>그리고 묘하게도 <strong>실패와 성공의 구분이야말로 가장 어려운 일</strong>일 수 있다.<ul>
<li>오만한 리더는 구분 자체를 무시할 수도 있고, 자기 부정으로 그 구분이 애매해질 수도 있으며 세상의 복잡성 떄문에 가장 객관적인 판단력을 가진 사람조차 그걸 구분하기가 어려운 경우도 있다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="2장-탄력성--가족-같은-조직은-왜-무너지는가">2장. 탄력성 : 가족 같은 조직은 왜 무너지는가</h1>
<h3 id="조직도의-함정">조직도의 함정</h3>
<ul>
<li><strong>리더의 훌륭한 결정에 대한 환상</strong></li>
<li>어떤 리더도 매번 올바른 의사결정을 내릴 수가 없다는 데 문제가 있다.</li>
<li>최고의 리더가 실수를 하더라도 훌륭한 조직은 이를 바로잡을 방법을 마련해둔다.</li>
<li>이상화된 계층(완벽한 조직도)가 정확한 결정을 이행하는 데 매력적인 수단이 되는 몇 가지 이유가 있다. 정제된 정보로 &#39;큰 그림&#39;을 도출해낼 수 있고 팀 전체가 한 방향으로 힘을 모으며 명확한 책임 소재 덕분에 정보가 명령 체계 위아래로 순조롭게 흐르기 때문이다.</li>
<li>그러나 <strong>조직의 과제가 실수로부터 교훈을 얻는 것이라고 한다면 이런 자산들 하나하나가 오히려 장애요소가 될 수 있다</strong>. 큰 그림은 자기 망상적인 선전선동 포스터가 되고 단합된 팀은 집단사고로 후퇴하며 명령 체계는 마치 휴지통처럼 정보를 정체시켜서 피드백이 최상단까지 도달하는 것을 철저히 방해한다. 이보다 훨씬 체계가 없고 무질서하며 제멋대로인 것처럼 보이는 조직이 현실적으로는 더 효과적이다.</li>
</ul>
<h3 id="완벽한-조직의-실패">완벽한 조직의 실패</h3>
<ul>
<li>이라크전<ul>
<li>이라크전의 역사를 되짚어보면, <strong>그 침공 자체가 오판이었다는 결론을 피할 수 없음</strong>. 그럼에도 전쟁이 여러 해 동안 위태하게 계속 수행됨 -&gt; <strong>그런 낭패가 그렇게 오랫동안 지속된 이유는 무엇인가</strong></li>
<li>피드백 기회의 무시<ul>
<li><ol>
<li>에릭 신세키 장군 - 럼스펠드가 할당해놓은 규모의 두세배의 병력이 필요함을 권고했으나 럼스펠드에게 즉석 일축됨 - 훗날 그 정확성이 입증됨.</li>
</ol>
</li>
</ul>
<ol start="2">
<li>애비제이드(이라크에서 서열 2위 현장 사령관/서아시아 문제에서의 권위자) - 이라크인들은 민족적, 종교적 분열이 깊기때문에 협조를 얻기 위해 책임 있는 모습을 보여야한다는 피드백 - 일축됨 (유사한 전략을 사용한 몇개의 부대만 성공적으로 작전을 수행할 수 있었음)</li>
</ol>
</li>
<li><strong>&#39;벌레의 시각&#39;(눈앞에 문제를 직접 직면하고, 돌아갈 길을 스스로 찾아야 하는 입장에서의 시각. 즉, 실무자의 시각)을 무시하고, 본인이 전능하다고 믿는 리더들에 의해서 올바르지 못한 전략을 반복하게 됨.</strong></li>
<li><strong>전쟁에서 전략의 오류는 드문일이 아니나(이라크에 간 것이 잘못이 아니라) &#39;적응의 실패&#39; 그보다 더 나쁜 &#39;적응의 거부&#39;가 더 큰 문제였다.</strong></li>
</ul>
</li>
<li>베트남전(가족같은 팀)<ul>
<li>대통령, 국방장관, 합참본부 장군들의 실패에 격분해 &quot;직무유기&quot;라는 제목을 붙임<ul>
<li>이상적인 위계가 어떻게 역효과를 가져올 수 있는지를 명확하게 보여준다.</li>
<li>이상화된 의사결정 위계의 세가지 요소<ol>
<li>활용 가능한 모든 정보의 정밀 분석을 통한 &#39;큰 그림&#39; 도출</li>
<li>한 방향으로 힘을 모으는 단합된 팀</li>
<li>엄격한 명령 체계</li>
</ol>
</li>
</ul>
</li>
<li>이라크전에서와 마찬가지로, 올바른 말을 하는 지휘관들은 경질되고, 사탕발림에 가까운 정보들만 위로 흘러감. 큰그림은 완벽히 틀렸고, 적절하지 않은 전략(위에서 내려온 큰그림)을 반복한 결과 실패만을 거듭할수밖에 없었음.</li>
</ul>
</li>
<li>중앙에서 요약하고 분석해낸 &#39;큰 그림&#39;은 결과적으로 중요성이 떨어지는 정보</li>
<li>충성도 높고 단합된 팀은 대안적인 관점을 허용하지 않는다.</li>
<li>엄격한 명령 체계는 조직의 아래 단계에서부터 나쁜 소식을 차단해 상위 조직(대통령 등)으로의 전달을 방해한다.</li>
<li><strong>&#39;벌레의 시각&#39;(눈앞에 문제를 직접 직면하고, 돌아갈 길을 스스로 찾아야 하는 입장에서의 시각. 즉, 실무자의 시각)을 무시하고, 본인이 전능하다고 믿는 리더들에 의해서 올바르지 못한 전략을 반복하게 됨.</strong></li>
<li><strong>전쟁에서 전략의 오류는 드문일이 아니나(이라크에 간 것이 잘못이 아니라) &#39;적응의 실패&#39; 그보다 더 나쁜 &#39;적응의 거부&#39;가 더 큰 문제였다.</strong></li>
<li>결국 위 전쟁들이 끝나긴 했는데, 위 전쟁들로 부터 미국을 구한건 몇몇 하급 장교들이 징계를 무릅쓰고 상부의 지시를 따르지 않았기 때문이었다. (본인이 파악한 전략대로 행동한 이들과(트랩대위, H.R 맥마스터 연대장 등)과, 이들의 성공을 모방했던 다른 하급 장교들 덕분이었음)<ul>
<li>그렇다면 새로운 전략을 펼친 사람들이 리더였으면 상황이 달랐을까? → 그렇지 않다<ul>
<li>현장에서 기존 전략의 실패를 직접 경험했기때문에 새로운 전략을 시도해볼 수 있었고, 그 새로운 전략들 중 몇몇개가 성공적이었을 뿐인 것.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="바람직한-지휘체계의-조건">바람직한 지휘체계의 조건</h3>
<ul>
<li><strong>실수로부터 교훈을 얻는 비결은 공식적인 지휘 체계를 맹목적으로 고수하는 것이 아니라 필요한 경우 그걸 뒤집는 것이고, 만장일치를 추구하는 것이 아니라 반대 의견을 경청하는것</strong>이며</li>
<li><strong>무엇보다도 상의하달식의 전략에 의존하는 것이 아니라 하급 장교들이 서로서로 교훈을 얻고 빠르게 변하는 현지 상황에 즉각적으로 대응하면서 적응해나갈 것을 믿고 탈집중화하는 것</strong>이다.<ul>
<li>목표를 세우는 것은 고위장교들이지만 융통성 있게 현지 정보에 적응하며 그 목표를 어떻게 달성할지를 결정하는 것은 하급장교들이다. 임무형 지휘 체계하에서 공중 지원병과 포병을 배치하는 것은 회전의자에 앉아 단추만 누르는 3성 장군이 아니라 현지 상황을 실제로 이해하고 올바른 결정을 내릴 것으로 믿을 수 있는 대위나 소장이다.</li>
</ul>
</li>
<li>그러나 단일 조직에게 가능한 혹은 전쟁터에서 바람직한 실험(다윈의 용어로 표현하면 변이)에는 한계가 있다.</li>
<li>때로는 조직이(아무리 유연성을 발휘해도) 감당할 수 있는 수준을 넘어서는 수많은 실험과 변이가 요구되는 경우도 있다. 그런 경우에는 새로운 아이디어의 촉진을 위해 훨씬 급진적인 접근법이 요구된다.</li>
</ul>
<h1 id="3장-변이-해결책은-생각지-못한-곳에서-온다">3장. 변이: 해결책은 생각지 못한 곳에서 온다</h1>
<ul>
<li>변이하는 방법 → 새로운 시도에서 예상치못한 행운이 온다</li>
<li>우리는 미래의 보상을 바라고 지금 돈을 투자하면서 투자 대비 수익을 생각한다.</li>
<li>그러나 새로운 아이디어와 신기술을 투자 대비 수익의 관점으로 생각하는 것은 바람직하지 못하다. <strong>대부분의 신기술은 완벽한 실패로 끝나며, 독창적인 아이디어가 효과적일 때는 그 보상이 너무 엄청나서 합리적인 측정이 불가능하다.</strong></li>
</ul>
<h3 id="혁신의-특성">혁신의 특성</h3>
<ul>
<li><strong>아주 드물지만 보상이 한 번 돌아오면 대박이 난다</strong>는 점에서 이런 프로젝트는 복권 당첨에 비유할 수 있음. 복권은 제로섬 게임이지만, 연구개발 성과는 모든 사람을 이롭게 하므로 복권보다 더 이로움. 복권과 달리 대담한 혁신 프로젝트는 <strong>보상금이 알려져 있지 않고 성공 확률도 고정되어있지 않음</strong>. 골칫거리인 모험이기도 함 <strong>어마어마한 보상이 따르기 때문에 피할 수는 없다</strong>. 좌절감을 주기도 하고, 예측이 불가능하다. <strong>아무런 보상이 돌아오지 않는 경우도 많다</strong>. 외면할 수도 없고, 그렇다고 효과적으로 관리하기도 어렵다. → <strong>행운의 검은백조</strong><ul>
<li>↔ 검은백조(black swan)이론 - 전혀 예상치 못한 사건이 일어나는 현상</li>
<li>세계 2차대전 중 스핏파이어(전투기) - 정상적인 위탁 절차를 우회해서 &quot;가장 흥미로운 실험작&quot;을 주문 → 궤도 수정이 가능한 초고속 전투기가 되어 영국을 승리로 이끌었다.</li>
</ul>
</li>
<li>혁신의 <strong>고립성</strong><ul>
<li>그 잠재성이 발현되기 전까지 일종의 고립 과정을 필요로 한다.</li>
<li>새로운 아이디어가 기존의 통념에 흡수되거나 압도되지 않고 성숙 발전할 수 있도록 숨 쉴 공간을 줘야 함.</li>
<li>(여러 아이디어가 병렬적으로 발전하도록 허용해야한다는 개념)</li>
</ul>
</li>
<li><strong>비싸고 느려진 혁신</strong><ul>
<li>세상이 점점 정교화되고 복잡해지면서 &#39;지식의 부담&#39;이 발생하고 있음을 이해해야한다.</li>
<li>특허 인용된 팀들의 규모는 꾸준히 커지고 있고, 발명가들이 처음 특허를 내는 연령도 꾸준히 상승하고 있다.</li>
<li>기숙사 혁신(차고 또는 기숙사에서 게임 또는 소프트웨어를 개발해 내던 혁신)은 점점 적어지고,</li>
<li>아이폰과 안드로이드 앱의 확산은 혁신이 느려지고 어려워졌으며 값비싸졌다는 불편한 진실</li>
<li>→ 대부분의 분야에서 이전 세대가 걸었던 기대에 훨씬 못미치는 성과를 올리고 있음</li>
</ul>
</li>
</ul>
<h3 id="혁신-장려의-방법">혁신 장려의 방법</h3>
<ul>
<li>특허의 문제점<ul>
<li>신기술의 장려 방법으로 흔히 특허를 생각하지만 특허는 그리 효과적이지 못함</li>
</ul>
<ol>
<li>HIV 백신, 청정에너지 개발등을 장려하기엔 특허는 힘이 없음 - 최초 개발 이후 산업 경쟁력을 갖출 무렵이면 이미 특허 기간은 만료 되었을 것.</li>
<li>정부가 특허권을 포기 하라거나 가격을 삭감하라고 압력을 넣는 일이 왕왕 일어나고 있음</li>
</ol>
</li>
<li>방법 1: <strong>조건없는 후원</strong><ul>
<li>당연히 될 것으로 예상 되는 연구보다, 언뜻 불가능하고 매우 도전적으로 보이는 연구들이 더욱 큰 성과를 가져온다 (행운의 블랙스완)</li>
<li>하워드 휴스 의학 연구소 - 상세 연구계획 없이 대략적 아이디어 스케치와 지원자의 최근 연구결과 사례만 보고 채택 (별다른 단서 조항 x) → 꼼꼼한 서류 검토를 통한 투자를 한 미국 국립보건원보다 더 좋은 연구성과(노벨상, 논문 제출 수, 특허 수 등)</li>
</ul>
</li>
<li><strong>새로운 기술을 장려하는 데 필수적인 두 가지 핵심 원칙</strong><ol>
<li>무엇이 효과적일지 서로 상충되는 관점을 내재한듯 보이더라도 대부분이 실패할 것을 염두에 두고 가급적 많은 실험을 시도해야한다.</li>
<li>실패의 가능성이 보이더라도 성공에 대한 엄청난 보상을 생각해서 장기적인 안목을 지닌 실험을 장려해야한다.</li>
</ol>
</li>
<li>방법 2: <strong>포상제도</strong><ul>
<li>넷플릭스 상 - 기존 추천엔진 개선 프로젝트<ul>
<li>1년 안에 추천오류 8% 낮아짐.</li>
</ul>
</li>
<li>포상제도가 멋진 이유는 성공하기 전까지 비용이 한푼도 들지 않음<ol>
<li>실패가 용납될 뿐 아니라 가장 대담하고 위험성 높은 아이디어가 성공할 수 있는 완전히 개방적인 경쟁의 장</li>
<li>문제가 해결된 경우에만 거액의 비용이 지출됨</li>
</ol>
</li>
</ul>
</li>
<li></li>
</ul>
<h1 id="4장-선택-가난한-사람들을-위한-임상실험">4장 선택: 가난한 사람들을 위한 임상실험</h1>
<ul>
<li>이전까지 변이의 중요성을 강조했다면 이번엔 선택의 중요성 → 어떻게 선택할 것인가</li>
<li>벌레의 시각<ul>
<li>&quot;사물을 가까운 거리에서 보아야 날카롭게 볼 수 있다&quot; &quot;도중에 어떤 장애물을 발견하면 벌레처럼 그 주위를 돌아갈 것이고, 그런 방법으로 분명 목적을 이루고 뭔가 성취할 수 있을 것&quot;</li>
<li>겸손하게 장애물에 적응하면서 성공에 이르는 길이 명확히 보일 때까지 경로를 바꾸어나가는 방법</li>
<li>동시에 그 장애물을 가까운 거리에서 날카롭게 보는 방법이기도 함</li>
</ul>
</li>
<li>e.g. 플레이 펌프</li>
<li><strong>신 컴플렉스를 버리고 무작위 실험(대조실험)을 거듭하라</strong><ul>
<li>더 좋은 전략을 이미 알고있다고 생각하여, 대조군에 불이익을 주고 있다는 착각을 하게 되는 경우가 있음.</li>
<li>그러나 이는 신 컴플렉스에 갇힌 것. 본인이 다 알고있다는 확신을 버리고 명확한 실험 후 선택하는 과정이 필요하다.</li>
</ul>
</li>
<li><strong>피드백 루프를 개선하라</strong><ul>
<li>어떤 아이디어가 효과있는지 알더라도 그 아이디어를 더욱 폭넓게 적용할 수 있는지 검증이 필요하기 때문</li>
<li>e.g. 플레이 펌프</li>
</ul>
</li>
<li><strong>빅 푸시가 필요할 수도 있다.</strong><ul>
<li>빅푸시 : 정부나 기부자들이 끼어들어 진보를 주도하는 것<ul>
<li>우편제도, 금융 시스템, 인터넷 인프라를 동시다발적으로 개혁하는 등</li>
</ul>
</li>
<li>빅푸시는 필요한가?<ul>
<li>항상 효과적이지는 않지만 효과적인 경우가 있더라.</li>
</ul>
</li>
</ul>
</li>
<li><strong>도시 실험 프로젝트</strong><ul>
<li>독립적인 도시국가(헌장도시)들이 생존, 번영할 수 있음을 확인한 바 있음<ul>
<li>싱가폴, 홍콩,</li>
<li>선전(중국) - 중국의 첫 &#39;특별경제구역&#39;으로 지정된 이후 홍콩에 견줄만한 라이벌 도시로 성장</li>
</ul>
</li>
</ul>
</li>
<li>헌장도시의 성공<ul>
<li>성공비결 1. 헌장도시는 바람직한 규모로 적응의 여지를 제공한다.<ul>
<li>변화를 가져올 수 있을 만큼 크면서도, 수십 혹은 수백가지의 실험이 공존할 수 있을 정도로 작다.</li>
<li>빅푸시는 실패하기 일쑤고 작은 발걸음으로는 효과가 미흡한 개발분야의 딜레마를 해결해줄 대안이 된다.</li>
</ul>
</li>
<li>성공비결2. 변이만 아니라 선택이 가능하다.<ul>
<li>정부가 도시를 만들어 놓고, 국민들 중 새로운 규칙에 따라 생활하고 싶어하는 사람들이 있는지 지켜보는 것.</li>
<li>도시의 규칙, 기관, 물리적인 인프라가 시민들에게 훌륭하 삶의 질, 범죄의 공포로부터의 자유로움 훌륭한 소득 창출의 기회를 제공해주도록 설계될 수 있다면 그런 도시에는 잘 살고 싶은 사람들이 모여들 것이다.</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper review]PinText : A Multitask Text Embedding System in Pinterest]]></title>
            <link>https://velog.io/@stella_y/Paper-reviewPinText-A-Multitask-Text-Embedding-System-in-Pinterest</link>
            <guid>https://velog.io/@stella_y/Paper-reviewPinText-A-Multitask-Text-Embedding-System-in-Pinterest</guid>
            <pubDate>Thu, 10 Feb 2022 15:29:02 GMT</pubDate>
            <description><![CDATA[<h1 id="pintext">PinText</h1>
<ul>
<li>pinterest 에서 19년에 kdd에 냈던 논문.</li>
<li><a href="https://dl.acm.org/doi/10.1145/3292500.3330671">https://dl.acm.org/doi/10.1145/3292500.3330671</a></li>
</ul>
<h3 id="abstract">Abstract</h3>
<ul>
<li>bert 등의 pretrained model 은 산업환경에 맞지 않다며, 새로운 방법의 multitask text embedding solution을 제안함.</li>
<li>word level semantic vectors 생성함. 이때 randomly sampled background 에 비해 positive engagement pair 에 더 큰 similarity 를 주도록 강제해서 학습하는 방식</li>
</ul>
<h3 id="introduction">Introduction</h3>
<ul>
<li>pin, user text - pin&#39;s title, description, board name, url을 데이터로 이용</li>
<li>원하는 result - <em><strong>text embedding하고 word level embedding vector 를 average 해서  pin, user, search query 를 하나의 space 에 놓는 것</strong></em><ul>
<li>→ <em><strong>다른 type 의 object 들에 대한 retrieval, classification 등을 nearest neighbor search 의 통합된 방법으로 해결</strong></em></li>
</ul>
</li>
<li>pretrained word embedding(bert 등)에 대한 저자의 부정적 의견<ul>
<li>연구에서의 요구사항과 산업에서의 요구사항은 다르다는 견해</li>
<li>key design philosophy<ol>
<li>storage cost<ul>
<li>embedding 의 갯수는 multiple versions of embedding 과 cosine similarity 같은 realtime cost를 증가시킴</li>
<li>→ storage 를 아끼기 위한 all in one solution 를 원함</li>
</ul>
</li>
<li>memory cost<ul>
<li>top 10 language 에 대한 fasttext(character 기반모델) 모델의 경우 50기가</li>
<li>→ 메모리에 올리기 좋은 크기의 word 기반 모델</li>
</ul>
</li>
<li>supervised information<ul>
<li>guide model learning 이 더 효율적임</li>
</ul>
</li>
<li>throughput and latency<ul>
<li>latency critical realtime computation</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
<li>위와 같은 needs로 in-house text embedding system이 필요하다고 생각함</li>
<li>repin, click engagement 를 positive training data 로 활용 (supervised learning)</li>
</ul>
<h3 id="related-work">Related work</h3>
<ol>
<li>text embedding in nlp<ul>
<li>sota 에서는 sequential text 를 이용한 모델이 대부분임</li>
<li>But, internal data distribution 이 public corpus 와 매우 다름<ul>
<li>pinterest 의 데이터는 long sentence 보다는 concrete annotation term</li>
</ul>
</li>
<li>But, objective function 이 매우 다름<ul>
<li>cbow, skip gram 등은 co-occurance 를 기반으로 학습하게 됨</li>
<li>facebook 의 starspace 등을 참고해서 supervised embedding training type 을 사용하고자 함</li>
</ul>
</li>
</ul>
</li>
<li>multitask learning<ul>
<li>결과 모델은 세가지 태스크에 적합해야하므로, multitask learning 을 진행할 예정</li>
<li>classification 에는 흔한 task 이지만, word embedding 에서는 흔치 않음</li>
</ul>
</li>
<li>transfer learning<ul>
<li>off-the-shelf text features independent on specific task - 이걸 top 에 올리고 downstream task 를 진행하는 transfer learning 과 연관이 있다고 볼 수 있음</li>
<li>e.g. elmo, gpt, bert...</li>
<li>그러나 pinterest 에 적합하지 않음<ol>
<li>종종 not sequential 함</li>
<li>inference efficiency 가 매우 중요함</li>
</ol>
</li>
<li>retrieval 이 중요 task 이기 때문에 bert의 next sentence prediction task 에는 적합하지 않음</li>
<li>태생적으로 retrieval task 를 handling 하는 starspace 를 참고할 예정</li>
</ul>
</li>
</ol>
<h3 id="system-design">System design</h3>
<p><img src="https://images.velog.io/images/stella_y/post/d55927d3-1771-4724-b828-3afa25a281c0/image.png" alt=""></p>
<ul>
<li>세개의 모듈로 구성 : offline model training, index building, online serving</li>
<li>offline training<ul>
<li>kafka로 user engagement data 수집</li>
<li>training data 구성</li>
</ul>
</li>
<li>index building<ul>
<li>kubernetes cluster (embedding vector를 distributed way 로 만든다)</li>
<li>user, pin, query entity 의 candidate embedding 에 lsh 적용(pre-compute token), 여기에 inverted index 적용</li>
<li>embedding vector 와 knn 결과를 caching</li>
</ul>
</li>
<li>online serving<ul>
<li>embedding vector lsh token 사용해서 retreival 등에 사용</li>
</ul>
</li>
</ul>
<h3 id="multitask-text-embedding">Multitask text embedding</h3>
<p><img src="https://images.velog.io/images/stella_y/post/1cb47e29-cd08-4b0c-9406-2f547f5ec8db/image.png" alt=""></p>
<ul>
<li><p>task definition</p>
<ul>
<li>q, p</li>
<li>positive pair - repin, long click</li>
<li>q 에 해당하는 task<ul>
<li>home feed 에서 user</li>
<li>search 에서의 search query</li>
<li>related pin 에서의 subject pin</li>
</ul>
</li>
<li>p - a set of words {w } where each word wi appears in the union of pin’s text metadata:<ul>
<li>title, description, boardname, url</li>
</ul>
</li>
<li>u - a set of words {w } where each word wi appears in the union of user’s interests</li>
</ul>
</li>
<li><p>Multitask formulation</p>
<ul>
<li><img src="https://images.velog.io/images/stella_y/post/aa76222d-7ab0-41c4-84b9-1e6b2270487c/image.png" alt=""><ul>
<li>L : hinge loss</li>
<li>S : cosine similarity</li>
<li>→ positive entity 의 similarity 가 random 에 비해 크게 학습되도록 함</li>
<li>details<ol>
<li>importance of each task - 따로 주지 않음 (objective function 이 natural engaged traffic 을 반영하게 하고자 함)<ol start="2">
<li>tradeoff btw coverage and precision - positive pair 에 대해서 강한 filter를 주면 precision 은 늘어나지만, coverage 가 좁아짐</li>
</ol>
<ul>
<li>처음엔 약한 filter로 낮은 precision 으로 학습을 시켜보고, 점차 filter 강화</li>
<li>coverage가 높은 모델의 결과로 다음 모델학습에서 initialization embedding dictionary로 사용함.</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Anomaly detection] Traditional way - Distance-based methods]]></title>
            <link>https://velog.io/@stella_y/Anomaly-detection-Traditional-way-Distance-based-methods</link>
            <guid>https://velog.io/@stella_y/Anomaly-detection-Traditional-way-Distance-based-methods</guid>
            <pubDate>Sun, 23 Jan 2022 10:59:09 GMT</pubDate>
            <description><![CDATA[<h2 id="k-nearest-neighbor-based-anomaly-detection">K-nearest neighbor-based anomaly detection</h2>
<ul>
<li>이상치 데이터는 거리상으로 멀리 떨어져있을 것이라는 가정</li>
<li>이때엔 거리만으로 이상치 여부를 판단하고, normal class에 대해서 어떠한 사전분포도 가정하지 않는다.</li>
</ul>
<h3 id="k-nearest-neighbor">k-nearest neighbor</h3>
<ul>
<li>parzen window density estimation 에서 
<img src="https://images.velog.io/images/stella_y/post/9d4e5bce-dbfa-41d5-9b9d-20e027108598/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-23%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.43.51.png" alt="">
p(x)=k/(N*V) (k=영역에 존재하는 데이터의 수 , N=객체의 수, V=영역 R의 volumn) 에서 V를 고정시킨게 parzen window density estimation 이라면 k-nearest neighbor는 k를 고정시킨 것 (k를 커버하는 V를 추정하는 것)</li>
<li>k번째까지의 거리를 어떻게 측정할 것인가에 따라서 변종들이 있음<ul>
<li>max distance, average(개별적 거리를 먼저 계산 후 average), 평균까지의 거리(무게중심하나 놓고, 무게중심까지의 거리를 측정)
<img src="https://images.velog.io/images/stella_y/post/ca602f15-fe01-4142-99e6-3d62a9ef1e55/image.png" alt=""></li>
<li>아래 그림에서처럼 측정 방법에 따라서 이상치 스코어가 달라진다.
<img src="https://images.velog.io/images/stella_y/post/43f96434-ddce-421a-9fa5-ed44486035ef/image.png" alt=""></li>
</ul>
</li>
</ul>
<h3 id="knn-기반-anonaly-detection-에서의-반례">knn 기반 anonaly detection 에서의 반례</h3>
<ul>
<li>knn 기반의 기법들이 찾아내지 못하는 반례들이 존재한다.
<img src="https://images.velog.io/images/stella_y/post/8bbaf293-0015-47b5-a33f-000ffe5db663/image.png" alt=""></li>
<li>위 그림에서처럼 B에서의 세모는 polygon 내부에 있기때문에, 다른 어떤 점들 보다도 이상치 스코어가 더 낮아야한다. 또한 A, B에서 동그라미는 polygon 바깥에 있으므로 더 높은 이상치 스코어를 나타내야한다.</li>
<li><blockquote>
<p>그런데 그렇지 않음!</p>
</blockquote>
</li>
</ul>
<h3 id="반례-보완">반례 보완</h3>
<ul>
<li>A hybrid novelty score and its use in keystroke dynamics-based user authentication (PilsungKang, SungzoonCho, 2009)</li>
<li>보정 하는 factor 만듦
<img src="https://images.velog.io/images/stella_y/post/47e1d0c5-2844-4f43-865c-5462b82b3121/image.png" alt=""></li>
<li>현재 알아보고자 하는 객체가 이웃들로 만들어지는 convex 안에 위치하는지 확인하는 것</li>
<li>객체(x)와 이웃(z(x))가 있을때, 이웃들을 x와 가장 유사하게 변형시키는 w를 찾아낸다.
<img src="https://images.velog.io/images/stella_y/post/aa2a5aef-cc70-46b2-be88-8779b16e4342/image.png" alt=""></li>
<li>polygon 밖에 있다면(convex hull distance가 0이 아니라면) 분모가 커지면서 average distance 에 대한 penelty 부분이 증폭되게 된다.
<img src="https://images.velog.io/images/stella_y/post/6f76a9ab-3e04-4eb2-9989-47b9b4ff68bb/image.png" alt="">
위의 그림상에서 보자면 원이 세모보다 더 큰 이상치 스코어를 갖게 되었다.
<img src="https://images.velog.io/images/stella_y/post/35dfc6d1-8968-4b4e-ab5f-3f57500131d8/image.png" alt="">
제안하는 score 를 이용했을때에(f) 밀도가 낮은 영역에 구멍이 뚫리는 현상도 사라지고, 밀도가 높은 영역 중간영역 또한 잘 구분해 내는걸 알 수 있었다.</li>
</ul>
<p>총 21개의 데이터에 대해서 14개 알고리즘을 30회 반복 실험을 했을때(21*14*30)에 더 좋은 결과를 보여주었다.</p>
<h2 id="clustering-based-approach">Clustering-based approach</h2>
<ul>
<li>DBSCAN 같은 알고리즘은 군집에 속하지 않은 객체들은 전부 이상치로 취급한다</li>
<li>이 외에 일반적인 clustering algorithm을 이용해서도 이상치 판단이 가능함. </li>
<li>가장 가까운 군집과의 거리가 멀 경우 이상치로 판단하는 것이 그 방법이다.
<img src="https://images.velog.io/images/stella_y/post/f9ce3d4e-f0f0-4f39-9792-7bb84da7c8e7/image.png" alt=""></li>
<li>k means clustering을 진행한 후, 이상치를 판단하는데, 그 판단에는 아래의 두 방식이 존재한다.</li>
</ul>
<ol>
<li>absolute distance to the nearest centroid<ul>
<li>가장 가까운 centroid 까지의 거리를 구한다</li>
</ul>
</li>
<li>relative distance to the neariest centeroid<ul>
<li>군집의 지름을 계산해서, 군집 지름대비 얼마나 더 멀리떨어져있는지로 계산
<img src="https://images.velog.io/images/stella_y/post/8d07209c-5bb6-4c54-92d5-7f32d3597e20/image.png" alt=""></li>
</ul>
</li>
</ol>
<ul>
<li>kmeans based anomaly score 를 sklearn 에서 제공하고 있는데 그걸 이용하면 아래와 같이 나타난다.
<img src="https://images.velog.io/images/stella_y/post/8571b738-6a65-40d3-9d5f-66dee838a27d/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Auto encoder 의 시간에 따른 성능 열화 실험]]></title>
            <link>https://velog.io/@stella_y/Auto-encoder-%EC%9D%98-%EC%8B%9C%EA%B0%84%EC%97%90-%EB%94%B0%EB%A5%B8-%EC%84%B1%EB%8A%A5-%EC%97%B4%ED%99%94-%EC%8B%A4%ED%97%98</link>
            <guid>https://velog.io/@stella_y/Auto-encoder-%EC%9D%98-%EC%8B%9C%EA%B0%84%EC%97%90-%EB%94%B0%EB%A5%B8-%EC%84%B1%EB%8A%A5-%EC%97%B4%ED%99%94-%EC%8B%A4%ED%97%98</guid>
            <pubDate>Fri, 14 Jan 2022 18:41:23 GMT</pubDate>
            <description><![CDATA[<h2 id="요약">요약</h2>
<ul>
<li>뉴스 기사의 multi lingual bert emb 를 차원 축소시키는데에 auto encoder를 이용하게 될 예정.</li>
<li>model 의 학습에 쓰이는 feature를 정기적으로 재학습 시키고 update하는 과정을 꼭 해야만 할지 알아보기 위해 실험을 진행한다.</li>
<li>5월에 학습시킨 오토인코더를 6월부터 11월 데이터에 적용해보고, 성능 저하가 발견되는지(loss 값이 크게 증가하는지)확인한다.</li>
<li>시간이 지나도 loss 값은 크게 증가하지 않는 모습을 보인다.</li>
<li>즉, <strong>5월 데이터로 학습한 오토인코더를 11월에 사용해도 성능은 뒤떨어지지 않음을 알 수 있다.</strong></li>
</ul>
<h2 id="실험-목표">실험 목표</h2>
<ul>
<li>뉴스 기사 multi lingual bert embedding vector의 차원 축소시키는데에 auto encoder를 이용하게 될 예정.</li>
<li>model 의 학습에 쓰이는 feature를 정기적으로 재학습 시키고 update하기 위해서는 준비해야할 부분이 너무 많다.</li>
<li>이 번거로운 준비를 해보기 전에, auto encoder의 성능 열화를 정량적으로 확인하고, 차원 축소 모델의 정기적 업데이트가 불가피한 일인지를 확인한다.</li>
</ul>
<h2 id="실험-방법">실험 방법</h2>
<ul>
<li>5월 데이터로 오토인코더를 학습시킨다.</li>
<li>학습시킨 오토인코더로 6,7,8,9,10,11월의 데이터를 encoding 후 decoding 했을때에 loss 가 얼마나 증가하는지를 확인하여, 오토인코더가 시간이 지남에 따라 그 성능이 얼마나 나빠질 수 있을지 확인한다.</li>
<li>(차원 축소된 item vector를 이용한 ctr 실험으로 성능열화실험을 진행하려 했으나, 서로 다른 데이터에 대해서 ctr 예측 결과의 정확한 정도를 나누는 것이 합리적이지 않다고 여겨졌다. 또한 그럼에도 실험을 해보았을때에 데이터가 매우 튀어 비교가 불가능한 상태였다.)</li>
</ul>
<h2 id="auto-encoder-학습">auto encoder 학습</h2>
<ul>
<li>4단 stacked auto encoder 활용 (768 → 64 → 32 → 16 →5)</li>
<li>뉴스기사 제목과 내용의 270만개의 multi lang bert 결과로 학습
(2021-05-01 ~ 2021-05-05)</li>
</ul>
<h3 id="loss-확인-대상-데이터">Loss 확인 대상 데이터</h3>
<ul>
<li>6,7,8,9,10,11월의 1일부터 15일까지의 뉴스기사 중 unique 한 25000개를 random 하게 추출한다.</li>
<li>위의 데이터를 AE 를 통과시킨 후의 loss 값이 얼마나 늘어나는지를 확인한다.</li>
</ul>
<h2 id="실험-결과">실험 결과</h2>
<p><img src="https://images.velog.io/images/stella_y/post/83619845-8e63-4a5b-8b78-2861fd4c7919/image.png" alt="">
<img src="https://images.velog.io/images/stella_y/post/d0b626d5-4c5d-4276-b65a-f57fc5682d0b/image.png" alt=""></p>
<ul>
<li>시간이 지나도 loss 값은 크게 증가하지 않는 모습을 보인다.</li>
<li>즉, 5월 데이터로 학습한 오토인코더를 11월에 사용해도 성능은 뒤떨어지지 않음을 알 수 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Auto encoder 와 pca 의 차원 축소 성능 비교 실험]]></title>
            <link>https://velog.io/@stella_y/Auto-encoder-%EC%99%80-pca-%EC%9D%98-%EC%B0%A8%EC%9B%90-%EC%B6%95%EC%86%8C-%EC%84%B1%EB%8A%A5-%EB%B9%84%EA%B5%90-%EC%8B%A4%ED%97%98</link>
            <guid>https://velog.io/@stella_y/Auto-encoder-%EC%99%80-pca-%EC%9D%98-%EC%B0%A8%EC%9B%90-%EC%B6%95%EC%86%8C-%EC%84%B1%EB%8A%A5-%EB%B9%84%EA%B5%90-%EC%8B%A4%ED%97%98</guid>
            <pubDate>Fri, 14 Jan 2022 18:33:55 GMT</pubDate>
            <description><![CDATA[<h2 id="요약">요약</h2>
<ul>
<li>model 의 feature 로 뉴스기사 제목과 내용의 embedding 을 사용하고 있다. 이때 768차원의 bert embedding 결과물을 축소할 방법으로 <strong>auto encoder, pca 둘 중 어떤 방법이 적절할지를 실험을 통해 비교</strong>한다.</li>
<li>각 방법으로 차원축소한 item embedding 결과로 ad ctr 예측실험을 했을때에 auto encoder 로 차원축소한 경우 예측 성능이 더 뛰어났다.</li>
<li>즉, item 의 multi lingual bert emb 의 차원 축소 방법으로 <strong>auto encoder 를 이용하는 것이 더 적절함</strong>을 알 수 있다.</li>
</ul>
<h2 id="실험-목표">실험 목표</h2>
<ul>
<li>model 의 feature 로 뉴스기사 제목과 내용의 embedding 을 사용하고 있다. 이때 768차원의 bert embedding 결과물을 축소할 방법으로 auto encoder, pca 둘 중 어떤 방법이 적절할지를 실험을 통해 비교한다.</li>
</ul>
<h2 id="실험-방법">실험 방법</h2>
<ul>
<li>뉴스기사 의 multi lingual bert vector 의 차원을 pca 로 축소시켰을때와 auto encoder로 축소시켰을 때의 값을 feature 로 사용하여 각각의 feature 로 뉴스기사에 달린 광고의 ctr 예측을 lgbm으로 학습하여, 예측 성능을 비교한다.</li>
<li>즉, pca로 압축한 뉴스기사 feature 로 광고 ctr을 예측하는 lgbm model 을 만들고, auto encoder로 압축한 feature 로 ad ctr을 예측하는 lgbm model 을 만들고, 이 각각의 예측 성능을 비교한다.<ul>
<li>lgbm을 사용하는 이유?<ul>
<li>현재 서빙중인 모델인 deepfm 을 사용할 수 도 있지만, 이를 학습시키기 위해서는 더 많은 feature 와 더 많은 데이터가 필요하다. 적은 데이터로 빠르게 실험하기 위해서는 더 작고 간단한 lgbm model을 쓰는게 낫다고 판단했다.</li>
</ul>
</li>
<li>ctr 예측 실험을 구성한 이유<ul>
<li>이전 실험에서 뉴스기사의 제목과 내용 정보가 광고 ctr에 영향을 미친다는것을 이미 확인했기때문에, 이 feature 를 차원 축소시킨 feature 로 광고 ctr 예측을 더 잘하는 쪽이 더 좋은 차원 축소 기법이라 생각했기 때문.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="각-차원-축소-모델의-학습">각 차원 축소 모델의 학습</h3>
<ul>
<li>auto encoder<ul>
<li>layer 구성<ul>
<li>4개 encoder layer 활용 (768 → 64 → 32 → 16 → 5)</li>
<li>선행실험에서 좀 더 효율적인 방식이라 확인했던 bottle neck layer 주변에 layer 를 더 쌓는 방식으로 구성</li>
</ul>
</li>
<li>학습 데이터<ul>
<li>100만개 뉴스기사 의 제목과 내용의 multi lang bert emb 결과 활용 (&#39;2021-10-29&#39;~&#39;2021-10-31&#39;)</li>
</ul>
</li>
</ul>
</li>
<li>pca<ul>
<li>spark ml의 pca 활용</li>
<li>학습 데이터는 autoencoder와 동일</li>
</ul>
</li>
</ul>
<h3 id="ctr-예측을-위한-lgbm-모델의-학습">ctr 예측을 위한 lgbm 모델의 학습</h3>
<ul>
<li>데이터<ul>
<li>2021-10-31부터 2021-11-04까지의 뉴스기사 중 2021-10-31부터 2021-11-15일간 view 수가 2000회 이상인 item 14016개와 동일기간에서 이 뉴스기사의 광고 ctr 데이터를 학습<ul>
<li>view 2000회 이상이라는 조건을 준 이유는 이런 조건이 없다면 대부분의 뉴스기사의 광고 ctr이 0인 경우가 지나치게 많다. (읽히지 조차 않은 뉴스기사들을 제거하기 위한 룰)</li>
<li>10% 는 testing, 나머지 90%는 training 에 활용</li>
</ul>
</li>
</ul>
</li>
<li>비교대상<ul>
<li>뉴스기사의 제목과 내용을 multi lingual bert로 vector화 한 후 이를 pca 로 5차원으로 압축시킨 feature 를 활용하여 lgbm을 학습</li>
<li>뉴스기사의 제목과 내용을 multi lingual bert로 vector화 한 후 이를 auto encoder 로 5차원으로 압축시킨 feature 를 활용하여 lgbm을 학습</li>
<li>위의 두 학습 모델의 예측 성능을 비교</li>
</ul>
</li>
</ul>
<h2 id="실험-결과-확인">실험 결과 확인</h2>
<h3 id="histogram">Histogram</h3>
<ul>
<li>실제 ctr 값의 분포와, 모델이 예측한 ctr 값의 분포를 비교한다<ul>
<li>(모델이 중앙값만 예측값으로 반환해서 mse 만 낮추고 있을 수도 있기 때문)</li>
</ul>
</li>
<li>아래의 히스토그램을 비교해봤을때 문제가 있어 보이는 모델(유사한 값만 계속 예측한다거나, label data 의 분포를 크게 벗어나거나)은 보이지 않는다</li>
<li>x 축 : ctr, y 축 : 빈도
<img src="https://images.velog.io/images/stella_y/post/6be9ee40-c21e-4574-8cf9-6da0d67735c9/image.png" alt=""></li>
</ul>
<h3 id="roc-auc-score-확인">Roc auc score 확인</h3>
<ul>
<li>각 모델에서의 구분력을 알아보기 위해 classification에서의 평가기준인 roc auc score 를 적용</li>
<li>기준 ctr(regression 결과에서 classification 결과로 해석을 위해 true, false 를 가를 기준 ctr 을 둔다)을 변경하면서, 이때의 roc auc score 계산하여 그래프로 그린다.</li>
<li>아래 그래프를 확인해봤을때에 거의 모든 기준 ctr 상에서 차원 축소 방법으로 auto encoder 를 사용했을때에 ad ctr예측에서 더 높은 성능을 보이는 것을 확인할 수 있다.</li>
<li>x 축 : 기준 ctr, y축 : roc auc score
<img src="https://images.velog.io/images/stella_y/post/50f9a4eb-281c-4132-8fea-18357a2f0e51/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Multi lang bert emb의 auto encoder 압축 실험]]></title>
            <link>https://velog.io/@stella_y/Multi-lang-bert-emb%EC%9D%98-auto-encoder-%EC%95%95%EC%B6%95-%EC%8B%A4%ED%97%98</link>
            <guid>https://velog.io/@stella_y/Multi-lang-bert-emb%EC%9D%98-auto-encoder-%EC%95%95%EC%B6%95-%EC%8B%A4%ED%97%98</guid>
            <pubDate>Fri, 14 Jan 2022 18:24:25 GMT</pubDate>
            <description><![CDATA[<h1 id="요약">요약</h1>
<ul>
<li>Multi-lingual bert 의 차원을 축소시킬 방법으로 auto encoder 를 사용할 수 있을지(loss 값이 줄어드는 등 학습이 잘 진행되는지), 적절한 layer 갯수와, layer dimension은 무엇일지 확인한다.</li>
<li>실험결과, <strong>auto encoder 로 dimension reduction을 하는 것이 유효함</strong>을 알 수 있고(loss 값이 줄어드는 등 학습이 잘 진행됨을 알 수 있었음), <strong>layer 는 4단</strong>, 이때 dense layer 의 dimension 구성은 input layer 부터 bottle neck까지 균일하게 줄일 때보다, <strong>bottle neck 과 유사한 dimension의 layer 이 더 많을때에 더 높은 성능</strong>을 보임을 알 수 있었다.<ul>
<li>실험결과, 적절한 데이터의 양을 100만 row, epoch 10회 이하라고 가정한다면 layer 4단까지가 적절한 것으로 보인다.</li>
<li>encoder 의 layer dimension을 input layer 부터 bottle neck까지 균일하게 줄일 때보다, bottle neck 과 유사한 dimension의 layer 를 더 많이 쌓을때에 loss 값이 더 낮음을 확인할 수 있다.</li>
</ul>
</li>
</ul>
<h1 id="실험-목표">실험 목표</h1>
<ul>
<li>Multi-lingual bert 의 차원을 축소시킬 알고리즘으로 auto encoder 를 사용할 수 있을지(loss 값이 줄어드는 등 학습이 잘 진행되는지), 적절한 layer 갯수와, layer dimension은 무엇일지 확인한다.</li>
</ul>
<h1 id="auto-encoder-란">Auto encoder 란?</h1>
<ul>
<li>input vector 를 encoder layer 를 거쳐서 bottle neck layer 의 dimension 만큼 줄였다가, 다시 decoder layer 를 통해 output 을 input 의 크기만큼 확장한다.
<img src="https://images.velog.io/images/stella_y/post/93412672-d084-4cf3-a26f-69f714f3ee11/image.png" alt=""></li>
<li>output 을 input 과 최대한 가까운 값을 낼 수 있도록 학습하는 과정을 통해서, encoder layer 를 활용한 차원 축소와 decoder layer 를 통한 데이터 복원을 가능하게 한다.</li>
<li>우리는 이 중 encoder를 사용하여, bert 의 차원 축소에 활용할 수 있을지 그 가능성을 보고자 한다.</li>
</ul>
<h1 id="실험-방법">실험 방법</h1>
<ul>
<li>input 과 auto encoder 를 통과한(차원을 축소 한 후 다시 복원한) 결과의 차이를 mse loss 로 계산한다.</li>
<li>auto encoder 의 encoder layer 수와 layer내부의 차원을 바꿔가면서 loss 값을 비교하여 더 적절한 Layer 구성을 알아낸다.</li>
<li>단, 이때 decoder 성능에 의한 loss 값 차이를 막기 위해 decoder부분의 layer 는 1단으로 모든 실험에서 동일하게 유지한다. (우리의 목표는 차원축소를 잘 하는 것 이므로)</li>
<li>activation function과 optimizer, learning rate 는 실험 대상이 되는 autoencoder 중 가장 작은 것에 일단 최적화 시킨 후 나머지 모델에도 동일하게 적용하여 학습한다.</li>
</ul>
<h2 id="데이터">데이터</h2>
<ul>
<li>크롤링한 뉴스기사 제목, 내용 데이터(약 100만건) 활용하여 autoencoder 학습
(2021-10-29 01시 ~ 2021-10-31 04시)</li>
<li>100만 개 데이터에서 10%를 test, 90%를 train 에 활용하여 loss 값을 비교한다.</li>
</ul>
<h1 id="실험-결과">실험 결과</h1>
<h2 id="encoder-layer-갯수에-따른-test-set-loss값-비교">encoder layer 갯수에 따른 test set loss값 비교</h2>
<h3 id="input-에서-bottle-neck-까지-layer-크기를-균일하게-감소시키기">input 에서 bottle neck 까지 layer 크기를 균일하게 감소시키기</h3>
<p><img src="https://images.velog.io/images/stella_y/post/8ad15a0f-7f1c-45c0-859f-b36e4a0032cc/image.png" alt=""></p>
<ul>
<li>epoch 을 10회까지 증가시키면 2단, 3단까지 쌓은 layer 에서는 오히려 epoch 5회일때보다 loss 값이 증가한다.</li>
<li>epoch 상관없이 layer 갯수당 최소 loss 값 : 3단 &gt; 2단 &gt; 5단 &gt; 4단</li>
<li>encoder 에 layer 를 추가하면 capacity 는 커지는 반면 tuning 이 필요한 parameter 는 증가한다. 2단에서 3단으로 갈 때, 4단에서 5단으로 갈 때에는 이런 이유로 오히려 loss 값이 증가하는것으로 볼 수 있다. (epoch 을 이 이상으로 증가시킨다면 5단에서 더 성능이 좋을지도)</li>
<li><strong>epoch 을 증가시킬수록, 데이터를 증가시킬수록, 더 많은 layer 를 쌓았을때에 좋은 성능을 보여줄수도 있지만, 그 만큼 학습에 들어가는 비용이 커진다.</strong></li>
<li><strong>적절한 데이터의 양을 100만 row, epoch수를 10회 이하라고 가정한다면 layer 4단까지가 적절할 것이라 생각된다.</strong></li>
</ul>
<h2 id="4단-auto-encoder에서-layer-구성에-따른-loss-값-비교">4단 auto encoder에서 layer 구성에 따른 loss 값 비교</h2>
<p><img src="https://images.velog.io/images/stella_y/post/4ddbd14c-a043-4ea8-b8bb-cac9d322b59c/image.png" alt=""></p>
<ul>
<li>이전 실험을 진행하면서, layer 쌓는 방식을 다양하게 시도해봤는데, bottle neck layer 주변에 layer 를 더 많이 쌓았을 경우에 loss 값이 더 많이 감소하는 것 같은 모습이 관찰됐다. 이와 같은 관찰에 대해 정량적으로 확인하기 위해 실험을 진행했다.</li>
<li>위의 그림과 같이 layer 의 dimension을 bottle neck 까지 균일하게 감소시켰을때와, bottle neck 부분에 더 많이 쌓았을 때 각각에 대해 학습시키고 loss 값을 비교했다
<img src="https://images.velog.io/images/stella_y/post/0bbe3030-b29f-4dbf-90ca-e2dede22cf76/image.png" alt=""></li>
<li><strong>위의 표를 보면 bottle neck 주변으로 layer 를 모았을때에 loss 값이 점점 더 낮아지고 있음을 확인할 수 있다.</strong></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TFX(Tensorflow Extended)란 무엇이고, 어떻게 구성되어있는가]]></title>
            <link>https://velog.io/@stella_y/TFXTensorflow-Extended%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%96%B4%EB%96%BB%EA%B2%8C-%EA%B5%AC%EC%84%B1%EB%90%98%EC%96%B4%EC%9E%88%EB%8A%94%EA%B0%80</link>
            <guid>https://velog.io/@stella_y/TFXTensorflow-Extended%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%96%B4%EB%96%BB%EA%B2%8C-%EA%B5%AC%EC%84%B1%EB%90%98%EC%96%B4%EC%9E%88%EB%8A%94%EA%B0%80</guid>
            <pubDate>Thu, 06 Jan 2022 13:35:04 GMT</pubDate>
            <description><![CDATA[<h2 id="요약">요약</h2>
<ul>
<li>TFX 가 뭐고, 어떤 구성요소, 라이브러리를 포함하는지 확인한다. 또한 우리 시스템에 적용이 가능한 부분이 있는지 확인한다.</li>
<li>특히 TFX라이브러리 중 TFT(TensorFlow Transform)부분만 독립형 라이브러리로 사용해본 바 있는데, 아래 네개 구성요소에 대해서 활용해도 좋을 것 같다는 생각이 든다.<ul>
<li>StatisticsGen : 인풋데이터의 통계를 계산 → 지금은 feature null ratio 계산하는 부분 다른 잡으로 두고 있는데 이걸 대체 시켜도 될 듯</li>
<li>ExampleValidator : 인풋 데이터에서 이상치 및 누락된 값 찾기 → 지금은 없음</li>
<li>Tuner : 모델 hyperparameter 조정 → 지금은 hyper parameter tuning 전혀 안하고 있는데 이거 정기적으로 하도록 수정이 가능하다</li>
<li>Evaluator : 학습 결과를 분석(auc등 도출)해서 이전 모델과 비교하여 현재 모델이 프로덕션에 푸시할 수 있을 정도로 &#39;좋은&#39; 상태인지 확인 → 지금은 검증 없이 그냥 올리고, 문제 있을 경우에만 확인해서 후 조치.</li>
</ul>
</li>
</ul>
<h2 id="무엇">무엇?</h2>
<ul>
<li><p>Google 에서 제공하는 MLOps 플랫폼 자체</p>
<ul>
<li><img src="https://images.velog.io/images/stella_y/post/b8e26d65-8736-48af-a8c1-b25b7446c4d2/image.png" alt=""></li>
</ul>
</li>
<li><p>TensorFlow를 기반 머신러닝 시스템을 정의, 시작, 모니터링하는 데 공통으로 필요한 구성요소, 라이브러리들을 통합적으로 제공한다</p>
</li>
<li><p>데이터 입력(csv, tfrecord 등등의 형태, 선행 플랫폼은 gcp) → kubeflow, airflow, beam 등으로 orchestrating → TFT(TensorFlow Transform)으로 feature화 및 전처리 → Tensorflow 로 학습해서 모델 내보내기(Pusher) → Tensorflow serving 으로 서빙 →  TFDV(TensorFlow DataValidation)등으로 모니터링</p>
</li>
</ul>
<h2 id="제공">제공</h2>
<p>구체적으로는 아래 세가지를 제공한다고 함</p>
<ol>
<li>ml pipeline과 build 를 위한 toolkit</li>
<li>표준 구성 요소</li>
<li>TFX 라이브러리</li>
</ol>
<h3 id="1-ml-pipeline과-build-를-위한-toolkit">1. ml pipeline과 build 를 위한 toolkit</h3>
<ul>
<li>tfx pipeline 쓰면 airflow, apach beam, kubeflow 등에서 ml 워크플로우 조정 가능</li>
<li>ml 의 주기적 학습과 데이터 적재를 위해서 에어플로우, 쿠베 플로우 등을 사용할 수 있을텐데, 이걸 tfx pipeline에 통합해서 사용이 가능한 듯</li>
</ul>
<h3 id="2-표준-구성-요소">2. 표준 구성 요소</h3>
<ul>
<li><p>파이프라인의 일부 혹은 모델 학습 스크립트에 일부로 사용될 수 있는 표준 구성요소의 집합</p>
</li>
<li><p>즉, ml pipeline을 구현하는 일련의 구성요소 자체들(모델링, 학습, 추론 제공 및 배포 관리가 포함됨)</p>
</li>
<li><p>여러가지가 있지만 이것들중 일부는 kubernetes에서만 지원한다거나 tfx 전체를 써야만 이용 가능하다거나 한 게 있어서 주의해야한다.
<img src="https://images.velog.io/images/stella_y/post/8eba88ba-0056-444b-a48f-439536a8d478/image.png" alt=""></p>
</li>
<li><p><strong><a href="https://www.tensorflow.org/tfx/guide/examplegen">ExampleGen</a> :</strong> 입력 데이터 세트를 수집하고 선택적으로 분할하는 파이프라인의 초기 입력 구성요소 (즉, 데이터 입력 부분)</p>
<ul>
<li>입력: CSV, <code>TFRecord</code> , Avro, Parquet 및 BigQuery와 같은 외부 데이터 소스의 데이터 / 출력: 페이로드 형식에 따라 <code>tf.Example</code> 레코드, <code>tf.SequenceExample</code> 레코드 또는 proto 형식</li>
<li>빅쿼리 쓰고 있다면 쿼리기반으로 바로 연결할 수도 있음 (이게 빅쿼리만 되는게 너무 아쉬움 ㅠ 회사에서 주로 아테나 쓰는데 이게 가능한거면 앞에 있는 데이터 밸런스 맞추는 전처리 spark 코드 다 드러낼 수 있을 것 ㅠ)</li>
<li>빅쿼리 안쓰고 있으면 파일을 읽어와서 쓰면 됨(<code>https://www.tensorflow.org/tfx/guide/examplegen#%ED%8C%8C%EC%9D%BC_%EA%B8%B0%EB%B0%98_examplegen</code>)</li>
<li>이 다음으로 statistics gen, schema gen, example validator, transform, trainer, tuner, evaluator 를 쭉 쓸 수 있음</li>
</ul>
</li>
<li><p><strong><a href="https://www.tensorflow.org/tfx/guide/statsgen">StatisticsGen</a> :</strong> 데이터 세트의 통계를 계산</p>
<ul>
<li>입력: ExampleGen 파이프라인 구성 요소로 만들어진 데이터세트 / 출력: 데이터세트 통계</li>
</ul>
</li>
<li><p><strong><a href="https://www.tensorflow.org/tfx/guide/schemagen">SchemaGen</a> :</strong> 통계를 검사하고 데이터 스키마를 생성</p>
<ul>
<li>examplegen 이랑 statistics gen 의 결과 받아서 스키마 생성한다.</li>
<li>(회사에서는 tfx 안쓰고 transform 만 썼는데, 그러다보니 여기서 생성해주는 schema 없어서 이런 경우에는 schema 정의를 수동으로 해주면 된다)</li>
</ul>
</li>
<li><p><strong><a href="https://www.tensorflow.org/tfx/guide/exampleval">ExampleValidator</a> :</strong> 데이터 세트에서 이상치 및 누락된 값을 찾는다.</p>
<ul>
<li>여기서 TFDV(TensorFlow Data Validation) 라이브러리 이용하는 것(<a href="https://www.tensorflow.org/tfx/guide/tfdv">https://www.tensorflow.org/tfx/guide/tfdv</a>)</li>
<li>스키마가 잘못들어온건 없는지, 학습 데이터가 imbalanced 돼있는지는 않은지를 체크해준다.</li>
</ul>
</li>
<li><p><strong><a href="https://www.tensorflow.org/tfx/guide/transform">Transform</a> :</strong> feature 추출</p>
<ul>
<li>입력: ExampleGen 구성 요소의 tf.Examples 및 SchemaGen 구성 요소의 데이터 스키마 / 출력: SavedModel을 Trainer 구성 요소로</li>
<li>들어온 데이터를 feature 화 하는것까지 담당하는걸 목표로 하는 듯</li>
<li>근데 사실 해주는게 embedding, scaling 등 같은 기본적인것들밖에 없고 이 안에 또다른 모델을 삽입하거나 하는게 없어서, 거기까지 기대하기는 쉽지 않음</li>
<li>이부분은 TFT(TensorFlow Transform) 라이브러리 쓰는건데, 이거는 TFX 전체를 쓰지 않더라도 따올 수 있는 부분이라 현재 우리 모델에서도 이용하고 있음</li>
<li>이게 있으면 scaling 등의 전처리를 모델 그래프에 포함시킬 수 있게 돼서 데이터 관리가 매우 쉬워짐<ul>
<li>이걸 안쓴다면 학습 데이터 앞에, 그리고 inference 하기 직전에 각각 따로 전처리 과정을 적용하게 된다. 즉 전처리 코드를 python구현, typescript 구현 두가지가 각각 존재하게 되어 그 관리가 매우 어려워짐.</li>
</ul>
</li>
</ul>
</li>
<li><p><strong><a href="https://www.tensorflow.org/tfx/guide/tuner">Tuner</a> :</strong> 모델 hyperparameter 조정</p>
<ul>
<li>올해(2021년) 9월까지만해도 이 내용 없었던 것 같은데 새로 생겼나보다!</li>
<li>모델 재학습할때마다 계속 조정하게 할 수도 있고, 이전에 조정했던 내용을 갖고 오게 할 수도 있다고 한다</li>
<li>지금은 keras 모델만 가능하다.</li>
<li>업무에 새로 적용하는거 생각해보자!</li>
</ul>
</li>
<li><p><strong><a href="https://www.tensorflow.org/tfx/guide/evaluator">Evaluator</a> :</strong> 학습 결과를 분석(auc등 도출)해서 이전 모델과 비교하여 현재 모델이내보낼 모델을 검증하여 프로덕션에 푸시할 수 있을 정도로 &#39;좋은&#39; 상태인지 확인</p>
<ul>
<li>검증이 활성화되면 Evaluator는 새 모델을 기준선(예: 현재 제공 중인 모델)과 비교하여 기준선에 비해 &quot;충분히 좋은지&quot; 확인. 이를 위해, 평가 데이터세트에서 두 모델을 모두 평가하고 메트릭(예: AUC, 손실)의 성능을 계산. 새 모델의 메트릭이 기준선 모델과 관련하여 개발자가 지정한 기준을 충족하면(예: AUC가 더 낮지 않음) 모델이 &quot;탄생&quot;(양호로 표시됨)하여 <a href="https://www.tensorflow.org/tfx/guide/pusher">Pusher</a>에 모델을 프로덕션 환경으로 푸시해도 괜찮음을 나타낸다.</li>
<li>TMA(TensorFlow Model Analysis) 라이브러리 이용하는 부분</li>
<li>이것도 독립형 라이브러리로 사용이 가능하다(tfx사용 안해도 쓸 수 있다.)</li>
<li>지원되는 모델 유형(tf2 keras 등)이 몇가지로 정해져있어서 주의해야한다</li>
</ul>
</li>
<li><p><strong><a href="https://www.tensorflow.org/tfx/guide/infra_validator">InfraValidator</a>:</strong> 모델이 인프라에서 실제로 제공 가능한지 확인, 잘못된 모델이 푸시되지 않도록 한다.</p>
<ul>
<li>앞에서의 Evaluator 가 모델의 성능을 보장한다면, InfraValidator는 모델이 기계적으로 정상인지 확인하고 잘못된 모델이 배포되는 것을 방지한다.</li>
</ul>
</li>
<li><p><strong><a href="https://www.tensorflow.org/tfx/guide/pusher">Pusher</a>:</strong> 인프라에 모델 배포</p>
<ul>
<li>위의 evaluator 랑 infra validator에서 검증이 만족되면, tensorflow serving 등에 배포한다.</li>
</ul>
</li>
</ul>
<h3 id="3-tfx-라이브러리">3. TFX 라이브러리</h3>
<ul>
<li><p>아래의 라이브러리들은 tfx구성을 다 쓰지 않더라도 독립형 라이브러리로 제공한다.</p>
</li>
<li><p><strong><a href="https://www.tensorflow.org/tfx/guide/tfdv">TensorFlow Data Validation(TFDV)</a>:</strong> 머신러닝 데이터를 분석하고 검증하기 위한 라이브러리.  확장성이 뛰어나고 TensorFlow 및 TFX와 원활하게 연동되도록 설계됐다.</p>
<ul>
<li>학습 및 테스트 데이터에 관한 요약 통계의 확장 가능한 계산</li>
<li>데이터 분포 및 통계를 위한 뷰어와의 통합 및 데이터세트 쌍(패싯)의 패싯 구조 비교</li>
<li>필수 값, 범위 및 어휘와 같은 데이터에 관한 기대치를 설명하는 자동화된 데이터 스키마 생성</li>
<li>스키마를 검사하는 데 도움이 되는 스키마 뷰어</li>
<li>누락된 특성, 범위를 벗어난 값 또는 잘못된 특성 유형 등과 같은 이상치를 식별하기 위한 이상 감지</li>
<li>이상치가 있는 특성을 확인하고 문제를 수정하기 위해 자세히 알아볼 수 있는 이상치 뷰어</li>
</ul>
</li>
<li><p><strong><a href="https://www.tensorflow.org/tfx/guide/tft">TensorFlow Transform(TFT)</a>:</strong> TensorFlow를 사용하여 데이터를 전처리하기 위한 라이브러리.</p>
<ul>
<li>평균 및 표준 편차로 입력 값을 정규화</li>
<li>모든 입력 값에 걸쳐 어휘를 생성하여 문자열을 정수로 변환</li>
<li>관찰된 데이터 분포를 기반으로 부동 소수점 수를 버킷에 할당하여 부동 소수점 수를 정수로 변환</li>
</ul>
</li>
<li><p><strong><a href="https://www.tensorflow.org/tfx/guide/train">TensorFlow</a>:</strong> TFX를 통한 모델 학습에 사용됩니다. 학습 데이터 및 모델링 코드를 수집하며 SavedModel 결과를 생성. 또한 입력 데이터 사전 처리를 위해 TensorFlow Transform에서 생성한 특성 추출 파이프라인을 통합한다.</p>
</li>
<li><p><strong><a href="https://www.tensorflow.org/tfx/guide/tfma">TensorFlow Model Analysis(TFMA)</a>:</strong> 모델을 평가하기 위한 라이브러리. TensorFlow와 함께 사용되어 EvalSavedModel을 생성하며, EvalSavedModel은 분석의 기초가 됩니다. TFMA를 통해 사용자는 트레이너에 정의된 것과 동일한 측정항목을 사용하여 분산된 방식으로 대량의 데이터에서 모델을 평가한다. 이러한 측정항목은 다양한 데이터 슬라이스에 걸쳐 계산되어 Jupyter 메모장에서 시각화될 수 있다.</p>
</li>
<li><p><strong><a href="https://github.com/tensorflow/metadata">TensorFlow Metadata(TFMD)</a>:</strong> TensorFlow를 사용하여 머신러닝 모델을 학습시킬 때 유용한 메타데이터의 표준 표현을 제공. 메타데이터는 입력 데이터 분석 중에 수동으로 또는 자동으로 생성될 수 있으며, 데이터 유효성 검사, 탐색 분석 및 변환에 사용된다. 메타데이터 직렬화 형식에는 아래 두가지가 포함된다.</p>
<ul>
<li>테이블 형식 데이터를 설명하는 스키마(예: tf.Examples)</li>
<li>이러한 데이터 세트에 걸친 요약 통계 컬렉션</li>
</ul>
</li>
<li><p><strong><a href="https://www.tensorflow.org/tfx/guide/mlmd">ML Metadata(MLMD)</a>:</strong> ML 개발자 및 데이터 과학자 워크플로와 관련된 메타데이터를 기록하고 검색하기 위한 라이브러리. 대체로 메타데이터는 위에서 말한 TFMD 표현을 사용한다.. MLMD는 <a href="https://www.sqlite.org/index.html">SQL-Lite</a>, <a href="https://www.mysql.com/">MySQL</a> 및 기타 유사한 데이터 저장소를 사용하여 지속성을 관리한다.</p>
<ul>
<li>validator 결과를 여기다가 쭉 저장해놨다가 나중에 검색해서 쓰는 용도</li>
<li>이것도 쓰면 좋을텐데, 시간이 될지 모르겠다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Blockchain] Bitcoin mining process]]></title>
            <link>https://velog.io/@stella_y/Blockchain-Bitcoin-mining-process1</link>
            <guid>https://velog.io/@stella_y/Blockchain-Bitcoin-mining-process1</guid>
            <pubDate>Tue, 21 Dec 2021 13:25:28 GMT</pubDate>
            <description><![CDATA[<h2 id="채굴의-의미">채굴의 의미</h2>
<ul>
<li>&quot;새로운 블록과 비트코인이 블록 체인 네트워크 상에 추가되는 과정&quot;</li>
<li>채굴자<ul>
<li>블록 생성 위해서 어려운 수학문제를 푸는데 필요한(해시값을 찾아내기 위한) 네트워크에 컴퓨팅 파워 제공(PoW:Proof of Work)하고 보상(bitcoin 등)을 제공받는다. 이때 블록 생성 권한을 얻기 위해 각 노드들은 문제를 푸는데 있어서 속도 경쟁을 해야한다.</li>
<li>채굴자는 네트워크상에서 발생하는 새로운 거래들을 승인(검증)한 후, 전 세계의 노드들이 가진 장부에 해당 거래들을 기록한다.</li>
<li>새 블록에는 지난 블록 이후에 발생한 거래들이 포함되며, 블록의 일부가 되어 블록체인에 추가된 거래는 승인되었다고 간주된다.</li>
</ul>
</li>
<li>채굴 보상<ol>
<li>새 블록으로부터 새로운 코인을 생성, 채굴자가 이를 소유할 수 있게 된다.</li>
<li>해당 블록 내에 들어있는 거래들에 대한 수수료를 받는다.</li>
</ol>
</li>
</ul>
<h2 id="새-블록을-수신했다는-것이-다른-채굴-노드들에게-주는-의미">새 블록을 수신했다는 것이 다른 채굴 노드들에게 주는 의미</h2>
<ul>
<li>채굴자는 새 블록을 생성하기 위해서 다른 채굴 노드들과 경쟁을 하게 되는데, 채굴 도중에 새로운 블록이 전파된다면, 노드 사이의 경쟁이 실질적으로 종료되었다고 볼 수 있다.</li>
<li>즉, 새로운 블록을 수신한다는 것은, 해당 경쟁에서 다른 누군가가 이미 승리하고 본인이 패배했다는걸 뜻한다.</li>
<li>또한 이 경쟁의 종료는 다음 블록을 위한 새로운 경쟁이 시작됐음을 뜻한다.</li>
</ul>
<h2 id="채굴노드">채굴노드</h2>
<ul>
<li>비트코인 네트워크상에는 여러 종류의 노드들이 존재하는데, 이 중 몇몇 노드는 채굴자(miner)라고 부르는 특수 노드들이다.</li>
<li>채굴 노드는, 즉 마이너는 비트코인 상에 있는 미승인 거래를 전송받아서 다른 노드들에게 전파하며, 또한 미승인 거래들을 새로운 블록에 추가하는 역할(채굴)을 한다.</li>
</ul>
<h2 id="마이닝-풀">마이닝 풀</h2>
<p><img src="https://images.velog.io/images/stella_y/post/a9d77602-e7a5-4037-aee0-eb5de4cf0103/image.png" alt=""></p>
<ul>
<li>비트코인 개발 초기에는 개인들이 자신의 pc를 이용해 채굴에 참여했지만, 시간이 지날수록 경쟁하는 노드들이 많아지고, 채굴 난이도가 높아져서, 채굴이 어려워졌다. 채굴자들은 혼자 채굴하기보다는, 여러 사람들 개개인의 컴퓨팅 파워를 모아 함께 채굴하여 채굴 확률을 높이기 시작했는데, 이게 <strong>&#39;mining pool&#39;</strong>이다.</li>
<li>혼자 마이닝을 한다고 했을 때 보상을 모두 독차지하는 반면 채굴 확률이 매우 떨어진다. 그러나 마이닝 풀에 참여하여 함께 채굴하면 수익을 셰어해야하지만, 채굴 확률이 높아지므로 적은 금액이라도  꾸준히 수익을 얻을 수 있다.</li>
<li>현재 다양한 마이닝 풀이 존재하며, 각 마이닝 풀마다 보상금을 분배하는 다양한 방식이 존재하는데, 대부분의 경우 마이너가 PoW (Proof of Work) 방식을 통하여 풀에 얼마나 기여했는지에 따라 지분의 크기가 결정된다.</li>
<li>마이닝 풀을 이용한 채굴 과정<ul>
<li>마이닝 풀별로 보상금을 분배하는 기준이 다르기 때문에 자신의 컴퓨터 사양 등을 고려하여, 자신에게 유리한 풀을 선택해야 이익을 극대화한다. 참여하고 싶은 풀을 찾았다면 해당 풀의 웹사이트에 계정을 만들고 채굴을 시작할 수 있다.</li>
</ul>
</li>
</ul>
<h2 id="마이닝-전체적-과정">마이닝 전체적 과정</h2>
<p><img src="https://images.velog.io/images/stella_y/post/b0c1cf1c-a597-49fa-9d7d-36401ce227b3/image.png" alt=""></p>
<ul>
<li>위 그림에서 노드들은 비트코인 네트워크에서 모두 full node이고, 특히 노란색은 miner라고 가정해보자<h3 id="트랜젝션-수신">트랜젝션 수신</h3>
<ol>
<li>몇몇 노드(full node 일수도 wallet 과 같은 light node일수도)들이 거래를 생성하면, 해당 노드는 자신과 연결된 peer node 들에게 생성한 transaction 을 broadcasting 한다.</li>
<li>miner 가 이 전파된 transaction 을 받으면, 이 transaction 이 유효한지 검증한다.
<img src="https://images.velog.io/images/stella_y/post/6b485555-78bd-4a06-afe7-24d376e5e4d9/image.png" alt=""></li>
</ol>
</li>
<li>(트랜잭션의 syntax와 structure가 올바른지, input으로 사용된 UTXO가 mempool이나 블록체인 안에 이미 포함된 것인지 등을 검사)<ol start="3">
<li>유효한 transaction 으로 판단되면 transaction 을 memory pool(=transaction pool)에 추가하고, 자신과 연결된 peer node들에게 전파시킨다.
3-1. 유효하지 않다면 이 트랜젝션 버린다.</li>
</ol>
</li>
</ul>
<h3 id="마이닝">마이닝</h3>
<ul>
<li>마이너들은 쉬지않고 마이닝을 한다. 마이닝 도중에도 transaction 을 수신, transaction 을 검증, memory pool 에 채우기를 반복한다.<ul>
<li>마이너가 마이닝을 중단했다는 것은 알맞은 nonce 값을 찾았거나 다른 마이너가 생성한 새로운 블록을 수신했다는 것을 의미한다.</li>
</ul>
</li>
</ul>
<ol>
<li>nonce 값을 찾은 경우<ul>
<li><strong>새로운 블록을 만든 후</strong>, 브로드캐스팅을 하며, 바로 그 블록의 블록헤더 해시를 PreviousBlockHash 에 넣고, 새로운 블록 바디를 구성하여 마이닝을 다시 시작합니다.</li>
</ul>
</li>
<li>다른 마이너가 생성한 블록을 받았을 경우(경쟁에서 진 것)<ul>
<li>그 블록의 유효성을 검증하고, 유효하다면, 수신한 블록의 블록헤더 해시를 PreviousBlockHash에 넣고, 새로운 블록 바디를 구성하여 마이닝을 다시 시작한다.</li>
</ul>
</li>
</ol>
<h4 id="새로운-블록-바디-만드는-과정">새로운 블록 바디 만드는 과정</h4>
<p><img src="https://images.velog.io/images/stella_y/post/28bfa901-fa5a-4a3b-af72-ac36063fe79b/image.png" alt=""></p>
<ul>
<li><ol>
<li>마이너에게 보내는 코인베이스(블록체인 생성한 자에게 코인을 주는 거래) 트랜잭션을 추가한 후, memory pool에 있는 트랜잭션 중 우선순위가 높은 트랜잭션을 우선적으로 블록 바디에 추가(마이너 자신의 memory pool에 있는 트랜잭션 중에서 새로 생성된 블록에 포함될 트랜잭션들을 제거)</li>
</ol>
</li>
<li><ol start="2">
<li>이 블록 바디에 있는 트랜잭션들을 이용해서 머클루트를 계산하고, 이것을 블록헤더의 머클루트값으로 사용한다.</li>
</ol>
</li>
<li><ol start="3">
<li>1,2의 과정으로 후보블록 구성을 완료하고 나면 마이닝 과정을 시작한다.</li>
</ol>
</li>
<li><ol start="4">
<li><strong>마이닝</strong>
<img src="https://images.velog.io/images/stella_y/post/d6371680-578f-4fd1-8717-703c49fcf125/image.png" alt=""></li>
</ol>
<ul>
<li>위에서 구성한 블록 헤더 전체와 nonce 값을 포함한 값의 hash 값이 bitcoin network 상의 difficult target 값과 비교해서 이 값보다 작거나 같아야 블록 체인 네트워크에 포함시킬 수 있다.</li>
<li>nonce 값은 후보 블록에서 유일하게 변경되는 값이기때문에, 이 값을 0부터 시작해서 1씩 증가시켜보면서 전체의 해시값이 적절한지를 비교하게되는데, 이 과정을 마이닝이라고 부르게 된다.</li>
<li>nonce 값을 증가시켜 가며 해시값을 계산하는 것을 반복하는 과정은 많은 컴퓨팅 파워를 필요로 하게 되는데, 이렇게 자신의 컴퓨팅 파워를 소모하는 작업을 증명하는 것이 mining의 핵심인 PoW이다.</li>
</ul>
</li>
<li><ol start="5">
<li>알맞은 nonce 값을 찾고 나면 성공한 블록을 주변 peer 노드들에게 전파한다.</li>
</ol>
</li>
<li><ol start="6">
<li>새로 생성된 블록을 전달받은 노드들은 블록의 유효성을 검증하고, 블록 유효성 검사를 제대로 통과하면, 각 노드는 자신이 보유하고 있는 local blockchain에 해당 블록을 연결한다.</li>
</ol>
</li>
</ul>
<h4 id="여러-마이너가-동시에-블록을-생성한-경우">여러 마이너가 동시에 블록을 생성한 경우</h4>
<ul>
<li>위의 블록 바디를 만드는 과정은 하나의 마이너만 하는게 아니기 때문에, 여러 마이너가 동시에 블록을 생성한 경우가 발생할 수 있다. 이때 p2p 네트워크에서 지연 등의 이유로 각 노드는 다른 local blockchain을 보유하게 된다.
<img src="https://images.velog.io/images/stella_y/post/54381396-507d-4b48-b8eb-189ef6fa2c64/image.png" alt=""></li>
<li>위의 그림에서 3번 노드는 2번 마이너로부터 생성된 블록을 더 빨리 전달받아서 자신의 local blockchain에 연결했고, 그 이후 5번 마이너로부터 생성된 블록을 전달받아서 이를 고아 블록으로 처리한다.(상황 종료)
<img src="https://images.velog.io/images/stella_y/post/4015f5c6-d9d1-4d10-8a51-aad327748f72/image.png" alt=""></li>
<li>우선 두 마이너가 동시에 블록 생성에 성공했을 때, 블록의 전파지연으로 블록의 분기(fork)가 발생할 수도 있다. 위의 그림에서처럼 블록체인이 분기된 경우 비트코인에서는 가장 긴 체인을 메인체인으로 정하게 된다. 그림에서는 블록이 하나 더 연결되어 있는 검은색 선의 체인이 메인 체인이 될 것이다.</li>
<li>그러면 어떻게 해서 검은색 선의 체인에 블록이 하나 더 연결된 것일까?<ul>
<li>왼쪽 그림을 보면 3개의 node가 하늘색 블록을 연결했고, 2개의 node가 파란색 블록을 연결했다.</li>
<li>이 비트코인 네트워크는 축소된 것이라 마이너가 둘밖에 없지만, 사실은 수많은 마이너 들이 비트코인 네트워크에 분포되어 있다. 이런 상황이라면, <strong>상대적으로 해시 파워가 큰 마이너들이 previous 블록으로 연결한 하늘색 블록 뒤에 새로운 블록을 연결할 것이다</strong>. 즉, 결국 하나의 메인체인으로 수렴하게 될 것이다.</li>
</ul>
</li>
</ul>
<h2 id="reference">Reference</h2>
<ul>
<li>kmooc 블록체인 이론 및 응용 강의 : <a href="http://www.kmooc.kr">http://www.kmooc.kr</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Blockchain]Bitcoin mining step by step]]></title>
            <link>https://velog.io/@stella_y/BlockchainBitcoin-mining-step-by-step</link>
            <guid>https://velog.io/@stella_y/BlockchainBitcoin-mining-step-by-step</guid>
            <pubDate>Tue, 21 Dec 2021 10:37:59 GMT</pubDate>
            <description><![CDATA[<h2 id="detailed-mining-process">Detailed mining process</h2>
<ul>
<li>비트코인의 분산화된 합의는 네트워크상의 노드들 사이에서 독립적으로 일어나는 아래의 프로세스에 따라 이루어진다.<ol>
<li>모든 full node 가 각 거래에 대해 독립적으로 검증</li>
<li>작업 증명(PoW) 알고리즘을 이용하여, 마이너들은 검증된 거래들을 새로운 블록에 추가한다.</li>
<li>모든 노드들이 새 블록을 검증한 후 블록체인에 연결한다.</li>
<li>모든 노드가 작업증명을 통해 연결한 체인들 중 가장 긴 체인을 선택한다.</li>
</ol>
</li>
<li>위 네 과정을 자세히 보고, 이 과정들이 어떻게 서로 상호작용하는지 확인하자</li>
</ul>
<h2 id="1-각-거래의-검증">1. 각 거래의 검증</h2>
<ul>
<li>자세한 검증 과정은 (<a href="https://en.bitcoin.it/wiki/Protocol_rules)%EC%97%AC%EA%B8%B0%EC%97%90%EC%84%9C">https://en.bitcoin.it/wiki/Protocol_rules)여기에서</a> 확인할 수 있다. 아래는 이중 몇가지를 가져온 내용이다.<ul>
<li><ol>
<li>트랜잭션의 구문과 데이터 구조가 정확한지 확인</li>
</ol>
</li>
<li><ol start="2">
<li>코인 베이스 거래는 전송할 수 없음. 새로운 블록이 생성될 때 보상으로 제공되는 코인 베이스의 경우, 일반적인 거래처럼 다른 노드에게 전송할 수 없다.</li>
</ol>
</li>
<li><ol start="3">
<li>각각의 입력값에 대해, 참조 출력값이 풀 내의 어떠한 거래 내부에 이미 존재한다면 해당 거래는 거부되어야 한다.</li>
</ol>
</li>
<li><ol start="4">
<li>짝을 이루는 거래가 풀에 존재하지 않는 경우 고아 거래 풀에 추가된다.</li>
</ol>
</li>
<li><ol start="5">
<li>각각의 입력값에 대해 참조 출력값은 존재해야 하며, 해당 UTXO가 이미 소비된 상태가 아니어야 한다.</li>
</ol>
</li>
<li><ol start="6">
<li>입력값 금액이 출력값 총액보다 작은 경우 해당 거래를 거절해야 한다.
입력값이 출력값보다 작을 수 없다.</li>
</ol>
</li>
<li><ol start="7">
<li>새로운 블록에 포함되기에 거래 수수료가 너무 작은 경우, 해당 거래를 거절할 수 있다.</li>
</ol>
</li>
</ul>
</li>
</ul>
<h2 id="2-블록에-추가">2. 블록에 추가</h2>
<ul>
<li>비트코인 네트워크에 있는 노드들은 peer 로부터 전달받아, 스스로 검증한 transaction 들을 Memory pool(=transaction pool)에 추가한다. 각 transaction 들은 블록에 포함되기 전까지 Memory pool에서 대기하게 된다.</li>
<li>간단히 예시로 transaction 이 block 에 추가되는 과정을 보자.
<img src="https://images.velog.io/images/stella_y/post/321b7955-523e-41ec-9c2f-dd1c19d69402/image.png" alt=""></li>
<li>위와 같은 block 과 memory pool 이 있을때에 앨리스라는 사람이 비트코인을 이용해 커피 한 잔을 사려고 한다고 가정해보자.
<img src="https://images.velog.io/images/stella_y/post/79d0996a-7cc6-4870-985e-cce0a49a487c/image.png" alt=""></li>
<li>앨리스가 커피를 구매할 때쯤, 비트코인 네트워크상에 277314번까지의 블록이 생성되어 있는 상태이다. 이때, 채굴 노드는 다른 노드들처럼 앨리스의 커피 구매라는 transaction을 수집하고 검증하며, 다른 노드들에게 전파하려 할 것이다.
<img src="https://images.velog.io/images/stella_y/post/b32cb33e-1527-4179-8924-a2266e5ced6e/image.png" alt=""></li>
<li>노드가 채굴하는 동안 비트코인 네트워크를 통해 277315번째 블록을 전달받을 수 있는데, 이렇게 새로운 블록이 도착했다는 것은 277315번 블록에 대한 경쟁이 끝나고, 다음 번 블록, 277316번 블록을 생성하기 위한 경쟁이 시작된다는 것을 의미한다. 이전 10분 동안 노드는 277315번 블록을 위한 문제를 푸는 동시에, 다음 번 블록에 대비하여 거래들을 수집하고 있었을 것이다.</li>
<li>메모리 풀에는 이렇게 수집된 수백 개의 거래가 있다고 가정해보자. 277315번 블록이 도착해서 검증되자마자, 노드는 메모리 풀 내에 있는 거래들 중 277315번 블록에 포함된 거래들을 모두 삭제한다. 이후 남아있는 거래들은 모두 미승인 상태이며, 새로운 블록에 기록되기 위해 대기 중이다.
<img src="https://images.velog.io/images/stella_y/post/9cbfcc61-8f43-4d28-b48b-e941b7f6e1b2/image.png" alt=""></li>
<li>이 미승인 거래들을 기록 하기 위해, 노드는 즉시 비어 있는 블록을 새로 만들며, 이 블록이 277316번째 블록이 될 수 있는 후보가 된다. 이 블록은 아직 증명되지 않아, 유효한 블록이 아니기 때문에 후보 블록이라고 칭하며, 뒤에 설명할 작업증명(PoW) 알고리즘에 대한 솔루션을 찾은 경우에만 유효화된다.
<img src="https://images.velog.io/images/stella_y/post/41c0e2d7-2bd9-43d1-b5a4-a5024b0df7a3/image.png" alt=""></li>
<li>따라서 앨리스가 커피를 구입한 것에 대한 거래가 포함된 후보 블록이, 채굴 노드에 의해 채굴되면 비로소 277316번째 블록에 앨리스의 거래가 추가된다.</li>
</ul>
<h3 id="pow">PoW</h3>
<p><img src="https://images.velog.io/images/stella_y/post/f9131014-93f5-49b0-b2bb-059133b0ba8f/image.png" alt=""></p>
<ul>
<li>새로운 블록을 블록체인에 추가하기 위해서는 블록 헤더의 해시를 계산해야 한다. 이 블록 해시값이 블록 내에서 설정한 숫자, 즉 난이도보다 작다면 문제의 해답을 찾은 것이다.</li>
<li>해시값은 원본 데이터에 따라 결과값이 달라지게 되는데, 블록 헤더의 필드들 중 nonce를 제외한 나머지 필드는 그 값이 고정되어 있다. 따라서 PoW 알고리즘에서는, 특정 범위에 포함되는 출력값을 얻기 위해, 적절한 nonce 값을 찾는 것이 목표다. 즉, <strong>nonce 값은 이 nonce 값을 입력값 중 하나로 취하여 계산되는 블록 해시값이 _특정 숫자_보다 작아지게 하는 값</strong>을 말한다.
<img src="https://images.velog.io/images/stella_y/post/15c3f593-4fab-4b5c-b3e7-5ba1c8dbc96a/image.png" alt=""></li>
<li>해시 함수의 특성에 따라 역방향 계산이 어렵기 때문에 특정 결과에 도달할 때까지 nonce 값을 무작위로 바꿔가며 값을 찾아야 한다.</li>
<li>이러한 연산은 어렵고 복잡한 연산은 아니지만, 특정 nonce 값을 찾기 위해 기하학적인 횟수의 연산을 실행해야 한다.</li>
</ul>
<h4 id="difficulty-bit-난이도-bit">Difficulty bit (난이도 bit)</h4>
<ul>
<li>위에서 블록 해시값이 특정 숫자보다 작아지게 하는 값을 찾는 과정이 nonce 값을 찾는 마이닝 과정이라고 했는데, 이 특정 숫자는 어떻게 정해지는지 알아보자</li>
<li>이 특정 숫자는 난이도 값이라고 불리는데, 블록 헤더 내의 ‘난이도 비트’ 정보에 따라 결정된다.
<img src="https://images.velog.io/images/stella_y/post/facd3ea8-095c-40ff-9748-9e8dfee4e3f0/image.png" alt=""></li>
<li>해당 필드는 얼마나 많은 리딩 비트가 0이어야 하는지 나타내는 단위로, 목표값의 0의 개수가 많을수록 난이도가 더 어려워진다. 리딩 0의 숫자를 1비트씩 증가시킬 때마다, 가능한 검색 공간의 크기가 절반으로 줄어들기 때문이다. 이는, 한정된 범위를 만족하는 특정 값을 도출해내는 것이 더 어려워짐을 의미한다.</li>
<li>0의 개수가 많아질수록 허용 가능한 범위가 더 작아진다. 따라서 1비트씩 난이도가 상승할 때마다, 솔루션을 찾는 데 걸리는 시간이 기하급수적으로 증가한다.</li>
</ul>
<h4 id="difficulty-bit-의-조절">Difficulty bit 의 조절</h4>
<ul>
<li>위에서 말한 난이도는 어떻게, 누가 조정하게 되는지 알아보자.</li>
<li>비트코인 네트워크상에서 블록은 10분에 하나씩 블록이 생성되는것을 목표로 하며, 이 생성 주기를 바탕으로 통화 발행 빈도와 거래 정상 속도가 결정된다. 블록의 생성 시간을 10분으로 유지하기 위해서, 채굴의 난이도는 컴퓨터 능력의 증가 속도와 채굴에 참여하는 컴퓨터의 수에 따라 조정하게 된다.</li>
<li><strong>난이도 재설정은 풀 노드 전부에서 독립적으로 실행</strong>한다.</li>
<li>2,016 개의 블록이 네트워크상에 추가될 때마다 노드들은 난이도 목표값을 재설정한다. 난이도 재설정 동작은 다음과 같은 방정식으로 요약할 수 있다.
<img src="https://images.velog.io/images/stella_y/post/29cb7b01-5e02-4720-a42f-c2f84f656086/image.png" alt="">
<img src="https://images.velog.io/images/stella_y/post/e00c1f45-652c-429c-892e-586bbc89115c/image.png" alt=""></li>
<li>2,016개의 블록이 생성되는데 소요되는 시간이, 평균 시간인 20,160분보다 오래 걸린다면, 채굴 난이도를 낮추고, 적게 걸린다면 채굴 난이도룰 높이는데, 이 난이도 조정에 따라 블록이 생성되는 주기를 10분으로 유지한다. 이 난이도는 노드 별로 다른 값을 가지는 것이 아니라, 블록체인 전체에 걸쳐 일률적으로 적용되는 수치이다.</li>
</ul>
<h3 id="후보-블록은-어떤-transaction들로-채워지는가">후보 블록은 어떤 transaction들로 채워지는가</h3>
<ul>
<li>블록 내부의 첫 50KB는 우선순위가 높은 거래들에게 할당되고, 블록의 최대 크기 이내의 나머지 공간들은 최고 수수료를 가진 거래부터 우선적으로 선택되게 된다.
<img src="https://images.velog.io/images/stella_y/post/dc51ba9a-551d-44e5-a4f4-75fcb2611a41/image.png" alt=""></li>
<li>우선순위
<img src="https://images.velog.io/images/stella_y/post/0bfc4f9a-b977-4873-9b82-bb2b35988a92/image.png" alt=""><ul>
<li>Transaction 의 우선순위는 소비될 UTXO의 나이를 근거로 정해진다.</li>
<li>UTXO의 나이는 블록체인에 기록된 이후 지난 시간과 같다. 해당 UTXO가 블록체인상에 얼마나 깊이 파묻혀 있는지를 나타낸다. 나이가 많고 큰 입력값을 가진 UTXO가 나이가 어리고 작은 입력값을 가진 UTXO에 비해 높은 우선순위를 가진다.</li>
<li>트랜잭션의 우선순위는 입력값의 가치와 나이의 총합을 거래의 크기로 나누어 계산한다.</li>
<li>위에서 언급했듯 블록 내부의 첫 50KB는 우선순위가 높은 거래들에게 할당되어 있기때문에, 수수료 없이도 처리될 수 있다. 그러나 자신이 생성한 거래가 블록에 빨리 포함되길 원하는 경우, 수수료를 높임으로써 시간을 줄일 수도 있다.(나이가 많지 않아도 블록에 포함될 기회를 얻을 수 있기 때문)</li>
</ul>
</li>
</ul>
<h3 id="블록-생성-보상">블록 생성 보상</h3>
<ul>
<li>블록 생성에 대한 보상은 (코인베이스) + (블록에 적힌 transaction 들의 거래수수료)이다.</li>
<li>코인베이스<ul>
<li>이전 글에서, 채굴에 대한 댓가로 비트코인과 거래수수료를 얻을 수 있다고 했었는데, 이때의 블록 생성으로 얻는 코인 보상을 <strong>코인베이스</strong>(블록을 생성하면서 새롭게 생성된 코인을 의미)라고 부른다.</li>
<li>블록에 첫 번째로 추가되는 거래는 특수 형태의 거래로, 생성 거래(transaction) 혹은 코인베이스 거래 라고 부른다.</li>
<li>코인 베이스 보상금은 네트워크의 반감 횟수에 따라 결정된다. 최초의 비트코인 코인베이스는 50비트코인이었다. 210,000개의 블록마다 반감기가 한 번 발생하기 때문에, 현재 블록의 높이를 반감기 간격으로 나눔으로써 반감 횟수를 결정할 수 있다. 반감 횟수만큼 보상금이 절반씩 감소한다.</li>
</ul>
</li>
<li>거래 수수료<ul>
<li>거래 수수료의 총액은 거래의 입출력 값을 각각 더한 후, 두 값을 빼서 계산할 수 있다.</li>
</ul>
</li>
</ul>
<h2 id="3-블록의-유효성-검증">3. 블록의 유효성 검증</h2>
<ul>
<li>아래 항목들을 충족하지 못할 경우 해당 블록들은 유효성 검증을 통과하지 못한다.<ul>
<li>해당 블록의 데이터 구조는 문법적으로 유효해야 한다.</li>
<li>PoW의 원리에 따라, 블록 헤더의 해시값은 사전에 정의된 목표 난이도보다 작아야 한다.</li>
<li>해당 블록의 타임 스탬프는 향후 2시간 이내여야 한다.</li>
<li>해당 블록의 크기가 허용 가능한 한도 내에 있어야 한다.</li>
<li>마지막으로, 블록 내에 포함되는 제일 첫 거래는 코인베이스 생성거래여야 한다.</li>
</ul>
</li>
</ul>
<h2 id="4-가장-긴-체인의-선택">4. 가장 긴 체인의 선택</h2>
<ul>
<li>비트코인 합의 메커니즘의 마지막 단계는 블록을 체인 안에 모아 가장 많은 작업 증명을 보유하고 있는 체인을 선택하는 것이다.</li>
<li>노드가 새로운 블록을 검증하고 나면, 해당 블록을 기존의 체인에 연결함으로써 체인을 연장하려고 한다. 블록체인에는 메인 블록체인에서 나와 브랜치를 형성하는 2차 체인이 존재한다. <strong>누적 난이도가 가장 큰 값을 가진 블록들로 구성된 체인이면 어떠한 것이라도 메인 체인이 될 수 있다.</strong> 대부분의 경우, 가장 많은 블록으로 연결된 체인이 메인 체인이 된다.</li>
<li>블록체인 네트워크상에서 동시에 둘 이상의 새로운 블록이 생성되면, 블록체인의 분기(fork)가 발생하게 된다.
<img src="https://images.velog.io/images/stella_y/post/a5b2921a-c38c-48d3-840a-e0f47657aad8/image.png" alt=""></li>
<li>이 그림과 같이, 네트워크상에 2개의 블록이 동시에 생성되었다고 가정해보자. 네트워크상에 같은 높이로 존재하는 두 블록을 각각 초록색과 주황색으로 표시했다. 이 블록들은 가까운 이웃 노드들에게 전파된다.
<img src="https://images.velog.io/images/stella_y/post/c5996ea8-ed13-41ae-945a-effbd01317b6/image.png" alt=""></li>
<li>이 상태에서, 한 노드의 마이닝에 의해 초록색 블록을 부모 블록으로 가지는 새로운 검정색 블록이 생성되었다고 해보자.
<img src="https://images.velog.io/images/stella_y/post/592acdc1-4708-462b-ad98-e649ff700abc/image.png" alt=""></li>
<li>이 검정색 블록이 네트워크상에서 전파되어 나가다가, 주황색 노드가 체인에 연결된 노드를 만나게 될 것이다.
<img src="https://images.velog.io/images/stella_y/post/1353f0d9-a08b-4afc-85cf-5da8f73d3fa7/image.png" alt=""></li>
<li>주황색 블록이 체인에 연결되어 있는 노드들의 경우, 새롭게 전달받은 검은색 블록의 부모 블록인 초록 블록이 존재하지 않기때문에, 이러한 경우 블록체인의 분기가 발생한다.
<img src="https://images.velog.io/images/stella_y/post/21dbf453-0310-423c-b0d7-bda29b9eb1e6/image.png" alt=""></li>
<li>주황색 블록을 연결하고 있던 노드의 경우는 그림과 같이 분기된 체인을 형성하게 된다. 이때 주황색 체인이 2차 체인으로 변경되고, 더 긴 길이를 가지는 녹색-검은색 블록을 메인체인으로 연결하게 된다.</li>
<li>2차 체인으로 분류된 주황색 블록은 녹색-검정 블록이 메인체인으로 연결됨에 따라 고아 블록이 된다.</li>
</ul>
<h3 id="고아블록orphan-block">고아블록(orphan block)</h3>
<p><img src="https://images.velog.io/images/stella_y/post/ce175f8f-44bd-4ce5-9a62-bb78ebab49b2/image.png" alt=""></p>
<ul>
<li>유효한 블록이긴 하지만, 부모 블록이 현 체인에서 발견되지 않는 블록을 고아 블록이라고 한다.  기록은 있으나 메인체인에서 유지되지 않기 때문에 아무런 의미를 지닐 수 없는 블록이다.</li>
<li>분기된 두 체인에서 동시에 블록이 생성되어 연결되는 경우가 있을 수 있다. 이 경우, 두 체인은 체인을 더 길게 연결하려는 경쟁을 하게 되는데, 이 경쟁에서 승리해 더 긴 체인을 유지하는 체인이 메인체인이 된다.</li>
<li>그렇다면, 주황색 블록(고아블록)에 포함된 거래들은 어떻게 되는 것일까?<ul>
<li>생성된 거래들은 네트워크 전체로 전파되기 때문에, 주황색 블록에 포함된 거래들은 이미 녹색 또는 검은색 블록에 포함되었거나 추후에 포함될 것이다.</li>
<li>거래 자체가 유효하기만 한다면, 시간이 걸릴 뿐 반드시 블록에 포함되게 된다.</li>
</ul>
</li>
</ul>
<h3 id="컨퍼메이션confirmation">컨퍼메이션(confirmation)</h3>
<ul>
<li>컨퍼메이션은 특정 트랜잭션이 블록에 포함된 이후 몇 개의 블록이 뒤에 더 추가되었는지를 알려주는 지표이다. 컨퍼메이션이 충분히 크다는 것은, 이 트랜잭션은 충분히 오랫동안 변동 없이 블록에 보관되어왔기 때문에, 취소될 가능성이 적다라는 것을 의미한다.</li>
<li>1 컨퍼메이션은 해당 거래가 블록에 포함되어 블록체인에 연결되었음을 나타낸다. 체인이 분기된 경우, 분기된 체인 중 하나의 체인이 <strong>확실히 메인 체인으로 선택되기까지의 기준을 6 컨퍼메이션으로 정하고 있다.</strong> 두 체인이 경쟁하게 된다 하더라도 새로운 블록이 6개가 추가로 생기기 전에 경쟁이 끝나게 됩니다.</li>
<li>따라서, 자신이 생성한 거래가 포함된 블록이 체인에 연결된 이후 6 컨퍼메이션을 가진다면, 해당 블록이 추후에 버려질 가능성이 없다는 것을 의미한다.</li>
</ul>
<h2 id="reference">Reference</h2>
<ul>
<li>kmooc 블록체인 이론 및 응용 강의 : <a href="http://www.kmooc.kr">http://www.kmooc.kr</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Shap repo 삽질기]]></title>
            <link>https://velog.io/@stella_y/Shap-repo-%EC%82%BD%EC%A7%88%EA%B8%B0</link>
            <guid>https://velog.io/@stella_y/Shap-repo-%EC%82%BD%EC%A7%88%EA%B8%B0</guid>
            <pubDate>Mon, 20 Dec 2021 14:12:32 GMT</pubDate>
            <description><![CDATA[<ul>
<li>개발했던 deep learning 추천 시스템에 shap(<a href="https://github.com/slundberg/shap">https://github.com/slundberg/shap</a>) 을 적용해보았다.</li>
<li>이때 발견했던 해당 레포의 문제점들과, 삽질들, 해결과정을 기록한다.</li>
<li>아래 내용은 2021년 9월 29일에 적용해보았던 내용으로, 그 이후에 해당 레포에 수정이 있었을 수 있다.</li>
</ul>
<h3 id="1-explainer-의-선택">1. explainer 의 선택</h3>
<ul>
<li>해당 레포는 아래 링크에서의 여러 explainable model 논문의 구현체를 통합하여 제공하고 있다.<ul>
<li><a href="https://github.com/slundberg/shap#methods-unified-by-shap">https://github.com/slundberg/shap#methods-unified-by-shap</a></li>
<li>이 각 방법들은 explainer 라는 이름으로 제공되고 있으며, TreeExplainer, GradientExplainer, DeepExplainer 등의 9개의 explainer 가 있다.</li>
</ul>
</li>
<li>이 9개의 explainer 들 중 <strong>deep learning model</strong> 에 활용할 수 있는 건, <strong>DeepExplainer 와 GradientExplainer</strong>, 이렇게 딱 두 가지이다.</li>
<li>이중 GradientExplainer 는 tensorflow, keras, pytorch의 세 모델 코드에 적용이 가능한 한편, <strong>DeepExplainer 는 tensorflow, keras 에만 적용이 가능</strong>하니 주의하자.</li>
</ul>
<h3 id="2-embedding-layer-의-존재에-따른-explainer-선택">2. embedding layer 의 존재에 따른 explainer 선택</h3>
<ul>
<li>(이걸 꽤 나중에야 깨달아서 많이 화가났었다...)</li>
<li>gradient explainer 의 경우 multi input 을 받으면서도, embedding layer 를 포함한 경우 사용할 수 없다!</li>
<li>issue에 보면 이것과 관련해서 말이 많은데, 명확히 된다 안된다 말이 나오는 경우 없이, 성토의 자리가 되고 있어서(혹은 이거말고 다른 explainer 를 썼더니 되는것같더라) 이걸 확신하고 다른 길로 트는데에 나도 오래걸렸다.</li>
<li>2021년 9월 29일까지는 분명히 안된다...</li>
<li>issue 에는 embedding layer 의 element 각각을 평균 내서라도 어떤 값을 떨어트려주면 안되냐는 식의 요청 혹은 질문들인데, 아직까지 반영이 안되고 있다.</li>
</ul>
<h3 id="3-input-형태">3. input 형태</h3>
<ul>
<li>다른 explainer 는 잘 모르겠지만 deep explainer 와 gradient explainer 의 경우 input layer 가 하나만 존재하는 경우를 기본 상황으로 보고 있는지, api document 에는 이에 관해서만 설명되어있다.(<a href="https://shap-lrjball.readthedocs.io/en/latest/generated/shap.DeepExplainer.html#shap.DeepExplainer">https://shap-lrjball.readthedocs.io/en/latest/generated/shap.DeepExplainer.html#shap.DeepExplainer</a>)</li>
<li>그러나 여러 input layer 를 병렬적으로 두고, 합쳐서 사용하는 것이 이보다 더 일반적인 사용이기때문에, 이 표기만 보면 문제가 생길 수 있다.</li>
<li>api document 에서는 input 으로 np array 와 dataframe 만을 받는다고 나와있지만, multiple input layer 를 사용할 경우 경우 각 feature 들을 np.array 로 하는 list 형태로 넣어줘야한다...
<img src="https://images.velog.io/images/stella_y/post/c05a8648-601f-4974-bb1d-99a9d2943e48/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-20%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.50.20.png" alt="">
<img src="https://images.velog.io/images/stella_y/post/f1492028-9243-48b6-8a07-916ece1420ef/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-20%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.53.27.png" alt=""></li>
</ul>
<h3 id="4-input-의-순서">4. input 의 순서</h3>
<ul>
<li>위에서와 같이, 여러 feature 들을 list 로 받다보니, feature 입력 순서가 중요해진다.(input layer 이름과 매핑하는 등의 과정이 전혀 없다.)</li>
<li>이때 tensorflow 와 keras의 경우, model.summary()에서 표시되는 feature 의 순서로 하면 된다.</li>
</ul>
<h3 id="5-tf2-지원x">5. tf2 지원X</h3>
<ul>
<li>deep explainer 의 경우, tf2 지원이 되지 않는다.(gradient explainer는 된다!)</li>
<li>사실 5번의 이유를 먼저 깨닫고, 2번의 이유를 나중에 깨달았기때문에, 본인은 gradient explainer 를 쉽게 포기하지 못하여 길게 삽질을 했었다...</li>
<li>아래의 글을 잔뜩 참조하고 나서야 tf2지원이 안되는것을 깨달았다.<ul>
<li><a href="https://github.com/slundberg/shap/issues/1079">https://github.com/slundberg/shap/issues/1079</a></li>
<li><a href="https://github.com/slundberg/shap/issues/1406">https://github.com/slundberg/shap/issues/1406</a></li>
<li><a href="https://stackoverflow.com/questions/64226155/lookuperror-gradient-registry-has-no-entry-for-shap-tensorliststack-using-de">https://stackoverflow.com/questions/64226155/lookuperror-gradient-registry-has-no-entry-for-shap-tensorliststack-using-de</a></li>
<li><a href="https://github.com/slundberg/shap/issues/1551">https://github.com/slundberg/shap/issues/1551</a></li>
</ul>
</li>
<li>위에 글에서와 같이 eager execution 을 끄고 진행하면 잘 동작한다.</li>
<li>그러나 이때에는 tf2에서처럼 tfrecord 에서 parsing 한 tensor 자체를 input으로 바로 넣어줄 수는 없게 돼서, 3번의 그림에서와 같은 괴상한 형태로 input을 만들게 된다 ;ㅁ;</li>
</ul>
<h3 id="마무리-하며">마무리 하며...</h3>
<ul>
<li>내가 사용한 <a href="https://github.com/slundberg/shap%EC%9D%98">https://github.com/slundberg/shap의</a> 레포는 받는 관심에 비해서, as가 활발하지는 않은 안타까운 레포인 것 같다.</li>
<li>글을 쓰고 있는 현재(2021년 12월 20일)star 수가 14k 인 것에 반해, issue 1.2k개가 open 된 상태로 방치되어있다...</li>
<li>쓸 수는 있는 상태지만, 그 편의성이 다소 안타까울 따름이다...</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>