技術を武器にする経営--日本企業に必要なMOTとは何か 伊丹敬之, 宮永博史

表題の本を読了しました。 MOTに関する事柄が網羅的にまとまっており、日本企業の技術経営に必要なエッセンスがほぼ含まれています。 以下メモです。

MOTの本質

イノベーションが生まれるまでの長い課程では、組織の内外の様々な人間社会の力学が生まれるため、その力学のマネジメントが技術経営の本質の一つ。 技術を育て、市場への出口を作り、社会を動かしていくために、組織で働く人々による学習活動をマネジメントするのが、技術経営の本質の一つ。

イノベーションプロセスの3段階

1.筋のいい技術をつくる

2.市場への出口をつくる

3.社会を動かす

■筋のいい技術の条件

1.科学の原理に照らして、原理的深さをもつこと

2.社会のニーズの流れに照らして、人間の本質的ニーズに迫っていること

3.自社の戦略に合致し、事業としてのポテンシャルが大きいこと

4.技術を担う人材がいること

■技術の俯瞰図をもつ

ブームか、継続的におこる本質的な変化か。

■研究テーマポートフォリオの評価

1.成果

2.動機

3.成功確率

リスクとリターンのバランスをとること。 上記の3つを正確に見積もれることが技術の目利きができる、ということが重要。

■良いコンセプトの条件

1.聞いて驚き、使って驚くという伝染効果があること

2.驚くだけの技術と仕組みの裏打ちがあること

3.許容範囲内の価格設定であること

■顧客ニーズを把握する

1.顧客ターゲットを明確にする

2.ターゲットとのコミュニケーションを継続的に何度も行う

3.いかに早く、二の矢が準備できるか

■ビジネスモデル

ビジネスモデル=ビジネスシステム+収益モデル。ビジネスシステムは以下を考える。

1.何を自分が行って、何を他人に任せるか

2.自分で行うことをどのように行うか

3.他人に任せることを、どのようにコントロールするか

■リスク

1.市場の広がりがわからないリスク

2.既存事業とのカニバリゼーションリスク

上記を踏まえて実行の資源をどう確保するか。リリース時のトラブルに対する余裕も含めて資源を確保することが重要。

■イノベ―ションの継続

油断,誤解,硬直化でとまる。

1.時系列的につながる3つのコンセプトを用意しておく

2.カリスマリーダーから全員経営に移行する

3.初心に帰る

■技術者の間違い

開発スタート時点の競合分析にこだわり、開発中の競合製品の進化を見誤ることで、開発した技術に優位性がなくなる。 社内では新技術、世間では二番煎じとなる。 無駄な忙しさは以下が原因。

1.手っ取り早く,目の前の問題を解決しようとする

2.意味のある問いを発することができない

3.上位概念を構想できない

■3つのたこつぼ

学会、専門分野、開発プロジェクト。 枠をやぶれてこそプロフェッショナル。やぶれないのはスペシャリスト。

コーポレートベンチャーキャピタル アンドリュー・ロマンス(著)を読んだ

「大胆に遠くに行き,長くとどまろう」がキャッチフレーズのアンドリュー・ロマンスが書いたコーポレート・ベンチャーキャピタルを読んだのでメモです.

www.amazon.co.jp

■投資基準 ・シリーズAの条件はPMFを達成しているかどうか ・将来,自分の企業が顧客となるようなスタートアップに投資する.(自分が使いたいかどうか) ・戦略に沿っていて,会社の事業の梃子として資するスタートアップか.  (IBMだと,マーケットインテリジェンス(市場情報)を通じて生み出したボトムラインベースでの価値(会社事業の基礎を構成する要素に関わる価値)が重要)

■CVCの裁量 CVCはCFO直下で裁量のある組織が望ましい.

■CVCとしてのスタートアップの関わり方 ・自社将来ビジネスのエコシステムになりうるスタートアップと関わる ・最低限の投資を行えば,情報請求権を得られる.その情報で戦略的な提携等をよりよい形にするなど戦略的機能を強化できる. ・CVCはリードインベスターズになるべきではない.収益に目がいって,コーポレート部門との連携が取りづらくなる可能性がある. ・スタートアップ,他の投資家にとっても合理化であるような投資をする.

■CVC存続の条件 CVCは25〜33%程度のリターンがいる. #今回みたいな不況こそ,CVCの存続が問われる時期なのかもしれません

■良い投資家の条件 ①投資対象のテクノロジーの基礎をマスターしている ②スタートアップ,または業界団体に在籍したことがある ③素晴らしいビジネスチャンスがどういうものかわかっている ④ビジネスに伴うリスクを発見し,それを受け入れることが出来る ⑤事業を発展さえせるための取引のストラクチャーを組むことが出来る ⑥そして,創造的に考えることが出来る

重要なポイントの一つは独立心を持っていること. 自分のビジョンや投資スコープの範囲内にある事業部門から少し外れたところで仕事ができない投資家であれば,その投資家は所属する会社の役に立ててない. マーケットで起きていることや,それが自分の組織にどのような影響を与えるのか無関心な同僚に囲まれて働き続けているのだとすれば,自分自身を騙していることに等しく,それは会社の利益にならない.

■リターンの考え方 与えるものと手に入れるものはなにか,を把握する. まとめると,財務的リターンと戦略的リターン,加えて効率的なオペレーションがCVCの成功を決める. 投資先の会社が破産したら財務的リターンも得られない.

戦略的な価値と財務的な価値のバランスを取ることがCVCの永遠の課題であり,基本,戦略的な付加価値のないところには投資をしない. 戦略的な価値としては,今後のディスらプションを把握するため,自社事業のテコとなるスタートアップを見つけ,拡大を支援するため,などが考えられる.企業の将来に繋がる業務提携や新たなオペレーションなど強固なパイプラインの構築が重要である.

■インベスト・マネージャーを選ぶ条件 誠実さ,経験,ネットワーク

■スタートアップと関わる際のポイント 自社が投資していないステージに投資しているファンドへ投資することで異なるステージ,特にアーリーステージのスタートアップへのアクセスを得ることが,ディスラプトを把握するためには重要. 研究所がスタートアップの技術を評価するスキームはあり.自社技術との適合性なども合わせて評価する. 製品開発の初期段階から知的財産に制限がかかることを望まないスタートアップが多い.そのため,開発費用を提供して知的財産権を得るモデルは資金調達の選択肢が多い場所だとうまくいかない.

スタートアップが有利になる契約をすることがCVCにとって重要. スタートアップが大企業に望むのは資金と顧客や新規マーケットとのつながりであることを忘れない.

持株会社直下でのCVC運営 持株会社直下のCVCは事業会社とのシナジーをもたせるなら,投資の一部を事業会社とともに行うという手もある. エコシステムやバリューチェーンを構築する投資を行い,その中で買収のベストポジションを探っていくのが望ましい. 最も大変だった時に(資金が必要だった時に)CVCが投資を避けている点は起業家にとってマイナスポイントとなる. アクセラレータを軌道に乗せるには10年ぐらいかかる まず与えることが重要.

■CVCのチーム構成 ・社内調整が出来る人 ・CEO,CFOに近い人 ・シリコンバレー,弁護士等のエコシステムにコネクションを持つ人 ・VCを実行できる人 などがバランスよくそろっているとよい.

リモートサーバー上のjupyter notebookをVSCodeで利用する方法

リモートサーバー上で動かしているjupyter notebookをローカルのVSCode上で使いたいときの手順です. いつも忘れてしまうので,まとめておきます.

まず,sshでサーバーにつなぐ際,ポートフォワーディングを入れておきます.

ssh -L 5000:localhost:5000 [remote server address] -l user

ここでは,Dockerコンテナ内でjupyter notebookを動作させているとします. Dockerイメージの作成手順は省略します. Dockerコンテナ作成時にリモートサーバーに対してポートフォワーディングできるようにしておきます.

docker run -it -v /home/user/:/home/user/  -p 5000:5000 [container_name] bash

次にDockerコンテナ内に入って,jupyter notebookを起動します.

jupyter notebook --port 5000 --ip=0.0.0.0 --allow-root

ローカルのVSCodeでCtrl + Shift + pでコマンドパレットを呼び出します. 呼び出すと,以下のような感じでコマンドパレットがでます. f:id:moto86:20200306112008p:plainPython環境が整っていることが前提です

Python: Create New Blank Jupyter Notebookと入力して,空のjupyter notebookを作成します. そして,再度コマンドパレットを呼び出し,Python: Specify local of remote Jupyter server for connectionsと入力します. そうすると,サーバーアドレスを問われるので,以下のように入力します.

https://[remote server address]:5000/?token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

アドレスやtokenはDockerコンテナ内のjupyter notebook起動時に表示されます. そのアドレスをリモートサーバーのipアドレスに変更して入力するだけです.

R&Dのチームマネジメントに関するメモ

R&Dのチームマネジメントは、主にリサーチ領域とデベロップメント領域で異なっています。

リサーチ領域は、探索的に行う研究とより深めていく研究のバランスをどのようにとって持続的なイノベーションを実現していくか、が重要となります。

デベロップメント領域は、技術の価値とプロダクト価値のマッチングが取れるように、技術をプロダクトに入れ込める形にしていく必要があります。つまり、技術の利用価値を高めることが重要となります。

■リサーチ領域のマネジメント リサーチ領域では、探索領域と深化領域を見定め、それぞれチームの中でどのように進めるかを検討しますが、深化領域がやはり成果が出やすいため、探索領域と深化領域のバランスがチームメンバのメンタルにとっても重要となってきます。 探索領域を10年、20年続けることはメンバを疲弊させますし、深化領域で成果を出しつつ、探索領域にも手を出すのが定石となります。

探索領域が重要なフェーズでは、探索領域に集中するチームを作り、探索領域の成果指標を明確化することが重要です。

例えば、オープンイノベーションの枠組みで探索をするとしたら、探索回数や質、マッチングの数などをしっかりと評価することで、成果を認めるシステムを構築する必要があります。 そうでないと、やることが明確な深化領域に流れていくので、探索が広がらず、イノベーションのジレンマに陥る可能性が出てきます. 探索と深化を組織でバランスを取るのか、チーム内でバランスを取るのかも議論があると思いますが、個人的にはリサーチ領域であればチーム内でバランスを取ることが望ましいと考えています。 チーム内で探索と深化を両方持つことで、偶発的な発展を遂げるケースがあるからです。

■リサーチ領域のチームマネジメント チームの内部にもう少し目を向けると、ピアラーニングが進む環境になっているか、研究に対して必要な情報とリソースが潤沢にあるか、あたりが重要な要素となってきます。 学習を促進して大きな成果を生み出すチームの仕組みを構築することをするためにどのような文化でチームを運営していくのかが重要となります。 研究自体はコンペティティブな営みではありますが、その中でいかに協力関係をうみだし、よりインパクトの大きな研究につなげていくかがポイントです。

個々のモチベーションにフォーカスを当てると、どういった活動が研究者としての価値を感じているのか、をある程度把握して、その価値に合わせて出口をつくっていくことが重要だと思います。 社会に自身の技術を使ってもらうことに価値を感じるのか、人類の知の蓄積に貢献することに価値を感じるのか、それとも自尊心を満たすことに価値を感じるのか、などです。

■デベロップメント領域のマネジメント デベロップメント領域では、技術の利用価値をどのように高めるかが重要なので、利用者、つまりプロダクト開発者などにどうやって使ってもらえるか、が重要な視点となります。 研究の背景などである程度使い方を記載する研究もありますが、大体使えません。なので、研究で生まれた要素技術をプロダクト開発者に使ってもらえる形にするためには、ある程度パッケージ化する必要があります。 そのため、複数のプロダクトに対して適用しやすいパッケージ構成を考える必要があり、デベロップメント領域では、ユーザー重視のマネジメントに自然となっていきます。 プロダクト開発者のニーズを収集する機能、ニーズとマッチングの取れる要素技術を特定する機能、マッチングの取れた要素技術をパッケージとして提供できる形に整える機能、要素技術を取り入れるためのリサーチ領域との連携機能が必要です。 これらの機能を円滑に回るようマネジメントの仕組みを整えることが必要です。 リサーチ領域と比較すると、組織だった行動が必要となるため、それぞれの機能のKPIを設定して、フェーズを意識しつつマネジメントしていくことが重視されると思います。 アジャイルなどのスタイルを活用する方法もあるかと思います。 基本的には、特定の技術分野の中でそれぞれの機能がひとつのチームで動くことになるスタイルだと思います。

■デベロップメント領域のチームマネジメント デベロップメント領域での個々人のモチベーションをどのように考慮するかについては、社会に技術を利用されてもらうことに価値を感じてもらえる人や技術の追求に興味のある人を集めることが重要だと思います。 ここで、研究にこだわる人が入ると円滑に回らなくなる可能性があります。 お互いの信頼関係を構築して、常に尊敬し合う状態を作らなければなりません。

まだまだできてないことがたくさんありますが、徐々に実現できるようになっていきたいところです。

foolboxを使ったAdversarial Examplesのお手軽な作り方

ディープニューラルネットワークで画像を分類するときなど,原画像に対して人の目で区別がつかない摂動(微小な信号)を加えて,分類器を誤認識させることができます.

このような画像をAdversarial Examples(画像では敵対的画像)と呼び,ここ数年,活発に議論されています.

Adversarial Examplesに関する説明は以下の記事がわかりやすいです.

 

qiita.com

 

また,近年の攻撃手法をまとめた記事としては,PFN佐藤さんの以下の記事がよくまとまっています.後半は言語処理ですが,前半部分に画像の既存研究がまとまっています.どちらかというと,玄人向けです.

www.ai-gakkai.or.jp

 

さて,紹介はいろいろとあるものの実際に実装しようと思ったらどうすればいいのか悩む,というのは論文実装のよくある悩みだと思います.

pytorchチュートリアルにFGSMの実装はありますが,C&WやDeepfoolといったより洗練された攻撃手法を実装はチュートリアルにありません.

幸いにして,Adversarial Examples周りの既存手法はfoolboxといったツールに多くの既存研究が実装されており,手軽に敵対的画像を作成できます.

foolbox.readthedocs.io

 

これは以下のようにpipでインストールができます.

pip install foolbox

 foolboxのよいところは,pytorch,keras,tensorflowモデルそれぞれに対応している点です.公式ドキュメントの実装例がとてもわかりやすいです.

foolbox.readthedocs.io

foolbox部分に絞ると,kerasだと大体以下のような感じでC&Wアタックが使えます.

import foolbox

model    = load_model(model_file)
fmodel   = foolbox.models.KerasModel(model, bounds=(0, 1))
amodel  = foolbox.attacks.CarliniWagnerL2Attack(fmodel)
adv_img = amodel(img, label)

 動かしてみると,ほとんど原画像に見分けがつかず,分類器が誤って分類するようになりました.

FGSM,C&Wアタック,Deepfoolを使ったサンプルコードをgithubにあげています.

github.com

 

 

 

ディープラーニング実行時のメモリ計算方法

ディープラーニングGPU実行しているとき、メモリが足らずよくプロセスを落としたりします。

実際、事前にメモリをどのように計算するのだろうとふと思った時に、パッと出てこなかったので、ここにメモします。ほぼ参考の日本語訳です。

 

ディープラーニングモデルの層数

傾向としては深くなっている傾向にあり、年々GPUメモリの利用容量は拡大しています。画像認識コンペティションILSVRCでの結果を振り返るとよく分かります。

ILSVRCでのネットワークの進化
ネットワーク 層数 Top-5
Alexne 2012 7 17.0
VGG-19 2014 19 9.35
GoogleNet 2014 22 9.15
Resnet-50 2015 50 6.71
Resnet-152 2015 152 5.71

 こうしてみると、Resnetに導入されたbatch normalization偉大ですね。。

なにがメモリを使うのか

ニューラルネットワークのパラメータ数は増えていく傾向で、今後も精度を求める限りは増え続けていくと思われます。パラメータとしては、例えば、ネットワークの訓練時では以下のパラメータがGPUメモリにのる必要があります。 

1.中間層の出力

2.重みやバイアスといったパラメータ

3.バックプロパゲーション時の各素子での誤差

4.勾配法(SGD、Adamとか)のパラメータ

5.その他オーバーヘッドや最適化手法に依存するパラメータ(モーメンタムとか)

 

ネットワークで評価する際は学習時のみに用いるパラメータを除いた以下のパラメータとなります。

1.中間層の出力

2.重みやバイアスといったパラメータ

 

これらのパラメータのサイズがGPUメモリにのるようにネットワークは設計する必要があります。

GeForce GTX 1080 Tiで11GBのメモリを搭載しており、環境はどんどんよくなってきているものの、大きい画像サイズを扱う際やすべて畳み込みのネットワークを構成するときは注意が必要となります。

どうやって必要なメモリを計算するのか

例えば、畳込み層だと、重みの数は入力サイズに依存せず、入力チャネル数、カーネルサイズ、出力チャネル数を用いて重みの数を計算します。

具体的には、

出力チャネル数×(カーネルサイズ×カーネルサイズ)×入力チャネル数

となります。

 

以下のような畳込みニューラルネットワークに28x28の入力画像に適用したとします。

第1層:カーネルサイズ3x3、出力チャネル32

第2層:カーネルサイズ3x3、出力チャネル32

第3層:2x2のマックスプーリング

第4層:128素子の全結合層

第5層:10素子の全結合層

出力層:ソフトマックス

 ※畳込み層では入力サイズとフィーチャーマップサイズを同一となるようpadding=1、stride=1とします

 

この第1層での重みの数は

32x(3x3)×1=288個

となります。

また、各畳込みフィルタにはバイアスがつくので、バイアスの数は、

32x1=32個

となります。

計320個のパラメータとなり、これがカラー画像なので3チャネルの入力だと、960個になります。

カーネルサイズ3x3、出力チャネル32の畳込み層をもう一度かけた場合(第2層)、パラメータ数は以下となります。

32x(3x3)x32 + 32x1=9,248

第1層と合わせて、9,568個のパラメータが必要となります。

第3層のプーリング層ではマックスプーリングには重みもバイアスもないため、パラメータフリーな層となります。2x2のマックスプーリングを行い、サイズを28x28->14->14へとダウンサンプリングします。

第4層の全結合層では、以下のパラメータ数があります。

重み:出力数×入力数

バイアス:出力数

出力数は全結合層の素子数、入力数はマックスプーリング層の出力サイズとチャネル数となります。

よって重みの数は、

128x(14x14x32)=802,816

となり、これにバイアスの数128を加えて、全結合層の802944個がパラメータ数となります。

第5層でも同様で、第5層のパラメータ数は

10x128 + 10 = 1,290

となります。

まとめるとパラメータ数は、

第1層:320

第2層:9,248

第3層:なし

第4層:802,944

第5層:1,290

各層の総和:813,802個

となり、モデルサイズは以下となります。

813,802x(32/8)/(1024)^2 ~ 3.1MB

ここで、ニューラルネットワークのパラメータは32-bit floatsで表現されることとしました。

これらのパラメータに加えて、中間層の出力サイズを各層ごとに計算すると、

第1層:32x(28x28) = 25,088

第2層:32x(28x28) = 25,088

第3層:32x(14x14) = 6,272

第4層:128

第5層:10

各層の総和:56,586個

のパラメータがあります。

56,586x(32/8)/(1024)^2 ~ 0.2MB

つまり、評価する際は、3.3MBのメモリがGPUに必要となります。

 

訓練する際は、勾配の誤差等を考慮する必要があります。

概ねモデルサイズを3倍、中間層の出力サイズを2倍にします。

モデルサイズを3倍するのは、モーメンタムとかステップキャッシュとかを考慮してかけてます。

中間層を2倍にするのは、activationsの勾配を考慮してかける。勾配はactivationsの数と同一のため、2倍となります。

3.1MBx3 + 0.2MBx2 = 10MB

 

さらに、バッチサイズも考慮する必要があります。

上記の計算は1枚の画像入力に対しての計算であり、バッチサイズが128であったら、activationsの数にさらにバッチサイズをかける必要がある。バッチサイズが128であれば以下となります。

3.1MBx3 + 0.2MBx2x128 = 60.5MB

バッチサイズがクリティカルにメモリサイズへと影響を与えることがわかります。

VGG16の場合、どれぐらいメモリをつかうのか 

 

によると、以下のとおりです。

cs231n.github.io

INPUT: [224x224x3]        memory:  224*224*3=150K   weights: 0
CONV3-64: [224x224x64]  memory:  224*224*64=3.2M   weights: (3*3*3)*64 = 1,728
CONV3-64: [224x224x64]  memory:  224*224*64=3.2M   weights: (3*3*64)*64 = 36,864
POOL2: [112x112x64]  memory:  112*112*64=800K   weights: 0
CONV3-128: [112x112x128]  memory:  112*112*128=1.6M   weights: (3*3*64)*128 = 73,728
CONV3-128: [112x112x128]  memory:  112*112*128=1.6M   weights: (3*3*128)*128 = 147,456
POOL2: [56x56x128]  memory:  56*56*128=400K   weights: 0
CONV3-256: [56x56x256]  memory:  56*56*256=800K   weights: (3*3*128)*256 = 294,912
CONV3-256: [56x56x256]  memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
CONV3-256: [56x56x256]  memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
POOL2: [28x28x256]  memory:  28*28*256=200K   weights: 0
CONV3-512: [28x28x512]  memory:  28*28*512=400K   weights: (3*3*256)*512 = 1,179,648
CONV3-512: [28x28x512]  memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [28x28x512]  memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
POOL2: [14x14x512]  memory:  14*14*512=100K   weights: 0
CONV3-512: [14x14x512]  memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [14x14x512]  memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [14x14x512]  memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
POOL2: [7x7x512]  memory:  7*7*512=25K  weights: 0
FC: [1x1x4096]  memory:  4096  weights: 7*7*512*4096 = 102,760,448
FC: [1x1x4096]  memory:  4096  weights: 4096*4096 = 16,777,216
FC: [1x1x1000]  memory:  1000 weights: 4096*1000 = 4,096,000

TOTAL memory: 24M * 4 bytes ~= 93MB / image (only forward! ~*2 for bwd)
TOTAL params: 138M parameters

 

こういうのって、ある程度推論できるので、大きなデータを扱う際は事前チェックするとパラメータの調整がしやすくなります。

参考URL

CS231n Convolutional Neural Networks for Visual Recognition

http://imatge-upc.github.io/telecombcn-2016-dlcv/slides/D2L1-memory.pdf

 

衛星画像解析データセット

衛星の小型化で衛星画像がどんどん安くなってきているので、衛星画像の解析技術もここ最近進歩がとても早いです。

CVPR2018でも大規模なデータセットが公開されています。

github.com

DOTA

Functional Map of the Worldはデジタル・グローブのデータがベースになっています。

デジタルグローブ - Wikipedia

データセットの公開でますます競争が激しくなってきそう。

具体的な事業につながった事例はまだまだ少なそうだけど、これからどうなっていくかウォッチしていきたいと思います。