エンタープライズ向けのディープラーニングの解説書。企業でディープラーニングアプリケーションを開発、運用するための実践的な手法を紹介します。対象読者はソフトウェア開発の現場で活躍する実務者。前半はディープラーニング初心者、後半はJavaエンジニア向けの構成です。機械学習、ニューラルネットワークの基礎から始め、ディープラーニングの基本的な概念、実際にチューニングを行う際のベストプラクティス、データのETL(Extract, Transform, Load)の方法、Apache Sparkを用いた並列化について、JavaライブラリDeepLearning4J(DL4J)の開発者でもある著者がわかりやすく丁寧に解説します。
https://www.ohmsha.co.jp/book/9784873118802/
正誤表やDLデータ等がある場合はこちらに掲載しています
日本のAIコミュニティの方々へ
監訳者まえがき
まえがき
1章 機械学習の概要
1.1 学習する機械
1.1.1 機械が学習するには
1.1.2 生物学というヒント
1.1.3 ディープラーニングとは
1.1.4 ちょっと寄り道
1.2 課題の定義
1.3 機械学習の背後にある数学:線形代数
1.3.1 スカラー
1.3.2 ベクトル
1.3.3 行列
1.3.4 テンソル
1.3.5 超平面
1.3.6 重要な数学的演算
1.3.7 データからベクトルへの変換
1.3.8 連立方程式を解く
1.4 機械学習の背後にある数学:統計
1.4.1 確率
1.4.2 条件付き確率
1.4.3 事後確率
1.4.4 分布
1.4.5 標本と母集団
1.4.6 再抽出の手法
1.4.7 選択の偏り
1.4.8 尤度
1.5 機械学習のしくみ
1.5.1 回帰
1.5.2 分類
1.5.3 クラスタリング
1.5.4 未学習と過学習
1.5.5 最適化
1.5.6 凸最適化
1.5.7 勾配降下法
1.5.8 確率的勾配降下法
1.5.9 準ニュートン法による最適化
1.5.10 生成モデルと識別モデル
1.6 ロジスティック回帰
1.6.1 ロジスティック関数
1.6.2 ロジスティック回帰の出力を理解する
1.7 モデルの評価
1.7.1 混同行列
1.8 機械学習への理解を深める
2章 ニューラルネットワークとディープラーニングの基礎
2.1 ニューラルネットワーク
2.1.1 生物のニューロン
2.1.2 パーセプトロン
2.1.3 多層フィードフォワードネットワーク
2.2 ニューラルネットワークの訓練
2.2.1 誤差逆伝播学習
2.3 活性化関数
2.3.1 線形
2.3.2 シグモイド
2.3.3 tanh
2.3.4 ハードtanh
2.3.5 ソフトマックス
2.3.6 修正線形
2.4 損失関数
2.4.1 損失関数の記法
2.4.2 回帰分析での損失関数
2.4.3 分類のための損失関数
2.4.4 再構成のための損失関数
2.5 ハイパーパラメーター
2.5.1 学習率
2.5.2 正則化
2.5.3 モーメンタム
2.5.4 スパース度
3章 深層ネットワークの基礎
3.1 ディープラーニングの定義
3.1.1 ディープラーニングとは
3.1.2 この章の構成
3.2 深層ネットワークのアーキテクチャーに共通の要素
3.2.1 パラメーター
3.2.2 層
3.2.3 活性化関数
3.2.4 損失関数
3.2.5 最適化アルゴリズム
3.2.6 ハイパーパラメーター
3.2.7 ここまでのまとめ
3.3 深層ネットワークの構成要素
3.3.1 RBM
3.3.2 オートエンコーダー
3.3.3 変分オートエンコーダー
4章 深層ネットワークの主要なアーキテクチャー
4.1 教師なしの事前訓練済みネットワーク
4.1.1 DBN
4.1.2 GAN
4.2 畳み込みニューラルネットワーク(CNN)
4.2.1 生物学からの着想
4.2.2 直感的な解説
4.2.3 CNNのアーキテクチャーの概要
4.2.4 入力層
4.2.5 畳み込み層
4.2.6 プーリング層
4.2.7 全結合層
4.2.8 その他のCNNの適用例
4.2.9 有名なCNN
4.2.10 ここまでのまとめ
4.3 リカレントニューラルネットワーク
4.3.1 時間という次元のモデル化
4.3.23 次元の立体的入力
4.3.3 マルコフモデルではない理由
4.3.4 一般的なリカレントニューラルネットワークのアーキテクチャー
4.3.5 LSTMネットワーク
4.3.6 ドメインごとの適用例と混合ネットワーク
4.4 リカーシブニューラルネットワーク
4.4.1 ネットワークのアーキテクチャー
4.4.2 リカーシブニューラルネットワークのバリエーション
4.4.3 リカーシブニューラルネットワークの適用例
4.5 まとめとさらなる議論
4.5.1 ディープラーニングは他のアルゴリズムを時代遅れにするか
4.5.2 最適な手法は問題ごとに異なる
4.5.3 どのような場合にディープラーニングが必要か
5章 深層ネットワークの構築
5.1 深層ネットワークを適切な問題に適用する
5.1.1 表形式のデータと多層パーセプトロン
5.1.2 画像と畳み込みニューラルネットワーク
5.1.3 時系列のシーケンスとリカレントニューラルネットワーク
5.1.4 ハイブリッドネットワーク
5.2 DL4Jのツール群
5.2.1 ベクトル化とDataVec
5.2.2 ランタイムとND4J
5.3 DL4JのAPIでの基本的な考え方
5.3.1 モデルの読み込みと保存
5.3.2 モデルへの入力データを取得する
5.3.3 モデルのアーキテクチャーのセットアップ
5.3.4 訓練と評価
5.4 多層パーセプトロンのネットワークでCSVデータをモデル化する
5.4.1 入力データのセットアップ
5.4.2 ネットワークアーキテクチャーを決定する
5.4.3 モデルを訓練する
5.4.4 モデルを評価する
5.5 手書き数字をCNNでモデル化する
5.5.1 LeNetをJavaで実装したコード
5.5.2 入力画像の読み込みとベクトル化
5.5.3 LeNetのネットワークアーキテクチャー
5.5.4 CNNを訓練する
5.6 リカレントニューラルネットワークを使い、シーケンスデータをモデル化する
5.6.1 LSTMを使ってシェイクスピア風の文章を生成する
5.6.2 LSTMを使ってセンサーからの時系列シーケンスを分類する
5.7 オートエンコーダーを使った異常検出
5.7.1 オートエンコーダーのJavaコード例
5.7.2 入力データのセットアップ
5.7.3 オートエンコーダーのネットワークアーキテクチャーと訓練
5.7.4 モデルを評価する
5.8 変分オートエンコーダーを使ってMNISTの数字を再構成する
5.8.1 MNISTの数字を再構成するコード
5.8.2 VAEのモデルの検討
5.9 自然言語処理へのディープラーニングの適用
5.9.1 Word2Vecを使い、単語の埋め込み表現を学習する
5.9.2 段落ベクトルによる文の離散表現
5.9.3 段落ベクトルを使って文書を分類する
6章 深層ネットワークのチューニング
6.1 深層ネットワークのチューニングに関する基本的な考え方
6.1.1 深層ネットワークを構築する際の直感的な考え方
6.1.2 ステップバイステップのプロセスを直感的に理解する
6.2 入力データとネットワークアーキテクチャーの対応付け
6.2.1 ここまでのまとめ
6.3 モデルの目標と出力層の関連付け
6.3.1 回帰分析モデルでの出力層
6.3.2 分類モデルでの出力層
6.4 層の数、パラメーターの数、メモリ
6.4.1 フィードフォワードの多層ニューラルネットワーク
6.4.2 層とパラメーターの数をコントロールする
6.4.3 メモリ使用量を概算する
6.5 重みを初期化する手法
6.6 RNNでの重みの直交初期化
6.7 活性化関数の利用
6.7.1 活性化関数のまとめ
6.8 損失関数を適用する
6.9 学習率を理解する
6.9.1 パラメーターに対する更新の比率を利用する
6.9.2 学習率についての推奨事項
6.10 スパース度が学習に与える影響
6.11 最適化手法を適用する
6.11.1 SGDのベストプラクティス
6.12 並列化やGPUを使って訓練を高速化する
6.12.1 オンライン学習と並列繰り返しアルゴリズム
6.12.2 DL4JでのSGDの並列化
6.12.3 GPU
6.13 エポック数とミニバッチのサイズ
6.13.1 ミニバッチのサイズでのトレードオフ
6.14 正則化の利用法
6.14.1 正則化項としての事前知識
6.14.2 最大ノルム正則化
6.14.3 ドロップアウト
6.14.4 正則化に関する他のトピック
6.15 不均衡なクラスの扱い
6.15.1 クラスに対するサンプリングの手法
6.15.2 重み付き損失関数
6.16 過学習への対処
6.17 チューニングのUIでネットワーク統計量を利用する
6.17.1 重みの誤った初期化を発見する
6.17.2 シャッフルされていないデータの検出
6.17.3 正則化での問題を検出する
7章 特定の深層ネットワークのアーキテクチャーへのチューニング
7.1 CNN(畳み込みニューラルネットワーク)
7.1.1 畳み込みアーキテクチャーでの主なパターン
7.1.2 畳み込み層の構成
7.1.3 プーリング層を設定する
7.1.4 転移学習
7.2 リカレントニューラルネットワーク
7.2.1 ネットワークへの入力データと入力層
7.2.2 出力層とRnnOutputLayer
7.2.3 ネットワークを訓練する
7.2.4 LSTMでのよくある問題を解決する
7.2.5 パディングとマスキング
7.2.6 マスキングによる評価とスコア付け
7.2.7 リカレントニューラルネットワークのアーキテクチャーの変種
7.3 制限付きボルツマン機械
7.3.1 隠れユニットと入手可能な情報のモデル化
7.3.2 異なるユニットを利用する
7.3.3 RBMで正則化を行う
7.4 DBN
7.4.1 モーメンタムを利用する
7.4.2 正則化を利用する
7.4.3 隠れユニットの個数を決定する
8章 ベクトル化
8.1 機械学習でのベクトル化入門
8.1.1 なぜデータをベクトル化するのか
8.1.2 表形式の生データの属性を扱う方針
8.1.3 特徴量の作成と正規化の手法
8.2 ETLとベクトル化にDataVecを利用する
8.3 画像データをベクトル化する
8.3.1 DL4Jでの画像データの表現
8.3.2 DataVecを使った画像データとベクトルの正規化
8.4 連続データをベクトル化する
8.4.1 連続データの主なソース
8.4.2 DataVecを使って連続データをベクトル化する
8.5 ベクトル化でテキストを扱う
8.5.1 単語バッグ
8.5.2 TF-IDF
8.5.3 Word2VecとVSMを比較する
8.6 グラフを取り扱う
9章 Spark上でDL4Jを用いて機械学習を行う
9.1 DL4JをSparkやHadoopと併用する
9.1.1 コマンドラインでSparkを操作する
9.2 Sparkの実行に対する設定とチューニング
9.2.1 Mesos上でSparkを実行する
9.2.2 YARN上でSparkを実行する
9.2.3 Sparkにおける一般的なチューニングの指針
9.2.4 Spark上のDL4Jジョブをチューニングする
9.3 SparkとDL4J向けにMavenのPOMをセットアップする
9.3.1 pom.xmlファイルに記述する依存先のテンプレート
9.3.2 CDH5.x向けのPOMファイルをセットアップする
9.3.3 HDP2.4向けのPOMファイルをセットアップする
9.4 SparkとHadoopでのトラブルシューティング
9.4.1 ND4Jでの主な問題
9.5 Spark上でのDL4Jの並列実行
9.6 Spark上のDL4Jのベストプラクティス
9.7 Sparkでの多層パーセプトロンの例
9.7.1 Sparkで多層パーセプトロンのアーキテクチャーをセットアップする
9.7.2 分散型の訓練とモデルの評価
9.7.3 DL4JのSparkジョブをビルドし実行する
9.8 SparkとLSTMでシェイクスピア風の文章を生成する
9.8.1 LSTMのネットワークアーキテクチャーをセットアップする
9.8.2 訓練し、進捗を管理し、結果を理解する
9.9 Spark上の畳み込みニューラルネットワークでMNISTをモデル化する
9.9.1 Sparkジョブを構成し、MNISTデータを読み込む
9.9.2 LeNetのCNNアーキテクチャーをセットアップして訓練する
付録A 人工知能とは何か?
A.1 これまでの物語
A.1.1 ディープラーニングの定義
A.1.2 人工知能の定義
A.2 今日のAIで、興味を駆り立てているのは何か?
A.3 冬は来ている
付録B RL4Jと強化学習
B.1 序文
B.1.1 マルコフ決定過程
B.1.2 用語
B.2 異なる設定
B.2.1 モデルフリー
B.2.2 観測の設定
B.2.3 シングルプレイヤーと対戦ゲーム
B.3 Q学習
B.3.1 方策とそれに続くニューラルネットワーク
B.3.2 方策反復
B.3.3 探索と活用
B.3.4 ベルマン方程式
B.3.5 初期状態のサンプリング
B.3.6 Q学習の実装
B.3.7 Q(s,a)のモデリング
B.3.8 経験再生(Experience Replay)
B.3.9 畳み込み層と画像前処理
B.3.10 履歴の処理
B.3.11 ダブルQラーニング(Double Q-Learning)
B.3.12 クリッピング
B.3.13 報酬のスケーリング
B.3.14 優先再生(Prioritized Replay)
B.4 グラフ、可視化、平均Q
B.5 RL4J
B.6 結論
付録C 誰もが知っておくべき数値
付録D ニューラルネットワークと誤差逆伝播:数学的アプローチ
D.1 導入
D.2 多層パーセプトロンの誤差逆伝播
付録E ND4JAPIの使用方法
E.1 設計と基本的な使い方
E.1.1 NDArrayの理解
E.1.2 ND4Jの汎用構文
E.1.3 NDArrayの動作の基礎
E.1.4 データセット
E.2 入力ベクトルの生成方法
E.2.1 ベクトル生成の基礎
E.3 MLLibUtilの使用方法
E.3.1 INDArrayからMLLibベクトルへの変換
E.3.2 MLLibベクトルからINDArrayへの変換
E.4 DL4Jを用いたモデル予測
E.4.1 DL4JとND4Jを一緒に使用する方法
付録F DataVecの使用方法
F.1 機械学習へのデータのロード方法
F.2 多層パーセプトロンへのCSVデータのロード方法
F.3 畳み込みニューラルネットワーク用の画像データのロード方法
F.4 リカレントニューラルネットワーク用のシーケンスデータのロード方法
F.5 データの加工方法:DataVecを用いたデータラングリング(操作)
F.5.1 DataVecの加工:重要な概念
F.5.2 DataVecの加工機能:一例
付録G DL4Jをソースから利用
G.1 Gitがインストールされていることの確認
G.2 主要なDL4JのGitHubプロジェクトのクローン方法
G.3 ZIPファイルを使用したソースのダウンロード方法
G.4 ソースコードから構築するためのMavenの使用方法
付録H DL4Jプロジェクトのセットアップ方法
H.1 新たなDL4Jプロジェクトの作成方法
H.1.1 Java
H.1.2 Mavenでの作業方法
H.1.3 IDE
H.2 他のMavenPOMの設定方法
H.2.1 ND4JとMaven
付録I DL4Jプロジェクト用のGPUの設定
I.1 バックエンドのGPUへの切り替え
I.1.1 GPUの選択
I.1.2 マルチGPUシステム上での学習
I.2 異なるプラットフォーム上のCUDA
I.3 GPU性能の監視方法
I.3.1 NVIDIAシステム管理インタフェース
付録J DL4Jインストールのトラブルシューティング
J.1 以前のインストール
J.2 ソースコードからインストールする際のメモリエラー
J.3 Mavenのバージョンが古い
J.4 MavenとPATH変数
J.5 誤ったJDKバージョン
J.6 C++とその他の開発ツール
J.7 GPUの監視
J.8 JVisualVMの使用方法
J.9 Clojureの使用方法
J.10 予防策
J.10.1 他のローカルリポジトリ
J.10.2 Mavenのa依存性のチェック
J.10.3 依存性の再インストール
J.10.4 他の何かが失敗した場合
J.11 異なるプラットフォーム
J.11.1 macOS
J.11.2 Windows
J.11.3 Linux
参考文献
索引