사용자:CrMT/연습장/1 편집하기

이 문서는 리브레 위키의 사용자 문서이며, 일반적인 항목이 아닙니다.

리브레 위키의 정책에 따라, 이 문서에는 블로그, 이메일 주소, SNS 계정 등의 개인정보 및 친목 관련 요소가 있는 외부 사이트의 언급과 링크 노출이 금지됩니다. 또한, 이 문서에서는 다른 사용자를 언급해서는 안 됩니다.


편집하면 당신의 IP 주소가 공개적으로 기록됩니다. 계정을 만들고 로그인하면 편집 시 사용자 이름만 보이며, 위키 이용에 여러 가지 편의가 주어집니다.

편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.

최신판 당신의 편집
153번째 줄: 153번째 줄:
머신 러닝은 꾸준한 학습(경험)을 통해 점점 성능을 나아지게 하는 프로그램입니다. 머신 러닝은 크게 세 가지로 나눌 수 있는데, 다음과 같습니다.
머신 러닝은 꾸준한 학습(경험)을 통해 점점 성능을 나아지게 하는 프로그램입니다. 머신 러닝은 크게 세 가지로 나눌 수 있는데, 다음과 같습니다.
===Supervised Learning===
===Supervised Learning===
사람이 어떤 함수의 데이터와 결괏값을 몇 개 입력하면, 컴퓨터가 그것을 보고 사람이 의도한 함수에 매우 가까운 '''가설 함수'''(hypothesis)를 알아맞히는 방법입니다. 이때 식을 줄 수도 있고([[회귀]] 등), 아니면 다른 데이터를 넣었을 때의 결괏값을 줄 수도 있습니다([[분류]] 등). 예를 들어, ([[선형 회귀]])
사람이 어떤 함수의 데이터와 결과값을 몇 개 입력하면, 컴퓨터가 그것을 보고 사람이 의도한 함수에 매우 가까운 '''가설 함수'''(hypothesis)를 알아맞히는 방법입니다. 이때 식을 줄 수도 있고([[회귀]] 등), 아니면 다른 데이터를 넣었을 때의 결과값을 줄 수도 있습니다([[분류]] 등). 예를 들어, ([[선형 회귀]])
: (x, y) = (3, 7), (6, 8), (9, 9)
: (x, y) = (3, 7), (6, 8), (9, 9)
라는 세 개의 데이터(x)와 결괏값(y)을 주었고, 가설 함수가
라는 세 개의 데이터(x)와 결과값(y)을 주었고, 가설 함수가
: <math>H(x) = wx + b, \qquad</math>'''H'''ypothesis, '''w'''eight, '''b'''ias
: <math>H(x) = wx + b, \qquad</math>'''H'''ypothesis, '''w'''eight, '''b'''ias
의 모양, 즉 [[일차식]]으로 주어졌다고 합시다. 그러면 컴퓨터는 w와 b를 바꾸어 가면서, 가설 함수와 데이터 사이의 차이를 최소화합니다. 최소화 과정을 거치면 컴퓨터는 다음의 결과를 낼 것입니다(약간의 오차는 있을 수 있습니다.):
의 모양, 즉 [[일차식]]으로 주어졌다고 합시다. 그러면 컴퓨터는 w와 b를 바꾸어 가면서, 가설 함수와 데이터 사이의 차이를 최소화합니다. 최소화 과정을 거치면 컴퓨터는 다음의 결과를 낼 것입니다(약간의 오차는 있을 수 있습니다.):
163번째 줄: 163번째 줄:
단지 데이터(x)만을 줍니다. 이때 컴퓨터는 주어진 데이터를 비슷한 것끼리 모으는 '''군집화'''를 할 수도 있고, 더 나아가 그 데이터의 분포를 맞히는 '''분포 추정'''을 할 수도 있습니다.
단지 데이터(x)만을 줍니다. 이때 컴퓨터는 주어진 데이터를 비슷한 것끼리 모으는 '''군집화'''를 할 수도 있고, 더 나아가 그 데이터의 분포를 맞히는 '''분포 추정'''을 할 수도 있습니다.
=== Reinforcement Learning===
=== Reinforcement Learning===
위 둘과 다르게, '''강화 학습'''은 현 상태를 보고 어떤 행동을 해야 좋을지를 판단합니다. 현 상태('''state''')에서 컴퓨터가 어떤 행동('''Action''')을 취하면 그에 따른 점수('''Result''', 보상)가 매겨집니다. 컴퓨터는 이 보상을 최대화하려고 다음에 어떤 행동을 해야 할 것인지 판단하는 정책('''Policy''')를 세웁니다. 예를 들어, [[자율 운전]]은 강화 학습의 예입니다. 사람이 운전하듯이, 자율주행 차량에 주어지는 데이터(state)는 카메라 영상이며, 이것으로 얼마나 앞에 무엇이 있는지를 판단합니다. 간단한 설명을 위해 왼쪽(-30도), 앞쪽(0도), 오른쪽(30도)으로의 세 거리를 측정할 수 있다고 합시다. 그리고 그 결괏값이[[파일:MLRun.png.png|섬네일]]
위 둘과 다르게, '''강화 학습'''은 현 상태를 보고 어떤 행동을 해야 좋을지를 판단합니다. 현 상태('''state''')에서 컴퓨터가 어떤 행동('''Action''')을 취하면 그에 따른 점수('''Result''', 보상)가 매겨집니다. 컴퓨터는 이 보상을 최대화하려고 다음에 어떤 행동을 해야 할 것인지 판단하는 정책('''Policy''')를 세웁니다. 예를 들어, [[자율 운전]]은 강화 학습의 예입니다. 사람이 운전하듯이, 자율주행 차량에 주어지는 데이터(state)는 카메라 영상이며, 이것으로 얼마나 앞에 무엇이 있는지를 판단합니다. 간단한 설명을 위해 왼쪽(-30도), 앞쪽(0도), 오른쪽(30도)으로의 세 거리를 측정할 수 있다고 합시다. 그리고 그 결과값이[[파일:MLRun.png.png|섬네일]]
: (L, F, R) = (200, 100, 50)
: (L, F, R) = (200, 100, 50)
이었다고 해 봅시다. 예를 들어 다음 그림과 같은 상황이 됩니다.  
이었다고 해 봅시다. 예를 들어 다음 그림과 같은 상황이 됩니다.  
276번째 줄: 276번째 줄:


# W가 1행 len(x_data)열인 이유는 내적 여러 개를 행렬곱으로 계산하기 위함입니다.
# W가 1행 len(x_data)열인 이유는 내적 여러 개를 행렬곱으로 계산하기 위함입니다.
#                        [[_, _, _, _, _],
# W * x_data = [[_, _]] [[_, _, _, _, _], = [_, _, _, _, _]
# W * x_data = [[_, _, _]] [_, _, _, _, _], = [_, _, _, _, _]
#                       [_, _, _, _, _]]
#                         [_, _, _, _, _]]


X = tf.placeholder(tf.float32)
X = tf.placeholder(tf.float32)
319번째 줄: 318번째 줄:


== 간단한 분류 모델 ==
== 간단한 분류 모델 ==
주어진 데이터가 어떤 분류에 속하는지를 컴퓨터에게 가르쳐 보려 합니다. 즉, 'C1, C2, ...,위 Ck'라는 분류가 있을 때, 주어진 (n차원) 데이터 x가 어떤 분류에 속하는지를 알아보고 싶습니다. 하지만, 위(선형 회귀)에서 얻은 결괏값 y는 실숫값입니다. 우리는 이 실숫값을 '''분류에 속하는지 아닌지'''의 YES/NO로 바꾸어야 합니다. 즉, 결괏값은 0과 1로만 이루어진 k차원 벡터가 됩니다. 만약 이 분류들이 겹치지 않는다고 가정하면(mutually disjoint), 그 벡터는 단 한 성분에서만 1이고 나머지는 0인 '''one hot''' 방식의 벡터가 됩니다.
주어진 데이터가 어떤 분류에 속하는지를 컴퓨터에게 가르쳐 보려 합니다. 즉, 'C1, C2, ...,위 Ck'라는 분류가 있을 때, 주어진 (n차원) 데이터 x가 어떤 분류에 속하는지를 알아보고 싶습니다. 하지만, 위(선형 회귀)에서 얻은 결괏값 y는 실숫값입니다. 우리는 이 실숫값을 '''분류에 속하는지 아닌지'''의 YES/NO로 바꾸어야 합니다. 즉, 결괏값은 0과 1로만 이루어진 k차원 벡터가 됩니다. 만약 이 분류들이 겹치지 않는다고 가정하면(mutually disjoint), 그 벡터는 단 한 성분에서만 1이고 나머지는 0인 '''one-hot''' 방식의 벡터가 됩니다.


가장 합리적인 변환은, '''제일 큰 값만 살려두기'''입니다. 즉 결과 벡터 y를 각 분류에 들어가는 정도(들어갈 확률)로 한 후에, 가장 그 확률이 높은 분류를 정답으로 택합니다. 이때 사용하는 함수는 '''softmax'''입니다.
가장 합리적인 변환은, '''제일 큰 값만 살려두기'''입니다. 즉 결과 벡터 y를 각 분류에 들어가는 정도(들어갈 확률)로 한 후에, 가장 그 확률이 높은 분류를 정답으로 택합니다.
:<math>\mathrm{softmax} ~ S(y_i) = \frac{e^{y_i}}{\sum_j e^{y_j}}</math>
:<math>\mathbf y = \begin{bmatrix}\mathrm P(\mathbf x \in C_1) \\ \mathrm P(\mathbf x \in C_2) \\ \vdots \\ \mathrm P(\mathbf x \in C_k)\end{bmatrix} \xrightarrow{\mathrm{argmax}}  \begin{bmatrix}\mathrm 0 \\ \vdots \\ 1 \\ \vdots \\ 0\end{bmatrix} </math>
:<math>\mathbf y = \begin{bmatrix}\mathrm P(\mathbf x \in C_1) \\ \mathrm P(\mathbf x \in C_2) \\ \vdots \\ \mathrm P(\mathbf x \in C_k)\end{bmatrix} \xrightarrow{\mathrm{softmax}}\xrightarrow{\mathrm{argmax}}  \begin{bmatrix}\mathrm 0 \\ \vdots \\ 1 \\ \vdots \\ 0\end{bmatrix} </math>
 
Loss function은 어떻게 해야 할까요? 이전의 least square 방식을 쓰면 (softmax에 지수함수가 있어서) 볼록하지 않아지고, 즉 여러 optimizer를 쓰기 곤란해집니다. 이럴 때 쓰는 것이 로그가 포함된 '''cross entropy'''라고 하는 함수입니다.
:<math>\displaystyle H(p,q)=\operatorname {E} _{p}[-\log q] = -\sum _{x}p(x)\,\log q(x).</math>
텐서플로우에서는 <code>tf.nn.softmax_cross_entropy_with_logits(logits=hypothesis, labels=Y)</code>라는 메서드가 준비되어 있습니다. 이것은 어떤 데이터가 각 분류에 들어갈 확률을 의미합니다. 이것이 의도된 출력값 y와 차이가 적을수록 잘 학습이 된 것이니, 이것을 loss function으로 쓰면 됩니다. 즉,<syntaxhighlight lang="python">cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=hypothesis, labels=Y))
optimizer = tf.train.{{some optimizer}}({{learning rate}}).minimize(cost)</syntaxhighlight>으로 구현합니다.
=== MNIST ===
가장 많이 쓰이는 분류 예제는 '''MNIST'''입니다. 손으로 쓴 숫자를 인식하는 모델로, '''28x28 = 784''' 픽셀의 숫자 이미지를 인식합니다.
 
[[파일:MNIST.png]]
 
MNIST 데이터는 <syntaxhighlight lang="python">from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./mnist/data/", one_hot=True)</syntaxhighlight>로 받아옵니다. 가설 함수는 그냥 선형(Y = XW)으로 두고 학습시켜 봅시다.
 
데이터를 학습할 때에, '''batch'''라는 묶음 단위로 한꺼번에 학습을 합니다. mnist.train.num_examples는 데이터의 총 개수이고, 한 batch 당의 데이터 개수로 나눠주면 이 batch가 몇 개 있는지 알아낼 수 있습니다. 물론 그 반대도 가능합니다.
 
<syntaxhighlight lang="python">import tensorflow as tf
 
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./mnist/data/", one_hot=True)
 
X = tf.placeholder(tf.float32, [None, 784]) # 784 pixel의 이미지를 가져와서
Y = tf.placeholder(tf.float32, [None, 10]) # 0~9의 10 개 성분을 가진 one hot 벡터로 출력합니다.
 
W = tf.Variable(tf.random_normal([784, 10], stddev=0.01))
 
hypothesis = tf.matmul(X, W)
 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=hypothesis, labels=Y))
optimizer = tf.train.AdamOptimizer(0.001).minimize(cost) # Adam optimizer를 사용해 보겠습니다.
 
##### 학습 #####
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
 
    batch_size = 100
    total_batch = int(mnist.train.num_examples/batch_size)
 
    for epoch in range(15):
        total_cost = 0
 
        for i in range(total_batch):
            # 텐서플로우 mnist 모델의 next_batch 함수로 batch를 가져옵니다.
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            sess.run(optimizer, feed_dict={X: batch_xs, Y: batch_ys})
            total_cost += sess.run(cost, feed_dict={X: batch_xs, Y: batch_ys})
 
        print('Epoch:', '%04d' % (epoch + 1),\
              'Avg. cost =', '{:.3f}'.format(total_cost / total_batch))
 
    print('Optimization completed.')
 
    ##### 정확도 확인 #####
    # 가장 확률이 높은 것과 실제 데이터를 비교합니다. 이때 == 대신 tf.equal을 쓰는 것이 추천됩니다.
    check_prediction = tf.equal(tf.argmax(hypothesis, 1), tf.argmax(Y, 1))
    accuracy = tf.reduce_mean(tf.cast(check_prediction, tf.float32))
 
    print('Accuracy:', sess.run(accuracy, feed_dict={X: mnist.test.images, Y: mnist.test.labels}))</syntaxhighlight>
 
{|class="wikitable" style="width:100%!important"
|+ batch 크기에 따른 정확도(차이가 있을 수 있음)
|-
! batch_size
| 1 || 10 || 100 || 1000
|-
! accuracy
| 0.9213 || 0.9266 || 0.9261 || 0.8558
|}
 
== ConvNet ==
리브레 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스로 배포됩니다(자세한 내용에 대해서는 리브레 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
글이 직접 작성되었거나 호환되는 라이선스인지 확인해주세요. 리그베다 위키, 나무위키, 오리위키, 구스위키, 디시위키 및 CCL 미적용 사이트 등에서 글을 가져오실 때는 본인이 문서의 유일한 기여자여야 하고, 만약 본인이 문서의 유일한 기여자라는 증거가 없다면 그 문서는 불시에 삭제될 수 있습니다.
취소 편집 도움말 (새 창에서 열림)

| () [] [[]] {{}} {{{}}} · <!-- --> · [[분류:]] · [[파일:]] · [[미디어:]] · #넘겨주기 [[]] · {{ㅊ|}} · <onlyinclude></onlyinclude> · <includeonly></includeonly> · <noinclude></noinclude> · <br /> · <ref></ref> · {{각주}} · {|class="wikitable" · |- · rowspan=""| · colspan=""| · |}

이 문서에서 사용한 틀:

이 문서는 다음의 숨은 분류 1개에 속해 있습니다: