<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>DataLog</title>
        <link>https://velog.io/</link>
        <description>Data Science를 정복하기 위해 기록용 Velog</description>
        <lastBuildDate>Sun, 05 May 2024 12:25:36 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>DataLog</title>
            <url>https://velog.velcdn.com/images/wise_head/profile/86e243cb-3e45-4837-95da-4fe42f171e15/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. DataLog. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/wise_head" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[마지막 프로젝트: IR & AD]]></title>
            <link>https://velog.io/@wise_head/Finalprojeft</link>
            <guid>https://velog.io/@wise_head/Finalprojeft</guid>
            <pubDate>Sun, 05 May 2024 12:25:36 GMT</pubDate>
            <description><![CDATA[<h2 id="prologue">Prologue</h2>
<p>최종장인 마지막 프로젝트가 끝이 났다. 팀은 기존에 있었던 팀 그대로 진행하면서 그와 동시에 두개의 프로젝트를 진행하게 되었다. 기존에 존재하던 프로젝트는 총 네개의 프로젝트(OCR, IR, RS, AD)가 존재했었다. 그런 와중 우리 팀은 전부 과학 지식 질의응답 프로젝트를 선택하였고, 기존의 6명이 전부 같은 팀으로 신청하였다.</p>
<p>그러나 실제로 대회가 직접적으로 진행되려 할 때 쯤 제안이 들어왔다. 즉, 팀을 두 그룹으로 나누어 3인, 3인으로 IR과 AD를 나누어 진행하는 것이 어떻냐는 제안이었고 우리는 두가지 대회를 모두 참여하는 것으로 협의를 하여 진행하기로 하였고, 시작한지 얼마 되지 않아 추가로 한명의 팀원이 IR로 참여하였다.</p>
<p>이로써 4개의 카테고리로 나뉘어진 대회 중 2개의 대회를 시작하였다.</p>
<h2 id="개요">개요</h2>
<h3 id="1-프로젝트-개요">1. 프로젝트 개요</h3>
<h4 id="a-개요">A. 개요</h4>
<h5 id="a-1-ir">A-1. IR</h5>
<p>과학 지식에 관해 질문을 입력하면 과학 관련된 답을 내어주는 챗봇 시스템을 구축하는 통상 RAG를 진행하는 대회였다. 과학과 관련되지 않은 질문이 요청되었을 경우 시스템에 존재하지 않는다는 답과 함께 참조하는 문서가 없게끔 진행해야 한다. 과학과 관련없는 질문이 포함되었을 때 오히려 문서 참조를 하게 될 경우 스코어가 감소하는 경향이 있기 때문에 확실한 분류가 진행된 다음 참조 문서를 불러오게 하는 전략이 좋다고 한다.</p>
<h5 id="a-2-ad">A-2. AD</h5>
<p>화학 공정에서 발생하는 이상 탐지를 감지하는 대회다. 공정에서 일부 요인으로 인해 이상치가 발생하기도 하며 이러한 이상치는 기계 작동에 치명적 결함을 입혀 막대한 손실을 야기할 수 있다. 이러한 이상치를 조기에 발견하여 바로 잡기 위해 진행하는 것을 목적으로 분석하는 대회였다. </p>
<h4 id="b-환경">B. 환경</h4>
<p><strong>팀구성</strong> : 7인 1팀, 인당 3090ti서버를 VSCode와 SSH로 연결해서 사용, GPT team credit $
<strong>협업 환경</strong> : Notion, Github
<strong>의사 소통</strong> : Slack, Zoom, Offline Meeting</p>
<h3 id="2-프로젝트-팀-구성-및-역할">2. 프로젝트 팀 구성 및 역할</h3>
<p><strong>팀 구성</strong>
배정 받은 팀은 7인이었다. 두 가지 대회를 모두 참여하는 사람이 어느정도 있었기 때문에 한 가지 대회만 몰입하여 진행하기에는 시간적 여유가 받쳐주질 않았었다. 따라서 Upstage에서 제공해주었던 강의를 학습하고 내용을 공유하면서 실전 대회에서 각자 적용해 볼 수 있는 방법을 생각하여 적용하고 각자의 아이디어가 적용 되었을 때 어떠한 효과가 있는지에 대해 관찰일지를 노션에 작성하고 정기 회의를 통하여 내용을 공유하기로 하였다.</p>
<h3 id="3-프로젝트-수행-절차-및-방법">3. 프로젝트 수행 절차 및 방법</h3>
<h4 id="a-팀-목표-설정">A. 팀 목표 설정</h4>
<p>팀 목표는 두 가지 대회에서 가져갈 수 있는 모든 지식을 가져가고 각자 원하는 태스크의 차이가 존재했기 때문에 서로간의 목표를 얻어가는 선에서 각자의 목표를 수립해 가기로 정했었다. 그럼에도 한 팀으로써 최종적으로 한 작품을 만들어내기 위해 최소한의 정기적 회의를 통해 내용을 공유하고 개인적인 task를 융합하여 좀 더 고도화 된 방법론 및 분석을 진행하기로 하였다. 기본적으로 다음과 같은 목표를 설정하였다.</p>
<p><strong>IR</strong></p>
<blockquote>
<p>1<del>2주차: 강의 내용을 이해하고 각자에게 설명할 수 있을 정도의 학습을 진행
3</del>4주차: GPT Credit을 활용해 BaseLine을 진행해보고 강의에서 학습하여 적용해 보고 싶었던 내용을 추가적으로 학습하여 모델 고도화 및 실험 적용</p>
</blockquote>
<p><strong>AD</strong></p>
<blockquote>
<p>1주차: 데이터 handling에관한 강의를 보고 대회 데이터에 적합하여 EDA적용하여 결과 보고
2주차: 각자의 모델을 선택하여 강의를 보면서 활용할 모델의 BaseLine을 생성
3주차: 모델의 고도화 진행 및 결과 해석 + 추가적인 EDA를 통한 피드백
4주차: Dash를 활용하여 대시보드 제작 및 모델 모듈화 &amp; 파이토치 템플릿 적용</p>
</blockquote>
<h4 id="b-프로젝트-사전기획">B. 프로젝트 사전기획</h4>
<h5 id="1-time-line-수립">(1) Time-line 수립</h5>
<p><img src="https://velog.velcdn.com/images/wise_head/post/325484e8-11fe-4754-88ce-66a492f0da81/image.png" alt=""></p>
<p>Notion을 활용하여 간트 차트 및 회의 기록을 진행하였다. IR과 AD 두가지 프로젝트를 동시 진행하기 위해 한눈에 볼 수 있는 페이지를 제작하였다. 해당 <a href="https://sixth-drum-9ac.notion.site/Final-d590cb0c11044d83a8d2a52459747117?pvs=4">간트차트</a> 링크를 참조하였다.</p>
<h5 id="2-협업-문화">(2) 협업 문화</h5>
<p>두가지 프로젝트를 동시에 진행하다 보니 각자 원하는 태스크에 대해 차이가 있을 수 밖에 없었다. 따라서 기본적인 규칙을 다음과 같이 정하고 진행하였다.</p>
<blockquote>
<ol>
<li>각자의 일을 하다가 어느정도 결과가 나오면 같이 보면서 상의할 것</li>
<li>코드를 작성하고 진행할때 꼭 주석처리 및 마크다운 언어로 작성해둘 것</li>
<li>각자의 아이디어 및 사전 조사 자료는 <a href="https://sixth-drum-9ac.notion.site/Scientific-Knowledge-Question-Answering-cd175584a0e7473b8c205c34ac673683?pvs=4">IR</a>, <a href="https://sixth-drum-9ac.notion.site/Chemical-Process-Anomaly-Detection-dcc08017db8047a3a78e97ff96f66c1e?pvs=4">AD</a>에 공유해둘 것</li>
<li>두 가지 멘토링에 대해 최대한 참여하고 같이 듣기</li>
<li>불참할 수 밖에 없는 팀원을 위해 멘토링이나 회의 기록 공유하여 상황 공유하기</li>
</ol>
</blockquote>
<h3 id="4-수행-결과">4. 수행 결과</h3>
<p><strong>IR</strong></p>
<p>대회 시작이 4월 22일 부터 진행되었기 때문에 팀 결합에서 문제가 생겼었다. 따라서 대회를 진행할 때 어쩔 수 없이 각자 개인적으로 제출을 하되 회의나 토의활동을 무조건 팀 단위로 진행하였다. 주로 오전 10시에 회의를 진행하였으며 최종적으로 스코어가 가장 높았던 전략은 다음과 같다.</p>
<blockquote>
<p>쿼리검색:hybrid retrieve
유사도: ko-sroberta-multitask
역색인: LMJelinekMerce
parameter: match boost 0.002</p>
</blockquote>
<p>최종적으로 제출했던 score은 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/38ad6021-a032-42c6-ba0f-12e725c46a09/image.png" alt=""></p>
<p>나 스스로의 전략은 강의 내용에서 나왔던 문서를 가져올 때 문서의 개수를 설정할 수 있다. 이 문서의 개수를 조절하였을 때 스코어의 변동성을 조절해 보는 전략이었다. 결과적으로 3개 서치보다는 7개의 서치가 성능이 오른 것을 확인 할 수 있었고, 스스로 진행 했던 프롬프트 엔지니어링은 오히려 성능을 저하하였다.</p>
<pre><code># RAG 구현에 필요한 Question Answering을 위한 LLM  프롬프트
persona_qa = &quot;&quot;&quot;
## Role: 과학 상식 전문가

## Instructions
- 사용자가 대화를 통해 과학 지식에 관한 주제로 질문하면 search api를 호출할 수 있어야 한다.
- 과학에 관련된 카테고리는 물리, 화학, 생물, 지구과학 등 여러 분야가 있다.
- 각 분야에 맞춘 단어를 사용하여 대답을 생성하도록 한다.
- 과학 상식과 관련되지 않은 나머지 대화 메시지에는 적절한 대답을 생성한다.
&quot;&quot;&quot;

# original
# # RAG 구현에 필요한 Question Answering을 위한 LLM  프롬프트
# persona_qa = &quot;&quot;&quot;
# ## Role: 과학 상식 전문가

# ## Instructions
# - 사용자의 이전 메시지 정보 및 주어진 Reference 정보를 활용하여 간결하게 답변을 생성한다.
# - 주어진 검색 결과 정보로 대답할 수 없는 경우는 정보가 부족해서 답을 할 수 없다고 대답한다.
# - 한국어로 답변을 생성한다.
# &quot;&quot;&quot;</code></pre><p>이러한 원인은 애초에 데이터는 과학으로 분류가 되어있기 때문에 이를 데이터에서 부터 맞춰주지 않았기 때문에 오히려 추가한 문구가 방해를 일으켜 감소했을 것이라 판단된다. 이후엔 실험을 많이 하지 못했지만 추가적으로 실험을 적용해 본다면 데이터 구성을 변화시켜 주제를 세분화 하여 나타낼 수 있을 것 같다.</p>
<p><strong>AD</strong>
데이터를 제일먼저 확인하였을 때 칼럼에 대한 정보가 보여지지 않았기 때문에 변수 이름 자체에서 얻을 수 있었던 단서가 희박했다. 따라서 최초로 데이터에 대해 확인하였을 때 변수끼리의 조합을 통해 어떠한 파생변수를 만들어 내는 과정을 진행 할 수 없다 판단하였다. </p>
<p>또한 데이터는 SimulateRun 단위로 sampling이 1번부터 n번까지 연속적으로 진행된 샘플이라 한다. 그러나 sample1과 sample2의 시간 간격이 다른 샘플의 간격과 일치하는지 확인할 수 없었고 따라서 시계열성이 존재한다 하더라도 고려하지 못한다 판단하였다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/b9f0d27a-690c-43b7-b8df-a770ccc5d619/image.png" alt=""></p>
<p>상관관계를 확인했을 때, 상관관계가 존재하는 변수가 있었다. 거의 1과 -1에 가까운 변수도 있었기 때문에 52개의 변수에서 차원을 축소하였을 때 관계가 있는 변수가 존재할 것이라 판단하였고 이를 위해 PCA를 진행하였다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/d0b23546-40a6-49ed-8e76-cb15c11c5891/image.png" alt=""></p>
<p>3차원으로 출력하였을 때 각 주성분에 가장 영향이 있는 변수를 찾아내기 위해 상관계수를 다시 확인한 결과 다음과 같은 변수가 도출되었다.</p>
<p>변수간의 관계를 특정할 수 없지만 직∙간접적으로 반영하여 군집을 형성할 수 있는 k-means 클러스터링 방법론을 활용하였다. </p>
<p>클러스터링 방법은 다음과 같은 순서로 작동할 수 있게 활용하였다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/b2483295-66ba-4b4c-a64b-0cfce903f3de/image.png" alt=""></p>
<blockquote>
<ol>
<li>train데이터를 활용해 elbow, silhouette방법을 활용해 최적의 k의 수를 구한다.</li>
<li>Best k를 찾아 적합하여 최적의 center 좌표를 찾아낸다.</li>
<li>클러스터 안의 센터별 Euclide distance를 구하여 최장거리를 계산한다.</li>
<li>test데이터와 각 center별 Euclide distance를 구하고 더 작은 거리를 갖는 클러스터를 선택하여 그 거리를 저장한다.</li>
<li>train에서 계산했던 최장거리보다 크면 이상치, 크지 않으면 정상치로 판단한다.</li>
<li>SimulateRun 단위로 1개라도 이상치가 된다면 모두를 이상치로 판단한다. 이상치가 하나도 없을땐 정상치로 판단한다.</li>
</ol>
</blockquote>
<p>이러한 알고리즘을 활용하여 다음과 같은 전략을 주로 시도하였다.</p>
<blockquote>
<ul>
<li>데이터의 단위를 맞추기 위해 StandardScaling을 적용하였다.</li>
<li>PCA로 산출한 변수를 연장/적용 하여 모델에 대입하였다.</li>
<li>이상치를 만들 때 개수를 5, 10, 100으로 늘려보았다.</li>
<li><del>거리의 방법을 맨하탄, 마할라노비스와 같은 거리로 바꿔보았다.</del></li>
</ul>
</blockquote>
<p>결과적으로 나의 모델 중 StandardScaling을 적용한 k-means모델이 성능이 가장 좋게 산출되었다. PCA변수 적용과 이상치를 판단하는 개수를 증가시켰을 때 적용 할 수록 성능이 낮아지는 모습을 보였다. 이상치를 오히려 정상치로 판단하는 경우가 늘어나기 때문에 두가지 방법 모두 지양하기로 하였다.</p>
<p>k-means가 성능이 가장 좋았기 때문에 팀원중 AutoEncoder을 담당한 팀원이 latent value를 구성하는 칸에서 값을 직접 쓰지 않고 k-means로 군집을 적용하여 Decoding을 진행하는 과정을 대입하였을 때 또한 성능이 증가하였다고 확인하였다.</p>
<p>이와는 별개로 팀에서 시도했던 방법이 담긴 모델은 다음과 같다.</p>
<blockquote>
<p>Isolation Forest + Optuna
One Class SVM
PCA for SVDD
Autoencoder + K-means
DBscan
KNN
Deep Robust One-Class Classification
AutoEncoder + LSTM</p>
</blockquote>
<p>최종적으로 k-means, One Class SVM, PCA를 활용한 SVDD 세가지 모델을 앙상블한 모델이 성능이 가장 좋게 나왔다. 결과를 확인 했을 때 단순한 모델이 성능이 잘 나온 것을 확인했을 때 데이터의 관계가 복잡하지 않을 것이기 때문에 머신러닝 방법이 주로 성능이 좋게 나올 것이라는 의견을 담당해주신 멘토님께서 해주셨다. 따라서 전략적으로 선택한 모델이 가장 큰 의미를 가져오는 결과를 확인할 수 있었다.</p>
<p>k-means를 활용하여 적용시킨 DashBoard를 구성하였다. 구성은 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/4e4cd2b7-b946-4792-a792-bd4ea4903fca/image.png" alt=""></p>
<blockquote>
<ol>
<li>데이터 확인을 간단하게 하기 위해 boxplot, histogram, scatter plot을 변수 선택을 자유롭게 하고 그에따른 interactive 출력을 진행하였다.</li>
<li>최적의 k를 구할 때 활용했던 지표를 출력하였다.</li>
<li>k-means에서 가장 영향이 있었던 변수를 크기 순으로 나열하였다.</li>
<li>test data에서 이상과 정상으로 나타낸 변수들을 비교하였을 때 top5, bottom5를 확인할 수 있게 표시하였다.</li>
<li>실제로 값을 대입하여 그 값이 이상치인지 정상치인지 확인할 수 있도록 interactive하게 제작하였다.</li>
</ol>
</blockquote>
<p>최종적으로 다음과 같은 순위를 기록하였다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/7f1ee3d4-e4ba-4e5a-898f-7d62c3e00037/image.png" alt=""></p>
<h3 id="5-자체-평가">5. 자체 평가</h3>
<p><strong>새로운 시도</strong></p>
<blockquote>
<ol>
<li>IR</li>
</ol>
<ul>
<li>프롬프트 엔지니어링에 대해 이해하고 직접 문장을 작성해 출력해 보았다.</li>
<li>top k의 개수를 조절하여 성능을 비교하였다.</li>
<li>Credit에 대해 이해하여 API를 불러오는 과정을 학습하였다.</li>
<li>간트차트를 활용하여 전반적인 일정에 대해 계획하고 공유하였다.</li>
</ul>
<ol start="2">
<li>AD</li>
</ol>
<ul>
<li>이상탐지의 배경에 대해 이해하고 이를 최대한 반영하기 위해 이상치 판단 임계값을 구성하였다.</li>
<li>이상탐지에 맞는 k-means알고리즘을 직접 구축하였다.</li>
<li>모델의 모듈화를 통해 정리하여 실질적으로 배포할 수 있게 구성하였다.</li>
<li>Dash를 활용하여 직접 DashBoard를 구성하였다.</li>
<li>간트차트를 활용하여 전반적인 일정에 대해 계획하고 공유하였다.</li>
</ul>
</blockquote>
<p><strong>좋은 변화</strong></p>
<blockquote>
<ol>
<li>IR</li>
</ol>
<ul>
<li>RAG에 대한 전반적인 이해와 간단한 적용을 할 수 있게 되었다.</li>
<li>딥러닝에서의 데이터 관점에서 생각할 수 있게 되었다.</li>
</ul>
<ol start="2">
<li>AD</li>
</ol>
<ul>
<li>단계적 build up하는 방법을 다시한번 깨달을 수 있었다.</li>
<li>대회의 목적에 맞는 결과를 출력할 수 있게 되었다.</li>
<li>직접 알고리즘을 활용하여 구성하는 방법에 익숙해질 수 있었다.</li>
</ul>
</blockquote>
<p><strong>잘 되지 않은 것</strong></p>
<blockquote>
<ol>
<li>IR</li>
</ol>
<ul>
<li>강의에서 나오지 않았던 다른 모델을 활용하는 방법이나 다른 방법을 융합하는 구성을 적용해보고 싶었으나 하지 못했다.</li>
<li>전반적으로 BaseLine에 대해 이해했지만 강의 내용에 맞춰 어떤 부분을 수정할지에 대해 어려움이 있었다.</li>
</ul>
<ol start="2">
<li>AD</li>
</ol>
<ul>
<li>실제로 배포 웹사이트를 구성하지 못했다.</li>
<li>k-means에서 거리를 변화하여 알고리즘을 구성해보지 못했다. 적용했으면 더 재밌는 결과가 산출 되었을것 같다.</li>
</ul>
</blockquote>
<p><strong>아쉬운 점</strong></p>
<blockquote>
<ul>
<li>두가지 대회를 진행하면서 의견 통합과 빌드업이 팀 단위로 이루어지지 않은것 같고 소규모 단위로 이루어진것 같아 용두사미의 느낌을 받았다.</li>
<li>실제로 배포하여 활용할 수 있는 MLops를 적용해보지 못하였다.</li>
<li>회의를 진행하면서 이탈자가 점차 늘어나는 모습이 생겨 너무 아쉬웠다.</li>
<li>만들어둔 노션을 활용하는 경우가 점차 줄어들었다. 따라서 세부사항까지 공유할 수 있지 않았던 것이 너무 아쉽다.</li>
</ul>
</blockquote>
<p><strong>배운점 및 시사점</strong></p>
<blockquote>
<ol>
<li>IR</li>
</ol>
<ul>
<li>LLM 모델이 생각보다 많은 컨텐츠를 다룰 수 있다는 것을 깨달았다.</li>
<li>RAG의 전반적인 과정에 대해 이해하면서 학습하였다.</li>
<li>다른 조의 발표를 보면서 항상 데이터 탐색이 중요하다는 것을 다시한번 깨달을 수 있었다.</li>
</ul>
<ol start="2">
<li>AD</li>
</ol>
<ul>
<li>도커 및 aws를 활용하여 배포 환경을 같게 만들어서 배포해야 하는 것을 다시 한번 깨달을 수 있었다.</li>
<li>분석 과정을 develop을 진행할 때 탄탄한 근거를 기반으로 분석을 나아가고 내가 의도한 대로 분석 결과가 잘 나오지 않았을 때 그 결과에 대해 원인을 분석할 줄 알아야 한다는 것을 배웠다.</li>
</ul>
</blockquote>
<h2 id="프로젝트를-마치며">프로젝트를 마치며</h2>
<p>최종장인 Final project가 끝이 났다. 진행하면서 재밌게 분석하기도 하였고 알고리즘 구성을 스스로 진행하면서 시간 복잡도에 대해 계속해서 생각할 수 있어서 알고리즘 개발과도 잘 맞을 수 있다는 생각을 해보게 되었다. </p>
<p>그런데 이번에는 팀원의 단합을 보기 쉽지 않았으며 다들 각자의 사정이 있었지만 팀이 아니라 소규모 단위로 k-means처럼 군집화 된 결과물이 나온것 같아 너무 아쉬웠다. <del>사공이 많으면 배가 산으로 간다는 말이 이럴때 쓰일 수도 있을것 같다.</del> </p>
<p>이번 경험의 아쉬움을 가져가면서 다른 프로젝트를 진행할 때 이러한 상황이 반복될 수도 있다 생각이 든다. 그때마다 아쉬워만 하지말고 이번에 느꼈던 감정을 생각하면서 결과까지 반복되지 않게 중간에 잡는 역할을 다시한번 생각해 보면서 이번 대회를 마무리하려 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[여섯번째 프로젝트: 버블리그]]></title>
            <link>https://velog.io/@wise_head/NLP-sixth</link>
            <guid>https://velog.io/@wise_head/NLP-sixth</guid>
            <pubDate>Sun, 24 Mar 2024 05:46:04 GMT</pubDate>
            <description><![CDATA[<h2 id="prologue">Prologue</h2>
<p>딥러닝 프로젝트 두번째 NLP에 대해 학습을 진행하고 문서 요약문에 대해 대회를 진행하였다. 딥러닝 하면 시각화가 잘 되는 CV를 많이 기대했지만 생각보다 많은 것을 할 수 있었던 컨텐츠가 아니었기 때문에 매우 아쉬웠다. <del>물론 NLP대회도 짧게 흘러갔기 때문에 아쉬운 부분은 많았다. 그렇지만 역시 Upstage는 NLP를 잘하는 기업임을 강의를 통해 실감하였다.</del> </p>
<p>아무것도 몰랐던 나는 이번 강의를 통해서 &#39;NLP란 이런것이다.&#39;를 깨달을 수 있었다. 언어에 관련된 만큼 형태소 단위로 단어를 분해하는 것도 중요하였고 뒤늦게 알았지만 단어의 의미를 잘 살릴수록 각 모델이 학습을 더욱 잘한다는 것도 깨달았다. 아쉽게도 이번 대회에서 내가 담당할 수 있었던 역할이 적었기 때문에 이번 과정은 직접 한번 해보는 과정으로 생각하고 진행하였다.</p>
<h2 id="개요">개요</h2>
<h3 id="1-프로젝트-개요">1. 프로젝트 개요</h3>
<h5 id="a-개요">A. 개요</h5>
<p>이번 대회는 적게는 2명, 많게는 20명이서 진행한 대화문을 보고 요약문을 출력하는 경진대회를 진행하였다. 이번에도 부트캠프 내부에서 진행한 대회였기 때문에 규모가 크지 않았다. 평가 지표는 RODGE -1, 2, N 세개의 지표값의 평균을 최종 점수로 활용하였다.</p>
<h5 id="b-환경">B. 환경</h5>
<p><strong>팀구성</strong> : 6인 1팀, 인당 3090ti서버를 VSCode와 SSH로 연결해서 사용
<strong>협업 환경</strong> : Notion, Github
<strong>의사 소통</strong> : Slack, Zoom, Discord</p>
<h3 id="2-프로젝트-팀-구성-및-역할">2. 프로젝트 팀 구성 및 역할</h3>
<p><strong>전체 목록</strong></p>
<blockquote>
<ul>
<li>데이터 EDA(Exploratory Data Analysis) </li>
<li>데이터 Augmentation</li>
<li>모델 선정</li>
<li>파라미터 튜닝</li>
</ul>
</blockquote>
<p><strong>팀 구성</strong>
배정 받은 팀은 기존팀 5인에서 1명이 늘었다. 이번 또한 각자 학습을 진행하고 할 수 있는 방법을 가져와서 진행하였다. <strong>전체 목록</strong>에 있는 역할에 전부 참여하였지만 각자 파트별로 비중을 둔 선택을 진행하여 주된 역할을 담당하였다.</p>
<p>여기에서 나는 주로 데이터 Augmentation을 진행하는데 할애하였으며, 나의 적용 방법으로 데이터를 증강시켜 각 dialogue에 대해 좀 더 detail하게 학습할 수 있도록 유도하는 것이었다.</p>
<h3 id="3-프로젝트-수행-절차-및-방법">3. 프로젝트 수행 절차 및 방법</h3>
<h5 id="a-팀-목표-설정">A. 팀 목표 설정</h5>
<p><strong>1주차</strong> : 업스테이지 강의를 보면서 용어를 익히고 적어도 대화를 통해 어떤 이야기를 하는지 내용을 이해할 수 있을 정도로 수준을 올려오기
<strong>2주차</strong> : 직접 tokenizer을 조정하여 변경해보기도 하고 모델도 hugging face를 통해 가져와서 적합해보기
<strong>3주차</strong> : 최종적으로 자신이 원하는 모델을 구현하고 결과를 확인하면서 자신의 전략이 잘 이루어져 있는지 수시로 확인하기</p>
<h5 id="b-프로젝트-사전기획">B. 프로젝트 사전기획</h5>
<h6 id="1-time-line-수립">(1) Time-line 수립</h6>
<p><a href="https://www.notion.so/Dialogue-Summarization-43fc1c2d025b4cd09d4babbe8ab7a1c9?pvs=4">Notion</a>에서 우리 팀에서 진행한 내용을 확인할 수 있다.</p>
<h6 id="2-협업-문화">(2) 협업 문화</h6>
<blockquote>
<ol>
<li>대회의 마무리 시기에는 같이 모여서 마무리 할 것(offline meeting)</li>
<li>각자의 일을 하다가 어느정도 결과가 나오면 같이 보면서 상의할 것</li>
<li>코드를 작성하고 진행할때 꼭 주석처리 및 마크다운 언어로 작성해둘 것</li>
<li>각자의 아이디어 및 사전 조사 자료는 <a href="https://www.notion.so/Document-Type-Classification-b01886bae17c4dd9b2d3244429f56fee?pvs=4">노션</a>에 공유해둘 것</li>
<li>특별한 사정이 없는 한 회의할 때 빠지지 말기</li>
<li>혼자서 계속 진행하지 말고 중간중간 상황에 대해 알려주기</li>
</ol>
</blockquote>
<h3 id="4-수행-결과">4. 수행 결과</h3>
<p><strong>최종 전략</strong></p>
<p>KoEDA 모듈을 활용하여 데이터의 EDA(EasyDataAugmentation)과 AEDA를 적용해보았고, 기본 모델인 KoBERT-summarization을 Baseline으로 제공받아 증강 데이터를 모델에 학습시켜 성능이 얼마나 오르는지 확인하였다.</p>
<p>또한 decoder의 max length를 확인하여 100 ~ 60까지 줄여보기도 하면서 파라미터를 조절하여 성능을 비교해봤다.</p>
<p>최종적으로 나만의 score이 제일 높았던 것은 데이터의 original + EDA(original) + AEDA(original)로 세배 증강시켜 적합했던 값이 약 41 score로 가장 높았다.</p>
<h3 id="5-자체-평가">5. 자체 평가</h3>
<p><strong>새로운 시도</strong></p>
<blockquote>
<ul>
<li>대화문과 같은 비정형 텍스트 데이터에 대해 다뤄보았다.</li>
<li>사전학습된 모델 koBART에서 Mecab과 같은 가장 유명한 tokenizer을 활용하여 데이터를 증강시켜봤다.</li>
</ul>
</blockquote>
<p><strong>좋은 변화</strong></p>
<blockquote>
<ul>
<li>tokenizer에 대해 깊게 알 수 있게 되는 계기가 되었다.</li>
<li>NLP 모델에서 encoding, decoding에 대해 알게 되었다.</li>
<li>데이터 증강 방법에 대해 학습하고 직접 구현해 볼 수 있었다.</li>
</ul>
</blockquote>
<p><strong>잘 되지 않은 것</strong></p>
<blockquote>
<ul>
<li>팀원의 간극을 좁히지 못했다. (수준차이)</li>
<li>내용 이해에 대해 확실히 정립하고 가지 못했다.</li>
<li>모델의 파라미터 튜닝과 같은 기본적으로 할 수 있는 방법에 대해 하지 못했다.</li>
</ul>
</blockquote>
<p><strong>아쉬운 점</strong></p>
<blockquote>
<ul>
<li>대회 길이가 짧았기 때문에 어느정도 감을 잡았을 때 대회가 끝났다.</li>
<li>모델 구조에 대해 설명할 수 있을 정도로 학습하지 않았기 때문에 진행하면서도 이해가 되지 않은 부분이 많았다.</li>
</ul>
</blockquote>
<p><strong>배운점 및 시사점</strong></p>
<blockquote>
<ul>
<li>앞으로 NLP에 대해 추가 학습을 진행할때 주요 관점에 대해 찾을 수 있게 되었다.</li>
<li>Hugging face를 통해 사전 학습된 모델을 사용할 수 있게 되었다.</li>
</ul>
</blockquote>
<h2 id="프로젝트를-마치며">프로젝트를 마치며</h2>
<p>벌써 두번째 프로젝트가 지나가버렸다. 너무 아쉬웠던 부분은 이번에 포함된 조원 모두가 NLP를 처음 접하기 때문에 전략을 잡기 너무 어려웠다. 또한 두서없이 중구난방으로 적용한 것도 있었기 때문에 큰 틀을 잡고 진행하기 좋아하는 나는 너무 허술했던 대회였다 생각이 든다.</p>
<p>Upstage에서 Solar mini와 같은 아주 좋은 모델을 개발해서 이것에 대해 학습하고 가면 아주 좋을것이라 생각했다. 하지만 이렇게 진행하다가는 아무것도 얻어가지 못할것이라는 생각을 하였고 최종 프로젝트만을 남겨두고 있는데 남은 2주동안 학습이 덜 된 부분을 채워 적어도 LLM 모델에 대해 100%까지는 아니더라도 80%는 이해하고 마무리 짓고 싶다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[다섯번째 프로젝트: 플러스]]></title>
            <link>https://velog.io/@wise_head/%EB%8B%A4%EC%84%AF%EB%B2%88%EC%A7%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%94%8C%EB%9F%AC%EC%8A%A4</link>
            <guid>https://velog.io/@wise_head/%EB%8B%A4%EC%84%AF%EB%B2%88%EC%A7%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%94%8C%EB%9F%AC%EC%8A%A4</guid>
            <pubDate>Thu, 22 Feb 2024 07:48:32 GMT</pubDate>
            <description><![CDATA[<h2 id="prologue">Prologue</h2>
<p>이번 프로젝트는 드디어 기다리던 딥러닝 관련 프로젝트를 진행하였다. <del>업스테이지 과정에서 내가 가장 바라고 있었던 프로젝트였는데 드디어 진행하다니</del> 주제는 주로 문서 및 자동차에 관련된 사진을 분류하는 모델을 만드는 것이다. </p>
<p>팀에 새로운 한명이 추가되었다. 해당 팀원은 딥러닝 중 추천 알고리즘을 주로 다뤘다고 한다. 컴퓨터 비전 대회를 하는 것은 처음이지만 그래도 딥러닝을 많이 해봐서 익숙하게 진행할 수 있다고 한다. <del>딥러닝 이론만 배운 나는 이번 기회에 많이 배울 수 있을 것 같았다.</del> 기존 4명과 새로운 1명의 좋은 시너지를 기대하고 프로젝트를 시작하였다.</p>
<h2 id="개요">개요</h2>
<h3 id="1-프로젝트-개요">1. 프로젝트 개요</h3>
<h5 id="a-개요">A. 개요</h5>
<p>이번 대회를 통해서 문서 타입 데이터셋을 이용해 이미지 분류를 모델을 구축합니다. 주어진 문서 이미지를 입력 받아 17개의 클래스 중 정답을 예측하게 됩니다. computer vision에서 중요한 backbone 모델들을 실제 활용해보고, 좋은 성능을 가지는 모델을 개발할 수 있습니다. 그 밖에 학습했던 여러 테크닉들을 적용해 볼 수 있습니다.</p>
<h5 id="b-환경">B. 환경</h5>
<p><strong>팀구성</strong> : 5인 1팀, 인당 3090ti서버를 VSCode와 SSH로 연결해서 사용
<strong>협업 환경</strong> : Notion, Github
<strong>의사 소통</strong> : Slack, Zoom, Offline Meeting</p>
<h3 id="2-프로젝트-팀-구성-및-역할">2. 프로젝트 팀 구성 및 역할</h3>
<p><strong>전체 목록</strong></p>
<blockquote>
<ul>
<li>데이터 EDA</li>
<li>전처리 및 train/valid data 생성</li>
<li>딥러닝 모델링</li>
<li>파라미터 튜닝</li>
</ul>
</blockquote>
<p><strong>팀 구성</strong>
배정 받은 팀은 5인이었다. 각자 학습한 수준을 기반으로 할 수 있는 모델링까지 각자 진행해 보기로 하였다. <strong>전체 목록</strong>에 있는 역할은 전부 참여하였지만 각자 파트별로 비중을 둔 선택을 진행하여 주된 역할을 담당하였다.</p>
<p>여기에서 나는 주로 개인적인 모델링을 구현하는데 할애하였으며, 나의 적용 방법으로 각 label oversampling과 train, test split을 epoch마다 분리해서 랜덤화 sampling을 진행하는 것이었다.</p>
<h3 id="3-프로젝트-수행-절차-및-방법">3. 프로젝트 수행 절차 및 방법</h3>
<h5 id="a-팀-목표-설정">A. 팀 목표 설정</h5>
<p><strong>1주차</strong> : 업스테이지 강의를 보면서 용어를 익히고 적어도 대화를 통해 어떤 이야기를 하는지 내용을 이해할 수 있을 정도로 수준을 올려오기
<strong>2주차</strong> : 데이터 레이블링과 train에서 잘못 레이블링 되어있는 사진을 바로잡기, baseline 모델을 이해하고 각자 원하는 모델을 선택하여 build up을 진행하기
<strong>3주차</strong> : 최종적으로 자신이 원하는 모델을 구현하고 결과를 확인하면서 자신의 전략이 잘 이루어져 있는지 수시로 확인하기</p>
<h5 id="b-프로젝트-사전기획">B. 프로젝트 사전기획</h5>
<h6 id="1-time-line-수립">(1) Time-line 수립</h6>
<p><a href="">notion</a>의 간트 차트를 확인 할 수 있으며 <a href="https://www.notion.so/Document-Type-Classification-b01886bae17c4dd9b2d3244429f56fee?pvs=4">notion</a>에서 우리 팀에서 진행한 내용을 확인할 수 있다.</p>
<h6 id="2-협업-문화">(2) 협업 문화</h6>
<blockquote>
<ol>
<li>대회의 마무리 시기에는 같이 모여서 마무리 할 것(offline meeting)</li>
<li>각자의 일을 하다가 어느정도 결과가 나오면 같이 보면서 상의할 것</li>
<li>코드를 작성하고 진행할때 꼭 주석처리 및 마크다운 언어로 작성해둘 것</li>
<li>각자의 아이디어 및 사전 조사 자료는 <a href="https://www.notion.so/Document-Type-Classification-b01886bae17c4dd9b2d3244429f56fee?pvs=4">노션</a>에 공유해둘 것</li>
<li>특별한 사정이 없는 한 회의할 때 빠지지 말기</li>
<li>혼자서 계속 진행하지 말고 중간중간 상황에 대해 알려주기</li>
</ol>
</blockquote>
<h3 id="4-수행-결과">4. 수행 결과</h3>
<p><strong>최종 전략</strong></p>
<p>Albumentation 모듈을 활용하여 rotate, flip, mixup, noise, cut-out 등 이미지 증강 기법을 활용하여 EDA와 전처리를 모두 진행하였다. 또한 test set을 활용하여 다음과 같이 병렬적으로 진행하였다.</p>
<blockquote>
<ol>
<li>Human Classification</li>
<li>Timm Pretrained Models</li>
<li>Object Detection Models</li>
<li>VIT Model</li>
</ol>
</blockquote>
<p>각자 원하는 모델을 선정하여 전략을 구상하여 진행하였다. 나만의 전략은 원본 데이터를 upsampling을 진행하여 개수를 100개로 통일 시킨 다음 1 epoch마다 새로운 valid set을 분리한 다음 각 train, valid에 증강을 하는 방식을 활용하여 진행하였다. 결과적으로 개인적인 모델의 최종 결과는 0.7정도가 나왔으며 팀 내 최종 스코어는 human : 0.98, model : 0.92가 나왔다.</p>
<h3 id="5-자체-평가">5. 자체 평가</h3>
<p><strong>새로운 시도</strong></p>
<blockquote>
<ul>
<li>이미지에 대해 os 모듈을 활용하여 직접 다뤄보았다.</li>
<li>1epoch마다 새로운 데이터 분류를 통해 train, valid를 새로운 증강 없이 효율을 내었다.</li>
</ul>
</blockquote>
<p><strong>좋은 변화</strong></p>
<blockquote>
<ul>
<li>머신러닝에서 구현할 수 있는 방법을 딥러닝으로 적용해봤다.</li>
<li>이미지 안에서 EDA를 적용하는 방법에 대해 알게 되었다.</li>
<li>이미지 증강 방법에 대해 학습하고 직접 구현해 볼 수 있었다.</li>
</ul>
</blockquote>
<p><strong>잘 되지 않은 것</strong></p>
<blockquote>
<ul>
<li>팀원의 간극을 좁히지 못하였다. (수준차이)</li>
<li>성능을 올리기 위한 방법을 체계적으로 갖추지 못하였다.</li>
<li>mixup을 적용해보려 했으나 잘 적합되지 않았다.</li>
</ul>
</blockquote>
<p><strong>아쉬운 점</strong></p>
<blockquote>
<ul>
<li>이번 대회에서 다른 할 일이 많았기 때문에 몰입도 있게 하지 못했었다.</li>
<li>사전 학습 모델을 활용하였지만 직접 모델을 구성해보고 싶었으나 시간의 부족 관계로 직접 구현하지 못했다.</li>
</ul>
</blockquote>
<p><strong>배운점 및 시사점</strong></p>
<blockquote>
<ul>
<li>이미지 데이터를 다루는 방법에 대해 배울 수 있었다.</li>
<li>Timm 사전학습 모델을 활용하여 모델링을 할 수 있게 되었다.</li>
</ul>
</blockquote>
<h2 id="프로젝트를-마치며">프로젝트를 마치며</h2>
<p>딥러닝 경진대회를 처음 참여하면서 큰 욕심을 갖고 시작하였으나 예상한 것에 비해 사전 학습 모델만 구성하는 것 조차 쉽지 않았다. 더 많은 것들을 구현하고 가져가고 싶었지만 대게 뜻 대로 되지 않아서 매우 아쉬웠다.</p>
<p>다음 프로젝트인 NLP에서는 처음부터 목표를 크게 잡지 않고 내가 할 수 있고 가져갈 수 있는 것을 최대한 가져가야 겠다. 또한 팀원 그대로 진행하게 되는데 얻어갈 수 있는 것을 최대한 얻어가고 나에게 적합할 수 있는 것을 최대한 많이 적합해 보는 경험을 하고 싶다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[네번째 프로젝트: 마이너스]]></title>
            <link>https://velog.io/@wise_head/SCV</link>
            <guid>https://velog.io/@wise_head/SCV</guid>
            <pubDate>Tue, 30 Jan 2024 06:23:12 GMT</pubDate>
            <description><![CDATA[<h2 id="prologue">Prologue</h2>
<p>벌써 프로젝트의 네번째 시리즈가 끝이 났다. 두번째 프로젝트부터 이어지는 팀원으로 4번째 프로젝트까지 이어서 진행하게 되었다. 진행하면서 호흡도 잘맞았고 각자의 장단점을 서로 보완하여 발표가 끝날때 쯤이면 칭찬을 주로 들었다. <del>EDA장인이라는 강사님의 말이 가장 임펙트 있었다.</del></p>
<p>이번 프로젝트는 AI Stages 플랫폼을 활용해 지금까지 배워왔던 머신러닝 및 관련 내용에 대해 스스로 적합해보고 질문해보는 시간을 갖도록 해주는 좋은 대회였다. <del>비록 시스템간의 이슈는 존재했지만 관리측의 대응으로 최종 결과 및 우리가 지금까지 진행했던 결과에 대한 오류는 수정하고 있다고 공지를 받았다.</del></p>
<h2 id="개요">개요</h2>
<h3 id="1-프로젝트-개요">1. 프로젝트 개요</h3>
<h5 id="a-개요">A. 개요</h5>
<p>지속적으로 변하는 서울시의 아파트 가격을 예측한다. 이로 인해 부정거래 및 허위매물에 대해 파악하고 앞으로 아파트 가격이 어떻게 형성되는지 머신러닝 모델링을 통해 값을 예측하는 프로젝트이다. 데이터 셋은 2007년부터 2023년 06월까지 train 데이터로 제공되고, 2023년 7월 ~ 9월 까지의 데이터를 테스트 셋으로 주어졌다. 추가 데이터로 버스 및 지하철 좌표를 추가로 주어졌으며 외부 데이터를 가져올 수 있도록 허용했던 대회였다.</p>
<h5 id="b-환경">B. 환경</h5>
<p><strong>팀구성</strong> : 5인 1팀, 인당 3090ti서버를 VSCode와 SSH로 연결해서 사용
<strong>협업 환경</strong> : Notion, Github
<strong>의사 소통</strong> : Slack, Zoom, Offline Meeting</p>
<h3 id="2-프로젝트-팀-구성-및-역할">2. 프로젝트 팀 구성 및 역할</h3>
<p><strong>전체 목록</strong></p>
<blockquote>
<ul>
<li>외부 데이터 수집</li>
<li>데이터 EDA</li>
<li>전처리 및 train/test data 생성</li>
<li>머신러닝 모델링</li>
<li>파라미터 튜닝</li>
<li>앙상블</li>
</ul>
</blockquote>
<p><strong>팀 구성</strong>
배정 받은 팀은 5인이었다. 그러나 자신만의 사정으로 인해 대회 참여가 어려워졌던 한 분을 제외한 네명이서 팀을 이끌어 나갔으며 <strong>전체 목록</strong>에 있는 역할은 전부 참여하였지만 각자 파트별로 비중을 둔 선택을 진행하여 주된 역할을 담당하였다.</p>
<p>여기에서 나는 주로 외부 데이터 수집 파트와 전처리, EDA를 담당하였고 모델링 및 이하 파트에서는 진행 방향에 대해 상의하고 적용하고자 하는 방법에 대해 검토하고 토론하는 역할을 주로 담당하였다.</p>
<h3 id="3-프로젝트-수행-절차-및-방법">3. 프로젝트 수행 절차 및 방법</h3>
<h5 id="a-팀-목표-설정">A. 팀 목표 설정</h5>
<p><strong>1주차</strong> : 사전에 진행되었던 <a href="https://www.kaggle.com/competitions/house-prices-advanced-regression-techniques">캐글</a>, <a href="https://dacon.io/competitions/official/21265/overview/description">데이콘</a> 대회를 참조하여 미리 연습해보거나 업스테이지에서 준비해준 강의를 보고 적용해 볼 방법에 대해 정리하는 시간 갖기
<strong>2주차</strong> : 데이터 확인 및 EDA와 외부 데이터중 가져올 수 있는 요인에 대해 검색 및 가져오기
<strong>3주차</strong> : 모델링과 외부 데이터에 대한 EDA를 진행하여 최종 모델 완성, 마지막 Ensemble 전략</p>
<h5 id="b-프로젝트-사전기획">B. 프로젝트 사전기획</h5>
<h6 id="1-time-line-수립">(1) Time-line 수립</h6>
<p><img src="https://velog.velcdn.com/images/wise_head/post/33211b02-0da3-406e-9443-e7f90b79c2cf/image.png" alt=""></p>
<h6 id="2-협업-문화">(2) 협업 문화</h6>
<blockquote>
<ol>
<li>대회의 마무리 시기에는 같이 모여서 마무리 할 것(offline meeting)</li>
<li>각자의 일을 하다가 어느정도 결과가 나오면 같이 보면서 상의할 것</li>
<li>코드를 작성하고 진행할때 꼭 주석처리 및 마크다운 언어로 작성해둘 것</li>
<li>각자의 아이디어 및 사전 조사 자료는 <a href="https://www.notion.so/1-e1916b7fb9b94e948381794c3b824036">노션</a>에 공유해둘 것</li>
<li>특별한 사정이 없는 한 회의할 때 빠지지 말기</li>
<li>혼자서 계속 진행하지 말고 중간중간 상황에 대해 알려주기</li>
</ol>
</blockquote>
<h3 id="4-수행-결과">4. 수행 결과</h3>
<p><img src="https://velog.velcdn.com/images/wise_head/post/20920792-069d-49aa-818d-8da79613d35a/image.png" alt=""></p>
<p><strong>최종 전략</strong>
기존 변수에 대한 내용이 없었기 때문에 외부에서 데이터를 가져와서 결측치가 많은 변수를 대신 하거나 보완하여 활용할 수 있는 데이터를 많이 채우고자 함</p>
<blockquote>
<p>금융관련 요인 : 금리, GDP, 전세가율
거리 요인 : 역세권, 한강조망권, 숲이나 도시공원같은 자연 조경과 관련된 시설물
교육 요인 : 학군, 학급 개수
제재(制裁) 요인 : 부동산 제도 변화
아파트 구성 요인 : 방 개수, 화장실 개수, 주차장 면적, 세대수, 세대당 주차장 대수</p>
</blockquote>
<p>이중 나의 역할은 주로 거리요인, 교육요인과 아파트 구성요인을 담당하였다. 또한 서브로 금융 관련 요인을 담당하였다.</p>
<p>코드 및 설명은 <a href="https://github.com/UpstageAILab/upstage-ml-regression-01/tree/main">github</a>에 자세히 나와있다. 전략은 총 2가지 방법으로 이뤄졌는데 I전략은 외부 데이터를 의미가 존재하는 변수들로 최대로 채우고 부스팅 모델을 적용하는 방법으로 진행하였고, II전략은 아파트 가격이나 가장 상관성이 높은 전용면적에 대해 각자 구간을 만들어서 클러스터링을 진행하여 기본 베이스 모델과 앙상블하는 전략을 선택하였다. </p>
<p>결과적으로 <del>리더보드의 전산 오류 요인이 대회가 끝나고 밝혀졌지만</del> 리더보드에서 방향은 클러스터링 방향으로 가는 것이 성능이 좋았지만 프라이빗 스코어를 확인했을 때 추가한 변수들이 많은 모델이 성능이 더 좋은것을 확인할 수 있었다.</p>
<p>처음에 생각하던 상식선에서 이해가 되지 않는 흐름으로 가고 있어서 생각의 한계를 맞이한줄 알았으나 실제 전산 오류로 데이터 셋의 오류임이 밝혀저 배경지식을 도입해 생각했던 예상과 맞아서 한결 다행스러웠다.</p>
<h3 id="5-자체-평가">5. 자체 평가</h3>
<p><strong>새로운 시도</strong></p>
<blockquote>
<ul>
<li>기본적인 Baseline 구축을 위해 EDA와 데이터 수집을 다같이 진행한 후 완성된 데이터셋을 활용하여 Modeling을 진행</li>
<li>각자의 경험치를 위해 AutoML을 사용하지 않고 직접 GridSearch, Optuna 등 여러 도구를 직접 사용해 보는 과정을 진행</li>
<li>앙상블 방법 중 weight mean 방법 또한 적용해보기</li>
<li>없는 데이터를 직접 크롤링해서 결측치를 채워보기</li>
</ul>
</blockquote>
<p><strong>좋은 변화</strong></p>
<blockquote>
<ul>
<li>같이 의논하게 되면서 목적에 맞지 않게 하는 일이 줄어들게 되었다.</li>
<li>다양한 모델을 구현해봤으며 앙상블 방법에 맞게 적용해봤다.</li>
<li>부스팅 모델에 대해 적용하는 방법에 대해 익숙해졌다.</li>
<li>다양한 관점에서 보는 EDA 방법을 적합할 수 있었다.</li>
</ul>
</blockquote>
<p><strong>잘 되지 않은 것</strong></p>
<blockquote>
<ul>
<li>마지막 크롤링 데이터를 가공하는데 시간이 너무 오래 소요 되었다.</li>
<li>여러개를 동시에 진행하였기 때문에 하나의 작업에 집중할 수 없었다.</li>
<li>각자 하는일이 많았기 때문에 서로 어떠한 일을 하는지 알 수 없었기 때문에 서로간의 오해가 존재했다.</li>
</ul>
</blockquote>
<p><strong>아쉬운 점</strong></p>
<blockquote>
<ul>
<li>중간중간에 시스템 이슈가 있어서 대회의 몰입도가 저해되는 사례가 있었다.</li>
<li>짧은 시간동안 대회가 진행되었기 때문에 미처 사용해보지 못했던 피처가 존재했다. 시간 안배를 효율적으로 개선하는 방안을 마련해야겠다.</li>
</ul>
</blockquote>
<p><strong>배운점 및 시사점</strong></p>
<blockquote>
<ul>
<li>EDA 관점에 대해 확실시 할 수 있게 되었다.</li>
<li>앙상블 방법에 대해 무엇인지 예시를 들어 설명할 수 있게 되었다.</li>
</ul>
</blockquote>
<h2 id="프로젝트를-마치며">프로젝트를 마치며</h2>
<p>지금까지 머신러닝 프로젝트까지 진행하면서 내가 가장 잘 할 수 있었던 프로젝트가 마무리 되었다. 이를 발판삼아 앞으로의 딥러닝 프로젝트 2개와 실전 파이널 프로젝트까지 같은 팀으로 좋은 시너지를 발휘해서 승승장구하여 팀원 전원이 원하는 결과물에 도달할 수 있게 최선을 다하고 싶다.</p>
<p>앞으로는 딥러닝의 영역이니만큼 내가 배울것이 많을 것이라 생각이 든다. 이 과정을 통해 가져갈 수 있는 요인은 모조리 가져갔으면 좋겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[1차 그룹스터디를 마치며]]></title>
            <link>https://velog.io/@wise_head/1%EC%B0%A8-%EA%B7%B8%EB%A3%B9%EC%8A%A4%ED%84%B0%EB%94%94%EB%A5%BC-%EB%A7%88%EC%B9%98%EB%A9%B0</link>
            <guid>https://velog.io/@wise_head/1%EC%B0%A8-%EA%B7%B8%EB%A3%B9%EC%8A%A4%ED%84%B0%EB%94%94%EB%A5%BC-%EB%A7%88%EC%B9%98%EB%A9%B0</guid>
            <pubDate>Tue, 02 Jan 2024 02:19:49 GMT</pubDate>
            <description><![CDATA[<h2 id="개요">개요</h2>
<p>딥러닝을 시작하기 앞서 주제에 대해 많은 고민이 있었다. 실제로 이론을 좀 더 깊게 파고자 하는 책 중심 스터디와 코딩을 진행 해볼 수 있는 파이토치 템플릿을 다뤄볼 수 있는 기회라 생각이 들었다. 그래도 기초를 탄탄히 하고자 책을 선택하였다.</p>
<h3 id="주제">주제</h3>
<p>같이 책을 선택한 사람들을 모아서 그룹 스터디 조를 생성해 주었다. 따라서 처음에 스터디에 대해 토의하였다. 스터디원은 총 6명으로 진행되었으며 각자 딥러닝을 어느정도 사용해봤는지, 어디까지 학습에서 원하는지에 대해 의견을 나누었다. 결론부터 이야기하면 팀 내에서 전공으로 딥러닝을 다뤄본 사람이 있는 반면 딥러닝을 접하지도 않았던 팀원까지 층이 다양하게 존재했다. 따라서 우리는 다음과 같이 목표를 잡고 진행하기로 했다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/b226051b-b83a-4331-ab05-60b82eeed58a/image.png" alt=""></p>
<h2 id="학습-내용">학습 내용</h2>
<p>스터디 진행 방법은 AI 기초 학습: 딥러닝 강의를 주어진 2주 동안 강의를 완료하는 것을 목표로 잡고 진행하되 추가적으로 깊게 공부하고 싶다면 책이나 선택강의를 통해 부가적인 지식을 얻기로 하였다. 또한 질의응답이 있으면 다음 스터디 모임 시간에 가져와 해결하는 것을 중심으로 진행하고 이미 딥러닝에 대해 접해본 사람에 한해 새로운 모델이나 심화과정에 대한 내용을 소개하는 방식으로 진행하였다.</p>
<h3 id="개인">개인</h3>
<p>기본적으로 강의를 듣고 태블릿을 통해 내용을 정리 한 후 블로그에 올리는 형식을 선택하였다. 일 부 내용을 올리자면 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/e75c5a1c-3f7d-48d7-b707-872532c84b73/image.jpg" alt=""></p>
<p>Tensor에 대한 내용을 정리한 것이며 Hydra를 마지막으로 정리를 진행하였다. 또한 실습 코드는 주어진 강의자료를 다운로드 받아 한번씩 따라 쳐보는 것으로 마무리 하였다. </p>
<h3 id="그룹">그룹</h3>
<p>각자 질문에 대한 내용을 가지고 와 서로 어떤 질문이 있었는지 토의하고 그에 관한 답변을 서로 주고 받는 형식을 활용하였다. 기본적으로 내용에 익숙했지만 새로 배우는 내용 또한 있었기 때문에 많지 않았지만 다음과 같은 질의응답을 진행하였다.</p>
<blockquote>
<p>❓ 강의 내용에는 나와있지 않지만 Adadelta라는 optimizer 방법이 있는데 이 내용이 강의 내용에 나오는 Adam 방법인지 궁금합니다.</p>
</blockquote>
<blockquote>
<p>👂🏻 <a href="https://velog.io/@viriditass/%EB%82%B4%EA%B0%80-%EB%B3%B4%EB%A0%A4%EA%B3%A0-%EB%A7%8C%EB%93%A0-Optimizier-%EC%A0%95%EB%A6%AC">velog</a>에 있는 내용을 보면 Adadelta라는 방법 뿐만 아니라 강의에서 나오지 않은 다양한 방법이 존재합니다. 한번 참조해서 더 많은 내용을 얻어가셨으면 좋겠습니다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/wise_head/post/e45d94db-d18b-4673-a078-ba5946218357/image.png" alt=""></p>
<h2 id="멘토링">멘토링</h2>
<p>기본적으로 강의를 통해 진행하였기 때문에 책에 대한 내용을 기반으로 진행 될거라 예상했던 스터디는 책에 대한 내용에 대해 담당 멘토님께 적절한 질문을 하기 어려웠다. 따라서 기존 그룹 스터디와 진행하는 방향성이 같게 그룹원 내에서 해결하지 못하거나 멘토링을 진행하면서 새롭게 떠올랐던 질문사항에 대한 답안을 주로 듣는 것으로 진행하였다.</p>
<h3 id="질문사항">질문사항</h3>
<p><img src="https://velog.velcdn.com/images/wise_head/post/634b478a-d2f0-415e-9aba-b304f1db604f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/f778b610-e290-49bf-9b55-761ff6e26309/image.png" alt=""></p>
<p>다음과 같은 내용 이외에도 많은 질문이 있었지만 생략하도록 한다.</p>
<h2 id="마무리">마무리</h2>
<h3 id="추가-지식">추가 지식</h3>
<p>한 팀원분이 CLIP, GAN과 같은 강의 내용에서 깊게 다루지 않은 심화내용에 대해 소개하였다. 내용은 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/515fe71c-e2ad-485a-b5d8-1100006c99ad/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/5425a1dd-9f35-4643-acbe-d7578077accc/image.png" alt=""></p>
<h3 id="회고-및-고찰">회고 및 고찰</h3>
<p>처음 배우는 것은 아니었기 때문에 내용에 대한 이해를 빠르게 할 수 있었다. 그러나 이번 스터디는 앞으로 진행할 프로젝트에 연관되어 있는 내용이 아닌 기본적인 내용을 학습하는 단계였기 때문에 목적성이 일치하지 않아서 스터디를 질의응답을 받는 식으로 진행할 수 밖에 없었던 것이 너무 아쉬웠다. </p>
<p>또한 현재 태블릿을 통해 정리를 완료했지만 블로그에 스스로 정리하는 시간을 들이지 않았기 때문에 글 작성 기준으로 <a href="https://velog.io/@wise_head/%EB%AA%A8%EB%8D%B8-%ED%95%99%EC%8A%B5%EB%B2%95-02">역전파 알고리즘</a>을 마지막으로 게시하였다. 추후 내용을 다시 보면서 정리할 시간을 가질 예정이다.</p>
<p>마지막으로 멘토님의 멘토링을 단순한 질의응답으로 넘어갔던 것이 매우 아쉬웠다. 스터디 진행사항과 관련해서 공유하고 이 방향성이 추후 팀원 각자 습관을 들이거나 스터디의 효율적인 활용법에 대해 터득하고 진행했으면 더 좋았을 것이다.</p>
<p>그럼에도 스터디를 진행함으로써 의의는 존재했다. 혼자서 공부하는 것이 아니었기 때문에 패스트캠퍼스에서 지정해준 가이드라인을 따라서 학습하는 습관을 들일 수 있는 좋은 기회였고 다른 팀원에게 민폐가 되지 않도록 직접 보이는 강제성이 아닌 스스로 부여할 수 있는 원동력이 되었다.</p>
<p>또한 스스로 잘 안다고 생각했던 내용에 대해 다른 팀원의 질문을 듣고 내용을 정리하거나 대답을 하지 못했던 부분에 대해 다시한번 복습하고 정리할 수 있는 기회를 가질 수 있었다. 반복적인 학습효과를 단기간에 내기 좋은 그룹스터디였다.</p>
<p>이번을 기반으로 앞으로 남은 프로젝트 3개 ~ 4개를 진행하는 동안 현재 맛보기로 진행했던 그룹 스터디를 떠올리면서 방향성을 잡고 딥러닝에서 내가 하고싶은 분야 및 도메인을 확정짓고 올해동안 취업이라는 목표를 꼭 이뤘으면 좋겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[모델 학습법 - 02]]></title>
            <link>https://velog.io/@wise_head/%EB%AA%A8%EB%8D%B8-%ED%95%99%EC%8A%B5%EB%B2%95-02</link>
            <guid>https://velog.io/@wise_head/%EB%AA%A8%EB%8D%B8-%ED%95%99%EC%8A%B5%EB%B2%95-02</guid>
            <pubDate>Wed, 27 Dec 2023 16:47:01 GMT</pubDate>
            <description><![CDATA[<h2 id="역전파">역전파</h2>
<p>파라미터를 일일이 계산하는 것은 시간과 비용이 많이 들어가는 방법이다. 편미분을 개수만큼 진행해야 하기 때문이다.</p>
<p>따라서 이를 보완하기 위해 역전파가 등장했다.</p>
<h3 id="계산-그래프">계산 그래프</h3>
<p>일련의 연산 과정을 하나의 방향 그래프로 나타낸 것이다. 아래의 그림과 같이 구성을 이룬다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/153bacae-7d82-4250-9d36-bb4551129c42/image.png" alt=""></p>
<h4 id="구조">구조</h4>
<p>구조는 다음과 같이 이루어진다.</p>
<blockquote>
<ul>
<li>노드(node): 하나의 연산을 의미</li>
<li>엣지(edge): 노드(연산)에 필요한 입력값을 의미</li>
</ul>
</blockquote>
<h4 id="사용하는-이유">사용하는 이유</h4>
<p>계산 그래프를 사용하게 되면 편미분 계산이 가능하며 중간 결과를 보관할 수 있다. 이를 통해 다음과 같은 이점을 가지게 된다.</p>
<blockquote>
<ol>
<li>복잡한 문제를 단순화</li>
<li>각 변수에 대한 미분을 효율적으로 계산</li>
</ol>
</blockquote>
<p>아래의 그림에서 계산 그래프의 예제를 확인할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/8b8b4303-c87e-49cf-8eef-42efbf78ea2a/image.png" alt=""></p>
<h3 id="연쇄-법칙">연쇄 법칙</h3>
<p>다음 수식은 우리가 흔히 알고 있는 연쇄법칙이다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/3d938d0d-faf8-4152-87da-243fbcb1ef4b/image.png" alt=""></p>
<h4 id="뉴럴넷과의-연관성">뉴럴넷과의 연관성</h4>
<p><img src="https://velog.velcdn.com/images/wise_head/post/e4efd1c0-b6ab-4a98-b404-01ff932f5da0/image.png" alt=""></p>
<p>4개의 노드로 구성된 간단한 뉴럴넷을 예제로 들었을 때 다음과 같은 특징이 있다.</p>
<blockquote>
<p>x에 대해 손실함수 계산 가능
각각의 파라미터를 업데이트 하기 위해 편미분을 구해야함
모든 파라미터에 대해 편미분을 적용해야하지만 연쇄법칙으로 그 과정을 일부 줄일 수 있음</p>
</blockquote>
<p>또한 x 에서 L까지 방향대로 수식을 계산하여 구하는 것이 순전파, 반대로 L부터 시작해서 x에 가까운 노드까지 구하는 방식이 역전파이다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/68f322ad-873b-4df9-b868-880b791ede2c/image.png" alt=""></p>
<h3 id="역전파-알고리즘">역전파 알고리즘</h3>
<p>신경망의 추론 방향과 반대되는 방향으로 순차적으로 오차에 의한 편미분을 수행하여 각 레이어의 파라미터를 업데이트하는 과정을 역전파 알고리즘이라 한다. </p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/daf71f34-1359-4c33-89f1-216ef76b6887/image.png" alt=""></p>
<p>다음과 같이 순전파 방향으로 계산을 진행하고 역전파 방향으로 파라미터를 구하는 방식으로 작동한다. 이때 노드의 종류는 다음과 같이 두가지를 예시로 들 수 있는데, 역전파를 통해 파라미터를 구하기 위해 다음과 같은 방법으로 파라미터를 업데이트 한다.</p>
<ul>
<li>곱셈 노드: 다른 엣지의 값을 곱해서 넘어감</li>
<li>덧셈 노드: 그대로 넘어감</li>
</ul>
<h4 id="파라미터-업데이트">파라미터 업데이트</h4>
<p>파라미터는 다음과 같은 방법을 통해 업데이트 된다.</p>
<blockquote>
<ol>
<li>순전파 방향으로 Loss 계산고 예측을 진행</li>
<li>역전파를 통해 편미분 계산</li>
<li>각 파라미터에 learning rate를 곱하여 감산해주기</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/wise_head/post/59d50fb7-aeae-4394-847e-7023c075ad7c/image.png" alt=""></p>
<p>예시를 통해 learning rate까지 도입하였을 때 다음과 같이 과정을 진행시킨다.</p>
<h3 id="손실-함수의-기본-가정">손실 함수의 기본 가정</h3>
<p>손실함수를 들어가기에 앞서 다음과 같이 Notation을 정의하고 진행하기로 한다.</p>
<blockquote>
<p>활성화 함수 입력: z
활성화 함수 출력: a
delta: error
j: 뉴런
l: layer</p>
</blockquote>
<h4 id="loss에-대하-가정">Loss에 대하 가정</h4>
<p>Loss에 대한 가정은 다음과 같다.</p>
<ol>
<li>학습 데이터 샘플에 대한 신경망의 총 손실은 각 데이터 샘플에 대한 손실과 같다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/wise_head/post/c9a68b03-20f5-4820-bb4b-4e7c1ad8c199/image.png" alt=""></p>
<p>이를 통해서 다음과 같이 편미분을 계산할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/c74544f4-86f7-406d-b1be-feb73f174cd4/image.png" alt=""></p>
<p>여기서 w와 b에 대해서 어떤 차이가 있는지 궁금할 것이다. w는 weight를 나타내며 b는 bias를 나타낸다.</p>
<ol start="2">
<li>각 학습 데이터 샘플에 대한 손실은 a^L에 대한 함수이다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/wise_head/post/f7b18741-d40e-4e48-adc1-88f52b57dcda/image.png" alt=""></p>
<p>비용 함수는 설계하기 나름이다. 중간 레이어의 출력 값으로도 비용 함수를 계산할 수도 있지만, 최종 출력에 대한 함수로만 정의해야 역전파를 활용 가능하다.</p>
<h3 id="역전파의-기본-방정식">역전파의 기본 방정식</h3>
<h4 id="for-the-error-in-the-output-layer-𝜹l">for the error in the output layer, 𝜹^L</h4>
<p><img src="https://velog.velcdn.com/images/wise_head/post/a832043a-461b-4521-a191-010805d0eab6/image.png" alt=""></p>
<p>다음과 같이 수식이 표현되며 이 식을 전개할 수 있다. 또한 행렬로 계산할 수도 있는데 결과적으로 간단하게 표현하면 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/c6db4bfb-99f1-471b-ae3b-93ef57172745/image.png" alt=""></p>
<h4 id="for-the-error-in-the-l-th-layer-in-terms-of-the-error-in-the-next-layer-l1-𝜹𝒍-↔-𝜹l1">for the error in the l-th layer in terms of the error in the next layer (l+1), 𝜹^𝒍 ↔ 𝜹^(l+1)</h4>
<p>마지막 layer가 아닌 다른 hidden layer에서 계산되는 계산식은 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/c0d45dac-495d-407c-a328-b1f6c2f320dc/image.png" alt=""></p>
<p>이것 또한 행렬로 나타내면 다음 그림과 같다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/0c106cda-1aea-48e9-80bd-51055184e766/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/6822df01-952a-45a9-9c67-d2ca0d09db9d/image.png" alt=""></p>
<h4 id="for-the-rate-of-change-of-the-cost-with-respect-to-any-biasweight-in-the-network">for the rate of change of the cost with respect to any (bias/weight) in the network</h4>
<p>위의 노드에서 구했던 방식 처럼 각각의 weight, bias를 구하려면 다음과 같은 식을 얻을 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/b18a7c4d-eb84-459d-97b9-06094f78b982/image.png" alt=""></p>
<p>위가 bias, 아래가 weight를 나타낸다.</p>
<p>여기서 얻을 수 있는 insight는 다음과 같다.</p>
<blockquote>
<ol>
<li>Low-activation neurons</li>
</ol>
<ul>
<li>만일 뉴런 a가 활성화된 정도가 작다면,관련 가중치의 변화가 비용 함수 C의 변화에거의 영향을 주지 않는다. </li>
<li>마찬가지로, 가중치 또한 천천히 학습된다. (즉, C의 기울기도 가중치에 영향을 주지 않는다.)</li>
</ul>
<ol start="2">
<li>Saturated neurons</li>
</ol>
<ul>
<li>출력층에서의 출력값이 거의 0 또는 1인 경우,관련 뉴런의 가중치 및 편향는 느리게 학습된다.</li>
<li>이는 이미 잘 맞추는 문제는 더 이상 풀지 않는 것과 유사하다.</li>
</ul>
</blockquote>
<h3 id="summary">Summary</h3>
<p>역전파의 파라미터를 구하는 방식을 다음과 같이 한눈에 요약할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/f44fd33d-6218-40d9-b2ae-2b535d897049/image.png" alt=""></p>
<p>또한 각 layer의 역전파 알고리즘은 다음과 같은 과정으로 계산된다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/fe040dde-fa23-40d9-9968-7c40306858d5/image.png" alt=""></p>
<p>마지막으로 bias, weight 또한 다음과 같이 계산된다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/7acd2052-342a-4cb9-b39e-fd0fbc73e1d8/image.png" alt=""></p>
<h2 id="🤔고찰">🤔고찰</h2>
<p>역전파 알고리즘은 기존에 한번 공부해본 적이 있었다. 편미분을 번거롭게 해야하는 경사하강법의 단점을 보완한 방법이라 외우고 있었다. 따라서 처음에 순방향으로 진행하고 역방향으로 역산하는 과정은 이미 알고 있었지만 체인 룰을 통해 파라미터가 전달된다는 방식으로 외우기 보다 이전 레이어로 진행할 때 이미 구해져있었던 현재 레이어의 값을 대입하는 방식으로 잘못 알고 있었다. 이번 기회를 통해 바로잡을 수 있었던 좋은 기회를 가지게 되었고 아직까진 딥러닝 모델에 어떻게 적용되는지 실감이 나지 않지만 곧 활용해보다 보면 감이 올것이라 생각이 든다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[모델 학습법 - 01]]></title>
            <link>https://velog.io/@wise_head/%EB%AA%A8%EB%8D%B8-%ED%95%99%EC%8A%B5%EB%B2%95-01</link>
            <guid>https://velog.io/@wise_head/%EB%AA%A8%EB%8D%B8-%ED%95%99%EC%8A%B5%EB%B2%95-01</guid>
            <pubDate>Tue, 19 Dec 2023 17:24:21 GMT</pubDate>
            <description><![CDATA[<h2 id="퍼셉트론의-개요">퍼셉트론의 개요</h2>
<h3 id="퍼셉트론의-구조">퍼셉트론의 구조</h3>
<p>퍼셉트론은 1957년 코넬 항공 연구소의 프랑크 로젠블라트에 의해 고안된 가장 간단한 형태의 Feed-Foward 네트워크라 한다. 입력 신호를 받아 수식을 계산하여 결과를 출력해주는 방식으로 진행된다. 흔히 사람의 뇌에는 뉴런이 존재하는데 모형 자체가 이 뉴럴과 비슷한 모양을 가지고 있기 때문에 인공 뉴런이라 부르기도 하며 지식을 학습하는 방법 또한 비슷한 내용을 가지고 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/fae4d9a4-d949-4885-bc39-4597dfbc9205/image.png" alt=""></p>
<p>다음 그림은 단일 퍼셉트론의 구조이다. </p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/29fd3f43-ac65-46eb-8f5e-7a0989edbf37/image.png" alt=""></p>
<p>구조를 수식으로 풀어 쓰게 되면 다음과 같은 수식을 가지는 것을 확인할 수 있다. 이렇게 선형 관계를 표현하기도 하며 현재 예시로는 Binary input을 통한 Binary Output을 배출하는 과정을 나타낸다.</p>
<p>여기에서 퍼셉트론이 선택될 확률을 높이기 위해서 편향을 추가하는 경우가 있다. 현재 한개의 퍼셉트론을 보이지만 많은 퍼셉트론을 활용하게 되면 분명 더 중요하게 생각되는 퍼셉트론이 존재할 것이다. 이럴때 활성화가 더 활발하게 될 수 있기 위해 편향에 대한 가중치를 부여해준다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/20239153-8d55-427a-b4b2-4f3349a9c528/image.png" alt=""></p>
<p>또한 가중치와 편향에 대해 다음과 같이 경우에 따라서 세가지로 표현하기도 한다.</p>
<ul>
<li>“w⋅x가 (T-wo) 보다 큰가?”</li>
<li>“w⋅x가 b보다 큰가?” (b = T-wo)</li>
<li>“w⋅x+b가 0보다 큰가?” (b = wo-T) </li>
</ul>
<h3 id="퍼셉트론의-원리">퍼셉트론의 원리</h3>
<p><img src="https://velog.velcdn.com/images/wise_head/post/cfbec887-0dae-4fbd-a493-515048a09242/image.png" alt=""></p>
<p>퍼셉트론은 다음과 같이 x, y를 input으로 받는 예시를 통해 기하학적 원리를 파악할 수 있다. 각각 x와 y를 대입하게 되면 가중치에 의해 보여지는 수식을 가지게되고 out은 x와 y간의 범위를 통해 오른쪽의 그림의 영역에 맞게 값을 가질 수 있게된다. 모형은 마치 직선을 통해 영역을 선형 분리한 모습과 같다.</p>
<p>퍼셉트론이 각광 받은 이유는 선형 분리 가능성 덕분에 AND, OR, NAND 등의 로직을 구현할 수 있게 되었다.이중 NAND gate는 “universal for computation”으로 알려져 있고, 이는 어떤 모델이든 NAND gate의 조합으로 표현 가능하다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/d5694cd5-b717-4b49-8311-65e480f151a1/image.png" alt=""></p>
<p>XOR 논리 게이트는 하나의 퍼셉트론으로는 구현이 불가능함을 1969년 Minsky가 “Perceptron”을 통해 증명하였다. 그러나 여러 층의 퍼셉트론을 활용하면 분리가 가능하며, 이를 다층 퍼셉트론의 비선형 분리 가능성이라고 한다. 즉 퍼셉트론들의 조합으로 어떠한 연산이든, 어떠한 입출력 관계든지 표현이 가능하다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/0cc566f5-7ba0-4bfb-ae22-e4f3f6457d47/image.png" alt=""></p>
<h3 id="다층-퍼셉트론">다층 퍼셉트론</h3>
<p>퍼셉트론을 사용하지 않더라도 Multiple Layer Networks가 아닌 MLP로 불리기도 한다. </p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/7e798f49-7152-4131-bf58-4709622fc359/image.png" alt=""></p>
<p>위의 그림처럼 특정한 노드 하나를 뽑았을 때 특정 노드의 이전층과 다음층에 있는 노드에 대해 모두 연결이 되어있는 형태를 말한다. 따라서 모두 연결되어 있기 때문에 Fully-Connected Layers(FCs)의 동의어로 사용된다.</p>
<h4 id="활성화-함수-activation-function">활성화 함수 (Activation Function)</h4>
<p>활성화 함수가 없게 되면 단순한 선형 모형을 활용하는 것처럼 층에 대한 의미가 존재하지 않는다. 또한 비선형으로 구분하는 것이 선형으로 구분하는 것 보다 성능이 좋을때가 많기 때문에 사용하게 된다. 아래의 그림에서 설명하는 것 처럼 활성화 함수를 활용하는 이유에 대해 확인할 수 있을 것이다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/e2d797c7-114a-4620-a1b4-ae54e69dd441/image.png" alt=""></p>
<p>활성화 함수의 대표적인 종류로는 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/4bd38fe6-bb8a-4ba3-a1a9-3cb203c913b6/image.png" alt=""></p>
<p>이중 대표적인 시그모이드 함수에 대해 파헤쳐 보면 연산 과정 전체를 미분을 가능하게 하는 함수이기 때문에 자주 활용된다 한다. 이는 추후의 역전파 알고리즘과도 관련이 되어있는 사항이며 미분에 대한 연산을 줄이고 다른 방법을 통해 총 연산 시간을 줄인 것으로 알려져있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/44187654-c433-47c6-9763-9e73651f42cb/image.png" alt=""></p>
<h4 id="구조">구조</h4>
<p><img src="https://velog.velcdn.com/images/wise_head/post/50a80570-6f23-40ae-84ff-78ae29a599af/image.png" alt=""></p>
<p>위의 그림처럼 레이어 수가 4인 MLP의 구조는 층, 노드, 엣지로 이루어져있다. 각각 데이터, 함수 + 활성화함수, 가중치를 뜻한다.</p>
<h2 id="경사하강법">경사하강법</h2>
<h3 id="배경">배경</h3>
<h4 id="미분">미분</h4>
<p>변수의 움직임에 따른 함수값의 변화를 측정하는 도구로 최적화에서 제일 많이 사용하는 기법이다. 극한을 통해 정의되며, 직접 구하기 위해서는 ℎ→0 극한을 계산해야 한다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/dfa4cf66-4b2c-434b-ac79-5704d135466a/image.png" alt=""></p>
<h4 id="기울기">기울기</h4>
<p>x에서의 미분값은 함수 <code>f</code> 의 주어진 점 <code>(x, f(x))</code> 에서의 접선의 기울기와 동일하다. 어떤 점에서의 함수의 기울기를 알면 어느 방향으로 점을 움직여야 함수값이 증가 or 감소하는지 알 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/48e449d1-c331-4dc3-a260-11e1726da8e4/image.png" alt=""></p>
<h4 id="편미분">편미분</h4>
<p>벡터를 입력값으로 받는 다변수 함수의 경우, 각 변수에 대해 미분한 편미분을 사용한다. 각 변수에 대한 편미분을 나타낸 그래디언트(gradient) 벡터를 이용하면 마찬가지로 다변수 함수의 기울기를 알 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/ade90f76-2ecc-4be0-b19c-6d0f57f438c1/image.png" alt=""></p>
<h3 id="경사하강법-1">경사하강법</h3>
<p><img src="https://velog.velcdn.com/images/wise_head/post/752b3274-54d9-48a8-951a-2b80ce003f08/image.png" alt=""></p>
<p>기울기(<code>f&#39;(x)</code>)가 감소하는 방향으로 를 움직여서 의 최소값을 찾는 알고리즘 
딥러닝에선 손실 함수의 그래디언트(<code>∇L_θ</code>)가 감소하는 방향으로 파라미터 를 움직여 
손실 함수의 최소값을 찾는다.</p>
<p>학습 과정은 다음과 같다.</p>
<ul>
<li><ol>
<li>모델 파라미터 θ ={W,b} 초기화</li>
</ol>
</li>
<li><ol start="2">
<li>전체 학습데이터셋에서의 손실 함수 값을 구하고 미분을 통해 이를 최소화하는 모델 파라미터 W,b를 찾는다. 
<img src="https://velog.velcdn.com/images/wise_head/post/e7fbf11b-ba8d-4d0a-bc81-35942033df45/image.png" alt=""></li>
</ol>
</li>
<li><ol start="3">
<li>2를 반복하다가 종료 조건이 충족되면 학습 끝! 
<img src="https://velog.velcdn.com/images/wise_head/post/ae799d84-99e7-457d-a15b-3417595102ff/image.png" alt=""></li>
</ol>
</li>
</ul>
<p>그러나 이런 경사하강법에도 한계가 존재한다. 다음 그림에서 명확하게 볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/f680ac78-73c6-4e9c-b4cc-37b17ebd52bd/image.png" alt=""></p>
<p>두 경우 모두 최적의 파라미터를 찾다가 원하는 곳에서 멈추지 못하고 다른 곳에서 멈춰있는 경우를 발견할 수 있을 것이다. 이에 대한 해결책으로 다음과 같이 세가지 방법을 활용할 수 있다.</p>
<ul>
<li>① 파라미터 초기화를 굉장히 잘한다. (여러 초기화 기법, pretraining)</li>
<li>② 모델 구조를 바꿔서 그래프 모양을 바꾼다.</li>
<li>③ Learning Step을 바꾼다.</li>
</ul>
<p>현실적으로 ①, ②번은 쉽지 않은 방법이다. 실제로 내가 제대로 된 모형을 알고 있으면 가능하지만 알지 못하는 경우에는 어느것이 맞는지도 모를 수 있기 때문이다.</p>
<p>따라서 ③번 방법을 활용하는 것을 목표로 한다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/49e1dd5e-85b1-4e3b-8f18-ffd2269e6091/image.png" alt=""></p>
<p>각 그림은 Learning Rate를 조절한 그래프이다. 너무 적게 움직이거나 너무 많이 움직여도 극소점을 찾아가지 못한다. 따라서 파라미터를 조절하듯 적절한 Learning Rate를 찾아야 한다.</p>
<p>또한 경사하강법은 모든 경우에 대해 연산을 모두 적용해야 하는 탓에 시간과 비용 면에서 오래 걸린다는 단점이 있다. 샘플수가 점점 늘어날 수록 연산량이 기하급수적으로 늘어나기 때문이다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/364e1314-01f9-4ad2-87df-4d2accf9502c/image.png" alt=""></p>
<h3 id="확률적-경사-하강법">확률적 경사 하강법</h3>
<p>모든 데이터를 사용해서 구한 경사를 통해 파라미터를 한 번 업데이트 하는 대신, 데이터 한 개 또는 일부를 활용하여 구한 경사로 여러 번 업데이트를 진행하는 경사 하강법을 보강하기 위해 만들어진 방법이다. 이 방법은 다음과 같은 특징을 가지고있다.</p>
<ul>
<li>SGD를 통해 한 번의 학습을 하는 데에 사용되는 데이터 샘플의 집합을 ‘미니 배치(mini-batch)’ 혹은 간단히 ‘배치(batch)’라고 부른다.</li>
<li>손실 함수의 크기를 1/m로 스케일하는 과정은 학습 데이터의 크기가 실시간으로 바뀌는 환경에서 특히나 잘 작동한다.</li>
<li>m=1인 환경을 ‘온라인 학습(online/incremental learning)’이라고 부른다.</li>
</ul>
<p>이 방법은 볼록하지 않은 목적식을 가진 경우, SGD가 GD보다 실증적으로 더 낫다고 검증되었다. SGD는 학습에 활용하는 데이터 샘플이 매번 달라짐에 따라 손실 함수의 형태가 약간씩 바뀐다고 볼 수 있으며, 이를 통해 local minima에 빠지는 것을 방지하여 최적해에 도달할 가능성을 높이는 방법으로 이해할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/b76eb45f-0a56-4c32-bfb6-13d631d585d9/image.png" alt=""></p>
<p>또한 데이터의 일부를 가지고 그래디언트 벡터를 계산하고 파라미터를 업데이트하므로 컴퓨터의 메모리 및 연산 자원을 좀 더 효율적으로 활용할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/b278559a-58bd-4458-bb48-77d84f1f6fd3/image.png" alt=""></p>
<h2 id="❓고찰">❓고찰</h2>
<p>아직까지는 익숙한 내용을 많이 보기 때문에 받아들이기 어려운 내용은 없었다. 앞으로 딥러닝에서 모델이 고도화 될 때 지금 챕터처럼 쉽게 이해하고 사용할 수 있었으면 좋겠다.</p>
<p>딥러닝 개요 부분은 이번 내용보다 더 기초적인 내용으로 이미 알고 있는 내용이 대다수 였으며 더이상의 개념을 공유하는 것은 의미 없다 판단하여 이번 내용을 시작으로 작성하였다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[딥러닝 기술 종류]]></title>
            <link>https://velog.io/@wise_head/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EA%B8%B0%EC%88%A0-%EC%A2%85%EB%A5%98</link>
            <guid>https://velog.io/@wise_head/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EA%B8%B0%EC%88%A0-%EC%A2%85%EB%A5%98</guid>
            <pubDate>Mon, 18 Dec 2023 14:14:55 GMT</pubDate>
            <description><![CDATA[<h2 id="학습-방식에-의한-구분">학습 방식에 의한 구분</h2>
<p><img src="https://velog.velcdn.com/images/wise_head/post/8286f8c8-69f8-4d46-bd09-93ab56b8d7da/image.png" alt=""></p>
<p>AI는 다음 그림과 같이 영역별로 종류가 나뉘게 된다. 처음으로 학습 방식에 의한 구분을 알아보고자 한다.</p>
<h3 id="구분의-기준">구분의 기준</h3>
<p><img src="https://velog.velcdn.com/images/wise_head/post/debc4ff7-6585-4968-bf38-315a5d041088/image.png" alt=""></p>
<p>그림에서 보이는 것 처럼 총 세가지 형태로 구분 할 수 있다. 각각 데이터의 형태와 원하는 것을 얻기위한 목적에 따라서 구분지어진다. 기본적으로 다음과 같은 정보로 구분된다.</p>
<blockquote>
<ul>
<li><p>지도 학습</p>
<ul>
<li>라벨링이 존재하는 데이터</li>
<li>직접 피드백이 가능한 학습 방법</li>
</ul>
</li>
<li><p>비지도 학습</p>
<ul>
<li>라벨링이 존재하지 않은 데이터</li>
<li>피드백이 존재하지 않은 학습 방법</li>
<li>숨은 구조를 찾는 학습 방법</li>
</ul>
</li>
<li><p>강화 학습</p>
<ul>
<li>라벨링이 존재하지 않은 데이터</li>
<li>피드백의 속도가 느림</li>
<li>결과에 따른 보상이 동반되는 학습 방법</li>
</ul>
</li>
</ul>
</blockquote>
<h3 id="지도학습">지도학습</h3>
<p>특정 입력에 대한 정답을 알려주는 방식으로 학습하는 지도학습 방법은 다음과 같은 방법으로 나뉘어진다.</p>
<ul>
<li>분류: 기정의된 클래스들 중 입력이 어느 클래스에 해당하는지 맞추는 태스크</li>
<li>회귀: 입력 데이터에 대한 실수 혹은 실수의 집합을 (벡터) 출력으로 맵핑해주는 (Mapping) 태스크</li>
</ul>
<p>또한 동시에 진행하는 경우도 존재한다. 예를들어 다음과 같이 이미지 내의 음식들 종류와 위치를 동시에 찾아야 하는 경우를 말하는데 이를 Objective Detection이라 부른다.
<img src="https://velog.velcdn.com/images/wise_head/post/405e2de3-b4eb-4dde-9bf2-a8cf2e4f7d29/image.png" alt=""></p>
<p>음식의 종류를 맞출 때 분류를 적용하며 해당 음식이 위치하는 박스의 좌표를 추정할 때 회귀를 활용한다.</p>
<p>이러한 지도학습을 활용할 때 데이터의 품질에 따라 모델의 성능이 좌지우지된다고 한다. 즉 라벨링 노이즈가 작을 수록 모델의 성능이 좋아진다.</p>
<h4 id="라벨링-노이즈">라벨링 노이즈</h4>
<p><img src="https://velog.velcdn.com/images/wise_head/post/0ff6316f-82ab-4ae3-89a6-adfe343bb84a/image.png" alt=""></p>
<p>다음 그림을 확인했을 때 양쪽 그림 모두 노이즈가 존재하는 데이터가 과반수 이상이 존재한다. 그러나 왼쪽 그래프가 오른쪽 그래프에 비해 관측되는 데이터가 훨씬 적다. 따라서 참 관계의 선을 이탈할 가능성이 매우 높다. 또한 적은 데이터로 추정하게 되면 일반화 시키기에 매우 어려운 결과를 가져올 수 있다. 반면 오른쪽 그래프는 많은 데이터를 활용하여 참 관계의 선을 따라가고 있는 것을 확인할 수 있는데 이로써 데이터가 많을수록 나타나는 직선의 참 관계에 더 가까운 선을 찾을 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/ace3c773-45d1-4d12-a0f2-da442dd948b5/image.png" alt=""></p>
<p>또한 데이터가 적어도 clean한 경우 적합이 잘 되는 경우도 있는데 다음 두 그래프와 같은 경우이다. 그러나 두 그래프의 차이는 왼쪽 그래프와 같은 경우 참 관계의 선에서 고루 퍼져있는 모형인 반면 오른쪽 그림은 왼쪽 아래의 참 관계에 치우쳐진 경우이다. 참 관계를 예측하지 못하고 파란색 직선처럼 점점 이탈하게 되는 결과를 초래할 수 있다. 따라서 데이터가 고루 퍼져있으면서 정확한 위치에 있는 경우가 좋은 모델을 확보하기 쉽다. 이를 Robust라고 하기도 한다.</p>
<h3 id="비지도-학습">비지도 학습</h3>
<p>특정 입력에 대한 정답을 알지 않고 학습시키는 방식으로 비지도학습의 대표적인 예로 다음과 같은 방법이 있다.</p>
<ul>
<li>클러스터링: 데이터를 비슷한 특징끼리 군집화</li>
<li>차원축소: N차원 입력을 N&gt;n차원 출력으로 변경하는 태스크</li>
</ul>
<h4 id="클러스터링">클러스터링</h4>
<p>클러스터링은 다음과 같이 작동한다.</p>
<ol>
<li>임의의 k개의 점을 지정하고 클래스를 부여한다.</li>
<li>나머지 점들을 가장 가까운 클래스로 포함하여 중심점의 클래스를 부여</li>
<li>클래스별 중심점 재 계산후 각 점들의 변화가 없을 때 까지 적용</li>
</ol>
<p><img src="https://velog.velcdn.com/images/wise_head/post/fcb3fd3a-f729-4996-af10-a8b76b17856e/image.png" alt=""></p>
<p>다음과 같은 클러스터링 방법에서 중심점의 클래스를 평균으로 부여할 때 k-means 클러스터링 방법이라 한다. </p>
<h4 id="차원-축소">차원 축소</h4>
<p>차원 축소는 세 가지 이유를 통해 각각 진행한다.</p>
<ul>
<li>정보 압축 (자원 절약): 이미지/비디오/오디오 압축</li>
<li>정보 시각화: 사람이 눈으로 확인할 수 있는 것은 3차원 까지</li>
<li>정보 특징: 중요한 특징을 추출하여 분석에 사용</li>
</ul>
<p>또한 노이즈가 포함된 이미지를 차원 축소 방법으로 축소 시킨다음 주요 정보만을 캐치하여 차원 확대를 통해 노이즈가 지워진 이미지 사진을 가져오게 하는 방법또한 포함된다. 이 기능을 하는 모델을 오토인코더(Auto-Encoder)이라 부른다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/d7f36348-6288-41ed-8027-2ac164b74581/image.png" alt=""></p>
<h3 id="강화학습">강화학습</h3>
<p>주어진 환경에서 더 높은 보상을 위해 최적의 행동을 취하는 정책을 학습하는 모형으로 에이전트 (Agent), 보상 (Reward), 행동 (Action), 환경 (Environment)의 네가지 요소로 구성되어 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/9bf34695-19e4-45af-b2cc-a9944452af88/image.png" alt=""></p>
<p>또한 다음은 각 구성요소의 예시를 적용한 것이다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/e4e1c6d2-62de-4566-8e9f-d0d328d25307/image.png" alt=""></p>
<p>이중 Agent요소는 두가지 종류가 존재한다. 하나는 상태를 받아들여 어떠한 행동을 하는지에 대한 에이전트이며 나머지 하나는 상태, 행동 두가지를 받아들여 가치를 매기고 보상을 반환하는 에이전트이다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/a8056527-7c51-4b0c-86cf-2e8524153419/image.png" alt=""></p>
<h2 id="데이터-형식에-의한-구분">데이터 형식에 의한 구분</h2>
<p>다음으로 데이터 형식에 의한 구분이다. 데이터는 크게 정형데이터와 비정형데이터로 나눌 수 있다.</p>
<h3 id="정형-데이터">정형 데이터</h3>
<p>구조화된 정보로 저장되어 있는 데이터를 말하며 흔히 csv파일로 이루어진 데이터를 가리킨다. 이는 지도학습을 주로 수행하며 데이터 정형화를 통해 처리를 진행하기도 한다. </p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/6429964b-2ae4-4c50-98f0-257bed64842a/image.png" alt=""></p>
<h3 id="비정형-데이터">비정형 데이터</h3>
<p>비정형 데이터에는 이미지/동영상, 텍스트, 음성으로 나누어 확인할 수 있다.</p>
<h4 id="cv">CV</h4>
<p>입력으로 이미지나 동영상 데이터를 받는 AI를 말하며 ChatGPT 이전에는 가장 많이 상품화된 AI 기술이었으며, 딥러닝 기술을 선도하였다. CV를 활용해서 적용할 수 있는 task는 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/3ba7fd57-f657-4a0d-9d57-c89a31d48fbd/image.png" alt=""></p>
<h4 id="nlp">NLP</h4>
<p>입력으로 텍스트 데이터를 받는 AI이며 ChatGPT 이후 자연어 처리 관련 서비스/제품 들이 기하급수적으로 증가하고 있는 추세이다. 현재, 딥러닝 기술을 선도하고 있다. NLP를 활용하여 적용 할 수 있는 task는 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/7cc75058-ed8a-4413-b4c6-49e22b10b9e5/image.png" alt=""></p>
<p>또한 대형 모델인 LLM모델도 NLP의 한 종류이다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/8c1247e2-c47a-4649-9dae-c4d5b7ccc00e/image.png" alt=""></p>
<h4 id="음성">음성</h4>
<p>입/출력으로 음성 데이터가 활용되는 AI이며 음성 인식은 출력이 텍스트 이므로 자연어 처리와 함께 사용되는 경우가 많다. 음성을 활용해서 적용할 수 있는 task는 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/0d18cf10-6cc5-41e7-8b74-650cbc241bd5/image.png" alt=""></p>
<p>또한 텍스트로 시작해서 음성으로 출력을 하는 경우가 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/47036575-80f0-424f-a80f-3f755a97b5ed/image.png" alt=""></p>
<p>따라서 한 종류의 데이터라도 다른 영역과 혼합되어 적용되는 경우도 존재한다.</p>
<h2 id="태스크-종류에-의한-구분">태스크 종류에 의한 구분</h2>
<p>비정형 데이터와 정보의 입출력 관계에 따라 인식 혹은 생성으로 구분된다. 특징은 다음과 같다.</p>
<ul>
<li>인식: 비정형 데이터 입력에 정보가 출력</li>
<li>생성: 출력이 비정형 데이터이며 의도된 정보를 입력으로 넣어줄 수도 있고, 비정형 데이터를 입력으로 주면서 간접적으로 의도를 줄 수도 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/wise_head/post/bd03ac6f-5782-4308-9e5f-a2fb815a043e/image.png" alt=""></p>
<p>그렇다면 인식과 생성중 어느게 더 어려운지에 대해 궁금할 수 있다. 결과부터 이야기하면 생성이 인식보다 더 어렵게 느껴지고 있다고 한다.</p>
<h3 id="생성-모델의-역사">생성 모델의 역사</h3>
<p>2014년에 만들어진 GAN(Generative Adversarial Network)에 의해 이미지 생성이 가능하게 되었다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/21411a30-2725-412b-87df-e405fa97092e/image.png" alt=""></p>
<p>이 영역에서 OpenAI에서 2021년도에 공개한 DALL-E가 대표적모델로 통제력 달성은 결국 입력을 텍스트로 받아서 해결하는 모델이 만들어졌다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/0eb6d6e1-2c80-4f32-ac2e-15b753139e63/image.png" alt=""></p>
<p>또한 2023년도에 StabilityAI의 Stable Diffusion이 상업적으로도 이용가능하면서 오픈소스여서 관련 산업이 급격히 성장하였고 동년도에 OpenAI에서 내놓은 ChatGPT가 모든 것을 다 변화시켰다고 한다. </p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/6328b91b-4fb4-4e58-b434-ca910cfbd2df/image.png" alt=""></p>
<p>구체적인 정보를 줄 수록 퀄리티 높은 이미지를 가져올 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/9c5bf416-356d-4873-9022-8e7c96abc416/image.png" alt=""></p>
<h2 id="❓고찰">❓고찰</h2>
<p>실질적으로 아는 내용도 많았고 어느정도 받아들이기 쉬운 정보도 많이 있었다. 기존에 배웠던 내용을 기반으로 어떤 모델이 어느 파트에 적용되고 있는지 감을 잡을 수 있었으며 앞으로 어떠한 내용을 상세하게 배우게 될지 기대가 되기도 한다. </p>
<p>아마 워밍업으로 듣는 부분이라는 생각이 많이 들지만 이렇게 큰 틀을 확보하고 그 안의 내용을 구체적으로 들어가는 수업이 많지 않을것이다. 이 기회를 놓치지 말고 잘 정리하여 CV부터 RS까지 모든 내용을 구체적으로 알진 못하더라도 보고 insight라도 가져갈 수 있는 수준까지 적합할 수 있으면 매우 좋을것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Prolog & 딥러닝의 발전 5단계]]></title>
            <link>https://velog.io/@wise_head/Prolog-%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%98-%EB%B0%9C%EC%A0%84-5%EB%8B%A8%EA%B3%84</link>
            <guid>https://velog.io/@wise_head/Prolog-%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%98-%EB%B0%9C%EC%A0%84-5%EB%8B%A8%EA%B3%84</guid>
            <pubDate>Mon, 18 Dec 2023 09:47:21 GMT</pubDate>
            <description><![CDATA[<h2 id="📂-prolog">📂 Prolog</h2>
<p>머신러닝 과정을 마치고 시작하게 된 딥러닝 강의 무려 업스테이지에서 출간한 강의를 듣게 되었다. 내용은 두 챕터로 나뉘어져 있었고 첫번째 파트인 Deeplearning과 두번째 파트인 Pytorch에 대해 2주간의 커리큘럼을 통해 기본적인 내용을 미리 알고 세부적인 내용은 경진대회나 팀별 프로젝트를 통해 내용을 받아들이는 커리큘럼을 진행하고 있다.</p>
<p>딥러닝 기초를 배우게 된 강의는 다음과 같다. Upstage의 현직자분들께서 직접 강의를 올려주셨고 운영측 모두가 내용이 완벽하다고 입모아서 언급하고 있다. 실시간 강의를 접하고 싶었지만 그렇지 못해 매우 아쉬웠다. </p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/b01c3e99-d390-43e7-ae36-3fa502904d5e/image.png" alt=""></p>
<h2 id="딥러닝-발전-5단계">딥러닝 발전 5단계</h2>
<p>딥러닝의 전체적인 발전 과정을 총 5단계로 나누게 되는 과정에 대한 내용이다. 아래의 그림처럼 다섯 단계로 분류가 되며 단계별로 딥러닝이 진화되어 왔다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/736aaa65-26a7-44dc-8de1-4837030b5f5f/image.png" alt=""></p>
<h3 id="1단계-rule-based-programming">1단계: Rule Based Programming</h3>
<p>규칙 기반 프로그래밍이라고 하며 다음과 같이 사람이 직접 고안하면서 분류 알고리즘을 만든다. 다음과 같은 방식을 SW1.0방식이라고도 부른다. 아래의 이미지는 이미지 데이터를 직접 분류하는 알고리즘을 만드는 예시이다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/93c2c7be-8667-4c6d-a86b-7c46e84012f6/image.png" alt=""></p>
<h3 id="2단계-conventional-machine-learning">2단계: Conventional Machine Learning</h3>
<p>이번 단계에서도 특징값을 뽑는 방식은 사람이 직접 고안한다. 하지만 특징값을 활용해 이미지를 판별하는 알고리즘은 기계가 스스로 고안하는 방식을 2단계 SW방식이라 한다. 아래의 이미지는 이번 단계의 예시를 나타낸다. SW1.0과 추후 나올 내용의 SW2.0방식의 하이브리드 형태를 가지므로 SW1.5단계라고도 한다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/0802e0b0-c2ef-4aca-861d-c0e96368a3e9/image.png" alt=""></p>
<p>여기서 머신러닝 동작법에 대해 확인할 수 있는데 과정은 다음과 같다.</p>
<blockquote>
<ol>
<li>학습 데이터 준비
1-1. 이미지 수집
1-2. 특징 정의
1-3. 학습 데이터 생성</li>
<li>모델 학습</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/wise_head/post/2fd97073-8dac-41f7-8c86-1f2f58d0c3e9/image.png" alt=""></p>
<h4 id="try--error-방식">Try &amp; Error 방식</h4>
<p>머신러닝 방법에서 작동하는 최적의 연산 집합을 찾아내는 과정을 나타내는 방식이다. 이는 Try과정과 Error계산 과정을 진행하게 되며 가장 성능이 좋은 결과를 도출하여 추후 테스트 데이터 또는 실제 데이터가 들어왔을 때 Best Model을 활용하여 예측을 진행하게끔 한다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/3b7ce291-209b-491c-b9e3-106b5457f174/image.png" alt=""></p>
<p>각각의 연산 방법으로 다음과 같이 값을 예측해낸다. 연산 방법은 무작위로 나타나며 다양한 방법으로 진행된다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/8b666059-cff0-451b-b16b-56551b031543/image.png" alt=""></p>
<p>예측값과 실제로 가지는 값을 비교하여 Error이 얼마나 차이나는지 비교할 수 있다. 이중 Error이 가장 작은 연산 방법을 선택하여 Best Model로 만들어낸다. 또한 최적의 연산 집합을 저장하여 추후 test set이나 산출되는 case를 대입하여 생성한 모델에 대입하여 예측 결과를 만들어준다.</p>
<p>여기서 Try중 오차가 제일 작은 값을 가지는 모델을 다음과 같이 부르기도 한다.</p>
<blockquote>
<ul>
<li>최적의 모델</li>
<li>학습 완료 모델</li>
<li>추론시 사용되는 모델(서비스 사용시)</li>
</ul>
</blockquote>
<h3 id="3단계-deep-learning">3단계: Deep Learning</h3>
<p>기존의 SW1.5보다 업그레이드 된 3단계 방법은 사람이 직접 하던 특징을 정의하던 구간을 제외시키면서 기계가 직접 특징을 뽑아내고 그 특징에 대해 학습하여 분류 또는 회귀나 여러 생성을 도모하는 단계를 나타낸다. SW2.0이라고도 하며 이 시점부터 딥러닝이라 분류하기도 한다. 사람은 단순하게 이미지를 수집하고 학습 데이터를 생성하면 나머지는 딥러닝 모델이 전부 알아서 부여한다.
아래의 이미지에서 위는 머신러닝, 아래는 딥러닝 과정에서 사람이 이행하는 과정을 나타낸다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/78baa82e-8945-4323-b8ad-424b18cb619b/image.png" alt=""></p>
<p>이 딥러닝의 특징은 다음과 같다.</p>
<ul>
<li>출력을 계산하기 위해 모든 연산들을 기계가 고안</li>
<li>자유도가 너무 높아 연산들의 구조를 잡고 사용</li>
<li>특징 정의 과정이 빠지게 됨</li>
</ul>
<p>또한 텍스트 데이터에서는 토큰화라는 것을 진행하는데 토큰화의 의미는 다음과 같다.</p>
<ul>
<li>의미분석에 용이한 단위인 토큰으로 쪼개는 과정 (text 딥러닝 준비 과정)</li>
</ul>
<h3 id="4단계-pre-training--fine-tuning">4단계: Pre-training &amp; Fine-tuning</h3>
<p>3단계의 딥러닝에서는 다음과 같은 문제점이 존재하였다.</p>
<ul>
<li>분류 대상 또는 Task가 바뀔때 마다 새로운 모델이 필요</li>
</ul>
<p>따라서 새로운 모델을 불러오지 않고 미리 대규모 데이터를 학습시켜 해당 관련 모델이 필요할 때 마다 불러와서 활용할 수 있는 Pre-training model을 불러와 원하는 분류나 회귀를 진행시킬 수 있는 방식을 활용하였다.</p>
<p>아래의 이미지는 많은 동물을 미리 학습시켜 현재 필요한 CAT vs DOG를 분류하는 모델을 만들기 위해 아래의 두 Layer만을 별도로 학습시켜 두 class만으로 분류하는 모델을 생성하는 예시를 보여주고 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/2927b368-2459-45ef-8bcd-2a7e2b14df61/image.png" alt=""></p>
<p>텍스트 데이터 관점에서 보기로 하자. GPT1을 예시로 들어 과정을 살펴보기로 한다.</p>
<h4 id="pre-training">Pre-training</h4>
<p><img src="https://velog.velcdn.com/images/wise_head/post/359c8fab-70de-46bd-b034-b3b5cbf8e3cc/image.png" alt=""></p>
<p>인터넷 상의 수많은 데이터를 활용하려면 태스크 정답을 세팅하는 작업이 없어야 훨씬 효율적으로 운영할 수 있다. 따라서 입력 텍스트에서 정답을 만들어 내는 방식으로 활용한다. 이를 다른말로
Un-supervised pre-training 이나 Self-supervised pre-training 부르기도 한다.</p>
<h4 id="fine-tuning">Fine-tuning</h4>
<p>미세 조정은 다음과 같은 특징으로 진행된다.</p>
<ul>
<li>Feature의 특징은 이미 충분히 학습되어있다고 가정하고 진행</li>
<li>원하는 클래스만을 활용하여 mapping을 진행</li>
</ul>
<p>기존에 학습되어 있는 Features를 불러와 mapping을 시키고 진행하기 때문에 전체적으로 이 과정을 보게되면 Transfer Learning을 진행한다고 생각하면 된다.</p>
<p>또한 기존의 사전 학습 데이터의 사이즈를 증가시키면 성능이 크게 올라간다. 아래의 이미지는 GPT의 매개 변수 개수의 증가를 보여준다. 이에 따라 학습 시키는 데이터의 양도 커지면서 받아드릴 수 있는 값의 경우도 많아지며 원하는 의도대로 결과를 만들어줄 가능성이 매우 커진다. 이로 인해서 필요한 기능을 구현하기 위해 적용해야할 데이터의 수가 매우 적어지며 개발 속도 또한 빨라진다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/c2386359-905d-4f26-97bc-085985fba3f2/image.png" alt=""></p>
<h3 id="5단계-big-model--zerofew-shot">5단계: Big Model &amp; Zero/Few shot</h3>
<p>4단계에서 진행하던 Task별로 사전 학습된 모델 조차 필요없고 추가 데이터도 필요 없는 단계를 의미한다. 이는 SW3.0이라고도 부른다. 따라서 거대한 모델만이 존재하고 별도로 mapping하는 과정 조차 필요하지 않게 된다. </p>
<p>5단계에서는 in-context learning을 진행하는데 이는 학습을 하는 것은 아니다. 단순히 input에서 예시를 0개 에서 여러개를 포함해 태스크를 알려주며 지시사항을 부여한다. 그러면 자동적으로 모델에서 원하는 결과를 만들어준다. 이는 현재 text 데이터 한정으로 만들어졌으며 대표적인 도구로 ChapGPT3가 있다. </p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/c9fec04a-d827-45cc-b023-2d85e159e14d/image.png" alt=""></p>
<p>위의 그래프는 태스크의 개수에 따라 얼마나 결과를 정확하게 내주는지에 대해 비교한 것이다. 예제가 많으면 많을수록 성능이 좋아지며 원하는 결과를 불러올 수 있다.</p>
<h2 id="❓고찰">❓고찰</h2>
<p>평소에 딥러닝에 대해 모델의 예시와 사용방법, loss, 여러 기능과 같이 상세 내용중 일부만을 배웠다면 이번 강의는 딥러닝이 실제로 어디부터 어디까지 포함되는 영역이며 어떻게 발전해왔나를 확실하게 잡고갈 수 있도록 유도해주는 강의였다. 괜히 상세 내용중 일부만 알고 이를 적용하려고 하면 아무것도 못했던 경우가 많았다. 따라서 딥러닝에 대해 제대로 배웠다라는 느낌을 받았던 적이 없었는데 이번 기회를 통해서 나름의 딥러닝의 큰 틀을 가지고 갈 수 있게 되는 계기가 되었다.</p>
<p>나처럼 애매하게 알고 있거나 딥러닝을 시작하는 사람이라면 다음 강의를 듣고 확실하게 큰 틀을 만들어 둔 다음 하나씩 채워가는 과정을 진행하면 매우 좋을것같다. </p>
<p>그래도 나름 머신러닝을 실전 대회나 논문 작성시 활용했던 경험이 있었던지라 이해하는데 어렵지 않았다. 추가적으로 이론에 대한 내용을 깊이 알고 있으면 앞으로 새로운 모델이 빠르게 생성되더라도 금방 이해하고 나만의 방법으로 적용할 수 있는 시작점이 될 수 있을 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[세번째 프로젝트: 데마시아]]></title>
            <link>https://velog.io/@wise_head/%EC%84%B8%EB%B2%88%EC%A7%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-01-%EB%8D%B0%EB%A7%88%EC%8B%9C%EC%95%84</link>
            <guid>https://velog.io/@wise_head/%EC%84%B8%EB%B2%88%EC%A7%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-01-%EB%8D%B0%EB%A7%88%EC%8B%9C%EC%95%84</guid>
            <pubDate>Sun, 17 Dec 2023 10:14:47 GMT</pubDate>
            <description><![CDATA[<h2 id="ml프로젝트">ML프로젝트</h2>
<h3 id="시작에-앞서">시작에 앞서</h3>
<p>  기존에 알고있던 머신러닝 방법을 활용하여 현재 진행하고 있는 대회나 이미 진행이 완료된 대회를 통해 팀별 프로젝트를 진행하는 방식으로 운영되었다. 처음에 하고싶은 대회나 주제를 미리 선정해서 어느정도 후보가 존재하였고 나는 이전 프로젝트에서 진행하였던 Kaggle competition중에서 cirrhosis의 Stage를 맞춰야하는 이미 마무리 된 대회가 있길래 이 대회를 골랐다. 보기에 없었기 때문에 기타 항목에서 골랐는데 기존에 같이 하던 팀에서도 다들 비슷한 생각을 하였다. 따라서 이번 프로젝트에서도 같은 팀이 되었고 서로의 상의 끝에 총 세가지 프로젝트를 진행하기로 하였다.</p>
<h3 id="지난-eda-프로젝트">지난 EDA 프로젝트</h3>
<p>  EDA프로젝트에서 우수 팀으로 선정되었다고 축하한다고 Slack에서 공지가 왔다. <del>지난번에 미왕빌딩에서 시달렸던 그때가 드디어 빛을 발휘한 것이다.</del> 기존의 팀에서 연속으로 진행하게 되서 너무 신기하고 지난번보다 한결 편안하게 진행할 수 있어서 너무 좋았다. 상품은 기프티콘으로 맘스터치 싸이버거 세트가 한명당 하나씩 주어졌다. 생각지도 못한 우수팀이라니 앞으로의 프로젝트에서도 의지를 모아 이번에도 우수팀으로 거듭나자고 서로 화이팅하면서 시작했다. <del>사실 동혁님은 고민하다가 도망가려 했는데 붇잡혔다는 소문도 ...</del></p>
<h2 id="프로젝트를-시작하면서">프로젝트를 시작하면서</h2>
<p>  최종적인 목표를 KNHNES데이터를 활용하여 기존에 EDA 프로젝트에서 진행했던 cirrhosis를 예측하는 모델을 만들어 보고자 시작하였다. 그러나 다들 딥러닝이나 통계 분석쪽으로는 경험이 있지만 머신러닝에 대해 처음 접해보는 경우가 대다수였기 때문에 다른 대회를 통해 한번 익숙해지고 접근하자는 결론에 도달했다. <del>생각해보니 결과적으로는 중구난방이 되거나 용두사미가 되었던거 같기도 하지만..</del> 따라서 마침 일주일 남았던 대구 교통사고 피해 예측 AI 대회를 통해 머신러닝에 대해 감을 잡고 진행하자고 의논을 마무리 하였다. 그런데 진행하다보니 12월 5일자로 시작하게된 새로운 대회 Status를 맞추는 competition이 등장하면서 총 세가지를 진행하게 되었다. 이번에 언급하게 될 프로젝트는 대구 교통사고 프로젝트다.</p>
<h3 id="주제">주제</h3>
<p>  대구 교통사고 발생 케이스를 활용하여 사고의 피해 정도를 예측하는 대회였다. ECLO라고 해서 사망자수, 중상자수, 경상자수, 부상자수를 통해 계산하여 지수화 시킨 값이다. <del>사실 이런 지표 처음들어 보는데 생각해보니 그냥 피해자 조사해서 계산만 하면 되지 않나 라는 생각이 너무 들었다.</del> 이 지수를 맞추는 대회로 계산 매트릭은 RMSLE(Root Mean Square log Error)이며 값이 음수로 나오게 되면 오류가 난다는 주의사항이 있었다. 머신러닝을 얼마전 학습한 사람들이 활용해보기 너무 좋은 대회였고, 데이터 개수 또한 딥러닝으로 적용하기엔 적은 데이터기 때문에 순전히 머신러닝을 활용하기 좋은 대회였다.</p>
<h3 id="역할">역할</h3>
<p>  우리가 진행해야 하는 내용을 다음과 같이 나누었다.</p>
<blockquote>
<ul>
<li>EDA</li>
<li>Make Baseline</li>
<li>Modeling</li>
<li>Submit predict value</li>
<li>Feedback</li>
</ul>
</blockquote>
<p>여기서 나의 역할은 BaseLine코드를 생성하여 우리의 모델링 시작의 기반이 되는 기준점을 만들고 하나둘씩 확장해 나가는 방법을 선택하였다. 각 팀원들은 확보된 데이터를 EDA하고 모델링으로 진입하여 기존 Baseline 또는 가장 성능이 좋은 모델이랑 비슷한 valid score을 가져오거나 성능이 더 좋은 모델을 통해 제출하였고 제출한 모델의 public score가 얼마나 좋아졌는지 확인하면서 개선해 나가는 방식으로 진행하였다. 제출 기회가 하루에 3번씩이었기 때문에 신중하게 제출할 필요가 있었다. <del>이번에도 동혁은 그래프를 대량 생산하였는데 본인이 해석할줄 몰랐기 때문에 또 도연한테 혼났다...</del> 따라서 회의를 반복적으로 진행하게 되었고 Feedback 이후에 필요한 EDA부터 predict value를 산출하기까지를 각자만의 방법으로 반복하였다.</p>
<h2 id="프로젝트-내용">프로젝트 내용</h2>
<p>  이번에도 여지없이 50장의 PPT가 나왔다. <del>이 프로젝트는 내가 주로 담당했기 때문에 PPT를 혼자서 만들어야했다. 진짜 너무 고생했다 PPT하나가 뭐라고 이렇게 오래걸리는지.. 옆에있는 도연은 나보다 만드는 속도가 2배 이상 빠르던데 던지고 도망갈까 잠깐 생각하다가 동혁 혼나는걸 보면 또 묵묵하게 하게된다.</del> 발표 제한시간은 15분이었지만 우리 프로젝트가 3개인 것을 감안하면 총 5분이라는 시간밖에 존재하지 않는다. <del>무슨 100m 달리기도 아니고 타임어택하듯이 진행하나 싶긴한데 이걸 또 해내는 상혁이 있다. 대단해</del></p>
<h3 id="제목">제목</h3>
<p> 제목은 간단하게 다음과 같이 지었다. <del>요즘 PPT도 chat gpt마냥 추천 잘해줘서 디자인도 진짜 잘해주는것 같다. 너무 고도화된거 아닌가 모르겠네</del> </p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/5f8ec194-ed68-41be-8857-ea41e8d357c2/image.png" alt=""></p>
<h3 id="데이터-확인-및-eda">데이터 확인 및 EDA</h3>
<p> 모든 프로젝트는 EDA가 중요한 만큼 맨 처음 데이터를 통해 EDA를 진행해야한다. 따라서 다음과 같이 아주 간단하게 알아보고 진행하였다.</p>
<h4 id="데이터-구성">데이터 구성</h4>
<p><img src="https://velog.velcdn.com/images/wise_head/post/6c4bf1ab-7263-4726-9b1b-cd67d3530117/image.png" alt="">
다음과 같이 Train에서 존재하는 데이터중 7가지 변수 이상이 Test에 없다. 따라서 기본적으로 데이터를 있는것만 사용해야 할지 아니면 존재하는 데이터를 요약이나 예측을 통해 만든다음 시작해야할지 고민이었다. 결과적으로는 Train에 없는 변수는 전부 제외하고 진행하게 되었다. 다른 이견은 크게 없었다.</p>
<h4 id="간단한-eda">간단한 EDA</h4>
<p>기본적으로 존재하는 데이터를 간단하게 EDA를 하였다. 내용은 다음과 같다.
<img src="https://velog.velcdn.com/images/wise_head/post/5d498678-1bba-4e04-89e1-5a61497bcfc4/image.png" alt="">
<img src="https://velog.velcdn.com/images/wise_head/post/870a6276-75b6-4955-aff4-52307aeeb62a/image.png" alt="">
<img src="https://velog.velcdn.com/images/wise_head/post/dbd2241b-a0c8-4fa1-bc5f-16b5b73cb19f/image.png" alt="">
<img src="https://velog.velcdn.com/images/wise_head/post/852105c8-3b2d-4f10-900b-7a0f389668df/image.png" alt="">
<img src="https://velog.velcdn.com/images/wise_head/post/b6acd24a-0c20-4111-80a4-00e725858941/image.png" alt=""></p>
<h3 id="모델-전략">모델 전략</h3>
<p>우리의 전략은 기본적인 BaseLine을 확립하고 이 기반으로 계속 변형과 파생변수를 붙이는 활동 등 여러가지 전략을 통해 성능을 높히는 것을 선택하고 성능이 오히려 안좋아 지는 것을 제외하는 것이다.</p>
<h4 id="baseline">BaseLine</h4>
<p><img src="https://velog.velcdn.com/images/wise_head/post/d8676529-7ad1-4fa6-8178-33f813de6f62/image.png" alt="">
사고일시나 시군구와 같은 변수는 여러 정보가 혼합되어있는 형태로 존재했다. 따라서 이를 분리하기 위해 다음과 같이 split를 적용하였다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/8fb170d2-6581-4981-a83e-af6e179d827b/image.png" alt="">
연도는 앞으로의 기간밖에 존재하지 않기 때문에 제외하고 월, 일, 시를 확인하였을 때 다음과 같이 경향성을 확인할 수 있었다. 여기서 3월과 11월이 왜 이런지 궁금하긴 했지만 예상상 대입 시기와 수능 종료 시기라 추측을 하고 넘어갔다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/9c9b7c19-cea1-4a0a-ac55-8c98e94b9a4f/image.png" alt="">
구 단위로 비교하였을 때 차이가 크게 없어보였고, 동 단위로 비교했을때는 오히려 차이가 존재했다. 세부적으로 <del>동 ~</del>1동과 같이 나뉘어져있는 행정동명도 있었지만 번호마다 다른 지역을 가리킬 수도 있어서 그대로 활용하기로 하였다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/feb3ae75-f58d-4eeb-ab0e-44156fd3803e/image.png" alt="">
요일별로 확인하였을 때 주말에 해당하는 요일이 평일에 해당하는 요일보다 높게 나왔다. 따라서 평일과 주말로 비교해서 적용하기로 진행하였다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/d45102f0-64b4-45c3-89ff-74f7d47f6862/image.png" alt="">
예시로 사고유형을 들었지만 다음과 같이 보이는 object변수형태로 되어 있는 것은 대부분 OnehotEncoder을 활용하였다. 여러 label보다 이 attribute를 해당하는지 하지 않는지를 구분짓는 변수 유형이 트리 모델과 오히려 잘맞았기 때문인것 같다. 앞으로의 전략에서도 이 전략을 생각보다 많이 진행한다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/58f17559-7d99-4ed0-9226-db0577f61e52/image.png" alt="">
그러나 onehotencoder을 label이 많은데 사용하게 되면 너무 많은 columns가 생성되기 때문에 차원의 저주에 걸릴 수 있다. 따라서 이를 피하고자 변수 자체를 category로 활용하여 적합하기로 하였다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/ea39bb4c-8f39-4864-a9da-ca23cd443205/image.png" alt="">
기본 전략은 부스팅 방법인 XGB, LGBM, CB를 활용하기로 하였다. 이중 가장 성능이 좋은 모델의 결과를 가져오는 방식으로 진행하였고 기본적인 RMSLE값인 0.4679를 우리의 기본으로 진행하게 되었다.</p>
<h4 id="분할-예측-방법">분할 예측 방법</h4>
<p>  ECLO를 계산할 때 사망자수, 중상자수, 경상자수, 부상자수를 통하여 계산하기 때문에 다음과 같이 네 개의 영역을 따로 예측하고 직접 계산하는 방식을 적용했다. 총 4개의 모델을 통해 예측을 진행한다음 ECLO는 직접 계산한 방식이다. 결과는 다음과 같이 확인할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/cfb69d3e-5c8d-4753-871c-70bdddbf4835/image.png" alt="">
다행이도 성능은 올랐지만 비교하였을 때 큰 차이는 없었기 때문에 다른 방법을 찾도록 진행하였다.</p>
<h4 id="mljar-supervised의-automl">MLjar-supervised의 AutoML</h4>
<p>  다음 전략으로 파라미터 튜닝부터 새로운 피처까지 자동으로 합쳐주는 AutoMl을 활용하게 되었다. 다만 이것을 처음부터 활용하게 되면 머신러닝을 배우는 의미가 없어질 뿐 더러 나중에 따로 모델을 활용하게 되었을 때 아무것도 하지 못한다고 경고하고 진행하였다. 실제로 모든것을 자동으로 다 해주니 손수 해보는 기회를 잃는것이기 때문이다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/68ba6beb-f394-4a21-a707-d00b1d5a48c9/image.png" alt=""></p>
<p>결과는 기존의 두 방법보다 성능이 훨씬 좋아졌다.</p>
<h4 id="빅데이터마트-외부-데이터-적용">빅데이터마트 외부 데이터 적용</h4>
<p><img src="https://velog.velcdn.com/images/wise_head/post/01f2b0b5-90c3-4a0f-8a8e-1ccbec24070a/image.png" alt="">
  CCTV 제한속도와 유형은 차량의 통행 속도를 제한시키는 효과가 있을 것이기 때문에 도로에서 주행하는 차들의 속도와 연관이 있을 것이라는 아이디어를 통해 다음과 같이 변수를 생성하였다. 실제로 차의 추돌 사고와 같은 경우 일반 도로에서 60km/h로 추돌하는 것 보다 110km/h로 고속도로에서 추돌하는 것이 더 큰 사고를 야기할 수 있고 연쇄 추돌사고로 어마어마한 피해를 생성할 수 있기 때문이다. </p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/a47649fa-7301-48b8-ac9f-23b0f57703e4/image.png" alt="">
  보안등은 자체 설치 개수가 있어서 단순 count보다는 설치개수를 동별로 sum하는 것이 더 바람직하다 판단하였다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/494e1867-e2bd-4e74-852c-225aabd557a5/image.png" alt="">
나머지 데이터 파일은 단순하게 count를 세서 전체적으로 동별 count를 붙여넣었다. 주요 전략으로 이를 활용하였고 다음과 같이 간단하게 변수를 변형하였다.</p>
<blockquote>
<ul>
<li>[구, 군]을 묶어서 onehotencoding</li>
<li>월을 계절로 묶어서 변경</li>
<li>요일 안에 공휴일을 활용하여 주말 칼럼에 포함시킴</li>
<li>시간 변수를 푸리에 변환을 통해 cos_time변수로 활용</li>
</ul>
</blockquote>
<p><img src="https://velog.velcdn.com/images/wise_head/post/715499a9-e120-46e0-a13a-2ddb76dc0960/image.png" alt="">
따라서 성능을 확인한 결과 0.4266으로 한층 더 상승 시킬 수 있었다.</p>
<h4 id="country-wide">country-wide</h4>
<p><img src="https://velog.velcdn.com/images/wise_head/post/8fa70823-65d3-41de-803a-b6ff98fd9518/image.png" alt="">
변수 중요도를 확인했을 때 사고 유형이 가장 크게 나타났다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/f0c858ee-d022-4846-b34e-7bcaf9e54797/image.png" alt="">
또한 이 그래프를 확인했을 때 사고유형의 유사성이 매우 높았기 때문에 대구 광역시 뿐만 아니라 대한민국에서 다양한 지역의 사고에 대한 내용을 별도 모델로 학습해 보기로 하였다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/0a6f9eea-2f1b-4d3d-9bb2-0507f1a4d6d5/image.png" alt="">
결과는 비슷한 결과를 가져왔지만 아래 소수점에서 기존에 빅데이터 마트에서 제공해준 데이터가 오히려 성능이 좋은 것을 확인할 수 있었다.</p>
<p>여기서 두 가지 데이터를 모두 붙일 수 있지 않냐고 생각할 수 있다. 하지만 기존에 가지고 있던 데이터는 모두 대구 광역시를 기준으로 존재하였고 country wide는 전국구로 존재하기 때문에 대구 정보만을 가지고 붙이는 것은 큰 오류를 범할 수 있기 때문에 이렇게 진행하지 않기로 하고 진행하였다.</p>
<h4 id="변수-구성-변경">변수 구성 변경</h4>
<p>사고유형처럼 변수 형태를 변경하면 성능이 좋아질 수도 있는 모형이 있다 생각하여 일부 변수를 변경하였다. 
<img src="https://velog.velcdn.com/images/wise_head/post/35106a71-d86b-4110-aee4-a92539889be5/image.png" alt="">
다음과 같이 두 유형을 변경하거나 추가하였고 이를 통해 적합하면 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/bc718248-15a0-44e3-ac70-3323f4a8e5c4/image.png" alt="">
성능이 오히려 많이 저하된 것을 확인할 수 있었다. 이를 통해서 연관있는 변수를 다뤄야 성능이 올라간다는 것을 확인하였고 새로운 EDA를 진행하였다.</p>
<h4 id="기존-변수의-대량-eda와-gpkg-묶음-데이터">기존 변수의 대량 EDA와 GPKG 묶음 데이터</h4>
<p>다음 아래와 같이 다양한 변수의 변형을 통해 적합을 진행하였으며 외부 데이터를 직접 불러와 적합에 활용하였다. 
<img src="https://velog.velcdn.com/images/wise_head/post/3f323f52-1364-48b7-a94c-ec4bb94339ec/image.png" alt="">
<img src="https://velog.velcdn.com/images/wise_head/post/bf8ccbb5-f573-4fc9-b06d-5991965b024f/image.png" alt="">
<img src="https://velog.velcdn.com/images/wise_head/post/8cd37a7f-0f91-423d-95c9-52d83c98a576/image.png" alt="">
<img src="https://velog.velcdn.com/images/wise_head/post/4d030179-1ca9-469a-9a15-ede407cd532b/image.png" alt="">
<img src="https://velog.velcdn.com/images/wise_head/post/2745146f-0c0b-4803-a7ac-e224bc674b23/image.png" alt="">
<img src="https://velog.velcdn.com/images/wise_head/post/3e092ed0-c713-4f37-9cb1-60d44321fb39/image.png" alt="">
<img src="https://velog.velcdn.com/images/wise_head/post/fd362edf-4bed-40f1-849b-54d8bc727fd9/image.png" alt="">
성능이 어느정도 개선된 것을 확인할 수 있었지만 최종적으로 가장 좋았던 모델보다 성능이 좋진 않았다.</p>
<h4 id="반응변수의-log화">반응변수의 log화</h4>
<p><img src="https://velog.velcdn.com/images/wise_head/post/5aa224ca-f5bb-4ff8-8248-ddf5621c2940/image.png" alt="">
ECLO를 확인해보니 자연스럽게 3<del>5로 이루어진 케이스가 많았으며 10을 넘는 사고가 흔하지 않았다. 사망자나 중상자수가 크게 있는 사고가 많이 발생하지 않는다는 증거이기도 하다. 따라서 이를 log1p를 통해 3</del>5사이의 값의 간격을 늘리면서 자연스럽게 나뉠 수 있는 구간도 세분화 하는 방법을 활용하였다. 베스트 모델인 빅데이터마트 외부 데이터 적용모델을 활용하였더니</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/1b6a7d6a-d1b3-4c13-add8-ae188902b3f5/image.png" alt="">
성능이 개선된 것을 확인할 수 있었다. 회귀로 적합해서 그런지 확실히 반응변수가 정규분포에 가까워져야 적합이 잘되는 것도 있는 것 같다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/e77435e5-640b-4d5e-ab01-536fa5d2f18e/image.png" alt="">
마지막으로 log1p를 활용하지 않은 모델과 활용한 모델 두개를 통해 각 예측값의 평균을 내어 앙상블시켜 마지막 제출로 활용하였다. 결과는 다음과 같이 가장 좋은 성능을 내어 최종적으로 제출할 모델로 선정되었다.</p>
<h3 id="결과">결과</h3>
<p><img src="https://velog.velcdn.com/images/wise_head/post/4e65bae2-7406-4d5f-be57-bb8aefd8af39/image.png" alt="">
맨처음에는 최종적으로 38등이라 4%조금 넘는 순위를 가졌지만 한 팀이 부정평가를 받으면서 탈락하게 되고 우리 팀이 4%에 속하게 되는 좋은 결과를 가져올 수 있었다.</p>
<h3 id="고찰">고찰</h3>
<p> 최종적으로 4%안에 들 수 있어서 너무 만족스러웠지만 시간이 길었다면 다양한 방법을 더 시도해서 성적을 더 높게 받지 않았을까 하는 아쉬움도 있다. 최종적으로 결론을 가져온 팀의 모델 구현방식이나 변수 생성 방식을 보면 우리의 흐름에서 한 두 스텝 나아간 경우를 확인할 수 있었다. 특히 도로마다 차량의 평균 속도를 생각하여 추가하고 싶었지만 적절한 데이터를 찾지 못했는데 2등 팀에서는 택시를 활용하여 평균 속도를 대입하였다. 정말 아쉬울 따름이었다. </p>
<p> 또한 처음으로 우리 팀이 오프라인으로 모였던 날이다. 
<img src="https://velog.velcdn.com/images/wise_head/post/74c14c01-4e01-4ce3-9776-b7d8e17064eb/image.jpg" alt="">
이렇게 다들 각자의 역할과 프로젝트를 기간상 나눠서 작업해야할 때도 있었고 한 프로젝트 내에서 다양한 상의를 할 필요도 있었기 때문에 다음과 같이 진행하였다. <del>우리의 팀장님의 머리색이 정말 독특하더라. 그런데 머리색과 다르게 정말 곱고 여린 마음씨를 가지고 있다. 근데 일할때는 어떻게 이렇게 잘 혼내는지 너무 신기하더라.</del> <del>이건 또 안 비밀인데 동혁은 이번에 하면서 또혼났다. 이번엔 상혁한테 혼났는데 내 학부때랑 비교하면 왜 혼나는지 알것 같기도 하다. 호호호 본인은 괜찮다 하지만 분명 안괜찮을 것이다. 그래도 극복하고 의미있게 가져가면 분명 크게 될 사람이다. 아이디어가 굉장히 많다.</del> <del>사실 이틀동안 거의 이러고 있었는데 하루는 이 멤버랑 다른 조원이랑 친해져서 보드게임도 하러가고 밥도 같이 먹었다. 첫째날에는 강사님과 함께 점심 식사도 하고 카페도 두번 다녀오면서 많은 이야기를 나눴다. 진짜 너무 의미 있고 원하는 정보를 얻을 수 있어서 오프라인 모임도 종종 가져볼 생각도 가져봐야 하게 된 계기가 되었다.</del> </p>
<p>이렇게 같이 밤도 새면서 대학원이나 학부때 같이 진행했던 프로젝트가 생각났지만 완성하고 나니 어느덧 괜찮은 기반도 잡을 수 있었고 다들 머신러닝에 대해 어떻게 흘러가는지 다시한번 깨닫고 앞으로 계속 진행할 수 있게된 계기를 맞이한것 같았다.</p>
<p>프로젝트 내용: <a href="https://github.com/Daw-ny/2023_Upstage_03rd-01_Proj">github</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[🟩33개 실전키트 완성 Part1. (1)]]></title>
            <link>https://velog.io/@wise_head/33%EA%B0%9C-%EC%8B%A4%EC%A0%84%ED%82%A4%ED%8A%B8-%EC%99%84%EC%84%B1-Part1.-1</link>
            <guid>https://velog.io/@wise_head/33%EA%B0%9C-%EC%8B%A4%EC%A0%84%ED%82%A4%ED%8A%B8-%EC%99%84%EC%84%B1-Part1.-1</guid>
            <pubDate>Mon, 27 Nov 2023 06:52:43 GMT</pubDate>
            <description><![CDATA[<h2 id="faster-r-cnn">Faster R-CNN</h2>
<p>Object detection의 가장 기본적인 방법으로 소개 되고 있는 R-CNN이다. R-CNN이란 Region을 검출해 CNN으로 어떤 범위에 객체가 있는지, 어떤 범주에 속하는지를 구분하는 모델이다. 가장 기초가 되는 모델로 이번에는 이 모델에 대해서 파헤쳐보려 한다. 여기에서 ROI는 Region of Interest이다.</p>
<h3 id="r-cnn">R-CNN</h3>
<p>다음은 R-CNN의 네트워크 구조다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/072b14bd-7a7f-41c9-9ee6-8da63aaf14da/image.png" alt=""></p>
<p>이 모델은 다음과 같이 작동한다.</p>
<blockquote>
</blockquote>
<ol>
<li>Image를 입력받는다.</li>
<li>Selective search 알고리즘에 의해 regional proposal output 약 2000개를 추출한다.</li>
<li>추출한 regional proposal output을 모두 동일 input size로 만들어주기 위해 warp해준다.</li>
<li>2000개의 warped image를 각각 CNN 모델에 넣는다.</li>
<li>각각의 Convolution 결과에 대해 classification을 진행하여 결과를 얻는다.</li>
</ol>
<p>여기서 굳이 사이즈를 통일해야 하는 이유를 묻는 사람들이 있을것이다. CNN의 특성에 의해 input size가 227 x 227 size로 고정이 되어 있다고 한다. 따라서 bounding box가 제각각인 ROI를 R-CNN을 활용하여 분리하기 위해서 사이즈를 먼저 조절하고 진행한다.</p>
<h4 id="selective-search-algorithm">Selective Search Algorithm</h4>
<p>이 알고리즘은 다양한 ROI가 존재하게 되는데 그리다 보면 객체가 겹쳐지기도 하고 좋지 않은 ROI가 생기기도 한다. 이러한 ROI들 중에 가장 의미가 깊은 bounding box를 만들기 위해 진행하는 알고리즘이다. 알고리즘 진행 순서는 다음과 같다.</p>
<ol>
<li>사용하는 이미지를 pixel 단위로 segmentation을 진행한다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/wise_head/post/783b6ecf-23d7-479a-9c98-d3dedeb237a1/image.png" alt=""></p>
<ol start="2">
<li>유사한 종류의 segment를 결합한다. 이로써 더 큰 region을 만든다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/wise_head/post/7b1acd7a-7215-42ef-89d5-11ce08f51921/image.png" alt=""></p>
<ol start="3">
<li>최종적으로 남은 segment를 구분자로 설정한다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/wise_head/post/e3426662-576f-4196-bcfe-dcd080494e65/image.png" alt=""></p>
<p>여기에선 흔히 그리디 알고리즘을 사용한다고 한다. 유사한 segment를 결합하다보면 언제까지 결합해야하는지 궁금증이 생길 수 있다. 기준점으로는 유사한 region이 하나만 남을때 까지 반복한다고 한다. 두 영역의 차이를 기준짓는 threshold를 통해 결합할지를 결정한다.</p>
<h4 id="svm">SVM</h4>
<p>feature map을 classifier에 적용할 때 CNN을 활용하지 않고 SVM을 사용하는 이유에 대해 한번 생각해 볼 필요가 있다. 이유는 바로 성능 때문인데 SVM을 활용했을 때 CNN보다 성능이 더 좋았다는 결과가 있기 때문이다.</p>
<h3 id="fast-r-cnn">Fast R-CNN</h3>
<p>그러나 R-CNN은 여러가지 단점이 있다고 한다. 대표적으로 모델을 활용할 때 각 ConvNet별로 별도 시행을 해야하기 때문에 시간이 오래걸린다는 단점이 있고, input size가 고정되어있기 때문에 정보의 손실 또한 존재한다는 단점 때문에 이를 보완하기 위해 나온 모델이다. 이 모델은 다음고 같은 장점이 있다.</p>
<blockquote>
</blockquote>
<ol>
<li>inference를 향상<ul>
<li>필터를 1회 통과시키고 그 필터를 재사용해 computation cost를 줄인다.<blockquote>
</blockquote>
</li>
</ul>
</li>
<li>end to end<ul>
<li>SVM을 과정을 없애고 Gradient를 도입시켰다.<blockquote>
</blockquote>
</li>
</ul>
</li>
<li>멀티태스크 러닝<ul>
<li>BBoxRegressor을 적용해 박스를 적용시키고 ROI pooling 방법이 추가적으로 들어간다.</li>
</ul>
</li>
</ol>
<h4 id="구조-및-특징">구조 및 특징</h4>
<p>Fast R-CNN은 다음과 같은 구조를 지녔다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/01fd02a1-5c05-4417-a766-729bfad1ba32/image.png" alt=""></p>
<p>Conv feature map에서 필터를 한번 통과해 feature matrix를 생성한 뒤 ROI feature vector을 통해 마찬가지로 bbox와 class를 판별해 내는 모델이다.</p>
<p>사용되는 과정은 다음과 같다.</p>
<blockquote>
</blockquote>
<ol>
<li>selective search를 이용해 ROI를 추출해낸다.</li>
<li>풀링을 위한 선택형 window화를 진행한다.</li>
<li>pooling 기법을 이용하여 각 윈도우 별로 풀링을 적용한다.</li>
</ol>
<h4 id="roi-pooling">ROI Pooling</h4>
<p>pooling은 다음과 같이 window를 기존에 설정한 크기에 맞게 조절해 주기 위해 사용한다. 아래의 이미지 과정처럼 Pooling을 진행한다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/6c7c7780-2c51-42c8-8715-63102a4ea1a8/image.png" alt=""></p>
<p>과정은 다음과 같다.</p>
<blockquote>
</blockquote>
<ol>
<li>미리 설정한 HxW크기로 만들어주기 위해서 (h/H) * (w/H) 크기만큼 grid를 RoI위에 만든다.</li>
<li>RoI를 grid크기로 split시킨 뒤 max pooling을 적용시켜 결국 각 grid 칸마다 하나의 값을 추출한다.</li>
</ol>
<p>위 작업을 통해 feature map에 투영했던 hxw크기의 RoI는 HxW크기의 고정된 feature vector로 변환된다.</p>
<h3 id="faster-r-cnn-1">Faster R-CNN</h3>
<p>그럼에도 불구하고 여전히 보완할 점은 있다. Selective search 알고리즘 또한 이미지에서 segmentation을 선택하는 과정에서 시간이 오래걸린다. 이 또한 Conv Layer에서 진행하면서 활용 속도를 줄이고 성능은 더 높일 수 있는 Region Proposal을 활용한다. </p>
<h4 id="구조-및-특징-1">구조 및 특징</h4>
<p>Faster R-CNN의 구조는 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/5e7f0c60-39e3-4e81-9b0c-432ab79042c2/image.png" alt=""></p>
<p>Conv Layer과 RPN을 공유하여 제안된 모델이라고 한다. 이 모델의 특징은 다음과 같다.</p>
<blockquote>
</blockquote>
<ul>
<li>박스를 랜덤화나 오버레이를 적용하지 않고 전체 이미지를 격자 무늬로 쪼갠다.</li>
<li>앵커박스(Anchor box)를 도입하였다.</li>
</ul>
<p>앵커박스에 대한 정의는 <a href="https://kr.mathworks.com/help/vision/ug/anchor-boxes-for-object-detection.html">MathWorks</a>에서 확인할 수 있다.</p>
<p>Multiple scale &amp; size를 다루는 방법은 다음과 같이 세가지가 있다.</p>
<blockquote>
</blockquote>
<ol>
<li>하나의 scale&amp;size classifier을 사용해 scale을 바꾸는 방법</li>
<li>영상의 크기를 줄이는 대신 filter size를 다양화</li>
<li>Reference를 여러개 사용</li>
</ol>
<p>여기서 앵커박스는 3번에 가까운 방법이다. <del>확실하진 않지만 가장 가까운 방법이다.</del></p>
<h4 id="rpn">RPN</h4>
<p>RPN은 다음과 같은 구조를 가지고 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/66925a3d-f399-4412-91a7-b2aedd1da9d0/image.png" alt=""></p>
<p>k개의 앵커박스를 활용해 격자무늬 이미지에 대해 sliding window방법으로 이미지 틀을 만든다음 각 앵커박스와 대조하여 탐지해내고 클래스를 분류하는 방식을 활용한다. 최적의 앵커박스를 찾아내기 위해 Non-Maximum Suppression(NMS)방법을 사용하여 두가지 피처를 산출해낸다.</p>
<blockquote>
</blockquote>
<p>2k scores: 물체가 존재하는지 하지않는지 구분하는 분류기
4k coordinates: 앵커박스의 중심위치, 높이, 넓이</p>
<h4 id="nms">NMS</h4>
<p>최적의 앵커박스를 찾아내는 방법으로 활용되었으며 다음과 같은 특징을 가지고 있다.</p>
<blockquote>
</blockquote>
<ul>
<li>한 물체를 가리키는 여러개의 박스를 하나로 추리는 과정</li>
<li>앵커박스들 중에서 가장 큰 박스 하나를 선택해 겹쳐있는 앵커박스 모두를 통해 confidence score과 IoU score을 산출한다.</li>
<li>Confidence score은 객체가 포함되어 있는 정도를 나타내고 IoU score은 다른 앵커박스와의 겹치는 구간이 많은가를 계산한다.</li>
<li>Confidence score이 높고 IoU score이 낮을수록 앵커박스가 선택될 가능성이 높다.</li>
</ul>
<h3 id="학습-전략">학습 전략</h3>
<p>Loss는 다음과 같이 계산한다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/8600280c-a8c5-4df1-af72-d5df9ae3e803/image.png" alt=""></p>
<p>최종적으로 classification과 detection을 같이 하기 때문에 두 경우의 Loss를 합친 값을 최종 Loss로 활용한다.</p>
<p>또한 훈련 단계에서 다음과 같은 과정을 통해 학습시킨다.</p>
<blockquote>
</blockquote>
<ol>
<li>이미 train된 ImageNet으로 RPN을 end-to-end train한다.</li>
<li>RPN을 이용하여 Faster R-CNN을 학습시킨다.</li>
<li>feature extraction을 진행하기 위해 RPN, Faster R-CNN의 하이퍼파라미터를 순서대로 학습시킨다.</li>
</ol>
<h3 id="퍼포먼스-측정-방법">퍼포먼스 측정 방법</h3>
<p>이미지 탐지에 가장 많이 쓰이는 정밀도와 재현율을 활용한 Average Precision을 여기서 또한 활용한다. <a href="https://www.waytoliah.com/1491">waytoliah</a>에서 정리를 매우 잘해두었다. 참고해서 보면 좋을것 같아서 가져왔다.</p>
<ul>
<li>ZF: Conv Layer을 다섯개만 사용한 모델을 칭한다.</li>
</ul>
<p>출처</p>
<blockquote>
</blockquote>
<p><a href="https://ganghee-lee.tistory.com/35">R-CNN 논문 리뷰</a>
<a href="https://www.geeksforgeeks.org/selective-search-for-object-detection-r-cnn/">Selective Search Algorithm</a>
<a href="https://ganghee-lee.tistory.com/36">Fast R-CNN 논문 리뷰</a>
<a href="https://ganghee-lee.tistory.com/37">Faster R-CNN 논문 리뷰</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[💻CV prologue]]></title>
            <link>https://velog.io/@wise_head/%EC%A0%9C%EB%AA%A9%EC%9D%84-%EC%9E%85%EB%A0%A5%ED%95%98%EC%84%B8%EC%9A%94</link>
            <guid>https://velog.io/@wise_head/%EC%A0%9C%EB%AA%A9%EC%9D%84-%EC%9E%85%EB%A0%A5%ED%95%98%EC%84%B8%EC%9A%94</guid>
            <pubDate>Mon, 27 Nov 2023 01:57:53 GMT</pubDate>
            <description><![CDATA[<h2 id="prolog">Prolog</h2>
<p>스터디를 시작하기 앞서 내가 이 공부를 왜 하는가에 대해 생각해 보고 갈 필요가 있을것 같다. 막연하게 누구나 다 하니까 라는 것은 나에게 도움이 되지 않을 뿐 더러 공부를 한다고 하더라도 이후에 큰 도움이 되지 않을 것이다. 따라서 스스로에게 이유를 묻고 시작하고 싶다.</p>
<h3 id="deep-learning">Deep Learning</h3>
<p>가장 공부해보고 싶고 활용하고 싶었던 분야다. 머신러닝을 활용할 수 있었던 나는 데이터의 한계를 계속해서 경험하고 있었다. 대부분 기계학습은 정형데이터로 많이 다루기 때문이고 의미가 있는 분석을 진행하기 위해서는 비정형보다는 정형이 답을 찾기 쉽기 때문이다. </p>
<p>또한 성능면에서도 어떠한가. 기존 머신러닝 모델은 랜덤포레스트만 해도 2008년에 시작한 모델이다. 무려 15년동안 사용되고 있다는 말이다. 그럼에도 계속 사용되고 있는건 그만큼 좋은 모델이라는 것이지만 결국 머신러닝에서 가장 좋은 성능을 가진 모델도 아니다. 데이콘에서만 봐도 XGBoost, Light GBM을 사용한 사람들의 순위가 가장 높게 나오는걸 확인할 수 있었다. 이처럼 머신러닝의 한계를 쉽게 접할 수 있었고 데이터가 클 수록 딥러닝이 성능면에서 뛰어난 것을 확인할 수 있을 것이다.</p>
<h3 id="object-detection">Object detection</h3>
<p>무엇보다도 CV에 관심을 갖게된 계기는 학부 친구의 Object Tracking을 본 뒤로이다. 영상에 나오는 물체를 인식해 그 물체가 이동하는 방향과 속도를 추적할 수 있다는것이 너무 신기했고 새로운 것을 해보고 싶었던 나에게 센세이션을 주었다. 물체 tracking을 하려면 detection을 먼저 해야한다. 맞는 말이다. 인식을 먼저 해야지 그 물체가 움직이는 방향과 속도를 볼 수 있을 테니.</p>
<h3 id="쉽지-않았던-모델링">쉽지 않았던 모델링</h3>
<p>실제로 써보고 싶었기 때문에 한 교육과정에서 프로젝트를 영상처리 파트로 참여했었다. 데이터는 X-ray로 이루어진 이미지와 레이블 내용, 파일이름, 속성, 이상있는 레이블박스로 이루어져 있었다. COVID-19에 관한 데이터였기 때문에 폐의 이상 정도와 이상이 있는지를 판단할 수 있는 데이터였다. 하지만 3주 기간동안 로컬 환경에서 진행해보고 싶었던 욕심 때문인지 환경만 조성하고 실제로 실행해보기 까지 2주 4일정도가 걸렸지만 메모리 부족으로 실패... 많이 억울하기도 했고 차라리 Colab을 활용했다면 빠르게 끝났을 수도 있었던 문제였다. </p>
<p>이런 경험을 다시하지 않기 위해 환경 요구사항부터 만들기까지 다양한 제약사항을 스스로 해결하자라고 생각하였고 마침 AI 부트캠프를 합격하고 과정을 진행중이다. 그간 해보지 못했던 공부를 시작해보고자 CV를 선택했다.</p>
<h3 id="컴퓨터-비전-정주행-kit">컴퓨터 비전 정주행 kit</h3>
<p><img src="https://velog.velcdn.com/images/wise_head/post/f27ac5b6-efa9-4dff-b6bc-840e1929f84e/image.png" alt=""></p>
<p>다양한 교재 및 강의 후보중 여러 논의 끝에 결정된 교재다. 처음에는 기초 내용이 많았고 아래에 실전 모형을 모아놓은 부분이 따로 있었다. 기초 내용이나 역전파 알고리즘 같은 경우 수업 시간에 들었던 내용도 있을 뿐더러 이론적인 내용의 기반이 되는 내용은 어느정도 알고 있었기 때문에 실전 모델 33개 과정으로 바로 들어가기로 했다. 모르는 내용이 있으면 위의 기초 강의를 다시 참조해서 다시 상기하고 들으면 된다라는 생각이 들었다. 실제로 스터디 조원들 또한 나와 같은 생각을 가진 사람이 대다수였어서 이견 없이 진행되었다. </p>
<p>언제까지 진행할지 모르겠지만 앞으로 이 강의를 통해 CV에 대해 더 많이 알아가는 시간을 가졌으면 좋겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[모여서 하기 좋은 게임: 마니또]]></title>
            <link>https://velog.io/@wise_head/%EB%AA%A8%EC%97%AC%EC%84%9C-%ED%95%98%EA%B8%B0-%EC%A2%8B%EC%9D%80-%EA%B2%8C%EC%9E%84-%EB%A7%88%EB%8B%88%EB%98%90</link>
            <guid>https://velog.io/@wise_head/%EB%AA%A8%EC%97%AC%EC%84%9C-%ED%95%98%EA%B8%B0-%EC%A2%8B%EC%9D%80-%EA%B2%8C%EC%9E%84-%EB%A7%88%EB%8B%88%EB%98%90</guid>
            <pubDate>Sun, 26 Nov 2023 09:28:55 GMT</pubDate>
            <description><![CDATA[<h2 id="학회-발표">학회 발표</h2>
<p>졸업 논문을 완성하기 전에 제주도에서 학회 발표가 있었다. 마침 교수님들도 참석을 못하시고 나의 동기인 친구들과 반년 늦게 졸업하는 형 한명이 2022년 제주도 학회에 참석하게 되면서 다같이 지낼 수 있는 숙소와 함께 포스터 발표가 끝나고 모여서 할 수 있는 놀이나 게임을 찾아보고자 하였다. </p>
<p>여기서 제안된 게임은 바로 마니또. 단순하게 생각해서 마니또 게임은 굳이 컴퓨터를 빌리지 않고 진행할 수 있다. 그러면 굳이 왜 만드냐고 의문이 들 수 있다. 왜 만들었을까?</p>
<h3 id="사회자가-필요한-게임">사회자가 필요한 게임</h3>
<p>마니또는 모여있는 사람들의 이름이 모두 하나씩 쓰여져 있는 쪽지나 제비를 통해 뽑으면서 그 사람을 위해 여러가지 선물을 준비하거나 선행을 베푸는 게임이다. 이번 게임은 선행을 베풀기 보다는 그 사람에게 어울리는 선물을 10000원 ~ 20000원 사이 가격으로 선물하기로 하였다.</p>
<p>그러나 이 방식을 선택하게 되면 참석 인원 중 한명은 무조건 사회자가 되거나 외부에서 사회자를 섭외해야하는 번거로움이 존재했다. 그리고 사회자가 된 사람은 선물을 주고받는 과정에서 같이 즐기지 못하고 생각 하고 있는 선물도 보여주지 못한다. 따라서 아쉬움이 클 것이다.</p>
<h3 id="기존에-존재하는-어플">기존에 존재하는 어플</h3>
<p>그러면 휴대폰에서 어플을 찾아서 하거나 분명 이렇게 생각한 누군가가 만들었을 것이다. 라고 생각해서 나는 어플과 블로그, 다양한 게시글을 전부 찾아보면서 확인해봤다. 하지만 결국에는 사회자로 한명이 필요한 기능이었고, 모두가 참여하지 못했다. 따라서 이것을 직접 구현 하고자 직접 코드를 생성하고 보내는 기능을 만들었다.</p>
<h2 id="마니또-코드">마니또 코드</h2>
<h3 id="코드의-구성">코드의 구성</h3>
<p>코드는 간단하게 두 기능을 구현해야 했다. </p>
<ol>
<li>랜덤 샘플링을 통해 각자 이름이 자신이 나오지 않게 배정</li>
<li>각자에게 메일을 보내야 하는 기능</li>
</ol>
<p>두 기능을 준비해야 했다. <del>솔직히 1번 기능은 그렇게 오래 걸리지도 않았다. 뚝하면 딱하고 금방 짜는것을 오래 걸릴것도 없었다. 2번이 진짜 문제였지...</del></p>
<h4 id="1-랜덤-샘플링">1. 랜덤 샘플링</h4>
<p>알고리즘을 표현해보면 다음과 같은 과정을 지녔다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/10a56f67-a233-4245-841b-1434533da827/image.png" alt=""></p>
<p>여기서 섬 모양은 [1, 2, 3, 4, 5, 6, 7]의 7명의 사람이 있을 때 [2, 3, 1], [7, 6, 5, 4]와 같이 각자의 섬으로 나뉘어져 선택되는 경우를 말한다. 꼬리잡기의 사이클처럼 한명씩 모두 꼬리를 물고 물리는 것을 원하는 경우도 있기 때문에 다음과 같이 옵션을 하나 추가해서 섬모양을 선택 가능하게 두었다.</p>
<h4 id="2-이메일-전송">2. 이메일 전송</h4>
<p>이메일 전송은 생각보다 간단했다. 네이버의 메일을 이용하기 위해 smtp기능과 email기능을 활용하였다. 두 기능은 기본적인 모듈로 collections처럼 파이썬이 존재하면 존재하는 기능이었다. 따라서 네이버의 smtp 이름과 포트 번호를 기본적으로 활용하였다.</p>
<p>다음으로 이메일에 대한 내용은 파이썬으로 직접 만들어 전송하였다. 각 보내는 사람에 맞춰 순서대로 보내야지 안그러면 랜덤 샘플링을 하더라도 의미가 없어진다. 우연찮게 의도대로 되는 경우도 있겠지만 아닐 확률이 더 높을 것이다.</p>
<h3 id="dashboard">DashBoard</h3>
<p>파이썬으로만 실행하면 기능을 아무리 잘 알아도 보이는 것은 기나긴 코드밖에 안보일 것이다. 다음에 다른 것으로 활용하기 위해서라도 다른 내용을 받아와야 되는데 이 블로그나 다른 곳의 페이지 처럼 버튼이나 입력 텍스트에 맞춰 전송이 된다면 보기 깔끔하고 누가봐도 구현을 해냈다 라는 느낌이 강할 것이다.</p>
<p>다음은 구현한 대시보드 페이지이다. </p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/f7d280e5-ec27-4448-b87e-91846bf96c8a/image.png" alt=""></p>
<p>간단한 주의사항과 각 칸에 입력값을 입력하면 전송할 수 있다. <del>개인적으로 비밀번호를 마스킹해서 나와야 하는데 그냥 나와서 어떻게 수정할지 고민하다가 GPT가 한번에 출력하는 걸 보고 GPT 왜 쓰는지 깨달아 버렸다..</del> 이 페이지는 다음과 같은 순서로 작용해야 한다.</p>
<ol>
<li>Sending_players.csv 파일을 등록해야한다. 따라서 파일이 존재하는 경로를 찾아야한다.</li>
<li>등록에 성공하면 네이버 아이디 비밀번호와 맞춰서 입력하고 원하는 옵션을 선택한 다음 전송 버튼을 누른다.</li>
</ol>
<p>이 순서대로 진행하면 다음과 같이 네이버 메일에 이렇게 뜬다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/120e5791-d40d-46ee-ab01-ae46bb417e79/image.png" alt=""></p>
<p>각자의 이메일 정보는 소중하니까 마스킹하기로 한다. 메일 전송에 성공하는 것과 이렇게 다섯건의 메일이 보내져있으면 성공이다. </p>
<p>여기서 주의할점은 보낸 사람은 내용의 전부를 확인할 수 있다. 따라서 재미를 위해서라면 보내진 메일을 꼭 지우는 것을 권장하고, 보낸이에 존재한다고 해서 받는이 목록에 같이 들어가 있는 것은 아니다. 따라서 보내는 이도 다른 메일 하나를 추가적으로 반영하여 같이 진행하면 틀림없이 좋은 마니또 게임을 진행할 수 있을 것이다.</p>
<h2 id="실제-사용-후기">실제 사용 후기</h2>
<p>실제로 대학원 친구들과 7명이서 활용해봤다. 예시는 재사용 하기 위한 멤버 5명이지만 7명이서 진행할 때 깔끔하게 진행되었다. <del>사실 나는 그렇게까지 마니또에 대해 의미를 체감하지 못해서 신경 안쓰려다가 꼭 신경 쓰란말에 뜨끔했었다. 허허허</del> 7명이서 서로 관찰하고 교환할 때 의미를 들으면서 그럴듯하고 재미있게 흘러가는 모습에 괜히 기쁘고 뿌듯했다. <del>사실 의미있는 선물보다는 받았을 때 살짝 킹받지만 웃긴 선물을 하고싶었다. 근데 이거 생각하기 너무 어렵더라. 혹시 이러한 선물 아이템이 있으면 추천 해주길 바란다.</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[두번째 프로젝트: 우루사]]></title>
            <link>https://velog.io/@wise_head/%EB%91%90%EB%B2%88%EC%A7%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9A%B0%EB%A3%A8%EC%82%AC</link>
            <guid>https://velog.io/@wise_head/%EB%91%90%EB%B2%88%EC%A7%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9A%B0%EB%A3%A8%EC%82%AC</guid>
            <pubDate>Sat, 25 Nov 2023 17:37:53 GMT</pubDate>
            <description><![CDATA[<h2 id="프로젝트를-시작하며">프로젝트를 시작하며</h2>
<p>처음으로 다른 사람들과 같이 시작하는 프로젝트를 진행하고 일주가 조금 넘는 시간동안 같이 밤낮을 세워가며 열심히 진행했다. 오랜만에 단합도 되고 의지도 넘쳐나는 사람들과 한 팀이 되어 완성하면 뭔가 될것 같은 기분을 매우 느꼈다. 처음에 소회의실로 모이고 대화를 나누었을땐 서로 어색했는데 지금은 서로 장난도 치고 매우 친해졌다. 분명 아무사이도 아닌데 불구하고 이렇게까지 동료애를 느끼면서 진행해보는 것은 오랜만이었던것 같다.</p>
<h3 id="주제">주제</h3>
<p>우리는 11조로 배정되었고 의료 카테고리를 선택했던 사람들 중 4명이 뭉치게 되었다. 다들 신기하게 포지션이 겹치지도 않고 나중에 EDA를 진행할 때에도 각양각색의 스타일 대로 진행하였지만 하나같이 빼놓을 수 없는 부분을 보여주었고 각자 생각한 부분이 겹치지도 않았었다. 참 신기하게 분업화가 말하지 않아도 잘 되어있던 팀이었다. <del>후일담으로 스터디에서 우리조를 대상으로 감탄을 진짜 많이 했다고 들었다. 논문 형식의 도표와 알찬 내용, 그리고 완벽한 결론까지 칭찬을 많이 들었다.</del></p>
<p>11조의 주제는 간에 관한 질병에 대해 분석을 진행하는 것으로 정해졌다. 팀장을 담당하였던 분이 평소에 간에대해서 연구도 많이 하시고 진작에 의료데이터에 친숙하신 분이었다. <del>프로젝트가 끝나고 다른 질병에 대해서 물어봐도 빠르고 쉽게 잘 대답해주시던 팀장님이었다.</del> 따라서 간에 영향을 주는 요인이나 간의 건강상태에 따른 몸의 구성성분의 특징과 요인 그리고 정상 범주의 기준, 최대 수치 허용범위까지 우리가 필수로 체크해야 하는 데이터 속성과 관련된 탐색을 별도로 하지 않아도 지식을 얻을 수 있는 장점까지 가져갈 수 있었다.</p>
<h3 id="역할">역할</h3>
<p>팀원은 총 네명으로 팀장님이 주제에서 설명한 것 처럼 간 질병을 확인할 수 있는 요인과 간에 영향을 주거나 받을 수 있는 요인을 정의해주셨다. <del>의료데이터는 데이터를 정의하고 처리하는데 90%를 소요한다는데 이분이 거의 다했다고 생각해도 괜찮을 것 같다.</del> </p>
<p>다음으로 컴퓨터공학과를 졸업하신 한분과 기억은 잘 안나지만 컴퓨터와 관련된 과를 마지막 학기 재학중이신 분 그리고 나 이렇게 네명이 배정되었다. <del>역할 조차 황금밸런스를 보는 것 같았다.</del> 따라서 컴공과쪽이신 두분은 데이터를 찾았을 때 너무 다양한 데이터를 찾았었고, 필요한 데이터를 찾기에 힘들었을 때 찾아서 데이터를 구축해주는 역할을 주로 담당하셨다. </p>
<p>나는 데이터를 활용하여 어떤 요인이 간의 질병에 관해 영향을 주고있는지 찾아내거나 기초 통계분석을 구현하는 통계적인 역할을 담당하였다. </p>
<p>공동적인 역할로는 캐글이나 공공데이터로 다양한 데이터를 찾고 각 데이터에서 칼럼 별로 어떠한 분포를 가지고 있는지, 이상치나 결측치가 존재하는지 각자 칼럼을 쪼개서 담당해 다음날에 각자 어떻게 파헤쳤는지 토의하고 앞으로 어떻게 진행할지 상의를 제일 많이 하였다. <del>여기서 동혁님이 팀장님한테 진짜 많이 혼났다. 그때 장면은 내가 지도교수님한테 혼나는 장면과 너무 겹쳐보였다. 우리 팀장님은 내 지도교수님하고 분위기부터 말투가 진짜 닮았다.</del> </p>
<h2 id="본-프로젝트-내용">본 프로젝트 내용</h2>
<p>프로젝트는 최종적으로 PPT 페이지 71페이지가 나왔다. <del>솔직히 만들고도 우리 조가 1시간 반 정도 떠들어도 될만큼의 분량이었다. 최종본을 검토하는데 학술대회에서 세션 발표하는 정도로 꼭 이렇게 다 만들었어야만 속이 후련했냐! 싶을정도...</del> 발표 제한시간은 12분정도였다. 진행한 내용이 정말 많지만 압축해서 발표해야 했기 때문에 일부 설명은 그냥 스킵하고 넘어갈 정도였다.</p>
<h3 id="제목">제목</h3>
<p><img src="https://velog.velcdn.com/images/wise_head/post/87afbbb5-adc7-48ba-b2d8-92e02b498783/image.png" alt=""></p>
<p>제목은 다음과 같다. 간 질병중 B형간염, C형간염, 간경화에 대한 분석이다. <del>처음엔 간경화만 가지고 분석하고 그래프 그리고 어느정도 가설설정만 하면 끝날줄 알았는데... 자꾸 추가되고 추가되서 전부 분석해보자 해서 최종적으로 다하게 됐다. 그땐 진짜 하기 싫었지만 막상 다 하고나니 배울점이 정말 많았다.</del></p>
<h3 id="목차">목차</h3>
<p><img src="https://velog.velcdn.com/images/wise_head/post/b7609d32-e088-46b9-8f1d-e0c4005fd730/image.png" alt=""></p>
<h3 id="introduction">Introduction</h3>
<p>건강검진 권장 우편물을 받았던 팀장님이 보시다가 5대 암에 대한 정보를 소개해주는 팸플릿을 받았다고한다. 그때 생겼던 궁금증이 과연 우리나라의 암으로 인한 사망자들 중 어떤 종류의 암이 얼마나 많은 사람을 죽음으로 이르게 만드는가에 대해 알아보고 싶다고 하였다. <del>이유를 만든거 아니냐고 물으신다면 그냥 넘어가도록 하자. 그게 뭐가 중요하나</del></p>
<h4 id="암-종류-별-생존률">암 종류 별 생존률</h4>
<p>따라서 암의 종류별로 투병한 환자들의 생존률을 비교하였을 때</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/0f37d4de-7944-409c-b974-8dbb1773ac70/image.png" alt=""></p>
<p>간암으로 사망한 환자들이 매우 작음을 확인 할 수 있었다. 실제로 간암으로 사망한 환자들은 폐나 기관지등 호흡기 부위 관련 암투병 환자가 가장 많았는데 오히려 생존률은 간암 환자보다 더 높단것이 너무 의외의 결과였다. 따라서 우리는 간암으로 이어질 수 있는 다른 질병들 또한 확인하고자 하였다.</p>
<h4 id="각-나라별-암-투병-환자">각 나라별 암 투병 환자</h4>
<p>다음으로 각 나라별로 1990년부터 2019년까지의 암 투병 환자의 사망 인원수를 나라별로 비교하였을 때 너무 당연한 말로 중국이 압도적 1위를 차지하였다. 그다음은 인도였다. <del>이건 누가봐도 중국과 인도라고 할 수 밖에 없다. 왜냐? 당연하지 인구가 거기가 가장 많은데 암 투병 환자도 거기 많겠지.</del> </p>
<p>따라서 우리는 그대로 보는게 아니라 각 나라의 인구 비율로 봐야하지 않겠냐는 생각을 가졌다. 고로 년도별 간암으로 사망한 사람의 수를 누적하여 각 연도별 전체 인구수로 나눈 퍼센트를 확인하였다. 그랬더니 정말 의외의 결과가 나왔다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/73ade358-f9b7-4f47-abd8-67d591973778/image.png" alt=""></p>
<p>이렇게 눈곱만큼도 잘 안보이던 한국이</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/5a1e3a47-c8a0-42d7-a58d-b7cee8b8307c/image.png" alt=""></p>
<p>이렇게 성장세를 보였다. <del>2000년대부터 2010년대까지 대체 무슨일이 있었길래 이렇게까지 오른건지 모르겠다. 술을 많이 자시셨었나?</del> 또한 간에 관한 질병들이 항상 top 10으로 사망에 이르게한 원인으로 꼽혔다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/b49e1b41-4d9c-47cc-be38-a309e5690b55/image.png" alt=""></p>
<p><del>간에 관한 질병은 진짜 걸리면 안되는 질병중 하나라는걸 새삼 깨달아버렸다.</del></p>
<h4 id="활용-데이터">활용 데이터</h4>
<p>따라서 우리는 세 가지를 중심으로 데이터를 확인하고 파악하기로 하였다,</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/88faf7db-be4d-46c0-9614-1a6f6a7b5d50/image.png" alt=""></p>
<p>각각 간경화, B형간염, C형간염이다. <del>B형 간염 데이터 진짜 아무것도 안만들어져있어서 우리가 처리하고 진행하는데 개고생을 많이한 변수 중 하나다. 아니 어떻게 Complete하게 만들려 했는데 결측치가 하나도 없는 행이 0개냐고. 이건 데이터 만든놈이 잘못한거다.</del></p>
<h3 id="disease-and-data-overview">Disease and Data Overview</h3>
<p>우리의 각 질병에 대한 정의는 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/15f7d08d-8438-419c-9a8a-1bed5f73c8eb/image.png" alt=""></p>
<p>또한 데이터를 활용하면서 다음과 같이 <a href="https://docs.google.com/spreadsheets/d/1gwsh718iV1cLQwfclpmoQNqLDh3b-D9buDMX1Qt3fhg/edit#gid=255866397">CodeBook</a>도 만들었다. <del>이거 만드는데도 은근히 오래걸린다. 근데 어떻게 하나, 데이터 올려준 놈들은 이런 코드북도 안만들고 직무유기 아닌가</del></p>
<h3 id="data-preprocessing">Data Preprocessing</h3>
<p>데이터는 연속형 변수는 중앙값으로, 범주형 변수는 모르는 변수를 새로운 레이블로 만들어 정의하였다. 분류가 안되어야만 하는 열도 존재했다. 예를들면 약물 투여 실험을 진행한 환자도 있지만 진행하지 않은 환자에게 약물을 투여했다고 가정하는것도 정말 말이 안되기 때문이었다.</p>
<p>또한 우리 팀장님이 B형 간염 환자들을 분류할 수 있는 변수를 만들어 주었다. <del>오 역시 도교수님 믿습니다 알렐루야!!</del> </p>
<h3 id="data-visualization">Data Visualization</h3>
<p>드디어 EDA의 메인이라 할 수 있는 시각화 파트다. 진짜 많이 탐색하고 찾아봤던 파트이다. 주로 봤던 것은 연속형 변수의 분포와, 반응 변수 집단별로 분포의 차이를 정말 많이 봤다. 범주형 변수는 분포와 집단별로 얼마나 나뉘어져 있는지 확인할 수 있는 히트맵을 주로 봤다. <del>C형 간염은 상혁님이 혼자 다했는데 같이한것처럼 나온것은 안비밀이다 호호호. 그래도 해석 관련해서 도연님이 많이 알려주셨으니 같이한거다. 암튼 그렇다.</del></p>
<p><del>그리고 여기서 B형 간염 데이터를 볼 때 동혁님이 연령과 성별간의 차이를 보다가 팀장님한테 많이 혼났던 그 파트다. 진짜 궁금하긴 한데 이때 팀장님이 반응 변수 만드신다고 딴거 하지 말라고 철조망을 치셨는데 거길 지나가다 동혁님이 걸려버렸던 것이다... RIP.</del> 대표적으로 다음과 같은 그래프를 보았다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/ccf92e6d-3eec-4ba5-8fb7-b084ac442d3e/image.png" alt=""></p>
<h3 id="analysis-results">Analysis Results</h3>
<p>각 데이터별로 반응변수인 병의 정도나, stage와 같이 범주형으로 나눠져있는 집단의 개수가 달랐다. 따라서 분석 방법도 나누어서 진행했는데 방법은 다음과 같다.</p>
<h4 id="stage별로-나뉘어진-간경화-데이터">Stage별로 나뉘어진 간경화 데이터</h4>
<p>간경화 환자들을 대상으로 1stage부터 4stage까지 차이가 존재하는 변수를 가려내기 위해 기초통계 테이블을 만들어서 확인하였다. <del>이거 만드느라 진짜 오래걸렸는데, 수치를 반복문이나 프레임을 모양을 좀 바꿨으면 금방 했을거같은데 진짜 멍청해진 나는 하나씩 일일이 기입했다. 앞으로는 머리좀 더 써봐야겠다.</del></p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/ea2b9240-05ef-4c0c-9f22-2b5be8a63820/image.png" alt=""></p>
<p>다음과 같이 귀무가설을 기각시키는 즉, 영향이 존재한다 나타나는 변수 중에 연속형 변수를 활용하여 Tukey의 사후검정을 실시하였다. PPT에는 대표적으로 체내의 구리양에 대해 표현하였다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/f47baa04-5b32-425a-8180-973f5a9b1aff/image.png" alt=""></p>
<p>다음과 같이 구리는 4집단에서 명확한 차이를 보였다. 역시 병이 악화될 수록 구리양이 많다는 것이 보였다.</p>
<h4 id="b형간염-여부로-나눌-수-있는-b형간염-데이터">B형간염 여부로 나눌 수 있는 B형간염 데이터</h4>
<p><img src="https://velog.velcdn.com/images/wise_head/post/8fb21b9d-68a2-4b15-ae75-908ec2c88ae4/image.png" alt=""></p>
<p>생각보다 연속형 변수들을 활용하여 차이가 존재하는 요인이 많이 존재하지 않았으며, 범주형 변수를 확인했을 때 범주의 상태가 진짜 별로였다. 따라서 연속형 변수만을 활용하여 로지스틱 회귀분석을 적합하였다. <del>당시 범주형 변수를 onehotencoder를 통해서 변환을 하고 직접 돌려봤는데 범주 집단을 나눌 수 없는 변수들이 대부분이었다. 살아있는 변수마저 집단에 관해 의미가 없어서 범주형 변수는 다 빼버렸다.</del></p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/a95b99a3-44bb-4778-a83b-d1c8b3c833e6/image.png" alt=""></p>
<p>단 두개의 변수만 의미가 있었고, 오른쪽에 변수에 대한 해석을 적어두었다. 그런데 진짜 신기하게도 Platelets는 감소할수록 간에 문제있는 요인이였고, ALP는 증가할 수록 간에 문제있는 요인이었다. 정말 신기할 나름이었다. 의미도 있었고</p>
<p>C형 간염은 기초통계로만 판별하였다. 가장 깔끔한 데이터기도 했고, 공식적인 대회에서 사용했던 대회인만큼 분명 의미있는 변수들만 선정해서 나온것이기 때문이다. <del>사실 이건 변명이고 분석할 시간 조차 없었다. 데이터 너무 많이 끌어다썼...</del></p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/a0758ae6-7dde-43b3-bc72-499d0855ccac/image.png" alt=""></p>
<h2 id="최종-고찰-및-느낀점">최종 고찰 및 느낀점</h2>
<p>일단 가장먼저 진짜 재밌었다. 프로젝트 하는 내내 가장 많이 웃었고, <del>팀장님이 디제잉을 하신다. 마지막날 발표자료 만들면서 재밌고 좋은 선곡들을 잘 말아주셨다. DJ알리사 드롭더 뮤직!</del>
부트캠프 참여 목적을 가장 많이 이뤄냈던 10일이었다. <del>이중 가장 재밌었던건 팀장님과 상혁님의 티키타카. 이둘은 스터디 조에서도 만나서 계속해서 공부와 회의를 같이 하고 있다고 한다. 이덕분에 다른 곳에서 팀장님의 새로운 이미지 이야기도 듣게되고 참 재밌고 신기했다. 이 이후에 미왕빌딩에서 과정 끝나고 둘이서 맞짱한번 뜬다는데 이기는편 우리편 아무나 이겨라 ㅋㅋㅋㅋ</del></p>
<p>이 과정이 끝나고도 다들 논문화나 대회를 한개 정도 더 같이 하면 좋겠다. 다음 프로젝트를 할 때 이 조로 계속 진행했으면 좋겠다고 이야기 했었다. <del>이거 사실 나만 그렇고 다들 등 뒤에 칼들고 있는거 아닌지 모르겠다. 허허허</del> 그래도 다행인건 최근에서 진짜로 논문화를 진행하자고 하였다. 시간이 오래걸리더라도 진짜로 하나 만들어서 넷이서 작업한 것을 문서로 남기고 싶다. </p>
<p>앞으로 이런 팀을 또 만날지 아니면 다른 분들은 어떤지 걱정도 되지만 다들 취업이나 공부를 목표로 참여하신 분들이라 의지가 없지 않을것이다. <del>간간히 소문으로는 참여 의지도 없고 뭘 해도 별로 반응도 없다는 사람이 있다는데 그런 사람만 좀 안걸렸으면 좋겠다. 여기가 무슨 대학교 팀프로젝트 하러 와서 프리라이더 하러 온 사람도 아닐테고</del> 이 다음은 머신러닝이라는데 아직까지는 내가 역할을 담당하는데 문제는 없을것 같다. <del>졸업시험을 데이터마이닝을 봤는데 뭐가 더 필요한가 싶다.</del></p>
<p>최종 코드 및 역할: <a href="https://github.com/Daw-ny/2023_Upstage_02nd_Proj">Github</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[첫번째 프로젝트: 끝말잇기]]></title>
            <link>https://velog.io/@wise_head/%EC%B2%AB%EB%B2%88%EC%A7%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%81%9D%EB%A7%90%EC%9E%87%EA%B8%B0</link>
            <guid>https://velog.io/@wise_head/%EC%B2%AB%EB%B2%88%EC%A7%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%81%9D%EB%A7%90%EC%9E%87%EA%B8%B0</guid>
            <pubDate>Sat, 25 Nov 2023 15:49:53 GMT</pubDate>
            <description><![CDATA[<h2 id="프로젝트를-시작하며">프로젝트를 시작하며</h2>
<p>부트캠프에서 처음으로 시작했던 개인 프로젝트, 솔직히 파이썬에 대해 공모전 출전과 자료구조 공부와 코딩테스트 준비로 인해 다양하게 활용해봤기 때문에 어느정도 자신있었다. 하지만 파이썬에 대해 알려주는 강의를 들으면 들을수록 내가 몰랐던 강의가 진짜 많았다. Django를 스스로 찾아서 공부해봤을 때 이런 기능을 직접 구현할 수 있나? 싶을 정도로 신기하고 다양한게 많았다.</p>
<h3 id="처음-접해보는-파이썬의-모듈">처음 접해보는 파이썬의 모듈</h3>
<p>실제로 공모전이나 경진대회를 진행하다 보면 데이터가 정해진 대회도 많았지만 그렇지 않은 대회도 많았었다. 아이디어 경진대회 같은 경우 어떻게 저런 데이터를 구할 수 있었지? 라는 생각을 자주하였고, 직접 분석한 모델의 시연도 페이지로 만드는 것을 보고 저런것까지 어떻게 스스로 진행할 수 있을까? 라는 질문을 가지게 되었는데 이번 부트캠프 과정을 통해 그 과정을 어느정도 깨달을 수 있었다.</p>
<h4 id="selenium">Selenium</h4>
<p>이 모듈은 파이썬으로 페이지를 크롤링 할 수 있는 모듈 중 하나라고 한다. 다양한 페이지의 내용을 html언어로 되어있는 곳에서 원하는 데이터를 찾아 가져오는 기능중 하나라 생각이 들었다. 프로젝트에 활용하려 시도 해보니 동적 움직임 또한 코드로 구현이 가능했지만 다른 기능이 필요했기에 이 기능은 프로젝트에 반영하지 못했다.</p>
<h4 id="flask">Flask</h4>
<p>이 모듈은 Django를 떠오르게 했던 모듈이었다. SQL lite를 활용하여 데이터를 저장하고 페이지에서 받아들이거나 페이지로 올려보내는 역할도 해주는 백엔드 담당 툴이었다. Django랑 코드 모양은 다르지만 쓰임새나 활용할 수 있는 기능은 비슷했고 확실히 알아두면 다양한 기능을 구현하는데 도움이 되는 기능이 많았다. 하지만 나의 프로젝트인 끝말잇기에서는 사용할 일이 없었다. 끝말잇기에서 로그인을 하는 경우는 온라인으로 진행하는 것 이외에는 별로 필요 없어 보였다.</p>
<h4 id="open-api">Open API</h4>
<p>이것은 모듈은 아니었다. 공공데이터나 각종 홈페이지에서 불러올 수 있는 데이터를 활용하기 위해 사용하는 키와 같은 것이였다. 이번에 진행했던 끝말잇기 프로젝트에서 이 기능을 많이 활용하였다. 언제 한번 해봤던거 같은데 그땐 아무것도 모르고 그냥 따라만 했는데 이번엔 기능을 이해하면서 해보니까 기억에도 어렴풋이 남은것 같다. 표준 대국어사전 홈페이지에서도 이 기능을 활용하니 내가 원했던 끝말잇기를 만드는데 활용할 수 있을것 같았다.</p>
<h3 id="끝말잇기-선택-이유">끝말잇기 선택 이유</h3>
<p>다양한 프로젝트 주제가 있었다. 내가 원하는 주제에 대한 신문 스크랩, SRT와 같은 자동 티케팅 등등 여러가지 기능이 있었는데 끝말잇기는 우리가 흔히 접할 수 있는 놀이 중 하나이기도 하면서 제일 쉽게 구현할 수 있을것 같았다. 원소 주기율표에서 볼법한 한방 단어들을 어느정도 알고 있었으니 사전에서만 나온다면 한방으로 이길 자신도 있었고, 상대방이 곤란할 것 같은 &#39;역&#39;으로 끝나는 말을 계속해서 준다면 당황하면서 게임을 이길 수 있었기 때문에 자신있는 종목을 직접 구현해 보고 싶었다.</p>
<h2 id="프로젝트">프로젝트</h2>
<p>끝말잇기를 시작하기 위해 어떤 방식으로 진행 할 것이며 어떻게 결과가 나야 승패 판정을 진행할 것인지 필요했다. 따라서 기능과 승패 판정 방식에 대한 메인 알고리즘을 먼저 생각했다.</p>
<h3 id="끝말잇기-진행-알고리즘">끝말잇기 진행 알고리즘</h3>
<p>끝말잇기를 시작하게 되면 진행할지 말지 받아들이는 것을 먼저 생각하였다. 따라서 다음과 같은 알고리즘을 생각하였다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/b5dfb6fb-e902-4960-9543-b6c76582fec1/image.png" alt=""></p>
<p>다음과 같은 방법으로 계속해서 끝말잇기를 진행할 수 있도록 진행하였다. 실제적으로 저장되어 있는 데이터를 부르고 저장하는 과정과 끝말잇기 자체를 시작하는 것을 제외한 나머지 과정을 나타내긴 했지만 메인에서는 이정도 기능만 존재하면 기능의 반을 구현한 것이라 볼 수 있다. </p>
<p>3번정도 오타를 내거나 Y/N 을 입력하지 않으면 자동으로 종료하게 되게끔 구현하였지만 순서도 알고리즘에는 표현하지 않았다. <del>지저분해 보인다.</del> 다음으로 끝말잇기 자체 규칙과 구현 순서도를 나타내 보기로 한다.</p>
<h3 id="끝말잇기-규칙">끝말잇기 규칙</h3>
<p>끝말잇기 규칙은 다음과 같다. </p>
<blockquote>
</blockquote>
<ol>
<li>사전에 등재된 명사여야 합니다</li>
<li>적어도 단어의 길이가 두 글자 이상이어야 합니다</li>
<li>이미 사용한 단어를 다시 사용할 수 없습니다</li>
<li>두음법칙 적용 가능합니다 (ex. 리-&gt; 니)</li>
<li>첫턴 한방단어는 불가능합니다.</li>
<li>게임당 경고 3회시 패배입니다.</li>
<li>Y/y를 입력하면 끝말잇기가 시작되며 N/n을 입력하면 끝말잇기가 종료됩니다.</li>
<li>첫 턴에 단어를 인식하지 못할 수 있습니다.</li>
<li>입력한 이후 오래걸리는 경우가 있습니다. 이 경우 크롤링을 하느라 시간이 걸리므로 잠시 기다리시면 정상작동 됩니다.</li>
<li>오류 발생시 잠시 기다렸다가 다시 실행하시면 됩니다.</li>
</ol>
<p>이 내용 또한 규칙을 확인할 수 있게끔 처음부터 보여주었다. 어딜가나 규칙에 맞는 과정을 진행해야지 안그러면 판정 자체가 애매해지기 때문이다. 따라서 전체적으로 진행할 규칙에 대한 내용을 구현해야 한다.</p>
<p>또한 두음법칙을 허용하는 경우가 있다. 따라서 두음법칙을 허용하는 경우 두음법칙을 적용한 단어와 적용하지 않은 단어 모두를 허용해줘야 한다.</p>
<h3 id="끝말잇기-적용-알고리즘">끝말잇기 적용 알고리즘</h3>
<p>사용자는 규칙에 맞게 다음과 같은 규칙을 위배하지 않는 단어를 입력해야 한다.</p>
<blockquote>
<p><strong>Rule</strong> </p>
</blockquote>
<ol>
<li>앞 글자가 맞지 않으면 안된다.</li>
<li>한번 게임에서 사용했던 단어를 재사용하면 안된다.</li>
<li>첫 턴 한정 한방단어를 입력하면 안된다.</li>
</ol>
<p>이후 다음과 같은 흐름으로 단어를 확인한다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/f46fe89b-ef81-4d9f-b087-5d4c86f80e07/image.png" alt=""></p>
<p>이렇게 사용자와 Bot의 티키타카를 진행하다 게임이 종료되면 메인 프로세싱으로 넘어가는 방식을 선택한다.</p>
<h2 id="프로젝트를-마치며">프로젝트를 마치며</h2>
<p>프로젝트를 진행해 봄으로써 되게 재밌는 기능의 구현과 여러가지 의의, 그리고 아쉬웠던점이 존재하였다.</p>
<h3 id="의의">의의</h3>
<p>끝말잇기에 대해 간단하게 생각했지만 다양한 기능을 구현해야 우리가 흔히 설정하고 진행할 수 있던 끝말잇기를 할 수 있었다. 따라서 각 기능마다 구현을 해서 적합시켜야 하는데 이러한 알고리즘의 결합을 계속해서 생각해야 하기 때문에 다양한 경우를 고려하여 진행하는 방향과 함수화에 대해 더 많은 깨달음을 얻어갈 수 있었다. </p>
<p>또한 이 프로젝트를 진행하면서 vscode를 처음 써보게 되고 poetry를 직접 만들어 적용해보는 시간을 가질 수 있었다. poetry는 현업에서 최근 많이 쓰이는 기능이라 회사에 업무를 진행할 때 큰 도움이 될것 같았다.</p>
<h3 id="아쉬운점">아쉬운점</h3>
<p>이 프로젝트에서 아쉬운 점은 나의 능력한계였다. 폼을 만들어 여러 기능 중 끝말잇기로 넘어가는 기능 구현을 하고 싶었는데, 스스로 짧은 기간에 만들게되어서 더 많은 기능을 넣지 못한게 아쉬웠다. <del>사실은 어느정도 귀찮아서 미루고 미루다 이렇게 된것도 있다.</del></p>
<p>또한 추가적으로 SRT예매하기 기능도 구현해놓고 싶었다. 실제로 나의 주변사람들은 콘서트나 경기, 기차표와 같은 예매 시스템을 자주 사용한다. 이 기능 또한 내가 제일 구현해보고 싶었던 기능 중 하나였다. 이와같이 다양하게 배운 툴을 활용하여 더 많은 기능을 구현해내고 싶었다.</p>
<p>코드 및 설명: <a href="https://github.com/Daw-ny/2023_Upstage_01st_Proj">github</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[git으로 협업하기]]></title>
            <link>https://velog.io/@wise_head/git%EC%9C%BC%EB%A1%9C-%ED%98%91%EC%97%85%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@wise_head/git%EC%9C%BC%EB%A1%9C-%ED%98%91%EC%97%85%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 22 Nov 2023 07:48:33 GMT</pubDate>
            <description><![CDATA[<h2 id="git으로-협업하기">Git으로 협업하기</h2>
<p>git은 생각보다 유용하다. 나만의 레포를 활용하여 내가 작성했던 코드를 올리기도 하고 다른사람에게서 코드를 받아 나의 레포에 한꺼번에 올리는 것도 가능하다. 그러나 이번에는 나의 개인용이 아닌 조직화 되어있는 레포를 가져와서 사용하는 것을 리뷰하려 한다.</p>
<h3 id="git-organization-만들기">git Organization 만들기</h3>
<p>협력을 진행하기 위해선 프라이빗한 공용의 레포가 생성되어야 하는데 이를 지원해주는 기능이라 생각이 든다. 팀원끼리 공유할 수 있고, 팀원끼리만 포크해서 사용 할 수도 있는 암호화된 채널이라는 생각이 강하게 들었다.</p>
<p>프로필창에서 오른쪽 나의 프로필 아이콘을 누르게되면 다음과 같은 창을 볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/e765c0a1-15bc-432d-b8c3-054f297691a6/image.png" alt=""></p>
<p>여기서 형광색으로 칠해진 부분을 누르게 되면 다음과 같은 창을 볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/700a99b9-cbdf-4eb5-bd53-84262f753cb5/image.png" alt=""></p>
<p>나의 조직은 현재 두 개의 조직이 포함된 것을 볼 수 있다. 여기서 위에 있는 New Organization을 누르게 되면 새로운 조직을 형성할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/e8fc19b7-7993-40a9-b59c-c998afabd7b7/image.png" alt=""></p>
<p>이런 화면을 볼 수 있는데 현재 고도화된 프로젝트를 만들것이 아니기 때문에 Free를 사용하기로 한다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/91974da1-020f-4362-9627-d1a5befe3105/image.png" alt=""></p>
<p>다음과 같이 조직 이름, 이메일, 어떻게 가져갈건지 등 설정하고 다음으로 간다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/21ba32c4-b883-456e-9c1c-1b4c4b0b96b7/image.png" alt=""></p>
<p>여기 단계에서는 어떤 사람을 추가할 것인지 정할 수 있다고 한다. 메일 또는 github 네임을 태그해서 초대할 수 있다고 한다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/26e5dd90-4ed9-4598-b07e-8076fc1ce2b1/image.png" alt=""></p>
<p>초대를 마치고나면 다음과 같은 조직이 완성된다. 이로써 협동 깃허브 페이지를 사용할 준비가 되었다. 별도로 invitations에서 초대할 수 있다고 한다.</p>
<h3 id="협동-git-repo-구성하기">협동 Git repo 구성하기</h3>
<p>Organization을 만들었으면 레포를 생성해야 한다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/664de919-d5dd-445f-aaa7-18eba639d77c/image.png" alt=""></p>
<p>다음과 같이 입력해준다. 아래의 license는 오픈 소스에 대해 내 마음대로 활용해도 법적 문제가 없는 라이센스다. 다른 곳에서도 이러한 라이센스가 있으면 그 코드 또한 내 마음대로 이용해도 처벌받지 않게 된다고 한다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/5acda357-8c0d-4df1-811f-744e76b1bbf6/image.png" alt=""></p>
<p>완성하면 다음과 같이 LICENSE를 확인할 수 있다. 매우 간편한 기능으로 이루어진 것 같다. 하지만 이걸로 완성이 되지 않았다. <del>.gitignore이란 파일이 존재해야 한다. 보안을 위해서라는데 솔직히 왜 중요한진 아직 모르겠다.</del></p>
<p><a href="https://www.toptal.com/developers/gitignore">gitignore.io</a>에서 간편하게 .gitignore을 사용할 수 있다고 한다. 다양한 환경에 맞게 가져올 수 있다고 하니 사용자 모두가 활용하는 코드를 넣는 것이 좋을 것 같다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/465e3239-2001-47d4-8fe5-ae16e8b0d139/image.png" alt=""></p>
<p>페이지에 이렇게 작성하고 나면 다음과 같은 코드가 나온다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/3dddee58-ae92-4789-88b3-8023b73f9064/image.png" alt=""></p>
<p>이 코드를 전체 복사해서 .gitignore에 담아 저장하면 된다고 한다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/87285949-ffd0-4a6d-930b-ae5a5976c6d8/image.png" alt=""></p>
<p>이렇게 생성하고 빠르게 push하면 다음과 같이 바로 반영된다고 한다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/981644d5-bf74-47bc-bcde-bd07df30f3b7/image.png" alt="">
<img src="https://velog.velcdn.com/images/wise_head/post/28c0929c-fa45-452f-af46-219eebc5d478/image.png" alt=""></p>
<p>만약 commit과 push가 기억이 나지 않다면 이전 게시물을 확인하는 것을 추천한다.</p>
<h3 id="fork로-게시물-가져오기">fork로 게시물 가져오기</h3>
<p>단순하게 commit해서 업로드하면서 저장하는 것도 좋지만 이렇게 진행하면 버전이나 내용이 잘못되었을 때 전부 지우게 되는 큰 실수를 범할 수도 있다. 또한 조직을 만든 사람은 자유롭게 게시물을 올릴 수 있지만 owner이 아닌 다른 멤버는 직접적으로 올릴 수 있는 권한이 없다. 따라서 fork를 활용하여 내용 업데이트를 요청할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/9c6e0783-1046-454c-ad6a-edbfec137c2d/image.png" alt=""></p>
<p>위의 fork 버튼을 누르면 </p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/3341a14c-f319-44a3-bca2-b5fc9bb47a89/image.png" alt=""></p>
<p>이러한 페이지가 나온다. 여기서 지정할 레포 이름을 등록해주면</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/8089fa7c-d5b6-4027-b688-cb6b4b814496/image.png" alt=""></p>
<p>다음과 같은 레포 포크를 확인할 수 있다.</p>
<h3 id="branch로-체크포인트-지점-만들기">Branch로 체크포인트 지점 만들기</h3>
<p>fork를 하고나면 기존과 똑같이 레포를 만들어 사용할 수 있다. 위 페이지를 clone으로 적용하고 나면 기존의 프로젝트에서 가져왔던 모습을 확인할 수 있다. </p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/f75138f9-2068-4080-8a11-6ee570e8ed5c/image.png" alt=""></p>
<p>branch 기능을 활용하게 되면 다음과 같이 main과 branch를 생성하여 지정한 이름으로 볼 수 있다. branch는 자료구조의 트리 구조를 연상하면 쉽게 이해된다고 한다. 나중에는 나눠진 포인트를 합치기도 하고 메인으로 반영 후 제거하기도 한다. branch mani에서 파이썬 작업을 진행해 보기로 한다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/7647c577-ad75-4b07-bfec-c94ae7380bbd/image.png" alt=""></p>
<p>다음과 같은 폴더를 mani branch에서 작업을 하여 commit까지 완료하였다. 여기서 main과의 차이를 확인할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/c8882bf5-49a8-466a-a069-131c01009207/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/131eedd8-e690-4482-9d31-a2b3e31c3995/image.png" alt=""></p>
<p>두가지의 파일 차이가 확연히 보이는 것을 확인할 수 있었다. 이렇게 차이가 존재하게 된다. 만일 가지를 제거하고 싶다면 다음과 같은 코드를 입력하면 제거할 수 있다.</p>
<pre><code>git branch -D [branch name]</code></pre><p>이것을 입력하면 분할하였던 가지가 전부 없어지게 된다. 추가적으로 merge를 진행할 때 발생할 수 있는 문제점이나 merge 기능은 다루지 않도록 하겠다. <del>이 이후는 찾아보면서 진행하는 것도 재미가 있을 것 같다.</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[git 환경 만들고 활용하기]]></title>
            <link>https://velog.io/@wise_head/git-%ED%99%98%EA%B2%BD-%EB%A7%8C%EB%93%A4%EA%B3%A0-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@wise_head/git-%ED%99%98%EA%B2%BD-%EB%A7%8C%EB%93%A4%EA%B3%A0-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 18 Nov 2023 07:50:07 GMT</pubDate>
            <description><![CDATA[<h1 id="현업에서도-많이-사용하는-git">현업에서도 많이 사용하는 git</h1>
<p>현재 현직자들도 가장 많이 사용한다는 git에 대해 학습하였다. github홈페이지는 가지고 있었지만 실제로 git bash를 활용해서 사용해 본 적은 처음이었다. 앞으로도 사용할 수 있게 잘 정리해 두어야 겠다.</p>
<h3 id="사용전-준비사항">사용전 준비사항</h3>
<p>자신의 OS에 맞춰서 활용하면 된다고 한다. 나는 Window를 사용하기 때문에 cmd나 bash와 같은 터미널과 비슷한 창에서 직접 진행하기 보다 vscode의 파일 뷰어와 터미널을 동시에 활용할 수 있는 장점을 활용하기로 했다. </p>
<p>처음으로 vscode를 준비하고 git을 설치해야 실행이 된다고 한다. <a href="https://git-scm.com/downloads">git homepage</a>에서 설치하고 진행하기를 권장한다.</p>
<p>git을 설치하고 vscode 터미널 창에 다음과 같이 입력하면 이렇게 뜬다.
<img src="https://velog.velcdn.com/images/wise_head/post/7de2cc5a-2928-4906-a499-7f3e90292588/image.png" alt=""></p>
<p>이러면 깃을 사용할 준비는 완료가 되었고, 개인의 깃 허브 계정이 있어야한다. <del>계정도 없이 진행하려는 사람이 이 글을 볼거라 생각이 들지 않는다.</del></p>
<h3 id="계정-등록하기">계정 등록하기</h3>
<p><a href="https://www.lainyzine.com/ko/article/how-to-set-git-repository-username-and-email/">계정 등록하기</a>에 자세히 설명되어 있기 때문에 나는 스킵하기로 한다.</p>
<h3 id="깃-허브에-존재하는-레퍼지토리-가져와서-작업하기">깃 허브에 존재하는 레퍼지토리 가져와서 작업하기</h3>
<p>자신의 깃허브마다 레퍼지토리가 존재한다. <del>강사님 말로는 레포 만들기 전부터 여러가지 보안에 대해 설정할 수 있다고 하지만 아무것도 알지 못했기 때문에 그러려니 하고 넘어가버렸다.</del> </p>
<h3 id="레포를-내-로컬로-가져오기">레포를 내 로컬로 가져오기</h3>
<p>가져올 레퍼지토리 창을 띄우고 아래 사진에 보이는 것 처럼 code를 누르면 다음과 같이 창이 나타난다.
<img src="https://velog.velcdn.com/images/wise_head/post/f3d4d95e-983e-45fc-b65a-7a950ed2cf56/image.png" alt=""></p>
<p>https의 주소를 복사하면 가져와서 작업을 진행할 레포 준비가 다 된것이다. 이제 터미널로 가서 </p>
<pre><code>git clone https://github.com/[자신의 계정이름]/[계정안에 생성한 레포].git
cd [레포 이름]</code></pre><p>을 입력하게 되면 자신이 생성한 레포를 내 로컬 컴퓨터로 가져올 수 있고, 해당 레포안의 폴더에 진입하게 된 것이다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/a907a7fa-4b69-4996-9d81-d263102aac45/image.png" alt=""></p>
<p>나는 이미 만들어 둔 레포 폴더가 있기 때문에 이미 존재한다고 뜬다. <del>이것은 나중 이야기인데 레포 안에 또다른 레포 폴더를 넣는것은 나중에 큰 문제를 일으킬 수 있다고 한다.</del> 이렇게 폴더 안으로 진입을 성공하게 되면 내가 원하는 레포를 불러오기는 성공한 것이다.</p>
<p>폴더 안으로 들어가보면 깃허브에서 볼 수 있던 목록을 그대로 확인할 수 있었다. 
<img src="https://velog.velcdn.com/images/wise_head/post/62cb9e5b-6071-47b5-825b-1225687cfd50/image.png" alt=""></p>
<h3 id="작업한-내용-깃허브에-올리기">작업한 내용 깃허브에 올리기</h3>
<p>VScode는 파일을 터미널로 열지 않고 원하는대로 작업할 수 있다고 한다. 따라서 나는 새로운 파일 <code>peeo.py</code>를 생성하여 <code>Hello world!</code>를 출력하는 <code>py</code> 파일을 만들었다. </p>
<p>다음과 같이 입력하면 어떠한 변동 사항이 생겼는지 쉽게 확인할 수 있다.
<img src="https://velog.velcdn.com/images/wise_head/post/404b2b10-7a61-4191-9f40-b6f4a5407adb/image.png" alt=""></p>
<p>git add로 다음과 같이 등록해주면 된다.
<img src="https://velog.velcdn.com/images/wise_head/post/8eab060c-19a4-4970-b270-335494c0a308/image.png" alt=""></p>
<p>이 과정이 로컬에서 스테이지로 올리는 과정이라고 한다. <del>이것이 정확한지는 모르겠다만 나는 그렇게 알아들었다.</del> 이것을 버전으로 등록해줘야 한다. 따라서 다음과 같은 명령어를 입력하면 완전히 올릴 준비가 다 된다고 한다.</p>
<pre><code>git commit

or

git commit -m &quot;[작성 행동]: [작성 내용]</code></pre><p>두 방법 모두 비슷하지만 강사님은 위의 내용을 추천하셨다. 아래 내용은 오타 내기도 쉽기도 하고 나중에 확인했을 때 수정하기도 쉽지 않아서 차라리 직접 입력하고 여닫을 수 있는 방법을 선호하셨다. <del>commit에 점으로 채우면 팀장님이나 부장님과 같은 높은 상사와의 커피타임을 자주 가질 수 있다는 소문이 있다. 정말로 따듯하다 못해 뜨거운 대화를 나눌거라고 하셨다 ...</del></p>
<p>따라서 위의 명령어를 입력하면 다음과 같은 창이 나오게 된다.
<img src="https://velog.velcdn.com/images/wise_head/post/cafd366a-5946-48ae-85f1-bf02ecee7ea9/image.png" alt=""></p>
<p>여기에서 i키를 누르게 되면 아래의 검정 줄이 <code>--INSERT--</code> 표시로 바뀌게 된다. 작성 행동은 다음과 같은 용어가 보편적으로 사용된다고 한다. 코드 안에서 if와 같은 조건문의 표현 방식을 바꾸는건 <code>refac:</code> 을 쓴다고 한다. <del>ppt만드시다가 수정하기 귀찮으셨나 보다...</del> 
<img src="https://velog.velcdn.com/images/wise_head/post/be9ed88f-6ce7-4b0c-858a-8378a35f44f2/image.png" alt=""></p>
<p>파이썬 파일 peeo.py를 생성한 것이기 때문에 feat라는 문구와 함께 어떤 것을 만들었는지 간단한 설명과 함께 입력을 종료했다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/436b3385-ed5b-4390-b9c0-a4e9a52c978b/image.png" alt=""></p>
<p>여기서 작성을 다 했으면 <code>esc</code>를 누르고 <code>:wq</code>를 입력하고 엔터를 누르면 저장 후 종료라고 한다. <del>콜론 기호를 입력하는게 익숙하지 않아서 나는 이 화면을 4번째까지 볼때만 해도 뭐가 잘못된줄 알고 처음부터 다시 만들어서 진행했다. 이런건 누가 친절하게 알려주지도 않는다. 나같은 사람은 어떻게 하라고 ,,,</del></p>
<p>저장 후 종료를 하면 commit을 하기 전 화면으로 돌아가서 다음과 같이 뜨게 된다.
<img src="https://velog.velcdn.com/images/wise_head/post/c0147ae4-8ac5-4b96-8dbe-67f62e57d9a4/image.png" alt=""></p>
<p>이렇게 되면 올릴 준비가 끝났다. 다음과 같은 명령어를 통해 깃허브에 전달하자.</p>
<pre><code>git push -u origin [branch]</code></pre><p>branch는 트리 구조의 가지치기 처럼 가지를 뻗어나가는 역할을 한다. 결국 합쳐지면서 사라지는 가지긴 하지만 체크포인트 처럼 작업의 정보를 소실하지 않게 진행해준다 한다. branch의 내용은 다음에 다뤄보도록 하자.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/1a4b4690-93bf-4cdc-a01f-f2f7b9bef6b5/image.png" alt="">
이렇게 입력하면 다음과 같은 창을 볼 수 있다. 다른 화면이 보인다면 add나 commit을 제대로 했는지 다시한번 확인해보자</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/02e36212-c469-43ab-adfe-d42b3b8c8f8c/image.png" alt="">
이렇게 깔끔하게 올라가 있는 모습을 확인할 수 있다.</p>
<p>또한 변경 내용을 다른 곳에 가져오려면 다음과 같은 명령어가 필요하다.</p>
<pre><code>git fetch [지정 이름 (보통 내가 클론한 주소: origin)] [branch: 보통 main을 많이 가져온다.]
git merge [selected bracnh]</code></pre><p>다음과 같은 명령어를 입력하면 깃허브에 변경되어 있는 레포 내용을 모두 가져올 수 있다.
<img src="https://velog.velcdn.com/images/wise_head/post/f55e2650-4e7e-4feb-a784-e339ea2204fb/image.png" alt=""></p>
<p>작동을 완료하면 다시한번 github에 있는 레포와 나의 로컬 레포가 동일한 것을 확인할 수 있다. </p>
<h3 id="later">Later</h3>
<p>또한 다른 사람이나 같은 조직의 메인 계정에 있는 레포도 가져올 수 있는데 다음과 같이 입력하면 가져올 수 있다고 한다.</p>
<pre><code>git remote add [지정이름: 보통 upstream이라 많이 지정한다 함] [깃허브 주소]
git remote -v (어떠한 지정 경로가 있는지 확인할 수 있다. origin: 내가 clone한 주소로 보통 지정)</code></pre><p>이전에 다른사람의 레포를 가져오려면 fork 기능을 활용하는데 다른 사람의 github 페이지에 보면 다음 버튼을 누르면 가져올 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/9d9e7bcd-5bff-4315-ad71-0a08fcbddda6/image.png" alt=""></p>
<p>이렇게 복제해서 나의 레포에서 작업한 뒤에 원본으로 올려보내는 방법이다. 이 과정은 branch와 함께 다음에 작성해보기로 하자.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[간편한 환경을 조성할 수 있는 Poetry]]></title>
            <link>https://velog.io/@wise_head/%EA%B0%84%ED%8E%B8%ED%95%9C-%ED%99%98%EA%B2%BD%EC%9D%84-%EC%A1%B0%EC%84%B1%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-Poetry</link>
            <guid>https://velog.io/@wise_head/%EA%B0%84%ED%8E%B8%ED%95%9C-%ED%99%98%EA%B2%BD%EC%9D%84-%EC%A1%B0%EC%84%B1%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-Poetry</guid>
            <pubDate>Fri, 17 Nov 2023 12:03:30 GMT</pubDate>
            <description><![CDATA[<h2 id="가상환경을-간편하게-만들-수-있는-tool">가상환경을 간편하게 만들 수 있는 Tool</h2>
<p><code>Poetry</code>는 <code>pip</code>과 달리 유연하다는 평이 많다. 현업에서도 많이 사용한다는 말을 듣고 직접 한번 파이썬 환경을 구성해 보고 싶어서 직접 한번 만들어 보았다.</p>
<p>처음 <code>Poetry</code>라는 명령어를 입력하면 다음과 같이 보인다.
<img src="https://velog.velcdn.com/images/wise_head/post/c27a315f-09be-4fde-99cd-7de041778db5/image.png" alt=""></p>
<p>만약 이러한 창이 아니라 오류가 난다면 <a href="https://python-poetry.org/docs/">Poetry 홈페이지</a> 에서 자신의 OS에 맞게 설치하길 바란다.</p>
<p>다음으로 확인해봐야 하는 화면은 <code>poetry config --list</code>이다. 이 명령어를 입력하게 되면 다음과 같은 화면이 나오게된다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/d2ad37b6-089e-4895-a336-bf7885ba98b3/image.png" alt=""></p>
<p>저 두가지 명령어가 True가 되어야 자체 폴더에 가상환경을 만들 수 있다는데 어떤 원리로 생성되는지는 잘 모르겠다 ...</p>
<p>여튼 아래의 명령어를 입력하면 자연스럽게 True로 바뀌게 된다고 한다.</p>
<pre><code>poetry config virtualenvs.create true --local
poetry config virtualenvs.in-project true --local
poetry config --list</code></pre><p>이렇게 적용하면 활용할 수 있는 파이썬 환경이 만들어질 준비가 끝난다고 한다.</p>
<p>환경을 구성하기 위해 다음과 같은 명령어를 통해 하위 폴더로 파이썬 환경을 만든다고 한다.</p>
<pre><code>poetry new [사용자가 원하는 이름]</code></pre><p>현 저자는 다음과 같이 폴더를 미리 생성해 놨기 때문에 폴더가 많지만 비슷한 환경을 보일 것이다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/699dd349-837c-41fe-a9da-9fcd471e2813/image.png" alt=""></p>
<p>이미 사용하고 있었기 때문에 구성되어 있는 모듈이 많은데 처음 생성하면 [tool.poetry.group.dev.dependencies] 또한 없을것이다. 전혀 이상한게 아니다. 왜 차이가 나는지를 질문하신다면 ,,,, 나는 대답할 수 없을것 같다.</p>
<p>다음으로 환경을 조성하였으니 활용할 모듈을 환경에 설치해야 한다. 아래와 같은 명령어를 사용하여 넣어주자</p>
<pre><code>poetry add pkg1 pkg2 ...</code></pre><p>그러면 위의 사진처럼 하나씩 차곡차곡 쌓이는 것을 볼 수 있다. 다만 용량이 큰 패키지는 설치가 느려서 오래 걸린다. 처음엔 오류인줄 알았다 .. </p>
<p>그리고 간혹가다 설치가 안되는 경우도 있는데 버전 확인을 잘해야한다. <del>버전 안맞으면 설치 안되는걸 몇번을 봤는지 모르겠다. 이것때문에 다시 설치한적도 ..</del></p>
<p>이렇게 필요한 패키지를 설치하고나면 바로 코드짜러 가자!!! 라고 하고싶지만 아쉽게도 마지막 과정을 진행해야한다. 바로 환경변수라는 놈인데 이 환경변수를 정해놓지 않으면 패키지를 아무리 잘 설치해도 어디있는지 못찾는다.</p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/fc24fccf-ae9f-4463-b231-8b61565023e0/image.png" alt=""></p>
<p>윈도우에 <code>시스템</code>만 검색해도 환경변수 설정이 나온다. <del>이거때문에도 개고생을 많이 했지 ..</del> path에 만들어둔 경로를 반영해주면 아무 무리없이 실행시킬 수 있다. 내 경로는 </p>
<p><img src="https://velog.velcdn.com/images/wise_head/post/0766ff32-c51b-412e-a3fa-d8f5129241af/image.png" alt=""></p>
<p>여기이므로 이 다음에 <code>\.venv</code> 를 붙여서 입력해주면 완성이다! 이제 무리없이 활용할 수 있겠다. 다음에는 git을 활용해 실습한거랑 EDA프로젝트 진행한것을 작성해 둬야 겠다.</p>
<p>후일담으로 사용하다보니 환경변수가 없는데도 잘 실행되는 폴더가 있다. 환경 변수의 탓이 아니라 다른 옵션이 있는것일 수도 있을것 같다. 이 부분은 더 조사해 봐야겠다.</p>
]]></description>
        </item>
    </channel>
</rss>