코드와이
빅데이터와 머신러닝 소프트웨어 본문
[1주차]
데이터 사이언스
- 데이터로부터 인사이트를 뽑는 과정에 대한 것으로 데이터로부터 인사이트를 얻기 위한 과학적인 방법, 알고리즘, 시스템에 대한 것
데이터 사이언스 응용( + 간단한 설명, 예시)
- Business Report
- 최대로 많이 팔린 상품 Top 5
- 사용자들이 어떤 프로모션에 잘 반응을 해서 세일즈가 올라가는지
- 시차에 따른 분석
- 얼마나 많은 트윗이, 리트윗이, 얼마나 '좋아요'가 많이 공유되는지를 시간대별로 분석
- 매 10초마다 얼마나 많은 자동차들이 이동하는지 시간대별로 분석
- 공장에서 많은 특정 데이터가 모아질 때 그 특정 데이터를 이용해서 기계에 문제가 있는지 검출
- 추천 시스템
- 사용자의 취향에 따른 영화 추천
- 어떤 물건을 샀을때 연관된 다른 물건 추천
- Sentiment Analysis
- 사용자가 어떤 감정을 가지고 있는지 분석
- 어떤 상품에 대한 리뷰를 했을 때 그 사용자의 감정적인 상태를 분류 가능
- 그래프 분석
- 그래프 : 하나의 vertex가 다른 vertex에 연결된 형태, 그 vertex가 연결된 edge들로 구성
- 웹 그래프 : 웹페이지(vertex)가 링크(edge)를 통해 다른 웹페이지로 연결
- 어떤 웹페이지가 더 중요하고 더 사람들이 좋게 생각하는지를 분석
- 소셜 네트워크에서 서로 친구 관계를 맺는 것에서 새로운 친추 추천
- 이미지, 오디오, 비디오 데이터를 분석
- 사진들에서 관련된 객체들을 뽑아서 표현∙분석
- 음악을 듣고 그 음악의 정보를 자동으로 찾아줌
이런 다양한 데이터 사이언스들이 쌓여 만들어진 것이 빅데이터이다.
빅데이터의 특징(3Vs)
- Volume
- Variety
- Velocity
빅데이터 시스템
- 빅데이터를 분석하기 위한 하드웨어
- 분산 스토리지 시스템
- 분산 프로세싱 시스템
- 분산 처리를 가능하게 해주는 시스템(<= 사용자들이 다양한 분석 애플리케이션, 다양한 데이터 사이언스 응용들을 표현)
빅데이터 시스템 기능
- 데이터를 쪼개서 분배해주는 것을 자동으로 해줌
- 분석 job을 수행할 때 분산으로 job을 작은 단위의 task로 나누어서 빠르게 수행하는 것을 자동으로 해줌
- 장애 발생 시 자동 복구
빅데이터 Workflow
- 첫 번째 예시
- 서비스를 제공할 때, 다양한 데이터가 발생
- 데이터는 흡수되고 전달될 때 Data Ingestion이라는 부분을 통과
- 이런 데이터들을 데이터 분석을 통해서 새로운 인사이트 또는 새로운 예측 모델을 만들고, 분석 결과로 서비스 개선에 사용
- 두번째 예시(머신러닝이 결합된 경우)
- 첫 번째 경우와 마찬가지로 service, data ingestion, data analysis 과정이 존재
- 추가로 데이터 분석에서 정제된 데이터를 모아 머신러닝 학습이라는 부분을 통과
- 예츠 모델을 만들어내고 서비스에서 사용
데이터 분석
- Batch 처리
- 데이터를 큰 단위로 분석
- Interactive query 방식
- 데이터를 상호작용하면서 질의를 통해 분석
- Stream 처리
- 실시간으로 바로 분석해서 결과를 내는 방식
- 그래프 처리
- 그래프 데이터의 특성 때문에 그래프 데이터 분석에 특화된 방식
- 머신러닝
- 예측 모델을 만들어내는 것으로, 요즘에는 머신러닝 안에서 딥러닝이라는 부분을 통해 데이터 분석을 함
대표적인 빅데이터 시스템
- Apache Hadoop
- YARN, HDFS, Hadoop MR로 구성(HDFS는 구글의 GFS의 오픈소스 구현)
- 큰 데이터를 분석하기 위한 애플리케이션에 최적화돼 있고, 데이터를 복제함으로써 장애가 발생했을 때 데이터를 잃어버리지 않게 하는 '장애 복구 기능'이 존재
- Hadoop MR : 구글의 MapReduce 오픈소스 구현
- Spark
- Hadoop에서 제한된 형태로 분석 프로그램을 표현할 수밖에 없었던 것에 비해서 일반적인 operation의 그래프 형태로 분석 프로그램을 표현 가능
- 다양한 분석 프로그램을 쉽게 표현 가능
- 메모리를 사용해서 분석 시간이 빠름
- 분석 중간에 결과를 저장해 후에 계산에 필요할 때 중간 결과를 읽어서 계산 가능 => 속도 증가
- 쉬운 프로그래밍 인터페이스
- 현재 빅데이터 분석 시스템 중에서 가장 많이 사용되는 시스템
- TensorFlow
- 구글에서 만든 오픈소스 머신러닝 프레임워크
- 수학적인 계산으로 머신러닝 모델을 표현해서 수행 가능
- 내부적으로 데이터 플로우 그래프라는 형태로 바뀌어서 수행
분산 스토리지 시스템
- 데이터 분석을 위해서 데이터를 저장·관리
- 대표적인 분산 스토리지 : 분산 파일 시스템(GFS, HDFS)
[2주차]
데이터 분석 시스템
- Programming Model
- 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
RDD
- cluster의 여러 머신에 나눠져서 저장되어 있는 변하지 않는 object의 collection
- 정적 타입 정보
- 계산하는 방법
- 변환 : filter라는 함수를 수행하거나 특정 key에 해당하는 데이터를 모으는 groupBy / 병렬적으로 수행
- Actions : object 수가 몇 개인지 count, RDD에 있는 object를 다 모아서 결과를 가지고 오라는 collect
- 데이터 손실 시, RDD partition에 해당하는 데이터가 lineage라는 정보를 통해서 자동으로 복구
- 중요한 성능 관련된 최적화 : 해당하는 변환을 lineage에 적어놓고, action에 해당하는 operation이 수행돼야 할 시점에 병렬 수행
- 메모리나 또는 디스크에 계산된 결과를 저장 가능 <= 속도 증가
[3주차]
Batch 분석
- 많은 데이터를 큰 단위로 분석하는 분석 방법
- 예) *ETL
*ETL : 추출, 변환, 적재(extract, transform, load)
RDD opertaion을 통해 표현한 Batch
프로그램 구성 단계
- RDD 생성
- 병렬화된 collection을 만든다.(Parallelize)
- 분산 파일 시스템에 데이터를 저장하고 있을 경우,
해당하는 데이터 파일들의 위치를 함수에 주어 데이터를 읽는다.
- RDD 변환
- Map : Map에 남겨진 함수를 적용해서 결과를 만들어내고, 그 결과들을 모아서 RDD를 만든다.
- flatMap : flatMap에 남겨진 함수를 적용하고,
그 함수 결과로 나오는 iterator에 각각의 element를 다 꺼내어 flat된 RDD를 만든다. - filter : filter 안에 표현된 조건식에 해당하는 원소만 통과시켜 RDD를 만든다.
- 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를 만든다.
- 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 쌍으로 저장된 구조
- Persistence : Spark 프로그램을 짤 때 In-memory computing을 활용하기 위해서 프로그램 상에서 해줄 수 있는 것
- rdd.persist : 계산된 결과를 메모리에 유지하고 싶을 때 사용한다.
- lineage : RDD의 특정 부분이 손실된 경우, 자동적으로 재계산한다.
대화형 질의 방법 : 빅데이터 분석 방법 중 하나로 데이터가 *구조화된 데이터일 경우에 사용되는 방법
*구조화된 데이터 : 테이블 형태로 표현된 구조화된 데이터
- 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(이벤트가 발생해서 시스템에 들어올 때까지의 시간)을 추측하는 것이다.
- watermark 가 너무 느리면 지연된다.
- watermark 가 너무 빠르면 어떤 데이터 유실될 수 있다.
스파크 스트리밍 시스템
- RDD 기반의 Spark Steaming 시스템
- Data Frame 기반의 Spark Structured Streaming
- 끊임없이 들어오는 데이터 스트림(Unbounded Table)을 테이블에 계속 추가하는 형태로 데이터를 표현한다.
Spark Structured Streaming Example
- Spark Cluster에 연결해서 질의를 수행할 수 있는 환경인 SparkSession을 만든다.
spark = SparkSession \
.builder \
.appName("---") \
.getOrCreate() - 만든 SparkSession을 이용해서 데이터 스트림을 읽어서 lines라는 DataFrame을 만든다.
lines = spark \
.readStream \
.format("kafka") \
.option("kafka.bootstrap.servers", ip_addr:port) \
.option("subscribe", "wc") \
.load() - lines라는 DataFrame에서 각각의 line에 해당하는 값들을 스페이스로 쪼갠 다음에 거기에서 나오는 각 word를 하나의 row 값으로 택하는 operation을 한다.
words = lines.select(
explode(split(lines.value, " ")
).alias("word") - 각 단어들의 개수를 출력해준다.
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
- 최단경로 알고리즘
- Bipartite matching : vertex set이 양쪽으로 나눠져 있을 때 한쪽에 있는 vertex와 다른 쪽에 있는 vertex를 매칭하는 edge를 찾아내는 것이다. 보통 최대한 많이 매칭을 하는 것이 목표이다.
- Connected components : 하나의 vertex로부터 갈 수 있는 모든 vertex들을 찾아서 연결된 부분을 찾는 것이다.
- Random walk : 하나의 vertex에서 시작해 random하게 다음 vertex를 선택했을 때 갈 수 있는 부분을 random walk라고 표현한다.
- PageRank : Web graph에서 각각의 페이지들이 연결되어 있을 때, 하나의 페이지가 많은 페이지로부터 연결이 됐을 때 그 페이지가 더 중요하다는 것을 분석할 수 있다.
그래프 처리 모델
- Think like a vertex(ex. 구글의 Pregel, 아파치의 Giraph)
- 각각의 vertex가 계산하는 유닛이다. vertex가 자기자신을 계산하고 다음 vertex에 그 정보를 넘겨주는 병렬로 수행되는 방식이다.
- Think like a (sum)graph
- 계산하는 단위를 vertex가 아닌 subgraph로 하는 모델이다.
Think like a vertex
- 그래프 데이터를 사용해서 계산하는 것을 일련의 iteration(= supersetp)으로 구성한다.
- 각각의 superstep마다 멈추는 barrier가 있다.(*bulk synchronous parallel 모델)
*프로세서-메모리 쌍의 집합을 사용하고 point-to-point 구조로 이루어져 있으며 병렬 컴퓨팅 방식이다. - 하나의 superstep 동안에 그래프 프로세싱 프레임워크는 사용자가 정의한 함수를 각각의 vertex에 대해서 병렬로 수행한다.
- 각각의 vertex에서는 해당하는 vertex V의 superstep S-1에 보내진 메시지들을 읽는다.
- 그다음 V의 state를 계산을 통해서 수정한다.
- 다른 vertex들이 superstep S+1에서 받을 메시지를 보낼 것이 있으면 보낸다.
- 이와 같은 수행을 vertex state machine이 계속할지 그만할지 결정한다.
vertex state machine
- 각각의 vertex는 Inactive한 상태이다.
- 다른 vertex로부터 메시지를 받으면 Active한 상태로 변경된다.
- Active한 상태에서 계속 계산을 하다가 어떤 superstep에서 자기한테 온 메시지가 하나도 없으면, Inactive한 상태로 전환된다.
(halt하겠다 => voting) - 모든 vertex가 정지하겠다고 voting하면 해당 그래프 알고리즘은 종료된다.
빅데이터가 있을 때 이런 알고리즘을 적용시키기엔 문제가 있다.(계산량이 어마어마하다.)
=> 분산 그래프 처리가 필요하다.
분산 그래프처리
- Master : 전체 그래프를 부분으로 쪼개서 각각의 부분을 특정 Worker에 할당한다.
- Worker : 그래프 전체에서 일부를 맡아 처리한다.
- Worker끼리 edge로 연결되어 있다면, 둘 사이에 메시지가 교환된다.
- Master가 하나의 substep을 진행하고 Worker에서 voting을 받아 최종 투표 결과를 결정한다.
머신러닝 시스템
딥러닝 < 머신러닝 < AI
딥러닝 : 머신러닝의 일부로 특히 딥 뉴럴 네트워크를 사용해서 representation을 배우는 러닝 방법이다.
머신러닝을 위해...
- 빅데이터
- 어떤 것을 배우는지 표현하는 모델(모델에 따라서 우리가 배워서 예측하고자 하는 것들이 달라진다.)
- 하드웨어 & 소프트웨어
머신러닝
- Regression : 특정한 전 사용량과 성능 사이의 관계를 찾아내라.
- Classification : ex. 이메일이 스팸인지 아닌지 검출한다.
- Clusterting : ex. 근접한 데이터들끼리 모아 cluster를 만든다.
- Topic modeling : ex. 많은 docu가 있을 때 각각이 어떤 topic에 해당하는 docu인지 찾아낸다.
- Collaborative filtering : 추천하는 시스템
- Frequent pattern mining : 자주 같이 발생하는 패턴들을 찾아보기
- Ranking : 여러가지 답이 있을 때 중요한 순서를 정한다.
딥러닝 응용
- 어떤 이미지가 왔을 때 그 이미지 픽셀 데이터를 입력으로 해당하는 이미지가 어떤 분류에 속하는지 파악
- 스피치 데이터를 텍스트로, 텍스트 데이터를 스피치로 변환
- 비디오 데이터를 보고 해당하는 비디오 데이터의 내용을 텍스트 형태로 요약
- Image, video style transfer는 하나의 이미지 비디오 스타일에서 다른 스타일로 변형
- Machine translation : 하나의 언어에서 다른 언어로 번역
머신러닝, 딥러닝 Step
- Training(학습)
- 반복적으로 특정 loss 값을 최적화하기 위해서 수행함으로써 최종적으로 우리가 원하는 모델을 만들어내는 과정
- Inferenct(추론)
- 추론 : 학습을 통해 얻은 모델을 사용하는 과정
- Prediction(예측)
- 예측 : 추론 과정에서 학습된 모델을 사용해서 새로운 입력 데이터가 들어왔을 때 하게 된다.
- 예측은 실시간으로 빠르게 해야 되기 때문에 latency(지연도)가 중요하다.
[6주차]
머신러닝, 딥러닝 시스템
머신러닝 Software Stack
- ML Core : 하드웨어를 사용해서 머신러닝 학습, 추론을 하는 부분
- Vision, Speech, Language : 각 도메인에 특화된 부분의 라이브러리
ML Framework
- 입력 파이프라인 : 데이터를 읽어서 학습해야 하는 모델로 전달하는 것으로, Mini-batch 단위로 데이터를 전달한다.
- 데이터 전달 후 forward pass 계산을 한다.
- 결과값(맨 끝의 logit)으로 'Compute loss' 단계를 수행한다. *loss : 우리가 원래 알고 있던 값과의 오차
- loss를 줄이기 위해 미분 값을 계산해서 전파한다.
- backward : 맨 끝에서부터 시작해서 gradient를 계산해서 앞쪽으로 미분 계산하는 것이 전달된다.
- 그렇게 미분 값이 계산된 후에 원래 있던 모델의 파라미터 값을 업데이트 한다.
- 위의 과정을 반복하는 것이 학습 과정이고, 반복 한 번을 iteration이라고 부른다.
- 해당하는 데이터를 한 번 다 스캔해서 수행한 것을 하나의 epoch라고 부른다.
- 1 ~ 8을 사용자가 정의한 종료조건을 만족할 때까지 반복 수행한다.
머신러닝 프레임워크
- Symbolic 머신러닝 프레임워크
- Imperative 머신러닝 프레임워크
- 두 프레임워크 다 Python이라는 언어를 사용해서 모델을 정의한다.
Symbolic 머신러닝 프레임워크
- 모델 정의(그래프를 만드는 부분)
- 그래프 수행
Imperative 머신러닝 프레임워크
- 수행하는 방법이 그래프 정의와 수행, 두 가지로 분리되어 있지 않다.
- statement가 나올 때마다 바로 바로 해당하는 state가 수행한다.
구분 | Symbolic 머신러닝 프레임워크 | Imperative 머신러닝 프레임워크 |
장점 | 최적화하기도 쉽다. 여러 다양한 환경에 deploy하기도 쉽다. |
기존의 Python 환경을 최대한 활용하기 때문에 프로그래밍 하기 쉽다. debugging하기가 쉽다. |
단점 | 프로그램하기 더 어렵다. 문제가 생겼을 때 debug하기도 힘들다. |
statement가 나올 때마다 바로 바로 수행을 하기 때문에 최적화를 할 수 있는 여지가 적다. |
사용 예시 | 모델 개발이 끝나면 production system에서 빠르게 수행할 때 사용한다. | 빠르게 모델을 exploration하면서 개발할 때 사용한다. |
TensorFlow
- TensorFlow 1점대 버전에서는 기본 모드로 Symbolic 그래프 수행 스타일을 따른다.
Symbolic 그래프 수행
- 수학적인 계산을 computation 그래프로 표현한다.
- 그래프에서 노드는 입력을 받아서 어떤 계산을 하고 출력을 내는 operation에 해당한다.
- 그래프에서 edge는 노드 사이에서 흘러가는 Tensor를 뜻한다. Tensor는 N-dimensional array에 해당한다.
- dimension이 1차원인 경우에는 Vector, dimension이 2차원인 경우에는 Matrix에 해당한다.
- 다른 예로 이미지 같은 경우에 3차원 Tensor로 표현할 수 있다.(row, column, color)
- 이런 Tensor들이 그래프를 통해서 흘러가기 때문에 TensorFlow라고 칭한다.
- 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)})
- Session을 초기화하는 과정
- sess.run(tf.global_variables_initialize())
- 변수들은 초기화되어야만 사용이 가능하다.
- sess.run(tf.global_variables_initialize())
- 입력 데이터를 주고 계산된 결과를 가져오는 그런 과정
- sess.run(h, {x : np.random.random(64,784)})
- h라는 것을 계산할 때 입력 x를 어떤 값을 줄지 정의해서 넘겨준다.
- h라는 값이 계산되어 결과를 얻는다.
- sess.run(h, {x : np.random.random(64,784)})
[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 가 발생한다.
입력데이터를 넣는 방법
- placeholder
- 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
- abstraction : 데이터 셋
- 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 변환
- shuffle : size를 주어 얼마나 많은 데이터를 shuffle할지 정한다.
- repeat : 특정한 값이 주어지지 않으면 계속 반복한다.
- batch : 머신러닝에선 data instance를 묶은 mini batch 단위로 iteration 수행이 진행되는데 이때 mini batch를 생성해주는 것이다.
Dataset Processing을 빠르게 하는 2가지 함수
- iterleave : 함수를 동시에 적용. 동시에 여러 파일을 읽기 때문에 빠른 수행시간을 보인다.
- prefetch : Dataset의 특정 부분을 미리 prefetching하는 함수.