(57)【要約】【課題】現実的な時間でニューラルネットワーク用のパラメータを更新できる学習システム、学習プログラムおよび学習方法を提供する。【解決手段】本発明の一態様によれば、１または複数のプロセッサから構成され、該１または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、各プロセスは、現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、前記微分値のみならず前記現時点のパラメータも用いて、他の通信プロセスに送信される送信値を算出することと、前記送信値を他のプロセスに送信することと、他のプロセスから送信された前記送信値に基づいて、前記現時点のパラメータを更新することと、を含む、学習システムが提供される。【選択図】図３
2016197389.tif 000002
【特許請求の範囲】
【請求項１】
１または複数のプロセッサから構成され、該１または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、各プロセスは、
現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、
前記微分値のみならず前記現時点のパラメータも用いて、他のプロセスに送信される送信値を算出することと、
前記送信値を他のプロセスに送信することと、
他のプロセスから送信された前記送信値に基づいて、前記現時点のパラメータを更新することと、を含む、学習システム。
【請求項２】
１または複数のプロセッサから構成され、該１または複数のプロセッサが微分プロセスおよび通信プロセスの組を複数実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、
前記微分プロセスのそれぞれは、
現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、
前記微分値のみならず前記現時点のパラメータも用いて、他の組における通信プロセスに送信される送信値を算出することと、を含み、
前記通信プロセスのそれぞれは、
組になっている前記微分プロセスが前記送信値の算出を完了している場合には前記送信値を、完了していない場合には前記現時点のパラメータの一部を、他の組における通信プロセスに送信することと、
他の通信プロセスから送信された前記送信値および前記現時点のパラメータの一部に基づいて、前記現時点のパラメータを更新することと、を含む、学習システム。
【請求項３】
前記通信プロセスのそれぞれは、組になっている前記微分プロセスが前記送信値の算出を完了しているか否かに関わらず、前記送信値または前記現時点のパラメータの一部を他の通信プロセスに送信することにより、送信の度に前記パラメータを更新する、請求項２に記載の学習システム。
【請求項４】
前記組の数は、
前記微分プロセスのそれぞれが用いる前記教師データの数と、
１回の更新で用いられる前記教師データの数の最適値と、
前記微分プロセスが前記送信値を算出するのに要する時間と、
に基づいて定められる、請求項２または３に記載の学習システム。
【請求項５】
前記微分プロセスのそれぞれが用いる前記教師データの数をＡとし、
１回の更新で用いられる前記教師データの数の最適値をＢとするとき、
前記組の数は、前記通信プロセスが送信を行う際に、平均Ｂ／Ａ個の前記微分プロセスが前記送信値の算出を完了しているよう、定められる、請求項４に記載の学習システム。
【請求項６】
１または複数のプロセッサから構成され、該１または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、各プロセスは、
ある時点のパラメータと、差分値と、教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することであって、前記差分値は、前記ある時点でのパラメータと、その後のある時点でのパラメータとの差を圧縮した値である、ことと、
前記微分値を圧縮することと、
圧縮された前記微分値と、前記差分値とに基づいて他のプロセスに送信される送信値を算出することと、
他のプロセスから送信された前記送信値と、圧縮された前記送信値と、に基づいて、前記差分値を得ることと、
前記差分値を復元した値に基づいて、前記ある時点でのパラメータを更新することと、を含む、学習システム。
【請求項７】
１または複数のプロセッサから構成され、該１または複数のプロセッサが微分プロセスおよび通信プロセスの組を複数実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、
前記微分プロセスのそれぞれは、
ある時点のパラメータと、差分値と、教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することであって、前記差分値は、前記ある時点でおパラメータと、その後のある時点でのパラメータとの差を圧縮した値である、ことと、
前記微分値を圧縮することと、
圧縮された前記微分値と、前記差分値とに基づいて他のプロセスに送信される送信値を算出することと、
を含み、
前記通信プロセスのそれぞれは、
組になっている前記微分プロセスが前記送信値の算出を完了している場合には前記送信値を、完了していない場合には前記差分値を送信値として他の組における通信プロセスに送信することと、
他の通信プロセスから送信された前記送信値と、組になっている前記微分プロセスが算出した前記送信値と、に基づいて前記差分値を得ることと、
前記差分値を復元した値に基づいて、前記ある時点でのパラメータを更新することと、を含む、学習システム。
【請求項８】
前記微分値を圧縮することは、前記微分値と、所定行列との乗算である、請求項６または７に記載の学習システム。
【請求項９】
前記所定行列は、学習過程において更新される、請求項８に記載の学習システム。
【請求項１０】
前記所定行列は、学習過程における過去の前記微分値に基づいて更新される、請求項９に記載の学習システム。
【請求項１１】
前記所定行列は、学習過程における過去の前記微分値に対する主成分分析によって更新される、請求項１０に記載の学習システム。
【請求項１２】
前記微分値を圧縮することは、分配法則を満たすよう、前記微分値を圧縮することである、請求項８乃至１１のいずれかに記載の学習システム。
【請求項１３】
前記微分値を圧縮することは、すべての前記微分プロセスからの微分値を行列化したものと、前記所定行列との乗算である、請求項８乃至１２のいずれかに記載の学習システム。
【請求項１４】
前記ニューラルネットワーク用のパラメータの一部が他の一部と共有される、または、パラメータの一部が他の一部と所定の関係を満たす、請求項１乃至１３のいずれかに記載の学習システム。
【請求項１５】
前記ニューラルネットワーク用のフィルタの１つが他のフィルタの１つと共有される、または、フィルタの１つが他のフィルタと所定の関係を満たす、請求項１４に記載の学習システム。
【請求項１６】
前記ニューラルネットワーク用のフィルタの１つは、他のフィルタを所定角度回転したもの、点対称としたもの、左右反転したもの、または、上下反転したものである、請求項１５に記載の学習システム。
【請求項１７】
前記１または複数のプロセッサとは異なる別のプロセッサが、予め用意された画像を変形して前記教師データを生成する画像処理プロセスを実行する、請求項１乃至１６のいずれかに記載の学習システム。
【請求項１８】
請求項２または７に記載の学習システムを構築するために、１つの前記プロセッサに、前記微分プロセスを実行させる、学習プログラム。
【請求項１９】
請求項２または７に記載の学習システムを構築するために、１つの前記プロセッサに、前記通信プロセスを実行させる、学習プログラム。
【請求項２０】
１または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習方法であって、各プロセスは、
現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、
前記微分値のみならず前記現時点のパラメータも用いて、他のプロセスに送信される送信値を算出することと、
前記送信値を他のプロセスに送信することと、
他のプロセスから送信された前記送信値に基づいて、前記現時点のパラメータを更新することと、を含む、学習方法。
【請求項２１】
１または複数のプロセッサが微分プロセスおよび通信プロセスの組を複数実行することによりニューラルネットワーク用のパラメータを更新する学習方法であって、
前記微分プロセスのそれぞれは、
現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、
前記微分値のみならず前記現時点のパラメータも用いて、他の組における通信プロセスに送信される送信値を算出することと、を含み、
前記通信プロセスのそれぞれは、
組になっている前記微分プロセスが前記送信値の算出を完了している場合には前記送信値を、完了していない場合には前記現時点のパラメータの一部を、他の組における通信プロセスに送信することと、
他の通信プロセスから送信された前記送信値および前記現時点のパラメータの一部に基づいて、前記現時点のパラメータを更新することと、を含む、学習方法。
【請求項２２】
ニューラルネットワーク用のパラメータを、その一部が他の一部と共有されるとして、または、一部が他の一部と所定の関係を満たすとして、前記パラメータを更新する学習方法。
【請求項２３】
１または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習方法であって、各プロセスは、
ある時点のパラメータと、差分値と、教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することであって、前記差分値は、前記ある時点でのパラメータと、その後のある時点でのパラメータとの差を圧縮した値である、ことと、
前記微分値を圧縮することと、
圧縮された前記微分値と、前記差分値とに基づいて他のプロセスに送信される送信値を算出することと、
他のプロセスから送信された前記送信値と、圧縮された前記送信値と、に基づいて、前記差分値を得ることと、
前記差分値を復元した値に基づいて、前記ある時点でのパラメータを更新することと、を含む、学習方法。
【請求項２４】
１または複数のプロセッサが微分プロセスおよび通信プロセスの組を複数実行することによりニューラルネットワーク用のパラメータを更新する学習方法であって、
前記微分プロセスのそれぞれは、
ある時点のパラメータと、差分値と、教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することであって、前記差分値は、前記ある時点でおパラメータと、その後のある時点でのパラメータとの差を圧縮した値である、ことと、
前記微分値を圧縮することと、
圧縮された前記微分値と、前記差分値とに基づいて他のプロセスに送信される送信値を算出することと、
を含み、
前記通信プロセスのそれぞれは、
組になっている前記微分プロセスが前記送信値の算出を完了している場合には前記送信値を、完了していない場合には前記差分値を他の組における通信プロセスに送信することと、
他の通信プロセスから送信された前記送信値と、組になっている前記微分プロセスが算出した前記送信値と、に基づいて前記差分値を得ることと、
前記差分値を復元した値に基づいて、前記ある時点でのパラメータを更新することと、を含む、学習方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ニューラルネットワーク用のパラメータを更新する学習システム、学習プログラムおよび学習方法に関する。
【背景技術】
【０００２】
画像認識の分野において、一般物体認識と呼ばれる問題がある。これは、画像の中に存在する鳥や車といった物体の種別（クラス）を推定する問題である。近年、一般物体認識問題の認識性能の改善が目覚ましい。これは、とりわけ層数の多い、畳み込みニューラルネットワーク（例えば、非特許文献１）によるところが大きい。
【０００３】
画像認識の分野では、過去様々な認識アルゴリズムが提案されてきたが、学習データが膨大になるにつれ、畳み込みニューラルネットワークが他のアルゴリズムの認識性能を上回る傾向となっている。畳み込みニューラルネットワークは、モデルの表現能力が高い反面、学習データの特徴に過度に特化してしまう「過学習」と呼ばれる問題があることが従来指摘されてきた。しかしながら、近年の学習データ量が、過学習の問題の回避を可能にするレベルにまで増大しつつあることが背景にある。
【先行技術文献】
【特許文献】
【０００４】
【非特許文献１】Ren Wu, Shengen Yan, Yi Shan, Qingqing Dang, and Gang Sun, "Deep Image: Scaling up Image Recognition", arXiv:1501.02876v2.（http://arxiv.org/pdf/1501.02876v2.pdf）
【発明の概要】
【発明が解決しようとする課題】
【０００５】
畳み込みニューラルネットワークは認識性能において大きな利点があるが、学習時間が長大であるという弱点を併せ持っている。学習とは、ニューラルネットワークにおける重みやバイアスといったパラメータを最適化する処理である。ソーシャルネットワークに関するデータや、自動運転に関係するデータなどは、今後とも増加の一途をたどるものの一例であるが、いつか学習時間が膨大になりすぎて、実質的な時間内に学習が終了しない可能性も充分に考えられる。場合によっては、学習に年単位の時間を要することも考えられる。こうなった場合、製品化は現実的ではなく、認識性能で劣る畳み込みニューラルネットワーク以外のアルゴリズムの使用を余儀なくされることにもなり兼ねない。すなわち、ニューラルネットワーク学習の抜本的高速化は、産業応用にとって極めて重要な課題である。
【０００６】
本発明はこのような問題点に鑑みてなされたものであり、本発明の課題は、現実的な時間でニューラルネットワーク用のパラメータを更新できる学習システム、学習プログラムおよび学習方法を提供することである。
【課題を解決するための手段】
【０００７】
本発明の一態様によれば、１または複数のプロセッサから構成され、該１または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、各プロセスは、現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、前記微分値のみならず前記現時点のパラメータも用いて、他のプロセスに送信される送信値を算出することと、前記送信値を他のプロセスに送信することと、他のプロセスから送信された前記送信値に基づいて、前記現時点のパラメータを更新することと、を含む、学習システムが提供される。
この構成によれば、微分値のみならず現時点のパラメータも用いた送信値を他のプロセスに送信するため、通信回数を減らすことができ、短時間でパラメータを更新できる。
【０００８】
また、本発明の別の態様によれば、１または複数のプロセッサから構成され、該１または複数のプロセッサが微分プロセスおよび通信プロセスの組を複数実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、前記微分プロセスのそれぞれは、現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、前記微分値のみならず前記現時点のパラメータも用いて、他の組における通信プロセスに送信される送信値を算出することと、を含み、前記通信プロセスのそれぞれは、組になっている前記微分プロセスが前記送信値の算出を完了している場合には前記送信値を、完了していない場合には前記現時点のパラメータの一部を、他の組における通信プロセスに送信することと、他の通信プロセスから送信された前記送信値および前記現時点のパラメータの一部に基づいて、前記現時点のパラメータを更新することと、を含む、学習システムが提供される。
この構成によれば、通信プロセスと微分プロセスとを分離し、算出が完了した送信値を他の通信プロセスに送信するため、短時間でパラメータを更新できる。
【０００９】
望ましくは、前記通信プロセスのそれぞれは、組になっている前記微分プロセスが前記送信値の算出を完了しているか否かに関わらず、前記送信値または前記現時点のパラメータの一部を他の通信プロセスに送信することにより、送信の度に前記パラメータを更新する。
この構成によれば、送信値の算出が完了しているか否かに関わらず、パラメータを更新できる。
【００１０】
望ましくは、前記組の数は、前記微分プロセスのそれぞれが用いる前記教師データの数と、１回の更新で用いられる前記教師データの数の最適値と、前記微分プロセスが前記送信値を算出するのに要する時間と、に基づいて定められる。
さらに望ましくは、前記微分プロセスのそれぞれが用いる前記教師データの数をＡとし、１回の更新で用いられる前記教師データの数の最適値をＢとするとき、前記組の数は、前記通信プロセスが送信を行う際に、平均Ｂ／Ａ個の前記微分プロセスが前記送信値の算出を完了しているよう、定められる。
この構成によれば、更新で用いられる教師データの数を最適化できる。
【００１１】
また、本発明の別の態様によれば、  １または複数のプロセッサから構成され、該１または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、各プロセスは、ある時点のパラメータと、差分値と、教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することであって、前記差分値は、前記ある時点でのパラメータと、その後のある時点でのパラメータとの差を圧縮した値である、ことと、前記微分値を圧縮することと、圧縮された前記微分値と、前記差分値とに基づいて他のプロセスに送信される送信値を算出することと、他のプロセスから送信された前記送信値と、圧縮された前記送信値と、に基づいて、前記差分値を得ることと、前記差分値を復元した値に基づいて、前記ある時点でのパラメータを更新することと、を含む、学習システムが提供される。
この構成によれば、微分値を圧縮した上で送信するため、通信量を削減できる。
【００１２】
また、本発明の別の態様によれば、１または複数のプロセッサから構成され、該１または複数のプロセッサが微分プロセスおよび通信プロセスの組を複数実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、前記微分プロセスのそれぞれは、ある時点のパラメータと、差分値と、教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することであって、前記差分値は、前記ある時点でおパラメータと、その後のある時点でのパラメータとの差を圧縮した値である、ことと、前記微分値を圧縮することと、圧縮された前記微分値と、前記差分値とに基づいて他のプロセスに送信される送信値を算出することと、を含み、前記通信プロセスのそれぞれは、組になっている前記微分プロセスが前記送信値の算出を完了している場合には前記送信値を、完了していない場合には前記差分値を送信値として他の組における通信プロセスに送信することと、他の通信プロセスから送信された前記送信値と、組になっている前記微分プロセスが算出した前記送信値と、に基づいて前記差分値を得ることと、前記差分値を復元した値に基づいて、前記ある時点でのパラメータを更新することと、を含む、学習システムが提供される。
この構成によれば、微分値を圧縮した上で送信するため、通信量を削減できる。
【００１３】
望ましくは、前記微分値を圧縮することは、前記微分値と、所定行列との乗算である。
さらに望ましくは、前記所定行列は、学習過程において更新される。
所定行列を更新することにより、学習の精度・速度を向上できる。
【００１４】
前記所定行列は、学習過程における過去の前記微分値に基づいて更新されてもよい。
具体例として、前記所定行列は、学習過程における過去の前記微分値に対する主成分分析によって更新されてもよい。
これにより、圧縮した値を復元する際の情報欠如を少なくすることができる。
【００１５】
前記微分値を圧縮することは、分配法則を満たすよう、前記微分値を圧縮することであるのが望ましい。
これにより、圧縮した値どうしを圧縮したままの状態で加算することができる。
【００１６】
前記微分値を圧縮することは、すべての前記微分プロセスからの微分値を行列化したものと、前記所定行列との乗算であってもよい。
【００１７】
望ましくは、前記ニューラルネットワーク用のパラメータの一部が他の一部と共有される、または、パラメータの一部が他の一部と所定の関係を満たす。
この構成によれば、更新されるパラメータの数を減らすことができる。
【００１８】
前記ニューラルネットワーク用のフィルタの１つが他のフィルタの１つと共有されてもよいし、フィルタの１つが他のフィルタと所定の関係を満たしてもよい。
例えば、前記ニューラルネットワーク用のフィルタの１つは、他のフィルタを所定角度回転したもの、点対称としたもの、左右反転したもの、または、上下反転したものであってもよい。
この構成によれば、更新されるパラメータの数を減らすことができる。
【００１９】
前記１または複数のプロセッサとは異なる別のプロセッサが、予め用意された画像を変形して前記教師データを生成する画像処理プロセスを実行するのが望ましい。
これにより画像処理プロセスを分離することができ、学習速度を向上できる。
【００２０】
本発明の別の態様によれば、上記の学習システムを構築するために、１つの前記プロセッサに、前記微分プロセスを実行させる、学習プログラムが提供される。
【００２１】
本発明の別の態様によれば、上記の学習システムを構築するために、１つの前記プロセッサに、前記通信プロセスを実行させる、学習プログラムが提供される。
【００２２】
本発明の別の態様によれば、１または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習方法であって、各プロセスは、現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、前記微分値のみならず前記現時点のパラメータも用いて、他のプロセスに送信される送信値を算出することと、前記送信値を他のプロセスに送信することと、他のプロセスから送信された前記送信値に基づいて、前記現時点のパラメータを更新することと、を含む、学習方法が提供される。
【００２３】
本発明の別の態様によれば、１または複数のプロセッサが微分プロセスおよび通信プロセスの組を複数実行することによりニューラルネットワーク用のパラメータを更新する学習方法であって、前記微分プロセスのそれぞれは、現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、前記微分値のみならず前記現時点のパラメータも用いて、他の組における通信プロセスに送信される送信値を算出することと、を含み、前記通信プロセスのそれぞれは、組になっている前記微分プロセスが前記送信値の算出を完了している場合には前記送信値を、完了していない場合には前記現時点のパラメータの一部を、他の組における通信プロセスに送信することと、他の通信プロセスから送信された前記送信値および前記現時点のパラメータの一部に基づいて、前記現時点のパラメータを更新することと、を含む、学習方法が提供される。
【００２４】
本発明の別の態様によれば、ニューラルネットワーク用のパラメータを、その一部が他の一部と共有されるとして、または、一部が他の一部と所定の関係を満たすとして、前記パラメータを更新する学習方法が提供される。
【００２５】
本発明の別の態様によれば、１または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習方法であって、各プロセスは、ある時点のパラメータと、差分値と、教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することであって、前記差分値は、前記ある時点でのパラメータと、その後のある時点でのパラメータとの差を圧縮した値である、ことと、前記微分値を圧縮することと、圧縮された前記微分値と、前記差分値とに基づいて他のプロセスに送信される送信値を算出することと、他のプロセスから送信された前記送信値と、圧縮された前記送信値と、に基づいて、前記差分値を得ることと、前記差分値を復元した値に基づいて、前記ある時点でのパラメータを更新することと、を含む、学習方法が提供される。
【００２６】
１または複数のプロセッサが微分プロセスおよび通信プロセスの組を複数実行することによりニューラルネットワーク用のパラメータを更新する学習方法であって、前記微分プロセスのそれぞれは、ある時点のパラメータと、差分値と、教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することであって、前記差分値は、前記ある時点でおパラメータと、その後のある時点でのパラメータとの差を圧縮した値である、ことと、前記微分値を圧縮することと、圧縮された前記微分値と、前記差分値とに基づいて他のプロセスに送信される送信値を算出することと、を含み、前記通信プロセスのそれぞれは、組になっている前記微分プロセスが前記送信値の算出を完了している場合には前記送信値を、完了していない場合には前記差分値を他の組における通信プロセスに送信することと、他の通信プロセスから送信された前記送信値と、組になっている前記微分プロセスが算出した前記送信値と、に基づいて前記差分値を得ることと、前記差分値を復元した値に基づいて、前記ある時点でのパラメータを更新することと、を含む、学習方法が提供される。
【発明の効果】
【００２７】
現実的な時間でニューラルネットワーク用のパラメータを更新できる。
【図面の簡単な説明】
【００２８】
【図１】畳み込みニューラルネットワークの構造の一例を模式的に示す図。
【図２】比較例に係る学習手法の手順を示すフローチャート。
【図３】本発明の実施形態に係る学習手法の手順を示すフローチャート。
【図４】図３に示す学習を行う学習システムのハードウェア構成の一例を示すブロック図。
【図５】微分プロセスＡｄの処理を説明するフローチャート。
【図６】通信プロセスＡｔの処理を説明するフローチャート。
【図７】微分プロセスおよび通信プロセスの処理を模式的に説明するタイミング図。
【図８】代表的なフィルタを示す図。
【図９】フィルタの共有を説明する図。
【図１０】シナプスを明示したネットワーク図。
【図１１】第３の実施形態に係る微分プロセスＡｄの処理を説明するフローチャート。
【図１２】第３の実施形態に係る通信プロセスＡｔの処理を説明するフローチャート。
【図１３】行列Ｃを説明する図。
【図１４】エンコード値δｅiを模式的に示す図。
【図１５】第４の実施形態に係る微分プロセスＡｄの処理を説明するフローチャート。
【図１６】第４の実施形態に係る通信プロセスＡｔの処理を説明するフローチャート。
【図１７】第５の実施形態に係る学習システムのハードウェア構成の一例を示すブロック図。
【発明を実施するための形態】
【００２９】
以下、本発明に係る実施形態について、図面を参照しながら具体的に説明する。
【００３０】
（第１の実施形態）
図１は、畳み込みニューラルネットワーク（Convolutional Neural Network：以下、ＣＮＮという）の構造の一例を模式的に示す図である。ＣＮＮは、１または複数の畳み込み部２１およびプーリング部２２の組と、多層ニューラルネットワーク構造２３とを備えている。初段の畳み込み部２１に認識対象の画像が入力される。そして、多層ニューラルネットワーク構造２３から認識結果が出力される。
【００３１】
畳み込み部２１は、入力される画像信号（初段の畳み込み部２１にあっては認識対象の画像、２段目以降の畳み込み部２１にあっては後述する特徴マップ）に対してフィルタ２１ａを適用して畳み込みを行い、次いで非線形写像を行う。フィルタ２１ａは複数ピクセルの要素を持つ重みであり、各重みはバイアスを含んでいてもよい。
【００３２】
プーリング部２２は、畳み込み部２１からの画像信号の解像度を下げるプーリング操作を行い、特徴マップを生成する。
【００３３】
多層ニューラルネットワーク構造２３は、入力層２３１と、１または複数の隠れ層２３２と、出力層２３３とを有する。入力層２３１には最終段のプーリング部２２からの特徴マップが入力される。隠れ層２３２は重みを用いて積和演算を行う。出力層２３３はＣＮＮ処理の最終結果を出力する。
【００３４】
畳み込み部２１におけるフィルタ２１ａの重みや、隠れ層２３２における重みがニューラルネットワーク用のパラメータである。本実施形態では、これらの重みＷを短時間で学習することを目的としている。学習とは、認識対象の画像が入力されたときにＣＮＮが理想の出力を返すよう、重みを更新することをいう。
【００３５】
学習には、認識の対象となる画像と、それに対する理想的な出力値の組である教師データが用いられる。学習に先立ち、ＣＮＮの出力がどの程度理想的な出力値から離れているかを定量化した関数（例えば二乗誤差やクロスエントロピー）を定義し、全教師データ分だけ足し合わせたコスト関数Ｅ（Ｗ）を用意する。コスト関数Ｅ（Ｗ）は重みＷの関数であり、コスト関数Ｅ（Ｗ）が小さいほどよいＣＮＮであるといえる。学習とは、重みＷを更新することで、コスト関数Ｅ（Ｗ）を小さくする処理とも言える。
【００３６】
本実施形態では、コスト関数Ｅ（Ｗ）を最小化する手法として、誤差逆伝搬法と呼ばれる勾配法の一種を使用する。誤差逆伝搬法は重みの更新を多数回繰り返すものであり、一回の更新は下記（１）式で表される。
Ｗ←Ｗ−ｒ＊ｄＷ  ・・・（１）
【００３７】
ｒは学習係数と呼ばれるスカラ量であり、更新の度に小さな値にしてもよいし、常に一定の値であってもよい。ｄＷはコスト関数の重みに対する微分を表したものである。すなわち、重みの更新には、現時点での重みＷと、微分値ｄＷとが用いられる。
【００３８】
ここで、一回の重み更新において、全教師データを用いて算出された微分値ｄＷを用いる方法を「バッチ学習」といい、一部の教師データを用いて算出された微分値ｄＷの近似値を用いる方法を「ミニバッチ学習」という。近年では、ミニバッチ学習を採用することが一般的である。その理由は、ミニバッチ学習は、バッチ学習と比較して、多くの場合収束速度が速く、さらには汎化性能（教師データに含まれない画像に対する識別性能）が高いためである。
【００３９】
通常、ミニバッチ学習を採用する場合、ミニバッチサイズをあらかじめ決定しておく必要がある。ミニバッチサイズとは、１回の重み更新（微分値ｄＷの算出）に使用する教師データの個数を指す。適切なミニバッチサイズは、問題依存ではあるが、少ない時で１、多い時でおよそ１０００、といった事例がある。経験的に、ミニバッチサイズには適切な値があり、このサイズを大きく超えると、収束が遅くなったり、汎化性能が劣化したりするデメリットがあることが知られている。すなわち、必ずしもミニバッチサイズを大きくすればよい、というわけではない。また、適切なミニバッチサイズは、全教師データの数を遥かに下回ることもまたよく知られている。
【００４０】
上記非特許文献１には具体的な学習手法が詳細に記載されているわけではないが、同文献に基づいて本願発明者らが想到した学習手法を、本実施形態の比較例として説明する。
【００４１】
図２は、比較例に係る学習手法の手順を示すフローチャートである。３つのプロセスＡ〜Ｃが並列して実行されるとして説明する。なお、並列して実行されるプロセスＡ〜Ｃ間の通信は規格化されたＭＰＩ（Message Passing Interface）を用いることを想定している。
【００４２】
まず、初期状態として、下記（２）に示すように、プロセスＡ〜Ｃは現時点での重みＷを保持する（ステップＳ１）。重みＷは、プロセス数と等しい数のパーティション１〜３に分割されており、パーティション１〜３はそれぞれ重みＷ１〜Ｗ３である。これらの重みＷ１〜Ｗ３のバイト数はおよそ等しいものとする。パーティションの設定は予め決めておけばよい。
プロセスＡ  Ｗ＝［Ｗ１，Ｗ２，Ｗ３］
プロセスＢ  Ｗ＝［Ｗ１，Ｗ２，Ｗ３］
プロセスＣ  Ｗ＝［Ｗ１，Ｗ２，Ｗ３］  ・・・（２）
【００４３】
続いて、下記（３）に示すように、プロセスＡ〜Ｃは教師データＡ〜Ｃをそれぞれ読み込む（ステップＳ２）。教師データＡ〜Ｃのそれぞれは、ランダムに抽出された１または複数の教師データであり、その数がミニバッチサイズに対応する。例えば、教師データＡ〜Ｃのそれぞれが５つの教師データを含む場合、プロセス数が３つであるので、ミニバッチサイズは１５となる。
プロセスＡ  ｒｅａｄ  教師データＡ
プロセスＢ  ｒｅａｄ  教師データＢ
プロセスＣ  ｒｅａｄ  教師データＣ  ・・・（３）
【００４４】
そして、下記（４）に示すように、プロセスＡ〜Ｃは、逆誤差伝搬法による微分値ｄＷＡ，ｄＷＢ，ｄＷＣをそれぞれ算出する（ステップＳ３）。微分値ｄＷＡは、各パーティションに対応するｄＷＡ１〜ｄＷＡ３から構成される。微分値ｄＷＡ１は重みＷ１および教師データＡに基づいて算出される。他の微分値も同様である。このように、各微分値は、プロセスＡ〜Ｃに対応するインデックスＡ〜Ｃと、パーティション１〜３に対応するインデックス１〜３とを持つ。
プロセスＡ  ｄＷＡ＝［ｄＷＡ１，ｄＷＡ２，ｄＷＡ３］
プロセスＢ  ｄＷＢ＝［ｄＷＢ１，ｄＷＢ２，ｄＷＢ３］
プロセスＣ  ｄＷＣ＝［ｄＷＣ１，ｄＷＣ２，ｄＷＣ３］  ・・・（４）
【００４５】
プロセスＡ〜Ｃのすべてが微分値の算出を完了するのを待って、下記（５）に示すように、プロセスＡ〜Ｃは、ＭＰＩにおける、演算の種類を「加算」とするＲｅｄｕｃｅ命令を発行する（ステップＳ４）。これにより、プロセスＡ〜Ｃにおけるパーティション１の微分値ｄＷＡ１，ｄＷＢ１，ｄＷＣ１がプロセスＡに送信されるとともに足し合わされて微分値ｄＷ１が得られる。他の微分値も同様である。
【００４６】
なお、本比較例において送信されるのは微分値のみであり、重みそのものが送信されるわけではない。このＲｅｄｕｃｅ命令によって１回目の通信が発生する。
プロセスＡ  ｄＷ１＝ｄＷＡ１＋ｄＷＢ１＋ｄＷＣ１
プロセスＢ  ｄＷ２＝ｄＷＡ２＋ｄＷＢ２＋ｄＷＣ２
プロセスＣ  ｄＷ３＝ｄＷＡ３＋ｄＷＢ３＋ｄＷＣ３  ・・・（５）
【００４７】
そして、下記（６）に示すように、プロセスＡは、現時点での重みＷ１および微分値ｄＷ１に基づいて、重みＷ１を更新する。同様にして、プロセスＢ，Ｃは重みＷ２，Ｗ３をそれぞれ更新する（ステップＳ５）。この（６）は上記（１）式と対応している。
プロセスＡ  Ｗ１←Ｗ１−ｒ＊ｄＷ１＝Ｗ１−ｒ（ｄＷＡ１＋ｄＷＢ１＋ｄＷＣ１）
プロセスＢ  Ｗ２←Ｗ２−ｒ＊ｄＷ２＝Ｗ２−ｒ（ｄＷＡ２＋ｄＷＢ２＋ｄＷＣ２）
プロセスＣ  Ｗ３←Ｗ３−ｒ＊ｄＷ３＝Ｗ３−ｒ（ｄＷＡ３＋ｄＷＢ３＋ｄＷＣ３）
・・・（６）
【００４８】
最後に、下記（７）に示すように、プロセスＡ〜ＣはＭＰＩにおけるＡｌｌＧａｔｈｅｒ命令を発行する（ステップＳ６）。これにより、重みＷ１〜Ｗ３は全プロセスＡ〜Ｃに分配される。ＡｌｌＧａｔｈｅｒ命令によって２回目の通信が発生する。
プロセスＡ  Ｗ←［Ｗ１，Ｗ２，Ｗ３］
プロセスＢ  Ｗ←［Ｗ１，Ｗ２，Ｗ３］
プロセスＣ  Ｗ←［Ｗ１，Ｗ２，Ｗ３］  ・・・（７）
【００４９】
以上により１回の重み更新が完了し、プロセスＡ〜Ｃは初期状態に戻る。この一連の処理を、所定回数だけ反復して処理を終了する（ステップＳ７）。なお、終了する条件は、コスト関数Ｅ（Ｗ）が収束した時点や、検証を行って認識の精度が向上しなくなった時点であってもよい。  
【００５０】
この比較例においては、次のような問題点が挙げられる。
【００５１】
第１に、最も微分値の算出が遅いプロセスに学習速度が依存するという問題がある。Ｒｅｄｕｃｅ命令（ステップＳ４）は、すべてのプロセスＡ〜Ｃが微分値の算出（ステップ３）を完了するのを待って発行する必要があるためである。
【００５２】
第２に、ネットワーク構造が大きくなるほど学習時間が増大するという問題がある。ネットワーク構造が大きくなれば、順伝搬および誤差逆伝搬による時間がかかるために微分値算出の時間が増えるとともに、重みＷの数が増えて通信に時間がかかるためである。
【００５３】
第３に、プロセス数を増やしても学習を高速化できないという問題がある。ステップＳ２での説明から分かるように、プロセス数を増やすとミニバッチサイズが増える。しかしながら、ミニバッチサイズには適切な値があるため、プロセス数を増やすとミニバッチサイズが適切な値を上回り、結果としてＣＮＮの学習時間の増大や認識性能の劣化が起こるおそれがある。
【００５４】
また、上記の処理手順においては、２回の通信（Ｒｅｄｕｃｅ命令とＡｌｌＧａｔｈｅｒ命令）が必要であることも学習を高速化できないことにつながっている。
【００５５】
そこで、本実施形態においては、最も微分値の算出が遅いプロセスに学習速度が依存することなく、ネットワーク構造が大きくなっても学習時間がそれほど増大せず、プロセス数を増やすことで高速化でき、通信回数を少なくできる学習手法を提案する。
【００５６】
図３は、本発明の実施形態に係る学習手法の手順を示すフローチャートである。ステップＳ１〜Ｓ３は図２と共通しており、以下では相違点を中心に説明する。
【００５７】
微分値が算出された後、下記（８）に示すように、プロセスＡ〜Ｃは、通信するアレイの準備として、他のプロセスに送信される送信値ＶＡ〜ＶＣをそれぞれ算出する（ステップＳ１１）。
プロセスＡ  ＶＡ＝［Ｗ１−ｒ＊ｄＷＡ１，−ｒ＊ｄＷＡ２，−ｒ＊ｄＷＡ３］
プロセスＢ  ＶＢ＝［−ｒ＊ｄＷＢ１，Ｗ２−ｒ＊ｄＷＢ２，−ｒ＊ｄＷＢ３］
プロセスＣ  ＶＣ＝［−ｒ＊ｄＷＣ１，−ｒ＊ｄＷＣ２，Ｗ３−ｒ＊ｄＷＣ３］
・・・（８）
【００５８】
次いで、下記（９）に示すように、プロセスＡ〜Ｃは、ＭＰＩにおける、演算の種類を「加算」とするＡｌｌＲｅｄｕｃｅ命令を発行する（ステップＳ１２）。これにより、送信値ＶＡ〜ＶＣは他のプロセスに送信されて足し合わされて、更新された重みＷが得られる。ＡｌｌＲｅｄｕｃｅ命令により１回目の通信が発生する。
プロセスＡ  Ｗ←ＶＡ＋ＶＢ＋ＶＣ＝
［Ｗ１−ｒ（ｄＷＡ１＋ｄＷＢ１＋ｄＷＣ１），
Ｗ２−ｒ（ｄＷＡ２＋ｄＷＢ２＋ｄＷＣ２），
Ｗ３−ｒ（ｄＷＡ３＋ｄＷＢ３＋ｄＷＣ３）］
プロセスＢ  Ｗ←ＶＡ＋ＶＢ＋ＶＣ
プロセスＣ  Ｗ←ＶＡ＋ＶＢ＋ＶＣ  ・・・（９）
【００５９】
この（９）は、上記比較例における（６），（７）と等価である。このように、本実施形態の手順によれば、１回の通信で比較例と同じ結果を得ることができる。
【００６０】
なお、ステップＳ１１において、プロセスＡ〜Ｃは下記（８’）に示す送信値ＶＡ〜ＶＣを算出してもよい。
プロセスＡ  ＶＡ＝
［Ｗ１／３−ｒ＊ｄＷＡ１，Ｗ２／３−ｒ＊ｄＷＡ２，Ｗ３／３−ｒ＊ｄＷＡ３］
プロセスＢ  ＶＢ＝
［Ｗ１／３−ｒ＊ｄＷＢ１，Ｗ２／３−ｒ＊ｄＷＢ２，Ｗ３／３−ｒ＊ｄＷＢ３］
プロセスＣ  ＶＣ＝
［Ｗ１／３−ｒ＊ｄＷＣ１，Ｗ２／３−ｒ＊ｄＷＣ２，Ｗ３／３−ｒ＊ｄＷＣ３］
・・・（８’）
【００６１】
すなわち、送信値ＶＡ〜ＶＣのパーティション１には、重みＷ１をプロセス数で除したＷ１／３を含んでいてもよい。他のパーティションも同様である。これらの送信値ＶＡ〜ＶＣからも上記（９）と同様の重みＷが得られる。
【００６２】
要するに、ＡｌｌＲｅｄｕｃｅ命令で上記（９）に示す重みＷが得られるよう、送信値ＶＡは微分値ｄＷＡ１，ｄＷＡ２，ｄＷＡ３および重みＷ１（必要に応じて重みＷ２，Ｗ３）から算出され、送信値ＶＢは微分値ｄＷＢ１，ｄＷＢ２，ｄＷＢ３および重みＷ２（必要に応じて重みＷ１，Ｗ３）から算出され、送信値ＶＣは微分値ｄＷＣ１，ｄＷＣ２，ｄＷＣ３および重みＷ３（必要に応じて重みＷ２，Ｗ３）から算出されればよい。
【００６３】
比較例との大きな相違点として、送信値は微分値（ｄＷＡ１など）のみならず現時点での重み（Ｗ１など）も含まれており、微分値および現時点での重みの両方が他のプロセスに送信される。そのため、１回の通信だけで重みＷを更新できる。
【００６４】
図４は、図３に示す学習を行う学習システムのハードウェア構成の一例を示すブロック図である。学習システムはバスによって接続されたｎ（ｎは１以上の整数）個のノード１から構成される。そして、任意のノード１間でデータ通信が可能である。以下の説明では、ノード１間の通信速度の理論値は一定であるとするが、そうでない場合でも本手法を適用可能である。
【００６５】
ノード１は、例えば１台の計算機である。ノード１は、１つのＣＰＵ（Central Processing Unit）１１と、３つのＧＰＵ（Graphics Processing Unit）１２ａ〜１２ｃと、ストレージ１３とを有する。ｋ番目のノード１におけるストレージ１３には、全教師データをｎセットに分割したうちのｋ番目のセットが格納されている。各セットに含まれる教師データの数は、適切なミニバッチサイズ以上である。
【００６６】
なお、図４はあくまで一例にすぎず、例えばノード１内のＣＰＵ数やＧＰＵ数は任意である。また、ストレージは各ノードに対して外付けであってもよいし、全ノードからアクセス可能な１つのストレージに全教師データが格納されていてもよく、いずれにしても、各ノード１は教師データを高速に扱うことができる。
【００６７】
１つのノード１は複数のプロセスを並列に処理できる。ここで、「ノード」とはハードウェアとしての計算機の単位であるのに対し、「プロセス」は各ノード内のソフトウェアとして並列実行可能なプログラムの単位である。本実施形態では、図３に示す処理を微分プロセスと通信プロセスとに分けて行う点が、比較例とは異なる。
【００６８】
ＧＰＵ１２ａ〜１２ｃはそれぞれ微分プロセスＡｄ〜Ｃｄを実行する。微分プロセスＡｄ〜Ｃｄの具体的な処理内容は、図３に示す初期状態（ステップＳ１）、データ読み込み（ステップＳ２）、微分値算出（ステップＳ３）および送信値算出（ステップＳ１１）であり、これらを繰り返し行う。
【００６９】
ＣＰＵ１１は、微分プロセスＡｄ〜Ｃｄとそれぞれ組みになっている通信プロセスＡｔ〜Ｃｔを実行する。通信プロセスＡｔ〜Ｃｔの具体的な処理内容は、図３に示すＡｌｌＲｅｄｕｃｅ命令（ステップＳ１２）である。
【００７０】
このように、ＧＰＵ１２ａ〜１２ｃが微分プロセスＡｄ〜Ｃｄを実行し、ＣＰＵ１１が通信プロセスＡｔ〜Ｃｔを実行するのが望ましい。微分プロセスには、畳み込みや行列積の演算といった、少なくない処理量が要求される。こういった処理をＧＰＵ１２ａ〜１２ｃが行うことで、処理を高速化できる。また、ＧＰＵ１２ａ〜１２ｃが通信プロセスを実行しないことで、ＣＰＵとＧＰＵとの間のメモリ転送を削減でき、単位時間当たりの通信プロセス間の通信の発生回数を高くできる。
【００７１】
ここで、本実施形態の大きな特徴として、通信プロセスＡｔ〜ＣｔによるＡｌｌＲｅｄｕｃｅ命令は、微分プロセスＡｄ〜Ｃｄによる送信値算出（ステップＳ１１）の完了を待って行う必要はなく、連続的に発行される。これにより学習が高速で行われることを後に詳しく述べる。
【００７２】
なお、本明細書において「微分プロセスが教師データを読み込む」などと記載しているが、実際にはノード１、より具体的にはＣＰＵ１１やＧＰＵ１２ａ〜ＧＰＵ１２ｃといった各プロセッサが、微分プロセスに対応するプログラムを実行することによって、読み込みなどの処理を行っている。微分プロセスが教師データを読み込む処理を含んでいるとも言える。
【００７３】
なお、図示していないが、別のノード１におけるＧＰＵ１２ａ〜１２ｃは微分プロセスＤｄ，Ｅｄ，Ｆｄを実行し、ＣＰＵ１１は通信プロセスＤｔ，Ｅｔ，Ｆｔを実行する。他のノード１も同様に、微分プロセスおよび通信プロセスを実行する。各通信プロセスはＡｌｌＲｅｄｕｃｅ命令によって他の通信プロセスと通信するが、当該他の通信プロセスが同一ノード１内にあっても他のノード１内にあっても相違はない。
【００７４】
以下、微分プロセスＡｄと通信プロセスＡｔとの組について説明するが、特に断らない限り、他の組についても同様である。
【００７５】
微分プロセスＡｄと通信プロセスＡｔとの間で互いに転送可能な変数Ｆｌａｇ，Ａｒｒａｙ０，Ａｒｒａｙ１，Ａｒｒａｙ２を定義する。変数Ｆｌａｇは２値変数であり、初期値は０値である。変数Ａｒｒａｙ０〜Ａｒｒａｙ２は、重みＷと同サイズのアレイである。変数Ａｒｒａｙ０には、現時点での重みＷ（初めはその初期値Ｗｉｎｉ）が格納される。
【００７６】
図５は、微分プロセスＡｄの処理を説明するフローチャートである。微分プロセスＡｄは次の処理を含んでいる。
【００７７】
まず、初期状態として、微分プロセスＡｄは、変数Ａｒｒａｙ０に格納されている現時点での重みＷを取得する（ステップＳ１’）。続いて、微分プロセスＡｄはストレージ１３から教師データを読み込む（ステップＳ２）。読み込む教師データの数は、微分値を算出した際にＧＰＵ１２ａのメモリに載る個数とする。通常、ＧＰＵ１２ａのメモリはそれほど大きくないため、一度に読み込める教師データの数は少なく、適切なミニバッチサイズよりも小さいものとする。
【００７８】
そして、微分プロセスＡｄは微分値ｄＷを算出し（ステップＳ３）、送信値ＶＡを算出する（ステップＳ１１）。その後、微分プロセスＡｄは送信値ＶＡを変数Ａｒｒａｙ１に格納し（ステップＳ２１）、変数Ｆｌａｇを１値に設定する（ステップＳ２２）。すなわち、変数Ｆｌａｇが１値に設定されていれば、送信値ＶＡの算出が完了していることを意味する。
【００７９】
以上の処理を１サイクルとして、微分プロセスＡｄはこのサイクルを繰り返す。すなわち、上記（８）に基づいて、微分プロセスＡｄは送信値ＶＡを算出する。他の微分プロセスＢｄなども同様である。ここで、微分プロセスＡｄによる１サイクルの処理に要する時間は、次に説明する通信プロセスＡｔによる１サイクルの処理時間より長い。すなわち、一般的なＣＮＮの分散システムでは、１回の微分計算に必要な時間と、１回の重み転送に必要な時間とを比較すると、前者が大きい。これは畳み込み演算の処理負荷が大きいことに由来する。それでも、微分プロセスＡｄは、通信プロセスＡｔと非同期で、図５の処理を繰り返せばよい。
【００８０】
なお、図５では微分プロセスＡｄが重みＷや微分値ＶＡを直接書き換えることとしたが、実装上は、ポインタの受け渡しなどで代用してもよい。
【００８１】
図６は、通信プロセスＡｔの処理を説明するフローチャートである。通信プロセスＡｔは次の処理を含んでいる。
【００８２】
通信プロセスＡｔは定期的にＡｌｌＲｅｄｕｃｅ命令を発行してある値を他の通信プロセスに送信するが（図３のステップＳ１２）、送信する値は、ＡｌｌＲｅｄｕｃｅ命令発行時の変数Ｆｌａｇの値に応じて異なる。
【００８３】
変数Ｆｌａｇが１値である場合（ステップＳ３０のＹＥＳ）、つまり、微分プロセスＡｄが送信値ＶＡの算出を完了している場合、通信プロセスＡｔはその送信値ＶＡを他の通信プロセスＢｔ，Ｃｔ，Ｄｔ・・・に送信する。より具体的には、通信プロセスＡｔは変数Ｆｌａｇを０値に戻した上で（ステップＳ３１）、ＡｌｌＲｅｄｕｃｅ命令を発行して変数Ａｒｒａｙ１（図５のステップＳ２１によって送信値ＶＡが格納されている）を他の通信プロセスＢｔ，Ｃｔ，Ｄｔ・・・に送信する（ステップＳ３２ａ）。
【００８４】
一方、変数Ｆｌａｇが０値である場合（ステップＳ３０のＮＯ）、つまり、微分プロセスＡｄが送信値ＶＡの算出を完了していない場合、通信プロセスＡｔは現時点での重みＷの一部を他の通信プロセスＢｔ，Ｃｔ，Ｄｔ・・・に送信する。より具体的には、通信プロセスＡｔは下記（１０）のように変数Ａｒｒａｙ２を設定する（ステップＳ４１）。
Ａｒｒａｙ２←［Ａｒｒａｙ０（１），０，０，・・・］  ・・・（１０）
【００８５】
ここで、Ａｒｒａｙ０（１）は、変数Ａｒｒａｙ０の１番目のパーティションを意味する。すなわち、Ａｒｒａｙ２の１番目のパーティションには変数Ａｒｒａｙ０（現時点での重みＷ）の１番目のパーティションＷ１が格納され、他のパーティションには０値が格納される。そして、通信プロセスＡｔはＡｌｌＲｅｄｕｃｅ命令を発行して変数Ａｒｒａｙ２を他の通信プロセスＢｔ，Ｃｔ，Ｄｔ・・・に送信する（ステップＳ４２ａ）。
【００８６】
ステップＳ３２ａ，Ｓ４２ａにおいて、通信プロセスＡｔは変数Ａｒｒａｙ１またはＡｒｒａｙ２を送信するとともに、他の通信プロセスＢｔ，Ｃｔ，Ｄｔ・・・から変数Ａｒｒａｙ１またはＡｒｒａｙ２を受信する。より詳しくは、通信プロセスＡｔは、送信値ＶＡの算出が完了している微分プロセスと組になっている通信プロセスからは変数Ａｒｒａｙ１を受信し、送信値ＶＡの算出が完了していない微分プロセスと組になっている通信プロセスからは変数Ａｒｒａｙ２を受信する。例えば、通信プロセスＡｔは、通信プロセスＢｔから、Ａｒｒａｙ１＝ＶＢまたはＡｒｒａｙ２＝［０，Ａｒｒａｙ０（２），０・・・］を受信する。他の通信プロセスも同様である。
【００８７】
そして、通信プロセスＡｔにおける変数Ｆｌａｇが１値である場合には、通信プロセスＡｔは、ＡｌｌＲｅｄｕｃｅ命令に基づいて、自身の変数Ａｒｒａｙ１と、他のプロセスＢｔ，Ｃｔ，Ｄｔ・・・から受信した変数Ａｒｒａｙ１またはＡｒｒａｙ２とを加算した結果を変数Ａｒｒａｙ１に格納する（ステップＳ３２ｂ）。変数Ａｒｒａｙ１には微分値が含まれているため、重みＷが更新される。さらに、通信プロセスＡｔは、変数Ａｒｒａｙ１を変数Ａｒｒａｙ０に格納することで（ステップＳ３３）、変数Ａｒｒａｙ０には更新された最新の重みＷが格納され、初期状態となる。
【００８８】
一方、通信プロセスＡｔにおける変数Ｆｌａｇが０値である場合には、通信プロセスＡｔは、ＡｌｌＲｅｄｕｃｅ命令に基づいて、自身の変数Ａｒｒａｙ２と、他のプロセスＢｔ，Ｃｔ，Ｄｔ・・・から受信した変数Ａｒｒａｙ１またはＡｒｒａｙ２とを加算した結果を変数Ａｒｒａｙ２に格納する（ステップＳ４２ｂ）。変数Ａｒｒａｙ１には微分値が含まれているため、重みＷが更新される。さらに、通信プロセスＡｔは、変数Ａｒｒａｙ２を変数Ａｒｒａｙ０に格納することで（ステップＳ４３）、変数Ａｒｒａｙ０には最新の重みＷが格納され、初期状態となる。
【００８９】
以上を、学習が完了するまで繰り返す。なお、ステップＳ３２ａとＳ３２ｂ、および、Ｓ４２ａとＳ４２ｂを別個に説明したが、実際には両者はＡｌｌＲｅｄｕｃｅ命令により一括に処理される。
【００９０】
このように、微分プロセスＡｄが送信値ＶＡの算出を完了しているか否かに関わらず、他の微分プロセスで算出された微分値を受信することで、通信プロセスＡｔがＡｌｌＲｅｄｕｃｅ命令を発行する度に、重みＷを更新できる。
【００９１】
上述のように、微分プロセスＡｄによる１サイクルの処理に要する時間は、通信プロセスＡｔによる１サイクルの処理時間より長いが、微分プロセスＡｄによる処理速度に依存することなく、通信プロセスＡｔの処理速度で学習できる。
【００９２】
図７は、微分プロセスおよび通信プロセスの処理を模式的に説明するタイミング図である。同図では、６個の微分プロセスＡｄ〜Ｆｄが図５に示す処理を行っている。微分プロセスの適切な数については後述する。図の矢印先端が、送信値の算出が完了した時刻を示しており、例えば、微分プロセスＣｄは、時刻ｔ１，ｔ３，ｔ５で送信値の算出を完了している。
【００９３】
各微分プロセスＡｄ〜Ｆｄの１サイクルに要する時間（言い換えると、送信値を算出するのに要する時間）は互いにそろっている必要はなく、ノードの性能に応じて異なり得るし、読み込まれた教師データによっても異なり得る。例えば、微分プロセスＡｄは処理速度が速いが、微分プロセスＢｄは処理速度が遅い。また、微分プロセスＥｄは、送信値を算出するのに要する時間が、時刻ｔ２〜ｔ４という長い時間であることもあれば、時刻ｔ４〜ｔ５という短い時間であることもある。
【００９４】
一方、６個の通信プロセスＡｔ〜Ｆｔは時刻ｔ１〜ｔ５のそれぞれにおいて定期的に図６に示すＡｌｌＲｅｄｕｃｅ命令を発行する。
【００９５】
例えば、時刻ｔ１において、３つの微分プロセスＡｄ，Ｃｄ，Ｄｄは送信値の算出が完了しているため、対応する通信プロセスＡｔ，Ｃｔ，Ｄｔは変数Ａｒｒａｙ１を通信プロセスＡｔ〜Ｆｔに送信する（図６のステップＳ３２ａ）。一方、同時刻において、他の３つの微分プロセスＢｄ，Ｅｄ，Ｆｄは送信値の算出が完了していないため、対応する通信プロセスＢｔ，Ｅｔ，Ｆｔは変数Ａｒｒａｙ２を通信プロセスＡｔ〜Ｆｔに送信する（図６のステップＳ４２ａ）。
【００９６】
通信プロセスＡｔ，Ｃｔ，Ｄｔにおける変数Ａｒｒａｙ１（上記（７）に基づく）、および、通信プロセスＢｔ，Ｅｔ，Ｆｔにおける変数Ａｒｒａｙ２（上記（９）に基づく）は、以下のようになる。
2016197389.tif 000003
【００９７】
これらがＡｌｌＲｅｄｕｃｅ命令に基づいて加算された結果（ステップＳ３２ｂ）、通信プロセスＡｔにおける変数Ａｒｒａｙ１は下記（１１）のようになる。
At Array1 = [W1 −r(dWA1 + dWC1 + dWD1),
W2 − r(dWA2 + dWC2 + dWD2),
W3 − r(dWA3 + dWC3 + dWD3),
W4 − r(dWA4 + dWC4 + dWD4),
W5 − r(dWA5 + dWC5 + dWD5),
W6 − r(dWA6 + dWC6 + dWD6)] ・・・（１１）
【００９８】
これは、微分プロセスＡｄ，Ｃｄ，Ｄｄが読み込んだ教師データを用いた場合の上記（９）と等価である。ＡｌｌＲｅｄｕｃｅ命令によれば、通信プロセスＣｔ，Ｄｔにおける変数Ａｒｒａｙ１および通信プロセスＢｔ，Ｅｔ，Ｆｔにおける変数Ａｒｒａｙ２も当然上記（１１）と同じ結果となる。このようにして、時刻ｔ１において、微分プロセスＢｄ，Ｅｄ，Ｆｄは送信値の算出が完了していないにも関わらず、重みＷが更新される。他の時刻ｔ２〜ｔ５のそれぞれにおいても、一部の微分プロセスが送信値の算出を完了しており、それによって重みＷが更新される。
【００９９】
微分プロセスの数は次のようにして決定される。各微分プロセスが１度にＡ個の教師データを読み込むとする。また、最適なミニバッチサイズをＢ個とする。この場合、ＡｌｌＲｅｄｕｃｅ命令が発行される周期で、平均Ｂ／Ａ個の微分プロセスが送信値の算出を完了しているよう、微分プロセスの数を調整する。
【０１００】
簡単な例として、各微分プロセスが１度に１０個の教師データを読み込み、最適なミニバッチサイズが１００個であるとする。さらに、平均して、各微分プロセスはＡｌｌＲｅｄｕｃｅ命令が発行される周期の５倍の時間をかけて、送信値の算出が完了するとする。この場合、５０個の微分プロセスを設ければよい。
【０１０１】
こうすることで、ＡｌｌＲｅｄｕｃｅ命令が発行されるタイミングでは平均して１０（＝５０／５）個の微分プロセスが送信値の算出を完了している。そして、各送信値の算出には１０個の教師データが用いられているので、合計１００（＝１０＊１０）個すなわち最適なミニバッチサイズの教師データが１回の更新に用いられることになる。
【０１０２】
なお、ミニバッチサイズは最適な数ではなくても、ある範囲内であれば大きな問題とはならないことが知られている。よって、ＡｌｌＲｅｄｕｃｅ命令が発行されるタイミングで平均して上記個数の微分プロセスが送信値の算出を完了していればよい。
【０１０３】
この手法によれば、学習速度は、微分プロセスが送信値を算出するのに要する時間には一切依存しない。全微分プロセスのうちの一部が送信値の算出を完了していればよいためである。特に、処理速度が遅い微分プロセスがあったとしても、その微分プロセスによって学習の速度が低下することはなく、比較例における第１の問題点が解決される。
【０１０４】
さらに、各微分プロセスの処理速度が高速でない場合、例えば処理プログラムが最適でない場合や、処理性能が高くない旧式のノード１を用いる場合には、単にノード１を増やすことによって微分プロセス数を増やせばよい。微分プロセス数を多くすることで、たとえ個々の微分プロセスが遅かったとしても、ＡｌｌＲｅｄｕｃｅ命令の発行時に、いずれかの微分プロセスが送信値の算出を完了しているためである。これにより、比較例における第３の問題点が解決される。  
【０１０５】
このように、第１の実施形態では、微分プロセスと通信プロセスとを分離し、微分プロセスの処理が完了するのを待たずに、通信プロセスがＡｌｌＲｅｄｕｃｅ命令を発行する。そのため、ニューラルネットワーク用パラメータの学習に要する時間を短縮でき、現実的な時間で同パラメータを生成できる。
【０１０６】
（第２の実施形態）
図１に示すように、ＣＮＮには通常多数のフィルタ２１ａが用いられる。しかしながら、たとえ各フィルタの重みが独立して学習されたとしても、似たようなフィルタ２１ａが少なからず現れることが知られている。
【０１０７】
図８は、代表的なフィルタを示す図である。図８（ａ），（ｂ）に示すように縦方向のエッジに反応するフィルタや、図８（ｃ），（ｄ）に示す世に横方向のエッジに反応するフィルタが、完全に同一でないにしても、多く現れる。異なる層で似たようなフィルタが現れることもあるし、同一層で似たようなフィルタが現れることもある。これは、哺乳類の視覚のメカニズムに同様の機能が獲得されていることからも分かる通り、画像のエッジ情報が画像に認識において重要な役割を持つためである。
【０１０８】
そこで、本実施形態では、すべてのフィルタにおける重みを独立に学習するのではなく、予めフィルタを共有しておくこととする。これにより、重みの数を減らすことができ、さらに学習時間を短縮できる。
【０１０９】
図９は、フィルタの共有を説明する図である。同図における白抜きの四角は画像信号を、矢印はフィルタを示しており、ある画像信号にフィルタを適用して畳み込みを行って、新たな画像信号を生成することを意味している。なお、図１に示すように、畳み込みの後にプーリングが行われるが、簡略化のために図示を省略している。
【０１１０】
そして、同一のシンボルが付されたフィルタは、全く同じ重みを持つ同一のフィルタである。当然初期値も同一であるし、学習による更新量も同一である。一方、シンボルが付されていないフィルタは独立のフィルタであり、独立して重みが学習される。
【０１１１】
図９には全部で１２個のフィルタがあるが、黒塗り四角が付された２つのフィルタ、２本縦線が付された３つのフィルタ、三角が付された２つのフィルタおよび丸が付された３つのフィルタが共有されるため、実際には６つのフィルタのみを学習すればよい。
【０１１２】
どのフィルタを共有するかは、学習の前に決定しておく必要がある。例えば、乱数を用いて割り当てを行うことが考えられる。乱数を使ったフィルタの割り当ての具体例を以下に挙げる。  
【０１１３】
まず、ＣＮＮ構造を決定する。次に、共有されるフィルタ（フリーフィルタと呼ぶ）を準備し、各画素の重みを乱数などにより初期化する。フリーフィルタの枚数Ｍは、ＣＮＮが必要とするフィルタ枚数以下である。続いて、ＣＮＮ構造における各フィルタに、Ｍ枚のフリーフィルタのうちの１枚をランダムに復元抽出する。これにより、フィルタの割り当てが完了する。
【０１１４】
フィルタの割り当てには制約を設けてもよい。例えば、共有させたくないフィルタに対しては、非復元抽出を行うことで共有を避けることが可能となる。あらかじめ準備したフリーフィルタのうち、割り当てのなかったものについては、単純に除外すればよい。これらは学習には一切使用されない。
【０１１５】
また、フィルタ共有として、あるフィルタと他のフィルタを完全に同一として共有するだけでなく、あるフィルタと他のフィルタとが所定の関係を満たすようにしていてもよい。言い換えると、あるフィルタに基づいて他のフィルタを生成できるようにしてもよく、例えば、あるフィルタを所定角度（例えば９０度、１８０度、２７０度）回転したり、点対称にしたり、左右反転したり、上下反転したりして、他のフィルタとしてもよい。例えば、図９において、三角が付されたフィルタを、丸が付されたフィルタを９０度回転したものとすることで、学習すべき重みをさらに減らすことができる。
【０１１６】
図９ではフィルタを共有することを示したが、シナプス単位で重みを共有してもよい。
【０１１７】
図１０（ａ）は、４×４画素から構成される画像信号（入力画像）に対して、２×２画素から構成されるフィルタを適用して新たな画像信号（出力画像）を生成する様子を示す図である。これは、入出力画像を個々の画素に分解して図１０（ｂ）に示すように展開できる。これはシナプスを明示したネットワーク図の一部である。各シナプスが重みを有する。この例では２×２画素のフィルタを使用しているため、４つの独立なシナプス１〜４が存在している（実線、点線、破線、一点破線）。
【０１１８】
同じ重みを有するシナプスが同一の特徴マップ内に複数回使われていることを、重み共有（weight sharing）という。重み共有には、シフト不変性の効果と、パラメータ数増大を回避する（つまり過学習を発生しにくくさせる）効果がある。
【０１１９】
ＣＮＮの（畳み込み部２１および多層ニューラルネットワーク構造２３を含む）すべての層のすべての積和演算部分を、図１０（ｂ）のように展開してシナプスを明示的に記載したとき、（フィルタ単位ではなく）任意のいくつかのシナプスを共有してもよい。これにより、シナプスの単位での自由度が低減できる。この低減された自由度を持つ重みの集合をフリーウェイトと呼ぶ。フリーウェイトの割り当てもまた、フリーフィルタの時と同じように、復元抽出や非復元抽出を使って行うことが可能である。
【０１２０】
また、シナプスの共有として、あるシナプスの重みと他のシナプスの重みとを完全に同一として共有するだけでなく、ある重みと他の重みとが所定の関係を満たすようにしてもよい。言い換えると、ある重みに基づいて他の重みを算出できるようにしてもよく、例えば、ある重みａと他の重みｂが、ａ＝３ｂ＋２なる関係を満たすようにしてもよい。このようにしても、フリーウェイとの数を減らすことができる。
【０１２１】
第１の実施形態で説明したように、複数のプロセスに分散して学習を行う場合、実際に通信されるのはフリーウェイトやフリーフィルタである。そのため、これらの個数を調整することで、学習速度を制御することができる。この際、ＣＮＮ構造そのものは変化させる必要はない。ＣＮＮ構造を改造するには実装面で多くの工数を要するが、フリーウェイトやフリーフィルタの数を調整するのは、学習前の割り当てを行うのみでよく、簡便である。
【０１２２】
また、パラメータ数は通信速度を決定し、通信速度が学習時間を決定する方式であるため、パラメータ数をどの程度にすれば学習がどの程度の時間で終了するかはあらかじめ見積もることが可能である。具体的には、フリーウェイトの数を１／α（１＜α）倍とし、微分プロセスおよび通信プロセスの組の数をα倍にすることで、ＣＮＮ構造が同一であっても学習速度をα倍にできる。この場合、ミニバッチサイズが変動することもない。
【０１２３】
よって、ネットワーク構造が大きくなって重みＷの数が増えても、フリーウェイとの数を調整することで、学習時間の増大を抑えられる。これにより、比較例における第２の問題点が解決される。
【０１２４】
このように、第２の実施形態では、ＣＮＮ構造における重みの一部を共有する。そのため、学習すべき重みの数が減って通信速度が高くなるため、より短い時間で学習できる。
【０１２５】
（第３の実施形態）
次に説明する第３の実施形態では、微分値そのものではなく、微分値をエンコードして圧縮した上で他のノードに渡すことで、通信量を削減するものである。
【０１２６】
微分値の圧縮手法の考え方を説明する。ニューラルネットワークにおける重みを確率的勾配法によって学習・更新すると、重みは初期値から徐々に変化していき局所解へ収束する。学習過程にある重みの移動ベクトルは、反復ごとに多少の差異はあるものの、少なからず相関していることが多い。すなわち、重みの変遷はある特定の方向に片寄っており、かつ、それとは異なる方向に揺らぐ成分を持つ。
【０１２７】
本実施形態では、重みの変遷の主要な方向成分を抽出し、その方向への移動ベクトルのみを、計算ノード間で通信する。つまり、コスト関数の微分を、重みの変遷に主要な成分と、非主要な成分とに分離し、前者のみを通信することで、コスト関数を安定的に低下させながらも、通信変数の容量を低減させ学習時間を短縮させる。以下、詳細に説明する。
【０１２８】
エンコード関数ｅｎｃを用いてあるベクトルδをエンコードすることによってエンコード値δｅを得ることを下記（１２）式で表す。
δｅ＝ｅｎｃ（δ，φｅ）  ・・・（１２）
【０１２９】
ここで、ベクトルδの次元（要素数）よりエンコード値δｅの次元が低ければ、ベクトルδが圧縮されてデータ量を減らすことができる。なお、φｅはエンコードに用いるパラメータであり、詳しくは後述する。
【０１３０】
また、デコード関数ｄｅｃを用いてベクトルδ’をデコードすることによってデコード値δｄを得ることを下記（１３）式で表す。
δｄ＝ｄｅｃ（δ’，φｄ）  ・・・（１３）
φｄはエンコードに用いるパラメータであり、詳しくは後述する。
【０１３１】
エンコードされたベクトルどうしをＡｌｌＲｅｄｕｃｅ命令などで足し合わるためには、エンコード関数ｅｎｃは下記（１４）式に示す分配法則を満たすのが望ましい。
ｅｎｃ（δ＋λ，φｅ）＝ｅｎｃ（δ，φｅ）＋ｅｎｃ（λ，φｅ）  ・・・（１４）
【０１３２】
また、重み更新の主要な情報を欠落させないためには、ベクトルδをエンコードして得られるエンコード値をデコードした場合に元のベクトルδが復元される必要があり、すなわち、エンコード関数ｅｎｃおよびデコード関数ｄｅｃは、下記（１５）式を満たさなければならない。
δ≒ｄｅｃ（ｅｎｃ（δ，φｅ），φｄ）  ・・・（１５）
【０１３３】
なお、ニューラルネットワーク用の重み学習のためには、厳密に元のベクトルδが復元されなくてもよい。適切なエンコード関数ｅｎｃ、デコード関数ｄｅｃおよびパラメータφｅ，φｄを用いることで、上記（１４），（１５）式を満たす圧縮を行うことができる。
【０１３４】
エンコード関数ｅｎｃ、デコード関数ｄｅｃおよびパラメータφｅ，φｄの具体例については後述することとし、まずはそのようなｅｎｃ，ｄｅｃ，φｅ，φｄが存在するものとして、本実施形態における通信プロセスＡｔおよび微分プロセスＡｄの処理を第１の実施形態との相違点を中心に説明する。
【０１３５】
微分プロセスＡｄと通信プロセスＡｔとの間で互いに転送可能な変数Ｆｌａｇ，Ａｒｒａｙを定義する。
【０１３６】
変数Ｆｌａｇは、第１の実施形態と同様、０値である場合には微分プロセスＡｄが送信値の算出が未了であることを示し、１値である場合には微分プロセスＡｄが送信値の算出が未了であることを示す。変数Ｆｌａｇの初期値は０値である。
【０１３７】
変数Ａｒｒａｙには、ある時点での重みＷと、１または複数回更新した後のある時点での重みとの差分値をエンコード関数ｅｎｃでエンコードした値Ｄｅ（以下、単に差分値Ｄｅという）が通信プロセスＡｔによって格納される。本実施形態においては、通信プロセスＡｔが差分値Ｄｅを用いて重みＷを更新し、更新後の重みＷを微分プロセスＡｄに渡す。この意味で、本実施形態の通信プロセスＡｔは、重み更新プロセスということもできる。
【０１３８】
図１１は、第３の実施形態に係る微分プロセスＡｄの処理を説明するフローチャートである。まず、微分プロセスＡｄはある時点での重みＷを通信プロセスＡｔから取得する（ステップＳ５１）。そして、微分プロセスＡｄは、ある時点の重みＷと、差分値Ｄｅとを用いて、最新の重みｌｏｃＷを算出する（ステップＳ５２）。なお、差分値Ｄｅは、初回ループにおいては初期値０とすることができ、２回目以降のループにおいては前回ループのステップＳ５６で取得したものとすることができる。
【０１３９】
ここで、差分値Ｄｅはエンコードされた値なので、デコードして用いる必要があり、具体的には下記（１６）式によって最新の重みｌｏｃＷが得られる。
ｌｏｃＷ＝Ｗ＋ｄｅｃ（Ｄｅ，φｄ）  ・・・（１６）
なお、最新の重みｌｏｃＷは当該微分プロセスＡｄのみで用いられ、他の微分プロセスとの間で送受信する必要はない。
【０１４０】
続いて、微分プロセスＡｄは教師データを読み込む（ステップＳ５３）。そして、微分プロセスＡｄは教師データを用いた逆誤差伝搬法などにより最新の重みｌｏｃＷを更新するための微分値ｄＷを算出する（ステップＳ５４）。
【０１４１】
次に、微分プロセスＡｄは下記（１７）式により微分値ｄＷをエンコードして圧縮し、エンコード値δｅを得る（ステップＳ５５）。
δｅ＝ｅｎｃ（ｄＷ，φｅ）  ・・・（１７）
【０１４２】
そして、微分プロセスＡｄは通信プロセスＡｔにおける変数Ａｒｒａｙから差分値Ｄｅを取得する（ステップＳ５６）。ここで取得した差分値Ｄｅは次のループにおけるステップＳ５２でも用いられる。
【０１４３】
次に、微分プロセスＡｄは下記（１８）式により送信値ＶＡを算出する（ステップＳ５７）。
ＶＡ＝Ｄｅ／Ｒ＋δｅ  ・・・（１８）
ここでＲは微分プロセスの総数である。
【０１４４】
送信値ＶＡの算出が完了すると、微分プロセスＡｄは、送信値ＶＡの算出が完了したことを示すために、変数Ｆｌａｇを１値に設定する（ステップＳ５８）。なお、変数Ｆｌａｇは通信プロセスＡｔによって後に０値に再度設定される。
【０１４５】
以上の処理を１サイクルとして、微分プロセスＡｄはこのサイクルを所定回繰り返す（ステップＳ５９）。
【０１４６】
図１２は、第３の実施形態に係る通信プロセスＡｔの処理を説明するフローチャートである。通信プロセスは、ＡｌｌＲｅｄｕｃｅ命令を所定回（ｋ回とするが、１回でもよい）行って微分値を蓄積し、その後に重みの更新を行う。
【０１４７】
まず、通信プロセスＡｔは変数Ａｒｒａｙを初期値０に設定する（ステップＳ７１）。通信プロセスＡｔは定期的にＡｌｌＲｅｄｕｃｅ命令を発行してある値を他の通信プロセスに送信するが、送信する値はＡｌｌＲｅｄｕｃｅ命令発行時の変数Ｆｌａｇの値に応じて異なる。
【０１４８】
変数Ｆｌａｇが１値である場合（ステップＳ７２のＹＥＳ）、つまり、微分プロセスＡｄが送信値ＶＡの算出を完了している場合、通信プロセスＡｔは変数Ｆｌａｇを０値に戻す（ステップＳ７３）。そして、通信プロセスＡｔは微分プロセスＡｄで算出された送信値ＶＡに対してＡｌｌＲｅｄｕｃｅ命令を発行する（ステップＳ７４ａ）。
【０１４９】
具体的には、通信プロセスＡｔは送信値ＶＡを他の通信プロセスに送信するとともに、他のプロセスからの送信値を受信する。そして、通信プロセスＡｔは、送信した送信値ＶＡと、他のプロセスからの送信値とを加算して、その結果を変数Ａｒｒａｙに格納する。
【０１５０】
一方、変数Ｆｌａｇが０値である場合（ステップＳ７２のＮＯ）、つまり、微分プロセスＡｄが送信値Ｖの算出を完了していない場合、通信プロセスＡｔは変数Ａｒｒａｙに現在格納されている値（つまり差分値Ｄｅ）の１／Ｒに対してＡｌｌＲｅｄｕｃｅ命令を発行する（ステップＳ７４ｂ）。
【０１５１】
具体的には、通信プロセスＡｔはＡｒｒａｙ／Ｒを送信値として他の通信プロセスに送信するとともに、他のプロセスからの送信値を受信する。そして、通信プロセスＡｔは、送信した送信値Ａｒｒａｙ／Ｒと、他のプロセスからの送信値とを加算して、その結果を変数Ａｒｒａｙに格納する。
これをｋ回繰り返す（ステップＳ７５）。
【０１５２】
以上により、変数Ａｒｒａｙには微分プロセスＡｄが算出した微分値ｄＷと、他の微分プロセスが算出した微分値との和（のエンコード値）が蓄積される。蓄積された値は、上記ある時点での重みＷと、ｋ回更新を繰り返した時点での重みと、の差分値（のエンコード値）に対応する。このことを詳しく説明する。
【０１５３】
図１１のステップＳ５６，Ｓ５７および図１２のステップＳ７４ａから分かるように、微分値の算出が完了している微分プロセスに対応する通信プロセスからは、
ＶＡ＝Ｄｅ／Ｒ＋δｅ＝Ａｒｒａｙ／Ｒ＋δｅ  ・・・（１９）
が送信値として送信される。
【０１５４】
一方、図１２のステップＳ７４ｂから分かるように、微分値の算出が完了していない微分プロセスに対応する通信プロセスからは、
Ａｒｒａｙ／Ｒ  ・・・（２０）
が送信値として送信される。
【０１５５】
ＡｌｌＲｅｄｕｃｅ命令によってすべての通信プロセスからの送信値が加算される。微分プロセスの総数はＲであるため、（１９）式の第１項と（２０）式との和は現在の変数Ａｒｒａｙそのものであり、これに（１９）式の第２項（つまり最新の重みｌｏｃＷを更新するための微分値）が加算されたものが新たな変数Ａｒｒａｙとなる。よって、１度目のＡｌｌＲｅｄｕｃｅ命令が実行されると（ステップＳ７４ａ，７４ｂ）、上記ある時点での重みを１回更新するための微分値が、全通信プロセスにおける変数Ａｒｒａｙに格納される。なお、上述したように、エンコード関数ｅｎｃは分配法則を満たすために、このような加算が可能である。
【０１５６】
２度目のＡｌｌＲｅｄｕｃｅ命令が実行されると、上記ある時点での重みを１回更新した重みをさらに１回更新するための微分値、つまり、上記ある時点での重みを２回更新するための微分値が、全通信プロセスにおける変数Ａｒｒａｙに格納される。これはすなわち、変数Ａｒｒａｙには、上記ある時点での重みＷと、２回更新された時点での重みとの差分値が格納されていることを意味する。
【０１５７】
このように、ｋ回のＡｌｌＲｅｄｕｃｅ命令が実行されることで、上記ある時点での重みと、ｋ回更新された後の時点での重みとの差分値（のエンコード値）が変数Ａｒｒａｙに格納される。
【０１５８】
そこで、ｋ回のＡｌｌＲｅｄｕｃｅ命令が実行された後、通信プロセスＡｔは下記（２１）式により重みＷを更新する（ステップＳ７６）。
Ｗ＝Ｗ＋ｄｅｃ（Ａｒｒａｙ，φｄ）  ・・・（２１）
また、通信プロセスＡｔは差分値Ｄｅを０に初期化する（ステップＳ７７）。以上の処理が所定回繰り返される（ステップＳ７８）。
【０１５９】
以上の説明から分かるように、微分プロセスＡｄが算出した微分値ｄＷではなく、微分値ｄＷをエンコードしたエンコード値δｅ（およびこれが蓄積された差分値）が通信プロセス間で送受信される。そのため、通信量を抑えることができる。さらに、エンコードされるのは微分値や差分値であって、重みＷそのものではない。そのため、ニューラルネットワークにおける表現能力の欠如を回避できる。
【０１６０】
続いて、エンコード関数ｅｎｃ、デコード関数ｄｅｃおよびパラメータφｅ、φｄの具体例について詳しく説明する。
【０１６１】
上記（１４）式に示す分配法則を満たすため、エンコード用のパラメータφｅは行列とし、エンコード関数ｅｎｃは行列φｅを用いた行列演算とする。具体的には、上記（１２）式におけるエンコード関数ｅｎｃを以下のように定義する。
δｅ＝ｅｎｃ（δ，φｅ）＝φｅδ  ・・・（１２’）
【０１６２】
ここで、ベクトルδが微分値ｄＷに相当する。行列φｅは重みＷを更新するための微分値ｄＷをその線形部分空間へ写像する役割を担う。線形部分空間は、当然、本来の重みＷの更新方向を含んでいるものでなくてはならない。さもなければ、学習を続けてもコスト関数はほとんど低減しないためである。重みＷの更新を長く反復して行うにあたり、ある小区間の更新のみにおいて、重みＷの更新方向はほぼ線形と考えることができる。よって、ある小区間に着目して適切な行列φｅを設計することができる。
【０１６３】
以下、線形部分空間を、過去のある小区間における微分値によって定義される行列の固有値分解によって生成することを考える。
【０１６４】
第ｉ回目の重み更新に使用される微分値の全てを要素とする列ベクトル（以下、微分値ベクトルと呼ぶ）をδiとする。なお、実際には、複数の微分プロセスにより分散して微分値が算出されるので、各微分プロセスが算出する微分値に対してＡｌｌＲｅｄｕｃｅ命令を発行するなどによって全微分プロセスからの微分値を結合することで、微分値の全てを要素とする微分値ベクトルδiが得られる。
【０１６５】
そして、微分値ベクトルδiの要素数がｄ（言い換えると、微分値ベクトルδiがｄ行１列の行列）である場合、ｄ行ｄ列の正方行列Ｄを下記（２２）式のように定義する。
Ｄ＝（δi-d+1，δi-d+2，・・・，δi）  ・・・（２２）
さらに、行列Ｃ＝ＤＤTを固有値分解することにより行列Ｃ＝ＶＥＶTが得られる。
【０１６６】
図１３は、行列Ｃを説明する図である。行列Ｃ，Ｖ，Ｅはいずれもｄ行ｄ列の正方行列である。具体的には、同図（ａ）に示すように、行列Ｅは、固有値Ｅ11〜Ｅddを降順（Ｅ11＞Ｅ22・・・＞Ｅdd）に対角成分に持ち、他の要素は０である。また、行列Ｖは固有値Ｅ11〜Ｅddにそれぞれ対応する固有ベクトルＦ１〜Ｆｄを列として持っており、かつ、ＶＶTが単位行列となる。
【０１６７】
ここで、固有値Ｅ11〜Ｅddのうち値の大きいものから順番にｐ（＜ｄ）個を選択する。一例として、Ｅ11＞１００Ｅa+1a+1となるａのうち最も小さい値をｐとしてもよい。
【０１６８】
選択された固有値Ｅ11〜Ｅppは値が大きいため、対応する固有ベクトルＦ1〜Ｆpが行列Ｃに与える影響は大きい。一方、選択されなかった固有値Ｅp+1p+1〜Ｅddは値が小さいため、対応する固有ベクトルＦp+1〜Ｆdが行列Ｃに与える影響は小さい。例えば、固有値Ｅ11〜Ｅ33が選択された場合（ｐ＝３）、行列Ｖ，Ｅ，ＶTのうち図１３（ｂ）に示す破線部分が重要である。そこで、行列Ｅの左上ｐ行ｐ列からなる正方行列（つまり選択された固有値を降順に対角成分に持ち、他の要素は０である行列）を行列Ｅ’とし、固有ベクトルＦ1〜Ｆpからなるｄ行ｐ列の行列をφとすると、行列Ｃは下記（２３）式で近似される。
Ｃ≒φＥ’φT  ・・・（２３）
【０１６９】
この行列φTこそがエンコード関数ｅｎｃで用いる行列φｅである。よって、微分値ベクトルδiをエンコードして得られるエンコード値δｅiは下記（２４）式とすることができる。
δｅi＝ｅｎｃ（δi，φｅ）＝ｅｎｃ（δi，φT）＝φTδi  ・・・（２４）
【０１７０】
図１４は、上記（２４）式を模式的に示す図である。上記（２４）式によれば、エンコード値δｅiはｐ行１列の行列（ベクトル）となる。つまり、要素数がｄである微分値ベクトルδiを、要素数ｐのエンコード値δｅiに低次元化させることができ、微分値ベクトルδiを圧縮できる。
【０１７１】
そして、行列φTを転置した行列φをデコード用の行列φｄとすることで、下記（２５）式に示すように精度よく圧縮前の微分値ベクトルδiを復元できる。
δi＝ｄｅｃ（δｅi，φｄ）＝ｄｅｃ（δｅi，φ）
＝φδｅi＝φ（φTδi）＝δi  ・・・（２５）
【０１７２】
また、行列計算の性質上、任意の２つの微分値ベクトルδ，λに対し、下記（２６）式に示す分配法則が成立するのは明らかである。
φT（δ＋λ）＝φTδ＋φTλ  ・・・（２６）
【０１７３】
このように、値の大きなｐ個の固有値Ｅ11〜Ｅppのみを用いることで、微分値ベクトルδiを圧縮できる。また、他の固有値Ｅp+1p+1〜Ｅddは値が小さいため、精度よく復元可能である。さらに、エンコード関数ｅｎｃを行列演算とすることで分配法則が成立し、任意の微分値ベクトルδ，λのエンコード値どうしを加算した後にデコードすることで、微分値ベクトルの和δ＋λを得ることができ、ＡｌｌＲｅｄｕｃｅ命令との相性もよい。
【０１７４】
以上の手法は、行列Ｄをデータ行列としたときの主成分分析の一種と考えることが可能である。一般的な主成分分析との差異は、一般的な主成分分析では、行列Ｄの代わりに、行列Ｄの各列から、行列Ｄの列ベクトルの平均ベクトルを引いて得られる行列を使用している点にある。本手法は平均ベクトルの引き算を行わないが、広義の主成分分析と言える。
【０１７５】
ところで、実際の重みＷは数が多いため、微分値ベクトルδiの要素数ｄも大きくなる。その場合、行列Ｃの固有値分解（つまり行列Ｖを得ること）に時間がかかってしまう。場合によっては、固有値分解に要する時間が微分値算出に要する時間より大きくなってしまい、却って処理が遅くなってしまうことにもなりかねない。その場合、下記（２７）式に示すように、予め微分値ベクトルδiに対して所定の折りたたみ関数ｒｅｓｈａｐｅ（詳細は後述する）を適用して、δiの要素数（行数）ｄよりも小さい行数ｑ（列数はｄ／ｑの値に応じて定まるｒとする）を有する微分値行列δi’に変換しておくのが望ましい。
δi’＝ｒｅｓｈａｐｅ（δi，ｑ，ｒ）  ・・・（２７）
【０１７６】
行数ｑは、ｑ行ｑ列の行列の固有値分解に要する時間が、微分値算出に要する時間よりも小さなオーダーになるように設定される。この場合の行列φｅ，φｄは、上述した説明におけるδiをδi’に置き換えることより得られる。
【０１７７】
すなわち、上記（２２）式に示すｄ行ｄ列の正方行列Ｄに代えて、下記（２２’）式に示す行列Ｄを定義する。
Ｄ＝（δi-b+1’，δi-b+2’，・・・，δi’）  ・・・（２２’）
【０１７８】
ここで、ｂは過去何回分の微分値を使用するかを表しており、行列Ｃ＝ＤＤTのランク落ちを防ぐため、行列Ｄの列数が行数以上となるように設定する。以降、行列φｅ＝φT，φｄ＝φを得るまでの処理は同様である。
【０１７９】
この場合、上記（２４）式は以下のように表される。
δｅi＝ｅｎｃ（δi’，φｅ）＝φTδi’  ・・・（２４’）
【０１８０】
行列φTはｐ行ｑ列であり、微分値行列δi’はｑ行ｒ列であるから、エンコード値δｅiはｐ行ｒ列の行列となる。ｑ＞ｐであるから、やはり低次元化が可能である。なお、行列を列ベクトルに変換する必要がある場合、行列の要素を適宜並べ替えて列ベクトルに変形すればよい。
【０１８１】
以下、折りたたみ関数ｒｅｓｈａｐｅについて説明する。折りたたみ関数ｒｅｓｈａｐｅは変換対象行列の要素を並び替えて行列サイズを変換する。例えば、下記（２８）式のようにする。
【数１】
2016197389.tif 000004
【０１８２】
ここで、折りたたみ関数ｒｅｓｈａｐｅの第１引数は変換対象行列であり、第２引数および第３引数はそれぞれ変換後の行列の行数および列数である。よって、第２引数と第３引数との積は、変換対象行列の要素数と等しくなければならない。ここで、第２引数および第３引数は省略されることがある。
【０１８３】
文脈上、第２引数および第３引数が自明である場合、これらの記載は省略可能である。例えば、下記（２９）式が成立する。
【数２】
2016197389.tif 000005
【０１８４】
すなわち、２行２列の行列と、折りたたみ関数ｒｅｓｈａｐｅが出力する行列とを乗算するためには、折りたたみ関数ｒｅｓｈａｐｅが出力する行列の行数は２でなければならず、第２引数が２であるのは自明である。また、変換対象行列の要素数を考慮すると第３引数が６であるのは自明である。よって、第２引数および第３引数が省略され得る。また別の例として、下記（３０）式が成立する。
【数３】
2016197389.tif 000006
やはり、第２引数が２で第３引数が６であるのは自明である。
【０１８５】
また、第３引数のみが省略され、第２引数が変換対象行列の要素数の因数である場合、第３引数は当該要素数を第２引数で割った数とする。例えば、下記（３１）式が成立する。
【数４】
2016197389.tif 000007
【０１８６】
特殊なケースとして、第３引数のみが省略され、第２引数が変換対象行列の要素数の因数でない場合、出力される行列の欠けている要素に０を挿入するものとする。挿入される０の数は必要最小数とする。例えば、下記（３２）式が成立する。
【数５】
2016197389.tif 000008
【０１８７】
また別の特殊なケースとして、第２引数および第３引数が省略されており、文脈から第２引数が自明であるが、その第２引数が変換対象行列の要素数の因数でない場合、出力される行列の欠けている要素に０を挿入するものとする。挿入される０の数は必要最小数とする。例えば、下記（３３）式が成立する。
【数６】
2016197389.tif 000009
【０１８８】
以上のようにして、微分値ベクトルδｉの要素数が多い場合には、予め折りたたみ関数ｒｅｓｈａｐｅを適用すればよい。これにより、行列Ｃの固有値分解に要する時間を減らすことができる。
【０１８９】
（第４の実施形態）
上述したエンコード用の行列φｅは（したがって行列φｄも）ある小区間においては有効である。小区間の更新において、重みの更新方向はほぼ線形であり、行列φｅにおける固有値ベクトルＦ１〜Ｆｐと、微分値ベクトルδi（または微分値行列δi’、以下同じ）との相関が強い。よって、例えば上述の説明において、第（ｉ−ｄ＋１）回目〜第ｉ回目までの重み更新に使用される微分値を要素とする微分値ベクトルδi-d+1〜δiを用いて行列φｅを算出したが、第（ｉ＋１）回目以降の更新にもしばらく（つまり小区間とみなせる更新回数においては）この行列φｅを適用することができる。
【０１９０】
しかしながら、離れた２つの小区間の更新においては、更新方向が大きく異なり得る。つまり、ある小区間において更新方向を多く含むように行列φｅを設計したとしても、更新を反復するにつれて、行列φｅが張る部分空間と重みが移動する部分空間とがずれることとなる。このようなずれ（ドリフト）が大きくなると、行列φｅにおける固有ベクトルＦ１〜Ｆｐと、微分値ベクトルδi（微分値行列δi’）とが直交しやすくなる。そうすると、上記（２４）式や（２４’）式から分かるように、エンコード値δｅiの各成分の絶対値が０に近くなり、重みがほとんど更新できなくなる。
【０１９１】
そのため、このようなドリフトを押さえるべく、適切なタイミングで行列φｄを設定し直すのが望ましい。
【０１９２】
具体的には、予め定めた回数（後述する図１６のｋ）だけ重みの更新を行った後に行列φｅを更新するようにしてもよい。あるいは、上記（２４）式で得られるエンコード値δｅi（すなわち、図１１におけるステップＳ５５で算出されるδｅ）における各成分の値の絶対値が０に近くなってきたときに、行列φｅを更新するようにしてもよい。
【０１９３】
第ｉ回目の重み更新のタイミングで行列φｅを更新するためには、上記（２２）式で示すように、過去ｄ回分の微分ベクトルδi-d+1〜δiを必要とする。そこで、以下では、行列φｅ，φｄの更新も考慮した処理手順を説明する。以下、図１１および図１２に対して追加される点について主に説明する。
【０１９４】
図１５は、第４の実施形態に係る微分プロセスＡｄの処理を説明するフローチャートである。本実施形態では、ステップＳ５１〜Ｓ５７は図１１と共通しているが、微分プロセスＡｄが送信値ＶＡを算出する（ステップＳ５７）だけでなく、統計指標ｍｅａｓδも算出する（ステップＳ５７’）。統計指標ｍｅａｓδは、現ループ（ｊ回目のループとする）におけるステップＳ５４で算出された微分値ｄＷj、その前のｊ−１回目のループにおけるステップＳ５４で算出された微分値ｄＷj-1・・・を含んでいる。含まれる微分値ｄＷの数は、上記（２２）式におけるｄや、（２２’）式におけるｂによる。
【０１９５】
図１６は、第４の実施形態に係る通信プロセスＡｔの処理を説明するフローチャートである。本実施形態では、行列φｅ，φｄを更新するための変数Ａｒｒａｙ１を用いる。なお、実際には変数Ａｒｒａｙと変数Ａｒｒａｙ１とを連結した変数を用いて処理を行ってもよい。
【０１９６】
変数Ｆｌａｇが１である場合、通信プロセスＡｔは、送信値ＶＡに対するＡｌｌＲｅｄｕｃｅ命令のみならず、（Ａｒｒａｙ１／Ｒ＋ｍｅａｓδ）に対してもＡｌｌＲｅｄｕｃｅ命令を発行する（ステップＳ７４ａ’）。
【０１９７】
一方、変数Ｆｌａｇが０である場合、Ａｒｒａｙ／Ｒに対するＡｌｌＲｅｄｕｃｅ命令のみならず、変数Ａｒｒａｙ１／Ｒに対してもＡｌｌＲｅｄｕｃｅ命令を発行する（ステップＳ７４ｂ’）。
【０１９８】
これにより、変数Ａｒｒａｙ１には、微分プロセスＡｄによって得られた微分値ｄＷj，ｄＷj-1・・・と、他の微分プロセスによって得られた微分値とが変数Ａｒｒａｙ１に格納される。このことは、上記（２２），（２２’）式における行列Ｄを得ることに対応する。
【０１９９】
ＡｌｌＲｅｄｕｃｅ命令がｋ回繰り返された後、通信プロセスＡｔは、変数Ａｒｒａｙ１に格納された微分値を用いて、上述した手法により、行列φｅ，φｄを更新する（ステップＳ７７’）。
【０２００】
本実施形態では、重みを更新するための微分値をエンコードして低次元写像するが、エンコードに用いる行列φｅを定期的に（ＡｌｌＲｅｄｕｃｅ命令をｋ回発行する毎に）更新する。これにより、低次元空間を時刻とともに変化させることができ、学習が進むにつれて実質的に広い探索空間を確保できる。
【０２０１】
また、１回のＡｌｌＲｅｄｕｃｅ命令ごとではなく、ｋ回のＡｌｌＲｅｄｕｃｅ命令ごとに行列φｅ，φｄの更新を行うことで、処理速度の低下を抑えることができる。ニューラルネットワークの誤差逆拡散法による学習では、重みの変化量は反復ごとに多少の差異があるものの、少なからず相関しているため、ｋを適切に設定することで、連続した反復区間の中で固定の低次元空間を用いても、実質的には認識性能を損なうことはほとんどない。
【０２０２】
（第５の実施形態）
次に説明する第５の実施形態は、画像処理用のノードを通信プロセスおよび微分プロセスを実行するノードとは別個に設け、さらなる学習の高速化を図るものである。
【０２０３】
近年の画像認識などの研究では、重み更新用の微分値を算出する前に、画像に対して変形を施したものを教師データとして用いることが多い。変形とは、例えば位置のずらし、色の変換、拡大縮小などである。このように予め変形しておくことで、より多様な入力に対して、画像に存在する物体の識別が可能となる。１つの画像に対して様々な変形を施すことで、多様な教師データを得ることができる。このように教師データを人為的に増やすことを「データ拡張」という。
【０２０４】
データ拡張の１つの手法として、学習を行う前に教師データの数をｎ倍に拡張し、変形された教師データのすべてをストレージに格納するものがある。この場合、学習時には、ストレージから教師データを繰り返し読み込み、微分値を算出する。学習自体としては、１つの教師データを学習が終了するまでに複数回（たとえば１００回）処理する。
【０２０５】
別の手法として、学習の過程において、オリジナル画像の読み込み、画像処理による画像のランダムな変形、および、微分値算出のステップを反復するものがある。この場合、変形に乱数を用いることがひとつの特色であり、厳密に同一の画像を繰り返し処理することがない。これは、入力の多様さに対するロバスト性を高めることに有効である。この場合、一度微分値算出に使用された画像は捨ててしまう。予め変形画像を全て用意しておくことはストレージの容量の限界から、通常は難しいためである。
【０２０６】
仮に変形画像を全てストレージに格納することができるのであれば、予め変形画像を必要数生成したのち、学習を開始できる。通常、学習は条件を変えて複数回実行される。変形画像自体は学習の条件を変えても再利用可能であるため、先に変形画像を用意しておくのが効率的である。
【０２０７】
しかしながら、データストレージの容量の制約などから、事前に全ての変形画像を用意するのは容易ではない。そこで、学習における反復計算のたびに、画像処理を施すことも考えられる。しかしながら、画像処理の時間だけ微分値算出の時間が延びることとなる。その結果、ミニバッチサイズを一定と仮定した場合、ノード数を増やさざるを得ない。
【０２０８】
そうすると、集団通信にかかる時間が増大することとなる。通信の遅いノードが混入する可能性が高まることが主な理由である。そこで、本実施形態では、変形画像生成を行うことによる、集団通信のノード数の増大を回避することを目的としたものである。
図１７は、第５の実施形態に係る学習システムのハードウェア構成の一例を示すブロック図である。以下、図４との相違点を中心に説明する。
【０２０９】
学習システムは、微分プロセスＡｄや通信プロセスＡｔなどを実行するノード１と、画像に対する変形処理を施す画像処理用のノード２とを備えている。画像処理ノード２は、画像処理プロセスＡｉを実行するＧＰＵ２１ａなどと、ストレージ２２とを有する。なお、ストレージ２２はノード２の外部にあって、画像処理プロセスＡｉがアクセス可能な態様であってもよい。
【０２１０】
ストレージ２２には教師データを生成するための複数の画像が格納されている。画像処理用のノード２がＭ台ある場合、画像セットをＭ分割したものがストレージ２２に格納されている。
【０２１１】
画像処理プロセスＡｉは、ストレージ２２から画像を取得し、画像処理（例えばランダムな変形）によって変形画像を生成する。この変形画像が教師データとなる。画像処理プロセスＡｉは、生成した変形画像をストレージ２２に書き込んでもよいし、別のストレージ（ノード２内にあってもよいし、外部にあってもよい）に書き込んでもよい。あるいは、画像処理プロセスＡｉは、ノード１内の微分プロセスにＭＰＩなどを利用して直接転送してもよい。
【０２１２】
なお、画像処理を行うモジュールの実現方法に特に制約はない。図示のように、１つの画像処理プロセスに１つのＧＰＵを割り当て、複数のＧＰＵによって画像処理を並列に行ってもよい。
【０２１３】
微分プロセスは、画像処理プロセスによって生成された変形画像（教師データ）を順次読み込み、微分値を算出する。通信プロセスはＡｌｌＲｅｄｕｃｅ命令などの集団通信を行って微分値を含む送信値を通信し、重みを更新する。微分プロセスは画像の変形を行う必要がないため、学習処理の高速化が可能である。
【０２１４】
ここで、画像処理プロセスが変形画像を生成する速度（周期）は、微分プロセスが微分値を算出する速度（周期）を上回っている必要がある。そうでないと、教師データの供給が追い付かないためである。このことを考慮し、学習を開始する前に、変形画像の生成速度と、微分値の算出速度とを測定し、必要な数の画像処理プロセス（画像処理用のノード２）を設計すればよい。
【０２１５】
また、画像処理プロセスによる教師データの書き込みと、微分プロセスによる教師データの読み込みとの衝突を回避する必要がある。すなわち、画像処理プロセスが教師データを書き込んでいる最中に、同教師データを微分プロセスが読み込まないようにしなければならない。さらに、通常は、生成されて書き込まれる教師データがストレージの容量をオーバーしないよう古い教師データは消去されるが、消去の最中または消去後にその教師データを微分プロセスが読み込まないようにする必要がある。
このような衝突を回避するためには、例えばＭＰＩを利用すればよい。あるいは、生成される教師データのネーミングを工夫してもよい。
【０２１６】
なお、本手法は、教師データを読み込むのに必要な帯域幅の平均値がノード間通信の性能と比較して十分に小さい場合に、有効である。必要な帯域幅が大きい場合には、画像処理プロセスと微分値算出プロセスとを同一ノードで実行した方が高速処理可能である。
このように、第５の実施形態では、微分プロセスを実行するノードとは別に画像処理用のノードを設ける。そのため、学習の高速化を実現できる。
【０２１７】
上述した実施形態で説明した実施形態の少なくとも一部は、ハードウェアで構成してもよいし、ソフトウェアで構成してもよい。ソフトウェアで構成する場合には、少なくとも一部の機能を実現するプログラムを記録媒体に収納し、コンピュータに読み込ませて実行させてもよい。記録媒体は、磁気ディスクや光ディスクなどの着脱可能なものに限定されず、ハードディスク装置やメモリなどの固定型の記録媒体でもよい。
【０２１８】
また、少なくとも一部の機能を実現するプログラムを、インターネットなどの通信回線（無線通信も含む）を介して頒布してもよい。さらに、同プログラムを暗号化したり、変調をかけたり、圧縮した状態で、インターネットなどの有線回線や無線回線を介して、あるいは記録媒体に収納して頒布してもよい。
【０２１９】
上記の記載に基づいて、当業者であれば、本発明の追加の効果や種々の変形例を想到できるかもしれないが、本発明の態様は、上述した個々の実施形態には限定されるものではない。特許請求の範囲に規定された内容およびその均等物から導き出される本発明の概念的な思想と趣旨を逸脱しない範囲で種々の追加、変更および部分的削除が可能である。
【符号の説明】
【０２２０】
１  ノード
１１  ＣＰＵ
１２ａ〜１２ｃ  ＧＰＵ
１３  ストレージ
２  画像処理ノード
２１ａ，２１ｂ  ＧＰＵ
２２  ストレージ
【図１】
2016197389.tif 000010
【図２】
2016197389.tif 000011
【図３】
2016197389.tif 000012
【図４】
2016197389.tif 000013
【図５】
2016197389.tif 000014
【図６】
2016197389.tif 000015
【図７】
2016197389.tif 000016
【図８】
2016197389.tif 000017
【図９】
2016197389.tif 000018
【図１０】
2016197389.tif 000019
【図１１】
2016197389.tif 000020
【図１２】
2016197389.tif 000021
【図１３】
2016197389.tif 000022
【図１４】
2016197389.tif 000023
【図１５】
2016197389.tif 000024
【図１６】
2016197389.tif 000025
【図１７】
2016197389.tif 000026