레이블이 AI인 게시물을 표시합니다. 모든 게시물 표시
레이블이 AI인 게시물을 표시합니다. 모든 게시물 표시

2019년 8월 1일 목요일

Convolution vs Cross-correlation


   참조
https://tensorflow.blog/2017/12/21/convolution-vs-cross-correlation/

Andrew Ng CNN

이 글은 위 강의와 게시글을 참조하여 개인적으로 정리한 글입니다.

   Convolution VS Cross-correlation

CNN(Convolutional Neural Network)에서 사용되는 convolution 연산은 수학에서 의미하는 convolution 연산과 다르다.

CNN에서 사용하는 convolution 연산은 실제로 cross-correlation이라 부르고, 연산 행렬과 피연산 행렬의 같은 위치의 값들을 각각 곱한 후 모두 더한 값을 출력으로 낸다.


수학에서 의미하는 convolution 연산은 조금 달리 연산 행렬의 가로행과 세로행을 바꾼 후 값들을 각각 곱하고 모두 더하는 연산을 한다.
가로행과 세로행을 바꾸는 부분을 넣지 않아도 실제 연산결과와 크게 차이가 없기 때문에 그 과정을 생략한 후 계산하지만 Machine Learning 에서는 통상적으로 Convolutional neural network라고 부른다.


2019년 4월 9일 화요일

[세미나 발표] Logistic Regression Classification


   참조
아래의 게시글은 모두의 딥러닝 강의를 참조하여 재가공한 글입니다.

   Classification이란?

Classification은 Supervised Learning의 일종이다. 학습을 위해 이미 분류된 데이터를 주는데, 이 데이터를 기반으로 데이터의 Category 관계를 파악한다.

주어진 데이터로 학습을 완료한 후에는 새롭게 주어진 데이터를 Category에 분류할 수 있게 된다.


  • Spam Email Detection: Spam (1) or Ham (0)
  • Facebook feed: Show (1) or hide (0)
  • Credit Card Fraudulnet Transaction Detection: Legitimate (1) or Fraud (0)

   Logistic Regression Classification
어떻게 Classification 할 것인가?
그렇다면 Logistic Regression Classification은 어떻게 그룹을 나눈다는 것일까? 우선 가장 간단한 모델인 Linear 모델을 통해 Classification하면서 생각해보자.

위와 같은 데이터가 주어졌다고 가정하고, 이 데이터를 Classification해보자. Linear한 모델을 통해 Classification한다면 다음과 같은 모델을 예상할 수 있을 것이다.

2개의 그룹으로 데이터를 나눠야 하기 때문에 y축을 절반으로 나눌 수 있는 값을 0.5로 정하면 데이터를 두 그룹으로 나누는 x축의 값을 구할 수 있다. 이제 이 모델을 사용하여 데이터가 0그룹에 속하는지 1그룹에 속하는지 데이터의 hours의 값으로 구분할 수 있게 되었다.

이 모델은 얼핏 완성된 것처럼 보이지만, Linear 모델은 한계를 가진다. 새로운 데이터 가 들어왔을 때를 살펴보자.
현재까지 학습된 모델은 새로운 데이터와 맞지 않으니 새로운 데이터를 포함할 수 있는 모델을 다시 학습해야 한다.
새로운 데이터를 포함한 새로운 모델을 만들었으나 문제가 생긴다. 이전에 1에 속했던 데이터들이 더 이상 1그룹에 속하지 못하게 되었다.

이 예시는 다소 비약적일 수 있으나 Linear 모델의 한계를 잘 보여주는 예시이다. 위의 예시에서 볼 수 있는 문제 외에도 Linear 모델의 경우 학습한 데이터의 범위를 넘어가는 경우가 생길 수 있기 때문에 문제가 생길 수 있다.

Logistic Regression
그런 Linear한 모델의 한계점을 보완하기 위해 사용할 수 있는 방법중 하나가 Logistic Regression이다.

Logistic Regression은 통계 기법으로 일종의 확률 모델으로(로지스틱의 자세한 사항은 이 블로그가 도움되더라.) 아래 그림과 같은 모양을 가진다.


Logistic Regression Classification
Logistic Regression Classification은 Linear 모델을 Logistic Regression을 지나도록 하려 Non-Linear하게 만들어 Linear 모델의 한계점을 보완한 Classification을 말한다.

Linear 모델에 Logistic Regression만 추가하여 사용하면 좋겠지만, Linear 모델에 Logistic Regression만 추가하면 문제가 생긴다.

머신러닝은 문제를 해결하는데 최적의 weight 값을 찾아가는 과정이다. 그렇기 때문에 cost(비용, err값)을 구하고 구한 cost를 통해 weight값을 수정하는 과정이 필수적이다.

그래서 Linear 모델에 Logistic Regression을 추가시킨 후에도 cost를 구하고 weight를 수정해야 한다. Linear Regression에서 사용한 Cost Function은 아래 그림과 같다.
이 그래프의 장점은 Convex하다는 것이다. Convex한 함수는 처음 시작 지점이 어디든 최저점을 찾을 수 있는 매우 편리한 그래프라는 것이다.

Linear Regression에서 사용한 Cost Function은 Convex한 그래프이지만 Logistic Regression을 사용한 모델의 Cost Function은 Convex한 모양을 유지하지 못한다.
그렇기 때문에 Logistic Classification은 Cost Function을 변형하여 사용한다.




2019년 1월 28일 월요일

[인공지능을위한머신러닝알고리즘] Lab 2

   개요
강의(질문) - 복습(필기) - 자료화

출처

https://www.youtube.com/watch?v=DHYLMwqa9oc&t=5s

학습목표

  • 선형 회귀의 분류 원리에 대해 이해할 수 있다.
  • 선형 회귀의 모델 파라미터를 계산할 수 있다.
  • 모델이 가정하고 있는 선형성에 대해서 이해할 수 있다.

   선형 회귀 모델

회귀 모델의 정의

  • 한 개의 종속 변수(dependent variable)와 설명 변수들(explanatory variable(s))과의 관계를 모델링
    • 종속 변수, 설명 변수에 따라 값이 달라지는 결과 변수
    • 설명 변수, 원인이 되는 변수
    • ex) 설명 변수: 겨울철 강수량, 재배철 평균 기온, 수확기 강수량
           종속 변수: 와인품질
  • 종속 변수와 설명 변수들의 관계를 정의하기 위해 방정식 사용
    • 수치적(numerical) 종속 변수
    • 한 개 또는 그 이상의 수치적 설명 변수
  • 예측 & 추정 시에 사용
    • 설명 변수들이 수치값을 갖고 회귀 분석 모델을 통해서 종속 변수를 알아내는 과정을 예측, 추정이라 함

회귀 모델의 종류들



선형성이란
어느 변수들 사이의 관계를 1차 방정식의 관계로 나타낼 수 있다면 선형성을 띄고 있다고 볼 수 있다.

변수들 사이의 관계 - 선형 함수

회귀 모델의 예측 대상
종속 변수는 설명 변수에 따라서 다양한 값을 가질 수 있다. 와인의 등급을 예측하는 예를 통해 선형 회귀 모델을 만드는 방법을 알아보자.

회귀 모델을 만들기 위해서는 데이터를 측정해야 한다. 와인의 등급을 예측하기 위한 모델을 만들기 위해서는 와인, 와인의 등급, 와인이 만들어진 시기의 강수량, 기온, 토양의 질 등 다양한 정보를 수집해야 한다.

이 때, 우리가 볼 수 있는 모든 와인과 등급을 모집단(참값)이라고 한다. 그리고 그 중 우리가 모을 수 있는 일부의 와인과 등급을 무작위 샘플(관측 값)이라고 한다.

와인의 등급을 결정짓는 실제 규칙이 존재한다고 가정할 때, 우리가 구하고자 하는 모델이 그 실제 규칙을 나타내는 함수라고 할 수 있다. 와인의 등급을 매기는 실제 규칙이 존재하더라도 와인 감별사에 의해 등급이 달라질 수 있는데 이를 규칙에 반영하기 위해 무작위 에러(노이즈)값을 지정한다.

우리는 무작위 샘플을 통해 실제 규칙과 비슷한 생성 규칙을 만들 수 있습니다. 하지만, 실제 규칙과 예상 규칙은 같지 않으므로 다른 변수를 통해 예측 규칙을 나타낼 수 있습니다.


선형 회귀 모델의 확률적 관점


일부 데이터를 가지고 선형 회귀 모델을 추론한다면 항상 정확한 규칙을 맞출 수는 없다. 실제 규칙과는 조금씩 차이가 생긴다. 제대로 된 회귀 모델을 만드려면 차이(error)를 최소화해야 한다.


   파라미터 예측: 최소 제곱 방법

그렇다면 어떻게 해야 가진 데이터로 최선의 회귀 모델을 만들 수 있는가?

최소 제곱

  • 최적의 모델은 실제 Y값과 예측된 Y 값의 차이 (에러)가 최소가 되어야 함
  • 에러의 값은 무조건 양수이어야 하므로 제곱을 시킴
  • 최소 제곱 방법은 에러의 제곱의 합(Sum of the Squared Errors, SSE)을 최소화 시킴
  • 에러의 제곱의 합을 최소화 시킬 수 있는 파라미터를 찾으면 적절한 회귀 모델을 만든 것임

최소 제곱의 해
예측 방정식에 따른 기울이과 y 절편 구하는 방법을 알아보자.
  • 예측 방정식

    베타_제로_헷: 모델이 예측하고자 하는 y 절편
    베타_원_헷: 기울기
  • 기울기

    분자: 시그마(x_i - x의 평균)(y_i - y의 평균)
    분모: 시그마(x_i - x의 평균)^2
    이때, x는 강수량 기온 등의 설명 변수, y는 와인의 등급같은 종속 변수
  • Y-절편

    y의 평균 - 베타_원_헷*x의 평균: 와인등급의 평균 - 기울기*강수량(..등)의 평균

Y 절편 구하기
Y 절편을 구하기 위해서 error^2의 합을 미분한다.
알고자하는 파라미터가 베타_0와 베터_1이기 때문에 베타_0와 베타_1에 대한 error^2의 합의 변화량을 알면, 적합한 파라미터를 계산할 수 있다.


기울기 구하기
기울기는에 대해서 미분하면 얻을 수 있습니다.



기울기와 y-절편의 의미

  1. 기울기() - 추정된 Y는 X가 1 단위 증가할 때마다 만큼 변화
    • 만약,  = 2인 경우, Y는 X가 1 단위 증가할 때마다 2씩 증가
  2. Y-절편() - X = 0인 경우 Y의 평균 값
    • 만약 = 4인 경우, X가 0일 때 Y의 평균값은 4
    • 평균이라는 단위를 쓰는 이유는 데이터의 무작위 노이즈가 존재하고 그 무작위 노이즈를 평균내면 0에 가깝기 때문

   선형 회귀 모델로는 안 풀리는 문제들

선형성의 한계

다른 모델을 통해 해결할 수 있음

[모두의딥러닝] Lab12


   개요
강의(질문)-복습(필기)-자료화

참고
모두의 딥러닝

https://pythonkim.tistory.com/57

   NN의 꽃 RNN 이야기

Sequence data
우리가 사용하는 data는 sequence data가 많다. 음성인식이나 자연어 등등.
하나의 단어만 이해한다고해서 전체의 맥락을 이해하는 것이 아니라. 앞의 단어들을 모두 이해한 다음 맥락을 이해할 수 있다. 이것이 sequence data이다.



기존의 neural network나 convolution neural network의 경우 어떤 x라는 입력이 있으면 바로 출력으로 나타나는 간단한 형태였기 때문에 sequence data와 같은 형태의 data를 처리하기 힘들었다. 그래서 다음과 같은 형태의 네트워크를 만들었다.


sequence data를 생각했을 때, 한 데이터를 처리하고 다음 데이터를 처리할 때 이전의 연산의 결과가 다음 연산에 영향을 미쳐야 된다. 그렇기 때문에 위와 같은 형태의 네트워크가 만들어지게 되었다. 위의 구조는 실제 구현할 때 아래와 같은 형태를 띄게 된다.



Recurrent Neural Network
x라는 입력이 있을 때, RNN이라는 연산을 통해 계산을 하고 계산한 결과가 다시 자기 입력이 되는 것을 말한다. 우리는 각 RNN 셀에서 연산의 결과로 y값을 뽑아낼 수 있다.

그렇다면 어떻게 계산할까? 기본적인 function은 WX이다.


계산할 때 주의할 것은 새로운 state를 계산할 때, 이전의 state를 사용하는 것과 어떤 state를 계산할 때도 같은 function을 사용한다는 것을 주의해야 한다.

(Vanilla) Recurrent Neural Network
가장 기초가 되는 RNN 계산방법은 (Vanilla) Recurrent Neural Network 방법이다.


이 방법에서 사용되는 function도 딥러닝의 기본적인 함수인 WX이다. 이전 state와 새로운 state 각각에 W를 만들어준 후 tanh한다(사용되는 W는 새로운 state에 사용할 W1과 예전의 state에 사용할 W2, y값을 뽑아내기 위해 사용할 W3, 총 3개이다.).

그리고 y값을 뽑아낼때는 새로운 W를 곱해준 후 y 값을 추출할 수 있다. y가 몇개의 vector를 가질까는 W의 vector의 모양에 따라서 정해진다.



Character-level language model
RNN을 통해서 Character-level language model을 만들 수 있다. Character-level language model은 hello라는 입력 값을 주고 h 라는 입력이 들어왔을 때 출력으로 l을 출력할 수 있는 모델을 말한다.

4가지 종류의 글자가 있기 때문에 크기가 4인 벡터로 처리한다. multi-nomial classification에서 봤던 것처럼 4가지 중에서 하나를 선택하게 하려고 한다. 몇 번째 값이 켜졌느냐에 따라 순서대로 h, e, l, o가 된다.


공식에서 볼 수 있는 것처럼 h의 값과 x의 값을 W와 계산하여 더한 후 tanh 함수에 전달하면 hidden layer에서 볼 수 있는 값이 차례대로 만들어진다.


tanh 함수는 sigmoid 함수 중의 하나로 처음 나왔던 sigmoid를 개량한 버전이다. 기존의 sigmoid 함수가 0에서 1 사이의 값을 반환하는데, tanh 함수는 -1에서 1 사이의 값이 반환하도록 개량했다. 현재 상태를 가리키는 ht는 tanh 함수의 반환값이므로 -1과 1 사이의 값이 된다. 그래서 hidden layer에 있는 값들도 해당 범위에 존재하게 된다.

최종적으로는 모든 단계에서 값을 예측하고 실제 값과 맞는지 비교할 수 있다.


위의 자료에서 보면 e를 입력했을 때, l값이 나와야 하지만 o값(1.2로 값이 제일 크니까)이 나왔다. error가 생겼다고 할 수 있다.

이럴 경우 cost를 계산하여 error를 보완하고 학습할 수 있다. 여기서는 softmax에 해당되는 cost function을 사용하여 cost를 계산할 수 있다. 계산 값으로 나온 4개의 값을 모두 더한 후 cost를 평균내면 학습을 시킬 수 있다.

RNN applications
RNN을 통해 할 수 있는 것들은 다음과 같다.


아래의 그림은 바닐라 RNN이다. 가장 단순한 형태로 1대1(one-to-one) 기반의 모델이다.


1대다(one-to-many) 기반의 모델로 이미지에 대해 설명을 붙일 때 사용한다. 한 장의 그림에 대해 "소년이 사과를 고르고 있다"처럼 여러 개의 단어 형태로 표현될 수 있다.


다대1(many-to-one) 형태의 모델로 여러 개의 입력에 대해 하나의 결과를 만들어 준다. 우리가 하는 말을 통해 우리의 심리 상태를 "안정", "불안", "공포" 등의 한 단어로 결과를 예측할 때 사용된다. sentiment는 감정을 의미한다.


다대다(many-to-many] 형태의 모델로 기계 번역에서 사용된다. 여러 개의 단어로 구성된 문장을 입력으로 받아서 여러 개의 단어로 구성된 문장을 반환한다. 구글 번역기 등이 이에 해당한다.


다대다(many-to-many) 모델의 또 다른 형태다. 동영상같은 경우는 여러 개의 이미지 프레임에 대해 여러 개의 설명이나 번역 형태로 결과를 반환한다.


RNN도 여러 개의 layer를 두고 복잡한 형태로 구성할 수 있다. 아래는 위의 그림들을 다단계로 배치한 형태라고 보면 된다.


RNN 또한 layer가 많아지면서 복잡해지기 때문에 이를 극복할 수 있는 다양한 방법들이 소개되고 있다. 현재는 RNN이라고 하면 많은 경우 LSTM을 의미한다. 그리고 LSTM처럼 많이 사용되는 방법으로 한국의 조교수님께서 만든 GRU도 있다.




2019년 1월 26일 토요일

[모두의딥러닝] Lab 11

   개요
강의(질문)-복습(필기)-자료화

참고
모두의 딥러닝

   ConvNet의 Conv 레이어 만들기

Convolutional Neural Networks

입력을 나누어받는 고양이의 뉴런에서 착안하여 입력을 나눠 받아보자고 시작한 것이 Convolutional Neural Networks이다.

이미지를 나누어서 입력을 받는다고 하였을 때 아래와 같이 볼 수 있다.


입력을 자른 후 각각의 입력으로 넘기게 되는데 이 층을 Convolutional Layer라고 부른다. 그래서 전체의 이름이 Convolutional Networks라고 부른다.

만들어진 Convolutional Layer 사이에 RELU나 POOL을 넣어 계산한다. 이와 같이 CONV 레이어와 RELU, POOL을 반복하고 마지막에 FC을 구성하여 최종적인 Labeling을 할 수 있다.



**POOL과 RELU는 어떤 층이었지? 이 층이 레이어 사이에 넣어질 때 규칙이 있는 건가? POOL의 개수가 적어보이는데 어떤 이유가 있는거지?

레이어별로 어떻게 진행되는지 알아보자.
입력을 이미지로 받는다고 했을 때, 이미지는 다음과 같이 나타낼 수 있다. width * height * depth는 이미지를 vector의 형태로 나타낸 것인데, depth는 color 값을 나타낸다.

Conv에서는 이미지를 하나의 입력으로 받지 않고 이미지를 작게 나눠서 단위별로 처리한다. 이때 지정된 단위별로 처리하는 것을 filter라고 한다(filter 크기를 지정할 때, width와 height의 값은 사용자의 설정에 따라 달라질 수 있으나 depth는 색의 값이므로 변하지 않는다.).



여기서는 5 * 5로 값을 지정하고 5 * 5로 이미지를 읽어낸다. filter는 아래의 그림과 같이 5 * 5로 지정된 단위만큼을 읽어온 후, 수학적 처리에 의해 한 점만 뽑아낸다.



어떻게 한 점으로 만들 수 있을까?

그동안 배웠던 Wx + b를 통해서 만들 수 있다. 읽어온 값(5 * 5 * 3)을 x라 하고 Wx + b의 식에 대입하여 값을 만들 수 있다(Wx + b는 x가 1개일 경우나 여러 개(feature의 개수)일 경우에 대해서도 계산할 수 있기 때문에 유용하게 사용할 수 있다.).
여기서 W이 한 점으로 처리하는데 큰 영향을 미치기 때문에 W를 filter의 값이라고 생각하면 된다. 여기서 ReLU의 값을 넣어주고 싶으면 ReLU(Wx + b)와 같이 기본 식에 ReLU를 포함하면 된다.

** ReLU가 뭐였더라.. 그냥 식인가 그래프인가. 알고리즘인가..



같은 filter(W)를 가지고 이미지를 계산해보자.



이런 과정을 거치게 되면 우리는 몇개의 값을 모을 수 있을까? 이 부분이 중요한 이유는 네트워크를 구성할 때 이 값을 알아야 W의 개수도 정하고 어떻게 넘길 것인가도 설계할 수 있다.

다음 예제를 통해 알아보자.
7 * 7 input을 3 * 3 filter를 가지고 움직이면 몇 개의 점이 나올까?




** 왜 한칸씩 움직이지?
filter를 한 칸씩 움직이는 것을 Stride 1이라고 한다. 그러므로 위와 같이 움직이는 것을 Stride 1일 때, 총 5 * 5의 점을 뽑아낼 수 있다고 하면 된다.

Stride를 2라고 잡으면 아래와 같다.





Stride 2일 때, 3 * 3 output을 낸다.
이것을 일반화해보면 Stride 와 이미지의 크기를 통해 output의 값을 알아낼 수 있다(output을 알아내면 W의 개수도 정하고 어떻게 넘기는지 설계할 수 있다.).



위의 설명한 것과 같이 이미지를 축소시키면 입력값을 나눠서 받게 되고 **계산하기 좋은 값이 된다. 하지만 이미지를 축소하게 되면 정보를 잃어버리게 된다는 단점이 있다.

그래서 보통 Conv을 이용할 때는 padding이라는 개념을 사용한다. idea는 이미지의 테두리에 0의 값을 가지는 픽셀 테두리를 만들어주는 것이다.



이 idea의 장점은

  1. 그림이 급격하게 작아지는 것을 방지할 수 있다.
  2. 이미지의 모서리를 Network에 알려줄 수 있다.
는 점이다.

pad를 넣을 경우 output의 값은 어떻게 나올까? pad를 하게 되므로 input 값은 7 * 7에서 9 * 9로 바뀌게 된다. 그 후 같은 공식으로 계산해주면 



7 * 7로 나오게 된다. 이 얘기는 7 * 7의 값을 넣었을 때, 같은 사이즈로 값이 나오게 되는 것을 의미한다.

한 Conv는 위와 같이 Layer를 만드는 과정을 반복하는데, 주의할 점은 Layer 별로 새로운 filter를 사용한다는 것이다(깊이 값 = layer의 개수 = 필터의 개수).





** 28 * 28?이 어떻게 나온거지
이런 성질을 이용하여 출력의 width, height, depth 값을 모두 알 수 있다.

이런 Conv과정을 거쳐 나온 것을 Activation Map이라고 하는데, Activation Map은 다시 Conv과정을 반복할 수 있다. 여러번 이 과정을 반복하면 이런식으로 Convolution Layer가 되는 것이다. 



여기서 생각해볼 수 있는 것이 얼마나 많은 weight의 variables의 개수가 얼마나 될까?



weight의 개수는 5 * 5 * 3을 6개를 사용하였으므로, 5 * 5 * 3 * 6으로 값을 구할 수 있다.
어떻게 그 값들이 정해질까?
처음에는 값을 random하게 초기화하고 가진 데이터로 학습을 하게 된다.


   ConvNet Max pooling과 Full Network

Pooling layer

Pooling layer는 간단하게 sampling이라고 보면 된다. 깊이는 몇개의 filter를 사용하는가에 따라 달라지는데, 여기서 1개의 Conv 안의 1개의 layer(1개의 filter로 뽑아낸 layer 값)을 뽑아낸다.




위와 같은 layer가 나오게 된다. 이 layer의 사이즈를 조정하는 것을 resize라고 한다.

이 값을 다시 쌓는다.



그리고 이렇게 쌓은 값을 다음 단계로 넘기는 것을 pooling이라 한다.

어떻게 pooling하는가? 다음과 같이 4 * 4 이미지가 있다고 생각하고, 2 * 2 filter를 stride 2로 사용해보자.



 그럼 2 * 2 output 값이 나올텐데 그럼 필터의 어떤 값을 output으로 옮길 것인가? 가장 많이 사용되는 방법은 MAX POOLING 가장 큰 값을 옮기는 것이다(이 방법 때문에 sampling이라고도 부르는 것이다.).)



CONV와 RELU, POOL과 같은 과정을 어떻게 쌓을 것인가는 사용자의 선택사항이다. CONV 후 POOL을 해도 된다. 그런 다음 보통 마지막에 POOL을 하면 된다.

** 마지막에는 꼭 POOL을 해야하는 건가 통상적으로 한다는건가?



어떻게 동작하는지 웹 브라우저에서 볼 수 있다.

http://cs.stanford.edu/people/karpathy/convnetjs/demo/cifar10.html


   ConvNet의 활용 예

위과 같은 CNN의 기본적인 구조에 대해 어떤 식으로 응용이 가능한지, 사람들이 어떻게 응용했는지 알아보도록 하자.



NROM는 요즘은 보통 사용하지 않는다. 하지 않아도 상관없기 때문이다.






깊이가 굉장히 깊은데, 깊이가 깊어지면 학습이 어렵지 않을까? 라는 생각이 들 것이다. ResNet에서는 다음과 같은 방법을 사용하였다.



중간의 값을 뛰어서 앞으로 추월을 시킨다. 이게 왜 학습이 잘 되는지 설명하기는 어렵다.



값이 하나로 합쳐진다고 볼 수 있으므로, 학습시킬 때 layer가 깊지 않은 것으로 받아들 일 수 있다. 사실 학습이 잘되는 원인이 밝혀지지는 않았다(2015 당시).




이미지만 처리하는 것이 아니라 다양하게 사용할 수 있다. text에도 가능하다.



마지막으로 AlphaGo.




논문의 일부에서 볼 수 있다.