<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>zhenxi.log</title>
        <link>https://velog.io/</link>
        <description>인문학도(였던 것)</description>
        <lastBuildDate>Thu, 07 Apr 2022 10:03:44 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>zhenxi.log</title>
            <url>https://images.velog.io/images/zhenxi_23/profile/adb250eb-8119-42fc-86d8-3b6e58fa15b3/social.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. zhenxi.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/zhenxi_23" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[XLNet]]></title>
            <link>https://velog.io/@zhenxi_23/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-XLNet</link>
            <guid>https://velog.io/@zhenxi_23/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-XLNet</guid>
            <pubDate>Thu, 07 Apr 2022 10:03:44 GMT</pubDate>
            <description><![CDATA[<h1 id="xlnet">XLNet</h1>
<p>BERT + GPT 
AE(Auto Encoder) + AR(Auto Regressive) </p>
<ul>
<li>Factorization order고려하여 양방향 학습</li>
<li>AR formula를 통해 BERT한계 극복</li>
</ul>
<h1 id="auto-encodeing과-auto-regressive">Auto Encodeing과 Auto Regressive</h1>
<p><img src="https://velog.velcdn.com/cloudflare/zhenxi_23/7980d18b-72ce-40e2-aa11-a1209a6e4518/image.png" alt=""></p>
<p>XLNet은 AE(BERT)와 AR의 장점을 취함으로써 단점으로 보완했다. </p>
<ul>
<li>AE의 문제점 <ul>
<li>[MASK] token이 독립적으로 예측(independent assumption)되기 때문에 token 사이의 dependency는 학습 할 수 없음 (한 문장안에 2개의 [MASK] token이 있다고 했을때, 각자 예측되므로 서로의 dependency는 학습되지 않음)</li>
<li>finetuning 과정에서 [MASK] token이 등장하지 않기 때문에 pretraining과 finetuning사이에 discrepancy 발생</li>
</ul>
</li>
<li>AR의 문제점<ul>
<li>단일 방향(uni-direction) 정보만 이용하여 학습 가능함</li>
</ul>
</li>
</ul>
<h1 id="단점을-어떻게-보완했는가">단점을 어떻게 보완했는가?</h1>
<h2 id="1-permutation-language-modeling-objective">1. Permutation Language Modeling Objective</h2>
<p>Permutation 집합을 통해 다양한 sequence고려
AR Objective function에 대입
특정 token에 양방향 context 고려할 수 있음 
아래의 그림은 세번째 token(x3)을 예측할때, permutation 집합을 통해 앞, 뒤(x1, x2, x4)가 모두 고려되는 모습를 설명했다.
<img src="https://velog.velcdn.com/cloudflare/zhenxi_23/22bdf57c-254f-4a6e-8603-8ac4d31330b6/image.png" alt="">
첫번째를 보면  factorization order가 3 2 4 1이며, 세번째 토큰을 예측하므로 다른 토큰을 고려하지 않고, memory(이전 context에서 가져온 정보)만 고려했다.</p>
<p>이로써 양방향의 context를 고려함으로 AR의 한계와, Masking을 제거하여 AE의 한계를 극복했다. </p>
<p><img src="https://velog.velcdn.com/cloudflare/zhenxi_23/381887d5-63c3-495b-bffc-97015d1f426e/image.png" alt=""></p>
<p>앞서 permutation으로 뒤섞인(?) 순서(sequence)가 주어졌을때, 다음 token이 무엇이 나올지 예측하는 것이 permuctation language modeling이라고 생각하면 된다.</p>
<p><img src="https://velog.velcdn.com/cloudflare/zhenxi_23/cd563224-53ca-42e5-83f4-86ad86bea6cb/image.png" alt=""></p>
<p>MLM과 PLM의 차이를 한눈에 볼 수 있는 예시가 있어 가져왔다. 
MLM은 두개의 마스크 토큰이 독립적으로 예측되지만, PLM은 (빨간선을 기준으로) 마지막 두개의 토큰을 예측할때, 두개의 토큰이 독립적이라는 가정이 없다. 한마디로 York이라는 단어를 예측할때는 New와 그 앞의 모든 토큰을 다 고려하여 예측하는 것이다. </p>
<h2 id="2-target-aware-representation-for-transformer">2. Target-Aware Representation for Transformer</h2>
<p>PLM의 치명적인 단점 ! </p>
<p><img src="https://velog.velcdn.com/cloudflare/zhenxi_23/ce4ee785-1086-4bdf-ae92-74daf0723c8c/image.png" alt=""></p>
<p>뒤섞은 다음에 다음 단어를 예측하려면, 그 다음 단어가 어느 위치에 있는 단어인지 모른다..! 이 정보를 사전에 모델에 입력할 수 없다. 이를 해결하기 위한 방법이 two-stream self-attention</p>
<ul>
<li>새로운 objective function은 standard Transformer에서 작동하지 않음</li>
<li>따라서 Transformer에 XLNet의 Objective function을 적용하기 위해 Target-Aware Reapresentation 제안
<img src="https://velog.velcdn.com/cloudflare/zhenxi_23/411dd146-0d0a-4cd1-85a7-0d832d8346f6/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/cloudflare/zhenxi_23/cd45865f-95e5-4303-ba82-032bb14239d7/image.png" alt=""></p>
<p>target을 알고 있는 상태로 학습?
두가지의 예측할 representation과 target token을 함께 학습하고자 하는 것이 여기서 추구하는 target aware representation</p>
<h2 id="3-two-stream-self-attention">3. Two-Stream Self-Attention</h2>
<p>위에서 바꾼 representation에 self attetion을 적용하기 위해 두가지 stream으로 나눠서 생각
<img src="https://velog.velcdn.com/cloudflare/zhenxi_23/139a67ef-530c-431f-91f8-bb858879debb/image.png" alt=""></p>
<p>Content stream에서는 예측하고자 하는 token의 정보를 함께 사용 
띠용....예측하고자 하는 token이 있는데 그 정보를 같이 활용한다? 말이 안된다..!라고 생각할 수 있지만 우리에겐 Query stream도 있다.</p>
<p><img src="https://velog.velcdn.com/cloudflare/zhenxi_23/7d1995c5-a793-47ed-91ea-86e7bf3fc7ab/image.png" alt=""></p>
<p>x1, x2, x3, x4 : 어떤 토큰의 임베딩 값
w : 위치정보
factorization order가 3 2 4 1인 상황에서,
position 3을 예측한다고 하면 : position 3의 위치정보만 고려하여 학습
position 2를 예측한다고 하면 : position 2의 위치정보와 x3 token의 정보를 고려하여 학습
...
=&gt; 예측하고자 하는 토큰의 전 시점까지의 토큰 정보 &amp; 예측하고자 하는 토큰의 위치정보 &amp; initialize된 vector 사용</p>
<p><img src="https://velog.velcdn.com/cloudflare/zhenxi_23/45ede508-993a-4840-ba00-1d9e64836084/image.png" alt=""></p>
<p>Query stream에서는 토큰의 정보만을 활용하여 학습을 진행한다. (예측하고자하는 토큰의 정보까지 포함) (Query stream은 fine-tuning시에 사용하지 않음)</p>
<h1 id="reference">Reference</h1>
<p><a href="https://www.youtube.com/watch?v=v7diENO2mEA">https://www.youtube.com/watch?v=v7diENO2mEA</a>
<a href="https://www.youtube.com/watch?v=koj9BKiu1rU">https://www.youtube.com/watch?v=koj9BKiu1rU</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] Attention Is All You Need]]></title>
            <link>https://velog.io/@zhenxi_23/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Attention-Is-All-You-Need</link>
            <guid>https://velog.io/@zhenxi_23/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Attention-Is-All-You-Need</guid>
            <pubDate>Wed, 09 Mar 2022 10:45:41 GMT</pubDate>
            <description><![CDATA[<p>처음으로 하는 논문 리뷰! 
선택한 논문은 <a href="https://arxiv.org/pdf/1706.03762.pdf">Attention Is All You Need</a>이다. </p>
<p>현재 NLP분야에서 최고존엄인 BERT모델이 이 논문에서 제안한 Transformer 아키텍쳐의 Encoder를 바탕으로 하고 있다. </p>
<h1 id="abstract">Abstract</h1>
<p>Transformer는 RNN과 CNN을 사용하지 않고, Attention으로만 구성된 sequence 처리 모델이다. 번역 성능 측정 평가지표인 BLEU에서 적은 훈련 비용으로 좋은 점수를 기록했다.</p>
<h1 id="introduction">Introduction</h1>
<p>이 논문에서 제안하는 것은 <strong>Transformer</strong>이다. 이전의 모델인 RNN, LSTM, GRU같은 Recurrent model들은 순차적으로 계산되어 hidden states를 생성하기 때문에 병렬처리가 불가능하다는 근본적인 단점이 있다. Transformer는 Attention 메커니즘만을 활용하여 이 단점을 해결한다. </p>
<h1 id="model-architecture">Model Architecture</h1>
<p><img src="https://images.velog.io/images/zhenxi_23/post/23828754-b85d-46bc-83c2-9c8161df40bb/image.png" alt="">
Transformer 모델은 다음과 같은 구조를 가지고 있다. Encoder와 Decoder는 모두 self-attention과 fully connected layer를 포함한다. </p>
<h2 id="encoder--decoder">Encoder &amp; Decoder</h2>
<p>Encoder</p>
<ul>
<li>6개의 동일한 레이어 스택으로 구성된다.(N=6) </li>
<li>스택마다 2개의 sub layer가 있는데, 첫 번째는 다중 Multi-Head Attention이고, 두 번째는 Feed Forward 네트워크이다.</li>
<li>이 두개의 sub layer에 대해 residual connection을 사용하고, layer normalization을 진행한다.</li>
<li>각 sub layer의 출력은 LayerNorm(x + Sublayer(x))</li>
<li>residual connection을 용이하게 하기 위해 모든 레이어의 차원은 512차원으로 임베딩한다.</li>
</ul>
<p>Decoder</p>
<ul>
<li>Encoder와 동일한 구조에 하나의 layer가 추가되었다. 이는 인코더 스택의 output에 대해 Multi-Head Attention을 수행하는 layer이다. </li>
<li>Decoder는 순차적으로 결과를 만든다. 만약 i번째 position인 단어를 predict한다고 하면, i보다 전에 있는 output에만 의존하여 predict한다. 이를 위해 masking을 이용한다. </li>
</ul>
<h2 id="attention">Attention</h2>
<p>Attention에 대한 설명은 <a href="https://wikidocs.net/22893">이곳</a>을 참고</p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/ada9276f-befb-4ade-a942-898e619d912d/image.png" alt=""></p>
<h3 id="scaled-dot-product-attention">Scaled Dot-Product Attention</h3>
<p>Scaled Dot-Product Attention의 input은 $$d_{k}$$차원의 query, key와 $$d_{v}$$차원의 value로 구성되어 있다. query와 모든 key를 내적하고, 각각 $$\sqrt{d_{k}}$$로 나눈 뒤, softmax를 취해 value에 대한 weight를 얻는다. </p>
<p>실제로는 모든 query들이 matrix Q로, key와 value역시 matrix K, V로 Packed되어 한번에 계산이 된다. </p>
<p>output이 도출되는 식은 다음과 같다.</p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/b3034136-346b-4e6c-b938-e040e1c3df63/image.png" alt=""></p>
<h3 id="multi-head-attention">Multi-Head Attention</h3>
<p>Multi-Head Attention은 단일 어텐션을 수행하는 대신, $$d_{k}$$, $$d_{k}$$, $$d_{v}$$차원에 대해 학습된 queries, keys, values Linear를 h번 (병렬적으로) 계산하는 것이다. 각각의 output에 대해 concat한 뒤 Linear projection하여 최종 결과 vector를 얻는다. 
<img src="https://images.velog.io/images/zhenxi_23/post/15763608-0d24-4edc-9a12-191a0389e61e/image.png" alt=""></p>
<h3 id="applications-of-attention-in-our-model">Applications of Attention in our Model</h3>
<p>Attention을 적용하는 방법은 sub layer에 속해있는 Attention마다 다르다. </p>
<ul>
<li><p>encoder-decoder attention layer (Decoder에 위치)
query : decoder내의 이전 layer의 output
key, value : encoder의 최종 output
input sequence의 모든 position 접근 가능</p>
</li>
<li><p>self-attention layer (Encoder에 위치)
query, key, value 모두 이전 encoder layer의 output
input sequence의 모든 position 접근 가능</p>
</li>
<li><p>self-attention layer (Decoder에 위치)
query, key, value 모두 이전 decoder layer의 output
input sequence의 모든 position 접근 불가</p>
</li>
<li><blockquote>
<p>해당 position이전의 position까지만 접근 가능하다. decoder의 auto-regressive 성질을 유지하기 위해 접근 불가한 단어의 위치에 대해 -inf에 가까운 매우 작은 수를 더해주고, softmax를 취하여 값이 0에 수렴하도록 하는 masking 방식을 이용한다. </p>
</blockquote>
</li>
</ul>
<h2 id="positional-encoding">Positional Encoding</h2>
<p>Transformer에는 단어의 위치를 알려주는 Positional Encoding layer가 있다. 이를 encoder와 decoder 하단에 배치해준다. 이 역시 embedding과 동일한 차원을 가지며 이로써 두 벡터가 더해질 수 있다. 
<img src="https://images.velog.io/images/zhenxi_23/post/ef10191f-ef78-42f1-bdc2-ee278e939908/image.png" alt=""></p>
<p>논문에서는 sin과 cosine함수를 적용하여 positional encoding을 하였는데, 두 방식이 거의 동일한 결과를 냈다. 결론적으로는 sinusoidal version을 선택하였는데, 이는 모델이 훈련되는 동안 마주친 길이보다 더 긴 sequence에 대해서도 처리할 수 있기 때문이다. </p>
<h1 id="why-self-attention">Why Self-Attention</h1>
<p>다른 기법들과 Self-Attention을 비교한 결과,</p>
<ul>
<li>layer당 총 계산 복잡도가 줄어든다. 
NLP에서는 input되는 sequence의 길이 n은 보통 embedding 차원(d)보다 작은 경우가 대부분이다. </li>
<li>병렬처리가 가능한 계산이 늘어난다. </li>
<li>보다 더 긴 장거리 학습의 가능하다. </li>
</ul>
<p><img src="https://images.velog.io/images/zhenxi_23/post/46f476dc-45a4-4bf3-bb8b-9286c617d4a4/image.png" alt=""></p>
<p>side benefit으로, 어텐션을 이용할 경우 구해진 attention distribution이 시각화(!)가 가능하여 사용하는 모델의 설명력을 높여준다.</p>
<h1 id="train--result">Train &amp; Result</h1>
<p>&#39;English-to-German and English-to-French newstest2014&#39;에서 SOTA를 달성하였다. 
NVNIA P100 GPU 8대로 기본 모델은 12시간, big 모델은 3.5일을 학습시켰다. 
<img src="https://images.velog.io/images/zhenxi_23/post/dd1071a0-55ee-4d3a-8019-4d17da2c6590/image.png" alt=""></p>
<h1 id="reference">Reference</h1>
<p>논문 리뷰는 처음이라 다른 논문 리뷰를 참고해가며 조금 감을 익혔다.
<a href="https://velog.io/@changdaeoh/Transformer-%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0">https://velog.io/@changdaeoh/Transformer-%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Pytorch] CUDA out of memory]]></title>
            <link>https://velog.io/@zhenxi_23/Pytorch-CUDA-out-of-memory</link>
            <guid>https://velog.io/@zhenxi_23/Pytorch-CUDA-out-of-memory</guid>
            <pubDate>Thu, 03 Mar 2022 16:11:59 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-상황">문제 상황</h1>
<p>코랩 환경에서 모델 test를 위해 모델을 load하고 predict하려는 순간, CUDA out of memory 에러가 발생했다. </p>
<h1 id="시도한-것들">시도한 것들</h1>
<h3 id="1-nivia-smi로-memory-현황-보기">1. nivia-smi로 memory 현황 보기</h3>
<p><img src="https://images.velog.io/images/zhenxi_23/post/718867d5-3ea7-46cf-bba8-8f8cf85914b1/image.png" alt=""></p>
<p>다음과 같은 코드로 볼 수 있다. 보다싶이 꽉 차있다..</p>
<pre><code>! nivia-smi </code></pre><h3 id="2-colab새로운-창에서-다시-시작">2. colab새로운 창에서 다시 시작</h3>
<p>memry를 다시 확인해본 결과, 전보다는 비었지만, 다시 실행하니 또 out of memory가 떴다.</p>
<h3 id="3-캐시-지우기">3. 캐시 지우기</h3>
<pre><code>import gc
gc.collect()
torch.cuda.empty_cache()</code></pre><h3 id="4-파이썬-좀비-프로세스-종료-이런게-있었는지-몰랐다">4. 파이썬 좀비 프로세스 종료 (이런게 있었는지 몰랐다)</h3>
<p>좀비프로세스란, 종료되었는데 리소스만 차지하고 있는 녀석들이다.</p>
<p>아래 코드로 현재 파이썬이 실행중인 프로세스들을 볼 수 있다.</p>
<pre><code>! ps -ef | grep python</code></pre><p><img src="https://images.velog.io/images/zhenxi_23/post/0d2b2132-3e49-45f6-a127-6d741fe5ba1a/image.png" alt=""></p>
<p>보면 root 옆의 숫자들이 바로 프로세스들의 id 란다. 이걸 하나씩 kill해준다.</p>
<pre><code>! kill -9 {process_id}</code></pre><h1 id="해결-방법">해결 방법</h1>
<p>이걸로 세시간 가까이 삽질하다가, 방법을 찾았다. 왜 자꾸 외부에서 범인을 찾으려 했는지는 몰라도, 진범은 코드 안에 있었다. </p>
<pre><code> with torch.no_grad():
     logits = model(**batch_input)</code></pre><p>parameter에 대해 no_grad를 해주지 않아, grad가 계산되는 족족 소중한 메모리 공간을(아주 많이) 차지해버렸고.....나는 눈물의 삽질을 했던 것이다.
<strong>validation과 test를 할때는 굳이 역전파를 해주지 않아도 되기 때문에 grad를 계산할 필요가 없다.</strong> (기억하자!)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[week1-3] NLG tasks - MT(Machine Translation)]]></title>
            <link>https://velog.io/@zhenxi_23/week1-3-NLG-tasks-Machine-Translation</link>
            <guid>https://velog.io/@zhenxi_23/week1-3-NLG-tasks-Machine-Translation</guid>
            <pubDate>Wed, 23 Feb 2022 09:32:19 GMT</pubDate>
            <description><![CDATA[<h1 id="📋-개요">📋 개요</h1>
<p>원티드 프리온보딩 세번째 날이다. <strong>NLG(Natural language generation) *<em>task에 대해 알아보았다. 아직 benchmark가 NLU보다 잘 형성되지 않은 분야이며, 연구가 활발히 진행되는 분야 중 하나이다. 오늘은 NLU의 sub task 중 하나인 *</em>Machine Translation</strong>에 대해 글을 써보고자 한다. </p>
<p>글의 순서는 다음과 같다. </p>
<blockquote>
<ol>
<li>NLG란?</li>
<li>Machine Translation<ul>
<li>문제 정의</li>
<li>데이터셋 소개</li>
<li>SOTA 모델 소개</li>
</ul>
</li>
<li>Reference</li>
</ol>
</blockquote>
<h1 id="✍️-nlg란">✍️ NLG란?</h1>
<p>언어를 생성하는 건 정확히 무엇을 뜻할까? 
언어의 방향성에 따라 <strong>축약</strong>과 <strong>보강</strong>, 그리고 <strong>재구성</strong>으로 나눌 수 있다.</p>
<ul>
<li><strong>축약(Text Abbreviation)</strong> → 문장의 핵심만<ul>
<li>Summarization<ul>
<li>Abstractive : 문서에 있는 단어로 요약</li>
<li>Extractive : 문서에 없던 단어로 요약</li>
<li>Application: 뉴스요약</li>
<li>현업에서 수요가 많은 서비스</li>
</ul>
</li>
<li>Question generation<ul>
<li>Application: onlline 학습 도구</li>
</ul>
</li>
<li>Distractor generation<ul>
<li>오지선다에서 <strong>오답</strong>을 생성</li>
<li>Application : 데이터 증강</li>
</ul>
</li>
</ul>
</li>
<li><strong>보강(Text Expansion)</strong> → 부족한 정보를 추가<ul>
<li>Short text expansion<ul>
<li>정보를 추가해 데이터 길이를 늘리기</li>
<li>Application : 짧은 제목으로 내용 생성</li>
</ul>
</li>
<li>Topic to essay generation<ul>
<li>Application : “가족&quot;, “장난감&quot;, “크리스마스&quot; → “케빈은 크리스마스에 혼자 집에서...”</li>
</ul>
</li>
</ul>
</li>
<li><strong>재구성(Text Rewriting)</strong> → 기존 정보의 형태를 변형 / 기존 정보로 추론해서 답<ul>
<li>Style Transfer<ul>
<li>긍정 ↔ 부정</li>
<li>아침에 샌드위치 먹었는데 맛있었어 → 아침에 샌드위치 먹었는데 맛없었어😑</li>
<li>Application : 데이터 증강, 말투 변화(사투리 변형 등등)</li>
</ul>
</li>
<li>Dialogue Generation<ul>
<li>페르소나를 가진 참여자의 대화를 생성</li>
<li>Application : 챗봇</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="🤔-machine-translation">🤔 Machine Translation</h1>
<p>Machine Translation은 내가 가질 직무와 직접적인 연관이 있을지 모호한 분야이지만, 외국어 전공자로서 항상 궁금했던 분야이기도하다. (학부 4년간 papago는 최대의 라이벌이자, 친구였다.🤔) 현재 Machine Translation의 주류 아키텍쳐는 무엇인지, SOTA모델은 무엇이 있는지 살펴보고자 한다. </p>
<h2 id="문제-정의">문제 정의</h2>
<p>Machine Translation(MT), 기계 번역은 인간의 개입 없이 한 언어를 다른 언어로 자동으로 변환하는 task를 의미한다. </p>
<p align="center"><img src="https://images.velog.io/images/zhenxi_23/post/c261c9c0-8909-44da-b93d-f516bb262609/image.png" width="50%"></p>

<p>MT에는 아래의 세가지 방법이 해당된다. </p>
<ul>
<li>Rule-based machine translation (RBMT)</li>
<li>Statistical machine translation (SMT)</li>
<li>Neural machine translation (NMT)
MT에 대한 정보는 이 <a href="https://www.memsource.com/machine-translation/">링크</a>를 참고하면 된다. </li>
</ul>
<p>인공 신경망을 이용한 기계번역(NMT)이 현재 주류를 이루고 있다. </p>
<h2 id="데이터셋-소개">데이터셋 소개</h2>
<p>소개할 데이터셋은 <a href="https://paperswithcode.com/dataset/wmt-2014">WMT 2014 dataset</a>이다. 
해당 데이터셋은 두쌍의 언어(독일어-영어, 프랑스어-영어, 러시아어-영어..)가 묶여있다. 아래는 그 중 &#39;<strong>독일어-영어</strong>&#39;로 묶인 데이터셋의 일부이다. </p>
<pre><code>{ &quot;de&quot;: &quot;Wiederaufnahme der Sitzungsperiode&quot;, &quot;en&quot;: &quot;Resumption of the session&quot; }
{ &quot;de&quot;: &quot;Ich bitte Sie, sich zu einer Schweigeminute zu erheben.&quot;, &quot;en&quot;: &quot;Please rise, then, for this minute&#39; s silence.&quot; }
{ &quot;de&quot;: &quot;(Das Parlament erhebt sich zu einer Schweigeminute.)&quot;, &quot;en&quot;: &quot;(The House rose and observed a minute&#39; s silence)&quot; }</code></pre><p>같은 의미를 가진 두 언어가 한문장씩 묶여있다. 
이를 MT모델에 적용시켜 독일어를 영어로 변환시키는 번역기를 학습시킬 수 있다. </p>
<h2 id="sota-모델-소개">SOTA 모델 소개</h2>
<p>MT모델에 대해 서치한 결과 아래와 같은 리더보드를 보았다. 한가지 눈에 띄인 점은 SOTA 모델들도 언어의 쌍에 따라 다르다는 사실이다. 언어는 자국어와 외국어로 이분화할 수 있는 영역이 아니기 때문이라서 그런지 모델이 언어에 대한 영향을 많이 받는 것 같다. </p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/b0638021-d95e-4990-b1f7-d41873057541/image.png" alt=""></p>
<p>특정 언어 번역을 위한 논문 역시 심심찮게 발견 할 수 있었다. 
언어에 따라 MT의 방법을 달리하기도 하는데, papago의 경우에 타 언어들은 NMT 기법을 이용하였지만, 한국어-일본어 번역에 SMT 기법을 사용한 사례가 있었다고 한다. (현재는 어떤 방식을 사용하는지 모르겠지만!)</p>
<p>MT분야에서는 현재 Transformer나 그 일부를 응용한 모델들이 많이 생겨나고 있다. 
따라서 Transformer 모델과 <a href="https://paperswithcode.com/sota/machine-translation-on-wmt2014-english-german">Machine Translation on WMT2014 English-German</a> 데이터셋에 대한 SOTA 모델인 Transformer Cycle에 대해 간단하게 설명하고자 한다. </p>
<h3 id="transformer">Transformer</h3>
<p>Transformer 이전, seq2seq모델의 한계는 고정된 크기의 context vector(문맥 벡터)가 소스 문장의 모든 정보를 가지고 있어야 하므로 성능이 저하 된다는 것이다. 또한 sequence의 길이가 길수록 연산 시간이 오래 걸린다는 단점도 있었다. 
Transformer에서는 그러한 한계를 타파하고자, Attention만으로 encoder와 decoder를 구현했다. </p>
<p>다음은 너무나도 유명한 그 논문, <a href="https://arxiv.org/pdf/1706.03762v5.pdf">Attention Is All You Need</a>에서 발췌한 이미지이다.
<img src="https://images.velog.io/images/zhenxi_23/post/883b1e6b-ac71-4e98-baca-a6927cbda157/image.png" alt="">
Transformer의 전체적인 구조를 나타내고 있는데, 주목할만한 점은 <strong>Positional Encoding</strong>과 3개의 <strong>Multi-Head Attention</strong>이다. </p>
<p>Transformer는 <strong>병렬화</strong>를 위해 모든 단어 벡터를 동시에 입력받는다. 컴퓨터는 어떤 단어가 어디에 위치하는지 알 수 없게 된다. 따라서 단어의 위치 정보를 제공하기 위해 벡터를 만들어 주는데, 그것이 바로 Positional Encoding이다. </p>
<p>Transformer의 주요 메커니즘인 <strong>Self-Attention</strong>은 문장 내부 요소의 관계를 잘 파악하기 위해 문장 자신에 대해 어텐션 메커니즘을 적용한다. </p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/bd808321-59a5-4caf-9d4e-940e600600c0/image.png" alt=""></p>
<p>이 과정에서 Query, Key, Value 벡터를 만든다. 순서는 다음과 같다.  </p>
<blockquote>
<ol>
<li>특정 단어의 쿼리(q) 벡터와 모든 단어의 키(k) 벡터를 내적한다. 내적을 통해 나오는 값이 Attention 스코어(Score)가 된다. </li>
<li>트랜스포머에서는 이 가중치를 q,k,v 벡터 차원  $d_k$의 제곱근인 $\sqrt{d_k}$로 나누어준다. (계산값을 안정적으로 만들어주기 위한 계산 보정)</li>
<li>Softmax를 취해준다. 쿼리에 해당하는 단어와 문장 내 다른 단어가 가지는 관계의 비율을 구할 수 있다. </li>
<li>밸류(v) 각 단어의 벡터를 곱해준 후 모두 더한다.</li>
</ol>
</blockquote>
<p>Transformer에서는 이 Attention을 여러개 만들어 다양한 특징에 대한 Attention값을 볼 수 있도록 한다. 이것이 바로 <strong>Multi-Head-Attention</strong>이다.</p>
<p>decoder는 Auto-Regressive(왼쪽 단어를 보고 오른쪽 단어를 예측)하게 단어를 생성한다. 따라서 예측을 하지 않은 단어에 대해 masking을 해줘야 한다. 이때 사용하는 것이 <strong>Masked Self-Attention</strong>이다.
<img src="https://images.velog.io/images/zhenxi_23/post/634568a0-5f35-41ca-b3e3-2926c3ebb665/image.png" alt=""></p>
<p>Masked Self-Attention에서는 Softmax를 취해주기 전, 가려주고자 하는 요소에만 $-\infty$ 에 해당하는 매우 작은 수를 더해준다. 이로써 Softmax를 취했을때 0이 나오게 되고 Value 계산에 반영되지 않는다.</p>
<p><a href="https://arxiv.org/pdf/1706.03762v5.pdf">논문 - Attention Is All You Need</a>의 키워드는 다음과 같다. </p>
<ul>
<li>Transformer</li>
<li>Attention / Self-Attention</li>
<li>Encoder &amp; Decoder</li>
</ul>
<h3 id="transformer-cycle">Transformer Cycle</h3>
<p><img src="https://images.velog.io/images/zhenxi_23/post/055db848-b83b-45a8-899e-dd3de5b3575a/image.png" alt=""></p>
<p>&#39;Machine Translation on WMT2014 English-German&#39; 데이터셋에 대해 가장 높은 <a href="https://wikidocs.net/31695">BLEU Score</a>를 달성한 모델이다. (35.14)
Abstract과 Introduction의 model figure만을 살펴보았는데, 대략적으로 말하자면, 기존의 Transformer 모델에 layer마다 parameter를 쉐어하는 방식을 취한걸로 보인다. </p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/678606c4-f6a5-4033-9db3-33d86e2ea2f3/image.png" alt="">
위 이미지에 보이는 것처럼 SEQUENCE, CYCLE, and CYCLE(REV) 세가지의 방식 parameter를 쉐어했다. </p>
<p><a href="https://arxiv.org/pdf/2104.06022v2.pdf">논문 - Lessons on Parameter Sharing across Layers in Transformers</a>의 키워드는 다음과 같다. </p>
<ul>
<li>Transformer</li>
<li>parameter sharing method</li>
<li>SEQUENCE, CYCLE, and CYCLE(REV) </li>
</ul>
<h1 id="🌈-reference">🌈 Reference</h1>
<p><a href="https://www.youtube.com/watch?v=AA621UofTUA&amp;t=1945s">Transformer에 대한 매우 친절한 설명 - 동빈나님 영상</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[week1-2] NLP task - STS(Semantic Textual Similarity)]]></title>
            <link>https://velog.io/@zhenxi_23/week1-2-NLP-Task-STSSemantic-Textual-Similarity</link>
            <guid>https://velog.io/@zhenxi_23/week1-2-NLP-Task-STSSemantic-Textual-Similarity</guid>
            <pubDate>Tue, 22 Feb 2022 03:20:23 GMT</pubDate>
            <description><![CDATA[<h1 id="📋-개요">📋 개요</h1>
<p>원티드 프리온보딩 두번째 날이다. 어제 NLP의 대략적인 Task들에 대해 알아본데에 이어, 오늘은 NLU task에 대해 알아보았다. 그 중 하나의 Sub task인 STS(Semantic Textual Similarity)에 대해 글을 작성하겠다.</p>
<blockquote>
<ol>
<li>들어가기에 앞서<ul>
<li>NLU ?</li>
<li>성능 평가를 부탁해 : Benchmark GLUE</li>
</ul>
</li>
<li>STS (Semantic Textual Similarity)<ul>
<li>문제 정의</li>
<li>데이터셋 소개</li>
<li>SOTA 모델 소개</li>
</ul>
</li>
<li>Reference</li>
</ol>
</blockquote>
<h1 id="🙋♀️-들어가기에-앞서">🙋‍♀️ 들어가기에 앞서</h1>
<p>STS에 대해 알아보기 전에, 오늘 배운 내용을 간단하게 요약한다. </p>
<h2 id="nlu-">NLU ?</h2>
<p><img src="https://images.velog.io/images/zhenxi_23/post/2e1b4084-b43d-4e74-893f-8dfe6b51635f/image.png" alt=""></p>
<p>NLU(Natural Language Understanding), <strong>자연어 이해</strong>란 무엇일까? 
이해라는 추상적인 개념을 조금 구체적으로 적어보았다. </p>
<p>자연어 이해에는 다음이 속한다.</p>
<ul>
<li><strong>syntactic</strong> = 문법적으로 옳은 문장인가?</li>
<li><strong>semantic</strong> = 문장의 의미를 아는가? 
  의미 : 감정 분석, 문장간 유사도, 의도 파악, 질의응답, 추론 등...</li>
</ul>
<p>이는 자연어 처리에서 NLG(자연어 생성)과 비교되는 분야이기도 하다. </p>
<p>자세한 사항은 이 <a href="https://hryang06.github.io/nlp/NLP/">링크</a>를 참고하면 정리가 잘 되어 있다.</p>
<h2 id="성능-평가를-부탁해--benchmark-glue">성능 평가를 부탁해 : Benchmark GLUE</h2>
<p>한가지 task에 맞춰 end-to-end 모델을 만들었던 옛날과는 달리 현재에는 전이학습(transfer learning)모델을 task에 맞게 fine-tuning 해서 사용하는 방식이 많이 사용된다. 
GLUE는 이러한 모델(사전 학습된 모델)을 여러가지 NLP task에 대해 시험하여 해당 모델이 얼마나의 성능을 이뤘는지 확인 할 수 있는 지표라고 할 수 있다. </p>
<p>GLUE를 통해 확인할 수 있는 task (<a href="https://hryang06.github.io/nlp/NLP/">출처</a>)</p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/ccd729f1-bc1e-4c3e-933a-2c6adf936c79/image.png" alt=""></p>
<p>GLUE에 대한 자세한 사항은 이 <a href="https://huffon.github.io/2019/11/16/glue/">링크</a>를 참고하면 정리가 잘 되어 있다.</p>
<h1 id="✍️-sts-semantic-textual-similarity">✍️ STS (Semantic Textual Similarity)</h1>
<p>그럼 지금부터 STS (Semantic Textual Similarity), <strong>문장이 유사한지</strong>를 구하는 task에 대해 글을 써보도록 하겠다.</p>
<h2 id="문제-정의">문제 정의</h2>
<p>STS는 바로 위에서 말했다 싶이, 텍스트가 서로 유사한지를 구하는 task이다. </p>
<blockquote>
<p>저는 어거스트 러쉬라는 영화를 가장 좋아합니다.
제가 제일 재미있게 본 영화는 어거스트 러쉬입니다. </p>
</blockquote>
<p>위의 두가지 문장은 다르지만, 유사하다. 이러한 유사도를 판별해 내는 것이 바로 STS의 목적이다. </p>
<blockquote>
<p><strong>실사용 예시</strong>
Q&amp;A 코퍼스에서 의미적으로 유사한 질문을 추출한 후, 데이터베이스에서 유사한 문서를 검색하고, 의미적으로 유사한 뉴스 기사를 추천 </p>
</blockquote>
<p>텍스트의 유사도 판별에는 Jaccard 유사도, cosine 유사도 등의 여러 방법이 있지만, 오늘은 딥러닝을 이용한 유사도 판별 기법에 초점을 맞춰 글을 쓰려고 한다.</p>
<h2 id="데이터셋-소개">데이터셋 소개</h2>
<p>데이터셋은 <a href="https://gluebenchmark.com/tasks">이곳</a>에서 다운받을 수 있다. 
나는 STS task를 다루는 중이므로 Name이 <strong>Semantic Textual Similarity Benchmark</strong>에 해당하는 데이터셋을 다운로드 받았다.</p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/a7101126-803d-4678-997b-c692b071a64d/image.png" alt=""></p>
<p>데이터셋을 살펴보면 두개의 문장을 놓고 얼마나 유사한지를 0~5점 사이로 수치화하여 나타내고 있다. </p>
<p>0번 index 문장을 보면 
sentence1 : <strong>A plane is taking off.</strong>
sentence2 : *<em>An air plane is taking off. *</em>
라는 두가지 문장이 있고, 유사도 score은 5점 만점이다.</p>
<p>6번 index 문장을 보면 
sentence1 : <strong>A man is smoking.</strong>
sentence2 : <strong>A man is skating.</strong>
이라는 두가지 문장이 있는데 누가 봐도 다른 문장이다. 그래서 그런지 유사도 score은 0.5점이다. </p>
<p>데이터 폴더 안의 README파일을 확인해보니 텍스트는 뉴스나 캡션(자막), 그리고 포럼이 출처임을 알 수 있었다.
<img src="https://images.velog.io/images/zhenxi_23/post/93e92df9-7da0-47d0-a0af-82ae6810ea9b/image.png" alt=""></p>
<h2 id="sota-모델-소개">SOTA 모델 소개</h2>
<p>두가지의 딥러닝 모델을 다룰 것이다. 기본 <strong>BERT</strong>모델과 GLUE의 STS task에서 현재 기준 랭킹 1위를 달성한 <strong>SMART-RoBERTa Large</strong>모델(SOTA)이다. </p>
<h3 id="bert">BERT</h3>
<p>BERT는 Transformer의 구조를 변형 시켜 만든 사전 학습된 언어 모델이다. 오늘 이야기할 다른 한가지 모델 역시 BERT를 기반으로 하는 모델이므로, 모델에 대해 간단하게 이야기 하고자 한다. </p>
<p>BERT(<strong>B</strong>idirectional <strong>E</strong>ncoder <strong>R</strong>epresentations from <strong>T</strong>ransformers)라는 이름에서도 알 수 있듯이 Transformer의 Ecoder를 <strong>양방향</strong>(Bidirectional)으로 이용하는 모델이다. <a href="https://arxiv.org/pdf/1810.04805v2.pdf">관련 논문 : BERT</a> 
<img src="https://images.velog.io/images/zhenxi_23/post/07474c7d-f3f1-4eba-878f-b1bcfe5121e3/image.png" alt=""></p>
<p>BERT의 구조를 보면 이처럼 임의의 token이 Masked된 문장을 넣어주고 그것을 맞추는 것을 통해 학습을 진행한다. 
input값에는 한문장이 들어갈 경우, token간의 상관관계를 구하겠지만, 만약 두문장이 들어갈 경우, 문장간의 상관관계도 구할 수 있다. 이때 input으로 들어가는 두 문장은 모두 masked sentence이다.</p>
<p><strong>참고</strong>
이미지의 [cls]와 [sep]은 스페셜 token이다.
[cls]는 classification task를 위한 token
[sep]은 문장을 나눠주기 위한 token</p>
<br>

<p>아래 이미지는 STS task에서 BERT를 어떻게 fine-tuning하는지에 대한 정보이다.</p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/1b500f63-90db-4e31-b982-10c8cc42a5da/image.png" alt=""></p>
<p>두개의 문장을 [sep]으로 구분하여 input에 넣어주고, 출력값의 첫번째 token인 [cls]에서 두 문장의 관계를 나타내도록 학습시킨다. </p>
<p>다음은 BERT 논문의 keyword이다. </p>
<ul>
<li>Transformer</li>
<li>Attention</li>
<li>Bidirectional Encoder</li>
<li>Unsupervised</li>
<li>masked token</li>
</ul>
<h3 id="smart-roberta-large">SMART-RoBERTa Large</h3>
<p><img src="https://images.velog.io/images/zhenxi_23/post/723bb8c3-b76a-4b82-9364-5d03d7f82941/image.png" alt=""></p>
<p>해당 모델은 BERT가 응용된 모델로 GLUE의 STS benchmark에서 가장 높은 순위를 차지한 모델이다. <a href="https://arxiv.org/pdf/1911.03437v5.pdf">관련 논문 : SMART-RoBERTa Large</a>
aggressive한 fine-tuning은 모델에게 사전 학습된 지식을 잊게 한다. 이 논문에서는 그에 대한 해결 방안으로 Smoothness-inducing Adversarial Regularization와 Bregman Proximal Point Optimization이 적용된 <strong>SMART-RoBERTa Large</strong> 모델을 제안했다. </p>
<p>사실 이에 대한 정확한 내용은 구체적으로 파악하지 못했으나, 대략 이해한 바로는 fine-tuning 과정에서 사전 학습된 지식을 덜 잃게 하는 효율적인 방향으로 개선된 모델인 것 같다.</p>
<p>BERT와 응용 모델인 <strong>RoBERTa</strong>에 대한 비교는 <a href="https://hryang06.github.io/nlp/BERT/">이곳</a>을 참고 바란다.</p>
<p>다음은 SMART-RoBERTa Large 논문의 keyword이다. </p>
<ul>
<li>Transfer learning</li>
<li>control the extremely high complexity</li>
<li>Smoothness-inducing Adversarial Regularization</li>
<li>prevent aggressive updating</li>
<li>Bregman Proximal Point Optimization</li>
</ul>
<br>


<h1 id="🌈-reference">🌈 Reference</h1>
<ul>
<li><a href="https://machinelearninggeek.com/text-similarity-measures/">텍스트 유사도를 측정하는 방법들</a></li>
<li><a href="https://tmaxai.github.io/post/BERT/#35-fine-tuning-procedure">BERT 논문정리</a></li>
<li><a href="https://paperswithcode.com/sota/semantic-textual-similarity-on-sts-benchmark">paperswithcode STS 벤치마크</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[week1-1] NLP task에 대해 알아보기]]></title>
            <link>https://velog.io/@zhenxi_23/%EC%9B%90%ED%8B%B0%EB%93%9C-%ED%94%84%EB%A6%AC%EC%98%A8%EB%B3%B4%EB%94%A9-week1-1</link>
            <guid>https://velog.io/@zhenxi_23/%EC%9B%90%ED%8B%B0%EB%93%9C-%ED%94%84%EB%A6%AC%EC%98%A8%EB%B3%B4%EB%94%A9-week1-1</guid>
            <pubDate>Mon, 21 Feb 2022 10:09:57 GMT</pubDate>
            <description><![CDATA[<h1 id="📋-개요">📋 개요</h1>
<p><strong>원티드 프리온보딩 ML/DL코스</strong>의 첫번째 날이다. </p>
<p>시작하기앞서, 이번 강의에 참여한 목적에 대해 말하고자 한다. </p>
<ol>
<li>코드스테이츠에서 AI부트캠프를 마치고 확실한 목표를 정했다. NLP엔지니어가 되기로 한 것이다. </li>
<li>위의 부트캠프에서는 팀과 협업할 기회가 적었고, 또한 NLP에 집중한 프로젝트를 할 기회가 적었다. </li>
<li>2번의 아쉬움을 해소할 수 있으면서 현업 데이터를 다뤄볼 기회를 가진 코스는 무조건 참여하는게 좋다고 생각했다 !</li>
<li>길다면 길고 짧다면 짧은 5주인것 같다. 평소에 느꼈던 부족한 부분을 채워나가고, 협업하는 팀원들도과 함께 좋은 성장을 이룰 수 있으면 좋겠다. ☺️</li>
</ol>
<p>오늘 과제의 개요는 다음과 같다. </p>
<blockquote>
<ol>
<li>NLP sub task 2가지 선택</li>
<li>문제 정의 (해결하고자 하는 task는 무엇인가?)</li>
<li>task 해결을 위한 데이터 소개 / 데이터의 구조 설명</li>
<li>SOTA 모델 소개 / 해당 모델 논문의 주요 keyword</li>
</ol>
</blockquote>
<h1 id="✍️-nlp-tasks">✍️ NLP tasks</h1>
<p>선택한 NLP task는 <strong>NER(Named Entity Recognition)</strong>과 <strong>Text Classification</strong>이다. 아직 모르는 것도 많고, 시간도 촉박하여 모델의 structure를 따져보기는 힘들다. 하지만 해당 task를 해결하기 위해 어떤 최신 모델이 있으며, 어떠한 데이터셋을 사용하는지 등을 알아보는 시간을 가질 것이다. </p>
<h2 id="✔️-ner">✔️ NER</h2>
<p>NER은 한국어로 &#39;개체명 인식&#39;이라고도 하는 NLP task이다. 자연어 안에서 정보를 추출해내는 task중에 하나이며, 추출된 정보들은 NLP의 여러 분야에서 사용된다. 대표적으로 chatbot이 있다.</p>
<h3 id="문제-정의">문제 정의</h3>
<p>corpus 안에서 각 개체(Entity)가 어떠한 유형에 속하는지 인식하는 것이 이 task의 목적이다. 
만약 </p>
<p><strong>&#39;zhenxi는 어제 공차에 가서 블랙 밀크티를 마셨다.&#39;</strong></p>
<p>라는 문장이 있다면, 
그 안에서 <strong>zhenxi(사람 이름)</strong>, <strong>어제(시간)</strong>, <strong>공차(장소)</strong>, <strong>블랙 밀크티(음식 이름)</strong>
등의 개체명을 가려낼 수 있다.</p>
<h3 id="task-해결을-위한-데이터-소개">task 해결을 위한 데이터 소개</h3>
<p>작성일 기준 <a href="https://paperswithcode.com/task/named-entity-recognition-ner">paperswithcode</a>에서 NER 부분 가장 상위에 랭킹된 모델이 사용한 데이터 셋을 소개하겠다.</p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/a213fe1a-7675-4401-8c1d-3cb7d12d80b2/image.png" alt="">
해당 이미지는 huggingface에서 제공하는 <a href="https://huggingface.co/datasets/conll2003">CoNLL-2003</a> data set의 프리뷰이다. 
각 열은 token과 해당 문장에 대한 고유 id, 품사 태그(pos_tags), 청크 태그(chunk_tags), 개체명 태그(ner_tags)로 구성된다. 
각 태그는 정수로 맵핑되어 있으며, 어떠한 품사, 청크, 개체명이 어떤 숫자로 매핑되어 있는지는 위에 달아놓은 링크를 참고하면 된다. </p>
<p>한가지 예로 </p>
<pre><code>{
    &quot;chunk_tags&quot;: [11, 12, 12, 21, 13, 11, 11, 21, 13, 11, 12, 13, 11, 21, 22, 11, 12, 17, 11, 21, 17, 11, 12, 12, 21, 22, 22, 13, 11, 0],
    &quot;id&quot;: &quot;0&quot;,
    &quot;ner_tags&quot;: [0, 3, 4, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    &quot;pos_tags&quot;: [12, 22, 22, 38, 15, 22, 28, 38, 15, 16, 21, 35, 24, 35, 37, 16, 21, 15, 24, 41, 15, 16, 21, 21, 20, 37, 40, 35, 21, 7],
    &quot;tokens&quot;: [&quot;The&quot;, &quot;European&quot;, &quot;Commission&quot;, &quot;said&quot;, &quot;on&quot;, &quot;Thursday&quot;, &quot;it&quot;, &quot;disagreed&quot;, &quot;with&quot;, &quot;German&quot;, &quot;advice&quot;, &quot;to&quot;, &quot;consumers&quot;, &quot;to&quot;, &quot;shun&quot;, &quot;British&quot;, &quot;lamb&quot;, &quot;until&quot;, &quot;scientists&quot;, &quot;determine&quot;, &quot;whether&quot;, &quot;mad&quot;, &quot;cow&quot;, &quot;disease&quot;, &quot;can&quot;, &quot;be&quot;, &quot;transmitted&quot;, &quot;to&quot;, &quot;sheep&quot;, &quot;.&quot;]
}</code></pre><p>해당 tokens 중에 <strong>European</strong>에 대해 살펴보면 다음과 같다.</p>
<ul>
<li>pos_tags : 22 : NNP(고유명사)</li>
<li>ner_tags : 3 :  B-ORG(ORG:Organization)</li>
<li>chunk_tags : 12 : I-NP(NP:Noun Phrase)
  (참고로 chunk는 구(Phrase)에 해당한다고 생각하면 쉽다.)</li>
</ul>
<p>이처럼 태그를 달아놓은 토큰들을 학습하여 NER 작업을 할 수 있다.</p>
<p>추가로, 한국어로 된 dataset도 찾아보았다. </p>
<p>이 역시 hugging face에서 찾은 <a href="https://huggingface.co/datasets/kor_ner">kor_ner</a> dataset이다.</p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/3cc59d58-4b45-4333-adb3-6d7c5b8a380e/image.png" alt=""></p>
<p>전체 text 문장과, annotated text가 추가된 것을 제외하면 위의 dataset과 비슷한 양상이다. 자세한 것은 링크를 참고하면 된다.</p>
<h3 id="sota-모델-소개">SOTA 모델 소개</h3>
<p><img src="https://images.velog.io/images/zhenxi_23/post/6983ec65-a23b-401e-889d-de2909d8cbd3/image.png" alt="">
<strong>ACE + document-context</strong>은 알리바바 그룹에서 발표한 논문 <a href="https://arxiv.org/pdf/2010.05006v4.pdf">Automated Concatenation of Embeddings for Structured Prediction</a>에서 제안한 모델이다.
<img src="https://images.velog.io/images/zhenxi_23/post/ba028481-9546-45f3-9aad-382983195ad1/image.png" alt="">
위 이미지에서 보는 바와 같이 NER이나, tagging, Chunking 등의 작업에서 극 상위권을 차지하고 있다. </p>
<p>논문에 작성된 주요 keyword는 다음과 같다. </p>
<ul>
<li>Automated Concatenation of Embeddings (ACE)</li>
<li>neural architecture search (NAS)</li>
<li>Transformer</li>
<li>LSTM</li>
<li>embedding concatenations</li>
</ul>
<h2 id="✔️-text-classification">✔️ Text Classification</h2>
<p>말그대로 text를 정해진 category에 분류하는 NLP task이다. NLP의 sebtask중 가장 큰 갈래라고도 생각하여 해당 task에 대해 알아보기로 하였다. 
(classification 문제에 대해서는 정말 클래식한 모델을 주로 사용해온지라, 최신 딥러닝 모델이 뭐가 있는지 궁금하기도 했다.) </p>
<h3 id="문제-정의-1">문제 정의</h3>
<p>사실 위에서 설명한 것이 다이다. target이 되는 category는 선택한 문제와 dataset에 따라 달라진다. 
예를 들어 메일이 스팸인지 스팸이 아닌지 분류하는 이진 분류 task가 있을 수 있고, 
영화 줄거리를 보고 해당 영화가 어떠한 장르인지 분류하는 task가 있을 수 있다. </p>
<h3 id="task-해결을-위한-데이터-소개-1">task 해결을 위한 데이터 소개</h3>
<p>이 역시 작성일 기준 <a href="https://paperswithcode.com/task/text-classification">paperswithcode</a>에서 NER 부분 가장 상위에 랭킹된 모델이 사용한 데이터 셋을 소개하겠다. </p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/97f5aadf-8b5d-41bc-a260-346c54430f7d/image.png" alt="">
해당 이미지는 Kaggle에 등록된 <a href="https://www.kaggle.com/amananandrai/ag-news-classification-dataset">AG News</a> dataset의 프리뷰이다. 
3개의 열로 구성되어 있고, 뉴스 기사에 대한 <strong>class index</strong>와 기사의 <strong>title</strong>, <strong>description</strong>으로 구성되어 있다. 
class는 1:World, 2:Sports, 3:Business, 4: Sci/Tech 총 4개이다. 
그럼 이 데이터로 어떻게 classification을 진행했는지 살펴보자.</p>
<h3 id="sota-모델-소개-1">SOTA 모델 소개</h3>
<p><img src="https://images.velog.io/images/zhenxi_23/post/dcc919fa-44f0-4eb8-bcfe-635d24c3bf87/image.png" alt=""></p>
<p>XLNet은 <a href="https://arxiv.org/pdf/1906.08237v2.pdf">XLNet: Generalized Autoregressive Pretraining for Language Understanding</a>에서 제안한 모델이다. </p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/fd6f5c12-0d0e-4e8f-bfaf-f3ea12d9524a/image.png" alt=""><img src="https://images.velog.io/images/zhenxi_23/post/f5e4f335-b2af-410a-863c-529a00c73fd0/image.png" alt=""></p>
<p>해당 모델은 이처럼 text classification 뿐만 아니라 다른 task에서도 매우 높은 성능을 보인다. XLNet은 BERT에서 사용되는 AE(auto-encoder)과 GPT에서 사용되는 AR(auto-regressive)의 장점만을 결합해 만든 모델로, 논문에 따르면 20개의 task(question answering, sentiment analysis 등)에 대해서 BERT보다 큰 폭으로 능가했다.</p>
<p>논문에 작성된 주요 keyword는 다음과 같다. </p>
<ul>
<li>AR(auto-regressive)</li>
<li>AE(auto-encoder)</li>
<li>BERT</li>
<li>Transformer</li>
<li>masking</li>
</ul>
<h1 id="🌈-reference">🌈 Reference</h1>
<ol>
<li><a href="https://pigranya1218.tistory.com/entry/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Neural-Architecture-Search-with-Reinforcement-Learning">NAS 모델 논문 리뷰</a></li>
<li><a href="https://blog.naver.com/PostView.naver?blogId=tlqordl89&amp;logNo=221827176515&amp;parentCategoryNo=&amp;categoryNo=20&amp;viewDate=&amp;isShowPopularPosts=true&amp;from=search">AE와 AR</a></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[git] 잘못된 위치에 .git 생성 (feat. VSCode 5K) ]]></title>
            <link>https://velog.io/@zhenxi_23/git-%EC%9E%98%EB%AA%BB%EB%90%9C-%EC%9C%84%EC%B9%98%EC%97%90-.git-%EC%83%9D%EC%84%B1-feat.-VSCode-5K</link>
            <guid>https://velog.io/@zhenxi_23/git-%EC%9E%98%EB%AA%BB%EB%90%9C-%EC%9C%84%EC%B9%98%EC%97%90-.git-%EC%83%9D%EC%84%B1-feat.-VSCode-5K</guid>
            <pubDate>Thu, 16 Sep 2021 16:16:52 GMT</pubDate>
            <description><![CDATA[<p>오늘 오전, 호기롭게 터미널을 켜서 Desktop 위치에서 code . 을 실행했다.</p>
<p>그 결과....</p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/4b882551-56cd-4994-a7f0-9ea3752fcebf/%E1%84%86%E1%85%AE%E1%84%89%E1%85%AE%E1%84%92%E1%85%B5%20%E1%84%86%E1%85%A1%E1%86%AD%E1%84%8B%E1%85%B3%E1%86%AB...png" alt=""></p>
<p><em>무수히 많은 git의 요청이...!</em></p>
<p>이런 경우에는 당황하지 말고, <strong>내가 파일이 너무 많은 곳에 .git 파일을 생성해서 이 사단이 났구나..</strong> 하고 생각한다. </p>
<h1 id="해결법">해결법</h1>
<p><img src="https://images.velog.io/images/zhenxi_23/post/5c90e2b4-7941-4d52-b93a-174572d10df4/%E1%84%90%E1%85%A5%E1%84%86%E1%85%B5%E1%84%82%E1%85%A5%E1%86%AF.png" alt=""></p>
<pre><code>git rev-parse --show-toplevel # git repository root 확인(경로)
cd /해당 경로 # .git 이 잘못로 이동
ls -a # .git 파일이 있는지 확인
rm -r -f .git # .git 파일 삭제</code></pre><p><img src="https://images.velog.io/images/zhenxi_23/post/2796d4d8-b5de-4ad3-8fb4-5d780bf1a310/%E1%84%86%E1%85%AE%E1%84%8C%E1%85%A6.png" alt="">
아니나 다를까, Desktop에 떡하니 위치한 .git 파일.. 당장 지워줬다.</p>
<p>이것들을 다 실행하고 다시 동기화 하여 vscode를 확인해보니</p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/f75b195a-d456-4947-9c8f-f28d7333c44e/%E1%84%92%E1%85%A2%E1%84%80%E1%85%A7%E1%86%AF!.png" alt=""></p>
<p>깔끔하게 해결됐다 <del>.</del></p>
<h1 id="reference">Reference</h1>
<p><a href="https://seanlion.github.io/blog/25">https://seanlion.github.io/blog/25</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 210908]]></title>
            <link>https://velog.io/@zhenxi_23/TIL-210908</link>
            <guid>https://velog.io/@zhenxi_23/TIL-210908</guid>
            <pubDate>Wed, 08 Sep 2021 15:44:50 GMT</pubDate>
            <description><![CDATA[<p>Section review</p>
<h1 id="sprint-1">sprint 1</h1>
<ul>
<li>지도학습 vs 비지도학습</li>
<li>비지도 학습 (target값이 없음), 딥러닝과 연계해서 많이 발전 중 </li>
<li>linear regression</li>
<li>Regression : 성능은 안좋지만 과적합이 안된다는 장점</li>
<li>Regularization (Ridge, Lasso)</li>
<li>classifivation </li>
<li>baseline</li>
<li>one-hot encoding (high cardinality일 경우, 너무 많은 colunm을 생성함) </li>
<li>train/validation/test set 나누기</li>
</ul>
<h1 id="sprint-2">sprint 2</h1>
<ul>
<li>Decision tree (분류, 회귀 모두 사용 가능, 앙상블의 기본 모델로 많이 사용)</li>
<li>pipeline (sklearn에서 데이터를 처리하는 component를 연속적으로 처리할 수 있는 기능)</li>
<li>ensemble 머신러닝 모델들을 조합하여 만듦 (stacking이라는 방법 한번 보기)</li>
<li>평가지표 </li>
<li>cross-validation (overfitting을 통해 과적합이 일어났는지 확인, 모델의 신뢰도 up)</li>
<li>hyperparameter tuning (random serch, grid serch, 하이퍼파라미터를 직접 조절하면서 어떤 기능을 하는지 익힐 필요가 있음)</li>
</ul>
<h1 id="sprint-3">sprint 3</h1>
<ul>
<li>모델에 대한 시나리오를 짜기 전에 이러한 workflow를 확인</li>
<li>leakage( 예측을 해야하는 시점에 데이터를 잘 모르고 있는 경우에 발생) 튜닝도 안하고 그냥 간단하게 돌렸는데, 성능이 너무 좋다 -&gt; 누수의 가능성 있음</li>
<li>imbalanced data(undersampling, oversampling, class weight 조절)</li>
<li>data wrangling</li>
<li>boosting model (tree ensemble)</li>
<li>feature importances(permutaion importance 등..)</li>
<li>PDP</li>
<li>SHAP</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 210824]]></title>
            <link>https://velog.io/@zhenxi_23/TIL-210824</link>
            <guid>https://velog.io/@zhenxi_23/TIL-210824</guid>
            <pubDate>Tue, 24 Aug 2021 14:03:23 GMT</pubDate>
            <description><![CDATA[<h1 id="오늘-한-일">오늘 한 일</h1>
<ul>
<li>n231 학습 </li>
<li>직접 데이터 셋을 찾고, 문제 (target data) 정하기, 어떤 모델로 할지 선택(분류 or 회귀), 모델에 맞는 평가지표 선택 </li>
</ul>
<h2 id="keyword-">keyword :</h2>
<ul>
<li><p>데이터 누수(leakage) :</p>
<ul>
<li>타겟 변수와 비슷한 변수가 훈련 데이터에 포함된 경우 </li>
<li>훈련데이터와 검증데이터를 완전히 분리하지 못했을 경우</li>
</ul>
</li>
<li><p>정규표현식 re</p>
</li>
<li><p>평가지표 선택</p>
</li>
</ul>
<ol>
<li>분류 : 타겟 클래스 비율이 70퍼 이상 차이날 경우 (불균형) 정확도 뿐만 아니라, 정밀도, 재현율, ROC curve, AUC 등을 같이 사용하여야 함 </li>
<li>회귀 : MAE, MSE, RMSE, MAPE, MPE</li>
</ol>
<ul>
<li>불균형 클래스 </li>
</ul>
<ol>
<li>분류 : scikit-learn의 분류기에는 class_weight같은 클래스의 밸런스를 맞춰주는 파라미터를 가지고 있음(가중치를 조절해주는 것), class_weight=&#39;balance&#39;, oversampling, undersampling</li>
<li>회귀 : 타겟 분포를 잘 살필 것. 정규분포의 모양일때 좋은 성능을 보임. mean 값이 왼쪽으로 치우친 경우 negatively skewed,mean 값이 오른쪽으로 치우친 경우 positively skewed, 이상치제거, 로그변환(np.log1p&lt;-&gt;np.expm1)</li>
</ol>
<p>참고 코드)</p>
<pre><code>t = TransformedTargetRegressor(regressor=pipe,
                              func=np.log1p,
                              inverse_func=np.expm1)
</code></pre><p>func - 변환하고자 하는 함수 지정, 로그변환해준다 
inverse_func - 다시 꺼낼때는 오리지널로 돌아간것이 나온다 (원본 데이터와 스케일이 맞춰진 데이터가 나온다는 뜻)</p>
<h2 id="데이터-과학지의-실무-프로세스">데이터 과학지의 실무 프로세스</h2>
<ol>
<li>비즈니스 문제<ul>
<li>실무자들과 대화를 통해 문제를 발견 (ex) 초콜릿바 평점 데이터 - 어떤 요소가 초콜릿의 평점에 영향을 미치는가 등..)</li>
</ul>
</li>
<li>데이터 문제<ul>
<li>문제와 관련된 데이터를 발견</li>
</ul>
</li>
<li>데이터 문제 해결<ul>
<li>데이터 처리, 시각화</li>
<li>머신러닝/통계</li>
</ul>
</li>
<li>비즈니스 문제 해결<ul>
<li>데이터 문제 해결을 통해 실무자들과 함께 해결</li>
</ul>
</li>
</ol>
<h2 id="가설-세우는-법-예시">가설 세우는 법 예시</h2>
<p>하이퍼 파라미터 가 다른 모델 중에 모델 a가 더 효율이 좋을 것 이다. 
평가지표들중에 어느게 더 나을 것이다 
등등 
가설검정 실패해도 상관없으니 자신만의 논리를 펼쳐보자!</p>
<h1 id="내일-할-일-">내일 할 일 :</h1>
<ul>
<li>n232 학습 (Data Wrangling)</li>
<li>과제가 일찍 끝날 경우, 오늘 선택한 데이터셋 전처리와 간단한 모델 만들어서 돌려보기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 210820]]></title>
            <link>https://velog.io/@zhenxi_23/TIL-210820</link>
            <guid>https://velog.io/@zhenxi_23/TIL-210820</guid>
            <pubDate>Mon, 23 Aug 2021 15:08:32 GMT</pubDate>
            <description><![CDATA[<h1 id="오늘-한-일">오늘 한 일</h1>
<ul>
<li>Model selection (n224)</li>
</ul>
<h2 id="keyword-">keyword :</h2>
<ul>
<li>모델 선택</li>
<li>하이퍼파라미터 최적화 (최적의 하이퍼파라미터 찾기)</li>
<li>CV 교차검증</li>
<li>hold-out 교차검증</li>
<li>K-Fold</li>
<li>TargetEncoder</li>
<li>GridSearchCV</li>
<li>RandomizedSearchCV</li>
<li>최적화와 일반화의 차이</li>
<li>class_weight (불균형(imbalanced) 클래스인 경우, randomforest에서 사용)</li>
<li>임계값 조절은 모델 만들고 마지막에 </li>
<li>우선 cv값은 5~10 정도로</li>
<li>Grid &amp; Random serch CV
하이퍼 파라미터 설정한 변수내에서 그리드 서치는 변수내 모든 조합을 살펴보고, 랜덤 서치는 랜덤한 조합을 살펴봐서 최적하이퍼 파라미터를 찾습니다.</li>
</ul>
<h1 id="refrence-">refrence :</h1>
<p>분류, 회귀 모델 성능 평가지표
<a href="https://www.youtube.com/watch?v=O-AhNAU6WlY">https://www.youtube.com/watch?v=O-AhNAU6WlY</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 210823]]></title>
            <link>https://velog.io/@zhenxi_23/TIL-210823</link>
            <guid>https://velog.io/@zhenxi_23/TIL-210823</guid>
            <pubDate>Mon, 23 Aug 2021 15:01:24 GMT</pubDate>
            <description><![CDATA[<h1 id="오늘-한-것">오늘 한 것</h1>
<ul>
<li>테크니컬 글쓰기 특강 듣기 </li>
<li>sprint challenge</li>
<li>인프런 ROC, AUC 강의 끝까지 다 듣기  </li>
</ul>
<h2 id="sprint-wrap-up-">sprint wrap up :</h2>
<h2 id="n221">n221</h2>
<p>트리모델과 선형모델을 비교해봤을때 어떤점이 더 좋았나요?</p>
<ul>
<li>간결하다 </li>
<li>원핫인코딩보다 오디널 인코딩 쓸 수 있어서 좋았다</li>
<li>표준화 안해도 되서 좋았다 </li>
<li>특성선택을 알아서 해줘서 편하다</li>
</ul>
<p>트리모델이 가지고 있는 단점은 뭐라고 생각하나요?</p>
<ul>
<li>과적합이 되기 쉽다</li>
<li>하이퍼파라미터가 선형회귀보다 많다</li>
<li>변수 영향력이 선형회귀에 비해 해석이 어렵다</li>
<li>데이터가 아주 적을때는 학습이 어렵다</li>
</ul>
<p>기타 </p>
<ul>
<li>사이킷런 Pipelines</li>
<li>지니불순도 (트리를 만드는 기준)</li>
<li>엔트로피 (트리를 만드는 기준)</li>
<li>특성상호작용 (트리모델에서는 상호작용이 의미가 없어진다?) ❓
선형모델은 각 feature가 독립적이여야 결과가 잘 나온다. 하지만 트리모델에서는 아니다! (노트 다시 확인해보기)</li>
</ul>
<h2 id="n222">n222</h2>
<ul>
<li>랜덤포레스트 (실무에서도 많이 사용할 중요한 알고리즘이다!)</li>
<li>앙상블 모델에서는 전체의 트리의 모양은 확인 할 수 없다. 따라서 어떻게 이런 결과를 내는지 알 수 없다. (블랙박스 모델)</li>
<li>배깅 : 부트스트랩한 데이터를 가지고 모델을 돌리고서 결과를 합친다</li>
<li>oobscore은 샘플이 적을때 유용하다!</li>
<li>ordinal Encoding</li>
<li>과적합 -&gt; 새로운 데이터에 대한 분류에 약함 / 랜덤성 -&gt; 학습을 다양한 방법으로 하면서 새로운 데이터에 대한 학습에도 편향을 줄여주는? 역할을 하는거같아요</li>
</ul>
<h2 id="n223">n223</h2>
<ul>
<li>베타값이 올라갈 수록 recall값에 가중치를 줌</li>
</ul>
<h2 id="n224">n224</h2>
<p>(..)</p>
<h1 id="내일-할-것">내일 할 것</h1>
<ul>
<li>새 스프린트 시작</li>
</ul>
<h1 id="🤚-완료하지-못한-것들">🤚 완료하지 못한 것들</h1>
<ul>
<li>블로그 정리 (precision, recall, 임계값)</li>
<li>깃허브 커밋하는 과정 한번 찾아보기 </li>
<li>decision tree 강의 듣기 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 210819]]></title>
            <link>https://velog.io/@zhenxi_23/TIL-210819</link>
            <guid>https://velog.io/@zhenxi_23/TIL-210819</guid>
            <pubDate>Thu, 19 Aug 2021 15:39:01 GMT</pubDate>
            <description><![CDATA[<h1 id="오늘-한-일">오늘 한 일</h1>
<ul>
<li>Evaluation Metrics for Classification 공부</li>
</ul>
<h2 id="keyword-">keyword :</h2>
<ul>
<li>분류문제 평가지표</li>
<li>confusion matrix 사이킷런에 plot_cofusion_matrix 축과 순서를 유의해서 보기!</li>
<li>임계값 (threshold)</li>
<li>정밀도</li>
<li>재현율</li>
<li>위양성률</li>
<li>ROC</li>
<li>ROC curve (이진분류문제에서 사용)</li>
<li>AUC</li>
<li>산술평균, 조화평균(harmonic mean)</li>
<li>The F-beta Score (f-score에서 beta 값은 기본 1로 설정되어 있다)</li>
</ul>
<h2 id="refrence-">refrence :</h2>
<p><a href="https://jerimo.github.io/python/confusion-matrix/">https://jerimo.github.io/python/confusion-matrix/</a>
confusion-matrix plot 만들기 
<a href="https://gggggeun.tistory.com/17?category=977609">https://gggggeun.tistory.com/17?category=977609</a>
<a href="https://injo.tistory.com/13">https://injo.tistory.com/13</a>
전반적 개념 (임계값 조절에 참고)</p>
<h1 id="내일-할-일">내일 할 일</h1>
<ul>
<li>교차검증(CV) 공부</li>
<li>오늘 못한 과제 마지막 문제 풀기 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 210816]]></title>
            <link>https://velog.io/@zhenxi_23/TIL-210816</link>
            <guid>https://velog.io/@zhenxi_23/TIL-210816</guid>
            <pubDate>Mon, 16 Aug 2021 15:16:17 GMT</pubDate>
            <description><![CDATA[<h1 id="오늘-한-일">오늘 한 일</h1>
<ul>
<li>ridge regression 복습 및 정리</li>
</ul>
<h1 id="내일-할-일">내일 할 일</h1>
<ul>
<li><input disabled="" type="checkbox"> Section2 Sprint1 공부</li>
<li><input disabled="" type="checkbox"> 8시 기상 (logistic regression 실습해보고 kaggle 제출하기)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Ridge regression(릿지회귀)]]></title>
            <link>https://velog.io/@zhenxi_23/Ridge-regression%EB%A6%BF%EC%A7%80%ED%9A%8C%EA%B7%80</link>
            <guid>https://velog.io/@zhenxi_23/Ridge-regression%EB%A6%BF%EC%A7%80%ED%9A%8C%EA%B7%80</guid>
            <pubDate>Mon, 16 Aug 2021 08:41:52 GMT</pubDate>
            <description><![CDATA[<h1 id="과적합을-해결하는-방법">과적합을 해결하는 방법</h1>
<p>과적합(overfitting)을 해결하는 방법으로는 크게 두가지가 있다. </p>
<blockquote>
<ol>
<li>특성의 갯수를 줄이기 
주요특징을 직접 선택 or model selection algorithm 사용</li>
<li>정규화를 수행하기 
모든 특성을 사용, 하지만 파라미터의 값을 줄인다.</li>
</ol>
</blockquote>
<p>여기서 <strong>릿지 회귀</strong>가 바로 <strong>정규화</strong>를 위한 회귀모델이라고 할 수 있다. (정규화를 위한 회귀모델 중, Lidge 외에 Lasso, Elastic Net회귀모형 등이 있다.)</p>
<blockquote>
<p>$\beta_{ridge}$: $argmin[\sum_{i=1}^n(y_i - \beta_0 - \beta_1x_{i1}-\dotsc-\beta_px_{ip})^2 + \lambda\sum_{j=1}^p\beta_j^2]$<br>n: 샘플수, p: 특성수, $\lambda$: 튜닝 파라미터(패널티) </p>
</blockquote>
<p>참고: alpha, lambda, regularization parameter, penalty term 모두 같은 뜻</p>
<p>위 식을 보면 OLS(최소제곱회귀) + 람다(λ)가 붙은 식으로 구성되어 있다!
이 람다값이 바로 튜닝 파라미터이다.
람다값을 조절함으로써 정규화를 수행할 수 있는 것이다.</p>
<p>우선 나는 수알못이기때문에 수식에 대해서는 이렇게만 이해하고 여기서 찾을 수 있는 람다값의 성질에 대해 말해보자. </p>
<h1 id="람다값λ의-성질">람다값(λ)의 성질</h1>
<blockquote>
<p>$\lambda$ → 0, $\beta_{ridge}$ → $\beta_{OLS}$
$\lambda$ → ∞, $\beta_{ridge}$ → 0.</p>
</blockquote>
<p>람다값이 0이 된다면 어떻게 될까?
OLS와 같은 모양이 될 것이다. 아까 위의 식을 보면 더 쉽게 이해 할 수 있을 것이다. </p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/fd41e5c7-e2a1-400d-96b6-20cffa1cbfc5/%E1%84%85%E1%85%B5%E1%86%BA%E1%84%8C%E1%85%B5%20ols.png" alt=""><img src="https://images.velog.io/images/zhenxi_23/post/7f10658e-0576-40a7-8d2c-56bad5896082/%E1%84%85%E1%85%B5%E1%86%BA%E1%84%8C%E1%85%B5%200.0.png" alt=""></p>
<p>람다(알파)값이 0.0일때 OLS와 같은 그래프가 나왔다.</p>
<p>람다는 값이 커질루록 회귀계수들을 0으로 수렴시킨다. 이것은 덜 중요한 특성들을 0에 가깝게 수렴시켜 중요한 특성들이 비교적 돋보이게 해준다! 특성을 아예 없애버리진 않지만, 특성의 개수를 줄이는 효과를 냄으로써 과적합을 피할 수 있는 것이다. 다만 값이 너무 커져버린다면, 직선의 기울기가 0에 가까워지고 과소적합이 되어버린다. 아래의 그래프를 참고하자.</p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/0215ccea-4095-49a6-a076-19e48237e756/%E1%84%85%E1%85%B5%E1%86%BA%E1%84%8C%E1%85%B5%20%E1%84%80%E1%85%B5%E1%84%8B%E1%85%AE%E1%86%AF%E1%84%80%E1%85%B5%20%E1%84%8C%E1%85%A1%E1%86%A8%E1%84%8B%E1%85%A1%E1%84%8C%E1%85%B5%E1%86%B7.png" alt=""></p>
<h1 id="최적의-람다값λ-검증---ridgecv">최적의 람다값(λ) 검증 - RidgeCV</h1>
<p>그렇다면 최적의 람다(알파값)는 어떻게 찾아낼 수 있을까? -&gt; 찾아내기 보다는,, 알파값을 입력하여 RidgeCV로 최적의 람다값을 검증 할 수 있다.</p>
<pre><code>from sklearn.linear_model import RidgeCV

alphas = [0.01, 0.05, 0.1, 0.2, 1.0, 10.0, 100.0]

ridge = RidgeCV(alphas=alphas, normalize=True, cv=3)
ridge.fit(ans[[&#39;x&#39;]], ans[&#39;y&#39;])
print(&quot;alpha: &quot;, ridge.alpha_)
print(&quot;best score: &quot;, ridge.best_score_)</code></pre><pre><code>alpha:  0.2
best score:  0.4389766255562206</code></pre><p>다음은 최적의 람다값으로 그린 그래프이다. 다음 Ridge 회귀 직선의 생김새는 OLS와 매우 비슷하지만 이상치(outlier) 영향을 덜 받는다. 정규화에 어느정도 성공한 거라고 할 수 있다. </p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/40d27aa8-a715-4a36-988b-8f808c8e411a/best%20%E1%84%8B%E1%85%A1%E1%86%AF%E1%84%91%E1%85%A1%E1%84%80%E1%85%A1%E1%86%B9.png" alt=""></p>
<h1 id="결론">결론</h1>
<p>릿지회귀를 이용하여 모델을 만들면 나중에 testdata를 돌릴때 발생할 수 있는 overfitting문제를 해결 할 수 있다. </p>
<h1 id="reference">Reference</h1>
<p><a href="https://wooono.tistory.com/249">feature selection</a>
<a href="https://velog.io/@yuns_u/Ridge-Regression">정규화와 ridge회귀</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 210815]]></title>
            <link>https://velog.io/@zhenxi_23/TIL-210815</link>
            <guid>https://velog.io/@zhenxi_23/TIL-210815</guid>
            <pubDate>Sun, 15 Aug 2021 13:44:53 GMT</pubDate>
            <description><![CDATA[<h1 id="오늘-한-일">오늘 한 일</h1>
<ul>
<li>linear regression 복습</li>
<li>분산, 편향, 과적합, 과소적합 개념 블로그 정리</li>
<li>밥 잘챙겨먹음!</li>
</ul>
<h1 id="내일-할-일">내일 할 일</h1>
<ul>
<li><input checked="" disabled="" type="checkbox"> ridge regression 정리</li>
<li><input disabled="" type="checkbox"> note logistic regression 캐글 제출하기</li>
<li><input disabled="" type="checkbox"> 머신러닝 프로세스에 대해 한번 정리해보기</li>
<li><input disabled="" type="checkbox"> (시간이 남을 경우) 도전과제 풀기 </li>
</ul>
<br>
<br>

<h1 id="🐹">🐹</h1>
<p>블로그 정리하는건 쉬운 일이 아니라는 것을 깨달았다..! 
부트캠프를 처음 시작했을때는 마음이 힘들었는데 요즘은 오히려 재밌다는 생각이 든다. </p>
<p>요즘 여러 블로그를 보면서 프로젝트를 하는 과정에 대해 탐색하고 있다. 완성된 플젝이 블로그에 예쁘게 정리되어 있는 것을 볼때마다 너무 멋지다는 생각밖에 안든다..!! (물론, 저 결과를 내기까지 정말 다들 고생하시겠지만,,)</p>
<p>나는 부트캠프에서의 프로젝트 한번을 제외하면 아직 제대로 된 프로젝트는 해본 경험이 없다. 심지어 첫 프로젝트때 본가에 있었어서 제대로 못한게 너무 아쉬웠다. 다음 플젝때는 조금더 완성도 높은 결과를 내고 싶다..!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ML] Overfitting, Underfitting]]></title>
            <link>https://velog.io/@zhenxi_23/ML-Overfitting-Underfitting</link>
            <guid>https://velog.io/@zhenxi_23/ML-Overfitting-Underfitting</guid>
            <pubDate>Sun, 15 Aug 2021 12:49:41 GMT</pubDate>
            <description><![CDATA[<p>🤚 [참고] 아직 ML에 입문한지 한달밖에 안된 머린이가 복습을 위해 &#39;자신만의 언어로&#39; 정리한 글입니다.🤚</p>
<br>
이번 sprint에서 Overfitting(과적합)에 대해 배웠다. 분산(variance)라던지, 편향(bias)이라던지, 분산편향트레이드오프(!)라던지 조금 복잡해 보이는 용어들이 나와 참 와닿지 않은 파트였다. 그래서 블로그에 정리하며 한번더 개념을 다잡아보고자 한다.


<blockquote>
<p>목표는 <strong>일반화의 관점에서 오버피팅과 언더피팅을 설명해보자!</strong> 이다.</p>
</blockquote>
<p>무턱대고 이렇게 말하면 조금 막막한 감이 없잖아 있지만, 흐름에 따라 한번 개념들을 알아가보면, 이 글의 끝에서는 <em>이게 되네?</em> 의 기적을 경험할 것이다. </p>
<p>본격적으로 오버피팅에 대해 알아보기 전에, 우선 <strong>편향과 분산</strong>에 대한 개념을 알고 있는 것이 좋다. </p>
<h1 id="1-편향과-분산">1. 편향과 분산</h1>
<h2 id="11-편향이란">1.1 편향이란?</h2>
<p>나는 train 데이터(파란점들)로 회귀선을 만들고자 한다. 어떠한 선을 만드는 것이 좋을까? (그림 출처 StatQuest!!!)
<img src="https://images.velog.io/images/zhenxi_23/post/c4c9098a-c12b-4be7-acd4-88e6082efd09/%E1%84%87%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%8B%E1%85%A5%E1%84%89%E1%85%B3%20%E1%84%8B%E1%85%B5%E1%84%80%E1%85%A5!!.png" alt="">
왼쪽의 그래프를 보면 직선 회귀선이 모든 데이터를 정확하게 지난다고 할 수 있을까? 아니다. 보다싶이, 선과 데이터간 떨어진 거리의 합이 구불선보다 훨씬 크다. </p>
<p>여기서 우리는 편향의 개념에 대해 말할 수 있다. </p>
<blockquote>
<p>편향이란 회귀선이 데이터들을 얼마나 잘 맞추고 있는지를 말한다. </p>
</blockquote>
<p>편향이 작을수록 회귀선이 데이터를 잘맞추고, 클수록 잘 못맞춘다. (데이터에 대한 이해도로 생각하면 편향이 작을수록 이해도가 높고, 편향이 클수록 이해도가 낮다.)</p>
<p>고로, 
직선의 경우, 편향이 크고
구불선의 경우, 편향이 작았다.</p>
<p>그럼 편향이 작은 오른쪽 회귀가 좋은 것일까?
<strong>우리는 지금 train data에 대한 편향만 보았다는 사실을 잊어선 안된다. (아직 test data가 남았죠..)</strong></p>
<h2 id="22-분산이란">2.2 분산이란?</h2>
<p><img src="https://images.velog.io/images/zhenxi_23/post/31f9e934-6c70-408a-a713-f36a081b8218/%E1%84%92%E1%85%A1%E1%84%8C%E1%85%B5%E1%84%86%E1%85%A1%E1%86%AB%20%E1%84%8B%E1%85%AE%E1%84%85%E1%85%B5%E1%84%82%E1%85%B3%E1%86%AB%20%E1%84%90%E1%85%B3%E1%84%85%E1%85%A6%E1%84%8B%E1%85%B5%E1%84%82%E1%85%B5%E1%86%BC%20%E1%84%89%E1%85%A6%E1%86%BA%E1%84%8B%E1%85%B5%20%E1%84%8B%E1%85%B5%E1%86%BB%E1%84%8C%E1%85%B5%20%E1%84%8B%E1%85%A1%E1%86%AD%E1%84%8B%E1%85%B3%E1%86%AB%E1%84%80%E1%85%A1.png" alt=""></p>
<p>위 사진을 보면 아까의 파란 점을 제외한 초록점이 바로 test data이다. 아까의 회귀선에 test data가 뿅하고 생기니깐 바로 문제가 생긴다. </p>
<p>바로 train에서 너무 잘 맞았던 오른쪽 구불 회귀선이 test data에서는 영 힘을 쓰지 못한다는 것이다. (오히려 왼쪽 직선 회귀선이 두개의 데이터셋을 놓고 봤을때 더 나은 것처럼 보인다.)</p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/ae43c215-ddde-4cb6-baca-302ddf1237e4/%E1%84%87%E1%85%AE%E1%86%AB%E1%84%89%E1%85%A1%E1%86%AB1111.png" alt=""></p>
<p>우리는 여기서 분산이 어떤 것인지 알 수 있다. </p>
<blockquote>
<p>train 데이터와, test 데이터 사이의 차이. 이것이 바로 분산!</p>
</blockquote>
<p><img src="https://images.velog.io/images/zhenxi_23/post/f35258db-a65d-45b8-84f8-838ce52f513f/%E1%84%91%E1%85%A7%E1%86%AB%E1%84%92%E1%85%A3%E1%86%BC%E1%84%87%E1%85%AE%E1%86%AB%E1%84%89%E1%85%A1%E1%86%AB%20.png" alt="">
<img src="https://images.velog.io/images/zhenxi_23/post/615c1850-3a5e-46e2-9415-da46ef5aad49/%E1%84%91%E1%85%A7%E1%86%AB%E1%84%92%E1%85%A3%E1%86%BC%E1%84%87%E1%85%AE%E1%86%AB%E1%84%89%E1%85%A1%E1%86%AB2.png" alt=""></p>
<p>그렇다면 이 두개의 dataset에서 분산이 큰 그래프는 무엇일까?
그렇다, train데이터에서는 완벽하게 들어맞았지만, test데이터에서는 영 힘을 못쓰던 구불선이다. 직선 회귀선은 비교적 분산이 작다고 할 수 있다. </p>
<p>그럼 우리는 여기서 하나의 결론에 다다를 수 있다. </p>
<blockquote>
<p>편향이 클수록 분산은 작아지고,
편향이 작을 수록 분산은 커진다. </p>
</blockquote>
<p>이를 우리는 <strong>분산편향트레이드오프</strong>라고 한다.
이해가 안되면 먼저 train 그래프에서 어떤 것이 작은지 살펴보고, test데이터에서 어떤 것이 분산이 큰지 살펴보면 바로 감이 올 것이다.(혹은 반대로 살펴봐도 무방하다.)</p>
<p>이제 오버피팅과 언더피팅에 대해 알아볼 차례이다. 하지만 놀랍게도 우리는 위에서 분산과 편향에 대해 알아보며 오버피팅의 개념에 대해 이미 접근했다!</p>
<h1 id="2-오버피팅과-언더피팅">2. 오버피팅과 언더피팅</h1>
<p><img src="https://images.velog.io/images/zhenxi_23/post/f35258db-a65d-45b8-84f8-838ce52f513f/%E1%84%91%E1%85%A7%E1%86%AB%E1%84%92%E1%85%A3%E1%86%BC%E1%84%87%E1%85%AE%E1%86%AB%E1%84%89%E1%85%A1%E1%86%AB%20.png" alt="">
<img src="https://images.velog.io/images/zhenxi_23/post/615c1850-3a5e-46e2-9415-da46ef5aad49/%E1%84%91%E1%85%A7%E1%86%AB%E1%84%92%E1%85%A3%E1%86%BC%E1%84%87%E1%85%AE%E1%86%AB%E1%84%89%E1%85%A1%E1%86%AB2.png" alt=""></p>
<p>아까 분산과 편향을 설명할때 썼던 그래프를 다시 보자. </p>
<p>우선, 오른쪽의 구불 회귀선을 보자. 
구불 회귀선은 아까의 train 데이터에서 너무나도 fit된, 곧 편향이 작은 회귀선이었다. 하지만 test데이터에서는 어떤가? 완전히 제 구실을 하고 있지 않다. </p>
<blockquote>
<p>이처럼 너무 과도하게 학습되어 train데이터에서는 완벽하게 작동하지만 test데이터에서 제 기능을 못하게 된 것을 overfitting이라고 한다.</p>
</blockquote>
<p>다음으로 왼쪽의 직선 회귀선을 보자. 
우선 구불선보다는 사정이 낫다. 편향이 조금 높지만, 분산이 비교적 낮고, 구불선보다는 제 기능을 하고 있다. 하지만 이런 linear회귀선에는 문제가 있다. 바로 underfitting될 가능성이 높다는 것이다. </p>
<blockquote>
<p>underfitting이란 train(데이터 해석)이 제대로 되지 않은 것이다. </p>
</blockquote>
<p>underfit된 모델은 편향이 높다. (데이터 해석이 제대로 안되었기 때문에 회귀선이 데이터들에게 맞추지 못한 것이라고 생각)</p>
<h1 id="3-일반화란">3. 일반화란?</h1>
<p>일반화란 무엇인가? 
우리는 위에서 과분산(오버핏)의 경우와 과편향(언더핏)의 경우를 보며 깨달은 점이 있다. </p>
<blockquote>
<p>BEST는 과분산도, 과편향도 아닌 그 반대, <strong>적은 편향</strong>과, <strong>적은 분산</strong></p>
</blockquote>
<p>적은 편향을 가지면, 곧 데이터 해석과 이해가 잘되었다는 것이고, 적은 분산을 가지면 train 데이터, test 데이터의 차이가 (여기서 차이는 각 데이터들과 회귀선의 떨어진 거리의 차를 말한다.) 얼마 없다는 것이다. </p>
<blockquote>
<p>이처럼 적은 편향과 적은 분산을 가진 회귀를 <strong>일반화가 잘되었다</strong>고 한다. </p>
</blockquote>
<h1 id="4-정리">4. 정리</h1>
<p><img src="https://images.velog.io/images/zhenxi_23/post/96f6d61b-27e1-4750-914c-af6cbec3dd47/%E1%84%91%E1%85%A7%E1%86%BC%E1%84%92%E1%85%A3%E1%86%BC%E1%84%87%E1%85%AE%E1%86%AB%E1%84%89%E1%85%A1%E1%86%AB3.png" alt=""></p>
<p>위-왼 : 낮분, 낮편 : 일반화가 잘된 모델
위-오 : 높분, 낮편 : 오버피팅
아래-왼 : 낮분, 높편 : 언더피팅 
아래-오 : 높분, 높편 : 죽도 밥도 안된 완벽한 언더피팅</p>
<p>이쯤에서 우리의 목표를 상기시켜보도록 하자.</p>
<blockquote>
<p>목표는 <strong>일반화의 관점에서 오버피팅과 언더피팅을 설명해보자!</strong> 이다.</p>
</blockquote>
<p>아마 어렵지 않을것이다. </p>
<h4 id="일반화가-잘-되지-않은-모델일-경우-오버피팅과-언더피팅의-문제가-생긴다">일반화가 잘 되지 않은 모델일 경우, 오버피팅과 언더피팅의 문제가 생긴다!</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[커피인척 하는 보리차를 마시는 일상]]></title>
            <link>https://velog.io/@zhenxi_23/%EC%BB%A4%ED%94%BC%EC%9D%B8%EC%B2%99-%ED%95%98%EB%8A%94-%EB%B3%B4%EB%A6%AC%EC%B0%A8%EB%A5%BC-%EB%A7%88%EC%8B%9C%EB%8A%94-%EC%9D%BC%EC%83%81</link>
            <guid>https://velog.io/@zhenxi_23/%EC%BB%A4%ED%94%BC%EC%9D%B8%EC%B2%99-%ED%95%98%EB%8A%94-%EB%B3%B4%EB%A6%AC%EC%B0%A8%EB%A5%BC-%EB%A7%88%EC%8B%9C%EB%8A%94-%EC%9D%BC%EC%83%81</guid>
            <pubDate>Sun, 15 Aug 2021 05:06:09 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/zhenxi_23/post/287382c2-a287-4f04-ae67-66c1379a509a/IMG_7003.png" alt="">
커피인것 같지만 사실 유기농 보리차ㅎ
나름 건강 챙기는 중이다..ㅋㅋㅋㅋㅋ</p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/1f2b81aa-c2ee-4ba1-8ea2-a50cab2c698e/IMG_6990.png" alt="">
룸메 언니가 준 다쿠아즈! 너무 귀여워서 먹기 아까울 정도였다. 초코버터크림은 정말 맛있어☺️</p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/834c9618-26e7-4ff9-96f7-d55a0fe78336/IMG_6994.png" alt="">
룸메언니 친구가 놀러왔는데 맹치(가명)도 같이 왔다. 너무 귀엽다.. 쿠션을 박박 긁고 거기 위에 몸을 뉘이는 모습이,, 흑</p>
<p><img src="https://images.velog.io/images/zhenxi_23/post/391da361-6790-4792-a9ae-f0d3d5e7bfec/IMG_7002.PNG" alt="">
아침에 눈을 뜨면 노래 한곡을 틀고 그 노래가 끝나기 전까지 일어나는 도전(?)을 하는데, 반은 성공하고 반은 실패한다ㅋㅋㅋㅋㅋ 근데 오늘은 노래가 너무 좋아서 띠용! 하면서 일어남ㅎㅎ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[마크다운 연습]]></title>
            <link>https://velog.io/@zhenxi_23/%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4-%EC%97%B0%EC%8A%B5</link>
            <guid>https://velog.io/@zhenxi_23/%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4-%EC%97%B0%EC%8A%B5</guid>
            <pubDate>Sun, 15 Aug 2021 04:20:27 GMT</pubDate>
            <description><![CDATA[<h1 id="마크다운-하는-법">마크다운 하는 법</h1>
<h1 id="1-중요문법">1. 중요문법</h1>
<h2 id="중요하게-사용-가능">중요하게 사용 가능</h2>
<h2 id="11-을-이용해서-제목-만들기">1.1 #을 이용해서 제목 만들기</h2>
<h3 id="아주-쉬워요">아주 쉬워요</h3>
<h3 id="111-이렇게도-할-수-있다">1.1.1 이렇게도 할 수 있다</h3>
<h3 id="112-이렇게는-못한다">1.1.2 이렇게는 못한다</h3>
<ul>
<li>참고 이렇게는 못하지만 할수도 있다<h2 id="22-을-이용해서-목록만들기">2.2 ##을 이용해서 목록만들기</h2>
<h3 id="조금-어려워요">조금 어려워요</h3>
<h2 id="23-체크박스-만들기">2.3 체크박스 만들기</h2>
<h3 id="체크리스트">체크리스트!</h3>
</li>
</ul>
<ol>
<li><input disabled="" type="checkbox"> 한번 만들어보기</li>
<li><input checked="" disabled="" type="checkbox"> 수정하기</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 210813]]></title>
            <link>https://velog.io/@zhenxi_23/TIL-210814</link>
            <guid>https://velog.io/@zhenxi_23/TIL-210814</guid>
            <pubDate>Fri, 13 Aug 2021 16:39:25 GMT</pubDate>
            <description><![CDATA[<h1 id="오늘-한-일">오늘 한 일</h1>
<ul>
<li>스프린트 챌린지 </li>
<li>스프린트 복습</li>
</ul>
<h2 id="keyword-">keyword :</h2>
<ul>
<li>assert : 뒤의 조건이 True가 아니면 AssertError를 발생한다.
(s2s1 스첼에 나오는 내용)</li>
<li>label : 머신러닝(지도학습)의 label은 예측하고자 하는 대상, 곧 target을 가리킨다. </li>
</ul>
<h2 id="sprint-wrap-up-">sprint wrap up :</h2>
<ul>
<li>지도학습 비지도 학습 차이 
레이블(label), 타겟 레이블이 있느냐 없느냐의 차이 ❓
지도학습(supervised learning) : classification(분류), 회귀
보통 지도학습을 이야기 하면 분류랑 회귀를 생각하면 됨(물론 세부로 파고들면 여러가지가 있겠지만 우선을 이렇게 생각)
비지도 학습 : 클러스터링 (클러스터링의 종류에는 k-means 등등이 포함됨)</li>
</ul>
<p>고객이 이 물건을 살것인가 사지 않을 것인가? 
-&gt; 분류 classification 살것, 사지 않을 것으로 분류하는 것이므로 
어떤 물건을 사는 고객군을 찾고 싶다. 
-&gt; 클러스터링(비지도 학습)
군이 어떤 기준(label)을 가진 군인지 정해진건 아님. 우선 어떠한 군으로 분류한다는 느낌 만약 kmeans의 k가 5라면 5개의 군으로</p>
<h3 id="1-단순선형회귀-linear-regression">1. 단순선형회귀 linear regression</h3>
<ul>
<li><p>기준모델이 필요한 이유 : 최소한의 성능을 보여주는 지표가 됨.&#39;이것보다는 넘어야 한다&#39;의 최소 기준이라고 생각하면 편하다. 
&quot;얘, 모델을 만들었으면 솔직히 이것(기준모델)보단 잘해야지..&quot;</p>
</li>
<li><p>평가지표 (evaluation metrics)
분류 : 타겟의 최빈 클래스 
회귀 : 타겟 평균(중간값 등)
시계열 : 이전 타임스탬프의 값 
참고 ) 이전 타임스탬프란? : 주식 값(바로 전에 거래됐던 값 / 자동차 gps 바로 전에 위치 했던 값등)</p>
</li>
</ul>
<h3 id="-최소자승법">* 최소자승법</h3>
<ul>
<li>최소자승법이란 모델의 파라미터를 구하기 위한 대표적인 방법 중 하나
모델과 데이터와의 잔차(residual^2) 제곱의 합을 최소화 하도록 모델의 파라미터를 구하는 방법
<img src="https://images.velog.io/images/zhenxi_23/post/c8a17c1a-d4b4-4cf2-ad72-ee3043ae80e3/%E1%84%8C%E1%85%A5%E1%86%AF%E1%84%91%E1%85%A7%E1%86%AB%E1%84%80%E1%85%AA%20%E1%84%80%E1%85%B5%E1%84%8B%E1%85%AE%E1%86%AF%E1%84%80%E1%85%B5%20%E1%84%80%E1%85%AE%E1%84%92%E1%85%A1%E1%84%80%E1%85%B5.png" alt=""></li>
</ul>
<h3 id="-테이블-데이터tabular-data">* 테이블 데이터(Tabular Data)</h3>
<ul>
<li>구성</li>
</ul>
<ol>
<li>Observations - 테이블의 행에 위치, 단일 데이터타입이여야 한다.</li>
<li>Variables - 테이블의 열에 위치, 여러가지 데이터타입이 포함 될 수 있다.</li>
<li>Relationship - 테이블과 테이블을 연결 (key 값을 이용한다)
만드는 데이터가 이 테이블 데이터인지 앞으로 항상 확인</li>
</ol>
<ul>
<li><p>mae의 장점 
스케일이 같아서 비교가 편하다. mse보다는 이상치에 덜 민감(더블링이 안되니깐!)</p>
</li>
<li><p>rss(residual sum of squares) = sse(Sum of Square Error) ❓</p>
</li>
<li><p>선형회귀는 주어져 있지 않은 점의 함수값을 보간하여 예측하는데 도움을 줌</p>
</li>
<li><p>머신러닝 프로세스 
<img src="https://images.velog.io/images/zhenxi_23/post/512bda43-67bd-436b-b333-b30cb917dbad/%E1%84%86%E1%85%A5%E1%84%89%E1%85%B5%E1%86%AB%E1%84%85%E1%85%A5%E1%84%82%E1%85%B5%E1%86%BC%20%E1%84%8B%E1%85%AF%E1%86%AB%E1%84%85%E1%85%B5.png" alt="">
파란색 : train
초록색 : test</p>
</li>
<li><p>선형회귀가 가지고 있는 가장 큰 장점 : 회귀계수 해석이 쉽다!(수식만 봐도 너무 간단) 직관적으로 설명할 수 있다. (직관적 분석 가능) 그래서 선형회귀분석이라고도 한다. 
여기서 회귀계수 분석이란? 한 feature의 단위가 커질수록 target이 얼마나 변하는지, 어떻게 변하는지
직관적으로 확인할 수 있다.</p>
</li>
</ul>
<h3 id="2-다중선형회귀-multiple-linear-regression">2. 다중선형회귀 multiple linear regression</h3>
<ul>
<li><p>단위 회귀에 비해 특성들이 늘어난 회귀</p>
</li>
<li><p>학습과 테스트 데이터를 분리하는 이유? 모델이 잘 만들어졌는지 (일반화가 잘되었는지) 확인하기 위해 </p>
</li>
<li><p>선형회귀는 다른 ML 모델에 비해 상대적으로 학습이 빠르고 설명력이 강하다. 하지만 선형 모델의 이므로 과소적합(underfitting)이 잘 일어난다는 단점이 있다.</p>
</li>
<li><p>과적합/과소적합
일반화가 잘된 모델은 과적합, 과소적합 둘다 아님.</p>
</li>
<li><p>편향분산 트레이드 오프와 일반화 관점을 잘 연결해서 알아야함! ❓</p>
</li>
<li><p>결정계수 r^2가 1에 가깝다는 것은? 모델의 설명력이 높다. 잘 fitting 되었다. 
r^2은 0~1사이의 값이 나옴</p>
</li>
<li><p>note에서 mse, mae쪽을 보면 수식이 있는데 그런걸 ‘LaTex(수식문법)’이라고 함.(아래 사진 참조)
평가지표는 다같이 보고 확인하는게 좋겠죠?
<img src="https://images.velog.io/images/zhenxi_23/post/d2faed44-be69-42c9-9d30-97e39e641c3a/%E1%84%92%E1%85%AC%E1%84%80%E1%85%B1%E1%84%86%E1%85%A9%E1%84%83%E1%85%A6%E1%86%AF%20%E1%84%91%E1%85%A7%E1%86%BC%E1%84%80%E1%85%A1%E1%84%8C%E1%85%B5%E1%84%91%E1%85%AD%E1%84%83%E1%85%B3%E1%86%AF.png" alt=""></p>
</li>
<li><p>분산이 높은 경우는 일반화를 잘 못하는 경우 즉 과적합 ❓</p>
</li>
<li><p>편향이 높은 경우는 모델이 학습 데이터에서 특성과 타겟 변수의 관계를 파악하지 못함 과소적합 ❓</p>
</li>
<li><p>그 밑의 그림을 보면 파랑 - 트레인 / 초록 - 테스트 
🤚 이 그림을 보고 설명하는 연습을 해봤으면 좋겠다.
<img src="https://images.velog.io/images/zhenxi_23/post/b38a1cd2-f96c-46ec-8262-6436508fc5ca/%E1%84%91%E1%85%A7%E1%86%AB%E1%84%92%E1%85%A3%E1%86%BC%E1%84%87%E1%85%AE%E1%86%AB%E1%84%89%E1%85%A1%E1%86%AB%20.png" alt="">
<img src="https://images.velog.io/images/zhenxi_23/post/65fd216b-989e-451c-b443-97fce721a416/%E1%84%91%E1%85%A7%E1%86%AB%E1%84%92%E1%85%A3%E1%86%BC%E1%84%87%E1%85%AE%E1%86%AB%E1%84%89%E1%85%A1%E1%86%AB2.png" alt="">
<img src="https://images.velog.io/images/zhenxi_23/post/51ce0b9c-6fc6-4d06-ac83-c10332fa1d7d/%E1%84%91%E1%85%A7%E1%86%BC%E1%84%92%E1%85%A3%E1%86%BC%E1%84%87%E1%85%AE%E1%86%AB%E1%84%89%E1%85%A1%E1%86%AB3.png" alt=""></p>
</li>
</ul>
<h3 id="3-ridge회귀">3. ridge회귀</h3>
<ul>
<li><p>원핫인코딩은 아주 좋은 인코딩 방법이다! 범주형 변수값들을 0과 1로만 바꾼다. 따라서 원핫인코딩을 하면 변수들의 갯수가 늘어난다. (범주의 갯수만큼) 원핫인코딩할때는 category encoders를 쓰는 것을 추천!! (싸이킷런에도 있지만 지금은 카테고리 인코더를 추천함)</p>
</li>
<li><p>원핫인코딩안에도 종류가 여러가지 있다. (더미코딩이라던가, 원핫인코딩이라던가...)
그런데 우선 흔히 아는 그 원핫인코딩만 알고 있으면 됨</p>
</li>
<li><p>Feature selection 특성선택 
특성선택은 특성공학인가? ㄴㄴ 특성공학안에 특성선택이 들어가는 것 (특성공학은 아주 방대한 분야이다)
특성선택의 기법에는 selectKBest 등이 있다. 이 외에도 많으니깐 한번씩 알아보면 좋을 것 같다. 
특성선택</p>
</li>
</ul>
<h3 id="-ridge-회귀의-정규화">* ridge 회귀의 정규화</h3>
<p>정규화를 하는 이유는 과적합을 해결하기 위해서이다. 근데 정규화를 너무 쎄게 하면 과소적합이 되어버린다. 
참고) Ridge 회귀는 이 편향을 조금 더하고, 분산을 줄이는 방법으로 정규화(Regularization)를 수행합니다. 여기서 말하는 정규화는 모델을 변형하여 과적합을 완화해 일반화 성능을 높여주기 위한 기법을 말합니다.</p>
<ul>
<li><p>릿지회귀는 분산편향트레이드오프 개념을 따르는가? yes
모델에 편향을 약간 더해서 분산을 많이 줄어들게 할 수 있다.❓ 
릿지회귀에는 람다라는 패널티 값이 있다. 
람다라는 패널티 값을 크게 잡으면 하이바이어스 편향이 많이 추가되어 과소적합이 됨. 
릿지회귀를 이용하면 학습성능이 많이 올라가나요? no 일정 이상으로 가면 떨어져요 ❓ (복습 필요)</p>
</li>
<li><p>릿지회귀에 릿지cv를 사용한 이유? 적절한 알파(람다값)를 찾으려고 </p>
</li>
<li><p>‘최종모델’을 강조한 이유? ❓(다시 읽어보기)
test셋은 한번만 사용할 수 있어서! 
가장 적절한 람다값을 적용한 모델을 테스트 데이터셋에 사용하므로 </p>
</li>
<li><p>실무팁! 검증 다끝나고 모델을 만들어서 회사에서 서비스를 할때) 테스트를 했던 애들도 그냥 영끌해서 학습시켜서(아깝자너..) 모델을 최애애애ㅐㅐ애애대한 개선시킬 수 있다. (비즈니스적 관점에서 봤을때 test데이터도 학습에 쓰일 수 있는 것이다.)</p>
</li>
</ul>
<h3 id="4-logistic-회귀">4. logistic 회귀</h3>
<ul>
<li><p>훈련, 검증, 테스트 세트는 머신러닝에서 특별한 일이 없는 한 항상 세개로 나눠서 할 것임 </p>
</li>
<li><p>검증세트는 하이퍼파라미터 튜닝을 위해 쓴다. 모델의 하이퍼파라미터를 살짝 바꿔도 모델은 다른 모델이 된다. 이렇게 달라진 모델을 비교하기 위해서 검증세트를 쓴다. 
(릿지회귀에서도 람다 1이랑 람다3은 서로 다른 모델이다)</p>
</li>
<li><p>로지스틱 회귀가 회귀모델인가요? ㄴㄴ 분류모델 
선형회귀 모델에 시그모이드를 넣어서 구부린것 
그래서 p(x)식을 보면 시그모이드 함수 안에 선형회귀 식이 들어가있다. 
🤚 식 캡쳐해서 추가하기</p>
</li>
<li><p>odds를 이용하면? 선형회귀처럼 되어서 회귀 계수를 얻을 수 있다. 그니깐! 로지스틱 회귀는 분류모델인데 선형회귀의 장점을 가지고 있다고 할 수 있다. 🤚 로짓변환과 무슨 관계가 있는지 살펴보기 
참고) 로짓변환은 비선형 형태인 로지스틱회귀에 로그함수를 취해 선형형태처럼 만들어 회귀계수를 해석하는 방법이다. </p>
</li>
<li><p>note4 캐글에 꼭 제출 해보기!!!! 다른 스프린트할때 캐글 챌린지 할 것이기 때문에 캐글에 익숙해지는게 좋음. </p>
</li>
<li><p>내가 생각한 머신러닝 프로세스 
주어진 데이터 : 집값과 집과 관련된 피쳐들
step 1 : 어떤 문제를 풀려고 하나요? -&gt; 집값을 예측하는데 있어서 어떤 피쳐의 영향이 큰가 적은가 +인가 -인가? 🤚 피쳐와 타겟의 관계를 볼수 있는 지표같은 것이 있는가? 예상) 상관관계 분석 corr, 피쳐 select(KBestSelect?)
step 2 : train, validation, test데이터로 나눠주고 용도에 맞는 모델에 train data를 fit
step 3 : validation으로 평가지표들을 살펴보며 더 알맞은 모델을 찾아보거나 파라미터를 조정한다.
step 4 : 마지막 테스트!</p>
</li>
</ul>
<h1 id="내일-할-일">내일 할 일</h1>
<ul>
<li><input checked="" disabled="" type="checkbox"> 오늘 TIL을 다시 살펴보며 (note와 함께) 정리하기 </li>
<li><input checked="" disabled="" type="checkbox"> 4개 노트 정리하면서 &#39;분산편향트레이드오프 &#39;같은 중요하면서도 잘 와닿지 않는 개념은 따로 적어두었다가 블로그에 따로 정리</li>
<li>[] 노트 정리가 끝나면 이번주 TIL keyword를 보며 개념 되새김. 또한 빠진 개념이 있는지 살펴보기. 만약 빠진 개념이 있으면 내일 TIL에 정리하기 </li>
<li>[] 내일 모레 할 일 : 도전문제 풀어보기 </li>
</ul>
<br>
<br>

<p>🐹
숲을 볼줄 알아야 함! 뭘하고 있는지에 대한 탐구 계속 해야함. 모르는 것과 아는 것의 구별, 모르는 것은 찾는 법을 알것, 질문하는 법을 알것</p>
<p>지금까지 내가 생각한 블로그 운영 방법은 다음과 같다.</p>
<p>TIL을 기본으로...</p>
<pre><code>📎 keyword : 새로 배운 개념, 단어, 나중에 한번 다시 보고 싶은 새로운 용어 등을 적는다.
💾 sprint wrap up : 하나의 스프린트가 끝나고, 랩업 시간에 들은 것을 필기. 나중에 이 내용을 바탕으로 블로그에 따로 정리할 것이나, 빠진 개념을 don&#39;t miss에 적은다.
💎 dont&#39;t miss : 
🎸 etc : Q&amp;A시간에 들은 유용한 질문 답변이나, 나중에 쓸 것 같은 코드를 적는다.</code></pre><p>개선할 점이 있으면 하다가 유연하게 개선해 나가면 될 것 같다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 210812]]></title>
            <link>https://velog.io/@zhenxi_23/TIL-210812</link>
            <guid>https://velog.io/@zhenxi_23/TIL-210812</guid>
            <pubDate>Thu, 12 Aug 2021 15:42:17 GMT</pubDate>
            <description><![CDATA[<h1 id="오늘-한-일">오늘 한 일</h1>
<ul>
<li>논리회귀(Logistic Regression) 공부</li>
</ul>
<h3 id="keyword-">keyword :</h3>
<ul>
<li>논리회귀(Logistic Regression) <ul>
<li>이름은 회귀지만 하는 일은 분류</li>
<li>샘플이 특정한 범주에 속할 확률 추정에 많이 씀</li>
</ul>
</li>
<li>test, validation, test data</li>
<li>knobs, knob 조정❓</li>
<li>하이퍼파라미터와 파라미터의 차이 <ul>
<li>파라미터 : 흔히 아는 파라미터</li>
<li>하이퍼파라미터 : 우리가 모델링할때 수치를 조정할 수 있는 파라미터 
(가중치 alpha 등...어느정도 비율, 깊이로 학습할지 등도 정할 수 있다.)</li>
</ul>
</li>
<li>Linear &amp; Logistic 회귀 차이
  1) fit <pre><code> - Linear의 fit : least squares 잔차의 제곱합이 줄어들도록 
 - Logistic의 fit : 잔차의 개념 X, 최소제곱, R^2사용 불가, 대신 최대가능성(maximum likelihood)를 가진 곡선 채택</code></pre>  2) target<pre><code>  - Linear : 예측하고자 하는 target이 연속형
 - Logistic : 예측하고자 하는 target이 분류</code></pre></li>
<li>유효성 검사 (validation 관련인듯)❓</li>
<li>data leakage</li>
<li>시계열 데이터 <ul>
<li>주식, 부동산데이터 같은 경우 시간 흐름 중요</li>
<li>train -&gt; validation -&gt; test </li>
<li>과거 -----------------&gt; 현재</li>
</ul>
</li>
<li>model selection </li>
<li>feature selection : 데이터 split 전에 하는 것 (select하는 방법 있었는데❓)</li>
<li>K-fold 교차검증(CV) </li>
<li>Hold out validation : 데이터를 그냥 hold out해버리면 비중이 치중된 데이터를 써버릴 수 있다.
(ex) train : 생존자 70% / validation : 생존자 20%)
데이터는 한정되어 있으므로 k개로 모델을 만들어서 cv를 해주어 최대한 데이터를 활용하는 것이 좋다.</li>
<li>로짓 변환(logit transformation) ❓(노트 다시 보기)</li>
<li>평가지표(evaluation metrics)<ul>
<li>분류 문제의 평가지표 : precision, recall, f-score등 (지금 다 알필요 X)</li>
<li>회귀 문제의 평가지표 : R^2등</li>
</ul>
</li>
<li>다중 클래스, 다중 분류 문제 (지금은 2개 집합의 범주형 타겟만 다룸 ex) 살아남는다(1) vs 못산다(0))</li>
<li>표준화 (standardscaler)</li>
<li>kaggle 에서 feature description 확인하는 연습</li>
<li>아웃라이어 (이상치) 제거</li>
<li>모델 성능 리포팅 : 시각화 등의 자료를 바탕으로 모델의 결과를 해석&amp;설득 (kaggle에 좋은 리포팅이 많다)</li>
<li>모델 최적화 </li>
<li>회귀계수</li>
<li>majority class(치우친 클래스) &lt;-&gt; minority class(소수 클래스)</li>
<li>odds</li>
</ul>
<h3 id="etc-">etc :</h3>
<p>[질문]
 logit transformation 에서 확률 (특정 경우/전체경우) 가 아닌 odds (특정확률/다른확률) 을 사용하는 이유는 무엇인가요?
직관적으로는 그냥 확률이 더 이해하기 쉬운데 odds를 사용하는 이유가 있을 것 같아서요. 추측한 이유는  logit transformation 을 이용해서 선형으로 바꾸기 위해서 입니다.
확률이 아니라 odds를 사용하는 이유 알아봤습니다! odds가 확률에 비해 X factor가 미치는 영향력이 좀 더 크기 때문에 유리한 점이 있어서 그렇다고 하네요~</p>
<p>[질문]
logistic regression 은 회귀계수 직관석 해석이 어렵다고 하셨는데요. 후에 코드를 보면 logistic.coef_로 직관적이게 나오는데 이건 이미 logit transformation이 이루어진건가요? 아니라면 이게 왜 직관적이지 않다는 건가요?
오즈 수식을 보면 회귀 계수 자체가 odds안에 숨겨지게 된다. 그래서 직관적 해석이 어렵다고 하신듯. 따라서 로짓 변환 하기 전에 한번 봐야한다.<br>)간단히 얘기하자면, odds가 특정 x factor에 대한 결과값을 보는 것이기 때문에, 카테고리 적으로 다른 결과값과 비슷할 확률이 probabality보다 높다는 얘기인 것 같아요
제가 이해했던거는 로지스틱회귀가 분류를 위한 것이기 때문인 것 같아요. 선형회귀는 연속형 범수, 말씀하신 집값 예측 같은 것에 사용하기 위한 것이지만 로지스틱 회귀는 분류니까요… 로지스틱 회귀는 결과적으로 0을 0으로 1을 1로 보내야 하는게 목표니까요, 그 과정에서 오즈비라는 지표를 활용해서 회귀를 하는 것이 좋겠다!고 통계학자들이 결론을 낸 거 아닐까 싶어요..
) 감사합니다 :) 분류를 위한거라서 0과1 로 양극화 하기 위해 그렇다는 말씀이시죠!
오즈비를 로지스틱 회귀에 사용하기 전에 여러 지표들을 통계학자들이 찾아보았고 결과적으로 위에 말씀주신 것처럼  X factor 영향력이 제일 높았던 오즈비를 선택하지 않았을까 싶어요.. ㅎㅎ
<a href="https://www.theanalysisfactor.com/why-use-odds-ratios/">https://www.theanalysisfactor.com/why-use-odds-ratios/</a></p>
<p>[질문] 특성 값을 표준화시켰는데, logistic regression이라서 진행한건가요? (linear는..?)
리니어도 표준화 시키기도 한다. 그런데 만약 리니어에서 표준화를 시켜버리면 해석이 굉장히 복잡해짐 예를 들어 Price를 표준화 해서 0~1사이로 바꾸면 나중에 price해석할때 다시 바꿔야 해서 복잡
분류의 경우 해석의 문제가 없다. 그 클래스에 해당하는지만 살펴보면 되므로.</p>
<h1 id="내일-할-일">내일 할 일</h1>
<ul>
<li>오늘 다 정리 못한 키워드 처리</li>
<li>sprint chellenge </li>
<li>과제 2차 제출</li>
</ul>
<br>
<br>

<p>🐹
건강을 위한 스트레칭은 못했다.. 너무 바쁜 하루였다고 한다ㅎ. 그리고 과제 하느라 저녁을 못챙겨 먹었다!! 근데 점심을 너무 과식해서 가끔은 위장을 쉬어주는 것도 괜찮은 것 같다. 항상 소화시키느라 고생하는 내 위장...
오늘 내용도 역시 쉽지만은 않았다. 로지스틱회귀는 컴공 전공으로 들어서 조금은 아는 내용인데, (AI분야에 관심이 생겼을 당시 컴공 4학년 전공인 머신러닝을 신청해서 들었다. 인문대생의 패기..) 이번에 다시 해보니깐 생각보다 더 복잡하고, 기본기가 많이 필요하다는 것을 느꼈다. 통계든 수학이든 바탕 지식이 부족하니 배우는게 조금 버겁긴하지만 할만은 하다.! 그래도 열심히 해보자!! 힘!</p>
]]></description>
        </item>
    </channel>
</rss>