ITと哲学と

IT系エンジニアによる技術と哲学のお話。

Practical aspects of Deep Learning

CorseraのDeepLearningのコースの学習メモです.

今回はニューラルネットワークを効率的に学習させるための知識を学ぶ.

Train/Dev/Test sets

ニューラルネットワークには様々なHyperParameterが存在する. 実際に各パラメータを試さずして,最適なものを見つける方法は現時点ではなく,効果的に調整することが求められる. この調整では,ネットワークの学習を行い,それを用いて動作確認してみてモデルの性能を確認し,満足するまでパラメータのチューニングを行う.

効果的にこれを実践するために,手元に得られているデータを3つの役割で分けて使い分けることがオススメ.分ける3つはトレーニングセットとデベロップメントセット,そしてテストセットである.

トレーニングセットはその名の通り,モデルの学習時に用いられるデータ群である. デベロップメントセットは,学習済みモデルの性能を確認し,パラメータの調整を行うために用いられる. さらに,テストセットはチューニングが完了した後に,最終的なモデルの性能を確認するために用いられるデータセットである.

基本的にそれぞれの役割にデータは一意に割り当てられ,被らないようにする.

全てのデータをトレーニングセットとして扱い,そのモデルの精度の評価にそこからデータを取り出して用いるような使い方では,過学習の問題を検知することができないので,アプリケーションとして提供する際に所望の性能が得られないからである.

データの割合は,総数が100-10000くらいのレンジであればTrain(60%)/Dev(20%)/Test(20%)くらいの分量に分ける.

さらに総量が増えて1000000くらいの量になって来た場合は,そこまでたくさんのDevセットやTestセットは不要なので,例えばTrain(98%)/dev(1%)/Test(1%)といったようなデータの扱い方でも問題はない.

Bias/Variance

バイアスとバリアンスについて. 学習済みモデルの性能を評価する指標として,バイアスとバリアンスがある.

図1にバイアスが高い状態とバリアンスが高い状態のそれぞれのイメージを示す.

f:id:masamasah:20180817155833j:plain

これは2変数のモデルの分類問題で,決定境界がそれぞれ示されている.

バイアスが高い状態のものは決定境界が線形であり,十分に高い精度の決定境界が得られていない. 一方で,バリアンスが高い状態のものは,決定境界が過剰に複雑になっており,トレーニングサンプルについては高い精度での分類ができているように見える. ただ,未知のデータを分類しようとした場合に,過剰にトレーニングサンプルに適応されており,適切な分類が行えないという問題がある.これはトレーニングサンプルが少なかったり,無駄にモデルが複雑な場合に発生する問題である.

高いバイアスは「トレーニングサンプルについて正しく決定境界が得られていない」状態を,高いバリアンスは「トレーニングサンプルについては満足できる決定境界が得られているものの,未知のデータについては正しくない」状態をそれぞれ指す.

テストセットに対する判定精度とデベロップメントセットに対する判定精度を比較することで,いまモデルがどんな状態にあるのかを図2のように判定することができる.

f:id:masamasah:20180817155848j:plain

Basic Recipe for Machine Learning

バイアスが大きいか,バリアンスが大きいかによって,モデルをより良い精度で動かすためにするべきことが異なる. ここでは,それぞれのケースですべき,基本的な事項を図3にまとめる.

f:id:masamasah:20180817155902j:plain

なので,例えばバイアスが高い状態では,いくらデータを増やしても問題解決には直結しないので注意が必要.

Regularization

ここでは正則化について説明する. 正則化はバリアンスが高い時に試すべき方法の一つで,バイアスを上げてしまうデメリットはあるが,データ採取などのコストをかけずにバリアンスを下げることが狙える手法である.

バリアンスが高い=過剰にくねくねした決定境界になっているという状態であり,これはモデル(W)のそれぞれの値が大きくなりすぎている時に起きる. なので,Wの値が大きくなりすぎないようにすることで,バリアンスを下げることが可能になる.

Wの値が大きくなりすぎないようにするために,ニューラルネットワークの学習時に最小化したいコスト関数に,Wができるだけ小さくなるような項を含めることで,これを実現する.この,できるだけ小さくなるような項はいろんな選択肢があり,図4に示すような場合をL2正則化と呼ぶ.

f:id:masamasah:20180817155915j:plain

このコスト関数を使った際の更新式は図5に示す通りになる. なお,λという値が初めて出て来た. これは正則化の程度を表す値であり,実装者によって調整されるべきHyperParameterの1つである.

f:id:masamasah:20180817155927j:plain

なお,αもλもmも正の値であるため,(1-αλ/m)は1よりわずかに小さい値になるので,この式の意味としては「学習ごとにWを少しだけ小さい値に減衰させていく」ことを意味する.

この直腸からL2正則化は重み減衰とも呼ばれる.

Why regularization reduces overfitting?

では,何故これによってoverfittingが起こらなくなるのかを,感覚的に説明する. なお,overfittingとは高いバリアンスを引き起こすようなトレーニングデータに対する過剰適応のことである.

λを大きくすればするほど,コストに占めるWの大きさの割合が増えるため,Wが小さくなることに対する興味が大きくなる.すると各Wの値は0に近づき,結果としてモデルがより単純な形になるため,overfittingを防ぐことができる.

Dropout Regularization

L2正則化の他にも正則化のテクニックがある. ドロップアウトはその中でも代表的な方法であり,L2正則化と同様によく使われる.

学習時に確率的に各レイヤーのノードを無効化して学習を進めるといった方法で,これを行うことで正則化効果を得ることができる.

Understanding Dropout

ドロップアウトを行うと,学習毎にノードの一部が消滅している状態になるので,学習するモデルが全てのノードをそのまま使う時に比べて小さくなる.その結果,overfittingを防ぐことが可能になる. また,確率的に全てのノードが不通になるので,1つの特徴に強く依存したモデルが作られにくい.1つの特徴に強く依存しているような場合は,特定のWの値が大きくなるが,ドロップアウトによってこれを防ぐことができる.つまりL2正則化と似たような効果が得られるわけである.

Other regularization methods

正則化の方法として他にも,既存のデータを工夫して増やすデータ拡張や学習の早期終了などがある.

Normalizing inputs

この章では,学習効率をあげるための,入力の正規化についてのべる. これを行うことで学習スピードを早めることができる.

簡単に説明すると,図6aのような入力を,図6bのような形に変えてあげることで学習を早めようというテクニックである.

f:id:masamasah:20180817155943j:plain

これを入力に対して行うことで,学習が最適化されやすくなり,学習効率が高まる.

正規化の手順を以下に示す. まず,それぞれの特徴x1,x2について平均μを求める. 次に,各特徴の分散σを求める.

上記の平均と分散を用いて各特徴を図7の式の通り正規化する.

f:id:masamasah:20180817155955j:plain

これで図6bのような平均が0で分散が1の特徴量空間への写像が完了する.

なお,トレーニング時に用いたμとσは取っておいて,予測時にも入力データに対して同様の前処理をかけるようにしなくてはいけないので注意が必要.

Vanising/Exploding gradients

深いネットワークの学習において,勾配爆発/消失の問題がある. これが発生するとモデルの学習が行われなくなる. これの発生原理の説明を行う.

簡単のために,図8のようなネットワークを考える. また,活性化関数が線形写像(g(z)=z)として考える.

f:id:masamasah:20180817160005j:plain

この時y^は図9のように表せる.

f:id:masamasah:20180817160016j:plain

ここで,Wを図10のように初期化するとy^の値が指数関数的に増大もしくは減少する.

f:id:masamasah:20180817160027j:plain

これが勾配爆発/消失の問題である.

Weight Initialization for Deep Networks

上記を完全ではないが,ある程度防ぐことのできる,Wの初期化方法がある. 初期化方法は使う活性化関数によって異なるが,偏差が特定の値になるように調整することで実現される. 図11に活性化関数毎の初期化値を示す.

f:id:masamasah:20180817160040j:plain

Gradient checking

勾配法を実装する際に,デバッグで活用できるGradientCheckingについての解説.割愛.

Gradient Checking Implementation Notes

GradientCheckingを実装する上での注意点を解説している.割愛.

Deep Neural Networks

CouseraのDeepLearningのコース. コース1の最終週分です.

Deep L-layer neural network

2層や3層の浅いモデルでは,性能的に限界があるので,より高い性能を求めて深いニューラルネットワークが活用されるようになった.

浅いニューラルネットワークでは使っていなかったが,新たな記法としてL(総ノード数)を今後は使っていく.

Forward Propagation in a Deep Network

深いネットワークにおける順伝播を定式化する. まず,単純に1サンプルに対する順伝播を考えると,図1のように定式化できる.

f:id:masamasah:20180814184820j:plain

これをmサンプルに拡張し,ベクトル化すると,図2のように表せる.

f:id:masamasah:20180814184830j:plain

これがDeepNetworkにおける順伝播の式となる.

Getting your matrix dimensions right

各実装を行なっていく上で,各行列のサイズを意識してコーディングしていくとバグが減らせる.そこで,この章では各行列のサイズを明らかにする.

図3のようなネットワークを考える.

f:id:masamasah:20180814184844j:plain

この時,1サンプルのみを考えると各行列のサイズは図4のようになる.

f:id:masamasah:20180814184858j:plain

さらに,これをmサンプルに拡張すると図5のようになる.

f:id:masamasah:20180814184912j:plain

なお,b^[l]については,サンプルごとに異なるものを用いるのではなく全てのサンプルに対して同様のものを使い回すこと.

Why deep representations?

深いネットワークにすると,より複雑なことができるようになる.

これをイメージ的に説明する.

例えば顔画像認識のネットワークについて,はじめの方の層は例えば画像のエッジや境界線を検出するような単純なものを検出するために働く. これが,中段の層になると.下位の層の単純なものを組み合わせて例えば目や鼻を検出するようなことができるようになる.

さらに深い層になると,目や鼻を組み合わせて様々な顔のパターンを検出できるようになることで,顔の画像認識が高い精度で実現できる.

このように,下位の層で抽出したシンプルな特徴を組み合わせて,深い層では複雑なパターンの認識ができるようになる.

これによって,より例えば画像認識であればより精度が高まるなど,複雑なことができるようになる.

画像の例だけでなく,例えば音声認識では,下位の層は音の上がり下がりなどの簡易的な特徴を捉えるが,深い層になるについれて音素を識別し,さらに深い層ではそれを組み合わせて単語を識別したりできるようになる.

これが,深い層でより複雑なことができるようになることについての直感的な説明である.

BUilding blocks of deep neural networks

これまでの内容を一枚の図でまとめると図6のようになる.

f:id:masamasah:20180814184929j:plain

ここには深いネットワークにトレーニングデータが入力され,推定値が計算され,その誤差を持ってネットワークが学習するといった1stepが示されている.

これを何度も繰り返して,モデルを学習する.

Forward and Backward Propagation

図6で行う具体的な計算を図7にまとめる.

f:id:masamasah:20180814184951j:plain

Parameters vs Hyperparameters

ニューラルネットのパラメータはこれまで見て来た通り,Wやbがある, これらとは別に,アルゴリズムに与えないといけないHyperParameterがいくつかある. 以下にその一覧を示す.

  • Learning rate α
  • イテレーション数(学習回数)
  • 隠れ層のレイヤー数(L)
  • 各レイヤーのユニット数(n^[1],...,n^[L])
  • 活性化関数としてどれを選ぶか

これらのhyperparameterはアプリケーション毎に調整する必要がある. コスト関数の収束度合いからLearning rateを調整したり,レイヤ数を調整したり,CrossValidationの結果からも様々なHyperparameterを調整する必要がある.

What dose this have to do with the brain?

ニューラルネットの説明として,よく使われる脳に似ているという表現は,ニューラルネットの研究の進歩に伴って,陳腐化してきている.

シナプスニューロンの関係性はわかりやすい類似性がある一方で,その学習過程などについては,脳の学習機構も同様に逆伝播が活用されているのかそうではないのかなど,まだ解明されていない.

CNNの文脈では脳の構造から着想を得た部分が大きいが,一方で通常のニューラルネットについては脳との関連性はあまりなくなって来ているのが現状.

キャッチーでわかりやすいが,厳密性はあまりなくなっているのが現状.

Shallow neural networks

CouseraのDeep Learningコースの第1コースの3週目

Neural Networks Overview

ニューラルネットワークの大枠の説明. 以降の章で話されることが端的に出てくる.

Neural Network Representation

前回学んだロジスティック回帰のノードを複数結合させたようなものをニューラルネットワークと呼ぶ(図1).

f:id:masamasah:20180814151142j:plain

入力のノード群をInput Layer,出力のノードをOutput Layerと呼び,真ん中の層をHidden Layerと呼ぶ.

トレーニングセットにはInputLayerとOutputLayerのデータのみが含まれ,HiddenLayerの情報は含まれない.そのためHiddenLayer(隠れ層)という表現で呼ばれる.

図1のニューラルネットワークは2層のニューラルネットワークと呼ばれ,慣習的にInputLayerはカウントしない.

各レイヤーの出力する値は図2のようにそれぞれa^[i]で表される.

f:id:masamasah:20180814151507j:plain

Computing a Neural Network's Output

各ノードは自身へのインプットと重みの計算活性化関数の処理を行う. 活性化関数は後述するが,ロジスティック回帰のSigmoid関数をイメージすればよい.

図3に第一層で行われる処理のイメージを示す.

f:id:masamasah:20180814151232j:plain

前の章でもあったように,ニューラルネットワークを実装する上では,ベクトル化が重要になる.

図3の処理を2層目にも適用し,ベクトル化すると図4のように表せる.

f:id:masamasah:20180814151253j:plain

Vectorizeing across multiple examples

図4をさらに,トレーニングサンプルについて拡張してベクトル化すると図5のように表せる.

f:id:masamasah:20180814151325j:plain

Explanation for Vectorized Implementation

これまでの振り返りなので割愛.

Activation functions

活性化関数についてのお話. これまではシグモイド関数だった部分について,ほかの選択肢として図6に示す3つがあげられた.

f:id:masamasah:20180814151341j:plain

シグモイド関数は限られた用途のニューラルネットワークでしか用いられない. 代わりにtanhもしくはReLU関数が用いられる.

特にReLU関数はおすすめで,とある問題を解決することができる. とある問題とは,ニューラルネットワークにて最急勾配法を行う際に,活性化関数の微分した形が必要になる際に,引数Zの値が大きくなりすぎることで発生する問題であり,これが発生すると学習の効率が著しく下がる.

引数Zの値が大きくなると,tanhやsigmoid関数の場合,勾配がほぼ0となり,その結果として学習が全く進まないからである.

ReLU関数はZがどれだけ大きくなったとしても勾配は常に一定であり,上記の問題が発生しないという特性がある.そのため,ReLU関数は活性化関数としてよく用いられる.

なお,これまで見てきた4つの関数はいずれも非線形な関数であり,線形な関数は基本的に活性化関数として向かない.その理由は次の章で説明する.

Why do you need non-linear activation functions

図5において,A^[i]を求める際に用いる関数が例えばf(z)=zだったとする(線形関数). すると,図7のように,最終的に1層のニューラルネットワークとして表す値の組み合わせを見つけることができる.

f:id:masamasah:20180814151356j:plain

これは如何に多段にしても変わることはなく,何層にしたところで,線形関数を用いている以上は最終的には1ノードで表すことができる. そのため,表現力の高いモデルにはならず,多段にする意味がない.

これを避けるために非線形な関数を活性化関数として採用しなくてはいけない.

Derivatives of activation functions

次の章で詳細は述べるが,最急勾配法を行うためには活性化関数の微分形が必要になる. 各活性化関数の微分形を図8に示す.

f:id:masamasah:20180814151411j:plain

Gradient descent for Neural Networks

計算グラフから,ニューラルネットワークでの最急勾配法を定式化する. まず,解きたい問題のアルゴリズムを図9に示す.

f:id:masamasah:20180814151428j:plain

これを計算グラフを使って表すと図10のように定式化できる.

なお,np.sum(A, axis=1, keepdims=True)は,Aを縦方向にsumして,得られる解の形を(n,1)とするためのもの.keepdimsがないと,pythonの仕様から,(n,)という形状で返って来てしまうので扱いにくくなる.型を揃えるためのおまじないみたいなもの.

f:id:masamasah:20180814151449j:plain

ここまで,図5では2層ニューラルネットの順伝播による推定を,図10では2層ニューラルネットの逆伝播による学習を定式化した.

これで,2層のニューラルネットの学習並びに推定において必要なことはほぼ出揃った.

次章では細かいことだが,重要な各パラメータの初期化について述べる.

Random Initialization

2層ニューラルネットワークではパラメータがw1,b1,w2,b2と4つあった. このうち,b1,b2については初期化時に考慮しなければならない特別な問題はないので,一般的には全て0で初期化される.

一方で,W1,W2については初期化時にそれぞれの要素をランダムで小さい値で初期化する必要がある.

初期化時にランダムな値ではなく,全て0で初期化すると,各レイヤーにおいて,ノード同士の出力の値が等しくなる.順伝播を繰り返し,誤差を計算して逆伝播する際に,出力が各レイヤー内部のノード同士で等しかったので,等しい値で学習が行なわれる. どれだけ学習を繰り返したところで,各レイヤー間の各ノードの値同士が等しい状況は変わらず,学習がうまくいかない. この問題を対称性の破れという.

これを避けるために,それぞれノードの初期値はランダムで初期化してあげる必要がある.

さらに,初期化の値を大きくした場合,活性化関数としてシグモイド関数tanh関数を用いた場合,微分形の値がほぼ0になるため,学習が進まない.

そのため,各初期値は十分小さい値でランダムに初期化する必要がある.

Neural Networks Basics

CouseraのDeep Learningのコースのお勉強メモpart2

Binary Classification

ニューラルネットワークの説明の前に,先ずは簡単な導入としてLogistic回帰を説明する.

ロジスティック回帰とは,Yes/Noを予測するアルゴリズム. 例えば写真に猫が写っているという問いに対するYes/Noを予測する.

ロジスティック回帰のinputとしては,画像をそのまま使うのではなく,画像のRGBの各ピクセルを1列に並べ替えたベクトルを用いる(図1).

f:id:masamasah:20180813155852j:plain

このベクトルの要素数をnxと呼ぶ.

他にも,数学的な記法として図2のようなものがある.今後はこれを使って行く.

f:id:masamasah:20180813155905j:plain

Logistic Regression

このアルゴリズムでは,inputを受け取って,inputが問いに対してYesとなる確率(0~1の範囲)を計算する. その際のパラメータとしてwとbの2つがある.なお,wはベクトルで,bは実数.

計算方法は図3の通りで,ベクトル同士の内積にbを加えてシグモイド関数をかけたら完成.

f:id:masamasah:20180813155918j:plain

シグモイド関数は図に示す通り,0~1の値をとる関数.

y^が正しい値になるように,パラメータのwとbを学習し,そのパラメータを用いて,Yesとなる確率を計算する.

Logistic Regression Cost Function

ロジスティック回帰では,できるだけy予測値とy(実測値)を近づけたい.

予測値と実測値の近さを評価する関数を損失関数とよび,図4のように表現する. ややこしい数式っぽく見えるが,これはこのあと出てくる最急勾配方をうまく動かすために必要な工夫なので,詳細は割愛.

f:id:masamasah:20180813155931j:plain

全ての教師データ(トレーニングセット)に対して平均的により良いパラメータを求めたいので,全てのトレーニングセットについてどれだけ正しく予測できたかという指標として,Cost関数を図4のように定義した.

これを小さくするためのwとbを探すことが,学習である.

Gradient Descent

最急勾配法についての説明.

Logistic Regression Cost Functionにて,なんだかややこしい損失関数を定義していたが,そのお陰でCost関数が下に凸な形状になる(図5).

f:id:masamasah:20180813155945j:plain

このCost関数を一番小さくするwが求めたい.図中のw_{min}がそれ. これを行うための簡単な方法として最急勾配法がある.

アルゴリズムは以下の通り.

  1. 適当な値にwを初期化する
  2. J(w)の値が小さくなる方向にwを少しだけ更新する
  3. 収束するまで繰り返す

ここで更新する式は図6の通り.

f:id:masamasah:20180813155959j:plain

なぜこれを繰り返すことでw_{min}に近づくかを以下で説明する.

まず,図7のようにw0としてwが初期化される.

f:id:masamasah:20180813160010j:plain

更新式にある微分を計算すると,w0の地点でのJ(w)の傾きがわかる.

w0+であれば微分結果は正の値になるし,w0-であれば負の値になる. これに学習率を掛け合わせて1stepの歩幅が決まり,更新式の通りに更新される.

w0+の場合は微分結果が正であり,aもまた正なので,wは小さくなる方向に更新される. これを繰り返すとw_{min}に近づく.

逆にw0-の場合は微分結果が負になり,aは正なので,wは大きくなる方向に更新される. これを繰り返すことでw_{min}に近く.

最急勾配法はこんな感じでCost関数を最小化するwを見つけることができる.

Derivatives

微分の簡単な説明なので割愛

More Derivatives Excamples

微分の簡単な説明なので割愛

Computaion Graph

順伝播と逆伝播の説明に欠かせない,計算グラフについて説明する. 先ずは簡単な例としてJ(a,b,c)= 3 * (a + b * c)を計算グラフで表すと図8のようになる.

f:id:masamasah:20180813160024j:plain

a,b,cそれぞれに値を入れて,順順に値を伝播させ,Jを求める作業を順伝播と呼ぶ.

Derivation with a Computation Graph

計算グラフを用いて簡単に微分を求めることができる.その方法を逆伝播と呼ぶ.

順伝播とは逆に,最終結果から1つずつ微分を求めて行くと図9のように,a,b,cそれぞれによる微分を簡単に求めることができる.

f:id:masamasah:20180813160037j:plain

この知見を最急勾配法で必要な微分計算に用いる.

Logstic Regression Gradient Desent

計算すると,図10のようになる.

f:id:masamasah:20180813160050j:plain

Gradient Desent on m Example

上記はあくまで1サンプルに対して成り立つ方法だった. これをm個のトレーニングセットについて適用すると図11のようになる.

f:id:masamasah:20180813160105j:plain

Python and Vectorization

実際にコーディングする際には,最適化と並列実行をサポートするために,明示的なFor文を極力書かずに実装する必要がある.このテクニックをベクトル化とよぶ.

これによって実行速度がかなり変わってくる.簡単な例であっても300倍ほどの違いにもつながるので,とても大事なテクニック.

ベクトル化することで図11のFor文があってわかりにくかった記載が図12までシンプルに記載でき,実行速度の面でもかなり有利になる.

f:id:masamasah:20180813160122j:plain

Neural Networks and Deep Learning introduction

CouseraのDeep Learningのコースを以前受けていたが,最近忙しさにかまけて結構放置してしまっていた...

反省の意を込めて,最初から受け直して見ることにしたのでメモを公開してみようと思う.

最後まで通して受け直す気力が持つといいなー

Welcome

コースの全体像の説明.

What is neural network?

家の大きさから値段を予測したいとする. 家の大きさと値段をプロットすると,それを予測するための直線がなんとなく描ける(図1).

f:id:masamasah:20180813155516j:plain

これを別の表現方法で表すと,図2のようにも表せる.

f:id:masamasah:20180813155530j:plain

家の大きさをinputとして受け取って,円のなかで何かしらの処理をして,値段をoutputとして出力する. この何かしらの処理が先ほどの直線と同様の関数であれば,家の大きさから値段を予測することができる. この,inputを受け取って,outputを返す円をニューロンという.

このニューロンが複数積み重なってできるのが,ニューラルネットワークである.

Supervised Learning with N.N.

教師あり学習とは,INPUTとOUTPUTの組み合わせが複数与えられた時に,INPUTを正しくOUTPUTに変換する関数を求める学習方法であり,ニューラルネットワークでもよく用いられる.

Why is DeepLearning taking off

ニューラルネットワークは近年の技術的な進歩によってその有用性が高まってきている. 一番大きいのはデジタル化によって存在しているデータの量が増えたことが大きい.

図3にデータ量とパフォーマンスの一般的な関係を載せる.

f:id:masamasah:20180813155558j:plain

データが少ない領域では,ニューラルネットワークだろうが他のアルゴリズムだろうが基本的には大きく違いはなく,いかにうまく特徴量を設計できるかによって,その差が生じていた. ここが従来の機械学習は職人技と言われる所以になっていた.

データが多い領域では,逆に,特徴量の設計などは関係なく,大きなネットワークで高い性能が出るようになった.近年のデータ量の増加に伴って,主戦場が移った.

データの量だけではなく,コンピュータの計算能力の向上やアルゴリズムの改善ももちろん大きく寄与している. 大量のデータを扱うのには大変時間がかかっていたが,コンピュータの処理能力の向上やアルゴリズムの向上によって短い時間で処理できるようになったことが大きい進歩の要因の一つになっている.

事業を創る人の大研究を読んだ

「事業を創る人」の大研究を読んだ.

タイトルの通り「人」に着目した新規事業立ち上げに関する本で,独自研究で得られた沢山のデータをもとに考察を進めていくというスタイルの本でとても参考になったので要点をまとめてみようと思う.

本書との出会い

本屋さんでパラパラと新規事業関連の書籍を探していた際に『はじめに』を立ち読みし「あるあるw」と共感し,続きが気になったので,さらに序章を読んだところ「あるあるあるあるw」と深く共感したので購入した.

簡単にまとめると「新規事業ってなんか大変そうだし,あんまり関わりたくないよねw」というのと「新規事業って社内からの風当たり強いよね」という点に共感した.

ターゲット

既存事業がある会社における新規事業立ち上げをターゲットにしている. スタートアップ企業を立ち上げましょうとかそういうことではない点が通底して重要な特徴になっている.これによって様々な軋轢が生まれる.

ターゲットとしているロールは,新規事業を創る人自身はもとより,それを支える上司や経営層を主に狙っているように思う. 本書では「人」として「創る人」「支える人」「育む組織」の3つをあげているが,育む組織の人に遍く届くようにというよりは,むしろ組織をつくる人(つまり経営層)をターゲットにしていると思われる.

本書の立ち位置

新規事業立ち上げに関する書籍は色々ある.カリスマ経営者的な人の自伝に近いような実践系の書籍と学術的な研究に基づく学術書の2つに分けられる. 本書は学術書に分類されるものであり,学術書の中でも新規事業立ち上げについて「人」に着目した点がユニークな点となっているとのこと.

つまり他の書籍とは異なりプロセスから人へ視点を移した点が面白いところ.結局人だよねーという.

第1章

新規事業を取り巻く環境

新規事業を「既存事業でえたモノを活用し,新たな経済効果を生み出す事業」と定義している. 既存事業で得たモノを活用するという点がポイントになる.

ライフスタイルの変化により,新規事業をつくるというのは企業にとって生存戦略として必要不可欠なものになりつつある.

なお,それだけにこれに対する期待はとても大きいようで,「予算的には成功しているプロジェクトであっても経営層の満足度は低く満たされないケースが多い」という面白いデータが示されている.

これ,ゴールポストが動いているということであり,担当者にとっては悪夢でしかない...ちなみにこの問題自体については今後議論されない.

新規事業に必要な能力

新しいアイディアを形にして,それをお客様に届けることができて初めて新たな経済効果が生み出せる.

独自研究で得られたデータから経営者は新規事業を進めていくためには「新しいアイディアを考えて,未知を恐れず,最後まで突き進むことができる」力が必要だと考えているケースが多いらしい.

一方で,新規事業立ち上げ担当が実践を通じて必要だと感じた力は「現場を正しく観察し,上手に他者を巻き込める」力である. 新規事業を立ち上げるために,社内からの理解が得られず苦しむというケースがとても多かった模様.

この結果から,これから新しく担当になる人は社内理解をいかに得るかという点をもっと意識した方が良さそうに思った. これができるかどうかってかなり人間力が問われるテーマだと思う.

特に新規事業はその構造から社内からの風当たりが強くなりがちだし,孤立しがち.しんどいことも多い. その証拠に,新規事業を去っていく人の理由は「事業自体がうまくいかなかったことよりも,新規事業をめぐる構造によるもの」が多い.

まとめ

新規事業はアイディアそれ自身よりもいかに周囲を巻き込むかが大事であり,そこに人の力が問われる.さらに,新規事業の構造上,しんどいことが多いので,折れない心の力も大事.

いかに心が強い人でもサポートがないと折れてしまうので,支える人や組織がさらに大事.それらもマルッと含めて,人が大事ということ.

第3章

創る人に求められるスタンス

新規事業は結果が出るかどうかわからないものであり,業績志向になりすぎても結果が出るかどうかはわからない. むしろ事業を出そうというプロセス自体から学びを得て,それを糧にさらにブラッシュアップできるような成長志向のマインドセットが必要.

ゼロから試行錯誤しながら形作る経験からしか学べないことは大きい.これを学び,生かしていくマインドセットが重要.

事前知識があることの優位性

前述の通り,新規事業の構造からきているしんどさが多いので,嵌る可能性のある落とし穴が独自研究の成果から見つかっている. 11の問題とそれをまとめた4つのジレンマという形でそれらが以降の章でまとまっている.

これを知っておくことで,自分が今置かれている状況を俯瞰的に理解できるし,それによって「これは自分だけの固有の問題ではなく構造上の問題なんだ」とリフレーミングでき,前向きに問題に取り組めるようになる.

これが本書の大きな価値になっていると思う.

第4章

前述の11の問題について解説がある.が,個別具体的なこうしたら良いというのは残念ながら示されていない. 示されてはいないが,問題の粒度が大きいため,個別具体的な解決は状況によるところが大きいからこれは仕方ないと思う.

大事なのは,こういう問題が実際に起こりうるだろうということを理解しておくこと.

「既存事業部門からの批判」とか「新規事業プランを生み出せないジレンマ」あたりがとてもとても身につまされる.

既存事業部門からの批判

新規事業の人たちは何やってるかわからんというところが原因になってこの問題が起こるように思う. 何やってるかわからん人たちが,自分たちが必死に生み出した利益を食いつぶしているように見えるという構造が,この批判をうむ.

進め方や情報発信を考えてやっていかないと,簡単に孤立しまっせというお話.つらい...

新規事業プランを生み出せないジレンマ

創る人は,その事業が軌道に乗るまではできていない状態が続くわけで,できない自分の姿に苦しみ続けることになる.

第5章

新規事業を創る人はそんな感じで孤立したり,しんどかったりするようなので,それを折れないようにサポートする組織風土が必要だというお話.

事実として,他部門が新規事業を応援しようという組織風土は新規事業の業績を有意に高め,新規事業をお金の無駄だと思っている組織風土は業績を有意に下げるというデータもある.

若干ポジショントーク的に感じなくもないけど,データが出ている以上そういうことなのかなという印象. とはいえ,組織風土は片方が頑張って作れば良いものではもちろんないとも思う. 創る側の人も,自身がどう見られる可能性が高くて,実際にどう見られているのかということを常に自問して,事業を成功させるために社内の周囲との関係性づくりを怠ってはいけないんだと思う.

読了後まとめ

本書では人の側面が強く論じられていたけど,もちろん技術的な面やアイディアが出せるかという面も大事.というかそっちこそが前提だとは個人的に思う. その上で人としての力も求められるということで,新規事業を成功させるためには高い総合力が求められる.

そのための補助輪として本書は有用だと思う. 事前に予期できるだけで心構えができるし,準備もできる.自分だけが抱える問題じゃなくて構造上起こりうる問題なんだと捉えられるようになる点も,将来本書に助けられるところがあるかもしれない.

ところで,人間力ってどうしたらつくんでしょうね........

「事業を創る人」の大研究

「事業を創る人」の大研究

「○○がない」ということについて最近考えること

「○○がない」という言葉を聞くたびに、最近思うことがある。

「○○がない」って、一見問題提起っぽく見えるけど、その実はただの事実を述べてるにすぎない。

これをどうやったら解決すべき問題や、より良くするためのアクションを誘発する問いにできるか?を考えてみたい。

たとえば?

「hogehoge分析をしてみた結果、第N象限に関する取り組みがないです」とか「UnitTestが無いです。テストコード自体も、テストコードを書く文化自体もないです」みたいなやつ。

どういうこと?

「○○がない」ってのは事実であり、○○が存在していないってことを指摘している。

「問題」というのはなんらかの不都合があるから解決する対処だとすると、「○○がない」という事実が、そのまま全てなんらかの不都合に結びつくものでは無いと思う。

例えば、「弊社には薬剤師がいない」という事実があったとして、弊社はソフトウェアメーカなので別段不具合はないのでそれは問題ではないと思うわけで。

このように、「ない」という事実は問題に直結しない。

ここまで極端な例ではなくても、「みんながあったらいいかも」と思うような内容であっても、様々な制約や優先事項から取り入れていないケースもあるかも。 例えば、「弊社にはテレビCMがない」という事実があり、テレビCMがあればもっと売れるようになるかも?という期待はあるけど、予算や理念、効果についての考えなどからそういう選択をしている(?)ものであり、それは問題ではないと思う。

このような切り分けなく「○○がない」という事実自体を問題として扱うと、それの解決方法は「○○がある」という状態を作ることにもなる。 その結果、「○○がない」を裏返した「○○がある」状態をやみくもに目指すことになり、有限なリソースをへんな配分で消費してしまったりすることになる。

さらに、「○○がない」事実を「○○がある」状態に変えたところで、その奥にある問題を発見できていないので、真の問題に対するカイゼンが進まないと言う問題もある。

前述の「テレビCMがない」こと自体を問題として捉えてみると、それを解決するためには「テレビCMをうつ」ということになる。 が、解決するべき問題って、売り上げが少ないとか購買層からの認知が低いとかそういうことですよね。

購買層からの認知が低いことが問題であれば、テレビでマス向けに広告打たなくてもいいかもしれないし、売り上げが少ないことが問題であれば、もっと営業活動に投資するとかあるかもしれない。利益が低いみたいな問題であればCM打つことによって余計費用がかさんでマイナス効果が出るケースもあるかも。

じゃあどうしたらいい?

問題まで落とし込んで考えるべきだと思う。 「○○がない」ことでどんな不都合があるのか?

テストコードがないから、どんな不都合があるのか?みたいな。

テストコードがないことで、テスト工数が余計にかかっているとか、バグが流出しているとか、リファクタリングできないとか。そういう具体的な問題をベースに考えるようにしたい。 そうしないと、ただ「ある」状態をやみくもに目指すことになると思う。

問題まで落とし込めば、ある状態を作る以外のもっと良い解決策にたどり着くかもしれない。

おちは?

ないです。