リーン、アジャイル、デザイン思考の違い

よく開発現場で聞くリーン、アジャイル、デザイン思考の違いについて、自分なりに整理した。

リーンについて

成り立ち

もともとはトヨタの効率的な生産方法について、マサチューセッツ工科大学で研究された手法を「リーン開発方式」などと呼んでいた。
そこから派生して生まれたのが、「リーン・スタートアップ」。
「リーン」というと、最近は「リーン・スタートアップ」のことを指すことが(おそらく)多い。

特徴

簡単に言うと、製品を世の中に出す時、必要最低限の機能を持った、ミニマムな製品として、世の中に出し、ユーザーの声を聞きながら改良しておこう、というもの。
仮説検証を行っていく中で、時には、戦略を転換(ピボット)してでも、ビジョンを達成するための製品を出していく、ということをしたりする。

「リーン・スタートアップ」と名前がつくとおり、新製品を世の中に出す時の目的の達成のさせ方に対する手法を整理したもの。

アジャイルについて

成り立ち

2001年に宣言された「アジャイルソフトウェア開発手法宣言」が元になっていると言われている。(言葉としては。概念はそれ以前から、存在していた。)
ソフトウェアの開発のコンセプトについて提唱されたもので、手法そのものとは違うらしい。(手法は、「スクラム」など)

特徴

計画をきっちりと立てて、計画通りに進めていくウォーターフォール型とは対照的に、週単位などで、設計~リリースまでのサイクルを回していき、環境の要件を取り入れながら、開発を進めていく。
変化に対しては強いが、最終的に作られるものが、ずれていってしまう可能性もある。

デザイン思考について

成り立ち

他2件とは、毛色が違うが、その名前の通り、優秀なデザイナーがクライアントの要望に応えるためのデザインのフローを体系化したもの。
デザイナーが出発点にはあるが、通常の課題解決を行うフローにも適応できるために世の中に広まっていった。

特徴

上記の通り、ユーザーの課題解決を行いたいとき、ユーザーが何を求めているか、どういうものが提供されるとうれしいか、ということを徹底的に詰めていく。
フローの最初に「共感」というフェーズがあることが特徴で、ユーザーインタビューなどを通して、ユーザーがなぜ、ある製品を使うのか、どういう感情の動きがあるのか、といったストーリーを作成し、自分のプロダクトに落とし込んでいく。

海外ニュース:次世代に流行するAIは何か?

The Next Generation Of Artificial Intelligenceの要約。

次世代に流行するAIは何か?

記事によると以下の3点が注目らしい。

教師なし学習

現在も機械学習の1手法として、使われている学習手法。
データに対して、正解ラベルを付与する必要がある教師あり学習に比べて、正解ラベルが不要であるため、学習コストが少ない。
その分、現状、教師あり学習の方が主流であり、教師なし学習が適応できる範囲はそう多くない。

しかし、ラベルを付与する工数は思っている以上に多大であるため、教師なし学習によって、適応できる範囲が増えれば、それはブレイクスルーになるだろう、とのこと。
「その他全てのものからすべてを予測する」と言われているらしい。

連合学習

初耳だった。googleが2017年に提唱した概念とのこと。

文脈としては、大量に集まるデータのプライバシー保護の観点から考案された概念らしい。
AIを学習させるには、大量のデータが必要であるが、個人情報保護などの観点から、重要な情報にいつでも自由にアクセス出来るとは限らない。
そこで、集権的にデータの集まる一つのサーバー上で学習を行うのではなく、ユーザーが持つ端末(googleなので、この場合Androidを想定されているのだろうと思う)の中で、小さな学習を行い、夜間などに集約して大きなモデルとして再学習、再配布を行う、というもの。

この場合、個人情報を送信する必要はなく、端末との送受信はモデルのみになるため、プライバシー保護にもなるだろう、というもの。

Transformers

自然言語処理に関わっている人は、全員が知っているであろう、近年の自然言語処理のブレイクスルーとなった技術。
Attention機構という文章のどこに注目するべきか、というアルゴリズムをベースとすることで、計算の並列処理が可能になった。
それまでのRNNに比べ、計算効率がはるかに向上したため、自然言語処理では、それまでに使用できていた以上に巨大なデータセットで学習させたAIモデル(GPT-3やBERTなど)が登場してきている。

テストコードを書く理由の考察

テストコードをなぜ、書く必要があるのか、について考察。
深く考えずに、工数削減と思っていたが、それ以外のメリットの方が重要なのではないか。

そもそも、なぜテストコードは工数削減になると思ったのか?

テストは工数がかかるものである。
小さなサービスのうちはよいが、ある程度、機能が増えてくると、その一つ一つを手動で確認するのは、困難になる。そのため、テストコードを書いておけば、繰り返し実施するテストについては、毎回、手を動かす必要はなく、その点においては、確かに工数削減になっていると思う。

しかし、webの記事を読んでいても、テストコードを工数削減の文脈で語られていることは少ないと感じる。
なぜなら、テストコードは一度書けば終わり、というものではなく、プログラムの変化に伴い、運用していかなければならないものであり、その分の工数は増えてしまうという側面がある。
テストコードを工数削減のために書く、という考えは、浅すぎるように思える。

なぜ、テストコードを書いたほうがいいのか?

テストコードは運用をしていくものであり、開発工数は増加する。
テストの手作業分の工数を差し引いて、総合的な工数が削減される、という理屈は、感覚的にも信じられない。
では、なぜ、テストコードを書くべきか?を考えたときに思いあたるのは以下の通り。

  • 再現性を持たせることで、必要な機能の動作を網羅的に担保することができる。
  • 開発者の意図を残せる。
  • ソースコードという組織としてのナレッジが溜まる。

特に後者二つについては、なかなか、効果を可視化はしにくいものの、思っている以上に効果のあるものではないかと思える。
0からサービスのプログラムを書く、という経験は珍しいのではないかと思われるが、誰かの書いたソースコードを引き継いで、開発を行うとき、機能のどのような動きが肝であるのか、を残すことはとても重要なことである。
どういう経緯で作られ、仕様・要件はこうで、というドキュメントは残されているだろうが、そういったドキュメントを更新し続けることは、現実的には難しいと思われる。
テストコードが特別、他のドキュメントよりも更新しやすいとは思わないが、開発者自身が行うタスク(テスト)とセットになっていることから、自分事になりやすいという側面はあるのではないか。

開発者目線では、ソースコードを読むことで理解できることは、大きなメリットがある。
テストコードを工数削減という目線で考えるよりも、組織的ナレッジを長期に渡って残すため、という目線で考えるほうが、正しいのではないかと思う。

TensorFlow Extendedのチュートリアルを動かしてみた所感

CI/CDとMLOpsにおけるCTの概念でCTのことを書いたが、肌感覚をつかめていなかった。
ので、目に付いたところから、TensorFlow Extendedのチュートリアル(リンク先:Colabで実行)を試してみた。
他ライブラリやプラットフォームとの比較はできないが、パイプラインについて思ったことなど。

所感

  • 結果の可視化は実際に目にしてみると、便利そうだなと感じた。
  • メタデータなどもどういう情報を格納しているのか、目にしてみると、機械学習の検証管理に使えそうだという感覚もあった。
  • コードは比較的簡単に見える。(細かくは読み込んでいないが)
  • 複数人で機械学習の検証を繰り返すようなプロジェクトの管理としてはよさそうなのかなと感じた。
  • 運用中のバッチ処理の自動化、可視化にも便利そうに感じた。
  • エラーや検証の理解は、可視化によって短縮できるように感じた。

チュートリアルなので、理解は浅いと思うが、今後の選択肢として、覚えておきたい。

CI/CDとMLOpsにおけるCTの概念

継続的インテグレーションの最初の一歩のために調べたこと、考えたことの情報からアップデート。
MLOpsの概念では、CI/CDの他に、CTの概念もあるらしい。

MLOpsとは?

CI/CDなどを含む、運用のしやすさを含めて開発を考える、というDevOpsに対して、MLOpsはMachine Learningのライフサイクルを円滑に進めるための概念。

機械学習にはデータを集める、加工する、アーキテクチャを作る、学習する、予測する、といった工程があり、煩雑になってしまう管理を考える必要がある。

CTとは?

Continuous Trainingの略で、継続的トレーニングのこと。
機械学習のモデル学習を継続的に改善していく運用を考える概念。

パイプライン化について

機械学習のプロセスをパイプライン化してくれるライブラリは色々ある。
少し見た限りでも、metaflow、airflow、Kerdo、luigi、など。
Tensorflow Extendedのようなプラットフォームも。

いまいち、パイプラインの利点がよく分かっていない。
処理を直列に並べることと、プログラムで順番に処理していくことと、読みやすさ以外に、何か違うのか?
メタデータによるバージョン管理だったり、可視化することで、どこの処理がどう終わったのか見やすい、といったところが利点、であるようには見える。
この辺りは、機械学習の運用をもう少し経験すると、肌感覚が分かるのかもしれない。

強化学習とは何か?

前に書いた記事で、強化学習が盛り上がっているとのことだったので、少し整理。
読書記録:AI研究「次の10年」を読み解く(雑誌 MIT Technology Reviewより)

強化学習の概要

機械学習を整理した記事などを見ると、主に3種類の学習方法があると言われている。

  • 学習データと正解が必要なもの
    • 教師あり学習
    • 強化学習
  • 学習データだけ必要なもの
    • 教師なし学習

教師あり学習と強化学習の違いは、教師あり学習はデータに対してラベル(自然言語処理のQ&Aタスクに対する正解・不正解、など)があるのに対して、強化学習は、ある状態の時にある行動を起こすと、最終的に報酬が高くなるように学習する手法。

なんで注目されているか

一番大きく注目されたのは、GoogleのAlphaGoが大きい。
囲碁は盤面が大きいので、機械が人間に勝つのはなかなか難しいと言われていたが、2015年に人間との対局に勝利したことで脚光を浴びた。

その性質から、よくゲームを学習させる動画やプログラミング記事が見られる。
ただ、ゲーム以外にもロボット、自動運転などにも使われている。

シミュレーションさえ出来れば、学習データを集める、追加する、という作業が不要で、自動でAIが学習してくれるのが強み。
一方、内容によっては、シミュレーション出来る環境を用意すること自体が大変(自動運転は観測できる場所がなければ、一般的にはできない)になる場合もある。

読書記録:AI研究「次の10年」を読み解く(雑誌 MIT Technology Reviewより)

概要

MIT Technology Reviewのコンテンツを読んで。
MIT Technology Review Vol1は、MITテクノロジーレビューのAI関連の過去記事を集めたムック本ということで、ここ数年のAIの外観を知れる面白い記事が色々載っています。

内容(サマリ)

AI研究「次の10年」を読み解く、より
人口知能は10年ごとに人気の手法が入れ替わる。
今はニューラルネットワークの時代、2000年代はサポート・ベクター・マシン。
なので、2020年代はまた別の手法が流行るだろう。
それが何かは予測出来ないとしているが、近年、強化学習が増加していることには言及されている。
ブレークスルーは突然起こるように見える、が、それまで研究の試行錯誤があって、ある日、結果が出るということが多いので、次の技術もある日、突然、ブレークスルーが起こるかもしれない。
ニューラルネットワークは2012年のイメージネットチャレンジで精度が出たし、強化学習も2015年にalpha碁が出た。

考え事

この本の他の記事にもあったが、今はニューラルネットワークに寄りすぎだ、という意見もあった。
実際に、仕事の場でAIを使うこともあるが、ニューラルネットワークですべての予測をするのではなく、ルールベースで作ったり、強化学習を試したり、といろいろな手法を認識しておくことは大事なことなんだと思う。
そのためにも、色々な論文、手法は、使うかは別にしても、知識としては蓄えておきたいと思う。