2017 tensor flow dev summit

72
2017 TensorFlow Dev Summit Sequence Models and the RNN API Produced By Tae Young Lee

Upload: tae-young-lee

Post on 21-Feb-2017

396 views

Category:

Technology


6 download

TRANSCRIPT

Page 1: 2017 tensor flow dev summit

2017 TensorFlow Dev Summit

Sequence Models and the RNN API

Produced By Tae Young Lee

Page 2: 2017 tensor flow dev summit
Page 3: 2017 tensor flow dev summit

이전의 기억들이 현재에 영향을 미친다

Page 4: 2017 tensor flow dev summit

음성 인식 언어 모델 번역 영상에 주석 달기 chatbot

Page 5: 2017 tensor flow dev summit

Chatbot code

Page 6: 2017 tensor flow dev summit
Page 7: 2017 tensor flow dev summit
Page 8: 2017 tensor flow dev summit
Page 9: 2017 tensor flow dev summit
Page 10: 2017 tensor flow dev summit

RNN 동작 방식

Page 11: 2017 tensor flow dev summit

https://github.com/macournoyer/neuralconvo

오랫동안 정보를 기억하는 것

Page 12: 2017 tensor flow dev summit

LSTM 네트워크 장단기 기억 네트워크(Long Short Term Memory networks)는 보통 엘에스티엠으로 불립니다. 엘에스티엠은 장기 의존성(Vanishing Gradient)을 학습을 수 있는 특별한 종류의 순환 신경망입니다. 엘에스티엠은 Hochreiter와 Schmidhuber (1997)에 의해 소개되었습니다. 그리고 이후 연구에서 많은 사람에 의해 다듬어지고 널리 알려졌습니다.1 엘에스티엠은 매우 다양한 종류의 문제들에 대해 정말 잘 동작합니다. 그리고 현재 엘에스티엠은 널리 사용되고 있습니다. 엘에스티엠은 장기 의존성 문제를 피하고자 설계되었습니다. 오랫동안 정보를 기억하는 것이 사실상 엘에스티엠의 기본 동작입니다. 무언가 배우려고 애쓰기보다는요. 모든 순환 신경망은 사슬 형태의 반복되는 신경망 모듈들을 가집니다. 표준 순환 신경망에서, 이 반복되는 모듈은 한 개의 tanh 층 같은 매우 간단한 구조를 가질 것입니다.

https://docs.google.com/document/d/1M25vrmJHp21lK-C8Xhg42zFzXke9_NrvhHBqH2qISfY/edit#

Page 13: 2017 tensor flow dev summit
Page 14: 2017 tensor flow dev summit
Page 15: 2017 tensor flow dev summit

LSTM의 핵심은 셀 상태 다이어그램의 위쪽을 통과해 지나가는 수평선 셀 상태는 일종의 컨베이어 벨트

Page 16: 2017 tensor flow dev summit

Sigmoid 층은 0에서 1사이 숫자를 출력

0은 “아무것도 통과 못함” 1은 “모두 통과함”

Page 17: 2017 tensor flow dev summit

First 셀 상태에서 어떤 정보를 버릴지 결정하는 것

“잊기(forget) 게이트 층”이라 불리는 한 시그모이드 층에 의해 결정됩니다. 이 층은 ht-1과 xt를 보고 셀 상태 Ct-1에서의 각 숫자를 위한 0과 1 사이 숫자를 출력합니다. 1은 “이것을 완전히 유지함”을, 0은 “이것을 완전히 제거함”을 나타냄

Page 18: 2017 tensor flow dev summit

Second 어떤 새로운 정보를 셀 상태에 저장할지 결정

입력

첫째, “입력(input) 게이트 층”이라 불리는 한 시그모이드 층은 우리가 어떤 값들을 갱신할지 결정 둘째, tanh 층은 셀 상태에 더해질 수 있는 새로운 후보 값들의 벡터 Ct를 만듭니다. 다음 단계에서, 우리는 셀 상태를 갱신할 값을 만들기 위해 이 둘을 합함

Page 19: 2017 tensor flow dev summit

Third 이제 이전 상태 Ct-1에서 Ct로 갱신함

이전 상태 Ct-1에 ft를 곱합니다. ft는 우리가 전에 계산한 잊기 게이트 출력입니다. ft는 우리가 잊기로 결정한 것들을 잊게 만드는 역할 그런 다음 itCt를 더합니다. 이것이 각 상태 값을 우리가 얼만큼 갱신할지 결정한 값으로 크기 변경한(scaled) 새 후보 값

Page 20: 2017 tensor flow dev summit

Four 무엇을 출력할지 결정

출력은 셀 상태에 기반을 두지만 여과된(filtered) 버전 우선, sigmoid 층을 동작시킴. 그 sigmoid 층은 셀 상태에서 어떤 부분들을 출력할지 결정 그런 다음, 값이 -1과 1 사이 값을 갖도록 셀 상태를 tanh에 넣음 결정한 부분만 출력하도록, tanh 출력을 다시 sigmoid 게이트 출력과 곱함

Page 21: 2017 tensor flow dev summit
Page 22: 2017 tensor flow dev summit

1

Page 23: 2017 tensor flow dev summit

2

Page 24: 2017 tensor flow dev summit

3

Page 25: 2017 tensor flow dev summit

4

Page 26: 2017 tensor flow dev summit

Topics

• Reading Sequence Data

• The RNN API

• Fully Dynamic Calculation

• Fused RNN Cells

• Dynamic Decoding

Page 27: 2017 tensor flow dev summit

Reading and Batching Sequence Data

Page 28: 2017 tensor flow dev summit

1

Page 29: 2017 tensor flow dev summit

Feeding Sequence Data

SequenceExample proto to store sequence

• Efficient storage of multiple sequence

• Per time step variable feature counts

• Efficient Parser Op

• tf.parse_single_sequence_example

• Coming soon : TensorFlow Serving “First Class” citizen

https://www.tensorflow.org/api_docs/python/tf/parse_single_sequence_example

Page 30: 2017 tensor flow dev summit
Page 31: 2017 tensor flow dev summit

Batching Sequence Data : Static Padding

Pad each input sequence yourself, use FIFOQueue :

tf.train.batch(…)

https://www.tensorflow.org/api_docs/python/tf/train/batch

Page 32: 2017 tensor flow dev summit

Batching Sequence Data : Dynamic Padding

Use Padding FIFOQueue :

tf.train.batch(… dynamic_pad=True)

https://www.tensorflow.org/api_docs/python/tf/train/batch

Page 33: 2017 tensor flow dev summit

Batching Sequence Data : Bucketing

Use N + 1 Queues with conditional enqueueing :

tf.contrib.training.bucket_by_sequence_length(…. dynamic_pad=True)

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/api_docs/python/functions_and_classes/shard8/tf.contrib.training.bucket_by_sequence_length.md

Page 34: 2017 tensor flow dev summit

Batching Sequence Data : Truncated BPTT via State Saver

Use Barrier + Queues, you must call save_state each training step :

tf.contrib.training.batch_sequences_with_states(…)

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/api_docs/python/contrib.training.md

Page 35: 2017 tensor flow dev summit

BPTT (Backpropagation Through Time) BPTT는 순환신경망(RNN)에서 사용되는 (표준) 역전파 알고리즘입니다. RNN이 모든 시간 스텝에서 파라메터를 공유하기 때문에, 한 시점에서 오류가 역전파되면 모든 이전 시점으로 퍼져 BPTT란 이름이 붙었습니다. 수백 개의 길이를 갖는 긴 입력 시퀀스가 들어오면, 계산 비용을 줄이기 위해 고정된 몇 스텝 이후에 오류를 더이상 역전파하지 않고 멈추기도 합니다.

Page 36: 2017 tensor flow dev summit

The RNN API

Evolution and Design Decisions

Page 37: 2017 tensor flow dev summit
Page 38: 2017 tensor flow dev summit
Page 39: 2017 tensor flow dev summit

Simple RNN

Page 40: 2017 tensor flow dev summit
Page 41: 2017 tensor flow dev summit
Page 42: 2017 tensor flow dev summit

RNNCell

• Provide knowledge about the specific RNN architecture

• Represent a time step as a layer (c.f. Keras layers)

Keras란? Keras에 대한 설명은 http://keras.io/ 에서 찾아본다. theano나 tensor flow를 이용한 예제를 보면 코드에는 확실히 보이는 인스턴스가 없는데 백그라운드에서 뭔가가 만들어지고 있다는 생각이 든다. 다른 언어를 쓰던 사람들은 어떨지 모르겠지만 C++을 주로 사용해오던 나로서는 이해가 안 되는 코드가 많다. Keras는 그러한 '흑마술'을 없애고 눈에 확실히 보이는 코드로 theano나 tensor flow를 wrapping 한 패키지

Page 43: 2017 tensor flow dev summit
Page 44: 2017 tensor flow dev summit
Page 45: 2017 tensor flow dev summit

Fully Dynamic Calculation

Fast and Memory Efficient Custom Loops

Page 46: 2017 tensor flow dev summit

Fully Dynamic Calculation

Goal : Handle sequence of unknown length

Tools :

• tf.while_loop

dynamic loops + gradients

• tf.TensorArray

dynamic Tensor slice access, gradients

Page 47: 2017 tensor flow dev summit

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/api_docs/python/functions_and_classes/shard4/tf.while_loop.md

Page 48: 2017 tensor flow dev summit

https://www.tensorflow.org/api_docs/python/tf/TensorArray

Page 49: 2017 tensor flow dev summit
Page 50: 2017 tensor flow dev summit

RNN Encoder via Fully Dynamic RNN

2

Page 51: 2017 tensor flow dev summit
Page 52: 2017 tensor flow dev summit

Fused RNN Cells

Optimizations for Special Cases

Page 53: 2017 tensor flow dev summit

Type of Fusion

• XLA Fused time steps

• Manually fused time steps

• Manually fused loops

Fusion tradeoffs :

• Flexibility for Speed

• “Works Everywhere” to “Fast on XOR(GPU, Android,…)”

Page 54: 2017 tensor flow dev summit

XLA (Accelerated Linear Algebra) is a domain-specific compiler for linear algebra that optimizes TensorFlow computations. The results are improvements in speed, memory usage, and portability on server and mobile platforms. Initially, most users will not see large benefits from XLA, but are welcome to experiment by using XLA via just-in-time (JIT) compilaton or ahead-of-time (AOT) compilation. Developers targeting new hardware accelerators are especially encouraged to try out XLA

XLA (Accelerated Linear Algebra)는 TensorFlow 계산을 최적화하는 선형 대수학을위한 도메인 별 컴파일러입니다. 그 결과 서버 및 모바일 플랫폼에서 속도, 메모리 사용 및 이식성이 개선되었습니다. 처음에는 대부분의 사용자가 XLA에서 큰 이익을 볼 수는 없지만 JIT (Just-In-Time) 컴파일 또는 AOT (Ahead-Of-Time) 컴파일을 통해 XLA를 사용하여 실험 할 수 있습니다. 새로운 하드웨어 가속기를 목표로하는 개발자는 특히 XLA를 사용해 보는 것이 좋습니다.

https://www.tensorflow.org/versions/master/experimental/xla/

Page 55: 2017 tensor flow dev summit
Page 56: 2017 tensor flow dev summit
Page 57: 2017 tensor flow dev summit
Page 58: 2017 tensor flow dev summit
Page 59: 2017 tensor flow dev summit

Dynamic Decoding

Forthcoming API

Page 60: 2017 tensor flow dev summit

RNN Decoder via Fully Dynamic RNN

3

Page 61: 2017 tensor flow dev summit

Dynamic Decoder

• New OO API

• Under active development

• Base decoder library for Open Source Neural Machine Translation tutorial (coming soon)

• tf.contrib.seq2seq

Page 62: 2017 tensor flow dev summit

https://gist.github.com/nikitakit/6ab61a73b86c50ad88d409bac3c3d09f

Page 63: 2017 tensor flow dev summit

http://www.slideshare.net/KeonKim/attention-mechanisms-with-tensorflow

Page 64: 2017 tensor flow dev summit

http://www.slideshare.net/KeonKim/attention-mechanisms-with-tensorflow

Page 65: 2017 tensor flow dev summit

Beam Search의 일종 (Path-based algorithm)

Beam Search한 시점(t)마다 샘플링하는 대신에 여러 시점에서 샘플링을 시도함. 예) 확률이 높은 A, O을 선택하고, 이후의 단계에서 계속 예측을 시도함. 그리고 이중에서 전체확률이 가장 높은sequence을 선택함. 이 방법은 단계가 진행할수록 계산양이 기하급수적으로 증가하므로, 각각의 시점에서 가장 가능성이 높은 몇몇 후보 서열만 남기고 계산을 진행함. => Beam Search

Page 66: 2017 tensor flow dev summit

Helper functions for preparing translation data. https://www.tensorflow.org/tutorials/seq2seq

Page 67: 2017 tensor flow dev summit
Page 68: 2017 tensor flow dev summit
Page 69: 2017 tensor flow dev summit
Page 70: 2017 tensor flow dev summit

Softmax

4

Page 71: 2017 tensor flow dev summit

Softmax (소프트맥스) – cost function 소프트맥스는 클래스 분류 문제를 풀 때 (점수 벡터)를 (각 클래스별 확률)로 변환하기 위해 흔히 사용하는 함수입니다. 각 점수에 지수(exp)를 취한 후, 정규화 상수로 나누어 총합이 1이 되도록 계산합니다. 여기서 만약 기계번역 문제처럼 클래스의 종류가 아주 많다면 정규화 상수를 계산하는 작업은 너무 비싼 연산이 됩니다. 효율적으로 계산하기 위한 대안으로 계층적 소프트맥스나 NCE 등 로스 기반 샘플링 기법 등이 있습니다.

noise-contrastive estimation (NCE) 손실 함수를 사용할 것이다. 이는 텐서 플로우에 미리 구현된 tf.nn.nce_loss() 함수를 이용

Page 72: 2017 tensor flow dev summit