ニューラルネットワーク [Neural Network] / ディープラーニング [Deep Learning]
ニューラルネットワーク [Neural Network] / ディープラーニング [Deep Learning]

ニューラルネットワーク [Neural Network] / ディープラーニング [Deep Learning]

ニューラルネットワーク [Neural Network] / ディープラーニング [Deep Learning] ニューラルネットワーク、ディープラーニングに関してのマイノートです。今後も随時追加予定です。 目次 [Contents] 概要 [Overview] 全体 MAP 図 ニューラルネットワークの概要 ニューラルネットワークの主動作 活性化関数 [activate functions] sigmoid, tanh, softsign Relu, Relu6, softplus, ELU ReLu 関数による勾配消失問題 [vanishing gradient problem] への対応…

活性化関数の内、Relu, Relu6, softplus, ELU 関数の図 ReLu関数(ランプ関数)は、x=0 にて非連続で微分不可能な関数であるが、その他の領域では微分可能なので、ニューラルネットワークにおいては、微分可能な活性化関数として取り扱われることが多い。 そして、この ReLu は、勾配が一定なので、ディープネットワークにおける学習アルゴリズムにおいて発生する、勾配損失問題 [vanishing gradient problem] に対応することが出来るのが最大の利点である。(後述)

ReLu 関数による勾配消失問題 [vanishing gradient problem] への対応と softmax 関数

勾配消失問題 [vanishing gradient problem] とは、ニューラルネットワークの層が深くなるにつれて、誤差逆伝播法等の学習の際に損失関数の勾配(傾き)が 0 に近くなり、入力層に近い層で入出力誤差が消失してしまい、うまく学習できなくなるような問題である。

この問題に対応するために開発されたのが、ReLU [rectified linear unit] や MaxOut という活性化関数である。 これらの活性化関数では、勾配(傾き)が一定なので、誤差消失問題を起こさない。従って、深い層のネットワークでも学習が可能となり、現在多くのニューラルネットワークで採用されている。

従って、softmax 関数を通じて出力を確率に変換するようにする。 この softmax 関数の式は以下のように与えられる。

【Memo】softmax 関数と統計力学での分配関数の繋がり

ニューラルネットワークの softmax 関数の形は、 統計力学で言う所のカノニカルアンサンブルでの sub system の微視的状態を与える確率の式

といい重要な意味を持つが、これは、エントロピー最大化に繋がる話しであり、 Helmholtz の自由エネルギーは、この分配関数 Z を用いて、

で表現できるけど、これを使えば、カノニカルアンサンブルのエントロピー S が

学習方法の分類 教師あり学習 [supervised learning] と教師なし学習 [Unsupervised learning] バッチ学習 [batch processing] とオンライン学習 [online learning] 強化学習 [reinforcement learning] 転移学習 [transfer learning] ニューラルネットワークにおける損失関数(評価関数、誤差関数)

ここで、ニューラルネットワーク、より広義には機械学習は、 大きく分けて以下の2つの問題設定&解決のための手法に分けることが出来た。 ① 回帰問題の為の手法。(単回帰分析、重回帰分析、等) ② (クラスの)分類問題の為の手法(SVM、k-NN、ロジスティクス回帰、等)

① 回帰問題の為の損失関数(評価関数、誤差関数)
  • L2 正則化の損失関数は、目的値への距離の2乗で表されるので、下に凸な2次関数の形状をしており、 目的値(この場合 0)の近くで急なカーブを描く。 この特性が、損失関数と扱う際に優れているのが特徴である。
  • L1 正則化の損失関数は、目的値への距離の絶対値で表される損失関数である。 その為、目的値(この場合 0)からのズレが大きくなっても(ズレの大きなに関わらず)、その傾き(勾配)は一定である。 その為、L1 正則化は L2 正則化よりも、外れ値にうまく対応するケースが多いのが特徴である。 又、目的値(この場合 0)にて、関数が連続でないために、対応するアルゴリズムがうまく収束しないケースが存在することに注意が必要となる。
② 分類問題の為の損失関数(評価関数、誤差関数)

クラスの分類問題の為の損失関数は、現在の学習結果が与えられたデータに対してどの程度「良い感じなのか」を定量化するために使われる。(誤差逆伝播法時の計算等) 分類問題でのニューラルネットワークの最終結果は、例えば2クラスの分類問題の場合、正解は -1 or 1(又は 0 or 1)の負例と正例となる。従って、損失関数による損失は、連続な値ではなく sign 化したもの 、即ち正解ラベルと、ニューラルネットワークの出力の符号が一致しているならば損失は 0(=分類が成功)であり、符号が一致していなければ損失は 1 となる。

パーセプトロン [Perceptron] (階層型ニューラルネットワーク、フィードフォワード型構造)

単純パーセプトロン [Simple perceptron] 単層パーセプトロンのアーキテクチャ [architecture] 誤り訂正学習 [error correction learning rule](パーセプトロンの学習規則 [perceptron learing rule] )<教師あり学習、オンライン学習> 使用例 最急降下法 [gradient descent method] による学習(重みの更新)<教師あり学習、パッチ学習> 使用例 確率的勾配降下法 [stochastic gradient descent method] 使用例 多層パーセプトロン [ MLP : Multilayer perceptron] 多層パーセプトロンのアーキテクチャ [architecture] 最急降下法 [gradient descent method] による学習(重みの更新)<教師あり学習、パッチ学習> 確率的勾配降下法 [stochastic gradient descent method] <教師あり学習、オンライン学習> 誤差逆伝播法(バックプロパゲーション)[Backpropagation]<教師あり学習、バッチ学習 or オンライン学習> パーセプトロンによる論理演算 パーセプトロンの収束定理

パーセプトロンの学習は、 線形分離可能な問題であれば、有限回の学習の繰り返しにより収束する ことが証明されている。 このことをパーセプトロンの収束定理と呼ぶ。

畳み込みニューラルネットワーク [CNN :Convolutional Neural Network]<階層型ニューラルネットワーク、フィードフォワード型構造>

畳み込み [convolution] 処理について 畳み込みの数学的な一般的な定義 畳み込みニューラルネットワークにおける畳み込み 畳み込みニューラルネットワークにおける畳み込み処理の具体的な例(画像データとそのフィルタ処理) より一般化した畳み込み層のアーキテクチャの元での定式化 受容野の観点から見た、畳み込み層 プーリング [pooling] 処理について 平均プーリング [average pooling] 最大プーリング [max pooling] Lp プーリング [Lp pooling] THE ALL CONVOLUTIONAL NETWORK

従来の CNN に対して、Pooling 層を使わず Conv 層のみの構成(Pooing層 → 複数の小さい Conv 層に置き換わる)で同等 or それ以上のレベルの識別性能を持つことを主張したモデル。

◎ ResNet(残差ネットワーク)

ResNet(残差ネットワーク)は、2015年度の ImageNet コンペティションと COCO セグメンテーションで第1位で優勝したモデルであるが、ただ単に、コンペで高い正解率を叩き出しただけではなく、その残差構造自体に本質的で重要な意味を持つ。

一般的に、画像分類のタスクにおいて、CNNベースのニューラルネットワークの層の深さは重要な要素であり、基本的には、層の深さを深くするほど、CNN でより抽象的な構造を捉えることが出来るために、識別性能をより高めることが出来る。 ※ VGG や GoogLeNet などは、この観点から、層の深さをそれぞれ 16層(VGG-16)、19層(VGG-19)、22層(GoogLeNet)にして識別性能を高めている。

層を深くすると性能が低下する理由としては、勾配消失問題や勾配爆発問題が考えられる。 この勾配消失問題や勾配爆発問題は、batch norm などの正則化手法や dropout で防止することが出来るが、層を深くしすぎるこれらの手法も有効ではなくなってくる。

ResNet では、このような非常に深い層のネットワークに対して、"shortcut connections" の構造を加えることにより、このような非常に深いネットワークにおいても、勾配消失問題や勾配爆発問題を防止することが出来るようにし、結果として、非常に深いネットワークでの高い識別性能を実現する。

☆ ResNet のアーキテクチャ

従来の CNNベースの構造と比較して、ResNet では、赤線で示した "sortcut connection" の構造が追加されている。 この sortcut connection は、入力データ x を、従来のネットワークでの学習対象である出力関数 ところまで、恒等写像でスキップする。 この際に、スキップされた入力データ x と出力関数 との差分を、 残差関数

として定義し、この残差関数 をネットワークの学習対象とする。 (※ この式は、入力データ x と出力関数 の次元が等しい条件を前提としていることに注意。)

そして、この学習された残差関数 と入力データ x を元に、最終的な出力関数

この "sortcut connection" の経路では、従来の何層もある経路(上図の青線)での各層での誤差逆伝播の積み重ねによる勾配消失の影響を受けないので、 勾配消失問題を防ぐことが出来る。 より詳細には、出力関数 は、その微分が1に非常に近い値となるために、誤差逆伝播法による勾配計算時に、他の層をスキップ出来る。

上記では、入力データ x と出力関数 の次元が等しい条件のもとでの式となっていたが、これら入力データ x と出力関数の次元が異なる場合は、以下のような2つの方法で対応する。

  1. 線形変換 W_s で入力データ x からの次元を一致させた上で、スキップして加算する。 即ち、
  2. shortcut connection は恒等写像のまま( )であるが、増加した次元分の要素を、ゼロパディングで埋める。 ※ この2番目の手法では、パラメーター数は増加しない。

この ResNet の基本構造を元に、VGG と同じように、conv 層を 34 層まで積み重ねていったものが、以下に示している ResNet-34 である。 ※ 下図(左):VGG-19 ※ 下図(中央):VGG-19 をベースに、shortcut connection なしの34層ネットワーク(ResNetとの性能の比較用) ※ 下図(右):ResNet-34

※ 実曲線は、入出力次元が一致する shortcut connections ※ 点曲線は、入出力次元が一致しない shortcut connections

この ResNet-34 は、3.6 億回のFLOPs(積乗演算)で、これは、VGG-19 のわずか 18% 程度になっていることに注目。

☆ ResNet の識別性能の実験結果

左図は、ResNet との性能差を公平に比較出来るように、VGGベースで、ResNet と同じパラメーター数、深さ、幅、計算可能コストを持ち、shortcut connection なしにしたネットワーク(plain network)での、層の深さを変えたときの識別性能を示した図である。 右図は、ResNet での、層の深さを変えたときの識別性能を示した図である。 ※ データセットは、ImageNet ※ 細い線は、学習データセットでの誤識別率。 ※ 太い線は、検証データセットでの誤識別率

従来の shortcut connection なしのネットワーク(plain network)では、層の深さを深くしすぎると、逆に、識別性能は低下しているが、shortcut connection を導入した ResNet では、層の深さを深くすると、識別性能が上昇していることが見てとれる。 ※ この図では、34 層まで深くしているが、更に深くしていっても(例えば、1202層)、同様の傾向は成り立つ。

  • 【参考サイト】
    • 【元論文】[1512.03385] Deep Residual Learning for Image Recognition
    • 【論文翻訳(非公開)】GitHub/Yagami360/MachineLearning-Papers_Survey/papers/Deep_Residual_Learning_for_Image_Recognition/ResNet.md
    • Residual Network(ResNet)の理解とチューニングのベストプラクティス - DeepAge
    • ResNetの論文を読んだ - kumilog.net
    • ResNetの仕組み
    • ディープラーニング ResNet のヒミツ - Bridge over troubled Techs.

    回帰結合ニューラルネット [RNN : Recursive Neural Network]<階層型ニューラルネットワーク>

    リカレントニューラルネットワークのアーキテクチャの種類 隠れ層間で回帰構造をもつネットワーク 通時的誤差逆伝搬法 [BPTT : back-propagation through time] 通時的誤差逆伝搬法によるパラメータの更新式(誤差関数が最小2乗誤差) 長・短期記憶(LSTM [long short-term memory])モデル CEC [constant error carousel] 重み衝突 [weight conflict] と入力ゲート [input gate]、出力ゲート [output gate] 忘却ゲート [forget gate] 覗き穴結合 [peephole connections] LSTM モデルの定式化 GRU [gated recurrent unit] 双方向 RNN [Bidirectional RNN] RNN Encoder-Decoder (Seqenence-to-sequence models) Attention (Seqenence-to-sequence models) LSTM を使用した場合の Attention

    ■ グラフ畳み込みネットワーク

    • グラフフーリエ変換を用いたグラフ畳み込み
      1. グラフフーリエ変換を用いたグラフ畳み込み(Spectral graph convolution)
      2. 「Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering」 → グラフフーリエ変換を用いたグラフ畳み込みの計算をチェビシェフ多項式で近似
      3. 「Semi-Supervised Classification with Graph Convolutional Networks」 → チェビシェフ多項式で近似の内、K=1 の次数のみで近似
    • グラフフーリエ変換を用いないグラフ畳み込み
      1. 「Relational Graph Convolutional Network」 → グラフフーリエ変換とは異なる単純な手法でのグラフ畳み込み
    ◎ グラフフーリエ変換を用いたグラフ畳み込み(Spectral graph convolution)
    1. ラプラシアンに対応したグラフラプラシアンで置き換え、
    2. そのグラフラプラシアンの固有値と固有ベクトルで、グラフ上のフーリエ変換(=グラフフーリエ変換)を表現し、
    3. そのグラフフーリエ変換(と逆グラフフーリエ変換)から、グラフ上のグラフ畳み込みを定義する。

    グラフラプラシアン L=D−A において、次数行列 D も隣接行列 A も実対称行列なので、グラフラプラシアンも実対称行列である。 従って、直交行列 U を用いて対角化可能であり、以下の関係が成り立つ。

    が成り立つことと同値であるので、先のフーリエ変換が、正規直交基底としての固有ベクトルで固有値展開したものであることとの類似により、直交行列 U によるグラフ上の信号 x∈Rn への演算

    この式は、パラメーターを θ→λ とすると

    このように表現したグラフ畳み込みは、固有ベクトルの計算と固有ベクトルとの積の計算が、データ次元に応じて計算量が膨大になるという問題がある。 そのため、対角化行列 diag(θ) を多項式で近似する方法が提案されている。

    ※ このチェビシェフ多項式による近似手法が論文 「Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering」 で提案されている手法。

    ◎ Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering

    このように表現したグラフ畳み込みでは、固有ベクトルの計算と固有ベクトルとの積の計算が、データ次元に応じて計算量が膨大になるという問題がある。 そのため、論文 「Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering」 では、diag(θ) をチェビシェフ多項式で近似する方法が提案されている。

    具体的には、対角行列 diag(θ) は以下の多項式で展開することを考える。(※ 正規直交基底としての固有ベクトル(=固有関数)で固有値展開した形)

    これにより、チェビシェフ多項式での近似により、固有ベクトルの積の計算では、データの次元数 nの2乗に比例した計算コスト O(n 2 ) だったものが、チェビシェフ多項式の次数 K のオーダーに依存した計算コストとなり、計算コストが大幅に減少させることが出来る。

    ◎ Semi-Supervised Classification with Graph Convolutional Networks

    論文「Semi-Supervised Classification with Graph Convolutional Networks」 では、このチェビシェフ多項式での近似式において、 K=1 の次数までの近似式を採用する。 即ち、

    K=1 までの次数で近似することで、上式のように、グラフラプラシアン L に対して線形なモデルとなり、モデルの表現力は低下してしまうが、非線形部分は、グラフ畳み込みネットワークの多層構造で担保するようにする。 逆に、K=1とすることで、モデルの過学習が抑えられる効果もある。

    ここで、上式においては、学習パラメーターは θ0, θ1 の2つになるが、さらなる過学習対策のために、θ = θ0 = −θ1 として、1つのパラメーターでのみ表現出来るようにすると、上式は、

    ☆ 損失関数

    損失関数は、単純に最終的出力 Z と教師データ Y との間のクロスエントロピーで定義される。 即ち、

    ◎ R-GCN [Relational Graph Convolutional Network](グラフフーリエ変換を用いないグラフ畳み込み)

    R-GCN [Relational Graph Convolutional Network] では、この問題を解決するために、グラフフーリエ変換ではなく、通常の畳み込みのように、線形結合+活性化関数の形でグラフ畳み込みを行えるようにする。但し、グラフ構造は、知識ベースの有向グラフである必要がある。

    ☆ RGCN でのグラフ畳み込み(グラフフーリエ変換を用いないグラフ畳み込み)

    グラフ構造の文脈において、知識ベース [Knowledge Base] とは、グラフの各々の頂点ノード(A, B, . )が、"A is a B" や "A has a B" の関係性を持つような有向グラフを指す。

    ☆ RGCN での損失関数 【補足】グラフラプラシアン

    ※ このグラフラプラシアンは、グラフ構造の各頂点へ入力される情報と出力される情報という見方では発散 ∇ 2 の意味になっており、それ故に、ラプラシアンと名付けられている。

    ◎ 参考文献(グラフ畳み込み)
    • 【星の本棚】グラフ理論
    • 機は熟した!グラフ構造に対するDeep Learning、Graph Convolutionのご紹介 - ABEJA Arts Blog
    • グラフ構造を畳み込む -Graph Convolutional Networks- - Qiita
    • Graph Convolutional Network 概説
    • onvolutional Neural Networks on Graphs with Fast Localized Spectral Filteringを読んだのでメモ - 機械学習とかコンピュータビジョンとか
    • SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKSを読んだのでメモ
    • [DL Hacks]Semi-Supervised Classification with Graph Convolutional Networks
    • グラフ畳み込み再考 - Qiita
    • 【元論文】[1606.09375] Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering
    • 【元論文】[1703.06103] Modeling Relational Data with Graph Convolutional Networks

    ■ ニューラルネットワーク, ディープラーニングによる物体検出 [object detection]

    ◎ SSD [Single Shot muitibox Detector](単発検出器) ☆ モデル(アーキテクチャ)

    • SSD の基本的なアーキテクチャは、上図のように、フィードフォワード型(順方向)の多層 CNN をベースに構成される。
    • ネットワークの最初の部分のレイヤーは、画像分類にに使用される標準的なアーキテクチャ(上図では VGG-16)に基づいて構成され、これをベースネットワークという。 このベースネットワークで、特徴量を検出する。(特徴量はより広い領域から抽出)
    • その後のレイヤーは、マルチスケール特徴マップによる多様な物体検出のための補助的な構造であり、主な特徴 [key features] は以下のようになる。
      • 直感的には、 「多層 CNN では、conv 層や pooling 層で、特徴マップがダウンサンプリングされて、後段に行くほど、特徴マップのグリッドサイズが小さくなるが、このことは、各々の層の特徴マップには、色々なサイズの物体を検出出来る情報が含まれていることを意味している。 従って、SSD モデルの後段の特徴マップ(特徴レイヤー)の各グリッドでは、大きな物体の情報。前段では、小さな物体の情報を取得することが出来る。 そして、各グリッドにおける特徴量を使用して、バウンディングボックス(BBOX)のアスペクト比、所属クラス、座標のオフセットを学習させる。」 というのが、基本的なコンセプトである。

      又、SSD では、特定の特徴マップが、特定のスケールの物体に対応するように学習させるために、 デフォルトボックスを ”敷き詰めて” 設計されている。

      より詳細には、デフォルトボックスを中心とする提案領域は、物体のスケール値、中心座標、高さ、幅が合っていないことがあるため、スケール値、幅、高さ、中心座標に回帰する畳み込み層を追加している。(BBOXの形状回帰) 具体的には、今、m 個の特徴マップを予想に使用するケースにおいて、 各特徴マップ k についてのデフォルトボックスのスケール は、以下のようにして計算される。

      • SSD が訓練中に必要とするのは、 入力画像(上図の(a))と、各物体それぞれの正解ボックス(デフォルトボックスの内、各物体が収まるボックス。上図の赤枠と青枠)のみである。
      • 各層での畳み込み処理のやり方 [in a convolutional fashion] において、 いくつかの特徴マップでの各位置(中心座標)において、異なるアスペクト比デフォルトボックスの少数の集合(上記例では4個)を、異なるスケールの特徴マップ内(例えば、上記の (b) の 8×8 の特徴マップ内、(c) の4×4の特徴マップ内)で評価する。
      • そして、これらのデフォルトボックスそれぞれにおいて、 形状のオフセット loc : と、全ての物体カテゴリー に関する確信度 conf を予想する。
        • w : デフォルトボックスの幅、h : デフォルトの高さ、cx,cy : デフォルトボックスの左上座標
        ☆ 訓練(学習)アルゴリズム

        • 「マッチング戦略」 訓練では、どのデフォルトボックスが正解ボックスとなるのか決定する必要があり、 その結果を元にネットワークを学習させる。 各正解ボックスは、座標位置、アスペクト比、スケール値が異なる幾つかのデフォルトボックスから選択するが、 これらデフォルトボックスに対して、jaccard overlap (下図)の最良値(最もエリアが重複している)で、 各正解ボックスのマッチ度(エリアの重複度)を算出することになる。

        ここで、上式の位置特定誤差 は、 予想されたボックス(l)と正解ボックス(g)の間の Smooth L1 誤差(関数)であり、以下の式で与えられる。

        又、確信度誤差 は、 所属クラスのカテゴリ(c)に対する softmax cross entropy 誤差(関数)であり、以下の式で与えられる。

        • 元の入力画像全体を使用する。
        • 物体画像との最小の jaccard overlap が、0.1 , 0.3 , 0.5 , 0.7 , 0.9 となるように、画像中の領域(サンプルパッチ)をサンプリングする。
        • 画像中の領域(サンプルパッチ)をランダムにサンプリングする。

        この各画像中の領域(サンプルパッチ)のサイズは、元の画像サイズの 0.1倍 ~ 1.0倍で、アスペクト比は 1/2 ~ 1.0 倍である。 但し、サンプルパッチの中に正解ボックスの中心座標が存在する場合は、正解ボックスの重複部分はそのままにする。 (サイズやアスペクト比を元の画像から変更しない)

        ☆ 物体検出(推論)フェイズ top-k filtering

        クラス所属の確信度が上位 k 個のもののみを抽出する。

        non-maximum suppression アルゴリズム

        推論されたデータに対し、バウンディングボックスの重複防止のために non-maximum suppression アルゴリズムを適用する。

        参考サイト
        • SSD の論文の日本語訳 qiita.com
        • スライドの 37 ページ目から SSD の解説有り(Keras でのコード付き)
        R-CNNの原理とここ数年の流れ from 和貴 本橋 SSD: Single Shot MultiBox Detector (ECCV2016) from Takanori Ogata 最近のSingle Shot系の物体検出のアーキテクチャまとめ from Yusuke Uchida

        参考文献

        • 作者: Ian Goodfellow,Yoshua Bengio,Aaron Courville,岩澤有祐,鈴木雅大,中山浩太郎,松尾豊,味曽野雅史,黒滝紘生,保住純,野中尚輝,河野慎,冨山翔司,角田貴大
        • 出版社/メーカー: KADOKAWA
        • 発売日: 2018/03/07
        • メディア: 単行本
        • この商品を含むブログ (1件) を見る
        • 作者: 平井有三
        • 出版社/メーカー: 森北出版
        • 発売日: 2012/07/31
        • メディア: 単行本(ソフトカバー)
        • 購入 : 1人 クリック : 7回
        • この商品を含むブログ (5件) を見る
        • 作者: Sebastian Raschka,Vahid Mirjalili,福島真太朗,株式会社クイープ
        • 出版社/メーカー: インプレス
        • 発売日: 2018/03/16
        • メディア: 単行本(ソフトカバー)
        • この商品を含むブログ (2件) を見る
        • 作者: 麻生英樹,安田宗樹,前田新一,岡野原大輔,岡谷貴之,久保陽太郎,ボレガラダヌシカ,人工知能学会,神嶌敏弘
        • 出版社/メーカー: 近代科学社
        • 発売日: 2015/11/05
        • メディア: 単行本
        • この商品を含むブログ (2件) を見る
        • 作者: 巣籠悠輔
        • 出版社/メーカー: マイナビ出版
        • 発売日: 2017/05/30
        • メディア: 単行本(ソフトカバー)
        • この商品を含むブログ (5件) を見る
        • 作者: Nikhil Buduma,太田満久,藤原秀平,牧野聡
        • 出版社/メーカー: オライリージャパン
        • 発売日: 2018/04/26
        • メディア: 単行本(ソフトカバー)
        • この商品を含むブログ (2件) を見る
        • 作者: 廣瀬明
        • 出版社/メーカー: サイエンス社
        • 発売日: 2016/06/21
        • メディア: 雑誌
        • この商品を含むブログを見る
        • 作者: Nick McClure,株式会社クイープ
        • 出版社/メーカー: インプレス
        • 発売日: 2017/08/14
        • メディア: 単行本(ソフトカバー)
        • この商品を含むブログ (1件) を見る