<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dongwxxkchoi</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 18 Jan 2023 05:21:27 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dongwxxkchoi</title>
            <url>https://images.velog.io/images/dongwook-98/profile/d8afb5d3-5442-4bf5-ba55-a6a7c96cb65f/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dongwxxkchoi. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dongwook-98" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Deeper Look at Gradient Descent]]></title>
            <link>https://velog.io/@dongwook-98/Deeper-Look-at-Gradient-Descent</link>
            <guid>https://velog.io/@dongwook-98/Deeper-Look-at-Gradient-Descent</guid>
            <pubDate>Wed, 18 Jan 2023 05:21:27 GMT</pubDate>
            <description><![CDATA[<p>본 포스트는 [모두를 위한 딥러닝 시즌2] 강의를 기반으로 작성하였습니다.</p>
<h3 id="linear-regression---hypothesis">Linear Regression - Hypothesis</h3>
<p>지난 번에 살펴 본 Linear Regression H(x)는 input, weight, 그리고 bias로 이루어진 식이었습니다. 이번엔, Gradient Descent에 대해 쉽게 알아보기 위해, bias가 없다고 가정한 더 간단한 Simpler Hypothesis Function을 사용하겠습니다.</p>
<p><img src="https://velog.velcdn.com/images/dongwook-98/post/0d1458b3-8d8d-4855-bd00-3cd3e0bc18c7/image.png" alt=""></p>
<h3 id="data">Data</h3>
<p><img src="https://velog.velcdn.com/images/dongwook-98/post/c43046b0-74a3-4c33-b695-f458695614a9/image.png" alt=""></p>
<h3 id="cost-function">Cost function</h3>
<p>위 data에 대해서 최적의 H(X)는 w가 1일 때 즉, </p>
<pre><code>H(X) = x 일 때이다.</code></pre><p>Cost function으로는 MSE 방식을 사용할 것입니다.
<img src="https://velog.velcdn.com/images/dongwook-98/post/c628c15e-f090-431e-8065-7ff2e5b03801/image.png" alt=""></p>
<h3 id="gradient-descent">Gradient Descent</h3>
<p>cost function을 통해 나온 cost 값을 최소화 하는 것이 우리의 목적입니다. </p>
<p>w가 1일 때, w와 cost의 관계를 그래프로 나타내면 아래의 그림과 같습니다.</p>
<p>우리는 이 함수의 그래프 상에서 cost가 가장 작아지는 지점으로 가야 하는데, 다시 말해 해당 지점에서의 기울기가 작아지는 방향으로 w를 update하는 방법이라고 할 수 있습니다. </p>
<p><img src="https://velog.velcdn.com/images/dongwook-98/post/0706430d-c44c-42c8-962e-03e8d9b28c26/image.png" alt=""></p>
<p>기울기를 구하기 위해선 미분을 해야 합니다. cost function의 해당 지점에서의 미분계수를 구합니다. 이 값과 얼마나 update 할 지를 결정하는 α (Learning rate)를 곱해 W에 반영합니다. </p>
<p><img src="https://velog.velcdn.com/images/dongwook-98/post/d3a3dec8-cace-45b2-9e13-f583730b5e2a/image.png" alt=""></p>
<p>코드로 구현하면 다음과 같습니다.</p>
<pre><code>gradient = 2 * torch.mean((W * x_train - y_train) * x_train)
lr = 0.1 (α)
W -= lr * gradient</code></pre><h3 id="정리">정리</h3>
<p>다음과 같이 torch 코드를 작성할 수 있습니다.</p>
<pre><code>x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[1], [2], [3]])
W = torch.zeros(1)
lr = 0.1

nb_epochs = 10
for epoch in range(nb_epochs + 1):
    hypothesis = x_train * W

    cost = torch.mean((hypothesis-y_train)**2)
    gradient = torch.sum((W * x_train - y_train) * x_train)

    print(&#39;Epoch {:4d}/{} W: {:.3f}, Cpst: {:.6f}&#39;.format(epoch, nb_epochs, W.item(), cost.item()))

       W -= lr * gradient</code></pre><p><img src="https://velog.velcdn.com/images/dongwook-98/post/52fe50c4-b3ce-4028-ba36-7c9685c45e75/image.png" alt=""></p>
<h3 id="torchoptim">torch.optim</h3>
<p>우리는 위에서 gradient를 직접 구현했지만, torch에는 이를 도와주는 optimizer 라이브러리가 존재한다.
<img src="https://velog.velcdn.com/images/dongwook-98/post/d5976668-6cce-417b-a09e-e301a6ad52db/image.png" alt=""></p>
<pre><code>x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[1], [2], [3]])
W = torch.zeros(1)

optimizer = optim.SGD([W], lr=0.1)

nb_epochs = 10
for epoch in range(nb_epochs + 1):
    hypothesis = x_train * W

    cost = torch.mean((hypothesis-y_train)**2)

    print(&#39;Epoch {:4d}/{} W: {:.3f}, Cpst: {:.6f}&#39;.format(epoch, nb_epochs, W.item(), cost.item()))

    optimizer.zero_grad()
    cost.backward()
    optimizer.step()

       # W -= lr * gradient
    # 이 부분이 빠집니다. 자동으로 W update가 이뤄집니다.</code></pre><h3 id="whats-next">What&#39;s Next?</h3>
<p>다음부터는 여러 개의 정보에서 한 값을 예측해 볼 겁니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Linear Regression]]></title>
            <link>https://velog.io/@dongwook-98/Linear-Regression</link>
            <guid>https://velog.io/@dongwook-98/Linear-Regression</guid>
            <pubDate>Wed, 18 Jan 2023 02:52:24 GMT</pubDate>
            <description><![CDATA[<p>본 포스트는 [모두를 위한 딥러닝 시즌2] 강의를 기반으로 작성하였습니다.</p>
<h2 id="linear-regression">Linear Regression</h2>
<p>머신러닝에 대해 공부하다 보면, 가장 먼저 나오는 개념이 바로 Linear Regression(선형 회귀)입니다. Linear Regression이란 여러 개의 학습 데이터들이 있다고 할 때, 그 학습 데이터들을 가장 잘 나타낼 수 있는 하나의 직선을 찾는 방법입니다. </p>
<h2 id="hypothesis">Hypothesis</h2>
<p>이 직선은 아래의 식 처럼 나타낼 수 있습니다.
<img src="https://velog.velcdn.com/images/dongwook-98/post/9b81442c-3247-4756-b22f-3b09ff12a472/image.png" alt=""></p>
<p>여기서 입력값 x에 곱해지는 W를 weight, 더해지는 b를 bias라고 합니다. 우리는 반복되는 기계 학습을 통해서, 데이터들을 잘 나타내는 W와 b를 찾아야 합니다.</p>
<h2 id="loss">loss</h2>
<p>여기서 의문이 듭니다. 데이터를 잘 나타낸 다는 것을 어떻게 알 수 있을까? 기계 학습에서는 loss function(손실 함수)을 통해 확인할 수 있습니다. </p>
<h4 id="sse-sum-squared-error">SSE (Sum Squared Error)</h4>
<p>그 중 가장 간단한 방법이 단순히 실제 값에서 예측 값을 빼서 제곱하는 방법입니다. 이 값들을 모두 더해 평가하는 방법을 SSE(Sum Squared Error)라고 합니다. 
이 방식의 문제점은 값이 큰 이유를 알 수 없다는 것이다. 데이터의 양이 많아서인지, 데이터의 오차가 커서인지를 알 수 없습니다.</p>
<h4 id="mse-mean-sqaured-error">MSE (Mean Sqaured Error)</h4>
<p>그래서 나온 방법이 MSE 방법입니다. 평균을 구하기 때문에, 위에 나온 문제점을 해결할 수 있습니다.
<img src="https://velog.velcdn.com/images/dongwook-98/post/ff8e99fd-ae70-43ec-90dd-fddd862e5436/image.png" alt=""></p>
<p>Pytorch를 통해 구현한다면,</p>
<pre><code>torch.mean((hypothesis - y_train) ** 2) 
# 직접 구현
torch.nn.MSELoss(size_average=None, reduce=None, reduction=&#39;mean&#39;)
# 내장 라이브러리</code></pre><p>처럼 사용할 수 있습니다.</p>
<h2 id="gradient-descent">Gradient Descent</h2>
<p>loss function을 통해 loss를 구했다면, 그 loss를 줄이기 위해 모델을 개선해야 합니다. 가장 대표적인 방법이 Gradient Descent(경사하강법)입니다. 
미분을 통해 loss function의 기울기를 계산해서 기울기가 0이 되는 방향으로 learning rate 만큼 weight와 bias를 이동시킵니다.
torch.optim 라이브러리를 사용하면, 모델 개선 optimizer를 이용할 수 있습니다. 가장 유명한 SGD를 사용해 보겠습니다.</p>
<pre><code>hypothesis = x_train * W + b

cost = torch.mean((hypothesis - y_train) ** 2)
# 또는 cost = torch.nn.MSELoss()

optimizer = optim.SGD([W, b], lr=0.01)

optimizer.zero_grad() # gradient 초기화
cost.backward() # gradient 계산
optimizer.step() # 모델 개선</code></pre><h2 id="정리">정리</h2>
<p>과정을 정리하면 다음과 같습니다.</p>
<ol>
<li>데이터 정의</li>
<li>Hypothesis 초기화</li>
<li>Optimizer 정의</li>
<li>Hypothesis 예측</li>
<li>Cost 계산</li>
<li>Optimizer로 학습
(4~6 반복)</li>
</ol>
]]></description>
        </item>
    </channel>
</rss>