<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>0_lingual.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 25 Apr 2024 02:02:20 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>0_lingual.log</title>
            <url>https://velog.velcdn.com/images/0_lingual/profile/2e933317-e611-4dfe-9b23-cb0d21904425/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 0_lingual.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/0_lingual" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[기계학습심화 - 7. Convolutional Neural Network (CNN)]]></title>
            <link>https://velog.io/@0_lingual/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5%EC%8B%AC%ED%99%94-7.-Convolutional-Neural-Network-CNN</link>
            <guid>https://velog.io/@0_lingual/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5%EC%8B%AC%ED%99%94-7.-Convolutional-Neural-Network-CNN</guid>
            <pubDate>Thu, 25 Apr 2024 02:02:20 GMT</pubDate>
            <description><![CDATA[<h1 id="convolutional-neural-network-cnn">Convolutional Neural Network (CNN)</h1>
<h2 id="convolutional-layer">Convolutional Layer</h2>
<img src="https://velog.velcdn.com/images/0_lingual/post/413a72da-c737-4dbc-8338-fc9ec5214d9f/image.png" width="600">

<p>위 그림에 나와 있는 식은 Input Size, Kernel Size, Zero-Padding과 Stride에 따른 Output Size를 계산하는 식이다.</p>
<h3 id="dilation">Dilation</h3>
<img src="https://velog.velcdn.com/images/0_lingual/post/67c28082-3c01-4e8f-bd7e-52832e2d617f/image.png" width="400">

<p>Dilation한 Convolution Layer는 Input을 몇 칸씩 띄어가면서 반영한다.
Conv2D에서 dilation_rate을 지정함으로서 구현할 수 있다.</p>
<h3 id="transposed-convolution">Transposed Convolution</h3>
<img src="https://velog.velcdn.com/images/0_lingual/post/5e4d971c-71d5-485c-9fc0-359905e8c03c/image.png" width="600">

<p>Transposed Convolution이란 데이터를 원래 크기로 되돌리기 위한 과정이다.
Output Size는 Convolutional Layer의 Output Size 계산식에서 i와 O를 치환해서 구한 식을 통해 얻을 수 있다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/75787762-ab27-45fd-88f1-2d284495df0f/image.png" width="500">

<h2 id="pooling-layer">Pooling Layer</h2>
<p>Pooling Layer란 데이터 사이즈를 줄이기 위한 Layer이다.
Pooling Layer의 종류로는 Max Pooling, Average Pooling, L2-norm Pooling이 있다.</p>
<h3 id="max-pooling">Max Pooling</h3>
<img src="https://velog.velcdn.com/images/0_lingual/post/1a71aea7-9df1-42d0-9ce5-5c22ec8e2d5a/image.png" width="500">

<p>Max Pooling이란 filter 크기 중에 가장 큰 값만을 선택하는 것이다.
이렇게 함으로써 데이터 사이즈를 줄일 수 있다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/1e13696a-c10b-4f15-85d1-6ac0cf0b92f8/image.png" width="500">

<p>Max Pooling을 통해 데이터를 Downsampling한 모습이다.</p>
<h2 id="softmax-layer">Softmax Layer</h2>
<img src="https://velog.velcdn.com/images/0_lingual/post/5c060ee9-43d6-4179-b3f9-b1da33952e53/image.png" width="600">

<p>Softmax Layer에서는 Output을 타겟 확률과 매핑한다.
이때, 두 변수 사이에 미분 관계가 성립하도록 하기 위해 사용하는 방법이 Softmax이다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/d9f2eade-ee1a-4ea9-8ec3-699f8ba4f751/image.png" width="400">

<p>위의 수식을 사용해 나온 Softmax 결과값과 타켓 확률은 미분 가능해진다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/928b3910-7c45-424e-bc3d-90eaaa3ec296/image.png" width="600">

<p>위의 그림처럼, Softmax를 거치면 결과값이 합쳐서 1이 되고, 차이가 커진다.</p>
<h3 id="cross-entropy-loss">Cross Entropy Loss</h3>
<img src="https://velog.velcdn.com/images/0_lingual/post/142fc49a-ae6c-40ea-8da0-b2a1c587ef98/image.png" width="600">

<p>Cross Entropy Loss를 통해 확률 분포끼리 비교할 수 있다.
밑의 그림은 True Label이 1일 때 x축을 p_i, y축을 -log(p_i)로 하는 그래프이다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/6ad18996-5b7e-41af-b40e-4b33536e00c0/image.png" width="500">

<p>p_i 값이 1에 가까울수록 Loss가 작은 것을 확인할 수 있다.</p>
<h2 id="activation-function">Activation Function</h2>
<img src="https://velog.velcdn.com/images/0_lingual/post/a03fc6cc-7e1b-444f-b360-77fd1c79d894/image.png" width="600">

<p>위의 그림처럼 Linear한 관계만 있다면 복잡한 계층도 결국엔 하나의 Matrix 곱으로 귀결된다. 이렇게 되면 CNN의 다층 구조의 의미가 퇴색해진다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/8061df9b-882a-4d75-acd0-8255e1236c90/image.png" width="600">


<p>따라서 Activation Function을 이용해 Nonlinearity하게 만드는 것이 CNN의 핵심이다.</p>
<p>이때 Backpropagation을 수행하기 위해선 CNN의 전 계층이 미분 가능해야 한다.
미분 가능하도록 해주는 함수가 Activation Function이다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/d82edb27-c7cc-4941-a559-612af9eaa23d/image.png" width="600">

<p>각 Activation Function들은 장단점이 있다.
몇 가지 Activation Function의 장단점에 대해 알아보자.</p>
<h4 id="sigmoid">Sigmoid</h4>
<img src="https://velog.velcdn.com/images/0_lingual/post/9be52357-3e14-455c-a4aa-3e00200ea348/image.png" width="500">

<p>Backpropagation 시에 Chain Rule에 의해 Activation Function의 값이 0에 가까우면 전체 미분값 자체가 0에 가까워져서 미분값이 거의 쓸모 없어지는데, 이것을 Gradient Vanishing라고 한다.</p>
<p>Sigmoid는 미분값이 0에 가까워 Gradient Vanishing이 일어나는 구간이 많다는 단점이 있다.</p>
<h4 id="relu">ReLU</h4>
<p>ReLU는 Sigmoid에 비해 적어도 x &gt; 0 인 절반의 영역에서는 Gradient Vanishing이 일어나지 않는다는 장점이 있다. 또한, 계산이 단순해서 계산 속도가 빠르다.</p>
<p>그러나 이것은 반대로 말하면 나머지 절반의 영역에서는 여전히 Gradient Vanishing이 일어난다는 말이다.</p>
<h4 id="leaky-relu--elu">Leaky ReLU / ELU</h4>
<p>Leaky ReLU나 ELU에서는 Gradient Vanishing이 일어나지 않는다는 장점이 있다.
Leaky ReLU의 경우 Transposed Convolution에 사용되기도 한다.</p>
<h2 id="cnn-수행-과정">CNN 수행 과정</h2>
<h3 id="encoder">Encoder</h3>
<img src="https://velog.velcdn.com/images/0_lingual/post/ae894cd9-f856-4662-90ad-9da54af88b69/image.png" width="600">

<h3 id="decoder">Decoder</h3>
<img src="https://velog.velcdn.com/images/0_lingual/post/7259d7d5-e218-4d9e-a4fc-66ffd03bb214/image.png" width="600">
]]></description>
        </item>
        <item>
            <title><![CDATA[기계학습심화 - 6. Neural Networks, Convolution]]></title>
            <link>https://velog.io/@0_lingual/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5%EC%8B%AC%ED%99%94-6.-Neural-Networks-Convolution</link>
            <guid>https://velog.io/@0_lingual/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5%EC%8B%AC%ED%99%94-6.-Neural-Networks-Convolution</guid>
            <pubDate>Sun, 21 Apr 2024 09:38:51 GMT</pubDate>
            <description><![CDATA[<h2 id="cnn-계층">CNN 계층</h2>
<img src="https://velog.velcdn.com/images/0_lingual/post/e356d1bf-9f13-41bd-95d0-4148bb5bf9d7/image.png" width="600">

<p>위의 그림은 CNN 중 하나인 AlexNet의 계층 구조이다.
물론 저 아이를 꽃으로 판별하긴 했지만.. 꽃 같은 아이 하하하~</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/1d795667-16d0-4681-8817-869c8b514585/image.png" width="300">

<p>CNN에는 크게 4개의 계층이 있다. 하나씩 알아보자.</p>
<h3 id="fully-connected-layer">Fully Connected Layer</h3>
<img src="https://velog.velcdn.com/images/0_lingual/post/e68c6e0d-9a33-4a7e-9305-e0a1f1a00315/image.png" width="500">

<p>Fully Connected Layer에서는 input 데이터를 stretch한다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/8e2e05f6-f23a-49d7-83af-648b80ef1838/image.png" width="500">

<p>이런 FC는 너무 많은 파라미터를 요구한다.
이에 대한 해결책으로 Locally Connected Layer, 더 나아가 Convolutional Layer가 있다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/4ba63a91-aecd-46fe-8149-fc1a982bc9c3/image.png" width="500">

<p>Convolutional Layer에서는 다른 위치의 데이터에 같은 파라미터를 공유한다.
이때 파라미터는 학습된 가중치이다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/57cf05f7-1d73-4b94-8f3a-ba9ea900580d/image.png" width="500">

<p>Convolution을 거친 결과벡터의 크기는
H(input - filter + 1) x W(input - filter + 1) x 1 이다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/92360ad4-c395-4fee-b6c6-fd30064ff971/image.png" width="500">

<p>filter를 이동하는 단위를 Stride라고 한다.
Stride까지 고려한 결과벡터의 크기는
⌊ (input - filter + 1) / Stride ⌋ + 1  이다. (⌊⌋는 내림 연산 기호)</p>
<p>Convolution 연산에서 모서리 쪽에 있는 데이터들은 중앙 쪽에 있는 데이터들에 비해 영향력이 적어진다. </p>
<p><strong>이러한 문제를 해결하기 위한 방법이 바로 Zero-Padding이다.</strong></p>
<img src="https://velog.velcdn.com/images/0_lingual/post/5941c721-b159-4eb5-a68d-04fd976fa650/image.png" width="500">

<p>위의 그림은 Zero-Padding을 2로 준 경우이다.
<strong>Zero-Padding의 크기는 &#39;filter의 크기 - 1&#39; 로 구할 수 있다.</strong></p>
<img src="https://velog.velcdn.com/images/0_lingual/post/664ad689-bc9e-461b-bffe-1fa11dfb3b00/image.png" width="500">

<p>이런 식으로 여러가지 filter를 사용해서 Convolution 연산을 수행할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[기계학습심화 - 5. Linear Classification, Neural Network]]></title>
            <link>https://velog.io/@0_lingual/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5%EC%8B%AC%ED%99%94-5.-Linear-Classification-Neural-Network-dvuf5mlm</link>
            <guid>https://velog.io/@0_lingual/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5%EC%8B%AC%ED%99%94-5.-Linear-Classification-Neural-Network-dvuf5mlm</guid>
            <pubDate>Fri, 19 Apr 2024 18:14:49 GMT</pubDate>
            <description><![CDATA[<h3 id="용어-정리">용어 정리</h3>
<img src="https://velog.velcdn.com/images/0_lingual/post/2243ab48-d88c-4404-a60e-3484ac2cf19e/image.png" width="500">

<p>• Loss Function : f(x)의 Loss가 얼마인지 계산하는 함수
• Optimizer : 최적화(Optimization)을 수행하는 알고리즘 ex. SGD, Adam
• One-hot Class Vector : 각 클래스에 대한 확률을 표현한 벡터 ex. &lt;0, 0, 0, 1, 0&gt;
• Ground Truth : 기계학습에서는 데이터 원본 혹은 실제 값을 의미함</p>
<h2 id="linear-classification">Linear Classification</h2>
<img src="https://velog.velcdn.com/images/0_lingual/post/dcc338f7-ef1d-4b4b-aa56-df7658761247/image.png" width="500">

<p>f(W, b) = Wx + b</p>
<p>위의 예시에서 각 요소의 행렬의 크기를 알아보자.</p>
<p>f(W, b) : 3 (클래스의 개수)
W : 12 (클래스의 개수 * 데이터의 개수)
x : 4 (데이터의 개수)
b : 3 (클래스의 개수)</p>
<h3 id="loss-function">Loss Function</h3>
<h4 id="l1-loss">L1 Loss</h4>
<img src="https://velog.velcdn.com/images/0_lingual/post/20c6602a-2716-486f-ae65-b77de5fb2907/image.png" width="300">


<h4 id="l2-loss">L2 Loss</h4>
<img src="https://velog.velcdn.com/images/0_lingual/post/e914c3f6-8c5e-4e9a-8f55-acc9909bb5c0/image.png" width="300">

<p>L2 Loss는 MSE(Mean Squared Error, 평균 제곱 오차)라고도 부른다.</p>
<h4 id="cross-entrophy-loss">Cross Entrophy Loss</h4>
<p>Cross Entrophy Loss는 L1, L2 Loss와는 달리, 확률끼리 비교하는 것이다.</p>
<p>Cross Entrophy Loss에서 Loss를 계산하는 식은 다음과 같다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/1171657e-c08a-4119-9309-5c502236e0ed/image.png" width="300">

<img src="https://velog.velcdn.com/images/0_lingual/post/2f561bbb-4b4c-41fe-8715-31caf340f4fd/image.png" width="300">

<p>다음은 Loss Function별로 Loss 값을 나타낸 그래프이다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/218960bf-c00b-4e20-8b0d-3cff6a3f56d3/image.png" width="400">

<p>같은 W, b를 사용하더라도 어떤 Loss Function을 사용하는지에 따라 결과가 달리진다.</p>
<h3 id="regularization-정규화">Regularization (정규화)</h3>
<img src ="https://velog.velcdn.com/images/0_lingual/post/9b9c6cb0-72d0-4c40-be07-c9d08a39262c/image.png" width="750">

<p>Underfitted는 모델의 복잡도가 너무 낮아서 데이터를 잘 판별하지 못하는 경우를 말한다.</p>
<p>이와 반대로, Overfitted는 모델의 복잡도가 너무 높아서 예측 능력이 망가지는 경우이다.
이 경우 학습 데이터에 대해서는 error가 적지만, 모델이 예측하는 데이터의 전체적인 경향성이 망가지기 때문에 새로운 데이터가 들어왔을 때의 예측력이 낮아진다. </p>
<p>cf. 모델의 복잡도가 높다는 건 학습할 파라미터가 많다는 말이다.</p>
<h4 id="ockhams-razor">Ockham&#39;s Razor</h4>
<img src="https://velog.velcdn.com/images/0_lingual/post/ba43dc82-c7b3-4dac-8ab9-c74de5760187/image.png" width="300">

<p>Ockham&#39;s Razor(오캄의 면도날 법칙)은 경쟁하는 여러가지 가설 중에 가장 간단한 것이 가장 좋은 것이라는 법칙이다. 위의 그래프의 경우 초록색 그래프가 더 좋다는 말로,
Overfitted 모델보다 Good Fit / Robust 모델이 더 좋다는 말에 힘을 실어준다.</p>
<h4 id="regularization-정규화-1">Regularization (정규화)</h4>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/c99f8566-13c5-47b3-b626-8d0ac0c8cecc/image.png" alt=""></p>
<p>위 식의 파란색 부분은 Data Loss를 구하는 부분으로, 이 Loss를 최소화함으로써 학습 데이터에 fitting하는 과정이다. <strong>이 과정을 Optimization(최적화)라고 부른다.</strong> 하지만, Overfitting의 경우 예측력이 떨어진다는 것을 알게 되었다. 따라서 초록색 부분인 Regularization(정규화)를 통해서 Simple Model로 만들어주는 과정이 필요하다.</p>
<p>Optimization을 하는 방법으로 총 3가지가 있다.</p>
<ol>
<li><p>Ramdom Search
 -&gt; 시간이 너무 오래 걸린다.</p>
</li>
<li><p>Analytic Solution(방정식 풀기)
 -&gt; 차수가 높아지면 방정식을 푸는 것이 거의 불가능하다.</p>
</li>
<li><p>Numerical Solution(Gradient Descent)
 -&gt; Local Minima에 갇힐 수 있고, 미분값이 수렴하지 않고 발산할 수 있다</p>
</li>
</ol>
<p>각각의 방법들에는 이러한 문제점들이 있다.
이에 대한 해결책으로 등장한 것이 Neural Networks(인공신경망)이다.</p>
<h1 id="neural-networks-인공신경망">Neural Networks (인공신경망)</h1>
<h2 id="neural-network란">Neural Network란?</h2>
<img src="https://velog.velcdn.com/images/0_lingual/post/90738adf-28e0-489b-a49e-c8a9f1c29a51/image.png" width="500">

<p>딥러닝은 인간의 뇌 구조에서 착안한 기계학습 방법이다.
인간의 뇌는 위의 그림과 같은 복잡한 연쇄를 통해 Output을 도출한다.</p>
<p>Neural Network란 뉴런(Atomic Functions)이 Non-linear하게 연결되어 있는 구조를 말한다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/3a12d0c3-8c1b-48e8-b29f-b907e15b508b/image.png" width="500">

<p>위의 그림은 Neural Network가 Forward Propagation(순전파)을 통해 Output을 찾아가는 과정을 보여준다.</p>
<p>그렇다면, 각각의 Atomic Functions를 어떻게 알 수 있을까?
이를테면 각 Atomic Functions의 W(Weight) 말이다. 
바로 Backward Propagation(역전파)를 통해 계산할 수 있다.</p>
<h2 id="back-propagation-역전파">Back Propagation (역전파)</h2>
<img src="https://velog.velcdn.com/images/0_lingual/post/ad45c00d-49b0-461f-b296-1c2d95f96126/image.png" width="500">

<p>위의 f(x, W)에 대한 역전파 과정을 살펴보자.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/94337656-836d-4719-9fb2-90f5d5a15c04/image.png" width="500">

<p>Chain Rule을 통해 f에서 역행하는 방향으로 이동하면서 미분값을 구할 수 있다.</p>
<p>다음으로는 Loss Function인 L2-Loss와 Activation Function(활성화 함수)인 Sigmoid와 ReLU의 Computational Graph를 살펴보자.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/303cf494-8afe-4833-ad21-a21948a99b91/image.png" width="500">

<img src="https://velog.velcdn.com/images/0_lingual/post/a19543ae-4cea-4800-9762-8f553ba253eb/image.png" width="600">

<p>이런식으로 Chain Rule을 통해 Y에서 X로 가면서 미분값을 구하는 것이 Back Propagation이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[기계학습심화 - 4. Traditional Unsupervised Learning (K-means, PCA)]]></title>
            <link>https://velog.io/@0_lingual/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5%EC%8B%AC%ED%99%94-4.-K-means-PCA</link>
            <guid>https://velog.io/@0_lingual/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5%EC%8B%AC%ED%99%94-4.-K-means-PCA</guid>
            <pubDate>Thu, 18 Apr 2024 12:25:41 GMT</pubDate>
            <description><![CDATA[<h1 id="traditional-unsupervised-learning-전통적-비지도학습">Traditional Unsupervised Learning (전통적 비지도학습)</h1>
<h2 id="k-means">K-means</h2>
<h3 id="k-means란">K-means란?</h3>
<p>K-means는 비지도학습 방법 중 하나로, Clustering(군집화) Method이다.
비지도학습은 지도학습과는 달리 정답이 주어지지 않기 때문에 Classification을 하지는 못하고, clustering을 할 수밖에 없다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/bdfd4ec3-c111-4783-80de-5cd10cd0adfc/image.png" width="1000">

<p>K-means는 주어진 n개의 데이터를 K개의 Cluster로 나눈다.
이때 각 cluster의 중앙값을 Centroid라고 한다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/bebe86e2-494b-45d8-979c-6189bd399df8/image.png" width="400">

<p>K-means에서는 첫 시행에 랜덤으로 Centroid를 K개 정하고, 모든 점에 대해 어떤 Centroid에 가장 가까운지 계산해서 해당 Centroid의 Cluster로 편입한다.
위 그림은 K가 2인 경우 K-means의 첫번째 실행이다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/a9530597-9775-46b3-95bd-89bc0c5a322f/image.png" width="400">

<p>이후 각 Cluster의 중앙값을 새로운 Centroid로 정하고, 더 이상 Centroid가 바뀌지 않을 때까지 같은 과정을 계속 반복한다. 첫번째 실행에서 Centroid와 Cluster 결과 모두 다른 것을 확인할 수 있다.</p>
<h3 id="k를-어떻게-결정할까">K를 어떻게 결정할까?</h3>
<p>K-means에서 K는 Hyper Parameter이다. 따라서 우리가 튜닝해야 되는 대상이다.
하지만, Clustering Method에는 label이 없기 때문에 Cross Validation을 사용할  수 없다. 그렇다면 어떻게 K를 결정할 수 있을까?</p>
<p>다음은 K를 1씩 증가하면서 각각의 SSE(Sum of Squared Errors)를 계산하는 코드이다.</p>
<pre><code>import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans

X = np.array([
[6,3], [11,15], [17,12], [24,10], [20,25], [22,30],
[85,70], [71,81], [60,79], [56,52], [81,91], [80,81]])

plt.scatter(X[:,0],X[:,1])

n_clusters = range(1, 10)
kmeans = [KMeans(n_clusters=i) for i in n_clusters]

# For every sample, the squared error is calculated and added to the list.
score = [kmeans[i].fit(X).inertia_ for i in range(len(kmeans))]

plt.plot(n_clusters, score)
plt.xlabel(&#39;Number of Clusters&#39;)
plt.ylabel(&#39;Score&#39;)
plt.title(&#39;Elbow Curve&#39;)
plt.show()</code></pre><img src="https://velog.velcdn.com/images/0_lingual/post/01f4d0fd-42bc-484e-be46-adbfef95ee84/image.png" width="400">

<p>위의 코드를 실행하면 나오는 결과이다. 이때, Score(SSE)가 급격하게 줄어드는 Elbow Curve를 찾을 수 있고, 이 Elbow Curve 지점에서의 Number of Clusters를 K값으로 결정하는 것이다. </p>
<h3 id="k-means의-장단점">K-means의 장단점</h3>
<h4 id="장점">장점</h4>
<ol>
<li>간단하고 빠르다.</li>
<li>수렴을 보장한다.</li>
<li>일반화가 쉽다. (새로운 데이터에 적용되기 쉽다.)</li>
</ol>
<h4 id="단점">단점</h4>
<ol>
<li><p>K를 고르기 위해 노력을 기울여야 한다.</p>
</li>
<li><p>시작점에 민감하다. (최초의 Centroid에 따라 최종 Clustering이 달라진다.)</p>
</li>
<li><p>Outliers에 민감하다. (평균에서 멀리 떨어진 Outlier들에 의해 영향을 많이 받는다.)</p>
<p> 해결책 : 평균값이 아닌 중앙값(Median)을 사용하면 Outlier의 영향을 적게 받을 수 있음.</p>
<p> ex. 평균 제곱 오차를 사용하는 L2 Distance 대신 중앙값을 사용하는 L1 Distance을 사용하면 Outlier의 영향을 적게 받을 수 있다.</p>
</li>
</ol>
<h2 id="pcaprinciple-component-analysis">PCA(Principle Component Analysis)</h2>
<h3 id="curse-of-dimensionality-차원의-저주">Curse of Dimensionality (차원의 저주)</h3>
<p>KNN을 공부할 때 계산량이 너무 많다는 단점을 다뤘다. 계산량은 데이터의 차원이 높아질수록 점점 더 많아진다. </p>
<img src="https://velog.velcdn.com/images/0_lingual/post/f717da93-a8fc-475d-9ce4-4393874347a3/image.png" width="500">

<p>예를 들어, 위와 같은 영상 파일의 경우 Width x Height x Frames x RGB 만큼의 차원이기 때문에 데이터의 차원이 매우 크다. 이 경우 계산량이 매우 크고 계산 속도가 매우 느릴 것이다.</p>
<p>따라서 우리는 머신러닝의 성능은 어느 정도 유지하면서 데이터의 차원을 낮추고 싶다.</p>
<h3 id="pca란">PCA란?</h3>
<img src="https://velog.velcdn.com/images/0_lingual/post/31ea9138-de6c-4066-8703-ddd7a7b36e80/image.png" width="300">

<p>위 그림처럼 완벽하게 정렬된 데이터셋이 있다고 가정하자.
이 경우 오른쪽 맨 위의 데이터를 x, y축 Basis Vector로 표현하면 다음과 같다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/3cbaec09-9f4e-49af-9739-faf0c234a491/image.png" width="300">

<p>이때 Data Align에 따라 Principal Component(주성분)을 새로 설정해보자.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/63526b4c-ec31-42a7-8fa4-6d95d25afb53/image.png" width="650">

<p>새로 설정한 Principal Component를 새로운 축으로 하여 데이터를 재정렬하면 오른쪽 그림과 같이 데이터들이 PC1 축에 평행하게 정렬된다. 이 경우 벡터 합으로 표현하면 다음과 같다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/b4e4b10c-882b-471b-872c-1530bdff1e95/image.png" width="175">

<p>재정렬하기 전에 비해 한 차원 감소한 것을 알 수 있다.
<strong>이렇게 Principal Component을 재설정함으로써 데이터를 더 낮은 차원으로 표현하는 방식이 PCA이다.</strong></p>
<p>하지만, 실제 데이터셋은 보통 완벽하게 정렬되어 있지 않다. 이 경우에도 여전히 PCA를 사용할 수 있다. 그렇다면 Principal Component을 어떻게 정할 수 있을까?</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/f6538c52-6646-4427-824c-d37ed94e6057/image.gif" width="1000">

<p>바로, SSE를 최소로 만드는 벡터를 찾아 Principal Component로 정한다.
위의 GIF는 그 과정을 보여준다.</p>
<p>PCA는 행렬곱 연산이며, 다음과 같은 수식으로 나타낼 수 있다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/f98abb6f-0ca0-4326-a99d-3ff496d823f7/image.png" width="150">

<p>이때 X_r은 PCA를 통해 차원이 감소한 데이터, U는 Principal Component Vector의 행렬, X는 원본 데이터이다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/e182bc2c-24b3-4d8a-ac33-781076e07fb7/image.png" width="750">

<p>PC를 거친 이후에 데이터의 중요한 정보를 최대한 보존하기 위해 Reconstruction을 통해 Basis Vector을 축으로 하는 좌표 평면에Projection한다.</p>
<h3 id="pca-성능">PCA 성능</h3>
<p>K-nearest neighbor with MNIST</p>
<p>• Originally (784 dimensions x 60,000 training data):
• Accuracy: 96.9
• Running time: 1 minutes</p>
<p>After PCA (10 dimensions x 60,000 training data):
• Accuracy: 92.8
• Running time: 1.5 sec</p>
<p>위의 지표는 MNIST 데이터에 대해 KNN을 PCA를 사용하지 않고 수행했을 때와 PCA를 사용해서 수행했을 때의 Accuracy와 Running Time 수치를 나타내고 있다.</p>
<p>이때 PCA를 통해 수행했을 때는 차원이 784에서 10으로 많이 줄어든 것을 확인할 수 있다. 또, Accuracy가 4.1% 감소했지만, Running  Time은 약 40배 가량 감소한 것을 확인할 수 있다. <strong>PCA를 사용하면 정확도는 조금 낮아지지만 속도는 훨씬 빨라진다는 것을 알 수 있다.</strong></p>
<h3 id="pca-사용-분야">PCA 사용 분야</h3>
<p>• 차원 축소 : <strong>데이터 크기를 줄여서 Computation Time을 감소시킬 수 있음.</strong>
• 이미지 압축 : 메모리 사용을 줄이고, <strong>PCA는 선형 기법 중에 Loss가 가장 작은 기법이다.</strong>
• Noise 제거 : 이미지 데이터의 Noise를 제거할 수 있다. (Denoising)</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/cf09f44e-c740-4645-9a51-83b094425766/image.png" width="1000">


<h3 id="pca의-한계점">PCA의 한계점</h3>
<p>PCA의 한계점은 PCA가 Orthogonal Basis(직교 기반)라는 점에서 나타난다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/934351e9-0ffd-4ad1-bef3-b7b68d714648/image.png" width="700">

<p>왼쪽 그림의 데이터는 어느 정도 선형으로 정렬되어 있기 때문에 PCA를 통해 차원 축소를 하는 것이 의미 있을 수 있다.</p>
<p>반면, 오른쪽 그림의 데이터 분포에서는 직교하는 PC 성분을 통해 차원 축소를 하는 것이 거의 무의미할 정도로 무질서하게 정렬되어 있다. 따라서 PCA는 항상 최선의 방법은 아니다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/1d581ad3-41b7-4dab-abea-e5b95928adfd/image.png" width="600">

<p>데이터를 가장 잘 설명할 수 있는 축을 찾는 PCA 알고리즘과는 달리,
독립성이 최대가 되는 축을 찾으며, 기준 축이 반드시 직교할 필요가 없는 ICA(Independent Component Analysis, 독립 성분 분석) 알고리즘도 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[기계학습심화 - 3. Traditional Classification Method (SVM), Norms, Loss]]></title>
            <link>https://velog.io/@0_lingual/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5%EC%8B%AC%ED%99%94-3.-SVM-Norms-Loss</link>
            <guid>https://velog.io/@0_lingual/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5%EC%8B%AC%ED%99%94-3.-SVM-Norms-Loss</guid>
            <pubDate>Thu, 18 Apr 2024 00:23:04 GMT</pubDate>
            <description><![CDATA[<h1 id="traditional-classification-method">Traditional Classification Method</h1>
<h2 id="svm-support-vector-machine">SVM (Support Vector Machine)</h2>
<h3 id="svm이란">SVM이란?</h3>
<img src="https://velog.velcdn.com/images/0_lingual/post/b2bc0cb9-2e43-400e-a115-22079dff0829/image.png" width="350" height="50%">

<p>위의 점들을 구별하는 Classifier를 구할 때 가장 좋은 방법은 무엇일까?
Data Point를 만나기 전까지 늘어날 수 있는 경계선 사이의 폭을 Margin이라고 한다.
이 Margin이 최대가 되도록하는 직선을 구하면 가장 좋은 Classifier라고 가정한다. 평균에서 멀리 떨어진 Outliner들에 대한 구분 능력이 좋기 때문에 강력한 일반화 능력을 갖기 때문이다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/8fb8ebd8-7476-4bc3-b406-050a7b9b8ed3/image.png" width="400">

<p>이때 Margin을 결정하는 두 직선을 Support Vector라고 부른다.
이 Support Vector만이 Decision Surface를 결정한다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/beed6e0a-c0d5-4c44-b61c-4fa44adf6f2d/image.png" width="300">

<p>Margin이 최대가 되도록하는 직선을 구하는게 목표인데, 그렇다면 이걸 어떻게 구할 수 있을까? 두 Support Vector를 각각 wx - b = 1, wx - b = -1 이라고 하자.
이때 이 두 직선 사이의 거리가 최대가 되도록 하는 w와 b값을 구하면 된다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/e067823f-6f94-4d4f-9ff2-1687f57acacb/image.png" width="500">

<p>평행한 두 직선 사이의 거리를 구하는 공식은 다음과 같다.
이에 따라 Support Vector 간의 거리를 계산해보면 2 / |w| 가 되고, 이를 최대로 만드는 것은 역수인 |w| / 2 를 최소로 만드는 것과 같다. 따라서 |w|를 최소로 만들면 되는 것이다.</p>
<h3 id="kernel-method">Kernel Method</h3>
<img src="https://velog.velcdn.com/images/0_lingual/post/1faee2c7-decb-4ce6-a125-0cf2deb6adbc/image.png" width="350">

<p>데이터 자체가 비선형(Nonlinear)으로 분포되어 있다면 SVM을 통한 Classification이 불가능할 수 있다. 이런 경우에는 Kernel Method를 사용해 Classification할 수 있다.
위의 사진은 RBF Kernel을 사용해 Classification한 결과이다.</p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/3ba20cd8-b0fa-436d-bd19-37c0a3ceb8b8/image.png" alt=""></p>
<p>Kernel Method는 비선형 데이터를 고차원으로 세울 수 있게 도와준다.
위의 그림에서는 데이터를 3차원으로 옮겼더니 Decision Surface를 통해 Classification에 성공한 모습이다.</p>
<h2 id="norms">Norms</h2>
<img src="https://velog.velcdn.com/images/0_lingual/post/9d05ac9c-46bc-4722-ae39-04b6d768acdf/image.png" width="300">


<p>Norms란 벡터의 크기를 결정하는 방식이다.
위와 같은 벡터의 크기를 결정하는 방식은 여러가지가 있다.</p>
<h3 id="lp-norm">Lp-norm</h3>
<img src="https://velog.velcdn.com/images/0_lingual/post/b21b78ce-fc52-4486-b8c7-bd94da4a63bf/image.png" width="230">

<p>Lp-norm의 계산식은 위와 같다. 이때 p는 데이터의 차수이다.
예를 들어, p가 1일 때의 Lp-norm(L1-norm)은 다음과 같다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/4b52c235-4df6-40b6-b776-0e837023fbad/image.png" width="400">

<p>p가 2일 때의 Lp-norm(L2-norm)은 다음과 같다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/dac3cb30-dcb6-4883-b438-be734ab3d444/image.png" width="400">

<h2 id="loss">Loss</h2>
<p>Loss란 Lp-norm을 통해 계산한 error의 크기이다.
지금까지 배운 Error 계산 공식과 L1-norm, L2-norm 계산 공식을 통해 Loss는 다음과 같다.</p>
<img src="https://velog.velcdn.com/images/0_lingual/post/3e4d43e3-028c-4fae-8548-e74930f0eeb4/image.png" width="500">
]]></description>
        </item>
        <item>
            <title><![CDATA[기계학습심화 - 2. GD, SGD, Traditional Classification Method (KNN)
]]></title>
            <link>https://velog.io/@0_lingual/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5%EC%8B%AC%ED%99%94-2.-GD-SGD-KNN</link>
            <guid>https://velog.io/@0_lingual/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5%EC%8B%AC%ED%99%94-2.-GD-SGD-KNN</guid>
            <pubDate>Tue, 16 Apr 2024 08:01:20 GMT</pubDate>
            <description><![CDATA[<h2 id="gradient-descent-경사하강법">Gradient Descent (경사하강법)</h2>
<h3 id="경사하강법을-다차원으로-확장">경사하강법을 다차원으로 확장</h3>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/c2664934-6a53-455d-b0af-6a682dfda2cf/image.png" alt=""></p>
<p>지난 1번 글에서 학습한 위의 W, b에 대한 경사하강법 수식을 행렬 수식으로 표현하면 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/3759235b-9bb1-46c1-8a8c-65edd1cf5acf/image.png" alt=""></p>
<p>이때, 마지막 항에서 Learning Rate γ를 제외한 부분이 Loss의 변화량을 벡터로 모아놓은 것이 된다.</p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/a0dbe25d-e501-43b3-8b68-1a6715b9552d/image.png" alt=""></p>
<p>이제 W, b, Loss(W, b)를 세 축으로 하는 3차원 공간 위에 올려보자. (왼쪽 그림)
그리고 W, b를 두 축으로 하는 2차원 평면 위에 Loss를 미분한 값에에 - 부호를 붙여서 벡터로 나타내면 다음과 같다. (오른쪽 그림, -∇Loss(W, b) )</p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/c60e9f79-fdbb-4003-b971-785a8be065ce/image.png" alt=""></p>
<h2 id="stochastic-gradient-descent-확률적-경사하강법">Stochastic Gradient Descent (확률적 경사하강법)</h2>
<h3 id="stochastic-gradient-descent의-필요성">Stochastic Gradient Descent의 필요성</h3>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/a2ba9179-9a00-49c7-be9d-6c7440abf281/image.png" alt=""></p>
<p>위의 수식들은 각각 Loss를 W, b에 대해 미분한 것이다. 기존의 경사하강법을 컴퓨터로 계산하면 모든 데이터셋에 대한 총합을 구하는 연산을 해야 되기 때문에 계산량이 너무 많아 시간과 메모리가 너무 많이 필요하다. 이에 따라 등장하게 된 것이 바로 Stochastic Gradient Descent(확률적 경사하강법)이다. </p>
<h3 id="stochastic-gradient-descent란">Stochastic Gradient Descent란?</h3>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/44aa26b5-c505-42ef-9bc3-2db704188334/image.png" alt=""></p>
<p>기존 Gradient Descent(이하 GD)가 전체 데이터셋을 대상으로 학습했다면, Stochastic Gradient Descent(이하 SGD)는 전체 데이터셋을 작은 데이터셋 여러 개로 쪼개서 학습한 뒤, 한 번의 학습이 끝날 때마다 W, b를 업데이트한다. 이때 전체 데이터셋을 full-batch, 쪼개진 데이터셋의 일부를 mini-batch라고 한다. SGD에서는 mini-batch 단위로 GD를 수행하며, 이를 계속 반복한다. 이때 각각의 수행을 epoch이라고 부른다.</p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/0fef0bc6-28a9-4f14-bf55-8b7011123231/image.png" alt=""></p>
<p>이러한 SGD의 단점으로는 왼쪽 그림과 같이 마지막에 한 값으로 수렴하지 못하고 Oscillation(진동)이 발생한다. 이에 대한 해결책으로 일반적인 GD에서는 Learning Rate를 바꾸지 않는 것과는 달리, SGD에서는 epoch마다 점점 Learning Rate을 줄여서 최대한 한 값으로 수렴할 수 있도록 한다.</p>
<p>GD, SGD는 모두 W와 b를 학습하기 위한 방법들이고, 이러한 방법들에는 ADAM, RMSPROP 등 여러가지 방법이 있다. 이들을 옵티마이저라고도 부른다.</p>
<h1 id="traditional-classification-method">Traditional Classification Method</h1>
<h2 id="knn-k--nearest-neighbor">KNN (K- Nearest Neighbor)</h2>
<h3 id="knn이란">KNN이란?</h3>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/6760b87c-3b90-4086-9f9c-b0422de5dc95/image.png" alt=""></p>
<p>KNN은 Traditional Classification Method 중 하나이다. KNN은 K-Nearest Neighbor의 약자로, 새로운 데이터가 들어왔을 때 말 그대로 K개의 이웃한 점들을 기준으로 다수결 투표를 해서 Class를 결정하는 방법이다.위의 예시에서 k가 3일 때는 class2, k가 5일 때는 class1이 선택된다. 이때 K는 Hyper Parameter로, 우리가 직접 튜닝해야 되는 파라미터이다. 동점 방지를 위해 K는 주로 홀수를 택하여 사용한다. </p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/2f62e28c-2887-49a4-b39f-f7f2b77dd3bd/image.png" alt=""></p>
<p>KNN을 수행하는 절차는 위의 그림과 같다. 이때, 거리를 계산하는 방식에는 여러가지가 있는데, 아래 표를 참고하자.</p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/d99bf903-12e7-4213-be3a-aa9419861ce7/image.png" alt=""></p>
<p>위의 표에는 대표적인 Distance Metric(거리 측정법)들이 소개되어 있다. Manhattan Distance는 L1, Euclidean Distance는 L2라고도 부른다. </p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/1eecf88c-4c98-4e3e-a1b2-ddeeb2ebb723/image.png" alt=""></p>
<p>위의 그림을 보면서 KNN의 특징을 정리해보자.</p>
<ol>
<li>K값에 따라 Boundary가 다르게 결정된다. 즉, 같은 데이터라도 다른 Class로 분류될 수 있다.</li>
<li>투표 결과 동점이 발생하는 경우, 분류가 불가능하기 때문에 사각지대가 생긴다.</li>
<li>평균에서 멀리 떨어진 Outlier들에 의해 Noise가 발생하기도 한다. (동그라미 친 점들)</li>
</ol>
<h3 id="hyper-parameter">Hyper Parameter</h3>
<p>Hyper Parameter란, 학습 결과로는 알 수 없고, 인간이 직접 튜닝해야 되는 파라미터를 말한다. KNN에서는 K값이나 Distance Metric 등이 Hyper Parameter라고 할 수 있다. 그렇다면 Hyper Parameter를 설정하는 방법에 대해 알아보자. </p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/5978c2ff-204e-4a0e-b519-812772d941f7/image.png" alt=""></p>
<p>먼저, 전체 데이터셋을 대상으로 학습하여 Hyper Parameter를 결정하면 새로운 데이터가 들어왔을 때 어떻게 동작할지 예측할 수 없다. 따라서, 전체 데이터셋을 Train Dataset, Validation Dataset, Test Dataset으로 나누고, Validation Dataset을 통해 Hyper Parameter를 결정하고, Test Dataset으로 성능을 검증하는 것이 더 나은 방법이다. 하지만, 학습 데이터가 매우 적은 경우에는 이렇게 하면 각 데이터셋의 다양성이 줄어들기 때문에 신뢰도가 낮아지는 문제가 발생할 수도 있다. </p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/be3b13aa-e9d1-4cd4-8466-ff3eebb40ddf/image.png" alt=""></p>
<p>신뢰도가 낮아지는 문제를 해결하기 위해 고안된 방법이 (K-fold) Cross-Validation이다. Cross-Validation에서는 데이터셋을 여러 개의 fold로 나누고, 각각의 fold를 Validation Dataset으로 사용한 뒤 평균을 낸다. 이러한 Cross-Validation를 통해 Hyper Parameter를 튜닝할 수 있다. 하지만 Cross-Validation은 딥러닝에서 그렇게 많이 사용되고 있지는 않다고 한다.</p>
<h3 id="knn의-장단점">KNN의 장단점</h3>
<p>먼저, KNN의 장점으로는 Training Time Complexity가 O(1)로, 학습이 거의 필요하지 않다는 점을 꼽을 수 있다.</p>
<p>반면, KNN의 단점으로는 거리 측정과 다수결 투표를 매 시행마다 해야 하기 때문에 연산량이 과도하게 많다는 점이 있다. 이로 인해 수많은 메모리 공간과 계산 시간이 필요하게 된다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[기계학습심화 - 1. Linear Regression, Gradient Descent]]></title>
            <link>https://velog.io/@0_lingual/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5%EC%8B%AC%ED%99%94-Lecture-1.-Linear-Regression-Gradient-Descent</link>
            <guid>https://velog.io/@0_lingual/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5%EC%8B%AC%ED%99%94-Lecture-1.-Linear-Regression-Gradient-Descent</guid>
            <pubDate>Mon, 15 Apr 2024 16:18:37 GMT</pubDate>
            <description><![CDATA[<h2 id="머신러닝이란">머신러닝이란?</h2>
<h3 id="머신러닝의-목표">머신러닝의 목표</h3>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/ad009676-36f2-48a7-b35c-70f73519d850/image.png" alt=""></p>
<p>머신러닝은 input (X)로부터 ouput (Y)를 추출하도록 하는 f(x)를 찾는 과정이다. 정확한 함수를 찾는다기보다는 충분히 근사치를 도출하는 함수를 찾는 것이 머신러닝의 목표이다. </p>
<h3 id="학습의-종류">학습의 종류</h3>
<p>학습의 종류에는 크게 네 가지가 있다. 적절한 f(x)를 찾기 위해 다음과 같은 방법 중에 택하여 학습할 수 있다. 머신러닝에서는 다음의 학습 방법 중에 상황에 맞는 학습 방법을 택하여 학습을 한다.</p>
<h4 id="1-supervised-learning-지도학습">1. Supervised Learning (지도학습)</h4>
<p>지도학습이란 Training Dataset에 x와 함께 Label 즉, y가 주어지는 경우이다. 학습 데이터 안에 정답을 함께 제공하는 것이다.</p>
<h4 id="2-unsupervised-learning-비지도학습">2. Unsupervised Learning (비지도학습)</h4>
<p>비지도학습에서는 지도학습과는 반대로 y 없이 x만 주어진다. </p>
<h4 id="3-weekly--semi-supervised-learning-반지도학습">3. Weekly / Semi-supervised Learning (반지도학습)</h4>
<p>반지도학습에서는 일부 Training Dataset에는 x와 함께 y가 주어지고, 일부 Training Dataset에는 y 없이 x만 주어진다.</p>
<h4 id="4-reinforcement-learning-강화학습">4. Reinforcement Learning (강화학습)</h4>
<p>강화학습이란 action에 따른 reward(보상)을 주면서 계속 훈련시키는 것을 말한다.</p>
<h2 id="linear-regression-선형회귀">Linear Regression (선형회귀)</h2>
<h3 id="linear-method">Linear Method</h3>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/3c458beb-71d5-4f2b-92a5-d48b05b827e4/image.png" alt=""></p>
<p>위의 그림처럼 데이터를 2차원 평면 위의 점들의 집합으로 옮긴 뒤, 그 점들을 가장 잘 대표할 수 있는 적절한 f(x)를 구하기 위해서는 어떻게 해야 할까? 그 방법 중 하나로 Linear Method가 있다. f(x) = wx + b 의 형태로 설정하고 가장 적절한 w값과 b값을 찾는 방법이다. 이때 w는 slope(경사), b는 bias(편향)으로 부른다.</p>
<h3 id="regression-vs-classification">Regression vs Classification</h3>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/df5baaf0-07f5-4750-a441-2cae343e5b0c/image.png" alt=""></p>
<p>Regression은 데이터의 경향성을 가장 잘 나타낼 수 있는 선을 찾는 행위이며, 데이터의 패턴을 분석할 때 주로 사용한다. 이와 달리 Classification은 데이터를 분류할 수 있는 구분선을 찾는 행위이며, 클래스를 나눌 때 주로 사용한다.</p>
<h3 id="linear-regression">Linear Regression</h3>
<p>본론으로 돌아와서, Linear Method와 Regression에 대한 이해를 바탕으로, Linear Regression(선형회귀)은 선형의 경향성을 가장 잘 나타내는 선을 찾는 행위임을 알 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/930a6337-863b-49cf-945c-754b9d3b5c0e/image.png" alt=""></p>
<p>선형회귀가 사용되는 경우는 정말 많은데, 주로 두 변수의 관계를 분석하는 경우에 주로 사용된다. 예를 들어, 부모와 키와 자식의 키의 관계를 예측하는 것이나 기업의 순이익과 주가와의 관계를 분석하는 경우 등에서 선형회귀가 사용된다.</p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/b267bf61-eb7d-4304-a65d-ffcfa4cf504b/image.png" alt=""></p>
<p>위의 그림과 같이 세 개의 점이 주어져있다고 하자. 선형회귀에서는 파란색으로 표시된 오차의 제곱의 합을 최소로 하는 f(x)를 찾는 것을 목표로 한다. 이때, 오차의 제곱인 (y - f(x))^2 의 총합을 일반화한 식은 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/75a73d91-e665-4ee9-a871-fa8446206cc2/image.png" alt=""></p>
<p>이 Loss를 최소로 만드는 W값과 b값을 구하기 위한 방법이 바로 Gradient Descent(경사하강법)이다.</p>
<h2 id="gradient-descent-경사하강법">Gradient Descent (경사하강법)</h2>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/f845fc8c-d37d-492b-bb5a-adf2e6202dae/image.png" alt=""></p>
<p>경사하강법은 반복을 통한 최적화 알고리즘이다. 미분값에 반대 부호를 붙여 기울기의 반대 방향으로 이동함으로써 기울기가 0인 지점으로 수렴하는 것이 목적인 알고리즘이다. 이때 γ_w와 γ_b는 Learning Rate이라고 한다.</p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/1cf8f559-87e2-40ab-b0c8-1d2fb4b7d94a/image.png" alt=""></p>
<p>위의 그림에서 확인할 수 있다시피, Starting point에서 출발하여 기울기의 반대방향으로 계속 이동하다보면 언젠가는 기울기가 0인 지점에 수렴한다는 것이 경사하강법의 아이디어이다.</p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/b45239af-3aee-4658-b86b-7be6c72c4def/image.png" alt=""></p>
<p>Learning Rate는 Hyper Paramenter로서, 우리가 직접 튜닝해줘야 하는 파라미터이다. Learning Rate가 너무 작으면 최저점을 찾는데 너무 오래 걸리고, Learning Rate가 너무 크면 최저점으로 수렴하지 못하고 발산할 수 있기 때문에 적절한 Learning Rate를 설정하는 것이 결과에 지대한 영향을 준다고 한다.</p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/6aad7e79-0fa9-4d47-936e-c1140e0ad622/image.png" alt=""></p>
<p>이러한 경사하강법은 Global minimun에 도달하지 못한 채 Local minimun에 수렴해 갇혀버리는 경우가 대부분인데, 이것만으로도 충분히 유의미한 결과를 도출할 수 있다고 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[기계학습심화 - 0. Intro]]></title>
            <link>https://velog.io/@0_lingual/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5%EC%8B%AC%ED%99%94</link>
            <guid>https://velog.io/@0_lingual/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5%EC%8B%AC%ED%99%94</guid>
            <pubDate>Mon, 15 Apr 2024 07:20:26 GMT</pubDate>
            <description><![CDATA[<h2 id="velog를-쓰게-된-계기">Velog를 쓰게 된 계기</h2>
<p>작년 한 해 동안 Django를 이용한 백엔드 개발과 iOS 앱 개발 등 진로 탐색을 위해 열중했지만, 기록의 필요성을 알지 못해 기억이 빠르게 휘발되는 것을 느꼈다. 늦었다고 생각했을 때가 가장 빠르다는 생각으로 지금부터 배우는 것들은 확실하게 내 것으로 만들고자 Velog를 시작하게 되었다.</p>
<p>AI와 딥러닝이라는 키워드는 이제 더 이상 미래의 이야기가 아닌 현재의 이야기가 되었다. 특히, OpenAI 사의 ChatGPT 3.5 공개를 기점으로 LLM의 상용화가 급속도로 이루어지면서 사람들의 삶의 방식이 많이 달라진 것을 체감할 수 있다. 이러한 배경에서 미래에 무슨 일을 하던 간에 AI가 무엇인지 정확히 이해하고 잘 사용할 줄 알아야만 한다는 필요성을 느끼게 되었고, 이에 따라 기계학습심화 과목을 수강신청하여 수강하게 되었다. 한 학기 동안 수강하며 알게 된 것들을 정리하며 복습하고자 한다.</p>
<h2 id="ai-ml-cv-dl-이란">AI, ML, CV, DL 이란?</h2>
<p>AI(Artificial Intelligence), ML(Machine Learning), CV(Computer Vision), DL(Deep Learing) 등의 용어들은 지난 방학 동안 무료 강의들을 통해 데이터분석을 학습하며 한 번씩은 들어봤던 것들이다. 하지만, 각각의 뜻과 서로 무엇이 다른지 정확히 설명하라고 하면 자신이 없었다.
<img src="https://velog.velcdn.com/images/0_lingual/post/1307a33f-3fa1-47d1-adc6-64d54d028d9d/image.png" alt="">
AI(Artificial Intelligence)는 말 그대로 사람의 지능을 모방하는 모든 것을 통칭한다. CV(Computer Vision)는 사람의 눈을 모방하고자 만든 것으로, 이미지 인식 등에 사용된다. ML(Machine Learning)은 AI를 구현하는 방법론이다. 이때 AI 구현 방법은 데이터를 통한 학습으로 이루어진다. DL(Deep Learing)은 ML에 속하면서 CV와도 겹치는 것으로, ML의 일부이다. 이 강의에서는 DL 중 CV와의 교집합에 포함되는 영역 즉, &#39;딥러닝을 활용해서 컴퓨터비전 문제를 푸는 것&#39;에 대해 주로 다룬다.</p>
<h2 id="활용-분야">활용 분야</h2>
<p>이 강의에서 다루는 분야의 활용 분야에 대해 알아보자. 자율주행, 공장 자동화, 얼굴 인식, 생체 인식 시스템, 문서 인식, 문자 인식, 사물 인식, 의료 진단, 언어 모델(ex. ChatGPT) 등 이미 셀 수 없이 많은 분야에서 사용되고 있다.</p>
<h2 id="기계를-어떻게-학습시킬까">기계를 어떻게 학습시킬까?</h2>
<h3 id="기계가-인식하는-데이터">기계가 인식하는 데이터</h3>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/a768e056-b22c-436b-a323-27e4c14b2579/image.png" alt=""></p>
<p>컴퓨터 입장에서 데이터는 숫자의 모음일 뿐이다. 이미지 데이터는 픽셀의 RGB 값이다. 위의 그림에서처럼, 인간의 눈을 통해 2D 이미지로 인식되는 저것은 컴퓨터에게는 단지 픽셀의 RGB 값들의 집합일 뿐이다.</p>
<h3 id="rule-based-방식과-mldl-방식">Rule-based 방식과 ML/DL 방식</h3>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/3537cbd6-638b-45d0-9c57-ec3561ff284c/image.png" alt=""></p>
<p>논리 구조에 따라 선택되는 Rule-based 방식과는 다르게, ML/DL 방식은 데이터를 이용한 학습을 통해 정립된 함수 계산을 통해 결과를 도출한다. 위의 도식을 보면, 머신러닝 과정에는 조건식에 따른 분기가 없는 것을 확인할 수 있다. ML/DL의 복잡한 결과 도출 과정은 아래 그림을 통해 이해할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/0_lingual/post/640fd09f-f329-470a-876f-8a7a3da2cbde/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>