Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

Kerasでお試しCNN

@yutakikuchi_です。

30分でDeepLearningを実行できるようにお試しするキット。手っ取り早く始めるためにkeras(Tensorflow backend)をinstall。kerasについては下記のページで紹介されている。 尚、下にinstallのlogを残しているがkerasの前にBackendとなるTensorflowをinstallすると良い。

引用 : Kerasは,Pythonで書かれた,TensorFlowまたはCNTK,Theano上で実行可能な高水準のニューラルネットワークライブラリです. Kerasは,迅速な実験を可能にすることに重点を置いて開発されました. アイデアから結果に到達するまでのリードタイムをできるだけ小さくすることが,良い研究をするための鍵になります. Home - Keras Documentation

$ sudo pip install keras

Cannot uninstall 'six'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial
 uninstall.

// sixを再度install
$ sudo pip install keras --ignore-installed six

Installing collected packages: six, numpy, h5py, keras-applications, scipy, keras-preprocessing, pyyaml, keras
  Running setup.py install for pyyaml ... done
Successfully installed h5py-2.8.0 keras-2.2.2 keras-applications-1.0.4 keras-preprocessing-1.0.2 numpy-1.15.2 pyyaml-3.13 scipy-1.1.0 six-1.11.0

// pythonで実行するが失敗
$ python
python
Python 2.7.10 (default, Oct  6 2017, 22:29:07)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from keras.models import Sequential

ImportError: No module named tensorflow

// tensorflowをinstall
$ sudo pip install tensorflow tf-nightly

Successfully installed absl-py-0.5.0 astor-0.7.1 backports.weakref-1.0.post1 enum34-1.1.6 funcsigs-1.0.2 gast-0.2.0 grpcio-1.15.0 keras-applications-1.0.5 keras-preprocessing-1.0.3 markdown-3.0 mock-2.0.0 numpy-1.14.5 pbr-4.2.0 protobuf-3.6.1 tb-nightly-1.11.0a20180923 tensorboard-1.10.0 tensorflow-1.10.1 termcolor-1.1.0 tf-nightly-1.12.0.dev20180923 werkzeug-0.14.1 wheel-0.31.1

// 再度pythonで実行
$ python
python
Python 2.7.10 (default, Oct  6 2017, 22:29:07)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from keras.models import Sequential
Using TensorFlow backend.

Kerasのexampleは下記のgithubにまとまっている。その中でもCIFAR-10の画像を分類する問題を解く。CIFAR-10は32x32pixelの6000枚x10Classの合計60000枚の画像Datasetである。60000枚のうちTrainingが50000枚、残りはEvaluation用として利用される。DownloadしたDatasetのディレクトリ以下のpickleファイルは下記のように置かれている。batches.metaには各Classの画像数とラベル名、data_batch_xにはpythonのdictionaryオブジェクト、これらを意味するのは各画像ファイル名とそれが属するClass名を含む形式で保存されている。 https://github.com/keras-team/keras/tree/master/examples CIFAR-10 and CIFAR-100 datasets

f:id:yutakikuchi:20180924042148p:plain

$ tree cifar-10-batches-py
cifar-10-batches-py
├──    batches.meta
├──    data_batch_1
├──    data_batch_2
├──    data_batch_3
├──    data_batch_4
├──    data_batch_5
├──    readme.html
└── test_batch
$ less read.py
import pickle
import sys

file_name = sys.argv[1]
f = file(file_name, 'rb')
print pickle.load(f)

$ python read.py batches.meta
{'num_cases_per_batch': 10000, 'label_names': ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'], 'num_vis': 3072}
$ python read.py data_batch_1
... 'estate_car_s_001433.png', 'cur_s_000170.png']}

次にkerasのgithubからexampleを落としてくる。exampleディレクトリ配下にあるcifar10_cnn.pyの実行を行う。cifar10_cnn.pyはCIFAR10のDataset、CNN(Convolutional Neural Network)を用いた実装のsampleとなる。githubにあるサンプルをそのまま実行するとエラーが生じるので、下記のdiffを反映する必要がある。

(追記) : cifar10_cnn.py.bak は2018/09/24時点での下記githubのファイルを取得したもの。それに対して、cifar10_cnn.pyが最新の修正を加えたもの。これらのdiffを取ることで修正した箇所を明確にした。 ref : https://github.com/keras-team/keras/blob/master/examples/cifar10_cnn.py

$ git clone git@github.com:keras-team/keras.git
$ cd keras/examples
$ python cifar10_cnn.py

ValueError: `data_format` should be `"channels_last"` (channel after row and column) or `"channels_first"` (channel before row and column). Received: None
ValueError: `steps_per_epoch=None` is only valid for a generator based on the `keras.utils.Sequence` class. Please specify `steps_per_epoch` or use the `keras.utils.Sequence` class.

$ diff -u cifar10_cnn.py.bak cifar10_cnn.py
--- cifar10_cnn.py.bak  2018-09-24 03:24:17.000000000 +0900
+++ cifar10_cnn.py      2018-09-24 05:00:33.000000000 +0900
@@ -11,6 +11,7 @@
 from keras.models import Sequential
 from keras.layers import Dense, Dropout, Activation, Flatten
 from keras.layers import Conv2D, MaxPooling2D
+import numpy as np
 import os

 batch_size = 32
@@ -102,7 +103,7 @@
         # set function that will be applied on each input
         preprocessing_function=None,
         # image data format, either "channels_first" or "channels_last"
-        data_format=None,
+        data_format="channels_last",
         # fraction of images reserved for validation (strictly between 0 and 1)
         validation_split=0.0)

@@ -113,6 +114,7 @@
     # Fit the model on the batches generated by datagen.flow().
     model.fit_generator(datagen.flow(x_train, y_train,
                                      batch_size=batch_size),
+                        steps_per_epoch=int(np.ceil(x_train.shape[0] / float(batch_size))),
                         epochs=epochs,
                         validation_data=(x_test, y_test),
                         workers=4)

cifar10_cnn.pyでやっていることは簡単で、KerasのSequential Modelを利用して複数層を追加している。最終的に出力する分類数(Class数)は前述の通り10個、Data AugmentationをTrueにしているので画像あえて加工したものを水増ししてCNNの入力とし、Modelのロバスト性を高める目的でflagが設定されている。(もちろんFalseで実行することもできる。) batch_sizeの指定はミニバッチとして1度に取り組むデータ(画像)の数であり、全てのClassからbatch_size分のデータをランダムで取得する。1epochとはバッチサイズで指定したサンプルデータを全て使用した状態を示す。よって今回のTrainingで利用する画像数は50000枚、それを32のバッチサイズで画像数を定義するので、50000 / 32 = 1563 1563回のバッチを実施する。1バッチでパラメータを更新するので、1563回の更新が1epoch内で繰り返される。epochsで指定されている100回は1epochを100回実行すること。ややこしいので再度まとめると以下のようになる。

  • batch_size : Datasetの中で何個のDataをサンプルして1回のバッチで利用するかを定義する。
  • steps_per_epoch : 1epoch内において何回バッチにてパラメータを更新するかを定義する。
  • 1epoch : batch_sizeをsteps_per_epoch回繰り返して全てのDatasetを参照した状態を1epochとする。
batch_size = 32
num_classes = 10
epochs = 100
data_augmentation = True

Sequential Modelのaddを利用して層を追加。例えば下記は2次元の畳み込みレイヤーを追加している。Conv2Dの最初の引数は畳み込みにおける出力フィルタの数、第二引数は3x3の畳み込み処理を適用することを意味する。input_shapeについては今回1画像のサイズが32x32、RGBなので3層あるということで、x_train.shape[1:]の値は(32, 32, 3)となっている。Sequential Modelの最初の層にはinput_shapeの情報が必ず必要。 Sequentialモデルのガイド - Keras Documentation

model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
                 input_shape=x_train.shape[1:]))

model.summary()で各LayerとOutput Shape、Paramを確認することができる。ネットワークの構成としては次のもの。INPUT => CONV * 2 => POOL => CONV *2 => POOL => DENSE * 2 => OUTPUT。CNNの基本は畳み込み層とプーリング層で構成される。間に活性化関数を挟んでいるが、層としては取り扱わない(実際にはCONV層の活性化を図っている)。

  • CONV : 畳み込み層。フィルタの大きさを指定し、入力データの特徴マップを作成するために各フィルタでの畳込みの結果を出力する。
  • RELU : ここではCONVの出力に対して活性化関数(ランプ関数)を適用。
  • POOL : プーリング演算を適用。CONV層の後に適用され、画像データ等の入力データを扱いやすくするために重要な情報は残しながら圧縮するDown Samplingを行う。
  • DENSE : 全結合層。出力層の手前で実行され、出力はClassに分類される確率といった重みになる。 出力層の数は判別したいClass数に一致する必要がある。
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_5 (Conv2D)            (None, 32, 32, 32)        896       
_________________________________________________________________
activation_7 (Activation)    (None, 32, 32, 32)        0         
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 30, 30, 32)        9248      
_________________________________________________________________
activation_8 (Activation)    (None, 30, 30, 32)        0         
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 15, 15, 32)        0         
_________________________________________________________________
dropout_4 (Dropout)          (None, 15, 15, 32)        0         
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 15, 15, 64)        18496     
_________________________________________________________________
activation_9 (Activation)    (None, 15, 15, 64)        0         
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 13, 13, 64)        36928     
_________________________________________________________________
activation_10 (Activation)   (None, 13, 13, 64)        0         
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 6, 6, 64)          0         
_________________________________________________________________
dropout_5 (Dropout)          (None, 6, 6, 64)          0         
_________________________________________________________________
flatten_2 (Flatten)          (None, 2304)              0         
_________________________________________________________________
dense_3 (Dense)              (None, 512)               1180160   
_________________________________________________________________
activation_11 (Activation)   (None, 512)               0         
_________________________________________________________________
dropout_6 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_4 (Dense)              (None, 10)                5130      
_________________________________________________________________
activation_12 (Activation)   (None, 10)                0         
=================================================================
Total params: 1,250,858
Trainable params: 1,250,858
Non-trainable params: 0
_________________________________________________________________

Modelの学習にはcompileメソッドを利用する。loss関数として交差エントロピー、最適化手法としてRMSprop、評価指標としてはaccuracyを出力する。学習済みモデルと重みは指定したファイルに出力することができる。100epoch回した結果としての最終Accuracyは73.4%ということが分かる。

# Let's train the model using RMSprop
model.compile(loss='categorical_crossentropy',
              optimizer=opt,
              metrics=['accuracy'])

# Save model and weights
if not os.path.isdir(save_dir):
    os.makedirs(save_dir)
model_path = os.path.join(save_dir, model_name)
model.save(model_path)
print('Saved trained model at %s ' % model_path)

# Score trained model.
scores = model.evaluate(x_test, y_test, verbose=1)
print('Test loss:', scores[0])
print('Test accuracy:', scores[1])

Epoch 99/100
1563/1563 [==============================] - 225s 144ms/step - loss: 0.8315 - acc: 0.7239 - val_loss: 0.7454 - val_acc: 0.7533
Epoch 100/100
1563/1563 [==============================] - 221s 142ms/step - loss: 0.8340 - acc: 0.7233 - val_loss: 0.7877 - val_acc: 0.7354
Saved trained model at /xxxx/git/keras/examples/saved_models/keras_cifar10_trained_model.h5
10000/10000 [==============================] - 12s 1ms/step
Test loss: 0.7876939533233642
Test accuracy: 0.7354

出力されたh5のファイルからモデルを参照する事も可能。ただし、これを実行する上ではいくつかのpydot系のmoduleをpip installとgraphvizbrew installしなしなければならないので注意が必要。plot_modelの結果は図のように出力される。

$ pip install pydot
$ brew install graphviz

from keras.models import load_model
model= load_model('./saved_models/keras_cifar10_trained_model.h5')
model.summary()

from keras.utils import plot_model
plot_model(model, 'model.png')

f:id:yutakikuchi:20180924170532p:plain:h300

tmux : powerlineの表示ズレを解消する

表示ズレの解消

f:id:yutakikuchi:20180918001843p:plain:w450

@yutakikuchi_です。

ref : tmux 2.5 以降において East Asian Ambiguous Character を全角文字の幅で表示する · GitHub file-tmux-2-7-fix-diff : https://gist.github.com/z80oolong/e65baf0d590f62fab8f4f7c358cbcc34#file-tmux-2-7-fix-diff

上図のようにtmuxのpowerline行がずっと増え続ける問題を解消する。対応方針としてはpatchを当てる。PC環境はMac、tmuxのversionは2.7を想定。patchは上記gistにversion毎にpatchが用意されている。brew edit tmuxコマンドで下記内容を追記し、brew reinstallにてpatchを適用し再度install。

// コマンドは下記を実行
$ tmux -V
tmux 2.7

$ brew edit tmux

// 下記を追記
  def patches
     [
       "https://gist.githubusercontent.com/z80oolong/e65baf0d590f62fab8f4f7c358cbcc34/raw/d478a099aa5074e932e3323e9b16033e13919cdf/tmux-2.7-fix.diff"
     ]
  end

$ brew reinstall --build-from-source tmux
==> Summary
🍺  /usr/local/Cellar/tmux/2.7: 10 files, 705.2KB, built in 29 seconds

DeepLearningによる画像解析

概要

http://www.image-net.org/challenges/LSVRC/ http://www.image-net.org/challenges/LSVRC/2012/

@yutakikuchi_です。 ILSVRC(ImageNet Large Scale Visual Recognition Challenge)はImageNetが毎年主催するコンピュータを利用した画像解析による物体認識・検出のコンペ。2012年にDeepLearningの手法が登場し、物体認識・検出の技術として3位以降のMachineLearningチームとError率で圧倒的な差をつけて優勝したことから注目を集めた。DeepLearningによる画像解析タスクといっても目的が複数存在するため、言葉の定義を下記にまとめる。

  • 物体認識(Object Recognition・Classification) : 1枚ずつの画像毎に何の物体であるかを認識する。(1枚の画像に対して1つの物体のラベルを付与する。)
  • 物体位置特定(Object Localization) : 1枚の画像の中に物体が何処に映っているかの領域を認識する。
  • 物体検出(Object Detection) : 1枚の画像の中に何が何処に映っているかを検出する。(1枚の画像に対して複数の物体のラベルと領域を認識する。)
  • セグメンテーション(Segmentation) : 1枚の画像の中に何が何処に映っているかをピクセル単位で分離する。

Object Recognition: which object is depicted in the image?
Object detection: where is this object in the image?

Ref : image processing - Object detection versus object recognition - Signal Processing Stack Exchange

画像解析アルゴリズム

f:id:yutakikuchi:20180916233821p:plain:w450 f:id:yutakikuchi:20180917013315p:plain:w450 DeepLearningの画像解析アルゴリズムは目的により多数あり、それぞれで使用目的が異なる。

Ref : Object Localization and Detection - Artificial Inteligence A 2017 Guide to Semantic Segmentation with Deep Learning

物体認識の精度比較

f:id:yutakikuchi:20180917011720p:plain:w450 左図はCNNベースの物体認識(Object Recognition・Classification)の精度比較グラフ(縦軸精度)であり、後発のアルゴリズムほど精度が高い様子が分かる。右図は精度(縦軸)、学習速度(横軸)、メモリ使用量(円の大きさ)を示している。一般的には精度が高くなれば学習速度が遅くなる。精度、学習速度・メモリ使用量はそれぞれtrade offの関係となるようだ。

Ref : Object Localization and Detection - Artificial Inteligence https://arxiv.org/pdf/1605.07678.pdf

Computer Vision : Visual Importance Mapの研究

Youtube :

Paper : f:id:yutakikuchi:20180909041527p:plain:w450 f:id:yutakikuchi:20180909044034p:plain:h400

Ref: http://web.mit.edu/zoya/www/docs/predImportance_final.pdf http://www.dgp.toronto.edu/~donovan/layout/designLayout.pdf

@yutakikuchi_です。 MIT・Toronto大・Adobeなど様々な企業において、特定のGraphic Designに対して、どこが人が注目しているかをVisualizationするVisual Importance Mapという仕組みが研究されている。可視化の方法としてはGraphic Designの上にHeat Mapとして注目される領域をAIにより予測してOverlayしている。

一般的なCreative作成においてはGraphic Designerの経験と勘に基づいて作られているが、DesignのAudienceが注目されやすいポイントをVisualizationすることで新しいInsightをDesignerに与える。更にGraphic DesignerがInteractiveにCreativeを操作可能な画面の中で効果を予測しながら編集しリアルタイムに新しい価値を気づくことが可能な環境を提供することで、従来必要としたA/BテストによるAudienceの反応を計測する必要が無く、Operationコストと事前に効果を最大化するための施策を実行できることが魅力となる。

f:id:yutakikuchi:20180909053043p:plain:w450

Designの効果の予測はどうやっているのか。PaperによるとAIへの入力となるデータについてはflickrのDesign、Mturkを利用して多人数にAnnotationをさせている。 Amazon Mechanical Turk

Annotationの方法としてはBubble ViewというCreativeをぼやかした状態において、Annotatorがどこをより見たいかを選択してもらう。これよりGround truth(教師データ)を集める。Ground truthデータをFully Convolutional Networks (FCNs)にかけてModelを生成し、新しいデータをModelに適用することでCreative上の注目ポイントを画像のPixelレベルで表示を可能としている。類似のResearchとしてSaliency Mapという人間の脳へのbottom-up性注意を予測するModelがある。(Saliencyの場合は視覚としての刺激を抽出することで、例えば暗い夜に月が明るく照らされると対比によって月の効果を認識する心理学的理論を示す)

Ref : github.com

既にAdobe senseiなどのApplicationでは上のようなGraphic Designの最適化、自動生成の世界が発表されており、今後ますます注目されてくる領域である。

www.adobe.com

製造業のAI導入

Industory4.0、SmartFactory

@yutakikuchi_です。 Industory4.0, SmartFactoryという言葉があるように製造業の工場ラインに対してIoT・AIを導入し生産工程をデジタル化する計画がある。生産工程のデジタル化の先に人が担っていた作業を補助する目的でのAI・IoT導入検討が進められている。

https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%80%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC4.0

製造業といってもIoT・AIの活用検証は多岐にわたる。 1. 製造ライン・プロセスでの検品作業の自動化 2. 製造機器の故障発生をセンサーログデータなどから予測する予防保全 3. 製造ラインを効率化するための生産計画の効率化

f:id:yutakikuchi:20180908033746p:plain:w400

引用 : https://www.projectdesign.jp/201704/ai-business-model/003521.php

上記以外にも様々な検証が進んでおり、2030年にはAI活用業界のTopとして名を連ねることが予想されている。製造物に異常が発生したときの予算ロスはビジネス的なインパクトとして非常に大きいので、今後AI導入の注目業界であることは確かである。ただし、現状の製造業はAI導入のための課題はたくさん存在する。下記は製造ラインの異常検知の課題を列挙している。

データ収集の課題

  • 紙などで情報を記録、デジタルデータを保存していないケースが存在する
  • 製造ラインに対してIoTデバイスの設定が物理的に難しく、デジタルデータを収集するのに時間を要する。現状の製造ラインがIoTを導入することを前提とした設計になっていない。
  • 熟練者に依存するタスクが多く、その人でないと判断ができない。また基準化、言語化がされていない。作業者の暗黙知形式知のそれぞれのナレッジメントとデータが明確化されていない。
  • 検品作業自動化のための異常データが発生する確率が少なく、これからデータを貯めるフェーズだとAI導入に時間が掛かる。
  • 各社のデータ管理ポリシーが強固である。製造ラインのオンプレミスな環境から、クラウドなど外部にデータを預けることはポリシーに反することがある。

AI導入の課題

  • 検品作業の人が担っているプロセスにおいては異常を検知する精度が高い。またAIが出力可能な精度はまだ100%にないため、作業すべてを置き換えることができない。
  • IoT・AIの両方をセットで新規導入するケースについては、IoTで撮像条件を良い状態にしつつ、AIの精度を上げる必要があるので、対応の時間が長期化するケースが多い。仮に精度問題が発生したときに、初期においてはどちらに原因があるかを都度分解する必要がある。
  • 業務プロセス側のドメインを知らない作業者がAIのモデル運用を続けることで、実運用と乖離した最適化をしてしまうリスクがある。
  • AIによる異常検知が目的となってしまい、本質的な製造機やパーツが不良となる原因分析の方にフィードバックができない。

新しい動き

一方で最近の取り組みとしては良い材料も多い。工場の老朽化により製造ラインを新しく設計するケースも有り、その場合はIoT・AIの導入を見据えた形でリプレイスが検討されている。また製造ラインの担当者も異常検知が主目的ではなく、異常が発生する原因を特定するための製造物の正しい状態把握をデジタルデータで蓄積し、可視化から分かる機械工学の改善シフトに軸を移そうという動きも見受けられる。

製造業のAI導入の課題はまだまだ山積みではあるが、技術的な取り組みとしては非常にチャレンジングな領域であり、今後もこの方面には継続してトライをしていきたい。

運のコントロール

@yutakikuchi_です。 馬田隆明さんの逆説のスタートアップを読んだ。アイディア、戦略、プロダクト、運についてそれぞれの章ごとに書かれており、スタートアップに携わる人は一読することをおすすめする。起業の科学などアイディア〜プロダクトについては説明がある他の本もあるが、運についてはなかなか見ることがなかったコンテンツなので、読んでいて非常に面白かった。なお、馬田さんはスタートアップについて様々なコンテンツをslideshareで共有している。

※ 第四章、運についての言及をメモとして共有。ただし、内容は意訳とし記載しています。 「運もある程度コントロール可能である」。①成功している起業家こそ、リスクを嫌う傾向があり、リスクを管理するためのポートフォリオを作成する。スタートアップの一つの行動がリスクであるのだとすると、それ以外の分野では慎重に行動をする。アインシュタイン特許庁に勤めながら相対性理論を、カフカは保険局員として働きながら返信を書き上げた。②成功している起業家はタイミングを伺ってる。一番乗りで市場に入ることが正しくもなく、適切なタイミングまでじっくりと待っている。盛り上がっている市場に焦って参入することにより失敗する確率が高くなっているという報告もある。加熱が過ぎた、もしくは悪い時期に参入している方が成功確率が高くなる。③成功している起業家はチャンスを失うリスクのほうがリスクであると認識をしているので、今あるもののリスクではなく、将来を見て判断をしている。特にチャンスを失うというリスクの方を危惧する傾向がある。

ブラックスワンのように予期せぬリスクが発生する事も当然有り得て、そこの対しての回避戦略がいくつかある。一つの例としては「バーベル戦略」とい言われるもので、ハイリスクな投資を10〜15%、それ以外には健全な投資として85%〜90%を確保しておく。中間な投資は一切持たないという手法であるが、相対的にはミドルなリスクを取っていることになる。ミドルなリスクとして全てを保有していると予期せぬブラックスワンに耐えられず、全てが吹っ飛んでしまう可能性もある。

アンチフラジャイルという脆弱性を逆にうまく活かすことこそがスタートアップである。現実世界にあるボラティリティによる非対称な良いブラックスワンこそがイノベーションであるという説があるように、良いリスクに張ることがスタートアップであるという考え方。

挑戦の量が質を生みだす。 とある事例として、あるグループを量で評価する試験、質で評価する試験を同じ時間で回したときに、最終的には量で評価するグループの方が良い質を生み出せた。量による試行錯誤の回数を増やすことが非常に効果的であることを裏付ける例。アインシュタインは248、ダーウィンは119、フロイトは330の論文を書いている、エジソンは1093の特許、バッハは1000曲以上を作曲、ピカソは2万以上の作品を残しているように、天才も数多くの挑戦をしており、彼らの成功している時期は失敗を重ねていた時期と一致するという内容もあり、如何に試行錯誤が重要であるかが分かる。

以上が意訳内容。運もある程度コントロール可能であるという背景は、失敗のリスクも合わせてコントロールすることで、大きな失敗をする前に成長を持続させるという話。第四章だけでも時間があったら読み返したいと思える内容でした。

www.slideshare.net

そこに張る勇気

@yutakikuchi_です。 未来を正しく予測すること、どんなに優秀な人物が未来を考えても非常に難しいという事実がある。数多くの発明家や起業家が自分が描く未来へ投資を行い、失敗し続けてきた歴史もある。「未来は予期せぬところからやってくる」Y Comibinatorの設立者でもあるポール・グレアムも未来を予測することの難しさから、未来へのアイディアではなく考える人に注目すべきという話もある。

正しく予測できなかったとしても、現在〜未来を目指す中で「失敗の確率を減らすこと」は可能である。一見ダメそうなアイディアでも、隠れた良いアイディアを見つけることがスタートアップでは重要な要素とされているが、隠れた良いアイディアを実現する際に、検証というプロセスを入れることである程度のリスクを回避することができる。検証は最大の効果としては、その領域に携わる人間に対してアイディアを投げかけてみたり、課題となる一次情報を集めることで、自分のアイディアに対して客観的な感覚を注入することである。

検証されたアイディアに対して実施すべきかどうかの判断に必要なもの、それは経営者としてそこに張る勇気である。小さな市場にまずは目を向けて、そこの独占的なプレイヤーとなること。それを基に次は大きな市場を狙う。小さく成功を作って、大きく展開する。仮にそこで失敗、やり方を変えるためにピボットしても、バッターボックスに立ち続けてバットを振り続ければ、おそらく立ち直れる。そこに張る勇気。これが本当に重要。