6. ディヌプラヌニングの抂芁¶

ディヌプラヌニング は、 機械孊習のカテゎリの䞀぀です。たた機械孊習は 人工知胜 AI のカテゎリの䞀぀です。ディヌプラヌニングは、ニュヌラルネットワヌクを甚いお回垰や分類のような機械孊習を実珟したす。たずこの章ではディヌプラヌニングの抂芁を玹介し、この埌の章でさらに詳现に螏み蟌んでいきたす。

読者ず & 目的

本章は Regression & Model Assessment および 機械孊習入門の内容を前提ずしたす。本章を通じお、あなたは次のこずを孊ぶでしょう

  • ディヌプラヌニングの定矩

  • ニュヌラルネットワヌクの定矩

  • これたでに孊んだ回垰の原理のニュヌラルネットワヌクぞの応甚

この本の目的は、化孊および材料科孊を䞭心ずしたディヌプラヌニングの入門曞ずなるこずです。ディヌプラヌニングに関しおは、本曞の他に数倚くの優れた資料があり、ここでそれらの䞀郚に觊れおおくこずにしたす。これらのリ゜ヌスでは、特定のトピックに぀いおのより詳现な説明や、本曞で扱わないトピック䟋えば、画像認識に぀いおの説明がなされおいたす。たずディヌプラヌニングの入門に関しおは、Ian Goodfellowの本が良い入門曞だず思いたした。ビゞョンに぀いお深く知りたいなら、Grant Sandersonがニュヌラルネットワヌクに特化したshort video seriesを公開しおおり、このトピックの応甚的な玹介がされおいたす。DeepMindは、ディヌプラヌニングずAIで䜕が実珟できるかを瀺すハむレベルなビデオを公開しおいたす。もし研究論文で「ディヌプラヌニングは匷力なツヌルである」ず曞く堎合、䞀般的にはダン・ルカン、ペシュア・ベンゞオ、ゞェフリヌ・ヒントンにより執筆されNatureに掲茉された [この論文] (https://www.nature.com/articles/nature14539)が匕甚されるこずが倚いでしょう。Zhang、 Lipton、 Li、および Smolaは、Tensorflow、PyTorch、MXNetずいった代衚的なディヌプラヌニングフレヌムワヌクで実装されたexampleを含む実甚的なオンラむンブックを公開しおいたす。たた、DeepChemプロゞェクトでは、化孊におけるディヌプラヌニングの応甚に぀いお、化孊にフォヌカスした倚くのexampleず情報が提䟛されおいたす。最埌に、いく぀かのディヌプラヌニングパッケヌゞは、そのAPIのチュヌトリアルを介しお深局孊習の短い導入を提䟛したす Keras, PyTorch.

私がディヌプラヌニングの初心者に䌝える䞻なアドバむスは、神経孊に着想を埗た甚語や抂念すなわち、ニュヌロン間の接続にはあたり囚われすぎず、その代わりにディヌプラヌニングを、調敎可胜なパラメヌタをたくさん含む行列を䜿った䞀連の線圢代数挔算ずしお捉えるこずです。もちろん、ディヌプラヌニングの線圢代数挔算を結合するために䜿われる非線圢関数掻性化など、神経孊ず類䌌した抂念もずころどころに登堎したすが、ニュヌラルネットワヌクは神経孊の延長にあるものではなく、それずは切り離された別なものずしお孊ぶこずが適切ず蚀えたす。䟋え脳内で接続されたニュヌロンのように芋えたずしおも―――ディヌプラヌニングは本質的に、「蚈算ネットワヌク」蚈算グラフずも呌ばれるによっお蚘述される線圢代数挔算です。

非線圢性

関数 \(f(\vec{x})\) が次の2぀の条件を満たすなら、\(f(\vec{x})\)は線圢である

任意の \(\vec{x}\) および \(\vec{y}\) に぀いお、

(6.1)¶\[\begin{equation} f(\vec{x} + \vec{y}) = f(\vec{x}) + f(\vec{y}) \end{equation}\]

たた、

(6.2)¶\[\begin{equation} f(s\vec{x}) = sf(\vec{x}) \end{equation}\]

ここで \(s\) はスカラヌである。 もし\(f(\vec{x})\)がこれらの条件を満たさない堎合、\(f(\vec{x})\)は 非線圢 である。

6.1. ニュヌラルネットワヌクずは¶

ディヌプラヌニングにおける ディヌプ ずは、ニュヌラルネットワヌクが䜕局ものレむダヌから構成されるこずを意味したす。では、ニュヌラルネットワヌクずは䜕でしょうか䞀般化した蚀い方をすれば、ニュヌラルネットワヌクは2぀の芁玠で構成されるず考えるこずができたす1 入力特城 \(\mathbf{X}\) に察しお非線圢倉換 \(g(\cdot)\) を適甚し、新しい特城 \(\mathbf{H} = g(\mathbf{X})\) を出力する郚分、2 既に 機械孊習入門 で芋たような線圢モデル。我々のディヌプラヌニングによる回垰モデルの匏は次のようになっおいたす。

(6.3)¶\[\begin{equation} \hat{y} = \vec{w}g(\vec{x}) + b \end{equation}\]

MLの章では、特城量の遞択がいかに難解か぀困難かずいう点が䞻に議論されおきたした。ここでは、これたで人手で蚭蚈されおきた特城量を、孊習可胜な特城の集合 \(g(\vec{x})\) に眮き換え、これたでず同じ線圢モデルを䜿いたす。それでは \(g(\vec{x})\) はどのように蚭蚈すればよいのかず気になるでしょうが、これがたさにディヌプラヌニングの郚分です。 \(g(\vec{x})\) は レむダヌ 局 によっお構成される埮分可胜な関数で、局それ自身も埮分可胜か぀、孊習可胜な重み自由倉数を持ちたす。ディヌプラヌニングは成熟した分野であり、目的ごずに暙準的な局が確立されおいたす。䟋えば、畳み蟌み局は、入力テン゜ルの各芁玠の呚蟺に぀いお、固定された広さで近傍を芋るために䜿われ、ドロップアりト局は、正則化の䞀皮ずしお入力ノヌドをランダムに䞍掻性化するために䜿われたす。最もよく䜿われる基本的な局は、党結合局 fully-connected layer あるいは 密結合局dense layer ず呌ばれるものです蚳泚以䞋の説明で、原文ではdense layerの呌称が䜿われおいたすが、日本語では党結合局ずしおいたす。

党結合局は、所望の出力特城のshapeず掻性化の2぀で定矩されたす。党結合局の匏は次のようになりたす

(6.4)¶\[\begin{equation} \vec{h} = \sigma(\mathbf{W}\vec{x} + \vec{b}) \end{equation}\]

ここで、\(\mathbf{W}\) は孊習可胜な \(D \times F\) 行列、\(D\) は入力ベクトル (\(vec{x}\)) の次元、\(F\) は出力ベクトル (\(vec{h}\)) の次元、\(vec{b}\) は孊習可胜な \(F\) 次元ベクトル、\(\sigma(\cdot)\) は掻性化関数です。出力特城数の \(F\) や \(\sigma(\cdot)\) はこのモデルのハむパヌパラメヌタの䞀぀で、぀たりモデルの孊習時に自動的に獲埗される倀ではなく、問題ごずにチュヌニングすべき倀です。 掻性化関数には、埮分可胜か぀倀域が \((-\infty, \infty)\) であれば、基本的にどのような関数も䜿甚できたす。ただし、掻性化関数が線圢関数の堎合、耇数の党結合局を重ねたずしおも単に行列を定数倍したこずず等䟡であり、結局のずころ線圢回垰になっおしたいたす。よっお、ニュヌラルネットワヌクが非線圢性をも぀関数を衚珟できるよう、掻性化関数には非線圢な関数を甚いるのが普通です。たた非線圢性だけでなく、掻性化関数はオン・オフが可胜、぀たり、入力倀のある領域に察しお出力倀が0になる性質が必芁です。䞀般に、負の入力に察しお掻性化関数はれロもしくはそれに近い倀になりたす。

これら2぀の性質を備えた最もシンプルな掻性化関数は、正芏化線圢関数rectified linear unit, ReLU)で、以䞋のように衚されたす

\[\begin{split} \sigma(x) = \left\{\begin{array}{lr} x & x > 0\\ 0 & \textrm{otherwise}\\ \end{array}\right. \end{split}\]

6.1.1. 䞇胜近䌌定理¶

ニュヌラルネットワヌクが未知関数 (\(f(\vec{x})\)) の近䌌に適しおいる理由の䞀぀は、ネットワヌクの深さ局の数や幅隠れ局の倧きさが十分に倧きければ、どんな関数でも近䌌できるこずです䞇胜近䌌定理。この定理には倚くのバリ゚ヌションがあり、無限に広いニュヌラルネットや無限に深いニュヌラルネットに぀いおの蚌明が瀺されおいたす。䟋えば、任意の1次元の関数は、無限に広い局無限の隠れ局次元を持ち掻性化関数ずしおReLUが甚いられた、深さ5のニュヌラルネットワヌクで近䌌できるこずが知られおいたす[LPW+17]。

6.1.2. Frameworks¶

ディヌプラヌニングの実装には、倚くの「ハマりポむント」※、぀たり容易にミスを犯しおしたうポむントがたくさんあるため、ニュヌラルネットワヌクや孊習に必芁な様々な機胜を自分でれロから実装するこずは難しいです。特に数倀的な䞍安定性は、モデルが孊習に倱敗した時にはじめお気づく堎合が倚く、厄介な問題になりたす。 そこでこの本のいく぀かの䟋では、JAXの代わりに少し抜象的な゜フトりェアフレヌムワヌクを甚いるこずにしたす。ここでは、人気のあるディヌプラヌニングフレヌムワヌクの1぀であるKerasを甚いたす。Kerasは高床な凊理を非垞にシンプルなコヌドで蚘述できるこずから、ディヌプラヌニングの実䟋を簡朔に瀺すために適しおいるず蚀えたす。

6.1.3. ディスカッション¶

この本では、ディヌプラヌニングそのものの玹介はなるべくあっさりず枈たせたす。䞖の䞭にはディヌプラヌニングに関する優れた孊習教材がありたす。䞊蚘の読み物や、KerasたたはPyTorchのチュヌトリアルを䜿っお、ニュヌラルネットワヌクや孊習の抂念に慣れおおくずよいでしょう。

6.2. 溶解床予枬モデルを振り返る¶

ディヌプラヌニングの最初の䟋ずしお、2局の党結合ニュヌラルネットワヌクを䜿っお溶解床デヌタセットを再床孊習しおみたしょう。

6.3. このノヌトブックの動かし方¶

このペヌゞ䞊郚の    を抌すず、このノヌトブックがGoogle Colab.で開かれたす。必芁なパッケヌゞのむンストヌル方法に぀いおは以䞋を参照しおください。

import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
import dmol

6.3.1. デヌタの読み蟌み¶

デヌタをダりンロヌドし、Pandasのdata frameずしお読み蟌みたす。さらに、以前ず同じようにしお特城量を正芏化したす。

# soldata = pd.read_csv('https://dataverse.harvard.edu/api/access/datafile/3407241?format=original&gbrecs=true')
# had to rehost because dataverse isn't reliable
soldata = pd.read_csv(
    "https://github.com/whitead/dmol-book/raw/master/data/curated-solubility-dataset.csv"
)
features_start_at = list(soldata.columns).index("MolWt")
feature_names = soldata.columns[features_start_at:]
# standardize the features
soldata[feature_names] -= soldata[feature_names].mean()
soldata[feature_names] /= soldata[feature_names].std()

6.4. Keras甚にデヌタを準備¶

ディヌプラヌニングラむブラリを䜿うこずで、デヌタの分割や各レむダヌの構築など、倚くの䞀般的タスクが簡単に行えたす。以䞋のコヌドでは、numpyのarrayからKerasのデヌタセットを構築したす。

full_data = tf.data.Dataset.from_tensor_slices(
    (soldata[feature_names].values, soldata["Solubility"].values)
)
N = len(soldata)
test_N = int(0.1 * N)
test_data = full_data.take(test_N).batch(16)
train_data = full_data.skip(test_N).batch(16)

このコヌド内における skip や take (次を参照 tf.data.Dataset) は、デヌタセットを2぀に分割し、ミニバッチを䜜る操䜜です。

6.5. ニュヌラルネットワヌク¶

では、ニュヌラルネットワヌクモデルを構築したしょう。この堎合、 \(g(\vec{x}) = \sigma\left(\mathbf{W^0}\vec{x} + \vec{b}\right)\) ずなりたす。この関数 \(g(\vec{x})\) を 隠れ局hidden layer ず呌ぶこずにしたす。これは、我々は \(g(\vec{x})\) の出力をそのたた最終的な結果ずしお扱うわけではないからです。予枬したい溶解床は \(y = \vec{w}g(\vec{x}) + b\) ずなるこずに泚意しおください。掻性化関数 \(sigma( \cdot)\) はtanh、隠れ局の出力次元は32ずしたす。非線圢な掻性化関数はたくさんありたすが、ここでtanhを遞んだのは経隓的な理由です。このように、掻性化関数は䞀般的に効率ず経隓的な性胜に基づいお遞択されたす。

# our hidden layer
# We only need to define the output dimension - 32.
hidden_layer = tf.keras.layers.Dense(32, activation="tanh")
# Last layer - which we want to output one number
# the predicted solubility.
output_layer = tf.keras.layers.Dense(1)

# Now we put the layers into a sequential model
model = tf.keras.Sequential()
model.add(hidden_layer)
model.add(output_layer)

# our model is complete

# Try out our model on first few datapoints
model(soldata[feature_names].values[:3])
<tf.Tensor: shape=(3, 1), dtype=float32, numpy=
array([[-0.19586785],
       [-0.41813114],
       [-0.11751032]], dtype=float32)>

䞊の3぀の分子に察する溶解床を予枬するモデルができたした。Pandasのデヌタはデヌタ粟床にfloat64倍粟床浮動小数点を䜿っおいるのに、我々のモデルはfloat32単粟床を䜿っおいるずいう譊告が出るかもしれたせんが、これはそれほど重芁ではありたせん。この譊告は技術的理由から数倀の粟床を少し萜ずしおいるためですが、分子の溶解床は32ビットず64ビット粟床の浮動小数点による誀差よりもはるかに倚くの分散を持っおいるこずから、この誀差の圱響は無芖できたす。最埌の行を次のように修正すれば、この譊告を消すこずができたす。

model(soldata[feature_names].values[:3].astype(float))

ここたでで、我々はディヌプニュヌラルネットワヌクのモデル構造を目的に埓っお定矩し、デヌタに察しお呌び出すこずができるようになりたした。あずはこのモデルを孊習させるだけです。model.compile を呌び出し、最適化噚通垞は確率的募配降䞋法の䞀皮ず損倱関数を定矩するこずで、孊習甚モデルの準備は完了です。

model.compile(optimizer="SGD", loss="mean_squared_error")

Kerasを䜿うず簡単にディヌプラヌニングモデルが定矩できるこずに気づきたしたか 以前に損倱ず最適化噚を準備するためにかかった劎力を振り返っおみおください。これがディヌプラヌニングフレヌムワヌクを䜿う利点です。では、これでモデルを孊習するための準備が敎いたした。

model.fit(train_data, epochs=50)

孊習も簡単ですね

参考たでに、前回のベヌスラむンモデルではlossの出力は3くらいでした。たた、Kerasによる最適化により、凊理はより高速になりたした。では、このモデルのテストデヌタにおける性胜を芋おみたしょう。

# get model predictions on test data and get labels
# squeeze to remove extra dimensions
yhat = np.squeeze(model.predict(test_data))
test_y = soldata["Solubility"].values[:test_N]
plt.plot(test_y, yhat, ".")
plt.plot(test_y, test_y, "-")
plt.xlabel("Measured Solubility $y$")
plt.ylabel("Predicted Solubility $\hat{y}$")
plt.text(
    min(test_y) + 1,
    max(test_y) - 2,
    f"correlation = {np.corrcoef(test_y, yhat)[0,1]:.3f}",
)
plt.text(
    min(test_y) + 1,
    max(test_y) - 3,
    f"loss = {np.sqrt(np.mean((test_y - yhat)**2)):.3f}",
)
plt.show()
../_images/introduction_16_0.png

性胜も、ベヌスラむンモデルよりかなり良いこずがわかりす。 This performance is better than our simple linear model.

6.6. 緎習問題¶

  1. ReLU関数をグラフにプロットし、ReLUが非線圢関数であるこずを確認せよ

  2. バむアス・バリアンストレヌドオフのこずは䞀旊忘れお、ニュヌラルネットワヌクの局の数を増やすこずにチャレンゞしおみおください

  3. \(\sigma(\cdot)\) が恒等関数であれば、ニュヌラルネットワヌクは線圢回垰であるこずを瀺せ。

  4. デヌタのフィッティングに、非線圢回垰ではなく、ディヌプラヌニングを䜿うメリットずデメリットは䜕ですかたた、どのような堎合にディヌプラヌニングではなく非線圢回垰を遞択したすか

6.7. この章の目次¶

  • ディヌプラヌニングずは、機械孊習の䞀皮で、ニュヌラルネットワヌクを利甚しおデヌタの分類や回垰を行うものです。

  • ニュヌラルネットワヌクは、調敎可胜なパラメヌタを持぀行列を甚いた䞀連の挔算です。

  • ニュヌラルネットワヌクは、入力された特城を、その埌回垰や分類に䜿甚できる新しい特城の集合に倉換したす。

  • 最も䞀般的な局は党結合局で、党結合局においお各入力芁玠は各出力芁玠に圱響を䞎えたす。党結合局のパラメヌタは望たしい出力特城の圢ず掻性化関数によっお定矩されたす。

  • 十分な数の局、たたは十分な幅の隠れ局があれば、ニュヌラルネットワヌクは未知の関数を近䌌するこずができたす。

  • 隠れ局は、その出力を我々は普段芳枬しないため、このように呌ばれおいたす。

  • TensorFlowなどのラむブラリを䜿うず、デヌタをトレヌニングずテストに分けるだけでなく、ニュヌラルネットワヌクの局を構築するこずも容易になりたす。

  • ニュヌラルネットワヌクを構築するこずで、分子の溶解床など様々な物性を予枬するこずができたす。

6.8. Cited References¶

LPW+17

Zhou Lu, Hongming Pu, Feicheng Wang, Zhiqiang Hu, and Liwei Wang. The expressive power of neural networks: a view from the width. In Proceedings of the 31st International Conference on Neural Information Processing Systems, 6232–6240. 2017.