Top Banner
2016/04/04 ククククククク ククククク ククククク クククククククククククククク TensorFlow ク CNTK
204

TensorFlowとCNTK

Apr 21, 2017

Download

Internet

maruyama097
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: TensorFlowとCNTK

2016/04/04 クラウド研究会 丸山不二夫

ニューラル・ネットワークと技術革新の展望TensorFlow と CNTK

Page 2: TensorFlowとCNTK

Agenda ニューラル・ネットワークと技術革新の展望

クラウドとモバイルへのインパクト 我々自身がデータをもつことの重要性

ニューラル・ネットワーク技術の共通の基礎 訓練と実行 グラフ表現とモジュール構造 パラメーター変更のアルゴリズム

TensorFlow と CNTK CNTK の高速化チューニング TensorFlow の大規模分散化

Page 3: TensorFlowとCNTK

ニューラル・ネットワークと技術革新の展望

クラウドとモバイルへのインパクト 我々自身がデータをもつことの重要性

Part I

Page 4: TensorFlowとCNTK

クラウドとモバイルへのインパクト

クラウド・ビジネスの新しい市場 新しいスタイルのモバイル・アプリ GCPNEXT から 技術とビジネス --- Google の場合 今後の展望

Page 5: TensorFlowとCNTK

ニューラル・ネットワークの訓練と推論実行の「非対称性」 ニューラル・ネットワークでの計算は、データ学習

を行う「訓練」と「推論実行」の大きく二つのフェーズに分かれる。

訓練では、膨大なデータを繰り返し学習して、ニューラル・ネットワーク内部のパラメーターを、少しづつ修正していく。それは、大規模で時間のかかるバッチ処理になる。

しかし、こうしていったん学習されたパラメーターを利用すれば、推論(数値予測・クラス分類等)を実行するのは、スマホ上でもリアルタイムに可能なぐらい、軽い処理になる。

ニューラル・ネットワークの訓練と実行の二つのフェーズの、必要とされる処理能力の大きな「非対称性」は、今日の IT の基本的なインフラであるクラウドとモバイルの双方の今後に、大きなインパクトを与えていくだろう。

Page 6: TensorFlowとCNTK

「訓練」のサービス提供クラウド・ビジネスの新しい市場 訓練のフェーズで必要とされる、膨大なデータ処理

の能力は、クラウド・ビジネスに、訓練のサービスを提供するという、これまでになかった新しい市場を提供していくだろう。

今回の GCPNEXT では、商業サービス公開の発表はなかったが、 Google Cloud Machine Learning がターゲットとしているのは、そうした市場だ。このクラウドの新しい市場でも、 Google は先行しているように見える。 小論の Part III でも述べるように、Google は、 TensorFlow の大規模分散化に注力している。

Page 7: TensorFlowとCNTK

Google Cloud Machine Learning

GCPNEXT 2016 での Jeff Dean

Page 8: TensorFlowとCNTK

新しいスタイルのモバイル・アプリ 学習の成果が、モバイル上でも実行可能なことは、

ネイティブ・アプリとも Web アプリともことなった第三のスタイルのモバイル・アプリが生まれることを意味する。それは、プログラムではなく、訓練済みのデータに基づいて動作する。

既に、 TensorFlow では Google の画像認識のInception 相当モデルが、ネットワーク接続なしでも Android 上で動くサンプルが提供されている。これは、驚異的なものだ。

ここではまた、クラウドがモバイルにリアルタイムの AI サービスを提供することも可能になる。今回公開された Speech API や Vision API は、そうしたものだ。当然、クラウド上・モバイル上のそれらのハイブリッド・アプリが生まれてくるだろう。

Page 9: TensorFlowとCNTK

Cloud Vision API

GCPNEXT 2016 から

Page 10: TensorFlowとCNTK

Cloud Vision API

GCPNEXT 2016 から

Page 11: TensorFlowとCNTK

Cloud Vision API

GCPNEXT 2016 から

Page 12: TensorFlowとCNTK

Cloud Vision API

GCPNEXT 2016 から

Page 13: TensorFlowとCNTK

Cloud Vision API

GCPNEXT 2016 から

Page 14: TensorFlowとCNTK

Cloud Vision API

GCPNEXT 2016 から

Page 15: TensorFlowとCNTK

Cloud Speech API

GCPNEXT 2016 から

Page 16: TensorFlowとCNTK

Use your own data to train models

GCPNEXT 2016 から

Page 17: TensorFlowとCNTK

技術とビジネス --- Google の場合

Google 内部での機械学習技術の利用は急増している。ただ、それには理由がある。それは、彼らの基本的なビジネスである検索と広告の分野で、機械学習技術が極めて有効に利用可能だという認識が広まっているからである。技術をビジネスがドライブし、ビジネスを技術がドライブしている。

Page 18: TensorFlowとCNTK

Google 内部での Deeo Learning 技術利用の拡大

Page 19: TensorFlowとCNTK

Cloud Machine Learning の発表では、どんなデモが行われたか?

Page 20: TensorFlowとCNTK

GCP NEXT での Click Prediction デモ

よく見えないので拡大してみた

Page 21: TensorFlowとCNTK

目標は、過去のクリックのデータから、ユーザーがもっともクリックしそうな広告・コンテンツを見つけるということ。そのために、 BigQuery 上の大量のクリック・ストリームのデータを利用して、大規模な確率モデルを訓練して、大規模な予測を実行する。

Click Prediction

Page 22: TensorFlowとCNTK

Google RankBrain !!!

https://goo.gl/o7RQrU

他の例より規模が一桁大きい

Page 23: TensorFlowとCNTK

https://goo.gl/o7RQrU

自動応答メール Smart Reply

Page 24: TensorFlowとCNTK

今後の展望新しい分散処理技術と言語理解へ それらをコントロールする技術は、人間の脳が、感覚・運動器官として相対的には独立した、眼・耳・口・ ... をコントロールしているのに似た、新しいハードウェアの利用を含む、ソフトウェアだけに閉じない新しい分散処理技術の時代の扉を開いて行くだろう。

ニューラル・ネットワークの最先端の研究は、 RNN/LSTM に移行している。そこでの中心的な課題は、 Sequence to Sequence と言われる、基本的には、言語理解に関わる問題である。この分野でも、大きな展開が起きる可能性がある。そうした飛躍が可能になれば、その応用分野は広大である。

Page 25: TensorFlowとCNTK

https://goo.gl/o7RQrU

Sequence to Sequence

Page 26: TensorFlowとCNTK

https://goo.gl/o7RQrU

Sequence to Sequence

Page 27: TensorFlowとCNTK

我々自身がデータをもつことの重要性

機械学習の基本 基本的なデータたち Human Computing どう、データをつくるか?

Page 28: TensorFlowとCNTK

機械学習の基本は、人間の知識を機械に移転すること

機械学習の基本を確認しよう。ただ、人間の知識を機械に移転するためには、単にマシンと大量のデータがあればいいというわけではない。正確にラベル付けられたデータの「作成」と「蓄積」が不可欠。それには、人間の根気強い、組織的な取り組みが必要。

Page 29: TensorFlowとCNTK

「人間には容易でも機械には難しいこと」「機械には容易でも人間には難しいこと」

その境界は、動的に変化するのだが、いつの時点でも、機械に提供する学習データ作りは、前者。その段階を経なければ、機械は賢くならない。現実的には、それぞれに要する経済的なコストが、現実を動かす。その費用を、誰がどう負担するのか? 以下で、基本的な学習用データセットを見てみよう。

Page 30: TensorFlowとCNTK

http://yann.lecun.com/exdb/mnist/

MNIST  手書き数字のデータベース

60,000 サンプル

Page 31: TensorFlowとCNTK

CIFAR-10   10 のカテゴリーの画像データ

一つのカテゴリーに 6,000枚。計 60,000 サンプル

https://www.cs.toronto.edu/~kriz/cifar.htmlTront 大学

Page 32: TensorFlowとCNTK

ImageNet

http://www.image-net.org

WordNet の名詞( 80,000+ )に対応した画像データベース

Stanford 大学

Page 33: TensorFlowとCNTK

https://wordnet.princeton.edu/

Princeton 大学

Page 34: TensorFlowとCNTK

The Penn Treebank Project

https://www.cis.upenn.edu/~treebank/

Pennsylvania 大学

https://www.ldc.upenn.edu/

Page 35: TensorFlowとCNTK

The Penn Treebank Project

Page 36: TensorFlowとCNTK

基本的な性格をもつオープンなデータの共有が、機械学習のイノベーションをドライブしている

先の「データ作成のコスト」の問題に対する最も有力な回答は、オープンなコミュニティ(大学・学会を含む)が、基本的な性格をもつ学習用データを公開し、それを皆が共有すること。(日本は、どうだろう? 少なくとも日本語は、日本がやるしかない。)

Page 37: TensorFlowとCNTK

Human Computing

「人間には容易でも機械には難しいこと」Captcha画像のラベル付け ( with Google )Duolingoゲミフィケーションとクラウド・ソーシング

Page 38: TensorFlowとCNTK

人間の自由時間の利用 2003年に、ソリティアを遊んだ、人間の総

時間は、 90億時間。 ある人たちは、コンピュータの無駄な計算サ

イクルについて話をしているが、人間の無駄なサイクルについては、どうなんだろう?

エンパイア・ステートビルを作るために、人間が使った時間は、 700万時間。

パナマ運河を作るために、人間が使った時間は、 2000万時間。(ソリティアの一日分以下)Carnegy Melon Univ.   Luis von Ahn

Page 39: TensorFlowとCNTK

Most human can pass, but current computer can not pass.

Page 40: TensorFlowとCNTK

http://elie.im/blog/security/five-surprising-captcha-schemes/#.UjUKt7zqH9I

Page 41: TensorFlowとCNTK

http://www.youtube.com/watch?v=tx082gDwGcM

Human Computing / Crowd Sourcing2012年 Google TechTalk

Page 42: TensorFlowとCNTK

我々が、それぞれのドメインで持つ知識を、きちんとデータ化すること

それを機械に学習させる。量優先で質的規定が曖昧な Big Data ではなく、優れた質をもった、それぞれのドメインに固有のGood Data を持つことが、より重要。ニッチでもいい。チャンスは、 AI の応用領域の数ほど、たくさん存在している。もちろん、その前提は、基本的なオープンなデータの存在と共有なのだが。

Page 43: TensorFlowとCNTK

ニューラル・ネットワーク技術の共通の基礎

訓練と実行 グラフ表現とモジュール構造 パラメーター変更のアルゴリズム

Part II

Page 44: TensorFlowとCNTK

ニューラル・ネットワーク技術の共通の基礎

ニューラル・ネットワークの様々なフレームワークが提案されている。ただ、それらの基礎にあるのは、共通のものだ。ここでは、次の三点で共通性を見ることにする。

訓練の定義と実行 グラフ表現とモジュール構造 パラメーター変更のアルゴリズム

Page 45: TensorFlowとCNTK

訓練の定義と実行

訓練の実行 -- TensorFlow と CNTK 訓練の定義 -- TensorFlow と CNTK

Part II ニューラル・ネットワーク技術の共通の基礎

Page 46: TensorFlowとCNTK

訓練の定義と実行ニューラル・ネットワークの学習は、基本的には、次のようなステップからなる。  訓練の定義

推論を行うネットワーク・グラフの定義 学習、すなわち、ネットワークのパラメーターの変更を行

うアルゴリズムの定義 訓練、すなわち、データでの繰り返し学習を行う、繰り返

しの定義 ...

訓練の実行

Page 47: TensorFlowとCNTK

訓練の実行   -- TensorFlow と CNTK

訓練の実行での、 TensorFlow と CNTKのコマンド・シーケンスを見てみよう。ここでは、まだ、違いしか見えてこない。

Page 48: TensorFlowとCNTK

訓練の実行例  TensorFlow$ python –m モデル$ python -m tensorflow.models.image.mnist.convolutional

tensorflor-master/tensorflow/  以下

Page 49: TensorFlowとCNTK
Page 50: TensorFlowとCNTK
Page 51: TensorFlowとCNTK

訓練の実行例  CNTK$ cntk configFile=cntk ファイル$ cntk configFile=../Config/02_Convolution.cntk

CNTK/Examples/  以下

Page 52: TensorFlowとCNTK
Page 53: TensorFlowとCNTK
Page 54: TensorFlowとCNTK

訓練の定義   -- TensorFlow と CNTK

TensorFlow と CNTK の訓練の定義を比較してみよう。 TensorFlow は Python で手続きをベタに記述し、 CNTK は宣言的な Domain Specific Language を使う。違いが目立つが、グラフの定義・最適化のアルゴリズムの指定・訓練の繰り返しの指定等で、基本的な対応が見え始める。

Page 55: TensorFlowとCNTK

# Create the modelx = tf.placeholder("float", [None, 784])W = tf.Variable(tf.zeros([784, 10]))b = tf.Variable(tf.zeros([10]))y = tf.nn.softmax(tf.matmul(x, W) + b)

# Define loss and optimizery_ = tf.placeholder("float", [None, 10])cross_entropy = -tf.reduce_sum(y_ * tf.log(y))train_step = tf.train.GradientDescentOptimizer(0.01)\ .minimize(cross_entropy)

# Traintf.initialize_all_variables().run()for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) train_step.run({x: batch_xs, y_: batch_ys})

グラフの定義

最適化のアルゴリズム

グラフで訓練繰り返し

https://goo.gl/MwscZO

訓練の定義例  TensorFlow

Page 56: TensorFlowとCNTK

ndlMacros = "$ConfigDir$/Macros.ndl”

train = [ action = "train”

NDLNetworkBuilder = [ networkDescription = "$ConfigDir$/02_Convolution.ndl” ] < ndlは、 Net Definition Language 次にリストを示す >

SGD = [ epochSize = 60000 minibatchSize = 32 learningRatesPerMB = 0.5 momentumPerMB = 0*10:0.7 maxEpochs = 15 ]

reader = [... ]]

訓練の定義例  CNTK

グラフの定義

繰り返しの指定

Page 57: TensorFlowとCNTK

....run = DNN // 実際に DNN という名前のグラフを構成する

ndlMnistMacros = [   .... ]

DNN = [ .... <省略: グラフの定義の一部を次ページに示す > .... ce = CrossEntropyWithSoftmax(labels, ol ) err = ErrorPrediction(labels, ol)

# Special Nodes FeatureNodes = (features)   LabelNodes = (labels)      CriterionNodes = (ce)     EvalNodes = (err) OutputNodes = (ol) ]

最適化のアルゴリズム

02_Convolution.ndl 最適化の定義  CNTK

Page 58: TensorFlowとCNTK

DNN = [ .... # conv1 kW1 = 5; kH1 = 5; cMap1 = 16 hStride1 = 1; vStride1 = 1 # weight[cMap1, kW1 * kH1 * inputChannels] # ConvReLULayer is defined in Macros.ndl conv1_act = ConvReLULayer(featScaled, cMap1, 25,                           kW1, kH1, hStride1, vStride1, 10, 1)   # pool1   ... # conv2 ... # pool2 ... # DNNImageSigmoidLayer and DNNLayer are defined in Macros.ndl h1 = DNNImageSigmoidLayer(4, 4, cMap2, h1Dim, pool2, 1) ol = DNNLayer(h1Dim, labelDim, h1, 1)

ce = CrossEntropyWithSoftmax(labels, ol) ...]

02_Convolution.ndl グラフの定義  CNTK

Macros.ndl を参照している

Page 59: TensorFlowとCNTK

ConvReLULayer(inp, outMap, inWCount, kW, kH, hStride, vStride, wScale, bValue) = [ convW = LearnableParameter(outMap, inWCount, init="uniform", initValueScale=wScale) convB = ImageParameter(1, 1, outMap, init="fixedValue", value=bValue, imageLayout=$imageLayout$) conv = Convolution(convW, inp, kW, kH, outMap, hStride, vStride, zeroPadding=false, imageLayout=$imageLayout$) convPlusB = Plus(conv, convB); act = RectifiedLinear(convPlusB);]DNNImageSigmoidLayer(inW, inH, inC, outDim, x, parmScale) = [ ... ]DNNLayer(inDim, outDim, x, parmScale) = [ W = LearnableParameter(outDim, inDim, init="uniform", initValueScale=parmScale) b = LearnableParameter(outDim, 1, init="uniform", initValueScale=parmScale) t = Times(W, x) z = Plus(t, b)]

Macro.ndl グラフの定義  CNTK

マクロを見るとネットワークの見慣れた形が見えてくる

Page 60: TensorFlowとCNTK

ニューラル・ネットワークのグラフ表現とモジュール構造

DNN のグラフ表現とモジュール構造 CNN のグラフ表現とモジュール構造 RNN モジュールの数式による表現

Part II ニューラル・ネットワーク技術の共通の基礎

丸山の次の資料を参照されたい  https://goo.gl/Q0mKfy   

Page 61: TensorFlowとCNTK

ニューラル・ネットワークのグラフ表現とモジュール構造

それぞれのフレームワークごとに表現のスタイルには違いがあるものの、重要なことは、それが表現しているニューラル・ネットワークの「グラフ」は、同一のものであるということである。それは、基本的なモジュールの組み合わせでできている。

Page 62: TensorFlowとCNTK

DNN のグラフ表現とモジュール構造

まずは、基本的な DNN (Deep Neural Network) のグラフ表現とモジュール構造を見ていこう

Page 63: TensorFlowとCNTK

ニューラル・ネットワークの例

これでも省略されている 784->8

DNN のグラフ

Page 64: TensorFlowとCNTK

TensorFlow では、複数のニューロンからなる一つの層は、次のようなグラフで表現される。

行列の積X

W

行列の和

b

φ の適用

5 つのノードがあるが、 W と b には、重みとバイアスの値が入り、残りの 3 つのノードは、演算を行うノードである。この層の働きは、φ(X ・ W+b) で表現される。

一つの層

Page 65: TensorFlowとCNTK

積X

W和

bφ 積

W和

隠れ層の ニューロン数 :15 重み WH: 784x15次元 バイアス bH: 15次元

出力層の ニューロン数 :10 重み WO: 15x10次元 バイアス bO: 10次元

入力層 隠れ層 出力層

こっちのグラフの方が、ずっとわかりやすい!

隠れ層の 入力:784 784次元

TensorFlow のグラフ

Page 66: TensorFlowとCNTK

TensorFlowCNTK

これらのグラフは、同じものである

Page 67: TensorFlowとCNTK

TensorFlowCNTK

これらのグラフは、同じものである

Page 68: TensorFlowとCNTK

TensorFlow Torch7

これらのグラフは、ほぼ、同じものである

Page 69: TensorFlowとCNTK

Torch7 での DNN モジュールの記述例

DNN

Page 70: TensorFlowとCNTK

# Hidden 1 with tf.name_scope('hidden1'): weights = tf.Variable( tf.truncated_normal([IMAGE_PIXELS, hidden1_units], stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))), name='weights') biases = tf.Variable(tf.zeros([hidden1_units]), name='biases') hidden1 = tf.nn.relu(tf.matmul(images, weights) + biases) # Hidden 2 with tf.name_scope('hidden2'): weights = tf.Variable( tf.truncated_normal([hidden1_units, hidden2_units], stddev=1.0 / math.sqrt(float(hidden1_units))), name='weights') biases = tf.Variable( tf.zeros([hidden2_units]), name='biases') hidden2 = tf.nn.relu(tf.matmul(hidden1, weights) + biases) # Linear .... ....

TensorFlow での DNN モジュールの記述例

DNN モジュールが、 φ(X ・ W+b) の形をしていることは、簡単に確認できる。

Page 71: TensorFlowとCNTK

DNN = [ hiddenDim = 200

# DNNSigmoidLayer and DNNLayer are defined in Macros.ndl h1 = DNNSigmoidLayer(featDim, hiddenDim, featScaled, 1) ol = DNNLayer(hiddenDim, labelDim, h1, 1)

ce = CrossEntropyWithSoftmax(labels, ol) err = ErrorPrediction(labels, ol)

# Special Nodes FeatureNodes = (features) LabelNodes = (labels) CriterionNodes = (ce) EvalNodes = (err) OutputNodes = (ol)]

CNTK での DNN モジュールの記述例

DNNSigmoidLayer, DNNLayer の定義は、 Macro.ndlの中にある。

Page 72: TensorFlowとCNTK

DNNLayer(inDim, outDim, x, parmScale) = [ W = LearnableParameter(outDim, inDim,          init="uniform", initValueScale=parmScale) b = LearnableParameter(outDim, 1,       init="uniform",initValueScale=parmScale) t = Times(W, x) z = Plus(t, b)]

DNNSigmoidLayer(inDim, outDim, x, parmScale) = [ W = LearnableParameter(outDim, inDim,          init="uniform", initValueScale=parmScale) b = LearnableParameter(outDim, 1,       init="uniform",initValueScale=parmScale) t = Times(W, x) z = Plus(t, b) y = Sigmoid(z)]

CNTK マクロでの DNN モジュールの記述例

DNN モジュールが、 φ(X ・ W+b) の形をしていることは、簡単に確認できる。

Page 73: TensorFlowとCNTK

CNN のグラフ表現とモジュール構造

現在、もっとも利用されている CNN (Convolutional Neural Network) のグラフ表現とモジュール構造を見てみよう。 CNN は、どんどん多層化しているので、こうしたアプローチは必須である。

Page 74: TensorFlowとCNTK

複雑な CNN のグラフ

http://www.cs.unc.edu/~wliu/papers/GoogLeNet.pdf

“Going Deeper with Convolutions”Google Inception

この二つを区別する!

Page 75: TensorFlowとCNTK

回転する

モジュールからなるモジュール

複雑な CNN のグラフ

Page 76: TensorFlowとCNTK

回転するこ

の組

み合

わせ

モジュールからなるモジュール

複雑な CNN のグラフ

Page 77: TensorFlowとCNTK

モジュールからなるモジュールの組み合わせ

複雑な CNN のグラフ

Page 78: TensorFlowとCNTK

複雑な CNN のグラフ

モジュールからなるモジュールの組み合わせ

Page 79: TensorFlowとCNTK

いまは、こんなことになっている

http://lsun.cs.princeton.edu/slides/Christian.pdf

Page 80: TensorFlowとCNTK

CNTK マクロでの CNN モジュールの記述例

ConvReLULayer(inp, outMap, inWCount, kW, kH,              hStride, vStride, wScale, bValue) = [ convW = LearnableParameter(outMap, inWCount,              init="uniform", initValueScale=wScale) convB = ImageParameter(1, 1, outMap,              init="fixedValue", value=bValue,              imageLayout=$imageLayout$) conv = Convolution(convW, inp, kW, kH,              outMap, hStride, vStride,              zeroPadding=false,              imageLayout=$imageLayout$) convPlusB = Plus(conv, convB); act = RectifiedLinear(convPlusB);]

この CNN モジュールは、φ(Conv(X,W, ...)+b) の形をしている。

Page 81: TensorFlowとCNTK

次回マルレク予告Convolutional Network

入門講座

日時:  5月 13 日 19:00~場所:  TIS 西新宿定員:  200名

Convolutional Network は、現在のニューラル・ネットワーク技術の中心的な技術で、また、もっとも成功した技術でもあります。講演では、ニューラル・ネットワークを学び始めた人を対象に、 CNN の基本をわかりやすく解説します。

Page 82: TensorFlowとCNTK

RNN モジュールの数式による表現

現在、もっとも活発に研究されている RNN (Recurrent Neural Network) のモジュール構造を見てみよう。ただし、そのグラフ表現は複雑であり、モジュールの数式による表現を併用したほうが、見通しは良くなる。

Page 83: TensorFlowとCNTK

少し複雑な RNN のグラフの例(これは、 LSTMのセル)  σ(sigmoid のこと ), tanh は、活性化関数

次の式をグラフで追ってみるといい。

Chris Olah "Understanding LSTM Networks" http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 

Page 84: TensorFlowとCNTK

これは、 CNTK のサンプルだが、グラフだけでは、全容を把握するのは難しい。

Page 85: TensorFlowとCNTK
Page 86: TensorFlowとCNTK
Page 87: TensorFlowとCNTK
Page 88: TensorFlowとCNTK

ニューラル・ネットワークのパラメーター変更のアルゴリズム

Gradient Descent Stochastic Gradient Descent と

mini-batch Back Propagation Automatic Differentiation

Part II ニューラル・ネットワーク技術の共通の基礎

Page 89: TensorFlowとCNTK

Gradient Descent

ここでは、パラメータ変更の基本的なアルゴリズムである Gradient Descent の基本を確認する。まずは、線形回帰の問題で考えよう。

Page 90: TensorFlowとCNTK

Gradient Descent の基本 損失関数を定めて、誤差を最小にするパラメータを求める

次の図で、サンプル中の i 番目の点を (x(i), y(i)) とすれば、 y=ax+b 上の点と点 (x(i), y(i)) との垂直方向の誤差は、  (ax(i)+b) – y(i) となる。

誤差は、正負の値をとるので、単純に、誤差の平均を取っても、打ち消しあって、全体としての誤差の大きさはわからなくなる。

そこで、誤差の二乗をとって、その平均を最小にすることを考える。

a, b の関数である、この誤差の二乗の平均を、損失関数とすればいい。

線形回帰の場合

Page 91: TensorFlowとCNTK

誤差誤差

誤差誤差

データの各点と、 y=ax+b との誤差が、もっとも小さくなるように、 a,b の値を修正する。

(x(i), y(i))

(ax(i)+b) – y(i)

( ax(i)+b), y(i) )

誤差の二乗を Loss関数にする

こうした形の損失関数を、 “ quadratic cost” という

Page 92: TensorFlowとCNTK

仮説 :

パラメーター : a, b

損失関数 :

目標 :

問題の整理

y(x) = ax + b

a, b y

a, ba, b

Page 93: TensorFlowとCNTK

損失関数 J(a, b) は、 a,b についての関数で、この例では、次のような形をしている

a b

Page 94: TensorFlowとCNTK

簡単にするために、二次元のグラフで考えよう。ある点から始めて、その点から極小点に近ずくためには、どうすればいいか?

二つの場合がある。その点が極小点の右側にある場合には、その点の x座標を少し減らせばいい。その点が極小点の左側にある場合には、その点の x座標を少し増やせばいい。

その点が、極小点の右にあるか左にあるかは、その点での接戦の傾きが、正であるか負であるかでわかる。

よって、 α を正の数値とすれば、次の式が、より近づいた点の位置を与える。

直感的な説明

損失関数を、パラメーターで微分している

Page 95: TensorFlowとCNTK

どう、重みとバイアスを修正するのか?

もう少し、一般的に、 Gradient Descent をまとめてみよう。損失関数を C とするとき、次の式に従って、重み Wk とバイアス bl を変更すればいい。

損失関数が、 ここで見た、 quadratic cost の形をしていない場合(例えば、 Cross Entropy の場合)でも、この考え方は、変わらない。

η は学習率

Page 96: TensorFlowとCNTK

コスト関数が Quadratic Cost の時の勾配を求めてみる (線形回帰)

だとして、 1項だけの場合の微分を考える

Page 97: TensorFlowとCNTK

j jj

この式を、そのまま用いると、パラメータ更新の、基本的なアルゴリズムは、次のようになる。この操作を、値が収束するまで何度も繰り返す。m は、全データの数である。

Page 98: TensorFlowとCNTK

二項分類の Logistic 回帰の場合

コスト関数 ( Log Likelihood )

Logitic 回帰の微分も、線形回帰の場合の Quadratic Costの微分と同じ形になる!計算は省略したが、次の文献を参照されたい。“ CS229 Lecture notes”http://cs229.stanford.edu/notes/cs229-notes1.pdf

Page 99: TensorFlowとCNTK

NDLNetworkBuilder = [ run = ndlLR ndlLR = [ .... # parameters to learn B = Parameter(LDim, 1) W = Parameter(LDim, SDim)

# operations t = Times(W, features) z = Plus(t, B) s = Sigmoid(z)

LR = Logistic(labels, s) EP = SquareError(labels, s)

# root nodes FeatureNodes = (features) LabelNodes = (labels) CriteriaNodes = (LR) EvalNodes = (EP) OutputNodes = (s) ] ]

Logistic(label, s) = -sum(labels * log(s) + (1 - labels) * log(1 - s) )

CNTK でのLogistic 回帰の

ネットワーク定義例

Page 100: TensorFlowとCNTK
Page 101: TensorFlowとCNTK

Stochastic Gradient Descent

ここでは、まず、訓練実行の三つのスタイル、 Batch, SDG, mini-Batch の違いを見る。実際の応用では、 mini-Batch を用いるのが一般的である。最後に、 mini-Batch も、その確率論的性格から、 SDGと呼ばれることを述べる。

Page 102: TensorFlowとCNTK

変数の修正にどのくらいの時間がかかるか?前向きの推論と比べて、約 3倍の時間がかかる。

Page 103: TensorFlowとCNTK

Batch

・・・・・全てのデータ

先のパラメータ更新のアルゴリズムを、そのまま実装したもの。すべてのデータについて前向き推論した後で、一つの更新が行われる

データの数が大きくなると、計算量とメモリー消費が巨大になり、現実的でない。

Page 104: TensorFlowとCNTK

Stochastic Gradient Descent ( SDG )

・・・・・

こういうやり方もある。ひとつのデータについて前向き推論した後で、一つのパラメータ更新を行う。これを、 SDG という。

一つのデータのみで全てのパラメータをいじるので、収束性にやや問題がある。

Page 105: TensorFlowとCNTK

Mini-Batch

・・・・・

先に見た Batch と SDG を組み合わせたスタイル。一定数のかたまりのデータで推論を行った後、それに基づいてパラメータを変更する。今の訓練の基本的スタイルである。

ミニバッチ   ミニバッチ              ミニバッチ    ミニバッチ

Page 106: TensorFlowとCNTK

Batch

キレイに収束しているが、計算量が巨大

一回のパラメータ変更のために全データを読み込む。推論の結果を蓄えるための領域も巨大になる

Page 107: TensorFlowとCNTK

Stochastic Gradient Descent

迷走気味

一回のパラメータ変更のために、一個だけデータを読み込む。

Page 108: TensorFlowとCNTK

Mini-Batch

10個のデータを読み込んで、その結果で、パラメータを変更することを繰り返すプログラム

Page 109: TensorFlowとCNTK

SDG の現在の用法 現在の ML の文脈では、 SDG は、一個のデータにつ

き一回全データの更新を行う前述の SDG ではなく、mini-batch の処理を行う訓練のスタイルを SDG と呼ぶことがある。下の CNTK での SDG の定義を見て欲しい。この時は、 SDG とは mini-batch のことである。

SDG の Stochastic というのは、全体のデータから少数のデータをサンプリングして、確率的に推定をおこなうということ。モンテカルロ法と同様のアプローチである。

Page 110: TensorFlowとCNTK

Back Propagation

前向きの推論に対して、パラメータの変更は、勾配( Gradient )を用いて、後ろ向きに行われる。そのプロセスをまとめてみよう。

Page 111: TensorFlowとCNTK

F1(X0 , W1)

Fi(Xi-1 , Wi)

Fn(Xn-1 , Wn)Wn

Wi

W1

X0 (入力 )

n層のネットワークの前向きの推論。推論の結果を X としよう。

簡単にするために、バイアスの項 bi は省略している。

Xi-1

Xi

X

省略

前向きの推論

Page 112: TensorFlowとCNTK

F1(X0 , W1)

Fi(Xi-1 , Wi)

Fn(Xn-1 , Wn)Wn

Wi

W1

X0 (入力 )    Y (期待される出力 )  

Cost

C(X,Y, ...)

前向きの推論の結果X は、 Cost関数( Loss関数・損失関数)で、期待される出力 Y と比較される。

その結果を C としよう。

X

Xi

Xi-1

省略

Cost関数

Page 113: TensorFlowとCNTK

F1(X0 , W1)

Fi(Xi-1 , Wi)

Fn(Xn-1 , Wn)d C/dWn

Cost

C(X,Y, ...)

各層の出力 Xi について、 C に対する勾配d C/dXi が計算される。

同様に、各層の重みWi について、 C に対する勾配d C/dWi が計算される。この値に基づいて重みは更新される。

d C/dWi

d C/dW1

d C/dX

d C/dXi

d C/dXi-1

X

Xi

Xi-1

省略

Backpropagation/Gradient

Page 114: TensorFlowとCNTK

F1(X0 , W1)

Fi(Xi-1 , Wi)

Fn(Xn-1 , Wn)d C/dWn

Cost

C(X,Y, ...)

Xi = Fi(Xi-1,Wi) なので、

dC/dXi-1 = dC/dXi ・ dXi/dXi-1 = dC/dXi ・ dFi(Xi-1,Wi)/dXi-1

dC/dWi = dC/dXi ・ dXi/dWi = dC/dXi ・ dFi(Xi-1,Wi)/dWi

d C/dWi

d C/dW1

d C/dX

d C/dXi

d C/dXi-1

省略

Chain Rule

Page 115: TensorFlowとCNTK

[Appendix]Automatic Differentiation

Back Propagation は、 Reverse Automatic Differentiation の応用である。それは記号処理による微分でも、数値計算による微分でもない。“Calculus on Computational Graphs: Backpropagation”http://colah.github.io/posts/2015-08-Backprop/“Automatic Differentiation” https://en.wikipedia.org/wiki/Automatic_differentiation

Page 116: TensorFlowとCNTK

次のような計算グラフを考えよう。矢印にそって、下から上に計算が進む。

Page 117: TensorFlowとCNTK

今、 a=2, b=1 という値が入ったとしよう。この時、各ノードでの計算は、次のようになる。

Page 118: TensorFlowとCNTK

この時、一つ上のノードを一つ下のノードで偏微分すると各ノードでの計算は、次のようになる。

∂e/∂d=c でc=3 だから

∂e/∂c=d でd=2 だから

Page 119: TensorFlowとCNTK

このように、直接隣り合った項の偏微分は簡単である。それでは、離れた項の偏微分はどうなるだろうか?

∂e/∂a を考えてみようa が1だけ変化した時、 c は 1 だけ変化する。c が1だけ変化した時、 e は 1 だけ変化する。だから、a が1だけ変化した時、 e は 1*2 だけ変化する。だから、 ∂ e/∂a = 2

まあ、式で書けば、∂e/∂a= ∂e/∂c ・ ∂ c/∂a = 2*1 =2 ということなのだが

Page 120: TensorFlowとCNTK

このように、直接隣り合った項の偏微分は簡単である。それでは、離れた項の偏微分はどうなるだろうか?

今度は、∂ e/∂b を考えてみようb の変化が e に与える道は、二つある。先と同じように考えて、 a の一つの変化は、緑の経路で 1*2青の経路で  1*3 の影響を与える。だから、 ∂ e/∂b = 1*2 + 1*3 = 5

まあ、式で書けば、∂e/∂a= ∂(c*d)/∂b = c*∂d/∂b + ∂c/∂b*d = 3*1+ 1*2 =5 ということなのだが

Page 121: TensorFlowとCNTK

今、ノード X からノード Y に三つの道 α, β, γ が、ノード Y からノード Z に三つの道 δ, ε, ζ があったとしよう。

X から Z には、 3*3=9 通りの道がある。それらの道を、 αδのように積の形で表せば、 Z を X で偏微分したものは、先に見たように、可能な全ての道の寄与分を足し合わせたものである。

この形の方が見やすい。

Page 122: TensorFlowとCNTK
Page 123: TensorFlowとCNTK

これは、元の例だが、これで Forward-Mode とReverse-Mode の微分を考えてみよう。

Page 124: TensorFlowとCNTK

Forward-Mode Differentiation( これは、入力 b についての場合 )

Forward-Mode Differentiationでは、一つの特定の入力について、全てのノードが受ける影響が計算される。入力パラメータの数だけ、計算が必要。計算は膨大になる。

Page 125: TensorFlowとCNTK

Reverse-Mode Differentiation

Reverse-Mode Differentiationでは、一つの出力について、全てのノードが与える影響の計算は、一回で済む。

隣り合ったノードの微分(茶色)を計算しておけば一つ経路上で掛け算をし、全経路分を足せばいい。

Reverse-Mode Differentiation は、Back Propagation の計算法

Page 126: TensorFlowとCNTK

TensorFlow と CNTK

CNTK の高速化チューニング TensorFlow の大規模分散化

Part III

Page 127: TensorFlowとCNTK

CNTK は、 TensorFlow よりずっと早い!

Page 128: TensorFlowとCNTK

CNTK の高速化チューニング

1-bit Quantaized SGD   ループ検出 前向き推論の効率化 勾配計算の効率化 メモリー共有

Part III TensorFlow と CNTK

Page 129: TensorFlowとCNTK

1-bit Quantaized SGD  

分散学習にとってのボトルネックは、通信コストである。勾配を、 1-bit までに量子化することで、ノード間の通信に必要なデータの量を減らす。

Page 130: TensorFlowとCNTK

1-bit Quantaized SGD   モデルのパラメーターや出力を量子化するよりも、勾配を量子化する方が、はるかに安全である。(勾配の値は小さく、いずれにしても、ノイズが多い。)

次のミニバッチに、切り捨てられた量子化の残りの部分を持ち越すことは重要である。

更に、一つの勾配を処理している間に、 double-buffering を行う隠れた通信で、一つの勾配を送る。

勾配の同期に、 O(1) 通信スケジューラーを使う。 できるだけ早く、それぞれの GPU をフル活用するた

めに、 GPU の処理サイズに合わせてミニバッチのサイズを大きくする。

Page 131: TensorFlowとCNTK

パラメーター変更のアルゴリズム勾配:損失関数をパラメーターで微分したもの

実際の変更分は、勾配にアルファ(学習率)を掛けたものである。

勾配の役割           学習率の影響

勾配>0 の時パラメーターを減らす

勾配<0 の時パラメーターを増やす

アルファが小さい時

アルファが大きい時

Page 132: TensorFlowとCNTK

ループ検出とシーケンス長のチェック( RNN の場合)

ネットワークのループを検出するアルゴリズムを開発

Page 133: TensorFlowとCNTK

ループ検出とシーケンス長のチェック( RNN の場合) ネットワークのループを検出する賢いアルゴリズム

を開発したので、次のようなことが可能となった。 任意の CN から、ループを見つける。 すべてのミニバッチの計算で、ループ内のノードを除外する。

複数のシーケンスを長さごとにグループ分けする。同じ長さのシーケンスのバッチのみをサポートするツールより、収束の性質がいい。

Page 134: TensorFlowとCNTK

前向き推論の効率化

複数のノードを評価する必要がある時、重複した計算を少なくするために、ノードにタイムスタンプをつける。

Page 135: TensorFlowとCNTK

複数のノードを評価する必要がある時、重複した計算を削減するために タイムスタンプを追加する

Page 136: TensorFlowとCNTK

複数のノードを評価する必要がある時、重複した計算を削減するために タイムスタンプを追加する

ノードに余分な計算をさせない

Page 137: TensorFlowとCNTK

複数のノードを評価する必要がある時、重複した計算を削減するために タイムスタンプを追加する

ノードに余分な計算をさせない

Page 138: TensorFlowとCNTK

勾配計算の効率化 勾配計算は、すべてのノードにとって必要なわけで

はない。 データノード

に、 patameterUpdateRequired=false と設定して、これらのノードは、 needGradient=false であることを示す。

深さ優先の探索で、このフラグをグラフの上の方に伝播させる。プログラムは、次のリスト。

needGradient=true の場合のみ、勾配を計算する。

Page 139: TensorFlowとCNTK

深さ優先で DAG(Directed Acyclic Graph) のノードを全て巡回して、フラグを立てる

Leafノードでは、勾配計算は、必要ない

Page 140: TensorFlowとCNTK

Memory Sharing ミニバッチを通じて、同じメモリーを使う。それぞ

れのミニバッチのたびに、メモリーを消したり再配置しない。

可能な場合には、計算ノードでメモリーを共有する。 実行プランを分析して、可能ならば、他のノードないしは

計算で再利用されるように、メモリーをプールに解放する。 例えば、あるノードが、子のノードの勾配をすべて計算しおえたなら、そのノードが持っている行列は、すべて、解放できる。

大部分の場合、訓練では、メモリーを 1/3 から 1/2削減できる。

勾配計算が必要でなければ、もっと、多くのメモリーを削減できる。

Page 141: TensorFlowとCNTK

メモリー共有なしだと、各ノードは、メモリーを持ち続ける。 

Page 142: TensorFlowとCNTK

メモリー共有ありだと、各ノードは、勾配計算の一ステップが終わると、次々にメモリーを解放してゆく

Page 143: TensorFlowとCNTK

メモリー共有なしだと、各ノードは、メモリーを持ち続ける。 

Page 144: TensorFlowとCNTK

ミニバッチのあいだ、 Weight のメモリーは固定され、繰り返し利用される。それ以外のメモリーは、演算が終わるたびに解放され、再利用される。

Page 145: TensorFlowとCNTK

TensorFlow の大規模分散化

NIPS 2015 スライドから White Paper から GitHub から 分散 TensorFlow  用語のまとめ

Part III TensorFlow と CNTK

Page 146: TensorFlowとCNTK

2016/02/26 公開

Distributed TensorFlow

Page 147: TensorFlowとCNTK

一つのデバイスでのパフォーマンスは重要です。 ... しかし、最も大きなパフォーマンスの改良は、モデル・パラレルとデータ・パラレルを備えた、大規模分散システムによってもたらされます。

Google TensorFlow の基本的な考え方

Page 148: TensorFlowとCNTK

一回の実験に必要な時間と研究の生産性

数分あるいは数時間単位インタラクティブな研究。すぐに満足が得られる。

1〜4日耐えられる。インタラクティブではなくなるが、代わりに複数の実験を並行して走らせることができる。

1~4週高い価値のある研究のみ。進行は止まる。

1ヶ月以上やろうとも思わない。

Page 149: TensorFlowとCNTK

TensorFlow の分散処理NIPS 2015 スライドから

NIPS 2015 のスライドから、 TensorFlow の分散処理の特徴を見ておこう。

https://media.nips.cc/Conferences/2015/tutorialslides/Jeff-Oriol-NIPS-Tutorial-2015.pdf

Page 150: TensorFlowとCNTK

モデル・パラレル 訓練時間を減らす最良の方法:ステップ時間を減ら

す。 たくさんのモデルに、モデル固有の並行性がある。 問題は、通信がそれを妨げないように、仕事を分散

させることである。 CNN にみられる、局所的な関連性 AlexNet が、その例だが、タワー同士は、ほとんど、ある

いはまったく、関連を持たない。 モデルの特定の部分は、あるサンプルでしか動いていない。

Page 151: TensorFlowとCNTK

GPU 1

GPU 2

学習されたKernel

GPU 1

GPU 2

AlexNethttp://www.cs.toronto.edu/~fritz/absps/imagenet.pdf

Page 152: TensorFlowとCNTK

モデル・パラレルを開発するには 単一コア : 命令の並列化( SIMD )。とても自由にで

きる。 コアをまたぐ: スレッドの並列化。ソケットをまたが

なければ、ほとんど自由にできる、ソケットをまたぐ場合には、ソケット間の帯域が問題になる。( Intelの QPI )

デバイスをまたぐ: GPU では PCIe の帯域に、制限されることがよくある。

マシンをまたぐ: ネットワークの帯域・遅延に制限される。:

Page 153: TensorFlowとCNTK

モデル・パラレルModel Parallelism

Page 154: TensorFlowとCNTK

モデル・パラレルModel Parallelism

Page 155: TensorFlowとCNTK

モデル・パラレルモデルをマシンをまたいで分割する 

Page 156: TensorFlowとCNTK

モデル・パラレルモデルをマシンをまたいで分割する 

ネットワーク・トラフィックを最小にする。もっとも密に結合した領域は、同じパーティション上にある。

Page 157: TensorFlowとCNTK

データ・パラレル 同時に、異なるデータ・サンプルを処理するように、複数のモデルのレプリカを利用する。 モデルの状態(パラメーター)の更新は、共有パラメー

ター・サーバー上で、全て共同して行う。 スピードアップは、モデルの種類に大きく依存する。

密なモデルでは、 50 のレプリカで、 10 から 40倍のスピードアップ

疎なモデルでは、もっと多くのレプリカをサポートする。1000台ものレプリカを利用できる。

Page 158: TensorFlowとCNTK

データ・パラレル

Page 159: TensorFlowとCNTK

データ・パラレル

Page 160: TensorFlowとCNTK

データ・パラレル

Page 161: TensorFlowとCNTK

データ・パラレル

Page 162: TensorFlowとCNTK

データ・パラレル

Page 163: TensorFlowとCNTK

データ・パラレル

Page 164: TensorFlowとCNTK

データ・パラレルの選択 同期的に可能か?

N個のレプリカは、バッチ・サイズを N倍大きくすることに等しい。

利点:勾配の計算は、常に新しい 弱点:一つのマシンが落ちた場合、リカバリーが必要なの

で、耐障害性に問題がある 非同期に可能か?

利点:一つのモデル・レプリカが落ちても、それが他のレプリカをブロックすることはないので、相対的には、耐障害性は高い

弱点:勾配が新しいとは限らないということは、その勾配が、効果的なものではないということ

モデルの計算時間が、ネットワーク上でのパラメーターの send/receive に要する時間より大きくなるようにする

Page 165: TensorFlowとCNTK

データ・パラレルの成功 Google の問題(非常に大規模なデータセット、大規

模なモデル)の多くにとって、データ・パラレルは、実際に重要である

RankBrain は、 500 のレプリカを使っている ImageNet Inception は、訓練に 50個の GPU

を使って、 40倍のスピードアップ SmartReply は、それぞれ複数の GPU を持

つ、 16 のレプリカを使う 最新の学習機械 “One Billion Word” のベンチ

マークモデルは、 32 の GPU 上で、データ・パラレルとモデル・パラレルの両方を使っている

Page 166: TensorFlowとCNTK
Page 167: TensorFlowとCNTK
Page 168: TensorFlowとCNTK

TensorFlow の分散処理White Paper から

分散 TensorFlow の実装は、今年公開されたのだが、その仕様については、昨年のTensorFlow の公開時に発表された White Paper に、既に詳しく述べられていた。White Paper の記述を振り返ろう。

http://download.tensorflow.org/paper/whitepaper2015.pdf 丸山訳 https://goo.gl/z6pQV8 

Page 169: TensorFlowとCNTK
Page 170: TensorFlowとCNTK

デバイス

Page 171: TensorFlowとCNTK

デバイスの名前 デバイスの名前は、デバイスの型 (CPU/GPU) とワーカーの中でのデバイスのインデックスを含む。

分散設定では、ワーカーのジョブとタスクを指定する。(プロセスに対してデバイスがローカルな場合には、 localhostが用いられる)

デバイス名の例は、次のようになる。 "/job:localhost/device:cpu:0" "/job:worker/task:17/device:gpu:3"

Page 172: TensorFlowとCNTK

複数デバイスでの実行の課題 システムが複数デバイスの場合、主に二つほど厄介

なことがある。 ノードの配置:一つは、グラフ上のそれぞれのノードについてどのデバイスを実行配置につかさせるかを決定することである。(ノードとデバイスの対応付け)。

デバイス間通信:もう一つは、その後で、この配置決定によって導かれるデバイスの境界をまたいで要求されるデータ通信を管理することである。

Page 173: TensorFlowとCNTK

ノードの配置 配置アルゴリズムは、最初に、そのグラフ実行のシミレーションを走らせる。このシミレーションは、グラフ中のそれぞれのノードについて、 greedy heuristics を使って一つのデバイスを選択して終わる。このシミレーションで生成された、ノードのデバイスへの配置は、実際の実行での配置でも利用される。

TensorFlow のクライアントは、ノードについて、どのデバイスが実行可能かについての部分的な制約条件を与えることで、デバイス上のノードの配置をコントロールできる。例えば、”このノードは、 GPUタイプのデバイス上にのみ置くこと” とか “このノードは、 /job:worker/task:17 内の任意のデバイス上に置くことができる” とか “このノードは、 variable13 という名前のノードと同じマシン上に置くこと” 等々。

Page 174: TensorFlowとCNTK

デバイス間通信 いったんノードの配置が計算されると、グラフはデ

バイスごとに部分グラフの集合に分割される。 x から y への全てのデバイスをまたぐエッジは削除され、x から x の部分グラフ内の新しい Sendノードへのエッジに、また、対応する Receiveノードからyの部分グラフ内の y へのエッジに置き換えられる。このグラフの変形については、次の図を見てほしい。

Page 175: TensorFlowとCNTK

Send/Receive ノードの挿入

Page 176: TensorFlowとCNTK

分散実行 グラフの分散実行は、複数のデバイスでの実行に、

とてもよく似ている。デバイスの配置後に、デバイスごとに部分グラフが生成される。ワーカープロセスをまたいで通信する Send/Receiveノードのペアは、マシン境界をまたいでデータを移動するのに、TCP または RDMA といったリモート通信のメカニズムを利用する。

Page 177: TensorFlowとCNTK

データ・パラレルな訓練 SGD をスピードアップする最も単純なテクニックは、ミニバッチ要素間をまたぐミニバッチの勾配計算をパラレル化することである。例えば、 1000 要素のサイズのミニバッチを使っていたとすると、モデルの 10個のレプリカを使って、その各々に 100 要素の勾配を計算させることができる。その後、あたかも、 1000 要素のサイズのバッチを持つシーケンシャルな SDG アルゴリズムの実行のように正確に振る舞うために勾配を結合して、パラメーターを同期して更新をかける。この場合では、 TensorFlow のグラフは、単純に、グラフの一部がたくさんのレプリカを持つだけである。それが、大量のモデル計算を行う。この大規模なグラフの訓練用のループ全体をクライアントの単一のスレッドがドライブしている。図7の上の図が、これを図示している。

Page 178: TensorFlowとCNTK

同期型と非同期型のデータ・パラレルな訓練

Page 179: TensorFlowとCNTK

モデル・パラレルな訓練 モデル・パラレルな訓練では、モデルの異なった部

分の計算が、サンプルの同じバッチのために、異なる計算デバイス上で同時に行われる。これも、容易に TensorFlow で表現できる。図8は、シーケンスからシーケンスの学習に使われるリカレントでディープな LSTM モデル( [47] )が、三つの異なるデバイス上でパラレルに実行される様子を示している。

Page 180: TensorFlowとCNTK

モデル・パラレルな訓練

Page 181: TensorFlowとCNTK

モデル計算のパイプラインのための並行ステップ ディープ・ニューラル・ネットワークの訓練で、

もっと性能を引き出すためによく使われるもう一つの別の手法は、同じデバイス内で、モデルの計算をパイプライン化することである。同じデバイスのセットの内部で、複数の少数の並行ステップを走らせる。図9にその様子を示す。これは、どこか非同期のデータ・パラレル処理に似ている。異なったデバイス上に計算グラフのレプリカを作るのではなく、同じデバイス上でパラレル計算が行われることを除いては。このアプローチは、サンプルの単一のバッチの計算では、この単一のステップの間に、すべてのデバイスをすべての時間完全に使い切ることができない場合、「タイルの隙間を埋める」ことを可能にする。

Page 182: TensorFlowとCNTK

Concurrent steps

Page 183: TensorFlowとCNTK

TensorFlow の分散処理GitHub から

今年の分散 TensorFlow の実装の公開時に、添付されたドキュメントを紹介する。分散TensorFlow プログラミングの具体的なイメージがわくと思う。

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/how_tos/distributed/index.md

Page 184: TensorFlowとCNTK

TensorFlow Server GrpcServer# Start a TensorFlow server as a single-process "cluster". $ python >>> import tensorflow as tf >>> c = tf.constant("Hello, distributed TensorFlow!") >>> server = tf.GrpcServer.create_local_server() >>> sess = tf.Session(server.target) >>> sess.run(c) 'Hello, distributed TensorFlow!’

tf.GrpcServer.create_local_server()  メソッドは、単一プロセスのクラスターを生成する。もっと現実的な分散クラスターを作るためには、 TensorFlow クラスターのメンバーを定義するtf.ServerDef を渡して tf.GrpcServer を作る。こうして、それぞれが同じクラスター定義を持つ複数のプロセスを走らせる。

Page 185: TensorFlowとCNTK

ClusterDef クラスターを定義する

tf.make_cluster_def( {"local": ["localhost:2222", "localhost:2223"]}) /job:local/task:0 /job:local/task:1

tf.make_cluster_def(  {“worker”: [“worker0:2222”, “worker1:2222”,"worker2:2222"],    "ps": ["ps0:2222", "ps1:2222"]}) /job:worker/task:0 /job:worker/task:1 /job:worker/task:2 /job:ps/task:0 /job:ps/task:1

job名: [ ネットワーク名 , ....]

ps: parameter server

Page 186: TensorFlowとCNTK

# In task 0: server_def = tf.ServerDef( cluster=tf.make_cluster_def({ "local": ["localhost:2222", "localhost:2223"]}), job_name="local” , task_index=0) server = tf.GrpcServer(server_def)

# In task 0: server_def = tf.ServerDef( cluster=tf.make_cluster_def({ "local": ["localhost:2222", "localhost:2223"]}), job_name="local” , task_index=1) server = tf.GrpcServer(server_def)

クラスターで、 localhost:2222 と localhost:2223 上で、二つのサーバーが走る。

同じクラスター定義

ClusterDef の使い方

Page 187: TensorFlowとCNTK

with tf.device("/job:ps/task:0"): weights_1 = tf.Variable(...) biases_1 = tf.Variable(...)

with tf.device("/job:ps/task:1"): weights_2 = tf.Variable(...) biases_2 = tf.Variable(...)

with tf.device("/job:worker/task:7"): input, labels = ... layer_1 = tf.nn.relu(tf.matmul(input, weights_1) + biases_1) logits = tf.nn.relu(tf.matmul(layer_1, weights_2) + biases_2) # ... train_op = ...

with tf.Session("grpc://worker7:2222") as sess: for _ in range(10000): sess.run(train_op)

モデルの中で分散したデバイスを指定する

二台の parameter サーバー

訓練を実行するサーバー

worker7 で訓練を実行

Page 188: TensorFlowとCNTK

訓練のレプリカを作る よく使われる訓練の設定(データ・パラレル)では、同じモデルを訓練するワーカーのジョブに、たくさんのタスクが含まれている。この設定では、一つ(あるいは複数)の parameter server のジョブのタスクが保持する、共有パラメータを利用する。 それぞれのタスクは、典型的には、異なるマシンで走るだろう。

こうした構造を指定するやり方が、 TensorFlow にはたくさんあって、我々は、モデルのレプリカを指定するのを簡単にするライブラリーを構築中である。

可能なアプローチには、次のようなものがある。

Page 189: TensorFlowとCNTK

非同期型の訓練 一つのパラメータの集合を含む、単一のグラフを構築する。 ( tf.Variable ノードは、パラメータ・サーバー /job:ps に割り当てられる。) この「モデル」の複数のコピーが、ワーカー /job:worker 内の異なったタスクに割り当てられる。

このモデルのそれぞれのコピーは、異なったtrain_op を持つことができる。そして、それぞれのワーカー i で、一つ以上のクライアントのスレッドが、 sess.run(train_ops[i]) を呼び出すことができる。

これは、非同期型の訓練の実装である。このアプローチは、そのターゲットがクラスター内のワーカーの一つであるような、単一の tf.Session を利用する。

Page 190: TensorFlowとCNTK
Page 191: TensorFlowとCNTK

同期型の訓練 ノードの配置は先と同じだが、同期型の訓練の実装

では、すべてのワーカーからの勾配は、平均化される。このタイプのレプリカの例については、 CIFAR-10 multi-GPU trainer  を参照のこと。

例えば、 300 要素のサイズのミニバッチを使っていたとすると、モデルの 3個のレプリカを使って、その各々に 100 要素の勾配を計算させることができる。その後、あたかも、 300 要素のサイズのバッチを持つシーケンシャルな SDG アルゴリズムの実行のように正確に振る舞うために、勾配を結合して、パラメーターを同期して更新をかける。

Page 192: TensorFlowとCNTK

3

3

m+1

2

3

2m+1

m m m

A B C

A

B

Cミニバッチのデータを3 分割して 3台で処理

3台のマシンでの勾配計算 データと式の分割

3m

データの分割 式の分割

3

3

3

Page 193: TensorFlowとCNTK

A B C

同期型のデータ・パラレル

3台のレプリカ・モデルでの勾配計算の分割

ミニバッチのデータを 3 分割して、同じモデルのレプリカを持つ 3台で処理。パラメータ・サーバーが、その結果を足し合わせて、パラメータを更新する。

Page 194: TensorFlowとCNTK

分散型訓練 分散型訓練(“ distributed trainer” ) アプロー

チでは、ワーカー毎に一つのグラフをもたせ、複数のグラフを利用する。ワーカー毎のそれぞれのグラフは、次の二つを含んでいる。パラメータの集合が一つ( /job:ps に割り当てられる)、あと一つは、モデルのコピーが一つ (特定の /job:worker/task/i に割り当てられる ) である。

異なったグラフ間で変数を共有するために、コンテナーのメカニズムが利用される。すなわち、それぞれの変数が構築される時、グラフのそれぞれのコピーで同じ値を持つ、オプショナルなコンテナーの引数が指定される。 大きなモデルでは、全体的なグラフはより小さいので、この方法は、より効率的に機能する。

Page 195: TensorFlowとCNTK

分散型訓練 このアプローチは、複数の tf.Session オブジェク

トを利用する。ワーカー毎に、一つのプロセスがあって、それぞれのターゲットは、異なるワーカーのアドレスである。

tf.Session オブジェクトは、すべて単一の Pythonクライアントで生成することができる。あるいは、訓練の負荷をもっとうまく分散するために、複数のPython クライアントを利用することもできる。

Page 196: TensorFlowとCNTK

[Appendix]分散 TensorFlow 用語のまとめ

Page 197: TensorFlowとCNTK

Client クライアントは、典型的には、 TensorFlow のグラ

フを構築し、クラスターと相互作用するために、 `tensorflow::Session` を構成するプログラムである。クライアントは、典型的には、 Python かC++ で書かれている。単一のクライアント・プロセスは、複数の TensorFlow サーバーと直接に相互作用することが出来る(先の「訓練のレプリカを作る」を参照のこと)。そして、単一のサーバーは、複数のクライアントにサービスを提供することが出来る。

Page 198: TensorFlowとCNTK

Cluster TensorFlow のクラスターは、名前が付けられたジョ

ブの集合に分割された、一つ以上の TensorFlowサーバーから構成される。 名前が付けられたジョブは、今度は、タスクのリストで構成される。クラスターは、典型的には、たくさんのマシンをパラレルに走らせる、ニューラル・ネットワークの訓練のような、特定の高レベルの目的のために利用される。

Page 199: TensorFlowとCNTK

Job ジョブは、典型的には、共通の目的にサービスを提

供する、タスクのリストから構成される。例えば、ps (parameter server の略 ) と名付けられたジョブは、典型的には、変数を格納し更新するノードをホストとして含んでいる。一方、 worker と名付けられたジョブは、典型的には、計算中心の状態を持たないノードをホストとして含んでいる。ジョブの中のタスクは、典型的には、異なったマシン上で走る。

Page 200: TensorFlowとCNTK

Master service マスター・サービスは、分散したデバイスの集合に

リモートアクセスを提供する RPC サービスである。このマスター・サービスが、 tensorflow::Session インターフェースを実装する。 そして、一つ以上のワーカー・サービスをまたいだ仕事の協調に、責任を持つ。

Page 201: TensorFlowとCNTK

Task タスクは、典型的には、単一の TensorFlow サー

バー・プロセスに対応する。タスクは、特定のジョブに属し、ジョブのタスクのリストの中で、特定のインデックスを持っている。

Page 202: TensorFlowとCNTK

TensorFlow server TensorFlow サーバーは、 tf.GrpcServer インスタ

ンスを走らせているプロセスである。それは、クラスターのメンバーで、「マスター・サービス」と「ワーカー・サービス」を外部に提供する。

Page 203: TensorFlowとCNTK

Worker service ワーカー・サービスは、そのローカルなデバイスを利

用して、 TensorFlow グラフの一部分を実行する、 RPC サービスである。ワーカー・サービスは、worker_service.proto を実装している。

Page 204: TensorFlowとCNTK

次回マルレク予告Convolutional Network

入門講座

日時:  5月 13 日 19:00~場所:  TIS 西新宿定員:  200名

Convolutional Network は、現在のニューラル・ネットワーク技術の中心的な技術で、また、もっとも成功した技術でもあります。講演では、ニューラル・ネットワークを学び始めた人を対象に、 CNN の基本をわかりやすく解説します。