Ch_2 五つの競争要因 ー 利益をめぐる競争_後編|『[エッセンシャル版]マイケル・ポーターの競争戦略』読解メモ #4

f:id:lib-arts:20190625182650p:plain

 

本の選定などの経緯は#1にまとめました。

#1では「はじめに」で記述されていた、本の概要について、#2では第1章の内容として「競争 ー 正しい考え方」についてまとめました。

#3、#4では第2章の内容として「五つの競争要因 ー 利益をめぐる競争」についてまとめます。第2章は少々長いため、#3では前半として「五つの競争要因を評価する」までを取り扱いました。

#4では「なぜ競争要因は五つだけなのか?」以降を取り扱います。
以下、目次になります。
1. なぜ競争要因は五つだけなのか
2. 戦略への示唆
3. 構造は動態的である
4. 感想・まとめ


1. なぜ競争要因は五つだけなのか
五つの競争要因のフレームワークが全ての業界に当てはまる理由は、あらゆる取引の根本をなす関係を網羅しているからという、単純な理由による。つまり買い手と売り手、売り手とサプライヤー、競合する売り手同士、供給と需要の関係などである。五つの競争要因を全て覚えているかよりも重要なのは、フレームワークの根底をしっかり理解することである。どんな業界にも限られた数の構造的要因が作用し、それらが体系的かつ予測可能な方法で、業界の収益性に影響を及ぼしていることについて理解しておかねばならない。
五つの競争要因以外にも重要な要素はあるが、どれも構造的ではない。以下よく挙げられる四つの要素を挙げる。

・政府による規制
・技術
・成長率
・補完品

業界によってはこれらの要素を理解し適切に対処できるかどうかが成否を分けることもあるが、これらの要素の影響が増したからといって、例えば買い手の力が高まる時の様に、業界の収益性に体系的かつ予測可能な影響が及ぶことはない。
(本の図2-2では五つの競争要因が図でまとまっています。)


2. 戦略への示唆
五つの競争要因の全体としての強さを把握することが大切であり、理由としては五つの競争要因が価格とコストに、そして競争に必要な投資に影響を及ぼすからである。業界の生み出す経済価値がどの様に分配されるかは業界構造によって決まる。つまり業界内の企業がどれだけの割合を確保し、どれだけが顧客、サプライヤー、流通業者、代替品に流れるなどを決める。この分析から得られた洞察はどこで、どの様にして競争するかという意思決定に直接生かされなくてはならない。
五つの競争要因の分析は、業界の「魅力度」を判断するために用いられることが最も多く、撤退、参入、投資を検討する企業や投資家にとって、これは欠かせない。それに加え、下記の視点などで考えることで重要な洞察を得ることができる。

・業界の収益性はなぜ今の様な水準なのか、収益性を支える要因は何であろうか
・何が変わりつつあり、収益性は今後どの様に変化するだろうか
・自社が生み出している価値の取り分を増やすには、どういった制約要因を克服しなくてはならないだろうか

これらの視点で考えることで、複雑な競争の本質を見抜き、業績を改善するための様々な措置が取れる様になる。
また、業界分析でさらに考えるべきなのが、「競争要因の影響が最も弱い場所に寺社をポジショニングできるかどうか」である。この点も意識せねばならない。

3. 構造は動態的である
競争要因の一部または全てが時とともに変化するにつれて、業界の収益性も変化する。業界構造は静態的ではなく動態的である。業界分析を行うことはある時点での業界の姿を捉えることだが、五つの競争要因の傾向を分析することでもある。買い手やサプライヤーは、時とともに力を増すこともあれば、失うこともある。技術革新や経営革新のせいで、新規参入や代替の脅威が高まる場合も薄れる場合もある。
どんな業界にも常に変化が起きている。業界構造をよりよく理解すれば、業界構造自社に有利に再編できる新しい戦略機会や動きを見極め、活用することができる。難しいのは重要な変化を見分けることだ。戦略上重要な変化とは、五つの競争要因に影響を及ぼす様な変化である。


4. 感想・まとめ
#4では第2章の後半について取り扱いました。若干が前半部に内容が偏っていた印象ではあるので、若干分量に差が出てしまった形になります。
五つの競争要因をどの様に意思決定に生かしていくかなどに参考になりそうな印象でした。また、要因は時とともに変わるため、随時見直していくことが重要だと思われました。
第2章についてはこれで終了したので、#5では第3章に入っていきます。

GLUE(General Language Understanding Evaluation) dataset②|機械学習の有名データセットや評価指標を確認する #5

f:id:lib-arts:20190623111710p:plain

機械学習の研究を読み解いたり実際に取り組んだりする中でデータセットや評価指標について知っておくと良いので、それらについての整理を行うにあたって連載を行なっていきます。
#1〜#3では2005年〜2012年頃の画像認識のデータセットとして有名なPASCAL VOCについて取り扱ってきました。

#4からは自然言語処理に用いられるGLUE(General Language Understanding Evaluation)ベンチマークについて取り扱っています。

GLUE Benchmark
#4ではデータセットの概要とCoLA(The Corpus of Linguistic Acceptability)とQQA(Quora Question Pairs)について取り扱いました。

GLUEのデータセットは10ほどあるので、#5ではもういくつかピックアップできればと思います。
以下目次になります。

1. diagnostic(Diagnostics Main)に関して
2. QNLI(Question NLI)に関して
3. RTE(Recognizing Textual Entailment)
4. まとめ


1. diagnostic(Diagnostics Main)に関して
1節ではdiagnostic(Diagnostics Main)について取り扱います。まずはデータセットの公式ページを確認します。

f:id:lib-arts:20190626122514p:plain

https://gluebenchmark.com/diagnostics

Diagnostics MainについてはGLUEのページに記載があります。概要を掴むにあたってまずはIntroductionを確認していきましょう。

f:id:lib-arts:20190626122546p:plain
上記を簡単に要約します。
要約:『GLUEは言語に関する広範できめの細かい分析が行えるようにするために手動でキュレートされた評価データセットより派生しています。データセット自然言語推論(NLI; Natural Language Inference)を通して文の理解を評価します。NLIのタスクは構文の曖昧性の解決からhigh-levelのreasoningまで言語理解に関する広範なスキルセットを含むため我々の目的に合致します。GLUEの論文のSection4にアノテーションの過程の記述と例をまとめています。』
一見データセット全体の説明の様にも見え、若干紛らわしいので先にデータを確認しましょう。

f:id:lib-arts:20190626152257p:plain
実際にダウンロードしたデータとして与えられるdiagnostic.tsvは上記の様な形式になっています。Sentence1とSentence2の二つがあり、何らかの対比になっているであろうことが推測できます。例えば最初の"The cat sat on the mat."と、"The cat did not sit on the mat."についてですが、否定形の対になっています。データセットからこれ以上読み取るのは逆に時間がかかりそうなので、次に参照している論文について確認していければと思います。

f:id:lib-arts:20190626153541p:plain

[1804.07461] GLUE: A Multi-Task Benchmark and Analysis Platform for Natural Language Understanding

論文を軽く読み流していくと、Section3でその他のタスクについて言及されており、Section4で"Diagnostic Dataset"の言及があることが確認できます。

f:id:lib-arts:20190626153613p:plain
GLUEとしてまとめる際に多くは既存のデータセットを用いている一方で、"Diagnostic Dataset"についてはある程度独自で定義している様です。

f:id:lib-arts:20190626172626p:plain
上記を確認すると"manually-curated test set"とあり、基本的には検証用のデータセットであることがわかります。

・Table2

f:id:lib-arts:20190626172642p:plain
・Table4

f:id:lib-arts:20190626172711p:plain

Table2やTable4に詳しい仕様などについて載っている様なのですが、概要の把握が目的のため、今回はここまでとします。


2. QNLI(Question NLI)に関して
2節ではQNLI(Question NLI)について取り扱います。まずはデータセットの出展ページを確認します。

f:id:lib-arts:20190626174232p:plain

The Stanford Question Answering Dataset
データの出展としては有名なデータセットのSQuAD(Stanford Question Answering Dataset)になっています。"What is SQuAD?"のところでQA(Question Answering)のデータセットで、クラウドワーカーによって作られたWikipedia記事を用いた質問と回答の対であると述べられています。
大体の概要はつかめたので早速中身を見ていきましょう。

f:id:lib-arts:20190626174938p:plain
上記の様に質問と回答文の対のデータセットとなっています。

f:id:lib-arts:20190626175707p:plain
また、SQuADのページではLeaderboardの機能も提供されており、現状(6/26執筆)のスコアは上記の様になっています。

上記の記事などでも言及しているBERTベースのものが上位に多いですが、つい一週間前の6/19に出されたXLNetも4位にランクインしています。

[1906.08237] XLNet: Generalized Autoregressive Pretraining for Language Understanding

BERTやXLNetがpre-trainedモデルであり、まだ出てからどちらも日が浅いことを鑑みると、この辺のスコアの更新は今後しばらく起こるのではないかと思われます。
データセットについて大体のイメージがつかめたので2節はここまでとします。


3. RTE(Recognizing Textual Entailment)
3節ではRTE(Recognizing Textual Entailment)について取り扱います。まずは参照ページを確認します。

f:id:lib-arts:20190626183054p:plain

Recognizing Textual Entailment - ACL Wiki

概要の把握のために下記で簡単に冒頭部の要約を行います。

要約:
Textual Entailment Recognitionは近年、Question Answering、Information Retrieval、Text Summarizationなどの多くの主要な意味推論の必要性を持つ総括的なタスクとして提案されてきた。このタスクは二つの文が与えられた際に片方のテキストがもう片方のテキストから派生しているかどうか認識することを必要とする。

大まかな目的が『片方のテキストがもう片方のテキストから派生しているかどうかを確認する』ことであるとわかり、上記で大体の概要がつかめたため、実際にデータを見ていきます。

f:id:lib-arts:20190626183900p:plain
データを確認すると上記の様になっています。大体のイメージがついたので3節はここまでとします。


4. まとめ
#4、#5で自然言語処理ベンチマークであるGLUEについて見てきました。GLUEは自然言語理解(NLU; Natural Language Understanding)とも言われる、言語理解に関するデータセットとなっています。
#6以降では近年物体検出(Object Detection)タスクなどの評価によく用いられる、COCO(Common Object in Context)について取り扱います。

公式Tutorialに学ぶPyTorch③(Training a Classifier)|DeepLearningの実装 #11

f:id:lib-arts:20190620151942p:plain

連載経緯は#1をご確認ください。

#1はKeras、#2~#7まではTensorFLow、#8からはPyTorchを取り扱っています。

#8ではPyTorchの概要やインストール、簡易実行について、#9はAutograd、#10ではNeural Networkについて取り扱いました。
https://lib-arts.hatenablog.com/entry/implement_dl8
https://lib-arts.hatenablog.com/entry/implement_dl9
https://lib-arts.hatenablog.com/entry/implement_dl10
#11では引き続き"Deep Learning with PyTorch: A 60 Minute Blitz"より"Training a Classifier"について取り扱います。

Training a Classifier — PyTorch Tutorials 1.1.0 documentation
以下目次になります。
1. What about data?
2. Training an image classifier
2-1. Loading and normalizing CIFAR10
2-2. Define a Convolutional Neural Network
2-3. Define a Loss function and optimizer
2-4. Train the network
2-5. Test the network on the test data
3. まとめ


1. Training a Classifierチュートリアルについて
1節ではTraining a Classifierチュートリアルの概要について話を進めていきます。

f:id:lib-arts:20190625154853p:plain

Training a Classifier — PyTorch Tutorials 1.1.0 documentation

概要を知るにあたり簡単に要約を行います。

要約:
ニューラルネットワークの定義をして、誤差関数を計算し、ネットワークの重みを更新するというのについては見てきました。

概要がつかめたところで次に気になるのは『データはどうなのか?(What about data?)』ということです。

一般的に画像やテキスト、音声、ビデオなどのデータを取り扱う際には、NumPy配列の形式でデータをロードする標準的なPythonのパッケージを用いることができます。その後に、torch.*Tensorの形式に配列を変換できます。

・画像データに対してはPillowやOpenCVなどのパッケージが便利です。
・音声データに対してはSciPyやlibrosaがあります。
・テキストデータに関してはデフォルトのPythonやCython、NLTKやSpaCyなどが便利です。

画像データに関しては、torchvisionというパッケージがあり、ImagenetやCIFAR10、MNISTなどの一般的なデータセットのデータローダーが実装されています。また画像の変換にあたってはtorchvision.datasetsやtorch.utils.data.DataLoaderなどがあります。

これにより重要度が低いテンプレ的なコードを書くことを減らすことができ、非常に便利になります。


また、下記のようにチュートリアルではCIFAR10のデータセットを用いるとされています。

f:id:lib-arts:20190625160101p:plain
CIFAR10は飛行機、自動車、鳥、猫、鹿、犬、蛙、馬、船、トラックの10クラスのデータを持つデータセットです。データサイズは32×32×3と、28×28のMNISTと同様のサイズとなっています。写真がベースの画像のため、RGBのカラーとなるように×3がされています。
"What about data?"について大体の概要はつかめたので、次の2節では"Training an image classifier"の内容を確認していきます。


2. Training an image classifier
2節では"Training an image classifier"の内容について確認していきます。

f:id:lib-arts:20190625160827p:plain
まずは簡単に冒頭部を訳します。

要約:
以下のステップを順番に踏みます。
1) torchvisionを用いてCIFAR10の学習用と検証用のデータセットの読み込みと正規化を行う。
2) 畳み込みニューラルネットワーク(CNN)を定義する。
3) 誤差関数を定義する。
4) 学習用データを用いてニューラルネットワークを学習させる。
5) テストデータを用いてニューラルネットワークの検証を行う。

以下2-1〜2-5でそれぞれについて確認していきます。


2-1. Loading and normalizing CIFAR10
2-1ではtorchvisionを用いたCIFAR10のデータロードに関して確認していきます。チュートリアルに従って動かすことで、下記のようにデータのロード(初回時でデータが手元にない時は自動でダウンロードを行ってくれます)を行うことができます。

f:id:lib-arts:20190625161646p:plain
実行結果が上記になっています。データセットが手元にない際は上記のようにダウンロード関連の表示もされるように実装されています。この際、"The output of torchvision datasets are PILImage images of range [0, 1]. We transform them to Tensors of normalized range [-1, 1]."とも言及されているように、PILImageの形式だと[0,1]の値におさまるのに対して、変換を行なって[-1,1]の範囲になるようにしているとされています。このことは下記のように画像を表示する際などに注意が必要です。

f:id:lib-arts:20190625162406p:plain

上記のようにすることで画像やラベルの確認を行うことができます。CIFAR10は32×32×3のデータセットのため、大きく表示するとところどころがぼやけてしまうことも把握しておくと良いかと思われます。
Loadingとnormalizingについては概ねつかめたので、次の2-2では"Define a Convolutional Neural Network"について取り扱います。


2-2. Define a Convolutional Neural Network
#10で取り扱ったNeural Networkとほぼ同様のため、ほとんどソースのみの記載となっています。入力のチャネルがカラー画像のため、3チャネルにしたと書かれています。

f:id:lib-arts:20190625162919p:plain
実行結果は上記のようになります(print文だけ付け加えておきました)。


2-3. Define a Loss function and optimizer

f:id:lib-arts:20190625163102p:plain
こちらもほぼ同様なので、上記を実行する形で良さそうです。


2-4. Train the network
"Train the network"では実際に学習を行なっていきます。

f:id:lib-arts:20190625163650p:plain

記載のコードの実行を行うことで、上記のような学習を行います。誤差関数(loss)が学習ステップが進むにつれてだんだん減っているのがわかります。ニューラルネットワークの学習によるパラメータの調整は勾配などの情報を用いて繰り返し(iteration)の計算でアップデートしていくので、optimizer.stepはfor文の中で実行していることに注意です。


2-5. Test the network on the test data
2-5ではテストデータを用いたニューラルネットワークの検証を行っています。まずは全体の正答率(accuracy)を下記のように計算しています。

f:id:lib-arts:20190625164314p:plain
また、それぞれのラベルにおける正答率も下記のように得ることができます。

f:id:lib-arts:20190625164329p:plain
このようにテストデータで検証することで、汎用性について確認することができます。また、カテゴリごとの正答率を出すことで、誤分類に関する差について考察することもできます。


3. まとめ
#11ではTraining a Classifierということで、#10で取り扱ったNeural Networkを用いながらPyTorchデータのロードに関して確認してきました。

Welcome to PyTorch Tutorials — PyTorch Tutorials 1.1.0 documentation

こちらをもって"Deep Learning with PyTorch: A 60 Minute Blitz"の確認は一旦ここまでとし、#12以降は上記のチュートリアルよりまた違った題材を取り扱えればと思います。

Ch_2 五つの競争要因 ー 利益をめぐる競争_前編|『[エッセンシャル版]マイケル・ポーターの競争戦略』読解メモ #3

f:id:lib-arts:20190625182650p:plain

本の選定などの経緯は#1にまとめました。

#1では「はじめに」で記述されていた、本の概要について、#2では第1章の内容として「競争 ー 正しい考え方」についてまとめました。

#3では第2章の内容として「五つの競争要因 ー 利益をめぐる競争」についてまとめます。第2章は少々長いため、#3では前半として「五つの競争要因を評価する」までを取り扱えればと思います。
以下、目次になります。
1. 冒頭部
2. 業界構造:より強力なツール
3. 五つの競争要因を評価する
4. 感想・まとめ

 

1. 冒頭部(簡単な要約)
第2章では第1章で述べられた、『「最高を目指す」ことが勝利の秘訣だ』という競争について最も広く信じられている誤解と同様に大きな誤解を取り上げる。『競争の主眼はライバルを負かすにあたり売上を奪うことではない』ということだ。売り上げを奪うことではなく、利益をどうあげるかが重要である。

・競争の主眼はライブあるを負かすことにあるのではない。肝心なのは利益をあげることだ。
図2-1で挙げられる様な五つの競争要因(ファイブフォース)が業界の構造を決定する。五つの競争要因とは下記である。

・既存の競合企業同士の競争
・買い手(業界にとっての顧客)の交渉力
サプライヤーの交渉力
・代替品の脅威
・新規参入者の脅威

上記の五つの競争要因を分析することで、業界がどの様に「機能」し、どの様にして価値を創造、共有しているかがわかる。これらの五つの要因が業界の収益性を決定する。業界構造と収益性の因果関係に関しては以下を意識しておくと良い。

1) 業界は表面的には異なる様に見えても、一皮むけばどの業界にも同じ力が作用している。
2) 業界の収益性を決定するのはその構造である。
3) 業界構造は驚くほど硬直的である。

 

2. 業界構造:より強力なツール(簡単な要約)
どんな組織においても、戦略を分析し構築するにあたっては、五つの競争要因のフレームワークが出発点となる。五つの競争要因のフレームワークは、企業が直面する競争に焦点をあて、卓越した業績の基準を与えてくれる。自社の業績を理解するには、まず業界の基本的な経済性を抑えておかねばならない。

・五つの競争要因のフレームワークは、企業が直面する競争に焦点をあて、卓越した業績の基準を与えてくれる。
五つの競争要因は、業界で何が起きているのか、特に競争にとって重要なものを教えてくれる。
主観が入りがちなSWOT分析に比べ、業界構造は競争の力学を理解するための極めて協力かつ客観的なツールである。体系的かつ事実と分析に立脚しているため、昔の課題の焼き直しになりにくく新しい発見をもたらすことが多い。競争の経済原理を明らかにすることで、外部の要因がいかにして自社の競争機会を阻み、あるいは生み出すかを浮き彫りにする。

 

3. 五つの競争要因を評価する(簡単な要約)
五つの競争要因のそれぞれが業界の収益性と結びついている。原則として、競争要因の影響が強ければ強いほど、価格やコストに対する圧力が高まり、既存企業にとっての業界の魅力度は薄れる。ちなみに五つの競争要因のフレームワークでは常に業界の既存企業の観点から構造分析を行うため、新規参入者はまず参入障壁を乗り越える必要がある。

 

・強力な買い手は値下げ圧力をかけたり、製品・サービスの向上を求めたりすることで、価値の取り分を増やす。
協力な買い手(業界にとっての顧客)は、影響力を使って値下げ圧力をかけてくる。買い手の力を評価するに当たっては、既存の流通チャネルが、特にチャネルがエンドユーザーの購買意思決定に影響を及ぼす場合にエンドユーザーに劣らず重要な場合がある。
価格感度が高い買い手は交渉力を行使してくる可能性がたか。買い手(法人、個人に関わらず)の価格感度は、業界の製品が次の様な場合に高くなる傾向にある。

・差別化されていない
・買い手の他のコストや予算と比較して、相対的に高価である
・買い手の製品・サービスの質に影響を及ぼさない

 

・強力なサプライヤーは、他社より高い価格を請求したり、有利な条件を要求したりすることで、業界の収益性を引き下げる。
強力なサプライヤーは、交渉力を行使して他社より高い価格を請求したり、有利な条件を要求してくる。サプライヤーの力を分析する際には、製品・サービスに投入するために購入した全てのインプット(投入物)をもれなく検討しなくてはならない。
サプライヤーと買い手の力の評価にあたっては、サプライヤーや買い手の力が大きくなるのはそれぞれ次の様な場合である。(サプライヤーと買い手は対称の関係にあるので、本の中では同時にまとめられています。)

・このサプライヤー/顧客を失えば業界が大きな損失を被る場合
・業界がサプライヤー/買い手を必要とする度合いが必要とされる度合いよりも高い場合
・スイッチングコストがサプライヤー/買い手に有利にはたらく場合
・差別化がサプライヤー/買い手の有利にはたらく場合
・買い手/サプライヤーが製造機能を垂直統合して、業界の製品を内省する可能性が実際にある場合

 

・代替品、つまり業界の製品と同じ基本的ニーズを異なる方法で満たす製品・サービスは、業界の収益性に上限を作る
代替品、つまり業界の製品と同じ基本的ニーズを異なる方法で満たす製品・サービスは業界の収益性に上限を作る。代替品は直接の競合品でないからこそ、予想外の場所から現れ、予測が難しく現れても気づかないことさえある。代替品は少し離れた場所からやってくるとき特に厄介な脅威になる。
代替品の脅威の評価としては、経済性に着目し、特に代替品が業界の製品よりもコストパフォーマンスの高いトレードオフになるかどうかを考える。また、スイッチングコストはだいたいにおいて重要な役割を果たす。代替品が普及するのは買い手が代替品に乗り換えるスイッチングコストが低い時である。


・参入障壁は、新たな生産能力をもたらそうとする新規参入者から、業界を保護する。
参入障壁には、市場に新たな生産能力をもたらしてシェアの獲得を狙う新規参入者から、業界を保護するはたらきがある。新規参入者の脅威は以下の二つの方法で業界の収益性を低下させる。

1) 価格に上限を作ること
2) 顧客をつなぎとめるために既存企業は投資を増やす必要に迫られること

新規参入の脅威については下記の視点を持って評価すると良い。

・生産量が増えると、単位あたりのコストが下がるか、規模の経済性がどの様な面ではたらくのか
・顧客がサプライヤーを変更すると、スイッチングコストが生じるか
・ある企業の製品の利用者が増えるにつれて、利用者にとっての製品の価値は高まるか(ネットワーク効果
・事業に新規参入するための初期投資はいくらか
・業界の既存企業には、規模とは別に、新規参入者に持ち得ない強みがあるか
・政府の政策は、新規参入を制限または阻止しているか
・新規参入を計画している企業は、既存企業からの反撃をどの様に予想しているか

 

・既存企業同士の競争が激しいと、値下げ競争によって業界の生み出した価値が顧客に流れたり、競争にまつわるコストがかさんで価値が散逸する。
既存企業同士の競争が激しいほど、業界の収益性は低下する。値下げ競争によって業界の生み出した価値が買い手に流れたり、競争に関するコストがかさんで価値が散逸することがある。
ポーターは競争が最も激しくなるのは次の場合だという。

・競合企業が乱立している中、規模と影響力においてほぼ互角である場合
・業界の成長が鈍い場合
・撤退障壁が高い場合
・競合企業が事業に対して道理に合わない執着を持っている場合

またポーターは、価格競争があらゆる競争形態の中で最もダメージが大きいと警告する。競争が価格に向かえば向かうほど、業界は最高を目指す競争にとらわれる。これが起きるのは次の様な場合である。

・製品・サービスの見分けがほとんどつかず、買い手のスイッチングコストが低いとき
・固定費が高く、限界費用が低いとき
・生産能力の大幅な拡充が必要になったとき
・製品が陳腐化しやすいとき


4. 感想・まとめ
第2章の前半は五つの競争要因という考え方を導入し、五つの競争要因についてそれぞれ説明を行なっています。
競争について色々とイメージがついて非常に興味深い内容でした。特に参考になったのが代替品の分析にあたって、コストパフォーマンスの高いトレードオフになるかとスイッチングコストがどうかという分析方法についてと、既存企業の競争において価格競争が競争にあたって最もダメージが大きいということです。
これらは意識から抜けがちですが、しっかりと考慮していく必要がありそうです。
#3では第2章の前半についてまとめたので、続く#4では第2章の後半についてまとめていきます。

公式Tutorialに学ぶPyTorch②(Neural Network)|DeepLearningの実装 #10

f:id:lib-arts:20190620151942p:plain

 

連載経緯は#1をご確認ください。

#1はKeras、#2~#7まではTensorFLow、#8からはPyTorchを取り扱っています。

#8ではPyTorchの概要やインストール、簡易実行について、#9はAutogradについて取り扱いました。
https://lib-arts.hatenablog.com/entry/implement_dl8
https://lib-arts.hatenablog.com/entry/implement_dl9
#10では引き続き"Deep Learning with PyTorch: A 60 Minute Blitz"より"Neural Network"について取り扱います。

Neural Networks — PyTorch Tutorials 1.1.0 documentation

以下目次になります。
1. Neural Networkチュートリアルについて
2. 詳細の内容
2-1. Define the network
2-2. Loss Function
2-3. Backprop
2-4. Update the weights
3. まとめ


1. Neural Networkチュートリアルについて
1節ではNeural Networkチュートリアルについて話を進めていきます。

f:id:lib-arts:20190620200734p:plain

Neural Networks — PyTorch Tutorials 1.1.0 documentation

まずはページの概要を知るにあたって冒頭部を要約します。
要約:『torch.nnパッケージを用いることでNeural Networkを構築することができます。nnはモデルの定義(define models)やその微分(differentiate)にあたってautogradに依存しています。nn.Moduleはlayerの情報や、出力(output)を返すforward(input)のメソッドが実装されています。例えば、図のような形式でデジタル画像を分類することができます。』

f:id:lib-arts:20190620201357p:plain
もう少し詳しく見ておく方が良さそうなので、上記も要約します。
要約:『図で説明されているのはシンプルなfeed-fowardネットワークで、何層かの計算を経て最終的にアウトプットを出力しています。ニューラルネットワークの学習手順(training procedure)は下記のようになります。
① 学習可能なパラメータ(重み)を持つニューラルネットワークを定義する
② 入力のデータセットに関して繰り返し(Iterate)処理を行う
③ ネットワークにおいて入力を計算する(process)
④ 出力結果がどのくらい正解と異なっているかを表す誤差関数(loss)を計算する
⑤ ネットワークのパラメータに対して誤差逆伝播を実行する
⑥ "weight = weight - learning_rate * gradient"のようなシンプルなアップデートのルールを用いてネットワークの重みをアップデートする』
これらはニューラルネットワークの学習にあたっての一連の流れについて言及されているので、さほど難しくなさそうです。
ここまでで、Neural Networkチュートリアルで取り扱う話については把握ができたので、2節で実際に詳細について見ていきます。


2. 詳細の内容
2-1. Define the network
2-1節ではDefine the networkについて取り扱っていきます。これは1節で言及したtraining procedureの①にあたっています。早速下記を動かしてみましょう。

f:id:lib-arts:20190620203540p:plain
(中略)

f:id:lib-arts:20190620203557p:plain
実行結果は下記のようになります。

f:id:lib-arts:20190620203642p:plain
ニューラルネットワークのクラスをtorch.nn.Moduleを継承して作成し、__init__関数のところで演算を定義しています。上記ではnetをprintすることで、演算の中身を確認することができます。

f:id:lib-arts:20190620203856p:plain
また、__init__関数のところで作成した演算を用いて、forwardメソッドにおいて入力から出力までの演算が記述されています。

f:id:lib-arts:20190620204518p:plain
上記のように補足説明があるのでこちらも簡単に要約します。
要約:『"forward"関数は必ず定義しなければならないですが、勾配を計算する"backward"関数はautogradを用いることで自動的に定義することができます。"forward"関数の中では任意のTensor演算を行うことができます。モデルの学習可能なパラメータはnet.parametersによって返すことができます。』

f:id:lib-arts:20190620205210p:plain
上記のように実行することで、モデルのパラメータの中身を確認することができます。

f:id:lib-arts:20190620205558p:plain
また、2-2節以降で使うので上記を実行しておきます。データはランダムに作成していますが、MNISTデータを意識して32×32のサイズのデータが生成されています。


2-2. Loss Function
2-2節ではLoss Function部分について確認していきます。

f:id:lib-arts:20190620205830p:plain

まずは冒頭を簡単に要約します。
要約:『誤差関数(loss function)は(予測値(output),実測値(target))のペアを入力とし、予測した値が目的となる実測の値とどのくらい異なっているかについて計算を行います。nnパッケージにはいくつかのloss functionについて実装されています。中でもシンプルな例としては、予測値とターゲットデータの間の平均二乗誤差を計算するnn.MSELossが挙げられます。』
実際にlossを計算すると下記のようになります。

f:id:lib-arts:20190620210513p:plain


2-3. Backprop
2-3節ではBackprop部分について確認を行なっていきます。

f:id:lib-arts:20190620210709p:plain
まずは冒頭を簡単に要約します。
要約:『誤差逆伝播(backpropagate the error)を行うにあたって我々がすべきことは"loss.backward()"を実行することです。』
loss.backward()を実際に動かすと下記のようになります。

f:id:lib-arts:20190620211217p:plain
ここではconv1層のバイアスの勾配を確認しています。


2-4. Update the weights
2-4節では"Update the weights"について確認を行います。

f:id:lib-arts:20190620211636p:plain
まずは簡単に説明部分を要約します。
要約:『実際に用いられる最もシンプルなパラメータ更新(update)のルールは確率的勾配降下法(SGD; Stochastic Gradient Descent)を用いています。図の3行のコードを書くことで、シンプルなPythonコードを用いて実装することができます。しかしながら、AdamやRMSPropなど様々な最適化手法を用いたい時もあると思われるので、"torch.optim"にそれらのメソッドについて実装しました。これらを用いることで、とてもシンプルに最適化の実装を行うことができます。』
実際にチュートリアルのコードを写したのが下記です。

f:id:lib-arts:20190620212157p:plain

上記ではoptimizer.step()を用いて一ステップ分のアップデートを行なっています。


3. まとめ
#10ではニューラルネットワークの実装についてのチュートリアルを確認しました。
#11では引き続き次のチュートリアルである"Training a Classifier"について取り扱います。

GLUE(General Language Understanding Evaluation) dataset①|機械学習の有名データセットや評価指標を確認する #4

f:id:lib-arts:20190623111710p:plain

機械学習の研究を読み解いたり実際に取り組んだりする中でデータセットや評価指標について知っておくと良いので、それらについての整理を行うにあたって連載を行なっていきます。
#1〜#3では2005年〜2012年頃の画像認識のデータセットとして有名なPASCAL VOCについて取り扱ってきました。

#4からは言語処理におけるデータセットとして近年用いられているGLUE(General Language Understanding Evaluation)について取り扱っていきます。

GLUE Benchmark

以下目次になります。
1. GLUEデータセットの概要
2. GLUE datasetの各種ベンチマークに関して & CoLA、QQAの詳細
3. まとめ


1. GLUEデータセットの概要
1節ではGLUEデータセットの概要について見ていきます。まずは公式のトップページの概要を簡単に要約します。

f:id:lib-arts:20190623112550p:plain

GLUE Benchmark

要約:
汎用的な言語処理理解評価のためのDataset(GLUE; General Language Understanding Evaluation)は、自然言語処理(NLP; Natural Language Processing)の学習、評価、分析のためのデータセット(resource)を集めたものです。特徴は下記となります。
・既存のデータセットを用い、多様なデータサイズやテキストのジャンル、難易度の度合いをカバーするために選りすぐられた9つの単文または単文のペアの言語理解タスク
自然言語において見られる言語の出現の様々な用法に対するモデルのパフォーマンスを評価、分析するために設計された判断用のdataset
ベンチマークにおけるパフォーマンスを計測するパブリックな順位表(leaderboard)であり、テストデータにおけるモデルのパフォーマンスを可視化することができるダッシュボード
GLUEベンチマークのフォーマットはモデルに依存しないので、任意のシステムを用いて単文や単文の対を処理してそれに対応する予測を生成することができ、試してみることができます。タスクにおけるベンチマークは学習されたパラメータの共有(parameter sharing)やその他の転移学習(transfer learning)を用いてタスク間で情報をシェアするモデルを好むように選別されています。GLUEの究極的なおく表は、自然言語理解のためのシステムに対する汎用的でロバストな発展における研究を主導していくことです。

GLUEの詳細については、下記の論文でも言及されています。

[1804.07461] GLUE: A Multi-Task Benchmark and Analysis Platform for Natural Language Understanding
自然言語理解(NLU; Natural Language Understanding)技術の向上のためのデータセットとして、従来のデータセットなどを組み合わせてベンチマークが作られています。
ここまでの内容でGLUEデータセットについては概ね把握できたので、2節ではそれぞれのベンチマークについて確認していきます。


2. GLUE datasetの各種ベンチマークに関して & CoLA、QQAの詳細
2節ではGLUE datasetのそれぞれのベンチマークについて確認していきます。

f:id:lib-arts:20190623115756p:plain

https://gluebenchmark.com/tasks
まず、上記のページにベンチマークの一覧についてまとまっています。こちらからデータをダウンロードしたりそれぞれの詳細を確認したりできます。More Infoではそれぞれのデータセットへのリンクが貼られているのですが、それぞれフォーマットが違うので目的次第では実際のデータを確認してしまう方が良いかもしれません。以下では実際にGLUEのページから落としてきたデータを確認していきます。

f:id:lib-arts:20190623123507p:plain
ダウンロードしたデータを解凍すると上記のようになります。まずはそれぞれの略称について確認していきます。

・CoLA(The Corpus of Linguistic Acceptability)
・diagnostic(Diagnostics Main)
・MNLI(MultiNLI Matched/Mismatched)
・MRPC(Microsoft Research Paraphrase Corpus)
・QNLI(Question NLI)
・QQP(Quora Question Pairs)
・RTE(Recognizing Textual Entailment)
・SNLI(Standord Natural Language Inference)
SST-2(The Stanford Sentiment Treebank)
STS-B(Semantic Textual Similarity Benchmark)
・WNLI(Winograd NLI)

SNLIがサイトのダッシュボードになかったことと、MNLIがMatchedとMismatchedの二つあることがイレギュラーでしたが、全体としてはそこまで相違がなかったので気にせず進めていければと思います。全て確認するのは大変なので、CoLA(The Corpus of Linguistic Acceptability)、QQP(Quora Question Pairs)の二つに絞って以下確認していきます。
まずCoLAに関してですが、公式ページは下記となります。

f:id:lib-arts:20190623162721p:plain

The Corpus of Linguistic Acceptability (CoLA)
概要の把握にあたって、Introductionを要約します。

要約:
CoLA(The Corpus of Linguistic Acceptability)はAuthorによって専門的にアノテーションされた23の言語学の公開情報からの10,657文で成り立っています。ページで公開されているのは、9,594文の学習用(開発用)のデータセットと1063文のテスト用のデータになります。

大体の内容はつかめたので次に実際のデータを確認してみます。train.tsvとtest.tsvをそれぞれ確認します。
・train.tsv

f:id:lib-arts:20190623164334p:plain
・test.tsv

f:id:lib-arts:20190623172021p:plain
上記を確認すると、データの概要について把握することができます。ここで気になるのがtrain.tsvの仕様ですが、こちらについては公式ページに説明があります。

f:id:lib-arts:20190623173156p:plain
第一列が文(sentence)の出典、第二列がacceptの判定とされています。別途ページなどにも記載のあるコンペティションなども確認した感じだと、主にこの第一列や第二列が重要な役割を果たしていそうだということがわかります。
CoLAについては大体がわかったので、次にQQP(Quara Question Pairs)について取り扱います。まず公式ページについては以下になります。

f:id:lib-arts:20190623173341p:plain
https://data.quora.com/First-Quora-Dataset-Release-Question-Pairs
Q&Aサイトとして有名なQuoraによって公開されているデータセットになります。下記がフォーマットとしてサイトに上がっているものになります。

f:id:lib-arts:20190623173927p:plain
ダウンロードしたデータも確認できればということで、train.tsv、test.tsvも確認してみます。
・train.tsv

f:id:lib-arts:20190623173941p:plain
・test.tsv

f:id:lib-arts:20190623173955p:plain
全体の概要と二つのデータセットについてつかめたので2節はここまでとします。


3. まとめ
#4では言語処理におけるデータセットを取り扱えればということで、GLUE(General Language Understanding Evaluation)について取り扱いました。
#4ではデータセットの中からCoLAとQQPについて確認しましたが、#5ではその他のデータセットについても確認していければと思います。

公式Tutorialに学ぶPyTorch①(Tutorialの全体像&Autograd)|DeepLearningの実装 #9

f:id:lib-arts:20190620151942p:plain

連載経緯は#1をご確認ください。

#1はKeras、#2~#7まではTensorFLow、#8からはPyTorchを取り扱っています。

#8ではPyTorchの概要やインストール、簡易実行について取り扱ったので、#9からは公式Tutorialの中身をより詳しく確認していければと思います。
以下目次になります。
1. PyTorchのチュートリアルの全体像
2. Autograd: Automatic Differentiationについて
3. まとめ


1. PyTorchのチュートリアルの全体像
1節ではまず手始めとしてPyTorchチュートリアルの全体像の把握を行います。

f:id:lib-arts:20190620171604p:plain

Welcome to PyTorch Tutorials — PyTorch Tutorials 1.1.0 documentation

PyTorchチュートリアルでは上記のように"Getting Started"として様々なコンテンツが用意されています。

なんとなくセオリーとして左上のものが良さそうということでまずは左上の"Deep Learning with PyTorch: A 60 Minute Blitz"を見ていきたいと思います。

f:id:lib-arts:20190620172813p:plain

Deep Learning with PyTorch: A 60 Minute Blitz — PyTorch Tutorials 1.1.0 documentation

"Deep Learning with PyTorch: A 60 Minute Blitz"の左上にある、"What is PyTorch?"につきましては前回確認ができたので、今回は右上の"Autograd: Automatic Differentiation"について2節で確認を行なっていきたいと思います。

Autograd: Automatic Differentiation — PyTorch Tutorials 1.1.0 documentation

また、"Deep Learning with PyTorch: A 60 Minute Blitz"以外のコンテンツを下記に列挙します。

Data Loading and Processing Tutorial
Learning PyTorch with Examples
Transfer Learning Tutorial
Deploying a Seq2Seq Model with the Hybrid Frontend
Saving and Loading Models
What is torch.nn really?

データのロード、転移学習、Seq2Seq、モデルの保存やロードなど、どれも"A 60 Minute Blitz"の後にやる方が良い内容に見えるので、一旦"Deep Learning with PyTorch: A 60 Minute Blitz"の内容を消化するのを目標にするのが良さそうです。
1節の目標である、PyTorchチュートリアルの全体像の把握は概ね行えたと思われるので、次の2節で"Autograd: Automatic Differentiation"について取り扱っていければと思います。


2. Autograd: Automatic Differentiationについて
2節ではAutogradについて取り扱います。実装を確認する前にまずは冒頭部で内容について見ていきます。

f:id:lib-arts:20190620174424p:plain

Autograd: Automatic Differentiation — PyTorch Tutorials 1.1.0 documentation

以下簡単に要約します。
要約:『PyTorchにおける全てのニューラルネットワークの中心はautogradパッケージです。まずはautogradについて確認し、最初のニューラルネットワークの学習に移っていきます。autogradパッケージは全てのTensorの操作に対し、自動微分(automatic differntiation)を可能にします。PyTorchはdefine-by-runのフレームワークで、誤差逆伝播(backprop)がコードがどのように動くかによって定義され、全ての繰り返し(iteration)でパラメータを学習していくことができます。いくつかの例を元にもっと詳しくこちらについて見ていきましょう。』

f:id:lib-arts:20190620175326p:plain
同様にその下のTensorの説明も重要そうなので、こちらも要約します。
要約:『"torch.Tensor"はパッケージの中核となるクラスです。クラスの属性(attribute)の"Tensor.requires"を"True"に設定することで、演算(operation)を追う(track)ことができます。計算が終わった後に"Tensor.backward()"を実行することで、全ての微分の値が自動的に計算されます。テンソル微分は"Tensor.grad"属性に蓄積されていきますが、detachメソッドでトラッキングをやめたりすることができます。また、"Tensor"クラスと同様に自動微分(autograd)の実装に重要なのが"Function"クラスです。』
説明が長くなるとイメージが湧きにくくなるので、一旦"Tensor"クラスに着目しながら話を進めていくということで良さそうです。まずは下記を実行してみましょう。

import torch

x = torch.ones(2, 2, requires_grad=True)
print(x)
print(type(x))

実行結果は下記のようになります。

f:id:lib-arts:20190620180651p:plain

type関数でxを見ることにより、<class 'torch.Tensor'>が出力され、xが"Tensor"クラスのインスタンスであることがわかります。またここで注意すべきは、概要の説明でも出てきた"requires_grad"にTrueを与えていることです。
次に、下記を実行しましょう。

y = x + 2
print(y)
print(y.grad_fn)

f:id:lib-arts:20190620181306p:plain
xを入力としてy=x+2として生成するyは属性"grad_fn"を持っています。これはyが演算の結果として生成されたためだとされています。

次にyにさらに演算を行いzを生成します。

z = y * y * 3
out = z.mean()

print(z, out)

f:id:lib-arts:20190620181704p:plain
yには3が入っているため、3×3×3で27がzの値となっています。そのため、z.mean()で平均を取っても27です。yと同様に演算の結果として生成されているため、属性としてgrad_fnを持っています。次に実際に微分の値を計算してみます。

out.backward()
print(x.grad)

f:id:lib-arts:20190620182947p:plain
結果としては全ての値が4.5となっています。結果の解釈としては、((x+2)^2)'=6(x+2)においてx=1を入れると18ですが、最後にz.mean()とすることで一つ一つのxの寄与が\frac{1}{4}となるので値が4.5になっています。
ここまででautogradについては概ね把握できたということで、今回はここまでとします。


3. まとめ
#9ではPyTorchチュートリアルの全体像の確認と、"Autograd: Automatic Differentiation"の確認を行いました。
#10では引き続き、"Deep Learning with PyTorch: A 60 Minute Blitz"よりNeural Networksについて取り扱えればと思います。