JP2016197389A - 学習システム、学習プログラムおよび学習方法 - Google Patents

学習システム、学習プログラムおよび学習方法 Download PDF

Info

Publication number
JP2016197389A
JP2016197389A JP2015220780A JP2015220780A JP2016197389A JP 2016197389 A JP2016197389 A JP 2016197389A JP 2015220780 A JP2015220780 A JP 2015220780A JP 2015220780 A JP2015220780 A JP 2015220780A JP 2016197389 A JP2016197389 A JP 2016197389A
Authority
JP
Japan
Prior art keywords
value
differential
parameter
processes
learning
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2015220780A
Other languages
English (en)
Inventor
育郎 佐藤
Ikuro Sato
育郎 佐藤
英樹 新原
Hideki Niihara
英樹 新原
裕紀 西村
Hiroki Nishimura
裕紀 西村
健介 横井
Kensuke Yokoi
健介 横井
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Denso Corp
Denso IT Laboratory Inc
Original Assignee
Denso Corp
Denso IT Laboratory Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Denso Corp, Denso IT Laboratory Inc filed Critical Denso Corp
Priority to US15/347,638 priority Critical patent/US20170132515A1/en
Publication of JP2016197389A publication Critical patent/JP2016197389A/ja
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/08Learning methods
    • G06N3/084Backpropagation, e.g. using gradient descent
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/04Architecture, e.g. interconnection topology
    • G06N3/045Combinations of networks
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/50Network services
    • H04L67/60Scheduling or organising the servicing of application requests, e.g. requests for application data transmissions using the analysis and optimisation of the required network resources
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L69/00Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
    • H04L69/04Protocols for data compression, e.g. ROHC

Abstract

【課題】現実的な時間でニューラルネットワーク用のパラメータを更新できる学習システム、学習プログラムおよび学習方法を提供する。【解決手段】本発明の一態様によれば、1または複数のプロセッサから構成され、該1または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、各プロセスは、現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、前記微分値のみならず前記現時点のパラメータも用いて、他の通信プロセスに送信される送信値を算出することと、前記送信値を他のプロセスに送信することと、他のプロセスから送信された前記送信値に基づいて、前記現時点のパラメータを更新することと、を含む、学習システムが提供される。【選択図】図3

Description

本発明は、ニューラルネットワーク用のパラメータを更新する学習システム、学習プログラムおよび学習方法に関する。
画像認識の分野において、一般物体認識と呼ばれる問題がある。これは、画像の中に存在する鳥や車といった物体の種別(クラス)を推定する問題である。近年、一般物体認識問題の認識性能の改善が目覚ましい。これは、とりわけ層数の多い、畳み込みニューラルネットワーク(例えば、非特許文献1)によるところが大きい。
画像認識の分野では、過去様々な認識アルゴリズムが提案されてきたが、学習データが膨大になるにつれ、畳み込みニューラルネットワークが他のアルゴリズムの認識性能を上回る傾向となっている。畳み込みニューラルネットワークは、モデルの表現能力が高い反面、学習データの特徴に過度に特化してしまう「過学習」と呼ばれる問題があることが従来指摘されてきた。しかしながら、近年の学習データ量が、過学習の問題の回避を可能にするレベルにまで増大しつつあることが背景にある。
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)
畳み込みニューラルネットワークは認識性能において大きな利点があるが、学習時間が長大であるという弱点を併せ持っている。学習とは、ニューラルネットワークにおける重みやバイアスといったパラメータを最適化する処理である。ソーシャルネットワークに関するデータや、自動運転に関係するデータなどは、今後とも増加の一途をたどるものの一例であるが、いつか学習時間が膨大になりすぎて、実質的な時間内に学習が終了しない可能性も充分に考えられる。場合によっては、学習に年単位の時間を要することも考えられる。こうなった場合、製品化は現実的ではなく、認識性能で劣る畳み込みニューラルネットワーク以外のアルゴリズムの使用を余儀なくされることにもなり兼ねない。すなわち、ニューラルネットワーク学習の抜本的高速化は、産業応用にとって極めて重要な課題である。
本発明はこのような問題点に鑑みてなされたものであり、本発明の課題は、現実的な時間でニューラルネットワーク用のパラメータを更新できる学習システム、学習プログラムおよび学習方法を提供することである。
本発明の一態様によれば、1または複数のプロセッサから構成され、該1または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、各プロセスは、現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、前記微分値のみならず前記現時点のパラメータも用いて、他のプロセスに送信される送信値を算出することと、前記送信値を他のプロセスに送信することと、他のプロセスから送信された前記送信値に基づいて、前記現時点のパラメータを更新することと、を含む、学習システムが提供される。
この構成によれば、微分値のみならず現時点のパラメータも用いた送信値を他のプロセスに送信するため、通信回数を減らすことができ、短時間でパラメータを更新できる。
また、本発明の別の態様によれば、1または複数のプロセッサから構成され、該1または複数のプロセッサが微分プロセスおよび通信プロセスの組を複数実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、前記微分プロセスのそれぞれは、現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、前記微分値のみならず前記現時点のパラメータも用いて、他の組における通信プロセスに送信される送信値を算出することと、を含み、前記通信プロセスのそれぞれは、組になっている前記微分プロセスが前記送信値の算出を完了している場合には前記送信値を、完了していない場合には前記現時点のパラメータの一部を、他の組における通信プロセスに送信することと、他の通信プロセスから送信された前記送信値および前記現時点のパラメータの一部に基づいて、前記現時点のパラメータを更新することと、を含む、学習システムが提供される。
この構成によれば、通信プロセスと微分プロセスとを分離し、算出が完了した送信値を他の通信プロセスに送信するため、短時間でパラメータを更新できる。
望ましくは、前記通信プロセスのそれぞれは、組になっている前記微分プロセスが前記送信値の算出を完了しているか否かに関わらず、前記送信値または前記現時点のパラメータの一部を他の通信プロセスに送信することにより、送信の度に前記パラメータを更新する。
この構成によれば、送信値の算出が完了しているか否かに関わらず、パラメータを更新できる。
望ましくは、前記組の数は、前記微分プロセスのそれぞれが用いる前記教師データの数と、1回の更新で用いられる前記教師データの数の最適値と、前記微分プロセスが前記送信値を算出するのに要する時間と、に基づいて定められる。
さらに望ましくは、前記微分プロセスのそれぞれが用いる前記教師データの数をAとし、1回の更新で用いられる前記教師データの数の最適値をBとするとき、前記組の数は、前記通信プロセスが送信を行う際に、平均B/A個の前記微分プロセスが前記送信値の算出を完了しているよう、定められる。
この構成によれば、更新で用いられる教師データの数を最適化できる。
また、本発明の別の態様によれば、 1または複数のプロセッサから構成され、該1または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、各プロセスは、ある時点のパラメータと、差分値と、教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することであって、前記差分値は、前記ある時点でのパラメータと、その後のある時点でのパラメータとの差を圧縮した値である、ことと、前記微分値を圧縮することと、圧縮された前記微分値と、前記差分値とに基づいて他のプロセスに送信される送信値を算出することと、他のプロセスから送信された前記送信値と、圧縮された前記送信値と、に基づいて、前記差分値を得ることと、前記差分値を復元した値に基づいて、前記ある時点でのパラメータを更新することと、を含む、学習システムが提供される。
この構成によれば、微分値を圧縮した上で送信するため、通信量を削減できる。
また、本発明の別の態様によれば、1または複数のプロセッサから構成され、該1または複数のプロセッサが微分プロセスおよび通信プロセスの組を複数実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、前記微分プロセスのそれぞれは、ある時点のパラメータと、差分値と、教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することであって、前記差分値は、前記ある時点でおパラメータと、その後のある時点でのパラメータとの差を圧縮した値である、ことと、前記微分値を圧縮することと、圧縮された前記微分値と、前記差分値とに基づいて他のプロセスに送信される送信値を算出することと、を含み、前記通信プロセスのそれぞれは、組になっている前記微分プロセスが前記送信値の算出を完了している場合には前記送信値を、完了していない場合には前記差分値を送信値として他の組における通信プロセスに送信することと、他の通信プロセスから送信された前記送信値と、組になっている前記微分プロセスが算出した前記送信値と、に基づいて前記差分値を得ることと、前記差分値を復元した値に基づいて、前記ある時点でのパラメータを更新することと、を含む、学習システムが提供される。
この構成によれば、微分値を圧縮した上で送信するため、通信量を削減できる。
望ましくは、前記微分値を圧縮することは、前記微分値と、所定行列との乗算である。
さらに望ましくは、前記所定行列は、学習過程において更新される。
所定行列を更新することにより、学習の精度・速度を向上できる。
前記所定行列は、学習過程における過去の前記微分値に基づいて更新されてもよい。
具体例として、前記所定行列は、学習過程における過去の前記微分値に対する主成分分析によって更新されてもよい。
これにより、圧縮した値を復元する際の情報欠如を少なくすることができる。
前記微分値を圧縮することは、分配法則を満たすよう、前記微分値を圧縮することであるのが望ましい。
これにより、圧縮した値どうしを圧縮したままの状態で加算することができる。
前記微分値を圧縮することは、すべての前記微分プロセスからの微分値を行列化したものと、前記所定行列との乗算であってもよい。
望ましくは、前記ニューラルネットワーク用のパラメータの一部が他の一部と共有される、または、パラメータの一部が他の一部と所定の関係を満たす。
この構成によれば、更新されるパラメータの数を減らすことができる。
前記ニューラルネットワーク用のフィルタの1つが他のフィルタの1つと共有されてもよいし、フィルタの1つが他のフィルタと所定の関係を満たしてもよい。
例えば、前記ニューラルネットワーク用のフィルタの1つは、他のフィルタを所定角度回転したもの、点対称としたもの、左右反転したもの、または、上下反転したものであってもよい。
この構成によれば、更新されるパラメータの数を減らすことができる。
前記1または複数のプロセッサとは異なる別のプロセッサが、予め用意された画像を変形して前記教師データを生成する画像処理プロセスを実行するのが望ましい。
これにより画像処理プロセスを分離することができ、学習速度を向上できる。
本発明の別の態様によれば、上記の学習システムを構築するために、1つの前記プロセッサに、前記微分プロセスを実行させる、学習プログラムが提供される。
本発明の別の態様によれば、上記の学習システムを構築するために、1つの前記プロセッサに、前記通信プロセスを実行させる、学習プログラムが提供される。
本発明の別の態様によれば、1または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習方法であって、各プロセスは、現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、前記微分値のみならず前記現時点のパラメータも用いて、他のプロセスに送信される送信値を算出することと、前記送信値を他のプロセスに送信することと、他のプロセスから送信された前記送信値に基づいて、前記現時点のパラメータを更新することと、を含む、学習方法が提供される。
本発明の別の態様によれば、1または複数のプロセッサが微分プロセスおよび通信プロセスの組を複数実行することによりニューラルネットワーク用のパラメータを更新する学習方法であって、前記微分プロセスのそれぞれは、現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、前記微分値のみならず前記現時点のパラメータも用いて、他の組における通信プロセスに送信される送信値を算出することと、を含み、前記通信プロセスのそれぞれは、組になっている前記微分プロセスが前記送信値の算出を完了している場合には前記送信値を、完了していない場合には前記現時点のパラメータの一部を、他の組における通信プロセスに送信することと、他の通信プロセスから送信された前記送信値および前記現時点のパラメータの一部に基づいて、前記現時点のパラメータを更新することと、を含む、学習方法が提供される。
本発明の別の態様によれば、ニューラルネットワーク用のパラメータを、その一部が他の一部と共有されるとして、または、一部が他の一部と所定の関係を満たすとして、前記パラメータを更新する学習方法が提供される。
本発明の別の態様によれば、1または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習方法であって、各プロセスは、ある時点のパラメータと、差分値と、教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することであって、前記差分値は、前記ある時点でのパラメータと、その後のある時点でのパラメータとの差を圧縮した値である、ことと、前記微分値を圧縮することと、圧縮された前記微分値と、前記差分値とに基づいて他のプロセスに送信される送信値を算出することと、他のプロセスから送信された前記送信値と、圧縮された前記送信値と、に基づいて、前記差分値を得ることと、前記差分値を復元した値に基づいて、前記ある時点でのパラメータを更新することと、を含む、学習方法が提供される。
1または複数のプロセッサが微分プロセスおよび通信プロセスの組を複数実行することによりニューラルネットワーク用のパラメータを更新する学習方法であって、前記微分プロセスのそれぞれは、ある時点のパラメータと、差分値と、教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することであって、前記差分値は、前記ある時点でおパラメータと、その後のある時点でのパラメータとの差を圧縮した値である、ことと、前記微分値を圧縮することと、圧縮された前記微分値と、前記差分値とに基づいて他のプロセスに送信される送信値を算出することと、を含み、前記通信プロセスのそれぞれは、組になっている前記微分プロセスが前記送信値の算出を完了している場合には前記送信値を、完了していない場合には前記差分値を他の組における通信プロセスに送信することと、他の通信プロセスから送信された前記送信値と、組になっている前記微分プロセスが算出した前記送信値と、に基づいて前記差分値を得ることと、前記差分値を復元した値に基づいて、前記ある時点でのパラメータを更新することと、を含む、学習方法が提供される。
現実的な時間でニューラルネットワーク用のパラメータを更新できる。
畳み込みニューラルネットワークの構造の一例を模式的に示す図。 比較例に係る学習手法の手順を示すフローチャート。 本発明の実施形態に係る学習手法の手順を示すフローチャート。 図3に示す学習を行う学習システムのハードウェア構成の一例を示すブロック図。 微分プロセスAdの処理を説明するフローチャート。 通信プロセスAtの処理を説明するフローチャート。 微分プロセスおよび通信プロセスの処理を模式的に説明するタイミング図。 代表的なフィルタを示す図。 フィルタの共有を説明する図。 シナプスを明示したネットワーク図。 第3の実施形態に係る微分プロセスAdの処理を説明するフローチャート。 第3の実施形態に係る通信プロセスAtの処理を説明するフローチャート。 行列Cを説明する図。 エンコード値δeiを模式的に示す図。 第4の実施形態に係る微分プロセスAdの処理を説明するフローチャート。 第4の実施形態に係る通信プロセスAtの処理を説明するフローチャート。 第5の実施形態に係る学習システムのハードウェア構成の一例を示すブロック図。
以下、本発明に係る実施形態について、図面を参照しながら具体的に説明する。
(第1の実施形態)
図1は、畳み込みニューラルネットワーク(Convolutional Neural Network:以下、CNNという)の構造の一例を模式的に示す図である。CNNは、1または複数の畳み込み部21およびプーリング部22の組と、多層ニューラルネットワーク構造23とを備えている。初段の畳み込み部21に認識対象の画像が入力される。そして、多層ニューラルネットワーク構造23から認識結果が出力される。
畳み込み部21は、入力される画像信号(初段の畳み込み部21にあっては認識対象の画像、2段目以降の畳み込み部21にあっては後述する特徴マップ)に対してフィルタ21aを適用して畳み込みを行い、次いで非線形写像を行う。フィルタ21aは複数ピクセルの要素を持つ重みであり、各重みはバイアスを含んでいてもよい。
プーリング部22は、畳み込み部21からの画像信号の解像度を下げるプーリング操作を行い、特徴マップを生成する。
多層ニューラルネットワーク構造23は、入力層231と、1または複数の隠れ層232と、出力層233とを有する。入力層231には最終段のプーリング部22からの特徴マップが入力される。隠れ層232は重みを用いて積和演算を行う。出力層233はCNN処理の最終結果を出力する。
畳み込み部21におけるフィルタ21aの重みや、隠れ層232における重みがニューラルネットワーク用のパラメータである。本実施形態では、これらの重みWを短時間で学習することを目的としている。学習とは、認識対象の画像が入力されたときにCNNが理想の出力を返すよう、重みを更新することをいう。
学習には、認識の対象となる画像と、それに対する理想的な出力値の組である教師データが用いられる。学習に先立ち、CNNの出力がどの程度理想的な出力値から離れているかを定量化した関数(例えば二乗誤差やクロスエントロピー)を定義し、全教師データ分だけ足し合わせたコスト関数E(W)を用意する。コスト関数E(W)は重みWの関数であり、コスト関数E(W)が小さいほどよいCNNであるといえる。学習とは、重みWを更新することで、コスト関数E(W)を小さくする処理とも言える。
本実施形態では、コスト関数E(W)を最小化する手法として、誤差逆伝搬法と呼ばれる勾配法の一種を使用する。誤差逆伝搬法は重みの更新を多数回繰り返すものであり、一回の更新は下記(1)式で表される。
W←W−r*dW ・・・(1)
rは学習係数と呼ばれるスカラ量であり、更新の度に小さな値にしてもよいし、常に一定の値であってもよい。dWはコスト関数の重みに対する微分を表したものである。すなわち、重みの更新には、現時点での重みWと、微分値dWとが用いられる。
ここで、一回の重み更新において、全教師データを用いて算出された微分値dWを用いる方法を「バッチ学習」といい、一部の教師データを用いて算出された微分値dWの近似値を用いる方法を「ミニバッチ学習」という。近年では、ミニバッチ学習を採用することが一般的である。その理由は、ミニバッチ学習は、バッチ学習と比較して、多くの場合収束速度が速く、さらには汎化性能(教師データに含まれない画像に対する識別性能)が高いためである。
通常、ミニバッチ学習を採用する場合、ミニバッチサイズをあらかじめ決定しておく必要がある。ミニバッチサイズとは、1回の重み更新(微分値dWの算出)に使用する教師データの個数を指す。適切なミニバッチサイズは、問題依存ではあるが、少ない時で1、多い時でおよそ1000、といった事例がある。経験的に、ミニバッチサイズには適切な値があり、このサイズを大きく超えると、収束が遅くなったり、汎化性能が劣化したりするデメリットがあることが知られている。すなわち、必ずしもミニバッチサイズを大きくすればよい、というわけではない。また、適切なミニバッチサイズは、全教師データの数を遥かに下回ることもまたよく知られている。
上記非特許文献1には具体的な学習手法が詳細に記載されているわけではないが、同文献に基づいて本願発明者らが想到した学習手法を、本実施形態の比較例として説明する。
図2は、比較例に係る学習手法の手順を示すフローチャートである。3つのプロセスA〜Cが並列して実行されるとして説明する。なお、並列して実行されるプロセスA〜C間の通信は規格化されたMPI(Message Passing Interface)を用いることを想定している。
まず、初期状態として、下記(2)に示すように、プロセスA〜Cは現時点での重みWを保持する(ステップS1)。重みWは、プロセス数と等しい数のパーティション1〜3に分割されており、パーティション1〜3はそれぞれ重みW1〜W3である。これらの重みW1〜W3のバイト数はおよそ等しいものとする。パーティションの設定は予め決めておけばよい。
プロセスA W=[W1,W2,W3]
プロセスB W=[W1,W2,W3]
プロセスC W=[W1,W2,W3] ・・・(2)
続いて、下記(3)に示すように、プロセスA〜Cは教師データA〜Cをそれぞれ読み込む(ステップS2)。教師データA〜Cのそれぞれは、ランダムに抽出された1または複数の教師データであり、その数がミニバッチサイズに対応する。例えば、教師データA〜Cのそれぞれが5つの教師データを含む場合、プロセス数が3つであるので、ミニバッチサイズは15となる。
プロセスA read 教師データA
プロセスB read 教師データB
プロセスC read 教師データC ・・・(3)
そして、下記(4)に示すように、プロセスA〜Cは、逆誤差伝搬法による微分値dWA,dWB,dWCをそれぞれ算出する(ステップS3)。微分値dWAは、各パーティションに対応するdWA1〜dWA3から構成される。微分値dWA1は重みW1および教師データAに基づいて算出される。他の微分値も同様である。このように、各微分値は、プロセスA〜Cに対応するインデックスA〜Cと、パーティション1〜3に対応するインデックス1〜3とを持つ。
プロセスA dWA=[dWA1,dWA2,dWA3]
プロセスB dWB=[dWB1,dWB2,dWB3]
プロセスC dWC=[dWC1,dWC2,dWC3] ・・・(4)
プロセスA〜Cのすべてが微分値の算出を完了するのを待って、下記(5)に示すように、プロセスA〜Cは、MPIにおける、演算の種類を「加算」とするReduce命令を発行する(ステップS4)。これにより、プロセスA〜Cにおけるパーティション1の微分値dWA1,dWB1,dWC1がプロセスAに送信されるとともに足し合わされて微分値dW1が得られる。他の微分値も同様である。
なお、本比較例において送信されるのは微分値のみであり、重みそのものが送信されるわけではない。このReduce命令によって1回目の通信が発生する。
プロセスA dW1=dWA1+dWB1+dWC1
プロセスB dW2=dWA2+dWB2+dWC2
プロセスC dW3=dWA3+dWB3+dWC3 ・・・(5)
そして、下記(6)に示すように、プロセスAは、現時点での重みW1および微分値dW1に基づいて、重みW1を更新する。同様にして、プロセスB,Cは重みW2,W3をそれぞれ更新する(ステップS5)。この(6)は上記(1)式と対応している。
プロセスA W1←W1−r*dW1=W1−r(dWA1+dWB1+dWC1)
プロセスB W2←W2−r*dW2=W2−r(dWA2+dWB2+dWC2)
プロセスC W3←W3−r*dW3=W3−r(dWA3+dWB3+dWC3)
・・・(6)
最後に、下記(7)に示すように、プロセスA〜CはMPIにおけるAllGather命令を発行する(ステップS6)。これにより、重みW1〜W3は全プロセスA〜Cに分配される。AllGather命令によって2回目の通信が発生する。
プロセスA W←[W1,W2,W3]
プロセスB W←[W1,W2,W3]
プロセスC W←[W1,W2,W3] ・・・(7)
以上により1回の重み更新が完了し、プロセスA〜Cは初期状態に戻る。この一連の処理を、所定回数だけ反復して処理を終了する(ステップS7)。なお、終了する条件は、コスト関数E(W)が収束した時点や、検証を行って認識の精度が向上しなくなった時点であってもよい。
この比較例においては、次のような問題点が挙げられる。
第1に、最も微分値の算出が遅いプロセスに学習速度が依存するという問題がある。Reduce命令(ステップS4)は、すべてのプロセスA〜Cが微分値の算出(ステップ3)を完了するのを待って発行する必要があるためである。
第2に、ネットワーク構造が大きくなるほど学習時間が増大するという問題がある。ネットワーク構造が大きくなれば、順伝搬および誤差逆伝搬による時間がかかるために微分値算出の時間が増えるとともに、重みWの数が増えて通信に時間がかかるためである。
第3に、プロセス数を増やしても学習を高速化できないという問題がある。ステップS2での説明から分かるように、プロセス数を増やすとミニバッチサイズが増える。しかしながら、ミニバッチサイズには適切な値があるため、プロセス数を増やすとミニバッチサイズが適切な値を上回り、結果としてCNNの学習時間の増大や認識性能の劣化が起こるおそれがある。
また、上記の処理手順においては、2回の通信(Reduce命令とAllGather命令)が必要であることも学習を高速化できないことにつながっている。
そこで、本実施形態においては、最も微分値の算出が遅いプロセスに学習速度が依存することなく、ネットワーク構造が大きくなっても学習時間がそれほど増大せず、プロセス数を増やすことで高速化でき、通信回数を少なくできる学習手法を提案する。
図3は、本発明の実施形態に係る学習手法の手順を示すフローチャートである。ステップS1〜S3は図2と共通しており、以下では相違点を中心に説明する。
微分値が算出された後、下記(8)に示すように、プロセスA〜Cは、通信するアレイの準備として、他のプロセスに送信される送信値VA〜VCをそれぞれ算出する(ステップS11)。
プロセスA VA=[W1−r*dWA1,−r*dWA2,−r*dWA3]
プロセスB VB=[−r*dWB1,W2−r*dWB2,−r*dWB3]
プロセスC VC=[−r*dWC1,−r*dWC2,W3−r*dWC3]
・・・(8)
次いで、下記(9)に示すように、プロセスA〜Cは、MPIにおける、演算の種類を「加算」とするAllReduce命令を発行する(ステップS12)。これにより、送信値VA〜VCは他のプロセスに送信されて足し合わされて、更新された重みWが得られる。AllReduce命令により1回目の通信が発生する。
プロセスA W←VA+VB+VC=
[W1−r(dWA1+dWB1+dWC1),
W2−r(dWA2+dWB2+dWC2),
W3−r(dWA3+dWB3+dWC3)]
プロセスB W←VA+VB+VC
プロセスC W←VA+VB+VC ・・・(9)
この(9)は、上記比較例における(6),(7)と等価である。このように、本実施形態の手順によれば、1回の通信で比較例と同じ結果を得ることができる。
なお、ステップS11において、プロセスA〜Cは下記(8’)に示す送信値VA〜VCを算出してもよい。
プロセスA VA=
[W1/3−r*dWA1,W2/3−r*dWA2,W3/3−r*dWA3]
プロセスB VB=
[W1/3−r*dWB1,W2/3−r*dWB2,W3/3−r*dWB3]
プロセスC VC=
[W1/3−r*dWC1,W2/3−r*dWC2,W3/3−r*dWC3]
・・・(8’)
すなわち、送信値VA〜VCのパーティション1には、重みW1をプロセス数で除したW1/3を含んでいてもよい。他のパーティションも同様である。これらの送信値VA〜VCからも上記(9)と同様の重みWが得られる。
要するに、AllReduce命令で上記(9)に示す重みWが得られるよう、送信値VAは微分値dWA1,dWA2,dWA3および重みW1(必要に応じて重みW2,W3)から算出され、送信値VBは微分値dWB1,dWB2,dWB3および重みW2(必要に応じて重みW1,W3)から算出され、送信値VCは微分値dWC1,dWC2,dWC3および重みW3(必要に応じて重みW2,W3)から算出されればよい。
比較例との大きな相違点として、送信値は微分値(dWA1など)のみならず現時点での重み(W1など)も含まれており、微分値および現時点での重みの両方が他のプロセスに送信される。そのため、1回の通信だけで重みWを更新できる。
図4は、図3に示す学習を行う学習システムのハードウェア構成の一例を示すブロック図である。学習システムはバスによって接続されたn(nは1以上の整数)個のノード1から構成される。そして、任意のノード1間でデータ通信が可能である。以下の説明では、ノード1間の通信速度の理論値は一定であるとするが、そうでない場合でも本手法を適用可能である。
ノード1は、例えば1台の計算機である。ノード1は、1つのCPU(Central Processing Unit)11と、3つのGPU(Graphics Processing Unit)12a〜12cと、ストレージ13とを有する。k番目のノード1におけるストレージ13には、全教師データをnセットに分割したうちのk番目のセットが格納されている。各セットに含まれる教師データの数は、適切なミニバッチサイズ以上である。
なお、図4はあくまで一例にすぎず、例えばノード1内のCPU数やGPU数は任意である。また、ストレージは各ノードに対して外付けであってもよいし、全ノードからアクセス可能な1つのストレージに全教師データが格納されていてもよく、いずれにしても、各ノード1は教師データを高速に扱うことができる。
1つのノード1は複数のプロセスを並列に処理できる。ここで、「ノード」とはハードウェアとしての計算機の単位であるのに対し、「プロセス」は各ノード内のソフトウェアとして並列実行可能なプログラムの単位である。本実施形態では、図3に示す処理を微分プロセスと通信プロセスとに分けて行う点が、比較例とは異なる。
GPU12a〜12cはそれぞれ微分プロセスAd〜Cdを実行する。微分プロセスAd〜Cdの具体的な処理内容は、図3に示す初期状態(ステップS1)、データ読み込み(ステップS2)、微分値算出(ステップS3)および送信値算出(ステップS11)であり、これらを繰り返し行う。
CPU11は、微分プロセスAd〜Cdとそれぞれ組みになっている通信プロセスAt〜Ctを実行する。通信プロセスAt〜Ctの具体的な処理内容は、図3に示すAllReduce命令(ステップS12)である。
このように、GPU12a〜12cが微分プロセスAd〜Cdを実行し、CPU11が通信プロセスAt〜Ctを実行するのが望ましい。微分プロセスには、畳み込みや行列積の演算といった、少なくない処理量が要求される。こういった処理をGPU12a〜12cが行うことで、処理を高速化できる。また、GPU12a〜12cが通信プロセスを実行しないことで、CPUとGPUとの間のメモリ転送を削減でき、単位時間当たりの通信プロセス間の通信の発生回数を高くできる。
ここで、本実施形態の大きな特徴として、通信プロセスAt〜CtによるAllReduce命令は、微分プロセスAd〜Cdによる送信値算出(ステップS11)の完了を待って行う必要はなく、連続的に発行される。これにより学習が高速で行われることを後に詳しく述べる。
なお、本明細書において「微分プロセスが教師データを読み込む」などと記載しているが、実際にはノード1、より具体的にはCPU11やGPU12a〜GPU12cといった各プロセッサが、微分プロセスに対応するプログラムを実行することによって、読み込みなどの処理を行っている。微分プロセスが教師データを読み込む処理を含んでいるとも言える。
なお、図示していないが、別のノード1におけるGPU12a〜12cは微分プロセスDd,Ed,Fdを実行し、CPU11は通信プロセスDt,Et,Ftを実行する。他のノード1も同様に、微分プロセスおよび通信プロセスを実行する。各通信プロセスはAllReduce命令によって他の通信プロセスと通信するが、当該他の通信プロセスが同一ノード1内にあっても他のノード1内にあっても相違はない。
以下、微分プロセスAdと通信プロセスAtとの組について説明するが、特に断らない限り、他の組についても同様である。
微分プロセスAdと通信プロセスAtとの間で互いに転送可能な変数Flag,Array0,Array1,Array2を定義する。変数Flagは2値変数であり、初期値は0値である。変数Array0〜Array2は、重みWと同サイズのアレイである。変数Array0には、現時点での重みW(初めはその初期値Wini)が格納される。
図5は、微分プロセスAdの処理を説明するフローチャートである。微分プロセスAdは次の処理を含んでいる。
まず、初期状態として、微分プロセスAdは、変数Array0に格納されている現時点での重みWを取得する(ステップS1’)。続いて、微分プロセスAdはストレージ13から教師データを読み込む(ステップS2)。読み込む教師データの数は、微分値を算出した際にGPU12aのメモリに載る個数とする。通常、GPU12aのメモリはそれほど大きくないため、一度に読み込める教師データの数は少なく、適切なミニバッチサイズよりも小さいものとする。
そして、微分プロセスAdは微分値dWを算出し(ステップS3)、送信値VAを算出する(ステップS11)。その後、微分プロセスAdは送信値VAを変数Array1に格納し(ステップS21)、変数Flagを1値に設定する(ステップS22)。すなわち、変数Flagが1値に設定されていれば、送信値VAの算出が完了していることを意味する。
以上の処理を1サイクルとして、微分プロセスAdはこのサイクルを繰り返す。すなわち、上記(8)に基づいて、微分プロセスAdは送信値VAを算出する。他の微分プロセスBdなども同様である。ここで、微分プロセスAdによる1サイクルの処理に要する時間は、次に説明する通信プロセスAtによる1サイクルの処理時間より長い。すなわち、一般的なCNNの分散システムでは、1回の微分計算に必要な時間と、1回の重み転送に必要な時間とを比較すると、前者が大きい。これは畳み込み演算の処理負荷が大きいことに由来する。それでも、微分プロセスAdは、通信プロセスAtと非同期で、図5の処理を繰り返せばよい。
なお、図5では微分プロセスAdが重みWや微分値VAを直接書き換えることとしたが、実装上は、ポインタの受け渡しなどで代用してもよい。
図6は、通信プロセスAtの処理を説明するフローチャートである。通信プロセスAtは次の処理を含んでいる。
通信プロセスAtは定期的にAllReduce命令を発行してある値を他の通信プロセスに送信するが(図3のステップS12)、送信する値は、AllReduce命令発行時の変数Flagの値に応じて異なる。
変数Flagが1値である場合(ステップS30のYES)、つまり、微分プロセスAdが送信値VAの算出を完了している場合、通信プロセスAtはその送信値VAを他の通信プロセスBt,Ct,Dt・・・に送信する。より具体的には、通信プロセスAtは変数Flagを0値に戻した上で(ステップS31)、AllReduce命令を発行して変数Array1(図5のステップS21によって送信値VAが格納されている)を他の通信プロセスBt,Ct,Dt・・・に送信する(ステップS32a)。
一方、変数Flagが0値である場合(ステップS30のNO)、つまり、微分プロセスAdが送信値VAの算出を完了していない場合、通信プロセスAtは現時点での重みWの一部を他の通信プロセスBt,Ct,Dt・・・に送信する。より具体的には、通信プロセスAtは下記(10)のように変数Array2を設定する(ステップS41)。
Array2←[Array0(1),0,0,・・・] ・・・(10)
ここで、Array0(1)は、変数Array0の1番目のパーティションを意味する。すなわち、Array2の1番目のパーティションには変数Array0(現時点での重みW)の1番目のパーティションW1が格納され、他のパーティションには0値が格納される。そして、通信プロセスAtはAllReduce命令を発行して変数Array2を他の通信プロセスBt,Ct,Dt・・・に送信する(ステップS42a)。
ステップS32a,S42aにおいて、通信プロセスAtは変数Array1またはArray2を送信するとともに、他の通信プロセスBt,Ct,Dt・・・から変数Array1またはArray2を受信する。より詳しくは、通信プロセスAtは、送信値VAの算出が完了している微分プロセスと組になっている通信プロセスからは変数Array1を受信し、送信値VAの算出が完了していない微分プロセスと組になっている通信プロセスからは変数Array2を受信する。例えば、通信プロセスAtは、通信プロセスBtから、Array1=VBまたはArray2=[0,Array0(2),0・・・]を受信する。他の通信プロセスも同様である。
そして、通信プロセスAtにおける変数Flagが1値である場合には、通信プロセスAtは、AllReduce命令に基づいて、自身の変数Array1と、他のプロセスBt,Ct,Dt・・・から受信した変数Array1またはArray2とを加算した結果を変数Array1に格納する(ステップS32b)。変数Array1には微分値が含まれているため、重みWが更新される。さらに、通信プロセスAtは、変数Array1を変数Array0に格納することで(ステップS33)、変数Array0には更新された最新の重みWが格納され、初期状態となる。
一方、通信プロセスAtにおける変数Flagが0値である場合には、通信プロセスAtは、AllReduce命令に基づいて、自身の変数Array2と、他のプロセスBt,Ct,Dt・・・から受信した変数Array1またはArray2とを加算した結果を変数Array2に格納する(ステップS42b)。変数Array1には微分値が含まれているため、重みWが更新される。さらに、通信プロセスAtは、変数Array2を変数Array0に格納することで(ステップS43)、変数Array0には最新の重みWが格納され、初期状態となる。
以上を、学習が完了するまで繰り返す。なお、ステップS32aとS32b、および、S42aとS42bを別個に説明したが、実際には両者はAllReduce命令により一括に処理される。
このように、微分プロセスAdが送信値VAの算出を完了しているか否かに関わらず、他の微分プロセスで算出された微分値を受信することで、通信プロセスAtがAllReduce命令を発行する度に、重みWを更新できる。
上述のように、微分プロセスAdによる1サイクルの処理に要する時間は、通信プロセスAtによる1サイクルの処理時間より長いが、微分プロセスAdによる処理速度に依存することなく、通信プロセスAtの処理速度で学習できる。
図7は、微分プロセスおよび通信プロセスの処理を模式的に説明するタイミング図である。同図では、6個の微分プロセスAd〜Fdが図5に示す処理を行っている。微分プロセスの適切な数については後述する。図の矢印先端が、送信値の算出が完了した時刻を示しており、例えば、微分プロセスCdは、時刻t1,t3,t5で送信値の算出を完了している。
各微分プロセスAd〜Fdの1サイクルに要する時間(言い換えると、送信値を算出するのに要する時間)は互いにそろっている必要はなく、ノードの性能に応じて異なり得るし、読み込まれた教師データによっても異なり得る。例えば、微分プロセスAdは処理速度が速いが、微分プロセスBdは処理速度が遅い。また、微分プロセスEdは、送信値を算出するのに要する時間が、時刻t2〜t4という長い時間であることもあれば、時刻t4〜t5という短い時間であることもある。
一方、6個の通信プロセスAt〜Ftは時刻t1〜t5のそれぞれにおいて定期的に図6に示すAllReduce命令を発行する。
例えば、時刻t1において、3つの微分プロセスAd,Cd,Ddは送信値の算出が完了しているため、対応する通信プロセスAt,Ct,Dtは変数Array1を通信プロセスAt〜Ftに送信する(図6のステップS32a)。一方、同時刻において、他の3つの微分プロセスBd,Ed,Fdは送信値の算出が完了していないため、対応する通信プロセスBt,Et,Ftは変数Array2を通信プロセスAt〜Ftに送信する(図6のステップS42a)。
通信プロセスAt,Ct,Dtにおける変数Array1(上記(7)に基づく)、および、通信プロセスBt,Et,Ftにおける変数Array2(上記(9)に基づく)は、以下のようになる。
これらがAllReduce命令に基づいて加算された結果(ステップS32b)、通信プロセスAtにおける変数Array1は下記(11)のようになる。
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)] ・・・(11)
これは、微分プロセスAd,Cd,Ddが読み込んだ教師データを用いた場合の上記(9)と等価である。AllReduce命令によれば、通信プロセスCt,Dtにおける変数Array1および通信プロセスBt,Et,Ftにおける変数Array2も当然上記(11)と同じ結果となる。このようにして、時刻t1において、微分プロセスBd,Ed,Fdは送信値の算出が完了していないにも関わらず、重みWが更新される。他の時刻t2〜t5のそれぞれにおいても、一部の微分プロセスが送信値の算出を完了しており、それによって重みWが更新される。
微分プロセスの数は次のようにして決定される。各微分プロセスが1度にA個の教師データを読み込むとする。また、最適なミニバッチサイズをB個とする。この場合、AllReduce命令が発行される周期で、平均B/A個の微分プロセスが送信値の算出を完了しているよう、微分プロセスの数を調整する。
簡単な例として、各微分プロセスが1度に10個の教師データを読み込み、最適なミニバッチサイズが100個であるとする。さらに、平均して、各微分プロセスはAllReduce命令が発行される周期の5倍の時間をかけて、送信値の算出が完了するとする。この場合、50個の微分プロセスを設ければよい。
こうすることで、AllReduce命令が発行されるタイミングでは平均して10(=50/5)個の微分プロセスが送信値の算出を完了している。そして、各送信値の算出には10個の教師データが用いられているので、合計100(=10*10)個すなわち最適なミニバッチサイズの教師データが1回の更新に用いられることになる。
なお、ミニバッチサイズは最適な数ではなくても、ある範囲内であれば大きな問題とはならないことが知られている。よって、AllReduce命令が発行されるタイミングで平均して上記個数の微分プロセスが送信値の算出を完了していればよい。
この手法によれば、学習速度は、微分プロセスが送信値を算出するのに要する時間には一切依存しない。全微分プロセスのうちの一部が送信値の算出を完了していればよいためである。特に、処理速度が遅い微分プロセスがあったとしても、その微分プロセスによって学習の速度が低下することはなく、比較例における第1の問題点が解決される。
さらに、各微分プロセスの処理速度が高速でない場合、例えば処理プログラムが最適でない場合や、処理性能が高くない旧式のノード1を用いる場合には、単にノード1を増やすことによって微分プロセス数を増やせばよい。微分プロセス数を多くすることで、たとえ個々の微分プロセスが遅かったとしても、AllReduce命令の発行時に、いずれかの微分プロセスが送信値の算出を完了しているためである。これにより、比較例における第3の問題点が解決される。
このように、第1の実施形態では、微分プロセスと通信プロセスとを分離し、微分プロセスの処理が完了するのを待たずに、通信プロセスがAllReduce命令を発行する。そのため、ニューラルネットワーク用パラメータの学習に要する時間を短縮でき、現実的な時間で同パラメータを生成できる。
(第2の実施形態)
図1に示すように、CNNには通常多数のフィルタ21aが用いられる。しかしながら、たとえ各フィルタの重みが独立して学習されたとしても、似たようなフィルタ21aが少なからず現れることが知られている。
図8は、代表的なフィルタを示す図である。図8(a),(b)に示すように縦方向のエッジに反応するフィルタや、図8(c),(d)に示す世に横方向のエッジに反応するフィルタが、完全に同一でないにしても、多く現れる。異なる層で似たようなフィルタが現れることもあるし、同一層で似たようなフィルタが現れることもある。これは、哺乳類の視覚のメカニズムに同様の機能が獲得されていることからも分かる通り、画像のエッジ情報が画像に認識において重要な役割を持つためである。
そこで、本実施形態では、すべてのフィルタにおける重みを独立に学習するのではなく、予めフィルタを共有しておくこととする。これにより、重みの数を減らすことができ、さらに学習時間を短縮できる。
図9は、フィルタの共有を説明する図である。同図における白抜きの四角は画像信号を、矢印はフィルタを示しており、ある画像信号にフィルタを適用して畳み込みを行って、新たな画像信号を生成することを意味している。なお、図1に示すように、畳み込みの後にプーリングが行われるが、簡略化のために図示を省略している。
そして、同一のシンボルが付されたフィルタは、全く同じ重みを持つ同一のフィルタである。当然初期値も同一であるし、学習による更新量も同一である。一方、シンボルが付されていないフィルタは独立のフィルタであり、独立して重みが学習される。
図9には全部で12個のフィルタがあるが、黒塗り四角が付された2つのフィルタ、2本縦線が付された3つのフィルタ、三角が付された2つのフィルタおよび丸が付された3つのフィルタが共有されるため、実際には6つのフィルタのみを学習すればよい。
どのフィルタを共有するかは、学習の前に決定しておく必要がある。例えば、乱数を用いて割り当てを行うことが考えられる。乱数を使ったフィルタの割り当ての具体例を以下に挙げる。
まず、CNN構造を決定する。次に、共有されるフィルタ(フリーフィルタと呼ぶ)を準備し、各画素の重みを乱数などにより初期化する。フリーフィルタの枚数Mは、CNNが必要とするフィルタ枚数以下である。続いて、CNN構造における各フィルタに、M枚のフリーフィルタのうちの1枚をランダムに復元抽出する。これにより、フィルタの割り当てが完了する。
フィルタの割り当てには制約を設けてもよい。例えば、共有させたくないフィルタに対しては、非復元抽出を行うことで共有を避けることが可能となる。あらかじめ準備したフリーフィルタのうち、割り当てのなかったものについては、単純に除外すればよい。これらは学習には一切使用されない。
また、フィルタ共有として、あるフィルタと他のフィルタを完全に同一として共有するだけでなく、あるフィルタと他のフィルタとが所定の関係を満たすようにしていてもよい。言い換えると、あるフィルタに基づいて他のフィルタを生成できるようにしてもよく、例えば、あるフィルタを所定角度(例えば90度、180度、270度)回転したり、点対称にしたり、左右反転したり、上下反転したりして、他のフィルタとしてもよい。例えば、図9において、三角が付されたフィルタを、丸が付されたフィルタを90度回転したものとすることで、学習すべき重みをさらに減らすことができる。
図9ではフィルタを共有することを示したが、シナプス単位で重みを共有してもよい。
図10(a)は、4×4画素から構成される画像信号(入力画像)に対して、2×2画素から構成されるフィルタを適用して新たな画像信号(出力画像)を生成する様子を示す図である。これは、入出力画像を個々の画素に分解して図10(b)に示すように展開できる。これはシナプスを明示したネットワーク図の一部である。各シナプスが重みを有する。この例では2×2画素のフィルタを使用しているため、4つの独立なシナプス1〜4が存在している(実線、点線、破線、一点破線)。
同じ重みを有するシナプスが同一の特徴マップ内に複数回使われていることを、重み共有(weight sharing)という。重み共有には、シフト不変性の効果と、パラメータ数増大を回避する(つまり過学習を発生しにくくさせる)効果がある。
CNNの(畳み込み部21および多層ニューラルネットワーク構造23を含む)すべての層のすべての積和演算部分を、図10(b)のように展開してシナプスを明示的に記載したとき、(フィルタ単位ではなく)任意のいくつかのシナプスを共有してもよい。これにより、シナプスの単位での自由度が低減できる。この低減された自由度を持つ重みの集合をフリーウェイトと呼ぶ。フリーウェイトの割り当てもまた、フリーフィルタの時と同じように、復元抽出や非復元抽出を使って行うことが可能である。
また、シナプスの共有として、あるシナプスの重みと他のシナプスの重みとを完全に同一として共有するだけでなく、ある重みと他の重みとが所定の関係を満たすようにしてもよい。言い換えると、ある重みに基づいて他の重みを算出できるようにしてもよく、例えば、ある重みaと他の重みbが、a=3b+2なる関係を満たすようにしてもよい。このようにしても、フリーウェイとの数を減らすことができる。
第1の実施形態で説明したように、複数のプロセスに分散して学習を行う場合、実際に通信されるのはフリーウェイトやフリーフィルタである。そのため、これらの個数を調整することで、学習速度を制御することができる。この際、CNN構造そのものは変化させる必要はない。CNN構造を改造するには実装面で多くの工数を要するが、フリーウェイトやフリーフィルタの数を調整するのは、学習前の割り当てを行うのみでよく、簡便である。
また、パラメータ数は通信速度を決定し、通信速度が学習時間を決定する方式であるため、パラメータ数をどの程度にすれば学習がどの程度の時間で終了するかはあらかじめ見積もることが可能である。具体的には、フリーウェイトの数を1/α(1<α)倍とし、微分プロセスおよび通信プロセスの組の数をα倍にすることで、CNN構造が同一であっても学習速度をα倍にできる。この場合、ミニバッチサイズが変動することもない。
よって、ネットワーク構造が大きくなって重みWの数が増えても、フリーウェイとの数を調整することで、学習時間の増大を抑えられる。これにより、比較例における第2の問題点が解決される。
このように、第2の実施形態では、CNN構造における重みの一部を共有する。そのため、学習すべき重みの数が減って通信速度が高くなるため、より短い時間で学習できる。
(第3の実施形態)
次に説明する第3の実施形態では、微分値そのものではなく、微分値をエンコードして圧縮した上で他のノードに渡すことで、通信量を削減するものである。
微分値の圧縮手法の考え方を説明する。ニューラルネットワークにおける重みを確率的勾配法によって学習・更新すると、重みは初期値から徐々に変化していき局所解へ収束する。学習過程にある重みの移動ベクトルは、反復ごとに多少の差異はあるものの、少なからず相関していることが多い。すなわち、重みの変遷はある特定の方向に片寄っており、かつ、それとは異なる方向に揺らぐ成分を持つ。
本実施形態では、重みの変遷の主要な方向成分を抽出し、その方向への移動ベクトルのみを、計算ノード間で通信する。つまり、コスト関数の微分を、重みの変遷に主要な成分と、非主要な成分とに分離し、前者のみを通信することで、コスト関数を安定的に低下させながらも、通信変数の容量を低減させ学習時間を短縮させる。以下、詳細に説明する。
エンコード関数encを用いてあるベクトルδをエンコードすることによってエンコード値δeを得ることを下記(12)式で表す。
δe=enc(δ,φe) ・・・(12)
ここで、ベクトルδの次元(要素数)よりエンコード値δeの次元が低ければ、ベクトルδが圧縮されてデータ量を減らすことができる。なお、φeはエンコードに用いるパラメータであり、詳しくは後述する。
また、デコード関数decを用いてベクトルδ’をデコードすることによってデコード値δdを得ることを下記(13)式で表す。
δd=dec(δ’,φd) ・・・(13)
φdはエンコードに用いるパラメータであり、詳しくは後述する。
エンコードされたベクトルどうしをAllReduce命令などで足し合わるためには、エンコード関数encは下記(14)式に示す分配法則を満たすのが望ましい。
enc(δ+λ,φe)=enc(δ,φe)+enc(λ,φe) ・・・(14)
また、重み更新の主要な情報を欠落させないためには、ベクトルδをエンコードして得られるエンコード値をデコードした場合に元のベクトルδが復元される必要があり、すなわち、エンコード関数encおよびデコード関数decは、下記(15)式を満たさなければならない。
δ≒dec(enc(δ,φe),φd) ・・・(15)
なお、ニューラルネットワーク用の重み学習のためには、厳密に元のベクトルδが復元されなくてもよい。適切なエンコード関数enc、デコード関数decおよびパラメータφe,φdを用いることで、上記(14),(15)式を満たす圧縮を行うことができる。
エンコード関数enc、デコード関数decおよびパラメータφe,φdの具体例については後述することとし、まずはそのようなenc,dec,φe,φdが存在するものとして、本実施形態における通信プロセスAtおよび微分プロセスAdの処理を第1の実施形態との相違点を中心に説明する。
微分プロセスAdと通信プロセスAtとの間で互いに転送可能な変数Flag,Arrayを定義する。
変数Flagは、第1の実施形態と同様、0値である場合には微分プロセスAdが送信値の算出が未了であることを示し、1値である場合には微分プロセスAdが送信値の算出が未了であることを示す。変数Flagの初期値は0値である。
変数Arrayには、ある時点での重みWと、1または複数回更新した後のある時点での重みとの差分値をエンコード関数encでエンコードした値De(以下、単に差分値Deという)が通信プロセスAtによって格納される。本実施形態においては、通信プロセスAtが差分値Deを用いて重みWを更新し、更新後の重みWを微分プロセスAdに渡す。この意味で、本実施形態の通信プロセスAtは、重み更新プロセスということもできる。
図11は、第3の実施形態に係る微分プロセスAdの処理を説明するフローチャートである。まず、微分プロセスAdはある時点での重みWを通信プロセスAtから取得する(ステップS51)。そして、微分プロセスAdは、ある時点の重みWと、差分値Deとを用いて、最新の重みlocWを算出する(ステップS52)。なお、差分値Deは、初回ループにおいては初期値0とすることができ、2回目以降のループにおいては前回ループのステップS56で取得したものとすることができる。
ここで、差分値Deはエンコードされた値なので、デコードして用いる必要があり、具体的には下記(16)式によって最新の重みlocWが得られる。
locW=W+dec(De,φd) ・・・(16)
なお、最新の重みlocWは当該微分プロセスAdのみで用いられ、他の微分プロセスとの間で送受信する必要はない。
続いて、微分プロセスAdは教師データを読み込む(ステップS53)。そして、微分プロセスAdは教師データを用いた逆誤差伝搬法などにより最新の重みlocWを更新するための微分値dWを算出する(ステップS54)。
次に、微分プロセスAdは下記(17)式により微分値dWをエンコードして圧縮し、エンコード値δeを得る(ステップS55)。
δe=enc(dW,φe) ・・・(17)
そして、微分プロセスAdは通信プロセスAtにおける変数Arrayから差分値Deを取得する(ステップS56)。ここで取得した差分値Deは次のループにおけるステップS52でも用いられる。
次に、微分プロセスAdは下記(18)式により送信値VAを算出する(ステップS57)。
VA=De/R+δe ・・・(18)
ここでRは微分プロセスの総数である。
送信値VAの算出が完了すると、微分プロセスAdは、送信値VAの算出が完了したことを示すために、変数Flagを1値に設定する(ステップS58)。なお、変数Flagは通信プロセスAtによって後に0値に再度設定される。
以上の処理を1サイクルとして、微分プロセスAdはこのサイクルを所定回繰り返す(ステップS59)。
図12は、第3の実施形態に係る通信プロセスAtの処理を説明するフローチャートである。通信プロセスは、AllReduce命令を所定回(k回とするが、1回でもよい)行って微分値を蓄積し、その後に重みの更新を行う。
まず、通信プロセスAtは変数Arrayを初期値0に設定する(ステップS71)。通信プロセスAtは定期的にAllReduce命令を発行してある値を他の通信プロセスに送信するが、送信する値はAllReduce命令発行時の変数Flagの値に応じて異なる。
変数Flagが1値である場合(ステップS72のYES)、つまり、微分プロセスAdが送信値VAの算出を完了している場合、通信プロセスAtは変数Flagを0値に戻す(ステップS73)。そして、通信プロセスAtは微分プロセスAdで算出された送信値VAに対してAllReduce命令を発行する(ステップS74a)。
具体的には、通信プロセスAtは送信値VAを他の通信プロセスに送信するとともに、他のプロセスからの送信値を受信する。そして、通信プロセスAtは、送信した送信値VAと、他のプロセスからの送信値とを加算して、その結果を変数Arrayに格納する。
一方、変数Flagが0値である場合(ステップS72のNO)、つまり、微分プロセスAdが送信値Vの算出を完了していない場合、通信プロセスAtは変数Arrayに現在格納されている値(つまり差分値De)の1/Rに対してAllReduce命令を発行する(ステップS74b)。
具体的には、通信プロセスAtはArray/Rを送信値として他の通信プロセスに送信するとともに、他のプロセスからの送信値を受信する。そして、通信プロセスAtは、送信した送信値Array/Rと、他のプロセスからの送信値とを加算して、その結果を変数Arrayに格納する。
これをk回繰り返す(ステップS75)。
以上により、変数Arrayには微分プロセスAdが算出した微分値dWと、他の微分プロセスが算出した微分値との和(のエンコード値)が蓄積される。蓄積された値は、上記ある時点での重みWと、k回更新を繰り返した時点での重みと、の差分値(のエンコード値)に対応する。このことを詳しく説明する。
図11のステップS56,S57および図12のステップS74aから分かるように、微分値の算出が完了している微分プロセスに対応する通信プロセスからは、
VA=De/R+δe=Array/R+δe ・・・(19)
が送信値として送信される。
一方、図12のステップS74bから分かるように、微分値の算出が完了していない微分プロセスに対応する通信プロセスからは、
Array/R ・・・(20)
が送信値として送信される。
AllReduce命令によってすべての通信プロセスからの送信値が加算される。微分プロセスの総数はRであるため、(19)式の第1項と(20)式との和は現在の変数Arrayそのものであり、これに(19)式の第2項(つまり最新の重みlocWを更新するための微分値)が加算されたものが新たな変数Arrayとなる。よって、1度目のAllReduce命令が実行されると(ステップS74a,74b)、上記ある時点での重みを1回更新するための微分値が、全通信プロセスにおける変数Arrayに格納される。なお、上述したように、エンコード関数encは分配法則を満たすために、このような加算が可能である。
2度目のAllReduce命令が実行されると、上記ある時点での重みを1回更新した重みをさらに1回更新するための微分値、つまり、上記ある時点での重みを2回更新するための微分値が、全通信プロセスにおける変数Arrayに格納される。これはすなわち、変数Arrayには、上記ある時点での重みWと、2回更新された時点での重みとの差分値が格納されていることを意味する。
このように、k回のAllReduce命令が実行されることで、上記ある時点での重みと、k回更新された後の時点での重みとの差分値(のエンコード値)が変数Arrayに格納される。
そこで、k回のAllReduce命令が実行された後、通信プロセスAtは下記(21)式により重みWを更新する(ステップS76)。
W=W+dec(Array,φd) ・・・(21)
また、通信プロセスAtは差分値Deを0に初期化する(ステップS77)。以上の処理が所定回繰り返される(ステップS78)。
以上の説明から分かるように、微分プロセスAdが算出した微分値dWではなく、微分値dWをエンコードしたエンコード値δe(およびこれが蓄積された差分値)が通信プロセス間で送受信される。そのため、通信量を抑えることができる。さらに、エンコードされるのは微分値や差分値であって、重みWそのものではない。そのため、ニューラルネットワークにおける表現能力の欠如を回避できる。
続いて、エンコード関数enc、デコード関数decおよびパラメータφe、φdの具体例について詳しく説明する。
上記(14)式に示す分配法則を満たすため、エンコード用のパラメータφeは行列とし、エンコード関数encは行列φeを用いた行列演算とする。具体的には、上記(12)式におけるエンコード関数encを以下のように定義する。
δe=enc(δ,φe)=φeδ ・・・(12’)
ここで、ベクトルδが微分値dWに相当する。行列φeは重みWを更新するための微分値dWをその線形部分空間へ写像する役割を担う。線形部分空間は、当然、本来の重みWの更新方向を含んでいるものでなくてはならない。さもなければ、学習を続けてもコスト関数はほとんど低減しないためである。重みWの更新を長く反復して行うにあたり、ある小区間の更新のみにおいて、重みWの更新方向はほぼ線形と考えることができる。よって、ある小区間に着目して適切な行列φeを設計することができる。
以下、線形部分空間を、過去のある小区間における微分値によって定義される行列の固有値分解によって生成することを考える。
第i回目の重み更新に使用される微分値の全てを要素とする列ベクトル(以下、微分値ベクトルと呼ぶ)をδiとする。なお、実際には、複数の微分プロセスにより分散して微分値が算出されるので、各微分プロセスが算出する微分値に対してAllReduce命令を発行するなどによって全微分プロセスからの微分値を結合することで、微分値の全てを要素とする微分値ベクトルδiが得られる。
そして、微分値ベクトルδiの要素数がd(言い換えると、微分値ベクトルδiがd行1列の行列)である場合、d行d列の正方行列Dを下記(22)式のように定義する。
D=(δi-d+1,δi-d+2,・・・,δi) ・・・(22)
さらに、行列C=DDTを固有値分解することにより行列C=VEVTが得られる。
図13は、行列Cを説明する図である。行列C,V,Eはいずれもd行d列の正方行列である。具体的には、同図(a)に示すように、行列Eは、固有値E11〜Eddを降順(E11>E22・・・>Edd)に対角成分に持ち、他の要素は0である。また、行列Vは固有値E11〜Eddにそれぞれ対応する固有ベクトルF1〜Fdを列として持っており、かつ、VVTが単位行列となる。
ここで、固有値E11〜Eddのうち値の大きいものから順番にp(<d)個を選択する。一例として、E11>100Ea+1a+1となるaのうち最も小さい値をpとしてもよい。
選択された固有値E11〜Eppは値が大きいため、対応する固有ベクトルF1〜Fpが行列Cに与える影響は大きい。一方、選択されなかった固有値Ep+1p+1〜Eddは値が小さいため、対応する固有ベクトルFp+1〜Fdが行列Cに与える影響は小さい。例えば、固有値E11〜E33が選択された場合(p=3)、行列V,E,VTのうち図13(b)に示す破線部分が重要である。そこで、行列Eの左上p行p列からなる正方行列(つまり選択された固有値を降順に対角成分に持ち、他の要素は0である行列)を行列E’とし、固有ベクトルF1〜Fpからなるd行p列の行列をφとすると、行列Cは下記(23)式で近似される。
C≒φE’φT ・・・(23)
この行列φTこそがエンコード関数encで用いる行列φeである。よって、微分値ベクトルδiをエンコードして得られるエンコード値δeiは下記(24)式とすることができる。
δei=enc(δi,φe)=enc(δi,φT)=φTδi ・・・(24)
図14は、上記(24)式を模式的に示す図である。上記(24)式によれば、エンコード値δeiはp行1列の行列(ベクトル)となる。つまり、要素数がdである微分値ベクトルδiを、要素数pのエンコード値δeiに低次元化させることができ、微分値ベクトルδiを圧縮できる。
そして、行列φTを転置した行列φをデコード用の行列φdとすることで、下記(25)式に示すように精度よく圧縮前の微分値ベクトルδiを復元できる。
δi=dec(δei,φd)=dec(δei,φ)
=φδei=φ(φTδi)=δi ・・・(25)
また、行列計算の性質上、任意の2つの微分値ベクトルδ,λに対し、下記(26)式に示す分配法則が成立するのは明らかである。
φT(δ+λ)=φTδ+φTλ ・・・(26)
このように、値の大きなp個の固有値E11〜Eppのみを用いることで、微分値ベクトルδiを圧縮できる。また、他の固有値Ep+1p+1〜Eddは値が小さいため、精度よく復元可能である。さらに、エンコード関数encを行列演算とすることで分配法則が成立し、任意の微分値ベクトルδ,λのエンコード値どうしを加算した後にデコードすることで、微分値ベクトルの和δ+λを得ることができ、AllReduce命令との相性もよい。
以上の手法は、行列Dをデータ行列としたときの主成分分析の一種と考えることが可能である。一般的な主成分分析との差異は、一般的な主成分分析では、行列Dの代わりに、行列Dの各列から、行列Dの列ベクトルの平均ベクトルを引いて得られる行列を使用している点にある。本手法は平均ベクトルの引き算を行わないが、広義の主成分分析と言える。
ところで、実際の重みWは数が多いため、微分値ベクトルδiの要素数dも大きくなる。その場合、行列Cの固有値分解(つまり行列Vを得ること)に時間がかかってしまう。場合によっては、固有値分解に要する時間が微分値算出に要する時間より大きくなってしまい、却って処理が遅くなってしまうことにもなりかねない。その場合、下記(27)式に示すように、予め微分値ベクトルδiに対して所定の折りたたみ関数reshape(詳細は後述する)を適用して、δiの要素数(行数)dよりも小さい行数q(列数はd/qの値に応じて定まるrとする)を有する微分値行列δi’に変換しておくのが望ましい。
δi’=reshape(δi,q,r) ・・・(27)
行数qは、q行q列の行列の固有値分解に要する時間が、微分値算出に要する時間よりも小さなオーダーになるように設定される。この場合の行列φe,φdは、上述した説明におけるδiをδi’に置き換えることより得られる。
すなわち、上記(22)式に示すd行d列の正方行列Dに代えて、下記(22’)式に示す行列Dを定義する。
D=(δi-b+1’,δi-b+2’,・・・,δi’) ・・・(22’)
ここで、bは過去何回分の微分値を使用するかを表しており、行列C=DDTのランク落ちを防ぐため、行列Dの列数が行数以上となるように設定する。以降、行列φe=φT,φd=φを得るまでの処理は同様である。
この場合、上記(24)式は以下のように表される。
δei=enc(δi’,φe)=φTδi’ ・・・(24’)
行列φTはp行q列であり、微分値行列δi’はq行r列であるから、エンコード値δeiはp行r列の行列となる。q>pであるから、やはり低次元化が可能である。なお、行列を列ベクトルに変換する必要がある場合、行列の要素を適宜並べ替えて列ベクトルに変形すればよい。
以下、折りたたみ関数reshapeについて説明する。折りたたみ関数reshapeは変換対象行列の要素を並び替えて行列サイズを変換する。例えば、下記(28)式のようにする。
ここで、折りたたみ関数reshapeの第1引数は変換対象行列であり、第2引数および第3引数はそれぞれ変換後の行列の行数および列数である。よって、第2引数と第3引数との積は、変換対象行列の要素数と等しくなければならない。ここで、第2引数および第3引数は省略されることがある。
文脈上、第2引数および第3引数が自明である場合、これらの記載は省略可能である。例えば、下記(29)式が成立する。
すなわち、2行2列の行列と、折りたたみ関数reshapeが出力する行列とを乗算するためには、折りたたみ関数reshapeが出力する行列の行数は2でなければならず、第2引数が2であるのは自明である。また、変換対象行列の要素数を考慮すると第3引数が6であるのは自明である。よって、第2引数および第3引数が省略され得る。また別の例として、下記(30)式が成立する。
やはり、第2引数が2で第3引数が6であるのは自明である。
また、第3引数のみが省略され、第2引数が変換対象行列の要素数の因数である場合、第3引数は当該要素数を第2引数で割った数とする。例えば、下記(31)式が成立する。
特殊なケースとして、第3引数のみが省略され、第2引数が変換対象行列の要素数の因数でない場合、出力される行列の欠けている要素に0を挿入するものとする。挿入される0の数は必要最小数とする。例えば、下記(32)式が成立する。
また別の特殊なケースとして、第2引数および第3引数が省略されており、文脈から第2引数が自明であるが、その第2引数が変換対象行列の要素数の因数でない場合、出力される行列の欠けている要素に0を挿入するものとする。挿入される0の数は必要最小数とする。例えば、下記(33)式が成立する。
以上のようにして、微分値ベクトルδiの要素数が多い場合には、予め折りたたみ関数reshapeを適用すればよい。これにより、行列Cの固有値分解に要する時間を減らすことができる。
(第4の実施形態)
上述したエンコード用の行列φeは(したがって行列φdも)ある小区間においては有効である。小区間の更新において、重みの更新方向はほぼ線形であり、行列φeにおける固有値ベクトルF1〜Fpと、微分値ベクトルδi(または微分値行列δi’、以下同じ)との相関が強い。よって、例えば上述の説明において、第(i−d+1)回目〜第i回目までの重み更新に使用される微分値を要素とする微分値ベクトルδi-d+1〜δiを用いて行列φeを算出したが、第(i+1)回目以降の更新にもしばらく(つまり小区間とみなせる更新回数においては)この行列φeを適用することができる。
しかしながら、離れた2つの小区間の更新においては、更新方向が大きく異なり得る。つまり、ある小区間において更新方向を多く含むように行列φeを設計したとしても、更新を反復するにつれて、行列φeが張る部分空間と重みが移動する部分空間とがずれることとなる。このようなずれ(ドリフト)が大きくなると、行列φeにおける固有ベクトルF1〜Fpと、微分値ベクトルδi(微分値行列δi’)とが直交しやすくなる。そうすると、上記(24)式や(24’)式から分かるように、エンコード値δeiの各成分の絶対値が0に近くなり、重みがほとんど更新できなくなる。
そのため、このようなドリフトを押さえるべく、適切なタイミングで行列φdを設定し直すのが望ましい。
具体的には、予め定めた回数(後述する図16のk)だけ重みの更新を行った後に行列φeを更新するようにしてもよい。あるいは、上記(24)式で得られるエンコード値δei(すなわち、図11におけるステップS55で算出されるδe)における各成分の値の絶対値が0に近くなってきたときに、行列φeを更新するようにしてもよい。
第i回目の重み更新のタイミングで行列φeを更新するためには、上記(22)式で示すように、過去d回分の微分ベクトルδi-d+1〜δiを必要とする。そこで、以下では、行列φe,φdの更新も考慮した処理手順を説明する。以下、図11および図12に対して追加される点について主に説明する。
図15は、第4の実施形態に係る微分プロセスAdの処理を説明するフローチャートである。本実施形態では、ステップS51〜S57は図11と共通しているが、微分プロセスAdが送信値VAを算出する(ステップS57)だけでなく、統計指標measδも算出する(ステップS57’)。統計指標measδは、現ループ(j回目のループとする)におけるステップS54で算出された微分値dWj、その前のj−1回目のループにおけるステップS54で算出された微分値dWj-1・・・を含んでいる。含まれる微分値dWの数は、上記(22)式におけるdや、(22’)式におけるbによる。
図16は、第4の実施形態に係る通信プロセスAtの処理を説明するフローチャートである。本実施形態では、行列φe,φdを更新するための変数Array1を用いる。なお、実際には変数Arrayと変数Array1とを連結した変数を用いて処理を行ってもよい。
変数Flagが1である場合、通信プロセスAtは、送信値VAに対するAllReduce命令のみならず、(Array1/R+measδ)に対してもAllReduce命令を発行する(ステップS74a’)。
一方、変数Flagが0である場合、Array/Rに対するAllReduce命令のみならず、変数Array1/Rに対してもAllReduce命令を発行する(ステップS74b’)。
これにより、変数Array1には、微分プロセスAdによって得られた微分値dWj,dWj-1・・・と、他の微分プロセスによって得られた微分値とが変数Array1に格納される。このことは、上記(22),(22’)式における行列Dを得ることに対応する。
AllReduce命令がk回繰り返された後、通信プロセスAtは、変数Array1に格納された微分値を用いて、上述した手法により、行列φe,φdを更新する(ステップS77’)。
本実施形態では、重みを更新するための微分値をエンコードして低次元写像するが、エンコードに用いる行列φeを定期的に(AllReduce命令をk回発行する毎に)更新する。これにより、低次元空間を時刻とともに変化させることができ、学習が進むにつれて実質的に広い探索空間を確保できる。
また、1回のAllReduce命令ごとではなく、k回のAllReduce命令ごとに行列φe,φdの更新を行うことで、処理速度の低下を抑えることができる。ニューラルネットワークの誤差逆拡散法による学習では、重みの変化量は反復ごとに多少の差異があるものの、少なからず相関しているため、kを適切に設定することで、連続した反復区間の中で固定の低次元空間を用いても、実質的には認識性能を損なうことはほとんどない。
(第5の実施形態)
次に説明する第5の実施形態は、画像処理用のノードを通信プロセスおよび微分プロセスを実行するノードとは別個に設け、さらなる学習の高速化を図るものである。
近年の画像認識などの研究では、重み更新用の微分値を算出する前に、画像に対して変形を施したものを教師データとして用いることが多い。変形とは、例えば位置のずらし、色の変換、拡大縮小などである。このように予め変形しておくことで、より多様な入力に対して、画像に存在する物体の識別が可能となる。1つの画像に対して様々な変形を施すことで、多様な教師データを得ることができる。このように教師データを人為的に増やすことを「データ拡張」という。
データ拡張の1つの手法として、学習を行う前に教師データの数をn倍に拡張し、変形された教師データのすべてをストレージに格納するものがある。この場合、学習時には、ストレージから教師データを繰り返し読み込み、微分値を算出する。学習自体としては、1つの教師データを学習が終了するまでに複数回(たとえば100回)処理する。
別の手法として、学習の過程において、オリジナル画像の読み込み、画像処理による画像のランダムな変形、および、微分値算出のステップを反復するものがある。この場合、変形に乱数を用いることがひとつの特色であり、厳密に同一の画像を繰り返し処理することがない。これは、入力の多様さに対するロバスト性を高めることに有効である。この場合、一度微分値算出に使用された画像は捨ててしまう。予め変形画像を全て用意しておくことはストレージの容量の限界から、通常は難しいためである。
仮に変形画像を全てストレージに格納することができるのであれば、予め変形画像を必要数生成したのち、学習を開始できる。通常、学習は条件を変えて複数回実行される。変形画像自体は学習の条件を変えても再利用可能であるため、先に変形画像を用意しておくのが効率的である。
しかしながら、データストレージの容量の制約などから、事前に全ての変形画像を用意するのは容易ではない。そこで、学習における反復計算のたびに、画像処理を施すことも考えられる。しかしながら、画像処理の時間だけ微分値算出の時間が延びることとなる。その結果、ミニバッチサイズを一定と仮定した場合、ノード数を増やさざるを得ない。
そうすると、集団通信にかかる時間が増大することとなる。通信の遅いノードが混入する可能性が高まることが主な理由である。そこで、本実施形態では、変形画像生成を行うことによる、集団通信のノード数の増大を回避することを目的としたものである。
図17は、第5の実施形態に係る学習システムのハードウェア構成の一例を示すブロック図である。以下、図4との相違点を中心に説明する。
学習システムは、微分プロセスAdや通信プロセスAtなどを実行するノード1と、画像に対する変形処理を施す画像処理用のノード2とを備えている。画像処理ノード2は、画像処理プロセスAiを実行するGPU21aなどと、ストレージ22とを有する。なお、ストレージ22はノード2の外部にあって、画像処理プロセスAiがアクセス可能な態様であってもよい。
ストレージ22には教師データを生成するための複数の画像が格納されている。画像処理用のノード2がM台ある場合、画像セットをM分割したものがストレージ22に格納されている。
画像処理プロセスAiは、ストレージ22から画像を取得し、画像処理(例えばランダムな変形)によって変形画像を生成する。この変形画像が教師データとなる。画像処理プロセスAiは、生成した変形画像をストレージ22に書き込んでもよいし、別のストレージ(ノード2内にあってもよいし、外部にあってもよい)に書き込んでもよい。あるいは、画像処理プロセスAiは、ノード1内の微分プロセスにMPIなどを利用して直接転送してもよい。
なお、画像処理を行うモジュールの実現方法に特に制約はない。図示のように、1つの画像処理プロセスに1つのGPUを割り当て、複数のGPUによって画像処理を並列に行ってもよい。
微分プロセスは、画像処理プロセスによって生成された変形画像(教師データ)を順次読み込み、微分値を算出する。通信プロセスはAllReduce命令などの集団通信を行って微分値を含む送信値を通信し、重みを更新する。微分プロセスは画像の変形を行う必要がないため、学習処理の高速化が可能である。
ここで、画像処理プロセスが変形画像を生成する速度(周期)は、微分プロセスが微分値を算出する速度(周期)を上回っている必要がある。そうでないと、教師データの供給が追い付かないためである。このことを考慮し、学習を開始する前に、変形画像の生成速度と、微分値の算出速度とを測定し、必要な数の画像処理プロセス(画像処理用のノード2)を設計すればよい。
また、画像処理プロセスによる教師データの書き込みと、微分プロセスによる教師データの読み込みとの衝突を回避する必要がある。すなわち、画像処理プロセスが教師データを書き込んでいる最中に、同教師データを微分プロセスが読み込まないようにしなければならない。さらに、通常は、生成されて書き込まれる教師データがストレージの容量をオーバーしないよう古い教師データは消去されるが、消去の最中または消去後にその教師データを微分プロセスが読み込まないようにする必要がある。
このような衝突を回避するためには、例えばMPIを利用すればよい。あるいは、生成される教師データのネーミングを工夫してもよい。
なお、本手法は、教師データを読み込むのに必要な帯域幅の平均値がノード間通信の性能と比較して十分に小さい場合に、有効である。必要な帯域幅が大きい場合には、画像処理プロセスと微分値算出プロセスとを同一ノードで実行した方が高速処理可能である。
このように、第5の実施形態では、微分プロセスを実行するノードとは別に画像処理用のノードを設ける。そのため、学習の高速化を実現できる。
上述した実施形態で説明した実施形態の少なくとも一部は、ハードウェアで構成してもよいし、ソフトウェアで構成してもよい。ソフトウェアで構成する場合には、少なくとも一部の機能を実現するプログラムを記録媒体に収納し、コンピュータに読み込ませて実行させてもよい。記録媒体は、磁気ディスクや光ディスクなどの着脱可能なものに限定されず、ハードディスク装置やメモリなどの固定型の記録媒体でもよい。
また、少なくとも一部の機能を実現するプログラムを、インターネットなどの通信回線(無線通信も含む)を介して頒布してもよい。さらに、同プログラムを暗号化したり、変調をかけたり、圧縮した状態で、インターネットなどの有線回線や無線回線を介して、あるいは記録媒体に収納して頒布してもよい。
上記の記載に基づいて、当業者であれば、本発明の追加の効果や種々の変形例を想到できるかもしれないが、本発明の態様は、上述した個々の実施形態には限定されるものではない。特許請求の範囲に規定された内容およびその均等物から導き出される本発明の概念的な思想と趣旨を逸脱しない範囲で種々の追加、変更および部分的削除が可能である。
1 ノード
11 CPU
12a〜12c GPU
13 ストレージ
2 画像処理ノード
21a,21b GPU
22 ストレージ

Claims (24)

  1. 1または複数のプロセッサから構成され、該1または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、各プロセスは、
    現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、
    前記微分値のみならず前記現時点のパラメータも用いて、他のプロセスに送信される送信値を算出することと、
    前記送信値を他のプロセスに送信することと、
    他のプロセスから送信された前記送信値に基づいて、前記現時点のパラメータを更新することと、を含む、学習システム。
  2. 1または複数のプロセッサから構成され、該1または複数のプロセッサが微分プロセスおよび通信プロセスの組を複数実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、
    前記微分プロセスのそれぞれは、
    現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、
    前記微分値のみならず前記現時点のパラメータも用いて、他の組における通信プロセスに送信される送信値を算出することと、を含み、
    前記通信プロセスのそれぞれは、
    組になっている前記微分プロセスが前記送信値の算出を完了している場合には前記送信値を、完了していない場合には前記現時点のパラメータの一部を、他の組における通信プロセスに送信することと、
    他の通信プロセスから送信された前記送信値および前記現時点のパラメータの一部に基づいて、前記現時点のパラメータを更新することと、を含む、学習システム。
  3. 前記通信プロセスのそれぞれは、組になっている前記微分プロセスが前記送信値の算出を完了しているか否かに関わらず、前記送信値または前記現時点のパラメータの一部を他の通信プロセスに送信することにより、送信の度に前記パラメータを更新する、請求項2に記載の学習システム。
  4. 前記組の数は、
    前記微分プロセスのそれぞれが用いる前記教師データの数と、
    1回の更新で用いられる前記教師データの数の最適値と、
    前記微分プロセスが前記送信値を算出するのに要する時間と、
    に基づいて定められる、請求項2または3に記載の学習システム。
  5. 前記微分プロセスのそれぞれが用いる前記教師データの数をAとし、
    1回の更新で用いられる前記教師データの数の最適値をBとするとき、
    前記組の数は、前記通信プロセスが送信を行う際に、平均B/A個の前記微分プロセスが前記送信値の算出を完了しているよう、定められる、請求項4に記載の学習システム。
  6. 1または複数のプロセッサから構成され、該1または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、各プロセスは、
    ある時点のパラメータと、差分値と、教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することであって、前記差分値は、前記ある時点でのパラメータと、その後のある時点でのパラメータとの差を圧縮した値である、ことと、
    前記微分値を圧縮することと、
    圧縮された前記微分値と、前記差分値とに基づいて他のプロセスに送信される送信値を算出することと、
    他のプロセスから送信された前記送信値と、圧縮された前記送信値と、に基づいて、前記差分値を得ることと、
    前記差分値を復元した値に基づいて、前記ある時点でのパラメータを更新することと、を含む、学習システム。
  7. 1または複数のプロセッサから構成され、該1または複数のプロセッサが微分プロセスおよび通信プロセスの組を複数実行することによりニューラルネットワーク用のパラメータを更新する学習システムであって、
    前記微分プロセスのそれぞれは、
    ある時点のパラメータと、差分値と、教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することであって、前記差分値は、前記ある時点でおパラメータと、その後のある時点でのパラメータとの差を圧縮した値である、ことと、
    前記微分値を圧縮することと、
    圧縮された前記微分値と、前記差分値とに基づいて他のプロセスに送信される送信値を算出することと、
    を含み、
    前記通信プロセスのそれぞれは、
    組になっている前記微分プロセスが前記送信値の算出を完了している場合には前記送信値を、完了していない場合には前記差分値を送信値として他の組における通信プロセスに送信することと、
    他の通信プロセスから送信された前記送信値と、組になっている前記微分プロセスが算出した前記送信値と、に基づいて前記差分値を得ることと、
    前記差分値を復元した値に基づいて、前記ある時点でのパラメータを更新することと、を含む、学習システム。
  8. 前記微分値を圧縮することは、前記微分値と、所定行列との乗算である、請求項6または7に記載の学習システム。
  9. 前記所定行列は、学習過程において更新される、請求項8に記載の学習システム。
  10. 前記所定行列は、学習過程における過去の前記微分値に基づいて更新される、請求項9に記載の学習システム。
  11. 前記所定行列は、学習過程における過去の前記微分値に対する主成分分析によって更新される、請求項10に記載の学習システム。
  12. 前記微分値を圧縮することは、分配法則を満たすよう、前記微分値を圧縮することである、請求項8乃至11のいずれかに記載の学習システム。
  13. 前記微分値を圧縮することは、すべての前記微分プロセスからの微分値を行列化したものと、前記所定行列との乗算である、請求項8乃至12のいずれかに記載の学習システム。
  14. 前記ニューラルネットワーク用のパラメータの一部が他の一部と共有される、または、パラメータの一部が他の一部と所定の関係を満たす、請求項1乃至13のいずれかに記載の学習システム。
  15. 前記ニューラルネットワーク用のフィルタの1つが他のフィルタの1つと共有される、または、フィルタの1つが他のフィルタと所定の関係を満たす、請求項14に記載の学習システム。
  16. 前記ニューラルネットワーク用のフィルタの1つは、他のフィルタを所定角度回転したもの、点対称としたもの、左右反転したもの、または、上下反転したものである、請求項15に記載の学習システム。
  17. 前記1または複数のプロセッサとは異なる別のプロセッサが、予め用意された画像を変形して前記教師データを生成する画像処理プロセスを実行する、請求項1乃至16のいずれかに記載の学習システム。
  18. 請求項2または7に記載の学習システムを構築するために、1つの前記プロセッサに、前記微分プロセスを実行させる、学習プログラム。
  19. 請求項2または7に記載の学習システムを構築するために、1つの前記プロセッサに、前記通信プロセスを実行させる、学習プログラム。
  20. 1または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習方法であって、各プロセスは、
    現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、
    前記微分値のみならず前記現時点のパラメータも用いて、他のプロセスに送信される送信値を算出することと、
    前記送信値を他のプロセスに送信することと、
    他のプロセスから送信された前記送信値に基づいて、前記現時点のパラメータを更新することと、を含む、学習方法。
  21. 1または複数のプロセッサが微分プロセスおよび通信プロセスの組を複数実行することによりニューラルネットワーク用のパラメータを更新する学習方法であって、
    前記微分プロセスのそれぞれは、
    現時点のパラメータと、ストレージに格納された教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することと、
    前記微分値のみならず前記現時点のパラメータも用いて、他の組における通信プロセスに送信される送信値を算出することと、を含み、
    前記通信プロセスのそれぞれは、
    組になっている前記微分プロセスが前記送信値の算出を完了している場合には前記送信値を、完了していない場合には前記現時点のパラメータの一部を、他の組における通信プロセスに送信することと、
    他の通信プロセスから送信された前記送信値および前記現時点のパラメータの一部に基づいて、前記現時点のパラメータを更新することと、を含む、学習方法。
  22. ニューラルネットワーク用のパラメータを、その一部が他の一部と共有されるとして、または、一部が他の一部と所定の関係を満たすとして、前記パラメータを更新する学習方法。
  23. 1または複数のプロセッサが複数のプロセスを実行することによりニューラルネットワーク用のパラメータを更新する学習方法であって、各プロセスは、
    ある時点のパラメータと、差分値と、教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することであって、前記差分値は、前記ある時点でのパラメータと、その後のある時点でのパラメータとの差を圧縮した値である、ことと、
    前記微分値を圧縮することと、
    圧縮された前記微分値と、前記差分値とに基づいて他のプロセスに送信される送信値を算出することと、
    他のプロセスから送信された前記送信値と、圧縮された前記送信値と、に基づいて、前記差分値を得ることと、
    前記差分値を復元した値に基づいて、前記ある時点でのパラメータを更新することと、を含む、学習方法。
  24. 1または複数のプロセッサが微分プロセスおよび通信プロセスの組を複数実行することによりニューラルネットワーク用のパラメータを更新する学習方法であって、
    前記微分プロセスのそれぞれは、
    ある時点のパラメータと、差分値と、教師データとを用いて、誤差逆伝搬法によって前記パラメータを更新するための微分値を算出することであって、前記差分値は、前記ある時点でおパラメータと、その後のある時点でのパラメータとの差を圧縮した値である、ことと、
    前記微分値を圧縮することと、
    圧縮された前記微分値と、前記差分値とに基づいて他のプロセスに送信される送信値を算出することと、
    を含み、
    前記通信プロセスのそれぞれは、
    組になっている前記微分プロセスが前記送信値の算出を完了している場合には前記送信値を、完了していない場合には前記差分値を他の組における通信プロセスに送信することと、
    他の通信プロセスから送信された前記送信値と、組になっている前記微分プロセスが算出した前記送信値と、に基づいて前記差分値を得ることと、
    前記差分値を復元した値に基づいて、前記ある時点でのパラメータを更新することと、を含む、学習方法。
JP2015220780A 2015-04-03 2015-11-10 学習システム、学習プログラムおよび学習方法 Pending JP2016197389A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
US15/347,638 US20170132515A1 (en) 2015-04-03 2016-11-09 Learning system, learning program, and learning method

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
JP2015077013 2015-04-03
JP2015077013 2015-04-03

Publications (1)

Publication Number Publication Date
JP2016197389A true JP2016197389A (ja) 2016-11-24

Family

ID=57358196

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015220780A Pending JP2016197389A (ja) 2015-04-03 2015-11-10 学習システム、学習プログラムおよび学習方法

Country Status (2)

Country Link
US (1) US20170132515A1 (ja)
JP (1) JP2016197389A (ja)

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2018120362A (ja) * 2017-01-24 2018-08-02 日本放送協会 シーン変化点モデル学習装置、シーン変化点検出装置およびそれらのプログラム
JP2018173946A (ja) * 2017-03-06 2018-11-08 バイドゥ ユーエスエイ エルエルシーBaidu USA LLC 自動運転車両に用いる畳み込みニューラルネットワークモデルのコンボリューション/デコンボリューション層とバッチ正規化層のオフライン組み合わせ
JP2019109875A (ja) * 2017-12-18 2019-07-04 株式会社東芝 システム、プログラム及び方法
JP2019121275A (ja) * 2018-01-10 2019-07-22 トヨタ自動車株式会社 自動運転装置
JP2020060838A (ja) * 2018-10-05 2020-04-16 株式会社デンソーアイティーラボラトリ 学習方法および学習システム
JPWO2019106730A1 (ja) * 2017-11-28 2020-11-19 株式会社ニコン 顕微鏡システム
JPWO2019116494A1 (ja) * 2017-12-14 2020-11-26 日本電気株式会社 学習装置、学習方法、および学習プログラム
WO2022038743A1 (ja) * 2020-08-20 2022-02-24 日本電気株式会社 組合せ最適化問題情報送信装置および組合せ最適化問題求解装置

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10395141B2 (en) * 2017-03-20 2019-08-27 Sap Se Weight initialization for machine learning models
US11037330B2 (en) * 2017-04-08 2021-06-15 Intel Corporation Low rank matrix compression
WO2019050771A1 (en) * 2017-09-05 2019-03-14 Panasonic Intellectual Property Corporation Of America EXECUTION METHOD, EXECUTION DEVICE, LEARNING METHOD, LEARNING DEVICE, AND PROGRAM FOR DEEP NEURAL NETWORK
CN109245773B (zh) * 2018-10-30 2021-09-28 南京大学 一种基于块循环稀疏矩阵神经网络的编解码方法
US11263011B2 (en) 2018-11-28 2022-03-01 International Business Machines Corporation Compound instruction set architecture for a neural inference chip
JP7238376B2 (ja) * 2018-12-14 2023-03-14 富士通株式会社 情報処理システム及び情報処理システムの制御方法
KR20240004518A (ko) * 2021-04-16 2024-01-11 프라운호퍼 게젤샤프트 쭈르 푀르데룽 데어 안겐반텐 포르슝 에. 베. 노드 정보를 사용하여 신경망 파라미터를 업데이트하는 디코더, 인코더, 제어부, 방법 및 컴퓨터 프로그램

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH04130952A (ja) * 1990-09-21 1992-05-01 Res Dev Corp Of Japan しきい値論理回路網とその学習法
JPH076146A (ja) * 1993-06-18 1995-01-10 Fujitsu Ltd 並列データ処理システム
JP2002342738A (ja) * 2001-03-15 2002-11-29 Honda R & D Europe (Deutschland) Gmbh 畳み込みネットワーク挙動のシミュレーション方法
JP2014203135A (ja) * 2013-04-01 2014-10-27 キヤノン株式会社 信号処理装置、信号処理方法、及び、信号処理システム

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH04130952A (ja) * 1990-09-21 1992-05-01 Res Dev Corp Of Japan しきい値論理回路網とその学習法
JPH076146A (ja) * 1993-06-18 1995-01-10 Fujitsu Ltd 並列データ処理システム
JP2002342738A (ja) * 2001-03-15 2002-11-29 Honda R & D Europe (Deutschland) Gmbh 畳み込みネットワーク挙動のシミュレーション方法
JP2014203135A (ja) * 2013-04-01 2014-10-27 キヤノン株式会社 信号処理装置、信号処理方法、及び、信号処理システム

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
山森一人、阿部 亨、堀口 進: "超並列計算機nCUBE2上のニューラルネットワークを用いた顔画像認識法", 情報処理学会研究報告, vol. 94, no. 107, JPN6019021759, 13 December 1994 (1994-12-13), JP, pages 65 - 72, ISSN: 0004053746 *
浦 晃、三輪 誠、鶴岡慶雅、近山 隆: "分散計算環境における並列パーセプトロンの将棋評価関数への適用", 情報処理学会研究報告[ONLINE], vol. Vol.2014-GI-31, No.6, JPN6019021758, 10 March 2014 (2014-03-10), JP, pages 1 - 8, ISSN: 0004053745 *

Cited By (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2018120362A (ja) * 2017-01-24 2018-08-02 日本放送協会 シーン変化点モデル学習装置、シーン変化点検出装置およびそれらのプログラム
JP2018173946A (ja) * 2017-03-06 2018-11-08 バイドゥ ユーエスエイ エルエルシーBaidu USA LLC 自動運転車両に用いる畳み込みニューラルネットワークモデルのコンボリューション/デコンボリューション層とバッチ正規化層のオフライン組み合わせ
JPWO2019106730A1 (ja) * 2017-11-28 2020-11-19 株式会社ニコン 顕微鏡システム
US11270163B2 (en) 2017-12-14 2022-03-08 Nec Corporation Learning device, learning method, and storage medium
JPWO2019116494A1 (ja) * 2017-12-14 2020-11-26 日本電気株式会社 学習装置、学習方法、および学習プログラム
JP7184801B2 (ja) 2017-12-14 2022-12-06 日本電気株式会社 学習装置、学習方法、および学習プログラム
JP2019109875A (ja) * 2017-12-18 2019-07-04 株式会社東芝 システム、プログラム及び方法
JP2019121275A (ja) * 2018-01-10 2019-07-22 トヨタ自動車株式会社 自動運転装置
JP7024415B2 (ja) 2018-01-10 2022-02-24 トヨタ自動車株式会社 自動運転装置
JP2020060838A (ja) * 2018-10-05 2020-04-16 株式会社デンソーアイティーラボラトリ 学習方法および学習システム
JP7208758B2 (ja) 2018-10-05 2023-01-19 株式会社デンソーアイティーラボラトリ 学習方法および学習システム
WO2022038743A1 (ja) * 2020-08-20 2022-02-24 日本電気株式会社 組合せ最適化問題情報送信装置および組合せ最適化問題求解装置
JP7405264B2 (ja) 2020-08-20 2023-12-26 日本電気株式会社 組合せ最適化問題情報送信装置および組合せ最適化問題求解装置

Also Published As

Publication number Publication date
US20170132515A1 (en) 2017-05-11

Similar Documents

Publication Publication Date Title
JP2016197389A (ja) 学習システム、学習プログラムおよび学習方法
Ruehle Data science applications to string theory
JP6574503B2 (ja) 機械学習方法および装置
US20200410384A1 (en) Hybrid quantum-classical generative models for learning data distributions
Tsianos et al. Communication/computation tradeoffs in consensus-based distributed optimization
CN111373420A (zh) 量子近似优化中的成本函数变形
EP3785187A1 (en) Personalized gesture recognition for user interaction with assistant systems
WO2017031356A1 (en) Discrete variational auto-encoder systems and methods for machine learning using adiabatic quantum computers
JP7438517B2 (ja) ニューラルネットワークの圧縮方法、ニューラルネットワーク圧縮装置、コンピュータプログラム、及び圧縮されたニューラルネットワークデータの製造方法
CN114219076B (zh) 量子神经网络训练方法及装置、电子设备和介质
US11687816B2 (en) Quantum data loader
Broni-Bediako et al. Evolutionary NAS with gene expression programming of cellular encoding
KR102105951B1 (ko) 추론을 위한 제한된 볼츠만 머신 구축 방법 및 추론을 위한 제한된 볼츠만 머신을 탑재한 컴퓨터 장치
JPWO2018087814A1 (ja) マルチタスク関係学習システム、方法およびプログラム
Javaheripi et al. Swann: Small-world architecture for fast convergence of neural networks
US20230259775A1 (en) Method and apparatus with pruning
CA3109735A1 (en) Optimization device, optimization device control method, and optimization device control program
US20220083315A1 (en) Calculation device, calculation method, and computer program product
JP7470019B2 (ja) 情報処理システム
US11966450B2 (en) Calculation device, calculation method, and computer program product
CN114511092B (zh) 一种基于量子线路的图注意力机制实现方法
JP7341804B2 (ja) 情報処理装置および情報処理方法
US20220012017A1 (en) Information processing device, information processing system, information processing method, and storage medium
CN117648185A (zh) 一种利用小内存设备求解大规模组合优化问题的方法
Priyadarshi et al. Synthesis of Neural Networks using Entangled Neurons

Legal Events

Date Code Title Description
A711 Notification of change in applicant

Free format text: JAPANESE INTERMEDIATE CODE: A711

Effective date: 20151202

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20151202

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20180404

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20190529

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20190618

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20191210