<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sparks_fly22.log</title>
        <link>https://velog.io/</link>
        <description>studying computer vision &amp; NLP</description>
        <lastBuildDate>Tue, 28 Feb 2023 08:51:45 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>sparks_fly22.log</title>
            <url>https://velog.velcdn.com/images/sparks_fly22/profile/12ba6138-cfe7-447e-a1ef-e0cf3abeab5c/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. sparks_fly22.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sparks_fly22" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[핸즈온 머신러닝] ML 4장]]></title>
            <link>https://velog.io/@sparks_fly22/%ED%95%B8%EC%A6%88%EC%98%A8-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-ML-4%EC%9E%A5</link>
            <guid>https://velog.io/@sparks_fly22/%ED%95%B8%EC%A6%88%EC%98%A8-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-ML-4%EC%9E%A5</guid>
            <pubDate>Tue, 28 Feb 2023 08:51:45 GMT</pubDate>
            <description><![CDATA[<h2 id="모델-훈련">모델 훈련</h2>
<p>이 장에서는 가장 간단한 모델 중 하나인 &#39;선형 회귀&#39;를 살펴보게 된다. 이 모델을 훈련시키는 두 가지 방법을 설명하겠다. </p>
<ul>
<li>계산 공식을 통해 훈련 세트에 맞는 모델 파라미터를 해석적으로 구한다.</li>
<li>최적화 방식인 &#39;경사 하강법&#39;을 통해 모델 파라미터를 조금씩 바꾸면서 Loss function을 훈련 세트에 대해 최소화시킨다.</li>
</ul>
<p>그 다음, 비선형 데이터셋에 훈련시킬 수 있는 &#39;다항 회귀&#39;에 대해서도 살펴보고, 분류 작업에 사용하는 &#39;로지스틱 회귀&#39;와 &#39;Softmax 회귀&#39;도 살펴보겠다. </p>
<h3 id="linear-regression">Linear Regression</h3>
<p>선형 회귀 모델은 다음과 같은 식으로 나타낼 수 있다. 
<del>그림</del></p>
<p>이어서 선형 회귀 모델을 훈련시켜보자. 모델을 훈련시킨다는 것은 훈련세트에 맞도록 모델 파라미터를 설정하는 것이다. 이를 위해선 먼저 모델이 훈련 데이터에 얼마나 잘 들어맞는지 측정해야하는데, 이때 측정 지표로 RMSE(평균 제곱근 오차)가 있다. 회귀에 가장 널리 사용되는 성능 측정 지표인데, 이 RMSE를 최소화하는 ɵ를 찾아야 한다. 
(실제로는 RMSE보다는 MSE(평균 제곱 오차)를 더 자주 활용한다.)</p>
<p>훈련 세트 X에 대한 선형 회귀 가설 MSE는 다음 식처럼 계산한다.
<del>그림</del></p>
<h4 id="🔶ɵ-값을-찾기-위한-정규방정식-해석적인-방법">🔶ɵ 값을 찾기 위한 정규방정식 (해석적인 방법)</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[핸즈온 머신러닝] ML 3장]]></title>
            <link>https://velog.io/@sparks_fly22/%ED%95%B8%EC%A6%88%EC%98%A8-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-ML-3%EC%9E%A5</link>
            <guid>https://velog.io/@sparks_fly22/%ED%95%B8%EC%A6%88%EC%98%A8-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-ML-3%EC%9E%A5</guid>
            <pubDate>Tue, 24 Jan 2023 00:46:25 GMT</pubDate>
            <description><![CDATA[<p>가장 일반적인 지도학습 task 중에는 회귀(값 예측)와 분류(클래스 예측)가 있다. 이번 장에서는 분류 시스템을 집중적으로 다루겠다.</p>
<h3 id="binary-classifier-예시">Binary Classifier 예시</h3>
<p>사이킷런의 SGDClassifier 클래스를 사용해서 SGD(Stochastic Gradient Descent) 분류기로 시작해보자. (이 분류기는 매우 큰 데이터셋을 효율적으로 처리할 수 있는 장점을 지님.)</p>
<h4 id="🔹모델-성능-평가">🔹모델 성능 평가</h4>
<p>1) 교차 검증 --&gt; 정확도 측정</p>
<ul>
<li>어떤 클래스가 다른 것보다 월등히 많은 경우와 같이 &#39;불균형한 데이터셋&#39;을 다룰 때 정확도는 평가 지표로 지양된다.</li>
</ul>
<p>2) 오차 행렬 (Confusion Matrix)</p>
<ul>
<li>클래스 A의 샘플이 클래스 B로 잘못 분류된 횟수 세기</li>
<li>정밀도_Precision (재현율_Recall 과 같이 사용하는 것이 일반적)
<img src="https://velog.velcdn.com/images/sparks_fly22/post/1a1deca1-8780-4418-b8a4-50ecaa8dc0a7/image.png" alt="">
<img src="https://velog.velcdn.com/images/sparks_fly22/post/7d0884e3-59f1-48ea-83c4-742eddaf363b/image.png" alt=""></li>
<li>상황에 따라서 정밀도와 재현율의 각 중요도가 달라질 수 있다.</li>
<li>정밀도/재현율 Tradeoff 발생</li>
<li>아래 그림에서 재현율(Recall) 0.3 지점에서 정밀도가 급격하게 줄어들기 시작한다. 이 하강점 직전을 정밀도/재현율 Tradeoff로 선택하는 것이 좋다. 
<img src="https://velog.velcdn.com/images/sparks_fly22/post/0e0d8eea-d177-448a-8600-c2179c3bccbc/image.png" alt=""></li>
</ul>
<h4 id="🔹roc-곡선-receiver-operating-characteristic">🔹ROC 곡선 (Receiver Operating Characteristic)</h4>
<ul>
<li><p>False positive rate(FPR)에 대한 True positive rate(TPR)의 곡선</p>
</li>
<li><p>재현율(민감도)에 대한 (1 - 특이도) 그래프<img src="https://velog.velcdn.com/images/sparks_fly22/post/2225c435-a017-4c1d-8491-e0f8b8f63fdc/image.png" alt=""></p>
<ul>
<li>재현율(TPR)이 높을수록 분류기가 만드는 거짓 양성(FPR)이 증가.</li>
<li>곡선 아래 면적(AUC)을 측정하면 분류기를 비교할 수 있다. (완벽한 분류기=1, 완전 랜덤 분류기=0.5)</li>
</ul>
</li>
</ul>
<h3 id="다중-분류-multiclass-classifier">다중 분류 (Multiclass classifier)</h3>
<p>: 둘 이상의 클래스를 직접 처리할 수 있는 알고리즘도 있지만, 이진 분류만 가능한 알고리즘의 경우, 이진 분류기를 여러 개 사용해 다중 클래스를 분류하는 기법도 많다. (OvR 전략(one-versus-the rest), OvO 전략(one-versus-one))</p>
<p><strong>OvR 전략</strong> : ex) 특정 숫자 하나만 구분하는 숫자별 이진 분류기 10개를 훈련시켜서, 클래스가 10개인 숫자 이미지 분류 시스템을 만들 수 있다. 이미지 분류 시, 각 분류기의 결정 점수 중 가장 높은 것을 클래스로 선택.</p>
<p><strong>OvO 전략</strong>: ex) 0과 1, 0과 2, 1과 2 구별 등과 같이 각 숫자의 조합마다 이진 분류기를 훈련시키는 것. --- 클래스가 N개 라면, 분류기는 N*(N-1)/2 개가 필요하다. [이 전략의 주요 장점: 각 분류기 훈련에 전체 훈련 세트 중 구별하고자 하는 두 클래스에 해당하는 샘플만 필요로 함.]</p>
<p>대부분의 이진 분류 알고리즘에서는 OvR을 선호하지만, SVM 같은 일부 알고리즘은 훈련 세트의 크기에 민감해서 작은 훈련 세트에서 많은 분류기를 훈련시키는 쪽이 빠르므로 OvO를 선호한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[핸즈온 머신러닝] DL 11장]]></title>
            <link>https://velog.io/@sparks_fly22/%ED%95%B8%EC%A6%88%EC%98%A8-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-DL-11%EC%9E%A5</link>
            <guid>https://velog.io/@sparks_fly22/%ED%95%B8%EC%A6%88%EC%98%A8-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-DL-11%EC%9E%A5</guid>
            <pubDate>Fri, 06 Jan 2023 01:51:16 GMT</pubDate>
            <description><![CDATA[<h4 id="10장-recap">10장 RECAP</h4>
<p>역전파 알고리즘은 출력층에서 입력층으로 오차 gradient를 전파하면서 진행된다. 알고리즘이 신경망의 모든 파라미터에 대한 오차 함수의 gradient를 계산하면, 경사 하강법 단계에서 이 gradient를 사용해서 각 파라미터를 수정한다. </p>
<h4 id="11장에서는">11장에서는...</h4>
<p>심층 신경망 훈련에서 발생할 수 있는 문제</p>
<ul>
<li>gradient 소실/폭주</li>
<li>훈련데이터 불충분, 라벨링 작업의 높은 비용</li>
<li>훈련데이터에 과적합되는 문제</li>
</ul>
<h2 id="gradient-소실--폭주">Gradient 소실 / 폭주</h2>
<p><strong>Vanishing Gradient</strong>: 알고리즘이 하위층으로 진행될수록 gradient가 점차 감소한다. 경사하강법이 하위층의 연결 가중치를 변경되지 않은 채로 둔다면 훈련이 제대로 이뤄지지 않게 된다.
<strong>Exploding Gradient</strong>: gradient가 점차 커져서 여러 층이 비정상적으로 큰 가중치로 갱신되게 되고, 알고리즘은 발산(diverse)한다. </p>
<p>❔발생 원인</p>
<ul>
<li>logistic sigmoid 활성화 함수</li>
<li>가중치 초기화 방식 (평균: 0, 표준편차: 1 인 정규분포)
<img src="https://velog.velcdn.com/images/sparks_fly22/post/39e5bd46-1bcb-49d4-aa76-0927c4620a1f/image.png" alt=""> (0이나 1로 수렴할 때 기울기가 0에 수렴함. 이 때문에 역전파될 때 신경망으로 전파할 gradient가 거의 없어진다. 따라서, 실제로 하위층에는 아무것도 도달하지 않게 된다.)</li>
</ul>
<h3 id="glorot-초기화--he-초기화">Glorot 초기화 &amp; He 초기화</h3>
<p>글로럿과 벤지오는 논문을 통해 불안정한 gradient 문제를 완화할 방법이 제안했다.</p>
<p>예측을 할 때는 정방향으로, 역전파할 때는 그레이디언트를 역방향으로 하여 양방향 신호가 적절하게 흘러야 한다. 논문에 따르면, 각 층의 출력에 대한 분산이 입력에 대한 분산과 같아야 하며, 역방향에서 층을 통과하기 전과 후의 그레이디언트 분산이 동일해야 한다. </p>
<p>층의 입력과 출력 연결 개수(각각 fan-in, fan-out이라고 부름)가 같지 않으면 위의 2가지를 보장할 수 없다. 하지만 논문 저자들은 실전에서 매우 잘 작동한다고 입증된 대안을 제안했는데, 각 층의 연결 가중치를 아래와 같이 무작위로 초기화하는 것이다. 이러한 초기화 전략을 <strong>글로럿 초기화</strong>라고 한다.
<img src="https://velog.velcdn.com/images/sparks_fly22/post/4d26378f-90f8-47c1-8128-22ce794e36bf/image.png" alt="">
글로럿 초기화를 사용하면 훈련 속도를 상당히 높일 수 있다.</p>
<p>세이비어 초기화는 S자 형태의 활성화 함수(시그모이드, 하이퍼볼릭탄젠트 등)와 함께 사용할 경우 좋은 성능을 보이지만, ReLU와 함께 사용할 때는 좋지 않다. ReLU는 아래에서 이야기할 He 초기화와 함께 사용하는 것이 좋다.</p>
<p>일부 논문들이 다른 활성화 함수에 대해 비슷한 전략을 제안했다. ReLU 활성화 함수에 대한 초기화 전략은 He 초기화, SELU 활성화 함수에 대한 초기화는 르쿤(LuCun) 초기화를 사용한다.</p>
<p>각 초기화 전략의 활성화 함수 및 정규분포는 아래 표와 같다.
<img src="https://velog.velcdn.com/images/sparks_fly22/post/03b26c34-24c5-4436-bf35-8d9b132f6a55/image.png" alt=""></p>
<h3 id="수렴하지-않는-활성화-함수">수렴하지 않는 활성화 함수</h3>
<p>이전에는 시그모이드 활성화 함수가 최선의 선택이라 여겨졌지만, 기울기 소실이 발생할 수 있다는 단점 때문에 다른 활성화 함수가 심층 신경망에서 훨씬 더 잘 작동한다는 사실이 밝혀졌다. </p>
<p>✅ ReLU 함수: 특정 양숫값에 수렴하지 않고 계산이 빠르다는 큰 장점이 있으나, <strong>죽은 ReLU(dying ReLU) 문제</strong>를 갖고 있다. 훈련하는 동안 일부 뉴런이 0 이외의 값을 출력하지 않는 것이다. 뉴런의 가중치가 바뀌면서 훈련 세트에 있는 모든 샘플에 대해 입력의 가중치 합이 음수가 되면 ReLU 함수의 그레이디언트가 0이 되어 경사 하강법이 더는 작동하지 않는다.</p>
<p>👉 LeakyReLU 사용
: 하이퍼파라미터 ɑ가 z&lt;0일 때의 기울기를 결정하며 이 값을 작게 하는 것이 성능이 더 좋게 나타난다.
(ɑ가 새는 정도를 결정한다.)</p>
<p>✅ RReLU: 훈련 시 주어진 범위에서 ɑ의 값을 랜덤으로 선택, 테스트 시 평균을 사용.</p>
<p>✅ PReLU: ɑ가 훈련되는 동안 학습됨. 대규모 데이터셋에서는 좋은 성능을 보이나 소규모 데이터셋에서는 훈련 세트에 과대적합될 위험 존재.</p>
<p>✅ ELU 활성화 함수</p>
<ul>
<li>다른 ReLU 함수들의 성능을 앞지르지만, 계산이 느린 단점이 있다.</li>
<li>하이퍼파라미터 a는 z&lt;0일 때 ELU가 수렴할 값을 정의한다.</li>
<li>z&lt;0일 때 활성화 함수의 평균 출력이 0에 더 가까워져 그레이디언트 소실 문제를 완화해준다.</li>
<li>ɑ=1이면 z=0에서 급격한 변화가 일어나지 않으므로 경사 하강법의 속도가 빨라진다.
<img src="https://velog.velcdn.com/images/sparks_fly22/post/e101fab0-c3a5-4590-aee3-2bf470218228/image.png" alt=""></li>
</ul>
<h3 id="batch-normalization">Batch Normalization</h3>
<p>ELU와 함께 He 초기화를 사용하면 훈련 초기 단계에서 gradient 소실/폭주 문제를 감소시킬 수 있지만, 훈련 중 다시 발생하지 않으리란 보장은 없다. </p>
<p>이런 문제를 해결하기 위해 제안된 것이 <strong>배치 정규화(BN)기법</strong>이다. 이 기법은 각 층에서 활성화 함수를 통과하기 전이나 후에 모델에 연산을 하나 추가한다. 이 연산은 입력을 원점에 맞추고 정규화한 다음, 각 층에서 2개의 새로운 파라미터로 output의 스케일을 조정하고 이동시킨다. 
<img src="https://velog.velcdn.com/images/sparks_fly22/post/76afb044-724a-4014-a53a-38ce951515bf/image.png" alt=""></p>
<p>위와 같이, BN 기법은 학습 과정에서 계층 별로 데이터 분포가 달라지더라도, 각 배치별로 평균과 분산을 이용해서 정규화할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/sparks_fly22/post/216e3d94-9841-4273-897a-fcdcbb851984/image.png" alt=""></p>
<p>❗ 배치 정규화는 <strong>학습단계 / 추론단계</strong> 각각 조금씩 다르게 적용돼야 한다.</p>
<ul>
<li>학습 단계의 BN을 구하기 위하여 사용된 평균과 분산을 구할 때에는, <strong>배치별로 계산</strong>되어야 한다. 각 배치들이 표준 정규 분포를 각각 따르게 하기 위해서다.</li>
<li>추론 과정에서는 BN에 적용할 평균과 분산에 <strong>고정값</strong>을 사용합니다.
이 때 사용할 고정된 평균과 분산은 학습 과정에서 이동 평균(moving average) 또는 지수 평균(exponential average)을 통하여 계산한 값이다. 즉, 학습 하였을 때의 최근 N 개에 대한 평균 값을 고정값으로 사용하는 것이다.</li>
</ul>
<p><em>batch는 gradient를 구하는 단위</em></p>
<h3 id="gradient-clipping">Gradient Clipping</h3>
<p>그레이디언트 폭주 문제를 완화하는 다른 방법으로, 역전파될 때 일정 임곗값을 넘어서지 못하게 그레이디언트를 잘라낸다.</p>
<h2 id="사전훈련된-층-재사용하기">사전훈련된 층 재사용하기</h2>
<p>훈련데이터 부족할 때, 라벨링 작업의 cost가 높은 경우에 대해 해결방안이 될 수 있는 전이학습에 대해 알아보자.</p>
<p>해결하려는 문제와 비슷한 유형을 처리한 신경망이 있는지 보고, 있다면 그 신경망의 하위층을 재사용하는 것이 처음부터 새로 훈련하는 것보다 훨씬 효율적이다. 이런 방식을 <strong>Transfer learning</strong>(전이 학습)이라고 한다.</p>
<p>훈련 속도를 높일 뿐만 아니라 필요한 훈련 데이터의 양도 줄여준다.</p>
<p>전이 학습 시 원본 모델의 출력층은 새로운 작업에서 가장 유용하지 않은 층이므로 바꿔주어야 한다. 그리고 이와 비슷하게 원본 모델의 상위 은닉층은 하위 은닉층보다 덜 유용하다. 따라서 재사용할 층의 개수를 잘 선정해야한다.</p>
<p>가중치가 바뀌지 않도록 재사용하는 층을 모두 동결한다. 그 다음 모델을 훈련하고 성능을 평가한다.
<img src="https://velog.velcdn.com/images/sparks_fly22/post/e2d025ec-9517-49a9-8c30-8a84826aa638/image.png" alt=""></p>
<h2 id="고속-optimizer">고속 Optimizer</h2>
<p>✅ <strong>모멘텀 최적화</strong></p>
<p>표준적인 경사 하강법은 경사면을 따라서 &#39;일정한 크기의&#39; 스텝으로 조금씩 내려가기 때문에, 최적점에(가장 아래에 있는 지점) 도착하기까지 시간이 비교적 오래 걸린다. 더불어, 이전 gradient가 얼마였는지 고려하지 않아서 gradient가 locally 작으면 매우 느려진다. </p>
<p>반면에, 모멘텀 최적화는 이전 gradient가 얼마였는지를 상당히 중시한다. 아래 식과 같이 매 반복에서 현재 gradient를 모멘텀 벡터에 더하고 이 값을 빼는 방식으로 가중치를 갱신한다. 즉, gradient를 속도가 아닌 &#39;가속도&#39;로 사용한다. 모멘텀 최적화는 골짜기를 따라 최적점에 도달할 때까지 점점 더 빠르게 내려가게 된다. 
배치 정규화를 사용하지 않는 심층 신경망에서 상위층은 종종 스케일이 각기 다른 input을 받게 되는데, 모멘텀 최적화는 이런 경우에 큰 도움을 줄 수 있다. 또한 local optima를 건너뛰고 global optima로 도달할 수 있게끔 도움을 준다. </p>
<p><img src="https://velog.velcdn.com/images/sparks_fly22/post/db2bf1c2-25e3-4989-bcc6-c6e72fefa532/image.png" alt="">
<img src="https://velog.velcdn.com/images/sparks_fly22/post/b7a8a407-5d7b-448c-b610-4d9f5b431901/image.png" alt=""></p>
<p>✅ <strong>네스테로프 가속 경사</strong></p>
<p>모멘텀 최적화를 변형한 형태로, 기본 모멘텀 최적화보다 거의 항상 더 빠르다. 네스테로프 가속 경사 기법은 현재 위치가 θ가 아니라, 모멘텀의 방향으로 조금 앞선 θ+βm에서 비용 함수의 gradient를 계산한다. 
(원래 위치에서의 그레이디언트를 사용하는 것보다 그 방향으로 조금 더 나아가서 측정한 그레이디언트를 사용하는 것이 더 정확하다.)
<img src="https://velog.velcdn.com/images/sparks_fly22/post/cf549aac-869d-41e5-9e67-46b54e7909fb/image.png" alt=""></p>
<p>✅ <strong>AdaGrad</strong></p>
<p>경사 하강법은 global optima 방향으로 곧장 향하지 않고, 가장 가파른 경사를 따라 빠르게 내려가기 시작해서 골짜기 아래로 느리게 이동한다. </p>
<p><strong>AdaGrad 알고리즘</strong>은 가장 가파른 차원을 따라 그레이디언트 벡터의 스케일을 감소시킨다. 이를 통해 좀 더 일찍 정확한 방향을 잡아 global optima쪽으로 향할 수 있다.
<img src="https://velog.velcdn.com/images/sparks_fly22/post/f869b06c-7b81-4272-bf7d-7636a1034fab/image.png" alt=""></p>
<ol>
<li>gradient 제곱을 벡터 s에 누적한다. </li>
<li>경사 하강법과 거의 유사하지만, graidnet 벡터를 (s+ɛ)^(1/2)로 나누어 스케일을 조정한다. </li>
</ol>
<p>이 알고리즘은 학습률을 감소시키지만, 경사가 완만한 차원보다 가파른 차원에 대해 빠르게 감소된다. (이를 &#39;adaptive learning rate&#39;라 한다.) 이로써 global optima 방향으로 비교적 곧바로 가도록 갱신되는 데 도움을 준다. </p>
<p>그러나, 이 알고리즘은 간단한 2차 방정식 문제에 대해선 잘 작동하지만, 신경망을 훈련할 때 학습률이 너무나도 감소해서 global optima에 도착하기 전에 알고리즘이 <strong>완전히 멈추는</strong> 문제점이 있다. 따라서 심층 신경망에는 되도록 사용하지 않는 것이 좋다. 그러나 다른 adaptive learning rate optimizer를 이해하는 데 도움을 줌으로 잘 알아두도록 하자.</p>
<p>✅** RMSProp**(Root Mean Square Propagation)</p>
<p>RMSProp 알고리즘은 가장 최근 epoch에서 비롯된 gradient만을 누적함으로써 AdaGrad의 문제점을 해결했다. 
<img src="https://velog.velcdn.com/images/sparks_fly22/post/e55b6834-bd92-4081-bb21-d2c00cce1d20/image.png" alt=""></p>
<ol>
<li>지수 감소를 사용한다. 감쇠율 β라는 하이퍼파라미터가 하나 더 생겼다. (β를 튜닝할 필요까진 없음)</li>
<li>adagrad와 동일하다.</li>
</ol>
<p>✅** Adam과 Nadam 최적화**</p>
<p>Adam(Adaptive moment estimation): 모멘텀 최적화 + RMSProp
👉 지난 gradient의 지수 감소 평균 &amp; 지난 gradient 제곱의 지수 감소된 평균을 따른다.
<img src="https://velog.velcdn.com/images/sparks_fly22/post/84c50073-6dad-4220-9982-9db6e76b203a/image.png" alt="">
전체적으로 모멘텀 최적화와 RMSProp과 아주 비슷하다.
m과 s가 0으로 초기화되기 때문에 훈련 초기에 0쪽으로 치우치게 되어 반복 초기에 크게 기여 하지는 못한다. 따라서 단계 3,4에서 반복 초기에 m과 s를 증폭시켜주지만, 반복이 많이 진행되면 단계 3,4의 분모가 1에 가까워져서 m,s는 거의 증폭되지 않게 된다.</p>
<p>Adam의 변종 ➡️ AdaMax, Nadam</p>
<p>✅ AdaMax</p>
<p>Adam기법의 일종으로써 무한 노름(infinity norm)을 기반으로 한다. 그렇기 때문에 embedding같이 벡터화 기법을 사용하는 모델을 활용할 때 Adam보다 더 높은 성능을 낼 수도 있다. 기본적으로 아래 3가지 파라미터를 초기화 시켜주어야 한다.</p>
<ul>
<li>m = 0, 첫 번째 moment 벡터 초기화</li>
<li>v = 0, 지수 가중화(exponentially weighted)되는 무한 노름의 초기화</li>
<li>t = 0, timestep 초기화</li>
</ul>
<p>Adam과의 차이점이라면, Adamax는 순방향(forward pass)에서 사용된 해당 변수 부분의 m_t, v_t 값과 slices 만을 업데이트한다. 이는 특정 변수의 slice가 실제로 사용되었을 경우를 제외하고는 momentum을 무시하는 구조라고 할 수 있다.</p>
<p>✅ Nadam</p>
<p>Adam Optimizer에 네스테로프 기법을 더한 것이다. 때때로 Adam보다 조금 더 빠르게 수렴하는 경우도 있다. </p>
<p><img src="https://velog.velcdn.com/images/sparks_fly22/post/adf4879a-36cb-48b8-a980-29537b075869/image.png" alt=""></p>
<p>지금까지 살펴본 모든 최적화 기법은 1차 편미분(Jacobian)에만 의존한다. 최적화 이론에는 2차 편미분(Hessian)을 기반으로 한 알고리즘도 있지만, 이는 심층 신경망에 적용하기가 어려운 상황이다. </p>
<h3 id="학습률-스케쥴링">학습률 스케쥴링</h3>
<p><img src="https://velog.velcdn.com/images/sparks_fly22/post/350cd248-0f7c-4e11-b0b3-df617fa27ebe/image.png" alt=""></p>
<p>학습률은 모델 훈련에 중요한 영향을 미치는 요소다. 일정한 학습률로 모델을 훈련하는 방법도 있지만, 훈련하는 동안 학습률을 감소시키는 전략도 존재한다. 이런 전략을 <strong>학습 스케줄(learning schedule)</strong>이라고 한다.</p>
<p>학습 스케쥴 전략</p>
<ul>
<li>거듭제곱 기반 스케줄링</li>
<li>지수 기반 스케줄링</li>
<li>구간별 고정 스케줄링</li>
<li>성능 기반 스케줄링</li>
<li>1사이클 스케줄링</li>
</ul>
<h2 id="regularization를-사용해-overfitting-피하기">Regularization를 사용해 overfitting 피하기</h2>
<p>10장에서 이미 언급된 &#39;조기 종료&#39;나 &#39;배치 정규화&#39; 도 규제 방법으로 사용할 수 있다. 이 밖에 신경망에서 널리 사용되는 다른 규제 방법에 대해서도 알아보자.
(L1 &amp; L2 규제, dropout, max-norm 규제)</p>
<p>** Regularization: 가중치 w가 작아지도록 학습시킴 -&gt; local noise에 영향을 덜 받도록 하기 위함</p>
<p>✅ L1 &amp; L2 Regularization</p>
<p><img src="https://velog.velcdn.com/images/sparks_fly22/post/ce9c6a12-d406-457d-a407-b5fb20ee6c48/image.png" alt="">
cost function에 가중치의 절댓값을 더해주는 것이 핵심이다. 기존의 cost function에 가중치의 크기가 포함되면서, 가중치가 너무 크지 않은 방향으로 학습되도록 한다. 이때 learning rate 람다 값이 0에 가까울수록 정규화의 효과가 줄어든다.</p>
<p><img src="https://velog.velcdn.com/images/sparks_fly22/post/8736de37-0013-4309-b611-2a7efd69ac9a/image.png" alt="">
cost function에 가중치의 제곱을 더함으로써 L1 규제와 마찬가지로 가중치가 너무 크지 않은 방향으로 학습된다. 이를 weight decay라고 한다.</p>
<p>✅ Dropout</p>
<p>신경망의 크기가 커질 경우 overfitting 문제를 피하기 위한 방법</p>
<p>dropout은 아래 그림 (a)에 대한 학습을 할 때, 신경망에 있는 모든 layer에 대해서 학습을 수행하는 것이 아니라, (b)와 같이 신경망에 있는 입력층이나 은닉층의 일부 뉴런을 생략(dropout)하고, &#39;줄어든 신경망&#39;을 통해 학습을 수행한다.</p>
<p>일정한 mini-batch 구간 동안 생략된 망에 대한 학습이 끝나면, 다시 무작위로 다른 뉴런들을 생략하면서 반복적으로 학습을 수행한다.</p>
<p><img src="https://velog.velcdn.com/images/sparks_fly22/post/fbb6ad49-16c1-4232-9af7-2c83913d43e7/image.png" alt=""></p>
<p>매 훈련 스텝에서 각 뉴런(입력 뉴런은 포함, 출력 뉴런은 제외)은 임시적으로 드롭아웃될 확률 $p$를 가진다. 하이퍼파라미터 $p$를 드롭아웃 비율이라고 하고 보통 10%와 50% 사이를 지정한다.</p>
<p>드롭아웃으로 훈련된 뉴런은 이웃한 뉴런에 맞춰 적응될 수 없으므로 가능한 한 자기 자신이 유용해져야 한다. 또 이런 뉴런들은 몇 개의 입력 뉴런에만 지나치게 의존할 수 없다. 모든 입력 뉴런에 주의를 기울여야 하기 때문에 입력값의 작은 변화에 덜 민감해진다. 결국 더 안정적인 네트워크가 되어 일반화 성능이 좋아진다고 할 수 있다.</p>
<p>✅ max-norm 규제</p>
<p>맥스-노름 규제는 각각의 뉴런에 대해 입력의 연결 가중치 $w$가 ${\parallel w\parallel}_2 \le r$이 되도록 제한한다($r$은 맥스-노름 하이퍼파라미터).</p>
<p>맥스-노름 규제는 전체 손실 함수에 규제 손실 항을 추가하지 않는다. 대신 일반적으로 매 훈련 스텝이 끝나고 ${\parallel w \parallel}_2$를 계산하고 필요하면 $w$의 스케일을 조정한다($w &lt; w {r \over {\parallel w \parallel}_2}$). $r$을 줄이면 규제의 양이 증가하여 과대적합을 감소시키는 데 도움이 된다. 맥스-노름 규제는 (배치 정규화를 사용하지 않았을 때) 불안정한 그레이디언트 문제를 완화하는 데 도움을 줄 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GIN란? (Graph Isomorphism Networks)]]></title>
            <link>https://velog.io/@sparks_fly22/GIN%EB%9E%80-Graph-Isomorphism-Networks</link>
            <guid>https://velog.io/@sparks_fly22/GIN%EB%9E%80-Graph-Isomorphism-Networks</guid>
            <pubDate>Wed, 04 Jan 2023 05:52:57 GMT</pubDate>
            <description><![CDATA[<p><a href="https://towardsdatascience.com/how-to-design-the-most-powerful-graph-neural-network-3d18b07a6e66">본 사이트</a>를 참고하여 정리한 내용입니다.</p>
<h1 id="how-to-design-the-most-powerful-gnn">How to design the most powerful GNN</h1>
<p>GNN의 가장 대표적인 활용 사례: graph 분류 작업
ex) 각 원자에 해당하는 graph와 feature를 기반으로, 전체 분자의 behavior 예측</p>
<blockquote>
<p>그러나, GNN은 오직 node embeddings만을 학습한다. 
❔ 어떻게 하면 node embeddings를 결합하여 노드단위가 아닌 &#39;전체 graph embedding&#39;을 만들어낼 수 있을까?</p>
</blockquote>
<p>이 포스트의 주요 내용을 미리 정리하자면 다음과 같다.</p>
<ol>
<li><strong>global pooling</strong> 이라는 새로운 종류의 layer.
 (node embeddings를 결합하기 위함)</li>
<li><strong>GIN</strong> 이라는 새로운 아키텍쳐 소개
 (GCN과 GraphSAGE와 비교)</li>
</ol>
<h3 id="🔹-protein-datasets">🔹 Protein datasets</h3>
<ul>
<li>enzyme인지 아닌지 분류하기</li>
<li>이 데이터셋은 이미 graph 형태로 인코딩되어 있음
(GraphSAGE에서처럼) 바로 GNN에 데이터를 적용하는 것이 아니라 훈련속도를 가속화해줄 mini-batching이 필요하다. 
우리는 GIN이라는 아키텍쳐를 사용할 것이다. </li>
</ul>
<h3 id="🔹-gin">🔹 GIN</h3>
<p>목적: GNN의 discriminative(=representational) power 극대화</p>
<p>Weisfeiler-Lehman test를 사용해서 GNN의 power를 특성화할 수 있다.</p>
<ul>
<li>Isomorphic graphs는 두 그래프가 동일한 구조를 갖고 있을 때를 의미한다. <em>(identical connections but a permutation of nodes)</em></li>
<li>WL test는 두 그래프가 non-isomorphic인지만 알려줄 수 있다. <em>(반대로 isomorphic한지는 보장하지 못한다.)</em>
<img src="https://velog.velcdn.com/images/sparks_fly22/post/d99fcbd8-d303-42ce-8ab9-ace8bb15bfa5/image.png" alt="">
위 두 그래프는 isomorphic하다. correspondence를 표현하기 위해 노드별로 숫자, 색깔 표시해둔 것. 그러나, 이런 표시가 없다면? -&gt; challenging problem </li>
</ul>
<h3 id="🔹-wl-test와-gnn은-무슨-연관을-갖고-있나">🔹 WL test와 GNN은 무슨 연관을 갖고 있나</h3>
<p>비슷한 양상을 띤다. </p>
<ol>
<li>모든 node가 같은 label로 시작한다.</li>
<li>Labels from neighboring nodes are aggregated and** hashed** to produce a new label.</li>
<li>앞 두 과정들 반복, until the labels stop changing.
이러한 WL test에 영감 받아 new aggregator를 디자인하게 되었다.</li>
</ol>
<h3 id="🔹-one-aggregator-to-rule-them-all">🔹 One aggregator to rule them all</h3>
<p>이 새로운 aggregator는 non-isomorphic graph를 다룰 때 서로 다른 node embeddings를 만들어내야 한다.
👉 2개의 injective 함수를 사용하며, MLP를 통해 학습할 수 있다.</p>
<ul>
<li>With GINs, we learn the approximation of 2 injective functions. (universal approximation theorum에 따라)</li>
</ul>
<p>특정 노드 i의 hidden vector를 GIN으로 계산하는 식은 다음과 같다.
<img src="https://velog.velcdn.com/images/sparks_fly22/post/5ed27bf8-5d54-4b07-800a-7e8ae1506c33/image.png" alt="">
위 식에서 &#39;입실론&#39;은 target node의 중요도를 (compared to its neighbors) 결정한다. <em>epsilon can be a learnable parameter or a fixed scalar.</em></p>
<h3 id="🔹-global-pooling-graph-level-readout">🔹 Global Pooling (graph-level readout)</h3>
<p>: GNN으로 계산된 node embeddings를 이용해서 graph embedding을 만들어내는 것</p>
<p>simple ways to obtain a graph embeddings
<img src="https://velog.velcdn.com/images/sparks_fly22/post/25fd8b3e-7b8c-4773-bdc5-3eccc5ff8ea6/image.png" alt=""></p>
<ul>
<li>모든 structural information을 고려하려면 <strong>이전 layer의 임베딩</strong>을 잘 보존해야 한다.</li>
<li>sum operator가 mean, max operator보다 <strong>more expressive</strong></li>
</ul>
<p>위와 같은 분석 결과로 아래와 같은 global pooling 식이 완성되었다. 
<img src="https://velog.velcdn.com/images/sparks_fly22/post/227d999a-cbca-486c-87ca-2dbed433acd5/image.png" alt=""></p>
<p>각 층마다 노드 임베딩은 합산되고 그 결과들이 concatenate(모든 결과 결합)된다. 이를 통해 sum operator의 expressiveness와, concatenation 이전의 iterations의 정보들(writer는 memory라 표현함)을 결합시킬 수 있다. </p>
<h3 id="🔹-gin-in-pytorch-geometric">🔹 GIN in Pytorch Geometric</h3>
<ul>
<li>GINConv (ɛ is entirely removed by default)</li>
<li>GINEConv (neighbors&#39; features에 ReLU 함수 적용)</li>
</ul>
<p><strong>GIN layer에 MLP 적용</strong>
<img src="https://velog.velcdn.com/images/sparks_fly22/post/c2c0402a-fc7d-42bd-8f0a-026850fe8394/image.png" alt=""></p>
<p><strong>그렇다면 GIN의 architecture는</strong>
<img src="https://velog.velcdn.com/images/sparks_fly22/post/d5a0138d-110d-4286-b9c8-f1c72a40c8d6/image.png" alt=""></p>
<p><em>(images by author)</em></p>
<pre><code>class GIN(torch.nn.Module):
    &quot;&quot;&quot;GIN&quot;&quot;&quot;
    def __init__(self, dim_h):
        super(GIN, self).__init__()
        self.conv1 = GINConv(
            Sequential(Linear(dataset.num_node_features, dim_h),
                       BatchNorm1d(dim_h), ReLU(),
                       Linear(dim_h, dim_h), ReLU()))
        self.conv2 = GINConv(
            Sequential(Linear(dim_h, dim_h), BatchNorm1d(dim_h), ReLU(),
                       Linear(dim_h, dim_h), ReLU()))
        self.conv3 = GINConv(
            Sequential(Linear(dim_h, dim_h), BatchNorm1d(dim_h), ReLU(),
                       Linear(dim_h, dim_h), ReLU()))
        self.lin1 = Linear(dim_h*3, dim_h*3)
        self.lin2 = Linear(dim_h*3, dataset.num_classes)

    def forward(self, x, edge_index, batch):
        # Node embeddings 
        h1 = self.conv1(x, edge_index)
        h2 = self.conv2(h1, edge_index)
        h3 = self.conv3(h2, edge_index)

        # Graph-level readout
        h1 = global_add_pool(h1, batch)
        h2 = global_add_pool(h2, batch)
        h3 = global_add_pool(h3, batch)

        # Concatenate graph embeddings
        h = torch.cat((h1, h2, h3), dim=1)

        # Classifier
        h = self.lin1(h)
        h = h.relu()
        h = F.dropout(h, p=0.5, training=self.training)
        h = self.lin2(h)

        return h, F.log_softmax(h, dim=1)

gcn = GCN(dim_h=32)
gin = GIN(dim_h=32)
gcn = train(gcn, train_loader)
gin = train(gin, train_loader)</code></pre><p>위 코드는 실습코드의 일부이며 GIN과 GCN의 결과를 비교해본다.
정확도 면에서 GIN이 GCN을 훨씬 앞선다.</p>
<ul>
<li>GIN에서는 모든 층의 hidden vectors가 결합된다. (마지막 층만을 고려하는 것이 아니라)</li>
<li>sum operator를 사용하는 GIN</li>
</ul>
<blockquote>
<p>Although GINs achieve good performance, especially with social graphs, their theoretical superiority doesn’t always translate well in the real world. It is true with other “provably powerful” architectures, which tend to underperform in practice, such as the 3WLGNN. <em>-Author</em></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[XOR문제와 퍼셉트론]]></title>
            <link>https://velog.io/@sparks_fly22/XOR%EB%AC%B8%EC%A0%9C%EC%99%80-%ED%8D%BC%EC%85%89%ED%8A%B8%EB%A1%A0</link>
            <guid>https://velog.io/@sparks_fly22/XOR%EB%AC%B8%EC%A0%9C%EC%99%80-%ED%8D%BC%EC%85%89%ED%8A%B8%EB%A1%A0</guid>
            <pubDate>Wed, 04 Jan 2023 05:02:52 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>퍼셉트론이 XOR문제를 해결하지 못해서 잠깐 동안 인공지능 분야의 침체기가 찾아왔었지만 MLP(Multi-layer Perceptron)으로 이 문제가 해결되었다.<br><strong>MLP가 구체적으로 어떤 방식으로 XOR문제를 해결했을까?</strong></p>
</blockquote>
<h3 id="xor-문제란">XOR 문제란?</h3>
<p>XOR 게이트는 exclusive OR 게이트의 줄임말로, OR 게이트와 동일하게 작동하지만 입력값이 서로 다르면 1을 출력하고, 같으면 0을 출력한다.
<img src="https://velog.velcdn.com/images/sparks_fly22/post/65dbd927-5499-4557-ad18-90be731acab4/image.png" alt="">
XOR 게이트 문제를 그림으로 나타내면 위와 같다. 선형적으로는 분류할 수 없기에, 곡선 형태나 여러 개의 직선이 필요하다. </p>
<p>이런 문제를 MLP를 통해 해결할 수 있다. 
<img src="https://velog.velcdn.com/images/sparks_fly22/post/2bae4663-76ef-4643-92fb-b7de2bd85c23/image.png" alt="">
(위 경우는 3개의 논리 게이트 NAND, OR, AND 게이트를 조합하면 XOR 문제를 해결했다.)</p>
<p>단층 퍼셉트론과 달리, hidden layer를 하나 이상 갖고 있는 MLP를 통해서 여러 개의 직선으로 XOR 결과를 나눌 수 있다. 
그리고 이러한 MLP는 오차 역전파 방법을 통해 학습된다. <em>(이전 <a href="https://velog.io/@sparks_fly22/%ED%95%B8%EC%A6%88%EC%98%A8-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-DL-Chap.10">포스트</a> 참고)</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[핸즈온 머신러닝] DL 10장]]></title>
            <link>https://velog.io/@sparks_fly22/%ED%95%B8%EC%A6%88%EC%98%A8-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-DL-Chap.10</link>
            <guid>https://velog.io/@sparks_fly22/%ED%95%B8%EC%A6%88%EC%98%A8-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-DL-Chap.10</guid>
            <pubDate>Tue, 03 Jan 2023 08:41:25 GMT</pubDate>
            <description><![CDATA[<p>한 때는 강력한 머신러닝 기술들이 개발되면서 인공 신경망 연구가 침체기에 들어서기도 했었다. 신경망을 훈련시키기 위한 데이터의 양이 늘어나고, 컴퓨터 하드웨어가 크게 발전함에 따라 대규모 신경망을 훈련할 수 있는 여건이 점차 만들어졌다. </p>
<h2 id="biological-neuron--artificial-neuron">Biological Neuron &amp; Artificial Neuron</h2>
<p>생물학적 뉴런은 단순하게 동작하지만, 보통은 수십억 개로 구성된 거대한 네트워크로 조직되며, 이는 보통 다른 뉴런 네트워크 수천 개와도 연결된다. 매컬러와 피츠가 이러한 생물학적 뉴런에서 착안하여 단순한 신경망 모델을 제안했는데, 이것이 인공 뉴런이 된다. 
<img src="https://velog.velcdn.com/images/sparks_fly22/post/6f299c15-fba2-4e2d-b5e2-14b47794a8c6/image.png" alt="https://limjun92.github.io/ai_%EA%B0%9C%EB%85%90/%EB%94%A5%EB%9F%AC%EB%8B%9D/"></p>
<h2 id="perceptron">Perceptron</h2>
<p>Perceptron은 층이 하나뿐인 <strong>TLU</strong>(threshold logic unit)으로 구성된다. 각 TLU는 모든 입력에 연결되어 있다. 한 층에 있는 모든 뉴런이 이전 층의 모든 뉴런과 연결되어 있을 때 이를 &#39;Fully connected layer&#39; 혹은 &#39;dense layer&#39;라고 부른다. 
퍼셉트론의 입력층은 모두 입력 뉴런으로 구성되는데, 보통 이곳에 편향 특성(bias)이 더해진다. </p>
<p>Perceptron의 훈련 알고리즘은 <strong>Hebb&#39;s rule</strong>에서 영감을 많이 받았는데, 이 규칙은 서로 활성화되는 세포가 서로 연결된다, 즉, 두 뉴런이 동시에 활성화될 때마다 이들 사이의 연결 가중치가 증가하는 경향이 있다는 것이라 말한다. 
<img src="https://velog.velcdn.com/images/sparks_fly22/post/98a7aa40-1b8a-4ccc-ac57-2822231db90e/image.png" alt="다층 퍼셉트론"></p>
<h2 id="mlp--back-propagation">MLP &amp; Back Propagation</h2>
<p>퍼셉트론을 여러 개 쌓아올린 인공 신경망을 <strong>다층 퍼셉트론(MLP)</strong>라고 한다. 
다층 퍼셉트론은 input layer, hidden layer, output layer로 구성된다. 
<img src="https://velog.velcdn.com/images/sparks_fly22/post/f0ab3c3e-6a39-460d-979a-aec27b622140/image.png" alt=""></p>
<p>hidden layer를 여러 개 쌓아 올린 인공 신경망을 심층 신경망(DNN)이라고 한다. 딥러닝은 심층 신경망을 연구하는 분야이며 조금 더 일반적으로는 연산이 연속하여 길게 연결된 모델을 연구한다.</p>
<p><strong>Backpropagation</strong>은 다층 퍼셉트론을 훈련하는 알고리즘이다. 이 알고리즘은 효율적인 기법으로 gradient를 자동으로 계산하는 경사 하강법이다. 네트워크를 두 번(정방향1, 역방향1) 통과하는 것만으로 Backpropagation은 모든 모델 파라미터에 대한 네트워크 오차의 gradient를 구할 수 있다. gradient를 구하고 나면 평범한 경사 하강법을 수행한다. </p>
<ul>
<li>한 번에 하나의 미니배치씩 진행, 이 과정을 여러 번 반복 (<em>epoch</em>)</li>
<li>정방향 계산</li>
<li>네트워크의 출력 오차 측정 (ground truth와 loss function사용한 출력)</li>
<li>각 출력 연결이 오차에 기여하는 정도 측정 (연쇄법칙 적용)</li>
<li>이전 층의 연결 가중치가 오차에 기여하는 정도 측정</li>
<li>역방향 계산 👉 오차 gradient를 거꾸로 전파함으로써 모든 연결 가중치에 대한 오차 gradient를 측정한다.</li>
<li>gradient descent를 수행하여 이전 단계를 통해 계산한 오차 gradient를 사용해 네트워크의 모든 연결 가중치를 수정한다.</li>
</ul>
<p>정리하면,</p>
<blockquote>
<ol>
<li>각 훈련 샘플에 대해 역전파 알고리즘이 먼저 예측을 만들고<strong>(정방향 계산)</strong> 오차를 측정한다.</li>
<li>역방향으로 각 층을 거치면서 각 연결이 오차에 기여한 정도를 측정한다.<strong>(역방향 계산)</strong></li>
<li>이 오차가 감소하도록 가중치를 조정한다.<strong>(경사 하강법 단계)</strong></li>
</ol>
</blockquote>
<p>backpropagation을 잘 작동시키기 위해 다층 퍼셉트론 구조에 중요한 변화를 주었는데, <strong>활성화 함수</strong>로 threshold function 대신 logistic(sigmoid)함수를 사용했다. 다른 활성화 함수도 사용될 수 있는데, 대표적으로는 hyperbolic tangent function과 ReLU 함수가 있다. </p>
<p>이러한 다층 퍼셉트론은 회귀 작업과 분류 작업 등 다양하게 활용될 수 있다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[핸즈온 머신러닝] ML 1,2장 ]]></title>
            <link>https://velog.io/@sparks_fly22/%ED%95%B8%EC%A6%88%EC%98%A8-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-ML-Chap.12</link>
            <guid>https://velog.io/@sparks_fly22/%ED%95%B8%EC%A6%88%EC%98%A8-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-ML-Chap.12</guid>
            <pubDate>Tue, 03 Jan 2023 07:50:08 GMT</pubDate>
            <description><![CDATA[<h2 id="머신러닝이란">머신러닝이란?</h2>
<p>데이터로부터 학습하도록 컴퓨터를 프로그래밍하는 것,</p>
<blockquote>
<p>어떤 작업 T에 대한 컴퓨터 프로그램 성능이 P로 측정되었는데, E라는 경험으로 성능이 향상됐다면, 이 컴퓨터 프로그램은 작업 T와 성능 측정 P에 대해 경험 E로 학습한 것이라 할 수 있다.   - Tom Mitchell, 1997</p>
</blockquote>
<ul>
<li>E - 훈련데이터</li>
<li>P - 정확도</li>
</ul>
<p>머신러닝 기술을 적용해서 대용량의 데이터를 분석하면 겉으로는 보이지 않던 패턴을 발견할 수 있다. (👉Data mining) 이 점을 활용한 애플리케이션 사례들은 다양한 분야에서 발견할 수 있다. </p>
<h2 id="머신러닝-시스템의-종류">머신러닝 시스템의 종류</h2>
<ul>
<li>사람의 감독 하에 훈련한 것인가? : 지도, 비지도, 준지도, 강화학습</li>
<li>실시간으로 점진적인 학습을 하는가? : 온라인 학습, 배치 학습</li>
<li>사례 기반 학습, 모델 기반 학습</li>
</ul>
<h3 id="1-학습하는-동안의-감독-형태--정보량">&lt;1&gt; 학습하는 동안의 감독 형태 / 정보량</h3>
<p>✅ 지도 학습 
: 알고리즘에 주입하는 훈련 데이터에 레이블이 포함된 경우
ex) 분류, k-nearest neighbors, linear regression, logistic regression, support vector machine, 결정 트리, 랜덤 포레스트, 신경망</p>
<p>✅ 비지도 학습
: 훈련 데이터에 레이블이 포함되어 있지 않은 경우 - 시스템 도움 없이 알고리즘 스스로 학습해야 한다.
ex) 군집 (k-means, DBSCAN, 이상치&amp;특이치 탐지, isolation forest)
시각화와 차원축소 (PCA, t-SNE)
연관 규칙 학습 (Apriori, Eclat)</p>
<p>✅ 준지도 학습
: 대부분의 준지도 학습은 지도 학습과 비지도 학습이 결합된 형태</p>
<p>✅ 강화 학습
: 학습하는 시스템(Agent)이 환경을 관찰해서 행동을 실행하고, 그 결과로 reward/penalty 를 받는다. 시간이 지나면서 큰 reward를 얻기 위해 policy라는 최상의 전략을 스스로 학습한다. </p>
<h3 id="2-입력-데이터의-stream으로부터-점진적으로-학습할-수-있는가">&lt;2&gt; 입력 데이터의 stream으로부터 점진적으로 학습할 수 있는가</h3>
<p>✅ 배치 학습 (Batch learning)
: 점진적으로 학습 불가, 가용한 데이터를 모두 사용해서 훈련시켜야 한다. </p>
<p>✅ 온라인 학습 (= 점진적 학습) 
: 데이터를 순차적으로 한 개씩 / mini-batch 단위로 주입하여 시스템을 훈련
--&gt; 매 학습 단계가 빠르고 비용이 적어, 데이터가 도착하는 대로 즉시 학습 가능 
but! 시스템에 나쁜 데이터가 주입됐을 때 시스템 성능이 점진적으로 감소할 수도 있다. </p>
<h3 id="3-어떻게-일반화되는가">&lt;3&gt; 어떻게 일반화되는가</h3>
<p>✅ 사례 기반 학습
: 시스템이 훈련 샘플을 기억함으로써 학습 진행. 유사도 측정을 통해 &#39;새로운 데이터 &amp; 학습한 샘플&#39;을 비교하는 식으로 일반화</p>
<p>✅ 모델 기반 학습
: 샘플들의 모델을 만들어 예측에 사용하는 것
데이터분석 - 모델 선택 - 훈련데이터로 모델 훈련 - 새로운 데이터에 모델 적용해서 예측, 그 다음 이 모델이 성공적으로 일반화되는지 관찰 (테스트와 검증)</p>
<h2 id="머신러닝의-주요-도전-과제">머신러닝의 주요 도전 과제</h2>
<ul>
<li>충분하지 않은 양의 훈련 데이터</li>
<li>대표성 없는 훈련 데이터</li>
<li>낮은 품질의 훈련 데이터</li>
<li>관련 없는 특성</li>
<li>훈련 데이터 overfitting</li>
<li>훈련 데이터 underfitting </li>
</ul>
<h2 id="머신러닝-프로젝트">머신러닝 프로젝트</h2>
<p>문제정의 - 데이터 구하기 - 데이터 분석 및 시각화 - 머신러닝 알고리즘에 사용할 데이터 준비 - 모델 선택 및 훈련 - 모델 파인튜닝 - 솔루션 제시 - 시스템 론칭, 모니터링, 유지 보수</p>
<blockquote>
<p>✅ Pipeline 이란?
:데이터 처리 component들이 연속되어 있는 것을 데이터 pipeline이라고 한다. 머신러닝 시스템은 데이터를 조작하고 변환할 일이 많아 파이프라인을 사용하는 일이 매우 흔하다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS224W] 5. Label Propagation for Node Classification]]></title>
            <link>https://velog.io/@sparks_fly22/CS224W-5.-Label-Propagation-for-Node-Classification</link>
            <guid>https://velog.io/@sparks_fly22/CS224W-5.-Label-Propagation-for-Node-Classification</guid>
            <pubDate>Fri, 11 Nov 2022 06:50:29 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>❔ Main quesion</strong>: 몇 개의 node들에 대해서만 label이 주어진 network에서 unlabeled node의 label을 어떻게 assign할 수 있을까?
📌 Alternative framework: <strong>Message passing</strong></p>
</blockquote>
<p><strong>* Semi-supervised node classification:</strong> Unlabeled nodes의 label을 예측한다. (👉지도 + 비지도 동시에)
<strong>* Correlations(Dependencies):</strong> 비슷한 노드들은 연결되어 있다. 
👉 Collective Classification</p>
<h2 id="51-message-passing-and-node-classification">5.1 Message Passing and Node Classification</h2>
<p>✅ 네트워크 내의 Correlations 근거</p>
<ul>
<li><p>Homophily: 개개인의 특징을 기반으로 사회적 관계가 형성되는데, 이때 비슷한 특징을 가진 사람들은 서로 연결될 확률이 크다. (&quot;Birds of a feather flock together.&quot;)</p>
</li>
<li><p>Influence: 사회적 관계가 개개인의 특징, 행동에 영향을 미친다.</p>
</li>
</ul>
<p>❔ 이러한 Correlation을 어떻게 leverage할 것인가?
❔ 그리하여 어떻게 node label 예측을 돕게 할 것인가?
<img src="https://velog.velcdn.com/images/sparks_fly22/post/6fa2c24f-aaa7-4145-ab29-5909cf36a631/image.png" alt="">
(대략적인 semi-supervised learning은 위 이미지와 같이 이루어진다.)</p>
<p>Semi-supervised binary node classification을 활용한다. 
( +Markov Assupmtion: 노드 v의 라벨은 이웃 노드의 라벨에 영향을 받는다.)</p>
<p>이제, Collective Classification의 3가지 step을 소개하겠다.</p>
<ol>
<li>Relational Classification</li>
<li>Iterative Classification</li>
<li>Correct &amp; Smooth</li>
</ol>
<p><em>(공개된 강의록 자료와 실제 강의에서 사용하는 ppt 내용이 살짝 상이한데, 강의에서 소개한 <strong>collective classifier model</strong> 3가지는 다음과 같다.)</em></p>
<ol>
<li>Relational Classifiers</li>
<li>Iterative Classification</li>
<li>Loopy belief propagation<h2 id="52-relational-and-iterative-classification">5.2 Relational and Iterative Classification</h2>
</li>
</ol>
<h2 id="53-collective-classification">5.3 Collective Classification</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Goorm_Project3] Support Vector Machines (SVM) 개념정리]]></title>
            <link>https://velog.io/@sparks_fly22/GoormProject3-Support-Vector-Machines-SVM-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@sparks_fly22/GoormProject3-Support-Vector-Machines-SVM-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 06 Nov 2022 05:14:31 GMT</pubDate>
            <description><![CDATA[<p><a href="https://monkeylearn.com/blog/introduction-to-support-vector-machines-svm/">본 포스트 작성에 참고한 사이트1</a><a href="https://towardsdatascience.com/support-vector-machine-introduction-to-machine-learning-algorithms-934a444fca47">, 사이트2</a></p>
<p>MBTI 분류기를 구현할 때 메인으로 사용한 SVM을 본 포스트를 통해 자세히 정리해보려 한다. 
Support Vector Machine (이하 SVM)은 regression과 classification에 모두 적용될 수 있지만, 보통은 분류작업에 많이 쓰인다고 한다. 데이터양이 한정적인 경우에도 빠른 computational 속도로 분류작업을 처리할 수 있다.</p>
<h3 id="✅-svm-은-무엇인가">✅ SVM 은 무엇인가?</h3>
<blockquote>
<p>A support vector machine (SVM) is a supervised machine learning model that uses classification algorithms for two-group classification problems. After giving an SVM model sets of labeled training data for each category, they’re able to categorize new text.</p>
</blockquote>
<p>아주 간단히 정리하자면, 분류 알고리즘을 사용하는 지도 (기계)학습 모델이다. 모델이 어떻게 작동하는지 그 메커니즘을 살펴보겠다.</p>
<p>SVM 알고리즘의 목표는 N-차원의 공간에서 <strong>hyperplane</strong>을 찾는 것인데, 다시 말해 SVM은 data point를 가장 잘 나눌 수 있는 decision boundary을 찾아줄 수 있다.
<img src="https://velog.velcdn.com/images/sparks_fly22/post/add93c56-3e19-49f0-a81a-9203f0f50865/image.png" alt="">
🔼 Best Hyperplane은 margin을 최대화하는 plane이라고 생각하면 된다.
<img src="https://velog.velcdn.com/images/sparks_fly22/post/a2ebc96f-7de0-4180-ab0c-851bfeddc694/image.png" alt=""></p>
<p>🔼 Feature의 개수에 따라 hyperplane의 형태는 달라진다.</p>
<h3 id="cost-function">Cost Function</h3>
<p><img src="https://velog.velcdn.com/images/sparks_fly22/post/3656e9b8-c027-4ef8-846c-c89ae945a9e7/image.png" alt=""></p>
<p>SVM 알고리즘에서는 hinge loss function을 사용해서, data point들과 hyperplane간의 margin을 최대화한다. </p>
<p>예측값과 실제값이 같은 sign인 경우, cost 값이 0이 되고, 
그렇지 않은 경우에는 loss value를 계산하게 된다.</p>
<p>위 cost function에 regularization parameter를 더하게 되는데, 이는 margin maximization과 loss의 균형을 맞추기 위해서다. 결과적으로 SVM의 cost function의 형태는 아래와 같아진다.</p>
<p><img src="https://velog.velcdn.com/images/sparks_fly22/post/53dbadc2-d8f9-4f4b-bdba-86d9b1af7d25/image.png" alt=""></p>
<h3 id="gradient-updates">Gradient Updates</h3>
<p>Gradient를 찾기 위해 각 weight마다 partial derivatives를 취하게 되는데, 찾은 gradient를 통해 weight를 update할 수 있게 된다.
<img src="https://velog.velcdn.com/images/sparks_fly22/post/3a66fe3c-477e-489c-954c-be30588fc85e/image.png" alt=""></p>
<p>👉 포스트 상단에 기재한 &#39;사이트2&#39;의 코드를 이용해서 직접 SVM 알고리즘을 구현해보았다. scikit learn의 library로 SVM이 있기 때문에 더욱 쉽게 알고리즘을 적용해볼 수도 있다.</p>
<pre><code>from sklearn.svm import SVC</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 '->'의 의미]]></title>
            <link>https://velog.io/@sparks_fly22/Python%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9D%98-%EC%9D%98%EB%AF%B8</link>
            <guid>https://velog.io/@sparks_fly22/Python%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9D%98-%EC%9D%98%EB%AF%B8</guid>
            <pubDate>Sun, 21 Aug 2022 16:52:44 GMT</pubDate>
            <description><![CDATA[<p>리트코드 문제를 푸는 도중, 함수 정의 부분에서 화살표가 등장했다. 해당 데이터 타입을 정의한 것인가? 하는 생각을 품고 정확히 알아보기 위해 검색을 해보았다. </p>
<p>(내가 만난 코드는 다음과 같았다.)</p>
<pre><code>def largestNumber(self, nums: List[int]) -&gt; str:</code></pre><p>python3에서 발견되는 &#39;-&gt;&#39;는 함수의 반환 값에 대해서 주석을 달기 위해 사용된다. 주석 역할을 하기 때문에 없어도 되지만, 코드를 더욱 정확히 나타내기 위해선 있는 편이 나을 것이다.</p>
<p>위 코드의 함수의 경우, 함수의 반환 값이 str 타입임을 알 수 있다.</p>
<p>참고로, nums: List[int] 라는 부분에서는 매개변수 nums가 List[int] 타입임을 설명한다. 이것도 마찬가지로 주석이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자료구조] 순차 탐색 알고리즘과 시간 복잡도 분석]]></title>
            <link>https://velog.io/@sparks_fly22/%EC%88%9C%EC%B0%A8-%ED%83%90%EC%83%89-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EA%B3%BC-%EC%8B%9C%EA%B0%84-%EB%B3%B5%EC%9E%A1%EB%8F%84-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@sparks_fly22/%EC%88%9C%EC%B0%A8-%ED%83%90%EC%83%89-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EA%B3%BC-%EC%8B%9C%EA%B0%84-%EB%B3%B5%EC%9E%A1%EB%8F%84-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Wed, 20 Jul 2022 13:58:48 GMT</pubDate>
            <description><![CDATA[<h4 id="다음은-순차-탐색-알고리즘을-구현한-lsearch-함수-코드다">다음은 순차 탐색 알고리즘을 구현한 LSearch 함수 코드다.</h4>
<pre><code>#include &lt;stdio.h&gt;

int LSearch(int ar[], int len, int target)
{
  int i;
  for(i=0; i&lt;len; i++)
  {
    if(ar[i] == target)
      return i;         // 찾은 대상의 인덱스 값 반환
  }
  return -1;            // 찾지 못했음을 의미하는 값 -1 반환
}

int main(void)
{
  int arr[] = {3,5,2,4,9};
  int idx;

  idx = LSearch(arr, sizeof(arr)/sizeof(int), 4);
  if(idx == -1)
    printf(&quot;탐색 실패 \n&quot;);
  else
    printf(&quot;타겟 저장 인덱스: %d \n&quot;, idx);

  idx = LSearch(arr, sizeof(arr)/sizeof(int), 7);
  if(idx == -1)
    printf(&quot;탐색 실패 \n&quot;);
  else
    printf(&quot;타겟 저장 인덱스: %d \n&quot;, idx);

  return 0;
}</code></pre><h4 id="👉-이제-위-코드의-시간-복잡도를-분석해서-연산횟수-함수-tn을-구해보자">👉 이제 위 코드의 시간 복잡도를 분석해서 연산횟수 함수 T(n)을 구해보자.</h4>
<p>이 알고리즘의 핵심이 되는 연산자는 if(ar[i] == target) 에 등장하는 &#39;==&#39; 연산자다. 이 동등비교 연산자에 따라 &lt;연산이나 ++연산의 횟수가 결정된다. 이처럼, 알고리즘의 핵심 연산이 무엇인지 잘 판단하여 시간 복잡도를 계산해야 한다.</p>
<p><img src="https://velog.velcdn.com/images/sparks_fly22/post/a010eb7d-4043-43ad-bdb1-10d88a8e270e/image.png" alt=""></p>
<p>위 그림에서 확인할 수 있듯, 데이터의 수가 많아지면 worst case에 수행하게 되는 연산의 횟수는 알고리즘 별로 차이가 크다. 따라서 알고리즘의 성능을 판단하는 데 중요하게 볼 것은 worst case인 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자료구조] 자료구조와 알고리즘의 이해]]></title>
            <link>https://velog.io/@sparks_fly22/1.-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%99%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%98-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@sparks_fly22/1.-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%99%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%98-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Wed, 20 Jul 2022 13:40:45 GMT</pubDate>
            <description><![CDATA[<h4 id="자료구조의-정의를-한-단어에-온전히-담기는-어렵다고-생각하지만-저자는-자료구조를-데이터의-표현-및-저장방법이라고-표현했다-또한-알고리즘은-표현저장된-데이터를-대상으로-하는-문제-해결-방법을-의미한다고-했다">자료구조의 정의를 한 단어에 온전히 담기는 어렵다고 생각하지만, 저자는 자료구조를 &#39;데이터의 표현 및 저장방법&#39;이라고 표현했다. 또한, 알고리즘은 표현/저장된 데이터를 대상으로 하는 &#39;문제 해결 방법&#39;을 의미한다고 했다.</h4>
<h4 id="따라서-알고리즘은-자료구조에-의존적이라-할-수-있다">따라서, 알고리즘은 자료구조에 의존적이라 할 수 있다.</h4>
<p>📌 <em>자료구조를 공부할 땐 그림으로 그리면서 이해해보자.</em></p>
<h3 id="시간-복잡도time-complexity와-공간-복잡도space-complexity">시간 복잡도(Time complexity)와 공간 복잡도(Space Complexity)</h3>
<p>👉 시간 복잡도: 속도에 해당하는 알고리즘의 수행시간 분석결과
👉 공간 복잡도: 메모리 사용량에 대한 분석결과</p>
<p>가장 좋은 알고리즘은 메모리를 적게 쓰면서도 속도가 빠른 알고리즘일 것이다. 일반적으로는 알고리즘 평가 시, 시간 복잡도에 초점을 맞춘다고 한다. 그렇다면 속도를 어떻게 평가할까?</p>
<p>바로, 처리해야 할 데이터의 수 n에 대한 연산횟수의 함수 <strong>&#39;T(n)&#39;</strong>을 구성하는 방법으로 속도에 대한 평가가 이루어진다.</p>
<p>앞으로 공부하면서 만나게 될 다양한 알고리즘의 시간 복잡도를 계산할 때에 이 T(n)함수를 이용하게 될 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[NLP 부트캠프 시작]]></title>
            <link>https://velog.io/@sparks_fly22/NLP%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84NLP-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@sparks_fly22/NLP%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84NLP-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Sat, 16 Jul 2022 05:27:31 GMT</pubDate>
            <description><![CDATA[<p>구름 스터디와 KAIST 주재걸 교수님의 랩실이 함께하는 &#39;자연어처리 전문가 양성 교육 과정&#39;에 참여하게 되었습니다. </p>
<p>시작한 지 이제 막 일주일이 지났는데 학습 양이 어마어마합니다. 평일 5일 하루 약 5시간 분량의 강의를 듣다 보니 공부한 내용을 복습하고 머릿속에 정리할 시간을 확보하지 않으면 안 되겠다는 판단이 들었습니다.
최소 일주일에 한 번은 이 공간에 공부한 내용을 차근차근 정리해보려 합니다. 작심삼일이 되지 않도록, 자연어처리 전문가가 되는 그 날까지 열심히 달려보겠습니다.</p>
]]></description>
        </item>
    </channel>
</rss>