Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

코드와이

빅데이터와 머신러닝 소프트웨어 본문

빅데이터

빅데이터와 머신러닝 소프트웨어

코드와이 2021. 4. 12. 00:15

[1주차]

데이터 사이언스

   - 데이터로부터 인사이트를 뽑는 과정에 대한 것으로 데이터로부터 인사이트를 얻기 위한 과학적인 방법, 알고리즘, 시스템에 대한 것

 

데이터 사이언스 응용( + 간단한 설명, 예시)

  1. Business Report
    •  최대로 많이 팔린 상품 Top 5
    • 사용자들이 어떤 프로모션에 잘 반응을 해서 세일즈가 올라가는지
  2. 시차에 따른 분석
    • 얼마나 많은 트윗이, 리트윗이, 얼마나 '좋아요'가 많이 공유되는지를 시간대별로 분석
    • 매 10초마다 얼마나 많은 자동차들이 이동하는지 시간대별로 분석
    • 공장에서 많은 특정 데이터가 모아질 때 그 특정 데이터를 이용해서 기계에 문제가 있는지 검출
  3. 추천 시스템
    • 사용자의 취향에 따른 영화 추천
    • 어떤 물건을 샀을때 연관된 다른 물건 추천
  4. Sentiment Analysis
    • 사용자가 어떤 감정을 가지고 있는지 분석
    • 어떤 상품에 대한 리뷰를 했을 때 그 사용자의 감정적인 상태를 분류 가능
  5. 그래프 분석
    • 그래프 : 하나의 vertex가 다른 vertex에 연결된 형태, 그 vertex가 연결된 edge들로 구성
    • 웹 그래프 : 웹페이지(vertex)가 링크(edge)를 통해 다른 웹페이지로 연결
    • 어떤 웹페이지가 더 중요하고 더 사람들이 좋게 생각하는지를 분석
    • 소셜 네트워크에서 서로 친구 관계를 맺는 것에서 새로운 친추 추천
  6. 이미지, 오디오, 비디오 데이터를 분석
    • 사진들에서 관련된 객체들을 뽑아서 표현∙분석
    • 음악을 듣고 그 음악의 정보를 자동으로 찾아줌

 

이런 다양한 데이터 사이언스들이 쌓여 만들어진 것이 빅데이터이다.

 

빅데이터의 특징(3Vs)

  1. Volume
  2. Variety
  3. Velocity

빅데이터 시스템

  1. 빅데이터를 분석하기 위한 하드웨어
  2. 분산 스토리지 시스템
  3. 분산 프로세싱 시스템
  4. 분산 처리를 가능하게 해주는 시스템(<= 사용자들이 다양한 분석 애플리케이션, 다양한 데이터 사이언스 응용들을 표현)

빅데이터 시스템 기능

  1. 데이터를 쪼개서 분배해주는 것을 자동으로 해줌
  2. 분석 job을 수행할 때 분산으로 job을 작은 단위의 task로 나누어서 빠르게 수행하는 것을 자동으로 해줌
  3. 장애 발생 시 자동 복구

빅데이터 Workflow

  • 첫 번째 예시
    1. 서비스를 제공할 때, 다양한 데이터가 발생
    2. 데이터는 흡수되고 전달될 때 Data Ingestion이라는 부분을 통과
    3. 이런 데이터들을 데이터 분석을 통해서 새로운 인사이트 또는 새로운 예측 모델을 만들고, 분석 결과로 서비스 개선에 사용
  • 두번째 예시(머신러닝이 결합된 경우)
    1. 첫 번째 경우와 마찬가지로 service, data ingestion, data analysis 과정이 존재
    2. 추가로 데이터 분석에서 정제된 데이터를 모아 머신러닝 학습이라는 부분을 통과
    3. 예츠 모델을 만들어내고 서비스에서 사용

데이터 분석

  1. Batch 처리
    • 데이터를 큰 단위로 분석
  2. Interactive query 방식
    • 데이터를 상호작용하면서 질의를 통해 분석
  3. Stream 처리
    • 실시간으로 바로 분석해서 결과를 내는 방식
  4. 그래프 처리
    • 그래프 데이터의 특성 때문에 그래프 데이터 분석에 특화된 방식
  5. 머신러닝
    • 예측 모델을 만들어내는 것으로, 요즘에는 머신러닝 안에서 딥러닝이라는 부분을 통해 데이터 분석을 함

대표적인 빅데이터 시스템

  1. Apache Hadoop
    • YARN, HDFS, Hadoop MR로 구성(HDFS는 구글의 GFS의 오픈소스 구현)
    • 큰 데이터를 분석하기 위한 애플리케이션에 최적화돼 있고, 데이터를 복제함으로써 장애가 발생했을 때 데이터를 잃어버리지 않게 하는 '장애 복구 기능'이 존재
    • Hadoop MR : 구글의 MapReduce 오픈소스 구현
  2. Spark
    • Hadoop에서 제한된 형태로 분석 프로그램을 표현할 수밖에 없었던 것에 비해서 일반적인 operation의 그래프 형태로 분석 프로그램을 표현 가능
    • 다양한 분석 프로그램을 쉽게 표현 가능
    • 메모리를 사용해서 분석 시간이 빠름
    • 분석 중간에 결과를 저장해 후에 계산에 필요할 때 중간 결과를 읽어서 계산 가능 => 속도 증가
    • 쉬운 프로그래밍 인터페이스
    • 현재 빅데이터 분석 시스템 중에서 가장 많이 사용되는 시스템
  3. TensorFlow
    1. 구글에서 만든 오픈소스 머신러닝 프레임워크
    2. 수학적인 계산으로 머신러닝 모델을 표현해서 수행 가능
    3. 내부적으로 데이터 플로우 그래프라는 형태로 바뀌어서 수행

분산 스토리지 시스템

  1. 데이터 분석을 위해서 데이터를 저장·관리
  2. 대표적인 분산 스토리지 : 분산 파일 시스템(GFS, HDFS)

 


[2주차]

데이터 분석 시스템

  1. Programming Model
  2. Execution Model

MapReduce

  • Map : 하나의 key / value 쌍을 받아서 여러 개 또는 하나의 key / value 쌍을 만들어내는 함수
  • Reduce : 같은 중간 key를 갖는 여러 중간 값들을 받아서 중간 값들을 합해서 어떤 함수를 수행
  • Shuffle : 하나의 reduce task가 앞에 있는 모든 map task로부터 데이터를 받아오는 것
  • 자기가 받은 데이터들을 reduce 함수를 수행해서 최종적인 결과를 만들어냅니다.(Output data partition)

MapReduce Runtime : MapReduce 애플리케이션을 수행하는 시스템 부분

  • MapReduce 프로그래밍 모델을 통해서 표현된 프로그램이 물리적인 플랜을 만들어냈을 때 해당하는 물리적인 플랜을 수행하는 것
  • 어떻게 하나의 Job을 여러 task로 나눠서 수행할지에 대한 Scheduling을 Runtime에서 알아서 해결
  • Fault Tolerance : 데이터 분석 Job이 수행되다가 특정 task가 죽었을 때 해당하는 task를 복구해서 문제없이 수행이 되게 하는 것
  • Scalability : 데이터가 많아질수록 더 많은 task를 써서 빠르게 분석하고 싶을 때 그런 많은 task를 사용하는 것을 잘 지원해주는 것
  • Elasticity : 자원이 가용한 것이 시간에 따라 바뀔 때 자원을 최대한 활용할 수 있게 수행 계획을 바꿔주는 것

MapReduce의 제한점

  • 제한된 프로그래밍 유연성
  • 효과적인 데이터 공유 방법이 없음

Spark

  • 기존의 MapReduce와 비교해서 더 일반적인 데이터 프로세싱 모델을 지원
  • 다양한 프로그래밍 언어로 데이터 분석 프로그램 가능(Java, Scala, Python, R)
  • 일반적인 데이터플로우 그래프로 수행
  • 다양한 operator를 사용하고, 그런 operator가 다양한 방식으로 연결된 그래프 형태를 지원
  • RDD(Resilient Distributed Datasets) 라는 개념을 통해서 In-memory 계산을 지원
  • 사용하기 쉬운 프로그래밍 인터페이스를 제공
  • 배치 분석뿐만 아니라 스트림 분석, 머신러닝, 그래프 분석, SQL 분석 등 다양한 데이터 처리를 지원

Spark Stack

<출처 : K-MOOC - 빅데이터와 머신러닝 소프트웨어>

 

RDD

  • cluster의 여러 머신에 나눠져서 저장되어 있는 변하지 않는 object의 collection
  • 정적 타입 정보
  • 계산하는 방법
    1. 변환 : filter라는 함수를 수행하거나 특정 key에 해당하는 데이터를 모으는 groupBy / 병렬적으로 수행
    2.  Actions : object 수가 몇 개인지 count, RDD에 있는 object를 다 모아서 결과를 가지고 오라는 collect
  • 데이터 손실 시, RDD partition에 해당하는 데이터가 lineage라는 정보를 통해서 자동으로 복구
  • 중요한 성능 관련된 최적화 : 해당하는 변환을 lineage에 적어놓고, action에 해당하는 operation이 수행돼야 할 시점에 병렬 수행
  • 메모리나 또는 디스크에 계산된 결과를 저장 가능 <= 속도 증가

 


[3주차]

Batch 분석

  • 많은 데이터를 큰 단위로 분석하는 분석 방법
  • 예) *ETL

                *ETL : 추출, 변환, 적재(extract, transform, load)

 

RDD opertaion을 통해 표현한 Batch

프로그램 구성 단계

  1. RDD 생성
    • 병렬화된 collection을 만든다.(Parallelize)
    • 분산 파일 시스템에 데이터를 저장하고 있을 경우,
      해당하는 데이터 파일들의 위치를 함수에 주어 데이터를 읽는다.
  2. RDD 변환
    • Map : Map에 남겨진 함수를 적용해서 결과를 만들어내고, 그 결과들을 모아서 RDD를 만든다.
    • flatMap : flatMap에 남겨진 함수를 적용하고,
                     그 함수 결과로 나오는 iterator에 각각의 element를 다 꺼내어 flat된 RDD를 만든다.
    • filter : filter 안에 표현된 조건식에 해당하는 원소만 통과시켜 RDD를 만든다.
  3. Pair RDD를 다루는 대표적인 operation(ReduceByKey, join 등등)
    • ReduceByKey : 각각의 키에 대해서 데이터를 모으는 과정을 하고, 그 모인 데이터에 대해서 reduce 함수를 적용한다.
    • join : 두 개의 RDD가 있을 때 적용. 같은 key를 갖는 element들을 모아 grouping해서 하나의 결과로 만든다.
    • groupByKey : 같은 키를 갖는 값들을 모은다.
    • keys : Pair RDD에서 key 값만 모아 RDD를 만든다.
    • values : Pair RDD에서 value 값만 모아 RDD를 만든다.
    • sortByKey : key에 대해서 값을 sorting한 후 RDD를 만든다.
  4. Action
    • collect : RDD의 원소를 모아서 배열 형태로 프로그램에 결과로 돌려준다.
    • count : RDD 데이터 셋에 갯수를 세어 출력한다.
    • first : 첫 번째 원소를 반환한다.
    • take(n) : head부터 n개의 RDD 원소를 반환한다.
    • saveAsTextFile : 주어진 path에 RDD 데이터를 저장
    • saveAsSequenceFile : RDD 중에 Pair 형태로 표현된 Pair RDD 데이터를 *SequenceFile 형태로 주어진 path에 저장
                                     
                       *SequenceFile 형태 : binary key / value 쌍으로 저장된 구조
  5. Persistence : Spark 프로그램을 짤 때 In-memory computing을 활용하기 위해서 프로그램 상에서 해줄 수 있는 것
    • rdd.persist : 계산된 결과를 메모리에 유지하고 싶을 때 사용한다.
    • lineage : RDD의 특정 부분이 손실된 경우, 자동적으로 재계산한다.

 

대화형 질의 방법 : 빅데이터 분석 방법 중 하나로 데이터가 *구조화된 데이터일 경우에 사용되는 방법

                                                                                       *구조화된 데이터 : 테이블 형태로 표현된 구조화된 데이터

  1. operation
    • Projection : 테이블에서 어떤 column만 뽑아서 보고 싶을 때 사용한다.
    • Selection : 특정 조건을 만족하는 row들만 뽑아서 보여준다.
    • Aggregation : column에 대해서 데이터 통계를 내서 보고 싶을 때 사용한다.
    • join : 두 테이블에 있는 데이터를 같이 보고 싶을 때 사용한다. 공통적인 이름을 갖는 column이 있을 때 그 해당하는 column의 값이 같은 row들을 찾아서 병합한다.
      • Natural Join : 두 테이블에 해당하는 column의 값이 다 존재해야 한다.
      • Left outer Join : Left 쪽 테이블에 해당하는 column의 값이 있어야 한다.
      • Right outer Join : Right 쪽 테이블에 해당하는 column의 값이 있어야 한다.

DataFrame : 데이터가 여러 row로 구성돼 있고 각 row는 이름을 가진 column 값을 가지고 있다. 관계형 operation을 지원한다.
=> SparkSQL 사용 가능

 

 


[4주차]

스트림 처리 방법

  • 실시간으로 들어오는 데이터를 빠르게 분석한다.
  • 기존의 Batch 분석은 데이터가 고정되어 있어야하지만 스트림 처리는 그렇지 않다.(Unbounded data)
  • 이벤트 타임(이벤트가 발생하는 시점)과 프로세싱 타임(이벤트가 들어오는 시점)같은 시간의 개념을 잘 이해해야 한다.
  • "'무엇(what)'에 해당하는 스트림 프로세싱 모델인지 + 표현한 모델을 '어떻게(how)' 수행하는지" 를 이해해야 한다.

스트림 처리 방식 2가지

  • Continues 질의 시스템 : 빠르게 데이터를 처리할 수 있지만 장애 복구 등이 어렵다.
  • Micro-batch 시스템 : 작은 단위의 Batch를 계쏙 수행함으로써 스트림 처리 결과를 얻는다. 장애 복구는 쉽지만, 빠른 분석은 힘들다.

스트림 분석을 표현하는 분석 패턴

  • element마다 변환
    • Batch 분석에서도 나왔던 map이나 filter 같은 것들이 스크림 데이터에서도 똑같이 사용할 수 있는 operation이다.
  • Aggregation( 스트림 처리에만 있는 Windowing )
    • 프로세싱 시간 기반의 Window
    • 이벤트 시간 기반의 Window
    • 이벤트 개수를 세서 Window 를 만드는 count based Windows 등등...
  • Composite : Element-wise transformation + Aggregation

Windowing

  • Fixed Window : 전체 시간을 고정된 인터벌로 잘라서 Window를 만드는 것이다.
  • Sliding Window : Window 크기 뿐만 아니라 얼마나 자주 Window output 이 나오게 되는지 결정하는 Window 인터벌을 조절한다.
  • Session : 사용자가 한 서비스를 로그인해서 사용하고 있을 때 그 사용자가 연속적으로 사용한다고 하는 시간에 해당하는 개념이다.

Watermark

  • delay(이벤트가 발생해서 시스템에 들어올 때까지의 시간)을 추측하는 것이다.

<출처 : K-MOOC - 빅데이터와 머신러닝 소프트웨어>

  • watermark 가 너무 느리면 지연된다.
  • watermark 가 너무 빠르면 어떤 데이터 유실될 수 있다.

스파크 스트리밍 시스템

  • RDD 기반의 Spark Steaming 시스템
  • Data Frame 기반의 Spark Structured Streaming
    • 끊임없이 들어오는 데이터 스트림(Unbounded Table)을 테이블에 계속 추가하는 형태로 데이터를 표현한다.

Spark Structured Streaming Example

<출처 : K-MOOC - 빅데이터와 머신러닝 소프트웨어>

  1. Spark Cluster에 연결해서 질의를 수행할 수 있는 환경인 SparkSession을 만든다.

    spark = SparkSession \
                  .builder \
                  .appName("---") \
                  .getOrCreate()
  2. 만든 SparkSession을 이용해서 데이터 스트림을 읽어서 lines라는 DataFrame을 만든다.

    lines = spark \
                 .readStream \
                 .format("kafka") \
                 .option("kafka.bootstrap.servers", ip_addr:port) \
                 .option("subscribe", "wc") \
                 .load()
  3. lines라는 DataFrame에서 각각의 line에 해당하는 값들을 스페이스로 쪼갠 다음에 거기에서 나오는 각 word를 하나의 row 값으로 택하는 operation을 한다.

    words = lines.select(
                         explode(split(lines.value, " ")
                  ).alias("word")
  4. 각 단어들의 개수를 출력해준다.

    wordCount = words.groupBy("word").count()

 

  • 질의를 종료하는 명령을 주기 전까진 종료하지 않는다.(Batch 분석과 다른 점)

    query = wordCount.~~~.start()   <= 질의 시작
    query.awaitTerminate()             <= 질의 종료
  • words.groupBy(window(words.ts, "3 minutes", "1 minutes"), words.word)

    ts : timestamp
    3 minutes : 윈도우 사이즈
    1 minutes : 윈도우 인터벌

 


[5주차]

그래프 처리 방법

 

그래프 데이터

  • Web graph
  • Social graph
  • ...

G : 그래프

V : Vertex의 집합

L : Label(vertex가 갖고 있는 값)

E : edge(directed edge(방향 O), undirected edge(방향 X, 양방향)) 의 집합, edge(u, v) = W(u, v)

 

그래프 알고리즘

  • 마이닝을 요하지 않는 algo
    1. 최단경로 알고리즘
    2. Bipartite matching : vertex set이 양쪽으로 나눠져 있을 때 한쪽에 있는 vertex와 다른 쪽에 있는 vertex를 매칭하는 edge를 찾아내는 것이다. 보통 최대한 많이 매칭을 하는 것이 목표이다.
    3. Connected components : 하나의 vertex로부터 갈 수 있는 모든 vertex들을 찾아서 연결된 부분을 찾는 것이다.
    4. Random walk : 하나의 vertex에서 시작해 random하게 다음 vertex를 선택했을 때 갈 수 있는 부분을 random walk라고 표현한다.
    5. PageRank : Web graph에서 각각의 페이지들이 연결되어 있을 때, 하나의 페이지가 많은 페이지로부터 연결이 됐을 때 그 페이지가 더 중요하다는 것을 분석할 수 있다.

그래프 처리 모델

  1. Think like a vertex(ex. 구글의 Pregel, 아파치의 Giraph)
    • 각각의 vertex가 계산하는 유닛이다. vertex가 자기자신을 계산하고 다음 vertex에 그 정보를 넘겨주는 병렬로 수행되는 방식이다.
  2. Think like a (sum)graph
    • 계산하는 단위를 vertex가 아닌 subgraph로 하는 모델이다.

Think like a vertex

  1. 그래프 데이터를 사용해서 계산하는 것을 일련의 iteration(= supersetp)으로 구성한다.
  2. 각각의 superstep마다 멈추는 barrier가 있다.(*bulk synchronous parallel 모델)
                                    *프로세서-메모리 쌍의 집합을 사용하고 point-to-point 구조로 이루어져 있으며 병렬 컴퓨팅 방식이다.
  3. 하나의 superstep 동안에 그래프 프로세싱 프레임워크는 사용자가 정의한 함수를 각각의 vertex에 대해서 병렬로 수행한다.
  4. 각각의 vertex에서는 해당하는 vertex V의 superstep S-1에 보내진 메시지들을 읽는다.
  5. 그다음 V의 state를 계산을 통해서 수정한다.
  6. 다른 vertex들이 superstep S+1에서 받을 메시지를 보낼 것이 있으면 보낸다.
  7. 이와 같은 수행을 vertex state machine이 계속할지 그만할지 결정한다.

vertex state machine

  1. 각각의 vertex는 Inactive한 상태이다.
  2. 다른 vertex로부터 메시지를 받으면 Active한 상태로 변경된다.
  3. Active한 상태에서 계속 계산을 하다가 어떤 superstep에서 자기한테 온 메시지가 하나도 없으면, Inactive한 상태로 전환된다.
    (halt하겠다 => voting)
  4. 모든 vertex가 정지하겠다고 voting하면 해당 그래프 알고리즘은 종료된다.

빅데이터가 있을 때 이런 알고리즘을 적용시키기엔 문제가 있다.(계산량이 어마어마하다.)

=> 분산 그래프 처리가 필요하다.

 

분산 그래프처리

  • Master : 전체 그래프를 부분으로 쪼개서 각각의 부분을 특정 Worker에 할당한다.
  • Worker : 그래프 전체에서 일부를 맡아 처리한다.
  • Worker끼리 edge로 연결되어 있다면, 둘 사이에 메시지가 교환된다.
  • Master가 하나의 substep을 진행하고 Worker에서 voting을 받아 최종 투표 결과를 결정한다.

 

머신러닝 시스템

 

딥러닝 < 머신러닝 < AI

딥러닝 : 머신러닝의 일부로 특히 딥 뉴럴 네트워크를 사용해서 representation을 배우는 러닝 방법이다.

 

머신러닝을 위해...

  1. 빅데이터
  2. 어떤 것을 배우는지 표현하는 모델(모델에 따라서 우리가 배워서 예측하고자 하는 것들이 달라진다.)
  3. 하드웨어 & 소프트웨어

머신러닝

  1. Regression : 특정한 전 사용량과 성능 사이의 관계를 찾아내라.
  2. Classification : ex. 이메일이 스팸인지 아닌지 검출한다.
  3. Clusterting : ex. 근접한 데이터들끼리 모아 cluster를 만든다.
  4. Topic modeling : ex. 많은 docu가 있을 때 각각이 어떤 topic에 해당하는 docu인지 찾아낸다.
  5. Collaborative filtering : 추천하는 시스템
  6. Frequent pattern mining : 자주 같이 발생하는 패턴들을 찾아보기
  7. Ranking : 여러가지 답이 있을 때 중요한 순서를 정한다.

딥러닝 응용

  1. 어떤 이미지가 왔을 때 그 이미지 픽셀 데이터를 입력으로 해당하는 이미지가 어떤 분류에 속하는지 파악
  2. 스피치 데이터를 텍스트로, 텍스트 데이터를 스피치로 변환
  3. 비디오 데이터를 보고 해당하는 비디오 데이터의 내용을 텍스트 형태로 요약
  4. Image, video style transfer는 하나의 이미지 비디오 스타일에서 다른 스타일로 변형
  5. Machine translation : 하나의 언어에서 다른 언어로 번역

머신러닝, 딥러닝 Step

  1. Training(학습)
    • 반복적으로 특정 loss 값을 최적화하기 위해서 수행함으로써 최종적으로 우리가 원하는 모델을 만들어내는 과정
  2. Inferenct(추론)
    • 추론 : 학습을 통해 얻은 모델을 사용하는 과정
  3. Prediction(예측)
    • 예측 : 추론 과정에서 학습된 모델을 사용해서 새로운 입력 데이터가 들어왔을 때 하게 된다.
    • 예측은 실시간으로 빠르게 해야 되기 때문에 latency(지연도)가 중요하다.

 


[6주차]

머신러닝, 딥러닝 시스템

 

머신러닝 Software Stack

<출처 : K-MOOC - 빅데이터와 머신러닝 소프트웨어>

  • ML Core : 하드웨어를 사용해서 머신러닝 학습, 추론을 하는 부분
  • Vision, Speech, Language : 각 도메인에 특화된 부분의 라이브러리

ML Framework

<출처 : K-MOOC - 빅데이터와 머신러닝 소프트웨어>

  1. 입력 파이프라인 : 데이터를 읽어서 학습해야 하는 모델로 전달하는 것으로, Mini-batch 단위로 데이터를 전달한다.
  2. 데이터 전달 후 forward pass 계산을 한다.
  3. 결과값(맨 끝의 logit)으로 'Compute loss' 단계를 수행한다.              *loss : 우리가 원래 알고 있던 값과의 오차
  4. loss를 줄이기 위해 미분 값을 계산해서 전파한다.
  5. backward : 맨 끝에서부터 시작해서 gradient를 계산해서 앞쪽으로 미분 계산하는 것이 전달된다.
  6. 그렇게 미분 값이 계산된 후에 원래 있던 모델의 파라미터 값을 업데이트 한다.
  7. 위의 과정을 반복하는 것이 학습 과정이고, 반복 한 번을 iteration이라고 부른다.
  8. 해당하는 데이터를 한 번 다 스캔해서 수행한 것을 하나의 epoch라고 부른다.
  9. 1 ~ 8을 사용자가 정의한 종료조건을 만족할 때까지 반복 수행한다.

머신러닝 프레임워크

  • Symbolic 머신러닝 프레임워크
  • Imperative 머신러닝 프레임워크
  • 두 프레임워크 다 Python이라는 언어를 사용해서 모델을 정의한다.

Symbolic 머신러닝 프레임워크

  1. 모델 정의(그래프를 만드는 부분)
  2. 그래프 수행

Imperative 머신러닝 프레임워크

  • 수행하는 방법이 그래프 정의와 수행, 두 가지로 분리되어 있지 않다.
  • statement가 나올 때마다 바로 바로 해당하는 state가 수행한다.

 

구분 Symbolic 머신러닝 프레임워크 Imperative 머신러닝 프레임워크
장점 최적화하기도 쉽다.
여러 다양한 환경에 deploy하기도 쉽다.
기존의 Python 환경을 최대한 활용하기 때문에 프로그래밍 하기 쉽다.
debugging하기가 쉽다.
단점 프로그램하기 더 어렵다.
문제가 생겼을 때 debug하기도 힘들다.
statement가 나올 때마다 바로 바로 수행을 하기 때문에 최적화를 할 수 있는 여지가 적다.
사용 예시 모델 개발이 끝나면 production system에서 빠르게 수행할 때 사용한다. 빠르게 모델을 exploration하면서 개발할 때 사용한다.

 

TensorFlow

   - TensorFlow 1점대 버전에서는 기본 모드로 Symbolic 그래프 수행 스타일을 따른다.

 

Symbolic 그래프 수행

  1. 수학적인 계산을 computation 그래프로 표현한다.
  2. 그래프에서 노드는 입력을 받아서 어떤 계산을 하고 출력을 내는 operation에 해당한다.
  3. 그래프에서 edge는 노드 사이에서 흘러가는 Tensor를 뜻한다. Tensor는 N-dimensional array에 해당한다.
  4. dimension이 1차원인 경우에는 Vector, dimension이 2차원인 경우에는 Matrix에 해당한다.
  5. 다른 예로 이미지 같은 경우에 3차원 Tensor로 표현할 수 있다.(row, column, color)
  6. 이런 Tensor들이 그래프를 통해서 흘러가기 때문에 TensorFlow라고 칭한다.
  7. TensorFlow에서 그래프가 정의된 후 정의된 그래프는 해당하는 하드웨어 환경에서 수행할 수 있는 코드로 변경된다.

TensorFlow 특징

  • operation들이 상당히 작은 단위이다.
  • TensorFlow 그래프는 데이터가 흘러가는 flow뿐만 아니라 control을 관장하는 control flow도 표현을 할 수 있다.
  • 그래프 안에 계속 상태가 유지되는 state를 가지고 있을 수 있다.

TensorFlow 프로그래밍 모델

  • Tensor : 그래프 안에서 데이터를 나타내는 것
  • Variable : 그래프에서 수행하면서 상태를 보존하면서 가지고 있는 것
  • Operation : 계산을 나타내는 것
  • Kernel : operation은 추상적인 계산을 나타내는 인터페이스이고, 실제로 해당하는 Operation을 구체적으로 구현한 것
  • Session : 정의된 그래프를 수행하는 프로그래밍 객체(Session.run()이라는 함수를 통해 그래프를 수행)

 

그래프 수행

import tensorflow as tf
import numpy as np

b = tf.get_variable('bias', tf.zeros((100,)))
W = tf.get_variable('weights',
				tf.random_uniform((784,100), -1, 1))
x = tf.placeholder(tf.float32, (None, 784))
h = tf.nn.relu(tf.matmul(x, W) + b)

sess = tf.Session()
sess.run(tf.global_variables_initialize())
sess.run(h, {x : np.random.random(64, 784)})
  1. Session을 초기화하는 과정
    • sess.run(tf.global_variables_initialize())
      • 변수들은 초기화되어야만 사용이 가능하다.
  2. 입력 데이터를 주고 계산된 결과를 가져오는 그런 과정
    • sess.run(h, {x : np.random.random(64,784)})
      • h라는 것을 계산할 때 입력 x를 어떤 값을 줄지 정의해서 넘겨준다.
      • h라는 값이 계산되어 결과를 얻는다.

 


[7주차]

TensorFlow 예제

 

먼저 graph와 session을 정의한다.

graph에는 다양한 operation이 들어있고 그 값들로 사용할 수 있는 tensor가 존재한다.

session은 이런 operation을 수행할 수 있는 환경이다.

 

import tensorflow as tf

graph = tf.Graph()
with graph.as_default():
	a = tf.constant([2,2], name='vector')
    
print(a)

// 출력결과
// Tensor("vector:0", shape(2,), dtype=int32)

constant 는 상수, vector, matrix, n dimensional-array 를 정의할 수 있는 기본적인 op이다.

위의 출력결과 Tensor라는 것만 보여주고 그 값은 보여주지 않는다.

값을 확인하고 사용하기 위해서 Session 안에서 graph를 수행해야한다.

 

with tf.Session(graph=graph) as sess:
	print('a')
	print(sess.run(a))
    
// 출력결과
// a
// [2 2]

출력 결과 처음에 a vector 안에 정의했던 [2,2]가 나오는 것을 확인할 수 있다.

 

get_variable 이라는 API를 사용해서 초기화가 가능하다.

graph = tf.Graph()
with graph.as_default():
	s = tf.get_variable('matrix', initializer=tf.constant([[0,1], [2,3]]))
    
with tf.Session(graph=graph) as sess:
	sess.run(tf.global_variables_initializer())
	print(sess.run(s))

다음과 같이 initializer을 이용해서 초기화시킬 수 있다.

s 값을 출력하기 위해서 sess.run 또한 tf의 global_variables_initializer()) 로 초기화시켜야한다. 초기화를 안 시키고 실행하면 FailedPreconditionError 가 발생한다.

 

입력데이터를 넣는 방법

  1. placeholder
  2. Dataset API

placeholder

graph = tf.Graph()
with graph.as_default():
	a = tf.placeholder(shape=[], dtype=tf.int32)
    
	a_1 = tf.add(a,1)
    
	with tf.Session(graph=graph) as sess:
		for i in range(10):
			feed_dict = {a : input_contant[i]}
            
			print(sess.run(a_1, feed_dict))

다음과 같이 placeholder 는 수행 중에 computation graph에 데이터를 넣을 수 있는 부분에 해당한다.

 

Dataset API

  1. abstraction : 데이터 셋
  2. Iterator : 데이터에 있는 아이템들을 하나씩 순차적으로 스캔할 수 있다.
// 기존에 있는 데이터로부터 Dataset을 만드는 방법
ds = tf.data.Dataset.from_tensor_slices(input_constant)

graph = tf.Graph()
with graph.as_defaul():
	iterator = ds.make_one_shot_iterator()
    
	data_getter = iterator.get_next()
    
	a_1 = tf.add(data_getter, 1)
    
	with tf.Session(graph=graph) as sess:
		for i in range(10):
			print(sess.run(a_1))

Iterator를 생성하고 다음 element 를 가져오는(iterator.get_next()) data_getter 를 만든다.

add operation 인 a_1을 만들고 반복문을 수행한다.

 

머신러닝 학습을 위해 Dataset 변환

  1. shuffle : size를 주어 얼마나 많은 데이터를 shuffle할지 정한다.
  2. repeat : 특정한 값이 주어지지 않으면 계속 반복한다.
  3. batch : 머신러닝에선 data instance를 묶은 mini batch 단위로 iteration 수행이 진행되는데 이때 mini batch를 생성해주는 것이다.

Dataset Processing을 빠르게 하는 2가지 함수

  1. iterleave : 함수를 동시에 적용. 동시에 여러 파일을 읽기 때문에 빠른 수행시간을 보인다.
  2. prefetch : Dataset의 특정 부분을 미리 prefetching하는 함수.