CRISP-DMをベースに考察するAI・機械学習・Data Scienceプロジェクトのマネジメント|電子テキスト紹介 #6

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

ブログの内容を元に電子テキストやその印刷版を、技術書典やnoteやboothなどのプラットフォームで販売を行なっているのですが、あまり内容について紹介してこなかったのでちょっとした宣伝も兼ねてご紹介していくシリーズです。
#1では「高校数学の演習から理解する、機械学習アルゴリズム」について、#2では「Python実装を通して学ぶ、統計モデリング入門」について、#3では「Deep Q-Network を通して学ぶ、強化学習超入門」について、#4では「DeepLearning 関連論文の読み方手引き」の上巻について、#5では簡易Pythonコードで学ぶ、実践的自然言語処理入門」についてご紹介しました。

高校数学の演習から理解する、機械学習アルゴリズム|電子テキスト紹介 #1 - Liberal Art’s diary

Python実装を通して学ぶ、統計モデリング入門|電子テキスト紹介 #2 - Liberal Art’s diary

Deep Q-Networkを通して学ぶ、強化学習超入門|電子テキスト紹介 #3 - Liberal Art’s diary

DeepLearning 関連論文の読み方手引き(上巻)|電子テキスト紹介 #4 - Liberal Art’s diary

簡易Pythonコードで学ぶ、実践的自然言語処理入門|電子テキスト紹介 #5 - Liberal Art’s diary
#6では、CRISP-DMをベースにプロジェクトマネジメントについての考察を行なった、「CRISP-DMをベースに考察するAI・機械学習・Data Scienceプロジェクトのマネジメント」についてご紹介します。

以下目次になります。
1. 作成にあたってのコンセプト
2. 簡単な内容の紹介
3. 今後のアップデート予定について
4. まとめ


1. 作成にあたってのコンセプト
テキスト作成にあたっての背景ですが、プロジェクトを進めていくにあたっての成功失敗はどのように考えるべきかというのを言語化したいというのがありました。経験則的に具体的には何ができれば成功で、何ができなければ失敗なのかは、単に技術的な話というわけでもないと思っています。
こういった話を言語化するに至っては、一般的かつ従来から使われているフレームワークをベースにすると良いということで、データマイニングに関してのプロジェクトマネジメントについて1990年年代後半に出てきたCRISP-DMをベースに考察を行うことにしました。
CRISP-DMはCRoss Industry Standard Process for Data Miningの略で、様々な業界に共通したデータマイニングの標準的な手順についてまとめたとされています。CRISP-DM自体は大分前からある考え方で、現在のビジネスシーンと違う点などもありますが、中途半端に新しい概念を抑えるよりはより本質を掴んだ方が良いため、むしろ時代背景含めてこちらをベースに考察する方が有意義なのではないかと考えました。
したがって、時代とともに変わらない本質的な内容について抑えつつ、不十分な点や近年の情勢も踏まえながらまとめられればということでこちらのテキストの作成を行いました。


2. 簡単な内容の紹介
2節では簡単に内容についてご紹介していきます。

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

まず第1章ではCRISP-DMの概要についてご紹介しています。CRISP-DMは6つのフェーズから成り立っており、それぞれのフェーズについて1-2節でご紹介しています。

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

1-2節については導入ということで、一般的に解説されている内容と同様のものをまとめるようにしました。また、1-3節では2015年にIBMが発表したASUM-DM(Analytics Solutions Unified Method for Data Mining)について簡単に概要だけ紹介しています。

f:id:lib-arts:20200310194528p:plain
次に第2章では、CRISP-DMの詳細ということで、2000年時にSPSSから出された下記のドキュメントを実際に読み進めています。

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

https://www.the-modeling-agency.com/crisp-dm.pdf

上記は全部で76ページあり、各フェーズについて通常の解説ページなどよりも詳しく記載されています。記述については多少冗長であったり、内容が古かったりもありますが、なるべく記載の文脈を元に読み解ければということで、文脈を極力そのまま残すようにしました。


上記は全部で76ページあり、各フェーズについて通常の解説ページなどよりも詳しく記載されています。記述については多少冗長であったり、内容が古かったりもありますが、なるべく記載の文脈を元に読み解ければということで、文脈を極力そのまま残すようにしました。

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

CRISP-DMにおいてはビジネスの理解(Business Understanding)というフェーズが非常に重要なのですが少々記載が甘い印象だったので、続く第3章では経営科学(Management Science)の内容のご紹介を行なっています。題材としては、比較的定量的な議論に馴染みやすいと思われる、ドラッカーのマネジメントと、ポーターの競争戦略を中心として取り扱いました。

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

第4章では第3章までの内容を踏まえて、プロジェクトの進行についてまとめています。4-1節と4-2節でそれぞれ第2章と第3章の内容についてまとめて、4-3節ではビジネスの理解の考察と、機械学習プロジェクトへの適用にあたっての考察についてまとめました。


3. 今後のアップデート予定について
今後のアップデートに関しては、具体的な例を出しながらケーススタディなども追加していければと思います。基本的な考え方については大体はまとめたと思うのですが、具体的な事例を元に考えられるようにする方が望ましいと考えています。
また、ビジネスの理解としてはドラッカーとポーターを中心にしましたが、下記のシリーズなどで取り扱ったビジネスフレームワークの内容も踏まえられると良いのかなと思っています。


4. まとめ
#6では、CRISP-DMをベースにプロジェクトマネジメントについての考察を行なった、「CRISP-DMをベースに考察するAI・機械学習・Data Scienceプロジェクトのマネジメント」についてご紹介しました。
#7では、言語処理における事前学習モデルとして近年注目を集めているBERTを取り扱った、「BERT・XLNet に学ぶ、言語処理における事前学習」についてご紹介します。

DGL Basics(グラフの作成やノードやエッジの読み書き)|DGL(Deep Graph Library)を動かす #3

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

 

当シリーズでは、DGL(Deep Graph Library)について確認していきます。

Overview of DGL — DGL 0.4.2 documentation

#1ではDGLのドキュメントを元にインストールと動作事例の確認について、#2では#1の題材における重要ポイントの詳細の確認について行いました。

#3ではドキュメントより、"DGL Basics"を読み進めていきます。

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

DGL Basics — DGL 0.4.2 documentation

上記が冒頭部の記載ですが、「このチュートリアルでは、グラフの作成やノードやエッジの読み書きについて学べる」とされています。詳しくは下記で確認していきます。
以下、目次になります。(チュートリアルの目次に準じています)
1. Creating a graphについて
2. Assigning a featureについて
3. Working with multigraphsについて
4. まとめ


1. Creating a graphについて
1節ではCreating a graphの項目について確認していきます。

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

上記では「DGLGraphの設計はNetworkXに基づいて行われており、NetworkXの形式からDGLGraphの形式に変換する」と記載されています。

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

記載のコードを実行すると上記のようになります。dgl.DGLGraph(g_nx)のところでNetworkXの形式をDGLGraphの形式に変換しています。また、g_dgl.to_networkx()のところでDGLGraphの形式をNetworkXの形式に変換を行なっています。また、それぞれの違いとしては、NetworkXのところでは無向グラフになっていたのが、DGLGraphの形式を経ることで有向グラフの形式に変わっていることが確認できます。NetworkXについては以前のシリーズでもまとめたので、下記も参考にしていただけたらと思います。

NetworkX カテゴリーの記事一覧 - Liberal Art’s diary

引き続きチュートリアルを読み進めます。

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

上記では、DGLのインターフェースを用いたグラフの作成について記載されています。add_nodesでノードの追加、add_edgesでエッジが追加できると抑えておけば一旦十分かと思います。

f:id:lib-arts:20200310170449p:plain
コードの実行結果は上記のようになります。チュートリアルがここまでなので1節はここまでとします。


2. Assigning a featureについて
2節ではAssigning a featureの項目について確認していきます。

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

上記では、「DGLGraph形式のノードやエッジに特徴量をわりあてることができる」と記載されています。また注意書きとして、PyTorchやMXNetの配列(tensors)の形式を用いており、このチュートリアルではPyTorchを用いているとされており、コードでもimport torch as thが記載されています。

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

コードの実行結果は上記のようになっています。基本的にPyTorchのtensorの形式がベースとなっており、様々な配列操作についての確認を行なっています。

f:id:lib-arts:20200310172200p:plain
上記ではノードに引き続き、エッジについて説明されています。

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

コードの実行結果は上記のようになります。


3. Working with multigraphsについて
一旦省略します。


4. まとめ
#3ではドキュメントより、"DGL Basics"について確認しました。
#4では同じくドキュメントより、"PageRank with DGL message passing"について確認します。

PageRank with DGL message passing — DGL 0.4.2 documentation

PointNet①(Abstract & Introduction)|3D Point CloudsとDeepLearning #6

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

[1912.12033] Deep Learning for 3D Point Clouds: A Survey

点群に対しての近年DeepLearningの導入について、#1〜#5では上記のSurveyを読み進めました。

Survey論文の確認①(Abstractと概要)|3D Point CloudsとDeepLearning #1 - Liberal Art’s diary

Survey論文の確認②(Introduction)|3D Point CloudsとDeepLearning #2 - Liberal Art’s diary

Survey論文の確認③(3D Shape Classification)|3D Point CloudsとDeepLearning #3 - Liberal Art’s diary

Survey論文の確認④(3D Object Detection and Tracking)|3D Point CloudsとDeepLearning #4 - Liberal Art’s diary

Survey論文の確認⑤(3D Point Cloud Segmentation)|3D Point CloudsとDeepLearning #5 - Liberal Art’s diary

#6以降ではSurveyで確認した内容を踏まえて、論文を確認していければと思います。まず手始めとして、多くの項目において参照されていたPointNet[2016]について確認していきます。
#6ではPointNetの論文のAbstractとIntroductionを確認し、概要についてつかみます。
以下目次になります。
1. Abstract
2. Introduction(Section1)
3. まとめ


1. Abstract
1節ではAbstractの内容を確認しながら概要について把握します。以下各文の和訳などを通して簡単に内容を確認します。

Point cloud is an important type of geometric data structure. Due to its irregular format, most researchers transform such data to regular 3D voxel grids or collections of images.

和訳:『点群(point cloud)は幾何学的なdataの構造の重要なパターンである。その不規則なフォーマットのために、数多くの研究者が点群のデータを規則的な3Dのvoxelや画像の集合として変換した。』
#1〜#5で取り扱ったSurveyでは手法をprojection-basedとpoint-basedに分けていましたが、上記はその中のproject-basedの手法について言及しています。

This, however, renders data unnecessarily voluminous and causes issues. In this paper, we design a novel type of neural network that directly consumes point clouds, which well respects the permutation invariance of points in the input.

和訳:『しかしながら、前述の手法(projection-basedの手法)ではdataを不必要なレベルで増大させ、問題を引き起こす。この論文では、新しいタイプのニューラルネットワークを設計し、点群を直接取り扱い、入力における点のpermutation invarianceをうまく取り扱っている。』
permutation invarianceについてはここの記載だけだと読み取れませんでしたが、全体の流れとしては、projection-basedの手法では計算量やデータのサイズなどが大きくなってしまうため、点群の入力をそのまま取り扱う、point-basedなアプローチの導入を試みたと抑えておけば十分だと思います。

Our network, named PointNet, provides a unified architecture for applications ranging from object classification, part segmentation, to scene semantic parsing. Though simple, PointNet is highly efficient and effective.

和訳:『PointNetと名付けた我々のネットワークは、物体の分類や部分的なセグメンテーションからscene semantic parsingまでの範囲の応用にあたっての統合的な構造を提供している。シンプルな構造である一方で、PointNetはとても効率的で効果的である。』
この研究においてのネットワークをPointNetと名付け、その応用性などについて言及しています。詳細については該当部分を読み進めると良さそうです。

Empirically, it shows strong performance on par or even better than state of the art. Theoretically, we provide analysis towards understanding of what the network has learnt and why the network is robust with respect to input perturbation and corruption.

和訳:『包括的に評価した際に、PointNetはSotAを上回るパフォーマンスを示した。理論的に、我々はネットワークが学んだ内容やなぜネットワークがロバストなのかの理解にあたって、入力のpertubationやcorruptionの点からの分析を提供している。』
上記ではPointNetのパフォーマンスにあたって言及しています。こちらについても該当部分を確認しつつ詳細について理解すると良さそうです。


2. Introduction(Section1)
2節ではSection1のIntroductionについて確認します。以下パラグラフ単位で確認していきます。

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

第一パラグラフでは、Abstractでも記載したように、projection-basedについてのアプローチについて紹介した上で、欠点として不必要なデータの増大(unnecessarily voluminous)を招くと言及しています。

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

f:id:lib-arts:20200311001100p:plain
第二パラグラフでは、projection-basedの欠点を受けてシンプルに取り扱えるpoint-basedなアプローチを考えるにあたって、PointNetを提案しています。複雑な処理が必要なprojection-basedとは異なり、PointNetはシンプルな構造であるとされています。

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

第三パラグラフでは、同じくPointNetについて言及しています。点群の入力としては3Dの座標(three coordinates)として(x,y,z)で表現されています。
第四〜第七パラグラフは詳細部分を確認した方が良さそうなため、ここでは省略します。

f:id:lib-arts:20200311001842p:plain
第八パラグラフでは、論文の主要なcontributionsについてまとめられています。それぞれネットワーク構造、応用タスクに対する学習方法、包括的な分析、特徴量の可視化などが紹介されています。


3. まとめ
#6ではPointNetの論文のAbstractとIntroductionを確認し、概要についてつかみました。
#7ではSection2のRelated Work以降の内容について、重要箇所にフォーカスして確認していきます。

インストールとグラフ畳み込みを用いた学習の動作例の確認②|DGL(Deep Graph Library)を動かす #2

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

当シリーズでは、DGL(Deep Graph Library)について確認していきます。

Overview of DGL — DGL 0.4.2 documentation

#1ではDGLのドキュメントを元に、インストールと動作事例の確認を行いました。

インストールとグラフ畳み込みを用いた学習の動作例の確認①|DGL(Deep Graph Library)を動かす #1 - Liberal Art’s diary

動作事例の確認にあたって、#1では詳細について流す形となったため、#2では#1の題材における重要ポイントについて詳細を確認していきます。

DGL at a Glance — DGL 0.4.2 documentation

以下、目次になります。
1. Define a Graph Convolutional Network(Step3)について
2. Train then visualize(Step3)について
3. まとめ


1. Define a Graph Convolutional Network(Step3)について
1節ではStep3の"Define a Graph Convolutional Network"について詳しく確認を行っていきます。

f:id:lib-arts:20200309214655p:plain
まず上記の記載では、ノードの分類(node classification)を行うにあたってGCN(Graph Convolutional Network)を用いたとされています。より詳細は論文を参照していますが、簡単な定義についてはまとめられているのでそちらを確認していきます。まず、l層目におけるi番目のnodeをv_{i}^{l}と定義し、そのノードの特徴ベクトル(feature vector)をh_{i}^{l}としています。次に、v_{i}^{l}に隣接するnodeをu_{i}^{l}とし、次の層のv_{i}^{l+1}の表現を得るにあたってu_{i}^{l}を集めるとされています。この後に、非線形の活性化関数を用いたアフィン変換(affine transformation)を行うとされています。

f:id:lib-arts:20200309215539p:plain
次に、GCNの図示について行われています。h_{1}^{new}=f(\Sigma_{j=1}^{5} h_{j})は前述の内容の式化を行っていると考えるとわかりやすいと思います。また、ここで定義を行っているGCNをメッセージ伝達の枠組み(message-passing paradigm)で考えるとしています。

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

上記では実装が記載されています。コメントを参照しながらGCNLayerクラスのforwardメソッドを確認すると、g.ndataでnodeの特徴量を設定し、g.sendでnodeからedgeに情報を送り、g.recvで全てのノードに情報を集め、g.ndata.popでnodeの特徴量を取得し、最後に線形変換を行っていることがわかります。

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

次に上記では、PyTorchのような書き方で先ほどのGCNLayerを利用してネットワークを実装しています。__init__でgcn1とgcn2を定義し、forwardでネットワーク構造全体を定義しています。

大体の流れが掴めたのと基本的にはPyTorchベースの実装となっていることがわかりましたが、具体的な処理を確認するにあたってはdgl.DGLGraph()のsendやrecvなどはもう少し詳細について確認する必要がありそうです。とはいえページ記載の内容については把握できたので今回はここまでとします。


2. Train then visualize(Step5)について
2節ではStep5の"Train then visualize"について詳しく確認を行っていきます。

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

まず上記では学習について一通り行っています。PyTorchの基本的な記法にしたがって、net(G,inputs)でこれまで定義してきた内容に沿ったネットワークの出力を取得し、logitsに代入しています。logitsに対し、softmax関数を適用し、logpを得ています。そしてlogpと正解データであるlabelsを比較し、lossを作成しています。これに基づき、誤差逆伝播や学習を行っています。Step3ではGraph Neural Network特有の処理がいくつか見られましたが、Step5は基本的なPyTorchの記述にしたがっています。

f:id:lib-arts:20200309223057p:plain
また、可視化については基本的にはNetworkX(さらに裏側ではmatplotlibを使用)を用いているようです。


3. まとめ
#2では#1の題材における重要ポイントについて詳細を確認を行いました。
#3では以下を参考にDGL(Deep Graph Library)の基本的な内容について抑えていきます。

DGL Basics — DGL 0.4.2 documentation

簡易Pythonコードで学ぶ、実践的自然言語処理入門|電子テキスト紹介 #5

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

当ブログの内容を元に電子テキストやその印刷版を、技術書典やnoteやboothなどのプラットフォームで販売を行なっているのですが、あまり内容について紹介してこなかったのでちょっとした宣伝も兼ねてご紹介していくシリーズです。
#1では「高校数学の演習から理解する、機械学習アルゴリズム」について、#2では「Python実装を通して学ぶ、統計モデリング入門」について、#3では「Deep Q-Network を通して学ぶ、強化学習超入門」について、#4では「DeepLearning 関連論文の読み方手引き」の上巻についてご紹介しました。

高校数学の演習から理解する、機械学習アルゴリズム|電子テキスト紹介 #1 - Liberal Art’s diary

Python実装を通して学ぶ、統計モデリング入門|電子テキスト紹介 #2 - Liberal Art’s diary

Deep Q-Networkを通して学ぶ、強化学習超入門|電子テキスト紹介 #3 - Liberal Art’s diary

DeepLearning 関連論文の読み方手引き(上巻)|電子テキスト紹介 #4 - Liberal Art’s diary

#5では、実務で用いやすい言語処理についてまとめた、「簡易Pythonコードで学ぶ、実践的自然言語処理入門」についてご紹介します。

以下目次になります。
1. 作成にあたってのコンセプト
2. 簡単な内容の紹介
3. 今後のアップデート予定について
4. まとめ


1. 作成にあたってのコンセプト
テキストを作成するに至った背景やテキストのコンセプトですが、言語処理って難しそうに見える割に用いる考え方を選べば意外と難しくないので、そういったことを掴んでいただけたらということでまとめました。
なるべく簡単に理解できて、実務ですぐに用いることができる内容を中心にまとめているので、費用対効果の高い内容になっていると思います。
実際に動かして理解できるように、Pythonの実装を元に解説を行なっており、仕組みの理解と実装の対応がなるべくつきやすいようにまとめています。

GitHub - lib-arts/nlp_tutorial

本文中で記載した実装については上記のGitHubにJupyterファイルを置いておきましたので、Janome、scikit-learn、gensim、NetworkXなどの関連のモジュールこちらをダウンロードして実行するだけで簡単に試すことができます。


2. 簡単な内容の紹介
2節では簡単に内容についてご紹介していきます。

f:id:lib-arts:20200310000454p:plain
まず第1章では序論として、機械学習の概要や言語処理のベースになるBag of Wordsについての解説を行なった上で、PythonJanomeの環境構築についてまとめています。

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

特に上記のBag of Wordsは重要のため、実装を添えて実際に動かしながら理解できるようにしています。

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

第2章以降の各章のつながりについては上記のようになっています。要素技術と応用タスクを分けて理解しておく方が応用がしやすいので、上記のように全体の関係性を図示しました。

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

第2章では上記のように、言語処理の手法を日本語に適用するにあたって必要となる、形態素解析について解説しています。また、Pythonにおける形態素解析を気軽に行うことのできるライブラリとしてJanomeを紹介しており、Janomeを用いたコードの実行を行うことができるようにしています。

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

上記のようにJanomeの実行結果やそれに伴う取り扱いについても解説を行なっています。

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

第3章では、tf-idfと特徴語の抽出について取り扱っています。特徴語抽出はアウトプットがわかりやすいため、多くのシーンで非常に利用しやすいです。近年ではword_cloudというライブラリを用いた可視化なども可能になっています。

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

また、上記がscikit-learnを用いたtf-idfの実装です。行列の表現形式としてNumPyではなくscipy.sparseを用いているので、その点などもご紹介しています。

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

f:id:lib-arts:20200310003339p:plain
第4章では、Word2vecについて取り扱っています。Word2vecの考え方については近年のBERTを中心とするDeepLearningを用いた言語処理においても非常に大きな役割を果たしています。そのため、近年のトレンドを抑えるという意味でもWord2vecを理解するというのは非常に重要になっています。

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

第5章では、Cos類似度と文書分類について取り扱っています。文書の分類と聞くと難しそうな印象を受けるかもしれませんが、意外と単語に着目するだけでできるケースも多いというのをこちらを通して掴んでいただけたらと思っています。

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

上記の計算式で表すことのできるCos類似度は2つのベクトルの類似度を計算するのにも用いることができるため、そちらをBag of Wordsに応用して文書分類タスクを解いています。

f:id:lib-arts:20200310004353p:plain
第6章では、極性辞書を用いたネガポジ分析について取り扱っています。ネガポジ分析は極性分析(Sentiment Analysis)に含まれると考えて良さそうですが、文章からネガティブとポジティブを読み取るというタスクです。難しそうに見えますが、下記のような極性辞書を用いることで比較的簡易的に実装することができます。

f:id:lib-arts:20200310005105p:plain
極性辞書は上記のように、形容詞を中心に単語のスコアをつけた辞書のことを指します。テキストの中では、公開されている極性辞書を元に簡易的なネガポジ判定を行えるような実装としています。

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

第7章では、言語処理におけるネットワーク分析についてグラフ理論と絡めながら解説を行なっています。具体的な題材としては、第5章で取り扱った文書分類の結果の可視化を行なっています。

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

文書の関連性を上記のようにグラフで可視化を行なっています。


3. 今後のアップデート予定について
今後のアップデートに関しては、word_cloudについての追加を検討しています。word_cloudは仕組み自体はtf-idfなどをベースにするので単純ですが、見栄え良く可視化をするというのはプロジェクトを円滑に進める上で非常に重要なポイントなので、学んでおいて損はないトピックだと思います。
他にもLDAなどのトピックモデリングについては少々難解なため、メインで取り扱わないものの簡単にだけご紹介できると良いのではと思っています。


4. まとめ
#5では、実務で用いやすい言語処理についてまとめた、「簡易Pythonコードで学ぶ、実践的自然言語処理入門」についてご紹介しました。
#6では、データマイニングのプロジェクトマネジメントについて取り扱った手法であるCRISP-DMを中心にプロジェクトマネジメントについて考察を行う、「CRISP-DMをベースに考察するAI・機械学習・Data Scienceプロジェクトのマネジメント」についてご紹介します。

インストールとグラフ畳み込みを用いた学習の動作例の確認①|DGL(Deep Graph Library)を動かす #1

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

別のシリーズでGraph Neural Networkのサーベイを元にした研究トレンドの把握を行いました。

上記シリーズを元に大体の概要は掴めたのですが、実装についても確認してみれればということで、Section8のApplicationsで取り扱われていたDGL(Deep Graph Library)について確認していきます。

サーベイ論文の確認と追加調査⑨(Applications)|Graph Neural Networkの研究を俯瞰する #9 - Liberal Art’s diary

今回は下記のDGLのドキュメントを元に、インストールと動作事例の確認を行います。

Overview of DGL — DGL 0.4.2 documentation

以下、目次になります。
1. DGLのインストール
2. 動作事例の確認(Graph Convolutional Networkの学習)
3. まとめ


1. DGLのインストール
1節ではまずライブラリのDGL(Deep Graph Library)のインストールを行います。

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

Install DGL — DGL 0.4.2 documentation

上記に記載がありますが、簡単な動作確認を行うレベルであれば、pipを使ってCPU用のDGLをインストールします。

$ pip install dgl

上記を実行することでインストールを行うことができます。

$ pip freeze | grep dgl
dgl==0.4.2

またインストールの確認としては、上記のように"pip freeze | grep dgl"を実行した際に、dglのバージョンが出力されたら、インストールができています。


2. 動作事例の確認(Graph Convolutional Networkの学習)
2節ではGraph Convolutional Networkの学習を行う動作事例の確認を行います。

DGL at a Glance — DGL 0.4.2 documentation

具体的には上記に沿って実行していきます。

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

まず問題設定について確認しますが、上記に記載されています。karateクラブの34名のメンバーのソーシャルネットワークを可視化したものであるとされています。クラブのソーシャルネットワークは大きく二つのコミュニティに分けることができるとされており、片方が講師(instructor; node0)でもう片方がクラブの代表(club president; node33)であるとされています。上記の図では二つのコミュニティに分けられていますが、タスクはそれぞれのノードがnode0のコミュニティに属するか、node33のコミュニティに属するかを学習して予測することであるとされています。

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

Step1としてはグラフの作成(Creating Graph)について記載されています。ここではグラフにノードとエッジを追加することで問題設定にあるkarateクラブの34名のソーシャルネットワークを作成しています。

f:id:lib-arts:20200307175646p:plain
この際にグラフの属性を出力したのが上記ですが、78個のエッジを追加しているのにも関わらず156エッジとなっているのは、無向グラフ(undirected graph)においては0->1と1->0を同一に見なすためです。隣接行列が常に対称となることからもわかる通り、1つの向きのないエッジの追加は2つの向きのあるエッジの追加と対応していると考えることができます。

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

また、可視化を実行すると上記のようになります。一番最初の問題設定の図と同様になっていますが、色がついていないことがポイントです。

f:id:lib-arts:20200307180556p:plain
Step2では、ノードやエッジに特徴量(features)の付与を行なっています。ここではone-hotベクトルの形式で特徴量を与えているとされています。

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

特徴量の追加について記載のコードを実行すると上記のようになります。上記では、それぞれのノードやエッジに対応するインデックスの位置の数字が1で、他が0になっていることが確認できます。

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

Step3ではGCN(Graph Convolutional Network)の定義について記述されています。

[1609.02907] Semi-Supervised Classification with Graph Convolutional Networks
詳しくは上記の論文の手法をベースにしたとされています。全体の流れを優先したいため、論文と実装の中身については#2で確認するものとします。

f:id:lib-arts:20200307181739p:plain
Step4ではデータの用意と初期化を行なっています。

f:id:lib-arts:20200307184200p:plain
Step5では学習と可視化について記載されています。基本的にはPyTorchのモデルと同様の学習を行うとされています。

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

コードを元に実行すると上記のように実行ができます。loss.backward()で誤差逆伝播を行い、optimizer.stepで学習を行うということはPyTorchの用法とさほど変わりないようです。

f:id:lib-arts:20200307184558g:plain

また、学習結果の可視化としては上記のようにアニメーションで可視化を行なっています。


3. まとめ
#1ではDGL(Deep Graph Library)のインストールとグラフ畳み込みを用いた簡単な学習のコードの実行を行いました。
#1は全体の流れを掴むのを中心としたため#2では、今回取り扱ったコードの詳細をもう少し詳しく確認していきます。

「詭弁」と「論理学」③|ロジカルシンキングを学ぶ #3

f:id:lib-arts:20200301203354g:plain

連載の経緯は#1に記しました。

演繹的な論理学から入ると導入としては抽象的で難しいものになりそうなため、#1では「詭弁」と「論理学」ということで、ロジカルシンキングがうまくいっていない例を見つつ、それを論理学的に整理を行いました。
Wikipediaに「詭弁」の例として29例が挙げられていましたので、#1では9例、#2では12例を確認しました。

「詭弁」と「論理学」②|ロジカルシンキングを学ぶ #2 - Liberal Art’s diary

#3では8例を見た上で、論理学的にそれぞれを整理し、回避するにはどうしたら良いかについても議論ができればと思います。

詭弁 - Wikipedia

以下目次になります。
1. 「詭弁」の具体例③
2. 論理学に基づいた「詭弁」の整理③
3. 論理的に「詭弁」を回避するには
4. まとめ


1. 「詭弁」の具体例③
1節では#1、#2に引き続き、「詭弁」の具体例についてご紹介していきます。Wikipediaには29の具体例が挙げられているので、今回は22番目〜29番目の8例について取り扱います。

f:id:lib-arts:20200305214700p:plain
22例目としては、権威論証(ad verecundiam)が紹介されています。「権威」は正しさとイコールではないので注意が必要です。また、「その分野における権威」ならまだしも、「その分野に詳しくない有名人」の言葉を「権威」として応用されることもあり、この辺は非常に注意が必要です。逆に「権威」を用いると良いのが「言葉の定義」などについてはありだと思います。「言葉の定義」は自分で行っても良いですが、主張に直接関係なければ他人の言葉を借りる方が「言葉の定義」についての議論は起きづらくなるので望ましいと思います。

f:id:lib-arts:20200305214753p:plain
23例目としては、論点回避(Begging the question)が紹介されています。こちらは論理の前提を曖昧なまま結論を主張しているとされています。

f:id:lib-arts:20200305214827p:plain
24例目としては、論点先取(petitio principii)が紹介されています。論点先取は論点回避の一つとされており、前提と結論に同じ情報を用いているとされています。「勤勉な人だから仕事を怠けるはずがない」というのはそもそも「勤勉な人」であるという前提をおいていることに注意が必要です。

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

25例目としては、循環論証(circular reasoning)が紹介されています。循環論証は論点先取の一つとされており、「前提が結論の根拠となり、結論が前提の根拠となる」形式の推論を循環論証としています。「詭弁だから間違っている」は「間違っているから詭弁」をその後に続けることができるので、論理が循環してしまいます。

f:id:lib-arts:20200305221155p:plain
26例目としては、含みのある言葉(loaded language)が紹介されています。こちらも論点先取の一つとされており、「論理性ではなく語調に頼った主張」であるとされています。三つの例の中で厄介なのがCで、AとBはなんとなく違うのではという印象を含んでいる一方で、Cは注意していないと気づかない可能性があります。「大人としての振る舞いが必要」と言えばそれっぽい客観的で冷静な批判に聞こえてしまいます。

f:id:lib-arts:20200305221225p:plain
27例目としては、脅迫論証(ad baculum)が紹介されています。「誤った二分法」、「未知論証」、「権威論証」、「多数論証」なども絡んでくる可能性があるとされています。立場の弱い相手に使うのは良くない一方で、「外交」や「交渉」など対等な立場が前提となるやりとりの際などはこの「脅迫論証」のような論法も時には必要だと思います。ZOPAやBATNAなどの交渉の用語もこの論法と関連づけて抑えておくと良いと思います。

f:id:lib-arts:20200305221312p:plain
28例目としては、多数論証(ad populum)が紹介されています。「多数派は必ず正しい」という誤った前提を用いる論法となっています。

f:id:lib-arts:20200305221340p:plain
29例目としては、多重尋問(complex question)が紹介されています。こちらも「誤った二分法」と同様にYes/Noのどちらで答えても回答者が不利になるようになっています。小説などでは尋問を行う際などにこの辺は使われているようです(実際にはこのような論法は行われていないと願いたいです)。

 

2. 論理学に基づいた「詭弁」の整理③
今回は「前提に未証明の命題を入れる」関連の論法が多い内容となっていました。下記に今回取り扱った例の分類について簡単にまとめておきます。

・前提に未証明の命題を入れる(論点回避)
-> 「X->Y」の論理を行うにあたって、YではなくXにも不確かな命題を入れるという論法です。23〜26はそれぞれ論点回避とされています。

・論点のすりかえ
-> #2で出て来た論点のすりかえですが今回も用いられています。22、28がその例となっています。

・誤った二分法
-> 27と29は誤った二分法と考えておくと良さそうです。

今回は「X->Y」のXに命題を入れる論点回避についての例が多くなっていました。特に日本ではコンテキスト(前提)を共有する文化が強いので、日本人はこの手の論理には弱いかもしれません。通じない相手がいたとしても「コミュニケーション能力がない」と言うことで論点をすりかえるケースが多いようです。

 

3. 論理的に「詭弁」を回避するには
まず、#1〜#3でまとめた29例について改めて整理を行います。#1〜#3で行った分類とは若干異なりますが、こちらが全体を通してのまとめとなります。(厳密さよりも把握しやすさを優先しています)

◆ 命題(仮定と結論)についての論理や集合論
・「逆」、「裏」、「否定」などの利用
-> 1、2、9、11
・部分集合のごまかし
-> 3、7
・誤った二分法
-> 10、27、29

◆ 論点のすりかえ
・論じるポイントをずらす
-> 12〜16、19〜22、28
・仮定に命題を組み込む(論点回避)
-> 23〜26

◆ その他
帰納法を証明せずに結論として用いる
-> 4、5、6
・言葉の定義
-> 7、8
・「である」と「べきである」
-> 17、18

上記を見ると、大体の「詭弁」は論理学的な手法における論じ方そのものを変更したり、「X->Y」において論点をぼかしたり、Xに命題を入れたりのパターンで話が進んでいます。したがって、集合論とそれに絡めて命題、逆、裏、対偶、否定、必要条件、十分条件などを抑えておくことで、大体見抜くことができると思います。

また、確実に見分ける質問としては、「一言で表すとどういう事になりますか」というのが便利です。「詭弁」は表現の複雑さで相手を騙す論法のため、逆に考えれば「一言で言うと」見抜くことが可能になってしまいます。この際にさらに長々と話す相手がいたら一切信用すべきではないと思います。重要なのはとにかく意味のない形容詞を抜き、主語と述語のみにして話の理解を試みるのが良いかと思います。

他にも便利な表現は「結論はなんでしょうか」なども便利です。大概の物事は「結論 ↔︎ 過程」、「全体 ↔︎ 部分」、「抽象 ↔︎ 具体」で成り立っています。ですので、こういった質問を行うことで話をシンプルにするのも良いです。

 

4. まとめ
#3では「詭弁」についての8例を見た上で、論理学的にそれぞれを整理し、回避するにはどうしたら良いかについても議論を行いました。とにかく冷静に話をシンプルにしようと試みるのが良いと思います。