#80 モデルのコンパイル、トレーニング、評価

>100 Views

October 31, 26

スライド概要

本スライドは、ディープラーニングの基本構造と、Kerasを用いたモデルのコンパイル・トレーニング(学習)・評価の手順を解説したものです。

ディープラーニングの仕組み:入力・重み・バイアス・活性化関数からなる「ノード(人工ニューロン)」で計算を行います。学習時は予測誤差を入力側へ逆伝播させてパラメータを更新する「バックプロパゲーション」を利用します。

コンパイル(model.compile):最適化手法(Adam)、損失関数(SparseCategoricalCrossentropy)、評価指標(Accuracy)を指定し、学習のルールを設定します。

トレーニング(model.fit):指定回数(エポック数)のループで予測・採点・パラメータ更新を繰り返し、正答率を上昇させます。

評価(model.evaluate):未学習のテストデータで正解率を検証します。テスト時の正解率が訓練時より低下する現象(過学習)についても解説しています。

profile-image

すべてのビジネスパーソンが意思決定プロセスにデータを活用する思考を身につけるため、まずは、データサイエンスの分析を体験していきましょう。SECIモデルの最初の段階、共同化(Socialization)からはじめていきます。 下記のブログで、ここにアップしたスライド、動画を随時、公開中です。 【ブログ】https://tutorial4datascience.blogspot.com/ 【Youtubeチャンネル】https://www.youtube.com/@DataScience_for_everyone 【Kindle】そして、このブログをまとめて書籍にしました!   https://amzn.to/4ryVppn   https://amzn.to/4pGgFb1

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

5th STEP ディープラーニング Section 6 モデルのコンパイル、トレーニング、評価 データサイエンス チュートリアル 1

2.

ディープラーニングのしくみ (1) さて、ここで、ディープラーニングのしくみについて、理解しておきましょう。 複数の隠れ層(中間層)を持つニューラルネットワーク、すなわちディープラーニングは、神経細胞をモデルにシステム上で 動くように設計されたものです。神経細胞のニューロンに対応した人工ニューロンをノードと呼びます。図1では、〇で表されて いるところです。 このノードを拡大すると、図2のようになります。入力、入力の数、重み、バイアス、活性化関数、出力によって表されます。 図2 ▲ 図1 データサイエンス チュートリアル 2

3.

ディープラーニングのしくみ (2) 重み 入力情報の重要度を決定する倍率(係数)です。 トレーニング前はランダムな初期値ですが、model.fit() によって最適な値に書き換えられていきます。 バイアス ノードの感度・発火のしやすさを調整する閾値(定数)です。 重みと入力の積の総和に対して、ノード1個に対して1個の定数値として足し算されます。重みと同様にトレーニングによって 自動更新されます。 活性化関数 生物学的なニューロンにおける「一定以上の刺激を受けると発火する」動作を再現するスイッチの役割を担っています。 この関数を用いて出力を算出するのですが、ニューラルネットワークや ディープラーニングでは、この関数を用いることにより単なる一次関数 ではなく、複雑な曲線や境界線(非線形なパターン)を学習する 表現力を獲得することになります。 出力 ノードの最終計算結果、すなわち次の層への入力値となります。 「会議の発言がどう伝わるか」で考えるたとえ話が秀逸です! 【参考】 AI がざっくりわかる https://note.com/nice_sable4056/n/nd989bea2c114 データサイエンス チュートリアル 3

4.

ディープラーニングのしくみ (3) ノードを構成している入力、入力の数、重み、バイアス、活性化関数を用いると出力は一つの数式で表すことができます。 すなわち、計算可能になります。 では、ここで出力を求める計算式を考えてみましょう。 ① 刺激の総和uは、ノードに入力されたx1からxnの信号が、下記のような式で表すように設計されています。 𝒏 入力:x、重み:w、入力の数:n、バイアス:b とすると、 𝒖 = ෍ 𝒙 𝒌𝒘 𝒌 + 𝒃 となります。 𝒌=𝟏 ② 出力は、活性化関数を f とすれば 、 𝒚 = 𝒇 𝒖 と表されますから、下記の式で表すことができます。 𝒏 𝒚=𝒇 𝒖 =𝒇 ෍ 𝒙𝒌𝒘𝒌 + 𝒃) 𝒌=𝟏 データサイエンス チュートリアル 4

5.

ディープラーニングのしくみ (4) ニューラルネットワークやディープラーニングでは、前のスライドの式によって各ノードの出力を行いますが、結果に対して、重み付 けやバイアスをチューニングして性能を向上させていくのが、バックプロパゲーション(Backpropagation/誤差逆伝播法) です。予測の誤差を、出力側から入力側へと「逆方向」に伝えていき、各層のパラメーター(重み、バイアス)をどれくらい修 正すべきかを計算する機能ということができます。 ニューラルネットワークやディープラーニングのトレーニングでは、このバックプロパゲーションを使います。 データサイエンス チュートリアル 5

6.

model.compile()関数 (1) モデルのトレーニングを行う前に、モデルのコンパイルを行います。 これは、作成したモデルに、トレーニングを進める方法や評価基準をどうするかというルールを設定して、モデルのトレーニング の準備することを意味します。 具体的には、model.compile()関数に次の3つの引数を指定します。 ●オプティマイザ optimizer ●損失関数 loss ●評価指標 metrics 公式チュートリアルでは、下記のように引数を指定しています。 model.compile(optimizer='adam‘, loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy’]) コンパイルを行わずに model.fit() を呼び出すと、「どうやって採点すればいいの?どうやって重みを直せばいいの?」とAIが パニックを起こしてエラーになってしまいます。 データサイエンス チュートリアル 6

7.

model.compile()関数 (2) ●オプティマイザ optimizer → 予測を外したときに、『重み』や『バイアス』をどのように調整・更新するかという計算アルゴリズムを指定します。 → adam(Adaptive Moment Estimation)というアルゴリズムが指定されていますが、AI開発において、現在、 ほとんどの場面で optimizer=‘adam’ が標準となっています。他のアルゴリズムに関しては、下記を参照してください。 【参照】 機械学習のAdamやRMSPropなどの最適化手法まとめ:効率的なモデル構築の秘訣 ●損失関数 loss → これは、AIが出した予測と実際の正解を比べて、どれくらい間違えているか(誤差)を計算するルールを設定しています。 → 『keras.losses.』の部分はKerasが提供する損失関数のモジュールから呼び出す指示を表し、 『SparseCategoricalCrossentropy( ) 』の部分は、使用する具体的な損失関数の名前と詳細設定を指示してい ます。SparseCategoricalCrossentropyとは、多クラス分類問題を解決するために一般的に使われる損失関数 で、(from_logits=True)はモデルの出力はロジット(生データ)であることを指定しています。 ●評価指標 metrics → トレーニングの評価指標を指定しています。 → 『=[‘accuracy’]』は、予測と、正解ラベルを全データ分比較して、正解した割合を算出して保持します。 データサイエンス チュートリアル 7

8.

モデルのトレーニング (1) モデルのトレーニングの準備、すなわちコンパイルを行った後に、model.fit関数を使って、モデルをトレーニングしていきます。 他の機械学習と同様に、実際のデータを読み込ませて、教師あり学習を実行していきます。 model.fit関数は、モデルのコンパイルに従って、 設定した回数(引数epochs=数字)だけ、以下のループを繰り返す 指示をしています。 1.予測してみる(順伝播 / Forward Pass) →現在の重みとバイアスを使って、画像を読み込み「これはスニーカーかな?」と予測を出します。 2.採点する(損失の計算) → 『model.compile関数』で指定した損失関数を使って、正解ラベルとの「ズレの大きさ」を採点します。 3.間違えた原因を後ろから辿る(バックプロパゲーション) → 「どのノードの重みやバイアスが原因で予測を外したのか?」を、出力層から入力層に向かって逆向きに微分の計算を して突き止めます。 4.重みとバイアスを書き換える(パラメータの更新) →『model.compile関数』で指定したオプティマイザ(adam)が、誤差が減る方向へ重みとバイアスをほんの少しだけ 修正します。 データサイエンス チュートリアル 8

9.

モデルのトレーニング (2) model.fit関数の主な引数は下記のとおりです。 model.fit(入力データ名1,入力データの正解ラベル1, epochs=整数) ここで、『epochs=整数』は、訓練データ全体を何回くり返して学習するかを指定するハイパーパラメータ(設定値)です。 今回は、10回に設定しました。 model.fit(train_images, train_labels, epochs=10) データサイエンス チュートリアル 9

10.

モデルのトレーニング (3) の結果は下記のようになります。 内の『accuracy (正答率)』がトレーニングを 繰り返すことによって、徐々に 上昇していることがわかります。 データサイエンス チュートリアル 10

11.

【参考】 Google Colaboratoryのハードウエア アクセラレーター モデルのトレーニングには、多くの時間がかかります。 Google Colaboratoryの設定を下記のように変更して おくことをお勧めします。 編集→ノートブックの設定→ハードウエア アクセラレーター で、デフォルトの『CPU』を無料版でも利用可能な 『T4 GPU』に変更しておきましょう。 ハードウエア アクセラレーターとは、コラボの頭脳である 「CPU」の代わりに、特定の処理を専門的に超高速で肩 代わり(加速)してくれる専用のハードウェア(チップや集 積回路)のことです。 データサイエンス チュートリアル 11

12.

正解率を評価する (1) 次に、トレーニングされたモデルが検証用のテストデータセットでどのように機能するか、正解率を評価します。 ① ② ① 計算結果として『test_loss』、『test_acc』2つの数値を返す指示をしているコードです。 test_loss(損失/誤差):正解データとモデルの予測結果のズレの大きさを示します(数値が小さいほど優秀)。 test_acc(正解率 / Accuracy):モデルが正確に分類できた画像の割合を示します(1.0が100%)。 model.evaluate(...):学習済みのモデルに『まだ見せていないテスト用データ』を投入し、どのくらい正確に予測できる かを計算する関数です。 test_images、test_labels:評価に使用する画像のデータセットとその正解ラベルです。 verbose=2→評価処理の実行ログ(進捗状況)をどのように表示するかを指定する引数です。『2』 は「エポックごとに1 行のログを出力する」という標準的な表示モードです(0 は非表示、1 はプログレスバー表示)。 ② 評価結果である正解率(test_acc)を画面に表示します。¥n は改行を意味しており、ログの表示と被らないように見 やすく整えています。 データサイエンス チュートリアル 12

13.

正解率を評価する (2) 結果は、下記のようになりました。 313/313→処理したバッチ(データのまとまり)の数です。このチュートリアルでは、10,000枚のテスト画像を32枚ごとの グループ(バッチ)に分けて処理します(10000/32≒313)。すべての処理が完了したことを示しています。 2s - 5ms/step→評価にかかった時間です。全体で2秒かかり、1ステップ(1バッチ)あたり約5ミリ秒で処理されました。 accuracy: 0.8800→テストデータに対する正解率(Accuracy)です。小数点表示なので、88.00% の割合で正し い画像を予測できたことを示します。 loss: 0.3475→損失値(Loss)です。モデルの予測と実際の正解との「誤差の大きさ」を表しており、数値が小さけれ ば小さいほど優秀です。 Test accuracy→0.88 ではなく末尾に細かい数字が並んでいるのは、コンピュータ(浮動小数点数)内部の計算誤差 によるもので、意味としては 約88.0%(約8,800枚を正解)と同じです。 データサイエンス チュートリアル 13

14.

正解率を評価する (3) テスト用データセットでの正解率は、トレーニング用データセットでの正解率よりも少し低くなります。 (※ 正解率は、若干異なっている場合があります) このトレーニング時の正解率とテスト時の正解率の差は、過学習の一例です。 過学習とは、新しいデータに対する機械学習モデルの性能が、トレーニング時と比較して低下する現象です。過学習モデル は、トレーニングデータセットのノイズと詳細を「記憶」するため、新しいデータでのモデルのパフォーマンスに悪影響を及ぼします。 データサイエンス チュートリアル 14