MachineLearning

【初心者OK】TensorFlowとは?最新版2.xの特徴を分かりやすく解説

TensorFlow とは
ディープラーニング初心者
ディープラーニング初心者
ディープラーニングについて調べていると、TensorFlow(テンソルフロー)って聞くけど、いったい何なんだろう…。

ネットの記事を読んでも理解できないし、書籍も読んでも理解できない!分かりやすく書かれている記事はないものか…。

この記事では、上記のような悩みを解決していきます。

 

この記事の内容

  • TensorFlow(テンソルフロー)とは?
  • TensorFlowの特徴3つ
  • TensorFlowにおける3つの実装方法
  • TensorFlowのデメリット

 

この記事を書いている僕は、フリーランスで活動するPythonエンジニア。

最近は案件をこなしつつ、YouTubeで初心者向けのPython講義をやっています。

»参考 : はやたす / Pythonエンジニア – YouTube

 

今回はそんな僕が、初心者でも分かりやすいように「TensorFlowとは何か」を解説していきます。

ちなみに、この記事で書いている情報は、TensorFlow1系ではなく最新版の2系です。

ネット上や書籍の情報は1系で書かれているものが多く、サンプルコードすら通らないものが多々あります。

分かりやすく書かれた最新情報が知りたいな…」と思ったら、この記事を読めば悩みを解決できますよ!

TensorFlow(テンソルフロー)とは

TensorFlow とは1

TensorFlow(テンソルフロー)は、計算グラフを使った数値計算を行うためのライブラリです。

ディープラーニングで頻繁に使われていますが、線形回帰などの一般的な機械学習も実装できます。

TensorFlowは「計算グラフを使った数値計算」というのがポイント。Pythonで数値計算をするだけなら、Numpyで代替えできます。

ここまで聞くと「計算グラフってなんだよ、円グラフしか知らないよ…。」ってなりますよね。

計算グラフは、TensorFlowを理解する上で非常に重要です。テンソルの概念と合わせて解説します。

登場する概念① : テンソル

 

テンソルは、多次元配列のことです。テンソルは数学の用語なので、深掘りするとより厳密な定義が存在します。

でも、多次元配列ってだけでも十分に抽象的なので、これ以上の深追いは必要ないです。

 

多次元配列のままでも、十分にイメージしづらいはず。

具体的に例を挙げると、以下のようにテンソルの次元によって呼び名があります。

  • 0次元配列のテンソル : スカラー
  • 1次元配列のテンソル : ベクトル
  • 2次元配列のテンソル : 行列

イメージ図にすると、以下のとおりです。

テンソル イメージ図

図で見ると分かりやすいですね。

次元は「中身の情報へ何ステップでアクセスできるか」を考えると良いです。

たとえば、ベクトル(=1次元配列)であれば、何番目かを指定すれば中身の情報を取得できます。

そういう意味で、Pythonのリストも1次元配列です。以下のコードのように、数字の1を取り出すときに1ステップで情報にアクセスできます。

# 元の配列
l = [1, 2, 3]

# 数字の1にアクセス(=1ステップ)
print(l[0])

 

行列であれば「行(=縦)」と「列(=横)」を指定する必要があるので、2ステップが必要ということですね。

 

またTensorFlowでは、次元のことを階数と呼びます。

※線形代数で習う階数(Rank)とは別の概念になります。ややこしいですが、ほとんどの記事・書籍で階数と書かれているので慣れましょう。

登場する概念② : 計算グラフ

 

計算グラフで使われる”グラフ”は、円グラフとか棒グラフとは意味が違います。

計算グラフは以下のように、データの演算処理を”丸”と”棒”を使って表現したグラフのことです。

計算グラフ イメージ図

この”丸”のことをノード、”棒”のことをエッジと言います。計算グラフでは、ノードとエッジを使うことで、以下の内容を可視化しています。

  • 入力されたデータは?
  • どのような処理をする?
  • 出力されたデータは?

 

たとえば、中学のとき習った \(y = 2x\) を考えてみましょう。

このときノードとエッジを使って可視化したい内容は、以下のとおりです。

  • 入力されたデータは? : \(2\) と \(x\)
  • どのような処理をする? : 掛け算する
  • 出力されたデータは? : \(2x\)

実際に、上記を計算グラフで描いてみると、下図のようになります。

計算グラフ イメージ図

これが計算グラフです。今回は単純に、\(2\) と \(x\)というスカラー(=0次元の配列)を使った例にしました。

このとき各ノードで次元を増やしたのが、ディープラーニングの正体です。

つまり計算グラフを理解しておくと、ディープラーニングの構造を知ったも同然というわけですね。

計算グラフを使う理由

 

それで「なぜTensorFlowでは、計算グラフを使って数値計算するのか」ですよね。

ディープラーニングの構造が計算グラフに似ていることは分かります。でも、イマイチ計算グラフを使う理由までは分かりません。

なので、理由を解説していきたいところですが、、、それには数学の知識「微分」と「最適化」について学ぶ必要があります。

この記事で数学まで紹介しているとパンクしてしまいます。

なので現時点では、計算グラフを使うと誤差逆伝播法という微分計算を高速に処理できると認識しておきましょう。

※実装だけ学べれば良い場合、TensorFlowについて深く理解しなくても良いと思います。

TensorFlowの特徴3つ

 

TensorFlowの公式ページを見ると、以下のような概要が書かれています。

TensorFlow 2 ではシンプルさと使いやすさが重視されており、積極的実行(Eager Execution)、直感的に使用できる高レベルの API、あらゆるプラットフォームで構築可能な柔軟なモデルなどが新たに導入されています。

参考 : TensorFlow Core

要約すると、TensorFlowには3つの特徴があります。

  • Eager Execution(動的な計算グラフ)
  • 高レベルのAPI
  • マルチプラットフォーム対応

順番に解説しますね。

TensorFlowの特徴① : Eager Execution

 

Eager Executionを直訳すると”熱心な実行”という意味になります。※Google翻訳曰く。

Google翻訳 Eager Execution

TensorFlowの公式ページではEager Executionが積極的実行と訳されているので、あながち間違っていないようです。

とはいえ、これだけでは意味が不明です。「消極的な実行でもあるのか…?」って感じですよね。

Eager Executionを理解するには、TensorFlow1系と比較すると分かりやすいです。

先ほど紹介した\(y = 2x\)の計算グラフで、\(x = 3\)を代入してPythonのコードで書いてみます。

 

TensorFlow1系の場合

import tensorflow as tf

g = tf.Graph()

with g.as_default():
    x = tf.constant(3, name='x')
    z = 2 * x

with tf.compat.v1.Session(graph=g) as sess:
    r = sess.run(z)
    print(r)

# --> 6
TensorFlowとは3

 

TensorFlow2系の場合

import tensorflow as tf

x = tf.constant(3, name='x')
z = 2 * x

tf.print(z)
TensorFlowとは4

 

Pythonを勉強している人なら、2系が直感的に分かりやすいですよね。もはや1系は何をしてるんだって感じです。

TensorFlow1系では、計算グラフを作成するとき、以下の手順でコードを記述する必要があります。

  • STEP① : 計算グラフの作成(あくまでも作成するだけ)
  • STEP② : 計算グラフの実行

この実行方法を”Define and Run”と呼びます。グラフを定義してから、そのあとで実行する方法ですね。

 

反対に、最新版の2系は”Define by Run”といいます。というのも、実装したコードを見ると、Pythonと同じように直感的に書けました。

この”Define by Run”への変更が、TensorFlow2系の最大の特徴です。直感的に記述できるようになり、TensorFlowは一気に使いやすいライブラリになりました。

 

“Define and Run”と”Define by Run”は、プログラミング言語の種類に例えると分かりやすいですね。

  • Define and Run : 静的型付け言語(C / C++)
  • Define by Run : 動的型付け言語(Python / Ruby / PHP)

 

Pythonはライトに書けますが、代わりに処理速度がそこまで早くないです。これと同様に、Define by RunではDefine and Runほどの処理速度は出ません。

※これに関しては解決策があり、AutoGraphを使えばOKです。気になる方は、公式ドキュメントをどうぞ。

»参考 : TensorFlow 2.0 での tf.function と AutoGraph  |  TensorFlow Core

TensorFlowの特徴② : 高レベルのAPI

 

TensorFlowでは、高レベルAPIであるKerasを利用できます。

Kerasというのは、Pythonで書かれているディープラーニング用のライブラリです。直感的にコードを記述できて、使いやすいのが特徴です。

オリジナルのライブラリとして存在していますが、KerasはPython3.6までの対応でGithubの更新も止まっています。

事実上は統合されていますので、これから入門するならTensorFlowからKerasにアクセスしましょう。

 

また、ほとんどの実装はKeras APIで事足ります。

事実、TensorFlowはモデルの実装方法がいくつかありますが、公式でKerasを使った実装を推奨されています。

»参考 : 効果的なTensorFlow2  |  TensorFlow Core

TensorFlowの特徴③ : マルチプラットフォーム

 

TensorFlowはPython以外のプログラミング言語でも使用可能です。

TensorFlowとは2

あとで紹介するPyTorchは、JavaScriptで使えないので差別化ポイントになりますね。

他にもSwiftやJavaが対応しており、モバイルのネイティブアプリでも簡単に機械学習モデルを作成できます。※Swiftはベータ版(2020年12月時点)

 

ただ、PythonはTensorFlow以外のデータ分析系ライブラリが豊富です。

ゆえにTensorFlowを使うならPython一択になりますね。

TensorFlowにおける3つの実装方法

 

TensorFlowでは、コードの書き方で3つの実装方法があります。

  • Sequential API
  • (Keras) Functional API
  • Subclassing API

 

それぞれの違いは、今度書きます。力尽きました。

ただ、ほとんどはSequential APIを使えば大丈夫です。

TensorFlowのデメリット

 

TensorFlowのデメリットは以下のとおりです。

  • TensorFlowのデメリット① : 古いバージョン(1系)の情報が多すぎる
  • TensorFlowのデメリット② : 学習教材が少ない
  • TensorFlowのデメリット③ : 最新の論文で使われていない

順番に解説していきます。

TensorFlowのデメリット① : 古いバージョンの情報が多すぎる

 

TensorFlowは、2019年10月に2系をリリースしました。

この記事を書いている時点で、リリースから1年しか経っておらず、TensorFlowについて調べると、ほぼ1系の古い情報が出てきます。

 

ゆえに、記事内のサンプルコードをコピペしても動かないことが多いです。

プログラミング初心者にとって、これはコピペしても動かないのは厳しいです。tf.compatを使えば動かせますが、そもそも入門したばかりだと、そんな事実も分かりません。

 

ネットの情報だけでなく、書籍も古いものが多いです。「TensorFlow 本」で検索すると、ほとんど1系の書籍を紹介されています。もはや罠。

この事実を知らないで古い書籍を購入すると、まったくコードを動かせないので注意しましょう。

TensorFlowのデメリット② : 学習教材が少ない

 

TensorFlowの2系は、学習教材も少ないです。

正確には日本語に対応している教材が少ないですね。英語圏であれば、色々なチュートリアルが見つかります。

さらに「初心者でも分かりやすい書籍」となると、かなり数が限られてきます。

 

現時点のイチオシ

いま売られている中で、この本が一番分かりやすいです。

機械学習の実装と理論を学べる本ですが、全600ページ中200ページくらいはTensorFlowについて書かれています。

この本自体が分厚いので、これだけ持っておけばTensorFlowの理解は間に合いますね。

TensorFlowのデメリット③ : 最新の論文で使われていない

 

最新の論文では、基本的にPyTorchを使った実装が紹介されています。

たとえば、2020年6月に発表されたYOLOv5という物体検出アルゴリズムでは、もはやPyTorchのロゴが入っています。

YOLOv5 ロゴ

はなからTensorFlowは相手にされていません。

というのも、TensorFlowは1系で静的な計算グラフが使われていました。それだと、研究分野の仕様に向かないんですよね。

反対にPyTorchは最初から動的な計算グラフを採用しているライブラリです。それゆえ、研究分野での利用が一気に広がりました。

 

こういった背景があり、最新の研究結果を発表する論文では、TensorFlowではなくPyTorchが使われます。

研究分野に進みたいと考えている学生さんであれば、現状はPyTorchを使うのが良いですね。

ただ、PyTorchはプログラマー向きなコードの書き方なので、初心者から入門するならTensorFlowをおすすめします。