【初心者向け】Define by RunとDefine and Runって何が違うの?PyTorchとTensorFlowで学ぶ計算グラフの仕組み
こんにちは。ゆうせいです。
機械学習のフレームワークを学び始めると、「Define by Run」や「Define and Run」なんて言葉が出てきて、ちょっと戸惑ってしまいますよね?「どっちも似たような名前だし、何が本質的に違うんだろう?」と感じている方も多いのではないでしょうか。
実は、この二つの考え方の違いを理解することは、あなたがPyTorchやTensorFlowといったモダンなライブラリを使いこなす上で、とても大切な一歩になります。
そこで今回は、この二つのアプローチの違いと特徴、そしてそれぞれに属する代表的なライブラリについて、新人エンジニアのあなたにも分かるように、じっくり解説していきますね!
まずは「Define and Run」から理解しよう!
最初に、古くからある考え方、「Define and Run」について見ていきましょう。
これは、一言でいうと「まず計算の全体の設計図を定義して、その後にデータを流し込んで実行する」という方式です。
設計図を先に作るイメージ
もっと分かりやすい例え話をしましょうか。
「Define and Run」は、プラモデルを作る前に、まず箱の中の設計図をじっくり読み込んで、完成までの全工程を頭の中に叩き込むようなイメージです。
- Define (定義)フェーズ: まず、ニューラルネットワークの構造、つまり「データがどんな計算を、どんな順番で行うか」という全体の流れ(これを「計算グラフ」と呼びます)を最初にすべて定義します。この時点では、まだ実際のデータを使った計算は一切行われません。あくまで設計図を作る段階です。
- Run (実行)フェーズ: 設計図が完成したら、そこに初めて実際のデータ(例えば画像や文章など)を流し込んで、一気に計算を実行します。
この方式の最大の特徴は、計算の全体像が最初から分かっている点にあります。
メリットとデメリットは?
メリット:最適化が得意!
全体の設計図が先にあるので、システム全体でどこを効率化できるか、計算の無駄を省けるか、といった「最適化」をしやすいのが大きなメリットです。たくさんのデータを高速に処理する必要がある、本番環境へのデプロイ(サービスとして公開すること)に向いていると言えます。
デメリット:デバッグが難しい…
一方で、デバッグが少し大変です。もし計算の途中で何かエラーが起きても、それが設計図のどの部分に起因するのかを特定するのが難しいのです。なぜなら、実際に計算が走るのは「Run」フェーズで一気に行われるため、どのステップで問題が起きたのか追跡しにくいからです。
代表的なライブラリ
この「Define and Run」方式を採用している最も有名なライブラリは、Googleが開発したTensorFlow
のバージョン1系です。(現在のバージョン2系は少し事情が違うので、後ほど説明しますね!)
次に「Define by Run」の世界へようこそ!
さて、お次は最近の主流ともいえる「Define by Run」です。
こちらはその名の通り、「実行しながら計算グラフを定義していく」という、より直感的な方式です。
実行しながら作るイメージ
先ほどのプラモデルの例えを使うなら、「Define by Run」は、設計図を横に置きつつも、とりあえずパーツを一つ手に取って、それを組み立ててみて、次にどのパーツを付けるか考えながら作っていくイメージです。
Pythonのコードを上から一行ずつ実行していくのと同じように、計算の命令を書くと、その瞬間に計算が実行され、同時に計算グラフが構築されていきます。
メリットとデメリットは?
メリット:直感的でデバッグが超簡単!
Pythonのコードを書くのと同じ感覚で、ステップごとに動作を確認できるので、デバッグが非常に直感的で簡単です!途中で変数の値を確認したくなったら、おなじみのprint()
文を差し込むだけで中身を覗くことができます。これは、新しいモデルのアイデアを試したり、研究開発を行ったりする際に、絶大なパワーを発揮します!
デメリット:最適化は一工夫必要
実行時に初めて計算の全体像が決まるため、「Define and Run」に比べて最適化が難しい場合があります。しかし、近年のライブラリの進化によって、このデメリットはかなり解消されつつあります。
代表的なライブラリ
この「Define by Run」を採用している代表格が、Facebook(現Meta)が主導で開発しているPyTorch
です。また、日本発のChainer
(チェイナー)というフレームワークがこの方式を先駆けて採用し、多くの研究者に愛されました。
そして、先ほど少し触れたTensorFlow
も、バージョン2以降ではこの「Define by Run」の考え方(Eager Execution
と呼ばれます)を標準で採用するようになり、より直感的に使えるように進化しているんですよ。
一目でわかる!Define by Run vs Define and Run 比較表
ここまでの内容を、表で整理してみましょう。
特徴 | Define and Run (静的グラフ) | Define by Run (動的グラフ) |
グラフ構築のタイミング | 実行前に全体を定義 | 実行しながら逐次的に定義 |
柔軟性 | 低い(固定的なグラフ) | 高い(入力に応じてグラフを変更可能) |
デバッグのしやすさ | 難しい | 簡単(Pythonic) |
最適化 | しやすい(全体像が見えているため) | しにくい(最近は改善が進んでいる) |
主なライブラリ | TensorFlow 1.x | PyTorch, Chainer, TensorFlow 2.x |
まとめ:これからどう学んでいけばいい?
今回は、機械学習フレームワークの根底にある二つの考え方、「Define and Run」と「Define by Run」について解説しましたが、いかがでしたか?
- Define and Run: 先に「設計図」をガチガちに固めてから、一気に「実行」する方式。最適化に強く、本番環境向け。
- Define by Run: 「実行」しながら「設計図」を作っていく方式。直感的でデバッグしやすく、研究開発向け。
現在のトレンドとしては、両者の「良いとこ取り」が進んでいます。TensorFlowがEager Execution
でDefine by Runの使いやすさを取り入れ、PyTorchもTorchScript
といった機能でDefine and Runのような最適化のメリットを取り込めるようになっています。
では、あなたはこれからどちらを学んでいけば良いのでしょうか?
もしあなたがこれから機械学習の研究や新しいモデルの開発に挑戦したいなら、直感的に扱えるPyTorch
から始めるのがおすすめです。一方で、開発したモデルを実際のサービスに組み込むといったフェーズでは、TensorFlow
の持つエコシステムや最適化機能が役立つ場面も多いでしょう。
最終的にはどちらの考え方も理解しておくことが、あなたのエンジニアとしての引き出しを増やしてくれます。まずはどちらか一方を触ってみて、その思想に慣れることから始めてみてください。
応援しています!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。